René's URL Explorer Experiment


Title: [WIP] bpo-36142: Rework Python init to add _PyPreConfig by vstinner · Pull Request #12087 · python/cpython · GitHub

Open Graph Title: [WIP] bpo-36142: Rework Python init to add _PyPreConfig by vstinner · Pull Request #12087 · python/cpython

X Title: [WIP] bpo-36142: Rework Python init to add _PyPreConfig by vstinner · Pull Request #12087 · python/cpython

Description: I added a _PyCoreConfig structure to Python 3.7 which contains almost all parameters used to configure Python. Problems: _PyCoreConfig uses bytes and Unicode strings (char* and wchar_t*) whereas it is also used to setup the memory allocator and (filesystem, locale and stdio) encodings. I propose to add a new _PyPreConfig which is the "strict minimum" configuration to setup encodings and the memory allocator. In practice, it also contains parameters which directly or indirectly impacts the allocator and encodings. For example, isolated impacts use_environment which impacts the allocator (PYTHONMALLOC environment variable). Another example: dev_mode=1 sets the allocator to "debug". The command line arguments are now parsed twice. _PyPreConfig only parses a few parameters like -E, -I and -X. A temporary _PyPreCmdline is used to store command line arguments like -X options. I moved structures closer to where they are used. "Global" _PyMain structure has been removed. _PyCmdline now lives way shorter than previously and is moved from main.c to coreconfig.c. The idea is to better control when and how memory is allocated. In term of API, we get something like: _PyCoreConfig config = _PyCoreConfig_INIT; config.preconfig.stdio_encoding = "iso8859-1"; config.preconfig.stdio_errors = "replace"; config.user_site_directory = 0; ... _PyInitError err = _Py_InitializeFromConfig(&config); if (_Py_INIT_FAILED(err)) { _Py_ExitInitError(err); } ... Py_Finalize(); return 0; "config.preconfig.stdio_errors" syntax isn't great, but it's simpler to implement than duplicating all _PyPreConfig fields into _PyCoreConfig. Changes: Add Python/preconfig.c file Add _PyPreConfig structure: pre-initialization configuration for allocator and encodings. _PyCoreConfig now has a "_PyPreConfig preconfig;" field Add _PyArgv structure: helper to pass command line argument in bytes (char*) or Unicode (wchar_t*) Add exitcode to _PyInitError Add 'exitcode' field to _PyInitError structure Add _Py_INIT_EXIT() macro Rename _Py_FatalInitError() to _Py_ExitInitError() Add new fields to _PyCoreConfig: run_command run_filename run_module skip_source_first_line Add _PyMain_Usage() Hardcode short and long options in _PyOS_GetOpt(). Make _PyCoreConfig_xxx() functions internal (Py_BUILD_CORE). Move _PyCmdline from main.c to coreconfig.c main.c: Remove _PyMain structure https://bugs.python.org/issue36142

Open Graph Description: I added a _PyCoreConfig structure to Python 3.7 which contains almost all parameters used to configure Python. Problems: _PyCoreConfig uses bytes and Unicode strings (char* and wchar_t*) whereas it...

X Description: I added a _PyCoreConfig structure to Python 3.7 which contains almost all parameters used to configure Python. Problems: _PyCoreConfig uses bytes and Unicode strings (char* and wchar_t*) whereas it...

Opengraph URL: https://github.com/python/cpython/pull/12087

X: @github

direct link

