Coverage for fastapi/applications.py: 100%
169 statements
« prev ^ index » next coverage.py v7.6.1, created at 2025-09-29 03:37 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2025-09-29 03:37 +0000
1from enum import Enum 1abcdef
2from typing import ( 1abcdef
3 Any,
4 Awaitable,
5 Callable,
6 Coroutine,
7 Dict,
8 List,
9 Optional,
10 Sequence,
11 Type,
12 TypeVar,
13 Union,
14)
16from fastapi import routing 1abcdef
17from fastapi.datastructures import Default, DefaultPlaceholder 1abcdef
18from fastapi.exception_handlers import ( 1abcdef
19 http_exception_handler,
20 request_validation_exception_handler,
21 websocket_request_validation_exception_handler,
22)
23from fastapi.exceptions import RequestValidationError, WebSocketRequestValidationError 1abcdef
24from fastapi.logger import logger 1abcdef
25from fastapi.middleware.asyncexitstack import AsyncExitStackMiddleware 1abcdef
26from fastapi.openapi.docs import ( 1abcdef
27 get_redoc_html,
28 get_swagger_ui_html,
29 get_swagger_ui_oauth2_redirect_html,
30)
31from fastapi.openapi.utils import get_openapi 1abcdef
32from fastapi.params import Depends 1abcdef
33from fastapi.types import DecoratedCallable, IncEx 1abcdef
34from fastapi.utils import generate_unique_id 1abcdef
35from starlette.applications import Starlette 1abcdef
36from starlette.datastructures import State 1abcdef
37from starlette.exceptions import HTTPException 1abcdef
38from starlette.middleware import Middleware 1abcdef
39from starlette.middleware.base import BaseHTTPMiddleware 1abcdef
40from starlette.middleware.errors import ServerErrorMiddleware 1abcdef
41from starlette.middleware.exceptions import ExceptionMiddleware 1abcdef
42from starlette.requests import Request 1abcdef
43from starlette.responses import HTMLResponse, JSONResponse, Response 1abcdef
44from starlette.routing import BaseRoute 1abcdef
45from starlette.types import ASGIApp, ExceptionHandler, Lifespan, Receive, Scope, Send 1abcdef
46from typing_extensions import Annotated, Doc, deprecated 1abcdef
48AppType = TypeVar("AppType", bound="FastAPI") 1abcdef
51class FastAPI(Starlette): 1abcdef
52 """
53 `FastAPI` app class, the main entrypoint to use FastAPI.
55 Read more in the
56 [FastAPI docs for First Steps](https://fastapi.tiangolo.com/tutorial/first-steps/).
58 ## Example
60 ```python
61 from fastapi import FastAPI
63 app = FastAPI()
64 ```
65 """
67 def __init__( 1abcdef
68 self: AppType,
69 *,
70 debug: Annotated[
71 bool,
72 Doc(
73 """
74 Boolean indicating if debug tracebacks should be returned on server
75 errors.
77 Read more in the
78 [Starlette docs for Applications](https://www.starlette.io/applications/#instantiating-the-application).
79 """
80 ),
81 ] = False,
82 routes: Annotated[
83 Optional[List[BaseRoute]],
84 Doc(
85 """
86 **Note**: you probably shouldn't use this parameter, it is inherited
87 from Starlette and supported for compatibility.
89 ---
91 A list of routes to serve incoming HTTP and WebSocket requests.
92 """
93 ),
94 deprecated(
95 """
96 You normally wouldn't use this parameter with FastAPI, it is inherited
97 from Starlette and supported for compatibility.
99 In FastAPI, you normally would use the *path operation methods*,
100 like `app.get()`, `app.post()`, etc.
101 """
102 ),
103 ] = None,
104 title: Annotated[
105 str,
106 Doc(
107 """
108 The title of the API.
110 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
112 Read more in the
113 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api).
115 **Example**
117 ```python
118 from fastapi import FastAPI
120 app = FastAPI(title="ChimichangApp")
121 ```
122 """
123 ),
124 ] = "FastAPI",
125 summary: Annotated[
126 Optional[str],
127 Doc(
128 """
129 A short summary of the API.
131 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
133 Read more in the
134 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api).
136 **Example**
138 ```python
139 from fastapi import FastAPI
141 app = FastAPI(summary="Deadpond's favorite app. Nuff said.")
142 ```
143 """
144 ),
145 ] = None,
146 description: Annotated[
147 str,
148 Doc(
149 '''
150 A description of the API. Supports Markdown (using
151 [CommonMark syntax](https://commonmark.org/)).
153 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
155 Read more in the
156 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api).
158 **Example**
160 ```python
161 from fastapi import FastAPI
163 app = FastAPI(
164 description="""
165 ChimichangApp API helps you do awesome stuff. 🚀
167 ## Items
169 You can **read items**.
171 ## Users
173 You will be able to:
175 * **Create users** (_not implemented_).
176 * **Read users** (_not implemented_).
178 """
179 )
180 ```
181 '''
182 ),
183 ] = "",
184 version: Annotated[
185 str,
186 Doc(
187 """
188 The version of the API.
190 **Note** This is the version of your application, not the version of
191 the OpenAPI specification nor the version of FastAPI being used.
193 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
195 Read more in the
196 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api).
198 **Example**
200 ```python
201 from fastapi import FastAPI
203 app = FastAPI(version="0.0.1")
204 ```
205 """
206 ),
207 ] = "0.1.0",
208 openapi_url: Annotated[
209 Optional[str],
210 Doc(
211 """
212 The URL where the OpenAPI schema will be served from.
214 If you set it to `None`, no OpenAPI schema will be served publicly, and
215 the default automatic endpoints `/docs` and `/redoc` will also be
216 disabled.
218 Read more in the
219 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#openapi-url).
221 **Example**
223 ```python
224 from fastapi import FastAPI
226 app = FastAPI(openapi_url="/api/v1/openapi.json")
227 ```
228 """
229 ),
230 ] = "/openapi.json",
231 openapi_tags: Annotated[
232 Optional[List[Dict[str, Any]]],
233 Doc(
234 """
235 A list of tags used by OpenAPI, these are the same `tags` you can set
236 in the *path operations*, like:
238 * `@app.get("/users/", tags=["users"])`
239 * `@app.get("/items/", tags=["items"])`
241 The order of the tags can be used to specify the order shown in
242 tools like Swagger UI, used in the automatic path `/docs`.
244 It's not required to specify all the tags used.
246 The tags that are not declared MAY be organized randomly or based
247 on the tools' logic. Each tag name in the list MUST be unique.
249 The value of each item is a `dict` containing:
251 * `name`: The name of the tag.
252 * `description`: A short description of the tag.
253 [CommonMark syntax](https://commonmark.org/) MAY be used for rich
254 text representation.
255 * `externalDocs`: Additional external documentation for this tag. If
256 provided, it would contain a `dict` with:
257 * `description`: A short description of the target documentation.
258 [CommonMark syntax](https://commonmark.org/) MAY be used for
259 rich text representation.
260 * `url`: The URL for the target documentation. Value MUST be in
261 the form of a URL.
263 Read more in the
264 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-tags).
266 **Example**
268 ```python
269 from fastapi import FastAPI
271 tags_metadata = [
272 {
273 "name": "users",
274 "description": "Operations with users. The **login** logic is also here.",
275 },
276 {
277 "name": "items",
278 "description": "Manage items. So _fancy_ they have their own docs.",
279 "externalDocs": {
280 "description": "Items external docs",
281 "url": "https://fastapi.tiangolo.com/",
282 },
283 },
284 ]
286 app = FastAPI(openapi_tags=tags_metadata)
287 ```
288 """
289 ),
290 ] = None,
291 servers: Annotated[
292 Optional[List[Dict[str, Union[str, Any]]]],
293 Doc(
294 """
295 A `list` of `dict`s with connectivity information to a target server.
297 You would use it, for example, if your application is served from
298 different domains and you want to use the same Swagger UI in the
299 browser to interact with each of them (instead of having multiple
300 browser tabs open). Or if you want to leave fixed the possible URLs.
302 If the servers `list` is not provided, or is an empty `list`, the
303 default value would be a `dict` with a `url` value of `/`.
305 Each item in the `list` is a `dict` containing:
307 * `url`: A URL to the target host. This URL supports Server Variables
308 and MAY be relative, to indicate that the host location is relative
309 to the location where the OpenAPI document is being served. Variable
310 substitutions will be made when a variable is named in `{`brackets`}`.
311 * `description`: An optional string describing the host designated by
312 the URL. [CommonMark syntax](https://commonmark.org/) MAY be used for
313 rich text representation.
314 * `variables`: A `dict` between a variable name and its value. The value
315 is used for substitution in the server's URL template.
317 Read more in the
318 [FastAPI docs for Behind a Proxy](https://fastapi.tiangolo.com/advanced/behind-a-proxy/#additional-servers).
320 **Example**
322 ```python
323 from fastapi import FastAPI
325 app = FastAPI(
326 servers=[
327 {"url": "https://stag.example.com", "description": "Staging environment"},
328 {"url": "https://prod.example.com", "description": "Production environment"},
329 ]
330 )
331 ```
332 """
333 ),
334 ] = None,
335 dependencies: Annotated[
336 Optional[Sequence[Depends]],
337 Doc(
338 """
339 A list of global dependencies, they will be applied to each
340 *path operation*, including in sub-routers.
342 Read more about it in the
343 [FastAPI docs for Global Dependencies](https://fastapi.tiangolo.com/tutorial/dependencies/global-dependencies/).
345 **Example**
347 ```python
348 from fastapi import Depends, FastAPI
350 from .dependencies import func_dep_1, func_dep_2
352 app = FastAPI(dependencies=[Depends(func_dep_1), Depends(func_dep_2)])
353 ```
354 """
355 ),
356 ] = None,
357 default_response_class: Annotated[
358 Type[Response],
359 Doc(
360 """
361 The default response class to be used.
363 Read more in the
364 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#default-response-class).
366 **Example**
368 ```python
369 from fastapi import FastAPI
370 from fastapi.responses import ORJSONResponse
372 app = FastAPI(default_response_class=ORJSONResponse)
373 ```
374 """
375 ),
376 ] = Default(JSONResponse),
377 redirect_slashes: Annotated[
378 bool,
379 Doc(
380 """
381 Whether to detect and redirect slashes in URLs when the client doesn't
382 use the same format.
384 **Example**
386 ```python
387 from fastapi import FastAPI
389 app = FastAPI(redirect_slashes=True) # the default
391 @app.get("/items/")
392 async def read_items():
393 return [{"item_id": "Foo"}]
394 ```
396 With this app, if a client goes to `/items` (without a trailing slash),
397 they will be automatically redirected with an HTTP status code of 307
398 to `/items/`.
399 """
400 ),
401 ] = True,
402 docs_url: Annotated[
403 Optional[str],
404 Doc(
405 """
406 The path to the automatic interactive API documentation.
407 It is handled in the browser by Swagger UI.
409 The default URL is `/docs`. You can disable it by setting it to `None`.
411 If `openapi_url` is set to `None`, this will be automatically disabled.
413 Read more in the
414 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#docs-urls).
416 **Example**
418 ```python
419 from fastapi import FastAPI
421 app = FastAPI(docs_url="/documentation", redoc_url=None)
422 ```
423 """
424 ),
425 ] = "/docs",
426 redoc_url: Annotated[
427 Optional[str],
428 Doc(
429 """
430 The path to the alternative automatic interactive API documentation
431 provided by ReDoc.
433 The default URL is `/redoc`. You can disable it by setting it to `None`.
435 If `openapi_url` is set to `None`, this will be automatically disabled.
437 Read more in the
438 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#docs-urls).
440 **Example**
442 ```python
443 from fastapi import FastAPI
445 app = FastAPI(docs_url="/documentation", redoc_url="redocumentation")
446 ```
447 """
448 ),
449 ] = "/redoc",
450 swagger_ui_oauth2_redirect_url: Annotated[
451 Optional[str],
452 Doc(
453 """
454 The OAuth2 redirect endpoint for the Swagger UI.
456 By default it is `/docs/oauth2-redirect`.
458 This is only used if you use OAuth2 (with the "Authorize" button)
459 with Swagger UI.
460 """
461 ),
462 ] = "/docs/oauth2-redirect",
463 swagger_ui_init_oauth: Annotated[
464 Optional[Dict[str, Any]],
465 Doc(
466 """
467 OAuth2 configuration for the Swagger UI, by default shown at `/docs`.
469 Read more about the available configuration options in the
470 [Swagger UI docs](https://swagger.io/docs/open-source-tools/swagger-ui/usage/oauth2/).
471 """
472 ),
473 ] = None,
474 middleware: Annotated[
475 Optional[Sequence[Middleware]],
476 Doc(
477 """
478 List of middleware to be added when creating the application.
480 In FastAPI you would normally do this with `app.add_middleware()`
481 instead.
483 Read more in the
484 [FastAPI docs for Middleware](https://fastapi.tiangolo.com/tutorial/middleware/).
485 """
486 ),
487 ] = None,
488 exception_handlers: Annotated[
489 Optional[
490 Dict[
491 Union[int, Type[Exception]],
492 Callable[[Request, Any], Coroutine[Any, Any, Response]],
493 ]
494 ],
495 Doc(
496 """
497 A dictionary with handlers for exceptions.
499 In FastAPI, you would normally use the decorator
500 `@app.exception_handler()`.
502 Read more in the
503 [FastAPI docs for Handling Errors](https://fastapi.tiangolo.com/tutorial/handling-errors/).
504 """
505 ),
506 ] = None,
507 on_startup: Annotated[
508 Optional[Sequence[Callable[[], Any]]],
509 Doc(
510 """
511 A list of startup event handler functions.
513 You should instead use the `lifespan` handlers.
515 Read more in the [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/).
516 """
517 ),
518 ] = None,
519 on_shutdown: Annotated[
520 Optional[Sequence[Callable[[], Any]]],
521 Doc(
522 """
523 A list of shutdown event handler functions.
525 You should instead use the `lifespan` handlers.
527 Read more in the
528 [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/).
529 """
530 ),
531 ] = None,
532 lifespan: Annotated[
533 Optional[Lifespan[AppType]],
534 Doc(
535 """
536 A `Lifespan` context manager handler. This replaces `startup` and
537 `shutdown` functions with a single context manager.
539 Read more in the
540 [FastAPI docs for `lifespan`](https://fastapi.tiangolo.com/advanced/events/).
541 """
542 ),
543 ] = None,
544 terms_of_service: Annotated[
545 Optional[str],
546 Doc(
547 """
548 A URL to the Terms of Service for your API.
550 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
552 Read more at the
553 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api).
555 **Example**
557 ```python
558 app = FastAPI(terms_of_service="http://example.com/terms/")
559 ```
560 """
561 ),
562 ] = None,
563 contact: Annotated[
564 Optional[Dict[str, Union[str, Any]]],
565 Doc(
566 """
567 A dictionary with the contact information for the exposed API.
569 It can contain several fields.
571 * `name`: (`str`) The name of the contact person/organization.
572 * `url`: (`str`) A URL pointing to the contact information. MUST be in
573 the format of a URL.
574 * `email`: (`str`) The email address of the contact person/organization.
575 MUST be in the format of an email address.
577 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
579 Read more at the
580 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api).
582 **Example**
584 ```python
585 app = FastAPI(
586 contact={
587 "name": "Deadpoolio the Amazing",
588 "url": "http://x-force.example.com/contact/",
589 "email": "dp@x-force.example.com",
590 }
591 )
592 ```
593 """
594 ),
595 ] = None,
596 license_info: Annotated[
597 Optional[Dict[str, Union[str, Any]]],
598 Doc(
599 """
600 A dictionary with the license information for the exposed API.
602 It can contain several fields.
604 * `name`: (`str`) **REQUIRED** (if a `license_info` is set). The
605 license name used for the API.
606 * `identifier`: (`str`) An [SPDX](https://spdx.dev/) license expression
607 for the API. The `identifier` field is mutually exclusive of the `url`
608 field. Available since OpenAPI 3.1.0, FastAPI 0.99.0.
609 * `url`: (`str`) A URL to the license used for the API. This MUST be
610 the format of a URL.
612 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
614 Read more at the
615 [FastAPI docs for Metadata and Docs URLs](https://fastapi.tiangolo.com/tutorial/metadata/#metadata-for-api).
617 **Example**
619 ```python
620 app = FastAPI(
621 license_info={
622 "name": "Apache 2.0",
623 "url": "https://www.apache.org/licenses/LICENSE-2.0.html",
624 }
625 )
626 ```
627 """
628 ),
629 ] = None,
630 openapi_prefix: Annotated[
631 str,
632 Doc(
633 """
634 A URL prefix for the OpenAPI URL.
635 """
636 ),
637 deprecated(
638 """
639 "openapi_prefix" has been deprecated in favor of "root_path", which
640 follows more closely the ASGI standard, is simpler, and more
641 automatic.
642 """
643 ),
644 ] = "",
645 root_path: Annotated[
646 str,
647 Doc(
648 """
649 A path prefix handled by a proxy that is not seen by the application
650 but is seen by external clients, which affects things like Swagger UI.
652 Read more about it at the
653 [FastAPI docs for Behind a Proxy](https://fastapi.tiangolo.com/advanced/behind-a-proxy/).
655 **Example**
657 ```python
658 from fastapi import FastAPI
660 app = FastAPI(root_path="/api/v1")
661 ```
662 """
663 ),
664 ] = "",
665 root_path_in_servers: Annotated[
666 bool,
667 Doc(
668 """
669 To disable automatically generating the URLs in the `servers` field
670 in the autogenerated OpenAPI using the `root_path`.
672 Read more about it in the
673 [FastAPI docs for Behind a Proxy](https://fastapi.tiangolo.com/advanced/behind-a-proxy/#disable-automatic-server-from-root_path).
675 **Example**
677 ```python
678 from fastapi import FastAPI
680 app = FastAPI(root_path_in_servers=False)
681 ```
682 """
683 ),
684 ] = True,
685 responses: Annotated[
686 Optional[Dict[Union[int, str], Dict[str, Any]]],
687 Doc(
688 """
689 Additional responses to be shown in OpenAPI.
691 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
693 Read more about it in the
694 [FastAPI docs for Additional Responses in OpenAPI](https://fastapi.tiangolo.com/advanced/additional-responses/).
696 And in the
697 [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies).
698 """
699 ),
700 ] = None,
701 callbacks: Annotated[
702 Optional[List[BaseRoute]],
703 Doc(
704 """
705 OpenAPI callbacks that should apply to all *path operations*.
707 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
709 Read more about it in the
710 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
711 """
712 ),
713 ] = None,
714 webhooks: Annotated[
715 Optional[routing.APIRouter],
716 Doc(
717 """
718 Add OpenAPI webhooks. This is similar to `callbacks` but it doesn't
719 depend on specific *path operations*.
721 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
723 **Note**: This is available since OpenAPI 3.1.0, FastAPI 0.99.0.
725 Read more about it in the
726 [FastAPI docs for OpenAPI Webhooks](https://fastapi.tiangolo.com/advanced/openapi-webhooks/).
727 """
728 ),
729 ] = None,
730 deprecated: Annotated[
731 Optional[bool],
732 Doc(
733 """
734 Mark all *path operations* as deprecated. You probably don't need it,
735 but it's available.
737 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
739 Read more about it in the
740 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
741 """
742 ),
743 ] = None,
744 include_in_schema: Annotated[
745 bool,
746 Doc(
747 """
748 To include (or not) all the *path operations* in the generated OpenAPI.
749 You probably don't need it, but it's available.
751 This affects the generated OpenAPI (e.g. visible at `/docs`).
753 Read more about it in the
754 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
755 """
756 ),
757 ] = True,
758 swagger_ui_parameters: Annotated[
759 Optional[Dict[str, Any]],
760 Doc(
761 """
762 Parameters to configure Swagger UI, the autogenerated interactive API
763 documentation (by default at `/docs`).
765 Read more about it in the
766 [FastAPI docs about how to Configure Swagger UI](https://fastapi.tiangolo.com/how-to/configure-swagger-ui/).
767 """
768 ),
769 ] = None,
770 generate_unique_id_function: Annotated[
771 Callable[[routing.APIRoute], str],
772 Doc(
773 """
774 Customize the function used to generate unique IDs for the *path
775 operations* shown in the generated OpenAPI.
777 This is particularly useful when automatically generating clients or
778 SDKs for your API.
780 Read more about it in the
781 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
782 """
783 ),
784 ] = Default(generate_unique_id),
785 separate_input_output_schemas: Annotated[
786 bool,
787 Doc(
788 """
789 Whether to generate separate OpenAPI schemas for request body and
790 response body when the results would be more precise.
792 This is particularly useful when automatically generating clients.
794 For example, if you have a model like:
796 ```python
797 from pydantic import BaseModel
799 class Item(BaseModel):
800 name: str
801 tags: list[str] = []
802 ```
804 When `Item` is used for input, a request body, `tags` is not required,
805 the client doesn't have to provide it.
807 But when using `Item` for output, for a response body, `tags` is always
808 available because it has a default value, even if it's just an empty
809 list. So, the client should be able to always expect it.
811 In this case, there would be two different schemas, one for input and
812 another one for output.
813 """
814 ),
815 ] = True,
816 openapi_external_docs: Annotated[
817 Optional[Dict[str, Any]],
818 Doc(
819 """
820 This field allows you to provide additional external documentation links.
821 If provided, it must be a dictionary containing:
823 * `description`: A brief description of the external documentation.
824 * `url`: The URL pointing to the external documentation. The value **MUST**
825 be a valid URL format.
827 **Example**:
829 ```python
830 from fastapi import FastAPI
832 external_docs = {
833 "description": "Detailed API Reference",
834 "url": "https://example.com/api-docs",
835 }
837 app = FastAPI(openapi_external_docs=external_docs)
838 ```
839 """
840 ),
841 ] = None,
842 **extra: Annotated[
843 Any,
844 Doc(
845 """
846 Extra keyword arguments to be stored in the app, not used by FastAPI
847 anywhere.
848 """
849 ),
850 ],
851 ) -> None:
852 self.debug = debug 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
853 self.title = title 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
854 self.summary = summary 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
855 self.description = description 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
856 self.version = version 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
857 self.terms_of_service = terms_of_service 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
858 self.contact = contact 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
859 self.license_info = license_info 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
860 self.openapi_url = openapi_url 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
861 self.openapi_tags = openapi_tags 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
862 self.root_path_in_servers = root_path_in_servers 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
863 self.docs_url = docs_url 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
864 self.redoc_url = redoc_url 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
865 self.swagger_ui_oauth2_redirect_url = swagger_ui_oauth2_redirect_url 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
866 self.swagger_ui_init_oauth = swagger_ui_init_oauth 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
867 self.swagger_ui_parameters = swagger_ui_parameters 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
868 self.servers = servers or [] 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
869 self.separate_input_output_schemas = separate_input_output_schemas 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
870 self.openapi_external_docs = openapi_external_docs 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
871 self.extra = extra 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
872 self.openapi_version: Annotated[ 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
873 str,
874 Doc(
875 """
876 The version string of OpenAPI.
878 FastAPI will generate OpenAPI version 3.1.0, and will output that as
879 the OpenAPI version. But some tools, even though they might be
880 compatible with OpenAPI 3.1.0, might not recognize it as a valid.
882 So you could override this value to trick those tools into using
883 the generated OpenAPI. Have in mind that this is a hack. But if you
884 avoid using features added in OpenAPI 3.1.0, it might work for your
885 use case.
887 This is not passed as a parameter to the `FastAPI` class to avoid
888 giving the false idea that FastAPI would generate a different OpenAPI
889 schema. It is only available as an attribute.
891 **Example**
893 ```python
894 from fastapi import FastAPI
896 app = FastAPI()
898 app.openapi_version = "3.0.2"
899 ```
900 """
901 ),
902 ] = "3.1.0"
903 self.openapi_schema: Optional[Dict[str, Any]] = None 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
904 if self.openapi_url: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
905 assert self.title, "A title must be provided for OpenAPI, e.g.: 'My API'" 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd
906 assert self.version, "A version must be provided for OpenAPI, e.g.: '2.1.0'" 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd
907 # TODO: remove when discarding the openapi_prefix parameter
908 if openapi_prefix: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
909 logger.warning( 1abcdef
910 '"openapi_prefix" has been deprecated in favor of "root_path", which '
911 "follows more closely the ASGI standard, is simpler, and more "
912 "automatic. Check the docs at "
913 "https://fastapi.tiangolo.com/advanced/sub-applications/"
914 )
915 self.webhooks: Annotated[ 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
916 routing.APIRouter,
917 Doc(
918 """
919 The `app.webhooks` attribute is an `APIRouter` with the *path
920 operations* that will be used just for documentation of webhooks.
922 Read more about it in the
923 [FastAPI docs for OpenAPI Webhooks](https://fastapi.tiangolo.com/advanced/openapi-webhooks/).
924 """
925 ),
926 ] = webhooks or routing.APIRouter()
927 self.root_path = root_path or openapi_prefix 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
928 self.state: Annotated[ 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
929 State,
930 Doc(
931 """
932 A state object for the application. This is the same object for the
933 entire application, it doesn't change from request to request.
935 You normally wouldn't use this in FastAPI, for most of the cases you
936 would instead use FastAPI dependencies.
938 This is simply inherited from Starlette.
940 Read more about it in the
941 [Starlette docs for Applications](https://www.starlette.io/applications/#storing-state-on-the-app-instance).
942 """
943 ),
944 ] = State()
945 self.dependency_overrides: Annotated[ 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
946 Dict[Callable[..., Any], Callable[..., Any]],
947 Doc(
948 """
949 A dictionary with overrides for the dependencies.
951 Each key is the original dependency callable, and the value is the
952 actual dependency that should be called.
954 This is for testing, to replace expensive dependencies with testing
955 versions.
957 Read more about it in the
958 [FastAPI docs for Testing Dependencies with Overrides](https://fastapi.tiangolo.com/advanced/testing-dependencies/).
959 """
960 ),
961 ] = {}
962 self.router: routing.APIRouter = routing.APIRouter( 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
963 routes=routes,
964 redirect_slashes=redirect_slashes,
965 dependency_overrides_provider=self,
966 on_startup=on_startup,
967 on_shutdown=on_shutdown,
968 lifespan=lifespan,
969 default_response_class=default_response_class,
970 dependencies=dependencies,
971 callbacks=callbacks,
972 deprecated=deprecated,
973 include_in_schema=include_in_schema,
974 responses=responses,
975 generate_unique_id_function=generate_unique_id_function,
976 )
977 self.exception_handlers: Dict[ 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
978 Any, Callable[[Request, Any], Union[Response, Awaitable[Response]]]
979 ] = {} if exception_handlers is None else dict(exception_handlers)
980 self.exception_handlers.setdefault(HTTPException, http_exception_handler) 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
981 self.exception_handlers.setdefault( 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
982 RequestValidationError, request_validation_exception_handler
983 )
984 self.exception_handlers.setdefault( 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
985 WebSocketRequestValidationError,
986 # Starlette still has incorrect type specification for the handlers
987 websocket_request_validation_exception_handler, # type: ignore
988 )
990 self.user_middleware: List[Middleware] = ( 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
991 [] if middleware is None else list(middleware)
992 )
993 self.middleware_stack: Union[ASGIApp, None] = None 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
994 self.setup() 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
996 def build_middleware_stack(self) -> ASGIApp: 1abcdef
997 # Duplicate/override from Starlette to add AsyncExitStackMiddleware
998 # inside of ExceptionMiddleware, inside of custom user middlewares
999 debug = self.debug 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd
1000 error_handler = None 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd
1001 exception_handlers: dict[Any, ExceptionHandler] = {} 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd
1003 for key, value in self.exception_handlers.items(): 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd
1004 if key in (500, Exception): 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd
1005 error_handler = value 2dhjhphvhBhHh
1006 else:
1007 exception_handlers[key] = value 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd
1009 middleware = ( 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd
1010 [Middleware(ServerErrorMiddleware, handler=error_handler, debug=debug)]
1011 + self.user_middleware
1012 + [
1013 Middleware(
1014 ExceptionMiddleware, handlers=exception_handlers, debug=debug
1015 ),
1016 # Add FastAPI-specific AsyncExitStackMiddleware for closing files.
1017 # Before this was also used for closing dependencies with yield but
1018 # those now have their own AsyncExitStack, to properly support
1019 # streaming responses while keeping compatibility with the previous
1020 # versions (as of writing 0.117.1) that allowed doing
1021 # except HTTPException inside a dependency with yield.
1022 # This needs to happen after user middlewares because those create a
1023 # new contextvars context copy by using a new AnyIO task group.
1024 # This AsyncExitStack preserves the context for contextvars, not
1025 # strictly necessary for closing files but it was one of the original
1026 # intentions.
1027 # If the AsyncExitStack lived outside of the custom middlewares and
1028 # contextvars were set, for example in a dependency with 'yield'
1029 # in that internal contextvars context, the values would not be
1030 # available in the outer context of the AsyncExitStack.
1031 # By placing the middleware and the AsyncExitStack here, inside all
1032 # user middlewares, the same context is used.
1033 # This is currently not needed, only for closing files, but used to be
1034 # important when dependencies with yield were closed here.
1035 Middleware(AsyncExitStackMiddleware),
1036 ]
1037 )
1039 app = self.router 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd
1040 for cls, args, kwargs in reversed(middleware): 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd
1041 app = cls(app, *args, **kwargs) 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd
1042 return app 2a LhMhNhOhPhQhRhShWgPfQfRfSfThUhbhVhTbUbWhXhVbWbYhTfZh0hUfXgXbYbZb1h2h3h4h5h6h7h8h9h!h#h$h%hch'h(hVfdh)h*h+h,hWf-h.h/h:hm ' n o p q r ( ;hXf=h?h@h[h]h0b1b^h_h`h`g{hYf|h}hdbebfbs t gb~haibiciZfdi2b3bei0ffigi1fhiiiji2fkiliminioipiqi4bri5b6b7b| hb8bsi9b!bibu tiuiviwixiyiziAiBiCiDiEiFiGiHiIiJiKiLiMiNiOiPiQiRiSiTiUiViWiXiYiZi0i1i2i3i4iYg5i6i7i8i9i!i#i$i%i'i(i)i*iehfhgh+i,i-i.i/i:i;ig 8d#bZg0g1g=i?i@i[i]i^i_i`i{i|i}i~iajbjcjdjejfjgjhjijjjkjljmjnjojpjqjrjsjtjujvjwjxjyjzjAjBjCjDjEjFjGjHjIjJjKjLjMjNjOjPjQjRjSjTjUjVjWjXjYjZj0j1j2j3j4j5j6j7j8j9j!j#j$j%j'j(j)j*j+j,j-j.j/j:j;j=j?j@j[j]j^j_j`j{j|j}j~jakbkckdkekfkgkhkikjkkklkmk3fJf$bnkjbokpkqkrksktkukvkwkxkyk4fzkAk%b'b(bb BkCkDkEkFkGkHkIk2g5f6f7f8fJkKkhhLk)b*bMkNk+b,bOk9fPkQk!f3g-b.b/bRkSkTkUkVkWkXkYkZk0k1k2k3kih4k5k#fjh6k7k8k9k$f!k#k$k%kv ) w x y z A * 'k%f(k)k*k+k,k:b;b-k.k/k{g:k'f;k=kkblbmbB C nb?k@k[k]k(f^k=b?b_k)f`k{k*f|k}k~k+falblcldlelflgl@bhl[b]b^b} ob_bil`b{bpbD jlklllmlnlolplqlrlsltlulvlwlxlylzlAlBlClDlElFlGlHlIlJlKlLlMlNlOlPlQlRlSlTlUl4gVlWlXlYlZl0l1l2l3l4l5l6l7lkhlhmh8l9l!l#l$l%l'lh be|b5g6g7g(l)l*l+l,l-l.l/l:l;l=l?l@l[l]l^l_l`l{l|l}l~lambmcmdmemfmgmhmimjmkmlmmmnmompmqmrmsmtmumvmwmxmymzmAmBmCmDmEmFmGmHmImJmKmLmMmNmOmPmQmRmSmTmUmVmWmXmYmZm0m1m2m3m4m5m6m7m8m9m!m#m$m%m'm(m)m*m+m,m-m.m/m:m;m=m?m@m[m]m^m_m`m{m|m}m~manbncn,fKf}bdnqbenfngnhninjnknlnmnnnonpn-fqnrn~bacbcc sntnunvnwnxnynzn8g.f/f:f;fAnBnnhCnccdcDnEnecfcFn=fGnHn?f9ggchcicInJnKnLnMnNnOnPnQnRnSnTnUnohVnWn@fphXnYnZn0n[f1n2n3n4nE + F G H I J , 5n]f6n7n8n9n!njckc#n$n%n|g'n^f(n)nrbsbtbK L ub*n+n,n-n_f.nlcmcnc- ocpc. qcrcsc/n`f:n;n{f=n?n@n|f[n]n^n_n`n{n|ntc}nucvcwc~ vbxc~nyczcwbM aobocodoeofogohoiojokolomonooopoqorosotouovowoxoyozoAoBoCoDoEoFoGoHoIoJoKoLo!gMoNoOoPoQoRoSoToUoVoWoXoYoqhrhshZo0o1o2o3o4o5oi FeAc#g$g%g6o7o8o9o!o#o$o%o'o(o)o*o+o,o-o.o/o:o;o=o?o@o[o]o^o_o`o{o|o}o~oapbpcpdpepfpgphpipjpkplpmpnpopppqprpsptpupvpwpxpypzpApBpCpDpEpFpGpHpIpJpKpLpMpNpOpPpQpRpSpTpUpVpWpXpYpZp0p1p2p3p4p5p6p7p8p9p!p#p$p%p'p(p)p*p+p,p-p.p/p:p;p=p?p@p[p]p^p}fLfBc_pxb`p{p|p}p~paqCcbqcqdqeqfqgq~fhqiqDcEcFcd jqkqlqmqnqoqpqqq'gagbgcgdgrqsqthtqGcHcuqvqIcJcwqegxqyqfg(gKcLcMczqAqBqCqDqEqFqGqHqIqJqKqLquhMqNqggvhOqPqQqRqhgSqTqUqVqN / O P Q R S : WqigXqYqZq0q1qNcOc2q3q4q}g5qjg6q7qybzbAbT U Bb8q9q!q#qkg$qPcQcRc; ScTc= UcVcWc%qlg'q(qmg)q*q+qng,q-q.q/q:q;q=qXc?qYcZc0cabCb1c@q2c3cDbV [q]q^q_q`q{q|q}q~qarbrcrdrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryrzrArBrCr)gDrErFrGrHrIrJrKrLrMrNrOrPrwhxhyhQrRrSrTrUrVrWrj 9e4c*g+g,gXrYrZr0r1r2r3r4r5r6r7r8r9r!r#r$r%r'r(r)r*r+r,r-r.r/r:r;r=r?r@r[r]r^r_r`r{r|r}r~rasbscsdsesfsgshsisjskslsmsnsospsqsrssstsusvswsxsyszsAsBsCsDsEsFsGsHsIsJsKsLsMsNsOsPsQsRsSsTsUsVsWsXsYsZs0s1s2s3s4s5s6s7s8s9s!s#s$s%s's(s)s*s+s,s-s.sogMf5c/sEb:s;s=s?s@s[s6c]s^s_s`s{s|spg}s~s7c8c9ce atbtctdtetftgtht-gqgrgsgtgitjtzhkt!c#cltmt$c%cntugotptvg.g'c(c)cqtrtstttutvtwtxtytztAtBtCtAhDtEtwgBhFtGtHtItxgJtKtLtMtW ? X Y Z 0 1 @ NtygOtPtQtRtSt*c+cTtUtVt~gWtzgXtYtFbGbHb2 3 IbZt0t1t2tAg3t,c-c.c[ /c:c] ;c=c?c4tBg5t6tCg7t8t9tDg!t#t$t%t't(t)t@c*t[c]c^cbbJb_c+t`c{cKb4 ,t-t.t/t:t;t=t?t@t[t]t^t_t`t{t|t}t~taubucudueufuguhuiujukulumunuoupuqurusutu/guuvuwuxuyuzuAuBuCuDuEuFuGuChDhEhHuIuJuKuLuMuNuk cf|c:g;g=gOuPuQuRuSuTuUuVuWuXuYuZu0u1u2u3u4u5u6u7u8u9u!u#u$u%u'u(u)u*u+u,u-u.u/u:u;u=u?u@u[u]u^u_u`u{u|u}u~uavbvcvdvevfvgvhvivjvkvlvmvnvovpvqvrvsvtvuvvvwvxvyvzvAvBvCvDvEvFvGvHvIvJvKvLvMvNvOvPvQvRvSvTvUvVvWvXvYvZv0v1v2v3v4v5v6v7v8v9v!v#v$vEgNf}c%vLb'v(v)v*v+v,v~c-v.v/v:v;v=vFg?v@vadbdcdf [v]v^v_v`v{v|v}v?gGgHgIgJg~vawFhbwddedcwdwfdgdewKgfwgwLg@ghdidjdhwiwjwkwlwmwnwowpwqwrwswtwGhuwvwMgHhwwxwywzwNgAwBwCwDw5 ^ 6 7 8 9 ! _ EwOgFwGwHwIwJwkdldKwLwMwahNwPgOwPwMbNbOb# $ PbQwRwSwTwQgUwmdndod` pdqd{ rdsdtdVwRgWwXwSgYwZw0wTg1w2w3w4w5w6w7wud8wvdwdxdcbQbyd9wzdAdRb% !w#w$w%w'w(w)w*w+w,w-w.w/w:w;w=w?w@w[w]w^w_w`w{w|w}w~waxbxcxdxexfxgxhxixjxkx[glxmxnxoxpxqxrxsxtxuxvxwxxxIhJhKhyxzxAxBxCxDxExl GfBd]g^g_gFxGxHxIxJxKxLxMxNxOxPxQxRxSxTxUxVxWxXxYxZx0x1x2x3x4x5x6x7x8x9x!x#x$x%x'x(x)x*x+x,x-x.x/x:x;x=x?x@x[x]x^x_x`x{x|x}x~xaybycydyeyfygyhyiyjykylymynyoypyqyrysytyuyvywyxyyyzyAyByCyDyEyFyGyHyIyJyKyLyMyNyOyPyQyRySyTyUyVyWyXyYyZy0y1y2y3yUgOfCd4ySb5y6y7y8y9y!yDd#y$y%y'y(y)yVg*y+yEdFdGd
1044 def openapi(self) -> Dict[str, Any]: 1abcdef
1045 """
1046 Generate the OpenAPI schema of the application. This is called by FastAPI
1047 internally.
1049 The first time it is called it stores the result in the attribute
1050 `app.openapi_schema`, and next times it is called, it just returns that same
1051 result. To avoid the cost of generating the schema every time.
1053 If you need to modify the generated OpenAPI schema, you could modify it.
1055 Read more in the
1056 [FastAPI docs for OpenAPI](https://fastapi.tiangolo.com/how-to/extending-openapi/).
1057 """
1058 if not self.openapi_schema: 2mznzozWgPfQfRfSfpzqzrzTfszUftz,yuzVfvzwzWfxzm ' n o p q r ( yzXfzzAzBzCzDzEzFzYfGzHzs t IzJzZfKz0fLzMz1fNz2fOzPzQzu RzSzTzUzVzWzXzYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[zaz-y.ygz]z^z_z`z{z|z}z~zg aAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjB3fJfkBlBmBnBoB4fpBqBrB2g5f6f7f8fsBtBuB9fvB!fwB/yxB#fyBzB$fABv ) w x y z A * BB%fCBDBEBFBGBHBIB'fJBKBB C LBMB(fNB)fOBPB*fQB+fRBSBTBD UBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_Bbz:y;yhz`B{B|B}B~BaCbCcCh dCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmD,fKfnDoDpDqDrD-fsDtDuD8g.f/f:f;fvDwDxD=fyD?fzD=yAD@fBDCD[fDDE + F G H I J , ED]fFDGDHDIDJDKDLD^fMDNDK L ODPD_fQD- . `fRDSD{fTD|fUDVDWDM XDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|Dcz?y@yiz}D~DaEbEcEdEeEfEi gEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzEAEBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.E/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpF}fLfqFrFsFtFuF~fvFwFxF'gagbgcgdgyFzFAFegBFfgCF[yDFggEFFFhgGFN / O P Q R S : HFigIFJFKFLFMFNFOFjgPFQFT U RFSFkgTF; = lgUFVFmgWFngXFYFZFV 0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+F,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGdz]y^yjzbGcGdGeGfGgGhGiGj jGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG0G1G2G3G4G5G6G7G8G9G!G#G$G%G'G(G)G*G+G,G-G.G/G:G;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHogMftHuHvHwHxHpgyHzHAH-gqgrgsgtgBHCHDHugEHvgFH_yGHwgHHIHxgJHW ? X Y Z 0 1 @ KHygLHMHNHOHPHQHRHzgSHTH2 3 UHVHAgWH[ ] BgXHYHCgZHDg0H1H2H4 3H4H5H6H7H8H9H!H#H$H%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIez`y{ykzeIfIgIhIiIjIkIlIk mInIoIpIqIrIsItIuIvIwIxIyIzIAIBICIDIEIFIGIHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI0I1I2I3I4I5I6I7I8I9I!I#I$I%I'I(I)I*I+I,I-I.I/I:I;I=I?I@I[I]I^I_I`I{I|I}I~IaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJEgNfwJxJyJzJAJFgBJCJDJ?gGgHgIgJgEJFJGJKgHJLgIJ|yJJMgKJLJNgMJ5 ^ 6 7 8 9 ! _ NJOgOJPJQJRJSJTJUJPgVJWJ# $ XJYJQgZJ` { Rg0J1JSg2JTg3J4J5J% 6J7J8J9J!J#J$J%J'J(J)J*J+J,J-J.J/J:J;J=J?J@J[J]J^J_J`J{J|J}J~JaKbKcKdKeKfKgKfz}y~ylzhKiKjKkKlKmKnKoKl pKqKrKsKtKuKvKwKxKyKzKAKBKCKDKEKFKGKHKIKJKKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK0K1K2K3K4K5K6K7K8K9K!K#K$K%K'K(K)K*K+K,K-K.K/K:K;K=K?K@K[K]K^K_K`K{K|K}K~KaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLUgOfzLALBLCLDLVg
1059 self.openapi_schema = get_openapi( 2mznzozWgPfQfRfSfpzqzrzTfszUftz,yuzVfvzwzWfxzm ' n o p q r ( yzXfzzAzBzCzDzEzFzYfGzHzs t IzJzZfKz0fLzMz1fNz2fOzPzQzu RzSzTzUzVzWzXzYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[zaz-y.ygz]z^z_z`z{z|z}z~zg aAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjB3fJfkBlBmBnBoB4fpBqBrB2g5f6f7f8fsBtBuB9fvB!fwB/yxB#fyBzB$fABv ) w x y z A * BB%fCBDBEBFBGBHBIB'fJBKBB C LBMB(fNB)fOBPB*fQB+fRBSBTBD UBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_Bbz:y;yhz`B{B|B}B~BaCbCcCh dCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmD,fKfnDoDpDqDrD-fsDtDuD8g.f/f:f;fvDwDxD=fyD?fzD=yAD@fBDCD[fDDE + F G H I J , ED]fFDGDHDIDJDKDLD^fMDNDK L ODPD_fQD- . `fRDSD{fTD|fUDVDWDM XDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|Dcz?y@yiz}D~DaEbEcEdEeEfEi gEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzEAEBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.E/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpF}fLfqFrFsFtFuF~fvFwFxF'gagbgcgdgyFzFAFegBFfgCF[yDFggEFFFhgGFN / O P Q R S : HFigIFJFKFLFMFNFOFjgPFQFT U RFSFkgTF; = lgUFVFmgWFngXFYFZFV 0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+F,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGdz]y^yjzbGcGdGeGfGgGhGiGj jGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG0G1G2G3G4G5G6G7G8G9G!G#G$G%G'G(G)G*G+G,G-G.G/G:G;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHogMftHuHvHwHxHpgyHzHAH-gqgrgsgtgBHCHDHugEHvgFH_yGHwgHHIHxgJHW ? X Y Z 0 1 @ KHygLHMHNHOHPHQHRHzgSHTH2 3 UHVHAgWH[ ] BgXHYHCgZHDg0H1H2H4 3H4H5H6H7H8H9H!H#H$H%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIez`y{ykzeIfIgIhIiIjIkIlIk mInIoIpIqIrIsItIuIvIwIxIyIzIAIBICIDIEIFIGIHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI0I1I2I3I4I5I6I7I8I9I!I#I$I%I'I(I)I*I+I,I-I.I/I:I;I=I?I@I[I]I^I_I`I{I|I}I~IaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJEgNfwJxJyJzJAJFgBJCJDJ?gGgHgIgJgEJFJGJKgHJLgIJ|yJJMgKJLJNgMJ5 ^ 6 7 8 9 ! _ NJOgOJPJQJRJSJTJUJPgVJWJ# $ XJYJQgZJ` { Rg0J1JSg2JTg3J4J5J% 6J7J8J9J!J#J$J%J'J(J)J*J+J,J-J.J/J:J;J=J?J@J[J]J^J_J`J{J|J}J~JaKbKcKdKeKfKgKfz}y~ylzhKiKjKkKlKmKnKoKl pKqKrKsKtKuKvKwKxKyKzKAKBKCKDKEKFKGKHKIKJKKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK0K1K2K3K4K5K6K7K8K9K!K#K$K%K'K(K)K*K+K,K-K.K/K:K;K=K?K@K[K]K^K_K`K{K|K}K~KaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLUgOfzLALBLCLDLVg
1060 title=self.title,
1061 version=self.version,
1062 openapi_version=self.openapi_version,
1063 summary=self.summary,
1064 description=self.description,
1065 terms_of_service=self.terms_of_service,
1066 contact=self.contact,
1067 license_info=self.license_info,
1068 routes=self.routes,
1069 webhooks=self.webhooks.routes,
1070 tags=self.openapi_tags,
1071 servers=self.servers,
1072 separate_input_output_schemas=self.separate_input_output_schemas,
1073 external_docs=self.openapi_external_docs,
1074 )
1075 return self.openapi_schema 2mznzozPfQfRfSfpzqzrzTfszUftz,yuzVfvzwzWfxzm ' n o p q r ( yzXfzzAzBzCzDzEzFzYfGzHzs t IzJzZfKz0fLzMz1fNz2fOzPzQzu RzSzTzUzVzWzXzYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[zaz-y.ygz]z^z_z`z{z|z}z~zg aAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjB3fJfkBlBmBnBoB4fpBqBrB5f6f7f8fsBtBuB9fvB!fwB/yxB#fyBzB$fABv ) w x y z A * BB%fCBDBEBFBGBHBIB'fJBKBB C LBMB(fNB)fOBPB*fQB+fRBSBTBD UBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_Bbz:y;yhz`B{B|B}B~BaCbCcCh dCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmD,fKfnDoDpDqDrD-fsDtDuD.f/f:f;fvDwDxD=fyD?fzD=yAD@fBDCD[fDDE + F G H I J , ED]fFDGDHDIDJDKDLD^fMDNDK L ODPD_fQD- . `fRDSD{fTD|fUDVDWDM XDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|Dcz?y@yiz}D~DaEbEcEdEeEfEi gEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzEAEBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.E/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpF}fLfqFrFsFtFuF~fvFwFxFagbgcgdgyFzFAFegBFfgCF[yDFggEFFFhgGFN / O P Q R S : HFigIFJFKFLFMFNFOFjgPFQFT U RFSFkgTF; = lgUFVFmgWFngXFYFZFV 0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+F,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGdz]y^yjzbGcGdGeGfGgGhGiGj jGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG0G1G2G3G4G5G6G7G8G9G!G#G$G%G'G(G)G*G+G,G-G.G/G:G;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHogMftHuHvHwHxHpgyHzHAHqgrgsgtgBHCHDHugEHvgFH_yGHwgHHIHxgJHW ? X Y Z 0 1 @ KHygLHMHNHOHPHQHRHzgSHTH2 3 UHVHAgWH[ ] BgXHYHCgZHDg0H1H2H4 3H4H5H6H7H8H9H!H#H$H%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIez`y{ykzeIfIgIhIiIjIkIlIk mInIoIpIqIrIsItIuIvIwIxIyIzIAIBICIDIEIFIGIHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI0I1I2I3I4I5I6I7I8I9I!I#I$I%I'I(I)I*I+I,I-I.I/I:I;I=I?I@I[I]I^I_I`I{I|I}I~IaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJEgNfwJxJyJzJAJFgBJCJDJGgHgIgJgEJFJGJKgHJLgIJ|yJJMgKJLJNgMJ5 ^ 6 7 8 9 ! _ NJOgOJPJQJRJSJTJUJPgVJWJ# $ XJYJQgZJ` { Rg0J1JSg2JTg3J4J5J% 6J7J8J9J!J#J$J%J'J(J)J*J+J,J-J.J/J:J;J=J?J@J[J]J^J_J`J{J|J}J~JaKbKcKdKeKfKgKfz}y~ylzhKiKjKkKlKmKnKoKl pKqKrKsKtKuKvKwKxKyKzKAKBKCKDKEKFKGKHKIKJKKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK0K1K2K3K4K5K6K7K8K9K!K#K$K%K'K(K)K*K+K,K-K.K/K:K;K=K?K@K[K]K^K_K`K{K|K}K~KaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLUgOfzLALBLCLDLVg
1077 def setup(self) -> None: 1abcdef
1078 if self.openapi_url: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
1079 urls = (server_data.get("url") for server_data in self.servers) 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd
1080 server_urls = {url for url in urls if url} 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd
1082 async def openapi(req: Request) -> JSONResponse: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd
1083 root_path = req.scope.get("root_path", "").rstrip("/") 2mznzozWgPfQfRfSfpzqzrzTfszUftz,yuzVfvzwzWfxzm ' n o p q r ( yzXfzzAzBzCzDzEzFzYfGzHzs t IzJzZfKz0fLzMz1fNz2fOzPzQzu RzSzTzUzVzWzXzYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[zaz-y.ygz]z^z_z`z{z|z}z~zg aAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAKLvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjB3fJfkBlBmBnBoB4fpBqBrB2g5f6f7f8fsBtBuB9fvB!fwB/yxB#fyBzB$fABv ) w x y z A * BB%fCBDBEBFBGBHBIB'fJBKBB C LBMB(fNB)fOBPB*fQB+fRBSBTBD UBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_Bbz:y;yhz`B{B|B}B~BaCbCcCh dCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCLLyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmD,fKfnDoDpDqDrD-fsDtDuD8g.f/f:f;fvDwDxD=fyD?fzD=yAD@fBDCD[fDDE + F G H I J , ED]fFDGDHDIDJDKDLD^fMDNDK L ODPD_fQD- . `fRDSD{fTD|fUDVDWDM XDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|Dcz?y@yiz}D~DaEbEcEdEeEfEi gEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzEAEMLBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.E/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpF}fLfqFrFsFtFuF~fvFwFxF'gagbgcgdgyFzFAFegBFfgCF[yDFggEFFFhgGFN / O P Q R S : HFigIFJFKFLFMFNFOFjgPFQFT U RFSFkgTF; = lgUFVFmgWFngXFYFZFV 0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+F,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGdz]y^yjzbGcGdGeGfGgGhGiGj jGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGNLEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG0G1G2G3G4G5G6G7G8G9G!G#G$G%G'G(G)G*G+G,G-G.G/G:G;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHogMftHuHvHwHxHpgyHzHAH-gqgrgsgtgBHCHDHugEHvgFH_yGHwgHHIHxgJHW ? X Y Z 0 1 @ KHygLHMHNHOHPHQHRHzgSHTH2 3 UHVHAgWH[ ] BgXHYHCgZHDg0H1H2H4 3H4H5H6H7H8H9H!H#H$H%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIez`y{ykzeIfIgIhIiIjIkIlIk mInIoIpIqIrIsItIuIvIwIxIyIzIAIBICIDIEIFIGIOLHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI0I1I2I3I4I5I6I7I8I9I!I#I$I%I'I(I)I*I+I,I-I.I/I:I;I=I?I@I[I]I^I_I`I{I|I}I~IaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJEgNfwJxJyJzJAJFgBJCJDJ?gGgHgIgJgEJFJGJKgHJLgIJ|yJJMgKJLJNgMJ5 ^ 6 7 8 9 ! _ NJOgOJPJQJRJSJTJUJPgVJWJ# $ XJYJQgZJ` { Rg0J1JSg2JTg3J4J5J% 6J7J8J9J!J#J$J%J'J(J)J*J+J,J-J.J/J:J;J=J?J@J[J]J^J_J`J{J|J}J~JaKbKcKdKeKfKgKfz}y~ylzhKiKjKkKlKmKnKoKl pKqKrKsKtKuKvKwKxKyKzKAKBKCKDKEKFKGKHKIKJKPLKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK0K1K2K3K4K5K6K7K8K9K!K#K$K%K'K(K)K*K+K,K-K.K/K:K;K=K?K@K[K]K^K_K`K{K|K}K~KaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLUgOfzLALBLCLDLVg
1084 if root_path not in server_urls: 2mznzozWgPfQfRfSfpzqzrzTfszUftz,yuzVfvzwzWfxzm ' n o p q r ( yzXfzzAzBzCzDzEzFzYfGzHzs t IzJzZfKz0fLzMz1fNz2fOzPzQzu RzSzTzUzVzWzXzYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[zaz-y.ygz]z^z_z`z{z|z}z~zg aAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAKLvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjB3fJfkBlBmBnBoB4fpBqBrB2g5f6f7f8fsBtBuB9fvB!fwB/yxB#fyBzB$fABv ) w x y z A * BB%fCBDBEBFBGBHBIB'fJBKBB C LBMB(fNB)fOBPB*fQB+fRBSBTBD UBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_Bbz:y;yhz`B{B|B}B~BaCbCcCh dCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCLLyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmD,fKfnDoDpDqDrD-fsDtDuD8g.f/f:f;fvDwDxD=fyD?fzD=yAD@fBDCD[fDDE + F G H I J , ED]fFDGDHDIDJDKDLD^fMDNDK L ODPD_fQD- . `fRDSD{fTD|fUDVDWDM XDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|Dcz?y@yiz}D~DaEbEcEdEeEfEi gEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzEAEMLBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.E/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpF}fLfqFrFsFtFuF~fvFwFxF'gagbgcgdgyFzFAFegBFfgCF[yDFggEFFFhgGFN / O P Q R S : HFigIFJFKFLFMFNFOFjgPFQFT U RFSFkgTF; = lgUFVFmgWFngXFYFZFV 0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+F,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGdz]y^yjzbGcGdGeGfGgGhGiGj jGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGNLEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG0G1G2G3G4G5G6G7G8G9G!G#G$G%G'G(G)G*G+G,G-G.G/G:G;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHogMftHuHvHwHxHpgyHzHAH-gqgrgsgtgBHCHDHugEHvgFH_yGHwgHHIHxgJHW ? X Y Z 0 1 @ KHygLHMHNHOHPHQHRHzgSHTH2 3 UHVHAgWH[ ] BgXHYHCgZHDg0H1H2H4 3H4H5H6H7H8H9H!H#H$H%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIez`y{ykzeIfIgIhIiIjIkIlIk mInIoIpIqIrIsItIuIvIwIxIyIzIAIBICIDIEIFIGIOLHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI0I1I2I3I4I5I6I7I8I9I!I#I$I%I'I(I)I*I+I,I-I.I/I:I;I=I?I@I[I]I^I_I`I{I|I}I~IaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJEgNfwJxJyJzJAJFgBJCJDJ?gGgHgIgJgEJFJGJKgHJLgIJ|yJJMgKJLJNgMJ5 ^ 6 7 8 9 ! _ NJOgOJPJQJRJSJTJUJPgVJWJ# $ XJYJQgZJ` { Rg0J1JSg2JTg3J4J5J% 6J7J8J9J!J#J$J%J'J(J)J*J+J,J-J.J/J:J;J=J?J@J[J]J^J_J`J{J|J}J~JaKbKcKdKeKfKgKfz}y~ylzhKiKjKkKlKmKnKoKl pKqKrKsKtKuKvKwKxKyKzKAKBKCKDKEKFKGKHKIKJKPLKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK0K1K2K3K4K5K6K7K8K9K!K#K$K%K'K(K)K*K+K,K-K.K/K:K;K=K?K@K[K]K^K_K`K{K|K}K~KaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLUgOfzLALBLCLDLVg
1085 if root_path and self.root_path_in_servers: 2mznzozWgPfQfRfSfpzqzrzTfszUftz,yuzVfvzwzWfxzm ' n o p q r ( yzXfzzAzBzCzDzEzFzYfGzHzs t IzJzZfKz0fLzMz1fNz2fOzPzQzu RzSzTzUzVzWzXzYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[zaz-y.ygz]z^z_z`z{z|z}z~zg aAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAKLvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjB3fJfkBlBmBnBoB4fpBqBrB2g5f6f7f8fsBtBuB9fvB!fwB/yxB#fyBzB$fABv ) w x y z A * BB%fCBDBEBFBGBHBIB'fJBKBB C LBMB(fNB)fOBPB*fQB+fRBSBTBD UBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_Bbz:y;yhz`B{B|B}B~BaCbCcCh dCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCLLyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmD,fKfnDoDpDqDrD-fsDtDuD8g.f/f:f;fvDwDxD=fyD?fzD=yAD@fBDCD[fDDE + F G H I J , ED]fFDGDHDIDJDKDLD^fMDNDK L ODPD_fQD- . `fRDSD{fTD|fUDVDWDM XDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|Dcz?y@yiz}D~DaEbEcEdEeEfEi gEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzEAEMLBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.E/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpF}fLfqFrFsFtFuF~fvFwFxF'gagbgcgdgyFzFAFegBFfgCF[yDFggEFFFhgGFN / O P Q R S : HFigIFJFKFLFMFNFOFjgPFQFT U RFSFkgTF; = lgUFVFmgWFngXFYFZFV 0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+F,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGdz]y^yjzbGcGdGeGfGgGhGiGj jGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGNLEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG0G1G2G3G4G5G6G7G8G9G!G#G$G%G'G(G)G*G+G,G-G.G/G:G;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHogMftHuHvHwHxHpgyHzHAH-gqgrgsgtgBHCHDHugEHvgFH_yGHwgHHIHxgJHW ? X Y Z 0 1 @ KHygLHMHNHOHPHQHRHzgSHTH2 3 UHVHAgWH[ ] BgXHYHCgZHDg0H1H2H4 3H4H5H6H7H8H9H!H#H$H%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIez`y{ykzeIfIgIhIiIjIkIlIk mInIoIpIqIrIsItIuIvIwIxIyIzIAIBICIDIEIFIGIOLHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI0I1I2I3I4I5I6I7I8I9I!I#I$I%I'I(I)I*I+I,I-I.I/I:I;I=I?I@I[I]I^I_I`I{I|I}I~IaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJEgNfwJxJyJzJAJFgBJCJDJ?gGgHgIgJgEJFJGJKgHJLgIJ|yJJMgKJLJNgMJ5 ^ 6 7 8 9 ! _ NJOgOJPJQJRJSJTJUJPgVJWJ# $ XJYJQgZJ` { Rg0J1JSg2JTg3J4J5J% 6J7J8J9J!J#J$J%J'J(J)J*J+J,J-J.J/J:J;J=J?J@J[J]J^J_J`J{J|J}J~JaKbKcKdKeKfKgKfz}y~ylzhKiKjKkKlKmKnKoKl pKqKrKsKtKuKvKwKxKyKzKAKBKCKDKEKFKGKHKIKJKPLKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK0K1K2K3K4K5K6K7K8K9K!K#K$K%K'K(K)K*K+K,K-K.K/K:K;K=K?K@K[K]K^K_K`K{K|K}K~KaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLUgOfzLALBLCLDLVg
1086 self.servers.insert(0, {"url": root_path}) 2,yaz-y.yJf/ybz:y;yKf=ycz?y@yLf[ydz]y^yMf_yez`y{yNf|yfz}y~yOf
1087 server_urls.add(root_path) 2,yaz-y.yJf/ybz:y;yKf=ycz?y@yLf[ydz]y^yMf_yez`y{yNf|yfz}y~yOf
1088 return JSONResponse(self.openapi()) 2mznzozWgPfQfRfSfpzqzrzTfszUftz,yuzVfvzwzWfxzm ' n o p q r ( yzXfzzAzBzCzDzEzFzYfGzHzs t IzJzZfKz0fLzMz1fNz2fOzPzQzu RzSzTzUzVzWzXzYzZz0z1z2z3z4z5z6z7z8z9z!z#z$z%z'z(z)z*z+z,z-z.z/z:z;z=z?z@z[zaz-y.ygz]z^z_z`z{z|z}z~zg aAbAcAdAeAfAgAhAiAjAkAlAmAnAoApAqArAsAtAuAKLvAwAxAyAzAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARASATAUAVAWAXAYAZA0A1A2A3A4A5A6A7A8A9A!A#A$A%A'A(A)A*A+A,A-A.A/A:A;A=A?A@A[A]A^A_A`A{A|A}A~AaBbBcBdBeBfBgBhBiBjB3fJfkBlBmBnBoB4fpBqBrB2g5f6f7f8fsBtBuB9fvB!fwB/yxB#fyBzB$fABv ) w x y z A * BB%fCBDBEBFBGBHBIB'fJBKBB C LBMB(fNB)fOBPB*fQB+fRBSBTBD UBVBWBXBYBZB0B1B2B3B4B5B6B7B8B9B!B#B$B%B'B(B)B*B+B,B-B.B/B:B;B=B?B@B[B]B^B_Bbz:y;yhz`B{B|B}B~BaCbCcCh dCeCfCgChCiCjCkClCmCnCoCpCqCrCsCtCuCvCwCxCLLyCzCACBCCCDCECFCGCHCICJCKCLCMCNCOCPCQCRCSCTCUCVCWCXCYCZC0C1C2C3C4C5C6C7C8C9C!C#C$C%C'C(C)C*C+C,C-C.C/C:C;C=C?C@C[C]C^C_C`C{C|C}C~CaDbDcDdDeDfDgDhDiDjDkDlDmD,fKfnDoDpDqDrD-fsDtDuD8g.f/f:f;fvDwDxD=fyD?fzD=yAD@fBDCD[fDDE + F G H I J , ED]fFDGDHDIDJDKDLD^fMDNDK L ODPD_fQD- . `fRDSD{fTD|fUDVDWDM XDYDZD0D1D2D3D4D5D6D7D8D9D!D#D$D%D'D(D)D*D+D,D-D.D/D:D;D=D?D@D[D]D^D_D`D{D|Dcz?y@yiz}D~DaEbEcEdEeEfEi gEhEiEjEkElEmEnEoEpEqErEsEtEuEvEwExEyEzEAEMLBECEDEEEFEGEHEIEJEKELEMENEOEPEQERESETEUEVEWEXEYEZE0E1E2E3E4E5E6E7E8E9E!E#E$E%E'E(E)E*E+E,E-E.E/E:E;E=E?E@E[E]E^E_E`E{E|E}E~EaFbFcFdFeFfFgFhFiFjFkFlFmFnFoFpF}fLfqFrFsFtFuF~fvFwFxF'gagbgcgdgyFzFAFegBFfgCF[yDFggEFFFhgGFN / O P Q R S : HFigIFJFKFLFMFNFOFjgPFQFT U RFSFkgTF; = lgUFVFmgWFngXFYFZFV 0F1F2F3F4F5F6F7F8F9F!F#F$F%F'F(F)F*F+F,F-F.F/F:F;F=F?F@F[F]F^F_F`F{F|F}F~FaGdz]y^yjzbGcGdGeGfGgGhGiGj jGkGlGmGnGoGpGqGrGsGtGuGvGwGxGyGzGAGBGCGDGNLEGFGGGHGIGJGKGLGMGNGOGPGQGRGSGTGUGVGWGXGYGZG0G1G2G3G4G5G6G7G8G9G!G#G$G%G'G(G)G*G+G,G-G.G/G:G;G=G?G@G[G]G^G_G`G{G|G}G~GaHbHcHdHeHfHgHhHiHjHkHlHmHnHoHpHqHrHsHogMftHuHvHwHxHpgyHzHAH-gqgrgsgtgBHCHDHugEHvgFH_yGHwgHHIHxgJHW ? X Y Z 0 1 @ KHygLHMHNHOHPHQHRHzgSHTH2 3 UHVHAgWH[ ] BgXHYHCgZHDg0H1H2H4 3H4H5H6H7H8H9H!H#H$H%H'H(H)H*H+H,H-H.H/H:H;H=H?H@H[H]H^H_H`H{H|H}H~HaIbIcIdIez`y{ykzeIfIgIhIiIjIkIlIk mInIoIpIqIrIsItIuIvIwIxIyIzIAIBICIDIEIFIGIOLHIIIJIKILIMINIOIPIQIRISITIUIVIWIXIYIZI0I1I2I3I4I5I6I7I8I9I!I#I$I%I'I(I)I*I+I,I-I.I/I:I;I=I?I@I[I]I^I_I`I{I|I}I~IaJbJcJdJeJfJgJhJiJjJkJlJmJnJoJpJqJrJsJtJuJvJEgNfwJxJyJzJAJFgBJCJDJ?gGgHgIgJgEJFJGJKgHJLgIJ|yJJMgKJLJNgMJ5 ^ 6 7 8 9 ! _ NJOgOJPJQJRJSJTJUJPgVJWJ# $ XJYJQgZJ` { Rg0J1JSg2JTg3J4J5J% 6J7J8J9J!J#J$J%J'J(J)J*J+J,J-J.J/J:J;J=J?J@J[J]J^J_J`J{J|J}J~JaKbKcKdKeKfKgKfz}y~ylzhKiKjKkKlKmKnKoKl pKqKrKsKtKuKvKwKxKyKzKAKBKCKDKEKFKGKHKIKJKPLKKLKMKNKOKPKQKRKSKTKUKVKWKXKYKZK0K1K2K3K4K5K6K7K8K9K!K#K$K%K'K(K)K*K+K,K-K.K/K:K;K=K?K@K[K]K^K_K`K{K|K}K~KaLbLcLdLeLfLgLhLiLjLkLlLmLnLoLpLqLrLsLtLuLvLwLxLyLUgOfzLALBLCLDLVg
1090 self.add_route(self.openapi_url, openapi, include_in_schema=False) 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd
1091 if self.openapi_url and self.docs_url: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
1093 async def swagger_ui_html(req: Request) -> HTMLResponse: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd
1094 root_path = req.scope.get("root_path", "").rstrip("/") 2ELXg`gYgg Zg0g1gFL3g{g4gh 5g6g7gGL9g|g!gi #g$g%gHL(g}g)gj *g+g,gIL.g~g/gk :g;g=gJL@gah[gl ]g^g_g
1095 openapi_url = root_path + self.openapi_url 2ELXg`gYgg Zg0g1gFL3g{g4gh 5g6g7gGL9g|g!gi #g$g%gHL(g}g)gj *g+g,gIL.g~g/gk :g;g=gJL@gah[gl ]g^g_g
1096 oauth2_redirect_url = self.swagger_ui_oauth2_redirect_url 2ELXg`gYgg Zg0g1gFL3g{g4gh 5g6g7gGL9g|g!gi #g$g%gHL(g}g)gj *g+g,gIL.g~g/gk :g;g=gJL@gah[gl ]g^g_g
1097 if oauth2_redirect_url: 2ELXg`gYgg Zg0g1gFL3g{g4gh 5g6g7gGL9g|g!gi #g$g%gHL(g}g)gj *g+g,gIL.g~g/gk :g;g=gJL@gah[gl ]g^g_g
1098 oauth2_redirect_url = root_path + oauth2_redirect_url 2ELXgYgg Zg0g1gFL3g4gh 5g6g7gGL9g!gi #g$g%gHL(g)gj *g+g,gIL.g/gk :g;g=gJL@g[gl ]g^g_g
1099 return get_swagger_ui_html( 2ELXg`gYgg Zg0g1gFL3g{g4gh 5g6g7gGL9g|g!gi #g$g%gHL(g}g)gj *g+g,gIL.g~g/gk :g;g=gJL@gah[gl ]g^g_g
1100 openapi_url=openapi_url,
1101 title=f"{self.title} - Swagger UI",
1102 oauth2_redirect_url=oauth2_redirect_url,
1103 init_oauth=self.swagger_ui_init_oauth,
1104 swagger_ui_parameters=self.swagger_ui_parameters,
1105 )
1107 self.add_route(self.docs_url, swagger_ui_html, include_in_schema=False) 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd
1109 if self.swagger_ui_oauth2_redirect_url: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd
1111 async def swagger_ui_redirect(req: Request) -> HTMLResponse: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd
1112 return get_swagger_ui_oauth2_redirect_html() 2WLXLYLZL0L1L2L3L4L5L6L7L
1114 self.add_route( 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd
1115 self.swagger_ui_oauth2_redirect_url,
1116 swagger_ui_redirect,
1117 include_in_schema=False,
1118 )
1119 if self.openapi_url and self.redoc_url: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g 8d#b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h be|bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i FeAcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 9e4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k cf|cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l GfBdHfIfCdSbDdEdFdGd
1121 async def redoc_html(req: Request) -> HTMLResponse: 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd
1122 root_path = req.scope.get("root_path", "").rstrip("/") 2QLg RLh SLi TLj ULk VLl
1123 openapi_url = root_path + self.openapi_url 2QLg RLh SLi TLj ULk VLl
1124 return get_redoc_html( 2QLg RLh SLi TLj ULk VLl
1125 openapi_url=openapi_url, title=f"{self.title} - ReDoc"
1126 )
1128 self.add_route(self.redoc_url, redoc_html, include_in_schema=False) 2a TbUbVbWbXbYbZbm ' n o p q r ( 0b1bHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3b3d4d5d6d7d4b5b6b7b| hb8b9b!bibu g #b9d!d$bjb%b'b(bb )b*b+b,b-b.b/bv ) w x y z A * :b;b#d$d%d'd(d)d*d+d,d-d.d/d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?b{d|d}d~dae@b[b]b^b} ob_b`b{bpbD h |bcede}bqb~bacbcc ccdcecfcgchcicE + F G H I J , jckceefegeheiejekelemeneoepeqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpc. qcrcscAeBeCeDeEetcucvcwc~ vbxcyczcwbM i AcGeHeBcxbCcDcEcFcd GcHcIcJcKcLcMcN / O P Q R S : NcOcIeJeKeLeMeNeOePeQeReSeTeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTc= UcVcWc4e5e6e7e8eXcYcZc0cabCb1c2c3cDbV j 4c!e#e5cEb6c7c8c9ce !c#c$c%c'c(c)cW ? X Y Z 0 1 @ *c+c$e%e'e(e)e*e+e,e-e.e/e:e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:c] ;c=c?c|e}e~eafbf@c[c]c^cbbJb_c`c{cKb4 k |cdfef}cLb~cadbdcdf ddedfdgdhdidjd5 ^ 6 7 8 9 ! _ kdldffgfhfifjfkflfmfnfofpfqfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqd{ rdsdtdBfCfDfEfFfudvdwdxdcbQbydzdAdRb% l BdHfIfCdSbDdEdFdGd
1130 async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: 1abcdef
1131 if self.root_path: 2a LhMhNh8LOhPhQhmzRh9LnzozShWgPfQfRfSfTh!L#L$Lpz%L'L(LUhbhVhTbUbqz)LWhrzQLELWLXhVbWbYhTfZh*L0hszUf+L,LXgXLXbYbZb1h-L.L/L:L;L=L?L@L[L]L^L_L`L2h{L|L}L~LaMbMcMdMeMfMgMhMiMjMkMlM3hmMnMoMpM4hqMrM5hsM6htMuMvM7hwMxMyM8hzMAMBMCMDMEMFMGMHMIMJMKMLMMMNMOMPMQM9hRMSM!htzTMUMVMWM#hXMYMZM0M1M2M3M4M5M6M7M8M9M!M#M$M%M'M(M)M*M$h+M,M%h-Mch,y'huz(h.M/MVfdh:M;M=M?M@M)h[M]Mvz^M_M`M*h{M+hwz|M,hWf-h.h}M~MaNbNcN/hxz:hm ' n o p q r ( ;hyzXf=hzz?hdN@heN[hAzfNgNhNiNjNkNlN]hmNnNBz0b1bCz^hoNpNDz_hqN`hrNEzsN`gtN{hFzYf|hGz}hHzdbebfbs t gb~hIzaiuNbiJzcivNwNxNyNZfzNANBNCNDNENFNGNHNINJNKNLNMNNNONPNQNRNSNTNUNVNWNXNYNZN0N1N2N3N4N5N6N7N8N9N!N#N$N%N'N(N)N*N+N,N-N.N/N:N;N=N?N@N[N]N^N_N`N{N|N}N~NaObOcOdOeOfOgOhOiOjOkOKzdilOmOnOoOpOqOrOsOtOuOvOwOxOyOzOAOBOCODOEOFOGOHOIOJOKOLOMONOOO2b3beiPO0ffiLzgiMz1fQOROSOTOhiUOVONziiWOXOYOZO0O1O2O3Oji2fkiOz4O5O6O7O8O9O!O#O$O%O'O(O)OliPz*O+O,O-O.O/O:O;O=O?O@O[O]O^O_O`O{O|O}O~OaPbPcPmidPePnifPoigPhPiPjPkPpilPQzqi4brimPnPoPpP5b6b7b| hb8bsi9b!bibu RztiqPSzuirPTzvisPUzwitPVzxiuPWzyivPXzziwPYzAixPZzBiyP0zCizP1zDiAP2zEiBP3zFiCPDPEP4zGiFPGPHP5zHiIPJPKP6zIiLPMP7zJiNPOP8zKiPPQP9zLiRPSP!zMiTPUP#zNiVPWP$zOiXPYPZP0P1P2P3PPi%z4P5PQi'z6P(zRi7P8P9P!P#P$P)zSi%P'P(P)P*P+P,PTi*z-P.PUi+z/P,zVi:P;P-zWi=P?P.zXi@P[P]PYi^P_P`P{P|P}PZi~PaQbQ0icQdQeQfQgQ1ihQiQjQkQ2ilQmQnQoQpQ/zqQ3irQsQ4i:ztQYguQ5i;zvQwQxQyQ=z6izQ?z7iAQ@z8iBQ[z9iCQDQ!i#i$i%iEQ'i(i)iazFQ*ieh-yfh.yghgzGQHQIQJQKQLQMQNQOQPQQQ]zRQSQTQUQVQWQXQYQZQ0Q+i1Q2Q,i3Q4Q5Q^z6Q7Q8Q9Q!Q#Q$Q%Q'Q(Q)Q*Q-i+Q_z`z.i,Q-Q.Q{z/Q:Q/i|z:i;Q;i}z~z=Qg 8d#b?QZg@Q0g[Q1g=i]Q^Q_QaA?i`Q{Q|QbA@icA[i}Q~QaRbRcRdReRfR]igR^ihR_iiR`idA{ieA|ifA}igA~ihAiAajjAbjcjdjejfjgjkAjRhjijlAkRmAnAjjkjoAljpAlRmRmjnRqAoRnjpRqRrRojsRtRpjuRvRwRxRyRzRqjARBRCRrArjsAsjtAtjuAujKLvjvAwjDRwAxjxAyjyAzjzAERAAAjFRBjGRBACjHRCADjIRDAJRKREjEAFALRFjMRNRGjGAHjORPRQRHAIjRRSRTRIAJjURVRWRXRJAKjKALjLAMjMANjNAOjOAPAPjQjQARjRASjSATjTAUjUAVAWAVjWjXAYAXjZAYjYRZR0AZj0R1R0j2R1A2A3A1j4A2j3j5A3R4j4R5R6R6A7A5j7R8R9R8A6j!R#R$R7j%R9A8j'R!A#A(R)R9j*R!j$A+R#j,R%A$j'A-R%j.R(A/R:R;R'j)A*A=R?R(j@R[R+A]R)j^R_R,A*j`R{R-A|R}R+j~RaS.A,jbS/A-jcSdSeSfS:AgS.jhSiSjSkS;AlS/jmSnSoSpS=A:jqSrSsStS?AuSvSwS;jxS=j?j@j[j]j@A^j[A_j`jyS]A{j^A|jzS_A}j`A{A~jAS|AakBS}Abk~AckaBdkbBekCSfkcBDSESFSGSgkHSISJSdBKSLSMShkNSOSPSeBQSRSSSTSUSVSWSXSYSfBikZS0S1SjkgB2SkkhB3Slkmk4SiB5SjB6S3fJf7S$b8SkBnk9SlB!S#Sjb$S%Sok'S(S)S*S+Spk,Sqk-S.S/S:S;Srk=S?SskmB@Stk[S]SnB^SukoBvk_S`Swk{S|S}S~SaTxkbTyk4fzkcTdTAk%b'b(beTfTgThTiTjTkTlTb BkCkDkmTEkFkGkpBHknTqBrBIk2g5f6f7f8fJkoTpTqTsBrTsTtTKkhhLk)b*btBuTMkuBRLFLYLNk+b,bOk9fPkvTQkvB!fwTxT3gZL-b.b/bRkyTzTATBTCTDTETFTGTHTITJTKTSkLTMTNTOTPTQTRTSTTTUTVTWTXTYTZT0TTk1T2T3T4TUk5T6TVk7TWk8T9T!TXk#T$T%TYk'T(T)T*T+T,T-T.T/T:T;T=T?T@T[T]T^T_TZk`T{T0kwB|T}T~TaU1kbUcUdUeUfUgUhUiUjUkUlUmUnUoUpUqUrUsUtUuUvU2kwUxU3kyUih/y4kxB5kzUAU#fjhBUCUDUEUFU6kGUHUyBIUJUKU7kLU8kzBMU9k$f!k#kNUOUPUQURU$kAB%kv ) w x y z A * 'kBB%f(kCB)kSU*kTU+kDBUUVUWUXUYUZU0U,k1U2UEB:b;bFB-k3U4UGB.k5U/k6UHB7U{g8U:kIB'f;kJB=kKBkblbmbB C nb?kLB@k9U[kMB]k!U#U$U%U(f'U(U)U*U+U,U-U.U/U:U;U=U?U@U[U]U^U_U`U{U|U}U~UaVbVcVdVeVfVgVhViVjVkVlVmVnVoVpVqVrVsVtVuVvVwVxVyVzVAVBVCVDVEVFVGVHVIVJVKVLVMVNVOVPVQVRVSVTVUVVVWVXVYVZVNB^k0V1V2V3V4V5V6V7V8V9V!V#V$V%V'V(V)V*V+V,V-V.V/V:V;V=V?V@V[V]V=b?b_k^V)f`kOB{kPB*f_V`V{V|V|k}V~VQB}kaWbWcWdWeWfWgWhW~k+falRBiWjWkWlWmWnWoWpWqWrWsWtWuWblSBvWwWxWyWzWAWBWCWDWEWFWGWHWIWJWKWLWMWNWOWPWQWRWclSWTWdlUWelVWWWXWYWZWfl0WTBgl@bhl1W2W3W4W[b]b^b} ob_bil`b{bpbD UBjl5WVBkl6WWBll7WXBml8WYBnl9WZBol!W0Bpl#W1Bql$W2Brl%W3Bsl'W4Btl(W5Bul)W6Bvl*W+W,W7Bwl-W.W/W8Bxl:W;W=W9Byl?W@W!Bzl[W]W#BAl^W_W$BBl`W{W%BCl|W}W'BDl~WaX(BElbXcXdXeXfXgXhXFl)BiXjXGl*BkX+BHllXmXnXoXpXqX,BIlrXsXtXuXvXwXxXJl-ByXzXKl.BAX/BLlBXCX:BMlDXEX;BNlFXGXHXOlIXJXKXLXMXNXPlOXPXQXQlRXSXTXUXVXRlWXXXYXZXSl0X1X2X3X4X=B5XTl6X7XUl?B8X4g9XVl@B!X#X$X%X[BWl'X]BXl(X^BYl)X_BZl*X+X0l1l2l3l,X4l5l6lbz-X7lkh:ylh;ymhhz.X/X:X;X=X?X@X[X]X^X_X`B`X{X|X}X~XaYbYcYdYeY8lfYgY9lhYiYjY{BkYlYmYnYoYpYqYrYsYtYuYvY!lwY|B}B#lxYyYzY~BAYBY$laC%lCY'lbCcCDYh be|bEY5gFY6gGY7g(lHYIYJYdC)lKYLYMYeC*lfC+lNYOYPYQYRYSYTYUY,lVY-lWY.lXY/lgC:lhC;liC=ljC?lkClC@lmC[l]l^l_l`l{lnCYY|l}loCZYpCqC~lamrCbmsC0Y1Ycm2YtC3Ydm4Y5Y6Yem7Y8Yfm9Y!Y#Y$Y%Y'Ygm(Y)Y*YuChmvCimwCjmxCkmLLlmyCmm+YzCnmAComBCpmCC,YDCqm-Yrm.YECsm/YFCtm:YGC;Y=YumHCIC?Yvm@Y[YwmJCxm]Y^Y_YKCym`Y{Y|YLCzm}Y~YaZbZMCAmNCBmOCCmPCDmQCEmRCSCFmGmTCHmUCImVCJmWCKmXCYCZCLmMm0C1CNm2COmcZdZ3CPmeZfZQmgZ4C5C6CRm7CSmTm8ChZUmiZjZkZ9C!CVmlZmZnZ#CWmoZpZqZXmrZ$CYmsZ%C'CtZuZZmvZ0m(CwZ1mxZ)C2m*CyZ3mzZ+CAZBZCZ4m,C-CDZEZ5mFZGZ.CHZ6mIZJZ/C7mKZLZ:CMZNZ8mOZPZ;C9mQZ=C!mRZSZTZUZ?CVZ#mWZXZYZZZ@C0Z$m1Z2Z3Z4Z[C%m5Z6Z7Z8Z]C9Z!Z#Z'm$Z(m)m*m+m,m^C-m_C.m/m%Z`C:m{C;m'Z|C=m}C~C?m(ZaD@m)ZbD[mcD]mdD^meD_m*Z`mfD+Z,Z-Z.Z{m/Z:Z;ZgD=Z?Z@Z|m[Z]Z^ZhD_Z`Z{Z|Z}Z~Za0b0c0iD}md0e0f0~mjDg0ankDh0bncni0lDj0mDk0,fKfl0}bm0nDdnn0oDo0p0qbq0r0ens0t0u0v0w0fnx0gny0z0A0B0C0hnD0inE0F0jnpDG0knH0I0qDJ0lnrDmnK0L0nnM0N0O0P0Q0onR0pn-fqnS0T0rn~bacbcU0V0W0X0Y0Z00010c sntnun20vnwnxnsDyn30tDuDzn8g.f/f:f;fAn405060vD708090BnnhCnccdcwD!0DnxDSLGL0LEnecfcFn=fGn#0HnyD?f$0%09g1LgchcicIn'0(0)0*0+0,0-0.0/0:0;0=0?0Jn@0[0]0^0_0`0{0|0}0~0a1b1c1d1e1f1Kng1h1i1j1Lnk1l1Mnm1Nnn1o1p1Onq1r1s1Pnt1u1v1w1x1y1z1A1B1C1D1E1F1G1H1I1J1K1QnL1M1RnzDN1O1P1Q1SnR1S1T1U1V1W1X1Y1Z101112131415161718191!1#1Tn$1%1Un'1oh=yVnADWn(1)1@fph*1+1,1-1.1Xn/1:1BD;1=1?1Yn@1ZnCD[10n[f1n2n]1^1_1`1{13nDD4nE + F G H I J , 5nED]f6nFD7n|18n}19nGD~1a2b2c2d2e2f2!ng2h2HDjckcID#ni2j2JD$nk2%nl2KDm2|gn2'nLD^f(nMD)nNDrbsbtbK L ub*nOD+no2,nPD-np2q2r2s2_ft2u2v2w2x2y2z2A2B2C2D2E2F2G2H2I2J2K2L2M2N2O2P2Q2R2S2T2U2V2W2X2Y2Z202122232425262728292!2#2$2%2'2(2)2*2+2,2-2.2/2:2;2=2?2@2[2]2^2_2`2{2|2}2~2a3b3c3d3e3QD.nf3g3h3i3j3k3l3m3n3o3p3q3r3s3t3u3v3w3x3y3z3A3B3C3D3E3F3G3H3I3lcmcnc- ocpc. qcrcsc/nJ3`f:nRD;nSD{fK3L3M3N3=nO3P3TD?nQ3R3S3T3U3V3W3X3@n|f[nUDY3Z303132333435363738393!3]nVD#3$3%3'3(3)3*3+3,3-3.3/3:3;3=3?3@3[3]3^3_3`3{3^n|3}3_n~3`na4b4c4d4e4{nf4WD|ntc}ng4h4i4j4ucvcwc~ vbxc~nyczcwbM XDaok4YDbol4ZDcom40Ddon41Deoo42Dfop43Dgoq44Dhor45Dios46Djot47Dkou48Dlov49Dmow4x4y4!Dnoz4A4B4#DooC4D4E4$DpoF4G4%DqoH4I4'DroJ4K4(DsoL4M4)DtoN4O4*DuoP4Q4+DvoR4S4T4U4V4W4X4wo,DY4Z4xo-D04.Dyo142434445464/Dzo748494!4#4$4%4Ao:D'4(4Bo;D)4=DCo*4+4?DDo,4-4@DEo.4/4:4Fo;4=4?4@4[4]4Go^4_4`4Ho{4|4}4~4a5Iob5c5d5e5Jof5g5h5i5j5[Dk5Kol5m5Lo]Dn5!go5Mo^Dp5q5r5s5_DNot5`DOou5{DPov5|DQow5x5RoSoToUoy5VoWoXoczz5Yoqh?yrh@yshizA5B5C5D5E5F5G5H5I5J5K5}DL5M5N5O5P5Q5R5S5T5U5ZoV5W50oX5Y5Z5~D05152535455565758595!5#51o$5aEbE2o%5'5(5cE)5*53odE4o+55oeEfE,5i FeAc-5#g.5$g/5%g6o:5;5=5gE7o?5@5[5hE8oiE9o]5^5_5`5{5|5}5~5!oa6#ob6$oc6%ojE'okE(olE)omE*onEoE+opE,o-o.o/o:o;oqEd6=o?orEe6sEtE@o[ouE]ovEf6g6^oh6wEi6_oj6k6l6`om6n6{oo6p6q6r6s6t6|ou6v6w6xE}oyE~ozEapAEbpMLcpBEdpx6CEepDEfpEEgpFEy6GEhpz6ipA6HEjpB6IEkpC6JED6E6lpKELEF6mpG6H6npMEopI6J6K6NEppL6M6N6OEqpO6P6Q6R6PErpQEspREtpSEupTEvpUEVEwpxpWEypXEzpYEApZEBp0E1E2ECpDp3E4EEp5EFpS6T66EGpU6V6HpW67E8E9EIp!EJpKp#EX6LpY6Z606$E%EMp162636'ENp465666Op76(EPp86)E*E96!6Qp#6Rp+E$6Sp%6,ETp-E'6Up(6.E)6*6+6Vp/E:E,6-6Wp.6/6;E:6Xp;6=6=EYp?6@6?E[6]6Zp^6_6@E0p`6[E1p{6|6}6~6]Ea72pb7c7d7e7^Ef73pg7h7i7j7_E4pk7l7m7n7`Eo7p7q75pr76p7p8p9p!p{E#p|E$p%ps7}E'p~E(pt7aF)pbFcF*pu7dF+pv7eF,pfF-pgF.phF/pw7:piFx7y7z7A7;pB7C7D7jFE7F7G7=pH7I7J7kFK7L7M7N7O7P7Q7R7S7lF?pT7U7V7@pmFW7[pnFX7]p^pY7oFZ7pF07}fLf17Bc27qF_p37rF4757xb6777`p8797!7#7$7{p%7|p'7(7)7*7+7}p,7~p-7.7aqCcsF/7bq:7;7tF=7cquFdq?7@7eq[7]7^7_7`7fq{7gq~fhq|7}7iqDcEcFc~7a8b8c8d8e8f8g8d jqkqlqh8mqnqoqvFpqi8wFxFqq'gagbgcgdgrqj8k8l8yFm8n8o8sqthtqGcHczFp8uqAFTLHL2LvqIcJcwqegxqq8yqBFfgr8s8(g3LKcLcMczqt8u8v8w8x8y8z8A8B8C8D8E8F8AqG8H8I8J8K8L8M8N8O8P8Q8R8S8T8U8V8BqW8X8Y8Z8Cq0818Dq28Eq384858Fq687888Gq98!8#8$8%8'8(8)8*8+8,8-8.8/8:8;8=8?8Hq@8[8IqCF]8^8_8`8Jq{8|8}8~8a9b9c9d9e9f9g9h9i9j9k9l9m9n9o9p9q9Kqr9s9Lqt9uh[yMqDFNqu9v9ggvhw9x9y9z9A9OqB9C9EFD9E9F9PqG9QqFFH9RqhgSqTqI9J9K9L9M9UqGFVqN / O P Q R S : WqHFigXqIFYqN9ZqO90qJFP9Q9R9S9T9U9V91qW9X9KFNcOcLF2qY9Z9MF3q094q19NF29}g395qOFjg6qPF7qQFybzbAbT U Bb8qRF9q49!qSF#q59697989kg99!9#9$9%9'9(9)9*9+9,9-9.9/9:9;9=9?9@9[9]9^9_9`9{9|9}9~9a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!TF$qV!W!X!Y!Z!0!1!2!3!4!5!6!7!8!9!!!#!$!%!'!(!)!*!+!,!-!.!/!:!;!PcQcRc; ScTc= UcVcWc%q=!lg'qUF(qVFmg?!@![!]!)q^!_!WF*q`!{!|!}!~!a#b#c#+qng,qXFd#e#f#g#h#i#j#k#l#m#n#o#p#-qYFq#r#s#t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#J#K#L#M#.qN#O#/qP#:qQ#R#S#T#U#;qV#ZF=qXc?qW#X#Y#Z#YcZc0cabCb1c@q2c3cDbV 0F[q0#1F]q1#2F^q2#3F_q3#4F`q4#5F{q5#6F|q6#7F}q7#8F~q8#9Far9#!Fbr!##Fcr##$Fdr$#%#'#%Fer(#)#*#'Ffr+#,#-#(Fgr.#/#)Fhr:#;#*Fir=#?#+Fjr@#[#,Fkr]#^#-Flr_#`#.Fmr{#|#}#~#a$b$c$nr/Fd$e$or:Ff$;Fprg$h$i$j$k$l$=Fqrm$n$o$p$q$r$s$rr?Ft$u$sr@Fv$[Ftrw$x$]Fury$z$^FvrA$B$C$wrD$E$F$G$H$I$xrJ$K$L$yrM$N$O$P$Q$zrR$S$T$U$ArV$W$X$Y$Z$_F0$Br1$2$Cr`F3$)g4$Dr{F5$6$7$8$|FEr9$}FFr!$~FGr#$aGHr$$%$IrJrKrLr'$MrNrOrdz($Prwh]yxh^yyhjz)$*$+$,$-$.$/$:$;$=$?$bG@$[$]$^$_$`${$|$}$~$Qra%b%Rrc%d%e%cGf%g%h%i%j%k%l%m%n%o%p%q%Srr%dGeGTrs%t%u%fGv%w%UrgGVrx%WrhGiGy%j 9e4cz%*gA%+gB%,gXrC%D%E%jGYrF%G%H%kGZrlG0rI%J%K%L%M%N%O%P%1rQ%2rR%3rS%4rmG5rnG6roG7rpG8rqGrG9rsG!r#r$r%r'r(rtGT%)r*ruGU%vGwG+r,rxG-ryGV%W%.rX%zGY%/rZ%0%1%:r2%3%;r4%5%6%7%8%9%=r!%#%$%AG?rBG@rCG[rDG]rNL^rEG_r%%FG`rGG{rHG|rIG'%JG}r(%~r)%KGas*%LGbs+%MG,%-%csNGOG.%ds/%:%esPGfs;%=%?%QGgs@%[%]%RGhs^%_%`%{%SGisTGjsUGksVGlsWGmsXGYGnsosZGps0Gqs1Grs2Gss3G4G5Gtsus6G7Gvs8Gws|%}%9Gxs~%a'ysb'!G#G$Gzs%GAsBs'Gc'Csd'e'f'(G)GDsg'h'i'*GEsj'k'l'Fsm'+GGsn',G-Go'p'Hsq'Is.Gr'Jss'/GKs:Gt'Lsu';Gv'w'x'Ms=G?Gy'z'NsA'B'@GC'OsD'E'[GPsF'G']GH'I'QsJ'K'^GRsL'_GSsM'N'O'P'`GQ'TsR'S'T'U'{GV'UsW'X'Y'Z'|GVs0'1'2'3'}G4'5'6'Ws7'XsYsZs0s1s~G2saH3s4s8'bH5scH6s9'dH7seHfH8s!'gH9s#'hH!siH#sjH$skH%s$''slH%'''(')'(s*'+','mH-'.'/')s:';'='nH?'@'[']'^'_'`'{'|'oH*s}'~'a(+spHb(,sqHc(-s.sd(rHe(sHf(ogMfg(5ch(tH/si(uHj(k(Ebl(m(:sn(o(p(q(r(;ss(=st(u(v(w(x(?sy(@sz(A([s6cvHB(]sC(D(wHE(^sxH_sF(G(`sH(I(J(K(L({sM(|spg}sN(O(~s7c8c9cP(Q(R(S(T(U(V(W(e atbtctX(dtetftyHgtY(zHAHht-gqgrgsgtgitZ(0(1(BH2(3(4(jtzhkt!c#cCH5(ltDHULIL4Lmt$c%cntugot6(ptEHvg7(8(.g5L'c(c)cqt9(!(#($(%('((()(*(+(,(-(.(rt/(:(;(=(?(@([(](^(_(`({(|(}(~(a)stb)c)d)e)ttf)g)uth)vti)j)k)wtl)m)n)xto)p)q)r)s)t)u)v)w)x)y)z)A)B)C)D)E)F)ytG)H)ztFHI)J)K)L)AtM)N)O)P)Q)R)S)T)U)V)W)X)Y)Z)0)1)2)3)4)5)6)Bt7)8)Ct9)Ah_yDtGHEt!)#)wgBh$)%)')()))Ft*)+)HH,)-).)Gt/)HtIH:)ItxgJtKt;)=)?)@)[)LtJHMtW ? X Y Z 0 1 @ NtKHygOtLHPt])Qt^)RtMH_)`){)|)})~)a*Stb*c*NH*c+cOHTtd*e*PHUtf*Vtg*QHh*~gi*WtRHzgXtSHYtTHFbGbHb2 3 IbZtUH0tj*1tVH2tk*l*m*n*Ago*p*q*r*s*t*u*v*w*x*y*z*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*0*1*2*3*4*5*6*7*8*9*!*#*$*%*'*(*)***+*,*-*.*/*:*;*=*?*@*[*]*^*_*`*{*|*}*~*WH3ta+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+A+B+C+D+,c-c.c[ /c:c] ;c=c?c4tE+Bg5tXH6tYHCgF+G+H+I+7tJ+K+ZH8tL+M+N+O+P+Q+R+S+9tDg!t0HT+U+V+W+X+Y+Z+0+1+2+3+4+5+#t1H6+7+8+9+!+#+$+%+'+(+)+*+++,+-+.+/+:+;+=+?+@+[+$t]+^+%t_+'t`+{+|+}+~+(ta,2H)t@c*tb,c,d,e,[c]c^cbbJb_c+t`c{cKb4 3H,tf,4H-tg,5H.th,6H/ti,7H:tj,8H;tk,9H=tl,!H?tm,#H@tn,$H[to,%H]tp,'H^tq,(H_tr,s,t,)H`tu,v,w,*H{tx,y,z,+H|tA,B,,H}tC,D,-H~tE,F,.HauG,H,/HbuI,J,:HcuK,L,;HduM,N,O,P,Q,R,S,eu=HT,U,fu?HV,@HguW,X,Y,Z,0,1,[Hhu2,3,4,5,6,7,8,iu]H9,!,ju^H#,_Hku$,%,`Hlu',(,{Hmu),*,+,nu,,-,.,/,:,;,ou=,?,@,pu[,],^,_,`,qu{,|,},~,rua-b-c-d-e-|Hf-sug-h-tu}Hi-/gj-uu~Hk-l-m-n-aIvuo-bIwup-cIxuq-dIyur-s-zuAuBuCut-DuEuFuezu-GuCh`yDh{yEhkzv-w-x-y-z-A-B-C-D-E-F-eIG-H-I-J-K-L-M-N-O-P-HuQ-R-IuS-T-U-fIV-W-X-Y-Z-0-1-2-3-4-5-6-Ju7-gIhIKu8-9-!-iI#-$-LujIMu%-NukIlI'-k cf|c(-:g)-;g*-=gOu+-,---mIPu.-/-:-nIQuoIRu;-=-?-@-[-]-^-_-Su`-Tu{-Uu|-VupIWuqIXurIYusIZutIuI0uvI1u2u3u4u5u6uwI}-7u8uxI~-yIzI9u!uAI#uBIa.b.$uc.CId.%ue.f.g.'uh.i.(uj.k.l.m.n.o.)up.q.r.DI*uEI+uFI,uGI-uOL.uHI/us.II:uJI;uKI=uLIt.MI?uu.@uv.NI[uw.OI]ux.PIy.z.^uQIRIA._uB.C.`uSI{uD.E.F.TI|uG.H.I.UI}uJ.K.L.M.VI~uWIavXIbvYIcvZIdv0I1Ievfv2Igv3Ihv4Iiv5Ijv6I7I8Ikvlv9I!Imv#InvN.O.$IovP.Q.pvR.%I'I(Iqv)Irvsv*IS.tvT.U.V.+I,IuvW.X.Y.-IvvZ.0.1.wv2..Ixv3./I:I4.5.yv6.zv;I7.Av8.=IBv?I9.Cv!.@I#.$.%.Dv[I]I'.(.Ev).*.^I+.Fv,.-._IGv../.`I:.;.Hv=.?.{IIv@.|IJv[.].^._.}I`.Kv{.|.}.~.~Ia/Lvb/c/d/e/aJMvf/g/h/i/bJj/k/l/Nvm/OvPvQvRvSvcJTvdJUvVvn/eJWvfJXvo/gJYvhJiJZvp/jJ0vq/kJ1vlJ2vmJ3vnJ4vr/5voJs/t/u/v/6vw/x/y/pJz/A/B/7vC/D/E/qJF/G/H/I/J/K/L/M/N/rJ8vO/P/Q/9vsJR/!vtJS/#v$vT/uJU/vJV/EgNfW/}cX/wJ%vY/xJZ/0/Lb1/2/'v3/4/5/6/7/(v8/)v9/!/#/$/%/*v'/+v(/)/,v~cyJ*/-v+/,/zJ-/.vAJ/v.///:v:/;/=/?/@/;v[/=vFg?v]/^/@vadbdcd_/`/{/|/}/~/a:b:f [v]v^vc:_v`v{vBJ|vd:CJDJ}v?gGgHgIgJg~ve:f:g:EJh:i:j:awFhbwddedFJk:cwGJVLJL6LdwfdgdewKgfwl:gwHJLgm:n:@g7Lhdidjdhwo:p:q:r:s:t:u:v:w:x:y:z:A:iwB:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:jwR:S:T:U:kwV:W:lwX:mwY:Z:0:nw1:2:3:ow4:5:6:7:8:9:!:#:$:%:':(:):*:+:,:-:.:pw/:::qwIJ;:=:?:@:rw[:]:^:_:`:{:|:}:~:a;b;c;d;e;f;g;h;i;j;k;l;swm;n;two;Gh|yuwJJvwp;q;MgHhr;s;t;u;v;www;x;KJy;z;A;xwB;ywLJC;zwNgAwBwD;E;F;G;H;CwMJDw5 ^ 6 7 8 9 ! _ EwNJOgFwOJGwI;HwJ;IwPJK;L;M;N;O;P;Q;JwR;S;QJkdldRJKwT;U;SJLwV;MwW;TJX;ahY;NwUJPgOwVJPwWJMbNbOb# $ PbQwXJRwZ;SwYJTw0;1;2;3;Qg4;5;6;7;8;9;!;#;$;%;';(;);*;+;,;-;.;/;:;;;=;?;@;[;];^;_;`;{;|;};~;a=b=c=d=e=f=g=h=i=j=k=l=m=n=o=p=q=r=s=t=u=v=w=x=y=z=A=B=C=D=E=F=G=H=I=J=K=L=M=N=O=P=ZJUwQ=R=S=T=U=V=W=X=Y=Z=0=1=2=3=4=5=6=7=8=9=!=#=$=%='=(=)=*=+=,=mdndod` pdqd{ rdsdtdVw-=RgWw0JXw1JSg.=/=:=;=Yw==?=2JZw@=[=]=^=_=`={=|=0wTg1w3J}=~=a?b?c?d?e?f?g?h?i?j?k?2w4Jl?m?n?o?p?q?r?s?t?u?v?w?x?y?z?A?B?C?D?E?F?G?H?3wI?J?4wK?5wL?M?N?O?P?6wQ?5J7wud8wR?S?T?U?vdwdxdcbQbyd9wzdAdRb% 6J!wV?7J#wW?8J$wX?9J%wY?!J'wZ?#J(w0?$J)w1?%J*w2?'J+w3?(J,w4?)J-w5?*J.w6?+J/w7?8?9?,J:w!?#?$?-J;w%?'?(?.J=w)?*?/J?w+?,?:J@w-?.?;J[w/?:?=J]w;?=??J^w??@?@J_w[?]?^?_?`?{?|?`w[J}?~?{w]Ja@^J|wb@c@d@e@f@g@_J}wh@i@j@k@l@m@n@~w`Jo@p@ax{Jq@|Jbxr@s@}Jcxt@u@~Jdxv@w@x@exy@z@A@B@C@D@fxE@F@G@gxH@I@J@K@L@hxM@N@O@P@ixQ@R@S@T@U@aKV@jxW@X@kxbKY@[gZ@lxcK0@1@2@3@dKmx4@eKnx5@fKox6@gKpx7@8@qxrxsxtx9@uxvxwxfz!@xxIh}yJh~yKhlz#@$@%@'@(@)@*@+@,@-@.@hK/@:@;@=@?@@@[@]@^@_@yx`@{@zx|@}@~@iKa[b[c[d[e[f[g[h[i[j[k[l[Axm[jKkKBxn[o[p[lKq[r[CxmKDxs[ExnKoKt[l GfBdu[]gv[^gw[_gFxx[y[z[pKGxA[B[C[qKHxrKIxD[E[F[G[H[I[J[K[JxL[KxM[LxN[MxsKNxtKOxuKPxvKQxwKxKRxyKSxTxUxVxWxXxzKO[YxZxAKP[BKCK0x1xDK2xEKQ[R[3xS[FKT[4xU[V[W[5xX[Y[6xZ[0[1[2[3[4[7x5[6[7[GK8xHK9xIK!xJK#xPL$xKK%x8[LK'xMK(xNK)xOK9[PK*x![+x#[QK,x$[RK-x%[SK'[([.xTKUK)[/x*[+[:xVK;x,[-[.[WK=x/[:[;[XK?x=[?[@[[[YK@xZK[x0K]x1K^x2K_x3K4K`x{x5K|x6K}x7K~x8Kay9K!K#Kbycy$K%Kdy'Key][^[(Kfy_[`[gy{[)K*K+Khy,Kiyjy-K|[ky}[~[a].K/Klyb]c]d]:Kmye]f]g]nyh];Koyi]=K?Kj]k]pyl]qy@Km]ryn][Ksy]Ko]typ]^Kq]r]s]uy_K`Kt]u]vyv]w]{Kx]wyy]z]|KxyA]B]}KC]D]yyE]F]~KzyG]aLAyH]I]J]K]bLL]ByM]N]O]P]cLQ]CyR]S]T]U]dLDyV]W]X]Y]eLZ]0]1]Ey2]FyGyHyIyJyfLKygLLyMy3]hLNyiLOy4]jLPykLlLQy5]mLRy6]nLSyoLTypLUyqLVy7]WyrL8]9]!]#]Xy$]%]']sL(])]*]Yy+],]-]tL.]/]:];]=]?]@][]]]uLZy^]_]`]0yvL{]1ywL|]2y3y}]xL~]yLa^UgOfb^Cdc^zL4yd^ALe^f^Sbg^h^5yi^j^k^l^m^6yn^7yo^p^q^r^s^8yt^9yu^v^!yDdBLw^#yx^y^CLz^$yDL%yA^B^'yC^D^E^F^G^(yH^)yVg*yI^J^+yEdFdGdK^L^M^N^O^P^Q^R^
1132 scope["root_path"] = self.root_path 2ch,yeh-yfh.yghgzih/ykh:ylh;ymhhzoh=yqh?yrh@yshizuh[ywh]yxh^yyhjzAh_yCh`yDh{yEhkzGh|yIh}yJh~yKhlz
1133 await super().__call__(scope, receive, send) 2a LhMhNh8LOhPhQhmzRh9LnzozShWgPfQfRfSfTh!L#L$Lpz%L'L(LUhbhVhTbUbqz)LWhrzQLELWLXhVbWbYhTfZh*L0hszUf+L,LXgXLXbYbZb1h-L.L/L:L;L=L?L@L[L]L^L_L`L2h{L|L}L~LaMbMcMdMeMfMgMhMiMjMkMlM3hmMnMoMpM4hqMrM5hsM6htMuMvM7hwMxMyM8hzMAMBMCMDMEMFMGMHMIMJMKMLMMMNMOMPMQM9hRMSM!htzTMUMVMWM#hXMYMZM0M1M2M3M4M5M6M7M8M9M!M#M$M%M'M(M)M*M$h+M,M%h-Mch,y'huz(h.M/MVfdh:M;M=M?M@M)h[M]Mvz^M_M`M*h{M+hwz|M,hWf-h.h}M~MaNbNcN/hxz:hm ' n o p q r ( ;hyzXf=hzz?hdN@heN[hAzfNgNhNiNjNkNlN]hmNnNBz0b1bCz^hoNpNDz_hqN`hrNEzsN`gtN{hFzYf|hGz}hHzdbebfbs t gb~hIzaiuNbiJzcivNwNxNyNZfzNANBNCNDNENFNGNHNINJNKNLNMNNNONPNQNRNSNTNUNVNWNXNYNZN0N1N2N3N4N5N6N7N8N9N!N#N$N%N'N(N)N*N+N,N-N.N/N:N;N=N?N@N[N]N^N_N`N{N|N}N~NaObOcOdOeOfOgOhOiOjOkOKzdilOmOnOoOpOqOrOsOtOuOvOwOxOyOzOAOBOCODOEOFOGOHOIOJOKOLOMONOOO2b3beiPO0ffiLzgiMz1fQOROSOTOhiUOVONziiWOXOYOZO0O1O2O3Oji2fkiOz4O5O6O7O8O9O!O#O$O%O'O(O)OliPz*O+O,O-O.O/O:O;O=O?O@O[O]O^O_O`O{O|O}O~OaPbPcPmidPePnifPoigPhPiPjPkPpilPQzqi4brimPnPoPpP5b6b7b| hb8bsi9b!bibu RztiqPSzuirPTzvisPUzwitPVzxiuPWzyivPXzziwPYzAixPZzBiyP0zCizP1zDiAP2zEiBP3zFiCPDPEP4zGiFPGPHP5zHiIPJPKP6zIiLPMP7zJiNPOP8zKiPPQP9zLiRPSP!zMiTPUP#zNiVPWP$zOiXPYPZP0P1P2P3PPi%z4P5PQi'z6P(zRi7P8P9P!P#P$P)zSi%P'P(P)P*P+P,PTi*z-P.PUi+z/P,zVi:P;P-zWi=P?P.zXi@P[P]PYi^P_P`P{P|P}PZi~PaQbQ0icQdQeQfQgQ1ihQiQjQkQ2ilQmQnQoQpQ/zqQ3irQsQ4i:ztQYguQ5i;zvQwQxQyQ=z6izQ?z7iAQ@z8iBQ[z9iCQDQ!i#i$i%iEQ'i(i)iazFQ*ieh-yfh.yghgzGQHQIQJQKQLQMQNQOQPQQQ]zRQSQTQUQVQWQXQYQZQ0Q+i1Q2Q,i3Q4Q5Q^z6Q7Q8Q9Q!Q#Q$Q%Q'Q(Q)Q*Q-i+Q_z`z.i,Q-Q.Q{z/Q:Q/i|z:i;Q;i}z~z=Qg 8d#b?QZg@Q0g[Q1g=i]Q^Q_QaA?i`Q{Q|QbA@icA[i}Q~QaRbRcRdReRfR]igR^ihR_iiR`idA{ieA|ifA}igA~ihAiAajjAbjcjdjejfjgjkAjRhjijlAkRmAnAjjkjoAljpAlRmRmjnRqAoRnjpRqRrRojsRtRpjuRvRwRxRyRzRqjARBRCRrArjsAsjtAtjuAujKLvjvAwjDRwAxjxAyjyAzjzAERAAAjFRBjGRBACjHRCADjIRDAJRKREjEAFALRFjMRNRGjGAHjORPRQRHAIjRRSRTRIAJjURVRWRXRJAKjKALjLAMjMANjNAOjOAPAPjQjQARjRASjSATjTAUjUAVAWAVjWjXAYAXjZAYjYRZR0AZj0R1R0j2R1A2A3A1j4A2j3j5A3R4j4R5R6R6A7A5j7R8R9R8A6j!R#R$R7j%R9A8j'R!A#A(R)R9j*R!j$A+R#j,R%A$j'A-R%j.R(A/R:R;R'j)A*A=R?R(j@R[R+A]R)j^R_R,A*j`R{R-A|R}R+j~RaS.A,jbS/A-jcSdSeSfS:AgS.jhSiSjSkS;AlS/jmSnSoSpS=A:jqSrSsStS?AuSvSwS;jxS=j?j@j[j]j@A^j[A_j`jyS]A{j^A|jzS_A}j`A{A~jAS|AakBS}Abk~AckaBdkbBekCSfkcBDSESFSGSgkHSISJSdBKSLSMShkNSOSPSeBQSRSSSTSUSVSWSXSYSfBikZS0S1SjkgB2SkkhB3Slkmk4SiB5SjB6S3fJf7S$b8SkBnk9SlB!S#Sjb$S%Sok'S(S)S*S+Spk,Sqk-S.S/S:S;Srk=S?SskmB@Stk[S]SnB^SukoBvk_S`Swk{S|S}S~SaTxkbTyk4fzkcTdTAk%b'b(beTfTgThTiTjTkTlTb BkCkDkmTEkFkGkpBHknTqBrBIk2g5f6f7f8fJkoTpTqTsBrTsTtTKkhhLk)b*btBuTMkuBRLFLYLNk+b,bOk9fPkvTQkvB!fwTxT3gZL-b.b/bRkyTzTATBTCTDTETFTGTHTITJTKTSkLTMTNTOTPTQTRTSTTTUTVTWTXTYTZT0TTk1T2T3T4TUk5T6TVk7TWk8T9T!TXk#T$T%TYk'T(T)T*T+T,T-T.T/T:T;T=T?T@T[T]T^T_TZk`T{T0kwB|T}T~TaU1kbUcUdUeUfUgUhUiUjUkUlUmUnUoUpUqUrUsUtUuUvU2kwUxU3kyUih/y4kxB5kzUAU#fjhBUCUDUEUFU6kGUHUyBIUJUKU7kLU8kzBMU9k$f!k#kNUOUPUQURU$kAB%kv ) w x y z A * 'kBB%f(kCB)kSU*kTU+kDBUUVUWUXUYUZU0U,k1U2UEB:b;bFB-k3U4UGB.k5U/k6UHB7U{g8U:kIB'f;kJB=kKBkblbmbB C nb?kLB@k9U[kMB]k!U#U$U%U(f'U(U)U*U+U,U-U.U/U:U;U=U?U@U[U]U^U_U`U{U|U}U~UaVbVcVdVeVfVgVhViVjVkVlVmVnVoVpVqVrVsVtVuVvVwVxVyVzVAVBVCVDVEVFVGVHVIVJVKVLVMVNVOVPVQVRVSVTVUVVVWVXVYVZVNB^k0V1V2V3V4V5V6V7V8V9V!V#V$V%V'V(V)V*V+V,V-V.V/V:V;V=V?V@V[V]V=b?b_k^V)f`kOB{kPB*f_V`V{V|V|k}V~VQB}kaWbWcWdWeWfWgWhW~k+falRBiWjWkWlWmWnWoWpWqWrWsWtWuWblSBvWwWxWyWzWAWBWCWDWEWFWGWHWIWJWKWLWMWNWOWPWQWRWclSWTWdlUWelVWWWXWYWZWfl0WTBgl@bhl1W2W3W4W[b]b^b} ob_bil`b{bpbD UBjl5WVBkl6WWBll7WXBml8WYBnl9WZBol!W0Bpl#W1Bql$W2Brl%W3Bsl'W4Btl(W5Bul)W6Bvl*W+W,W7Bwl-W.W/W8Bxl:W;W=W9Byl?W@W!Bzl[W]W#BAl^W_W$BBl`W{W%BCl|W}W'BDl~WaX(BElbXcXdXeXfXgXhXFl)BiXjXGl*BkX+BHllXmXnXoXpXqX,BIlrXsXtXuXvXwXxXJl-ByXzXKl.BAX/BLlBXCX:BMlDXEX;BNlFXGXHXOlIXJXKXLXMXNXPlOXPXQXQlRXSXTXUXVXRlWXXXYXZXSl0X1X2X3X4X=B5XTl6X7XUl?B8X4g9XVl@B!X#X$X%X[BWl'X]BXl(X^BYl)X_BZl*X+X0l1l2l3l,X4l5l6lbz-X7lkh:ylh;ymhhz.X/X:X;X=X?X@X[X]X^X_X`B`X{X|X}X~XaYbYcYdYeY8lfYgY9lhYiYjY{BkYlYmYnYoYpYqYrYsYtYuYvY!lwY|B}B#lxYyYzY~BAYBY$laC%lCY'lbCcCDYh be|bEY5gFY6gGY7g(lHYIYJYdC)lKYLYMYeC*lfC+lNYOYPYQYRYSYTYUY,lVY-lWY.lXY/lgC:lhC;liC=ljC?lkClC@lmC[l]l^l_l`l{lnCYY|l}loCZYpCqC~lamrCbmsC0Y1Ycm2YtC3Ydm4Y5Y6Yem7Y8Yfm9Y!Y#Y$Y%Y'Ygm(Y)Y*YuChmvCimwCjmxCkmLLlmyCmm+YzCnmAComBCpmCC,YDCqm-Yrm.YECsm/YFCtm:YGC;Y=YumHCIC?Yvm@Y[YwmJCxm]Y^Y_YKCym`Y{Y|YLCzm}Y~YaZbZMCAmNCBmOCCmPCDmQCEmRCSCFmGmTCHmUCImVCJmWCKmXCYCZCLmMm0C1CNm2COmcZdZ3CPmeZfZQmgZ4C5C6CRm7CSmTm8ChZUmiZjZkZ9C!CVmlZmZnZ#CWmoZpZqZXmrZ$CYmsZ%C'CtZuZZmvZ0m(CwZ1mxZ)C2m*CyZ3mzZ+CAZBZCZ4m,C-CDZEZ5mFZGZ.CHZ6mIZJZ/C7mKZLZ:CMZNZ8mOZPZ;C9mQZ=C!mRZSZTZUZ?CVZ#mWZXZYZZZ@C0Z$m1Z2Z3Z4Z[C%m5Z6Z7Z8Z]C9Z!Z#Z'm$Z(m)m*m+m,m^C-m_C.m/m%Z`C:m{C;m'Z|C=m}C~C?m(ZaD@m)ZbD[mcD]mdD^meD_m*Z`mfD+Z,Z-Z.Z{m/Z:Z;ZgD=Z?Z@Z|m[Z]Z^ZhD_Z`Z{Z|Z}Z~Za0b0c0iD}md0e0f0~mjDg0ankDh0bncni0lDj0mDk0,fKfl0}bm0nDdnn0oDo0p0qbq0r0ens0t0u0v0w0fnx0gny0z0A0B0C0hnD0inE0F0jnpDG0knH0I0qDJ0lnrDmnK0L0nnM0N0O0P0Q0onR0pn-fqnS0T0rn~bacbcU0V0W0X0Y0Z00010c sntnun20vnwnxnsDyn30tDuDzn8g.f/f:f;fAn405060vD708090BnnhCnccdcwD!0DnxDSLGL0LEnecfcFn=fGn#0HnyD?f$0%09g1LgchcicIn'0(0)0*0+0,0-0.0/0:0;0=0?0Jn@0[0]0^0_0`0{0|0}0~0a1b1c1d1e1f1Kng1h1i1j1Lnk1l1Mnm1Nnn1o1p1Onq1r1s1Pnt1u1v1w1x1y1z1A1B1C1D1E1F1G1H1I1J1K1QnL1M1RnzDN1O1P1Q1SnR1S1T1U1V1W1X1Y1Z101112131415161718191!1#1Tn$1%1Un'1oh=yVnADWn(1)1@fph*1+1,1-1.1Xn/1:1BD;1=1?1Yn@1ZnCD[10n[f1n2n]1^1_1`1{13nDD4nE + F G H I J , 5nED]f6nFD7n|18n}19nGD~1a2b2c2d2e2f2!ng2h2HDjckcID#ni2j2JD$nk2%nl2KDm2|gn2'nLD^f(nMD)nNDrbsbtbK L ub*nOD+no2,nPD-np2q2r2s2_ft2u2v2w2x2y2z2A2B2C2D2E2F2G2H2I2J2K2L2M2N2O2P2Q2R2S2T2U2V2W2X2Y2Z202122232425262728292!2#2$2%2'2(2)2*2+2,2-2.2/2:2;2=2?2@2[2]2^2_2`2{2|2}2~2a3b3c3d3e3QD.nf3g3h3i3j3k3l3m3n3o3p3q3r3s3t3u3v3w3x3y3z3A3B3C3D3E3F3G3H3I3lcmcnc- ocpc. qcrcsc/nJ3`f:nRD;nSD{fK3L3M3N3=nO3P3TD?nQ3R3S3T3U3V3W3X3@n|f[nUDY3Z303132333435363738393!3]nVD#3$3%3'3(3)3*3+3,3-3.3/3:3;3=3?3@3[3]3^3_3`3{3^n|3}3_n~3`na4b4c4d4e4{nf4WD|ntc}ng4h4i4j4ucvcwc~ vbxc~nyczcwbM XDaok4YDbol4ZDcom40Ddon41Deoo42Dfop43Dgoq44Dhor45Dios46Djot47Dkou48Dlov49Dmow4x4y4!Dnoz4A4B4#DooC4D4E4$DpoF4G4%DqoH4I4'DroJ4K4(DsoL4M4)DtoN4O4*DuoP4Q4+DvoR4S4T4U4V4W4X4wo,DY4Z4xo-D04.Dyo142434445464/Dzo748494!4#4$4%4Ao:D'4(4Bo;D)4=DCo*4+4?DDo,4-4@DEo.4/4:4Fo;4=4?4@4[4]4Go^4_4`4Ho{4|4}4~4a5Iob5c5d5e5Jof5g5h5i5j5[Dk5Kol5m5Lo]Dn5!go5Mo^Dp5q5r5s5_DNot5`DOou5{DPov5|DQow5x5RoSoToUoy5VoWoXoczz5Yoqh?yrh@yshizA5B5C5D5E5F5G5H5I5J5K5}DL5M5N5O5P5Q5R5S5T5U5ZoV5W50oX5Y5Z5~D05152535455565758595!5#51o$5aEbE2o%5'5(5cE)5*53odE4o+55oeEfE,5i FeAc-5#g.5$g/5%g6o:5;5=5gE7o?5@5[5hE8oiE9o]5^5_5`5{5|5}5~5!oa6#ob6$oc6%ojE'okE(olE)omE*onEoE+opE,o-o.o/o:o;oqEd6=o?orEe6sEtE@o[ouE]ovEf6g6^oh6wEi6_oj6k6l6`om6n6{oo6p6q6r6s6t6|ou6v6w6xE}oyE~ozEapAEbpMLcpBEdpx6CEepDEfpEEgpFEy6GEhpz6ipA6HEjpB6IEkpC6JED6E6lpKELEF6mpG6H6npMEopI6J6K6NEppL6M6N6OEqpO6P6Q6R6PErpQEspREtpSEupTEvpUEVEwpxpWEypXEzpYEApZEBp0E1E2ECpDp3E4EEp5EFpS6T66EGpU6V6HpW67E8E9EIp!EJpKp#EX6LpY6Z606$E%EMp162636'ENp465666Op76(EPp86)E*E96!6Qp#6Rp+E$6Sp%6,ETp-E'6Up(6.E)6*6+6Vp/E:E,6-6Wp.6/6;E:6Xp;6=6=EYp?6@6?E[6]6Zp^6_6@E0p`6[E1p{6|6}6~6]Ea72pb7c7d7e7^Ef73pg7h7i7j7_E4pk7l7m7n7`Eo7p7q75pr76p7p8p9p!p{E#p|E$p%ps7}E'p~E(pt7aF)pbFcF*pu7dF+pv7eF,pfF-pgF.phF/pw7:piFx7y7z7A7;pB7C7D7jFE7F7G7=pH7I7J7kFK7L7M7N7O7P7Q7R7S7lF?pT7U7V7@pmFW7[pnFX7]p^pY7oFZ7pF07}fLf17Bc27qF_p37rF4757xb6777`p8797!7#7$7{p%7|p'7(7)7*7+7}p,7~p-7.7aqCcsF/7bq:7;7tF=7cquFdq?7@7eq[7]7^7_7`7fq{7gq~fhq|7}7iqDcEcFc~7a8b8c8d8e8f8g8d jqkqlqh8mqnqoqvFpqi8wFxFqq'gagbgcgdgrqj8k8l8yFm8n8o8sqthtqGcHczFp8uqAFTLHL2LvqIcJcwqegxqq8yqBFfgr8s8(g3LKcLcMczqt8u8v8w8x8y8z8A8B8C8D8E8F8AqG8H8I8J8K8L8M8N8O8P8Q8R8S8T8U8V8BqW8X8Y8Z8Cq0818Dq28Eq384858Fq687888Gq98!8#8$8%8'8(8)8*8+8,8-8.8/8:8;8=8?8Hq@8[8IqCF]8^8_8`8Jq{8|8}8~8a9b9c9d9e9f9g9h9i9j9k9l9m9n9o9p9q9Kqr9s9Lqt9uh[yMqDFNqu9v9ggvhw9x9y9z9A9OqB9C9EFD9E9F9PqG9QqFFH9RqhgSqTqI9J9K9L9M9UqGFVqN / O P Q R S : WqHFigXqIFYqN9ZqO90qJFP9Q9R9S9T9U9V91qW9X9KFNcOcLF2qY9Z9MF3q094q19NF29}g395qOFjg6qPF7qQFybzbAbT U Bb8qRF9q49!qSF#q59697989kg99!9#9$9%9'9(9)9*9+9,9-9.9/9:9;9=9?9@9[9]9^9_9`9{9|9}9~9a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!p!q!r!s!t!u!v!w!x!y!z!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!TF$qV!W!X!Y!Z!0!1!2!3!4!5!6!7!8!9!!!#!$!%!'!(!)!*!+!,!-!.!/!:!;!PcQcRc; ScTc= UcVcWc%q=!lg'qUF(qVFmg?!@![!]!)q^!_!WF*q`!{!|!}!~!a#b#c#+qng,qXFd#e#f#g#h#i#j#k#l#m#n#o#p#-qYFq#r#s#t#u#v#w#x#y#z#A#B#C#D#E#F#G#H#I#J#K#L#M#.qN#O#/qP#:qQ#R#S#T#U#;qV#ZF=qXc?qW#X#Y#Z#YcZc0cabCb1c@q2c3cDbV 0F[q0#1F]q1#2F^q2#3F_q3#4F`q4#5F{q5#6F|q6#7F}q7#8F~q8#9Far9#!Fbr!##Fcr##$Fdr$#%#'#%Fer(#)#*#'Ffr+#,#-#(Fgr.#/#)Fhr:#;#*Fir=#?#+Fjr@#[#,Fkr]#^#-Flr_#`#.Fmr{#|#}#~#a$b$c$nr/Fd$e$or:Ff$;Fprg$h$i$j$k$l$=Fqrm$n$o$p$q$r$s$rr?Ft$u$sr@Fv$[Ftrw$x$]Fury$z$^FvrA$B$C$wrD$E$F$G$H$I$xrJ$K$L$yrM$N$O$P$Q$zrR$S$T$U$ArV$W$X$Y$Z$_F0$Br1$2$Cr`F3$)g4$Dr{F5$6$7$8$|FEr9$}FFr!$~FGr#$aGHr$$%$IrJrKrLr'$MrNrOrdz($Prwh]yxh^yyhjz)$*$+$,$-$.$/$:$;$=$?$bG@$[$]$^$_$`${$|$}$~$Qra%b%Rrc%d%e%cGf%g%h%i%j%k%l%m%n%o%p%q%Srr%dGeGTrs%t%u%fGv%w%UrgGVrx%WrhGiGy%j 9e4cz%*gA%+gB%,gXrC%D%E%jGYrF%G%H%kGZrlG0rI%J%K%L%M%N%O%P%1rQ%2rR%3rS%4rmG5rnG6roG7rpG8rqGrG9rsG!r#r$r%r'r(rtGT%)r*ruGU%vGwG+r,rxG-ryGV%W%.rX%zGY%/rZ%0%1%:r2%3%;r4%5%6%7%8%9%=r!%#%$%AG?rBG@rCG[rDG]rNL^rEG_r%%FG`rGG{rHG|rIG'%JG}r(%~r)%KGas*%LGbs+%MG,%-%csNGOG.%ds/%:%esPGfs;%=%?%QGgs@%[%]%RGhs^%_%`%{%SGisTGjsUGksVGlsWGmsXGYGnsosZGps0Gqs1Grs2Gss3G4G5Gtsus6G7Gvs8Gws|%}%9Gxs~%a'ysb'!G#G$Gzs%GAsBs'Gc'Csd'e'f'(G)GDsg'h'i'*GEsj'k'l'Fsm'+GGsn',G-Go'p'Hsq'Is.Gr'Jss'/GKs:Gt'Lsu';Gv'w'x'Ms=G?Gy'z'NsA'B'@GC'OsD'E'[GPsF'G']GH'I'QsJ'K'^GRsL'_GSsM'N'O'P'`GQ'TsR'S'T'U'{GV'UsW'X'Y'Z'|GVs0'1'2'3'}G4'5'6'Ws7'XsYsZs0s1s~G2saH3s4s8'bH5scH6s9'dH7seHfH8s!'gH9s#'hH!siH#sjH$skH%s$''slH%'''(')'(s*'+','mH-'.'/')s:';'='nH?'@'[']'^'_'`'{'|'oH*s}'~'a(+spHb(,sqHc(-s.sd(rHe(sHf(ogMfg(5ch(tH/si(uHj(k(Ebl(m(:sn(o(p(q(r(;ss(=st(u(v(w(x(?sy(@sz(A([s6cvHB(]sC(D(wHE(^sxH_sF(G(`sH(I(J(K(L({sM(|spg}sN(O(~s7c8c9cP(Q(R(S(T(U(V(W(e atbtctX(dtetftyHgtY(zHAHht-gqgrgsgtgitZ(0(1(BH2(3(4(jtzhkt!c#cCH5(ltDHULIL4Lmt$c%cntugot6(ptEHvg7(8(.g5L'c(c)cqt9(!(#($(%('((()(*(+(,(-(.(rt/(:(;(=(?(@([(](^(_(`({(|(}(~(a)stb)c)d)e)ttf)g)uth)vti)j)k)wtl)m)n)xto)p)q)r)s)t)u)v)w)x)y)z)A)B)C)D)E)F)ytG)H)ztFHI)J)K)L)AtM)N)O)P)Q)R)S)T)U)V)W)X)Y)Z)0)1)2)3)4)5)6)Bt7)8)Ct9)Ah_yDtGHEt!)#)wgBh$)%)')()))Ft*)+)HH,)-).)Gt/)HtIH:)ItxgJtKt;)=)?)@)[)LtJHMtW ? X Y Z 0 1 @ NtKHygOtLHPt])Qt^)RtMH_)`){)|)})~)a*Stb*c*NH*c+cOHTtd*e*PHUtf*Vtg*QHh*~gi*WtRHzgXtSHYtTHFbGbHb2 3 IbZtUH0tj*1tVH2tk*l*m*n*Ago*p*q*r*s*t*u*v*w*x*y*z*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*0*1*2*3*4*5*6*7*8*9*!*#*$*%*'*(*)***+*,*-*.*/*:*;*=*?*@*[*]*^*_*`*{*|*}*~*WH3ta+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+t+u+v+w+x+y+z+A+B+C+D+,c-c.c[ /c:c] ;c=c?c4tE+Bg5tXH6tYHCgF+G+H+I+7tJ+K+ZH8tL+M+N+O+P+Q+R+S+9tDg!t0HT+U+V+W+X+Y+Z+0+1+2+3+4+5+#t1H6+7+8+9+!+#+$+%+'+(+)+*+++,+-+.+/+:+;+=+?+@+[+$t]+^+%t_+'t`+{+|+}+~+(ta,2H)t@c*tb,c,d,e,[c]c^cbbJb_c+t`c{cKb4 3H,tf,4H-tg,5H.th,6H/ti,7H:tj,8H;tk,9H=tl,!H?tm,#H@tn,$H[to,%H]tp,'H^tq,(H_tr,s,t,)H`tu,v,w,*H{tx,y,z,+H|tA,B,,H}tC,D,-H~tE,F,.HauG,H,/HbuI,J,:HcuK,L,;HduM,N,O,P,Q,R,S,eu=HT,U,fu?HV,@HguW,X,Y,Z,0,1,[Hhu2,3,4,5,6,7,8,iu]H9,!,ju^H#,_Hku$,%,`Hlu',(,{Hmu),*,+,nu,,-,.,/,:,;,ou=,?,@,pu[,],^,_,`,qu{,|,},~,rua-b-c-d-e-|Hf-sug-h-tu}Hi-/gj-uu~Hk-l-m-n-aIvuo-bIwup-cIxuq-dIyur-s-zuAuBuCut-DuEuFuezu-GuCh`yDh{yEhkzv-w-x-y-z-A-B-C-D-E-F-eIG-H-I-J-K-L-M-N-O-P-HuQ-R-IuS-T-U-fIV-W-X-Y-Z-0-1-2-3-4-5-6-Ju7-gIhIKu8-9-!-iI#-$-LujIMu%-NukIlI'-k cf|c(-:g)-;g*-=gOu+-,---mIPu.-/-:-nIQuoIRu;-=-?-@-[-]-^-_-Su`-Tu{-Uu|-VupIWuqIXurIYusIZutIuI0uvI1u2u3u4u5u6uwI}-7u8uxI~-yIzI9u!uAI#uBIa.b.$uc.CId.%ue.f.g.'uh.i.(uj.k.l.m.n.o.)up.q.r.DI*uEI+uFI,uGI-uOL.uHI/us.II:uJI;uKI=uLIt.MI?uu.@uv.NI[uw.OI]ux.PIy.z.^uQIRIA._uB.C.`uSI{uD.E.F.TI|uG.H.I.UI}uJ.K.L.M.VI~uWIavXIbvYIcvZIdv0I1Ievfv2Igv3Ihv4Iiv5Ijv6I7I8Ikvlv9I!Imv#InvN.O.$IovP.Q.pvR.%I'I(Iqv)Irvsv*IS.tvT.U.V.+I,IuvW.X.Y.-IvvZ.0.1.wv2..Ixv3./I:I4.5.yv6.zv;I7.Av8.=IBv?I9.Cv!.@I#.$.%.Dv[I]I'.(.Ev).*.^I+.Fv,.-._IGv../.`I:.;.Hv=.?.{IIv@.|IJv[.].^._.}I`.Kv{.|.}.~.~Ia/Lvb/c/d/e/aJMvf/g/h/i/bJj/k/l/Nvm/OvPvQvRvSvcJTvdJUvVvn/eJWvfJXvo/gJYvhJiJZvp/jJ0vq/kJ1vlJ2vmJ3vnJ4vr/5voJs/t/u/v/6vw/x/y/pJz/A/B/7vC/D/E/qJF/G/H/I/J/K/L/M/N/rJ8vO/P/Q/9vsJR/!vtJS/#v$vT/uJU/vJV/EgNfW/}cX/wJ%vY/xJZ/0/Lb1/2/'v3/4/5/6/7/(v8/)v9/!/#/$/%/*v'/+v(/)/,v~cyJ*/-v+/,/zJ-/.vAJ/v.///:v:/;/=/?/@/;v[/=vFg?v]/^/@vadbdcd_/`/{/|/}/~/a:b:f [v]v^vc:_v`v{vBJ|vd:CJDJ}v?gGgHgIgJg~ve:f:g:EJh:i:j:awFhbwddedFJk:cwGJVLJL6LdwfdgdewKgfwl:gwHJLgm:n:@g7Lhdidjdhwo:p:q:r:s:t:u:v:w:x:y:z:A:iwB:C:D:E:F:G:H:I:J:K:L:M:N:O:P:Q:jwR:S:T:U:kwV:W:lwX:mwY:Z:0:nw1:2:3:ow4:5:6:7:8:9:!:#:$:%:':(:):*:+:,:-:.:pw/:::qwIJ;:=:?:@:rw[:]:^:_:`:{:|:}:~:a;b;c;d;e;f;g;h;i;j;k;l;swm;n;two;Gh|yuwJJvwp;q;MgHhr;s;t;u;v;www;x;KJy;z;A;xwB;ywLJC;zwNgAwBwD;E;F;G;H;CwMJDw5 ^ 6 7 8 9 ! _ EwNJOgFwOJGwI;HwJ;IwPJK;L;M;N;O;P;Q;JwR;S;QJkdldRJKwT;U;SJLwV;MwW;TJX;ahY;NwUJPgOwVJPwWJMbNbOb# $ PbQwXJRwZ;SwYJTw0;1;2;3;Qg4;5;6;7;8;9;!;#;$;%;';(;);*;+;,;-;.;/;:;;;=;?;@;[;];^;_;`;{;|;};~;a=b=c=d=e=f=g=h=i=j=k=l=m=n=o=p=q=r=s=t=u=v=w=x=y=z=A=B=C=D=E=F=G=H=I=J=K=L=M=N=O=P=ZJUwQ=R=S=T=U=V=W=X=Y=Z=0=1=2=3=4=5=6=7=8=9=!=#=$=%='=(=)=*=+=,=mdndod` pdqd{ rdsdtdVw-=RgWw0JXw1JSg.=/=:=;=Yw==?=2JZw@=[=]=^=_=`={=|=0wTg1w3J}=~=a?b?c?d?e?f?g?h?i?j?k?2w4Jl?m?n?o?p?q?r?s?t?u?v?w?x?y?z?A?B?C?D?E?F?G?H?3wI?J?4wK?5wL?M?N?O?P?6wQ?5J7wud8wR?S?T?U?vdwdxdcbQbyd9wzdAdRb% 6J!wV?7J#wW?8J$wX?9J%wY?!J'wZ?#J(w0?$J)w1?%J*w2?'J+w3?(J,w4?)J-w5?*J.w6?+J/w7?8?9?,J:w!?#?$?-J;w%?'?(?.J=w)?*?/J?w+?,?:J@w-?.?;J[w/?:?=J]w;?=??J^w??@?@J_w[?]?^?_?`?{?|?`w[J}?~?{w]Ja@^J|wb@c@d@e@f@g@_J}wh@i@j@k@l@m@n@~w`Jo@p@ax{Jq@|Jbxr@s@}Jcxt@u@~Jdxv@w@x@exy@z@A@B@C@D@fxE@F@G@gxH@I@J@K@L@hxM@N@O@P@ixQ@R@S@T@U@aKV@jxW@X@kxbKY@[gZ@lxcK0@1@2@3@dKmx4@eKnx5@fKox6@gKpx7@8@qxrxsxtx9@uxvxwxfz!@xxIh}yJh~yKhlz#@$@%@'@(@)@*@+@,@-@.@hK/@:@;@=@?@@@[@]@^@_@yx`@{@zx|@}@~@iKa[b[c[d[e[f[g[h[i[j[k[l[Axm[jKkKBxn[o[p[lKq[r[CxmKDxs[ExnKoKt[l GfBdu[]gv[^gw[_gFxx[y[z[pKGxA[B[C[qKHxrKIxD[E[F[G[H[I[J[K[JxL[KxM[LxN[MxsKNxtKOxuKPxvKQxwKxKRxyKSxTxUxVxWxXxzKO[YxZxAKP[BKCK0x1xDK2xEKQ[R[3xS[FKT[4xU[V[W[5xX[Y[6xZ[0[1[2[3[4[7x5[6[7[GK8xHK9xIK!xJK#xPL$xKK%x8[LK'xMK(xNK)xOK9[PK*x![+x#[QK,x$[RK-x%[SK'[([.xTKUK)[/x*[+[:xVK;x,[-[.[WK=x/[:[;[XK?x=[?[@[[[YK@xZK[x0K]x1K^x2K_x3K4K`x{x5K|x6K}x7K~x8Kay9K!K#Kbycy$K%Kdy'Key][^[(Kfy_[`[gy{[)K*K+Khy,Kiyjy-K|[ky}[~[a].K/Klyb]c]d]:Kmye]f]g]nyh];Koyi]=K?Kj]k]pyl]qy@Km]ryn][Ksy]Ko]typ]^Kq]r]s]uy_K`Kt]u]vyv]w]{Kx]wyy]z]|KxyA]B]}KC]D]yyE]F]~KzyG]aLAyH]I]J]K]bLL]ByM]N]O]P]cLQ]CyR]S]T]U]dLDyV]W]X]Y]eLZ]0]1]Ey2]FyGyHyIyJyfLKygLLyMy3]hLNyiLOy4]jLPykLlLQy5]mLRy6]nLSyoLTypLUyqLVy7]WyrL8]9]!]#]Xy$]%]']sL(])]*]Yy+],]-]tL.]/]:];]=]?]@][]]]uLZy^]_]`]0yvL{]1ywL|]2y3y}]xL~]yLa^UgOfb^Cdc^zL4yd^ALe^f^Sbg^h^5yi^j^k^l^m^6yn^7yo^p^q^r^s^8yt^9yu^v^!yDdBLw^#yx^y^CLz^$yDL%yA^B^'yC^D^E^F^G^(yH^)yVg*yI^J^+yEdFdGdK^L^M^N^O^P^Q^R^
1135 def add_api_route( 1abcdef
1136 self,
1137 path: str,
1138 endpoint: Callable[..., Any],
1139 *,
1140 response_model: Any = Default(None),
1141 status_code: Optional[int] = None,
1142 tags: Optional[List[Union[str, Enum]]] = None,
1143 dependencies: Optional[Sequence[Depends]] = None,
1144 summary: Optional[str] = None,
1145 description: Optional[str] = None,
1146 response_description: str = "Successful Response",
1147 responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
1148 deprecated: Optional[bool] = None,
1149 methods: Optional[List[str]] = None,
1150 operation_id: Optional[str] = None,
1151 response_model_include: Optional[IncEx] = None,
1152 response_model_exclude: Optional[IncEx] = None,
1153 response_model_by_alias: bool = True,
1154 response_model_exclude_unset: bool = False,
1155 response_model_exclude_defaults: bool = False,
1156 response_model_exclude_none: bool = False,
1157 include_in_schema: bool = True,
1158 response_class: Union[Type[Response], DefaultPlaceholder] = Default(
1159 JSONResponse
1160 ),
1161 name: Optional[str] = None,
1162 openapi_extra: Optional[Dict[str, Any]] = None,
1163 generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
1164 generate_unique_id
1165 ),
1166 ) -> None:
1167 self.router.add_api_route( 1abcdef
1168 path,
1169 endpoint=endpoint,
1170 response_model=response_model,
1171 status_code=status_code,
1172 tags=tags,
1173 dependencies=dependencies,
1174 summary=summary,
1175 description=description,
1176 response_description=response_description,
1177 responses=responses,
1178 deprecated=deprecated,
1179 methods=methods,
1180 operation_id=operation_id,
1181 response_model_include=response_model_include,
1182 response_model_exclude=response_model_exclude,
1183 response_model_by_alias=response_model_by_alias,
1184 response_model_exclude_unset=response_model_exclude_unset,
1185 response_model_exclude_defaults=response_model_exclude_defaults,
1186 response_model_exclude_none=response_model_exclude_none,
1187 include_in_schema=include_in_schema,
1188 response_class=response_class,
1189 name=name,
1190 openapi_extra=openapi_extra,
1191 generate_unique_id_function=generate_unique_id_function,
1192 )
1194 def api_route( 1abcdef
1195 self,
1196 path: str,
1197 *,
1198 response_model: Any = Default(None),
1199 status_code: Optional[int] = None,
1200 tags: Optional[List[Union[str, Enum]]] = None,
1201 dependencies: Optional[Sequence[Depends]] = None,
1202 summary: Optional[str] = None,
1203 description: Optional[str] = None,
1204 response_description: str = "Successful Response",
1205 responses: Optional[Dict[Union[int, str], Dict[str, Any]]] = None,
1206 deprecated: Optional[bool] = None,
1207 methods: Optional[List[str]] = None,
1208 operation_id: Optional[str] = None,
1209 response_model_include: Optional[IncEx] = None,
1210 response_model_exclude: Optional[IncEx] = None,
1211 response_model_by_alias: bool = True,
1212 response_model_exclude_unset: bool = False,
1213 response_model_exclude_defaults: bool = False,
1214 response_model_exclude_none: bool = False,
1215 include_in_schema: bool = True,
1216 response_class: Type[Response] = Default(JSONResponse),
1217 name: Optional[str] = None,
1218 openapi_extra: Optional[Dict[str, Any]] = None,
1219 generate_unique_id_function: Callable[[routing.APIRoute], str] = Default(
1220 generate_unique_id
1221 ),
1222 ) -> Callable[[DecoratedCallable], DecoratedCallable]:
1223 def decorator(func: DecoratedCallable) -> DecoratedCallable: 1abcdef
1224 self.router.add_api_route( 1abcdef
1225 path,
1226 func,
1227 response_model=response_model,
1228 status_code=status_code,
1229 tags=tags,
1230 dependencies=dependencies,
1231 summary=summary,
1232 description=description,
1233 response_description=response_description,
1234 responses=responses,
1235 deprecated=deprecated,
1236 methods=methods,
1237 operation_id=operation_id,
1238 response_model_include=response_model_include,
1239 response_model_exclude=response_model_exclude,
1240 response_model_by_alias=response_model_by_alias,
1241 response_model_exclude_unset=response_model_exclude_unset,
1242 response_model_exclude_defaults=response_model_exclude_defaults,
1243 response_model_exclude_none=response_model_exclude_none,
1244 include_in_schema=include_in_schema,
1245 response_class=response_class,
1246 name=name,
1247 openapi_extra=openapi_extra,
1248 generate_unique_id_function=generate_unique_id_function,
1249 )
1250 return func 1abcdef
1252 return decorator 1abcdef
1254 def add_api_websocket_route( 1abcdef
1255 self,
1256 path: str,
1257 endpoint: Callable[..., Any],
1258 name: Optional[str] = None,
1259 *,
1260 dependencies: Optional[Sequence[Depends]] = None,
1261 ) -> None:
1262 self.router.add_api_websocket_route( 1abcdef
1263 path,
1264 endpoint,
1265 name=name,
1266 dependencies=dependencies,
1267 )
1269 def websocket( 1abcdef
1270 self,
1271 path: Annotated[
1272 str,
1273 Doc(
1274 """
1275 WebSocket path.
1276 """
1277 ),
1278 ],
1279 name: Annotated[
1280 Optional[str],
1281 Doc(
1282 """
1283 A name for the WebSocket. Only used internally.
1284 """
1285 ),
1286 ] = None,
1287 *,
1288 dependencies: Annotated[
1289 Optional[Sequence[Depends]],
1290 Doc(
1291 """
1292 A list of dependencies (using `Depends()`) to be used for this
1293 WebSocket.
1295 Read more about it in the
1296 [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/).
1297 """
1298 ),
1299 ] = None,
1300 ) -> Callable[[DecoratedCallable], DecoratedCallable]:
1301 """
1302 Decorate a WebSocket function.
1304 Read more about it in the
1305 [FastAPI docs for WebSockets](https://fastapi.tiangolo.com/advanced/websockets/).
1307 **Example**
1309 ```python
1310 from fastapi import FastAPI, WebSocket
1312 app = FastAPI()
1314 @app.websocket("/ws")
1315 async def websocket_endpoint(websocket: WebSocket):
1316 await websocket.accept()
1317 while True:
1318 data = await websocket.receive_text()
1319 await websocket.send_text(f"Message text was: {data}")
1320 ```
1321 """
1323 def decorator(func: DecoratedCallable) -> DecoratedCallable: 1abcdef
1324 self.add_api_websocket_route( 1abcdef
1325 path,
1326 func,
1327 name=name,
1328 dependencies=dependencies,
1329 )
1330 return func 1abcdef
1332 return decorator 1abcdef
1334 def include_router( 1abcdef
1335 self,
1336 router: Annotated[routing.APIRouter, Doc("The `APIRouter` to include.")],
1337 *,
1338 prefix: Annotated[str, Doc("An optional path prefix for the router.")] = "",
1339 tags: Annotated[
1340 Optional[List[Union[str, Enum]]],
1341 Doc(
1342 """
1343 A list of tags to be applied to all the *path operations* in this
1344 router.
1346 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
1348 Read more about it in the
1349 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
1350 """
1351 ),
1352 ] = None,
1353 dependencies: Annotated[
1354 Optional[Sequence[Depends]],
1355 Doc(
1356 """
1357 A list of dependencies (using `Depends()`) to be applied to all the
1358 *path operations* in this router.
1360 Read more about it in the
1361 [FastAPI docs for Bigger Applications - Multiple Files](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies).
1363 **Example**
1365 ```python
1366 from fastapi import Depends, FastAPI
1368 from .dependencies import get_token_header
1369 from .internal import admin
1371 app = FastAPI()
1373 app.include_router(
1374 admin.router,
1375 dependencies=[Depends(get_token_header)],
1376 )
1377 ```
1378 """
1379 ),
1380 ] = None,
1381 responses: Annotated[
1382 Optional[Dict[Union[int, str], Dict[str, Any]]],
1383 Doc(
1384 """
1385 Additional responses to be shown in OpenAPI.
1387 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
1389 Read more about it in the
1390 [FastAPI docs for Additional Responses in OpenAPI](https://fastapi.tiangolo.com/advanced/additional-responses/).
1392 And in the
1393 [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/#include-an-apirouter-with-a-custom-prefix-tags-responses-and-dependencies).
1394 """
1395 ),
1396 ] = None,
1397 deprecated: Annotated[
1398 Optional[bool],
1399 Doc(
1400 """
1401 Mark all the *path operations* in this router as deprecated.
1403 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
1405 **Example**
1407 ```python
1408 from fastapi import FastAPI
1410 from .internal import old_api
1412 app = FastAPI()
1414 app.include_router(
1415 old_api.router,
1416 deprecated=True,
1417 )
1418 ```
1419 """
1420 ),
1421 ] = None,
1422 include_in_schema: Annotated[
1423 bool,
1424 Doc(
1425 """
1426 Include (or not) all the *path operations* in this router in the
1427 generated OpenAPI schema.
1429 This affects the generated OpenAPI (e.g. visible at `/docs`).
1431 **Example**
1433 ```python
1434 from fastapi import FastAPI
1436 from .internal import old_api
1438 app = FastAPI()
1440 app.include_router(
1441 old_api.router,
1442 include_in_schema=False,
1443 )
1444 ```
1445 """
1446 ),
1447 ] = True,
1448 default_response_class: Annotated[
1449 Type[Response],
1450 Doc(
1451 """
1452 Default response class to be used for the *path operations* in this
1453 router.
1455 Read more in the
1456 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#default-response-class).
1458 **Example**
1460 ```python
1461 from fastapi import FastAPI
1462 from fastapi.responses import ORJSONResponse
1464 from .internal import old_api
1466 app = FastAPI()
1468 app.include_router(
1469 old_api.router,
1470 default_response_class=ORJSONResponse,
1471 )
1472 ```
1473 """
1474 ),
1475 ] = Default(JSONResponse),
1476 callbacks: Annotated[
1477 Optional[List[BaseRoute]],
1478 Doc(
1479 """
1480 List of *path operations* that will be used as OpenAPI callbacks.
1482 This is only for OpenAPI documentation, the callbacks won't be used
1483 directly.
1485 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
1487 Read more about it in the
1488 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
1489 """
1490 ),
1491 ] = None,
1492 generate_unique_id_function: Annotated[
1493 Callable[[routing.APIRoute], str],
1494 Doc(
1495 """
1496 Customize the function used to generate unique IDs for the *path
1497 operations* shown in the generated OpenAPI.
1499 This is particularly useful when automatically generating clients or
1500 SDKs for your API.
1502 Read more about it in the
1503 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
1504 """
1505 ),
1506 ] = Default(generate_unique_id),
1507 ) -> None:
1508 """
1509 Include an `APIRouter` in the same app.
1511 Read more about it in the
1512 [FastAPI docs for Bigger Applications](https://fastapi.tiangolo.com/tutorial/bigger-applications/).
1514 ## Example
1516 ```python
1517 from fastapi import FastAPI
1519 from .users import users_router
1521 app = FastAPI()
1523 app.include_router(users_router)
1524 ```
1525 """
1526 self.router.include_router( 2a UbS^m n o p q r 6b7b| hb8b9b!b%b'b(bb *bT^v w x y z A ]b^b} ob_b`b{b~bacbcc dcU^E F G H I J vcwc~ vbxcyczcDcEcFcd HcV^N O P Q R S Zc0cabCb1c2c3c7c8c9ce #cW^W X Y Z 0 1 ]c^cbbJb_c`c{cadbdcdf edX^5 6 7 8 9 ! wdxdcbQbydzdAdEdFdGd
1527 router,
1528 prefix=prefix,
1529 tags=tags,
1530 dependencies=dependencies,
1531 responses=responses,
1532 deprecated=deprecated,
1533 include_in_schema=include_in_schema,
1534 default_response_class=default_response_class,
1535 callbacks=callbacks,
1536 generate_unique_id_function=generate_unique_id_function,
1537 )
1539 def get( 1abcdef
1540 self,
1541 path: Annotated[
1542 str,
1543 Doc(
1544 """
1545 The URL path to be used for this *path operation*.
1547 For example, in `http://example.com/items`, the path is `/items`.
1548 """
1549 ),
1550 ],
1551 *,
1552 response_model: Annotated[
1553 Any,
1554 Doc(
1555 """
1556 The type to use for the response.
1558 It could be any valid Pydantic *field* type. So, it doesn't have to
1559 be a Pydantic model, it could be other things, like a `list`, `dict`,
1560 etc.
1562 It will be used for:
1564 * Documentation: the generated OpenAPI (and the UI at `/docs`) will
1565 show it as the response (JSON Schema).
1566 * Serialization: you could return an arbitrary object and the
1567 `response_model` would be used to serialize that object into the
1568 corresponding JSON.
1569 * Filtering: the JSON sent to the client will only contain the data
1570 (fields) defined in the `response_model`. If you returned an object
1571 that contains an attribute `password` but the `response_model` does
1572 not include that field, the JSON sent to the client would not have
1573 that `password`.
1574 * Validation: whatever you return will be serialized with the
1575 `response_model`, converting any data as necessary to generate the
1576 corresponding JSON. But if the data in the object returned is not
1577 valid, that would mean a violation of the contract with the client,
1578 so it's an error from the API developer. So, FastAPI will raise an
1579 error and return a 500 error code (Internal Server Error).
1581 Read more about it in the
1582 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
1583 """
1584 ),
1585 ] = Default(None),
1586 status_code: Annotated[
1587 Optional[int],
1588 Doc(
1589 """
1590 The default status code to be used for the response.
1592 You could override the status code by returning a response directly.
1594 Read more about it in the
1595 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
1596 """
1597 ),
1598 ] = None,
1599 tags: Annotated[
1600 Optional[List[Union[str, Enum]]],
1601 Doc(
1602 """
1603 A list of tags to be applied to the *path operation*.
1605 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
1607 Read more about it in the
1608 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
1609 """
1610 ),
1611 ] = None,
1612 dependencies: Annotated[
1613 Optional[Sequence[Depends]],
1614 Doc(
1615 """
1616 A list of dependencies (using `Depends()`) to be applied to the
1617 *path operation*.
1619 Read more about it in the
1620 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
1621 """
1622 ),
1623 ] = None,
1624 summary: Annotated[
1625 Optional[str],
1626 Doc(
1627 """
1628 A summary for the *path operation*.
1630 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
1632 Read more about it in the
1633 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
1634 """
1635 ),
1636 ] = None,
1637 description: Annotated[
1638 Optional[str],
1639 Doc(
1640 """
1641 A description for the *path operation*.
1643 If not provided, it will be extracted automatically from the docstring
1644 of the *path operation function*.
1646 It can contain Markdown.
1648 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
1650 Read more about it in the
1651 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
1652 """
1653 ),
1654 ] = None,
1655 response_description: Annotated[
1656 str,
1657 Doc(
1658 """
1659 The description for the default response.
1661 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
1662 """
1663 ),
1664 ] = "Successful Response",
1665 responses: Annotated[
1666 Optional[Dict[Union[int, str], Dict[str, Any]]],
1667 Doc(
1668 """
1669 Additional responses that could be returned by this *path operation*.
1671 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
1672 """
1673 ),
1674 ] = None,
1675 deprecated: Annotated[
1676 Optional[bool],
1677 Doc(
1678 """
1679 Mark this *path operation* as deprecated.
1681 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
1682 """
1683 ),
1684 ] = None,
1685 operation_id: Annotated[
1686 Optional[str],
1687 Doc(
1688 """
1689 Custom operation ID to be used by this *path operation*.
1691 By default, it is generated automatically.
1693 If you provide a custom operation ID, you need to make sure it is
1694 unique for the whole API.
1696 You can customize the
1697 operation ID generation with the parameter
1698 `generate_unique_id_function` in the `FastAPI` class.
1700 Read more about it in the
1701 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
1702 """
1703 ),
1704 ] = None,
1705 response_model_include: Annotated[
1706 Optional[IncEx],
1707 Doc(
1708 """
1709 Configuration passed to Pydantic to include only certain fields in the
1710 response data.
1712 Read more about it in the
1713 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
1714 """
1715 ),
1716 ] = None,
1717 response_model_exclude: Annotated[
1718 Optional[IncEx],
1719 Doc(
1720 """
1721 Configuration passed to Pydantic to exclude certain fields in the
1722 response data.
1724 Read more about it in the
1725 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
1726 """
1727 ),
1728 ] = None,
1729 response_model_by_alias: Annotated[
1730 bool,
1731 Doc(
1732 """
1733 Configuration passed to Pydantic to define if the response model
1734 should be serialized by alias when an alias is used.
1736 Read more about it in the
1737 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
1738 """
1739 ),
1740 ] = True,
1741 response_model_exclude_unset: Annotated[
1742 bool,
1743 Doc(
1744 """
1745 Configuration passed to Pydantic to define if the response data
1746 should have all the fields, including the ones that were not set and
1747 have their default values. This is different from
1748 `response_model_exclude_defaults` in that if the fields are set,
1749 they will be included in the response, even if the value is the same
1750 as the default.
1752 When `True`, default values are omitted from the response.
1754 Read more about it in the
1755 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
1756 """
1757 ),
1758 ] = False,
1759 response_model_exclude_defaults: Annotated[
1760 bool,
1761 Doc(
1762 """
1763 Configuration passed to Pydantic to define if the response data
1764 should have all the fields, including the ones that have the same value
1765 as the default. This is different from `response_model_exclude_unset`
1766 in that if the fields are set but contain the same default values,
1767 they will be excluded from the response.
1769 When `True`, default values are omitted from the response.
1771 Read more about it in the
1772 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
1773 """
1774 ),
1775 ] = False,
1776 response_model_exclude_none: Annotated[
1777 bool,
1778 Doc(
1779 """
1780 Configuration passed to Pydantic to define if the response data should
1781 exclude fields set to `None`.
1783 This is much simpler (less smart) than `response_model_exclude_unset`
1784 and `response_model_exclude_defaults`. You probably want to use one of
1785 those two instead of this one, as those allow returning `None` values
1786 when it makes sense.
1788 Read more about it in the
1789 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
1790 """
1791 ),
1792 ] = False,
1793 include_in_schema: Annotated[
1794 bool,
1795 Doc(
1796 """
1797 Include this *path operation* in the generated OpenAPI schema.
1799 This affects the generated OpenAPI (e.g. visible at `/docs`).
1801 Read more about it in the
1802 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
1803 """
1804 ),
1805 ] = True,
1806 response_class: Annotated[
1807 Type[Response],
1808 Doc(
1809 """
1810 Response class to be used for this *path operation*.
1812 This will not be used if you return a response directly.
1814 Read more about it in the
1815 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
1816 """
1817 ),
1818 ] = Default(JSONResponse),
1819 name: Annotated[
1820 Optional[str],
1821 Doc(
1822 """
1823 Name for this *path operation*. Only used internally.
1824 """
1825 ),
1826 ] = None,
1827 callbacks: Annotated[
1828 Optional[List[BaseRoute]],
1829 Doc(
1830 """
1831 List of *path operations* that will be used as OpenAPI callbacks.
1833 This is only for OpenAPI documentation, the callbacks won't be used
1834 directly.
1836 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
1838 Read more about it in the
1839 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
1840 """
1841 ),
1842 ] = None,
1843 openapi_extra: Annotated[
1844 Optional[Dict[str, Any]],
1845 Doc(
1846 """
1847 Extra metadata to be included in the OpenAPI schema for this *path
1848 operation*.
1850 Read more about it in the
1851 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
1852 """
1853 ),
1854 ] = None,
1855 generate_unique_id_function: Annotated[
1856 Callable[[routing.APIRoute], str],
1857 Doc(
1858 """
1859 Customize the function used to generate unique IDs for the *path
1860 operations* shown in the generated OpenAPI.
1862 This is particularly useful when automatically generating clients or
1863 SDKs for your API.
1865 Read more about it in the
1866 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
1867 """
1868 ),
1869 ] = Default(generate_unique_id),
1870 ) -> Callable[[DecoratedCallable], DecoratedCallable]:
1871 """
1872 Add a *path operation* using an HTTP GET operation.
1874 ## Example
1876 ```python
1877 from fastapi import FastAPI
1879 app = FastAPI()
1881 @app.get("/items/")
1882 def read_items():
1883 return [{"name": "Empanada"}, {"name": "Arepa"}]
1884 ```
1885 """
1886 return self.router.get( 2a bhY^TbYbZb0b1bHdIdJdKdLdMdNdOdPdQdRddbebfbs t gb3d4d5d6d7d4b5b| hbibu g 8d#b9d!d$bjbb hhZ^)b.b/b:b;b#d$d%d'd(d)d*d+d,d-d.dkblbmbB C nb{d|d}d~dae@b[b} obpbD h be|bcede}bqbc nh0^cchcicjckceefegeheiejekelemeneoerbsbtbK L ub. qcrcscAeBeCeDeEetcuc~ vbwbM i FeAcGeHeBcxbd th1^GcLcMcNcOcIeJeKeLeMeNeOePeQeReSeybzbAbT U Bb= UcVcWc4e5e6e7e8eXcYcabCbDbV j 9e4c!e#e5cEbe zh2^!c(c)c*c+c$e%e'e(e)e*e+e,e-e.e/eFbGbHb2 3 Ib] ;c=c?c|e}e~eafbf@c[cbbJbKb4 k cf|cdfef}cLbf Fh3^ddidjdkdldffgfhfifjfkflfmfnfofpfMbNbOb# $ Pb{ rdsdtdBfCfDfEfFfudvdcbQbRb% l GfBdHfIfCdSb
1887 path,
1888 response_model=response_model,
1889 status_code=status_code,
1890 tags=tags,
1891 dependencies=dependencies,
1892 summary=summary,
1893 description=description,
1894 response_description=response_description,
1895 responses=responses,
1896 deprecated=deprecated,
1897 operation_id=operation_id,
1898 response_model_include=response_model_include,
1899 response_model_exclude=response_model_exclude,
1900 response_model_by_alias=response_model_by_alias,
1901 response_model_exclude_unset=response_model_exclude_unset,
1902 response_model_exclude_defaults=response_model_exclude_defaults,
1903 response_model_exclude_none=response_model_exclude_none,
1904 include_in_schema=include_in_schema,
1905 response_class=response_class,
1906 name=name,
1907 callbacks=callbacks,
1908 openapi_extra=openapi_extra,
1909 generate_unique_id_function=generate_unique_id_function,
1910 )
1912 def put( 1abcdef
1913 self,
1914 path: Annotated[
1915 str,
1916 Doc(
1917 """
1918 The URL path to be used for this *path operation*.
1920 For example, in `http://example.com/items`, the path is `/items`.
1921 """
1922 ),
1923 ],
1924 *,
1925 response_model: Annotated[
1926 Any,
1927 Doc(
1928 """
1929 The type to use for the response.
1931 It could be any valid Pydantic *field* type. So, it doesn't have to
1932 be a Pydantic model, it could be other things, like a `list`, `dict`,
1933 etc.
1935 It will be used for:
1937 * Documentation: the generated OpenAPI (and the UI at `/docs`) will
1938 show it as the response (JSON Schema).
1939 * Serialization: you could return an arbitrary object and the
1940 `response_model` would be used to serialize that object into the
1941 corresponding JSON.
1942 * Filtering: the JSON sent to the client will only contain the data
1943 (fields) defined in the `response_model`. If you returned an object
1944 that contains an attribute `password` but the `response_model` does
1945 not include that field, the JSON sent to the client would not have
1946 that `password`.
1947 * Validation: whatever you return will be serialized with the
1948 `response_model`, converting any data as necessary to generate the
1949 corresponding JSON. But if the data in the object returned is not
1950 valid, that would mean a violation of the contract with the client,
1951 so it's an error from the API developer. So, FastAPI will raise an
1952 error and return a 500 error code (Internal Server Error).
1954 Read more about it in the
1955 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
1956 """
1957 ),
1958 ] = Default(None),
1959 status_code: Annotated[
1960 Optional[int],
1961 Doc(
1962 """
1963 The default status code to be used for the response.
1965 You could override the status code by returning a response directly.
1967 Read more about it in the
1968 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
1969 """
1970 ),
1971 ] = None,
1972 tags: Annotated[
1973 Optional[List[Union[str, Enum]]],
1974 Doc(
1975 """
1976 A list of tags to be applied to the *path operation*.
1978 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
1980 Read more about it in the
1981 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
1982 """
1983 ),
1984 ] = None,
1985 dependencies: Annotated[
1986 Optional[Sequence[Depends]],
1987 Doc(
1988 """
1989 A list of dependencies (using `Depends()`) to be applied to the
1990 *path operation*.
1992 Read more about it in the
1993 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
1994 """
1995 ),
1996 ] = None,
1997 summary: Annotated[
1998 Optional[str],
1999 Doc(
2000 """
2001 A summary for the *path operation*.
2003 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2005 Read more about it in the
2006 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
2007 """
2008 ),
2009 ] = None,
2010 description: Annotated[
2011 Optional[str],
2012 Doc(
2013 """
2014 A description for the *path operation*.
2016 If not provided, it will be extracted automatically from the docstring
2017 of the *path operation function*.
2019 It can contain Markdown.
2021 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2023 Read more about it in the
2024 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
2025 """
2026 ),
2027 ] = None,
2028 response_description: Annotated[
2029 str,
2030 Doc(
2031 """
2032 The description for the default response.
2034 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2035 """
2036 ),
2037 ] = "Successful Response",
2038 responses: Annotated[
2039 Optional[Dict[Union[int, str], Dict[str, Any]]],
2040 Doc(
2041 """
2042 Additional responses that could be returned by this *path operation*.
2044 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2045 """
2046 ),
2047 ] = None,
2048 deprecated: Annotated[
2049 Optional[bool],
2050 Doc(
2051 """
2052 Mark this *path operation* as deprecated.
2054 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2055 """
2056 ),
2057 ] = None,
2058 operation_id: Annotated[
2059 Optional[str],
2060 Doc(
2061 """
2062 Custom operation ID to be used by this *path operation*.
2064 By default, it is generated automatically.
2066 If you provide a custom operation ID, you need to make sure it is
2067 unique for the whole API.
2069 You can customize the
2070 operation ID generation with the parameter
2071 `generate_unique_id_function` in the `FastAPI` class.
2073 Read more about it in the
2074 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
2075 """
2076 ),
2077 ] = None,
2078 response_model_include: Annotated[
2079 Optional[IncEx],
2080 Doc(
2081 """
2082 Configuration passed to Pydantic to include only certain fields in the
2083 response data.
2085 Read more about it in the
2086 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
2087 """
2088 ),
2089 ] = None,
2090 response_model_exclude: Annotated[
2091 Optional[IncEx],
2092 Doc(
2093 """
2094 Configuration passed to Pydantic to exclude certain fields in the
2095 response data.
2097 Read more about it in the
2098 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
2099 """
2100 ),
2101 ] = None,
2102 response_model_by_alias: Annotated[
2103 bool,
2104 Doc(
2105 """
2106 Configuration passed to Pydantic to define if the response model
2107 should be serialized by alias when an alias is used.
2109 Read more about it in the
2110 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
2111 """
2112 ),
2113 ] = True,
2114 response_model_exclude_unset: Annotated[
2115 bool,
2116 Doc(
2117 """
2118 Configuration passed to Pydantic to define if the response data
2119 should have all the fields, including the ones that were not set and
2120 have their default values. This is different from
2121 `response_model_exclude_defaults` in that if the fields are set,
2122 they will be included in the response, even if the value is the same
2123 as the default.
2125 When `True`, default values are omitted from the response.
2127 Read more about it in the
2128 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
2129 """
2130 ),
2131 ] = False,
2132 response_model_exclude_defaults: Annotated[
2133 bool,
2134 Doc(
2135 """
2136 Configuration passed to Pydantic to define if the response data
2137 should have all the fields, including the ones that have the same value
2138 as the default. This is different from `response_model_exclude_unset`
2139 in that if the fields are set but contain the same default values,
2140 they will be excluded from the response.
2142 When `True`, default values are omitted from the response.
2144 Read more about it in the
2145 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
2146 """
2147 ),
2148 ] = False,
2149 response_model_exclude_none: Annotated[
2150 bool,
2151 Doc(
2152 """
2153 Configuration passed to Pydantic to define if the response data should
2154 exclude fields set to `None`.
2156 This is much simpler (less smart) than `response_model_exclude_unset`
2157 and `response_model_exclude_defaults`. You probably want to use one of
2158 those two instead of this one, as those allow returning `None` values
2159 when it makes sense.
2161 Read more about it in the
2162 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
2163 """
2164 ),
2165 ] = False,
2166 include_in_schema: Annotated[
2167 bool,
2168 Doc(
2169 """
2170 Include this *path operation* in the generated OpenAPI schema.
2172 This affects the generated OpenAPI (e.g. visible at `/docs`).
2174 Read more about it in the
2175 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
2176 """
2177 ),
2178 ] = True,
2179 response_class: Annotated[
2180 Type[Response],
2181 Doc(
2182 """
2183 Response class to be used for this *path operation*.
2185 This will not be used if you return a response directly.
2187 Read more about it in the
2188 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
2189 """
2190 ),
2191 ] = Default(JSONResponse),
2192 name: Annotated[
2193 Optional[str],
2194 Doc(
2195 """
2196 Name for this *path operation*. Only used internally.
2197 """
2198 ),
2199 ] = None,
2200 callbacks: Annotated[
2201 Optional[List[BaseRoute]],
2202 Doc(
2203 """
2204 List of *path operations* that will be used as OpenAPI callbacks.
2206 This is only for OpenAPI documentation, the callbacks won't be used
2207 directly.
2209 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2211 Read more about it in the
2212 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
2213 """
2214 ),
2215 ] = None,
2216 openapi_extra: Annotated[
2217 Optional[Dict[str, Any]],
2218 Doc(
2219 """
2220 Extra metadata to be included in the OpenAPI schema for this *path
2221 operation*.
2223 Read more about it in the
2224 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
2225 """
2226 ),
2227 ] = None,
2228 generate_unique_id_function: Annotated[
2229 Callable[[routing.APIRoute], str],
2230 Doc(
2231 """
2232 Customize the function used to generate unique IDs for the *path
2233 operations* shown in the generated OpenAPI.
2235 This is particularly useful when automatically generating clients or
2236 SDKs for your API.
2238 Read more about it in the
2239 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
2240 """
2241 ),
2242 ] = Default(generate_unique_id),
2243 ) -> Callable[[DecoratedCallable], DecoratedCallable]:
2244 """
2245 Add a *path operation* using an HTTP PUT operation.
2247 ## Example
2249 ```python
2250 from fastapi import FastAPI
2251 from pydantic import BaseModel
2253 class Item(BaseModel):
2254 name: str
2255 description: str | None = None
2257 app = FastAPI()
2259 @app.put("/items/{item_id}")
2260 def replace_item(item_id: str, item: Item):
2261 return {"message": "Item replaced", "id": item_id}
2262 ```
2263 """
2264 return self.router.put( 1abcdef
2265 path,
2266 response_model=response_model,
2267 status_code=status_code,
2268 tags=tags,
2269 dependencies=dependencies,
2270 summary=summary,
2271 description=description,
2272 response_description=response_description,
2273 responses=responses,
2274 deprecated=deprecated,
2275 operation_id=operation_id,
2276 response_model_include=response_model_include,
2277 response_model_exclude=response_model_exclude,
2278 response_model_by_alias=response_model_by_alias,
2279 response_model_exclude_unset=response_model_exclude_unset,
2280 response_model_exclude_defaults=response_model_exclude_defaults,
2281 response_model_exclude_none=response_model_exclude_none,
2282 include_in_schema=include_in_schema,
2283 response_class=response_class,
2284 name=name,
2285 callbacks=callbacks,
2286 openapi_extra=openapi_extra,
2287 generate_unique_id_function=generate_unique_id_function,
2288 )
2290 def post( 1abcdef
2291 self,
2292 path: Annotated[
2293 str,
2294 Doc(
2295 """
2296 The URL path to be used for this *path operation*.
2298 For example, in `http://example.com/items`, the path is `/items`.
2299 """
2300 ),
2301 ],
2302 *,
2303 response_model: Annotated[
2304 Any,
2305 Doc(
2306 """
2307 The type to use for the response.
2309 It could be any valid Pydantic *field* type. So, it doesn't have to
2310 be a Pydantic model, it could be other things, like a `list`, `dict`,
2311 etc.
2313 It will be used for:
2315 * Documentation: the generated OpenAPI (and the UI at `/docs`) will
2316 show it as the response (JSON Schema).
2317 * Serialization: you could return an arbitrary object and the
2318 `response_model` would be used to serialize that object into the
2319 corresponding JSON.
2320 * Filtering: the JSON sent to the client will only contain the data
2321 (fields) defined in the `response_model`. If you returned an object
2322 that contains an attribute `password` but the `response_model` does
2323 not include that field, the JSON sent to the client would not have
2324 that `password`.
2325 * Validation: whatever you return will be serialized with the
2326 `response_model`, converting any data as necessary to generate the
2327 corresponding JSON. But if the data in the object returned is not
2328 valid, that would mean a violation of the contract with the client,
2329 so it's an error from the API developer. So, FastAPI will raise an
2330 error and return a 500 error code (Internal Server Error).
2332 Read more about it in the
2333 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
2334 """
2335 ),
2336 ] = Default(None),
2337 status_code: Annotated[
2338 Optional[int],
2339 Doc(
2340 """
2341 The default status code to be used for the response.
2343 You could override the status code by returning a response directly.
2345 Read more about it in the
2346 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
2347 """
2348 ),
2349 ] = None,
2350 tags: Annotated[
2351 Optional[List[Union[str, Enum]]],
2352 Doc(
2353 """
2354 A list of tags to be applied to the *path operation*.
2356 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2358 Read more about it in the
2359 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
2360 """
2361 ),
2362 ] = None,
2363 dependencies: Annotated[
2364 Optional[Sequence[Depends]],
2365 Doc(
2366 """
2367 A list of dependencies (using `Depends()`) to be applied to the
2368 *path operation*.
2370 Read more about it in the
2371 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
2372 """
2373 ),
2374 ] = None,
2375 summary: Annotated[
2376 Optional[str],
2377 Doc(
2378 """
2379 A summary for the *path operation*.
2381 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2383 Read more about it in the
2384 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
2385 """
2386 ),
2387 ] = None,
2388 description: Annotated[
2389 Optional[str],
2390 Doc(
2391 """
2392 A description for the *path operation*.
2394 If not provided, it will be extracted automatically from the docstring
2395 of the *path operation function*.
2397 It can contain Markdown.
2399 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2401 Read more about it in the
2402 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
2403 """
2404 ),
2405 ] = None,
2406 response_description: Annotated[
2407 str,
2408 Doc(
2409 """
2410 The description for the default response.
2412 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2413 """
2414 ),
2415 ] = "Successful Response",
2416 responses: Annotated[
2417 Optional[Dict[Union[int, str], Dict[str, Any]]],
2418 Doc(
2419 """
2420 Additional responses that could be returned by this *path operation*.
2422 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2423 """
2424 ),
2425 ] = None,
2426 deprecated: Annotated[
2427 Optional[bool],
2428 Doc(
2429 """
2430 Mark this *path operation* as deprecated.
2432 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2433 """
2434 ),
2435 ] = None,
2436 operation_id: Annotated[
2437 Optional[str],
2438 Doc(
2439 """
2440 Custom operation ID to be used by this *path operation*.
2442 By default, it is generated automatically.
2444 If you provide a custom operation ID, you need to make sure it is
2445 unique for the whole API.
2447 You can customize the
2448 operation ID generation with the parameter
2449 `generate_unique_id_function` in the `FastAPI` class.
2451 Read more about it in the
2452 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
2453 """
2454 ),
2455 ] = None,
2456 response_model_include: Annotated[
2457 Optional[IncEx],
2458 Doc(
2459 """
2460 Configuration passed to Pydantic to include only certain fields in the
2461 response data.
2463 Read more about it in the
2464 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
2465 """
2466 ),
2467 ] = None,
2468 response_model_exclude: Annotated[
2469 Optional[IncEx],
2470 Doc(
2471 """
2472 Configuration passed to Pydantic to exclude certain fields in the
2473 response data.
2475 Read more about it in the
2476 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
2477 """
2478 ),
2479 ] = None,
2480 response_model_by_alias: Annotated[
2481 bool,
2482 Doc(
2483 """
2484 Configuration passed to Pydantic to define if the response model
2485 should be serialized by alias when an alias is used.
2487 Read more about it in the
2488 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
2489 """
2490 ),
2491 ] = True,
2492 response_model_exclude_unset: Annotated[
2493 bool,
2494 Doc(
2495 """
2496 Configuration passed to Pydantic to define if the response data
2497 should have all the fields, including the ones that were not set and
2498 have their default values. This is different from
2499 `response_model_exclude_defaults` in that if the fields are set,
2500 they will be included in the response, even if the value is the same
2501 as the default.
2503 When `True`, default values are omitted from the response.
2505 Read more about it in the
2506 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
2507 """
2508 ),
2509 ] = False,
2510 response_model_exclude_defaults: Annotated[
2511 bool,
2512 Doc(
2513 """
2514 Configuration passed to Pydantic to define if the response data
2515 should have all the fields, including the ones that have the same value
2516 as the default. This is different from `response_model_exclude_unset`
2517 in that if the fields are set but contain the same default values,
2518 they will be excluded from the response.
2520 When `True`, default values are omitted from the response.
2522 Read more about it in the
2523 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
2524 """
2525 ),
2526 ] = False,
2527 response_model_exclude_none: Annotated[
2528 bool,
2529 Doc(
2530 """
2531 Configuration passed to Pydantic to define if the response data should
2532 exclude fields set to `None`.
2534 This is much simpler (less smart) than `response_model_exclude_unset`
2535 and `response_model_exclude_defaults`. You probably want to use one of
2536 those two instead of this one, as those allow returning `None` values
2537 when it makes sense.
2539 Read more about it in the
2540 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
2541 """
2542 ),
2543 ] = False,
2544 include_in_schema: Annotated[
2545 bool,
2546 Doc(
2547 """
2548 Include this *path operation* in the generated OpenAPI schema.
2550 This affects the generated OpenAPI (e.g. visible at `/docs`).
2552 Read more about it in the
2553 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
2554 """
2555 ),
2556 ] = True,
2557 response_class: Annotated[
2558 Type[Response],
2559 Doc(
2560 """
2561 Response class to be used for this *path operation*.
2563 This will not be used if you return a response directly.
2565 Read more about it in the
2566 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
2567 """
2568 ),
2569 ] = Default(JSONResponse),
2570 name: Annotated[
2571 Optional[str],
2572 Doc(
2573 """
2574 Name for this *path operation*. Only used internally.
2575 """
2576 ),
2577 ] = None,
2578 callbacks: Annotated[
2579 Optional[List[BaseRoute]],
2580 Doc(
2581 """
2582 List of *path operations* that will be used as OpenAPI callbacks.
2584 This is only for OpenAPI documentation, the callbacks won't be used
2585 directly.
2587 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2589 Read more about it in the
2590 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
2591 """
2592 ),
2593 ] = None,
2594 openapi_extra: Annotated[
2595 Optional[Dict[str, Any]],
2596 Doc(
2597 """
2598 Extra metadata to be included in the OpenAPI schema for this *path
2599 operation*.
2601 Read more about it in the
2602 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
2603 """
2604 ),
2605 ] = None,
2606 generate_unique_id_function: Annotated[
2607 Callable[[routing.APIRoute], str],
2608 Doc(
2609 """
2610 Customize the function used to generate unique IDs for the *path
2611 operations* shown in the generated OpenAPI.
2613 This is particularly useful when automatically generating clients or
2614 SDKs for your API.
2616 Read more about it in the
2617 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
2618 """
2619 ),
2620 ] = Default(generate_unique_id),
2621 ) -> Callable[[DecoratedCallable], DecoratedCallable]:
2622 """
2623 Add a *path operation* using an HTTP POST operation.
2625 ## Example
2627 ```python
2628 from fastapi import FastAPI
2629 from pydantic import BaseModel
2631 class Item(BaseModel):
2632 name: str
2633 description: str | None = None
2635 app = FastAPI()
2637 @app.post("/items/")
2638 def create_item(item: Item):
2639 return {"message": "Item created"}
2640 ```
2641 """
2642 return self.router.post( 2a VbWbXbm ' n o p q r ( SdTdUdVdWdXdYdZd0d1d2ddbebfbs t gb2b3bibu b +b,b-bv ) w x y z A * /d:d;d=d?d@d[d]d^d_d`dkblbmbB C nb=b?bpbD c ecfcgcE + F G H I J , peqereseteuevewexeyezerbsbtbK L ublcmcnc- ocpcwbM Ccd IcJcKcN / O P Q R S : TeUeVeWeXeYeZe0e1e2e3eybzbAbT U BbPcQcRc; ScTcDbV 6ce $c%c'cW ? X Y Z 0 1 @ :e;e=e?e@e[e]e^e_e`e{eFbGbHb2 3 Ib,c-c.c[ /c:cKb4 ~cf fdgdhd5 ^ 6 7 8 9 ! _ qfrfsftfufvfwfxfyfzfAfMbNbOb# $ Pbmdndod` pdqdRb% Dd
2643 path,
2644 response_model=response_model,
2645 status_code=status_code,
2646 tags=tags,
2647 dependencies=dependencies,
2648 summary=summary,
2649 description=description,
2650 response_description=response_description,
2651 responses=responses,
2652 deprecated=deprecated,
2653 operation_id=operation_id,
2654 response_model_include=response_model_include,
2655 response_model_exclude=response_model_exclude,
2656 response_model_by_alias=response_model_by_alias,
2657 response_model_exclude_unset=response_model_exclude_unset,
2658 response_model_exclude_defaults=response_model_exclude_defaults,
2659 response_model_exclude_none=response_model_exclude_none,
2660 include_in_schema=include_in_schema,
2661 response_class=response_class,
2662 name=name,
2663 callbacks=callbacks,
2664 openapi_extra=openapi_extra,
2665 generate_unique_id_function=generate_unique_id_function,
2666 )
2668 def delete( 1abcdef
2669 self,
2670 path: Annotated[
2671 str,
2672 Doc(
2673 """
2674 The URL path to be used for this *path operation*.
2676 For example, in `http://example.com/items`, the path is `/items`.
2677 """
2678 ),
2679 ],
2680 *,
2681 response_model: Annotated[
2682 Any,
2683 Doc(
2684 """
2685 The type to use for the response.
2687 It could be any valid Pydantic *field* type. So, it doesn't have to
2688 be a Pydantic model, it could be other things, like a `list`, `dict`,
2689 etc.
2691 It will be used for:
2693 * Documentation: the generated OpenAPI (and the UI at `/docs`) will
2694 show it as the response (JSON Schema).
2695 * Serialization: you could return an arbitrary object and the
2696 `response_model` would be used to serialize that object into the
2697 corresponding JSON.
2698 * Filtering: the JSON sent to the client will only contain the data
2699 (fields) defined in the `response_model`. If you returned an object
2700 that contains an attribute `password` but the `response_model` does
2701 not include that field, the JSON sent to the client would not have
2702 that `password`.
2703 * Validation: whatever you return will be serialized with the
2704 `response_model`, converting any data as necessary to generate the
2705 corresponding JSON. But if the data in the object returned is not
2706 valid, that would mean a violation of the contract with the client,
2707 so it's an error from the API developer. So, FastAPI will raise an
2708 error and return a 500 error code (Internal Server Error).
2710 Read more about it in the
2711 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
2712 """
2713 ),
2714 ] = Default(None),
2715 status_code: Annotated[
2716 Optional[int],
2717 Doc(
2718 """
2719 The default status code to be used for the response.
2721 You could override the status code by returning a response directly.
2723 Read more about it in the
2724 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
2725 """
2726 ),
2727 ] = None,
2728 tags: Annotated[
2729 Optional[List[Union[str, Enum]]],
2730 Doc(
2731 """
2732 A list of tags to be applied to the *path operation*.
2734 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2736 Read more about it in the
2737 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
2738 """
2739 ),
2740 ] = None,
2741 dependencies: Annotated[
2742 Optional[Sequence[Depends]],
2743 Doc(
2744 """
2745 A list of dependencies (using `Depends()`) to be applied to the
2746 *path operation*.
2748 Read more about it in the
2749 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
2750 """
2751 ),
2752 ] = None,
2753 summary: Annotated[
2754 Optional[str],
2755 Doc(
2756 """
2757 A summary for the *path operation*.
2759 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2761 Read more about it in the
2762 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
2763 """
2764 ),
2765 ] = None,
2766 description: Annotated[
2767 Optional[str],
2768 Doc(
2769 """
2770 A description for the *path operation*.
2772 If not provided, it will be extracted automatically from the docstring
2773 of the *path operation function*.
2775 It can contain Markdown.
2777 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2779 Read more about it in the
2780 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
2781 """
2782 ),
2783 ] = None,
2784 response_description: Annotated[
2785 str,
2786 Doc(
2787 """
2788 The description for the default response.
2790 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2791 """
2792 ),
2793 ] = "Successful Response",
2794 responses: Annotated[
2795 Optional[Dict[Union[int, str], Dict[str, Any]]],
2796 Doc(
2797 """
2798 Additional responses that could be returned by this *path operation*.
2800 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2801 """
2802 ),
2803 ] = None,
2804 deprecated: Annotated[
2805 Optional[bool],
2806 Doc(
2807 """
2808 Mark this *path operation* as deprecated.
2810 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2811 """
2812 ),
2813 ] = None,
2814 operation_id: Annotated[
2815 Optional[str],
2816 Doc(
2817 """
2818 Custom operation ID to be used by this *path operation*.
2820 By default, it is generated automatically.
2822 If you provide a custom operation ID, you need to make sure it is
2823 unique for the whole API.
2825 You can customize the
2826 operation ID generation with the parameter
2827 `generate_unique_id_function` in the `FastAPI` class.
2829 Read more about it in the
2830 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
2831 """
2832 ),
2833 ] = None,
2834 response_model_include: Annotated[
2835 Optional[IncEx],
2836 Doc(
2837 """
2838 Configuration passed to Pydantic to include only certain fields in the
2839 response data.
2841 Read more about it in the
2842 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
2843 """
2844 ),
2845 ] = None,
2846 response_model_exclude: Annotated[
2847 Optional[IncEx],
2848 Doc(
2849 """
2850 Configuration passed to Pydantic to exclude certain fields in the
2851 response data.
2853 Read more about it in the
2854 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
2855 """
2856 ),
2857 ] = None,
2858 response_model_by_alias: Annotated[
2859 bool,
2860 Doc(
2861 """
2862 Configuration passed to Pydantic to define if the response model
2863 should be serialized by alias when an alias is used.
2865 Read more about it in the
2866 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
2867 """
2868 ),
2869 ] = True,
2870 response_model_exclude_unset: Annotated[
2871 bool,
2872 Doc(
2873 """
2874 Configuration passed to Pydantic to define if the response data
2875 should have all the fields, including the ones that were not set and
2876 have their default values. This is different from
2877 `response_model_exclude_defaults` in that if the fields are set,
2878 they will be included in the response, even if the value is the same
2879 as the default.
2881 When `True`, default values are omitted from the response.
2883 Read more about it in the
2884 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
2885 """
2886 ),
2887 ] = False,
2888 response_model_exclude_defaults: Annotated[
2889 bool,
2890 Doc(
2891 """
2892 Configuration passed to Pydantic to define if the response data
2893 should have all the fields, including the ones that have the same value
2894 as the default. This is different from `response_model_exclude_unset`
2895 in that if the fields are set but contain the same default values,
2896 they will be excluded from the response.
2898 When `True`, default values are omitted from the response.
2900 Read more about it in the
2901 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
2902 """
2903 ),
2904 ] = False,
2905 response_model_exclude_none: Annotated[
2906 bool,
2907 Doc(
2908 """
2909 Configuration passed to Pydantic to define if the response data should
2910 exclude fields set to `None`.
2912 This is much simpler (less smart) than `response_model_exclude_unset`
2913 and `response_model_exclude_defaults`. You probably want to use one of
2914 those two instead of this one, as those allow returning `None` values
2915 when it makes sense.
2917 Read more about it in the
2918 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
2919 """
2920 ),
2921 ] = False,
2922 include_in_schema: Annotated[
2923 bool,
2924 Doc(
2925 """
2926 Include this *path operation* in the generated OpenAPI schema.
2928 This affects the generated OpenAPI (e.g. visible at `/docs`).
2930 Read more about it in the
2931 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
2932 """
2933 ),
2934 ] = True,
2935 response_class: Annotated[
2936 Type[Response],
2937 Doc(
2938 """
2939 Response class to be used for this *path operation*.
2941 This will not be used if you return a response directly.
2943 Read more about it in the
2944 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
2945 """
2946 ),
2947 ] = Default(JSONResponse),
2948 name: Annotated[
2949 Optional[str],
2950 Doc(
2951 """
2952 Name for this *path operation*. Only used internally.
2953 """
2954 ),
2955 ] = None,
2956 callbacks: Annotated[
2957 Optional[List[BaseRoute]],
2958 Doc(
2959 """
2960 List of *path operations* that will be used as OpenAPI callbacks.
2962 This is only for OpenAPI documentation, the callbacks won't be used
2963 directly.
2965 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
2967 Read more about it in the
2968 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
2969 """
2970 ),
2971 ] = None,
2972 openapi_extra: Annotated[
2973 Optional[Dict[str, Any]],
2974 Doc(
2975 """
2976 Extra metadata to be included in the OpenAPI schema for this *path
2977 operation*.
2979 Read more about it in the
2980 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
2981 """
2982 ),
2983 ] = None,
2984 generate_unique_id_function: Annotated[
2985 Callable[[routing.APIRoute], str],
2986 Doc(
2987 """
2988 Customize the function used to generate unique IDs for the *path
2989 operations* shown in the generated OpenAPI.
2991 This is particularly useful when automatically generating clients or
2992 SDKs for your API.
2994 Read more about it in the
2995 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
2996 """
2997 ),
2998 ] = Default(generate_unique_id),
2999 ) -> Callable[[DecoratedCallable], DecoratedCallable]:
3000 """
3001 Add a *path operation* using an HTTP DELETE operation.
3003 ## Example
3005 ```python
3006 from fastapi import FastAPI
3008 app = FastAPI()
3010 @app.delete("/items/{item_id}")
3011 def delete_item(item_id: str):
3012 return {"message": "Item deleted"}
3013 ```
3014 """
3015 return self.router.delete( 1abcdef
3016 path,
3017 response_model=response_model,
3018 status_code=status_code,
3019 tags=tags,
3020 dependencies=dependencies,
3021 summary=summary,
3022 description=description,
3023 response_description=response_description,
3024 responses=responses,
3025 deprecated=deprecated,
3026 operation_id=operation_id,
3027 response_model_include=response_model_include,
3028 response_model_exclude=response_model_exclude,
3029 response_model_by_alias=response_model_by_alias,
3030 response_model_exclude_unset=response_model_exclude_unset,
3031 response_model_exclude_defaults=response_model_exclude_defaults,
3032 response_model_exclude_none=response_model_exclude_none,
3033 include_in_schema=include_in_schema,
3034 response_class=response_class,
3035 name=name,
3036 callbacks=callbacks,
3037 openapi_extra=openapi_extra,
3038 generate_unique_id_function=generate_unique_id_function,
3039 )
3041 def options( 1abcdef
3042 self,
3043 path: Annotated[
3044 str,
3045 Doc(
3046 """
3047 The URL path to be used for this *path operation*.
3049 For example, in `http://example.com/items`, the path is `/items`.
3050 """
3051 ),
3052 ],
3053 *,
3054 response_model: Annotated[
3055 Any,
3056 Doc(
3057 """
3058 The type to use for the response.
3060 It could be any valid Pydantic *field* type. So, it doesn't have to
3061 be a Pydantic model, it could be other things, like a `list`, `dict`,
3062 etc.
3064 It will be used for:
3066 * Documentation: the generated OpenAPI (and the UI at `/docs`) will
3067 show it as the response (JSON Schema).
3068 * Serialization: you could return an arbitrary object and the
3069 `response_model` would be used to serialize that object into the
3070 corresponding JSON.
3071 * Filtering: the JSON sent to the client will only contain the data
3072 (fields) defined in the `response_model`. If you returned an object
3073 that contains an attribute `password` but the `response_model` does
3074 not include that field, the JSON sent to the client would not have
3075 that `password`.
3076 * Validation: whatever you return will be serialized with the
3077 `response_model`, converting any data as necessary to generate the
3078 corresponding JSON. But if the data in the object returned is not
3079 valid, that would mean a violation of the contract with the client,
3080 so it's an error from the API developer. So, FastAPI will raise an
3081 error and return a 500 error code (Internal Server Error).
3083 Read more about it in the
3084 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
3085 """
3086 ),
3087 ] = Default(None),
3088 status_code: Annotated[
3089 Optional[int],
3090 Doc(
3091 """
3092 The default status code to be used for the response.
3094 You could override the status code by returning a response directly.
3096 Read more about it in the
3097 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
3098 """
3099 ),
3100 ] = None,
3101 tags: Annotated[
3102 Optional[List[Union[str, Enum]]],
3103 Doc(
3104 """
3105 A list of tags to be applied to the *path operation*.
3107 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3109 Read more about it in the
3110 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
3111 """
3112 ),
3113 ] = None,
3114 dependencies: Annotated[
3115 Optional[Sequence[Depends]],
3116 Doc(
3117 """
3118 A list of dependencies (using `Depends()`) to be applied to the
3119 *path operation*.
3121 Read more about it in the
3122 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
3123 """
3124 ),
3125 ] = None,
3126 summary: Annotated[
3127 Optional[str],
3128 Doc(
3129 """
3130 A summary for the *path operation*.
3132 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3134 Read more about it in the
3135 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
3136 """
3137 ),
3138 ] = None,
3139 description: Annotated[
3140 Optional[str],
3141 Doc(
3142 """
3143 A description for the *path operation*.
3145 If not provided, it will be extracted automatically from the docstring
3146 of the *path operation function*.
3148 It can contain Markdown.
3150 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3152 Read more about it in the
3153 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
3154 """
3155 ),
3156 ] = None,
3157 response_description: Annotated[
3158 str,
3159 Doc(
3160 """
3161 The description for the default response.
3163 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3164 """
3165 ),
3166 ] = "Successful Response",
3167 responses: Annotated[
3168 Optional[Dict[Union[int, str], Dict[str, Any]]],
3169 Doc(
3170 """
3171 Additional responses that could be returned by this *path operation*.
3173 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3174 """
3175 ),
3176 ] = None,
3177 deprecated: Annotated[
3178 Optional[bool],
3179 Doc(
3180 """
3181 Mark this *path operation* as deprecated.
3183 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3184 """
3185 ),
3186 ] = None,
3187 operation_id: Annotated[
3188 Optional[str],
3189 Doc(
3190 """
3191 Custom operation ID to be used by this *path operation*.
3193 By default, it is generated automatically.
3195 If you provide a custom operation ID, you need to make sure it is
3196 unique for the whole API.
3198 You can customize the
3199 operation ID generation with the parameter
3200 `generate_unique_id_function` in the `FastAPI` class.
3202 Read more about it in the
3203 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
3204 """
3205 ),
3206 ] = None,
3207 response_model_include: Annotated[
3208 Optional[IncEx],
3209 Doc(
3210 """
3211 Configuration passed to Pydantic to include only certain fields in the
3212 response data.
3214 Read more about it in the
3215 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
3216 """
3217 ),
3218 ] = None,
3219 response_model_exclude: Annotated[
3220 Optional[IncEx],
3221 Doc(
3222 """
3223 Configuration passed to Pydantic to exclude certain fields in the
3224 response data.
3226 Read more about it in the
3227 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
3228 """
3229 ),
3230 ] = None,
3231 response_model_by_alias: Annotated[
3232 bool,
3233 Doc(
3234 """
3235 Configuration passed to Pydantic to define if the response model
3236 should be serialized by alias when an alias is used.
3238 Read more about it in the
3239 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
3240 """
3241 ),
3242 ] = True,
3243 response_model_exclude_unset: Annotated[
3244 bool,
3245 Doc(
3246 """
3247 Configuration passed to Pydantic to define if the response data
3248 should have all the fields, including the ones that were not set and
3249 have their default values. This is different from
3250 `response_model_exclude_defaults` in that if the fields are set,
3251 they will be included in the response, even if the value is the same
3252 as the default.
3254 When `True`, default values are omitted from the response.
3256 Read more about it in the
3257 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
3258 """
3259 ),
3260 ] = False,
3261 response_model_exclude_defaults: Annotated[
3262 bool,
3263 Doc(
3264 """
3265 Configuration passed to Pydantic to define if the response data
3266 should have all the fields, including the ones that have the same value
3267 as the default. This is different from `response_model_exclude_unset`
3268 in that if the fields are set but contain the same default values,
3269 they will be excluded from the response.
3271 When `True`, default values are omitted from the response.
3273 Read more about it in the
3274 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
3275 """
3276 ),
3277 ] = False,
3278 response_model_exclude_none: Annotated[
3279 bool,
3280 Doc(
3281 """
3282 Configuration passed to Pydantic to define if the response data should
3283 exclude fields set to `None`.
3285 This is much simpler (less smart) than `response_model_exclude_unset`
3286 and `response_model_exclude_defaults`. You probably want to use one of
3287 those two instead of this one, as those allow returning `None` values
3288 when it makes sense.
3290 Read more about it in the
3291 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
3292 """
3293 ),
3294 ] = False,
3295 include_in_schema: Annotated[
3296 bool,
3297 Doc(
3298 """
3299 Include this *path operation* in the generated OpenAPI schema.
3301 This affects the generated OpenAPI (e.g. visible at `/docs`).
3303 Read more about it in the
3304 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
3305 """
3306 ),
3307 ] = True,
3308 response_class: Annotated[
3309 Type[Response],
3310 Doc(
3311 """
3312 Response class to be used for this *path operation*.
3314 This will not be used if you return a response directly.
3316 Read more about it in the
3317 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
3318 """
3319 ),
3320 ] = Default(JSONResponse),
3321 name: Annotated[
3322 Optional[str],
3323 Doc(
3324 """
3325 Name for this *path operation*. Only used internally.
3326 """
3327 ),
3328 ] = None,
3329 callbacks: Annotated[
3330 Optional[List[BaseRoute]],
3331 Doc(
3332 """
3333 List of *path operations* that will be used as OpenAPI callbacks.
3335 This is only for OpenAPI documentation, the callbacks won't be used
3336 directly.
3338 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3340 Read more about it in the
3341 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
3342 """
3343 ),
3344 ] = None,
3345 openapi_extra: Annotated[
3346 Optional[Dict[str, Any]],
3347 Doc(
3348 """
3349 Extra metadata to be included in the OpenAPI schema for this *path
3350 operation*.
3352 Read more about it in the
3353 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
3354 """
3355 ),
3356 ] = None,
3357 generate_unique_id_function: Annotated[
3358 Callable[[routing.APIRoute], str],
3359 Doc(
3360 """
3361 Customize the function used to generate unique IDs for the *path
3362 operations* shown in the generated OpenAPI.
3364 This is particularly useful when automatically generating clients or
3365 SDKs for your API.
3367 Read more about it in the
3368 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
3369 """
3370 ),
3371 ] = Default(generate_unique_id),
3372 ) -> Callable[[DecoratedCallable], DecoratedCallable]:
3373 """
3374 Add a *path operation* using an HTTP OPTIONS operation.
3376 ## Example
3378 ```python
3379 from fastapi import FastAPI
3381 app = FastAPI()
3383 @app.options("/items/")
3384 def get_item_options():
3385 return {"additions": ["Aji", "Guacamole"]}
3386 ```
3387 """
3388 return self.router.options( 1abcdef
3389 path,
3390 response_model=response_model,
3391 status_code=status_code,
3392 tags=tags,
3393 dependencies=dependencies,
3394 summary=summary,
3395 description=description,
3396 response_description=response_description,
3397 responses=responses,
3398 deprecated=deprecated,
3399 operation_id=operation_id,
3400 response_model_include=response_model_include,
3401 response_model_exclude=response_model_exclude,
3402 response_model_by_alias=response_model_by_alias,
3403 response_model_exclude_unset=response_model_exclude_unset,
3404 response_model_exclude_defaults=response_model_exclude_defaults,
3405 response_model_exclude_none=response_model_exclude_none,
3406 include_in_schema=include_in_schema,
3407 response_class=response_class,
3408 name=name,
3409 callbacks=callbacks,
3410 openapi_extra=openapi_extra,
3411 generate_unique_id_function=generate_unique_id_function,
3412 )
3414 def head( 1abcdef
3415 self,
3416 path: Annotated[
3417 str,
3418 Doc(
3419 """
3420 The URL path to be used for this *path operation*.
3422 For example, in `http://example.com/items`, the path is `/items`.
3423 """
3424 ),
3425 ],
3426 *,
3427 response_model: Annotated[
3428 Any,
3429 Doc(
3430 """
3431 The type to use for the response.
3433 It could be any valid Pydantic *field* type. So, it doesn't have to
3434 be a Pydantic model, it could be other things, like a `list`, `dict`,
3435 etc.
3437 It will be used for:
3439 * Documentation: the generated OpenAPI (and the UI at `/docs`) will
3440 show it as the response (JSON Schema).
3441 * Serialization: you could return an arbitrary object and the
3442 `response_model` would be used to serialize that object into the
3443 corresponding JSON.
3444 * Filtering: the JSON sent to the client will only contain the data
3445 (fields) defined in the `response_model`. If you returned an object
3446 that contains an attribute `password` but the `response_model` does
3447 not include that field, the JSON sent to the client would not have
3448 that `password`.
3449 * Validation: whatever you return will be serialized with the
3450 `response_model`, converting any data as necessary to generate the
3451 corresponding JSON. But if the data in the object returned is not
3452 valid, that would mean a violation of the contract with the client,
3453 so it's an error from the API developer. So, FastAPI will raise an
3454 error and return a 500 error code (Internal Server Error).
3456 Read more about it in the
3457 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
3458 """
3459 ),
3460 ] = Default(None),
3461 status_code: Annotated[
3462 Optional[int],
3463 Doc(
3464 """
3465 The default status code to be used for the response.
3467 You could override the status code by returning a response directly.
3469 Read more about it in the
3470 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
3471 """
3472 ),
3473 ] = None,
3474 tags: Annotated[
3475 Optional[List[Union[str, Enum]]],
3476 Doc(
3477 """
3478 A list of tags to be applied to the *path operation*.
3480 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3482 Read more about it in the
3483 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
3484 """
3485 ),
3486 ] = None,
3487 dependencies: Annotated[
3488 Optional[Sequence[Depends]],
3489 Doc(
3490 """
3491 A list of dependencies (using `Depends()`) to be applied to the
3492 *path operation*.
3494 Read more about it in the
3495 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
3496 """
3497 ),
3498 ] = None,
3499 summary: Annotated[
3500 Optional[str],
3501 Doc(
3502 """
3503 A summary for the *path operation*.
3505 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3507 Read more about it in the
3508 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
3509 """
3510 ),
3511 ] = None,
3512 description: Annotated[
3513 Optional[str],
3514 Doc(
3515 """
3516 A description for the *path operation*.
3518 If not provided, it will be extracted automatically from the docstring
3519 of the *path operation function*.
3521 It can contain Markdown.
3523 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3525 Read more about it in the
3526 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
3527 """
3528 ),
3529 ] = None,
3530 response_description: Annotated[
3531 str,
3532 Doc(
3533 """
3534 The description for the default response.
3536 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3537 """
3538 ),
3539 ] = "Successful Response",
3540 responses: Annotated[
3541 Optional[Dict[Union[int, str], Dict[str, Any]]],
3542 Doc(
3543 """
3544 Additional responses that could be returned by this *path operation*.
3546 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3547 """
3548 ),
3549 ] = None,
3550 deprecated: Annotated[
3551 Optional[bool],
3552 Doc(
3553 """
3554 Mark this *path operation* as deprecated.
3556 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3557 """
3558 ),
3559 ] = None,
3560 operation_id: Annotated[
3561 Optional[str],
3562 Doc(
3563 """
3564 Custom operation ID to be used by this *path operation*.
3566 By default, it is generated automatically.
3568 If you provide a custom operation ID, you need to make sure it is
3569 unique for the whole API.
3571 You can customize the
3572 operation ID generation with the parameter
3573 `generate_unique_id_function` in the `FastAPI` class.
3575 Read more about it in the
3576 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
3577 """
3578 ),
3579 ] = None,
3580 response_model_include: Annotated[
3581 Optional[IncEx],
3582 Doc(
3583 """
3584 Configuration passed to Pydantic to include only certain fields in the
3585 response data.
3587 Read more about it in the
3588 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
3589 """
3590 ),
3591 ] = None,
3592 response_model_exclude: Annotated[
3593 Optional[IncEx],
3594 Doc(
3595 """
3596 Configuration passed to Pydantic to exclude certain fields in the
3597 response data.
3599 Read more about it in the
3600 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
3601 """
3602 ),
3603 ] = None,
3604 response_model_by_alias: Annotated[
3605 bool,
3606 Doc(
3607 """
3608 Configuration passed to Pydantic to define if the response model
3609 should be serialized by alias when an alias is used.
3611 Read more about it in the
3612 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
3613 """
3614 ),
3615 ] = True,
3616 response_model_exclude_unset: Annotated[
3617 bool,
3618 Doc(
3619 """
3620 Configuration passed to Pydantic to define if the response data
3621 should have all the fields, including the ones that were not set and
3622 have their default values. This is different from
3623 `response_model_exclude_defaults` in that if the fields are set,
3624 they will be included in the response, even if the value is the same
3625 as the default.
3627 When `True`, default values are omitted from the response.
3629 Read more about it in the
3630 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
3631 """
3632 ),
3633 ] = False,
3634 response_model_exclude_defaults: Annotated[
3635 bool,
3636 Doc(
3637 """
3638 Configuration passed to Pydantic to define if the response data
3639 should have all the fields, including the ones that have the same value
3640 as the default. This is different from `response_model_exclude_unset`
3641 in that if the fields are set but contain the same default values,
3642 they will be excluded from the response.
3644 When `True`, default values are omitted from the response.
3646 Read more about it in the
3647 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
3648 """
3649 ),
3650 ] = False,
3651 response_model_exclude_none: Annotated[
3652 bool,
3653 Doc(
3654 """
3655 Configuration passed to Pydantic to define if the response data should
3656 exclude fields set to `None`.
3658 This is much simpler (less smart) than `response_model_exclude_unset`
3659 and `response_model_exclude_defaults`. You probably want to use one of
3660 those two instead of this one, as those allow returning `None` values
3661 when it makes sense.
3663 Read more about it in the
3664 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
3665 """
3666 ),
3667 ] = False,
3668 include_in_schema: Annotated[
3669 bool,
3670 Doc(
3671 """
3672 Include this *path operation* in the generated OpenAPI schema.
3674 This affects the generated OpenAPI (e.g. visible at `/docs`).
3676 Read more about it in the
3677 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
3678 """
3679 ),
3680 ] = True,
3681 response_class: Annotated[
3682 Type[Response],
3683 Doc(
3684 """
3685 Response class to be used for this *path operation*.
3687 This will not be used if you return a response directly.
3689 Read more about it in the
3690 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
3691 """
3692 ),
3693 ] = Default(JSONResponse),
3694 name: Annotated[
3695 Optional[str],
3696 Doc(
3697 """
3698 Name for this *path operation*. Only used internally.
3699 """
3700 ),
3701 ] = None,
3702 callbacks: Annotated[
3703 Optional[List[BaseRoute]],
3704 Doc(
3705 """
3706 List of *path operations* that will be used as OpenAPI callbacks.
3708 This is only for OpenAPI documentation, the callbacks won't be used
3709 directly.
3711 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3713 Read more about it in the
3714 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
3715 """
3716 ),
3717 ] = None,
3718 openapi_extra: Annotated[
3719 Optional[Dict[str, Any]],
3720 Doc(
3721 """
3722 Extra metadata to be included in the OpenAPI schema for this *path
3723 operation*.
3725 Read more about it in the
3726 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
3727 """
3728 ),
3729 ] = None,
3730 generate_unique_id_function: Annotated[
3731 Callable[[routing.APIRoute], str],
3732 Doc(
3733 """
3734 Customize the function used to generate unique IDs for the *path
3735 operations* shown in the generated OpenAPI.
3737 This is particularly useful when automatically generating clients or
3738 SDKs for your API.
3740 Read more about it in the
3741 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
3742 """
3743 ),
3744 ] = Default(generate_unique_id),
3745 ) -> Callable[[DecoratedCallable], DecoratedCallable]:
3746 """
3747 Add a *path operation* using an HTTP HEAD operation.
3749 ## Example
3751 ```python
3752 from fastapi import FastAPI, Response
3754 app = FastAPI()
3756 @app.head("/items/", status_code=204)
3757 def get_items_headers(response: Response):
3758 response.headers["X-Cat-Dog"] = "Alone in the world"
3759 ```
3760 """
3761 return self.router.head( 1abcdef
3762 path,
3763 response_model=response_model,
3764 status_code=status_code,
3765 tags=tags,
3766 dependencies=dependencies,
3767 summary=summary,
3768 description=description,
3769 response_description=response_description,
3770 responses=responses,
3771 deprecated=deprecated,
3772 operation_id=operation_id,
3773 response_model_include=response_model_include,
3774 response_model_exclude=response_model_exclude,
3775 response_model_by_alias=response_model_by_alias,
3776 response_model_exclude_unset=response_model_exclude_unset,
3777 response_model_exclude_defaults=response_model_exclude_defaults,
3778 response_model_exclude_none=response_model_exclude_none,
3779 include_in_schema=include_in_schema,
3780 response_class=response_class,
3781 name=name,
3782 callbacks=callbacks,
3783 openapi_extra=openapi_extra,
3784 generate_unique_id_function=generate_unique_id_function,
3785 )
3787 def patch( 1abcdef
3788 self,
3789 path: Annotated[
3790 str,
3791 Doc(
3792 """
3793 The URL path to be used for this *path operation*.
3795 For example, in `http://example.com/items`, the path is `/items`.
3796 """
3797 ),
3798 ],
3799 *,
3800 response_model: Annotated[
3801 Any,
3802 Doc(
3803 """
3804 The type to use for the response.
3806 It could be any valid Pydantic *field* type. So, it doesn't have to
3807 be a Pydantic model, it could be other things, like a `list`, `dict`,
3808 etc.
3810 It will be used for:
3812 * Documentation: the generated OpenAPI (and the UI at `/docs`) will
3813 show it as the response (JSON Schema).
3814 * Serialization: you could return an arbitrary object and the
3815 `response_model` would be used to serialize that object into the
3816 corresponding JSON.
3817 * Filtering: the JSON sent to the client will only contain the data
3818 (fields) defined in the `response_model`. If you returned an object
3819 that contains an attribute `password` but the `response_model` does
3820 not include that field, the JSON sent to the client would not have
3821 that `password`.
3822 * Validation: whatever you return will be serialized with the
3823 `response_model`, converting any data as necessary to generate the
3824 corresponding JSON. But if the data in the object returned is not
3825 valid, that would mean a violation of the contract with the client,
3826 so it's an error from the API developer. So, FastAPI will raise an
3827 error and return a 500 error code (Internal Server Error).
3829 Read more about it in the
3830 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
3831 """
3832 ),
3833 ] = Default(None),
3834 status_code: Annotated[
3835 Optional[int],
3836 Doc(
3837 """
3838 The default status code to be used for the response.
3840 You could override the status code by returning a response directly.
3842 Read more about it in the
3843 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
3844 """
3845 ),
3846 ] = None,
3847 tags: Annotated[
3848 Optional[List[Union[str, Enum]]],
3849 Doc(
3850 """
3851 A list of tags to be applied to the *path operation*.
3853 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3855 Read more about it in the
3856 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
3857 """
3858 ),
3859 ] = None,
3860 dependencies: Annotated[
3861 Optional[Sequence[Depends]],
3862 Doc(
3863 """
3864 A list of dependencies (using `Depends()`) to be applied to the
3865 *path operation*.
3867 Read more about it in the
3868 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
3869 """
3870 ),
3871 ] = None,
3872 summary: Annotated[
3873 Optional[str],
3874 Doc(
3875 """
3876 A summary for the *path operation*.
3878 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3880 Read more about it in the
3881 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
3882 """
3883 ),
3884 ] = None,
3885 description: Annotated[
3886 Optional[str],
3887 Doc(
3888 """
3889 A description for the *path operation*.
3891 If not provided, it will be extracted automatically from the docstring
3892 of the *path operation function*.
3894 It can contain Markdown.
3896 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3898 Read more about it in the
3899 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
3900 """
3901 ),
3902 ] = None,
3903 response_description: Annotated[
3904 str,
3905 Doc(
3906 """
3907 The description for the default response.
3909 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3910 """
3911 ),
3912 ] = "Successful Response",
3913 responses: Annotated[
3914 Optional[Dict[Union[int, str], Dict[str, Any]]],
3915 Doc(
3916 """
3917 Additional responses that could be returned by this *path operation*.
3919 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3920 """
3921 ),
3922 ] = None,
3923 deprecated: Annotated[
3924 Optional[bool],
3925 Doc(
3926 """
3927 Mark this *path operation* as deprecated.
3929 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
3930 """
3931 ),
3932 ] = None,
3933 operation_id: Annotated[
3934 Optional[str],
3935 Doc(
3936 """
3937 Custom operation ID to be used by this *path operation*.
3939 By default, it is generated automatically.
3941 If you provide a custom operation ID, you need to make sure it is
3942 unique for the whole API.
3944 You can customize the
3945 operation ID generation with the parameter
3946 `generate_unique_id_function` in the `FastAPI` class.
3948 Read more about it in the
3949 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
3950 """
3951 ),
3952 ] = None,
3953 response_model_include: Annotated[
3954 Optional[IncEx],
3955 Doc(
3956 """
3957 Configuration passed to Pydantic to include only certain fields in the
3958 response data.
3960 Read more about it in the
3961 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
3962 """
3963 ),
3964 ] = None,
3965 response_model_exclude: Annotated[
3966 Optional[IncEx],
3967 Doc(
3968 """
3969 Configuration passed to Pydantic to exclude certain fields in the
3970 response data.
3972 Read more about it in the
3973 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
3974 """
3975 ),
3976 ] = None,
3977 response_model_by_alias: Annotated[
3978 bool,
3979 Doc(
3980 """
3981 Configuration passed to Pydantic to define if the response model
3982 should be serialized by alias when an alias is used.
3984 Read more about it in the
3985 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
3986 """
3987 ),
3988 ] = True,
3989 response_model_exclude_unset: Annotated[
3990 bool,
3991 Doc(
3992 """
3993 Configuration passed to Pydantic to define if the response data
3994 should have all the fields, including the ones that were not set and
3995 have their default values. This is different from
3996 `response_model_exclude_defaults` in that if the fields are set,
3997 they will be included in the response, even if the value is the same
3998 as the default.
4000 When `True`, default values are omitted from the response.
4002 Read more about it in the
4003 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
4004 """
4005 ),
4006 ] = False,
4007 response_model_exclude_defaults: Annotated[
4008 bool,
4009 Doc(
4010 """
4011 Configuration passed to Pydantic to define if the response data
4012 should have all the fields, including the ones that have the same value
4013 as the default. This is different from `response_model_exclude_unset`
4014 in that if the fields are set but contain the same default values,
4015 they will be excluded from the response.
4017 When `True`, default values are omitted from the response.
4019 Read more about it in the
4020 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
4021 """
4022 ),
4023 ] = False,
4024 response_model_exclude_none: Annotated[
4025 bool,
4026 Doc(
4027 """
4028 Configuration passed to Pydantic to define if the response data should
4029 exclude fields set to `None`.
4031 This is much simpler (less smart) than `response_model_exclude_unset`
4032 and `response_model_exclude_defaults`. You probably want to use one of
4033 those two instead of this one, as those allow returning `None` values
4034 when it makes sense.
4036 Read more about it in the
4037 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
4038 """
4039 ),
4040 ] = False,
4041 include_in_schema: Annotated[
4042 bool,
4043 Doc(
4044 """
4045 Include this *path operation* in the generated OpenAPI schema.
4047 This affects the generated OpenAPI (e.g. visible at `/docs`).
4049 Read more about it in the
4050 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
4051 """
4052 ),
4053 ] = True,
4054 response_class: Annotated[
4055 Type[Response],
4056 Doc(
4057 """
4058 Response class to be used for this *path operation*.
4060 This will not be used if you return a response directly.
4062 Read more about it in the
4063 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
4064 """
4065 ),
4066 ] = Default(JSONResponse),
4067 name: Annotated[
4068 Optional[str],
4069 Doc(
4070 """
4071 Name for this *path operation*. Only used internally.
4072 """
4073 ),
4074 ] = None,
4075 callbacks: Annotated[
4076 Optional[List[BaseRoute]],
4077 Doc(
4078 """
4079 List of *path operations* that will be used as OpenAPI callbacks.
4081 This is only for OpenAPI documentation, the callbacks won't be used
4082 directly.
4084 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
4086 Read more about it in the
4087 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
4088 """
4089 ),
4090 ] = None,
4091 openapi_extra: Annotated[
4092 Optional[Dict[str, Any]],
4093 Doc(
4094 """
4095 Extra metadata to be included in the OpenAPI schema for this *path
4096 operation*.
4098 Read more about it in the
4099 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
4100 """
4101 ),
4102 ] = None,
4103 generate_unique_id_function: Annotated[
4104 Callable[[routing.APIRoute], str],
4105 Doc(
4106 """
4107 Customize the function used to generate unique IDs for the *path
4108 operations* shown in the generated OpenAPI.
4110 This is particularly useful when automatically generating clients or
4111 SDKs for your API.
4113 Read more about it in the
4114 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
4115 """
4116 ),
4117 ] = Default(generate_unique_id),
4118 ) -> Callable[[DecoratedCallable], DecoratedCallable]:
4119 """
4120 Add a *path operation* using an HTTP PATCH operation.
4122 ## Example
4124 ```python
4125 from fastapi import FastAPI
4126 from pydantic import BaseModel
4128 class Item(BaseModel):
4129 name: str
4130 description: str | None = None
4132 app = FastAPI()
4134 @app.patch("/items/")
4135 def update_item(item: Item):
4136 return {"message": "Item updated in place"}
4137 ```
4138 """
4139 return self.router.patch( 1abcdef
4140 path,
4141 response_model=response_model,
4142 status_code=status_code,
4143 tags=tags,
4144 dependencies=dependencies,
4145 summary=summary,
4146 description=description,
4147 response_description=response_description,
4148 responses=responses,
4149 deprecated=deprecated,
4150 operation_id=operation_id,
4151 response_model_include=response_model_include,
4152 response_model_exclude=response_model_exclude,
4153 response_model_by_alias=response_model_by_alias,
4154 response_model_exclude_unset=response_model_exclude_unset,
4155 response_model_exclude_defaults=response_model_exclude_defaults,
4156 response_model_exclude_none=response_model_exclude_none,
4157 include_in_schema=include_in_schema,
4158 response_class=response_class,
4159 name=name,
4160 callbacks=callbacks,
4161 openapi_extra=openapi_extra,
4162 generate_unique_id_function=generate_unique_id_function,
4163 )
4165 def trace( 1abcdef
4166 self,
4167 path: Annotated[
4168 str,
4169 Doc(
4170 """
4171 The URL path to be used for this *path operation*.
4173 For example, in `http://example.com/items`, the path is `/items`.
4174 """
4175 ),
4176 ],
4177 *,
4178 response_model: Annotated[
4179 Any,
4180 Doc(
4181 """
4182 The type to use for the response.
4184 It could be any valid Pydantic *field* type. So, it doesn't have to
4185 be a Pydantic model, it could be other things, like a `list`, `dict`,
4186 etc.
4188 It will be used for:
4190 * Documentation: the generated OpenAPI (and the UI at `/docs`) will
4191 show it as the response (JSON Schema).
4192 * Serialization: you could return an arbitrary object and the
4193 `response_model` would be used to serialize that object into the
4194 corresponding JSON.
4195 * Filtering: the JSON sent to the client will only contain the data
4196 (fields) defined in the `response_model`. If you returned an object
4197 that contains an attribute `password` but the `response_model` does
4198 not include that field, the JSON sent to the client would not have
4199 that `password`.
4200 * Validation: whatever you return will be serialized with the
4201 `response_model`, converting any data as necessary to generate the
4202 corresponding JSON. But if the data in the object returned is not
4203 valid, that would mean a violation of the contract with the client,
4204 so it's an error from the API developer. So, FastAPI will raise an
4205 error and return a 500 error code (Internal Server Error).
4207 Read more about it in the
4208 [FastAPI docs for Response Model](https://fastapi.tiangolo.com/tutorial/response-model/).
4209 """
4210 ),
4211 ] = Default(None),
4212 status_code: Annotated[
4213 Optional[int],
4214 Doc(
4215 """
4216 The default status code to be used for the response.
4218 You could override the status code by returning a response directly.
4220 Read more about it in the
4221 [FastAPI docs for Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/).
4222 """
4223 ),
4224 ] = None,
4225 tags: Annotated[
4226 Optional[List[Union[str, Enum]]],
4227 Doc(
4228 """
4229 A list of tags to be applied to the *path operation*.
4231 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
4233 Read more about it in the
4234 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/#tags).
4235 """
4236 ),
4237 ] = None,
4238 dependencies: Annotated[
4239 Optional[Sequence[Depends]],
4240 Doc(
4241 """
4242 A list of dependencies (using `Depends()`) to be applied to the
4243 *path operation*.
4245 Read more about it in the
4246 [FastAPI docs for Dependencies in path operation decorators](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-in-path-operation-decorators/).
4247 """
4248 ),
4249 ] = None,
4250 summary: Annotated[
4251 Optional[str],
4252 Doc(
4253 """
4254 A summary for the *path operation*.
4256 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
4258 Read more about it in the
4259 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
4260 """
4261 ),
4262 ] = None,
4263 description: Annotated[
4264 Optional[str],
4265 Doc(
4266 """
4267 A description for the *path operation*.
4269 If not provided, it will be extracted automatically from the docstring
4270 of the *path operation function*.
4272 It can contain Markdown.
4274 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
4276 Read more about it in the
4277 [FastAPI docs for Path Operation Configuration](https://fastapi.tiangolo.com/tutorial/path-operation-configuration/).
4278 """
4279 ),
4280 ] = None,
4281 response_description: Annotated[
4282 str,
4283 Doc(
4284 """
4285 The description for the default response.
4287 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
4288 """
4289 ),
4290 ] = "Successful Response",
4291 responses: Annotated[
4292 Optional[Dict[Union[int, str], Dict[str, Any]]],
4293 Doc(
4294 """
4295 Additional responses that could be returned by this *path operation*.
4297 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
4298 """
4299 ),
4300 ] = None,
4301 deprecated: Annotated[
4302 Optional[bool],
4303 Doc(
4304 """
4305 Mark this *path operation* as deprecated.
4307 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
4308 """
4309 ),
4310 ] = None,
4311 operation_id: Annotated[
4312 Optional[str],
4313 Doc(
4314 """
4315 Custom operation ID to be used by this *path operation*.
4317 By default, it is generated automatically.
4319 If you provide a custom operation ID, you need to make sure it is
4320 unique for the whole API.
4322 You can customize the
4323 operation ID generation with the parameter
4324 `generate_unique_id_function` in the `FastAPI` class.
4326 Read more about it in the
4327 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
4328 """
4329 ),
4330 ] = None,
4331 response_model_include: Annotated[
4332 Optional[IncEx],
4333 Doc(
4334 """
4335 Configuration passed to Pydantic to include only certain fields in the
4336 response data.
4338 Read more about it in the
4339 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
4340 """
4341 ),
4342 ] = None,
4343 response_model_exclude: Annotated[
4344 Optional[IncEx],
4345 Doc(
4346 """
4347 Configuration passed to Pydantic to exclude certain fields in the
4348 response data.
4350 Read more about it in the
4351 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
4352 """
4353 ),
4354 ] = None,
4355 response_model_by_alias: Annotated[
4356 bool,
4357 Doc(
4358 """
4359 Configuration passed to Pydantic to define if the response model
4360 should be serialized by alias when an alias is used.
4362 Read more about it in the
4363 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_include-and-response_model_exclude).
4364 """
4365 ),
4366 ] = True,
4367 response_model_exclude_unset: Annotated[
4368 bool,
4369 Doc(
4370 """
4371 Configuration passed to Pydantic to define if the response data
4372 should have all the fields, including the ones that were not set and
4373 have their default values. This is different from
4374 `response_model_exclude_defaults` in that if the fields are set,
4375 they will be included in the response, even if the value is the same
4376 as the default.
4378 When `True`, default values are omitted from the response.
4380 Read more about it in the
4381 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
4382 """
4383 ),
4384 ] = False,
4385 response_model_exclude_defaults: Annotated[
4386 bool,
4387 Doc(
4388 """
4389 Configuration passed to Pydantic to define if the response data
4390 should have all the fields, including the ones that have the same value
4391 as the default. This is different from `response_model_exclude_unset`
4392 in that if the fields are set but contain the same default values,
4393 they will be excluded from the response.
4395 When `True`, default values are omitted from the response.
4397 Read more about it in the
4398 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#use-the-response_model_exclude_unset-parameter).
4399 """
4400 ),
4401 ] = False,
4402 response_model_exclude_none: Annotated[
4403 bool,
4404 Doc(
4405 """
4406 Configuration passed to Pydantic to define if the response data should
4407 exclude fields set to `None`.
4409 This is much simpler (less smart) than `response_model_exclude_unset`
4410 and `response_model_exclude_defaults`. You probably want to use one of
4411 those two instead of this one, as those allow returning `None` values
4412 when it makes sense.
4414 Read more about it in the
4415 [FastAPI docs for Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/#response_model_exclude_none).
4416 """
4417 ),
4418 ] = False,
4419 include_in_schema: Annotated[
4420 bool,
4421 Doc(
4422 """
4423 Include this *path operation* in the generated OpenAPI schema.
4425 This affects the generated OpenAPI (e.g. visible at `/docs`).
4427 Read more about it in the
4428 [FastAPI docs for Query Parameters and String Validations](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#exclude-parameters-from-openapi).
4429 """
4430 ),
4431 ] = True,
4432 response_class: Annotated[
4433 Type[Response],
4434 Doc(
4435 """
4436 Response class to be used for this *path operation*.
4438 This will not be used if you return a response directly.
4440 Read more about it in the
4441 [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/#redirectresponse).
4442 """
4443 ),
4444 ] = Default(JSONResponse),
4445 name: Annotated[
4446 Optional[str],
4447 Doc(
4448 """
4449 Name for this *path operation*. Only used internally.
4450 """
4451 ),
4452 ] = None,
4453 callbacks: Annotated[
4454 Optional[List[BaseRoute]],
4455 Doc(
4456 """
4457 List of *path operations* that will be used as OpenAPI callbacks.
4459 This is only for OpenAPI documentation, the callbacks won't be used
4460 directly.
4462 It will be added to the generated OpenAPI (e.g. visible at `/docs`).
4464 Read more about it in the
4465 [FastAPI docs for OpenAPI Callbacks](https://fastapi.tiangolo.com/advanced/openapi-callbacks/).
4466 """
4467 ),
4468 ] = None,
4469 openapi_extra: Annotated[
4470 Optional[Dict[str, Any]],
4471 Doc(
4472 """
4473 Extra metadata to be included in the OpenAPI schema for this *path
4474 operation*.
4476 Read more about it in the
4477 [FastAPI docs for Path Operation Advanced Configuration](https://fastapi.tiangolo.com/advanced/path-operation-advanced-configuration/#custom-openapi-path-operation-schema).
4478 """
4479 ),
4480 ] = None,
4481 generate_unique_id_function: Annotated[
4482 Callable[[routing.APIRoute], str],
4483 Doc(
4484 """
4485 Customize the function used to generate unique IDs for the *path
4486 operations* shown in the generated OpenAPI.
4488 This is particularly useful when automatically generating clients or
4489 SDKs for your API.
4491 Read more about it in the
4492 [FastAPI docs about how to Generate Clients](https://fastapi.tiangolo.com/advanced/generate-clients/#custom-generate-unique-id-function).
4493 """
4494 ),
4495 ] = Default(generate_unique_id),
4496 ) -> Callable[[DecoratedCallable], DecoratedCallable]:
4497 """
4498 Add a *path operation* using an HTTP TRACE operation.
4500 ## Example
4502 ```python
4503 from fastapi import FastAPI
4505 app = FastAPI()
4507 @app.trace("/items/{item_id}")
4508 def trace_item(item_id: str):
4509 return None
4510 ```
4511 """
4512 return self.router.trace( 1abcdef
4513 path,
4514 response_model=response_model,
4515 status_code=status_code,
4516 tags=tags,
4517 dependencies=dependencies,
4518 summary=summary,
4519 description=description,
4520 response_description=response_description,
4521 responses=responses,
4522 deprecated=deprecated,
4523 operation_id=operation_id,
4524 response_model_include=response_model_include,
4525 response_model_exclude=response_model_exclude,
4526 response_model_by_alias=response_model_by_alias,
4527 response_model_exclude_unset=response_model_exclude_unset,
4528 response_model_exclude_defaults=response_model_exclude_defaults,
4529 response_model_exclude_none=response_model_exclude_none,
4530 include_in_schema=include_in_schema,
4531 response_class=response_class,
4532 name=name,
4533 callbacks=callbacks,
4534 openapi_extra=openapi_extra,
4535 generate_unique_id_function=generate_unique_id_function,
4536 )
4538 def websocket_route( 1abcdef
4539 self, path: str, name: Union[str, None] = None
4540 ) -> Callable[[DecoratedCallable], DecoratedCallable]:
4541 def decorator(func: DecoratedCallable) -> DecoratedCallable: 1abcdef
4542 self.router.add_websocket_route(path, func, name=name) 1abcdef
4543 return func 1abcdef
4545 return decorator 1abcdef
4547 @deprecated( 1abcdef
4548 """
4549 on_event is deprecated, use lifespan event handlers instead.
4551 Read more about it in the
4552 [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/).
4553 """
4554 )
4555 def on_event( 1abcdef
4556 self,
4557 event_type: Annotated[
4558 str,
4559 Doc(
4560 """
4561 The type of event. `startup` or `shutdown`.
4562 """
4563 ),
4564 ],
4565 ) -> Callable[[DecoratedCallable], DecoratedCallable]:
4566 """
4567 Add an event handler for the application.
4569 `on_event` is deprecated, use `lifespan` event handlers instead.
4571 Read more about it in the
4572 [FastAPI docs for Lifespan Events](https://fastapi.tiangolo.com/advanced/events/#alternative-events-deprecated).
4573 """
4574 return self.router.on_event(event_type) 2a | jbb } qbc ~ xbd abEbe bbLbf cbSb
4576 def middleware( 1abcdef
4577 self,
4578 middleware_type: Annotated[
4579 str,
4580 Doc(
4581 """
4582 The type of middleware. Currently only supports `http`.
4583 """
4584 ),
4585 ],
4586 ) -> Callable[[DecoratedCallable], DecoratedCallable]:
4587 """
4588 Add a middleware to the application.
4590 Read more about it in the
4591 [FastAPI docs for Middleware](https://fastapi.tiangolo.com/tutorial/middleware/).
4593 ## Example
4595 ```python
4596 import time
4597 from typing import Awaitable, Callable
4599 from fastapi import FastAPI, Request, Response
4601 app = FastAPI()
4604 @app.middleware("http")
4605 async def add_process_time_header(
4606 request: Request, call_next: Callable[[Request], Awaitable[Response]]
4607 ) -> Response:
4608 start_time = time.time()
4609 response = await call_next(request)
4610 process_time = time.time() - start_time
4611 response.headers["X-Process-Time"] = str(process_time)
4612 return response
4613 ```
4614 """
4616 def decorator(func: DecoratedCallable) -> DecoratedCallable: 1abcdef
4617 self.add_middleware(BaseHTTPMiddleware, dispatch=func) 1abcdef
4618 return func 1abcdef
4620 return decorator 1abcdef
4622 def exception_handler( 1abcdef
4623 self,
4624 exc_class_or_status_code: Annotated[
4625 Union[int, Type[Exception]],
4626 Doc(
4627 """
4628 The Exception class this would handle, or a status code.
4629 """
4630 ),
4631 ],
4632 ) -> Callable[[DecoratedCallable], DecoratedCallable]:
4633 """
4634 Add an exception handler to the app.
4636 Read more about it in the
4637 [FastAPI docs for Handling Errors](https://fastapi.tiangolo.com/tutorial/handling-errors/).
4639 ## Example
4641 ```python
4642 from fastapi import FastAPI, Request
4643 from fastapi.responses import JSONResponse
4646 class UnicornException(Exception):
4647 def __init__(self, name: str):
4648 self.name = name
4651 app = FastAPI()
4654 @app.exception_handler(UnicornException)
4655 async def unicorn_exception_handler(request: Request, exc: UnicornException):
4656 return JSONResponse(
4657 status_code=418,
4658 content={"message": f"Oops! {exc.name} did something. There goes a rainbow..."},
4659 )
4660 ```
4661 """
4663 def decorator(func: DecoratedCallable) -> DecoratedCallable: 1abcdef
4664 self.add_exception_handler(exc_class_or_status_code, func) 1abcdef
4665 return func 1abcdef
4667 return decorator 1abcdef