Merge branch 'main' into avm99963-monorail

Merged commit cd4b3b336f1f14afa02990fdc2eec5d9467a827e

GitOrigin-RevId: e67bbf185d5538e1472bb42e0abb2a141f88bac1
diff --git a/.vpython3 b/.vpython3
new file mode 100644
index 0000000..909a560
--- /dev/null
+++ b/.vpython3
@@ -0,0 +1,306 @@
+# This is a vpython "spec" file.
+#
+# Read more about `vpython` and how to modify this file here:
+#   https://chromium.googlesource.com/infra/infra/+/main/doc/users/vpython.md
+# List of available wheels:
+#   https://chromium.googlesource.com/infra/infra/+/main/infra/tools/dockerbuild/wheels.md
+
+python_version: "3.8"
+
+wheel: <
+  name: "infra/python/wheels/appengine-python-standard-py3"
+  version: "version:0.3.1"
+>
+
+wheel: <
+  name: "infra/python/wheels/flask-py2_py3"
+  version: "version:1.0.2"
+>
+
+wheel: <
+  name: "infra/python/wheels/google-api-python-client-py3"
+  version: "version:2.2.0"
+>
+
+wheel: <
+  name: "infra/python/wheels/google-auth-py2_py3"
+  version: "version:1.35.0"
+>
+
+wheel: <
+  name: "infra/python/wheels/google-cloud-logging-py3"
+  version: "version:3.0.0"
+>
+
+wheel: <
+  name: "infra/python/wheels/google-cloud-storage-py2_py3"
+  version: "version:1.41.1"
+>
+
+wheel: <
+  name: "infra/python/wheels/httplib2-py3"
+  version: "version:0.19.1"
+>
+
+wheel: <
+  name: "infra/python/wheels/oauth2client-py2_py3"
+  version: "version:4.1.3"
+>
+
+wheel: <
+ name: "infra/python/wheels/six-py2_py3"
+ version: "version:1.15.0"
+>
+
+# Required for testing only.
+wheel: <
+  name: "infra/python/wheels/pytest-py3"
+  version: "version:6.2.2"
+>
+
+# Required by appengine-python-standard==0.3.1
+wheel: <
+  name: "infra/python/wheels/attrs-py2_py3"
+  version: "version:21.4.0"
+>
+
+# Required by appengine-python-standard==0.3.1
+wheel: <
+  name: "infra/python/wheels/frozendict-py3"
+  version: "version:2.0.6"
+>
+
+# Required by appengine-python-standard==0.3.1
+wheel: <
+  name: "infra/python/wheels/mock-py3"
+  version: "version:4.0.3"
+>
+
+# Required by appengine-python-standard==0.3.1
+wheel: <
+  name: "infra/python/wheels/pillow/${vpython_platform}"
+  version: "version:8.3.1"
+>
+
+# Required by appengine-python-standard==0.3.1
+wheel: <
+  name: "infra/python/wheels/protobuf-py3"
+  version: "version:3.19.3"
+>
+
+# Required by appengine-python-standard==0.3.1
+wheel: <
+  name: "infra/python/wheels/pytz-py2_py3"
+  version: "version:2021.1"
+>
+
+# Required by appengine-python-standard==0.3.1
+wheel: <
+  name: "infra/python/wheels/ruamel_yaml-py3"
+  version: "version:0.17.16"
+>
+
+# Required by Flask==1.0.2
+wheel: <
+  name: "infra/python/wheels/click-py2_py3"
+  version: "version:7.0"
+>
+
+# Required by Flask==1.0.2
+wheel: <
+  name: "infra/python/wheels/itsdangerous-py2_py3"
+  version: "version:1.1.0"
+>
+
+# Required by Flask==1.0.2
+wheel: <
+  name: "infra/python/wheels/jinja2-py2_py3"
+  version: "version:2.10.1"
+>
+
+# Required by Flask==1.0.2
+wheel: <
+  name: "infra/python/wheels/werkzeug-py2_py3"
+  version: "version:1.0.1"
+>
+
+# Required by google-api-python-client==2.2.0 and
+# google-cloud-core==2.2.2 and google-cloud-logging==3.0.0
+wheel: <
+  name: "infra/python/wheels/google-api-core-py3"
+  version: "version:1.31.5"
+>
+
+# Required by google-api-python-client==2.2.0
+wheel: <
+  name: "infra/python/wheels/google-auth-py2_py3"
+  version: "version:1.35.0"
+>
+
+# Required by google-api-python-client==2.2.0
+wheel: <
+  name: "infra/python/wheels/google-auth-httplib2-py2_py3"
+  version: "version:0.1.0"
+>
+
+# Required by google-api-python-client==2.2.0
+wheel: <
+  name: "infra/python/wheels/uritemplate-py2_py3"
+  version: "version:3.0.0"
+>
+
+# Required by google-api-core==1.25.1
+wheel: <
+  name: "infra/python/wheels/googleapis-common-protos-py2_py3"
+  version: "version:1.52.0"
+>
+
+# Required by google-api-core==1.25.1
+wheel: <
+  name: "infra/python/wheels/requests-py2_py3"
+  version: "version:2.25.1"
+>
+
+# Required by google-auth==1.29.0
+wheel: <
+  name: "infra/python/wheels/cachetools-py3"
+  version: "version:4.2.1"
+>
+
+# Required by google-auth==1.29.0
+wheel: <
+  name: "infra/python/wheels/pyasn1_modules-py2_py3"
+  version: "version:0.2.8"
+>
+
+# Required by google-auth==1.29.0
+wheel: <
+  name: "infra/python/wheels/rsa-py3"
+  version: "version:4.7.2"
+>
+
+# Required by google-cloud-logging==3.0.0
+wheel: <
+  name: "infra/python/wheels/google-cloud-appengine-logging-py2_py3"
+  version: "version:1.1.1"
+>
+
+# Required by google-cloud-logging==3.0.0
+wheel: <
+  name: "infra/python/wheels/google-cloud-audit-log-py2_py3"
+  version: "version:0.2.0"
+>
+
+# Required by google-cloud-logging==3.0.0
+wheel: <
+  name: "infra/python/wheels/grpc-google-iam-v1-py3"
+  version: "version:0.12.3"
+>
+
+# Required by google-cloud-logging==3.0.0
+wheel: <
+  name: "infra/python/wheels/proto-plus-py3"
+  version: "version:1.20.3"
+>
+
+# Required by google-cloud-storage==1.41.1
+wheel: <
+  name: "infra/python/wheels/google-resumable-media-py3"
+  version: "version:2.2.1"
+>
+
+# Required by google-cloud-storage==1.41.1
+wheel: <
+  name: "infra/python/wheels/google-cloud-core-py3"
+  version: "version:2.2.2"
+>
+
+# Required by google-cloud-storage==1.41.1
+wheel: <
+  name: "infra/python/wheels/google-crc32c/${vpython_platform}"
+  version: "version:1.3.0"
+>
+
+# Required by grpc-google-iam-v1==0.12.3
+wheel: <
+  name: "infra/python/wheels/grpcio/${vpython_platform}"
+  version: "version:1.44.0"
+>
+
+# Required by httplib2==0.19.1
+wheel: <
+  name: "infra/python/wheels/pyparsing-py2_py3"
+  version: "version:2.4.7"
+>
+
+# Required by Jinja2==2.10.1
+wheel: <
+  name: "infra/python/wheels/markupsafe/${vpython_platform}"
+  version: "version:1.1.1"
+>
+
+# Required by oauth2client==4.1.3
+wheel: <
+  name: "infra/python/wheels/pyasn1-py2_py3"
+  version: "version:0.4.8"
+>
+
+# Required by pytest==6.2.2
+wheel: <
+  name: "infra/python/wheels/iniconfig-py3"
+  version: "version:1.1.1"
+>
+
+# Required by pytest==6.2.2
+wheel: <
+  name: "infra/python/wheels/packaging-py2_py3"
+  version: "version:16.8"
+>
+
+# Required by pytest==6.2.2
+wheel: <
+  name: "infra/python/wheels/pluggy-py3"
+  version: "version:0.13.1"
+>
+
+# Required by pytest==6.2.2
+wheel: <
+  name: "infra/python/wheels/py-py2_py3"
+  version: "version:1.10.0"
+>
+
+# Required by pytest==6.2.2
+wheel: <
+  name: "infra/python/wheels/toml-py3"
+  version: "version:0.10.1"
+>
+
+# Required by requests==2.25.1
+wheel: <
+  name: "infra/python/wheels/certifi-py2_py3"
+  version: "version:2020.12.5"
+>
+
+# Required by requests==2.25.1
+wheel: <
+  name: "infra/python/wheels/chardet-py2_py3"
+  version: "version:4.0.0"
+>
+
+# Required by requests==2.25.1
+wheel: <
+  name: "infra/python/wheels/idna-py2_py3"
+  version: "version:2.8"
+>
+
+# Required by requests==2.25.1
+wheel: <
+  name: "infra/python/wheels/urllib3-py2_py3"
+  version: "version:1.26.4"
+>
+
+# Required by ruamel.yaml==0.17.16
+wheel: <
+  name: "infra/python/wheels/ruamel_yaml_clib/${vpython_platform}"
+  version: "version:0.2.6"
+>