diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index f1fa087..ecee03e 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -13,11 +13,11 @@ env: jobs: docker-build-push: runs-on: ubuntu-latest - + steps: - name: Checkout code - uses: actions/checkout@v4 - + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - name: Read version from pyproject.toml id: get_version run: | @@ -32,18 +32,18 @@ jobs: fi echo "VERSION=$VERSION" >> $GITHUB_OUTPUT echo "Found version: $VERSION" - + - name: Check if image exists on DockerHub id: check_image env: VERSION: ${{ steps.get_version.outputs.VERSION }} run: | echo "Checking if image exists: ${{ env.DOCKER_REGISTRY }}/${{ env.SERVIZIO_OC }}:${VERSION}" - + # Query DockerHub API to check if tag exists HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \ "https://hub.docker.com/v2/repositories/${{ env.DOCKER_REGISTRY }}/${{ env.SERVIZIO_OC }}/tags/${VERSION}/") - + if [ "$HTTP_CODE" == "200" ]; then echo "Image already exists on DockerHub" echo "IMAGE_EXISTS=true" >> $GITHUB_OUTPUT @@ -51,38 +51,38 @@ jobs: echo "Image not found on DockerHub, will build new one" echo "IMAGE_EXISTS=false" >> $GITHUB_OUTPUT fi - + - name: Set up Docker Buildx if: steps.check_image.outputs.IMAGE_EXISTS == 'false' - uses: docker/setup-buildx-action@v3 - + uses: docker/setup-buildx-action@4d04d5d9486b7bd6fa91e7baf45bbb4f8b9deedd # v4.0.0 + - name: Login to DockerHub if: steps.check_image.outputs.IMAGE_EXISTS == 'false' - uses: docker/login-action@v3 + uses: docker/login-action@4907a6ddec9925e35a0a9e82d7399ccc52663121 # v4.1.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - + - name: Build and push Docker image if: steps.check_image.outputs.IMAGE_EXISTS == 'false' env: VERSION: ${{ steps.get_version.outputs.VERSION }} run: | echo "Building image: ${{ env.DOCKER_REGISTRY }}/${{ env.SERVIZIO_OC }}:${VERSION}" - + # Build image with no cache docker build --no-cache -t ${{ env.DOCKER_REGISTRY }}/${{ env.SERVIZIO_OC }}:${VERSION} . sleep 1 - + # Tag image docker tag ${{ env.DOCKER_REGISTRY }}/${{ env.SERVIZIO_OC }}:${VERSION} ${{ env.DOCKER_REGISTRY }}/${{ env.SERVIZIO_OC }}:${VERSION} sleep 1 - + # Push to registry echo "Pushing image to DockerHub..." docker push ${{ env.DOCKER_REGISTRY }}/${{ env.SERVIZIO_OC }}:${VERSION} sleep 1 - + # Check result if [ $? == 0 ]; then echo "ALL DONE !" @@ -90,18 +90,18 @@ jobs: echo "NO NO NOOOOOOO !" exit 1 fi - + - name: Build summary run: | VERSION="${{ steps.get_version.outputs.VERSION }}" IMAGE_EXISTS="${{ steps.check_image.outputs.IMAGE_EXISTS }}" - + echo "Build Summary:" echo "Version: ${VERSION}" echo "Image: ${{ env.DOCKER_REGISTRY }}/${{ env.SERVIZIO_OC }}:${VERSION}" - + if [ "$IMAGE_EXISTS" == "true" ]; then echo "Status: Image already exists, skipped build" else echo "Status: New image built and pushed successfully" - fi \ No newline at end of file + fi diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index c9f7af6..69e06ad 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -21,45 +21,38 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12"] steps: - - uses: actions/checkout@v4 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + + - name: Install uv + uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8.0.0 with: + enable-cache: true python-version: ${{ matrix.python-version }} - - - name: Install uv - uses: astral-sh/setup-uv@v6 - - - name: Install dependencies - run: uv sync --dev - - name: Start test database - run: ./test/start_test_db.sh + - name: Install dependencies + run: uv sync --dev --locked - name: Run tests with coverage run: | - echo "COVERAGE=$(uv run pytest --cov=src --cov-report=term-missing --cov-report=html | tee /dev/stderr | grep TOTAL | awk '{print $4}')" >> $GITHUB_ENV - - - name: Stop test database - if: always() - run: ./test/stop_test_db.sh + set -o pipefail + uv run pytest | tee pytest-output.txt + echo "COVERAGE=$(grep TOTAL pytest-output.txt | awk '{print $4}')" >> $GITHUB_ENV - name: Upload coverage artifact if: matrix.python-version == '3.10' - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0 with: name: coverage-report path: ${{ env.COVERAGE_REPORT_PATH }} - + - name: Generate coverage badge if: matrix.python-version == '3.10' run: | COVERAGE_NUM=$(echo ${{ env.COVERAGE }} | sed 's/%//') - + if (( $(echo "$COVERAGE_NUM >= 90" | bc -l) )); then COLOR="green" elif (( $(echo "$COVERAGE_NUM >= 75" | bc -l) )); then @@ -69,9 +62,9 @@ jobs: else COLOR="red" fi - + echo "BADGE_COLOR=$COLOR" >> $GITHUB_ENV - + - name: Create coverage badge if: matrix.python-version == '3.10' uses: emibcn/badge-action@v2.0.3 @@ -80,7 +73,7 @@ jobs: status: '${{ env.COVERAGE }}' color: '${{ env.BADGE_COLOR }}' path: 'test/coverage-badge.svg' - + - name: Commit coverage badge if: matrix.python-version == '3.10' && github.event_name == 'push' run: | @@ -88,4 +81,33 @@ jobs: git config --local user.name "GitHub Action" git add test/coverage-badge.svg git diff --staged --quiet || git commit -m "Update coverage badge" - git push \ No newline at end of file + git push + + deploy-coverage: + needs: CheckCoverage + if: github.ref == 'refs/heads/main' && github.event_name == 'push' + runs-on: ubuntu-latest + permissions: + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Download coverage artifact + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: coverage-report + path: site/coverage + + - name: Setup Pages + uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0 + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0 + with: + path: site + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0 diff --git a/.github/workflows/smoketest.yml b/.github/workflows/smoketest.yml index 84f73a0..c26ba07 100644 --- a/.github/workflows/smoketest.yml +++ b/.github/workflows/smoketest.yml @@ -22,18 +22,16 @@ jobs: steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - - name: Set up Python 3.11 - uses: actions/setup-python@v5 + - name: Install uv + uses: astral-sh/setup-uv@cec208311dfd045dd5311c1add060b2062131d57 # v8.0.0 with: + enable-cache: true python-version: "3.11" - - name: Install uv - uses: astral-sh/setup-uv@v6 - - name: Install dependencies - run: uv sync --frozen --no-dev + run: uv sync --locked --no-dev - name: Start Gunicorn run: | @@ -133,4 +131,4 @@ jobs: - name: Stop Gunicorn if: always() run: | - pkill -f gunicorn || true \ No newline at end of file + pkill -f gunicorn || true diff --git a/.gitignore b/.gitignore index 2996ad4..bc6cbb7 100644 --- a/.gitignore +++ b/.gitignore @@ -28,9 +28,12 @@ var/ # Tests test/virtuoso-test-data/ +test/virtuoso-meta-data/database/virtuoso.lck +test/virtuoso-meta-data/database/virtuoso.log +test/virtuoso-meta-data/index_entities.txt +test/qlever-index-data/oc-index-test.server-log.txt .coverage - # uv .venv/ -.python-version \ No newline at end of file +.python-version diff --git a/README.md b/README.md index cea2c7e..174804c 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [](http://opencitations.net) [![Run tests](https://github.com/opencitations/oc_api/actions/workflows/run_tests.yml/badge.svg?branch=main)](https://github.com/opencitations/oc_api/actions/workflows/run_tests.yml) -![Coverage](test/coverage-badge.svg) +[![Coverage](test/coverage-badge.svg)](https://opencitations.github.io/oc_api/coverage/) This repository contains the API service for OpenCitations, allowing users to interact with the OpenCitations datasets through RESTful endpoints. @@ -140,37 +140,14 @@ You can customize the Gunicorn server configuration by modifying the `gunicorn.c ### Running Tests Locally -To run the API tests locally, you'll need to have the test environment set up properly. The tests require a Virtuoso database to be running. +The tests require Docker. Pytest fixtures in `test/conftest.py` automatically start and stop the QLever and Virtuoso containers. -#### Prerequisites - -1. Install dependencies using uv: -```bash - uv sync --dev -``` - -2. Start the test database: +1. Install dependencies: ```bash - ./test/start_test_db.sh +uv sync --dev ``` -#### Running the Tests - -Once the test database is running, you can execute the tests with coverage: +2. Run the tests: ```bash -# Run tests with coverage report uv run pytest --cov=src --cov-report=term-missing --cov-report=html - -# Run only specific test files -uv run pytest test/test_metaapi.py - -# Run tests with verbose output -uv run pytest -v -``` - -#### Stopping the Test Database - -After running the tests, stop the test database: -```bash -./test/stop_test_db.sh ``` \ No newline at end of file diff --git a/api_oc.py b/api_oc.py index 1597522..9b12e9e 100644 --- a/api_oc.py +++ b/api_oc.py @@ -1,17 +1,16 @@ import web import os import json -#from src.wl import WebLogger import requests import urllib.parse as urlparse import re import csv -from urllib.parse import parse_qs, unquote +from urllib.parse import unquote from rdflib.plugins.sparql.parser import parseUpdate import subprocess import sys import argparse -from src.ramose import APIManager, Operation, HTMLDocumentationHandler +from ramose import APIManager, Operation, HTMLDocumentationHandler from io import StringIO from redis import Redis @@ -70,21 +69,6 @@ ) -# Set the web logger -# web_logger = WebLogger(env_config["base_url"], env_config["log_dir"], [ -# "HTTP_X_FORWARDED_FOR", # The IP address of the client -# "REMOTE_ADDR", # The IP address of internal balancer -# "HTTP_USER_AGENT", # The browser type of the visitor -# "HTTP_REFERER", # The URL of the page that called your program -# "HTTP_HOST", # The hostname of the page being attempted -# "REQUEST_URI", # The interpreted pathname of the requested document -# # or CGI (relative to the document root) -# "HTTP_AUTHORIZATION", # Access token -# ], -# # comment this line only for test purposes -# {"REMOTE_ADDR": ["130.136.130.1", "130.136.2.47", "127.0.0.1"]} -# ) - # API Managers meta_api_manager = APIManager(c["api_meta"], endpoint_override=env_config["sparql_endpoint_meta"]) meta_doc_manager = HTMLDocumentationHandler(meta_api_manager) @@ -97,7 +81,7 @@ render = web.template.render(c["html"], globals={ 'str': str, 'isinstance': isinstance, - 'render': lambda *args, **kwargs: render(*args, **kwargs) + 'render': lambda *args, **kwargs: render(*args, **kwargs) # type: ignore[operator] }) # common folder @@ -108,7 +92,7 @@ def notfound_custom(): """Custom 404 page""" - return web.notfound(render_common.notfound(web.ctx.home + web.ctx.fullpath)) + return web.notfound(render_common.notfound(web.ctx.home + web.ctx.fullpath)) # type: ignore[operator] # App Web.py app = web.application(urls, globals()) @@ -155,8 +139,8 @@ def validateAccessToken(): return True auth_code = web.ctx.env.get('HTTP_AUTHORIZATION') - if not auth_code is None: - val = rconn.get(auth_code) + if auth_code is not None: + val: bytes | None = rconn.get(auth_code) # type: ignore[assignment] if val is None or val.decode('utf-8') != auth_code: raise web.HTTPError("403", {"Content-Type": "text/plain"}, "Invalid token. Remove the authorization HEADER or register a new token at https://opencitations.net/accesstoken") return True @@ -198,7 +182,7 @@ def POST(self): class Header: def GET(self): current_subdomain = web.ctx.host.split('.')[0].lower() - return render.header(sp_title="", current_subdomain=current_subdomain) + return render.header(sp_title="", current_subdomain=current_subdomain) # type: ignore[operator] class Static: def GET(self, name): @@ -249,8 +233,7 @@ def POST(self): if "application/x-www-form-urlencoded" in content_type: return self.__run_query_string(active["sparql"], cur_data, True, content_type) elif "application/sparql-query" in content_type: - isupdate = None - isupdate, sanitizedQuery = self.__is_update_query(cur_data) + isupdate, _ = self.__is_update_query(cur_data) if not isupdate: return self.__contact_tp(cur_data, True, content_type) else: @@ -296,22 +279,19 @@ def __is_update_query(self, query): except Exception: return False, query - def __run_query_string(self, active, query_string, is_post=False, - content_type="application/x-www-form-urlencoded"): - # Add redirect if no query string is provided + def __run_query_string(self, _active: str, query_string: str, is_post: bool = False, + content_type: str = "application/x-www-form-urlencoded") -> str: if query_string is None or query_string.strip() == "": raise web.seeother('/') - + parsed_query = urlparse.parse_qs(query_string) - current_subdomain = web.ctx.host.split('.')[0].lower() for k in self.collparam: if k in parsed_query: query = parsed_query[k][0] - isupdate = None - isupdate, sanitizedQuery = self.__is_update_query(query) + isupdate, _ = self.__is_update_query(query) - if isupdate != None: + if isupdate is not None: if isupdate: raise web.HTTPError( "403 ", @@ -333,7 +313,7 @@ class Main: def GET(self): #web_logger.mes() current_subdomain = web.ctx.host.split('.')[0].lower() - return render.api(active="", sp_title="", sparql_endpoint="", current_subdomain=current_subdomain, render=render) + return render.api(active="", sp_title="", sparql_endpoint="", current_subdomain=current_subdomain, render=render) # type: ignore[operator] class SparqlIndex(Sparql): def __init__(self): @@ -348,7 +328,7 @@ def __init__(self): class Api: - def OPTIONS(self, dataset, call): + def OPTIONS(self, _dataset: str, _call: str) -> None: # remember to remove the slash at the end org_ref = web.ctx.env.get('HTTP_REFERER') if org_ref is not None: @@ -364,6 +344,7 @@ def OPTIONS(self, dataset, call): def GET(self, dataset, call): validateAccessToken() man = None + doc = None if dataset == "": raise web.redirect("/") @@ -378,8 +359,7 @@ def GET(self, dataset, call): man = meta_api_manager doc = meta_doc_manager - - if man is None: + if man is None or doc is None: raise web.notfound() else: if re.match("^/v[1-9]*/?$", call): @@ -436,7 +416,7 @@ def GET(self, dataset, call): next(csv.DictReader(f)), ensure_ascii=False) raise web.HTTPError( str(status_code)+" ", {"Content-Type": content_type}, mes) - except: + except Exception: raise web.HTTPError( str(status_code)+" ", {"Content-Type": content_type}, str(res)) else: diff --git a/pyproject.toml b/pyproject.toml index e9c0a45..f6d21ca 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "oc-api" -version = "2.2.2" +version = "2.3.0" description = "OpenCitations API" authors = [ {name = "Mario Petrella", email = "mario.petrella@unibo.it"}, @@ -9,7 +9,7 @@ authors = [ ] license = {text = "ISC"} readme = "README.md" -requires-python = ">=3.9,<3.12" +requires-python = ">=3.10,<3.13" dependencies = [ "apscheduler==3.10.1", "astroid>=3.3.11", @@ -41,13 +41,13 @@ dependencies = [ "python-lsp-jsonrpc>=1.1.2", "python-lsp-server>=1.12.2", "pytz>=2026.1.post1", - "ramose>=1.0.8", + "ramose>=2.0.0", "rdflib>=6.1.1", "rdflib-jsonld>=0.6.2", "redis>=7.0.1", "requests>=2.32.4", "rope>=1.14.0", - "six>=1.13.0", + "six>=1.16.0", "snowballstemmer>=3.0.1", "sparqlwrapper>=2.0.0", "toml>=0.10.2", @@ -62,9 +62,11 @@ dependencies = [ [dependency-groups] dev = [ + "pyright>=1.1.408", "pytest>=8.4.1", "pytest-cov>=6.2.1", - "virtuoso-utilities>=1.0.0", + "qlever>=0.5.45", + "ruff>=0.15.5", ] [tool.pytest.ini_options] diff --git a/src/api/index_v1.hf b/src/api/index_v1.hf index 553ee52..7cae845 100644 --- a/src/api/index_v1.hf +++ b/src/api/index_v1.hf @@ -128,6 +128,7 @@ WHERE { LIMIT 200000 + #url /citations/{doi} #type operation #doi str(10\..+) diff --git a/src/api/indexapi_common.py b/src/api/indexapi_common.py new file mode 100644 index 0000000..89eb694 --- /dev/null +++ b/src/api/indexapi_common.py @@ -0,0 +1,209 @@ +import json +import os +from requests import RequestException, post +from json import loads +from datetime import datetime +from dateutil.relativedelta import relativedelta + +with open("conf.json") as f: + c = json.load(f) + +env_config = { + "base_url": os.getenv("BASE_URL", c["base_url"]), + "sparql_endpoint_index": os.getenv("SPARQL_ENDPOINT_INDEX", c["sparql_endpoint_index"]), + "sparql_endpoint_meta": os.getenv("SPARQL_ENDPOINT_META", c["sparql_endpoint_meta"]), + "sync_enabled": os.getenv("SYNC_ENABLED", "false").lower() == "true" +} + + +def lower(s): + return s.lower(), + + +def br_meta_metadata(values): + sparql_endpoint = env_config["sparql_endpoint_meta"] + + sparql_query = """ + PREFIX pro: + PREFIX frbr: + PREFIX fabio: + PREFIX datacite: + PREFIX literal: + PREFIX prism: + SELECT DISTINCT ?val ?pubDate (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=' __ ') AS ?ids) (GROUP_CONCAT(?venue; separator="; ") as ?source) (GROUP_CONCAT(?raAuthor; separator="; ") as ?author) + WHERE { + VALUES ?val { """ + " ".join(values) + """ } + OPTIONAL { ?val prism:publicationDate ?pubDate. } + OPTIONAL { + ?val datacite:hasIdentifier ?identifier. + ?identifier datacite:usesIdentifierScheme ?scheme; + literal:hasLiteralValue ?literalValue. + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?literalValue) AS ?id) + } + OPTIONAL { + ?val a fabio:JournalArticle; + frbr:partOf+ ?venue. + ?venue a fabio:Journal. + } + OPTIONAL { + ?val frbr:partOf ?venue. + } + OPTIONAL { + ?val pro:isDocumentContextFor ?arAuthor. + ?arAuthor pro:withRole pro:author; + pro:isHeldBy ?raAuthor. + } + } GROUP BY ?val ?pubDate + """ + + headers = {"Accept": "application/sparql-results+json", "Content-Type": "application/sparql-query"} + + try: + response = post(sparql_endpoint, headers=headers, data=sparql_query) + response.raise_for_status() + except RequestException: + return {}, [] + r = loads(response.text) + results = r["results"]["bindings"] + res_json = {elem["val"]["value"]: elem for elem in results} + return res_json, ["val", "pubDate", "ids", "source", "author"] + + +def br_meta_anyids(values): + sparql_endpoint = env_config["sparql_endpoint_meta"] + + sparql_query = """ + PREFIX datacite: + PREFIX literal: + SELECT DISTINCT ?val (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=' __ ') AS ?ids) + WHERE { + VALUES ?val { """ + " ".join(values) + """ } + OPTIONAL { + ?val datacite:hasIdentifier ?identifier. + ?identifier datacite:usesIdentifierScheme ?scheme; + literal:hasLiteralValue ?literalValue. + BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?literalValue) AS ?id) + } + } GROUP BY ?val + """ + + headers = {"Accept": "application/sparql-results+json", "Content-Type": "application/sparql-query"} + + try: + response = post(sparql_endpoint, headers=headers, data=sparql_query) + response.raise_for_status() + except RequestException: + return {}, [] + r = loads(response.text) + results = r["results"]["bindings"] + res_json = {elem["val"]["value"]: elem for elem in results} + return res_json, ["val", "ids"] + + +def get_unique_brs_metadata(l_url_brs, ids_only=False): + res: list[list[str]] = [] + l_brs = ["<" + _url_br + ">" for _url_br in l_url_brs] + + fetch = br_meta_anyids if ids_only else br_meta_metadata + i = 0 + chunk_size = 3000 + brs_meta: dict[str, dict[str, dict[str, str]]] = {} + while i < len(l_brs): + chunk = l_brs[i:i + chunk_size] + m_br = fetch(chunk) + brs_meta.update(m_br[0]) + if i == 0: + res.append(m_br[1]) + i += chunk_size + + unique_brs_anyid: list[set[str]] = [] + for k_val in brs_meta.values(): + br_ids = k_val["ids"]["value"] + if br_ids: + s = set(br_ids.split(" __ ")) + _c_intersection = 0 + for __unique in unique_brs_anyid: + _c_intersection += len(__unique.intersection(s)) + if _c_intersection == 0: + unique_brs_anyid.append(s) + br_values = [k_val[k]["value"] if k in k_val else "" for k in res[0]] + res.append(br_values) + + f_res = {} + for row in res[1:]: + f_res[row[0]] = {k_val: row[i] for i, k_val in enumerate(res[0])} + + return f_res + + +def get_pub_date(elem): + return elem["pubDate"] + + +def get_source(elem): + return elem["source"].split("; ") + + +def get_author(elem): + return elem["author"].split("; ") + + +def get_id_val(val): + return val.replace("https://w3id.org/oc/meta/br/", "") + + +def cit_journal_sc(citing_source_ids, cited_source_ids): + if len(set(citing_source_ids).intersection(set(cited_source_ids))) > 0: + return "yes" + return "no" + + +def cit_author_sc(citing_authors, cited_authors): + if len(set(citing_authors).intersection(set(cited_authors))) > 0: + return "yes" + return "no" + + +def cit_duration(citing_complete_pub_date, cited_complete_pub_date): + + def _contains_years(date): + return date is not None and len(date) >= 4 + + def _contains_months(date): + return date is not None and len(date) >= 7 + + def _contains_days(date): + return date is not None and len(date) >= 10 + + consider_years = _contains_years(citing_complete_pub_date) and _contains_years(cited_complete_pub_date) + consider_months = _contains_months(citing_complete_pub_date) and _contains_months(cited_complete_pub_date) + consider_days = _contains_days(citing_complete_pub_date) and _contains_days(cited_complete_pub_date) + + if not consider_years: + return "" + citing_pub_datetime = datetime.strptime((citing_complete_pub_date + "-01-01")[:10], "%Y-%m-%d") + cited_pub_datetime = datetime.strptime((cited_complete_pub_date + "-01-01")[:10], "%Y-%m-%d") + + delta = relativedelta(citing_pub_datetime, cited_pub_datetime) + + result = "" + if ( + delta.years < 0 + or (delta.years == 0 and delta.months < 0 and consider_months) + or ( + delta.years == 0 + and delta.months == 0 + and delta.days < 0 + and consider_days + ) + ): + result += "-" + result += "P%sY" % abs(delta.years) + + if consider_months: + result += "%sM" % abs(delta.months) + + if consider_days: + result += "%sD" % abs(delta.days) + + return result diff --git a/src/api/indexapi_v1.py b/src/api/indexapi_v1.py index 72bf8be..315e7a4 100644 --- a/src/api/indexapi_v1.py +++ b/src/api/indexapi_v1.py @@ -15,126 +15,58 @@ # SOFTWARE. __author__ = 'Arcangelo Massari & Ivan Heibi' -import json -import os -from urllib.parse import quote, unquote -from requests import get,post -from rdflib import Graph, URIRef -from re import sub,findall -from json import loads -from datetime import datetime -from dateutil.relativedelta import relativedelta -from dateutil.parser import parse -from collections import defaultdict - -# Load the configuration file -with open("conf.json") as f: - c = json.load(f) - - -# Docker ENV variables -env_config = { - "base_url": os.getenv("BASE_URL", c["base_url"]), - "sparql_endpoint_index": os.getenv("SPARQL_ENDPOINT_INDEX", c["sparql_endpoint_index"]), - "sparql_endpoint_meta": os.getenv("SPARQL_ENDPOINT_META", c["sparql_endpoint_meta"]), - "sync_enabled": os.getenv("SYNC_ENABLED", "false").lower() == "true" -} - -def lower(s): - return s.lower(), -def encode(s): - return quote(s), +from requests import RequestException, post +from json import loads +from indexapi_common import ( + lower, # noqa: F401 - used by ramose via getattr + env_config, + get_unique_brs_metadata, + get_pub_date, + get_source, + get_author, + get_id_val, + cit_journal_sc, + cit_author_sc, + cit_duration, +) -def split_dois2omids(s): - l_omids = [] - for d in s.split("__"): - print("omid of :",d) - l_omids.extend( __get_omid_of(d, multi = True) ) - return " ".join(l_omids), def id2omids(s): - if "omid" in s: - return s.replace("omid:br/","", - return __get_omid_of(s, multi = True), - -def metadata(res, *args): - header = res[0] - oci_idx = header.index(args[0]); - citation_idx = header.index(args[1]) - reference_idx = header.index(args[2]) - - res_entities = {} - if len(res) > 1: - for idx, row in enumerate(res[1:]): - res_entities[idx] = { - "omid": row[oci_idx][1], - "citation": row[citation_idx][1], - "reference": row[reference_idx][1] - } - - # delete the item + citing + cited columns - res = [[elem for idx, elem in enumerate(row) if idx != oci_idx and idx != citation_idx and idx != reference_idx] for row in res] - - header = res[0] - additional_fields = ["doi" , "citation_count", "citation", "reference", "author", "year", "title", "source_title", "volume", "issue", "page", "source_id", "oa_link"] - header.extend(additional_fields) - rows_to_remove = [] - - # org value: - for idx, row in enumerate(res[1:]): - omid_uri = res_entities[idx]["omid"] - citation = res_entities[idx]["citation"] - reference = res_entities[idx]["reference"] - entities = citation.split("; ") + reference.split("; ") + [omid_uri] - r = __br_meta_metadata(["<"+e+">" for e in entities]) - if r is None or all([i in ("", None) for i in r]): - row.extend(["","",""]) - else: - k_omids_uris = r[0] - - citation_ids = [] - for e in citation.split("; "): - if e in k_omids_uris: - citation_ids.append(__get_doi(k_omids_uris[e],True)) - - reference_ids = [] - for e in reference.split("; "): - if e in k_omids_uris: - reference_ids.append(__get_doi(k_omids_uris[e],True)) + MULTI_VAL_MAX = 9000 + sparql_endpoint = env_config["sparql_endpoint_meta"] - row.extend([ - __get_doi(k_omids_uris[omid_uri],True), - str(len(citation_ids)), - "; ".join(citation_ids), - "; ".join(reference_ids) - ]) + sparql_query = """ + PREFIX datacite: + PREFIX literal: + SELECT ?br { + { ?identifier literal:hasLiteralValue '"""+s+"""'^^. } + UNION + { ?identifier literal:hasLiteralValue '"""+s+"""'. } + ?br datacite:hasIdentifier ?identifier + } + """ + headers={"Accept": "application/sparql-results+json", "Content-Type": "application/sparql-query"} + try: + response = post(sparql_endpoint, headers=headers, data=sparql_query, timeout=45) + response.raise_for_status() + except RequestException: + return "", + r = loads(response.text) + results = r["results"]["bindings"] + omid_l = [elem["br"]["value"].split("meta/br/")[1] for elem in results] - entity = "omid:"+omid_uri.split("oc/meta/")[1] - r = __ocmeta_parser([entity],"omid") - if r is None or all([i in ("", None) for i in r]): - row.extend(["","","","","","","","",""]) - else: - if entity in r: - r = r[entity] - row.extend([ - r["authors_str"], - r["pub_date"], - r["title"], - r["source_title"], - r["volume"], - r["issue"], - r["page"], - r["source_id"], - "" - ]) + if len(omid_l) == 0: + return "", - return res, True + sparql_values = [] + for i in range(0, len(omid_l), MULTI_VAL_MAX): + sparql_values.append( " ".join(["" for e in omid_l[i:i + MULTI_VAL_MAX]]) ) + return sparql_values, def count_unique_cits(res, *args): header = res[0] - oci_idx = header.index(args[0]) citing_idx = header.index(args[1]) cited_idx = header.index(args[2]) set_oci = set() @@ -143,18 +75,12 @@ def count_unique_cits(res, *args): if len(res) > 1: citing_to_dedup = [] cited_to_dedup = [] - for idx, row in enumerate(res[1:]): - citing_val = row[citing_idx] - cited_val = row[cited_idx] - if isinstance(citing_val, tuple): - citing_to_dedup.extend(citing_val) - cited_to_dedup.extend(cited_val) - else: - citing_to_dedup.append(citing_val) - cited_to_dedup.append(cited_val) + for row in res[1:]: + citing_to_dedup.extend(row[citing_idx]) + cited_to_dedup.extend(row[cited_idx]) - citing_to_dedup_meta = __get_unique_brs_metadata( list(set(citing_to_dedup)) ) - cited_to_dedup_meta = __get_unique_brs_metadata( list(set(cited_to_dedup)) ) + citing_to_dedup_meta = get_unique_brs_metadata( list(set(citing_to_dedup)), ids_only=True ) + cited_to_dedup_meta = get_unique_brs_metadata( list(set(cited_to_dedup)), ids_only=True ) for _k_citing in citing_to_dedup_meta.keys(): for _k_cited in cited_to_dedup_meta.keys(): set_oci.add( (_k_citing,_k_cited) ) @@ -164,7 +90,6 @@ def count_unique_cits(res, *args): def citations_info(res, *args): header = res[0] - oci_idx = header.index(args[0]) citing_idx = header.index(args[1]) cited_idx = header.index(args[2]) @@ -176,18 +101,12 @@ def citations_info(res, *args): if len(res) > 1: citing_to_dedup = [] cited_to_dedup = [] - for idx, row in enumerate(res[1:]): - citing_val = row[citing_idx] - cited_val = row[cited_idx] - if isinstance(citing_val, tuple): - citing_to_dedup.extend(citing_val) - cited_to_dedup.extend(cited_val) - else: - citing_to_dedup.append(citing_val) - cited_to_dedup.append(cited_val) + for row in res[1:]: + citing_to_dedup.extend(row[citing_idx]) + cited_to_dedup.extend(row[cited_idx]) - citing_to_dedup_meta = __get_unique_brs_metadata( list(set(citing_to_dedup)) ) - cited_to_dedup_meta = __get_unique_brs_metadata( list(set(cited_to_dedup)) ) + citing_to_dedup_meta = get_unique_brs_metadata( list(set(citing_to_dedup)) ) + cited_to_dedup_meta = get_unique_brs_metadata( list(set(cited_to_dedup)) ) for citing_entity in citing_to_dedup_meta: for cited_entity in cited_to_dedup_meta: @@ -197,410 +116,30 @@ def citations_info(res, *args): res_row = [ # oci value - __get_id_val(citing_entity,True)+"-"+__get_id_val(cited_entity,True), + get_id_val(citing_entity)+"-"+get_id_val(cited_entity), # citing __get_doi(_citing), # cited __get_doi(_cited), # creation = citing[pub_date] - __get_pub_date(_citing), + get_pub_date(_citing), # timespan = citing[pub_date] - cited[pub_date] - __cit_duration(__get_pub_date(_citing),__get_pub_date(_cited)), + cit_duration(get_pub_date(_citing),get_pub_date(_cited)), # journal_sc = compare citing[source_id] and cited[source_id] - __cit_journal_sc(__get_source(_citing),__get_source(_cited)), + cit_journal_sc(get_source(_citing),get_source(_cited)), # author_sc = compare citing[source_id] and cited[source_id] - __cit_author_sc(__get_author(_citing),__get_author(_cited)) + cit_author_sc(get_author(_citing),get_author(_cited)) ] f_res.append(res_row) return f_res, True -# args must contain the -def sum_all(res, *args): - - header = res[0] - try: - count_idx = header.index(args[0]) - - tot_count = 0 - for idx, row in enumerate(res[1:]): - tot_count += int(row[count_idx][1]) - - # delete the item + citing + cited columns - res = [header,[str(tot_count)]] - return res, True - - except: - return [], True - - -# --- -# Local methods -# --- - -def __ocmeta_parser(ids, pre="doi"): - api = "https://api.opencitations.net/meta/v1/metadata/" - - r = get(api + "__".join(ids), headers={"User-Agent": "INDEX REST API (via OpenCitations - http://opencitations.net; mailto:contact@opencitations.net)"}, timeout=60) - - f_res = {} - if r.status_code == 200: - json_res = loads(r.text) - if len(json_res) > 0: - - for body in json_res: - - id = None - omid = None - if "id" in body: - for p_id in body["id"].split(" "): - if str(p_id).startswith(pre): - id = str(p_id) - if str(p_id).startswith("omid"): - omid = str(p_id) - - if omid == None: - continue - - authors = [] - l_authors_id = [] - authors_orcid = [] - if "author" in body: - if body["author"] != "": - for author in body["author"].split(";"): - author_string = author - author_orcid = findall(r"orcid\:([\d\-^\]]{1,})",author) - author_ids = findall(r"\[.{1,}\]",author) - if len(author_ids) > 0: - author_string = author.replace(author_ids[0],"").strip() - if len(author_orcid) > 0: - authors_orcid.append(author_orcid[0].strip()) - author_string = author_string+", "+author_orcid[0].strip() - if author_string is not None: - authors.append(__normalise(author_string)) - - source_title = "" - source_id = "" - all_source_ids = [] - if "venue" in body: - if body["venue"] != "": - source_title_string = body["venue"] - - source_issn = findall(r"(issn\:[\d\-^\]]{1,})",source_title_string) - source_isbn = findall(r"(isbn\:[\d\-^\]]{1,})",source_title_string) - source_ids = findall(r"\[.{1,}\]",source_title_string) - if len(source_ids) > 0: - all_source_ids = source_ids[0].split(" ") - source_title_string = source_title_string.replace(source_ids[0],"").strip() - if len(source_issn) > 0: - source_id = source_issn[0] - elif len(source_isbn) > 0: - source_id = source_isbn[0] - source_title = source_title_string - - year = "" - pub_date = "" - if "pub_date" in body: - pub_date = __normalise(body["pub_date"]) - if len(body["pub_date"]) >= 4: - year = __normalise(body["pub_date"][:4]) - - title = "" - if "title" in body: - title = body["title"] - - volume = "" - if "volume" in body: - volume = __normalise(body["volume"]) - - issue = "" - if "issue" in body: - issue = __normalise(body["issue"]) - - page = "" - if "page" in body: - page = __normalise(body["page"]) - - f_res[omid] = { - "id": id, - "authors_str": "; ".join(authors), - "authors_orcid": authors_orcid, - "pub_date": pub_date, - "title": title, - "source_title": source_title, - "source_id": source_id, - "all_source_ids": all_source_ids, - "volume": volume, - "issue": issue, - "page":page - } - - return f_res - - return f_res - -def __convert_cit_v1(l_cits): - if len(l_cits) > 0: - for cit in l_cits: - for k_att in ["citing","cited"]: - if k_att in cit: - doi = "" - for anyid in cit[k_att].split(): - if anyid.startswith("doi:"): - doi = anyid.split("doi:")[1] - cit[k_att] = doi - return l_cits - - -def __get_omid_of(s, multi = False): - MULTI_VAL_MAX = 9000 - sparql_endpoint = env_config["sparql_endpoint_meta"] - sparql_query = """ - PREFIX datacite: - PREFIX literal: - SELECT ?br { - ?identifier literal:hasLiteralValue '"""+s+"""'. - ?br datacite:hasIdentifier ?identifier - } - """ - - headers={"Accept": "application/sparql-results+json", "Content-Type": "application/sparql-query"} - data = {"query": sparql_query} - omid_l = [] - try: - response = post(sparql_endpoint, headers=headers, data=sparql_query, timeout=45) - if response.status_code == 200: - r = loads(response.text) - results = r["results"]["bindings"] - if len(results) > 0: - for elem in results: - omid_val = elem["br"]["value"].split("meta/br/")[1] - omid_l.append(omid_val) - except: - return "" - - if len(omid_l) == 0: - return "" - - if multi: - sparql_values = [] - for i in range(0, len(omid_l), MULTI_VAL_MAX): - sparql_values.append( " ".join(["" for e in omid_l[i:i + MULTI_VAL_MAX]]) ) - return sparql_values - - # in case multi OMIDs is not handled - # return the only omid given as result - return omid_l[0] - -def __get_unique_brs_metadata(l_url_brs): - - res = [] - l_brs = ["<"+_url_br+">" for _url_br in l_url_brs] - - i = 0 - chunk_size = 3000 - brs_meta = {} - while i < len(l_brs): - chunk = l_brs[i:i + chunk_size] - m_br = __br_meta_metadata(chunk) - brs_meta.update( m_br[0] ) - if i == 0: - res.append(m_br[1]) - i += chunk_size - - unique_brs_anyid = [] - unique_brs = [] - for k_br,k_val in brs_meta.items(): - br_ids = k_val["ids"]["value"] - if br_ids: - s = set( [id for id in br_ids.split(" __ ")] ) - # check the unique br anyids - _c_intersection = 0 - for __unique in unique_brs_anyid: - _c_intersection += len(__unique.intersection(s)) - # if there is no common anyids with the other br entities - if _c_intersection == 0: - unique_brs_anyid.append(s) - br_values = [k_val[k]['value'] if k in k_val else "" for k in res[0]] - res.append( br_values ) - #unique_brs.append( br_values ) - - f_res = {} - for row in res[1:]: - f_res[row[0]] = {k_val: row[i] for i, k_val in enumerate(res[0])} - - return f_res - -def __br_meta_metadata(values): - sparql_endpoint = env_config["sparql_endpoint_meta"] - - # SPARQL query - sparql_query = """ - PREFIX pro: - PREFIX frbr: - PREFIX fabio: - PREFIX datacite: - PREFIX literal: - PREFIX prism: - SELECT DISTINCT ?val ?pubDate (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=' __ ') AS ?ids) (GROUP_CONCAT(?venue; separator="; ") as ?source) (GROUP_CONCAT(?raAuthor; separator="; ") as ?author) - WHERE { - VALUES ?val { """+" ".join(values)+""" } - OPTIONAL { ?val prism:publicationDate ?pubDate. } - OPTIONAL { - ?val datacite:hasIdentifier ?identifier. - ?identifier datacite:usesIdentifierScheme ?scheme; - literal:hasLiteralValue ?literalValue. - BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?literalValue) AS ?id) - } - OPTIONAL { - { - ?val a fabio:JournalArticle; - frbr:partOf+ ?venue. - ?venue a fabio:Journal. - } UNION { - ?val frbr:partOf ?venue. - } - } - OPTIONAL { - ?val pro:isDocumentContextFor ?arAuthor. - ?arAuthor pro:withRole pro:author; - pro:isHeldBy ?raAuthor. - } - } GROUP BY ?val ?pubDate - """ - - headers={"Accept": "application/sparql-results+json", "Content-Type": "application/sparql-query"} - data = {"query": sparql_query} - - try: - response = post(sparql_endpoint, headers=headers, data=sparql_query, timeout=60) - if response.status_code == 200: - r = loads(response.text) - results = r["results"]["bindings"] - res_json = {} - if len(results) > 0: - for elem in results: - res_json[elem["val"]["value"]] = elem - return res_json,["val","pubDate","ids","source","author"] - - except: - return None,None - -def __normalise(o): - if o is None: - s = "" - else: - s = str(o) - return sub("\s+", " ", s).strip() - -def __get_id_val(val, reverse = False): - if not reverse: - return "https://w3id.org/oc/meta/"+val.split("oc/meta/")[1] - return val.replace("https://w3id.org/oc/meta/br/","") - -def __get_omid(elem): +def __get_doi(elem): str_ids = [] if "ids" in elem: for id in elem["ids"].split(" __ "): - if id.startswith("omid:"): - str_ids.append(id.split("omid:")[1]) - - return " ".join(str_ids) - -def __get_doi(elem, value_key = False): - str_ids = [] - if "ids" in elem: - ids = elem["ids"] - if value_key: - ids = ids["value"] - for id in ids.split(" __ "): if id.startswith("doi:"): str_ids.append(id.split("doi:")[1]) return " ".join(str_ids) - -def __get_pub_date(elem): - if "pubDate" in elem: - return elem["pubDate"] - return "" - -def __get_source(elem): - if "source" in elem: - return elem["source"].split("; ") - return "" - -def __get_author(elem): - if "author" in elem: - return elem["author"].split("; ") - return "" - -def __cit_journal_sc(citing_source_ids, cited_source_ids): - if len(set(citing_source_ids).intersection(set(cited_source_ids))) > 0: - return "yes" - return "no" - -def __cit_author_sc(citing_authors, cited_authors): - if len(set(citing_authors).intersection(set(cited_authors))) > 0: - return "yes" - return "no" - -def __cit_duration(citing_complete_pub_date, cited_complete_pub_date): - - def ___contains_years(date): - return date is not None and len(date) >= 4 - - def ___contains_months(date): - return date is not None and len(date) >= 7 - - def ___contains_days(date): - return date is not None and len(date) >= 10 - - DEFAULT_DATE = datetime(1970, 1, 1, 0, 0) - consider_months = ___contains_months(citing_complete_pub_date) and ___contains_months(cited_complete_pub_date) - consider_days = ___contains_days(citing_complete_pub_date) and ___contains_days(cited_complete_pub_date) - - try: - if citing_complete_pub_date == "" or citing_complete_pub_date == None: - return "" - citing_pub_datetime = parse( - citing_complete_pub_date, default=DEFAULT_DATE - ) - except ValueError: # It is not a leap year - citing_pub_datetime = parse( - citing_complete_pub_date[:7] + "-28", default=DEFAULT_DATE - ) - try: - if cited_complete_pub_date == "" or cited_complete_pub_date == None: - return "" - cited_pub_datetime = parse( - cited_complete_pub_date, default=DEFAULT_DATE - ) - except ValueError: # It is not a leap year - cited_pub_datetime = parse( - cited_complete_pub_date[:7] + "-28", default=DEFAULT_DATE - ) - - delta = relativedelta(citing_pub_datetime, cited_pub_datetime) - - result = "" - if ( - delta.years < 0 - or (delta.years == 0 and delta.months < 0 and consider_months) - or ( - delta.years == 0 - and delta.months == 0 - and delta.days < 0 - and consider_days - ) - ): - result += "-" - result += "P%sY" % abs(delta.years) - - if consider_months: - result += "%sM" % abs(delta.months) - - if consider_days: - result += "%sD" % abs(delta.days) - - return result \ No newline at end of file diff --git a/src/api/indexapi_v2.py b/src/api/indexapi_v2.py index 0bc6d8b..b006833 100644 --- a/src/api/indexapi_v2.py +++ b/src/api/indexapi_v2.py @@ -15,45 +15,30 @@ # SOFTWARE. __author__ = 'Arcangelo Massari & Ivan Heibi' -import json -import os -from urllib.parse import quote, unquote -from requests import get,post -from rdflib import Graph, URIRef -from re import sub,findall -from json import loads -from datetime import datetime -from dateutil.relativedelta import relativedelta -from dateutil.parser import parse -from collections import defaultdict - -# Load the configuration file -with open("conf.json") as f: - c = json.load(f) - -# Docker ENV variables -env_config = { - "base_url": os.getenv("BASE_URL", c["base_url"]), - "sparql_endpoint_index": os.getenv("SPARQL_ENDPOINT_INDEX", c["sparql_endpoint_index"]), - "sparql_endpoint_meta": os.getenv("SPARQL_ENDPOINT_META", c["sparql_endpoint_meta"]), - "sync_enabled": os.getenv("SYNC_ENABLED", "false").lower() == "true" -} - -def lower(s): - return s.lower(), +from requests import RequestException, post +from json import loads +from indexapi_common import ( + lower, # noqa: F401 - used by ramose via getattr + env_config, + get_unique_brs_metadata, + get_pub_date, + get_source, + get_author, + get_id_val, + cit_journal_sc, + cit_author_sc, + cit_duration, +) -def encode(s): - return quote(s), def id2omids(s): if "omid" in s: return s.replace("omid:br/","", - return __get_omid_of(s, multi = True), + return __get_omid_of(s), def count_unique_cits(res, *args): header = res[0] - oci_idx = header.index(args[0]) citing_idx = header.index(args[1]) cited_idx = header.index(args[2]) set_oci = set() @@ -62,18 +47,12 @@ def count_unique_cits(res, *args): if len(res) > 1: citing_to_dedup = [] cited_to_dedup = [] - for idx, row in enumerate(res[1:]): - citing_val = row[citing_idx] - cited_val = row[cited_idx] - if isinstance(citing_val, tuple): - citing_to_dedup.extend(citing_val) - cited_to_dedup.extend(cited_val) - else: - citing_to_dedup.append(citing_val) - cited_to_dedup.append(cited_val) - - citing_to_dedup_meta = __get_unique_brs_metadata( list(set(citing_to_dedup)), True ) - cited_to_dedup_meta = __get_unique_brs_metadata( list(set(cited_to_dedup)), True ) + for row in res[1:]: + citing_to_dedup.extend(row[citing_idx]) + cited_to_dedup.extend(row[cited_idx]) + + citing_to_dedup_meta = get_unique_brs_metadata( list(set(citing_to_dedup)), ids_only=True ) + cited_to_dedup_meta = get_unique_brs_metadata( list(set(cited_to_dedup)), ids_only=True ) for _k_citing in citing_to_dedup_meta.keys(): for _k_cited in cited_to_dedup_meta.keys(): set_oci.add( (_k_citing,_k_cited) ) @@ -84,7 +63,6 @@ def count_unique_cits(res, *args): def citations_info(res, *args): header = res[0] - oci_idx = header.index(args[0]) citing_idx = header.index(args[1]) cited_idx = header.index(args[2]) @@ -96,18 +74,12 @@ def citations_info(res, *args): if len(res) > 1: citing_to_dedup = [] cited_to_dedup = [] - for idx, row in enumerate(res[1:]): - citing_val = row[citing_idx] - cited_val = row[cited_idx] - if isinstance(citing_val, tuple): - citing_to_dedup.extend(citing_val) - cited_to_dedup.extend(cited_val) - else: - citing_to_dedup.append(citing_val) - cited_to_dedup.append(cited_val) - - citing_to_dedup_meta = __get_unique_brs_metadata( list(set(citing_to_dedup)) ) - cited_to_dedup_meta = __get_unique_brs_metadata( list(set(cited_to_dedup)) ) + for row in res[1:]: + citing_to_dedup.extend(row[citing_idx]) + cited_to_dedup.extend(row[cited_idx]) + + citing_to_dedup_meta = get_unique_brs_metadata( list(set(citing_to_dedup)) ) + cited_to_dedup_meta = get_unique_brs_metadata( list(set(cited_to_dedup)) ) for citing_entity in citing_to_dedup_meta: for cited_entity in cited_to_dedup_meta: @@ -117,19 +89,19 @@ def citations_info(res, *args): res_row = [ # oci value - __get_id_val(citing_entity,True)+"-"+__get_id_val(cited_entity,True), + get_id_val(citing_entity)+"-"+get_id_val(cited_entity), # citing __get_all_pids(_citing,citing_entity), # cited __get_all_pids(_cited,cited_entity), # creation = citing[pub_date] - __get_pub_date(_citing), + get_pub_date(_citing), # timespan = citing[pub_date] - cited[pub_date] - __cit_duration(__get_pub_date(_citing),__get_pub_date(_cited)), + cit_duration(get_pub_date(_citing),get_pub_date(_cited)), # journal_sc = compare citing[source_id] and cited[source_id] - __cit_journal_sc(__get_source(_citing),__get_source(_cited)), + cit_journal_sc(get_source(_citing),get_source(_cited)), # author_sc = compare citing[source_id] and cited[source_id] - __cit_author_sc(__get_author(_citing),__get_author(_cited)) + cit_author_sc(get_author(_citing),get_author(_cited)) ] f_res.append(res_row) @@ -139,26 +111,21 @@ def citations_info(res, *args): def sum_all(res, *args): header = res[0] - try: - count_idx = header.index(args[0]) - - tot_count = 0 - for idx, row in enumerate(res[1:]): - tot_count += int(row[count_idx][1]) + count_idx = header.index(args[0]) - # delete the item + citing + cited columns - res = [header,[str(tot_count)]] - return res, True + tot_count = 0 + for row in res[1:]: + tot_count += int(row[count_idx][1]) - except: - return [], True + res = [header, [str(tot_count)]] + return res, True # --- # Local methods # --- -def __get_omid_of(s, multi = False): +def __get_omid_of(s): MULTI_VAL_MAX = 9000 sparql_endpoint = env_config["sparql_endpoint_meta"] @@ -203,267 +170,29 @@ def __get_omid_of(s, multi = False): } """ - headers={"Accept": "application/sparql-results+json", "Content-Type": "application/sparql-query"} - data = {"query": sparql_query} - omid_l = [] + headers = {"Accept": "application/sparql-results+json", "Content-Type": "application/sparql-query"} try: response = post(sparql_endpoint, headers=headers, data=sparql_query, timeout=45) - if response.status_code == 200: - r = loads(response.text) - results = r["results"]["bindings"] - if len(results) > 0: - for elem in results: - omid_val = elem["br"]["value"].split("meta/br/")[1] - omid_l.append(omid_val) - except: + response.raise_for_status() + except RequestException: return "" + r = loads(response.text) + results = r["results"]["bindings"] + omid_l = [elem["br"]["value"].split("meta/br/")[1] for elem in results] if len(omid_l) == 0: return "" - if multi: - sparql_values = [] - for i in range(0, len(omid_l), MULTI_VAL_MAX): - sparql_values.append( " ".join(["" for e in omid_l[i:i + MULTI_VAL_MAX]]) ) - return sparql_values - - # in case multi OMIDs is not handled - # return the only omid given as result - return omid_l[0] - -def __get_unique_brs_metadata(l_url_brs, citation_count_call = False): - - res = [] - l_brs = ["<"+_url_br+">" for _url_br in l_url_brs] - - i = 0 - chunk_size = 3000 - brs_meta = {} - while i < len(l_brs): - chunk = l_brs[i:i + chunk_size] - m_br = None - if citation_count_call: - m_br = __br_meta_anyids(chunk) - else: - m_br = __br_meta_metadata(chunk) - brs_meta.update( m_br[0] ) - if i == 0: - res.append(m_br[1]) - i += chunk_size - - unique_brs_anyid = [] - unique_brs = [] - for k_br,k_val in brs_meta.items(): - br_ids = k_val["ids"]["value"] - if br_ids: - s = set( [id for id in br_ids.split(" __ ")] ) - # check the unique br anyids - _c_intersection = 0 - for __unique in unique_brs_anyid: - _c_intersection += len(__unique.intersection(s)) - # if there is no common anyids with the other br entities - if _c_intersection == 0: - unique_brs_anyid.append(s) - br_values = [k_val[k]['value'] if k in k_val else "" for k in res[0]] - res.append( br_values ) - #unique_brs.append( br_values ) - - f_res = {} - for row in res[1:]: - f_res[row[0]] = {k_val: row[i] for i, k_val in enumerate(res[0])} - - return f_res - -def __br_meta_metadata(values): - sparql_endpoint = env_config["sparql_endpoint_meta"] - - # SPARQL query - sparql_query = """ - PREFIX pro: - PREFIX frbr: - PREFIX fabio: - PREFIX datacite: - PREFIX literal: - PREFIX prism: - SELECT DISTINCT ?val ?pubDate (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=' __ ') AS ?ids) (GROUP_CONCAT(?venue; separator="; ") as ?source) (GROUP_CONCAT(?raAuthor; separator="; ") as ?author) - WHERE { - VALUES ?val { """+" ".join(values)+""" } - OPTIONAL { ?val prism:publicationDate ?pubDate. } - OPTIONAL { - ?val datacite:hasIdentifier ?identifier. - ?identifier datacite:usesIdentifierScheme ?scheme; - literal:hasLiteralValue ?literalValue. - BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?literalValue) AS ?id) - } - OPTIONAL { - { - ?val a fabio:JournalArticle; - frbr:partOf+ ?venue. - ?venue a fabio:Journal. - } UNION { - ?val frbr:partOf ?venue. - } - } - OPTIONAL { - ?val pro:isDocumentContextFor ?arAuthor. - ?arAuthor pro:withRole pro:author; - pro:isHeldBy ?raAuthor. - } - } GROUP BY ?val ?pubDate - """ - - headers={"Accept": "application/sparql-results+json", "Content-Type": "application/sparql-query"} - data = {"query": sparql_query} - - try: - response = post(sparql_endpoint, headers=headers, data=sparql_query, timeout=60) - if response.status_code == 200: - r = loads(response.text) - results = r["results"]["bindings"] - res_json = {} - if len(results) > 0: - for elem in results: - res_json[elem["val"]["value"]] = elem - return res_json,["val","pubDate","ids","source","author"] - - except: - return None,None - -def __br_meta_anyids(values): - sparql_endpoint = env_config["sparql_endpoint_meta"] - - # SPARQL query - sparql_query = """ - PREFIX pro: - PREFIX frbr: - PREFIX fabio: - PREFIX datacite: - PREFIX literal: - PREFIX prism: - SELECT DISTINCT ?val (GROUP_CONCAT(DISTINCT ?id; SEPARATOR=' __ ') AS ?ids) - WHERE { - VALUES ?val { """+" ".join(values)+""" } - OPTIONAL { - ?val datacite:hasIdentifier ?identifier. - ?identifier datacite:usesIdentifierScheme ?scheme; - literal:hasLiteralValue ?literalValue. - BIND(CONCAT(STRAFTER(STR(?scheme), "http://purl.org/spar/datacite/"), ":", ?literalValue) AS ?id) - } - } GROUP BY ?val - """ - - headers={"Accept": "application/sparql-results+json", "Content-Type": "application/sparql-query"} - data = {"query": sparql_query} - - try: - response = post(sparql_endpoint, headers=headers, data=sparql_query, timeout=60) - if response.status_code == 200: - r = loads(response.text) - results = r["results"]["bindings"] - res_json = {} - if len(results) > 0: - for elem in results: - res_json[elem["val"]["value"]] = elem - return res_json,["val","ids"] - - except: - return None,None - -def __get_id_val(val, reverse = False): - if not reverse: - return "https://w3id.org/oc/meta/"+val.split("oc/meta/")[1] - return val.replace("https://w3id.org/oc/meta/br/","") + sparql_values = [] + for i in range(0, len(omid_l), MULTI_VAL_MAX): + sparql_values.append( " ".join(["" for e in omid_l[i:i + MULTI_VAL_MAX]]) ) + return sparql_values def __get_all_pids(elem, uri_omid): - str_omid = "omid:br/"+__get_id_val(uri_omid,True) + str_omid = "omid:br/"+get_id_val(uri_omid) str_ids = [str_omid] if "ids" in elem: for id in elem["ids"].split(" __ "): str_ids.append(id) return " ".join(str_ids) - -def __get_pub_date(elem): - if "pubDate" in elem: - return elem["pubDate"] - return "" - -def __get_source(elem): - if "source" in elem: - return elem["source"].split("; ") - return "" - -def __get_author(elem): - if "author" in elem: - return elem["author"].split("; ") - return "" - -def __cit_journal_sc(citing_source_ids, cited_source_ids): - if len(set(citing_source_ids).intersection(set(cited_source_ids))) > 0: - return "yes" - return "no" - -def __cit_author_sc(citing_authors, cited_authors): - if len(set(citing_authors).intersection(set(cited_authors))) > 0: - return "yes" - return "no" - -def __cit_duration(citing_complete_pub_date, cited_complete_pub_date): - - def ___contains_years(date): - return date is not None and len(date) >= 4 - - def ___contains_months(date): - return date is not None and len(date) >= 7 - - def ___contains_days(date): - return date is not None and len(date) >= 10 - - DEFAULT_DATE = datetime(1970, 1, 1, 0, 0) - consider_months = ___contains_months(citing_complete_pub_date) and ___contains_months(cited_complete_pub_date) - consider_days = ___contains_days(citing_complete_pub_date) and ___contains_days(cited_complete_pub_date) - - try: - if citing_complete_pub_date == "" or citing_complete_pub_date == None: - return "" - citing_pub_datetime = parse( - citing_complete_pub_date, default=DEFAULT_DATE - ) - except ValueError: # It is not a leap year - citing_pub_datetime = parse( - citing_complete_pub_date[:7] + "-28", default=DEFAULT_DATE - ) - try: - if cited_complete_pub_date == "" or cited_complete_pub_date == None: - return "" - cited_pub_datetime = parse( - cited_complete_pub_date, default=DEFAULT_DATE - ) - except ValueError: # It is not a leap year - cited_pub_datetime = parse( - cited_complete_pub_date[:7] + "-28", default=DEFAULT_DATE - ) - - delta = relativedelta(citing_pub_datetime, cited_pub_datetime) - - result = "" - if ( - delta.years < 0 - or (delta.years == 0 and delta.months < 0 and consider_months) - or ( - delta.years == 0 - and delta.months == 0 - and delta.days < 0 - and consider_days - ) - ): - result += "-" - result += "P%sY" % abs(delta.years) - - if consider_months: - result += "%sM" % abs(delta.months) - - if consider_days: - result += "%sD" % abs(delta.days) - - return result diff --git a/src/api/metaapi.py b/src/api/metaapi.py index 6f4338c..94c6367 100644 --- a/src/api/metaapi.py +++ b/src/api/metaapi.py @@ -16,13 +16,7 @@ __author__ = 'Arcangelo Massari' -import re -from difflib import get_close_matches -from typing import List, Tuple -from urllib.parse import quote - -# from publishers import PUBLISHERS -PUBLISHERS = list() +from typing import Tuple URI_TYPE_DICT = { 'http://purl.org/spar/doco/Abstract': 'abstract', @@ -63,14 +57,6 @@ } -# def generate_id_search(ids: str) -> Tuple[str]: -# id_searches = list() -# for identifier in ids.split('__'): -# scheme_literal_value = identifier.split(':', maxsplit=1) -# scheme = scheme_literal_value[0].lower() -# literal_value = quote(scheme_literal_value[1]) -# literal_value = literal_value.lower() if scheme == 'doi' else literal_value - def generate_id_search(ids: str) -> Tuple[str]: id_searches = list() omid_values = [] @@ -181,201 +167,3 @@ def process_ordered_list(items): current_role = items_dict.get(current_role, '') return "; ".join(ordered_items) - -def clean_name(name: str) -> str: - if ',' in name: - split_name = re.split('\s*,\s*', name) - first_name = split_name[1].split() - for i, w in enumerate(first_name): - first_name[i] = clean_title(w) - new_first_name = ' '.join(first_name) - surname = split_name[0].split() - for i, w in enumerate(surname): - surname[i] = clean_title(w) - new_surname = ' '.join(surname) - if new_surname and new_first_name: - new_name = new_surname + ', ' + new_first_name - elif not new_surname and new_first_name: - new_name = ', ' + new_first_name - else: - new_name = '' - else: - split_name = name.split() - for i, w in enumerate(split_name): - split_name[i] = clean_title(w) - new_name = ' '.join(split_name) - return new_name - -def clean_title(title: str) -> str: - if title.isupper(): - title = title.lower() - words = title.split() - for i, w in enumerate(words): - if not any(x.isupper() for x in w): - words[i] = w.title() - new_title = ' '.join(words) - return new_title - -# class TextSearch(): -# def __init__(self, text:str): -# self.text = text - -# def get_text_search_on_id(self, ts_index:bool) -> str: -# schema_and_literal_value = self.text.split(':') -# schema = self.text = schema_and_literal_value[0].lower() -# literal_value = schema_and_literal_value[1] -# literal_value = literal_value.lower() if schema == 'doi' else literal_value -# return f''' -# {self.__gen_text_search(f'tsId{ts_index}', literal_value, True, ts_index)} -# ?tsIdentifier{ts_index} literal:hasLiteralValue ?tsId{ts_index}; -# datacite:usesIdentifierScheme datacite:{schema}. -# ?res datacite:hasIdentifier ?tsIdentifier{ts_index}; -# a fabio:Expression. -# ''' - -# def get_text_search_on_title(self, ts_index:bool) -> str: -# return f''' -# {self.__gen_text_search(f'tsTitle{ts_index}', self.text, False, ts_index)} -# ?res dcterm:title ?tsTitle{ts_index}; -# a fabio:Expression. -# ''' - -# def get_text_search_on_person(self, role:str, ts_index:bool) -> str: -# family_name = None -# given_name = None -# name = None -# clean_test = clean_name(self.text) -# if ',' in clean_test: -# name_parts = [part.strip() for part in clean_test.split(',')] -# if name_parts: -# family_name = name_parts[0] -# if len(name_parts) == 2: -# given_name = name_parts[1] -# given_name = '. '.join(given_name.split('.')) -# given_name = ' '.join([f"{name_part.rstrip('.')}.+?" if len(name_part.rstrip('.')) == 1 else name_part for name_part in given_name.split()]) -# given_name = given_name.replace('*', '.*?') -# else: -# name = clean_test -# role = role.title() -# text_search = '' -# base_query = f''' -# ?ts{role}{ts_index} pro:isHeldBy ?ts{role}Ra{ts_index}; -# pro:withRole pro:{role.lower()}. -# ?res pro:isDocumentContextFor ?ts{role}{ts_index}; -# a fabio:Expression. -# ''' -# if name: -# base_query = f''' -# ?ts{role}Ra{ts_index} ?namePredicate '{name}'. -# VALUES (?namePredicate) {{(foaf:name) (foaf:familyName)}}''' + base_query -# else: -# if family_name and given_name: -# base_query = f''' -# ?ts{role}Ra{ts_index} foaf:familyName '{family_name}'; -# foaf:givenName ?ts{role}Gn{ts_index}. -# FILTER(REGEX(?ts{role}Gn{ts_index}, '{given_name}'))''' + base_query -# elif family_name and not given_name: -# base_query = f"?ts{role}Ra{ts_index} foaf:familyName '{family_name}'." + base_query -# elif not family_name and given_name: -# base_query = f"?ts{role}Ra{ts_index} foaf:givenName '{given_name}'." + base_query -# return text_search + base_query - -# def get_text_search_on_publisher(self, ts_index:bool) -> str: -# close_match = get_close_matches(self.text.lower(), PUBLISHERS, n=1) -# if close_match: -# publisher = clean_name(close_match[0]) -# text_search_on_publisher = f''' -# ?tsPublisherRa{ts_index} foaf:name '{publisher}'. -# ?tsPublisher{ts_index} pro:isHeldBy ?tsPublisherRa{ts_index}; -# pro:withRole pro:publisher. -# ?res pro:isDocumentContextFor ?tsPublisher{ts_index}; -# a fabio:Expression. -# ''' -# else: -# text_search_on_publisher = f''' -# {self.__gen_text_search(f'tsPublisherName{ts_index}', self.text, False, ts_index)} -# ?tsPublisherRa{ts_index} foaf:name ?tsPublisherName{ts_index}. -# ?tsPublisher{ts_index} pro:isHeldBy ?tsPublisherRa{ts_index}; -# pro:withRole pro:publisher. -# ?res pro:isDocumentContextFor ?tsPublisher{ts_index}; -# a fabio:Expression. -# ''' -# return text_search_on_publisher - -# def get_text_search_on_vi(self, vi:str, ts_index:bool) -> str: -# v_or_i = vi.title() -# return f''' -# {self.__gen_text_search(f'ts{v_or_i}Number{ts_index}', self.text, False, ts_index)} -# ?ts{v_or_i}{ts_index} fabio:hasSequenceIdentifier ?ts{v_or_i}Number{ts_index}; -# a fabio:Journal{v_or_i}. -# ?res frbr:partOf+ ?ts{v_or_i}{ts_index}; -# a fabio:Expression. -# ''' - -# def get_text_search_on_venue(self, ts_index:bool) -> str: -# return f''' -# {self.__gen_text_search(f'tsVenueTitle{ts_index}', self.text, False, ts_index)} -# ?tsVenue{ts_index} dcterm:title ?tsVenueTitle{ts_index}. -# ?res frbr:partOf+ ?tsVenue{ts_index}. -# FILTER NOT EXISTS {{?res a fabio:JournalVolume}} -# FILTER NOT EXISTS {{?res a fabio:JournalIssue}} -# ''' - -# def __gen_text_search(self, variable:str, text:str, perfect_match:bool, ts_index:int) -> str: -# if str(ts_index).startswith('0'): -# min_relevance = f"bds:minRelevance '0.6'; bds:matchAllTerms 'true'." if not perfect_match else f"bds:matchRegex '^{text}$'." -# text_search = f"?{variable} bds:search '{text}'; {min_relevance}" -# else: -# pattern = f'^{text}$' if perfect_match else text -# text_search = f"FILTER REGEX (?{variable}, '{pattern}', 'i')" -# return text_search - - -# def to_text_search(request:str, ts_index:bool) -> Tuple[str, str]: -# text_search = None -# field = request[0] -# value = request[1] -# ts = TextSearch(value) -# if field in {'editor', 'author'}: -# text_search = getattr(ts, f'get_text_search_on_person')(field, ts_index) -# elif field in {'volume', 'issue'}: -# text_search = getattr(ts, f'get_text_search_on_vi')(field, ts_index) -# else: -# text_search = getattr(ts, f'get_text_search_on_{field}')(ts_index) -# return text_search - -# def generate_text_search(text_search:str) -> str: -# requests = reorder_requests(text_search) -# text_searches = [] -# for or_request in requests: -# and_text_search = '' -# for i, and_request in enumerate(or_request): -# and_text_search += f'{to_text_search(and_request, i)}' -# text_searches.append(and_text_search) -# if len(text_searches) > 1: -# query = '{' + '} UNION {'.join(text_searches) + '}' -# elif len(text_searches) == 1: -# query = text_searches[0] -# return query, - -# def reorder_requests(text_search:str) -> list: -# preferred_order = ['id', 'editor', 'author', 'title', 'venue', 'publisher', 'volume', 'issue'] -# reordered_requests = [] -# split_by_or = text_search.split('||') -# for or_request in split_by_or: -# split_by_and = or_request.split('&&') -# parsed_and_requests = parse_requests(split_by_and) -# sorted_and_requests = sorted(parsed_and_requests, key=lambda x: preferred_order.index(x[0])) -# reordered_requests.append(sorted_and_requests) -# return reordered_requests - -# def parse_requests(requests:list) -> List[Tuple]: - # parsed_requests = list() - # for request in requests: - # field_value = re.search(r'(id|title|author|editor|publisher|venue|volume|issue)=((?:(?!&&|\|\|).)+)', request) - # field = field_value.group(1) - # value = field_value.group(2) - # parsed_requests.append((field, value)) - # if (any(field in {'volume', 'issue'} for field, _ in parsed_requests) and not any(field == 'venue' for field, _ in parsed_requests)): - # raise(ValueError('Specify the venue if you want to search a volume or an issue')) - # return parsed_requests diff --git a/src/ramose.py b/src/ramose.py deleted file mode 100644 index bc0a597..0000000 --- a/src/ramose.py +++ /dev/null @@ -1,1701 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# Copyright (c) 2020 -# Silvio Peroni -# Marilena Daquino -# -# Permission to use, copy, modify, and/or distribute this software for any purpose -# with or without fee is hereby granted, provided that the above copyright notice -# and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -# FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, -# OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS -# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -# SOFTWARE. - -# RAMOSE v1.1 -# Ivan Heibi -# [+] The preprocessing operation can output a list of values, this means Ramose will perform multiple sequential SPARQL queries (using the SPARQL query defined for that operation). -# The marge of the final result is performed by the post processing operation. (e.g., see /venue-citation-count in indexapi_v2.py) - -__author__ = 'essepuntato' - -from abc import abstractmethod -from re import search, DOTALL, findall, sub, match, split -from requests import get, post, put, delete -from csv import DictReader, reader, writer -from json import dumps -from io import StringIO -from sys import exc_info, maxsize, path -from collections import OrderedDict -from markdown import markdown -from importlib import import_module -from urllib.parse import parse_qs, urlsplit, quote, unquote -from operator import add, itemgetter, gt, eq, lt -from dateutil.parser import parse -from datetime import datetime -from isodate import parse_duration -from argparse import ArgumentParser -from os.path import abspath, dirname, basename -from os import path as pt -from os import sep, getcwd -from itertools import product -from requests import Session as _RequestsSession -_http_session = _RequestsSession() - - -# Costanti per regex -FIELD_TYPE_RE = r"([^\(\s]+)\(([^\)]+)\)" -PARAM_NAME = r"{([^{}\(\)]+)}" - - -class HashFormatHandler(object): - """This class creates an object capable to read files stored in Hash Format (see - https://github.com/opencitations/ramose#Hashformat-configuration-file). A Hash Format - file (.hf) is a specification file that includes information structured using the following - syntax: - - ``` - # - # - # - [...] - # - ```""" - - def read(self, file_path): - """This method takes in input a path of a file containing a document specified in - Hash Format, and returns its representation as list of dictionaries.""" - result = [] - - with open(file_path, "r", newline=None) as f: - first_field_name = None - cur_object = None - cur_field_name = None - cur_field_content = None - for line in f.readlines(): - cur_matching = search(r"^#([^\s]+)\s(.+)$", line, DOTALL) - if cur_matching is not None: - cur_field_name = cur_matching.group(1) - cur_field_content = cur_matching.group(2) - - # If both the name and the content are defined, continue to process - if cur_field_name and cur_field_content: - # Identify the separator key - if first_field_name is None: - first_field_name = cur_field_name - - # If the current field is equal to the separator key, - # then create a new object - if cur_field_name == first_field_name: - # If there is an already defined object, add it to the - # final result - if cur_object is not None: - result.append(cur_object) - cur_object = {} - - # Add the new key to the object - cur_object[cur_field_name] = cur_field_content - elif cur_object is not None and len(cur_object) > 0: - cur_object[cur_field_name] += line - - # Insert the last object in the result - if cur_object is not None and len(cur_object) > 0: - result.append(cur_object) - - # Clean the final \n - for item in result: - for key in item: - item[key] = item[key].rstrip() - - return result - - -class DocumentationHandler(object): - def __init__(self, api_manager): - """This class provides the main structure for returning a human-readable documentation of all - the operations described in the configuration files handled by the APIManager specified as input.""" - self.conf_doc = api_manager.all_conf - - @abstractmethod - def get_documentation(self, *args, **dargs): - """An abstract method that returns a string defining the human-readable documentation of the operations - available in the input APIManager.""" - pass - - @abstractmethod - def store_documentation(self, file_path, *args, **dargs): - """An abstract method that store in the input file path (parameter 'file_path') the human-readable - documentation of the operations available in the input APIManager.""" - pass - - @abstractmethod - def get_index(self, *args, **dargs): - """An abstract method that returns a string defining the index of all the various configuration files - handled by the input APIManager.""" - pass - - -class HTMLDocumentationHandler(DocumentationHandler): - # HTML documentation: START - def __title(self, conf): - """This method returns the title string defined in the API specification.""" - return conf["conf_json"][0]["title"] - - def __htmlmetadescription(self, conf): - """This method returns the HTML meta-description string defined in the API specification.""" - return conf["conf_json"][0]["html_meta_description"] - - def __sidebar(self, conf): - """This method builds the sidebar of the API documentation""" - result = "" - - i = conf["conf_json"][0] - result += """ - -

%s

- - """ % \ - (i["title"], "".join(["
  • %s
  • " % (op["url"], op["url"]) - for op in conf["conf_json"][1:]])) - return result - - def __header(self, conf): - """This method builds the header of the API documentation""" - result = "" - - i = conf["conf_json"][0] - result += """ - -# %s - -**Version:** %s
    -**API URL:** %s
    -**Contact:** %s
    -**License:** %s
    - - - -## Description [back to top](#toc) - -%s - -%s""" % \ - (i["title"], i["version"], i["base"] + i["url"], i["base"] + i["url"], i["contacts"], i["license"], - - i["description"], self.__parameters()) - # (i["title"], i["version"], i["base"] + i["url"], i["base"] + i["url"], i["contacts"], i["contacts"], i["license"], - # "".join(["
  • [%s](#%s): %s
  • " % (op["url"], op["url"], op["description"].split("\n")[0]) - # for op in self.conf_json[1:]]), - # i["description"], self.__parameters()) - return markdown(result) - - def __parameters(self): - result = """## Parameters [back to top](#toc) - -Parameters can be used to filter and control the results returned by the API. They are passed as normal HTTP parameters in the URL of the call. They are: - -1. `require=`: all the rows that have an empty value in the `` specified are removed from the result set - e.g. `require=given_name` removes all the rows that do not have any string specified in the `given_name` field. - -2. `filter=:`: only the rows compliant with `` are kept in the result set. The parameter `` is not mandatory. If `` is not specified, `` is interpreted as a regular expression, otherwise it is compared by means of the specified operation. Possible operators are "=", "<", and ">". For instance, `filter=title:semantics?` returns all the rows that contain the string "semantic" or "semantics" in the field `title`, while `filter=date:>2016-05` returns all the rows that have a `date` greater than May 2016. - -3. `sort=()`: sort in ascending (`` set to "asc") or descending (`` set to "desc") order the rows in the result set according to the values in ``. For instance, `sort=desc(date)` sorts all the rows according to the value specified in the field `date` in descending order. - -4. `format=`: the final table is returned in the format specified in `` that can be either "csv" or "json" - e.g. `format=csv` returns the final table in CSV format. This parameter has higher priority of the type specified through the "Accept" header of the request. Thus, if the header of a request to the API specifies `Accept: text/csv` and the URL of such request includes `format=json`, the final table is returned in JSON. - -5. `json=("",,,,...)`: in case a JSON format is requested in return, tranform each row of the final JSON table according to the rule specified. If `` is set to "array", the string value associated to the field name `` is converted into an array by splitting the various textual parts by means of ``. For instance, considering the JSON table `[ { "names": "Doe, John; Doe, Jane" }, ... ]`, the execution of `array("; ",names)` returns `[ { "names": [ "Doe, John", "Doe, Jane" ], ... ]`. Instead, if `` is set to "dict", the string value associated to the field name `` is converted into a dictionary by splitting the various textual parts by means of `` and by associating the new fields ``, ``, etc., to these new parts. For instance, considering the JSON table `[ { "name": "Doe, John" }, ... ]`, the execution of `dict(", ",name,fname,gname)` returns `[ { "name": { "fname": "Doe", "gname": "John" }, ... ]`. - -It is possible to specify one or more filtering operation of the same kind (e.g. `require=given_name&require=family_name`). In addition, these filtering operations are applied in the order presented above - first all the `require` operation, then all the `filter` operations followed by all the `sort` operation, and finally the `format` and the `json` operation (if applicable). It is worth mentioning that each of the aforementioned rules is applied in order, and it works on the structure returned after the execution of the previous rule. - -Example: `?require=doi&filter=date:>2015&sort=desc(date)`.""" - return markdown(result) - - def __operations(self, conf): - """This method returns the description of all the operations defined in the API.""" - result = """## Operations [back to top](#toc) -The operations that this API implements are: -""" - ops = "\n" - - for op in conf["conf_json"][1:]: - params = [] - for p in findall(PARAM_NAME, op["url"]): - p_type = "str" - p_shape = ".+" - if p in op: - p_type, p_shape = findall( - r"^\s*([^\(]+)\((.+)\)\s*$", op[p])[0] - - params.append( - "%s: type %s, regular expression shape %s" % (p, p_type, p_shape)) - result += "\n* [%s](#%s): %s" % (op["url"], - op["url"], op["description"].split("\n")[0]) - ops += """
    -

    %s back to operations

    - -%s - -

    Accepted HTTP method(s) %s

    -

    Parameter(s) %s

    -

    Result fields type%s

    -

    Example%s

    -

    Exemplar output (in JSON)

    -
    %s
    """ % (op["url"], op["url"], markdown(op["description"]), - ", ".join( - split(r"\s+", op["method"].strip())), "
  • ".join(params), - ", ".join(["%s (%s)" % (f, t) for t, f in - findall(FIELD_TYPE_RE, op["field_type"])]), - conf["website"] + conf["base_url"] + op["call"], op["call"], op["output_json"]) - return markdown(result) + ops - - def __footer(self): - """This method returns the footer of the API documentation.""" - result = """This API and the related documentation has been created with RAMOSE, the *Restful API Manager Over SPARQL Endpoints*, developed by Silvio Peroni and Marilena Daquino.""" - return markdown(result) - - def __css(self): - return """ - @import url('https://fonts.googleapis.com/css2?family=Karla:wght@300;400&display=swap'); - @media screen and (max-width: 850px) { - aside { display: none; } - main, #operations, .dashboard, body>footer {margin-left: 15% !important;} - #operations > ul:nth-of-type(1) li { display:block !important; max-width: 100% !important; } - h3 a[href] {display:block !important; float: none !important; font-size: 0.5em !important;} - a {overflow: hidden; text-overflow: ellipsis;} - .info_api, .api_calls {display: block !important; max-width: 100% !important;} - } - - * { - font-family: 'Karla', Geneva, sans-serif; - } - - body { - margin: 3% 15% 7% 0px; - line-height: 1.5em; - letter-spacing: 0.02em; - font-size : 1em; - font-weight:300; - color: #303030; - text-align: justify; - background-color: #edf0f2; - } - - aside { - height : 100%; - width: 20%; - position: fixed; - z-index: 1; - top: 0; - left: 0; - /*background-color: #404040;*/ - overflow-x: hidden; - background-color: white; - box-shadow:0px 10px 30px 0px rgba(133,66,189,0.1); - } - p strong { - text-transform: uppercase; - font-size: 0.9em; - } - aside h4 { - padding: 20px 9%; - margin: 0px !important; - color: #9931FC; - text-align: left !important; - } - - .sidebar_menu , .sidebar_submenu { - list-style-type: none; - padding-left:0px !important; - margin-top: 10px; - - } - - .sidebar_menu > li { - padding: 2% 0px; - border-top : solid 0.7px grey; - } - - .sidebar_menu a { - padding: 1% 9%; - background-image: none !important; - color: grey; - display: block; - } - - .sidebar_menu a:hover { - border-left: solid 5px rgba(154, 49, 252,.5); - font-weight: 400; - } - - .sidebar_submenu > li { - padding-left:0px !important; - background-color:#edf0f2; - font-size: 0.8em; - } - - main , #operations , .dashboard, body>footer { - margin-left: 33%; - } - .dashboard {text-align: center;} - main h1+p , .info_api{ - - padding-left: 3%; - font-size: 0.9em; - line-height: 1.4em; - } - - main h1+p {border-left: solid 5px rgba(154, 49, 252,.5);} - - #operations h3 { - color: #9931FC; - margin-bottom: 0px; - padding: 10px; - } - - #operations > ul:nth-of-type(1) { - padding-left: 0px !important; - text-align: center; - } - - #operations > ul:nth-of-type(1) li { - background-color: white; - text-align: left; - display: inline-block; - overflow: hidden; - text-overflow: ellipsis; - max-width: 35%; - height: 200px; - padding:4%; - margin: 1% 2% 1% 0px; - border-radius: 10px; - box-shadow: 0px 10px 30px 0px rgba(133,66,189,0.1); - vertical-align:top; - } - - #operations > div { - background-color: white; - margin-top: 20px; - padding: 2%; - border-radius: 18px; - box-shadow: 0px 10px 30px 0px rgba(133,66,189,0.1); - } - - #operations > div > * { - padding: 0px 2%; - } - - #operations > div ul, .params+ul{ - list-style-type: none; - font-size: 0.85em; - } - #operations > div ul:nth-of-type(1) li, .params+ul li { - margin: 10px 0px; - } - - #operations > div ul:nth-of-type(1) li em, .params+ul li em { - font-style: normal; - font-weight: 400; - color: #9931FC; - border-left: solid 2px #9931FC; - padding:5px; - } - - .attr { - border-top: solid 1px rgba(133,66,189,0.1); - padding: 2% !important; - display:block; - vertical-align: top; - font-size: 0.8em; - text-align: left; - } - - .attr strong { - width: 30%; - color: grey; - font-weight: 400; - font-style: normal; - display:inline-block; - vertical-align: top; - } - - .attr_val { - max-width: 50%; - display:inline-table; - height: 100%; - vertical-align: top; - } - - .method { - text-transform: uppercase; - } - - .params { - margin-bottom: 0; - } - - pre { - background-color: #f0f0f5; - padding: 10px; - margin-top: 0; - margin-bottom: 0; - border-radius: 0 0 14px 14px; - font-family: monospace !important; - overflow: scroll; - line-height: 1.2em; - height: 250px; - } - - pre code { - font-family: monospace !important; - } - - p.ex { - background-color: #f0f0f5; - margin-bottom: 0px; - padding-top: 5px; - padding-bottom: 5px; - } - - h2:first-of-type { - margin-bottom: 15px; - } - - ol:first-of-type { - margin-top: 0; - } - - :not(pre) > code { - background-color: #f0f0f5; - color: #8585ad; - padding: 0 2px 0 2px; - border-radius: 3px; - font-family : monospace; - font-size: 1.2em !important; - } - - /**:not(div) > p { - margin-left: 1.2%; - }*/ - - h1 {font-size: 2.5em;} - h1, h2 { - text-transform: uppercase; - } - - h1, h2, h3, h4, h5, h6 { - line-height: 1.2em; - padding-top:1em; - text-align: left !important; - font-weight:400; - } - - h2 ~ h2, section > h2 { - - padding-top: 5px; - margin-top: 40px; - } - - h2 a[href], h3 a[href] { - background-image: none; - text-transform:uppercase; - padding: 1px 3px 1px 3px; - font-size: 12pt; - float: right; - position:relative; - top: -3px; - } - - h2 a[href]::before , h3 a[href]::before { - content: " \u2191"; - width: 20px; - height: 20px; - display:inline-block; - color: #9931FC; - text-align:center; - margin-right: 10px; - } - - /*h3 a[href] { - color:white - background-image: none; - text-transform:uppercase; - padding: 1px 3px 1px 3px; - font-size: 8pt !important; - border: 1px solid #9931FC; - float: right; - position:relative; - top: -11px; - right: -11px; - border-radius: 0 14px 0 0; - }*/ - - p { - overflow-wrap: break-word; - word-wrap: break-word; - } - - a { - color : black; - text-decoration: none; - background-image: -webkit-gradient(linear,left top, left bottom,color-stop(50%, transparent),color-stop(0, rgba(154, 49, 252,.5))); - background-image: linear-gradient(180deg,transparent 50%,rgba(154, 49, 252,.5) 0); - background-position-y: 3px; - background-position-x: 0px; - background-repeat: no-repeat; - -webkit-transition: .15s ease; - transition: .15s ease; - } - - a:hover { - color: #282828; - background-position: top 6px right 0px; - background-image: -webkit-gradient(linear,left top, left bottom,color-stop(60%, transparent),color-stop(0, #9931FC)); - background-image: linear-gradient(180deg,transparent 60%,#9931FC 0); - } - - footer { - margin-top: 20px; - border-top: 1px solid lightgrey; - text-align: center; - color: grey; - font-size: 9pt; - } - /* dashboard */ - - .info_api { - max-width: 35%; - border-radius: 15px; - text-align: left; - vertical-align: top; - background-color: #9931FC; - color: white; - } - - .info_api, .api_calls { - display: inline-block; - text-align: left; - height: 200px; - padding:4%; - margin: 1% 2% 1% 0px; - border-radius: 10px; - box-shadow: 0px 10px 30px 0px rgba(133,66,189,0.1); - vertical-align:top; - } - - .api_calls { - max-width: 40%; - background-color: white; - scroll-behavior: smooth; - overflow: auto; - overflow-y: scroll; - scrollbar-color: #9931FC rgb(154, 49, 252); - border-radius: 10px; - } - .api_calls div {padding-bottom:2%;} - - .api_calls:hover { - overflow-y: scroll; - } - .api_calls h4, .info_api h2 {padding-top: 0px !important; margin-top: 0px !important;} - .api_calls div p { - padding: 0.2em 0.5em; - border-top: solid 1px #F8F8F8; - } - } - - .date_log , .method_log { - color: grey; - font-size: 0.8em; - - } - .method_log {margin-left: 15px;} - .date_log {display:inline-grid;} - - .group_log:nth-child(odd) { - margin-right:5px; - font-size: 0.9em; - } - - .group_log:nth-child(even) { - display: inline-grid; - vertical-align: top; - } - .status_log {padding-right:15px;} - .status_log::before { - content: ''; - display: inline-block; - width: 1em; - height: 1em; - vertical-align: middle; - -moz-border-radius: 50%; - -webkit-border-radius: 50%; - border-radius: 50%; - background-color: grey; - margin-right: 0.8em; - } - - .code_200::before { - background-color: #00cc00; - } - - .code_404::before { - background-color: #cccc00; - } - - .code_500::before { - background-color: #cc0000; - } - - """ - - def __css_path(self, css_path=None): - """Add link to a css file if specified in argument -css""" - return """""" if css_path else "" - - def logger_ramose(self): - """This method adds logging info to a local file""" - # logging - logFormatter = logging.Formatter( - "[%(asctime)s] [%(threadName)-12.12s] [%(levelname)-5.5s] %(message)s") - rootLogger = logging.getLogger() - - fileHandler = logging.FileHandler("ramose.log") - fileHandler.setFormatter(logFormatter) - rootLogger.addHandler(fileHandler) - - consoleHandler = logging.StreamHandler() - consoleHandler.setFormatter(logFormatter) - rootLogger.addHandler(consoleHandler) - - def __parse_logger_ramose(self): - """This method reads logging info stored into a local file, so as to be browsed in the dashboard. - Returns: the html including the list of URLs of current working APIs and basic logging info """ - with open("ramose.log") as l_f: - logs = ''.join(l_f.readlines()) - rev_list = set() - rev_list_add = rev_list.add - rev_list = [x for x in list(reversed(logs.splitlines())) if not ( - x in rev_list or rev_list_add(x))] - - html = """ -

    - -
    -

    API MONITORING

    """ - - for api_url, api_dict in self.conf_doc.items(): - clean_list = [ - l for l in rev_list if api_url in l and "debug" not in l] - api_logs_list = ''.join(["

    "+self.clean_log(l, api_url) - + "

    " for l in clean_list if self.clean_log(l, api_url) != '']) - api_title = api_dict["conf_json"][0]["title"] - html += """ - -
    -

    Last calls

    -
    - %s -
    - -
    - """ % (api_title, api_url, api_dict["tp"], api_logs_list) - return html - - def get_documentation(self, css_path=None, base_url=None): - """This method generates the HTML documentation of an API described in configuration file.""" - if base_url is None: - first_key = next(iter(self.conf_doc)) - conf = self.conf_doc[first_key] - else: - conf = self.conf_doc['/'+base_url] - - return 200, """ - - - %s - - - - - %s - - - -
    %s
    -
    %s
    -
    %s
    - -""" % ( - self.__title(conf), - self.__htmlmetadescription(conf), - self.__css(), - self.__css_path(css_path), - self.__sidebar(conf), - self.__header(conf), - self.__operations(conf), - self.__footer() - ) - - def get_index(self, css_path=None): - """This method generates the index of all the HTML documentations that can be - created from the configuration file.""" - - return """ - - - - - RAMOSE - - - %s - - - %s -
    %s
    - - - """ % (self.__css(), self.__css_path(css_path), self.__parse_logger_ramose(), self.__footer()) - - def store_documentation(self, file_path, css_path=None): - """This method stores the HTML documentation of an API in a file.""" - html = self.get_documentation(css_path) - with open(file_path, "w") as f: - f.write(html) - - def clean_log(self, l, api_url): - """This method parses logs lines into structured data.""" - s = l.split("- - ", 1)[1] - date = s[s.find("[")+1:s.find("]")] - method = s.split('"')[1::2][0].split()[0] - cur_call = s.split('"')[1::2][0].split()[1].strip() - status = sub(r"\D+", "", s.split('"', 2)[2]) - if cur_call != api_url+'/': - full_str = ""+status+""+""+date+"" + \ - method+""+""+cur_call+"" - else: - full_str = '' - return full_str - - -class DataType(object): - def __init__(self): - """This class implements all the possible data types that can be used within - the configuration file of RAMOSE. In particular, it provides methods for converting - a string into the related Python data type representation.""" - self.func = { - "str": DataType.str, - "int": DataType.int, - "float": DataType.float, - "duration": DataType.duration, - "datetime": DataType.datetime - } - - def get_func(self, name_str): - """This method returns the method for handling a given data type expressed as a string name.""" - return self.func.get(name_str) - - @staticmethod - def duration(s): - """This method returns the data type for durations according to the XML Schema - Recommendation (https://www.w3.org/TR/xmlschema11-2/#duration) from the input string. - In case the input string is None or it is empty, an high duration value - (i.e. 2000 years) is returned.""" - if s is None or s == "": - d = parse_duration("P2000Y") - else: - d = parse_duration(s) - - return datetime(1983, 1, 15) + d - - @staticmethod - def datetime(s): - """This method returns the data type for datetime according to the ISO 8601 - (https://en.wikipedia.org/wiki/ISO_8601) from the input string. In case the input string is None or - it is empty, a low date value (i.e. 0001-01-01) is returned.""" - default = datetime(1, 1, 1, 0, 0) - if s is None or s == "": - d = parse("0001-01-01", default=default) - else: - d = parse(s, default=default) - - return d - - @staticmethod - def str(s): - """This method returns the data type for strings. In case the input string is None, an empty string - is returned.""" - if s is None: - l = "" - else: - l = str(s).lower() - - return l - - @staticmethod - def int(s): - """This method returns the data type for integer numbers from the input string. In case the input string is - None or it is empty, a low integer value is returned.""" - if s is None or s == "": - i = -maxsize - else: - i = int(s) - - return i - - @staticmethod - def float(s): - """This method returns the data type for float numbers from the input string. In case the input string is - None or it is empty, a low float value is returned.""" - if s is None or s == "": - f = float(-maxsize) - else: - f = float(s) - - return f - - -class Operation(object): - def __init__(self, op_complete_url, op_key, i, tp, sparql_http_method, addon): - """ This class is responsible for materialising a API operation to be run against a SPARQL endpoint. - It takes in input a full URL referring to a call to an operation (parameter 'op_complete_url'), - the particular shape representing an operation (parameter 'op_key'), the definition (in JSON) of such - operation (parameter 'i'), the URL of the triplestore to contact (parameter 'tp'), the HTTP method - to use for the SPARQL request (paramenter 'sparql_http_method', set to either 'get' or 'post'), and the path - of the Python file which defines additional functions for use in the operation (parameter 'addon').""" - self.url_parsed = urlsplit(op_complete_url) - self.op_url = self.url_parsed.path - self.op = op_key - self.i = i - self.tp = tp - self.sparql_http_method = sparql_http_method - self.addon = addon - - self.operation = { - "=": eq, - "<": lt, - ">": gt - } - - self.dt = DataType() - - # START: Ancillary methods - @staticmethod - def get_content_type(ct): - """It returns the mime type of a given textual representation of a format, being it either - 'csv' or 'json.""" - content_type = ct - - if ct == "csv": - content_type = "text/csv" - elif ct == "json": - content_type = "application/json" - - return content_type - - @staticmethod - def conv(s, query_string, c_type="text/csv"): - """This method takes a string representing a CSV document and converts it in the requested format according - to what content type is specified as input.""" - - content_type = Operation.get_content_type(c_type) - - # Overrite if requesting a particular format via the URL - if "format" in query_string: - req_formats = query_string["format"] - - for req_format in req_formats: - content_type = Operation.get_content_type(req_format) - - if "application/json" in content_type: - with StringIO(s) as f: - r = [] - for i in DictReader(f): - r.append(dict(i)) - - # See if any restructuring of the final JSON is required - r = Operation.structured(query_string, r) - - return dumps(r, ensure_ascii=False, indent=4), content_type - else: - return s, content_type - - @staticmethod - def pv(i, r=None): - """This method returns the plain value of a particular item 'i' of the result returned by the SPARQL query. - - In case 'r' is specified (i.e. a row containing a set of results), then 'i' must be the index of the item - within that row.""" - if r is None: - return i[1] - else: - return Operation.pv(r[i]) - - @staticmethod - def tv(i, r=None): - """This method returns the typed value of a particular item 'i' of the result returned by the SPARQL query. - The type associated to that value is actually specified by means of the particular configuration provided - in the specification file of the API - field 'field_type'. - - In case 'r' is specified (i.e. a row containing a set of results), then 'i' must be the index of the item - within that row.""" - if r is None: - return i[0] - else: - return Operation.tv(r[i]) - - @staticmethod - def do_overlap(r1, r2): - """This method returns a boolean that says if the two ranges (i.e. two pairs of integers) passed as inputs - actually overlap one with the other.""" - r1_s, r1_e = r1 - r2_s, r2_e = r2 - - return r1_s <= r2_s <= r1_e or r2_s <= r1_s <= r2_e - - @staticmethod - def get_item_in_dict(d_or_l, key_list, prev=None): - """This method takes as input a dictionary or a list of dictionaries and browses it until the value - specified following the chain indicated in 'key_list' is not found. It returns a list of all the - values that matched with such search.""" - if prev is None: - res = [] - else: - res = prev.copy() - - if type(d_or_l) is dict: - d_list = [d_or_l] - if type(d_or_l) is list: - d_list = d_or_l - - for d in d_list: - key_list_len = len(key_list) - - if key_list_len >= 1: - key = key_list[0] - if key in d: - if key_list_len == 1: - res.append(d[key]) - else: - res = Operation.get_item_in_dict(d[key], key_list[1:], res) - - return res - - @staticmethod - def add_item_in_dict(d_or_l, key_list, item, idx): - """This method takes as input a dictionary or a list of dictionaries, browses it until the value - specified following the chain indicated in 'key_list' is not found, and then substitutes it with 'item'. - In case the final object retrieved is a list, it selects the object in position 'idx' before the - substitution.""" - key_list_len = len(key_list) - - if key_list_len >= 1: - key = key_list[0] - - if type(d_or_l) is list: - if key_list_len == 1: - d_or_l[idx][key] = item - else: - for i in d_or_l: - Operation.add_item_in_dict(i, key_list, item, idx) - else: - if key in d_or_l: - if key_list_len == 1: - d_or_l[key] = item - else: - Operation.add_item_in_dict(d_or_l[key], key_list[1:], item, idx) - - @staticmethod - def structured(params, json_table): - """This method checks if there are particular transformation rules specified in 'params' for a JSON output, - and convert each row of the input table ('json_table') according to these rules. - There are two specific rules that can be applied: - - 1. array("",): it converts the string value associated to the field name '' into - an array by splitting the various textual parts by means of ''. For instance, consider the - following JSON structure: - - [ - { "names": "Doe, John; Doe, Jane" }, - { "names": "Doe, John; Smith, John" } - ] - - Executing the rule 'array("; ",names)' returns the following new JSON structure: - - [ - { "names": [ "Doe, John", "Doe, Jane" ], - { "names": [ "Doe, John", "Smith, John" ] - ] - - 2. dict("separator",,,,...): it converts the string value associated to - the field name '' into an dictionary by splitting the various textual parts by means of - '' and by associating the new fields '', '', etc., to these new - parts. For instance, consider the following JSON structure: - - [ - { "name": "Doe, John" }, - { "name": "Smith, John" } - ] - - Executing the rule 'array(", ",name,family_name,given_name)' returns the following new JSON structure: - - [ - { "name": { "family_name": "Doe", "given_name: "John" } }, - { "name": { "family_name": "Smith", "given_name: "John" } } - ] - - Each of the specified rules is applied in order, and it works on the JSON structure returned after - the execution of the previous rule.""" - if "json" in params: - fields = params["json"] - for field in fields: - ops = findall(r'([a-z]+)\(("[^"]+"),([^\)]+)\)', field) - for op_type, s, es in ops: - separator = sub('"(.+)"', "\\1", s) - entries = [i.strip() for i in es.split(",")] - keys = entries[0].split(".") - - for row in json_table: - v_list = Operation.get_item_in_dict(row, keys) - for idx, v in enumerate(v_list): - if op_type == "array": - if type(v) is str: - Operation.add_item_in_dict(row, keys, - v.split(separator) if v != "" else [], idx) - elif op_type == "dict": - new_fields = entries[1:] - new_fields_max_split = len(new_fields) - 1 - if type(v) is str: - new_values = v.split( - separator, new_fields_max_split) - Operation.add_item_in_dict(row, keys, - dict( - zip(new_fields, new_values)) if v != "" else {}, - idx) - elif type(v) is list: - new_list = [] - for i in v: - new_values = i.split(separator, new_fields_max_split) - new_list.append(dict(zip(new_fields, new_values))) - Operation.add_item_in_dict(row, keys, new_list, idx) - - return json_table - # END: Ancillary methods - - # START: Processing methods - def preprocess(self, par_dict, op_item, addon): - """This method takes the a dictionary of parameters with the current typed values associated to them and - the item of the API specification defining the behaviour of that operation, and preprocesses the parameters - according to the functions specified in the '#preprocess' field (e.g. "#preprocess lower(doi)"), which is - applied to the specified parameters as input of the function in consideration (e.g. - "/api/v1/citations/10.1108/jd-12-2013-0166", converting the DOI in lowercase). - - It is possible to run multiple functions sequentially by concatenating them with "-->" in the API - specification document. In this case the output of the function f_i will becomes the input operation URL - of the function f_i+1. - - Finally, it is worth mentioning that all the functions specified in the "#preprocess" field must return - a tuple of values defining how the particular value passed in the dictionary must be changed.""" - result = par_dict - - if "preprocess" in op_item: - - for pre in [sub(r"\s+", "", i) for i in op_item["preprocess"].split(" --> ")]: - func_name = sub(r"^([^\(\)]+)\(.+$", r"\1", pre).strip() - params_name = sub(r"^.+\(([^\(\)]+)\).*", r"\1", pre).split(",") - - param_list = () - for param_name in params_name: - param_list += (result[param_name],) - - # run function - func = getattr(addon, func_name) - res = func(*param_list) - - # substitute res to the current parameter in result - for idx in range(len(res)): - result[params_name[idx]] = res[idx] - - return result - - def postprocess(self, res, op_item, addon): - """This method takes the result table returned by running the SPARQL query in an API operation (specified - as input) and change some of such results according to the functions specified in the '#postprocess' - field (e.g. "#postprocess remove_date("2018")"). These functions can take parameters as input, while the first - unspecified parameters will be always the result table. It is worth mentioning that this result table (i.e. - a list of tuples) actually contains, in each cell, a tuple defining the plain value as well as the typed - value for enabling better comparisons and operations if needed. An example of this table of result is shown as - follows: - - [ - ("id", "date"), - ("my_id_1", "my_id_1"), (datetime(2018, 3, 2), "2018-03-02"), - ... - ] - - Note that the typed value and the plain value of each cell can be selected by using the methods "tv" and "pv" - respectively. In addition, it is possible to run multiple functions sequentially by concatenating them - with "-->" in the API specification document. In this case the output of the function f_i will becomes - the input result table of the function f_i+1.""" - result = res - - if "postprocess" in op_item: - for post in [i.strip() for i in op_item["postprocess"].split(" --> ")]: - func_name = sub(r"^([^\(\)]+)\(.+$", r"\1", post).strip() - param_str = sub(r"^.+\(([^\(\)]*)\).*", r"\1", post) - if param_str == "": - params_values = () - else: - params_values = next(reader(param_str.splitlines(), skipinitialspace=True)) - - func = getattr(addon, func_name) - func_params = (result,) + tuple(params_values) - result, do_type_fields = func(*func_params) - if do_type_fields: - result = self.type_fields(result, op_item) - - return result - - def handling_params(self, params, table): - """This method is used for filtering the results that are returned after the post-processing - phase. In particular, it is possible to: - - 1. [require=] exclude all the rows that have an empty value in the field specified - e.g. the - "require=doi" remove all the rows that do not have any string specified in the "doi" field; - - 2. [filter=:] consider only the rows where the string in the input field - is compliant with the value specified. If no operation is specified, the value is interpreted as a - regular expression, otherwise it is compared according to the particular type associated to that field. - Possible operators are "=", "<", and ">" - e.g. "filter=title:semantics?" returns all the rows that contain - the string "semantic" or "semantics" in the field title, while "filter=date:>2016-05" returns all the rows - that have a date greater than May 2016; - - 3. [sort=()] sort all the results according to the value and type of the particular - field specified in input. It is possible to sort the rows either in ascending ("asc") or descending - ("desc") order - e.g. "sort=desc(date)" sort all the rows according to the value specified in the - field "date" in descending order. - - Note that these filtering operations are applied in the order presented above - first the "require", then - the "filter", and finally the "sort". It is possible to specify one or more filtering operation of the - same kind (e.g. "require=doi&require=title"). - """ - header = table[0] - result = table[1:] - - if "exclude" in params or "require" in params: - fields = params["exclude"] if "exclude" in params else params["require"] - for field in fields: - field_idx = header.index(field) - tmp_result = [] - for row in result: - value = Operation.pv(field_idx, row) - if value is not None and value != "": - tmp_result.append(row) - result = tmp_result - - if "filter" in params: - fields = params["filter"] - for field in fields: - field_name, field_value = field.split(":", 1) - - try: - field_idx = header.index(field_name) - flag = field_value[0] - if flag in ("<", ">", "="): - value = field_value[1:].lower() - tmp_result = [] - for row in result: - v_result = Operation.tv(field_idx, row) - v_to_compare = self.dt.get_func(type(v_result).__name__)(value) - - if self.operation[flag](v_result, v_to_compare): - tmp_result.append(row) - result = tmp_result - - else: - result = list(filter( - lambda i: search(field_value.lower(), - Operation.pv(field_idx, i).lower()), result)) - except ValueError: - pass # do nothing - - if "sort" in params: - fields = sorted(params["sort"], reverse=True) - field_names = [] - order = [] - for field in fields: - order_names = findall(r"^(desc|asc)\(([^\(\)]+)\)$", field) - if order_names: - order.append(order_names[0][0]) - field_names.append(order_names[0][1]) - else: - order.append("asc") - field_names.append(field) - - for idx in range(len(field_names)): - field_name = field_names[idx] - try: - desc_order = False - if idx < len(order): - field_order = order[idx].lower().strip() - desc_order = True if field_order == "desc" else False - - field_idx = header.index(field_name) - result = sorted(result, key=itemgetter(field_idx), reverse=desc_order) - except ValueError: - pass # do nothing - - return [header] + result - - def type_fields(self, res, op_item): - """It creates a version of the results 'res' that adds, to each value of the fields, the same value interpreted - with the type specified in the specification file (field 'field_type'). Note that 'str' is used as default in - case no further specifications are provided.""" - result = [] - cast_func = {} - header = res[0] - for heading in header: - cast_func[heading] = DataType.str - - if "field_type" in op_item: - for f, p in findall(FIELD_TYPE_RE, op_item["field_type"]): - cast_func[p] = self.dt.get_func(f) - - for row in res[1:]: - new_row = [] - for idx in range(len(header)): - heading = header[idx] - cur_value = row[idx] - if type(cur_value) is tuple: - cur_value = cur_value[1] - new_row.append((cast_func[heading](cur_value), cur_value)) - result.append(new_row) - - return [header] + result - - def remove_types(self, res): - """This method takes the results 'res' that include also the typed value and returns a version of such - results without the types that is ready to be stored on the file system.""" - result = [res[0]] - - for row in res[1:]: - result.append(tuple(Operation.pv(idx, row) for idx in range(len(row)))) - - return result - - def exec(self, method="get", content_type="application/json"): - """This method takes in input the the HTTP method to use for the call - and the content type to return, and execute the operation as indicated - in the specification file, by running (in the following order): - - 1. the methods to preprocess the query; - 2. the SPARQL query related to the operation called, by using the parameters indicated in the URL; - 3. the specification of all the types of the various rows returned; - 4. the methods to postprocess the result; - 5. the application of the filter to remove, filter, sort the result; - 6. the removal of the types added at the step 3, so as to have a data structure ready to be returned; - 7. the conversion in the format requested by the user.""" - str_method = method.lower() - m = self.i["method"].split() - - if str_method in m: - try: - par_dict = {} - par_man = match(self.op, self.op_url).groups() - for idx, par in enumerate(findall("{([^{}]+)}", self.i["url"])): - try: - par_type = self.i[par].split("(")[0] - if par_type == "str": - par_value = par_man[idx] - else: - par_value = self.dt.get_func(par_type)(par_man[idx]) - except KeyError: - par_value = par_man[idx] - par_dict[par] = par_value - - self.preprocess(par_dict, self.i, self.addon) - - # Handle in case the parameters are lists, we need to generate all possible combinations - par_dict = { p_k: [par_dict[p_k]] if not isinstance(par_dict[p_k], list) else par_dict[p_k] for p_k in par_dict } - combinations = product(*par_dict.values()) - - parameters_comb = [] - for combination in combinations: - parameters_comb.append( dict(zip(list(par_dict.keys()), list(combination))) ) - - # the __parameters_comb__ varaible is a list of dictionaries, - # each dictionary stores a possible combination of parameter values - # - # Example: {"id":"5","area":["A1","A2"]} -> [ {"id":"5","area":"A1"}, {"id":"5","area":"A2"} ] - # Example: {"id":"5","area":"A1"} -> [ {"id":"5","area":"A1"} ] - - # iterate over __parameters_comb__ - - list_of_res = [] - include_header_line = True - for par_dict in parameters_comb: - - list_of_lines = [] - query = self.i["sparql"] - for param in par_dict: - query = query.replace("[[%s]]" % - param, str(par_dict[param])) - - # GET and POST are sync - # TODO: use threads to make it parallel - - if self.sparql_http_method == "get": - r = _http_session.get(self.tp + "?query=" + quote(query), - headers={"Accept": "text/csv"}, timeout=60) - else: - r = _http_session.post(self.tp, data=query, headers={"Accept": "text/csv", - "Content-Type": "application/sparql-query"}, timeout=60) - r.encoding = "utf-8" - - sc = r.status_code - if sc == 200: - # This line has been added to avoid a strage behaviour of the 'splitlines' method in - # presence of strange characters (non-UTF8). - list_of_lines = [line.decode("utf-8") for line in r.text.encode("utf-8").splitlines()] - - else: - return sc, "HTTP status code %s: %s" % (sc, r.reason), "text/plain" - - # each res will have a list of list_of_line - # include the header of the first result only - if not include_header_line: - list_of_lines = list_of_lines[1:] - include_header_line = False - - # list_of_res Example: - # [ ["id,val","01,a","02,b"] , ["id,val","05,u","08,p"] ] - list_of_res += list_of_lines - - # - # ----- DELEGATE to POST PROCESSING operations - # return 200, "HTTP print for debug %s: %s" % (200, list_of_res), "text/plain" - - res = self.type_fields(list(reader(list_of_res)), self.i) - res = self.postprocess(res, self.i, self.addon) - q_string = parse_qs( - quote(self.url_parsed.query, safe="&=")) - res = self.handling_params(q_string, res) - res = self.remove_types(res) - s_res = StringIO() - writer(s_res).writerows(res) - return (sc,) + Operation.conv(s_res.getvalue(), q_string, content_type) - - except TimeoutError: - exc_type, exc_obj, exc_tb = exc_info() - sc = 408 - return sc, "HTTP status code %s: request timeout - %s: %s (line %s)" % \ - (sc, exc_type.__name__, exc_obj, - exc_tb.tb_lineno), "text/plain" - except TypeError: - exc_type, exc_obj, exc_tb = exc_info() - sc = 400 - return sc, "HTTP status code %s: " \ - "parameter in the request not compliant with the type specified - %s: %s (line %s)" % \ - (sc, exc_type.__name__, exc_obj, - exc_tb.tb_lineno), "text/plain" - except: - exc_type, exc_obj, exc_tb = exc_info() - sc = 500 - return sc, "HTTP status code %s: something unexpected happened - %s: %s (line %s)" % \ - (sc, exc_type.__name__, exc_obj, - exc_tb.tb_lineno), "text/plain" - else: - sc = 405 - return sc, "HTTP status code %s: '%s' method not allowed" % (sc, str_method), "text/plain" - # END: Processing methods - - -class APIManager(object): - # Fixing max size for CSV - @staticmethod - def __max_size_csv(): - from sys import maxsize - import csv - maxInt = maxsize - while True: - try: - csv.field_size_limit(maxInt) - break - except OverflowError: - maxInt = int(maxInt/10) - - # Constructor: START - def __init__(self, conf_files, endpoint_override=None): - """This is the constructor of the APIManager class. It takes in input a list of API configuration files, each - defined according to the Hash Format and following a particular structure, and stores all the operations - defined within a dictionary. Optionally, an endpoint_override parameter can be provided to override the - SPARQL endpoint defined in the configuration files (useful for staging/production environments). - The structure of each item in the dictionary of the operations is defined as follows: - - { - "/api/v1/references/(.+)": { - "sparql": "PREFIX ...", - "method": "get", - ... - }, - ... - } - - In particular, each key in the dictionary identifies the full URL of a particular API operation, and it is - used so as to understand with operation should be called once an API call is done. The object associated - as value of this key is the transformation of the related operation defined in the input Hash Format file - into a dictionary. - - In addition, it also defines additional structure, such as the functions to be used for interpreting the - values returned by a SPARQL query, some operations that can be used for filtering the results, and the - HTTP methods to call for making the request to the SPARQL endpoint specified in the configuration file.""" - APIManager.__max_size_csv() - - self.all_conf = OrderedDict() - self.base_url = [] - for conf_file in conf_files: - conf = OrderedDict() - tp = None - conf_json = HashFormatHandler().read(conf_file) - base_url = None - for item in conf_json: - if base_url is None: - base_url = item["url"] - self.base_url.append(item["url"]) - website = item["base"] - tp = endpoint_override if endpoint_override else item["endpoint"] - if "addon" in item: - addon_abspath = abspath(dirname(conf_file) + sep + item["addon"]) - path.append(dirname(addon_abspath)) - addon = import_module(basename(addon_abspath)) - sparql_http_method = "post" - if "method" in item: - sparql_http_method = item["method"].strip().lower() - else: - conf[APIManager.nor_api_url(item, base_url)] = item - - self.all_conf[base_url] = { - "conf": conf, - "tp": tp, - "conf_json": conf_json, - "base_url": base_url, - "website": website, - "addon": addon, - "sparql_http_method": sparql_http_method - } - # Constructor: END - - # START: Ancillary methods - @staticmethod - def nor_api_url(i, b=""): - """This method takes an API operation object and an optional base URL (e.g. "/api/v1") as input - and returns the URL composed by the base URL plus the API URL normalised according to specific rules. In - particular, these normalisation rules takes the operation URL (e.g. "#url /citations/{oci}") and the - specification of the shape of all the parameters between brackets in the URL (e.g. "#oci str([0-9]+-[0-9]+)"), - and returns a new operation URL where the parameters have been substituted with the regular expressions - defining them (e.g. "/citations/([0-9]+-[0-9]+)"). This URL will be used by RAMOSE for matching the - particular API calls with the specific operation to execute.""" - result = i["url"] - - for term in findall(PARAM_NAME, result): - try: - t = i[term] - except KeyError: - t = "str(.+)" - result = result.replace("{%s}" % term, "%s" % sub(r"^[^\(]+(\(.+\))$", r"\1", t)) - - return "%s%s" % (b, result) - - def best_match(self, u): - """This method takes an URL of an API call in input and find the API operation URL and the related - configuration that best match with the API call, if any.""" - #u = u.decode('UTF8') if isinstance(u, (bytes, bytearray)) else u - cur_u = sub(r"\?.*$", "", u) - result = None, None - for base_url in self.all_conf: - if u.startswith(base_url): - conf = self.all_conf[base_url] - for pat in conf["conf"]: - if match("^%s$" % pat, cur_u): - result = conf, pat - break - return result - # END: Ancillary methods - - # START: Processing methods - def get_op(self, op_complete_url): - """This method returns a new object of type Operation which represent the operation specified by - the input URL (parameter 'op_complete_url)'. In case no operation can be found according by checking - the configuration files available in the APIManager, a tuple with an HTTP error code and a message - is returned instead.""" - url_parsed = urlsplit(op_complete_url) - op_url = url_parsed.path - - conf, op = self.best_match(op_url) - if op is not None: - return Operation(op_complete_url, - op, - conf["conf"][op], - conf["tp"], - conf["sparql_http_method"], - conf["addon"]) - else: - sc = 404 - return sc, "HTTP status code %s: the operation requested does not exist" % sc, "text/plain" - # END: Processing methods - - -if __name__ == "__main__": - arg_parser = ArgumentParser("ramose.py", description="The 'Restful API Manager Over SPARQL Endpoints' (a.k.a. " - "'RAMOSE') is an application that allows one to expose a " - "Restful API interface, according to a particular " - "specification document, to interact with a SPARQL endpoint.") - - arg_parser.add_argument("-s", "--spec", dest="spec", required=True, nargs='+', - help="The file(s) in hash format containing the specification of the API(s).") - arg_parser.add_argument("-m", "--method", dest="method", default="get", - help="The method to use to make a request to the API.") - arg_parser.add_argument("-c", "--call", dest="call", - help="The URL to call for querying the API.") - arg_parser.add_argument("-f", "--format", dest="format", default="application/json", - help="The format in which to get the response.") - arg_parser.add_argument("-d", "--doc", dest="doc", default=False, action="store_true", - help="Say to generate the HTML documentation of the API (if it is specified, all " - "the arguments '-m', '-c', and '-f' won't be considered).") - arg_parser.add_argument("-o", "--output", dest="output", - help="A file where to store the response.") - arg_parser.add_argument("-w", "--webserver", dest="webserver", default=False, - help="The host:port where to deploy a Flask webserver for testing the API.") - arg_parser.add_argument("-css", "--css", dest="css", - help="The path of a .css file for styling the API documentation (to be specified either with '-w' or with '-d' and '-o' arguments).") - - args = arg_parser.parse_args() - am = APIManager(args.spec) - dh = HTMLDocumentationHandler(am) - - css_path = args.css if args.css else None - - if args.webserver: - try: - import logging - from flask import Flask, request, make_response, send_from_directory - from werkzeug.exceptions import HTTPException - - # logs - dh.logger_ramose() - - # web server - host_name = args.webserver.rsplit(':', 1)[0] if ':' in args.webserver else '127.0.0.1' - port = args.webserver.rsplit(':', 1)[1] if ':' in args.webserver else '8080' - - app = Flask(__name__) - - # This is due to Flask routing rules that do not accept URLs without the starting slash - # but ramose calls start with the slash, hence we remove it if the flag args.webserver is added - if args.call: - args.call = args.call[1:] - - # routing - @app.route('/') - def home(): - - index = dh.get_index(css_path) - return index - - @app.route('/') - # @app.route('//') - def doc(api_url): - """ APIs documentation page and operations """ - res, status = dh.get_index(css_path), 404 - if any(api_u in '/'+api_url for api_u, api_dict in am.all_conf.items()): - # documentation - if any(api_u == '/'+api_url for api_u,api_dict in am.all_conf.items()): - status, res = dh.get_documentation(css_path, api_url) - return res, status - # api calls - else: - cur_call = '/'+api_url - format = request.args.get('format') - content_type = "text/csv" if format is not None and "csv" in format else "application/json" - - op = am.get_op(cur_call+'?'+unquote(request.query_string.decode('utf8'))) - if type(op) is Operation: # Operation found - status, res, c_type = op.exec(content_type=content_type) - else: # HTTP error - status, res, c_type = op - - if status == 200: - response = make_response(res, status) - response.headers.set('Content-Type', c_type) - else: - # The API Manager returns a text/plain message when there is an error. - # Now set to return the header requested by the user - if content_type == "text/csv": - si = StringIO() - cw = writer(si) - cw.writerows([["error","message"], [str(status),str(res)]]) - response = make_response(si.getvalue(), status) - response.headers.set("Content-Disposition", "attachment", filename="error.csv") - else: - m_res = {"error": status, "message": res} - mes = dumps(m_res) - response = make_response(mes, status) - response.headers.set('Content-Type', content_type) # overwrite text/plain - - # allow CORS anyway - response.headers.set('Access-Control-Allow-Origin', '*') - response.headers.set('Access-Control-Allow-Credentials', 'true') - - return response - else: - return res, status - - app.run(host=str(host_name), debug=True, port=str(port)) - - except Exception as e: - exc_type, exc_obj, exc_tb = exc_info() - fname = pt.split(exc_tb.tb_frame.f_code.co_filename)[1] - print("[ERROR]", exc_type, fname, exc_tb.tb_lineno) - - else: - # run locally via shell - if args.doc: - res = dh.get_documentation(css_path) + ("text/html", ) - else: - op = am.get_op(args.call) - if type(op) is Operation: # Operation found - res = op.exec(args.method, args.format) - else: # HTTP error - res = op - - if args.output is None: - print("# Response HTTP code: %s\n# Body:\n%s\n# Content-type: %s" % res) - else: - with open(args.output, "w") as f: - f.write(res[1]) diff --git a/src/wl.py b/src/wl.py deleted file mode 100644 index 2e36aee..0000000 --- a/src/wl.py +++ /dev/null @@ -1,70 +0,0 @@ -# -*- coding: utf-8 -*- -# Copyright (c) 2016, Silvio Peroni -# -# Permission to use, copy, modify, and/or distribute this software for any purpose -# with or without fee is hereby granted, provided that the above copyright notice -# and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -# REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND -# FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, -# OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS -# ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -# SOFTWARE. - -__author__ = 'essepuntato' -import logging -import web -from datetime import datetime -from os import sep, path, makedirs - -class WebLogger(object): - def __init__(self, name, log_dir, list_of_web_var=[], filter_request={}): - self.l = logging.getLogger(name) - self.vars = list_of_web_var - self.filter = filter_request - - # Configure logger - self.l.setLevel(logging.INFO) - - self.log_dir = log_dir - self.month = None - - # Add a file handler if it is not set yet - self.__set_file_handler() - - def __set_file_handler(self): - cur_month = datetime.now().strftime('%Y-%m') - if self.month != cur_month: - for fh in self.l.handlers: - if isinstance(fh, logging.FileHandler): - self.l.removeHandler(fh) - - self.month = cur_month - file_path = self.log_dir + sep + "oc-" + self.month + ".txt" - if not path.exists(file_path): - file_dir = path.dirname(file_path) - if not path.exists(file_dir): - makedirs(file_dir, exist_ok=True) - open(file_path, "a").close() - - file_handler = logging.FileHandler(file_path) - log_formatter = logging.Formatter('%(asctime)s %(message)s') - file_handler.setFormatter(log_formatter) - file_handler.setLevel(logging.INFO) - self.l.addHandler(file_handler) - - def mes(self): - cur_message = "" - must_be_filtered = False - for var in self.vars: - cur_value = str(web.ctx.env.get(var)) - if var in self.filter and cur_value in self.filter[var]: - must_be_filtered = True - cur_message += "# %s: %s " % (var, cur_value) - if not must_be_filtered: - # Use the correct file handler - self.__set_file_handler() - self.l.info(cur_message) - diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 0000000..9b87bfc --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,148 @@ +import os +import subprocess +import tempfile +import time + +import pytest +import requests + +from ramose import APIManager + +# v0.5.45 +QLEVER_IMAGE = "adfreiburg/qlever@sha256:4672a53f0ff4e55ac921d25832a21ec0bb3ca08f54d7c1950d04ebf6af7b8c21" +QLEVER_CONTAINER = "oc-api-test-qlever" +QLEVER_PORT = 7011 +INDEX_NAME = "oc-index-test" +DOCKER_USER = f"{os.getuid()}:{os.getgid()}" + +# v7.2.16 +VIRTUOSO_IMAGE = "openlink/virtuoso-opensource-7@sha256:e7a5cd1915569d70d8363503dc62f6bf818b485f1501b230c7608cde8528c72d" +VIRTUOSO_CONTAINER = "oc-api-test-virtuoso" +VIRTUOSO_HTTP_PORT = 8891 +VIRTUOSO_ISQL_PORT = 1112 + +TEST_DIR = os.path.dirname(os.path.abspath(__file__)) +QLEVER_DATA_DIR = os.path.join(TEST_DIR, "qlever-index-data") +VIRTUOSO_DATA_DIR = os.path.join(TEST_DIR, "virtuoso-meta-data") +VIRTUOSO_DB_DIR = os.path.join(VIRTUOSO_DATA_DIR, "database") + + +def _wait_for_http(port: int, timeout: int = 60) -> None: + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + try: + r = requests.get(f"http://127.0.0.1:{port}", timeout=2) + if r.status_code in range(200, 500): + return + except requests.ConnectionError: + pass + time.sleep(1) + raise TimeoutError(f"Service did not become ready on port {port} within {timeout}s") + + +def _wait_for_virtuoso(container: str, timeout: int = 60) -> None: + deadline = time.monotonic() + timeout + while time.monotonic() < deadline: + result = subprocess.run( + ["docker", "exec", container, "isql", "1111", "dba", "dba", "exec=SELECT 1;"], + capture_output=True, + ) + if result.returncode == 0: + return + time.sleep(1) + raise TimeoutError(f"Virtuoso did not become ready within {timeout}s") + + +@pytest.fixture(scope="session") +def qlever_endpoint(): + subprocess.run(["docker", "rm", "-f", QLEVER_CONTAINER], capture_output=True) + subprocess.run( + [ + "docker", "run", "-d", + "--name", QLEVER_CONTAINER, + "--entrypoint", "bash", + "-u", DOCKER_USER, + "-v", f"{QLEVER_DATA_DIR}:/index:ro", + "-w", "/index", + "-p", f"{QLEVER_PORT}:{QLEVER_PORT}", + "--init", + QLEVER_IMAGE, + "-c", + f"qlever-server -i {INDEX_NAME} -j 4 -p {QLEVER_PORT} -m 1G -c 500M -e 500M -k 50 -s 30s", + ], + check=True, + capture_output=True, + ) + _wait_for_http(QLEVER_PORT) + yield f"http://127.0.0.1:{QLEVER_PORT}" + subprocess.run(["docker", "stop", QLEVER_CONTAINER], capture_output=True) + subprocess.run(["docker", "rm", "-f", QLEVER_CONTAINER], capture_output=True) + + +@pytest.fixture(scope="session") +def virtuoso_endpoint(): + subprocess.run(["docker", "rm", "-f", VIRTUOSO_CONTAINER], capture_output=True) + subprocess.run( + [ + "docker", "run", "-d", + "--name", VIRTUOSO_CONTAINER, + "-p", f"{VIRTUOSO_HTTP_PORT}:8890", + "-p", f"{VIRTUOSO_ISQL_PORT}:1111", + "-e", "DBA_PASSWORD=dba", + "-v", f"{VIRTUOSO_DB_DIR}:/opt/virtuoso-opensource/database", + VIRTUOSO_IMAGE, + ], + check=True, + capture_output=True, + ) + _wait_for_virtuoso(VIRTUOSO_CONTAINER) + yield f"http://127.0.0.1:{VIRTUOSO_HTTP_PORT}/sparql" + subprocess.run(["docker", "stop", VIRTUOSO_CONTAINER], capture_output=True) + subprocess.run(["docker", "rm", "-f", VIRTUOSO_CONTAINER], capture_output=True) + + +def normalize_citation(citation: dict[str, str]) -> dict[str, str]: + return {k: " ".join(sorted(v.split())) if k in ("citing", "cited") else v for k, v in citation.items()} + + +def normalize_citations(citations: list[dict[str, str]]) -> list[dict[str, str]]: + return sorted([normalize_citation(c) for c in citations], key=lambda x: x["oci"]) + + +def execute_operation(api_manager: APIManager, operation_url: str) -> str: + op = api_manager.get_op(operation_url) + if isinstance(op, tuple): + raise ValueError(f"Operation not found: {operation_url}") + status, result, _ = op.exec(method="get", content_type="application/json") + if status != 200: + raise RuntimeError(f"API returned status {status}: {result}") + return result + + +def create_api_manager( + config_path: str, + replacements: dict[str, str], + env_vars: dict[str, str] | None = None, +) -> APIManager: + full_config_path = os.path.join(TEST_DIR, "..", config_path) + + with open(full_config_path, "r", encoding="utf8") as f: + config_content = f.read() + + for old, new in replacements.items(): + config_content = config_content.replace(old, new) + + if env_vars: + for key, value in env_vars.items(): + os.environ[key] = value + + tmp_file = tempfile.NamedTemporaryFile( + mode="w", suffix=".hf", delete=False, dir=TEST_DIR + ) + tmp_file.write(config_content) + tmp_file.close() + + try: + return APIManager([tmp_file.name]) + finally: + os.unlink(tmp_file.name) diff --git a/test/coverage-badge.svg b/test/coverage-badge.svg index 04267f5..6ccb131 100644 --- a/test/coverage-badge.svg +++ b/test/coverage-badge.svg @@ -1,5 +1,5 @@ - - Coverage: 11% + + Coverage: 99% @@ -7,14 +7,14 @@ - + \ No newline at end of file diff --git a/test/meta_subset/output32.nq.gz b/test/meta_subset/output32.nq.gz deleted file mode 100644 index 1bf4912..0000000 Binary files a/test/meta_subset/output32.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_1.nq.gz b/test/meta_subset/output_1.nq.gz deleted file mode 100644 index 0e12854..0000000 Binary files a/test/meta_subset/output_1.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_10.nq.gz b/test/meta_subset/output_10.nq.gz deleted file mode 100644 index 3384f0a..0000000 Binary files a/test/meta_subset/output_10.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_11.nq.gz b/test/meta_subset/output_11.nq.gz deleted file mode 100644 index 83e1fec..0000000 Binary files a/test/meta_subset/output_11.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_12.nq.gz b/test/meta_subset/output_12.nq.gz deleted file mode 100644 index 97abd8d..0000000 Binary files a/test/meta_subset/output_12.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_13.nq.gz b/test/meta_subset/output_13.nq.gz deleted file mode 100644 index 7608416..0000000 Binary files a/test/meta_subset/output_13.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_14.nq.gz b/test/meta_subset/output_14.nq.gz deleted file mode 100644 index a554e1e..0000000 Binary files a/test/meta_subset/output_14.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_15.nq.gz b/test/meta_subset/output_15.nq.gz deleted file mode 100644 index 363cb15..0000000 Binary files a/test/meta_subset/output_15.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_16.nq.gz b/test/meta_subset/output_16.nq.gz deleted file mode 100644 index 688d40d..0000000 Binary files a/test/meta_subset/output_16.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_17.nq.gz b/test/meta_subset/output_17.nq.gz deleted file mode 100644 index c8dc8c5..0000000 Binary files a/test/meta_subset/output_17.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_18.nq.gz b/test/meta_subset/output_18.nq.gz deleted file mode 100644 index 4c42c6a..0000000 Binary files a/test/meta_subset/output_18.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_19.nq.gz b/test/meta_subset/output_19.nq.gz deleted file mode 100644 index f8ec966..0000000 Binary files a/test/meta_subset/output_19.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_2.nq.gz b/test/meta_subset/output_2.nq.gz deleted file mode 100644 index 7ace9ef..0000000 Binary files a/test/meta_subset/output_2.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_20.nq.gz b/test/meta_subset/output_20.nq.gz deleted file mode 100644 index 0a08bfe..0000000 Binary files a/test/meta_subset/output_20.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_21.nq.gz b/test/meta_subset/output_21.nq.gz deleted file mode 100644 index 5d028ff..0000000 Binary files a/test/meta_subset/output_21.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_22.nq.gz b/test/meta_subset/output_22.nq.gz deleted file mode 100644 index a648bf7..0000000 Binary files a/test/meta_subset/output_22.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_23.nq.gz b/test/meta_subset/output_23.nq.gz deleted file mode 100644 index 2851da7..0000000 Binary files a/test/meta_subset/output_23.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_24.nq.gz b/test/meta_subset/output_24.nq.gz deleted file mode 100644 index 8368ba9..0000000 Binary files a/test/meta_subset/output_24.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_25.nq.gz b/test/meta_subset/output_25.nq.gz deleted file mode 100644 index 17f9c10..0000000 Binary files a/test/meta_subset/output_25.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_26.nq.gz b/test/meta_subset/output_26.nq.gz deleted file mode 100644 index 93c859a..0000000 Binary files a/test/meta_subset/output_26.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_27.nq.gz b/test/meta_subset/output_27.nq.gz deleted file mode 100644 index 07e67e2..0000000 Binary files a/test/meta_subset/output_27.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_28.nq.gz b/test/meta_subset/output_28.nq.gz deleted file mode 100644 index d2bc23e..0000000 Binary files a/test/meta_subset/output_28.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_29.nq.gz b/test/meta_subset/output_29.nq.gz deleted file mode 100644 index ca6ce8e..0000000 Binary files a/test/meta_subset/output_29.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_3.nq.gz b/test/meta_subset/output_3.nq.gz deleted file mode 100644 index 6a6c0f5..0000000 Binary files a/test/meta_subset/output_3.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_30.nq.gz b/test/meta_subset/output_30.nq.gz deleted file mode 100644 index 2075a40..0000000 Binary files a/test/meta_subset/output_30.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_31.nq.gz b/test/meta_subset/output_31.nq.gz deleted file mode 100644 index 2e48b85..0000000 Binary files a/test/meta_subset/output_31.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_4.nq.gz b/test/meta_subset/output_4.nq.gz deleted file mode 100644 index de059f5..0000000 Binary files a/test/meta_subset/output_4.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_5.nq.gz b/test/meta_subset/output_5.nq.gz deleted file mode 100644 index f882467..0000000 Binary files a/test/meta_subset/output_5.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_6.nq.gz b/test/meta_subset/output_6.nq.gz deleted file mode 100644 index 5358ae8..0000000 Binary files a/test/meta_subset/output_6.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_7.nq.gz b/test/meta_subset/output_7.nq.gz deleted file mode 100644 index 7312af1..0000000 Binary files a/test/meta_subset/output_7.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_8.nq.gz b/test/meta_subset/output_8.nq.gz deleted file mode 100644 index 4f6fa4d..0000000 Binary files a/test/meta_subset/output_8.nq.gz and /dev/null differ diff --git a/test/meta_subset/output_9.nq.gz b/test/meta_subset/output_9.nq.gz deleted file mode 100644 index 1723340..0000000 Binary files a/test/meta_subset/output_9.nq.gz and /dev/null differ diff --git a/test/qlever-index-data/index_subset.nt b/test/qlever-index-data/index_subset.nt new file mode 100644 index 0000000..7377d58 --- /dev/null +++ b/test/qlever-index-data/index_subset.nt @@ -0,0 +1,208 @@ + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . diff --git a/test/qlever-index-data/oc-index-test.index-log.txt b/test/qlever-index-data/oc-index-test.index-log.txt new file mode 100644 index 0000000..db36996 --- /dev/null +++ b/test/qlever-index-data/oc-index-test.index-log.txt @@ -0,0 +1,43 @@ +2026-03-08 15:08:39.865 - INFO: QLever index builder 6168b36, compiled on Fri Mar 6 04:34:10 UTC 2026 using git hash 6168b3 +2026-03-08 15:08:39.865 - INFO: Locale was not specified in settings file, default is en_US +2026-03-08 15:08:39.865 - INFO: You specified "locale = en_US" and "ignore-punctuation = 0" +2026-03-08 15:08:39.865 - INFO: By default, integers that cannot be represented by QLever will throw an exception +2026-03-08 15:08:39.865 - WARN: Implicitly using the parallel parser for a single input file for reasons of backward compatibility; this is deprecated, please use the command-line option --parse-parallel or -p +2026-03-08 15:08:39.865 - INFO: Processing triples from single input stream /dev/stdin (parallel = true) ... +2026-03-08 15:08:39.868 - INFO: Parsing input triples and creating partial vocabularies, one per batch ... +2026-03-08 15:08:39.930 - INFO: Triples parsed: 208 [average speed 0.0 M/s] +2026-03-08 15:08:39.939 - INFO: Number of triples created (including QLever-internal ones): 208 [may contain duplicates] +2026-03-08 15:08:39.939 - INFO: Number of partial vocabularies created: 1 +2026-03-08 15:08:39.939 - INFO: Merging partial vocabularies ... +2026-03-08 15:08:39.940 - INFO: Words merged: 117 [average speed 0.3 M/s] +2026-03-08 15:08:39.942 - INFO: Finished writing compressed internal vocabulary, size = 1288 B [uncompressed = 5662 B, ratio = 22%] +2026-03-08 15:08:39.942 - INFO: Number of words in external vocabulary: 117 +2026-03-08 15:08:39.946 - INFO: Converting triples from local IDs to global IDs ... +2026-03-08 15:08:39.947 - INFO: Triples converted: 208 [average speed 0.2 M/s] +2026-03-08 15:08:39.948 - INFO: Creating permutations SPO and SOP ... +2026-03-08 15:08:39.949 - INFO: Number of inputs to `uniqueView`: 208 +2026-03-08 15:08:39.949 - INFO: Number of unique elements: 208 +2026-03-08 15:08:39.949 - INFO: Triples sorted: 208 [average speed 2.5 M/s] +2026-03-08 15:08:39.950 - INFO: Statistics for SPO: #relations = 52, #blocks = 1, #triples = 208 +2026-03-08 15:08:39.951 - INFO: Statistics for SOP: #relations = 52, #blocks = 1, #triples = 208 +2026-03-08 15:08:39.951 - INFO: Number of distinct patterns: 1 +2026-03-08 15:08:39.951 - INFO: Number of subjects with pattern: 52 [all] +2026-03-08 15:08:39.951 - INFO: Total number of distinct subject-predicate pairs: 208 +2026-03-08 15:08:39.951 - INFO: Average number of predicates per subject: 4.0 +2026-03-08 15:08:39.951 - INFO: Average number of subjects per predicate: 52 +2026-03-08 15:08:39.951 - INFO: Creating permutations OSP and OPS ... +2026-03-08 15:08:39.952 - INFO: Triples sorted: 208 [average speed 5.5 M/s] +2026-03-08 15:08:39.954 - INFO: Statistics for OSP: #relations = 56, #blocks = 1, #triples = 208 +2026-03-08 15:08:39.954 - INFO: Statistics for OPS: #relations = 56, #blocks = 1, #triples = 208 +2026-03-08 15:08:39.954 - INFO: Adding 52 triples to the POS and PSO permutation for the internal `ql:has-pattern` ... +2026-03-08 15:08:39.955 - INFO: Creating permutations PSO and POS ... +2026-03-08 15:08:39.956 - INFO: Number of inputs to `uniqueView`: 52 +2026-03-08 15:08:39.956 - INFO: Number of unique elements: 52 +2026-03-08 15:08:39.956 - INFO: Triples sorted: 52 [average speed 1.8 M/s] +2026-03-08 15:08:39.957 - INFO: Statistics for PSO: #relations = 1, #blocks = 1, #triples = 52 +2026-03-08 15:08:39.957 - INFO: Statistics for POS: #relations = 1, #blocks = 1, #triples = 52 +2026-03-08 15:08:39.957 - INFO: Creating permutations PSO and POS ... +2026-03-08 15:08:39.958 - INFO: Triples sorted: 208 [average speed 6.3 M/s] +2026-03-08 15:08:39.958 - INFO: Statistics for PSO: #relations = 4, #blocks = 1, #triples = 208 +2026-03-08 15:08:39.958 - INFO: Statistics for POS: #relations = 4, #blocks = 1, #triples = 208 +2026-03-08 15:08:39.959 - INFO: Index build completed diff --git a/test/qlever-index-data/oc-index-test.index.ops b/test/qlever-index-data/oc-index-test.index.ops new file mode 100644 index 0000000..112746a Binary files /dev/null and b/test/qlever-index-data/oc-index-test.index.ops differ diff --git a/test/qlever-index-data/oc-index-test.index.ops.meta b/test/qlever-index-data/oc-index-test.index.ops.meta new file mode 100644 index 0000000..259383a Binary files /dev/null and b/test/qlever-index-data/oc-index-test.index.ops.meta differ diff --git a/test/qlever-index-data/oc-index-test.index.osp b/test/qlever-index-data/oc-index-test.index.osp new file mode 100644 index 0000000..b42c444 Binary files /dev/null and b/test/qlever-index-data/oc-index-test.index.osp differ diff --git a/test/qlever-index-data/oc-index-test.index.osp.meta b/test/qlever-index-data/oc-index-test.index.osp.meta new file mode 100644 index 0000000..259383a Binary files /dev/null and b/test/qlever-index-data/oc-index-test.index.osp.meta differ diff --git a/test/qlever-index-data/oc-index-test.index.patterns b/test/qlever-index-data/oc-index-test.index.patterns new file mode 100644 index 0000000..c3f4013 Binary files /dev/null and b/test/qlever-index-data/oc-index-test.index.patterns differ diff --git a/test/qlever-index-data/oc-index-test.index.pos b/test/qlever-index-data/oc-index-test.index.pos new file mode 100644 index 0000000..e79ae32 Binary files /dev/null and b/test/qlever-index-data/oc-index-test.index.pos differ diff --git a/test/qlever-index-data/oc-index-test.index.pos.meta b/test/qlever-index-data/oc-index-test.index.pos.meta new file mode 100644 index 0000000..259383a Binary files /dev/null and b/test/qlever-index-data/oc-index-test.index.pos.meta differ diff --git a/test/qlever-index-data/oc-index-test.index.pso b/test/qlever-index-data/oc-index-test.index.pso new file mode 100644 index 0000000..3e3b660 Binary files /dev/null and b/test/qlever-index-data/oc-index-test.index.pso differ diff --git a/test/qlever-index-data/oc-index-test.index.pso.meta b/test/qlever-index-data/oc-index-test.index.pso.meta new file mode 100644 index 0000000..259383a Binary files /dev/null and b/test/qlever-index-data/oc-index-test.index.pso.meta differ diff --git a/test/qlever-index-data/oc-index-test.index.sop b/test/qlever-index-data/oc-index-test.index.sop new file mode 100644 index 0000000..0eb9a6d Binary files /dev/null and b/test/qlever-index-data/oc-index-test.index.sop differ diff --git a/test/qlever-index-data/oc-index-test.index.sop.meta b/test/qlever-index-data/oc-index-test.index.sop.meta new file mode 100644 index 0000000..259383a Binary files /dev/null and b/test/qlever-index-data/oc-index-test.index.sop.meta differ diff --git a/test/qlever-index-data/oc-index-test.index.spo b/test/qlever-index-data/oc-index-test.index.spo new file mode 100644 index 0000000..014fb5d Binary files /dev/null and b/test/qlever-index-data/oc-index-test.index.spo differ diff --git a/test/qlever-index-data/oc-index-test.index.spo.meta b/test/qlever-index-data/oc-index-test.index.spo.meta new file mode 100644 index 0000000..259383a Binary files /dev/null and b/test/qlever-index-data/oc-index-test.index.spo.meta differ diff --git a/test/qlever-index-data/oc-index-test.internal.index.pos b/test/qlever-index-data/oc-index-test.internal.index.pos new file mode 100644 index 0000000..aa86a39 Binary files /dev/null and b/test/qlever-index-data/oc-index-test.internal.index.pos differ diff --git a/test/qlever-index-data/oc-index-test.internal.index.pos.meta b/test/qlever-index-data/oc-index-test.internal.index.pos.meta new file mode 100644 index 0000000..259383a Binary files /dev/null and b/test/qlever-index-data/oc-index-test.internal.index.pos.meta differ diff --git a/test/qlever-index-data/oc-index-test.internal.index.pso b/test/qlever-index-data/oc-index-test.internal.index.pso new file mode 100644 index 0000000..5f62c18 Binary files /dev/null and b/test/qlever-index-data/oc-index-test.internal.index.pso differ diff --git a/test/qlever-index-data/oc-index-test.internal.index.pso.meta b/test/qlever-index-data/oc-index-test.internal.index.pso.meta new file mode 100644 index 0000000..259383a Binary files /dev/null and b/test/qlever-index-data/oc-index-test.internal.index.pso.meta differ diff --git a/test/qlever-index-data/oc-index-test.meta-data.json b/test/qlever-index-data/oc-index-test.meta-data.json new file mode 100644 index 0000000..9def301 --- /dev/null +++ b/test/qlever-index-data/oc-index-test.meta-data.json @@ -0,0 +1 @@ +{"encoded-iri-prefixes":{"prefixes-with-leading-angle-brackets":[]},"git-hash":"6168b3","has-all-permutations":true,"index-format-version":{"date":"2024-10-22","pull-request-number":1572},"locale":{"country":"US","ignore-punctuation":false,"language":"en"},"num-blank-nodes-total":0,"num-objects":{"internal":0,"normal":56},"num-predicates":{"internal":1,"normal":4},"num-subjects":{"internal":0,"normal":52},"num-triples":{"internal":52,"normal":208},"vocabulary-type":"on-disk-compressed"} \ No newline at end of file diff --git a/test/qlever-index-data/oc-index-test.settings.json b/test/qlever-index-data/oc-index-test.settings.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/test/qlever-index-data/oc-index-test.settings.json @@ -0,0 +1 @@ +{} diff --git a/test/qlever-index-data/oc-index-test.vocabulary.codebooks b/test/qlever-index-data/oc-index-test.vocabulary.codebooks new file mode 100644 index 0000000..cad691a Binary files /dev/null and b/test/qlever-index-data/oc-index-test.vocabulary.codebooks differ diff --git a/test/qlever-index-data/oc-index-test.vocabulary.words.external b/test/qlever-index-data/oc-index-test.vocabulary.words.external new file mode 100644 index 0000000..dae9603 Binary files /dev/null and b/test/qlever-index-data/oc-index-test.vocabulary.words.external differ diff --git a/test/qlever-index-data/oc-index-test.vocabulary.words.external.offsets b/test/qlever-index-data/oc-index-test.vocabulary.words.external.offsets new file mode 100644 index 0000000..d4bd65b Binary files /dev/null and b/test/qlever-index-data/oc-index-test.vocabulary.words.external.offsets differ diff --git a/test/qlever-index-data/oc-index-test.vocabulary.words.internal b/test/qlever-index-data/oc-index-test.vocabulary.words.internal new file mode 100644 index 0000000..8890115 Binary files /dev/null and b/test/qlever-index-data/oc-index-test.vocabulary.words.internal differ diff --git a/test/qlever-index-data/oc-index-test.vocabulary.words.internal.ids b/test/qlever-index-data/oc-index-test.vocabulary.words.internal.ids new file mode 100644 index 0000000..b1732a2 Binary files /dev/null and b/test/qlever-index-data/oc-index-test.vocabulary.words.internal.ids differ diff --git a/test/start_test_db.ps1 b/test/start_test_db.ps1 deleted file mode 100644 index 164aa4f..0000000 --- a/test/start_test_db.ps1 +++ /dev/null @@ -1,24 +0,0 @@ -$CONTAINER_NAME = "virtuoso-test-api" -$HTTP_PORT = "8891" -$ISQL_PORT = "1112" -$DATA_DIR = ".\test\virtuoso-test-data" -$DBA_PASSWORD = "test123" -$MEMORY = "1g" - -if (!(Test-Path $DATA_DIR)) { - New-Item -ItemType Directory -Path $DATA_DIR -Force | Out-Null -} - -& uv run virtuoso-launch ` - --name $CONTAINER_NAME ` - --http-port $HTTP_PORT ` - --isql-port $ISQL_PORT ` - --data-dir $DATA_DIR ` - --dba-password $DBA_PASSWORD ` - --memory $MEMORY ` - --mount-volume ".\test\meta_subset:/data/meta_subset" ` - --detach ` - --wait-ready ` - --force-remove - -& uv run virtuoso-bulk-load -d /data/meta_subset/ --port 1111 --docker-container virtuoso-test-api -k test123 \ No newline at end of file diff --git a/test/start_test_db.sh b/test/start_test_db.sh deleted file mode 100755 index ea048fe..0000000 --- a/test/start_test_db.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -set -e - -CONTAINER_NAME="virtuoso-test-api" -HTTP_PORT="8891" -ISQL_PORT="1112" -DATA_DIR="./test/virtuoso-test-data" -DBA_PASSWORD="test123" -MEMORY="1g" - -mkdir -p "$DATA_DIR" - -uv run virtuoso-launch \ - --name "$CONTAINER_NAME" \ - --http-port "$HTTP_PORT" \ - --isql-port "$ISQL_PORT" \ - --data-dir "$DATA_DIR" \ - --dba-password "$DBA_PASSWORD" \ - --memory "$MEMORY" \ - --mount-volume "./test/meta_subset:/data/meta_subset" \ - --detach \ - --wait-ready \ - --force-remove - -uv run virtuoso-bulk-load -d /data/meta_subset/ --port 1111 --docker-container virtuoso-test-api -k test123 \ No newline at end of file diff --git a/test/stop_test_db.ps1 b/test/stop_test_db.ps1 deleted file mode 100644 index 3d4fe33..0000000 --- a/test/stop_test_db.ps1 +++ /dev/null @@ -1,11 +0,0 @@ -$CONTAINER_NAME = "virtuoso-test-api" - -$runningContainer = docker ps -q -f name=$CONTAINER_NAME -if ($runningContainer) { - docker stop $CONTAINER_NAME -} - -$existingContainer = docker ps -aq -f name=$CONTAINER_NAME -if ($existingContainer) { - docker rm $CONTAINER_NAME -} \ No newline at end of file diff --git a/test/stop_test_db.sh b/test/stop_test_db.sh deleted file mode 100755 index 0094af5..0000000 --- a/test/stop_test_db.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -set -e - -CONTAINER_NAME="virtuoso-test-api" - -if docker ps -q -f name="$CONTAINER_NAME" | grep -q .; then - docker stop "$CONTAINER_NAME" -fi - -if docker ps -aq -f name="$CONTAINER_NAME" | grep -q .; then - docker rm "$CONTAINER_NAME" -fi \ No newline at end of file diff --git a/test/test_indexapi_v1.py b/test/test_indexapi_v1.py new file mode 100644 index 0000000..0f625b1 --- /dev/null +++ b/test/test_indexapi_v1.py @@ -0,0 +1,167 @@ +import json +from unittest.mock import patch + +import pytest +from requests import RequestException + +from conftest import create_api_manager, execute_operation, normalize_citations +from ramose import APIManager + + +@pytest.fixture(scope="session") +def api_manager(qlever_endpoint: str, virtuoso_endpoint: str) -> APIManager: + return create_api_manager("src/api/index_v1.hf", { + "#base https://api.opencitations.net/index": f"#base {qlever_endpoint}", + "#endpoint http://qlever-service.default.svc.cluster.local:7011": f"#endpoint {qlever_endpoint}", + "#addon indexapi_v1": "#addon ../src/api/indexapi_v1", + }, env_vars={ + "SPARQL_ENDPOINT_INDEX": qlever_endpoint, + "SPARQL_ENDPOINT_META": virtuoso_endpoint, + }) + + +DOI_ERRORS_DOI = "10.1007/s11192-022-04367-w" +QSS_ARTICLE_DOI = "10.1162/qss_a_00023" +ZENODO_DMP_DOI = "10.5281/zenodo.4733919" +MAIN_PAPER_DOI = "10.1162/qss_a_00292" + +EXPECTED_DOI_ERRORS_REFERENCES = [ + { + "oci": "061202127149-060504627", + "citing": DOI_ERRORS_DOI, + "cited": ZENODO_DMP_DOI, + "creation": "2022-06", + "timespan": "P0Y11M", + "journal_sc": "no", + "author_sc": "yes", + }, + { + "oci": "061202127149-062501777134", + "citing": DOI_ERRORS_DOI, + "cited": QSS_ARTICLE_DOI, + "creation": "2022-06", + "timespan": "P2Y4M", + "journal_sc": "no", + "author_sc": "yes", + }, +] + +EXPECTED_QSS_ARTICLE_CITATIONS = [ + { + "oci": "061202127149-062501777134", + "citing": DOI_ERRORS_DOI, + "cited": QSS_ARTICLE_DOI, + "creation": "2022-06", + "timespan": "P2Y4M", + "journal_sc": "no", + "author_sc": "yes", + }, + { + "oci": "062104388184-062501777134", + "citing": MAIN_PAPER_DOI, + "cited": QSS_ARTICLE_DOI, + "creation": "2024", + "timespan": "P3Y", + "journal_sc": "yes", + "author_sc": "no", + }, +] + +EXPECTED_ZENODO_DMP_CITATIONS = [ + { + "oci": "060504675-060504627", + "citing": "10.5281/zenodo.4734512", + "cited": ZENODO_DMP_DOI, + "creation": "2021-06-08", + "timespan": "-P0Y0M1D", + "journal_sc": "yes", + "author_sc": "yes", + }, + { + "oci": "061202127149-060504627", + "citing": DOI_ERRORS_DOI, + "cited": ZENODO_DMP_DOI, + "creation": "2022-06", + "timespan": "P0Y11M", + "journal_sc": "no", + "author_sc": "yes", + }, +] + + +def test_citation_by_oci(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, "/v1/citation/062104388184-062501777134")) + assert normalize_citations(result) == normalize_citations([EXPECTED_QSS_ARTICLE_CITATIONS[1]]) + + +def test_citations_by_doi(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, f"/v1/citations/{QSS_ARTICLE_DOI}")) + assert normalize_citations(result) == normalize_citations(EXPECTED_QSS_ARTICLE_CITATIONS) + + +def test_citations_negative_timespan(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, f"/v1/citations/{ZENODO_DMP_DOI}")) + assert normalize_citations(result) == normalize_citations(EXPECTED_ZENODO_DMP_CITATIONS) + + +def test_citations_no_incoming(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, "/v1/citations/10.5281/zenodo.4734512")) + assert result == [] + + +def test_citation_count(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, f"/v1/citation-count/{QSS_ARTICLE_DOI}")) + assert result == [{"count": "2"}] + + +def test_citation_count_zenodo(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, f"/v1/citation-count/{ZENODO_DMP_DOI}")) + assert result == [{"count": "2"}] + + +def test_citation_count_zero(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, f"/v1/citation-count/{DOI_ERRORS_DOI}")) + assert result == [{"count": "0"}] + + +def test_citation_count_nonexistent(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, "/v1/citation-count/10.9999/nonexistent")) + assert result == [{"count": "0"}] + + +def test_references(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, f"/v1/references/{DOI_ERRORS_DOI}")) + assert normalize_citations(result) == normalize_citations(EXPECTED_DOI_ERRORS_REFERENCES) + + +def test_references_no_outgoing(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, "/v1/references/10.3233/sw-210434")) + assert result == [] + + +def test_reference_count(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, f"/v1/reference-count/{DOI_ERRORS_DOI}")) + assert result == [{"count": "2"}] + + +def test_reference_count_zero(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, "/v1/reference-count/10.3233/sw-210434")) + assert result == [{"count": "0"}] + + +def test_citation_count_meta_sparql_failure(api_manager: APIManager) -> None: + with patch("indexapi_v1.post", side_effect=RequestException), \ + patch("indexapi_common.post", side_effect=RequestException): + result = json.loads( + execute_operation(api_manager, f"/v1/citation-count/{QSS_ARTICLE_DOI}") + ) + assert result == [{"count": "0"}] + + +def test_citations_meta_sparql_failure(api_manager: APIManager) -> None: + with patch("indexapi_v1.post", side_effect=RequestException), \ + patch("indexapi_common.post", side_effect=RequestException): + result = json.loads( + execute_operation(api_manager, f"/v1/citations/{QSS_ARTICLE_DOI}") + ) + assert result == [] diff --git a/test/test_indexapi_v2.py b/test/test_indexapi_v2.py new file mode 100644 index 0000000..c088ec2 --- /dev/null +++ b/test/test_indexapi_v2.py @@ -0,0 +1,693 @@ +import json +from unittest.mock import patch + +import pytest +from requests import RequestException + +from conftest import create_api_manager, execute_operation, normalize_citations +from ramose import APIManager + + +@pytest.fixture(scope="session") +def api_manager(qlever_endpoint: str, virtuoso_endpoint: str) -> APIManager: + return create_api_manager("src/api/index_v2.hf", { + "#base https://api.opencitations.net/index": f"#base {qlever_endpoint}", + "#endpoint http://qlever-service.default.svc.cluster.local:7011": f"#endpoint {qlever_endpoint}", + "#addon indexapi_v2": "#addon ../src/api/indexapi_v2", + }, env_vars={ + "SPARQL_ENDPOINT_INDEX": qlever_endpoint, + "SPARQL_ENDPOINT_META": virtuoso_endpoint, + }) + + +MAIN_PAPER_OMID = "omid:br/062104388184" +MAIN_PAPER_DOI = "doi:10.1162/qss_a_00292" +MAIN_PAPER_PIDS = f"{MAIN_PAPER_OMID} {MAIN_PAPER_DOI}" + +EXPECTED_CITATIONS = [ + { + "oci": "06011163661-062104388184", + "citing": "omid:br/06011163661 doi:10.1007/s00799-025-00425-9", + "cited": MAIN_PAPER_PIDS, + "creation": "2025-07-27", + "timespan": "P1Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "0607160655-062104388184", + "citing": "omid:br/0607160655 doi:10.1145/3677389.3702546", + "cited": MAIN_PAPER_PIDS, + "creation": "2024-12-16", + "timespan": "P0Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "0609955465-062104388184", + "citing": "omid:br/0609955465 doi:10.1057/s41599-025-05387-6", + "cited": MAIN_PAPER_PIDS, + "creation": "2025-07-09", + "timespan": "P1Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "06290518281-062104388184", + "citing": "omid:br/06290518281 doi:10.1007/s11192-024-05160-7", + "cited": MAIN_PAPER_PIDS, + "creation": "2024-09-28", + "timespan": "P0Y", + "journal_sc": "no", + "author_sc": "no", + }, +] + +EXPECTED_REFERENCES = [ + { + "oci": "062104388184-06103007140", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06103007140 doi:10.3233/sw-210434 openalex:W3175063576", + "creation": "2024", + "timespan": "P2Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-0610867930", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/0610867930 doi:10.1007/s41019-020-00118-0 openalex:W3023112361", + "creation": "2024", + "timespan": "P3Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-061102015064", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/061102015064 doi:10.5195/jmla.2019.650 openalex:W4236981150", + "creation": "2024", + "timespan": "P4Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-061102015169", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/061102015169 doi:10.5195/jmla.2018.280 openalex:W4243798656", + "creation": "2024", + "timespan": "P5Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-061201341000", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/061201341000 doi:10.1093/nar/gku1061 openalex:W183866246 pmid:25378340", + "creation": "2024", + "timespan": "P9Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-061302130471", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/061302130471 doi:10.1007/s11192-019-03217-6 openalex:W2938946739", + "creation": "2024", + "timespan": "P4Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-061501741757", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/061501741757 doi:10.3390/publications9010012 openalex:W3137875885", + "creation": "2024", + "timespan": "P2Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-061503029782", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/061503029782 doi:10.1080/00049670.2005.10721710 openalex:W2055380710", + "creation": "2024", + "timespan": "P18Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-061503595784", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/061503595784 doi:10.35092/yhjc.c.4586573", + "creation": "2024", + "timespan": "", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-06150878997", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06150878997 doi:10.5260/chara.18.3.25 openalex:W2799725891", + "creation": "2024", + "timespan": "P7Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-061703213020", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/061703213020 doi:10.1109/coinfo.2009.66 openalex:W3122659278", + "creation": "2024", + "timespan": "P14Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-061703367432", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/061703367432 doi:10.1145/1060745.1060835 openalex:W2152577585", + "creation": "2024", + "timespan": "P19Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-061801986475", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/061801986475 doi:10.6087/kcse.192 openalex:W3006916957", + "creation": "2024", + "timespan": "P3Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-061802636786", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/061802636786 doi:10.1007/978-3-319-11955-7_42 openalex:W403298716", + "creation": "2024", + "timespan": "P10Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-062103573093", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062103573093 doi:10.6084/m9.figshare.3443876.v7", + "creation": "2024", + "timespan": "", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-062202390183", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062202390183 doi:10.1007/978-3-319-47602-5_18 openalex:W2578379428", + "creation": "2024", + "timespan": "P8Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-062203843935", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062203843935 doi:10.7287/peerj.preprints.3469v1 doi:10.7717/peerj.4201 pmid:29312824", + "creation": "2024", + "timespan": "P6Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-062303563887", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062303563887 doi:10.25495/7gxk-rd71", + "creation": "2024", + "timespan": "", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-062501777134", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062501777134 doi:10.1162/qss_a_00023 openalex:W3106215946", + "creation": "2024", + "timespan": "P3Y", + "journal_sc": "yes", + "author_sc": "no", + }, + { + "oci": "062104388184-062501777138", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062501777138 doi:10.1162/qss_a_00022 openalex:W3002281830", + "creation": "2024", + "timespan": "P3Y", + "journal_sc": "yes", + "author_sc": "no", + }, + { + "oci": "062104388184-062502075555", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062502075555 doi:10.1108/dta-12-2018-0110 openalex:W2969235873", + "creation": "2024", + "timespan": "P4Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-062502379711", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062502379711 doi:10.1145/3183558 openalex:W2893990175", + "creation": "2024", + "timespan": "P5Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-06250648347", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06250648347 doi:10.1016/j.joi.2015.11.008 openalex:W2231201268", + "creation": "2024", + "timespan": "P7Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-062602030618", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062602030618 doi:10.1038/npre.2010.4595.1 openalex:W618057993", + "creation": "2024", + "timespan": "P13Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-062604422894", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062604422894 doi:10.23640/07243.12469094.v1", + "creation": "2024", + "timespan": "", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-062604422895", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062604422895 doi:10.48550/arxiv.1902.02534", + "creation": "2024", + "timespan": "", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-062604422896", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062604422896 doi:10.5281/zenodo.5557028", + "creation": "2024", + "timespan": "", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-062604422897", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062604422897 doi:10.48550/arxiv.2210.02534", + "creation": "2024", + "timespan": "", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-062604422898", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062604422898 doi:10.6084/m9.figshare.21747461.v3", + "creation": "2024", + "timespan": "", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-062604422899", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/062604422899 doi:10.6084/m9.figshare.21747536.v3", + "creation": "2024", + "timespan": "", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-06301298733", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06301298733 doi:10.1087/20120404 openalex:W2041971736", + "creation": "2024", + "timespan": "P11Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-06302611193", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06302611193 doi:10.1007/978-3-319-68130-6_8 openalex:W2761760240", + "creation": "2024", + "timespan": "P7Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-0630685531", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/0630685531 doi:10.1038/sdata.2016.18 openalex:W2302501749 pmid:26978244 pmid:30890711", + "creation": "2024", + "timespan": "P7Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-06320129129", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06320129129 doi:10.6084/m9.figshare.6741422.v18", + "creation": "2024", + "timespan": "", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-06401296979", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06401296979 doi:10.1007/978-3-031-06981-9_18 openalex:W4285173206", + "creation": "2024", + "timespan": "P2Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-06401334370", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06401334370 doi:10.1515/bfp-2020-2042 openalex:W3112005222", + "creation": "2024", + "timespan": "P3Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-06401935463", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06401935463 doi:10.1145/2872427.2874809 openalex:W2309189658", + "creation": "2024", + "timespan": "P7Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-06402610446", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06402610446 doi:10.1007/978-3-319-70407-4_36 openalex:W2767995756", + "creation": "2024", + "timespan": "P7Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-0641097549", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/0641097549 doi:10.48550/arxiv.2205.01833 openalex:W4229010617", + "creation": "2024", + "timespan": "", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-0650312105", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/0650312105 doi:10.2139/ssrn.1639998 openalex:W2104231400", + "creation": "2024", + "timespan": "P14Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-06603394186", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06603394186 doi:10.1145/2362499.2362502 openalex:W2054509941", + "creation": "2024", + "timespan": "P12Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-06702573854", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06702573854 doi:10.1007/978-3-319-58068-5_6 openalex:W2616601454", + "creation": "2024", + "timespan": "P7Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-06804723331", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06804723331 doi:10.18653/v1/2020.sdp-1.2", + "creation": "2024", + "timespan": "", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-06902362263", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06902362263 doi:10.1109/jcdl52503.2021.00029 openalex:W3136510568", + "creation": "2024", + "timespan": "P2Y", + "journal_sc": "no", + "author_sc": "no", + }, + { + "oci": "062104388184-06903616292", + "citing": MAIN_PAPER_PIDS, + "cited": "omid:br/06903616292 doi:10.6084/m9.figshare.6683855.v1 openalex:W3215308037", + "creation": "2024", + "timespan": "", + "journal_sc": "no", + "author_sc": "no", + }, +] + +ZENODO_DMP_OMID = "omid:br/060504627" +ZENODO_DMP_DOI = "doi:10.5281/zenodo.4733919" +ZENODO_DMP_PIDS = f"{ZENODO_DMP_OMID} {ZENODO_DMP_DOI}" + +DOI_ERRORS_OMID = "omid:br/061202127149" +DOI_ERRORS_DOI = "doi:10.1007/s11192-022-04367-w" +DOI_ERRORS_OPENALEX = "openalex:W3214893238" +DOI_ERRORS_PIDS = f"{DOI_ERRORS_OMID} {DOI_ERRORS_DOI} {DOI_ERRORS_OPENALEX}" + +ZENODO_CLEANING_OMID = "omid:br/060504675" +ZENODO_CLEANING_DOI = "doi:10.5281/zenodo.4734512" +ZENODO_CLEANING_PIDS = f"{ZENODO_CLEANING_OMID} {ZENODO_CLEANING_DOI}" + +QSS_ARTICLE_OMID = "omid:br/062501777134" +QSS_ARTICLE_DOI = "doi:10.1162/qss_a_00023" +QSS_ARTICLE_OPENALEX = "openalex:W3106215946" +QSS_ARTICLE_PIDS = f"{QSS_ARTICLE_OMID} {QSS_ARTICLE_DOI} {QSS_ARTICLE_OPENALEX}" + +QSS_CITING_OMID = "omid:br/062104388184" +QSS_CITING_DOI = "doi:10.1162/qss_a_00292" +QSS_CITING_PIDS = f"{QSS_CITING_OMID} {QSS_CITING_DOI}" + +EXPECTED_ZENODO_DMP_CITATIONS = [ + { + "oci": "061202127149-060504627", + "citing": DOI_ERRORS_PIDS, + "cited": ZENODO_DMP_PIDS, + "creation": "2022-06", + "timespan": "P0Y11M", + "journal_sc": "no", + "author_sc": "yes", + }, + { + "oci": "060504675-060504627", + "citing": ZENODO_CLEANING_PIDS, + "cited": ZENODO_DMP_PIDS, + "creation": "2021-06-08", + "timespan": "-P0Y0M1D", + "journal_sc": "yes", + "author_sc": "yes", + }, +] + +EXPECTED_QSS_ARTICLE_CITATIONS = [ + { + "oci": "062104388184-062501777134", + "citing": QSS_CITING_PIDS, + "cited": QSS_ARTICLE_PIDS, + "creation": "2024", + "timespan": "P3Y", + "journal_sc": "yes", + "author_sc": "no", + }, + { + "oci": "061202127149-062501777134", + "citing": DOI_ERRORS_PIDS, + "cited": QSS_ARTICLE_PIDS, + "creation": "2022-06", + "timespan": "P2Y4M", + "journal_sc": "no", + "author_sc": "yes", + }, +] + + +def test_citation_by_oci_outgoing(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, "/v2/citation/062104388184-06103007140")) + assert normalize_citations(result) == normalize_citations([EXPECTED_REFERENCES[0]]) + + +def test_citation_by_oci_incoming(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, "/v2/citation/06290518281-062104388184")) + assert normalize_citations(result) == normalize_citations([EXPECTED_CITATIONS[3]]) + + +def test_citations_incoming(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, f"/v2/citations/{MAIN_PAPER_OMID}")) + assert normalize_citations(result) == normalize_citations(EXPECTED_CITATIONS) + + +def test_citations_no_incoming(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, "/v2/citations/omid:br/06011163661")) + assert result == [] + + +def test_citation_count(api_manager: APIManager) -> None: + result = json.loads( + execute_operation(api_manager, f"/v2/citation-count/{MAIN_PAPER_OMID}") + ) + assert result == [{"count": "4"}] + + +def test_citation_count_zero(api_manager: APIManager) -> None: + result = json.loads( + execute_operation(api_manager, "/v2/citation-count/omid:br/06011163661") + ) + assert result == [{"count": "0"}] + + +def test_reference_count(api_manager: APIManager) -> None: + result = json.loads( + execute_operation(api_manager, f"/v2/reference-count/{MAIN_PAPER_OMID}") + ) + assert result == [{"count": "45"}] + + +def test_reference_count_zero(api_manager: APIManager) -> None: + result = json.loads( + execute_operation(api_manager, "/v2/reference-count/omid:br/06103007140") + ) + assert result == [{"count": "0"}] + + +def test_references(api_manager: APIManager) -> None: + result = json.loads( + execute_operation(api_manager, f"/v2/references/{MAIN_PAPER_OMID}") + ) + assert normalize_citations(result) == normalize_citations(EXPECTED_REFERENCES) + + +def test_references_no_outgoing(api_manager: APIManager) -> None: + result = json.loads( + execute_operation(api_manager, "/v2/references/omid:br/06103007140") + ) + assert result == [] + + +def test_citations_by_doi(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, f"/v2/citations/{MAIN_PAPER_DOI}")) + assert normalize_citations(result) == normalize_citations(EXPECTED_CITATIONS) + + +def test_references_by_doi(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, f"/v2/references/{MAIN_PAPER_DOI}")) + assert normalize_citations(result) == normalize_citations(EXPECTED_REFERENCES) + + +def test_citation_count_by_doi(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, f"/v2/citation-count/{MAIN_PAPER_DOI}")) + assert result == [{"count": "4"}] + + +def test_reference_count_by_doi(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, f"/v2/reference-count/{MAIN_PAPER_DOI}")) + assert result == [{"count": "45"}] + + +def test_citation_count_by_pmid(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, "/v2/citation-count/pmid:25378340")) + assert result == [{"count": "1"}] + + +def test_reference_count_by_pmid(api_manager: APIManager) -> None: + result = json.loads(execute_operation(api_manager, "/v2/reference-count/pmid:25378340")) + assert result == [{"count": "0"}] + + +def test_venue_citation_count(api_manager: APIManager) -> None: + result = json.loads( + execute_operation(api_manager, "/v2/venue-citation-count/issn:2641-3337") + ) + assert result == [{"count": "6"}] + + +def test_citations_negative_timespan(api_manager: APIManager) -> None: + result = json.loads( + execute_operation(api_manager, f"/v2/citations/{ZENODO_DMP_OMID}") + ) + assert normalize_citations(result) == normalize_citations( + EXPECTED_ZENODO_DMP_CITATIONS + ) + + +def test_citation_count_zenodo_dmp(api_manager: APIManager) -> None: + result = json.loads( + execute_operation(api_manager, f"/v2/citation-count/{ZENODO_DMP_OMID}") + ) + assert result == [{"count": "2"}] + + +def test_citation_count_nonexistent_doi(api_manager: APIManager) -> None: + result = json.loads( + execute_operation(api_manager, "/v2/citation-count/doi:10.9999/nonexistent") + ) + assert result == [{"count": "0"}] + + +def test_citations_with_author_sc(api_manager: APIManager) -> None: + result = json.loads( + execute_operation(api_manager, f"/v2/citations/{QSS_ARTICLE_OMID}") + ) + assert normalize_citations(result) == normalize_citations( + EXPECTED_QSS_ARTICLE_CITATIONS + ) + + +def test_citation_count_meta_anyids_failure(api_manager: APIManager) -> None: + with patch("indexapi_common.post", side_effect=RequestException): + result = json.loads( + execute_operation(api_manager, f"/v2/citation-count/{MAIN_PAPER_OMID}") + ) + assert result == [{"count": "0"}] + + +def test_citation_count_meta_sparql_failure(api_manager: APIManager) -> None: + with patch("indexapi_v2.post", side_effect=RequestException), \ + patch("indexapi_common.post", side_effect=RequestException): + result = json.loads( + execute_operation(api_manager, f"/v2/citation-count/{MAIN_PAPER_DOI}") + ) + assert result == [{"count": "0"}] + + +def test_citations_meta_sparql_failure(api_manager: APIManager) -> None: + with patch("indexapi_v2.post", side_effect=RequestException), \ + patch("indexapi_common.post", side_effect=RequestException): + result = json.loads( + execute_operation(api_manager, f"/v2/citations/{MAIN_PAPER_OMID}") + ) + assert result == [] diff --git a/test/test_metaapi.py b/test/test_metaapi.py index 4eb8236..d57f89d 100644 --- a/test/test_metaapi.py +++ b/test/test_metaapi.py @@ -1,95 +1,40 @@ import json -import os -import sys -import tempfile -from io import StringIO import pytest +from conftest import create_api_manager, execute_operation from ramose import APIManager @pytest.fixture(scope="session") -def api_manager(): - """ - Initialize the API manager once for all tests. - """ - - current_dir = os.path.dirname(os.path.abspath(__file__)) - original_config = os.path.join(current_dir, "..", "src", "api", "meta_v1.hf") - - with open(original_config, 'r', encoding='utf8') as f: - config_content = f.read() - - config_content = config_content.replace( - '#base https://api.opencitations.net/meta', - '#base http://127.0.0.1:8891' - ) - config_content = config_content.replace( - '#endpoint http://virtuoso-service.default.svc.cluster.local:8890/sparql', - '#endpoint http://127.0.0.1:8891/sparql' - ) - config_content = config_content.replace( - '#addon metaapi', - '#addon ../src/api/metaapi' - ) - - tmp_file = tempfile.NamedTemporaryFile(mode='w', suffix='.hf', delete=False, dir=current_dir) - tmp_file.write(config_content) - tmp_file.close() - tmp_config_file = tmp_file.name - - try: - return APIManager([tmp_config_file]) - finally: - os.unlink(tmp_config_file) - - -def execute_operation(api_manager, operation_url): - """ - Execute an API operation and return the output. - """ - old_stdout = sys.stdout - sys.stdout = StringIO() - op = api_manager.get_op(operation_url) - if isinstance(op, tuple): - print(f"Error: {op[1]}") - else: - status, result, _ = op.exec(method="get", content_type="application/json") - print(result) - output = sys.stdout.getvalue() - sys.stdout = old_stdout - return output - - -def normalize_string(s): - """ - Normalize Unicode characters in a string. - """ - return s.replace('‘', "'").replace('’', "'").replace('"', '"') - - -def normalize_json(json_data): - """ - Recursively normalize Unicode characters in JSON data and sort lists of objects by ID. - """ - if isinstance(json_data, dict): - return {k: normalize_json(v) for k, v in json_data.items()} - elif isinstance(json_data, list): - normalized_list = [normalize_json(item) for item in json_data] - return sorted(normalized_list, key=lambda x: x.get('id', '')) - elif isinstance(json_data, str): - return normalize_string(json_data) - else: - return json_data +def api_manager(virtuoso_endpoint: str) -> APIManager: + virtuoso_base = virtuoso_endpoint.rsplit("/", 1)[0] + return create_api_manager("src/api/meta_v1.hf", { + "#base https://api.opencitations.net/meta": f"#base {virtuoso_base}", + "#endpoint http://virtuoso-service.default.svc.cluster.local:8890/sparql": f"#endpoint {virtuoso_endpoint}", + "#addon metaapi": "#addon ../src/api/metaapi", + }) + + +def normalize_string(s: str) -> str: + return s.replace('\u2018', "'").replace('\u2019', "'").replace('\u201c', '"') + + +def normalize_result(results: list[dict[str, str]]) -> list[dict[str, str]]: + normalized = [{k: normalize_string(v) for k, v in item.items()} for item in results] + return sorted(normalized, key=lambda x: x['id']) + + +def assert_api_output(api_manager: APIManager, url: str, expected_output: list[dict[str, str]]) -> list[dict[str, str]]: + output = execute_operation(api_manager, url) + normalized_output = normalize_result(json.loads(output)) + normalized_expected = normalize_result(expected_output) + assert normalized_output == normalized_expected + return normalized_output def test_metadata_retrieval(api_manager): - """ - Test metadata retrieval for a specific DOI. - """ - output = execute_operation(api_manager, "/v1/metadata/doi:10.1002/(sici)1096-9926(199910)60:4<177::aid-tera1>3.0.co;2-z") - expected_output = [ + assert_api_output(api_manager, "/v1/metadata/doi:10.1002/(sici)1096-9926(199910)60:4<177::aid-tera1>3.0.co;2-z", [ { "id": "doi:10.1002/(sici)1096-9926(199910)60:4<177::aid-tera1>3.0.co;2-z omid:br/0601", "title": "Response To The Letter Of Hanley Et Al. ([1999] Teratology 59:323-324), Concerning The Article By Roy Et Al. ([1998] Teratology 58:62-68)", @@ -103,23 +48,12 @@ def test_metadata_retrieval(api_manager): "publisher": "Wiley [crossref:311 omid:ra/0610116001]", "editor": "" } - ] - try: - output_json = json.loads(output) - except json.JSONDecodeError: - assert False, "L'output non è un JSON valido" - normalized_output = normalize_json(output_json) - normalized_expected = normalize_json(expected_output) - assert normalized_output == normalized_expected + ]) def test_metadata_retrieval_editor_inbook(api_manager): - """ - Test metadata retrieval for a book chapter with editors. - https://github.com/opencitations/api/issues/16 - """ - output = execute_operation(api_manager, "/v1/metadata/omid:br/061702784433") - expected_output = [ + # https://github.com/opencitations/api/issues/16 + assert_api_output(api_manager, "/v1/metadata/omid:br/061702784433", [ { "id": "doi:10.1007/978-3-642-30859-8_14 openalex:W1555136325 omid:br/061702784433", "title": "Analysing Students' Use Of Recorded Lectures Through Methodological Triangulation", @@ -133,122 +67,141 @@ def test_metadata_retrieval_editor_inbook(api_manager): "publisher": "Springer Science And Business Media Llc [crossref:297 omid:ra/0610116006]", "editor": "Uden, Lorna [omid:ra/062409604521]; Corchado, Juan Manuel [orcid:0000-0002-2829-1829 omid:ra/0619011562087]; De Paz Santana, Juan F. [omid:ra/062409604522]; Prieta, Fernando De La [orcid:0000-0002-8239-5020 omid:ra/0611011366962]" } - ] - - try: - output_json = json.loads(output) - except json.JSONDecodeError: - assert False, "L'output non è un JSON valido" - normalized_output = normalize_json(output_json) - normalized_expected = normalize_json(expected_output) - assert normalized_output == normalized_expected - - -def test_author_works_retrieval(api_manager): - """ - Test retrieval of works by a specific author. - """ - output = execute_operation(api_manager, "/v1/author/orcid:0000-0002-8420-0696") - expected_output = [ - { - "id": "doi:10.5334/johd.178 omid:br/06404693975", - "title": "The Integration Of The Japan Link Center's Bibliographic Data Into OpenCitations", - "author": "Moretti, Arianna [orcid:0000-0001-5486-7070 omid:ra/061206532421]; Soricetti, Marta [orcid:0009-0008-1466-7742 omid:ra/064013186641]; Heibi, Ivan [orcid:0000-0001-5366-5194 omid:ra/063011864088]; Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Peroni, Silvio [orcid:0000-0003-0530-4305 omid:ra/0614010840729]; Rizzetto, Elia [orcid:0009-0003-7161-9310 omid:ra/064013186645]", - "pub_date": "2024", - "issue": "", - "volume": "10", - "venue": "Journal Of Open Humanities Data [issn:2059-481X openalex:S4210240912 omid:br/06160186133]", - "type": "journal article", - "page": "", - "publisher": "Ubiquity Press, Ltd. [crossref:3285 omid:ra/0610116010]", - "editor": "" - }, - { - "id": "doi:10.1007/s11192-022-04367-w openalex:W3214893238 omid:br/061202127149", - "title": "Identifying And Correcting Invalid Citations Due To DOI Errors In Crossref Data", - "author": "Cioffi, Alessia [orcid:0000-0002-9812-4065 omid:ra/061206532419]; Coppini, Sara [orcid:0000-0002-6279-3830 omid:ra/061206532420]; Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Moretti, Arianna [orcid:0000-0001-5486-7070 omid:ra/061206532421]; Peroni, Silvio [orcid:0000-0003-0530-4305 omid:ra/0614010840729]; Santini, Cristian [orcid:0000-0001-7363-6737 omid:ra/067099715]; Shahidzadeh, Nooshin [orcid:0000-0003-4114-074X omid:ra/06220110984]", - "pub_date": "2022-06", - "issue": "6", - "volume": "127", - "venue": "Scientometrics [issn:0138-9130 issn:1588-2861 openalex:S148561398 omid:br/0626055628]", - "type": "journal article", - "page": "3593-3612", - "publisher": "Springer Science And Business Media Llc [crossref:297 omid:ra/0610116006]", - "editor": "" - }, - { - "id": "doi:10.32388/x2dx81 openalex:W3153150899 omid:br/062203845802", - "title": "Review Of: \"Investigating Invalid DOIs In COCI\"", - "author": "Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]", - "pub_date": "2021-04-19", - "issue": "", - "volume": "", - "venue": "", - "type": "journal article", - "page": "", - "publisher": "Qeios Ltd [crossref:17262 omid:ra/0640115413]", - "editor": "" - }, - { - "id": "doi:10.5281/zenodo.4733920 omid:br/060504628", - "title": "Classes Of Errors In DOI Names (Data Management Plan)", - "author": "Boente, Ricarda [orcid:0000-0002-2133-8735 omid:ra/06908359558]; Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Santini, Cristian [orcid:0000-0001-7363-6737 omid:ra/067099715]; Tural, Deniz [orcid:0000-0002-6391-4198 omid:ra/06908359559]", - "pub_date": "2021-05-03", - "issue": "", - "volume": "", - "venue": "", - "type": "", - "page": "", - "publisher": "Zenodo [omid:ra/0601747332]", - "editor": "" - } - ] - try: - output_json = json.loads(output) - except json.JSONDecodeError: - assert False, "L'output non è un JSON valido" - normalized_output = normalize_json(output_json) - normalized_expected = normalize_json(expected_output) - assert normalized_output == normalized_expected - - -def test_editor_works_retrieval(api_manager): - """ - Test retrieval of works edited by a specific person. - """ - output = execute_operation(api_manager, "/v1/editor/orcid:0000-0003-2098-4759") - expected_output = [ - { - "id": "doi:10.1007/978-1-4020-9632-7 isbn:9781402096327 isbn:9789048127108 openalex:W4249829199 omid:br/0612058700", - "title": "Adaptive Environmental Management", - "author": "", - "pub_date": "2009", - "issue": "", - "volume": "", - "venue": "", - "type": "book", - "page": "", - "publisher": "Springer Science And Business Media Llc [crossref:297 omid:ra/0610116006]", - "editor": "Allan, Catherine [orcid:0000-0003-2098-4759 omid:ra/069012996]; Stankey, George H. [omid:ra/061808486861]" - } - ] - - try: - output_json = json.loads(output) - except json.JSONDecodeError: - assert False, "L'output non è un JSON valido" - normalized_output = normalize_json(output_json) - normalized_expected = normalize_json(expected_output) - assert normalized_output == normalized_expected + ]) + + +EXPECTED_AUTHOR_WORKS = [ + { + "id": "doi:10.1162/qss_a_00292 omid:br/062104388184", + "title": "OpenCitations Meta", + "author": "Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Mariani, Fabio [orcid:0000-0002-7382-0187 omid:ra/0621012370562]; Heibi, Ivan [orcid:0000-0001-5366-5194 omid:ra/0621012370563]; Peroni, Silvio [orcid:0000-0003-0530-4305 omid:ra/0621012370564]; Shotton, David [orcid:0000-0001-5506-523X omid:ra/0621012370565]", + "pub_date": "2024", + "issue": "1", + "volume": "5", + "venue": "Quantitative Science Studies [issn:2641-3337 openalex:S4210195326 omid:br/062501778099]", + "type": "journal article", + "page": "50-75", + "publisher": "Mit Press [crossref:281 omid:ra/0610116105]", + "editor": "" + }, + { + "id": "doi:10.5334/johd.178 omid:br/06404693975", + "title": "The Integration Of The Japan Link Center's Bibliographic Data Into OpenCitations", + "author": "Moretti, Arianna [orcid:0000-0001-5486-7070 omid:ra/061206532421]; Soricetti, Marta [orcid:0009-0008-1466-7742 omid:ra/064013186641]; Heibi, Ivan [orcid:0000-0001-5366-5194 omid:ra/063011864088]; Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Peroni, Silvio [orcid:0000-0003-0530-4305 omid:ra/0614010840729]; Rizzetto, Elia [orcid:0009-0003-7161-9310 omid:ra/064013186645]", + "pub_date": "2024", + "issue": "", + "volume": "10", + "venue": "Journal Of Open Humanities Data [issn:2059-481X openalex:S4210240912 omid:br/06160186133]", + "type": "journal article", + "page": "", + "publisher": "Ubiquity Press, Ltd. [crossref:3285 omid:ra/0610116010]", + "editor": "" + }, + { + "id": "doi:10.1007/s11192-022-04367-w openalex:W3214893238 omid:br/061202127149", + "title": "Identifying And Correcting Invalid Citations Due To DOI Errors In Crossref Data", + "author": "Cioffi, Alessia [orcid:0000-0002-9812-4065 omid:ra/061206532419]; Coppini, Sara [orcid:0000-0002-6279-3830 omid:ra/061206532420]; Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Moretti, Arianna [orcid:0000-0001-5486-7070 omid:ra/061206532421]; Peroni, Silvio [orcid:0000-0003-0530-4305 omid:ra/0614010840729]; Santini, Cristian [orcid:0000-0001-7363-6737 omid:ra/067099715]; Shahidzadeh, Nooshin [orcid:0000-0003-4114-074X omid:ra/06220110984]", + "pub_date": "2022-06", + "issue": "6", + "volume": "127", + "venue": "Scientometrics [issn:0138-9130 issn:1588-2861 openalex:S148561398 omid:br/0626055628]", + "type": "journal article", + "page": "3593-3612", + "publisher": "Springer Science And Business Media Llc [crossref:297 omid:ra/0610116006]", + "editor": "" + }, + { + "id": "doi:10.32388/x2dx81 openalex:W3153150899 omid:br/062203845802", + "title": "Review Of: \"Investigating Invalid DOIs In COCI\"", + "author": "Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]", + "pub_date": "2021-04-19", + "issue": "", + "volume": "", + "venue": "", + "type": "journal article", + "page": "", + "publisher": "Qeios Ltd [crossref:17262 omid:ra/0640115413]", + "editor": "" + }, + { + "id": "doi:10.5281/zenodo.4733919 omid:br/060504627", + "title": "Classes Of Errors In DOI Names (Data Management Plan)", + "author": "Boente, Ricarda [orcid:0000-0002-2133-8735 omid:ra/06908359558]; Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Santini, Cristian [orcid:0000-0001-7363-6737 omid:ra/067099715]; Tural, Deniz [orcid:0000-0002-6391-4198 omid:ra/06908359559]", + "pub_date": "2021-06-09", + "issue": "", + "volume": "", + "venue": "", + "type": "", + "page": "", + "publisher": "Zenodo [omid:ra/0601747331]", + "editor": "" + }, + { + "id": "doi:10.5281/zenodo.4733920 omid:br/060504628", + "title": "Classes Of Errors In DOI Names (Data Management Plan)", + "author": "Boente, Ricarda [orcid:0000-0002-2133-8735 omid:ra/06908359558]; Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Santini, Cristian [orcid:0000-0001-7363-6737 omid:ra/067099715]; Tural, Deniz [orcid:0000-0002-6391-4198 omid:ra/06908359559]", + "pub_date": "2021-05-03", + "issue": "", + "volume": "", + "venue": "", + "type": "", + "page": "", + "publisher": "Zenodo [omid:ra/0601747332]", + "editor": "" + }, + { + "id": "doi:10.5281/zenodo.4734512 omid:br/060504675", + "title": "Cleaning Different Types Of DOI Errors Found In Cited References On Crossref Using Automated Methods", + "author": "Boente, Ricarda [orcid:0000-0002-2133-8735 omid:ra/06908359558]; Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Santini, Cristian [orcid:0000-0001-7363-6737 omid:ra/067099715]; Tural, Deniz [orcid:0000-0002-6391-4198 omid:ra/06908359559]", + "pub_date": "2021-06-08", + "issue": "", + "volume": "", + "venue": "", + "type": "report", + "page": "", + "publisher": "Zenodo [omid:ra/0601747492]", + "editor": "" + } +] + +EXPECTED_EDITOR_WORKS = [ + { + "id": "doi:10.1007/978-1-4020-9632-7 isbn:9781402096327 isbn:9789048127108 openalex:W4249829199 omid:br/0612058700", + "title": "Adaptive Environmental Management", + "author": "", + "pub_date": "2009", + "issue": "", + "volume": "", + "venue": "", + "type": "book", + "page": "", + "publisher": "Springer Science And Business Media Llc [crossref:297 omid:ra/0610116006]", + "editor": "Allan, Catherine [orcid:0000-0003-2098-4759 omid:ra/069012996]; Stankey, George H. [omid:ra/061808486861]" + } +] + + +@pytest.mark.parametrize("identifier", [ + "orcid:0000-0002-8420-0696", + "omid:ra/06250110138", + "0000-0002-8420-0696", +]) +def test_author_works_retrieval(api_manager, identifier): + assert_api_output(api_manager, f"/v1/author/{identifier}", EXPECTED_AUTHOR_WORKS) + + +@pytest.mark.parametrize("identifier", [ + "orcid:0000-0003-2098-4759", + "omid:ra/069012996", + "0000-0003-2098-4759", +]) +def test_editor_works_retrieval(api_manager, identifier): + assert_api_output(api_manager, f"/v1/editor/{identifier}", EXPECTED_EDITOR_WORKS) def test_venue_without_external_id(api_manager): - """ - Test venue handling when external ID is missing. - https://github.com/opencitations/api/issues/15 - """ - output = execute_operation(api_manager, "/v1/metadata/omid:br/061903571196") - expected_output = [ + # https://github.com/opencitations/api/issues/15 + normalized_output = assert_api_output(api_manager, "/v1/metadata/omid:br/061903571196", [ { "id": "doi:10.36106/gjra/9300981 openalex:W4306682982 omid:br/061903571196", "title": "Lung Cavitation: An Unwanted Complication Of Covid-19 Lung Disease", @@ -262,39 +215,24 @@ def test_venue_without_external_id(api_manager): "publisher": "World Wide Journals [crossref:21849 omid:ra/0640115418]", "editor": "" } - ] - try: - output_json = json.loads(output) - except json.JSONDecodeError: - assert False, "The output is not valid JSON" - normalized_output = normalize_json(output_json) - normalized_expected = normalize_json(expected_output) - assert normalized_output == normalized_expected - assert "omid:" in normalized_output[0]["venue"], "The venue field should contain an OMID" + ]) + assert "omid:" in normalized_output[0]["venue"] def test_metadata_retrieval_with_different_ids(api_manager): - """ - Test metadata retrieval using different types of identifiers. - https://github.com/opencitations/api/issues/14 - """ + # https://github.com/opencitations/api/issues/14 output_omid = execute_operation(api_manager, "/v1/metadata/omid:br/06603870331") - json_omid = json.loads(output_omid) - output_isbn = execute_operation(api_manager, "/v1/metadata/isbn:9789264960114") - json_isbn = json.loads(output_isbn) - output_doi = execute_operation(api_manager, "/v1/metadata/doi:10.1787/b0e499cf-en") - json_doi = json.loads(output_doi) - - normalized_omid = normalize_json(json_omid) - normalized_isbn = normalize_json(json_isbn) - normalized_doi = normalize_json(json_doi) - + + normalized_omid = normalize_result(json.loads(output_omid)) + normalized_isbn = normalize_result(json.loads(output_isbn)) + normalized_doi = normalize_result(json.loads(output_doi)) + assert len(normalized_omid) == 1 assert len(normalized_isbn) == 1 assert len(normalized_doi) == 1 - + expected_ids = [ 'doi:10.1787/b0e499cf-en', 'isbn:9789264597587', @@ -304,11 +242,11 @@ def test_metadata_retrieval_with_different_ids(api_manager): 'openalex:W4221051054', 'omid:br/06603870331' ] - + omid_ids = normalized_omid[0]['id'].split() for expected_id in expected_ids: assert expected_id in omid_ids - + isbn_ids = normalized_isbn[0]['id'].split() for expected_id in expected_ids: assert expected_id in isbn_ids @@ -316,11 +254,11 @@ def test_metadata_retrieval_with_different_ids(api_manager): doi_ids = normalized_doi[0]['id'].split() for expected_id in expected_ids: assert expected_id in doi_ids - + assert len(omid_ids) == len(expected_ids) assert len(isbn_ids) == len(expected_ids) assert len(doi_ids) == len(expected_ids) - + fields_to_check = ['title', 'author', 'pub_date', 'venue', 'publisher', 'type', 'issue', 'volume', 'page', 'editor'] for field in fields_to_check: assert normalized_omid[0][field] == normalized_isbn[0][field] @@ -335,14 +273,10 @@ def test_metadata_retrieval_with_different_ids(api_manager): def test_author_order_in_metadata(api_manager): - """ - Test that author order is preserved in metadata. - https://github.com/opencitations/api/issues/13 - """ - output = execute_operation(api_manager, "/v1/metadata/omid:br/0680773548") - expected_output = [ + # https://github.com/opencitations/api/issues/13 + normalized_output = assert_api_output(api_manager, "/v1/metadata/omid:br/0680773548", [ { - "author": "Bilgin, Hülya [orcid:0000-0001-6639-5533 omid:ra/0622032021]; Bozkurt, Merlin [omid:ra/06802276621]; Yilmazlar, Selçuk [omid:ra/06802276622]; Korfali, Gülsen [omid:ra/06802276623]", + "author": "Bilgin, H\u00fclya [orcid:0000-0001-6639-5533 omid:ra/0622032021]; Bozkurt, Merlin [omid:ra/06802276621]; Yilmazlar, Sel\u00e7uk [omid:ra/06802276622]; Korfali, G\u00fclsen [omid:ra/06802276623]", "issue": "3", "editor": "", "pub_date": "2006-05", @@ -354,223 +288,10 @@ def test_author_order_in_metadata(api_manager): "type": "journal article", "venue": "Journal Of Clinical Anesthesia [issn:0952-8180 openalex:S155967237 omid:br/0621013884]" } - ] - - try: - output_json = json.loads(output) - except json.JSONDecodeError: - assert False, "The output is not valid JSON" - - normalized_output = normalize_json(output_json) - normalized_expected = normalize_json(expected_output) - - assert normalized_output == normalized_expected - - authors = normalized_output[0]['author'].split('; ') - expected_author_order = [ - "Bilgin, Hülya [orcid:0000-0001-6639-5533 omid:ra/0622032021]", + ]) + assert normalized_output[0]['author'].split('; ') == [ + "Bilgin, H\u00fclya [orcid:0000-0001-6639-5533 omid:ra/0622032021]", "Bozkurt, Merlin [omid:ra/06802276621]", - "Yilmazlar, Selçuk [omid:ra/06802276622]", - "Korfali, Gülsen [omid:ra/06802276623]" - ] - assert authors == expected_author_order - - -def test_author_works_retrieval_with_omid(api_manager): - """ - Test retrieval of works by a specific author using OMID identifier. - This tests the OMID scheme handling in generate_ra_search function. - """ - output = execute_operation(api_manager, "/v1/author/omid:ra/06250110138") - expected_output = [ - { - "id": "doi:10.5334/johd.178 omid:br/06404693975", - "title": "The Integration Of The Japan Link Center's Bibliographic Data Into OpenCitations", - "author": "Moretti, Arianna [orcid:0000-0001-5486-7070 omid:ra/061206532421]; Soricetti, Marta [orcid:0009-0008-1466-7742 omid:ra/064013186641]; Heibi, Ivan [orcid:0000-0001-5366-5194 omid:ra/063011864088]; Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Peroni, Silvio [orcid:0000-0003-0530-4305 omid:ra/0614010840729]; Rizzetto, Elia [orcid:0009-0003-7161-9310 omid:ra/064013186645]", - "pub_date": "2024", - "issue": "", - "volume": "10", - "venue": "Journal Of Open Humanities Data [issn:2059-481X openalex:S4210240912 omid:br/06160186133]", - "type": "journal article", - "page": "", - "publisher": "Ubiquity Press, Ltd. [crossref:3285 omid:ra/0610116010]", - "editor": "" - }, - { - "id": "doi:10.1007/s11192-022-04367-w openalex:W3214893238 omid:br/061202127149", - "title": "Identifying And Correcting Invalid Citations Due To DOI Errors In Crossref Data", - "author": "Cioffi, Alessia [orcid:0000-0002-9812-4065 omid:ra/061206532419]; Coppini, Sara [orcid:0000-0002-6279-3830 omid:ra/061206532420]; Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Moretti, Arianna [orcid:0000-0001-5486-7070 omid:ra/061206532421]; Peroni, Silvio [orcid:0000-0003-0530-4305 omid:ra/0614010840729]; Santini, Cristian [orcid:0000-0001-7363-6737 omid:ra/067099715]; Shahidzadeh, Nooshin [orcid:0000-0003-4114-074X omid:ra/06220110984]", - "pub_date": "2022-06", - "issue": "6", - "volume": "127", - "venue": "Scientometrics [issn:0138-9130 issn:1588-2861 openalex:S148561398 omid:br/0626055628]", - "type": "journal article", - "page": "3593-3612", - "publisher": "Springer Science And Business Media Llc [crossref:297 omid:ra/0610116006]", - "editor": "" - }, - { - "id": "doi:10.32388/x2dx81 openalex:W3153150899 omid:br/062203845802", - "title": "Review Of: \"Investigating Invalid DOIs In COCI\"", - "author": "Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]", - "pub_date": "2021-04-19", - "issue": "", - "volume": "", - "venue": "", - "type": "journal article", - "page": "", - "publisher": "Qeios Ltd [crossref:17262 omid:ra/0640115413]", - "editor": "" - }, - { - "id": "doi:10.5281/zenodo.4733920 omid:br/060504628", - "title": "Classes Of Errors In DOI Names (Data Management Plan)", - "author": "Boente, Ricarda [orcid:0000-0002-2133-8735 omid:ra/06908359558]; Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Santini, Cristian [orcid:0000-0001-7363-6737 omid:ra/067099715]; Tural, Deniz [orcid:0000-0002-6391-4198 omid:ra/06908359559]", - "pub_date": "2021-05-03", - "issue": "", - "volume": "", - "venue": "", - "type": "", - "page": "", - "publisher": "Zenodo [omid:ra/0601747332]", - "editor": "" - } - ] - try: - output_json = json.loads(output) - except json.JSONDecodeError: - assert False, "The output is not valid JSON" - normalized_output = normalize_json(output_json) - normalized_expected = normalize_json(expected_output) - assert normalized_output == normalized_expected - - -def test_editor_works_retrieval_with_omid(api_manager): - """ - Test retrieval of works edited by a specific person using OMID identifier. - This tests the OMID scheme handling in generate_ra_search function for editors. - """ - output = execute_operation(api_manager, "/v1/editor/omid:ra/069012996") - expected_output = [ - { - "id": "doi:10.1007/978-1-4020-9632-7 isbn:9781402096327 isbn:9789048127108 openalex:W4249829199 omid:br/0612058700", - "title": "Adaptive Environmental Management", - "author": "", - "pub_date": "2009", - "issue": "", - "volume": "", - "venue": "", - "type": "book", - "page": "", - "publisher": "Springer Science And Business Media Llc [crossref:297 omid:ra/0610116006]", - "editor": "Allan, Catherine [orcid:0000-0003-2098-4759 omid:ra/069012996]; Stankey, George H. [omid:ra/061808486861]" - } - ] - - try: - output_json = json.loads(output) - except json.JSONDecodeError: - assert False, "The output is not valid JSON" - normalized_output = normalize_json(output_json) - normalized_expected = normalize_json(expected_output) - assert normalized_output == normalized_expected - - -def test_author_works_retrieval_without_scheme_prefix(api_manager): - """ - Test retrieval of works by a specific author using identifier without scheme prefix. - This tests the default ORCID scheme fallback in generate_ra_search function. - """ - output = execute_operation(api_manager, "/v1/author/0000-0002-8420-0696") - expected_output = [ - { - "id": "doi:10.5334/johd.178 omid:br/06404693975", - "title": "The Integration Of The Japan Link Center's Bibliographic Data Into OpenCitations", - "author": "Moretti, Arianna [orcid:0000-0001-5486-7070 omid:ra/061206532421]; Soricetti, Marta [orcid:0009-0008-1466-7742 omid:ra/064013186641]; Heibi, Ivan [orcid:0000-0001-5366-5194 omid:ra/063011864088]; Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Peroni, Silvio [orcid:0000-0003-0530-4305 omid:ra/0614010840729]; Rizzetto, Elia [orcid:0009-0003-7161-9310 omid:ra/064013186645]", - "pub_date": "2024", - "issue": "", - "volume": "10", - "venue": "Journal Of Open Humanities Data [issn:2059-481X openalex:S4210240912 omid:br/06160186133]", - "type": "journal article", - "page": "", - "publisher": "Ubiquity Press, Ltd. [crossref:3285 omid:ra/0610116010]", - "editor": "" - }, - { - "id": "doi:10.1007/s11192-022-04367-w openalex:W3214893238 omid:br/061202127149", - "title": "Identifying And Correcting Invalid Citations Due To DOI Errors In Crossref Data", - "author": "Cioffi, Alessia [orcid:0000-0002-9812-4065 omid:ra/061206532419]; Coppini, Sara [orcid:0000-0002-6279-3830 omid:ra/061206532420]; Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Moretti, Arianna [orcid:0000-0001-5486-7070 omid:ra/061206532421]; Peroni, Silvio [orcid:0000-0003-0530-4305 omid:ra/0614010840729]; Santini, Cristian [orcid:0000-0001-7363-6737 omid:ra/067099715]; Shahidzadeh, Nooshin [orcid:0000-0003-4114-074X omid:ra/06220110984]", - "pub_date": "2022-06", - "issue": "6", - "volume": "127", - "venue": "Scientometrics [issn:0138-9130 issn:1588-2861 openalex:S148561398 omid:br/0626055628]", - "type": "journal article", - "page": "3593-3612", - "publisher": "Springer Science And Business Media Llc [crossref:297 omid:ra/0610116006]", - "editor": "" - }, - { - "id": "doi:10.32388/x2dx81 openalex:W3153150899 omid:br/062203845802", - "title": "Review Of: \"Investigating Invalid DOIs In COCI\"", - "author": "Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]", - "pub_date": "2021-04-19", - "issue": "", - "volume": "", - "venue": "", - "type": "journal article", - "page": "", - "publisher": "Qeios Ltd [crossref:17262 omid:ra/0640115413]", - "editor": "" - }, - { - "id": "doi:10.5281/zenodo.4733920 omid:br/060504628", - "title": "Classes Of Errors In DOI Names (Data Management Plan)", - "author": "Boente, Ricarda [orcid:0000-0002-2133-8735 omid:ra/06908359558]; Massari, Arcangelo [orcid:0000-0002-8420-0696 omid:ra/06250110138]; Santini, Cristian [orcid:0000-0001-7363-6737 omid:ra/067099715]; Tural, Deniz [orcid:0000-0002-6391-4198 omid:ra/06908359559]", - "pub_date": "2021-05-03", - "issue": "", - "volume": "", - "venue": "", - "type": "", - "page": "", - "publisher": "Zenodo [omid:ra/0601747332]", - "editor": "" - } + "Yilmazlar, Sel\u00e7uk [omid:ra/06802276622]", + "Korfali, G\u00fclsen [omid:ra/06802276623]" ] - try: - output_json = json.loads(output) - except json.JSONDecodeError: - assert False, "The output is not valid JSON" - normalized_output = normalize_json(output_json) - normalized_expected = normalize_json(expected_output) - assert normalized_output == normalized_expected - - -def test_editor_works_retrieval_without_scheme_prefix(api_manager): - """ - Test retrieval of works edited by a specific person using identifier without scheme prefix. - This tests the default ORCID scheme fallback in generate_ra_search function for editors. - """ - output = execute_operation(api_manager, "/v1/editor/0000-0003-2098-4759") - expected_output = [ - { - "id": "doi:10.1007/978-1-4020-9632-7 isbn:9781402096327 isbn:9789048127108 openalex:W4249829199 omid:br/0612058700", - "title": "Adaptive Environmental Management", - "author": "", - "pub_date": "2009", - "issue": "", - "volume": "", - "venue": "", - "type": "book", - "page": "", - "publisher": "Springer Science And Business Media Llc [crossref:297 omid:ra/0610116006]", - "editor": "Allan, Catherine [orcid:0000-0003-2098-4759 omid:ra/069012996]; Stankey, George H. [omid:ra/061808486861]" - } - ] - - try: - output_json = json.loads(output) - except json.JSONDecodeError: - assert False, "The output is not valid JSON" - normalized_output = normalize_json(output_json) - normalized_expected = normalize_json(expected_output) - assert normalized_output == normalized_expected \ No newline at end of file diff --git a/test/virtuoso-meta-data/database/virtuoso-temp.db b/test/virtuoso-meta-data/database/virtuoso-temp.db new file mode 100644 index 0000000..1127448 Binary files /dev/null and b/test/virtuoso-meta-data/database/virtuoso-temp.db differ diff --git a/test/virtuoso-meta-data/database/virtuoso.db b/test/virtuoso-meta-data/database/virtuoso.db new file mode 100644 index 0000000..ef0e48b Binary files /dev/null and b/test/virtuoso-meta-data/database/virtuoso.db differ diff --git a/test/virtuoso-meta-data/database/virtuoso.ini b/test/virtuoso-meta-data/database/virtuoso.ini new file mode 100644 index 0000000..960da7a --- /dev/null +++ b/test/virtuoso-meta-data/database/virtuoso.ini @@ -0,0 +1,241 @@ +; +; virtuoso.ini +; +; Configuration file for the OpenLink Virtuoso VDBMS Server +; +; To learn more about this product, or any other product in our +; portfolio, please check out our web site at: +; +; http://virtuoso.openlinksw.com/ +; +; or contact us at: +; +; general.information@openlinksw.com +; +; If you have any technical questions, please contact our support +; staff at: +; +; technical.support@openlinksw.com +; +; +; Database setup +; +[Database] +DatabaseFile = ../database/virtuoso.db +ErrorLogFile = ../database/virtuoso.log +LockFile = ../database/virtuoso.lck +TransactionFile = ../database/virtuoso.trx +xa_persistent_file = ../database/virtuoso.pxa +ErrorLogLevel = 7 +FileExtend = 200 +MaxCheckpointRemap = 2000 +Striping = 0 +TempStorage = TempDatabase + +[TempDatabase] +DatabaseFile = ../database/virtuoso-temp.db +TransactionFile = ../database/virtuoso-temp.trx +MaxCheckpointRemap = 2000 +Striping = 0 +;MaxTempDBPages = 50G ; Limit size of the TempDatabase file to 50GB on disk + +; +; Server parameters +; +[Parameters] +ServerPort = 1111 +LiteMode = 0 +DisableUnixSocket = 1 +DisableTcpSocket = 0 +;SSLServerPort = 2111 +;SSLCertificate = cert.pem +;SSLPrivateKey = pk.pem +;X509ClientVerify = 0 +;X509ClientVerifyDepth = 0 +;X509ClientVerifyCAFile = ca.pem +MaxClientConnections = 10 +CheckpointInterval = 60 +SoftCheckpoint = 0 +O_DIRECT = 0 +CaseMode = 2 +MaxStaticCursorRows = 5000 +CheckpointAuditTrail = 0 +AllowOSCalls = 0 +SchedulerInterval = 10 +DirsAllowed = / +ThreadCleanupInterval = 1 +ThreadThreshold = 10 +ResourcesCleanupInterval = 1 +FreeTextBatchSize = 100000 +SingleCPU = 0 +VADInstallDir = ../vad/ +PrefixResultNames = 0 +RdfFreeTextRulesSize = 100 +IndexTreeMaps = 64 +MaxMemPoolSize = 200000000 +PrefixResultNames = 0 +MacSpotlight = 0 +MaxQueryMem = 2G ; memory allocated to query processor +VectorSize = 1000 ; initial parallel query vector (array of query operations) size +MaxVectorSize = 1000000 ; query vector size threshold. +AdjustVectorSize = 0 +ThreadsPerQuery = 4 +AsyncQueueMaxThreads = 10 +;; +;; When running with large data sets, one should configure the Virtuoso +;; process to use between 2/3 to 3/5 of free system memory and to stripe +;; storage on all available disks. +;; +;; Uncomment next two lines if there is 2 GB system memory free +;NumberOfBuffers = 170000 +;MaxDirtyBuffers = 130000 +;; Uncomment next two lines if there is 4 GB system memory free +;NumberOfBuffers = 340000 +; MaxDirtyBuffers = 250000 +;; Uncomment next two lines if there is 8 GB system memory free +;NumberOfBuffers = 680000 +;MaxDirtyBuffers = 500000 +;; Uncomment next two lines if there is 16 GB system memory free +;NumberOfBuffers = 1360000 +;MaxDirtyBuffers = 1000000 +;; Uncomment next two lines if there is 32 GB system memory free +;NumberOfBuffers = 2720000 +;MaxDirtyBuffers = 2000000 +;; Uncomment next two lines if there is 48 GB system memory free +;NumberOfBuffers = 4000000 +;MaxDirtyBuffers = 3000000 +;; Uncomment next two lines if there is 64 GB system memory free +;NumberOfBuffers = 5450000 +;MaxDirtyBuffers = 4000000 +;; +;; Note the default settings will take very little memory +;; but will not result in very good performance +;; +NumberOfBuffers = 10000 +MaxDirtyBuffers = 6000 +SSLServerPort = 1112 +SSLCertificate = virtuoso.crt +SSLPrivateKey = virtuoso.key + +[HTTPServer] +ServerPort = 8890 +ServerRoot = ../vsp +MaxClientConnections = 10 +DavRoot = DAV +EnabledDavVSP = 0 +HTTPProxyEnabled = 0 +TempASPXDir = 0 +DefaultMailServer = localhost:25 +MaxKeepAlives = 10 +KeepAliveTimeout = 10 +MaxCachedProxyConnections = 10 +ProxyConnectionCacheTimeout = 15 +HTTPThreadSize = 280000 +HttpPrintWarningsInOutput = 0 +Charset = UTF-8 +;HTTPLogFile = logs/http.log +MaintenancePage = atomic.html +EnabledGzipContent = 1 +SSLPort = 8891 +SSLCertificate = virtuoso.crt +SSLPrivateKey = virtuoso.key + +[AutoRepair] +BadParentLinks = 0 + +[Client] +SQL_PREFETCH_ROWS = 100 +SQL_PREFETCH_BYTES = 16000 +SQL_QUERY_TIMEOUT = 0 +SQL_TXN_TIMEOUT = 0 +;SQL_NO_CHAR_C_ESCAPE = 1 +;SQL_UTF8_EXECS = 0 +;SQL_NO_SYSTEM_TABLES = 0 +;SQL_BINARY_TIMESTAMP = 1 +;SQL_ENCRYPTION_ON_PASSWORD = -1 + +[VDB] +ArrayOptimization = 0 +NumArrayParameters = 10 +VDBDisconnectTimeout = 1000 +KeepConnectionOnFixedThread = 0 + +[Replication] +ServerName = db-NOBLE-PORT +ServerEnable = 1 +QueueMax = 50000 + +; +; Striping setup +; +; These parameters have only effect when Striping is set to 1 in the +; [Database] section, in which case the DatabaseFile parameter is ignored. +; +; With striping, the database is spawned across multiple segments +; where each segment can have multiple stripes. +; +; Format of the lines below: +; Segment = , [, .. ] +; +; must be ordered from 1 up. +; +; The is the total size of the segment which is equally divided +; across all stripes forming the segment. Its specification can be in +; gigabytes (g), megabytes (m), kilobytes (k) or in database blocks +; (b, the default) +; +; Note that the segment size must be a multiple of the database page size +; which is currently 8k. Also, the segment size must be divisible by the +; number of stripe files forming the segment. +; +; The example below creates a 200 meg database striped on two segments +; with two stripes of 50 meg and one of 100 meg. +; +; You can always add more segments to the configuration, but once +; added, do not change the setup. +; +[Striping] +Segment1 = 100M, db-seg1-1.db, db-seg1-2.db +Segment2 = 100M, db-seg2-1.db +;... +;[TempStriping] +;Segment1 = 100M, db-seg1-1.db, db-seg1-2.db +;Segment2 = 100M, db-seg2-1.db +;... +;[Ucms] +;UcmPath = +;Ucm1 = +;Ucm2 = +;... + +[Zero Config] +ServerName = virtuoso (NOBLE-PORT) +;ServerDSN = ZDSN +;SSLServerName = +;SSLServerDSN = + +[Mono] +;MONO_TRACE = Off +;MONO_PATH = +;MONO_ROOT = +;MONO_CFG_DIR = +;virtclr.dll = + +[URIQA] +DynamicLocal = 0 +DefaultHost = localhost:8890 + +[SPARQL] +DefaultGraph = +DefaultQuery = select distinct ?Concept where {[] a ?Concept} LIMIT 100 +;ResultSetMaxRows = 100000 +;MaxConstructTriples = 100000 +;MaxQueryExecutionTime = 120 ; in seconds +;LabelInferenceName = facets ; Only needed when using the Faceted Browser + +[Plugins] +LoadPath = ../hosting +Load1 = plain, geos +Load2 = plain, graphql +Load3 = plain, proj4 +Load4 = plain, shapefileio diff --git a/test/virtuoso-meta-data/database/virtuoso.pxa b/test/virtuoso-meta-data/database/virtuoso.pxa new file mode 100644 index 0000000..e69de29 diff --git a/test/virtuoso-meta-data/database/virtuoso.trx b/test/virtuoso-meta-data/database/virtuoso.trx new file mode 100644 index 0000000..e69de29 diff --git a/test/virtuoso-meta-data/meta_subset.nq b/test/virtuoso-meta-data/meta_subset.nq new file mode 100644 index 0000000..1ab0143 --- /dev/null +++ b/test/virtuoso-meta-data/meta_subset.nq @@ -0,0 +1,34650 @@ + + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "Human Papillomavirus And Prognoses Of Patients With Cancers Of The Upper Aerodigestive Tract" . + . + . + . + . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "Total Skin Electron Radiation For Patients With Erythrodermic Cutaneous T-cell Lymphoma (Mycosis Fungoides And The S�zary Syndrome)" . + . + . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "Serum CA125 Elevation And Risk Of Clinical Detection Of Cancer In Asymptomatic Postmenopausal Women" . + . + . + . + . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "A Simplified Regimen Of Weekly High Dose 5-Fluorouracil And Leucovorin As A 24-Hour Infusion In Patients With Advanced Colorectal Carcinoma" . + . + . + . + . + . + . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "Allelic Imbalance In The Clonal Evolution Of Prostate Carcinoma" . + . + . + . + . + . + . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "?Malignancy? In Meningiomas" . + . + . + . + . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "Hemorrhagic Epithelioid And Spindle Cell Hemangioma" . + . + . + . + . + . + . + . + . + "1997-11-01"^^ . + "Review Of Current Data Impacting Early Detection Guidelines For Prostate Cancer: List Of Participants For ACS Communication Group Of Articles Beginning On Page 1810" . + . + . + . + . + . + . + "2000-01-15"^^ . + "Induction Of Antitumor Immunity By Proteasome-Inhibited Syngeneic Fibroblasts Pulsed With A Modified TAA Peptide" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "lacZ-neoR Transfected Glioma Cells In Syngeneic Rats: Growth Pattern And Characterization Of The Host Immune Response Against Cells Transplanted Inside And Outside The Cns" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "1999-10"^^ . + "Response To The Letter Of Hanley Et Al. ([1999] Teratology 59:323-324), Concerning The Article By Roy Et Al. ([1998] Teratology 58:62-68)" . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "Macrophage Infiltration Correlates With Tumor Stage And Angiogenesis In Human Malignant Melanoma: Possible Involvement Of TNFα And IL-1α" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "Allelic Imbalance And Mutations Of thePTEN Gene In Ovarian Cancer" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "Altered Gastric Epithelial Cell Kinetics inHelicobacter Pylori-Associated Intestinal Metaplasia: Implications For Gastric Carcinogenesis" . + . + . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "In Vivo Electroporetic Transfer Ofbcl-2 Antisense Oligonucleotide Inhibits The Development Of Hepatocellular Carcinoma In Rats" . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "Familial Relationships In Thyroid Cancer By Histo-Pathological Type" . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "O6-(4-bromothenyl)guanine Improves The Therapeutic Index Of Temozolomide Against A375M Melanoma Xenografts" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "Ras Gene Mutations In Vinyl Chloride-Induced Liver Tumours Are Carcinogen-Specific But Vary With Cell Type And Species" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "Expression Of Von Willebrand Factor, An Endothelial Cell Marker, Is Up-Regulated By Angiogenesis Factors: A Potential Method For Objective Assessment Of Tumor Angiogenesis" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "Growth Inhibition Of Cervical Cancer Cells By The Human Retinoic Acid Receptor Β Gene" . + . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "A Search For Human Herpesvirus 8 (HHV-8) In HIV-1 Infected Mothers And Their Infants Does Not Suggest Vertical Transmission Of HHV-8" . + . + . + . + . + . + . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "Fragile Histidine Triad Transcription Abnormalities And Human Papillomavirus E6–E7 mRNA Expression In The Development Of Cervical Carcinoma" . + . + . + . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "A Study Of HTLV-I Infection And Breast Cancers In Trinidad And Tobago" . + . + . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "CD4+, HLA Class I-restricted, Cytolytic T-lymphocyte Clone Against Primary Malignant Melanoma Cells" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "Molecular Determinants Of UCN-01-induced Growth Inhibition In Human Lung Cancer Cells" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "Angiogenesis And Mast Cell Density With Tryptase Activity Increase Simultaneously With Pathological Progression In B-cell non-Hodgkin's Lymphomas" . + . + . + . + . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "Detection And Genetic Polymorphism Of Human Herpes Virus Type 8 In Endemic Or Epidemic Kaposi's Sarcoma From West And Central Africa, And South America" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "2000-01-15"^^ . + "H-ras, But Not N-ras, Induces An Invasive Phenotype In Human Breast Epithelial Cells: A Role For MMP-2 In The H-Ras-Induced Invasive Phenotype" . + . + . + . + . + . + . + . + . + . + . + . + . + . + "2001"^^ . + "Multidimensional Scaling And Visualization Of Large Molecular Similarity Tables" . + . + . + . + . + . + . + . + . + . + "1997-07-18"^^ . + "Influence Of Diethanolamine On Hard Segment Ordering In Flexible Polyurethane Foams" . + . + . + . + . + . + . + . + . + "2000-05-23"^^ . + "Isothermal Crystallization Kinetics Of Commercially Important Polyalkylene Terephthalates" . + . + . + . + . + . + . + . + . + "2002-05"^^ . + "Pilze In Medizin, Folklore Und Religion" . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "Increased Incidence Rates But No Space–Time Clustering Of Childhood Astrocytoma In Sweden, 1973–1992" . + . + . + . + . + . + . + . + . + . + . + "2002-05"^^ . + "Mycota Of Some British Shrub-Plant Communities" . + . + . + . + . + . + . + . + "2002-05"^^ . + "Macrofungi And Bryophytes Of Montane Mires (Tuscany, Italy): Organisms Worthy Of Conservation" . + . + . + . + . + . + . + . + . + . + . + . + "2002-05"^^ . + "Tulostoma Kreiselii, A New Species From Tunisia, Northern Africa" . + . + . + . + . + . + . + . + . + . + "2002-05"^^ . + "Studies In Erysiphales Anamorphs (II):Colutea Arborescens, A New Host forErysiphe Palczewskii" . + . + . + . + . + . + . + . + . + "2002-05"^^ . + "Annoted List ofCercospora Species (Epithets A–B) Described By C.Chupp" . + . + . + . + . + . + . + . + . + . + "2002-02-01"^^ . + "Kupplungsreagentien Vom Uronium-/Guanidinium-Typ: Synthese Und Charakterisierung Der Authentischen Uroniumsalze" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "1999-09-01"^^ . + "Effects Of Antihistamines On 3,4-Methylenedioxymethamphetamine-Induced Depletion Of Serotonin In Rats" . + . + . + . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "Outcome Of Peroneal Neuropathies In Patients With Systemic Malignant Disease" . + . + . + . + . + . + . + . + . + "2021-05-03"^^ . + "Classes Of Errors In DOI Names (Data Management Plan)" . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "A Review Of Hemolytic Uremic Syndrome In Patients Treated With Gemcitabine Therapy" . + . + . + . + . + . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "Influence Of Dietary Factors On Oral Precancerous Lesions In A Population-Based Case-Control Study In Kerala, India" . + . + . + . + . + . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "Reduction In Angiogenesis After Neoadjuvant Chemoendocrine Therapy In Patients With Operable Breast Carcinoma" . + . + . + . + . + . + . + . + . + . + . + . + . + "2001-06"^^ . + "Chemical Nanolithography With Electron Beams" . + . + . + . + . + . + . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "Lymphocyte Subpopulations In Patients With Multiple Primary Tumors" . + . + . + . + . + . + . + . + . + . + . + . + . + "1999-05-01"^^ . + "Histologic Types Of Lung Carcinoma And Age At Onset" . + . + . + . + . + . + . + . + . + . + . + . + "Teratology" . + . + . + . + . + . + . + "60" . + . + . + . + "4" . + . + . + . + "Advances In Intelligent Systems And Computing" . + . + . + . + . + . + "3" . + . + . + . + "Angewandte Chemie" . + . + . + . + . + . + . + "114" . + . + . + . + "2022-06"^^ . + "Identifying And Correcting Invalid Citations Due To DOI Errors In Crossref Data" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "127" . + . + . + . + "6" . + . + . + . + "2009"^^ . + "Adaptive Environmental Management" . + . + . + . + . + . + . + . + . + . + "OECD Economic Surveys: China" . + . + . + . + . + "127" . + . + . + . + "5" . + . + . + . + "Journal Of Computational Chemistry" . + . + . + . + . + . + . + "22" . + . + . + . + "1985-01"^^ . + "Critical Thresholds In Co-Citation Graphs" . + . + . + . + . + . + . + . + "1985-01"^^ . + "Cosmology And The Changing Role Of Libraries: An Analogy And Reflections" . + . + . + . + . + . + . + . + . + "1985-01"^^ . + "Structural Equivalence In A Journal Network" . + . + . + . + . + . + . + . + . + "1985-01"^^ . + "The Changing Environment Of Personal Information Systems" . + . + . + . + . + . + . + . + "1985-01"^^ . + "Relational Thesauri In Information Retrieval" . + . + . + . + . + . + . + . + . + . + "1985-01"^^ . + "Similarity And Stability Analysis Of The Two Partitioning Type Clustering Algorithms" . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Air Pollution Technical Information Network: A Revised Approach" . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Man, Information, And Society: New Patterns Of Interaction" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "On The Heterogeneity And Classification Of Author Self-Citations" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Planning And Budgeting For School Media Programs At The Building, District, And Regional Levels: O.R. In The Little Red Schoolhouse" . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Clinician Search For Information" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Letters To The Editor" . + . + . + . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "The Electronic Journal: A Progress Report" . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "SEQUEL As A Language For Document Retrieval" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Information Policies Of Developing Countries: The Case Of Brazil" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Automatic Classification Of Harris Survey Questions: An Experiment In The Organization Of Information" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Characteristics Of A Literature As Predictors Of Relatedness Between Cited And Citing Works" . + . + . + . + . + . + . + . + "1976-01"^^ . + "Prospects For Parallelism And The Computer Crunch" . + . + . + . + . + . + . + . + "1976-01"^^ . + "Development Of An Integrated Energy Vocabulary And The Possibilities For On-line Subject Switching" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Matched Case-Control Studies In Citation Analysis" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "A Zipfian Model Of An Automatic Bibliographic System: An Application To MEDLINE" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "On The Value Of Information" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "ASIS Distinguished Lecture-1972: Operations Research And Information Science-A Common Cause" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Videodisc Technology" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "A Reliability Theoretic Construct For Assessing Information Flow In Networks" . + . + . + . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Collection Overlap As A Function Of Library Size: A Comparison Of American And Canadian Public Libraries" . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "An Evolutionary Approach In Information Systems Science" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Using An INS Simulation To Forecast Manpower Needs" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "On Clustering Techniques In Information Science" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Relevance" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Actuality And Obsolescence Of Scientific Literature" . + . + . + . + . + . + . + . + "1976-01"^^ . + "Comparison Of Printed Bibliographic Descriptions Distributed By BIOSIS, CAS, And Ei" . + . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Marketing Research In The Scientific And Technical Information Services Industry: Development And Future Directions" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Some Current Information Retrieval Research In The United Kingdom" . + . + . + . + . + . + . + . + "1976-01"^^ . + "A Work Study Of The Review Production Process" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "The Soul Of A New Machine. Tracy Kidder. Boston: Little Brown; 1981." . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "An Experimental Framework For Observing The Indexing Process" . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "A Correlation Of Bibliographic Data Elements For Use In A Generalized File Management System" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "A Technique For Monitoring User Behavior At The Computer Terminal Interface" . + . + . + . + . + . + . + . + "1976-01"^^ . + "The Epidemiology Of Research On “Anomalous Water”" . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Application Of Queueing Network Models To Optimization Of Resource Allocation Within Libraries" . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "A Systems Evaluation Of The Educational Information System For Ontario" . + . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "The Theoretical Foundation Of Zipf's Law And Its Application To The Bibliographic Database Environment" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "A Computer Intermediary For Interactive Database Searching. I. Design" . + . + . + . + . + . + . + . + . + . + "1976-01"^^ . + "Structure Of The Biomedical Literature" . + . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Idea Tactics" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Value-Added Processes In The Information Life Cycle" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Information Research Management In Poland" . + . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Problems Of Compilation And Evaluation Of Property Data Of Substances And Materials" . + . + . + . + . + . + . + . + "1976-01"^^ . + "Retrieval From Engineering Index: Dear Sir" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Education In Information Science" . + . + . + . + . + . + . + . + "1976-01"^^ . + "Knowledge Space: A Conceptual Basis For The Organization Of Knowledge" . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "National Network Of Information In Poland" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "The Use Of Discriminant Analysis To Select Content-Bearing Words" . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "FIRST: Flexible Information Retrieval System For Text" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Cost Effectiveness Of Current Awareness Sources In The Pharmaceutical Industry" . + . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Measurement Of The Potential Demand For Academic And Professional Journals: A Methodology" . + . + . + . + . + . + . + . + "1976-01"^^ . + "A Generalized Flowchart For The Use Of ORBIT® And Other On-line Interactive Bibliographic Search Systems" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Promising Developments In Computer-Assisted Instruction" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "A Test Of Buck's Prime Number Coding Scheme" . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Letters To The Editor" . + . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "An Evaluation Of Index Medicus And MEDLARS In The Field Of Ophthalmology" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Overlap Among The Journal Articles Selected For Coverage By BIOSIS, CAS, And Ei" . + . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Two Models For Predicting Subject Circulation: A Contribution To The Allocation Problem" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Lotka's Law And Computer Science Literature" . + . + . + . + . + . + . + . + . + "1976-01"^^ . + "Cost-Benefit Model Of Library Acquisitions In Terms Of Use: Progress Report" . + . + . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Letters To The Editor" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Split Citation Identity: A Case Study From Economics" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Science Citation Index's Coverage Of The Preclinical Science Literature" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Opinion Paper. Information In An Informationless World Or The Making Of An Information Scientist" . + . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Associative Search Techniques Versus Probabilistic Retrieval Models" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Collective Experimental Work In Information Science Teaching" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Computers And The Postindustrial Society: Symbiosis Or Information Tyranny?" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "A Notation For Describing The Components Of Library Information Systems" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Pricing Policy For Library Services" . + . + . + . + . + . + . + . + "2007-09-06"^^ . + "Administrative And Financial Aspects Of Computers In Education" . + . + . + . + . + . + . + . + "1986-01"^^ . + "An Empirical Examination Of Lotka's Law" . + . + . + . + . + . + . + . + "1986-01"^^ . + "Using Interdocument Similarity Information In Document Retrieval Systems" . + . + . + . + . + . + . + . + . + . + "1986-01"^^ . + "Evidence Of Complex Citer Motivations" . + . + . + . + . + . + . + . + "1986-01"^^ . + "Interdependence Of PRECIS Role Operators: A Quantitiative Analysis Of Their Associations" . + . + . + . + . + . + . + . + . + "1986-01"^^ . + "Curriculum 1984: Meeting The Needs Of The Information Age" . + . + . + . + . + . + . + . + . + "1986-01"^^ . + "Towards Expert Systems For The Selection Of Search Keys" . + . + . + . + . + . + . + . + "1986-09"^^ . + "On The Foundation Of Evaluation" . + . + . + . + . + . + . + . + "1986-09"^^ . + "Letters To The Editor" . + . + . + . + . + . + . + . + . + . + . + . + "1986-07"^^ . + "Introduction And Overview" . + . + . + . + . + . + . + "1986-11"^^ . + "Introduction And Overview" . + . + . + . + . + . + . + "1972-03"^^ . + "Psychology And/Of Computer Oriented Linguistics" . + . + . + . + . + . + . + . + "1972-03"^^ . + "Who Cited What? A Citation Analysis Of The Four Basic Cataloging Texts" . + . + . + . + . + . + . + . + "1971-09"^^ . + "Functions Of A Man-Machine Interactive Information Retrieval System" . + . + . + . + . + . + . + . + "1971-01"^^ . + "The Preparation Of International Author Indexes, With Particular Reference To The Problems Of Transliteration, Prefixes, And Compound Family Names" . + . + . + . + . + . + . + . + "1972-03"^^ . + "An Experiment In Index Term Frequency" . + . + . + . + . + . + . + . + "1971-03"^^ . + "Key Issues In Soviet Information" . + . + . + . + . + . + . + . + "1974-03"^^ . + "More On Windsor & Windsor" . + . + . + . + . + . + . + . + "1971-01"^^ . + "Systems Definitions" . + . + . + . + . + . + . + . + "1971-07"^^ . + "Comparative Evaluation Of Two Indexing Methods Using Judges" . + . + . + . + . + . + . + . + "1974-05"^^ . + "Opinion Paper. An Affirmative Statement On Copyright Debate" . + . + . + . + . + . + . + . + "1971-03"^^ . + "Probabilistic Criteria For The Objective Design Of Descriptor Languages" . + . + . + . + . + . + . + . + "1973-07"^^ . + "Information Concepts And Their Utility" . + . + . + . + . + . + . + . + "1972-11"^^ . + "Double Hashing" . + . + . + . + . + . + . + . + "1971-03"^^ . + "The Sociological Relationships Of Information Science" . + . + . + . + . + . + . + . + "1973-11"^^ . + "On Selecting A Measure Of Retrieval Effectiveness Part II. Implementation Of The Philosophy" . + . + . + . + . + . + . + . + "1972-03"^^ . + "The Development Of A Semantic Differential To Assess Users' Attitudes Towards An On-Line Interactive Reference Retrieval System" . + . + . + . + . + . + . + . + "1971-05"^^ . + "What Makes An Automatic Keyword Classification Effective?" . + . + . + . + . + . + . + . + . + "1971-07"^^ . + "Automatic Abstracting And Indexing. II. Production Of Indicative Abstracts By Application Of Contextual Inference And Syntactic Coherence Criteria" . + . + . + . + . + . + . + . + . + . + "1971-05"^^ . + "Nelson, Carnot E., And Pollock, Donald K., Editors. Communication Among Scientists And Engineers. Lexington, Mass., Heath, 1970. 346 Pp" . + . + . + . + . + . + . + . + "1972-07"^^ . + "The Use Patterns Of Physics Journals In A Large Academic Research Library" . + . + . + . + . + . + . + . + "1971-09"^^ . + "A Computer-Based Procedure For Keyword Indexing Of Newspapers" . + . + . + . + . + . + . + . + . + . + "1971-03"^^ . + "Selected Results From An Inquiry Into Testing Of Information Retrieval Systems" . + . + . + . + . + . + . + . + "1971-07"^^ . + "Some Implications Of Automatic Recognition Of Bibliographic Elements" . + . + . + . + . + . + . + . + "1972-05"^^ . + "Sampling In-Library Book Use" . + . + . + . + . + . + . + . + "1973-03"^^ . + "On Selecting A Measure Of Retrieval Effectiveness" . + . + . + . + . + . + . + . + "1974-07"^^ . + "Journal Disposition Decision Policies" . + . + . + . + . + . + . + . + . + . + "1973-05"^^ . + "On The Development Of Information Science" . + . + . + . + . + . + . + . + "1974-05"^^ . + "Densities Of Use, And Absence Of Obsolescence, In Physics Journals At M I T" . + . + . + . + . + . + . + . + "1973-07"^^ . + "MIS Spinoff Of A Conventional STINFO Retrieval System" . + . + . + . + . + . + . + . + "1974-05"^^ . + "In Defence Of Relevance" . + . + . + . + . + . + . + . + . + "1972-05"^^ . + "Analysis Of Directory Searching" . + . + . + . + . + . + . + . + . + "1973-03"^^ . + "The User Interface For Interactive Bibliographic Searching: An Analysis Of The Attitudes Of Nineteen Information Scientists" . + . + . + . + . + . + . + . + . + . + "1972-11"^^ . + "1972 Student Paper Award Man-Machine Interface: Frustration" . + . + . + . + . + . + . + . + "1974-03"^^ . + "A Discriminant Function Index For Information System Evaluation" . + . + . + . + . + . + . + . + "1972-07"^^ . + "Information Networks: Definitions And Message Transfer Models" . + . + . + . + . + . + . + . + . + . + "1971-11"^^ . + "Improving A Field-Based “Eric-like” Information System" . + . + . + . + . + . + . + . + "1974-01"^^ . + "Trends In Manpower Needs In Information Science From 1967 To 1982" . + . + . + . + . + . + . + . + . + . + "1971-01"^^ . + "Error Evaluation For Stemming Algorithms As Clustering Algorithms" . + . + . + . + . + . + . + . + "1972-03"^^ . + "An Algorithm For Computing Correlation Matrices" . + . + . + . + . + . + . + . + "1973-07"^^ . + "Models Of Index Searching And Retrieval Effectiveness Of Keyword-In-Context Indexes" . + . + . + . + . + . + . + . + "1971-11"^^ . + "The Use Of Extracts In Information Services" . + . + . + . + . + . + . + . + "1973-09"^^ . + "SOLAR: A Storage And On-Line Automatic Retrieval System" . + . + . + . + . + . + . + . + . + . + "1973-03"^^ . + "Ascertaining Activities In A Subject Area Through Bibliometric Analysis. Application Tolibrary Literature" . + . + . + . + . + . + . + . + . + "1972-09"^^ . + "Issues In Information Technology In The United States" . + . + . + . + . + . + . + . + "1970-11"^^ . + "Letters To The Editor" . + . + . + . + . + . + . + . + . + . + . + . + . + . + "1971-03"^^ . + "Human Factors In The Design Of An Interactive Library System" . + . + . + . + . + . + . + . + . + "1972-07"^^ . + "Measures Of Effectiveness For A University Library" . + . + . + . + . + . + . + . + . + "1971-05"^^ . + "Robert A. Fairthorne—A Biographical Sketch" . + . + . + . + . + . + . + . + . + "1972-07"^^ . + "Two Modes Of Computer Assisted Instruction In A Library Reference Course" . + . + . + . + . + . + . + . + . + . + "1972-03"^^ . + "On Terminology For Search Strategies" . + . + . + . + . + . + . + . + "1970-11"^^ . + "A Table Of Set Theory Notations" . + . + . + . + . + . + . + . + "1974-01"^^ . + "Citation Of The Literature By Information Scientists In Their Own Publications." . + . + . + . + . + . + . + . + . + "1972-05"^^ . + "Technical Information Centers: Specialized Services To Science And Technology. An Overview" . + . + . + . + . + . + . + . + "1972-05"^^ . + "A Comparison Of Several Zipf-type Distributions In Their Goodness Of Fit To Language Data" . + . + . + . + . + . + . + . + . + "1971-09"^^ . + "On Higher Level Association Measures" . + . + . + . + . + . + . + . + "1974-07"^^ . + "Indexing And Automatic Significance Analysis" . + . + . + . + . + . + . + . + "1973-03"^^ . + "Improvement Of Automatic Abstracts By The Use Of Structural Analysis" . + . + . + . + . + . + . + . + . + . + "1973-09"^^ . + "Scientific Elitism And The Information System Of Science" . + . + . + . + . + . + . + . + "1971-09"^^ . + "Written Representation Of Topics And The Production Of Query Terms" . + . + . + . + . + . + . + . + . + . + "1971-01"^^ . + "The Cost-Effectiveness Analysis Of Information Retrieval And Dissemination Systems" . + . + . + . + . + . + . + . + "1974-01"^^ . + "A Decision Theory View Of The Information Retrieval Situation" . + . + . + . + . + . + . + . + "1974-01"^^ . + "A Metalanguage For Systematic Research On Human Communication Via Natural Language" . + . + . + . + . + . + . + . + "1971-03"^^ . + "Current Index To Journals In Education. New York, CCM Information Corporation, 1969- Monthly, With Semi-Annual And Annual Cumulations" . + . + . + . + . + . + . + . + "1972-11"^^ . + "An Evaluation Of The Rheumatology Coverage Of Index Medicus. A Preliminary Report" . + . + . + . + . + . + . + . + "1971-11"^^ . + "Interface Design For An Interactive Information Retrieval System: A Literature Survey And A Research System Description" . + . + . + . + . + . + . + . + "1971-03"^^ . + "A Note On The Mathematical Basis Of The SLIC Index" . + . + . + . + . + . + . + . + . + "1973-05"^^ . + "An Analysis Of Manual Circulation Systems For Academic Libraries" . + . + . + . + . + . + . + . + "1971-07"^^ . + "Compound Words: A Problem In Post-Coordinate Retrieval Systems" . + . + . + . + . + . + . + . + "1974-03"^^ . + "Selection Of Scientific Periodicals In An Industrial Research Library" . + . + . + . + . + . + . + . + "1971-03"^^ . + "A Systems Approach To The Design Of Information Systems" . + . + . + . + . + . + . + . + . + "1973-03"^^ . + "The Environment Of Classification: The Concept Of Mutual Exclusivity" . + . + . + . + . + . + . + . + "1973-09"^^ . + "Citation Of The Literature By Information Scientists In Their Own Publications" . + . + . + . + . + . + . + . + . + "1974-03"^^ . + "Opinion Paper. Developments In Scientific Documentation In The Long Term" . + . + . + . + . + . + . + . + "1971-05"^^ . + "Curricula In Information Science: Analysis And Development" . + . + . + . + . + . + . + . + . + . + . + "1971-09"^^ . + "The Efficiency Of Medlars Titles For Retrieval" . + . + . + . + . + . + . + . + "1971-11"^^ . + "Effectiveness Of Retrieval Key Abbreviation Schemes" . + . + . + . + . + . + . + . + "1974-05"^^ . + "Reference Question Analysis And Search Strategy Development By Man And Machine" . + . + . + . + . + . + . + . + "1973-05"^^ . + "A Generalized Conceptual Development For The Analysis And Flow Of Information" . + . + . + . + . + . + . + . + . + "1973-07"^^ . + "Document Retrieval Experiments Using Cluster Analysis" . + . + . + . + . + . + . + . + . + . + "1973-09"^^ . + "A Decision Theory View Of The Information Retrieval Situation: An Operations Research Approach" . + . + . + . + . + . + . + . + "1972-01"^^ . + "Microfiche: A Study Of User Attitudes And Reading Habits" . + . + . + . + . + . + . + . + "1971-03"^^ . + "Information Science Terminology" . + . + . + . + . + . + . + . + . + . + "1974-01"^^ . + "The Environment Of Classification Part II: How We Classify" . + . + . + . + . + . + . + . + "1972-01"^^ . + "An Experiment To Study The Use Of Booleannot Logic To Improve The Precision Of Selective Dissemination Of Information" . + . + . + . + . + . + . + . + . + . + "1974-03"^^ . + "Search Strategy, Construction And Use Of Citation Networks, With A Socio-Scientific Example: “Amorphous Semi-Conductors And S.R. Ovshinsky”" . + . + . + . + . + . + . + . + "1974-07"^^ . + "Opinion Paper. The Scientific Premises Of Information Science" . + . + . + . + . + . + . + . + "1971-07"^^ . + "Measurement Of How Well Professional People Keep Up With Their Technical Literature" . + . + . + . + . + . + . + . + "1972-09"^^ . + "Teaching Abstracting And Indexing" . + . + . + . + . + . + . + . + "1971-07"^^ . + "Format Recognition: A Report Of A Project At The Library Of Congress" . + . + . + . + . + . + . + . + "1971-09"^^ . + "Comparison Of Document Data Bases" . + . + . + . + . + . + . + . + . + . + "1972-11"^^ . + "From Multidisciplinary To Interdisciplinary Research: Effects Of Information Systems On Formal Organizations" . + . + . + . + . + . + . + . + "1974-03"^^ . + "Introduction To PL/I Programming For Library And Information Science. Thomas H. Mott, Jr., Susan Artandi And Leny Struminger. New York: Academic Press, 231 Ppl (1972)" . + . + . + . + . + . + . + . + "1971-05"^^ . + "Communicating To Communicators" . + . + . + . + . + . + . + . + . + . + . + . + "1970-11"^^ . + "The Proposed KWIC Index For Psychology: An Experimental Test Of Its Effectiveness" . + . + . + . + . + . + . + . + . + "1971-09"^^ . + "KWOC Indexes And Vocabulary Comparisons Of Summaries Of LC And DC Classification Schedules" . + . + . + . + . + . + . + . + "1973-11"^^ . + "Text Searching Retrieval Of Answer-Sentences And Other Answer-Passages" . + . + . + . + . + . + . + . + "1972-05"^^ . + "What Information Dissemination Studies Imply Concerning The Design Of On-Line Reference Retrieval Systems" . + . + . + . + . + . + . + . + "1971-07"^^ . + "Occurrence Of Letters In Engineering Periodical Titles" . + . + . + . + . + . + . + . + "1972-07"^^ . + "On The Economics Of Information" . + . + . + . + . + . + . + . + "1972-11"^^ . + "Managing An Uncontrolled Vocabulary Ex Post Facto" . + . + . + . + . + . + . + . + . + . + "1974-03"^^ . + "Bibliographic Data Base Usage In A Large Technical Community" . + . + . + . + . + . + . + . + "1972-01"^^ . + "ASIS/SLA Merger Comments" . + . + . + . + . + . + . + "1974-05"^^ . + "Determination Of Satisfactory Scale For Data Processing Facilities" . + . + . + . + . + . + . + . + "1974-05"^^ . + "Design Equations For Retrieval Systems Based On The Swets Model" . + . + . + . + . + . + . + . + "1972-09"^^ . + "A Bibliometric Analysis Of Certain Information Science Literature" . + . + . + . + . + . + . + . + "1974-03"^^ . + "Other Peoples Mistakes" . + . + . + . + . + . + . + . + "1974-05"^^ . + "A Decision Theory View Of The Information Retrieval Situation" . + . + . + . + . + . + . + . + "1970-11"^^ . + "An Automated Storage And Retrieval System For Clinical Pharmaceutical Research Documents" . + . + . + . + . + . + . + . + . + . + . + . + "1973-05"^^ . + "The Effect Of Document Ordering In Rocchio'S Clustering Algorithm" . + . + . + . + . + . + . + . + "1971-05"^^ . + "Suggestions For Exploiting The Potential Of On-Line Remote Access Information Retrieval And Display Systems" . + . + . + . + . + . + . + . + "1973-09"^^ . + "Does Indexing Exhaustivity Matter?" . + . + . + . + . + . + . + . + "1972-01"^^ . + "An Economic Analysis Of The Demand For Scientific Journals" . + . + . + . + . + . + . + . + "1973-05"^^ . + "A Novel Philosophy For The Design Of Information Storage And Retrieval Systems Appropriate For The ‘70’S" . + . + . + . + . + . + . + . + "1971-01"^^ . + "1/71-1R Sacherschliessung An Bibliotheken Bei Einsatz Elektronischer Datenverarbeitung. (Subject Retrieval In Libraries With The Aid Of EDP.) 1970. Dietrich Roessler. Köln, Greven Verlag. 117 Pp. (Arbeiten Aus Dem Bibliothekar-Lehrinstitut Des Landes Rheinland-Westfalen, Heft 34.)" . + . + . + . + . + . + . + . + "1972-05"^^ . + "Analytical Models For Library Planning" . + . + . + . + . + . + . + . + "1972-01"^^ . + "Preparation For Interpersonal Communication" . + . + . + . + . + . + . + . + "1974-01"^^ . + "1973 Student Paper Award. An Alogorithm For Generating Structural Surrogates Of English Text" . + . + . + . + . + . + . + . + "1973-09"^^ . + "Definition Of Some Basic Terms In Computer And Information Science" . + . + . + . + . + . + . + . + . + . + . + . + "1974-03"^^ . + "Position Paper. Cutting The NSF-OSIS Budget: Potential Disaster For Information Science And Technology" . + . + . + . + . + . + . + . + "1971-11"^^ . + "Letters To The Editor" . + . + . + . + . + . + . + . + . + . + . + . + . + "1971-09"^^ . + "Informal Communication Among Scientists In Sleep Research" . + . + . + . + . + . + . + . + "1971-07"^^ . + "On The Evolution Of Information Science" . + . + . + . + . + . + . + . + "1974-07"^^ . + "Hash Coding With A Non-Unique Search Key" . + . + . + . + . + . + . + . + "1973-09"^^ . + "Classification Of Scientific Documents By Means Of Self-Generated Groups Employing Free Language" . + . + . + . + . + . + . + . + . + "1972-09"^^ . + "Retrieval Parameters In Growing Data Bases" . + . + . + . + . + . + . + . + "1972-11"^^ . + "Dialectical Inquiring Systems: A New Methodology For Information Science" . + . + . + . + . + . + . + . + . + . + "1973-05"^^ . + "Social Science Information Characteristics With Particular Reference To The Educational Resources Information Centers (ERIC)" . + . + . + . + . + . + . + . + "1974-01"^^ . + "Breaking The Communication Barrier Between Searcher And Literature File: An Interactive Guide" . + . + . + . + . + . + . + . + "1972-05"^^ . + "A Flow Chart For Indexing With A Thesaurus" . + . + . + . + . + . + . + . + "1972-11"^^ . + "Systematic Utilization Of Human Resources As An Integral Part Of Information Science Work" . + . + . + . + . + . + . + . + "1972-05"^^ . + "Citation Patterns Of The Cardiovascular Serial Literature" . + . + . + . + . + . + . + . + . + "1971-05"^^ . + "Machine-assisted Approach To General Reference Materials" . + . + . + . + . + . + . + . + "1971-03"^^ . + "On-line Systems: Promise And Pitfalls" . + . + . + . + . + . + . + . + "1973-03"^^ . + "Mixed Data Structures In A Multi-Purpose Retrieval System" . + . + . + . + . + . + . + . + . + . + "1973-07"^^ . + "The Functions Of Abstracts In The Initial Screening Of Technical Documents By The User" . + . + . + . + . + . + . + . + "1973-09"^^ . + "The Epidemic Process And The Contagion Model" . + . + . + . + . + . + . + . + "1974-05"^^ . + "Evaluation Of Current Awareness Service For Physics And Astronomy Literature" . + . + . + . + . + . + . + . + . + "1973-11"^^ . + "An Audiographic System For Self-Instruction" . + . + . + . + . + . + . + . + "1971-09"^^ . + "Citations, References And The Growth Of Scientific Literature: A Model Of Dynamic Interaction" . + . + . + . + . + . + . + . + . + "1974-07"^^ . + "A Comparative Analysis Of Obsolescence Patterns Of The U.S. Geoscience Literature" . + . + . + . + . + . + . + . + "1973-07"^^ . + "Information Theory As A Measure Of Information Content" . + . + . + . + . + . + . + . + "1973-03"^^ . + "Letters To The Editor" . + . + . + . + . + . + . + . + "1972-11"^^ . + "Correcting Author, Title And Multiple-Term Index Entries In Mechanized Bibliography Preparation" . + . + . + . + . + . + . + . + . + "1971-05"^^ . + "Holography As Applied To Information Storage And Retrieval Systems" . + . + . + . + . + . + . + . + . + "1972-09"^^ . + "Get Smart?" . + . + . + . + . + . + . + . + "1972-11"^^ . + "Marketing Perspectives For “ERIC-like” Information Systems" . + . + . + . + . + . + . + . + "1974-01"^^ . + "Performance Of Kilgour's Truncation Algorithm In Files Of Different Subjects" . + . + . + . + . + . + . + . + "1973-03"^^ . + "On-line Serials Control System In A Large Biomedical Library. Part III: Comparison Of On-Line And Batch Operations And Cost Analysis" . + . + . + . + . + . + . + . + "1971-01"^^ . + "A Study Of Statistical Measures For Predicting Terms Used To Index Documents" . + . + . + . + . + . + . + . + "1974-03"^^ . + "How To Cope With The Foreign-Language Problem: Experience Gained At A Multidisciplinary Laboratory" . + . + . + . + . + . + . + . + "1973-11"^^ . + "Clustering Of Scientific Journals" . + . + . + . + . + . + . + . + . + "1972-01"^^ . + "The “Generality” Effect And The Retrieval Evaluation For Large Collections" . + . + . + . + . + . + . + . + "1973-09"^^ . + "Productivity In Toxicity Papers" . + . + . + . + . + . + . + . + "1974-03"^^ . + "A Note On An International Invisible College For Information Exchange" . + . + . + . + . + . + . + . + "1974-07"^^ . + "Optimal Selection Of Acquisition Sources" . + . + . + . + . + . + . + . + "1972-09"^^ . + "A Cost Model For Evaluating Information Retrieval Systems" . + . + . + . + . + . + . + . + "1972-03"^^ . + "Report On The Evaluation Of An Experimental Computer-Based Current-Awareness Service For Chemists" . + . + . + . + . + . + . + . + . + . + "1972-03"^^ . + "A New Comparison Between Conventional Indexing (MEDLARS) And Automatic Text Processing (SMART)" . + . + . + . + . + . + . + . + "1972-09"^^ . + "Interrelationships Of Scientific Journals" . + . + . + . + . + . + . + . + . + . + "1974-07"^^ . + "Lotka And Information Science" . + . + . + . + . + . + . + . + "1971-09"^^ . + "Letters To The Editor" . + . + . + . + . + . + . + . + . + . + . + . + . + "1974-07"^^ . + "A Clustering Algorithm Based On User Queries" . + . + . + . + . + . + . + . + "1974-01"^^ . + "Informal Communication Of Scientific Information" . + . + . + . + . + . + . + . + "1974-07"^^ . + "An Experiment In Dialectic Information Systems" . + . + . + . + . + . + . + . + . + "1974-05"^^ . + "The Role Of Automatic Indexing In Access Control: A Modular View" . + . + . + . + . + . + . + . + "1972-05"^^ . + "Interactive Search Of Bibliographic Data Bases In An Academic Environment" . + . + . + . + . + . + . + . + . + "1971-11"^^ . + "Analytical Models For Library Planning" . + . + . + . + . + . + . + . + . + "1972-05"^^ . + "Linguistics And Information Science" . + . + . + . + . + . + . + . + "1972-09"^^ . + "A Universal Source Thesaurus As A Classification Generator" . + . + . + . + . + . + . + . + "1971-03"^^ . + "Information Science And The Information-Conscious Society" . + . + . + . + . + . + . + . + "1972-11"^^ . + "On-line Serials Control System In A Large Biomedical Library Part II. Evaluation Of Retrieval Features" . + . + . + . + . + . + . + . + "1973-03"^^ . + "Theoretical Foundations Of Thesaurus-Construction And Some Methodological Considerations For Thesaurus-Updating" . + . + . + . + . + . + . + . + "1972-01"^^ . + "James Whitney Perry (1907–1971)" . + . + . + . + . + . + . + "1973-05"^^ . + "Promotion Of Information Services: An Evaluation Of Alternative Approaches" . + . + . + . + . + . + . + . + . + . + . + "1972-01"^^ . + "The Development And Preliminary Test Of Behavior Related Dimensions Of Information Systems" . + . + . + . + . + . + . + . + "1974-01"^^ . + "Allocation Of Resources In An Information System" . + . + . + . + . + . + . + . + "1974-05"^^ . + "Effect Of Instantaneous Retrieval On Indexing Criteria" . + . + . + . + . + . + . + . + "1973-07"^^ . + "On The Dimensionality Of Users' Attitudes Toward On-Line Retrieval systems—A Replication?" . + . + . + . + . + . + . + . + . + "1971-09"^^ . + "Journal Coverage Overlap In Current Contents ® Editions" . + . + . + . + . + . + . + . + "1971-03"^^ . + "Some Remarks On Elitism In Information And The Invisible College Phenomenon In Science" . + . + . + . + . + . + . + . + "1973-07"^^ . + "Scientific And Technological Information Systems In The Soviet Union" . + . + . + . + . + . + . + . + "1973-03"^^ . + "A Statistical Decision Model For Periodical Selection For A Specialized Information Center" . + . + . + . + . + . + . + . + . + "1973-11"^^ . + "“Lotka's Law In The Humanities?”" . + . + . + . + . + . + . + . + "1973-07"^^ . + "Co-citation In The Scientific Literature: A New Measure Of The Relationship Between Two Documents" . + . + . + . + . + . + . + . + "1973-05"^^ . + "A Keyword System For Small Information Centers" . + . + . + . + . + . + . + . + "1971-07"^^ . + "Document Retrieval And The Concept Of Sets" . + . + . + . + . + . + . + . + "1972-01"^^ . + "Overlap In The Lists Of Journals Monitored By Biosis, CAS, And EI" . + . + . + . + . + . + . + . + . + . + "1972-07"^^ . + "Some Relations Between Queries And Search-Terms Generated By Catalog Users" . + . + . + . + . + . + . + . + "1972-09"^^ . + "On-line Serials Control System In A Large Biomedical Library: 1) Description Of The System" . + . + . + . + . + . + . + . + "1971-01"^^ . + "Predicting Performance Of Information Specialists" . + . + . + . + . + . + . + . + "1973-09"^^ . + "On Interrelationships Of The Sciences And Technology As Expressed By A Categorized List Of Journals And Modified By A Classification System" . + . + . + . + . + . + . + . + "1973-07"^^ . + "Use Of An Automatic Text Analyzer In Preparation Of SDI Profiles" . + . + . + . + . + . + . + . + . + "1972-07"^^ . + "The Dissemination Of Task And Socioemotional Information In An International Community Of Scientists" . + . + . + . + . + . + . + . + . + "1973-07"^^ . + "A General Statistical Model For Estimating Future Demand Levels Of Data-Base Utilization Within An Information Retrieval Organization" . + . + . + . + . + . + . + . + "1970-11"^^ . + "Barter System For Researchers: A Proposal" . + . + . + . + . + . + . + . + "1973-09"^^ . + "Journal Citations In Master's Theses: One Measurement Of A Journal Collection" . + . + . + . + . + . + . + . + . + "1971-05"^^ . + "Random Time Sampling With Self-Observation For Library Cost Studies: Unit Costs Of Interlibrary Loans And Photocopies At A Regional Medical Library" . + . + . + . + . + . + . + . + "1971-07"^^ . + "Dirty Boole?" . + . + . + . + . + . + . + . + "1980-09"^^ . + "Searching The Chemical Literature" . + . + . + . + . + . + . + . + "1978-11"^^ . + "Building Better SDI Profiles For Users Of Large, Multidisciplinary Data Bases" . + . + . + . + . + . + . + . + . + "1981-03"^^ . + "The Impact Of Interlibrary Access To Periodicals On Subscription Continuation/Cancellation Decision Making" . + . + . + . + . + . + . + . + "1981-05"^^ . + "A Model For A Weighted Retrieval System" . + . + . + . + . + . + . + . + . + "1977-11"^^ . + "Essays Of An Information Scientist, Vol. I And 11. Eugene Carfield. Philadelphia, PA : ISI Press (1977)." . + . + . + . + . + . + . + . + "1976-05"^^ . + "Kiviat-graphs As A Means For Displaying Performance Data For On-Line Retrieval Systems" . + . + . + . + . + . + . + . + "1979-07"^^ . + "Tutorial: Mathematical Modeling Of Library Systems" . + . + . + . + . + . + . + . + "1981-05"^^ . + "An Analysis Of The Differences Between Density-Of-Use Ranking And Raw-Use Ranking Of Library Journal Use" . + . + . + . + . + . + . + . + . + "1979-03"^^ . + "Similarity Of Pratt's Measure Of Class Concentration To The Gini Index" . + . + . + . + . + . + . + . + "1979-03"^^ . + "Science, Shcharansky, And The Soviets" . + . + . + . + . + . + . + . + "1985-05"^^ . + "Access To Primary And Secondary Literature From Peripheral Or Less Developed Countries" . + . + . + . + . + . + . + . + . + "1974-11"^^ . + "Reference Question Analysis And Search Strategy Development By Man And Machine" . + . + . + . + . + . + . + . + "1981-11"^^ . + "Improving Library Effectiveness: A Proposal For Applying Fuzzy Set Concepts In The Management Of Large Collections" . + . + . + . + . + . + . + . + . + "1983-01"^^ . + "Question Generation And Formulation: An Indication Of Information Need" . + . + . + . + . + . + . + . + "1984-05"^^ . + "A Visit To The Wasteland Of Federal Scientific And Technical Information Policy" . + . + . + . + . + . + . + . + "1983-05"^^ . + "Old And New Models For Office Automation" . + . + . + . + . + . + . + . + "1975-05"^^ . + "Squibb Science Information System: Computerized Selective Dissemination, Current Awareness, And Retrospective Searching Of Pharmaceuticai Literature" . + . + . + . + . + . + . + . + . + . + . + "1976-03"^^ . + "The Library As An Information Utility In The University Context: Evolution And Measurement Of Service" . + . + . + . + . + . + . + . + "1979-05"^^ . + "On-line Serials Collection Analysis" . + . + . + . + . + . + . + . + "1976-09"^^ . + "Computer-aided Selection In A Library Network" . + . + . + . + . + . + . + . + . + "1984-11"^^ . + "The Effect Of Spatial Arrangement, Upper-Lower Case Letter Combinations, And Reverse Video On Patron Response To CRT Displayed Catalog Records" . + . + . + . + . + . + . + . + . + "1980-05"^^ . + "On-line Systems Of Disciplines And Specialty Areas In Science And Technology" . + . + . + . + . + . + . + . + . + . + "1980-05"^^ . + "On-line Systems In The Communication Process: Projections" . + . + . + . + . + . + . + . + . + "1980-03"^^ . + "Informatics And Transborder Data Flow: The Question Of Social Impact" . + . + . + . + . + . + . + . + "1983-01"^^ . + "Developing Academic Library Decision Support Systems" . + . + . + . + . + . + . + . + . + "1976-05"^^ . + "A Mathematical Model For Comparison Of Bibliographic Data Bases" . + . + . + . + . + . + . + . + "1983-05"^^ . + "Electronics, The Cost Disease, And The Operation Of Libraries" . + . + . + . + . + . + . + . + . + "1984-01"^^ . + "Less Than Full-Text Indexing Using A Non-Boolean Searching Model" . + . + . + . + . + . + . + . + . + . + "1977-11"^^ . + "An Economic Rationale For Page And Submission Charges By Academic Journals" . + . + . + . + . + . + . + . + "1982-01"^^ . + "Postcoordinate Retrieval: A Comparison Of Two Indexing Languages" . + . + . + . + . + . + . + . + "1984-07"^^ . + "Use Of Arabic In Computerized Information Interchange" . + . + . + . + . + . + . + . + "1985-09"^^ . + "A Probabilistic Theory Of Indexing And Similarity Measure Based On Cited And Citing Documents" . + . + . + . + . + . + . + . + "1978-03"^^ . + "Publication Ratings Versus Peer Ratings Of Universities" . + . + . + . + . + . + . + . + . + . + "1978-11"^^ . + "A Comparison Of The Readability Of Synopses And Original Articles For Engineering Synopses" . + . + . + . + . + . + . + . + "1980-01"^^ . + "Information System Design Methodology" . + . + . + . + . + . + . + . + "1983-07"^^ . + "Thematic Analysis And “Obsolescence”" . + . + . + . + . + . + . + . + "1982-01"^^ . + "Database Comparison" . + . + . + . + . + . + . + . + "1983-11"^^ . + "Retrieving Information With Interactive Videodiscs" . + . + . + . + . + . + . + . + . + "1985-03"^^ . + "Information-seeking Behavior In An Applied Research/Service Delivery Setting" . + . + . + . + . + . + . + . + . + "1978-09"^^ . + "Perspectives In Information Science. Debons, Anthony; Cameron, William J., Eds. Leyden, The Netherlands: Noordhoff International Publishers; 1975: 797Pp., Illustrations, Index. Price: $65. (NATO Advanced Study Institute Series. Series E: Applied Sceince-No. 10.)" . + . + . + . + . + . + . + . + "1984-09"^^ . + "Two Partitioning Type Clustering Algorithms" . + . + . + . + . + . + . + . + . + "1976-03"^^ . + "Representation Of The Change Of State In An Individual Resulting From Data Acquired And Processed" . + . + . + . + . + . + . + . + "1985-11"^^ . + "A Problem In Information Retrieval With Fuzzy Sets" . + . + . + . + . + . + . + . + "1981-07"^^ . + "Information Flow And Analysis: Theory, Simulation, And Experiments. III. Preliminary Experiments And Analysis" . + . + . + . + . + . + . + . + . + . + "1983-05"^^ . + "A Technique Of Two-Stage Clustering Applied To Environmental And Civil Engineering And Related Methods Of Citation Analysis" . + . + . + . + . + . + . + . + . + "1974-11"^^ . + "Title Versus Title/Abstract Text Searching In SDI Systems" . + . + . + . + . + . + . + . + "1975-01"^^ . + "Opinion Paper. On Theory Development In Information Science" . + . + . + . + . + . + . + . + . + "1982-03"^^ . + "A Replication Of The Nelson And Mitroff Experiment In Teaching “Bothsides” Thinking" . + . + . + . + . + . + . + . + . + . + . + "1978-11"^^ . + "Cliqueing And Patent Classification" . + . + . + . + . + . + . + . + "1980-09"^^ . + "The Application Of A Minicomputer To Thesaurus Construction" . + . + . + . + . + . + . + . + . + "1975-09"^^ . + "Canadian Scientific Journals: Part II, Interaction" . + . + . + . + . + . + . + . + "1980-11"^^ . + "Journal Evaluation" . + . + . + . + . + . + . + . + . + "1979-11"^^ . + "The Wrong Way To Go" . + . + . + . + . + . + . + . + "1981-01"^^ . + "Online Searching And Paperless Publication" . + . + . + . + . + . + . + . + "1986-07"^^ . + "Fuzzy Relational Databases—a Key To Expert Systems. M. Zemankova-Leech And A. Kandel. Interdisciplinary Systems Research, Verlag TUV: Rheinland, Koln; 1984, 178 Pp." . + . + . + . + . + . + . + . + "1985-09"^^ . + "Inference Control Mechanism For Statistical Database: Frequency-imposed Data Distortions" . + . + . + . + . + . + . + . + . + . + "1983-11"^^ . + "Instructional Videodisc" . + . + . + . + . + . + . + . + "1982-11"^^ . + "Introduction" . + . + . + . + . + . + . + . + "1977-01"^^ . + "A Library Network Model" . + . + . + . + . + . + . + . + "1979-03"^^ . + "Bradford Distribution Of Data Elements" . + . + . + . + . + . + . + . + . + "1985-09"^^ . + "Note" . + . + . + . + . + . + . + . + "1982-03"^^ . + "Thematic Analysis In Information Science: The Example Of “Literature Obsolescence”" . + . + . + . + . + . + . + . + "1980-01"^^ . + "The Half-Life Of The Chemical Literature" . + . + . + . + . + . + . + . + "1982-11"^^ . + "The Systems Approach: Its Variety Of Aspects" . + . + . + . + . + . + . + . + "1977-01"^^ . + "The Diffusion Of Core Publications In American Sociology" . + . + . + . + . + . + . + . + "1981-05"^^ . + "The Management And Social Science Literatures: An Interdisciplinary Cross-Citation Analysis" . + . + . + . + . + . + . + . + "1978-09"^^ . + "Evidence Of OCLC's Potential For Special Libraries And Technical Information Centers" . + . + . + . + . + . + . + . + . + "1977-05"^^ . + "Input-output Relationships In On-Line Bibliographic Searching" . + . + . + . + . + . + . + . + "1983-07"^^ . + "Citation Indexes In Information Retrieval" . + . + . + . + . + . + . + . + "1980-03"^^ . + "The Distribution Of Scientific Productivity And Social Change" . + . + . + . + . + . + . + . + "1982-03"^^ . + "Standardization Of Journal Titles In Databases" . + . + . + . + . + . + . + . + "1980-03"^^ . + "Retrieval Behavior Of Derived Truncated Search Keys For A Large On-Line Bibliographic File" . + . + . + . + . + . + . + . + "1985-11"^^ . + "The Politics Of Information" . + . + . + . + . + . + . + . + "1977-11"^^ . + "A Library Network Model" . + . + . + . + . + . + . + . + "1977-03"^^ . + "The Relationship Between Author Names And Author Entries In A Large On-Line Union Catalog As Retrieved Using Truncated Keys" . + . + . + . + . + . + . + . + . + "1978-05"^^ . + "Indexing Documents By Gedanken Experimentation" . + . + . + . + . + . + . + . + "1985-03"^^ . + "Development Of Resource Sharing Networks: Networks Study No. 22. ABN Conference (1983: Melbourne, Victoria). First ABN Conference, July 12–14, 1983, Melbourne, Papers And Proceedings, Australian Bibliographic Network. Canberra: National Library Of Australia; 1983: 214 Pp" . + . + . + . + . + . + . + . + "1983-11"^^ . + "Introduction And Overview" . + . + . + . + . + . + . + . + "1983-11"^^ . + "Response Time Variations In An Online Search System" . + . + . + . + . + . + . + . + "1984-03"^^ . + "Dictionary Making By Conference And Committee: NACA And The American Aeronautical Language, 1916–1934" . + . + . + . + . + . + . + . + "1977-01"^^ . + "Variety generation—A Reinterpretation Of Shannon's Mathematical Theory Of Communication, And Its Implications For Information Science" . + . + . + . + . + . + . + . + "1978-05"^^ . + "Using The Collection-Control Model" . + . + . + . + . + . + . + . + . + "1981-11"^^ . + "Current Issues In Psycholinguistics" . + . + . + . + . + . + . + . + "1980-11"^^ . + "Instructions For Contributors" . + . + . + . + . + . + . + "1985-09"^^ . + "Relevance?" . + . + . + . + . + . + . + . + "1977-09"^^ . + "Models For Librarians" . + . + . + . + . + . + . + . + "1979-11"^^ . + "The ICSU ABInternational Classification System For Physics: Its History And Future" . + . + . + . + . + . + . + . + . + . + . + "1984-11"^^ . + "A New Editor For JASIS" . + . + . + . + . + . + . + . + "1981-11"^^ . + "Influence On Online Bibliographic Services On Student Behavior" . + . + . + . + . + . + . + . + . + . + "1976-09"^^ . + "On The Naranan Interpretation Of Bradford's Law" . + . + . + . + . + . + . + . + "1979-03"^^ . + "Monograph Evaluation For Acquisitions In A Large Research Library" . + . + . + . + . + . + . + . + . + . + "1979-11"^^ . + "Using Boolean Queries With A Clustered File Organization" . + . + . + . + . + . + . + . + "1974-11"^^ . + "Student Paper Award 1974. Systematic Searching Of Abstracts And Indexes In Interdisciplinary Areas" . + . + . + . + . + . + . + . + "1980-01"^^ . + "Automated Indexing Versus Kwoc: A Performance Comparison" . + . + . + . + . + . + . + . + "1976-07"^^ . + "Machine Indexing: Linguistic And Semiotic Implications" . + . + . + . + . + . + . + . + "1980-05"^^ . + "An Examination Of Differences Between Two Studies Of Highly Cited Old Papers" . + . + . + . + . + . + . + . + "1979-11"^^ . + "Searching The Chemical Literature" . + . + . + . + . + . + . + . + "1980-08"^^ . + "The Cultural Appraisal Of Efforts To Alleviate Information Inequity" . + . + . + . + . + . + . + . + . + "1982-11"^^ . + "Adaptive System: The Study Of Information, Pattern, And Behavior" . + . + . + . + . + . + . + . + "1976-07"^^ . + "Automatic Aids To Profile Construction" . + . + . + . + . + . + . + . + . + "1981-11"^^ . + "Examining Design Assumptions For An Information Retrieval Service: SDI Use For Scientific And Technical Databases" . + . + . + . + . + . + . + . + "1980-08"^^ . + "Fuzzy Requests: An Approach To Weighted Boolean Searches" . + . + . + . + . + . + . + . + "1979-03"^^ . + "Simulating Circulation-Use Characteristic Curves Using Circulation Data" . + . + . + . + . + . + . + . + . + "1985-03"^^ . + "The Five-Axiom Theory Of Indexing And Information Supply" . + . + . + . + . + . + . + . + "1979-03"^^ . + "Bibliographic References For Numeric Social Science Data Files: Suggested Guidelines" . + . + . + . + . + . + . + . + "1978-01"^^ . + "Evaluation Of Information Retrieval Systems: A Decision Theory Approach" . + . + . + . + . + . + . + . + . + "1982-05"^^ . + "A Perspective On Secondary Access Services In The Humanities" . + . + . + . + . + . + . + . + "1985-03"^^ . + "The Research Method Used In Subfields And The Growth Of Published Literature In Those Subfields: Vertebrate Paleontology And Geochemistry" . + . + . + . + . + . + . + . + "1984-09"^^ . + "Natural Language Processing" . + . + . + . + . + . + . + . + "1980-05"^^ . + "On-line Systems: History, Technology, And Economics" . + . + . + . + . + . + . + . + "1981-05"^^ . + "Adjusted Age Distribution And Its Application To Impact Factor And Immediacy Index" . + . + . + . + . + . + . + . + "1977-05"^^ . + "Factors Affecting Subject Catalog Search Success" . + . + . + . + . + . + . + . + "1980-11"^^ . + "The Technology Of Library And Information Networks" . + . + . + . + . + . + . + . + "1983-03"^^ . + "Publication Indicators Of Relative Research Efforts In Physics Subfields" . + . + . + . + . + . + . + . + . + "1980-08"^^ . + "Cybics" . + . + . + . + . + . + . + . + "1980-01"^^ . + "Automatic Detection And Correction Of Spelling Errors In A Large Data Base" . + . + . + . + . + . + . + . + "1983-07"^^ . + "Admissibility Of Delegates To International Meetings" . + . + . + . + . + . + . + . + "1984-05"^^ . + "An Information Scientist'S View On Evolving Information Technology" . + . + . + . + . + . + . + . + "1982-01"^^ . + "Printer's Devil And Reprint Requests" . + . + . + . + . + . + . + . + "1982-03"^^ . + "Duplication Of Japanese Names: A Problem In Citations And Bibliographies" . + . + . + . + . + . + . + . + "1978-03"^^ . + "Bradford's Distribution: A New Formulation" . + . + . + . + . + . + . + . + . + "1979-11"^^ . + "Some Statistical Aspects ofJASIS Publications" . + . + . + . + . + . + . + . + . + "1986-05"^^ . + "Letters To The Editor" . + . + . + . + . + . + . + "1975-11"^^ . + "Complementarity Between A Use Study And A Citation Study In Considering Publication Practices In The Physical And Social Sciences" . + . + . + . + . + . + . + . + "1974-11"^^ . + "A Framework For The Study Of Emerging Network Technology" . + . + . + . + . + . + . + . + . + . + "1978-05"^^ . + "Education For Information Science As A Profession" . + . + . + . + . + . + . + . + "1975-07"^^ . + "A Probabilistic Approach To Automatic Keyword Indexing. Part I. On The Distribution Of Specialty Words In A Technical Literature" . + . + . + . + . + . + . + . + "1978-01"^^ . + "Evaluating Scientific Journals withJournal Citation Reports — A Case Study In Acoustics" . + . + . + . + . + . + . + . + "1984-03"^^ . + "Scientific Inquiry: A Model For Online Searching" . + . + . + . + . + . + . + . + "1984-05"^^ . + "Maximum Entropy Principle" . + . + . + . + . + . + . + . + "1976-05"^^ . + "Use Of Library Materials In Terms Of Age" . + . + . + . + . + . + . + . + . + . + . + "1980-01"^^ . + "The Cybernetics Of Bibliographic Control: Toward A Theory Of Document Retrieval Systems" . + . + . + . + . + . + . + . + "1983-01"^^ . + "Entropy And Information: A Multidisciplinary Overview" . + . + . + . + . + . + . + . + . + "1985-07"^^ . + "The Dillion Hypothesis Of Titular Colonicity: An Empirical Test From The Ecological Sciences" . + . + . + . + . + . + . + . + "1984-03"^^ . + "System Design For Detection And Correction Of Spelling Errors In Scientific And Scholarly Text" . + . + . + . + . + . + . + . + . + "1983-07"^^ . + "Thematic Analysis In Information Science" . + . + . + . + . + . + . + . + "1977-03"^^ . + "The Identifier Method Of Measuring Use As Applied To Modeling The Circulation Use Of Books From A University Library" . + . + . + . + . + . + . + . + "1986-05"^^ . + "Essays Of An Information Scientist, Vol. VI. Eugene Garfield. Philadelphia, PA: ISI Press; 1984: Xix-673 Pp. Price: $25.00 ISBN 0-89495-032-0" . + . + . + . + . + . + . + . + "1981-11"^^ . + "Document Representation In Probabilistic Models Of Information Retrieval" . + . + . + . + . + . + . + . + "1983-07"^^ . + "Optimal Values Of Recall And Precision" . + . + . + . + . + . + . + . + . + . + "1980-09"^^ . + "Serial Acquisition As A Capital Budgeting Problem" . + . + . + . + . + . + . + . + . + "1975-11"^^ . + "Applying The Management-By-Objectives Technique In An Industrial Library" . + . + . + . + . + . + . + . + "1985-11"^^ . + "Library/information Services And The Nation'S Elderly" . + . + . + . + . + . + . + . + . + "1981-01"^^ . + "Comparison Of Recent Acquisitions And OCLC Find Rates For Three Canadian Special Libraries" . + . + . + . + . + . + . + . + . + "1981-09"^^ . + "Performance Testing Of A Book Index" . + . + . + . + . + . + . + . + . + "1983-07"^^ . + "Citation Relation Evaluation Clarification" . + . + . + . + . + . + . + . + "1982-01"^^ . + "Thomas Edison Andscience" . + . + . + . + . + . + . + . + "1984-01"^^ . + "File Maintenance Of MeSH Headings In Medline" . + . + . + . + . + . + . + . + "1977-03"^^ . + "Data bases—A History Of Developments And Trends From 1966 Through 1975" . + . + . + . + . + . + . + . + "1983-01"^^ . + "The BLEND System: Programme For The Study Of Some “Electronic Journals”" . + . + . + . + . + . + . + . + "1977-05"^^ . + "The Industrial Special Library universe—A “Base Line” Study Of Its Extent And Characteristics" . + . + . + . + . + . + . + . + . + "1975-05"^^ . + "Speakers At The 1972 Gordon Research Conference: Their Backgrounds And Literature Records As Selection Aids For “Out-Of-Specialty” Scientists And Others" . + . + . + . + . + . + . + . + . + "1984-09"^^ . + "Artificial Intelligence: Underlying Assumptions And Basic Objectives" . + . + . + . + . + . + . + . + . + "1977-01"^^ . + "On Indexing, Retrieval And The Meaning Of About" . + . + . + . + . + . + . + . + "1979-07"^^ . + "The Bradford Law: A New Calculus For The Social Sciences?" . + . + . + . + . + . + . + . + "1985-05"^^ . + "Ethics Of Knowing" . + . + . + . + . + . + . + . + "1982-03"^^ . + "Optimal Values Of Recall And Precision" . + . + . + . + . + . + . + . + . + "1980-11"^^ . + "Cooperation And Competition Among Library Networks" . + . + . + . + . + . + . + . + "1983-09"^^ . + "A Cluster Analysis Of Retrieval Patterns Among Bibliogrpahic Databases" . + . + . + . + . + . + . + . + "1979-03"^^ . + "Transnational Information Flow As Assessed By Citation Analysis" . + . + . + . + . + . + . + . + "1978-03"^^ . + "Automatic Indexing Of Pathology Data" . + . + . + . + . + . + . + . + . + . + "1985-05"^^ . + "An Overview Of Social Measures Of Information" . + . + . + . + . + . + . + . + "1978-05"^^ . + "Data Bases-History Of Developments And Trends" . + . + . + . + . + . + . + . + "1982-03"^^ . + "Information Retrieval Systems: Characteristics, Testing And Evaluation, 2Nd Ed. F. Wilfrid Lancaster. New York: Wiley; 1979. Price: $19.75" . + . + . + . + . + . + . + . + "1978-03"^^ . + "Cost-effectiveness Comparison Of Manual And On-Line Retrospective Bibliographic Searching" . + . + . + . + . + . + . + . + "1983-03"^^ . + "Mappings Of Fields Based On Nominations" . + . + . + . + . + . + . + . + "1975-03"^^ . + "Letters To The Editor" . + . + . + . + . + . + . + . + "1981-07"^^ . + "A Translating Computer Interface For End-User Operation Of Heterogeneous Retrieval Systems. I. Design" . + . + . + . + . + . + . + . + . + "1983-05"^^ . + "Factors Affecting Online Bibliographic Retrieval: A Conceptual Framework For Research" . + . + . + . + . + . + . + . + . + "1976-07"^^ . + "Information Science And The Phenomenon Of Information" . + . + . + . + . + . + . + . + . + "1979-07"^^ . + "Information Search Tactics" . + . + . + . + . + . + . + . + "1976-09"^^ . + "Availability Analysis" . + . + . + . + . + . + . + . + "1985-09"^^ . + "The Effects Of Gender And Age On Preschool Children'S Choice Of The Computer As A Child-Selected Activity" . + . + . + . + . + . + . + . + . + "1976-07"^^ . + "Is User Satisfaction A Hobgoblin?" . + . + . + . + . + . + . + . + "1985-11"^^ . + "Bibliometric Techniques Applied To Issues Management: A Case Study" . + . + . + . + . + . + . + . + . + "1981-01"^^ . + "Online Searching: Measures That Discriminate Among Users With Different Types Of Experiences" . + . + . + . + . + . + . + . + "1977-11"^^ . + "Clustering Large Files Of Documents Using The Single-Link Method" . + . + . + . + . + . + . + . + "1977-01"^^ . + "Unconventional Uses Of On-Line Information Retrieval Systems: On-line Bibliometric Studies" . + . + . + . + . + . + . + . + "1985-07"^^ . + "An Investigation Of Online Searcher Traits And Their Relationship To Search Outcome" . + . + . + . + . + . + . + . + "1980-05"^^ . + "Comparison Of Peer And Citation Assessment Of The Influence Of Scientific Journals" . + . + . + . + . + . + . + . + . + . + "1983-03"^^ . + "Bibliometric Indicators Versus Expert Opinion In Assessing Research Performance" . + . + . + . + . + . + . + . + "1982-03"^^ . + "Notice Concerning Notices" . + . + . + . + . + . + . + . + "1984-11"^^ . + "Research Productivity And Breadth Of Interest Of Computer Scientists" . + . + . + . + . + . + . + . + "1979-11"^^ . + "Information Retrieval, 2Nd Ed. C.J. Van Rijsbergen. London: Butterworths; 1979: 208 Pp. Price: $32.50" . + . + . + . + . + . + . + . + "1983-03"^^ . + "Characterization Of The Research Papers Of U.S. Medical Schools" . + . + . + . + . + . + . + . + . + "1975-01"^^ . + "A Theory Of Term Importance In Automatic Text Analysis" . + . + . + . + . + . + . + . + . + . + "1974-09"^^ . + "Representation Of Concept Relations Using The TOSAR System Of The IDC: Treatise III On Information Retrieval Theory" . + . + . + . + . + . + . + . + . + . + . + "1981-01"^^ . + "Translations Of Scientific And Technical Articles" . + . + . + . + . + . + . + . + "1975-11"^^ . + "Opinion Paper. Pragmatic Observations On Theoretical Research In Information Science" . + . + . + . + . + . + . + . + "1978-11"^^ . + "The Application Of Multiple-Criteria Utility Theory To The Evaluation Of Information Systems" . + . + . + . + . + . + . + . + . + "1978-05"^^ . + "Ad Hoc And Selective Translations Of Scientific And Technical Journal Articles: Their Characteristics And Possible Predictability" . + . + . + . + . + . + . + . + "1974-11"^^ . + "PL/I Programming Text" . + . + . + . + . + . + . + . + "1978-07"^^ . + "Information Science And The Phenomenon Of Information" . + . + . + . + . + . + . + . + "1983-07"^^ . + "Causes Of Low And High Citation Potentials In Science: Citation Analysis Of Biochemistry And Plant Physiology Journals" . + . + . + . + . + . + . + . + "1974-11"^^ . + "Optimal Storage Of Books By Size: An Operations Research Approach" . + . + . + . + . + . + . + . + . + "1985-09"^^ . + "Teaching Database Management System Use In A Library School Curriculum" . + . + . + . + . + . + . + . + "1980-01"^^ . + "A Method For Partitioning The Journal Literature" . + . + . + . + . + . + . + . + . + "1977-11"^^ . + "Single-pass Method For Determining The Semantic Relationships Between Terms" . + . + . + . + . + . + . + . + . + "1985-03"^^ . + "Beyond Beyond “1984”: The Future Of Library Technical Services. Peter Gellatly, Ed. New York: Haworth Press; 1984: 265 Pp. Price: $24.95 Hard Cove: The Future Of Library Technical Services. Peter Gellatly, Ed. New York: Haworth Press; 1984: 265 Pp. Price: $24.95 Hard Cove: The Future Of Library Technical Services. Peter Gellatly, Ed. New York: Haworth Press; 1984: 265 Pp. Price: $24.95 Hard Cove: The Future Of Library Technical Services. Peter Gellatly, Ed. New York: Haworth Press; 1984: 265 Pp. Price: $24.95 Hard Cover" . + . + . + . + . + . + . + . + "1982-11"^^ . + "The Systems Movement: An Overview For Information Scientists" . + . + . + . + . + . + . + . + "1983-07"^^ . + "Modern Algebra And Information Science" . + . + . + . + . + . + . + . + "1981-07"^^ . + "Informatics Or Cybics?" . + . + . + . + . + . + . + . + "1980-03"^^ . + "The Implementation Of SCATT" . + . + . + . + . + . + . + . + . + "1984-03"^^ . + "Fair Use Versus Fair Return: Copyright Legislation And Its Consequences" . + . + . + . + . + . + . + . + . + "1981-11"^^ . + "FAMULUS Revisited: Ten Years Of Personal Information Systems" . + . + . + . + . + . + . + . + "1976-07"^^ . + "On-line Logging In Of Periodicals By CODEN Using Interactive Query Report Processor" . + . + . + . + . + . + . + . + . + "1985-05"^^ . + "Information Transfer As Technical Assistance For Development" . + . + . + . + . + . + . + . + "1984-03"^^ . + "Mapping A Curriculum By Computer" . + . + . + . + . + . + . + . + . + "1983-07"^^ . + "User Adaptation In Interactive Information Retrieval" . + . + . + . + . + . + . + . + "1974-09"^^ . + "Cold Type Composition: Its Impact On Library And Information Science" . + . + . + . + . + . + . + . + "1981-05"^^ . + "MEDLINE: An Introduction To Online Searching" . + . + . + . + . + . + . + . + "1978-07"^^ . + "OR NOT: The Unused Operator" . + . + . + . + . + . + . + . + . + "1984-01"^^ . + "The Psychology Of Online Searching" . + . + . + . + . + . + . + . + "1983-03"^^ . + "Statistical Disorder And The Analysis Of A Communication-Graph" . + . + . + . + . + . + . + . + "1985-03"^^ . + "Intelligent Systems, The Unprecedented Opportunity. Jean E. Hayes And Donald Michie., Eds. Chichester: Ellis Horwood Ltd.; 1983: Isbn 0470-27501-4. Price: $39.95" . + . + . + . + . + . + . + . + "1978-07"^^ . + "Redesigning Library Jobs" . + . + . + . + . + . + . + . + "1976-03"^^ . + "A Comparison Of The Readability Of Abstracts With Their Source Documents" . + . + . + . + . + . + . + . + "1981-09"^^ . + "Kroeber's “Superorganics”" . + . + . + . + . + . + . + . + "1982-05"^^ . + "Introduction" . + . + . + . + . + . + . + . + . + "1976-07"^^ . + "Preparation Of Desk-Top Literature Indexes For Ongoing Research Projects" . + . + . + . + . + . + . + . + "1976-05"^^ . + "A Multifaceted Medical Data Information System And One Product: The Index-Handbook Of Ototoxic Agents" . + . + . + . + . + . + . + . + . + "1980-11"^^ . + "The Use Of Titles For Automatic Document Classification" . + . + . + . + . + . + . + . + . + "1979-11"^^ . + "Utilizing Library Constituents' Perceived Needs In Allocating Journal Costs" . + . + . + . + . + . + . + . + . + "1975-07"^^ . + "Machine-assisted Indexing Of Scientific Research Summaries" . + . + . + . + . + . + . + . + . + . + "1983-07"^^ . + "The Electronic Journal" . + . + . + . + . + . + . + . + . + . + "1979-03"^^ . + "Using The Collection Control Model" . + . + . + . + . + . + . + . + "1980-09"^^ . + "Applying Game Theory To Library Networks" . + . + . + . + . + . + . + . + . + "1977-11"^^ . + "Automatic Ranked Output From Boolean Searches In SIRE" . + . + . + . + . + . + . + . + . + . + "1984-01"^^ . + "Statistical Recognition Of Content Terms In General Text" . + . + . + . + . + . + . + . + . + "1981-07"^^ . + "A Translating Computer Interface For End-User Operation Of Heterogeneous Retrieval Systems. II. Evaluations" . + . + . + . + . + . + . + . + . + "1985-09"^^ . + "A Bibliometric Distribution Which Really Works" . + . + . + . + . + . + . + . + "1975-03"^^ . + "Structure, Effectiveness And Benefits Of LEXtractor, An Operational Computer Program For Automatic Extraction Of Case Summaries And Dispositions From Court Decisions" . + . + . + . + . + . + . + . + . + "1981-09"^^ . + "Representations, Processes, Memory Mechanisms: The Basic Components Of Cognition" . + . + . + . + . + . + . + . + "1979-05"^^ . + "Relation Of Title Length To Number Of Authors" . + . + . + . + . + . + . + . + . + "1979-03"^^ . + "Indexing" . + . + . + . + . + . + . + . + "1976-05"^^ . + "Pragmatic Expansion Of An Enumerative Classification Scheme" . + . + . + . + . + . + . + . + "1976-09"^^ . + "The Yield Formula And Bradford'S Law" . + . + . + . + . + . + . + . + "1984-11"^^ . + "Pragmatic Approach To Subject Indexing: A New Concept" . + . + . + . + . + . + . + . + . + "1976-09"^^ . + "The Permuterm Subject Index: An Autobiographical Review" . + . + . + . + . + . + . + . + "1980-08"^^ . + "Measurement In Information Science: Objective And Subjective Metrical Space" . + . + . + . + . + . + . + . + "1978-07"^^ . + "Cumulative Advantage Urn Games Explained: A Reply To Kantor" . + . + . + . + . + . + . + . + "1980-03"^^ . + "Microcomputer-generated Graphic Displays As An Aid In String Indexing" . + . + . + . + . + . + . + . + "1981-09"^^ . + "Geopolitics Of Information: How Western Culture Dominates The World. Anthony Smith. New York: Oxford University Press; 1980; 192 Pp. Price: $13.95" . + . + . + . + . + . + . + . + "1978-09"^^ . + "Interlibrary Loans: Impact Of The New Copyright Law" . + . + . + . + . + . + . + . + . + "1976-03"^^ . + "The Biblio-Profile—A Two-In-One Package Of Information: Its Preparation, Production, Marketing, Uses" . + . + . + . + . + . + . + . + "1981-03"^^ . + "Transfer Of Information Technology To Less Developed Countries: A Systems Approach" . + . + . + . + . + . + . + . + "1976-03"^^ . + "An Approach To Associative Retrieval Through The Theory Of Fuzzy Sets" . + . + . + . + . + . + . + . + "1984-01"^^ . + "European Research Letter: Teaching Online Information Retrieval In United Kingdom Library Schools" . + . + . + . + . + . + . + . + "1975-07"^^ . + "Relative Effectiveness Of Titles, Abstracts, And Subject Headings For Machine Retrieval From The COMPENDEX Services" . + . + . + . + . + . + . + . + "1980-08"^^ . + "Searching Biases In Large Interactive Document Retrieval Systems" . + . + . + . + . + . + . + . + "1978-09"^^ . + "Estimating The Demand For Library Service: Theory And Practice" . + . + . + . + . + . + . + . + "1976-07"^^ . + "Scientific Freedom And Responsibility" . + . + . + . + . + . + . + . + "1976-07"^^ . + "The Stability Of Two Common Matching Functions In Classification With Respect To A Proposed Measure" . + . + . + . + . + . + . + . + "1978-07"^^ . + "Opinion Paper: Design Criteria For Documentation Retrieval Languages" . + . + . + . + . + . + . + . + . + "1978-09"^^ . + "Cross-national Information Flows In Basic Research: Examples Taken From Physics" . + . + . + . + . + . + . + . + . + "1975-07"^^ . + "An Acquisitions Decision Model For Academic Libraries" . + . + . + . + . + . + . + . + "1980-09"^^ . + "Mysteries Of The Deep: Models Of The Universe Of Knowledge" . + . + . + . + . + . + . + . + "1981-01"^^ . + "Cocited Author Retrieval Online: An Experiment With The Social Indicators Literature" . + . + . + . + . + . + . + . + "1975-03"^^ . + "Comparison Of Checksum Procedures By Simulation" . + . + . + . + . + . + . + . + . + "1977-01"^^ . + "Lotkas Law-Year By Year" . + . + . + . + . + . + . + . + "1982-03"^^ . + "Searching The Chemical Literature" . + . + . + . + . + . + . + . + "1981-01"^^ . + "The Use Of Queuing Networks And Mixed Integer Programming To Allocate Resources Optimally Within A Library Layout" . + . + . + . + . + . + . + . + "1981-03"^^ . + "A General Formulation Of Bradford'S Distribution: The Graph-Oriented Approach" . + . + . + . + . + . + . + . + "1975-09"^^ . + "The Consumers Of New Information Technology: A Survey Of The Utilization Of MEDLINE" . + . + . + . + . + . + . + . + "1980-05"^^ . + "Compression Of Continuous Prose Texts Using Variety Generation" . + . + . + . + . + . + . + . + . + . + . + "1980-11"^^ . + "Directions In Library Networking" . + . + . + . + . + . + . + . + . + "1980-05"^^ . + "Nonbibliographic On-Line Data Base Services" . + . + . + . + . + . + . + . + . + "1979-05"^^ . + "Utility-theoretic Indexing" . + . + . + . + . + . + . + . + "1980-08"^^ . + "On The Value Of Information" . + . + . + . + . + . + . + . + "1981-01"^^ . + "Improving Keyword Indexing" . + . + . + . + . + . + . + . + . + "1975-07"^^ . + "Explicit And Implicit Variables In Information Retrieval (IR) Systems" . + . + . + . + . + . + . + . + "1975-01"^^ . + "Curricula In Information Science: Four Year Progress Report" . + . + . + . + . + . + . + . + . + . + . + "1981-03"^^ . + "Introduction" . + . + . + . + . + . + . + . + "1985-05"^^ . + "Issues In Information Science Education In Developing Countries" . + . + . + . + . + . + . + . + . + . + "1983-09"^^ . + "Usage Patterns Of An Online Search System" . + . + . + . + . + . + . + . + "1977-09"^^ . + "Expanding The Categories Of Feedback" . + . + . + . + . + . + . + . + "1977-01"^^ . + "Lotkas Law In The Humanities" . + . + . + . + . + . + . + . + "1974-09"^^ . + "Where The Action Is And Was In Information Science" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "1978-03"^^ . + "A Threshold Rule Applied To The Retrieval Decision Model" . + . + . + . + . + . + . + . + "1982-05"^^ . + "Problems Of Information Services With Respect To Integration Of The Sciences" . + . + . + . + . + . + . + . + "1977-09"^^ . + "Development Of A Semantic Differential To Access Users' Attitudes Towards A Batch Mode Information Retrieval System (ERIC)" . + . + . + . + . + . + . + . + . + "1983-05"^^ . + "Planning For Office Automation" . + . + . + . + . + . + . + . + "1980-03"^^ . + "Coal Gasification" . + . + . + . + . + . + . + . + "1979-05"^^ . + "Financial Aspects Of Industrial Information Centers: A Survey" . + . + . + . + . + . + . + . + "1981-01"^^ . + "Implications Of The Exact Bradford Distribution" . + . + . + . + . + . + . + . + "1978-01"^^ . + "Frequency-rank Distributions" . + . + . + . + . + . + . + . + . + "1977-01"^^ . + "A Policy For Science Information Activities In Small Countries: The Case Of Israel" . + . + . + . + . + . + . + . + "1975-05"^^ . + "Optimal Resource Allocation In Library Systems" . + . + . + . + . + . + . + . + "1980-05"^^ . + "Rationalization Of Secondary Services: Measurement Of Coverage Of Primary Journals And Overlap Between Services" . + . + . + . + . + . + . + . + . + "1985-09"^^ . + "Mapping A Curriculum By Computer" . + . + . + . + . + . + . + . + . + "1985-05"^^ . + "Federal Information Policy" . + . + . + . + . + . + . + . + "1984-03"^^ . + "Information Seeking Expressions Of Users" . + . + . + . + . + . + . + . + "1977-01"^^ . + "Computerized Russian Translation At ORNL" . + . + . + . + . + . + . + . + . + . + "1980-05"^^ . + "Highly Cited Old Papers" . + . + . + . + . + . + . + . + . + "1983-03"^^ . + "Human Memory Organization For Computer Programs" . + . + . + . + . + . + . + . + . + "1985-11"^^ . + "Citations Format" . + . + . + . + . + . + . + . + "1978-05"^^ . + "Variation Of The Nature Of Citation Measures With Journals And Scientific Specialties" . + . + . + . + . + . + . + . + . + "1976-07"^^ . + "Knowledge And Information Spaces: Implications For Retrieval Systems" . + . + . + . + . + . + . + . + "1980-01"^^ . + "Education And Training For Computer-Based Reference Services: Review Of Training Efforts To Date" . + . + . + . + . + . + . + . + . + "1979-05"^^ . + "The Importance Of SDI For Current Awareness In Fields With Severe Scatter Of Information" . + . + . + . + . + . + . + . + . + "1978-05"^^ . + "On The Perils Of Merging Boolean And Weighted Retrieval Systems" . + . + . + . + . + . + . + . + "1984-03"^^ . + "On Information Science" . + . + . + . + . + . + . + . + "1984-03"^^ . + "A Method For Studying Intercorrelated Circulation Patterns In Library Systems" . + . + . + . + . + . + . + . + "1983-01"^^ . + "Collection And Characterization Of Spelling Errors In Scientific And Scholarly Text" . + . + . + . + . + . + . + . + . + "1975-01"^^ . + "Some Soviet Concepts Of Information For Information Science" . + . + . + . + . + . + . + . + "1978-05"^^ . + "When Is A Changed State Not A Changed State? When A Theory Of Mechanics Persists In The Face Of A Theory Of Relativity" . + . + . + . + . + . + . + . + "1980-09"^^ . + "Patron Use Of An Online Circulation System In Known-Item Searching" . + . + . + . + . + . + . + . + "1979-11"^^ . + "On Fuzzy Sets: Reply To Cerny" . + . + . + . + . + . + . + . + "1982-01"^^ . + "Text Compression Using Variable-To Fixed-Length Encodings" . + . + . + . + . + . + . + . + . + "1985-05"^^ . + "National And International Information Policy" . + . + . + . + . + . + . + . + "1978-07"^^ . + "A Note On Cumulative Advantage Distributions" . + . + . + . + . + . + . + . + "1985-11"^^ . + "Information And Productivity" . + . + . + . + . + . + . + . + . + . + "1981-05"^^ . + "Online Searching And Paperless publication—Author's Replys" . + . + . + . + . + . + . + . + "1976-07"^^ . + "Classification From PRECIS: Some Possibilities" . + . + . + . + . + . + . + . + "1978-03"^^ . + "Growth Dynamics Of Information Search Services" . + . + . + . + . + . + . + . + "1976-03"^^ . + "The Use Of Abbreviations And Acronyms In The Physics Literature" . + . + . + . + . + . + . + . + "1986-03"^^ . + "European Research Letter: Social Science Information Research" . + . + . + . + . + . + . + . + "1975-01"^^ . + "The Formal Analysis Of Document Retrieval Systems" . + . + . + . + . + . + . + . + . + "1979-07"^^ . + "Highly Cited Old Papers" . + . + . + . + . + . + . + . + "1980-11"^^ . + "The Library Community At A Technological And Philosophical Crossroads: Necessary And Sufficient Conditions For Survival" . + . + . + . + . + . + . + . + "1976-09"^^ . + "Application Of A Collection-Control Model For Scientific Libraries" . + . + . + . + . + . + . + . + . + "1984-11"^^ . + "“Citation Classics” Analysis: An Approach To Characterizing Interdisciplinary Research" . + . + . + . + . + . + . + . + . + . + "1984-05"^^ . + "Integrating America's Infostructure" . + . + . + . + . + . + . + . + "1984-05"^^ . + "A Note On The Use Of Nearest Neighbors For Implementing Single Linkage Document Classifications" . + . + . + . + . + . + . + . + "1984-09"^^ . + "Morse's Markov Model Of Book Use Revisited" . + . + . + . + . + . + . + . + . + "1984-07"^^ . + "Testing Of A Natural Language Retrieval System For A Full Text Knowledge Base" . + . + . + . + . + . + . + . + . + "1982-05"^^ . + "Bibliometric Models For Management Of An Information Store. I. Differential Utility Among Items" . + . + . + . + . + . + . + . + "1978-11"^^ . + "On The Nature Of Fuzz: A Diatribe" . + . + . + . + . + . + . + . + "1975-03"^^ . + "Understanding Scientific Literatures: A Bibliometric Approach. Joseph C. Donohue, Cambridge, Massachusetts: The MIT Press, 101 P. (1973)" . + . + . + . + . + . + . + "1975-03"^^ . + "On The Equivalence Of Boolean And Weighted Searching Based On The Convertibility Of Query Forms" . + . + . + . + . + . + . + . + "1977-03"^^ . + "The Community College Library Fritz Veit. Westport, CT: Greenwood Press (1975). (Contributions In Librarianship And Information Science, No. 14)" . + . + . + . + . + . + . + "1985-05"^^ . + "Information Technology And The Third World" . + . + . + . + . + . + . + . + "1979-03"^^ . + "Automatic Text Analysis" . + . + . + . + . + . + . + . + "1974-09"^^ . + "Probabilistic Models For Automatic Indexing" . + . + . + . + . + . + . + . + . + "1975-01"^^ . + "A Decision Theoretic Foundation For Indexing" . + . + . + . + . + . + . + . + . + "1977-09"^^ . + "A Measure Of Class Concentration In Bibliometrics" . + . + . + . + . + . + . + . + "1985-07"^^ . + "Private Acts And Public Objects: An Investigation Of Citer Motivations" . + . + . + . + . + . + . + . + "1981-11"^^ . + "TOXLINE: Evolution Of An Online Interactive Bibliographic Database" . + . + . + . + . + . + . + . + "1977-05"^^ . + "A Very Early Warning System For The Rapid Identification And Transfer Of New Technology" . + . + . + . + . + . + . + . + . + . + . + . + "1977-03"^^ . + "Economic Modeling: An Aid To The Pricing Of Information Services" . + . + . + . + . + . + . + . + "1983-07"^^ . + "The Correlation Between Pertinence And Rate Of Citation Duplication In Multidatabase Searches" . + . + . + . + . + . + . + . + . + "1980-09"^^ . + "Progress In Communication Sciences, Volume 1. Melvin J. Voigt And Gerhard J. Hanneman. Norwood, NJ: ABLEX Publishing Corp.; 1979: 198 Pp. ISBN 0-89391-010-4; ISSN 0163-5689." . + . + . + . + . + . + . + . + "1985-07"^^ . + "Informatics And Small Computers In Latin America" . + . + . + . + . + . + . + . + . + . + "1975-05"^^ . + "Performing Evaluation Studies In Information Science" . + . + . + . + . + . + . + . + . + "1982-11"^^ . + "A Probabilistic Approach To Information Retrieval In Systems With Boolean Search Request Formulations" . + . + . + . + . + . + . + . + "1980-09"^^ . + "An Online Information System For Aggregate State And Local Area Economic Data" . + . + . + . + . + . + . + . + "1975-01"^^ . + "Appendix: Reply To The Williams And Kim Article" . + . + . + . + . + . + . + . + "1980-08"^^ . + "Another Look At OCLC's Potential For Special Libraries" . + . + . + . + . + . + . + . + "1978-07"^^ . + "Relation Of Title Length To Number Of Authors In Journal Articles" . + . + . + . + . + . + . + . + "1980-11"^^ . + "Information And Documentation In Chile: Progress Report. Bibliography 1974-1976" . + . + . + . + . + . + . + . + . + "1977-03"^^ . + "The Informative Act And Its Aftermath: Toward A Predictive Science Of Information" . + . + . + . + . + . + . + . + "1985-07"^^ . + "ALA Glossary Of Library And Information Science. Chicago, IL: American Library Association; 1983: 245 Pp., $50" . + . + . + . + . + . + . + . + "1980-11"^^ . + "Library Networks And Resource Sharing In The United States: An Historical And Philosophical Overview" . + . + . + . + . + . + . + . + "1984-01"^^ . + "Application Of Modern Technologies To Interlibrary Resource-Sharing Networks" . + . + . + . + . + . + . + . + "1975-09"^^ . + "Computer Simulation Of The Circulation Subsystem Of A Library" . + . + . + . + . + . + . + . + "1985-07"^^ . + "The Role Of The British Library R & D Department In Supporting Library And Information Research In The United Kingdom" . + . + . + . + . + . + . + . + "1978-11"^^ . + "Assessing The Benefits And Promise Of An International Information Program (AGRIS)" . + . + . + . + . + . + . + . + . + "1981-09"^^ . + "Subjective Expected Utility: A Model Of Decision-Making" . + . + . + . + . + . + . + . + . + . + "1981-03"^^ . + "Patterns In The Use Of Information: The Right To Be Different" . + . + . + . + . + . + . + . + "1982-11"^^ . + "A Computer Intermediary For Interactive Database Searching. II. Evaluation" . + . + . + . + . + . + . + . + . + . + "1981-05"^^ . + "Information Flow And Analysis: Theory, Simulation, And Experiments. II. Simulation, Examples, And Results" . + . + . + . + . + . + . + . + . + . + "1982-05"^^ . + "Bibliometric Models For Management Of An Information Store. III. Developing An Empirical Model" . + . + . + . + . + . + . + . + "1983-01"^^ . + "The Effect Of Personal, Professional, And Psychological Attributes, And Information Seeking Behavior On The Use Of Information Sources By Educators" . + . + . + . + . + . + . + . + . + . + "1979-11"^^ . + "Towards Everyday Language Information Retrieval Systems Via Minicomputers" . + . + . + . + . + . + . + . + . + "1977-09"^^ . + "Networks For On-Line Data Base Access" . + . + . + . + . + . + . + . + "1981-07"^^ . + "Patterns Of Journal Use In A Departmental Library: A Citation Analysis" . + . + . + . + . + . + . + . + . + "1985-07"^^ . + "A Note About Information Science Research" . + . + . + . + . + . + . + . + "1985-09"^^ . + "Split Size-Rank Models For The Distribution Of Index Terms" . + . + . + . + . + . + . + . + . + "1980-08"^^ . + "Indexing Exhaustivity And The Computation Of Similarity Matrices" . + . + . + . + . + . + . + . + . + "1981-05"^^ . + "Information Flow And Analysis: Theory, Simulation, And Experiments. I. Basic Theoretical And Conceptual Development" . + . + . + . + . + . + . + . + . + . + "1981-05"^^ . + "Lack Of Standardization Of The Journal Title Data Element In Databases" . + . + . + . + . + . + . + . + . + "1983-07"^^ . + "Automatic Query Formulations In Information Retrieval" . + . + . + . + . + . + . + . + . + . + "1985-05"^^ . + "Socioeconomic Conditions Related To Information Activity In Less Developed Countries" . + . + . + . + . + . + . + . + "1985-05"^^ . + "Advanced Feedback Methods In Information Retrieval" . + . + . + . + . + . + . + . + . + . + "1978-09"^^ . + "An Empirical Examination Of Bradford's Law And The Scattering Of Scientific Literature" . + . + . + . + . + . + . + . + . + "1985-11"^^ . + "The Use Of Statistical Methods In Library And Information Science" . + . + . + . + . + . + . + . + "1981-01"^^ . + "The Brillouin Measure Of An Author'S Contribution To A Literature In Psychology" . + . + . + . + . + . + . + . + . + "1981-05"^^ . + "Answer-passage Retrieval" . + . + . + . + . + . + . + . + . + "1977-05"^^ . + "The Roles Of Reviews In Information Transfer" . + . + . + . + . + . + . + . + "1978-09"^^ . + "Highly Cited Old Papers And The Reasons Why They Continue To Be Cited" . + . + . + . + . + . + . + . + . + "1978-07"^^ . + "The Abstract Journal, 1790-1920: Origin, Development And Diffusion. Manzer, Bruce M. Metuchen, NJ, Scarecrow Press; 1977: 321 Pp. Price $12.50" . + . + . + . + . + . + . + . + "1975-03"^^ . + "Abstract Readability As A Factor In Information Systems" . + . + . + . + . + . + . + . + . + "1982-01"^^ . + "Collaboration In Computational Musicology" . + . + . + . + . + . + . + . + "1982-01"^^ . + "Information Resources As “Goods” In The Life Cycle Of Information Production" . + . + . + . + . + . + . + . + "1982-01"^^ . + "Citation Ranking Versus Subjective Evaluation In The Determination Of Journal Hierachies In The Social Sciences" . + . + . + . + . + . + . + . + "1983-09"^^ . + "A Cocitation Map Of The Social Indicators Movement" . + . + . + . + . + . + . + . + "1981-05"^^ . + "Author Cocitation: A Literature Measure Of Intellectual Structure" . + . + . + . + . + . + . + . + . + "1976-05"^^ . + "Relevance Weighting Of Search Terms" . + . + . + . + . + . + . + . + . + "1978-11"^^ . + "Designing A Multilingual Terminology Bank For United States Translators" . + . + . + . + . + . + . + . + "1984-07"^^ . + "Online Searching Styles: A Case-Study-Based Model Of Searching Behavior" . + . + . + . + . + . + . + . + "1976-05"^^ . + "Toward Increased Quality Consciousness For Alcoholism Literature" . + . + . + . + . + . + . + . + "1975-05"^^ . + "Opinion Paper. Operations Research In Libraries: A Critical Assessment" . + . + . + . + . + . + . + . + "1980-03"^^ . + "Online Searching: The Impact On User Charges Of The Extended Use Of Online Information Services. T. P. Barwise. Paris: International Council Of Scientific Unions Abstracting Board; 1979." . + . + . + . + . + . + . + . + "1980-05"^^ . + "Medline: An Introduction To On-Line Searching" . + . + . + . + . + . + . + . + "1975-09"^^ . + "Derivation Of A Sample Of Journal Issues For Tests Of Availability And Use" . + . + . + . + . + . + . + . + "1980-08"^^ . + "Performance Testing Of A Book And Its Index As An Information Retrieval System" . + . + . + . + . + . + . + . + "1979-07"^^ . + "Fluctuations In Ranked Orders Of Periodicals" . + . + . + . + . + . + . + . + "1975-11"^^ . + "Notes On The Gupta-Ravindran Optimal Storage Model" . + . + . + . + . + . + . + . + "1983-09"^^ . + "A Note On “Scholarliness” And “Impact”" . + . + . + . + . + . + . + . + "1984-03"^^ . + "Syntactically Based Indexing" . + . + . + . + . + . + . + . + "1980-09"^^ . + "Feature Comparison Of An In-House Information Retrieval System With A Commercial Search Service" . + . + . + . + . + . + . + . + . + "1985-03"^^ . + "Person-to-person Communication In An Applied Research/Service Delivery Setting" . + . + . + . + . + . + . + . + . + "1980-09"^^ . + "Education And Training" . + . + . + . + . + . + . + . + "1974-09"^^ . + "A General Statistical Model For Increasing Efficiency And Confidence In Manual Data Collection Systems Through Sampling" . + . + . + . + . + . + . + . + . + "1979-11"^^ . + "To Protest Or To Ignore? A Scientist'S Alternatives In Reacting To The Persecution Of His Colleagues" . + . + . + . + . + . + . + . + "1980-11"^^ . + "Data Bases—History Of Development And Trends" . + . + . + . + . + . + . + . + "1983-09"^^ . + "TheALA Filing Rules: Flowcharts Illustrating Their Application, With A Critique And Suggestions For Improvement" . + . + . + . + . + . + . + . + "1981-07"^^ . + "Macro- And Microthesauri: Changes Occurring In MeSH-derived Thesauri And A Solution To Some Related Search Handicaps" . + . + . + . + . + . + . + . + "1978-11"^^ . + "The Importance Of Recall" . + . + . + . + . + . + . + . + "1974-11"^^ . + "An Alpha-Numeric Information Storage And Retrieval System" . + . + . + . + . + . + . + . + "1980-05"^^ . + "Characterizing The Industrial Special Library Universe" . + . + . + . + . + . + . + . + . + "1981-01"^^ . + "Online Systems: History, Technology, And Economics" . + . + . + . + . + . + . + . + "1982-05"^^ . + "Bibliometric Models For Management Of An Information Store. II. Use As A Function Of Age Of Material" . + . + . + . + . + . + . + . + "1980-08"^^ . + "Approaches To Forecasting Demands For Library Network Services" . + . + . + . + . + . + . + . + . + "1978-05"^^ . + "Some Stylistic Variations In Scientific Writing" . + . + . + . + . + . + . + . + "1985-05"^^ . + "International Cooperation In Information Systems And Services" . + . + . + . + . + . + . + . + . + "1983-03"^^ . + "Letters To The Editor" . + . + . + . + . + . + . + . + . + "1979-11"^^ . + "Deficiencies Of Scientific Information Access And Output In Less Developed Countries" . + . + . + . + . + . + . + . + "1984-01"^^ . + "Internationality Of The Social Sciences: Implications For Information Transfer" . + . + . + . + . + . + . + . + "1984-05"^^ . + "Information Science Research: The Search For The Nature Of Information" . + . + . + . + . + . + . + . + "1985-11"^^ . + "Structural Equivalence In A Psychology Journal Network" . + . + . + . + . + . + . + . + "1978-09"^^ . + "Opinion Paper: Science, Shcharansky, And The Soviets" . + . + . + . + . + . + . + . + "1979-07"^^ . + "Depth Of Indexing" . + . + . + . + . + . + . + . + "1984-09"^^ . + "Artificial Intelligence: Concepts, Techniques, Applications, Promise" . + . + . + . + . + . + . + . + . + "1985-03"^^ . + "Online Search Patterns: NLM CATLINE Database" . + . + . + . + . + . + . + . + . + "1984-03"^^ . + "A Drill And Practice Program For Online Retrieval" . + . + . + . + . + . + . + . + . + . + . + "1980-11"^^ . + "Implications Of Holography For Information Systems" . + . + . + . + . + . + . + . + "1985-09"^^ . + "Are There Enduring Patents?" . + . + . + . + . + . + . + . + . + "1985-09"^^ . + "The Personal Computer: Missing Link To The Electronic Journal?" . + . + . + . + . + . + . + . + "1979-05"^^ . + "Utility-theoretic Indexing: A Note On Wilson's Note" . + . + . + . + . + . + . + . + "1982-01"^^ . + "Similarity Measures For Boolean Search Request Formulations" . + . + . + . + . + . + . + . + "1983-05"^^ . + "Information Resources And Organizational Structure" . + . + . + . + . + . + . + . + "1974-11"^^ . + "Making On-Line Search Available In An Industrial Research Environment" . + . + . + . + . + . + . + . + . + . + "1977-09"^^ . + "The Application Of Function Descriptors To The Development Of An Information System Topology" . + . + . + . + . + . + . + . + "1982-03"^^ . + "An Information Transfer Model To Define Information Users And Outputs With Specific Application To Environmental Technology" . + . + . + . + . + . + . + . + . + . + . + "1984-07"^^ . + "A Fuzzy Set Theory Approach To Periodical Binding Decisions" . + . + . + . + . + . + . + . + . + "1976-03"^^ . + "A Library Network Model" . + . + . + . + . + . + . + . + "1983-05"^^ . + "Office Automation Technology And Functions: An Overview" . + . + . + . + . + . + . + . + "1982-05"^^ . + "Some Reflections On Federal Policy For Secondary Information Systems And Services, 1945–1981" . + . + . + . + . + . + . + . + "1984-07"^^ . + "Second-hand Knowledge. An Inquiry Into Cognitive Authority. Patrick Wilson. Greenwood Press, 1983" . + . + . + . + . + . + . + . + "1974-09"^^ . + "User Preference In Published Indexes" . + . + . + . + . + . + . + . + "1981-09"^^ . + "A State Transition Analysis Of Online Information-Seeking Behavior" . + . + . + . + . + . + . + . + "1985-11"^^ . + "Access To Information: The Dream And Reality" . + . + . + . + . + . + . + . + . + "1984-09"^^ . + "Artificial Intelligence: A Selected Bibliography" . + . + . + . + . + . + . + . + "1981-03"^^ . + "Transmission Of Information: An Overview" . + . + . + . + . + . + . + . + "1978-07"^^ . + "The Effect Of Parameter Uncertainties On The Predictions Of A Library Network Model" . + . + . + . + . + . + . + . + . + "1975-09"^^ . + "A Probabilistic Approach To Automatic Keyword Indexing. Part II. An Algorithm For Probabilistic Indexing" . + . + . + . + . + . + . + . + "1979-03"^^ . + "Searching The Chemical Literature Via Three On-Line Vendors: A Comparison" . + . + . + . + . + . + . + . + "1982-05"^^ . + "The Effect Of Subject Matter On The Automatic Indexing Of Full Text" . + . + . + . + . + . + . + . + . + "1981-07"^^ . + "Determination Of The Conservation Time Of Periodicals For Optimal Shelf Maintenance Of A Library" . + . + . + . + . + . + . + . + . + "1982-05"^^ . + "Marketing Secondary Information Products And Services" . + . + . + . + . + . + . + . + "1982-05"^^ . + "Secondary Information Services In Science And Technology: A Wide-Angle View" . + . + . + . + . + . + . + . + "1976-09"^^ . + "Ann-dimensional Retrieval Model" . + . + . + . + . + . + . + . + "1984-11"^^ . + "Longitudinal Author Cocitation Mapping: The Changing Structure Of Macroeconomics" . + . + . + . + . + . + . + . + "1980-05"^^ . + "ComparingPsychological Abstracts andIndex Medicus For Coverage Of The Journal Literature In A Subject Area In Psychology" . + . + . + . + . + . + . + . + "1975-07"^^ . + "Canadian Scientific Journals: Part 1, Coverage" . + . + . + . + . + . + . + . + "1977-11"^^ . + "A Metatheory For The Development Of A Science Of Information" . + . + . + . + . + . + . + . + "1984-09"^^ . + "Introduction And Overview" . + . + . + . + . + . + . + . + . + "1983-03"^^ . + "FASIT: A Fully Automatic Syntactically Based Indexing System" . + . + . + . + . + . + . + . + . + "1980-03"^^ . + "A Progress Report On Information Privacy And Data Security" . + . + . + . + . + . + . + . + "1978-01"^^ . + "Catalog Information And Text As Indicators Of Relevance" . + . + . + . + . + . + . + . + . + . + "1983-09"^^ . + "Information Retrieval: A Sequential Learning Process" . + . + . + . + . + . + . + . + "1983-09"^^ . + "Document Clustering, Using Macro Retrieval Techniques" . + . + . + . + . + . + . + . + "1983-07"^^ . + "The Psychology Of Online Searching" . + . + . + . + . + . + . + . + "1983-01"^^ . + "Exploiting The Maximum Entropy Principle To Increase Retrieval Effectiveness" . + . + . + . + . + . + . + . + "1975-11"^^ . + "RELEVANCE: A Review Of And A Framework For The Thinking On The Notion In Information Science" . + . + . + . + . + . + . + . + "1983-11"^^ . + "Information Providers And Videodisc/Optical Disk Technology" . + . + . + . + . + . + . + . + . + "1983-03"^^ . + "An Investigation Of The Validity Of Bibliographic Citations" . + . + . + . + . + . + . + . + "1984-09"^^ . + "Approaches To Machine Learning" . + . + . + . + . + . + . + . + . + "1984-05"^^ . + "Brief History Of Information Science" . + . + . + . + . + . + . + . + "1978-07"^^ . + "Discipline Impact Factors: A Method For Determining Core Journal Lists" . + . + . + . + . + . + . + . + "1984-01"^^ . + "Co-citation Analysis And The Invisible College" . + . + . + . + . + . + . + . + "1983-05"^^ . + "Human Communication Needs And Organizational Productivity: The Potential Impact Of Office Automation" . + . + . + . + . + . + . + . + . + "1983-05"^^ . + "Some Aspects Of Citation Behavior: A Pilot Study In Business Administration" . + . + . + . + . + . + . + . + "1978-11"^^ . + "Can Retrieval Of Information From Citation Indexes Be Simplified? Multiple Mention Of A Reference As A Characteristic Of The Link Between Cited And Citing Article" . + . + . + . + . + . + . + . + "1981-01"^^ . + "The Relational Model In Information Retrieval" . + . + . + . + . + . + . + . + "1985-09"^^ . + "The Dimensions Of Perceived Accessibility To Information: Implications For The Delivery Of Information Systems And Services" . + . + . + . + . + . + . + . + "1981-03"^^ . + "Information Storage And Display" . + . + . + . + . + . + . + . + "1977-03"^^ . + "Assessing The Impact Of Computer Technology On The Performance Of Interlibrary Loan Networks" . + . + . + . + . + . + . + . + . + "1975-07"^^ . + "Bradford's Law And The Periodical Literature Of Information Science" . + . + . + . + . + . + . + . + "1979-03"^^ . + "Performance Assessment Model For Academic Libraries" . + . + . + . + . + . + . + . + . + . + "1980-05"^^ . + "Journal Of The ASIS Vs. Nachrichten Für Dokumentation: A Comparative Analysis Of Citations" . + . + . + . + . + . + . + . + "1981-09"^^ . + "Introduction" . + . + . + . + . + . + . + . + "1981-07"^^ . + "Machine-readable Output From Online Searches" . + . + . + . + . + . + . + . + "1984-03"^^ . + "Search Interview Techniques And Information Gain As Antecedents Of User Satisfaction With Online Bibliographic Retrieval" . + . + . + . + . + . + . + . + . + "1982-11"^^ . + "Systems Theory And The Meaning Of Information" . + . + . + . + . + . + . + . + "1980-08"^^ . + "Answer-passage Retrieval By Text Searching" . + . + . + . + . + . + . + . + "1977-03"^^ . + "Nephis: A Nested-Phrase Indexing System" . + . + . + . + . + . + . + . + "1984-03"^^ . + "Applications Of Multidimensional Scaling: Comment On “A Method For Studying Intercorrelated Circulation Patterns In Library Systems”" . + . + . + . + . + . + . + . + "1981-11"^^ . + "The Adequacy Of The Science Citation Index (SCI) As An Indicator Of International Scientific Activity" . + . + . + . + . + . + . + . + . + "1975-11"^^ . + "Selecting Computer Resources For Inclusion Within A Pricing System" . + . + . + . + . + . + . + . + "1981-01"^^ . + "Lifetime-citation Rates: A Mathematical Model To Compare Scientists' Work" . + . + . + . + . + . + . + . + . + . + "1975-05"^^ . + "User Training For On-Line Information Retrieval Systems" . + . + . + . + . + . + . + . + "1984-07"^^ . + "An Investigation Of Different String Coding Methods" . + . + . + . + . + . + . + . + "1981-03"^^ . + "Technology And Communication In The Future" . + . + . + . + . + . + . + . + "1979-05"^^ . + "Assessing The Effect Of Computer Augmentation On Staff Productivity" . + . + . + . + . + . + . + . + "1981-07"^^ . + "A Comparison Of Two Systems Of Weighted Boolean Retrieval" . + . + . + . + . + . + . + . + "1976-05"^^ . + "Current Awareness With An Augmented Chemical Titles File" . + . + . + . + . + . + . + . + . + "1982-01"^^ . + "Retrieval Language Of Social Sciences And Natural Sciences: A Statistical Investigation" . + . + . + . + . + . + . + . + "1979-11"^^ . + "A Reply To Robertson'S Diatribe On The Nature Of Fuzz" . + . + . + . + . + . + . + . + "1981-03"^^ . + "Characterization Of Databases In The Agricultural Sciences" . + . + . + . + . + . + . + . + . + "1974-09"^^ . + "Patent Office Classification: Its Whats And Whys" . + . + . + . + . + . + . + . + "1975-07"^^ . + "Use Of Synthetic Text In The Evaluation Of Statistically Based Keyword-Selection Strategies" . + . + . + . + . + . + . + . + "1978-05"^^ . + "A Relationship Between Two Forms Of Bradford's Law" . + . + . + . + . + . + . + . + "1978-01"^^ . + "On Letters To The Editor" . + . + . + . + . + . + . + "1983-11"^^ . + "Basics Of Videodisc And Optical Disk Technology" . + . + . + . + . + . + . + . + "1979-07"^^ . + "An Information Approach To Examining Developments In An Energy Technology: Coal Gasification" . + . + . + . + . + . + . + . + . + . + "1981-09"^^ . + "The Organization And Use Of Information: Contributions Of Information Science, Computational Linguistics And Artificial Intelligence" . + . + . + . + . + . + . + . + "1981-09"^^ . + "Information-processing Models Of Cognition" . + . + . + . + . + . + . + . + "1981-07"^^ . + "The Success-Breeds-Success Phenomenon And Bibliometric Processes" . + . + . + . + . + . + . + . + "1979-07"^^ . + "A Test Of Significance For The Whitworth Distribution" . + . + . + . + . + . + . + . + "1980-09"^^ . + "Toward Usable User Studies" . + . + . + . + . + . + . + . + . + . + "1980-08"^^ . + "The Combined Use Of Bibliographic Coupling And Cocitation For Document Retrieval" . + . + . + . + . + . + . + . + . + "1978-07"^^ . + "Design And Implementation Of An On-Line Chemical Dictionary (CHEMLINE)" . + . + . + . + . + . + . + . + . + . + "1974-11"^^ . + "Circulation Dynamics: A Planning Model" . + . + . + . + . + . + . + . + "1976-09"^^ . + "An Experiment In Networking: The LHNCBC Experimental CAI Network, 1971–1975" . + . + . + . + . + . + . + . + "1980-08"^^ . + "JASIS Publication Statistics" . + . + . + . + . + . + . + . + "1982-03"^^ . + "Automatic Nephis Coding Of Descriptive Titles For Permuted Index Generation" . + . + . + . + . + . + . + . + "1980-11"^^ . + "Energy Technology—A Correction" . + . + . + . + . + . + . + . + "1979-03"^^ . + "An Economist'S Reflections On An Institute For The Advanced Study Of Information Science" . + . + . + . + . + . + . + . + "1977-11"^^ . + "Toward A National Information System For Social Science Data Files" . + . + . + . + . + . + . + . + "1980-03"^^ . + "A Technique For Evaluating Automatic Term Clustering" . + . + . + . + . + . + . + . + . + "1980-05"^^ . + "On-line Systems In Science And Technology" . + . + . + . + . + . + . + . + . + "1982-05"^^ . + "The State Of Secondary Access Services: Social Sciences" . + . + . + . + . + . + . + . + "1977-11"^^ . + "Sociodemographic Correlates Of Intercounty Variations In The Public Library Output" . + . + . + . + . + . + . + . + . + "1978-05"^^ . + "Cliqueing-a Technique For Producing Maximally Connected Clusters" . + . + . + . + . + . + . + . + "1978-05"^^ . + "Automatic Text Analysis Based On Transition Phenomena Of Word Occurrences" . + . + . + . + . + . + . + . + "1976-03"^^ . + "Note" . + . + . + . + . + . + . + "1975-01"^^ . + "Sublanguage Grammers In Science Information Processing" . + . + . + . + . + . + . + . + "1979-03"^^ . + "The Wrong Way To Go" . + . + . + . + . + . + . + . + "1983-01"^^ . + "Editorial" . + . + . + . + . + . + . + . + "1983-07"^^ . + "The Use Of Computer-Monitored Data In Information Science And Communication Research" . + . + . + . + . + . + . + . + . + "1984-05"^^ . + "Trends In Library And Information Science Education" . + . + . + . + . + . + . + . + "1980-11"^^ . + "Introduction" . + . + . + . + . + . + . + . + "1976-09"^^ . + "A Fuzzy Set Characterization Of Interaction In Scientific Research" . + . + . + . + . + . + . + . + "1985-03"^^ . + "Experiments And Analysis Of Information Use And Value In A Decision-Making Context" . + . + . + . + . + . + . + . + . + "1980-03"^^ . + "Education And Training For Computer-Based Reference Services: A Case Study" . + . + . + . + . + . + . + . + "1986-03"^^ . + "Editor's Note" . + . + . + . + . + . + . + . + "1985-07"^^ . + "Electronic Publishing: The Predicament Of Occasional Users In The Editorial Process" . + . + . + . + . + . + . + . + "1982-05"^^ . + "The Future Of Indexing And Abstracting Services" . + . + . + . + . + . + . + . + . + "1978-09"^^ . + "The JASIS KWOC Index" . + . + . + . + . + . + . + . + . + "1979-07"^^ . + "A Sociological Approach To The Design Of Information Systems" . + . + . + . + . + . + . + . + . + . + "1977-09"^^ . + "Journal Evaluation In A Large Research Library" . + . + . + . + . + . + . + . + . + "1978-09"^^ . + "On Optimal Storage Of Books By Size" . + . + . + . + . + . + . + . + . + "1975-03"^^ . + "Review Of Information Retrieval And Documentation In Chemistry. Charles H. Davis And James E. Rush. Westport, Connecticut: Greenwood Press." . + . + . + . + . + . + . + . + "1980-08"^^ . + "Indexing And Behavior" . + . + . + . + . + . + . + . + "1983-01"^^ . + "Towards A Theory Of Document Learning" . + . + . + . + . + . + . + . + "1980-05"^^ . + "Buck's Prime Number Coding Scheme" . + . + . + . + . + . + . + . + . + "1975-11"^^ . + "Patterns Of Citation Densities By Date Of Publication In Physical Review" . + . + . + . + . + . + . + . + "1979-05"^^ . + "Structure Of The Psychological Literature" . + . + . + . + . + . + . + . + . + "1981-05"^^ . + "The Measurement Of Term Importance In Automatic Indexing" . + . + . + . + . + . + . + . + . + . + "1975-05"^^ . + "Letters To The Editor" . + . + . + . + . + . + . + "1984-11"^^ . + "A Review And Application Of Citation Analysis Methodology To Reading Research Journal Literature" . + . + . + . + . + . + . + . + "1977-09"^^ . + "The Effect Of Individual Differences Of Cognitive Style On Judgments Of Document Relevance" . + . + . + . + . + . + . + . + "1979-05"^^ . + "On Types Of Search And The Allocation Of Library Resources" . + . + . + . + . + . + . + . + "1975-03"^^ . + "National Publication And Citation Comparisons" . + . + . + . + . + . + . + . + . + "1983-11"^^ . + "An Experimental Comparison Of The Effectiveness Of Computers And Humans As Search Intermediaries" . + . + . + . + . + . + . + . + "1984-09"^^ . + "Expert Systems: A Tutorial" . + . + . + . + . + . + . + . + . + "1984-07"^^ . + "Informational Dynamics Of Journal Article Titles" . + . + . + . + . + . + . + . + "1975-05"^^ . + "Lotka's Law And Map Librarianship" . + . + . + . + . + . + . + . + "1977-11"^^ . + "Lotka's Frequency Distribution Of Scientific Productivity" . + . + . + . + . + . + . + . + "1983-01"^^ . + "Validity Of Citation Criteria For Assessing The Influence Of Scientific Publications: New Evidence With Peer Assessment" . + . + . + . + . + . + . + . + . + "1976-09"^^ . + "A General Theory Of Bibliometric And Other Cumulative Advantage Processes" . + . + . + . + . + . + . + . + "1984-05"^^ . + "Toward A Paradigm For Information Science: The Influence Of Derek De Solla Price" . + . + . + . + . + . + . + . + "1970-11"^^ . + "Editorial" . + . + . + . + . + . + . + . + "1970-03"^^ . + "Effects Of Cataloging Volume At The Library Of Congress On The Total Cataloging Costs Of American Research Libraries" . + . + . + . + . + . + . + . + . + "1970-03"^^ . + "Analysis Of Indexing Terms For Plastics" . + . + . + . + . + . + . + "1970-01"^^ . + "The Economics Of Information" . + . + . + . + . + . + . + . + "1970-05"^^ . + "A Format For The Standardized Citation Of Both Published And Unpublished Documents" . + . + . + . + . + . + . + . + "1970-01"^^ . + "An Analytical Model Of A Library Network" . + . + . + . + . + . + . + . + "1970-09"^^ . + "Standards For Writing Abstracts" . + . + . + . + . + . + . + . + "1970-03"^^ . + "Deriving Term Relations For A Corpus By Graph Theoretical Clusters" . + . + . + . + . + . + . + . + . + "1970-01"^^ . + "Structure And Effectiveness ofThe Citation Identifier, An Operational Computer Program For Automatic Identification Of Case Citations In Legal Literature" . + . + . + . + . + . + . + . + . + . + . + . + "1970-03"^^ . + "A Data Structure For Information Retrieval" . + . + . + . + . + . + . + . + "1970-03"^^ . + "An Application Of Managerial Cost Accounting To A Science Information Center" . + . + . + . + . + . + . + . + "1970-03"^^ . + "Term-term Correlation For Large Matrices" . + . + . + . + . + . + . + . + "1970-01"^^ . + "Microfilm Finding-Keys: Dual Dictionary" . + . + . + . + . + . + . + . + "1970-01"^^ . + "The Practice Of Charging Users For Information Services: A State Of The Art Report" . + . + . + . + . + . + . + . + "1970-11"^^ . + "The Royal Society Catalogue As An Index To Nineteenth Century American Science" . + . + . + . + . + . + . + . + "1970-09"^^ . + "A Highly Associative Document Retrieval System" . + . + . + . + . + . + . + . + "1970-03"^^ . + "The Corners And Edges Of The Precision-Recall Square" . + . + . + . + . + . + . + . + "1970-09"^^ . + "Cardiovascular Serial Literature: Characteristics, Productive Journals, And Abstracting/Indexing Coverage" . + . + . + . + . + . + . + . + . + "1970-01"^^ . + "Information For Peace Remarks To The American Society For Information Science" . + . + . + . + . + . + . + . + "1970-01"^^ . + "Thesaurus control—The Selection, Grouping, And Cross-Referencing Of Terms For Inclusion In A Coordinate Index Word List" . + . + . + . + . + . + . + . + . + . + "1970-05"^^ . + "Measures Of The Usefulness Of Written Technical Information To Chemical Researchers" . + . + . + . + . + . + . + . + "1970-03"^^ . + "How Many Cards Per File Guide? Optimizing The Two-Level File" . + . + . + . + . + . + . + . + . + "1970-05"^^ . + "Using The TIP System In The ASIS File Management Exercise" . + . + . + . + . + . + . + . + "1970-09"^^ . + "“Quality Control” Applied To The Operations Of A Large- Information System" . + . + . + . + . + . + . + . + . + "1970-01"^^ . + "An Automated Current-Awareness Service For Public Libraries" . + . + . + . + . + . + . + . + . + "1970-01"^^ . + "International High-Energy Physics Preprint Network Emphasizes Institutional Exchange" . + . + . + . + . + . + . + "1970-09"^^ . + "Toward A Theory Of indexing—II" . + . + . + . + . + . + . + . + . + "1970-05"^^ . + "Automatic Processing Of Foreign Language Documents" . + . + . + . + . + . + . + . + "1970-09"^^ . + "Are Titles Of Chemical Papers Becoming More Informative?" . + . + . + . + . + . + . + . + "1970-03"^^ . + "The Potential Usefulness Of Catalog Access Points Other Than Author, Title, And Subject" . + . + . + . + . + . + . + . + "1970-11"^^ . + "Answer-providing Documents: Some Inference Descriptions And Text-Searching Retrieval Results" . + . + . + . + . + . + . + . + "1970-01"^^ . + "Towards A Metascience Of Information: Informatology" . + . + . + . + . + . + . + . + . + "1970-01"^^ . + "Letters To The Editor" . + . + . + . + . + . + . + . + . + . + "1970-05"^^ . + "An Exercise In Computer File Management" . + . + . + . + . + . + . + . + "1970-11"^^ . + "On Deriving Design Equations For Information Retrieval Systems" . + . + . + . + . + . + . + . + "1970-03"^^ . + "The Final Report Of The Comparative Systems Laboratory: A Review" . + . + . + . + . + . + . + . + "1970-01"^^ . + "Title Indexes As Alerting Services In The Chemical And Life Sciences" . + . + . + . + . + . + . + . + "1970-11"^^ . + "Experimentation With Computer-Assisted indexing:American Documentation, Volume 20" . + . + . + . + . + . + . + . + . + . + "1970-09"^^ . + "On The Importance Of Root-Stem Truncation In Word-Frequency Analysis" . + . + . + . + . + . + . + . + . + "1970-01"^^ . + "Editorial" . + . + . + . + . + . + . + . + "1970-01"^^ . + "Evaluation Of A KWIC Index For Library Literature" . + . + . + . + . + . + . + . + "1970-03"^^ . + "An Information Analysis Center Effectiveness Chrestomathy" . + . + . + . + . + . + . + . + "1970-09"^^ . + "Terse Literatures: I. Terse Conclusions" . + . + . + . + . + . + . + . + "1970-05"^^ . + "A Multivariate Statistical Analysis Of The Use Of A Scientific Computer Based Current-Awareness Information Retrieval System" . + . + . + . + . + . + . + . + "1970-09"^^ . + "Obsolescence Of Special Library Periodicals: Sampling Errors And Utility Contours" . + . + . + . + . + . + . + . + "1970-09"^^ . + "Letters To The Editor" . + . + . + . + . + . + . + . + . + . + "1970-05"^^ . + "A Solution To The ASIS File Management Exercise Using RCA's UL/1" . + . + . + . + . + . + . + . + . + "2000-01"^^ . + "Translingual Alteration Of Conceptual Information In Medical Translation" . + . + . + . + . + . + . + . + "2000"^^ . + "Network Organizational Development In The Public Sector: A Case Study Of The Federal Emergency Management Administration (FEMA)" . + . + . + . + . + . + . + . + . + . + . + "1994-12"^^ . + "Where Is Publishing Going? A Perspective On Change" . + . + . + . + . + . + . + . + "1991-12"^^ . + "Historical Note: Out Of The Cloudy Crystal Ball" . + . + . + . + . + . + . + . + "1989-05"^^ . + "Innovation, Pragmaticism, And Technological Continuity: Vannevar Bush's Memex" . + . + . + . + . + . + . + . + . + "1995-09"^^ . + "CHEMCONF: An Experiment In International Online Conferencing" . + . + . + . + . + . + . + . + "1991-12"^^ . + "The Binary Nature Of Continuous Relevance Judgments: A Study Of Users' Perceptions" . + . + . + . + . + . + . + . + "1989-05"^^ . + "Analysis Of Scientific Literature To Assist In Problem Solving" . + . + . + . + . + . + . + . + . + "1992-05"^^ . + "The Retrieval Problem In Photography (1932). Emanuel Goldberg (1881-1970)" . + . + . + . + . + . + . + . + "1991-03"^^ . + "Knowledge Representation Of The Visual Image Of A Title Page" . + . + . + . + . + . + . + . + "1989-05"^^ . + "Introduction And Overview" . + . + . + . + . + . + . + . + . + "1992-01"^^ . + "Technology Transfer Policy: Its Role As A Scientific And Technical Information Policy And Its Impact On Technological Growth" . + . + . + . + . + . + . + . + "1991-08"^^ . + "Graphical Representations Of Electronic Search Patterns" . + . + . + . + . + . + . + . + . + . + "1990-04"^^ . + "Mechanisms For Evaluating Scientific Information And The Role Of Peer Review" . + . + . + . + . + . + . + . + "1990-03"^^ . + "Accelerating Text Searching Through Signature Trees" . + . + . + . + . + . + . + . + . + "1988-09"^^ . + "Part V. The Future. Challenges To Information Science Education" . + . + . + . + . + . + . + . + "1995-01"^^ . + "Domain Analysis, Literary Warrant, And Consensus: The Case Of Fiction Studies" . + . + . + . + . + . + . + . + "1987-05"^^ . + "A Model For The Stopping Behavior Of Users Of Online Systems" . + . + . + . + . + . + . + . + "1987-07"^^ . + "Probabilistic Retrieval And Coordination Level Matching" . + . + . + . + . + . + . + . + "1988-11"^^ . + "Reviewing The Gatekeepers: A Survey Of Referees Of Library Journals" . + . + . + . + . + . + . + . + "1991-05"^^ . + "Applied Bibliometrics: Using Citation Analysis In The Journal Submission Process" . + . + . + . + . + . + . + . + "1988-03"^^ . + "Part I. The IAIMS Initiatives Of NLM. Institutional Planning For Advanced Information Services" . + . + . + . + . + . + . + . + "1987-07"^^ . + "Relationship Between Productivity & Obsolescence" . + . + . + . + . + . + . + . + "1994-10"^^ . + "Requirements For The Development Of GIS-based Group Decision-Support Systems" . + . + . + . + . + . + . + . + "1991-05"^^ . + "A Probabilistic Model For The Distribution Of Authorships" . + . + . + . + . + . + . + . + "1987-05"^^ . + "Knowledge-based Indexing Of The Medical Literature: The Indexing Aid Project" . + . + . + . + . + . + . + . + . + "1991-08"^^ . + "Searchers' Selection Of Search Keys: II. Controlled Vocabulary Or Free-Text Searching" . + . + . + . + . + . + . + . + "1995-06"^^ . + "Coinage Of The Terminformation Science" . + . + . + . + . + . + . + . + "1993-10"^^ . + "Semantic Relationships Between Cited And Citing Articles In Library And Information Science Journals" . + . + . + . + . + . + . + . + . + . + "1990-12"^^ . + "Retrieving Records From A Gigabyte Of Text On A Minicomputer Using Statistical Ranking" . + . + . + . + . + . + . + . + . + "1992-10"^^ . + "Psychological Relevance And Information Science" . + . + . + . + . + . + . + . + "1993-04"^^ . + "Effects Of Search Experience And Subject Knowledge On The Search Tactics Of Novice And Experienced Searchers" . + . + . + . + . + . + . + . + "1995-07"^^ . + "Toward A New Horizon In Information Science: Domain-analysis" . + . + . + . + . + . + . + . + . + "1991-06"^^ . + "Back Of Book Indexes And The Characteristics Of Author And Nonauthor Indexing: Report Of An Exploratory Study" . + . + . + . + . + . + . + . + . + "1988-11"^^ . + "Some Reliability Issues In Very Large Databases" . + . + . + . + . + . + . + . + "1993-01"^^ . + "Questionable Validity Of Poisson Assumptions In A Combined loglinear/MDS Mapping Model" . + . + . + . + . + . + . + . + "1991-12"^^ . + "Rational Normalization Of Concentration Measures" . + . + . + . + . + . + . + . + . + "1995-12"^^ . + "Consumer Health Informatics: Health Information Technology For Consumers" . + . + . + . + . + . + . + . + . + "1994-06"^^ . + "Designing A New Facility For Information Services" . + . + . + . + . + . + . + . + . + "1994-05"^^ . + "Task-oriented Access To Data Files: An Evaluation" . + . + . + . + . + . + . + . + . + . + "1987-07"^^ . + "Sub-Saharan Africa And The Paperless Society" . + . + . + . + . + . + . + . + "1993-10"^^ . + "Distilling Information From Text: The EDS TemplateFiller System" . + . + . + . + . + . + . + . + . + . + . + "1992-04"^^ . + "An Empirically Grounded Model Of The Adoption Of Intellectual Technologies" . + . + . + . + . + . + . + . + "1992-10"^^ . + "A Model For Word Clustering" . + . + . + . + . + . + . + . + . + "1991-12"^^ . + "Information As Thing" . + . + . + . + . + . + . + . + "1994-12"^^ . + "Boon Or Bust? Access To Electronic Publishing By Individuals Using Adaptive Computer Technology" . + . + . + . + . + . + . + . + "1995-09"^^ . + "Chemical Structures At The Desktop: Integrating Drawing Tools With On-Line Registry Files" . + . + . + . + . + . + . + . + . + "1994-06"^^ . + "Information Technology And The University: Integration Strategies For The 21St Century" . + . + . + . + . + . + . + . + "1987-03"^^ . + "Information Content In Textual Data: Revisited For Arabic Text" . + . + . + . + . + . + . + . + . + . + "1990-12"^^ . + "Ten Years Of The Literature Of Online Searching: An Analysis Of Online And Online Review" . + . + . + . + . + . + . + . + "1987-01"^^ . + "Section III. Health Information Analysis Centers, Clearinghouses, And Other Special Projects. Federal Health Information Clearinghouses" . + . + . + . + . + . + . + . + "1990-09"^^ . + "An Oasis Where Many Trails Cross: The Improbable Cocitation Networks Of A Multidiscipline" . + . + . + . + . + . + . + . + "1992-01"^^ . + "An Object-Based Requirements Modeling Method" . + . + . + . + . + . + . + . + . + "1994-12"^^ . + "IPCT Journal: A Case Study Of An Electronic Journal On The Internet" . + . + . + . + . + . + . + . + . + "1994-09"^^ . + "Extending Retrieval Strategies To Networked Environments: Old Ways, New Ways, And A Critical Look At WAIS" . + . + . + . + . + . + . + . + . + . + "1992-03"^^ . + "Models For Hypertext" . + . + . + . + . + . + . + . + . + "1994-04"^^ . + "The Role Of Attorney Mental Models Of Law In Case Relevance Determinations: An Exploratory Analysis" . + . + . + . + . + . + . + . + "1987-03"^^ . + "Commentary On F.W. Horton's “An Information Bill Of Rights”" . + . + . + . + . + . + . + . + "36" . + . + . + . + "1" . + . + . + . + "30" . + . + . + . + "5" . + . + . + . + "1" . + . + . + . + "33" . + . + . + . + "5" . + . + . + . + "24" . + . + . + . + "1" . + . + . + . + "4" . + . + . + . + "27" . + . + . + . + "1" . + . + . + . + "21" . + . + . + . + "4" . + . + . + . + "23" . + . + . + . + "2" . + . + . + . + "22" . + . + . + . + "5" . + . + . + . + "1" . + . + . + . + "2" . + . + . + . + "25" . + . + . + . + "2" . + . + . + . + "4" . + . + . + . + "3" . + . + . + . + "4" . + . + . + . + "6" . + . + . + . + "6" . + . + . + . + "3" . + . + . + . + "4" . + . + . + . + "3" . + . + . + . + "2" . + . + . + . + "4" . + . + . + . + "3" . + . + . + . + "6" . + . + . + . + "1" . + . + . + . + "5" . + . + . + . + "5" . + . + . + . + "6" . + . + . + . + "1" . + . + . + . + "31" . + . + . + . + "5" . + . + . + . + "29" . + . + . + . + "6" . + . + . + . + "32" . + . + . + . + "2" . + . + . + . + "3" . + . + . + . + "28" . + . + . + . + "6" . + . + . + . + "3" . + . + . + . + "4" . + . + . + . + "2" . + . + . + . + "3" . + . + . + . + "6" . + . + . + . + "6" . + . + . + . + "34" . + . + . + . + "1" . + . + . + . + "35" . + . + . + . + "3" . + . + . + . + "3" . + . + . + . + "26" . + . + . + . + "3" . + . + . + . + "2" . + . + . + . + "3" . + . + . + . + "5" . + . + . + . + "6" . + . + . + . + "3" . + . + . + . + "2" . + . + . + . + "1" . + . + . + . + "1" . + . + . + . + "4" . + . + . + . + "5" . + . + . + . + "2" . + . + . + . + "1" . + . + . + . + "4" . + . + . + . + "6" . + . + . + . + "2" . + . + . + . + "5" . + . + . + . + "5" . + . + . + . + "6" . + . + . + . + "4" . + . + . + . + "1" . + . + . + . + "2" . + . + . + . + "5" . + . + . + . + "6" . + . + . + . + "6" . + . + . + . + "1" . + . + . + . + "6" . + . + . + . + "1" . + . + . + . + "3" . + . + . + . + "2" . + . + . + . + "3" . + . + . + . + "2" . + . + . + . + "5" . + . + . + . + "4" . + . + . + . + "4" . + . + . + . + "1" . + . + . + . + "3" . + . + . + . + "2" . + . + . + . + "6" . + . + . + . + "4" . + . + . + . + "4" . + . + . + . + "5" . + . + . + . + "5" . + . + . + . + "2" . + . + . + . + "5" . + . + . + . + "4" . + . + . + . + "2" . + . + . + . + "1" . + . + . + . + "3" . + . + . + . + "5" . + . + . + . + "Journal Of Open Humanities Data"^^ . + . + . + . + . + "2012"^^ . + "Analysing Students’ Use Of Recorded Lectures Through Methodological Triangulation" . + . + . + . + . + . + . + . + . + . + . + "2012"^^ . + "Advances In Intelligent Systems And Computing" . + . + . + . + . + . + . + . + . + . + . + . + . + "2022-09-15"^^ . + "Lung Cavitation: An Unwanted Complication Of Covid-19 Lung Disease" . + . + . + . + . + . + . + . + . + . + . + . + . + "Global Journal For Research Analysis" . + . + . + "Journal Of The American Society For Information Science" . + . + . + . + . + . + . + "43" . + . + . + . + "45" . + . + . + . + "41" . + . + . + . + "42" . + . + . + . + "46" . + . + . + . + "40" . + . + . + . + "44" . + . + . + . + "39" . + . + . + . + "38" . + . + . + . + "51" . + . + . + . + "37" . + . + . + . + "8" . + . + . + . + "3" . + . + . + . + "10" . + . + . + . + "9" . + . + . + . + "5" . + . + . + . + "8" . + . + . + . + "3" . + . + . + . + "6" . + . + . + . + "2" . + . + . + . + "4" . + . + . + . + "4" . + . + . + . + "10" . + . + . + . + "2" . + . + . + . + "7" . + . + . + . + "5" . + . + . + . + "6" . + . + . + . + "1" . + . + . + . + "8" . + . + . + . + "10" . + . + . + . + "5" . + . + . + . + "3" . + . + . + . + "9" . + . + . + . + "3" . + . + . + . + "1" . + . + . + . + "6" . + . + . + . + "3" . + . + . + . + "2" . + . + . + . + "5" . + . + . + . + "4" . + . + . + . + "1" . + . + . + . + "3" . + . + . + . + "2" . + . + . + . + "1" . + . + . + . + "11" . + . + . + . + "4" . + . + . + . + "6" . + . + . + . + "3" . + . + . + . + "1" . + . + . + . + "2" . + . + . + . + "5" . + . + . + . + "2" . + . + . + . + "9" . + . + . + . + "4" . + . + . + . + "Journal Of Clinical Anesthesia"^^ . + . + . + . + . + . + "18" . + . + . + . + "2" . + . + . + . + "International Journal Of Cancer" . + . + . + . + . + . + . + "85" . + . + . + . + "2021-04-19"^^ . + "Review Of: \"Investigating Invalid DOIs In COCI\"" . + . + . + . + . + . + . + "3" . + . + . + . + "Synapse" . + . + . + . + . + . + . + "33" . + . + . + . + "Scientometrics"^^ . + . + . + . + . + . + "2024"^^ . + "The Integration Of The Japan Link Center’s Bibliographic Data Into OpenCitations" . + . + . + . + . + . + . + . + . + . + . + . + "10"^^ . + . + . + . + "9" . + . + . + . + "9" . + . + . + . + "Cancer" . + . + . + . + . + . + . + "85" . + . + . + . + "80" . + . + . + . + "2022-03-18"^^ . + "OECD Economic Surveys: China 2022" . + . + . + . + . + . + . + . + . + . + . + . + "6" . + . + . + . + "8" . + . + . + . + "3" . + . + . + . + "Journal Of Applied Polymer Science" . + . + . + . + . + . + . + "76" . + . + . + . + "65" . + . + . + . + "11" . + . + . + . + "Advanced Materials" . + . + . + . + . + . + . + "13" . + . + . + . + "2006-05"^^ . + "Sudden Asystole Without Any Alerting Signs During Cerebellopontine Angle Surgery" . + . + . + . + . + . + . + . + . + . + . + . + . + "3" . + . + . + . + "1-2" . + . + . + . + "Feddes Repertorium" . + . + . + . + . + . + . + . + "113" . + . + . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<1903::aid-cncr4>3.0.co;2-6" . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<1985::aid-cncr16>3.0.co;2-o" . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<2068::aid-cncr25>3.0.co;2-8" . + . + . + "10.1002/1521-4095(200106)13:11<803::aid-adma806>3.0.co;2-w" . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<1925::aid-cncr7>3.0.co;2-q" . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<2017::aid-cncr20>3.0.co;2-v" . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<2046::aid-cncr23>3.0.co;2-m" . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<1966::aid-cncr13>3.0.co;2-w" . + . + . + "10.1002/(sici)1097-0142(19971101)80:9<1808::aid-cncr18>3.0.co;2-9" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<236::aid-ijc14>3.0.co;2-5" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<228::aid-ijc13>3.0.co;2-9" . + . + . + "10.1002/(sici)1096-9926(199910)60:4<177::aid-tera1>3.0.co;2-z" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<182::aid-ijc6>3.0.co;2-m" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<160::aid-ijc2>3.0.co;2-5" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<192::aid-ijc8>3.0.co;2-f" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<260::aid-ijc18>3.0.co;2-r" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<201::aid-ijc9>3.0.co;2-l" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<248::aid-ijc16>3.0.co;2-v" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<223::aid-ijc12>3.0.co;2-h" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<281::aid-ijc21>3.0.co;2-3" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<289::aid-ijc22>3.0.co;2-t" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<296::aid-ijc23>3.0.co;2-q" . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<2001::aid-cncr18>3.0.co;2-r" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<298::aid-ijc24>3.0.co;2-l" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<253::aid-ijc17>3.0.co;2-u" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<275::aid-ijc20>3.0.co;2-5" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<171::aid-ijc4>3.0.co;2-w" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<166::aid-ijc3>3.0.co;2-l" . + . + . + "10.1002/(sici)1097-0215(20000115)85:2<176::aid-ijc5>3.0.co;2-e" . + . + . + "10.1002/1096-987x(20010415)22:5<488::aid-jcc1020>3.0.co;2-4" . + . + . + "10.1002/(sici)1097-4628(19970718)65:3<525::aid-app12>3.0.co;2-w" . + . + . + "10.1002/(sici)1097-4628(20000523)76:8<1296::aid-app10>3.0.co;2-n" . + . + . + "10.1002/1522-239x(200205)113:1/2<165::aid-fedr165>3.0.co;2-m" . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<2077::aid-cncr27>3.0.co;2-4" . + . + . + "10.1002/1522-239x(200205)113:1/2<161::aid-fedr161>3.0.co;2-1" . + . + . + "10.1002/1522-239x(200205)113:1/2<152::aid-fedr152>3.0.co;2-1" . + . + . + "10.1002/1522-239x(200205)113:1/2<7::aid-fedr7>3.0.co;2-5" . + . + . + "10.1002/1522-239x(200205)113:1/2<107::aid-fedr107>3.0.co;2-1" . + . + . + "10.1002/1522-239x(200205)113:1/2<112::aid-fedr112>3.0.co;2-h" . + . + . + "10.1002/1521-3757(20020201)114:3<457::aid-ange457>3.0.co;2-a" . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<2091::aid-cncr28>3.0.co;2-h" . + . + . + "10.5281/zenodo.4733920" . + . + . + "10.1002/(sici)1098-2396(19990901)33:3<207::aid-syn5>3.0.co;2-8" . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<2023::aid-cncr21>3.0.co;2-2" . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<1885::aid-cncr2>3.0.co;2-o" . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<1996::aid-cncr17>3.0.co;2-h" . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<2073::aid-cncr26>3.0.co;2-j" . + . + . + "10.1002/(sici)1097-0142(19990501)85:9<1958::aid-cncr12>3.0.co;2-u" . + . + . + "311" . + . + . + "297"^^ . + . + . + "78"^^ . + . + . + "3285"^^ . + . + . + "1963"^^ . + . + . + "10.1002/(issn)1096-9926" . + . + . + "0000-0002-9344-1029" . + . + . + "0000-0001-5137-5804" . + . + . + "0000-0003-4115-6215" . + . + . + "1096-9926" . + . + . + "0040-3709" . + . + . + "2194-5357" . + . + . + "2194-5365" . + . + . + "10.1002/(issn)1521-3757" . + . + . + "1521-3757" . + . + . + "0044-8249" . + . + . + "0000-0002-4520-6518" . + . + . + "0000-0002-5658-2308" . + . + . + "0000-0002-3173-4053" . + . + . + "9789048127108" . + . + . + "9781402096327" . + . + . + "10.1007/978-1-4020-9632-7" . + . + . + "10.1007/s11192-022-04367-w" . + . + . + "0000-0002-9812-4065" . + . + . + "0000-0002-6279-3830" . + . + . + "0000-0001-5486-7070"^^ . + . + . + "0000-0003-1934-2396" . + . + . + "W4306682982" . + . + . + "0000-0003-4747-4708" . + . + . + "0000-0002-4816-1968" . + . + . + "2072-5027" . + . + . + "W2221102889" . + . + . + "10.1002/asi.4630360104" . + . + . + "10.1002/asi.4630360105" . + . + . + "10.1002/asi.4630360103" . + . + . + "10.1002/asi.4630360106" . + . + . + "10.1002/asi.4630360102" . + . + . + "10.1002/asi.4630360101" . + . + . + "10.1002/asi.4630300512" . + . + . + "10.1002/asi.4630300104" . + . + . + "10.1002/asi.4630330506" . + . + . + "10.1002/asi.4630300108" . + . + . + "10.1002/asi.4630240110" . + . + . + "10.1002/asi.4630300513" . + . + . + "10.1002/asi.4630330402" . + . + . + "10.1002/asi.4630300502" . + . + . + "10.1002/asi.4630330403" . + . + . + "10.1002/asi.4630330508" . + . + . + "10.1002/asi.4630330404" . + . + . + "10.1002/asi.4630270108" . + . + . + "10.1002/asi.4630270102" . + . + . + "10.1002/asi.4630330515" . + . + . + "10.1002/asi.4630330406" . + . + . + "10.1002/asi.4630300511" . + . + . + "10.1002/asi.4630240102" . + . + . + "10.1002/asi.4630330408" . + . + . + "10.1002/asi.4630300106" . + . + . + "10.1002/asi.4630300105" . + . + . + "10.1002/asi.4630330511" . + . + . + "10.1002/asi.4630330405" . + . + . + "10.1002/asi.4630240114" . + . + . + "10.1002/asi.4630300505" . + . + . + "10.1002/asi.4630300509" . + . + . + "10.1002/asi.4630270105" . + . + . + "10.1002/asi.4630330504" . + . + . + "10.1002/asi.4630330503" . + . + . + "10.1002/asi.4630270109" . + . + . + "10.1002/asi.4630330520" . + . + . + "10.1002/asi.4630240103" . + . + . + "10.1002/asi.4630240107" . + . + . + "10.1002/asi.4630240112" . + . + . + "10.1002/asi.4630270106" . + . + . + "10.1002/asi.4630300503" . + . + . + "10.1002/asi.4630300107" . + . + . + "10.1002/asi.4630330507" . + . + . + "10.1002/asi.4630330514" . + . + . + "10.1002/asi.4630270104" . + . + . + "10.1002/asi.4630300507" . + . + . + "10.1002/asi.4630330517" . + . + . + "10.1002/asi.4630330516" . + . + . + "10.1002/asi.4630240109" . + . + . + "10.1002/asi.4630270114" . + . + . + "10.1002/asi.4630210411" . + . + . + "10.1002/asi.4630270103" . + . + . + "10.1002/asi.4630300506" . + . + . + "10.1002/asi.4630330409" . + . + . + "10.1002/asi.4630300103" . + . + . + "10.1002/asi.4630240105" . + . + . + "10.1002/asi.4630330513" . + . + . + "10.1002/asi.4630270107" . + . + . + "10.1002/asi.4630210414" . + . + . + "10.1002/asi.4630300508" . + . + . + "10.1002/asi.4630330518" . + . + . + "10.1002/asi.4630210406" . + . + . + "10.1002/asi.4630240104" . + . + . + "10.1002/asi.4630300504" . + . + . + "10.1002/asi.4630300109" . + . + . + "10.1002/asi.4630270110" . + . + . + "10.1002/asi.4630300111" . + . + . + "10.1002/asi.4630330407" . + . + . + "10.1002/asi.4630330512" . + . + . + "10.1002/asi.4630240106" . + . + . + "10.1002/asi.4630330510" . + . + . + "10.1002/asi.4630240108" . + . + . + "10.1002/asi.4630330509" . + . + . + "10.1002/asi.4630330505" . + . + . + "10.1002/asi.4630300510" . + . + . + "10.1002/asi.4630210416" . + . + . + "10.1002/asi.4630370105" . + . + . + "10.1002/asi.4630370102" . + . + . + "10.1002/asi.4630370106" . + . + . + "10.1002/asi.4630370104" . + . + . + "10.1002/asi.4630370103" . + . + . + "10.1002/asi.4630370107" . + . + . + "10.1002/asi.4630370511" . + . + . + "10.1002/asi.4630370517" . + . + . + "10.1002/asi.4630370403" . + . + . + "10.1002/asi.4630370606" . + . + . + "10.1002/asi.4630230209" . + . + . + "10.1002/asi.4630230204" . + . + . + "10.1002/asi.4630220503" . + . + . + "10.1002/asi.4630220107" . + . + . + "10.1002/asi.4630230205" . + . + . + "10.1002/asi.4630220205" . + . + . + "10.1002/asi.4630250211" . + . + . + "10.1002/asi.4630220109" . + . + . + "10.1002/asi.4630220404" . + . + . + "10.1002/asi.4630250304" . + . + . + "10.1002/asi.4630220206" . + . + . + "10.1002/asi.4630240403" . + . + . + "10.1002/asi.4630230610" . + . + . + "10.1002/asi.4630220204" . + . + . + "10.1002/asi.4630240603" . + . + . + "10.1002/asi.4630230206" . + . + . + "10.1002/asi.4630220305" . + . + . + "10.1002/asi.4630220405" . + . + . + "10.1002/asi.4630220312" . + . + . + "10.1002/asi.4630230405" . + . + . + "10.1002/asi.4630220509" . + . + . + "10.1002/asi.4630220212" . + . + . + "10.1002/asi.4630220406" . + . + . + "10.1002/asi.4630230303" . + . + . + "10.1002/asi.4630240204" . + . + . + "10.1002/asi.4630250402" . + . + . + "10.1002/asi.4630240307" . + . + . + "10.1002/asi.4630250308" . + . + . + "10.1002/asi.4630240412" . + . + . + "10.1002/asi.4630250313" . + . + . + "10.1002/asi.4630230302" . + . + . + "10.1002/asi.4630240209" . + . + . + "10.1002/asi.4630230609" . + . + . + "10.1002/asi.4630250207" . + . + . + "10.1002/asi.4630230403" . + . + . + "10.1002/asi.4630220606" . + . + . + "10.1002/asi.4630250105" . + . + . + "10.1002/asi.4630220105" . + . + . + "10.1002/asi.4630230208" . + . + . + "10.1002/asi.4630240409" . + . + . + "10.1002/asi.4630220604" . + . + . + "10.1002/asi.4630240506" . + . + . + "10.1002/asi.4630240207" . + . + . + "10.1002/asi.4630230503" . + . + . + "10.1002/asi.4630210611" . + . + . + "10.1002/asi.4630220207" . + . + . + "10.1002/asi.4630230404" . + . + . + "10.1002/asi.4630220304" . + . + . + "10.1002/asi.4630230406" . + . + . + "10.1002/asi.4630230210" . + . + . + "10.1002/asi.4630210610" . + . + . + "10.1002/asi.4630250110" . + . + . + "10.1002/asi.4630230307" . + . + . + "10.1002/asi.4630230310" . + . + . + "10.1002/asi.4630220512" . + . + . + "10.1002/asi.4630250406" . + . + . + "10.1002/asi.4630240205" . + . + . + "10.1002/asi.4630240503" . + . + . + "10.1002/asi.4630220508" . + . + . + "10.1002/asi.4630220104" . + . + . + "10.1002/asi.4630250111" . + . + . + "10.1002/asi.4630250108" . + . + . + "10.1002/asi.4630220215" . + . + . + "10.1002/asi.4630230611" . + . + . + "10.1002/asi.4630220602" . + . + . + "10.1002/asi.4630220211" . + . + . + "10.1002/asi.4630240306" . + . + . + "10.1002/asi.4630220403" . + . + . + "10.1002/asi.4630250209" . + . + . + "10.1002/asi.4630220210" . + . + . + "10.1002/asi.4630240211" . + . + . + "10.1002/asi.4630240509" . + . + . + "10.1002/asi.4630250205" . + . + . + "10.1002/asi.4630220308" . + . + . + "10.1002/asi.4630220504" . + . + . + "10.1002/asi.4630220603" . + . + . + "10.1002/asi.4630250303" . + . + . + "10.1002/asi.4630240308" . + . + . + "10.1002/asi.4630240404" . + . + . + "10.1002/asi.4630240508" . + . + . + "10.1002/asi.4630230107" . + . + . + "10.1002/asi.4630220214" . + . + . + "10.1002/asi.4630250106" . + . + . + "10.1002/asi.4630230111" . + . + . + "10.1002/asi.4630250208" . + . + . + "10.1002/asi.4630250409" . + . + . + "10.1002/asi.4630220411" . + . + . + "10.1002/asi.4630230509" . + . + . + "10.1002/asi.4630220407" . + . + . + "10.1002/asi.4630220506" . + . + . + "10.1002/asi.4630230603" . + . + . + "10.1002/asi.4630250210" . + . + . + "10.1002/asi.4630220311" . + . + . + "10.1002/asi.4630210609" . + . + . + "10.1002/asi.4630220505" . + . + . + "10.1002/asi.4630240606" . + . + . + "10.1002/asi.4630230304" . + . + . + "10.1002/asi.4630220410" . + . + . + "10.1002/asi.4630230409" . + . + . + "10.1002/asi.4630230602" . + . + . + "10.1002/asi.4630250204" . + . + . + "10.1002/asi.4630230102" . + . + . + "10.1002/asi.4630250305" . + . + . + "10.1002/asi.4630250309" . + . + . + "10.1002/asi.4630230506" . + . + . + "10.1002/asi.4630250212" . + . + . + "10.1002/asi.4630250312" . + . + . + "10.1002/asi.4630210607" . + . + . + "10.1002/asi.4630240309" . + . + . + "10.1002/asi.4630220302" . + . + . + "10.1002/asi.4630240502" . + . + . + "10.1002/asi.4630230106" . + . + . + "10.1002/asi.4630240305" . + . + . + "10.1002/asi.4630220110" . + . + . + "10.1002/asi.4630230311" . + . + . + "10.1002/asi.4630230104" . + . + . + "10.1002/asi.4630250103" . + . + . + "10.1002/asi.4630240504" . + . + . + "10.1002/asi.4630250202" . + . + . + "10.1002/asi.4630220608" . + . + . + "10.1002/asi.4630220502" . + . + . + "10.1002/asi.4630220402" . + . + . + "10.1002/asi.4630250405" . + . + . + "10.1002/asi.4630240510" . + . + . + "10.1002/asi.4630230510" . + . + . + "10.1002/asi.4630230606" . + . + . + "10.1002/asi.4630240304" . + . + . + "10.1002/asi.4630250102" . + . + . + "10.1002/asi.4630230308" . + . + . + "10.1002/asi.4630230608" . + . + . + "10.1002/asi.4630230306" . + . + . + "10.1002/asi.4630220306" . + . + . + "10.1002/asi.4630220209" . + . + . + "10.1002/asi.4630240208" . + . + . + "10.1002/asi.4630240407" . + . + . + "10.1002/asi.4630240505" . + . + . + "10.1002/asi.4630250306" . + . + . + "10.1002/asi.4630240602" . + . + . + "10.1002/asi.4630220507" . + . + . + "10.1002/asi.4630250407" . + . + . + "10.1002/asi.4630240411" . + . + . + "10.1002/asi.4630240213" . + . + . + "10.1002/asi.4630230607" . + . + . + "10.1002/asi.4630220307" . + . + . + "10.1002/asi.4630230511" . + . + . + "10.1002/asi.4630230605" . + . + . + "10.1002/asi.4630250109" . + . + . + "10.1002/asi.4630240203" . + . + . + "10.1002/asi.4630220106" . + . + . + "10.1002/asi.4630250203" . + . + . + "10.1002/asi.4630240604" . + . + . + "10.1002/asi.4630230105" . + . + . + "10.1002/asi.4630240512" . + . + . + "10.1002/asi.4630250206" . + . + . + "10.1002/asi.4630250404" . + . + . + "10.1002/asi.4630230505" . + . + . + "10.1002/asi.4630230203" . + . + . + "10.1002/asi.4630230202" . + . + . + "10.1002/asi.4630230508" . + . + . + "10.1002/asi.4630250410" . + . + . + "10.1002/asi.4630220513" . + . + . + "10.1002/asi.4630250403" . + . + . + "10.1002/asi.4630250104" . + . + . + "10.1002/asi.4630250408" . + . + . + "10.1002/asi.4630250307" . + . + . + "10.1002/asi.4630230305" . + . + . + "10.1002/asi.4630220605" . + . + . + "10.1002/asi.4630230309" . + . + . + "10.1002/asi.4630230504" . + . + . + "10.1002/asi.4630220202" . + . + . + "10.1002/asi.4630230604" . + . + . + "10.1002/asi.4630240210" . + . + . + "10.1002/asi.4630230103" . + . + . + "10.1002/asi.4630240302" . + . + . + "10.1002/asi.4630230110" . + . + . + "10.1002/asi.4630250107" . + . + . + "10.1002/asi.4630250310" . + . + . + "10.1002/asi.4630240414" . + . + . + "10.1002/asi.4630220510" . + . + . + "10.1002/asi.4630220203" . + . + . + "10.1002/asi.4630240413" . + . + . + "10.1002/asi.4630240206" . + . + . + "10.1002/asi.4630240607" . + . + . + "10.1002/asi.4630240406" . + . + . + "10.1002/asi.4630240303" . + . + . + "10.1002/asi.4630220409" . + . + . + "10.1002/asi.4630230108" . + . + . + "10.1002/asi.4630230407" . + . + . + "10.1002/asi.4630230507" . + . + . + "10.1002/asi.4630220103" . + . + . + "10.1002/asi.4630240507" . + . + . + "10.1002/asi.4630240408" . + . + . + "10.1002/asi.4630230402" . + . + . + "10.1002/asi.4630240405" . + . + . + "10.1002/asi.4630210608" . + . + . + "10.1002/asi.4630240511" . + . + . + "10.1002/asi.4630220303" . + . + . + "10.1002/asi.4630220412" . + . + . + "10.1002/asi.4630310513" . + . + . + "10.1002/asi.4630290603" . + . + . + "10.1002/asi.4630320203" . + . + . + "10.1002/asi.4630320307" . + . + . + "10.1002/asi.4630280614" . + . + . + "10.1002/asi.4630270309" . + . + . + "10.1002/asi.4630300403" . + . + . + "10.1002/asi.4630320309" . + . + . + "10.1002/asi.4630300210" . + . + . + "10.1002/asi.4630300212" . + . + . + "10.1002/asi.4630360309" . + . + . + "10.1002/asi.4630250614" . + . + . + "10.1002/asi.4630320610" . + . + . + "10.1002/asi.4630340103" . + . + . + "10.1002/asi.4630350311" . + . + . + "10.1002/asi.4630340311" . + . + . + "10.1002/asi.4630260306" . + . + . + "10.1002/asi.4630270205" . + . + . + "10.1002/asi.4630300306" . + . + . + "10.1002/asi.4630270502" . + . + . + "10.1002/asi.4630350606" . + . + . + "10.1002/asi.4630310308" . + . + . + "10.1002/asi.4630310311" . + . + . + "10.1002/asi.4630310207" . + . + . + "10.1002/asi.4630340107" . + . + . + "10.1002/asi.4630270310" . + . + . + "10.1002/asi.4630340303" . + . + . + "10.1002/asi.4630350104" . + . + . + "10.1002/asi.4630280608" . + . + . + "10.1002/asi.4630330106" . + . + . + "10.1002/asi.4630350403" . + . + . + "10.1002/asi.4630360510" . + . + . + "10.1002/asi.4630290208" . + . + . + "10.1002/asi.4630290610" . + . + . + "10.1002/asi.4630310102" . + . + . + "10.1002/asi.4630340412" . + . + . + "10.1002/asi.4630330111" . + . + . + "10.1002/asi.4630340610" . + . + . + "10.1002/asi.4630360204" . + . + . + "10.1002/asi.4630290518" . + . + . + "10.1002/asi.4630350503" . + . + . + "10.1002/asi.4630270208" . + . + . + "10.1002/asi.4630360609" . + . + . + "10.1002/asi.4630320402" . + . + . + "10.1002/asi.4630340304" . + . + . + "10.1002/asi.4630250606" . + . + . + "10.1002/asi.4630260102" . + . + . + "10.1002/asi.4630330204" . + . + . + "10.1002/asi.4630290611" . + . + . + "10.1002/asi.4630310508" . + . + . + "10.1002/asi.4630260505" . + . + . + "10.1002/asi.4630310614" . + . + . + "10.1002/asi.4630300616" . + . + . + "10.1002/asi.4630320112" . + . + . + "10.1002/asi.4630370417" . + . + . + "10.1002/asi.4630360507" . + . + . + "10.1002/asi.4630340609" . + . + . + "10.1002/asi.4630330607" . + . + . + "10.1002/asi.4630280113" . + . + . + "10.1002/asi.4630300209" . + . + . + "10.1002/asi.4630360511" . + . + . + "10.1002/asi.4630330203" . + . + . + "10.1002/asi.4630310108" . + . + . + "10.1002/asi.4630330609" . + . + . + "10.1002/asi.4630280106" . + . + . + "10.1002/asi.4630320308" . + . + . + "10.1002/asi.4630290510" . + . + . + "10.1002/asi.4630280303" . + . + . + "10.1002/asi.4630340416" . + . + . + "10.1002/asi.4630310208" . + . + . + "10.1002/asi.4630330210" . + . + . + "10.1002/asi.4630310204" . + . + . + "10.1002/asi.4630360606" . + . + . + "10.1002/asi.4630280618" . + . + . + "10.1002/asi.4630280209" . + . + . + "10.1002/asi.4630290302" . + . + . + "10.1002/asi.4630360208" . + . + . + "10.1002/asi.4630340606" . + . + . + "10.1002/asi.4630340604" . + . + . + "10.1002/asi.4630350203" . + . + . + "10.1002/asi.4630280104" . + . + . + "10.1002/asi.4630290312" . + . + . + "10.1002/asi.4630320602" . + . + . + "10.1002/asi.4630310612" . + . + . + "10.1002/asi.4630360516" . + . + . + "10.1002/asi.4630280510" . + . + . + "10.1002/asi.4630300608" . + . + . + "10.1002/asi.4630350602" . + . + . + "10.1002/asi.4630320603" . + . + . + "10.1002/asi.4630270510" . + . + . + "10.1002/asi.4630300205" . + . + . + "10.1002/asi.4630300612" . + . + . + "10.1002/asi.4630250602" . + . + . + "10.1002/asi.4630310107" . + . + . + "10.1002/asi.4630270408" . + . + . + "10.1002/asi.4630310314" . + . + . + "10.1002/asi.4630300617" . + . + . + "10.1002/asi.4630310409" . + . + . + "10.1002/asi.4630330611" . + . + . + "10.1002/asi.4630270405" . + . + . + "10.1002/asi.4630320608" . + . + . + "10.1002/asi.4630310403" . + . + . + "10.1002/asi.4630300204" . + . + . + "10.1002/asi.4630360206" . + . + . + "10.1002/asi.4630300203" . + . + . + "10.1002/asi.4630290106" . + . + . + "10.1002/asi.4630330309" . + . + . + "10.1002/asi.4630360207" . + . + . + "10.1002/asi.4630350507" . + . + . + "10.1002/asi.4630310307" . + . + . + "10.1002/asi.4630320303" . + . + . + "10.1002/asi.4630280304" . + . + . + "10.1002/asi.4630310608" . + . + . + "10.1002/asi.4630340209" . + . + . + "10.1002/asi.4630310413" . + . + . + "10.1002/asi.4630310106" . + . + . + "10.1002/asi.4630340418" . + . + . + "10.1002/asi.4630350309" . + . + . + "10.1002/asi.4630330110" . + . + . + "10.1002/asi.4630330209" . + . + . + "10.1002/asi.4630290203" . + . + . + "10.1002/asi.4630300615" . + . + . + "10.1002/asi.4630370320" . + . + . + "10.1002/asi.4630260605" . + . + . + "10.1002/asi.4630250608" . + . + . + "10.1002/asi.4630290308" . + . + . + "10.1002/asi.4630260402" . + . + . + "10.1002/asi.4630290107" . + . + . + "10.1002/asi.4630350207" . + . + . + "10.1002/asi.4630350304" . + . + . + "10.1002/asi.4630270308" . + . + . + "10.1002/asi.4630310105" . + . + . + "10.1002/asi.4630340110" . + . + . + "10.1002/asi.4630360405" . + . + . + "10.1002/asi.4630350206" . + . + . + "10.1002/asi.4630340417" . + . + . + "10.1002/asi.4630280206" . + . + . + "10.1002/asi.4630370310" . + . + . + "10.1002/asi.4630320609" . + . + . + "10.1002/asi.4630340411" . + . + . + "10.1002/asi.4630310507" . + . + . + "10.1002/asi.4630260602" . + . + . + "10.1002/asi.4630360604" . + . + . + "10.1002/asi.4630320108" . + . + . + "10.1002/asi.4630320504" . + . + . + "10.1002/asi.4630340413" . + . + . + "10.1002/asi.4630330112" . + . + . + "10.1002/asi.4630350106" . + . + . + "10.1002/asi.4630280203" . + . + . + "10.1002/asi.4630340105" . + . + . + "10.1002/asi.4630280302" . + . + . + "10.1002/asi.4630260305" . + . + . + "10.1002/asi.4630350506" . + . + . + "10.1002/asi.4630280107" . + . + . + "10.1002/asi.4630300412" . + . + . + "10.1002/asi.4630360313" . + . + . + "10.1002/asi.4630330207" . + . + . + "10.1002/asi.4630310607" . + . + . + "10.1002/asi.4630340506" . + . + . + "10.1002/asi.4630300213" . + . + . + "10.1002/asi.4630290207" . + . + . + "10.1002/asi.4630360307" . + . + . + "10.1002/asi.4630290314" . + . + . + "10.1002/asi.4630330213" . + . + . + "10.1002/asi.4630290204" . + . + . + "10.1002/asi.4630340204" . + . + . + "10.1002/asi.4630260214" . + . + . + "10.1002/asi.4630320409" . + . + . + "10.1002/asi.4630340302" . + . + . + "10.1002/asi.4630270402" . + . + . + "10.1002/asi.4630300406" . + . + . + "10.1002/asi.4630270507" . + . + . + "10.1002/asi.4630360509" . + . + . + "10.1002/asi.4630270411" . + . + . + "10.1002/asi.4630360608" . + . + . + "10.1002/asi.4630320104" . + . + . + "10.1002/asi.4630280606" . + . + . + "10.1002/asi.4630280103" . + . + . + "10.1002/asi.4630360404" . + . + . + "10.1002/asi.4630310304" . + . + . + "10.1002/asi.4630340207" . + . + . + "10.1002/asi.4630330202" . + . + . + "10.1002/asi.4630350609" . + . + . + "10.1002/asi.4630300621" . + . + . + "10.1002/asi.4630340205" . + . + . + "10.1002/asi.4630260106" . + . + . + "10.1002/asi.4630250503" . + . + . + "10.1002/asi.4630320111" . + . + . + "10.1002/asi.4630260603" . + . + . + "10.1002/asi.4630290605" . + . + . + "10.1002/asi.4630290305" . + . + . + "10.1002/asi.4630250612" . + . + . + "10.1002/asi.4630290414" . + . + . + "10.1002/asi.4630340403" . + . + . + "10.1002/asi.4630250603" . + . + . + "10.1002/asi.4630360508" . + . + . + "10.1002/asi.4630310104" . + . + . + "10.1002/asi.4630280607" . + . + . + "10.1002/asi.4630360212" . + . + . + "10.1002/asi.4630330608" . + . + . + "10.1002/asi.4630340405" . + . + . + "10.1002/asi.4630320411" . + . + . + "10.1002/asi.4630310202" . + . + . + "10.1002/asi.4630350202" . + . + . + "10.1002/asi.4630320607" . + . + . + "10.1002/asi.4630270407" . + . + . + "10.1002/asi.4630360304" . + . + . + "10.1002/asi.4630350204" . + . + . + "10.1002/asi.4630340409" . + . + . + "10.1002/asi.4630250506" . + . + . + "10.1002/asi.4630320311" . + . + . + "10.1002/asi.4630290411" . + . + . + "10.1002/asi.4630350111" . + . + . + "10.1002/asi.4630340208" . + . + . + "10.1002/asi.4630360209" . + . + . + "10.1002/asi.4630290406" . + . + . + "10.1002/asi.4630270207" . + . + . + "10.1002/asi.4630320505" . + . + . + "10.1002/asi.4630330308" . + . + . + "10.1002/asi.4630270412" . + . + . + "10.1002/asi.4630270304" . + . + . + "10.1002/asi.4630310603" . + . + . + "10.1002/asi.4630300604" . + . + . + "10.1002/asi.4630260406" . + . + . + "10.1002/asi.4630340415" . + . + . + "10.1002/asi.4630300215" . + . + . + "10.1002/asi.4630310509" . + . + . + "10.1002/asi.4630280605" . + . + . + "10.1002/asi.4630350102" . + . + . + "10.1002/asi.4630320410" . + . + . + "10.1002/asi.4630360506" . + . + . + "10.1002/asi.4630260204" . + . + . + "10.1002/asi.4630320518" . + . + . + "10.1002/asi.4630300313" . + . + . + "10.1002/asi.4630300214" . + . + . + "10.1002/asi.4630270307" . + . + . + "10.1002/asi.4630270503" . + . + . + "10.1002/asi.4630350604" . + . + . + "10.1002/asi.4630270504" . + . + . + "10.1002/asi.4630310404" . + . + . + "10.1002/asi.4630290410" . + . + . + "10.1002/asi.4630310209" . + . + . + "10.1002/asi.4630320513" . + . + . + "10.1002/asi.4630290512" . + . + . + "10.1002/asi.4630270206" . + . + . + "10.1002/asi.4630320204" . + . + . + "10.1002/asi.4630270203" . + . + . + "10.1002/asi.4630350108" . + . + . + "10.1002/asi.4630260405" . + . + . + "10.1002/asi.4630310407" . + . + . + "10.1002/asi.4630290505" . + . + . + "10.1002/asi.4630270404" . + . + . + "10.1002/asi.4630270410" . + . + . + "10.1002/asi.4630290407" . + . + . + "10.1002/asi.4630290507" . + . + . + "10.1002/asi.4630260407" . + . + . + "10.1002/asi.4630310510" . + . + . + "10.1002/asi.4630320103" . + . + . + "10.1002/asi.4630260208" . + . + . + "10.1002/asi.4630280114" . + . + . + "10.1002/asi.4630330211" . + . + . + "10.1002/asi.4630320105" . + . + . + "10.1002/asi.4630320206" . + . + . + "10.1002/asi.4630260506" . + . + . + "10.1002/asi.4630310312" . + . + . + "10.1002/asi.4630310609" . + . + . + "10.1002/asi.4630310309" . + . + . + "10.1002/asi.4630300309" . + . + . + "10.1002/asi.4630310417" . + . + . + "10.1002/asi.4630320109" . + . + . + "10.1002/asi.4630260404" . + . + . + "10.1002/asi.4630260105" . + . + . + "10.1002/asi.4630320208" . + . + . + "10.1002/asi.4630360310" . + . + . + "10.1002/asi.4630340505" . + . + . + "10.1002/asi.4630280502" . + . + . + "10.1002/asi.4630280115" . + . + . + "10.1002/asi.4630250514" . + . + . + "10.1002/asi.4630290206" . + . + . + "10.1002/asi.4630330302" . + . + . + "10.1002/asi.4630280506" . + . + . + "10.1002/asi.4630340310" . + . + . + "10.1002/asi.4630310210" . + . + . + "10.1002/asi.4630300307" . + . + . + "10.1002/asi.4630320106" . + . + . + "10.1002/asi.4630290104" . + . + . + "10.1002/asi.4630280108" . + . + . + "10.1002/asi.4630260304" . + . + . + "10.1002/asi.4630310302" . + . + . + "10.1002/asi.4630360512" . + . + . + "10.1002/asi.4630360315" . + . + . + "10.1002/asi.4630350210" . + . + . + "10.1002/asi.4630280105" . + . + . + "10.1002/asi.4630310316" . + . + . + "10.1002/asi.4630340203" . + . + . + "10.1002/asi.4630360613" . + . + . + "10.1002/asi.4630290307" . + . + . + "10.1002/asi.4630270403" . + . + . + "10.1002/asi.4630310103" . + . + . + "10.1002/asi.4630300303" . + . + . + "10.1002/asi.4630290309" . + . + . + "10.1002/asi.4630350217" . + . + . + "10.1002/asi.4630350208" . + . + . + "10.1002/asi.4630340108" . + . + . + "10.1002/asi.4630260109" . + . + . + "10.1002/asi.4630290313" . + . + . + "10.1002/asi.4630310505" . + . + . + "10.1002/asi.4630300611" . + . + . + "10.1002/asi.4630330105" . + . + . + "10.1002/asi.4630360306" . + . + . + "10.1002/asi.4630290409" . + . + . + "10.1002/asi.4630360605" . + . + . + "10.1002/asi.4630320313" . + . + . + "10.1002/asi.4630270409" . + . + . + "10.1002/asi.4630290205" . + . + . + "10.1002/asi.4630270202" . + . + . + "10.1002/asi.4630370206" . + . + . + "10.1002/asi.4630260108" . + . + . + "10.1002/asi.4630300414" . + . + . + "10.1002/asi.4630310602" . + . + . + "10.1002/asi.4630270508" . + . + . + "10.1002/asi.4630350608" . + . + . + "10.1002/asi.4630350310" . + . + . + "10.1002/asi.4630350303" . + . + . + "10.1002/asi.4630350502" . + . + . + "10.1002/asi.4630350407" . + . + . + "10.1002/asi.4630330303" . + . + . + "10.1002/asi.4630290607" . + . + . + "10.1002/asi.4630260209" . + . + . + "10.1002/asi.4630260207" . + . + . + "10.1002/asi.4630280211" . + . + . + "10.1002/asi.4630360308" . + . + . + "10.1002/asi.4630300216" . + . + . + "10.1002/asi.4630250505" . + . + . + "10.1002/asi.4630260107" . + . + . + "10.1002/asi.4630280508" . + . + . + "10.1002/asi.4630360402" . + . + . + "10.1002/asi.4630320605" . + . + . + "10.1002/asi.4630280305" . + . + . + "10.1002/asi.4630280205" . + . + . + "10.1002/asi.4630340410" . + . + . + "10.1002/asi.4630310516" . + . + . + "10.1002/asi.4630360406" . + . + . + "10.1002/asi.4630260303" . + . + . + "10.1002/asi.4630330603" . + . + . + "10.1002/asi.4630310504" . + . + . + "10.1002/asi.4630260103" . + . + . + "10.1002/asi.4630310412" . + . + . + "10.1002/asi.4630290408" . + . + . + "10.1002/asi.4630310610" . + . + . + "10.1002/asi.4630280207" . + . + . + "10.1002/asi.4630360408" . + . + . + "10.1002/asi.4630310606" . + . + . + "10.1002/asi.4630350107" . + . + . + "10.1002/asi.4630260503" . + . + . + "10.1002/asi.4630360411" . + . + . + "10.1002/asi.4630290604" . + . + . + "10.1002/asi.4630320519" . + . + . + "10.1002/asi.4630320205" . + . + . + "10.1002/asi.4630330602" . + . + . + "10.1002/asi.4630320306" . + . + . + "10.1002/asi.4630330305" . + . + . + "10.1002/asi.4630340111" . + . + . + "10.1002/asi.4630300606" . + . + . + "10.1002/asi.4630280503" . + . + . + "10.1002/asi.4630320405" . + . + . + "10.1002/asi.4630360407" . + . + . + "10.1002/asi.4630360502" . + . + . + "10.1002/asi.4630310411" . + . + . + "10.1002/asi.4630320305" . + . + . + "10.1002/asi.4630320310" . + . + . + "10.1002/asi.4630340406" . + . + . + "10.1002/asi.4630360314" . + . + . + "10.1002/asi.4630360311" . + . + . + "10.1002/asi.4630290506" . + . + . + "10.1002/asi.4630360610" . + . + . + "10.1002/asi.4630320110" . + . + . + "10.1002/asi.4630320312" . + . + . + "10.1002/asi.4630280306" . + . + . + "10.1002/asi.4630290504" . + . + . + "10.1002/asi.4630290415" . + . + . + "10.1002/asi.4630260206" . + . + . + "10.1002/asi.4630330107" . + . + . + "10.1002/asi.4630330108" . + . + . + "10.1002/asi.4630330109" . + . + . + "10.1002/asi.4630340502" . + . + . + "10.1002/asi.4630320302" . + . + . + "10.1002/asi.4630270302" . + . + . + "10.1002/asi.4630290606" . + . + . + "10.1002/asi.4630350404" . + . + . + "10.1002/asi.4630270305" . + . + . + "10.1002/asi.4630260302" . + . + . + "10.1002/asi.4630310212" . + . + . + "10.1002/asi.4630310310" . + . + . + "10.1002/asi.4630260502" . + . + . + "10.1002/asi.4630310406" . + . + . + "10.1002/asi.4630300413" . + . + . + "10.1002/asi.4630260608" . + . + . + "10.1002/asi.4630340508" . + . + . + "10.1002/asi.4630350216" . + . + . + "10.1002/asi.4630310503" . + . + . + "10.1002/asi.4630360205" . + . + . + "10.1002/asi.4630310511" . + . + . + "10.1002/asi.4630250507" . + . + . + "10.1002/asi.4630300609" . + . + . + "10.1002/asi.4630310613" . + . + . + "10.1002/asi.4630340503" . + . + . + "10.1002/asi.4630320403" . + . + . + "10.1002/asi.4630290612" . + . + . + "10.1002/asi.4630250607" . + . + . + "10.1002/asi.4630310313" . + . + . + "10.1002/asi.4630320113" . + . + . + "10.1002/asi.4630330304" . + . + . + "10.1002/asi.4630310405" . + . + . + "10.1002/asi.4630290306" . + . + . + "10.1002/asi.4630360305" . + . + . + "10.1002/asi.4630340210" . + . + . + "10.1002/asi.4630300607" . + . + . + "10.1002/asi.4630350103" . + . + . + "10.1002/asi.4630350313" . + . + . + "10.1002/asi.4630360611" . + . + . + "10.1002/asi.4630290503" . + . + . + "10.1002/asi.4630300409" . + . + . + "10.1002/asi.4630350504" . + . + . + "10.1002/asi.4630360203" . + . + . + "10.1002/asi.4630350211" . + . + . + "10.1002/asi.4630310611" . + . + . + "10.1002/asi.4630360503" . + . + . + "10.1002/asi.4630360505" . + . + . + "10.1002/asi.4630300310" . + . + . + "10.1002/asi.4630330104" . + . + . + "10.1002/asi.4630340309" . + . + . + "10.1002/asi.4630250605" . + . + . + "10.1002/asi.4630280505" . + . + . + "10.1002/asi.4630330206" . + . + . + "10.1002/asi.4630350406" . + . + . + "10.1002/asi.4630270204" . + . + . + "10.1002/asi.4630340307" . + . + . + "10.1002/asi.4630330312" . + . + . + "10.1002/asi.4630350410" . + . + . + "10.1002/asi.4630250502" . + . + . + "10.1002/asi.4630320503" . + . + . + "10.1002/asi.4630360607" . + . + . + "10.1002/asi.4630350510" . + . + . + "10.1002/asi.4630320210" . + . + . + "10.1002/asi.4630290405" . + . + . + "10.1002/asi.4630260504" . + . + . + "10.1002/asi.4630300208" . + . + . + "10.1002/asi.4630330306" . + . + . + "10.1002/asi.4630320406" . + . + . + "10.1002/asi.4630330313" . + . + . + "10.1002/asi.4630330310" . + . + . + "10.1002/asi.4630270511" . + . + . + "10.1002/asi.4630350607" . + . + . + "10.1002/asi.4630310303" . + . + . + "10.1002/asi.4630260409" . + . + . + "10.1002/asi.4630280604" . + . + . + "10.1002/asi.4630350505" . + . + . + "10.1002/asi.4630340202" . + . + . + "10.1002/asi.4630310203" . + . + . + "10.1002/asi.4630290105" . + . + . + "10.1002/asi.4630340504" . + . + . + "10.1002/asi.4630340507" . + . + . + "10.1002/asi.4630340407" . + . + . + "10.1002/asi.4630340106" . + . + . + "10.1002/asi.4630260604" . + . + . + "10.1002/asi.4630340608" . + . + . + "10.1002/asi.4630340206" . + . + . + "10.1002/asi.4630350509" . + . + . + "10.1002/asi.4630350308" . + . + . + "10.1002/asi.4630290403" . + . + . + "10.1002/asi.4630350105" . + . + . + "10.1002/asi.4630340308" . + . + . + "10.1002/asi.4630340305" . + . + . + "10.1002/asi.4630290608" . + . + . + "10.1002/asi.4630320107" . + . + . + "10.1002/asi.4630360504" . + . + . + "10.1002/asi.4630320211" . + . + . + "10.1002/asi.4630280204" . + . + . + "10.1002/asi.4630260403" . + . + . + "10.1002/asi.4630300206" . + . + . + "10.1002/asi.4630310315" . + . + . + "10.1002/asi.4630320515" . + . + . + "10.1002/asi.4630320404" . + . + . + "10.1002/asi.4630350205" . + . + . + "10.1002/asi.4630330610" . + . + . + "10.1002/asi.4630310402" . + . + . + "10.1002/asi.4630280208" . + . + . + "10.1002/asi.4630350209" . + . + . + "10.1002/asi.4630320606" . + . + . + "10.1002/asi.4630260606" . + . + . + "10.1002/asi.4630320102" . + . + . + "10.1002/asi.4630260307" . + . + . + "10.1002/asi.4630350408" . + . + . + "10.1002/asi.4630320212" . + . + . + "10.1002/asi.4630300304" . + . + . + "10.1002/asi.4630320407" . + . + . + "10.1002/asi.4630270306" . + . + . + "10.1002/asi.4630330102" . + . + . + "10.1002/asi.4630300610" . + . + . + "10.1002/asi.4630320202" . + . + . + "10.1002/asi.4630250504" . + . + . + "10.1002/asi.4630260411" . + . + . + "10.1002/asi.4630290311" . + . + . + "10.1002/asi.4630290102" . + . + . + "10.1002/asi.4630340607" . + . + . + "10.1002/asi.4630300404" . + . + . + "10.1002/asi.4630320516" . + . + . + "10.1002/asi.4630320517" . + . + . + "10.1002/asi.4630320408" . + . + . + "10.1002/asi.4630300410" . + . + . + "10.1002/asi.4630310506" . + . + . + "10.1002/asi.4630310408" . + . + . + "10.1002/asi.4630290404" . + . + . + "10.1002/asi.4630250604" . + . + . + "10.1002/asi.4630270509" . + . + . + "10.1002/asi.4630310415" . + . + . + "10.1002/asi.4630330208" . + . + . + "10.1002/asi.4630310615" . + . + . + "10.1002/asi.4630300211" . + . + . + "10.1002/asi.4630280603" . + . + . + "10.1002/asi.4630310205" . + . + . + "10.1002/asi.4630310305" . + . + . + "10.1002/asi.4630330311" . + . + . + "10.1002/asi.4630280609" . + . + . + "10.1002/asi.4630290304" . + . + . + "10.1002/asi.4630290303" . + . + . + "10.1002/asi.4630270215" . + . + . + "10.1002/asi.4630260104" . + . + . + "10.1002/asi.4630300202" . + . + . + "10.1002/asi.4630340102" . + . + . + "10.1002/asi.4630340404" . + . + . + "10.1002/asi.4630350312" . + . + . + "10.1002/asi.4630310605" . + . + . + "10.1002/asi.4630270506" . + . + . + "10.1002/asi.4630360202" . + . + . + "10.1002/asi.4630310206" . + . + . + "10.1002/asi.4630370216" . + . + . + "10.1002/asi.4630360403" . + . + . + "10.1002/asi.4630330315" . + . + . + "10.1002/asi.4630290514" . + . + . + "10.1002/asi.4630300408" . + . + . + "10.1002/asi.4630280509" . + . + . + "10.1002/asi.4630290508" . + . + . + "10.1002/asi.4630260210" . + . + . + "10.1002/asi.4630310414" . + . + . + "10.1002/asi.4630340104" . + . + . + "10.1002/asi.4630310317" . + . + . + "10.1002/asi.4630260607" . + . + . + "10.1002/asi.4630300308" . + . + . + "10.1002/asi.4630320304" . + . + . + "10.1002/asi.4630260310" . + . + . + "10.1002/asi.4630350605" . + . + . + "10.1002/asi.4630280507" . + . + . + "10.1002/asi.4630300305" . + . + . + "10.1002/asi.4630260203" . + . + . + "10.1002/asi.4630340605" . + . + . + "10.1002/asi.4630350508" . + . + . + "10.1002/asi.4630350405" . + . + . + "10.1002/asi.4630260308" . + . + . + "10.1002/asi.4630280610" . + . + . + "10.1002/asi.4630340109" . + . + . + "10.1002/asi.4630270505" . + . + . + "10.1002/asi.4630350302" . + . + . + "10.1002/asi.4630210602" . + . + . + "10.1002/asi.4630210205" . + . + . + "10.1002/asi.4630210213" . + . + . + "10.1002/asi.4630210116" . + . + . + "10.1002/asi.4630210306" . + . + . + "10.1002/asi.4630210111" . + . + . + "10.1002/asi.4630210507" . + . + . + "10.1002/asi.4630210202" . + . + . + "10.1002/asi.4630210104" . + . + . + "10.1002/asi.4630210208" . + . + . + "10.1002/asi.4630210212" . + . + . + "10.1002/asi.4630210211" . + . + . + "10.1002/asi.4630210114" . + . + . + "10.1002/asi.4630210112" . + . + . + "10.1002/asi.4630210604" . + . + . + "10.1002/asi.4630210504" . + . + . + "10.1002/asi.4630210214" . + . + . + "10.1002/asi.4630210505" . + . + . + "10.1002/asi.4630210103" . + . + . + "10.1002/asi.4630210110" . + . + . + "10.1002/asi.4630210303" . + . + . + "10.1002/asi.4630210206" . + . + . + "10.1002/asi.4630210308" . + . + . + "10.1002/asi.4630210511" . + . + . + "10.1002/asi.4630210107" . + . + . + "10.1002/asi.4630210117" . + . + . + "10.1002/asi.4630210508" . + . + . + "10.1002/asi.4630210305" . + . + . + "10.1002/asi.4630210506" . + . + . + "10.1002/asi.4630210203" . + . + . + "10.1002/asi.4630210606" . + . + . + "10.1002/asi.4630210115" . + . + . + "10.1002/asi.4630210118" . + . + . + "10.1002/asi.4630210307" . + . + . + "10.1002/asi.4630210603" . + . + . + "10.1002/asi.4630210210" . + . + . + "10.1002/asi.4630210105" . + . + . + "10.1002/asi.4630210605" . + . + . + "10.1002/asi.4630210509" . + . + . + "10.1002/asi.4630210102" . + . + . + "10.1002/asi.4630210106" . + . + . + "10.1002/asi.4630210209" . + . + . + "10.1002/asi.4630210502" . + . + . + "10.1002/asi.4630210302" . + . + . + "10.1002/asi.4630210503" . + . + . + "10.1002/asi.4630210512" . + . + . + "10.1002/asi.4630210310" . + . + . + "10.1002/1097-4571(2000)9999:9999<::aid-asi1006>3.0.co;2-#" . + . + . + "10.1002/1097-4571(2000)9999:9999<::aid-asi1004>3.0.co;2-5" . + . + . + "10.1002/(sici)1097-4571(199412)45:10<730::aid-asi3>3.0.co;2-w" . + . + . + "10.1002/(sici)1097-4571(199112)42:10<747::aid-asi8>3.0.co;2-7" . + . + . + "10.1002/(sici)1097-4571(198905)40:3<214::aid-asi12>3.0.co;2-k" . + . + . + "10.1002/(sici)1097-4571(199509)46:8<611::aid-asi9>3.0.co;2-w" . + . + . + "10.1002/(sici)1097-4571(199112)42:10<754::aid-asi9>3.0.co;2-c" . + . + . + "10.1002/(sici)1097-4571(198905)40:3<152::aid-asi3>3.0.co;2-k" . + . + . + "10.1002/(sici)1097-4571(199205)43:4<295::aid-asi4>3.0.co;2-u" . + . + . + "10.1002/(sici)1097-4571(199103)42:2<99::aid-asi3>3.0.co;2-v" . + . + . + "10.1002/(sici)1097-4571(198905)40:3<158::aid-asi6>3.0.co;2-u" . + . + . + "10.1002/(sici)1097-4571(199201)43:1<80::aid-asi8>3.0.co;2-a" . + . + . + "10.1002/(sici)1097-4571(199108)42:7<469::aid-asi2>3.0.co;2-d" . + . + . + "10.1002/(sici)1097-4571(199004)41:3<216::aid-asi13>3.0.co;2-6" . + . + . + "10.1002/(sici)1097-4571(199003)41:2<79::aid-asi1>3.0.co;2-6" . + . + . + "10.1002/(sici)1097-4571(198809)39:5<362::aid-asi17>3.0.co;2-b" . + . + . + "10.1002/(sici)1097-4571(199501)46:1<30::aid-asi4>3.0.co;2-f" . + . + . + "10.1002/(sici)1097-4571(198705)38:3<211::aid-asi10>3.0.co;2-u" . + . + . + "10.1002/(sici)1097-4571(198707)38:4<239::aid-asi4>3.0.co;2-6" . + . + . + "10.1002/(sici)1097-4571(198811)39:6<400::aid-asi3>3.0.co;2-q" . + . + . + "10.1002/(sici)1097-4571(199105)42:4<308::aid-asi7>3.0.co;2-m" . + . + . + "10.1002/(sici)1097-4571(198803)39:2<105::aid-asi7>3.0.co;2-l" . + . + . + "10.1002/(sici)1097-4571(198707)38:4<307::aid-asi14>3.0.co;2-7" . + . + . + "10.1002/(sici)1097-4571(199410)45:9<669::aid-asi4>3.0.co;2-p" . + . + . + "10.1002/(sici)1097-4571(199105)42:4<279::aid-asi4>3.0.co;2-o" . + . + . + "10.1002/(sici)1097-4571(198705)38:3<184::aid-asi7>3.0.co;2-f" . + . + . + "10.1002/(sici)1097-4571(199108)42:7<501::aid-asi5>3.0.co;2-v" . + . + . + "10.1002/(sici)1097-4571(199506)46:5<384::aid-asi8>3.0.co;2-3" . + . + . + "10.1002/(sici)1097-4571(199310)44:9<543::aid-asi4>3.0.co;2-f" . + . + . + "10.1002/(sici)1097-4571(199012)41:8<581::aid-asi4>3.0.co;2-u" . + . + . + "10.1002/(sici)1097-4571(199210)43:9<602::aid-asi3>3.0.co;2-q" . + . + . + "10.1002/(sici)1097-4571(199304)44:3<161::aid-asi5>3.0.co;2-8" . + . + . + "10.1002/(sici)1097-4571(199507)46:6<400::aid-asi2>3.0.co;2-y" . + . + . + "10.1002/(sici)1097-4571(199106)42:5<341::aid-asi4>3.0.co;2-7" . + . + . + "10.1002/(sici)1097-4571(198811)39:6<408::aid-asi4>3.0.co;2-#" . + . + . + "10.1002/(sici)1097-4571(199301)44:1<57::aid-asi6>3.0.co;2-v" . + . + . + "10.1002/(sici)1097-4571(199112)42:10<715::aid-asi4>3.0.co;2-s" . + . + . + "10.1002/(sici)1097-4571(199512)46:10<783::aid-asi11>3.0.co;2-l" . + . + . + "10.1002/(sici)1097-4571(199406)45:5<342::aid-asi11>3.0.co;2-j" . + . + . + "10.1002/(sici)1097-4571(199405)45:4<251::aid-asi3>3.0.co;2-4" . + . + . + "10.1002/(sici)1097-4571(198707)38:4<298::aid-asi10>3.0.co;2-t" . + . + . + "10.1002/(sici)1097-4571(199310)44:9<493::aid-asi1>3.0.co;2-m" . + . + . + "10.1002/(sici)1097-4571(199204)43:3<210::aid-asi3>3.0.co;2-n" . + . + . + "10.1002/(sici)1097-4571(199210)43:9<616::aid-asi4>3.0.co;2-a" . + . + . + "10.1002/(sici)1097-4571(199112)42:10<758::aid-asi11>3.0.co;2-4" . + . + . + "10.1002/(sici)1097-4571(199412)45:10<753::aid-asi6>3.0.co;2-c" . + . + . + "10.1002/(sici)1097-4571(199509)46:8<623::aid-asi12>3.0.co;2-2" . + . + . + "10.1002/(sici)1097-4571(199406)45:5<323::aid-asi6>3.0.co;2-m" . + . + . + "10.1002/(sici)1097-4571(198703)38:2<133::aid-asi8>3.0.co;2-p" . + . + . + "10.1002/(sici)1097-4571(199012)41:8<560::aid-asi2>3.0.co;2-4" . + . + . + "10.1002/(sici)1097-4571(198701)38:1<48::aid-asi9>3.0.co;2-8" . + . + . + "10.1002/(sici)1097-4571(199009)41:6<459::aid-asi14>3.0.co;2-5" . + . + . + "10.1002/(sici)1097-4571(199201)43:1<62::aid-asi6>3.0.co;2-c" . + . + . + "10.1002/(sici)1097-4571(199412)45:10<771::aid-asi9>3.0.co;2-7" . + . + . + "10.1002/(sici)1097-4571(199409)45:8<561::aid-asi4>3.0.co;2-c" . + . + . + "10.1002/(sici)1097-4571(199203)43:2<183::aid-asi11>3.0.co;2-s" . + . + . + "10.1002/(sici)1097-4571(199404)45:3<186::aid-asi8>3.0.co;2-f" . + . + . + "10.1002/(sici)1097-4571(198703)38:2<130::aid-asi7>3.0.co;2-0" . + . + . + "1096-987X" . + . + . + "10.1002/(issn)1096-987x" . + . + . + "0192-8651" . + . + . + "2059-481X"^^ . + . + . + "10.1007/978-3-642-30859-8_14" . + . + . + "9783642308581" . + . + . + "9783642308598" . + . + . + "10.36106/gjra/9300981" . + . + . + "1097-4571" . + . + . + "10.1002/(issn)1097-4571" . + . + . + "0002-8231" . + . + . + "0000-0002-5604-5692" . + . + . + "0000-0001-9401-6182" . + . + . + "0952-8180"^^ . + . + . + "0000-0002-7620-1496" . + . + . + "0000-0003-4114-074X" . + . + . + "10.1002/(issn)1097-0215" . + . + . + "1097-0215" . + . + . + "0020-7136" . + . + . + "10.32388/x2dx81" . + . + . + "0000-0002-3016-9742" . + . + . + "0000-0003-0293-0829" . + . + . + "0000-0001-6639-5533" . + . + . + "0000-0002-2829-1829"^^ . + . + . + "0000-0003-1376-8409" . + . + . + "0000-0002-5005-2672" . + . + . + "0000-0001-5260-199X" . + . + . + "0000-0003-4372-2241" . + . + . + "10.1002/(issn)1098-2396" . + . + . + "1098-2396" . + . + . + "0887-4476" . + . + . + "0000-0002-1515-0090" . + . + . + "10.1007/978-3-642-30859-8" . + . + . + "1588-2861"^^ . + . + . + "0138-9130"^^ . + . + . + "S4210240912"^^ . + . + . + "0000-0001-6435-7509" . + . + . + "0000-0001-5366-5194"^^ . + . + . + "0000-0003-0530-4305"^^ . + . + . + "17262"^^ . + . + . + "21849"^^ . + . + . + "0000-0002-3030-6874" . + . + . + "0000-0002-7762-3703" . + . + . + "0000-0002-1527-8350" . + . + . + "10.5334/johd.178" . + . + . + "0009-0008-1466-7742" . + . + . + "0000-0002-8420-0696"^^ . + . + . + "0009-0003-7161-9310" . + . + . + "W2127410217" . + . + . + "S155967237"^^ . + . + . + "0000-0002-5284-2993" . + . + . + "0000-0002-0838-9028" . + . + . + "0000-0002-5436-1296" . + . + . + "W4221051054" . + . + . + "W3153150899" . + . + . + "S148561398"^^ . + . + . + "10.1002/(issn)1097-0142" . + . + . + "1097-0142" . + . + . + "0008-543X" . + . + . + "10.1787/b0e499cf-en" . + . + . + "9789264799318" . + . + . + "9789264960114" . + . + . + "9789264597587" . + . + . + "9789264759596" . + . + . + "16731339" . + . + . + "W3214893238" . + . + . + "W4249829199" . + . + . + "0000-0001-7363-6737" . + . + . + "0000-0002-8300-7261" . + . + . + "1097-4628" . + . + . + "10.1002/(issn)1097-4628" . + . + . + "0021-8995" . + . + . + "1521-4095" . + . + . + "10.1002/(issn)1521-4095" . + . + . + "0935-9648" . + . + . + "10.1016/j.jclinane.2005.12.014" . + . + . + "W1555136325" . + . + . + "S2764905038" . + . + . + "0000-0002-2133-8735" . + . + . + "0000-0002-6391-4198" . + . + . + "0000-0002-8444-8472" . + . + . + "0000-0002-4668-5848" . + . + . + "1522-239X" . + . + . + "10.1002/(issn)1522-239x" . + . + . + "0374-6577" . + . + . + "0014-8962" . + . + . + "0000-0003-2098-4759"^^ . + . + . + "0000-0002-8239-5020"^^ . + . + . + "S4210223649" . + . + . + "Saito" . + "Misato" . + . + "Okamoto" . + "Aikou" . + . + "Kohno" . + "Takashi" . + . + "Takakura" . + "Satoshi" . + . + "Shinozaki" . + "Hideo" . + . + "Isonishi" . + "Seiji" . + . + "Yasuhara" . + "Takaomi" . + . + "Yoshimura" . + "Tomoaki" . + . + "Ohtake" . + "Yasuyuki" . + . + "Ochiai" . + "Kazunori" . + . + "Wahlqvist" . + "Yngve" . + . + "Elsevier Bv" . + . + "Yokota" . + "Jun" . + . + "Tanaka" . + "Tadao" . + . + "Scotiniotis" . + "Ilias A." . + . + "Rokkas" . + "Theodore" . + . + "Furth" . + "Emma E." . + . + "Rigas" . + "Basil" . + . + "Shiff" . + "Steven J." . + . + "Baba" . + "Miyako" . + . + "Iishi" . + "Hiroyasu" . + . + "Tatsuta" . + "Masaharu" . + . + "Lannering" . + "Birgitta" . + . + "Hemminki" . + "Kari" . + . + "Dong" . + "Chuanhui" . + . + "Middleton" . + "Mark R." . + . + "Kelly" . + "Jane" . + . + "Thatcher" . + "Nicholas" . + . + "Donnelly" . + "Dorothy J." . + . + "McElhinney" . + "R. Stanley" . + . + "McMurry" . + "T. Brian H." . + . + "McCormick" . + "Joan E." . + . + "Margison" . + "Geoffrey P." . + . + "Koehler" . + "Pete J." . + . + "Boivin-Angèle" . + "Sandra" . + . + "Lefrançois" . + "Lydie" . + . + "Froment" . + "Olivier" . + . + "Spiethoff" . + "Andreas" . + . + "Bogdanffy" . + "Matthew S." . + . + "Wegener" . + "Kurt" . + . + "Wesch" . + "Horst" . + . + "Barbin" . + "Alain" . + . + "Bancel" . + "Brigitte" . + . + "Trépo" . + "Christian" . + . + "Twijnstra" . + "Albert" . + . + "Bartsch" . + "Helmut" . + . + "Swenberg" . + "James" . + . + "Marion" . + "Marie-Jeanne" . + . + "Zanetta" . + "Lucia" . + . + "Marcus" . + "Stuart G." . + . + "Vasile" . + "Julie" . + . + "Dobryansky" . + "Michael" . + . + "Cohen" . + "Henry" . + . + "Eng" . + "Kenneth" . + . + "Shamamian" . + "Peter" . + . + "Fung" . + "Man C." . + . + "Mignatti" . + "Paolo" . + . + "Geisen" . + "Caroline" . + . + "Denk" . + "Claudia" . + . + "Küpper" . + "Jan-Heiner" . + . + "Schwarz" . + "Elisabeth" . + . + "Barbierato" . + "Massimo" . + . + "Ometto" . + "Lucia" . + . + "Zanchetta" . + "Marisa" . + . + "Chieco-Bianchi" . + "Luigi" . + . + "Jack" . + "Noreen" . + . + "Storniolo" . + "Anna Maria" . + . + "Edwards" . + "Jeffrey" . + . + "Dhanessar" . + "William" . + . + "Benjamin" . + "Hess" . + . + "Bartholomew" . + "Courtenay" . + . + "Robbins" . + "Paul" . + . + "Moonka" . + "Dilip" . + . + "Loh" . + "Elwyn" . + . + "Marincola" . + "Francesco" . + . + "Patel" . + "Amy" . + . + "Guerry" . + "DuPont" . + . + "Nguyen" . + "Binh" . + . + "Herlyn" . + "Dorothee" . + . + "Usuda" . + "Jitsuo" . + . + "Saijo" . + "Nagahiro" . + . + "Fukuoka" . + "Kazuya" . + . + "Zenodo" . + . + "Fukumoto" . + "Hisao" . + . + "Kuh" . + "Hyo-Jeong" . + . + "Nakamura" . + "Takashi" . + . + "Koh" . + "Yasuhiro" . + . + "Suzuki" . + "Toshihiro" . + . + "Koizumi" . + "Fumiaki" . + . + "Arning" . + "Michael" . + . + "Tamura" . + "Tomohide" . + . + "Kato" . + "Harubumi" . + . + "Nishio" . + "Kazuto" . + . + "Ribatti" . + "Domenico" . + . + "Vacca" . + "Angelo" . + . + "Marzullo" . + "Andrea" . + . + "Nico" . + "Beatrice" . + . + "Roncali" . + "Luisa" . + . + "Dammacco" . + "Franco" . + . + "Fouchard" . + "Nathalie" . + . + "Brookfield" . + "William" . + . + "Couppie" . + "Pierre" . + . + "Develoux" . + "Michel" . + . + "Mauclere" . + "Philippe" . + . + "Michel" . + "Philippe" . + . + "Herve" . + "Vincent" . + . + "Pradinaud" . + "Roger" . + . + "Bestetti" . + "Giovanna" . + . + "Huerre" . + "Michel" . + . + "De Thé" . + "Guy" . + . + "Gessain" . + "Antoine" . + . + "Vigil" . + "James" . + . + "Slotkin" . + "Theodore A." . + . + "Moon" . + "Aree" . + . + "Kim" . + "Mi-Sung" . + . + "Kim" . + "Tae-Gyun" . + . + "Kim" . + "Seung-Hee" . + . + "Kim" . + "Harold E." . + . + "Kim" . + "Hyeong-Reh Choi" . + . + "Rassokhin" . + "Dmitrii N." . + . + "Lobanov" . + "Victor S." . + . + "Dounis" . + "Dimitrios V." . + . + "Wilkes" . + "Garth L." . + . + "Gupta" . + "Prakash C." . + . + "Chisholm" . + "B. J." . + . + "Zimmer" . + "J. G." . + . + "Molitoris" . + "H. P." . + . + "Watling" . + "R." . + . + "Perini" . + "C." . + . + "Bonini" . + "I." . + . + "Romagnoli" . + "P." . + . + "Antonini" . + "D." . + . + "Antonini" . + "M." . + . + "Moreno" . + "G." . + . + "Hebert" . + "James R." . + . + "Horak" . + "E." . + . + "Altés" . + "A." . + . + "Schmidt" . + "A." . + . + "Scholler" . + "M." . + . + "Braun" . + "U." . + . + "Crous" . + "P. W." . + . + "Pons" . + "N." . + . + "Carpino" . + "Louis A." . + . + "Imazumi" . + "Hideko" . + . + "El-Faham" . + "Ayman" . + . + "Bhonsle" . + "Ramesh B." . + . + "Ferrer" . + "Fernando J." . + . + "Zhang" . + "Chongwu" . + . + "Lee" . + "Yunsub" . + . + "Foxman" . + "Bruce M." . + . + "Henklein" . + "Peter" . + . + "Hanay" . + "Christiane" . + . + "Mügge" . + "Clemens" . + . + "Wenschuh" . + "Holger" . + . + "Klose" . + "Jana" . + . + "Beyermann" . + "Michael" . + . + "Murti" . + "P. R." . + . + "Bienert" . + "Michael" . + . + "Mehta" . + "Hemali" . + . + "Mehta" . + "Fali S." . + . + "Makris" . + "Andreas" . + . + "Powles" . + "Trevor J." . + . + "Kakolyris" . + "Stelios" . + . + "Dowsett" . + "Mitch" . + . + "Andrews" . + "James E." . + . + "Ashley" . + "Sue E." . + . + "Robinson" . + "Eliezer" . + . + "Segal" . + "Ruth" . + . + "Struminger" . + "Lily" . + . + "Faraggi" . + "David" . + . + "El'ad-Yarum" . + "Ruchama" . + . + "Mekori" . + "Tamar" . + . + "Kreuzer" . + "Michaela" . + . + "Kreienbrock" . + "Lothar" . + . + "Eck" . + "W." . + . + "Geyer" . + "W." . + . + "Stadler" . + "V." . + . + "Weimann" . + "T." . + . + "Hinze" . + "P." . + . + "Grunze" . + "M." . + . + "M�ller" . + "Klaus M." . + . + "Segawa" . + "Tomoya" . + . + "Gerken" . + "Michael" . + . + "Wichmann" . + "Erich" . + . + "Pintos" . + "Javier" . + . + "Franco" . + "Eduardo L." . + . + "Black" . + "Martin J." . + . + "Bergeron" . + "Jean" . + . + "Arella" . + "Maximilien" . + . + "Jones" . + "Glenn W." . + . + "Rosenthal" . + "Donald" . + . + "Wilson" . + "Lynn D." . + . + "Sasagawa" . + "Toshiyuki" . + . + "Jeyarajah" . + "Arjun R." . + . + "Skates" . + "Steven" . + . + "Oram" . + "David H." . + . + "Yang" . + "Tsai-Shen" . + . + "Hsu" . + "Kuan-Cheng" . + . + "Chiang" . + "Jy-Ming" . + . + "Tang" . + "Reiping" . + . + "Chen" . + "Jinn-Shium" . + . + "Changchien" . + "Chung-Rong" . + . + "Wang" . + "Jeng-Yi" . + . + "Yamazaki" . + "Hiroshi" . + . + "Cheng" . + "Liang" . + . + "Bostwick" . + "David G." . + . + "Li" . + "Guang" . + . + "Wang" . + "Quanhong" . + . + "Hu" . + "Nan" . + . + "Vortmeyer" . + "Alexander O." . + . + "Yeh" . + "S.Y." . + . + "Dersch" . + "C." . + . + "Rothman" . + "R." . + . + "Cadet" . + "J.L." . + . + "Zhuang" . + "Zhengping" . + . + "Scheithauer" . + "Bernd W." . + . + "Stafford" . + "Scott L." . + . + "Lohse" . + "Christine M." . + . + "Sakaike" . + "Jun" . + . + "Wollan" . + "Peter C." . + . + "Keel" . + "Suzanne B." . + . + "Rosenberg" . + "Andrew E." . + . + "El-Shami" . + "Khaled M." . + . + "Tirosh" . + "Boaz" . + . + "Popovic" . + "Dan" . + . + "Carmon" . + "Lior" . + . + "Tzehoval" . + "Esther" . + . + "Vadai" . + "Ezra" . + . + "Feldman" . + "Michael" . + . + "Ishikawa" . + "Hiroshi" . + . + "Visted" . + "Therese" . + . + "Thorsen" . + "Jon" . + . + "Ulvestad" . + "Elling" . + . + "Engebraaten" . + "Olav" . + . + "Sørensen" . + "Dag" . + . + "Ylä-Herttuala" . + "Seppo" . + . + "Tyynela" . + "Kristina" . + . + "Rucklidge" . + "Garry" . + . + "Edvardsen" . + "Klaus" . + . + "Bjerkvig" . + "Rolf" . + . + "Inoue" . + "Masaki" . + . + "Lund-Johansen" . + "Morten" . + . + "Torisu" . + "Hitoe" . + . + "Ono" . + "Mayumi" . + . + "Kiryu" . + "Hiromaro" . + . + "Furue" . + "Masutaka" . + . + "Ohmoto" . + "Yasukazu" . + . + "Nakayama" . + "Juichiro" . + . + "Nishioka" . + "Yasuhiko" . + . + "Sone" . + "Saburo" . + . + "Kuwano" . + "Michihiko" . + . + "Hjalmars" . + "Ulf" . + . + . + "Wiley" . + . + . + "Springer Science And Business Media Llc"^^ . + . + . + "Elsevier Bv"^^ . + . + . + "Ubiquity Press, Ltd."^^ . + . + . + "Organisation For Economic Co-Operation And Development (Oecd)"^^ . + . + . + "Borgman" . + "Christine" . + . + . + "Case" . + "Donald" . + . + . + "Robertson" . + "Stephen" . + . + . + "Voorhees" . + "Ellen" . + . + . + "Prieta"^^ . + "Fernando De La"^^ . + . + . + "Lacoste" . + "Vincent" . + . + . + "Porter" . + "Alan" . + . + . + "Cioffi" . + "Alessia" . + . + . + "Coppini" . + "Sara" . + . + . + "Moretti"^^ . + "Arianna"^^ . + . + . + "Tekaia" . + "Fredj" . + . + . + "Chen" . + "Yongquan" . + . + . + "Eisenbach" . + "Lea" . + . + . + "Peroni"^^ . + "Silvio"^^ . + "Peroni Silvio" . + . + "Shaw" . + "W. M." . + . + "Lucier" . + "Richard E." . + . + "Dooley" . + "James F." . + . + "Doreian" . + "Patrick" . + . + "Fararo" . + "Thomas J." . + . + "Burton" . + "Hilary D." . + . + "Wang" . + "Yih-Chen" . + . + "Vandendorpe" . + "James" . + . + "Evens" . + "Martha" . + . + "Can" . + "Fazli" . + . + "Ozkarahan" . + "Esen A." . + . + "Halpin" . + "Peter" . + . + "Knight" . + "John E." . + . + "Artandi" . + "Susan" . + . + "Lawani" . + "Stephen M." . + . + "Kraft" . + "Donald H." . + . + "Liesener" . + "James W." . + . + "Friedlander" . + "Janet" . + . + "Pratt" . + "Allan D." . + . + "Leatherdale" . + "Donald" . + . + "Meadow" . + "Charles T." . + . + "Davis" . + "Charles H." . + . + "Shaw" . + "Debora" . + . + "Turoff" . + "Murray" . + . + "Hiltz" . + "Starr Roxanne" . + . + "Macleod" . + "Ian A." . + . + "Rosenberg" . + "Victor" . + . + "Dillon" . + "Martin" . + . + "Bonzi" . + "Susan" . + . + "Carroll" . + "John M." . + . + "Niehoff" . + "R. T." . + . + "Peritz" . + "Bluma C." . + . + "Fedorowicz" . + "Jane" . + . + "Ozog" . + "Stanley" . + . + "Leimkuhler" . + "Ferdinand F." . + . + "Marsh" . + "Fred E." . + . + "Sullo" . + "Pasquale" . + . + "Wallace" . + "William A." . + . + "Triscari" . + "Thomas" . + . + "Chazen" . + "Cathy A." . + . + "Davis" . + "James F." . + . + "Davis" . + "Charles H." . + . + "Shaw" . + "Debora" . + . + "Stanoulov" . + "Nicolay" . + . + "Mansfield" . + "Jerry W." . + . + "Swanson" . + "Rowena W." . + . + "Baokstein" . + "Abraham" . + . + "Avramescu" . + "Aurel" . + . + "Larson" . + "Julian R." . + . + "Bernhard" . + "Gail A." . + . + "Padin" . + "Mary Ellen" . + . + "Thomas" . + "Robert J." . + . + "Willett" . + "Peter" . + . + "Swanson" . + "Rowena Weiss" . + . + "Meadow" . + "Charles T." . + . + "Clarke" . + "Dan C." . + . + "Bennett" . + "John L." . + . + "Elchesen" . + "Dennis R." . + . + "Rosenberq" . + "Victor" . + . + "Bennion" . + "Bruce C." . + . + "Neuton" . + "Laurence A." . + . + "Smith" . + "J. Macgregor" . + . + "Rouse" . + "Nilliam B." . + . + "Lawton" . + "Stephen B." . + . + "Auster" . + "Ethel" . + . + "To" . + "David" . + . + "Fedorowicz" . + "Jane" . + . + "Meadow" . + "Charles T." . + . + "Hewett" . + "Thomas T." . + . + "Aversa" . + "Elizabeth S." . + . + "Narin" . + "Francis" . + . + "Pinski" . + "Gabriel" . + . + "Gee" . + "Helen Hofer" . + . + "Bates" . + "Marcia J." . + . + "Taylor" . + "Robert S." . + . + "Faber" . + "Roman F." . + . + "Murastkiewicz" . + "Mieczyslaw M." . + . + "Nowicki" . + "Zbigniew M." . + . + "Golashvili" . + "T. V." . + . + "Byrne" . + "Jerry R." . + . + "Belzer" . + "Jack" . + . + "Meincke" . + "Peter P. M." . + . + "Atherton" . + "Pauline" . + . + "Nitecki" . + "Joseph Z." . + . + "Dillon" . + "Martin" . + . + "Federhart" . + "Peggy" . + . + "Dattola" . + "Robert T." . + . + "Ashmole" . + "R. F." . + . + "Smith" . + "D. E." . + . + "Stern" . + "B. T." . + . + "Mcdonough" . + "Carol C." . + . + "Morrow" . + "Deanna I." . + . + "Jerman" . + "Max" . + . + "Cleveland" . + "Ana Divino" . + . + "Cleveland" . + "Donald B." . + . + "Allan" . + "Robert J." . + . + "Weil" . + "Ben H." . + . + "Virgo" . + "Julie A." . + . + "Wood" . + "James L." . + . + "Flanagan" . + "Carolyn" . + . + "Kennedy" . + "H. Edward" . + . + "Mcgrath" . + "William E." . + . + "Radhakrishnan" . + "T." . + . + "Kernizan" . + "R." . + . + "Montgomery" . + "K. Leon" . + . + "Bulick" . + "Stephen" . + . + "Fetterman" . + "John" . + . + "Kent" . + "Allen" . + . + "Davison" . + "David" . + . + "Cozzens" . + "Susan E." . + . + "Poyer" . + "Robert K." . + . + "Tague" . + "Jean" . + . + "Carroll" . + "John" . + . + "Maron" . + "M. E." . + . + "Bottle" . + "R. T." . + . + "Artandi" . + "Susan" . + . + "Momenee" . + "Karen" . + . + "Casper" . + "Cheryl A." . + . + "Rush" . + "James E." . + . + "Pao" . + "Miranda Lee" . + . + "Griffiths" . + "Alan" . + . + "Luckhurst" . + "H. Claire" . + . + "Willett" . + "Peter" . + . + "Brooks" . + "Terrence A." . + . + "Mahapatra" . + "Manoranjan" . + . + "Biswas" . + "Subal Chandra" . + . + "Grant" . + "Frances L." . + . + "Main" . + "Robert G." . + . + "Fidel" . + "Raya" . + . + "Shaw" . + "W. M." . + . + "Levine" . + "Marilyn M." . + . + "Hurt" . + "C. D." . + . + "McGrath" . + "William E." . + . + "Crampon" . + "Jean E." . + . + "Cornog" . + "Martha" . + . + "Glickert" . + "Peter" . + . + "Lehnus" . + "Donald J." . + . + "Williams" . + "J. H." . + . + "Blanken" . + "Robert R." . + . + "Svenonius" . + "Elaine" . + . + "Beck" . + "Leonard N." . + . + "Oppenheim" . + "C." . + . + "Burns" . + "Robert W." . + . + "Rosenberg" . + "Victor" . + . + "Tallman" . + "Johanna E." . + . + "Avramescu" . + "Aurel" . + . + "Artandi" . + "Susan" . + . + "Bookstein" . + "Abraham" . + . + "Shera" . + "Jesse H." . + . + "Cooper" . + "William S." . + . + "Katzer" . + "Jeffrey" . + . + "Jones" . + "K. Sparck" . + . + "Barber" . + "E. O." . + . + "Rush" . + "J. E." . + . + "Salvador" . + "R." . + . + "Preschel" . + "Barbara H." . + . + "Chen" . + "Ching-Chih" . + . + "Davis" . + "Charles H." . + . + "Kearney" . + "W. Robert" . + . + "Davis" . + "Bonnie M." . + . + "Saracevic" . + "Tefko" . + . + "Shoffner" . + "Ralph M." . + . + "Jain" . + "A. K." . + . + "Cooper" . + "William S." . + . + "Rush" . + "Barbara" . + . + "Steinberg" . + "Sam" . + . + "Kraft" . + "Donald H." . + . + "Salton" . + "G." . + . + "Sandison" . + "Alexander" . + . + "Levine" . + "Emil H." . + . + "Cooper" . + "William S." . + . + "Lowe" . + "Thomas C." . + . + "Roberts" . + "David C." . + . + "Martin" . + "Thomas H." . + . + "Carlisle" . + "James" . + . + "Treu" . + "Siegfried" . + . + "Melnyk" . + "Vera" . + . + "Carmon" . + "James L." . + . + "Nance" . + "Richard E." . + . + "Korfhage" . + "Robert R." . + . + "Bhat" . + "U. Narayan" . + . + "Paisley" . + "William" . + . + "Gupta" . + "Anand B." . + . + "Shirey" . + "Donald L." . + . + "Debons" . + "Anthony" . + . + "Lovins" . + "Julie B." . + . + "Wright" . + "William R." . + . + "Yerkey" . + "A. Neil" . + . + "Helmuth" . + "Nancy A." . + . + "Mitchell" . + "P. C." . + . + "Rickman" . + "J. T." . + . + "Walden" . + "W. E." . + . + "Saracevic" . + "Tefko" . + . + "Perk" . + "Lawrence J." . + . + "Meadow" . + "Charles T." . + . + "Richmond" . + "Phyllis A." . + . + "Holmes" . + "C. R. G." . + . + "Holbrook" . + "Iola Belle" . + . + "Secebarth" . + "C." . + . + "Howard" . + "John V." . + . + "Roth" . + "Dana L." . + . + "O'Hara" . + "F. M." . + . + "McAllister" . + "Caryl" . + . + "Bell" . + "John M." . + . + "Rzasa" . + "Philip V." . + . + "Baker" . + "Norman R." . + . + "Wallace" . + "L." . + . + "Schultz" . + "Claire K." . + . + "Starks" . + "David D." . + . + "Horn" . + "Barbara J." . + . + "Slavens" . + "Thomas P." . + . + "Swanson" . + "Rowena W." . + . + "Brandhorst" . + "W. T." . + . + "Terrant" . + "S. W." . + . + "Lipetz" . + "Ben-Ami" . + . + "Douville" . + "Judith A." . + . + "Krevitt" . + "Beth" . + . + "Griffith" . + "Belver C." . + . + "Cooper" . + "W. S." . + . + "Steinacker" . + "Ivo" . + . + "Mathis" . + "Betty A." . + . + "Rush" . + "James E." . + . + "Young" . + "Carol E." . + . + "Amick" . + "Daniel James" . + . + "Tagliacozzo" . + "Renata" . + . + "Semmel" . + "Dorothy" . + . + "Kochen" . + "Manfred" . + . + "Lancaster" . + "F. W." . + . + "Pullen" . + "Keats A." . + . + "Pepinsky" . + "Harold B." . + . + "Harris" . + "Jessica L." . + . + "Thorpe" . + "Peter" . + . + "Thompson" . + "David A." . + . + "Rush" . + "James E." . + . + "Russo" . + "Phillip M." . + . + "McGee" . + "Rob" . + . + "Jones" . + "Kevin P." . + . + "Hockings" . + "E. F." . + . + "Liston" . + "David M." . + . + "Schoene" . + "Mary L." . + . + "Jones" . + "Kevin P." . + . + "Windsor" . + "Donald A." . + . + "Windsor" . + "Diane M." . + . + "Vinken" . + "Pierre J." . + . + "Belzer" . + "Jack" . + . + "Isaac" . + "Akkanad" . + . + "Finkelstein" . + "Eugene" . + . + "Williams" . + "James" . + . + "Miller" . + "William L." . + . + "Lowe" . + "Thomas C." . + . + "Jahoda" . + "Gerald" . + . + "Whittemore" . + "Bruce J." . + . + "Yovits" . + "M. C." . + . + "Minker" . + "Jack" . + . + "Peltola" . + "Eero" . + . + "Wilson" . + "Gerald A." . + . + "Kraft" . + "Donald H." . + . + "Christ" . + "C. W." . + . + "Rush" . + "James E." . + . + "Tocatlian" . + "J." . + . + "Helmkamp" . + "John G." . + . + "Jones" . + "Kevin P." . + . + "Scheffler" . + "Frederic" . + . + "March" . + "Jacqueline" . + . + "Bernados" . + "John" . + . + "Cawkell" . + "Anthony E." . + . + "Rosenberg" . + "Victor" . + . + "Bernier" . + "Charles L." . + . + "Flood" . + "Barbara" . + . + "Maruyama" . + "Lenore S." . + . + "Schipma" . + "Peter B." . + . + "Williams" . + "Martha E." . + . + "Shafton" . + "Allan L." . + . + "Studer" . + "Paul A." . + . + "Bassler" . + "Richard A." . + . + "Bromberg" . + "Erik" . + . + "Page" . + "Michael W." . + . + "Kibbel" . + "Howard M." . + . + "Wellisch" . + "Hans" . + . + "Marron" . + "Harvey" . + . + "Bottle" . + "Robert T." . + . + "Preibish" . + "Cynthia I." . + . + "Auld" . + "Larry" . + . + "O'Connor" . + "John" . + . + "Back" . + "Harry B." . + . + "Yerkey" . + "A. Neil" . + . + "Kochen" . + "M." . + . + "Lefever" . + "Maureen" . + . + "Freedman" . + "Barbara" . + . + "Schultz" . + "Louise" . + . + "Hawkins" . + "Donald T." . + . + "Solomon" . + "Susan L." . + . + "Heine" . + "M. H." . + . + "Donohue" . + "Joseph C." . + . + "Murphy" . + "Larry J." . + . + "Kraft" . + "Donald H." . + . + "Weaver" . + "Barbara N." . + . + "Ruffner" . + "Albert B." . + . + "Ellis" . + "Claire" . + . + "Anderson" . + "Helen" . + . + "Delorenzo" . + "Samuel X." . + . + "Cody" . + "Roger" . + . + "Wolfe" . + "Theodore" . + . + "Jones" . + "Karen Sparck" . + . + "Berg" . + "Sanford V." . + . + "Scheffler" . + "Frederic L." . + . + "Wellisch" . + "H." . + . + "MacKenzie" . + "A. Graham" . + . + "Wolek" . + "Francis W." . + . + "Strong" . + "Suzanne M." . + . + "Landry" . + "B. C." . + . + "Mathis" . + "B. A." . + . + "Meara" . + "N. M." . + . + "Rush" . + "J. E." . + . + "Young" . + "C. E." . + . + "Smith" . + "Joshua I." . + . + "Katzer" . + "Jeffrey" . + . + "Bernier" . + "Charles L." . + . + "Roth" . + "Dana L." . + . + "Hodges" . + "T. Mark" . + . + "Foster" . + "Eloise C." . + . + "Calhoun" . + "A. W." . + . + "Crawford" . + "Susan" . + . + "Harmon" . + "Glynn" . + . + "Bookstein" . + "Abraham" . + . + "Feinman" . + "R. D." . + . + "Kwok" . + "K. L." . + . + "Marcus" . + "Richard S." . + . + "Mitroff" . + "Ian I." . + . + "Williams" . + "James" . + . + "Rathswohl" . + "Eugene" . + . + "Wright" . + "Kieth" . + . + "Schultz" . + "Louise" . + . + "Wellisch" . + "Hans" . + . + "Hoey" . + "P. O'N." . + . + "McMurtray" . + "Frances" . + . + "Ginski" . + "John M." . + . + "Meredith" . + "J. C." . + . + "Cuadra" . + "Carlos A." . + . + "Mittman" . + "B." . + . + "Chalice" . + "R." . + . + "Dillaman" . + "D." . + . + "Thompson" . + "Charles W. N." . + . + "Worthen" . + "Dennis B." . + . + "Martin" . + "Jean K." . + . + "Parsons" . + "Ronald G." . + . + "Slamecka" . + "Vladimir" . + . + "Krauze" . + "Tadeusz K." . + . + "Hillinger" . + "Claude" . + . + "Kohut" . + "Joseph J." . + . + "Belzer" . + "Jack" . + . + "Jones" . + "Karen Sparck" . + . + "Smith" . + "Kingsley R." . + . + "Judy" . + "Theodore M." . + . + "Johnson" . + "Claire" . + . + "Briggs" . + "Eleanor" . + . + "Bernier" . + "Charles L." . + . + "Kuehl" . + "Philip G." . + . + "Kjell" . + "Bradley" . + . + "Fayollat" . + "James" . + . + "Rosenberg" . + "Victor" . + . + "Kertesz" . + "Francois" . + . + "Carpenter" . + "Mark P." . + . + "Narin" . + "Francis" . + . + "Salton" . + "G." . + . + "Montgomery" . + "Ruth Reinke" . + . + "Zaltman" . + "Gerald" . + . + "Rouse" . + "William B." . + . + "Cooper" . + "Michael D." . + . + "Barker" . + "Frances H." . + . + "Wyatt" . + "Barry K." . + . + "Veal" . + "Douglas C." . + . + "Salton" . + "G." . + . + "Narin" . + "Francis" . + . + "Carpenter" . + "Mark" . + . + "Berlt" . + "Nancy C." . + . + "Voos" . + "Henry" . + . + "Newman" . + "Simon M." . + . + "Creps" . + "John E." . + . + "Hilliker" . + "Brigitta" . + . + "Roth" . + "Dana L." . + . + "Brenner" . + "E. H." . + . + "Dantzic" . + "Bill" . + . + "Yu" . + "Clement T." . + . + "Korfhage" . + "Robert R." . + . + "Nelson" . + "John A." . + . + "Mitroff" . + "Ian I." . + . + "Rex Hartson" . + "H." . + . + "Borman" . + "Lorraine" . + . + "Mittman" . + "Benjamin" . + . + "Leimkuhler" . + "Ferdinand F." . + . + "Cooper" . + "Michael D." . + . + "Montgomery" . + "Christine A." . + . + "Soergel" . + "Dagobert" . + . + "Garfield" . + "Eugene" . + . + "Fayollat" . + "James" . + . + "Kim" . + "Chai" . + . + "Stern" . + "Louis W." . + . + "Craig" . + "C. Samuel" . + . + "La Greca" . + "Anthony J." . + . + "Lazorick" . + "Gerald J." . + . + "Moor" . + "William C." . + . + "Bookstein" . + "Abraham" . + . + "Levine" . + "Emil H." . + . + "Katzer" . + "Jeffrey" . + . + "Moell" . + "Patricia" . + . + "Mauerhoff" . + "Georg" . + . + "De Price" . + "Derek J. Solla" . + . + "Kirson" . + "Benjamin L." . + . + "Dym" . + "Eleanor D." . + . + "Shirey" . + "Donald L." . + . + "Murphy" . + "Larry J." . + . + "Small" . + "Henry" . + . + "Weinert" . + "Hartmut H." . + . + "Artandi" . + "Susan" . + . + "Wood" . + "James L." . + . + "Flanagan" . + "Carolyn" . + . + "Kennedy" . + "H. E." . + . + "Tagliacozzo" . + "Renata" . + . + "Fayollat" . + "James" . + . + "Cravens" . + "David W." . + . + "Moore" . + "J. R." . + . + "Carroll" . + "John M." . + . + "Tague" . + "Jean M." . + . + "Zaltman" . + "Gerald" . + . + "Köhler" . + "Barbara Marie" . + . + "Ware" . + "Glenn O." . + . + "Tebbutt" . + "Arthur V." . + . + "Chambers" . + "George R." . + . + "Healey" . + "James S." . + . + "Spencer" . + "Carol C." . + . + "Kugel" . + "Peter" . + . + "Buntrock" . + "Robert E." . + . + "Sprague" . + "Robert J." . + . + "Freudenreich" . + "L. Ben" . + . + "Warner" . + "Edward S." . + . + "Kraft" . + "Donald H." . + . + "Drott" . + "M. Carl" . + . + "Elliott" . + "Roger W." . + . + "Rouse" . + "William B." . + . + "Mankin" . + "Carole J." . + . + "Bastille" . + "Jacqueline D." . + . + "Carpenter" . + "Mark P." . + . + "Salton" . + "Gerard" . + . + "Eres" . + "Beth Krevitt" . + . + "Noerr" . + "K. T. Bivins" . + . + "Goldstain" . + "Charles M." . + . + "Robinson" . + "Earl J." . + . + "Turner" . + "Stephen J." . + . + "Home" . + "Esther E." . + . + "Aines" . + "Andrew A." . + . + "Cole" . + "Elliot" . + . + "Frycki" . + "S. J." . + . + "Roskos" . + "P. A." . + . + "Gerity" . + "C. F." . + . + "Levett" . + "I. S." . + . + "Kantor" . + "P. B." . + . + "Koenig" . + "Michael E. D." . + . + "Spaulding" . + "F. H." . + . + "Stanton" . + "R. O." . + . + "Fryser" . + "Benjamin S." . + . + "Stirling" . + "Keith H." . + . + "Regazzi" . + "John J." . + . + "Bennion" . + "Bruce" . + . + "Roberts" . + "Susan" . + . + "Lancaster" . + "F. W." . + . + "Smith" . + "Linda C." . + . + "Veith" . + "Richard H." . + . + "Chorba" . + "Ronald W." . + . + "Bommer" . + "Michael R. W." . + . + "Scholz" . + "William H." . + . + "Baumol" . + "William J." . + . + "Blackman" . + "Sue Anne Batey" . + . + "Cleveland" . + "Donald B." . + . + "Cleveland" . + "Ana D." . + . + "Wise" . + "Olga B." . + . + "Braunstein" . + "Yale M." . + . + "Schabas" . + "Ann H." . + . + "Aman" . + "Mohammed M." . + . + "Kwok" . + "K. L." . + . + "Anderson" . + "Richard C." . + . + "Narin" . + "Francis" . + . + "McAllister" . + "Paul" . + . + "Mayes" . + "Paul B." . + . + "Wasserman" . + "Anthony I." . + . + "Sandison" . + "A." . + . + "Zarember" . + "Irving" . + . + "Sustik" . + "Joan M." . + . + "Brooks" . + "Terrence A." . + . + "Salasin" . + "J." . + . + "Cedar" . + "T." . + . + "Heilprin" . + "Laurence B." . + . + "Can" . + "Fazli" . + . + "Ozkarahan" . + "Esen A." . + . + "Whitehead" . + "Daniel L." . + . + "Yovits" . + "M. C." . + . + "Foulk" . + "C. R." . + . + "Rose" . + "L. L." . + . + "Miyamoto" . + "S." . + . + "Nakayama" . + "K." . + . + "Maloney" . + "Ruth Kay" . + . + "Williams" . + "James G." . + . + "Kim" . + "Chai" . + . + "Geus" . + "Jan De" . + . + "Mulder" . + "Frans" . + . + "Zuurke" . + "Bert" . + . + "Levine" . + "Marilyn M." . + . + "Glickert" . + "Peter" . + . + "Kazlauskas" . + "Edward John" . + . + "Holt" . + "Thomas D." . + . + "Inhaber" . + "H." . + . + "Line" . + "Maurice B." . + . + "Sandison" . + "A." . + . + "Auld" . + "Larry" . + . + "Rothman" . + "John" . + . + "Testemale" . + "Claudia" . + . + "Liew" . + "Chong K." . + . + "Choi" . + "Uinam J." . + . + "Liew" . + "Chung J." . + . + "Kearsley" . + "Greg" . + . + "Lunin" . + "Lois F." . + . + "Line" . + "M. B." . + . + "Marulli" . + "Luciana" . + . + "Koenig" . + "Michael E. D." . + . + "Aines" . + "Andrew A." . + . + "Kuch" . + "T. D. C." . + . + "Brown" . + "Pauline" . + . + "Mattessich" . + "Richard" . + . + "Oromaner" . + "Mark" . + . + "Neeley" . + "James D." . + . + "Davis" . + "Charles H." . + . + "Dingle-Cliff" . + "Susan" . + . + "Cooper" . + "Michael D." . + . + "Garfield" . + "Eugene" . + . + "Rao" . + "I. K. Ravichandra" . + . + "Piternick" . + "Anne B." . + . + "Rastogi" . + "Kunj B." . + . + "Chartrand" . + "Robert Lee" . + . + "Line" . + "M. B." . + . + "Smith" . + "Joseph D." . + . + "Rush" . + "James E." . + . + "Cooper" . + "William S." . + . + "Gull" . + "C. D." . + . + "Lunin" . + "Lois F." . + . + "Cooper" . + "Michael D." . + . + "Johns" . + "Gerald" . + . + "Lynch" . + "Michael F." . + . + "Sinha" . + "Bani K." . + . + "Clelland" . + "Richard C." . + . + "Wanner" . + "Eric" . + . + "Meadow" . + "Charles T." . + . + "Sandison" . + "A." . + . + "Berthelot" . + "A." . + . + "Clague" . + "Peter" . + . + "Schiminovich" . + "Samuel" . + . + "Zwirner" . + "Wolfgang" . + . + "Meadow" . + "Charles T." . + . + "Kochen" . + "Manfred" . + . + "Reich" . + "Victoria" . + . + "Cohen" . + "Lee" . + . + "Hubert" . + "John J." . + . + "Wenger" . + "Charles B." . + . + "Sweet" . + "Christine B." . + . + "Stiles" . + "Helen J." . + . + "Croft" . + "W. Bruce" . + . + "Smith" . + "Linda C." . + . + "Burress" . + "Elaine P." . + . + "Artandi" . + "Susan" . + . + "Hurt" . + "C. D." . + . + "Roth" . + "Dana Lincoln" . + . + "Cochrane" . + "Glynn" . + . + "Atherton" . + "Pauline" . + . + "Strong" . + "Gary W." . + . + "Robson" . + "Alan" . + . + "Longman" . + "Janet S." . + . + "Cole" . + "Elliot" . + . + "Bookstein" . + "Abraham" . + . + "Trueswell" . + "Richard W." . + . + "Turner" . + "Stephen J." . + . + "Fugmann" . + "Robert" . + . + "Dodd" . + "Sue A." . + . + "Kraft" . + "Donald H." . + . + "Bookstein" . + "Abraham" . + . + "Mackesy" . + "Eileen M." . + . + "Stephenson" . + "Mary Sue" . + . + "Grishman" . + "Ralph" . + . + "Bourne" . + "Charles P." . + . + "Asai" . + "Isao" . + . + "Bates" . + "Marcia J." . + . + "Epstein" . + "Hank" . + . + "Bujdosó" . + "Ernö" . + . + "Braun" . + "Tibor" . + . + "Kochen" . + "Manfred" . + . + "Meadow" . + "Charles T." . + . + "Becker" . + "Joseph" . + . + "Onuigbo" . + "Wilson I. B." . + . + "Cornell" . + "Laurel L." . + . + "Praunlich" . + "Peter" . + . + "Kroll" . + "Michael" . + . + "Meadow" . + "Charles T." . + . + "Zaborowski" . + "Mary Ann" . + . + "Rafsnider" . + "Jean" . + . + "Penniman" . + "W. David" . + . + "Krohn" . + "Richard E." . + . + "Kovacs" . + "Gabor J." . + . + "Swanson" . + "Rowena Weiss" . + . + "Harter" . + "Stephen P." . + . + "Cawkell" . + "A. E." . + . + "Harter" . + "Stephen P." . + . + "Balasubramanian" . + "V." . + . + "Bulick" . + "Stephen" . + . + "Montgomery" . + "K. Leon" . + . + "Fetterman" . + "John" . + . + "Kent" . + "Allen" . + . + "Wellisch" . + "Hans H." . + . + "Shaw" . + "Debora" . + . + "Davis" . + "Charles H." . + . + "Perry" . + "J. A." . + . + "Pollock" . + "Joseph J." . + . + "Cox" . + "Bruce B." . + . + "Turner" . + "Stephen J." . + . + "Bensman" . + "Stephen J." . + . + "Croft" . + "W. Bruce" . + . + "Moss" . + "R." . + . + "Olafsen" . + "T." . + . + "Vokac" . + "L." . + . + "Hentschke" . + "Guilbert C." . + . + "Kehoe" . + "Ellen" . + . + "Stanton" . + "Robert O." . + . + "Moore" . + "Bessie Boehm" . + . + "Young" . + "Christina Carr" . + . + "Dingle-Cliff" . + "Susan" . + . + "Davis" . + "Charles H." . + . + "Fugmann" . + "Robert" . + . + "Bennion" . + "Bruce C." . + . + "Lipetz" . + "Bemami" . + . + "Bezilla" . + "Robert" . + . + "Humphrey" . + "Susanne M." . + . + "Williams" . + "Martha E." . + . + "Shackel" . + "B." . + . + "Jackson" . + "Eugene B." . + . + "Jackson" . + "Ruth L." . + . + "Jackson" . + "Eugene B." . + . + "Jackson" . + "Ruth L." . + . + "Cercone" . + "Nick" . + . + "McCalla" . + "Gordon" . + . + "Maron" . + "M. E." . + . + "Brookes" . + "B. C." . + . + "Bernier" . + "Charles L." . + . + "Olafsen" . + "Tore" . + . + "Vokac" . + "Libena" . + . + "Robinson" . + "Barbara M." . + . + "Yerkey" . + "A Neil" . + . + "Diener" . + "Richard A. V." . + . + "Dunham" . + "George S." . + . + "Pacak" . + "Milos G." . + . + "Pratt" . + "Arnold W." . + . + "Menou" . + "Michel J." . + . + "Brunenkant" . + "Edward J." . + . + "Herner" . + "Saul" . + . + "Elchesen" . + "Dennis R." . + . + "Lenk" . + "Peter" . + . + "Sandison" . + "A." . + . + "Marcus" . + "Richard S." . + . + "Reintjes" . + "J. Francis" . + . + "Fidel" . + "Raya" . + . + "Soergel" . + "Dagobert" . + . + "Belkin" . + "Nicholas J." . + . + "Bates" . + "Marcia J." . + . + "Kantor" . + "Paul B." . + . + "Beeson" . + "Betty Spillers" . + . + "Williams" . + "R. Ann" . + . + "Soergel" . + "Dagobert" . + . + "Lancaster" . + "F. W." . + . + "Lee" . + "Ja-Lih" . + . + "Fenichel" . + "Carol Hansen" . + . + "Croft" . + "W. Bruce" . + . + "Hawkins" . + "Donald T." . + . + "Bellardo" . + "Trudi" . + . + "McAllister" . + "Paul R." . + . + "Anderson" . + "Richard C." . + . + "Narin" . + "Francis" . + . + "Koenig" . + "Michael E. D." . + . + "Meadow" . + "Charles T." . + . + "Subramanyam" . + "K." . + . + "Blair" . + "David C." . + . + "McAllister" . + "Paul R." . + . + "Narin" . + "Francis" . + . + "Salton" . + "G." . + . + "Yang" . + "C. S." . + . + "Yu" . + "C. T." . + . + "Fugmann" . + "Robert" . + . + "Nickelsen" . + "Herbert" . + . + "Nickelsen" . + "Ingeborg" . + . + "Winter" . + "Jakob H." . + . + "Nowak" . + "Ildiko D." . + . + "Slamecka" . + "Vladimir" . + . + "Herner" . + "Saul" . + . + "Snapper" . + "Kurt J." . + . + "Anderson" . + "James D." . + . + "Davis" . + "Charles H." . + . + "Studer" . + "Paul A." . + . + "Marton" . + "JÅNos" . + . + "Gupta" . + "Surendra Mohan" . + . + "Ravindran" . + "Arunachalam" . + . + "Cooper" . + "Michael D." . + . + "Servi" . + "Patricia N." . + . + "Griffith" . + "Belver C." . + . + "Yu" . + "Clement T." . + . + "Raghavan" . + "Vijay V." . + . + "Shifiett" . + "Lee" . + . + "Mansfield" . + "Una" . + . + "Diodato" . + "Virgil" . + . + "Wellisch" . + "Hans H." . + . + "Davis" . + "Peter" . + . + "Sachs" . + "Wladimir" . + . + "Horowitz" . + "Irving Louis" . + . + "Curtis" . + "Mary E." . + . + "Burton" . + "Hilary D." . + . + "Allen" . + "Albert H." . + . + "Beirne" . + "Eugene F." . + . + "Dosa" . + "Marta L." . + . + "White" . + "Howard D." . + . + "Calhoun" . + "Karen" . + . + "Meadow" . + "Charles T." . + . + "Law" . + "Gordon T." . + . + "Pathan" . + "A. Majid" . + . + "Martiner" . + "Clara" . + . + "Zarember" . + "Irving" . + . + "Conger" . + "Lucinda D." . + . + "Shaw" . + "W. M." . + . + "Marcus" . + "Richard S." . + . + "Shaughnessy" . + "Thomas W." . + . + "King" . + "Rosemary" . + . + "Koenig" . + "M. E. D." . + . + "Cooper" . + "Marianne" . + . + "Lunin" . + "Lois F." . + . + "Lawrence" . + "Barbara" . + . + "Lunin" . + "Lois F." . + . + "Heath" . + "Miriam T." . + . + "Hamill" . + "Karen A." . + . + "Warner" . + "Edward S." . + . + "Anker" . + "Anita L." . + . + "Hunt" . + "Bernard L." . + . + "Snyderman" . + "Martin" . + . + "Payne" . + "William" . + . + "Piternick" . + "Anne B." . + . + "Turoff" . + "Murray" . + . + "Hiltz" . + "Starr Roxanne" . + . + "Sandison" . + "A." . + . + "Cohen" . + "Jacob" . + . + "Vijverberg" . + "Wim" . + . + "Noreault" . + "Terry" . + . + "Koll" . + "Matthew" . + . + "McGill" . + "Michael J." . + . + "Dillon" . + "Martin" . + . + "Federhart" . + "Peggy" . + . + "Marcus" . + "Richard S." . + . + "Reintjes" . + "J. Francis" . + . + "Sichel" . + "H. S." . + . + "Borkowski" . + "Casimir" . + . + "Sperling Martin" . + "J." . + . + "Monsell" . + "Stephen" . + . + "Borko" . + "Harold" . + . + "Koll" . + "Matthew" . + . + "Thompson" . + "Harold B." . + . + "Davis" . + "Charles H." . + . + "Haspers" . + "Jan H." . + . + "Dutta" . + "S." . + . + "Sinha" . + "P. K." . + . + "Garfield" . + "Eugene" . + . + "Brookes" . + "Bertram C." . + . + "Price" . + "Derek De Solla" . + . + "Craven" . + "Timothy C." . + . + "Diener" . + "Richard A. V." . + . + "Drott" . + "M. Carl" . + . + "Griffith" . + "Belver C." . + . + "Lunin" . + "Lois F." . + . + "Eres" . + "Beth Krevitt" . + . + "Sachs" . + "Wladimir M." . + . + "Wood" . + "Frances E." . + . + "Byrne" . + "Jerry R." . + . + "Blair" . + "David C." . + . + "Casper" . + "Cheryl A." . + . + "Cretsos" . + "James M." . + . + "Yu" . + "C. T." . + . + "Gebhardt" . + "Friedrich" . + . + "Stellmacher" . + "Imant" . + . + "Frame" . + "J. Davidson" . + . + "Baum" . + "John J." . + . + "Depew" . + "John N." . + . + "Neill" . + "S. D." . + . + "White" . + "Howard D." . + . + "Carroll" . + "John M." . + . + "Cakarnis" . + "John" . + . + "Krisciunas" . + "Kevin" . + . + "Ross" . + "Johanna" . + . + "Smith" . + "J. Macgregor" . + . + "Asai" . + "Isao" . + . + "Tagliacozzo" . + "Renata" . + . + "Cooper" . + "David" . + . + "Emly" . + "Michael A." . + . + "Lynch" . + "Michael F." . + . + "Yeates" . + "A. Robin" . + . + "Avram" . + "Henriette D." . + . + "McCallum" . + "Sally H." . + . + "Wanger" . + "Judith" . + . + "Landau" . + "Ruth N." . + . + "Wilson" . + "Patrick" . + . + "Griffiths" . + "John B." . + . + "Olsgaard" . + "John N." . + . + "Evans" . + "John Edward" . + . + "Belzer" . + "Jack" . + . + "Williams" . + "James" . + . + "Kronebusch" . + "John" . + . + "Gupta" . + "A. B." . + . + "Crawford" . + "Susan" . + . + "Saracevic" . + "Tefko" . + . + "Braga" . + "Gilda M." . + . + "Afolayan" . + "Matthew A." . + . + "Cooper" . + "Michael D." . + . + "Fedanzo" . + "Anthony J." . + . + "Hubert" . + "John J." . + . + "Bar-Hillel" . + "Y." . + . + "Carnap" . + "R." . + . + "Cherry" . + "E. C." . + . + "Garfield" . + "E." . + . + "King" . + "D. W." . + . + "Lancaster" . + "F. W." . + . + "Licklider" . + "J. C. R." . + . + "Mackay" . + "D. M." . + . + "Perry" . + "J. W." . + . + "De S. Price" . + "D. J." . + . + "Salton" . + "G." . + . + "Shannon" . + "C." . + . + "Taube" . + "M." . + . + "Vickery" . + "B. C." . + . + "Cawkell" . + "A. E." . + . + "Kraft" . + "Donald H." . + . + "Pachevsky" . + "Talmon" . + . + "Allen" . + "Sheilah" . + . + "Matheson" . + "Joyce" . + . + "Mick" . + "Colin K." . + . + "Haen" . + "Paul De" . + . + "Talavage" . + "Joseph" . + . + "Morse" . + "Philip M." . + . + "Brookes" . + "Bertram C." . + . + "Griffiths" . + "Jose M." . + . + "Keren" . + "Carl" . + . + "Rouse" . + "William B." . + . + "Brittain" . + "J. Michael" . + . + "Roberts" . + "Stephen A." . + . + "Boll" . + "John J." . + . + "Zweizig" . + "Douglas" . + . + "Nadziejka" . + "David E." . + . + "Derr" . + "Richard L." . + . + "Jordan" . + "Sara R." . + . + "Brown" . + "Antony F. R." . + . + "Hutton" . + "Fred C." . + . + "Oppenheim" . + "C." . + . + "Garfield" . + "Eugene" . + . + "Norcio" . + "A. F." . + . + "Kerst" . + "Stephen M." . + . + "Murugesan" . + "Poovanalingam" . + . + "Moravcsik" . + "Michael J." . + . + "McGill" . + "Michael J." . + . + "Bourne" . + "Charles P." . + . + "Robinson" . + "Jo" . + . + "Packer" . + "Katherine H." . + . + "Soergel" . + "Dagobert" . + . + "Bookstein" . + "A." . + . + "Keren" . + "Carl" . + . + "Smith" . + "Charles H." . + . + "Pollock" . + "J. J." . + . + "Belkin" . + "Nicholas J." . + . + "Baratz" . + "Stephen S." . + . + "Specht" . + "Jerry" . + . + "Cooper" . + "David" . + . + "Lynch" . + "Michael F." . + . + "Bortnick" . + "Jane" . + . + "Kantor" . + "Paul B." . + . + "Bearman" . + "Toni Carbo" . + . + "Guynup" . + "Polly" . + . + "Milevski" . + "Sandra N." . + . + "Lancaster" . + "F. W." . + . + "Richmond" . + "Phyllis A." . + . + "Lindquist" . + "Mats G." . + . + "Bailey" . + "Martha J." . + . + "Ellis" . + "David" . + . + "Ludwig" . + "B. M." . + . + "Glockmann" . + "H. P." . + . + "Garfield" . + "Eugene" . + . + "Heilprin" . + "Laurence B." . + . + "Sinha" . + "Bani K." . + . + "Clelland" . + "Richard C." . + . + "Chubin" . + "Daryl E." . + . + "Rossini" . + "Frederick A." . + . + "Zurkowski" . + "Paul G." . + . + "Willett" . + "Peter" . + . + "Beheshti" . + "Jamshid" . + . + "Tague" . + "Jean M." . + . + "Bernstein" . + "Lionel M." . + . + "Williamson" . + "Robert E." . + . + "Parker" . + "Ralph H." . + . + "Angione" . + "Pauline V." . + . + "Slamecka" . + "Vladimir" . + . + "Salton" . + "Gerard" . + . + "Bookstein" . + "Abraham" . + . + "Swanson" . + "Don R." . + . + "Bookstein" . + "Abraham" . + . + "Swanson" . + "Don R." . + . + "Pratt" . + "Allan D." . + . + "Brooks" . + "Terrence A." . + . + "Schultheisz" . + "Robert J." . + . + "Julius" . + "Marc" . + . + "Berkoff" . + "Charles E." . + . + "Strack" . + "Alvin E." . + . + "Krasovec" . + "Frank" . + . + "Bender" . + "A. Douglas" . + . + "Zais" . + "Harriet W." . + . + "Neway" . + "Julie M." . + . + "Lancaster" . + "F. W." . + . + "Mignon" . + "Edmond" . + . + "Alvarez" . + "Jose" . + . + "Smiley" . + "Steven M." . + . + "Rohrmann" . + "Francisco" . + . + "Swanson" . + "Rowena Weiss" . + . + "Mayer" . + "Joseph" . + . + "Radecki" . + "Tadeusz" . + . + "Renfro" . + "Charles G." . + . + "Artandi" . + "Susan" . + . + "Beasley" . + "Ruth Ann" . + . + "Kuch" . + "T. D. C." . + . + "Freudenthal" . + "Juan R." . + . + "Fuentes" . + "HÉCtor GÓMez" . + . + "Levine" . + "Marilyn M." . + . + "Stevens" . + "Norman D." . + . + "Reintjes" . + "J. Francis" . + . + "Shaw" . + "W. M." . + . + "Baxter" . + "Paul" . + . + "Lancaster" . + "F. W." . + . + "Martyn" . + "John" . + . + "Goitein" . + "Bernard" . + . + "Shapira" . + "Zur" . + . + "Hall" . + "Homer J." . + . + "Meadow" . + "Charles T." . + . + "Hewett" . + "Thomas T." . + . + "Aversa" . + "Elizabeth S." . + . + "Yovits" . + "M. C." . + . + "Foulk" . + "C. R." . + . + "Rose" . + "L. L." . + . + "Parker" . + "Ralph H." . + . + "Summers" . + "Edward G." . + . + "Matheson" . + "Joyce" . + . + "Conry" . + "Robert" . + . + "Bell" . + "Colin" . + . + "Jones" . + "Kevin P." . + . + "Williams" . + "Martha E." . + . + "McCain" . + "Katherine W." . + . + "Bobick" . + "James E." . + . + "Salton" . + "Gerard" . + . + "Nelson" . + "Michael J." . + . + "Tague" . + "Jean M." . + . + "Harding" . + "Alan F." . + . + "Willett" . + "Peter" . + . + "Yovits" . + "M. C." . + . + "Foulk" . + "C. R." . + . + "Rose" . + "L. L." . + . + "Williams" . + "Martha E." . + . + "Lannom" . + "Laurence" . + . + "Salton" . + "G." . + . + "Buckley" . + "C." . + . + "Fox" . + "E. A." . + . + "Eres" . + "Beth Krevitt" . + . + "Salton" . + "G." . + . + "Fox" . + "E. A." . + . + "Drott" . + "M. Carl" . + . + "Griffith" . + "Belver C." . + . + "Wallace" . + "Danny P." . + . + "Boyce" . + "Bert R." . + . + "Martin" . + "David" . + . + "Depew" . + "C. Henry" . + . + "O'Connor" . + "John" . + . + "Woodward" . + "Anthony M." . + . + "Oppenheim" . + "Charles" . + . + "Renn" . + "Susan P." . + . + "Harvey" . + "John F." . + . + "Dronberger" . + "Gladys B." . + . + "Kowitz" . + "Gerald T." . + . + "Pao" . + "Miranda Lee" . + . + "Levitan" . + "Karen B." . + . + "Gordon" . + "Michael D." . + . + "White" . + "Howard D." . + . + "White" . + "Howard D." . + . + "Griffith" . + "Belver C." . + . + "Jones" . + "K. Sparck" . + . + "Morton" . + "Sara E." . + . + "Fidel" . + "Raya" . + . + "Chafetz" . + "Morris E." . + . + "Bommer" . + "Michael" . + . + "Lancaster" . + "F. W." . + . + "McCarn" . + "Davis B." . + . + "Piternick" . + "Anne B." . + . + "Bennion" . + "Bruce C." . + . + "Sandison" . + "A." . + . + "Peritz" . + "Bluma C." . + . + "Salton" . + "Gerard" . + . + "Boyle" . + "Stephen O." . + . + "Miller" . + "A. Patricia" . + . + "Salasin" . + "John" . + . + "Cedar" . + "Toby" . + . + "Duncan" . + "E. E." . + . + "Lied" . + "Terry R." . + . + "Tolliver" . + "Don L." . + . + "Lerner" . + "Alexander" . + . + "Freeman" . + "Robert R." . + . + "Wellisch" . + "Hans H." . + . + "Kirtland" . + "Monika" . + . + "Marcus" . + "Richard S." . + . + "Wasser" . + "Nigel" . + . + "Jackson" . + "Eugene B." . + . + "Jackson" . + "Ruth L." . + . + "Bagley" . + "Philip R." . + . + "Parker" . + "Ralph H." . + . + "Kang" . + "Jong H." . + . + "Rouse" . + "William B." . + . + "Tagliacozzo" . + "Renata" . + . + "Neelameghan" . + "A." . + . + "Tocatlian" . + "J." . + . + "Levine" . + "Marilyn" . + . + "Perper" . + "Timothy" . + . + "Gordon" . + "Michael D." . + . + "Brittain" . + "J. Michael" . + . + "Kochen" . + "Manfred" . + . + "Doreian" . + "Patrick" . + . + "Minker" . + "Jack" . + . + "Maron" . + "M. E." . + . + "Lunin" . + "Lois F." . + . + "Smith" . + "Linda C." . + . + "Tolle" . + "John E." . + . + "Hah" . + "Sehchang" . + . + "Boyce" . + "Bert R." . + . + "Martin" . + "David" . + . + "Francis" . + "Barbara" . + . + "Sievert" . + "Mary Ellen" . + . + "Voos" . + "Henry" . + . + "Noma" . + "Elliot" . + . + "Olivastro" . + "Dominic" . + . + "Cooper" . + "William S." . + . + "Radecki" . + "Tadeusz" . + . + "Daniel" . + "Evelyn" . + . + "Lawrence" . + "Barbara" . + . + "Weil" . + "Ben H." . + . + "Graham" . + "Margaret H." . + . + "Swanson" . + "E. Burton" . + . + "Landau" . + "Herbert B." . + . + "Maddock" . + "Jerome T." . + . + "Shoemaker" . + "F. Floyd" . + . + "Costello" . + "Joseph G." . + . + "Turner" . + "Stephen J." . + . + "O'Brien" . + "Gregory" . + . + "Rouse" . + "William B." . + . + "Martin" . + "Thomas H." . + . + "Berninger" . + "Douglas E." . + . + "Bernier" . + "Charles L." . + . + "Gould" . + "Angela M." . + . + "Chapman" . + "Janet L." . + . + "Juergensmeyer" . + "John E." . + . + "Bishop" . + "Sarah G." . + . + "Smith" . + "Linda C." . + . + "Thoma" . + "George R." . + . + "Rouse" . + "William B." . + . + "Rouse" . + "Sandra H." . + . + "Harter" . + "Stephen P." . + . + "Ross" . + "Johanna C." . + . + "Rowbottom" . + "Mary E." . + . + "Willett" . + "Peter" . + . + "Miyamoto" . + "Sadaaki" . + . + "Nakayama" . + "Kazuhiko" . + . + "King" . + "Donald W." . + . + "Cooper" . + "Marianne" . + . + "Cleveland" . + "Donald B." . + . + "McCain" . + "Katherine W." . + . + "Smalley" . + "Topsy N." . + . + "Inhaber" . + "H." . + . + "Dow" . + "John T." . + . + "Lunin" . + "Lois F." . + . + "Smith" . + "Linda C." . + . + "Dillon" . + "Martin" . + . + "Gray" . + "Ann S." . + . + "Salton" . + "Gerard" . + . + "Marcus" . + "Richard S." . + . + "Kugel" . + "Peter" . + . + "Benenfeld" . + "Alan R." . + . + "Bookstein" . + "Abraham" . + . + "Kochtanek" . + "Thomas R." . + . + "Vigil" . + "Peter J." . + . + "Cooper" . + "William S." . + . + "Saracevic" . + "Tefko" . + . + "Galloway" . + "Emily" . + . + "Paris" . + "Judith" . + . + "Broadus" . + "Robert N." . + . + "Langley" . + "Pat" . + . + "Carbonell" . + "Jaime G." . + . + "Herner" . + "Saul" . + . + "Hirst" . + "Graeme" . + . + "Noma" . + "Elliot" . + . + "Culnan" . + "Mary J." . + . + "Bair" . + "James H." . + . + "Prabha" . + "Chandra G." . + . + "Herlach" . + "Gertrud" . + . + "Crawford" . + "Robert G." . + . + "Culnan" . + "Mary J." . + . + "Burns" . + "Christopher" . + . + "Rouse" . + "William B." . + . + "Rouse" . + "Sandra H." . + . + "Pope" . + "Andrew" . + . + "Bommer" . + "Michael R." . + . + "Chorba" . + "Ronald W." . + . + "Grattidge" . + "Walter" . + . + "Wellisch" . + "Hans" . + . + "Griffith" . + "Belver C." . + . + "Hawkins" . + "Donald T." . + . + "Auster" . + "Ethel" . + . + "Lawton" . + "Stephen B." . + . + "Langlois" . + "Richard N." . + . + "O'Connor" . + "John" . + . + "Craven" . + "Timothy C." . + . + "McGrath" . + "William E." . + . + "Carpenter" . + "Mark P." . + . + "Narin" . + "Francis" . + . + "Zmud" . + "Robert W." . + . + "Geller" . + "Nancy L." . + . + "De Cani" . + "John S." . + . + "Davies" . + "Robert E." . + . + "Moghdam" . + "Dineh" . + . + "Goyal" . + "Pankaj" . + . + "Kochen" . + "Manfred" . + . + "Bamford" . + "Harold E." . + . + "Bookstein" . + "A." . + . + "MacIntyre" . + "Walter M." . + . + "Sowden" . + "John M." . + . + "Kim" . + "Chai" . + . + "Cerny" . + "Barbara A." . + . + "Longo" . + "Rose Mary Juliano" . + . + "MacHado" . + "Ubaldino Dantas" . + . + "Glickert" . + "Peter" . + . + "Carroll" . + "John M." . + . + "Hubert" . + "John J." . + . + "Paris" . + "Judith" . + . + "Frame" . + "J. Davidson" . + . + "Baum" . + "John J." . + . + "Card" . + "Michael" . + . + "Walker" . + "Donald E." . + . + "Simon" . + "Herbert A." . + . + "Tague" . + "Jean" . + . + "Geller" . + "Nancy L." . + . + "Mick" . + "Colin K." . + . + "Lindsey" . + "Georg N." . + . + "Callahan" . + "Daniel" . + . + "Bichteler" . + "Julie" . + . + "Eaton" . + "Edward A." . + . + "Schultheisz" . + "Robert J." . + . + "Walker" . + "Donald F." . + . + "Kannan" . + "Kay L." . + . + "Rouse" . + "William B." . + . + "Wooster" . + "Harold" . + . + "Kuch" . + "T. D." . + . + "Craven" . + "Timothy C." . + . + "Ryzin" . + "Elizabeth Van" . + . + "Machlup" . + "Fritz" . + . + "White" . + "Howard D." . + . + "Dillon" . + "Martin" . + . + "Caplan" . + "P." . + . + "Crawford" . + "Susan" . + . + "Rees" . + "Alan M." . + . + "Freides" . + "Thelma" . + . + "Kim" . + "Chai" . + . + "Shin" . + "Eui Hang" . + . + "Gerson" . + "Gordon M." . + . + "Pao" . + "Miranda Lee" . + . + "Sager" . + "Naomi" . + . + "Wright" . + "H. Curtis" . + . + "Simkins" . + "Alan" . + . + "Rice" . + "Ronald E." . + . + "Borko" . + "Harold" . + . + "Crawford" . + "Susan" . + . + "Jones" . + "Warren T." . + . + "Yovits" . + "M. C." . + . + "Foulk" . + "C. R." . + . + "Robinson" . + "Jo" . + . + "Kraft" . + "Donald" . + . + "Standera" . + "O. L." . + . + "Lancaster" . + "F. W." . + . + "Neway" . + "Julie M." . + . + "Wellisch" . + "Hans H." . + . + "Meadow" . + "Gharles T." . + . + "Swift" . + "Donald F." . + . + "Winn" . + "Viola A." . + . + "Bramer" . + "Dawn A." . + . + "Wenger" . + "Charles B." . + . + "Childress" . + "Judith" . + . + "Radhakrishnan" . + "T." . + . + "Venkatesh" . + "K." . + . + "Koenig" . + "Mike" . + . + "Mignon" . + "Edmond" . + . + "Parker" . + "Lorraine M. Purgailis" . + . + "Salton" . + "Gerard" . + . + "Cleveland" . + "Ana D." . + . + "Sandison" . + "Alexander" . + . + "Pinski" . + "Gabriel" . + . + "Narin" . + "Francis" . + . + "Salton" . + "G." . + . + "Wu" . + "H." . + . + "Yu" . + "C. T." . + . + "Summers" . + "Edward G." . + . + "Davidson" . + "David" . + . + "Narin" . + "Francis" . + . + "Carpenter" . + "Mark P." . + . + "Marcus" . + "Richard S." . + . + "Yaghmai" . + "N. Shahla" . + . + "Maxin" . + "Jacqueline A." . + . + "Diener" . + "Richard A. V." . + . + "Schorr" . + "Alan Edward" . + . + "Coile" . + "Russell C." . + . + "Lawani" . + "Stephen M." . + . + "Bayer" . + "Alan E." . + . + "Price" . + "Derek De Solla" . + . + "Kochen" . + "Manfred" . + . + "Elias" . + "A. W." . + . + "Kochen" . + "Manfred" . + . + "Segur" . + "A. Bertrand" . + . + "Bromberg" . + "Erik" . + . + "Windsor" . + "Donald A." . + . + "Nance" . + "Richard E." . + . + "Weil" . + "Ben H." . + . + "Augustson" . + "J. Gary" . + . + "Minker" . + "Jack" . + . + "Borkowski" . + "Casimir" . + . + "Cepanec" . + "Louis" . + . + "Martin" . + "J. Sperling" . + . + "Salko" . + "Virginia" . + . + "Treu" . + "Siegfried" . + . + "Winings" . + "J. W." . + . + "Moss" . + "R." . + . + "Cagan" . + "Carl" . + . + "Tinker" . + "John F." . + . + "Penner" . + "Rudolf J." . + . + "Elliott" . + "Clark A." . + . + "Cagan" . + "Carl" . + . + "O'Hara" . + "F. M." . + . + "Frick" . + "Barbara F." . + . + "Ginski" . + "John M." . + . + "Humphrey" . + "Hubert H." . + . + "Mandersloot" . + "Wim G. B." . + . + "Douglas" . + "Eleanor M. B." . + . + "Spicer" . + "Neville" . + . + "Kegan" . + "Daniel L." . + . + "Lipetz" . + "Ben-Ami" . + . + "Song" . + "Czetong T." . + . + "Mathews" . + "William D." . + . + "Lancaster" . + "F. W." . + . + "Jenkins" . + "Grace T." . + . + "Davis" . + "Charles H." . + . + "Hiatt" . + "Peter" . + . + "Landry" . + "Bertrand C." . + . + "Rush" . + "James E." . + . + "Salton" . + "Gerard" . + . + "Tocatlian" . + "Jacques J." . + . + "Cooper" . + "William S." . + . + "O'Connor" . + "John" . + . + "Otten" . + "Klaus" . + . + "Debons" . + "Anthony" . + . + "Cummings" . + "Martin M." . + . + "Rogers" . + "Frank B." . + . + "Cawkell" . + "A. E." . + . + "Climenson" . + "W. Douglas" . + . + "Cooper" . + "William S." . + . + "Richmond" . + "Phyllis A." . + . + "Bottle" . + "Robert T." . + . + "Hines" . + "Theodore C." . + . + "Harris" . + "Jessica L." . + . + "Colverd" . + "Martin" . + . + "Lancaster" . + "F. W." . + . + "Jenkins" . + "Grace T." . + . + "Elias" . + "A. W." . + . + "Brodie" . + "Nancy E." . + . + "Wooster" . + "Harold" . + . + "Bernier" . + "Charles L." . + . + "Amick" . + "Daniel James" . + . + "Brookes" . + "B. C." . + . + "Segebarth" . + "C." . + . + "Lancaster" . + "F. W." . + . + "Wall" . + "Eugene" . + . + "Olle" . + "T. William" . + . + "Gagnoud" . + "Andre M." . + . + "He" . + "Shaoyi" . + . + "Ward" . + "Robert" . + . + "Wamsley" . + "Gary" . + . + "Robins" . + "David B." . + . + "Peek" . + "Robin P." . + . + "Jackson" . + "Eugene B." . + . + "Nyce" . + "James M." . + . + "Kahn" . + "Paul" . + . + "O'Haver" . + "Thomas C." . + . + "Janes" . + "Joseph W." . + . + "Small" . + "Henry" . + . + "Garfield" . + "Eugene" . + . + "Buckland" . + "Michael K." . + . + "Jeng" . + "Ling Hwey" . + . + "Lunin" . + "Lois F." . + . + "Rada" . + "Roy" . + . + "Mendelsohn" . + "Loren D." . + . + "Lin" . + "Xia" . + . + "Liebscher" . + "Peter" . + . + "Marchionini" . + "Gary" . + . + "Abelson" . + "Philip" . + . + "Kotamarti" . + "Usha" . + . + "Tharp" . + "Alan L." . + . + "Garrison" . + "Guy" . + . + "Beghtol" . + "Clare" . + . + "Kantor" . + "Paul B." . + . + "Losee" . + "Robert" . + . + "Glogoff" . + "Stuart" . + . + "Robinson" . + "Michael D." . + . + "Lindberg M.D." . + "Donald A. B." . + . + "Line" . + "Maurice B." . + . + "Armstrong" . + "Marc P." . + . + "Ajiferuke" . + "Isola" . + . + "Humphrey" . + "Susanne M." . + . + "Miller" . + "Nancy E." . + . + "Fidel" . + "Raya" . + . + "Shapiro" . + "Fred R." . + . + "Harter" . + "Stephen P." . + . + "Nisonger" . + "Thomas E." . + . + "Weng" . + "Aiwei" . + . + "Harman" . + "Donna" . + . + "Candela" . + "Gerald" . + . + "Harter" . + "Stephen P." . + . + "Hsieh-Yee" . + "Ingrid" . + . + "Hjørland" . + "Birger" . + . + "Albrechtsen" . + "Hanne" . + . + "Diodato" . + "Virgil" . + . + "Gandt" . + "Gretchen" . + . + "Lynch" . + "Clifford A." . + . + "Gleason" . + "John M." . + . + "Bonckaert" . + "P." . + . + "Egghe" . + "L." . + . + "Jimison" . + "Holly Brügge" . + . + "Sher" . + "Paul Phillip" . + . + "Weise" . + "Frieda O." . + . + "Tooey" . + "M. J." . + . + "Watters" . + "Carolyn" . + . + "Shepherd" . + "Michael A." . + . + "Qiu" . + "Liwen" . + . + "Olden" . + "Anthony" . + . + "Shuldberg" . + "H. Kelly" . + . + "Macpherson" . + "Melissa" . + . + "Humphrey" . + "Pete" . + . + "Corley" . + "Jamii" . + . + "Wildemuth" . + "Barbara M." . + . + "Thom" . + "James A." . + . + "Zobel" . + "Justin" . + . + "Yerkey" . + "A. Neil" . + . + "Berliss" . + "Jane" . + . + "Baumgras" . + "Jan L." . + . + "Rogers" . + "Anne E." . + . + "Langenberg" . + "Donald N." . + . + "Hegazi" . + "Nadia" . + . + "Ali" . + "Nabil" . + . + "Abed" . + "Ehsan" . + . + "Sievert" . + "MaryEllen C." . + . + "Westler" . + "Jean A." . + . + "Paisley" . + "William" . + . + "Cordes" . + "David W." . + . + "Carver" . + "Doris L." . + . + "Collins" . + "Mauri P." . + . + "Berge" . + "Zane L." . + . + "Marchionini" . + "Gary" . + . + "Barlow" . + "Diane" . + . + "Hill" . + "Linda" . + . + "Frisse" . + "Mark F." . + . + "Cousins" . + "Steve B." . + . + "Sutton" . + "Stuart A." . + . + "Woodward" . + "Diana" . + . + "Gorissen" . + "Pierre" . + . + "Van Bruggen" . + "Jan" . + . + "Jochems" . + "Wim" . + . + "Stankey" . + "George H." . + . + . + "Corchado"^^ . + "Juan Manuel"^^ . + . + "A Dosi" . + "Ravi" . + . + "Shivhare" . + "Shailendra" . + . + "Agrawal" . + "Ankur" . + . + "Jaiswal" . + "Neha" . + . + "Patidar" . + "Ravindra" . + . + . + "Agrafiotis" . + "Dimitris" . + . + . + "Calabrò" . + "Maria Luisa" . + . + . + "Usdin" . + "B. Tommie" . + . + . + "Shahidzadeh" . + "Nooshin" . + . + . + "Gasperini" . + "Paola" . + . + . + "Zamora" . + "Antonio" . + . + . + "Bilgin" . + "Hülya" . + . + . + "Schroeder" . + "Aaron" . + . + . + "Jacobs" . + "Ian J" . + . + . + "Ind" . + "Thomas" . + . + . + "Harris" . + "Adrian" . + . + . + "Ria" . + "Roberto" . + . + "Uden" . + "Lorna" . + . + "De Paz Santana" . + "Juan F." . + . + . + "Massari"^^ . + "Arcangelo"^^ . + . + . + "Heibi"^^ . + "Ivan"^^ . + "Heibi Ivan" . + . + . + "De Rossi" . + "Anita" . + . + . + "Qeios Ltd"^^ . + . + . + "World Wide Journals"^^ . + . + . + "Soricetti" . + "Marta" . + . + . + "Rizzetto" . + "Elia" . + . + . + "Buckland" . + "Michael" . + . + . + "Thorsen" . + "Frits" . + . + . + "Fischhoff" . + "Baruch" . + . + . + "Kulldorff" . + "Martin" . + . + . + "Gölzhäuser" . + "Armin" . + . + . + "Read" . + "Tracy-Ann" . + . + "Oecd" . + . + . + "Santini" . + "Cristian" . + . + "Bozkurt" . + "Merlin" . + . + "Yilmazlar" . + "Selçuk" . + . + "Korfali" . + "Gülsen" . + . + . + "Perry" . + "Arie" . + . + . + "Allan"^^ . + "Catherine"^^ . + . + . + "Somasundaram" . + "Rajasekharan" . + . + . + "Buell" . + "Duncan" . + . + . + "Boente" . + "Ricarda" . + . + . + "Tural" . + "Deniz" . + "1909" . + "1903" . + . + "1995" . + "1985" . + . + "2072" . + "2068" . + . + "1930" . + "1925" . + . + "2022" . + "2017" . + . + "2056" . + "2046" . + . + "1972" . + "1966" . + . + "1809" . + "1808" . + . + "242" . + "236" . + . + "235" . + "228" . + . + "178" . + "177" . + . + "188" . + "182" . + . + "165" . + "160" . + . + "200" . + "192" . + . + "266" . + "260" . + . + "205" . + "201" . + . + "252" . + "248" . + . + "227" . + "223" . + . + "288" . + "281" . + . + "295" . + "289" . + . + "297" . + "296" . + . + "2010" . + "2001" . + . + "299" . + "298" . + . + "259" . + "253" . + . + "280" . + "275" . + . + "175" . + "171" . + . + "170" . + "166" . + . + "181" . + "176" . + . + "500" . + "488" . + . + "537" . + "525" . + . + "1307" . + "1296" . + . + "182" . + "165" . + . + "2090" . + "2077" . + . + "164" . + "161" . + . + "160" . + "152" . + . + "10" . + "7" . + . + "111" . + "107" . + . + "127" . + "112" . + . + "461" . + "457" . + . + "217" . + "207" . + . + "806" . + "803" . + . + "2092" . + "2091" . + . + "2032" . + "2023" . + . + "1893" . + "1885" . + . + "2000" . + "1996" . + . + "2076" . + "2073" . + . + "1965" . + "1958" . + . + "3612" . + "3593" . + . + "80" . + "76" . + . + "424" . + "413" . + . + "128" . + "122" . + . + "175" . + "166" . + . + "274" . + "260" . + . + "231" . + "231" . + . + "270" . + "254" . + . + "351" . + "348" . + . + "139" . + "126" . + . + "282" . + "275" . + . + "50" . + "41" . + . + "155" . + "150" . + . + "100" . + "87" . + . + "217" . + "213" . + . + "220" . + "218" . + . + "182" . + "172" . + . + "305" . + "305" . + . + "209" . + "208" . + . + "149" . + "143" . + . + "147" . + "142" . + . + "401" . + "392" . + . + "69" . + "65" . + . + "122" . + "118" . + . + "247" . + "237" . + . + "408" . + "399" . + . + "43" . + "33" . + . + "40" . + "28" . + . + "131" . + "130" . + . + "286" . + "282" . + . + "389" . + "382" . + . + "358" . + "347" . + . + "134" . + "120" . + . + "319" . + "317" . + . + "298" . + "292" . + . + "430" . + "429" . + . + "104" . + "96" . + . + "253" . + "248" . + . + "165" . + "161" . + . + "277" . + "271" . + . + "134" . + "133" . + . + "428" . + "428" . + . + "73" . + "72" . + . + "184" . + "176" . + . + "202" . + "195" . + . + "221" . + "220" . + . + "355" . + "354" . + . + "241" . + "237" . + . + "109" . + "101" . + . + "327" . + "317" . + . + "347" . + "337" . + . + "27" . + "12" . + . + "74" . + "73" . + . + "69" . + "59" . + . + "145" . + "143" . + . + "249" . + "243" . + . + "406" . + "406" . + . + "373" . + "361" . + . + "125" . + "123" . + . + "217" . + "210" . + . + "250" . + "242" . + . + "132" . + "131" . + . + "122" . + "115" . + . + "163" . + "157" . + . + "381" . + "377" . + . + "112" . + "109" . + . + "207" . + "203" . + . + "223" . + "193" . + . + "321" . + "318" . + . + "381" . + "374" . + . + "144" . + "139" . + . + "231" . + "221" . + . + "260" . + "246" . + . + "376" . + "368" . + . + "35" . + "30" . + . + "142" . + "141" . + . + "51" . + "44" . + . + "301" . + "294" . + . + "65" . + "58" . + . + "130" . + "123" . + . + "269" . + "263" . + . + "293" . + "292" . + . + "333" . + "332" . + . + "287" . + "283" . + . + "332" . + "326" . + . + "352" . + "343" . + . + "133" . + "133" . + . + "227" . + "225" . + . + "216" . + "208" . + . + "428" . + "427" . + . + "325" . + "322" . + . + "460" . + "445" . + . + "163" . + "156" . + . + "292" . + "290" . + . + "283" . + "281" . + . + "342" . + "339" . + . + "108" . + "105" . + . + "2" . + "1" . + . + "155" . + "151" . + . + "69" . + "63" . + . + "198" . + "183" . + . + "317" . + "313" . + . + "134" . + "134" . + . + "208" . + "208" . + . + "421" . + "415" . + . + "233" . + "232" . + . + "152" . + "149" . + . + "316" . + "313" . + . + "29" . + "23" . + . + "209" . + "205" . + . + "17" . + "3" . + . + "43" . + "38" . + . + "67" . + "66" . + . + "222" . + "222" . + . + "10" . + "3" . + . + "24" . + "10" . + . + "342" . + "328" . + . + "85" . + "77" . + . + "414" . + "411" . + . + "310" . + "301" . + . + "241" . + "235" . + . + "236" . + "232" . + . + "337" . + "333" . + . + "396" . + "382" . + . + "334" . + "333" . + . + "378" . + "365" . + . + "204" . + "193" . + . + "9" . + "1" . + . + "194" . + "185" . + . + "391" . + "384" . + . + "175" . + "172" . + . + "186" . + "176" . + . + "114" . + "107" . + . + "232" . + "223" . + . + "141" . + "135" . + . + "276" . + "270" . + . + "346" . + "343" . + . + "160" . + "156" . + . + "412" . + "405" . + . + "336" . + "333" . + . + "251" . + "242" . + . + "304" . + "300" . + . + "167" . + "166" . + . + "383" . + "379" . + . + "315" . + "310" . + . + "192" . + "187" . + . + "335" . + "335" . + . + "364" . + "359" . + . + "71" . + "70" . + . + "86" . + "80" . + . + "50" . + "41" . + . + "104" . + "86" . + . + "436" . + "425" . + . + "22" . + "11" . + . + "403" . + "402" . + . + "8" . + "3" . + . + "117" . + "113" . + . + "231" . + "227" . + . + "312" . + "306" . + . + "99" . + "85" . + . + "84" . + "75" . + . + "331" . + "323" . + . + "272" . + "270" . + . + "357" . + "356" . + . + "226" . + "218" . + . + "32" . + "25" . + . + "244" . + "237" . + . + "262" . + "252" . + . + "171" . + "162" . + . + "171" . + "164" . + . + "398" . + "390" . + . + "219" . + "195" . + . + "305" . + "299" . + . + "73" . + "71" . + . + "358" . + "353" . + . + "156" . + "148" . + . + "2" . + "2" . + . + "32" . + "25" . + . + "179" . + "171" . + . + "57" . + "50" . + . + "58" . + "52" . + . + "207" . + "199" . + . + "308" . + "307" . + . + "353" . + "352" . + . + "75" . + "74" . + . + "307" . + "306" . + . + "119" . + "110" . + . + "462" . + "461" . + . + "24" . + "19" . + . + "269" . + "265" . + . + "192" . + "180" . + . + "290" . + "289" . + . + "38" . + "36" . + . + "280" . + "278" . + . + "322" . + "318" . + . + "11" . + "5" . + . + "367" . + "359" . + . + "281" . + "277" . + . + "236" . + "225" . + . + "316" . + "311" . + . + "264" . + "261" . + . + "426" . + "422" . + . + "401" . + "397" . + . + "160" . + "153" . + . + "294" . + "293" . + . + "380" . + "379" . + . + "282" . + "278" . + . + "95" . + "93" . + . + "216" . + "211" . + . + "375" . + "374" . + . + "222" . + "217" . + . + "182" . + "178" . + . + "192" . + "181" . + . + "228" . + "224" . + . + "110" . + "108" . + . + "114" . + "114" . + . + "191" . + "184" . + . + "384" . + "384" . + . + "462" . + "458" . + . + "15" . + "5" . + . + "184" . + "179" . + . + "73" . + "72" . + . + "47" . + "44" . + . + "239" . + "234" . + . + "183" . + "174" . + . + "112" . + "100" . + . + "153" . + "148" . + . + "280" . + "269" . + . + "350" . + "344" . + . + "170" . + "161" . + . + "200" . + "193" . + . + "110" . + "105" . + . + "50" . + "40" . + . + "273" . + "269" . + . + "184" . + "183" . + . + "191" . + "181" . + . + "28" . + "19" . + . + "358" . + "355" . + . + "37" . + "32" . + . + "210" . + "204" . + . + "351" . + "342" . + . + "103" . + "91" . + . + "313" . + "312" . + . + "24" . + "1" . + . + "303" . + "296" . + . + "295" . + "295" . + . + "60" . + "60" . + . + "432" . + "424" . + . + "102" . + "94" . + . + "266" . + "264" . + . + "276" . + "268" . + . + "122" . + "122" . + . + "401" . + "398" . + . + "248" . + "243" . + . + "201" . + "192" . + . + "52" . + "46" . + . + "373" . + "370" . + . + "9" . + "1" . + . + "81" . + "76" . + . + "314" . + "314" . + . + "368" . + "363" . + . + "293" . + "290" . + . + "453" . + "453" . + . + "372" . + "372" . + . + "77" . + "77" . + . + "273" . + "272" . + . + "269" . + "265" . + . + "329" . + "322" . + . + "423" . + "417" . + . + "374" . + "374" . + . + "65" . + "65" . + . + "108" . + "107" . + . + "352" . + "352" . + . + "75" . + "69" . + . + "63" . + "61" . + . + "394" . + "383" . + . + "37" . + "34" . + . + "264" . + "262" . + . + "223" . + "217" . + . + "256" . + "255" . + . + "160" . + "153" . + . + "299" . + "298" . + . + "122" . + "111" . + . + "105" . + "105" . + . + "88" . + "84" . + . + "382" . + "376" . + . + "377" . + "377" . + . + "120" . + "115" . + . + "72" . + "70" . + . + "119" . + "107" . + . + "135" . + "134" . + . + "407" . + "405" . + . + "380" . + "374" . + . + "81" . + "75" . + . + "25" . + "19" . + . + "163" . + "161" . + . + "411" . + "405" . + . + "452" . + "452" . + . + "355" . + "354" . + . + "350" . + "349" . + . + "302" . + "300" . + . + "352" . + "343" . + . + "323" . + "323" . + . + "420" . + "412" . + . + "341" . + "339" . + . + "92" . + "88" . + . + "360" . + "358" . + . + "353" . + "343" . + . + "61" . + "60" . + . + "239" . + "235" . + . + "24" . + "9" . + . + "216" . + "215" . + . + "372" . + "372" . + . + "292" . + "283" . + . + "406" . + "400" . + . + "223" . + "213" . + . + "450" . + "444" . + . + "247" . + "240" . + . + "87" . + "83" . + . + "129" . + "116" . + . + "82" . + "77" . + . + "53" . + "45" . + . + "40" . + "31" . + . + "151" . + "146" . + . + "133" . + "130" . + . + "296" . + "291" . + . + "160" . + "155" . + . + "174" . + "172" . + . + "169" . + "161" . + . + "437" . + "425" . + . + "155" . + "150" . + . + "302" . + "302" . + . + "71" . + "71" . + . + "37" . + "28" . + . + "57" . + "51" . + . + "300" . + "300" . + . + "169" . + "164" . + . + "59" . + "58" . + . + "104" . + "102" . + . + "55" . + "51" . + . + "371" . + "368" . + . + "178" . + "177" . + . + "345" . + "344" . + . + "380" . + "378" . + . + "56" . + "53" . + . + "155" . + "148" . + . + "206" . + "197" . + . + "46" . + "41" . + . + "117" . + "110" . + . + "153" . + "153" . + . + "178" . + "175" . + . + "50" . + "41" . + . + "74" . + "67" . + . + "258" . + "251" . + . + "109" . + "104" . + . + "263" . + "250" . + . + "300" . + "299" . + . + "100" . + "96" . + . + "169" . + "169" . + . + "457" . + "451" . + . + "294" . + "294" . + . + "362" . + "357" . + . + "317" . + "313" . + . + "368" . + "364" . + . + "69" . + "65" . + . + "335" . + "334" . + . + "40" . + "33" . + . + "296" . + "295" . + . + "60" . + "60" . + . + "44" . + "34" . + . + "78" . + "71" . + . + "30" . + "22" . + . + "152" . + "135" . + . + "173" . + "166" . + . + "290" . + "280" . + . + "43" . + "38" . + . + "234" . + "233" . + . + "293" . + "285" . + . + "212" . + "211" . + . + "96" . + "92" . + . + "424" . + "413" . + . + "355" . + "350" . + . + "115" . + "114" . + . + "90" . + "81" . + . + "177" . + "169" . + . + "165" . + "165" . + . + "110" . + "109" . + . + "66" . + "56" . + . + "332" . + "325" . + . + "122" . + "115" . + . + "132" . + "132" . + . + "303" . + "287" . + . + "180" . + "163" . + . + "204" . + "197" . + . + "214" . + "205" . + . + "319" . + "311" . + . + "341" . + "339" . + . + "259" . + "256" . + . + "397" . + "389" . + . + "45" . + "25" . + . + "32" . + "23" . + . + "344" . + "341" . + . + "18" . + "13" . + . + "250" . + "241" . + . + "152" . + "147" . + . + "145" . + "136" . + . + "68" . + "68" . + . + "371" . + "369" . + . + "375" . + "374" . + . + "131" . + "123" . + . + "289" . + "280" . + . + "44" . + "33" . + . + "307" . + "287" . + . + "77" . + "77" . + . + "320" . + "318" . + . + "296" . + "289" . + . + "135" . + "130" . + . + "383" . + "383" . + . + "211" . + "210" . + . + "246" . + "244" . + . + "357" . + "354" . + . + "346" . + "341" . + . + "338" . + "330" . + . + "40" . + "36" . + . + "354" . + "345" . + . + "139" . + "137" . + . + "382" . + "375" . + . + "261" . + "257" . + . + "318" . + "318" . + . + "74" . + "67" . + . + "74" . + "67" . + . + "443" . + "440" . + . + "340" . + "338" . + . + "234" . + "230" . + . + "152" . + "146" . + . + "89" . + "82" . + . + "291" . + "289" . + . + "326" . + "319" . + . + "235" . + "235" . + . + "208" . + "207" . + . + "57" . + "57" . + . + "149" . + "146" . + . + "137" . + "135" . + . + "64" . + "57" . + . + "52" . + "48" . + . + "190" . + "187" . + . + "121" . + "118" . + . + "336" . + "335" . + . + "145" . + "144" . + . + "261" . + "260" . + . + "161" . + "153" . + . + "402" . + "396" . + . + "329" . + "325" . + . + "236" . + "230" . + . + "298" . + "297" . + . + "78" . + "78" . + . + "115" . + "115" . + . + "374" . + "369" . + . + "339" . + "333" . + . + "10" . + "1" . + . + "317" . + "304" . + . + "321" . + "314" . + . + "102" . + "94" . + . + "390" . + "378" . + . + "176" . + "175" . + . + "115" . + "115" . + . + "273" . + "269" . + . + "175" . + "174" . + . + "287" . + "281" . + . + "331" . + "325" . + . + "291" . + "288" . + . + "255" . + "248" . + . + "206" . + "204" . + . + "124" . + "123" . + . + "341" . + "340" . + . + "260" . + "259" . + . + "117" . + "113" . + . + "24" . + "18" . + . + "102" . + "97" . + . + "87" . + "85" . + . + "55" . + "53" . + . + "229" . + "223" . + . + "277" . + "271" . + . + "237" . + "232" . + . + "212" . + "211" . + . + "255" . + "248" . + . + "199" . + "191" . + . + "252" . + "247" . + . + "279" . + "274" . + . + "246" . + "237" . + . + "377" . + "375" . + . + "21" . + "16" . + . + "128" . + "125" . + . + "66" . + "65" . + . + "106" . + "105" . + . + "42" . + "33" . + . + "119" . + "113" . + . + "304" . + "294" . + . + "207" . + "201" . + . + "253" . + "245" . + . + "444" . + "438" . + . + "180" . + "171" . + . + "170" . + "169" . + . + "304" . + "303" . + . + "72" . + "71" . + . + "222" . + "214" . + . + "32" . + "17" . + . + "123" . + "122" . + . + "199" . + "192" . + . + "349" . + "343" . + . + "14" . + "9" . + . + "246" . + "239" . + . + "66" . + "66" . + . + "340" . + "340" . + . + "80" . + "77" . + . + "123" . + "115" . + . + "272" . + "268" . + . + "232" . + "229" . + . + "125" . + "125" . + . + "160" . + "154" . + . + "50" . + "43" . + . + "39" . + "29" . + . + "13" . + "5" . + . + "57" . + "44" . + . + "165" . + "157" . + . + "142" . + "131" . + . + "353" . + "352" . + . + "220" . + "220" . + . + "128" . + "124" . + . + "33" . + "26" . + . + "219" . + "219" . + . + "114" . + "109" . + . + "324" . + "321" . + . + "420" . + "420" . + . + "147" . + "141" . + . + "210" . + "205" . + . + "35" . + "25" . + . + "135" . + "125" . + . + "158" . + "156" . + . + "137" . + "137" . + . + "121" . + "118" . + . + "58" . + "51" . + . + "64" . + "56" . + . + "62" . + "57" . + . + "164" . + "163" . + . + "346" . + "335" . + . + "358" . + "357" . + . + "31" . + "18" . + . + "168" . + "164" . + . + "204" . + "202" . + . + "375" . + "369" . + . + "236" . + "236" . + . + "247" . + "240" . + . + "76" . + "67" . + . + "292" . + "285" . + . + "27" . + "15" . + . + "84" . + "81" . + . + "88" . + "86" . + . + "55" . + "51" . + . + "235" . + "234" . + . + "395" . + "389" . + . + "328" . + "320" . + . + "368" . + "360" . + . + "178" . + "170" . + . + "152" . + "149" . + . + "267" . + "259" . + . + "295" . + "290" . + . + "247" . + "235" . + . + "128" . + "124" . + . + "307" . + "304" . + . + "129" . + "129" . + . + "124" . + "112" . + . + "124" . + "123" . + . + "183" . + "178" . + . + "116" . + "116" . + . + "316" . + "312" . + . + "50" . + "45" . + . + "348" . + "347" . + . + "292" . + "285" . + . + "229" . + "223" . + . + "429" . + "421" . + . + "174" . + "170" . + . + "95" . + "89" . + . + "293" . + "292" . + . + "382" . + "381" . + . + "267" . + "259" . + . + "156" . + "140" . + . + "370" . + "365" . + . + "263" . + "254" . + . + "333" . + "319" . + . + "9" . + "9" . + . + "301" . + "300" . + . + "202" . + "200" . + . + "448" . + "445" . + . + "106" . + "101" . + . + "273" . + "272" . + . + "412" . + "405" . + . + "52" . + "45" . + . + "279" . + "271" . + . + "28" . + "25" . + . + "277" . + "275" . + . + "288" . + "283" . + . + "399" . + "391" . + . + "112" . + "103" . + . + "364" . + "357" . + . + "210" . + "203" . + . + "138" . + "134" . + . + "85" . + "75" . + . + "339" . + "334" . + . + "253" . + "247" . + . + "268" . + "264" . + . + "267" . + "257" . + . + "271" . + "268" . + . + "296" . + "283" . + . + "300" . + "298" . + . + "202" . + "187" . + . + "233" . + "229" . + . + "280" . + "262" . + . + "219" . + "213" . + . + "210" . + "200" . + . + "246" . + "238" . + . + "54" . + "51" . + . + "410" . + "402" . + . + "76" . + "73" . + . + "235" . + "235" . + . + "180" . + "175" . + . + "231" . + "225" . + . + "213" . + "213" . + . + "111" . + "108" . + . + "43" . + "38" . + . + "54" . + "44" . + . + "57" . + "55" . + . + "74" . + "73" . + . + "312" . + "307" . + . + "171" . + "163" . + . + "146" . + "129" . + . + "303" . + "297" . + . + "221" . + "211" . + . + "170" . + "162" . + . + "139" . + "137" . + . + "128" . + "127" . + . + "192" . + "181" . + . + "270" . + "269" . + . + "60" . + "60" . + . + "270" . + "264" . + . + "234" . + "234" . + . + "352" . + "351" . + . + "362" . + "360" . + . + "136" . + "136" . + . + "317" . + "309" . + . + "115" . + "103" . + . + "379" . + "379" . + . + "331" . + "327" . + . + "355" . + "353" . + . + "236" . + "233" . + . + "453" . + "453" . + . + "330" . + "313" . + . + "252" . + "249" . + . + "315" . + "314" . + . + "377" . + "374" . + . + "214" . + "208" . + . + "78" . + "78" . + . + "133" . + "129" . + . + "263" . + "256" . + . + "140" . + "136" . + . + "320" . + "317" . + . + "14" . + "3" . + . + "163" . + "153" . + . + "157" . + "156" . + . + "342" . + "340" . + . + "18" . + "11" . + . + "199" . + "194" . + . + "417" . + "411" . + . + "224" . + "219" . + . + "228" . + "224" . + . + "277" . + "277" . + . + "93" . + "82" . + . + "44" . + "40" . + . + "134" . + "129" . + . + "451" . + "449" . + . + "301" . + "297" . + . + "313" . + "309" . + . + "172" . + "170" . + . + "17" . + "8" . + . + "228" . + "222" . + . + "369" . + "364" . + . + "267" . + "259" . + . + "91" . + "82" . + . + "310" . + "308" . + . + "234" . + "228" . + . + "99" . + "88" . + . + "214" . + "210" . + . + "167" . + "162" . + . + "255" . + "254" . + . + "286" . + "279" . + . + "333" . + "325" . + . + "388" . + "383" . + . + "319" . + "317" . + . + "140" . + "131" . + . + "56" . + "54" . + . + "186" . + "180" . + . + "289" . + "280" . + . + "106" . + "103" . + . + "141" . + "139" . + . + "274" . + "268" . + . + "174" . + "168" . + . + "156" . + "152" . + . + "347" . + "342" . + . + "359" . + "351" . + . + "146" . + "143" . + . + "307" . + "302" . + . + "258" . + "253" . + . + "332" . + "323" . + . + "279" . + "278" . + . + "108" . + "99" . + . + "83" . + "75" . + . + "30" . + "15" . + . + "342" . + "331" . + . + "359" . + "356" . + . + "287" . + "281" . + . + "39" . + "31" . + . + "280" . + "270" . + . + "343" . + "321" . + . + "416" . + "414" . + . + "135" . + "132" . + . + "316" . + "306" . + . + "163" . + "157" . + . + "172" . + "171" . + . + "33" . + "29" . + . + "221" . + "215" . + . + "206" . + "202" . + . + "310" . + "308" . + . + "309" . + "304" . + . + "64" . + "51" . + . + "308" . + "302" . + . + "147" . + "141" . + . + "88" . + "79" . + . + "213" . + "207" . + . + "99" . + "93" . + . + "218" . + "216" . + . + "346" . + "344" . + . + "256" . + "253" . + . + "103" . + "90" . + . + "302" . + "299" . + . + "399" . + "395" . + . + "239" . + "227" . + . + "114" . + "107" . + . + "123" . + "122" . + . + "439" . + "430" . + . + "348" . + "346" . + . + "15" . + "1" . + . + "188" . + "184" . + . + "252" . + "248" . + . + "157" . + "148" . + . + "33" . + "26" . + . + "142" . + "136" . + . + "279" . + "275" . + . + "174" . + "171" . + . + "7" . + "1" . + . + "357" . + "356" . + . + "91" . + "83" . + . + "311" . + "308" . + . + "262" . + "261" . + . + "161" . + "159" . + . + "3" . + "1" . + . + "11" . + "3" . + . + "413" . + "408" . + . + "201" . + "193" . + . + "363" . + "347" . + . + "377" . + "364" . + . + "286" . + "280" . + . + "231" . + "229" . + . + "356" . + "347" . + . + "282" . + "278" . + . + "179" . + "173" . + . + "363" . + "358" . + . + "36" . + "34" . + . + "316" . + "315" . + . + "338" . + "329" . + . + "303" . + "302" . + . + "101" . + "97" . + . + "454" . + "454" . + . + "113" . + "111" . + . + "322" . + "313" . + . + "96" . + "89" . + . + "153" . + "153" . + . + "161" . + "157" . + . + "365" . + "359" . + . + "25" . + "20" . + . + "129" . + "125" . + . + "124" . + "121" . + . + "126" . + "126" . + . + "16" . + "10" . + . + "76" . + "67" . + . + "4" . + "1" . + . + "256" . + "247" . + . + "193" . + "185" . + . + "404" . + "404" . + . + "310" . + "307" . + . + "19" . + "12" . + . + "81" . + "63" . + . + "104" . + "97" . + . + "96" . + "96" . + . + "240" . + "230" . + . + "189" . + "183" . + . + "261" . + "260" . + . + "223" . + "215" . + . + "299" . + "293" . + . + "254" . + "253" . + . + "130" . + "129" . + . + "44" . + "37" . + . + "303" . + "302" . + . + "21" . + "16" . + . + "220" . + "219" . + . + "352" . + "349" . + . + "168" . + "161" . + . + "186" . + "175" . + . + "194" . + "192" . + . + "343" . + "332" . + . + "284" . + "273" . + . + "147" . + "143" . + . + "348" . + "346" . + . + "93" . + "80" . + . + "404" . + "381" . + . + "305" . + "297" . + . + "227" . + "222" . + . + "190" . + "189" . + . + "370" . + "366" . + . + "66" . + "59" . + . + "306" . + "292" . + . + "148" . + "147" . + . + "384" . + "384" . + . + "356" . + "354" . + . + "139" . + "133" . + . + "166" . + "164" . + . + "95" . + "95" . + . + "197" . + "195" . + . + "66" . + "58" . + . + "357" . + "351" . + . + "111" . + "101" . + . + "15" . + "8" . + . + "148" . + "145" . + . + "164" . + "163" . + . + "182" . + "180" . + . + "163" . + "163" . + . + "88" . + "86" . + . + "74" . + "67" . + . + "401" . + "396" . + . + "337" . + "330" . + . + "166" . + "166" . + . + "344" . + "338" . + . + "7" . + "4" . + . + "57" . + "49" . + . + "186" . + "179" . + . + "404" . + "402" . + . + "141" . + "140" . + . + "208" . + "204" . + . + "371" . + "370" . + . + "33" . + "29" . + . + "97" . + "95" . + . + "367" . + "358" . + . + "194" . + "187" . + . + "350" . + "345" . + . + "127" . + "112" . + . + "414" . + "406" . + . + "133" . + "131" . + . + "94" . + "89" . + . + "100" . + "98" . + . + "203" . + "201" . + . + "395" . + "385" . + . + "162" . + "160" . + . + "21" . + "16" . + . + "405" . + "402" . + . + "369" . + "368" . + . + "3" . + "1" . + . + "28" . + "22" . + . + "108" . + "100" . + . + "159" . + "149" . + . + "319" . + "316" . + . + "178" . + "171" . + . + "329" . + "320" . + . + "374" . + "372" . + . + "218" . + "214" . + . + "1060" . + "1047" . + . + "1032" . + "1018" . + . + "736" . + "730" . + . + "753" . + "747" . + . + "317" . + "311" . + . + "18" . + "15" . + . + "220" . + "214" . + . + "613" . + "611" . + . + "756" . + "754" . + . + "152" . + "152" . + . + "298" . + "295" . + . + "109" . + "99" . + . + "163" . + "158" . + . + "88" . + "80" . + . + "478" . + "469" . + . + "222" . + "216" . + . + "63" . + "51" . + . + "86" . + "79" . + . + "366" . + "362" . + . + "44" . + "30" . + . + "214" . + "211" . + . + "244" . + "239" . + . + "407" . + "400" . + . + "310" . + "308" . + . + "106" . + "105" . + . + "308" . + "307" . + . + "677" . + "669" . + . + "121" . + "109" . + . + "289" . + "279" . + . + "196" . + "184" . + . + "514" . + "501" . + . + "385" . + "384" . + . + "552" . + "543" . + . + "589" . + "581" . + . + "615" . + "602" . + . + "174" . + "161" . + . + "425" . + "400" . + . + "350" . + "341" . + . + "84" . + "81" . + . + "420" . + "408" . + . + "59" . + "57" . + . + "722" . + "715" . + . + "790" . + "783" . + . + "344" . + "342" . + . + "262" . + "251" . + . + "304" . + "298" . + . + "507" . + "493" . + . + "224" . + "210" . + . + "627" . + "616" . + . + "134" . + "134" . + . + "758" . + "758" . + . + "759" . + "753" . + . + "631" . + "623" . + . + "325" . + "323" . + . + "137" . + "133" . + . + "568" . + "560" . + . + "51" . + "48" . + . + "468" . + "459" . + . + "71" . + "62" . + . + "776" . + "771" . + . + "65" . + "65" . + . + "564" . + "561" . + . + "191" . + "183" . + . + "200" . + "186" . + . + "132" . + "130" . + . + "259" . + "251" . + . + "150" . + "145" . + . + "95" . + "85" . + . + "245" . + "242" . + . + "405" . + "402" . + . + "284" . + "281" . + . + "156" . + "145" . + . + "33" . + "31" . + . + "244" . + "243" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "26"^^ . + . + . + . + "3"^^ . + . + . + . + "2025-07-27"^^ . + "Validating And Monitoring Bibliographic And Citation Data In OpenCitations Collections"^^ . + . + . + . + . + . + . + . + . + "2024-12-16"^^ . + "Space-Efficient Representation Of Citation Datasets"^^ . + . + . + . + . + . + . + . + "Proceedings Of The 24Th ACM/IEEE Joint Conference On Digital Libraries"^^ . + . + . + "2025-07-09"^^ . + "Are Nature Index Journals A Valid Basis For Academic Assessment: A Study Of Academic Impact And Disruptive Innovation Assessment Based On Open Bibliographic Metadata And Citation Data"^^ . + . + . + . + . + . + . + . + "5"^^ . + . + . + . + "2021-10-04"^^ . + "Towards Fully-Fledged Archiving For RDF Datasets" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "Semantic Web"^^ . + . + . + . + . + . + "12" . + . + . + . + "6" . + . + . + . + "2020-05-08"^^ . + "Provenance-Aware Knowledge Representation: A Survey Of Data Models And Contextualized Knowledge Graphs" . + . + . + . + . + . + . + . + . + . + "Data Science And Engineering"^^ . + . + . + . + . + . + "5" . + . + . + . + "3" . + . + . + . + "2019-04-15"^^ . + "Unpaywall" . + . + . + . + . + . + . + . + . + "2018-01-12"^^ . + "Semantic Scholar" . + . + . + . + . + . + . + . + . + "Journal Of The Medical Library Association" . + . + . + . + . + . + . + "107" . + . + . + . + "2" . + . + . + . + "106" . + . + . + . + "1" . + . + . + . + "1"^^ . + . + . + . + "2017"^^ . + "The Semantic Web" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "2016"^^ . + "The Semantic Web"^^ . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "1"^^ . + . + . + . + "Scientific Data"^^ . + . + . + . + . + . + "3"^^ . + . + . + . + "2014-11-06"^^ . + "Europe PMC: A Full-Text Literature Database For The Life Sciences And Platform For Innovation" . + . + . + . + . + . + . + . + . + . + "D1" . + . + . + . + "SSRN Electronic Journal"^^ . + . + . + . + . + . + "2014"^^ . + "The Semantic Web: ESWC 2014 Satellite Events" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "2019-09-14"^^ . + "Software Review: COCI, The OpenCitations Index Of Crossref Open DOI-to-DOI Citations" . + . + . + . + . + . + . + . + . + . + . + "121" . + . + . + . + "2" . + . + . + . + "2021-03-12"^^ . + "Web Of Science (WoS) And Scopus: The Titans Of Bibliographic Information In Today’s Academic World" . + . + . + . + . + . + . + . + . + "Publications"^^ . + . + . + . + . + "9" . + . + . + . + "1" . + . + . + . + "Nucleic Acids Research"^^ . + . + . + . + . + . + . + "43" . + . + . + . + "2005-02"^^ . + "What Is FRBR? A Conceptual Model For The Bibliographic Universe" . + . + . + . + . + . + . + . + . + "The Australian Library Journal"^^ . + . + . + . + . + . + "54" . + . + . + . + "1" . + . + . + . + . + . + "2017"^^ . + "Directory Of Open Access Journals (DOAJ)" . + . + . + . + . + . + . + . + . + "The Charleston Advisor"^^ . + . + . + . + . + . + "18" . + . + . + . + "3" . + . + . + . + "International Journal On Digital Libraries"^^ . + . + . + . + . + . + "2009-11"^^ . + "DataCite - A Global Registration Agency For Research Data" . + . + . + . + . + . + . + . + "2009 Fourth International Conference On Cooperation And Promotion Of Information Resources In Science And Technology" . + . + . + "Learned Publishing"^^ . + . + . + . + . + . + "2005"^^ . + "Named Graphs, Provenance And Trust" . + . + . + . + . + . + . + . + . + . + . + "Proceedings Of The 14Th International Conference On World Wide Web - WWW '05" . + . + . + "107" . + . + . + . + "106" . + . + . + . + "2020-02-20"^^ . + "Solutions For Identification Problems: A Look At The Research Organization Registry" . + . + . + . + . + . + . + . + . + "Science Editing"^^ . + . + . + . + . + . + "7" . + . + . + . + "1" . + . + . + . + "2014"^^ . + "Modelling OWL Ontologies With Graffoo" . + . + . + . + . + . + . + . + . + . + . + . + . + "1" . + . + . + . + "2" . + . + . + . + "Journal Of Informetrics"^^ . + . + . + . + . + . + . + . + "2024"^^ . + "OpenCitations Meta"^^ . + . + . + . + . + . + . + . + . + . + . + . + "2016"^^ . + "Semantic Web Conference Ontology - A Refactoring Solution" . + . + . + . + . + . + . + . + . + . + . + . + "2017-12-17"^^ . + "Biotea, Semantics For Pubmed Central" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "Humanities And Social Sciences Communications"^^ . + . + . + . + . + . + . + "2020-02"^^ . + "OpenCitations, An Infrastructure Organization For Open Scholarship" . + . + . + . + . + . + . + . + . + . + "2020-02"^^ . + "Crossref: The Sustainable Source Of Community-Owned Scholarly Metadata" . + . + . + . + . + . + . + . + . + . + . + . + "Quantitative Science Studies"^^ . + . + . + . + . + "1" . + . + . + . + "1" . + . + . + . + "2019-08-20"^^ . + "A Systematic Literature Review On Wikidata" . + . + . + . + . + . + . + . + . + . + . + "Data Technologies And Applications"^^ . + . + . + . + . + . + "53" . + . + . + . + "3" . + . + . + . + "2018-09-26"^^ . + "Building The Universal Archive Of Source Code" . + . + . + . + . + . + . + . + . + . + . + "10" . + . + . + . + "2016-02"^^ . + "Availability Of Digital Object Identifiers (DOIs) In Web Of Science And Scopus" . + . + . + . + . + . + . + . + . + . + . + . + "10" . + . + . + . + "1" . + . + . + . + "2010-06-30"^^ . + "The Dryad Digital Repository: Published Evolutionary Data As Part Of The Greater Data Ecosystem" . + . + . + . + . + . + . + . + "Nature Precedings" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "Scientometrics"^^ . + . + . + . + . + . + "1"^^ . + . + . + . + "2024-09-28"^^ . + "The OpenCitations Index: Description Of A Database Providing Open Citation Data"^^ . + . + . + . + . + . + . + . + . + . + "2012-10-01"^^ . + "ORCID: A System To Uniquely Identify Researchers" . + . + . + . + . + . + . + . + . + . + . + . + . + "25" . + . + . + . + "4" . + . + . + . + "2017"^^ . + "The OpenAIRE Workflows For Data Management" . + . + . + . + . + . + . + . + . + . + . + . + "Communications In Computer And Information Science" . + . + . + . + . + "2016-03-15"^^ . + "The FAIR Guiding Principles For Scientific Data Management And Stewardship"^^ . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "2022"^^ . + "A Programming Interface For Creating Data According To The SPAR Ontologies And The OpenCitations Data Model" . + . + . + . + . + . + . + . + . + . + . + "The Semantic Web" . + . + . + . + . + "2020-11-30"^^ . + "Improving Access To Scientific Literature With Knowledge Graphs" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "Bibliothek Forschung Und Praxis"^^ . + . + . + . + . + . + . + "44" . + . + . + . + "3" . + . + . + . + "2016-04-11"^^ . + "From Freebase To Wikidata" . + . + . + . + . + . + . + . + . + . + . + . + "Proceedings Of The 25Th International Conference On World Wide Web" . + . + . + "2017"^^ . + "Scholia, Scientometrics And Wikidata" . + . + . + . + . + . + . + . + . + . + . + "Lecture Notes In Computer Science" . + . + . + . + . + "6"^^ . + . + . + . + "PeerJ"^^ . + . + . + . + . + . + . + . + . + "2010"^^ . + "Datacite - A Global Registration Agency For Research Data" . + . + . + . + . + . + . + . + "2012"^^ . + "Scholarly Publishing And Linked Data" . + . + . + . + . + . + . + . + . + . + "Proceedings Of The 8Th International Conference On Semantic Systems - I-SEMANTICS '12" . + . + . + "Communications Of The ACM"^^ . + . + . + . + . + . + "61" . + . + . + . + "2017"^^ . + "Entity Deduplication On ScholarlyData" . + . + . + . + . + . + . + . + . + . + . + . + . + . + "12"^^ . + . + . + . + "2021-09"^^ . + "S2AND: A Benchmark And Evaluation System For Author Name Disambiguation" . + . + . + . + . + . + . + . + . + . + . + "2021 ACM/IEEE Joint Conference On Digital Libraries (JCDL)" . + . + . + . + . + . + "Journal On Data Semantics"^^ . + . + . + . + . + . + . + . + . + . + . + . + . + "10.1007/s00799-025-00425-9"^^ . + . + . + "0000-0003-3165-5344"^^ . + . + . + "30890711"^^ . + . + . + "2514-9318"^^ . + . + . + "10.1145/3677389.3702546"^^ . + . + . + "10.1057/s41599-025-05387-6"^^ . + . + . + "311"^^ . + . + . + "140"^^ . + . + . + "301"^^ . + . + . + "297"^^ . + . + . + "78"^^ . + . + . + "286"^^ . + . + . + "320"^^ . + . + . + "263"^^ . + . + . + "374"^^ . + . + . + "7437"^^ . + . + . + "281"^^ . + . + . + "3176"^^ . + . + . + "1968"^^ . + . + . + "10.3233/sw-210434" . + . + . + "2210-4968"^^ . + . + . + "1570-0844"^^ . + . + . + "0000-0001-5212-7052"^^ . + . + . + "S4210195326"^^ . + . + . + "0000-0001-9610-5728"^^ . + . + . + "0000-0001-5109-3700"^^ . + . + . + "0000-0003-4450-3112"^^ . + . + . + "10.1007/s41019-020-00118-0" . + . + . + "2364-1185"^^ . + . + . + "2364-1541"^^ . + . + . + "9783319580678" . + . + . + "9783319580685" . + . + . + "10.1007/978-3-319-58068-5" . + . + . + "9783319476018"^^ . + . + . + "9783319476025"^^ . + . + . + "10.1007/978-3-319-47602-5"^^ . + . + . + "10.5195/jmla.2019.650" . + . + . + "10.5195/jmla.2018.280" . + . + . + "1558-9439" . + . + . + "1536-5050" . + . + . + "S4210172589"^^ . + . + . + "0000-0003-4155-5910"^^ . + . + . + "10.1093/nar/gku1061" . + . + . + "9783319119540" . + . + . + "9783319119557" . + . + . + "10.1007/978-3-319-11955-7" . + . + . + "2052-4463"^^ . + . + . + "0000-0002-7618-7292"^^ . + . + . + "1556-5068"^^ . + . + . + "0000-0002-4412-9717" . + . + . + "0000-0003-1386-0731"^^ . + . + . + "10.1007/s11192-019-03217-6" . + . + . + "0000-0001-5055-7876" . + . + . + "0000-0001-9613-6639" . + . + . + "W2302501749"^^ . + . + . + "0000-0001-6935-9028"^^ . + . + . + "0000-0003-3499-8262"^^ . + . + . + "10.3390/publications9010012" . + . + . + "2304-6775"^^ . + . + . + "10.1080/00049670.2005.10721710" . + . + . + "0004-9670"^^ . + . + . + "2201-4276"^^ . + . + . + "10.35092/yhjc.c.4586573" . + . + . + "0000-0003-1219-2137"^^ . + . + . + "0000-0002-1279-5133"^^ . + . + . + "0000-0003-0183-6910"^^ . + . + . + "0000-0001-9879-3827"^^ . + . + . + "1362-4962"^^ . + . + . + "0305-1048"^^ . + . + . + "S110615584"^^ . + . + . + "W3136510568" . + . + . + "10.5260/chara.18.3.25" . + . + . + "1525-4011"^^ . + . + . + "1525-4003"^^ . + . + . + "W2799725891" . + . + . + "W3006916957" . + . + . + "1432-5012"^^ . + . + . + "1432-1300"^^ . + . + . + "0000-0003-1238-2539" . + . + . + "10.1109/coinfo.2009.66" . + . + . + "10.1145/1060745.1060835" . + . + . + "1741-4857"^^ . + . + . + "0953-1513"^^ . + . + . + "S4210171756"^^ . + . + . + "10.6087/kcse.192" . + . + . + "2288-8063"^^ . + . + . + "2288-7474"^^ . + . + . + "10.1007/978-3-319-11955-7_42" . + . + . + "0000-0002-0979-3401"^^ . + . + . + "S89564548"^^ . + . + . + "0000-0003-0095-3568" . + . + . + "0000-0002-9680-2328"^^ . + . + . + "0000-0001-6128-3356"^^ . + . + . + "0000-0002-8250-6253" . + . + . + "29312824" . + . + . + "0000-0002-8587-8618" . + . + . + "W2616601454" . + . + . + "0000-0002-5993-8592" . + . + . + "1751-1577"^^ . + . + . + "0000-0001-8686-0017"^^ . + . + . + "0000-0003-1304-1939"^^ . + . + . + "0000-0002-7516-6246"^^ . + . + . + "10.6084/m9.figshare.3443876.v7" . + . + . + "0000-0003-1377-9386"^^ . + . + . + "10.1162/qss_a_00292"^^ . + . + . + "0000-0002-7382-0187"^^ . + . + . + "0000-0001-5366-5194"^^ . + . + . + "0000-0003-0530-4305"^^ . + . + . + "0000-0001-5506-523X"^^ . + . + . + "0000-0002-7138-3542" . + . + . + "0000-0001-8641-4930"^^ . + . + . + "10.7717/peerj.4201" . + . + . + "10.1007/978-3-319-47602-5_18" . + . + . + "0000-0001-5654-2392"^^ . + . + . + "0000-0001-6960-357X"^^ . + . + . + "0000-0002-8042-4131"^^ . + . + . + "0000-0002-7562-5203"^^ . + . + . + "S2738007992"^^ . + . + . + "2662-9992"^^ . + . + . + "10.7287/peerj.preprints.3469v1" . + . + . + "10.25495/7gxk-rd71" . + . + . + "0000-0002-4836-6568"^^ . + . + . + "0000-0002-0885-8699"^^ . + . + . + "0000-0001-5506-523X" . + . + . + "0000-0003-1419-2405"^^ . + . + . + "W2041971736" . + . + . + "0000-0001-7782-5922"^^ . + . + . + "10.1162/qss_a_00023" . + . + . + "10.1162/qss_a_00022" . + . + . + "2641-3337"^^ . + . + . + "10.1108/dta-12-2018-0110" . + . + . + "2514-9288"^^ . + . + . + "10.1145/3183558" . + . + . + "1875-5879"^^ . + . + . + "0000-0002-5193-7851" . + . + . + "0000-0002-1267-0234"^^ . + . + . + "0000-0001-5568-2684"^^ . + . + . + "0000-0002-1113-7550" . + . + . + "0000-0003-0327-638X"^^ . + . + . + "10.1016/j.joi.2015.11.008" . + . + . + "10.1038/npre.2010.4595.1" . + . + . + "1756-0357" . + . + . + "1588-2861"^^ . + . + . + "0138-9130"^^ . + . + . + "0000-0001-5800-1434" . + . + . + "S48744551" . + . + . + "10.23640/07243.12469094.v1"^^ . + . + . + "10.48550/arxiv.1902.02534"^^ . + . + . + "10.5281/zenodo.5557028"^^ . + . + . + "10.48550/arxiv.2210.02534"^^ . + . + . + "10.6084/m9.figshare.21747461.v3"^^ . + . + . + "10.6084/m9.figshare.21747536.v3"^^ . + . + . + "0000-0002-0698-2864"^^ . + . + . + "W2309189658" . + . + . + "10.1007/s11192-024-05160-7"^^ . + . + . + "0000-0001-5486-7070"^^ . + . + . + "0000-0003-0530-4305"^^ . + . + . + "0009-0008-1466-7742"^^ . + . + . + "0000-0002-4011-3590"^^ . + . + . + "10.1087/20120404" . + . + . + "4443"^^ . + . + . + "10.1007/978-3-319-68130-6_8" . + . + . + "9783319681290" . + . + . + "9783319681306" . + . + . + "0000-0001-5366-5194"^^ . + . + . + "0000-0003-0530-4305"^^ . + . + . + "0000-0002-2480-1078"^^ . + . + . + "0000-0002-1164-1351"^^ . + . + . + "W4285173206" . + . + . + "10.1038/sdata.2016.18"^^ . + . + . + "0000-0003-2829-6715"^^ . + . + . + "0000-0001-8599-7345"^^ . + . + . + "0000-0002-7352-1400"^^ . + . + . + "0000-0003-2401-4223"^^ . + . + . + "0000-0003-3188-6273" . + . + . + "0000-0001-5787-6853"^^ . + . + . + "0000-0003-2928-9496"^^ . + . + . + "0000-0002-4576-136X"^^ . + . + . + "10.6084/m9.figshare.6741422.v18" . + . + . + "W4245488324"^^ . + . + . + "W3115553721" . + . + . + "0000-0001-9773-4008"^^ . + . + . + "0000-0002-5301-3142"^^ . + . + . + "0000-0001-7542-0286"^^ . + . + . + "W2893990175" . + . + . + "W2767995756" . + . + . + "W4236981150" . + . + . + "W4243798656" . + . + . + "W2054509941" . + . + . + "W2761760240" . + . + . + "W2055380710" . + . + . + "10.1007/978-3-031-06981-9_18" . + . + . + "9783031069802" . + . + . + "9783031069819" . + . + . + "1643"^^ . + . + . + "3214" . + . + . + "10.1515/bfp-2020-2042" . + . + . + "1865-7648"^^ . + . + . + "0341-4183"^^ . + . + . + "10.1145/2872427.2874809" . + . + . + "10.1007/978-3-319-70407-4_36" . + . + . + "9783319704067" . + . + . + "9783319704074" . + . + . + "0000-0002-0209-4480"^^ . + . + . + "25378340" . + . + . + "W2938946739" . + . + . + "2167-8359"^^ . + . + . + "0000-0002-8420-0696"^^ . + . + . + "0009-0003-7161-9310"^^ . + . + . + "10.48550/arxiv.2205.01833" . + . + . + "S4210206302"^^ . + . + . + "W2784292677" . + . + . + "W3023112361" . + . + . + "W2152577585" . + . + . + "10.2139/ssrn.1639998" . + . + . + "26978244"^^ . + . + . + "0000-0003-4727-9435"^^ . + . + . + "S82568730"^^ . + . + . + "S29676049"^^ . + . + . + "0000-0001-9488-1870"^^ . + . + . + "S2739153651"^^ . + . + . + "S134668137"^^ . + . + . + "S146304353" . + . + . + "S4210177235"^^ . + . + . + "W3175063576" . + . + . + "S148561398"^^ . + . + . + "0000-0002-0620-6486" . + . + . + "10.1145/2362499.2362502" . + . + . + "S2486411021"^^ . + . + . + "0000-0002-2123-6317"^^ . + . + . + "1557-7317"^^ . + . + . + "0001-0782"^^ . + . + . + "0000-0003-0179-7384"^^ . + . + . + "W403298716" . + . + . + "0000-0002-0353-2702" . + . + . + "0000-0002-7633-1442"^^ . + . + . + "4099"^^ . + . + . + "10.1007/978-3-319-58068-5_6" . + . + . + "W618057993" . + . + . + "W3112005222" . + . + . + "W2231201268" . + . + . + "W183866246" . + . + . + "W3215308037" . + . + . + "S2607323502"^^ . + . + . + "0000-0003-3368-2215" . + . + . + "0000-0002-8691-772X"^^ . + . + . + "10.18653/v1/2020.sdp-1.2"^^ . + . + . + "S103482838"^^ . + . + . + "W4229010617" . + . + . + "W2969235873" . + . + . + "W3002281830" . + . + . + "W3106215946" . + . + . + "S1983995261"^^ . + . + . + "S165931258"^^ . + . + . + "W3122659278" . + . + . + "1864-3035"^^ . + . + . + "1861-2067"^^ . + . + . + "1867-7754"^^ . + . + . + "1611-3349"^^ . + . + . + "1861-2059"^^ . + . + . + "0302-9743"^^ . + . + . + "1861-2040"^^ . + . + . + "1861-2032"^^ . + . + . + "10.1109/jcdl52503.2021.00029" . + . + . + "0000-0002-4368-8058"^^ . + . + . + "10.6084/m9.figshare.6683855.v1" . + . + . + "0000-0003-3934-0072"^^ . + . + . + "0000-0001-8888-635X"^^ . + . + . + "0000-0001-6825-9439"^^ . + . + . + "0000-0002-5711-4872"^^ . + . + . + "0000-0001-9853-5668"^^ . + . + . + "0000-0001-5306-5690"^^ . + . + . + "0000-0003-4060-7360"^^ . + . + . + "0000-0001-6444-1436"^^ . + . + . + "0000-0002-8406-3871"^^ . + . + . + "S205292342"^^ . + . + . + "0000-0002-2414-3212"^^ . + . + . + "0000-0002-9188-8716" . + . + . + "W2104231400" . + . + . + "W3137875885" . + . + . + "W2578379428" . + . + . + "Springer Science And Business Media Llc" . + . + "PeerJ" . + . + . + "Goble"^^ . + "Carole"^^ . + . + . + "Groth"^^ . + "Paul"^^ . + . + "Swacha"^^ . + "Jakub"^^ . + . + "Jiang"^^ . + "Yuyan"^^ . + . + "Ma"^^ . + "Jianxia"^^ . + . + "Heibi"^^ . + "Ivan"^^ . + . + "Peroni"^^ . + "Silvio"^^ . + . + . + "Grethe"^^ . + "Jeffery S."^^ . + . + . + "Martone"^^ . + "Maryann E."^^ . + . + . + "Wiley"^^ . + . + . + "Emerald"^^ . + . + . + "Informa Uk Limited"^^ . + . + . + "Springer Science And Business Media Llc"^^ . + . + . + "Elsevier Bv"^^ . + . + . + "Oxford University Press (Oup)"^^ . + . + . + "Association For Computing Machinery (Acm)"^^ . + . + . + "Institute Of Electrical And Electronics Engineers (Ieee)"^^ . + . + . + "Walter De Gruyter GmbH"^^ . + . + . + "Ios Press"^^ . + . + . + "Mit Press"^^ . + . + . + "University Library System, University Of Pittsburgh"^^ . + . + . + "Mdpi Ag"^^ . + . + . + "Zacchiroli"^^ . + "Stefano"^^ . + "Stefano Zacchiroli"^^ . + . + . + "Haak"^^ . + "Laurel"^^ . + . + . + "’T Hoen"^^ . + "Peter A C"^^ . + . + "Philp" . + "Dean" . + . + . + "Packer"^^ . + "Abel L."^^ . + . + "Pelgrin" . + "Olivier" . + . + "Galárraga" . + "Luis" . + . + "Hose" . + "Katja" . + . + "Ngonga Ngomo" . + "Axel-Cyrille" . + . + "Saleem" . + "Muhammad" . + . + "Verborgh" . + "Ruben" . + . + "Saleem" . + "Muhammad" . + . + "Verborgh" . + "Ruben" . + . + "Ali" . + "Muhammad Intizar" . + . + "Hartig" . + "Olaf" . + . + . + "Wilkinson"^^ . + "Mark D"^^ . + . + . + "Blomberg"^^ . + "Niklas"^^ . + . + . + "Mietchen"^^ . + "Daniel"^^ . + . + "The Europe Pmc Consortium" . + . + . + "Bourne"^^ . + "Philip E"^^ . + . + . + "Fricke" . + "Suzanne" . + . + . + "Slater"^^ . + "Ted"^^ . + . + . + "Tkaczyk" . + "Dominika" . + . + . + "Atzori" . + "Claudio" . + . + . + "Mora-Cantallops"^^ . + "Marçal"^^ . + . + . + "Peroni"^^ . + "Silvio"^^ . + "Peroni Silvio" . + . + . + "Evelo"^^ . + "Chris T"^^ . + . + . + "Zhao"^^ . + "Jun"^^ . + . + . + "Gonzalez-Beltran"^^ . + "Alejandra"^^ . + . + . + "Lange"^^ . + "Christoph"^^ . + "Christoph Lange"^^ . + . + . + "Wolstencroft"^^ . + "Katherine J."^^ . + . + "Morrison" . + "Heather" . + . + "Blomqvist" . + "Eva" . + . + "Maynard" . + "Diana" . + . + "Gangemi" . + "Aldo" . + . + "Hoekstra" . + "Rinke" . + . + "Hitzler" . + "Pascal" . + . + "Hartig" . + "Olaf" . + . + "Sack" . + "Harald" . + . + "Rizzo" . + "Giuseppe" . + . + "Steinmetz" . + "Nadine" . + . + "Mladenić" . + "Dunja" . + . + "Tillett" . + "Barbara" . + . + . + "Zhang" . + "Ziqi" . + . + . + "Van Mulligen"^^ . + "Erik M"^^ . + . + . + "García-Castro" . + "Alexander" . + . + "Presutti" . + "Valentina" . + . + "Blomqvist" . + "Eva" . + . + "Troncy" . + "Raphael" . + . + "Sack" . + "Harald" . + . + "Papadakis" . + "Ioannis" . + . + "Tordai" . + "Anna" . + . + . + "Axton"^^ . + "Myles"^^ . + . + . + "Persson"^^ . + "Bengt"^^ . + . + "Carroll" . + "Jeremy J." . + . + "Bizer" . + "Christian" . + . + "Hayes" . + "Pat" . + . + "Stickler" . + "Patrick" . + . + . + "Mannocci" . + "Andrea" . + "Mannocci Andrea" . + . + . + "Gray"^^ . + "Alasdair J. G."^^ . + . + . + "Edmunds"^^ . + "Scott"^^ . + . + "Falco" . + "Riccardo" . + . + "Shotton" . + "David" . + . + . + "Lin"^^ . + "Jennifer"^^ . + . + . + "Nielsen"^^ . + "Finn Årup"^^ . + "Nielsen Finn Årup"^^ . + . + . + "Brase" . + "Jan" . + . + . + "Pentz" . + "Ed" . + . + . + "Pranckutė" . + "Raminta" . + . + . + "Kuhn"^^ . + "Tobias"^^ . + . + . + "Brookes"^^ . + "Anthony J."^^ . + . + . + "Sengstag"^^ . + "Thierry"^^ . + . + . + "Shotton" . + "D M" . + "Shotton David" . + . + . + "Willighagen"^^ . + "Egon"^^ . + "Willighagen Egon"^^ . + . + . + "Mariani"^^ . + "Fabio"^^ . + . + . + "Heibi"^^ . + "Ivan"^^ . + . + . + "Peroni"^^ . + "Silvio"^^ . + . + . + "Shotton"^^ . + "David"^^ . + . + . + "Zurian"^^ . + "Juan Carlos Valderrama"^^ . + . + . + "Lopez" . + "Federico" . + . + . + "Bucheli"^^ . + "Victor A."^^ . + . + . + "Dillo" . + "Ingrid" . + . + "Olga Giraldo" . + . + "Víctor A. Bucheli" . + . + "Leyla Garcia" . + . + . + "Vitali"^^ . + "Fabio"^^ . + "Fabio Vitali" . + . + "Lopez" . + "Federico" . + . + "Garcia" . + "Leyla" . + . + "Giraldo" . + "Olga" . + . + "Gentile" . + "Anna Lisa" . + . + "Presutti" . + "Valentina" . + . + . + "Swertz"^^ . + "Morris A"^^ . + . + . + "Clark"^^ . + "Timothy"^^ . + . + . + "Velterop"^^ . + "Jan"^^ . + . + "Garcia" . + "Leyla" . + . + "Giraldo" . + "Olga" . + . + . + "Hendricks" . + "Ginny" . + "Hendricks Ginny" . + . + . + "Gangemi"^^ . + "Aldo"^^ . + . + . + "Schultes"^^ . + "Erik"^^ . + . + . + "Massari"^^ . + "Arcangelo"^^ . + . + . + "Daquino" . + "Marilena" . + . + . + "Boiten"^^ . + "Jan-Willem"^^ . + . + "Melero-Fuentes" . + "David" . + . + "Sánchez-Alonso" . + "Salvador" . + . + "García-Barriocanal" . + "Elena" . + . + "Abramatic" . + "Jean-François" . + . + "Di Cosmo" . + "Roberto" . + . + . + "Dhakal"^^ . + "Kerry"^^ . + . + . + "Waagmeester"^^ . + "Andra"^^ . + . + . + "Paglione" . + "Laura" . + "Laura A D Paglione" . + . + . + "Lammey" . + "Rachael" . + . + "Vision" . + "Todd" . + . + . + "Auer"^^ . + "Soren"^^ . + . + . + "Moretti"^^ . + "Arianna"^^ . + . + . + "Peroni"^^ . + "Silvio"^^ . + . + . + "Soricetti"^^ . + "Marta"^^ . + . + . + "PeerJ"^^ . + . + . + "Heibi"^^ . + "Ivan"^^ . + "Heibi Ivan" . + . + . + "Mons"^^ . + "Barend"^^ . + . + . + "Roos"^^ . + "M."^^ . + . + . + "Olavo Bonino Da Silva Santos"^^ . + "Luiz"^^ . + . + . + "Baak"^^ . + "Arie"^^ . + . + "Bouwman"^^ . + "Jildau"^^ . + . + . + "Dumon"^^ . + "Olivier"^^ . + . + "Kok"^^ . + "Ruben"^^ . + . + . + "Kok"^^ . + "Joost"^^ . + . + . + "Lusher"^^ . + "Scott J."^^ . + . + "Mons"^^ . + "Albert"^^ . + . + "Van Schaik"^^ . + "Rene"^^ . + . + "Strawn"^^ . + "George"^^ . + . + "Van Der Lei"^^ . + "Johan"^^ . + . + "Wittenburg"^^ . + "Peter"^^ . + . + . + "Ratner"^^ . + "Howard"^^ . + . + "Bardi" . + "Alessia" . + . + "Manghi" . + "Paolo" . + . + . + "Nuzzolese"^^ . + "Andrea Giovanni"^^ . + . + . + "Heringa"^^ . + "Jaap"^^ . + . + . + "Sikos" . + "Leslie F." . + . + . + "Association For Computational Linguistics (Acl)"^^ . + . + . + "The Charleston Co." . + . + . + "Rizzetto"^^ . + "Elia"^^ . + . + . + "Aalbersberg"^^ . + "IJsbrand Jan"^^ . + . + "Persiani" . + "Simone" . + . + "Auer" . + "Sören" . + . + "Oelen" . + "Allard" . + . + "Haris" . + "Muhammad" . + . + "Stocker" . + "Markus" . + . + "D’Souza" . + "Jennifer" . + . + "Farfar" . + "Kheir Eddine" . + . + "Vogt" . + "Lars" . + . + "Prinz" . + "Manuel" . + . + "Wiens" . + "Vitalis" . + . + "Jaradeh" . + "Mohamad Yaser" . + . + "Vrandečić" . + "Denny" . + . + "Schaffert" . + "Sebastian" . + . + "Steiner" . + "Thomas" . + . + "Pintscher" . + "Lydia" . + . + . + "Feeney"^^ . + "Patricia"^^ . + . + . + "Finkers"^^ . + "Richard"^^ . + . + . + "Crosas" . + "Mercè" . + . + . + "Dumontier"^^ . + "Michel"^^ . + . + . + "Fenner"^^ . + "Martin"^^ . + "Fenner Martin" . + . + . + "Appleton"^^ . + "Gaby"^^ . + . + . + "Pellissier Tanon" . + "Thomas" . + . + "Peroni" . + "Silvio" . + . + "Shotton" . + "David" . + . + "Vitali" . + "Fabio" . + . + . + "Korean Council Of Science Editors"^^ . + . + "Gentile" . + "Anna Lisa" . + . + . + "Thompson"^^ . + "Mark"^^ . + . + . + "Rocca-Serra" . + "Philippe" . + . + . + "Sansone" . + "Susanna-Assunta" . + . + . + "Hooft"^^ . + "Rob"^^ . + . + . + "Gorraiz"^^ . + "Juan"^^ . + . + . + "Gumpenberger" . + "Christian" . + . + "Subramanian" . + "Shivashankar" . + . + "King" . + "Daniel" . + . + "Downey" . + "Doug" . + . + "Feldman" . + "Sergey" . + "3"^^ . + "1"^^ . + . + "925" . + "903" . + . + "316" . + "293" . + . + "1048" . + "1042" . + . + "1228" . + "1213" . + . + "12" . + "12" . + . + "30" . + "24" . + . + "28" . + "25" . + . + "69" . + "65" . + . + "325" . + "320" . + . + "75"^^ . + "50"^^ . + . + "e4201" . + "e4201" . + . + "87" . + "84" . + . + "444" . + "428" . + . + "427" . + "414" . + . + "268" . + "250" . + . + "31" . + "29" . + . + "109" . + "98" . + . + "264" . + "259" . + . + "107" . + "95" . + . + "322" . + "305" . + . + "529" . + "516" . + . + "259" . + "237" . + . + "100" . + "85" . + . + . + "2021-06-09"^^ . + "Classes Of Errors In DOI Names (Data Management Plan)" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "10.5281/zenodo.4733919" . + . + . + "Zenodo" . + . + . + "2021-06-08"^^ . + "Cleaning Different Types Of DOI Errors Found In Cited References On Crossref Using Automated Methods" . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + . + "10.5281/zenodo.4734512" . + . + . + "Zenodo" . diff --git a/uv.lock b/uv.lock index aaef5d9..f767806 100644 --- a/uv.lock +++ b/uv.lock @@ -1,10 +1,10 @@ version = 1 revision = 3 -requires-python = ">=3.9, <3.12" +requires-python = ">=3.10, <3.13" resolution-markers = [ - "python_full_version >= '3.11'", - "python_full_version == '3.10.*'", - "python_full_version < '3.10'", + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version < '3.11'", ] [[package]] @@ -23,30 +23,20 @@ wheels = [ ] [[package]] -name = "astroid" -version = "3.3.11" +name = "argcomplete" +version = "3.6.3" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/18/74/dfb75f9ccd592bbedb175d4a32fc643cf569d7c218508bfbd6ea7ef9c091/astroid-3.3.11.tar.gz", hash = "sha256:1e5a5011af2920c7c67a53f65d536d65bfa7116feeaf2354d8b94f29573bb0ce", size = 400439, upload-time = "2025-07-13T18:04:23.177Z" } +sdist = { url = "https://files.pythonhosted.org/packages/38/61/0b9ae6399dd4a58d8c1b1dc5a27d6f2808023d0b5dd3104bb99f45a33ff6/argcomplete-3.6.3.tar.gz", hash = "sha256:62e8ed4fd6a45864acc8235409461b72c9a28ee785a2011cc5eb78318786c89c", size = 73754, upload-time = "2025-10-20T03:33:34.741Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/af/0f/3b8fdc946b4d9cc8cc1e8af42c4e409468c84441b933d037e101b3d72d86/astroid-3.3.11-py3-none-any.whl", hash = "sha256:54c760ae8322ece1abd213057c4b5bba7c49818853fc901ef09719a60dbf9dec", size = 275612, upload-time = "2025-07-13T18:04:21.07Z" }, + { url = "https://files.pythonhosted.org/packages/74/f5/9373290775639cb67a2fce7f629a1c240dce9f12fe927bc32b2736e16dfc/argcomplete-3.6.3-py3-none-any.whl", hash = "sha256:f5007b3a600ccac5d25bbce33089211dfd49eab4a7718da3f10e3082525a92ce", size = 43846, upload-time = "2025-10-20T03:33:33.021Z" }, ] [[package]] name = "astroid" version = "4.0.4" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11'", - "python_full_version == '3.10.*'", -] dependencies = [ - { name = "typing-extensions", marker = "python_full_version == '3.10.*'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/07/63/0adf26577da5eff6eb7a177876c1cfa213856be9926a000f65c4add9692b/astroid-4.0.4.tar.gz", hash = "sha256:986fed8bcf79fb82c78b18a53352a0b287a73817d6dbcfba3162da36667c49a0", size = 406358, upload-time = "2026-02-07T23:35:07.509Z" } wheels = [ @@ -75,6 +65,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/43/53afb8ba17218f19b77c7834128566c5bbb100a0ad9ba2e8e89d089d7079/autopep8-2.3.2-py2.py3-none-any.whl", hash = "sha256:ce8ad498672c845a0c3de2629c15b635ec2b05ef8177a6e7c91c74f3e9b51128", size = 45807, upload-time = "2025-01-14T14:46:15.466Z" }, ] +[[package]] +name = "blinker" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload-time = "2024-11-08T17:25:47.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" }, +] + [[package]] name = "certifi" version = "2019.11.28" @@ -89,8 +88,7 @@ name = "cffi" version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser", version = "2.23", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' and implementation_name != 'PyPy'" }, - { name = "pycparser", version = "3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and implementation_name != 'PyPy'" }, + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ @@ -99,17 +97,9 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, - { url = "https://files.pythonhosted.org/packages/aa/d9/6218d78f920dcd7507fc16a766b5ef8f3b913cc7aa938e7fc80b9978d089/cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a", size = 172138, upload-time = "2025-09-08T23:24:01.7Z" }, - { url = "https://files.pythonhosted.org/packages/54/8f/a1e836f82d8e32a97e6b29cc8f641779181ac7363734f12df27db803ebda/cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9", size = 182794, upload-time = "2025-09-08T23:24:02.943Z" }, -] - -[[package]] -name = "chardet" -version = "3.0.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/bb/a5768c230f9ddb03acc9ef3f0d4a3cf93462473795d18e9535498c8f929d/chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", size = 1868453, upload-time = "2017-06-08T14:34:35.581Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bc/a9/01ffebfb562e4274b6487b4bb1ddec7ca55ec7510b22e4c51f14098443b8/chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691", size = 133356, upload-time = "2017-06-08T14:34:33.552Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, ] [[package]] @@ -144,19 +134,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/59/2e/d3b9811db26a5ebf444bc0fa4f4be5aa6d76fc6e1c0fd537b16c14e849b6/charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", size = 148015, upload-time = "2025-05-02T08:32:28.376Z" }, { url = "https://files.pythonhosted.org/packages/90/07/c5fd7c11eafd561bb51220d600a788f1c8d77c5eef37ee49454cc5c35575/charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", size = 98106, upload-time = "2025-05-02T08:32:30.281Z" }, { url = "https://files.pythonhosted.org/packages/a8/05/5e33dbef7e2f773d672b6d79f10ec633d4a71cd96db6673625838a4fd532/charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", size = 105402, upload-time = "2025-05-02T08:32:32.191Z" }, - { url = "https://files.pythonhosted.org/packages/28/f8/dfb01ff6cc9af38552c69c9027501ff5a5117c4cc18dcd27cb5259fa1888/charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", size = 201671, upload-time = "2025-05-02T08:34:12.696Z" }, - { url = "https://files.pythonhosted.org/packages/32/fb/74e26ee556a9dbfe3bd264289b67be1e6d616329403036f6507bb9f3f29c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", size = 144744, upload-time = "2025-05-02T08:34:14.665Z" }, - { url = "https://files.pythonhosted.org/packages/ad/06/8499ee5aa7addc6f6d72e068691826ff093329fe59891e83b092ae4c851c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", size = 154993, upload-time = "2025-05-02T08:34:17.134Z" }, - { url = "https://files.pythonhosted.org/packages/f1/a2/5e4c187680728219254ef107a6949c60ee0e9a916a5dadb148c7ae82459c/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", size = 147382, upload-time = "2025-05-02T08:34:19.081Z" }, - { url = "https://files.pythonhosted.org/packages/4c/fe/56aca740dda674f0cc1ba1418c4d84534be51f639b5f98f538b332dc9a95/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", size = 149536, upload-time = "2025-05-02T08:34:21.073Z" }, - { url = "https://files.pythonhosted.org/packages/53/13/db2e7779f892386b589173dd689c1b1e304621c5792046edd8a978cbf9e0/charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", size = 151349, upload-time = "2025-05-02T08:34:23.193Z" }, - { url = "https://files.pythonhosted.org/packages/69/35/e52ab9a276186f729bce7a0638585d2982f50402046e4b0faa5d2c3ef2da/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", size = 146365, upload-time = "2025-05-02T08:34:25.187Z" }, - { url = "https://files.pythonhosted.org/packages/a6/d8/af7333f732fc2e7635867d56cb7c349c28c7094910c72267586947561b4b/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", size = 154499, upload-time = "2025-05-02T08:34:27.359Z" }, - { url = "https://files.pythonhosted.org/packages/7a/3d/a5b2e48acef264d71e036ff30bcc49e51bde80219bb628ba3e00cf59baac/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", size = 157735, upload-time = "2025-05-02T08:34:29.798Z" }, - { url = "https://files.pythonhosted.org/packages/85/d8/23e2c112532a29f3eef374375a8684a4f3b8e784f62b01da931186f43494/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", size = 154786, upload-time = "2025-05-02T08:34:31.858Z" }, - { url = "https://files.pythonhosted.org/packages/c7/57/93e0169f08ecc20fe82d12254a200dfaceddc1c12a4077bf454ecc597e33/charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", size = 150203, upload-time = "2025-05-02T08:34:33.88Z" }, - { url = "https://files.pythonhosted.org/packages/2c/9d/9bf2b005138e7e060d7ebdec7503d0ef3240141587651f4b445bdf7286c2/charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", size = 98436, upload-time = "2025-05-02T08:34:35.907Z" }, - { url = "https://files.pythonhosted.org/packages/6d/24/5849d46cf4311bbf21b424c443b09b459f5b436b1558c04e45dbb7cc478b/charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", size = 105772, upload-time = "2025-05-02T08:34:37.935Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a4/37f4d6035c89cac7930395a35cc0f1b872e652eaafb76a6075943754f095/charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", size = 199936, upload-time = "2025-05-02T08:32:33.712Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8a/1a5e33b73e0d9287274f899d967907cd0bf9c343e651755d9307e0dbf2b3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", size = 143790, upload-time = "2025-05-02T08:32:35.768Z" }, + { url = "https://files.pythonhosted.org/packages/66/52/59521f1d8e6ab1482164fa21409c5ef44da3e9f653c13ba71becdd98dec3/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", size = 153924, upload-time = "2025-05-02T08:32:37.284Z" }, + { url = "https://files.pythonhosted.org/packages/86/2d/fb55fdf41964ec782febbf33cb64be480a6b8f16ded2dbe8db27a405c09f/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", size = 146626, upload-time = "2025-05-02T08:32:38.803Z" }, + { url = "https://files.pythonhosted.org/packages/8c/73/6ede2ec59bce19b3edf4209d70004253ec5f4e319f9a2e3f2f15601ed5f7/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", size = 148567, upload-time = "2025-05-02T08:32:40.251Z" }, + { url = "https://files.pythonhosted.org/packages/09/14/957d03c6dc343c04904530b6bef4e5efae5ec7d7990a7cbb868e4595ee30/charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", size = 150957, upload-time = "2025-05-02T08:32:41.705Z" }, + { url = "https://files.pythonhosted.org/packages/0d/c8/8174d0e5c10ccebdcb1b53cc959591c4c722a3ad92461a273e86b9f5a302/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", size = 145408, upload-time = "2025-05-02T08:32:43.709Z" }, + { url = "https://files.pythonhosted.org/packages/58/aa/8904b84bc8084ac19dc52feb4f5952c6df03ffb460a887b42615ee1382e8/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", size = 153399, upload-time = "2025-05-02T08:32:46.197Z" }, + { url = "https://files.pythonhosted.org/packages/c2/26/89ee1f0e264d201cb65cf054aca6038c03b1a0c6b4ae998070392a3ce605/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", size = 156815, upload-time = "2025-05-02T08:32:48.105Z" }, + { url = "https://files.pythonhosted.org/packages/fd/07/68e95b4b345bad3dbbd3a8681737b4338ff2c9df29856a6d6d23ac4c73cb/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", size = 154537, upload-time = "2025-05-02T08:32:49.719Z" }, + { url = "https://files.pythonhosted.org/packages/77/1a/5eefc0ce04affb98af07bc05f3bac9094513c0e23b0562d64af46a06aae4/charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", size = 149565, upload-time = "2025-05-02T08:32:51.404Z" }, + { url = "https://files.pythonhosted.org/packages/37/a0/2410e5e6032a174c95e0806b1a6585eb21e12f445ebe239fac441995226a/charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", size = 98357, upload-time = "2025-05-02T08:32:53.079Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4f/c02d5c493967af3eda9c771ad4d2bbc8df6f99ddbeb37ceea6e8716a32bc/charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", size = 105776, upload-time = "2025-05-02T08:32:54.573Z" }, { url = "https://files.pythonhosted.org/packages/20/94/c5790835a017658cbfabd07f3bfb549140c3ac458cfc196323996b10095a/charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", size = 52626, upload-time = "2025-05-02T08:34:40.053Z" }, ] @@ -175,11 +165,14 @@ wheels = [ [[package]] name = "click" -version = "7.0" +version = "8.3.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/5c/f60e9d8a1e77005f664b76ff8aeaee5bc05d0a91798afd7f53fc998dbc47/Click-7.0.tar.gz", hash = "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7", size = 286192, upload-time = "2018-09-25T20:57:07.259Z" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl", hash = "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", size = 81299, upload-time = "2018-09-25T20:57:05.462Z" }, + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, ] [[package]] @@ -218,16 +211,17 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a1/f3/fa078f0bfae7f0e6b14c426f9cb095f4809314d926c89b9a2641fb4ca482/coverage-7.10.0-cp311-cp311-win32.whl", hash = "sha256:69270af3014ab3058ad6108c6d0e218166f568b5a7a070dc3d62c0a63aca1c4d", size = 217350, upload-time = "2025-07-24T16:50:50.884Z" }, { url = "https://files.pythonhosted.org/packages/1a/40/eefc3ebb9e458e3dc5db00e6b838969375577a09a8a39986d79cfa283175/coverage-7.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:43c16bbb661a7b4dafac0ab69e44d6dbcc6a64c4d93aefd89edc6f8911b6ab4a", size = 218235, upload-time = "2025-07-24T16:50:52.369Z" }, { url = "https://files.pythonhosted.org/packages/e5/b8/3b53890c3ad52279eaea594a86bceaf04fcc0aed16856ff81531f75735f4/coverage-7.10.0-cp311-cp311-win_arm64.whl", hash = "sha256:14e7c23fcb74ed808efb4eb48fcd25a759f0e20f685f83266d1df174860e4733", size = 216668, upload-time = "2025-07-24T16:50:53.937Z" }, - { url = "https://files.pythonhosted.org/packages/45/fb/ace937cb8faf4d723bfc6058fee39b6756d888cf7524559885e437d06d71/coverage-7.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cf283ec9c6878826291b17442eb5c32d3d252dc77d25e082b460b2d2ea67ba3c", size = 214811, upload-time = "2025-07-24T16:52:38.826Z" }, - { url = "https://files.pythonhosted.org/packages/ff/76/cbacf622916d4d3e1c5dbe07cacfdf19c80dfab9e5f65fa62d8fa0dbab31/coverage-7.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8a83488c9fc6fff487f2ab551f9b64c70672357b8949f0951b0cd778b3ed8165", size = 215190, upload-time = "2025-07-24T16:52:40.577Z" }, - { url = "https://files.pythonhosted.org/packages/7a/24/794bebf18d9b6eb83defcc33b54c3af9ae781d2584aa07539631de2a4975/coverage-7.10.0-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b86df3a7494d12338c11e59f210a0498d6109bbc3a4037f44de517ebb30a9c6b", size = 241262, upload-time = "2025-07-24T16:52:42.37Z" }, - { url = "https://files.pythonhosted.org/packages/19/49/674dfe9a00de71576d21825fb4c608db18ad69bec3e1184bf0b4d6e440c0/coverage-7.10.0-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6de9b460809e5e4787b742e786a36ae2346a53982e2be317cdcb7a33c56412fb", size = 243159, upload-time = "2025-07-24T16:52:44.165Z" }, - { url = "https://files.pythonhosted.org/packages/73/0c/ff37bcbae61f0e7783a2b58019e757e368754819f24428beebb31a9589e9/coverage-7.10.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de5ef8a5954d63fa26a6aaa4600e48f885ce70fe495e8fce2c43aa9241fc9434", size = 244727, upload-time = "2025-07-24T16:52:46.942Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d6/a42496f920770374a4116ccd01349d112e01969aeb03ba6eb3af74d5b7a0/coverage-7.10.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f178fe5e96f1e057527d5d0b20ab76b8616e0410169c33716cc226118eaf2c4f", size = 242662, upload-time = "2025-07-24T16:52:49.365Z" }, - { url = "https://files.pythonhosted.org/packages/fc/f0/518341fbed44ada9660d92bb7001d848d6901d606f157d1d9009b36bfe1b/coverage-7.10.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4a38c42f0182a012fa9ec25bc6057e51114c1ba125be304f3f776d6d283cb303", size = 240896, upload-time = "2025-07-24T16:52:51.223Z" }, - { url = "https://files.pythonhosted.org/packages/f6/08/fbe01e9a7394e11215ec3c67d51c66947abb4a02c9076cd04e8ccd454fa5/coverage-7.10.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:bf09beb5c1785cb36aad042455c0afab561399b74bb8cdaf6e82b7d77322df99", size = 241848, upload-time = "2025-07-24T16:52:53.388Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d4/edf9d75080254d969e2a8c8b4f4a5391865a3097de493a2ad3c938c8c9d3/coverage-7.10.0-cp39-cp39-win32.whl", hash = "sha256:cb8dfbb5d3016cb8d1940444c0c69b40cdc6c8bde724b07716ee5ea47b5273c6", size = 217320, upload-time = "2025-07-24T16:52:55.258Z" }, - { url = "https://files.pythonhosted.org/packages/91/bb/4ffaec3b62fa24faf4c462cbdb0145a395f532aacc85f2e51a571d54a74f/coverage-7.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:58ff22653cd93d563110d1ff2aef958f5f21be9e917762f8124d0e36f80f172a", size = 218215, upload-time = "2025-07-24T16:52:57.118Z" }, + { url = "https://files.pythonhosted.org/packages/b6/b4/7b419bb368c9f0b88889cb24805164f6e5550d7183fb59524f6173e0cf0b/coverage-7.10.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a2adcfdaf3b4d69b0c64ad024fe9dd6996782b52790fb6033d90f36f39e287df", size = 215124, upload-time = "2025-07-24T16:50:55.46Z" }, + { url = "https://files.pythonhosted.org/packages/f4/15/d862a806734c7e50fd5350cef18e22832ba3cdad282ca5660d6fd49def92/coverage-7.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d7b27c2c0840e8eeff3f1963782bd9d3bc767488d2e67a31de18d724327f9f6", size = 215364, upload-time = "2025-07-24T16:50:57.849Z" }, + { url = "https://files.pythonhosted.org/packages/a6/93/4671ca5b2f3650c961a01252cbad96cb41f7c0c2b85c6062f27740a66b06/coverage-7.10.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0ed50429786e935517570b08576a661fd79032e6060985ab492b9d39ba8e66ee", size = 246369, upload-time = "2025-07-24T16:50:59.505Z" }, + { url = "https://files.pythonhosted.org/packages/64/79/2ca676c712d0540df0d7957a4266232980b60858a7a654846af1878cfde0/coverage-7.10.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7171c139ab6571d70460ecf788b1dcaf376bfc75a42e1946b8c031d062bbbad4", size = 248798, upload-time = "2025-07-24T16:51:01.105Z" }, + { url = "https://files.pythonhosted.org/packages/82/c5/67e000b03ba5291f915ddd6ba7c3333e4fdee9ba003b914c8f8f2d966dfe/coverage-7.10.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a726aac7e6e406e403cdee4c443a13aed3ea3d67d856414c5beacac2e70c04e", size = 250260, upload-time = "2025-07-24T16:51:02.761Z" }, + { url = "https://files.pythonhosted.org/packages/9d/76/196783c425b5633db5c789b02a023858377bd73e4db4c805c2503cc42bbf/coverage-7.10.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2886257481a14e953e96861a00c0fe7151117a523f0470a51e392f00640bba03", size = 248171, upload-time = "2025-07-24T16:51:04.651Z" }, + { url = "https://files.pythonhosted.org/packages/83/1f/bf86c75f42de3641b4bbeab9712ec2815a3a8f5939768077245a492fad9f/coverage-7.10.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:536578b79521e59c385a2e0a14a5dc2a8edd58761a966d79368413e339fc9535", size = 246368, upload-time = "2025-07-24T16:51:06.16Z" }, + { url = "https://files.pythonhosted.org/packages/2d/95/bfc9a3abef0b160404438e82ec778a0f38660c66a4b0ed94d0417d4d2290/coverage-7.10.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77fae95558f7804a9ceefabf3c38ad41af1da92b39781b87197c6440dcaaa967", size = 247578, upload-time = "2025-07-24T16:51:07.632Z" }, + { url = "https://files.pythonhosted.org/packages/c6/7e/4fb2a284d56fe2a3ba0c76806923014854a64e503dc8ce21e5a2e6497eea/coverage-7.10.0-cp312-cp312-win32.whl", hash = "sha256:97803e14736493eb029558e1502fe507bd6a08af277a5c8eeccf05c3e970cb84", size = 217521, upload-time = "2025-07-24T16:51:09.56Z" }, + { url = "https://files.pythonhosted.org/packages/f7/30/3ab51058b75e9931fc48594d79888396cf009910fabebe12a6a636ab7f9e/coverage-7.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:4c73ab554e54ffd38d114d6bc4a7115fb0c840cf6d8622211bee3da26e4bd25d", size = 218308, upload-time = "2025-07-24T16:51:11.115Z" }, + { url = "https://files.pythonhosted.org/packages/b0/34/2adc74fd132eaa1873b1688acb906b477216074ed8a37e90426eca6d2900/coverage-7.10.0-cp312-cp312-win_arm64.whl", hash = "sha256:3ae95d5a9aedab853641026b71b2ddd01983a0a7e9bf870a20ef3c8f5d904699", size = 216706, upload-time = "2025-07-24T16:51:12.632Z" }, { url = "https://files.pythonhosted.org/packages/09/df/7c34bada8ace39f688b3bd5bc411459a20a3204ccb0984c90169a80a9366/coverage-7.10.0-py3-none-any.whl", hash = "sha256:310a786330bb0463775c21d68e26e79973839b66d29e065c5787122b8dd4489f", size = 206777, upload-time = "2025-07-24T16:52:59.009Z" }, ] @@ -286,17 +280,19 @@ wheels = [ [[package]] name = "flask" -version = "1.1.1" +version = "3.1.3" source = { registry = "https://pypi.org/simple" } dependencies = [ + { name = "blinker" }, { name = "click" }, { name = "itsdangerous" }, { name = "jinja2" }, + { name = "markupsafe" }, { name = "werkzeug" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2e/80/3726a729de758513fd3dbc64e93098eb009c49305a97c6751de55b20b694/Flask-1.1.1.tar.gz", hash = "sha256:13f9f196f330c7c2c5d7a5cf91af894110ca0215ac051b5844701f2bfd934d52", size = 625458, upload-time = "2019-07-08T18:00:31.166Z" } +sdist = { url = "https://files.pythonhosted.org/packages/26/00/35d85dcce6c57fdc871f3867d465d780f302a175ea360f62533f12b27e2b/flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb", size = 759004, upload-time = "2026-02-19T05:00:57.678Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9b/93/628509b8d5dc749656a9641f4caf13540e2cdec85276964ff8f43bbb1d3b/Flask-1.1.1-py2.py3-none-any.whl", hash = "sha256:45eb5a6fd193d6cf7e0cf5d8a5b31f83d5faae0293695626f539a823e93b13f6", size = 94457, upload-time = "2019-07-08T18:00:28.597Z" }, + { url = "https://files.pythonhosted.org/packages/7f/9c/34f6962f9b9e9c71f6e5ed806e0d0ff03c9d1b0b2340088a0cf4bce09b18/flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c", size = 103424, upload-time = "2026-02-19T05:00:56.027Z" }, ] [[package]] @@ -305,12 +301,9 @@ version = "25.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation == 'CPython' and sys_platform == 'win32'" }, - { name = "greenlet", version = "3.2.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10' and platform_python_implementation == 'CPython'" }, - { name = "greenlet", version = "3.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10' and platform_python_implementation == 'CPython'" }, - { name = "zope-event", version = "6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "zope-event", version = "6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "zope-interface", version = "8.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "zope-interface", version = "8.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "greenlet", marker = "platform_python_implementation == 'CPython'" }, + { name = "zope-event" }, + { name = "zope-interface" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9e/48/b3ef2673ffb940f980966694e40d6d32560f3ffa284ecaeb5ea3a90a6d3f/gevent-25.9.1.tar.gz", hash = "sha256:adf9cd552de44a4e6754c51ff2e78d9193b7fa6eab123db9578a210e657235dd", size = 5059025, upload-time = "2025-09-17T16:15:34.528Z" } wheels = [ @@ -328,10 +321,14 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c0/2c/ebc5d38a7542af9fb7657bfe10932a558bb98c8a94e4748e827d3823fced/gevent-25.9.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5e4b6278b37373306fc6b1e5f0f1cf56339a1377f67c35972775143d8d7776ff", size = 1808776, upload-time = "2025-09-17T15:52:40.16Z" }, { url = "https://files.pythonhosted.org/packages/e6/26/e1d7d6c8ffbf76fe1fbb4e77bdb7f47d419206adc391ec40a8ace6ebbbf0/gevent-25.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d99f0cb2ce43c2e8305bf75bee61a8bde06619d21b9d0316ea190fc7a0620a56", size = 2179141, upload-time = "2025-09-17T15:24:09.895Z" }, { url = "https://files.pythonhosted.org/packages/1d/6c/bb21fd9c095506aeeaa616579a356aa50935165cc0f1e250e1e0575620a7/gevent-25.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:72152517ecf548e2f838c61b4be76637d99279dbaa7e01b3924df040aa996586", size = 1677941, upload-time = "2025-09-17T19:59:50.185Z" }, - { url = "https://files.pythonhosted.org/packages/60/45/8b6b68ac1d4ef97ae62058aeaf53be75290bc2d2fb940b2a73dfbf8c3260/gevent-25.9.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f18f80aef6b1f6907219affe15b36677904f7cfeed1f6a6bc198616e507ae2d7", size = 2181754, upload-time = "2025-09-17T15:15:17.797Z" }, - { url = "https://files.pythonhosted.org/packages/07/c0/a7b1f25c42db3c5dc787ea7e23b87ec9a534ca757a25906849b7e7cc765e/gevent-25.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b274a53e818124a281540ebb4e7a2c524778f745b7a99b01bdecf0ca3ac0ddb0", size = 2239168, upload-time = "2025-09-17T15:24:17.216Z" }, - { url = "https://files.pythonhosted.org/packages/a8/40/8acba57c18ab5aacd1a88a82590c7ca43292b710a2265b75ad7056c5225b/gevent-25.9.1-cp39-cp39-win32.whl", hash = "sha256:c6c91f7e33c7f01237755884316110ee7ea076f5bdb9aa0982b6dc63243c0a38", size = 1570442, upload-time = "2025-09-17T20:18:49.036Z" }, - { url = "https://files.pythonhosted.org/packages/f3/06/7e576ec64711778fa6fd40a5ee7c5311052bf2dee107ea31c6a5b63c1e2f/gevent-25.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:012a44b0121f3d7c800740ff80351c897e85e76a7e4764690f35c5ad9ec17de5", size = 1698985, upload-time = "2025-09-17T20:14:00.918Z" }, + { url = "https://files.pythonhosted.org/packages/f7/49/e55930ba5259629eb28ac7ee1abbca971996a9165f902f0249b561602f24/gevent-25.9.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:46b188248c84ffdec18a686fcac5dbb32365d76912e14fda350db5dc0bfd4f86", size = 2955991, upload-time = "2025-09-17T14:52:30.568Z" }, + { url = "https://files.pythonhosted.org/packages/aa/88/63dc9e903980e1da1e16541ec5c70f2b224ec0a8e34088cb42794f1c7f52/gevent-25.9.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f2b54ea3ca6f0c763281cd3f96010ac7e98c2e267feb1221b5a26e2ca0b9a692", size = 1808503, upload-time = "2025-09-17T15:41:25.59Z" }, + { url = "https://files.pythonhosted.org/packages/7a/8d/7236c3a8f6ef7e94c22e658397009596fa90f24c7d19da11ad7ab3a9248e/gevent-25.9.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7a834804ac00ed8a92a69d3826342c677be651b1c3cd66cc35df8bc711057aa2", size = 1890001, upload-time = "2025-09-17T15:49:01.227Z" }, + { url = "https://files.pythonhosted.org/packages/4f/63/0d7f38c4a2085ecce26b50492fc6161aa67250d381e26d6a7322c309b00f/gevent-25.9.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:323a27192ec4da6b22a9e51c3d9d896ff20bc53fdc9e45e56eaab76d1c39dd74", size = 1855335, upload-time = "2025-09-17T15:49:20.582Z" }, + { url = "https://files.pythonhosted.org/packages/95/18/da5211dfc54c7a57e7432fd9a6ffeae1ce36fe5a313fa782b1c96529ea3d/gevent-25.9.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6ea78b39a2c51d47ff0f130f4c755a9a4bbb2dd9721149420ad4712743911a51", size = 2109046, upload-time = "2025-09-17T15:15:13.817Z" }, + { url = "https://files.pythonhosted.org/packages/a6/5a/7bb5ec8e43a2c6444853c4a9f955f3e72f479d7c24ea86c95fb264a2de65/gevent-25.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:dc45cd3e1cc07514a419960af932a62eb8515552ed004e56755e4bf20bad30c5", size = 1827099, upload-time = "2025-09-17T15:52:41.384Z" }, + { url = "https://files.pythonhosted.org/packages/ca/d4/b63a0a60635470d7d986ef19897e893c15326dd69e8fb342c76a4f07fe9e/gevent-25.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34e01e50c71eaf67e92c186ee0196a039d6e4f4b35670396baed4a2d8f1b347f", size = 2172623, upload-time = "2025-09-17T15:24:12.03Z" }, + { url = "https://files.pythonhosted.org/packages/d5/98/caf06d5d22a7c129c1fb2fc1477306902a2c8ddfd399cd26bbbd4caf2141/gevent-25.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:4acd6bcd5feabf22c7c5174bd3b9535ee9f088d2bbce789f740ad8d6554b18f3", size = 1682837, upload-time = "2025-09-17T19:48:47.318Z" }, ] [[package]] @@ -352,56 +349,16 @@ version = "3.1.46" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "gitdb" }, - { name = "typing-extensions", marker = "python_full_version < '3.10'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/df/b5/59d16470a1f0dfe8c793f9ef56fd3826093fc52b3bd96d6b9d6c26c7e27b/gitpython-3.1.46.tar.gz", hash = "sha256:400124c7d0ef4ea03f7310ac2fbf7151e09ff97f2a3288d64a440c584a29c37f", size = 215371, upload-time = "2026-01-01T15:37:32.073Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/6a/09/e21df6aef1e1ffc0c816f0522ddc3f6dcded766c3261813131c78a704470/gitpython-3.1.46-py3-none-any.whl", hash = "sha256:79812ed143d9d25b6d176a10bb511de0f9c67b1fa641d82097b0ab90398a2058", size = 208620, upload-time = "2026-01-01T15:37:30.574Z" }, ] -[[package]] -name = "greenlet" -version = "3.2.5" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/b0/f5/3e9eafb4030588337b2a2ae4df46212956854e9069c07b53aa3caabafd47/greenlet-3.2.5.tar.gz", hash = "sha256:c816554eb33e7ecf9ba4defcb1fd8c994e59be6b4110da15480b3e7447ea4286", size = 191501, upload-time = "2026-02-20T20:08:51.539Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ff/d6/b3db928fc329b1b19ba32ffe143d2305f3aaafc583f5e1074c74ec445189/greenlet-3.2.5-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:34cc7cf8ab6f4b85298b01e13e881265ee7b3c1daf6bc10a2944abc15d4f87c3", size = 275803, upload-time = "2026-02-20T20:06:42.541Z" }, - { url = "https://files.pythonhosted.org/packages/b3/ff/ab0ad4ff3d9e1faa266de4f6c79763b33fccd9265995f2940192494cc0ec/greenlet-3.2.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c11fe0cfb0ce33132f0b5d27eeadd1954976a82e5e9b60909ec2c4b884a55382", size = 633556, upload-time = "2026-02-20T20:30:41.594Z" }, - { url = "https://files.pythonhosted.org/packages/da/dd/7b3ac77099a1671af8077ecedb12c9a1be1310e4c35bb69fd34c18ab6093/greenlet-3.2.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:a145f4b1c4ed7a2c94561b7f18b4beec3d3fb6f0580db22f7ed1d544e0620b34", size = 644943, upload-time = "2026-02-20T20:37:23.084Z" }, - { url = "https://files.pythonhosted.org/packages/56/f0/bea7e7909ea9045b0c5055dad1ec9b81c82b761b4567e625f4f8349acfa1/greenlet-3.2.5-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:edbf4ab9a7057ee430a678fe2ef37ea5d69125d6bdc7feb42ed8d871c737e63b", size = 640849, upload-time = "2026-02-20T20:43:57.305Z" }, - { url = "https://files.pythonhosted.org/packages/0f/36/84630e9ff1dfc8b7690957c0f77834a84eabdbd9c4977c3a2d0cbd5325c2/greenlet-3.2.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc1d01bdd67db3e5711e6246e451d7a0f75fae7bbf40adde129296a7f9aa7cc9", size = 639841, upload-time = "2026-02-20T20:07:17.473Z" }, - { url = "https://files.pythonhosted.org/packages/12/c4/6a2ee6c676dea7a05a3c3c1291fbc8ea44f26456b0accc891471293825af/greenlet-3.2.5-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd593db7ee1fa8a513a48a404f8cc4126998a48025e3f5cbbc68d51be0a6bf66", size = 588813, upload-time = "2026-02-20T20:07:56.171Z" }, - { url = "https://files.pythonhosted.org/packages/01/c0/75e75c2c993aa850292561ec80f5c263e3924e5843aa95a38716df69304c/greenlet-3.2.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ac8db07bced2c39b987bba13a3195f8157b0cfbce54488f86919321444a1cc3c", size = 1117377, upload-time = "2026-02-20T20:32:48.452Z" }, - { url = "https://files.pythonhosted.org/packages/ee/03/e38ebf9024a0873fe8f60f5b7bc36bfb3be5e13efe4d798240f2d1f0fb73/greenlet-3.2.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4544ab2cfd5912e42458b13516429e029f87d8bbcdc8d5506db772941ae12493", size = 1141246, upload-time = "2026-02-20T20:06:23.576Z" }, - { url = "https://files.pythonhosted.org/packages/d8/7b/c6e1192c795c0c12871e199237909a6bd35757d92c8472c7c019959b8637/greenlet-3.2.5-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:acabf468466d18017e2ae5fbf1a5a88b86b48983e550e1ae1437b69a83d9f4ac", size = 276916, upload-time = "2026-02-20T20:06:18.166Z" }, - { url = "https://files.pythonhosted.org/packages/3e/b6/9887b559f3e1952d23052ec352e9977e808a2246c7cb8282a38337221e88/greenlet-3.2.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:472841de62d60f2cafd60edd4fd4dd7253eb70e6eaf14b8990dcaf177f4af957", size = 636107, upload-time = "2026-02-20T20:30:43.362Z" }, - { url = "https://files.pythonhosted.org/packages/8a/be/e3e48b63bbc27d660fa1d98aecb64906b90a12e686a436169c1330ef34b2/greenlet-3.2.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7d951e7d628a6e8b68af469f0fe4f100ef64c4054abeb9cdafbfaa30a920c950", size = 648240, upload-time = "2026-02-20T20:37:24.608Z" }, - { url = "https://files.pythonhosted.org/packages/17/f6/2cbe999683f759f14f598234f04ae8ba6f22953a624b3a7a630003e6bfff/greenlet-3.2.5-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:87b791dd0e031a574249af717ac36f7031b18c35329561c1e0368201c18caf1f", size = 644170, upload-time = "2026-02-20T20:43:59.002Z" }, - { url = "https://files.pythonhosted.org/packages/4c/ac/e731ed62576e91e533b36d0d97325adc2786674ab9e48ed8a6a24f4ef4e9/greenlet-3.2.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8317d732e2ae0935d9ed2af2ea876fa714cf6f3b887a31ca150b54329b0a6e9", size = 643313, upload-time = "2026-02-20T20:07:19.012Z" }, - { url = "https://files.pythonhosted.org/packages/70/64/99e5cdceb494bd4c1341c45b93f322601d2c8a5e1e4d1c7a2d24c5ed0570/greenlet-3.2.5-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce8aed6fdd5e07d3cbb988cbdc188266a4eb9e1a52db9ef5c6526e59962d3933", size = 591295, upload-time = "2026-02-20T20:07:57.286Z" }, - { url = "https://files.pythonhosted.org/packages/ee/e9/968e11f388c2b8792d3b8b40a57984c894a3b4745dae3662dce722653bc5/greenlet-3.2.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:60c06b502d56d5451f60ca665691da29f79ed95e247bcf8ce5024d7bbe64acb9", size = 1120277, upload-time = "2026-02-20T20:32:50.103Z" }, - { url = "https://files.pythonhosted.org/packages/cb/2c/b5f2c4c68d753dce08218dc5a6b21d82238fdfdc44309032f6fe24d285e6/greenlet-3.2.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d2a78e6f1bf3f1672df91e212a2f8314e1e7c922f065d14cbad4bc815059467", size = 1145746, upload-time = "2026-02-20T20:06:26.296Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8f/f880ff4587d236b4d06893fb34da6b299aa0d00f6c8259673f80e1b6d63c/greenlet-3.2.5-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:dbe0e81e24982bb45907ca20152b31c2e3300ca352fdc4acbd4956e4a2cbc195", size = 274946, upload-time = "2026-02-20T20:05:21.979Z" }, - { url = "https://files.pythonhosted.org/packages/3c/50/f6c78b8420187fdfe97fcf2e6d1dd243a7742d272c32fd4d4b1095474b37/greenlet-3.2.5-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:15871afc0d78ec87d15d8412b337f287fc69f8f669346e391585824970931c48", size = 631781, upload-time = "2026-02-20T20:30:48.845Z" }, - { url = "https://files.pythonhosted.org/packages/26/d6/3277f92e1961e6e9f41d9f173ea74b5c1f7065072637669f761626f26cc0/greenlet-3.2.5-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5bf0d7d62e356ef2e87e55e46a4e930ac165f9372760fb983b5631bb479e9d3a", size = 643740, upload-time = "2026-02-20T20:37:30.639Z" }, - { url = "https://files.pythonhosted.org/packages/f8/8a/c37b87659378759f158dbe03eaeb7ed002a8968f1c649b2972f5323f99b2/greenlet-3.2.5-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:e3f03ddd7142c758ab41c18089a1407b9959bd276b4e6dfbd8fd06403832c87a", size = 639098, upload-time = "2026-02-20T20:44:07.287Z" }, - { url = "https://files.pythonhosted.org/packages/2a/6a/4f79d2e7b5ef3723fc5ffea0d6cb22627e5f95e0f19c973fa12bf1cf7891/greenlet-3.2.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6dff6433742073e5b6ad40953a78a0e8cddcb3f6869e5ea635d29a810ca5e7d0", size = 638382, upload-time = "2026-02-20T20:07:23.883Z" }, - { url = "https://files.pythonhosted.org/packages/4d/59/7aadf33f23c65dbf4db27e7f5b60c414797a61e954352ae4a86c5c8b0553/greenlet-3.2.5-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdd67619cefe1cc9fcab57c8853d2bb36eca9f166c0058cc0d428d471f7c785c", size = 587516, upload-time = "2026-02-20T20:08:02.841Z" }, - { url = "https://files.pythonhosted.org/packages/1d/46/b3422959f830de28a4eea447414e6bd7b980d755892f66ab52ad805da1c4/greenlet-3.2.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3828b309dfb1f117fe54867512a8265d8d4f00f8de6908eef9b885f4d8789062", size = 1115818, upload-time = "2026-02-20T20:32:55.786Z" }, - { url = "https://files.pythonhosted.org/packages/54/4a/3d1c9728f093415637cf3696909fa10852632e33e68238fb8ca60eb90de1/greenlet-3.2.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:67725ae9fea62c95cf1aa230f1b8d4dc38f7cd14f6103d1df8a5a95657eb8e54", size = 1140219, upload-time = "2026-02-20T20:06:30.334Z" }, -] - [[package]] name = "greenlet" version = "3.3.2" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11'", - "python_full_version == '3.10.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/a3/51/1664f6b78fc6ebbd98019a1fd730e83fa78f2db7058f72b1463d3612b8db/greenlet-3.3.2.tar.gz", hash = "sha256:2eaf067fc6d886931c7962e8c6bede15d2f01965560f3359b27c80bde2d151f2", size = 188267, upload-time = "2026-02-20T20:54:15.531Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/38/3f/9859f655d11901e7b2996c6e3d33e0caa9a1d4572c3bc61ed0faa64b2f4c/greenlet-3.3.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9bc885b89709d901859cf95179ec9f6bb67a3d2bb1f0e88456461bd4b7f8fd0d", size = 277747, upload-time = "2026-02-20T20:16:21.325Z" }, @@ -421,33 +378,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5a/00/32d30dee8389dc36d42170a9c66217757289e2afb0de59a3565260f38373/greenlet-3.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:45abe8eb6339518180d5a7fa47fa01945414d7cca5ecb745346fc6a87d2750be", size = 1619472, upload-time = "2026-02-20T20:21:07.966Z" }, { url = "https://files.pythonhosted.org/packages/f1/3a/efb2cf697fbccdf75b24e2c18025e7dfa54c4f31fab75c51d0fe79942cef/greenlet-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:1e692b2dae4cc7077cbb11b47d258533b48c8fde69a33d0d8a82e2fe8d8531d5", size = 230389, upload-time = "2026-02-20T20:17:18.772Z" }, { url = "https://files.pythonhosted.org/packages/e1/a1/65bbc059a43a7e2143ec4fc1f9e3f673e04f9c7b371a494a101422ac4fd5/greenlet-3.3.2-cp311-cp311-win_arm64.whl", hash = "sha256:02b0a8682aecd4d3c6c18edf52bc8e51eacdd75c8eac52a790a210b06aa295fd", size = 229645, upload-time = "2026-02-20T20:18:18.695Z" }, -] - -[[package]] -name = "gunicorn" -version = "23.0.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "packaging", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/34/72/9614c465dc206155d93eff0ca20d42e1e35afc533971379482de953521a4/gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec", size = 375031, upload-time = "2024-08-10T20:25:27.378Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/cb/7d/6dac2a6e1eba33ee43f318edbed4ff29151a49b5d37f080aad1e6469bca4/gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d", size = 85029, upload-time = "2024-08-10T20:25:24.996Z" }, + { url = "https://files.pythonhosted.org/packages/ea/ab/1608e5a7578e62113506740b88066bf09888322a311cff602105e619bd87/greenlet-3.3.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:ac8d61d4343b799d1e526db579833d72f23759c71e07181c2d2944e429eb09cd", size = 280358, upload-time = "2026-02-20T20:17:43.971Z" }, + { url = "https://files.pythonhosted.org/packages/a5/23/0eae412a4ade4e6623ff7626e38998cb9b11e9ff1ebacaa021e4e108ec15/greenlet-3.3.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ceec72030dae6ac0c8ed7591b96b70410a8be370b6a477b1dbc072856ad02bd", size = 601217, upload-time = "2026-02-20T20:47:31.462Z" }, + { url = "https://files.pythonhosted.org/packages/f8/16/5b1678a9c07098ecb9ab2dd159fafaf12e963293e61ee8d10ecb55273e5e/greenlet-3.3.2-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2a5be83a45ce6188c045bcc44b0ee037d6a518978de9a5d97438548b953a1ac", size = 611792, upload-time = "2026-02-20T20:55:58.423Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c5/cc09412a29e43406eba18d61c70baa936e299bc27e074e2be3806ed29098/greenlet-3.3.2-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ae9e21c84035c490506c17002f5c8ab25f980205c3e61ddb3a2a2a2e6c411fcb", size = 626250, upload-time = "2026-02-20T21:02:46.596Z" }, + { url = "https://files.pythonhosted.org/packages/50/1f/5155f55bd71cabd03765a4aac9ac446be129895271f73872c36ebd4b04b6/greenlet-3.3.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e99d1749147ac21dde49b99c9abffcbc1e2d55c67501465ef0930d6e78e070", size = 613875, upload-time = "2026-02-20T20:21:01.102Z" }, + { url = "https://files.pythonhosted.org/packages/fc/dd/845f249c3fcd69e32df80cdab059b4be8b766ef5830a3d0aa9d6cad55beb/greenlet-3.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c956a19350e2c37f2c48b336a3afb4bff120b36076d9d7fb68cb44e05d95b79", size = 1571467, upload-time = "2026-02-20T20:49:33.495Z" }, + { url = "https://files.pythonhosted.org/packages/2a/50/2649fe21fcc2b56659a452868e695634722a6655ba245d9f77f5656010bf/greenlet-3.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c6f8ba97d17a1e7d664151284cb3315fc5f8353e75221ed4324f84eb162b395", size = 1640001, upload-time = "2026-02-20T20:21:09.154Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/cc802e067d02af8b60b6771cea7d57e21ef5e6659912814babb42b864713/greenlet-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:34308836d8370bddadb41f5a7ce96879b72e2fdfb4e87729330c6ab52376409f", size = 231081, upload-time = "2026-02-20T20:17:28.121Z" }, + { url = "https://files.pythonhosted.org/packages/58/2e/fe7f36ff1982d6b10a60d5e0740c759259a7d6d2e1dc41da6d96de32fff6/greenlet-3.3.2-cp312-cp312-win_arm64.whl", hash = "sha256:d3a62fa76a32b462a97198e4c9e99afb9ab375115e74e9a83ce180e7a496f643", size = 230331, upload-time = "2026-02-20T20:17:23.34Z" }, ] [[package]] name = "gunicorn" version = "25.1.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11'", - "python_full_version == '3.10.*'", -] dependencies = [ - { name = "packaging", marker = "python_full_version >= '3.10'" }, + { name = "packaging" }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/13/ef67f59f6a7896fdc2c1d62b5665c5219d6b0a9a1784938eb9a28e55e128/gunicorn-25.1.0.tar.gz", hash = "sha256:1426611d959fa77e7de89f8c0f32eed6aa03ee735f98c01efba3e281b1c47616", size = 594377, upload-time = "2026-02-13T11:09:58.989Z" } wheels = [ @@ -496,29 +443,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b6/85/7882d311924cbcfc70b1890780763e36ff0b140c7e51c110fc59a532f087/isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96", size = 41722, upload-time = "2021-12-13T20:28:29.073Z" }, ] -[[package]] -name = "isort" -version = "6.1.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/1e/82/fa43935523efdfcce6abbae9da7f372b627b27142c3419fcf13bf5b0c397/isort-6.1.0.tar.gz", hash = "sha256:9b8f96a14cfee0677e78e941ff62f03769a06d412aabb9e2a90487b3b7e8d481", size = 824325, upload-time = "2025-10-01T16:26:45.027Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7f/cc/9b681a170efab4868a032631dea1e8446d8ec718a7f657b94d49d1a12643/isort-6.1.0-py3-none-any.whl", hash = "sha256:58d8927ecce74e5087aef019f778d4081a3b6c98f15a80ba35782ca8a2097784", size = 94329, upload-time = "2025-10-01T16:26:43.291Z" }, -] - [[package]] name = "isort" version = "8.0.1" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11'", - "python_full_version == '3.10.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/ef/7c/ec4ab396d31b3b395e2e999c8f46dec78c5e29209fac49d1f4dace04041d/isort-8.0.1.tar.gz", hash = "sha256:171ac4ff559cdc060bcfff550bc8404a486fee0caab245679c2abe7cb253c78d", size = 769592, upload-time = "2026-02-28T10:08:20.685Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/3e/95/c7c34aa53c16353c56d0b802fba48d5f5caa2cdee7958acbcb795c830416/isort-8.0.1-py3-none-any.whl", hash = "sha256:28b89bc70f751b559aeca209e6120393d43fbe2490de0559662be7a9787e3d75", size = 89733, upload-time = "2026-02-28T10:08:19.466Z" }, @@ -526,11 +454,11 @@ wheels = [ [[package]] name = "itsdangerous" -version = "1.1.0" +version = "2.2.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/68/1a/f27de07a8a304ad5fa817bbe383d1238ac4396da447fa11ed937039fa04b/itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19", size = 53219, upload-time = "2018-10-27T00:17:37.922Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410, upload-time = "2024-04-16T21:28:15.614Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/76/ae/44b03b253d6fade317f32c24d100b3b35c2239807046a4c953c7b89fa49e/itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749", size = 16743, upload-time = "2018-10-27T00:17:35.954Z" }, + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234, upload-time = "2024-04-16T21:28:14.499Z" }, ] [[package]] @@ -559,14 +487,14 @@ wheels = [ [[package]] name = "jinja2" -version = "2.11.3" +version = "3.1.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4f/e7/65300e6b32e69768ded990494809106f87da1d436418d5f1367ed3966fd7/Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6", size = 257589, upload-time = "2021-01-31T16:33:09.175Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/c2/1eece8c95ddbc9b1aeb64f5783a9e07a286de42191b7204d67b7496ddf35/Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419", size = 125699, upload-time = "2021-01-31T16:33:07.289Z" }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] [[package]] @@ -587,12 +515,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/0e/090bf070f7a0de44c61659cb7f74c2fe02309a77ca8c4b43adfe0b695f66/lazy_object_proxy-1.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3605b632e82a1cbc32a1e5034278a64db555b3496e0795723ee697006b980508", size = 67800, upload-time = "2025-08-22T13:42:34.054Z" }, { url = "https://files.pythonhosted.org/packages/cf/d2/b320325adbb2d119156f7c506a5fbfa37fcab15c26d13cf789a90a6de04e/lazy_object_proxy-1.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a61095f5d9d1a743e1e20ec6d6db6c2ca511961777257ebd9b288951b23b44fa", size = 68085, upload-time = "2025-08-22T13:42:35.197Z" }, { url = "https://files.pythonhosted.org/packages/6a/48/4b718c937004bf71cd82af3713874656bcb8d0cc78600bf33bb9619adc6c/lazy_object_proxy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:997b1d6e10ecc6fb6fe0f2c959791ae59599f41da61d652f6c903d1ee58b7370", size = 26535, upload-time = "2025-08-22T13:42:36.521Z" }, - { url = "https://files.pythonhosted.org/packages/fd/dc/ab1dcba92b576ed278f358f95edee30e835463e7976a219248a8635f757d/lazy_object_proxy-1.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae575ad9b674d0029fc077c5231b3bc6b433a3d1a62a8c363df96974b5534728", size = 26648, upload-time = "2025-08-22T13:49:58.429Z" }, - { url = "https://files.pythonhosted.org/packages/b6/67/b2a4ff7094f35d3dda1c7d0b3b629e8c1186b1a014370c6d20e02d4a23ce/lazy_object_proxy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31020c84005d3daa4cc0fa5a310af2066efe6b0d82aeebf9ab199292652ff036", size = 66845, upload-time = "2025-08-22T13:49:59.623Z" }, - { url = "https://files.pythonhosted.org/packages/69/57/f1d038b4792dd621e2fa92dfdb4f652eee7b1d6000fe6849fc2308c3472e/lazy_object_proxy-1.12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:800f32b00a47c27446a2b767df7538e6c66a3488632c402b4fb2224f9794f3c0", size = 66303, upload-time = "2025-08-22T13:50:00.941Z" }, - { url = "https://files.pythonhosted.org/packages/87/df/ee5a4c0dba431ba8f77fb14388abb830d26617a15215f462d84251a91b40/lazy_object_proxy-1.12.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:15400b18893f345857b9e18b9bd87bd06aba84af6ed086187add70aeaa3f93f1", size = 64865, upload-time = "2025-08-22T13:50:02.304Z" }, - { url = "https://files.pythonhosted.org/packages/68/96/227207629436bf5690a32c38b8524fdb32228559e22ccb6b9cb149d8f217/lazy_object_proxy-1.12.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3d3964fbd326578bcdfffd017ef101b6fb0484f34e731fe060ba9b8816498c36", size = 65123, upload-time = "2025-08-22T13:50:03.643Z" }, - { url = "https://files.pythonhosted.org/packages/f9/84/9646e640689cba3a5b46c62cf4281dfaf3d3e224b16d48d0a24acb1ab74b/lazy_object_proxy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:424a8ab6695400845c39f13c685050eab69fa0bbac5790b201cd27375e5e41d7", size = 26413, upload-time = "2025-08-22T13:50:04.592Z" }, + { url = "https://files.pythonhosted.org/packages/0d/1b/b5f5bd6bda26f1e15cd3232b223892e4498e34ec70a7f4f11c401ac969f1/lazy_object_proxy-1.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ee0d6027b760a11cc18281e702c0309dd92da458a74b4c15025d7fc490deede", size = 26746, upload-time = "2025-08-22T13:42:37.572Z" }, + { url = "https://files.pythonhosted.org/packages/55/64/314889b618075c2bfc19293ffa9153ce880ac6153aacfd0a52fcabf21a66/lazy_object_proxy-1.12.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4ab2c584e3cc8be0dfca422e05ad30a9abe3555ce63e9ab7a559f62f8dbc6ff9", size = 71457, upload-time = "2025-08-22T13:42:38.743Z" }, + { url = "https://files.pythonhosted.org/packages/11/53/857fc2827fc1e13fbdfc0ba2629a7d2579645a06192d5461809540b78913/lazy_object_proxy-1.12.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14e348185adbd03ec17d051e169ec45686dcd840a3779c9d4c10aabe2ca6e1c0", size = 71036, upload-time = "2025-08-22T13:42:40.184Z" }, + { url = "https://files.pythonhosted.org/packages/2b/24/e581ffed864cd33c1b445b5763d617448ebb880f48675fc9de0471a95cbc/lazy_object_proxy-1.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4fcbe74fb85df8ba7825fa05eddca764138da752904b378f0ae5ab33a36c308", size = 69329, upload-time = "2025-08-22T13:42:41.311Z" }, + { url = "https://files.pythonhosted.org/packages/78/be/15f8f5a0b0b2e668e756a152257d26370132c97f2f1943329b08f057eff0/lazy_object_proxy-1.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:563d2ec8e4d4b68ee7848c5ab4d6057a6d703cb7963b342968bb8758dda33a23", size = 70690, upload-time = "2025-08-22T13:42:42.51Z" }, + { url = "https://files.pythonhosted.org/packages/5d/aa/f02be9bbfb270e13ee608c2b28b8771f20a5f64356c6d9317b20043c6129/lazy_object_proxy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:53c7fd99eb156bbb82cbc5d5188891d8fdd805ba6c1e3b92b90092da2a837073", size = 26563, upload-time = "2025-08-22T13:42:43.685Z" }, { url = "https://files.pythonhosted.org/packages/41/a0/b91504515c1f9a299fc157967ffbd2f0321bce0516a3d5b89f6f4cad0355/lazy_object_proxy-1.12.0-pp39.pp310.pp311.graalpy311-none-any.whl", hash = "sha256:c3b2e0af1f7f77c4263759c4824316ce458fabe0fceadcd24ef8ca08b2d1e402", size = 15072, upload-time = "2025-08-22T13:50:05.498Z" }, ] @@ -627,18 +555,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/16/01/35b68b1db517f27a01be4467593292eb5315def8900afad29fabf56304ba/librt-0.8.1-cp311-cp311-win32.whl", hash = "sha256:52c224e14614b750c0a6d97368e16804a98c684657c7518752c356834fff83bb", size = 54597, upload-time = "2026-02-17T16:11:37.544Z" }, { url = "https://files.pythonhosted.org/packages/71/02/796fe8f02822235966693f257bf2c79f40e11337337a657a8cfebba5febc/librt-0.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:c00e5c884f528c9932d278d5c9cbbea38a6b81eb62c02e06ae53751a83a4d52b", size = 61733, upload-time = "2026-02-17T16:11:38.691Z" }, { url = "https://files.pythonhosted.org/packages/28/ad/232e13d61f879a42a4e7117d65e4984bb28371a34bb6fb9ca54ec2c8f54e/librt-0.8.1-cp311-cp311-win_arm64.whl", hash = "sha256:f7cdf7f26c2286ffb02e46d7bac56c94655540b26347673bea15fa52a6af17e9", size = 52273, upload-time = "2026-02-17T16:11:40.308Z" }, - { url = "https://files.pythonhosted.org/packages/01/1f/c7d8b66a3ca3ca3ed8ded4b32c96ee58a45920ebbbaa934355c74adcc33e/librt-0.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3dff3d3ca8db20e783b1bc7de49c0a2ab0b8387f31236d6a026597d07fcd68ac", size = 65990, upload-time = "2026-02-17T16:12:48.972Z" }, - { url = "https://files.pythonhosted.org/packages/56/be/ee9ba1730052313d08457f19beaa1b878619978863fba09b40aed5b5c123/librt-0.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08eec3a1fc435f0d09c87b6bf1ec798986a3544f446b864e4099633a56fcd9ed", size = 68640, upload-time = "2026-02-17T16:12:50.24Z" }, - { url = "https://files.pythonhosted.org/packages/81/27/b7309298b96f7690cec3ceee38004c1a7f60fcd96d952d3ac344a1e3e8b3/librt-0.8.1-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:e3f0a41487fd5fad7e760b9e8a90e251e27c2816fbc2cff36a22a0e6bcbbd9dd", size = 196099, upload-time = "2026-02-17T16:12:52.788Z" }, - { url = "https://files.pythonhosted.org/packages/10/48/160a5aacdcb21824b10a52378c39e88c46a29bb31efdaf3910dd1f9b670e/librt-0.8.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bacdb58d9939d95cc557b4dbaa86527c9db2ac1ed76a18bc8d26f6dc8647d851", size = 206663, upload-time = "2026-02-17T16:12:55.017Z" }, - { url = "https://files.pythonhosted.org/packages/ee/65/33dd1d8caabb7c6805d87d095b143417dc96b0277c06ffa0508361422c82/librt-0.8.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6d7ab1f01aa753188605b09a51faa44a3327400b00b8cce424c71910fc0a128", size = 219318, upload-time = "2026-02-17T16:12:56.145Z" }, - { url = "https://files.pythonhosted.org/packages/09/d4/353805aa6181c7950a2462bd6e855366eeca21a501f375228d72a51547df/librt-0.8.1-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4998009e7cb9e896569f4be7004f09d0ed70d386fa99d42b6d363f6d200501ac", size = 212191, upload-time = "2026-02-17T16:12:57.326Z" }, - { url = "https://files.pythonhosted.org/packages/06/08/725b3f304d61eba56c713c251fb833a06d84bf93381caad5152366f5d2bb/librt-0.8.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2cc68eeeef5e906839c7bb0815748b5b0a974ec27125beefc0f942715785b551", size = 220672, upload-time = "2026-02-17T16:12:58.497Z" }, - { url = "https://files.pythonhosted.org/packages/0e/55/e8cdf04145872b3b97cb9b68287b22d1c08348227063f305aec11a3e6ce7/librt-0.8.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0bf69d79a23f4f40b8673a947a234baeeb133b5078b483b7297c5916539cf5d5", size = 216172, upload-time = "2026-02-17T16:12:59.751Z" }, - { url = "https://files.pythonhosted.org/packages/8f/d8/23b1c6592d2422dd6829c672f45b1f1c257f219926b0d216fedb572d0184/librt-0.8.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:22b46eabd76c1986ee7d231b0765ad387d7673bbd996aa0d0d054b38ac65d8f6", size = 214116, upload-time = "2026-02-17T16:13:01.056Z" }, - { url = "https://files.pythonhosted.org/packages/c9/92/2b44fd3cc3313f44e43bdbb41343735b568fa675fa351642b408ee48d418/librt-0.8.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:237796479f4d0637d6b9cbcb926ff424a97735e68ade6facf402df4ec93375ed", size = 236664, upload-time = "2026-02-17T16:13:02.314Z" }, - { url = "https://files.pythonhosted.org/packages/00/23/92313ecdab80e142d8ea10e8dfa6297694359dbaacc9e81679bdc8cbceb6/librt-0.8.1-cp39-cp39-win32.whl", hash = "sha256:4beb04b8c66c6ae62f8c1e0b2f097c1ebad9295c929a8d5286c05eae7c2fc7dc", size = 54368, upload-time = "2026-02-17T16:13:03.549Z" }, - { url = "https://files.pythonhosted.org/packages/68/36/18f6e768afad6b55a690d38427c53251b69b7ba8795512730fd2508b31a9/librt-0.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:64548cde61b692dc0dc379f4b5f59a2f582c2ebe7890d09c1ae3b9e66fa015b7", size = 61507, upload-time = "2026-02-17T16:13:04.556Z" }, + { url = "https://files.pythonhosted.org/packages/95/21/d39b0a87ac52fc98f621fb6f8060efb017a767ebbbac2f99fbcbc9ddc0d7/librt-0.8.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a28f2612ab566b17f3698b0da021ff9960610301607c9a5e8eaca62f5e1c350a", size = 66516, upload-time = "2026-02-17T16:11:41.604Z" }, + { url = "https://files.pythonhosted.org/packages/69/f1/46375e71441c43e8ae335905e069f1c54febee63a146278bcee8782c84fd/librt-0.8.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:60a78b694c9aee2a0f1aaeaa7d101cf713e92e8423a941d2897f4fa37908dab9", size = 68634, upload-time = "2026-02-17T16:11:43.268Z" }, + { url = "https://files.pythonhosted.org/packages/0a/33/c510de7f93bf1fa19e13423a606d8189a02624a800710f6e6a0a0f0784b3/librt-0.8.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:758509ea3f1eba2a57558e7e98f4659d0ea7670bff49673b0dde18a3c7e6c0eb", size = 198941, upload-time = "2026-02-17T16:11:44.28Z" }, + { url = "https://files.pythonhosted.org/packages/dd/36/e725903416409a533d92398e88ce665476f275081d0d7d42f9c4951999e5/librt-0.8.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:039b9f2c506bd0ab0f8725aa5ba339c6f0cd19d3b514b50d134789809c24285d", size = 209991, upload-time = "2026-02-17T16:11:45.462Z" }, + { url = "https://files.pythonhosted.org/packages/30/7a/8d908a152e1875c9f8eac96c97a480df425e657cdb47854b9efaa4998889/librt-0.8.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bb54f1205a3a6ab41a6fd71dfcdcbd278670d3a90ca502a30d9da583105b6f7", size = 224476, upload-time = "2026-02-17T16:11:46.542Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b8/a22c34f2c485b8903a06f3fe3315341fe6876ef3599792344669db98fcff/librt-0.8.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:05bd41cdee35b0c59c259f870f6da532a2c5ca57db95b5f23689fcb5c9e42440", size = 217518, upload-time = "2026-02-17T16:11:47.746Z" }, + { url = "https://files.pythonhosted.org/packages/79/6f/5c6fea00357e4f82ba44f81dbfb027921f1ab10e320d4a64e1c408d035d9/librt-0.8.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adfab487facf03f0d0857b8710cf82d0704a309d8ffc33b03d9302b4c64e91a9", size = 225116, upload-time = "2026-02-17T16:11:49.298Z" }, + { url = "https://files.pythonhosted.org/packages/f2/a0/95ced4e7b1267fe1e2720a111685bcddf0e781f7e9e0ce59d751c44dcfe5/librt-0.8.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:153188fe98a72f206042be10a2c6026139852805215ed9539186312d50a8e972", size = 217751, upload-time = "2026-02-17T16:11:50.49Z" }, + { url = "https://files.pythonhosted.org/packages/93/c2/0517281cb4d4101c27ab59472924e67f55e375bc46bedae94ac6dc6e1902/librt-0.8.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:dd3c41254ee98604b08bd5b3af5bf0a89740d4ee0711de95b65166bf44091921", size = 218378, upload-time = "2026-02-17T16:11:51.783Z" }, + { url = "https://files.pythonhosted.org/packages/43/e8/37b3ac108e8976888e559a7b227d0ceac03c384cfd3e7a1c2ee248dbae79/librt-0.8.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e0d138c7ae532908cbb342162b2611dbd4d90c941cd25ab82084aaf71d2c0bd0", size = 241199, upload-time = "2026-02-17T16:11:53.561Z" }, + { url = "https://files.pythonhosted.org/packages/4b/5b/35812d041c53967fedf551a39399271bbe4257e681236a2cf1a69c8e7fa1/librt-0.8.1-cp312-cp312-win32.whl", hash = "sha256:43353b943613c5d9c49a25aaffdba46f888ec354e71e3529a00cca3f04d66a7a", size = 54917, upload-time = "2026-02-17T16:11:54.758Z" }, + { url = "https://files.pythonhosted.org/packages/de/d1/fa5d5331b862b9775aaf2a100f5ef86854e5d4407f71bddf102f4421e034/librt-0.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:ff8baf1f8d3f4b6b7257fcb75a501f2a5499d0dda57645baa09d4d0d34b19444", size = 62017, upload-time = "2026-02-17T16:11:55.748Z" }, + { url = "https://files.pythonhosted.org/packages/c7/7c/c614252f9acda59b01a66e2ddfd243ed1c7e1deab0293332dfbccf862808/librt-0.8.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f2ae3725904f7377e11cc37722d5d401e8b3d5851fb9273d7f4fe04f6b3d37d", size = 52441, upload-time = "2026-02-17T16:11:56.801Z" }, ] [[package]] @@ -679,22 +608,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2d/d9/5be3a6ab2784cdf9accb0703b65e1b64fcdd9311c9f007630c7db0cfcce1/lxml-6.0.2-cp311-cp311-win32.whl", hash = "sha256:6605c604e6daa9e0d7f0a2137bdc47a2e93b59c60a65466353e37f8272f47c46", size = 3610357, upload-time = "2025-09-22T04:01:11.102Z" }, { url = "https://files.pythonhosted.org/packages/e2/7d/ca6fb13349b473d5732fb0ee3eec8f6c80fc0688e76b7d79c1008481bf1f/lxml-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e5867f2651016a3afd8dd2c8238baa66f1e2802f44bc17e236f547ace6647078", size = 4036583, upload-time = "2025-09-22T04:01:12.766Z" }, { url = "https://files.pythonhosted.org/packages/ab/a2/51363b5ecd3eab46563645f3a2c3836a2fc67d01a1b87c5017040f39f567/lxml-6.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:4197fb2534ee05fd3e7afaab5d8bfd6c2e186f65ea7f9cd6a82809c887bd1285", size = 3680591, upload-time = "2025-09-22T04:01:14.874Z" }, - { url = "https://files.pythonhosted.org/packages/38/66/dd13c74fad495957374c8a81c932f4874d3dca5aa0db9e4369f06a399718/lxml-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2c8458c2cdd29589a8367c09c8f030f1d202be673f0ca224ec18590b3b9fb694", size = 8602363, upload-time = "2025-09-22T04:03:58.698Z" }, - { url = "https://files.pythonhosted.org/packages/5e/f4/edb9d47dce464b5dd044d35775ee794364935b93ab6226c95e199118890d/lxml-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3fee0851639d06276e6b387f1c190eb9d7f06f7f53514e966b26bae46481ec90", size = 4634995, upload-time = "2025-09-22T04:04:01.122Z" }, - { url = "https://files.pythonhosted.org/packages/66/f2/d80c97b6ed83a99bc24b2b29919d5e618af5322df6d3aa61064093712309/lxml-6.0.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b2142a376b40b6736dfc214fd2902409e9e3857eff554fed2d3c60f097e62a62", size = 5003737, upload-time = "2025-09-22T04:04:02.98Z" }, - { url = "https://files.pythonhosted.org/packages/d5/f1/18b750f79f8889b9109b24749f23ac137870b4f685edc4be54be0ff2c730/lxml-6.0.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6b5b39cc7e2998f968f05309e666103b53e2edd01df8dc51b90d734c0825444", size = 5160821, upload-time = "2025-09-22T04:04:04.854Z" }, - { url = "https://files.pythonhosted.org/packages/cf/88/2b6a415dbad411c3e9c092128eb7db06054d2d9460aa56676d17ee4f4fd5/lxml-6.0.2-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4aec24d6b72ee457ec665344a29acb2d35937d5192faebe429ea02633151aad", size = 5070959, upload-time = "2025-09-22T04:04:07.042Z" }, - { url = "https://files.pythonhosted.org/packages/7c/d0/5354afaa0f2e53625e5f96f6bd049a4875c3ab79d96d6c4871dd1f4a98c4/lxml-6.0.2-cp39-cp39-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:b42f4d86b451c2f9d06ffb4f8bbc776e04df3ba070b9fe2657804b1b40277c48", size = 5410267, upload-time = "2025-09-22T04:04:10.458Z" }, - { url = "https://files.pythonhosted.org/packages/51/63/10dea35a01291dc529fa9d6ba204ea627a1c77b7fbb180d404f6cc4dd2fd/lxml-6.0.2-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cdaefac66e8b8f30e37a9b4768a391e1f8a16a7526d5bc77a7928408ef68e93", size = 5292990, upload-time = "2025-09-22T04:04:12.405Z" }, - { url = "https://files.pythonhosted.org/packages/37/58/51ef422d8bec58db600b3552e5f2d870ec01ffacf11d98689c42ffdcbf7f/lxml-6.0.2-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:b738f7e648735714bbb82bdfd030203360cfeab7f6e8a34772b3c8c8b820568c", size = 4776318, upload-time = "2025-09-22T04:04:14.22Z" }, - { url = "https://files.pythonhosted.org/packages/77/97/3f797820e82e3a58a19bc51068b40f3b9ab7d0934ba6e5ba6b147b618319/lxml-6.0.2-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daf42de090d59db025af61ce6bdb2521f0f102ea0e6ea310f13c17610a97da4c", size = 5360191, upload-time = "2025-09-22T04:04:16.236Z" }, - { url = "https://files.pythonhosted.org/packages/e2/14/a9306a8ab122e2f5dfbf4f71fb09beeadca26b0c275708432bbc33f40edc/lxml-6.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:66328dabea70b5ba7e53d94aa774b733cf66686535f3bc9250a7aab53a91caaf", size = 5116114, upload-time = "2025-09-22T04:04:18.594Z" }, - { url = "https://files.pythonhosted.org/packages/ea/23/2118a1685277b9fa8726ec7ee903db55aa300dcea3d406a220cbe3710953/lxml-6.0.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:e237b807d68a61fc3b1e845407e27e5eb8ef69bc93fe8505337c1acb4ee300b6", size = 4801704, upload-time = "2025-09-22T04:04:20.466Z" }, - { url = "https://files.pythonhosted.org/packages/4e/e8/d5be34da2059dc9a4ff8643fd6ad3f8234a27b2a44831b7fff58c4dbb3e3/lxml-6.0.2-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:ac02dc29fd397608f8eb15ac1610ae2f2f0154b03f631e6d724d9e2ad4ee2c84", size = 5355451, upload-time = "2025-09-22T04:04:22.417Z" }, - { url = "https://files.pythonhosted.org/packages/61/84/5aebc8e150d5bf488815ea2d8798c7ff509cc37b5725caa3c1f11bdd3245/lxml-6.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:817ef43a0c0b4a77bd166dc9a09a555394105ff3374777ad41f453526e37f9cb", size = 5318630, upload-time = "2025-09-22T04:04:24.301Z" }, - { url = "https://files.pythonhosted.org/packages/35/04/629ae603c1c17fb7adc9df2bc21aa5ac96afb84001700b13c1f038f3118c/lxml-6.0.2-cp39-cp39-win32.whl", hash = "sha256:bc532422ff26b304cfb62b328826bd995c96154ffd2bac4544f37dbb95ecaa8f", size = 3614032, upload-time = "2025-09-22T04:04:26.158Z" }, - { url = "https://files.pythonhosted.org/packages/71/de/07b7b1249acbecbf48f7e42c3ce87a657af6ff38e30f12a1ad81f16010f2/lxml-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:995e783eb0374c120f528f807443ad5a83a656a8624c467ea73781fc5f8a8304", size = 4035311, upload-time = "2025-09-22T04:04:28.413Z" }, - { url = "https://files.pythonhosted.org/packages/60/e3/02c4c55b281606f3c8e118300e16a9fcf5f3462cc46ce740ed0b82fc3f1b/lxml-6.0.2-cp39-cp39-win_arm64.whl", hash = "sha256:08b9d5e803c2e4725ae9e8559ee880e5328ed61aa0935244e0515d7d9dbec0aa", size = 3683462, upload-time = "2025-09-22T04:04:30.399Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" }, + { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" }, + { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" }, + { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" }, + { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" }, + { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" }, + { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload-time = "2025-09-22T04:01:48.243Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload-time = "2025-09-22T04:01:50.042Z" }, + { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload-time = "2025-09-22T04:01:52.145Z" }, { url = "https://files.pythonhosted.org/packages/e7/9c/780c9a8fce3f04690b374f72f41306866b0400b9d0fdf3e17aaa37887eed/lxml-6.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e748d4cf8fef2526bb2a589a417eba0c8674e29ffcb570ce2ceca44f1e567bf6", size = 3939264, upload-time = "2025-09-22T04:04:32.892Z" }, { url = "https://files.pythonhosted.org/packages/f5/5a/1ab260c00adf645d8bf7dec7f920f744b032f69130c681302821d5debea6/lxml-6.0.2-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4ddb1049fa0579d0cbd00503ad8c58b9ab34d1254c77bc6a5576d96ec7853dba", size = 4216435, upload-time = "2025-09-22T04:04:34.907Z" }, { url = "https://files.pythonhosted.org/packages/f2/37/565f3b3d7ffede22874b6d86be1a1763d00f4ea9fc5b9b6ccb11e4ec8612/lxml-6.0.2-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cb233f9c95f83707dae461b12b720c1af9c28c2d19208e1be03387222151daf5", size = 4325913, upload-time = "2025-09-22T04:04:37.205Z" }, @@ -711,30 +642,52 @@ wheels = [ [[package]] name = "markdown" -version = "3.1.1" +version = "3.10.2" source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "setuptools" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ac/df/0ae25a9fd5bb528fe3c65af7143708160aa3b47970d5272003a1ad5c03c6/Markdown-3.1.1.tar.gz", hash = "sha256:2e50876bcdd74517e7b71f3e7a76102050edec255b3983403f1a63e7c8a41e7a", size = 294136, upload-time = "2019-05-21T01:10:26.93Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/4e/fd492e91abdc2d2fcb70ef453064d980688762079397f779758e055f6575/Markdown-3.1.1-py2.py3-none-any.whl", hash = "sha256:56a46ac655704b91e5b7e6326ce43d5ef72411376588afa1dd90e881b83c7e8c", size = 87763, upload-time = "2019-05-21T01:10:24.61Z" }, + { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, ] [[package]] name = "markupsafe" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/64db92e53b86efccfaea71321f597fa2e1b2bd3853d8ce658568f7a13094/MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", size = 19151, upload-time = "2019-02-24T01:05:32.989Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/85/85/43579939ae1ec6a493c0e68528cd4e26a29fbd4109f5553d4966f6273801/MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c", size = 16351, upload-time = "2021-01-29T23:50:59.684Z" }, - { url = "https://files.pythonhosted.org/packages/f0/03/85efaa82ea0c7655b99db9252347623626048b35c03b046fcfde1af43b61/MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb", size = 32227, upload-time = "2021-01-29T23:51:00.88Z" }, - { url = "https://files.pythonhosted.org/packages/b9/bd/c5183b3416a14c221de4208a52665f7038cc8b159e8ad89bd9ccc23de08a/MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014", size = 32486, upload-time = "2021-01-29T23:51:02.169Z" }, - { url = "https://files.pythonhosted.org/packages/8c/9b/85abd4ff6f9b6d03ce504e6d84589e13d5fd6bc4d63647a57acf1b4abc03/MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850", size = 32229, upload-time = "2021-01-29T23:51:03.599Z" }, - { url = "https://files.pythonhosted.org/packages/be/2e/ad118ca191e44dc6f87182310e5be51da71d4b81ac659e5f8d5f18251806/MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85", size = 32487, upload-time = "2021-01-29T23:51:05.184Z" }, - { url = "https://files.pythonhosted.org/packages/0d/98/0fd0f0baf8a59facb65cee37a26c775ee5a114f86e8b0cfe01dad1b8022a/MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621", size = 33790, upload-time = "2021-01-29T23:51:06.712Z" }, - { url = "https://files.pythonhosted.org/packages/dc/d7/e3478fb2c3f2cc446ae4c6dedba1805f04b329bf30237cfe9f484f3d0a0e/MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39", size = 16159, upload-time = "2021-01-29T23:51:07.916Z" }, - { url = "https://files.pythonhosted.org/packages/fb/39/de6ecf2652dc1b0fb374888a398f326d6c61f12e8004ed3dccb093e33e00/MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8", size = 16768, upload-time = "2021-01-29T23:51:09.146Z" }, +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, ] [[package]] @@ -780,12 +733,12 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2d/46/20f8a7114a56484ab268b0ab372461cb3a8f7deed31ea96b83a4e4cfcfca/mypy-1.19.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331", size = 13436933, upload-time = "2025-12-15T05:03:15.606Z" }, { url = "https://files.pythonhosted.org/packages/5b/f8/33b291ea85050a21f15da910002460f1f445f8007adb29230f0adea279cb/mypy-1.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925", size = 13661754, upload-time = "2025-12-15T05:02:26.731Z" }, { url = "https://files.pythonhosted.org/packages/fd/a3/47cbd4e85bec4335a9cd80cf67dbc02be21b5d4c9c23ad6b95d6c5196bac/mypy-1.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042", size = 10055772, upload-time = "2025-12-15T05:03:26.179Z" }, - { url = "https://files.pythonhosted.org/packages/b5/f7/88436084550ca9af5e610fa45286be04c3b63374df3e021c762fe8c4369f/mypy-1.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3", size = 13102606, upload-time = "2025-12-15T05:02:46.833Z" }, - { url = "https://files.pythonhosted.org/packages/ca/a5/43dfad311a734b48a752790571fd9e12d61893849a01bff346a54011957f/mypy-1.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a", size = 12164496, upload-time = "2025-12-15T05:03:41.947Z" }, - { url = "https://files.pythonhosted.org/packages/88/f0/efbfa391395cce2f2771f937e0620cfd185ec88f2b9cd88711028a768e96/mypy-1.19.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67", size = 12772068, upload-time = "2025-12-15T05:02:53.689Z" }, - { url = "https://files.pythonhosted.org/packages/25/05/58b3ba28f5aed10479e899a12d2120d582ba9fa6288851b20bf1c32cbb4f/mypy-1.19.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e", size = 13520385, upload-time = "2025-12-15T05:02:38.328Z" }, - { url = "https://files.pythonhosted.org/packages/c5/a0/c006ccaff50b31e542ae69b92fe7e2f55d99fba3a55e01067dd564325f85/mypy-1.19.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376", size = 13796221, upload-time = "2025-12-15T05:03:22.147Z" }, - { url = "https://files.pythonhosted.org/packages/b2/ff/8bdb051cd710f01b880472241bd36b3f817a8e1c5d5540d0b761675b6de2/mypy-1.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24", size = 10055456, upload-time = "2025-12-15T05:03:35.169Z" }, + { url = "https://files.pythonhosted.org/packages/06/8a/19bfae96f6615aa8a0604915512e0289b1fad33d5909bf7244f02935d33a/mypy-1.19.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1", size = 13206053, upload-time = "2025-12-15T05:03:46.622Z" }, + { url = "https://files.pythonhosted.org/packages/a5/34/3e63879ab041602154ba2a9f99817bb0c85c4df19a23a1443c8986e4d565/mypy-1.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e", size = 12219134, upload-time = "2025-12-15T05:03:24.367Z" }, + { url = "https://files.pythonhosted.org/packages/89/cc/2db6f0e95366b630364e09845672dbee0cbf0bbe753a204b29a944967cd9/mypy-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2", size = 12731616, upload-time = "2025-12-15T05:02:44.725Z" }, + { url = "https://files.pythonhosted.org/packages/00/be/dd56c1fd4807bc1eba1cf18b2a850d0de7bacb55e158755eb79f77c41f8e/mypy-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8", size = 13620847, upload-time = "2025-12-15T05:03:39.633Z" }, + { url = "https://files.pythonhosted.org/packages/6d/42/332951aae42b79329f743bf1da088cd75d8d4d9acc18fbcbd84f26c1af4e/mypy-1.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a", size = 13834976, upload-time = "2025-12-15T05:03:08.786Z" }, + { url = "https://files.pythonhosted.org/packages/6f/63/e7493e5f90e1e085c562bb06e2eb32cae27c5057b9653348d38b47daaecc/mypy-1.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13", size = 10118104, upload-time = "2025-12-15T05:03:10.834Z" }, { url = "https://files.pythonhosted.org/packages/8d/f4/4ce9a05ce5ded1de3ec1c1d96cf9f9504a04e54ce0ed55cfa38619a32b8d/mypy-1.19.1-py3-none-any.whl", hash = "sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247", size = 2471239, upload-time = "2025-12-15T05:03:07.248Z" }, ] @@ -798,26 +751,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] +[[package]] +name = "nodeenv" +version = "1.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/bf/d1bda4f6168e0b2e9e5958945e01910052158313224ada5ce1fb2e1113b8/nodeenv-1.10.0.tar.gz", hash = "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb", size = 55611, upload-time = "2025-12-20T14:08:54.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/b2/d0896bdcdc8d28a7fc5717c305f1a861c26e18c05047949fb371034d98bd/nodeenv-1.10.0-py2.py3-none-any.whl", hash = "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827", size = 23438, upload-time = "2025-12-20T14:08:52.782Z" }, +] + [[package]] name = "oc-api" -version = "2.0.5" +version = "2.3.0" source = { editable = "." } dependencies = [ { name = "apscheduler" }, - { name = "astroid", version = "3.3.11", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "astroid", version = "4.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "astroid" }, { name = "autopep8" }, { name = "certifi" }, { name = "charset-normalizer" }, { name = "flake8" }, { name = "gevent" }, { name = "gitpython" }, - { name = "gunicorn", version = "23.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "gunicorn", version = "25.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "gunicorn" }, { name = "idna" }, { name = "isodate" }, - { name = "isort", version = "6.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "isort", version = "8.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "isort" }, { name = "jedi" }, { name = "lazy-object-proxy" }, { name = "lxml" }, @@ -828,8 +787,7 @@ dependencies = [ { name = "pycodestyle" }, { name = "pydocstyle" }, { name = "pyflakes" }, - { name = "pylint", version = "3.3.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "pylint", version = "4.0.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "pylint" }, { name = "pyparsing" }, { name = "python-dateutil" }, { name = "python-jsonrpc-server" }, @@ -840,8 +798,7 @@ dependencies = [ { name = "ramose" }, { name = "rdflib" }, { name = "rdflib-jsonld" }, - { name = "redis", version = "7.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "redis", version = "7.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "redis" }, { name = "requests" }, { name = "rope" }, { name = "six" }, @@ -854,15 +811,16 @@ dependencies = [ { name = "web-py" }, { name = "wrapt" }, { name = "yapf" }, - { name = "zope-event", version = "6.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "zope-event", version = "6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "zope-event" }, ] [package.dev-dependencies] dev = [ + { name = "pyright" }, { name = "pytest" }, { name = "pytest-cov" }, - { name = "virtuoso-utilities" }, + { name = "qlever" }, + { name = "ruff" }, ] [package.metadata] @@ -897,13 +855,13 @@ requires-dist = [ { name = "python-lsp-jsonrpc", specifier = ">=1.1.2" }, { name = "python-lsp-server", specifier = ">=1.12.2" }, { name = "pytz", specifier = ">=2026.1.post1" }, - { name = "ramose", specifier = ">=1.0.8" }, + { name = "ramose", specifier = ">=2.0.0" }, { name = "rdflib", specifier = ">=6.1.1" }, { name = "rdflib-jsonld", specifier = ">=0.6.2" }, { name = "redis", specifier = ">=7.0.1" }, { name = "requests", specifier = ">=2.32.4" }, { name = "rope", specifier = ">=1.14.0" }, - { name = "six", specifier = ">=1.13.0" }, + { name = "six", specifier = ">=1.16.0" }, { name = "snowballstemmer", specifier = ">=3.0.1" }, { name = "sparqlwrapper", specifier = ">=2.0.0" }, { name = "toml", specifier = ">=0.10.2" }, @@ -918,9 +876,11 @@ requires-dist = [ [package.metadata.requires-dev] dev = [ + { name = "pyright", specifier = ">=1.1.408" }, { name = "pytest", specifier = ">=8.4.1" }, { name = "pytest-cov", specifier = ">=6.2.1" }, - { name = "virtuoso-utilities", specifier = ">=1.0.0" }, + { name = "qlever", specifier = ">=0.5.45" }, + { name = "ruff", specifier = ">=0.15.5" }, ] [[package]] @@ -950,26 +910,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, ] -[[package]] -name = "platformdirs" -version = "4.4.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/23/e8/21db9c9987b0e728855bd57bff6984f67952bea55d6f75e055c46b5383e8/platformdirs-4.4.0.tar.gz", hash = "sha256:ca753cf4d81dc309bc67b0ea38fd15dc97bc30ce419a7f58d13eb3bf14c4febf", size = 21634, upload-time = "2025-08-26T14:32:04.268Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/4b/2028861e724d3bd36227adfa20d3fd24c3fc6d52032f4a93c133be5d17ce/platformdirs-4.4.0-py3-none-any.whl", hash = "sha256:abd01743f24e5287cd7a5db3752faf1a2d65353f38ec26d98e25a6db65958c85", size = 18654, upload-time = "2025-08-26T14:32:02.735Z" }, -] - [[package]] name = "platformdirs" version = "4.9.4" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11'", - "python_full_version == '3.10.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/19/56/8d4c30c8a1d07013911a8fdbd8f89440ef9f08d07a1b50ab8ca8be5a20f9/platformdirs-4.9.4.tar.gz", hash = "sha256:1ec356301b7dc906d83f371c8f487070e99d3ccf9e501686456394622a01a934", size = 28737, upload-time = "2026-03-05T18:34:13.271Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/63/d7/97f7e3a6abb67d8080dd406fd4df842c2be0efaf712d1c899c32a075027c/platformdirs-4.9.4-py3-none-any.whl", hash = "sha256:68a9a4619a666ea6439f2ff250c12a853cd1cbd5158d258bd824a7df6be2f868", size = 21216, upload-time = "2026-03-05T18:34:12.172Z" }, @@ -1008,26 +952,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d7/27/a58ddaf8c588a3ef080db9d0b7e0b97215cee3a45df74f3a94dbbf5c893a/pycodestyle-2.14.0-py2.py3-none-any.whl", hash = "sha256:dd6bf7cb4ee77f8e016f9c8e74a35ddd9f67e1d5fd4184d86c3b98e07099f42d", size = 31594, upload-time = "2025-06-20T18:49:47.491Z" }, ] -[[package]] -name = "pycparser" -version = "2.23" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/fe/cf/d2d3b9f5699fb1e4615c8e32ff220203e43b248e1dfcc6736ad9057731ca/pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2", size = 173734, upload-time = "2025-09-09T13:23:47.91Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/e3/59cd50310fc9b59512193629e1984c1f95e5c8ae6e5d8c69532ccc65a7fe/pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934", size = 118140, upload-time = "2025-09-09T13:23:46.651Z" }, -] - [[package]] name = "pycparser" version = "3.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11'", - "python_full_version == '3.10.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, @@ -1063,46 +991,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, ] -[[package]] -name = "pylint" -version = "3.3.9" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "astroid", version = "3.3.11", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "colorama", marker = "python_full_version < '3.10' and sys_platform == 'win32'" }, - { name = "dill", marker = "python_full_version < '3.10'" }, - { name = "isort", version = "6.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "mccabe", marker = "python_full_version < '3.10'" }, - { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "tomli", marker = "python_full_version < '3.10'" }, - { name = "tomlkit", marker = "python_full_version < '3.10'" }, - { name = "typing-extensions", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/04/9d/81c84a312d1fa8133b0db0c76148542a98349298a01747ab122f9314b04e/pylint-3.3.9.tar.gz", hash = "sha256:d312737d7b25ccf6b01cc4ac629b5dcd14a0fcf3ec392735ac70f137a9d5f83a", size = 1525946, upload-time = "2025-10-05T18:41:43.786Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1a/a7/69460c4a6af7575449e615144aa2205b89408dc2969b87bc3df2f262ad0b/pylint-3.3.9-py3-none-any.whl", hash = "sha256:01f9b0462c7730f94786c283f3e52a1fbdf0494bbe0971a78d7277ef46a751e7", size = 523465, upload-time = "2025-10-05T18:41:41.766Z" }, -] - [[package]] name = "pylint" version = "4.0.5" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11'", - "python_full_version == '3.10.*'", -] dependencies = [ - { name = "astroid", version = "4.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "colorama", marker = "python_full_version >= '3.10' and sys_platform == 'win32'" }, - { name = "dill", marker = "python_full_version >= '3.10'" }, - { name = "isort", version = "8.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "mccabe", marker = "python_full_version >= '3.10'" }, - { name = "platformdirs", version = "4.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, - { name = "tomli", marker = "python_full_version == '3.10.*'" }, - { name = "tomlkit", marker = "python_full_version >= '3.10'" }, + { name = "astroid" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "dill" }, + { name = "isort" }, + { name = "mccabe" }, + { name = "platformdirs" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "tomlkit" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e4/b6/74d9a8a68b8067efce8d07707fe6a236324ee1e7808d2eb3646ec8517c7d/pylint-4.0.5.tar.gz", hash = "sha256:8cd6a618df75deb013bd7eb98327a95f02a6fb839205a6bbf5456ef96afb317c", size = 1572474, upload-time = "2026-02-20T09:07:33.621Z" } wheels = [ @@ -1118,6 +1019,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/05/e7/df2285f3d08fee213f2d041540fa4fc9ca6c2d44cf36d3a035bf2a8d2bcc/pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf", size = 111120, upload-time = "2025-03-25T05:01:24.908Z" }, ] +[[package]] +name = "pyright" +version = "1.1.408" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nodeenv" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/b2/5db700e52554b8f025faa9c3c624c59f1f6c8841ba81ab97641b54322f16/pyright-1.1.408.tar.gz", hash = "sha256:f28f2321f96852fa50b5829ea492f6adb0e6954568d1caa3f3af3a5f555eb684", size = 4400578, upload-time = "2026-01-08T08:07:38.795Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/82/a2c93e32800940d9573fb28c346772a14778b84ba7524e691b324620ab89/pyright-1.1.408-py3-none-any.whl", hash = "sha256:090b32865f4fdb1e0e6cd82bf5618480d48eecd2eb2e70f960982a3d9a4c17c1", size = 6399144, upload-time = "2026-01-08T08:07:37.082Z" }, +] + [[package]] name = "pytest" version = "8.4.1" @@ -1207,7 +1121,6 @@ version = "1.12.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docstring-to-markdown" }, - { name = "importlib-metadata", marker = "python_full_version < '3.10'" }, { name = "jedi" }, { name = "pluggy" }, { name = "python-lsp-jsonrpc" }, @@ -1233,8 +1146,7 @@ wheels = [ [package.optional-dependencies] global = [ - { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "platformdirs", version = "4.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "platformdirs" }, ] [[package]] @@ -1246,31 +1158,75 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/10/99/781fe0c827be2742bcc775efefccb3b048a3a9c6ce9aec0cbf4a101677e5/pytz-2026.1.post1-py2.py3-none-any.whl", hash = "sha256:f2fd16142fda348286a75e1a524be810bb05d444e5a081f37f7affc635035f7a", size = 510489, upload-time = "2026-03-03T07:47:49.167Z" }, ] +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, +] + +[[package]] +name = "qlever" +version = "0.5.45" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argcomplete" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "rdflib" }, + { name = "requests-sse" }, + { name = "termcolor" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/30/64/3aa30ebb5742ad167a50034f8b8ba5bd73feef3dcbdf49b1ba889a3aec62/qlever-0.5.45.tar.gz", hash = "sha256:bc9d0b0cdaf4d4532ce455361380ea34baddca9992f4fd01665d341014ff65ee", size = 82801, upload-time = "2026-01-22T18:00:40.895Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/7f/4c0baa6622910a27ea7679b486f7e0cfb05a9e49170bd09904a0ee9f9d68/qlever-0.5.45-py3-none-any.whl", hash = "sha256:ebd926018e31bb7c44ed2032654e2109baf14e251c78d943d097983654996163", size = 110850, upload-time = "2026-01-22T18:00:37.909Z" }, +] + [[package]] name = "ramose" -version = "1.0.8" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "certifi" }, - { name = "chardet" }, - { name = "click" }, { name = "flask" }, - { name = "idna" }, { name = "isodate" }, - { name = "itsdangerous" }, - { name = "jinja2" }, { name = "markdown" }, - { name = "markupsafe" }, { name = "python-dateutil" }, { name = "rdflib" }, { name = "requests" }, - { name = "six" }, - { name = "urllib3" }, - { name = "werkzeug" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/91/d1/59a505e5dfdc0f36def5ca0e84c19da0e8d416509fa852ed3770771f2cb5/ramose-1.0.8.tar.gz", hash = "sha256:533808aeddb8425e509f0f7e18d8edd21d856a50d6d59d339659407027edd04b", size = 20163, upload-time = "2023-03-05T14:21:00.382Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/d2/43cf51dbf4ff6f7e8c94fe6bea18628bc697b346b37722dd82a20730c3ab/ramose-2.0.0.tar.gz", hash = "sha256:627cf089d52356233ae641e12aac0c938fd9f60f2192c0b4af496d4eeb3cb861", size = 863387, upload-time = "2026-04-03T10:44:47.169Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/95/97/49752c8db881782d3b478960335641f3bcd9bbfc7954915941c7c082e28a/ramose-1.0.8-py3-none-any.whl", hash = "sha256:d13c33aa0a4c06f8d2bf9484177bf1fb072da9c5e86298adf0d42edaca866fe6", size = 20611, upload-time = "2023-03-05T14:20:58.369Z" }, + { url = "https://files.pythonhosted.org/packages/0a/ec/296dac763ac1508f045814e45b876bd12b44dadca10dc0865ae235263ec6/ramose-2.0.0-py3-none-any.whl", hash = "sha256:156f5d5768ed5c922030d6099281bbb65e996f3d3356a6623fe300f321cfba8a", size = 20896, upload-time = "2026-04-03T10:44:45.764Z" }, ] [[package]] @@ -1301,33 +1257,14 @@ wheels = [ [[package]] name = "redis" -version = "7.0.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "async-timeout", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/57/8f/f125feec0b958e8d22c8f0b492b30b1991d9499a4315dfde466cf4289edc/redis-7.0.1.tar.gz", hash = "sha256:c949df947dca995dc68fdf5a7863950bf6df24f8d6022394585acc98e81624f1", size = 4755322, upload-time = "2025-10-27T14:34:00.33Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/97/9f22a33c475cda519f20aba6babb340fb2f2254a02fb947816960d1e669a/redis-7.0.1-py3-none-any.whl", hash = "sha256:4977af3c7d67f8f0eb8b6fec0dafc9605db9343142f634041fb0235f67c0588a", size = 339938, upload-time = "2025-10-27T14:33:58.553Z" }, -] - -[[package]] -name = "redis" -version = "7.2.1" +version = "7.3.0" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11'", - "python_full_version == '3.10.*'", -] dependencies = [ - { name = "async-timeout", marker = "python_full_version >= '3.10' and python_full_version < '3.11.3'" }, + { name = "async-timeout", marker = "python_full_version < '3.11.3'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e9/31/1476f206482dd9bc53fdbbe9f6fbd5e05d153f18e54667ce839df331f2e6/redis-7.2.1.tar.gz", hash = "sha256:6163c1a47ee2d9d01221d8456bc1c75ab953cbda18cfbc15e7140e9ba16ca3a5", size = 4906735, upload-time = "2026-02-25T20:05:18.171Z" } +sdist = { url = "https://files.pythonhosted.org/packages/da/82/4d1a5279f6c1251d3d2a603a798a1137c657de9b12cfc1fba4858232c4d2/redis-7.3.0.tar.gz", hash = "sha256:4d1b768aafcf41b01022410b3cc4f15a07d9b3d6fe0c66fc967da2c88e551034", size = 4928081, upload-time = "2026-03-06T18:18:16.287Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ca/98/1dd1a5c060916cf21d15e67b7d6a7078e26e2605d5c37cbc9f4f5454c478/redis-7.2.1-py3-none-any.whl", hash = "sha256:49e231fbc8df2001436ae5252b3f0f3dc930430239bfeb6da4c7ee92b16e5d33", size = 396057, upload-time = "2026-02-25T20:05:16.533Z" }, + { url = "https://files.pythonhosted.org/packages/f0/28/84e57fce7819e81ec5aa1bd31c42b89607241f4fb1a3ea5b0d2dbeaea26c/redis-7.3.0-py3-none-any.whl", hash = "sha256:9d4fcb002a12a5e3c3fbe005d59c48a2cc231f87fbb2f6b70c2d89bb64fec364", size = 404379, upload-time = "2026-03-06T18:18:14.583Z" }, ] [[package]] @@ -1345,6 +1282,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, ] +[[package]] +name = "requests-sse" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/73/dd6b0ae667c7720ddd5479f6216b1442610fdd162e27ce7bfb8357083f06/requests_sse-0.5.2.tar.gz", hash = "sha256:2bcb7cf905074b18ff9f7322716234c1188dfde805bba38300b37c6b5ae3a20a", size = 9001, upload-time = "2025-06-17T01:32:42.768Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/73/bf4771da460b528edc0ff9f2845682b50d60ffb84b4587f90ef665408195/requests_sse-0.5.2-py3-none-any.whl", hash = "sha256:ebd9da245c2bb02bc070617e16b37a260a7386abf6cd9b2a250a6529a92c74cf", size = 10078, upload-time = "2025-06-17T01:32:41.299Z" }, +] + [[package]] name = "rope" version = "1.14.0" @@ -1357,6 +1306,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/75/35/130469d1901da2b3a5a377539b4ffcd8a5c983f1c9e3ba5ffdd8d71ae314/rope-1.14.0-py3-none-any.whl", hash = "sha256:00a7ea8c0c376fc0b053b2f2f8ef3bfb8b50fecf1ebf3eb80e4f8bd7f1941918", size = 207143, upload-time = "2025-07-12T17:46:05.928Z" }, ] +[[package]] +name = "ruff" +version = "0.15.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/77/9b/840e0039e65fcf12758adf684d2289024d6140cde9268cc59887dc55189c/ruff-0.15.5.tar.gz", hash = "sha256:7c3601d3b6d76dce18c5c824fc8d06f4eef33d6df0c21ec7799510cde0f159a2", size = 4574214, upload-time = "2026-03-05T20:06:34.946Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/20/5369c3ce21588c708bcbe517a8fbe1a8dfdb5dfd5137e14790b1da71612c/ruff-0.15.5-py3-none-linux_armv6l.whl", hash = "sha256:4ae44c42281f42e3b06b988e442d344a5b9b72450ff3c892e30d11b29a96a57c", size = 10478185, upload-time = "2026-03-05T20:06:29.093Z" }, + { url = "https://files.pythonhosted.org/packages/44/ed/e81dd668547da281e5dce710cf0bc60193f8d3d43833e8241d006720e42b/ruff-0.15.5-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6edd3792d408ebcf61adabc01822da687579a1a023f297618ac27a5b51ef0080", size = 10859201, upload-time = "2026-03-05T20:06:32.632Z" }, + { url = "https://files.pythonhosted.org/packages/c4/8f/533075f00aaf19b07c5cd6aa6e5d89424b06b3b3f4583bfa9c640a079059/ruff-0.15.5-py3-none-macosx_11_0_arm64.whl", hash = "sha256:89f463f7c8205a9f8dea9d658d59eff49db05f88f89cc3047fb1a02d9f344010", size = 10184752, upload-time = "2026-03-05T20:06:40.312Z" }, + { url = "https://files.pythonhosted.org/packages/66/0e/ba49e2c3fa0395b3152bad634c7432f7edfc509c133b8f4529053ff024fb/ruff-0.15.5-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba786a8295c6574c1116704cf0b9e6563de3432ac888d8f83685654fe528fd65", size = 10534857, upload-time = "2026-03-05T20:06:19.581Z" }, + { url = "https://files.pythonhosted.org/packages/59/71/39234440f27a226475a0659561adb0d784b4d247dfe7f43ffc12dd02e288/ruff-0.15.5-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd4b801e57955fe9f02b31d20375ab3a5c4415f2e5105b79fb94cf2642c91440", size = 10309120, upload-time = "2026-03-05T20:06:00.435Z" }, + { url = "https://files.pythonhosted.org/packages/f5/87/4140aa86a93df032156982b726f4952aaec4a883bb98cb6ef73c347da253/ruff-0.15.5-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391f7c73388f3d8c11b794dbbc2959a5b5afe66642c142a6effa90b45f6f5204", size = 11047428, upload-time = "2026-03-05T20:05:51.867Z" }, + { url = "https://files.pythonhosted.org/packages/5a/f7/4953e7e3287676f78fbe85e3a0ca414c5ca81237b7575bdadc00229ac240/ruff-0.15.5-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc18f30302e379fe1e998548b0f5e9f4dff907f52f73ad6da419ea9c19d66c8", size = 11914251, upload-time = "2026-03-05T20:06:22.887Z" }, + { url = "https://files.pythonhosted.org/packages/77/46/0f7c865c10cf896ccf5a939c3e84e1cfaeed608ff5249584799a74d33835/ruff-0.15.5-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1cc6e7f90087e2d27f98dc34ed1b3ab7c8f0d273cc5431415454e22c0bd2a681", size = 11333801, upload-time = "2026-03-05T20:05:57.168Z" }, + { url = "https://files.pythonhosted.org/packages/d3/01/a10fe54b653061585e655f5286c2662ebddb68831ed3eaebfb0eb08c0a16/ruff-0.15.5-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1cb7169f53c1ddb06e71a9aebd7e98fc0fea936b39afb36d8e86d36ecc2636a", size = 11206821, upload-time = "2026-03-05T20:06:03.441Z" }, + { url = "https://files.pythonhosted.org/packages/7a/0d/2132ceaf20c5e8699aa83da2706ecb5c5dcdf78b453f77edca7fb70f8a93/ruff-0.15.5-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:9b037924500a31ee17389b5c8c4d88874cc6ea8e42f12e9c61a3d754ff72f1ca", size = 11133326, upload-time = "2026-03-05T20:06:25.655Z" }, + { url = "https://files.pythonhosted.org/packages/72/cb/2e5259a7eb2a0f87c08c0fe5bf5825a1e4b90883a52685524596bfc93072/ruff-0.15.5-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:65bb414e5b4eadd95a8c1e4804f6772bbe8995889f203a01f77ddf2d790929dd", size = 10510820, upload-time = "2026-03-05T20:06:37.79Z" }, + { url = "https://files.pythonhosted.org/packages/ff/20/b67ce78f9e6c59ffbdb5b4503d0090e749b5f2d31b599b554698a80d861c/ruff-0.15.5-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d20aa469ae3b57033519c559e9bc9cd9e782842e39be05b50e852c7c981fa01d", size = 10302395, upload-time = "2026-03-05T20:05:54.504Z" }, + { url = "https://files.pythonhosted.org/packages/5f/e5/719f1acccd31b720d477751558ed74e9c88134adcc377e5e886af89d3072/ruff-0.15.5-py3-none-musllinux_1_2_i686.whl", hash = "sha256:15388dd28c9161cdb8eda68993533acc870aa4e646a0a277aa166de9ad5a8752", size = 10754069, upload-time = "2026-03-05T20:06:06.422Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9c/d1db14469e32d98f3ca27079dbd30b7b44dbb5317d06ab36718dee3baf03/ruff-0.15.5-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:b30da330cbd03bed0c21420b6b953158f60c74c54c5f4c1dabbdf3a57bf355d2", size = 11304315, upload-time = "2026-03-05T20:06:10.867Z" }, + { url = "https://files.pythonhosted.org/packages/28/3a/950367aee7c69027f4f422059227b290ed780366b6aecee5de5039d50fa8/ruff-0.15.5-py3-none-win32.whl", hash = "sha256:732e5ee1f98ba5b3679029989a06ca39a950cced52143a0ea82a2102cb592b74", size = 10551676, upload-time = "2026-03-05T20:06:13.705Z" }, + { url = "https://files.pythonhosted.org/packages/b8/00/bf077a505b4e649bdd3c47ff8ec967735ce2544c8e4a43aba42ee9bf935d/ruff-0.15.5-py3-none-win_amd64.whl", hash = "sha256:821d41c5fa9e19117616c35eaa3f4b75046ec76c65e7ae20a333e9a8696bc7fe", size = 11678972, upload-time = "2026-03-05T20:06:45.379Z" }, + { url = "https://files.pythonhosted.org/packages/fe/4e/cd76eca6db6115604b7626668e891c9dd03330384082e33662fb0f113614/ruff-0.15.5-py3-none-win_arm64.whl", hash = "sha256:b498d1c60d2fe5c10c45ec3f698901065772730b411f164ae270bb6bfcc4740b", size = 10965572, upload-time = "2026-03-05T20:06:16.984Z" }, +] + [[package]] name = "setuptools" version = "80.9.0" @@ -1368,11 +1342,11 @@ wheels = [ [[package]] name = "six" -version = "1.13.0" +version = "1.17.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/3e/edcf6fef41d89187df7e38e868b2dd2182677922b600e880baad7749c865/six-1.13.0.tar.gz", hash = "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66", size = 33726, upload-time = "2019-11-05T17:28:36.181Z" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/65/26/32b8464df2a97e6dd1b656ed26b2c194606c16fe163c695a992b36c11cdf/six-1.13.0-py2.py3-none-any.whl", hash = "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", size = 10747, upload-time = "2019-11-05T17:28:34.35Z" }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] [[package]] @@ -1405,6 +1379,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/31/89/176e3db96e31e795d7dfd91dd67749d3d1f0316bb30c6931a6140e1a0477/SPARQLWrapper-2.0.0-py3-none-any.whl", hash = "sha256:c99a7204fff676ee28e6acef327dc1ff8451c6f7217dcd8d49e8872f324a8a20", size = 28620, upload-time = "2022-03-13T23:13:58.969Z" }, ] +[[package]] +name = "termcolor" +version = "3.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/46/79/cf31d7a93a8fdc6aa0fbb665be84426a8c5a557d9240b6239e9e11e35fc5/termcolor-3.3.0.tar.gz", hash = "sha256:348871ca648ec6a9a983a13ab626c0acce02f515b9e1983332b17af7979521c5", size = 14434, upload-time = "2025-12-29T12:55:21.882Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/d1/8bb87d21e9aeb323cc03034f5eaf2c8f69841e40e4853c2627edf8111ed3/termcolor-3.3.0-py3-none-any.whl", hash = "sha256:cf642efadaf0a8ebbbf4bc7a31cec2f9b5f21a9f726f4ccbb08192c9c26f43a5", size = 7734, upload-time = "2025-12-29T12:55:20.718Z" }, +] + [[package]] name = "toml" version = "0.10.2" @@ -1430,6 +1413,16 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/92/a3/7ade0576d17f3cdf5ff44d61390d4b3febb8a9fc2b480c75c47ea048c646/tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8", size = 238273, upload-time = "2024-11-27T22:38:04.217Z" }, { url = "https://files.pythonhosted.org/packages/72/6f/fa64ef058ac1446a1e51110c375339b3ec6be245af9d14c87c4a6412dd32/tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff", size = 98310, upload-time = "2024-11-27T22:38:05.908Z" }, { url = "https://files.pythonhosted.org/packages/6a/1c/4a2dcde4a51b81be3530565e92eda625d94dafb46dbeb15069df4caffc34/tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b", size = 108309, upload-time = "2024-11-27T22:38:06.812Z" }, + { url = "https://files.pythonhosted.org/packages/52/e1/f8af4c2fcde17500422858155aeb0d7e93477a0d59a98e56cbfe75070fd0/tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea", size = 132762, upload-time = "2024-11-27T22:38:07.731Z" }, + { url = "https://files.pythonhosted.org/packages/03/b8/152c68bb84fc00396b83e7bbddd5ec0bd3dd409db4195e2a9b3e398ad2e3/tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8", size = 123453, upload-time = "2024-11-27T22:38:09.384Z" }, + { url = "https://files.pythonhosted.org/packages/c8/d6/fc9267af9166f79ac528ff7e8c55c8181ded34eb4b0e93daa767b8841573/tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192", size = 233486, upload-time = "2024-11-27T22:38:10.329Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/51c3f2884d7bab89af25f678447ea7d297b53b5a3b5730a7cb2ef6069f07/tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222", size = 242349, upload-time = "2024-11-27T22:38:11.443Z" }, + { url = "https://files.pythonhosted.org/packages/ab/df/bfa89627d13a5cc22402e441e8a931ef2108403db390ff3345c05253935e/tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77", size = 252159, upload-time = "2024-11-27T22:38:13.099Z" }, + { url = "https://files.pythonhosted.org/packages/9e/6e/fa2b916dced65763a5168c6ccb91066f7639bdc88b48adda990db10c8c0b/tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6", size = 237243, upload-time = "2024-11-27T22:38:14.766Z" }, + { url = "https://files.pythonhosted.org/packages/b4/04/885d3b1f650e1153cbb93a6a9782c58a972b94ea4483ae4ac5cedd5e4a09/tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd", size = 259645, upload-time = "2024-11-27T22:38:15.843Z" }, + { url = "https://files.pythonhosted.org/packages/9c/de/6b432d66e986e501586da298e28ebeefd3edc2c780f3ad73d22566034239/tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e", size = 244584, upload-time = "2024-11-27T22:38:17.645Z" }, + { url = "https://files.pythonhosted.org/packages/1c/9a/47c0449b98e6e7d1be6cbac02f93dd79003234ddc4aaab6ba07a9a7482e2/tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98", size = 98875, upload-time = "2024-11-27T22:38:19.159Z" }, + { url = "https://files.pythonhosted.org/packages/ef/60/9b9638f081c6f1261e2688bd487625cd1e660d0a85bd469e91d8db969734/tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4", size = 109418, upload-time = "2024-11-27T22:38:20.064Z" }, { url = "https://files.pythonhosted.org/packages/6e/c2/61d3e0f47e2b74ef40a68b9e6ad5984f6241a942f7cd3bbfbdbd03861ea9/tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc", size = 14257, upload-time = "2024-11-27T22:38:35.385Z" }, ] @@ -1512,17 +1505,17 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fe/d3/9ba310e07969bc9906eb7548731e33a0f448b122ad9705fed699c9b29345/ujson-5.11.0-cp311-cp311-win32.whl", hash = "sha256:e979fbc469a7f77f04ec2f4e853ba00c441bf2b06720aa259f0f720561335e34", size = 39648, upload-time = "2025-08-20T11:55:31.194Z" }, { url = "https://files.pythonhosted.org/packages/57/f7/da05b4a8819f1360be9e71fb20182f0bb3ec611a36c3f213f4d20709e099/ujson-5.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:683f57f0dd3acdd7d9aff1de0528d603aafcb0e6d126e3dc7ce8b020a28f5d01", size = 43717, upload-time = "2025-08-20T11:55:32.241Z" }, { url = "https://files.pythonhosted.org/packages/9a/cc/f3f9ac0f24f00a623a48d97dc3814df5c2dc368cfb00031aa4141527a24b/ujson-5.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:7855ccea3f8dad5e66d8445d754fc1cf80265a4272b5f8059ebc7ec29b8d0835", size = 38402, upload-time = "2025-08-20T11:55:33.641Z" }, - { url = "https://files.pythonhosted.org/packages/39/bf/c6f59cdf74ce70bd937b97c31c42fd04a5ed1a9222d0197e77e4bd899841/ujson-5.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:65f3c279f4ed4bf9131b11972040200c66ae040368abdbb21596bf1564899694", size = 55283, upload-time = "2025-08-20T11:56:33.947Z" }, - { url = "https://files.pythonhosted.org/packages/8d/c1/a52d55638c0c644b8a63059f95ad5ffcb4ad8f60d8bc3e8680f78e77cc75/ujson-5.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:99c49400572cd77050894e16864a335225191fd72a818ea6423ae1a06467beac", size = 53168, upload-time = "2025-08-20T11:56:35.141Z" }, - { url = "https://files.pythonhosted.org/packages/75/6c/e64e19a01d59c8187d01ffc752ee3792a09f5edaaac2a0402de004459dd7/ujson-5.11.0-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0654a2691fc252c3c525e3d034bb27b8a7546c9d3eb33cd29ce6c9feda361a6a", size = 57809, upload-time = "2025-08-20T11:56:36.293Z" }, - { url = "https://files.pythonhosted.org/packages/9f/36/910117b7a8a1c188396f6194ca7bc8fd75e376d8f7e3cf5eb6219fc8b09d/ujson-5.11.0-cp39-cp39-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:6b6ec7e7321d7fc19abdda3ad809baef935f49673951a8bab486aea975007e02", size = 59797, upload-time = "2025-08-20T11:56:37.746Z" }, - { url = "https://files.pythonhosted.org/packages/c7/17/bcc85d282ee2f4cdef5f577e0a43533eedcae29cc6405edf8c62a7a50368/ujson-5.11.0-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f62b9976fabbcde3ab6e413f4ec2ff017749819a0786d84d7510171109f2d53c", size = 57378, upload-time = "2025-08-20T11:56:39.123Z" }, - { url = "https://files.pythonhosted.org/packages/ef/39/120bb76441bf835f3c3f42db9c206f31ba875711637a52a8209949ab04b0/ujson-5.11.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7f1a27ab91083b4770e160d17f61b407f587548f2c2b5fbf19f94794c495594a", size = 1036515, upload-time = "2025-08-20T11:56:40.848Z" }, - { url = "https://files.pythonhosted.org/packages/b6/ae/fe1b4ff6388f681f6710e9494656957725b1e73ae50421ec04567df9fb75/ujson-5.11.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ecd6ff8a3b5a90c292c2396c2d63c687fd0ecdf17de390d852524393cd9ed052", size = 1195753, upload-time = "2025-08-20T11:56:42.341Z" }, - { url = "https://files.pythonhosted.org/packages/92/20/005b93f2cf846ae50b46812fcf24bbdd127521197e5f1e1a82e3b3e730a1/ujson-5.11.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9aacbeb23fdbc4b256a7d12e0beb9063a1ba5d9e0dbb2cfe16357c98b4334596", size = 1088844, upload-time = "2025-08-20T11:56:43.777Z" }, - { url = "https://files.pythonhosted.org/packages/41/9e/3142023c30008e2b24d7368a389b26d28d62fcd3f596d3d898a72dd09173/ujson-5.11.0-cp39-cp39-win32.whl", hash = "sha256:674f306e3e6089f92b126eb2fe41bcb65e42a15432c143365c729fdb50518547", size = 39652, upload-time = "2025-08-20T11:56:45.034Z" }, - { url = "https://files.pythonhosted.org/packages/ca/89/f4de0a3c485d0163f85f552886251876645fb62cbbe24fcdc0874b9fae03/ujson-5.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:c6618f480f7c9ded05e78a1938873fde68baf96cdd74e6d23c7e0a8441175c4b", size = 43783, upload-time = "2025-08-20T11:56:46.156Z" }, - { url = "https://files.pythonhosted.org/packages/48/b1/2d50987a7b7cccb5c1fbe9ae7b184211106237b32c7039118c41d79632ea/ujson-5.11.0-cp39-cp39-win_arm64.whl", hash = "sha256:5600202a731af24a25e2d7b6eb3f648e4ecd4bb67c4d5cf12f8fab31677469c9", size = 38430, upload-time = "2025-08-20T11:56:47.653Z" }, + { url = "https://files.pythonhosted.org/packages/b9/ef/a9cb1fce38f699123ff012161599fb9f2ff3f8d482b4b18c43a2dc35073f/ujson-5.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7895f0d2d53bd6aea11743bd56e3cb82d729980636cd0ed9b89418bf66591702", size = 55434, upload-time = "2025-08-20T11:55:34.987Z" }, + { url = "https://files.pythonhosted.org/packages/b1/05/dba51a00eb30bd947791b173766cbed3492269c150a7771d2750000c965f/ujson-5.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12b5e7e22a1fe01058000d1b317d3b65cc3daf61bd2ea7a2b76721fe160fa74d", size = 53190, upload-time = "2025-08-20T11:55:36.384Z" }, + { url = "https://files.pythonhosted.org/packages/03/3c/fd11a224f73fbffa299fb9644e425f38b38b30231f7923a088dd513aabb4/ujson-5.11.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0180a480a7d099082501cad1fe85252e4d4bf926b40960fb3d9e87a3a6fbbc80", size = 57600, upload-time = "2025-08-20T11:55:37.692Z" }, + { url = "https://files.pythonhosted.org/packages/55/b9/405103cae24899df688a3431c776e00528bd4799e7d68820e7ebcf824f92/ujson-5.11.0-cp312-cp312-manylinux_2_24_i686.manylinux_2_28_i686.whl", hash = "sha256:fa79fdb47701942c2132a9dd2297a1a85941d966d8c87bfd9e29b0cf423f26cc", size = 59791, upload-time = "2025-08-20T11:55:38.877Z" }, + { url = "https://files.pythonhosted.org/packages/17/7b/2dcbc2bbfdbf68f2368fb21ab0f6735e872290bb604c75f6e06b81edcb3f/ujson-5.11.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8254e858437c00f17cb72e7a644fc42dad0ebb21ea981b71df6e84b1072aaa7c", size = 57356, upload-time = "2025-08-20T11:55:40.036Z" }, + { url = "https://files.pythonhosted.org/packages/d1/71/fea2ca18986a366c750767b694430d5ded6b20b6985fddca72f74af38a4c/ujson-5.11.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1aa8a2ab482f09f6c10fba37112af5f957689a79ea598399c85009f2f29898b5", size = 1036313, upload-time = "2025-08-20T11:55:41.408Z" }, + { url = "https://files.pythonhosted.org/packages/a3/bb/d4220bd7532eac6288d8115db51710fa2d7d271250797b0bfba9f1e755af/ujson-5.11.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a638425d3c6eed0318df663df44480f4a40dc87cc7c6da44d221418312f6413b", size = 1195782, upload-time = "2025-08-20T11:55:43.357Z" }, + { url = "https://files.pythonhosted.org/packages/80/47/226e540aa38878ce1194454385701d82df538ccb5ff8db2cf1641dde849a/ujson-5.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7e3cff632c1d78023b15f7e3a81c3745cd3f94c044d1e8fa8efbd6b161997bbc", size = 1088817, upload-time = "2025-08-20T11:55:45.262Z" }, + { url = "https://files.pythonhosted.org/packages/7e/81/546042f0b23c9040d61d46ea5ca76f0cc5e0d399180ddfb2ae976ebff5b5/ujson-5.11.0-cp312-cp312-win32.whl", hash = "sha256:be6b0eaf92cae8cdee4d4c9e074bde43ef1c590ed5ba037ea26c9632fb479c88", size = 39757, upload-time = "2025-08-20T11:55:46.522Z" }, + { url = "https://files.pythonhosted.org/packages/44/1b/27c05dc8c9728f44875d74b5bfa948ce91f6c33349232619279f35c6e817/ujson-5.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:b7b136cc6abc7619124fd897ef75f8e63105298b5ca9bdf43ebd0e1fa0ee105f", size = 43859, upload-time = "2025-08-20T11:55:47.987Z" }, + { url = "https://files.pythonhosted.org/packages/22/2d/37b6557c97c3409c202c838aa9c960ca3896843b4295c4b7bb2bbd260664/ujson-5.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:6cd2df62f24c506a0ba322d5e4fe4466d47a9467b57e881ee15a31f7ecf68ff6", size = 38361, upload-time = "2025-08-20T11:55:49.122Z" }, { url = "https://files.pythonhosted.org/packages/50/17/30275aa2933430d8c0c4ead951cc4fdb922f575a349aa0b48a6f35449e97/ujson-5.11.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:abae0fb58cc820092a0e9e8ba0051ac4583958495bfa5262a12f628249e3b362", size = 51206, upload-time = "2025-08-20T11:56:48.797Z" }, { url = "https://files.pythonhosted.org/packages/c3/15/42b3924258eac2551f8f33fa4e35da20a06a53857ccf3d4deb5e5d7c0b6c/ujson-5.11.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:fac6c0649d6b7c3682a0a6e18d3de6857977378dce8d419f57a0b20e3d775b39", size = 48907, upload-time = "2025-08-20T11:56:50.136Z" }, { url = "https://files.pythonhosted.org/packages/94/7e/0519ff7955aba581d1fe1fb1ca0e452471250455d182f686db5ac9e46119/ujson-5.11.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4b42c115c7c6012506e8168315150d1e3f76e7ba0f4f95616f4ee599a1372bbc", size = 50319, upload-time = "2025-08-20T11:56:51.63Z" }, @@ -1540,19 +1533,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0c/cd/1e2ec680ec7b09846dc6e605f5a7709dfb9d7128e51a026e7154e18a234e/urllib3-1.26.5-py2.py3-none-any.whl", hash = "sha256:753a0374df26658f99d826cfe40394a686d05985786d946fbe4165b5148f5a7c", size = 138144, upload-time = "2021-05-26T17:02:33.236Z" }, ] -[[package]] -name = "virtuoso-utilities" -version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "psutil" }, - { name = "tqdm" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/83/13/6660a0acabcf513717642ad529d10b322f6b84277983ddc1c2b242685cb4/virtuoso_utilities-1.3.0.tar.gz", hash = "sha256:fc327eff5f52a48d86e9291d36932215954d8aa3db60ef7df216e3f530b90a19", size = 33253, upload-time = "2025-07-20T14:52:04.504Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d2/81/5ac4cb26d742ed1c1d5f618805e8b12bb13989cec720e98a194cc85874af/virtuoso_utilities-1.3.0-py3-none-any.whl", hash = "sha256:e95f5c5046e7de229afca3124d2e6a87b4f737c385106ed961fc6cddb0495d6b", size = 31652, upload-time = "2025-07-20T14:52:03.694Z" }, -] - [[package]] name = "web-py" version = "0.62" @@ -1564,11 +1544,14 @@ sdist = { url = "https://files.pythonhosted.org/packages/cd/6e/338a060bb5b52ee82 [[package]] name = "werkzeug" -version = "0.16.0" +version = "3.1.8" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/fd/eb19e4f6a806cd6ee34900a687f181001c7a0059ff914752091aba84681f/Werkzeug-0.16.0.tar.gz", hash = "sha256:7280924747b5733b246fe23972186c6b348f9ae29724135a6dfc1e53cea433e7", size = 925717, upload-time = "2019-09-19T14:39:46.394Z" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/dd/b2/381be8cfdee792dd117872481b6e378f85c957dd7c5bca38897b08f765fd/werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44", size = 875852, upload-time = "2026-04-02T18:49:14.268Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/ce/42/3aeda98f96e85fd26180534d36570e4d18108d62ae36f87694b476b83d6f/Werkzeug-0.16.0-py2.py3-none-any.whl", hash = "sha256:e5f4a1f98b52b18a93da705a7458e55afb26f32bff83ff5d19189f92462d65c4", size = 327277, upload-time = "2019-09-19T14:39:43.445Z" }, + { url = "https://files.pythonhosted.org/packages/93/8c/2e650f2afeb7ee576912636c23ddb621c91ac6a98e66dc8d29c3c69446e1/werkzeug-3.1.8-py3-none-any.whl", hash = "sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50", size = 226459, upload-time = "2026-04-02T18:49:12.72Z" }, ] [[package]] @@ -1599,17 +1582,17 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/91/2c/a3f28b8fa7ac2cefa01cfcaca3471f9b0460608d012b693998cd61ef43df/wrapt-2.1.2-cp311-cp311-win32.whl", hash = "sha256:5a0a0a3a882393095573344075189eb2d566e0fd205a2b6414e9997b1b800a8b", size = 57977, upload-time = "2026-03-06T02:53:27.844Z" }, { url = "https://files.pythonhosted.org/packages/3f/c3/2b1c7bd07a27b1db885a2fab469b707bdd35bddf30a113b4917a7e2139d2/wrapt-2.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:64a07a71d2730ba56f11d1a4b91f7817dc79bc134c11516b75d1921a7c6fcda1", size = 60336, upload-time = "2026-03-06T02:54:28.104Z" }, { url = "https://files.pythonhosted.org/packages/ec/5c/76ece7b401b088daa6503d6264dd80f9a727df3e6042802de9a223084ea2/wrapt-2.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:b89f095fe98bc12107f82a9f7d570dc83a0870291aeb6b1d7a7d35575f55d98a", size = 58756, upload-time = "2026-03-06T02:53:16.319Z" }, - { url = "https://files.pythonhosted.org/packages/f7/ea/fe375f8a012e5f25b2cd31b093860c8c6540be445345c6f886e5d8bca9ef/wrapt-2.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5e0fa9cc32300daf9eb09a1f5bdc6deb9a79defd70d5356ba453bcd50aef3742", size = 60661, upload-time = "2026-03-06T02:54:06.572Z" }, - { url = "https://files.pythonhosted.org/packages/d8/2a/0dff969ddf4d3f69f051c8f81afbd3a9fc9fb08ab993b1061ee582b6543c/wrapt-2.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:710f6e5dfaf6a5d5c397d2d6758a78fecd9649deb21f1b645f5b57a328d63050", size = 61602, upload-time = "2026-03-06T02:53:44.48Z" }, - { url = "https://files.pythonhosted.org/packages/25/62/b80dd7a6c21486a7b8aea63b6bac509b2e4ea184b0eefe3795aa7202a92c/wrapt-2.1.2-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:305d8a1755116bfdad5dda9e771dcb2138990a1d66e9edd81658816edf51aed1", size = 113340, upload-time = "2026-03-06T02:54:44.626Z" }, - { url = "https://files.pythonhosted.org/packages/82/06/adbe093e07a775d8687cc45329cda9e1b33779357d146c688accbc3a9f1f/wrapt-2.1.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f0d8fc30a43b5fe191cf2b1a0c82bab2571dadd38e7c0062ee87d6df858dd06e", size = 115305, upload-time = "2026-03-06T02:53:04.929Z" }, - { url = "https://files.pythonhosted.org/packages/3f/dd/31c2596c6bf6bfb1874aa637c66e3028baa83d00708d1439db3b395f8371/wrapt-2.1.2-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a5d516e22aedb7c9c1d47cba1c63160b1a6f61ec2f3948d127cd38d5cfbb556f", size = 111691, upload-time = "2026-03-06T02:53:17.845Z" }, - { url = "https://files.pythonhosted.org/packages/03/92/e9ba179f4a00b7eb7ab8afc1f729fc3be8bd468b9f1d33be1fd99476493a/wrapt-2.1.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:45914e8efbe4b9d5102fcf0e8e2e3258b83a5d5fba9f8f7b6d15681e9d29ffe0", size = 114507, upload-time = "2026-03-06T02:54:49.398Z" }, - { url = "https://files.pythonhosted.org/packages/0f/dd/5ce1332e824503fb7041a8f8b51ec1f06e7033834e38c01416fa1c599668/wrapt-2.1.2-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:478282ebd3795a089154fb16d3db360e103aa13d3b2ad30f8f6aac0d2207de0e", size = 110945, upload-time = "2026-03-06T02:54:32.088Z" }, - { url = "https://files.pythonhosted.org/packages/1b/17/d1c1d7b63a029205fe8add19db654fd105e2a92a3776c1312e74456ce3ab/wrapt-2.1.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3756219045f73fb28c5d7662778e4156fbd06cf823c4d2d4b19f97305e52819c", size = 113107, upload-time = "2026-03-06T02:54:05.226Z" }, - { url = "https://files.pythonhosted.org/packages/85/9f/aa5b1570ca36a0533ad5fc9d9e436047b9af187f9bd182f5eb6b718fe28b/wrapt-2.1.2-cp39-cp39-win32.whl", hash = "sha256:b8aefb4dbb18d904b96827435a763fa42fc1f08ea096a391710407a60983ced8", size = 57984, upload-time = "2026-03-06T02:53:10.07Z" }, - { url = "https://files.pythonhosted.org/packages/71/3a/a0c92e4c8b6cd8ef179c62249f03f5ce50c142f71fe04c2a14279bd826b4/wrapt-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:e5aeab8fe15c3dff75cfee94260dcd9cded012d4ff06add036c28fae7718593b", size = 60334, upload-time = "2026-03-06T02:53:34.183Z" }, - { url = "https://files.pythonhosted.org/packages/75/87/2725632aa7f1f70a9730952444e2ba856bd15ce8ee0210afcdb50f48ab69/wrapt-2.1.2-cp39-cp39-win_arm64.whl", hash = "sha256:f069e113743a21a3defac6677f000068ebb931639f789b5b226598e247a4c89e", size = 58759, upload-time = "2026-03-06T02:53:43.16Z" }, + { url = "https://files.pythonhosted.org/packages/4c/b6/1db817582c49c7fcbb7df6809d0f515af29d7c2fbf57eb44c36e98fb1492/wrapt-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ff2aad9c4cda28a8f0653fc2d487596458c2a3f475e56ba02909e950a9efa6a9", size = 61255, upload-time = "2026-03-06T02:52:45.663Z" }, + { url = "https://files.pythonhosted.org/packages/a2/16/9b02a6b99c09227c93cd4b73acc3678114154ec38da53043c0ddc1fba0dc/wrapt-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6433ea84e1cfacf32021d2a4ee909554ade7fd392caa6f7c13f1f4bf7b8e8748", size = 61848, upload-time = "2026-03-06T02:53:48.728Z" }, + { url = "https://files.pythonhosted.org/packages/af/aa/ead46a88f9ec3a432a4832dfedb84092fc35af2d0ba40cd04aea3889f247/wrapt-2.1.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c20b757c268d30d6215916a5fa8461048d023865d888e437fab451139cad6c8e", size = 121433, upload-time = "2026-03-06T02:54:40.328Z" }, + { url = "https://files.pythonhosted.org/packages/3a/9f/742c7c7cdf58b59085a1ee4b6c37b013f66ac33673a7ef4aaed5e992bc33/wrapt-2.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79847b83eb38e70d93dc392c7c5b587efe65b3e7afcc167aa8abd5d60e8761c8", size = 123013, upload-time = "2026-03-06T02:53:26.58Z" }, + { url = "https://files.pythonhosted.org/packages/e8/44/2c3dd45d53236b7ed7c646fcf212251dc19e48e599debd3926b52310fafb/wrapt-2.1.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f8fba1bae256186a83d1875b2b1f4e2d1242e8fac0f58ec0d7e41b26967b965c", size = 117326, upload-time = "2026-03-06T02:53:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/74/e2/b17d66abc26bd96f89dec0ecd0ef03da4a1286e6ff793839ec431b9fae57/wrapt-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e3d3b35eedcf5f7d022291ecd7533321c4775f7b9cd0050a31a68499ba45757c", size = 121444, upload-time = "2026-03-06T02:54:09.5Z" }, + { url = "https://files.pythonhosted.org/packages/3c/62/e2977843fdf9f03daf1586a0ff49060b1b2fc7ff85a7ea82b6217c1ae36e/wrapt-2.1.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:6f2c5390460de57fa9582bc8a1b7a6c86e1a41dfad74c5225fc07044c15cc8d1", size = 116237, upload-time = "2026-03-06T02:54:03.884Z" }, + { url = "https://files.pythonhosted.org/packages/88/dd/27fc67914e68d740bce512f11734aec08696e6b17641fef8867c00c949fc/wrapt-2.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7dfa9f2cf65d027b951d05c662cc99ee3bd01f6e4691ed39848a7a5fffc902b2", size = 120563, upload-time = "2026-03-06T02:53:20.412Z" }, + { url = "https://files.pythonhosted.org/packages/ec/9f/b750b3692ed2ef4705cb305bd68858e73010492b80e43d2a4faa5573cbe7/wrapt-2.1.2-cp312-cp312-win32.whl", hash = "sha256:eba8155747eb2cae4a0b913d9ebd12a1db4d860fc4c829d7578c7b989bd3f2f0", size = 58198, upload-time = "2026-03-06T02:53:37.732Z" }, + { url = "https://files.pythonhosted.org/packages/8e/b2/feecfe29f28483d888d76a48f03c4c4d8afea944dbee2b0cd3380f9df032/wrapt-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1c51c738d7d9faa0b3601708e7e2eda9bf779e1b601dce6c77411f2a1b324a63", size = 60441, upload-time = "2026-03-06T02:52:47.138Z" }, + { url = "https://files.pythonhosted.org/packages/44/e1/e328f605d6e208547ea9fd120804fcdec68536ac748987a68c47c606eea8/wrapt-2.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:c8e46ae8e4032792eb2f677dbd0d557170a8e5524d22acc55199f43efedd39bf", size = 58836, upload-time = "2026-03-06T02:53:22.053Z" }, { url = "https://files.pythonhosted.org/packages/1a/c7/8528ac2dfa2c1e6708f647df7ae144ead13f0a31146f43c7264b4942bf12/wrapt-2.1.2-py3-none-any.whl", hash = "sha256:b8fd6fa2b2c4e7621808f8c62e8317f4aae56e59721ad933bac5239d913cf0e8", size = 43993, upload-time = "2026-03-06T02:53:12.905Z" }, ] @@ -1618,8 +1601,7 @@ name = "yapf" version = "0.43.0" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "platformdirs", version = "4.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" }, - { name = "platformdirs", version = "4.9.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" }, + { name = "platformdirs" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/23/97/b6f296d1e9cc1ec25c7604178b48532fa5901f721bcf1b8d8148b13e5588/yapf-0.43.0.tar.gz", hash = "sha256:00d3aa24bfedff9420b2e0d5d9f5ab6d9d4268e72afbf59bb3fa542781d5218e", size = 254907, upload-time = "2024-11-14T00:11:41.584Z" } @@ -1636,71 +1618,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, ] -[[package]] -name = "zope-event" -version = "6.0" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -dependencies = [ - { name = "setuptools", marker = "python_full_version < '3.10'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c2/d8/9c8b0c6bb1db09725395618f68d3b8a08089fca0aed28437500caaf713ee/zope_event-6.0.tar.gz", hash = "sha256:0ebac894fa7c5f8b7a89141c272133d8c1de6ddc75ea4b1f327f00d1f890df92", size = 18731, upload-time = "2025-09-12T07:10:13.551Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/b5/1abb5a8b443314c978617bf46d5d9ad648bdf21058074e817d7efbb257db/zope_event-6.0-py3-none-any.whl", hash = "sha256:6f0922593407cc673e7d8766b492c519f91bdc99f3080fe43dcec0a800d682a3", size = 6409, upload-time = "2025-09-12T07:10:12.316Z" }, -] - [[package]] name = "zope-event" version = "6.1" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11'", - "python_full_version == '3.10.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/46/33/d3eeac228fc14de76615612ee208be2d8a5b5b0fada36bf9b62d6b40600c/zope_event-6.1.tar.gz", hash = "sha256:6052a3e0cb8565d3d4ef1a3a7809336ac519bc4fe38398cb8d466db09adef4f0", size = 18739, upload-time = "2025-11-07T08:05:49.934Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c2/b0/956902e5e1302f8c5d124e219c6bf214e2649f92ad5fce85b05c039a04c9/zope_event-6.1-py3-none-any.whl", hash = "sha256:0ca78b6391b694272b23ec1335c0294cc471065ed10f7f606858fc54566c25a0", size = 6414, upload-time = "2025-11-07T08:05:48.874Z" }, ] -[[package]] -name = "zope-interface" -version = "8.0.1" -source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version < '3.10'", -] -sdist = { url = "https://files.pythonhosted.org/packages/88/3a/7fcf02178b8fad0a51e67e32765cd039ae505d054d744d76b8c2bbcba5ba/zope_interface-8.0.1.tar.gz", hash = "sha256:eba5610d042c3704a48222f7f7c6ab5b243ed26f917e2bc69379456b115e02d1", size = 253746, upload-time = "2025-09-25T05:55:51.285Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/75/e5/ffef169d17b92c6236b3b18b890c0ce73502f3cbd5b6532ff20d412d94a3/zope_interface-8.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fd7195081b8637eeed8d73e4d183b07199a1dc738fb28b3de6666b1b55662570", size = 207364, upload-time = "2025-09-25T05:58:50.262Z" }, - { url = "https://files.pythonhosted.org/packages/35/b6/87aca626c09af829d3a32011599d6e18864bc8daa0ad3a7e258f3d7f8bcf/zope_interface-8.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f7c4bc4021108847bce763673ce70d0716b08dfc2ba9889e7bad46ac2b3bb924", size = 207901, upload-time = "2025-09-25T05:58:51.74Z" }, - { url = "https://files.pythonhosted.org/packages/d8/c1/eec33cc9f847ebeb0bc6234d7d45fe3fc0a6fe8fc5b5e6be0442bd2c684d/zope_interface-8.0.1-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:758803806b962f32c87b31bb18c298b022965ba34fe532163831cc39118c24ab", size = 249358, upload-time = "2025-09-25T05:58:16.979Z" }, - { url = "https://files.pythonhosted.org/packages/58/7d/1e3476a1ef0175559bd8492dc7bb921ad0df5b73861d764b1f824ad5484a/zope_interface-8.0.1-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f8e88f35f86bbe8243cad4b2972deef0fdfca0a0723455abbebdc83bbab96b69", size = 254475, upload-time = "2025-09-25T05:58:10.032Z" }, - { url = "https://files.pythonhosted.org/packages/bc/67/ba5ea98ff23f723c5cbe7db7409f2e43c9fe2df1ced67881443c01e64478/zope_interface-8.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7844765695937d9b0d83211220b72e2cf6ac81a08608ad2b58f2c094af498d83", size = 254913, upload-time = "2025-09-25T06:26:22.263Z" }, - { url = "https://files.pythonhosted.org/packages/2b/a7/b1b8b6c13fba955c043cdee409953ee85f652b106493e2e931a84f95c1aa/zope_interface-8.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:64fa7b206dd9669f29d5c1241a768bebe8ab1e8a4b63ee16491f041e058c09d0", size = 211753, upload-time = "2025-09-25T05:59:00.561Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2f/c10c739bcb9b072090c97c2e08533777497190daa19d190d72b4cce9c7cb/zope_interface-8.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4bd01022d2e1bce4a4a4ed9549edb25393c92e607d7daa6deff843f1f68b479d", size = 207903, upload-time = "2025-09-25T05:58:21.671Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e1/9845ac3697f108d9a1af6912170c59a23732090bbfb35955fe77e5544955/zope_interface-8.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:29be8db8b712d94f1c05e24ea230a879271d787205ba1c9a6100d1d81f06c69a", size = 208345, upload-time = "2025-09-25T05:58:24.217Z" }, - { url = "https://files.pythonhosted.org/packages/f2/49/6573bc8b841cfab18e80c8e8259f1abdbbf716140011370de30231be79ad/zope_interface-8.0.1-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:51ae1b856565b30455b7879fdf0a56a88763b401d3f814fa9f9542d7410dbd7e", size = 255027, upload-time = "2025-09-25T05:58:19.975Z" }, - { url = "https://files.pythonhosted.org/packages/e2/fd/908b0fd4b1ab6e412dfac9bd2b606f2893ef9ba3dd36d643f5e5b94c57b3/zope_interface-8.0.1-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d2e7596149cb1acd1d4d41b9f8fe2ffc0e9e29e2e91d026311814181d0d9efaf", size = 259800, upload-time = "2025-09-25T05:58:11.487Z" }, - { url = "https://files.pythonhosted.org/packages/dc/78/8419a2b4e88410520ed4b7f93bbd25a6d4ae66c4e2b131320f2b90f43077/zope_interface-8.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b2737c11c34fb9128816759864752d007ec4f987b571c934c30723ed881a7a4f", size = 260978, upload-time = "2025-09-25T06:26:24.483Z" }, - { url = "https://files.pythonhosted.org/packages/e5/90/caf68152c292f1810e2bd3acd2177badf08a740aa8a348714617d6c9ad0b/zope_interface-8.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:cf66e4bf731aa7e0ced855bb3670e8cda772f6515a475c6a107bad5cb6604103", size = 212155, upload-time = "2025-09-25T05:59:40.318Z" }, - { url = "https://files.pythonhosted.org/packages/e5/24/d5c5e7936e014276b7a98a076de4f5dc2587100fea95779c1e36650b8770/zope_interface-8.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b84464a9fcf801289fa8b15bfc0829e7855d47fb4a8059555effc6f2d1d9a613", size = 207443, upload-time = "2025-09-25T05:59:34.299Z" }, - { url = "https://files.pythonhosted.org/packages/8a/76/565cf6db478ba344b27cfd6828f17da2888cf1beb521bce31142b3041fb5/zope_interface-8.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7b915cf7e747b5356d741be79a153aa9107e8923bc93bcd65fc873caf0fb5c50", size = 207928, upload-time = "2025-09-25T05:59:35.524Z" }, - { url = "https://files.pythonhosted.org/packages/65/03/9780355205c3b3f55e9ce700e52846b40d0bab99c078e102c0d7e2f3e022/zope_interface-8.0.1-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:110c73ddf974b369ef3c6e7b0d87d44673cf4914eba3fe8a33bfb21c6c606ad8", size = 248605, upload-time = "2025-09-25T05:58:25.586Z" }, - { url = "https://files.pythonhosted.org/packages/44/09/b10eda92f1373cd8e4e9dd376559414d1759a8b54e98eeef0d81844f0638/zope_interface-8.0.1-cp39-cp39-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9e9bdca901c1bcc34e438001718512c65b3b8924aabcd732b6e7a7f0cd715f17", size = 253793, upload-time = "2025-09-25T05:58:16.92Z" }, - { url = "https://files.pythonhosted.org/packages/62/37/3529065a2b6b7dc8f287ff3c8d1e8b7d8c4681c069e520bd3c4ac995a95c/zope_interface-8.0.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bbd22d4801ad3e8ec704ba9e3e6a4ac2e875e4d77e363051ccb76153d24c5519", size = 254263, upload-time = "2025-09-25T06:26:29.371Z" }, - { url = "https://files.pythonhosted.org/packages/c3/31/42588bea7ddad3abd2d4987ec3b767bd09394cc091a4918b1cf7b9de07ae/zope_interface-8.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:a0016ca85f93b938824e2f9a43534446e95134a2945b084944786e1ace2020bc", size = 211780, upload-time = "2025-09-25T05:59:50.015Z" }, -] - [[package]] name = "zope-interface" version = "8.2" source = { registry = "https://pypi.org/simple" } -resolution-markers = [ - "python_full_version >= '3.11'", - "python_full_version == '3.10.*'", -] sdist = { url = "https://files.pythonhosted.org/packages/86/a4/77daa5ba398996d16bb43fc721599d27d03eae68fe3c799de1963c72e228/zope_interface-8.2.tar.gz", hash = "sha256:afb20c371a601d261b4f6edb53c3c418c249db1a9717b0baafc9a9bb39ba1224", size = 254019, upload-time = "2026-01-09T07:51:07.253Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b1/fa/6d9eb3a33998a3019d7eb4fa1802d01d6602fad90e0aea443e6e0fe8e49a/zope_interface-8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:788c293f3165964ec6527b2d861072c68eef53425213f36d3893ebee89a89623", size = 207541, upload-time = "2026-01-09T08:04:55.378Z" }, @@ -1715,4 +1645,10 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ea/a1/b32484f3281a5dc83bc713ad61eca52c543735cdf204543172087a074a74/zope_interface-8.2-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8f094bfb49179ec5dc9981cb769af1275702bd64720ef94874d9e34da1390d4c", size = 259970, upload-time = "2026-01-09T08:05:11.477Z" }, { url = "https://files.pythonhosted.org/packages/f6/81/bca0e8ae1e487d4093a8a7cfed2118aa2d4758c8cfd66e59d2af09d71f1c/zope_interface-8.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d2bb8e7364e18f083bf6744ccf30433b2a5f236c39c95df8514e3c13007098ce", size = 261153, upload-time = "2026-01-09T08:05:13.402Z" }, { url = "https://files.pythonhosted.org/packages/40/1e/e3ff2a708011e56b10b271b038d4cb650a8ad5b7d24352fe2edf6d6b187a/zope_interface-8.2-cp311-cp311-win_amd64.whl", hash = "sha256:6f4b4dfcfdfaa9177a600bb31cebf711fdb8c8e9ed84f14c61c420c6aa398489", size = 212330, upload-time = "2026-01-09T08:05:15.267Z" }, + { url = "https://files.pythonhosted.org/packages/e0/a0/1e1fabbd2e9c53ef92b69df6d14f4adc94ec25583b1380336905dc37e9a0/zope_interface-8.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:624b6787fc7c3e45fa401984f6add2c736b70a7506518c3b537ffaacc4b29d4c", size = 208785, upload-time = "2026-01-09T08:05:17.348Z" }, + { url = "https://files.pythonhosted.org/packages/c3/2a/88d098a06975c722a192ef1fb7d623d1b57c6a6997cf01a7aabb45ab1970/zope_interface-8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc9ded9e97a0ed17731d479596ed1071e53b18e6fdb2fc33af1e43f5fd2d3aaa", size = 208976, upload-time = "2026-01-09T08:05:18.792Z" }, + { url = "https://files.pythonhosted.org/packages/e9/e8/757398549fdfd2f8c89f32c82ae4d2f0537ae2a5d2f21f4a2f711f5a059f/zope_interface-8.2-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:532367553e4420c80c0fc0cabcc2c74080d495573706f66723edee6eae53361d", size = 259411, upload-time = "2026-01-09T08:05:20.567Z" }, + { url = "https://files.pythonhosted.org/packages/91/af/502601f0395ce84dff622f63cab47488657a04d0065547df42bee3a680ff/zope_interface-8.2-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2bf9cf275468bafa3c72688aad8cfcbe3d28ee792baf0b228a1b2d93bd1d541a", size = 264859, upload-time = "2026-01-09T08:05:22.234Z" }, + { url = "https://files.pythonhosted.org/packages/89/0c/d2f765b9b4814a368a7c1b0ac23b68823c6789a732112668072fe596945d/zope_interface-8.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0009d2d3c02ea783045d7804da4fd016245e5c5de31a86cebba66dd6914d59a2", size = 264398, upload-time = "2026-01-09T08:05:23.853Z" }, + { url = "https://files.pythonhosted.org/packages/4a/81/2f171fbc4222066957e6b9220c4fb9146792540102c37e6d94e5d14aad97/zope_interface-8.2-cp312-cp312-win_amd64.whl", hash = "sha256:845d14e580220ae4544bd4d7eb800f0b6034fe5585fc2536806e0a26c2ee6640", size = 212444, upload-time = "2026-01-09T08:05:25.148Z" }, ]