Domain: github.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:6aa9c6b1-2a45-7045-0489-9fd71accc0f0
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idED10:5CEA4:2074726:2CEE112:6A4ED4E4
html-safe-nonce4e9e67a7e8c8675fb93499e4b8bb743ca5a94a160e2ff4064f1360a1ae521a0a
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJFRDEwOjVDRUE0OjIwNzQ3MjY6MkNFRTExMjo2QTRFRDRFNCIsInZpc2l0b3JfaWQiOiI3NzgzNTA4NDQxOTEwMTM4MDg0IiwicmVnaW9uX2VkZ2UiOiJpYWQiLCJyZWdpb25fcmVuZGVyIjoiaWFkIn0=
visitor-hmaccf6883ead483be7a4311195d36d81a32f4b2d396e0b0dfe5c9fed5b6bea5ef45
hovercard-subject-tagpull_request:256903549
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/python/cpython/pull/12087/files
twitter:imagehttps://avatars.githubusercontent.com/u/194129?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/194129?s=400&v=4
og:image:altI added a _PyCoreConfig structure to Python 3.7 which contains almost all parameters used to configure Python. Problems: _PyCoreConfig uses bytes and Unicode strings (char* and wchar_t*) whereas it...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
None41b6ab3ba6d20a71766ac245b5a4a94c6fc672a9cd4da7d44c1b33ab8bf6a21c
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/python/cpython git https://github.com/python/cpython.git
octolytics-dimension-user_id1525981
octolytics-dimension-user_loginpython
octolytics-dimension-repository_id81598961
octolytics-dimension-repository_nwopython/cpython
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id81598961
octolytics-dimension-repository_network_root_nwopython/cpython
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
releasec37fe3e3f5f306900bd5b6bee97463f66c938b2c
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/python/cpython/pull/12087/files#start-of-content
https://github.com/
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fpython%2Fcpython%2Fpull%2F12087%2Ffiles
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub Copilot appDirect agents from issue to mergehttps://github.com/features/ai/github-app
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
View all resourceshttps://github.com/resources
GitHub SponsorsFund open source developershttps://github.com/open-source/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/open-source/accelerator
GitHub Starshttps://stars.github.com
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fpython%2Fcpython%2Fpull%2F12087%2Ffiles
Sign up https://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=python%2Fcpython
Reloadhttps://github.com/python/cpython/pull/12087/files
Reloadhttps://github.com/python/cpython/pull/12087/files
Reloadhttps://github.com/python/cpython/pull/12087/files
Please reload this pagehttps://github.com/python/cpython/pull/12087/files
python https://github.com/python
cpythonhttps://github.com/python/cpython
Please reload this pagehttps://github.com/python/cpython/pull/12087/files
Notifications https://github.com/login?return_to=%2Fpython%2Fcpython
Fork 34.8k https://github.com/login?return_to=%2Fpython%2Fcpython
Star 73.6k https://github.com/login?return_to=%2Fpython%2Fcpython
Code https://github.com/python/cpython
Issues 5k+ https://github.com/python/cpython/issues
Pull requests 2.3k https://github.com/python/cpython/pulls
Actions https://github.com/python/cpython/actions
Projects https://github.com/python/cpython/projects
Security and quality 0 https://github.com/python/cpython/security
Insights https://github.com/python/cpython/pulse
Code https://github.com/python/cpython
Issues https://github.com/python/cpython/issues
Pull requests https://github.com/python/cpython/pulls
Actions https://github.com/python/cpython/actions
Projects https://github.com/python/cpython/projects
Security and quality https://github.com/python/cpython/security
Insights https://github.com/python/cpython/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fpython%2Fcpython%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fpython%2Fcpython%2Fissues%2Fnew%2Fchoose
vstinnerhttps://github.com/vstinner
python:masterhttps://github.com/python/cpython/tree/master
Conversation 5 https://github.com/python/cpython/pull/12087
Commits 6 https://github.com/python/cpython/pull/12087/commits
Checks 0 https://github.com/python/cpython/pull/12087/checks
Files changed https://github.com/python/cpython/pull/12087/files
Please reload this pagehttps://github.com/python/cpython/pull/12087/files
[WIP] bpo-36142: Rework Python init to add _PyPreConfig https://github.com/python/cpython/pull/12087/files#top
Show all changes 6 commits https://github.com/python/cpython/pull/12087/files
111371d bpo-36142: Rework Python init to add _PyPreConfig vstinner Feb 22, 2019 https://github.com/python/cpython/pull/12087/commits/111371de1b09caf68576a5a7ded9cc28dbd29f76
d94fd28 Fix sys__enablelegacywindowsfsencoding_impl() vstinner Mar 1, 2019 https://github.com/python/cpython/pull/12087/commits/d94fd28400f145eb566eafe18b6f69465300457d
02a79a9 Fix _PyPreConfig_WINDOWS_INIT vstinner Mar 1, 2019 https://github.com/python/cpython/pull/12087/commits/02a79a976b31c11749e18827216115d63b2549c9
a8fb926 Fix _freeze_importlib.c vstinner Mar 1, 2019 https://github.com/python/cpython/pull/12087/commits/a8fb926d78de097c1b9fca9f985110b2256d0755
326ea5c Fix get_env_flag() vstinner Mar 1, 2019 https://github.com/python/cpython/pull/12087/commits/326ea5c2736f19a168920d5b3e4e2bc8ccf0c9ed
1eaeb4d rename to _PyPreConfig_GetEnvFlag() vstinner Mar 1, 2019 https://github.com/python/cpython/pull/12087/commits/1eaeb4d5ae9cef53ca1e7e7ec80004a10cd54819
Clear filters https://github.com/python/cpython/pull/12087/files
Please reload this pagehttps://github.com/python/cpython/pull/12087/files
Please reload this pagehttps://github.com/python/cpython/pull/12087/files
Python.h https://github.com/python/cpython/pull/12087/files#diff-f60ef9db994347493c9ad11a939d46272a5b9a3d03e9aa22f186a87dd9ce8769
coreconfig.h https://github.com/python/cpython/pull/12087/files#diff-740d146b836af6b605c830215bc0268c33bd96a3e36a1b3edee2608e27cbde04
pylifecycle.h https://github.com/python/cpython/pull/12087/files#diff-0bf60487b94c5152e970cc86cbc5d8fcaa7e729628b15f3e83f3ad31406dcaee
pystate.h https://github.com/python/cpython/pull/12087/files#diff-fefbbf791abe2a1b6d9cab39778d388ebb9135eeefbd734e463aac75d1979e7f
fileobject.h https://github.com/python/cpython/pull/12087/files#diff-336d14274842d263183c593a593da61c8cf55f67ab8ba7663c91d0821121a88e
pycore_coreconfig.h https://github.com/python/cpython/pull/12087/files#diff-02def1b5d69a745d44b19c86d5bb0623a8a1bf065bf46a1226c67de51c968aa7
pycore_getopt.h https://github.com/python/cpython/pull/12087/files#diff-9891f9c02da74ac061c5b1d1901cfe55d8b281ac38656f79a037a6acc1ff9161
pycore_pathconfig.h https://github.com/python/cpython/pull/12087/files#diff-d6407f1795dbf22a73edcd52999f463485fb0595f06554d602bb276d9f7d36d6
pycore_pymem.h https://github.com/python/cpython/pull/12087/files#diff-f43c977e1d9084d42f494114fd29faf9312b850ffefcebb64396214024f19377
pystate.h https://github.com/python/cpython/pull/12087/files#diff-72fdb9ce4eb86f7a79872b667270cf35110b62609cc8765aa3c795907c99f431
test_embed.py https://github.com/python/cpython/pull/12087/files#diff-573be25566e43f5adc6650ad1b58d106dbbd79521cb9c6e6d5df9588616a1ffd
Makefile.pre.in https://github.com/python/cpython/pull/12087/files#diff-1f0a8db227d22005511b0d90f5339b97db345917b863954b3b3ccb9ec308767c
main.c https://github.com/python/cpython/pull/12087/files#diff-79e40dbd94b164b5f42a960224cc7496e33c189b4c66a6810904eda7d703b6f2
unicodeobject.c https://github.com/python/cpython/pull/12087/files#diff-34c966e7876d6f8bf801dd51896327e4f68bba02cddb95fbf3963f0b2e39c38a
pythoncore.vcxproj https://github.com/python/cpython/pull/12087/files#diff-4295039788386c2986b811f2a6b59cf088be59822b24b4f1243c9e9b184f65fb
pythoncore.vcxproj.filters https://github.com/python/cpython/pull/12087/files#diff-9e715828befc9c50c8b483b06d4923cda0db44f57d0c20e6a6d428ba60bfa0c5
_freeze_importlib.c https://github.com/python/cpython/pull/12087/files#diff-234de3c1e1119df6c7570b71e6acda500058c5691d50dbc893a4ba38073c9c93
_testembed.c https://github.com/python/cpython/pull/12087/files#diff-68b4b67b7265522a6f47393ef786b2034f5d6c53f1a9574780d72662c2361fad
coreconfig.c https://github.com/python/cpython/pull/12087/files#diff-8ad78aa05f0378106d90732c13d0c19c4dd296b1648f74254641ad2732cb7ceb
frozenmain.c https://github.com/python/cpython/pull/12087/files#diff-2703d388c9e22fb13c0ab0de85bc43438d02c29b9658784cbab214deea89bae6
getopt.c https://github.com/python/cpython/pull/12087/files#diff-85d41d9a32aae56a4cde43bb2bd3f072abe41d1c71961025a1d5f10e2ae485e2
pathconfig.c https://github.com/python/cpython/pull/12087/files#diff-09327e0a986b458413322c8ef2c9f7ff06f191cc79520787f95db7598e633415
preconfig.c https://github.com/python/cpython/pull/12087/files#diff-a1a9690b1dad0706a879eb408d93a2a4467ac7a7cab949a10d53f993b9bd0138
pylifecycle.c https://github.com/python/cpython/pull/12087/files#diff-69223f5bb01f359a23246afbbf75b45c622e719424418d658674fbb6c2b36fad
pystate.c https://github.com/python/cpython/pull/12087/files#diff-7ac11e526f79b42d6ea9d3592cb99da46775640c69fa5510f4a6de87cced7141
sysmodule.c https://github.com/python/cpython/pull/12087/files#diff-a3a5c73931235f7f344c072dc755d6508e13923db3f5d581c5e88652075871cb
Include/Python.hhttps://github.com/python/cpython/pull/12087/files#diff-f60ef9db994347493c9ad11a939d46272a5b9a3d03e9aa22f186a87dd9ce8769
View file https://github.com/python/cpython/blob/1eaeb4d5ae9cef53ca1e7e7ec80004a10cd54819/Include/Python.h
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/python/cpython/pull/12087/{{ revealButtonHref }}
https://github.com/python/cpython/pull/12087/files#diff-f60ef9db994347493c9ad11a939d46272a5b9a3d03e9aa22f186a87dd9ce8769
https://github.com/python/cpython/pull/12087/files#diff-f60ef9db994347493c9ad11a939d46272a5b9a3d03e9aa22f186a87dd9ce8769
Include/coreconfig.h → Include/cpython/coreconfig.hhttps://github.com/python/cpython/pull/12087/files#diff-740d146b836af6b605c830215bc0268c33bd96a3e36a1b3edee2608e27cbde04
View file https://github.com/python/cpython/blob/1eaeb4d5ae9cef53ca1e7e7ec80004a10cd54819/Include/cpython/coreconfig.h
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/python/cpython/pull/12087/{{ revealButtonHref }}
https://github.com/python/cpython/pull/12087/files#diff-740d146b836af6b605c830215bc0268c33bd96a3e36a1b3edee2608e27cbde04
https://github.com/python/cpython/pull/12087/files#diff-740d146b836af6b605c830215bc0268c33bd96a3e36a1b3edee2608e27cbde04
https://github.com/python/cpython/pull/12087/files#diff-740d146b836af6b605c830215bc0268c33bd96a3e36a1b3edee2608e27cbde04
https://github.com/python/cpython/pull/12087/files#diff-740d146b836af6b605c830215bc0268c33bd96a3e36a1b3edee2608e27cbde04
https://github.com/python/cpython/pull/12087/files#diff-740d146b836af6b605c830215bc0268c33bd96a3e36a1b3edee2608e27cbde04
https://github.com/python/cpython/pull/12087/files#diff-740d146b836af6b605c830215bc0268c33bd96a3e36a1b3edee2608e27cbde04
https://github.com/python/cpython/pull/12087/files#diff-740d146b836af6b605c830215bc0268c33bd96a3e36a1b3edee2608e27cbde04
https://github.com/python/cpython/pull/12087/files#diff-740d146b836af6b605c830215bc0268c33bd96a3e36a1b3edee2608e27cbde04
https://github.com/python/cpython/pull/12087/files#diff-740d146b836af6b605c830215bc0268c33bd96a3e36a1b3edee2608e27cbde04
https://github.com/python/cpython/pull/12087/files#diff-740d146b836af6b605c830215bc0268c33bd96a3e36a1b3edee2608e27cbde04
Include/cpython/pylifecycle.hhttps://github.com/python/cpython/pull/12087/files#diff-0bf60487b94c5152e970cc86cbc5d8fcaa7e729628b15f3e83f3ad31406dcaee
View file https://github.com/python/cpython/blob/1eaeb4d5ae9cef53ca1e7e7ec80004a10cd54819/Include/cpython/pylifecycle.h
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/python/cpython/pull/12087/{{ revealButtonHref }}
https://github.com/python/cpython/pull/12087/files#diff-0bf60487b94c5152e970cc86cbc5d8fcaa7e729628b15f3e83f3ad31406dcaee
https://github.com/python/cpython/pull/12087/files#diff-0bf60487b94c5152e970cc86cbc5d8fcaa7e729628b15f3e83f3ad31406dcaee
https://github.com/python/cpython/pull/12087/files#diff-0bf60487b94c5152e970cc86cbc5d8fcaa7e729628b15f3e83f3ad31406dcaee
Include/cpython/pystate.hhttps://github.com/python/cpython/pull/12087/files#diff-fefbbf791abe2a1b6d9cab39778d388ebb9135eeefbd734e463aac75d1979e7f
View file https://github.com/python/cpython/blob/1eaeb4d5ae9cef53ca1e7e7ec80004a10cd54819/Include/cpython/pystate.h
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/python/cpython/pull/12087/{{ revealButtonHref }}
https://github.com/python/cpython/pull/12087/files#diff-fefbbf791abe2a1b6d9cab39778d388ebb9135eeefbd734e463aac75d1979e7f
https://github.com/python/cpython/pull/12087/files#diff-fefbbf791abe2a1b6d9cab39778d388ebb9135eeefbd734e463aac75d1979e7f
Include/fileobject.hhttps://github.com/python/cpython/pull/12087/files#diff-336d14274842d263183c593a593da61c8cf55f67ab8ba7663c91d0821121a88e
View file https://github.com/python/cpython/blob/1eaeb4d5ae9cef53ca1e7e7ec80004a10cd54819/Include/fileobject.h
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/python/cpython/pull/12087/{{ revealButtonHref }}
https://github.com/python/cpython/pull/12087/files#diff-336d14274842d263183c593a593da61c8cf55f67ab8ba7663c91d0821121a88e
https://github.com/python/cpython/pull/12087/files#diff-336d14274842d263183c593a593da61c8cf55f67ab8ba7663c91d0821121a88e
Please reload this pagehttps://github.com/python/cpython/pull/12087/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.