pax_global_header00006660000000000000000000000064146140361760014522gustar00rootroot0000000000000052 comment=32be95dd867386d8331705a3c47d1b8b64bb1c9e fastapi-0.110.3/000077500000000000000000000000001461403617600133135ustar00rootroot00000000000000fastapi-0.110.3/.github/000077500000000000000000000000001461403617600146535ustar00rootroot00000000000000fastapi-0.110.3/.github/DISCUSSION_TEMPLATE/000077500000000000000000000000001461403617600176315ustar00rootroot00000000000000fastapi-0.110.3/.github/DISCUSSION_TEMPLATE/questions.yml000066400000000000000000000135171461403617600224150ustar00rootroot00000000000000labels: [question] body: - type: markdown attributes: value: | Thanks for your interest in FastAPI! 🚀 Please follow these instructions, fill every question, and do every step. 🙏 I'm asking this because answering questions and solving problems in GitHub is what consumes most of the time. I end up not being able to add new features, fix bugs, review pull requests, etc. as fast as I wish because I have to spend too much time handling questions. All that, on top of all the incredible help provided by a bunch of community members, the [FastAPI Experts](https://fastapi.tiangolo.com/fastapi-people/#experts), that give a lot of their time to come here and help others. That's a lot of work they are doing, but if more FastAPI users came to help others like them just a little bit more, it would be much less effort for them (and you and me 😅). By asking questions in a structured way (following this) it will be much easier to help you. And there's a high chance that you will find the solution along the way and you won't even have to submit it and wait for an answer. 😎 As there are too many questions, I'll have to discard and close the incomplete ones. That will allow me (and others) to focus on helping people like you that follow the whole process and help us help you. 🤓 - type: checkboxes id: checks attributes: label: First Check description: Please confirm and check all the following options. options: - label: I added a very descriptive title here. required: true - label: I used the GitHub search to find a similar question and didn't find it. required: true - label: I searched the FastAPI documentation, with the integrated search. required: true - label: I already searched in Google "How to X in FastAPI" and didn't find any information. required: true - label: I already read and followed all the tutorial in the docs and didn't find an answer. required: true - label: I already checked if it is not related to FastAPI but to [Pydantic](https://github.com/pydantic/pydantic). required: true - label: I already checked if it is not related to FastAPI but to [Swagger UI](https://github.com/swagger-api/swagger-ui). required: true - label: I already checked if it is not related to FastAPI but to [ReDoc](https://github.com/Redocly/redoc). required: true - type: checkboxes id: help attributes: label: Commit to Help description: | After submitting this, I commit to one of: * Read open questions until I find 2 where I can help someone and add a comment to help there. * I already hit the "watch" button in this repository to receive notifications and I commit to help at least 2 people that ask questions in the future. * Review one Pull Request by downloading the code and following [all the review process](https://fastapi.tiangolo.com/help-fastapi/#review-pull-requests). options: - label: I commit to help with one of those options 👆 required: true - type: textarea id: example attributes: label: Example Code description: | Please add a self-contained, [minimal, reproducible, example](https://stackoverflow.com/help/minimal-reproducible-example) with your use case. If I (or someone) can copy it, run it, and see it right away, there's a much higher chance I (or someone) will be able to help you. placeholder: | from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} render: python validations: required: true - type: textarea id: description attributes: label: Description description: | What is the problem, question, or error? Write a short description telling me what you are doing, what you expect to happen, and what is currently happening. placeholder: | * Open the browser and call the endpoint `/`. * It returns a JSON with `{"Hello": "World"}`. * But I expected it to return `{"Hello": "Sara"}`. validations: required: true - type: dropdown id: os attributes: label: Operating System description: What operating system are you on? multiple: true options: - Linux - Windows - macOS - Other validations: required: true - type: textarea id: os-details attributes: label: Operating System Details description: You can add more details about your operating system here, in particular if you chose "Other". - type: input id: fastapi-version attributes: label: FastAPI Version description: | What FastAPI version are you using? You can find the FastAPI version with: ```bash python -c "import fastapi; print(fastapi.__version__)" ``` validations: required: true - type: input id: pydantic-version attributes: label: Pydantic Version description: | What Pydantic version are you using? You can find the Pydantic version with: ```bash python -c "import pydantic; print(pydantic.version.VERSION)" ``` validations: required: true - type: input id: python-version attributes: label: Python Version description: | What Python version are you using? You can find the Python version with: ```bash python --version ``` validations: required: true - type: textarea id: context attributes: label: Additional Context description: Add any additional context information or screenshots you think are useful. fastapi-0.110.3/.github/FUNDING.yml000066400000000000000000000000231461403617600164630ustar00rootroot00000000000000github: [tiangolo] fastapi-0.110.3/.github/ISSUE_TEMPLATE/000077500000000000000000000000001461403617600170365ustar00rootroot00000000000000fastapi-0.110.3/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000016421461403617600210310ustar00rootroot00000000000000blank_issues_enabled: false contact_links: - name: Security Contact about: Please report security vulnerabilities to security@tiangolo.com - name: Question or Problem about: Ask a question or ask about a problem in GitHub Discussions. url: https://github.com/tiangolo/fastapi/discussions/categories/questions - name: Feature Request about: To suggest an idea or ask about a feature, please start with a question saying what you would like to achieve. There might be a way to do it already. url: https://github.com/tiangolo/fastapi/discussions/categories/questions - name: Show and tell about: Show what you built with FastAPI or to be used with FastAPI. url: https://github.com/tiangolo/fastapi/discussions/categories/show-and-tell - name: Translations about: Coordinate translations in GitHub Discussions. url: https://github.com/tiangolo/fastapi/discussions/categories/translations fastapi-0.110.3/.github/ISSUE_TEMPLATE/privileged.yml000066400000000000000000000015711461403617600217170ustar00rootroot00000000000000name: Privileged description: You are @tiangolo or he asked you directly to create an issue here. If not, check the other options. 👇 body: - type: markdown attributes: value: | Thanks for your interest in FastAPI! 🚀 If you are not @tiangolo or he didn't ask you directly to create an issue here, please start the conversation in a [Question in GitHub Discussions](https://github.com/tiangolo/fastapi/discussions/categories/questions) instead. - type: checkboxes id: privileged attributes: label: Privileged issue description: Confirm that you are allowed to create an issue here. options: - label: I'm @tiangolo or he asked me directly to create an issue here. required: true - type: textarea id: content attributes: label: Issue Content description: Add the content of the issue here. fastapi-0.110.3/.github/actions/000077500000000000000000000000001461403617600163135ustar00rootroot00000000000000fastapi-0.110.3/.github/actions/comment-docs-preview-in-pr/000077500000000000000000000000001461403617600234055ustar00rootroot00000000000000fastapi-0.110.3/.github/actions/comment-docs-preview-in-pr/Dockerfile000066400000000000000000000002331461403617600253750ustar00rootroot00000000000000FROM python:3.10 COPY ./requirements.txt /app/requirements.txt RUN pip install -r /app/requirements.txt COPY ./app /app CMD ["python", "/app/main.py"] fastapi-0.110.3/.github/actions/comment-docs-preview-in-pr/action.yml000066400000000000000000000006121461403617600254040ustar00rootroot00000000000000name: Comment Docs Preview in PR description: Comment with the docs URL preview in the PR author: Sebastián Ramírez inputs: token: description: Token for the repo. Can be passed in using {{ secrets.GITHUB_TOKEN }} required: true deploy_url: description: The deployment URL to comment in the PR required: true runs: using: docker image: Dockerfile fastapi-0.110.3/.github/actions/comment-docs-preview-in-pr/app/000077500000000000000000000000001461403617600241655ustar00rootroot00000000000000fastapi-0.110.3/.github/actions/comment-docs-preview-in-pr/app/main.py000066400000000000000000000040721461403617600254660ustar00rootroot00000000000000import logging import sys from pathlib import Path from typing import Union import httpx from github import Github from github.PullRequest import PullRequest from pydantic import BaseModel, SecretStr, ValidationError from pydantic_settings import BaseSettings github_api = "https://api.github.com" class Settings(BaseSettings): github_repository: str github_event_path: Path github_event_name: Union[str, None] = None input_token: SecretStr input_deploy_url: str class PartialGithubEventHeadCommit(BaseModel): id: str class PartialGithubEventWorkflowRun(BaseModel): head_commit: PartialGithubEventHeadCommit class PartialGithubEvent(BaseModel): workflow_run: PartialGithubEventWorkflowRun if __name__ == "__main__": logging.basicConfig(level=logging.INFO) settings = Settings() logging.info(f"Using config: {settings.json()}") g = Github(settings.input_token.get_secret_value()) repo = g.get_repo(settings.github_repository) try: event = PartialGithubEvent.parse_file(settings.github_event_path) except ValidationError as e: logging.error(f"Error parsing event file: {e.errors()}") sys.exit(0) use_pr: Union[PullRequest, None] = None for pr in repo.get_pulls(): if pr.head.sha == event.workflow_run.head_commit.id: use_pr = pr break if not use_pr: logging.error(f"No PR found for hash: {event.workflow_run.head_commit.id}") sys.exit(0) github_headers = { "Authorization": f"token {settings.input_token.get_secret_value()}" } url = f"{github_api}/repos/{settings.github_repository}/issues/{use_pr.number}/comments" logging.info(f"Using comments URL: {url}") response = httpx.post( url, headers=github_headers, json={ "body": f"📝 Docs preview for commit {use_pr.head.sha} at: {settings.input_deploy_url}" }, ) if not (200 <= response.status_code <= 300): logging.error(f"Error posting comment: {response.text}") sys.exit(1) logging.info("Finished") fastapi-0.110.3/.github/actions/comment-docs-preview-in-pr/requirements.txt000066400000000000000000000001061461403617600266660ustar00rootroot00000000000000PyGithub pydantic>=2.5.3,<3.0.0 pydantic-settings>=2.1.0,<3.0.0 httpx fastapi-0.110.3/.github/actions/notify-translations/000077500000000000000000000000001461403617600223425ustar00rootroot00000000000000fastapi-0.110.3/.github/actions/notify-translations/Dockerfile000066400000000000000000000002121461403617600243270ustar00rootroot00000000000000FROM python:3.9 RUN pip install httpx PyGithub "pydantic==1.5.1" "pyyaml>=5.3.1,<6.0.0" COPY ./app /app CMD ["python", "/app/main.py"] fastapi-0.110.3/.github/actions/notify-translations/action.yml000066400000000000000000000005321461403617600243420ustar00rootroot00000000000000name: "Notify Translations" description: "Notify in the issue for a translation when there's a new PR available" author: "Sebastián Ramírez " inputs: token: description: 'Token, to read the GitHub API. Can be passed in using {{ secrets.GITHUB_TOKEN }}' required: true runs: using: 'docker' image: 'Dockerfile' fastapi-0.110.3/.github/actions/notify-translations/app/000077500000000000000000000000001461403617600231225ustar00rootroot00000000000000fastapi-0.110.3/.github/actions/notify-translations/app/main.py000066400000000000000000000305651461403617600244310ustar00rootroot00000000000000import logging import random import sys import time from pathlib import Path from typing import Any, Dict, List, Union, cast import httpx from github import Github from pydantic import BaseModel, BaseSettings, SecretStr awaiting_label = "awaiting-review" lang_all_label = "lang-all" approved_label = "approved-2" translations_path = Path(__file__).parent / "translations.yml" github_graphql_url = "https://api.github.com/graphql" questions_translations_category_id = "DIC_kwDOCZduT84CT5P9" all_discussions_query = """ query Q($category_id: ID) { repository(name: "fastapi", owner: "tiangolo") { discussions(categoryId: $category_id, first: 100) { nodes { title id number labels(first: 10) { edges { node { id name } } } } } } } """ translation_discussion_query = """ query Q($after: String, $discussion_number: Int!) { repository(name: "fastapi", owner: "tiangolo") { discussion(number: $discussion_number) { comments(first: 100, after: $after) { edges { cursor node { id url body } } } } } } """ add_comment_mutation = """ mutation Q($discussion_id: ID!, $body: String!) { addDiscussionComment(input: {discussionId: $discussion_id, body: $body}) { comment { id url body } } } """ update_comment_mutation = """ mutation Q($comment_id: ID!, $body: String!) { updateDiscussionComment(input: {commentId: $comment_id, body: $body}) { comment { id url body } } } """ class Comment(BaseModel): id: str url: str body: str class UpdateDiscussionComment(BaseModel): comment: Comment class UpdateCommentData(BaseModel): updateDiscussionComment: UpdateDiscussionComment class UpdateCommentResponse(BaseModel): data: UpdateCommentData class AddDiscussionComment(BaseModel): comment: Comment class AddCommentData(BaseModel): addDiscussionComment: AddDiscussionComment class AddCommentResponse(BaseModel): data: AddCommentData class CommentsEdge(BaseModel): node: Comment cursor: str class Comments(BaseModel): edges: List[CommentsEdge] class CommentsDiscussion(BaseModel): comments: Comments class CommentsRepository(BaseModel): discussion: CommentsDiscussion class CommentsData(BaseModel): repository: CommentsRepository class CommentsResponse(BaseModel): data: CommentsData class AllDiscussionsLabelNode(BaseModel): id: str name: str class AllDiscussionsLabelsEdge(BaseModel): node: AllDiscussionsLabelNode class AllDiscussionsDiscussionLabels(BaseModel): edges: List[AllDiscussionsLabelsEdge] class AllDiscussionsDiscussionNode(BaseModel): title: str id: str number: int labels: AllDiscussionsDiscussionLabels class AllDiscussionsDiscussions(BaseModel): nodes: List[AllDiscussionsDiscussionNode] class AllDiscussionsRepository(BaseModel): discussions: AllDiscussionsDiscussions class AllDiscussionsData(BaseModel): repository: AllDiscussionsRepository class AllDiscussionsResponse(BaseModel): data: AllDiscussionsData class Settings(BaseSettings): github_repository: str input_token: SecretStr github_event_path: Path github_event_name: Union[str, None] = None httpx_timeout: int = 30 input_debug: Union[bool, None] = False class PartialGitHubEventIssue(BaseModel): number: int class PartialGitHubEvent(BaseModel): pull_request: PartialGitHubEventIssue def get_graphql_response( *, settings: Settings, query: str, after: Union[str, None] = None, category_id: Union[str, None] = None, discussion_number: Union[int, None] = None, discussion_id: Union[str, None] = None, comment_id: Union[str, None] = None, body: Union[str, None] = None, ) -> Dict[str, Any]: headers = {"Authorization": f"token {settings.input_token.get_secret_value()}"} # some fields are only used by one query, but GraphQL allows unused variables, so # keep them here for simplicity variables = { "after": after, "category_id": category_id, "discussion_number": discussion_number, "discussion_id": discussion_id, "comment_id": comment_id, "body": body, } response = httpx.post( github_graphql_url, headers=headers, timeout=settings.httpx_timeout, json={"query": query, "variables": variables, "operationName": "Q"}, ) if response.status_code != 200: logging.error( f"Response was not 200, after: {after}, category_id: {category_id}" ) logging.error(response.text) raise RuntimeError(response.text) data = response.json() if "errors" in data: logging.error(f"Errors in response, after: {after}, category_id: {category_id}") logging.error(response.text) raise RuntimeError(response.text) return cast(Dict[str, Any], data) def get_graphql_translation_discussions(*, settings: Settings): data = get_graphql_response( settings=settings, query=all_discussions_query, category_id=questions_translations_category_id, ) graphql_response = AllDiscussionsResponse.parse_obj(data) return graphql_response.data.repository.discussions.nodes def get_graphql_translation_discussion_comments_edges( *, settings: Settings, discussion_number: int, after: Union[str, None] = None ): data = get_graphql_response( settings=settings, query=translation_discussion_query, discussion_number=discussion_number, after=after, ) graphql_response = CommentsResponse.parse_obj(data) return graphql_response.data.repository.discussion.comments.edges def get_graphql_translation_discussion_comments( *, settings: Settings, discussion_number: int ): comment_nodes: List[Comment] = [] discussion_edges = get_graphql_translation_discussion_comments_edges( settings=settings, discussion_number=discussion_number ) while discussion_edges: for discussion_edge in discussion_edges: comment_nodes.append(discussion_edge.node) last_edge = discussion_edges[-1] discussion_edges = get_graphql_translation_discussion_comments_edges( settings=settings, discussion_number=discussion_number, after=last_edge.cursor, ) return comment_nodes def create_comment(*, settings: Settings, discussion_id: str, body: str): data = get_graphql_response( settings=settings, query=add_comment_mutation, discussion_id=discussion_id, body=body, ) response = AddCommentResponse.parse_obj(data) return response.data.addDiscussionComment.comment def update_comment(*, settings: Settings, comment_id: str, body: str): data = get_graphql_response( settings=settings, query=update_comment_mutation, comment_id=comment_id, body=body, ) response = UpdateCommentResponse.parse_obj(data) return response.data.updateDiscussionComment.comment if __name__ == "__main__": settings = Settings() if settings.input_debug: logging.basicConfig(level=logging.DEBUG) else: logging.basicConfig(level=logging.INFO) logging.debug(f"Using config: {settings.json()}") g = Github(settings.input_token.get_secret_value()) repo = g.get_repo(settings.github_repository) if not settings.github_event_path.is_file(): raise RuntimeError( f"No github event file available at: {settings.github_event_path}" ) contents = settings.github_event_path.read_text() github_event = PartialGitHubEvent.parse_raw(contents) # Avoid race conditions with multiple labels sleep_time = random.random() * 10 # random number between 0 and 10 seconds logging.info( f"Sleeping for {sleep_time} seconds to avoid " "race conditions and multiple comments" ) time.sleep(sleep_time) # Get PR logging.debug(f"Processing PR: #{github_event.pull_request.number}") pr = repo.get_pull(github_event.pull_request.number) label_strs = {label.name for label in pr.get_labels()} langs = [] for label in label_strs: if label.startswith("lang-") and not label == lang_all_label: langs.append(label[5:]) logging.info(f"PR #{pr.number} has labels: {label_strs}") if not langs or lang_all_label not in label_strs: logging.info(f"PR #{pr.number} doesn't seem to be a translation PR, skipping") sys.exit(0) # Generate translation map, lang ID to discussion discussions = get_graphql_translation_discussions(settings=settings) lang_to_discussion_map: Dict[str, AllDiscussionsDiscussionNode] = {} for discussion in discussions: for edge in discussion.labels.edges: label = edge.node.name if label.startswith("lang-") and not label == lang_all_label: lang = label[5:] lang_to_discussion_map[lang] = discussion logging.debug(f"Using translations map: {lang_to_discussion_map}") # Messages to create or check new_translation_message = f"Good news everyone! 😉 There's a new translation PR to be reviewed: #{pr.number} by @{pr.user.login}. 🎉 This requires 2 approvals from native speakers to be merged. 🤓" done_translation_message = f"~There's a new translation PR to be reviewed: #{pr.number} by @{pr.user.login}~ Good job! This is done. 🍰☕" # Normally only one language, but still for lang in langs: if lang not in lang_to_discussion_map: log_message = f"Could not find discussion for language: {lang}" logging.error(log_message) raise RuntimeError(log_message) discussion = lang_to_discussion_map[lang] logging.info( f"Found a translation discussion for language: {lang} in discussion: #{discussion.number}" ) already_notified_comment: Union[Comment, None] = None already_done_comment: Union[Comment, None] = None logging.info( f"Checking current comments in discussion: #{discussion.number} to see if already notified about this PR: #{pr.number}" ) comments = get_graphql_translation_discussion_comments( settings=settings, discussion_number=discussion.number ) for comment in comments: if new_translation_message in comment.body: already_notified_comment = comment elif done_translation_message in comment.body: already_done_comment = comment logging.info( f"Already notified comment: {already_notified_comment}, already done comment: {already_done_comment}" ) if pr.state == "open" and awaiting_label in label_strs: logging.info( f"This PR seems to be a language translation and awaiting reviews: #{pr.number}" ) if already_notified_comment: logging.info( f"This PR #{pr.number} was already notified in comment: {already_notified_comment.url}" ) else: logging.info( f"Writing notification comment about PR #{pr.number} in Discussion: #{discussion.number}" ) comment = create_comment( settings=settings, discussion_id=discussion.id, body=new_translation_message, ) logging.info(f"Notified in comment: {comment.url}") elif pr.state == "closed" or approved_label in label_strs: logging.info(f"Already approved or closed PR #{pr.number}") if already_done_comment: logging.info( f"This PR #{pr.number} was already marked as done in comment: {already_done_comment.url}" ) elif already_notified_comment: updated_comment = update_comment( settings=settings, comment_id=already_notified_comment.id, body=done_translation_message, ) logging.info(f"Marked as done in comment: {updated_comment.url}") else: logging.info( f"There doesn't seem to be anything to be done about PR #{pr.number}" ) logging.info("Finished") fastapi-0.110.3/.github/actions/people/000077500000000000000000000000001461403617600175775ustar00rootroot00000000000000fastapi-0.110.3/.github/actions/people/Dockerfile000066400000000000000000000002341461403617600215700ustar00rootroot00000000000000FROM python:3.9 RUN pip install httpx PyGithub "pydantic==2.0.2" pydantic-settings "pyyaml>=5.3.1,<6.0.0" COPY ./app /app CMD ["python", "/app/main.py"] fastapi-0.110.3/.github/actions/people/action.yml000066400000000000000000000005151461403617600216000ustar00rootroot00000000000000name: "Generate FastAPI People" description: "Generate the data for the FastAPI People page" author: "Sebastián Ramírez " inputs: token: description: 'User token, to read the GitHub API. Can be passed in using {{ secrets.FASTAPI_PEOPLE }}' required: true runs: using: 'docker' image: 'Dockerfile' fastapi-0.110.3/.github/actions/people/app/000077500000000000000000000000001461403617600203575ustar00rootroot00000000000000fastapi-0.110.3/.github/actions/people/app/main.py000066400000000000000000000463041461403617600216640ustar00rootroot00000000000000import logging import subprocess import sys from collections import Counter, defaultdict from datetime import datetime, timedelta, timezone from pathlib import Path from typing import Any, Container, DefaultDict, Dict, List, Set, Union import httpx import yaml from github import Github from pydantic import BaseModel, SecretStr from pydantic_settings import BaseSettings github_graphql_url = "https://api.github.com/graphql" questions_category_id = "MDE4OkRpc2N1c3Npb25DYXRlZ29yeTMyMDAxNDM0" discussions_query = """ query Q($after: String, $category_id: ID) { repository(name: "fastapi", owner: "tiangolo") { discussions(first: 100, after: $after, categoryId: $category_id) { edges { cursor node { number author { login avatarUrl url } title createdAt comments(first: 100) { nodes { createdAt author { login avatarUrl url } isAnswer replies(first: 10) { nodes { createdAt author { login avatarUrl url } } } } } } } } } } """ prs_query = """ query Q($after: String) { repository(name: "fastapi", owner: "tiangolo") { pullRequests(first: 100, after: $after) { edges { cursor node { number labels(first: 100) { nodes { name } } author { login avatarUrl url } title createdAt state comments(first: 100) { nodes { createdAt author { login avatarUrl url } } } reviews(first:100) { nodes { author { login avatarUrl url } state } } } } } } } """ sponsors_query = """ query Q($after: String) { user(login: "tiangolo") { sponsorshipsAsMaintainer(first: 100, after: $after) { edges { cursor node { sponsorEntity { ... on Organization { login avatarUrl url } ... on User { login avatarUrl url } } tier { name monthlyPriceInDollars } } } } } } """ class Author(BaseModel): login: str avatarUrl: str url: str # Discussions class CommentsNode(BaseModel): createdAt: datetime author: Union[Author, None] = None class Replies(BaseModel): nodes: List[CommentsNode] class DiscussionsCommentsNode(CommentsNode): replies: Replies class Comments(BaseModel): nodes: List[CommentsNode] class DiscussionsComments(BaseModel): nodes: List[DiscussionsCommentsNode] class DiscussionsNode(BaseModel): number: int author: Union[Author, None] = None title: str createdAt: datetime comments: DiscussionsComments class DiscussionsEdge(BaseModel): cursor: str node: DiscussionsNode class Discussions(BaseModel): edges: List[DiscussionsEdge] class DiscussionsRepository(BaseModel): discussions: Discussions class DiscussionsResponseData(BaseModel): repository: DiscussionsRepository class DiscussionsResponse(BaseModel): data: DiscussionsResponseData # PRs class LabelNode(BaseModel): name: str class Labels(BaseModel): nodes: List[LabelNode] class ReviewNode(BaseModel): author: Union[Author, None] = None state: str class Reviews(BaseModel): nodes: List[ReviewNode] class PullRequestNode(BaseModel): number: int labels: Labels author: Union[Author, None] = None title: str createdAt: datetime state: str comments: Comments reviews: Reviews class PullRequestEdge(BaseModel): cursor: str node: PullRequestNode class PullRequests(BaseModel): edges: List[PullRequestEdge] class PRsRepository(BaseModel): pullRequests: PullRequests class PRsResponseData(BaseModel): repository: PRsRepository class PRsResponse(BaseModel): data: PRsResponseData # Sponsors class SponsorEntity(BaseModel): login: str avatarUrl: str url: str class Tier(BaseModel): name: str monthlyPriceInDollars: float class SponsorshipAsMaintainerNode(BaseModel): sponsorEntity: SponsorEntity tier: Tier class SponsorshipAsMaintainerEdge(BaseModel): cursor: str node: SponsorshipAsMaintainerNode class SponsorshipAsMaintainer(BaseModel): edges: List[SponsorshipAsMaintainerEdge] class SponsorsUser(BaseModel): sponsorshipsAsMaintainer: SponsorshipAsMaintainer class SponsorsResponseData(BaseModel): user: SponsorsUser class SponsorsResponse(BaseModel): data: SponsorsResponseData class Settings(BaseSettings): input_token: SecretStr github_repository: str httpx_timeout: int = 30 def get_graphql_response( *, settings: Settings, query: str, after: Union[str, None] = None, category_id: Union[str, None] = None, ) -> Dict[str, Any]: headers = {"Authorization": f"token {settings.input_token.get_secret_value()}"} # category_id is only used by one query, but GraphQL allows unused variables, so # keep it here for simplicity variables = {"after": after, "category_id": category_id} response = httpx.post( github_graphql_url, headers=headers, timeout=settings.httpx_timeout, json={"query": query, "variables": variables, "operationName": "Q"}, ) if response.status_code != 200: logging.error( f"Response was not 200, after: {after}, category_id: {category_id}" ) logging.error(response.text) raise RuntimeError(response.text) data = response.json() if "errors" in data: logging.error(f"Errors in response, after: {after}, category_id: {category_id}") logging.error(data["errors"]) logging.error(response.text) raise RuntimeError(response.text) return data def get_graphql_question_discussion_edges( *, settings: Settings, after: Union[str, None] = None, ): data = get_graphql_response( settings=settings, query=discussions_query, after=after, category_id=questions_category_id, ) graphql_response = DiscussionsResponse.model_validate(data) return graphql_response.data.repository.discussions.edges def get_graphql_pr_edges(*, settings: Settings, after: Union[str, None] = None): data = get_graphql_response(settings=settings, query=prs_query, after=after) graphql_response = PRsResponse.model_validate(data) return graphql_response.data.repository.pullRequests.edges def get_graphql_sponsor_edges(*, settings: Settings, after: Union[str, None] = None): data = get_graphql_response(settings=settings, query=sponsors_query, after=after) graphql_response = SponsorsResponse.model_validate(data) return graphql_response.data.user.sponsorshipsAsMaintainer.edges class DiscussionExpertsResults(BaseModel): commenters: Counter last_month_commenters: Counter three_months_commenters: Counter six_months_commenters: Counter one_year_commenters: Counter authors: Dict[str, Author] def get_discussion_nodes(settings: Settings) -> List[DiscussionsNode]: discussion_nodes: List[DiscussionsNode] = [] discussion_edges = get_graphql_question_discussion_edges(settings=settings) while discussion_edges: for discussion_edge in discussion_edges: discussion_nodes.append(discussion_edge.node) last_edge = discussion_edges[-1] discussion_edges = get_graphql_question_discussion_edges( settings=settings, after=last_edge.cursor ) return discussion_nodes def get_discussions_experts( discussion_nodes: List[DiscussionsNode], ) -> DiscussionExpertsResults: commenters = Counter() last_month_commenters = Counter() three_months_commenters = Counter() six_months_commenters = Counter() one_year_commenters = Counter() authors: Dict[str, Author] = {} now = datetime.now(tz=timezone.utc) one_month_ago = now - timedelta(days=30) three_months_ago = now - timedelta(days=90) six_months_ago = now - timedelta(days=180) one_year_ago = now - timedelta(days=365) for discussion in discussion_nodes: discussion_author_name = None if discussion.author: authors[discussion.author.login] = discussion.author discussion_author_name = discussion.author.login discussion_commentors: dict[str, datetime] = {} for comment in discussion.comments.nodes: if comment.author: authors[comment.author.login] = comment.author if comment.author.login != discussion_author_name: author_time = discussion_commentors.get( comment.author.login, comment.createdAt ) discussion_commentors[comment.author.login] = max( author_time, comment.createdAt ) for reply in comment.replies.nodes: if reply.author: authors[reply.author.login] = reply.author if reply.author.login != discussion_author_name: author_time = discussion_commentors.get( reply.author.login, reply.createdAt ) discussion_commentors[reply.author.login] = max( author_time, reply.createdAt ) for author_name, author_time in discussion_commentors.items(): commenters[author_name] += 1 if author_time > one_month_ago: last_month_commenters[author_name] += 1 if author_time > three_months_ago: three_months_commenters[author_name] += 1 if author_time > six_months_ago: six_months_commenters[author_name] += 1 if author_time > one_year_ago: one_year_commenters[author_name] += 1 discussion_experts_results = DiscussionExpertsResults( authors=authors, commenters=commenters, last_month_commenters=last_month_commenters, three_months_commenters=three_months_commenters, six_months_commenters=six_months_commenters, one_year_commenters=one_year_commenters, ) return discussion_experts_results def get_pr_nodes(settings: Settings) -> List[PullRequestNode]: pr_nodes: List[PullRequestNode] = [] pr_edges = get_graphql_pr_edges(settings=settings) while pr_edges: for edge in pr_edges: pr_nodes.append(edge.node) last_edge = pr_edges[-1] pr_edges = get_graphql_pr_edges(settings=settings, after=last_edge.cursor) return pr_nodes class ContributorsResults(BaseModel): contributors: Counter commenters: Counter reviewers: Counter translation_reviewers: Counter authors: Dict[str, Author] def get_contributors(pr_nodes: List[PullRequestNode]) -> ContributorsResults: contributors = Counter() commenters = Counter() reviewers = Counter() translation_reviewers = Counter() authors: Dict[str, Author] = {} for pr in pr_nodes: author_name = None if pr.author: authors[pr.author.login] = pr.author author_name = pr.author.login pr_commentors: Set[str] = set() pr_reviewers: Set[str] = set() for comment in pr.comments.nodes: if comment.author: authors[comment.author.login] = comment.author if comment.author.login == author_name: continue pr_commentors.add(comment.author.login) for author_name in pr_commentors: commenters[author_name] += 1 for review in pr.reviews.nodes: if review.author: authors[review.author.login] = review.author pr_reviewers.add(review.author.login) for label in pr.labels.nodes: if label.name == "lang-all": translation_reviewers[review.author.login] += 1 break for reviewer in pr_reviewers: reviewers[reviewer] += 1 if pr.state == "MERGED" and pr.author: contributors[pr.author.login] += 1 return ContributorsResults( contributors=contributors, commenters=commenters, reviewers=reviewers, translation_reviewers=translation_reviewers, authors=authors, ) def get_individual_sponsors(settings: Settings): nodes: List[SponsorshipAsMaintainerNode] = [] edges = get_graphql_sponsor_edges(settings=settings) while edges: for edge in edges: nodes.append(edge.node) last_edge = edges[-1] edges = get_graphql_sponsor_edges(settings=settings, after=last_edge.cursor) tiers: DefaultDict[float, Dict[str, SponsorEntity]] = defaultdict(dict) for node in nodes: tiers[node.tier.monthlyPriceInDollars][ node.sponsorEntity.login ] = node.sponsorEntity return tiers def get_top_users( *, counter: Counter, authors: Dict[str, Author], skip_users: Container[str], min_count: int = 2, ): users = [] for commenter, count in counter.most_common(50): if commenter in skip_users: continue if count >= min_count: author = authors[commenter] users.append( { "login": commenter, "count": count, "avatarUrl": author.avatarUrl, "url": author.url, } ) return users if __name__ == "__main__": logging.basicConfig(level=logging.INFO) settings = Settings() logging.info(f"Using config: {settings.model_dump_json()}") g = Github(settings.input_token.get_secret_value()) repo = g.get_repo(settings.github_repository) discussion_nodes = get_discussion_nodes(settings=settings) experts_results = get_discussions_experts(discussion_nodes=discussion_nodes) pr_nodes = get_pr_nodes(settings=settings) contributors_results = get_contributors(pr_nodes=pr_nodes) authors = {**experts_results.authors, **contributors_results.authors} maintainers_logins = {"tiangolo"} bot_names = {"codecov", "github-actions", "pre-commit-ci", "dependabot"} maintainers = [] for login in maintainers_logins: user = authors[login] maintainers.append( { "login": login, "answers": experts_results.commenters[login], "prs": contributors_results.contributors[login], "avatarUrl": user.avatarUrl, "url": user.url, } ) skip_users = maintainers_logins | bot_names experts = get_top_users( counter=experts_results.commenters, authors=authors, skip_users=skip_users, ) last_month_experts = get_top_users( counter=experts_results.last_month_commenters, authors=authors, skip_users=skip_users, ) three_months_experts = get_top_users( counter=experts_results.three_months_commenters, authors=authors, skip_users=skip_users, ) six_months_experts = get_top_users( counter=experts_results.six_months_commenters, authors=authors, skip_users=skip_users, ) one_year_experts = get_top_users( counter=experts_results.one_year_commenters, authors=authors, skip_users=skip_users, ) top_contributors = get_top_users( counter=contributors_results.contributors, authors=authors, skip_users=skip_users, ) top_reviewers = get_top_users( counter=contributors_results.reviewers, authors=authors, skip_users=skip_users, ) top_translations_reviewers = get_top_users( counter=contributors_results.translation_reviewers, authors=authors, skip_users=skip_users, ) tiers = get_individual_sponsors(settings=settings) keys = list(tiers.keys()) keys.sort(reverse=True) sponsors = [] for key in keys: sponsor_group = [] for login, sponsor in tiers[key].items(): sponsor_group.append( {"login": login, "avatarUrl": sponsor.avatarUrl, "url": sponsor.url} ) sponsors.append(sponsor_group) people = { "maintainers": maintainers, "experts": experts, "last_month_experts": last_month_experts, "three_months_experts": three_months_experts, "six_months_experts": six_months_experts, "one_year_experts": one_year_experts, "top_contributors": top_contributors, "top_reviewers": top_reviewers, "top_translations_reviewers": top_translations_reviewers, } github_sponsors = { "sponsors": sponsors, } # For local development # people_path = Path("../../../../docs/en/data/people.yml") people_path = Path("./docs/en/data/people.yml") github_sponsors_path = Path("./docs/en/data/github_sponsors.yml") people_old_content = people_path.read_text(encoding="utf-8") github_sponsors_old_content = github_sponsors_path.read_text(encoding="utf-8") new_people_content = yaml.dump( people, sort_keys=False, width=200, allow_unicode=True ) new_github_sponsors_content = yaml.dump( github_sponsors, sort_keys=False, width=200, allow_unicode=True ) if ( people_old_content == new_people_content and github_sponsors_old_content == new_github_sponsors_content ): logging.info("The FastAPI People data hasn't changed, finishing.") sys.exit(0) people_path.write_text(new_people_content, encoding="utf-8") github_sponsors_path.write_text(new_github_sponsors_content, encoding="utf-8") logging.info("Setting up GitHub Actions git user") subprocess.run(["git", "config", "user.name", "github-actions"], check=True) subprocess.run( ["git", "config", "user.email", "github-actions@github.com"], check=True ) branch_name = "fastapi-people" logging.info(f"Creating a new branch {branch_name}") subprocess.run(["git", "checkout", "-b", branch_name], check=True) logging.info("Adding updated file") subprocess.run( ["git", "add", str(people_path), str(github_sponsors_path)], check=True ) logging.info("Committing updated file") message = "👥 Update FastAPI People" result = subprocess.run(["git", "commit", "-m", message], check=True) logging.info("Pushing branch") subprocess.run(["git", "push", "origin", branch_name], check=True) logging.info("Creating PR") pr = repo.create_pull(title=message, body=message, base="master", head=branch_name) logging.info(f"Created PR: {pr.number}") logging.info("Finished") fastapi-0.110.3/.github/dependabot.yml000066400000000000000000000004671461403617600175120ustar00rootroot00000000000000version: 2 updates: # GitHub Actions - package-ecosystem: "github-actions" directory: "/" schedule: interval: "daily" commit-message: prefix: ⬆ # Python - package-ecosystem: "pip" directory: "/" schedule: interval: "monthly" commit-message: prefix: ⬆ fastapi-0.110.3/.github/workflows/000077500000000000000000000000001461403617600167105ustar00rootroot00000000000000fastapi-0.110.3/.github/workflows/build-docs.yml000066400000000000000000000114071461403617600214630ustar00rootroot00000000000000name: Build Docs on: push: branches: - master pull_request: types: - opened - synchronize jobs: changes: runs-on: ubuntu-latest # Required permissions permissions: pull-requests: read # Set job outputs to values from filter step outputs: docs: ${{ steps.filter.outputs.docs }} steps: - uses: actions/checkout@v4 # For pull requests it's not necessary to checkout the code but for master it is - uses: dorny/paths-filter@v3 id: filter with: filters: | docs: - README.md - docs/** - docs_src/** - requirements-docs.txt - pyproject.toml - mkdocs.yml - mkdocs.insiders.yml - .github/workflows/build-docs.yml - .github/workflows/deploy-docs.yml langs: needs: - changes runs-on: ubuntu-latest outputs: langs: ${{ steps.show-langs.outputs.langs }} steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.11" - uses: actions/cache@v4 id: cache with: path: ${{ env.pythonLocation }} key: ${{ runner.os }}-python-docs-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'requirements-docs.txt', 'requirements-docs-tests.txt') }}-v07 - name: Install docs extras if: steps.cache.outputs.cache-hit != 'true' run: pip install -r requirements-docs.txt # Install MkDocs Material Insiders here just to put it in the cache for the rest of the steps - name: Install Material for MkDocs Insiders if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' ) && steps.cache.outputs.cache-hit != 'true' run: | pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/squidfunk/mkdocs-material-insiders.git pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/griffe-typing-deprecated.git pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/mkdocstrings-python.git - name: Verify Docs run: python ./scripts/docs.py verify-docs - name: Export Language Codes id: show-langs run: | echo "langs=$(python ./scripts/docs.py langs-json)" >> $GITHUB_OUTPUT build-docs: needs: - changes - langs if: ${{ needs.changes.outputs.docs == 'true' }} runs-on: ubuntu-latest strategy: matrix: lang: ${{ fromJson(needs.langs.outputs.langs) }} steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.11" - uses: actions/cache@v4 id: cache with: path: ${{ env.pythonLocation }} key: ${{ runner.os }}-python-docs-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'requirements-docs.txt', 'requirements-docs-tests.txt') }}-v08 - name: Install docs extras if: steps.cache.outputs.cache-hit != 'true' run: pip install -r requirements-docs.txt - name: Install Material for MkDocs Insiders if: ( github.event_name != 'pull_request' || github.secret_source == 'Actions' ) && steps.cache.outputs.cache-hit != 'true' run: | pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/squidfunk/mkdocs-material-insiders.git pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/griffe-typing-deprecated.git pip install git+https://${{ secrets.FASTAPI_MKDOCS_MATERIAL_INSIDERS }}@github.com/pawamoy-insiders/mkdocstrings-python.git - name: Update Languages run: python ./scripts/docs.py update-languages - uses: actions/cache@v4 with: key: mkdocs-cards-${{ matrix.lang }}-${{ github.ref }} path: docs/${{ matrix.lang }}/.cache - name: Build Docs run: python ./scripts/docs.py build-lang ${{ matrix.lang }} - uses: actions/upload-artifact@v3 with: name: docs-site path: ./site/** # https://github.com/marketplace/actions/alls-green#why docs-all-green: # This job does nothing and is only used for the branch protection if: always() needs: - build-docs runs-on: ubuntu-latest steps: - name: Decide whether the needed jobs succeeded or failed uses: re-actors/alls-green@release/v1 with: jobs: ${{ toJSON(needs) }} allowed-skips: build-docs fastapi-0.110.3/.github/workflows/deploy-docs.yml000066400000000000000000000032211461403617600216530ustar00rootroot00000000000000name: Deploy Docs on: workflow_run: workflows: - Build Docs types: - completed jobs: deploy-docs: runs-on: ubuntu-latest steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: actions/checkout@v4 - name: Clean site run: | rm -rf ./site mkdir ./site - name: Download Artifact Docs id: download uses: dawidd6/action-download-artifact@v3.1.4 with: if_no_artifact_found: ignore github_token: ${{ secrets.FASTAPI_PREVIEW_DOCS_DOWNLOAD_ARTIFACTS }} workflow: build-docs.yml run_id: ${{ github.event.workflow_run.id }} name: docs-site path: ./site/ - name: Deploy to Cloudflare Pages if: steps.download.outputs.found_artifact == 'true' id: deploy uses: cloudflare/pages-action@v1 with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} projectName: fastapitiangolo directory: './site' gitHubToken: ${{ secrets.GITHUB_TOKEN }} branch: ${{ ( github.event.workflow_run.head_repository.full_name == github.repository && github.event.workflow_run.head_branch == 'master' && 'main' ) || ( github.event.workflow_run.head_sha ) }} - name: Comment Deploy if: steps.deploy.outputs.url != '' uses: ./.github/actions/comment-docs-preview-in-pr with: token: ${{ secrets.FASTAPI_PREVIEW_DOCS_COMMENT_DEPLOY }} deploy_url: "${{ steps.deploy.outputs.url }}" fastapi-0.110.3/.github/workflows/issue-manager.yml000066400000000000000000000022011461403617600221660ustar00rootroot00000000000000name: Issue Manager on: schedule: - cron: "10 3 * * *" issue_comment: types: - created issues: types: - labeled pull_request_target: types: - labeled workflow_dispatch: jobs: issue-manager: if: github.repository_owner == 'tiangolo' runs-on: ubuntu-latest steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: tiangolo/issue-manager@0.5.0 with: token: ${{ secrets.FASTAPI_ISSUE_MANAGER }} config: > { "answered": { "delay": 864000, "message": "Assuming the original need was handled, this will be automatically closed now. But feel free to add more comments or create new issues or PRs." }, "changes-requested": { "delay": 2628000, "message": "As this PR had requested changes to be applied but has been inactive for a while, it's now going to be closed. But if there's anyone interested, feel free to create a new PR." } } fastapi-0.110.3/.github/workflows/label-approved.yml000066400000000000000000000011421461403617600223260ustar00rootroot00000000000000name: Label Approved on: schedule: - cron: "0 12 * * *" workflow_dispatch: jobs: label-approved: if: github.repository_owner == 'tiangolo' runs-on: ubuntu-latest steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: docker://tiangolo/label-approved:0.0.4 with: token: ${{ secrets.FASTAPI_LABEL_APPROVED }} config: > { "approved-1": { "number": 1, "await_label": "awaiting-review" } } fastapi-0.110.3/.github/workflows/latest-changes.yml000066400000000000000000000025651461403617600223450ustar00rootroot00000000000000name: Latest Changes on: pull_request_target: branches: - master types: - closed workflow_dispatch: inputs: number: description: PR number required: true debug_enabled: description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)' required: false default: 'false' jobs: latest-changes: runs-on: ubuntu-latest steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: actions/checkout@v4 with: # To allow latest-changes to commit to the main branch token: ${{ secrets.FASTAPI_LATEST_CHANGES }} # Allow debugging with tmate - name: Setup tmate session uses: mxschmitt/action-tmate@v3 if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }} with: limit-access-to-actor: true - uses: docker://tiangolo/latest-changes:0.3.0 # - uses: tiangolo/latest-changes@main with: token: ${{ secrets.GITHUB_TOKEN }} latest_changes_file: docs/en/docs/release-notes.md latest_changes_header: '## Latest Changes' end_regex: '^## ' debug_logs: true label_header_prefix: '### ' fastapi-0.110.3/.github/workflows/notify-translations.yml000066400000000000000000000017761461403617600234750ustar00rootroot00000000000000name: Notify Translations on: pull_request_target: types: - labeled - closed workflow_dispatch: inputs: number: description: PR number required: true debug_enabled: description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)' required: false default: 'false' jobs: notify-translations: runs-on: ubuntu-latest steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: actions/checkout@v4 # Allow debugging with tmate - name: Setup tmate session uses: mxschmitt/action-tmate@v3 if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }} with: limit-access-to-actor: true - uses: ./.github/actions/notify-translations with: token: ${{ secrets.FASTAPI_NOTIFY_TRANSLATIONS }} fastapi-0.110.3/.github/workflows/people.yml000066400000000000000000000022661461403617600207250ustar00rootroot00000000000000name: FastAPI People on: schedule: - cron: "0 14 1 * *" workflow_dispatch: inputs: debug_enabled: description: 'Run the build with tmate debugging enabled (https://github.com/marketplace/actions/debugging-with-tmate)' required: false default: 'false' jobs: fastapi-people: if: github.repository_owner == 'tiangolo' runs-on: ubuntu-latest steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: actions/checkout@v4 # Ref: https://github.com/actions/runner/issues/2033 - name: Fix git safe.directory in container run: mkdir -p /home/runner/work/_temp/_github_home && printf "[safe]\n\tdirectory = /github/workspace" > /home/runner/work/_temp/_github_home/.gitconfig # Allow debugging with tmate - name: Setup tmate session uses: mxschmitt/action-tmate@v3 if: ${{ github.event_name == 'workflow_dispatch' && github.event.inputs.debug_enabled == 'true' }} with: limit-access-to-actor: true - uses: ./.github/actions/people with: token: ${{ secrets.FASTAPI_PEOPLE }} fastapi-0.110.3/.github/workflows/publish.yml000066400000000000000000000020321461403617600210760ustar00rootroot00000000000000name: Publish on: release: types: - created jobs: publish: runs-on: ubuntu-latest strategy: matrix: package: - fastapi permissions: id-token: write steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.10" # Issue ref: https://github.com/actions/setup-python/issues/436 # cache: "pip" # cache-dependency-path: pyproject.toml - name: Install build dependencies run: pip install build - name: Build distribution env: TIANGOLO_BUILD_PACKAGE: ${{ matrix.package }} run: python -m build - name: Publish uses: pypa/gh-action-pypi-publish@v1.8.14 - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" fastapi-0.110.3/.github/workflows/smokeshow.yml000066400000000000000000000022271461403617600214550ustar00rootroot00000000000000name: Smokeshow on: workflow_run: workflows: [Test] types: [completed] permissions: statuses: write jobs: smokeshow: if: ${{ github.event.workflow_run.conclusion == 'success' }} runs-on: ubuntu-latest steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: actions/setup-python@v5 with: python-version: '3.9' - run: pip install smokeshow - uses: dawidd6/action-download-artifact@v3.1.4 with: github_token: ${{ secrets.FASTAPI_SMOKESHOW_DOWNLOAD_ARTIFACTS }} workflow: test.yml commit: ${{ github.event.workflow_run.head_sha }} - run: smokeshow upload coverage-html env: SMOKESHOW_GITHUB_STATUS_DESCRIPTION: Coverage {coverage-percentage} SMOKESHOW_GITHUB_COVERAGE_THRESHOLD: 100 SMOKESHOW_GITHUB_CONTEXT: coverage SMOKESHOW_GITHUB_TOKEN: ${{ secrets.FASTAPI_SMOKESHOW_UPLOAD }} SMOKESHOW_GITHUB_PR_HEAD_SHA: ${{ github.event.workflow_run.head_sha }} SMOKESHOW_AUTH_KEY: ${{ secrets.SMOKESHOW_AUTH_KEY }} fastapi-0.110.3/.github/workflows/test-redistribute.yml000066400000000000000000000025471461403617600231250ustar00rootroot00000000000000name: Test Redistribute on: push: branches: - master pull_request: types: - opened - synchronize jobs: test-redistribute: runs-on: ubuntu-latest steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.10" # Issue ref: https://github.com/actions/setup-python/issues/436 # cache: "pip" # cache-dependency-path: pyproject.toml - name: Install build dependencies run: pip install build - name: Build source distribution run: python -m build --sdist - name: Decompress source distribution run: | cd dist tar xvf fastapi*.tar.gz - name: Install test dependencies run: | cd dist/fastapi-*/ pip install -r requirements-tests.txt - name: Run source distribution tests run: | cd dist/fastapi-*/ bash scripts/test.sh - name: Build wheel distribution run: | cd dist pip wheel --no-deps fastapi-*.tar.gz - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" fastapi-0.110.3/.github/workflows/test.yml000066400000000000000000000107051461403617600204150ustar00rootroot00000000000000name: Test on: push: branches: - master pull_request: types: - opened - synchronize schedule: # cron every week on monday - cron: "0 0 * * 1" jobs: lint: runs-on: ubuntu-latest steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.11" # Issue ref: https://github.com/actions/setup-python/issues/436 # cache: "pip" # cache-dependency-path: pyproject.toml - uses: actions/cache@v4 id: cache with: path: ${{ env.pythonLocation }} key: ${{ runner.os }}-python-${{ env.pythonLocation }}-pydantic-v2-${{ hashFiles('pyproject.toml', 'requirements-tests.txt', 'requirements-docs-tests.txt') }}-test-v08 - name: Install Dependencies if: steps.cache.outputs.cache-hit != 'true' run: pip install -r requirements-tests.txt - name: Install Pydantic v2 run: pip install "pydantic>=2.0.2,<3.0.0" - name: Lint run: bash scripts/lint.sh test: runs-on: ubuntu-latest strategy: matrix: python-version: - "3.12" - "3.11" - "3.10" - "3.9" - "3.8" pydantic-version: ["pydantic-v1", "pydantic-v2"] fail-fast: false steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} # Issue ref: https://github.com/actions/setup-python/issues/436 # cache: "pip" # cache-dependency-path: pyproject.toml - uses: actions/cache@v4 id: cache with: path: ${{ env.pythonLocation }} key: ${{ runner.os }}-python-${{ env.pythonLocation }}-${{ matrix.pydantic-version }}-${{ hashFiles('pyproject.toml', 'requirements-tests.txt', 'requirements-docs-tests.txt') }}-test-v08 - name: Install Dependencies if: steps.cache.outputs.cache-hit != 'true' run: pip install -r requirements-tests.txt - name: Install Pydantic v1 if: matrix.pydantic-version == 'pydantic-v1' run: pip install "pydantic>=1.10.0,<2.0.0" - name: Install Pydantic v2 if: matrix.pydantic-version == 'pydantic-v2' run: pip install "pydantic>=2.0.2,<3.0.0" - run: mkdir coverage - name: Test run: bash scripts/test.sh env: COVERAGE_FILE: coverage/.coverage.${{ runner.os }}-py${{ matrix.python-version }} CONTEXT: ${{ runner.os }}-py${{ matrix.python-version }} - name: Store coverage files uses: actions/upload-artifact@v3 with: name: coverage path: coverage coverage-combine: needs: [test] runs-on: ubuntu-latest steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.8' # Issue ref: https://github.com/actions/setup-python/issues/436 # cache: "pip" # cache-dependency-path: pyproject.toml - name: Get coverage files uses: actions/download-artifact@v3 with: name: coverage path: coverage - run: pip install coverage[toml] - run: ls -la coverage - run: coverage combine coverage - run: coverage report - run: coverage html --show-contexts --title "Coverage for ${{ github.sha }}" - name: Store coverage HTML uses: actions/upload-artifact@v3 with: name: coverage-html path: htmlcov # https://github.com/marketplace/actions/alls-green#why check: # This job does nothing and is only used for the branch protection if: always() needs: - coverage-combine runs-on: ubuntu-latest steps: - name: Dump GitHub context env: GITHUB_CONTEXT: ${{ toJson(github) }} run: echo "$GITHUB_CONTEXT" - name: Decide whether the needed jobs succeeded or failed uses: re-actors/alls-green@release/v1 with: jobs: ${{ toJSON(needs) }} fastapi-0.110.3/.gitignore000066400000000000000000000004141461403617600153020ustar00rootroot00000000000000.idea .ipynb_checkpoints .mypy_cache .vscode __pycache__ .pytest_cache htmlcov dist site .coverage coverage.xml .netlify test.db log.txt Pipfile.lock env3.* env docs_build site_build venv docs.zip archive.zip # vim temporary files *~ .*.sw? .cache # macOS .DS_Store fastapi-0.110.3/.pre-commit-config.yaml000066400000000000000000000013411461403617600175730ustar00rootroot00000000000000# See https://pre-commit.com for more information # See https://pre-commit.com/hooks.html for more hooks default_language_version: python: python3.10 repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.4.0 hooks: - id: check-added-large-files - id: check-toml - id: check-yaml args: - --unsafe - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/charliermarsh/ruff-pre-commit rev: v0.2.0 hooks: - id: ruff args: - --fix - id: ruff-format ci: autofix_commit_msg: 🎨 [pre-commit.ci] Auto format from pre-commit.com hooks autoupdate_commit_msg: ⬆ [pre-commit.ci] pre-commit autoupdate fastapi-0.110.3/CITATION.cff000066400000000000000000000011471461403617600152100ustar00rootroot00000000000000# This CITATION.cff file was generated with cffinit. # Visit https://bit.ly/cffinit to generate yours today! cff-version: 1.2.0 title: FastAPI message: >- If you use this software, please cite it using the metadata from this file. type: software authors: - given-names: Sebastián family-names: Ramírez email: tiangolo@gmail.com identifiers: repository-code: 'https://github.com/tiangolo/fastapi' url: 'https://fastapi.tiangolo.com' abstract: >- FastAPI framework, high performance, easy to learn, fast to code, ready for production keywords: - fastapi - pydantic - starlette license: MIT fastapi-0.110.3/CONTRIBUTING.md000066400000000000000000000001771461403617600155510ustar00rootroot00000000000000Please read the [Development - Contributing](https://fastapi.tiangolo.com/contributing/) guidelines in the documentation site. fastapi-0.110.3/LICENSE000066400000000000000000000020761461403617600143250ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2018 Sebastián Ramírez Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. fastapi-0.110.3/README.md000066400000000000000000000535561461403617600146100ustar00rootroot00000000000000

FastAPI

FastAPI framework, high performance, easy to learn, fast to code, ready for production

Test Coverage Package version Supported Python versions

--- **Documentation**: https://fastapi.tiangolo.com **Source Code**: https://github.com/tiangolo/fastapi --- FastAPI is a modern, fast (high-performance), web framework for building APIs with Python based on standard Python type hints. The key features are: * **Fast**: Very high performance, on par with **NodeJS** and **Go** (thanks to Starlette and Pydantic). [One of the fastest Python frameworks available](#performance). * **Fast to code**: Increase the speed to develop features by about 200% to 300%. * * **Fewer bugs**: Reduce about 40% of human (developer) induced errors. * * **Intuitive**: Great editor support. Completion everywhere. Less time debugging. * **Easy**: Designed to be easy to use and learn. Less time reading docs. * **Short**: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs. * **Robust**: Get production-ready code. With automatic interactive documentation. * **Standards-based**: Based on (and fully compatible with) the open standards for APIs: OpenAPI (previously known as Swagger) and JSON Schema. * estimation based on tests on an internal development team, building production applications. ## Sponsors Other sponsors ## Opinions "_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._"
Kabir Khan - Microsoft (ref)
--- "_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_"
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
--- "_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_"
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
--- "_I’m over the moon excited about **FastAPI**. It’s so fun!_"
Brian Okken - Python Bytes podcast host (ref)
--- "_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._"
Timothy Crosley - Hug creator (ref)
--- "_If you're looking to learn one **modern framework** for building REST APIs, check out **FastAPI** [...] It's fast, easy to use and easy to learn [...]_" "_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_"
Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)
--- "_If anyone is looking to build a production Python API, I would highly recommend **FastAPI**. It is **beautifully designed**, **simple to use** and **highly scalable**, it has become a **key component** in our API first development strategy and is driving many automations and services such as our Virtual TAC Engineer._"
Deon Pillsbury - Cisco (ref)
--- ## **Typer**, the FastAPI of CLIs If you are building a CLI app to be used in the terminal instead of a web API, check out **Typer**. **Typer** is FastAPI's little sibling. And it's intended to be the **FastAPI of CLIs**. ⌨️ 🚀 ## Requirements FastAPI stands on the shoulders of giants: * Starlette for the web parts. * Pydantic for the data parts. ## Installation
```console $ pip install fastapi ---> 100% ```
You will also need an ASGI server, for production such as Uvicorn or Hypercorn.
```console $ pip install "uvicorn[standard]" ---> 100% ```
## Example ### Create it * Create a file `main.py` with: ```Python from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ```
Or use async def... If your code uses `async` / `await`, use `async def`: ```Python hl_lines="9 14" from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") async def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") async def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ``` **Note**: If you don't know, check the _"In a hurry?"_ section about `async` and `await` in the docs.
### Run it Run the server with:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [28720] INFO: Started server process [28722] INFO: Waiting for application startup. INFO: Application startup complete. ```
About the command uvicorn main:app --reload... The command `uvicorn main:app` refers to: * `main`: the file `main.py` (the Python "module"). * `app`: the object created inside of `main.py` with the line `app = FastAPI()`. * `--reload`: make the server restart after code changes. Only do this for development.
### Check it Open your browser at http://127.0.0.1:8000/items/5?q=somequery. You will see the JSON response as: ```JSON {"item_id": 5, "q": "somequery"} ``` You already created an API that: * Receives HTTP requests in the _paths_ `/` and `/items/{item_id}`. * Both _paths_ take `GET` operations (also known as HTTP _methods_). * The _path_ `/items/{item_id}` has a _path parameter_ `item_id` that should be an `int`. * The _path_ `/items/{item_id}` has an optional `str` _query parameter_ `q`. ### Interactive API docs Now go to http://127.0.0.1:8000/docs. You will see the automatic interactive API documentation (provided by Swagger UI): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Alternative API docs And now, go to http://127.0.0.1:8000/redoc. You will see the alternative automatic documentation (provided by ReDoc): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ## Example upgrade Now modify the file `main.py` to receive a body from a `PUT` request. Declare the body using standard Python types, thanks to Pydantic. ```Python hl_lines="4 9-12 25-27" from typing import Union from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str price: float is_offer: Union[bool, None] = None @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} @app.put("/items/{item_id}") def update_item(item_id: int, item: Item): return {"item_name": item.name, "item_id": item_id} ``` The server should reload automatically (because you added `--reload` to the `uvicorn` command above). ### Interactive API docs upgrade Now go to http://127.0.0.1:8000/docs. * The interactive API documentation will be automatically updated, including the new body: ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) * Click on the button "Try it out", it allows you to fill the parameters and directly interact with the API: ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) * Then click on the "Execute" button, the user interface will communicate with your API, send the parameters, get the results and show them on the screen: ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) ### Alternative API docs upgrade And now, go to http://127.0.0.1:8000/redoc. * The alternative documentation will also reflect the new query parameter and body: ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ### Recap In summary, you declare **once** the types of parameters, body, etc. as function parameters. You do that with standard modern Python types. You don't have to learn a new syntax, the methods or classes of a specific library, etc. Just standard **Python**. For example, for an `int`: ```Python item_id: int ``` or for a more complex `Item` model: ```Python item: Item ``` ...and with that single declaration you get: * Editor support, including: * Completion. * Type checks. * Validation of data: * Automatic and clear errors when the data is invalid. * Validation even for deeply nested JSON objects. * Conversion of input data: coming from the network to Python data and types. Reading from: * JSON. * Path parameters. * Query parameters. * Cookies. * Headers. * Forms. * Files. * Conversion of output data: converting from Python data and types to network data (as JSON): * Convert Python types (`str`, `int`, `float`, `bool`, `list`, etc). * `datetime` objects. * `UUID` objects. * Database models. * ...and many more. * Automatic interactive API documentation, including 2 alternative user interfaces: * Swagger UI. * ReDoc. --- Coming back to the previous code example, **FastAPI** will: * Validate that there is an `item_id` in the path for `GET` and `PUT` requests. * Validate that the `item_id` is of type `int` for `GET` and `PUT` requests. * If it is not, the client will see a useful, clear error. * Check if there is an optional query parameter named `q` (as in `http://127.0.0.1:8000/items/foo?q=somequery`) for `GET` requests. * As the `q` parameter is declared with `= None`, it is optional. * Without the `None` it would be required (as is the body in the case with `PUT`). * For `PUT` requests to `/items/{item_id}`, Read the body as JSON: * Check that it has a required attribute `name` that should be a `str`. * Check that it has a required attribute `price` that has to be a `float`. * Check that it has an optional attribute `is_offer`, that should be a `bool`, if present. * All this would also work for deeply nested JSON objects. * Convert from and to JSON automatically. * Document everything with OpenAPI, that can be used by: * Interactive documentation systems. * Automatic client code generation systems, for many languages. * Provide 2 interactive documentation web interfaces directly. --- We just scratched the surface, but you already get the idea of how it all works. Try changing the line with: ```Python return {"item_name": item.name, "item_id": item_id} ``` ...from: ```Python ... "item_name": item.name ... ``` ...to: ```Python ... "item_price": item.price ... ``` ...and see how your editor will auto-complete the attributes and know their types: ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) For a more complete example including more features, see the Tutorial - User Guide. **Spoiler alert**: the tutorial - user guide includes: * Declaration of **parameters** from other different places as: **headers**, **cookies**, **form fields** and **files**. * How to set **validation constraints** as `maximum_length` or `regex`. * A very powerful and easy to use **Dependency Injection** system. * Security and authentication, including support for **OAuth2** with **JWT tokens** and **HTTP Basic** auth. * More advanced (but equally easy) techniques for declaring **deeply nested JSON models** (thanks to Pydantic). * **GraphQL** integration with Strawberry and other libraries. * Many extra features (thanks to Starlette) as: * **WebSockets** * extremely easy tests based on HTTPX and `pytest` * **CORS** * **Cookie Sessions** * ...and more. ## Performance Independent TechEmpower benchmarks show **FastAPI** applications running under Uvicorn as one of the fastest Python frameworks available, only below Starlette and Uvicorn themselves (used internally by FastAPI). (*) To understand more about it, see the section Benchmarks. ## Optional Dependencies Used by Pydantic: * email_validator - for email validation. * pydantic-settings - for settings management. * pydantic-extra-types - for extra types to be used with Pydantic. Used by Starlette: * httpx - Required if you want to use the `TestClient`. * jinja2 - Required if you want to use the default template configuration. * python-multipart - Required if you want to support form "parsing", with `request.form()`. * itsdangerous - Required for `SessionMiddleware` support. * pyyaml - Required for Starlette's `SchemaGenerator` support (you probably don't need it with FastAPI). Used by FastAPI / Starlette: * uvicorn - for the server that loads and serves your application. * orjson - Required if you want to use `ORJSONResponse`. * ujson - Required if you want to use `UJSONResponse`. You can install all of these with `pip install "fastapi[all]"`. ## License This project is licensed under the terms of the MIT license. fastapi-0.110.3/SECURITY.md000066400000000000000000000024561461403617600151130ustar00rootroot00000000000000# Security Policy Security is very important for FastAPI and its community. 🔒 Learn more about it below. 👇 ## Versions The latest version of FastAPI is supported. You are encouraged to [write tests](https://fastapi.tiangolo.com/tutorial/testing/) for your application and update your FastAPI version frequently after ensuring that your tests are passing. This way you will benefit from the latest features, bug fixes, and **security fixes**. You can learn more about [FastAPI versions and how to pin and upgrade them](https://fastapi.tiangolo.com/deployment/versions/) for your project in the docs. ## Reporting a Vulnerability If you think you found a vulnerability, and even if you are not sure about it, please report it right away by sending an email to: security@tiangolo.com. Please try to be as explicit as possible, describing all the steps and example code to reproduce the security issue. I (the author, [@tiangolo](https://twitter.com/tiangolo)) will review it thoroughly and get back to you. ## Public Discussions Please restrain from publicly discussing a potential security vulnerability. 🙊 It's better to discuss privately and try to find a solution first, to limit the potential impact as much as possible. --- Thanks for your help! The FastAPI community and I thank you for that. 🙇 fastapi-0.110.3/docs/000077500000000000000000000000001461403617600142435ustar00rootroot00000000000000fastapi-0.110.3/docs/az/000077500000000000000000000000001461403617600146555ustar00rootroot00000000000000fastapi-0.110.3/docs/az/docs/000077500000000000000000000000001461403617600156055ustar00rootroot00000000000000fastapi-0.110.3/docs/az/docs/fastapi-people.md000066400000000000000000000156261461403617600210520ustar00rootroot00000000000000--- hide: - navigation --- # FastAPI İnsanlar FastAPI-ın bütün mənşəli insanları qəbul edən heyrətamiz icması var. ## Yaradıcı - İcraçı Salam! 👋 Bu mənəm: {% if people %}
{% for user in people.maintainers %}
@{{ user.login }}
Cavablar: {{ user.answers }}
Pull Request-lər: {{ user.prs }}
{% endfor %}
{% endif %} Mən **FastAPI**-ın yaradıcısı və icraçısıyam. Əlavə məlumat almaq üçün [Yardım FastAPI - Yardım alın - Müəlliflə əlaqə qurun](help-fastapi.md#connect-with-the-author){.internal-link target=_blank} səhifəsinə baxa bilərsiniz. ...Burada isə sizə icmanı göstərmək istəyirəm. --- **FastAPI** icmadan çoxlu dəstək alır və mən onların əməyini vurğulamaq istəyirəm. Bu insanlar: * [GitHub-da başqalarının suallarına kömək edirlər](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}. * [Pull Request-lər yaradırlar](help-fastapi.md#create-a-pull-request){.internal-link target=_blank}. * Pull Request-ləri ([xüsusilə tərcümələr üçün vacib olan](contributing.md#translations){.internal-link target=_blank}.) nəzərdən keçirirlər. Bu insanlara təşəkkür edirəm. 👏 🙇 ## Keçən ayın ən fəal istifadəçiləri Bu istifadəçilər keçən ay [GitHub-da başqalarının suallarına](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} ən çox kömək edənlərdir. ☕ {% if people %}
{% for user in people.last_month_experts[:10] %}
@{{ user.login }}
Cavablandırılmış suallar: {{ user.count }}
{% endfor %}
{% endif %} ## Mütəxəssislər Burada **FastAPI Mütəxəssisləri** var. 🤓 Bu istifadəçilər indiyə qədər [GitHub-da başqalarının suallarına](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} ən çox kömək edənlərdir. Onlar bir çox insanlara kömək edərək mütəxəssis olduqlarını sübut ediblər. ✨ {% if people %}
{% for user in people.experts[:50] %}
@{{ user.login }}
Cavablandırılmış suallar: {{ user.count }}
{% endfor %}
{% endif %} ## Ən yaxşı əməkdaşlar Burada **Ən yaxşı əməkdaşlar** var. 👷 Bu istifadəçilərin ən çox *birləşdirilmiş* [Pull Request-ləri var](help-fastapi.md#create-a-pull-request){.internal-link target=_blank}. Onlar mənbə kodu, sənədləmə, tərcümələr və s. barədə əmək göstərmişlər. 📦 {% if people %}
{% for user in people.top_contributors[:50] %}
@{{ user.login }}
Pull Request-lər: {{ user.count }}
{% endfor %}
{% endif %} Bundan başqa bir neçə (yüzdən çox) əməkdaş var ki, onları FastAPI GitHub Əməkdaşlar səhifəsində görə bilərsiniz. 👷 ## Ən çox rəy verənlər Bu istifadəçilər **ən çox rəy verənlər**dir. ### Tərcümələr üçün rəylər Mən yalnız bir neçə dildə danışıram (və çox da yaxşı deyil 😅). Bu səbəbdən, rəy verənlər sənədlərin [**tərcümələrini təsdiqləmək üçün gücə malik olanlar**](contributing.md#translations){.internal-link target=_blank}dır. Onlar olmadan, bir çox dilə tərcümə olunmuş sənədlər olmazdı. --- Başqalarının Pull Request-lərinə **Ən çox rəy verənlər** 🕵️ kodun, sənədlərin və xüsusilə də **tərcümələrin** keyfiyyətini təmin edirlər. {% if people %}
{% for user in people.top_translations_reviewers[:50] %}
@{{ user.login }}
Rəylər: {{ user.count }}
{% endfor %}
{% endif %} ## Sponsorlar Bunlar **Sponsorlar**dır. 😎 Onlar mənim **FastAPI** (və digər) işlərimi əsasən GitHub Sponsorlar vasitəsilə dəstəkləyirlər. {% if sponsors %} {% if sponsors.gold %} ### Qızıl Sponsorlar {% for sponsor in sponsors.gold -%} {% endfor %} {% endif %} {% if sponsors.silver %} ### Gümüş Sponsorlar {% for sponsor in sponsors.silver -%} {% endfor %} {% endif %} {% if sponsors.bronze %} ### Bürünc Sponsorlar {% for sponsor in sponsors.bronze -%} {% endfor %} {% endif %} {% endif %} ### Fərdi Sponsorlar {% if github_sponsors %} {% for group in github_sponsors.sponsors %}
{% for user in group %} {% if user.login not in sponsors_badge.logins %} {% endif %} {% endfor %}
{% endfor %} {% endif %} ## Məlumatlar haqqında - texniki detallar Bu səhifənin əsas məqsədi, icmanın başqalarına kömək etmək üçün göstərdiyi əməyi vurğulamaqdır. Xüsusilə də normalda daha az görünən və bir çox hallarda daha çətin olan, başqalarının suallarına kömək etmək və tərcümələrlə bağlı Pull Request-lərə rəy vermək kimi səy göstərmək. Bu səhifənin məlumatları hər ay hesablanır və siz buradan mənbə kodunu oxuya bilərsiniz. Burada sponsorların əməyini də vurğulamaq istəyirəm. Mən həmçinin alqoritmi, bölmələri, eşikləri və s. yeniləmək hüququnu da qoruyuram (hər ehtimala qarşı 🤷). fastapi-0.110.3/docs/az/docs/index.md000066400000000000000000000554011461403617600172430ustar00rootroot00000000000000

FastAPI

FastAPI framework, yüksək məshuldarlı, öyrənməsi asan, çevik kodlama, istifadəyə hazırdır

Test Əhatə Paket versiyası Dəstəklənən Python versiyaları

--- **Sənədlər**: https://fastapi.tiangolo.com **Qaynaq Kodu**: https://github.com/tiangolo/fastapi --- FastAPI Python ilə API yaratmaq üçün standart Python tip məsləhətlərinə əsaslanan, müasir, sürətli (yüksək performanslı) framework-dür. Əsas xüsusiyyətləri bunlardır: * **Sürətli**: Çox yüksək performans, **NodeJS** və **Go** səviyyəsində (Starlette və Pydantic-ə təşəkkürlər). [Ən sürətli Python frameworklərindən biridir](#performans). * **Çevik kodlama**: Funksiyanallıqları inkişaf etdirmək sürətini təxminən 200%-dən 300%-ə qədər artırın. * * **Daha az xəta**: İnsan (developer) tərəfindən törədilən səhvlərin təxminən 40% -ni azaldın. * * **İntuitiv**: Əla redaktor dəstəyi. Hər yerdə otomatik tamamlama. Xətaları müəyyənləşdirməyə daha az vaxt sərf edəcəksiniz. * **Asan**: İstifadəsi və öyrənilməsi asan olması üçün nəzərdə tutulmuşdur. Sənədləri oxumaq üçün daha az vaxt ayıracaqsınız. * **Qısa**: Kod təkrarlanmasını minimuma endirin. Hər bir parametr tərifində birdən çox xüsusiyyət ilə və daha az səhvlə qarşılaşacaqsınız. * **Güclü**: Avtomatik və interaktiv sənədlərlə birlikdə istifadəyə hazır kod əldə edə bilərsiniz. * **Standartlara əsaslanan**: API-lar üçün açıq standartlara əsaslanır (və tam uyğun gəlir): OpenAPI (əvvəlki adı ilə Swagger) və JSON Schema. * Bu fikirlər daxili development komandasının hazırladıqları məhsulların sınaqlarına əsaslanır. ## Sponsorlar {% if sponsors %} {% for sponsor in sponsors.gold -%} {% endfor -%}` {%- for sponsor in sponsors.silver -%} {% endfor %} {% endif %} Digər sponsorlar ## Rəylər "_[...] Son günlərdə **FastAPI**-ı çox istifadə edirəm. [...] Əslində onu komandamın bütün **Microsoftda ML sevislərində** istifadə etməyi planlayıram. Onların bəziləri **windows**-un əsas məhsuluna və bəzi **Office** məhsullarına inteqrasiya olunurlar._"
Kabir Khan - Microsoft (ref)
--- "_**FastAPI** kitabxanasını **Proqnozlar** əldə etmək üçün sorğulana bilən **REST** serverini yaratmaqda istifadə etdik._"
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
--- "_**Netflix** **böhran idarəçiliyi** orkestrləşmə framework-nün açıq qaynaqlı buraxılışını elan etməkdən məmnundur: **Dispatch**! [**FastAPI** ilə quruldu]_"
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
--- "_**FastAPI** üçün həyəcanlıyam. Çox əyləncəlidir!_"
Brian Okken - Python Bytes podcast host (ref)
--- "_Düzünü desəm, sizin qurduğunuz şey həqiqətən möhkəm və peşəkar görünür. Bir çox cəhətdən **Hug**-un olmasını istədiyim kimdir - kiminsə belə bir şey qurduğunu görmək həqiqətən ruhlandırıcıdır._"
Timothy Crosley - Hug creator (ref)
--- "_Əgər REST API-lər yaratmaq üçün **müasir framework** öyrənmək istəyirsinizsə, **FastAPI**-a baxın [...] Sürətli, istifadəsi və öyrənməsi asandır. [...]_" "_**API** xidmətlərimizi **FastAPI**-a köçürdük [...] Sizin də bəyənəcəyinizi düşünürük._"
Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)
--- "_Python ilə istifadəyə hazır API qurmaq istəyən hər kəsə **FastAPI**-ı tövsiyə edirəm. **Möhtəşəm şəkildə dizayn edilmiş**, **istifadəsi asan** və **yüksək dərəcədə genişlənə bilən**-dir, API əsaslı inkişaf strategiyamızın **əsas komponentinə** çevrilib və Virtual TAC Engineer kimi bir çox avtomatlaşdırma və servisləri idarə edir._"
Deon Pillsbury - Cisco (ref)
--- ## **Typer**, CLI-ların FastAPI-ı Əgər siz veb API əvəzinə terminalda istifadə ediləcək CLI proqramı qurursunuzsa, **Typer**-a baxa bilərsiniz. **Typer** FastAPI-ın kiçik qardaşıdır. Və o, CLI-lərin **FastAPI**-ı olmaq üçün nəzərdə tutulub. ⌨️ 🚀 ## Tələblər FastAPI nəhənglərin çiyinlərində dayanır: * Web tərəfi üçün Starlette. * Data tərəfi üçün Pydantic. ## Quraşdırma
```console $ pip install fastapi ---> 100% ```
Tətbiqimizi əlçatan etmək üçün bizə Uvicorn və ya Hypercorn kimi ASGI server lazımdır.
```console $ pip install "uvicorn[standard]" ---> 100% ```
## Nümunə ### Kodu yaradaq * `main.py` adlı fayl yaradaq və ona aşağıdakı kodu yerləşdirək: ```Python from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ```
Və ya async def... Əgər kodunuzda `async` və ya `await` vardırsa `async def` istifadə edə bilərik: ```Python hl_lines="9 14" from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") async def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") async def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ``` **Qeyd**: Əgər bu mövzu haqqında məlumatınız yoxdursa `async` və `await` sənədindəki _"Tələsirsən?"_ bölməsinə baxa bilərsiniz.
### Kodu işə salaq Serveri aşağıdakı əmr ilə işə salaq:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [28720] INFO: Started server process [28722] INFO: Waiting for application startup. INFO: Application startup complete. ```
uvicorn main:app --reload əmri haqqında... `uvicorn main:app` əmri aşağıdakılara instinad edir: * `main`: `main.py` faylı (yəni Python "modulu"). * `app`: `main.py` faylında `app = FastAPI()` sətrində yaratdığımız `FastAPI` obyektidir. * `--reload`: kod dəyişikliyindən sonra avtomatik olaraq serveri yenidən işə salır. Bu parametrdən yalnız development mərhələsində istifadə etməliyik.
### İndi yoxlayaq Bu linki brauzerimizdə açaq http://127.0.0.1:8000/items/5?q=somequery. Aşağıdakı kimi bir JSON cavabı görəcəksiniz: ```JSON {"item_id": 5, "q": "somequery"} ``` Siz artıq bir API yaratmısınız, hansı ki: * `/` və `/items/{item_id}` _yollarında_ HTTP sorğularını qəbul edir. * Hər iki _yolda_ `GET` əməliyyatlarını (həmçinin HTTP _metodları_ kimi bilinir) aparır. * `/items/{item_id}` _yolu_ `item_id` adlı `int` qiyməti almalı olan _yol parametrinə_ sahibdir. * `/items/{item_id}` _yolunun_ `q` adlı yol parametri var və bu parametr istəyə bağlı olsa da, `str` qiymətini almalıdır. ### İnteraktiv API Sənədləri İndi http://127.0.0.1:8000/docs ünvanına daxil olun. Avtomatik interaktiv API sənədlərini görəcəksiniz (Swagger UI tərəfindən təmin edilir): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Alternativ API sənədləri İndi isə http://127.0.0.1:8000/redoc ünvanına daxil olun. ReDoc tərəfindən təqdim edilən avtomatik sənədləri görəcəksiniz: ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ## Nümunəni Yeniləyək İndi gəlin `main.py` faylını `PUT` sorğusu ilə birlikdə gövdə qəbul edəcək şəkildə dəyişdirək. Pydantic sayəsində standart Python tiplərindən istifadə edərək gövdəni müəyyən edək. ```Python hl_lines="4 9-12 25-27" from typing import Union from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str price: float is_offer: Union[bool, None] = None @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} @app.put("/items/{item_id}") def update_item(item_id: int, item: Item): return {"item_name": item.name, "item_id": item_id} ``` Server avtomatik olaraq yenidən işə salınmalı idi (çünki biz yuxarıda `uvicorn` əmri ilə `--reload` parametrindən istifadə etmişik). ### İnteraktiv API sənədlərindəki dəyişikliyə baxaq Yenidən http://127.0.0.1:8000/docs ünvanına daxil olun. * İnteraktiv API sənədləri yeni gövdə də daxil olmaq ilə avtomatik olaraq yenilənəcək: ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) * "Try it out" düyməsini klikləyin, bu, parametrləri doldurmağa və API ilə birbaşa əlaqə saxlamağa imkan verir: ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) * Sonra "Execute" düyməsini klikləyin, istifadəçi interfeysi API ilə əlaqə quracaq, parametrləri göndərəcək, nəticələri əldə edəcək və onları ekranda göstərəcək: ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) ### Alternativ API Sənədlərindəki Dəyişikliyə Baxaq İndi isə yenidən http://127.0.0.1:8000/redoc ünvanına daxil olun. * Alternativ sənədlər həm də yeni sorğu parametri və gövdəsini əks etdirəcək: ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ### Xülasə Ümumiləşdirsək, parametrlər, gövdə və s. Biz məlumat növlərini **bir dəfə** funksiya parametrləri kimi təyin edirik. Bunu standart müasir Python tipləri ilə edirsiniz. Yeni sintaksis, müəyyən bir kitabxananın metodlarını və ya siniflərini və s. öyrənmək məcburiyyətində deyilsiniz. Sadəcə standart **Python**. Məsələn, `int` üçün: ```Python item_id: int ``` və ya daha mürəkkəb `Item` modeli üçün: ```Python item: Item ``` ...və yalnız parametr tipini təyin etməklə bunları əldə edirsiniz: * Redaktor dəstəyi ilə: * Avtomatik tamamlama. * Tip yoxlanması. * Məlumatların Təsdiqlənməsi: * Məlumat etibarsız olduqda avtomatik olaraq aydın xətalar göstərir. * Hətta çox dərin JSON obyektlərində belə doğrulama aparır. * Daxil olan məlumatları çevirmək üçün aşağıdakı məlumat növlərindən istifadə edilir: * JSON. * Yol parametrləri. * Sorğu parametrləri. * Çərəzlər. * Başlıqlaq. * Formalar. * Fayllar. * Daxil olan məlumatları çevirmək üçün aşağıdakı məlumat növlərindən istifadə edilir (JSON olaraq): * Python tiplərinin (`str`, `int`, `float`, `bool`, `list`, və s) çevrilməsi. * `datetime` obyektləri. * `UUID` obyektləri. * Verilənlər bazası modelləri. * və daha çoxu... * 2 alternativ istifadəçi interfeysi daxil olmaqla avtomatik interaktiv API sənədlərini təmin edir: * Swagger UI. * ReDoc. --- Gəlin əvvəlki nümunəyə qayıdaq və **FastAPI**-nin nələr edəcəyinə nəzər salaq: * `GET` və `PUT` sorğuları üçün `item_id`-nin yolda olub-olmadığını yoxlayacaq. * `item_id`-nin `GET` və `PUT` sorğuları üçün növünün `int` olduğunu yoxlayacaq. * Əgər `int` deyilsə, səbəbini göstərən bir xəta mesajı göstərəcəkdir. * məcburi olmayan `q` parametrinin `GET` (`http://127.0.0.1:8000/items/foo?q=somequery` burdakı kimi) sorğusu içərisində olub olmadığını yoxlayacaq. * `q` parametrini `= None` ilə yaratdığımız üçün, məcburi olmayan parametr olacaq. * Əgər `None` olmasaydı, bu məcburi parametr olardı (`PUT` metodunun gövdəsində olduğu kimi). * `PUT` sorğusu üçün, `/items/{item_id}` gövdəsini JSON olaraq oxuyacaq: * `name` adında məcburi bir parametr olub olmadığını və əgər varsa, tipinin `str` olub olmadığını yoxlayacaq. * `price` adında məcburi bir parametr olub olmadığını və əgər varsa, tipinin `float` olub olmadığını yoxlayacaq. * `is_offer` adında məcburi olmayan bir parametr olub olmadığını və əgər varsa, tipinin `float` olub olmadığını yoxlayacaq. * Bütün bunlar ən dərin JSON obyektlərində belə işləyəcək. * Məlumatların JSON-a və JSON-un Python obyektinə çevrilməsi avtomatik həyata keçiriləcək. * Hər şeyi OpenAPI ilə uyğun olacaq şəkildə avtomatik olaraq sənədləşdirəcək və onları aşağıdakı kimi istifadə edə biləcək: * İnteraktiv sənədləşmə sistemləri. * Bir çox proqramlaşdırma dilləri üçün avtomatlaşdırılmış müştəri kodu yaratma sistemləri. * 2 interaktiv sənədləşmə veb interfeysini birbaşa təmin edəcək. --- Yeni başlamışıq, amma siz artıq işin məntiqini başa düşmüsünüz. İndi aşağıdakı sətri dəyişdirməyə çalışın: ```Python return {"item_name": item.name, "item_id": item_id} ``` ...bundan: ```Python ... "item_name": item.name ... ``` ...buna: ```Python ... "item_price": item.price ... ``` ...və redaktorun məlumat tiplərini bildiyini və avtomatik tamaladığını görəcəksiniz: ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) Daha çox funksiyaya malik daha dolğun nümunə üçün Öyrədici - İstifadəçi Təlimatı səhifəsinə baxa bilərsiniz. **Spoiler xəbərdarlığı**: Öyrədici - istifadəçi təlimatına bunlar daxildir: * **Parametrlərin**, **başlıqlar**, çərəzlər, **forma sahələri** və **fayllar** olaraq müəyyən edilməsi. * `maximum_length` və ya `regex` kimi **doğrulama məhdudiyyətlərinin** necə təyin ediləcəyi. * Çox güclü və istifadəsi asan **Dependency Injection** sistemi. * Təhlükəsizlik və autentifikasiya, **JWT tokenləri** ilə **OAuth2** dəstəyi və **HTTP Basic** autentifikasiyası. * **çox dərin JSON modellərini** müəyyən etmək üçün daha irəli səviyyə (lakin eyni dərəcədə asan) üsullar (Pydantic sayəsində). * Strawberry və digər kitabxanalar ilə **GraphQL** inteqrasiyası. * Digər əlavə xüsusiyyətlər (Starlette sayəsində): * **WebSockets** * HTTPX və `pytest` sayəsində çox asan testlər * **CORS** * **Cookie Sessions** * ...və daha çoxu. ## Performans Müstəqil TechEmpower meyarları göstərir ki, Uvicorn üzərində işləyən **FastAPI** proqramları ən sürətli Python kitabxanalarından biridir, yalnız Starlette və Uvicorn-un özündən yavaşdır, ki FastAPI bunların üzərinə qurulmuş bir framework-dür. (*) Ətraflı məlumat üçün bu bölməyə nəzər salın Müqayisələr. ## Məcburi Olmayan Tələblər Pydantic tərəfindən istifadə olunanlar: * email_validator - e-poçtun yoxlanılması üçün. * pydantic-settings - parametrlərin idarə edilməsi üçün. * pydantic-extra-types - Pydantic ilə istifadə edilə bilən əlavə tiplər üçün. Starlette tərəfindən istifadə olunanlar: * httpx - Əgər `TestClient` strukturundan istifadə edəcəksinizsə, tələb olunur. * jinja2 - Standart şablon konfiqurasiyasından istifadə etmək istəyirsinizsə, tələb olunur. * python-multipart - `request.form()` ilə forma "çevirmə" dəstəyindən istifadə etmək istəyirsinizsə, tələb olunur. * itsdangerous - `SessionMiddleware` dəstəyi üçün tələb olunur. * pyyaml - `SchemaGenerator` dəstəyi üçün tələb olunur (Çox güman ki, FastAPI istifadə edərkən buna ehtiyacınız olmayacaq). * ujson - `UJSONResponse` istifadə etmək istəyirsinizsə, tələb olunur. Həm FastAPI, həm də Starlette tərəfindən istifadə olunur: * uvicorn - Yaratdığımız proqramı servis edəcək veb server kimi fəaliyyət göstərir. * orjson - `ORJSONResponse` istifadə edəcəksinizsə tələb olunur. Bütün bunları `pip install fastapi[all]` ilə quraşdıra bilərsiniz. ## Lisenziya Bu layihə MIT lisenziyasının şərtlərinə əsasən lisenziyalaşdırılıb. fastapi-0.110.3/docs/az/docs/learn/000077500000000000000000000000001461403617600167065ustar00rootroot00000000000000fastapi-0.110.3/docs/az/docs/learn/index.md000066400000000000000000000003241461403617600203360ustar00rootroot00000000000000# Öyrən Burada **FastAPI** öyrənmək üçün giriş bölmələri və dərsliklər yer alır. Siz bunu kitab, kurs, FastAPI öyrənmək üçün rəsmi və tövsiyə olunan üsul hesab edə bilərsiniz. 😎 fastapi-0.110.3/docs/az/mkdocs.yml000066400000000000000000000000321461403617600166530ustar00rootroot00000000000000INHERIT: ../en/mkdocs.yml fastapi-0.110.3/docs/bn/000077500000000000000000000000001461403617600146425ustar00rootroot00000000000000fastapi-0.110.3/docs/bn/docs/000077500000000000000000000000001461403617600155725ustar00rootroot00000000000000fastapi-0.110.3/docs/bn/docs/index.md000066400000000000000000000743331461403617600172350ustar00rootroot00000000000000

FastAPI

FastAPI উচ্চক্ষমতা সম্পন্ন, সহজে শেখার এবং দ্রুত কোড করে প্রোডাকশনের জন্য ফ্রামওয়ার্ক।

Test Coverage Package version

--- **নির্দেশিকা নথি**: https://fastapi.tiangolo.com **সোর্স কোড**: https://github.com/tiangolo/fastapi --- FastAPI একটি আধুনিক, দ্রুত ( বেশি ক্ষমতা ) সম্পন্ন, Python 3.6+ দিয়ে API তৈরির জন্য স্ট্যান্ডার্ড পাইথন টাইপ ইঙ্গিত ভিত্তিক ওয়েব ফ্রেমওয়ার্ক। এর মূল বৈশিষ্ট্য গুলো হলঃ - **গতি**: এটি **NodeJS** এবং **Go** এর মত কার্যক্ষমতা সম্পন্ন (Starlette এবং Pydantic এর সাহায্যে)। [পাইথন এর দ্রুততম ফ্রেমওয়ার্ক গুলোর মধ্যে এটি একটি](#_11)। - **দ্রুত কোড করা**:বৈশিষ্ট্য তৈরির গতি ২০০% থেকে ৩০০% বৃদ্ধি করে৷ \* - **স্বল্প bugs**: মানুব (ডেভেলপার) সৃষ্ট ত্রুটির প্রায় ৪০% হ্রাস করে। \* - **স্বজ্ঞাত**: দুর্দান্ত এডিটর সাহায্য Completion নামেও পরিচিত। দ্রুত ডিবাগ করা যায়। - **সহজ**: এটি এমন ভাবে সজানো হয়েছে যেন নির্দেশিকা নথি পড়ে সহজে শেখা এবং ব্যবহার করা যায়। - **সংক্ষিপ্ত**: কোড পুনরাবৃত্তি কমানোর পাশাপাশি, bug কমায় এবং প্রতিটি প্যারামিটার ঘোষণা থেকে একাধিক ফিচার পাওয়া যায় । - **জোরালো**: স্বয়ংক্রিয় ভাবে তৈরি ক্রিয়াশীল নির্দেশনা নথি (documentation) সহ উৎপাদন উপযোগি (Production-ready) কোড পাওয়া যায়। - **মান-ভিত্তিক**: এর ভিত্তি OpenAPI (যা পুর্বে Swagger নামে পরিচিত ছিল) এবং JSON Schema এর আদর্শের মানের ওপর \* উৎপাদনমুখি এপ্লিকেশন বানানোর এক দল ডেভেলপার এর মতামত ভিত্তিক ফলাফল। ## স্পনসর গণ {% if sponsors %} {% for sponsor in sponsors.gold -%} {% endfor -%} {%- for sponsor in sponsors.silver -%} {% endfor %} {% endif %} অন্যান্য স্পনসর গণ ## মতামত সমূহ "_আমি আজকাল **FastAPI** ব্যবহার করছি। [...] আমরা ভাবছি মাইক্রোসফ্টে **ML সার্ভিস** এ সকল দলের জন্য এটি ব্যবহার করব। যার মধ্যে কিছু পণ্য **Windows** এ সংযোযন হয় এবং কিছু **Office** এর সাথে সংযোযন হচ্ছে।_"
কবির খান - মাইক্রোসফ্টে (ref)
--- "_আমরা **FastAPI** লাইব্রেরি গ্রহণ করেছি একটি **REST** সার্ভার তৈরি করতে, যা **ভবিষ্যদ্বাণী** পাওয়ার জন্য কুয়েরি করা যেতে পারে। [লুডউইগের জন্য]_"
পিয়েরো মোলিনো, ইয়ারোস্লাভ দুদিন, এবং সাই সুমন্থ মিরিয়ালা - উবার (ref)
--- "_**Netflix** আমাদের **ক্রাইসিস ম্যানেজমেন্ট** অর্কেস্ট্রেশন ফ্রেমওয়ার্ক: **ডিসপ্যাচ** এর ওপেন সোর্স রিলিজ ঘোষণা করতে পেরে আনন্দিত! [যাকিনা **FastAPI** দিয়ে নির্মিত]_"
কেভিন গ্লিসন, মার্ক ভিলানোভা, ফরেস্ট মনসেন - নেটফ্লিক্স (ref)
--- "_আমি **FastAPI** নিয়ে চাঁদের সমান উৎসাহিত। এটি খুবই মজার!_"
ব্রায়ান ওকেন - পাইথন বাইটস পডকাস্ট হোস্ট (ref)
--- "\_সত্যিই, আপনি যা তৈরি করেছেন তা খুব মজবুত এবং পরিপূর্ন৷ অনেক উপায়ে, আমি যা **Hug** এ করতে চেয়েছিলাম - তা কাউকে তৈরি করতে দেখে আমি সত্যিই অনুপ্রানিত৷\_"
টিমোথি ক্রসলে - Hug স্রষ্টা (ref)
--- "আপনি যদি REST API তৈরির জন্য একটি **আধুনিক ফ্রেমওয়ার্ক** শিখতে চান, তাহলে **FastAPI** দেখুন [...] এটি দ্রুত, ব্যবহার করা সহজ এবং শিখতেও সহজ [...]\_" "_আমরা আমাদের **APIs** [...] এর জন্য **FastAPI**- তে এসেছি [...] আমি মনে করি আপনিও এটি পছন্দ করবেন [...]_"
ইনেস মন্টানি - ম্যাথিউ হোনিবাল - Explosion AI প্রতিষ্ঠাতা - spaCy স্রষ্টা (ref) - (ref)
--- ## **Typer**, CLI এর জন্য FastAPI আপনি যদি CLI অ্যাপ বানাতে চান, যা কিনা ওয়েব API এর পরিবর্তে টার্মিনালে ব্যবহার হবে, তাহলে দেখুন**Typer**. **টাইপার** হল FastAPI এর ছোট ভাইয়ের মত। এবং এটির উদ্দেশ্য ছিল **CLIs এর FastAPI** হওয়া। ⌨️ 🚀 ## প্রয়োজনীয়তা গুলো Python 3.7+ FastAPI কিছু দানবেদের কাঁধে দাঁড়িয়ে আছে: - Starlette ওয়েব অংশের জন্য. - Pydantic ডেটা অংশগুলির জন্য. ## ইনস্টলেশন প্রক্রিয়া
```console $ pip install fastapi ---> 100% ```
আপনার একটি ASGI সার্ভারেরও প্রয়োজন হবে, প্রোডাকশনের জন্য Uvicorn অথবা Hypercorn.
```console $ pip install "uvicorn[standard]" ---> 100% ```
## উদাহরণ ### তৈরি - `main.py` নামে একটি ফাইল তৈরি করুন: ```Python from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ```
অথবা ব্যবহার করুন async def... যদি আপনার কোড `async` / `await`, ব্যবহার করে তাহলে `async def` ব্যবহার করুন: ```Python hl_lines="9 14" from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") async def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") async def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ``` **টীকা**: আপনি যদি না জানেন, _"তাড়াহুড়ো?"_ বিভাগটি দেখুন `async` এবং `await` নথির মধ্যে দেখুন .
### এটি চালান সার্ভার চালু করুন:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [28720] INFO: Started server process [28722] INFO: Waiting for application startup. INFO: Application startup complete. ```
নির্দেশনা সম্পর্কে uvicorn main:app --reload... `uvicorn main:app` নির্দেশনাটি দ্বারা বোঝায়: - `main`: ফাইল `main.py` (পাইথন "মডিউল")। - `app`: `app = FastAPI()` লাইন দিয়ে `main.py` এর ভিতরে তৈরি করা অবজেক্ট। - `--reload`: কোড পরিবর্তনের পরে সার্ভার পুনরায় চালু করুন। এটি শুধুমাত্র ডেভেলপমেন্ট এর সময় ব্যবহার করুন।
### এটা চেক করুন আপনার ব্রাউজার খুলুন http://127.0.0.1:8000/items/5?q=somequery এ। আপনি JSON রেসপন্স দেখতে পাবেন: ```JSON {"item_id": 5, "q": "somequery"} ``` আপনি ইতিমধ্যে একটি API তৈরি করেছেন যা: - `/` এবং `/items/{item_id}` _paths_ এ HTTP অনুরোধ গ্রহণ করে। - উভয় *path*ই `GET` অপারেশন নেয় ( যা HTTP _methods_ নামেও পরিচিত)। - _path_ `/items/{item_id}`-এ একটি _path প্যারামিটার_ `item_id` আছে যা কিনা `int` হতে হবে। - _path_ `/items/{item_id}`-এর একটি ঐচ্ছিক `str` _query প্যারামিটার_ `q` আছে। ### ক্রিয়াশীল API নির্দেশিকা নথি এখন যান http://127.0.0.1:8000/docs. আপনি স্বয়ংক্রিয় ভাবে প্রস্তুত ক্রিয়াশীল API নির্দেশিকা নথি দেখতে পাবেন (Swagger UI প্রদত্ত): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### বিকল্প API নির্দেশিকা নথি এবং এখন http://127.0.0.1:8000/redoc এ যান. আপনি স্বয়ংক্রিয় ভাবে প্রস্তুত বিকল্প নির্দেশিকা নথি দেখতে পাবেন (ReDoc প্রদত্ত): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ## উদাহরণস্বরূপ আপগ্রেড এখন `main.py` ফাইলটি পরিবর্তন করুন যেন এটি `PUT` রিকুয়েস্ট থেকে বডি পেতে পারে। Python স্ট্যান্ডার্ড লাইব্রেরি, Pydantic এর সাহায্যে বডি ঘোষণা করুন। ```Python hl_lines="4 9-12 25-27" from typing import Union from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str price: float is_offer: Union[bool, None] = None @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} @app.put("/items/{item_id}") def update_item(item_id: int, item: Item): return {"item_name": item.name, "item_id": item_id} ``` সার্ভারটি স্বয়ংক্রিয়ভাবে পুনরায় লোড হওয়া উচিত (কারণ আপনি উপরের `uvicorn` কমান্ডে `--reload` যোগ করেছেন)। ### ক্রিয়াশীল API নির্দেশিকা নথি উন্নীতকরণ এখন http://127.0.0.1:8000/docs এডড্রেসে যান. - ক্রিয়াশীল API নির্দেশিকা নথিটি স্বয়ংক্রিয়ভাবে উন্নীত হযে যাবে, নতুন বডি সহ: ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) - "Try it out" বাটনে চাপুন, এটি আপনাকে পেরামিটারগুলো পূরণ করতে এবং API এর সাথে সরাসরি ক্রিয়া-কলাপ করতে দিবে: ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) - তারপরে "Execute" বাটনে চাপুন, ব্যবহারকারীর ইন্টারফেস আপনার API এর সাথে যোগাযোগ করবে, পেরামিটার পাঠাবে, ফলাফলগুলি পাবে এবং সেগুলি পর্রদায় দেখাবে: ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) ### বিকল্প API নির্দেশিকা নথি আপগ্রেড এবং এখন http://127.0.0.1:8000/redoc এ যান। - বিকল্প নির্দেশিকা নথিতেও নতুন কুয়েরি প্যারামিটার এবং বডি প্রতিফলিত হবে: ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ### সংক্ষিপ্তকরণ সংক্ষেপে, আপনি **শুধু একবার** প্যারামিটারের ধরন, বডি ইত্যাদি ফাংশন প্যারামিটার হিসেবে ঘোষণা করেন। আপনি সেটি আধুনিক পাইথনের সাথে করেন। আপনাকে নতুন করে নির্দিষ্ট কোন লাইব্রেরির বাক্য গঠন, ফাংশন বা ক্লাস কিছুই শিখতে হচ্ছে না। শুধুই আধুনিক **Python 3.6+** উদাহরণস্বরূপ, `int` এর জন্য: ```Python item_id: int ``` অথবা আরও জটিল `Item` মডেলের জন্য: ```Python item: Item ``` ...এবং সেই একই ঘোষণার সাথে আপনি পাবেন: - এডিটর সাহায্য, যেমন - সমাপ্তি। - ধরণ যাচাই - তথ্য যাচাইকরণ: - ডেটা অবৈধ হলে স্বয়ংক্রিয় এবং পরিষ্কার ত্রুটির নির্দেশনা। - এমনকি গভীরভাবে নেস্ট করা JSON অবজেক্টের জন্য বৈধতা। - প্রেরিত তথ্য রূপান্তর: যা নেটওয়ার্ক থেকে পাইথনের তথ্য এবং ধরনে আসে, এবং সেখান থেকে পড়া: - JSON। - পাথ প্যারামিটার। - কুয়েরি প্যারামিটার। - কুকিজ - হেডার - ফর্ম - ফাইল - আউটপুট ডেটার রূপান্তর: পাইথন ডেটা এবং টাইপ থেকে নেটওয়ার্ক ডেটাতে রূপান্তর করা (JSON হিসাবে): -পাইথন টাইপে রূপান্তর করুন (`str`, `int`, `float`, `bool`, `list`, ইত্যাদি)। - `datetime` অবজেক্ট। - `UUID` objeঅবজেক্টcts। - ডাটাবেস মডেল। - ...এবং আরো অনেক। - স্বয়ংক্রিয় ক্রিয়াশীল API নির্দেশিকা নথি, 2টি বিকল্প ব্যবহারকারীর ইন্টারফেস সহ: - সোয়াগার ইউ আই (Swagger UI)। - রিডক (ReDoc)। --- পূর্ববর্তী কোড উদাহরণে ফিরে আসা যাক, **FastAPI** যা করবে: - `GET` এবং `PUT` অনুরোধের জন্য পথে `item_id` আছে কিনা তা যাচাই করবে। - `GET` এবং `PUT` অনুরোধের জন্য `item_id` টাইপ `int` এর হতে হবে তা যাচাই করবে। - যদি না হয় তবে ক্লায়েন্ট একটি উপযুক্ত, পরিষ্কার ত্রুটি দেখতে পাবেন। - `GET` অনুরোধের জন্য একটি ঐচ্ছিক ক্যুয়েরি প্যারামিটার নামক `q` (যেমন `http://127.0.0.1:8000/items/foo?q=somequery`) আছে কি তা চেক করবে। - যেহেতু `q` প্যারামিটারটি `= None` দিয়ে ঘোষণা করা হয়েছে, তাই এটি ঐচ্ছিক। - `None` ছাড়া এটি প্রয়োজনীয় হতো (যেমন `PUT` এর ক্ষেত্রে হয়েছে)। - `/items/{item_id}` এর জন্য `PUT` অনুরোধের বডি JSON হিসাবে পড়ুন: - লক্ষ করুন, `name` একটি প্রয়োজনীয় অ্যাট্রিবিউট হিসাবে বিবেচনা করেছে এবং এটি `str` হতে হবে। - লক্ষ করুন এখানে, `price` অ্যাট্রিবিউটটি আবশ্যক এবং এটি `float` হতে হবে। - লক্ষ করুন `is_offer` একটি ঐচ্ছিক অ্যাট্রিবিউট এবং এটি `bool` হতে হবে যদি উপস্থিত থাকে। - এই সবটি গভীরভাবে অবস্থানরত JSON অবজেক্টগুলিতেও কাজ করবে। - স্বয়ংক্রিয়ভাবে JSON হতে এবং JSON থেকে কনভার্ট করুন। - OpenAPI দিয়ে সবকিছু ডকুমেন্ট করুন, যা ব্যবহার করা যেতে পারে: - ক্রিয়াশীল নির্দেশিকা নথি। - অনেক ভাষার জন্য স্বয়ংক্রিয় ক্লায়েন্ট কোড তৈরির ব্যবস্থা। - সরাসরি 2টি ক্রিয়াশীল নির্দেশিকা নথি ওয়েব পৃষ্ঠ প্রদান করা হয়েছে। --- আমরা এতক্ষন শুধু এর পৃষ্ঠ তৈরি করেছি, কিন্তু আপনি ইতমধ্যেই এটি কিভাবে কাজ করে তার ধারণাও পেয়ে গিয়েছেন। নিম্নোক্ত লাইন গুলো পরিবর্তন করার চেষ্টা করুন: ```Python return {"item_name": item.name, "item_id": item_id} ``` ...পুর্বে: ```Python ... "item_name": item.name ... ``` ...পরবর্তীতে: ```Python ... "item_price": item.price ... ``` ...এবং দেখুন কিভাবে আপনার এডিটর উপাদানগুলোকে সয়ংক্রিয়ভাবে-সম্পন্ন করবে এবং তাদের ধরন জানতে পারবে: ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) আরও বৈশিষ্ট্য সম্পন্ন উদাহরণের জন্য, দেখুন টিউটোরিয়াল - ব্যবহারকারীর গাইড. **স্পয়লার সতর্কতা**: টিউটোরিয়াল - ব্যবহারকারীর গাইড নিম্নোক্ত বিষয়গুলি অন্তর্ভুক্ত করে: - **হেডার**, **কুকিজ**, **ফর্ম ফিল্ড** এবং **ফাইলগুলি** এমন অন্যান্য জায়গা থেকে প্যারামিটার ঘোষণা করা। - `maximum_length` বা `regex` এর মতো **যাচাইকরণ বাধামুক্তি** সেট করা হয় কিভাবে, তা নিয়ে আলোচনা করা হবে। - একটি খুব শক্তিশালী এবং ব্যবহার করা সহজ ডিপেন্ডেন্সি ইনজেকশন পদ্ধতি - **OAuth2** এবং **JWT টোকেন** এবং **HTTP Basic** auth সহ নিরাপত্তা এবং অনুমোদনপ্রাপ্তি সম্পর্কিত বিষয়সমূহের উপর। - **গভীরভাবে অবস্থানরত JSON মডেল** ঘোষণা করার জন্য আরও উন্নত (কিন্তু সমান সহজ) কৌশল (Pydantic কে ধন্যবাদ)। - আরো অতিরিক্ত বৈশিষ্ট্য (স্টারলেটকে ধন্যবাদ) হিসাবে: - **WebSockets** - **GraphQL** - HTTPX এবং `pytest` ভিত্তিক অত্যন্ত সহজ পরীক্ষা - **CORS** - **Cookie Sessions** - ...এবং আরো। ## কর্মক্ষমতা স্বাধীন TechEmpower Benchmarks দেখায় যে **FastAPI** অ্যাপ্লিকেশনগুলি Uvicorn-এর অধীনে চলমান দ্রুততমপাইথন ফ্রেমওয়ার্কগুলির মধ্যে একটি, শুধুমাত্র Starlette এবং Uvicorn-এর পর (FastAPI দ্বারা অভ্যন্তরীণভাবে ব্যবহৃত)। (\*) এটি সম্পর্কে আরও বুঝতে, দেখুন Benchmarks. ## ঐচ্ছিক নির্ভরশীলতা Pydantic দ্বারা ব্যবহৃত: - email_validator - ইমেল যাচাইকরণের জন্য। স্টারলেট দ্বারা ব্যবহৃত: - httpx - আপনি যদি `TestClient` ব্যবহার করতে চান তাহলে আবশ্যক। - jinja2 - আপনি যদি প্রদত্ত টেমপ্লেট রূপরেখা ব্যবহার করতে চান তাহলে প্রয়োজন। - python-multipart - আপনি যদি ফর্ম সহায়তা করতে চান তাহলে প্রয়োজন "parsing", `request.form()` সহ। - itsdangerous - `SessionMiddleware` সহায়তার জন্য প্রয়োজন। - pyyaml - স্টারলেটের SchemaGenerator সাপোর্ট এর জন্য প্রয়োজন (আপনার সম্ভাবত FastAPI প্রয়োজন নেই)। - graphene - `GraphQLApp` সহায়তার জন্য প্রয়োজন। FastAPI / Starlette দ্বারা ব্যবহৃত: - uvicorn - সার্ভারের জন্য যা আপনার অ্যাপ্লিকেশন লোড করে এবং পরিবেশন করে। - orjson - আপনি `ORJSONResponse` ব্যবহার করতে চাইলে প্রয়োজন। - ujson - আপনি `UJSONResponse` ব্যবহার করতে চাইলে প্রয়োজন। আপনি এই সব ইনস্টল করতে পারেন `pip install fastapi[all]` দিয়ে. ## লাইসেন্স এই প্রজেক্ট MIT লাইসেন্স নীতিমালার অধীনে শর্তায়িত। fastapi-0.110.3/docs/bn/docs/learn/000077500000000000000000000000001461403617600166735ustar00rootroot00000000000000fastapi-0.110.3/docs/bn/docs/learn/index.md000066400000000000000000000007361461403617600203320ustar00rootroot00000000000000# শিখুন এখানে **FastAPI** শিখার জন্য প্রাথমিক বিভাগগুলি এবং টিউটোরিয়ালগুলি রয়েছে। আপনি এটিকে একটি **বই**, একটি **কোর্স**, এবং FastAPI শিখার **অফিসিয়াল** এবং প্রস্তাবিত উপায় বিবেচনা করতে পারেন। 😎 fastapi-0.110.3/docs/bn/docs/python-types.md000066400000000000000000001077551461403617600206160ustar00rootroot00000000000000# পাইথন এর টাইপ্স পরিচিতি Python-এ ঐচ্ছিক "টাইপ হিন্ট" (যা "টাইপ অ্যানোটেশন" নামেও পরিচিত) এর জন্য সাপোর্ট রয়েছে। এই **"টাইপ হিন্ট"** বা অ্যানোটেশনগুলি এক ধরণের বিশেষ সিনট্যাক্স যা একটি ভেরিয়েবলের টাইপ ঘোষণা করতে দেয়। ভেরিয়েবলগুলির জন্য টাইপ ঘোষণা করলে, এডিটর এবং টুলগুলি আপনাকে আরও ভালো সাপোর্ট দিতে পারে। এটি পাইথন টাইপ হিন্ট সম্পর্কে একটি দ্রুত **টিউটোরিয়াল / রিফ্রেশার** মাত্র। এটি **FastAPI** এর সাথে ব্যবহার করার জন্য শুধুমাত্র ন্যূনতম প্রয়োজনীয়তা কভার করে... যা আসলে খুব একটা বেশি না। **FastAPI** এই টাইপ হিন্টগুলির উপর ভিত্তি করে নির্মিত, যা এটিকে অনেক সুবিধা এবং লাভ প্রদান করে। তবে, আপনি যদি কখনো **FastAPI** ব্যবহার নাও করেন, তবুও এগুলি সম্পর্কে একটু শেখা আপনার উপকারে আসবে। !!! Note যদি আপনি একজন Python বিশেষজ্ঞ হন, এবং টাইপ হিন্ট সম্পর্কে সবকিছু জানেন, তাহলে পরবর্তী অধ্যায়ে চলে যান। ## প্রেরণা চলুন একটি সাধারণ উদাহরণ দিয়ে শুরু করি: ```Python {!../../../docs_src/python_types/tutorial001.py!} ``` এই প্রোগ্রামটি কল করলে আউটপুট হয়: ``` John Doe ``` ফাংশনটি নিম্নলিখিত কাজ করে: * `first_name` এবং `last_name` নেয়। * প্রতিটির প্রথম অক্ষরকে `title()` ব্যবহার করে বড় হাতের অক্ষরে রূপান্তর করে। * তাদেরকে মাঝখানে একটি স্পেস দিয়ে concatenate করে। ```Python hl_lines="2" {!../../../docs_src/python_types/tutorial001.py!} ``` ### এটি সম্পাদনা করুন এটি একটি খুব সাধারণ প্রোগ্রাম। কিন্তু এখন কল্পনা করুন যে আপনি এটি শুরু থেকে লিখছিলেন। এক পর্যায়ে আপনি ফাংশনের সংজ্ঞা শুরু করেছিলেন, আপনার প্যারামিটারগুলি প্রস্তুত ছিল... কিন্তু তারপর আপনাকে "সেই method কল করতে হবে যা প্রথম অক্ষরকে বড় হাতের অক্ষরে রূপান্তর করে"। এটা কি `upper` ছিল? নাকি `uppercase`? `first_uppercase`? `capitalize`? তারপর, আপনি পুরোনো প্রোগ্রামারের বন্ধু, এডিটর অটোকমপ্লিশনের সাহায্যে নেওয়ার চেষ্টা করেন। আপনি ফাংশনের প্রথম প্যারামিটার `first_name` টাইপ করেন, তারপর একটি ডট (`.`) টাইপ করেন এবং `Ctrl+Space` চাপেন অটোকমপ্লিশন ট্রিগার করার জন্য। কিন্তু, দুর্ভাগ্যবশত, আপনি কিছুই উপযোগী পান না: ### টাইপ যোগ করুন আসুন আগের সংস্করণ থেকে একটি লাইন পরিবর্তন করি। আমরা ঠিক এই অংশটি পরিবর্তন করব অর্থাৎ ফাংশনের প্যারামিটারগুলি, এইগুলি: ```Python first_name, last_name ``` থেকে এইগুলি: ```Python first_name: str, last_name: str ``` ব্যাস। এগুলিই "টাইপ হিন্ট": ```Python hl_lines="1" {!../../../docs_src/python_types/tutorial002.py!} ``` এটি ডিফল্ট ভ্যালু ঘোষণা করার মত নয় যেমন: ```Python first_name="john", last_name="doe" ``` এটি একটি ভিন্ন জিনিস। আমরা সমান (`=`) নয়, কোলন (`:`) ব্যবহার করছি। এবং টাইপ হিন্ট যোগ করা সাধারণত তেমন কিছু পরিবর্তন করে না যা টাইপ হিন্ট ছাড়াই ঘটত। কিন্তু এখন, কল্পনা করুন আপনি আবার সেই ফাংশন তৈরির মাঝখানে আছেন, কিন্তু টাইপ হিন্ট সহ। একই পর্যায়ে, আপনি অটোকমপ্লিট ট্রিগার করতে `Ctrl+Space` চাপেন এবং আপনি দেখতে পান: এর সাথে, আপনি অপশনগুলি দেখে, স্ক্রল করতে পারেন, যতক্ষণ না আপনি এমন একটি অপশন খুঁজে পান যা কিছু মনে পরিয়ে দেয়: ## আরও প্রেরণা এই ফাংশনটি দেখুন, এটিতে ইতিমধ্যে টাইপ হিন্ট রয়েছে: ```Python hl_lines="1" {!../../../docs_src/python_types/tutorial003.py!} ``` এডিটর ভেরিয়েবলগুলির টাইপ জানার কারণে, আপনি শুধুমাত্র অটোকমপ্লিশনই পান না, আপনি এরর চেকও পান: এখন আপনি জানেন যে আপনাকে এটি ঠিক করতে হবে, `age`-কে একটি স্ট্রিং হিসেবে রূপান্তর করতে `str(age)` ব্যবহার করতে হবে: ```Python hl_lines="2" {!../../../docs_src/python_types/tutorial004.py!} ``` ## টাইপ ঘোষণা আপনি এতক্ষন টাইপ হিন্ট ঘোষণা করার মূল স্থানটি দেখে ফেলেছেন-- ফাংশন প্যারামিটার হিসেবে। সাধারণত এটি **FastAPI** এর ক্ষেত্রেও একই। ### সিম্পল টাইপ আপনি `str` ছাড়াও সমস্ত স্ট্যান্ডার্ড পাইথন টাইপ ঘোষণা করতে পারেন। উদাহরণস্বরূপ, আপনি এগুলো ব্যবহার করতে পারেন: * `int` * `float` * `bool` * `bytes` ```Python hl_lines="1" {!../../../docs_src/python_types/tutorial005.py!} ``` ### টাইপ প্যারামিটার সহ জেনেরিক টাইপ কিছু ডাটা স্ট্রাকচার অন্যান্য মান ধারণ করতে পারে, যেমন `dict`, `list`, `set` এবং `tuple`। এবং অভ্যন্তরীণ মানগুলোরও নিজেদের টাইপ থাকতে পারে। এই ধরনের টাইপগুলিকে বলা হয় "**জেনেরিক**" টাইপ এবং এগুলিকে তাদের অভ্যন্তরীণ টাইপগুলি সহ ঘোষণা করা সম্ভব। এই টাইপগুলি এবং অভ্যন্তরীণ টাইপগুলি ঘোষণা করতে, আপনি Python মডিউল `typing` ব্যবহার করতে পারেন। এটি বিশেষভাবে এই টাইপ হিন্টগুলি সমর্থন করার জন্য রয়েছে। #### Python এর নতুন সংস্করণ `typing` ব্যবহার করা সিনট্যাক্সটি Python 3.6 থেকে সর্বশেষ সংস্করণগুলি পর্যন্ত, অর্থাৎ Python 3.9, Python 3.10 ইত্যাদি সহ সকল সংস্করণের সাথে **সামঞ্জস্যপূর্ণ**। Python যত এগিয়ে যাচ্ছে, **নতুন সংস্করণগুলি** এই টাইপ অ্যানোটেশনগুলির জন্য তত উন্নত সাপোর্ট নিয়ে আসছে এবং অনেক ক্ষেত্রে আপনাকে টাইপ অ্যানোটেশন ঘোষণা করতে `typing` মডিউল ইম্পোর্ট এবং ব্যবহার করার প্রয়োজন হবে না। যদি আপনি আপনার প্রজেক্টের জন্য Python-এর আরও সাম্প্রতিক সংস্করণ নির্বাচন করতে পারেন, তাহলে আপনি সেই অতিরিক্ত সরলতা থেকে সুবিধা নিতে পারবেন। ডক্সে রয়েছে Python-এর প্রতিটি সংস্করণের সাথে সামঞ্জস্যপূর্ণ উদাহরণগুলি (যখন পার্থক্য আছে)। উদাহরণস্বরূপ, "**Python 3.6+**" মানে এটি Python 3.6 বা তার উপরে সামঞ্জস্যপূর্ণ (যার মধ্যে 3.7, 3.8, 3.9, 3.10, ইত্যাদি অন্তর্ভুক্ত)। এবং "**Python 3.9+**" মানে এটি Python 3.9 বা তার উপরে সামঞ্জস্যপূর্ণ (যার মধ্যে 3.10, ইত্যাদি অন্তর্ভুক্ত)। যদি আপনি Python-এর **সর্বশেষ সংস্করণগুলি ব্যবহার করতে পারেন**, তাহলে সর্বশেষ সংস্করণের জন্য উদাহরণগুলি ব্যবহার করুন, সেগুলি আপনাকে **সর্বোত্তম এবং সহজতম সিনট্যাক্স** প্রদান করবে, যেমন, "**Python 3.10+**"। #### লিস্ট উদাহরণস্বরূপ, একটি ভেরিয়েবলকে `str`-এর একটি `list` হিসেবে সংজ্ঞায়িত করা যাক। === "Python 3.9+" ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে। টাইপ হিসেবে, `list` ব্যবহার করুন। যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে ব্যবহার করুন: ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial006_py39.py!} ``` === "Python 3.8+" `typing` থেকে `List` (বড় হাতের `L` দিয়ে) ইমপোর্ট করুন: ``` Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial006.py!} ``` ভেরিয়েবলটি ঘোষণা করুন, একই কোলন (`:`) সিনট্যাক্স ব্যবহার করে। টাইপ হিসেবে, `typing` থেকে আপনার ইম্পোর্ট করা `List` ব্যবহার করুন। যেহেতু লিস্ট এমন একটি টাইপ যা অভ্যন্তরীণ টাইপগুলি ধারণ করে, আপনি তাদের স্কোয়ার ব্রাকেটের ভিতরে করুন: ```Python hl_lines="4" {!> ../../../docs_src/python_types/tutorial006.py!} ``` !!! Info স্কোয়ার ব্রাকেট এর ভিতরে ব্যবহৃত এইসব অভন্তরীন টাইপগুলোকে "ইন্টারনাল টাইপ" বলে। এই উদাহরণে, এটি হচ্ছে `List`(অথবা পাইথন ৩.৯ বা তার উপরের সংস্করণের ক্ষেত্রে `list`) এ পাস করা টাইপ প্যারামিটার। এর অর্থ হচ্ছে: "ভেরিয়েবল `items` একটি `list`, এবং এই লিস্টের প্রতিটি আইটেম একটি `str`।" !!! Tip যদি আপনি Python 3.9 বা তার উপরে ব্যবহার করেন, আপনার `typing` থেকে `List` আমদানি করতে হবে না, আপনি সাধারণ `list` ওই টাইপের পরিবর্তে ব্যবহার করতে পারেন। এর মাধ্যমে, আপনার এডিটর লিস্ট থেকে আইটেম প্রসেস করার সময় সাপোর্ট প্রদান করতে পারবে: টাইপগুলি ছাড়া, এটি করা প্রায় অসম্ভব। লক্ষ্য করুন যে ভেরিয়েবল `item` হল `items` লিস্টের একটি এলিমেন্ট। তবুও, এডিটর জানে যে এটি একটি `str`, এবং তার জন্য সাপোর্ট প্রদান করে। #### টাপল এবং সেট আপনি `tuple` এবং `set` ঘোষণা করার জন্য একই প্রক্রিয়া অনুসরণ করবেন: === "Python 3.9+" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial007_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial007.py!} ``` এর মানে হল: * ভেরিয়েবল `items_t` হল একটি `tuple` যা ৩টি আইটেম ধারণ করে, একটি `int`, অন্য একটি `int`, এবং একটি `str`। * ভেরিয়েবল `items_s` হল একটি `set`, এবং এর প্রতিটি আইটেম হল `bytes` টাইপের। #### ডিক্ট একটি `dict` সংজ্ঞায়িত করতে, আপনি ২টি টাইপ প্যারামিটার কমা দ্বারা পৃথক করে দেবেন। প্রথম টাইপ প্যারামিটারটি হল `dict`-এর কীগুলির জন্য। দ্বিতীয় টাইপ প্যারামিটারটি হল `dict`-এর মানগুলির জন্য: === "Python 3.9+" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial008_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial008.py!} ``` এর মানে হল: * ভেরিয়েবল `prices` হল একটি `dict`: * এই `dict`-এর কীগুলি হল `str` টাইপের (ধরা যাক, প্রতিটি আইটেমের নাম)। * এই `dict`-এর মানগুলি হল `float` টাইপের (ধরা যাক, প্রতিটি আইটেমের দাম)। #### ইউনিয়ন আপনি একটি ভেরিয়েবলকে এমনভাবে ঘোষণা করতে পারেন যেন তা **একাধিক টাইপের** হয়, উদাহরণস্বরূপ, একটি `int` অথবা `str`। Python 3.6 এবং তার উপরের সংস্করণগুলিতে (Python 3.10 অন্তর্ভুক্ত) আপনি `typing` থেকে `Union` টাইপ ব্যবহার করতে পারেন এবং স্কোয়ার ব্র্যাকেটের মধ্যে গ্রহণযোগ্য টাইপগুলি রাখতে পারেন। Python 3.10-এ একটি **নতুন সিনট্যাক্স** আছে যেখানে আপনি সম্ভাব্য টাইপগুলিকে একটি ভার্টিকাল বার (`|`) দ্বারা পৃথক করতে পারেন। === "Python 3.10+" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial008b_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial008b.py!} ``` উভয় ক্ষেত্রেই এর মানে হল যে `item` হতে পারে একটি `int` অথবা `str`। #### সম্ভবত `None` আপনি এমনভাবে ঘোষণা করতে পারেন যে একটি মান হতে পারে এক টাইপের, যেমন `str`, আবার এটি `None`-ও হতে পারে। Python 3.6 এবং তার উপরের সংস্করণগুলিতে (Python 3.10 অনতর্ভুক্ত) আপনি `typing` মডিউল থেকে `Optional` ইমপোর্ট করে এটি ঘোষণা এবং ব্যবহার করতে পারেন। ```Python hl_lines="1 4" {!../../../docs_src/python_types/tutorial009.py!} ``` `Optional[str]` ব্যবহার করা মানে হল শুধু `str` নয়, এটি হতে পারে `None`-ও, যা আপনার এডিটরকে সেই ত্রুটিগুলি শনাক্ত করতে সাহায্য করবে যেখানে আপনি ধরে নিচ্ছেন যে একটি মান সবসময় `str` হবে, অথচ এটি `None`-ও হতে পারেও। `Optional[Something]` মূলত `Union[Something, None]`-এর একটি শর্টকাট, এবং তারা সমতুল্য। এর মানে হল, Python 3.10-এ, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে `Something | None` ব্যবহার করতে পারেন: === "Python 3.10+" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial009_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial009.py!} ``` === "Python 3.8+ বিকল্প" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial009b.py!} ``` #### `Union` বা `Optional` ব্যবহার যদি আপনি Python 3.10-এর নীচের সংস্করণ ব্যবহার করেন, তবে এখানে আমার খুবই **ব্যক্তিগত** দৃষ্টিভঙ্গি থেকে একটি টিপস: * 🚨 `Optional[SomeType]` ব্যবহার এড়িয়ে চলুন। * এর পরিবর্তে ✨ **`Union[SomeType, None]` ব্যবহার করুন** ✨। উভয়ই সমতুল্য এবং মূলে একই, কিন্তু আমি `Union`-এর পক্ষে সুপারিশ করব কারণ "**অপশনাল**" শব্দটি মনে হতে পারে যে মানটি ঐচ্ছিক,অথচ এটি আসলে মানে "এটি হতে পারে `None`", এমনকি যদি এটি ঐচ্ছিক না হয়েও আবশ্যিক হয়। আমি মনে করি `Union[SomeType, None]` এর অর্থ আরও স্পষ্টভাবে প্রকাশ করে। এটি কেবল শব্দ এবং নামের ব্যাপার। কিন্তু সেই শব্দগুলি আপনি এবং আপনার সহকর্মীরা কোড সম্পর্কে কীভাবে চিন্তা করেন তা প্রভাবিত করতে পারে। একটি উদাহরণ হিসেবে, এই ফাংশনটি নিন: ```Python hl_lines="1 4" {!../../../docs_src/python_types/tutorial009c.py!} ``` `name` প্যারামিটারটি `Optional[str]` হিসেবে সংজ্ঞায়িত হয়েছে, কিন্তু এটি **অপশনাল নয়**, আপনি প্যারামিটার ছাড়া ফাংশনটি কল করতে পারবেন না: ```Python say_hi() # ওহ না, এটি একটি ত্রুটি নিক্ষেপ করবে! 😱 ``` `name` প্যারামিটারটি **এখনও আবশ্যিক** (নন-অপশনাল) কারণ এটির কোনো ডিফল্ট মান নেই। তবুও, `name` এর মান হিসেবে `None` গ্রহণযোগ্য: ```Python say_hi(name=None) # এটি কাজ করে, None বৈধ 🎉 ``` সুখবর হল, একবার আপনি Python 3.10 ব্যবহার করা শুরু করলে, আপনাকে এগুলোর ব্যাপারে আর চিন্তা করতে হবে না, যেহুতু আপনি | ব্যবহার করেই ইউনিয়ন ঘোষণা করতে পারবেন: ```Python hl_lines="1 4" {!../../../docs_src/python_types/tutorial009c_py310.py!} ``` এবং তারপর আপনাকে নামগুলি যেমন `Optional` এবং `Union` নিয়ে আর চিন্তা করতে হবে না। 😎 #### জেনেরিক টাইপস স্কোয়ার ব্র্যাকেটে টাইপ প্যারামিটার নেওয়া এই টাইপগুলিকে **জেনেরিক টাইপ** বা **জেনেরিকস** বলা হয়, যেমন: === "Python 3.10+" আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে): * `list` * `tuple` * `set` * `dict` এবং Python 3.8 এর মতোই, `typing` মডিউল থেকে: * `Union` * `Optional` (Python 3.8 এর মতোই) * ...এবং অন্যান্য। Python 3.10-এ, `Union` এবং `Optional` জেনেরিকস ব্যবহার করার বিকল্প হিসেবে, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে ভার্টিকাল বার (`|`) ব্যবহার করতে পারেন, যা ওদের থেকে অনেক ভালো এবং সহজ। === "Python 3.9+" আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে): * `list` * `tuple` * `set` * `dict` এবং Python 3.8 এর মতোই, `typing` মডিউল থেকে: * `Union` * `Optional` * ...এবং অন্যান্য। === "Python 3.8+" * `List` * `Tuple` * `Set` * `Dict` * `Union` * `Optional` * ...এবং অন্যান্য। ### ক্লাস হিসেবে টাইপস আপনি একটি ভেরিয়েবলের টাইপ হিসেবে একটি ক্লাস ঘোষণা করতে পারেন। ধরুন আপনার কাছে `Person` নামে একটি ক্লাস আছে, যার একটি নাম আছে: ```Python hl_lines="1-3" {!../../../docs_src/python_types/tutorial010.py!} ``` তারপর আপনি একটি ভেরিয়েবলকে `Person` টাইপের হিসেবে ঘোষণা করতে পারেন: ```Python hl_lines="6" {!../../../docs_src/python_types/tutorial010.py!} ``` এবং তারপর, আবার, আপনি এডিটর সাপোর্ট পেয়ে যাবেন: লক্ষ্য করুন যে এর মানে হল "`one_person` হল ক্লাস `Person`-এর একটি **ইন্সট্যান্স**।" এর মানে এটি নয় যে "`one_person` হল **ক্লাস** যাকে বলা হয় `Person`।" ## Pydantic মডেল [Pydantic](https://docs.pydantic.dev/) হল একটি Python লাইব্রেরি যা ডাটা ভ্যালিডেশন সম্পাদন করে। আপনি ডাটার "আকার" এট্রিবিউট সহ ক্লাস হিসেবে ঘোষণা করেন। এবং প্রতিটি এট্রিবিউট এর একটি টাইপ থাকে। তারপর আপনি যদি কিছু মান দিয়ে সেই ক্লাসের একটি ইন্সট্যান্স তৈরি করেন-- এটি মানগুলিকে ভ্যালিডেট করবে, প্রয়োজন অনুযায়ী তাদেরকে উপযুক্ত টাইপে রূপান্তর করবে এবং আপনাকে সমস্ত ডাটা সহ একটি অবজেক্ট প্রদান করবে। এবং আপনি সেই ফলাফল অবজেক্টের সাথে এডিটর সাপোর্ট পাবেন। অফিসিয়াল Pydantic ডক্স থেকে একটি উদাহরণ: === "Python 3.10+" ```Python {!> ../../../docs_src/python_types/tutorial011_py310.py!} ``` === "Python 3.9+" ```Python {!> ../../../docs_src/python_types/tutorial011_py39.py!} ``` === "Python 3.8+" ```Python {!> ../../../docs_src/python_types/tutorial011.py!} ``` !!! Info [Pydantic সম্পর্কে আরও জানতে, এর ডকুমেন্টেশন দেখুন](https://docs.pydantic.dev/)। **FastAPI** মূলত Pydantic-এর উপর নির্মিত। আপনি এই সমস্ত কিছুর অনেক বাস্তবসম্মত উদাহরণ পাবেন [টিউটোরিয়াল - ইউজার গাইডে](https://fastapi.tiangolo.com/tutorial/)। !!! Tip যখন আপনি `Optional` বা `Union[Something, None]` ব্যবহার করেন এবং কোনো ডিফল্ট মান না থাকে, Pydantic-এর একটি বিশেষ আচরণ রয়েছে, আপনি Pydantic ডকুমেন্টেশনে [Required Optional fields](https://docs.pydantic.dev/latest/concepts/models/#required-optional-fields) সম্পর্কে আরও পড়তে পারেন। ## মেটাডাটা অ্যানোটেশন সহ টাইপ হিন্টস Python-এ এমন একটি ফিচার আছে যা `Annotated` ব্যবহার করে এই টাইপ হিন্টগুলিতে **অতিরিক্ত মেটাডাটা** রাখতে দেয়। === "Python 3.9+" Python 3.9-এ, `Annotated` স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত, তাই আপনি এটি `typing` থেকে ইমপোর্ট করতে পারেন। ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial013_py39.py!} ``` === "Python 3.8+" Python 3.9-এর নীচের সংস্করণগুলিতে, আপনি `Annotated`-কে `typing_extensions` থেকে ইমপোর্ট করেন। এটি **FastAPI** এর সাথে ইতিমদ্ধে ইনস্টল হয়ে থাকবে। ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial013.py!} ``` Python নিজে এই `Annotated` দিয়ে কিছুই করে না। এবং এডিটর এবং অন্যান্য টুলগুলির জন্য, টাইপটি এখনও `str`। কিন্তু আপনি এই `Annotated` এর মধ্যকার জায়গাটির মধ্যে **FastAPI**-এ কীভাবে আপনার অ্যাপ্লিকেশন আচরণ করুক তা সম্পর্কে অতিরিক্ত মেটাডাটা প্রদান করার জন্য ব্যবহার করতে পারেন। মনে রাখার গুরুত্বপূর্ণ বিষয় হল যে **প্রথম *টাইপ প্যারামিটার*** আপনি `Annotated`-এ পাস করেন সেটি হল **আসল টাইপ**। বাকি শুধুমাত্র অন্যান্য টুলগুলির জন্য মেটাডাটা। এখন আপনার কেবল জানা প্রয়োজন যে `Annotated` বিদ্যমান, এবং এটি স্ট্যান্ডার্ড Python। 😎 পরবর্তীতে আপনি দেখবেন এটি কতটা **শক্তিশালী** হতে পারে। !!! Tip এটি **স্ট্যান্ডার্ড Python** হওয়ার মানে হল আপনি আপনার এডিটরে, আপনি যে টুলগুলি কোড বিশ্লেষণ এবং রিফ্যাক্টর করার জন্য ব্যবহার করেন তাতে **সেরা সম্ভাব্য ডেভেলপার এক্সপেরিয়েন্স** পাবেন। ✨ এবং এছাড়াও আপনার কোড অন্যান্য অনেক Python টুল এবং লাইব্রেরিগুলির সাথে খুব সামঞ্জস্যপূর্ণ হবে। 🚀 ## **FastAPI**-এ টাইপ হিন্টস **FastAPI** এই টাইপ হিন্টগুলি ব্যবহার করে বেশ কিছু জিনিস করে। **FastAPI**-এ আপনি টাইপ হিন্টগুলি সহ প্যারামিটার ঘোষণা করেন এবং আপনি পান: * **এডিটর সাপোর্ট**। * **টাইপচেক**। ...এবং **FastAPI** একই ঘোষণাগুলি ব্যবহার করে: * **রিকুইরেমেন্টস সংজ্ঞায়িত করে**: রিকোয়েস্ট পাথ প্যারামিটার, কুয়েরি প্যারামিটার, হেডার, বডি, ডিপেন্ডেন্সিস, ইত্যাদি থেকে। * **ডেটা রূপান্তর করে**: রিকোয়েস্ট থেকে প্রয়োজনীয় টাইপে ডেটা। * **ডেটা যাচাই করে**: প্রতিটি রিকোয়েস্ট থেকে আসা ডেটা: * যখন ডেটা অবৈধ হয় তখন **স্বয়ংক্রিয় ত্রুটি** গ্রাহকের কাছে ফেরত পাঠানো। * **API ডকুমেন্টেশন তৈরি করে**: OpenAPI ব্যবহার করে: * যা স্বয়ংক্রিয় ইন্টার‌্যাক্টিভ ডকুমেন্টেশন ইউজার ইন্টারফেস দ্বারা ব্যবহৃত হয়। এই সব কিছু আপনার কাছে অস্পষ্ট মনে হতে পারে। চিন্তা করবেন না। আপনি [টিউটোরিয়াল - ইউজার গাইড](https://fastapi.tiangolo.com/tutorial/) এ এই সব কিছু প্র্যাকটিসে দেখতে পাবেন। গুরুত্বপূর্ণ বিষয় হল, আপনি যদি স্ট্যান্ডার্ড Python টাইপগুলি ব্যবহার করেন, তবে আরও বেশি ক্লাস, ডেকোরেটর ইত্যাদি যোগ না করেই একই স্থানে **FastAPI** আপনার অনেক কাজ করে দিবে। !!! Info যদি আপনি টিউটোরিয়ালের সমস্ত বিষয় পড়ে ফেলে থাকেন এবং টাইপ সম্পর্কে আরও জানতে চান, তবে একটি ভালো রিসোর্স হল [mypy এর "cheat sheet"](https://mypy.readthedocs.io/en/latest/cheat_sheet_py3.html)। এই "cheat sheet" এ আপনি Python টাইপ হিন্ট সম্পর্কে বেসিক থেকে উন্নত লেভেলের ধারণা পেতে পারেন, যা আপনার কোডে টাইপ সেফটি এবং স্পষ্টতা বাড়াতে সাহায্য করবে। fastapi-0.110.3/docs/bn/mkdocs.yml000066400000000000000000000000321461403617600166400ustar00rootroot00000000000000INHERIT: ../en/mkdocs.yml fastapi-0.110.3/docs/de/000077500000000000000000000000001461403617600146335ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/000077500000000000000000000000001461403617600155635ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/about/000077500000000000000000000000001461403617600166755ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/about/index.md000066400000000000000000000001061461403617600203230ustar00rootroot00000000000000# Über Über FastAPI, sein Design, seine Inspiration und mehr. 🤓 fastapi-0.110.3/docs/de/docs/advanced/000077500000000000000000000000001461403617600173305ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/advanced/additional-responses.md000066400000000000000000000231331461403617600240030ustar00rootroot00000000000000# Zusätzliche Responses in OpenAPI !!! warning "Achtung" Dies ist ein eher fortgeschrittenes Thema. Wenn Sie mit **FastAPI** beginnen, benötigen Sie dies möglicherweise nicht. Sie können zusätzliche Responses mit zusätzlichen Statuscodes, Medientypen, Beschreibungen, usw. deklarieren. Diese zusätzlichen Responses werden in das OpenAPI-Schema aufgenommen, sodass sie auch in der API-Dokumentation erscheinen. Für diese zusätzlichen Responses müssen Sie jedoch sicherstellen, dass Sie eine `Response`, wie etwa `JSONResponse`, direkt zurückgeben, mit Ihrem Statuscode und Inhalt. ## Zusätzliche Response mit `model` Sie können Ihren *Pfadoperation-Dekoratoren* einen Parameter `responses` übergeben. Der nimmt ein `dict` entgegen, die Schlüssel sind Statuscodes für jede Response, wie etwa `200`, und die Werte sind andere `dict`s mit den Informationen für jede Response. Jedes dieser Response-`dict`s kann einen Schlüssel `model` haben, welcher ein Pydantic-Modell enthält, genau wie `response_model`. **FastAPI** nimmt dieses Modell, generiert dessen JSON-Schema und fügt es an der richtigen Stelle in OpenAPI ein. Um beispielsweise eine weitere Response mit dem Statuscode `404` und einem Pydantic-Modell `Message` zu deklarieren, können Sie schreiben: ```Python hl_lines="18 22" {!../../../docs_src/additional_responses/tutorial001.py!} ``` !!! note "Hinweis" Beachten Sie, dass Sie die `JSONResponse` direkt zurückgeben müssen. !!! info Der `model`-Schlüssel ist nicht Teil von OpenAPI. **FastAPI** nimmt das Pydantic-Modell von dort, generiert das JSON-Schema und fügt es an der richtigen Stelle ein. Die richtige Stelle ist: * Im Schlüssel `content`, der als Wert ein weiteres JSON-Objekt (`dict`) hat, welches Folgendes enthält: * Ein Schlüssel mit dem Medientyp, z. B. `application/json`, der als Wert ein weiteres JSON-Objekt hat, welches Folgendes enthält: * Ein Schlüssel `schema`, der als Wert das JSON-Schema aus dem Modell hat, hier ist die richtige Stelle. * **FastAPI** fügt hier eine Referenz auf die globalen JSON-Schemas an einer anderen Stelle in Ihrer OpenAPI hinzu, anstatt es direkt einzubinden. Auf diese Weise können andere Anwendungen und Clients diese JSON-Schemas direkt verwenden, bessere Tools zur Codegenerierung bereitstellen, usw. Die generierten Responses in der OpenAPI für diese *Pfadoperation* lauten: ```JSON hl_lines="3-12" { "responses": { "404": { "description": "Additional Response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Message" } } } }, "200": { "description": "Successful Response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Item" } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } ``` Die Schemas werden von einer anderen Stelle innerhalb des OpenAPI-Schemas referenziert: ```JSON hl_lines="4-16" { "components": { "schemas": { "Message": { "title": "Message", "required": [ "message" ], "type": "object", "properties": { "message": { "title": "Message", "type": "string" } } }, "Item": { "title": "Item", "required": [ "id", "value" ], "type": "object", "properties": { "id": { "title": "Id", "type": "string" }, "value": { "title": "Value", "type": "string" } } }, "ValidationError": { "title": "ValidationError", "required": [ "loc", "msg", "type" ], "type": "object", "properties": { "loc": { "title": "Location", "type": "array", "items": { "type": "string" } }, "msg": { "title": "Message", "type": "string" }, "type": { "title": "Error Type", "type": "string" } } }, "HTTPValidationError": { "title": "HTTPValidationError", "type": "object", "properties": { "detail": { "title": "Detail", "type": "array", "items": { "$ref": "#/components/schemas/ValidationError" } } } } } } } ``` ## Zusätzliche Medientypen für die Haupt-Response Sie können denselben `responses`-Parameter verwenden, um verschiedene Medientypen für dieselbe Haupt-Response hinzuzufügen. Sie können beispielsweise einen zusätzlichen Medientyp `image/png` hinzufügen und damit deklarieren, dass Ihre *Pfadoperation* ein JSON-Objekt (mit dem Medientyp `application/json`) oder ein PNG-Bild zurückgeben kann: ```Python hl_lines="19-24 28" {!../../../docs_src/additional_responses/tutorial002.py!} ``` !!! note "Hinweis" Beachten Sie, dass Sie das Bild direkt mit einer `FileResponse` zurückgeben müssen. !!! info Sofern Sie in Ihrem Parameter `responses` nicht explizit einen anderen Medientyp angeben, geht FastAPI davon aus, dass die Response denselben Medientyp wie die Haupt-Response-Klasse hat (Standardmäßig `application/json`). Wenn Sie jedoch eine benutzerdefinierte Response-Klasse mit `None` als Medientyp angegeben haben, verwendet FastAPI `application/json` für jede zusätzliche Response, die über ein zugehöriges Modell verfügt. ## Informationen kombinieren Sie können auch Response-Informationen von mehreren Stellen kombinieren, einschließlich der Parameter `response_model`, `status_code` und `responses`. Sie können ein `response_model` deklarieren, indem Sie den Standardstatuscode `200` (oder bei Bedarf einen benutzerdefinierten) verwenden und dann zusätzliche Informationen für dieselbe Response in `responses` direkt im OpenAPI-Schema deklarieren. **FastAPI** behält die zusätzlichen Informationen aus `responses` und kombiniert sie mit dem JSON-Schema aus Ihrem Modell. Sie können beispielsweise eine Response mit dem Statuscode `404` deklarieren, die ein Pydantic-Modell verwendet und über eine benutzerdefinierte Beschreibung (`description`) verfügt. Und eine Response mit dem Statuscode `200`, die Ihr `response_model` verwendet, aber ein benutzerdefiniertes Beispiel (`example`) enthält: ```Python hl_lines="20-31" {!../../../docs_src/additional_responses/tutorial003.py!} ``` Es wird alles kombiniert und in Ihre OpenAPI eingebunden und in der API-Dokumentation angezeigt: ## Vordefinierte und benutzerdefinierte Responses kombinieren Möglicherweise möchten Sie einige vordefinierte Responses haben, die für viele *Pfadoperationen* gelten, Sie möchten diese jedoch mit benutzerdefinierten Responses kombinieren, die für jede *Pfadoperation* erforderlich sind. In diesen Fällen können Sie die Python-Technik zum „Entpacken“ eines `dict`s mit `**dict_to_unpack` verwenden: ```Python old_dict = { "old key": "old value", "second old key": "second old value", } new_dict = {**old_dict, "new key": "new value"} ``` Hier wird `new_dict` alle Schlüssel-Wert-Paare von `old_dict` plus das neue Schlüssel-Wert-Paar enthalten: ```Python { "old key": "old value", "second old key": "second old value", "new key": "new value", } ``` Mit dieser Technik können Sie einige vordefinierte Responses in Ihren *Pfadoperationen* wiederverwenden und sie mit zusätzlichen benutzerdefinierten Responses kombinieren. Zum Beispiel: ```Python hl_lines="13-17 26" {!../../../docs_src/additional_responses/tutorial004.py!} ``` ## Weitere Informationen zu OpenAPI-Responses Um zu sehen, was genau Sie in die Responses aufnehmen können, können Sie die folgenden Abschnitte in der OpenAPI-Spezifikation überprüfen: * OpenAPI Responses Object, enthält das `Response Object`. * OpenAPI Response Object, Sie können alles davon direkt in jede Response innerhalb Ihres `responses`-Parameter einfügen. Einschließlich `description`, `headers`, `content` (darin deklarieren Sie verschiedene Medientypen und JSON-Schemas) und `links`. fastapi-0.110.3/docs/de/docs/advanced/additional-status-codes.md000066400000000000000000000057471461403617600244130ustar00rootroot00000000000000# Zusätzliche Statuscodes Standardmäßig liefert **FastAPI** die Rückgabewerte (Responses) als `JSONResponse` zurück und fügt den Inhalt der jeweiligen *Pfadoperation* in das `JSONResponse` Objekt ein. Es wird der Default-Statuscode oder derjenige verwendet, den Sie in Ihrer *Pfadoperation* festgelegt haben. ## Zusätzliche Statuscodes Wenn Sie neben dem Hauptstatuscode weitere Statuscodes zurückgeben möchten, können Sie dies tun, indem Sie direkt eine `Response` zurückgeben, wie etwa eine `JSONResponse`, und den zusätzlichen Statuscode direkt festlegen. Angenommen, Sie möchten eine *Pfadoperation* haben, die das Aktualisieren von Artikeln ermöglicht und bei Erfolg den HTTP-Statuscode 200 „OK“ zurückgibt. Sie möchten aber auch, dass sie neue Artikel akzeptiert. Und wenn die Elemente vorher nicht vorhanden waren, werden diese Elemente erstellt und der HTTP-Statuscode 201 „Created“ zurückgegeben. Um dies zu erreichen, importieren Sie `JSONResponse`, und geben Sie Ihren Inhalt direkt zurück, indem Sie den gewünschten `status_code` setzen: === "Python 3.10+" ```Python hl_lines="4 25" {!> ../../../docs_src/additional_status_codes/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="4 25" {!> ../../../docs_src/additional_status_codes/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="4 26" {!> ../../../docs_src/additional_status_codes/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="2 23" {!> ../../../docs_src/additional_status_codes/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="4 25" {!> ../../../docs_src/additional_status_codes/tutorial001.py!} ``` !!! warning "Achtung" Wenn Sie eine `Response` direkt zurückgeben, wie im obigen Beispiel, wird sie direkt zurückgegeben. Sie wird nicht mit einem Modell usw. serialisiert. Stellen Sie sicher, dass sie die gewünschten Daten enthält und dass die Werte gültiges JSON sind (wenn Sie `JSONResponse` verwenden). !!! note "Technische Details" Sie können auch `from starlette.responses import JSONResponse` verwenden. **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette. Das Gleiche gilt für `status`. ## OpenAPI- und API-Dokumentation Wenn Sie zusätzliche Statuscodes und Responses direkt zurückgeben, werden diese nicht in das OpenAPI-Schema (die API-Dokumentation) aufgenommen, da FastAPI keine Möglichkeit hat, im Voraus zu wissen, was Sie zurückgeben werden. Sie können das jedoch in Ihrem Code dokumentieren, indem Sie Folgendes verwenden: [Zusätzliche Responses](additional-responses.md){.internal-link target=_blank}. fastapi-0.110.3/docs/de/docs/advanced/advanced-dependencies.md000066400000000000000000000105001461403617600240370ustar00rootroot00000000000000# Fortgeschrittene Abhängigkeiten ## Parametrisierte Abhängigkeiten Alle Abhängigkeiten, die wir bisher gesehen haben, waren festgelegte Funktionen oder Klassen. Es kann jedoch Fälle geben, in denen Sie Parameter für eine Abhängigkeit festlegen möchten, ohne viele verschiedene Funktionen oder Klassen zu deklarieren. Stellen wir uns vor, wir möchten eine Abhängigkeit haben, die prüft, ob ein Query-Parameter `q` einen vordefinierten Inhalt hat. Aber wir wollen diesen vordefinierten Inhalt per Parameter festlegen können. ## Eine „aufrufbare“ Instanz In Python gibt es eine Möglichkeit, eine Instanz einer Klasse „aufrufbar“ („callable“) zu machen. Nicht die Klasse selbst (die bereits aufrufbar ist), sondern eine Instanz dieser Klasse. Dazu deklarieren wir eine Methode `__call__`: === "Python 3.9+" ```Python hl_lines="12" {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="11" {!> ../../../docs_src/dependencies/tutorial011_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="10" {!> ../../../docs_src/dependencies/tutorial011.py!} ``` In diesem Fall ist dieses `__call__` das, was **FastAPI** verwendet, um nach zusätzlichen Parametern und Unterabhängigkeiten zu suchen, und das ist es auch, was später aufgerufen wird, um einen Wert an den Parameter in Ihrer *Pfadoperation-Funktion* zu übergeben. ## Die Instanz parametrisieren Und jetzt können wir `__init__` verwenden, um die Parameter der Instanz zu deklarieren, die wir zum `Parametrisieren` der Abhängigkeit verwenden können: === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="8" {!> ../../../docs_src/dependencies/tutorial011_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/dependencies/tutorial011.py!} ``` In diesem Fall wird **FastAPI** `__init__` nie berühren oder sich darum kümmern, wir werden es direkt in unserem Code verwenden. ## Eine Instanz erstellen Wir könnten eine Instanz dieser Klasse erstellen mit: === "Python 3.9+" ```Python hl_lines="18" {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="17" {!> ../../../docs_src/dependencies/tutorial011_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="16" {!> ../../../docs_src/dependencies/tutorial011.py!} ``` Und auf diese Weise können wir unsere Abhängigkeit „parametrisieren“, die jetzt `"bar"` enthält, als das Attribut `checker.fixed_content`. ## Die Instanz als Abhängigkeit verwenden Dann könnten wir diesen `checker` in einem `Depends(checker)` anstelle von `Depends(FixedContentQueryChecker)` verwenden, da die Abhängigkeit die Instanz `checker` und nicht die Klasse selbst ist. Und beim Auflösen der Abhängigkeit ruft **FastAPI** diesen `checker` wie folgt auf: ```Python checker(q="somequery") ``` ... und übergibt, was immer das als Wert dieser Abhängigkeit in unserer *Pfadoperation-Funktion* zurückgibt, als den Parameter `fixed_content_included`: === "Python 3.9+" ```Python hl_lines="22" {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="21" {!> ../../../docs_src/dependencies/tutorial011_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="20" {!> ../../../docs_src/dependencies/tutorial011.py!} ``` !!! tip "Tipp" Das alles mag gekünstelt wirken. Und es ist möglicherweise noch nicht ganz klar, welchen Nutzen das hat. Diese Beispiele sind bewusst einfach gehalten, zeigen aber, wie alles funktioniert. In den Kapiteln zum Thema Sicherheit gibt es Hilfsfunktionen, die auf die gleiche Weise implementiert werden. Wenn Sie das hier alles verstanden haben, wissen Sie bereits, wie diese Sicherheits-Hilfswerkzeuge unter der Haube funktionieren. fastapi-0.110.3/docs/de/docs/advanced/async-tests.md000066400000000000000000000105621461403617600221330ustar00rootroot00000000000000# Asynchrone Tests Sie haben bereits gesehen, wie Sie Ihre **FastAPI**-Anwendungen mit dem bereitgestellten `TestClient` testen. Bisher haben Sie nur gesehen, wie man synchrone Tests schreibt, ohne `async`hrone Funktionen zu verwenden. Die Möglichkeit, in Ihren Tests asynchrone Funktionen zu verwenden, könnte beispielsweise nützlich sein, wenn Sie Ihre Datenbank asynchron abfragen. Stellen Sie sich vor, Sie möchten das Senden von Requests an Ihre FastAPI-Anwendung testen und dann überprüfen, ob Ihr Backend die richtigen Daten erfolgreich in die Datenbank geschrieben hat, während Sie eine asynchrone Datenbankbibliothek verwenden. Schauen wir uns an, wie wir das machen können. ## pytest.mark.anyio Wenn wir in unseren Tests asynchrone Funktionen aufrufen möchten, müssen unsere Testfunktionen asynchron sein. AnyIO stellt hierfür ein nettes Plugin zur Verfügung, mit dem wir festlegen können, dass einige Testfunktionen asynchron aufgerufen werden sollen. ## HTTPX Auch wenn Ihre **FastAPI**-Anwendung normale `def`-Funktionen anstelle von `async def` verwendet, handelt es sich darunter immer noch um eine `async`hrone Anwendung. Der `TestClient` macht unter der Haube magisches, um die asynchrone FastAPI-Anwendung in Ihren normalen `def`-Testfunktionen, mithilfe von Standard-Pytest aufzurufen. Aber diese Magie funktioniert nicht mehr, wenn wir sie in asynchronen Funktionen verwenden. Durch die asynchrone Ausführung unserer Tests können wir den `TestClient` nicht mehr in unseren Testfunktionen verwenden. Der `TestClient` basiert auf HTTPX und glücklicherweise können wir ihn direkt verwenden, um die API zu testen. ## Beispiel Betrachten wir als einfaches Beispiel eine Dateistruktur ähnlich der in [Größere Anwendungen](../tutorial/bigger-applications.md){.internal-link target=_blank} und [Testen](../tutorial/testing.md){.internal-link target=_blank}: ``` . ├── app │   ├── __init__.py │   ├── main.py │   └── test_main.py ``` Die Datei `main.py` hätte als Inhalt: ```Python {!../../../docs_src/async_tests/main.py!} ``` Die Datei `test_main.py` hätte die Tests für `main.py`, das könnte jetzt so aussehen: ```Python {!../../../docs_src/async_tests/test_main.py!} ``` ## Es ausführen Sie können Ihre Tests wie gewohnt ausführen mit:
```console $ pytest ---> 100% ```
## Details Der Marker `@pytest.mark.anyio` teilt pytest mit, dass diese Testfunktion asynchron aufgerufen werden soll: ```Python hl_lines="7" {!../../../docs_src/async_tests/test_main.py!} ``` !!! tip "Tipp" Beachten Sie, dass die Testfunktion jetzt `async def` ist und nicht nur `def` wie zuvor, wenn Sie den `TestClient` verwenden. Dann können wir einen `AsyncClient` mit der App erstellen und mit `await` asynchrone Requests an ihn senden. ```Python hl_lines="9-10" {!../../../docs_src/async_tests/test_main.py!} ``` Das ist das Äquivalent zu: ```Python response = client.get('/') ``` ... welches wir verwendet haben, um unsere Requests mit dem `TestClient` zu machen. !!! tip "Tipp" Beachten Sie, dass wir async/await mit dem neuen `AsyncClient` verwenden – der Request ist asynchron. !!! warning "Achtung" Falls Ihre Anwendung auf Lifespan-Events angewiesen ist, der `AsyncClient` löst diese Events nicht aus. Um sicherzustellen, dass sie ausgelöst werden, verwenden Sie `LifespanManager` von florimondmanca/asgi-lifespan. ## Andere asynchrone Funktionsaufrufe Da die Testfunktion jetzt asynchron ist, können Sie in Ihren Tests neben dem Senden von Requests an Ihre FastAPI-Anwendung jetzt auch andere `async`hrone Funktionen aufrufen (und `await`en), genau so, wie Sie diese an anderer Stelle in Ihrem Code aufrufen würden. !!! tip "Tipp" Wenn Sie einen `RuntimeError: Task attached to a different loop` erhalten, wenn Sie asynchrone Funktionsaufrufe in Ihre Tests integrieren (z. B. bei Verwendung von MongoDBs MotorClient), dann denken Sie daran, Objekte zu instanziieren, die einen Event Loop nur innerhalb asynchroner Funktionen benötigen, z. B. einen `@app.on_event("startup")`-Callback. fastapi-0.110.3/docs/de/docs/advanced/behind-a-proxy.md000066400000000000000000000321661461403617600225100ustar00rootroot00000000000000# Hinter einem Proxy In manchen Situationen müssen Sie möglicherweise einen **Proxy**-Server wie Traefik oder Nginx verwenden, mit einer Konfiguration, die ein zusätzliches Pfadpräfix hinzufügt, das von Ihrer Anwendung nicht gesehen wird. In diesen Fällen können Sie `root_path` verwenden, um Ihre Anwendung zu konfigurieren. Der `root_path` („Wurzelpfad“) ist ein Mechanismus, der von der ASGI-Spezifikation bereitgestellt wird (auf der FastAPI via Starlette aufbaut). Der `root_path` wird verwendet, um diese speziellen Fälle zu handhaben. Und er wird auch intern beim Mounten von Unteranwendungen verwendet. ## Proxy mit einem abgetrennten Pfadpräfix Ein Proxy mit einem abgetrennten Pfadpräfix bedeutet in diesem Fall, dass Sie einen Pfad unter `/app` in Ihrem Code deklarieren könnten, dann aber, eine Ebene darüber, den Proxy hinzufügen, der Ihre **FastAPI**-Anwendung unter einem Pfad wie `/api/v1` platziert. In diesem Fall würde der ursprüngliche Pfad `/app` tatsächlich unter `/api/v1/app` bereitgestellt. Auch wenn Ihr gesamter Code unter der Annahme geschrieben ist, dass es nur `/app` gibt. ```Python hl_lines="6" {!../../../docs_src/behind_a_proxy/tutorial001.py!} ``` Und der Proxy würde das **Pfadpräfix** on-the-fly **"entfernen**", bevor er die Anfrage an Uvicorn übermittelt, dafür sorgend, dass Ihre Anwendung davon überzeugt ist, dass sie unter `/app` bereitgestellt wird, sodass Sie nicht Ihren gesamten Code dahingehend aktualisieren müssen, das Präfix `/api/v1` zu verwenden. Bis hierher würde alles wie gewohnt funktionieren. Wenn Sie dann jedoch die Benutzeroberfläche der integrierten Dokumentation (das Frontend) öffnen, wird angenommen, dass sich das OpenAPI-Schema unter `/openapi.json` anstelle von `/api/v1/openapi.json` befindet. Das Frontend (das im Browser läuft) würde also versuchen, `/openapi.json` zu erreichen und wäre nicht in der Lage, das OpenAPI-Schema abzurufen. Da wir für unsere Anwendung einen Proxy mit dem Pfadpräfix `/api/v1` haben, muss das Frontend das OpenAPI-Schema unter `/api/v1/openapi.json` abrufen. ```mermaid graph LR browser("Browser") proxy["Proxy auf http://0.0.0.0:9999/api/v1/app"] server["Server auf http://127.0.0.1:8000/app"] browser --> proxy proxy --> server ``` !!! tip "Tipp" Die IP `0.0.0.0` wird üblicherweise verwendet, um anzudeuten, dass das Programm alle auf diesem Computer/Server verfügbaren IPs abhört. Die Benutzeroberfläche der Dokumentation würde benötigen, dass das OpenAPI-Schema deklariert, dass sich dieser API-`server` unter `/api/v1` (hinter dem Proxy) befindet. Zum Beispiel: ```JSON hl_lines="4-8" { "openapi": "3.1.0", // Hier mehr Einstellungen "servers": [ { "url": "/api/v1" } ], "paths": { // Hier mehr Einstellungen } } ``` In diesem Beispiel könnte der „Proxy“ etwa **Traefik** sein. Und der Server wäre so etwas wie **Uvicorn**, auf dem Ihre FastAPI-Anwendung ausgeführt wird. ### Bereitstellung des `root_path` Um dies zu erreichen, können Sie die Kommandozeilenoption `--root-path` wie folgt verwenden:
```console $ uvicorn main:app --root-path /api/v1 INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
Falls Sie Hypercorn verwenden, das hat auch die Option `--root-path`. !!! note "Technische Details" Die ASGI-Spezifikation definiert einen `root_path` für diesen Anwendungsfall. Und die Kommandozeilenoption `--root-path` stellt diesen `root_path` bereit. ### Überprüfen des aktuellen `root_path` Sie können den aktuellen `root_path` abrufen, der von Ihrer Anwendung für jede Anfrage verwendet wird. Er ist Teil des `scope`-Dictionarys (das ist Teil der ASGI-Spezifikation). Hier fügen wir ihn, nur zu Demonstrationszwecken, in die Nachricht ein. ```Python hl_lines="8" {!../../../docs_src/behind_a_proxy/tutorial001.py!} ``` Wenn Sie Uvicorn dann starten mit:
```console $ uvicorn main:app --root-path /api/v1 INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
wäre die Response etwa: ```JSON { "message": "Hello World", "root_path": "/api/v1" } ``` ### Festlegen des `root_path` in der FastAPI-Anwendung Falls Sie keine Möglichkeit haben, eine Kommandozeilenoption wie `--root-path` oder ähnlich zu übergeben, können Sie als Alternative beim Erstellen Ihrer FastAPI-Anwendung den Parameter `root_path` setzen: ```Python hl_lines="3" {!../../../docs_src/behind_a_proxy/tutorial002.py!} ``` Die Übergabe des `root_path` an `FastAPI` wäre das Äquivalent zur Übergabe der `--root-path`-Kommandozeilenoption an Uvicorn oder Hypercorn. ### Über `root_path` Beachten Sie, dass der Server (Uvicorn) diesen `root_path` für nichts anderes außer die Weitergabe an die Anwendung verwendet. Aber wenn Sie mit Ihrem Browser auf http://127.0.0.1:8000/app gehen, sehen Sie die normale Antwort: ```JSON { "message": "Hello World", "root_path": "/api/v1" } ``` Es wird also nicht erwartet, dass unter `http://127.0.0.1:8000/api/v1/app` darauf zugegriffen wird. Uvicorn erwartet, dass der Proxy unter `http://127.0.0.1:8000/app` auf Uvicorn zugreift, und dann liegt es in der Verantwortung des Proxys, das zusätzliche `/api/v1`-Präfix darüber hinzuzufügen. ## Über Proxys mit einem abgetrennten Pfadpräfix Bedenken Sie, dass ein Proxy mit abgetrennten Pfadpräfix nur eine von vielen Konfigurationsmöglichkeiten ist. Wahrscheinlich wird in vielen Fällen die Standardeinstellung sein, dass der Proxy kein abgetrenntes Pfadpräfix hat. In einem solchen Fall (ohne ein abgetrenntes Pfadpräfix) würde der Proxy auf etwas wie `https://myawesomeapp.com` lauschen, und wenn der Browser dann zu `https://myawesomeapp.com/api/v1/` wechselt, und Ihr Server (z. B. Uvicorn) auf `http://127.0.0.1:8000` lauscht, würde der Proxy (ohne ein abgetrenntes Pfadpräfix) über denselben Pfad auf Uvicorn zugreifen: `http://127.0.0.1:8000/api/v1/app`. ## Lokal testen mit Traefik Sie können das Experiment mit einem abgetrennten Pfadpräfix ganz einfach lokal ausführen, indem Sie Traefik verwenden. Laden Sie Traefik herunter, es ist eine einzelne Binärdatei, Sie können die komprimierte Datei extrahieren und sie direkt vom Terminal aus ausführen. Dann erstellen Sie eine Datei `traefik.toml` mit: ```TOML hl_lines="3" [entryPoints] [entryPoints.http] address = ":9999" [providers] [providers.file] filename = "routes.toml" ``` Dadurch wird Traefik angewiesen, Port 9999 abzuhören und eine andere Datei `routes.toml` zu verwenden. !!! tip "Tipp" Wir verwenden Port 9999 anstelle des Standard-HTTP-Ports 80, damit Sie ihn nicht mit Administratorrechten (`sudo`) ausführen müssen. Erstellen Sie nun die andere Datei `routes.toml`: ```TOML hl_lines="5 12 20" [http] [http.middlewares] [http.middlewares.api-stripprefix.stripPrefix] prefixes = ["/api/v1"] [http.routers] [http.routers.app-http] entryPoints = ["http"] service = "app" rule = "PathPrefix(`/api/v1`)" middlewares = ["api-stripprefix"] [http.services] [http.services.app] [http.services.app.loadBalancer] [[http.services.app.loadBalancer.servers]] url = "http://127.0.0.1:8000" ``` Diese Datei konfiguriert Traefik, das Pfadpräfix `/api/v1` zu verwenden. Und dann leitet Traefik seine Anfragen an Ihren Uvicorn weiter, der unter `http://127.0.0.1:8000` läuft. Starten Sie nun Traefik:
```console $ ./traefik --configFile=traefik.toml INFO[0000] Configuration loaded from file: /home/user/awesomeapi/traefik.toml ```
Und jetzt starten Sie Ihre Anwendung mit Uvicorn, indem Sie die Option `--root-path` verwenden:
```console $ uvicorn main:app --root-path /api/v1 INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
### Die Responses betrachten Wenn Sie nun zur URL mit dem Port für Uvicorn gehen: http://127.0.0.1:8000/app, sehen Sie die normale Response: ```JSON { "message": "Hello World", "root_path": "/api/v1" } ``` !!! tip "Tipp" Beachten Sie, dass, obwohl Sie unter `http://127.0.0.1:8000/app` darauf zugreifen, als `root_path` angezeigt wird `/api/v1`, welches aus der Option `--root-path` stammt. Öffnen Sie nun die URL mit dem Port für Traefik, einschließlich des Pfadpräfixes: http://127.0.0.1:9999/api/v1/app. Wir bekommen die gleiche Response: ```JSON { "message": "Hello World", "root_path": "/api/v1" } ``` Diesmal jedoch unter der URL mit dem vom Proxy bereitgestellten Präfixpfad: `/api/v1`. Die Idee hier ist natürlich, dass jeder über den Proxy auf die Anwendung zugreifen soll, daher ist die Version mit dem Pfadpräfix `/api/v1` die „korrekte“. Und die von Uvicorn direkt bereitgestellte Version ohne Pfadpräfix (`http://127.0.0.1:8000/app`) wäre ausschließlich für den Zugriff durch den _Proxy_ (Traefik) bestimmt. Dies demonstriert, wie der Proxy (Traefik) das Pfadpräfix verwendet und wie der Server (Uvicorn) den `root_path` aus der Option `--root-path` verwendet. ### Es in der Dokumentationsoberfläche betrachten Jetzt folgt der spaßige Teil. ✨ Der „offizielle“ Weg, auf die Anwendung zuzugreifen, wäre über den Proxy mit dem von uns definierten Pfadpräfix. Wenn Sie also die von Uvicorn direkt bereitgestellte Dokumentationsoberfläche ohne das Pfadpräfix in der URL ausprobieren, wird es erwartungsgemäß nicht funktionieren, da erwartet wird, dass der Zugriff über den Proxy erfolgt. Sie können das unter http://127.0.0.1:8000/docs sehen: Wenn wir jedoch unter der „offiziellen“ URL, über den Proxy mit Port `9999`, unter `/api/v1/docs`, auf die Dokumentationsoberfläche zugreifen, funktioniert es ordnungsgemäß! 🎉 Sie können das unter http://127.0.0.1:9999/api/v1/docs testen: Genau so, wie wir es wollten. ✔️ Dies liegt daran, dass FastAPI diesen `root_path` verwendet, um den Default-`server` in OpenAPI mit der von `root_path` bereitgestellten URL zu erstellen. ## Zusätzliche Server !!! warning "Achtung" Dies ist ein fortgeschrittener Anwendungsfall. Überspringen Sie das gerne. Standardmäßig erstellt **FastAPI** einen `server` im OpenAPI-Schema mit der URL für den `root_path`. Sie können aber auch andere alternative `server` bereitstellen, beispielsweise wenn Sie möchten, dass *dieselbe* Dokumentationsoberfläche mit einer Staging- und Produktionsumgebung interagiert. Wenn Sie eine benutzerdefinierte Liste von Servern (`servers`) übergeben und es einen `root_path` gibt (da Ihre API hinter einem Proxy läuft), fügt **FastAPI** einen „Server“ mit diesem `root_path` am Anfang der Liste ein. Zum Beispiel: ```Python hl_lines="4-7" {!../../../docs_src/behind_a_proxy/tutorial003.py!} ``` Erzeugt ein OpenAPI-Schema, wie: ```JSON hl_lines="5-7" { "openapi": "3.1.0", // Hier mehr Einstellungen "servers": [ { "url": "/api/v1" }, { "url": "https://stag.example.com", "description": "Staging environment" }, { "url": "https://prod.example.com", "description": "Production environment" } ], "paths": { // Hier mehr Einstellungen } } ``` !!! tip "Tipp" Beachten Sie den automatisch generierten Server mit dem `URL`-Wert `/api/v1`, welcher vom `root_path` stammt. In der Dokumentationsoberfläche unter http://127.0.0.1:9999/api/v1/docs würde es so aussehen: !!! tip "Tipp" Die Dokumentationsoberfläche interagiert mit dem von Ihnen ausgewählten Server. ### Den automatischen Server von `root_path` deaktivieren Wenn Sie nicht möchten, dass **FastAPI** einen automatischen Server inkludiert, welcher `root_path` verwendet, können Sie den Parameter `root_path_in_servers=False` verwenden: ```Python hl_lines="9" {!../../../docs_src/behind_a_proxy/tutorial004.py!} ``` Dann wird er nicht in das OpenAPI-Schema aufgenommen. ## Mounten einer Unteranwendung Wenn Sie gleichzeitig eine Unteranwendung mounten (wie beschrieben in [Unteranwendungen – Mounts](sub-applications.md){.internal-link target=_blank}) und einen Proxy mit `root_path` verwenden wollen, können Sie das normal tun, wie Sie es erwarten würden. FastAPI verwendet intern den `root_path` auf intelligente Weise, sodass es einfach funktioniert. ✨ fastapi-0.110.3/docs/de/docs/advanced/custom-response.md000066400000000000000000000327641461403617600230340ustar00rootroot00000000000000# Benutzerdefinierte Response – HTML, Stream, Datei, andere Standardmäßig gibt **FastAPI** die Responses mittels `JSONResponse` zurück. Sie können das überschreiben, indem Sie direkt eine `Response` zurückgeben, wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} gezeigt. Wenn Sie jedoch direkt eine `Response` zurückgeben, werden die Daten nicht automatisch konvertiert und die Dokumentation wird nicht automatisch generiert (zum Beispiel wird der spezifische „Medientyp“, der im HTTP-Header `Content-Type` angegeben ist, nicht Teil der generierten OpenAPI). Sie können aber auch die `Response`, die Sie verwenden möchten, im *Pfadoperation-Dekorator* deklarieren. Der Inhalt, den Sie von Ihrer *Pfadoperation-Funktion* zurückgeben, wird in diese `Response` eingefügt. Und wenn diese `Response` einen JSON-Medientyp (`application/json`) hat, wie es bei `JSONResponse` und `UJSONResponse` der Fall ist, werden die von Ihnen zurückgegebenen Daten automatisch mit jedem Pydantic `response_model` konvertiert (und gefiltert), das Sie im *Pfadoperation-Dekorator* deklariert haben. !!! note "Hinweis" Wenn Sie eine Response-Klasse ohne Medientyp verwenden, erwartet FastAPI, dass Ihre Response keinen Inhalt hat, und dokumentiert daher das Format der Response nicht in deren generierter OpenAPI-Dokumentation. ## `ORJSONResponse` verwenden Um beispielsweise noch etwas Leistung herauszuholen, können Sie `orjson` installieren und verwenden, und die Response als `ORJSONResponse` deklarieren. Importieren Sie die `Response`-Klasse (-Unterklasse), die Sie verwenden möchten, und deklarieren Sie sie im *Pfadoperation-Dekorator*. Bei umfangreichen Responses ist die direkte Rückgabe einer `Response` viel schneller als ein Dictionary zurückzugeben. Das liegt daran, dass FastAPI standardmäßig jedes enthaltene Element überprüft und sicherstellt, dass es als JSON serialisierbar ist, und zwar unter Verwendung desselben [JSON-kompatiblen Encoders](../tutorial/encoder.md){.internal-link target=_blank}, der im Tutorial erläutert wurde. Dadurch können Sie **beliebige Objekte** zurückgeben, zum Beispiel Datenbankmodelle. Wenn Sie jedoch sicher sind, dass der von Ihnen zurückgegebene Inhalt **mit JSON serialisierbar** ist, können Sie ihn direkt an die Response-Klasse übergeben und die zusätzliche Arbeit vermeiden, die FastAPI hätte, indem es Ihren zurückgegebenen Inhalt durch den `jsonable_encoder` leitet, bevor es ihn an die Response-Klasse übergibt. ```Python hl_lines="2 7" {!../../../docs_src/custom_response/tutorial001b.py!} ``` !!! info Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren. In diesem Fall wird der HTTP-Header `Content-Type` auf `application/json` gesetzt. Und er wird als solcher in OpenAPI dokumentiert. !!! tip "Tipp" Die `ORJSONResponse` ist derzeit nur in FastAPI verfügbar, nicht in Starlette. ## HTML-Response Um eine Response mit HTML direkt von **FastAPI** zurückzugeben, verwenden Sie `HTMLResponse`. * Importieren Sie `HTMLResponse`. * Übergeben Sie `HTMLResponse` als den Parameter `response_class` Ihres *Pfadoperation-Dekorators*. ```Python hl_lines="2 7" {!../../../docs_src/custom_response/tutorial002.py!} ``` !!! info Der Parameter `response_class` wird auch verwendet, um den „Medientyp“ der Response zu definieren. In diesem Fall wird der HTTP-Header `Content-Type` auf `text/html` gesetzt. Und er wird als solcher in OpenAPI dokumentiert. ### Eine `Response` zurückgeben Wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} gezeigt, können Sie die Response auch direkt in Ihrer *Pfadoperation* überschreiben, indem Sie diese zurückgeben. Das gleiche Beispiel von oben, das eine `HTMLResponse` zurückgibt, könnte so aussehen: ```Python hl_lines="2 7 19" {!../../../docs_src/custom_response/tutorial003.py!} ``` !!! warning "Achtung" Eine `Response`, die direkt von Ihrer *Pfadoperation-Funktion* zurückgegeben wird, wird in OpenAPI nicht dokumentiert (zum Beispiel wird der `Content-Type` nicht dokumentiert) und ist in der automatischen interaktiven Dokumentation nicht sichtbar. !!! info Natürlich stammen der eigentliche `Content-Type`-Header, der Statuscode, usw., aus dem `Response`-Objekt, das Sie zurückgegeben haben. ### In OpenAPI dokumentieren und `Response` überschreiben Wenn Sie die Response innerhalb der Funktion überschreiben und gleichzeitig den „Medientyp“ in OpenAPI dokumentieren möchten, können Sie den `response_class`-Parameter verwenden UND ein `Response`-Objekt zurückgeben. Die `response_class` wird dann nur zur Dokumentation der OpenAPI-Pfadoperation* verwendet, Ihre `Response` wird jedoch unverändert verwendet. #### Eine `HTMLResponse` direkt zurückgeben Es könnte zum Beispiel so etwas sein: ```Python hl_lines="7 21 23" {!../../../docs_src/custom_response/tutorial004.py!} ``` In diesem Beispiel generiert die Funktion `generate_html_response()` bereits eine `Response` und gibt sie zurück, anstatt das HTML in einem `str` zurückzugeben. Indem Sie das Ergebnis des Aufrufs von `generate_html_response()` zurückgeben, geben Sie bereits eine `Response` zurück, die das Standardverhalten von **FastAPI** überschreibt. Aber da Sie die `HTMLResponse` auch in der `response_class` übergeben haben, weiß **FastAPI**, dass sie in OpenAPI und der interaktiven Dokumentation als HTML mit `text/html` zu dokumentieren ist: ## Verfügbare Responses Hier sind einige der verfügbaren Responses. Bedenken Sie, dass Sie `Response` verwenden können, um alles andere zurückzugeben, oder sogar eine benutzerdefinierte Unterklasse zu erstellen. !!! note "Technische Details" Sie können auch `from starlette.responses import HTMLResponse` verwenden. **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette. ### `Response` Die Hauptklasse `Response`, alle anderen Responses erben von ihr. Sie können sie direkt zurückgeben. Sie akzeptiert die folgenden Parameter: * `content` – Ein `str` oder `bytes`. * `status_code` – Ein `int`-HTTP-Statuscode. * `headers` – Ein `dict` von Strings. * `media_type` – Ein `str`, der den Medientyp angibt. Z. B. `"text/html"`. FastAPI (eigentlich Starlette) fügt automatisch einen Content-Length-Header ein. Außerdem wird es einen Content-Type-Header einfügen, der auf dem media_type basiert, und für Texttypen einen Zeichensatz (charset) anfügen. ```Python hl_lines="1 18" {!../../../docs_src/response_directly/tutorial002.py!} ``` ### `HTMLResponse` Nimmt Text oder Bytes entgegen und gibt eine HTML-Response zurück, wie Sie oben gelesen haben. ### `PlainTextResponse` Nimmt Text oder Bytes entgegen und gibt eine Plain-Text-Response zurück. ```Python hl_lines="2 7 9" {!../../../docs_src/custom_response/tutorial005.py!} ``` ### `JSONResponse` Nimmt einige Daten entgegen und gibt eine `application/json`-codierte Response zurück. Dies ist die Standard-Response, die in **FastAPI** verwendet wird, wie Sie oben gelesen haben. ### `ORJSONResponse` Eine schnelle alternative JSON-Response mit `orjson`, wie Sie oben gelesen haben. ### `UJSONResponse` Eine alternative JSON-Response mit `ujson`. !!! warning "Achtung" `ujson` ist bei der Behandlung einiger Sonderfälle weniger sorgfältig als Pythons eingebaute Implementierung. ```Python hl_lines="2 7" {!../../../docs_src/custom_response/tutorial001.py!} ``` !!! tip "Tipp" Möglicherweise ist `ORJSONResponse` eine schnellere Alternative. ### `RedirectResponse` Gibt eine HTTP-Weiterleitung (HTTP-Redirect) zurück. Verwendet standardmäßig den Statuscode 307 – Temporäre Weiterleitung (Temporary Redirect). Sie können eine `RedirectResponse` direkt zurückgeben: ```Python hl_lines="2 9" {!../../../docs_src/custom_response/tutorial006.py!} ``` --- Oder Sie können sie im Parameter `response_class` verwenden: ```Python hl_lines="2 7 9" {!../../../docs_src/custom_response/tutorial006b.py!} ``` Wenn Sie das tun, können Sie die URL direkt von Ihrer *Pfadoperation*-Funktion zurückgeben. In diesem Fall ist der verwendete `status_code` der Standardcode für die `RedirectResponse`, also `307`. --- Sie können den Parameter `status_code` auch in Kombination mit dem Parameter `response_class` verwenden: ```Python hl_lines="2 7 9" {!../../../docs_src/custom_response/tutorial006c.py!} ``` ### `StreamingResponse` Nimmt einen asynchronen Generator oder einen normalen Generator/Iterator und streamt den Responsebody. ```Python hl_lines="2 14" {!../../../docs_src/custom_response/tutorial007.py!} ``` #### Verwendung von `StreamingResponse` mit dateiähnlichen Objekten Wenn Sie ein dateiähnliches (file-like) Objekt haben (z. B. das von `open()` zurückgegebene Objekt), können Sie eine Generatorfunktion erstellen, um über dieses dateiähnliche Objekt zu iterieren. Auf diese Weise müssen Sie nicht alles zuerst in den Arbeitsspeicher lesen und können diese Generatorfunktion an `StreamingResponse` übergeben und zurückgeben. Das umfasst viele Bibliotheken zur Interaktion mit Cloud-Speicher, Videoverarbeitung und anderen. ```{ .python .annotate hl_lines="2 10-12 14" } {!../../../docs_src/custom_response/tutorial008.py!} ``` 1. Das ist die Generatorfunktion. Es handelt sich um eine „Generatorfunktion“, da sie `yield`-Anweisungen enthält. 2. Durch die Verwendung eines `with`-Blocks stellen wir sicher, dass das dateiähnliche Objekt geschlossen wird, nachdem die Generatorfunktion fertig ist. Also, nachdem sie mit dem Senden der Response fertig ist. 3. Dieses `yield from` weist die Funktion an, über das Ding namens `file_like` zu iterieren. Und dann für jeden iterierten Teil, diesen Teil so zurückzugeben, als wenn er aus dieser Generatorfunktion (`iterfile`) stammen würde. Es handelt sich also hier um eine Generatorfunktion, die die „generierende“ Arbeit intern auf etwas anderes überträgt. Auf diese Weise können wir das Ganze in einen `with`-Block einfügen und so sicherstellen, dass das dateiartige Objekt nach Abschluss geschlossen wird. !!! tip "Tipp" Beachten Sie, dass wir, da wir Standard-`open()` verwenden, welches `async` und `await` nicht unterstützt, hier die Pfadoperation mit normalen `def` deklarieren. ### `FileResponse` Streamt eine Datei asynchron als Response. Nimmt zur Instanziierung einen anderen Satz von Argumenten entgegen als die anderen Response-Typen: * `path` – Der Dateipfad zur Datei, die gestreamt werden soll. * `headers` – Alle benutzerdefinierten Header, die inkludiert werden sollen, als Dictionary. * `media_type` – Ein String, der den Medientyp angibt. Wenn nicht gesetzt, wird der Dateiname oder Pfad verwendet, um auf einen Medientyp zu schließen. * `filename` – Wenn gesetzt, wird das in der `Content-Disposition` der Response eingefügt. Datei-Responses enthalten die entsprechenden `Content-Length`-, `Last-Modified`- und `ETag`-Header. ```Python hl_lines="2 10" {!../../../docs_src/custom_response/tutorial009.py!} ``` Sie können auch den Parameter `response_class` verwenden: ```Python hl_lines="2 8 10" {!../../../docs_src/custom_response/tutorial009b.py!} ``` In diesem Fall können Sie den Dateipfad direkt von Ihrer *Pfadoperation*-Funktion zurückgeben. ## Benutzerdefinierte Response-Klasse Sie können Ihre eigene benutzerdefinierte Response-Klasse erstellen, die von `Response` erbt und diese verwendet. Nehmen wir zum Beispiel an, dass Sie `orjson` verwenden möchten, aber mit einigen benutzerdefinierten Einstellungen, die in der enthaltenen `ORJSONResponse`-Klasse nicht verwendet werden. Sie möchten etwa, dass Ihre Response eingerücktes und formatiertes JSON zurückgibt. Dafür möchten Sie die orjson-Option `orjson.OPT_INDENT_2` verwenden. Sie könnten eine `CustomORJSONResponse` erstellen. Das Wichtigste, was Sie tun müssen, ist, eine `Response.render(content)`-Methode zu erstellen, die den Inhalt als `bytes` zurückgibt: ```Python hl_lines="9-14 17" {!../../../docs_src/custom_response/tutorial009c.py!} ``` Statt: ```json {"message": "Hello World"} ``` ... wird die Response jetzt Folgendes zurückgeben: ```json { "message": "Hello World" } ``` Natürlich werden Sie wahrscheinlich viel bessere Möglichkeiten finden, Vorteil daraus zu ziehen, als JSON zu formatieren. 😉 ## Standard-Response-Klasse Beim Erstellen einer **FastAPI**-Klasseninstanz oder eines `APIRouter`s können Sie angeben, welche Response-Klasse standardmäßig verwendet werden soll. Der Parameter, der das definiert, ist `default_response_class`. Im folgenden Beispiel verwendet **FastAPI** standardmäßig `ORJSONResponse` in allen *Pfadoperationen*, anstelle von `JSONResponse`. ```Python hl_lines="2 4" {!../../../docs_src/custom_response/tutorial010.py!} ``` !!! tip "Tipp" Sie können dennoch weiterhin `response_class` in *Pfadoperationen* überschreiben, wie bisher. ## Zusätzliche Dokumentation Sie können auch den Medientyp und viele andere Details in OpenAPI mit `responses` deklarieren: [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}. fastapi-0.110.3/docs/de/docs/advanced/dataclasses.md000066400000000000000000000111501461403617600221370ustar00rootroot00000000000000# Verwendung von Datenklassen FastAPI basiert auf **Pydantic** und ich habe Ihnen gezeigt, wie Sie Pydantic-Modelle verwenden können, um Requests und Responses zu deklarieren. Aber FastAPI unterstützt auf die gleiche Weise auch die Verwendung von `dataclasses`: ```Python hl_lines="1 7-12 19-20" {!../../../docs_src/dataclasses/tutorial001.py!} ``` Das ist dank **Pydantic** ebenfalls möglich, da es `dataclasses` intern unterstützt. Auch wenn im obige Code Pydantic nicht explizit vorkommt, verwendet FastAPI Pydantic, um diese Standard-Datenklassen in Pydantics eigene Variante von Datenklassen zu konvertieren. Und natürlich wird das gleiche unterstützt: * Validierung der Daten * Serialisierung der Daten * Dokumentation der Daten, usw. Das funktioniert genauso wie mit Pydantic-Modellen. Und tatsächlich wird es unter der Haube mittels Pydantic auf die gleiche Weise bewerkstelligt. !!! info Bedenken Sie, dass Datenklassen nicht alles können, was Pydantic-Modelle können. Daher müssen Sie möglicherweise weiterhin Pydantic-Modelle verwenden. Wenn Sie jedoch eine Menge Datenklassen herumliegen haben, ist dies ein guter Trick, um sie für eine Web-API mithilfe von FastAPI zu verwenden. 🤓 ## Datenklassen als `response_model` Sie können `dataclasses` auch im Parameter `response_model` verwenden: ```Python hl_lines="1 7-13 19" {!../../../docs_src/dataclasses/tutorial002.py!} ``` Die Datenklasse wird automatisch in eine Pydantic-Datenklasse konvertiert. Auf diese Weise wird deren Schema in der Benutzeroberfläche der API-Dokumentation angezeigt: ## Datenklassen in verschachtelten Datenstrukturen Sie können `dataclasses` auch mit anderen Typannotationen kombinieren, um verschachtelte Datenstrukturen zu erstellen. In einigen Fällen müssen Sie möglicherweise immer noch Pydantics Version von `dataclasses` verwenden. Zum Beispiel, wenn Sie Fehler in der automatisch generierten API-Dokumentation haben. In diesem Fall können Sie einfach die Standard-`dataclasses` durch `pydantic.dataclasses` ersetzen, was einen direkten Ersatz darstellt: ```{ .python .annotate hl_lines="1 5 8-11 14-17 23-25 28" } {!../../../docs_src/dataclasses/tutorial003.py!} ``` 1. Wir importieren `field` weiterhin von Standard-`dataclasses`. 2. `pydantic.dataclasses` ist ein direkter Ersatz für `dataclasses`. 3. Die Datenklasse `Author` enthält eine Liste von `Item`-Datenklassen. 4. Die Datenklasse `Author` wird im `response_model`-Parameter verwendet. 5. Sie können andere Standard-Typannotationen mit Datenklassen als Requestbody verwenden. In diesem Fall handelt es sich um eine Liste von `Item`-Datenklassen. 6. Hier geben wir ein Dictionary zurück, das `items` enthält, welches eine Liste von Datenklassen ist. FastAPI ist weiterhin in der Lage, die Daten nach JSON zu serialisieren. 7. Hier verwendet das `response_model` als Typannotation eine Liste von `Author`-Datenklassen. Auch hier können Sie `dataclasses` mit Standard-Typannotationen kombinieren. 8. Beachten Sie, dass diese *Pfadoperation-Funktion* reguläres `def` anstelle von `async def` verwendet. Wie immer können Sie in FastAPI `def` und `async def` beliebig kombinieren. Wenn Sie eine Auffrischung darüber benötigen, wann welche Anwendung sinnvoll ist, lesen Sie den Abschnitt „In Eile?“ in der Dokumentation zu [`async` und `await`](../async.md#in-eile){.internal-link target=_blank}. 9. Diese *Pfadoperation-Funktion* gibt keine Datenklassen zurück (obwohl dies möglich wäre), sondern eine Liste von Dictionarys mit internen Daten. FastAPI verwendet den Parameter `response_model` (der Datenklassen enthält), um die Response zu konvertieren. Sie können `dataclasses` mit anderen Typannotationen auf vielfältige Weise kombinieren, um komplexe Datenstrukturen zu bilden. Weitere Einzelheiten finden Sie in den Bemerkungen im Quellcode oben. ## Mehr erfahren Sie können `dataclasses` auch mit anderen Pydantic-Modellen kombinieren, von ihnen erben, sie in Ihre eigenen Modelle einbinden, usw. Weitere Informationen finden Sie in der Pydantic-Dokumentation zu Datenklassen. ## Version Dies ist verfügbar seit FastAPI-Version `0.67.0`. 🔖 fastapi-0.110.3/docs/de/docs/advanced/events.md000066400000000000000000000221721461403617600211620ustar00rootroot00000000000000# Lifespan-Events Sie können Logik (Code) definieren, die ausgeführt werden soll, bevor die Anwendung **hochfährt**. Dies bedeutet, dass dieser Code **einmal** ausgeführt wird, **bevor** die Anwendung **beginnt, Requests entgegenzunehmen**. Auf die gleiche Weise können Sie Logik (Code) definieren, die ausgeführt werden soll, wenn die Anwendung **heruntergefahren** wird. In diesem Fall wird dieser Code **einmal** ausgeführt, **nachdem** möglicherweise **viele Requests** bearbeitet wurden. Da dieser Code ausgeführt wird, bevor die Anwendung **beginnt**, Requests entgegenzunehmen, und unmittelbar, nachdem sie die Bearbeitung von Requests **abgeschlossen hat**, deckt er die gesamte **Lebensdauer – „Lifespan“** – der Anwendung ab (das Wort „Lifespan“ wird gleich wichtig sein 😉). Dies kann sehr nützlich sein, um **Ressourcen** einzurichten, die Sie in der gesamten Anwendung verwenden wollen und die von Requests **gemeinsam genutzt** werden und/oder die Sie anschließend **aufräumen** müssen. Zum Beispiel ein Pool von Datenbankverbindungen oder das Laden eines gemeinsam genutzten Modells für maschinelles Lernen. ## Anwendungsfall Beginnen wir mit einem Beispiel-**Anwendungsfall** und schauen uns dann an, wie wir ihn mit dieser Methode implementieren können. Stellen wir uns vor, Sie verfügen über einige **Modelle für maschinelles Lernen**, die Sie zur Bearbeitung von Requests verwenden möchten. 🤖 Die gleichen Modelle werden von den Requests gemeinsam genutzt, es handelt sich also nicht um ein Modell pro Request, pro Benutzer, oder ähnliches. Stellen wir uns vor, dass das Laden des Modells **eine ganze Weile dauern** kann, da viele **Daten von der Festplatte** gelesen werden müssen. Sie möchten das also nicht für jeden Request tun. Sie könnten das auf der obersten Ebene des Moduls/der Datei machen, aber das würde auch bedeuten, dass **das Modell geladen wird**, selbst wenn Sie nur einen einfachen automatisierten Test ausführen, dann wäre dieser Test **langsam**, weil er warten müsste, bis das Modell geladen ist, bevor er einen davon unabhängigen Teil des Codes ausführen könnte. Das wollen wir besser machen: Laden wir das Modell, bevor die Requests bearbeitet werden, aber unmittelbar bevor die Anwendung beginnt, Requests zu empfangen, und nicht, während der Code geladen wird. ## Lifespan Sie können diese Logik beim *Hochfahren* und *Herunterfahren* mithilfe des `lifespan`-Parameters der `FastAPI`-App und eines „Kontextmanagers“ definieren (ich zeige Ihnen gleich, was das ist). Beginnen wir mit einem Beispiel und sehen es uns dann im Detail an. Wir erstellen eine asynchrone Funktion `lifespan()` mit `yield` wie folgt: ```Python hl_lines="16 19" {!../../../docs_src/events/tutorial003.py!} ``` Hier simulieren wir das langsame *Hochfahren*, das Laden des Modells, indem wir die (Fake-)Modellfunktion vor dem `yield` in das Dictionary mit Modellen für maschinelles Lernen einfügen. Dieser Code wird ausgeführt, **bevor** die Anwendung **beginnt, Requests entgegenzunehmen**, während des *Hochfahrens*. Und dann, direkt nach dem `yield`, entladen wir das Modell. Dieser Code wird unmittelbar vor dem *Herunterfahren* ausgeführt, **nachdem** die Anwendung **die Bearbeitung von Requests abgeschlossen hat**. Dadurch könnten beispielsweise Ressourcen wie Arbeitsspeicher oder eine GPU freigegeben werden. !!! tip "Tipp" Das *Herunterfahren* würde erfolgen, wenn Sie die Anwendung **stoppen**. Möglicherweise müssen Sie eine neue Version starten, oder Sie haben es einfach satt, sie auszuführen. 🤷 ### Lifespan-Funktion Das Erste, was auffällt, ist, dass wir eine asynchrone Funktion mit `yield` definieren. Das ist sehr ähnlich zu Abhängigkeiten mit `yield`. ```Python hl_lines="14-19" {!../../../docs_src/events/tutorial003.py!} ``` Der erste Teil der Funktion, vor dem `yield`, wird ausgeführt **bevor** die Anwendung startet. Und der Teil nach `yield` wird ausgeführt, **nachdem** die Anwendung beendet ist. ### Asynchroner Kontextmanager Wie Sie sehen, ist die Funktion mit einem `@asynccontextmanager` versehen. Dadurch wird die Funktion in einen sogenannten „**asynchronen Kontextmanager**“ umgewandelt. ```Python hl_lines="1 13" {!../../../docs_src/events/tutorial003.py!} ``` Ein **Kontextmanager** in Python ist etwas, das Sie in einer `with`-Anweisung verwenden können, zum Beispiel kann `open()` als Kontextmanager verwendet werden: ```Python with open("file.txt") as file: file.read() ``` In neueren Versionen von Python gibt es auch einen **asynchronen Kontextmanager**. Sie würden ihn mit `async with` verwenden: ```Python async with lifespan(app): await do_stuff() ``` Wenn Sie wie oben einen Kontextmanager oder einen asynchronen Kontextmanager erstellen, führt dieser vor dem Betreten des `with`-Blocks den Code vor dem `yield` aus, und nach dem Verlassen des `with`-Blocks wird er den Code nach dem `yield` ausführen. In unserem obigen Codebeispiel verwenden wir ihn nicht direkt, sondern übergeben ihn an FastAPI, damit es ihn verwenden kann. Der Parameter `lifespan` der `FastAPI`-App benötigt einen **asynchronen Kontextmanager**, wir können ihm also unseren neuen asynchronen Kontextmanager `lifespan` übergeben. ```Python hl_lines="22" {!../../../docs_src/events/tutorial003.py!} ``` ## Alternative Events (deprecated) !!! warning "Achtung" Der empfohlene Weg, das *Hochfahren* und *Herunterfahren* zu handhaben, ist die Verwendung des `lifespan`-Parameters der `FastAPI`-App, wie oben beschrieben. Wenn Sie einen `lifespan`-Parameter übergeben, werden die `startup`- und `shutdown`-Eventhandler nicht mehr aufgerufen. Es ist entweder alles `lifespan` oder alles Events, nicht beides. Sie können diesen Teil wahrscheinlich überspringen. Es gibt eine alternative Möglichkeit, diese Logik zu definieren, sodass sie beim *Hochfahren* und beim *Herunterfahren* ausgeführt wird. Sie können Eventhandler (Funktionen) definieren, die ausgeführt werden sollen, bevor die Anwendung hochgefahren wird oder wenn die Anwendung heruntergefahren wird. Diese Funktionen können mit `async def` oder normalem `def` deklariert werden. ### `startup`-Event Um eine Funktion hinzuzufügen, die vor dem Start der Anwendung ausgeführt werden soll, deklarieren Sie diese mit dem Event `startup`: ```Python hl_lines="8" {!../../../docs_src/events/tutorial001.py!} ``` In diesem Fall initialisiert die Eventhandler-Funktion `startup` die „Datenbank“ der Items (nur ein `dict`) mit einigen Werten. Sie können mehr als eine Eventhandler-Funktion hinzufügen. Und Ihre Anwendung empfängt erst dann Anfragen, wenn alle `startup`-Eventhandler abgeschlossen sind. ### `shutdown`-Event Um eine Funktion hinzuzufügen, die beim Herunterfahren der Anwendung ausgeführt werden soll, deklarieren Sie sie mit dem Event `shutdown`: ```Python hl_lines="6" {!../../../docs_src/events/tutorial002.py!} ``` Hier schreibt die `shutdown`-Eventhandler-Funktion eine Textzeile `"Application shutdown"` in eine Datei `log.txt`. !!! info In der Funktion `open()` bedeutet `mode="a"` „append“ („anhängen“), sodass die Zeile nach dem, was sich in dieser Datei befindet, hinzugefügt wird, ohne den vorherigen Inhalt zu überschreiben. !!! tip "Tipp" Beachten Sie, dass wir in diesem Fall eine Standard-Python-Funktion `open()` verwenden, die mit einer Datei interagiert. Es handelt sich also um I/O (Input/Output), welches „Warten“ erfordert, bis Dinge auf die Festplatte geschrieben werden. Aber `open()` verwendet nicht `async` und `await`. Daher deklarieren wir die Eventhandler-Funktion mit Standard-`def` statt mit `async def`. ### `startup` und `shutdown` zusammen Es besteht eine hohe Wahrscheinlichkeit, dass die Logik für Ihr *Hochfahren* und *Herunterfahren* miteinander verknüpft ist. Vielleicht möchten Sie etwas beginnen und es dann beenden, eine Ressource laden und sie dann freigeben usw. Bei getrennten Funktionen, die keine gemeinsame Logik oder Variablen haben, ist dies schwieriger, da Sie Werte in globalen Variablen speichern oder ähnliche Tricks verwenden müssen. Aus diesem Grund wird jetzt empfohlen, stattdessen `lifespan` wie oben erläutert zu verwenden. ## Technische Details Nur ein technisches Detail für die neugierigen Nerds. 🤓 In der technischen ASGI-Spezifikation ist dies Teil des Lifespan Protokolls und definiert Events namens `startup` und `shutdown`. !!! info Weitere Informationen zu Starlettes `lifespan`-Handlern finden Sie in Starlettes Lifespan-Dokumentation. Einschließlich, wie man Lifespan-Zustand handhabt, der in anderen Bereichen Ihres Codes verwendet werden kann. ## Unteranwendungen 🚨 Beachten Sie, dass diese Lifespan-Events (Hochfahren und Herunterfahren) nur für die Hauptanwendung ausgeführt werden, nicht für [Unteranwendungen – Mounts](sub-applications.md){.internal-link target=_blank}. fastapi-0.110.3/docs/de/docs/advanced/generate-clients.md000066400000000000000000000277361461403617600231220ustar00rootroot00000000000000# Clients generieren Da **FastAPI** auf der OpenAPI-Spezifikation basiert, erhalten Sie automatische Kompatibilität mit vielen Tools, einschließlich der automatischen API-Dokumentation (bereitgestellt von Swagger UI). Ein besonderer Vorteil, der nicht unbedingt offensichtlich ist, besteht darin, dass Sie für Ihre API **Clients generieren** können (manchmal auch **SDKs** genannt), für viele verschiedene **Programmiersprachen**. ## OpenAPI-Client-Generatoren Es gibt viele Tools zum Generieren von Clients aus **OpenAPI**. Ein gängiges Tool ist OpenAPI Generator. Wenn Sie ein **Frontend** erstellen, ist openapi-ts eine sehr interessante Alternative. ## Client- und SDK-Generatoren – Sponsor Es gibt auch einige **vom Unternehmen entwickelte** Client- und SDK-Generatoren, die auf OpenAPI (FastAPI) basieren. In einigen Fällen können diese Ihnen **weitere Funktionalität** zusätzlich zu qualitativ hochwertigen generierten SDKs/Clients bieten. Einige von diesen ✨ [**sponsern FastAPI**](../help-fastapi.md#den-autor-sponsern){.internal-link target=_blank} ✨, das gewährleistet die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ökosystem**. Und es zeigt deren wahres Engagement für FastAPI und seine **Community** (Sie), da diese Ihnen nicht nur einen **guten Service** bieten möchten, sondern auch sicherstellen möchten, dass Sie über ein **gutes und gesundes Framework** verfügen, FastAPI. 🙇 Beispielsweise könnten Sie Speakeasy ausprobieren. Es gibt auch mehrere andere Unternehmen, welche ähnliche Dienste anbieten und die Sie online suchen und finden können. 🤓 ## Einen TypeScript-Frontend-Client generieren Beginnen wir mit einer einfachen FastAPI-Anwendung: === "Python 3.9+" ```Python hl_lines="7-9 12-13 16-17 21" {!> ../../../docs_src/generate_clients/tutorial001_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="9-11 14-15 18 19 23" {!> ../../../docs_src/generate_clients/tutorial001.py!} ``` Beachten Sie, dass die *Pfadoperationen* die Modelle definieren, welche diese für die Request- und Response-Payload verwenden, indem sie die Modelle `Item` und `ResponseMessage` verwenden. ### API-Dokumentation Wenn Sie zur API-Dokumentation gehen, werden Sie sehen, dass diese die **Schemas** für die Daten enthält, welche in Requests gesendet und in Responses empfangen werden: Sie können diese Schemas sehen, da sie mit den Modellen in der Anwendung deklariert wurden. Diese Informationen sind im **OpenAPI-Schema** der Anwendung verfügbar und werden dann in der API-Dokumentation angezeigt (von Swagger UI). Und dieselben Informationen aus den Modellen, die in OpenAPI enthalten sind, können zum **Generieren des Client-Codes** verwendet werden. ### Einen TypeScript-Client generieren Nachdem wir nun die Anwendung mit den Modellen haben, können wir den Client-Code für das Frontend generieren. #### `openapi-ts` installieren Sie können `openapi-ts` in Ihrem Frontend-Code installieren mit:
```console $ npm install @hey-api/openapi-ts --save-dev ---> 100% ```
#### Client-Code generieren Um den Client-Code zu generieren, können Sie das Kommandozeilentool `openapi-ts` verwenden, das soeben installiert wurde. Da es im lokalen Projekt installiert ist, könnten Sie diesen Befehl wahrscheinlich nicht direkt aufrufen, sondern würden ihn in Ihre Datei `package.json` einfügen. Diese könnte so aussehen: ```JSON hl_lines="7" { "name": "frontend-app", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "generate-client": "openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios" }, "author": "", "license": "", "devDependencies": { "@hey-api/openapi-ts": "^0.27.38", "typescript": "^4.6.2" } } ``` Nachdem Sie das NPM-Skript `generate-client` dort stehen haben, können Sie es ausführen mit:
```console $ npm run generate-client frontend-app@1.0.0 generate-client /home/user/code/frontend-app > openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios ```
Dieser Befehl generiert Code in `./src/client` und verwendet intern `axios` (die Frontend-HTTP-Bibliothek). ### Den Client-Code ausprobieren Jetzt können Sie den Client-Code importieren und verwenden. Er könnte wie folgt aussehen, beachten Sie, dass Sie automatische Codevervollständigung für die Methoden erhalten: Sie erhalten außerdem automatische Vervollständigung für die zu sendende Payload: !!! tip "Tipp" Beachten Sie die automatische Vervollständigung für `name` und `price`, welche in der FastAPI-Anwendung im `Item`-Modell definiert wurden. Sie erhalten Inline-Fehlerberichte für die von Ihnen gesendeten Daten: Das Response-Objekt hat auch automatische Vervollständigung: ## FastAPI-Anwendung mit Tags In vielen Fällen wird Ihre FastAPI-Anwendung größer sein und Sie werden wahrscheinlich Tags verwenden, um verschiedene Gruppen von *Pfadoperationen* zu separieren. Beispielsweise könnten Sie einen Abschnitt für **Items (Artikel)** und einen weiteren Abschnitt für **Users (Benutzer)** haben, und diese könnten durch Tags getrennt sein: === "Python 3.9+" ```Python hl_lines="21 26 34" {!> ../../../docs_src/generate_clients/tutorial002_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="23 28 36" {!> ../../../docs_src/generate_clients/tutorial002.py!} ``` ### Einen TypeScript-Client mit Tags generieren Wenn Sie unter Verwendung von Tags einen Client für eine FastAPI-Anwendung generieren, wird normalerweise auch der Client-Code anhand der Tags getrennt. Auf diese Weise können Sie die Dinge für den Client-Code richtig ordnen und gruppieren: In diesem Fall haben Sie: * `ItemsService` * `UsersService` ### Client-Methodennamen Im Moment sehen die generierten Methodennamen wie `createItemItemsPost` nicht sehr sauber aus: ```TypeScript ItemsService.createItemItemsPost({name: "Plumbus", price: 5}) ``` ... das liegt daran, dass der Client-Generator für jede *Pfadoperation* die OpenAPI-interne **Operation-ID** verwendet. OpenAPI erfordert, dass jede Operation-ID innerhalb aller *Pfadoperationen* eindeutig ist. Daher verwendet FastAPI den **Funktionsnamen**, den **Pfad** und die **HTTP-Methode/-Operation**, um diese Operation-ID zu generieren. Denn so kann sichergestellt werden, dass die Operation-IDs eindeutig sind. Aber ich zeige Ihnen als nächstes, wie Sie das verbessern können. 🤓 ## Benutzerdefinierte Operation-IDs und bessere Methodennamen Sie können die Art und Weise, wie diese Operation-IDs **generiert** werden, **ändern**, um sie einfacher zu machen und **einfachere Methodennamen** in den Clients zu haben. In diesem Fall müssen Sie auf andere Weise sicherstellen, dass jede Operation-ID **eindeutig** ist. Sie könnten beispielsweise sicherstellen, dass jede *Pfadoperation* einen Tag hat, und dann die Operation-ID basierend auf dem **Tag** und dem **Namen** der *Pfadoperation* (dem Funktionsnamen) generieren. ### Funktion zum Generieren einer eindeutigen ID erstellen FastAPI verwendet eine **eindeutige ID** für jede *Pfadoperation*, diese wird für die **Operation-ID** und auch für die Namen aller benötigten benutzerdefinierten Modelle für Requests oder Responses verwendet. Sie können diese Funktion anpassen. Sie nimmt eine `APIRoute` und gibt einen String zurück. Hier verwendet sie beispielsweise den ersten Tag (Sie werden wahrscheinlich nur einen Tag haben) und den Namen der *Pfadoperation* (den Funktionsnamen). Anschließend können Sie diese benutzerdefinierte Funktion als Parameter `generate_unique_id_function` an **FastAPI** übergeben: === "Python 3.9+" ```Python hl_lines="6-7 10" {!> ../../../docs_src/generate_clients/tutorial003_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="8-9 12" {!> ../../../docs_src/generate_clients/tutorial003.py!} ``` ### Einen TypeScript-Client mit benutzerdefinierten Operation-IDs generieren Wenn Sie nun den Client erneut generieren, werden Sie feststellen, dass er über die verbesserten Methodennamen verfügt: Wie Sie sehen, haben die Methodennamen jetzt den Tag und dann den Funktionsnamen, aber keine Informationen aus dem URL-Pfad und der HTTP-Operation. ### Vorab-Modifikation der OpenAPI-Spezifikation für den Client-Generator Der generierte Code enthält immer noch etwas **verdoppelte Information**. Wir wissen bereits, dass diese Methode mit den **Items** zusammenhängt, da sich dieses Wort in `ItemsService` befindet (vom Tag übernommen), aber wir haben auch immer noch den Tagnamen im Methodennamen vorangestellt. 😕 Wir werden das wahrscheinlich weiterhin für OpenAPI im Allgemeinen beibehalten wollen, da dadurch sichergestellt wird, dass die Operation-IDs **eindeutig** sind. Aber für den generierten Client könnten wir die OpenAPI-Operation-IDs direkt vor der Generierung der Clients **modifizieren**, um diese Methodennamen schöner und **sauberer** zu machen. Wir könnten das OpenAPI-JSON in eine Datei `openapi.json` herunterladen und dann mit einem Skript wie dem folgenden **den vorangestellten Tag entfernen**: === "Python" ```Python {!> ../../../docs_src/generate_clients/tutorial004.py!} ``` === "Node.js" ```Javascript {!> ../../../docs_src/generate_clients/tutorial004.js!} ``` Damit würden die Operation-IDs von Dingen wie `items-get_items` in `get_items` umbenannt, sodass der Client-Generator einfachere Methodennamen generieren kann. ### Einen TypeScript-Client mit der modifizierten OpenAPI generieren Da das Endergebnis nun in einer Datei `openapi.json` vorliegt, würden Sie die `package.json` ändern, um diese lokale Datei zu verwenden, zum Beispiel: ```JSON hl_lines="7" { "name": "frontend-app", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "generate-client": "openapi-ts --input ./openapi.json --output ./src/client --client axios" }, "author": "", "license": "", "devDependencies": { "@hey-api/openapi-ts": "^0.27.38", "typescript": "^4.6.2" } } ``` Nach der Generierung des neuen Clients hätten Sie nun **saubere Methodennamen** mit allen **Autovervollständigungen**, **Inline-Fehlerberichten**, usw.: ## Vorteile Wenn Sie die automatisch generierten Clients verwenden, erhalten Sie **automatische Codevervollständigung** für: * Methoden. * Request-Payloads im Body, Query-Parameter, usw. * Response-Payloads. Außerdem erhalten Sie für alles **Inline-Fehlerberichte**. Und wann immer Sie den Backend-Code aktualisieren und das Frontend **neu generieren**, stehen alle neuen *Pfadoperationen* als Methoden zur Verfügung, die alten werden entfernt und alle anderen Änderungen werden im generierten Code reflektiert. 🤓 Das bedeutet auch, dass, wenn sich etwas ändert, dies automatisch im Client-Code **reflektiert** wird. Und wenn Sie den Client **erstellen**, kommt es zu einer Fehlermeldung, wenn die verwendeten Daten **nicht übereinstimmen**. Sie würden also sehr früh im Entwicklungszyklus **viele Fehler erkennen**, anstatt darauf warten zu müssen, dass die Fehler Ihren Endbenutzern in der Produktion angezeigt werden, und dann zu versuchen, zu debuggen, wo das Problem liegt. ✨ fastapi-0.110.3/docs/de/docs/advanced/index.md000066400000000000000000000041201461403617600207560ustar00rootroot00000000000000# Handbuch für fortgeschrittene Benutzer ## Zusatzfunktionen Das Haupt-[Tutorial – Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank} sollte ausreichen, um Ihnen einen Überblick über alle Hauptfunktionen von **FastAPI** zu geben. In den nächsten Abschnitten sehen Sie weitere Optionen, Konfigurationen und zusätzliche Funktionen. !!! tip "Tipp" Die nächsten Abschnitte sind **nicht unbedingt „fortgeschritten“**. Und es ist möglich, dass für Ihren Anwendungsfall die Lösung in einem davon liegt. ## Lesen Sie zuerst das Tutorial Sie können immer noch die meisten Funktionen in **FastAPI** mit den Kenntnissen aus dem Haupt-[Tutorial – Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank} nutzen. Und in den nächsten Abschnitten wird davon ausgegangen, dass Sie es bereits gelesen haben und dass Sie diese Haupt-Ideen kennen. ## Externe Kurse Obwohl das [Tutorial – Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank} und dieses **Handbuch für fortgeschrittene Benutzer** als geführtes Tutorial (wie ein Buch) geschrieben sind und für Sie ausreichen sollten, um **FastAPI zu lernen**, möchten Sie sie vielleicht durch zusätzliche Kurse ergänzen. Oder Sie belegen einfach lieber andere Kurse, weil diese besser zu Ihrem Lernstil passen. Einige Kursanbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#den-autor-sponsern){.internal-link target=_blank} ✨, dies gewährleistet die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ökosystem**. Und es zeigt deren wahres Engagement für FastAPI und seine **Gemeinschaft** (Sie), da diese Ihnen nicht nur eine **gute Lernerfahrung** bieten möchten, sondern auch sicherstellen möchten, dass Sie über ein **gutes und gesundes Framework verfügen **, FastAPI. 🙇 Vielleicht möchten Sie ihre Kurse ausprobieren: * Talk Python Training * Test-Driven Development fastapi-0.110.3/docs/de/docs/advanced/middleware.md000066400000000000000000000106771461403617600220020ustar00rootroot00000000000000# Fortgeschrittene Middleware Im Haupttutorial haben Sie gelesen, wie Sie Ihrer Anwendung [benutzerdefinierte Middleware](../tutorial/middleware.md){.internal-link target=_blank} hinzufügen können. Und dann auch, wie man [CORS mittels der `CORSMiddleware`](../tutorial/cors.md){.internal-link target=_blank} handhabt. In diesem Abschnitt werden wir sehen, wie man andere Middlewares verwendet. ## ASGI-Middleware hinzufügen Da **FastAPI** auf Starlette basiert und die ASGI-Spezifikation implementiert, können Sie jede ASGI-Middleware verwenden. Eine Middleware muss nicht speziell für FastAPI oder Starlette gemacht sein, um zu funktionieren, solange sie der ASGI-Spezifikation genügt. Im Allgemeinen handelt es sich bei ASGI-Middleware um Klassen, die als erstes Argument eine ASGI-Anwendung erwarten. In der Dokumentation für ASGI-Middlewares von Drittanbietern wird Ihnen wahrscheinlich gesagt, etwa Folgendes zu tun: ```Python from unicorn import UnicornMiddleware app = SomeASGIApp() new_app = UnicornMiddleware(app, some_config="rainbow") ``` Aber FastAPI (eigentlich Starlette) bietet eine einfachere Möglichkeit, welche sicherstellt, dass die internen Middlewares zur Behandlung von Serverfehlern und benutzerdefinierten Exceptionhandlern ordnungsgemäß funktionieren. Dazu verwenden Sie `app.add_middleware()` (wie schon im Beispiel für CORS gesehen). ```Python from fastapi import FastAPI from unicorn import UnicornMiddleware app = FastAPI() app.add_middleware(UnicornMiddleware, some_config="rainbow") ``` `app.add_middleware()` empfängt eine Middleware-Klasse als erstes Argument und dann alle weiteren Argumente, die an die Middleware übergeben werden sollen. ## Integrierte Middleware **FastAPI** enthält mehrere Middlewares für gängige Anwendungsfälle. Wir werden als Nächstes sehen, wie man sie verwendet. !!! note "Technische Details" Für die nächsten Beispiele könnten Sie auch `from starlette.middleware.something import SomethingMiddleware` verwenden. **FastAPI** bietet mehrere Middlewares via `fastapi.middleware` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Middlewares kommen aber direkt von Starlette. ## `HTTPSRedirectMiddleware` Erzwingt, dass alle eingehenden Requests entweder `https` oder `wss` sein müssen. Alle eingehenden Requests an `http` oder `ws` werden stattdessen an das sichere Schema umgeleitet. ```Python hl_lines="2 6" {!../../../docs_src/advanced_middleware/tutorial001.py!} ``` ## `TrustedHostMiddleware` Erzwingt, dass alle eingehenden Requests einen korrekt gesetzten `Host`-Header haben, um sich vor HTTP-Host-Header-Angriffen zu schützen. ```Python hl_lines="2 6-8" {!../../../docs_src/advanced_middleware/tutorial002.py!} ``` Die folgenden Argumente werden unterstützt: * `allowed_hosts` – Eine Liste von Domain-Namen, die als Hostnamen zulässig sein sollten. Wildcard-Domains wie `*.example.com` werden unterstützt, um Subdomains zu matchen. Um jeden Hostnamen zu erlauben, verwenden Sie entweder `allowed_hosts=["*"]` oder lassen Sie diese Middleware weg. Wenn ein eingehender Request nicht korrekt validiert wird, wird eine „400“-Response gesendet. ## `GZipMiddleware` Verarbeitet GZip-Responses für alle Requests, die `"gzip"` im `Accept-Encoding`-Header enthalten. Diese Middleware verarbeitet sowohl Standard- als auch Streaming-Responses. ```Python hl_lines="2 6" {!../../../docs_src/advanced_middleware/tutorial003.py!} ``` Die folgenden Argumente werden unterstützt: * `minimum_size` – Antworten, die kleiner als diese Mindestgröße in Bytes sind, nicht per GZip komprimieren. Der Defaultwert ist `500`. ## Andere Middlewares Es gibt viele andere ASGI-Middlewares. Zum Beispiel: * Sentry * Uvicorns `ProxyHeadersMiddleware` * MessagePack Um mehr über weitere verfügbare Middlewares herauszufinden, besuchen Sie Starlettes Middleware-Dokumentation und die ASGI Awesome List. fastapi-0.110.3/docs/de/docs/advanced/openapi-callbacks.md000066400000000000000000000214741461403617600232320ustar00rootroot00000000000000# OpenAPI-Callbacks Sie könnten eine API mit einer *Pfadoperation* erstellen, die einen Request an eine *externe API* auslösen könnte, welche von jemand anderem erstellt wurde (wahrscheinlich derselbe Entwickler, der Ihre API *verwenden* würde). Der Vorgang, der stattfindet, wenn Ihre API-Anwendung die *externe API* aufruft, wird als „Callback“ („Rückruf“) bezeichnet. Denn die Software, die der externe Entwickler geschrieben hat, sendet einen Request an Ihre API und dann *ruft Ihre API zurück* (*calls back*) und sendet einen Request an eine *externe API* (die wahrscheinlich vom selben Entwickler erstellt wurde). In diesem Fall möchten Sie möglicherweise dokumentieren, wie diese externe API aussehen *sollte*. Welche *Pfadoperation* sie haben sollte, welchen Body sie erwarten sollte, welche Response sie zurückgeben sollte, usw. ## Eine Anwendung mit Callbacks Sehen wir uns das alles anhand eines Beispiels an. Stellen Sie sich vor, Sie entwickeln eine Anwendung, mit der Sie Rechnungen erstellen können. Diese Rechnungen haben eine `id`, einen optionalen `title`, einen `customer` (Kunde) und ein `total` (Gesamtsumme). Der Benutzer Ihrer API (ein externer Entwickler) erstellt mit einem POST-Request eine Rechnung in Ihrer API. Dann wird Ihre API (beispielsweise): * die Rechnung an einen Kunden des externen Entwicklers senden. * das Geld einsammeln. * eine Benachrichtigung an den API-Benutzer (den externen Entwickler) zurücksenden. * Dies erfolgt durch Senden eines POST-Requests (von *Ihrer API*) an eine *externe API*, die von diesem externen Entwickler bereitgestellt wird (das ist der „Callback“). ## Die normale **FastAPI**-Anwendung Sehen wir uns zunächst an, wie die normale API-Anwendung aussehen würde, bevor wir den Callback hinzufügen. Sie verfügt über eine *Pfadoperation*, die einen `Invoice`-Body empfängt, und einen Query-Parameter `callback_url`, der die URL für den Callback enthält. Dieser Teil ist ziemlich normal, der größte Teil des Codes ist Ihnen wahrscheinlich bereits bekannt: ```Python hl_lines="9-13 36-53" {!../../../docs_src/openapi_callbacks/tutorial001.py!} ``` !!! tip "Tipp" Der Query-Parameter `callback_url` verwendet einen Pydantic-Url-Typ. Das einzig Neue ist `callbacks=invoices_callback_router.routes` als Argument für den *Pfadoperation-Dekorator*. Wir werden als Nächstes sehen, was das ist. ## Dokumentation des Callbacks Der tatsächliche Callback-Code hängt stark von Ihrer eigenen API-Anwendung ab. Und er wird wahrscheinlich von Anwendung zu Anwendung sehr unterschiedlich sein. Es könnten nur eine oder zwei Codezeilen sein, wie zum Beispiel: ```Python callback_url = "https://example.com/api/v1/invoices/events/" httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) ``` Der möglicherweise wichtigste Teil des Callbacks besteht jedoch darin, sicherzustellen, dass Ihr API-Benutzer (der externe Entwickler) die *externe API* gemäß den Daten, die *Ihre API* im Requestbody des Callbacks senden wird, korrekt implementiert, usw. Als Nächstes fügen wir den Code hinzu, um zu dokumentieren, wie diese *externe API* aussehen sollte, um den Callback von *Ihrer API* zu empfangen. Diese Dokumentation wird in der Swagger-Oberfläche unter `/docs` in Ihrer API angezeigt und zeigt externen Entwicklern, wie diese die *externe API* erstellen sollten. In diesem Beispiel wird nicht der Callback selbst implementiert (das könnte nur eine Codezeile sein), sondern nur der Dokumentationsteil. !!! tip "Tipp" Der eigentliche Callback ist nur ein HTTP-Request. Wenn Sie den Callback selbst implementieren, können Sie beispielsweise HTTPX oder Requests verwenden. ## Schreiben des Codes, der den Callback dokumentiert Dieser Code wird nicht in Ihrer Anwendung ausgeführt, wir benötigen ihn nur, um zu *dokumentieren*, wie diese *externe API* aussehen soll. Sie wissen jedoch bereits, wie Sie mit **FastAPI** ganz einfach eine automatische Dokumentation für eine API erstellen. Daher werden wir dasselbe Wissen nutzen, um zu dokumentieren, wie die *externe API* aussehen sollte ... indem wir die *Pfadoperation(en)* erstellen, welche die externe API implementieren soll (die, welche Ihre API aufruft). !!! tip "Tipp" Wenn Sie den Code zum Dokumentieren eines Callbacks schreiben, kann es hilfreich sein, sich vorzustellen, dass Sie dieser *externe Entwickler* sind. Und dass Sie derzeit die *externe API* implementieren, nicht *Ihre API*. Wenn Sie diese Sichtweise (des *externen Entwicklers*) vorübergehend übernehmen, wird es offensichtlicher, wo die Parameter, das Pydantic-Modell für den Body, die Response, usw. für diese *externe API* hingehören. ### Einen Callback-`APIRouter` erstellen Erstellen Sie zunächst einen neuen `APIRouter`, der einen oder mehrere Callbacks enthält. ```Python hl_lines="3 25" {!../../../docs_src/openapi_callbacks/tutorial001.py!} ``` ### Die Callback-*Pfadoperation* erstellen Um die Callback-*Pfadoperation* zu erstellen, verwenden Sie denselben `APIRouter`, den Sie oben erstellt haben. Sie sollte wie eine normale FastAPI-*Pfadoperation* aussehen: * Sie sollte wahrscheinlich eine Deklaration des Bodys enthalten, die sie erhalten soll, z. B. `body: InvoiceEvent`. * Und sie könnte auch eine Deklaration der Response enthalten, die zurückgegeben werden soll, z. B. `response_model=InvoiceEventReceived`. ```Python hl_lines="16-18 21-22 28-32" {!../../../docs_src/openapi_callbacks/tutorial001.py!} ``` Es gibt zwei Hauptunterschiede zu einer normalen *Pfadoperation*: * Es muss kein tatsächlicher Code vorhanden sein, da Ihre Anwendung diesen Code niemals aufruft. Sie wird nur zur Dokumentation der *externen API* verwendet. Die Funktion könnte also einfach `pass` enthalten. * Der *Pfad* kann einen OpenAPI-3-Ausdruck enthalten (mehr dazu weiter unten), wo er Variablen mit Parametern und Teilen des ursprünglichen Requests verwenden kann, der an *Ihre API* gesendet wurde. ### Der Callback-Pfadausdruck Der Callback-*Pfad* kann einen OpenAPI-3-Ausdruck enthalten, welcher Teile des ursprünglichen Requests enthalten kann, der an *Ihre API* gesendet wurde. In diesem Fall ist es der `str`: ```Python "{$callback_url}/invoices/{$request.body.id}" ``` Wenn Ihr API-Benutzer (der externe Entwickler) also einen Request an *Ihre API* sendet, via: ``` https://yourapi.com/invoices/?callback_url=https://www.external.org/events ``` mit einem JSON-Körper: ```JSON { "id": "2expen51ve", "customer": "Mr. Richie Rich", "total": "9999" } ``` dann verarbeitet *Ihre API* die Rechnung und sendet irgendwann später einen Callback-Request an die `callback_url` (die *externe API*): ``` https://www.external.org/events/invoices/2expen51ve ``` mit einem JSON-Body, der etwa Folgendes enthält: ```JSON { "description": "Payment celebration", "paid": true } ``` und sie würde eine Response von dieser *externen API* mit einem JSON-Body wie dem folgenden erwarten: ```JSON { "ok": true } ``` !!! tip "Tipp" Beachten Sie, dass die verwendete Callback-URL die URL enthält, die als Query-Parameter in `callback_url` (`https://www.external.org/events`) empfangen wurde, und auch die Rechnungs-`id` aus dem JSON-Body (`2expen51ve`). ### Den Callback-Router hinzufügen An diesem Punkt haben Sie die benötigte(n) *Callback-Pfadoperation(en)* (diejenige(n), die der *externe Entwickler* in der *externen API* implementieren sollte) im Callback-Router, den Sie oben erstellt haben. Verwenden Sie nun den Parameter `callbacks` im *Pfadoperation-Dekorator Ihrer API*, um das Attribut `.routes` (das ist eigentlich nur eine `list`e von Routen/*Pfadoperationen*) dieses Callback-Routers zu übergeben: ```Python hl_lines="35" {!../../../docs_src/openapi_callbacks/tutorial001.py!} ``` !!! tip "Tipp" Beachten Sie, dass Sie nicht den Router selbst (`invoices_callback_router`) an `callback=` übergeben, sondern das Attribut `.routes`, wie in `invoices_callback_router.routes`. ### Es in der Dokumentation ansehen Jetzt können Sie Ihre Anwendung mit Uvicorn starten und auf http://127.0.0.1:8000/docs gehen. Sie sehen Ihre Dokumentation, einschließlich eines Abschnitts „Callbacks“ für Ihre *Pfadoperation*, der zeigt, wie die *externe API* aussehen sollte: fastapi-0.110.3/docs/de/docs/advanced/openapi-webhooks.md000066400000000000000000000064361461403617600231350ustar00rootroot00000000000000# OpenAPI-Webhooks Es gibt Fälle, in denen Sie Ihren API-Benutzern mitteilen möchten, dass Ihre Anwendung mit einigen Daten *deren* Anwendung aufrufen (ein Request senden) könnte, normalerweise um über ein bestimmtes **Event** zu **benachrichtigen**. Das bedeutet, dass anstelle des normalen Prozesses, bei dem Benutzer Requests an Ihre API senden, **Ihre API** (oder Ihre Anwendung) **Requests an deren System** (an deren API, deren Anwendung) senden könnte. Das wird normalerweise als **Webhook** bezeichnet. ## Webhooks-Schritte Der Prozess besteht normalerweise darin, dass **Sie in Ihrem Code definieren**, welche Nachricht Sie senden möchten, den **Body des Requests**. Sie definieren auch auf irgendeine Weise, zu welchen **Momenten** Ihre Anwendung diese Requests oder Events sendet. Und **Ihre Benutzer** definieren auf irgendeine Weise (zum Beispiel irgendwo in einem Web-Dashboard) die **URL**, an die Ihre Anwendung diese Requests senden soll. Die gesamte **Logik** zur Registrierung der URLs für Webhooks und der Code zum tatsächlichen Senden dieser Requests liegt bei Ihnen. Sie schreiben es so, wie Sie möchten, in **Ihrem eigenen Code**. ## Webhooks mit **FastAPI** und OpenAPI dokumentieren Mit **FastAPI** können Sie mithilfe von OpenAPI die Namen dieser Webhooks, die Arten von HTTP-Operationen, die Ihre Anwendung senden kann (z. B. `POST`, `PUT`, usw.) und die Request**bodys** definieren, die Ihre Anwendung senden würde. Dies kann es Ihren Benutzern viel einfacher machen, **deren APIs zu implementieren**, um Ihre **Webhook**-Requests zu empfangen. Möglicherweise können diese sogar einen Teil des eigenem API-Codes automatisch generieren. !!! info Webhooks sind in OpenAPI 3.1.0 und höher verfügbar und werden von FastAPI `0.99.0` und höher unterstützt. ## Eine Anwendung mit Webhooks Wenn Sie eine **FastAPI**-Anwendung erstellen, gibt es ein `webhooks`-Attribut, mit dem Sie *Webhooks* definieren können, genauso wie Sie *Pfadoperationen* definieren würden, zum Beispiel mit `@app.webhooks.post()`. ```Python hl_lines="9-13 36-53" {!../../../docs_src/openapi_webhooks/tutorial001.py!} ``` Die von Ihnen definierten Webhooks landen im **OpenAPI**-Schema und der automatischen **Dokumentations-Oberfläche**. !!! info Das `app.webhooks`-Objekt ist eigentlich nur ein `APIRouter`, derselbe Typ, den Sie verwenden würden, wenn Sie Ihre Anwendung mit mehreren Dateien strukturieren. Beachten Sie, dass Sie bei Webhooks tatsächlich keinen *Pfad* (wie `/items/`) deklarieren, sondern dass der Text, den Sie dort übergeben, lediglich eine **Kennzeichnung** des Webhooks (der Name des Events) ist. Zum Beispiel ist in `@app.webhooks.post("new-subscription")` der Webhook-Name `new-subscription`. Das liegt daran, dass erwartet wird, dass **Ihre Benutzer** den tatsächlichen **URL-Pfad**, an dem diese den Webhook-Request empfangen möchten, auf andere Weise definieren (z. B. über ein Web-Dashboard). ### Es in der Dokumentation ansehen Jetzt können Sie Ihre Anwendung mit Uvicorn starten und auf http://127.0.0.1:8000/docs gehen. Sie werden sehen, dass Ihre Dokumentation die normalen *Pfadoperationen* und jetzt auch einige **Webhooks** enthält: fastapi-0.110.3/docs/de/docs/advanced/path-operation-advanced-configuration.md000066400000000000000000000210331461403617600272130ustar00rootroot00000000000000# Fortgeschrittene Konfiguration der Pfadoperation ## OpenAPI operationId !!! warning "Achtung" Wenn Sie kein „Experte“ für OpenAPI sind, brauchen Sie dies wahrscheinlich nicht. Mit dem Parameter `operation_id` können Sie die OpenAPI `operationId` festlegen, die in Ihrer *Pfadoperation* verwendet werden soll. Sie müssten sicherstellen, dass sie für jede Operation eindeutig ist. ```Python hl_lines="6" {!../../../docs_src/path_operation_advanced_configuration/tutorial001.py!} ``` ### Verwendung des Namens der *Pfadoperation-Funktion* als operationId Wenn Sie die Funktionsnamen Ihrer API als `operationId`s verwenden möchten, können Sie über alle iterieren und die `operation_id` jeder *Pfadoperation* mit deren `APIRoute.name` überschreiben. Sie sollten dies tun, nachdem Sie alle Ihre *Pfadoperationen* hinzugefügt haben. ```Python hl_lines="2 12-21 24" {!../../../docs_src/path_operation_advanced_configuration/tutorial002.py!} ``` !!! tip "Tipp" Wenn Sie `app.openapi()` manuell aufrufen, sollten Sie vorher die `operationId`s aktualisiert haben. !!! warning "Achtung" Wenn Sie dies tun, müssen Sie sicherstellen, dass jede Ihrer *Pfadoperation-Funktionen* einen eindeutigen Namen hat. Auch wenn diese sich in unterschiedlichen Modulen (Python-Dateien) befinden. ## Von OpenAPI ausschließen Um eine *Pfadoperation* aus dem generierten OpenAPI-Schema (und damit aus den automatischen Dokumentationssystemen) auszuschließen, verwenden Sie den Parameter `include_in_schema` und setzen Sie ihn auf `False`: ```Python hl_lines="6" {!../../../docs_src/path_operation_advanced_configuration/tutorial003.py!} ``` ## Fortgeschrittene Beschreibung mittels Docstring Sie können die verwendeten Zeilen aus dem Docstring einer *Pfadoperation-Funktion* einschränken, die für OpenAPI verwendet werden. Das Hinzufügen eines `\f` (ein maskiertes „Form Feed“-Zeichen) führt dazu, dass **FastAPI** die für OpenAPI verwendete Ausgabe an dieser Stelle abschneidet. Sie wird nicht in der Dokumentation angezeigt, aber andere Tools (z. B. Sphinx) können den Rest verwenden. ```Python hl_lines="19-29" {!../../../docs_src/path_operation_advanced_configuration/tutorial004.py!} ``` ## Zusätzliche Responses Sie haben wahrscheinlich gesehen, wie man das `response_model` und den `status_code` für eine *Pfadoperation* deklariert. Das definiert die Metadaten der Haupt-Response einer *Pfadoperation*. Sie können auch zusätzliche Responses mit deren Modellen, Statuscodes usw. deklarieren. Es gibt hier in der Dokumentation ein ganzes Kapitel darüber, Sie können es unter [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank} lesen. ## OpenAPI-Extra Wenn Sie in Ihrer Anwendung eine *Pfadoperation* deklarieren, generiert **FastAPI** automatisch die relevanten Metadaten dieser *Pfadoperation*, die in das OpenAPI-Schema aufgenommen werden sollen. !!! note "Technische Details" In der OpenAPI-Spezifikation wird das Operationsobjekt genannt. Es hat alle Informationen zur *Pfadoperation* und wird zur Erstellung der automatischen Dokumentation verwendet. Es enthält `tags`, `parameters`, `requestBody`, `responses`, usw. Dieses *Pfadoperation*-spezifische OpenAPI-Schema wird normalerweise automatisch von **FastAPI** generiert, Sie können es aber auch erweitern. !!! tip "Tipp" Dies ist ein Low-Level Erweiterungspunkt. Wenn Sie nur zusätzliche Responses deklarieren müssen, können Sie dies bequemer mit [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank} tun. Sie können das OpenAPI-Schema für eine *Pfadoperation* erweitern, indem Sie den Parameter `openapi_extra` verwenden. ### OpenAPI-Erweiterungen Dieses `openapi_extra` kann beispielsweise hilfreich sein, um OpenAPI-Erweiterungen zu deklarieren: ```Python hl_lines="6" {!../../../docs_src/path_operation_advanced_configuration/tutorial005.py!} ``` Wenn Sie die automatische API-Dokumentation öffnen, wird Ihre Erweiterung am Ende der spezifischen *Pfadoperation* angezeigt. Und wenn Sie die resultierende OpenAPI sehen (unter `/openapi.json` in Ihrer API), sehen Sie Ihre Erweiterung auch als Teil der spezifischen *Pfadoperation*: ```JSON hl_lines="22" { "openapi": "3.1.0", "info": { "title": "FastAPI", "version": "0.1.0" }, "paths": { "/items/": { "get": { "summary": "Read Items", "operationId": "read_items_items__get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } } }, "x-aperture-labs-portal": "blue" } } } } ``` ### Benutzerdefiniertes OpenAPI-*Pfadoperation*-Schema Das Dictionary in `openapi_extra` wird mit dem automatisch generierten OpenAPI-Schema für die *Pfadoperation* zusammengeführt (mittels Deep Merge). Sie können dem automatisch generierten Schema also zusätzliche Daten hinzufügen. Sie könnten sich beispielsweise dafür entscheiden, den Request mit Ihrem eigenen Code zu lesen und zu validieren, ohne die automatischen Funktionen von FastAPI mit Pydantic zu verwenden, aber Sie könnten den Request trotzdem im OpenAPI-Schema definieren wollen. Das könnte man mit `openapi_extra` machen: ```Python hl_lines="20-37 39-40" {!../../../docs_src/path_operation_advanced_configuration/tutorial006.py!} ``` In diesem Beispiel haben wir kein Pydantic-Modell deklariert. Tatsächlich wird der Requestbody nicht einmal als JSON geparst, sondern direkt als `bytes` gelesen und die Funktion `magic_data_reader ()` wäre dafür verantwortlich, ihn in irgendeiner Weise zu parsen. Dennoch können wir das zu erwartende Schema für den Requestbody deklarieren. ### Benutzerdefinierter OpenAPI-Content-Type Mit demselben Trick könnten Sie ein Pydantic-Modell verwenden, um das JSON-Schema zu definieren, das dann im benutzerdefinierten Abschnitt des OpenAPI-Schemas für die *Pfadoperation* enthalten ist. Und Sie könnten dies auch tun, wenn der Datentyp in der Anfrage nicht JSON ist. In der folgenden Anwendung verwenden wir beispielsweise weder die integrierte Funktionalität von FastAPI zum Extrahieren des JSON-Schemas aus Pydantic-Modellen noch die automatische Validierung für JSON. Tatsächlich deklarieren wir den Request-Content-Type als YAML und nicht als JSON: === "Pydantic v2" ```Python hl_lines="17-22 24" {!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!} ``` === "Pydantic v1" ```Python hl_lines="17-22 24" {!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!} ``` !!! info In Pydantic Version 1 hieß die Methode zum Abrufen des JSON-Schemas für ein Modell `Item.schema()`, in Pydantic Version 2 heißt die Methode `Item.model_json_schema()`. Obwohl wir nicht die standardmäßig integrierte Funktionalität verwenden, verwenden wir dennoch ein Pydantic-Modell, um das JSON-Schema für die Daten, die wir in YAML empfangen möchten, manuell zu generieren. Dann verwenden wir den Request direkt und extrahieren den Body als `bytes`. Das bedeutet, dass FastAPI nicht einmal versucht, den Request-Payload als JSON zu parsen. Und dann parsen wir in unserem Code diesen YAML-Inhalt direkt und verwenden dann wieder dasselbe Pydantic-Modell, um den YAML-Inhalt zu validieren: === "Pydantic v2" ```Python hl_lines="26-33" {!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!} ``` === "Pydantic v1" ```Python hl_lines="26-33" {!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!} ``` !!! info In Pydantic Version 1 war die Methode zum Parsen und Validieren eines Objekts `Item.parse_obj()`, in Pydantic Version 2 heißt die Methode `Item.model_validate()`. !!! tip "Tipp" Hier verwenden wir dasselbe Pydantic-Modell wieder. Aber genauso hätten wir es auch auf andere Weise validieren können. fastapi-0.110.3/docs/de/docs/advanced/response-change-status-code.md000066400000000000000000000035311461403617600251660ustar00rootroot00000000000000# Response – Statuscode ändern Sie haben wahrscheinlich schon vorher gelesen, dass Sie einen Standard-[Response-Statuscode](../tutorial/response-status-code.md){.internal-link target=_blank} festlegen können. In manchen Fällen müssen Sie jedoch einen anderen als den Standard-Statuscode zurückgeben. ## Anwendungsfall Stellen Sie sich zum Beispiel vor, Sie möchten standardmäßig den HTTP-Statuscode „OK“ `200` zurückgeben. Wenn die Daten jedoch nicht vorhanden waren, möchten Sie diese erstellen und den HTTP-Statuscode „CREATED“ `201` zurückgeben. Sie möchten aber dennoch in der Lage sein, die von Ihnen zurückgegebenen Daten mit einem `response_model` zu filtern und zu konvertieren. In diesen Fällen können Sie einen `Response`-Parameter verwenden. ## Einen `Response`-Parameter verwenden Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion* deklarieren (wie Sie es auch für Cookies und Header tun können). Anschließend können Sie den `status_code` in diesem *vorübergehenden* Response-Objekt festlegen. ```Python hl_lines="1 9 12" {!../../../docs_src/response_change_status_code/tutorial001.py!} ``` Und dann können Sie wie gewohnt jedes benötigte Objekt zurückgeben (ein `dict`, ein Datenbankmodell usw.). Und wenn Sie ein `response_model` deklariert haben, wird es weiterhin zum Filtern und Konvertieren des von Ihnen zurückgegebenen Objekts verwendet. **FastAPI** verwendet diese *vorübergehende* Response, um den Statuscode (auch Cookies und Header) zu extrahieren und fügt diese in die endgültige Response ein, die den von Ihnen zurückgegebenen Wert enthält, gefiltert nach einem beliebigen `response_model`. Sie können den Parameter `Response` auch in Abhängigkeiten deklarieren und den Statuscode darin festlegen. Bedenken Sie jedoch, dass der gewinnt, welcher zuletzt gesetzt wird. fastapi-0.110.3/docs/de/docs/advanced/response-cookies.md000066400000000000000000000050401461403617600231410ustar00rootroot00000000000000# Response-Cookies ## Einen `Response`-Parameter verwenden Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion* deklarieren. Und dann können Sie Cookies in diesem *vorübergehenden* Response-Objekt setzen. ```Python hl_lines="1 8-9" {!../../../docs_src/response_cookies/tutorial002.py!} ``` Anschließend können Sie wie gewohnt jedes gewünschte Objekt zurückgeben (ein `dict`, ein Datenbankmodell, usw.). Und wenn Sie ein `response_model` deklariert haben, wird es weiterhin zum Filtern und Konvertieren des von Ihnen zurückgegebenen Objekts verwendet. **FastAPI** verwendet diese *vorübergehende* Response, um die Cookies (auch Header und Statuscode) zu extrahieren und fügt diese in die endgültige Response ein, die den von Ihnen zurückgegebenen Wert enthält, gefiltert nach einem beliebigen `response_model`. Sie können den `Response`-Parameter auch in Abhängigkeiten deklarieren und darin Cookies (und Header) setzen. ## Eine `Response` direkt zurückgeben Sie können Cookies auch erstellen, wenn Sie eine `Response` direkt in Ihrem Code zurückgeben. Dazu können Sie eine Response erstellen, wie unter [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} beschrieben. Setzen Sie dann Cookies darin und geben Sie sie dann zurück: ```Python hl_lines="10-12" {!../../../docs_src/response_cookies/tutorial001.py!} ``` !!! tip "Tipp" Beachten Sie, dass, wenn Sie eine Response direkt zurückgeben, anstatt den `Response`-Parameter zu verwenden, FastAPI diese direkt zurückgibt. Sie müssen also sicherstellen, dass Ihre Daten vom richtigen Typ sind. Z. B. sollten diese mit JSON kompatibel sein, wenn Sie eine `JSONResponse` zurückgeben. Und auch, dass Sie keine Daten senden, die durch ein `response_model` hätten gefiltert werden sollen. ### Mehr Informationen !!! note "Technische Details" Sie können auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden. **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette. Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird, stellt **FastAPI** diese auch unter `fastapi.Response` bereit. Um alle verfügbaren Parameter und Optionen anzuzeigen, sehen Sie sich deren Dokumentation in Starlette an. fastapi-0.110.3/docs/de/docs/advanced/response-directly.md000066400000000000000000000070541461403617600233330ustar00rootroot00000000000000# Eine Response direkt zurückgeben Wenn Sie eine **FastAPI** *Pfadoperation* erstellen, können Sie normalerweise beliebige Daten davon zurückgeben: ein `dict`, eine `list`e, ein Pydantic-Modell, ein Datenbankmodell, usw. Standardmäßig konvertiert **FastAPI** diesen Rückgabewert automatisch nach JSON, mithilfe des `jsonable_encoder`, der in [JSON-kompatibler Encoder](../tutorial/encoder.md){.internal-link target=_blank} erläutert wird. Dann würde es hinter den Kulissen diese JSON-kompatiblen Daten (z. B. ein `dict`) in eine `JSONResponse` einfügen, die zum Senden der Response an den Client verwendet würde. Sie können jedoch direkt eine `JSONResponse` von Ihren *Pfadoperationen* zurückgeben. Das kann beispielsweise nützlich sein, um benutzerdefinierte Header oder Cookies zurückzugeben. ## Eine `Response` zurückgeben Tatsächlich können Sie jede `Response` oder jede Unterklasse davon zurückgeben. !!! tip "Tipp" `JSONResponse` selbst ist eine Unterklasse von `Response`. Und wenn Sie eine `Response` zurückgeben, wird **FastAPI** diese direkt weiterleiten. Es wird keine Datenkonvertierung mit Pydantic-Modellen durchführen, es wird den Inhalt nicht in irgendeinen Typ konvertieren, usw. Dadurch haben Sie viel Flexibilität. Sie können jeden Datentyp zurückgeben, jede Datendeklaration oder -validierung überschreiben, usw. ## Verwendung des `jsonable_encoder` in einer `Response` Da **FastAPI** keine Änderungen an einer von Ihnen zurückgegebenen `Response` vornimmt, müssen Sie sicherstellen, dass deren Inhalt dafür bereit ist. Sie können beispielsweise kein Pydantic-Modell in eine `JSONResponse` einfügen, ohne es zuvor in ein `dict` zu konvertieren, bei dem alle Datentypen (wie `datetime`, `UUID`, usw.) in JSON-kompatible Typen konvertiert wurden. In diesen Fällen können Sie den `jsonable_encoder` verwenden, um Ihre Daten zu konvertieren, bevor Sie sie an eine Response übergeben: ```Python hl_lines="6-7 21-22" {!../../../docs_src/response_directly/tutorial001.py!} ``` !!! note "Technische Details" Sie können auch `from starlette.responses import JSONResponse` verwenden. **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette. ## Eine benutzerdefinierte `Response` zurückgeben Das obige Beispiel zeigt alle Teile, die Sie benötigen, ist aber noch nicht sehr nützlich, da Sie das `item` einfach direkt hätten zurückgeben können, und **FastAPI** würde es für Sie in eine `JSONResponse` einfügen, es in ein `dict` konvertieren, usw. All das standardmäßig. Sehen wir uns nun an, wie Sie damit eine benutzerdefinierte Response zurückgeben können. Nehmen wir an, Sie möchten eine XML-Response zurückgeben. Sie könnten Ihren XML-Inhalt als String in eine `Response` einfügen und sie zurückgeben: ```Python hl_lines="1 18" {!../../../docs_src/response_directly/tutorial002.py!} ``` ## Anmerkungen Wenn Sie eine `Response` direkt zurücksenden, werden deren Daten weder validiert, konvertiert (serialisiert), noch automatisch dokumentiert. Sie können sie aber trotzdem wie unter [Zusätzliche Responses in OpenAPI](additional-responses.md){.internal-link target=_blank} beschrieben dokumentieren. In späteren Abschnitten erfahren Sie, wie Sie diese benutzerdefinierten `Response`s verwenden/deklarieren und gleichzeitig über automatische Datenkonvertierung, Dokumentation, usw. verfügen. fastapi-0.110.3/docs/de/docs/advanced/response-headers.md000066400000000000000000000051751461403617600231310ustar00rootroot00000000000000# Response-Header ## Verwenden Sie einen `Response`-Parameter Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion* deklarieren (wie Sie es auch für Cookies tun können). Und dann können Sie Header in diesem *vorübergehenden* Response-Objekt festlegen. ```Python hl_lines="1 7-8" {!../../../docs_src/response_headers/tutorial002.py!} ``` Anschließend können Sie wie gewohnt jedes gewünschte Objekt zurückgeben (ein `dict`, ein Datenbankmodell, usw.). Und wenn Sie ein `response_model` deklariert haben, wird es weiterhin zum Filtern und Konvertieren des von Ihnen zurückgegebenen Objekts verwendet. **FastAPI** verwendet diese *vorübergehende* Response, um die Header (auch Cookies und Statuscode) zu extrahieren und fügt diese in die endgültige Response ein, die den von Ihnen zurückgegebenen Wert enthält, gefiltert nach einem beliebigen `response_model`. Sie können den Parameter `Response` auch in Abhängigkeiten deklarieren und darin Header (und Cookies) festlegen. ## Eine `Response` direkt zurückgeben Sie können auch Header hinzufügen, wenn Sie eine `Response` direkt zurückgeben. Erstellen Sie eine Response wie in [Eine Response direkt zurückgeben](response-directly.md){.internal-link target=_blank} beschrieben und übergeben Sie die Header als zusätzlichen Parameter: ```Python hl_lines="10-12" {!../../../docs_src/response_headers/tutorial001.py!} ``` !!! note "Technische Details" Sie können auch `from starlette.responses import Response` oder `from starlette.responses import JSONResponse` verwenden. **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette. Und da die `Response` häufig zum Setzen von Headern und Cookies verwendet wird, stellt **FastAPI** diese auch unter `fastapi.Response` bereit. ## Benutzerdefinierte Header Beachten Sie, dass benutzerdefinierte proprietäre Header mittels des Präfix 'X-' hinzugefügt werden können. Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen können soll, müssen Sie diese zu Ihren CORS-Konfigurationen hinzufügen (weitere Informationen finden Sie unter [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), unter Verwendung des Parameters `expose_headers`, dokumentiert in Starlettes CORS-Dokumentation. fastapi-0.110.3/docs/de/docs/advanced/security/000077500000000000000000000000001461403617600211775ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/advanced/security/http-basic-auth.md000066400000000000000000000156051461403617600245250ustar00rootroot00000000000000# HTTP Basic Auth Für die einfachsten Fälle können Sie HTTP Basic Auth verwenden. Bei HTTP Basic Auth erwartet die Anwendung einen Header, der einen Benutzernamen und ein Passwort enthält. Wenn sie diesen nicht empfängt, gibt sie den HTTP-Error 401 „Unauthorized“ zurück. Und gibt einen Header `WWW-Authenticate` mit dem Wert `Basic` und einem optionalen `realm`-Parameter („Bereich“) zurück. Dadurch wird der Browser angewiesen, die integrierte Eingabeaufforderung für einen Benutzernamen und ein Passwort anzuzeigen. Wenn Sie dann den Benutzernamen und das Passwort eingeben, sendet der Browser diese automatisch im Header. ## Einfaches HTTP Basic Auth * Importieren Sie `HTTPBasic` und `HTTPBasicCredentials`. * Erstellen Sie mit `HTTPBasic` ein „`security`-Schema“. * Verwenden Sie dieses `security` mit einer Abhängigkeit in Ihrer *Pfadoperation*. * Diese gibt ein Objekt vom Typ `HTTPBasicCredentials` zurück: * Es enthält den gesendeten `username` und das gesendete `password`. === "Python 3.9+" ```Python hl_lines="4 8 12" {!> ../../../docs_src/security/tutorial006_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="2 7 11" {!> ../../../docs_src/security/tutorial006_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="2 6 10" {!> ../../../docs_src/security/tutorial006.py!} ``` Wenn Sie versuchen, die URL zum ersten Mal zu öffnen (oder in der Dokumentation auf den Button „Execute“ zu klicken), wird der Browser Sie nach Ihrem Benutzernamen und Passwort fragen: ## Den Benutzernamen überprüfen Hier ist ein vollständigeres Beispiel. Verwenden Sie eine Abhängigkeit, um zu überprüfen, ob Benutzername und Passwort korrekt sind. Verwenden Sie dazu das Python-Standardmodul `secrets`, um den Benutzernamen und das Passwort zu überprüfen. `secrets.compare_digest()` benötigt `bytes` oder einen `str`, welcher nur ASCII-Zeichen (solche der englischen Sprache) enthalten darf, das bedeutet, dass es nicht mit Zeichen wie `á`, wie in `Sebastián`, funktionieren würde. Um dies zu lösen, konvertieren wir zunächst den `username` und das `password` in UTF-8-codierte `bytes`. Dann können wir `secrets.compare_digest()` verwenden, um sicherzustellen, dass `credentials.username` `"stanleyjobson"` und `credentials.password` `"swordfish"` ist. === "Python 3.9+" ```Python hl_lines="1 12-24" {!> ../../../docs_src/security/tutorial007_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1 12-24" {!> ../../../docs_src/security/tutorial007_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="1 11-21" {!> ../../../docs_src/security/tutorial007.py!} ``` Dies wäre das gleiche wie: ```Python if not (credentials.username == "stanleyjobson") or not (credentials.password == "swordfish"): # Einen Error zurückgeben ... ``` Aber durch die Verwendung von `secrets.compare_digest()` ist dieser Code sicher vor einer Art von Angriffen, die „Timing-Angriffe“ genannt werden. ### Timing-Angriffe Aber was ist ein „Timing-Angriff“? Stellen wir uns vor, dass einige Angreifer versuchen, den Benutzernamen und das Passwort zu erraten. Und sie senden eine Anfrage mit dem Benutzernamen `johndoe` und dem Passwort `love123`. Dann würde der Python-Code in Ihrer Anwendung etwa so aussehen: ```Python if "johndoe" == "stanleyjobson" and "love123" == "swordfish": ... ``` Aber genau in dem Moment, in dem Python das erste `j` in `johndoe` mit dem ersten `s` in `stanleyjobson` vergleicht, gibt es `False` zurück, da es bereits weiß, dass diese beiden Strings nicht identisch sind, und denkt, „Es besteht keine Notwendigkeit, weitere Berechnungen mit dem Vergleich der restlichen Buchstaben zu verschwenden“. Und Ihre Anwendung wird zurückgeben „Incorrect username or password“. Doch dann versuchen es die Angreifer mit dem Benutzernamen `stanleyjobsox` und dem Passwort `love123`. Und Ihr Anwendungscode macht etwa Folgendes: ```Python if "stanleyjobsox" == "stanleyjobson" and "love123" == "swordfish": ... ``` Python muss das gesamte `stanleyjobso` in `stanleyjobsox` und `stanleyjobson` vergleichen, bevor es erkennt, dass beide Zeichenfolgen nicht gleich sind. Daher wird es einige zusätzliche Mikrosekunden dauern, bis die Antwort „Incorrect username or password“ erfolgt. #### Die Zeit zum Antworten hilft den Angreifern Wenn die Angreifer zu diesem Zeitpunkt feststellen, dass der Server einige Mikrosekunden länger braucht, um die Antwort „Incorrect username or password“ zu senden, wissen sie, dass sie _etwas_ richtig gemacht haben, einige der Anfangsbuchstaben waren richtig. Und dann können sie es noch einmal versuchen, wohl wissend, dass es wahrscheinlich eher etwas mit `stanleyjobsox` als mit `johndoe` zu tun hat. #### Ein „professioneller“ Angriff Natürlich würden die Angreifer das alles nicht von Hand versuchen, sondern ein Programm dafür schreiben, möglicherweise mit Tausenden oder Millionen Tests pro Sekunde. Und würden jeweils nur einen zusätzlichen richtigen Buchstaben erhalten. Aber so hätten die Angreifer in wenigen Minuten oder Stunden mit der „Hilfe“ unserer Anwendung den richtigen Benutzernamen und das richtige Passwort erraten, indem sie die Zeitspanne zur Hilfe nehmen, die diese zur Beantwortung benötigt. #### Das Problem beheben mittels `secrets.compare_digest()` Aber in unserem Code verwenden wir tatsächlich `secrets.compare_digest()`. Damit wird, kurz gesagt, der Vergleich von `stanleyjobsox` mit `stanleyjobson` genauso lange dauern wie der Vergleich von `johndoe` mit `stanleyjobson`. Und das Gleiche gilt für das Passwort. So ist Ihr Anwendungscode, dank der Verwendung von `secrets.compare_digest()`, vor dieser ganzen Klasse von Sicherheitsangriffen geschützt. ### Den Error zurückgeben Nachdem Sie festgestellt haben, dass die Anmeldeinformationen falsch sind, geben Sie eine `HTTPException` mit dem Statuscode 401 zurück (derselbe, der auch zurückgegeben wird, wenn keine Anmeldeinformationen angegeben werden) und fügen den Header `WWW-Authenticate` hinzu, damit der Browser die Anmeldeaufforderung erneut anzeigt: === "Python 3.9+" ```Python hl_lines="26-30" {!> ../../../docs_src/security/tutorial007_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="26-30" {!> ../../../docs_src/security/tutorial007_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="23-27" {!> ../../../docs_src/security/tutorial007.py!} ``` fastapi-0.110.3/docs/de/docs/advanced/security/index.md000066400000000000000000000014371461403617600226350ustar00rootroot00000000000000# Fortgeschrittene Sicherheit ## Zusatzfunktionen Neben den in [Tutorial – Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md){.internal-link target=_blank} behandelten Funktionen gibt es noch einige zusätzliche Funktionen zur Handhabung der Sicherheit. !!! tip "Tipp" Die nächsten Abschnitte sind **nicht unbedingt „fortgeschritten“**. Und es ist möglich, dass für Ihren Anwendungsfall die Lösung in einem davon liegt. ## Lesen Sie zuerst das Tutorial In den nächsten Abschnitten wird davon ausgegangen, dass Sie das Haupt-[Tutorial – Benutzerhandbuch: Sicherheit](../../tutorial/security/index.md){.internal-link target=_blank} bereits gelesen haben. Sie basieren alle auf den gleichen Konzepten, ermöglichen jedoch einige zusätzliche Funktionalitäten. fastapi-0.110.3/docs/de/docs/advanced/security/oauth2-scopes.md000066400000000000000000000554541461403617600242320ustar00rootroot00000000000000# OAuth2-Scopes Sie können OAuth2-Scopes direkt in **FastAPI** verwenden, sie sind nahtlos integriert. Das ermöglicht es Ihnen, ein feingranuliertes Berechtigungssystem nach dem OAuth2-Standard in Ihre OpenAPI-Anwendung (und deren API-Dokumentation) zu integrieren. OAuth2 mit Scopes ist der Mechanismus, der von vielen großen Authentifizierungsanbietern wie Facebook, Google, GitHub, Microsoft, Twitter usw. verwendet wird. Sie verwenden ihn, um Benutzern und Anwendungen spezifische Berechtigungen zu erteilen. Jedes Mal, wenn Sie sich mit Facebook, Google, GitHub, Microsoft oder Twitter anmelden („log in with“), verwendet die entsprechende Anwendung OAuth2 mit Scopes. In diesem Abschnitt erfahren Sie, wie Sie Authentifizierung und Autorisierung mit demselben OAuth2, mit Scopes in Ihrer **FastAPI**-Anwendung verwalten. !!! warning "Achtung" Dies ist ein mehr oder weniger fortgeschrittener Abschnitt. Wenn Sie gerade erst anfangen, können Sie ihn überspringen. Sie benötigen nicht unbedingt OAuth2-Scopes, und Sie können die Authentifizierung und Autorisierung handhaben wie Sie möchten. Aber OAuth2 mit Scopes kann bequem in Ihre API (mit OpenAPI) und deren API-Dokumentation integriert werden. Dennoch, verwenden Sie solche Scopes oder andere Sicherheits-/Autorisierungsanforderungen in Ihrem Code so wie Sie es möchten. In vielen Fällen kann OAuth2 mit Scopes ein Overkill sein. Aber wenn Sie wissen, dass Sie es brauchen oder neugierig sind, lesen Sie weiter. ## OAuth2-Scopes und OpenAPI Die OAuth2-Spezifikation definiert „Scopes“ als eine Liste von durch Leerzeichen getrennten Strings. Der Inhalt jedes dieser Strings kann ein beliebiges Format haben, sollte jedoch keine Leerzeichen enthalten. Diese Scopes stellen „Berechtigungen“ dar. In OpenAPI (z. B. der API-Dokumentation) können Sie „Sicherheitsschemas“ definieren. Wenn eines dieser Sicherheitsschemas OAuth2 verwendet, können Sie auch Scopes deklarieren und verwenden. Jeder „Scope“ ist nur ein String (ohne Leerzeichen). Er wird normalerweise verwendet, um bestimmte Sicherheitsberechtigungen zu deklarieren, zum Beispiel: * `users:read` oder `users:write` sind gängige Beispiele. * `instagram_basic` wird von Facebook / Instagram verwendet. * `https://www.googleapis.com/auth/drive` wird von Google verwendet. !!! info In OAuth2 ist ein „Scope“ nur ein String, der eine bestimmte erforderliche Berechtigung deklariert. Es spielt keine Rolle, ob er andere Zeichen wie `:` enthält oder ob es eine URL ist. Diese Details sind implementierungsspezifisch. Für OAuth2 sind es einfach nur Strings. ## Gesamtübersicht Sehen wir uns zunächst kurz die Teile an, die sich gegenüber den Beispielen im Haupt-**Tutorial – Benutzerhandbuch** für [OAuth2 mit Password (und Hashing), Bearer mit JWT-Tokens](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank} ändern. Diesmal verwenden wir OAuth2-Scopes: === "Python 3.10+" ```Python hl_lines="4 8 12 46 64 105 107-115 121-124 128-134 139 155" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="2 4 8 12 47 65 106 108-116 122-125 129-135 140 156" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="3 7 11 45 63 104 106-114 120-123 127-133 138 154" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155" {!> ../../../docs_src/security/tutorial005.py!} ``` Sehen wir uns diese Änderungen nun Schritt für Schritt an. ## OAuth2-Sicherheitsschema Die erste Änderung ist, dass wir jetzt das OAuth2-Sicherheitsschema mit zwei verfügbaren Scopes deklarieren: `me` und `items`. Der `scopes`-Parameter erhält ein `dict` mit jedem Scope als Schlüssel und dessen Beschreibung als Wert: === "Python 3.10+" ```Python hl_lines="62-65" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="62-65" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="63-66" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="61-64" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="62-65" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="62-65" {!> ../../../docs_src/security/tutorial005.py!} ``` Da wir diese Scopes jetzt deklarieren, werden sie in der API-Dokumentation angezeigt, wenn Sie sich einloggen/autorisieren. Und Sie können auswählen, auf welche Scopes Sie Zugriff haben möchten: `me` und `items`. Das ist derselbe Mechanismus, der verwendet wird, wenn Sie beim Anmelden mit Facebook, Google, GitHub, usw. Berechtigungen erteilen: ## JWT-Token mit Scopes Ändern Sie nun die Token-*Pfadoperation*, um die angeforderten Scopes zurückzugeben. Wir verwenden immer noch dasselbe `OAuth2PasswordRequestForm`. Es enthält eine Eigenschaft `scopes` mit einer `list`e von `str`s für jeden Scope, den es im Request erhalten hat. Und wir geben die Scopes als Teil des JWT-Tokens zurück. !!! danger "Gefahr" Der Einfachheit halber fügen wir hier die empfangenen Scopes direkt zum Token hinzu. Aus Sicherheitsgründen sollten Sie jedoch sicherstellen, dass Sie in Ihrer Anwendung nur die Scopes hinzufügen, die der Benutzer tatsächlich haben kann, oder die Sie vordefiniert haben. === "Python 3.10+" ```Python hl_lines="155" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="155" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="156" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="154" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="155" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="155" {!> ../../../docs_src/security/tutorial005.py!} ``` ## Scopes in *Pfadoperationen* und Abhängigkeiten deklarieren Jetzt deklarieren wir, dass die *Pfadoperation* für `/users/me/items/` den Scope `items` erfordert. Dazu importieren und verwenden wir `Security` von `fastapi`. Sie können `Security` verwenden, um Abhängigkeiten zu deklarieren (genau wie `Depends`), aber `Security` erhält auch einen Parameter `scopes` mit einer Liste von Scopes (Strings). In diesem Fall übergeben wir eine Abhängigkeitsfunktion `get_current_active_user` an `Security` (genauso wie wir es mit `Depends` tun würden). Wir übergeben aber auch eine `list`e von Scopes, in diesem Fall mit nur einem Scope: `items` (es könnten mehrere sein). Und die Abhängigkeitsfunktion `get_current_active_user` kann auch Unterabhängigkeiten deklarieren, nicht nur mit `Depends`, sondern auch mit `Security`. Ihre eigene Unterabhängigkeitsfunktion (`get_current_user`) und weitere Scope-Anforderungen deklarierend. In diesem Fall erfordert sie den Scope `me` (sie könnte mehr als einen Scope erfordern). !!! note "Hinweis" Sie müssen nicht unbedingt an verschiedenen Stellen verschiedene Scopes hinzufügen. Wir tun dies hier, um zu demonstrieren, wie **FastAPI** auf verschiedenen Ebenen deklarierte Scopes verarbeitet. === "Python 3.10+" ```Python hl_lines="4 139 170" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="4 139 170" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="4 140 171" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="3 138 167" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="4 139 168" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="4 139 168" {!> ../../../docs_src/security/tutorial005.py!} ``` !!! info "Technische Details" `Security` ist tatsächlich eine Unterklasse von `Depends` und hat nur noch einen zusätzlichen Parameter, den wir später kennenlernen werden. Durch die Verwendung von `Security` anstelle von `Depends` weiß **FastAPI** jedoch, dass es Sicherheits-Scopes deklarieren, intern verwenden und die API mit OpenAPI dokumentieren kann. Wenn Sie jedoch `Query`, `Path`, `Depends`, `Security` und andere von `fastapi` importieren, handelt es sich tatsächlich um Funktionen, die spezielle Klassen zurückgeben. ## `SecurityScopes` verwenden Aktualisieren Sie nun die Abhängigkeit `get_current_user`. Das ist diejenige, die von den oben genannten Abhängigkeiten verwendet wird. Hier verwenden wir dasselbe OAuth2-Schema, das wir zuvor erstellt haben, und deklarieren es als Abhängigkeit: `oauth2_scheme`. Da diese Abhängigkeitsfunktion selbst keine Scope-Anforderungen hat, können wir `Depends` mit `oauth2_scheme` verwenden. Wir müssen `Security` nicht verwenden, wenn wir keine Sicherheits-Scopes angeben müssen. Wir deklarieren auch einen speziellen Parameter vom Typ `SecurityScopes`, der aus `fastapi.security` importiert wird. Diese `SecurityScopes`-Klasse ähnelt `Request` (`Request` wurde verwendet, um das Request-Objekt direkt zu erhalten). === "Python 3.10+" ```Python hl_lines="8 105" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="8 105" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="8 106" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7 104" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="8 105" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="8 105" {!> ../../../docs_src/security/tutorial005.py!} ``` ## Die `scopes` verwenden Der Parameter `security_scopes` wird vom Typ `SecurityScopes` sein. Dieses verfügt über ein Attribut `scopes` mit einer Liste, die alle von ihm selbst benötigten Scopes enthält und ferner alle Abhängigkeiten, die dieses als Unterabhängigkeit verwenden. Sprich, alle „Dependanten“ ... das mag verwirrend klingen, wird aber später noch einmal erklärt. Das `security_scopes`-Objekt (der Klasse `SecurityScopes`) stellt außerdem ein `scope_str`-Attribut mit einem einzelnen String bereit, der die durch Leerzeichen getrennten Scopes enthält (den werden wir verwenden). Wir erstellen eine `HTTPException`, die wir später an mehreren Stellen wiederverwenden (`raise`n) können. In diese Exception fügen wir (falls vorhanden) die erforderlichen Scopes als durch Leerzeichen getrennten String ein (unter Verwendung von `scope_str`). Wir fügen diesen String mit den Scopes in den Header `WWW-Authenticate` ein (das ist Teil der Spezifikation). === "Python 3.10+" ```Python hl_lines="105 107-115" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="105 107-115" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="106 108-116" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="104 106-114" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="105 107-115" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="105 107-115" {!> ../../../docs_src/security/tutorial005.py!} ``` ## Den `username` und das Format der Daten überprüfen Wir verifizieren, dass wir einen `username` erhalten, und extrahieren die Scopes. Und dann validieren wir diese Daten mit dem Pydantic-Modell (wobei wir die `ValidationError`-Exception abfangen), und wenn wir beim Lesen des JWT-Tokens oder beim Validieren der Daten mit Pydantic einen Fehler erhalten, lösen wir die zuvor erstellte `HTTPException` aus. Dazu aktualisieren wir das Pydantic-Modell `TokenData` mit einem neuen Attribut `scopes`. Durch die Validierung der Daten mit Pydantic können wir sicherstellen, dass wir beispielsweise präzise eine `list`e von `str`s mit den Scopes und einen `str` mit dem `username` haben. Anstelle beispielsweise eines `dict`s oder etwas anderem, was später in der Anwendung zu Fehlern führen könnte und darum ein Sicherheitsrisiko darstellt. Wir verifizieren auch, dass wir einen Benutzer mit diesem Benutzernamen haben, und wenn nicht, lösen wir dieselbe Exception aus, die wir zuvor erstellt haben. === "Python 3.10+" ```Python hl_lines="46 116-127" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="46 116-127" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="47 117-128" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="45 115-126" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="46 116-127" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="46 116-127" {!> ../../../docs_src/security/tutorial005.py!} ``` ## Die `scopes` verifizieren Wir überprüfen nun, ob das empfangenen Token alle Scopes enthält, die von dieser Abhängigkeit und deren Verwendern (einschließlich *Pfadoperationen*) gefordert werden. Andernfalls lösen wir eine `HTTPException` aus. Hierzu verwenden wir `security_scopes.scopes`, das eine `list`e mit allen diesen Scopes als `str` enthält. === "Python 3.10+" ```Python hl_lines="128-134" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="128-134" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="129-135" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="127-133" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="128-134" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="128-134" {!> ../../../docs_src/security/tutorial005.py!} ``` ## Abhängigkeitsbaum und Scopes Sehen wir uns diesen Abhängigkeitsbaum und die Scopes noch einmal an. Da die Abhängigkeit `get_current_active_user` von `get_current_user` abhängt, wird der bei `get_current_active_user` deklarierte Scope `"me"` in die Liste der erforderlichen Scopes in `security_scopes.scopes` aufgenommen, das an `get_current_user` übergeben wird. Die *Pfadoperation* selbst deklariert auch einen Scope, `"items"`, sodass dieser auch in der Liste der `security_scopes.scopes` enthalten ist, die an `get_current_user` übergeben wird. So sieht die Hierarchie der Abhängigkeiten und Scopes aus: * Die *Pfadoperation* `read_own_items` hat: * Erforderliche Scopes `["items"]` mit der Abhängigkeit: * `get_current_active_user`: * Die Abhängigkeitsfunktion `get_current_active_user` hat: * Erforderliche Scopes `["me"]` mit der Abhängigkeit: * `get_current_user`: * Die Abhängigkeitsfunktion `get_current_user` hat: * Selbst keine erforderlichen Scopes. * Eine Abhängigkeit, die `oauth2_scheme` verwendet. * Einen `security_scopes`-Parameter vom Typ `SecurityScopes`: * Dieser `security_scopes`-Parameter hat ein Attribut `scopes` mit einer `list`e, die alle oben deklarierten Scopes enthält, sprich: * `security_scopes.scopes` enthält `["me", "items"]` für die *Pfadoperation* `read_own_items`. * `security_scopes.scopes` enthält `["me"]` für die *Pfadoperation* `read_users_me`, da das in der Abhängigkeit `get_current_active_user` deklariert ist. * `security_scopes.scopes` wird `[]` (nichts) für die *Pfadoperation* `read_system_status` enthalten, da diese keine `Security` mit `scopes` deklariert hat, und deren Abhängigkeit `get_current_user` ebenfalls keinerlei `scopes` deklariert. !!! tip "Tipp" Das Wichtige und „Magische“ hier ist, dass `get_current_user` für jede *Pfadoperation* eine andere Liste von `scopes` hat, die überprüft werden. Alles hängt von den „Scopes“ ab, die in jeder *Pfadoperation* und jeder Abhängigkeit im Abhängigkeitsbaum für diese bestimmte *Pfadoperation* deklariert wurden. ## Weitere Details zu `SecurityScopes`. Sie können `SecurityScopes` an jeder Stelle und an mehreren Stellen verwenden, es muss sich nicht in der „Wurzel“-Abhängigkeit befinden. Es wird immer die Sicherheits-Scopes enthalten, die in den aktuellen `Security`-Abhängigkeiten deklariert sind und in allen Abhängigkeiten für **diese spezifische** *Pfadoperation* und **diesen spezifischen** Abhängigkeitsbaum. Da die `SecurityScopes` alle von den Verwendern der Abhängigkeiten deklarierten Scopes enthalten, können Sie damit überprüfen, ob ein Token in einer zentralen Abhängigkeitsfunktion über die erforderlichen Scopes verfügt, und dann unterschiedliche Scope-Anforderungen in unterschiedlichen *Pfadoperationen* deklarieren. Diese werden für jede *Pfadoperation* unabhängig überprüft. ## Testen Sie es Wenn Sie die API-Dokumentation öffnen, können Sie sich authentisieren und angeben, welche Scopes Sie autorisieren möchten. Wenn Sie keinen Scope auswählen, werden Sie „authentifiziert“, aber wenn Sie versuchen, auf `/users/me/` oder `/users/me/items/` zuzugreifen, wird eine Fehlermeldung angezeigt, die sagt, dass Sie nicht über genügend Berechtigungen verfügen. Sie können aber auf `/status/` zugreifen. Und wenn Sie den Scope `me`, aber nicht den Scope `items` auswählen, können Sie auf `/users/me/` zugreifen, aber nicht auf `/users/me/items/`. Das würde einer Drittanbieteranwendung passieren, die versucht, auf eine dieser *Pfadoperationen* mit einem Token zuzugreifen, das von einem Benutzer bereitgestellt wurde, abhängig davon, wie viele Berechtigungen der Benutzer dieser Anwendung erteilt hat. ## Über Integrationen von Drittanbietern In diesem Beispiel verwenden wir den OAuth2-Flow „Password“. Das ist angemessen, wenn wir uns bei unserer eigenen Anwendung anmelden, wahrscheinlich mit unserem eigenen Frontend. Weil wir darauf vertrauen können, dass es den `username` und das `password` erhält, welche wir kontrollieren. Wenn Sie jedoch eine OAuth2-Anwendung erstellen, mit der andere eine Verbindung herstellen würden (d.h. wenn Sie einen Authentifizierungsanbieter erstellen, der Facebook, Google, GitHub usw. entspricht), sollten Sie einen der anderen Flows verwenden. Am häufigsten ist der „Implicit“-Flow. Am sichersten ist der „Code“-Flow, die Implementierung ist jedoch komplexer, da mehr Schritte erforderlich sind. Da er komplexer ist, schlagen viele Anbieter letztendlich den „Implicit“-Flow vor. !!! note "Hinweis" Es ist üblich, dass jeder Authentifizierungsanbieter seine Flows anders benennt, um sie zu einem Teil seiner Marke zu machen. Aber am Ende implementieren sie denselben OAuth2-Standard. **FastAPI** enthält Werkzeuge für alle diese OAuth2-Authentifizierungs-Flows in `fastapi.security.oauth2`. ## `Security` in Dekorator-`dependencies` Auf die gleiche Weise können Sie eine `list`e von `Depends` im Parameter `dependencies` des Dekorators definieren (wie in [Abhängigkeiten in Pfadoperation-Dekoratoren](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} erläutert), Sie könnten auch dort `Security` mit `scopes` verwenden. fastapi-0.110.3/docs/de/docs/advanced/settings.md000066400000000000000000000434541461403617600215240ustar00rootroot00000000000000# Einstellungen und Umgebungsvariablen In vielen Fällen benötigt Ihre Anwendung möglicherweise einige externe Einstellungen oder Konfigurationen, zum Beispiel geheime Schlüssel, Datenbank-Anmeldeinformationen, Anmeldeinformationen für E-Mail-Dienste, usw. Die meisten dieser Einstellungen sind variabel (können sich ändern), wie z. B. Datenbank-URLs. Und vieles könnten schützenswerte, geheime Daten sein. Aus diesem Grund werden diese üblicherweise in Umgebungsvariablen bereitgestellt, die von der Anwendung gelesen werden. ## Umgebungsvariablen !!! tip "Tipp" Wenn Sie bereits wissen, was „Umgebungsvariablen“ sind und wie man sie verwendet, können Sie gerne mit dem nächsten Abschnitt weiter unten fortfahren. Eine Umgebungsvariable (auch bekannt als „env var“) ist eine Variable, die sich außerhalb des Python-Codes im Betriebssystem befindet und von Ihrem Python-Code (oder auch von anderen Programmen) gelesen werden kann. Sie können Umgebungsvariablen in der Shell erstellen und verwenden, ohne Python zu benötigen: === "Linux, macOS, Windows Bash"
```console // Sie könnten eine Umgebungsvariable MY_NAME erstellen mittels $ export MY_NAME="Wade Wilson" // Dann könnten Sie diese mit anderen Programmen verwenden, etwa $ echo "Hello $MY_NAME" Hello Wade Wilson ```
=== "Windows PowerShell"
```console // Erstelle eine Umgebungsvariable MY_NAME $ $Env:MY_NAME = "Wade Wilson" // Verwende sie mit anderen Programmen, etwa $ echo "Hello $Env:MY_NAME" Hello Wade Wilson ```
### Umgebungsvariablen mit Python auslesen Sie können Umgebungsvariablen auch außerhalb von Python im Terminal (oder mit einer anderen Methode) erstellen und diese dann mit Python auslesen. Sie könnten zum Beispiel eine Datei `main.py` haben mit: ```Python hl_lines="3" import os name = os.getenv("MY_NAME", "World") print(f"Hello {name} from Python") ``` !!! tip "Tipp" Das zweite Argument für `os.getenv()` ist der zurückzugebende Defaultwert. Wenn nicht angegeben, ist er standardmäßig `None`. Hier übergeben wir `"World"` als Defaultwert. Dann könnten Sie dieses Python-Programm aufrufen:
```console // Hier legen wir die Umgebungsvariable noch nicht fest $ python main.py // Da wir die Umgebungsvariable nicht festgelegt haben, erhalten wir den Standardwert Hello World from Python // Aber wenn wir zuerst eine Umgebungsvariable erstellen $ export MY_NAME="Wade Wilson" // Und dann das Programm erneut aufrufen $ python main.py // Kann es jetzt die Umgebungsvariable lesen Hello Wade Wilson from Python ```
Da Umgebungsvariablen außerhalb des Codes festgelegt, aber vom Code gelesen werden können und nicht zusammen mit den übrigen Dateien gespeichert (an `git` committet) werden müssen, werden sie häufig für Konfigurationen oder Einstellungen verwendet. Sie können eine Umgebungsvariable auch nur für einen bestimmten Programmaufruf erstellen, die nur für dieses Programm und nur für dessen Dauer verfügbar ist. Erstellen Sie diese dazu direkt vor dem Programm selbst, in derselben Zeile:
```console // Erstelle eine Umgebungsvariable MY_NAME inline für diesen Programmaufruf $ MY_NAME="Wade Wilson" python main.py // main.py kann jetzt diese Umgebungsvariable lesen Hello Wade Wilson from Python // Die Umgebungsvariable existiert danach nicht mehr $ python main.py Hello World from Python ```
!!! tip "Tipp" Weitere Informationen dazu finden Sie unter The Twelve-Factor App: Config. ### Typen und Validierung Diese Umgebungsvariablen können nur Text-Zeichenketten verarbeiten, da sie außerhalb von Python liegen und mit anderen Programmen und dem Rest des Systems (und sogar mit verschiedenen Betriebssystemen wie Linux, Windows, macOS) kompatibel sein müssen. Das bedeutet, dass jeder in Python aus einer Umgebungsvariablen gelesene Wert ein `str` ist und jede Konvertierung in einen anderen Typ oder jede Validierung im Code erfolgen muss. ## Pydantic `Settings` Glücklicherweise bietet Pydantic ein großartiges Werkzeug zur Verarbeitung dieser Einstellungen, die von Umgebungsvariablen stammen, mit Pydantic: Settings Management. ### `pydantic-settings` installieren Installieren Sie zunächst das Package `pydantic-settings`:
```console $ pip install pydantic-settings ---> 100% ```
Es ist bereits enthalten, wenn Sie die `all`-Extras installiert haben, mit:
```console $ pip install "fastapi[all]" ---> 100% ```
!!! info In Pydantic v1 war das im Hauptpackage enthalten. Jetzt wird es als unabhängiges Package verteilt, sodass Sie wählen können, ob Sie es installieren möchten oder nicht, falls Sie die Funktionalität nicht benötigen. ### Das `Settings`-Objekt erstellen Importieren Sie `BaseSettings` aus Pydantic und erstellen Sie eine Unterklasse, ganz ähnlich wie bei einem Pydantic-Modell. Auf die gleiche Weise wie bei Pydantic-Modellen deklarieren Sie Klassenattribute mit Typannotationen und möglicherweise Defaultwerten. Sie können dieselben Validierungs-Funktionen und -Tools verwenden, die Sie für Pydantic-Modelle verwenden, z. B. verschiedene Datentypen und zusätzliche Validierungen mit `Field()`. === "Pydantic v2" ```Python hl_lines="2 5-8 11" {!> ../../../docs_src/settings/tutorial001.py!} ``` === "Pydantic v1" !!! info In Pydantic v1 würden Sie `BaseSettings` direkt von `pydantic` statt von `pydantic_settings` importieren. ```Python hl_lines="2 5-8 11" {!> ../../../docs_src/settings/tutorial001_pv1.py!} ``` !!! tip "Tipp" Für ein schnelles Copy-and-paste verwenden Sie nicht dieses Beispiel, sondern das letzte unten. Wenn Sie dann eine Instanz dieser `Settings`-Klasse erstellen (in diesem Fall als `settings`-Objekt), liest Pydantic die Umgebungsvariablen ohne Berücksichtigung der Groß- und Kleinschreibung. Eine Variable `APP_NAME` in Großbuchstaben wird also als Attribut `app_name` gelesen. Als Nächstes werden die Daten konvertiert und validiert. Wenn Sie also dieses `settings`-Objekt verwenden, verfügen Sie über Daten mit den von Ihnen deklarierten Typen (z. B. ist `items_per_user` ein `int`). ### `settings` verwenden Dann können Sie das neue `settings`-Objekt in Ihrer Anwendung verwenden: ```Python hl_lines="18-20" {!../../../docs_src/settings/tutorial001.py!} ``` ### Den Server ausführen Als Nächstes würden Sie den Server ausführen und die Konfigurationen als Umgebungsvariablen übergeben. Sie könnten beispielsweise `ADMIN_EMAIL` und `APP_NAME` festlegen mit:
```console $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" uvicorn main:app INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
!!! tip "Tipp" Um mehrere Umgebungsvariablen für einen einzelnen Befehl festzulegen, trennen Sie diese einfach durch ein Leerzeichen und fügen Sie alle vor dem Befehl ein. Und dann würde die Einstellung `admin_email` auf `"deadpool@example.com"` gesetzt. Der `app_name` wäre `"ChimichangApp"`. Und `items_per_user` würde seinen Standardwert von `50` behalten. ## Einstellungen in einem anderen Modul Sie könnten diese Einstellungen in eine andere Moduldatei einfügen, wie Sie in [Größere Anwendungen – mehrere Dateien](../tutorial/bigger-applications.md){.internal-link target=_blank} gesehen haben. Sie könnten beispielsweise eine Datei `config.py` haben mit: ```Python {!../../../docs_src/settings/app01/config.py!} ``` Und dann verwenden Sie diese in einer Datei `main.py`: ```Python hl_lines="3 11-13" {!../../../docs_src/settings/app01/main.py!} ``` !!! tip "Tipp" Sie benötigen außerdem eine Datei `__init__.py`, wie in [Größere Anwendungen – mehrere Dateien](../tutorial/bigger-applications.md){.internal-link target=_blank} gesehen. ## Einstellungen in einer Abhängigkeit In manchen Fällen kann es nützlich sein, die Einstellungen mit einer Abhängigkeit bereitzustellen, anstatt ein globales Objekt `settings` zu haben, das überall verwendet wird. Dies könnte besonders beim Testen nützlich sein, da es sehr einfach ist, eine Abhängigkeit mit Ihren eigenen benutzerdefinierten Einstellungen zu überschreiben. ### Die Konfigurationsdatei Ausgehend vom vorherigen Beispiel könnte Ihre Datei `config.py` so aussehen: ```Python hl_lines="10" {!../../../docs_src/settings/app02/config.py!} ``` Beachten Sie, dass wir jetzt keine Standardinstanz `settings = Settings()` erstellen. ### Die Haupt-Anwendungsdatei Jetzt erstellen wir eine Abhängigkeit, die ein neues `config.Settings()` zurückgibt. === "Python 3.9+" ```Python hl_lines="6 12-13" {!> ../../../docs_src/settings/app02_an_py39/main.py!} ``` === "Python 3.8+" ```Python hl_lines="6 12-13" {!> ../../../docs_src/settings/app02_an/main.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="5 11-12" {!> ../../../docs_src/settings/app02/main.py!} ``` !!! tip "Tipp" Wir werden das `@lru_cache` in Kürze besprechen. Im Moment nehmen Sie an, dass `get_settings()` eine normale Funktion ist. Und dann können wir das von der *Pfadoperation-Funktion* als Abhängigkeit einfordern und es überall dort verwenden, wo wir es brauchen. === "Python 3.9+" ```Python hl_lines="17 19-21" {!> ../../../docs_src/settings/app02_an_py39/main.py!} ``` === "Python 3.8+" ```Python hl_lines="17 19-21" {!> ../../../docs_src/settings/app02_an/main.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="16 18-20" {!> ../../../docs_src/settings/app02/main.py!} ``` ### Einstellungen und Tests Dann wäre es sehr einfach, beim Testen ein anderes Einstellungsobjekt bereitzustellen, indem man eine Abhängigkeitsüberschreibung für `get_settings` erstellt: ```Python hl_lines="9-10 13 21" {!../../../docs_src/settings/app02/test_main.py!} ``` Bei der Abhängigkeitsüberschreibung legen wir einen neuen Wert für `admin_email` fest, wenn wir das neue `Settings`-Objekt erstellen, und geben dann dieses neue Objekt zurück. Dann können wir testen, ob das verwendet wird. ## Lesen einer `.env`-Datei Wenn Sie viele Einstellungen haben, die sich möglicherweise oft ändern, vielleicht in verschiedenen Umgebungen, kann es nützlich sein, diese in eine Datei zu schreiben und sie dann daraus zu lesen, als wären sie Umgebungsvariablen. Diese Praxis ist so weit verbreitet, dass sie einen Namen hat. Diese Umgebungsvariablen werden üblicherweise in einer Datei `.env` abgelegt und die Datei wird „dotenv“ genannt. !!! tip "Tipp" Eine Datei, die mit einem Punkt (`.`) beginnt, ist eine versteckte Datei in Unix-ähnlichen Systemen wie Linux und macOS. Aber eine dotenv-Datei muss nicht unbedingt genau diesen Dateinamen haben. Pydantic unterstützt das Lesen dieser Dateitypen mithilfe einer externen Bibliothek. Weitere Informationen finden Sie unter Pydantic Settings: Dotenv (.env) support. !!! tip "Tipp" Damit das funktioniert, müssen Sie `pip install python-dotenv` ausführen. ### Die `.env`-Datei Sie könnten eine `.env`-Datei haben, mit: ```bash ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" ``` ### Einstellungen aus `.env` lesen Und dann aktualisieren Sie Ihre `config.py` mit: === "Pydantic v2" ```Python hl_lines="9" {!> ../../../docs_src/settings/app03_an/config.py!} ``` !!! tip "Tipp" Das Attribut `model_config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter Pydantic: Configuration. === "Pydantic v1" ```Python hl_lines="9-10" {!> ../../../docs_src/settings/app03_an/config_pv1.py!} ``` !!! tip "Tipp" Die Klasse `Config` wird nur für die Pydantic-Konfiguration verwendet. Weitere Informationen finden Sie unter Pydantic Model Config. !!! info In Pydantic Version 1 erfolgte die Konfiguration in einer internen Klasse `Config`, in Pydantic Version 2 erfolgt sie in einem Attribut `model_config`. Dieses Attribut akzeptiert ein `dict`. Um automatische Codevervollständigung und Inline-Fehlerberichte zu erhalten, können Sie `SettingsConfigDict` importieren und verwenden, um dieses `dict` zu definieren. Hier definieren wir die Konfiguration `env_file` innerhalb Ihrer Pydantic-`Settings`-Klasse und setzen den Wert auf den Dateinamen mit der dotenv-Datei, die wir verwenden möchten. ### Die `Settings` nur einmal laden mittels `lru_cache` Das Lesen einer Datei von der Festplatte ist normalerweise ein kostspieliger (langsamer) Vorgang, daher möchten Sie ihn wahrscheinlich nur einmal ausführen und dann dasselbe Einstellungsobjekt erneut verwenden, anstatt es für jeden Request zu lesen. Aber jedes Mal, wenn wir ausführen: ```Python Settings() ``` würde ein neues `Settings`-Objekt erstellt und bei der Erstellung würde die `.env`-Datei erneut ausgelesen. Wenn die Abhängigkeitsfunktion wie folgt wäre: ```Python def get_settings(): return Settings() ``` würden wir dieses Objekt für jeden Request erstellen und die `.env`-Datei für jeden Request lesen. ⚠️ Da wir jedoch den `@lru_cache`-Dekorator oben verwenden, wird das `Settings`-Objekt nur einmal erstellt, nämlich beim ersten Aufruf. ✔️ === "Python 3.9+" ```Python hl_lines="1 11" {!> ../../../docs_src/settings/app03_an_py39/main.py!} ``` === "Python 3.8+" ```Python hl_lines="1 11" {!> ../../../docs_src/settings/app03_an/main.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="1 10" {!> ../../../docs_src/settings/app03/main.py!} ``` Dann wird bei allen nachfolgenden Aufrufen von `get_settings()`, in den Abhängigkeiten für darauffolgende Requests, dasselbe Objekt zurückgegeben, das beim ersten Aufruf zurückgegeben wurde, anstatt den Code von `get_settings()` erneut auszuführen und ein neues `Settings`-Objekt zu erstellen. #### Technische Details zu `lru_cache` `@lru_cache` ändert die Funktion, die es dekoriert, dahingehend, denselben Wert zurückzugeben, der beim ersten Mal zurückgegeben wurde, anstatt ihn erneut zu berechnen und den Code der Funktion jedes Mal auszuführen. Die darunter liegende Funktion wird also für jede Argumentkombination einmal ausgeführt. Und dann werden die von jeder dieser Argumentkombinationen zurückgegebenen Werte immer wieder verwendet, wenn die Funktion mit genau derselben Argumentkombination aufgerufen wird. Wenn Sie beispielsweise eine Funktion haben: ```Python @lru_cache def say_hi(name: str, salutation: str = "Ms."): return f"Hello {salutation} {name}" ``` könnte Ihr Programm so ausgeführt werden: ```mermaid sequenceDiagram participant code as Code participant function as say_hi() participant execute as Funktion ausgeführt rect rgba(0, 255, 0, .1) code ->> function: say_hi(name="Camila") function ->> execute: führe Code der Funktion aus execute ->> code: gib das Resultat zurück end rect rgba(0, 255, 255, .1) code ->> function: say_hi(name="Camila") function ->> code: gib das gespeicherte Resultat zurück end rect rgba(0, 255, 0, .1) code ->> function: say_hi(name="Rick") function ->> execute: führe Code der Funktion aus execute ->> code: gib das Resultat zurück end rect rgba(0, 255, 0, .1) code ->> function: say_hi(name="Rick", salutation="Mr.") function ->> execute: führe Code der Funktion aus execute ->> code: gib das Resultat zurück end rect rgba(0, 255, 255, .1) code ->> function: say_hi(name="Rick") function ->> code: gib das gespeicherte Resultat zurück end rect rgba(0, 255, 255, .1) code ->> function: say_hi(name="Camila") function ->> code: gib das gespeicherte Resultat zurück end ``` Im Fall unserer Abhängigkeit `get_settings()` akzeptiert die Funktion nicht einmal Argumente, sodass sie immer den gleichen Wert zurückgibt. Auf diese Weise verhält es sich fast so, als wäre es nur eine globale Variable. Da es jedoch eine Abhängigkeitsfunktion verwendet, können wir diese zu Testzwecken problemlos überschreiben. `@lru_cache` ist Teil von `functools`, welches Teil von Pythons Standardbibliothek ist. Weitere Informationen dazu finden Sie in der Python Dokumentation für `@lru_cache`. ## Zusammenfassung Mit Pydantic Settings können Sie die Einstellungen oder Konfigurationen für Ihre Anwendung verwalten und dabei die gesamte Leistungsfähigkeit der Pydantic-Modelle nutzen. * Durch die Verwendung einer Abhängigkeit können Sie das Testen vereinfachen. * Sie können `.env`-Dateien damit verwenden. * Durch die Verwendung von `@lru_cache` können Sie vermeiden, die dotenv-Datei bei jedem Request erneut zu lesen, während Sie sie während des Testens überschreiben können. fastapi-0.110.3/docs/de/docs/advanced/sub-applications.md000066400000000000000000000064161461403617600231360ustar00rootroot00000000000000# Unteranwendungen – Mounts Wenn Sie zwei unabhängige FastAPI-Anwendungen mit deren eigenen unabhängigen OpenAPI und deren eigenen Dokumentationsoberflächen benötigen, können Sie eine Hauptanwendung haben und dann eine (oder mehrere) Unteranwendung(en) „mounten“. ## Mounten einer **FastAPI**-Anwendung „Mounten“ („Einhängen“) bedeutet das Hinzufügen einer völlig „unabhängigen“ Anwendung an einem bestimmten Pfad, die sich dann um die Handhabung aller unter diesem Pfad liegenden _Pfadoperationen_ kümmert, welche in dieser Unteranwendung deklariert sind. ### Hauptanwendung Erstellen Sie zunächst die Hauptanwendung **FastAPI** und deren *Pfadoperationen*: ```Python hl_lines="3 6-8" {!../../../docs_src/sub_applications/tutorial001.py!} ``` ### Unteranwendung Erstellen Sie dann Ihre Unteranwendung und deren *Pfadoperationen*. Diese Unteranwendung ist nur eine weitere Standard-FastAPI-Anwendung, aber diese wird „gemountet“: ```Python hl_lines="11 14-16" {!../../../docs_src/sub_applications/tutorial001.py!} ``` ### Die Unteranwendung mounten Mounten Sie in Ihrer Top-Level-Anwendung `app` die Unteranwendung `subapi`. In diesem Fall wird sie im Pfad `/subapi` gemountet: ```Python hl_lines="11 19" {!../../../docs_src/sub_applications/tutorial001.py!} ``` ### Es in der automatischen API-Dokumentation betrachten Führen Sie nun `uvicorn` mit der Hauptanwendung aus. Wenn Ihre Datei `main.py` lautet, wäre das:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
Und öffnen Sie die Dokumentation unter http://127.0.0.1:8000/docs. Sie sehen die automatische API-Dokumentation für die Hauptanwendung, welche nur deren eigene _Pfadoperationen_ anzeigt: Öffnen Sie dann die Dokumentation für die Unteranwendung unter http://127.0.0.1:8000/subapi/docs. Sie sehen die automatische API-Dokumentation für die Unteranwendung, welche nur deren eigene _Pfadoperationen_ anzeigt, alle unter dem korrekten Unterpfad-Präfix `/subapi`: Wenn Sie versuchen, mit einer der beiden Benutzeroberflächen zu interagieren, funktionieren diese ordnungsgemäß, da der Browser mit jeder spezifischen Anwendung oder Unteranwendung kommunizieren kann. ### Technische Details: `root_path` Wenn Sie eine Unteranwendung wie oben beschrieben mounten, kümmert sich FastAPI darum, den Mount-Pfad für die Unteranwendung zu kommunizieren, mithilfe eines Mechanismus aus der ASGI-Spezifikation namens `root_path`. Auf diese Weise weiß die Unteranwendung, dass sie dieses Pfadpräfix für die Benutzeroberfläche der Dokumentation verwenden soll. Und die Unteranwendung könnte auch ihre eigenen gemounteten Unteranwendungen haben und alles würde korrekt funktionieren, da FastAPI sich um alle diese `root_path`s automatisch kümmert. Mehr über den `root_path` und dessen explizite Verwendung erfahren Sie im Abschnitt [Hinter einem Proxy](behind-a-proxy.md){.internal-link target=_blank}. fastapi-0.110.3/docs/de/docs/advanced/templates.md000066400000000000000000000072171461403617600216570ustar00rootroot00000000000000# Templates Sie können jede gewünschte Template-Engine mit **FastAPI** verwenden. Eine häufige Wahl ist Jinja2, dasselbe, was auch von Flask und anderen Tools verwendet wird. Es gibt Werkzeuge zur einfachen Konfiguration, die Sie direkt in Ihrer **FastAPI**-Anwendung verwenden können (bereitgestellt von Starlette). ## Abhängigkeiten installieren Installieren Sie `jinja2`:
```console $ pip install jinja2 ---> 100% ```
## Verwendung von `Jinja2Templates` * Importieren Sie `Jinja2Templates`. * Erstellen Sie ein `templates`-Objekt, das Sie später wiederverwenden können. * Deklarieren Sie einen `Request`-Parameter in der *Pfadoperation*, welcher ein Template zurückgibt. * Verwenden Sie die von Ihnen erstellten `templates`, um eine `TemplateResponse` zu rendern und zurückzugeben, übergeben Sie den Namen des Templates, das Requestobjekt und ein „Kontext“-Dictionary mit Schlüssel-Wert-Paaren, die innerhalb des Jinja2-Templates verwendet werden sollen. ```Python hl_lines="4 11 15-18" {!../../../docs_src/templates/tutorial001.py!} ``` !!! note "Hinweis" Vor FastAPI 0.108.0 und Starlette 0.29.0 war `name` der erste Parameter. Außerdem wurde in früheren Versionen das `request`-Objekt als Teil der Schlüssel-Wert-Paare im Kontext für Jinja2 übergeben. !!! tip "Tipp" Durch die Deklaration von `response_class=HTMLResponse` kann die Dokumentationsoberfläche erkennen, dass die Response HTML sein wird. !!! note "Technische Details" Sie können auch `from starlette.templating import Jinja2Templates` verwenden. **FastAPI** bietet dasselbe `starlette.templating` auch via `fastapi.templating` an, als Annehmlichkeit für Sie, den Entwickler. Es kommt aber direkt von Starlette. Das Gleiche gilt für `Request` und `StaticFiles`. ## Templates erstellen Dann können Sie unter `templates/item.html` ein Template erstellen, mit z. B. folgendem Inhalt: ```jinja hl_lines="7" {!../../../docs_src/templates/templates/item.html!} ``` ### Template-Kontextwerte Im HTML, welches enthält: {% raw %} ```jinja Item ID: {{ id }} ``` {% endraw %} ... wird die `id` angezeigt, welche dem „Kontext“-`dict` entnommen wird, welches Sie übergeben haben: ```Python {"id": id} ``` Mit beispielsweise einer ID `42` würde das wie folgt gerendert werden: ```html Item ID: 42 ``` ### Template-`url_for`-Argumente Sie können `url_for()` auch innerhalb des Templates verwenden, es nimmt als Argumente dieselben Argumente, die von Ihrer *Pfadoperation-Funktion* verwendet werden. Der Abschnitt mit: {% raw %} ```jinja ``` {% endraw %} ... generiert also einen Link zu derselben URL, welche von der *Pfadoperation-Funktion* `read_item(id=id)` gehandhabt werden würde. Mit beispielsweise der ID `42` würde dies Folgendes ergeben: ```html ``` ## Templates und statische Dateien Sie können `url_for()` innerhalb des Templates auch beispielsweise mit den `StaticFiles` verwenden, die Sie mit `name="static"` gemountet haben. ```jinja hl_lines="4" {!../../../docs_src/templates/templates/item.html!} ``` In diesem Beispiel würde das zu einer CSS-Datei unter `static/styles.css` verlinken, mit folgendem Inhalt: ```CSS hl_lines="4" {!../../../docs_src/templates/static/styles.css!} ``` Und da Sie `StaticFiles` verwenden, wird diese CSS-Datei automatisch von Ihrer **FastAPI**-Anwendung unter der URL `/static/styles.css` bereitgestellt. ## Mehr Details Weitere Informationen, einschließlich, wie man Templates testet, finden Sie in der Starlette Dokumentation zu Templates. fastapi-0.110.3/docs/de/docs/advanced/testing-dependencies.md000066400000000000000000000070661461403617600237640ustar00rootroot00000000000000# Testen mit Ersatz für Abhängigkeiten ## Abhängigkeiten beim Testen überschreiben Es gibt einige Szenarien, in denen Sie beim Testen möglicherweise eine Abhängigkeit überschreiben möchten. Sie möchten nicht, dass die ursprüngliche Abhängigkeit ausgeführt wird (und auch keine der möglicherweise vorhandenen Unterabhängigkeiten). Stattdessen möchten Sie eine andere Abhängigkeit bereitstellen, die nur während Tests (möglicherweise nur bei einigen bestimmten Tests) verwendet wird und einen Wert bereitstellt, der dort verwendet werden kann, wo der Wert der ursprünglichen Abhängigkeit verwendet wurde. ### Anwendungsfälle: Externer Service Ein Beispiel könnte sein, dass Sie einen externen Authentifizierungsanbieter haben, mit dem Sie sich verbinden müssen. Sie senden ihm ein Token und er gibt einen authentifizierten Benutzer zurück. Dieser Anbieter berechnet Ihnen möglicherweise Gebühren pro Anfrage, und der Aufruf könnte etwas länger dauern, als wenn Sie einen vordefinierten Scheinbenutzer für Tests hätten. Sie möchten den externen Anbieter wahrscheinlich einmal testen, ihn aber nicht unbedingt bei jedem weiteren ausgeführten Test aufrufen. In diesem Fall können Sie die Abhängigkeit, die diesen Anbieter aufruft, überschreiben und eine benutzerdefinierte Abhängigkeit verwenden, die einen Scheinbenutzer zurückgibt, nur für Ihre Tests. ### Verwenden Sie das Attribut `app.dependency_overrides`. Für diese Fälle verfügt Ihre **FastAPI**-Anwendung über das Attribut `app.dependency_overrides`, bei diesem handelt sich um ein einfaches `dict`. Um eine Abhängigkeit für das Testen zu überschreiben, geben Sie als Schlüssel die ursprüngliche Abhängigkeit (eine Funktion) und als Wert Ihre Überschreibung der Abhängigkeit (eine andere Funktion) ein. Und dann ruft **FastAPI** diese Überschreibung anstelle der ursprünglichen Abhängigkeit auf. === "Python 3.10+" ```Python hl_lines="26-27 30" {!> ../../../docs_src/dependency_testing/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="28-29 32" {!> ../../../docs_src/dependency_testing/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="29-30 33" {!> ../../../docs_src/dependency_testing/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="24-25 28" {!> ../../../docs_src/dependency_testing/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="28-29 32" {!> ../../../docs_src/dependency_testing/tutorial001.py!} ``` !!! tip "Tipp" Sie können eine Überschreibung für eine Abhängigkeit festlegen, die an einer beliebigen Stelle in Ihrer **FastAPI**-Anwendung verwendet wird. Die ursprüngliche Abhängigkeit könnte in einer *Pfadoperation-Funktion*, einem *Pfadoperation-Dekorator* (wenn Sie den Rückgabewert nicht verwenden), einem `.include_router()`-Aufruf, usw. verwendet werden. FastAPI kann sie in jedem Fall überschreiben. Anschließend können Sie Ihre Überschreibungen zurücksetzen (entfernen), indem Sie `app.dependency_overrides` auf ein leeres `dict` setzen: ```Python app.dependency_overrides = {} ``` !!! tip "Tipp" Wenn Sie eine Abhängigkeit nur während einiger Tests überschreiben möchten, können Sie die Überschreibung zu Beginn des Tests (innerhalb der Testfunktion) festlegen und am Ende (am Ende der Testfunktion) zurücksetzen. fastapi-0.110.3/docs/de/docs/advanced/testing-events.md000066400000000000000000000004431461403617600226320ustar00rootroot00000000000000# Events testen: Hochfahren – Herunterfahren Wenn Sie in Ihren Tests Ihre Event-Handler (`startup` und `shutdown`) ausführen wollen, können Sie den `TestClient` mit einer `with`-Anweisung verwenden: ```Python hl_lines="9-12 20-24" {!../../../docs_src/app_testing/tutorial003.py!} ``` fastapi-0.110.3/docs/de/docs/advanced/testing-websockets.md000066400000000000000000000010121461403617600234700ustar00rootroot00000000000000# WebSockets testen Sie können den schon bekannten `TestClient` zum Testen von WebSockets verwenden. Dazu verwenden Sie den `TestClient` in einer `with`-Anweisung, eine Verbindung zum WebSocket herstellend: ```Python hl_lines="27-31" {!../../../docs_src/app_testing/tutorial002.py!} ``` !!! note "Hinweis" Weitere Informationen finden Sie in der Starlette-Dokumentation zum Testen von WebSockets. fastapi-0.110.3/docs/de/docs/advanced/using-request-directly.md000066400000000000000000000047601461403617600243110ustar00rootroot00000000000000# Den Request direkt verwenden Bisher haben Sie die Teile des Requests, die Sie benötigen, mithilfe von deren Typen deklariert. Daten nehmend von: * Dem Pfad als Parameter. * Headern. * Cookies. * usw. Und indem Sie das tun, validiert **FastAPI** diese Daten, konvertiert sie und generiert automatisch Dokumentation für Ihre API. Es gibt jedoch Situationen, in denen Sie möglicherweise direkt auf das `Request`-Objekt zugreifen müssen. ## Details zum `Request`-Objekt Da **FastAPI** unter der Haube eigentlich **Starlette** ist, mit einer Ebene von mehreren Tools darüber, können Sie Starlette's `Request`-Objekt direkt verwenden, wenn Sie es benötigen. Das bedeutet allerdings auch, dass, wenn Sie Daten direkt vom `Request`-Objekt nehmen (z. B. dessen Body lesen), diese von FastAPI nicht validiert, konvertiert oder dokumentiert werden (mit OpenAPI, für die automatische API-Benutzeroberfläche). Obwohl jeder andere normal deklarierte Parameter (z. B. der Body, mit einem Pydantic-Modell) dennoch validiert, konvertiert, annotiert, usw. werden würde. Es gibt jedoch bestimmte Fälle, in denen es nützlich ist, auf das `Request`-Objekt zuzugreifen. ## Das `Request`-Objekt direkt verwenden Angenommen, Sie möchten auf die IP-Adresse/den Host des Clients in Ihrer *Pfadoperation-Funktion* zugreifen. Dazu müssen Sie direkt auf den Request zugreifen. ```Python hl_lines="1 7-8" {!../../../docs_src/using_request_directly/tutorial001.py!} ``` Durch die Deklaration eines *Pfadoperation-Funktionsparameters*, dessen Typ der `Request` ist, weiß **FastAPI**, dass es den `Request` diesem Parameter übergeben soll. !!! tip "Tipp" Beachten Sie, dass wir in diesem Fall einen Pfad-Parameter zusätzlich zum Request-Parameter deklarieren. Der Pfad-Parameter wird also extrahiert, validiert, in den spezifizierten Typ konvertiert und mit OpenAPI annotiert. Auf die gleiche Weise können Sie wie gewohnt jeden anderen Parameter deklarieren und zusätzlich auch den `Request` erhalten. ## `Request`-Dokumentation Weitere Details zum `Request`-Objekt finden Sie in der offiziellen Starlette-Dokumentation. !!! note "Technische Details" Sie können auch `from starlette.requests import Request` verwenden. **FastAPI** stellt es direkt zur Verfügung, als Komfort für Sie, den Entwickler. Es kommt aber direkt von Starlette. fastapi-0.110.3/docs/de/docs/advanced/websockets.md000066400000000000000000000157111461403617600220300ustar00rootroot00000000000000# WebSockets Sie können WebSockets mit **FastAPI** verwenden. ## `WebSockets` installieren Zuerst müssen Sie `WebSockets` installieren:
```console $ pip install websockets ---> 100% ```
## WebSockets-Client ### In Produktion In Ihrem Produktionssystem haben Sie wahrscheinlich ein Frontend, das mit einem modernen Framework wie React, Vue.js oder Angular erstellt wurde. Und um über WebSockets mit Ihrem Backend zu kommunizieren, würden Sie wahrscheinlich die Werkzeuge Ihres Frontends verwenden. Oder Sie verfügen möglicherweise über eine native Mobile-Anwendung, die direkt in nativem Code mit Ihrem WebSocket-Backend kommuniziert. Oder Sie haben andere Möglichkeiten, mit dem WebSocket-Endpunkt zu kommunizieren. --- Für dieses Beispiel verwenden wir jedoch ein sehr einfaches HTML-Dokument mit etwas JavaScript, alles in einem langen String. Das ist natürlich nicht optimal und man würde das nicht in der Produktion machen. In der Produktion hätten Sie eine der oben genannten Optionen. Aber es ist die einfachste Möglichkeit, sich auf die Serverseite von WebSockets zu konzentrieren und ein funktionierendes Beispiel zu haben: ```Python hl_lines="2 6-38 41-43" {!../../../docs_src/websockets/tutorial001.py!} ``` ## Einen `websocket` erstellen Erstellen Sie in Ihrer **FastAPI**-Anwendung einen `websocket`: ```Python hl_lines="1 46-47" {!../../../docs_src/websockets/tutorial001.py!} ``` !!! note "Technische Details" Sie können auch `from starlette.websockets import WebSocket` verwenden. **FastAPI** stellt den gleichen `WebSocket` direkt zur Verfügung, als Annehmlichkeit für Sie, den Entwickler. Er kommt aber direkt von Starlette. ## Nachrichten erwarten und Nachrichten senden In Ihrer WebSocket-Route können Sie Nachrichten `await`en und Nachrichten senden. ```Python hl_lines="48-52" {!../../../docs_src/websockets/tutorial001.py!} ``` Sie können Binär-, Text- und JSON-Daten empfangen und senden. ## Es ausprobieren Wenn Ihre Datei `main.py` heißt, führen Sie Ihre Anwendung so aus:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
Öffnen Sie Ihren Browser unter http://127.0.0.1:8000. Sie sehen eine einfache Seite wie: Sie können Nachrichten in das Eingabefeld tippen und absenden: Und Ihre **FastAPI**-Anwendung mit WebSockets antwortet: Sie können viele Nachrichten senden (und empfangen): Und alle verwenden dieselbe WebSocket-Verbindung. ## Verwendung von `Depends` und anderen In WebSocket-Endpunkten können Sie Folgendes aus `fastapi` importieren und verwenden: * `Depends` * `Security` * `Cookie` * `Header` * `Path` * `Query` Diese funktionieren auf die gleiche Weise wie für andere FastAPI-Endpunkte/*Pfadoperationen*: === "Python 3.10+" ```Python hl_lines="68-69 82" {!> ../../../docs_src/websockets/tutorial002_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="68-69 82" {!> ../../../docs_src/websockets/tutorial002_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="69-70 83" {!> ../../../docs_src/websockets/tutorial002_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="66-67 79" {!> ../../../docs_src/websockets/tutorial002_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="68-69 81" {!> ../../../docs_src/websockets/tutorial002.py!} ``` !!! info Da es sich um einen WebSocket handelt, macht es keinen Sinn, eine `HTTPException` auszulösen, stattdessen lösen wir eine `WebSocketException` aus. Sie können einen „Closing“-Code verwenden, aus den gültigen Codes, die in der Spezifikation definiert sind. ### WebSockets mit Abhängigkeiten ausprobieren Wenn Ihre Datei `main.py` heißt, führen Sie Ihre Anwendung mit Folgendem aus:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
Öffnen Sie Ihren Browser unter http://127.0.0.1:8000. Dort können Sie einstellen: * Die „Item ID“, die im Pfad verwendet wird. * Das „Token“, das als Query-Parameter verwendet wird. !!! tip "Tipp" Beachten Sie, dass der Query-„Token“ von einer Abhängigkeit verarbeitet wird. Damit können Sie den WebSocket verbinden und dann Nachrichten senden und empfangen: ## Verbindungsabbrüche und mehreren Clients handhaben Wenn eine WebSocket-Verbindung geschlossen wird, löst `await websocket.receive_text()` eine `WebSocketDisconnect`-Exception aus, die Sie dann wie in folgendem Beispiel abfangen und behandeln können. === "Python 3.9+" ```Python hl_lines="79-81" {!> ../../../docs_src/websockets/tutorial003_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="81-83" {!> ../../../docs_src/websockets/tutorial003.py!} ``` Zum Ausprobieren: * Öffnen Sie die Anwendung mit mehreren Browser-Tabs. * Schreiben Sie Nachrichten in den Tabs. * Schließen Sie dann einen der Tabs. Das wird die Ausnahme `WebSocketDisconnect` auslösen und alle anderen Clients erhalten eine Nachricht wie: ``` Client #1596980209979 left the chat ``` !!! tip "Tipp" Die obige Anwendung ist ein minimales und einfaches Beispiel, das zeigt, wie Nachrichten verarbeitet und an mehrere WebSocket-Verbindungen gesendet werden. Beachten Sie jedoch, dass, da alles nur im Speicher in einer einzigen Liste verwaltet wird, es nur funktioniert, während der Prozess ausgeführt wird, und nur mit einem einzelnen Prozess. Wenn Sie etwas benötigen, das sich leicht in FastAPI integrieren lässt, aber robuster ist und von Redis, PostgreSQL und anderen unterstützt wird, sehen Sie sich encode/broadcaster an. ## Mehr Informationen Weitere Informationen zu Optionen finden Sie in der Dokumentation von Starlette: * Die `WebSocket`-Klasse. * Klassen-basierte Handhabung von WebSockets. fastapi-0.110.3/docs/de/docs/advanced/wsgi.md000066400000000000000000000023211461403617600206210ustar00rootroot00000000000000# WSGI inkludieren – Flask, Django und andere Sie können WSGI-Anwendungen mounten, wie Sie es in [Unteranwendungen – Mounts](sub-applications.md){.internal-link target=_blank}, [Hinter einem Proxy](behind-a-proxy.md){.internal-link target=_blank} gesehen haben. Dazu können Sie die `WSGIMiddleware` verwenden und damit Ihre WSGI-Anwendung wrappen, zum Beispiel Flask, Django usw. ## `WSGIMiddleware` verwenden Sie müssen `WSGIMiddleware` importieren. Wrappen Sie dann die WSGI-Anwendung (z. B. Flask) mit der Middleware. Und dann mounten Sie das auf einem Pfad. ```Python hl_lines="2-3 23" {!../../../docs_src/wsgi/tutorial001.py!} ``` ## Es ansehen Jetzt wird jede Anfrage unter dem Pfad `/v1/` von der Flask-Anwendung verarbeitet. Und der Rest wird von **FastAPI** gehandhabt. Wenn Sie das mit Uvicorn ausführen und auf http://localhost:8000/v1/ gehen, sehen Sie die Response von Flask: ```txt Hello, World from Flask! ``` Und wenn Sie auf http://localhost:8000/v2 gehen, sehen Sie die Response von FastAPI: ```JSON { "message": "Hello World" } ``` fastapi-0.110.3/docs/de/docs/alternatives.md000066400000000000000000000653631461403617600206230ustar00rootroot00000000000000# Alternativen, Inspiration und Vergleiche Was hat **FastAPI** inspiriert, ein Vergleich zu Alternativen, und was FastAPI von diesen gelernt hat. ## Einführung **FastAPI** würde ohne die frühere Arbeit anderer nicht existieren. Es wurden zuvor viele Tools entwickelt, die als Inspiration für seine Entwicklung dienten. Ich habe die Schaffung eines neuen Frameworks viele Jahre lang vermieden. Zuerst habe ich versucht, alle von **FastAPI** abgedeckten Funktionen mithilfe vieler verschiedener Frameworks, Plugins und Tools zu lösen. Aber irgendwann gab es keine andere Möglichkeit, als etwas zu schaffen, das all diese Funktionen bereitstellte, die besten Ideen früherer Tools aufnahm und diese auf die bestmögliche Weise kombinierte, wobei Sprachfunktionen verwendet wurden, die vorher noch nicht einmal verfügbar waren (Python 3.6+ Typhinweise). ## Vorherige Tools ### Django Es ist das beliebteste Python-Framework und genießt großes Vertrauen. Es wird zum Aufbau von Systemen wie Instagram verwendet. Ist relativ eng mit relationalen Datenbanken (wie MySQL oder PostgreSQL) gekoppelt, daher ist es nicht sehr einfach, eine NoSQL-Datenbank (wie Couchbase, MongoDB, Cassandra, usw.) als Hauptspeicherengine zu verwenden. Es wurde erstellt, um den HTML-Code im Backend zu generieren, nicht um APIs zu erstellen, die von einem modernen Frontend (wie React, Vue.js und Angular) oder von anderen Systemen (wie IoT-Geräten) verwendet werden, um mit ihm zu kommunizieren. ### Django REST Framework Das Django REST Framework wurde als flexibles Toolkit zum Erstellen von Web-APIs unter Verwendung von Django entwickelt, um dessen API-Möglichkeiten zu verbessern. Es wird von vielen Unternehmen verwendet, darunter Mozilla, Red Hat und Eventbrite. Es war eines der ersten Beispiele für **automatische API-Dokumentation**, und dies war insbesondere eine der ersten Ideen, welche „die Suche nach“ **FastAPI** inspirierten. !!! note "Hinweis" Das Django REST Framework wurde von Tom Christie erstellt. Derselbe Schöpfer von Starlette und Uvicorn, auf denen **FastAPI** basiert. !!! check "Inspirierte **FastAPI**" Eine automatische API-Dokumentationsoberfläche zu haben. ### Flask Flask ist ein „Mikroframework“, es enthält weder Datenbankintegration noch viele der Dinge, die standardmäßig in Django enthalten sind. Diese Einfachheit und Flexibilität ermöglichen beispielsweise die Verwendung von NoSQL-Datenbanken als Hauptdatenspeichersystem. Da es sehr einfach ist, ist es relativ intuitiv zu erlernen, obwohl die Dokumentation an einigen Stellen etwas technisch wird. Es wird auch häufig für andere Anwendungen verwendet, die nicht unbedingt eine Datenbank, Benutzerverwaltung oder eine der vielen in Django enthaltenen Funktionen benötigen. Obwohl viele dieser Funktionen mit Plugins hinzugefügt werden können. Diese Entkopplung der Teile und die Tatsache, dass es sich um ein „Mikroframework“ handelt, welches so erweitert werden kann, dass es genau das abdeckt, was benötigt wird, war ein Schlüsselmerkmal, das ich beibehalten wollte. Angesichts der Einfachheit von Flask schien es eine gute Ergänzung zum Erstellen von APIs zu sein. Als Nächstes musste ein „Django REST Framework“ für Flask gefunden werden. !!! check "Inspirierte **FastAPI**" Ein Mikroframework zu sein. Es einfach zu machen, die benötigten Tools und Teile zu kombinieren. Über ein einfaches und benutzerfreundliches Routingsystem zu verfügen. ### Requests **FastAPI** ist eigentlich keine Alternative zu **Requests**. Der Umfang der beiden ist sehr unterschiedlich. Es wäre tatsächlich üblich, Requests *innerhalb* einer FastAPI-Anwendung zu verwenden. Dennoch erhielt FastAPI von Requests einiges an Inspiration. **Requests** ist eine Bibliothek zur *Interaktion* mit APIs (als Client), während **FastAPI** eine Bibliothek zum *Erstellen* von APIs (als Server) ist. Die beiden stehen mehr oder weniger an entgegengesetzten Enden und ergänzen sich. Requests hat ein sehr einfaches und intuitives Design, ist sehr einfach zu bedienen und verfügt über sinnvolle Standardeinstellungen. Aber gleichzeitig ist es sehr leistungsstark und anpassbar. Aus diesem Grund heißt es auf der offiziellen Website: > Requests ist eines der am häufigsten heruntergeladenen Python-Packages aller Zeiten Die Art und Weise, wie Sie es verwenden, ist sehr einfach. Um beispielsweise einen `GET`-Request zu machen, würden Sie schreiben: ```Python response = requests.get("http://example.com/some/url") ``` Die entsprechende *Pfadoperation* der FastAPI-API könnte wie folgt aussehen: ```Python hl_lines="1" @app.get("/some/url") def read_url(): return {"message": "Hello World"} ``` Sehen Sie sich die Ähnlichkeiten in `requests.get(...)` und `@app.get(...)` an. !!! check "Inspirierte **FastAPI**" * Über eine einfache und intuitive API zu verfügen. * HTTP-Methodennamen (Operationen) direkt, auf einfache und intuitive Weise zu verwenden. * Vernünftige Standardeinstellungen zu haben, aber auch mächtige Einstellungsmöglichkeiten. ### Swagger / OpenAPI Die Hauptfunktion, die ich vom Django REST Framework haben wollte, war die automatische API-Dokumentation. Dann fand ich heraus, dass es einen Standard namens Swagger gab, zur Dokumentation von APIs unter Verwendung von JSON (oder YAML, einer Erweiterung von JSON). Und es gab bereits eine Web-Oberfläche für Swagger-APIs. Die Möglichkeit, Swagger-Dokumentation für eine API zu generieren, würde die automatische Nutzung dieser Web-Oberfläche ermöglichen. Irgendwann wurde Swagger an die Linux Foundation übergeben und in OpenAPI umbenannt. Aus diesem Grund spricht man bei Version 2.0 häufig von „Swagger“ und ab Version 3 von „OpenAPI“. !!! check "Inspirierte **FastAPI**" Einen offenen Standard für API-Spezifikationen zu übernehmen und zu verwenden, anstelle eines benutzerdefinierten Schemas. Und Standard-basierte Tools für die Oberfläche zu integrieren: * Swagger UI * ReDoc Diese beiden wurden ausgewählt, weil sie ziemlich beliebt und stabil sind, aber bei einer schnellen Suche könnten Sie Dutzende alternativer Benutzeroberflächen für OpenAPI finden (welche Sie mit **FastAPI** verwenden können). ### Flask REST Frameworks Es gibt mehrere Flask REST Frameworks, aber nachdem ich die Zeit und Arbeit investiert habe, sie zu untersuchen, habe ich festgestellt, dass viele nicht mehr unterstützt werden oder abgebrochen wurden und dass mehrere fortbestehende Probleme sie unpassend machten. ### Marshmallow Eine der von API-Systemen benötigen Hauptfunktionen ist die Daten-„Serialisierung“, welche Daten aus dem Code (Python) entnimmt und in etwas umwandelt, was durch das Netzwerk gesendet werden kann. Beispielsweise das Konvertieren eines Objekts, welches Daten aus einer Datenbank enthält, in ein JSON-Objekt. Konvertieren von `datetime`-Objekten in Strings, usw. Eine weitere wichtige Funktion, benötigt von APIs, ist die Datenvalidierung, welche sicherstellt, dass die Daten unter gegebenen Umständen gültig sind. Zum Beispiel, dass ein Feld ein `int` ist und kein zufälliger String. Das ist besonders nützlich für hereinkommende Daten. Ohne ein Datenvalidierungssystem müssten Sie alle Prüfungen manuell im Code durchführen. Für diese Funktionen wurde Marshmallow entwickelt. Es ist eine großartige Bibliothek und ich habe sie schon oft genutzt. Aber sie wurde erstellt, bevor Typhinweise in Python existierten. Um also ein Schema zu definieren, müssen Sie bestimmte Werkzeuge und Klassen verwenden, die von Marshmallow bereitgestellt werden. !!! check "Inspirierte **FastAPI**" Code zu verwenden, um „Schemas“ zu definieren, welche Datentypen und Validierung automatisch bereitstellen. ### Webargs Eine weitere wichtige Funktion, die von APIs benötigt wird, ist das Parsen von Daten aus eingehenden Requests. Webargs wurde entwickelt, um dieses für mehrere Frameworks, einschließlich Flask, bereitzustellen. Es verwendet unter der Haube Marshmallow, um die Datenvalidierung durchzuführen. Und es wurde von denselben Entwicklern erstellt. Es ist ein großartiges Tool und ich habe es auch oft verwendet, bevor ich **FastAPI** hatte. !!! info Webargs wurde von denselben Marshmallow-Entwicklern erstellt. !!! check "Inspirierte **FastAPI**" Eingehende Requestdaten automatisch zu validieren. ### APISpec Marshmallow und Webargs bieten Validierung, Parsen und Serialisierung als Plugins. Es fehlt jedoch noch die Dokumentation. Dann wurde APISpec erstellt. Es ist ein Plugin für viele Frameworks (und es gibt auch ein Plugin für Starlette). Die Funktionsweise besteht darin, dass Sie die Definition des Schemas im YAML-Format im Docstring jeder Funktion schreiben, die eine Route verarbeitet. Und es generiert OpenAPI-Schemas. So funktioniert es in Flask, Starlette, Responder, usw. Aber dann haben wir wieder das Problem einer Mikrosyntax innerhalb eines Python-Strings (eines großen YAML). Der Texteditor kann dabei nicht viel helfen. Und wenn wir Parameter oder Marshmallow-Schemas ändern und vergessen, auch den YAML-Docstring zu ändern, wäre das generierte Schema veraltet. !!! info APISpec wurde von denselben Marshmallow-Entwicklern erstellt. !!! check "Inspirierte **FastAPI**" Den offenen Standard für APIs, OpenAPI, zu unterstützen. ### Flask-apispec Hierbei handelt es sich um ein Flask-Plugin, welches Webargs, Marshmallow und APISpec miteinander verbindet. Es nutzt die Informationen von Webargs und Marshmallow, um mithilfe von APISpec automatisch OpenAPI-Schemas zu generieren. Ein großartiges Tool, sehr unterbewertet. Es sollte weitaus populärer als viele andere Flask-Plugins sein. Möglicherweise liegt es daran, dass die Dokumentation zu kompakt und abstrakt ist. Das löste das Problem, YAML (eine andere Syntax) in Python-Docstrings schreiben zu müssen. Diese Kombination aus Flask, Flask-apispec mit Marshmallow und Webargs war bis zur Entwicklung von **FastAPI** mein Lieblings-Backend-Stack. Die Verwendung führte zur Entwicklung mehrerer Flask-Full-Stack-Generatoren. Dies sind die Hauptstacks, die ich (und mehrere externe Teams) bisher verwendet haben: * https://github.com/tiangolo/full-stack * https://github.com/tiangolo/full-stack-flask-couchbase * https://github.com/tiangolo/full-stack-flask-couchdb Und dieselben Full-Stack-Generatoren bildeten die Basis der [**FastAPI**-Projektgeneratoren](project-generation.md){.internal-link target=_blank}. !!! info Flask-apispec wurde von denselben Marshmallow-Entwicklern erstellt. !!! check "Inspirierte **FastAPI**" Das OpenAPI-Schema automatisch zu generieren, aus demselben Code, welcher die Serialisierung und Validierung definiert. ### NestJS (und Angular) Dies ist nicht einmal Python, NestJS ist ein von Angular inspiriertes JavaScript (TypeScript) NodeJS Framework. Es erreicht etwas Ähnliches wie Flask-apispec. Es verfügt über ein integriertes Dependency Injection System, welches von Angular 2 inspiriert ist. Erfordert ein Vorab-Registrieren der „Injectables“ (wie alle anderen Dependency Injection Systeme, welche ich kenne), sodass der Code ausschweifender wird und es mehr Codeverdoppelung gibt. Da die Parameter mit TypeScript-Typen beschrieben werden (ähnlich den Python-Typhinweisen), ist die Editorunterstützung ziemlich gut. Da TypeScript-Daten jedoch nach der Kompilierung nach JavaScript nicht erhalten bleiben, können die Typen nicht gleichzeitig die Validierung, Serialisierung und Dokumentation definieren. Aus diesem Grund und aufgrund einiger Designentscheidungen ist es für die Validierung, Serialisierung und automatische Schemagenerierung erforderlich, an vielen Stellen Dekoratoren hinzuzufügen. Es wird also ziemlich ausführlich. Es kann nicht sehr gut mit verschachtelten Modellen umgehen. Wenn es sich beim JSON-Body in der Anfrage also um ein JSON-Objekt mit inneren Feldern handelt, die wiederum verschachtelte JSON-Objekte sind, kann er nicht richtig dokumentiert und validiert werden. !!! check "Inspirierte **FastAPI**" Python-Typen zu verwenden, um eine hervorragende Editorunterstützung zu erhalten. Über ein leistungsstarkes Dependency Injection System zu verfügen. Eine Möglichkeit zu finden, Codeverdoppelung zu minimieren. ### Sanic Es war eines der ersten extrem schnellen Python-Frameworks, welches auf `asyncio` basierte. Es wurde so gestaltet, dass es Flask sehr ähnlich ist. !!! note "Technische Details" Es verwendete `uvloop` anstelle der standardmäßigen Python-`asyncio`-Schleife. Das hat es so schnell gemacht. Hat eindeutig Uvicorn und Starlette inspiriert, welche derzeit in offenen Benchmarks schneller als Sanic sind. !!! check "Inspirierte **FastAPI**" Einen Weg zu finden, eine hervorragende Performanz zu haben. Aus diesem Grund basiert **FastAPI** auf Starlette, da dieses das schnellste verfügbare Framework ist (getestet in Benchmarks von Dritten). ### Falcon Falcon ist ein weiteres leistungsstarkes Python-Framework. Es ist minimalistisch konzipiert und dient als Grundlage für andere Frameworks wie Hug. Es ist so konzipiert, dass es über Funktionen verfügt, welche zwei Parameter empfangen, einen „Request“ und eine „Response“. Dann „lesen“ Sie Teile des Requests und „schreiben“ Teile der Response. Aufgrund dieses Designs ist es nicht möglich, Request-Parameter und -Bodys mit Standard-Python-Typhinweisen als Funktionsparameter zu deklarieren. Daher müssen Datenvalidierung, Serialisierung und Dokumentation im Code und nicht automatisch erfolgen. Oder sie müssen als Framework oberhalb von Falcon implementiert werden, so wie Hug. Dieselbe Unterscheidung findet auch in anderen Frameworks statt, die vom Design von Falcon inspiriert sind und ein Requestobjekt und ein Responseobjekt als Parameter haben. !!! check "Inspirierte **FastAPI**" Wege zu finden, eine großartige Performanz zu erzielen. Zusammen mit Hug (da Hug auf Falcon basiert), einen `response`-Parameter in Funktionen zu deklarieren. Obwohl er in FastAPI optional ist und hauptsächlich zum Festlegen von Headern, Cookies und alternativen Statuscodes verwendet wird. ### Molten Ich habe Molten in den ersten Phasen der Entwicklung von **FastAPI** entdeckt. Und es hat ganz ähnliche Ideen: * Basierend auf Python-Typhinweisen. * Validierung und Dokumentation aus diesen Typen. * Dependency Injection System. Es verwendet keine Datenvalidierungs-, Serialisierungs- und Dokumentationsbibliothek eines Dritten wie Pydantic, sondern verfügt über eine eigene. Daher wären diese Datentyp-Definitionen nicht so einfach wiederverwendbar. Es erfordert eine etwas ausführlichere Konfiguration. Und da es auf WSGI (anstelle von ASGI) basiert, ist es nicht darauf ausgelegt, die hohe Leistung von Tools wie Uvicorn, Starlette und Sanic zu nutzen. Das Dependency Injection System erfordert eine Vorab-Registrierung der Abhängigkeiten und die Abhängigkeiten werden basierend auf den deklarierten Typen aufgelöst. Daher ist es nicht möglich, mehr als eine „Komponente“ zu deklarieren, welche einen bestimmten Typ bereitstellt. Routen werden an einer einzigen Stelle deklariert, indem Funktionen verwendet werden, die an anderen Stellen deklariert wurden (anstatt Dekoratoren zu verwenden, welche direkt über der Funktion platziert werden können, welche den Endpunkt verarbeitet). Dies ähnelt eher der Vorgehensweise von Django als der Vorgehensweise von Flask (und Starlette). Es trennt im Code Dinge, die relativ eng miteinander gekoppelt sind. !!! check "Inspirierte **FastAPI**" Zusätzliche Validierungen für Datentypen zu definieren, mithilfe des „Default“-Werts von Modellattributen. Dies verbessert die Editorunterstützung und war zuvor in Pydantic nicht verfügbar. Das hat tatsächlich dazu geführt, dass Teile von Pydantic aktualisiert wurden, um denselben Validierungsdeklarationsstil zu unterstützen (diese gesamte Funktionalität ist jetzt bereits in Pydantic verfügbar). ### Hug Hug war eines der ersten Frameworks, welches die Deklaration von API-Parametertypen mithilfe von Python-Typhinweisen implementierte. Das war eine großartige Idee, die andere Tools dazu inspirierte, dasselbe zu tun. Es verwendete benutzerdefinierte Typen in seinen Deklarationen anstelle von Standard-Python-Typen, es war aber dennoch ein großer Fortschritt. Außerdem war es eines der ersten Frameworks, welches ein benutzerdefiniertes Schema generierte, welches die gesamte API in JSON deklarierte. Es basierte nicht auf einem Standard wie OpenAPI und JSON Schema. Daher wäre es nicht einfach, es in andere Tools wie Swagger UI zu integrieren. Aber, nochmal, es war eine sehr innovative Idee. Es verfügt über eine interessante, ungewöhnliche Funktion: Mit demselben Framework ist es möglich, APIs und auch CLIs zu erstellen. Da es auf dem bisherigen Standard für synchrone Python-Webframeworks (WSGI) basiert, kann es nicht mit Websockets und anderen Dingen umgehen, verfügt aber dennoch über eine hohe Performanz. !!! info Hug wurde von Timothy Crosley erstellt, dem gleichen Schöpfer von `isort`, einem großartigen Tool zum automatischen Sortieren von Importen in Python-Dateien. !!! check "Ideen, die **FastAPI** inspiriert haben" Hug inspirierte Teile von APIStar und war eines der Tools, die ich am vielversprechendsten fand, neben APIStar. Hug hat dazu beigetragen, **FastAPI** dazu zu inspirieren, Python-Typhinweise zum Deklarieren von Parametern zu verwenden und ein Schema zu generieren, das die API automatisch definiert. Hug inspirierte **FastAPI** dazu, einen `response`-Parameter in Funktionen zu deklarieren, um Header und Cookies zu setzen. ### APIStar (≦ 0.5) Kurz bevor ich mich entschied, **FastAPI** zu erstellen, fand ich den **APIStar**-Server. Er hatte fast alles, was ich suchte, und ein tolles Design. Er war eine der ersten Implementierungen eines Frameworks, die ich je gesehen hatte (vor NestJS und Molten), welches Python-Typhinweise zur Deklaration von Parametern und Requests verwendeten. Ich habe ihn mehr oder weniger zeitgleich mit Hug gefunden. Aber APIStar nutzte den OpenAPI-Standard. Er verfügte an mehreren Stellen über automatische Datenvalidierung, Datenserialisierung und OpenAPI-Schemagenerierung, basierend auf denselben Typhinweisen. Body-Schemadefinitionen verwendeten nicht die gleichen Python-Typhinweise wie Pydantic, er war Marshmallow etwas ähnlicher, sodass die Editorunterstützung nicht so gut war, aber dennoch war APIStar die beste verfügbare Option. Er hatte zu dieser Zeit die besten Leistungsbenchmarks (nur übertroffen von Starlette). Anfangs gab es keine Web-Oberfläche für die automatische API-Dokumentation, aber ich wusste, dass ich Swagger UI hinzufügen konnte. Er verfügte über ein Dependency Injection System. Es erforderte eine Vorab-Registrierung der Komponenten, wie auch bei anderen oben besprochenen Tools. Aber dennoch, es war ein tolles Feature. Ich konnte ihn nie in einem vollständigen Projekt verwenden, da er keine Sicherheitsintegration hatte, sodass ich nicht alle Funktionen, die ich hatte, durch die auf Flask-apispec basierenden Full-Stack-Generatoren ersetzen konnte. Ich hatte in meinem Projekte-Backlog den Eintrag, einen Pull Request zu erstellen, welcher diese Funktionalität hinzufügte. Doch dann verlagerte sich der Schwerpunkt des Projekts. Es handelte sich nicht länger um ein API-Webframework, da sich der Entwickler auf Starlette konzentrieren musste. Jetzt handelt es sich bei APIStar um eine Reihe von Tools zur Validierung von OpenAPI-Spezifikationen, nicht um ein Webframework. !!! info APIStar wurde von Tom Christie erstellt. Derselbe, welcher Folgendes erstellt hat: * Django REST Framework * Starlette (auf welchem **FastAPI** basiert) * Uvicorn (verwendet von Starlette und **FastAPI**) !!! check "Inspirierte **FastAPI**" Zu existieren. Die Idee, mehrere Dinge (Datenvalidierung, Serialisierung und Dokumentation) mit denselben Python-Typen zu deklarieren, welche gleichzeitig eine hervorragende Editorunterstützung bieten, hielt ich für eine brillante Idee. Und nach einer langen Suche nach einem ähnlichen Framework und dem Testen vieler verschiedener Alternativen, war APIStar die beste verfügbare Option. Dann hörte APIStar auf, als Server zu existieren, und Starlette wurde geschaffen, welches eine neue, bessere Grundlage für ein solches System bildete. Das war die finale Inspiration für die Entwicklung von **FastAPI**. Ich betrachte **FastAPI** als einen „spirituellen Nachfolger“ von APIStar, welcher die Funktionen, das Typsystem und andere Teile verbessert und erweitert, basierend auf den Erkenntnissen aus all diesen früheren Tools. ## Verwendet von **FastAPI** ### Pydantic Pydantic ist eine Bibliothek zum Definieren von Datenvalidierung, Serialisierung und Dokumentation (unter Verwendung von JSON Schema) basierend auf Python-Typhinweisen. Das macht es äußerst intuitiv. Es ist vergleichbar mit Marshmallow. Obwohl es in Benchmarks schneller als Marshmallow ist. Und da es auf den gleichen Python-Typhinweisen basiert, ist die Editorunterstützung großartig. !!! check "**FastAPI** verwendet es, um" Die gesamte Datenvalidierung, Datenserialisierung und automatische Modelldokumentation (basierend auf JSON Schema) zu erledigen. **FastAPI** nimmt dann, abgesehen von all den anderen Dingen, die es tut, dieses JSON-Schema und fügt es in OpenAPI ein. ### Starlette Starlette ist ein leichtgewichtiges ASGI-Framework/Toolkit, welches sich ideal für die Erstellung hochperformanter asynchroner Dienste eignet. Es ist sehr einfach und intuitiv. Es ist so konzipiert, dass es leicht erweiterbar ist und über modulare Komponenten verfügt. Es bietet: * Eine sehr beeindruckende Leistung. * WebSocket-Unterstützung. * Hintergrundtasks im selben Prozess. * Events für das Hoch- und Herunterfahren. * Testclient basierend auf HTTPX. * CORS, GZip, statische Dateien, Streamende Responses. * Session- und Cookie-Unterstützung. * 100 % Testabdeckung. * 100 % Typannotierte Codebasis. * Wenige starke Abhängigkeiten. Starlette ist derzeit das schnellste getestete Python-Framework. Nur übertroffen von Uvicorn, welches kein Framework, sondern ein Server ist. Starlette bietet alle grundlegenden Funktionen eines Web-Microframeworks. Es bietet jedoch keine automatische Datenvalidierung, Serialisierung oder Dokumentation. Das ist eines der wichtigsten Dinge, welche **FastAPI** hinzufügt, alles basierend auf Python-Typhinweisen (mit Pydantic). Das, plus, das Dependency Injection System, Sicherheitswerkzeuge, OpenAPI-Schemagenerierung, usw. !!! note "Technische Details" ASGI ist ein neuer „Standard“, welcher von Mitgliedern des Django-Kernteams entwickelt wird. Es handelt sich immer noch nicht um einen „Python-Standard“ (ein PEP), obwohl sie gerade dabei sind, das zu tun. Dennoch wird es bereits von mehreren Tools als „Standard“ verwendet. Das verbessert die Interoperabilität erheblich, da Sie Uvicorn mit jeden anderen ASGI-Server (wie Daphne oder Hypercorn) tauschen oder ASGI-kompatible Tools wie `python-socketio` hinzufügen können. !!! check "**FastAPI** verwendet es, um" Alle Kern-Webaspekte zu handhaben. Und fügt Funktionen obenauf. Die Klasse `FastAPI` selbst erbt direkt von der Klasse `Starlette`. Alles, was Sie also mit Starlette machen können, können Sie direkt mit **FastAPI** machen, da es sich im Grunde um Starlette auf Steroiden handelt. ### Uvicorn Uvicorn ist ein blitzschneller ASGI-Server, der auf uvloop und httptools basiert. Es handelt sich nicht um ein Webframework, sondern um einen Server. Beispielsweise werden keine Tools für das Routing von Pfaden bereitgestellt. Das ist etwas, was ein Framework wie Starlette (oder **FastAPI**) zusätzlich bieten würde. Es ist der empfohlene Server für Starlette und **FastAPI**. !!! check "**FastAPI** empfiehlt es als" Hauptwebserver zum Ausführen von **FastAPI**-Anwendungen. Sie können ihn mit Gunicorn kombinieren, um einen asynchronen Multiprozess-Server zu erhalten. Weitere Details finden Sie im Abschnitt [Deployment](deployment/index.md){.internal-link target=_blank}. ## Benchmarks und Geschwindigkeit Um den Unterschied zwischen Uvicorn, Starlette und FastAPI zu verstehen, zu vergleichen und zu sehen, lesen Sie den Abschnitt über [Benchmarks](benchmarks.md){.internal-link target=_blank}. fastapi-0.110.3/docs/de/docs/async.md000066400000000000000000000651731461403617600172360ustar00rootroot00000000000000# Nebenläufigkeit und async / await Details zur `async def`-Syntax für *Pfadoperation-Funktionen* und Hintergrundinformationen zu asynchronem Code, Nebenläufigkeit und Parallelität. ## In Eile? TL;DR: Wenn Sie Bibliotheken von Dritten verwenden, die mit `await` aufgerufen werden müssen, wie zum Beispiel: ```Python results = await some_library() ``` Dann deklarieren Sie Ihre *Pfadoperation-Funktionen* mit `async def` wie in: ```Python hl_lines="2" @app.get('/') async def read_results(): results = await some_library() return results ``` !!! note Sie können `await` nur innerhalb von Funktionen verwenden, die mit `async def` erstellt wurden. --- Wenn Sie eine Bibliothek eines Dritten verwenden, die mit etwas kommuniziert (einer Datenbank, einer API, dem Dateisystem, usw.) und welche die Verwendung von `await` nicht unterstützt (dies ist derzeit bei den meisten Datenbankbibliotheken der Fall), dann deklarieren Sie Ihre *Pfadoperation-Funktionen* ganz normal nur mit `def`, etwa: ```Python hl_lines="2" @app.get('/') def results(): results = some_library() return results ``` --- Wenn Ihre Anwendung (irgendwie) mit nichts anderem kommunizieren und auf dessen Antwort warten muss, verwenden Sie `async def`. --- Wenn Sie sich unsicher sind, verwenden Sie einfach `def`. --- **Hinweis**: Sie können `def` und `async def` in Ihren *Pfadoperation-Funktionen* beliebig mischen, so wie Sie es benötigen, und jede einzelne Funktion in der für Sie besten Variante erstellen. FastAPI wird damit das Richtige tun. Wie dem auch sei, in jedem der oben genannten Fälle wird FastAPI immer noch asynchron arbeiten und extrem schnell sein. Wenn Sie jedoch den oben genannten Schritten folgen, können einige Performance-Optimierungen vorgenommen werden. ## Technische Details Moderne Versionen von Python unterstützen **„asynchronen Code“** unter Verwendung sogenannter **„Coroutinen“** mithilfe der Syntax **`async`** und **`await`**. Nehmen wir obigen Satz in den folgenden Abschnitten Schritt für Schritt unter die Lupe: * **Asynchroner Code** * **`async` und `await`** * **Coroutinen** ## Asynchroner Code Asynchroner Code bedeutet lediglich, dass die Sprache 💬 eine Möglichkeit hat, dem Computersystem / Programm 🤖 mitzuteilen, dass es 🤖 an einem bestimmten Punkt im Code darauf warten muss, dass *etwas anderes* irgendwo anders fertig wird. Nehmen wir an, *etwas anderes* ist hier „Langsam-Datei“ 📝. Während der Zeit, die „Langsam-Datei“ 📝 benötigt, kann das System also andere Aufgaben erledigen. Dann kommt das System / Programm 🤖 bei jeder Gelegenheit zurück, wenn es entweder wieder wartet, oder wann immer es 🤖 die ganze Arbeit erledigt hat, die zu diesem Zeitpunkt zu tun war. Und es 🤖 wird nachschauen, ob eine der Aufgaben, auf die es gewartet hat, fertig damit ist, zu tun, was sie tun sollte. Dann nimmt es 🤖 die erste erledigte Aufgabe (sagen wir, unsere „Langsam-Datei“ 📝) und bearbeitet sie weiter. Das „Warten auf etwas anderes“ bezieht sich normalerweise auf I/O-Operationen, die relativ „langsam“ sind (im Vergleich zur Geschwindigkeit des Prozessors und des Arbeitsspeichers), wie etwa das Warten darauf, dass: * die Daten des Clients über das Netzwerk empfangen wurden * die von Ihrem Programm gesendeten Daten vom Client über das Netzwerk empfangen wurden * der Inhalt einer Datei vom System von der Festplatte gelesen und an Ihr Programm übergeben wurde * der Inhalt, den Ihr Programm dem System übergeben hat, auf die Festplatte geschrieben wurde * eine Remote-API-Operation beendet wurde * Eine Datenbankoperation abgeschlossen wurde * eine Datenbankabfrage die Ergebnisse zurückgegeben hat * usw. Da die Ausführungszeit hier hauptsächlich durch das Warten auf I/O-Operationen verbraucht wird, nennt man dies auch „I/O-lastige“ („I/O bound“) Operationen. „Asynchron“, sagt man, weil das Computersystem / Programm nicht mit einer langsamen Aufgabe „synchronisiert“ werden muss und nicht auf den genauen Moment warten muss, in dem die Aufgabe beendet ist, ohne dabei etwas zu tun, um schließlich das Ergebnis der Aufgabe zu übernehmen und die Arbeit fortsetzen zu können. Da es sich stattdessen um ein „asynchrones“ System handelt, kann die Aufgabe nach Abschluss ein wenig (einige Mikrosekunden) in der Schlange warten, bis das System / Programm seine anderen Dinge erledigt hat und zurückkommt, um die Ergebnisse entgegenzunehmen und mit ihnen weiterzuarbeiten. Für „synchron“ (im Gegensatz zu „asynchron“) wird auch oft der Begriff „sequentiell“ verwendet, da das System / Programm alle Schritte in einer Sequenz („der Reihe nach“) ausführt, bevor es zu einer anderen Aufgabe wechselt, auch wenn diese Schritte mit Warten verbunden sind. ### Nebenläufigkeit und Hamburger Diese oben beschriebene Idee von **asynchronem** Code wird manchmal auch **„Nebenläufigkeit“** genannt. Sie unterscheidet sich von **„Parallelität“**. **Nebenläufigkeit** und **Parallelität** beziehen sich beide auf „verschiedene Dinge, die mehr oder weniger gleichzeitig passieren“. Aber die Details zwischen *Nebenläufigkeit* und *Parallelität* sind ziemlich unterschiedlich. Um den Unterschied zu erkennen, stellen Sie sich die folgende Geschichte über Hamburger vor: ### Nebenläufige Hamburger Sie gehen mit Ihrem Schwarm Fastfood holen, stehen in der Schlange, während der Kassierer die Bestellungen der Leute vor Ihnen entgegennimmt. 😍 Dann sind Sie an der Reihe und Sie bestellen zwei sehr schmackhafte Burger für Ihren Schwarm und Sie. 🍔🍔 Der Kassierer sagt etwas zum Koch in der Küche, damit dieser weiß, dass er Ihre Burger zubereiten muss (obwohl er gerade die für die vorherigen Kunden zubereitet). Sie bezahlen. 💸 Der Kassierer gibt Ihnen die Nummer Ihrer Bestellung. Während Sie warten, suchen Sie sich mit Ihrem Schwarm einen Tisch aus, Sie sitzen da und reden lange mit Ihrem Schwarm (da Ihre Burger sehr aufwändig sind und die Zubereitung einige Zeit dauert). Während Sie mit Ihrem Schwarm am Tisch sitzen und auf die Burger warten, können Sie die Zeit damit verbringen, zu bewundern, wie großartig, süß und klug Ihr Schwarm ist ✨😍✨. Während Sie warten und mit Ihrem Schwarm sprechen, überprüfen Sie von Zeit zu Zeit die auf dem Zähler angezeigte Nummer, um zu sehen, ob Sie bereits an der Reihe sind. Dann, irgendwann, sind Sie endlich an der Reihe. Sie gehen zur Theke, holen sich die Burger und kommen zurück an den Tisch. Sie und Ihr Schwarm essen die Burger und haben eine schöne Zeit. ✨ !!! info Die wunderschönen Illustrationen stammen von Ketrina Thompson. 🎨 --- Stellen Sie sich vor, Sie wären das Computersystem / Programm 🤖 in dieser Geschichte. Während Sie an der Schlange stehen, sind Sie einfach untätig 😴, warten darauf, dass Sie an die Reihe kommen, und tun nichts sehr „Produktives“. Aber die Schlange ist schnell abgearbeitet, weil der Kassierer nur die Bestellungen entgegennimmt (und nicht zubereitet), also ist das vertretbar. Wenn Sie dann an der Reihe sind, erledigen Sie tatsächliche „produktive“ Arbeit, Sie gehen das Menü durch, entscheiden sich, was Sie möchten, bekunden Ihre und die Wahl Ihres Schwarms, bezahlen, prüfen, ob Sie die richtige Menge Geld oder die richtige Karte geben, prüfen, ob die Rechnung korrekt ist, prüfen, dass die Bestellung die richtigen Artikel enthält, usw. Aber dann, auch wenn Sie Ihre Burger noch nicht haben, ist Ihre Interaktion mit dem Kassierer erst mal „auf Pause“ ⏸, weil Sie warten müssen 🕙, bis Ihre Burger fertig sind. Aber wenn Sie sich von der Theke entfernt haben und mit der Nummer für die Bestellung an einem Tisch sitzen, können Sie Ihre Aufmerksamkeit auf Ihren Schwarm lenken und an dieser Aufgabe „arbeiten“ ⏯ 🤓. Sie machen wieder etwas sehr „Produktives“ und flirten mit Ihrem Schwarm 😍. Dann sagt der Kassierer 💁 „Ich bin mit dem Burger fertig“, indem er Ihre Nummer auf dem Display über der Theke anzeigt, aber Sie springen nicht sofort wie verrückt auf, wenn das Display auf Ihre Nummer springt. Sie wissen, dass niemand Ihnen Ihre Burger wegnimmt, denn Sie haben die Nummer Ihrer Bestellung, und andere Leute haben andere Nummern. Also warten Sie darauf, dass Ihr Schwarm ihre Geschichte zu Ende erzählt (die aktuelle Arbeit ⏯ / bearbeitete Aufgabe beendet 🤓), lächeln sanft und sagen, dass Sie die Burger holen ⏸. Dann gehen Sie zur Theke 🔀, zur ursprünglichen Aufgabe, die nun erledigt ist ⏯, nehmen die Burger auf, sagen Danke, und bringen sie zum Tisch. Damit ist dieser Schritt / diese Aufgabe der Interaktion mit der Theke abgeschlossen ⏹. Das wiederum schafft eine neue Aufgabe, „Burger essen“ 🔀 ⏯, aber die vorherige Aufgabe „Burger holen“ ist erledigt ⏹. ### Parallele Hamburger Stellen wir uns jetzt vor, dass es sich hierbei nicht um „nebenläufige Hamburger“, sondern um „parallele Hamburger“ handelt. Sie gehen los mit Ihrem Schwarm, um paralleles Fast Food zu bekommen. Sie stehen in der Schlange, während mehrere (sagen wir acht) Kassierer, die gleichzeitig Köche sind, die Bestellungen der Leute vor Ihnen entgegennehmen. Alle vor Ihnen warten darauf, dass ihre Burger fertig sind, bevor sie die Theke verlassen, denn jeder der 8 Kassierer geht los und bereitet den Burger sofort zu, bevor er die nächste Bestellung entgegennimmt. Dann sind Sie endlich an der Reihe und bestellen zwei sehr leckere Burger für Ihren Schwarm und Sie. Sie zahlen 💸. Der Kassierer geht in die Küche. Sie warten, vor der Theke stehend 🕙, damit niemand außer Ihnen Ihre Burger entgegennimmt, da es keine Nummern für die Reihenfolge gibt. Da Sie und Ihr Schwarm damit beschäftigt sind, niemanden vor sich zu lassen, der Ihre Burger nimmt, wenn sie ankommen, können Sie Ihrem Schwarm keine Aufmerksamkeit schenken. 😞 Das ist „synchrone“ Arbeit, Sie sind mit dem Kassierer/Koch „synchronisiert“ 👨‍🍳. Sie müssen warten 🕙 und genau in dem Moment da sein, in dem der Kassierer/Koch 👨‍🍳 die Burger zubereitet hat und Ihnen gibt, sonst könnte jemand anderes sie nehmen. Dann kommt Ihr Kassierer/Koch 👨‍🍳 endlich mit Ihren Burgern zurück, nachdem Sie lange vor der Theke gewartet 🕙 haben. Sie nehmen Ihre Burger und gehen mit Ihrem Schwarm an den Tisch. Sie essen sie und sind fertig. ⏹ Es wurde nicht viel geredet oder geflirtet, da die meiste Zeit mit Warten 🕙 vor der Theke verbracht wurde. 😞 !!! info Die wunderschönen Illustrationen stammen von Ketrina Thompson. 🎨 --- In diesem Szenario der parallelen Hamburger sind Sie ein Computersystem / Programm 🤖 mit zwei Prozessoren (Sie und Ihr Schwarm), die beide warten 🕙 und ihre Aufmerksamkeit darauf verwenden, „lange Zeit vor der Theke zu warten“ 🕙. Der Fast-Food-Laden verfügt über 8 Prozessoren (Kassierer/Köche). Während der nebenläufige Burger-Laden nur zwei hatte (einen Kassierer und einen Koch). Dennoch ist das schlussendliche Benutzererlebnis nicht das Beste. 😞 --- Dies wäre die parallele äquivalente Geschichte für Hamburger. 🍔 Für ein „realeres“ Beispiel hierfür, stellen Sie sich eine Bank vor. Bis vor kurzem hatten die meisten Banken mehrere Kassierer 👨‍💼👨‍💼👨‍💼👨‍💼 und eine große Warteschlange 🕙🕙🕙🕙🕙🕙🕙🕙. Alle Kassierer erledigen die ganze Arbeit mit einem Kunden nach dem anderen 👨‍💼⏯. Und man muss lange in der Schlange warten 🕙 sonst kommt man nicht an die Reihe. Sie würden Ihren Schwarm 😍 wahrscheinlich nicht mitnehmen wollen, um Besorgungen bei der Bank zu erledigen 🏦. ### Hamburger Schlussfolgerung In diesem Szenario „Fast Food Burger mit Ihrem Schwarm“ ist es viel sinnvoller, ein nebenläufiges System zu haben ⏸🔀⏯, da viel gewartet wird 🕙. Das ist auch bei den meisten Webanwendungen der Fall. Viele, viele Benutzer, aber Ihr Server wartet 🕙 darauf, dass deren nicht so gute Internetverbindungen die Requests übermitteln. Und dann warten 🕙, bis die Responses zurückkommen. Dieses „Warten“ 🕙 wird in Mikrosekunden gemessen, aber zusammenfassend lässt sich sagen, dass am Ende eine Menge gewartet wird. Deshalb ist es sehr sinnvoll, asynchronen ⏸🔀⏯ Code für Web-APIs zu verwenden. Diese Art der Asynchronität hat NodeJS populär gemacht (auch wenn NodeJS nicht parallel ist) und darin liegt die Stärke von Go als Programmiersprache. Und das ist das gleiche Leistungsniveau, das Sie mit **FastAPI** erhalten. Und da Sie Parallelität und Asynchronität gleichzeitig haben können, erzielen Sie eine höhere Performanz als die meisten getesteten NodeJS-Frameworks und sind mit Go auf Augenhöhe, einer kompilierten Sprache, die näher an C liegt (alles dank Starlette). ### Ist Nebenläufigkeit besser als Parallelität? Nein! Das ist nicht die Moral der Geschichte. Nebenläufigkeit unterscheidet sich von Parallelität. Und sie ist besser bei **bestimmten** Szenarien, die viel Warten erfordern. Aus diesem Grund ist sie im Allgemeinen viel besser als Parallelität für die Entwicklung von Webanwendungen. Aber das stimmt nicht für alle Anwendungen. Um die Dinge auszugleichen, stellen Sie sich die folgende Kurzgeschichte vor: > Sie müssen ein großes, schmutziges Haus aufräumen. *Yup, das ist die ganze Geschichte*. --- Es gibt kein Warten 🕙, nur viel Arbeit an mehreren Stellen im Haus. Sie könnten wie im Hamburger-Beispiel hin- und herspringen, zuerst das Wohnzimmer, dann die Küche, aber da Sie auf nichts warten 🕙, sondern nur putzen und putzen, hätte das Hin- und Herspringen keine Auswirkungen. Es würde mit oder ohne Hin- und Herspringen (Nebenläufigkeit) die gleiche Zeit in Anspruch nehmen, um fertig zu werden, und Sie hätten die gleiche Menge an Arbeit erledigt. Aber wenn Sie in diesem Fall die acht Ex-Kassierer/Köche/jetzt Reinigungskräfte mitbringen würden und jeder von ihnen (plus Sie) würde einen Bereich des Hauses reinigen, könnten Sie die ganze Arbeit **parallel** erledigen, und würden mit dieser zusätzlichen Hilfe viel schneller fertig werden. In diesem Szenario wäre jede einzelne Reinigungskraft (einschließlich Ihnen) ein Prozessor, der seinen Teil der Arbeit erledigt. Und da die meiste Ausführungszeit durch tatsächliche Arbeit (anstatt durch Warten) in Anspruch genommen wird und die Arbeit in einem Computer von einer CPU erledigt wird, werden diese Probleme als „CPU-lastig“ („CPU bound“) bezeichnet. --- Typische Beispiele für CPU-lastige Vorgänge sind Dinge, die komplexe mathematische Berechnungen erfordern. Zum Beispiel: * **Audio-** oder **Bildbearbeitung**. * **Computer Vision**: Ein Bild besteht aus Millionen von Pixeln, jedes Pixel hat 3 Werte / Farben, die Verarbeitung erfordert normalerweise, Berechnungen mit diesen Pixeln durchzuführen, alles zur gleichen Zeit. * **Maschinelles Lernen**: Normalerweise sind viele „Matrix“- und „Vektor“-Multiplikationen erforderlich. Stellen Sie sich eine riesige Tabelle mit Zahlen vor, in der Sie alle Zahlen gleichzeitig multiplizieren. * **Deep Learning**: Dies ist ein Teilgebiet des maschinellen Lernens, daher gilt das Gleiche. Es ist nur so, dass es nicht eine einzige Tabelle mit Zahlen zum Multiplizieren gibt, sondern eine riesige Menge davon, und in vielen Fällen verwendet man einen speziellen Prozessor, um diese Modelle zu erstellen und / oder zu verwenden. ### Nebenläufigkeit + Parallelität: Web + maschinelles Lernen Mit **FastAPI** können Sie die Vorteile der Nebenläufigkeit nutzen, die in der Webentwicklung weit verbreitet ist (derselbe Hauptvorteil von NodeJS). Sie können aber auch die Vorteile von Parallelität und Multiprocessing (Mehrere Prozesse werden parallel ausgeführt) für **CPU-lastige** Workloads wie in Systemen für maschinelles Lernen nutzen. Dies und die einfache Tatsache, dass Python die Hauptsprache für **Data Science**, maschinelles Lernen und insbesondere Deep Learning ist, machen FastAPI zu einem sehr passenden Werkzeug für Web-APIs und Anwendungen für Data Science / maschinelles Lernen (neben vielen anderen). Wie Sie diese Parallelität in der Produktion erreichen, erfahren Sie im Abschnitt über [Deployment](deployment/index.md){.internal-link target=_blank}. ## `async` und `await`. Moderne Versionen von Python verfügen über eine sehr intuitive Möglichkeit, asynchronen Code zu schreiben. Dadurch sieht es wie normaler „sequentieller“ Code aus und übernimmt im richtigen Moment das „Warten“ für Sie. Wenn es einen Vorgang gibt, der erfordert, dass gewartet wird, bevor die Ergebnisse zurückgegeben werden, und der diese neue Python-Funktionalität unterstützt, können Sie ihn wie folgt schreiben: ```Python burgers = await get_burgers(2) ``` Der Schlüssel hier ist das `await`. Es teilt Python mit, dass es warten ⏸ muss, bis `get_burgers(2)` seine Aufgabe erledigt hat 🕙, bevor die Ergebnisse in `burgers` gespeichert werden. Damit weiß Python, dass es in der Zwischenzeit etwas anderes tun kann 🔀 ⏯ (z. B. einen weiteren Request empfangen). Damit `await` funktioniert, muss es sich in einer Funktion befinden, die diese Asynchronität unterstützt. Dazu deklarieren Sie sie einfach mit `async def`: ```Python hl_lines="1" async def get_burgers(number: int): # Mach Sie hier etwas Asynchrones, um die Burger zu erstellen return burgers ``` ... statt mit `def`: ```Python hl_lines="2" # Die ist nicht asynchron def get_sequential_burgers(number: int): # Mach Sie hier etwas Sequentielles, um die Burger zu erstellen return burgers ``` Mit `async def` weiß Python, dass es innerhalb dieser Funktion auf `await`-Ausdrücke achten muss und dass es die Ausführung dieser Funktion „anhalten“ ⏸ und etwas anderes tun kann 🔀, bevor es zurückkommt. Wenn Sie eine `async def`-Funktion aufrufen möchten, müssen Sie sie „erwarten“ („await“). Das folgende wird also nicht funktionieren: ```Python # Das funktioniert nicht, weil get_burgers definiert wurde mit: async def burgers = get_burgers(2) ``` --- Wenn Sie also eine Bibliothek verwenden, die Ihnen sagt, dass Sie sie mit `await` aufrufen können, müssen Sie die *Pfadoperation-Funktionen*, die diese Bibliothek verwenden, mittels `async def` erstellen, wie in: ```Python hl_lines="2-3" @app.get('/burgers') async def read_burgers(): burgers = await get_burgers(2) return burgers ``` ### Weitere technische Details Ihnen ist wahrscheinlich aufgefallen, dass `await` nur innerhalb von Funktionen verwendet werden kann, die mit `async def` definiert sind. Gleichzeitig müssen aber mit `async def` definierte Funktionen „erwartet“ („awaited“) werden. Daher können Funktionen mit `async def` nur innerhalb von Funktionen aufgerufen werden, die auch mit `async def` definiert sind. Daraus resultiert das Ei-und-Huhn-Problem: Wie ruft man die erste `async` Funktion auf? Wenn Sie mit **FastAPI** arbeiten, müssen Sie sich darüber keine Sorgen machen, da diese „erste“ Funktion Ihre *Pfadoperation-Funktion* sein wird und FastAPI weiß, was zu tun ist. Wenn Sie jedoch `async` / `await` ohne FastAPI verwenden möchten, können Sie dies auch tun. ### Schreiben Sie Ihren eigenen asynchronen Code Starlette (und **FastAPI**) basiert auf AnyIO, was bedeutet, es ist sowohl kompatibel mit der Python-Standardbibliothek asyncio, als auch mit Trio. Insbesondere können Sie AnyIO direkt verwenden für Ihre fortgeschritten nebenläufigen und parallelen Anwendungsfälle, die fortgeschrittenere Muster in Ihrem eigenen Code erfordern. Und selbst wenn Sie FastAPI nicht verwenden würden, könnten Sie auch Ihre eigenen asynchronen Anwendungen mit AnyIO so schreiben, dass sie hoch kompatibel sind und Sie dessen Vorteile nutzen können (z. B. *strukturierte Nebenläufigkeit*). ### Andere Formen von asynchronem Code Diese Art der Verwendung von `async` und `await` ist in der Sprache relativ neu. Aber sie erleichtert die Arbeit mit asynchronem Code erheblich. Die gleiche Syntax (oder fast identisch) wurde kürzlich auch in moderne Versionen von JavaScript (im Browser und in NodeJS) aufgenommen. Davor war der Umgang mit asynchronem Code jedoch deutlich komplexer und schwieriger. In früheren Versionen von Python hätten Sie Threads oder Gevent verwenden können. Der Code ist jedoch viel komplexer zu verstehen, zu debuggen und nachzuvollziehen. In früheren Versionen von NodeJS / Browser JavaScript hätten Sie „Callbacks“ verwendet. Was zur Callback-Hölle führt. ## Coroutinen **Coroutine** ist nur ein schicker Begriff für dasjenige, was von einer `async def`-Funktion zurückgegeben wird. Python weiß, dass es so etwas wie eine Funktion ist, die es starten kann und die irgendwann endet, aber auch dass sie pausiert ⏸ werden kann, wann immer darin ein `await` steht. Aber all diese Funktionalität der Verwendung von asynchronem Code mit `async` und `await` wird oft als Verwendung von „Coroutinen“ zusammengefasst. Es ist vergleichbar mit dem Hauptmerkmal von Go, den „Goroutinen“. ## Fazit Sehen wir uns den gleichen Satz von oben noch mal an: > Moderne Versionen von Python unterstützen **„asynchronen Code“** unter Verwendung sogenannter **„Coroutinen“** mithilfe der Syntax **`async`** und **`await`**. Das sollte jetzt mehr Sinn ergeben. ✨ All das ist es, was FastAPI (via Starlette) befeuert und es eine so beeindruckende Performanz haben lässt. ## Sehr technische Details !!! warning "Achtung" Das folgende können Sie wahrscheinlich überspringen. Dies sind sehr technische Details darüber, wie **FastAPI** unter der Haube funktioniert. Wenn Sie über gute technische Kenntnisse verfügen (Coroutinen, Threads, Blocking, usw.) und neugierig sind, wie FastAPI mit `async def`s im Vergleich zu normalen `def`s umgeht, fahren Sie fort. ### Pfadoperation-Funktionen Wenn Sie eine *Pfadoperation-Funktion* mit normalem `def` anstelle von `async def` deklarieren, wird sie in einem externen Threadpool ausgeführt, der dann `await`et wird, anstatt direkt aufgerufen zu werden (da dies den Server blockieren würde). Wenn Sie von einem anderen asynchronen Framework kommen, das nicht auf die oben beschriebene Weise funktioniert, und Sie es gewohnt sind, triviale, nur-berechnende *Pfadoperation-Funktionen* mit einfachem `def` zu definieren, um einen geringfügigen Geschwindigkeitsgewinn (etwa 100 Nanosekunden) zu erzielen, beachten Sie bitte, dass der Effekt in **FastAPI** genau gegenteilig wäre. In solchen Fällen ist es besser, `async def` zu verwenden, es sei denn, Ihre *Pfadoperation-Funktionen* verwenden Code, der blockierende I/O-Operationen durchführt. Dennoch besteht in beiden Fällen eine gute Chance, dass **FastAPI** [immer noch schneller](index.md#performanz){.internal-link target=_blank} als Ihr bisheriges Framework (oder zumindest damit vergleichbar) ist. ### Abhängigkeiten Das Gleiche gilt für [Abhängigkeiten](tutorial/dependencies/index.md){.internal-link target=_blank}. Wenn eine Abhängigkeit eine normale `def`-Funktion ist, anstelle einer `async def`-Funktion, dann wird sie im externen Threadpool ausgeführt. ### Unterabhängigkeiten Sie können mehrere Abhängigkeiten und [Unterabhängigkeiten](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} haben, die einander bedingen (als Parameter der Funktionsdefinitionen), einige davon könnten erstellt werden mit `async def` und einige mit normalem `def`. Es würde immer noch funktionieren und diejenigen, die mit normalem `def` erstellt wurden, würden in einem externen Thread (vom Threadpool stammend) aufgerufen werden, anstatt `await`et zu werden. ### Andere Hilfsfunktionen Jede andere Hilfsfunktion, die Sie direkt aufrufen, kann mit normalem `def` oder `async def` erstellt werden, und FastAPI beeinflusst nicht die Art und Weise, wie Sie sie aufrufen. Dies steht im Gegensatz zu den Funktionen, die FastAPI für Sie aufruft: *Pfadoperation-Funktionen* und Abhängigkeiten. Wenn Ihre Hilfsfunktion eine normale Funktion mit `def` ist, wird sie direkt aufgerufen (so wie Sie es in Ihrem Code schreiben), nicht in einem Threadpool. Wenn die Funktion mit `async def` erstellt wurde, sollten Sie sie `await`en, wenn Sie sie in Ihrem Code aufrufen. --- Nochmal, es handelt sich hier um sehr technische Details, die Ihnen helfen, falls Sie danach gesucht haben. Andernfalls liegen Sie richtig, wenn Sie sich an die Richtlinien aus dem obigen Abschnitt halten: In Eile?. fastapi-0.110.3/docs/de/docs/benchmarks.md000066400000000000000000000076461461403617600202370ustar00rootroot00000000000000# Benchmarks Unabhängige TechEmpower-Benchmarks zeigen, **FastAPI**-Anwendungen, die unter Uvicorn ausgeführt werden, gehören zu den schnellsten existierenden Python-Frameworks, nur Starlette und Uvicorn selbst (intern von FastAPI verwendet) sind schneller. Beim Ansehen von Benchmarks und Vergleichen sollten Sie jedoch Folgende Punkte beachten. ## Benchmarks und Geschwindigkeit Wenn Sie sich die Benchmarks ansehen, werden häufig mehrere Tools mit unterschiedlichen Eigenschaften als gleichwertig verglichen. Konkret geht es darum, Uvicorn, Starlette und FastAPI miteinander zu vergleichen (neben vielen anderen Tools). Je einfacher das Problem, welches durch das Tool gelöst wird, desto besser ist die Performanz. Und die meisten Benchmarks testen nicht die zusätzlichen Funktionen, welche das Tool bietet. Die Hierarchie ist wie folgt: * **Uvicorn**: ein ASGI-Server * **Starlette**: (verwendet Uvicorn) ein Web-Mikroframework * **FastAPI**: (verwendet Starlette) ein API-Mikroframework mit mehreren zusätzlichen Funktionen zum Erstellen von APIs, mit Datenvalidierung, usw. * **Uvicorn**: * Bietet die beste Leistung, da außer dem Server selbst nicht viel zusätzlicher Code vorhanden ist. * Sie würden eine Anwendung nicht direkt in Uvicorn schreiben. Das würde bedeuten, dass Ihr Code zumindest mehr oder weniger den gesamten von Starlette (oder **FastAPI**) bereitgestellten Code enthalten müsste. Und wenn Sie das täten, hätte Ihre endgültige Anwendung den gleichen Overhead wie die Verwendung eines Frameworks nebst Minimierung Ihres Anwendungscodes und der Fehler. * Wenn Sie Uvicorn vergleichen, vergleichen Sie es mit Anwendungsservern wie Daphne, Hypercorn, uWSGI, usw. * **Starlette**: * Wird nach Uvicorn die nächstbeste Performanz erbringen. Tatsächlich nutzt Starlette intern Uvicorn. Daher kann es wahrscheinlich nur „langsamer“ als Uvicorn sein, weil mehr Code ausgeführt wird. * Aber es bietet Ihnen die Tools zum Erstellen einfacher Webanwendungen, mit Routing basierend auf Pfaden, usw. * Wenn Sie Starlette vergleichen, vergleichen Sie es mit Webframeworks (oder Mikroframeworks) wie Sanic, Flask, Django, usw. * **FastAPI**: * So wie Starlette Uvicorn verwendet und nicht schneller als dieses sein kann, verwendet **FastAPI** Starlette, sodass es nicht schneller als dieses sein kann. * FastAPI bietet zusätzlich zu Starlette weitere Funktionen. Funktionen, die Sie beim Erstellen von APIs fast immer benötigen, wie Datenvalidierung und Serialisierung. Und wenn Sie es verwenden, erhalten Sie kostenlos automatische Dokumentation (die automatische Dokumentation verursacht nicht einmal zusätzlichen Aufwand für laufende Anwendungen, sie wird beim Start generiert). * Wenn Sie FastAPI nicht, und direkt Starlette (oder ein anderes Tool wie Sanic, Flask, Responder, usw.) verwenden würden, müssten Sie die gesamte Datenvalidierung und Serialisierung selbst implementieren. Ihre finale Anwendung hätte also immer noch den gleichen Overhead, als ob sie mit FastAPI erstellt worden wäre. Und in vielen Fällen ist diese Datenvalidierung und Serialisierung der größte Teil des in Anwendungen geschriebenen Codes. * Durch die Verwendung von FastAPI sparen Sie also Entwicklungszeit, Fehler und Codezeilen und würden wahrscheinlich die gleiche Leistung (oder eine bessere) erzielen, die Sie hätten, wenn Sie es nicht verwenden würden (da Sie alles in Ihrem Code implementieren müssten). * Wenn Sie FastAPI vergleichen, vergleichen Sie es mit einem Webanwendung-Framework (oder einer Reihe von Tools), welche Datenvalidierung, Serialisierung und Dokumentation bereitstellen, wie Flask-apispec, NestJS, Molten, usw. – Frameworks mit integrierter automatischer Datenvalidierung, Serialisierung und Dokumentation. fastapi-0.110.3/docs/de/docs/contributing.md000066400000000000000000000403141461403617600206160ustar00rootroot00000000000000# Entwicklung – Mitwirken Vielleicht möchten Sie sich zuerst die grundlegenden Möglichkeiten anschauen, [FastAPI zu helfen und Hilfe zu erhalten](help-fastapi.md){.internal-link target=_blank}. ## Entwicklung Wenn Sie das fastapi Repository bereits geklont haben und tief in den Code eintauchen möchten, hier einen Leitfaden zum Einrichten Ihrer Umgebung. ### Virtuelle Umgebung mit `venv` Sie können mit dem Python-Modul `venv` in einem Verzeichnis eine isolierte virtuelle lokale Umgebung erstellen. Machen wir das im geklonten Repository (da wo sich die `requirements.txt` befindet):
```console $ python -m venv env ```
Das erstellt ein Verzeichnis `./env/` mit den Python-Binärdateien und Sie können dann Packages in dieser lokalen Umgebung installieren. ### Umgebung aktivieren Aktivieren Sie die neue Umgebung mit: === "Linux, macOS"
```console $ source ./env/bin/activate ```
=== "Windows PowerShell"
```console $ .\env\Scripts\Activate.ps1 ```
=== "Windows Bash" Oder, wenn Sie Bash für Windows verwenden (z. B. Git Bash):
```console $ source ./env/Scripts/activate ```
Um zu überprüfen, ob es funktioniert hat, geben Sie ein: === "Linux, macOS, Windows Bash"
```console $ which pip some/directory/fastapi/env/bin/pip ```
=== "Windows PowerShell"
```console $ Get-Command pip some/directory/fastapi/env/bin/pip ```
Wenn die `pip` Binärdatei unter `env/bin/pip` angezeigt wird, hat es funktioniert. 🎉 Stellen Sie sicher, dass Sie über die neueste Version von pip in Ihrer lokalen Umgebung verfügen, um Fehler bei den nächsten Schritten zu vermeiden:
```console $ python -m pip install --upgrade pip ---> 100% ```
!!! tip "Tipp" Aktivieren Sie jedes Mal, wenn Sie ein neues Package mit `pip` in dieser Umgebung installieren, die Umgebung erneut. Dadurch wird sichergestellt, dass Sie, wenn Sie ein von diesem Package installiertes Terminalprogramm verwenden, das Programm aus Ihrer lokalen Umgebung verwenden und kein anderes, das global installiert sein könnte. ### Benötigtes mit pip installieren Nachdem Sie die Umgebung wie oben beschrieben aktiviert haben:
```console $ pip install -r requirements.txt ---> 100% ```
Das installiert alle Abhängigkeiten und Ihr lokales FastAPI in Ihrer lokalen Umgebung. #### Das lokale FastAPI verwenden Wenn Sie eine Python-Datei erstellen, die FastAPI importiert und verwendet, und diese mit dem Python aus Ihrer lokalen Umgebung ausführen, wird Ihr geklonter lokaler FastAPI-Quellcode verwendet. Und wenn Sie diesen lokalen FastAPI-Quellcode aktualisieren und dann die Python-Datei erneut ausführen, wird die neue Version von FastAPI verwendet, die Sie gerade bearbeitet haben. Auf diese Weise müssen Sie Ihre lokale Version nicht „installieren“, um jede Änderung testen zu können. !!! note "Technische Details" Das geschieht nur, wenn Sie die Installation mit der enthaltenen `requirements.txt` durchführen, anstatt `pip install fastapi` direkt auszuführen. Das liegt daran, dass in der Datei `requirements.txt` die lokale Version von FastAPI mit der Option `-e` für die Installation im „editierbaren“ Modus markiert ist. ### Den Code formatieren Es gibt ein Skript, das, wenn Sie es ausführen, Ihren gesamten Code formatiert und bereinigt:
```console $ bash scripts/format.sh ```
Es sortiert auch alle Ihre Importe automatisch. Damit es sie richtig sortiert, muss FastAPI lokal in Ihrer Umgebung installiert sein, mit dem Befehl vom obigen Abschnitt, welcher `-e` verwendet. ## Dokumentation Stellen Sie zunächst sicher, dass Sie Ihre Umgebung wie oben beschrieben einrichten, was alles Benötigte installiert. ### Dokumentation live Während der lokalen Entwicklung gibt es ein Skript, das die Site erstellt, auf Änderungen prüft und direkt neu lädt (Live Reload):
```console $ python ./scripts/docs.py live [INFO] Serving on http://127.0.0.1:8008 [INFO] Start watching changes [INFO] Start detecting changes ```
Das stellt die Dokumentation unter `http://127.0.0.1:8008` bereit. Auf diese Weise können Sie die Dokumentation/Quelldateien bearbeiten und die Änderungen live sehen. !!! tip "Tipp" Alternativ können Sie die Schritte des Skripts auch manuell ausführen. Gehen Sie in das Verzeichnis für die entsprechende Sprache. Das für die englischsprachige Hauptdokumentation befindet sich unter `docs/en/`: ```console $ cd docs/en/ ``` Führen Sie dann `mkdocs` in diesem Verzeichnis aus: ```console $ mkdocs serve --dev-addr 8008 ``` #### Typer-CLI (optional) Die Anleitung hier zeigt Ihnen, wie Sie das Skript unter `./scripts/docs.py` direkt mit dem `python` Programm verwenden. Sie können aber auch Typer CLI verwenden und erhalten dann Autovervollständigung für Kommandos in Ihrem Terminal, nach dem Sie dessen Vervollständigung installiert haben. Wenn Sie Typer CLI installieren, können Sie die Vervollständigung installieren mit:
```console $ typer --install-completion zsh completion installed in /home/user/.bashrc. Completion will take effect once you restart the terminal. ```
### Dokumentationsstruktur Die Dokumentation verwendet MkDocs. Und es gibt zusätzliche Tools/Skripte für Übersetzungen, in `./scripts/docs.py`. !!! tip "Tipp" Sie müssen sich den Code in `./scripts/docs.py` nicht anschauen, verwenden Sie ihn einfach in der Kommandozeile. Die gesamte Dokumentation befindet sich im Markdown-Format im Verzeichnis `./docs/en/`. Viele der Tutorials enthalten Codeblöcke. In den meisten Fällen handelt es sich bei diesen Codeblöcken um vollständige Anwendungen, die unverändert ausgeführt werden können. Tatsächlich sind diese Codeblöcke nicht Teil des Markdowns, sondern Python-Dateien im Verzeichnis `./docs_src/`. Und diese Python-Dateien werden beim Generieren der Site in die Dokumentation eingefügt. ### Dokumentation für Tests Tatsächlich arbeiten die meisten Tests mit den Beispielquelldateien in der Dokumentation. Dadurch wird sichergestellt, dass: * Die Dokumentation aktuell ist. * Die Dokumentationsbeispiele ohne Änderung ausgeführt werden können. * Die meisten Funktionalitäten durch die Dokumentation abgedeckt werden, sichergestellt durch die Testabdeckung. #### Gleichzeitig Apps und Dokumentation Wenn Sie die Beispiele ausführen, mit z. B.:
```console $ uvicorn tutorial001:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
wird das, da Uvicorn standardmäßig den Port `8000` verwendet, mit der Dokumentation auf dem Port `8008` nicht in Konflikt geraten. ### Übersetzungen Hilfe bei Übersetzungen wird SEHR geschätzt! Und es kann nicht getan werden, ohne die Hilfe der Gemeinschaft. 🌎 🚀 Hier sind die Schritte, die Ihnen bei Übersetzungen helfen. #### Tipps und Richtlinien * Schauen Sie nach aktuellen Pull Requests für Ihre Sprache. Sie können die Pull Requests nach dem Label für Ihre Sprache filtern. Für Spanisch lautet das Label beispielsweise `lang-es`. * Sehen Sie diese Pull Requests durch (Review), schlagen Sie Änderungen vor, oder segnen Sie sie ab (Approval). Bei den Sprachen, die ich nicht spreche, warte ich, bis mehrere andere die Übersetzung durchgesehen haben, bevor ich den Pull Request merge. !!! tip "Tipp" Sie können Kommentare mit Änderungsvorschlägen zu vorhandenen Pull Requests hinzufügen. Schauen Sie sich die Dokumentation an, wie man ein Review zu einem Pull Request hinzufügt, welches den PR absegnet oder Änderungen vorschlägt. * Überprüfen Sie, ob es eine GitHub-Diskussion gibt, die Übersetzungen für Ihre Sprache koordiniert. Sie können sie abonnieren, und wenn ein neuer Pull Request zum Review vorliegt, wird der Diskussion automatisch ein Kommentar hinzugefügt. * Wenn Sie Seiten übersetzen, fügen Sie einen einzelnen Pull Request pro übersetzter Seite hinzu. Dadurch wird es für andere viel einfacher, ihn zu durchzusehen. * Um den Zwei-Buchstaben-Code für die Sprache zu finden, die Sie übersetzen möchten, schauen Sie sich die Tabelle List of ISO 639-1 codes an. #### Vorhandene Sprache Angenommen, Sie möchten eine Seite für eine Sprache übersetzen, die bereits Übersetzungen für einige Seiten hat, beispielsweise für Spanisch. Im Spanischen lautet der Zwei-Buchstaben-Code `es`. Das Verzeichnis für spanische Übersetzungen befindet sich also unter `docs/es/`. !!! tip "Tipp" Die Haupt („offizielle“) Sprache ist Englisch und befindet sich unter `docs/en/`. Führen Sie nun den Live-Server für die Dokumentation auf Spanisch aus:
```console // Verwenden Sie das Kommando „live“ und fügen Sie den Sprach-Code als Argument hinten an $ python ./scripts/docs.py live es [INFO] Serving on http://127.0.0.1:8008 [INFO] Start watching changes [INFO] Start detecting changes ```
!!! tip "Tipp" Alternativ können Sie die Schritte des Skripts auch manuell ausführen. Gehen Sie in das Sprachverzeichnis, für die spanischen Übersetzungen ist das `docs/es/`: ```console $ cd docs/es/ ``` Dann führen Sie in dem Verzeichnis `mkdocs` aus: ```console $ mkdocs serve --dev-addr 8008 ``` Jetzt können Sie auf http://127.0.0.1:8008 gehen und Ihre Änderungen live sehen. Sie werden sehen, dass jede Sprache alle Seiten hat. Einige Seiten sind jedoch nicht übersetzt und haben oben eine Info-Box, dass die Übersetzung noch fehlt. Nehmen wir nun an, Sie möchten eine Übersetzung für den Abschnitt [Features](features.md){.internal-link target=_blank} hinzufügen. * Kopieren Sie die Datei: ``` docs/en/docs/features.md ``` * Fügen Sie sie an genau derselben Stelle ein, jedoch für die Sprache, die Sie übersetzen möchten, z. B.: ``` docs/es/docs/features.md ``` !!! tip "Tipp" Beachten Sie, dass die einzige Änderung in Pfad und Dateiname der Sprachcode ist, von `en` zu `es`. Wenn Sie in Ihrem Browser nachsehen, werden Sie feststellen, dass die Dokumentation jetzt Ihren neuen Abschnitt anzeigt (die Info-Box oben ist verschwunden). 🎉 Jetzt können Sie alles übersetzen und beim Speichern sehen, wie es aussieht. #### Neue Sprache Nehmen wir an, Sie möchten Übersetzungen für eine Sprache hinzufügen, die noch nicht übersetzt ist, nicht einmal einige Seiten. Angenommen, Sie möchten Übersetzungen für Kreolisch hinzufügen, diese sind jedoch noch nicht in den Dokumenten enthalten. Wenn Sie den Link von oben überprüfen, lautet der Sprachcode für Kreolisch `ht`. Der nächste Schritt besteht darin, das Skript auszuführen, um ein neues Übersetzungsverzeichnis zu erstellen:
```console // Verwenden Sie das Kommando new-lang und fügen Sie den Sprach-Code als Argument hinten an $ python ./scripts/docs.py new-lang ht Successfully initialized: docs/ht ```
Jetzt können Sie in Ihrem Code-Editor das neu erstellte Verzeichnis `docs/ht/` sehen. Obiges Kommando hat eine Datei `docs/ht/mkdocs.yml` mit einer Minimal-Konfiguration erstellt, die alles von der `en`-Version erbt: ```yaml INHERIT: ../en/mkdocs.yml ``` !!! tip "Tipp" Sie können diese Datei mit diesem Inhalt auch einfach manuell erstellen. Das Kommando hat auch eine Dummy-Datei `docs/ht/index.md` für die Hauptseite erstellt. Sie können mit der Übersetzung dieser Datei beginnen. Sie können nun mit den obigen Instruktionen für eine „vorhandene Sprache“ fortfahren. Fügen Sie dem ersten Pull Request beide Dateien `docs/ht/mkdocs.yml` und `docs/ht/index.md` bei. 🎉 #### Vorschau des Ergebnisses Wie bereits oben erwähnt, können Sie `./scripts/docs.py` mit dem Befehl `live` verwenden, um eine Vorschau der Ergebnisse anzuzeigen (oder `mkdocs serve`). Sobald Sie fertig sind, können Sie auch alles so testen, wie es online aussehen würde, einschließlich aller anderen Sprachen. Bauen Sie dazu zunächst die gesamte Dokumentation:
```console // Verwenden Sie das Kommando „build-all“, das wird ein wenig dauern $ python ./scripts/docs.py build-all Building docs for: en Building docs for: es Successfully built docs for: es ```
Dadurch werden alle diese unabhängigen MkDocs-Sites für jede Sprache erstellt, kombiniert und das endgültige Resultat unter `./site/` gespeichert. Dieses können Sie dann mit dem Befehl `serve` bereitstellen:
```console // Verwenden Sie das Kommando „serve“ nachdem Sie „build-all“ ausgeführt haben. $ python ./scripts/docs.py serve Warning: this is a very simple server. For development, use mkdocs serve instead. This is here only to preview a site with translations already built. Make sure you run the build-all command first. Serving at: http://127.0.0.1:8008 ```
#### Übersetzungsspezifische Tipps und Richtlinien * Übersetzen Sie nur die Markdown-Dokumente (`.md`). Übersetzen Sie nicht die Codebeispiele unter `./docs_src`. * In Codeblöcken innerhalb des Markdown-Dokuments, übersetzen Sie Kommentare (`# ein Kommentar`), aber lassen Sie den Rest unverändert. * Ändern Sie nichts, was in "``" (Inline-Code) eingeschlossen ist. * In Zeilen, die mit `===` oder `!!!` beginnen, übersetzen Sie nur den ` "... Text ..."`-Teil. Lassen Sie den Rest unverändert. * Sie können Info-Boxen wie `!!! warning` mit beispielsweise `!!! warning "Achtung"` übersetzen. Aber ändern Sie nicht das Wort direkt nach dem `!!!`, es bestimmt die Farbe der Info-Box. * Ändern Sie nicht die Pfade in Links zu Bildern, Codedateien, Markdown Dokumenten. * Wenn ein Markdown-Dokument übersetzt ist, ändern sich allerdings unter Umständen die `#hash-teile` in Links zu dessen Überschriften. Aktualisieren Sie diese Links, wenn möglich. * Suchen Sie im übersetzten Dokument nach solchen Links mit dem Regex `#[^# ]`. * Suchen Sie in allen bereits in ihre Sprache übersetzen Dokumenten nach `ihr-ubersetztes-dokument.md`. VS Code hat beispielsweise eine Option „Bearbeiten“ -> „In Dateien suchen“. * Übersetzen Sie bei der Übersetzung eines Dokuments nicht „im Voraus“ `#hash-teile`, die zu Überschriften in noch nicht übersetzten Dokumenten verlinken. ## Tests Es gibt ein Skript, das Sie lokal ausführen können, um den gesamten Code zu testen und Code Coverage Reporte in HTML zu generieren:
```console $ bash scripts/test-cov-html.sh ```
Dieses Kommando generiert ein Verzeichnis `./htmlcov/`. Wenn Sie die Datei `./htmlcov/index.html` in Ihrem Browser öffnen, können Sie interaktiv die Codebereiche erkunden, die von den Tests abgedeckt werden, und feststellen, ob Bereiche fehlen. fastapi-0.110.3/docs/de/docs/deployment/000077500000000000000000000000001461403617600177435ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/deployment/cloud.md000066400000000000000000000026751461403617600214050ustar00rootroot00000000000000# FastAPI-Deployment bei Cloud-Anbietern Sie können praktisch **jeden Cloud-Anbieter** für das Deployment Ihrer FastAPI-Anwendung verwenden. In den meisten Fällen verfügen die Haupt-Cloud-Anbieter über Anleitungen zum Deployment von FastAPI. ## Cloud-Anbieter – Sponsoren Einige Cloud-Anbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#den-autor-sponsern){.internal-link target=_blank} ✨, dies gewährleistet die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ökosystem**. Und es zeigt deren wahres Engagement für FastAPI und seine **Community** (Sie), da diese Ihnen nicht nur einen **guten Service** bieten möchten, sondern auch sicherstellen möchten, dass Sie über ein **gutes und gesundes Framework** verfügen, FastAPI. 🙇 Vielleicht möchten Sie deren Dienste ausprobieren und deren Anleitungen folgen: * Platform.sh * Porter * Coherence fastapi-0.110.3/docs/de/docs/deployment/concepts.md000066400000000000000000000512231461403617600221060ustar00rootroot00000000000000# Deployment-Konzepte Bei dem Deployment – der Bereitstellung – einer **FastAPI**-Anwendung, oder eigentlich jeder Art von Web-API, gibt es mehrere Konzepte, die Sie wahrscheinlich interessieren, und mithilfe der Sie die **am besten geeignete** Methode zur **Bereitstellung Ihrer Anwendung** finden können. Einige wichtige Konzepte sind: * Sicherheit – HTTPS * Beim Hochfahren ausführen * Neustarts * Replikation (die Anzahl der laufenden Prozesse) * Arbeitsspeicher * Schritte vor dem Start Wir werden sehen, wie diese sich auf das **Deployment** auswirken. Letztendlich besteht das ultimative Ziel darin, **Ihre API-Clients** auf **sichere** Weise zu bedienen, um **Unterbrechungen** zu vermeiden und die **Rechenressourcen** (z. B. entfernte Server/virtuelle Maschinen) so effizient wie möglich zu nutzen. 🚀 Ich erzähle Ihnen hier etwas mehr über diese **Konzepte**, was Ihnen hoffentlich die **Intuition** gibt, die Sie benötigen, um zu entscheiden, wie Sie Ihre API in sehr unterschiedlichen Umgebungen bereitstellen, möglicherweise sogar in **zukünftigen**, die jetzt noch nicht existieren. Durch die Berücksichtigung dieser Konzepte können Sie die beste Variante der Bereitstellung **Ihrer eigenen APIs** **evaluieren und konzipieren**. In den nächsten Kapiteln werde ich Ihnen mehr **konkrete Rezepte** für die Bereitstellung von FastAPI-Anwendungen geben. Aber schauen wir uns zunächst einmal diese grundlegenden **konzeptionellen Ideen** an. Diese Konzepte gelten auch für jede andere Art von Web-API. 💡 ## Sicherheit – HTTPS Im [vorherigen Kapitel über HTTPS](https.md){.internal-link target=_blank} haben wir erfahren, wie HTTPS Verschlüsselung für Ihre API bereitstellt. Wir haben auch gesehen, dass HTTPS normalerweise von einer Komponente **außerhalb** Ihres Anwendungsservers bereitgestellt wird, einem **TLS-Terminierungsproxy**. Und es muss etwas geben, das für die **Erneuerung der HTTPS-Zertifikate** zuständig ist, es könnte sich um dieselbe Komponente handeln oder um etwas anderes. ### Beispieltools für HTTPS Einige der Tools, die Sie als TLS-Terminierungsproxy verwenden können, sind: * Traefik * Handhabt automatisch Zertifikat-Erneuerungen ✨ * Caddy * Handhabt automatisch Zertifikat-Erneuerungen ✨ * Nginx * Mit einer externen Komponente wie Certbot für Zertifikat-Erneuerungen * HAProxy * Mit einer externen Komponente wie Certbot für Zertifikat-Erneuerungen * Kubernetes mit einem Ingress Controller wie Nginx * Mit einer externen Komponente wie cert-manager für Zertifikat-Erneuerungen * Es wird intern von einem Cloud-Anbieter als Teil seiner Dienste verwaltet (siehe unten 👇) Eine andere Möglichkeit besteht darin, dass Sie einen **Cloud-Dienst** verwenden, der den größten Teil der Arbeit übernimmt, einschließlich der Einrichtung von HTTPS. Er könnte einige Einschränkungen haben oder Ihnen mehr in Rechnung stellen, usw. In diesem Fall müssten Sie jedoch nicht selbst einen TLS-Terminierungsproxy einrichten. In den nächsten Kapiteln zeige ich Ihnen einige konkrete Beispiele. --- Die nächsten zu berücksichtigenden Konzepte drehen sich dann um das Programm, das Ihre eigentliche API ausführt (z. B. Uvicorn). ## Programm und Prozess Wir werden viel über den laufenden „**Prozess**“ sprechen, daher ist es nützlich, Klarheit darüber zu haben, was das bedeutet und was der Unterschied zum Wort „**Programm**“ ist. ### Was ist ein Programm? Das Wort **Programm** wird häufig zur Beschreibung vieler Dinge verwendet: * Der **Code**, den Sie schreiben, die **Python-Dateien**. * Die **Datei**, die vom Betriebssystem **ausgeführt** werden kann, zum Beispiel: `python`, `python.exe` oder `uvicorn`. * Ein bestimmtes Programm, während es auf dem Betriebssystem **läuft**, die CPU nutzt und Dinge im Arbeitsspeicher ablegt. Dies wird auch als **Prozess** bezeichnet. ### Was ist ein Prozess? Das Wort **Prozess** wird normalerweise spezifischer verwendet und bezieht sich nur auf das, was im Betriebssystem ausgeführt wird (wie im letzten Punkt oben): * Ein bestimmtes Programm, während es auf dem Betriebssystem **ausgeführt** wird. * Dies bezieht sich weder auf die Datei noch auf den Code, sondern **speziell** auf das, was vom Betriebssystem **ausgeführt** und verwaltet wird. * Jedes Programm, jeder Code **kann nur dann Dinge tun**, wenn er **ausgeführt** wird, wenn also ein **Prozess läuft**. * Der Prozess kann von Ihnen oder vom Betriebssystem **terminiert** („beendet“, „gekillt“) werden. An diesem Punkt hört es auf zu laufen/ausgeführt zu werden und kann **keine Dinge mehr tun**. * Hinter jeder Anwendung, die Sie auf Ihrem Computer ausführen, steckt ein Prozess, jedes laufende Programm, jedes Fenster usw. Und normalerweise laufen viele Prozesse **gleichzeitig**, während ein Computer eingeschaltet ist. * Es können **mehrere Prozesse** desselben **Programms** gleichzeitig ausgeführt werden. Wenn Sie sich den „Task-Manager“ oder „Systemmonitor“ (oder ähnliche Tools) in Ihrem Betriebssystem ansehen, können Sie viele dieser laufenden Prozesse sehen. Und Sie werden beispielsweise wahrscheinlich feststellen, dass mehrere Prozesse dasselbe Browserprogramm ausführen (Firefox, Chrome, Edge, usw.). Normalerweise führen diese einen Prozess pro Browsertab sowie einige andere zusätzliche Prozesse aus. --- Nachdem wir nun den Unterschied zwischen den Begriffen **Prozess** und **Programm** kennen, sprechen wir weiter über das Deployment. ## Beim Hochfahren ausführen Wenn Sie eine Web-API erstellen, möchten Sie in den meisten Fällen, dass diese **immer läuft**, ununterbrochen, damit Ihre Clients immer darauf zugreifen können. Es sei denn natürlich, Sie haben einen bestimmten Grund, warum Sie möchten, dass diese nur in bestimmten Situationen ausgeführt wird. Meistens möchten Sie jedoch, dass sie ständig ausgeführt wird und **verfügbar** ist. ### Auf einem entfernten Server Wenn Sie einen entfernten Server (einen Cloud-Server, eine virtuelle Maschine, usw.) einrichten, können Sie am einfachsten Uvicorn (oder ähnliches) manuell ausführen, genau wie bei der lokalen Entwicklung. Und es wird funktionieren und **während der Entwicklung** nützlich sein. Wenn Ihre Verbindung zum Server jedoch unterbrochen wird, wird der **laufende Prozess** wahrscheinlich abstürzen. Und wenn der Server neu gestartet wird (z. B. nach Updates oder Migrationen vom Cloud-Anbieter), werden Sie das wahrscheinlich **nicht bemerken**. Und deshalb wissen Sie nicht einmal, dass Sie den Prozess manuell neu starten müssen. Ihre API bleibt also einfach tot. 😱 ### Beim Hochfahren automatisch ausführen Im Allgemeinen möchten Sie wahrscheinlich, dass das Serverprogramm (z. B. Uvicorn) beim Hochfahren des Servers automatisch gestartet wird und kein **menschliches Eingreifen** erforderlich ist, sodass immer ein Prozess mit Ihrer API ausgeführt wird (z. B. Uvicorn, welches Ihre FastAPI-Anwendung ausführt). ### Separates Programm Um dies zu erreichen, haben Sie normalerweise ein **separates Programm**, welches sicherstellt, dass Ihre Anwendung beim Hochfahren ausgeführt wird. Und in vielen Fällen würde es auch sicherstellen, dass auch andere Komponenten oder Anwendungen ausgeführt werden, beispielsweise eine Datenbank. ### Beispieltools zur Ausführung beim Hochfahren Einige Beispiele für Tools, die diese Aufgabe übernehmen können, sind: * Docker * Kubernetes * Docker Compose * Docker im Schwarm-Modus * Systemd * Supervisor * Es wird intern von einem Cloud-Anbieter im Rahmen seiner Dienste verwaltet * Andere ... In den nächsten Kapiteln werde ich Ihnen konkretere Beispiele geben. ## Neustart Ähnlich wie Sie sicherstellen möchten, dass Ihre Anwendung beim Hochfahren ausgeführt wird, möchten Sie wahrscheinlich auch sicherstellen, dass diese nach Fehlern **neu gestartet** wird. ### Wir machen Fehler Wir, als Menschen, machen ständig **Fehler**. Software hat fast *immer* **Bugs**, die an verschiedenen Stellen versteckt sind. 🐛 Und wir als Entwickler verbessern den Code ständig, wenn wir diese Bugs finden und neue Funktionen implementieren (und möglicherweise auch neue Bugs hinzufügen 😅). ### Kleine Fehler automatisch handhaben Wenn beim Erstellen von Web-APIs mit FastAPI ein Fehler in unserem Code auftritt, wird FastAPI ihn normalerweise dem einzelnen Request zurückgeben, der den Fehler ausgelöst hat. 🛡 Der Client erhält für diesen Request einen **500 Internal Server Error**, aber die Anwendung arbeitet bei den nächsten Requests weiter, anstatt einfach komplett abzustürzen. ### Größere Fehler – Abstürze Dennoch kann es vorkommen, dass wir Code schreiben, der **die gesamte Anwendung zum Absturz bringt** und so zum Absturz von Uvicorn und Python führt. 💥 Und dennoch möchten Sie wahrscheinlich nicht, dass die Anwendung tot bleibt, weil an einer Stelle ein Fehler aufgetreten ist. Sie möchten wahrscheinlich, dass sie zumindest für die *Pfadoperationen*, die nicht fehlerhaft sind, **weiterläuft**. ### Neustart nach Absturz Aber in den Fällen mit wirklich schwerwiegenden Fehlern, die den laufenden **Prozess** zum Absturz bringen, benötigen Sie eine externe Komponente, die den Prozess **neu startet**, zumindest ein paar Mal ... !!! tip "Tipp" ... Obwohl es wahrscheinlich keinen Sinn macht, sie immer wieder neu zu starten, wenn die gesamte Anwendung einfach **sofort abstürzt**. Aber in diesen Fällen werden Sie es wahrscheinlich während der Entwicklung oder zumindest direkt nach dem Deployment bemerken. Konzentrieren wir uns also auf die Hauptfälle, in denen die Anwendung in bestimmten Fällen **in der Zukunft** völlig abstürzen könnte und es dann dennoch sinnvoll ist, sie neu zu starten. Sie möchten wahrscheinlich, dass eine **externe Komponente** für den Neustart Ihrer Anwendung verantwortlich ist, da zu diesem Zeitpunkt dieselbe Anwendung mit Uvicorn und Python bereits abgestürzt ist und es daher nichts im selben Code derselben Anwendung gibt, was etwas dagegen tun kann. ### Beispieltools zum automatischen Neustart In den meisten Fällen wird dasselbe Tool, das zum **Ausführen des Programms beim Hochfahren** verwendet wird, auch für automatische **Neustarts** verwendet. Dies könnte zum Beispiel erledigt werden durch: * Docker * Kubernetes * Docker Compose * Docker im Schwarm-Modus * Systemd * Supervisor * Intern von einem Cloud-Anbieter im Rahmen seiner Dienste * Andere ... ## Replikation – Prozesse und Arbeitsspeicher Wenn Sie eine FastAPI-Anwendung verwenden und ein Serverprogramm wie Uvicorn verwenden, kann **ein einzelner Prozess** mehrere Clients gleichzeitig bedienen. In vielen Fällen möchten Sie jedoch mehrere Prozesse gleichzeitig ausführen. ### Mehrere Prozesse – Worker Wenn Sie mehr Clients haben, als ein einzelner Prozess verarbeiten kann (z. B. wenn die virtuelle Maschine nicht sehr groß ist) und die CPU des Servers **mehrere Kerne** hat, dann könnten **mehrere Prozesse** gleichzeitig mit derselben Anwendung laufen und alle Requests unter sich verteilen. Wenn Sie mit **mehreren Prozessen** dasselbe API-Programm ausführen, werden diese üblicherweise als **Worker** bezeichnet. ### Workerprozesse und Ports Erinnern Sie sich aus der Dokumentation [Über HTTPS](https.md){.internal-link target=_blank}, dass nur ein Prozess auf einer Kombination aus Port und IP-Adresse auf einem Server lauschen kann? Das ist immer noch wahr. Um also **mehrere Prozesse** gleichzeitig zu haben, muss es einen **einzelnen Prozess geben, der einen Port überwacht**, welcher dann die Kommunikation auf irgendeine Weise an jeden Workerprozess überträgt. ### Arbeitsspeicher pro Prozess Wenn das Programm nun Dinge in den Arbeitsspeicher lädt, zum Beispiel ein Modell für maschinelles Lernen in einer Variablen oder den Inhalt einer großen Datei in einer Variablen, verbraucht das alles **einen Teil des Arbeitsspeichers (RAM – Random Access Memory)** des Servers. Und mehrere Prozesse teilen sich normalerweise keinen Speicher. Das bedeutet, dass jeder laufende Prozess seine eigenen Dinge, eigenen Variablen und eigenen Speicher hat. Und wenn Sie in Ihrem Code viel Speicher verbrauchen, verbraucht **jeder Prozess** die gleiche Menge Speicher. ### Serverspeicher Wenn Ihr Code beispielsweise ein Machine-Learning-Modell mit **1 GB Größe** lädt und Sie einen Prozess mit Ihrer API ausführen, verbraucht dieser mindestens 1 GB RAM. Und wenn Sie **4 Prozesse** (4 Worker) starten, verbraucht jeder 1 GB RAM. Insgesamt verbraucht Ihre API also **4 GB RAM**. Und wenn Ihr entfernter Server oder Ihre virtuelle Maschine nur über 3 GB RAM verfügt, führt der Versuch, mehr als 4 GB RAM zu laden, zu Problemen. 🚨 ### Mehrere Prozesse – Ein Beispiel Im folgenden Beispiel gibt es einen **Manager-Prozess**, welcher zwei **Workerprozesse** startet und steuert. Dieser Manager-Prozess wäre wahrscheinlich derjenige, welcher der IP am **Port** lauscht. Und er würde die gesamte Kommunikation an die Workerprozesse weiterleiten. Diese Workerprozesse würden Ihre Anwendung ausführen, sie würden die Hauptberechnungen durchführen, um einen **Request** entgegenzunehmen und eine **Response** zurückzugeben, und sie würden alles, was Sie in Variablen einfügen, in den RAM laden. Und natürlich würden auf derselben Maschine neben Ihrer Anwendung wahrscheinlich auch **andere Prozesse** laufen. Ein interessantes Detail ist dabei, dass der Prozentsatz der von jedem Prozess verwendeten **CPU** im Laufe der Zeit stark **variieren** kann, der **Arbeitsspeicher (RAM)** jedoch normalerweise mehr oder weniger **stabil** bleibt. Wenn Sie eine API haben, die jedes Mal eine vergleichbare Menge an Berechnungen durchführt, und Sie viele Clients haben, dann wird die **CPU-Auslastung** wahrscheinlich *ebenfalls stabil sein* (anstatt ständig schnell zu steigen und zu fallen). ### Beispiele für Replikation-Tools und -Strategien Es gibt mehrere Ansätze, um dies zu erreichen, und ich werde Ihnen in den nächsten Kapiteln mehr über bestimmte Strategien erzählen, beispielsweise wenn es um Docker und Container geht. Die wichtigste zu berücksichtigende Einschränkung besteht darin, dass es eine **einzelne** Komponente geben muss, welche die **öffentliche IP** auf dem **Port** verwaltet. Und dann muss diese irgendwie die Kommunikation **weiterleiten**, an die replizierten **Prozesse/Worker**. Hier sind einige mögliche Kombinationen und Strategien: * **Gunicorn**, welches **Uvicorn-Worker** managt * Gunicorn wäre der **Prozessmanager**, der die **IP** und den **Port** überwacht, die Replikation würde durch **mehrere Uvicorn-Workerprozesse** erfolgen * **Uvicorn**, welches **Uvicorn-Worker** managt * Ein Uvicorn-**Prozessmanager** würde der **IP** am **Port** lauschen, und er würde **mehrere Uvicorn-Workerprozesse** starten. * **Kubernetes** und andere verteilte **Containersysteme** * Etwas in der **Kubernetes**-Ebene würde die **IP** und den **Port** abhören. Die Replikation hätte **mehrere Container**, in jedem wird jeweils **ein Uvicorn-Prozess** ausgeführt. * **Cloud-Dienste**, welche das für Sie erledigen * Der Cloud-Dienst wird wahrscheinlich **die Replikation für Sie übernehmen**. Er würde Sie möglicherweise **einen auszuführenden Prozess** oder ein **zu verwendendes Container-Image** definieren lassen, in jedem Fall wäre es höchstwahrscheinlich **ein einzelner Uvicorn-Prozess**, und der Cloud-Dienst wäre auch verantwortlich für die Replikation. !!! tip "Tipp" Machen Sie sich keine Sorgen, wenn einige dieser Punkte zu **Containern**, Docker oder Kubernetes noch nicht viel Sinn ergeben. Ich werde Ihnen in einem zukünftigen Kapitel mehr über Container-Images, Docker, Kubernetes, usw. erzählen: [FastAPI in Containern – Docker](docker.md){.internal-link target=_blank}. ## Schritte vor dem Start Es gibt viele Fälle, in denen Sie, **bevor Sie Ihre Anwendung starten**, einige Schritte ausführen möchten. Beispielsweise möchten Sie möglicherweise **Datenbankmigrationen** ausführen. In den meisten Fällen möchten Sie diese Schritte jedoch nur **einmal** ausführen. Sie möchten also einen **einzelnen Prozess** haben, um diese **Vorab-Schritte** auszuführen, bevor Sie die Anwendung starten. Und Sie müssen sicherstellen, dass es sich um einen einzelnen Prozess handelt, der die Vorab-Schritte ausführt, *auch* wenn Sie anschließend **mehrere Prozesse** (mehrere Worker) für die Anwendung selbst starten. Wenn diese Schritte von **mehreren Prozessen** ausgeführt würden, würden diese die Arbeit **verdoppeln**, indem sie sie **parallel** ausführen, und wenn es sich bei den Schritten um etwas Delikates wie eine Datenbankmigration handelt, könnte das miteinander Konflikte verursachen. Natürlich gibt es Fälle, in denen es kein Problem darstellt, die Vorab-Schritte mehrmals auszuführen. In diesem Fall ist die Handhabung viel einfacher. !!! tip "Tipp" Bedenken Sie außerdem, dass Sie, abhängig von Ihrer Einrichtung, in manchen Fällen **gar keine Vorab-Schritte** benötigen, bevor Sie die Anwendung starten. In diesem Fall müssen Sie sich darüber keine Sorgen machen. 🤷 ### Beispiele für Strategien für Vorab-Schritte Es hängt **stark** davon ab, wie Sie **Ihr System bereitstellen**, und hängt wahrscheinlich mit der Art und Weise zusammen, wie Sie Programme starten, Neustarts durchführen, usw. Hier sind einige mögliche Ideen: * Ein „Init-Container“ in Kubernetes, der vor Ihrem Anwendungs-Container ausgeführt wird * Ein Bash-Skript, das die Vorab-Schritte ausführt und dann Ihre Anwendung startet * Sie benötigen immer noch eine Möglichkeit, *dieses* Bash-Skript zu starten/neu zu starten, Fehler zu erkennen, usw. !!! tip "Tipp" Konkretere Beispiele hierfür mit Containern gebe ich Ihnen in einem späteren Kapitel: [FastAPI in Containern – Docker](docker.md){.internal-link target=_blank}. ## Ressourcennutzung Ihr(e) Server ist (sind) eine **Ressource**, welche Sie mit Ihren Programmen, der Rechenzeit auf den CPUs und dem verfügbaren RAM-Speicher verbrauchen oder **nutzen** können. Wie viele Systemressourcen möchten Sie verbrauchen/nutzen? Sie mögen „nicht viel“ denken, aber in Wirklichkeit möchten Sie tatsächlich **so viel wie möglich ohne Absturz** verwenden. Wenn Sie für drei Server bezahlen, aber nur wenig von deren RAM und CPU nutzen, **verschwenden Sie wahrscheinlich Geld** 💸 und wahrscheinlich **Strom für den Server** 🌎, usw. In diesem Fall könnte es besser sein, nur zwei Server zu haben und einen höheren Prozentsatz von deren Ressourcen zu nutzen (CPU, Arbeitsspeicher, Festplatte, Netzwerkbandbreite, usw.). Wenn Sie andererseits über zwei Server verfügen und **100 % ihrer CPU und ihres RAM** nutzen, wird irgendwann ein Prozess nach mehr Speicher fragen und der Server muss die Festplatte als „Speicher“ verwenden (was tausendmal langsamer sein kann) oder er könnte sogar **abstürzen**. Oder ein Prozess muss möglicherweise einige Berechnungen durchführen und müsste warten, bis die CPU wieder frei ist. In diesem Fall wäre es besser, **einen zusätzlichen Server** zu besorgen und einige Prozesse darauf auszuführen, damit alle über **genug RAM und CPU-Zeit** verfügen. Es besteht auch die Möglichkeit, dass es aus irgendeinem Grund zu **Spitzen** in der Nutzung Ihrer API kommt. Vielleicht ist diese viral gegangen, oder vielleicht haben andere Dienste oder Bots damit begonnen, sie zu nutzen. Und vielleicht möchten Sie in solchen Fällen über zusätzliche Ressourcen verfügen, um auf der sicheren Seite zu sein. Sie können eine **beliebige Zahl** festlegen, um beispielsweise eine Ressourcenauslastung zwischen **50 % und 90 %** anzustreben. Der Punkt ist, dass dies wahrscheinlich die wichtigen Dinge sind, die Sie messen und verwenden sollten, um Ihre Deployments zu optimieren. Sie können einfache Tools wie `htop` verwenden, um die in Ihrem Server verwendete CPU und den RAM oder die von jedem Prozess verwendete Menge anzuzeigen. Oder Sie können komplexere Überwachungstools verwenden, die möglicherweise auf mehrere Server usw. verteilt sind. ## Zusammenfassung Sie haben hier einige der wichtigsten Konzepte gelesen, die Sie wahrscheinlich berücksichtigen müssen, wenn Sie entscheiden, wie Sie Ihre Anwendung bereitstellen: * Sicherheit – HTTPS * Beim Hochfahren ausführen * Neustarts * Replikation (die Anzahl der laufenden Prozesse) * Arbeitsspeicher * Schritte vor dem Start Das Verständnis dieser Ideen und deren Anwendung sollte Ihnen die nötige Intuition vermitteln, um bei der Konfiguration und Optimierung Ihrer Deployments Entscheidungen zu treffen. 🤓 In den nächsten Abschnitten gebe ich Ihnen konkretere Beispiele für mögliche Strategien, die Sie verfolgen können. 🚀 fastapi-0.110.3/docs/de/docs/deployment/docker.md000066400000000000000000001156571461403617600215530ustar00rootroot00000000000000# FastAPI in Containern – Docker Beim Deployment von FastAPI-Anwendungen besteht ein gängiger Ansatz darin, ein **Linux-Containerimage** zu erstellen. Normalerweise erfolgt dies mit **Docker**. Sie können dieses Containerimage dann auf eine von mehreren möglichen Arten bereitstellen. Die Verwendung von Linux-Containern bietet mehrere Vorteile, darunter **Sicherheit**, **Replizierbarkeit**, **Einfachheit** und andere. !!! tip "Tipp" Sie haben es eilig und kennen sich bereits aus? Springen Sie zum [`Dockerfile` unten 👇](#ein-docker-image-fur-fastapi-erstellen).
Dockerfile-Vorschau 👀 ```Dockerfile FROM python:3.9 WORKDIR /code COPY ./requirements.txt /code/requirements.txt RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt COPY ./app /code/app CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] # Wenn Sie hinter einem Proxy wie Nginx oder Traefik sind, fügen Sie --proxy-headers hinzu # CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--proxy-headers"] ```
## Was ist ein Container? Container (hauptsächlich Linux-Container) sind eine sehr **leichtgewichtige** Möglichkeit, Anwendungen einschließlich aller ihrer Abhängigkeiten und erforderlichen Dateien zu verpacken und sie gleichzeitig von anderen Containern (anderen Anwendungen oder Komponenten) im selben System isoliert zu halten. Linux-Container werden mit demselben Linux-Kernel des Hosts (Maschine, virtuellen Maschine, Cloud-Servers, usw.) ausgeführt. Das bedeutet einfach, dass sie sehr leichtgewichtig sind (im Vergleich zu vollständigen virtuellen Maschinen, die ein gesamtes Betriebssystem emulieren). Auf diese Weise verbrauchen Container **wenig Ressourcen**, eine Menge vergleichbar mit der direkten Ausführung der Prozesse (eine virtuelle Maschine würde viel mehr verbrauchen). Container verfügen außerdem über ihre eigenen **isoliert** laufenden Prozesse (üblicherweise nur einen Prozess), über ihr eigenes Dateisystem und ihr eigenes Netzwerk, was die Bereitstellung, Sicherheit, Entwicklung usw. vereinfacht. ## Was ist ein Containerimage? Ein **Container** wird von einem **Containerimage** ausgeführt. Ein Containerimage ist eine **statische** Version aller Dateien, Umgebungsvariablen und des Standardbefehls/-programms, welche in einem Container vorhanden sein sollten. **Statisch** bedeutet hier, dass das Container-**Image** nicht läuft, nicht ausgeführt wird, sondern nur die gepackten Dateien und Metadaten enthält. Im Gegensatz zu einem „**Containerimage**“, bei dem es sich um den gespeicherten statischen Inhalt handelt, bezieht sich ein „**Container**“ normalerweise auf die laufende Instanz, das Ding, das **ausgeführt** wird. Wenn der **Container** gestartet und ausgeführt wird (gestartet von einem **Containerimage**), kann er Dateien, Umgebungsvariablen usw. erstellen oder ändern. Diese Änderungen sind nur in diesem Container vorhanden, nicht im zugrunde liegenden bestehen Containerimage (werden nicht auf der Festplatte gespeichert). Ein Containerimage ist vergleichbar mit der **Programmdatei** und ihrem Inhalt, z. B. `python` und eine Datei `main.py`. Und der **Container** selbst (im Gegensatz zum **Containerimage**) ist die tatsächlich laufende Instanz des Images, vergleichbar mit einem **Prozess**. Tatsächlich läuft ein Container nur, wenn er einen **laufenden Prozess** hat (und normalerweise ist es nur ein einzelner Prozess). Der Container stoppt, wenn kein Prozess darin ausgeführt wird. ## Containerimages Docker ist eines der wichtigsten Tools zum Erstellen und Verwalten von **Containerimages** und **Containern**. Und es gibt einen öffentlichen Docker Hub mit vorgefertigten **offiziellen Containerimages** für viele Tools, Umgebungen, Datenbanken und Anwendungen. Beispielsweise gibt es ein offizielles Python-Image. Und es gibt viele andere Images für verschiedene Dinge wie Datenbanken, zum Beispiel für: * PostgreSQL * MySQL * MongoDB * Redis, usw. Durch die Verwendung eines vorgefertigten Containerimages ist es sehr einfach, verschiedene Tools zu **kombinieren** und zu verwenden. Zum Beispiel, um eine neue Datenbank auszuprobieren. In den meisten Fällen können Sie die **offiziellen Images** verwenden und diese einfach mit Umgebungsvariablen konfigurieren. Auf diese Weise können Sie in vielen Fällen etwas über Container und Docker lernen und dieses Wissen mit vielen verschiedenen Tools und Komponenten wiederverwenden. Sie würden also **mehrere Container** mit unterschiedlichen Dingen ausführen, wie einer Datenbank, einer Python-Anwendung, einem Webserver mit einer React-Frontend-Anwendung, und diese über ihr internes Netzwerk miteinander verbinden. In alle Containerverwaltungssysteme (wie Docker oder Kubernetes) sind diese Netzwerkfunktionen integriert. ## Container und Prozesse Ein **Containerimage** enthält normalerweise in seinen Metadaten das Standardprogramm oder den Standardbefehl, der ausgeführt werden soll, wenn der **Container** gestartet wird, sowie die Parameter, die an dieses Programm übergeben werden sollen. Sehr ähnlich zu dem, was wäre, wenn es über die Befehlszeile gestartet werden würde. Wenn ein **Container** gestartet wird, führt er diesen Befehl/dieses Programm aus (Sie können ihn jedoch überschreiben und einen anderen Befehl/ein anderes Programm ausführen lassen). Ein Container läuft, solange der **Hauptprozess** (Befehl oder Programm) läuft. Ein Container hat normalerweise einen **einzelnen Prozess**, aber es ist auch möglich, Unterprozesse vom Hauptprozess aus zu starten, und auf diese Weise haben Sie **mehrere Prozesse** im selben Container. Es ist jedoch nicht möglich, einen laufenden Container, ohne **mindestens einen laufenden Prozess** zu haben. Wenn der Hauptprozess stoppt, stoppt der Container. ## Ein Docker-Image für FastAPI erstellen Okay, wollen wir jetzt etwas bauen! 🚀 Ich zeige Ihnen, wie Sie ein **Docker-Image** für FastAPI **von Grund auf** erstellen, basierend auf dem **offiziellen Python**-Image. Das ist, was Sie in **den meisten Fällen** tun möchten, zum Beispiel: * Bei Verwendung von **Kubernetes** oder ähnlichen Tools * Beim Betrieb auf einem **Raspberry Pi** * Bei Verwendung eines Cloud-Dienstes, der ein Containerimage für Sie ausführt, usw. ### Paketanforderungen Normalerweise befinden sich die **Paketanforderungen** für Ihre Anwendung in einer Datei. Dies hängt hauptsächlich von dem Tool ab, mit dem Sie diese Anforderungen **installieren**. Die gebräuchlichste Methode besteht darin, eine Datei `requirements.txt` mit den Namen der Packages und deren Versionen zu erstellen, eine pro Zeile. Sie würden natürlich die gleichen Ideen verwenden, die Sie in [Über FastAPI-Versionen](versions.md){.internal-link target=_blank} gelesen haben, um die Versionsbereiche festzulegen. Ihre `requirements.txt` könnte beispielsweise so aussehen: ``` fastapi>=0.68.0,<0.69.0 pydantic>=1.8.0,<2.0.0 uvicorn>=0.15.0,<0.16.0 ``` Und normalerweise würden Sie diese Paketabhängigkeiten mit `pip` installieren, zum Beispiel:
```console $ pip install -r requirements.txt ---> 100% Successfully installed fastapi pydantic uvicorn ```
!!! info Es gibt andere Formate und Tools zum Definieren und Installieren von Paketabhängigkeiten. Ich zeige Ihnen später in einem Abschnitt unten ein Beispiel unter Verwendung von Poetry. 👇 ### Den **FastAPI**-Code erstellen * Erstellen Sie ein `app`-Verzeichnis und betreten Sie es. * Erstellen Sie eine leere Datei `__init__.py`. * Erstellen Sie eine `main.py`-Datei mit: ```Python from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ``` ### Dockerfile Erstellen Sie nun im selben Projektverzeichnis eine Datei `Dockerfile` mit: ```{ .dockerfile .annotate } # (1) FROM python:3.9 # (2) WORKDIR /code # (3) COPY ./requirements.txt /code/requirements.txt # (4) RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt # (5) COPY ./app /code/app # (6) CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] ``` 1. Beginne mit dem offiziellen Python-Basisimage. 2. Setze das aktuelle Arbeitsverzeichnis auf `/code`. Hier plazieren wir die Datei `requirements.txt` und das Verzeichnis `app`. 3. Kopiere die Datei mit den Paketanforderungen in das Verzeichnis `/code`. Kopieren Sie zuerst **nur** die Datei mit den Anforderungen, nicht den Rest des Codes. Da sich diese Datei **nicht oft ändert**, erkennt Docker das und verwendet den **Cache** für diesen Schritt, wodurch der Cache auch für den nächsten Schritt aktiviert wird. 4. Installiere die Paketabhängigkeiten aus der Anforderungsdatei. Die Option `--no-cache-dir` weist `pip` an, die heruntergeladenen Pakete nicht lokal zu speichern, da dies nur benötigt wird, sollte `pip` erneut ausgeführt werden, um dieselben Pakete zu installieren, aber das ist beim Arbeiten mit Containern nicht der Fall. !!! note "Hinweis" Das `--no-cache-dir` bezieht sich nur auf `pip`, es hat nichts mit Docker oder Containern zu tun. Die Option `--upgrade` weist `pip` an, die Packages zu aktualisieren, wenn sie bereits installiert sind. Da der vorherige Schritt des Kopierens der Datei vom **Docker-Cache** erkannt werden konnte, wird dieser Schritt auch **den Docker-Cache verwenden**, sofern verfügbar. Durch die Verwendung des Caches in diesem Schritt **sparen** Sie viel **Zeit**, wenn Sie das Image während der Entwicklung immer wieder erstellen, anstatt **jedes Mal** alle Abhängigkeiten **herunterzuladen und zu installieren**. 5. Kopiere das Verzeichnis `./app` in das Verzeichnis `/code`. Da hier der gesamte Code enthalten ist, der sich **am häufigsten ändert**, wird der Docker-**Cache** nicht ohne weiteres für diesen oder andere **folgende Schritte** verwendet. Daher ist es wichtig, dies **nahe dem Ende** des `Dockerfile`s zu platzieren, um die Erstellungszeiten des Containerimages zu optimieren. 6. Lege den **Befehl** fest, um den `uvicorn`-Server zu starten. `CMD` nimmt eine Liste von Zeichenfolgen entgegen. Jede dieser Zeichenfolgen entspricht dem, was Sie durch Leerzeichen getrennt in die Befehlszeile eingeben würden. Dieser Befehl wird aus dem **aktuellen Arbeitsverzeichnis** ausgeführt, dem gleichen `/code`-Verzeichnis, das Sie oben mit `WORKDIR /code` festgelegt haben. Da das Programm unter `/code` gestartet wird und sich darin das Verzeichnis `./app` mit Ihrem Code befindet, kann **Uvicorn** `app` sehen und aus `app.main` **importieren**. !!! tip "Tipp" Lernen Sie, was jede Zeile bewirkt, indem Sie auf die Zahlenblasen im Code klicken. 👆 Sie sollten jetzt eine Verzeichnisstruktur wie diese haben: ``` . ├── app │   ├── __init__.py │ └── main.py ├── Dockerfile └── requirements.txt ``` #### Hinter einem TLS-Terminierungsproxy Wenn Sie Ihren Container hinter einem TLS-Terminierungsproxy (Load Balancer) wie Nginx oder Traefik ausführen, fügen Sie die Option `--proxy-headers` hinzu. Das sagt Uvicorn, den von diesem Proxy gesendeten Headern zu vertrauen und dass die Anwendung hinter HTTPS ausgeführt wird, usw. ```Dockerfile CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"] ``` #### Docker-Cache In diesem `Dockerfile` gibt es einen wichtigen Trick: Wir kopieren zuerst die **Datei nur mit den Abhängigkeiten**, nicht den Rest des Codes. Lassen Sie mich Ihnen erklären, warum. ```Dockerfile COPY ./requirements.txt /code/requirements.txt ``` Docker und andere Tools **erstellen** diese Containerimages **inkrementell**, fügen **eine Ebene über der anderen** hinzu, beginnend am Anfang des `Dockerfile`s und fügen alle durch die einzelnen Anweisungen des `Dockerfile`s erstellten Dateien hinzu. Docker und ähnliche Tools verwenden beim Erstellen des Images auch einen **internen Cache**. Wenn sich eine Datei seit der letzten Erstellung des Containerimages nicht geändert hat, wird **dieselbe Ebene wiederverwendet**, die beim letzten Mal erstellt wurde, anstatt die Datei erneut zu kopieren und eine neue Ebene von Grund auf zu erstellen. Das bloße Vermeiden des Kopierens von Dateien führt nicht unbedingt zu einer großen Verbesserung, aber da der Cache für diesen Schritt verwendet wurde, kann **der Cache für den nächsten Schritt verwendet werden**. Beispielsweise könnte der Cache verwendet werden für die Anweisung, welche die Abhängigkeiten installiert mit: ```Dockerfile RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt ``` Die Datei mit den Paketanforderungen wird sich **nicht häufig ändern**. Wenn Docker also nur diese Datei kopiert, kann es für diesen Schritt **den Cache verwenden**. Und dann kann Docker **den Cache für den nächsten Schritt verwenden**, der diese Abhängigkeiten herunterlädt und installiert. Und hier **sparen wir viel Zeit**. ✨ ... und vermeiden die Langeweile beim Warten. 😪😆 Das Herunterladen und Installieren der Paketabhängigkeiten **könnte Minuten dauern**, aber die Verwendung des **Cache** würde höchstens **Sekunden** dauern. Und da Sie das Containerimage während der Entwicklung immer wieder erstellen würden, um zu überprüfen, ob Ihre Codeänderungen funktionieren, würde dies viel Zeit sparen. Dann, gegen Ende des `Dockerfile`s, kopieren wir den gesamten Code. Da sich der **am häufigsten ändert**, platzieren wir das am Ende, da fast immer alles nach diesem Schritt nicht mehr in der Lage sein wird, den Cache zu verwenden. ```Dockerfile COPY ./app /code/app ``` ### Das Docker-Image erstellen Nachdem nun alle Dateien vorhanden sind, erstellen wir das Containerimage. * Gehen Sie zum Projektverzeichnis (dort, wo sich Ihr `Dockerfile` und Ihr `app`-Verzeichnis befindet). * Erstellen Sie Ihr FastAPI-Image:
```console $ docker build -t myimage . ---> 100% ```
!!! tip "Tipp" Beachten Sie das `.` am Ende, es entspricht `./` und teilt Docker mit, welches Verzeichnis zum Erstellen des Containerimages verwendet werden soll. In diesem Fall handelt es sich um dasselbe aktuelle Verzeichnis (`.`). ### Den Docker-Container starten * Führen Sie einen Container basierend auf Ihrem Image aus:
```console $ docker run -d --name mycontainer -p 80:80 myimage ```
## Es überprüfen Sie sollten es in der URL Ihres Docker-Containers überprüfen können, zum Beispiel: http://192.168.99.100/items/5?q=somequery oder http://127.0.0.1/items/5?q=somequery (oder gleichwertig, unter Verwendung Ihres Docker-Hosts). Sie werden etwas sehen wie: ```JSON {"item_id": 5, "q": "somequery"} ``` ## Interaktive API-Dokumentation Jetzt können Sie auf http://192.168.99.100/docs oder http://127.0.0.1/docs gehen (oder ähnlich, unter Verwendung Ihres Docker-Hosts). Sie sehen die automatische interaktive API-Dokumentation (bereitgestellt von Swagger UI): ![Swagger-Oberfläche](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ## Alternative API-Dokumentation Sie können auch auf http://192.168.99.100/redoc oder http://127.0.0.1/redoc gehen (oder ähnlich, unter Verwendung Ihres Docker-Hosts). Sie sehen die alternative automatische Dokumentation (bereitgestellt von ReDoc): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ## Ein Docker-Image mit einem Single-File-FastAPI erstellen Wenn Ihr FastAPI eine einzelne Datei ist, zum Beispiel `main.py` ohne ein `./app`-Verzeichnis, könnte Ihre Dateistruktur wie folgt aussehen: ``` . ├── Dockerfile ├── main.py └── requirements.txt ``` Dann müssten Sie nur noch die entsprechenden Pfade ändern, um die Datei im `Dockerfile` zu kopieren: ```{ .dockerfile .annotate hl_lines="10 13" } FROM python:3.9 WORKDIR /code COPY ./requirements.txt /code/requirements.txt RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt # (1) COPY ./main.py /code/ # (2) CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"] ``` 1. Kopiere die Datei `main.py` direkt in das Verzeichnis `/code` (ohne ein Verzeichnis `./app`). 2. Führe Uvicorn aus und weisen es an, das `app`-Objekt von `main` zu importieren (anstatt von `app.main` zu importieren). Passen Sie dann den Uvicorn-Befehl an, um das neue Modul `main` anstelle von `app.main` zu verwenden, um das FastAPI-Objekt `app` zu importieren. ## Deployment-Konzepte Lassen Sie uns noch einmal über einige der gleichen [Deployment-Konzepte](concepts.md){.internal-link target=_blank} in Bezug auf Container sprechen. Container sind hauptsächlich ein Werkzeug, um den Prozess des **Erstellens und Deployments** einer Anwendung zu vereinfachen, sie erzwingen jedoch keinen bestimmten Ansatz für die Handhabung dieser **Deployment-Konzepte**, und es gibt mehrere mögliche Strategien. Die **gute Nachricht** ist, dass es mit jeder unterschiedlichen Strategie eine Möglichkeit gibt, alle Deployment-Konzepte abzudecken. 🎉 Sehen wir uns diese **Deployment-Konzepte** im Hinblick auf Container noch einmal an: * Sicherheit – HTTPS * Beim Hochfahren ausführen * Neustarts * Replikation (die Anzahl der laufenden Prozesse) * Arbeitsspeicher * Schritte vor dem Start ## HTTPS Wenn wir uns nur auf das **Containerimage** für eine FastAPI-Anwendung (und später auf den laufenden **Container**) konzentrieren, würde HTTPS normalerweise **extern** von einem anderen Tool verarbeitet. Es könnte sich um einen anderen Container handeln, zum Beispiel mit Traefik, welcher **HTTPS** und **automatischen** Erwerb von **Zertifikaten** handhabt. !!! tip "Tipp" Traefik verfügt über Integrationen mit Docker, Kubernetes und anderen, sodass Sie damit ganz einfach HTTPS für Ihre Container einrichten und konfigurieren können. Alternativ könnte HTTPS von einem Cloud-Anbieter als einer seiner Dienste gehandhabt werden (während die Anwendung weiterhin in einem Container ausgeführt wird). ## Beim Hochfahren ausführen und Neustarts Normalerweise gibt es ein anderes Tool, das für das **Starten und Ausführen** Ihres Containers zuständig ist. Es könnte sich um **Docker** direkt, **Docker Compose**, **Kubernetes**, einen **Cloud-Dienst**, usw. handeln. In den meisten (oder allen) Fällen gibt es eine einfache Option, um die Ausführung des Containers beim Hochfahren und Neustarts bei Fehlern zu ermöglichen. In Docker ist es beispielsweise die Befehlszeilenoption `--restart`. Ohne die Verwendung von Containern kann es umständlich und schwierig sein, Anwendungen beim Hochfahren auszuführen und neu zu starten. Bei der **Arbeit mit Containern** ist diese Funktionalität jedoch in den meisten Fällen standardmäßig enthalten. ✨ ## Replikation – Anzahl der Prozesse Wenn Sie einen Cluster von Maschinen mit **Kubernetes**, Docker Swarm Mode, Nomad verwenden, oder einem anderen, ähnlich komplexen System zur Verwaltung verteilter Container auf mehreren Maschinen, möchten Sie wahrscheinlich die **Replikation auf Cluster-Ebene abwickeln**, anstatt in jedem Container einen **Prozessmanager** (wie Gunicorn mit Workern) zu verwenden. Diese verteilten Containerverwaltungssysteme wie Kubernetes verfügen normalerweise über eine integrierte Möglichkeit, die **Replikation von Containern** zu handhaben und gleichzeitig **Load Balancing** für die eingehenden Requests zu unterstützen. Alles auf **Cluster-Ebene**. In diesen Fällen möchten Sie wahrscheinlich ein **Docker-Image von Grund auf** erstellen, wie [oben erklärt](#dockerfile), Ihre Abhängigkeiten installieren und **einen einzelnen Uvicorn-Prozess** ausführen, anstatt etwas wie Gunicorn mit Uvicorn-Workern auszuführen. ### Load Balancer Bei der Verwendung von Containern ist normalerweise eine Komponente vorhanden, **die am Hauptport lauscht**. Es könnte sich um einen anderen Container handeln, der auch ein **TLS-Terminierungsproxy** ist, um **HTTPS** zu verarbeiten, oder ein ähnliches Tool. Da diese Komponente die **Last** an Requests aufnehmen und diese (hoffentlich) **ausgewogen** auf die Worker verteilen würde, wird sie üblicherweise auch **Load Balancer** – Lastverteiler – genannt. !!! tip "Tipp" Die gleiche **TLS-Terminierungsproxy**-Komponente, die für HTTPS verwendet wird, wäre wahrscheinlich auch ein **Load Balancer**. Und wenn Sie mit Containern arbeiten, verfügt das gleiche System, mit dem Sie diese starten und verwalten, bereits über interne Tools, um die **Netzwerkkommunikation** (z. B. HTTP-Requests) von diesem **Load Balancer** (das könnte auch ein **TLS-Terminierungsproxy** sein) zu den Containern mit Ihrer Anwendung weiterzuleiten. ### Ein Load Balancer – mehrere Workercontainer Bei der Arbeit mit **Kubernetes** oder ähnlichen verteilten Containerverwaltungssystemen würde die Verwendung ihrer internen Netzwerkmechanismen es dem einzelnen **Load Balancer**, der den Haupt-**Port** überwacht, ermöglichen, Kommunikation (Requests) an möglicherweise **mehrere Container** weiterzuleiten, in denen Ihre Anwendung ausgeführt wird. Jeder dieser Container, in denen Ihre Anwendung ausgeführt wird, verfügt normalerweise über **nur einen Prozess** (z. B. einen Uvicorn-Prozess, der Ihre FastAPI-Anwendung ausführt). Es wären alles **identische Container**, die das Gleiche ausführen, welche aber jeweils über einen eigenen Prozess, Speicher, usw. verfügen. Auf diese Weise würden Sie die **Parallelisierung** in **verschiedenen Kernen** der CPU nutzen. Oder sogar in **verschiedenen Maschinen**. Und das verteilte Containersystem mit dem **Load Balancer** würde **die Requests abwechselnd** an jeden einzelnen Container mit Ihrer Anwendung verteilen. Jeder Request könnte also von einem der mehreren **replizierten Container** verarbeitet werden, in denen Ihre Anwendung ausgeführt wird. Und normalerweise wäre dieser **Load Balancer** in der Lage, Requests zu verarbeiten, die an *andere* Anwendungen in Ihrem Cluster gerichtet sind (z. B. eine andere Domain oder unter einem anderen URL-Pfad-Präfix), und würde diese Kommunikation an die richtigen Container weiterleiten für *diese andere* Anwendung, die in Ihrem Cluster ausgeführt wird. ### Ein Prozess pro Container In einem solchen Szenario möchten Sie wahrscheinlich **einen einzelnen (Uvicorn-)Prozess pro Container** haben, da Sie die Replikation bereits auf Cluster ebene durchführen würden. In diesem Fall möchten Sie also **nicht** einen Prozessmanager wie Gunicorn mit Uvicorn-Workern oder Uvicorn mit seinen eigenen Uvicorn-Workern haben. Sie möchten nur einen **einzelnen Uvicorn-Prozess** pro Container haben (wahrscheinlich aber mehrere Container). Ein weiterer Prozessmanager im Container (wie es bei Gunicorn oder Uvicorn der Fall wäre, welche Uvicorn-Worker verwalten) würde nur **unnötige Komplexität** hinzufügen, um welche Sie sich höchstwahrscheinlich bereits mit Ihrem Clustersystem kümmern. ### Container mit mehreren Prozessen und Sonderfälle Natürlich gibt es **Sonderfälle**, in denen Sie **einen Container** mit einem **Gunicorn-Prozessmanager** haben möchten, welcher mehrere **Uvicorn-Workerprozesse** darin startet. In diesen Fällen können Sie das **offizielle Docker-Image** verwenden, welches **Gunicorn** als Prozessmanager enthält, welcher mehrere **Uvicorn-Workerprozesse** ausführt, sowie einige Standardeinstellungen, um die Anzahl der Worker basierend auf den verfügbaren CPU-Kernen automatisch anzupassen. Ich erzähle Ihnen weiter unten in [Offizielles Docker-Image mit Gunicorn – Uvicorn](#offizielles-docker-image-mit-gunicorn-uvicorn) mehr darüber. Hier sind einige Beispiele, wann das sinnvoll sein könnte: #### Eine einfache Anwendung Sie könnten einen Prozessmanager im Container haben wollen, wenn Ihre Anwendung **einfach genug** ist, sodass Sie die Anzahl der Prozesse nicht (zumindest noch nicht) zu stark tunen müssen und Sie einfach einen automatisierten Standard verwenden können (mit dem offiziellen Docker-Image), und Sie führen es auf einem **einzelnen Server** aus, nicht auf einem Cluster. #### Docker Compose Sie könnten das Deployment auf einem **einzelnen Server** (kein Cluster) mit **Docker Compose** durchführen, sodass Sie keine einfache Möglichkeit hätten, die Replikation von Containern (mit Docker Compose) zu verwalten und gleichzeitig das gemeinsame Netzwerk mit **Load Balancing** zu haben. Dann möchten Sie vielleicht **einen einzelnen Container** mit einem **Prozessmanager** haben, der darin **mehrere Workerprozesse** startet. #### Prometheus und andere Gründe Sie könnten auch **andere Gründe** haben, die es einfacher machen würden, einen **einzelnen Container** mit **mehreren Prozessen** zu haben, anstatt **mehrere Container** mit **einem einzelnen Prozess** in jedem von ihnen. Beispielsweise könnten Sie (abhängig von Ihrem Setup) ein Tool wie einen Prometheus-Exporter im selben Container haben, welcher Zugriff auf **jeden der eingehenden Requests** haben sollte. Wenn Sie in hier **mehrere Container** hätten, würde Prometheus beim **Lesen der Metriken** standardmäßig jedes Mal diejenigen für **einen einzelnen Container** abrufen (für den Container, der den spezifischen Request verarbeitet hat), anstatt die **akkumulierten Metriken** für alle replizierten Container abzurufen. In diesem Fall könnte einfacher sein, **einen Container** mit **mehreren Prozessen** und ein lokales Tool (z. B. einen Prometheus-Exporter) in demselben Container zu haben, welches Prometheus-Metriken für alle internen Prozesse sammelt und diese Metriken für diesen einzelnen Container offenlegt. --- Der Hauptpunkt ist, dass **keine** dieser Regeln **in Stein gemeißelt** ist, der man blind folgen muss. Sie können diese Ideen verwenden, um **Ihren eigenen Anwendungsfall zu evaluieren**, zu entscheiden, welcher Ansatz für Ihr System am besten geeignet ist und herauszufinden, wie Sie folgende Konzepte verwalten: * Sicherheit – HTTPS * Beim Hochfahren ausführen * Neustarts * Replikation (die Anzahl der laufenden Prozesse) * Arbeitsspeicher * Schritte vor dem Start ## Arbeitsspeicher Wenn Sie **einen einzelnen Prozess pro Container** ausführen, wird von jedem dieser Container (mehr als einer, wenn sie repliziert werden) eine mehr oder weniger klar definierte, stabile und begrenzte Menge an Arbeitsspeicher verbraucht. Und dann können Sie dieselben Speichergrenzen und -anforderungen in Ihren Konfigurationen für Ihr Container-Management-System festlegen (z. B. in **Kubernetes**). Auf diese Weise ist es in der Lage, die Container auf den **verfügbaren Maschinen** zu replizieren, wobei die von denen benötigte Speichermenge und die auf den Maschinen im Cluster verfügbare Menge berücksichtigt werden. Wenn Ihre Anwendung **einfach** ist, wird dies wahrscheinlich **kein Problem darstellen** und Sie müssen möglicherweise keine festen Speichergrenzen angeben. Wenn Sie jedoch **viel Speicher verbrauchen** (z. B. bei **Modellen für maschinelles Lernen**), sollten Sie überprüfen, wie viel Speicher Sie verbrauchen, und die **Anzahl der Container** anpassen, die in **jeder Maschine** ausgeführt werden. (und möglicherweise weitere Maschinen zu Ihrem Cluster hinzufügen). Wenn Sie **mehrere Prozesse pro Container** ausführen (zum Beispiel mit dem offiziellen Docker-Image), müssen Sie sicherstellen, dass die Anzahl der gestarteten Prozesse nicht **mehr Speicher verbraucht** als verfügbar ist. ## Schritte vor dem Start und Container Wenn Sie Container (z. B. Docker, Kubernetes) verwenden, können Sie hauptsächlich zwei Ansätze verwenden. ### Mehrere Container Wenn Sie **mehrere Container** haben, von denen wahrscheinlich jeder einen **einzelnen Prozess** ausführt (z. B. in einem **Kubernetes**-Cluster), dann möchten Sie wahrscheinlich einen **separaten Container** haben, welcher die Arbeit der **Vorab-Schritte** in einem einzelnen Container, mit einem einzelnenen Prozess ausführt, **bevor** die replizierten Workercontainer ausgeführt werden. !!! info Wenn Sie Kubernetes verwenden, wäre dies wahrscheinlich ein Init-Container. Wenn es in Ihrem Anwendungsfall kein Problem darstellt, diese vorherigen Schritte **mehrmals parallel** auszuführen (z. B. wenn Sie keine Datenbankmigrationen ausführen, sondern nur prüfen, ob die Datenbank bereits bereit ist), können Sie sie auch einfach in jedem Container direkt vor dem Start des Hauptprozesses einfügen. ### Einzelner Container Wenn Sie ein einfaches Setup mit einem **einzelnen Container** haben, welcher dann mehrere **Workerprozesse** (oder auch nur einen Prozess) startet, können Sie die Vorab-Schritte im selben Container direkt vor dem Starten des Prozesses mit der Anwendung ausführen. Das offizielle Docker-Image unterstützt das intern. ## Offizielles Docker-Image mit Gunicorn – Uvicorn Es gibt ein offizielles Docker-Image, in dem Gunicorn mit Uvicorn-Workern ausgeführt wird, wie in einem vorherigen Kapitel beschrieben: [Serverworker – Gunicorn mit Uvicorn](server-workers.md){.internal-link target=_blank}. Dieses Image wäre vor allem in den oben beschriebenen Situationen nützlich: [Container mit mehreren Prozessen und Sonderfälle](#container-mit-mehreren-prozessen-und-sonderfalle). * tiangolo/uvicorn-gunicorn-fastapi. !!! warning "Achtung" Es besteht eine hohe Wahrscheinlichkeit, dass Sie dieses oder ein ähnliches Basisimage **nicht** benötigen und es besser wäre, wenn Sie das Image von Grund auf neu erstellen würden, wie [oben beschrieben in: Ein Docker-Image für FastAPI erstellen](#ein-docker-image-fur-fastapi-erstellen). Dieses Image verfügt über einen **Auto-Tuning**-Mechanismus, um die **Anzahl der Arbeitsprozesse** basierend auf den verfügbaren CPU-Kernen festzulegen. Es verfügt über **vernünftige Standardeinstellungen**, aber Sie können trotzdem alle Konfigurationen mit **Umgebungsvariablen** oder Konfigurationsdateien ändern und aktualisieren. Es unterstützt auch die Ausführung von **Vorab-Schritten vor dem Start** mit einem Skript. !!! tip "Tipp" Um alle Konfigurationen und Optionen anzuzeigen, gehen Sie zur Docker-Image-Seite: tiangolo/uvicorn-gunicorn-fastapi. ### Anzahl der Prozesse auf dem offiziellen Docker-Image Die **Anzahl der Prozesse** auf diesem Image wird **automatisch** anhand der verfügbaren CPU-**Kerne** berechnet. Das bedeutet, dass versucht wird, so viel **Leistung** wie möglich aus der CPU herauszuquetschen. Sie können das auch in der Konfiguration anpassen, indem Sie **Umgebungsvariablen**, usw. verwenden. Das bedeutet aber auch, da die Anzahl der Prozesse von der CPU abhängt, welche der Container ausführt, dass die **Menge des verbrauchten Speichers** ebenfalls davon abhängt. Wenn Ihre Anwendung also viel Speicher verbraucht (z. B. bei Modellen für maschinelles Lernen) und Ihr Server über viele CPU-Kerne, **aber wenig Speicher** verfügt, könnte Ihr Container am Ende versuchen, mehr Speicher als vorhanden zu verwenden, was zu erheblichen Leistungseinbußen (oder sogar zum Absturz) führen kann. 🚨 ### Ein `Dockerfile` erstellen So würden Sie ein `Dockerfile` basierend auf diesem Image erstellen: ```Dockerfile FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 COPY ./requirements.txt /app/requirements.txt RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt COPY ./app /app ``` ### Größere Anwendungen Wenn Sie dem Abschnitt zum Erstellen von [größeren Anwendungen mit mehreren Dateien](../tutorial/bigger-applications.md){.internal-link target=_blank} gefolgt sind, könnte Ihr `Dockerfile` stattdessen wie folgt aussehen: ```Dockerfile hl_lines="7" FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 COPY ./requirements.txt /app/requirements.txt RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt COPY ./app /app/app ``` ### Wann verwenden Sie sollten dieses offizielle Basisimage (oder ein ähnliches) wahrscheinlich **nicht** benutzen, wenn Sie **Kubernetes** (oder andere) verwenden und Sie bereits **Replikation** auf Cluster ebene mit mehreren **Containern** eingerichtet haben. In diesen Fällen ist es besser, **ein Image von Grund auf zu erstellen**, wie oben beschrieben: [Ein Docker-Image für FastAPI erstellen](#ein-docker-image-fur-fastapi-erstellen). Dieses Image wäre vor allem in den oben in [Container mit mehreren Prozessen und Sonderfälle](#container-mit-mehreren-prozessen-und-sonderfalle) beschriebenen Sonderfällen nützlich. Wenn Ihre Anwendung beispielsweise **einfach genug** ist, dass das Festlegen einer Standardanzahl von Prozessen basierend auf der CPU gut funktioniert, möchten Sie sich nicht mit der manuellen Konfiguration der Replikation auf Cluster ebene herumschlagen und führen nicht mehr als einen Container mit Ihrer Anwendung aus. Oder wenn Sie das Deployment mit **Docker Compose** durchführen und auf einem einzelnen Server laufen, usw. ## Deployment des Containerimages Nachdem Sie ein Containerimage (Docker) haben, gibt es mehrere Möglichkeiten, es bereitzustellen. Zum Beispiel: * Mit **Docker Compose** auf einem einzelnen Server * Mit einem **Kubernetes**-Cluster * Mit einem Docker Swarm Mode-Cluster * Mit einem anderen Tool wie Nomad * Mit einem Cloud-Dienst, der Ihr Containerimage nimmt und es bereitstellt ## Docker-Image mit Poetry Wenn Sie Poetry verwenden, um die Abhängigkeiten Ihres Projekts zu verwalten, können Sie Dockers mehrphasige Builds verwenden: ```{ .dockerfile .annotate } # (1) FROM python:3.9 as requirements-stage # (2) WORKDIR /tmp # (3) RUN pip install poetry # (4) COPY ./pyproject.toml ./poetry.lock* /tmp/ # (5) RUN poetry export -f requirements.txt --output requirements.txt --without-hashes # (6) FROM python:3.9 # (7) WORKDIR /code # (8) COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt # (9) RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt # (10) COPY ./app /code/app # (11) CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] ``` 1. Dies ist die erste Phase, genannt `requirements-stage` – „Anforderungsphase“. 2. Setze `/tmp` als aktuelles Arbeitsverzeichnis. Hier werden wir die Datei `requirements.txt` generieren. 3. Installiere Poetry in dieser Docker-Phase. 4. Kopiere die Dateien `pyproject.toml` und `poetry.lock` in das Verzeichnis `/tmp`. Da es `./poetry.lock*` verwendet (endet mit einem `*`), stürzt es nicht ab, wenn diese Datei noch nicht verfügbar ist. 5. Generiere die Datei `requirements.txt`. 6. Dies ist die letzte Phase. Alles hier bleibt im endgültigen Containerimage erhalten. 7. Setze das aktuelle Arbeitsverzeichnis auf `/code`. 8. Kopiere die Datei `requirements.txt` in das Verzeichnis `/code`. Diese Datei existiert nur in der vorherigen Docker-Phase, deshalb verwenden wir `--from-requirements-stage`, um sie zu kopieren. 9. Installiere die Paketabhängigkeiten von der generierten Datei `requirements.txt`. 10. Kopiere das Verzeichnis `app` in das Verzeichnis `/code`. 11. Führe den Befehl `uvicorn` aus und weise ihn an, das aus `app.main` importierte `app`-Objekt zu verwenden. !!! tip "Tipp" Klicken Sie auf die Zahlenblasen, um zu sehen, was jede Zeile bewirkt. Eine **Docker-Phase** ist ein Teil eines `Dockerfile`s, welcher als **temporäres Containerimage** fungiert und nur zum Generieren einiger Dateien für die spätere Verwendung verwendet wird. Die erste Phase wird nur zur **Installation von Poetry** und zur **Generierung der `requirements.txt`** mit deren Projektabhängigkeiten aus der Datei `pyproject.toml` von Poetry verwendet. Diese `requirements.txt`-Datei wird später in der **nächsten Phase** mit `pip` verwendet. Im endgültigen Containerimage bleibt **nur die letzte Stufe** erhalten. Die vorherigen Stufen werden verworfen. Bei der Verwendung von Poetry wäre es sinnvoll, **mehrstufige Docker-Builds** zu verwenden, da Poetry und seine Abhängigkeiten nicht wirklich im endgültigen Containerimage installiert sein müssen, sondern Sie brauchen **nur** die Datei `requirements.txt`, um Ihre Projektabhängigkeiten zu installieren. Dann würden Sie im nächsten (und letzten) Schritt das Image mehr oder weniger auf die gleiche Weise wie zuvor beschrieben erstellen. ### Hinter einem TLS-Terminierungsproxy – Poetry Auch hier gilt: Wenn Sie Ihren Container hinter einem TLS-Terminierungsproxy (Load Balancer) wie Nginx oder Traefik ausführen, fügen Sie dem Befehl die Option `--proxy-headers` hinzu: ```Dockerfile CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"] ``` ## Zusammenfassung Mithilfe von Containersystemen (z. B. mit **Docker** und **Kubernetes**) ist es ziemlich einfach, alle **Deployment-Konzepte** zu handhaben: * HTTPS * Beim Hochfahren ausführen * Neustarts * Replikation (die Anzahl der laufenden Prozesse) * Arbeitsspeicher * Schritte vor dem Start In den meisten Fällen möchten Sie wahrscheinlich kein Basisimage verwenden und stattdessen **ein Containerimage von Grund auf erstellen**, eines basierend auf dem offiziellen Python-Docker-Image. Indem Sie auf die **Reihenfolge** der Anweisungen im `Dockerfile` und den **Docker-Cache** achten, können Sie **die Build-Zeiten minimieren**, um Ihre Produktivität zu erhöhen (und Langeweile zu vermeiden). 😎 In bestimmten Sonderfällen möchten Sie möglicherweise das offizielle Docker-Image für FastAPI verwenden. 🤓 fastapi-0.110.3/docs/de/docs/deployment/https.md000066400000000000000000000330541461403617600214340ustar00rootroot00000000000000# Über HTTPS Es ist leicht anzunehmen, dass HTTPS etwas ist, was einfach nur „aktiviert“ wird oder nicht. Aber es ist viel komplexer als das. !!! tip "Tipp" Wenn Sie es eilig haben oder es Ihnen egal ist, fahren Sie mit den nächsten Abschnitten fort, um Schritt-für-Schritt-Anleitungen für die Einrichtung der verschiedenen Technologien zu erhalten. Um **die Grundlagen von HTTPS** aus Sicht des Benutzers zu erlernen, schauen Sie sich https://howhttps.works/ an. Aus **Sicht des Entwicklers** sollten Sie beim Nachdenken über HTTPS Folgendes beachten: * Für HTTPS muss **der Server** über von einem **Dritten** generierte **„Zertifikate“** verfügen. * Diese Zertifikate werden tatsächlich vom Dritten **erworben** und nicht „generiert“. * Zertifikate haben eine **Lebensdauer**. * Sie **verfallen**. * Und dann müssen sie vom Dritten **erneuert**, **erneut erworben** werden. * Die Verschlüsselung der Verbindung erfolgt auf **TCP-Ebene**. * Das ist eine Schicht **unter HTTP**. * Die Handhabung von **Zertifikaten und Verschlüsselung** erfolgt also **vor HTTP**. * **TCP weiß nichts über „Domains“**. Nur über IP-Adressen. * Die Informationen über die angeforderte **spezifische Domain** befinden sich in den **HTTP-Daten**. * Die **HTTPS-Zertifikate** „zertifizieren“ eine **bestimmte Domain**, aber das Protokoll und die Verschlüsselung erfolgen auf TCP-Ebene, **ohne zu wissen**, um welche Domain es sich handelt. * **Standardmäßig** bedeutet das, dass Sie nur **ein HTTPS-Zertifikat pro IP-Adresse** haben können. * Ganz gleich, wie groß Ihr Server ist oder wie klein die einzelnen Anwendungen darauf sind. * Hierfür gibt es jedoch eine **Lösung**. * Es gibt eine **Erweiterung** zum **TLS**-Protokoll (dasjenige, das die Verschlüsselung auf TCP-Ebene, vor HTTP, verwaltet) namens **SNI**. * Mit dieser SNI-Erweiterung kann ein einzelner Server (mit einer **einzelnen IP-Adresse**) über **mehrere HTTPS-Zertifikate** verfügen und **mehrere HTTPS-Domains/Anwendungen** bedienen. * Damit das funktioniert, muss eine **einzelne** Komponente (Programm), die auf dem Server ausgeführt wird und welche die **öffentliche IP-Adresse** überwacht, **alle HTTPS-Zertifikate** des Servers haben. * **Nachdem** eine sichere Verbindung hergestellt wurde, ist das Kommunikationsprotokoll **immer noch HTTP**. * Die Inhalte sind **verschlüsselt**, auch wenn sie mit dem **HTTP-Protokoll** gesendet werden. Es ist eine gängige Praxis, **ein Programm/HTTP-Server** auf dem Server (der Maschine, dem Host usw.) laufen zu lassen, welches **alle HTTPS-Aspekte verwaltet**: Empfangen der **verschlüsselten HTTPS-Requests**, Senden der **entschlüsselten HTTP-Requests** an die eigentliche HTTP-Anwendung die auf demselben Server läuft (in diesem Fall die **FastAPI**-Anwendung), entgegennehmen der **HTTP-Response** von der Anwendung, **verschlüsseln derselben** mithilfe des entsprechenden **HTTPS-Zertifikats** und Zurücksenden zum Client über **HTTPS**. Dieser Server wird oft als **TLS-Terminierungsproxy** bezeichnet. Einige der Optionen, die Sie als TLS-Terminierungsproxy verwenden können, sind: * Traefik (kann auch Zertifikat-Erneuerungen durchführen) * Caddy (kann auch Zertifikat-Erneuerungen durchführen) * Nginx * HAProxy ## Let's Encrypt Vor Let's Encrypt wurden diese **HTTPS-Zertifikate** von vertrauenswürdigen Dritten verkauft. Der Prozess zum Erwerb eines dieser Zertifikate war früher umständlich, erforderte viel Papierarbeit und die Zertifikate waren ziemlich teuer. Aber dann wurde **Let's Encrypt** geschaffen. Es ist ein Projekt der Linux Foundation. Es stellt **kostenlose HTTPS-Zertifikate** automatisiert zur Verfügung. Diese Zertifikate nutzen standardmäßig die gesamte kryptografische Sicherheit und sind kurzlebig (circa 3 Monate), sodass die **Sicherheit tatsächlich besser ist**, aufgrund der kürzeren Lebensdauer. Die Domains werden sicher verifiziert und die Zertifikate werden automatisch generiert. Das ermöglicht auch die automatische Erneuerung dieser Zertifikate. Die Idee besteht darin, den Erwerb und die Erneuerung der Zertifikate zu automatisieren, sodass Sie **sicheres HTTPS, kostenlos und für immer** haben können. ## HTTPS für Entwickler Hier ist ein Beispiel, wie eine HTTPS-API aussehen könnte, Schritt für Schritt, wobei vor allem die für Entwickler wichtigen Ideen berücksichtigt werden. ### Domainname Alles beginnt wahrscheinlich damit, dass Sie einen **Domainnamen erwerben**. Anschließend konfigurieren Sie ihn in einem DNS-Server (wahrscheinlich beim selben Cloud-Anbieter). Sie würden wahrscheinlich einen Cloud-Server (eine virtuelle Maschine) oder etwas Ähnliches bekommen, und dieser hätte eine feste **öffentliche IP-Adresse**. In dem oder den DNS-Server(n) würden Sie einen Eintrag (einen „`A record`“) konfigurieren, um mit **Ihrer Domain** auf die öffentliche **IP-Adresse Ihres Servers** zu verweisen. Sie würden dies wahrscheinlich nur einmal tun, beim ersten Mal, wenn Sie alles einrichten. !!! tip "Tipp" Dieser Domainnamen-Aspekt liegt weit vor HTTPS, aber da alles von der Domain und der IP-Adresse abhängt, lohnt es sich, das hier zu erwähnen. ### DNS Konzentrieren wir uns nun auf alle tatsächlichen HTTPS-Aspekte. Zuerst würde der Browser mithilfe der **DNS-Server** herausfinden, welches die **IP für die Domain** ist, in diesem Fall für `someapp.example.com`. Die DNS-Server geben dem Browser eine bestimmte **IP-Adresse** zurück. Das wäre die von Ihrem Server verwendete öffentliche IP-Adresse, die Sie in den DNS-Servern konfiguriert haben. ### TLS-Handshake-Start Der Browser kommuniziert dann mit dieser IP-Adresse über **Port 443** (den HTTPS-Port). Der erste Teil der Kommunikation besteht lediglich darin, die Verbindung zwischen dem Client und dem Server herzustellen und die zu verwendenden kryptografischen Schlüssel usw. zu vereinbaren. Diese Interaktion zwischen dem Client und dem Server zum Aufbau der TLS-Verbindung wird als **TLS-Handshake** bezeichnet. ### TLS mit SNI-Erweiterung **Nur ein Prozess** im Server kann an einem bestimmten **Port** einer bestimmten **IP-Adresse** lauschen. Möglicherweise gibt es andere Prozesse, die an anderen Ports dieselbe IP-Adresse abhören, jedoch nur einen für jede Kombination aus IP-Adresse und Port. TLS (HTTPS) verwendet standardmäßig den spezifischen Port `443`. Das ist also der Port, den wir brauchen. Da an diesem Port nur ein Prozess lauschen kann, wäre der Prozess, der dies tun würde, der **TLS-Terminierungsproxy**. Der TLS-Terminierungsproxy hätte Zugriff auf ein oder mehrere **TLS-Zertifikate** (HTTPS-Zertifikate). Mithilfe der oben beschriebenen **SNI-Erweiterung** würde der TLS-Terminierungsproxy herausfinden, welches der verfügbaren TLS-Zertifikate (HTTPS) er für diese Verbindung verwenden muss, und zwar das, welches mit der vom Client erwarteten Domain übereinstimmt. In diesem Fall würde er das Zertifikat für `someapp.example.com` verwenden. Der Client **vertraut** bereits der Entität, die das TLS-Zertifikat generiert hat (in diesem Fall Let's Encrypt, aber wir werden später mehr darüber erfahren), sodass er **verifizieren** kann, dass das Zertifikat gültig ist. Mithilfe des Zertifikats entscheiden der Client und der TLS-Terminierungsproxy dann, **wie der Rest der TCP-Kommunikation verschlüsselt werden soll**. Damit ist der **TLS-Handshake** abgeschlossen. Danach verfügen der Client und der Server über eine **verschlüsselte TCP-Verbindung**, via TLS. Und dann können sie diese Verbindung verwenden, um die eigentliche **HTTP-Kommunikation** zu beginnen. Und genau das ist **HTTPS**, es ist einfach **HTTP** innerhalb einer **sicheren TLS-Verbindung**, statt einer puren (unverschlüsselten) TCP-Verbindung. !!! tip "Tipp" Beachten Sie, dass die Verschlüsselung der Kommunikation auf der **TCP-Ebene** und nicht auf der HTTP-Ebene erfolgt. ### HTTPS-Request Da Client und Server (sprich, der Browser und der TLS-Terminierungsproxy) nun über eine **verschlüsselte TCP-Verbindung** verfügen, können sie die **HTTP-Kommunikation** starten. Der Client sendet also einen **HTTPS-Request**. Das ist einfach ein HTTP-Request über eine verschlüsselte TLS-Verbindung. ### Den Request entschlüsseln Der TLS-Terminierungsproxy würde die vereinbarte Verschlüsselung zum **Entschlüsseln des Requests** verwenden und den **einfachen (entschlüsselten) HTTP-Request** an den Prozess weiterleiten, der die Anwendung ausführt (z. B. einen Prozess, bei dem Uvicorn die FastAPI-Anwendung ausführt). ### HTTP-Response Die Anwendung würde den Request verarbeiten und eine **einfache (unverschlüsselte) HTTP-Response** an den TLS-Terminierungsproxy senden. ### HTTPS-Response Der TLS-Terminierungsproxy würde dann die Response mithilfe der zuvor vereinbarten Kryptografie (als das Zertifikat für `someapp.example.com` verhandelt wurde) **verschlüsseln** und sie an den Browser zurücksenden. Als Nächstes überprüft der Browser, ob die Response gültig und mit dem richtigen kryptografischen Schlüssel usw. verschlüsselt ist. Anschließend **entschlüsselt er die Response** und verarbeitet sie. Der Client (Browser) weiß, dass die Response vom richtigen Server kommt, da dieser die Kryptografie verwendet, die zuvor mit dem **HTTPS-Zertifikat** vereinbart wurde. ### Mehrere Anwendungen Auf demselben Server (oder denselben Servern) könnten sich **mehrere Anwendungen** befinden, beispielsweise andere API-Programme oder eine Datenbank. Nur ein Prozess kann diese spezifische IP und den Port verarbeiten (in unserem Beispiel der TLS-Terminierungsproxy), aber die anderen Anwendungen/Prozesse können auch auf dem/den Server(n) ausgeführt werden, solange sie nicht versuchen, dieselbe **Kombination aus öffentlicher IP und Port** zu verwenden. Auf diese Weise könnte der TLS-Terminierungsproxy HTTPS und Zertifikate für **mehrere Domains**, für mehrere Anwendungen, verarbeiten und die Requests dann jeweils an die richtige Anwendung weiterleiten. ### Verlängerung des Zertifikats Irgendwann in der Zukunft würde jedes Zertifikat **ablaufen** (etwa 3 Monate nach dem Erwerb). Und dann gäbe es ein anderes Programm (in manchen Fällen ist es ein anderes Programm, in manchen Fällen ist es derselbe TLS-Terminierungsproxy), das mit Let's Encrypt kommuniziert und das/die Zertifikat(e) erneuert. Die **TLS-Zertifikate** sind **einem Domainnamen zugeordnet**, nicht einer IP-Adresse. Um die Zertifikate zu erneuern, muss das erneuernde Programm der Behörde (Let's Encrypt) **nachweisen**, dass es diese Domain tatsächlich **besitzt und kontrolliert**. Um dies zu erreichen und den unterschiedlichen Anwendungsanforderungen gerecht zu werden, gibt es mehrere Möglichkeiten. Einige beliebte Methoden sind: * **Einige DNS-Einträge ändern**. * Hierfür muss das erneuernde Programm die APIs des DNS-Anbieters unterstützen. Je nachdem, welchen DNS-Anbieter Sie verwenden, kann dies eine Option sein oder auch nicht. * **Als Server ausführen** (zumindest während des Zertifikatserwerbsvorgangs), auf der öffentlichen IP-Adresse, die der Domain zugeordnet ist. * Wie oben erwähnt, kann nur ein Prozess eine bestimmte IP und einen bestimmten Port überwachen. * Das ist einer der Gründe, warum es sehr nützlich ist, wenn derselbe TLS-Terminierungsproxy auch den Zertifikats-Erneuerungsprozess übernimmt. * Andernfalls müssen Sie möglicherweise den TLS-Terminierungsproxy vorübergehend stoppen, das Programm starten, welches die neuen Zertifikate beschafft, diese dann mit dem TLS-Terminierungsproxy konfigurieren und dann den TLS-Terminierungsproxy neu starten. Das ist nicht ideal, da Ihre Anwendung(en) während der Zeit, in der der TLS-Terminierungsproxy ausgeschaltet ist, nicht erreichbar ist/sind. Dieser ganze Erneuerungsprozess, während die Anwendung weiterhin bereitgestellt wird, ist einer der Hauptgründe, warum Sie ein **separates System zur Verarbeitung von HTTPS** mit einem TLS-Terminierungsproxy haben möchten, anstatt einfach die TLS-Zertifikate direkt mit dem Anwendungsserver zu verwenden (z. B. Uvicorn). ## Zusammenfassung **HTTPS** zu haben ist sehr wichtig und in den meisten Fällen eine **kritische Anforderung**. Die meiste Arbeit, die Sie als Entwickler in Bezug auf HTTPS aufwenden müssen, besteht lediglich darin, **diese Konzepte zu verstehen** und wie sie funktionieren. Sobald Sie jedoch die grundlegenden Informationen zu **HTTPS für Entwickler** kennen, können Sie verschiedene Tools problemlos kombinieren und konfigurieren, um alles auf einfache Weise zu verwalten. In einigen der nächsten Kapitel zeige ich Ihnen einige konkrete Beispiele für die Einrichtung von **HTTPS** für **FastAPI**-Anwendungen. 🔒 fastapi-0.110.3/docs/de/docs/deployment/index.md000066400000000000000000000026701461403617600214010ustar00rootroot00000000000000# Deployment Das Deployment einer **FastAPI**-Anwendung ist relativ einfach. ## Was bedeutet Deployment? **Deployment** (Deutsch etwa: **Bereitstellen der Anwendung**) bedeutet, die notwendigen Schritte durchzuführen, um die Anwendung **für die Endbenutzer verfügbar** zu machen. Bei einer **Web-API** bedeutet das normalerweise, diese auf einem **entfernten Rechner** zu platzieren, mit einem **Serverprogramm**, welches gute Leistung, Stabilität, usw. bietet, damit Ihre **Benutzer** auf die Anwendung effizient und ohne Unterbrechungen oder Probleme **zugreifen** können. Das steht im Gegensatz zu den **Entwicklungsphasen**, in denen Sie ständig den Code ändern, kaputt machen, reparieren, den Entwicklungsserver stoppen und neu starten, usw. ## Deployment-Strategien Abhängig von Ihrem spezifischen Anwendungsfall und den von Ihnen verwendeten Tools gibt es mehrere Möglichkeiten, das zu tun. Sie könnten mithilfe einer Kombination von Tools selbst **einen Server bereitstellen**, Sie könnten einen **Cloud-Dienst** nutzen, der einen Teil der Arbeit für Sie erledigt, oder andere mögliche Optionen. Ich zeige Ihnen einige der wichtigsten Konzepte, die Sie beim Deployment einer **FastAPI**-Anwendung wahrscheinlich berücksichtigen sollten (obwohl das meiste davon auch für jede andere Art von Webanwendung gilt). In den nächsten Abschnitten erfahren Sie mehr über die zu beachtenden Details und über die Techniken, das zu tun. ✨ fastapi-0.110.3/docs/de/docs/deployment/manually.md000066400000000000000000000126231461403617600221130ustar00rootroot00000000000000# Einen Server manuell ausführen – Uvicorn Das Wichtigste, was Sie zum Ausführen einer **FastAPI**-Anwendung auf einer entfernten Servermaschine benötigen, ist ein ASGI-Serverprogramm, wie **Uvicorn**. Es gibt 3 Hauptalternativen: * Uvicorn: ein hochperformanter ASGI-Server. * Hypercorn: ein ASGI-Server, der unter anderem mit HTTP/2 und Trio kompatibel ist. * Daphne: Der für Django Channels entwickelte ASGI-Server. ## Servermaschine und Serverprogramm Bei den Benennungen gibt es ein kleines Detail, das Sie beachten sollten. 💡 Das Wort „**Server**“ bezieht sich häufig sowohl auf den entfernten-/Cloud-Computer (die physische oder virtuelle Maschine) als auch auf das Programm, das auf dieser Maschine ausgeführt wird (z. B. Uvicorn). Denken Sie einfach daran, wenn Sie „Server“ im Allgemeinen lesen, dass es sich auf eines dieser beiden Dinge beziehen kann. Wenn man sich auf die entfernte Maschine bezieht, wird sie üblicherweise als **Server**, aber auch als **Maschine**, **VM** (virtuelle Maschine) oder **Knoten** bezeichnet. Diese Begriffe beziehen sich auf irgendeine Art von entfernten Rechner, normalerweise unter Linux, auf dem Sie Programme ausführen. ## Das Serverprogramm installieren Sie können einen ASGI-kompatiblen Server installieren mit: === "Uvicorn" * Uvicorn, ein blitzschneller ASGI-Server, basierend auf uvloop und httptools.
```console $ pip install "uvicorn[standard]" ---> 100% ```
!!! tip "Tipp" Durch das Hinzufügen von `standard` installiert und verwendet Uvicorn einige empfohlene zusätzliche Abhängigkeiten. Inklusive `uvloop`, einen hochperformanten Drop-in-Ersatz für `asyncio`, welcher für einen großen Leistungsschub bei der Nebenläufigkeit sorgt. === "Hypercorn" * Hypercorn, ein ASGI-Server, der auch mit HTTP/2 kompatibel ist.
```console $ pip install hypercorn ---> 100% ```
... oder jeden anderen ASGI-Server. ## Das Serverprogramm ausführen Anschließend können Sie Ihre Anwendung auf die gleiche Weise ausführen, wie Sie es in den Tutorials getan haben, jedoch ohne die Option `--reload`, z. B.: === "Uvicorn"
```console $ uvicorn main:app --host 0.0.0.0 --port 80 INFO: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit) ```
=== "Hypercorn"
```console $ hypercorn main:app --bind 0.0.0.0:80 Running on 0.0.0.0:8080 over http (CTRL + C to quit) ```
!!! warning "Achtung" Denken Sie daran, die Option `--reload` zu entfernen, wenn Sie diese verwendet haben. Die Option `--reload` verbraucht viel mehr Ressourcen, ist instabiler, usw. Sie hilft sehr während der **Entwicklung**, aber Sie sollten sie **nicht** in der **Produktion** verwenden. ## Hypercorn mit Trio Starlette und **FastAPI** basieren auf AnyIO, welches diese sowohl mit der Python-Standardbibliothek asyncio, als auch mit Trio kompatibel macht. Dennoch ist Uvicorn derzeit nur mit asyncio kompatibel und verwendet normalerweise `uvloop`, den leistungsstarken Drop-in-Ersatz für `asyncio`. Wenn Sie jedoch **Trio** direkt verwenden möchten, können Sie **Hypercorn** verwenden, da dieses es unterstützt. ✨ ### Hypercorn mit Trio installieren Zuerst müssen Sie Hypercorn mit Trio-Unterstützung installieren:
```console $ pip install "hypercorn[trio]" ---> 100% ```
### Mit Trio ausführen Dann können Sie die Befehlszeilenoption `--worker-class` mit dem Wert `trio` übergeben:
```console $ hypercorn main:app --worker-class trio ```
Und das startet Hypercorn mit Ihrer Anwendung und verwendet Trio als Backend. Jetzt können Sie Trio intern in Ihrer Anwendung verwenden. Oder noch besser: Sie können AnyIO verwenden, sodass Ihr Code sowohl mit Trio als auch asyncio kompatibel ist. 🎉 ## Konzepte des Deployments Obige Beispiele führen das Serverprogramm (z. B. Uvicorn) aus, starten **einen einzelnen Prozess** und überwachen alle IPs (`0.0.0.0`) an einem vordefinierten Port (z. B. `80`). Das ist die Grundidee. Aber Sie möchten sich wahrscheinlich um einige zusätzliche Dinge kümmern, wie zum Beispiel: * Sicherheit – HTTPS * Beim Hochfahren ausführen * Neustarts * Replikation (die Anzahl der laufenden Prozesse) * Arbeitsspeicher * Schritte vor dem Start In den nächsten Kapiteln erzähle ich Ihnen mehr über jedes dieser Konzepte, wie Sie über diese nachdenken, und gebe Ihnen einige konkrete Beispiele mit Strategien für den Umgang damit. 🚀 fastapi-0.110.3/docs/de/docs/deployment/server-workers.md000066400000000000000000000241261461403617600232720ustar00rootroot00000000000000# Serverworker – Gunicorn mit Uvicorn Schauen wir uns die Deployment-Konzepte von früher noch einmal an: * Sicherheit – HTTPS * Beim Hochfahren ausführen * Neustarts * **Replikation (die Anzahl der laufenden Prozesse)** * Arbeitsspeicher * Schritte vor dem Start Bis zu diesem Punkt, in allen Tutorials in der Dokumentation, haben Sie wahrscheinlich ein **Serverprogramm** wie Uvicorn ausgeführt, in einem **einzelnen Prozess**. Wenn Sie Anwendungen bereitstellen, möchten Sie wahrscheinlich eine gewisse **Replikation von Prozessen**, um **mehrere CPU-Kerne** zu nutzen und mehr Requests bearbeiten zu können. Wie Sie im vorherigen Kapitel über [Deployment-Konzepte](concepts.md){.internal-link target=_blank} gesehen haben, gibt es mehrere Strategien, die Sie anwenden können. Hier zeige ich Ihnen, wie Sie **Gunicorn** mit **Uvicorn Workerprozessen** verwenden. !!! info Wenn Sie Container verwenden, beispielsweise mit Docker oder Kubernetes, erzähle ich Ihnen mehr darüber im nächsten Kapitel: [FastAPI in Containern – Docker](docker.md){.internal-link target=_blank}. Insbesondere wenn die Anwendung auf **Kubernetes** läuft, werden Sie Gunicorn wahrscheinlich **nicht** verwenden wollen und stattdessen **einen einzelnen Uvicorn-Prozess pro Container** ausführen wollen, aber ich werde Ihnen später in diesem Kapitel mehr darüber erzählen. ## Gunicorn mit Uvicorn-Workern **Gunicorn** ist hauptsächlich ein Anwendungsserver, der den **WSGI-Standard** verwendet. Das bedeutet, dass Gunicorn Anwendungen wie Flask und Django ausliefern kann. Gunicorn selbst ist nicht mit **FastAPI** kompatibel, da FastAPI den neuesten **ASGI-Standard** verwendet. Aber Gunicorn kann als **Prozessmanager** arbeiten und Benutzer können ihm mitteilen, welche bestimmte **Workerprozessklasse** verwendet werden soll. Dann würde Gunicorn einen oder mehrere **Workerprozesse** starten, diese Klasse verwendend. Und **Uvicorn** hat eine **Gunicorn-kompatible Workerklasse**. Mit dieser Kombination würde Gunicorn als **Prozessmanager** fungieren und den **Port** und die **IP** abhören. Und er würde die Kommunikation an die Workerprozesse **weiterleiten**, welche die **Uvicorn-Klasse** ausführen. Und dann wäre die Gunicorn-kompatible **Uvicorn-Worker**-Klasse dafür verantwortlich, die von Gunicorn gesendeten Daten in den ASGI-Standard zu konvertieren, damit FastAPI diese verwenden kann. ## Gunicorn und Uvicorn installieren
```console $ pip install "uvicorn[standard]" gunicorn ---> 100% ```
Dadurch wird sowohl Uvicorn mit zusätzlichen `standard`-Packages (um eine hohe Leistung zu erzielen) als auch Gunicorn installiert. ## Gunicorn mit Uvicorn-Workern ausführen Dann können Sie Gunicorn ausführen mit:
```console $ gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80 [19499] [INFO] Starting gunicorn 20.1.0 [19499] [INFO] Listening at: http://0.0.0.0:80 (19499) [19499] [INFO] Using worker: uvicorn.workers.UvicornWorker [19511] [INFO] Booting worker with pid: 19511 [19513] [INFO] Booting worker with pid: 19513 [19514] [INFO] Booting worker with pid: 19514 [19515] [INFO] Booting worker with pid: 19515 [19511] [INFO] Started server process [19511] [19511] [INFO] Waiting for application startup. [19511] [INFO] Application startup complete. [19513] [INFO] Started server process [19513] [19513] [INFO] Waiting for application startup. [19513] [INFO] Application startup complete. [19514] [INFO] Started server process [19514] [19514] [INFO] Waiting for application startup. [19514] [INFO] Application startup complete. [19515] [INFO] Started server process [19515] [19515] [INFO] Waiting for application startup. [19515] [INFO] Application startup complete. ```
Sehen wir uns an, was jede dieser Optionen bedeutet: * `main:app`: Das ist die gleiche Syntax, die auch von Uvicorn verwendet wird. `main` bedeutet das Python-Modul mit dem Namen `main`, also eine Datei `main.py`. Und `app` ist der Name der Variable, welche die **FastAPI**-Anwendung ist. * Stellen Sie sich einfach vor, dass `main:app` einer Python-`import`-Anweisung wie der folgenden entspricht: ```Python from main import app ``` * Der Doppelpunkt in `main:app` entspricht also dem Python-`import`-Teil in `from main import app`. * `--workers`: Die Anzahl der zu verwendenden Workerprozesse, jeder führt einen Uvicorn-Worker aus, in diesem Fall 4 Worker. * `--worker-class`: Die Gunicorn-kompatible Workerklasse zur Verwendung in den Workerprozessen. * Hier übergeben wir die Klasse, die Gunicorn etwa so importiert und verwendet: ```Python import uvicorn.workers.UvicornWorker ``` * `--bind`: Das teilt Gunicorn die IP und den Port mit, welche abgehört werden sollen, wobei ein Doppelpunkt (`:`) verwendet wird, um die IP und den Port zu trennen. * Wenn Sie Uvicorn direkt ausführen würden, würden Sie anstelle von `--bind 0.0.0.0:80` (die Gunicorn-Option) stattdessen `--host 0.0.0.0` und `--port 80` verwenden. In der Ausgabe können Sie sehen, dass die **PID** (Prozess-ID) jedes Prozesses angezeigt wird (es ist nur eine Zahl). Sie können sehen, dass: * Der Gunicorn **Prozessmanager** beginnt, mit der PID `19499` (in Ihrem Fall ist es eine andere Nummer). * Dann beginnt er zu lauschen: `Listening at: http://0.0.0.0:80`. * Dann erkennt er, dass er die Workerklasse `uvicorn.workers.UvicornWorker` verwenden muss. * Und dann werden **4 Worker** gestartet, jeder mit seiner eigenen PID: `19511`, `19513`, `19514` und `19515`. Gunicorn würde sich bei Bedarf auch um die Verwaltung **beendeter Prozesse** und den **Neustart** von Prozessen kümmern, um die Anzahl der Worker aufrechtzuerhalten. Das hilft also teilweise beim **Neustarts**-Konzept aus der obigen Liste. Dennoch möchten Sie wahrscheinlich auch etwas außerhalb haben, um sicherzustellen, dass Gunicorn bei Bedarf **neu gestartet wird**, und er auch **beim Hochfahren ausgeführt wird**, usw. ## Uvicorn mit Workern Uvicorn bietet ebenfalls die Möglichkeit, mehrere **Workerprozesse** zu starten und auszuführen. Dennoch sind die Fähigkeiten von Uvicorn zur Abwicklung von Workerprozessen derzeit eingeschränkter als die von Gunicorn. Wenn Sie also einen Prozessmanager auf dieser Ebene (auf der Python-Ebene) haben möchten, ist es vermutlich besser, es mit Gunicorn als Prozessmanager zu versuchen. Wie auch immer, Sie würden es so ausführen:
```console $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4 INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit) INFO: Started parent process [27365] INFO: Started server process [27368] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Started server process [27369] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Started server process [27370] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Started server process [27367] INFO: Waiting for application startup. INFO: Application startup complete. ```
Die einzige neue Option hier ist `--workers`, die Uvicorn anweist, 4 Workerprozesse zu starten. Sie können auch sehen, dass die **PID** jedes Prozesses angezeigt wird, `27365` für den übergeordneten Prozess (dies ist der **Prozessmanager**) und eine für jeden Workerprozess: `27368`, `27369`, `27370` und `27367`. ## Deployment-Konzepte Hier haben Sie gesehen, wie Sie mit **Gunicorn** (oder Uvicorn) **Uvicorn-Workerprozesse** verwalten, um die Ausführung der Anwendung zu **parallelisieren**, **mehrere Kerne** der CPU zu nutzen und in der Lage zu sein, **mehr Requests** zu bedienen. In der Liste der Deployment-Konzepte von oben würde die Verwendung von Workern hauptsächlich beim **Replikation**-Teil und ein wenig bei **Neustarts** helfen, aber Sie müssen sich trotzdem um die anderen kümmern: * **Sicherheit – HTTPS** * **Beim Hochfahren ausführen** * **Neustarts** * Replikation (die Anzahl der laufenden Prozesse) * **Arbeitsspeicher** * **Schritte vor dem Start** ## Container und Docker Im nächsten Kapitel über [FastAPI in Containern – Docker](docker.md){.internal-link target=_blank} werde ich einige Strategien erläutern, die Sie für den Umgang mit den anderen **Deployment-Konzepten** verwenden können. Ich zeige Ihnen auch das **offizielle Docker-Image**, welches **Gunicorn mit Uvicorn-Workern** und einige Standardkonfigurationen enthält, die für einfache Fälle nützlich sein können. Dort zeige ich Ihnen auch, wie Sie **Ihr eigenes Image von Grund auf erstellen**, um einen einzelnen Uvicorn-Prozess (ohne Gunicorn) auszuführen. Es ist ein einfacher Vorgang und wahrscheinlich das, was Sie tun möchten, wenn Sie ein verteiltes Containerverwaltungssystem wie **Kubernetes** verwenden. ## Zusammenfassung Sie können **Gunicorn** (oder auch Uvicorn) als Prozessmanager mit Uvicorn-Workern verwenden, um **Multikern-CPUs** zu nutzen und **mehrere Prozesse parallel** auszuführen. Sie können diese Tools und Ideen nutzen, wenn Sie **Ihr eigenes Deployment-System** einrichten und sich dabei selbst um die anderen Deployment-Konzepte kümmern. Schauen Sie sich das nächste Kapitel an, um mehr über **FastAPI** mit Containern (z. B. Docker und Kubernetes) zu erfahren. Sie werden sehen, dass diese Tools auch einfache Möglichkeiten bieten, die anderen **Deployment-Konzepte** zu lösen. ✨ fastapi-0.110.3/docs/de/docs/deployment/versions.md000066400000000000000000000076361461403617600221510ustar00rootroot00000000000000# Über FastAPI-Versionen **FastAPI** wird bereits in vielen Anwendungen und Systemen produktiv eingesetzt. Und die Testabdeckung wird bei 100 % gehalten. Aber seine Entwicklung geht immer noch schnell voran. Es werden regelmäßig neue Funktionen hinzugefügt, Fehler werden regelmäßig behoben und der Code wird weiterhin kontinuierlich verbessert. Aus diesem Grund sind die aktuellen Versionen immer noch `0.x.x`, was darauf hindeutet, dass jede Version möglicherweise nicht abwärtskompatible Änderungen haben könnte. Dies folgt den Konventionen der semantischen Versionierung. Sie können jetzt Produktionsanwendungen mit **FastAPI** erstellen (und das tun Sie wahrscheinlich schon seit einiger Zeit), Sie müssen nur sicherstellen, dass Sie eine Version verwenden, die korrekt mit dem Rest Ihres Codes funktioniert. ## `fastapi`-Version pinnen Als Erstes sollten Sie die Version von **FastAPI**, die Sie verwenden, an die höchste Version „pinnen“, von der Sie wissen, dass sie für Ihre Anwendung korrekt funktioniert. Angenommen, Sie verwenden in Ihrer Anwendung die Version `0.45.0`. Wenn Sie eine `requirements.txt`-Datei verwenden, können Sie die Version wie folgt angeben: ```txt fastapi==0.45.0 ``` Das würde bedeuten, dass Sie genau die Version `0.45.0` verwenden. Oder Sie können sie auch anpinnen mit: ```txt fastapi>=0.45.0,<0.46.0 ``` Das würde bedeuten, dass Sie eine Version `0.45.0` oder höher verwenden würden, aber kleiner als `0.46.0`, beispielsweise würde eine Version `0.45.2` immer noch akzeptiert. Wenn Sie zum Verwalten Ihrer Installationen andere Tools wie Poetry, Pipenv oder andere verwenden, sie verfügen alle über eine Möglichkeit, bestimmte Versionen für Ihre Packages zu definieren. ## Verfügbare Versionen Die verfügbaren Versionen können Sie in den [Release Notes](../release-notes.md){.internal-link target=_blank} einsehen (z. B. um zu überprüfen, welches die neueste Version ist). ## Über Versionen Gemäß den Konventionen zur semantischen Versionierung könnte jede Version unter `1.0.0` potenziell nicht abwärtskompatible Änderungen hinzufügen. FastAPI folgt auch der Konvention, dass jede „PATCH“-Versionsänderung für Bugfixes und abwärtskompatible Änderungen gedacht ist. !!! tip "Tipp" Der „PATCH“ ist die letzte Zahl, zum Beispiel ist in `0.2.3` die PATCH-Version `3`. Sie sollten also in der Lage sein, eine Version wie folgt anzupinnen: ```txt fastapi>=0.45.0,<0.46.0 ``` Nicht abwärtskompatible Änderungen und neue Funktionen werden in „MINOR“-Versionen hinzugefügt. !!! tip "Tipp" „MINOR“ ist die Zahl in der Mitte, zum Beispiel ist in `0.2.3` die MINOR-Version `2`. ## Upgrade der FastAPI-Versionen Sie sollten Tests für Ihre Anwendung hinzufügen. Mit **FastAPI** ist das sehr einfach (dank Starlette), schauen Sie sich die Dokumentation an: [Testen](../tutorial/testing.md){.internal-link target=_blank} Nachdem Sie Tests erstellt haben, können Sie die **FastAPI**-Version auf eine neuere Version aktualisieren und sicherstellen, dass Ihr gesamter Code ordnungsgemäß funktioniert, indem Sie Ihre Tests ausführen. Wenn alles funktioniert oder nachdem Sie die erforderlichen Änderungen vorgenommen haben und alle Ihre Tests bestehen, können Sie Ihr `fastapi` an die neue aktuelle Version pinnen. ## Über Starlette Sie sollten die Version von `starlette` nicht pinnen. Verschiedene Versionen von **FastAPI** verwenden eine bestimmte neuere Version von Starlette. Sie können **FastAPI** also einfach die korrekte Starlette-Version verwenden lassen. ## Über Pydantic Pydantic integriert die Tests für **FastAPI** in seine eigenen Tests, sodass neue Versionen von Pydantic (über `1.0.0`) immer mit FastAPI kompatibel sind. Sie können Pydantic an jede für Sie geeignete Version über `1.0.0` und unter `2.0.0` anpinnen. Zum Beispiel: ```txt pydantic>=1.2.0,<2.0.0 ``` fastapi-0.110.3/docs/de/docs/external-links.md000066400000000000000000000026051461403617600210500ustar00rootroot00000000000000# Externe Links und Artikel **FastAPI** hat eine großartige Community, die ständig wächst. Es gibt viele Beiträge, Artikel, Tools und Projekte zum Thema **FastAPI**. Hier ist eine unvollständige Liste einiger davon. !!! tip "Tipp" Wenn Sie einen Artikel, ein Projekt, ein Tool oder irgendetwas im Zusammenhang mit **FastAPI** haben, was hier noch nicht aufgeführt ist, erstellen Sie einen Pull Request und fügen Sie es hinzu. !!! note "Hinweis Deutsche Übersetzung" Die folgenden Überschriften und Links werden aus einer anderen Datei gelesen und sind daher nicht ins Deutsche übersetzt. {% for section_name, section_content in external_links.items() %} ## {{ section_name }} {% for lang_name, lang_content in section_content.items() %} ### {{ lang_name }} {% for item in lang_content %} * {{ item.title }} by {{ item.author }}. {% endfor %} {% endfor %} {% endfor %} ## Projekte Die neuesten GitHub-Projekte zum Thema `fastapi`:
fastapi-0.110.3/docs/de/docs/fastapi-people.md000066400000000000000000000154331461403617600210240ustar00rootroot00000000000000--- hide: - navigation --- # FastAPI Leute FastAPI hat eine großartige Gemeinschaft, die Menschen mit unterschiedlichstem Hintergrund willkommen heißt. ## Erfinder - Betreuer Hey! 👋 Das bin ich: {% if people %}
{% for user in people.maintainers %}
@{{ user.login }}
Answers: {{ user.answers }}
Pull Requests: {{ user.prs }}
{% endfor %}
{% endif %} Ich bin der Erfinder und Betreuer von **FastAPI**. Sie können mehr darüber in [FastAPI helfen – Hilfe erhalten – Mit dem Autor vernetzen](help-fastapi.md#mit-dem-autor-vernetzen){.internal-link target=_blank} erfahren. ... Aber hier möchte ich Ihnen die Gemeinschaft vorstellen. --- **FastAPI** erhält eine Menge Unterstützung aus der Gemeinschaft. Und ich möchte ihre Beiträge hervorheben. Das sind die Menschen, die: * [Anderen bei Fragen auf GitHub helfen](help-fastapi.md#anderen-bei-fragen-auf-github-helfen){.internal-link target=_blank}. * [Pull Requests erstellen](help-fastapi.md#einen-pull-request-erstellen){.internal-link target=_blank}. * Pull Requests überprüfen (Review), [besonders wichtig für Übersetzungen](contributing.md#ubersetzungen){.internal-link target=_blank}. Eine Runde Applaus für sie. 👏 🙇 ## Aktivste Benutzer im letzten Monat Hier die Benutzer, die im letzten Monat am meisten [anderen mit Fragen auf Github](help-fastapi.md#anderen-bei-fragen-auf-github-helfen){.internal-link target=_blank} geholfen haben. ☕ {% if people %}
{% for user in people.last_month_active %}
@{{ user.login }}
Fragen beantwortet: {{ user.count }}
{% endfor %}
{% endif %} ## Experten Hier die **FastAPI-Experten**. 🤓 Das sind die Benutzer, die *insgesamt* [anderen am meisten mit Fragen auf GitHub geholfen haben](help-fastapi.md#anderen-bei-fragen-auf-github-helfen){.internal-link target=_blank}. Sie haben bewiesen, dass sie Experten sind, weil sie vielen anderen geholfen haben. ✨ {% if people %}
{% for user in people.experts %}
@{{ user.login }}
Fragen beantwortet: {{ user.count }}
{% endfor %}
{% endif %} ## Top-Mitwirkende Hier sind die **Top-Mitwirkenden**. 👷 Diese Benutzer haben [die meisten Pull Requests erstellt](help-fastapi.md#einen-pull-request-erstellen){.internal-link target=_blank} welche *gemerged* wurden. Sie haben Quellcode, Dokumentation, Übersetzungen, usw. beigesteuert. 📦 {% if people %}
{% for user in people.top_contributors %}
@{{ user.login }}
Pull Requests: {{ user.count }}
{% endfor %}
{% endif %} Es gibt viele andere Mitwirkende (mehr als hundert), Sie können sie alle auf der FastAPI GitHub Contributors-Seite sehen. 👷 ## Top-Rezensenten Diese Benutzer sind die **Top-Rezensenten**. 🕵️ ### Rezensionen für Übersetzungen Ich spreche nur ein paar Sprachen (und nicht sehr gut 😅). Daher bestätigen Reviewer [**Übersetzungen der Dokumentation**](contributing.md#ubersetzungen){.internal-link target=_blank}. Ohne sie gäbe es keine Dokumentation in mehreren anderen Sprachen. --- Die **Top-Reviewer** 🕵️ haben die meisten Pull Requests von anderen überprüft und stellen die Qualität des Codes, der Dokumentation und insbesondere der **Übersetzungen** sicher. {% if people %}
{% for user in people.top_reviewers %}
@{{ user.login }}
Reviews: {{ user.count }}
{% endfor %}
{% endif %} ## Sponsoren Dies sind die **Sponsoren**. 😎 Sie unterstützen meine Arbeit an **FastAPI** (und andere), hauptsächlich durch GitHub-Sponsoren. ### Gold Sponsoren {% if sponsors %} {% for sponsor in sponsors.gold -%} {% endfor %} {% endif %} ### Silber Sponsoren {% if sponsors %} {% for sponsor in sponsors.silver -%} {% endfor %} {% endif %} {% if people %} {% if people.sponsors_50 %} ### Bronze Sponsoren
{% for user in people.sponsors_50 %} {% endfor %}
{% endif %} {% endif %} ### Individuelle Sponsoren {% if people %}
{% for user in people.sponsors %} {% endfor %}
{% endif %} ## Über diese Daten - technische Details Der Hauptzweck dieser Seite ist es zu zeigen, wie die Gemeinschaft anderen hilft. Das beinhaltet auch Hilfe, die normalerweise weniger sichtbar und in vielen Fällen mühsamer ist, wie, anderen bei Problemen zu helfen und Pull Requests mit Übersetzungen zu überprüfen. Diese Daten werden jeden Monat berechnet, Sie können den Quellcode hier lesen. Hier weise ich auch auf Beiträge von Sponsoren hin. Ich behalte mir auch das Recht vor, den Algorithmus, die Abschnitte, die Schwellenwerte usw. zu aktualisieren (nur für den Fall 🤷). fastapi-0.110.3/docs/de/docs/features.md000066400000000000000000000254251461403617600177330ustar00rootroot00000000000000--- hide: - navigation --- # Merkmale ## FastAPI Merkmale **FastAPI** ermöglicht Ihnen Folgendes: ### Basiert auf offenen Standards * OpenAPI für die Erstellung von APIs, inklusive Deklarationen von Pfad-Operationen, Parametern, Body-Anfragen, Sicherheit, usw. * Automatische Dokumentation der Datenmodelle mit JSON Schema (da OpenAPI selbst auf JSON Schema basiert). * Um diese Standards herum entworfen, nach sorgfältigem Studium. Statt einer nachträglichen Schicht darüber. * Dies ermöglicht auch automatische **Client-Code-Generierung** in vielen Sprachen. ### Automatische Dokumentation Interaktive API-Dokumentation und erkundbare Web-Benutzeroberflächen. Da das Framework auf OpenAPI basiert, gibt es mehrere Optionen, zwei sind standardmäßig vorhanden. * Swagger UI, bietet interaktive Erkundung, testen und rufen Sie ihre API direkt im Webbrowser auf. ![Swagger UI Interaktion](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) * Alternative API-Dokumentation mit ReDoc. ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ### Nur modernes Python Alles basiert auf **Python 3.8 Typ**-Deklarationen (dank Pydantic). Es muss keine neue Syntax gelernt werden, nur standardisiertes modernes Python. Wenn Sie eine zweiminütige Auffrischung benötigen, wie man Python-Typen verwendet (auch wenn Sie FastAPI nicht benutzen), schauen Sie sich das kurze Tutorial an: [Einführung in Python-Typen](python-types.md){.internal-link target=_blank}. Sie schreiben Standard-Python mit Typen: ```Python from typing import List, Dict from datetime import date from pydantic import BaseModel # Deklarieren Sie eine Variable als ein `str` # und bekommen Sie Editor-Unterstütung innerhalb der Funktion def main(user_id: str): return user_id # Ein Pydantic-Modell class User(BaseModel): id: int name: str joined: date ``` Das kann nun wie folgt verwendet werden: ```Python my_user: User = User(id=3, name="John Doe", joined="2018-07-19") second_user_data = { "id": 4, "name": "Mary", "joined": "2018-11-30", } my_second_user: User = User(**second_user_data) ``` !!! info `**second_user_data` bedeutet: Nimm die Schlüssel-Wert-Paare des `second_user_data` Dicts und übergib sie direkt als Schlüsselwort-Argumente. Äquivalent zu: `User(id=4, name="Mary", joined="2018-11-30")`. ### Editor Unterstützung Das ganze Framework wurde so entworfen, dass es einfach und intuitiv zu benutzen ist; alle Entscheidungen wurden auf mehreren Editoren getestet, sogar vor der Implementierung, um die bestmögliche Entwicklererfahrung zu gewährleisten. In der letzten Python-Entwickler-Umfrage wurde klar, dass die meist genutzte Funktion die „Autovervollständigung“ ist. Das gesamte **FastAPI**-Framework ist darauf ausgelegt, das zu erfüllen. Autovervollständigung funktioniert überall. Sie werden selten noch mal in der Dokumentation nachschauen müssen. So kann ihr Editor Sie unterstützen: * in Visual Studio Code: ![Editor Unterstützung](https://fastapi.tiangolo.com/img/vscode-completion.png) * in PyCharm: ![Editor Unterstützung](https://fastapi.tiangolo.com/img/pycharm-completion.png) Sie bekommen sogar Autovervollständigung an Stellen, an denen Sie dies vorher nicht für möglich gehalten hätten. Zum Beispiel der `price` Schlüssel in einem JSON Datensatz (dieser könnte auch verschachtelt sein), der aus einer Anfrage kommt. Nie wieder falsche Schlüsselnamen tippen, Hin und Herhüpfen zwischen der Dokumentation, Hoch- und Runterscrollen, um herauszufinden, ob es `username` oder `user_name` war. ### Kompakt Es gibt für alles sensible **Defaultwerte**, mit optionaler Konfiguration überall. Alle Parameter können feinjustiert werden, damit sie tun, was Sie benötigen, und die API definieren, die Sie brauchen. Aber standardmäßig **„funktioniert einfach alles“**. ### Validierung * Validierung für die meisten (oder alle?) Python-**Datentypen**, hierzu gehören: * JSON Objekte (`dict`). * JSON Listen (`list`), die den Typ ihrer Elemente definieren. * Strings (`str`) mit definierter minimaler und maximaler Länge. * Zahlen (`int`, `float`) mit Mindest- und Maximal-Werten, usw. * Validierung für mehr exotische Typen, wie: * URL. * E-Mail. * UUID. * ... und andere. Die gesamte Validierung übernimmt das gut etablierte und robuste **Pydantic**. ### Sicherheit und Authentifizierung Sicherheit und Authentifizierung ist integriert. Ohne Kompromisse bei Datenbanken oder Datenmodellen. Alle in OpenAPI definierten Sicherheitsschemas, inklusive: * HTTP Basic Authentifizierung. * **OAuth2** (auch mit **JWT Tokens**). Siehe dazu das Tutorial zu [OAuth2 mit JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. * API Schlüssel in: * Header-Feldern. * Anfrageparametern. * Cookies, usw. Zusätzlich alle Sicherheitsfunktionen von Starlette (inklusive **Session Cookies**). Alles als wiederverwendbare Tools und Komponenten gebaut, die einfach in ihre Systeme, Datenspeicher, relationalen und nicht-relationalen Datenbanken, usw., integriert werden können. ### Einbringen von Abhängigkeiten (Dependency Injection) FastAPI enthält ein extrem einfach zu verwendendes, aber extrem mächtiges Dependency Injection System. * Selbst Abhängigkeiten können Abhängigkeiten haben, woraus eine Hierarchie oder ein **„Graph“ von Abhängigkeiten** entsteht. * Alles **automatisch gehandhabt** durch das Framework. * Alle Abhängigkeiten können Daten von Anfragen anfordern und das Verhalten von **Pfadoperationen** und der automatisierten Dokumentation **modifizieren**. * **Automatische Validierung** selbst für solche Parameter von *Pfadoperationen*, welche in Abhängigkeiten definiert sind. * Unterstützung für komplexe Authentifizierungssysteme, **Datenbankverbindungen**, usw. * **Keine Kompromisse** bei Datenbanken, Frontends, usw., sondern einfache Integration mit allen. ### Unbegrenzte Erweiterungen Oder mit anderen Worten, sie werden nicht benötigt. Importieren und nutzen Sie den Code, den Sie brauchen. Jede Integration wurde so entworfen, dass sie so einfach zu nutzen ist (mit Abhängigkeiten), dass Sie eine Erweiterung für Ihre Anwendung mit nur zwei Zeilen Code erstellen können. Hierbei nutzen Sie die gleiche Struktur und Syntax, wie bei *Pfadoperationen*. ### Getestet * 100 % Testabdeckung. * 100 % Typen annotiert. * Verwendet in Produktionsanwendungen. ## Starlette's Merkmale **FastAPI** ist vollkommen kompatibel (und basiert auf) Starlette. Das bedeutet, wenn Sie eigenen Starlette Quellcode haben, funktioniert der. `FastAPI` ist tatsächlich eine Unterklasse von `Starlette`. Wenn Sie also bereits Starlette kennen oder benutzen, das meiste funktioniert genau so. Mit **FastAPI** bekommen Sie alles von **Starlette** (da FastAPI nur Starlette auf Steroiden ist): * Schwer beeindruckende Performanz. Es ist eines der schnellsten Python-Frameworks, auf Augenhöhe mit **NodeJS** und **Go**. * **WebSocket**-Unterstützung. * Hintergrundaufgaben im selben Prozess. * Ereignisse beim Starten und Herunterfahren. * Testclient baut auf HTTPX auf. * **CORS**, GZip, statische Dateien, Responses streamen. * **Sitzungs- und Cookie**-Unterstützung. * 100 % Testabdeckung. * 100 % Typen annotierte Codebasis. ## Pydantic's Merkmale **FastAPI** ist vollkommen kompatibel (und basiert auf) Pydantic. Das bedeutet, wenn Sie eigenen Pydantic Quellcode haben, funktioniert der. Inklusive externer Bibliotheken, die auf Pydantic basieren, wie ORMs, ODMs für Datenbanken. Daher können Sie in vielen Fällen das Objekt einer Anfrage **direkt zur Datenbank** schicken, weil alles automatisch validiert wird. Das gleiche gilt auch für die andere Richtung: Sie können in vielen Fällen das Objekt aus der Datenbank **direkt zum Client** schicken. Mit **FastAPI** bekommen Sie alle Funktionen von **Pydantic** (da FastAPI für die gesamte Datenverarbeitung Pydantic nutzt): * **Kein Kopfzerbrechen**: * Keine neue Schemadefinition-Mikrosprache zu lernen. * Wenn Sie Pythons Typen kennen, wissen Sie, wie man Pydantic verwendet. * Gutes Zusammenspiel mit Ihrer/Ihrem **IDE/Linter/Gehirn**: * Weil Pydantics Datenstrukturen einfach nur Instanzen ihrer definierten Klassen sind; Autovervollständigung, Linting, mypy und ihre Intuition sollten alle einwandfrei mit ihren validierten Daten funktionieren. * Validierung von **komplexen Strukturen**: * Benutzung von hierarchischen Pydantic-Modellen, Python-`typing`s `List` und `Dict`, etc. * Die Validierer erlauben es, komplexe Datenschemen klar und einfach zu definieren, überprüft und dokumentiert als JSON Schema. * Sie können tief **verschachtelte JSON** Objekte haben, die alle validiert und annotiert sind. * **Erweiterbar**: * Pydantic erlaubt die Definition von eigenen Datentypen oder sie können die Validierung mit einer `validator`-dekorierten Methode im Modell erweitern. * 100 % Testabdeckung. fastapi-0.110.3/docs/de/docs/help-fastapi.md000066400000000000000000000400261461403617600204640ustar00rootroot00000000000000# FastAPI helfen – Hilfe erhalten Gefällt Ihnen **FastAPI**? Möchten Sie FastAPI, anderen Benutzern und dem Autor helfen? Oder möchten Sie Hilfe zu **FastAPI** erhalten? Es gibt sehr einfache Möglichkeiten zu helfen (manche erfordern nur ein oder zwei Klicks). Und es gibt auch viele Möglichkeiten, Hilfe zu bekommen. ## Newsletter abonnieren Sie können den (unregelmäßig erscheinenden) [**FastAPI and Friends**-Newsletter](newsletter.md){.internal-link target=_blank} abonnieren, um auf dem Laufenden zu bleiben: * Neuigkeiten über FastAPI and Friends 🚀 * Anleitungen 📝 * Funktionen ✨ * Breaking Changes 🚨 * Tipps und Tricks ✅ ## FastAPI auf Twitter folgen Folgen Sie @fastapi auf **Twitter**, um die neuesten Nachrichten über **FastAPI** zu erhalten. 🐦 ## **FastAPI** auf GitHub einen Stern geben Sie können FastAPI auf GitHub „starren“ (durch Klicken auf den Stern-Button oben rechts): https://github.com/tiangolo/fastapi. ⭐️ Durch das Hinzufügen eines Sterns können andere Benutzer es leichter finden und sehen, dass es für andere bereits nützlich war. ## Das GitHub-Repository auf Releases beobachten Sie können FastAPI in GitHub beobachten (Klicken Sie oben rechts auf den Button „watch“): https://github.com/tiangolo/fastapi. 👀 Dort können Sie „Releases only“ auswählen. Auf diese Weise erhalten Sie Benachrichtigungen (per E-Mail), wenn es einen neuen Release (eine neue Version) von **FastAPI** mit Fehlerbehebungen und neuen Funktionen gibt. ## Mit dem Autor vernetzen Sie können sich mit mir (Sebastián Ramírez / `tiangolo`), dem Autor, verbinden. Insbesondere: * Folgen Sie mir auf **GitHub**. * Finden Sie andere Open-Source-Projekte, die ich erstellt habe und die Ihnen helfen könnten. * Folgen Sie mir, um mitzubekommen, wenn ich ein neues Open-Source-Projekt erstelle. * Folgen Sie mir auf **Twitter** oder Mastodon. * Berichten Sie mir, wie Sie FastAPI verwenden (das höre ich gerne). * Bekommen Sie mit, wenn ich Ankündigungen mache oder neue Tools veröffentliche. * Sie können auch @fastapi auf Twitter folgen (ein separates Konto). * Folgen Sie mir auf **LinkedIn**. * Bekommen Sie mit, wenn ich Ankündigungen mache oder neue Tools veröffentliche (obwohl ich Twitter häufiger verwende 🤷‍♂). * Lesen Sie, was ich schreibe (oder folgen Sie mir) auf **Dev.to** oder **Medium**. * Lesen Sie andere Ideen, Artikel, und erfahren Sie mehr über die von mir erstellten Tools. * Folgen Sie mir, um zu lesen, wenn ich etwas Neues veröffentliche. ## Über **FastAPI** tweeten Tweeten Sie über **FastAPI** und teilen Sie mir und anderen mit, warum es Ihnen gefällt. 🎉 Ich höre gerne, wie **FastAPI** verwendet wird, was Ihnen daran gefallen hat, in welchem Projekt/Unternehmen Sie es verwenden, usw. ## Für FastAPI abstimmen * Stimmen Sie für **FastAPI** auf Slant. * Stimmen Sie für **FastAPI** auf AlternativeTo. * Berichten Sie auf StackShare, dass Sie **FastAPI** verwenden. ## Anderen bei Fragen auf GitHub helfen Sie können versuchen, anderen bei ihren Fragen zu helfen: * GitHub-Diskussionen * GitHub-Issues In vielen Fällen kennen Sie möglicherweise bereits die Antwort auf diese Fragen. 🤓 Wenn Sie vielen Menschen bei ihren Fragen helfen, werden Sie offizieller [FastAPI-Experte](fastapi-people.md#experten){.internal-link target=_blank}. 🎉 Denken Sie aber daran, der wichtigste Punkt ist: Versuchen Sie, freundlich zu sein. Die Leute bringen ihre Frustrationen mit und fragen in vielen Fällen nicht auf die beste Art und Weise, aber versuchen Sie dennoch so gut wie möglich, freundlich zu sein. 🤗 Die **FastAPI**-Community soll freundlich und einladend sein. Und auch kein Mobbing oder respektloses Verhalten gegenüber anderen akzeptieren. Wir müssen uns umeinander kümmern. --- So helfen Sie anderen bei Fragen (in Diskussionen oder Problemen): ### Die Frage verstehen * Fragen Sie sich, ob Sie verstehen, was das **Ziel** und der Anwendungsfall der fragenden Person ist. * Überprüfen Sie dann, ob die Frage (die überwiegende Mehrheit sind Fragen) **klar** ist. * In vielen Fällen handelt es sich bei der gestellten Frage um eine Lösung, die der Benutzer sich vorstellt, aber es könnte eine **bessere** Lösung geben. Wenn Sie das Problem und den Anwendungsfall besser verstehen, können Sie eine bessere **Alternativlösung** vorschlagen. * Wenn Sie die Frage nicht verstehen können, fragen Sie nach weiteren **Details**. ### Das Problem reproduzieren In den meisten Fällen und bei den meisten Fragen ist etwas mit dem von der Person erstellten **eigenen Quellcode** los. In vielen Fällen wird nur ein Fragment des Codes gepostet, aber das reicht nicht aus, um **das Problem zu reproduzieren**. * Sie können die Person darum bitten, ein minimales, reproduzierbares Beispiel bereitzustellen, welches Sie **kopieren, einfügen** und lokal ausführen können, um den gleichen Fehler oder das gleiche Verhalten zu sehen, das die Person sieht, oder um ihren Anwendungsfall besser zu verstehen. * Wenn Sie in Geberlaune sind, können Sie versuchen, selbst ein solches Beispiel zu erstellen, nur basierend auf der Beschreibung des Problems. Denken Sie jedoch daran, dass dies viel Zeit in Anspruch nehmen kann und dass es besser sein kann, zunächst um eine Klärung des Problems zu bitten. ### Lösungen vorschlagen * Nachdem Sie die Frage verstanden haben, können Sie eine mögliche **Antwort** geben. * In vielen Fällen ist es besser, das **zugrunde liegende Problem oder den Anwendungsfall** zu verstehen, da es möglicherweise einen besseren Weg zur Lösung gibt als das, was die Person versucht. ### Um Schließung bitten Wenn die Person antwortet, besteht eine hohe Chance, dass Sie ihr Problem gelöst haben. Herzlichen Glückwunsch, **Sie sind ein Held**! 🦸 * Wenn es tatsächlich das Problem gelöst hat, können Sie sie darum bitten: * In GitHub-Diskussionen: den Kommentar als **Antwort** zu markieren. * In GitHub-Issues: Das Issue zu **schließen**. ## Das GitHub-Repository beobachten Sie können FastAPI auf GitHub „beobachten“ (Klicken Sie oben rechts auf die Schaltfläche „watch“): https://github.com/tiangolo/fastapi. 👀 Wenn Sie dann „Watching“ statt „Releases only“ auswählen, erhalten Sie Benachrichtigungen, wenn jemand ein neues Issue eröffnet oder eine neue Frage stellt. Sie können auch spezifizieren, dass Sie nur über neue Issues, Diskussionen, PRs, usw. benachrichtigt werden möchten. Dann können Sie versuchen, bei der Lösung solcher Fragen zu helfen. ## Fragen stellen Sie können im GitHub-Repository eine neue Frage erstellen, zum Beispiel: * Stellen Sie eine **Frage** oder bitten Sie um Hilfe mit einem **Problem**. * Schlagen Sie eine neue **Funktionalität** vor. **Hinweis**: Wenn Sie das tun, bitte ich Sie, auch anderen zu helfen. 😉 ## Pull Requests prüfen Sie können mir helfen, Pull Requests von anderen zu überprüfen (Review). Noch einmal, bitte versuchen Sie Ihr Bestes, freundlich zu sein. 🤗 --- Hier ist, was Sie beachten sollten und wie Sie einen Pull Request überprüfen: ### Das Problem verstehen * Stellen Sie zunächst sicher, dass Sie **das Problem verstehen**, welches der Pull Request zu lösen versucht. Möglicherweise gibt es eine längere Diskussion dazu in einer GitHub-Diskussion oder einem GitHub-Issue. * Es besteht auch eine gute Chance, dass der Pull Request nicht wirklich benötigt wird, da das Problem auf **andere Weise** gelöst werden kann. Dann können Sie das vorschlagen oder danach fragen. ### Der Stil ist nicht so wichtig * Machen Sie sich nicht zu viele Gedanken über Dinge wie den Stil von Commit-Nachrichten, ich werde den Commit manuell zusammenführen und anpassen. * Machen Sie sich auch keine Sorgen über Stilregeln, es gibt bereits automatisierte Tools, die das überprüfen. Und wenn es irgendeinen anderen Stil- oder Konsistenz-Bedarf gibt, bitte ich direkt darum oder füge zusätzliche Commits mit den erforderlichen Änderungen hinzu. ### Den Code überprüfen * Prüfen und lesen Sie den Code, fragen Sie sich, ob er Sinn macht, **führen Sie ihn lokal aus** und testen Sie, ob er das Problem tatsächlich löst. * Schreiben Sie dann einen **Kommentar** und berichten, dass Sie das getan haben. So weiß ich, dass Sie ihn wirklich überprüft haben. !!! info Leider kann ich PRs, nur weil sie von Mehreren gutgeheißen wurden, nicht einfach vertrauen. Es ist mehrmals passiert, dass es PRs mit drei, fünf oder mehr Zustimmungen gibt, wahrscheinlich weil die Beschreibung ansprechend ist, aber wenn ich die PRs überprüfe, sind sie tatsächlich fehlerhaft, haben einen Bug, oder lösen das Problem nicht, welches sie behaupten, zu lösen. 😅 Daher ist es wirklich wichtig, dass Sie den Code tatsächlich lesen und ausführen und mir in den Kommentaren mitteilen, dass Sie dies getan haben. 🤓 * Wenn der PR irgendwie vereinfacht werden kann, fragen Sie ruhig danach, aber seien Sie nicht zu wählerisch, es gibt viele subjektive Standpunkte (und ich habe auch meinen eigenen 🙈), also ist es besser, wenn man sich auf die wesentlichen Dinge konzentriert. ### Tests * Helfen Sie mir zu überprüfen, dass der PR **Tests** hat. * Überprüfen Sie, dass diese Tests vor dem PR **fehlschlagen**. 🚨 * Überprüfen Sie, dass diese Tests nach dem PR **bestanden** werden. ✅ * Viele PRs haben keine Tests. Sie können den Autor daran **erinnern**, Tests hinzuzufügen, oder Sie können sogar selbst einige Tests **vorschlagen**. Das ist eines der Dinge, die die meiste Zeit in Anspruch nehmen, und dabei können Sie viel helfen. * Kommentieren Sie auch hier anschließend, was Sie versucht haben, sodass ich weiß, dass Sie es überprüft haben. 🤓 ## Einen Pull Request erstellen Sie können zum Quellcode mit Pull Requests [beitragen](contributing.md){.internal-link target=_blank}, zum Beispiel: * Um einen Tippfehler zu beheben, den Sie in der Dokumentation gefunden haben. * Um einen Artikel, ein Video oder einen Podcast über FastAPI zu teilen, den Sie erstellt oder gefunden haben, indem Sie diese Datei bearbeiten. * Stellen Sie sicher, dass Sie Ihren Link am Anfang des entsprechenden Abschnitts einfügen. * Um zu helfen, [die Dokumentation in Ihre Sprache zu übersetzen](contributing.md#ubersetzungen){.internal-link target=_blank}. * Sie können auch dabei helfen, die von anderen erstellten Übersetzungen zu überprüfen (Review). * Um neue Dokumentationsabschnitte vorzuschlagen. * Um ein bestehendes Problem / einen bestehenden Bug zu beheben. * Stellen Sie sicher, dass Sie Tests hinzufügen. * Um eine neue Funktionalität hinzuzufügen. * Stellen Sie sicher, dass Sie Tests hinzufügen. * Stellen Sie sicher, dass Sie Dokumentation hinzufügen, falls das notwendig ist. ## FastAPI pflegen Helfen Sie mir, **FastAPI** instand zu halten! 🤓 Es gibt viel zu tun, und das meiste davon können **SIE** tun. Die Hauptaufgaben, die Sie jetzt erledigen können, sind: * [Helfen Sie anderen bei Fragen auf GitHub](#anderen-bei-fragen-auf-github-helfen){.internal-link target=_blank} (siehe Abschnitt oben). * [Prüfen Sie Pull Requests](#pull-requests-prufen){.internal-link target=_blank} (siehe Abschnitt oben). Diese beiden Dinge sind es, die **die meiste Zeit in Anspruch nehmen**. Das ist die Hauptarbeit bei der Wartung von FastAPI. Wenn Sie mir dabei helfen können, **helfen Sie mir, FastAPI am Laufen zu erhalten** und sorgen dafür, dass es weiterhin **schneller und besser voranschreitet**. 🚀 ## Beim Chat mitmachen Treten Sie dem 👥 Discord-Chatserver 👥 bei und treffen Sie sich mit anderen Mitgliedern der FastAPI-Community. !!! tip "Tipp" Wenn Sie Fragen haben, stellen Sie sie bei GitHub Diskussionen, es besteht eine viel bessere Chance, dass Sie hier Hilfe von den [FastAPI-Experten](fastapi-people.md#experten){.internal-link target=_blank} erhalten. Nutzen Sie den Chat nur für andere allgemeine Gespräche. ### Den Chat nicht für Fragen verwenden Bedenken Sie, da Chats mehr „freie Konversation“ ermöglichen, dass es verlockend ist, Fragen zu stellen, die zu allgemein und schwierig zu beantworten sind, sodass Sie möglicherweise keine Antworten erhalten. Auf GitHub hilft Ihnen die Vorlage dabei, die richtige Frage zu schreiben, sodass Sie leichter eine gute Antwort erhalten oder das Problem sogar selbst lösen können, noch bevor Sie fragen. Und auf GitHub kann ich sicherstellen, dass ich immer alles beantworte, auch wenn es einige Zeit dauert. Ich persönlich kann das mit den Chat-Systemen nicht machen. 😅 Unterhaltungen in den Chat-Systemen sind außerdem nicht so leicht durchsuchbar wie auf GitHub, sodass Fragen und Antworten möglicherweise im Gespräch verloren gehen. Und nur die auf GitHub machen einen [FastAPI-Experten](fastapi-people.md#experten){.internal-link target=_blank}, Sie werden also höchstwahrscheinlich mehr Aufmerksamkeit auf GitHub erhalten. Auf der anderen Seite gibt es Tausende von Benutzern in den Chat-Systemen, sodass die Wahrscheinlichkeit hoch ist, dass Sie dort fast immer jemanden zum Reden finden. 😄 ## Den Autor sponsern Sie können den Autor (mich) auch über GitHub-Sponsoren finanziell unterstützen. Dort könnten Sie mir als Dankeschön einen Kaffee spendieren ☕️. 😄 Und Sie können auch Silber- oder Gold-Sponsor für FastAPI werden. 🏅🎉 ## Die Tools sponsern, die FastAPI unterstützen Wie Sie in der Dokumentation gesehen haben, steht FastAPI auf den Schultern von Giganten, Starlette und Pydantic. Sie können auch sponsern: * Samuel Colvin (Pydantic) * Encode (Starlette, Uvicorn) --- Danke! 🚀 fastapi-0.110.3/docs/de/docs/help/000077500000000000000000000000001461403617600165135ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/help/index.md000066400000000000000000000000771461403617600201500ustar00rootroot00000000000000# Hilfe Helfen und Hilfe erhalten, beitragen, mitmachen. 🤝 fastapi-0.110.3/docs/de/docs/history-design-future.md000066400000000000000000000115051461403617600223670ustar00rootroot00000000000000# Geschichte, Design und Zukunft Vor einiger Zeit fragte ein **FastAPI**-Benutzer: > Was ist die Geschichte dieses Projekts? Es scheint, als wäre es in ein paar Wochen aus dem Nichts zu etwas Großartigem geworden [...] Hier ist ein wenig über diese Geschichte. ## Alternativen Ich habe seit mehreren Jahren APIs mit komplexen Anforderungen (maschinelles Lernen, verteilte Systeme, asynchrone Jobs, NoSQL-Datenbanken, usw.) erstellt und leitete mehrere Entwicklerteams. Dabei musste ich viele Alternativen untersuchen, testen und nutzen. Die Geschichte von **FastAPI** ist zu einem großen Teil die Geschichte seiner Vorgänger. Wie im Abschnitt [Alternativen](alternatives.md){.internal-link target=_blank} gesagt:
**FastAPI** würde ohne die frühere Arbeit anderer nicht existieren. Es wurden zuvor viele Tools entwickelt, die als Inspiration für seine Entwicklung dienten. Ich habe die Schaffung eines neuen Frameworks viele Jahre lang vermieden. Zuerst habe ich versucht, alle von **FastAPI** abgedeckten Funktionen mithilfe vieler verschiedener Frameworks, Plugins und Tools zu lösen. Aber irgendwann gab es keine andere Möglichkeit, als etwas zu schaffen, das all diese Funktionen bereitstellte, die besten Ideen früherer Tools aufnahm und diese auf die bestmögliche Weise kombinierte, wobei Sprachfunktionen verwendet wurden, die vorher noch nicht einmal verfügbar waren (Python 3.6+ Typhinweise).
## Investigation Durch die Nutzung all dieser vorherigen Alternativen hatte ich die Möglichkeit, von allen zu lernen, Ideen aufzunehmen und sie auf die beste Weise zu kombinieren, die ich für mich und die Entwicklerteams, mit denen ich zusammengearbeitet habe, finden konnte. Es war beispielsweise klar, dass es idealerweise auf Standard-Python-Typhinweisen basieren sollte. Der beste Ansatz bestand außerdem darin, bereits bestehende Standards zu nutzen. Bevor ich also überhaupt angefangen habe, **FastAPI** zu schreiben, habe ich mehrere Monate damit verbracht, die Spezifikationen für OpenAPI, JSON Schema, OAuth2, usw. zu studieren und deren Beziehungen, Überschneidungen und Unterschiede zu verstehen. ## Design Dann habe ich einige Zeit damit verbracht, die Entwickler-„API“ zu entwerfen, die ich als Benutzer haben wollte (als Entwickler, welcher FastAPI verwendet). Ich habe mehrere Ideen in den beliebtesten Python-Editoren getestet: PyCharm, VS Code, Jedi-basierte Editoren. Laut der letzten Python-Entwickler-Umfrage, deckt das etwa 80 % der Benutzer ab. Das bedeutet, dass **FastAPI** speziell mit den Editoren getestet wurde, die von 80 % der Python-Entwickler verwendet werden. Und da die meisten anderen Editoren in der Regel ähnlich funktionieren, sollten alle diese Vorteile für praktisch alle Editoren funktionieren. Auf diese Weise konnte ich die besten Möglichkeiten finden, die Codeverdoppelung so weit wie möglich zu reduzieren, überall Autovervollständigung, Typ- und Fehlerprüfungen, usw. zu gewährleisten. Alles auf eine Weise, die allen Entwicklern das beste Entwicklungserlebnis bot. ## Anforderungen Nachdem ich mehrere Alternativen getestet hatte, entschied ich, dass ich **Pydantic** wegen seiner Vorteile verwenden würde. Dann habe ich zu dessen Code beigetragen, um es vollständig mit JSON Schema kompatibel zu machen, und so verschiedene Möglichkeiten zum Definieren von einschränkenden Deklarationen (Constraints) zu unterstützen, und die Editorunterstützung (Typprüfungen, Codevervollständigung) zu verbessern, basierend auf den Tests in mehreren Editoren. Während der Entwicklung habe ich auch zu **Starlette** beigetragen, der anderen Schlüsselanforderung. ## Entwicklung Als ich mit der Erstellung von **FastAPI** selbst begann, waren die meisten Teile bereits vorhanden, das Design definiert, die Anforderungen und Tools bereit und das Wissen über die Standards und Spezifikationen klar und frisch. ## Zukunft Zu diesem Zeitpunkt ist bereits klar, dass **FastAPI** mit seinen Ideen für viele Menschen nützlich ist. Es wird gegenüber früheren Alternativen gewählt, da es für viele Anwendungsfälle besser geeignet ist. Viele Entwickler und Teams verlassen sich bei ihren Projekten bereits auf **FastAPI** (einschließlich mir und meinem Team). Dennoch stehen uns noch viele Verbesserungen und Funktionen bevor. **FastAPI** hat eine große Zukunft vor sich. Und [Ihre Hilfe](help-fastapi.md){.internal-link target=_blank} wird sehr geschätzt. fastapi-0.110.3/docs/de/docs/how-to/000077500000000000000000000000001461403617600170005ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/how-to/conditional-openapi.md000066400000000000000000000054231461403617600232620ustar00rootroot00000000000000# Bedingte OpenAPI Bei Bedarf können Sie OpenAPI mithilfe von Einstellungen und Umgebungsvariablen abhängig von der Umgebung bedingt konfigurieren und sogar vollständig deaktivieren. ## Über Sicherheit, APIs und Dokumentation Das Verstecken Ihrer Dokumentationsoberflächen in der Produktion *sollte nicht* die Methode sein, Ihre API zu schützen. Dadurch wird Ihrer API keine zusätzliche Sicherheit hinzugefügt, die *Pfadoperationen* sind weiterhin dort verfügbar, wo sie sich befinden. Wenn Ihr Code eine Sicherheitslücke aufweist, ist diese weiterhin vorhanden. Das Verstecken der Dokumentation macht es nur schwieriger zu verstehen, wie mit Ihrer API interagiert werden kann, und könnte es auch schwieriger machen, diese in der Produktion zu debuggen. Man könnte es einfach als eine Form von Security through obscurity betrachten. Wenn Sie Ihre API sichern möchten, gibt es mehrere bessere Dinge, die Sie tun können, zum Beispiel: * Stellen Sie sicher, dass Sie über gut definierte Pydantic-Modelle für Ihre Requestbodys und Responses verfügen. * Konfigurieren Sie alle erforderlichen Berechtigungen und Rollen mithilfe von Abhängigkeiten. * Speichern Sie niemals Klartext-Passwörter, sondern nur Passwort-Hashes. * Implementieren und verwenden Sie gängige kryptografische Tools wie Passlib und JWT-Tokens, usw. * Fügen Sie bei Bedarf detailliertere Berechtigungskontrollen mit OAuth2-Scopes hinzu. * ... usw. Dennoch kann es sein, dass Sie einen ganz bestimmten Anwendungsfall haben, bei dem Sie die API-Dokumentation für eine bestimmte Umgebung (z. B. für die Produktion) oder abhängig von Konfigurationen aus Umgebungsvariablen wirklich deaktivieren müssen. ## Bedingte OpenAPI aus Einstellungen und Umgebungsvariablen Sie können problemlos dieselben Pydantic-Einstellungen verwenden, um Ihre generierte OpenAPI und die Dokumentationsoberflächen zu konfigurieren. Zum Beispiel: ```Python hl_lines="6 11" {!../../../docs_src/conditional_openapi/tutorial001.py!} ``` Hier deklarieren wir die Einstellung `openapi_url` mit dem gleichen Defaultwert `"/openapi.json"`. Und dann verwenden wir das beim Erstellen der `FastAPI`-App. Dann könnten Sie OpenAPI (einschließlich der Dokumentationsoberflächen) deaktivieren, indem Sie die Umgebungsvariable `OPENAPI_URL` auf einen leeren String setzen, wie zum Beispiel:
```console $ OPENAPI_URL= uvicorn main:app INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
Wenn Sie dann zu den URLs unter `/openapi.json`, `/docs` oder `/redoc` gehen, erhalten Sie lediglich einen `404 Not Found`-Fehler, wie: ```JSON { "detail": "Not Found" } ``` fastapi-0.110.3/docs/de/docs/how-to/configure-swagger-ui.md000066400000000000000000000064351461403617600233630ustar00rootroot00000000000000# Swagger-Oberfläche konfigurieren Sie können einige zusätzliche Parameter der Swagger-Oberfläche konfigurieren. Um diese zu konfigurieren, übergeben Sie das Argument `swagger_ui_parameters` beim Erstellen des `FastAPI()`-App-Objekts oder an die Funktion `get_swagger_ui_html()`. `swagger_ui_parameters` empfängt ein Dict mit den Konfigurationen, die direkt an die Swagger-Oberfläche übergeben werden. FastAPI konvertiert die Konfigurationen nach **JSON**, um diese mit JavaScript kompatibel zu machen, da die Swagger-Oberfläche das benötigt. ## Syntaxhervorhebung deaktivieren Sie könnten beispielsweise die Syntaxhervorhebung in der Swagger-Oberfläche deaktivieren. Ohne Änderung der Einstellungen ist die Syntaxhervorhebung standardmäßig aktiviert: Sie können sie jedoch deaktivieren, indem Sie `syntaxHighlight` auf `False` setzen: ```Python hl_lines="3" {!../../../docs_src/configure_swagger_ui/tutorial001.py!} ``` ... und dann zeigt die Swagger-Oberfläche die Syntaxhervorhebung nicht mehr an: ## Das Theme ändern Auf die gleiche Weise könnten Sie das Theme der Syntaxhervorhebung mit dem Schlüssel `syntaxHighlight.theme` festlegen (beachten Sie, dass er einen Punkt in der Mitte hat): ```Python hl_lines="3" {!../../../docs_src/configure_swagger_ui/tutorial002.py!} ``` Obige Konfiguration würde das Theme für die Farbe der Syntaxhervorhebung ändern: ## Defaultparameter der Swagger-Oberfläche ändern FastAPI enthält einige Defaultkonfigurationsparameter, die für die meisten Anwendungsfälle geeignet sind. Es umfasst die folgenden Defaultkonfigurationen: ```Python {!../../../fastapi/openapi/docs.py[ln:7-23]!} ``` Sie können jede davon überschreiben, indem Sie im Argument `swagger_ui_parameters` einen anderen Wert festlegen. Um beispielsweise `deepLinking` zu deaktivieren, könnten Sie folgende Einstellungen an `swagger_ui_parameters` übergeben: ```Python hl_lines="3" {!../../../docs_src/configure_swagger_ui/tutorial003.py!} ``` ## Andere Parameter der Swagger-Oberfläche Um alle anderen möglichen Konfigurationen zu sehen, die Sie verwenden können, lesen Sie die offizielle Dokumentation für die Parameter der Swagger-Oberfläche. ## JavaScript-basierte Einstellungen Die Swagger-Oberfläche erlaubt, dass andere Konfigurationen auch **JavaScript**-Objekte sein können (z. B. JavaScript-Funktionen). FastAPI umfasst auch diese Nur-JavaScript-`presets`-Einstellungen: ```JavaScript presets: [ SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset ] ``` Dabei handelt es sich um **JavaScript**-Objekte, nicht um Strings, daher können Sie diese nicht direkt vom Python-Code aus übergeben. Wenn Sie solche JavaScript-Konfigurationen verwenden müssen, können Sie einen der früher genannten Wege verwenden. Überschreiben Sie alle *Pfadoperationen* der Swagger-Oberfläche und schreiben Sie manuell jedes benötigte JavaScript. fastapi-0.110.3/docs/de/docs/how-to/custom-docs-ui-assets.md000066400000000000000000000223351461403617600235020ustar00rootroot00000000000000# Statische Assets der Dokumentationsoberfläche (selbst hosten) Die API-Dokumentation verwendet **Swagger UI** und **ReDoc**, und jede dieser Dokumentationen benötigt einige JavaScript- und CSS-Dateien. Standardmäßig werden diese Dateien von einem CDN bereitgestellt. Es ist jedoch möglich, das anzupassen, ein bestimmtes CDN festzulegen oder die Dateien selbst bereitzustellen. ## Benutzerdefiniertes CDN für JavaScript und CSS Nehmen wir an, Sie möchten ein anderes CDN verwenden, zum Beispiel möchten Sie `https://unpkg.com/` verwenden. Das kann nützlich sein, wenn Sie beispielsweise in einem Land leben, in dem bestimmte URLs eingeschränkt sind. ### Die automatischen Dokumentationen deaktivieren Der erste Schritt besteht darin, die automatischen Dokumentationen zu deaktivieren, da diese standardmäßig das Standard-CDN verwenden. Um diese zu deaktivieren, setzen Sie deren URLs beim Erstellen Ihrer `FastAPI`-App auf `None`: ```Python hl_lines="8" {!../../../docs_src/custom_docs_ui/tutorial001.py!} ``` ### Die benutzerdefinierten Dokumentationen hinzufügen Jetzt können Sie die *Pfadoperationen* für die benutzerdefinierten Dokumentationen erstellen. Sie können die internen Funktionen von FastAPI wiederverwenden, um die HTML-Seiten für die Dokumentation zu erstellen und ihnen die erforderlichen Argumente zu übergeben: * `openapi_url`: die URL, unter welcher die HTML-Seite für die Dokumentation das OpenAPI-Schema für Ihre API abrufen kann. Sie können hier das Attribut `app.openapi_url` verwenden. * `title`: der Titel Ihrer API. * `oauth2_redirect_url`: Sie können hier `app.swagger_ui_oauth2_redirect_url` verwenden, um die Standardeinstellung zu verwenden. * `swagger_js_url`: die URL, unter welcher der HTML-Code für Ihre Swagger-UI-Dokumentation die **JavaScript**-Datei abrufen kann. Dies ist die benutzerdefinierte CDN-URL. * `swagger_css_url`: die URL, unter welcher der HTML-Code für Ihre Swagger-UI-Dokumentation die **CSS**-Datei abrufen kann. Dies ist die benutzerdefinierte CDN-URL. Und genau so für ReDoc ... ```Python hl_lines="2-6 11-19 22-24 27-33" {!../../../docs_src/custom_docs_ui/tutorial001.py!} ``` !!! tip "Tipp" Die *Pfadoperation* für `swagger_ui_redirect` ist ein Hilfsmittel bei der Verwendung von OAuth2. Wenn Sie Ihre API mit einem OAuth2-Anbieter integrieren, können Sie sich authentifizieren und mit den erworbenen Anmeldeinformationen zur API-Dokumentation zurückkehren. Und mit ihr interagieren, die echte OAuth2-Authentifizierung verwendend. Swagger UI erledigt das hinter den Kulissen für Sie, benötigt aber diesen „Umleitungs“-Helfer. ### Eine *Pfadoperation* erstellen, um es zu testen Um nun testen zu können, ob alles funktioniert, erstellen Sie eine *Pfadoperation*: ```Python hl_lines="36-38" {!../../../docs_src/custom_docs_ui/tutorial001.py!} ``` ### Es ausprobieren Jetzt sollten Sie in der Lage sein, zu Ihrer Dokumentation auf http://127.0.0.1:8000/docs zu gehen und die Seite neu zuladen, die Assets werden nun vom neuen CDN geladen. ## JavaScript und CSS für die Dokumentation selbst hosten Das Selbst Hosten von JavaScript und CSS kann nützlich sein, wenn Sie beispielsweise möchten, dass Ihre Anwendung auch offline, ohne bestehenden Internetzugang oder in einem lokalen Netzwerk weiter funktioniert. Hier erfahren Sie, wie Sie diese Dateien selbst in derselben FastAPI-App bereitstellen und die Dokumentation für deren Verwendung konfigurieren. ### Projektdateistruktur Nehmen wir an, die Dateistruktur Ihres Projekts sieht folgendermaßen aus: ``` . ├── app │ ├── __init__.py │ ├── main.py ``` Erstellen Sie jetzt ein Verzeichnis zum Speichern dieser statischen Dateien. Ihre neue Dateistruktur könnte so aussehen: ``` . ├── app │   ├── __init__.py │   ├── main.py └── static/ ``` ### Die Dateien herunterladen Laden Sie die für die Dokumentation benötigten statischen Dateien herunter und legen Sie diese im Verzeichnis `static/` ab. Sie können wahrscheinlich mit der rechten Maustaste auf jeden Link klicken und eine Option wie etwa `Link speichern unter...` auswählen. **Swagger UI** verwendet folgende Dateien: * `swagger-ui-bundle.js` * `swagger-ui.css` Und **ReDoc** verwendet diese Datei: * `redoc.standalone.js` Danach könnte Ihre Dateistruktur wie folgt aussehen: ``` . ├── app │   ├── __init__.py │   ├── main.py └── static ├── redoc.standalone.js ├── swagger-ui-bundle.js └── swagger-ui.css ``` ### Die statischen Dateien bereitstellen * Importieren Sie `StaticFiles`. * „Mounten“ Sie eine `StaticFiles()`-Instanz in einem bestimmten Pfad. ```Python hl_lines="7 11" {!../../../docs_src/custom_docs_ui/tutorial002.py!} ``` ### Die statischen Dateien testen Starten Sie Ihre Anwendung und gehen Sie auf http://127.0.0.1:8000/static/redoc.standalone.js. Sie sollten eine sehr lange JavaScript-Datei für **ReDoc** sehen. Sie könnte beginnen mit etwas wie: ```JavaScript /*! * ReDoc - OpenAPI/Swagger-generated API Reference Documentation * ------------------------------------------------------------- * Version: "2.0.0-rc.18" * Repo: https://github.com/Redocly/redoc */ !function(e,t){"object"==typeof exports&&"object"==typeof m ... ``` Das zeigt, dass Sie statische Dateien aus Ihrer Anwendung bereitstellen können und dass Sie die statischen Dateien für die Dokumentation an der richtigen Stelle platziert haben. Jetzt können wir die Anwendung so konfigurieren, dass sie diese statischen Dateien für die Dokumentation verwendet. ### Die automatischen Dokumentationen deaktivieren, für statische Dateien Wie bei der Verwendung eines benutzerdefinierten CDN besteht der erste Schritt darin, die automatischen Dokumentationen zu deaktivieren, da diese standardmäßig das CDN verwenden. Um diese zu deaktivieren, setzen Sie deren URLs beim Erstellen Ihrer `FastAPI`-App auf `None`: ```Python hl_lines="9" {!../../../docs_src/custom_docs_ui/tutorial002.py!} ``` ### Die benutzerdefinierten Dokumentationen, mit statischen Dateien, hinzufügen Und genau wie bei einem benutzerdefinierten CDN können Sie jetzt die *Pfadoperationen* für die benutzerdefinierten Dokumentationen erstellen. Auch hier können Sie die internen Funktionen von FastAPI wiederverwenden, um die HTML-Seiten für die Dokumentationen zu erstellen, und diesen die erforderlichen Argumente übergeben: * `openapi_url`: die URL, unter der die HTML-Seite für die Dokumentation das OpenAPI-Schema für Ihre API abrufen kann. Sie können hier das Attribut `app.openapi_url` verwenden. * `title`: der Titel Ihrer API. * `oauth2_redirect_url`: Sie können hier `app.swagger_ui_oauth2_redirect_url` verwenden, um die Standardeinstellung zu verwenden. * `swagger_js_url`: die URL, unter welcher der HTML-Code für Ihre Swagger-UI-Dokumentation die **JavaScript**-Datei abrufen kann. **Das ist die, welche jetzt von Ihrer eigenen Anwendung bereitgestellt wird**. * `swagger_css_url`: die URL, unter welcher der HTML-Code für Ihre Swagger-UI-Dokumentation die **CSS**-Datei abrufen kann. **Das ist die, welche jetzt von Ihrer eigenen Anwendung bereitgestellt wird**. Und genau so für ReDoc ... ```Python hl_lines="2-6 14-22 25-27 30-36" {!../../../docs_src/custom_docs_ui/tutorial002.py!} ``` !!! tip "Tipp" Die *Pfadoperation* für `swagger_ui_redirect` ist ein Hilfsmittel bei der Verwendung von OAuth2. Wenn Sie Ihre API mit einem OAuth2-Anbieter integrieren, können Sie sich authentifizieren und mit den erworbenen Anmeldeinformationen zur API-Dokumentation zurückkehren. Und mit ihr interagieren, die echte OAuth2-Authentifizierung verwendend. Swagger UI erledigt das hinter den Kulissen für Sie, benötigt aber diesen „Umleitungs“-Helfer. ### Eine *Pfadoperation* erstellen, um statische Dateien zu testen Um nun testen zu können, ob alles funktioniert, erstellen Sie eine *Pfadoperation*: ```Python hl_lines="39-41" {!../../../docs_src/custom_docs_ui/tutorial002.py!} ``` ### Benutzeroberfläche, mit statischen Dateien, testen Jetzt sollten Sie in der Lage sein, Ihr WLAN zu trennen, gehen Sie zu Ihrer Dokumentation unter http://127.0.0.1:8000/docs und laden Sie die Seite neu. Und selbst ohne Internet könnten Sie die Dokumentation für Ihre API sehen und damit interagieren. fastapi-0.110.3/docs/de/docs/how-to/custom-request-and-route.md000066400000000000000000000123301461403617600242150ustar00rootroot00000000000000# Benutzerdefinierte Request- und APIRoute-Klasse In einigen Fällen möchten Sie möglicherweise die von den Klassen `Request` und `APIRoute` verwendete Logik überschreiben. Das kann insbesondere eine gute Alternative zur Logik in einer Middleware sein. Wenn Sie beispielsweise den Requestbody lesen oder manipulieren möchten, bevor er von Ihrer Anwendung verarbeitet wird. !!! danger "Gefahr" Dies ist eine „fortgeschrittene“ Funktion. Wenn Sie gerade erst mit **FastAPI** beginnen, möchten Sie diesen Abschnitt vielleicht überspringen. ## Anwendungsfälle Einige Anwendungsfälle sind: * Konvertieren von Nicht-JSON-Requestbodys nach JSON (z. B. `msgpack`). * Dekomprimierung gzip-komprimierter Requestbodys. * Automatisches Loggen aller Requestbodys. ## Handhaben von benutzerdefinierten Requestbody-Kodierungen Sehen wir uns an, wie Sie eine benutzerdefinierte `Request`-Unterklasse verwenden, um gzip-Requests zu dekomprimieren. Und eine `APIRoute`-Unterklasse zur Verwendung dieser benutzerdefinierten Requestklasse. ### Eine benutzerdefinierte `GzipRequest`-Klasse erstellen !!! tip "Tipp" Dies ist nur ein einfaches Beispiel, um zu demonstrieren, wie es funktioniert. Wenn Sie Gzip-Unterstützung benötigen, können Sie die bereitgestellte [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank} verwenden. Zuerst erstellen wir eine `GzipRequest`-Klasse, welche die Methode `Request.body()` überschreibt, um den Body bei Vorhandensein eines entsprechenden Headers zu dekomprimieren. Wenn der Header kein `gzip` enthält, wird nicht versucht, den Body zu dekomprimieren. Auf diese Weise kann dieselbe Routenklasse gzip-komprimierte oder unkomprimierte Requests verarbeiten. ```Python hl_lines="8-15" {!../../../docs_src/custom_request_and_route/tutorial001.py!} ``` ### Eine benutzerdefinierte `GzipRoute`-Klasse erstellen Als Nächstes erstellen wir eine benutzerdefinierte Unterklasse von `fastapi.routing.APIRoute`, welche `GzipRequest` nutzt. Dieses Mal wird die Methode `APIRoute.get_route_handler()` überschrieben. Diese Methode gibt eine Funktion zurück. Und diese Funktion empfängt einen Request und gibt eine Response zurück. Hier verwenden wir sie, um aus dem ursprünglichen Request einen `GzipRequest` zu erstellen. ```Python hl_lines="18-26" {!../../../docs_src/custom_request_and_route/tutorial001.py!} ``` !!! note "Technische Details" Ein `Request` hat ein `request.scope`-Attribut, welches einfach ein Python-`dict` ist, welches die mit dem Request verbundenen Metadaten enthält. Ein `Request` hat auch ein `request.receive`, welches eine Funktion ist, die den Hauptteil des Requests empfängt. Das `scope`-`dict` und die `receive`-Funktion sind beide Teil der ASGI-Spezifikation. Und diese beiden Dinge, `scope` und `receive`, werden benötigt, um eine neue `Request`-Instanz zu erstellen. Um mehr über den `Request` zu erfahren, schauen Sie sich Starlettes Dokumentation zu Requests an. Das Einzige, was die von `GzipRequest.get_route_handler` zurückgegebene Funktion anders macht, ist die Konvertierung von `Request` in ein `GzipRequest`. Dabei kümmert sich unser `GzipRequest` um die Dekomprimierung der Daten (falls erforderlich), bevor diese an unsere *Pfadoperationen* weitergegeben werden. Danach ist die gesamte Verarbeitungslogik dieselbe. Aufgrund unserer Änderungen in `GzipRequest.body` wird der Requestbody jedoch bei Bedarf automatisch dekomprimiert, wenn er von **FastAPI** geladen wird. ## Zugriff auf den Requestbody in einem Exceptionhandler !!! tip "Tipp" Um dasselbe Problem zu lösen, ist es wahrscheinlich viel einfacher, den `body` in einem benutzerdefinierten Handler für `RequestValidationError` zu verwenden ([Fehlerbehandlung](../tutorial/handling-errors.md#den-requestvalidationerror-body-verwenden){.internal-link target=_blank}). Dieses Beispiel ist jedoch immer noch gültig und zeigt, wie mit den internen Komponenten interagiert wird. Wir können denselben Ansatz auch verwenden, um in einem Exceptionhandler auf den Requestbody zuzugreifen. Alles, was wir tun müssen, ist, den Request innerhalb eines `try`/`except`-Blocks zu handhaben: ```Python hl_lines="13 15" {!../../../docs_src/custom_request_and_route/tutorial002.py!} ``` Wenn eine Exception auftritt, befindet sich die `Request`-Instanz weiterhin im Gültigkeitsbereich, sodass wir den Requestbody lesen und bei der Fehlerbehandlung verwenden können: ```Python hl_lines="16-18" {!../../../docs_src/custom_request_and_route/tutorial002.py!} ``` ## Benutzerdefinierte `APIRoute`-Klasse in einem Router Sie können auch den Parameter `route_class` eines `APIRouter` festlegen: ```Python hl_lines="26" {!../../../docs_src/custom_request_and_route/tutorial003.py!} ``` In diesem Beispiel verwenden die *Pfadoperationen* unter dem `router` die benutzerdefinierte `TimedRoute`-Klasse und haben in der Response einen zusätzlichen `X-Response-Time`-Header mit der Zeit, die zum Generieren der Response benötigt wurde: ```Python hl_lines="13-20" {!../../../docs_src/custom_request_and_route/tutorial003.py!} ``` fastapi-0.110.3/docs/de/docs/how-to/extending-openapi.md000066400000000000000000000073151461403617600227460ustar00rootroot00000000000000# OpenAPI erweitern In einigen Fällen müssen Sie möglicherweise das generierte OpenAPI-Schema ändern. In diesem Abschnitt erfahren Sie, wie. ## Der normale Vorgang Der normale (Standard-)Prozess ist wie folgt. Eine `FastAPI`-Anwendung (-Instanz) verfügt über eine `.openapi()`-Methode, von der erwartet wird, dass sie das OpenAPI-Schema zurückgibt. Als Teil der Erstellung des Anwendungsobjekts wird eine *Pfadoperation* für `/openapi.json` (oder welcher Wert für den Parameter `openapi_url` gesetzt wurde) registriert. Diese gibt lediglich eine JSON-Response zurück, mit dem Ergebnis der Methode `.openapi()` der Anwendung. Standardmäßig überprüft die Methode `.openapi()` die Eigenschaft `.openapi_schema`, um zu sehen, ob diese Inhalt hat, und gibt diesen zurück. Ist das nicht der Fall, wird der Inhalt mithilfe der Hilfsfunktion unter `fastapi.openapi.utils.get_openapi` generiert. Und diese Funktion `get_openapi()` erhält als Parameter: * `title`: Der OpenAPI-Titel, der in der Dokumentation angezeigt wird. * `version`: Die Version Ihrer API, z. B. `2.5.0`. * `openapi_version`: Die Version der verwendeten OpenAPI-Spezifikation. Standardmäßig die neueste Version: `3.1.0`. * `summary`: Eine kurze Zusammenfassung der API. * `description`: Die Beschreibung Ihrer API. Dies kann Markdown enthalten und wird in der Dokumentation angezeigt. * `routes`: Eine Liste von Routen, dies sind alle registrierten *Pfadoperationen*. Sie stammen von `app.routes`. !!! info Der Parameter `summary` ist in OpenAPI 3.1.0 und höher verfügbar und wird von FastAPI 0.99.0 und höher unterstützt. ## Überschreiben der Standardeinstellungen Mithilfe der oben genannten Informationen können Sie dieselbe Hilfsfunktion verwenden, um das OpenAPI-Schema zu generieren und jeden benötigten Teil zu überschreiben. Fügen wir beispielsweise ReDocs OpenAPI-Erweiterung zum Einbinden eines benutzerdefinierten Logos hinzu. ### Normales **FastAPI** Schreiben Sie zunächst wie gewohnt Ihre ganze **FastAPI**-Anwendung: ```Python hl_lines="1 4 7-9" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### Das OpenAPI-Schema generieren Verwenden Sie dann dieselbe Hilfsfunktion, um das OpenAPI-Schema innerhalb einer `custom_openapi()`-Funktion zu generieren: ```Python hl_lines="2 15-21" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### Das OpenAPI-Schema ändern Jetzt können Sie die ReDoc-Erweiterung hinzufügen und dem `info`-„Objekt“ im OpenAPI-Schema ein benutzerdefiniertes `x-logo` hinzufügen: ```Python hl_lines="22-24" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### Zwischenspeichern des OpenAPI-Schemas Sie können die Eigenschaft `.openapi_schema` als „Cache“ verwenden, um Ihr generiertes Schema zu speichern. Auf diese Weise muss Ihre Anwendung das Schema nicht jedes Mal generieren, wenn ein Benutzer Ihre API-Dokumentation öffnet. Es wird nur einmal generiert und dann wird dasselbe zwischengespeicherte Schema für die nächsten Requests verwendet. ```Python hl_lines="13-14 25-26" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### Die Methode überschreiben Jetzt können Sie die Methode `.openapi()` durch Ihre neue Funktion ersetzen. ```Python hl_lines="29" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### Testen Sobald Sie auf http://127.0.0.1:8000/redoc gehen, werden Sie sehen, dass Ihr benutzerdefiniertes Logo verwendet wird (in diesem Beispiel das Logo von **FastAPI**): fastapi-0.110.3/docs/de/docs/how-to/general.md000066400000000000000000000057051461403617600207460ustar00rootroot00000000000000# Allgemeines – How-To – Rezepte Hier finden Sie mehrere Verweise auf andere Stellen in der Dokumentation, für allgemeine oder häufige Fragen. ## Daten filtern – Sicherheit Um sicherzustellen, dass Sie nicht mehr Daten zurückgeben, als Sie sollten, lesen Sie die Dokumentation unter [Tutorial – Responsemodell – Rückgabetyp](../tutorial/response-model.md){.internal-link target=_blank}. ## Dokumentations-Tags – OpenAPI Um Tags zu Ihren *Pfadoperationen* hinzuzufügen und diese in der Oberfläche der Dokumentation zu gruppieren, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Tags](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}. ## Zusammenfassung und Beschreibung in der Dokumentation – OpenAPI Um Ihren *Pfadoperationen* eine Zusammenfassung und Beschreibung hinzuzufügen und diese in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Zusammenfassung und Beschreibung](../tutorial/path-operation-configuration.md#zusammenfassung-und-beschreibung){.internal-link target=_blank}. ## Beschreibung der Response in der Dokumentation – OpenAPI Um die Beschreibung der Response zu definieren, welche in der Oberfläche der Dokumentation angezeigt wird, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Beschreibung der Response](../tutorial/path-operation-configuration.md#beschreibung-der-response){.internal-link target=_blank}. ## *Pfadoperation* in der Dokumentation deprecaten – OpenAPI Um eine *Pfadoperation* zu deprecaten – sie als veraltet zu markieren – und das in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Deprecaten](../tutorial/path-operation-configuration.md#eine-pfadoperation-deprecaten){.internal-link target=_blank}. ## Daten in etwas JSON-kompatibles konvertieren Um Daten in etwas JSON-kompatibles zu konvertieren, lesen Sie die Dokumentation unter [Tutorial – JSON-kompatibler Encoder](../tutorial/encoder.md){.internal-link target=_blank}. ## OpenAPI-Metadaten – Dokumentation Um Metadaten zu Ihrem OpenAPI-Schema hinzuzufügen, einschließlich einer Lizenz, Version, Kontakt, usw., lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentationen](../tutorial/metadata.md){.internal-link target=_blank}. ## Benutzerdefinierte OpenAPI-URL Um die OpenAPI-URL anzupassen (oder zu entfernen), lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentationen](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}. ## URLs der OpenAPI-Dokumentationen Um die URLs zu aktualisieren, die für die automatisch generierten Dokumentations-Oberflächen verwendet werden, lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentationen](../tutorial/metadata.md#urls-der-dokumentationen){.internal-link target=_blank}. fastapi-0.110.3/docs/de/docs/how-to/graphql.md000066400000000000000000000072571461403617600207730ustar00rootroot00000000000000# GraphQL Da **FastAPI** auf dem **ASGI**-Standard basiert, ist es sehr einfach, jede **GraphQL**-Bibliothek zu integrieren, die auch mit ASGI kompatibel ist. Sie können normale FastAPI-*Pfadoperationen* mit GraphQL in derselben Anwendung kombinieren. !!! tip "Tipp" **GraphQL** löst einige sehr spezifische Anwendungsfälle. Es hat **Vorteile** und **Nachteile** im Vergleich zu gängigen **Web-APIs**. Wiegen Sie ab, ob die **Vorteile** für Ihren Anwendungsfall die **Nachteile** ausgleichen. 🤓 ## GraphQL-Bibliotheken Hier sind einige der **GraphQL**-Bibliotheken, welche **ASGI** unterstützen. Diese könnten Sie mit **FastAPI** verwenden: * Strawberry 🍓 * Mit Dokumentation für FastAPI * Ariadne * Mit Dokumentation für Starlette (welche auch für FastAPI gilt) * Tartiflette * Mit Tartiflette ASGI, für ASGI-Integration * Graphene * Mit starlette-graphene3 ## GraphQL mit Strawberry Wenn Sie mit **GraphQL** arbeiten möchten oder müssen, ist **Strawberry** die **empfohlene** Bibliothek, da deren Design dem Design von **FastAPI** am nächsten kommt und alles auf **Typannotationen** basiert. Abhängig von Ihrem Anwendungsfall bevorzugen Sie vielleicht eine andere Bibliothek, aber wenn Sie mich fragen würden, würde ich Ihnen wahrscheinlich empfehlen, **Strawberry** auszuprobieren. Hier ist eine kleine Vorschau, wie Sie Strawberry mit FastAPI integrieren können: ```Python hl_lines="3 22 25-26" {!../../../docs_src/graphql/tutorial001.py!} ``` Weitere Informationen zu Strawberry finden Sie in der Strawberry-Dokumentation. Und auch die Dokumentation zu Strawberry mit FastAPI. ## Ältere `GraphQLApp` von Starlette Frühere Versionen von Starlette enthielten eine `GraphQLApp`-Klasse zur Integration mit Graphene. Das wurde von Starlette deprecated, aber wenn Sie Code haben, der das verwendet, können Sie einfach zu starlette-graphene3 **migrieren**, welches denselben Anwendungsfall abdeckt und über eine **fast identische Schnittstelle** verfügt. !!! tip "Tipp" Wenn Sie GraphQL benötigen, würde ich Ihnen trotzdem empfehlen, sich Strawberry anzuschauen, da es auf Typannotationen basiert, statt auf benutzerdefinierten Klassen und Typen. ## Mehr darüber lernen Weitere Informationen zu **GraphQL** finden Sie in der offiziellen GraphQL-Dokumentation. Sie können auch mehr über jede der oben beschriebenen Bibliotheken in den jeweiligen Links lesen. fastapi-0.110.3/docs/de/docs/how-to/index.md000066400000000000000000000011701461403617600204300ustar00rootroot00000000000000# How-To – Rezepte Hier finden Sie verschiedene Rezepte und „How-To“-Anleitungen zu **verschiedenen Themen**. Die meisten dieser Ideen sind mehr oder weniger **unabhängig**, und in den meisten Fällen müssen Sie diese nur studieren, wenn sie direkt auf **Ihr Projekt** anwendbar sind. Wenn etwas für Ihr Projekt interessant und nützlich erscheint, lesen Sie es, andernfalls überspringen Sie es einfach. !!! tip "Tipp" Wenn Sie strukturiert **FastAPI lernen** möchten (empfohlen), lesen Sie stattdessen Kapitel für Kapitel das [Tutorial – Benutzerhandbuch](../tutorial/index.md){.internal-link target=_blank}. fastapi-0.110.3/docs/de/docs/how-to/separate-openapi-schemas.md000066400000000000000000000164241461403617600242070ustar00rootroot00000000000000# Separate OpenAPI-Schemas für Eingabe und Ausgabe oder nicht Bei Verwendung von **Pydantic v2** ist die generierte OpenAPI etwas genauer und **korrekter** als zuvor. 😎 Tatsächlich gibt es in einigen Fällen sogar **zwei JSON-Schemas** in OpenAPI für dasselbe Pydantic-Modell für Eingabe und Ausgabe, je nachdem, ob sie **Defaultwerte** haben. Sehen wir uns an, wie das funktioniert und wie Sie es bei Bedarf ändern können. ## Pydantic-Modelle für Eingabe und Ausgabe Nehmen wir an, Sie haben ein Pydantic-Modell mit Defaultwerten wie dieses: === "Python 3.10+" ```Python hl_lines="7" {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py[ln:1-7]!} # Code unterhalb weggelassen 👇 ```
👀 Vollständige Dateivorschau ```Python {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!} ```
=== "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py[ln:1-9]!} # Code unterhalb weggelassen 👇 ```
👀 Vollständige Dateivorschau ```Python {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py!} ```
=== "Python 3.8+" ```Python hl_lines="9" {!> ../../../docs_src/separate_openapi_schemas/tutorial001.py[ln:1-9]!} # Code unterhalb weggelassen 👇 ```
👀 Vollständige Dateivorschau ```Python {!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!} ```
### Modell für Eingabe Wenn Sie dieses Modell wie hier als Eingabe verwenden: === "Python 3.10+" ```Python hl_lines="14" {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py[ln:1-15]!} # Code unterhalb weggelassen 👇 ```
👀 Vollständige Dateivorschau ```Python {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!} ```
=== "Python 3.9+" ```Python hl_lines="16" {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py[ln:1-17]!} # Code unterhalb weggelassen 👇 ```
👀 Vollständige Dateivorschau ```Python {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py!} ```
=== "Python 3.8+" ```Python hl_lines="16" {!> ../../../docs_src/separate_openapi_schemas/tutorial001.py[ln:1-17]!} # Code unterhalb weggelassen 👇 ```
👀 Vollständige Dateivorschau ```Python {!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!} ```
... dann ist das Feld `description` **nicht erforderlich**. Weil es den Defaultwert `None` hat. ### Eingabemodell in der Dokumentation Sie können überprüfen, dass das Feld `description` in der Dokumentation kein **rotes Sternchen** enthält, es ist nicht als erforderlich markiert:
### Modell für die Ausgabe Wenn Sie jedoch dasselbe Modell als Ausgabe verwenden, wie hier: === "Python 3.10+" ```Python hl_lines="19" {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="21" {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="21" {!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!} ``` ... dann, weil `description` einen Defaultwert hat, wird es, wenn Sie für dieses Feld **nichts zurückgeben**, immer noch diesen **Defaultwert** haben. ### Modell für Ausgabe-Responsedaten Wenn Sie mit der Dokumentation interagieren und die Response überprüfen, enthält die JSON-Response den Defaultwert (`null`), obwohl der Code nichts in eines der `description`-Felder geschrieben hat:
Das bedeutet, dass es **immer einen Wert** hat, der Wert kann jedoch manchmal `None` sein (oder `null` in JSON). Das bedeutet, dass Clients, die Ihre API verwenden, nicht prüfen müssen, ob der Wert vorhanden ist oder nicht. Sie können davon ausgehen, dass das Feld immer vorhanden ist. In einigen Fällen hat es jedoch nur den Defaultwert `None`. Um dies in OpenAPI zu kennzeichnen, markieren Sie dieses Feld als **erforderlich**, da es immer vorhanden sein wird. Aus diesem Grund kann das JSON-Schema für ein Modell unterschiedlich sein, je nachdem, ob es für **Eingabe oder Ausgabe** verwendet wird: * für die **Eingabe** ist `description` **nicht erforderlich** * für die **Ausgabe** ist es **erforderlich** (und möglicherweise `None` oder, in JSON-Begriffen, `null`) ### Ausgabemodell in der Dokumentation Sie können das Ausgabemodell auch in der Dokumentation überprüfen. **Sowohl** `name` **als auch** `description` sind mit einem **roten Sternchen** als **erforderlich** markiert:
### Eingabe- und Ausgabemodell in der Dokumentation Und wenn Sie alle verfügbaren Schemas (JSON-Schemas) in OpenAPI überprüfen, werden Sie feststellen, dass es zwei gibt, ein `Item-Input` und ein `Item-Output`. Für `Item-Input` ist `description` **nicht erforderlich**, es hat kein rotes Sternchen. Aber für `Item-Output` ist `description` **erforderlich**, es hat ein rotes Sternchen.
Mit dieser Funktion von **Pydantic v2** ist Ihre API-Dokumentation **präziser**, und wenn Sie über automatisch generierte Clients und SDKs verfügen, sind diese auch präziser, mit einer besseren **Entwicklererfahrung** und Konsistenz. 🎉 ## Schemas nicht trennen Nun gibt es einige Fälle, in denen Sie möglicherweise **dasselbe Schema für Eingabe und Ausgabe** haben möchten. Der Hauptanwendungsfall hierfür besteht wahrscheinlich darin, dass Sie das mal tun möchten, wenn Sie bereits über einige automatisch generierte Client-Codes/SDKs verfügen und im Moment nicht alle automatisch generierten Client-Codes/SDKs aktualisieren möchten, möglicherweise später, aber nicht jetzt. In diesem Fall können Sie diese Funktion in **FastAPI** mit dem Parameter `separate_input_output_schemas=False` deaktivieren. !!! info Unterstützung für `separate_input_output_schemas` wurde in FastAPI `0.102.0` hinzugefügt. 🤓 === "Python 3.10+" ```Python hl_lines="10" {!> ../../../docs_src/separate_openapi_schemas/tutorial002_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="12" {!> ../../../docs_src/separate_openapi_schemas/tutorial002_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="12" {!> ../../../docs_src/separate_openapi_schemas/tutorial002.py!} ``` ### Gleiches Schema für Eingabe- und Ausgabemodelle in der Dokumentation Und jetzt wird es ein einziges Schema für die Eingabe und Ausgabe des Modells geben, nur `Item`, und es wird `description` als **nicht erforderlich** kennzeichnen:
Dies ist das gleiche Verhalten wie in Pydantic v1. 🤓 fastapi-0.110.3/docs/de/docs/index.md000066400000000000000000000522141461403617600172200ustar00rootroot00000000000000--- hide: - navigation ---

FastAPI

FastAPI Framework, hochperformant, leicht zu erlernen, schnell zu programmieren, einsatzbereit

Test Coverage Package-Version Unterstützte Python-Versionen

--- **Dokumentation**: https://fastapi.tiangolo.com **Quellcode**: https://github.com/tiangolo/fastapi --- FastAPI ist ein modernes, schnelles (hoch performantes) Webframework zur Erstellung von APIs mit Python auf Basis von Standard-Python-Typhinweisen. Seine Schlüssel-Merkmale sind: * **Schnell**: Sehr hohe Leistung, auf Augenhöhe mit **NodeJS** und **Go** (Dank Starlette und Pydantic). [Eines der schnellsten verfügbaren Python-Frameworks](#performanz). * **Schnell zu programmieren**: Erhöhen Sie die Geschwindigkeit bei der Entwicklung von Funktionen um etwa 200 % bis 300 %. * * **Weniger Bugs**: Verringern Sie die von Menschen (Entwicklern) verursachten Fehler um etwa 40 %. * * **Intuitiv**: Exzellente Editor-Unterstützung. Code-Vervollständigung überall. Weniger Debuggen. * **Einfach**: So konzipiert, dass es einfach zu benutzen und zu erlernen ist. Weniger Zeit für das Lesen der Dokumentation. * **Kurz**: Minimieren Sie die Verdoppelung von Code. Mehrere Funktionen aus jeder Parameterdeklaration. Weniger Bugs. * **Robust**: Erhalten Sie produktionsreifen Code. Mit automatischer, interaktiver Dokumentation. * **Standards-basiert**: Basierend auf (und vollständig kompatibel mit) den offenen Standards für APIs: OpenAPI (früher bekannt als Swagger) und JSON Schema. * Schätzung auf Basis von Tests in einem internen Entwicklungsteam, das Produktionsanwendungen erstellt. ## Sponsoren {% if sponsors %} {% for sponsor in sponsors.gold -%} {% endfor -%} {%- for sponsor in sponsors.silver -%} {% endfor %} {% endif %} Andere Sponsoren ## Meinungen „_[...] Ich verwende **FastAPI** heutzutage sehr oft. [...] Ich habe tatsächlich vor, es für alle **ML-Dienste meines Teams bei Microsoft** zu verwenden. Einige davon werden in das Kernprodukt **Windows** und einige **Office**-Produkte integriert._“
Kabir Khan - Microsoft (Ref)
--- „_Wir haben die **FastAPI**-Bibliothek genommen, um einen **REST**-Server zu erstellen, der abgefragt werden kann, um **Vorhersagen** zu erhalten. [für Ludwig]_“
Piero Molino, Yaroslav Dudin, und Sai Sumanth Miryala - Uber (Ref)
--- „_**Netflix** freut sich, die Open-Source-Veröffentlichung unseres **Krisenmanagement**-Orchestrierung-Frameworks bekannt zu geben: **Dispatch**! [erstellt mit **FastAPI**]_“
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (Ref)
--- „_Ich bin überglücklich mit **FastAPI**. Es macht so viel Spaß!_“
Brian Okken - Host des Python Bytes Podcast (Ref)
--- „_Ehrlich, was Du gebaut hast, sieht super solide und poliert aus. In vielerlei Hinsicht ist es so, wie ich **Hug** haben wollte – es ist wirklich inspirierend, jemanden so etwas bauen zu sehen._“
Timothy Crosley - Autor von Hug (Ref)
--- „_Wenn Sie ein **modernes Framework** zum Erstellen von REST-APIs erlernen möchten, schauen Sie sich **FastAPI** an. [...] Es ist schnell, einfach zu verwenden und leicht zu erlernen [...]_“ „_Wir haben zu **FastAPI** für unsere **APIs** gewechselt [...] Ich denke, es wird Ihnen gefallen [...]_“
Ines Montani - Matthew Honnibal - Gründer von Explosion AI - Autoren von spaCy (Ref) - (Ref)
--- „_Falls irgendjemand eine Produktions-Python-API erstellen möchte, kann ich **FastAPI** wärmstens empfehlen. Es ist **wunderschön konzipiert**, **einfach zu verwenden** und **hoch skalierbar**; es ist zu einer **Schlüsselkomponente** in unserer API-First-Entwicklungsstrategie geworden und treibt viele Automatisierungen und Dienste an, wie etwa unseren virtuellen TAC-Ingenieur._“
Deon Pillsbury - Cisco (Ref)
--- ## **Typer**, das FastAPI der CLIs Wenn Sie eine CLI-Anwendung für das Terminal erstellen, anstelle einer Web-API, schauen Sie sich **Typer** an. **Typer** ist die kleine Schwester von FastAPI. Und es soll das **FastAPI der CLIs** sein. ⌨️ 🚀 ## Anforderungen FastAPI steht auf den Schultern von Giganten: * Starlette für die Webanteile. * Pydantic für die Datenanteile. ## Installation
```console $ pip install fastapi ---> 100% ```
Sie benötigen außerdem einen ASGI-Server. Für die Produktumgebung beispielsweise Uvicorn oder Hypercorn.
```console $ pip install "uvicorn[standard]" ---> 100% ```
## Beispiel ### Erstellung * Erstellen Sie eine Datei `main.py` mit: ```Python from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ```
Oder verwenden Sie async def ... Wenn Ihr Code `async` / `await` verwendet, benutzen Sie `async def`: ```Python hl_lines="9 14" from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") async def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") async def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ``` **Anmerkung**: Wenn Sie das nicht kennen, schauen Sie sich den Abschnitt _„In Eile?“_ über `async` und `await` in der Dokumentation an.
### Starten Führen Sie den Server aus:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [28720] INFO: Started server process [28722] INFO: Waiting for application startup. INFO: Application startup complete. ```
Was macht der Befehl uvicorn main:app --reload ... Der Befehl `uvicorn main:app` bezieht sich auf: * `main`: die Datei `main.py` (das Python-„Modul“). * `app`: das Objekt, das innerhalb von `main.py` mit der Zeile `app = FastAPI()` erzeugt wurde. * `--reload`: lässt den Server nach Codeänderungen neu starten. Tun Sie das nur während der Entwicklung.
### Testen Öffnen Sie Ihren Browser unter http://127.0.0.1:8000/items/5?q=somequery. Sie erhalten die JSON-Response: ```JSON {"item_id": 5, "q": "somequery"} ``` Damit haben Sie bereits eine API erstellt, welche: * HTTP-Anfragen auf den _Pfaden_ `/` und `/items/{item_id}` entgegennimmt. * Beide _Pfade_ erhalten `GET` Operationen (auch bekannt als HTTP _Methoden_). * Der _Pfad_ `/items/{item_id}` hat einen _Pfadparameter_ `item_id`, der ein `int` sein sollte. * Der _Pfad_ `/items/{item_id}` hat einen optionalen `str` _Query Parameter_ `q`. ### Interaktive API-Dokumentation Gehen Sie nun auf http://127.0.0.1:8000/docs. Sie sehen die automatische interaktive API-Dokumentation (bereitgestellt von Swagger UI): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Alternative API-Dokumentation Gehen Sie jetzt auf http://127.0.0.1:8000/redoc. Sie sehen die alternative automatische Dokumentation (bereitgestellt von ReDoc): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ## Beispiel Aktualisierung Ändern Sie jetzt die Datei `main.py`, um den Body einer `PUT`-Anfrage zu empfangen. Deklarieren Sie den Body mithilfe von Standard-Python-Typen, dank Pydantic. ```Python hl_lines="4 9-12 25-27" from typing import Union from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str price: float is_offer: Union[bool, None] = None @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} @app.put("/items/{item_id}") def update_item(item_id: int, item: Item): return {"item_name": item.name, "item_id": item_id} ``` Der Server sollte automatisch neu geladen werden (weil Sie oben `--reload` zum Befehl `uvicorn` hinzugefügt haben). ### Aktualisierung der interaktiven API-Dokumentation Gehen Sie jetzt auf http://127.0.0.1:8000/docs. * Die interaktive API-Dokumentation wird automatisch aktualisiert, einschließlich des neuen Bodys: ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) * Klicken Sie auf die Taste „Try it out“, damit können Sie die Parameter ausfüllen und direkt mit der API interagieren: ![Swagger UI Interaktion](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) * Klicken Sie dann auf die Taste „Execute“, die Benutzeroberfläche wird mit Ihrer API kommunizieren, sendet die Parameter, holt die Ergebnisse und zeigt sie auf dem Bildschirm an: ![Swagger UI Interaktion](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) ### Aktualisierung der alternativen API-Dokumentation Und nun gehen Sie auf http://127.0.0.1:8000/redoc. * Die alternative Dokumentation wird ebenfalls den neuen Abfrageparameter und -inhalt widerspiegeln: ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ### Zusammenfassung Zusammengefasst deklarieren Sie **einmal** die Typen von Parametern, Body, etc. als Funktionsparameter. Das machen Sie mit modernen Standard-Python-Typen. Sie müssen keine neue Syntax, Methoden oder Klassen einer bestimmten Bibliothek usw. lernen. Nur Standard-**Python+**. Zum Beispiel für ein `int`: ```Python item_id: int ``` oder für ein komplexeres `Item`-Modell: ```Python item: Item ``` ... und mit dieser einen Deklaration erhalten Sie: * Editor-Unterstützung, einschließlich: * Code-Vervollständigung. * Typprüfungen. * Validierung von Daten: * Automatische und eindeutige Fehler, wenn die Daten ungültig sind. * Validierung auch für tief verschachtelte JSON-Objekte. * Konvertierung von Eingabedaten: Aus dem Netzwerk kommend, zu Python-Daten und -Typen. Lesen von: * JSON. * Pfad-Parametern. * Abfrage-Parametern. * Cookies. * Header-Feldern. * Formularen. * Dateien. * Konvertierung von Ausgabedaten: Konvertierung von Python-Daten und -Typen zu Netzwerkdaten (als JSON): * Konvertieren von Python-Typen (`str`, `int`, `float`, `bool`, `list`, usw.). * `Datetime`-Objekte. * `UUID`-Objekte. * Datenbankmodelle. * ... und viele mehr. * Automatische interaktive API-Dokumentation, einschließlich 2 alternativer Benutzeroberflächen: * Swagger UI. * ReDoc. --- Um auf das vorherige Codebeispiel zurückzukommen, **FastAPI** wird: * Überprüfen, dass es eine `item_id` im Pfad für `GET`- und `PUT`-Anfragen gibt. * Überprüfen, ob die `item_id` vom Typ `int` für `GET`- und `PUT`-Anfragen ist. * Falls nicht, wird dem Client ein nützlicher, eindeutiger Fehler angezeigt. * Prüfen, ob es einen optionalen Abfrageparameter namens `q` (wie in `http://127.0.0.1:8000/items/foo?q=somequery`) für `GET`-Anfragen gibt. * Da der `q`-Parameter mit `= None` deklariert ist, ist er optional. * Ohne das `None` wäre er erforderlich (wie der Body im Fall von `PUT`). * Bei `PUT`-Anfragen an `/items/{item_id}` den Body als JSON lesen: * Prüfen, ob er ein erforderliches Attribut `name` hat, das ein `str` sein muss. * Prüfen, ob er ein erforderliches Attribut `price` hat, das ein `float` sein muss. * Prüfen, ob er ein optionales Attribut `is_offer` hat, das ein `bool` sein muss, falls vorhanden. * All dies würde auch für tief verschachtelte JSON-Objekte funktionieren. * Automatisch von und nach JSON konvertieren. * Alles mit OpenAPI dokumentieren, welches verwendet werden kann von: * Interaktiven Dokumentationssystemen. * Automatisch Client-Code generierenden Systemen für viele Sprachen. * Zwei interaktive Dokumentation-Webschnittstellen direkt zur Verfügung stellen. --- Wir haben nur an der Oberfläche gekratzt, aber Sie bekommen schon eine Vorstellung davon, wie das Ganze funktioniert. Versuchen Sie, diese Zeile zu ändern: ```Python return {"item_name": item.name, "item_id": item_id} ``` ... von: ```Python ... "item_name": item.name ... ``` ... zu: ```Python ... "item_price": item.price ... ``` ... und sehen Sie, wie Ihr Editor die Attribute automatisch ausfüllt und ihre Typen kennt: ![Editor Unterstützung](https://fastapi.tiangolo.com/img/vscode-completion.png) Für ein vollständigeres Beispiel, mit weiteren Funktionen, siehe das Tutorial - Benutzerhandbuch. **Spoiler-Alarm**: Das Tutorial - Benutzerhandbuch enthält: * Deklaration von **Parametern** von anderen verschiedenen Stellen wie: **Header-Felder**, **Cookies**, **Formularfelder** und **Dateien**. * Wie man **Validierungseinschränkungen** wie `maximum_length` oder `regex` setzt. * Ein sehr leistungsfähiges und einfach zu bedienendes System für **Dependency Injection**. * Sicherheit und Authentifizierung, einschließlich Unterstützung für **OAuth2** mit **JWT-Tokens** und **HTTP-Basic**-Authentifizierung. * Fortgeschrittenere (aber ebenso einfache) Techniken zur Deklaration **tief verschachtelter JSON-Modelle** (dank Pydantic). * **GraphQL** Integration mit Strawberry und anderen Bibliotheken. * Viele zusätzliche Funktionen (dank Starlette) wie: * **WebSockets** * extrem einfache Tests auf Basis von `httpx` und `pytest` * **CORS** * **Cookie Sessions** * ... und mehr. ## Performanz Unabhängige TechEmpower-Benchmarks zeigen **FastAPI**-Anwendungen, die unter Uvicorn laufen, als eines der schnellsten verfügbaren Python-Frameworks, nur noch hinter Starlette und Uvicorn selbst (intern von FastAPI verwendet). Um mehr darüber zu erfahren, siehe den Abschnitt Benchmarks. ## Optionale Abhängigkeiten Wird von Pydantic verwendet: * email_validator - für E-Mail-Validierung. * pydantic-settings - für die Verwaltung von Einstellungen. * pydantic-extra-types - für zusätzliche Typen, mit Pydantic zu verwenden. Wird von Starlette verwendet: * httpx - erforderlich, wenn Sie den `TestClient` verwenden möchten. * jinja2 - erforderlich, wenn Sie die Standardkonfiguration für Templates verwenden möchten. * python-multipart - erforderlich, wenn Sie Formulare mittels `request.form()` „parsen“ möchten. * itsdangerous - erforderlich für `SessionMiddleware` Unterstützung. * pyyaml - erforderlich für Starlette's `SchemaGenerator` Unterstützung (Sie brauchen das wahrscheinlich nicht mit FastAPI). * ujson - erforderlich, wenn Sie `UJSONResponse` verwenden möchten. Wird von FastAPI / Starlette verwendet: * uvicorn - für den Server, der Ihre Anwendung lädt und serviert. * orjson - erforderlich, wenn Sie `ORJSONResponse` verwenden möchten. Sie können diese alle mit `pip install "fastapi[all]"` installieren. ## Lizenz Dieses Projekt ist unter den Bedingungen der MIT-Lizenz lizenziert. fastapi-0.110.3/docs/de/docs/learn/000077500000000000000000000000001461403617600166645ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/learn/index.md000066400000000000000000000003431461403617600203150ustar00rootroot00000000000000# Lernen Hier finden Sie die einführenden Kapitel und Tutorials zum Erlernen von **FastAPI**. Sie könnten dies als **Buch**, als **Kurs**, als **offizielle** und empfohlene Methode zum Erlernen von FastAPI betrachten. 😎 fastapi-0.110.3/docs/de/docs/newsletter.md000066400000000000000000000005021461403617600202760ustar00rootroot00000000000000# FastAPI und Freunde Newsletter fastapi-0.110.3/docs/de/docs/project-generation.md000066400000000000000000000150161461403617600217070ustar00rootroot00000000000000# Projektgenerierung – Vorlage Sie können einen Projektgenerator für den Einstieg verwenden, welcher einen Großteil der Ersteinrichtung, Sicherheit, Datenbank und einige API-Endpunkte bereits für Sie erstellt. Ein Projektgenerator verfügt immer über ein sehr spezifisches Setup, das Sie aktualisieren und an Ihre eigenen Bedürfnisse anpassen sollten, aber es könnte ein guter Ausgangspunkt für Ihr Projekt sein. ## Full Stack FastAPI PostgreSQL GitHub: https://github.com/tiangolo/full-stack-fastapi-postgresql ### Full Stack FastAPI PostgreSQL – Funktionen * Vollständige **Docker**-Integration (Docker-basiert). * Docker-Schwarmmodus-Deployment. * **Docker Compose**-Integration und Optimierung für die lokale Entwicklung. * **Produktionsbereit** Python-Webserver, verwendet Uvicorn und Gunicorn. * Python **FastAPI**-Backend: * **Schnell**: Sehr hohe Leistung, auf Augenhöhe mit **NodeJS** und **Go** (dank Starlette und Pydantic). * **Intuitiv**: Hervorragende Editor-Unterstützung. Codevervollständigung überall. Weniger Zeitaufwand für das Debuggen. * **Einfach**: Einfach zu bedienen und zu erlernen. Weniger Zeit für das Lesen von Dokumentationen. * **Kurz**: Codeverdoppelung minimieren. Mehrere Funktionalitäten aus jeder Parameterdeklaration. * **Robust**: Erhalten Sie produktionsbereiten Code. Mit automatischer, interaktiver Dokumentation. * **Standards-basiert**: Basierend auf (und vollständig kompatibel mit) den offenen Standards für APIs: OpenAPI und JSON Schema. * **Viele weitere Funktionen**, einschließlich automatischer Validierung, Serialisierung, interaktiver Dokumentation, Authentifizierung mit OAuth2-JWT-Tokens, usw. * **Sicheres Passwort**-Hashing standardmäßig. * **JWT-Token**-Authentifizierung. * **SQLAlchemy**-Modelle (unabhängig von Flask-Erweiterungen, sodass sie direkt mit Celery-Workern verwendet werden können). * Grundlegende Startmodelle für Benutzer (ändern und entfernen Sie nach Bedarf). * **Alembic**-Migrationen. * **CORS** (Cross Origin Resource Sharing). * **Celery**-Worker, welche Modelle und Code aus dem Rest des Backends selektiv importieren und verwenden können. * REST-Backend-Tests basierend auf **Pytest**, integriert in Docker, sodass Sie die vollständige API-Interaktion unabhängig von der Datenbank testen können. Da es in Docker ausgeführt wird, kann jedes Mal ein neuer Datenspeicher von Grund auf erstellt werden (Sie können also ElasticSearch, MongoDB, CouchDB oder was auch immer Sie möchten verwenden und einfach testen, ob die API funktioniert). * Einfache Python-Integration mit **Jupyter-Kerneln** für Remote- oder In-Docker-Entwicklung mit Erweiterungen wie Atom Hydrogen oder Visual Studio Code Jupyter. * **Vue**-Frontend: * Mit Vue CLI generiert. * Handhabung der **JWT-Authentifizierung**. * Login-View. * Nach der Anmeldung Hauptansicht des Dashboards. * Haupt-Dashboard mit Benutzererstellung und -bearbeitung. * Bearbeitung des eigenen Benutzers. * **Vuex**. * **Vue-Router**. * **Vuetify** für schöne Material-Designkomponenten. * **TypeScript**. * Docker-Server basierend auf **Nginx** (konfiguriert, um gut mit Vue-Router zu funktionieren). * Mehrstufigen Docker-Erstellung, sodass Sie kompilierten Code nicht speichern oder committen müssen. * Frontend-Tests, welche zur Erstellungszeit ausgeführt werden (können auch deaktiviert werden). * So modular wie möglich gestaltet, sodass es sofort einsatzbereit ist. Sie können es aber mit Vue CLI neu generieren oder es so wie Sie möchten erstellen und wiederverwenden, was Sie möchten. * **PGAdmin** für die PostgreSQL-Datenbank, können Sie problemlos ändern, sodass PHPMyAdmin und MySQL verwendet wird. * **Flower** für die Überwachung von Celery-Jobs. * Load Balancing zwischen Frontend und Backend mit **Traefik**, sodass Sie beide unter derselben Domain haben können, getrennt durch den Pfad, aber von unterschiedlichen Containern ausgeliefert. * Traefik-Integration, einschließlich automatischer Generierung von Let's Encrypt-**HTTPS**-Zertifikaten. * GitLab **CI** (kontinuierliche Integration), einschließlich Frontend- und Backend-Testen. ## Full Stack FastAPI Couchbase GitHub: https://github.com/tiangolo/full-stack-fastapi-couchbase ⚠️ **WARNUNG** ⚠️ Wenn Sie ein neues Projekt von Grund auf starten, prüfen Sie die Alternativen hier. Zum Beispiel könnte der Projektgenerator Full Stack FastAPI PostgreSQL eine bessere Alternative sein, da er aktiv gepflegt und genutzt wird. Und er enthält alle neuen Funktionen und Verbesserungen. Es steht Ihnen weiterhin frei, den Couchbase-basierten Generator zu verwenden, wenn Sie möchten. Er sollte wahrscheinlich immer noch gut funktionieren, und wenn Sie bereits ein Projekt damit erstellt haben, ist das auch in Ordnung (und Sie haben es wahrscheinlich bereits an Ihre Bedürfnisse angepasst). Weitere Informationen hierzu finden Sie in der Dokumentation des Repos. ## Full Stack FastAPI MongoDB ... könnte später kommen, abhängig von meiner verfügbaren Zeit und anderen Faktoren. 😅 🎉 ## Modelle für maschinelles Lernen mit spaCy und FastAPI GitHub: https://github.com/microsoft/cookiecutter-spacy-fastapi ### Modelle für maschinelles Lernen mit spaCy und FastAPI – Funktionen * **spaCy** NER-Modellintegration. * **Azure Cognitive Search**-Anforderungsformat integriert. * **Produktionsbereit** Python-Webserver, verwendet Uvicorn und Gunicorn. * **Azure DevOps** Kubernetes (AKS) CI/CD-Deployment integriert. * **Mehrsprachig** Wählen Sie bei der Projekteinrichtung ganz einfach eine der integrierten Sprachen von spaCy aus. * **Einfach erweiterbar** auf andere Modellframeworks (Pytorch, Tensorflow), nicht nur auf SpaCy. fastapi-0.110.3/docs/de/docs/python-types.md000066400000000000000000000464721461403617600206050ustar00rootroot00000000000000# Einführung in Python-Typen Python hat Unterstützung für optionale „Typhinweise“ (Englisch: „Type Hints“). Auch „Typ Annotationen“ genannt. Diese **„Typhinweise“** oder -Annotationen sind eine spezielle Syntax, die es erlaubt, den Typ einer Variablen zu deklarieren. Durch das Deklarieren von Typen für Ihre Variablen können Editoren und Tools bessere Unterstützung bieten. Dies ist lediglich eine **schnelle Anleitung / Auffrischung** über Pythons Typhinweise. Sie deckt nur das Minimum ab, das nötig ist, um diese mit **FastAPI** zu verwenden ... was tatsächlich sehr wenig ist. **FastAPI** basiert vollständig auf diesen Typhinweisen, sie geben der Anwendung viele Vorteile und Möglichkeiten. Aber selbst wenn Sie **FastAPI** nie verwenden, wird es für Sie nützlich sein, ein wenig darüber zu lernen. !!! note "Hinweis" Wenn Sie ein Python-Experte sind und bereits alles über Typhinweise wissen, überspringen Sie dieses Kapitel und fahren Sie mit dem nächsten fort. ## Motivation Fangen wir mit einem einfachen Beispiel an: ```Python {!../../../docs_src/python_types/tutorial001.py!} ``` Dieses Programm gibt aus: ``` John Doe ``` Die Funktion macht Folgendes: * Nimmt einen `first_name` und `last_name`. * Schreibt den ersten Buchstaben eines jeden Wortes groß, mithilfe von `title()`. * Verkettet sie mit einem Leerzeichen in der Mitte. ```Python hl_lines="2" {!../../../docs_src/python_types/tutorial001.py!} ``` ### Bearbeiten Sie es Es ist ein sehr einfaches Programm. Aber nun stellen Sie sich vor, Sie würden es selbst schreiben. Irgendwann sind die Funktions-Parameter fertig, Sie starten mit der Definition des Körpers ... Aber dann müssen Sie „diese Methode aufrufen, die den ersten Buchstaben in Großbuchstaben umwandelt“. War es `upper`? War es `uppercase`? `first_uppercase`? `capitalize`? Dann versuchen Sie es mit dem langjährigen Freund des Programmierers, der Editor-Autovervollständigung. Sie geben den ersten Parameter der Funktion ein, `first_name`, dann einen Punkt (`.`) und drücken `Strg+Leertaste`, um die Vervollständigung auszulösen. Aber leider erhalten Sie nichts Nützliches: ### Typen hinzufügen Lassen Sie uns eine einzelne Zeile aus der vorherigen Version ändern. Wir ändern den folgenden Teil, die Parameter der Funktion, von: ```Python first_name, last_name ``` zu: ```Python first_name: str, last_name: str ``` Das war's. Das sind die „Typhinweise“: ```Python hl_lines="1" {!../../../docs_src/python_types/tutorial002.py!} ``` Das ist nicht das gleiche wie das Deklarieren von Defaultwerten, wie es hier der Fall ist: ```Python first_name="john", last_name="doe" ``` Das ist eine andere Sache. Wir verwenden Doppelpunkte (`:`), nicht Gleichheitszeichen (`=`). Und das Hinzufügen von Typhinweisen ändert normalerweise nichts an dem, was ohne sie passieren würde. Aber jetzt stellen Sie sich vor, Sie sind wieder mitten in der Erstellung dieser Funktion, aber mit Typhinweisen. An derselben Stelle versuchen Sie, die Autovervollständigung mit „Strg+Leertaste“ auszulösen, und Sie sehen: Hier können Sie durch die Optionen blättern, bis Sie diejenige finden, bei der es „Klick“ macht: ## Mehr Motivation Sehen Sie sich diese Funktion an, sie hat bereits Typhinweise: ```Python hl_lines="1" {!../../../docs_src/python_types/tutorial003.py!} ``` Da der Editor die Typen der Variablen kennt, erhalten Sie nicht nur Code-Vervollständigung, sondern auch eine Fehlerprüfung: Jetzt, da Sie wissen, dass Sie das reparieren müssen, konvertieren Sie `age` mittels `str(age)` in einen String: ```Python hl_lines="2" {!../../../docs_src/python_types/tutorial004.py!} ``` ## Deklarieren von Typen Sie haben gerade den Haupt-Einsatzort für die Deklaration von Typhinweisen gesehen. Als Funktionsparameter. Das ist auch meistens, wie sie in **FastAPI** verwendet werden. ### Einfache Typen Sie können alle Standard-Python-Typen deklarieren, nicht nur `str`. Zum Beispiel diese: * `int` * `float` * `bool` * `bytes` ```Python hl_lines="1" {!../../../docs_src/python_types/tutorial005.py!} ``` ### Generische Typen mit Typ-Parametern Es gibt Datenstrukturen, die andere Werte enthalten können, wie etwa `dict`, `list`, `set` und `tuple`. Die inneren Werte können auch ihren eigenen Typ haben. Diese Typen mit inneren Typen werden „**generische**“ Typen genannt. Es ist möglich, sie mit ihren inneren Typen zu deklarieren. Um diese Typen und die inneren Typen zu deklarieren, können Sie Pythons Standardmodul `typing` verwenden. Es existiert speziell für die Unterstützung dieser Typhinweise. #### Neuere Python-Versionen Die Syntax, welche `typing` verwendet, ist **kompatibel** mit allen Versionen, von Python 3.6 aufwärts zu den neuesten, inklusive Python 3.9, Python 3.10, usw. Mit der Weiterentwicklung von Python kommen **neuere Versionen** heraus, mit verbesserter Unterstützung für Typannotationen, und in vielen Fällen müssen Sie gar nicht mehr das `typing`-Modul importieren, um Typannotationen zu schreiben. Wenn Sie eine neuere Python-Version für Ihr Projekt wählen können, werden Sie aus dieser zusätzlichen Vereinfachung Nutzen ziehen können. In der gesamten Dokumentation gibt es Beispiele, welche kompatibel mit unterschiedlichen Python-Versionen sind (wenn es Unterschiede gibt). Zum Beispiel bedeutet „**Python 3.6+**“, dass das Beispiel kompatibel mit Python 3.6 oder höher ist (inklusive 3.7, 3.8, 3.9, 3.10, usw.). Und „**Python 3.9+**“ bedeutet, es ist kompatibel mit Python 3.9 oder höher (inklusive 3.10, usw.). Wenn Sie über die **neueste Version von Python** verfügen, verwenden Sie die Beispiele für die neueste Version, diese werden die **beste und einfachste Syntax** haben, zum Beispiel, „**Python 3.10+**“. #### Liste Definieren wir zum Beispiel eine Variable, die eine `list` von `str` – eine Liste von Strings – sein soll. === "Python 3.9+" Deklarieren Sie die Variable mit der gleichen Doppelpunkt-Syntax (`:`). Als Typ nehmen Sie `list`. Da die Liste ein Typ ist, welcher innere Typen enthält, werden diese von eckigen Klammern umfasst: ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial006_py39.py!} ``` === "Python 3.8+" Von `typing` importieren Sie `List` (mit Großbuchstaben `L`): ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial006.py!} ``` Deklarieren Sie die Variable mit der gleichen Doppelpunkt-Syntax (`:`). Als Typ nehmen Sie das `List`, das Sie von `typing` importiert haben. Da die Liste ein Typ ist, welcher innere Typen enthält, werden diese von eckigen Klammern umfasst: ```Python hl_lines="4" {!> ../../../docs_src/python_types/tutorial006.py!} ``` !!! tip "Tipp" Die inneren Typen in den eckigen Klammern werden als „Typ-Parameter“ bezeichnet. In diesem Fall ist `str` der Typ-Parameter, der an `List` übergeben wird (oder `list` in Python 3.9 und darüber). Das bedeutet: Die Variable `items` ist eine Liste – `list` – und jedes der Elemente in dieser Liste ist ein String – `str`. !!! tip "Tipp" Wenn Sie Python 3.9 oder höher verwenden, müssen Sie `List` nicht von `typing` importieren, Sie können stattdessen den regulären `list`-Typ verwenden. Auf diese Weise kann Ihr Editor Sie auch bei der Bearbeitung von Einträgen aus der Liste unterstützen: Ohne Typen ist das fast unmöglich zu erreichen. Beachten Sie, dass die Variable `item` eines der Elemente in der Liste `items` ist. Und trotzdem weiß der Editor, dass es sich um ein `str` handelt, und bietet entsprechende Unterstützung. #### Tupel und Menge Das Gleiche gilt für die Deklaration eines Tupels – `tuple` – und einer Menge – `set`: === "Python 3.9+" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial007_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial007.py!} ``` Das bedeutet: * Die Variable `items_t` ist ein `tuple` mit 3 Elementen, einem `int`, einem weiteren `int` und einem `str`. * Die Variable `items_s` ist ein `set`, und jedes seiner Elemente ist vom Typ `bytes`. #### Dict Um ein `dict` zu definieren, übergeben Sie zwei Typ-Parameter, getrennt durch Kommas. Der erste Typ-Parameter ist für die Schlüssel des `dict`. Der zweite Typ-Parameter ist für die Werte des `dict`: === "Python 3.9+" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial008_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial008.py!} ``` Das bedeutet: * Die Variable `prices` ist ein `dict`: * Die Schlüssel dieses `dict` sind vom Typ `str` (z. B. die Namen der einzelnen Artikel). * Die Werte dieses `dict` sind vom Typ `float` (z. B. der Preis jedes Artikels). #### Union Sie können deklarieren, dass eine Variable einer von **verschiedenen Typen** sein kann, zum Beispiel ein `int` oder ein `str`. In Python 3.6 und höher (inklusive Python 3.10) können Sie den `Union`-Typ von `typing` verwenden und die möglichen Typen innerhalb der eckigen Klammern auflisten. In Python 3.10 gibt es zusätzlich eine **neue Syntax**, die es erlaubt, die möglichen Typen getrennt von einem vertikalen Balken (`|`) aufzulisten. === "Python 3.10+" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial008b_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial008b.py!} ``` In beiden Fällen bedeutet das, dass `item` ein `int` oder ein `str` sein kann. #### Vielleicht `None` Sie können deklarieren, dass ein Wert ein `str`, aber vielleicht auch `None` sein kann. In Python 3.6 und darüber (inklusive Python 3.10) können Sie das deklarieren, indem Sie `Optional` vom `typing` Modul importieren und verwenden. ```Python hl_lines="1 4" {!../../../docs_src/python_types/tutorial009.py!} ``` Wenn Sie `Optional[str]` anstelle von nur `str` verwenden, wird Ihr Editor Ihnen dabei helfen, Fehler zu erkennen, bei denen Sie annehmen könnten, dass ein Wert immer eine String (`str`) ist, obwohl er auch `None` sein könnte. `Optional[Something]` ist tatsächlich eine Abkürzung für `Union[Something, None]`, diese beiden sind äquivalent. Das bedeutet auch, dass Sie in Python 3.10 `Something | None` verwenden können: === "Python 3.10+" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial009_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial009.py!} ``` === "Python 3.8+ Alternative" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial009b.py!} ``` #### `Union` oder `Optional` verwenden? Wenn Sie eine Python-Version unterhalb 3.10 verwenden, hier ist mein sehr **subjektiver** Standpunkt dazu: * 🚨 Vermeiden Sie `Optional[SomeType]` * Stattdessen ✨ **verwenden Sie `Union[SomeType, None]`** ✨. Beide sind äquivalent und im Hintergrund dasselbe, aber ich empfehle `Union` statt `Optional`, weil das Wort „**optional**“ impliziert, dass dieser Wert, zum Beispiel als Funktionsparameter, optional ist. Tatsächlich bedeutet es aber nur „Der Wert kann `None` sein“, selbst wenn der Wert nicht optional ist und benötigt wird. Ich denke, `Union[SomeType, None]` ist expliziter bezüglich seiner Bedeutung. Es geht nur um Wörter und Namen. Aber diese Worte können beeinflussen, wie Sie und Ihre Teamkollegen über den Code denken. Nehmen wir zum Beispiel diese Funktion: ```Python hl_lines="1 4" {!../../../docs_src/python_types/tutorial009c.py!} ``` Der Parameter `name` ist definiert als `Optional[str]`, aber er ist **nicht optional**, Sie können die Funktion nicht ohne diesen Parameter aufrufen: ```Python say_hi() # Oh, nein, das löst einen Fehler aus! 😱 ``` Der `name` Parameter wird **immer noch benötigt** (nicht *optional*), weil er keinen Default-Wert hat. `name` akzeptiert aber dennoch `None` als Wert: ```Python say_hi(name=None) # Das funktioniert, None is gültig 🎉 ``` Die gute Nachricht ist, dass Sie sich darüber keine Sorgen mehr machen müssen, wenn Sie Python 3.10 verwenden, da Sie einfach `|` verwenden können, um Vereinigungen von Typen zu definieren: ```Python hl_lines="1 4" {!../../../docs_src/python_types/tutorial009c_py310.py!} ``` Und dann müssen Sie sich nicht mehr um Namen wie `Optional` und `Union` kümmern. 😎 #### Generische Typen Diese Typen, die Typ-Parameter in eckigen Klammern akzeptieren, werden **generische Typen** oder **Generics** genannt. === "Python 3.10+" Sie können die eingebauten Typen als Generics verwenden (mit eckigen Klammern und Typen darin): * `list` * `tuple` * `set` * `dict` Verwenden Sie für den Rest, wie unter Python 3.8, das `typing`-Modul: * `Union` * `Optional` (so wie unter Python 3.8) * ... und andere. In Python 3.10 können Sie als Alternative zu den Generics `Union` und `Optional` den vertikalen Balken (`|`) verwenden, um Vereinigungen von Typen zu deklarieren, das ist besser und einfacher. === "Python 3.9+" Sie können die eingebauten Typen als Generics verwenden (mit eckigen Klammern und Typen darin): * `list` * `tuple` * `set` * `dict` Verwenden Sie für den Rest, wie unter Python 3.8, das `typing`-Modul: * `Union` * `Optional` * ... und andere. === "Python 3.8+" * `List` * `Tuple` * `Set` * `Dict` * `Union` * `Optional` * ... und andere. ### Klassen als Typen Sie können auch eine Klasse als Typ einer Variablen deklarieren. Nehmen wir an, Sie haben eine Klasse `Person`, mit einem Namen: ```Python hl_lines="1-3" {!../../../docs_src/python_types/tutorial010.py!} ``` Dann können Sie eine Variable vom Typ `Person` deklarieren: ```Python hl_lines="6" {!../../../docs_src/python_types/tutorial010.py!} ``` Und wiederum bekommen Sie die volle Editor-Unterstützung: Beachten Sie, das bedeutet: „`one_person` ist eine **Instanz** der Klasse `Person`“. Es bedeutet nicht: „`one_person` ist die **Klasse** genannt `Person`“. ## Pydantic Modelle Pydantic ist eine Python-Bibliothek für die Validierung von Daten. Sie deklarieren die „Form“ der Daten als Klassen mit Attributen. Und jedes Attribut hat einen Typ. Dann erzeugen Sie eine Instanz dieser Klasse mit einigen Werten, und Pydantic validiert die Werte, konvertiert sie in den passenden Typ (falls notwendig) und gibt Ihnen ein Objekt mit allen Daten. Und Sie erhalten volle Editor-Unterstützung für dieses Objekt. Ein Beispiel aus der offiziellen Pydantic Dokumentation: === "Python 3.10+" ```Python {!> ../../../docs_src/python_types/tutorial011_py310.py!} ``` === "Python 3.9+" ```Python {!> ../../../docs_src/python_types/tutorial011_py39.py!} ``` === "Python 3.8+" ```Python {!> ../../../docs_src/python_types/tutorial011.py!} ``` !!! info Um mehr über Pydantic zu erfahren, schauen Sie sich dessen Dokumentation an. **FastAPI** basiert vollständig auf Pydantic. Viel mehr von all dem werden Sie in praktischer Anwendung im [Tutorial - Benutzerhandbuch](tutorial/index.md){.internal-link target=_blank} sehen. !!! tip "Tipp" Pydantic verhält sich speziell, wenn Sie `Optional` oder `Union[Etwas, None]` ohne einen Default-Wert verwenden. Sie können darüber in der Pydantic Dokumentation unter Required fields mehr erfahren. ## Typhinweise mit Metadaten-Annotationen Python bietet auch die Möglichkeit, **zusätzliche Metadaten** in Typhinweisen unterzubringen, mittels `Annotated`. === "Python 3.9+" In Python 3.9 ist `Annotated` ein Teil der Standardbibliothek, Sie können es von `typing` importieren. ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial013_py39.py!} ``` === "Python 3.8+" In Versionen niedriger als Python 3.9 importieren Sie `Annotated` von `typing_extensions`. Es wird bereits mit **FastAPI** installiert sein. ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial013.py!} ``` Python selbst macht nichts mit `Annotated`. Für Editoren und andere Tools ist der Typ immer noch `str`. Aber Sie können `Annotated` nutzen, um **FastAPI** mit Metadaten zu versorgen, die ihm sagen, wie sich ihre Anwendung verhalten soll. Wichtig ist, dass **der erste *Typ-Parameter***, den Sie `Annotated` übergeben, der **tatsächliche Typ** ist. Der Rest sind Metadaten für andere Tools. Im Moment müssen Sie nur wissen, dass `Annotated` existiert, und dass es Standard-Python ist. 😎 Später werden Sie sehen, wie **mächtig** es sein kann. !!! tip "Tipp" Der Umstand, dass es **Standard-Python** ist, bedeutet, dass Sie immer noch die **bestmögliche Entwickler-Erfahrung** in ihrem Editor haben, sowie mit den Tools, die Sie nutzen, um ihren Code zu analysieren, zu refaktorisieren, usw. ✨ Und ebenfalls, dass Ihr Code sehr kompatibel mit vielen anderen Python-Tools und -Bibliotheken sein wird. 🚀 ## Typhinweise in **FastAPI** **FastAPI** macht sich diese Typhinweise zunutze, um mehrere Dinge zu tun. Mit **FastAPI** deklarieren Sie Parameter mit Typhinweisen, und Sie erhalten: * **Editorunterstützung**. * **Typ-Prüfungen**. ... und **FastAPI** verwendet dieselben Deklarationen, um: * **Anforderungen** zu definieren: aus Anfrage-Pfadparametern, Abfrageparametern, Header-Feldern, Bodys, Abhängigkeiten, usw. * **Daten umzuwandeln**: aus der Anfrage in den erforderlichen Typ. * **Daten zu validieren**: aus jeder Anfrage: * **Automatische Fehler** generieren, die an den Client zurückgegeben werden, wenn die Daten ungültig sind. * Die API mit OpenAPI zu **dokumentieren**: * Die dann von den Benutzeroberflächen der automatisch generierten interaktiven Dokumentation verwendet wird. Das mag alles abstrakt klingen. Machen Sie sich keine Sorgen. Sie werden all das in Aktion sehen im [Tutorial - Benutzerhandbuch](tutorial/index.md){.internal-link target=_blank}. Das Wichtigste ist, dass **FastAPI** durch die Verwendung von Standard-Python-Typen an einer einzigen Stelle (anstatt weitere Klassen, Dekoratoren usw. hinzuzufügen) einen Großteil der Arbeit für Sie erledigt. !!! info Wenn Sie bereits das ganze Tutorial durchgearbeitet haben und mehr über Typen erfahren wollen, dann ist eine gute Ressource der „Cheat Sheet“ von `mypy`. fastapi-0.110.3/docs/de/docs/reference/000077500000000000000000000000001461403617600175215ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/reference/apirouter.md000066400000000000000000000010321461403617600220510ustar00rootroot00000000000000# `APIRouter`-Klasse Hier sind die Referenzinformationen für die Klasse `APIRouter` mit all ihren Parametern, Attributen und Methoden. Sie können die `APIRouter`-Klasse direkt von `fastapi` importieren: ```python from fastapi import APIRouter ``` ::: fastapi.APIRouter options: members: - websocket - include_router - get - put - post - delete - options - head - patch - trace - on_event fastapi-0.110.3/docs/de/docs/reference/background.md000066400000000000000000000006661461403617600221720ustar00rootroot00000000000000# Hintergrundtasks – `BackgroundTasks` Sie können einen Parameter in einer *Pfadoperation-Funktion* oder einer Abhängigkeitsfunktion mit dem Typ `BackgroundTasks` deklarieren und diesen danach verwenden, um die Ausführung von Hintergrundtasks nach dem Senden der Response zu definieren. Sie können `BackgroundTasks` direkt von `fastapi` importieren: ```python from fastapi import BackgroundTasks ``` ::: fastapi.BackgroundTasks fastapi-0.110.3/docs/de/docs/reference/dependencies.md000066400000000000000000000013751461403617600224770ustar00rootroot00000000000000# Abhängigkeiten – `Depends()` und `Security()` ## `Depends()` Abhängigkeiten werden hauptsächlich mit der speziellen Funktion `Depends()` behandelt, die ein Callable entgegennimmt. Hier finden Sie deren Referenz und Parameter. Sie können sie direkt von `fastapi` importieren: ```python from fastapi import Depends ``` ::: fastapi.Depends ## `Security()` In vielen Szenarien können Sie die Sicherheit (Autorisierung, Authentifizierung usw.) mit Abhängigkeiten handhaben, indem Sie `Depends()` verwenden. Wenn Sie jedoch auch OAuth2-Scopes deklarieren möchten, können Sie `Security()` anstelle von `Depends()` verwenden. Sie können `Security()` direkt von `fastapi` importieren: ```python from fastapi import Security ``` ::: fastapi.Security fastapi-0.110.3/docs/de/docs/reference/encoders.md000066400000000000000000000001101461403617600216350ustar00rootroot00000000000000# Encoder – `jsonable_encoder` ::: fastapi.encoders.jsonable_encoder fastapi-0.110.3/docs/de/docs/reference/exceptions.md000066400000000000000000000014351461403617600222270ustar00rootroot00000000000000# Exceptions – `HTTPException` und `WebSocketException` Dies sind die Exceptions, die Sie auslösen können, um dem Client Fehler zu berichten. Wenn Sie eine Exception auslösen, wird, wie es bei normalem Python der Fall wäre, der Rest der Ausführung abgebrochen. Auf diese Weise können Sie diese Exceptions von überall im Code werfen, um einen Request abzubrechen und den Fehler dem Client anzuzeigen. Sie können Folgendes verwenden: * `HTTPException` * `WebSocketException` Diese Exceptions können direkt von `fastapi` importiert werden: ```python from fastapi import HTTPException, WebSocketException ``` ::: fastapi.HTTPException ::: fastapi.WebSocketException fastapi-0.110.3/docs/de/docs/reference/fastapi.md000066400000000000000000000013131461403617600214700ustar00rootroot00000000000000# `FastAPI`-Klasse Hier sind die Referenzinformationen für die Klasse `FastAPI` mit all ihren Parametern, Attributen und Methoden. Sie können die `FastAPI`-Klasse direkt von `fastapi` importieren: ```python from fastapi import FastAPI ``` ::: fastapi.FastAPI options: members: - openapi_version - webhooks - state - dependency_overrides - openapi - websocket - include_router - get - put - post - delete - options - head - patch - trace - on_event - middleware - exception_handler fastapi-0.110.3/docs/de/docs/reference/httpconnection.md000066400000000000000000000006421461403617600231040ustar00rootroot00000000000000# `HTTPConnection`-Klasse Wenn Sie Abhängigkeiten definieren möchten, die sowohl mit HTTP als auch mit WebSockets kompatibel sein sollen, können Sie einen Parameter definieren, der eine `HTTPConnection` anstelle eines `Request` oder eines `WebSocket` akzeptiert. Sie können diese von `fastapi.requests` importieren: ```python from fastapi.requests import HTTPConnection ``` ::: fastapi.requests.HTTPConnection fastapi-0.110.3/docs/de/docs/reference/index.md000066400000000000000000000007271461403617600211600ustar00rootroot00000000000000# Referenz – Code-API Hier ist die Referenz oder Code-API, die Klassen, Funktionen, Parameter, Attribute und alle FastAPI-Teile, die Sie in Ihren Anwendungen verwenden können. Wenn Sie **FastAPI** lernen möchten, ist es viel besser, das [FastAPI-Tutorial](https://fastapi.tiangolo.com/tutorial/) zu lesen. !!! note "Hinweis Deutsche Übersetzung" Die nachfolgende API wird aus der Quelltext-Dokumentation erstellt, daher sind nur die Einleitungen auf Deutsch. fastapi-0.110.3/docs/de/docs/reference/middleware.md000066400000000000000000000017511461403617600221640ustar00rootroot00000000000000# Middleware Es gibt mehrere Middlewares, die direkt von Starlette bereitgestellt werden. Lesen Sie mehr darüber in der [FastAPI-Dokumentation über Middleware](../advanced/middleware.md). ::: fastapi.middleware.cors.CORSMiddleware Kann von `fastapi` importiert werden: ```python from fastapi.middleware.cors import CORSMiddleware ``` ::: fastapi.middleware.gzip.GZipMiddleware Kann von `fastapi` importiert werden: ```python from fastapi.middleware.gzip import GZipMiddleware ``` ::: fastapi.middleware.httpsredirect.HTTPSRedirectMiddleware Kann von `fastapi` importiert werden: ```python from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware ``` ::: fastapi.middleware.trustedhost.TrustedHostMiddleware Kann von `fastapi` importiert werden: ```python from fastapi.middleware.trustedhost import TrustedHostMiddleware ``` ::: fastapi.middleware.wsgi.WSGIMiddleware Kann von `fastapi` importiert werden: ```python from fastapi.middleware.wsgi import WSGIMiddleware ``` fastapi-0.110.3/docs/de/docs/reference/openapi/000077500000000000000000000000001461403617600211545ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/reference/openapi/docs.md000066400000000000000000000006131461403617600224260ustar00rootroot00000000000000# OpenAPI `docs` Werkzeuge zur Verwaltung der automatischen OpenAPI-UI-Dokumentation, einschließlich Swagger UI (standardmäßig unter `/docs`) und ReDoc (standardmäßig unter `/redoc`). ::: fastapi.openapi.docs.get_swagger_ui_html ::: fastapi.openapi.docs.get_redoc_html ::: fastapi.openapi.docs.get_swagger_ui_oauth2_redirect_html ::: fastapi.openapi.docs.swagger_ui_default_parameters fastapi-0.110.3/docs/de/docs/reference/openapi/index.md000066400000000000000000000003241461403617600226040ustar00rootroot00000000000000# OpenAPI Es gibt mehrere Werkzeuge zur Handhabung von OpenAPI. Normalerweise müssen Sie diese nicht verwenden, es sei denn, Sie haben einen bestimmten fortgeschrittenen Anwendungsfall, welcher das erfordert. fastapi-0.110.3/docs/de/docs/reference/openapi/models.md000066400000000000000000000002221461403617600227550ustar00rootroot00000000000000# OpenAPI-`models` OpenAPI Pydantic-Modelle, werden zum Generieren und Validieren der generierten OpenAPI verwendet. ::: fastapi.openapi.models fastapi-0.110.3/docs/de/docs/reference/parameters.md000066400000000000000000000011731461403617600222100ustar00rootroot00000000000000# Request-Parameter Hier die Referenzinformationen für die Request-Parameter. Dies sind die Sonderfunktionen, die Sie mittels `Annotated` in *Pfadoperation-Funktion*-Parameter oder Abhängigkeitsfunktionen einfügen können, um Daten aus dem Request abzurufen. Dies beinhaltet: * `Query()` * `Path()` * `Body()` * `Cookie()` * `Header()` * `Form()` * `File()` Sie können diese alle direkt von `fastapi` importieren: ```python from fastapi import Body, Cookie, File, Form, Header, Path, Query ``` ::: fastapi.Query ::: fastapi.Path ::: fastapi.Body ::: fastapi.Cookie ::: fastapi.Header ::: fastapi.Form ::: fastapi.File fastapi-0.110.3/docs/de/docs/reference/request.md000066400000000000000000000011241461403617600215310ustar00rootroot00000000000000# `Request`-Klasse Sie können einen Parameter in einer *Pfadoperation-Funktion* oder einer Abhängigkeit als vom Typ `Request` deklarieren und dann direkt auf das Requestobjekt zugreifen, ohne jegliche Validierung, usw. Sie können es direkt von `fastapi` importieren: ```python from fastapi import Request ``` !!! tip "Tipp" Wenn Sie Abhängigkeiten definieren möchten, die sowohl mit HTTP als auch mit WebSockets kompatibel sein sollen, können Sie einen Parameter definieren, der eine `HTTPConnection` anstelle eines `Request` oder eines `WebSocket` akzeptiert. ::: fastapi.Request fastapi-0.110.3/docs/de/docs/reference/response.md000066400000000000000000000007031461403617600217010ustar00rootroot00000000000000# `Response`-Klasse Sie können einen Parameter in einer *Pfadoperation-Funktion* oder einer Abhängigkeit als `Response` deklarieren und dann Daten für die Response wie Header oder Cookies festlegen. Diese können Sie auch direkt verwenden, um eine Instanz davon zu erstellen und diese von Ihren *Pfadoperationen* zurückzugeben. Sie können sie direkt von `fastapi` importieren: ```python from fastapi import Response ``` ::: fastapi.Response fastapi-0.110.3/docs/de/docs/reference/responses.md000066400000000000000000000075011461403617600220670ustar00rootroot00000000000000# Benutzerdefinierte Responseklassen – File, HTML, Redirect, Streaming, usw. Es gibt mehrere benutzerdefinierte Responseklassen, von denen Sie eine Instanz erstellen und diese direkt von Ihren *Pfadoperationen* zurückgeben können. Lesen Sie mehr darüber in der [FastAPI-Dokumentation zu benutzerdefinierten Responses – HTML, Stream, Datei, andere](../advanced/custom-response.md). Sie können diese direkt von `fastapi.responses` importieren: ```python from fastapi.responses import ( FileResponse, HTMLResponse, JSONResponse, ORJSONResponse, PlainTextResponse, RedirectResponse, Response, StreamingResponse, UJSONResponse, ) ``` ## FastAPI-Responses Es gibt einige benutzerdefinierte FastAPI-Responseklassen, welche Sie verwenden können, um die JSON-Performanz zu optimieren. ::: fastapi.responses.UJSONResponse options: members: - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ::: fastapi.responses.ORJSONResponse options: members: - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ## Starlette-Responses ::: fastapi.responses.FileResponse options: members: - chunk_size - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ::: fastapi.responses.HTMLResponse options: members: - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ::: fastapi.responses.JSONResponse options: members: - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ::: fastapi.responses.PlainTextResponse options: members: - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ::: fastapi.responses.RedirectResponse options: members: - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ::: fastapi.responses.Response options: members: - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ::: fastapi.responses.StreamingResponse options: members: - body_iterator - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie fastapi-0.110.3/docs/de/docs/reference/security/000077500000000000000000000000001461403617600213705ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/reference/security/index.md000066400000000000000000000035241461403617600230250ustar00rootroot00000000000000# Sicherheitstools Wenn Sie Abhängigkeiten mit OAuth2-Scopes deklarieren müssen, verwenden Sie `Security()`. Aber Sie müssen immer noch definieren, was das Dependable, das Callable ist, welches Sie als Parameter an `Depends()` oder `Security()` übergeben. Es gibt mehrere Tools, mit denen Sie diese Dependables erstellen können, und sie werden in OpenAPI integriert, sodass sie in der Oberfläche der automatischen Dokumentation angezeigt werden und von automatisch generierten Clients und SDKs, usw., verwendet werden können. Sie können sie von `fastapi.security` importieren: ```python from fastapi.security import ( APIKeyCookie, APIKeyHeader, APIKeyQuery, HTTPAuthorizationCredentials, HTTPBasic, HTTPBasicCredentials, HTTPBearer, HTTPDigest, OAuth2, OAuth2AuthorizationCodeBearer, OAuth2PasswordBearer, OAuth2PasswordRequestForm, OAuth2PasswordRequestFormStrict, OpenIdConnect, SecurityScopes, ) ``` ## API-Schlüssel-Sicherheitsschemas ::: fastapi.security.APIKeyCookie ::: fastapi.security.APIKeyHeader ::: fastapi.security.APIKeyQuery ## HTTP-Authentifizierungsschemas ::: fastapi.security.HTTPBasic ::: fastapi.security.HTTPBearer ::: fastapi.security.HTTPDigest ## HTTP-Anmeldeinformationen ::: fastapi.security.HTTPAuthorizationCredentials ::: fastapi.security.HTTPBasicCredentials ## OAuth2-Authentifizierung ::: fastapi.security.OAuth2 ::: fastapi.security.OAuth2AuthorizationCodeBearer ::: fastapi.security.OAuth2PasswordBearer ## OAuth2-Passwortformulare ::: fastapi.security.OAuth2PasswordRequestForm ::: fastapi.security.OAuth2PasswordRequestFormStrict ## OAuth2-Sicherheitsscopes in Abhängigkeiten ::: fastapi.security.SecurityScopes ## OpenID Connect ::: fastapi.security.OpenIdConnect fastapi-0.110.3/docs/de/docs/reference/staticfiles.md000066400000000000000000000006521461403617600223600ustar00rootroot00000000000000# Statische Dateien – `StaticFiles` Sie können die `StaticFiles`-Klasse verwenden, um statische Dateien wie JavaScript, CSS, Bilder, usw. bereitzustellen. Lesen Sie mehr darüber in der [FastAPI-Dokumentation zu statischen Dateien](../tutorial/static-files.md). Sie können sie direkt von `fastapi.staticfiles` importieren: ```python from fastapi.staticfiles import StaticFiles ``` ::: fastapi.staticfiles.StaticFiles fastapi-0.110.3/docs/de/docs/reference/status.md000066400000000000000000000016461461403617600213750ustar00rootroot00000000000000# Statuscodes Sie können das Modul `status` von `fastapi` importieren: ```python from fastapi import status ``` `status` wird direkt von Starlette bereitgestellt. Es enthält eine Gruppe benannter Konstanten (Variablen) mit ganzzahligen Statuscodes. Zum Beispiel: * 200: `status.HTTP_200_OK` * 403: `status.HTTP_403_FORBIDDEN` * usw. Es kann praktisch sein, schnell auf HTTP- (und WebSocket-)Statuscodes in Ihrer Anwendung zuzugreifen, indem Sie die automatische Vervollständigung für den Namen verwenden, ohne sich die Zahlen für die Statuscodes merken zu müssen. Lesen Sie mehr darüber in der [FastAPI-Dokumentation zu Response-Statuscodes](../tutorial/response-status-code.md). ## Beispiel ```python from fastapi import FastAPI, status app = FastAPI() @app.get("/items/", status_code=status.HTTP_418_IM_A_TEAPOT) def read_items(): return [{"name": "Plumbus"}, {"name": "Portal Gun"}] ``` ::: fastapi.status fastapi-0.110.3/docs/de/docs/reference/templating.md000066400000000000000000000006021461403617600222050ustar00rootroot00000000000000# Templating – `Jinja2Templates` Sie können die `Jinja2Templates`-Klasse verwenden, um Jinja-Templates zu rendern. Lesen Sie mehr darüber in der [FastAPI-Dokumentation zu Templates](../advanced/templates.md). Sie können die Klasse direkt von `fastapi.templating` importieren: ```python from fastapi.templating import Jinja2Templates ``` ::: fastapi.templating.Jinja2Templates fastapi-0.110.3/docs/de/docs/reference/testclient.md000066400000000000000000000007411461403617600222230ustar00rootroot00000000000000# Testclient – `TestClient` Sie können die `TestClient`-Klasse verwenden, um FastAPI-Anwendungen zu testen, ohne eine tatsächliche HTTP- und Socket-Verbindung zu erstellen, Sie kommunizieren einfach direkt mit dem FastAPI-Code. Lesen Sie mehr darüber in der [FastAPI-Dokumentation über Testen](../tutorial/testing.md). Sie können sie direkt von `fastapi.testclient` importieren: ```python from fastapi.testclient import TestClient ``` ::: fastapi.testclient.TestClient fastapi-0.110.3/docs/de/docs/reference/uploadfile.md000066400000000000000000000007571461403617600222000ustar00rootroot00000000000000# `UploadFile`-Klasse Sie können *Pfadoperation-Funktionsparameter* als Parameter vom Typ `UploadFile` definieren, um Dateien aus dem Request zu erhalten. Sie können es direkt von `fastapi` importieren: ```python from fastapi import UploadFile ``` ::: fastapi.UploadFile options: members: - file - filename - size - headers - content_type - read - write - seek - close fastapi-0.110.3/docs/de/docs/reference/websockets.md000066400000000000000000000034741461403617600222240ustar00rootroot00000000000000# WebSockets Bei der Definition von WebSockets deklarieren Sie normalerweise einen Parameter vom Typ `WebSocket` und können damit Daten vom Client lesen und an ihn senden. Er wird direkt von Starlette bereitgestellt, Sie können ihn aber von `fastapi` importieren: ```python from fastapi import WebSocket ``` !!! tip "Tipp" Wenn Sie Abhängigkeiten definieren möchten, die sowohl mit HTTP als auch mit WebSockets kompatibel sein sollen, können Sie einen Parameter definieren, der eine `HTTPConnection` anstelle eines `Request` oder eines `WebSocket` akzeptiert. ::: fastapi.WebSocket options: members: - scope - app - url - base_url - headers - query_params - path_params - cookies - client - state - url_for - client_state - application_state - receive - send - accept - receive_text - receive_bytes - receive_json - iter_text - iter_bytes - iter_json - send_text - send_bytes - send_json - close Wenn ein Client die Verbindung trennt, wird eine `WebSocketDisconnect`-Exception ausgelöst, die Sie abfangen können. Sie können diese direkt von `fastapi` importieren: ```python from fastapi import WebSocketDisconnect ``` ::: fastapi.WebSocketDisconnect ## WebSockets – zusätzliche Klassen Zusätzliche Klassen für die Handhabung von WebSockets. Werden direkt von Starlette bereitgestellt, Sie können sie jedoch von `fastapi` importieren: ```python from fastapi.websockets import WebSocketDisconnect, WebSocketState ``` ::: fastapi.websockets.WebSocketDisconnect ::: fastapi.websockets.WebSocketState fastapi-0.110.3/docs/de/docs/resources/000077500000000000000000000000001461403617600175755ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/resources/index.md000066400000000000000000000001171461403617600212250ustar00rootroot00000000000000# Ressourcen Zusätzliche Ressourcen, externe Links, Artikel und mehr. ✈️ fastapi-0.110.3/docs/de/docs/tutorial/000077500000000000000000000000001461403617600174265ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/tutorial/background-tasks.md000066400000000000000000000146751461403617600232270ustar00rootroot00000000000000# Hintergrundtasks Sie können Hintergrundtasks (Hintergrund-Aufgaben) definieren, die *nach* der Rückgabe einer Response ausgeführt werden sollen. Das ist nützlich für Vorgänge, die nach einem Request ausgeführt werden müssen, bei denen der Client jedoch nicht unbedingt auf den Abschluss des Vorgangs warten muss, bevor er die Response erhält. Hierzu zählen beispielsweise: * E-Mail-Benachrichtigungen, die nach dem Ausführen einer Aktion gesendet werden: * Da die Verbindung zu einem E-Mail-Server und das Senden einer E-Mail in der Regel „langsam“ ist (einige Sekunden), können Sie die Response sofort zurücksenden und die E-Mail-Benachrichtigung im Hintergrund senden. * Daten verarbeiten: * Angenommen, Sie erhalten eine Datei, die einen langsamen Prozess durchlaufen muss. Sie können als Response „Accepted“ (HTTP 202) zurückgeben und die Datei im Hintergrund verarbeiten. ## `BackgroundTasks` verwenden Importieren Sie zunächst `BackgroundTasks` und definieren Sie einen Parameter in Ihrer *Pfadoperation-Funktion* mit der Typdeklaration `BackgroundTasks`: ```Python hl_lines="1 13" {!../../../docs_src/background_tasks/tutorial001.py!} ``` **FastAPI** erstellt für Sie das Objekt vom Typ `BackgroundTasks` und übergibt es als diesen Parameter. ## Eine Taskfunktion erstellen Erstellen Sie eine Funktion, die als Hintergrundtask ausgeführt werden soll. Es handelt sich schlicht um eine Standard-Funktion, die Parameter empfangen kann. Es kann sich um eine `async def`- oder normale `def`-Funktion handeln. **FastAPI** weiß, wie damit zu verfahren ist. In diesem Fall schreibt die Taskfunktion in eine Datei (den Versand einer E-Mail simulierend). Und da der Schreibvorgang nicht `async` und `await` verwendet, definieren wir die Funktion mit normalem `def`: ```Python hl_lines="6-9" {!../../../docs_src/background_tasks/tutorial001.py!} ``` ## Den Hintergrundtask hinzufügen Übergeben Sie innerhalb Ihrer *Pfadoperation-Funktion* Ihre Taskfunktion mit der Methode `.add_task()` an das *Hintergrundtasks*-Objekt: ```Python hl_lines="14" {!../../../docs_src/background_tasks/tutorial001.py!} ``` `.add_task()` erhält als Argumente: * Eine Taskfunktion, die im Hintergrund ausgeführt wird (`write_notification`). * Eine beliebige Folge von Argumenten, die der Reihe nach an die Taskfunktion übergeben werden sollen (`email`). * Alle Schlüsselwort-Argumente, die an die Taskfunktion übergeben werden sollen (`message="some notification"`). ## Dependency Injection Die Verwendung von `BackgroundTasks` funktioniert auch mit dem Dependency Injection System. Sie können einen Parameter vom Typ `BackgroundTasks` auf mehreren Ebenen deklarieren: in einer *Pfadoperation-Funktion*, in einer Abhängigkeit (Dependable), in einer Unterabhängigkeit usw. **FastAPI** weiß, was jeweils zu tun ist und wie dasselbe Objekt wiederverwendet werden kann, sodass alle Hintergrundtasks zusammengeführt und anschließend im Hintergrund ausgeführt werden: === "Python 3.10+" ```Python hl_lines="13 15 22 25" {!> ../../../docs_src/background_tasks/tutorial002_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="13 15 22 25" {!> ../../../docs_src/background_tasks/tutorial002_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="14 16 23 26" {!> ../../../docs_src/background_tasks/tutorial002_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="11 13 20 23" {!> ../../../docs_src/background_tasks/tutorial002_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="13 15 22 25" {!> ../../../docs_src/background_tasks/tutorial002.py!} ``` In obigem Beispiel werden die Nachrichten, *nachdem* die Response gesendet wurde, in die Datei `log.txt` geschrieben. Wenn im Request ein Query-Parameter enthalten war, wird dieser in einem Hintergrundtask in das Log geschrieben. Und dann schreibt ein weiterer Hintergrundtask, der in der *Pfadoperation-Funktion* erstellt wird, eine Nachricht unter Verwendung des Pfad-Parameters `email`. ## Technische Details Die Klasse `BackgroundTasks` stammt direkt von `starlette.background`. Sie wird direkt in FastAPI importiert/inkludiert, sodass Sie sie von `fastapi` importieren können und vermeiden, versehentlich das alternative `BackgroundTask` (ohne das `s` am Ende) von `starlette.background` zu importieren. Indem Sie nur `BackgroundTasks` (und nicht `BackgroundTask`) verwenden, ist es dann möglich, es als *Pfadoperation-Funktion*-Parameter zu verwenden und **FastAPI** den Rest für Sie erledigen zu lassen, genau wie bei der direkten Verwendung des `Request`-Objekts. Es ist immer noch möglich, `BackgroundTask` allein in FastAPI zu verwenden, aber Sie müssen das Objekt in Ihrem Code erstellen und eine Starlette-`Response` zurückgeben, die es enthält. Weitere Details finden Sie in der offiziellen Starlette-Dokumentation für Hintergrundtasks. ## Vorbehalt Wenn Sie umfangreiche Hintergrundberechnungen durchführen müssen und diese nicht unbedingt vom selben Prozess ausgeführt werden müssen (z. B. müssen Sie Speicher, Variablen, usw. nicht gemeinsam nutzen), könnte die Verwendung anderer größerer Tools wie z. B. Celery von Vorteil sein. Sie erfordern in der Regel komplexere Konfigurationen und einen Nachrichten-/Job-Queue-Manager wie RabbitMQ oder Redis, ermöglichen Ihnen jedoch die Ausführung von Hintergrundtasks in mehreren Prozessen und insbesondere auf mehreren Servern. Um ein Beispiel zu sehen, sehen Sie sich die [Projektgeneratoren](../project-generation.md){.internal-link target=_blank} an. Sie alle enthalten Celery, bereits konfiguriert. Wenn Sie jedoch über dieselbe **FastAPI**-Anwendung auf Variablen und Objekte zugreifen oder kleine Hintergrundtasks ausführen müssen (z. B. das Senden einer E-Mail-Benachrichtigung), können Sie einfach `BackgroundTasks` verwenden. ## Zusammenfassung Importieren und verwenden Sie `BackgroundTasks` mit Parametern in *Pfadoperation-Funktionen* und Abhängigkeiten, um Hintergrundtasks hinzuzufügen. fastapi-0.110.3/docs/de/docs/tutorial/bigger-applications.md000066400000000000000000000521641461403617600237030ustar00rootroot00000000000000# Größere Anwendungen – mehrere Dateien Wenn Sie eine Anwendung oder eine Web-API erstellen, ist es selten der Fall, dass Sie alles in einer einzigen Datei unterbringen können. **FastAPI** bietet ein praktisches Werkzeug zur Strukturierung Ihrer Anwendung bei gleichzeitiger Wahrung der Flexibilität. !!! info Wenn Sie von Flask kommen, wäre dies das Äquivalent zu Flasks Blueprints. ## Eine Beispiel-Dateistruktur Nehmen wir an, Sie haben eine Dateistruktur wie diese: ``` . ├── app │   ├── __init__.py │   ├── main.py │   ├── dependencies.py │   └── routers │   │ ├── __init__.py │   │ ├── items.py │   │ └── users.py │   └── internal │   ├── __init__.py │   └── admin.py ``` !!! tip "Tipp" Es gibt mehrere `__init__.py`-Dateien: eine in jedem Verzeichnis oder Unterverzeichnis. Das ermöglicht den Import von Code aus einer Datei in eine andere. In `app/main.py` könnten Sie beispielsweise eine Zeile wie diese haben: ``` from app.routers import items ``` * Das Verzeichnis `app` enthält alles. Und es hat eine leere Datei `app/__init__.py`, es handelt sich also um ein „Python-Package“ (eine Sammlung von „Python-Modulen“): `app`. * Es enthält eine Datei `app/main.py`. Da sie sich in einem Python-Package (einem Verzeichnis mit einer Datei `__init__.py`) befindet, ist sie ein „Modul“ dieses Packages: `app.main`. * Es gibt auch eine Datei `app/dependencies.py`, genau wie `app/main.py` ist sie ein „Modul“: `app.dependencies`. * Es gibt ein Unterverzeichnis `app/routers/` mit einer weiteren Datei `__init__.py`, es handelt sich also um ein „Python-Subpackage“: `app.routers`. * Die Datei `app/routers/items.py` befindet sich in einem Package, `app/routers/`, also ist sie ein Submodul: `app.routers.items`. * Das Gleiche gilt für `app/routers/users.py`, es ist ein weiteres Submodul: `app.routers.users`. * Es gibt auch ein Unterverzeichnis `app/internal/` mit einer weiteren Datei `__init__.py`, es handelt sich also um ein weiteres „Python-Subpackage“: `app.internal`. * Und die Datei `app/internal/admin.py` ist ein weiteres Submodul: `app.internal.admin`. Die gleiche Dateistruktur mit Kommentaren: ``` . ├── app # „app“ ist ein Python-Package │   ├── __init__.py # diese Datei macht „app“ zu einem „Python-Package“ │   ├── main.py # „main“-Modul, z. B. import app.main │   ├── dependencies.py # „dependencies“-Modul, z. B. import app.dependencies │   └── routers # „routers“ ist ein „Python-Subpackage“ │   │ ├── __init__.py # macht „routers“ zu einem „Python-Subpackage“ │   │ ├── items.py # „items“-Submodul, z. B. import app.routers.items │   │ └── users.py # „users“-Submodul, z. B. import app.routers.users │   └── internal # „internal“ ist ein „Python-Subpackage“ │   ├── __init__.py # macht „internal“ zu einem „Python-Subpackage“ │   └── admin.py # „admin“-Submodul, z. B. import app.internal.admin ``` ## `APIRouter` Nehmen wir an, die Datei, die nur für die Verwaltung von Benutzern zuständig ist, ist das Submodul unter `/app/routers/users.py`. Sie möchten die *Pfadoperationen* für Ihre Benutzer vom Rest des Codes trennen, um ihn organisiert zu halten. Aber es ist immer noch Teil derselben **FastAPI**-Anwendung/Web-API (es ist Teil desselben „Python-Packages“). Sie können die *Pfadoperationen* für dieses Modul mit `APIRouter` erstellen. ### `APIRouter` importieren Sie importieren ihn und erstellen eine „Instanz“ auf die gleiche Weise wie mit der Klasse `FastAPI`: ```Python hl_lines="1 3" title="app/routers/users.py" {!../../../docs_src/bigger_applications/app/routers/users.py!} ``` ### *Pfadoperationen* mit `APIRouter` Und dann verwenden Sie ihn, um Ihre *Pfadoperationen* zu deklarieren. Verwenden Sie ihn auf die gleiche Weise wie die Klasse `FastAPI`: ```Python hl_lines="6 11 16" title="app/routers/users.py" {!../../../docs_src/bigger_applications/app/routers/users.py!} ``` Sie können sich `APIRouter` als eine „Mini-`FastAPI`“-Klasse vorstellen. Alle die gleichen Optionen werden unterstützt. Alle die gleichen `parameters`, `responses`, `dependencies`, `tags`, usw. !!! tip "Tipp" In diesem Beispiel heißt die Variable `router`, aber Sie können ihr einen beliebigen Namen geben. Wir werden diesen `APIRouter` in die Hauptanwendung `FastAPI` einbinden, aber zuerst kümmern wir uns um die Abhängigkeiten und einen anderen `APIRouter`. ## Abhängigkeiten Wir sehen, dass wir einige Abhängigkeiten benötigen, die an mehreren Stellen der Anwendung verwendet werden. Also fügen wir sie in ihr eigenes `dependencies`-Modul (`app/dependencies.py`) ein. Wir werden nun eine einfache Abhängigkeit verwenden, um einen benutzerdefinierten `X-Token`-Header zu lesen: === "Python 3.9+" ```Python hl_lines="3 6-8" title="app/dependencies.py" {!> ../../../docs_src/bigger_applications/app_an_py39/dependencies.py!} ``` === "Python 3.8+" ```Python hl_lines="1 5-7" title="app/dependencies.py" {!> ../../../docs_src/bigger_applications/app_an/dependencies.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="1 4-6" title="app/dependencies.py" {!> ../../../docs_src/bigger_applications/app/dependencies.py!} ``` !!! tip "Tipp" Um dieses Beispiel zu vereinfachen, verwenden wir einen erfundenen Header. Aber in der Praxis werden Sie mit den integrierten [Sicherheits-Werkzeugen](security/index.md){.internal-link target=_blank} bessere Ergebnisse erzielen. ## Ein weiteres Modul mit `APIRouter`. Nehmen wir an, Sie haben im Modul unter `app/routers/items.py` auch die Endpunkte, die für die Verarbeitung von Artikeln („Items“) aus Ihrer Anwendung vorgesehen sind. Sie haben *Pfadoperationen* für: * `/items/` * `/items/{item_id}` Es ist alles die gleiche Struktur wie bei `app/routers/users.py`. Aber wir wollen schlauer sein und den Code etwas vereinfachen. Wir wissen, dass alle *Pfadoperationen* in diesem Modul folgendes haben: * Pfad-`prefix`: `/items`. * `tags`: (nur ein Tag: `items`). * Zusätzliche `responses`. * `dependencies`: Sie alle benötigen die von uns erstellte `X-Token`-Abhängigkeit. Anstatt also alles zu jeder *Pfadoperation* hinzuzufügen, können wir es dem `APIRouter` hinzufügen. ```Python hl_lines="5-10 16 21" title="app/routers/items.py" {!../../../docs_src/bigger_applications/app/routers/items.py!} ``` Da der Pfad jeder *Pfadoperation* mit `/` beginnen muss, wie in: ```Python hl_lines="1" @router.get("/{item_id}") async def read_item(item_id: str): ... ``` ... darf das Präfix kein abschließendes `/` enthalten. Das Präfix lautet in diesem Fall also `/items`. Wir können auch eine Liste von `tags` und zusätzliche `responses` hinzufügen, die auf alle in diesem Router enthaltenen *Pfadoperationen* angewendet werden. Und wir können eine Liste von `dependencies` hinzufügen, die allen *Pfadoperationen* im Router hinzugefügt und für jeden an sie gerichteten Request ausgeführt/aufgelöst werden. !!! tip "Tipp" Beachten Sie, dass ähnlich wie bei [Abhängigkeiten in *Pfadoperation-Dekoratoren*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} kein Wert an Ihre *Pfadoperation-Funktion* übergeben wird. Das Endergebnis ist, dass die Pfade für diese Artikel jetzt wie folgt lauten: * `/items/` * `/items/{item_id}` ... wie wir es beabsichtigt hatten. * Sie werden mit einer Liste von Tags gekennzeichnet, die einen einzelnen String `"items"` enthält. * Diese „Tags“ sind besonders nützlich für die automatischen interaktiven Dokumentationssysteme (unter Verwendung von OpenAPI). * Alle enthalten die vordefinierten `responses`. * Für alle diese *Pfadoperationen* wird die Liste der `dependencies` ausgewertet/ausgeführt, bevor sie selbst ausgeführt werden. * Wenn Sie außerdem Abhängigkeiten in einer bestimmten *Pfadoperation* deklarieren, **werden diese ebenfalls ausgeführt**. * Zuerst werden die Router-Abhängigkeiten ausgeführt, dann die [`dependencies` im Dekorator](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank} und dann die normalen Parameterabhängigkeiten. * Sie können auch [`Security`-Abhängigkeiten mit `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank} hinzufügen. !!! tip "Tipp" `dependencies` im `APIRouter` können beispielsweise verwendet werden, um eine Authentifizierung für eine ganze Gruppe von *Pfadoperationen* zu erfordern. Selbst wenn die Abhängigkeiten nicht jeder einzeln hinzugefügt werden. !!! check Die Parameter `prefix`, `tags`, `responses` und `dependencies` sind (wie in vielen anderen Fällen) nur ein Feature von **FastAPI**, um Ihnen dabei zu helfen, Codeverdoppelung zu vermeiden. ### Die Abhängigkeiten importieren Der folgende Code befindet sich im Modul `app.routers.items`, also in der Datei `app/routers/items.py`. Und wir müssen die Abhängigkeitsfunktion aus dem Modul `app.dependencies` importieren, also aus der Datei `app/dependencies.py`. Daher verwenden wir einen relativen Import mit `..` für die Abhängigkeiten: ```Python hl_lines="3" title="app/routers/items.py" {!../../../docs_src/bigger_applications/app/routers/items.py!} ``` #### Wie relative Importe funktionieren !!! tip "Tipp" Wenn Sie genau wissen, wie Importe funktionieren, fahren Sie mit dem nächsten Abschnitt unten fort. Ein einzelner Punkt `.`, wie in: ```Python from .dependencies import get_token_header ``` würde bedeuten: * Beginnend im selben Package, in dem sich dieses Modul (die Datei `app/routers/items.py`) befindet (das Verzeichnis `app/routers/`) ... * finde das Modul `dependencies` (eine imaginäre Datei unter `app/routers/dependencies.py`) ... * und importiere daraus die Funktion `get_token_header`. Aber diese Datei existiert nicht, unsere Abhängigkeiten befinden sich in einer Datei unter `app/dependencies.py`. Erinnern Sie sich, wie unsere Anwendungs-/Dateistruktur aussieht: --- Die beiden Punkte `..`, wie in: ```Python from ..dependencies import get_token_header ``` bedeuten: * Beginnend im selben Package, in dem sich dieses Modul (die Datei `app/routers/items.py`) befindet (das Verzeichnis `app/routers/`) ... * gehe zum übergeordneten Package (das Verzeichnis `app/`) ... * und finde dort das Modul `dependencies` (die Datei unter `app/dependencies.py`) ... * und importiere daraus die Funktion `get_token_header`. Das funktioniert korrekt! 🎉 --- Das Gleiche gilt, wenn wir drei Punkte `...` verwendet hätten, wie in: ```Python from ...dependencies import get_token_header ``` Das würde bedeuten: * Beginnend im selben Package, in dem sich dieses Modul (die Datei `app/routers/items.py`) befindet (das Verzeichnis `app/routers/`) ... * gehe zum übergeordneten Package (das Verzeichnis `app/`) ... * gehe dann zum übergeordneten Package dieses Packages (es gibt kein übergeordnetes Package, `app` ist die oberste Ebene 😱) ... * und finde dort das Modul `dependencies` (die Datei unter `app/dependencies.py`) ... * und importiere daraus die Funktion `get_token_header`. Das würde sich auf ein Paket oberhalb von `app/` beziehen, mit seiner eigenen Datei `__init__.py`, usw. Aber das haben wir nicht. Das würde in unserem Beispiel also einen Fehler auslösen. 🚨 Aber jetzt wissen Sie, wie es funktioniert, sodass Sie relative Importe in Ihren eigenen Anwendungen verwenden können, egal wie komplex diese sind. 🤓 ### Einige benutzerdefinierte `tags`, `responses`, und `dependencies` hinzufügen Wir fügen weder das Präfix `/items` noch `tags=["items"]` zu jeder *Pfadoperation* hinzu, da wir sie zum `APIRouter` hinzugefügt haben. Aber wir können immer noch _mehr_ `tags` hinzufügen, die auf eine bestimmte *Pfadoperation* angewendet werden, sowie einige zusätzliche `responses`, die speziell für diese *Pfadoperation* gelten: ```Python hl_lines="30-31" title="app/routers/items.py" {!../../../docs_src/bigger_applications/app/routers/items.py!} ``` !!! tip "Tipp" Diese letzte Pfadoperation wird eine Kombination von Tags haben: `["items", "custom"]`. Und sie wird auch beide Responses in der Dokumentation haben, eine für `404` und eine für `403`. ## Das Haupt-`FastAPI`. Sehen wir uns nun das Modul unter `app/main.py` an. Hier importieren und verwenden Sie die Klasse `FastAPI`. Dies ist die Hauptdatei Ihrer Anwendung, die alles zusammen bindet. Und da sich der Großteil Ihrer Logik jetzt in seinem eigenen spezifischen Modul befindet, wird die Hauptdatei recht einfach sein. ### `FastAPI` importieren Sie importieren und erstellen wie gewohnt eine `FastAPI`-Klasse. Und wir können sogar [globale Abhängigkeiten](dependencies/global-dependencies.md){.internal-link target=_blank} deklarieren, die mit den Abhängigkeiten für jeden `APIRouter` kombiniert werden: ```Python hl_lines="1 3 7" title="app/main.py" {!../../../docs_src/bigger_applications/app/main.py!} ``` ### Den `APIRouter` importieren Jetzt importieren wir die anderen Submodule, die `APIRouter` haben: ```Python hl_lines="4-5" title="app/main.py" {!../../../docs_src/bigger_applications/app/main.py!} ``` Da es sich bei den Dateien `app/routers/users.py` und `app/routers/items.py` um Submodule handelt, die Teil desselben Python-Packages `app` sind, können wir einen einzelnen Punkt `.` verwenden, um sie mit „relativen Imports“ zu importieren. ### Wie das Importieren funktioniert Die Sektion: ```Python from .routers import items, users ``` bedeutet: * Beginnend im selben Package, in dem sich dieses Modul (die Datei `app/main.py`) befindet (das Verzeichnis `app/`) ... * Suche nach dem Subpackage `routers` (das Verzeichnis unter `app/routers/`) ... * und importiere daraus die Submodule `items` (die Datei unter `app/routers/items.py`) und `users` (die Datei unter `app/routers/users.py`) ... Das Modul `items` verfügt über eine Variable `router` (`items.router`). Das ist dieselbe, die wir in der Datei `app/routers/items.py` erstellt haben, es ist ein `APIRouter`-Objekt. Und dann machen wir das gleiche für das Modul `users`. Wir könnten sie auch wie folgt importieren: ```Python from app.routers import items, users ``` !!! info Die erste Version ist ein „relativer Import“: ```Python from .routers import items, users ``` Die zweite Version ist ein „absoluter Import“: ```Python from app.routers import items, users ``` Um mehr über Python-Packages und -Module zu erfahren, lesen Sie die offizielle Python-Dokumentation über Module. ### Namenskollisionen vermeiden Wir importieren das Submodul `items` direkt, anstatt nur seine Variable `router` zu importieren. Das liegt daran, dass wir im Submodul `users` auch eine weitere Variable namens `router` haben. Wenn wir eine nach der anderen importiert hätten, etwa: ```Python from .routers.items import router from .routers.users import router ``` würde der `router` von `users` den von `items` überschreiben und wir könnten sie nicht gleichzeitig verwenden. Um also beide in derselben Datei verwenden zu können, importieren wir die Submodule direkt: ```Python hl_lines="5" title="app/main.py" {!../../../docs_src/bigger_applications/app/main.py!} ``` ### Die `APIRouter` für `users` und `items` inkludieren Inkludieren wir nun die `router` aus diesen Submodulen `users` und `items`: ```Python hl_lines="10-11" title="app/main.py" {!../../../docs_src/bigger_applications/app/main.py!} ``` !!! info `users.router` enthält den `APIRouter` in der Datei `app/routers/users.py`. Und `items.router` enthält den `APIRouter` in der Datei `app/routers/items.py`. Mit `app.include_router()` können wir jeden `APIRouter` zur Hauptanwendung `FastAPI` hinzufügen. Es wird alle Routen von diesem Router als Teil von dieser inkludieren. !!! note "Technische Details" Tatsächlich wird intern eine *Pfadoperation* für jede *Pfadoperation* erstellt, die im `APIRouter` deklariert wurde. Hinter den Kulissen wird es also tatsächlich so funktionieren, als ob alles dieselbe einzige Anwendung wäre. !!! check Bei der Einbindung von Routern müssen Sie sich keine Gedanken über die Performanz machen. Dies dauert Mikrosekunden und geschieht nur beim Start. Es hat also keinen Einfluss auf die Leistung. ⚡ ### Einen `APIRouter` mit benutzerdefinierten `prefix`, `tags`, `responses` und `dependencies` einfügen Stellen wir uns nun vor, dass Ihre Organisation Ihnen die Datei `app/internal/admin.py` gegeben hat. Sie enthält einen `APIRouter` mit einigen administrativen *Pfadoperationen*, die Ihre Organisation zwischen mehreren Projekten teilt. In diesem Beispiel wird es ganz einfach sein. Nehmen wir jedoch an, dass wir, da sie mit anderen Projekten in der Organisation geteilt wird, sie nicht ändern und kein `prefix`, `dependencies`, `tags`, usw. direkt zum `APIRouter` hinzufügen können: ```Python hl_lines="3" title="app/internal/admin.py" {!../../../docs_src/bigger_applications/app/internal/admin.py!} ``` Aber wir möchten immer noch ein benutzerdefiniertes `prefix` festlegen, wenn wir den `APIRouter` einbinden, sodass alle seine *Pfadoperationen* mit `/admin` beginnen, wir möchten es mit den `dependencies` sichern, die wir bereits für dieses Projekt haben, und wir möchten `tags` und `responses` hinzufügen. Wir können das alles deklarieren, ohne den ursprünglichen `APIRouter` ändern zu müssen, indem wir diese Parameter an `app.include_router()` übergeben: ```Python hl_lines="14-17" title="app/main.py" {!../../../docs_src/bigger_applications/app/main.py!} ``` Auf diese Weise bleibt der ursprüngliche `APIRouter` unverändert, sodass wir dieselbe `app/internal/admin.py`-Datei weiterhin mit anderen Projekten in der Organisation teilen können. Das Ergebnis ist, dass in unserer Anwendung jede der *Pfadoperationen* aus dem Modul `admin` Folgendes haben wird: * Das Präfix `/admin`. * Den Tag `admin`. * Die Abhängigkeit `get_token_header`. * Die Response `418`. 🍵 Dies wirkt sich jedoch nur auf diesen `APIRouter` in unserer Anwendung aus, nicht auf anderen Code, der ihn verwendet. So könnten beispielsweise andere Projekte denselben `APIRouter` mit einer anderen Authentifizierungsmethode verwenden. ### Eine *Pfadoperation* hinzufügen Wir können *Pfadoperationen* auch direkt zur `FastAPI`-App hinzufügen. Hier machen wir es ... nur um zu zeigen, dass wir es können 🤷: ```Python hl_lines="21-23" title="app/main.py" {!../../../docs_src/bigger_applications/app/main.py!} ``` und es wird korrekt funktionieren, zusammen mit allen anderen *Pfadoperationen*, die mit `app.include_router()` hinzugefügt wurden. !!! info "Sehr technische Details" **Hinweis**: Dies ist ein sehr technisches Detail, das Sie wahrscheinlich **einfach überspringen** können. --- Die `APIRouter` sind nicht „gemountet“, sie sind nicht vom Rest der Anwendung isoliert. Das liegt daran, dass wir deren *Pfadoperationen* in das OpenAPI-Schema und die Benutzeroberflächen einbinden möchten. Da wir sie nicht einfach isolieren und unabhängig vom Rest „mounten“ können, werden die *Pfadoperationen* „geklont“ (neu erstellt) und nicht direkt einbezogen. ## Es in der automatischen API-Dokumentation ansehen Führen Sie nun `uvicorn` aus, indem Sie das Modul `app.main` und die Variable `app` verwenden:
```console $ uvicorn app.main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
und öffnen Sie die Dokumentation unter http://127.0.0.1:8000/docs. Sie sehen die automatische API-Dokumentation, einschließlich der Pfade aller Submodule, mit den richtigen Pfaden (und Präfixen) und den richtigen Tags: ## Den gleichen Router mehrmals mit unterschiedlichem `prefix` inkludieren Sie können `.include_router()` auch mehrmals mit *demselben* Router und unterschiedlichen Präfixen verwenden. Dies könnte beispielsweise nützlich sein, um dieselbe API unter verschiedenen Präfixen verfügbar zu machen, z. B. `/api/v1` und `/api/latest`. Dies ist eine fortgeschrittene Verwendung, die Sie möglicherweise nicht wirklich benötigen, aber für den Fall, dass Sie sie benötigen, ist sie vorhanden. ## Einen `APIRouter` in einen anderen einfügen Auf die gleiche Weise, wie Sie einen `APIRouter` in eine `FastAPI`-Anwendung einbinden können, können Sie einen `APIRouter` in einen anderen `APIRouter` einbinden, indem Sie Folgendes verwenden: ```Python router.include_router(other_router) ``` Stellen Sie sicher, dass Sie dies tun, bevor Sie `router` in die `FastAPI`-App einbinden, damit auch die *Pfadoperationen* von `other_router` inkludiert werden. fastapi-0.110.3/docs/de/docs/tutorial/body-fields.md000066400000000000000000000076751461403617600221700ustar00rootroot00000000000000# Body – Felder So wie Sie zusätzliche Validation und Metadaten in Parametern der **Pfadoperation-Funktion** mittels `Query`, `Path` und `Body` deklarieren, können Sie auch innerhalb von Pydantic-Modellen zusätzliche Validation und Metadaten deklarieren, mittels Pydantics `Field`. ## `Field` importieren Importieren Sie es zuerst: === "Python 3.10+" ```Python hl_lines="4" {!> ../../../docs_src/body_fields/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="4" {!> ../../../docs_src/body_fields/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="4" {!> ../../../docs_src/body_fields/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="2" {!> ../../../docs_src/body_fields/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="4" {!> ../../../docs_src/body_fields/tutorial001.py!} ``` !!! warning "Achtung" Beachten Sie, dass `Field` direkt von `pydantic` importiert wird, nicht von `fastapi`, wie die anderen (`Query`, `Path`, `Body`, usw.) ## Modellattribute deklarieren Dann können Sie `Field` mit Modellattributen deklarieren: === "Python 3.10+" ```Python hl_lines="11-14" {!> ../../../docs_src/body_fields/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="11-14" {!> ../../../docs_src/body_fields/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="12-15" {!> ../../../docs_src/body_fields/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9-12" {!> ../../../docs_src/body_fields/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="11-14" {!> ../../../docs_src/body_fields/tutorial001.py!} ``` `Field` funktioniert genauso wie `Query`, `Path` und `Body`, es hat die gleichen Parameter, usw. !!! note "Technische Details" Tatsächlich erstellen `Query`, `Path` und andere, die sie kennenlernen werden, Instanzen von Unterklassen einer allgemeinen Klasse `Param`, die ihrerseits eine Unterklasse von Pydantics `FieldInfo`-Klasse ist. Und Pydantics `Field` gibt ebenfalls eine Instanz von `FieldInfo` zurück. `Body` gibt auch Instanzen einer Unterklasse von `FieldInfo` zurück. Und später werden Sie andere sehen, die Unterklassen der `Body`-Klasse sind. Denken Sie daran, dass `Query`, `Path` und andere von `fastapi` tatsächlich Funktionen sind, die spezielle Klassen zurückgeben. !!! tip "Tipp" Beachten Sie, dass jedes Modellattribut mit einem Typ, Defaultwert und `Field` die gleiche Struktur hat wie ein Parameter einer Pfadoperation-Funktion, nur mit `Field` statt `Path`, `Query`, `Body`. ## Zusätzliche Information hinzufügen Sie können zusätzliche Information in `Field`, `Query`, `Body`, usw. deklarieren. Und es wird im generierten JSON-Schema untergebracht. Sie werden später mehr darüber lernen, wie man zusätzliche Information unterbringt, wenn Sie lernen, Beispiele zu deklarieren. !!! warning "Achtung" Extra-Schlüssel, die `Field` überreicht werden, werden auch im resultierenden OpenAPI-Schema Ihrer Anwendung gelistet. Da diese Schlüssel nicht notwendigerweise Teil der OpenAPI-Spezifikation sind, könnten einige OpenAPI-Tools, wie etwa [der OpenAPI-Validator](https://validator.swagger.io/), nicht mit Ihrem generierten Schema funktionieren. ## Zusammenfassung Sie können Pydantics `Field` verwenden, um zusätzliche Validierungen und Metadaten für Modellattribute zu deklarieren. Sie können auch Extra-Schlüssel verwenden, um zusätzliche JSON-Schema-Metadaten zu überreichen. fastapi-0.110.3/docs/de/docs/tutorial/body-multiple-params.md000066400000000000000000000205441461403617600240240ustar00rootroot00000000000000# Body – Mehrere Parameter Jetzt, da wir gesehen haben, wie `Path` und `Query` verwendet werden, schauen wir uns fortgeschrittenere Verwendungsmöglichkeiten von Requestbody-Deklarationen an. ## `Path`-, `Query`- und Body-Parameter vermischen Zuerst einmal, Sie können `Path`-, `Query`- und Requestbody-Parameter-Deklarationen frei mischen und **FastAPI** wird wissen, was zu tun ist. Und Sie können auch Body-Parameter als optional kennzeichnen, indem Sie den Defaultwert auf `None` setzen: === "Python 3.10+" ```Python hl_lines="18-20" {!> ../../../docs_src/body_multiple_params/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="18-20" {!> ../../../docs_src/body_multiple_params/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="19-21" {!> ../../../docs_src/body_multiple_params/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="17-19" {!> ../../../docs_src/body_multiple_params/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="19-21" {!> ../../../docs_src/body_multiple_params/tutorial001.py!} ``` !!! note "Hinweis" Beachten Sie, dass in diesem Fall das `item`, welches vom Body genommen wird, optional ist. Da es `None` als Defaultwert hat. ## Mehrere Body-Parameter Im vorherigen Beispiel erwartete die *Pfadoperation* einen JSON-Body mit den Attributen eines `Item`s, etwa: ```JSON { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2 } ``` Aber Sie können auch mehrere Body-Parameter deklarieren, z. B. `item` und `user`: === "Python 3.10+" ```Python hl_lines="20" {!> ../../../docs_src/body_multiple_params/tutorial002_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="22" {!> ../../../docs_src/body_multiple_params/tutorial002.py!} ``` In diesem Fall wird **FastAPI** bemerken, dass es mehr als einen Body-Parameter in der Funktion gibt (zwei Parameter, die Pydantic-Modelle sind). Es wird deshalb die Parameternamen als Schlüssel (Feldnamen) im Body verwenden, und erwartet einen Body wie folgt: ```JSON { "item": { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2 }, "user": { "username": "dave", "full_name": "Dave Grohl" } } ``` !!! note "Hinweis" Beachten Sie, dass, obwohl `item` wie zuvor deklariert wurde, es nun unter einem Schlüssel `item` im Body erwartet wird. **FastAPI** wird die automatische Konvertierung des Requests übernehmen, sodass der Parameter `item` seinen spezifischen Inhalt bekommt, genau so wie der Parameter `user`. Es wird die Validierung dieser zusammengesetzten Daten übernehmen, und sie im OpenAPI-Schema und der automatischen Dokumentation dokumentieren. ## Einzelne Werte im Body So wie `Query` und `Path` für Query- und Pfad-Parameter, hat **FastAPI** auch das Äquivalent `Body`, um Extra-Daten für Body-Parameter zu definieren. Zum Beispiel, das vorherige Modell erweiternd, könnten Sie entscheiden, dass Sie einen weiteren Schlüssel `importance` haben möchten, im selben Body, Seite an Seite mit `item` und `user`. Wenn Sie diesen Parameter einfach so hinzufügen, wird **FastAPI** annehmen, dass es ein Query-Parameter ist. Aber Sie können **FastAPI** instruieren, ihn als weiteren Body-Schlüssel zu erkennen, indem Sie `Body` verwenden: === "Python 3.10+" ```Python hl_lines="23" {!> ../../../docs_src/body_multiple_params/tutorial003_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="23" {!> ../../../docs_src/body_multiple_params/tutorial003_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="24" {!> ../../../docs_src/body_multiple_params/tutorial003_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="20" {!> ../../../docs_src/body_multiple_params/tutorial003_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="22" {!> ../../../docs_src/body_multiple_params/tutorial003.py!} ``` In diesem Fall erwartet **FastAPI** einen Body wie: ```JSON { "item": { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2 }, "user": { "username": "dave", "full_name": "Dave Grohl" }, "importance": 5 } ``` Wiederum wird es die Daten konvertieren, validieren, dokumentieren, usw. ## Mehrere Body-Parameter und Query-Parameter Natürlich können Sie auch, wann immer Sie das brauchen, weitere Query-Parameter hinzufügen, zusätzlich zu den Body-Parametern. Da einfache Werte standardmäßig als Query-Parameter interpretiert werden, müssen Sie `Query` nicht explizit hinzufügen, Sie können einfach schreiben: ```Python q: Union[str, None] = None ``` Oder in Python 3.10 und darüber: ```Python q: str | None = None ``` Zum Beispiel: === "Python 3.10+" ```Python hl_lines="27" {!> ../../../docs_src/body_multiple_params/tutorial004_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="27" {!> ../../../docs_src/body_multiple_params/tutorial004_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="28" {!> ../../../docs_src/body_multiple_params/tutorial004_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="25" {!> ../../../docs_src/body_multiple_params/tutorial004_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="27" {!> ../../../docs_src/body_multiple_params/tutorial004.py!} ``` !!! info `Body` hat die gleichen zusätzlichen Validierungs- und Metadaten-Parameter wie `Query` und `Path` und andere, die Sie später kennenlernen. ## Einen einzelnen Body-Parameter einbetten Nehmen wir an, Sie haben nur einen einzelnen `item`-Body-Parameter, ein Pydantic-Modell `Item`. Normalerweise wird **FastAPI** dann seinen JSON-Body direkt erwarten. Aber wenn Sie möchten, dass es einen JSON-Body erwartet, mit einem Schlüssel `item` und darin den Inhalt des Modells, so wie es das tut, wenn Sie mehrere Body-Parameter deklarieren, dann können Sie den speziellen `Body`-Parameter `embed` setzen: ```Python item: Item = Body(embed=True) ``` so wie in: === "Python 3.10+" ```Python hl_lines="17" {!> ../../../docs_src/body_multiple_params/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="17" {!> ../../../docs_src/body_multiple_params/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="18" {!> ../../../docs_src/body_multiple_params/tutorial005_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="15" {!> ../../../docs_src/body_multiple_params/tutorial005_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="17" {!> ../../../docs_src/body_multiple_params/tutorial005.py!} ``` In diesem Fall erwartet **FastAPI** einen Body wie: ```JSON hl_lines="2" { "item": { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2 } } ``` statt: ```JSON { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2 } ``` ## Zusammenfassung Sie können mehrere Body-Parameter zu ihrer *Pfadoperation-Funktion* hinzufügen, obwohl ein Request nur einen einzigen Body enthalten kann. **FastAPI** wird sich darum kümmern, Ihnen korrekte Daten in Ihrer Funktion zu überreichen, und das korrekte Schema in der *Pfadoperation* zu validieren und zu dokumentieren. Sie können auch einzelne Werte deklarieren, die als Teil des Bodys empfangen werden. Und Sie können **FastAPI** instruieren, den Body in einem Schlüssel unterzubringen, selbst wenn nur ein einzelner Body-Parameter deklariert ist. fastapi-0.110.3/docs/de/docs/tutorial/body-nested-models.md000066400000000000000000000245671461403617600234640ustar00rootroot00000000000000# Body – Verschachtelte Modelle Mit **FastAPI** können Sie (dank Pydantic) beliebig tief verschachtelte Modelle definieren, validieren und dokumentieren. ## Listen als Felder Sie können ein Attribut als Kindtyp definieren, zum Beispiel eine Python-`list`e. === "Python 3.10+" ```Python hl_lines="12" {!> ../../../docs_src/body_nested_models/tutorial001_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="14" {!> ../../../docs_src/body_nested_models/tutorial001.py!} ``` Das bewirkt, dass `tags` eine Liste ist, wenngleich es nichts über den Typ der Elemente der Liste aussagt. ## Listen mit Typ-Parametern als Felder Aber Python erlaubt es, Listen mit inneren Typen, auch „Typ-Parameter“ genannt, zu deklarieren. ### `List` von `typing` importieren In Python 3.9 oder darüber können Sie einfach `list` verwenden, um diese Typannotationen zu deklarieren, wie wir unten sehen werden. 💡 In Python-Versionen vor 3.9 (3.6 und darüber), müssen Sie zuerst `List` von Pythons Standardmodul `typing` importieren. ```Python hl_lines="1" {!> ../../../docs_src/body_nested_models/tutorial002.py!} ``` ### Eine `list`e mit einem Typ-Parameter deklarieren Um Typen wie `list`, `dict`, `tuple` mit inneren Typ-Parametern (inneren Typen) zu deklarieren: * Wenn Sie eine Python-Version kleiner als 3.9 verwenden, importieren Sie das Äquivalent zum entsprechenden Typ vom `typing`-Modul * Überreichen Sie den/die inneren Typ(en) von eckigen Klammern umschlossen, `[` und `]`, als „Typ-Parameter“ In Python 3.9 wäre das: ```Python my_list: list[str] ``` Und in Python-Versionen vor 3.9: ```Python from typing import List my_list: List[str] ``` Das ist alles Standard-Python-Syntax für Typdeklarationen. Verwenden Sie dieselbe Standardsyntax für Modellattribute mit inneren Typen. In unserem Beispiel können wir also bewirken, dass `tags` spezifisch eine „Liste von Strings“ ist: === "Python 3.10+" ```Python hl_lines="12" {!> ../../../docs_src/body_nested_models/tutorial002_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="14" {!> ../../../docs_src/body_nested_models/tutorial002_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="14" {!> ../../../docs_src/body_nested_models/tutorial002.py!} ``` ## Set-Typen Aber dann denken wir darüber nach und stellen fest, dass sich die Tags nicht wiederholen sollen, es sollen eindeutige Strings sein. Python hat einen Datentyp speziell für Mengen eindeutiger Dinge: das `set`. Deklarieren wir also `tags` als Set von Strings. === "Python 3.10+" ```Python hl_lines="12" {!> ../../../docs_src/body_nested_models/tutorial003_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="14" {!> ../../../docs_src/body_nested_models/tutorial003_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1 14" {!> ../../../docs_src/body_nested_models/tutorial003.py!} ``` Jetzt, selbst wenn Sie einen Request mit duplizierten Daten erhalten, werden diese zu einem Set eindeutiger Dinge konvertiert. Und wann immer Sie diese Daten ausgeben, selbst wenn die Quelle Duplikate hatte, wird es als Set von eindeutigen Dingen ausgegeben. Und es wird entsprechend annotiert/dokumentiert. ## Verschachtelte Modelle Jedes Attribut eines Pydantic-Modells hat einen Typ. Aber dieser Typ kann selbst ein anderes Pydantic-Modell sein. Sie können also tief verschachtelte JSON-„Objekte“ deklarieren, mit spezifischen Attributnamen, -typen, und -validierungen. Alles das beliebig tief verschachtelt. ### Ein Kindmodell definieren Wir können zum Beispiel ein `Image`-Modell definieren. === "Python 3.10+" ```Python hl_lines="7-9" {!> ../../../docs_src/body_nested_models/tutorial004_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="9-11" {!> ../../../docs_src/body_nested_models/tutorial004_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="9-11" {!> ../../../docs_src/body_nested_models/tutorial004.py!} ``` ### Das Kindmodell als Typ verwenden Und dann können wir es als Typ eines Attributes verwenden. === "Python 3.10+" ```Python hl_lines="18" {!> ../../../docs_src/body_nested_models/tutorial004_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="20" {!> ../../../docs_src/body_nested_models/tutorial004_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="20" {!> ../../../docs_src/body_nested_models/tutorial004.py!} ``` Das würde bedeuten, dass **FastAPI** einen Body erwartet wie: ```JSON { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2, "tags": ["rock", "metal", "bar"], "image": { "url": "http://example.com/baz.jpg", "name": "The Foo live" } } ``` Wiederum, nur mit dieser Deklaration erhalten Sie von **FastAPI**: * Editor-Unterstützung (Codevervollständigung, usw.), selbst für verschachtelte Modelle * Datenkonvertierung * Datenvalidierung * Automatische Dokumentation ## Spezielle Typen und Validierungen Abgesehen von normalen einfachen Typen, wie `str`, `int`, `float`, usw. können Sie komplexere einfache Typen verwenden, die von `str` erben. Um alle Optionen kennenzulernen, die Sie haben, schauen Sie sich Pydantics Typübersicht an. Sie werden im nächsten Kapitel ein paar Beispiele kennenlernen. Da wir zum Beispiel im `Image`-Modell ein Feld `url` haben, können wir deklarieren, dass das eine Instanz von Pydantics `HttpUrl` sein soll, anstelle eines `str`: === "Python 3.10+" ```Python hl_lines="2 8" {!> ../../../docs_src/body_nested_models/tutorial005_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="4 10" {!> ../../../docs_src/body_nested_models/tutorial005_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="4 10" {!> ../../../docs_src/body_nested_models/tutorial005.py!} ``` Es wird getestet, ob der String eine gültige URL ist, und als solche wird er in JSON Schema / OpenAPI dokumentiert. ## Attribute mit Listen von Kindmodellen Sie können Pydantic-Modelle auch als Typen innerhalb von `list`, `set`, usw. verwenden: === "Python 3.10+" ```Python hl_lines="18" {!> ../../../docs_src/body_nested_models/tutorial006_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="20" {!> ../../../docs_src/body_nested_models/tutorial006_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="20" {!> ../../../docs_src/body_nested_models/tutorial006.py!} ``` Das wird einen JSON-Body erwarten (konvertieren, validieren, dokumentieren), wie: ```JSON hl_lines="11" { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2, "tags": [ "rock", "metal", "bar" ], "images": [ { "url": "http://example.com/baz.jpg", "name": "The Foo live" }, { "url": "http://example.com/dave.jpg", "name": "The Baz" } ] } ``` !!! info Beachten Sie, dass der `images`-Schlüssel jetzt eine Liste von Bild-Objekten hat. ## Tief verschachtelte Modelle Sie können beliebig tief verschachtelte Modelle definieren: === "Python 3.10+" ```Python hl_lines="7 12 18 21 25" {!> ../../../docs_src/body_nested_models/tutorial007_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="9 14 20 23 27" {!> ../../../docs_src/body_nested_models/tutorial007_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="9 14 20 23 27" {!> ../../../docs_src/body_nested_models/tutorial007.py!} ``` !!! info Beachten Sie, wie `Offer` eine Liste von `Item`s hat, von denen jedes seinerseits eine optionale Liste von `Image`s hat. ## Bodys aus reinen Listen Wenn Sie möchten, dass das äußerste Element des JSON-Bodys ein JSON-`array` (eine Python-`list`e) ist, können Sie den Typ im Funktionsparameter deklarieren, mit der gleichen Syntax wie in Pydantic-Modellen: ```Python images: List[Image] ``` oder in Python 3.9 und darüber: ```Python images: list[Image] ``` so wie in: === "Python 3.9+" ```Python hl_lines="13" {!> ../../../docs_src/body_nested_models/tutorial008_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="15" {!> ../../../docs_src/body_nested_models/tutorial008.py!} ``` ## Editor-Unterstützung überall Und Sie erhalten Editor-Unterstützung überall. Selbst für Dinge in Listen: Sie würden diese Editor-Unterstützung nicht erhalten, wenn Sie direkt mit `dict`, statt mit Pydantic-Modellen arbeiten würden. Aber Sie müssen sich auch nicht weiter um die Modelle kümmern, hereinkommende Dicts werden automatisch in sie konvertiert. Und was Sie zurückgeben, wird automatisch nach JSON konvertiert. ## Bodys mit beliebigen `dict`s Sie können einen Body auch als `dict` deklarieren, mit Schlüsseln eines Typs und Werten eines anderen Typs. So brauchen Sie vorher nicht zu wissen, wie die Feld-/Attribut-Namen lauten (wie es bei Pydantic-Modellen der Fall wäre). Das ist nützlich, wenn Sie Schlüssel empfangen, deren Namen Sie nicht bereits kennen. --- Ein anderer nützlicher Anwendungsfall ist, wenn Sie Schlüssel eines anderen Typs haben wollen, z. B. `int`. Das schauen wir uns mal an. Im folgenden Beispiel akzeptieren Sie irgendein `dict`, solange es `int`-Schlüssel und `float`-Werte hat. === "Python 3.9+" ```Python hl_lines="7" {!> ../../../docs_src/body_nested_models/tutorial009_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="9" {!> ../../../docs_src/body_nested_models/tutorial009.py!} ``` !!! tip "Tipp" Bedenken Sie, dass JSON nur `str` als Schlüssel unterstützt. Aber Pydantic hat automatische Datenkonvertierung. Das bedeutet, dass Ihre API-Clients nur Strings senden können, aber solange diese Strings nur Zahlen enthalten, wird Pydantic sie konvertieren und validieren. Und das `dict` welches Sie als `weights` erhalten, wird `int`-Schlüssel und `float`-Werte haben. ## Zusammenfassung Mit **FastAPI** haben Sie die maximale Flexibilität von Pydantic-Modellen, während Ihr Code einfach, kurz und elegant bleibt. Aber mit all den Vorzügen: * Editor-Unterstützung (Codevervollständigung überall) * Datenkonvertierung (auch bekannt als Parsen, Serialisierung) * Datenvalidierung * Schema-Dokumentation * Automatische Dokumentation fastapi-0.110.3/docs/de/docs/tutorial/body-updates.md000066400000000000000000000147661461403617600223660ustar00rootroot00000000000000# Body – Aktualisierungen ## Ersetzendes Aktualisieren mit `PUT` Um einen Artikel zu aktualisieren, können Sie die HTTP `PUT` Operation verwenden. Sie können den `jsonable_encoder` verwenden, um die empfangenen Daten in etwas zu konvertieren, das als JSON gespeichert werden kann (in z. B. einer NoSQL-Datenbank). Zum Beispiel, um ein `datetime` in einen `str` zu konvertieren. === "Python 3.10+" ```Python hl_lines="28-33" {!> ../../../docs_src/body_updates/tutorial001_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="30-35" {!> ../../../docs_src/body_updates/tutorial001_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="30-35" {!> ../../../docs_src/body_updates/tutorial001.py!} ``` `PUT` wird verwendet, um Daten zu empfangen, die die existierenden Daten ersetzen sollen. ### Warnung bezüglich des Ersetzens Das bedeutet, dass, wenn Sie den Artikel `bar` aktualisieren wollen, mittels `PUT` und folgendem Body: ```Python { "name": "Barz", "price": 3, "description": None, } ``` das Eingabemodell nun den Defaultwert `"tax": 10.5` hat, weil Sie das bereits gespeicherte Attribut `"tax": 20.2` nicht mit übergeben haben. Die Daten werden darum mit einem „neuen“ `tax`-Wert von `10.5` abgespeichert. ## Teilweises Ersetzen mit `PATCH` Sie können auch die HTTP `PATCH` Operation verwenden, um Daten *teilweise* zu ersetzen. Das bedeutet, sie senden nur die Daten, die Sie aktualisieren wollen, der Rest bleibt unverändert. !!! note "Hinweis" `PATCH` wird seltener verwendet und ist weniger bekannt als `PUT`. Und viele Teams verwenden ausschließlich `PUT`, selbst für nur Teil-Aktualisierungen. Es steht Ihnen **frei**, das zu verwenden, was Sie möchten, **FastAPI** legt Ihnen keine Einschränkungen auf. Aber dieser Leitfaden zeigt Ihnen mehr oder weniger, wie die beiden normalerweise verwendet werden. ### Pydantics `exclude_unset`-Parameter verwenden Wenn Sie Teil-Aktualisierungen entgegennehmen, ist der `exclude_unset`-Parameter in der `.model_dump()`-Methode von Pydantic-Modellen sehr nützlich. Wie in `item.model_dump(exclude_unset=True)`. !!! info In Pydantic v1 hieß diese Methode `.dict()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstützt) und in `.model_dump()` umbenannt. Die Beispiele hier verwenden `.dict()` für die Kompatibilität mit Pydantic v1, Sie sollten jedoch stattdessen `.model_dump()` verwenden, wenn Sie Pydantic v2 verwenden können. Das wird ein `dict` erstellen, mit nur den Daten, die gesetzt wurden als das `item`-Modell erstellt wurde, Defaultwerte ausgeschlossen. Sie können das verwenden, um ein `dict` zu erstellen, das nur die (im Request) gesendeten Daten enthält, ohne Defaultwerte: === "Python 3.10+" ```Python hl_lines="32" {!> ../../../docs_src/body_updates/tutorial002_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="34" {!> ../../../docs_src/body_updates/tutorial002_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="34" {!> ../../../docs_src/body_updates/tutorial002.py!} ``` ### Pydantics `update`-Parameter verwenden Jetzt können Sie eine Kopie des existierenden Modells mittels `.model_copy()` erstellen, wobei Sie dem `update`-Parameter ein `dict` mit den zu ändernden Daten übergeben. !!! info In Pydantic v1 hieß diese Methode `.copy()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstützt) und in `.model_copy()` umbenannt. Die Beispiele hier verwenden `.copy()` für die Kompatibilität mit Pydantic v1, Sie sollten jedoch stattdessen `.model_copy()` verwenden, wenn Sie Pydantic v2 verwenden können. Wie in `stored_item_model.model_copy(update=update_data)`: === "Python 3.10+" ```Python hl_lines="33" {!> ../../../docs_src/body_updates/tutorial002_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="35" {!> ../../../docs_src/body_updates/tutorial002_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="35" {!> ../../../docs_src/body_updates/tutorial002.py!} ``` ### Rekapitulation zum teilweisen Ersetzen Zusammengefasst, um Teil-Ersetzungen vorzunehmen: * (Optional) verwenden Sie `PATCH` statt `PUT`. * Lesen Sie die bereits gespeicherten Daten aus. * Fügen Sie diese in ein Pydantic-Modell ein. * Erzeugen Sie aus dem empfangenen Modell ein `dict` ohne Defaultwerte (mittels `exclude_unset`). * So ersetzen Sie nur die tatsächlich vom Benutzer gesetzten Werte, statt dass bereits gespeicherte Werte mit Defaultwerten des Modells überschrieben werden. * Erzeugen Sie eine Kopie ihres gespeicherten Modells, wobei Sie die Attribute mit den empfangenen Teil-Ersetzungen aktualisieren (mittels des `update`-Parameters). * Konvertieren Sie das kopierte Modell zu etwas, das in ihrer Datenbank gespeichert werden kann (indem Sie beispielsweise `jsonable_encoder` verwenden). * Das ist vergleichbar dazu, die `.model_dump()`-Methode des Modells erneut aufzurufen, aber es wird sicherstellen, dass die Werte zu Daten konvertiert werden, die ihrerseits zu JSON konvertiert werden können, zum Beispiel `datetime` zu `str`. * Speichern Sie die Daten in Ihrer Datenbank. * Geben Sie das aktualisierte Modell zurück. === "Python 3.10+" ```Python hl_lines="28-35" {!> ../../../docs_src/body_updates/tutorial002_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="30-37" {!> ../../../docs_src/body_updates/tutorial002_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="30-37" {!> ../../../docs_src/body_updates/tutorial002.py!} ``` !!! tip "Tipp" Sie können tatsächlich die gleiche Technik mit einer HTTP `PUT` Operation verwenden. Aber dieses Beispiel verwendet `PATCH`, da dieses für solche Anwendungsfälle geschaffen wurde. !!! note "Hinweis" Beachten Sie, dass das hereinkommende Modell immer noch validiert wird. Wenn Sie also Teil-Aktualisierungen empfangen wollen, die alle Attribute auslassen können, müssen Sie ein Modell haben, dessen Attribute alle als optional gekennzeichnet sind (mit Defaultwerten oder `None`). Um zu unterscheiden zwischen Modellen für **Aktualisierungen**, mit lauter optionalen Werten, und solchen für die **Erzeugung**, mit benötigten Werten, können Sie die Techniken verwenden, die in [Extramodelle](extra-models.md){.internal-link target=_blank} beschrieben wurden. fastapi-0.110.3/docs/de/docs/tutorial/body.md000066400000000000000000000201211461403617600207010ustar00rootroot00000000000000# Requestbody Wenn Sie Daten von einem Client (sagen wir, einem Browser) zu Ihrer API senden, dann senden Sie diese als einen **Requestbody** (Deutsch: Anfragekörper). Ein **Request**body sind Daten, die vom Client zu Ihrer API gesendet werden. Ein **Response**body (Deutsch: Antwortkörper) sind Daten, die Ihre API zum Client sendet. Ihre API sendet fast immer einen **Response**body. Aber Clients senden nicht unbedingt immer **Request**bodys (sondern nur Metadaten). Um einen **Request**body zu deklarieren, verwenden Sie Pydantic-Modelle mit allen deren Fähigkeiten und Vorzügen. !!! info Um Daten zu versenden, sollten Sie eines von: `POST` (meistverwendet), `PUT`, `DELETE` oder `PATCH` verwenden. Senden Sie einen Body mit einem `GET`-Request, dann führt das laut Spezifikation zu undefiniertem Verhalten. Trotzdem wird es von FastAPI unterstützt, für sehr komplexe/extreme Anwendungsfälle. Da aber davon abgeraten wird, zeigt die interaktive Dokumentation mit Swagger-Benutzeroberfläche die Dokumentation für den Body auch nicht an, wenn `GET` verwendet wird. Dazwischengeschaltete Proxys unterstützen es möglicherweise auch nicht. ## Importieren Sie Pydantics `BaseModel` Zuerst müssen Sie `BaseModel` von `pydantic` importieren: === "Python 3.10+" ```Python hl_lines="2" {!> ../../../docs_src/body/tutorial001_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="4" {!> ../../../docs_src/body/tutorial001.py!} ``` ## Erstellen Sie Ihr Datenmodell Dann deklarieren Sie Ihr Datenmodell als eine Klasse, die von `BaseModel` erbt. Verwenden Sie Standard-Python-Typen für die Klassenattribute: === "Python 3.10+" ```Python hl_lines="5-9" {!> ../../../docs_src/body/tutorial001_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="7-11" {!> ../../../docs_src/body/tutorial001.py!} ``` Wie auch bei Query-Parametern gilt, wenn ein Modellattribut einen Defaultwert hat, ist das Attribut nicht erforderlich. Ansonsten ist es erforderlich. Verwenden Sie `None`, um es als optional zu kennzeichnen. Zum Beispiel deklariert das obige Modell ein JSON "`object`" (oder Python-`dict`) wie dieses: ```JSON { "name": "Foo", "description": "An optional description", "price": 45.2, "tax": 3.5 } ``` Da `description` und `tax` optional sind (mit `None` als Defaultwert), wäre folgendes JSON "`object`" auch gültig: ```JSON { "name": "Foo", "price": 45.2 } ``` ## Deklarieren Sie es als Parameter Um es zu Ihrer *Pfadoperation* hinzuzufügen, deklarieren Sie es auf die gleiche Weise, wie Sie Pfad- und Query-Parameter deklariert haben: === "Python 3.10+" ```Python hl_lines="16" {!> ../../../docs_src/body/tutorial001_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="18" {!> ../../../docs_src/body/tutorial001.py!} ``` ... und deklarieren Sie seinen Typ als das Modell, welches Sie erstellt haben, `Item`. ## Resultate Mit nur dieser Python-Typdeklaration, wird **FastAPI**: * Den Requestbody als JSON lesen. * Die entsprechenden Typen konvertieren (falls nötig). * Diese Daten validieren. * Wenn die Daten ungültig sind, einen klar lesbaren Fehler zurückgeben, der anzeigt, wo und was die inkorrekten Daten waren. * Ihnen die erhaltenen Daten im Parameter `item` übergeben. * Da Sie diesen in der Funktion als vom Typ `Item` deklariert haben, erhalten Sie die ganze Editor-Unterstützung (Autovervollständigung, usw.) für alle Attribute und deren Typen. * Eine JSON Schema Definition für Ihr Modell generieren, welche Sie überall sonst verwenden können, wenn es für Ihr Projekt Sinn macht. * Diese Schemas werden Teil des generierten OpenAPI-Schemas und werden von den UIs der automatischen Dokumentation verwendet. ## Automatische Dokumentation Die JSON-Schemas Ihrer Modelle werden Teil ihrer OpenAPI-generierten Schemas und werden in der interaktiven API Dokumentation angezeigt: Und werden auch verwendet in der API-Dokumentation innerhalb jeder *Pfadoperation*, welche sie braucht: ## Editor Unterstützung In Ihrem Editor, innerhalb Ihrer Funktion, erhalten Sie Typhinweise und Code-Vervollständigung überall (was nicht der Fall wäre, wenn Sie ein `dict` anstelle eines Pydantic Modells erhalten hätten): Sie bekommen auch Fehler-Meldungen für inkorrekte Typoperationen: Das ist nicht zufällig so, das ganze Framework wurde um dieses Design herum aufgebaut. Und es wurde in der Designphase gründlich getestet, vor der Implementierung, um sicherzustellen, dass es mit jedem Editor funktioniert. Es gab sogar ein paar Änderungen an Pydantic selbst, um das zu unterstützen. Die vorherigen Screenshots zeigten Visual Studio Code. Aber Sie bekommen die gleiche Editor-Unterstützung in PyCharm und in den meisten anderen Python-Editoren: !!! tip "Tipp" Wenn Sie PyCharm als Ihren Editor verwenden, probieren Sie das Pydantic PyCharm Plugin aus. Es verbessert die Editor-Unterstützung für Pydantic-Modelle, mit: * Code-Vervollständigung * Typüberprüfungen * Refaktorisierung * Suchen * Inspektionen ## Das Modell verwenden Innerhalb der Funktion können Sie alle Attribute des Modells direkt verwenden: === "Python 3.10+" ```Python hl_lines="19" {!> ../../../docs_src/body/tutorial002_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="21" {!> ../../../docs_src/body/tutorial002.py!} ``` ## Requestbody- + Pfad-Parameter Sie können Pfad- und Requestbody-Parameter gleichzeitig deklarieren. **FastAPI** erkennt, dass Funktionsparameter, die mit Pfad-Parametern übereinstimmen, **vom Pfad genommen** werden sollen, und dass Funktionsparameter, welche Pydantic-Modelle sind, **vom Requestbody genommen** werden sollen. === "Python 3.10+" ```Python hl_lines="15-16" {!> ../../../docs_src/body/tutorial003_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="17-18" {!> ../../../docs_src/body/tutorial003.py!} ``` ## Requestbody- + Pfad- + Query-Parameter Sie können auch zur gleichen Zeit **Body-**, **Pfad-** und **Query-Parameter** deklarieren. **FastAPI** wird jeden Parameter korrekt erkennen und die Daten vom richtigen Ort holen. === "Python 3.10+" ```Python hl_lines="16" {!> ../../../docs_src/body/tutorial004_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="18" {!> ../../../docs_src/body/tutorial004.py!} ``` Die Funktionsparameter werden wie folgt erkannt: * Wenn der Parameter auch im **Pfad** deklariert wurde, wird er als Pfad-Parameter interpretiert. * Wenn der Parameter ein **einfacher Typ** ist (wie `int`, `float`, `str`, `bool`, usw.), wird er als **Query**-Parameter interpretiert. * Wenn der Parameter vom Typ eines **Pydantic-Modells** ist, wird er als Request**body** interpretiert. !!! note "Hinweis" FastAPI weiß, dass der Wert von `q` nicht erforderlich ist, wegen des definierten Defaultwertes `= None` Das `Union` in `Union[str, None]` wird von FastAPI nicht verwendet, aber es erlaubt Ihrem Editor, Sie besser zu unterstützen und Fehler zu erkennen. ## Ohne Pydantic Wenn Sie keine Pydantic-Modelle verwenden wollen, können Sie auch **Body**-Parameter nehmen. Siehe die Dokumentation unter [Body – Mehrere Parameter: Einfache Werte im Body](body-multiple-params.md#einzelne-werte-im-body){.internal-link target=\_blank}. fastapi-0.110.3/docs/de/docs/tutorial/cookie-params.md000066400000000000000000000053521461403617600225070ustar00rootroot00000000000000# Cookie-Parameter So wie `Query`- und `Path`-Parameter können Sie auch Cookie-Parameter definieren. ## `Cookie` importieren Importieren Sie zuerst `Cookie`: === "Python 3.10+" ```Python hl_lines="3" {!> ../../../docs_src/cookie_params/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="3" {!> ../../../docs_src/cookie_params/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="3" {!> ../../../docs_src/cookie_params/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="1" {!> ../../../docs_src/cookie_params/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="3" {!> ../../../docs_src/cookie_params/tutorial001.py!} ``` ## `Cookie`-Parameter deklarieren Dann deklarieren Sie Ihre Cookie-Parameter, auf die gleiche Weise, wie Sie auch `Path`- und `Query`-Parameter deklarieren. Der erste Wert ist der Typ. Sie können `Cookie` die gehabten Extra Validierungs- und Beschreibungsparameter hinzufügen. Danach können Sie einen Defaultwert vergeben: === "Python 3.10+" ```Python hl_lines="9" {!> ../../../docs_src/cookie_params/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/cookie_params/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="10" {!> ../../../docs_src/cookie_params/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/cookie_params/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9" {!> ../../../docs_src/cookie_params/tutorial001.py!} ``` !!! note "Technische Details" `Cookie` ist eine Schwesterklasse von `Path` und `Query`. Sie erbt von derselben gemeinsamen `Param`-Elternklasse. Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `Cookie` und andere von `fastapi` importieren, diese tatsächlich Funktionen sind, welche spezielle Klassen zurückgeben. !!! info Um Cookies zu deklarieren, müssen Sie `Cookie` verwenden, da diese Parameter sonst als Query-Parameter interpretiert werden würden. ## Zusammenfassung Deklarieren Sie Cookies mittels `Cookie`, auf die gleiche Weise wie bei `Query` und `Path`. fastapi-0.110.3/docs/de/docs/tutorial/dependencies/000077500000000000000000000000001461403617600220545ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/tutorial/dependencies/classes-as-dependencies.md000066400000000000000000000304311461403617600270610ustar00rootroot00000000000000# Klassen als Abhängigkeiten Bevor wir tiefer in das **Dependency Injection** System eintauchen, lassen Sie uns das vorherige Beispiel verbessern. ## Ein `dict` aus dem vorherigen Beispiel Im vorherigen Beispiel haben wir ein `dict` von unserer Abhängigkeit („Dependable“) zurückgegeben: === "Python 3.10+" ```Python hl_lines="9" {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="11" {!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="12" {!> ../../../docs_src/dependencies/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/dependencies/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="11" {!> ../../../docs_src/dependencies/tutorial001.py!} ``` Aber dann haben wir ein `dict` im Parameter `commons` der *Pfadoperation-Funktion*. Und wir wissen, dass Editoren nicht viel Unterstützung (wie etwa Code-Vervollständigung) für `dict`s bieten können, weil sie ihre Schlüssel- und Werttypen nicht kennen. Das können wir besser machen ... ## Was macht eine Abhängigkeit aus Bisher haben Sie Abhängigkeiten gesehen, die als Funktionen deklariert wurden. Das ist jedoch nicht die einzige Möglichkeit, Abhängigkeiten zu deklarieren (obwohl es wahrscheinlich die gebräuchlichste ist). Der springende Punkt ist, dass eine Abhängigkeit aufrufbar („callable“) sein sollte. Ein „**Callable**“ in Python ist etwas, das wie eine Funktion aufgerufen werden kann („to call“). Wenn Sie also ein Objekt `something` haben (das möglicherweise _keine_ Funktion ist) und Sie es wie folgt aufrufen (ausführen) können: ```Python something() ``` oder ```Python something(some_argument, some_keyword_argument="foo") ``` dann ist das ein „Callable“ (ein „Aufrufbares“). ## Klassen als Abhängigkeiten Möglicherweise stellen Sie fest, dass Sie zum Erstellen einer Instanz einer Python-Klasse die gleiche Syntax verwenden. Zum Beispiel: ```Python class Cat: def __init__(self, name: str): self.name = name fluffy = Cat(name="Mr Fluffy") ``` In diesem Fall ist `fluffy` eine Instanz der Klasse `Cat`. Und um `fluffy` zu erzeugen, rufen Sie `Cat` auf. Eine Python-Klasse ist also auch ein **Callable**. Darum können Sie in **FastAPI** auch eine Python-Klasse als Abhängigkeit verwenden. Was FastAPI tatsächlich prüft, ist, ob es sich um ein „Callable“ (Funktion, Klasse oder irgendetwas anderes) handelt und ob die Parameter definiert sind. Wenn Sie **FastAPI** ein „Callable“ als Abhängigkeit übergeben, analysiert es die Parameter dieses „Callables“ und verarbeitet sie auf die gleiche Weise wie die Parameter einer *Pfadoperation-Funktion*. Einschließlich Unterabhängigkeiten. Das gilt auch für Callables ohne Parameter. So wie es auch für *Pfadoperation-Funktionen* ohne Parameter gilt. Dann können wir das „Dependable“ `common_parameters` der Abhängigkeit von oben in die Klasse `CommonQueryParams` ändern: === "Python 3.10+" ```Python hl_lines="11-15" {!> ../../../docs_src/dependencies/tutorial002_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="11-15" {!> ../../../docs_src/dependencies/tutorial002_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="12-16" {!> ../../../docs_src/dependencies/tutorial002_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9-13" {!> ../../../docs_src/dependencies/tutorial002_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="11-15" {!> ../../../docs_src/dependencies/tutorial002.py!} ``` Achten Sie auf die Methode `__init__`, die zum Erstellen der Instanz der Klasse verwendet wird: === "Python 3.10+" ```Python hl_lines="12" {!> ../../../docs_src/dependencies/tutorial002_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="12" {!> ../../../docs_src/dependencies/tutorial002_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="13" {!> ../../../docs_src/dependencies/tutorial002_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="10" {!> ../../../docs_src/dependencies/tutorial002_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="12" {!> ../../../docs_src/dependencies/tutorial002.py!} ``` ... sie hat die gleichen Parameter wie unsere vorherige `common_parameters`: === "Python 3.10+" ```Python hl_lines="8" {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="10" {!> ../../../docs_src/dependencies/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="6" {!> ../../../docs_src/dependencies/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9" {!> ../../../docs_src/dependencies/tutorial001.py!} ``` Diese Parameter werden von **FastAPI** verwendet, um die Abhängigkeit „aufzulösen“. In beiden Fällen wird sie haben: * Einen optionalen `q`-Query-Parameter, der ein `str` ist. * Einen `skip`-Query-Parameter, der ein `int` ist, mit einem Defaultwert `0`. * Einen `limit`-Query-Parameter, der ein `int` ist, mit einem Defaultwert `100`. In beiden Fällen werden die Daten konvertiert, validiert, im OpenAPI-Schema dokumentiert, usw. ## Verwendung Jetzt können Sie Ihre Abhängigkeit mithilfe dieser Klasse deklarieren. === "Python 3.10+" ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial002_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial002_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="20" {!> ../../../docs_src/dependencies/tutorial002_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="17" {!> ../../../docs_src/dependencies/tutorial002_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial002.py!} ``` **FastAPI** ruft die Klasse `CommonQueryParams` auf. Dadurch wird eine „Instanz“ dieser Klasse erstellt und die Instanz wird als Parameter `commons` an Ihre Funktion überreicht. ## Typannotation vs. `Depends` Beachten Sie, wie wir `CommonQueryParams` im obigen Code zweimal schreiben: === "Python 3.8+" ```Python commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)] ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python commons: CommonQueryParams = Depends(CommonQueryParams) ``` Das letzte `CommonQueryParams`, in: ```Python ... Depends(CommonQueryParams) ``` ... ist das, was **FastAPI** tatsächlich verwendet, um die Abhängigkeit zu ermitteln. Aus diesem extrahiert FastAPI die deklarierten Parameter, und dieses ist es, was FastAPI auch aufruft. --- In diesem Fall hat das erste `CommonQueryParams` in: === "Python 3.8+" ```Python commons: Annotated[CommonQueryParams, ... ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python commons: CommonQueryParams ... ``` ... keine besondere Bedeutung für **FastAPI**. FastAPI verwendet es nicht für die Datenkonvertierung, -validierung, usw. (da es dafür `Depends(CommonQueryParams)` verwendet). Sie könnten tatsächlich einfach schreiben: === "Python 3.8+" ```Python commons: Annotated[Any, Depends(CommonQueryParams)] ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python commons = Depends(CommonQueryParams) ``` ... wie in: === "Python 3.10+" ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial003_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial003_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="20" {!> ../../../docs_src/dependencies/tutorial003_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="17" {!> ../../../docs_src/dependencies/tutorial003_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial003.py!} ``` Es wird jedoch empfohlen, den Typ zu deklarieren, da Ihr Editor so weiß, was als Parameter `commons` übergeben wird, und Ihnen dann bei der Codevervollständigung, Typprüfungen, usw. helfen kann: ## Abkürzung Aber Sie sehen, dass wir hier etwas Codeduplizierung haben, indem wir `CommonQueryParams` zweimal schreiben: === "Python 3.8+" ```Python commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)] ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python commons: CommonQueryParams = Depends(CommonQueryParams) ``` **FastAPI** bietet eine Abkürzung für diese Fälle, wo die Abhängigkeit *speziell* eine Klasse ist, welche **FastAPI** aufruft, um eine Instanz der Klasse selbst zu erstellen. In diesem speziellen Fall können Sie Folgendes tun: Anstatt zu schreiben: === "Python 3.8+" ```Python commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)] ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python commons: CommonQueryParams = Depends(CommonQueryParams) ``` ... schreiben Sie: === "Python 3.8+" ```Python commons: Annotated[CommonQueryParams, Depends()] ``` === "Python 3.8 nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python commons: CommonQueryParams = Depends() ``` Sie deklarieren die Abhängigkeit als Typ des Parameters und verwenden `Depends()` ohne Parameter, anstatt die vollständige Klasse *erneut* in `Depends(CommonQueryParams)` schreiben zu müssen. Dasselbe Beispiel würde dann so aussehen: === "Python 3.10+" ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial004_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial004_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="20" {!> ../../../docs_src/dependencies/tutorial004_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="17" {!> ../../../docs_src/dependencies/tutorial004_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial004.py!} ``` ... und **FastAPI** wird wissen, was zu tun ist. !!! tip "Tipp" Wenn Sie das eher verwirrt, als Ihnen zu helfen, ignorieren Sie es, Sie *brauchen* es nicht. Es ist nur eine Abkürzung. Es geht **FastAPI** darum, Ihnen dabei zu helfen, Codeverdoppelung zu minimieren. fastapi-0.110.3/docs/de/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md000066400000000000000000000112641461403617600325270ustar00rootroot00000000000000# Abhängigkeiten in Pfadoperation-Dekoratoren Manchmal benötigen Sie den Rückgabewert einer Abhängigkeit innerhalb Ihrer *Pfadoperation-Funktion* nicht wirklich. Oder die Abhängigkeit gibt keinen Wert zurück. Aber Sie müssen Sie trotzdem ausführen/auflösen. In diesen Fällen können Sie, anstatt einen Parameter der *Pfadoperation-Funktion* mit `Depends` zu deklarieren, eine `list`e von `dependencies` zum *Pfadoperation-Dekorator* hinzufügen. ## `dependencies` zum *Pfadoperation-Dekorator* hinzufügen Der *Pfadoperation-Dekorator* erhält ein optionales Argument `dependencies`. Es sollte eine `list`e von `Depends()` sein: === "Python 3.9+" ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial006_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="18" {!> ../../../docs_src/dependencies/tutorial006_an.py!} ``` === "Python 3.8 nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="17" {!> ../../../docs_src/dependencies/tutorial006.py!} ``` Diese Abhängigkeiten werden auf die gleiche Weise wie normale Abhängigkeiten ausgeführt/aufgelöst. Aber ihr Wert (falls sie einen zurückgeben) wird nicht an Ihre *Pfadoperation-Funktion* übergeben. !!! tip "Tipp" Einige Editoren prüfen, ob Funktionsparameter nicht verwendet werden, und zeigen das als Fehler an. Wenn Sie `dependencies` im *Pfadoperation-Dekorator* verwenden, stellen Sie sicher, dass sie ausgeführt werden, während gleichzeitig Ihr Editor/Ihre Tools keine Fehlermeldungen ausgeben. Damit wird auch vermieden, neue Entwickler möglicherweise zu verwirren, die einen nicht verwendeten Parameter in Ihrem Code sehen und ihn für unnötig halten könnten. !!! info In diesem Beispiel verwenden wir zwei erfundene benutzerdefinierte Header `X-Key` und `X-Token`. Aber in realen Fällen würden Sie bei der Implementierung von Sicherheit mehr Vorteile durch die Verwendung der integrierten [Sicherheits-Werkzeuge (siehe nächstes Kapitel)](../security/index.md){.internal-link target=_blank} erzielen. ## Abhängigkeitsfehler und -Rückgabewerte Sie können dieselben Abhängigkeits-*Funktionen* verwenden, die Sie normalerweise verwenden. ### Abhängigkeitsanforderungen Sie können Anforderungen für einen Request (wie Header) oder andere Unterabhängigkeiten deklarieren: === "Python 3.9+" ```Python hl_lines="8 13" {!> ../../../docs_src/dependencies/tutorial006_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="7 12" {!> ../../../docs_src/dependencies/tutorial006_an.py!} ``` === "Python 3.8 nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="6 11" {!> ../../../docs_src/dependencies/tutorial006.py!} ``` ### Exceptions auslösen Die Abhängigkeiten können Exceptions `raise`n, genau wie normale Abhängigkeiten: === "Python 3.9+" ```Python hl_lines="10 15" {!> ../../../docs_src/dependencies/tutorial006_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="9 14" {!> ../../../docs_src/dependencies/tutorial006_an.py!} ``` === "Python 3.8 nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="8 13" {!> ../../../docs_src/dependencies/tutorial006.py!} ``` ### Rückgabewerte Und sie können Werte zurückgeben oder nicht, die Werte werden nicht verwendet. Sie können also eine normale Abhängigkeit (die einen Wert zurückgibt), die Sie bereits an anderer Stelle verwenden, wiederverwenden, und auch wenn der Wert nicht verwendet wird, wird die Abhängigkeit ausgeführt: === "Python 3.9+" ```Python hl_lines="11 16" {!> ../../../docs_src/dependencies/tutorial006_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="10 15" {!> ../../../docs_src/dependencies/tutorial006_an.py!} ``` === "Python 3.8 nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9 14" {!> ../../../docs_src/dependencies/tutorial006.py!} ``` ## Abhängigkeiten für eine Gruppe von *Pfadoperationen* Wenn Sie später lesen, wie Sie größere Anwendungen strukturieren ([Größere Anwendungen – Mehrere Dateien](../../tutorial/bigger-applications.md){.internal-link target=_blank}), möglicherweise mit mehreren Dateien, lernen Sie, wie Sie einen einzelnen `dependencies`-Parameter für eine Gruppe von *Pfadoperationen* deklarieren. ## Globale Abhängigkeiten Als Nächstes werden wir sehen, wie man Abhängigkeiten zur gesamten `FastAPI`-Anwendung hinzufügt, sodass sie für jede *Pfadoperation* gelten. fastapi-0.110.3/docs/de/docs/tutorial/dependencies/dependencies-with-yield.md000066400000000000000000000330171461403617600271050ustar00rootroot00000000000000# Abhängigkeiten mit yield FastAPI unterstützt Abhängigkeiten, die nach Abschluss einige zusätzliche Schritte ausführen. Verwenden Sie dazu `yield` statt `return` und schreiben Sie die zusätzlichen Schritte / den zusätzlichen Code danach. !!! tip "Tipp" Stellen Sie sicher, dass Sie `yield` nur einmal pro Abhängigkeit verwenden. !!! note "Technische Details" Jede Funktion, die dekoriert werden kann mit: * `@contextlib.contextmanager` oder * `@contextlib.asynccontextmanager` kann auch als gültige **FastAPI**-Abhängigkeit verwendet werden. Tatsächlich verwendet FastAPI diese beiden Dekoratoren intern. ## Eine Datenbank-Abhängigkeit mit `yield`. Sie könnten damit beispielsweise eine Datenbanksession erstellen und diese nach Abschluss schließen. Nur der Code vor und einschließlich der `yield`-Anweisung wird ausgeführt, bevor eine Response erzeugt wird: ```Python hl_lines="2-4" {!../../../docs_src/dependencies/tutorial007.py!} ``` Der ge`yield`ete Wert ist das, was in *Pfadoperationen* und andere Abhängigkeiten eingefügt wird: ```Python hl_lines="4" {!../../../docs_src/dependencies/tutorial007.py!} ``` Der auf die `yield`-Anweisung folgende Code wird ausgeführt, nachdem die Response gesendet wurde: ```Python hl_lines="5-6" {!../../../docs_src/dependencies/tutorial007.py!} ``` !!! tip "Tipp" Sie können `async`hrone oder reguläre Funktionen verwenden. **FastAPI** wird bei jeder das Richtige tun, so wie auch bei normalen Abhängigkeiten. ## Eine Abhängigkeit mit `yield` und `try`. Wenn Sie einen `try`-Block in einer Abhängigkeit mit `yield` verwenden, empfangen Sie alle Exceptions, die bei Verwendung der Abhängigkeit geworfen wurden. Wenn beispielsweise ein Code irgendwann in der Mitte, in einer anderen Abhängigkeit oder in einer *Pfadoperation*, ein „Rollback“ einer Datenbanktransaktion oder einen anderen Fehler verursacht, empfangen Sie die resultierende Exception in Ihrer Abhängigkeit. Sie können also mit `except SomeException` diese bestimmte Exception innerhalb der Abhängigkeit handhaben. Auf die gleiche Weise können Sie `finally` verwenden, um sicherzustellen, dass die Exit-Schritte ausgeführt werden, unabhängig davon, ob eine Exception geworfen wurde oder nicht. ```Python hl_lines="3 5" {!../../../docs_src/dependencies/tutorial007.py!} ``` ## Unterabhängigkeiten mit `yield`. Sie können Unterabhängigkeiten und „Bäume“ von Unterabhängigkeiten beliebiger Größe und Form haben, und einige oder alle davon können `yield` verwenden. **FastAPI** stellt sicher, dass der „Exit-Code“ in jeder Abhängigkeit mit `yield` in der richtigen Reihenfolge ausgeführt wird. Beispielsweise kann `dependency_c` von `dependency_b` und `dependency_b` von `dependency_a` abhängen: === "Python 3.9+" ```Python hl_lines="6 14 22" {!> ../../../docs_src/dependencies/tutorial008_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="5 13 21" {!> ../../../docs_src/dependencies/tutorial008_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="4 12 20" {!> ../../../docs_src/dependencies/tutorial008.py!} ``` Und alle können `yield` verwenden. In diesem Fall benötigt `dependency_c` zum Ausführen seines Exit-Codes, dass der Wert von `dependency_b` (hier `dep_b` genannt) verfügbar ist. Und wiederum benötigt `dependency_b` den Wert von `dependency_a` (hier `dep_a` genannt) für seinen Exit-Code. === "Python 3.9+" ```Python hl_lines="18-19 26-27" {!> ../../../docs_src/dependencies/tutorial008_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="17-18 25-26" {!> ../../../docs_src/dependencies/tutorial008_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="16-17 24-25" {!> ../../../docs_src/dependencies/tutorial008.py!} ``` Auf die gleiche Weise könnten Sie einige Abhängigkeiten mit `yield` und einige andere Abhängigkeiten mit `return` haben, und alle können beliebig voneinander abhängen. Und Sie könnten eine einzelne Abhängigkeit haben, die auf mehreren ge`yield`eten Abhängigkeiten basiert, usw. Sie können beliebige Kombinationen von Abhängigkeiten haben. **FastAPI** stellt sicher, dass alles in der richtigen Reihenfolge ausgeführt wird. !!! note "Technische Details" Dieses funktioniert dank Pythons Kontextmanager. **FastAPI** verwendet sie intern, um das zu erreichen. ## Abhängigkeiten mit `yield` und `HTTPException`. Sie haben gesehen, dass Ihre Abhängigkeiten `yield` verwenden können und `try`-Blöcke haben können, die Exceptions abfangen. Auf die gleiche Weise könnten Sie im Exit-Code nach dem `yield` eine `HTTPException` oder ähnliches auslösen. !!! tip "Tipp" Dies ist eine etwas fortgeschrittene Technik, die Sie in den meisten Fällen nicht wirklich benötigen, da Sie Exceptions (einschließlich `HTTPException`) innerhalb des restlichen Anwendungscodes auslösen können, beispielsweise in der *Pfadoperation-Funktion*. Aber es ist für Sie da, wenn Sie es brauchen. 🤓 === "Python 3.9+" ```Python hl_lines="18-22 31" {!> ../../../docs_src/dependencies/tutorial008b_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="17-21 30" {!> ../../../docs_src/dependencies/tutorial008b_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="16-20 29" {!> ../../../docs_src/dependencies/tutorial008b.py!} ``` Eine Alternative zum Abfangen von Exceptions (und möglicherweise auch zum Auslösen einer weiteren `HTTPException`) besteht darin, einen [benutzerdefinierten Exceptionhandler](../handling-errors.md#benutzerdefinierte-exceptionhandler-definieren){.internal-link target=_blank} zu erstellen. ## Ausführung von Abhängigkeiten mit `yield` Die Ausführungsreihenfolge ähnelt mehr oder weniger dem folgenden Diagramm. Die Zeit verläuft von oben nach unten. Und jede Spalte ist einer der interagierenden oder Code-ausführenden Teilnehmer. ```mermaid sequenceDiagram participant client as Client participant handler as Exceptionhandler participant dep as Abhängigkeit mit yield participant operation as Pfadoperation participant tasks as Hintergrundtasks Note over client,operation: Kann Exceptions auslösen, inklusive HTTPException client ->> dep: Startet den Request Note over dep: Führt den Code bis zum yield aus opt Löst Exception aus dep -->> handler: Löst Exception aus handler -->> client: HTTP-Error-Response end dep ->> operation: Führt Abhängigkeit aus, z. B. DB-Session opt Löst aus operation -->> dep: Löst Exception aus (z. B. HTTPException) opt Handhabt dep -->> dep: Kann Exception abfangen, eine neue HTTPException auslösen, andere Exceptions auslösen dep -->> handler: Leitet Exception automatisch weiter end handler -->> client: HTTP-Error-Response end operation ->> client: Sendet Response an Client Note over client,operation: Response wurde gesendet, kann nicht mehr geändert werden opt Tasks operation -->> tasks: Sendet Hintergrundtasks end opt Löst andere Exception aus tasks -->> tasks: Handhabt Exception im Hintergrundtask-Code end ``` !!! info Es wird nur **eine Response** an den Client gesendet. Es kann eine Error-Response oder die Response der *Pfadoperation* sein. Nachdem eine dieser Responses gesendet wurde, kann keine weitere Response gesendet werden. !!! tip "Tipp" Obiges Diagramm verwendet `HTTPException`, aber Sie können auch jede andere Exception auslösen, die Sie in einer Abhängigkeit mit `yield` abfangen, oder mit einem [benutzerdefinierten Exceptionhandler](../handling-errors.md#benutzerdefinierte-exceptionhandler-definieren){.internal-link target=_blank} erstellt haben. Wenn Sie eine Exception auslösen, wird diese mit yield an die Abhängigkeiten übergeben, einschließlich `HTTPException`, und dann **erneut** an die Exceptionhandler. Wenn es für diese Exception keinen Exceptionhandler gibt, wird sie von der internen Default-`ServerErrorMiddleware` gehandhabt, was einen HTTP-Statuscode 500 zurückgibt, um den Client darüber zu informieren, dass ein Fehler auf dem Server aufgetreten ist. ## Abhängigkeiten mit `yield`, `HTTPException` und Hintergrundtasks !!! warning "Achtung" Sie benötigen diese technischen Details höchstwahrscheinlich nicht, Sie können diesen Abschnitt überspringen und weiter unten fortfahren. Diese Details sind vor allem dann nützlich, wenn Sie eine Version von FastAPI vor 0.106.0 verwendet haben und Ressourcen aus Abhängigkeiten mit `yield` in Hintergrundtasks verwendet haben. Vor FastAPI 0.106.0 war das Auslösen von Exceptions nach `yield` nicht möglich, der Exit-Code in Abhängigkeiten mit `yield` wurde ausgeführt, *nachdem* die Response gesendet wurde, die [Exceptionhandler](../handling-errors.md#benutzerdefinierte-exceptionhandler-definieren){.internal-link target=_blank} wären also bereits ausgeführt worden. Dies wurde hauptsächlich so konzipiert, damit die gleichen Objekte, die durch Abhängigkeiten ge`yield`et werden, innerhalb von Hintergrundtasks verwendet werden können, da der Exit-Code ausgeführt wird, nachdem die Hintergrundtasks abgeschlossen sind. Da dies jedoch bedeuten würde, darauf zu warten, dass die Response durch das Netzwerk reist, während eine Ressource unnötigerweise in einer Abhängigkeit mit yield gehalten wird (z. B. eine Datenbankverbindung), wurde dies in FastAPI 0.106.0 geändert. !!! tip "Tipp" Darüber hinaus handelt es sich bei einem Hintergrundtask normalerweise um einen unabhängigen Satz von Logik, der separat behandelt werden sollte, mit eigenen Ressourcen (z. B. einer eigenen Datenbankverbindung). Auf diese Weise erhalten Sie wahrscheinlich saubereren Code. Wenn Sie sich früher auf dieses Verhalten verlassen haben, sollten Sie jetzt die Ressourcen für Hintergrundtasks innerhalb des Hintergrundtasks selbst erstellen und intern nur Daten verwenden, die nicht von den Ressourcen von Abhängigkeiten mit `yield` abhängen. Anstatt beispielsweise dieselbe Datenbanksitzung zu verwenden, würden Sie eine neue Datenbanksitzung innerhalb des Hintergrundtasks erstellen und die Objekte mithilfe dieser neuen Sitzung aus der Datenbank abrufen. Und anstatt das Objekt aus der Datenbank als Parameter an die Hintergrundtask-Funktion zu übergeben, würden Sie die ID dieses Objekts übergeben und das Objekt dann innerhalb der Hintergrundtask-Funktion erneut laden. ## Kontextmanager ### Was sind „Kontextmanager“ „Kontextmanager“ (Englisch „Context Manager“) sind bestimmte Python-Objekte, die Sie in einer `with`-Anweisung verwenden können. Beispielsweise können Sie `with` verwenden, um eine Datei auszulesen: ```Python with open("./somefile.txt") as f: contents = f.read() print(contents) ``` Im Hintergrund erstellt das `open("./somefile.txt")` ein Objekt, das als „Kontextmanager“ bezeichnet wird. Dieser stellt sicher dass, wenn der `with`-Block beendet ist, die Datei geschlossen wird, auch wenn Exceptions geworfen wurden. Wenn Sie eine Abhängigkeit mit `yield` erstellen, erstellt **FastAPI** dafür intern einen Kontextmanager und kombiniert ihn mit einigen anderen zugehörigen Tools. ### Kontextmanager in Abhängigkeiten mit `yield` verwenden !!! warning "Achtung" Dies ist mehr oder weniger eine „fortgeschrittene“ Idee. Wenn Sie gerade erst mit **FastAPI** beginnen, möchten Sie das vielleicht vorerst überspringen. In Python können Sie Kontextmanager erstellen, indem Sie eine Klasse mit zwei Methoden erzeugen: `__enter__()` und `__exit__()`. Sie können solche auch innerhalb von **FastAPI**-Abhängigkeiten mit `yield` verwenden, indem Sie `with`- oder `async with`-Anweisungen innerhalb der Abhängigkeits-Funktion verwenden: ```Python hl_lines="1-9 13" {!../../../docs_src/dependencies/tutorial010.py!} ``` !!! tip "Tipp" Andere Möglichkeiten, einen Kontextmanager zu erstellen, sind: * `@contextlib.contextmanager` oder * `@contextlib.asynccontextmanager` Verwenden Sie diese, um eine Funktion zu dekorieren, die ein einziges `yield` hat. Das ist es auch, was **FastAPI** intern für Abhängigkeiten mit `yield` verwendet. Aber Sie müssen die Dekoratoren nicht für FastAPI-Abhängigkeiten verwenden (und das sollten Sie auch nicht). FastAPI erledigt das intern für Sie. fastapi-0.110.3/docs/de/docs/tutorial/dependencies/global-dependencies.md000066400000000000000000000030141461403617600262600ustar00rootroot00000000000000# Globale Abhängigkeiten Bei einigen Anwendungstypen möchten Sie möglicherweise Abhängigkeiten zur gesamten Anwendung hinzufügen. Ähnlich wie Sie [`dependencies` zu den *Pfadoperation-Dekoratoren* hinzufügen](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} können, können Sie sie auch zur `FastAPI`-Anwendung hinzufügen. In diesem Fall werden sie auf alle *Pfadoperationen* in der Anwendung angewendet: === "Python 3.9+" ```Python hl_lines="16" {!> ../../../docs_src/dependencies/tutorial012_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="16" {!> ../../../docs_src/dependencies/tutorial012_an.py!} ``` === "Python 3.8 nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="15" {!> ../../../docs_src/dependencies/tutorial012.py!} ``` Und alle Ideen aus dem Abschnitt über das [Hinzufügen von `dependencies` zu den *Pfadoperation-Dekoratoren*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} gelten weiterhin, aber in diesem Fall für alle *Pfadoperationen* in der Anwendung. ## Abhängigkeiten für Gruppen von *Pfadoperationen* Wenn Sie später lesen, wie Sie größere Anwendungen strukturieren ([Bigger Applications - Multiple Files](../../tutorial/bigger-applications.md){.internal-link target=_blank}), möglicherweise mit mehreren Dateien, lernen Sie, wie Sie einen einzelnen `dependencies`-Parameter für eine Gruppe von *Pfadoperationen* deklarieren. fastapi-0.110.3/docs/de/docs/tutorial/dependencies/index.md000066400000000000000000000322051461403617600235070ustar00rootroot00000000000000# Abhängigkeiten **FastAPI** hat ein sehr mächtiges, aber intuitives **Dependency Injection** System. Es ist so konzipiert, sehr einfach zu verwenden zu sein und es jedem Entwickler sehr leicht zu machen, andere Komponenten mit **FastAPI** zu integrieren. ## Was ist „Dependency Injection“ **„Dependency Injection“** bedeutet in der Programmierung, dass es für Ihren Code (in diesem Fall Ihre *Pfadoperation-Funktionen*) eine Möglichkeit gibt, Dinge zu deklarieren, die er verwenden möchte und die er zum Funktionieren benötigt: „Abhängigkeiten“ – „Dependencies“. Das System (in diesem Fall **FastAPI**) kümmert sich dann darum, Ihren Code mit den erforderlichen Abhängigkeiten zu versorgen („die Abhängigkeiten einfügen“ – „inject the dependencies“). Das ist sehr nützlich, wenn Sie: * Eine gemeinsame Logik haben (die gleiche Code-Logik immer und immer wieder). * Datenbankverbindungen teilen. * Sicherheit, Authentifizierung, Rollenanforderungen, usw. durchsetzen. * Und viele andere Dinge ... All dies, während Sie Codeverdoppelung minimieren. ## Erste Schritte Sehen wir uns ein sehr einfaches Beispiel an. Es ist so einfach, dass es vorerst nicht sehr nützlich ist. Aber so können wir uns besser auf die Funktionsweise des **Dependency Injection** Systems konzentrieren. ### Erstellen Sie eine Abhängigkeit („Dependable“) Konzentrieren wir uns zunächst auf die Abhängigkeit - die Dependency. Es handelt sich einfach um eine Funktion, die die gleichen Parameter entgegennimmt wie eine *Pfadoperation-Funktion*: === "Python 3.10+" ```Python hl_lines="8-9" {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="8-11" {!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="9-12" {!> ../../../docs_src/dependencies/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="6-7" {!> ../../../docs_src/dependencies/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="8-11" {!> ../../../docs_src/dependencies/tutorial001.py!} ``` Das war's schon. **Zwei Zeilen**. Und sie hat die gleiche Form und Struktur wie alle Ihre *Pfadoperation-Funktionen*. Sie können sie sich als *Pfadoperation-Funktion* ohne den „Dekorator“ (ohne `@app.get("/some-path")`) vorstellen. Und sie kann alles zurückgeben, was Sie möchten. In diesem Fall erwartet diese Abhängigkeit: * Einen optionalen Query-Parameter `q`, der ein `str` ist. * Einen optionalen Query-Parameter `skip`, der ein `int` ist und standardmäßig `0` ist. * Einen optionalen Query-Parameter `limit`, der ein `int` ist und standardmäßig `100` ist. Und dann wird einfach ein `dict` zurückgegeben, welches diese Werte enthält. !!! info FastAPI unterstützt (und empfiehlt die Verwendung von) `Annotated` seit Version 0.95.0. Wenn Sie eine ältere Version haben, werden Sie Fehler angezeigt bekommen, wenn Sie versuchen, `Annotated` zu verwenden. Bitte [aktualisieren Sie FastAPI](../../deployment/versions.md#upgrade-der-fastapi-versionen){.internal-link target=_blank} daher mindestens zu Version 0.95.1, bevor Sie `Annotated` verwenden. ### `Depends` importieren === "Python 3.10+" ```Python hl_lines="3" {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="3" {!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="3" {!> ../../../docs_src/dependencies/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="1" {!> ../../../docs_src/dependencies/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="3" {!> ../../../docs_src/dependencies/tutorial001.py!} ``` ### Deklarieren der Abhängigkeit im „Dependant“ So wie auch `Body`, `Query`, usw., verwenden Sie `Depends` mit den Parametern Ihrer *Pfadoperation-Funktion*: === "Python 3.10+" ```Python hl_lines="13 18" {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="15 20" {!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="16 21" {!> ../../../docs_src/dependencies/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="11 16" {!> ../../../docs_src/dependencies/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="15 20" {!> ../../../docs_src/dependencies/tutorial001.py!} ``` Obwohl Sie `Depends` in den Parametern Ihrer Funktion genauso verwenden wie `Body`, `Query`, usw., funktioniert `Depends` etwas anders. Sie übergeben `Depends` nur einen einzigen Parameter. Dieser Parameter muss so etwas wie eine Funktion sein. Sie **rufen diese nicht direkt auf** (fügen Sie am Ende keine Klammern hinzu), sondern übergeben sie einfach als Parameter an `Depends()`. Und diese Funktion akzeptiert Parameter auf die gleiche Weise wie *Pfadoperation-Funktionen*. !!! tip "Tipp" Im nächsten Kapitel erfahren Sie, welche anderen „Dinge“, außer Funktionen, Sie als Abhängigkeiten verwenden können. Immer wenn ein neuer Request eintrifft, kümmert sich **FastAPI** darum: * Ihre Abhängigkeitsfunktion („Dependable“) mit den richtigen Parametern aufzurufen. * Sich das Ergebnis von dieser Funktion zu holen. * Dieses Ergebnis dem Parameter Ihrer *Pfadoperation-Funktion* zuzuweisen. ```mermaid graph TB common_parameters(["common_parameters"]) read_items["/items/"] read_users["/users/"] common_parameters --> read_items common_parameters --> read_users ``` Auf diese Weise schreiben Sie gemeinsam genutzten Code nur einmal, und **FastAPI** kümmert sich darum, ihn für Ihre *Pfadoperationen* aufzurufen. !!! check Beachten Sie, dass Sie keine spezielle Klasse erstellen und diese irgendwo an **FastAPI** übergeben müssen, um sie zu „registrieren“ oder so ähnlich. Sie übergeben es einfach an `Depends` und **FastAPI** weiß, wie der Rest erledigt wird. ## `Annotated`-Abhängigkeiten wiederverwenden In den Beispielen oben sehen Sie, dass es ein kleines bisschen **Codeverdoppelung** gibt. Wenn Sie die Abhängigkeit `common_parameters()` verwenden, müssen Sie den gesamten Parameter mit der Typannotation und `Depends()` schreiben: ```Python commons: Annotated[dict, Depends(common_parameters)] ``` Da wir jedoch `Annotated` verwenden, können wir diesen `Annotated`-Wert in einer Variablen speichern und an mehreren Stellen verwenden: === "Python 3.10+" ```Python hl_lines="12 16 21" {!> ../../../docs_src/dependencies/tutorial001_02_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="14 18 23" {!> ../../../docs_src/dependencies/tutorial001_02_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="15 19 24" {!> ../../../docs_src/dependencies/tutorial001_02_an.py!} ``` !!! tip "Tipp" Das ist schlicht Standard-Python, es wird als „Typalias“ bezeichnet und ist eigentlich nicht **FastAPI**-spezifisch. Da **FastAPI** jedoch auf Standard-Python, einschließlich `Annotated`, basiert, können Sie diesen Trick in Ihrem Code verwenden. 😎 Die Abhängigkeiten funktionieren weiterhin wie erwartet, und das **Beste daran** ist, dass die **Typinformationen erhalten bleiben**, was bedeutet, dass Ihr Editor Ihnen weiterhin **automatische Vervollständigung**, **Inline-Fehler**, usw. bieten kann. Das Gleiche gilt für andere Tools wie `mypy`. Das ist besonders nützlich, wenn Sie es in einer **großen Codebasis** verwenden, in der Sie in **vielen *Pfadoperationen*** immer wieder **dieselben Abhängigkeiten** verwenden. ## `async` oder nicht `async` Da Abhängigkeiten auch von **FastAPI** aufgerufen werden (so wie Ihre *Pfadoperation-Funktionen*), gelten beim Definieren Ihrer Funktionen die gleichen Regeln. Sie können `async def` oder einfach `def` verwenden. Und Sie können Abhängigkeiten mit `async def` innerhalb normaler `def`-*Pfadoperation-Funktionen* oder `def`-Abhängigkeiten innerhalb von `async def`-*Pfadoperation-Funktionen*, usw. deklarieren. Es spielt keine Rolle. **FastAPI** weiß, was zu tun ist. !!! note "Hinweis" Wenn Ihnen das nichts sagt, lesen Sie den [Async: *„In Eile?“*](../../async.md#in-eile){.internal-link target=_blank}-Abschnitt über `async` und `await` in der Dokumentation. ## Integriert in OpenAPI Alle Requestdeklarationen, -validierungen und -anforderungen Ihrer Abhängigkeiten (und Unterabhängigkeiten) werden in dasselbe OpenAPI-Schema integriert. Die interaktive Dokumentation enthält also auch alle Informationen aus diesen Abhängigkeiten: ## Einfache Verwendung Näher betrachtet, werden *Pfadoperation-Funktionen* deklariert, um verwendet zu werden, wann immer ein *Pfad* und eine *Operation* übereinstimmen, und dann kümmert sich **FastAPI** darum, die Funktion mit den richtigen Parametern aufzurufen, die Daten aus der Anfrage extrahierend. Tatsächlich funktionieren alle (oder die meisten) Webframeworks auf die gleiche Weise. Sie rufen diese Funktionen niemals direkt auf. Sie werden von Ihrem Framework aufgerufen (in diesem Fall **FastAPI**). Mit dem Dependency Injection System können Sie **FastAPI** ebenfalls mitteilen, dass Ihre *Pfadoperation-Funktion* von etwas anderem „abhängt“, das vor Ihrer *Pfadoperation-Funktion* ausgeführt werden soll, und **FastAPI** kümmert sich darum, es auszuführen und die Ergebnisse zu „injizieren“. Andere gebräuchliche Begriffe für dieselbe Idee der „Abhängigkeitsinjektion“ sind: * Ressourcen * Provider * Services * Injectables * Komponenten ## **FastAPI**-Plugins Integrationen und „Plugins“ können mit dem **Dependency Injection** System erstellt werden. Aber tatsächlich besteht **keine Notwendigkeit, „Plugins“ zu erstellen**, da es durch die Verwendung von Abhängigkeiten möglich ist, eine unendliche Anzahl von Integrationen und Interaktionen zu deklarieren, die dann für Ihre *Pfadoperation-Funktionen* verfügbar sind. Und Abhängigkeiten können auf sehr einfache und intuitive Weise erstellt werden, sodass Sie einfach die benötigten Python-Packages importieren und sie in wenigen Codezeilen, *im wahrsten Sinne des Wortes*, mit Ihren API-Funktionen integrieren. Beispiele hierfür finden Sie in den nächsten Kapiteln zu relationalen und NoSQL-Datenbanken, Sicherheit usw. ## **FastAPI**-Kompatibilität Die Einfachheit des Dependency Injection Systems macht **FastAPI** kompatibel mit: * allen relationalen Datenbanken * NoSQL-Datenbanken * externen Packages * externen APIs * Authentifizierungs- und Autorisierungssystemen * API-Nutzungs-Überwachungssystemen * Responsedaten-Injektionssystemen * usw. ## Einfach und leistungsstark Obwohl das hierarchische Dependency Injection System sehr einfach zu definieren und zu verwenden ist, ist es dennoch sehr mächtig. Sie können Abhängigkeiten definieren, die selbst wiederum Abhängigkeiten definieren können. Am Ende wird ein hierarchischer Baum von Abhängigkeiten erstellt, und das **Dependency Injection** System kümmert sich darum, alle diese Abhängigkeiten (und deren Unterabhängigkeiten) für Sie aufzulösen und die Ergebnisse bei jedem Schritt einzubinden (zu injizieren). Nehmen wir zum Beispiel an, Sie haben vier API-Endpunkte (*Pfadoperationen*): * `/items/public/` * `/items/private/` * `/users/{user_id}/activate` * `/items/pro/` Dann könnten Sie für jeden davon unterschiedliche Berechtigungsanforderungen hinzufügen, nur mit Abhängigkeiten und Unterabhängigkeiten: ```mermaid graph TB current_user(["current_user"]) active_user(["active_user"]) admin_user(["admin_user"]) paying_user(["paying_user"]) public["/items/public/"] private["/items/private/"] activate_user["/users/{user_id}/activate"] pro_items["/items/pro/"] current_user --> active_user active_user --> admin_user active_user --> paying_user current_user --> public active_user --> private admin_user --> activate_user paying_user --> pro_items ``` ## Integriert mit **OpenAPI** Alle diese Abhängigkeiten, während sie ihre Anforderungen deklarieren, fügen auch Parameter, Validierungen, usw. zu Ihren *Pfadoperationen* hinzu. **FastAPI** kümmert sich darum, alles zum OpenAPI-Schema hinzuzufügen, damit es in den interaktiven Dokumentationssystemen angezeigt wird. fastapi-0.110.3/docs/de/docs/tutorial/dependencies/sub-dependencies.md000066400000000000000000000145461461403617600256250ustar00rootroot00000000000000# Unterabhängigkeiten Sie können Abhängigkeiten erstellen, die **Unterabhängigkeiten** haben. Diese können so **tief** verschachtelt sein, wie nötig. **FastAPI** kümmert sich darum, sie aufzulösen. ## Erste Abhängigkeit, „Dependable“ Sie könnten eine erste Abhängigkeit („Dependable“) wie folgt erstellen: === "Python 3.10+" ```Python hl_lines="8-9" {!> ../../../docs_src/dependencies/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="8-9" {!> ../../../docs_src/dependencies/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="9-10" {!> ../../../docs_src/dependencies/tutorial005_an.py!} ``` === "Python 3.10 nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="6-7" {!> ../../../docs_src/dependencies/tutorial005_py310.py!} ``` === "Python 3.8 nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="8-9" {!> ../../../docs_src/dependencies/tutorial005.py!} ``` Diese deklariert einen optionalen Abfrageparameter `q` vom Typ `str` und gibt ihn dann einfach zurück. Das ist recht einfach (nicht sehr nützlich), hilft uns aber dabei, uns auf die Funktionsweise der Unterabhängigkeiten zu konzentrieren. ## Zweite Abhängigkeit, „Dependable“ und „Dependant“ Dann können Sie eine weitere Abhängigkeitsfunktion (ein „Dependable“) erstellen, die gleichzeitig eine eigene Abhängigkeit deklariert (also auch ein „Dependant“ ist): === "Python 3.10+" ```Python hl_lines="13" {!> ../../../docs_src/dependencies/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="13" {!> ../../../docs_src/dependencies/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="14" {!> ../../../docs_src/dependencies/tutorial005_an.py!} ``` === "Python 3.10 nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="11" {!> ../../../docs_src/dependencies/tutorial005_py310.py!} ``` === "Python 3.8 nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="13" {!> ../../../docs_src/dependencies/tutorial005.py!} ``` Betrachten wir die deklarierten Parameter: * Obwohl diese Funktion selbst eine Abhängigkeit ist („Dependable“, etwas hängt von ihr ab), deklariert sie auch eine andere Abhängigkeit („Dependant“, sie hängt von etwas anderem ab). * Sie hängt von `query_extractor` ab und weist den von diesem zurückgegebenen Wert dem Parameter `q` zu. * Sie deklariert außerdem ein optionales `last_query`-Cookie, ein `str`. * Wenn der Benutzer keine Query `q` übermittelt hat, verwenden wir die zuletzt übermittelte Query, die wir zuvor in einem Cookie gespeichert haben. ## Die Abhängigkeit verwenden Diese Abhängigkeit verwenden wir nun wie folgt: === "Python 3.10+" ```Python hl_lines="23" {!> ../../../docs_src/dependencies/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="23" {!> ../../../docs_src/dependencies/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="24" {!> ../../../docs_src/dependencies/tutorial005_an.py!} ``` === "Python 3.10 nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial005_py310.py!} ``` === "Python 3.8 nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="22" {!> ../../../docs_src/dependencies/tutorial005.py!} ``` !!! info Beachten Sie, dass wir in der *Pfadoperation-Funktion* nur eine einzige Abhängigkeit deklarieren, den `query_or_cookie_extractor`. Aber **FastAPI** wird wissen, dass es zuerst `query_extractor` auflösen muss, um dessen Resultat `query_or_cookie_extractor` zu übergeben, wenn dieses aufgerufen wird. ```mermaid graph TB query_extractor(["query_extractor"]) query_or_cookie_extractor(["query_or_cookie_extractor"]) read_query["/items/"] query_extractor --> query_or_cookie_extractor --> read_query ``` ## Dieselbe Abhängigkeit mehrmals verwenden Wenn eine Ihrer Abhängigkeiten mehrmals für dieselbe *Pfadoperation* deklariert wird, beispielsweise wenn mehrere Abhängigkeiten eine gemeinsame Unterabhängigkeit haben, wird **FastAPI** diese Unterabhängigkeit nur einmal pro Request aufrufen. Und es speichert den zurückgegebenen Wert in einem „Cache“ und übergibt diesen gecachten Wert an alle „Dependanten“, die ihn in diesem spezifischen Request benötigen, anstatt die Abhängigkeit mehrmals für denselben Request aufzurufen. In einem fortgeschrittenen Szenario, bei dem Sie wissen, dass die Abhängigkeit bei jedem Schritt (möglicherweise mehrmals) in derselben Anfrage aufgerufen werden muss, anstatt den zwischengespeicherten Wert zu verwenden, können Sie den Parameter `use_cache=False` festlegen, wenn Sie `Depends` verwenden: === "Python 3.8+" ```Python hl_lines="1" async def needy_dependency(fresh_value: Annotated[str, Depends(get_value, use_cache=False)]): return {"fresh_value": fresh_value} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="1" async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)): return {"fresh_value": fresh_value} ``` ## Zusammenfassung Abgesehen von all den ausgefallenen Wörtern, die hier verwendet werden, ist das **Dependency Injection**-System recht simpel. Einfach Funktionen, die genauso aussehen wie *Pfadoperation-Funktionen*. Dennoch ist es sehr mächtig und ermöglicht Ihnen die Deklaration beliebig tief verschachtelter Abhängigkeits-„Graphen“ (Bäume). !!! tip "Tipp" All dies scheint angesichts dieser einfachen Beispiele möglicherweise nicht so nützlich zu sein. Aber Sie werden in den Kapiteln über **Sicherheit** sehen, wie nützlich das ist. Und Sie werden auch sehen, wie viel Code Sie dadurch einsparen. fastapi-0.110.3/docs/de/docs/tutorial/encoder.md000066400000000000000000000037141461403617600213740ustar00rootroot00000000000000# JSON-kompatibler Encoder Es gibt Fälle, da möchten Sie einen Datentyp (etwa ein Pydantic-Modell) in etwas konvertieren, das kompatibel mit JSON ist (etwa ein `dict`, eine `list`e, usw.). Zum Beispiel, wenn Sie es in einer Datenbank speichern möchten. Dafür bietet **FastAPI** eine Funktion `jsonable_encoder()`. ## `jsonable_encoder` verwenden Stellen wir uns vor, Sie haben eine Datenbank `fake_db`, die nur JSON-kompatible Daten entgegennimmt. Sie akzeptiert zum Beispiel keine `datetime`-Objekte, da die nicht kompatibel mit JSON sind. Ein `datetime`-Objekt müsste also in einen `str` umgewandelt werden, der die Daten im ISO-Format enthält. Genauso würde die Datenbank kein Pydantic-Modell (ein Objekt mit Attributen) akzeptieren, sondern nur ein `dict`. Sie können für diese Fälle `jsonable_encoder` verwenden. Es nimmt ein Objekt entgegen, wie etwa ein Pydantic-Modell, und gibt eine JSON-kompatible Version zurück: === "Python 3.10+" ```Python hl_lines="4 21" {!> ../../../docs_src/encoder/tutorial001_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="5 22" {!> ../../../docs_src/encoder/tutorial001.py!} ``` In diesem Beispiel wird das Pydantic-Modell in ein `dict`, und das `datetime`-Objekt in ein `str` konvertiert. Das Resultat dieses Aufrufs ist etwas, das mit Pythons Standard-`json.dumps()` kodiert werden kann. Es wird also kein großer `str` zurückgegeben, der die Daten im JSON-Format (als String) enthält. Es wird eine Python-Standarddatenstruktur (z. B. ein `dict`) zurückgegeben, mit Werten und Unterwerten, die alle mit JSON kompatibel sind. !!! note "Hinweis" `jsonable_encoder` wird tatsächlich von **FastAPI** intern verwendet, um Daten zu konvertieren. Aber es ist in vielen anderen Szenarien hilfreich. fastapi-0.110.3/docs/de/docs/tutorial/extra-data-types.md000066400000000000000000000106441461403617600231510ustar00rootroot00000000000000# Zusätzliche Datentypen Bisher haben Sie gängige Datentypen verwendet, wie zum Beispiel: * `int` * `float` * `str` * `bool` Sie können aber auch komplexere Datentypen verwenden. Und Sie haben immer noch dieselbe Funktionalität wie bisher gesehen: * Großartige Editor-Unterstützung. * Datenkonvertierung bei eingehenden Requests. * Datenkonvertierung für Response-Daten. * Datenvalidierung. * Automatische Annotation und Dokumentation. ## Andere Datentypen Hier sind einige der zusätzlichen Datentypen, die Sie verwenden können: * `UUID`: * Ein standardmäßiger „universell eindeutiger Bezeichner“ („Universally Unique Identifier“), der in vielen Datenbanken und Systemen als ID üblich ist. * Wird in Requests und Responses als `str` dargestellt. * `datetime.datetime`: * Ein Python-`datetime.datetime`. * Wird in Requests und Responses als `str` im ISO 8601-Format dargestellt, etwa: `2008-09-15T15:53:00+05:00`. * `datetime.date`: * Python-`datetime.date`. * Wird in Requests und Responses als `str` im ISO 8601-Format dargestellt, etwa: `2008-09-15`. * `datetime.time`: * Ein Python-`datetime.time`. * Wird in Requests und Responses als `str` im ISO 8601-Format dargestellt, etwa: `14:23:55.003`. * `datetime.timedelta`: * Ein Python-`datetime.timedelta`. * Wird in Requests und Responses als `float` der Gesamtsekunden dargestellt. * Pydantic ermöglicht auch die Darstellung als „ISO 8601 Zeitdifferenz-Kodierung“, Weitere Informationen finden Sie in der Dokumentation. * `frozenset`: * Wird in Requests und Responses wie ein `set` behandelt: * Bei Requests wird eine Liste gelesen, Duplikate entfernt und in ein `set` umgewandelt. * Bei Responses wird das `set` in eine `list`e umgewandelt. * Das generierte Schema zeigt an, dass die `set`-Werte eindeutig sind (unter Verwendung von JSON Schemas `uniqueItems`). * `bytes`: * Standard-Python-`bytes`. * In Requests und Responses werden sie als `str` behandelt. * Das generierte Schema wird anzeigen, dass es sich um einen `str` mit `binary` „Format“ handelt. * `Decimal`: * Standard-Python-`Decimal`. * In Requests und Responses wird es wie ein `float` behandelt. * Sie können alle gültigen Pydantic-Datentypen hier überprüfen: Pydantic data types. ## Beispiel Hier ist ein Beispiel für eine *Pfadoperation* mit Parametern, die einige der oben genannten Typen verwenden. === "Python 3.10+" ```Python hl_lines="1 3 12-16" {!> ../../../docs_src/extra_data_types/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="1 3 12-16" {!> ../../../docs_src/extra_data_types/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1 3 13-17" {!> ../../../docs_src/extra_data_types/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="1 2 11-15" {!> ../../../docs_src/extra_data_types/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="1 2 12-16" {!> ../../../docs_src/extra_data_types/tutorial001.py!} ``` Beachten Sie, dass die Parameter innerhalb der Funktion ihren natürlichen Datentyp haben und Sie beispielsweise normale Datumsmanipulationen durchführen können, wie zum Beispiel: === "Python 3.10+" ```Python hl_lines="18-19" {!> ../../../docs_src/extra_data_types/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="18-19" {!> ../../../docs_src/extra_data_types/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="19-20" {!> ../../../docs_src/extra_data_types/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="17-18" {!> ../../../docs_src/extra_data_types/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="18-19" {!> ../../../docs_src/extra_data_types/tutorial001.py!} ``` fastapi-0.110.3/docs/de/docs/tutorial/extra-models.md000066400000000000000000000213271461403617600223610ustar00rootroot00000000000000# Extramodelle Fahren wir beim letzten Beispiel fort. Es gibt normalerweise mehrere zusammengehörende Modelle. Insbesondere Benutzermodelle, denn: * Das **hereinkommende Modell** sollte ein Passwort haben können. * Das **herausgehende Modell** sollte kein Passwort haben. * Das **Datenbankmodell** sollte wahrscheinlich ein gehashtes Passwort haben. !!! danger "Gefahr" Speichern Sie niemals das Klartext-Passwort eines Benutzers. Speichern Sie immer den „sicheren Hash“, den Sie verifizieren können. Falls Ihnen das nichts sagt, in den [Sicherheits-Kapiteln](security/simple-oauth2.md#passwort-hashing){.internal-link target=_blank} werden Sie lernen, was ein „Passwort-Hash“ ist. ## Mehrere Modelle Hier der generelle Weg, wie die Modelle mit ihren Passwort-Feldern aussehen könnten, und an welchen Orten sie verwendet werden würden. === "Python 3.10+" ```Python hl_lines="7 9 14 20 22 27-28 31-33 38-39" {!> ../../../docs_src/extra_models/tutorial001_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="9 11 16 22 24 29-30 33-35 40-41" {!> ../../../docs_src/extra_models/tutorial001.py!} ``` !!! info In Pydantic v1 hieß diese Methode `.dict()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstützt) und in `.model_dump()` umbenannt. Die Beispiele hier verwenden `.dict()` für die Kompatibilität mit Pydantic v1, Sie sollten jedoch stattdessen `.model_dump()` verwenden, wenn Sie Pydantic v2 verwenden können. ### Über `**user_in.dict()` #### Pydantic's `.dict()` `user_in` ist ein Pydantic-Modell der Klasse `UserIn`. Pydantic-Modelle haben eine `.dict()`-Methode, die ein `dict` mit den Daten des Modells zurückgibt. Wenn wir also ein Pydantic-Objekt `user_in` erstellen, etwa so: ```Python user_in = UserIn(username="john", password="secret", email="john.doe@example.com") ``` und wir rufen seine `.dict()`-Methode auf: ```Python user_dict = user_in.dict() ``` dann haben wir jetzt in der Variable `user_dict` ein `dict` mit den gleichen Daten (es ist ein `dict` statt eines Pydantic-Modellobjekts). Wenn wir es ausgeben: ```Python print(user_dict) ``` bekommen wir ein Python-`dict`: ```Python { 'username': 'john', 'password': 'secret', 'email': 'john.doe@example.com', 'full_name': None, } ``` #### Ein `dict` entpacken Wenn wir ein `dict` wie `user_dict` nehmen, und es einer Funktion (oder Klassenmethode) mittels `**user_dict` übergeben, wird Python es „entpacken“. Es wird die Schlüssel und Werte von `user_dict` direkt als Schlüsselwort-Argumente übergeben. Wenn wir also das `user_dict` von oben nehmen und schreiben: ```Python UserInDB(**user_dict) ``` dann ist das ungefähr äquivalent zu: ```Python UserInDB( username="john", password="secret", email="john.doe@example.com", full_name=None, ) ``` Oder, präziser, `user_dict` wird direkt verwendet, welche Werte es auch immer haben mag: ```Python UserInDB( username = user_dict["username"], password = user_dict["password"], email = user_dict["email"], full_name = user_dict["full_name"], ) ``` #### Ein Pydantic-Modell aus den Inhalten eines anderen erstellen. Da wir in obigem Beispiel `user_dict` mittels `user_in.dict()` erzeugt haben, ist dieser Code: ```Python user_dict = user_in.dict() UserInDB(**user_dict) ``` äquivalent zu: ```Python UserInDB(**user_in.dict()) ``` ... weil `user_in.dict()` ein `dict` ist, und dann lassen wir Python es „entpacken“, indem wir es `UserInDB` übergeben, mit vorangestelltem `**`. Wir erhalten also ein Pydantic-Modell aus den Daten eines anderen Pydantic-Modells. #### Ein `dict` entpacken und zusätzliche Schlüsselwort-Argumente Und dann fügen wir ein noch weiteres Schlüsselwort-Argument hinzu, `hashed_password=hashed_password`: ```Python UserInDB(**user_in.dict(), hashed_password=hashed_password) ``` ... was am Ende ergibt: ```Python UserInDB( username = user_dict["username"], password = user_dict["password"], email = user_dict["email"], full_name = user_dict["full_name"], hashed_password = hashed_password, ) ``` !!! warning "Achtung" Die Hilfsfunktionen `fake_password_hasher` und `fake_save_user` demonstrieren nur den möglichen Fluss der Daten und bieten natürlich keine echte Sicherheit. ## Verdopplung vermeiden Reduzierung von Code-Verdoppelung ist eine der Kern-Ideen von **FastAPI**. Weil Verdoppelung von Code die Wahrscheinlichkeit von Fehlern, Sicherheitsproblemen, Desynchronisation (Code wird nur an einer Stelle verändert, aber nicht an einer anderen), usw. erhöht. Unsere Modelle teilen alle eine Menge der Daten und verdoppeln Attribut-Namen und -Typen. Das können wir besser machen. Wir deklarieren ein `UserBase`-Modell, das als Basis für unsere anderen Modelle dient. Dann können wir Unterklassen erstellen, die seine Attribute (Typdeklarationen, Validierungen, usw.) erben. Die ganze Datenkonvertierung, -validierung, -dokumentation, usw. wird immer noch wie gehabt funktionieren. Auf diese Weise beschreiben wir nur noch die Unterschiede zwischen den Modellen (mit Klartext-`password`, mit `hashed_password`, und ohne Passwort): === "Python 3.10+" ```Python hl_lines="7 13-14 17-18 21-22" {!> ../../../docs_src/extra_models/tutorial002_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="9 15-16 19-20 23-24" {!> ../../../docs_src/extra_models/tutorial002.py!} ``` ## `Union`, oder `anyOf` Sie können deklarieren, dass eine Response eine `Union` mehrerer Typen ist, sprich, einer dieser Typen. Das wird in OpenAPI mit `anyOf` angezeigt. Um das zu tun, verwenden Sie Pythons Standard-Typhinweis `typing.Union`: !!! note "Hinweis" Listen Sie, wenn Sie eine `Union` definieren, denjenigen Typ zuerst, der am spezifischsten ist, gefolgt von den weniger spezifischen Typen. Im Beispiel oben, in `Union[PlaneItem, CarItem]` also den spezifischeren `PlaneItem` vor dem weniger spezifischen `CarItem`. === "Python 3.10+" ```Python hl_lines="1 14-15 18-20 33" {!> ../../../docs_src/extra_models/tutorial003_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="1 14-15 18-20 33" {!> ../../../docs_src/extra_models/tutorial003.py!} ``` ### `Union` in Python 3.10 In diesem Beispiel übergeben wir dem Argument `response_model` den Wert `Union[PlaneItem, CarItem]`. Da wir es als **Wert einem Argument überreichen**, statt es als **Typannotation** zu verwenden, müssen wir `Union` verwenden, selbst in Python 3.10. Wenn es eine Typannotation gewesen wäre, hätten wir auch den vertikalen Trennstrich verwenden können, wie in: ```Python some_variable: PlaneItem | CarItem ``` Aber wenn wir das in der Zuweisung `response_model=PlaneItem | CarItem` machen, erhalten wir eine Fehlermeldung, da Python versucht, eine **ungültige Operation** zwischen `PlaneItem` und `CarItem` durchzuführen, statt es als Typannotation zu interpretieren. ## Listen von Modellen Genauso können Sie eine Response deklarieren, die eine Liste von Objekten ist. Verwenden Sie dafür Pythons Standard `typing.List` (oder nur `list` in Python 3.9 und darüber): === "Python 3.9+" ```Python hl_lines="18" {!> ../../../docs_src/extra_models/tutorial004_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1 20" {!> ../../../docs_src/extra_models/tutorial004.py!} ``` ## Response mit beliebigem `dict` Sie könne auch eine Response deklarieren, die ein beliebiges `dict` zurückgibt, bei dem nur die Typen der Schlüssel und der Werte bekannt sind, ohne ein Pydantic-Modell zu verwenden. Das ist nützlich, wenn Sie die gültigen Feld-/Attribut-Namen von vorneherein nicht wissen (was für ein Pydantic-Modell notwendig ist). In diesem Fall können Sie `typing.Dict` verwenden (oder nur `dict` in Python 3.9 und darüber): === "Python 3.9+" ```Python hl_lines="6" {!> ../../../docs_src/extra_models/tutorial005_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1 8" {!> ../../../docs_src/extra_models/tutorial005.py!} ``` ## Zusammenfassung Verwenden Sie gerne mehrere Pydantic-Modelle und vererben Sie je nach Bedarf. Sie brauchen kein einzelnes Datenmodell pro Einheit, wenn diese Einheit verschiedene Zustände annehmen kann. So wie unsere Benutzer-„Einheit“, welche einen Zustand mit `password`, einen mit `password_hash` und einen ohne Passwort hatte. fastapi-0.110.3/docs/de/docs/tutorial/first-steps.md000066400000000000000000000250231461403617600222350ustar00rootroot00000000000000# Erste Schritte Die einfachste FastAPI-Datei könnte wie folgt aussehen: ```Python {!../../../docs_src/first_steps/tutorial001.py!} ``` Kopieren Sie dies in eine Datei `main.py`. Starten Sie den Live-Server:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [28720] INFO: Started server process [28722] INFO: Waiting for application startup. INFO: Application startup complete. ```
!!! note "Hinweis" Der Befehl `uvicorn main:app` bezieht sich auf: * `main`: die Datei `main.py` (das sogenannte Python-„Modul“). * `app`: das Objekt, welches in der Datei `main.py` mit der Zeile `app = FastAPI()` erzeugt wurde. * `--reload`: lässt den Server nach Codeänderungen neu starten. Verwenden Sie das nur während der Entwicklung. In der Konsolenausgabe sollte es eine Zeile geben, die ungefähr so aussieht: ```hl_lines="4" INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` Diese Zeile zeigt die URL, unter der Ihre Anwendung auf Ihrem lokalen Computer bereitgestellt wird. ### Testen Sie es Öffnen Sie Ihren Browser unter http://127.0.0.1:8000. Sie werden folgende JSON-Response sehen: ```JSON {"message": "Hello World"} ``` ### Interaktive API-Dokumentation Gehen Sie als Nächstes auf http://127.0.0.1:8000/docs . Sie werden die automatisch erzeugte, interaktive API-Dokumentation sehen (bereitgestellt durch Swagger UI): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Alternative API-Dokumentation Gehen Sie nun auf http://127.0.0.1:8000/redoc. Dort sehen Sie die alternative, automatische Dokumentation (bereitgestellt durch ReDoc): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ### OpenAPI **FastAPI** generiert ein „Schema“ mit all Ihren APIs unter Verwendung des **OpenAPI**-Standards zur Definition von APIs. #### „Schema“ Ein „Schema“ ist eine Definition oder Beschreibung von etwas. Nicht der eigentliche Code, der es implementiert, sondern lediglich eine abstrakte Beschreibung. #### API-„Schema“ In diesem Fall ist OpenAPI eine Spezifikation, die vorschreibt, wie ein Schema für Ihre API zu definieren ist. Diese Schemadefinition enthält Ihre API-Pfade, die möglichen Parameter, welche diese entgegennehmen, usw. #### Daten-„Schema“ Der Begriff „Schema“ kann sich auch auf die Form von Daten beziehen, wie z. B. einen JSON-Inhalt. In diesem Fall sind die JSON-Attribute und deren Datentypen, usw. gemeint. #### OpenAPI und JSON Schema OpenAPI definiert ein API-Schema für Ihre API. Dieses Schema enthält Definitionen (oder „Schemas“) der Daten, die von Ihrer API unter Verwendung von **JSON Schema**, dem Standard für JSON-Datenschemata, gesendet und empfangen werden. #### Überprüfen Sie die `openapi.json` Falls Sie wissen möchten, wie das rohe OpenAPI-Schema aussieht: FastAPI generiert automatisch ein JSON (Schema) mit den Beschreibungen Ihrer gesamten API. Sie können es direkt einsehen unter: http://127.0.0.1:8000/openapi.json. Es wird ein JSON angezeigt, welches ungefähr so aussieht: ```JSON { "openapi": "3.1.0", "info": { "title": "FastAPI", "version": "0.1.0" }, "paths": { "/items/": { "get": { "responses": { "200": { "description": "Successful Response", "content": { "application/json": { ... ``` #### Wofür OpenAPI gedacht ist Das OpenAPI-Schema ist die Grundlage für die beiden enthaltenen interaktiven Dokumentationssysteme. Es gibt dutzende Alternativen, die alle auf OpenAPI basieren. Sie können jede dieser Alternativen problemlos zu Ihrer mit **FastAPI** erstellten Anwendung hinzufügen. Ebenfalls können Sie es verwenden, um automatisch Code für Clients zu generieren, die mit Ihrer API kommunizieren. Zum Beispiel für Frontend-, Mobile- oder IoT-Anwendungen. ## Rückblick, Schritt für Schritt ### Schritt 1: Importieren von `FastAPI` ```Python hl_lines="1" {!../../../docs_src/first_steps/tutorial001.py!} ``` `FastAPI` ist eine Python-Klasse, die die gesamte Funktionalität für Ihre API bereitstellt. !!! note "Technische Details" `FastAPI` ist eine Klasse, die direkt von `Starlette` erbt. Sie können alle Starlette-Funktionalitäten auch mit `FastAPI` nutzen. ### Schritt 2: Erzeugen einer `FastAPI`-„Instanz“ ```Python hl_lines="3" {!../../../docs_src/first_steps/tutorial001.py!} ``` In diesem Beispiel ist die Variable `app` eine „Instanz“ der Klasse `FastAPI`. Dies wird der Hauptinteraktionspunkt für die Erstellung all Ihrer APIs sein. Die Variable `app` ist dieselbe, auf die sich der Befehl `uvicorn` bezieht:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
Wenn Sie Ihre Anwendung wie folgt erstellen: ```Python hl_lines="3" {!../../../docs_src/first_steps/tutorial002.py!} ``` Und in eine Datei `main.py` einfügen, dann würden Sie `uvicorn` wie folgt aufrufen:
```console $ uvicorn main:my_awesome_api --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
### Schritt 3: Erstellen einer *Pfadoperation* #### Pfad „Pfad“ bezieht sich hier auf den letzten Teil der URL, beginnend mit dem ersten `/`. In einer URL wie: ``` https://example.com/items/foo ``` ... wäre der Pfad folglich: ``` /items/foo ``` !!! info Ein „Pfad“ wird häufig auch als „Endpunkt“ oder „Route“ bezeichnet. Bei der Erstellung einer API ist der „Pfad“ die wichtigste Möglichkeit zur Trennung von „Anliegen“ und „Ressourcen“. #### Operation „Operation“ bezieht sich hier auf eine der HTTP-„Methoden“. Eine von diesen: * `POST` * `GET` * `PUT` * `DELETE` ... und die etwas Exotischeren: * `OPTIONS` * `HEAD` * `PATCH` * `TRACE` Im HTTP-Protokoll können Sie mit jedem Pfad über eine (oder mehrere) dieser „Methoden“ kommunizieren. --- Bei der Erstellung von APIs verwenden Sie normalerweise diese spezifischen HTTP-Methoden, um eine bestimmte Aktion durchzuführen. Normalerweise verwenden Sie: * `POST`: um Daten zu erzeugen (create). * `GET`: um Daten zu lesen (read). * `PUT`: um Daten zu aktualisieren (update). * `DELETE`: um Daten zu löschen (delete). In OpenAPI wird folglich jede dieser HTTP-Methoden als „Operation“ bezeichnet. Wir werden sie auch „**Operationen**“ nennen. #### Definieren eines *Pfadoperation-Dekorators* ```Python hl_lines="6" {!../../../docs_src/first_steps/tutorial001.py!} ``` Das `@app.get("/")` sagt **FastAPI**, dass die Funktion direkt darunter für die Bearbeitung von Anfragen zuständig ist, die an: * den Pfad `/` * unter der Verwendung der get-Operation gehen !!! info "`@decorator` Information" Diese `@something`-Syntax wird in Python „Dekorator“ genannt. Sie platzieren ihn über einer Funktion. Wie ein hübscher, dekorativer Hut (daher kommt wohl der Begriff). Ein „Dekorator“ nimmt die darunter stehende Funktion und macht etwas damit. In unserem Fall teilt dieser Dekorator **FastAPI** mit, dass die folgende Funktion mit dem **Pfad** `/` und der **Operation** `get` zusammenhängt. Dies ist der „**Pfadoperation-Dekorator**“. Sie können auch die anderen Operationen verwenden: * `@app.post()` * `@app.put()` * `@app.delete()` Oder die exotischeren: * `@app.options()` * `@app.head()` * `@app.patch()` * `@app.trace()` !!! tip "Tipp" Es steht Ihnen frei, jede Operation (HTTP-Methode) so zu verwenden, wie Sie es möchten. **FastAPI** erzwingt keine bestimmte Bedeutung. Die hier aufgeführten Informationen dienen als Leitfaden und sind nicht verbindlich. Wenn Sie beispielsweise GraphQL verwenden, führen Sie normalerweise alle Aktionen nur mit „POST“-Operationen durch. ### Schritt 4: Definieren der **Pfadoperation-Funktion** Das ist unsere „**Pfadoperation-Funktion**“: * **Pfad**: ist `/`. * **Operation**: ist `get`. * **Funktion**: ist die Funktion direkt unter dem „Dekorator“ (unter `@app.get("/")`). ```Python hl_lines="7" {!../../../docs_src/first_steps/tutorial001.py!} ``` Dies ist eine Python-Funktion. Sie wird von **FastAPI** immer dann aufgerufen, wenn sie eine Anfrage an die URL "`/`" mittels einer `GET`-Operation erhält. In diesem Fall handelt es sich um eine `async`-Funktion. --- Sie könnten sie auch als normale Funktion anstelle von `async def` definieren: ```Python hl_lines="7" {!../../../docs_src/first_steps/tutorial003.py!} ``` !!! note "Hinweis" Wenn Sie den Unterschied nicht kennen, lesen Sie [Async: *„In Eile?“*](../async.md#in-eile){.internal-link target=_blank}. ### Schritt 5: den Inhalt zurückgeben ```Python hl_lines="8" {!../../../docs_src/first_steps/tutorial001.py!} ``` Sie können ein `dict`, eine `list`, einzelne Werte wie `str`, `int`, usw. zurückgeben. Sie können auch Pydantic-Modelle zurückgeben (dazu später mehr). Es gibt viele andere Objekte und Modelle, die automatisch zu JSON konvertiert werden (einschließlich ORMs usw.). Versuchen Sie, Ihre Lieblingsobjekte zu verwenden. Es ist sehr wahrscheinlich, dass sie bereits unterstützt werden. ## Zusammenfassung * Importieren Sie `FastAPI`. * Erstellen Sie eine `app` Instanz. * Schreiben Sie einen **Pfadoperation-Dekorator** (wie z. B. `@app.get("/")`). * Schreiben Sie eine **Pfadoperation-Funktion** (wie z. B. oben `def root(): ...`). * Starten Sie den Entwicklungsserver (z. B. `uvicorn main:app --reload`). fastapi-0.110.3/docs/de/docs/tutorial/handling-errors.md000066400000000000000000000251521461403617600230530ustar00rootroot00000000000000# Fehlerbehandlung Es gibt viele Situationen, in denen Sie einem Client, der Ihre API benutzt, einen Fehler zurückgeben müssen. Dieser Client könnte ein Browser mit einem Frontend, Code von jemand anderem, ein IoT-Gerät, usw., sein. Sie müssten beispielsweise einem Client sagen: * Dass er nicht die notwendigen Berechtigungen hat, eine Aktion auszuführen. * Dass er zu einer Ressource keinen Zugriff hat. * Dass die Ressource, auf die er zugreifen möchte, nicht existiert. * usw. In diesen Fällen geben Sie normalerweise einen **HTTP-Statuscode** im Bereich **400** (400 bis 499) zurück. Das ist vergleichbar mit den HTTP-Statuscodes im Bereich 200 (von 200 bis 299). Diese „200“er Statuscodes bedeuten, dass der Request in einem bestimmten Aspekt ein „Success“ („Erfolg“) war. Die Statuscodes im 400er-Bereich bedeuten hingegen, dass es einen Fehler gab. Erinnern Sie sich an all diese **404 Not Found** Fehler (und Witze)? ## `HTTPException` verwenden Um HTTP-Responses mit Fehlern zum Client zurückzugeben, verwenden Sie `HTTPException`. ### `HTTPException` importieren ```Python hl_lines="1" {!../../../docs_src/handling_errors/tutorial001.py!} ``` ### Eine `HTTPException` in Ihrem Code auslösen `HTTPException` ist eine normale Python-Exception mit einigen zusätzlichen Daten, die für APIs relevant sind. Weil es eine Python-Exception ist, geben Sie sie nicht zurück, (`return`), sondern Sie lösen sie aus (`raise`). Das bedeutet auch, wenn Sie in einer Hilfsfunktion sind, die Sie von ihrer *Pfadoperation-Funktion* aus aufrufen, und Sie lösen eine `HTTPException` von innerhalb dieser Hilfsfunktion aus, dann wird der Rest der *Pfadoperation-Funktion* nicht ausgeführt, sondern der Request wird sofort abgebrochen und der HTTP-Error der `HTTP-Exception` wird zum Client gesendet. Der Vorteil, eine Exception auszulösen (`raise`), statt sie zurückzugeben (`return`) wird im Abschnitt über Abhängigkeiten und Sicherheit klarer werden. Im folgenden Beispiel lösen wir, wenn der Client eine ID anfragt, die nicht existiert, eine Exception mit dem Statuscode `404` aus. ```Python hl_lines="11" {!../../../docs_src/handling_errors/tutorial001.py!} ``` ### Die resultierende Response Wenn der Client `http://example.com/items/foo` anfragt (ein `item_id` `"foo"`), erhält dieser Client einen HTTP-Statuscode 200 und folgende JSON-Response: ```JSON { "item": "The Foo Wrestlers" } ``` Aber wenn der Client `http://example.com/items/bar` anfragt (ein nicht-existierendes `item_id` `"bar"`), erhält er einen HTTP-Statuscode 404 (der „Not Found“-Fehler), und eine JSON-Response wie folgt: ```JSON { "detail": "Item not found" } ``` !!! tip "Tipp" Wenn Sie eine `HTTPException` auslösen, können Sie dem Parameter `detail` jeden Wert übergeben, der nach JSON konvertiert werden kann, nicht nur `str`. Zum Beispiel ein `dict`, eine `list`, usw. Das wird automatisch von **FastAPI** gehandhabt und der Wert nach JSON konvertiert. ## Benutzerdefinierte Header hinzufügen Es gibt Situationen, da ist es nützlich, dem HTTP-Error benutzerdefinierte Header hinzufügen zu können, etwa in einigen Sicherheitsszenarien. Sie müssen das wahrscheinlich nicht direkt in ihrem Code verwenden. Aber falls es in einem fortgeschrittenen Szenario notwendig ist, können Sie benutzerdefinierte Header wie folgt hinzufügen: ```Python hl_lines="14" {!../../../docs_src/handling_errors/tutorial002.py!} ``` ## Benutzerdefinierte Exceptionhandler definieren Sie können benutzerdefinierte Exceptionhandler hinzufügen, mithilfe derselben Werkzeuge für Exceptions von Starlette. Nehmen wir an, Sie haben eine benutzerdefinierte Exception `UnicornException`, die Sie (oder eine Bibliothek, die Sie verwenden) `raise`n könnten. Und Sie möchten diese Exception global mit FastAPI handhaben. Sie könnten einen benutzerdefinierten Exceptionhandler mittels `@app.exception_handler()` hinzufügen: ```Python hl_lines="5-7 13-18 24" {!../../../docs_src/handling_errors/tutorial003.py!} ``` Wenn Sie nun `/unicorns/yolo` anfragen, `raise`d die *Pfadoperation* eine `UnicornException`. Aber diese wird von `unicorn_exception_handler` gehandhabt. Sie erhalten also einen sauberen Error mit einem Statuscode `418` und dem JSON-Inhalt: ```JSON {"message": "Oops! yolo did something. There goes a rainbow..."} ``` !!! note "Technische Details" Sie können auch `from starlette.requests import Request` und `from starlette.responses import JSONResponse` verwenden. **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette. Das Gleiche gilt für `Request`. ## Die Default-Exceptionhandler überschreiben **FastAPI** hat einige Default-Exceptionhandler. Diese Handler kümmern sich darum, Default-JSON-Responses zurückzugeben, wenn Sie eine `HTTPException` `raise`n, und wenn der Request ungültige Daten enthält. Sie können diese Exceptionhandler mit ihren eigenen überschreiben. ### Requestvalidierung-Exceptions überschreiben Wenn ein Request ungültige Daten enthält, löst **FastAPI** intern einen `RequestValidationError` aus. Und bietet auch einen Default-Exceptionhandler dafür. Um diesen zu überschreiben, importieren Sie den `RequestValidationError` und verwenden Sie ihn in `@app.exception_handler(RequestValidationError)`, um Ihren Exceptionhandler zu dekorieren. Der Exceptionhandler wird einen `Request` und die Exception entgegennehmen. ```Python hl_lines="2 14-16" {!../../../docs_src/handling_errors/tutorial004.py!} ``` Wenn Sie nun `/items/foo` besuchen, erhalten Sie statt des Default-JSON-Errors: ```JSON { "detail": [ { "loc": [ "path", "item_id" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ] } ``` eine Textversion: ``` 1 validation error path -> item_id value is not a valid integer (type=type_error.integer) ``` #### `RequestValidationError` vs. `ValidationError` !!! warning "Achtung" Das folgende sind technische Details, die Sie überspringen können, wenn sie für Sie nicht wichtig sind. `RequestValidationError` ist eine Unterklasse von Pydantics `ValidationError`. **FastAPI** verwendet diesen, sodass Sie, wenn Sie ein Pydantic-Modell für `response_model` verwenden, und ihre Daten fehlerhaft sind, einen Fehler in ihrem Log sehen. Aber der Client/Benutzer sieht ihn nicht. Stattdessen erhält der Client einen „Internal Server Error“ mit einem HTTP-Statuscode `500`. Das ist, wie es sein sollte, denn wenn Sie einen Pydantic-`ValidationError` in Ihrer *Response* oder irgendwo sonst in ihrem Code haben (es sei denn, im *Request* des Clients), ist das tatsächlich ein Bug in ihrem Code. Und während Sie den Fehler beheben, sollten ihre Clients/Benutzer keinen Zugriff auf interne Informationen über den Fehler haben, da das eine Sicherheitslücke aufdecken könnte. ### den `HTTPException`-Handler überschreiben Genauso können Sie den `HTTPException`-Handler überschreiben. Zum Beispiel könnten Sie eine Klartext-Response statt JSON für diese Fehler zurückgeben wollen: ```Python hl_lines="3-4 9-11 22" {!../../../docs_src/handling_errors/tutorial004.py!} ``` !!! note "Technische Details" Sie können auch `from starlette.responses import PlainTextResponse` verwenden. **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette. ### Den `RequestValidationError`-Body verwenden Der `RequestValidationError` enthält den empfangenen `body` mit den ungültigen Daten. Sie könnten diesen verwenden, während Sie Ihre Anwendung entwickeln, um den Body zu loggen und zu debuggen, ihn zum Benutzer zurückzugeben, usw. ```Python hl_lines="14" {!../../../docs_src/handling_errors/tutorial005.py!} ``` Jetzt versuchen Sie, einen ungültigen Artikel zu senden: ```JSON { "title": "towel", "size": "XL" } ``` Sie erhalten eine Response, die Ihnen sagt, dass die Daten ungültig sind, und welche den empfangenen Body enthält. ```JSON hl_lines="12-15" { "detail": [ { "loc": [ "body", "size" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ], "body": { "title": "towel", "size": "XL" } } ``` #### FastAPIs `HTTPException` vs. Starlettes `HTTPException` **FastAPI** hat seine eigene `HTTPException`. Und **FastAPI**s `HTTPException`-Fehlerklasse erbt von Starlettes `HTTPException`-Fehlerklasse. Der einzige Unterschied besteht darin, dass **FastAPIs** `HTTPException` alles für das Feld `detail` akzeptiert, was nach JSON konvertiert werden kann, während Starlettes `HTTPException` nur Strings zulässt. Sie können also weiterhin **FastAPI**s `HTTPException` wie üblich in Ihrem Code auslösen. Aber wenn Sie einen Exceptionhandler registrieren, registrieren Sie ihn für Starlettes `HTTPException`. Auf diese Weise wird Ihr Handler, wenn irgendein Teil von Starlettes internem Code, oder eine Starlette-Erweiterung, oder -Plugin eine Starlette-`HTTPException` auslöst, in der Lage sein, diese zu fangen und zu handhaben. Damit wir in diesem Beispiel beide `HTTPException`s im selben Code haben können, benennen wir Starlettes Exception um zu `StarletteHTTPException`: ```Python from starlette.exceptions import HTTPException as StarletteHTTPException ``` ### **FastAPI**s Exceptionhandler wiederverwenden Wenn Sie die Exception zusammen mit denselben Default-Exceptionhandlern von **FastAPI** verwenden möchten, können Sie die Default-Exceptionhandler von `fastapi.Exception_handlers` importieren und wiederverwenden: ```Python hl_lines="2-5 15 21" {!../../../docs_src/handling_errors/tutorial006.py!} ``` In diesem Beispiel `print`en Sie nur den Fehler mit einer sehr ausdrucksstarken Nachricht, aber Sie sehen, worauf wir hinauswollen. Sie können mit der Exception etwas machen und dann einfach die Default-Exceptionhandler wiederverwenden. fastapi-0.110.3/docs/de/docs/tutorial/header-params.md000066400000000000000000000146601461403617600224700ustar00rootroot00000000000000# Header-Parameter So wie `Query`-, `Path`-, und `Cookie`-Parameter können Sie auch Header-Parameter definieren. ## `Header` importieren Importieren Sie zuerst `Header`: === "Python 3.10+" ```Python hl_lines="3" {!> ../../../docs_src/header_params/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="3" {!> ../../../docs_src/header_params/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="3" {!> ../../../docs_src/header_params/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="1" {!> ../../../docs_src/header_params/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="3" {!> ../../../docs_src/header_params/tutorial001.py!} ``` ## `Header`-Parameter deklarieren Dann deklarieren Sie Ihre Header-Parameter, auf die gleiche Weise, wie Sie auch `Path`-, `Query`-, und `Cookie`-Parameter deklarieren. Der erste Wert ist der Typ. Sie können `Header` die gehabten Extra Validierungs- und Beschreibungsparameter hinzufügen. Danach können Sie einen Defaultwert vergeben: === "Python 3.10+" ```Python hl_lines="9" {!> ../../../docs_src/header_params/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/header_params/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="10" {!> ../../../docs_src/header_params/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/header_params/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9" {!> ../../../docs_src/header_params/tutorial001.py!} ``` !!! note "Technische Details" `Header` ist eine Schwesterklasse von `Path`, `Query` und `Cookie`. Sie erbt von derselben gemeinsamen `Param`-Elternklasse. Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `Header` und andere von `fastapi` importieren, diese tatsächlich Funktionen sind, welche spezielle Klassen zurückgeben. !!! info Um Header zu deklarieren, müssen Sie `Header` verwenden, da diese Parameter sonst als Query-Parameter interpretiert werden würden. ## Automatische Konvertierung `Header` hat weitere Funktionalität, zusätzlich zu der, die `Path`, `Query` und `Cookie` bereitstellen. Die meisten Standard-Header benutzen als Trennzeichen einen Bindestrich, auch bekannt als das „Minus-Symbol“ (`-`). Aber eine Variable wie `user-agent` ist in Python nicht gültig. Darum wird `Header` standardmäßig in Parameternamen den Unterstrich (`_`) zu einem Bindestrich (`-`) konvertieren. HTTP-Header sind außerdem unabhängig von Groß-/Kleinschreibung, darum können Sie sie mittels der Standard-Python-Schreibweise deklarieren (auch bekannt als "snake_case"). Sie können also `user_agent` schreiben, wie Sie es normalerweise in Python-Code machen würden, statt etwa die ersten Buchstaben groß zu schreiben, wie in `User_Agent`. Wenn Sie aus irgendeinem Grund das automatische Konvertieren von Unterstrichen zu Bindestrichen abschalten möchten, setzen Sie den Parameter `convert_underscores` auf `False`. === "Python 3.10+" ```Python hl_lines="10" {!> ../../../docs_src/header_params/tutorial002_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="11" {!> ../../../docs_src/header_params/tutorial002_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="12" {!> ../../../docs_src/header_params/tutorial002_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="8" {!> ../../../docs_src/header_params/tutorial002_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="10" {!> ../../../docs_src/header_params/tutorial002.py!} ``` !!! warning "Achtung" Bevor Sie `convert_underscores` auf `False` setzen, bedenken Sie, dass manche HTTP-Proxys und Server die Verwendung von Headern mit Unterstrichen nicht erlauben. ## Doppelte Header Es ist möglich, doppelte Header zu empfangen. Also den gleichen Header mit unterschiedlichen Werten. Sie können solche Fälle deklarieren, indem Sie in der Typdeklaration eine Liste verwenden. Sie erhalten dann alle Werte von diesem doppelten Header als Python-`list`e. Um zum Beispiel einen Header `X-Token` zu deklarieren, der mehrmals vorkommen kann, schreiben Sie: === "Python 3.10+" ```Python hl_lines="9" {!> ../../../docs_src/header_params/tutorial003_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/header_params/tutorial003_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="10" {!> ../../../docs_src/header_params/tutorial003_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/header_params/tutorial003_py310.py!} ``` === "Python 3.9+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9" {!> ../../../docs_src/header_params/tutorial003_py39.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9" {!> ../../../docs_src/header_params/tutorial003.py!} ``` Wenn Sie mit einer *Pfadoperation* kommunizieren, die zwei HTTP-Header sendet, wie: ``` X-Token: foo X-Token: bar ``` Dann wäre die Response: ```JSON { "X-Token values": [ "bar", "foo" ] } ``` ## Zusammenfassung Deklarieren Sie Header mittels `Header`, auf die gleiche Weise wie bei `Query`, `Path` und `Cookie`. Machen Sie sich keine Sorgen um Unterstriche in ihren Variablen, **FastAPI** wird sich darum kümmern, diese zu konvertieren. fastapi-0.110.3/docs/de/docs/tutorial/index.md000066400000000000000000000061121461403617600210570ustar00rootroot00000000000000# Tutorial – Benutzerhandbuch Dieses Tutorial zeigt Ihnen Schritt für Schritt, wie Sie **FastAPI** und die meisten seiner Funktionen verwenden können. Jeder Abschnitt baut schrittweise auf den vorhergehenden auf. Diese Abschnitte sind aber nach einzelnen Themen gegliedert, sodass Sie direkt zu einem bestimmten Thema übergehen können, um Ihre speziellen API-Anforderungen zu lösen. Außerdem dienen diese als zukünftige Referenz. Dadurch können Sie jederzeit zurückkommen und sehen genau das, was Sie benötigen. ## Den Code ausführen Alle Codeblöcke können kopiert und direkt verwendet werden (da es sich um getestete Python-Dateien handelt). Um eines der Beispiele auszuführen, kopieren Sie den Code in eine Datei `main.py`, und starten Sie `uvicorn` mit:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [28720] INFO: Started server process [28722] INFO: Waiting for application startup. INFO: Application startup complete. ```
Es wird **ausdrücklich empfohlen**, dass Sie den Code schreiben oder kopieren, ihn bearbeiten und lokal ausführen. Die Verwendung in Ihrem eigenen Editor zeigt Ihnen die Vorteile von FastAPI am besten, wenn Sie sehen, wie wenig Code Sie schreiben müssen, all die Typprüfungen, die automatische Vervollständigung usw. --- ## FastAPI installieren Der erste Schritt besteht aus der Installation von FastAPI. Für dieses Tutorial empfiehlt es sich, FastAPI mit allen optionalen Abhängigkeiten und Funktionen zu installieren:
```console $ pip install "fastapi[all]" ---> 100% ```
... das beinhaltet auch `uvicorn`, welchen Sie als Server verwenden können, der ihren Code ausführt. !!! note "Hinweis" Sie können die einzelnen Teile auch separat installieren. Das folgende würden Sie wahrscheinlich tun, wenn Sie Ihre Anwendung in der Produktion einsetzen: ``` pip install fastapi ``` Installieren Sie auch `uvicorn` als Server: ``` pip install "uvicorn[standard]" ``` Das gleiche gilt für jede der optionalen Abhängigkeiten, die Sie verwenden möchten. ## Handbuch für fortgeschrittene Benutzer Es gibt auch ein **Handbuch für fortgeschrittene Benutzer**, welches Sie später nach diesem **Tutorial – Benutzerhandbuch** lesen können. Das **Handbuch für fortgeschrittene Benutzer** baut auf diesem Tutorial auf, verwendet dieselben Konzepte und bringt Ihnen einige zusätzliche Funktionen bei. Allerdings sollten Sie zuerst das **Tutorial – Benutzerhandbuch** lesen (was Sie hier gerade tun). Die Dokumentation ist so konzipiert, dass Sie mit dem **Tutorial – Benutzerhandbuch** eine vollständige Anwendung erstellen können und diese dann je nach Bedarf mit einigen der zusätzlichen Ideen aus dem **Handbuch für fortgeschrittene Benutzer** vervollständigen können. fastapi-0.110.3/docs/de/docs/tutorial/metadata.md000066400000000000000000000152161461403617600215350ustar00rootroot00000000000000# Metadaten und URLs der Dokumentationen Sie können mehrere Metadaten-Einstellungen für Ihre **FastAPI**-Anwendung konfigurieren. ## Metadaten für die API Sie können die folgenden Felder festlegen, welche in der OpenAPI-Spezifikation und den Benutzeroberflächen der automatischen API-Dokumentation verwendet werden: | Parameter | Typ | Beschreibung | |------------|------|-------------| | `title` | `str` | Der Titel der API. | | `summary` | `str` | Eine kurze Zusammenfassung der API. Verfügbar seit OpenAPI 3.1.0, FastAPI 0.99.0. | | `description` | `str` | Eine kurze Beschreibung der API. Kann Markdown verwenden. | | `version` | `string` | Die Version der API. Das ist die Version Ihrer eigenen Anwendung, nicht die von OpenAPI. Zum Beispiel `2.5.0`. | | `terms_of_service` | `str` | Eine URL zu den Nutzungsbedingungen für die API. Falls angegeben, muss es sich um eine URL handeln. | | `contact` | `dict` | Die Kontaktinformationen für die verfügbar gemachte API. Kann mehrere Felder enthalten.
contact-Felder
ParameterTypBeschreibung
namestrDer identifizierende Name der Kontaktperson/Organisation.
urlstrDie URL, die auf die Kontaktinformationen verweist. MUSS im Format einer URL vorliegen.
emailstrDie E-Mail-Adresse der Kontaktperson/Organisation. MUSS im Format einer E-Mail-Adresse vorliegen.
| | `license_info` | `dict` | Die Lizenzinformationen für die verfügbar gemachte API. Kann mehrere Felder enthalten.
license_info-Felder
ParameterTypBeschreibung
namestrERFORDERLICH (wenn eine license_info festgelegt ist). Der für die API verwendete Lizenzname.
identifierstrEin SPDX-Lizenzausdruck für die API. Das Feld identifier und das Feld url schließen sich gegenseitig aus. Verfügbar seit OpenAPI 3.1.0, FastAPI 0.99.0.
urlstrEine URL zur Lizenz, die für die API verwendet wird. MUSS im Format einer URL vorliegen.
| Sie können diese wie folgt setzen: ```Python hl_lines="3-16 19-32" {!../../../docs_src/metadata/tutorial001.py!} ``` !!! tip "Tipp" Sie können Markdown in das Feld `description` schreiben und es wird in der Ausgabe gerendert. Mit dieser Konfiguration würde die automatische API-Dokumentation wie folgt aussehen: ## Lizenz-ID Seit OpenAPI 3.1.0 und FastAPI 0.99.0 können Sie die `license_info` auch mit einem `identifier` anstelle einer `url` festlegen. Zum Beispiel: ```Python hl_lines="31" {!../../../docs_src/metadata/tutorial001_1.py!} ``` ## Metadaten für Tags Sie können mit dem Parameter `openapi_tags` auch zusätzliche Metadaten für die verschiedenen Tags hinzufügen, die zum Gruppieren Ihrer Pfadoperationen verwendet werden. Es wird eine Liste benötigt, die für jedes Tag ein Dict enthält. Jedes Dict kann Folgendes enthalten: * `name` (**erforderlich**): ein `str` mit demselben Tag-Namen, den Sie im Parameter `tags` in Ihren *Pfadoperationen* und `APIRouter`n verwenden. * `description`: ein `str` mit einer kurzen Beschreibung für das Tag. Sie kann Markdown enthalten und wird in der Benutzeroberfläche der Dokumentation angezeigt. * `externalDocs`: ein `dict`, das externe Dokumentation beschreibt mit: * `description`: ein `str` mit einer kurzen Beschreibung für die externe Dokumentation. * `url` (**erforderlich**): ein `str` mit der URL für die externe Dokumentation. ### Metadaten für Tags erstellen Versuchen wir das an einem Beispiel mit Tags für `users` und `items`. Erstellen Sie Metadaten für Ihre Tags und übergeben Sie sie an den Parameter `openapi_tags`: ```Python hl_lines="3-16 18" {!../../../docs_src/metadata/tutorial004.py!} ``` Beachten Sie, dass Sie Markdown in den Beschreibungen verwenden können. Beispielsweise wird „login“ in Fettschrift (**login**) und „fancy“ in Kursivschrift (_fancy_) angezeigt. !!! tip "Tipp" Sie müssen nicht für alle von Ihnen verwendeten Tags Metadaten hinzufügen. ### Ihre Tags verwenden Verwenden Sie den Parameter `tags` mit Ihren *Pfadoperationen* (und `APIRouter`n), um diese verschiedenen Tags zuzuweisen: ```Python hl_lines="21 26" {!../../../docs_src/metadata/tutorial004.py!} ``` !!! info Lesen Sie mehr zu Tags unter [Pfadoperation-Konfiguration](path-operation-configuration.md#tags){.internal-link target=_blank}. ### Die Dokumentation anschauen Wenn Sie nun die Dokumentation ansehen, werden dort alle zusätzlichen Metadaten angezeigt: ### Reihenfolge der Tags Die Reihenfolge der Tag-Metadaten-Dicts definiert auch die Reihenfolge, in der diese in der Benutzeroberfläche der Dokumentation angezeigt werden. Auch wenn beispielsweise `users` im Alphabet nach `items` kommt, wird es vor diesen angezeigt, da wir seine Metadaten als erstes Dict der Liste hinzugefügt haben. ## OpenAPI-URL Standardmäßig wird das OpenAPI-Schema unter `/openapi.json` bereitgestellt. Sie können das aber mit dem Parameter `openapi_url` konfigurieren. Um beispielsweise festzulegen, dass es unter `/api/v1/openapi.json` bereitgestellt wird: ```Python hl_lines="3" {!../../../docs_src/metadata/tutorial002.py!} ``` Wenn Sie das OpenAPI-Schema vollständig deaktivieren möchten, können Sie `openapi_url=None` festlegen, wodurch auch die Dokumentationsbenutzeroberflächen deaktiviert werden, die es verwenden. ## URLs der Dokumentationen Sie können die beiden enthaltenen Dokumentationsbenutzeroberflächen konfigurieren: * **Swagger UI**: bereitgestellt unter `/docs`. * Sie können deren URL mit dem Parameter `docs_url` festlegen. * Sie können sie deaktivieren, indem Sie `docs_url=None` festlegen. * **ReDoc**: bereitgestellt unter `/redoc`. * Sie können deren URL mit dem Parameter `redoc_url` festlegen. * Sie können sie deaktivieren, indem Sie `redoc_url=None` festlegen. Um beispielsweise Swagger UI so einzustellen, dass sie unter `/documentation` bereitgestellt wird, und ReDoc zu deaktivieren: ```Python hl_lines="3" {!../../../docs_src/metadata/tutorial003.py!} ``` fastapi-0.110.3/docs/de/docs/tutorial/middleware.md000066400000000000000000000066341461403617600220760ustar00rootroot00000000000000# Middleware Sie können Middleware zu **FastAPI**-Anwendungen hinzufügen. Eine „Middleware“ ist eine Funktion, die mit jedem **Request** arbeitet, bevor er von einer bestimmten *Pfadoperation* verarbeitet wird. Und auch mit jeder **Response**, bevor sie zurückgegeben wird. * Sie nimmt jeden **Request** entgegen, der an Ihre Anwendung gesendet wird. * Sie kann dann etwas mit diesem **Request** tun oder beliebigen Code ausführen. * Dann gibt sie den **Request** zur Verarbeitung durch den Rest der Anwendung weiter (durch eine bestimmte *Pfadoperation*). * Sie nimmt dann die **Response** entgegen, die von der Anwendung generiert wurde (durch eine bestimmte *Pfadoperation*). * Sie kann etwas mit dieser **Response** tun oder beliebigen Code ausführen. * Dann gibt sie die **Response** zurück. !!! note "Technische Details" Wenn Sie Abhängigkeiten mit `yield` haben, wird der Exit-Code *nach* der Middleware ausgeführt. Wenn es Hintergrundaufgaben gab (später dokumentiert), werden sie *nach* allen Middlewares ausgeführt. ## Erstellung einer Middleware Um eine Middleware zu erstellen, verwenden Sie den Dekorator `@app.middleware("http")` über einer Funktion. Die Middleware-Funktion erhält: * Den `request`. * Eine Funktion `call_next`, die den `request` als Parameter erhält. * Diese Funktion gibt den `request` an die entsprechende *Pfadoperation* weiter. * Dann gibt es die von der entsprechenden *Pfadoperation* generierte `response` zurück. * Sie können die `response` dann weiter modifizieren, bevor Sie sie zurückgeben. ```Python hl_lines="8-9 11 14" {!../../../docs_src/middleware/tutorial001.py!} ``` !!! tip "Tipp" Beachten Sie, dass benutzerdefinierte proprietäre Header hinzugefügt werden können. Verwenden Sie dafür das Präfix 'X-'. Wenn Sie jedoch benutzerdefinierte Header haben, die ein Client in einem Browser sehen soll, müssen Sie sie zu Ihrer CORS-Konfigurationen ([CORS (Cross-Origin Resource Sharing)](cors.md){.internal-link target=_blank}) hinzufügen, indem Sie den Parameter `expose_headers` verwenden, der in der Starlette-CORS-Dokumentation dokumentiert ist. !!! note "Technische Details" Sie könnten auch `from starlette.requests import Request` verwenden. **FastAPI** bietet es als Komfort für Sie, den Entwickler, an. Aber es stammt direkt von Starlette. ### Vor und nach der `response` Sie können Code hinzufügen, der mit dem `request` ausgeführt wird, bevor dieser von einer beliebigen *Pfadoperation* empfangen wird. Und auch nachdem die `response` generiert wurde, bevor sie zurückgegeben wird. Sie könnten beispielsweise einen benutzerdefinierten Header `X-Process-Time` hinzufügen, der die Zeit in Sekunden enthält, die benötigt wurde, um den Request zu verarbeiten und eine Response zu generieren: ```Python hl_lines="10 12-13" {!../../../docs_src/middleware/tutorial001.py!} ``` ## Andere Middlewares Sie können später mehr über andere Middlewares in [Handbuch für fortgeschrittene Benutzer: Fortgeschrittene Middleware](../advanced/middleware.md){.internal-link target=_blank} lesen. In der nächsten Sektion erfahren Sie, wie Sie CORS mit einer Middleware behandeln können. fastapi-0.110.3/docs/de/docs/tutorial/path-operation-configuration.md000066400000000000000000000136641461403617600255610ustar00rootroot00000000000000# Pfadoperation-Konfiguration Es gibt mehrere Konfigurations-Parameter, die Sie Ihrem *Pfadoperation-Dekorator* übergeben können. !!! warning "Achtung" Beachten Sie, dass diese Parameter direkt dem *Pfadoperation-Dekorator* übergeben werden, nicht der *Pfadoperation-Funktion*. ## Response-Statuscode Sie können den (HTTP-)`status_code` definieren, den die Response Ihrer *Pfadoperation* verwenden soll. Sie können direkt den `int`-Code übergeben, etwa `404`. Aber falls Sie sich nicht mehr erinnern, wofür jede Nummer steht, können Sie die Abkürzungs-Konstanten in `status` verwenden: === "Python 3.10+" ```Python hl_lines="1 15" {!> ../../../docs_src/path_operation_configuration/tutorial001_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="3 17" {!> ../../../docs_src/path_operation_configuration/tutorial001_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="3 17" {!> ../../../docs_src/path_operation_configuration/tutorial001.py!} ``` Dieser Statuscode wird in der Response verwendet und zum OpenAPI-Schema hinzugefügt. !!! note "Technische Details" Sie können auch `from starlette import status` verwenden. **FastAPI** bietet dieselben `starlette.status`-Codes auch via `fastapi.status` an, als Annehmlichkeit für Sie, den Entwickler. Sie kommen aber direkt von Starlette. ## Tags Sie können Ihrer *Pfadoperation* Tags hinzufügen, mittels des Parameters `tags`, dem eine `list`e von `str`s übergeben wird (in der Regel nur ein `str`): === "Python 3.10+" ```Python hl_lines="15 20 25" {!> ../../../docs_src/path_operation_configuration/tutorial002_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="17 22 27" {!> ../../../docs_src/path_operation_configuration/tutorial002_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="17 22 27" {!> ../../../docs_src/path_operation_configuration/tutorial002.py!} ``` Diese werden zum OpenAPI-Schema hinzugefügt und von den automatischen Dokumentations-Benutzeroberflächen verwendet: ### Tags mittels Enumeration Wenn Sie eine große Anwendung haben, können sich am Ende **viele Tags** anhäufen, und Sie möchten sicherstellen, dass Sie für verwandte *Pfadoperationen* immer den **gleichen Tag** nehmen. In diesem Fall macht es Sinn, die Tags in einem `Enum` zu speichern. **FastAPI** unterstützt diese genauso wie einfache Strings: ```Python hl_lines="1 8-10 13 18" {!../../../docs_src/path_operation_configuration/tutorial002b.py!} ``` ## Zusammenfassung und Beschreibung Sie können eine Zusammenfassung (`summary`) und eine Beschreibung (`description`) hinzufügen: === "Python 3.10+" ```Python hl_lines="18-19" {!> ../../../docs_src/path_operation_configuration/tutorial003_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="20-21" {!> ../../../docs_src/path_operation_configuration/tutorial003_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="20-21" {!> ../../../docs_src/path_operation_configuration/tutorial003.py!} ``` ## Beschreibung mittels Docstring Da Beschreibungen oft mehrere Zeilen lang sind, können Sie die Beschreibung der *Pfadoperation* im Docstring der Funktion deklarieren, und **FastAPI** wird sie daraus auslesen. Sie können im Docstring Markdown schreiben, es wird korrekt interpretiert und angezeigt (die Einrückung des Docstring beachtend). === "Python 3.10+" ```Python hl_lines="17-25" {!> ../../../docs_src/path_operation_configuration/tutorial004_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="19-27" {!> ../../../docs_src/path_operation_configuration/tutorial004_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="19-27" {!> ../../../docs_src/path_operation_configuration/tutorial004.py!} ``` In der interaktiven Dokumentation sieht das dann so aus: ## Beschreibung der Response Die Response können Sie mit dem Parameter `response_description` beschreiben: === "Python 3.10+" ```Python hl_lines="19" {!> ../../../docs_src/path_operation_configuration/tutorial005_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="21" {!> ../../../docs_src/path_operation_configuration/tutorial005_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="21" {!> ../../../docs_src/path_operation_configuration/tutorial005.py!} ``` !!! info beachten Sie, dass sich `response_description` speziell auf die Response bezieht, während `description` sich generell auf die *Pfadoperation* bezieht. !!! check OpenAPI verlangt, dass jede *Pfadoperation* über eine Beschreibung der Response verfügt. Daher, wenn Sie keine vergeben, wird **FastAPI** automatisch eine für „Erfolgreiche Response“ erstellen. ## Eine *Pfadoperation* deprecaten Wenn Sie eine *Pfadoperation* als deprecated kennzeichnen möchten, ohne sie zu entfernen, fügen Sie den Parameter `deprecated` hinzu: ```Python hl_lines="16" {!../../../docs_src/path_operation_configuration/tutorial006.py!} ``` Sie wird in der interaktiven Dokumentation gut sichtbar als deprecated markiert werden: Vergleichen Sie, wie deprecatete und nicht-deprecatete *Pfadoperationen* aussehen: ## Zusammenfassung Sie können auf einfache Weise Metadaten für Ihre *Pfadoperationen* definieren, indem Sie den *Pfadoperation-Dekoratoren* Parameter hinzufügen. fastapi-0.110.3/docs/de/docs/tutorial/path-params-numeric-validations.md000066400000000000000000000243551461403617600261510ustar00rootroot00000000000000# Pfad-Parameter und Validierung von Zahlen So wie Sie mit `Query` für Query-Parameter zusätzliche Validierungen und Metadaten hinzufügen können, können Sie das mittels `Path` auch für Pfad-Parameter tun. ## `Path` importieren Importieren Sie zuerst `Path` von `fastapi`, und importieren Sie `Annotated`. === "Python 3.10+" ```Python hl_lines="1 3" {!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="1 3" {!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="3-4" {!> ../../../docs_src/path_params_numeric_validations/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="1" {!> ../../../docs_src/path_params_numeric_validations/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="3" {!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!} ``` !!! info FastAPI unterstützt (und empfiehlt die Verwendung von) `Annotated` seit Version 0.95.0. Wenn Sie eine ältere Version haben, werden Sie Fehler angezeigt bekommen, wenn Sie versuchen, `Annotated` zu verwenden. Bitte [aktualisieren Sie FastAPI](../deployment/versions.md#upgrade-der-fastapi-versionen){.internal-link target=_blank} daher mindestens zu Version 0.95.1, bevor Sie `Annotated` verwenden. ## Metadaten deklarieren Sie können die gleichen Parameter deklarieren wie für `Query`. Um zum Beispiel einen `title`-Metadaten-Wert für den Pfad-Parameter `item_id` zu deklarieren, schreiben Sie: === "Python 3.10+" ```Python hl_lines="10" {!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="10" {!> ../../../docs_src/path_params_numeric_validations/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="11" {!> ../../../docs_src/path_params_numeric_validations/tutorial001_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="8" {!> ../../../docs_src/path_params_numeric_validations/tutorial001_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="10" {!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!} ``` !!! note "Hinweis" Ein Pfad-Parameter ist immer erforderlich, weil er Teil des Pfads sein muss. Sie sollten ihn daher mit `...` deklarieren, um ihn als erforderlich auszuzeichnen. Doch selbst wenn Sie ihn mit `None` deklarieren, oder einen Defaultwert setzen, bewirkt das nichts, er bleibt immer erforderlich. ## Sortieren Sie die Parameter, wie Sie möchten !!! tip "Tipp" Wenn Sie `Annotated` verwenden, ist das folgende nicht so wichtig / nicht notwendig. Nehmen wir an, Sie möchten den Query-Parameter `q` als erforderlichen `str` deklarieren. Und Sie müssen sonst nichts anderes für den Parameter deklarieren, Sie brauchen also nicht wirklich `Query`. Aber Sie brauchen `Path` für den `item_id`-Pfad-Parameter. Und Sie möchten aus irgendeinem Grund nicht `Annotated` verwenden. Python wird sich beschweren, wenn Sie einen Parameter mit Defaultwert vor einen Parameter ohne Defaultwert setzen. Aber Sie können die Reihenfolge der Parameter ändern, den Query-Parameter ohne Defaultwert zuerst. Für **FastAPI** ist es nicht wichtig. Es erkennt die Parameter anhand ihres Namens, ihrer Typen, und ihrer Defaultwerte (`Query`, `Path`, usw.). Es kümmert sich nicht um die Reihenfolge. Sie können Ihre Funktion also so deklarieren: === "Python 3.8 nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/path_params_numeric_validations/tutorial002.py!} ``` Aber bedenken Sie, dass Sie dieses Problem nicht haben, wenn Sie `Annotated` verwenden, da Sie nicht die Funktions-Parameter-Defaultwerte für `Query()` oder `Path()` verwenden. === "Python 3.9+" ```Python hl_lines="10" {!> ../../../docs_src/path_params_numeric_validations/tutorial002_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="9" {!> ../../../docs_src/path_params_numeric_validations/tutorial002_an.py!} ``` ## Sortieren Sie die Parameter wie Sie möchten: Tricks !!! tip "Tipp" Wenn Sie `Annotated` verwenden, ist das folgende nicht so wichtig / nicht notwendig. Hier ein **kleiner Trick**, der nützlich sein kann, aber Sie werden ihn nicht oft brauchen. Wenn Sie eines der folgenden Dinge tun möchten: * den `q`-Parameter ohne `Query` oder irgendeinem Defaultwert deklarieren * den Pfad-Parameter `item_id` mittels `Path` deklarieren * die Parameter in einer unterschiedlichen Reihenfolge haben * `Annotated` nicht verwenden ... dann hat Python eine kleine Spezial-Syntax für Sie. Übergeben Sie der Funktion `*` als ersten Parameter. Python macht nichts mit diesem `*`, aber es wird wissen, dass alle folgenden Parameter als Keyword-Argumente (Schlüssel-Wert-Paare), auch bekannt als kwargs, verwendet werden. Selbst wenn diese keinen Defaultwert haben. ```Python hl_lines="7" {!../../../docs_src/path_params_numeric_validations/tutorial003.py!} ``` ### Besser mit `Annotated` Bedenken Sie, dass Sie, wenn Sie `Annotated` verwenden, dieses Problem nicht haben, weil Sie keine Defaultwerte für Ihre Funktionsparameter haben. Sie müssen daher wahrscheinlich auch nicht `*` verwenden. === "Python 3.9+" ```Python hl_lines="10" {!> ../../../docs_src/path_params_numeric_validations/tutorial003_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="9" {!> ../../../docs_src/path_params_numeric_validations/tutorial003_an.py!} ``` ## Validierung von Zahlen: Größer oder gleich Mit `Query` und `Path` (und anderen, die Sie später kennenlernen), können Sie Zahlenbeschränkungen deklarieren. Hier, mit `ge=1`, wird festgelegt, dass `item_id` eine Ganzzahl benötigt, die größer oder gleich `1` ist (`g`reater than or `e`qual). === "Python 3.9+" ```Python hl_lines="10" {!> ../../../docs_src/path_params_numeric_validations/tutorial004_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="9" {!> ../../../docs_src/path_params_numeric_validations/tutorial004_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="8" {!> ../../../docs_src/path_params_numeric_validations/tutorial004.py!} ``` ## Validierung von Zahlen: Größer und kleiner oder gleich Das Gleiche trifft zu auf: * `gt`: `g`reater `t`han – größer als * `le`: `l`ess than or `e`qual – kleiner oder gleich === "Python 3.9+" ```Python hl_lines="10" {!> ../../../docs_src/path_params_numeric_validations/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="9" {!> ../../../docs_src/path_params_numeric_validations/tutorial005_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9" {!> ../../../docs_src/path_params_numeric_validations/tutorial005.py!} ``` ## Validierung von Zahlen: Floats, größer und kleiner Zahlenvalidierung funktioniert auch für `float`-Werte. Hier wird es wichtig, in der Lage zu sein, gt zu deklarieren, und nicht nur ge, da Sie hiermit bestimmen können, dass ein Wert, zum Beispiel, größer als `0` sein muss, obwohl er kleiner als `1` ist. `0.5` wäre also ein gültiger Wert, aber nicht `0.0` oder `0`. Das gleiche gilt für lt. === "Python 3.9+" ```Python hl_lines="13" {!> ../../../docs_src/path_params_numeric_validations/tutorial006_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="12" {!> ../../../docs_src/path_params_numeric_validations/tutorial006_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="11" {!> ../../../docs_src/path_params_numeric_validations/tutorial006.py!} ``` ## Zusammenfassung Mit `Query` und `Path` (und anderen, die Sie noch nicht gesehen haben) können Sie Metadaten und Stringvalidierungen deklarieren, so wie in [Query-Parameter und Stringvalidierungen](query-params-str-validations.md){.internal-link target=_blank} beschrieben. Und Sie können auch Validierungen für Zahlen deklarieren: * `gt`: `g`reater `t`han – größer als * `ge`: `g`reater than or `e`qual – größer oder gleich * `lt`: `l`ess `t`han – kleiner als * `le`: `l`ess than or `e`qual – kleiner oder gleich !!! info `Query`, `Path`, und andere Klassen, die Sie später kennenlernen, sind Unterklassen einer allgemeinen `Param`-Klasse. Sie alle teilen die gleichen Parameter für zusätzliche Validierung und Metadaten, die Sie gesehen haben. !!! note "Technische Details" `Query`, `Path` und andere, die Sie von `fastapi` importieren, sind tatsächlich Funktionen. Die, wenn sie aufgerufen werden, Instanzen der Klassen mit demselben Namen zurückgeben. Sie importieren also `Query`, welches eine Funktion ist. Aber wenn Sie es aufrufen, gibt es eine Instanz der Klasse zurück, die auch `Query` genannt wird. Diese Funktionen existieren (statt die Klassen direkt zu verwenden), damit Ihr Editor keine Fehlermeldungen über ihre Typen ausgibt. Auf diese Weise können Sie Ihren Editor und Ihre Programmier-Tools verwenden, ohne besondere Einstellungen vornehmen zu müssen, um diese Fehlermeldungen stummzuschalten. fastapi-0.110.3/docs/de/docs/tutorial/path-params.md000066400000000000000000000244331461403617600221730ustar00rootroot00000000000000# Pfad-Parameter Sie können Pfad-„Parameter“ oder -„Variablen“ mit der gleichen Syntax deklarieren, welche in Python-Format-Strings verwendet wird: ```Python hl_lines="6-7" {!../../../docs_src/path_params/tutorial001.py!} ``` Der Wert des Pfad-Parameters `item_id` wird Ihrer Funktion als das Argument `item_id` übergeben. Wenn Sie dieses Beispiel ausführen und auf http://127.0.0.1:8000/items/foo gehen, sehen Sie als Response: ```JSON {"item_id":"foo"} ``` ## Pfad-Parameter mit Typen Sie können den Typ eines Pfad-Parameters in der Argumentliste der Funktion deklarieren, mit Standard-Python-Typannotationen: ```Python hl_lines="7" {!../../../docs_src/path_params/tutorial002.py!} ``` In diesem Fall wird `item_id` als `int` deklariert, also als Ganzzahl. !!! check Dadurch erhalten Sie Editor-Unterstützung innerhalb Ihrer Funktion, mit Fehlerprüfungen, Codevervollständigung, usw. ## Daten-Konversion Wenn Sie dieses Beispiel ausführen und Ihren Browser unter http://127.0.0.1:8000/items/3 öffnen, sehen Sie als Response: ```JSON {"item_id":3} ``` !!! check Beachten Sie, dass der Wert, den Ihre Funktion erhält und zurückgibt, die Zahl `3` ist, also ein `int`. Nicht der String `"3"`, also ein `str`. Sprich, mit dieser Typdeklaration wird **FastAPI** die Anfrage automatisch „parsen“. ## Datenvalidierung Wenn Sie aber im Browser http://127.0.0.1:8000/items/foo besuchen, erhalten Sie eine hübsche HTTP-Fehlermeldung: ```JSON { "detail": [ { "type": "int_parsing", "loc": [ "path", "item_id" ], "msg": "Input should be a valid integer, unable to parse string as an integer", "input": "foo", "url": "https://errors.pydantic.dev/2.1/v/int_parsing" } ] } ``` Der Pfad-Parameter `item_id` hatte den Wert `"foo"`, was kein `int` ist. Die gleiche Fehlermeldung würde angezeigt werden, wenn Sie ein `float` (also eine Kommazahl) statt eines `int`s übergeben würden, wie etwa in: http://127.0.0.1:8000/items/4.2 !!! check Sprich, mit der gleichen Python-Typdeklaration gibt Ihnen **FastAPI** Datenvalidierung. Beachten Sie, dass die Fehlermeldung auch direkt die Stelle anzeigt, wo die Validierung nicht erfolgreich war. Das ist unglaublich hilfreich, wenn Sie Code entwickeln und debuggen, welcher mit ihrer API interagiert. ## Dokumentation Wenn Sie die Seite http://127.0.0.1:8000/docs in Ihrem Browser öffnen, sehen Sie eine automatische, interaktive API-Dokumentation: !!! check Wiederum, mit dieser gleichen Python-Typdeklaration gibt Ihnen **FastAPI** eine automatische, interaktive Dokumentation (verwendet die Swagger-Benutzeroberfläche). Beachten Sie, dass der Pfad-Parameter dort als Ganzzahl deklariert ist. ## Nützliche Standards. Alternative Dokumentation Und weil das generierte Schema vom OpenAPI-Standard kommt, gibt es viele kompatible Tools. Zum Beispiel bietet **FastAPI** selbst eine alternative API-Dokumentation (verwendet ReDoc), welche Sie unter http://127.0.0.1:8000/redoc einsehen können: Und viele weitere kompatible Tools. Inklusive Codegenerierung für viele Sprachen. ## Pydantic Die ganze Datenvalidierung wird hinter den Kulissen von Pydantic durchgeführt, Sie profitieren also von dessen Vorteilen. Und Sie wissen, dass Sie in guten Händen sind. Sie können für Typ Deklarationen auch `str`, `float`, `bool` und viele andere komplexe Datentypen verwenden. Mehrere davon werden wir in den nächsten Kapiteln erkunden. ## Die Reihenfolge ist wichtig Wenn Sie *Pfadoperationen* erstellen, haben Sie manchmal einen fixen Pfad. Etwa `/users/me`, um Daten über den aktuellen Benutzer zu erhalten. Und Sie haben auch einen Pfad `/users/{user_id}`, um Daten über einen spezifischen Benutzer zu erhalten, mittels einer Benutzer-ID. Weil *Pfadoperationen* in ihrer Reihenfolge ausgewertet werden, müssen Sie sicherstellen, dass der Pfad `/users/me` vor `/users/{user_id}` deklariert wurde: ```Python hl_lines="6 11" {!../../../docs_src/path_params/tutorial003.py!} ``` Ansonsten würde der Pfad für `/users/{user_id}` auch `/users/me` auswerten, und annehmen, dass ein Parameter `user_id` mit dem Wert `"me"` übergeben wurde. Sie können eine Pfadoperation auch nicht erneut definieren: ```Python hl_lines="6 11" {!../../../docs_src/path_params/tutorial003b.py!} ``` Die erste Definition wird immer verwendet werden, da ihr Pfad zuerst übereinstimmt. ## Vordefinierte Parameterwerte Wenn Sie eine *Pfadoperation* haben, welche einen *Pfad-Parameter* hat, aber Sie wollen, dass dessen gültige Werte vordefiniert sind, können Sie ein Standard-Python `Enum` verwenden. ### Erstellen Sie eine `Enum`-Klasse Importieren Sie `Enum` und erstellen Sie eine Unterklasse, die von `str` und `Enum` erbt. Indem Sie von `str` erben, weiß die API Dokumentation, dass die Werte des Enums vom Typ `str` sein müssen, und wird in der Lage sein, korrekt zu rendern. Erstellen Sie dann Klassen-Attribute mit festgelegten Werten, welches die erlaubten Werte sein werden: ```Python hl_lines="1 6-9" {!../../../docs_src/path_params/tutorial005.py!} ``` !!! info Enumerationen (oder kurz Enums) gibt es in Python seit Version 3.4. !!! tip "Tipp" Falls Sie sich fragen, was „AlexNet“, „ResNet“ und „LeNet“ ist, das sind Namen von Modellen für maschinelles Lernen. ### Deklarieren Sie einen *Pfad-Parameter* Dann erstellen Sie einen *Pfad-Parameter*, der als Typ die gerade erstellte Enum-Klasse hat (`ModelName`): ```Python hl_lines="16" {!../../../docs_src/path_params/tutorial005.py!} ``` ### Testen Sie es in der API-Dokumentation Weil die erlaubten Werte für den *Pfad-Parameter* nun vordefiniert sind, kann die interaktive Dokumentation sie als Auswahl-Drop-Down anzeigen: ### Mit Python-*Enums* arbeiten Der *Pfad-Parameter* wird ein *Member eines Enums* sein. #### *Enum-Member* vergleichen Sie können ihn mit einem Member Ihres Enums `ModelName` vergleichen: ```Python hl_lines="17" {!../../../docs_src/path_params/tutorial005.py!} ``` #### *Enum-Wert* erhalten Den tatsächlichen Wert (in diesem Fall ein `str`) erhalten Sie via `model_name.value`, oder generell, `ihr_enum_member.value`: ```Python hl_lines="20" {!../../../docs_src/path_params/tutorial005.py!} ``` !!! tip "Tipp" Sie können den Wert `"lenet"` außerdem mittels `ModelName.lenet.value` abrufen. #### *Enum-Member* zurückgeben Sie können *Enum-Member* in ihrer *Pfadoperation* zurückgeben, sogar verschachtelt in einem JSON-Body (z. B. als `dict`). Diese werden zu ihren entsprechenden Werten konvertiert (in diesem Fall Strings), bevor sie zum Client übertragen werden: ```Python hl_lines="18 21 23" {!../../../docs_src/path_params/tutorial005.py!} ``` In Ihrem Client erhalten Sie eine JSON-Response, wie etwa: ```JSON { "model_name": "alexnet", "message": "Deep Learning FTW!" } ``` ## Pfad Parameter die Pfade enthalten Angenommen, Sie haben eine *Pfadoperation* mit einem Pfad `/files/{file_path}`. Aber `file_path` soll selbst einen *Pfad* enthalten, etwa `home/johndoe/myfile.txt`. Sprich, die URL für diese Datei wäre etwas wie: `/files/home/johndoe/myfile.txt`. ### OpenAPI Unterstützung OpenAPI bietet nicht die Möglichkeit, dass ein *Pfad-Parameter* seinerseits einen *Pfad* enthalten kann, das würde zu Szenarios führen, die schwierig zu testen und zu definieren sind. Trotzdem können Sie das in **FastAPI** tun, indem Sie eines der internen Tools von Starlette verwenden. Die Dokumentation würde weiterhin funktionieren, allerdings wird nicht dokumentiert werden, dass der Parameter ein Pfad sein sollte. ### Pfad Konverter Mittels einer Option direkt von Starlette können Sie einen *Pfad-Parameter* deklarieren, der einen Pfad enthalten soll, indem Sie eine URL wie folgt definieren: ``` /files/{file_path:path} ``` In diesem Fall ist der Name des Parameters `file_path`. Der letzte Teil, `:path`, sagt aus, dass der Parameter ein *Pfad* sein soll. Sie verwenden das also wie folgt: ```Python hl_lines="6" {!../../../docs_src/path_params/tutorial004.py!} ``` !!! tip "Tipp" Der Parameter könnte einen führenden Schrägstrich (`/`) haben, wie etwa in `/home/johndoe/myfile.txt`. In dem Fall wäre die URL: `/files//home/johndoe/myfile.txt`, mit einem doppelten Schrägstrich (`//`) zwischen `files` und `home`. ## Zusammenfassung In **FastAPI** erhalten Sie mittels kurzer, intuitiver Typdeklarationen: * Editor-Unterstützung: Fehlerprüfungen, Codevervollständigung, usw. * Daten "parsen" * Datenvalidierung * API-Annotationen und automatische Dokumentation Und Sie müssen sie nur einmal deklarieren. Das ist wahrscheinlich der sichtbarste Unterschied zwischen **FastAPI** und alternativen Frameworks (abgesehen von der reinen Performanz). fastapi-0.110.3/docs/de/docs/tutorial/query-params-str-validations.md000066400000000000000000000672541461403617600255350ustar00rootroot00000000000000# Query-Parameter und Stringvalidierung **FastAPI** erlaubt es Ihnen, Ihre Parameter zusätzlich zu validieren, und zusätzliche Informationen hinzuzufügen. Nehmen wir als Beispiel die folgende Anwendung: === "Python 3.10+" ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial001_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial001.py!} ``` Der Query-Parameter `q` hat den Typ `Union[str, None]` (oder `str | None` in Python 3.10), was bedeutet, er ist entweder ein `str` oder `None`. Der Defaultwert ist `None`, also weiß FastAPI, der Parameter ist nicht erforderlich. !!! note "Hinweis" FastAPI weiß nur dank des definierten Defaultwertes `=None`, dass der Wert von `q` nicht erforderlich ist `Union[str, None]` hingegen erlaubt ihren Editor, Sie besser zu unterstützen und Fehler zu erkennen. ## Zusätzliche Validierung Wir werden bewirken, dass, obwohl `q` optional ist, wenn es gegeben ist, **seine Länge 50 Zeichen nicht überschreitet**. ### `Query` und `Annotated` importieren Importieren Sie zuerst: * `Query` von `fastapi` * `Annotated` von `typing` (oder von `typing_extensions` in Python unter 3.9) === "Python 3.10+" In Python 3.9 oder darüber, ist `Annotated` Teil der Standardbibliothek, also können Sie es von `typing` importieren. ```Python hl_lines="1 3" {!> ../../../docs_src/query_params_str_validations/tutorial002_an_py310.py!} ``` === "Python 3.8+" In Versionen unter Python 3.9 importieren Sie `Annotated` von `typing_extensions`. Es wird bereits mit FastAPI installiert sein. ```Python hl_lines="3-4" {!> ../../../docs_src/query_params_str_validations/tutorial002_an.py!} ``` !!! info FastAPI unterstützt (und empfiehlt die Verwendung von) `Annotated` seit Version 0.95.0. Wenn Sie eine ältere Version haben, werden Sie Fehler angezeigt bekommen, wenn Sie versuchen, `Annotated` zu verwenden. Bitte [aktualisieren Sie FastAPI](../deployment/versions.md#upgrade-der-fastapi-versionen){.internal-link target=_blank} daher mindestens zu Version 0.95.1, bevor Sie `Annotated` verwenden. ## `Annotated` im Typ des `q`-Parameters verwenden Erinnern Sie sich, wie ich in [Einführung in Python-Typen](../python-types.md#typhinweise-mit-metadaten-annotationen){.internal-link target=_blank} sagte, dass Sie mittels `Annotated` Metadaten zu Ihren Parametern hinzufügen können? Jetzt ist es an der Zeit, das mit FastAPI auszuprobieren. 🚀 Wir hatten diese Typannotation: === "Python 3.10+" ```Python q: str | None = None ``` === "Python 3.8+" ```Python q: Union[str, None] = None ``` Wir wrappen das nun in `Annotated`, sodass daraus wird: === "Python 3.10+" ```Python q: Annotated[str | None] = None ``` === "Python 3.8+" ```Python q: Annotated[Union[str, None]] = None ``` Beide Versionen bedeuten dasselbe: `q` ist ein Parameter, der `str` oder `None` sein kann. Standardmäßig ist er `None`. Wenden wir uns jetzt den spannenden Dingen zu. 🎉 ## `Query` zu `Annotated` im `q`-Parameter hinzufügen Jetzt, da wir `Annotated` für unsere Metadaten deklariert haben, fügen Sie `Query` hinzu, und setzen Sie den Parameter `max_length` auf `50`: === "Python 3.10+" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial002_an_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial002_an.py!} ``` Beachten Sie, dass der Defaultwert immer noch `None` ist, sodass der Parameter immer noch optional ist. Aber jetzt, mit `Query(max_length=50)` innerhalb von `Annotated`, sagen wir FastAPI, dass es diesen Wert aus den Query-Parametern extrahieren soll (das hätte es sowieso gemacht 🤷) und dass wir eine **zusätzliche Validierung** für diesen Wert haben wollen (darum machen wir das, um die zusätzliche Validierung zu bekommen). 😎 FastAPI wird nun: * Die Daten **validieren** und sicherstellen, dass sie nicht länger als 50 Zeichen sind * Dem Client einen **verständlichen Fehler** anzeigen, wenn die Daten ungültig sind * Den Parameter in der OpenAPI-Schema-*Pfadoperation* **dokumentieren** (sodass er in der **automatischen Dokumentation** angezeigt wird) ## Alternativ (alt): `Query` als Defaultwert Frühere Versionen von FastAPI (vor 0.95.0) benötigten `Query` als Defaultwert des Parameters, statt es innerhalb von `Annotated` unterzubringen. Die Chance ist groß, dass Sie Quellcode sehen, der das immer noch so macht, darum erkläre ich es Ihnen. !!! tip "Tipp" Verwenden Sie für neuen Code, und wann immer möglich, `Annotated`, wie oben erklärt. Es gibt mehrere Vorteile (unten erläutert) und keine Nachteile. 🍰 So würden Sie `Query()` als Defaultwert Ihres Funktionsparameters verwenden, den Parameter `max_length` auf 50 gesetzt: === "Python 3.10+" ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial002_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial002.py!} ``` Da wir in diesem Fall (ohne die Verwendung von `Annotated`) den Parameter-Defaultwert `None` mit `Query()` ersetzen, müssen wir nun dessen Defaultwert mit dem Parameter `Query(default=None)` deklarieren. Das dient demselben Zweck, `None` als Defaultwert für den Funktionsparameter zu setzen (zumindest für FastAPI). Sprich: ```Python q: Union[str, None] = Query(default=None) ``` ... macht den Parameter optional, mit dem Defaultwert `None`, genauso wie: ```Python q: Union[str, None] = None ``` Und in Python 3.10 und darüber macht: ```Python q: str | None = Query(default=None) ``` ... den Parameter optional, mit dem Defaultwert `None`, genauso wie: ```Python q: str | None = None ``` Nur, dass die `Query`-Versionen den Parameter explizit als Query-Parameter deklarieren. !!! info Bedenken Sie, dass: ```Python = None ``` oder: ```Python = Query(default=None) ``` der wichtigste Teil ist, um einen Parameter optional zu machen, da dieses `None` der Defaultwert ist, und das ist es, was diesen Parameter **nicht erforderlich** macht. Der Teil mit `Union[str, None]` erlaubt es Ihrem Editor, Sie besser zu unterstützen, aber er sagt FastAPI nicht, dass dieser Parameter optional ist. Jetzt können wir `Query` weitere Parameter übergeben. Fangen wir mit dem `max_length` Parameter an, der auf Strings angewendet wird: ```Python q: Union[str, None] = Query(default=None, max_length=50) ``` Das wird die Daten validieren, einen verständlichen Fehler ausgeben, wenn die Daten nicht gültig sind, und den Parameter in der OpenAPI-Schema-*Pfadoperation* dokumentieren. ### `Query` als Defaultwert oder in `Annotated` Bedenken Sie, dass wenn Sie `Query` innerhalb von `Annotated` benutzen, Sie den `default`-Parameter für `Query` nicht verwenden dürfen. Setzen Sie stattdessen den Defaultwert des Funktionsparameters, sonst wäre es inkonsistent. Zum Beispiel ist das nicht erlaubt: ```Python q: Annotated[str, Query(default="rick")] = "morty" ``` ... denn es wird nicht klar, ob der Defaultwert `"rick"` oder `"morty"` sein soll. Sie würden also (bevorzugt) schreiben: ```Python q: Annotated[str, Query()] = "rick" ``` In älterem Code werden Sie auch finden: ```Python q: str = Query(default="rick") ``` ### Vorzüge von `Annotated` **Es wird empfohlen, `Annotated` zu verwenden**, statt des Defaultwertes im Funktionsparameter, das ist aus mehreren Gründen **besser**: 🤓 Der **Default**wert des **Funktionsparameters** ist der **tatsächliche Default**wert, das spielt generell intuitiver mit Python zusammen. 😌 Sie können die Funktion ohne FastAPI an **anderen Stellen aufrufen**, und es wird **wie erwartet funktionieren**. Wenn es einen **erforderlichen** Parameter gibt (ohne Defaultwert), und Sie führen die Funktion ohne den benötigten Parameter aus, dann wird Ihr **Editor** Sie das mit einem Fehler wissen lassen, und **Python** wird sich auch beschweren. Wenn Sie aber nicht `Annotated` benutzen und stattdessen die **(alte) Variante mit einem Defaultwert**, dann müssen Sie, wenn Sie die Funktion ohne FastAPI an **anderen Stellen** aufrufen, sich daran **erinnern**, die Argumente der Funktion zu übergeben, damit es richtig funktioniert. Ansonsten erhalten Sie unerwartete Werte (z. B. `QueryInfo` oder etwas Ähnliches, statt `str`). Ihr Editor kann ihnen nicht helfen, und Python wird die Funktion ohne Beschwerden ausführen, es sei denn, die Operationen innerhalb lösen einen Fehler aus. Da `Annotated` mehrere Metadaten haben kann, können Sie dieselbe Funktion auch mit anderen Tools verwenden, wie etwa Typer. 🚀 ## Mehr Validierungen hinzufügen Sie können auch einen Parameter `min_length` hinzufügen: === "Python 3.10+" ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial003_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial003_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="11" {!> ../../../docs_src/query_params_str_validations/tutorial003_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial003_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial003.py!} ``` ## Reguläre Ausdrücke hinzufügen Sie können einen Regulären Ausdruck `pattern` definieren, mit dem der Parameter übereinstimmen muss: === "Python 3.10+" ```Python hl_lines="11" {!> ../../../docs_src/query_params_str_validations/tutorial004_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="11" {!> ../../../docs_src/query_params_str_validations/tutorial004_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="12" {!> ../../../docs_src/query_params_str_validations/tutorial004_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial004_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="11" {!> ../../../docs_src/query_params_str_validations/tutorial004.py!} ``` Dieses bestimmte reguläre Suchmuster prüft, ob der erhaltene Parameter-Wert: * `^`: mit den nachfolgenden Zeichen startet, keine Zeichen davor hat. * `fixedquery`: den exakten Text `fixedquery` hat. * `$`: danach endet, keine weiteren Zeichen hat als `fixedquery`. Wenn Sie sich verloren fühlen bei all diesen **„Regulärer Ausdruck“**-Konzepten, keine Sorge. Reguläre Ausdrücke sind für viele Menschen ein schwieriges Thema. Sie können auch ohne reguläre Ausdrücke eine ganze Menge machen. Aber wenn Sie sie brauchen und sie lernen, wissen Sie, dass Sie sie bereits direkt in **FastAPI** verwenden können. ### Pydantic v1 `regex` statt `pattern` Vor Pydantic Version 2 und vor FastAPI Version 0.100.0, war der Name des Parameters `regex` statt `pattern`, aber das ist jetzt deprecated. Sie könnten immer noch Code sehen, der den alten Namen verwendet: === "Python 3.10+ Pydantic v1" ```Python hl_lines="11" {!> ../../../docs_src/query_params_str_validations/tutorial004_an_py310_regex.py!} ``` Beachten Sie aber, dass das deprecated ist, und zum neuen Namen `pattern` geändert werden sollte. 🤓 ## Defaultwerte Sie können natürlich andere Defaultwerte als `None` verwenden. Beispielsweise könnten Sie den `q` Query-Parameter so deklarieren, dass er eine `min_length` von `3` hat, und den Defaultwert `"fixedquery"`: === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="8" {!> ../../../docs_src/query_params_str_validations/tutorial005_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial005.py!} ``` !!! note "Hinweis" Ein Parameter ist optional (nicht erforderlich), wenn er irgendeinen Defaultwert, auch `None`, hat. ## Erforderliche Parameter Wenn wir keine Validierungen oder Metadaten haben, können wir den `q` Query-Parameter erforderlich machen, indem wir einfach keinen Defaultwert deklarieren, wie in: ```Python q: str ``` statt: ```Python q: Union[str, None] = None ``` Aber jetzt deklarieren wir den Parameter mit `Query`, wie in: === "Annotiert" ```Python q: Annotated[Union[str, None], Query(min_length=3)] = None ``` === "Nicht annotiert" ```Python q: Union[str, None] = Query(default=None, min_length=3) ``` Wenn Sie einen Parameter erforderlich machen wollen, während Sie `Query` verwenden, deklarieren Sie ebenfalls einfach keinen Defaultwert: === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial006_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="8" {!> ../../../docs_src/query_params_str_validations/tutorial006_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial006.py!} ``` !!! tip "Tipp" Beachten Sie, dass, obwohl in diesem Fall `Query()` der Funktionsparameter-Defaultwert ist, wir nicht `default=None` zu `Query()` hinzufügen. Verwenden Sie bitte trotzdem die `Annotated`-Version. 😉 ### Erforderlich mit Ellipse (`...`) Es gibt eine Alternative, die explizit deklariert, dass ein Wert erforderlich ist. Sie können als Default das Literal `...` setzen: === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial006b_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="8" {!> ../../../docs_src/query_params_str_validations/tutorial006b_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial006b.py!} ``` !!! info Falls Sie das `...` bisher noch nicht gesehen haben: Es ist ein spezieller einzelner Wert, Teil von Python und wird „Ellipsis“ genannt (Deutsch: Ellipse). Es wird von Pydantic und FastAPI verwendet, um explizit zu deklarieren, dass ein Wert erforderlich ist. Dies wird **FastAPI** wissen lassen, dass dieser Parameter erforderlich ist. ### Erforderlich, kann `None` sein Sie können deklarieren, dass ein Parameter `None` akzeptiert, aber dennoch erforderlich ist. Das zwingt Clients, den Wert zu senden, selbst wenn er `None` ist. Um das zu machen, deklarieren Sie, dass `None` ein gültiger Typ ist, aber verwenden Sie dennoch `...` als Default: === "Python 3.10+" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial006c_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial006c_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial006c_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial006c_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial006c.py!} ``` !!! tip "Tipp" Pydantic, welches die gesamte Datenvalidierung und Serialisierung in FastAPI antreibt, hat ein spezielles Verhalten, wenn Sie `Optional` oder `Union[Something, None]` ohne Defaultwert verwenden, Sie können mehr darüber in der Pydantic-Dokumentation unter Required fields erfahren. !!! tip "Tipp" Denken Sie daran, dass Sie in den meisten Fällen, wenn etwas erforderlich ist, einfach den Defaultwert weglassen können. Sie müssen also normalerweise `...` nicht verwenden. ## Query-Parameter-Liste / Mehrere Werte Wenn Sie einen Query-Parameter explizit mit `Query` auszeichnen, können Sie ihn auch eine Liste von Werten empfangen lassen, oder anders gesagt, mehrere Werte. Um zum Beispiel einen Query-Parameter `q` zu deklarieren, der mehrere Male in der URL vorkommen kann, schreiben Sie: === "Python 3.10+" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial011_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial011_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial011_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial011_py310.py!} ``` === "Python 3.9+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial011_py39.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial011.py!} ``` Dann, mit einer URL wie: ``` http://localhost:8000/items/?q=foo&q=bar ``` bekommen Sie alle `q`-*Query-Parameter*-Werte (`foo` und `bar`) in einer Python-Liste – `list` – in ihrer *Pfadoperation-Funktion*, im Funktionsparameter `q`, überreicht. Die Response für diese URL wäre also: ```JSON { "q": [ "foo", "bar" ] } ``` !!! tip "Tipp" Um einen Query-Parameter vom Typ `list` zu deklarieren, wie im Beispiel oben, müssen Sie explizit `Query` verwenden, sonst würde der Parameter als Requestbody interpretiert werden. Die interaktive API-Dokumentation wird entsprechend aktualisiert und erlaubt jetzt mehrere Werte. ### Query-Parameter-Liste / Mehrere Werte mit Defaults Und Sie können auch eine Default-`list`e von Werten definieren, wenn keine übergeben werden: === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial012_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial012_an.py!} ``` === "Python 3.9+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial012_py39.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial012.py!} ``` Wenn Sie auf: ``` http://localhost:8000/items/ ``` gehen, wird der Default für `q` verwendet: `["foo", "bar"]`, und als Response erhalten Sie: ```JSON { "q": [ "foo", "bar" ] } ``` #### `list` alleine verwenden Sie können auch `list` direkt verwenden, anstelle von `List[str]` (oder `list[str]` in Python 3.9+): === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial013_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="8" {!> ../../../docs_src/query_params_str_validations/tutorial013_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial013.py!} ``` !!! note "Hinweis" Beachten Sie, dass FastAPI in diesem Fall den Inhalt der Liste nicht überprüft. Zum Beispiel würde `List[int]` überprüfen (und dokumentieren) dass die Liste Ganzzahlen enthält. `list` alleine macht das nicht. ## Deklarieren von mehr Metadaten Sie können mehr Informationen zum Parameter hinzufügen. Diese Informationen werden zur generierten OpenAPI hinzugefügt, und von den Dokumentations-Oberflächen und von externen Tools verwendet. !!! note "Hinweis" Beachten Sie, dass verschiedene Tools OpenAPI möglicherweise unterschiedlich gut unterstützen. Einige könnten noch nicht alle zusätzlichen Informationen anzeigen, die Sie deklariert haben, obwohl in den meisten Fällen geplant ist, das fehlende Feature zu implementieren. Sie können einen Titel hinzufügen – `title`: === "Python 3.10+" ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial007_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial007_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="11" {!> ../../../docs_src/query_params_str_validations/tutorial007_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="8" {!> ../../../docs_src/query_params_str_validations/tutorial007_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial007.py!} ``` Und eine Beschreibung – `description`: === "Python 3.10+" ```Python hl_lines="14" {!> ../../../docs_src/query_params_str_validations/tutorial008_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="14" {!> ../../../docs_src/query_params_str_validations/tutorial008_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="15" {!> ../../../docs_src/query_params_str_validations/tutorial008_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="11" {!> ../../../docs_src/query_params_str_validations/tutorial008_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="13" {!> ../../../docs_src/query_params_str_validations/tutorial008.py!} ``` ## Alias-Parameter Stellen Sie sich vor, der Parameter soll `item-query` sein. Wie in: ``` http://127.0.0.1:8000/items/?item-query=foobaritems ``` Aber `item-query` ist kein gültiger Name für eine Variable in Python. Am ähnlichsten wäre `item_query`. Aber Sie möchten dennoch exakt `item-query` verwenden. Dann können Sie einen `alias` deklarieren, und dieser Alias wird verwendet, um den Parameter-Wert zu finden: === "Python 3.10+" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial009_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial009_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial009_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial009_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial009.py!} ``` ## Parameter als deprecated ausweisen Nehmen wir an, Sie mögen diesen Parameter nicht mehr. Sie müssen ihn eine Weile dort belassen, weil Clients ihn benutzen, aber Sie möchten, dass die Dokumentation klar anzeigt, dass er deprecated ist. In diesem Fall fügen Sie den Parameter `deprecated=True` zu `Query` hinzu. === "Python 3.10+" ```Python hl_lines="19" {!> ../../../docs_src/query_params_str_validations/tutorial010_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="19" {!> ../../../docs_src/query_params_str_validations/tutorial010_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="20" {!> ../../../docs_src/query_params_str_validations/tutorial010_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="16" {!> ../../../docs_src/query_params_str_validations/tutorial010_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="18" {!> ../../../docs_src/query_params_str_validations/tutorial010.py!} ``` Die Dokumentation wird das so anzeigen: ## Parameter von OpenAPI ausschließen Um einen Query-Parameter vom generierten OpenAPI-Schema auszuschließen (und daher von automatischen Dokumentations-Systemen), setzen Sie den Parameter `include_in_schema` in `Query` auf `False`. === "Python 3.10+" ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial014_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial014_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="11" {!> ../../../docs_src/query_params_str_validations/tutorial014_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="8" {!> ../../../docs_src/query_params_str_validations/tutorial014_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial014.py!} ``` ## Zusammenfassung Sie können zusätzliche Validierungen und Metadaten zu ihren Parametern hinzufügen. Allgemeine Validierungen und Metadaten: * `alias` * `title` * `description` * `deprecated` Validierungen spezifisch für Strings: * `min_length` * `max_length` * `pattern` In diesen Beispielen haben Sie gesehen, wie Sie Validierungen für Strings hinzufügen. In den nächsten Kapiteln sehen wir, wie man Validierungen für andere Typen hinzufügt, etwa für Zahlen. fastapi-0.110.3/docs/de/docs/tutorial/query-params.md000066400000000000000000000131021461403617600223730ustar00rootroot00000000000000# Query-Parameter Wenn Sie in ihrer Funktion Parameter deklarieren, die nicht Teil der Pfad-Parameter sind, dann werden diese automatisch als „Query“-Parameter interpretiert. ```Python hl_lines="9" {!../../../docs_src/query_params/tutorial001.py!} ``` Query-Parameter (Deutsch: Abfrage-Parameter) sind die Schlüssel-Wert-Paare, die nach dem `?` in einer URL aufgelistet sind, getrennt durch `&`-Zeichen. Zum Beispiel sind in der URL: ``` http://127.0.0.1:8000/items/?skip=0&limit=10 ``` ... die Query-Parameter: * `skip`: mit dem Wert `0` * `limit`: mit dem Wert `10` Da sie Teil der URL sind, sind sie „naturgemäß“ Strings. Aber wenn Sie sie mit Python-Typen deklarieren (im obigen Beispiel als `int`), werden sie zu diesem Typ konvertiert, und gegen diesen validiert. Die gleichen Prozesse, die für Pfad-Parameter stattfinden, werden auch auf Query-Parameter angewendet: * Editor Unterstützung (natürlich) * „Parsen“ der Daten * Datenvalidierung * Automatische Dokumentation ## Defaultwerte Da Query-Parameter nicht ein festgelegter Teil des Pfades sind, können sie optional sein und Defaultwerte haben. Im obigen Beispiel haben sie die Defaultwerte `skip=0` und `limit=10`. Wenn Sie also zur URL: ``` http://127.0.0.1:8000/items/ ``` gehen, so ist das das gleiche wie die URL: ``` http://127.0.0.1:8000/items/?skip=0&limit=10 ``` Aber wenn Sie zum Beispiel zu: ``` http://127.0.0.1:8000/items/?skip=20 ``` gehen, werden die Parameter-Werte Ihrer Funktion sein: * `skip=20`: da Sie das in der URL gesetzt haben * `limit=10`: weil das der Defaultwert ist ## Optionale Parameter Auf die gleiche Weise können Sie optionale Query-Parameter deklarieren, indem Sie deren Defaultwert auf `None` setzen: === "Python 3.10+" ```Python hl_lines="7" {!> ../../../docs_src/query_params/tutorial002_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="9" {!> ../../../docs_src/query_params/tutorial002.py!} ``` In diesem Fall wird der Funktionsparameter `q` optional, und standardmäßig `None` sein. !!! check Beachten Sie auch, dass **FastAPI** intelligent genug ist, um zu erkennen, dass `item_id` ein Pfad-Parameter ist und `q` keiner, daher muss letzteres ein Query-Parameter sein. ## Query-Parameter Typkonvertierung Sie können auch `bool`-Typen deklarieren und sie werden konvertiert: === "Python 3.10+" ```Python hl_lines="7" {!> ../../../docs_src/query_params/tutorial003_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="9" {!> ../../../docs_src/query_params/tutorial003.py!} ``` Wenn Sie nun zu: ``` http://127.0.0.1:8000/items/foo?short=1 ``` oder ``` http://127.0.0.1:8000/items/foo?short=True ``` oder ``` http://127.0.0.1:8000/items/foo?short=true ``` oder ``` http://127.0.0.1:8000/items/foo?short=on ``` oder ``` http://127.0.0.1:8000/items/foo?short=yes ``` gehen, oder zu irgendeiner anderen Variante der Groß-/Kleinschreibung (Alles groß, Anfangsbuchstabe groß, usw.), dann wird Ihre Funktion den Parameter `short` mit dem `bool`-Wert `True` sehen, ansonsten mit dem Wert `False`. ## Mehrere Pfad- und Query-Parameter Sie können mehrere Pfad-Parameter und Query-Parameter gleichzeitig deklarieren, **FastAPI** weiß, was welches ist. Und Sie müssen sie auch nicht in einer spezifischen Reihenfolge deklarieren. Parameter werden anhand ihres Namens erkannt: === "Python 3.10+" ```Python hl_lines="6 8" {!> ../../../docs_src/query_params/tutorial004_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="8 10" {!> ../../../docs_src/query_params/tutorial004.py!} ``` ## Erforderliche Query-Parameter Wenn Sie einen Defaultwert für Nicht-Pfad-Parameter deklarieren (Bis jetzt haben wir nur Query-Parameter gesehen), dann ist der Parameter nicht erforderlich. Wenn Sie keinen spezifischen Wert haben wollen, sondern der Parameter einfach optional sein soll, dann setzen Sie den Defaultwert auf `None`. Aber wenn Sie wollen, dass ein Query-Parameter erforderlich ist, vergeben Sie einfach keinen Defaultwert: ```Python hl_lines="6-7" {!../../../docs_src/query_params/tutorial005.py!} ``` Hier ist `needy` ein erforderlicher Query-Parameter vom Typ `str`. Wenn Sie in Ihrem Browser eine URL wie: ``` http://127.0.0.1:8000/items/foo-item ``` ... öffnen, ohne den benötigten Parameter `needy`, dann erhalten Sie einen Fehler wie den folgenden: ```JSON { "detail": [ { "type": "missing", "loc": [ "query", "needy" ], "msg": "Field required", "input": null, "url": "https://errors.pydantic.dev/2.1/v/missing" } ] } ``` Da `needy` ein erforderlicher Parameter ist, müssen Sie ihn in der URL setzen: ``` http://127.0.0.1:8000/items/foo-item?needy=sooooneedy ``` ... Das funktioniert: ```JSON { "item_id": "foo-item", "needy": "sooooneedy" } ``` Und natürlich können Sie einige Parameter als erforderlich, einige mit Defaultwert, und einige als vollständig optional definieren: === "Python 3.10+" ```Python hl_lines="8" {!> ../../../docs_src/query_params/tutorial006_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="10" {!> ../../../docs_src/query_params/tutorial006.py!} ``` In diesem Fall gibt es drei Query-Parameter: * `needy`, ein erforderlicher `str`. * `skip`, ein `int` mit einem Defaultwert `0`. * `limit`, ein optionales `int`. !!! tip "Tipp" Sie können auch `Enum`s verwenden, auf die gleiche Weise wie mit [Pfad-Parametern](path-params.md#vordefinierte-parameterwerte){.internal-link target=_blank}. fastapi-0.110.3/docs/de/docs/tutorial/request-files.md000066400000000000000000000267561461403617600225600ustar00rootroot00000000000000# Dateien im Request Mit `File` können sie vom Client hochzuladende Dateien definieren. !!! info Um hochgeladene Dateien zu empfangen, installieren Sie zuerst `python-multipart`. Z. B. `pip install python-multipart`. Das, weil hochgeladene Dateien als „Formulardaten“ gesendet werden. ## `File` importieren Importieren Sie `File` und `UploadFile` von `fastapi`: === "Python 3.9+" ```Python hl_lines="3" {!> ../../../docs_src/request_files/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1" {!> ../../../docs_src/request_files/tutorial001_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="1" {!> ../../../docs_src/request_files/tutorial001.py!} ``` ## `File`-Parameter definieren Erstellen Sie Datei-Parameter, so wie Sie es auch mit `Body` und `Form` machen würden: === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/request_files/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="8" {!> ../../../docs_src/request_files/tutorial001_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/request_files/tutorial001.py!} ``` !!! info `File` ist eine Klasse, die direkt von `Form` erbt. Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `File` und andere von `fastapi` importieren, diese tatsächlich Funktionen sind, welche spezielle Klassen zurückgeben !!! tip "Tipp" Um Dateibodys zu deklarieren, müssen Sie `File` verwenden, da diese Parameter sonst als Query-Parameter oder Body(-JSON)-Parameter interpretiert werden würden. Die Dateien werden als „Formulardaten“ hochgeladen. Wenn Sie den Typ Ihrer *Pfadoperation-Funktion* als `bytes` deklarieren, wird **FastAPI** die Datei für Sie auslesen, und Sie erhalten den Inhalt als `bytes`. Bedenken Sie, dass das bedeutet, dass sich der gesamte Inhalt der Datei im Arbeitsspeicher befindet. Das wird für kleinere Dateien gut funktionieren. Aber es gibt viele Fälle, in denen Sie davon profitieren, `UploadFile` zu verwenden. ## Datei-Parameter mit `UploadFile` Definieren Sie einen Datei-Parameter mit dem Typ `UploadFile`: === "Python 3.9+" ```Python hl_lines="14" {!> ../../../docs_src/request_files/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="13" {!> ../../../docs_src/request_files/tutorial001_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="12" {!> ../../../docs_src/request_files/tutorial001.py!} ``` `UploadFile` zu verwenden, hat mehrere Vorzüge gegenüber `bytes`: * Sie müssen `File()` nicht als Parameter-Defaultwert verwenden. * Es wird eine „Spool“-Datei verwendet: * Eine Datei, die bis zu einem bestimmten Größen-Limit im Arbeitsspeicher behalten wird, und wenn das Limit überschritten wird, auf der Festplatte gespeichert wird. * Das bedeutet, es wird für große Dateien wie Bilder, Videos, große Binärdateien, usw. gut funktionieren, ohne den ganzen Arbeitsspeicher aufzubrauchen. * Sie können Metadaten aus der hochgeladenen Datei auslesen. * Es hat eine file-like `async`hrone Schnittstelle. * Es stellt ein tatsächliches Python-`SpooledTemporaryFile`-Objekt bereit, welches Sie direkt anderen Bibliotheken übergeben können, die ein dateiartiges Objekt erwarten. ### `UploadFile` `UploadFile` hat die folgenden Attribute: * `filename`: Ein `str` mit dem ursprünglichen Namen der hochgeladenen Datei (z. B. `meinbild.jpg`). * `content_type`: Ein `str` mit dem Inhaltstyp (MIME-Typ / Medientyp) (z. B. `image/jpeg`). * `file`: Ein `SpooledTemporaryFile` (ein file-like Objekt). Das ist das tatsächliche Python-Objekt, das Sie direkt anderen Funktionen oder Bibliotheken übergeben können, welche ein „file-like“-Objekt erwarten. `UploadFile` hat die folgenden `async`hronen Methoden. Sie alle rufen die entsprechenden Methoden des darunterliegenden Datei-Objekts auf (wobei intern `SpooledTemporaryFile` verwendet wird). * `write(daten)`: Schreibt `daten` (`str` oder `bytes`) in die Datei. * `read(anzahl)`: Liest `anzahl` (`int`) bytes/Zeichen aus der Datei. * `seek(versatz)`: Geht zur Position `versatz` (`int`) in der Datei. * Z. B. würde `await myfile.seek(0)` zum Anfang der Datei gehen. * Das ist besonders dann nützlich, wenn Sie `await myfile.read()` einmal ausführen und dann diese Inhalte erneut auslesen müssen. * `close()`: Schließt die Datei. Da alle diese Methoden `async`hron sind, müssen Sie sie `await`en („erwarten“). Zum Beispiel können Sie innerhalb einer `async` *Pfadoperation-Funktion* den Inhalt wie folgt auslesen: ```Python contents = await myfile.read() ``` Wenn Sie sich innerhalb einer normalen `def`-*Pfadoperation-Funktion* befinden, können Sie direkt auf `UploadFile.file` zugreifen, zum Beispiel: ```Python contents = myfile.file.read() ``` !!! note "Technische Details zu `async`" Wenn Sie die `async`-Methoden verwenden, führt **FastAPI** die Datei-Methoden in einem Threadpool aus und erwartet sie. !!! note "Technische Details zu Starlette" **FastAPI**s `UploadFile` erbt direkt von **Starlette**s `UploadFile`, fügt aber ein paar notwendige Teile hinzu, um es kompatibel mit **Pydantic** und anderen Teilen von FastAPI zu machen. ## Was sind „Formulardaten“ HTML-Formulare (`
`) senden die Daten in einer „speziellen“ Kodierung zum Server, welche sich von JSON unterscheidet. **FastAPI** stellt sicher, dass diese Daten korrekt ausgelesen werden, statt JSON zu erwarten. !!! note "Technische Details" Daten aus Formularen werden, wenn es keine Dateien sind, normalerweise mit dem „media type“ `application/x-www-form-urlencoded` kodiert. Sollte das Formular aber Dateien enthalten, dann werden diese mit `multipart/form-data` kodiert. Wenn Sie `File` verwenden, wird **FastAPI** wissen, dass es die Dateien vom korrekten Teil des Bodys holen muss. Wenn Sie mehr über Formularfelder und ihre Kodierungen lesen möchten, besuchen Sie die MDN-Webdokumentation für POST. !!! warning "Achtung" Sie können mehrere `File`- und `Form`-Parameter in einer *Pfadoperation* deklarieren, aber Sie können nicht gleichzeitig auch `Body`-Felder deklarieren, welche Sie als JSON erwarten, da der Request den Body mittels `multipart/form-data` statt `application/json` kodiert. Das ist keine Limitation von **FastAPI**, sondern Teil des HTTP-Protokolls. ## Optionaler Datei-Upload Sie können eine Datei optional machen, indem Sie Standard-Typannotationen verwenden und den Defaultwert auf `None` setzen: === "Python 3.10+" ```Python hl_lines="9 17" {!> ../../../docs_src/request_files/tutorial001_02_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="9 17" {!> ../../../docs_src/request_files/tutorial001_02_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="10 18" {!> ../../../docs_src/request_files/tutorial001_02_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7 15" {!> ../../../docs_src/request_files/tutorial001_02_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9 17" {!> ../../../docs_src/request_files/tutorial001_02.py!} ``` ## `UploadFile` mit zusätzlichen Metadaten Sie können auch `File()` zusammen mit `UploadFile` verwenden, um zum Beispiel zusätzliche Metadaten zu setzen: === "Python 3.9+" ```Python hl_lines="9 15" {!> ../../../docs_src/request_files/tutorial001_03_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="8 14" {!> ../../../docs_src/request_files/tutorial001_03_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7 13" {!> ../../../docs_src/request_files/tutorial001_03.py!} ``` ## Mehrere Datei-Uploads Es ist auch möglich, mehrere Dateien gleichzeitig hochzuladen. Diese werden demselben Formularfeld zugeordnet, welches mit den Formulardaten gesendet wird. Um das zu machen, deklarieren Sie eine Liste von `bytes` oder `UploadFile`s: === "Python 3.9+" ```Python hl_lines="10 15" {!> ../../../docs_src/request_files/tutorial002_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="11 16" {!> ../../../docs_src/request_files/tutorial002_an.py!} ``` === "Python 3.9+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="8 13" {!> ../../../docs_src/request_files/tutorial002_py39.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="10 15" {!> ../../../docs_src/request_files/tutorial002.py!} ``` Sie erhalten, wie deklariert, eine `list`e von `bytes` oder `UploadFile`s. !!! note "Technische Details" Sie können auch `from starlette.responses import HTMLResponse` verwenden. **FastAPI** bietet dieselben `starlette.responses` auch via `fastapi.responses` an, als Annehmlichkeit für Sie, den Entwickler. Die meisten verfügbaren Responses kommen aber direkt von Starlette. ### Mehrere Datei-Uploads mit zusätzlichen Metadaten Und so wie zuvor können Sie `File()` verwenden, um zusätzliche Parameter zu setzen, sogar für `UploadFile`: === "Python 3.9+" ```Python hl_lines="11 18-20" {!> ../../../docs_src/request_files/tutorial003_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="12 19-21" {!> ../../../docs_src/request_files/tutorial003_an.py!} ``` === "Python 3.9+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="9 16" {!> ../../../docs_src/request_files/tutorial003_py39.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="11 18" {!> ../../../docs_src/request_files/tutorial003.py!} ``` ## Zusammenfassung Verwenden Sie `File`, `bytes` und `UploadFile`, um hochladbare Dateien im Request zu deklarieren, die als Formulardaten gesendet werden. fastapi-0.110.3/docs/de/docs/tutorial/request-forms-and-files.md000066400000000000000000000043131461403617600244250ustar00rootroot00000000000000# Formulardaten und Dateien im Request Sie können gleichzeitig Dateien und Formulardaten mit `File` und `Form` definieren. !!! info Um hochgeladene Dateien und/oder Formulardaten zu empfangen, installieren Sie zuerst `python-multipart`. Z. B. `pip install python-multipart`. ## `File` und `Form` importieren === "Python 3.9+" ```Python hl_lines="3" {!> ../../../docs_src/request_forms_and_files/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1" {!> ../../../docs_src/request_forms_and_files/tutorial001_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="1" {!> ../../../docs_src/request_forms_and_files/tutorial001.py!} ``` ## `File` und `Form`-Parameter definieren Erstellen Sie Datei- und Formularparameter, so wie Sie es auch mit `Body` und `Query` machen würden: === "Python 3.9+" ```Python hl_lines="10-12" {!> ../../../docs_src/request_forms_and_files/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="9-11" {!> ../../../docs_src/request_forms_and_files/tutorial001_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="8" {!> ../../../docs_src/request_forms_and_files/tutorial001.py!} ``` Die Datei- und Formularfelder werden als Formulardaten hochgeladen, und Sie erhalten diese Dateien und Formularfelder. Und Sie können einige der Dateien als `bytes` und einige als `UploadFile` deklarieren. !!! warning "Achtung" Sie können mehrere `File`- und `Form`-Parameter in einer *Pfadoperation* deklarieren, aber Sie können nicht gleichzeitig auch `Body`-Felder deklarieren, welche Sie als JSON erwarten, da der Request den Body mittels `multipart/form-data` statt `application/json` kodiert. Das ist keine Limitation von **FastAPI**, sondern Teil des HTTP-Protokolls. ## Zusammenfassung Verwenden Sie `File` und `Form` zusammen, wenn Sie Daten und Dateien zusammen im selben Request empfangen müssen. fastapi-0.110.3/docs/de/docs/tutorial/request-forms.md000066400000000000000000000072551461403617600225750ustar00rootroot00000000000000# Formulardaten Wenn Sie Felder aus Formularen statt JSON empfangen müssen, können Sie `Form` verwenden. !!! info Um Formulare zu verwenden, installieren Sie zuerst `python-multipart`. Z. B. `pip install python-multipart`. ## `Form` importieren Importieren Sie `Form` von `fastapi`: === "Python 3.9+" ```Python hl_lines="3" {!> ../../../docs_src/request_forms/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1" {!> ../../../docs_src/request_forms/tutorial001_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="1" {!> ../../../docs_src/request_forms/tutorial001.py!} ``` ## `Form`-Parameter definieren Erstellen Sie Formular-Parameter, so wie Sie es auch mit `Body` und `Query` machen würden: === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/request_forms/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="8" {!> ../../../docs_src/request_forms/tutorial001_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7" {!> ../../../docs_src/request_forms/tutorial001.py!} ``` Zum Beispiel stellt eine der Möglichkeiten, die OAuth2 Spezifikation zu verwenden (genannt „password flow“), die Bedingung, einen `username` und ein `password` als Formularfelder zu senden. Die Spec erfordert, dass die Felder exakt `username` und `password` genannt werden und als Formularfelder, nicht JSON, gesendet werden. Mit `Form` haben Sie die gleichen Konfigurationsmöglichkeiten wie mit `Body` (und `Query`, `Path`, `Cookie`), inklusive Validierung, Beispielen, einem Alias (z. B. `user-name` statt `username`), usw. !!! info `Form` ist eine Klasse, die direkt von `Body` erbt. !!! tip "Tipp" Um Formularbodys zu deklarieren, verwenden Sie explizit `Form`, da diese Parameter sonst als Query-Parameter oder Body(-JSON)-Parameter interpretiert werden würden. ## Über „Formularfelder“ HTML-Formulare (`
`) senden die Daten in einer „speziellen“ Kodierung zum Server, welche sich von JSON unterscheidet. **FastAPI** stellt sicher, dass diese Daten korrekt ausgelesen werden, statt JSON zu erwarten. !!! note "Technische Details" Daten aus Formularen werden normalerweise mit dem „media type“ `application/x-www-form-urlencoded` kodiert. Wenn das Formular stattdessen Dateien enthält, werden diese mit `multipart/form-data` kodiert. Im nächsten Kapitel erfahren Sie mehr über die Handhabung von Dateien. Wenn Sie mehr über Formularfelder und ihre Kodierungen lesen möchten, besuchen Sie die MDN-Webdokumentation für POST. !!! warning "Achtung" Sie können mehrere `Form`-Parameter in einer *Pfadoperation* deklarieren, aber Sie können nicht gleichzeitig auch `Body`-Felder deklarieren, welche Sie als JSON erwarten, da der Request den Body mittels `application/x-www-form-urlencoded` statt `application/json` kodiert. Das ist keine Limitation von **FastAPI**, sondern Teil des HTTP-Protokolls. ## Zusammenfassung Verwenden Sie `Form`, um Eingabe-Parameter für Formulardaten zu deklarieren. fastapi-0.110.3/docs/de/docs/tutorial/response-model.md000066400000000000000000000476251461403617600227220ustar00rootroot00000000000000# Responsemodell – Rückgabetyp Sie können den Typ der Response deklarieren, indem Sie den **Rückgabetyp** der *Pfadoperation* annotieren. Hierbei können Sie **Typannotationen** genauso verwenden, wie Sie es bei Werten von Funktions-**Parametern** machen; verwenden Sie Pydantic-Modelle, Listen, Dicts und skalare Werte wie Nummern, Booleans, usw. === "Python 3.10+" ```Python hl_lines="16 21" {!> ../../../docs_src/response_model/tutorial001_01_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="18 23" {!> ../../../docs_src/response_model/tutorial001_01_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="18 23" {!> ../../../docs_src/response_model/tutorial001_01.py!} ``` FastAPI wird diesen Rückgabetyp verwenden, um: * Die zurückzugebenden Daten zu **validieren**. * Wenn die Daten ungültig sind (Sie haben z. B. ein Feld vergessen), bedeutet das, *Ihr* Anwendungscode ist fehlerhaft, er gibt nicht zurück, was er sollte, und daher wird ein Server-Error ausgegeben, statt falscher Daten. So können Sie und ihre Clients sicher sein, dass diese die erwarteten Daten, in der richtigen Form erhalten. * In der OpenAPI *Pfadoperation* ein **JSON-Schema** für die Response hinzuzufügen. * Dieses wird von der **automatischen Dokumentation** verwendet. * Es wird auch von automatisch Client-Code-generierenden Tools verwendet. Aber am wichtigsten: * Es wird die Ausgabedaten auf das **limitieren und filtern**, was im Rückgabetyp definiert ist. * Das ist insbesondere für die **Sicherheit** wichtig, mehr dazu unten. ## `response_model`-Parameter Es gibt Fälle, da möchten oder müssen Sie Daten zurückgeben, die nicht genau dem entsprechen, was der Typ deklariert. Zum Beispiel könnten Sie **ein Dict zurückgeben** wollen, oder ein Datenbank-Objekt, aber **es als Pydantic-Modell deklarieren**. Auf diese Weise übernimmt das Pydantic-Modell alle Datendokumentation, -validierung, usw. für das Objekt, welches Sie zurückgeben (z. B. ein Dict oder ein Datenbank-Objekt). Würden Sie eine hierfür eine Rückgabetyp-Annotation verwenden, dann würden Tools und Editoren (korrekterweise) Fehler ausgeben, die Ihnen sagen, dass Ihre Funktion einen Typ zurückgibt (z. B. ein Dict), der sich unterscheidet von dem, was Sie deklariert haben (z. B. ein Pydantic-Modell). In solchen Fällen können Sie statt des Rückgabetyps den **Pfadoperation-Dekorator**-Parameter `response_model` verwenden. Sie können `response_model` in jeder möglichen *Pfadoperation* verwenden: * `@app.get()` * `@app.post()` * `@app.put()` * `@app.delete()` * usw. === "Python 3.10+" ```Python hl_lines="17 22 24-27" {!> ../../../docs_src/response_model/tutorial001_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="17 22 24-27" {!> ../../../docs_src/response_model/tutorial001_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="17 22 24-27" {!> ../../../docs_src/response_model/tutorial001.py!} ``` !!! note "Hinweis" Beachten Sie, dass `response_model` ein Parameter der „Dekorator“-Methode ist (`get`, `post`, usw.). Nicht der *Pfadoperation-Funktion*, so wie die anderen Parameter. `response_model` nimmt denselben Typ entgegen, den Sie auch für ein Pydantic-Modellfeld deklarieren würden, also etwa ein Pydantic-Modell, aber es kann auch z. B. eine `list`e von Pydantic-Modellen sein, wie etwa `List[Item]`. FastAPI wird dieses `response_model` nehmen, um die Daten zu dokumentieren, validieren, usw. und auch, um **die Ausgabedaten** entsprechend der Typdeklaration **zu konvertieren und filtern**. !!! tip "Tipp" Wenn Sie in Ihrem Editor strikte Typchecks haben, mypy, usw., können Sie den Funktions-Rückgabetyp als `Any` deklarieren. So sagen Sie dem Editor, dass Sie absichtlich *irgendetwas* zurückgeben. Aber FastAPI wird trotzdem die Dokumentation, Validierung, Filterung, usw. der Daten übernehmen, via `response_model`. ### `response_model`-Priorität Wenn sowohl Rückgabetyp als auch `response_model` deklariert sind, hat `response_model` die Priorität und wird von FastAPI bevorzugt verwendet. So können Sie korrekte Typannotationen zu ihrer Funktion hinzufügen, die von ihrem Editor und Tools wie mypy verwendet werden. Und dennoch übernimmt FastAPI die Validierung und Dokumentation, usw., der Daten anhand von `response_model`. Sie können auch `response_model=None` verwenden, um das Erstellen eines Responsemodells für diese *Pfadoperation* zu unterbinden. Sie könnten das tun wollen, wenn sie Dinge annotieren, die nicht gültige Pydantic-Felder sind. Ein Beispiel dazu werden Sie in einer der Abschnitte unten sehen. ## Dieselben Eingabedaten zurückgeben Im Folgenden deklarieren wir ein `UserIn`-Modell; es enthält ein Klartext-Passwort: === "Python 3.10+" ```Python hl_lines="7 9" {!> ../../../docs_src/response_model/tutorial002_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="9 11" {!> ../../../docs_src/response_model/tutorial002.py!} ``` !!! info Um `EmailStr` zu verwenden, installieren Sie zuerst `email_validator`. Z. B. `pip install email-validator` oder `pip install pydantic[email]`. Wir verwenden dieses Modell, um sowohl unsere Eingabe- als auch Ausgabedaten zu deklarieren: === "Python 3.10+" ```Python hl_lines="16" {!> ../../../docs_src/response_model/tutorial002_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="18" {!> ../../../docs_src/response_model/tutorial002.py!} ``` Immer wenn jetzt ein Browser einen Benutzer mit Passwort erzeugt, gibt die API dasselbe Passwort in der Response zurück. Hier ist das möglicherweise kein Problem, da es derselbe Benutzer ist, der das Passwort sendet. Aber wenn wir dasselbe Modell für eine andere *Pfadoperation* verwenden, könnten wir das Passwort dieses Benutzers zu jedem Client schicken. !!! danger "Gefahr" Speichern Sie niemals das Klartext-Passwort eines Benutzers, oder versenden Sie es in einer Response wie dieser, wenn Sie sich nicht der resultierenden Gefahren bewusst sind und nicht wissen, was Sie tun. ## Ausgabemodell hinzufügen Wir können stattdessen ein Eingabemodell mit dem Klartext-Passwort, und ein Ausgabemodell ohne das Passwort erstellen: === "Python 3.10+" ```Python hl_lines="9 11 16" {!> ../../../docs_src/response_model/tutorial003_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="9 11 16" {!> ../../../docs_src/response_model/tutorial003.py!} ``` Obwohl unsere *Pfadoperation-Funktion* hier denselben `user` von der Eingabe zurückgibt, der das Passwort enthält: === "Python 3.10+" ```Python hl_lines="24" {!> ../../../docs_src/response_model/tutorial003_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="24" {!> ../../../docs_src/response_model/tutorial003.py!} ``` ... haben wir deklariert, dass `response_model` das Modell `UserOut` ist, welches das Passwort nicht enthält: === "Python 3.10+" ```Python hl_lines="22" {!> ../../../docs_src/response_model/tutorial003_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="22" {!> ../../../docs_src/response_model/tutorial003.py!} ``` Darum wird **FastAPI** sich darum kümmern, dass alle Daten, die nicht im Ausgabemodell deklariert sind, herausgefiltert werden (mittels Pydantic). ### `response_model` oder Rückgabewert Da unsere zwei Modelle in diesem Fall unterschiedlich sind, würde, wenn wir den Rückgabewert der Funktion als `UserOut` deklarieren, der Editor sich beschweren, dass wir einen ungültigen Typ zurückgeben, weil das unterschiedliche Klassen sind. Darum müssen wir es in diesem Fall im `response_model`-Parameter deklarieren. ... aber lesen Sie weiter, um zu sehen, wie man das anders lösen kann. ## Rückgabewert und Datenfilterung Führen wir unser vorheriges Beispiel fort. Wir wollten **die Funktion mit einem Typ annotieren**, aber etwas zurückgeben, das **weniger Daten** enthält. Wir möchten auch, dass FastAPI die Daten weiterhin, dem Responsemodell entsprechend, **filtert**. Im vorherigen Beispiel mussten wir den `response_model`-Parameter verwenden, weil die Klassen unterschiedlich waren. Das bedeutet aber auch, wir bekommen keine Unterstützung vom Editor und anderen Tools, die den Funktions-Rückgabewert überprüfen. Aber in den meisten Fällen, wenn wir so etwas machen, wollen wir nur, dass das Modell einige der Daten **filtert/entfernt**, so wie in diesem Beispiel. Und in solchen Fällen können wir Klassen und Vererbung verwenden, um Vorteil aus den Typannotationen in der Funktion zu ziehen, was vom Editor und von Tools besser unterstützt wird, während wir gleichzeitig FastAPIs **Datenfilterung** behalten. === "Python 3.10+" ```Python hl_lines="7-10 13-14 18" {!> ../../../docs_src/response_model/tutorial003_01_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="9-13 15-16 20" {!> ../../../docs_src/response_model/tutorial003_01.py!} ``` Damit erhalten wir Tool-Unterstützung, vom Editor und mypy, da dieser Code hinsichtlich der Typen korrekt ist, aber wir erhalten auch die Datenfilterung von FastAPI. Wie funktioniert das? Schauen wir uns das mal an. 🤓 ### Typannotationen und Tooling Sehen wir uns zunächst an, wie Editor, mypy und andere Tools dies sehen würden. `BaseUser` verfügt über die Basis-Felder. Dann erbt `UserIn` von `BaseUser` und fügt das Feld `Passwort` hinzu, sodass dass es nun alle Felder beider Modelle hat. Wir annotieren den Funktionsrückgabetyp als `BaseUser`, geben aber tatsächlich eine `UserIn`-Instanz zurück. Für den Editor, mypy und andere Tools ist das kein Problem, da `UserIn` eine Unterklasse von `BaseUser` ist (Salopp: `UserIn` ist ein `BaseUser`). Es handelt sich um einen *gültigen* Typ, solange irgendetwas überreicht wird, das ein `BaseUser` ist. ### FastAPI Datenfilterung FastAPI seinerseits wird den Rückgabetyp sehen und sicherstellen, dass das, was zurückgegeben wird, **nur** diejenigen Felder enthält, welche im Typ deklariert sind. FastAPI macht intern mehrere Dinge mit Pydantic, um sicherzustellen, dass obige Ähnlichkeitsregeln der Klassenvererbung nicht auf die Filterung der zurückgegebenen Daten angewendet werden, sonst könnten Sie am Ende mehr Daten zurückgeben als gewollt. Auf diese Weise erhalten Sie das beste beider Welten: Sowohl Typannotationen mit **Tool-Unterstützung** als auch **Datenfilterung**. ## Anzeige in der Dokumentation Wenn Sie sich die automatische Dokumentation betrachten, können Sie sehen, dass Eingabe- und Ausgabemodell beide ihr eigenes JSON-Schema haben: Und beide Modelle werden auch in der interaktiven API-Dokumentation verwendet: ## Andere Rückgabetyp-Annotationen Es kann Fälle geben, bei denen Sie etwas zurückgeben, das kein gültiges Pydantic-Feld ist, und Sie annotieren es in der Funktion nur, um Unterstützung von Tools zu erhalten (Editor, mypy, usw.). ### Eine Response direkt zurückgeben Der häufigste Anwendungsfall ist, wenn Sie [eine Response direkt zurückgeben, wie es später im Handbuch für fortgeschrittene Benutzer erläutert wird](../advanced/response-directly.md){.internal-link target=_blank}. ```Python hl_lines="8 10-11" {!> ../../../docs_src/response_model/tutorial003_02.py!} ``` Dieser einfache Anwendungsfall wird automatisch von FastAPI gehandhabt, weil die Annotation des Rückgabetyps die Klasse (oder eine Unterklasse von) `Response` ist. Und Tools werden auch glücklich sein, weil sowohl `RedirectResponse` als auch `JSONResponse` Unterklassen von `Response` sind, die Typannotation ist daher korrekt. ### Eine Unterklasse von Response annotieren Sie können auch eine Unterklasse von `Response` in der Typannotation verwenden. ```Python hl_lines="8-9" {!> ../../../docs_src/response_model/tutorial003_03.py!} ``` Das wird ebenfalls funktionieren, weil `RedirectResponse` eine Unterklasse von `Response` ist, und FastAPI sich um diesen einfachen Anwendungsfall automatisch kümmert. ### Ungültige Rückgabetyp-Annotationen Aber wenn Sie ein beliebiges anderes Objekt zurückgeben, das kein gültiger Pydantic-Typ ist (z. B. ein Datenbank-Objekt), und Sie annotieren es so in der Funktion, wird FastAPI versuchen, ein Pydantic-Responsemodell von dieser Typannotation zu erstellen, und scheitern. Das gleiche wird passieren, wenn Sie eine Union mehrerer Typen haben, und einer oder mehrere sind nicht gültige Pydantic-Typen. Zum Beispiel funktioniert folgendes nicht 💥: === "Python 3.10+" ```Python hl_lines="8" {!> ../../../docs_src/response_model/tutorial003_04_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="10" {!> ../../../docs_src/response_model/tutorial003_04.py!} ``` ... das scheitert, da die Typannotation kein Pydantic-Typ ist, und auch keine einzelne `Response`-Klasse, oder -Unterklasse, es ist eine Union (eines von beiden) von `Response` und `dict`. ### Responsemodell deaktivieren Beim Beispiel oben fortsetzend, mögen Sie vielleicht die standardmäßige Datenvalidierung, -Dokumentation, -Filterung, usw., die von FastAPI durchgeführt wird, nicht haben. Aber Sie möchten dennoch den Rückgabetyp in der Funktion annotieren, um Unterstützung von Editoren und Typcheckern (z. B. mypy) zu erhalten. In diesem Fall können Sie die Generierung des Responsemodells abschalten, indem Sie `response_model=None` setzen: === "Python 3.10+" ```Python hl_lines="7" {!> ../../../docs_src/response_model/tutorial003_05_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="9" {!> ../../../docs_src/response_model/tutorial003_05.py!} ``` Das bewirkt, dass FastAPI die Generierung des Responsemodells unterlässt, und damit können Sie jede gewünschte Rückgabetyp-Annotation haben, ohne dass es Ihre FastAPI-Anwendung beeinflusst. 🤓 ## Parameter für die Enkodierung des Responsemodells Ihr Responsemodell könnte Defaultwerte haben, wie: === "Python 3.10+" ```Python hl_lines="9 11-12" {!> ../../../docs_src/response_model/tutorial004_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="11 13-14" {!> ../../../docs_src/response_model/tutorial004_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="11 13-14" {!> ../../../docs_src/response_model/tutorial004.py!} ``` * `description: Union[str, None] = None` (oder `str | None = None` in Python 3.10) hat einen Defaultwert `None`. * `tax: float = 10.5` hat einen Defaultwert `10.5`. * `tags: List[str] = []` hat eine leere Liste als Defaultwert: `[]`. Aber Sie möchten diese vielleicht vom Resultat ausschließen, wenn Sie gar nicht gesetzt wurden. Wenn Sie zum Beispiel Modelle mit vielen optionalen Attributen in einer NoSQL-Datenbank haben, und Sie möchten nicht ellenlange JSON-Responses voller Defaultwerte senden. ### Den `response_model_exclude_unset`-Parameter verwenden Sie können den *Pfadoperation-Dekorator*-Parameter `response_model_exclude_unset=True` setzen: === "Python 3.10+" ```Python hl_lines="22" {!> ../../../docs_src/response_model/tutorial004_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="24" {!> ../../../docs_src/response_model/tutorial004_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="24" {!> ../../../docs_src/response_model/tutorial004.py!} ``` Die Defaultwerte werden dann nicht in der Response enthalten sein, sondern nur die tatsächlich gesetzten Werte. Wenn Sie also den Artikel mit der ID `foo` bei der *Pfadoperation* anfragen, wird (ohne die Defaultwerte) die Response sein: ```JSON { "name": "Foo", "price": 50.2 } ``` !!! info In Pydantic v1 hieß diese Methode `.dict()`, in Pydantic v2 wurde sie deprecated (aber immer noch unterstützt) und in `.model_dump()` umbenannt. Die Beispiele hier verwenden `.dict()` für die Kompatibilität mit Pydantic v1, Sie sollten jedoch stattdessen `.model_dump()` verwenden, wenn Sie Pydantic v2 verwenden können. !!! info FastAPI verwendet `.dict()` von Pydantic Modellen, mit dessen `exclude_unset`-Parameter, um das zu erreichen. !!! info Sie können auch: * `response_model_exclude_defaults=True` * `response_model_exclude_none=True` verwenden, wie in der Pydantic Dokumentation für `exclude_defaults` und `exclude_none` beschrieben. #### Daten mit Werten für Felder mit Defaultwerten Aber wenn ihre Daten Werte für Modellfelder mit Defaultwerten haben, wie etwa der Artikel mit der ID `bar`: ```Python hl_lines="3 5" { "name": "Bar", "description": "The bartenders", "price": 62, "tax": 20.2 } ``` dann werden diese Werte in der Response enthalten sein. #### Daten mit den gleichen Werten wie die Defaultwerte Wenn Daten die gleichen Werte haben wie ihre Defaultwerte, wie etwa der Artikel mit der ID `baz`: ```Python hl_lines="3 5-6" { "name": "Baz", "description": None, "price": 50.2, "tax": 10.5, "tags": [] } ``` dann ist FastAPI klug genug (tatsächlich ist Pydantic klug genug) zu erkennen, dass, obwohl `description`, `tax`, und `tags` die gleichen Werte haben wie ihre Defaultwerte, sie explizit gesetzt wurden (statt dass sie von den Defaultwerten genommen wurden). Diese Felder werden also in der JSON-Response enthalten sein. !!! tip "Tipp" Beachten Sie, dass Defaultwerte alles Mögliche sein können, nicht nur `None`. Sie können eine Liste (`[]`), ein `float` `10.5`, usw. sein. ### `response_model_include` und `response_model_exclude` Sie können auch die Parameter `response_model_include` und `response_model_exclude` im **Pfadoperation-Dekorator** verwenden. Diese nehmen ein `set` von `str`s entgegen, welches Namen von Attributen sind, die eingeschlossen (ohne die Anderen) oder ausgeschlossen (nur die Anderen) werden sollen. Das kann als schnelle Abkürzung verwendet werden, wenn Sie nur ein Pydantic-Modell haben und ein paar Daten von der Ausgabe ausschließen wollen. !!! tip "Tipp" Es wird dennoch empfohlen, dass Sie die Ideen von oben verwenden, also mehrere Klassen statt dieser Parameter. Der Grund ist, dass das das generierte JSON-Schema in der OpenAPI ihrer Anwendung (und deren Dokumentation) dennoch das komplette Modell abbildet, selbst wenn Sie `response_model_include` oder `response_model_exclude` verwenden, um einige Attribute auszuschließen. Das trifft auch auf `response_model_by_alias` zu, welches ähnlich funktioniert. === "Python 3.10+" ```Python hl_lines="29 35" {!> ../../../docs_src/response_model/tutorial005_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="31 37" {!> ../../../docs_src/response_model/tutorial005.py!} ``` !!! tip "Tipp" Die Syntax `{"name", "description"}` erzeugt ein `set` mit diesen zwei Werten. Äquivalent zu `set(["name", "description"])`. #### `list`en statt `set`s verwenden Wenn Sie vergessen, ein `set` zu verwenden, und stattdessen eine `list`e oder ein `tuple` übergeben, wird FastAPI die dennoch in ein `set` konvertieren, und es wird korrekt funktionieren: === "Python 3.10+" ```Python hl_lines="29 35" {!> ../../../docs_src/response_model/tutorial006_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="31 37" {!> ../../../docs_src/response_model/tutorial006.py!} ``` ## Zusammenfassung Verwenden Sie den Parameter `response_model` im *Pfadoperation-Dekorator*, um Responsemodelle zu definieren, und besonders, um private Daten herauszufiltern. Verwenden Sie `response_model_exclude_unset`, um nur explizit gesetzte Werte zurückzugeben. fastapi-0.110.3/docs/de/docs/tutorial/response-status-code.md000066400000000000000000000112461461403617600240430ustar00rootroot00000000000000# Response-Statuscode So wie ein Responsemodell, können Sie auch einen HTTP-Statuscode für die Response deklarieren, mithilfe des Parameters `status_code`, und zwar in jeder der *Pfadoperationen*: * `@app.get()` * `@app.post()` * `@app.put()` * `@app.delete()` * usw. ```Python hl_lines="6" {!../../../docs_src/response_status_code/tutorial001.py!} ``` !!! note "Hinweis" Beachten Sie, dass `status_code` ein Parameter der „Dekorator“-Methode ist (`get`, `post`, usw.). Nicht der *Pfadoperation-Funktion*, so wie die anderen Parameter und der Body. Dem `status_code`-Parameter wird eine Zahl mit dem HTTP-Statuscode übergeben. !!! info Alternativ kann `status_code` auch ein `IntEnum` erhalten, so wie Pythons `http.HTTPStatus`. Das wird: * Diesen Statuscode mit der Response zurücksenden. * Ihn als solchen im OpenAPI-Schema dokumentieren (und somit in den Benutzeroberflächen): !!! note "Hinweis" Einige Responsecodes (siehe nächster Abschnitt) kennzeichnen, dass die Response keinen Body hat. FastAPI versteht das und wird in der OpenAPI-Dokumentation anzeigen, dass es keinen Responsebody gibt. ## Über HTTP-Statuscodes !!! note "Hinweis" Wenn Sie bereits wissen, was HTTP-Statuscodes sind, überspringen Sie dieses Kapitel und fahren Sie mit dem nächsten fort. In HTTP senden Sie als Teil der Response einen aus drei Ziffern bestehenden numerischen Statuscode. Diese Statuscodes haben einen Namen zugeordnet, um sie besser zu erkennen, aber der wichtige Teil ist die Zahl. Kurz: * `100` und darüber stehen für „Information“. Diese verwenden Sie selten direkt. Responses mit diesen Statuscodes können keinen Body haben. * **`200`** und darüber stehen für Responses, die „Successful“ („Erfolgreich“) waren. Diese verwenden Sie am häufigsten. * `200` ist der Default-Statuscode, welcher bedeutet, alles ist „OK“. * Ein anderes Beispiel ist `201`, „Created“ („Erzeugt“). Wird in der Regel verwendet, wenn ein neuer Datensatz in der Datenbank erzeugt wurde. * Ein spezieller Fall ist `204`, „No Content“ („Kein Inhalt“). Diese Response wird verwendet, wenn es keinen Inhalt gibt, der zum Client zurückgeschickt wird, diese Response hat also keinen Body. * **`300`** und darüber steht für „Redirection“ („Umleitung“). Responses mit diesen Statuscodes können einen oder keinen Body haben, mit Ausnahme von `304`, „Not Modified“ („Nicht verändert“), welche keinen haben darf. * **`400`** und darüber stehen für „Client error“-Responses („Client-Fehler“). Auch diese verwenden Sie am häufigsten. * Ein Beispiel ist `404`, für eine „Not Found“-Response („Nicht gefunden“). * Für allgemeine Fehler beim Client können Sie einfach `400` verwenden. * `500` und darüber stehen für Server-Fehler. Diese verwenden Sie fast nie direkt. Wenn etwas an irgendeiner Stelle in Ihrem Anwendungscode oder im Server schiefläuft, wird automatisch einer dieser Fehler-Statuscodes zurückgegeben. !!! tip "Tipp" Um mehr über Statuscodes zu lernen, und welcher wofür verwendet wird, lesen Sie die MDN Dokumentation über HTTP-Statuscodes. ## Abkürzung, um die Namen zu erinnern Schauen wir uns das vorherige Beispiel noch einmal an: ```Python hl_lines="6" {!../../../docs_src/response_status_code/tutorial001.py!} ``` `201` ist der Statuscode für „Created“ („Erzeugt“). Aber Sie müssen sich nicht daran erinnern, welcher dieser Codes was bedeutet. Sie können die Hilfsvariablen von `fastapi.status` verwenden. ```Python hl_lines="1 6" {!../../../docs_src/response_status_code/tutorial002.py!} ``` Diese sind nur eine Annehmlichkeit und enthalten dieselbe Nummer, aber auf diese Weise können Sie die Autovervollständigung Ihres Editors verwenden, um sie zu finden: !!! note "Technische Details" Sie können auch `from starlette import status` verwenden. **FastAPI** bietet dieselben `starlette.status`-Codes auch via `fastapi.status` an, als Annehmlichkeit für Sie, den Entwickler. Sie kommen aber direkt von Starlette. ## Den Defaultwert ändern Später sehen Sie, im [Handbuch für fortgeschrittene Benutzer](../advanced/response-change-status-code.md){.internal-link target=_blank}, wie Sie einen anderen Statuscode zurückgeben können, als den Default, den Sie hier deklarieren. fastapi-0.110.3/docs/de/docs/tutorial/schema-extra-example.md000066400000000000000000000325141461403617600237670ustar00rootroot00000000000000# Beispiel-Request-Daten deklarieren Sie können Beispiele für die Daten deklarieren, die Ihre Anwendung empfangen kann. Hier sind mehrere Möglichkeiten, das zu tun. ## Zusätzliche JSON-Schemadaten in Pydantic-Modellen Sie können `examples` („Beispiele“) für ein Pydantic-Modell deklarieren, welche dem generierten JSON-Schema hinzugefügt werden. === "Python 3.10+ Pydantic v2" ```Python hl_lines="13-24" {!> ../../../docs_src/schema_extra_example/tutorial001_py310.py!} ``` === "Python 3.10+ Pydantic v1" ```Python hl_lines="13-23" {!> ../../../docs_src/schema_extra_example/tutorial001_py310_pv1.py!} ``` === "Python 3.8+ Pydantic v2" ```Python hl_lines="15-26" {!> ../../../docs_src/schema_extra_example/tutorial001.py!} ``` === "Python 3.8+ Pydantic v1" ```Python hl_lines="15-25" {!> ../../../docs_src/schema_extra_example/tutorial001_pv1.py!} ``` Diese zusätzlichen Informationen werden unverändert zum für dieses Modell ausgegebenen **JSON-Schema** hinzugefügt und in der API-Dokumentation verwendet. === "Pydantic v2" In Pydantic Version 2 würden Sie das Attribut `model_config` verwenden, das ein `dict` akzeptiert, wie beschrieben in Pydantic-Dokumentation: Configuration. Sie können `json_schema_extra` setzen, mit einem `dict`, das alle zusätzlichen Daten enthält, die im generierten JSON-Schema angezeigt werden sollen, einschließlich `examples`. === "Pydantic v1" In Pydantic Version 1 würden Sie eine interne Klasse `Config` und `schema_extra` verwenden, wie beschrieben in Pydantic-Dokumentation: Schema customization. Sie können `schema_extra` setzen, mit einem `dict`, das alle zusätzlichen Daten enthält, die im generierten JSON-Schema angezeigt werden sollen, einschließlich `examples`. !!! tip "Tipp" Mit derselben Technik können Sie das JSON-Schema erweitern und Ihre eigenen benutzerdefinierten Zusatzinformationen hinzufügen. Sie könnten das beispielsweise verwenden, um Metadaten für eine Frontend-Benutzeroberfläche usw. hinzuzufügen. !!! info OpenAPI 3.1.0 (verwendet seit FastAPI 0.99.0) hat Unterstützung für `examples` hinzugefügt, was Teil des **JSON Schema** Standards ist. Zuvor unterstützte es nur das Schlüsselwort `example` mit einem einzigen Beispiel. Dieses wird weiterhin von OpenAPI 3.1.0 unterstützt, ist jedoch deprecated und nicht Teil des JSON Schema Standards. Wir empfehlen Ihnen daher, von `example` nach `examples` zu migrieren. 🤓 Mehr erfahren Sie am Ende dieser Seite. ## Zusätzliche Argumente für `Field` Wenn Sie `Field()` mit Pydantic-Modellen verwenden, können Sie ebenfalls zusätzliche `examples` deklarieren: === "Python 3.10+" ```Python hl_lines="2 8-11" {!> ../../../docs_src/schema_extra_example/tutorial002_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="4 10-13" {!> ../../../docs_src/schema_extra_example/tutorial002.py!} ``` ## `examples` im JSON-Schema – OpenAPI Bei Verwendung von: * `Path()` * `Query()` * `Header()` * `Cookie()` * `Body()` * `Form()` * `File()` können Sie auch eine Gruppe von `examples` mit zusätzlichen Informationen deklarieren, die zu ihren **JSON-Schemas** innerhalb von **OpenAPI** hinzugefügt werden. ### `Body` mit `examples` Hier übergeben wir `examples`, welches ein einzelnes Beispiel für die in `Body()` erwarteten Daten enthält: === "Python 3.10+" ```Python hl_lines="22-29" {!> ../../../docs_src/schema_extra_example/tutorial003_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="22-29" {!> ../../../docs_src/schema_extra_example/tutorial003_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="23-30" {!> ../../../docs_src/schema_extra_example/tutorial003_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="18-25" {!> ../../../docs_src/schema_extra_example/tutorial003_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="20-27" {!> ../../../docs_src/schema_extra_example/tutorial003.py!} ``` ### Beispiel in der Dokumentations-Benutzeroberfläche Mit jeder der oben genannten Methoden würde es in `/docs` so aussehen: ### `Body` mit mehreren `examples` Sie können natürlich auch mehrere `examples` übergeben: === "Python 3.10+" ```Python hl_lines="23-38" {!> ../../../docs_src/schema_extra_example/tutorial004_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="23-38" {!> ../../../docs_src/schema_extra_example/tutorial004_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="24-39" {!> ../../../docs_src/schema_extra_example/tutorial004_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="19-34" {!> ../../../docs_src/schema_extra_example/tutorial004_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="21-36" {!> ../../../docs_src/schema_extra_example/tutorial004.py!} ``` Wenn Sie das tun, werden die Beispiele Teil des internen **JSON-Schemas** für diese Body-Daten. Während dies geschrieben wird, unterstützt Swagger UI, das für die Anzeige der Dokumentations-Benutzeroberfläche zuständige Tool, jedoch nicht die Anzeige mehrerer Beispiele für die Daten in **JSON Schema**. Aber lesen Sie unten für einen Workaround weiter. ### OpenAPI-spezifische `examples` Schon bevor **JSON Schema** `examples` unterstützte, unterstützte OpenAPI ein anderes Feld, das auch `examples` genannt wurde. Diese **OpenAPI-spezifischen** `examples` finden sich in einem anderen Abschnitt der OpenAPI-Spezifikation. Sie sind **Details für jede *Pfadoperation***, nicht für jedes JSON-Schema. Und Swagger UI unterstützt dieses spezielle Feld `examples` schon seit einiger Zeit. Sie können es also verwenden, um verschiedene **Beispiele in der Benutzeroberfläche der Dokumentation anzuzeigen**. Das Format dieses OpenAPI-spezifischen Felds `examples` ist ein `dict` mit **mehreren Beispielen** (anstelle einer `list`e), jedes mit zusätzlichen Informationen, die auch zu **OpenAPI** hinzugefügt werden. Dies erfolgt nicht innerhalb jedes in OpenAPI enthaltenen JSON-Schemas, sondern außerhalb, in der *Pfadoperation*. ### Verwendung des Parameters `openapi_examples` Sie können die OpenAPI-spezifischen `examples` in FastAPI mit dem Parameter `openapi_examples` deklarieren, für: * `Path()` * `Query()` * `Header()` * `Cookie()` * `Body()` * `Form()` * `File()` Die Schlüssel des `dict` identifizieren jedes Beispiel, und jeder Wert (`"value"`) ist ein weiteres `dict`. Jedes spezifische Beispiel-`dict` in den `examples` kann Folgendes enthalten: * `summary`: Kurze Beschreibung für das Beispiel. * `description`: Eine lange Beschreibung, die Markdown-Text enthalten kann. * `value`: Dies ist das tatsächlich angezeigte Beispiel, z. B. ein `dict`. * `externalValue`: Alternative zu `value`, eine URL, die auf das Beispiel verweist. Allerdings wird dies möglicherweise nicht von so vielen Tools unterstützt wie `value`. Sie können es so verwenden: === "Python 3.10+" ```Python hl_lines="23-49" {!> ../../../docs_src/schema_extra_example/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="23-49" {!> ../../../docs_src/schema_extra_example/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="24-50" {!> ../../../docs_src/schema_extra_example/tutorial005_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="19-45" {!> ../../../docs_src/schema_extra_example/tutorial005_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="21-47" {!> ../../../docs_src/schema_extra_example/tutorial005.py!} ``` ### OpenAPI-Beispiele in der Dokumentations-Benutzeroberfläche Wenn `openapi_examples` zu `Body()` hinzugefügt wird, würde `/docs` so aussehen: ## Technische Details !!! tip "Tipp" Wenn Sie bereits **FastAPI** Version **0.99.0 oder höher** verwenden, können Sie diese Details wahrscheinlich **überspringen**. Sie sind für ältere Versionen relevanter, bevor OpenAPI 3.1.0 verfügbar war. Sie können dies als eine kurze **Geschichtsstunde** zu OpenAPI und JSON Schema betrachten. 🤓 !!! warning "Achtung" Dies sind sehr technische Details zu den Standards **JSON Schema** und **OpenAPI**. Wenn die oben genannten Ideen bereits für Sie funktionieren, reicht das möglicherweise aus und Sie benötigen diese Details wahrscheinlich nicht, überspringen Sie sie gerne. Vor OpenAPI 3.1.0 verwendete OpenAPI eine ältere und modifizierte Version von **JSON Schema**. JSON Schema hatte keine `examples`, daher fügte OpenAPI seiner eigenen modifizierten Version ein eigenes `example`-Feld hinzu. OpenAPI fügte auch die Felder `example` und `examples` zu anderen Teilen der Spezifikation hinzu: * `Parameter Object` (in der Spezifikation), das verwendet wurde von FastAPIs: * `Path()` * `Query()` * `Header()` * `Cookie()` * `Request Body Object` im Feld `content` des `Media Type Object`s (in der Spezifikation), das verwendet wurde von FastAPIs: * `Body()` * `File()` * `Form()` !!! info Dieser alte, OpenAPI-spezifische `examples`-Parameter heißt seit FastAPI `0.103.0` jetzt `openapi_examples`. ### JSON Schemas Feld `examples` Aber dann fügte JSON Schema ein `examples`-Feld zu einer neuen Version der Spezifikation hinzu. Und dann basierte das neue OpenAPI 3.1.0 auf der neuesten Version (JSON Schema 2020-12), die dieses neue Feld `examples` enthielt. Und jetzt hat dieses neue `examples`-Feld Vorrang vor dem alten (und benutzerdefinierten) `example`-Feld, im Singular, das jetzt deprecated ist. Dieses neue `examples`-Feld in JSON Schema ist **nur eine `list`e** von Beispielen, kein Dict mit zusätzlichen Metadaten wie an den anderen Stellen in OpenAPI (oben beschrieben). !!! info Selbst, nachdem OpenAPI 3.1.0 veröffentlicht wurde, mit dieser neuen, einfacheren Integration mit JSON Schema, unterstützte Swagger UI, das Tool, das die automatische Dokumentation bereitstellt, eine Zeit lang OpenAPI 3.1.0 nicht (das tut es seit Version 5.0.0 🎉). Aus diesem Grund verwendeten Versionen von FastAPI vor 0.99.0 immer noch Versionen von OpenAPI vor 3.1.0. ### Pydantic- und FastAPI-`examples` Wenn Sie `examples` innerhalb eines Pydantic-Modells hinzufügen, indem Sie `schema_extra` oder `Field(examples=["something"])` verwenden, wird dieses Beispiel dem **JSON-Schema** für dieses Pydantic-Modell hinzugefügt. Und dieses **JSON-Schema** des Pydantic-Modells ist in der **OpenAPI** Ihrer API enthalten und wird dann in der Benutzeroberfläche der Dokumentation verwendet. In Versionen von FastAPI vor 0.99.0 (0.99.0 und höher verwenden das neuere OpenAPI 3.1.0), wenn Sie `example` oder `examples` mit einem der anderen Werkzeuge (`Query()`, `Body()`, usw.) verwendet haben, wurden diese Beispiele nicht zum JSON-Schema hinzugefügt, das diese Daten beschreibt (nicht einmal zur OpenAPI-eigenen Version von JSON Schema), sondern direkt zur *Pfadoperation*-Deklaration in OpenAPI (außerhalb der Teile von OpenAPI, die JSON Schema verwenden). Aber jetzt, da FastAPI 0.99.0 und höher, OpenAPI 3.1.0 verwendet, das JSON Schema 2020-12 verwendet, und Swagger UI 5.0.0 und höher, ist alles konsistenter und die Beispiele sind in JSON Schema enthalten. ### Swagger-Benutzeroberfläche und OpenAPI-spezifische `examples`. Da die Swagger-Benutzeroberfläche derzeit nicht mehrere JSON Schema Beispiele unterstützt (Stand: 26.08.2023), hatten Benutzer keine Möglichkeit, mehrere Beispiele in der Dokumentation anzuzeigen. Um dieses Problem zu lösen, hat FastAPI `0.103.0` **Unterstützung** für die Deklaration desselben alten **OpenAPI-spezifischen** `examples`-Felds mit dem neuen Parameter `openapi_examples` hinzugefügt. 🤓 ### Zusammenfassung Ich habe immer gesagt, dass ich Geschichte nicht so sehr mag ... und jetzt schauen Sie mich an, wie ich „Technikgeschichte“-Unterricht gebe. 😅 Kurz gesagt: **Upgraden Sie auf FastAPI 0.99.0 oder höher**, und die Dinge sind viel **einfacher, konsistenter und intuitiver**, und Sie müssen nicht alle diese historischen Details kennen. 😎 fastapi-0.110.3/docs/de/docs/tutorial/security/000077500000000000000000000000001461403617600212755ustar00rootroot00000000000000fastapi-0.110.3/docs/de/docs/tutorial/security/first-steps.md000066400000000000000000000244501461403617600241070ustar00rootroot00000000000000# Sicherheit – Erste Schritte Stellen wir uns vor, dass Sie Ihre **Backend**-API auf einer Domain haben. Und Sie haben ein **Frontend** auf einer anderen Domain oder in einem anderen Pfad derselben Domain (oder in einer mobilen Anwendung). Und Sie möchten eine Möglichkeit haben, dass sich das Frontend mithilfe eines **Benutzernamens** und eines **Passworts** beim Backend authentisieren kann. Wir können **OAuth2** verwenden, um das mit **FastAPI** zu erstellen. Aber ersparen wir Ihnen die Zeit, die gesamte lange Spezifikation zu lesen, nur um die kleinen Informationen zu finden, die Sie benötigen. Lassen Sie uns die von **FastAPI** bereitgestellten Tools verwenden, um Sicherheit zu gewährleisten. ## Wie es aussieht Lassen Sie uns zunächst einfach den Code verwenden und sehen, wie er funktioniert, und dann kommen wir zurück, um zu verstehen, was passiert. ## `main.py` erstellen Kopieren Sie das Beispiel in eine Datei `main.py`: === "Python 3.9+" ```Python {!> ../../../docs_src/security/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python {!> ../../../docs_src/security/tutorial001_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python {!> ../../../docs_src/security/tutorial001.py!} ``` ## Ausführen !!! info Um hochgeladene Dateien zu empfangen, installieren Sie zuerst `python-multipart`. Z. B. `pip install python-multipart`. Das, weil **OAuth2** „Formulardaten“ zum Senden von `username` und `password` verwendet. Führen Sie das Beispiel aus mit:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
## Überprüfen Gehen Sie zu der interaktiven Dokumentation unter: http://127.0.0.1:8000/docs. Sie werden etwa Folgendes sehen: !!! check "Authorize-Button!" Sie haben bereits einen glänzenden, neuen „Authorize“-Button. Und Ihre *Pfadoperation* hat in der oberen rechten Ecke ein kleines Schloss, auf das Sie klicken können. Und wenn Sie darauf klicken, erhalten Sie ein kleines Anmeldeformular zur Eingabe eines `username` und `password` (und anderer optionaler Felder): !!! note "Hinweis" Es spielt keine Rolle, was Sie in das Formular eingeben, es wird noch nicht funktionieren. Wir kommen dahin. Dies ist natürlich nicht das Frontend für die Endbenutzer, aber es ist ein großartiges automatisches Tool, um Ihre gesamte API interaktiv zu dokumentieren. Es kann vom Frontend-Team verwendet werden (das auch Sie selbst sein können). Es kann von Anwendungen und Systemen Dritter verwendet werden. Und es kann auch von Ihnen selbst verwendet werden, um dieselbe Anwendung zu debuggen, zu prüfen und zu testen. ## Der `password`-Flow Lassen Sie uns nun etwas zurückgehen und verstehen, was das alles ist. Der `password`-„Flow“ ist eine der in OAuth2 definierten Wege („Flows“) zur Handhabung von Sicherheit und Authentifizierung. OAuth2 wurde so konzipiert, dass das Backend oder die API unabhängig vom Server sein kann, der den Benutzer authentifiziert. In diesem Fall handhabt jedoch dieselbe **FastAPI**-Anwendung sowohl die API als auch die Authentifizierung. Betrachten wir es also aus dieser vereinfachten Sicht: * Der Benutzer gibt den `username` und das `password` im Frontend ein und drückt `Enter`. * Das Frontend (das im Browser des Benutzers läuft) sendet diesen `username` und das `password` an eine bestimmte URL in unserer API (deklariert mit `tokenUrl="token"`). * Die API überprüft den `username` und das `password` und antwortet mit einem „Token“ (wir haben davon noch nichts implementiert). * Ein „Token“ ist lediglich ein String mit einem Inhalt, den wir später verwenden können, um diesen Benutzer zu verifizieren. * Normalerweise läuft ein Token nach einiger Zeit ab. * Daher muss sich der Benutzer irgendwann später erneut anmelden. * Und wenn der Token gestohlen wird, ist das Risiko geringer. Es handelt sich nicht um einen dauerhaften Schlüssel, der (in den meisten Fällen) für immer funktioniert. * Das Frontend speichert diesen Token vorübergehend irgendwo. * Der Benutzer klickt im Frontend, um zu einem anderen Abschnitt der Frontend-Web-Anwendung zu gelangen. * Das Frontend muss weitere Daten von der API abrufen. * Es benötigt jedoch eine Authentifizierung für diesen bestimmten Endpunkt. * Um sich also bei unserer API zu authentifizieren, sendet es einen Header `Authorization` mit dem Wert `Bearer` plus dem Token. * Wenn der Token `foobar` enthielte, wäre der Inhalt des `Authorization`-Headers: `Bearer foobar`. ## **FastAPI**s `OAuth2PasswordBearer` **FastAPI** bietet mehrere Tools auf unterschiedlichen Abstraktionsebenen zur Implementierung dieser Sicherheitsfunktionen. In diesem Beispiel verwenden wir **OAuth2** mit dem **Password**-Flow und einem **Bearer**-Token. Wir machen das mit der Klasse `OAuth2PasswordBearer`. !!! info Ein „Bearer“-Token ist nicht die einzige Option. Aber es ist die beste für unseren Anwendungsfall. Und es ist wahrscheinlich auch für die meisten anderen Anwendungsfälle die beste, es sei denn, Sie sind ein OAuth2-Experte und wissen genau, warum es eine andere Option gibt, die Ihren Anforderungen besser entspricht. In dem Fall gibt Ihnen **FastAPI** ebenfalls die Tools, die Sie zum Erstellen brauchen. Wenn wir eine Instanz der Klasse `OAuth2PasswordBearer` erstellen, übergeben wir den Parameter `tokenUrl`. Dieser Parameter enthält die URL, die der Client (das Frontend, das im Browser des Benutzers ausgeführt wird) verwendet, wenn er den `username` und das `password` sendet, um einen Token zu erhalten. === "Python 3.9+" ```Python hl_lines="8" {!> ../../../docs_src/security/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="7" {!> ../../../docs_src/security/tutorial001_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="6" {!> ../../../docs_src/security/tutorial001.py!} ``` !!! tip "Tipp" Hier bezieht sich `tokenUrl="token"` auf eine relative URL `token`, die wir noch nicht erstellt haben. Da es sich um eine relative URL handelt, entspricht sie `./token`. Da wir eine relative URL verwenden, würde sich das, wenn sich Ihre API unter `https://example.com/` befindet, auf `https://example.com/token` beziehen. Wenn sich Ihre API jedoch unter `https://example.com/api/v1/` befände, würde es sich auf `https://example.com/api/v1/token` beziehen. Die Verwendung einer relativen URL ist wichtig, um sicherzustellen, dass Ihre Anwendung auch in einem fortgeschrittenen Anwendungsfall, wie [hinter einem Proxy](../../advanced/behind-a-proxy.md){.internal-link target=_blank}, weiterhin funktioniert. Dieser Parameter erstellt nicht diesen Endpunkt / diese *Pfadoperation*, sondern deklariert, dass die URL `/token` diejenige sein wird, die der Client verwenden soll, um den Token abzurufen. Diese Information wird in OpenAPI und dann in den interaktiven API-Dokumentationssystemen verwendet. Wir werden demnächst auch die eigentliche Pfadoperation erstellen. !!! info Wenn Sie ein sehr strenger „Pythonista“ sind, missfällt Ihnen möglicherweise die Schreibweise des Parameternamens `tokenUrl` anstelle von `token_url`. Das liegt daran, dass FastAPI denselben Namen wie in der OpenAPI-Spezifikation verwendet. Sodass Sie, wenn Sie mehr über eines dieser Sicherheitsschemas herausfinden möchten, den Namen einfach kopieren und einfügen können, um weitere Informationen darüber zu erhalten. Die Variable `oauth2_scheme` ist eine Instanz von `OAuth2PasswordBearer`, aber auch ein „Callable“. Es könnte wie folgt aufgerufen werden: ```Python oauth2_scheme(some, parameters) ``` Es kann also mit `Depends` verwendet werden. ### Verwendung Jetzt können Sie dieses `oauth2_scheme` als Abhängigkeit `Depends` übergeben. === "Python 3.9+" ```Python hl_lines="12" {!> ../../../docs_src/security/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="11" {!> ../../../docs_src/security/tutorial001_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="10" {!> ../../../docs_src/security/tutorial001.py!} ``` Diese Abhängigkeit stellt einen `str` bereit, der dem Parameter `token` der *Pfadoperation-Funktion* zugewiesen wird. **FastAPI** weiß, dass es diese Abhängigkeit verwenden kann, um ein „Sicherheitsschema“ im OpenAPI-Schema (und der automatischen API-Dokumentation) zu definieren. !!! info "Technische Details" **FastAPI** weiß, dass es die Klasse `OAuth2PasswordBearer` (deklariert in einer Abhängigkeit) verwenden kann, um das Sicherheitsschema in OpenAPI zu definieren, da es von `fastapi.security.oauth2.OAuth2` erbt, das wiederum von `fastapi.security.base.SecurityBase` erbt. Alle Sicherheits-Werkzeuge, die in OpenAPI integriert sind (und die automatische API-Dokumentation), erben von `SecurityBase`, so weiß **FastAPI**, wie es sie in OpenAPI integrieren muss. ## Was es macht FastAPI wird im Request nach diesem `Authorization`-Header suchen, prüfen, ob der Wert `Bearer` plus ein Token ist, und den Token als `str` zurückgeben. Wenn es keinen `Authorization`-Header sieht, oder der Wert keinen `Bearer`-Token hat, antwortet es direkt mit einem 401-Statuscode-Error (`UNAUTHORIZED`). Sie müssen nicht einmal prüfen, ob der Token existiert, um einen Fehler zurückzugeben. Seien Sie sicher, dass Ihre Funktion, wenn sie ausgeführt wird, ein `str` in diesem Token enthält. Sie können das bereits in der interaktiven Dokumentation ausprobieren: Wir überprüfen im Moment noch nicht die Gültigkeit des Tokens, aber das ist bereits ein Anfang. ## Zusammenfassung Mit nur drei oder vier zusätzlichen Zeilen haben Sie also bereits eine primitive Form der Sicherheit. fastapi-0.110.3/docs/de/docs/tutorial/security/get-current-user.md000066400000000000000000000207251461403617600250400ustar00rootroot00000000000000# Aktuellen Benutzer abrufen Im vorherigen Kapitel hat das Sicherheitssystem (das auf dem Dependency Injection System basiert) der *Pfadoperation-Funktion* einen `token` vom Typ `str` überreicht: === "Python 3.9+" ```Python hl_lines="12" {!> ../../../docs_src/security/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="11" {!> ../../../docs_src/security/tutorial001_an.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="10" {!> ../../../docs_src/security/tutorial001.py!} ``` Aber das ist immer noch nicht so nützlich. Lassen wir es uns den aktuellen Benutzer überreichen. ## Ein Benutzermodell erstellen Erstellen wir zunächst ein Pydantic-Benutzermodell. So wie wir Pydantic zum Deklarieren von Bodys verwenden, können wir es auch überall sonst verwenden: === "Python 3.10+" ```Python hl_lines="5 12-16" {!> ../../../docs_src/security/tutorial002_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="5 12-16" {!> ../../../docs_src/security/tutorial002_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="5 13-17" {!> ../../../docs_src/security/tutorial002_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="3 10-14" {!> ../../../docs_src/security/tutorial002_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="5 12-16" {!> ../../../docs_src/security/tutorial002.py!} ``` ## Eine `get_current_user`-Abhängigkeit erstellen Erstellen wir eine Abhängigkeit `get_current_user`. Erinnern Sie sich, dass Abhängigkeiten Unterabhängigkeiten haben können? `get_current_user` wird seinerseits von `oauth2_scheme` abhängen, das wir zuvor erstellt haben. So wie wir es zuvor in der *Pfadoperation* direkt gemacht haben, erhält unsere neue Abhängigkeit `get_current_user` von der Unterabhängigkeit `oauth2_scheme` einen `token` vom Typ `str`: === "Python 3.10+" ```Python hl_lines="25" {!> ../../../docs_src/security/tutorial002_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="25" {!> ../../../docs_src/security/tutorial002_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="26" {!> ../../../docs_src/security/tutorial002_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="23" {!> ../../../docs_src/security/tutorial002_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="25" {!> ../../../docs_src/security/tutorial002.py!} ``` ## Den Benutzer holen `get_current_user` wird eine von uns erstellte (gefakte) Hilfsfunktion verwenden, welche einen Token vom Typ `str` entgegennimmt und unser Pydantic-`User`-Modell zurückgibt: === "Python 3.10+" ```Python hl_lines="19-22 26-27" {!> ../../../docs_src/security/tutorial002_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="19-22 26-27" {!> ../../../docs_src/security/tutorial002_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="20-23 27-28" {!> ../../../docs_src/security/tutorial002_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="17-20 24-25" {!> ../../../docs_src/security/tutorial002_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="19-22 26-27" {!> ../../../docs_src/security/tutorial002.py!} ``` ## Den aktuellen Benutzer einfügen Und jetzt können wir wiederum `Depends` mit unserem `get_current_user` in der *Pfadoperation* verwenden: === "Python 3.10+" ```Python hl_lines="31" {!> ../../../docs_src/security/tutorial002_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="31" {!> ../../../docs_src/security/tutorial002_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="32" {!> ../../../docs_src/security/tutorial002_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="29" {!> ../../../docs_src/security/tutorial002_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="31" {!> ../../../docs_src/security/tutorial002.py!} ``` Beachten Sie, dass wir als Typ von `current_user` das Pydantic-Modell `User` deklarieren. Das wird uns innerhalb der Funktion bei Codevervollständigung und Typprüfungen helfen. !!! tip "Tipp" Sie erinnern sich vielleicht, dass Requestbodys ebenfalls mit Pydantic-Modellen deklariert werden. Weil Sie `Depends` verwenden, wird **FastAPI** hier aber nicht verwirrt. !!! check Die Art und Weise, wie dieses System von Abhängigkeiten konzipiert ist, ermöglicht es uns, verschiedene Abhängigkeiten (verschiedene „Dependables“) zu haben, die alle ein `User`-Modell zurückgeben. Wir sind nicht darauf beschränkt, nur eine Abhängigkeit zu haben, die diesen Typ von Daten zurückgeben kann. ## Andere Modelle Sie können jetzt den aktuellen Benutzer direkt in den *Pfadoperation-Funktionen* abrufen und die Sicherheitsmechanismen auf **Dependency Injection** Ebene handhaben, mittels `Depends`. Und Sie können alle Modelle und Daten für die Sicherheitsanforderungen verwenden (in diesem Fall ein Pydantic-Modell `User`). Sie sind jedoch nicht auf die Verwendung von bestimmten Datenmodellen, Klassen, oder Typen beschränkt. Möchten Sie eine `id` und eine `email` und keinen `username` in Ihrem Modell haben? Kein Problem. Sie können dieselben Tools verwenden. Möchten Sie nur ein `str` haben? Oder nur ein `dict`? Oder direkt eine Instanz eines Modells einer Datenbank-Klasse? Es funktioniert alles auf die gleiche Weise. Sie haben eigentlich keine Benutzer, die sich bei Ihrer Anwendung anmelden, sondern Roboter, Bots oder andere Systeme, die nur über einen Zugriffstoken verfügen? Auch hier funktioniert alles gleich. Verwenden Sie einfach jede Art von Modell, jede Art von Klasse, jede Art von Datenbank, die Sie für Ihre Anwendung benötigen. **FastAPI** deckt das alles mit seinem Dependency Injection System ab. ## Codegröße Dieses Beispiel mag ausführlich erscheinen. Bedenken Sie, dass wir Sicherheit, Datenmodelle, Hilfsfunktionen und *Pfadoperationen* in derselben Datei vermischen. Aber hier ist der entscheidende Punkt. Der Code für Sicherheit und Dependency Injection wird einmal geschrieben. Sie können es so komplex gestalten, wie Sie möchten. Und dennoch haben Sie es nur einmal geschrieben, an einer einzigen Stelle. Mit all der Flexibilität. Aber Sie können Tausende von Endpunkten (*Pfadoperationen*) haben, die dasselbe Sicherheitssystem verwenden. Und alle (oder beliebige Teile davon) können Vorteil ziehen aus der Wiederverwendung dieser und anderer von Ihnen erstellter Abhängigkeiten. Und alle diese Tausenden von *Pfadoperationen* können nur drei Zeilen lang sein: === "Python 3.10+" ```Python hl_lines="30-32" {!> ../../../docs_src/security/tutorial002_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="30-32" {!> ../../../docs_src/security/tutorial002_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="31-33" {!> ../../../docs_src/security/tutorial002_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="28-30" {!> ../../../docs_src/security/tutorial002_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="30-32" {!> ../../../docs_src/security/tutorial002.py!} ``` ## Zusammenfassung Sie können jetzt den aktuellen Benutzer direkt in Ihrer *Pfadoperation-Funktion* abrufen. Wir haben bereits die Hälfte geschafft. Wir müssen jetzt nur noch eine *Pfadoperation* hinzufügen, mittels der der Benutzer/Client tatsächlich seinen `username` und `password` senden kann. Das kommt als nächstes. fastapi-0.110.3/docs/de/docs/tutorial/security/index.md000066400000000000000000000120531461403617600227270ustar00rootroot00000000000000# Sicherheit Es gibt viele Wege, Sicherheit, Authentifizierung und Autorisierung zu handhaben. Und normalerweise ist es ein komplexes und „schwieriges“ Thema. In vielen Frameworks und Systemen erfordert allein die Handhabung von Sicherheit und Authentifizierung viel Aufwand und Code (in vielen Fällen kann er 50 % oder mehr des gesamten geschriebenen Codes ausmachen). **FastAPI** bietet mehrere Tools, die Ihnen helfen, schnell und auf standardisierte Weise mit **Sicherheit** umzugehen, ohne alle Sicherheits-Spezifikationen studieren und erlernen zu müssen. Aber schauen wir uns zunächst ein paar kleine Konzepte an. ## In Eile? Wenn Ihnen diese Begriffe egal sind und Sie einfach *jetzt* Sicherheit mit Authentifizierung basierend auf Benutzername und Passwort hinzufügen müssen, fahren Sie mit den nächsten Kapiteln fort. ## OAuth2 OAuth2 ist eine Spezifikation, die verschiedene Möglichkeiten zur Handhabung von Authentifizierung und Autorisierung definiert. Es handelt sich um eine recht umfangreiche Spezifikation, und sie deckt mehrere komplexe Anwendungsfälle ab. Sie umfasst Möglichkeiten zur Authentifizierung mithilfe eines „Dritten“ („third party“). Das ist es, was alle diese „Login mit Facebook, Google, Twitter, GitHub“-Systeme unter der Haube verwenden. ### OAuth 1 Es gab ein OAuth 1, das sich stark von OAuth2 unterscheidet und komplexer ist, da es direkte Spezifikationen enthält, wie die Kommunikation verschlüsselt wird. Heutzutage ist es nicht sehr populär und wird kaum verwendet. OAuth2 spezifiziert nicht, wie die Kommunikation verschlüsselt werden soll, sondern erwartet, dass Ihre Anwendung mit HTTPS bereitgestellt wird. !!! tip "Tipp" Im Abschnitt über **Deployment** erfahren Sie, wie Sie HTTPS mithilfe von Traefik und Let's Encrypt kostenlos einrichten. ## OpenID Connect OpenID Connect ist eine weitere Spezifikation, die auf **OAuth2** basiert. Sie erweitert lediglich OAuth2, indem sie einige Dinge spezifiziert, die in OAuth2 relativ mehrdeutig sind, um zu versuchen, es interoperabler zu machen. Beispielsweise verwendet der Google Login OpenID Connect (welches seinerseits OAuth2 verwendet). Aber der Facebook Login unterstützt OpenID Connect nicht. Es hat seine eigene Variante von OAuth2. ### OpenID (nicht „OpenID Connect“) Es gab auch eine „OpenID“-Spezifikation. Sie versuchte das Gleiche zu lösen wie **OpenID Connect**, basierte aber nicht auf OAuth2. Es handelte sich also um ein komplett zusätzliches System. Heutzutage ist es nicht sehr populär und wird kaum verwendet. ## OpenAPI OpenAPI (früher bekannt als Swagger) ist die offene Spezifikation zum Erstellen von APIs (jetzt Teil der Linux Foundation). **FastAPI** basiert auf **OpenAPI**. Das ist es, was erlaubt, mehrere automatische interaktive Dokumentations-Oberflächen, Codegenerierung, usw. zu haben. OpenAPI bietet die Möglichkeit, mehrere Sicherheits„systeme“ zu definieren. Durch deren Verwendung können Sie alle diese Standards-basierten Tools nutzen, einschließlich dieser interaktiven Dokumentationssysteme. OpenAPI definiert die folgenden Sicherheitsschemas: * `apiKey`: ein anwendungsspezifischer Schlüssel, der stammen kann von: * Einem Query-Parameter. * Einem Header. * Einem Cookie. * `http`: Standard-HTTP-Authentifizierungssysteme, einschließlich: * `bearer`: ein Header `Authorization` mit dem Wert `Bearer` plus einem Token. Dies wird von OAuth2 geerbt. * HTTP Basic Authentication. * HTTP Digest, usw. * `oauth2`: Alle OAuth2-Methoden zum Umgang mit Sicherheit (genannt „Flows“). * Mehrere dieser Flows eignen sich zum Aufbau eines OAuth 2.0-Authentifizierungsanbieters (wie Google, Facebook, Twitter, GitHub usw.): * `implicit` * `clientCredentials` * `authorizationCode` * Es gibt jedoch einen bestimmten „Flow“, der perfekt für die direkte Abwicklung der Authentifizierung in derselben Anwendung verwendet werden kann: * `password`: Einige der nächsten Kapitel werden Beispiele dafür behandeln. * `openIdConnect`: bietet eine Möglichkeit, zu definieren, wie OAuth2-Authentifizierungsdaten automatisch ermittelt werden können. * Diese automatische Erkennung ist es, die in der OpenID Connect Spezifikation definiert ist. !!! tip "Tipp" Auch die Integration anderer Authentifizierungs-/Autorisierungsanbieter wie Google, Facebook, Twitter, GitHub, usw. ist möglich und relativ einfach. Das komplexeste Problem besteht darin, einen Authentifizierungs-/Autorisierungsanbieter wie solche aufzubauen, aber **FastAPI** reicht Ihnen die Tools, das einfach zu erledigen, während Ihnen die schwere Arbeit abgenommen wird. ## **FastAPI** Tools FastAPI stellt für jedes dieser Sicherheitsschemas im Modul `fastapi.security` verschiedene Tools bereit, die die Verwendung dieser Sicherheitsmechanismen vereinfachen. In den nächsten Kapiteln erfahren Sie, wie Sie mit diesen von **FastAPI** bereitgestellten Tools Sicherheit zu Ihrer API hinzufügen. Und Sie werden auch sehen, wie dies automatisch in das interaktive Dokumentationssystem integriert wird. fastapi-0.110.3/docs/de/docs/tutorial/security/oauth2-jwt.md000066400000000000000000000360731461403617600236340ustar00rootroot00000000000000# OAuth2 mit Password (und Hashing), Bearer mit JWT-Tokens Da wir nun über den gesamten Sicherheitsablauf verfügen, machen wir die Anwendung tatsächlich sicher, indem wir JWT-Tokens und sicheres Passwort-Hashing verwenden. Diesen Code können Sie tatsächlich in Ihrer Anwendung verwenden, die Passwort-Hashes in Ihrer Datenbank speichern, usw. Wir bauen auf dem vorherigen Kapitel auf. ## Über JWT JWT bedeutet „JSON Web Tokens“. Es ist ein Standard, um ein JSON-Objekt in einem langen, kompakten String ohne Leerzeichen zu kodieren. Das sieht so aus: ``` eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ``` Da er nicht verschlüsselt ist, kann jeder die Informationen aus dem Inhalt wiederherstellen. Aber er ist signiert. Wenn Sie also einen von Ihnen gesendeten Token zurückerhalten, können Sie überprüfen, ob Sie ihn tatsächlich gesendet haben. Auf diese Weise können Sie einen Token mit einer Gültigkeitsdauer von beispielsweise einer Woche erstellen. Und wenn der Benutzer am nächsten Tag mit dem Token zurückkommt, wissen Sie, dass der Benutzer immer noch bei Ihrem System angemeldet ist. Nach einer Woche läuft der Token ab und der Benutzer wird nicht autorisiert und muss sich erneut anmelden, um einen neuen Token zu erhalten. Und wenn der Benutzer (oder ein Dritter) versuchen würde, den Token zu ändern, um das Ablaufdatum zu ändern, würden Sie das entdecken, weil die Signaturen nicht übereinstimmen würden. Wenn Sie mit JWT-Tokens spielen und sehen möchten, wie sie funktionieren, schauen Sie sich https://jwt.io an. ## `python-jose` installieren. Wir müssen `python-jose` installieren, um die JWT-Tokens in Python zu generieren und zu verifizieren:
```console $ pip install "python-jose[cryptography]" ---> 100% ```
python-jose erfordert zusätzlich ein kryptografisches Backend. Hier verwenden wir das empfohlene: pyca/cryptography. !!! tip "Tipp" Dieses Tutorial verwendete zuvor PyJWT. Es wurde jedoch aktualisiert, stattdessen python-jose zu verwenden, da dieses alle Funktionen von PyJWT sowie einige Extras bietet, die Sie später möglicherweise benötigen, wenn Sie Integrationen mit anderen Tools erstellen. ## Passwort-Hashing „Hashing“ bedeutet: Konvertieren eines Inhalts (in diesem Fall eines Passworts) in eine Folge von Bytes (ein schlichter String), die wie Kauderwelsch aussieht. Immer wenn Sie genau den gleichen Inhalt (genau das gleiche Passwort) übergeben, erhalten Sie genau den gleichen Kauderwelsch. Sie können jedoch nicht vom Kauderwelsch zurück zum Passwort konvertieren. ### Warum Passwort-Hashing verwenden? Wenn Ihre Datenbank gestohlen wird, hat der Dieb nicht die Klartext-Passwörter Ihrer Benutzer, sondern nur die Hashes. Der Dieb kann also nicht versuchen, die gleichen Passwörter in einem anderen System zu verwenden (da viele Benutzer überall das gleiche Passwort verwenden, wäre dies gefährlich). ## `passlib` installieren PassLib ist ein großartiges Python-Package, um Passwort-Hashes zu handhaben. Es unterstützt viele sichere Hashing-Algorithmen und Werkzeuge, um mit diesen zu arbeiten. Der empfohlene Algorithmus ist „Bcrypt“. Installieren Sie also PassLib mit Bcrypt:
```console $ pip install "passlib[bcrypt]" ---> 100% ```
!!! tip "Tipp" Mit `passlib` können Sie sogar konfigurieren, Passwörter zu lesen, die von **Django**, einem **Flask**-Sicherheit-Plugin, oder vielen anderen erstellt wurden. So könnten Sie beispielsweise die gleichen Daten aus einer Django-Anwendung in einer Datenbank mit einer FastAPI-Anwendung teilen. Oder schrittweise eine Django-Anwendung migrieren, während Sie dieselbe Datenbank verwenden. Und Ihre Benutzer könnten sich gleichzeitig über Ihre Django-Anwendung oder Ihre **FastAPI**-Anwendung anmelden. ## Die Passwörter hashen und überprüfen Importieren Sie die benötigten Tools aus `passlib`. Erstellen Sie einen PassLib-„Kontext“. Der wird für das Hashen und Verifizieren von Passwörtern verwendet. !!! tip "Tipp" Der PassLib-Kontext kann auch andere Hashing-Algorithmen verwenden, einschließlich deprecateter Alter, um etwa nur eine Verifizierung usw. zu ermöglichen. Sie könnten ihn beispielsweise verwenden, um von einem anderen System (wie Django) generierte Passwörter zu lesen und zu verifizieren, aber alle neuen Passwörter mit einem anderen Algorithmus wie Bcrypt zu hashen. Und mit allen gleichzeitig kompatibel sein. Erstellen Sie eine Hilfsfunktion, um ein vom Benutzer stammendes Passwort zu hashen. Und eine weitere, um zu überprüfen, ob ein empfangenes Passwort mit dem gespeicherten Hash übereinstimmt. Und noch eine, um einen Benutzer zu authentifizieren und zurückzugeben. === "Python 3.10+" ```Python hl_lines="7 48 55-56 59-60 69-75" {!> ../../../docs_src/security/tutorial004_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="7 48 55-56 59-60 69-75" {!> ../../../docs_src/security/tutorial004_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="7 49 56-57 60-61 70-76" {!> ../../../docs_src/security/tutorial004_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="6 47 54-55 58-59 68-74" {!> ../../../docs_src/security/tutorial004_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="7 48 55-56 59-60 69-75" {!> ../../../docs_src/security/tutorial004.py!} ``` !!! note "Hinweis" Wenn Sie sich die neue (gefakte) Datenbank `fake_users_db` anschauen, sehen Sie, wie das gehashte Passwort jetzt aussieht: `"$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW"`. ## JWT-Token verarbeiten Importieren Sie die installierten Module. Erstellen Sie einen zufälligen geheimen Schlüssel, der zum Signieren der JWT-Tokens verwendet wird. Um einen sicheren zufälligen geheimen Schlüssel zu generieren, verwenden Sie den folgenden Befehl:
```console $ openssl rand -hex 32 09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7 ```
Und kopieren Sie die Ausgabe in die Variable `SECRET_KEY` (verwenden Sie nicht die im Beispiel). Erstellen Sie eine Variable `ALGORITHM` für den Algorithmus, der zum Signieren des JWT-Tokens verwendet wird, und setzen Sie sie auf `"HS256"`. Erstellen Sie eine Variable für das Ablaufdatum des Tokens. Definieren Sie ein Pydantic-Modell, das im Token-Endpunkt für die Response verwendet wird. Erstellen Sie eine Hilfsfunktion, um einen neuen Zugriffstoken zu generieren. === "Python 3.10+" ```Python hl_lines="6 12-14 28-30 78-86" {!> ../../../docs_src/security/tutorial004_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="6 12-14 28-30 78-86" {!> ../../../docs_src/security/tutorial004_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="6 13-15 29-31 79-87" {!> ../../../docs_src/security/tutorial004_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="5 11-13 27-29 77-85" {!> ../../../docs_src/security/tutorial004_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="6 12-14 28-30 78-86" {!> ../../../docs_src/security/tutorial004.py!} ``` ## Die Abhängigkeiten aktualisieren Aktualisieren Sie `get_current_user`, um den gleichen Token wie zuvor zu erhalten, dieses Mal jedoch unter Verwendung von JWT-Tokens. Dekodieren Sie den empfangenen Token, validieren Sie ihn und geben Sie den aktuellen Benutzer zurück. Wenn der Token ungültig ist, geben Sie sofort einen HTTP-Fehler zurück. === "Python 3.10+" ```Python hl_lines="89-106" {!> ../../../docs_src/security/tutorial004_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="89-106" {!> ../../../docs_src/security/tutorial004_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="90-107" {!> ../../../docs_src/security/tutorial004_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="88-105" {!> ../../../docs_src/security/tutorial004_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="89-106" {!> ../../../docs_src/security/tutorial004.py!} ``` ## Die *Pfadoperation* `/token` aktualisieren Erstellen Sie ein `timedelta` mit der Ablaufzeit des Tokens. Erstellen Sie einen echten JWT-Zugriffstoken und geben Sie ihn zurück. === "Python 3.10+" ```Python hl_lines="117-132" {!> ../../../docs_src/security/tutorial004_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="117-132" {!> ../../../docs_src/security/tutorial004_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="118-133" {!> ../../../docs_src/security/tutorial004_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="114-129" {!> ../../../docs_src/security/tutorial004_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="115-130" {!> ../../../docs_src/security/tutorial004.py!} ``` ### Technische Details zum JWT-„Subjekt“ `sub` Die JWT-Spezifikation besagt, dass es einen Schlüssel `sub` mit dem Subjekt des Tokens gibt. Die Verwendung ist optional, aber dort würden Sie die Identifikation des Benutzers speichern, daher verwenden wir das hier. JWT kann auch für andere Dinge verwendet werden, abgesehen davon, einen Benutzer zu identifizieren und ihm zu erlauben, Operationen direkt auf Ihrer API auszuführen. Sie könnten beispielsweise ein „Auto“ oder einen „Blog-Beitrag“ identifizieren. Anschließend könnten Sie Berechtigungen für diese Entität hinzufügen, etwa „Fahren“ (für das Auto) oder „Bearbeiten“ (für den Blog). Und dann könnten Sie diesen JWT-Token einem Benutzer (oder Bot) geben und dieser könnte ihn verwenden, um diese Aktionen auszuführen (das Auto fahren oder den Blog-Beitrag bearbeiten), ohne dass er überhaupt ein Konto haben müsste, einfach mit dem JWT-Token, den Ihre API dafür generiert hat. Mit diesen Ideen kann JWT für weitaus anspruchsvollere Szenarien verwendet werden. In diesen Fällen könnten mehrere dieser Entitäten die gleiche ID haben, sagen wir `foo` (ein Benutzer `foo`, ein Auto `foo` und ein Blog-Beitrag `foo`). Deshalb, um ID-Kollisionen zu vermeiden, könnten Sie beim Erstellen des JWT-Tokens für den Benutzer, dem Wert des `sub`-Schlüssels ein Präfix, z. B. `username:` voranstellen. In diesem Beispiel hätte der Wert von `sub` also auch `username:johndoe` sein können. Der wesentliche Punkt ist, dass der `sub`-Schlüssel in der gesamten Anwendung eine eindeutige Kennung haben sollte, und er sollte ein String sein. ## Es testen Führen Sie den Server aus und gehen Sie zur Dokumentation: http://127.0.0.1:8000/docs. Die Benutzeroberfläche sieht wie folgt aus: Melden Sie sich bei der Anwendung auf die gleiche Weise wie zuvor an. Verwenden Sie die Anmeldeinformationen: Benutzername: `johndoe` Passwort: `secret`. !!! check Beachten Sie, dass im Code nirgendwo das Klartext-Passwort "`secret`" steht, wir haben nur die gehashte Version. Rufen Sie den Endpunkt `/users/me/` auf, Sie erhalten die Response: ```JSON { "username": "johndoe", "email": "johndoe@example.com", "full_name": "John Doe", "disabled": false } ``` Wenn Sie die Developer Tools öffnen, können Sie sehen, dass die gesendeten Daten nur den Token enthalten. Das Passwort wird nur bei der ersten Anfrage gesendet, um den Benutzer zu authentisieren und diesen Zugriffstoken zu erhalten, aber nicht mehr danach: !!! note "Hinweis" Beachten Sie den Header `Authorization` mit einem Wert, der mit `Bearer` beginnt. ## Fortgeschrittene Verwendung mit `scopes` OAuth2 hat ein Konzept von „Scopes“. Sie können diese verwenden, um einem JWT-Token einen bestimmten Satz von Berechtigungen zu übergeben. Anschließend können Sie diesen Token einem Benutzer direkt oder einem Dritten geben, damit diese mit einer Reihe von Einschränkungen mit Ihrer API interagieren können. Wie Sie sie verwenden und wie sie in **FastAPI** integriert sind, erfahren Sie später im **Handbuch für fortgeschrittene Benutzer**. ## Zusammenfassung Mit dem, was Sie bis hier gesehen haben, können Sie eine sichere **FastAPI**-Anwendung mithilfe von Standards wie OAuth2 und JWT einrichten. In fast jedem Framework wird die Handhabung der Sicherheit recht schnell zu einem ziemlich komplexen Thema. Viele Packages, die es stark vereinfachen, müssen viele Kompromisse beim Datenmodell, der Datenbank und den verfügbaren Funktionen eingehen. Und einige dieser Pakete, die die Dinge zu sehr vereinfachen, weisen tatsächlich Sicherheitslücken auf. --- **FastAPI** geht bei keiner Datenbank, keinem Datenmodell oder Tool Kompromisse ein. Es gibt Ihnen die volle Flexibilität, diejenigen auszuwählen, die am besten zu Ihrem Projekt passen. Und Sie können viele gut gepflegte und weit verbreitete Packages wie `passlib` und `python-jose` direkt verwenden, da **FastAPI** keine komplexen Mechanismen zur Integration externer Pakete erfordert. Aber es bietet Ihnen die Werkzeuge, um den Prozess so weit wie möglich zu vereinfachen, ohne Kompromisse bei Flexibilität, Robustheit oder Sicherheit einzugehen. Und Sie können sichere Standardprotokolle wie OAuth2 auf relativ einfache Weise verwenden und implementieren. Im **Handbuch für fortgeschrittene Benutzer** erfahren Sie mehr darüber, wie Sie OAuth2-„Scopes“ für ein feingranuliertes Berechtigungssystem verwenden, das denselben Standards folgt. OAuth2 mit Scopes ist der Mechanismus, der von vielen großen Authentifizierungsanbietern wie Facebook, Google, GitHub, Microsoft, Twitter, usw. verwendet wird, um Drittanbieteranwendungen zu autorisieren, im Namen ihrer Benutzer mit ihren APIs zu interagieren. fastapi-0.110.3/docs/de/docs/tutorial/security/simple-oauth2.md000066400000000000000000000344171461403617600243210ustar00rootroot00000000000000# Einfaches OAuth2 mit Password und Bearer Lassen Sie uns nun auf dem vorherigen Kapitel aufbauen und die fehlenden Teile hinzufügen, um einen vollständigen Sicherheits-Flow zu erhalten. ## `username` und `password` entgegennehmen Wir werden **FastAPIs** Sicherheits-Werkzeuge verwenden, um den `username` und das `password` entgegenzunehmen. OAuth2 spezifiziert, dass der Client/Benutzer bei Verwendung des „Password Flow“ (den wir verwenden) die Felder `username` und `password` als Formulardaten senden muss. Und die Spezifikation sagt, dass die Felder so benannt werden müssen. `user-name` oder `email` würde also nicht funktionieren. Aber keine Sorge, Sie können sie Ihren Endbenutzern im Frontend so anzeigen, wie Sie möchten. Und Ihre Datenbankmodelle können beliebige andere Namen verwenden. Aber für die Login-*Pfadoperation* müssen wir diese Namen verwenden, um mit der Spezifikation kompatibel zu sein (und beispielsweise das integrierte API-Dokumentationssystem verwenden zu können). Die Spezifikation besagt auch, dass `username` und `password` als Formulardaten gesendet werden müssen (hier also kein JSON). ### `scope` Ferner sagt die Spezifikation, dass der Client ein weiteres Formularfeld "`scope`" („Geltungsbereich“) senden kann. Der Name des Formularfelds lautet `scope` (im Singular), tatsächlich handelt es sich jedoch um einen langen String mit durch Leerzeichen getrennten „Scopes“. Jeder „Scope“ ist nur ein String (ohne Leerzeichen). Diese werden normalerweise verwendet, um bestimmte Sicherheitsberechtigungen zu deklarieren, zum Beispiel: * `users:read` oder `users:write` sind gängige Beispiele. * `instagram_basic` wird von Facebook / Instagram verwendet. * `https://www.googleapis.com/auth/drive` wird von Google verwendet. !!! info In OAuth2 ist ein „Scope“ nur ein String, der eine bestimmte erforderliche Berechtigung deklariert. Es spielt keine Rolle, ob er andere Zeichen wie `:` enthält oder ob es eine URL ist. Diese Details sind implementierungsspezifisch. Für OAuth2 sind es einfach nur Strings. ## Code, um `username` und `password` entgegenzunehmen. Lassen Sie uns nun die von **FastAPI** bereitgestellten Werkzeuge verwenden, um das zu erledigen. ### `OAuth2PasswordRequestForm` Importieren Sie zunächst `OAuth2PasswordRequestForm` und verwenden Sie es als Abhängigkeit mit `Depends` in der *Pfadoperation* für `/token`: === "Python 3.10+" ```Python hl_lines="4 78" {!> ../../../docs_src/security/tutorial003_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="4 78" {!> ../../../docs_src/security/tutorial003_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="4 79" {!> ../../../docs_src/security/tutorial003_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="2 74" {!> ../../../docs_src/security/tutorial003_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="4 76" {!> ../../../docs_src/security/tutorial003.py!} ``` `OAuth2PasswordRequestForm` ist eine Klassenabhängigkeit, die einen Formularbody deklariert mit: * Dem `username`. * Dem `password`. * Einem optionalen `scope`-Feld als langem String, bestehend aus durch Leerzeichen getrennten Strings. * Einem optionalen `grant_type` („Art der Anmeldung“). !!! tip "Tipp" Die OAuth2-Spezifikation *erfordert* tatsächlich ein Feld `grant_type` mit dem festen Wert `password`, aber `OAuth2PasswordRequestForm` erzwingt dies nicht. Wenn Sie es erzwingen müssen, verwenden Sie `OAuth2PasswordRequestFormStrict` anstelle von `OAuth2PasswordRequestForm`. * Eine optionale `client_id` (benötigen wir für unser Beispiel nicht). * Ein optionales `client_secret` (benötigen wir für unser Beispiel nicht). !!! info `OAuth2PasswordRequestForm` ist keine spezielle Klasse für **FastAPI**, so wie `OAuth2PasswordBearer`. `OAuth2PasswordBearer` lässt **FastAPI** wissen, dass es sich um ein Sicherheitsschema handelt. Daher wird es auf diese Weise zu OpenAPI hinzugefügt. Aber `OAuth2PasswordRequestForm` ist nur eine Klassenabhängigkeit, die Sie selbst hätten schreiben können, oder Sie hätten `Form`ular-Parameter direkt deklarieren können. Da es sich jedoch um einen häufigen Anwendungsfall handelt, wird er zur Vereinfachung direkt von **FastAPI** bereitgestellt. ### Die Formulardaten verwenden !!! tip "Tipp" Die Instanz der Klassenabhängigkeit `OAuth2PasswordRequestForm` verfügt, statt eines Attributs `scope` mit dem durch Leerzeichen getrennten langen String, über das Attribut `scopes` mit einer tatsächlichen Liste von Strings, einem für jeden gesendeten Scope. In diesem Beispiel verwenden wir keine `scopes`, aber die Funktionalität ist vorhanden, wenn Sie sie benötigen. Rufen Sie nun die Benutzerdaten aus der (gefakten) Datenbank ab, für diesen `username` aus dem Formularfeld. Wenn es keinen solchen Benutzer gibt, geben wir die Fehlermeldung „Incorrect username or password“ zurück. Für den Fehler verwenden wir die Exception `HTTPException`: === "Python 3.10+" ```Python hl_lines="3 79-81" {!> ../../../docs_src/security/tutorial003_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="3 79-81" {!> ../../../docs_src/security/tutorial003_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="3 80-82" {!> ../../../docs_src/security/tutorial003_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="1 75-77" {!> ../../../docs_src/security/tutorial003_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="3 77-79" {!> ../../../docs_src/security/tutorial003.py!} ``` ### Das Passwort überprüfen Zu diesem Zeitpunkt liegen uns die Benutzerdaten aus unserer Datenbank vor, das Passwort haben wir jedoch noch nicht überprüft. Lassen Sie uns diese Daten zunächst in das Pydantic-Modell `UserInDB` einfügen. Sie sollten niemals Klartext-Passwörter speichern, daher verwenden wir ein (gefaktes) Passwort-Hashing-System. Wenn die Passwörter nicht übereinstimmen, geben wir denselben Fehler zurück. #### Passwort-Hashing „Hashing“ bedeutet: Konvertieren eines Inhalts (in diesem Fall eines Passworts) in eine Folge von Bytes (ein schlichter String), die wie Kauderwelsch aussieht. Immer wenn Sie genau den gleichen Inhalt (genau das gleiche Passwort) übergeben, erhalten Sie genau den gleichen Kauderwelsch. Sie können jedoch nicht vom Kauderwelsch zurück zum Passwort konvertieren. ##### Warum Passwort-Hashing verwenden? Wenn Ihre Datenbank gestohlen wird, hat der Dieb nicht die Klartext-Passwörter Ihrer Benutzer, sondern nur die Hashes. Der Dieb kann also nicht versuchen, die gleichen Passwörter in einem anderen System zu verwenden (da viele Benutzer überall das gleiche Passwort verwenden, wäre dies gefährlich). === "Python 3.10+" ```Python hl_lines="82-85" {!> ../../../docs_src/security/tutorial003_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="82-85" {!> ../../../docs_src/security/tutorial003_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="83-86" {!> ../../../docs_src/security/tutorial003_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="78-81" {!> ../../../docs_src/security/tutorial003_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="80-83" {!> ../../../docs_src/security/tutorial003.py!} ``` #### Über `**user_dict` `UserInDB(**user_dict)` bedeutet: *Übergib die Schlüssel und Werte des `user_dict` direkt als Schlüssel-Wert-Argumente, äquivalent zu:* ```Python UserInDB( username = user_dict["username"], email = user_dict["email"], full_name = user_dict["full_name"], disabled = user_dict["disabled"], hashed_password = user_dict["hashed_password"], ) ``` !!! info Eine ausführlichere Erklärung von `**user_dict` finden Sie in [der Dokumentation für **Extra Modelle**](../extra-models.md#uber-user_indict){.internal-link target=_blank}. ## Den Token zurückgeben Die Response des `token`-Endpunkts muss ein JSON-Objekt sein. Es sollte einen `token_type` haben. Da wir in unserem Fall „Bearer“-Token verwenden, sollte der Token-Typ "`bearer`" sein. Und es sollte einen `access_token` haben, mit einem String, der unseren Zugriffstoken enthält. In diesem einfachen Beispiel gehen wir einfach völlig unsicher vor und geben denselben `username` wie der Token zurück. !!! tip "Tipp" Im nächsten Kapitel sehen Sie eine wirklich sichere Implementierung mit Passwort-Hashing und JWT-Tokens. Aber konzentrieren wir uns zunächst auf die spezifischen Details, die wir benötigen. === "Python 3.10+" ```Python hl_lines="87" {!> ../../../docs_src/security/tutorial003_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="87" {!> ../../../docs_src/security/tutorial003_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="88" {!> ../../../docs_src/security/tutorial003_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="83" {!> ../../../docs_src/security/tutorial003_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="85" {!> ../../../docs_src/security/tutorial003.py!} ``` !!! tip "Tipp" Gemäß der Spezifikation sollten Sie ein JSON mit einem `access_token` und einem `token_type` zurückgeben, genau wie in diesem Beispiel. Das müssen Sie selbst in Ihrem Code tun und sicherstellen, dass Sie diese JSON-Schlüssel verwenden. Es ist fast das Einzige, woran Sie denken müssen, es selbst richtigzumachen und die Spezifikationen einzuhalten. Den Rest erledigt **FastAPI** für Sie. ## Die Abhängigkeiten aktualisieren Jetzt werden wir unsere Abhängigkeiten aktualisieren. Wir möchten den `current_user` *nur* erhalten, wenn dieser Benutzer aktiv ist. Daher erstellen wir eine zusätzliche Abhängigkeit `get_current_active_user`, die wiederum `get_current_user` als Abhängigkeit verwendet. Beide Abhängigkeiten geben nur dann einen HTTP-Error zurück, wenn der Benutzer nicht existiert oder inaktiv ist. In unserem Endpunkt erhalten wir also nur dann einen Benutzer, wenn der Benutzer existiert, korrekt authentifiziert wurde und aktiv ist: === "Python 3.10+" ```Python hl_lines="58-66 69-74 94" {!> ../../../docs_src/security/tutorial003_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="58-66 69-74 94" {!> ../../../docs_src/security/tutorial003_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="59-67 70-75 95" {!> ../../../docs_src/security/tutorial003_an.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="56-64 67-70 88" {!> ../../../docs_src/security/tutorial003_py310.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python hl_lines="58-66 69-72 90" {!> ../../../docs_src/security/tutorial003.py!} ``` !!! info Der zusätzliche Header `WWW-Authenticate` mit dem Wert `Bearer`, den wir hier zurückgeben, ist ebenfalls Teil der Spezifikation. Jeder HTTP-(Fehler-)Statuscode 401 „UNAUTHORIZED“ soll auch einen `WWW-Authenticate`-Header zurückgeben. Im Fall von Bearer-Tokens (in unserem Fall) sollte der Wert dieses Headers `Bearer` lauten. Sie können diesen zusätzlichen Header tatsächlich weglassen und es würde trotzdem funktionieren. Aber er wird hier bereitgestellt, um den Spezifikationen zu entsprechen. Außerdem gibt es möglicherweise Tools, die ihn erwarten und verwenden (jetzt oder in der Zukunft) und das könnte für Sie oder Ihre Benutzer jetzt oder in der Zukunft nützlich sein. Das ist der Vorteil von Standards ... ## Es in Aktion sehen Öffnen Sie die interaktive Dokumentation: http://127.0.0.1:8000/docs. ### Authentifizieren Klicken Sie auf den Button „Authorize“. Verwenden Sie die Anmeldedaten: Benutzer: `johndoe` Passwort: `secret`. Nach der Authentifizierung im System sehen Sie Folgendes: ### Die eigenen Benutzerdaten ansehen Verwenden Sie nun die Operation `GET` mit dem Pfad `/users/me`. Sie erhalten Ihre Benutzerdaten: ```JSON { "username": "johndoe", "email": "johndoe@example.com", "full_name": "John Doe", "disabled": false, "hashed_password": "fakehashedsecret" } ``` Wenn Sie auf das Schlosssymbol klicken und sich abmelden und dann den gleichen Vorgang nochmal versuchen, erhalten Sie einen HTTP 401 Error: ```JSON { "detail": "Not authenticated" } ``` ### Inaktiver Benutzer Versuchen Sie es nun mit einem inaktiven Benutzer und authentisieren Sie sich mit: Benutzer: `alice`. Passwort: `secret2`. Und versuchen Sie, die Operation `GET` mit dem Pfad `/users/me` zu verwenden. Sie erhalten die Fehlermeldung „Inactive user“: ```JSON { "detail": "Inactive user" } ``` ## Zusammenfassung Sie verfügen jetzt über die Tools, um ein vollständiges Sicherheitssystem basierend auf `username` und `password` für Ihre API zu implementieren. Mit diesen Tools können Sie das Sicherheitssystem mit jeder Datenbank und jedem Benutzer oder Datenmodell kompatibel machen. Das einzige fehlende Detail ist, dass es noch nicht wirklich „sicher“ ist. Im nächsten Kapitel erfahren Sie, wie Sie eine sichere Passwort-Hashing-Bibliothek und JWT-Token verwenden. fastapi-0.110.3/docs/de/docs/tutorial/static-files.md000066400000000000000000000037051461403617600223440ustar00rootroot00000000000000# Statische Dateien Mit `StaticFiles` können Sie statische Dateien aus einem Verzeichnis automatisch bereitstellen. ## `StaticFiles` verwenden * Importieren Sie `StaticFiles`. * „Mounten“ Sie eine `StaticFiles()`-Instanz in einem bestimmten Pfad. ```Python hl_lines="2 6" {!../../../docs_src/static_files/tutorial001.py!} ``` !!! note "Technische Details" Sie könnten auch `from starlette.staticfiles import StaticFiles` verwenden. **FastAPI** stellt dasselbe `starlette.staticfiles` auch via `fastapi.staticfiles` bereit, als Annehmlichkeit für Sie, den Entwickler. Es kommt aber tatsächlich direkt von Starlette. ### Was ist „Mounten“? „Mounten“ bedeutet das Hinzufügen einer vollständigen „unabhängigen“ Anwendung an einem bestimmten Pfad, die sich dann um die Handhabung aller Unterpfade kümmert. Dies unterscheidet sich von der Verwendung eines `APIRouter`, da eine gemountete Anwendung völlig unabhängig ist. Die OpenAPI und Dokumentation Ihrer Hauptanwendung enthalten nichts von der gemounteten Anwendung, usw. Weitere Informationen hierzu finden Sie im [Handbuch für fortgeschrittene Benutzer](../advanced/index.md){.internal-link target=_blank}. ## Einzelheiten Das erste `"/static"` bezieht sich auf den Unterpfad, auf dem diese „Unteranwendung“ „gemountet“ wird. Daher wird jeder Pfad, der mit `"/static"` beginnt, von ihr verarbeitet. Das `directory="static"` bezieht sich auf den Namen des Verzeichnisses, das Ihre statischen Dateien enthält. Das `name="static"` gibt dieser Unteranwendung einen Namen, der intern von **FastAPI** verwendet werden kann. Alle diese Parameter können anders als "`static`" lauten, passen Sie sie an die Bedürfnisse und spezifischen Details Ihrer eigenen Anwendung an. ## Weitere Informationen Weitere Details und Optionen finden Sie in der Dokumentation von Starlette zu statischen Dateien. fastapi-0.110.3/docs/de/docs/tutorial/testing.md000066400000000000000000000157451461403617600214410ustar00rootroot00000000000000# Testen Dank Starlette ist das Testen von **FastAPI**-Anwendungen einfach und macht Spaß. Es basiert auf HTTPX, welches wiederum auf der Grundlage von requests konzipiert wurde, es ist also sehr vertraut und intuitiv. Damit können Sie pytest direkt mit **FastAPI** verwenden. ## Verwendung von `TestClient` !!! info Um `TestClient` zu verwenden, installieren Sie zunächst `httpx`. Z. B. `pip install httpx`. Importieren Sie `TestClient`. Erstellen Sie einen `TestClient`, indem Sie ihm Ihre **FastAPI**-Anwendung übergeben. Erstellen Sie Funktionen mit einem Namen, der mit `test_` beginnt (das sind `pytest`-Konventionen). Verwenden Sie das `TestClient`-Objekt auf die gleiche Weise wie `httpx`. Schreiben Sie einfache `assert`-Anweisungen mit den Standard-Python-Ausdrücken, die Sie überprüfen müssen (wiederum, Standard-`pytest`). ```Python hl_lines="2 12 15-18" {!../../../docs_src/app_testing/tutorial001.py!} ``` !!! tip "Tipp" Beachten Sie, dass die Testfunktionen normal `def` und nicht `async def` sind. Und die Anrufe an den Client sind ebenfalls normale Anrufe, die nicht `await` verwenden. Dadurch können Sie `pytest` ohne Komplikationen direkt nutzen. !!! note "Technische Details" Sie könnten auch `from starlette.testclient import TestClient` verwenden. **FastAPI** stellt denselben `starlette.testclient` auch via `fastapi.testclient` bereit, als Annehmlichkeit für Sie, den Entwickler. Es kommt aber tatsächlich direkt von Starlette. !!! tip "Tipp" Wenn Sie in Ihren Tests neben dem Senden von Anfragen an Ihre FastAPI-Anwendung auch `async`-Funktionen aufrufen möchten (z. B. asynchrone Datenbankfunktionen), werfen Sie einen Blick auf die [Async-Tests](../advanced/async-tests.md){.internal-link target=_blank} im Handbuch für fortgeschrittene Benutzer. ## Tests separieren In einer echten Anwendung würden Sie Ihre Tests wahrscheinlich in einer anderen Datei haben. Und Ihre **FastAPI**-Anwendung könnte auch aus mehreren Dateien/Modulen, usw. bestehen. ### **FastAPI** Anwendungsdatei Nehmen wir an, Sie haben eine Dateistruktur wie in [Größere Anwendungen](bigger-applications.md){.internal-link target=_blank} beschrieben: ``` . ├── app │   ├── __init__.py │   └── main.py ``` In der Datei `main.py` haben Sie Ihre **FastAPI**-Anwendung: ```Python {!../../../docs_src/app_testing/main.py!} ``` ### Testdatei Dann könnten Sie eine Datei `test_main.py` mit Ihren Tests haben. Sie könnte sich im selben Python-Package befinden (dasselbe Verzeichnis mit einer `__init__.py`-Datei): ``` hl_lines="5" . ├── app │   ├── __init__.py │   ├── main.py │   └── test_main.py ``` Da sich diese Datei im selben Package befindet, können Sie relative Importe verwenden, um das Objekt `app` aus dem `main`-Modul (`main.py`) zu importieren: ```Python hl_lines="3" {!../../../docs_src/app_testing/test_main.py!} ``` ... und haben den Code für die Tests wie zuvor. ## Testen: erweitertes Beispiel Nun erweitern wir dieses Beispiel und fügen weitere Details hinzu, um zu sehen, wie verschiedene Teile getestet werden. ### Erweiterte **FastAPI**-Anwendungsdatei Fahren wir mit der gleichen Dateistruktur wie zuvor fort: ``` . ├── app │   ├── __init__.py │   ├── main.py │   └── test_main.py ``` Nehmen wir an, dass die Datei `main.py` mit Ihrer **FastAPI**-Anwendung jetzt einige andere **Pfadoperationen** hat. Sie verfügt über eine `GET`-Operation, die einen Fehler zurückgeben könnte. Sie verfügt über eine `POST`-Operation, die mehrere Fehler zurückgeben könnte. Beide *Pfadoperationen* erfordern einen `X-Token`-Header. === "Python 3.10+" ```Python {!> ../../../docs_src/app_testing/app_b_an_py310/main.py!} ``` === "Python 3.9+" ```Python {!> ../../../docs_src/app_testing/app_b_an_py39/main.py!} ``` === "Python 3.8+" ```Python {!> ../../../docs_src/app_testing/app_b_an/main.py!} ``` === "Python 3.10+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python {!> ../../../docs_src/app_testing/app_b_py310/main.py!} ``` === "Python 3.8+ nicht annotiert" !!! tip "Tipp" Bevorzugen Sie die `Annotated`-Version, falls möglich. ```Python {!> ../../../docs_src/app_testing/app_b/main.py!} ``` ### Erweiterte Testdatei Anschließend könnten Sie `test_main.py` mit den erweiterten Tests aktualisieren: ```Python {!> ../../../docs_src/app_testing/app_b/test_main.py!} ``` Wenn Sie möchten, dass der Client Informationen im Request übergibt und Sie nicht wissen, wie das geht, können Sie suchen (googeln), wie es mit `httpx` gemacht wird, oder sogar, wie es mit `requests` gemacht wird, da das Design von HTTPX auf dem Design von Requests basiert. Dann machen Sie in Ihren Tests einfach das gleiche. Z. B.: * Um einen *Pfad*- oder *Query*-Parameter zu übergeben, fügen Sie ihn der URL selbst hinzu. * Um einen JSON-Body zu übergeben, übergeben Sie ein Python-Objekt (z. B. ein `dict`) an den Parameter `json`. * Wenn Sie *Formulardaten* anstelle von JSON senden müssen, verwenden Sie stattdessen den `data`-Parameter. * Um *Header* zu übergeben, verwenden Sie ein `dict` im `headers`-Parameter. * Für *Cookies* ein `dict` im `cookies`-Parameter. Weitere Informationen zum Übergeben von Daten an das Backend (mithilfe von `httpx` oder dem `TestClient`) finden Sie in der HTTPX-Dokumentation. !!! info Beachten Sie, dass der `TestClient` Daten empfängt, die nach JSON konvertiert werden können, keine Pydantic-Modelle. Wenn Sie ein Pydantic-Modell in Ihrem Test haben und dessen Daten während des Testens an die Anwendung senden möchten, können Sie den `jsonable_encoder` verwenden, der in [JSON-kompatibler Encoder](encoder.md){.internal-link target=_blank} beschrieben wird. ## Tests ausführen Danach müssen Sie nur noch `pytest` installieren:
```console $ pip install pytest ---> 100% ```
Es erkennt die Dateien und Tests automatisch, führt sie aus und berichtet Ihnen die Ergebnisse. Führen Sie die Tests aus, mit:
```console $ pytest ================ test session starts ================ platform linux -- Python 3.6.9, pytest-5.3.5, py-1.8.1, pluggy-0.13.1 rootdir: /home/user/code/superawesome-cli/app plugins: forked-1.1.3, xdist-1.31.0, cov-2.8.1 collected 6 items ---> 100% test_main.py ...... [100%] ================= 1 passed in 0.03s ================= ```
fastapi-0.110.3/docs/de/mkdocs.yml000066400000000000000000000000321461403617600166310ustar00rootroot00000000000000INHERIT: ../en/mkdocs.yml fastapi-0.110.3/docs/em/000077500000000000000000000000001461403617600146445ustar00rootroot00000000000000fastapi-0.110.3/docs/em/docs/000077500000000000000000000000001461403617600155745ustar00rootroot00000000000000fastapi-0.110.3/docs/em/docs/advanced/000077500000000000000000000000001461403617600173415ustar00rootroot00000000000000fastapi-0.110.3/docs/em/docs/advanced/additional-responses.md000066400000000000000000000175671461403617600240320ustar00rootroot00000000000000# 🌖 📨 🗄 !!! warning 👉 👍 🏧 ❔. 🚥 👆 ▶️ ⏮️ **FastAPI**, 👆 💪 🚫 💪 👉. 👆 💪 📣 🌖 📨, ⏮️ 🌖 👔 📟, 🔉 🆎, 📛, ♒️. 👈 🌖 📨 🔜 🔌 🗄 🔗, 👫 🔜 😑 🛠️ 🩺. ✋️ 👈 🌖 📨 👆 ✔️ ⚒ 💭 👆 📨 `Response` 💖 `JSONResponse` 🔗, ⏮️ 👆 👔 📟 & 🎚. ## 🌖 📨 ⏮️ `model` 👆 💪 🚶‍♀️ 👆 *➡ 🛠️ 👨‍🎨* 🔢 `responses`. ⚫️ 📨 `dict`, 🔑 👔 📟 🔠 📨, 💖 `200`, & 💲 🎏 `dict`Ⓜ ⏮️ ℹ 🔠 👫. 🔠 👈 📨 `dict`Ⓜ 💪 ✔️ 🔑 `model`, ⚗ Pydantic 🏷, 💖 `response_model`. **FastAPI** 🔜 ✊ 👈 🏷, 🏗 🚮 🎻 🔗 & 🔌 ⚫️ ☑ 🥉 🗄. 🖼, 📣 ➕1️⃣ 📨 ⏮️ 👔 📟 `404` & Pydantic 🏷 `Message`, 👆 💪 ✍: ```Python hl_lines="18 22" {!../../../docs_src/additional_responses/tutorial001.py!} ``` !!! note ✔️ 🤯 👈 👆 ✔️ 📨 `JSONResponse` 🔗. !!! info `model` 🔑 🚫 🍕 🗄. **FastAPI** 🔜 ✊ Pydantic 🏷 ⚪️➡️ 📤, 🏗 `JSON Schema`, & 🚮 ⚫️ ☑ 🥉. ☑ 🥉: * 🔑 `content`, 👈 ✔️ 💲 ➕1️⃣ 🎻 🎚 (`dict`) 👈 🔌: * 🔑 ⏮️ 📻 🆎, ✅ `application/json`, 👈 🔌 💲 ➕1️⃣ 🎻 🎚, 👈 🔌: * 🔑 `schema`, 👈 ✔️ 💲 🎻 🔗 ⚪️➡️ 🏷, 📥 ☑ 🥉. * **FastAPI** 🚮 🔗 📥 🌐 🎻 🔗 ➕1️⃣ 🥉 👆 🗄 ↩️ ✅ ⚫️ 🔗. 👉 🌌, 🎏 🈸 & 👩‍💻 💪 ⚙️ 👈 🎻 🔗 🔗, 🚚 👻 📟 ⚡ 🧰, ♒️. 🏗 📨 🗄 👉 *➡ 🛠️* 🔜: ```JSON hl_lines="3-12" { "responses": { "404": { "description": "Additional Response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Message" } } } }, "200": { "description": "Successful Response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Item" } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } ``` 🔗 🔗 ➕1️⃣ 🥉 🔘 🗄 🔗: ```JSON hl_lines="4-16" { "components": { "schemas": { "Message": { "title": "Message", "required": [ "message" ], "type": "object", "properties": { "message": { "title": "Message", "type": "string" } } }, "Item": { "title": "Item", "required": [ "id", "value" ], "type": "object", "properties": { "id": { "title": "Id", "type": "string" }, "value": { "title": "Value", "type": "string" } } }, "ValidationError": { "title": "ValidationError", "required": [ "loc", "msg", "type" ], "type": "object", "properties": { "loc": { "title": "Location", "type": "array", "items": { "type": "string" } }, "msg": { "title": "Message", "type": "string" }, "type": { "title": "Error Type", "type": "string" } } }, "HTTPValidationError": { "title": "HTTPValidationError", "type": "object", "properties": { "detail": { "title": "Detail", "type": "array", "items": { "$ref": "#/components/schemas/ValidationError" } } } } } } } ``` ## 🌖 🔉 🆎 👑 📨 👆 💪 ⚙️ 👉 🎏 `responses` 🔢 🚮 🎏 🔉 🆎 🎏 👑 📨. 🖼, 👆 💪 🚮 🌖 📻 🆎 `image/png`, 📣 👈 👆 *➡ 🛠️* 💪 📨 🎻 🎚 (⏮️ 📻 🆎 `application/json`) ⚖️ 🇩🇴 🖼: ```Python hl_lines="19-24 28" {!../../../docs_src/additional_responses/tutorial002.py!} ``` !!! note 👀 👈 👆 ✔️ 📨 🖼 ⚙️ `FileResponse` 🔗. !!! info 🚥 👆 ✔ 🎏 📻 🆎 🎯 👆 `responses` 🔢, FastAPI 🔜 🤔 📨 ✔️ 🎏 📻 🆎 👑 📨 🎓 (🔢 `application/json`). ✋️ 🚥 👆 ✔️ ✔ 🛃 📨 🎓 ⏮️ `None` 🚮 📻 🆎, FastAPI 🔜 ⚙️ `application/json` 🙆 🌖 📨 👈 ✔️ 👨‍💼 🏷. ## 🌀 ℹ 👆 💪 🌀 📨 ℹ ⚪️➡️ 💗 🥉, 🔌 `response_model`, `status_code`, & `responses` 🔢. 👆 💪 📣 `response_model`, ⚙️ 🔢 👔 📟 `200` (⚖️ 🛃 1️⃣ 🚥 👆 💪), & ⤴️ 📣 🌖 ℹ 👈 🎏 📨 `responses`, 🔗 🗄 🔗. **FastAPI** 🔜 🚧 🌖 ℹ ⚪️➡️ `responses`, & 🌀 ⚫️ ⏮️ 🎻 🔗 ⚪️➡️ 👆 🏷. 🖼, 👆 💪 📣 📨 ⏮️ 👔 📟 `404` 👈 ⚙️ Pydantic 🏷 & ✔️ 🛃 `description`. & 📨 ⏮️ 👔 📟 `200` 👈 ⚙️ 👆 `response_model`, ✋️ 🔌 🛃 `example`: ```Python hl_lines="20-31" {!../../../docs_src/additional_responses/tutorial003.py!} ``` ⚫️ 🔜 🌐 🌀 & 🔌 👆 🗄, & 🎦 🛠️ 🩺: ## 🌀 🔢 📨 & 🛃 🕐 👆 💪 💚 ✔️ 🔁 📨 👈 ✔ 📚 *➡ 🛠️*, ✋️ 👆 💚 🌀 👫 ⏮️ 🛃 📨 💚 🔠 *➡ 🛠️*. 📚 💼, 👆 💪 ⚙️ 🐍 ⚒ "🏗" `dict` ⏮️ `**dict_to_unpack`: ```Python old_dict = { "old key": "old value", "second old key": "second old value", } new_dict = {**old_dict, "new key": "new value"} ``` 📥, `new_dict` 🔜 🔌 🌐 🔑-💲 👫 ⚪️➡️ `old_dict` ➕ 🆕 🔑-💲 👫: ```Python { "old key": "old value", "second old key": "second old value", "new key": "new value", } ``` 👆 💪 ⚙️ 👈 ⚒ 🏤-⚙️ 🔢 📨 👆 *➡ 🛠️* & 🌀 👫 ⏮️ 🌖 🛃 🕐. 🖼: ```Python hl_lines="13-17 26" {!../../../docs_src/additional_responses/tutorial004.py!} ``` ## 🌖 ℹ 🔃 🗄 📨 👀 ⚫️❔ ⚫️❔ 👆 💪 🔌 📨, 👆 💪 ✅ 👉 📄 🗄 🔧: * 🗄 📨 🎚, ⚫️ 🔌 `Response Object`. * 🗄 📨 🎚, 👆 💪 🔌 🕳 ⚪️➡️ 👉 🔗 🔠 📨 🔘 👆 `responses` 🔢. ✅ `description`, `headers`, `content` (🔘 👉 👈 👆 📣 🎏 🔉 🆎 & 🎻 🔗), & `links`. fastapi-0.110.3/docs/em/docs/advanced/additional-status-codes.md000066400000000000000000000032741461403617600244150ustar00rootroot00000000000000# 🌖 👔 📟 🔢, **FastAPI** 🔜 📨 📨 ⚙️ `JSONResponse`, 🚮 🎚 👆 📨 ⚪️➡️ 👆 *➡ 🛠️* 🔘 👈 `JSONResponse`. ⚫️ 🔜 ⚙️ 🔢 👔 📟 ⚖️ 1️⃣ 👆 ⚒ 👆 *➡ 🛠️*. ## 🌖 👔 📟 🚥 👆 💚 📨 🌖 👔 📟 ↖️ ⚪️➡️ 👑 1️⃣, 👆 💪 👈 🛬 `Response` 🔗, 💖 `JSONResponse`, & ⚒ 🌖 👔 📟 🔗. 🖼, ➡️ 💬 👈 👆 💚 ✔️ *➡ 🛠️* 👈 ✔ ℹ 🏬, & 📨 🇺🇸🔍 👔 📟 2️⃣0️⃣0️⃣ "👌" 🕐❔ 🏆. ✋️ 👆 💚 ⚫️ 🚫 🆕 🏬. & 🕐❔ 🏬 🚫 🔀 ⏭, ⚫️ ✍ 👫, & 📨 🇺🇸🔍 👔 📟 2️⃣0️⃣1️⃣ "✍". 🏆 👈, 🗄 `JSONResponse`, & 📨 👆 🎚 📤 🔗, ⚒ `status_code` 👈 👆 💚: ```Python hl_lines="4 25" {!../../../docs_src/additional_status_codes/tutorial001.py!} ``` !!! warning 🕐❔ 👆 📨 `Response` 🔗, 💖 🖼 🔛, ⚫️ 🔜 📨 🔗. ⚫️ 🏆 🚫 🎻 ⏮️ 🏷, ♒️. ⚒ 💭 ⚫️ ✔️ 📊 👆 💚 ⚫️ ✔️, & 👈 💲 ☑ 🎻 (🚥 👆 ⚙️ `JSONResponse`). !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.responses import JSONResponse`. **FastAPI** 🚚 🎏 `starlette.responses` `fastapi.responses` 🏪 👆, 👩‍💻. ✋️ 🌅 💪 📨 👟 🔗 ⚪️➡️ 💃. 🎏 ⏮️ `status`. ## 🗄 & 🛠️ 🩺 🚥 👆 📨 🌖 👔 📟 & 📨 🔗, 👫 🏆 🚫 🔌 🗄 🔗 (🛠️ 🩺), ↩️ FastAPI 🚫 ✔️ 🌌 💭 ⏪ ⚫️❔ 👆 🚶 📨. ✋️ 👆 💪 📄 👈 👆 📟, ⚙️: [🌖 📨](additional-responses.md){.internal-link target=_blank}. fastapi-0.110.3/docs/em/docs/advanced/advanced-dependencies.md000066400000000000000000000037771461403617600240720ustar00rootroot00000000000000# 🏧 🔗 ## 🔗 🔗 🌐 🔗 👥 ✔️ 👀 🔧 🔢 ⚖️ 🎓. ✋️ 📤 💪 💼 🌐❔ 👆 💚 💪 ⚒ 🔢 🔛 🔗, 🍵 ✔️ 📣 📚 🎏 🔢 ⚖️ 🎓. ➡️ 🌈 👈 👥 💚 ✔️ 🔗 👈 ✅ 🚥 🔢 🔢 `q` 🔌 🔧 🎚. ✋️ 👥 💚 💪 🔗 👈 🔧 🎚. ## "🇧🇲" 👐 🐍 📤 🌌 ⚒ 👐 🎓 "🇧🇲". 🚫 🎓 ⚫️ (❔ ⏪ 🇧🇲), ✋️ 👐 👈 🎓. 👈, 👥 📣 👩‍🔬 `__call__`: ```Python hl_lines="10" {!../../../docs_src/dependencies/tutorial011.py!} ``` 👉 💼, 👉 `__call__` ⚫️❔ **FastAPI** 🔜 ⚙️ ✅ 🌖 🔢 & 🎧-🔗, & 👉 ⚫️❔ 🔜 🤙 🚶‍♀️ 💲 🔢 👆 *➡ 🛠️ 🔢* ⏪. ## 🔗 👐 & 🔜, 👥 💪 ⚙️ `__init__` 📣 🔢 👐 👈 👥 💪 ⚙️ "🔗" 🔗: ```Python hl_lines="7" {!../../../docs_src/dependencies/tutorial011.py!} ``` 👉 💼, **FastAPI** 🏆 🚫 ⏱ 👆 ⚖️ 💅 🔃 `__init__`, 👥 🔜 ⚙️ ⚫️ 🔗 👆 📟. ## ✍ 👐 👥 💪 ✍ 👐 👉 🎓 ⏮️: ```Python hl_lines="16" {!../../../docs_src/dependencies/tutorial011.py!} ``` & 👈 🌌 👥 💪 "🔗" 👆 🔗, 👈 🔜 ✔️ `"bar"` 🔘 ⚫️, 🔢 `checker.fixed_content`. ## ⚙️ 👐 🔗 ⤴️, 👥 💪 ⚙️ 👉 `checker` `Depends(checker)`, ↩️ `Depends(FixedContentQueryChecker)`, ↩️ 🔗 👐, `checker`, 🚫 🎓 ⚫️. & 🕐❔ ❎ 🔗, **FastAPI** 🔜 🤙 👉 `checker` 💖: ```Python checker(q="somequery") ``` ...& 🚶‍♀️ ⚫️❔ 👈 📨 💲 🔗 👆 *➡ 🛠️ 🔢* 🔢 `fixed_content_included`: ```Python hl_lines="20" {!../../../docs_src/dependencies/tutorial011.py!} ``` !!! tip 🌐 👉 💪 😑 🎭. & ⚫️ 💪 🚫 📶 🆑 ❔ ⚫️ ⚠. 👫 🖼 😫 🙅, ✋️ 🎦 ❔ ⚫️ 🌐 👷. 📃 🔃 💂‍♂, 📤 🚙 🔢 👈 🛠️ 👉 🎏 🌌. 🚥 👆 🤔 🌐 👉, 👆 ⏪ 💭 ❔ 👈 🚙 🧰 💂‍♂ 👷 🔘. fastapi-0.110.3/docs/em/docs/advanced/async-tests.md000066400000000000000000000057251461403617600221510ustar00rootroot00000000000000# 🔁 💯 👆 ✔️ ⏪ 👀 ❔ 💯 👆 **FastAPI** 🈸 ⚙️ 🚚 `TestClient`. 🆙 🔜, 👆 ✔️ 🕴 👀 ❔ ✍ 🔁 💯, 🍵 ⚙️ `async` 🔢. ➖ 💪 ⚙️ 🔁 🔢 👆 💯 💪 ⚠, 🖼, 🕐❔ 👆 🔬 👆 💽 🔁. 🌈 👆 💚 💯 📨 📨 👆 FastAPI 🈸 & ⤴️ ✔ 👈 👆 👩‍💻 ⏪ ✍ ☑ 💽 💽, ⏪ ⚙️ 🔁 💽 🗃. ➡️ 👀 ❔ 👥 💪 ⚒ 👈 👷. ## pytest.mark.anyio 🚥 👥 💚 🤙 🔁 🔢 👆 💯, 👆 💯 🔢 ✔️ 🔁. AnyIO 🚚 👌 📁 👉, 👈 ✔ 👥 ✔ 👈 💯 🔢 🤙 🔁. ## 🇸🇲 🚥 👆 **FastAPI** 🈸 ⚙️ 😐 `def` 🔢 ↩️ `async def`, ⚫️ `async` 🈸 🔘. `TestClient` 🔨 🎱 🔘 🤙 🔁 FastAPI 🈸 👆 😐 `def` 💯 🔢, ⚙️ 🐩 ✳. ✋️ 👈 🎱 🚫 👷 🚫🔜 🕐❔ 👥 ⚙️ ⚫️ 🔘 🔁 🔢. 🏃 👆 💯 🔁, 👥 💪 🙅‍♂ 📏 ⚙️ `TestClient` 🔘 👆 💯 🔢. `TestClient` ⚓️ 🔛 🇸🇲, & ↩️, 👥 💪 ⚙️ ⚫️ 🔗 💯 🛠️. ## 🖼 🙅 🖼, ➡️ 🤔 📁 📊 🎏 1️⃣ 🔬 [🦏 🈸](../tutorial/bigger-applications.md){.internal-link target=_blank} & [🔬](../tutorial/testing.md){.internal-link target=_blank}: ``` . ├── app │   ├── __init__.py │   ├── main.py │   └── test_main.py ``` 📁 `main.py` 🔜 ✔️: ```Python {!../../../docs_src/async_tests/main.py!} ``` 📁 `test_main.py` 🔜 ✔️ 💯 `main.py`, ⚫️ 💪 👀 💖 👉 🔜: ```Python {!../../../docs_src/async_tests/test_main.py!} ``` ## 🏃 ⚫️ 👆 💪 🏃 👆 💯 🐌 📨:
```console $ pytest ---> 100% ```
## ℹ 📑 `@pytest.mark.anyio` 💬 ✳ 👈 👉 💯 🔢 🔜 🤙 🔁: ```Python hl_lines="7" {!../../../docs_src/async_tests/test_main.py!} ``` !!! tip 🗒 👈 💯 🔢 🔜 `async def` ↩️ `def` ⏭ 🕐❔ ⚙️ `TestClient`. ⤴️ 👥 💪 ✍ `AsyncClient` ⏮️ 📱, & 📨 🔁 📨 ⚫️, ⚙️ `await`. ```Python hl_lines="9-10" {!../../../docs_src/async_tests/test_main.py!} ``` 👉 🌓: ```Python response = client.get('/') ``` ...👈 👥 ⚙️ ⚒ 👆 📨 ⏮️ `TestClient`. !!! tip 🗒 👈 👥 ⚙️ 🔁/⌛ ⏮️ 🆕 `AsyncClient` - 📨 🔁. ## 🎏 🔁 🔢 🤙 🔬 🔢 🔜 🔁, 👆 💪 🔜 🤙 (& `await`) 🎏 `async` 🔢 ↖️ ⚪️➡️ 📨 📨 👆 FastAPI 🈸 👆 💯, ⚫️❔ 👆 🔜 🤙 👫 🙆 🙆 👆 📟. !!! tip 🚥 👆 ⚔ `RuntimeError: Task attached to a different loop` 🕐❔ 🛠️ 🔁 🔢 🤙 👆 💯 (✅ 🕐❔ ⚙️ ✳ MotorClient) 💭 🔗 🎚 👈 💪 🎉 ➰ 🕴 🏞 🔁 🔢, ✅ `'@app.on_event("startup")` ⏲. fastapi-0.110.3/docs/em/docs/advanced/behind-a-proxy.md000066400000000000000000000241001461403617600225060ustar00rootroot00000000000000# ⛅ 🗳 ⚠, 👆 5️⃣📆 💪 ⚙️ **🗳** 💽 💖 Traefik ⚖️ 👌 ⏮️ 📳 👈 🚮 ➕ ➡ 🔡 👈 🚫 👀 👆 🈸. 👫 💼 👆 💪 ⚙️ `root_path` 🔗 👆 🈸. `root_path` 🛠️ 🚚 🔫 🔧 (👈 FastAPI 🏗 🔛, 🔘 💃). `root_path` ⚙️ 🍵 👫 🎯 💼. & ⚫️ ⚙️ 🔘 🕐❔ 🗜 🎧-🈸. ## 🗳 ⏮️ 🎞 ➡ 🔡 ✔️ 🗳 ⏮️ 🎞 ➡ 🔡, 👉 💼, ⛓ 👈 👆 💪 📣 ➡ `/app` 👆 📟, ✋️ ⤴️, 👆 🚮 🧽 🔛 🔝 (🗳) 👈 🔜 🚮 👆 **FastAPI** 🈸 🔽 ➡ 💖 `/api/v1`. 👉 💼, ⏮️ ➡ `/app` 🔜 🤙 🍦 `/api/v1/app`. ✋️ 🌐 👆 📟 ✍ 🤔 📤 `/app`. & 🗳 🔜 **"❎"** **➡ 🔡** 🔛 ✈ ⏭ 📶 📨 Uvicorn, 🚧 👆 🈸 🤔 👈 ⚫️ 🍦 `/app`, 👈 👆 🚫 ✔️ ℹ 🌐 👆 📟 🔌 🔡 `/api/v1`. 🆙 📥, 🌐 🔜 👷 🛎. ✋️ ⤴️, 🕐❔ 👆 📂 🛠️ 🩺 🎚 (🕸), ⚫️ 🔜 ⌛ 🤚 🗄 🔗 `/openapi.json`, ↩️ `/api/v1/openapi.json`. , 🕸 (👈 🏃 🖥) 🔜 🔄 🏆 `/openapi.json` & 🚫🔜 💪 🤚 🗄 🔗. ↩️ 👥 ✔️ 🗳 ⏮️ ➡ 🔡 `/api/v1` 👆 📱, 🕸 💪 ☕ 🗄 🔗 `/api/v1/openapi.json`. ```mermaid graph LR browser("Browser") proxy["Proxy on http://0.0.0.0:9999/api/v1/app"] server["Server on http://127.0.0.1:8000/app"] browser --> proxy proxy --> server ``` !!! tip 📢 `0.0.0.0` 🛎 ⚙️ ⛓ 👈 📋 👂 🔛 🌐 📢 💪 👈 🎰/💽. 🩺 🎚 🔜 💪 🗄 🔗 📣 👈 👉 🛠️ `server` 🔎 `/api/v1` (⛅ 🗳). 🖼: ```JSON hl_lines="4-8" { "openapi": "3.0.2", // More stuff here "servers": [ { "url": "/api/v1" } ], "paths": { // More stuff here } } ``` 👉 🖼, "🗳" 💪 🕳 💖 **Traefik**. & 💽 🔜 🕳 💖 **Uvicorn**, 🏃‍♂ 👆 FastAPI 🈸. ### 🚚 `root_path` 🏆 👉, 👆 💪 ⚙️ 📋 ⏸ 🎛 `--root-path` 💖:
```console $ uvicorn main:app --root-path /api/v1 INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
🚥 👆 ⚙️ Hypercorn, ⚫️ ✔️ 🎛 `--root-path`. !!! note "📡 ℹ" 🔫 🔧 🔬 `root_path` 👉 ⚙️ 💼. & `--root-path` 📋 ⏸ 🎛 🚚 👈 `root_path`. ### ✅ ⏮️ `root_path` 👆 💪 🤚 ⏮️ `root_path` ⚙️ 👆 🈸 🔠 📨, ⚫️ 🍕 `scope` 📖 (👈 🍕 🔫 🔌). 📥 👥 ✅ ⚫️ 📧 🎦 🎯. ```Python hl_lines="8" {!../../../docs_src/behind_a_proxy/tutorial001.py!} ``` ⤴️, 🚥 👆 ▶️ Uvicorn ⏮️:
```console $ uvicorn main:app --root-path /api/v1 INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
📨 🔜 🕳 💖: ```JSON { "message": "Hello World", "root_path": "/api/v1" } ``` ### ⚒ `root_path` FastAPI 📱 👐, 🚥 👆 🚫 ✔️ 🌌 🚚 📋 ⏸ 🎛 💖 `--root-path` ⚖️ 🌓, 👆 💪 ⚒ `root_path` 🔢 🕐❔ 🏗 👆 FastAPI 📱: ```Python hl_lines="3" {!../../../docs_src/behind_a_proxy/tutorial002.py!} ``` 🚶‍♀️ `root_path` `FastAPI` 🔜 🌓 🚶‍♀️ `--root-path` 📋 ⏸ 🎛 Uvicorn ⚖️ Hypercorn. ### 🔃 `root_path` ✔️ 🤯 👈 💽 (Uvicorn) 🏆 🚫 ⚙️ 👈 `root_path` 🕳 🙆 🌘 🚶‍♀️ ⚫️ 📱. ✋️ 🚥 👆 🚶 ⏮️ 👆 🖥 http://127.0.0.1:8000/app 👆 🔜 👀 😐 📨: ```JSON { "message": "Hello World", "root_path": "/api/v1" } ``` , ⚫️ 🏆 🚫 ⌛ 🔐 `http://127.0.0.1:8000/api/v1/app`. Uvicorn 🔜 ⌛ 🗳 🔐 Uvicorn `http://127.0.0.1:8000/app`, & ⤴️ ⚫️ 🔜 🗳 🎯 🚮 ➕ `/api/v1` 🔡 🔛 🔝. ## 🔃 🗳 ⏮️ 🎞 ➡ 🔡 ✔️ 🤯 👈 🗳 ⏮️ 🎞 ➡ 🔡 🕴 1️⃣ 🌌 🔗 ⚫️. 🎲 📚 💼 🔢 🔜 👈 🗳 🚫 ✔️ 🏚 ➡ 🔡. 💼 💖 👈 (🍵 🎞 ➡ 🔡), 🗳 🔜 👂 🔛 🕳 💖 `https://myawesomeapp.com`, & ⤴️ 🚥 🖥 🚶 `https://myawesomeapp.com/api/v1/app` & 👆 💽 (✅ Uvicorn) 👂 🔛 `http://127.0.0.1:8000` 🗳 (🍵 🎞 ➡ 🔡) 🔜 🔐 Uvicorn 🎏 ➡: `http://127.0.0.1:8000/api/v1/app`. ## 🔬 🌐 ⏮️ Traefik 👆 💪 💪 🏃 🥼 🌐 ⏮️ 🎞 ➡ 🔡 ⚙️ Traefik. ⏬ Traefik, ⚫️ 👁 💱, 👆 💪 ⚗ 🗜 📁 & 🏃 ⚫️ 🔗 ⚪️➡️ 📶. ⤴️ ✍ 📁 `traefik.toml` ⏮️: ```TOML hl_lines="3" [entryPoints] [entryPoints.http] address = ":9999" [providers] [providers.file] filename = "routes.toml" ``` 👉 💬 Traefik 👂 🔛 ⛴ 9️⃣9️⃣9️⃣9️⃣ & ⚙️ ➕1️⃣ 📁 `routes.toml`. !!! tip 👥 ⚙️ ⛴ 9️⃣9️⃣9️⃣9️⃣ ↩️ 🐩 🇺🇸🔍 ⛴ 8️⃣0️⃣ 👈 👆 🚫 ✔️ 🏃 ⚫️ ⏮️ 📡 (`sudo`) 😌. 🔜 ✍ 👈 🎏 📁 `routes.toml`: ```TOML hl_lines="5 12 20" [http] [http.middlewares] [http.middlewares.api-stripprefix.stripPrefix] prefixes = ["/api/v1"] [http.routers] [http.routers.app-http] entryPoints = ["http"] service = "app" rule = "PathPrefix(`/api/v1`)" middlewares = ["api-stripprefix"] [http.services] [http.services.app] [http.services.app.loadBalancer] [[http.services.app.loadBalancer.servers]] url = "http://127.0.0.1:8000" ``` 👉 📁 🔗 Traefik ⚙️ ➡ 🔡 `/api/v1`. & ⤴️ ⚫️ 🔜 ❎ 🚮 📨 👆 Uvicorn 🏃‍♂ 🔛 `http://127.0.0.1:8000`. 🔜 ▶️ Traefik:
```console $ ./traefik --configFile=traefik.toml INFO[0000] Configuration loaded from file: /home/user/awesomeapi/traefik.toml ```
& 🔜 ▶️ 👆 📱 ⏮️ Uvicorn, ⚙️ `--root-path` 🎛:
```console $ uvicorn main:app --root-path /api/v1 INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
### ✅ 📨 🔜, 🚥 👆 🚶 📛 ⏮️ ⛴ Uvicorn: http://127.0.0.1:8000/app, 👆 🔜 👀 😐 📨: ```JSON { "message": "Hello World", "root_path": "/api/v1" } ``` !!! tip 👀 👈 ✋️ 👆 🔐 ⚫️ `http://127.0.0.1:8000/app` ⚫️ 🎦 `root_path` `/api/v1`, ✊ ⚪️➡️ 🎛 `--root-path`. & 🔜 📂 📛 ⏮️ ⛴ Traefik, ✅ ➡ 🔡: http://127.0.0.1:9999/api/v1/app. 👥 🤚 🎏 📨: ```JSON { "message": "Hello World", "root_path": "/api/v1" } ``` ✋️ 👉 🕰 📛 ⏮️ 🔡 ➡ 🚚 🗳: `/api/v1`. ↗️, 💭 📥 👈 👱 🔜 🔐 📱 🔘 🗳, ⏬ ⏮️ ➡ 🔡 `/app/v1` "☑" 1️⃣. & ⏬ 🍵 ➡ 🔡 (`http://127.0.0.1:8000/app`), 🚚 Uvicorn 🔗, 🔜 🎯 _🗳_ (Traefik) 🔐 ⚫️. 👈 🎦 ❔ 🗳 (Traefik) ⚙️ ➡ 🔡 & ❔ 💽 (Uvicorn) ⚙️ `root_path` ⚪️➡️ 🎛 `--root-path`. ### ✅ 🩺 🎚 ✋️ 📥 🎊 🍕. 👶 "🛂" 🌌 🔐 📱 🔜 🔘 🗳 ⏮️ ➡ 🔡 👈 👥 🔬. , 👥 🔜 ⌛, 🚥 👆 🔄 🩺 🎚 🍦 Uvicorn 🔗, 🍵 ➡ 🔡 📛, ⚫️ 🏆 🚫 👷, ↩️ ⚫️ ⌛ 🔐 🔘 🗳. 👆 💪 ✅ ⚫️ http://127.0.0.1:8000/docs: ✋️ 🚥 👥 🔐 🩺 🎚 "🛂" 📛 ⚙️ 🗳 ⏮️ ⛴ `9999`, `/api/v1/docs`, ⚫️ 👷 ☑ ❗ 👶 👆 💪 ✅ ⚫️ http://127.0.0.1:9999/api/v1/docs: ▶️️ 👥 💚 ⚫️. 👶 👶 👉 ↩️ FastAPI ⚙️ 👉 `root_path` ✍ 🔢 `server` 🗄 ⏮️ 📛 🚚 `root_path`. ## 🌖 💽 !!! warning 👉 🌅 🏧 ⚙️ 💼. 💭 🆓 🚶 ⚫️. 🔢, **FastAPI** 🔜 ✍ `server` 🗄 🔗 ⏮️ 📛 `root_path`. ✋️ 👆 💪 🚚 🎏 🎛 `servers`, 🖼 🚥 👆 💚 *🎏* 🩺 🎚 🔗 ⏮️ 🏗 & 🏭 🌐. 🚥 👆 🚶‍♀️ 🛃 📇 `servers` & 📤 `root_path` (↩️ 👆 🛠️ 👨‍❤‍👨 ⛅ 🗳), **FastAPI** 🔜 📩 "💽" ⏮️ 👉 `root_path` ▶️ 📇. 🖼: ```Python hl_lines="4-7" {!../../../docs_src/behind_a_proxy/tutorial003.py!} ``` 🔜 🏗 🗄 🔗 💖: ```JSON hl_lines="5-7" { "openapi": "3.0.2", // More stuff here "servers": [ { "url": "/api/v1" }, { "url": "https://stag.example.com", "description": "Staging environment" }, { "url": "https://prod.example.com", "description": "Production environment" } ], "paths": { // More stuff here } } ``` !!! tip 👀 🚘-🏗 💽 ⏮️ `url` 💲 `/api/v1`, ✊ ⚪️➡️ `root_path`. 🩺 🎚 http://127.0.0.1:9999/api/v1/docs ⚫️ 🔜 👀 💖: !!! tip 🩺 🎚 🔜 🔗 ⏮️ 💽 👈 👆 🖊. ### ❎ 🏧 💽 ⚪️➡️ `root_path` 🚥 👆 🚫 💚 **FastAPI** 🔌 🏧 💽 ⚙️ `root_path`, 👆 💪 ⚙️ 🔢 `root_path_in_servers=False`: ```Python hl_lines="9" {!../../../docs_src/behind_a_proxy/tutorial004.py!} ``` & ⤴️ ⚫️ 🏆 🚫 🔌 ⚫️ 🗄 🔗. ## 🗜 🎧-🈸 🚥 👆 💪 🗻 🎧-🈸 (🔬 [🎧 🈸 - 🗻](sub-applications.md){.internal-link target=_blank}) ⏪ ⚙️ 🗳 ⏮️ `root_path`, 👆 💪 ⚫️ 🛎, 👆 🔜 ⌛. FastAPI 🔜 🔘 ⚙️ `root_path` 🎆, ⚫️ 🔜 👷. 👶 fastapi-0.110.3/docs/em/docs/advanced/custom-response.md000066400000000000000000000234041461403617600230340ustar00rootroot00000000000000# 🛃 📨 - 🕸, 🎏, 📁, 🎏 🔢, **FastAPI** 🔜 📨 📨 ⚙️ `JSONResponse`. 👆 💪 🔐 ⚫️ 🛬 `Response` 🔗 👀 [📨 📨 🔗](response-directly.md){.internal-link target=_blank}. ✋️ 🚥 👆 📨 `Response` 🔗, 📊 🏆 🚫 🔁 🗜, & 🧾 🏆 🚫 🔁 🏗 (🖼, 🔌 🎯 "📻 🆎", 🇺🇸🔍 🎚 `Content-Type` 🍕 🏗 🗄). ✋️ 👆 💪 📣 `Response` 👈 👆 💚 ⚙️, *➡ 🛠️ 👨‍🎨*. 🎚 👈 👆 📨 ⚪️➡️ 👆 *➡ 🛠️ 🔢* 🔜 🚮 🔘 👈 `Response`. & 🚥 👈 `Response` ✔️ 🎻 📻 🆎 (`application/json`), 💖 💼 ⏮️ `JSONResponse` & `UJSONResponse`, 💽 👆 📨 🔜 🔁 🗜 (& ⛽) ⏮️ 🙆 Pydantic `response_model` 👈 👆 📣 *➡ 🛠️ 👨‍🎨*. !!! note 🚥 👆 ⚙️ 📨 🎓 ⏮️ 🙅‍♂ 📻 🆎, FastAPI 🔜 ⌛ 👆 📨 ✔️ 🙅‍♂ 🎚, ⚫️ 🔜 🚫 📄 📨 📁 🚮 🏗 🗄 🩺. ## ⚙️ `ORJSONResponse` 🖼, 🚥 👆 ✊ 🎭, 👆 💪 ❎ & ⚙️ `orjson` & ⚒ 📨 `ORJSONResponse`. 🗄 `Response` 🎓 (🎧-🎓) 👆 💚 ⚙️ & 📣 ⚫️ *➡ 🛠️ 👨‍🎨*. ⭕ 📨, 📨 `Response` 🔗 🌅 ⏩ 🌘 🛬 📖. 👉 ↩️ 🔢, FastAPI 🔜 ✔ 🔠 🏬 🔘 & ⚒ 💭 ⚫️ 🎻 ⏮️ 🎻, ⚙️ 🎏 [🎻 🔗 🔢](../tutorial/encoder.md){.internal-link target=_blank} 🔬 🔰. 👉 ⚫️❔ ✔ 👆 📨 **❌ 🎚**, 🖼 💽 🏷. ✋️ 🚥 👆 🎯 👈 🎚 👈 👆 🛬 **🎻 ⏮️ 🎻**, 👆 💪 🚶‍♀️ ⚫️ 🔗 📨 🎓 & ❎ ➕ 🌥 👈 FastAPI 🔜 ✔️ 🚶‍♀️ 👆 📨 🎚 🔘 `jsonable_encoder` ⏭ 🚶‍♀️ ⚫️ 📨 🎓. ```Python hl_lines="2 7" {!../../../docs_src/custom_response/tutorial001b.py!} ``` !!! info 🔢 `response_class` 🔜 ⚙️ 🔬 "📻 🆎" 📨. 👉 💼, 🇺🇸🔍 🎚 `Content-Type` 🔜 ⚒ `application/json`. & ⚫️ 🔜 📄 ✅ 🗄. !!! tip `ORJSONResponse` ⏳ 🕴 💪 FastAPI, 🚫 💃. ## 🕸 📨 📨 📨 ⏮️ 🕸 🔗 ⚪️➡️ **FastAPI**, ⚙️ `HTMLResponse`. * 🗄 `HTMLResponse`. * 🚶‍♀️ `HTMLResponse` 🔢 `response_class` 👆 *➡ 🛠️ 👨‍🎨*. ```Python hl_lines="2 7" {!../../../docs_src/custom_response/tutorial002.py!} ``` !!! info 🔢 `response_class` 🔜 ⚙️ 🔬 "📻 🆎" 📨. 👉 💼, 🇺🇸🔍 🎚 `Content-Type` 🔜 ⚒ `text/html`. & ⚫️ 🔜 📄 ✅ 🗄. ### 📨 `Response` 👀 [📨 📨 🔗](response-directly.md){.internal-link target=_blank}, 👆 💪 🔐 📨 🔗 👆 *➡ 🛠️*, 🛬 ⚫️. 🎏 🖼 ⚪️➡️ 🔛, 🛬 `HTMLResponse`, 💪 👀 💖: ```Python hl_lines="2 7 19" {!../../../docs_src/custom_response/tutorial003.py!} ``` !!! warning `Response` 📨 🔗 👆 *➡ 🛠️ 🔢* 🏆 🚫 📄 🗄 (🖼, `Content-Type` 🏆 🚫 📄) & 🏆 🚫 ⭐ 🏧 🎓 🩺. !!! info ↗️, ☑ `Content-Type` 🎚, 👔 📟, ♒️, 🔜 👟 ⚪️➡️ `Response` 🎚 👆 📨. ### 📄 🗄 & 🔐 `Response` 🚥 👆 💚 🔐 📨 ⚪️➡️ 🔘 🔢 ✋️ 🎏 🕰 📄 "📻 🆎" 🗄, 👆 💪 ⚙️ `response_class` 🔢 & 📨 `Response` 🎚. `response_class` 🔜 ⤴️ ⚙️ 🕴 📄 🗄 *➡ 🛠️*, ✋️ 👆 `Response` 🔜 ⚙️. #### 📨 `HTMLResponse` 🔗 🖼, ⚫️ 💪 🕳 💖: ```Python hl_lines="7 21 23" {!../../../docs_src/custom_response/tutorial004.py!} ``` 👉 🖼, 🔢 `generate_html_response()` ⏪ 🏗 & 📨 `Response` ↩️ 🛬 🕸 `str`. 🛬 🏁 🤙 `generate_html_response()`, 👆 ⏪ 🛬 `Response` 👈 🔜 🔐 🔢 **FastAPI** 🎭. ✋️ 👆 🚶‍♀️ `HTMLResponse` `response_class` 💁‍♂️, **FastAPI** 🔜 💭 ❔ 📄 ⚫️ 🗄 & 🎓 🩺 🕸 ⏮️ `text/html`: ## 💪 📨 📥 💪 📨. ✔️ 🤯 👈 👆 💪 ⚙️ `Response` 📨 🕳 🙆, ⚖️ ✍ 🛃 🎧-🎓. !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.responses import HTMLResponse`. **FastAPI** 🚚 🎏 `starlette.responses` `fastapi.responses` 🏪 👆, 👩‍💻. ✋️ 🌅 💪 📨 👟 🔗 ⚪️➡️ 💃. ### `Response` 👑 `Response` 🎓, 🌐 🎏 📨 😖 ⚪️➡️ ⚫️. 👆 💪 📨 ⚫️ 🔗. ⚫️ 🚫 📄 🔢: * `content` - `str` ⚖️ `bytes`. * `status_code` - `int` 🇺🇸🔍 👔 📟. * `headers` - `dict` 🎻. * `media_type` - `str` 🤝 📻 🆎. 🤶 Ⓜ. `"text/html"`. FastAPI (🤙 💃) 🔜 🔁 🔌 🎚-📐 🎚. ⚫️ 🔜 🔌 🎚-🆎 🎚, ⚓️ 🔛 = & 🔁 = ✍ 🆎. ```Python hl_lines="1 18" {!../../../docs_src/response_directly/tutorial002.py!} ``` ### `HTMLResponse` ✊ ✍ ⚖️ 🔢 & 📨 🕸 📨, 👆 ✍ 🔛. ### `PlainTextResponse` ✊ ✍ ⚖️ 🔢 & 📨 ✅ ✍ 📨. ```Python hl_lines="2 7 9" {!../../../docs_src/custom_response/tutorial005.py!} ``` ### `JSONResponse` ✊ 💽 & 📨 `application/json` 🗜 📨. 👉 🔢 📨 ⚙️ **FastAPI**, 👆 ✍ 🔛. ### `ORJSONResponse` ⏩ 🎛 🎻 📨 ⚙️ `orjson`, 👆 ✍ 🔛. ### `UJSONResponse` 🎛 🎻 📨 ⚙️ `ujson`. !!! warning `ujson` 🌘 💛 🌘 🐍 🏗-🛠️ ❔ ⚫️ 🍵 📐-💼. ```Python hl_lines="2 7" {!../../../docs_src/custom_response/tutorial001.py!} ``` !!! tip ⚫️ 💪 👈 `ORJSONResponse` 💪 ⏩ 🎛. ### `RedirectResponse` 📨 🇺🇸🔍 ❎. ⚙️ 3️⃣0️⃣7️⃣ 👔 📟 (🍕 ❎) 🔢. 👆 💪 📨 `RedirectResponse` 🔗: ```Python hl_lines="2 9" {!../../../docs_src/custom_response/tutorial006.py!} ``` --- ⚖️ 👆 💪 ⚙️ ⚫️ `response_class` 🔢: ```Python hl_lines="2 7 9" {!../../../docs_src/custom_response/tutorial006b.py!} ``` 🚥 👆 👈, ⤴️ 👆 💪 📨 📛 🔗 ⚪️➡️ 👆 *➡ 🛠️* 🔢. 👉 💼, `status_code` ⚙️ 🔜 🔢 1️⃣ `RedirectResponse`, ❔ `307`. --- 👆 💪 ⚙️ `status_code` 🔢 🌀 ⏮️ `response_class` 🔢: ```Python hl_lines="2 7 9" {!../../../docs_src/custom_response/tutorial006c.py!} ``` ### `StreamingResponse` ✊ 🔁 🚂 ⚖️ 😐 🚂/🎻 & 🎏 📨 💪. ```Python hl_lines="2 14" {!../../../docs_src/custom_response/tutorial007.py!} ``` #### ⚙️ `StreamingResponse` ⏮️ 📁-💖 🎚 🚥 👆 ✔️ 📁-💖 🎚 (✅ 🎚 📨 `open()`), 👆 💪 ✍ 🚂 🔢 🔁 🤭 👈 📁-💖 🎚. 👈 🌌, 👆 🚫 ✔️ ✍ ⚫️ 🌐 🥇 💾, & 👆 💪 🚶‍♀️ 👈 🚂 🔢 `StreamingResponse`, & 📨 ⚫️. 👉 🔌 📚 🗃 🔗 ⏮️ ☁ 💾, 📹 🏭, & 🎏. ```{ .python .annotate hl_lines="2 10-12 14" } {!../../../docs_src/custom_response/tutorial008.py!} ``` 1️⃣. 👉 🚂 🔢. ⚫️ "🚂 🔢" ↩️ ⚫️ 🔌 `yield` 📄 🔘. 2️⃣. ⚙️ `with` 🍫, 👥 ⚒ 💭 👈 📁-💖 🎚 📪 ⏮️ 🚂 🔢 🔨. , ⏮️ ⚫️ 🏁 📨 📨. 3️⃣. 👉 `yield from` 💬 🔢 🔁 🤭 👈 👜 🌟 `file_like`. & ⤴️, 🔠 🍕 🔁, 🌾 👈 🍕 👟 ⚪️➡️ 👉 🚂 🔢. , ⚫️ 🚂 🔢 👈 📨 "🏭" 👷 🕳 🙆 🔘. 🔨 ⚫️ 👉 🌌, 👥 💪 🚮 ⚫️ `with` 🍫, & 👈 🌌, 🚚 👈 ⚫️ 📪 ⏮️ 🏁. !!! tip 👀 👈 📥 👥 ⚙️ 🐩 `open()` 👈 🚫 🐕‍🦺 `async` & `await`, 👥 📣 ➡ 🛠️ ⏮️ 😐 `def`. ### `FileResponse` 🔁 🎏 📁 📨. ✊ 🎏 ⚒ ❌ 🔗 🌘 🎏 📨 🆎: * `path` - 📁 📁 🎏. * `headers` - 🙆 🛃 🎚 🔌, 📖. * `media_type` - 🎻 🤝 📻 🆎. 🚥 🔢, 📁 ⚖️ ➡ 🔜 ⚙️ 🔑 📻 🆎. * `filename` - 🚥 ⚒, 👉 🔜 🔌 📨 `Content-Disposition`. 📁 📨 🔜 🔌 ☑ `Content-Length`, `Last-Modified` & `ETag` 🎚. ```Python hl_lines="2 10" {!../../../docs_src/custom_response/tutorial009.py!} ``` 👆 💪 ⚙️ `response_class` 🔢: ```Python hl_lines="2 8 10" {!../../../docs_src/custom_response/tutorial009b.py!} ``` 👉 💼, 👆 💪 📨 📁 ➡ 🔗 ⚪️➡️ 👆 *➡ 🛠️* 🔢. ## 🛃 📨 🎓 👆 💪 ✍ 👆 👍 🛃 📨 🎓, 😖 ⚪️➡️ `Response` & ⚙️ ⚫️. 🖼, ➡️ 💬 👈 👆 💚 ⚙️ `orjson`, ✋️ ⏮️ 🛃 ⚒ 🚫 ⚙️ 🔌 `ORJSONResponse` 🎓. ➡️ 💬 👆 💚 ⚫️ 📨 🔂 & 📁 🎻, 👆 💚 ⚙️ Orjson 🎛 `orjson.OPT_INDENT_2`. 👆 💪 ✍ `CustomORJSONResponse`. 👑 👜 👆 ✔️ ✍ `Response.render(content)` 👩‍🔬 👈 📨 🎚 `bytes`: ```Python hl_lines="9-14 17" {!../../../docs_src/custom_response/tutorial009c.py!} ``` 🔜 ↩️ 🛬: ```json {"message": "Hello World"} ``` ...👉 📨 🔜 📨: ```json { "message": "Hello World" } ``` ↗️, 👆 🔜 🎲 🔎 🌅 👍 🌌 ✊ 📈 👉 🌘 ❕ 🎻. 👶 ## 🔢 📨 🎓 🕐❔ 🏗 **FastAPI** 🎓 👐 ⚖️ `APIRouter` 👆 💪 ✔ ❔ 📨 🎓 ⚙️ 🔢. 🔢 👈 🔬 👉 `default_response_class`. 🖼 🔛, **FastAPI** 🔜 ⚙️ `ORJSONResponse` 🔢, 🌐 *➡ 🛠️*, ↩️ `JSONResponse`. ```Python hl_lines="2 4" {!../../../docs_src/custom_response/tutorial010.py!} ``` !!! tip 👆 💪 🔐 `response_class` *➡ 🛠️* ⏭. ## 🌖 🧾 👆 💪 📣 📻 🆎 & 📚 🎏 ℹ 🗄 ⚙️ `responses`: [🌖 📨 🗄](additional-responses.md){.internal-link target=_blank}. fastapi-0.110.3/docs/em/docs/advanced/dataclasses.md000066400000000000000000000067331461403617600221630ustar00rootroot00000000000000# ⚙️ 🎻 FastAPI 🏗 🔛 🔝 **Pydantic**, & 👤 ✔️ 🌏 👆 ❔ ⚙️ Pydantic 🏷 📣 📨 & 📨. ✋️ FastAPI 🐕‍🦺 ⚙️ `dataclasses` 🎏 🌌: ```Python hl_lines="1 7-12 19-20" {!../../../docs_src/dataclasses/tutorial001.py!} ``` 👉 🐕‍🦺 👏 **Pydantic**, ⚫️ ✔️ 🔗 🐕‍🦺 `dataclasses`. , ⏮️ 📟 🔛 👈 🚫 ⚙️ Pydantic 🎯, FastAPI ⚙️ Pydantic 🗜 📚 🐩 🎻 Pydantic 👍 🍛 🎻. & ↗️, ⚫️ 🐕‍🦺 🎏: * 💽 🔬 * 💽 🛠️ * 💽 🧾, ♒️. 👉 👷 🎏 🌌 ⏮️ Pydantic 🏷. & ⚫️ 🤙 🏆 🎏 🌌 🔘, ⚙️ Pydantic. !!! info ✔️ 🤯 👈 🎻 💪 🚫 🌐 Pydantic 🏷 💪. , 👆 5️⃣📆 💪 ⚙️ Pydantic 🏷. ✋️ 🚥 👆 ✔️ 📚 🎻 🤥 🤭, 👉 👌 🎱 ⚙️ 👫 🏋️ 🕸 🛠️ ⚙️ FastAPI. 👶 ## 🎻 `response_model` 👆 💪 ⚙️ `dataclasses` `response_model` 🔢: ```Python hl_lines="1 7-13 19" {!../../../docs_src/dataclasses/tutorial002.py!} ``` 🎻 🔜 🔁 🗜 Pydantic 🎻. 👉 🌌, 🚮 🔗 🔜 🎦 🆙 🛠️ 🩺 👩‍💻 🔢: ## 🎻 🔁 📊 📊 👆 💪 🌀 `dataclasses` ⏮️ 🎏 🆎 ✍ ⚒ 🐦 📊 📊. 💼, 👆 💪 ✔️ ⚙️ Pydantic ⏬ `dataclasses`. 🖼, 🚥 👆 ✔️ ❌ ⏮️ 🔁 🏗 🛠️ 🧾. 👈 💼, 👆 💪 🎯 💱 🐩 `dataclasses` ⏮️ `pydantic.dataclasses`, ❔ 💧-♻: ```{ .python .annotate hl_lines="1 5 8-11 14-17 23-25 28" } {!../../../docs_src/dataclasses/tutorial003.py!} ``` 1️⃣. 👥 🗄 `field` ⚪️➡️ 🐩 `dataclasses`. 2️⃣. `pydantic.dataclasses` 💧-♻ `dataclasses`. 3️⃣. `Author` 🎻 🔌 📇 `Item` 🎻. 4️⃣. `Author` 🎻 ⚙️ `response_model` 🔢. 5️⃣. 👆 💪 ⚙️ 🎏 🐩 🆎 ✍ ⏮️ 🎻 📨 💪. 👉 💼, ⚫️ 📇 `Item` 🎻. 6️⃣. 📥 👥 🛬 📖 👈 🔌 `items` ❔ 📇 🎻. FastAPI 🎯 💽 🎻. 7️⃣. 📥 `response_model` ⚙️ 🆎 ✍ 📇 `Author` 🎻. 🔄, 👆 💪 🌀 `dataclasses` ⏮️ 🐩 🆎 ✍. 8️⃣. 👀 👈 👉 *➡ 🛠️ 🔢* ⚙️ 🥔 `def` ↩️ `async def`. 🕧, FastAPI 👆 💪 🌀 `def` & `async def` 💪. 🚥 👆 💪 ↗️ 🔃 🕐❔ ⚙️ ❔, ✅ 👅 📄 _"🏃 ❓" _ 🩺 🔃 `async` & `await`. 9️⃣. 👉 *➡ 🛠️ 🔢* 🚫 🛬 🎻 (👐 ⚫️ 💪), ✋️ 📇 📖 ⏮️ 🔗 💽. FastAPI 🔜 ⚙️ `response_model` 🔢 (👈 🔌 🎻) 🗜 📨. 👆 💪 🌀 `dataclasses` ⏮️ 🎏 🆎 ✍ 📚 🎏 🌀 📨 🏗 📊 📊. ✅-📟 ✍ 💁‍♂ 🔛 👀 🌅 🎯 ℹ. ## 💡 🌅 👆 💪 🌀 `dataclasses` ⏮️ 🎏 Pydantic 🏷, 😖 ⚪️➡️ 👫, 🔌 👫 👆 👍 🏷, ♒️. 💡 🌅, ✅ Pydantic 🩺 🔃 🎻. ## ⏬ 👉 💪 ↩️ FastAPI ⏬ `0.67.0`. 👶 fastapi-0.110.3/docs/em/docs/advanced/events.md000066400000000000000000000142611461403617600211730ustar00rootroot00000000000000# 🔆 🎉 👆 💪 🔬 ⚛ (📟) 👈 🔜 🛠️ ⏭ 🈸 **▶️ 🆙**. 👉 ⛓ 👈 👉 📟 🔜 🛠️ **🕐**, **⏭** 🈸 **▶️ 📨 📨**. 🎏 🌌, 👆 💪 🔬 ⚛ (📟) 👈 🔜 🛠️ 🕐❔ 🈸 **🤫 🔽**. 👉 💼, 👉 📟 🔜 🛠️ **🕐**, **⏮️** ✔️ 🍵 🎲 **📚 📨**. ↩️ 👉 📟 🛠️ ⏭ 🈸 **▶️** ✊ 📨, & ▶️️ ⏮️ ⚫️ **🏁** 🚚 📨, ⚫️ 📔 🎂 🈸 **🔆** (🔤 "🔆" 🔜 ⚠ 🥈 👶). 👉 💪 📶 ⚠ ⚒ 🆙 **ℹ** 👈 👆 💪 ⚙️ 🎂 📱, & 👈 **💰** 👪 📨, &/⚖️ 👈 👆 💪 **🧹 🆙** ⏮️. 🖼, 💽 🔗 🎱, ⚖️ 🚚 🔗 🎰 🏫 🏷. ## ⚙️ 💼 ➡️ ▶️ ⏮️ 🖼 **⚙️ 💼** & ⤴️ 👀 ❔ ❎ ⚫️ ⏮️ 👉. ➡️ 🌈 👈 👆 ✔️ **🎰 🏫 🏷** 👈 👆 💚 ⚙️ 🍵 📨. 👶 🎏 🏷 🔗 👪 📨,, ⚫️ 🚫 1️⃣ 🏷 📍 📨, ⚖️ 1️⃣ 📍 👩‍💻 ⚖️ 🕳 🎏. ➡️ 🌈 👈 🚚 🏷 💪 **✊ 🕰**, ↩️ ⚫️ ✔️ ✍ 📚 **💽 ⚪️➡️ 💾**. 👆 🚫 💚 ⚫️ 🔠 📨. 👆 💪 📐 ⚫️ 🔝 🎚 🕹/📁, ✋️ 👈 🔜 ⛓ 👈 ⚫️ 🔜 **📐 🏷** 🚥 👆 🏃‍♂ 🙅 🏧 💯, ⤴️ 👈 💯 🔜 **🐌** ↩️ ⚫️ 🔜 ✔️ ⌛ 🏷 📐 ⏭ 💆‍♂ 💪 🏃 🔬 🍕 📟. 👈 ⚫️❔ 👥 🔜 ❎, ➡️ 📐 🏷 ⏭ 📨 🍵, ✋️ 🕴 ▶️️ ⏭ 🈸 ▶️ 📨 📨, 🚫 ⏪ 📟 ➖ 📐. ## 🔆 👆 💪 🔬 👉 *🕴* & *🤫* ⚛ ⚙️ `lifespan` 🔢 `FastAPI` 📱, & "🔑 👨‍💼" (👤 🔜 🎦 👆 ⚫️❔ 👈 🥈). ➡️ ▶️ ⏮️ 🖼 & ⤴️ 👀 ⚫️ ℹ. 👥 ✍ 🔁 🔢 `lifespan()` ⏮️ `yield` 💖 👉: ```Python hl_lines="16 19" {!../../../docs_src/events/tutorial003.py!} ``` 📥 👥 ⚖ 😥 *🕴* 🛠️ 🚚 🏷 🚮 (❌) 🏷 🔢 📖 ⏮️ 🎰 🏫 🏷 ⏭ `yield`. 👉 📟 🔜 🛠️ **⏭** 🈸 **▶️ ✊ 📨**, ⏮️ *🕴*. & ⤴️, ▶️️ ⏮️ `yield`, 👥 🚚 🏷. 👉 📟 🔜 🛠️ **⏮️** 🈸 **🏁 🚚 📨**, ▶️️ ⏭ *🤫*. 👉 💪, 🖼, 🚀 ℹ 💖 💾 ⚖️ 💻. !!! tip `shutdown` 🔜 🔨 🕐❔ 👆 **⛔️** 🈸. 🎲 👆 💪 ▶️ 🆕 ⏬, ⚖️ 👆 🤚 🎡 🏃 ⚫️. 🤷 ### 🔆 🔢 🥇 👜 👀, 👈 👥 ⚖ 🔁 🔢 ⏮️ `yield`. 👉 📶 🎏 🔗 ⏮️ `yield`. ```Python hl_lines="14-19" {!../../../docs_src/events/tutorial003.py!} ``` 🥇 🍕 🔢, ⏭ `yield`, 🔜 🛠️ **⏭** 🈸 ▶️. & 🍕 ⏮️ `yield` 🔜 🛠️ **⏮️** 🈸 ✔️ 🏁. ### 🔁 🔑 👨‍💼 🚥 👆 ✅, 🔢 🎀 ⏮️ `@asynccontextmanager`. 👈 🗜 🔢 🔘 🕳 🤙 "**🔁 🔑 👨‍💼**". ```Python hl_lines="1 13" {!../../../docs_src/events/tutorial003.py!} ``` **🔑 👨‍💼** 🐍 🕳 👈 👆 💪 ⚙️ `with` 📄, 🖼, `open()` 💪 ⚙️ 🔑 👨‍💼: ```Python with open("file.txt") as file: file.read() ``` ⏮️ ⏬ 🐍, 📤 **🔁 🔑 👨‍💼**. 👆 🔜 ⚙️ ⚫️ ⏮️ `async with`: ```Python async with lifespan(app): await do_stuff() ``` 🕐❔ 👆 ✍ 🔑 👨‍💼 ⚖️ 🔁 🔑 👨‍💼 💖 🔛, ⚫️❔ ⚫️ 🔨 👈, ⏭ 🛬 `with` 🍫, ⚫️ 🔜 🛠️ 📟 ⏭ `yield`, & ⏮️ ❎ `with` 🍫, ⚫️ 🔜 🛠️ 📟 ⏮️ `yield`. 👆 📟 🖼 🔛, 👥 🚫 ⚙️ ⚫️ 🔗, ✋️ 👥 🚶‍♀️ ⚫️ FastAPI ⚫️ ⚙️ ⚫️. `lifespan` 🔢 `FastAPI` 📱 ✊ **🔁 🔑 👨‍💼**, 👥 💪 🚶‍♀️ 👆 🆕 `lifespan` 🔁 🔑 👨‍💼 ⚫️. ```Python hl_lines="22" {!../../../docs_src/events/tutorial003.py!} ``` ## 🎛 🎉 (😢) !!! warning 👍 🌌 🍵 *🕴* & *🤫* ⚙️ `lifespan` 🔢 `FastAPI` 📱 🔬 🔛. 👆 💪 🎲 🚶 👉 🍕. 📤 🎛 🌌 🔬 👉 ⚛ 🛠️ ⏮️ *🕴* & ⏮️ *🤫*. 👆 💪 🔬 🎉 🐕‍🦺 (🔢) 👈 💪 🛠️ ⏭ 🈸 ▶️ 🆙, ⚖️ 🕐❔ 🈸 🤫 🔽. 👫 🔢 💪 📣 ⏮️ `async def` ⚖️ 😐 `def`. ### `startup` 🎉 🚮 🔢 👈 🔜 🏃 ⏭ 🈸 ▶️, 📣 ⚫️ ⏮️ 🎉 `"startup"`: ```Python hl_lines="8" {!../../../docs_src/events/tutorial001.py!} ``` 👉 💼, `startup` 🎉 🐕‍🦺 🔢 🔜 🔢 🏬 "💽" ( `dict`) ⏮️ 💲. 👆 💪 🚮 🌅 🌘 1️⃣ 🎉 🐕‍🦺 🔢. & 👆 🈸 🏆 🚫 ▶️ 📨 📨 ⏭ 🌐 `startup` 🎉 🐕‍🦺 ✔️ 🏁. ### `shutdown` 🎉 🚮 🔢 👈 🔜 🏃 🕐❔ 🈸 🤫 🔽, 📣 ⚫️ ⏮️ 🎉 `"shutdown"`: ```Python hl_lines="6" {!../../../docs_src/events/tutorial002.py!} ``` 📥, `shutdown` 🎉 🐕‍🦺 🔢 🔜 ✍ ✍ ⏸ `"Application shutdown"` 📁 `log.txt`. !!! info `open()` 🔢, `mode="a"` ⛓ "🎻",, ⏸ 🔜 🚮 ⏮️ ⚫️❔ 🔛 👈 📁, 🍵 📁 ⏮️ 🎚. !!! tip 👀 👈 👉 💼 👥 ⚙️ 🐩 🐍 `open()` 🔢 👈 🔗 ⏮️ 📁. , ⚫️ 🔌 👤/🅾 (🔢/🔢), 👈 🚚 "⌛" 👜 ✍ 💾. ✋️ `open()` 🚫 ⚙️ `async` & `await`. , 👥 📣 🎉 🐕‍🦺 🔢 ⏮️ 🐩 `def` ↩️ `async def`. !!! info 👆 💪 ✍ 🌅 🔃 👫 🎉 🐕‍🦺 💃 🎉' 🩺. ### `startup` & `shutdown` 👯‍♂️ 📤 ↕ 🤞 👈 ⚛ 👆 *🕴* & *🤫* 🔗, 👆 💪 💚 ▶️ 🕳 & ⤴️ 🏁 ⚫️, 📎 ℹ & ⤴️ 🚀 ⚫️, ♒️. 🔨 👈 👽 🔢 👈 🚫 💰 ⚛ ⚖️ 🔢 👯‍♂️ 🌅 ⚠ 👆 🔜 💪 🏪 💲 🌐 🔢 ⚖️ 🎏 🎱. ↩️ 👈, ⚫️ 🔜 👍 ↩️ ⚙️ `lifespan` 🔬 🔛. ## 📡 ℹ 📡 ℹ 😟 🤓. 👶 🔘, 🔫 📡 🔧, 👉 🍕 🔆 🛠️, & ⚫️ 🔬 🎉 🤙 `startup` & `shutdown`. ## 🎧 🈸 👶 ✔️ 🤯 👈 👫 🔆 🎉 (🕴 & 🤫) 🔜 🕴 🛠️ 👑 🈸, 🚫 [🎧 🈸 - 🗻](sub-applications.md){.internal-link target=_blank}. fastapi-0.110.3/docs/em/docs/advanced/generate-clients.md000066400000000000000000000206341461403617600231210ustar00rootroot00000000000000# 🏗 👩‍💻 **FastAPI** ⚓️ 🔛 🗄 🔧, 👆 🤚 🏧 🔗 ⏮️ 📚 🧰, 🔌 🏧 🛠️ 🩺 (🚚 🦁 🎚). 1️⃣ 🎯 📈 👈 🚫 🎯 ⭐ 👈 👆 💪 **🏗 👩‍💻** (🕣 🤙 **📱** ) 👆 🛠️, 📚 🎏 **🛠️ 🇪🇸**. ## 🗄 👩‍💻 🚂 📤 📚 🧰 🏗 👩‍💻 ⚪️➡️ **🗄**. ⚠ 🧰 🗄 🚂. 🚥 👆 🏗 **🕸**, 📶 😌 🎛 🗄-📕-🇦🇪. ## 🏗 📕 🕸 👩‍💻 ➡️ ▶️ ⏮️ 🙅 FastAPI 🈸: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9-11 14-15 18 19 23" {!> ../../../docs_src/generate_clients/tutorial001.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="7-9 12-13 16-17 21" {!> ../../../docs_src/generate_clients/tutorial001_py39.py!} ``` 👀 👈 *➡ 🛠️* 🔬 🏷 👫 ⚙️ 📨 🚀 & 📨 🚀, ⚙️ 🏷 `Item` & `ResponseMessage`. ### 🛠️ 🩺 🚥 👆 🚶 🛠️ 🩺, 👆 🔜 👀 👈 ⚫️ ✔️ **🔗** 📊 📨 📨 & 📨 📨: 👆 💪 👀 👈 🔗 ↩️ 👫 📣 ⏮️ 🏷 📱. 👈 ℹ 💪 📱 **🗄 🔗**, & ⤴️ 🎦 🛠️ 🩺 (🦁 🎚). & 👈 🎏 ℹ ⚪️➡️ 🏷 👈 🔌 🗄 ⚫️❔ 💪 ⚙️ **🏗 👩‍💻 📟**. ### 🏗 📕 👩‍💻 🔜 👈 👥 ✔️ 📱 ⏮️ 🏷, 👥 💪 🏗 👩‍💻 📟 🕸. #### ❎ `openapi-ts` 👆 💪 ❎ `openapi-ts` 👆 🕸 📟 ⏮️:
```console $ npm install @hey-api/openapi-ts --save-dev ---> 100% ```
#### 🏗 👩‍💻 📟 🏗 👩‍💻 📟 👆 💪 ⚙️ 📋 ⏸ 🈸 `openapi-ts` 👈 🔜 🔜 ❎. ↩️ ⚫️ ❎ 🇧🇿 🏗, 👆 🎲 🚫🔜 💪 🤙 👈 📋 🔗, ✋️ 👆 🔜 🚮 ⚫️ 🔛 👆 `package.json` 📁. ⚫️ 💪 👀 💖 👉: ```JSON hl_lines="7" { "name": "frontend-app", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "generate-client": "openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios" }, "author": "", "license": "", "devDependencies": { "@hey-api/openapi-ts": "^0.27.38", "typescript": "^4.6.2" } } ``` ⏮️ ✔️ 👈 ☕ `generate-client` ✍ 📤, 👆 💪 🏃 ⚫️ ⏮️:
```console $ npm run generate-client frontend-app@1.0.0 generate-client /home/user/code/frontend-app > openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios ```
👈 📋 🔜 🏗 📟 `./src/client` & 🔜 ⚙️ `axios` (🕸 🇺🇸🔍 🗃) 🔘. ### 🔄 👅 👩‍💻 📟 🔜 👆 💪 🗄 & ⚙️ 👩‍💻 📟, ⚫️ 💪 👀 💖 👉, 👀 👈 👆 🤚 ✍ 👩‍🔬: 👆 🔜 🤚 ✍ 🚀 📨: !!! tip 👀 ✍ `name` & `price`, 👈 🔬 FastAPI 🈸, `Item` 🏷. 👆 🔜 ✔️ ⏸ ❌ 📊 👈 👆 📨: 📨 🎚 🔜 ✔️ ✍: ## FastAPI 📱 ⏮️ 🔖 📚 💼 👆 FastAPI 📱 🔜 🦏, & 👆 🔜 🎲 ⚙️ 🔖 🎏 🎏 👪 *➡ 🛠️*. 🖼, 👆 💪 ✔️ 📄 **🏬** & ➕1️⃣ 📄 **👩‍💻**, & 👫 💪 👽 🔖: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="23 28 36" {!> ../../../docs_src/generate_clients/tutorial002.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="21 26 34" {!> ../../../docs_src/generate_clients/tutorial002_py39.py!} ``` ### 🏗 📕 👩‍💻 ⏮️ 🔖 🚥 👆 🏗 👩‍💻 FastAPI 📱 ⚙️ 🔖, ⚫️ 🔜 🛎 🎏 👩‍💻 📟 ⚓️ 🔛 🔖. 👉 🌌 👆 🔜 💪 ✔️ 👜 ✔ & 👪 ☑ 👩‍💻 📟: 👉 💼 👆 ✔️: * `ItemsService` * `UsersService` ### 👩‍💻 👩‍🔬 📛 ▶️️ 🔜 🏗 👩‍🔬 📛 💖 `createItemItemsPost` 🚫 👀 📶 🧹: ```TypeScript ItemsService.createItemItemsPost({name: "Plumbus", price: 5}) ``` ...👈 ↩️ 👩‍💻 🚂 ⚙️ 🗄 🔗 **🛠️ 🆔** 🔠 *➡ 🛠️*. 🗄 🚚 👈 🔠 🛠️ 🆔 😍 🤭 🌐 *➡ 🛠️*, FastAPI ⚙️ **🔢 📛**, **➡**, & **🇺🇸🔍 👩‍🔬/🛠️** 🏗 👈 🛠️ 🆔, ↩️ 👈 🌌 ⚫️ 💪 ⚒ 💭 👈 🛠️ 🆔 😍. ✋️ 👤 🔜 🎦 👆 ❔ 📉 👈 ⏭. 👶 ## 🛃 🛠️ 🆔 & 👍 👩‍🔬 📛 👆 💪 **🔀** 🌌 👫 🛠️ 🆔 **🏗** ⚒ 👫 🙅 & ✔️ **🙅 👩‍🔬 📛** 👩‍💻. 👉 💼 👆 🔜 ✔️ 🚚 👈 🔠 🛠️ 🆔 **😍** 🎏 🌌. 🖼, 👆 💪 ⚒ 💭 👈 🔠 *➡ 🛠️* ✔️ 🔖, & ⤴️ 🏗 🛠️ 🆔 ⚓️ 🔛 **🔖** & *➡ 🛠️* **📛** (🔢 📛). ### 🛃 🏗 😍 🆔 🔢 FastAPI ⚙️ **😍 🆔** 🔠 *➡ 🛠️*, ⚫️ ⚙️ **🛠️ 🆔** & 📛 🙆 💪 🛃 🏷, 📨 ⚖️ 📨. 👆 💪 🛃 👈 🔢. ⚫️ ✊ `APIRoute` & 🔢 🎻. 🖼, 📥 ⚫️ ⚙️ 🥇 🔖 (👆 🔜 🎲 ✔️ 🕴 1️⃣ 🔖) & *➡ 🛠️* 📛 (🔢 📛). 👆 💪 ⤴️ 🚶‍♀️ 👈 🛃 🔢 **FastAPI** `generate_unique_id_function` 🔢: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="8-9 12" {!> ../../../docs_src/generate_clients/tutorial003.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="6-7 10" {!> ../../../docs_src/generate_clients/tutorial003_py39.py!} ``` ### 🏗 📕 👩‍💻 ⏮️ 🛃 🛠️ 🆔 🔜 🚥 👆 🏗 👩‍💻 🔄, 👆 🔜 👀 👈 ⚫️ ✔️ 📉 👩‍🔬 📛: 👆 👀, 👩‍🔬 📛 🔜 ✔️ 🔖 & ⤴️ 🔢 📛, 🔜 👫 🚫 🔌 ℹ ⚪️➡️ 📛 ➡ & 🇺🇸🔍 🛠️. ### 🗜 🗄 🔧 👩‍💻 🚂 🏗 📟 ✔️ **❎ ℹ**. 👥 ⏪ 💭 👈 👉 👩‍🔬 🔗 **🏬** ↩️ 👈 🔤 `ItemsService` (✊ ⚪️➡️ 🔖), ✋️ 👥 ✔️ 📛 🔡 👩‍🔬 📛 💁‍♂️. 👶 👥 🔜 🎲 💚 🚧 ⚫️ 🗄 🏢, 👈 🔜 🚚 👈 🛠️ 🆔 **😍**. ✋️ 🏗 👩‍💻 👥 💪 **🔀** 🗄 🛠️ 🆔 ▶️️ ⏭ 🏭 👩‍💻, ⚒ 👈 👩‍🔬 📛 👌 & **🧹**. 👥 💪 ⏬ 🗄 🎻 📁 `openapi.json` & ⤴️ 👥 💪 **❎ 👈 🔡 🔖** ⏮️ ✍ 💖 👉: ```Python {!../../../docs_src/generate_clients/tutorial004.py!} ``` ⏮️ 👈, 🛠️ 🆔 🔜 📁 ⚪️➡️ 👜 💖 `items-get_items` `get_items`, 👈 🌌 👩‍💻 🚂 💪 🏗 🙅 👩‍🔬 📛. ### 🏗 📕 👩‍💻 ⏮️ 🗜 🗄 🔜 🔚 🏁 📁 `openapi.json`, 👆 🔜 🔀 `package.json` ⚙️ 👈 🇧🇿 📁, 🖼: ```JSON hl_lines="7" { "name": "frontend-app", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "generate-client": "openapi-ts --input ./openapi.json --output ./src/client --client axios" }, "author": "", "license": "", "devDependencies": { "@hey-api/openapi-ts": "^0.27.38", "typescript": "^4.6.2" } } ``` ⏮️ 🏭 🆕 👩‍💻, 👆 🔜 🔜 ✔️ **🧹 👩‍🔬 📛**, ⏮️ 🌐 **✍**, **⏸ ❌**, ♒️: ## 💰 🕐❔ ⚙️ 🔁 🏗 👩‍💻 👆 🔜 **✍** : * 👩‍🔬. * 📨 🚀 💪, 🔢 🔢, ♒️. * 📨 🚀. 👆 🔜 ✔️ **⏸ ❌** 🌐. & 🕐❔ 👆 ℹ 👩‍💻 📟, & **♻** 🕸, ⚫️ 🔜 ✔️ 🙆 🆕 *➡ 🛠️* 💪 👩‍🔬, 🗝 🕐 ❎, & 🙆 🎏 🔀 🔜 🎨 🔛 🏗 📟. 👶 👉 ⛓ 👈 🚥 🕳 🔀 ⚫️ 🔜 **🎨** 🔛 👩‍💻 📟 🔁. & 🚥 👆 **🏗** 👩‍💻 ⚫️ 🔜 ❌ 👅 🚥 👆 ✔️ 🙆 **🔖** 📊 ⚙️. , 👆 🔜 **🔍 📚 ❌** 📶 ⏪ 🛠️ 🛵 ↩️ ✔️ ⌛ ❌ 🎦 🆙 👆 🏁 👩‍💻 🏭 & ⤴️ 🔄 ℹ 🌐❔ ⚠. 👶 fastapi-0.110.3/docs/em/docs/advanced/index.md000066400000000000000000000016401461403617600207730ustar00rootroot00000000000000# 🏧 👩‍💻 🦮 ## 🌖 ⚒ 👑 [🔰 - 👩‍💻 🦮](../tutorial/index.md){.internal-link target=_blank} 🔜 🥃 🤝 👆 🎫 🔘 🌐 👑 ⚒ **FastAPI**. ⏭ 📄 👆 🔜 👀 🎏 🎛, 📳, & 🌖 ⚒. !!! tip ⏭ 📄 **🚫 🎯 "🏧"**. & ⚫️ 💪 👈 👆 ⚙️ 💼, ⚗ 1️⃣ 👫. ## ✍ 🔰 🥇 👆 💪 ⚙️ 🏆 ⚒ **FastAPI** ⏮️ 💡 ⚪️➡️ 👑 [🔰 - 👩‍💻 🦮](../tutorial/index.md){.internal-link target=_blank}. & ⏭ 📄 🤔 👆 ⏪ ✍ ⚫️, & 🤔 👈 👆 💭 👈 👑 💭. ## 🏎.🅾 ↗️ 🚥 👆 🔜 💖 ✊ 🏧-🔰 ↗️ 🔗 👉 📄 🩺, 👆 💪 💚 ✅: 💯-💾 🛠️ ⏮️ FastAPI & ☁ **🏎.🅾**. 👫 ⏳ 🩸 1️⃣0️⃣ 💯 🌐 💰 🛠️ **FastAPI**. 👶 👶 fastapi-0.110.3/docs/em/docs/advanced/middleware.md000066400000000000000000000064571461403617600220140ustar00rootroot00000000000000# 🏧 🛠️ 👑 🔰 👆 ✍ ❔ 🚮 [🛃 🛠️](../tutorial/middleware.md){.internal-link target=_blank} 👆 🈸. & ⤴️ 👆 ✍ ❔ 🍵 [⚜ ⏮️ `CORSMiddleware`](../tutorial/cors.md){.internal-link target=_blank}. 👉 📄 👥 🔜 👀 ❔ ⚙️ 🎏 🛠️. ## ❎ 🔫 🛠️ **FastAPI** ⚓️ 🔛 💃 & 🛠️ 🔫 🔧, 👆 💪 ⚙️ 🙆 🔫 🛠️. 🛠️ 🚫 ✔️ ⚒ FastAPI ⚖️ 💃 👷, 📏 ⚫️ ⏩ 🔫 🔌. 🏢, 🔫 🛠️ 🎓 👈 ⌛ 📨 🔫 📱 🥇 ❌. , 🧾 🥉-🥳 🔫 🛠️ 👫 🔜 🎲 💬 👆 🕳 💖: ```Python from unicorn import UnicornMiddleware app = SomeASGIApp() new_app = UnicornMiddleware(app, some_config="rainbow") ``` ✋️ FastAPI (🤙 💃) 🚚 🙅 🌌 ⚫️ 👈 ⚒ 💭 👈 🔗 🛠️ 🍵 💽 ❌ & 🛃 ⚠ 🐕‍🦺 👷 ☑. 👈, 👆 ⚙️ `app.add_middleware()` (🖼 ⚜). ```Python from fastapi import FastAPI from unicorn import UnicornMiddleware app = FastAPI() app.add_middleware(UnicornMiddleware, some_config="rainbow") ``` `app.add_middleware()` 📨 🛠️ 🎓 🥇 ❌ & 🙆 🌖 ❌ 🚶‍♀️ 🛠️. ## 🛠️ 🛠️ **FastAPI** 🔌 📚 🛠️ ⚠ ⚙️ 💼, 👥 🔜 👀 ⏭ ❔ ⚙️ 👫. !!! note "📡 ℹ" ⏭ 🖼, 👆 💪 ⚙️ `from starlette.middleware.something import SomethingMiddleware`. **FastAPI** 🚚 📚 🛠️ `fastapi.middleware` 🏪 👆, 👩‍💻. ✋️ 🌅 💪 🛠️ 👟 🔗 ⚪️➡️ 💃. ## `HTTPSRedirectMiddleware` 🛠️ 👈 🌐 📨 📨 🔜 👯‍♂️ `https` ⚖️ `wss`. 🙆 📨 📨 `http` ⚖️ `ws` 🔜 ❎ 🔐 ⚖ ↩️. ```Python hl_lines="2 6" {!../../../docs_src/advanced_middleware/tutorial001.py!} ``` ## `TrustedHostMiddleware` 🛠️ 👈 🌐 📨 📨 ✔️ ☑ ⚒ `Host` 🎚, ✔ 💂‍♂ 🛡 🇺🇸🔍 🦠 🎚 👊. ```Python hl_lines="2 6-8" {!../../../docs_src/advanced_middleware/tutorial002.py!} ``` 📄 ❌ 🐕‍🦺: * `allowed_hosts` - 📇 🆔 📛 👈 🔜 ✔ 📛. 🃏 🆔 ✅ `*.example.com` 🐕‍🦺 🎀 📁. ✔ 🙆 📛 👯‍♂️ ⚙️ `allowed_hosts=["*"]` ⚖️ 🚫 🛠️. 🚥 📨 📨 🔨 🚫 ✔ ☑ ⤴️ `400` 📨 🔜 📨. ## `GZipMiddleware` 🍵 🗜 📨 🙆 📨 👈 🔌 `"gzip"` `Accept-Encoding` 🎚. 🛠️ 🔜 🍵 👯‍♂️ 🐩 & 🎥 📨. ```Python hl_lines="2 6" {!../../../docs_src/advanced_middleware/tutorial003.py!} ``` 📄 ❌ 🐕‍🦺: * `minimum_size` - 🚫 🗜 📨 👈 🤪 🌘 👉 💯 📐 🔢. 🔢 `500`. ## 🎏 🛠️ 📤 📚 🎏 🔫 🛠️. 🖼: * 🔫 * Uvicorn `ProxyHeadersMiddleware` * 🇸🇲 👀 🎏 💪 🛠️ ✅ 💃 🛠️ 🩺 & 🔫 👌 📇. fastapi-0.110.3/docs/em/docs/advanced/openapi-callbacks.md000066400000000000000000000152001461403617600232310ustar00rootroot00000000000000# 🗄 ⏲ 👆 💪 ✍ 🛠️ ⏮️ *➡ 🛠️* 👈 💪 ⏲ 📨 *🔢 🛠️* ✍ 👱 🙆 (🎲 🎏 👩‍💻 👈 🔜 *⚙️* 👆 🛠️). 🛠️ 👈 🔨 🕐❔ 👆 🛠️ 📱 🤙 *🔢 🛠️* 📛 "⏲". ↩️ 🖥 👈 🔢 👩‍💻 ✍ 📨 📨 👆 🛠️ & ⤴️ 👆 🛠️ *🤙 🔙*, 📨 📨 *🔢 🛠️* (👈 🎲 ✍ 🎏 👩‍💻). 👉 💼, 👆 💪 💚 📄 ❔ 👈 🔢 🛠️ *🔜* 👀 💖. ⚫️❔ *➡ 🛠️* ⚫️ 🔜 ✔️, ⚫️❔ 💪 ⚫️ 🔜 ⌛, ⚫️❔ 📨 ⚫️ 🔜 📨, ♒️. ## 📱 ⏮️ ⏲ ➡️ 👀 🌐 👉 ⏮️ 🖼. 🌈 👆 🛠️ 📱 👈 ✔ 🏗 🧾. 👉 🧾 🔜 ✔️ `id`, `title` (📦), `customer`, & `total`. 👩‍💻 👆 🛠️ (🔢 👩‍💻) 🔜 ✍ 🧾 👆 🛠️ ⏮️ 🏤 📨. ⤴️ 👆 🛠️ 🔜 (➡️ 🌈): * 📨 🧾 🕴 🔢 👩‍💻. * 📈 💸. * 📨 📨 🔙 🛠️ 👩‍💻 (🔢 👩‍💻). * 👉 🔜 🔨 📨 🏤 📨 (⚪️➡️ *👆 🛠️*) *🔢 🛠️* 🚚 👈 🔢 👩‍💻 (👉 "⏲"). ## 😐 **FastAPI** 📱 ➡️ 🥇 👀 ❔ 😐 🛠️ 📱 🔜 👀 💖 ⏭ ❎ ⏲. ⚫️ 🔜 ✔️ *➡ 🛠️* 👈 🔜 📨 `Invoice` 💪, & 🔢 🔢 `callback_url` 👈 🔜 🔌 📛 ⏲. 👉 🍕 📶 😐, 🌅 📟 🎲 ⏪ 😰 👆: ```Python hl_lines="9-13 36-53" {!../../../docs_src/openapi_callbacks/tutorial001.py!} ``` !!! tip `callback_url` 🔢 🔢 ⚙️ Pydantic 📛 🆎. 🕴 🆕 👜 `callbacks=messages_callback_router.routes` ❌ *➡ 🛠️ 👨‍🎨*. 👥 🔜 👀 ⚫️❔ 👈 ⏭. ## 🔬 ⏲ ☑ ⏲ 📟 🔜 🪀 🙇 🔛 👆 👍 🛠️ 📱. & ⚫️ 🔜 🎲 🪀 📚 ⚪️➡️ 1️⃣ 📱 ⏭. ⚫️ 💪 1️⃣ ⚖️ 2️⃣ ⏸ 📟, 💖: ```Python callback_url = "https://example.com/api/v1/invoices/events/" httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) ``` ✋️ 🎲 🏆 ⚠ 🍕 ⏲ ⚒ 💭 👈 👆 🛠️ 👩‍💻 (🔢 👩‍💻) 🛠️ *🔢 🛠️* ☑, 🛄 💽 👈 *👆 🛠️* 🔜 📨 📨 💪 ⏲, ♒️. , ⚫️❔ 👥 🔜 ⏭ 🚮 📟 📄 ❔ 👈 *🔢 🛠️* 🔜 👀 💖 📨 ⏲ ⚪️➡️ *👆 🛠️*. 👈 🧾 🔜 🎦 🆙 🦁 🎚 `/docs` 👆 🛠️, & ⚫️ 🔜 ➡️ 🔢 👩‍💻 💭 ❔ 🏗 *🔢 🛠️*. 👉 🖼 🚫 🛠️ ⏲ ⚫️ (👈 💪 ⏸ 📟), 🕴 🧾 🍕. !!! tip ☑ ⏲ 🇺🇸🔍 📨. 🕐❔ 🛠️ ⏲ 👆, 👆 💪 ⚙️ 🕳 💖 🇸🇲 ⚖️ 📨. ## ✍ ⏲ 🧾 📟 👉 📟 🏆 🚫 🛠️ 👆 📱, 👥 🕴 💪 ⚫️ *📄* ❔ 👈 *🔢 🛠️* 🔜 👀 💖. ✋️, 👆 ⏪ 💭 ❔ 💪 ✍ 🏧 🧾 🛠️ ⏮️ **FastAPI**. 👥 🔜 ⚙️ 👈 🎏 💡 📄 ❔ *🔢 🛠️* 🔜 👀 💖... 🏗 *➡ 🛠️(Ⓜ)* 👈 🔢 🛠️ 🔜 🛠️ (🕐 👆 🛠️ 🔜 🤙). !!! tip 🕐❔ ✍ 📟 📄 ⏲, ⚫️ 💪 ⚠ 🌈 👈 👆 👈 *🔢 👩‍💻*. & 👈 👆 ⏳ 🛠️ *🔢 🛠️*, 🚫 *👆 🛠️*. 🍕 🛠️ 👉 ☝ 🎑 ( *🔢 👩‍💻*) 💪 ℹ 👆 💭 💖 ⚫️ 🌅 ⭐ 🌐❔ 🚮 🔢, Pydantic 🏷 💪, 📨, ♒️. 👈 *🔢 🛠️*. ### ✍ ⏲ `APIRouter` 🥇 ✍ 🆕 `APIRouter` 👈 🔜 🔌 1️⃣ ⚖️ 🌅 ⏲. ```Python hl_lines="3 25" {!../../../docs_src/openapi_callbacks/tutorial001.py!} ``` ### ✍ ⏲ *➡ 🛠️* ✍ ⏲ *➡ 🛠️* ⚙️ 🎏 `APIRouter` 👆 ✍ 🔛. ⚫️ 🔜 👀 💖 😐 FastAPI *➡ 🛠️*: * ⚫️ 🔜 🎲 ✔️ 📄 💪 ⚫️ 🔜 📨, ✅ `body: InvoiceEvent`. * & ⚫️ 💪 ✔️ 📄 📨 ⚫️ 🔜 📨, ✅ `response_model=InvoiceEventReceived`. ```Python hl_lines="16-18 21-22 28-32" {!../../../docs_src/openapi_callbacks/tutorial001.py!} ``` 📤 2️⃣ 👑 🔺 ⚪️➡️ 😐 *➡ 🛠️*: * ⚫️ 🚫 💪 ✔️ 🙆 ☑ 📟, ↩️ 👆 📱 🔜 🙅 🤙 👉 📟. ⚫️ 🕴 ⚙️ 📄 *🔢 🛠️*. , 🔢 💪 ✔️ `pass`. * *➡* 💪 🔌 🗄 3️⃣ 🧬 (👀 🌖 🔛) 🌐❔ ⚫️ 💪 ⚙️ 🔢 ⏮️ 🔢 & 🍕 ⏮️ 📨 📨 *👆 🛠️*. ### ⏲ ➡ 🧬 ⏲ *➡* 💪 ✔️ 🗄 3️⃣ 🧬 👈 💪 🔌 🍕 ⏮️ 📨 📨 *👆 🛠️*. 👉 💼, ⚫️ `str`: ```Python "{$callback_url}/invoices/{$request.body.id}" ``` , 🚥 👆 🛠️ 👩‍💻 (🔢 👩‍💻) 📨 📨 *👆 🛠️* : ``` https://yourapi.com/invoices/?callback_url=https://www.external.org/events ``` ⏮️ 🎻 💪: ```JSON { "id": "2expen51ve", "customer": "Mr. Richie Rich", "total": "9999" } ``` ⤴️ *👆 🛠️* 🔜 🛠️ 🧾, & ☝ ⏪, 📨 ⏲ 📨 `callback_url` ( *🔢 🛠️*): ``` https://www.external.org/events/invoices/2expen51ve ``` ⏮️ 🎻 💪 ⚗ 🕳 💖: ```JSON { "description": "Payment celebration", "paid": true } ``` & ⚫️ 🔜 ⌛ 📨 ⚪️➡️ 👈 *🔢 🛠️* ⏮️ 🎻 💪 💖: ```JSON { "ok": true } ``` !!! tip 👀 ❔ ⏲ 📛 ⚙️ 🔌 📛 📨 🔢 🔢 `callback_url` (`https://www.external.org/events`) & 🧾 `id` ⚪️➡️ 🔘 🎻 💪 (`2expen51ve`). ### 🚮 ⏲ 📻 👉 ☝ 👆 ✔️ *⏲ ➡ 🛠️(Ⓜ)* 💪 (1️⃣(Ⓜ) 👈 *🔢 👩‍💻* 🔜 🛠️ *🔢 🛠️*) ⏲ 📻 👆 ✍ 🔛. 🔜 ⚙️ 🔢 `callbacks` *👆 🛠️ ➡ 🛠️ 👨‍🎨* 🚶‍♀️ 🔢 `.routes` (👈 🤙 `list` 🛣/*➡ 🛠️*) ⚪️➡️ 👈 ⏲ 📻: ```Python hl_lines="35" {!../../../docs_src/openapi_callbacks/tutorial001.py!} ``` !!! tip 👀 👈 👆 🚫 🚶‍♀️ 📻 ⚫️ (`invoices_callback_router`) `callback=`, ✋️ 🔢 `.routes`, `invoices_callback_router.routes`. ### ✅ 🩺 🔜 👆 💪 ▶️ 👆 📱 ⏮️ Uvicorn & 🚶 http://127.0.0.1:8000/docs. 👆 🔜 👀 👆 🩺 ✅ "⏲" 📄 👆 *➡ 🛠️* 👈 🎦 ❔ *🔢 🛠️* 🔜 👀 💖: fastapi-0.110.3/docs/em/docs/advanced/path-operation-advanced-configuration.md000066400000000000000000000133721461403617600272330ustar00rootroot00000000000000# ➡ 🛠️ 🏧 📳 ## 🗄 { !!! warning 🚥 👆 🚫 "🕴" 🗄, 👆 🎲 🚫 💪 👉. 👆 💪 ⚒ 🗄 `operationId` ⚙️ 👆 *➡ 🛠️* ⏮️ 🔢 `operation_id`. 👆 🔜 ✔️ ⚒ 💭 👈 ⚫️ 😍 🔠 🛠️. ```Python hl_lines="6" {!../../../docs_src/path_operation_advanced_configuration/tutorial001.py!} ``` ### ⚙️ *➡ 🛠️ 🔢* 📛 { 🚥 👆 💚 ⚙️ 👆 🔗' 🔢 📛 `operationId`Ⓜ, 👆 💪 🔁 🤭 🌐 👫 & 🔐 🔠 *➡ 🛠️* `operation_id` ⚙️ 👫 `APIRoute.name`. 👆 🔜 ⚫️ ⏮️ ❎ 🌐 👆 *➡ 🛠️*. ```Python hl_lines="2 12-21 24" {!../../../docs_src/path_operation_advanced_configuration/tutorial002.py!} ``` !!! tip 🚥 👆 ❎ 🤙 `app.openapi()`, 👆 🔜 ℹ `operationId`Ⓜ ⏭ 👈. !!! warning 🚥 👆 👉, 👆 ✔️ ⚒ 💭 🔠 1️⃣ 👆 *➡ 🛠️ 🔢* ✔️ 😍 📛. 🚥 👫 🎏 🕹 (🐍 📁). ## 🚫 ⚪️➡️ 🗄 🚫 *➡ 🛠️* ⚪️➡️ 🏗 🗄 🔗 (& ➡️, ⚪️➡️ 🏧 🧾 ⚙️), ⚙️ 🔢 `include_in_schema` & ⚒ ⚫️ `False`: ```Python hl_lines="6" {!../../../docs_src/path_operation_advanced_configuration/tutorial003.py!} ``` ## 🏧 📛 ⚪️➡️ #️⃣ 👆 💪 📉 ⏸ ⚙️ ⚪️➡️ #️⃣ *➡ 🛠️ 🔢* 🗄. ❎ `\f` (😖 "📨 🍼" 🦹) 🤕 **FastAPI** 🔁 🔢 ⚙️ 🗄 👉 ☝. ⚫️ 🏆 🚫 🎦 🆙 🧾, ✋️ 🎏 🧰 (✅ 🐉) 🔜 💪 ⚙️ 🎂. ```Python hl_lines="19-29" {!../../../docs_src/path_operation_advanced_configuration/tutorial004.py!} ``` ## 🌖 📨 👆 🎲 ✔️ 👀 ❔ 📣 `response_model` & `status_code` *➡ 🛠️*. 👈 🔬 🗃 🔃 👑 📨 *➡ 🛠️*. 👆 💪 📣 🌖 📨 ⏮️ 👫 🏷, 👔 📟, ♒️. 📤 🎂 📃 📥 🧾 🔃 ⚫️, 👆 💪 ✍ ⚫️ [🌖 📨 🗄](additional-responses.md){.internal-link target=_blank}. ## 🗄 ➕ 🕐❔ 👆 📣 *➡ 🛠️* 👆 🈸, **FastAPI** 🔁 🏗 🔗 🗃 🔃 👈 *➡ 🛠️* 🔌 🗄 🔗. !!! note "📡 ℹ" 🗄 🔧 ⚫️ 🤙 🛠️ 🎚. ⚫️ ✔️ 🌐 ℹ 🔃 *➡ 🛠️* & ⚙️ 🏗 🏧 🧾. ⚫️ 🔌 `tags`, `parameters`, `requestBody`, `responses`, ♒️. 👉 *➡ 🛠️*-🎯 🗄 🔗 🛎 🏗 🔁 **FastAPI**, ✋️ 👆 💪 ↔ ⚫️. !!! tip 👉 🔅 🎚 ↔ ☝. 🚥 👆 🕴 💪 📣 🌖 📨, 🌅 🏪 🌌 ⚫️ ⏮️ [🌖 📨 🗄](additional-responses.md){.internal-link target=_blank}. 👆 💪 ↔ 🗄 🔗 *➡ 🛠️* ⚙️ 🔢 `openapi_extra`. ### 🗄 ↔ 👉 `openapi_extra` 💪 👍, 🖼, 📣 [🗄 ↔](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions): ```Python hl_lines="6" {!../../../docs_src/path_operation_advanced_configuration/tutorial005.py!} ``` 🚥 👆 📂 🏧 🛠️ 🩺, 👆 ↔ 🔜 🎦 🆙 🔝 🎯 *➡ 🛠️*. & 🚥 👆 👀 📉 🗄 ( `/openapi.json` 👆 🛠️), 👆 🔜 👀 👆 ↔ 🍕 🎯 *➡ 🛠️* 💁‍♂️: ```JSON hl_lines="22" { "openapi": "3.0.2", "info": { "title": "FastAPI", "version": "0.1.0" }, "paths": { "/items/": { "get": { "summary": "Read Items", "operationId": "read_items_items__get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } } }, "x-aperture-labs-portal": "blue" } } } } ``` ### 🛃 🗄 *➡ 🛠️* 🔗 📖 `openapi_extra` 🔜 🙇 🔗 ⏮️ 🔁 🏗 🗄 🔗 *➡ 🛠️*. , 👆 💪 🚮 🌖 💽 🔁 🏗 🔗. 🖼, 👆 💪 💭 ✍ & ✔ 📨 ⏮️ 👆 👍 📟, 🍵 ⚙️ 🏧 ⚒ FastAPI ⏮️ Pydantic, ✋️ 👆 💪 💚 🔬 📨 🗄 🔗. 👆 💪 👈 ⏮️ `openapi_extra`: ```Python hl_lines="20-37 39-40" {!../../../docs_src/path_operation_advanced_configuration/tutorial006.py!} ``` 👉 🖼, 👥 🚫 📣 🙆 Pydantic 🏷. 👐, 📨 💪 🚫 🎻 🎻, ⚫️ ✍ 🔗 `bytes`, & 🔢 `magic_data_reader()` 🔜 🈚 🎻 ⚫️ 🌌. 👐, 👥 💪 📣 📈 🔗 📨 💪. ### 🛃 🗄 🎚 🆎 ⚙️ 👉 🎏 🎱, 👆 💪 ⚙️ Pydantic 🏷 🔬 🎻 🔗 👈 ⤴️ 🔌 🛃 🗄 🔗 📄 *➡ 🛠️*. & 👆 💪 👉 🚥 💽 🆎 📨 🚫 🎻. 🖼, 👉 🈸 👥 🚫 ⚙️ FastAPI 🛠️ 🛠️ ⚗ 🎻 🔗 ⚪️➡️ Pydantic 🏷 🚫 🏧 🔬 🎻. 👐, 👥 📣 📨 🎚 🆎 📁, 🚫 🎻: ```Python hl_lines="17-22 24" {!../../../docs_src/path_operation_advanced_configuration/tutorial007.py!} ``` 👐, 👐 👥 🚫 ⚙️ 🔢 🛠️ 🛠️, 👥 ⚙️ Pydantic 🏷 ❎ 🏗 🎻 🔗 💽 👈 👥 💚 📨 📁. ⤴️ 👥 ⚙️ 📨 🔗, & ⚗ 💪 `bytes`. 👉 ⛓ 👈 FastAPI 🏆 🚫 🔄 🎻 📨 🚀 🎻. & ⤴️ 👆 📟, 👥 🎻 👈 📁 🎚 🔗, & ⤴️ 👥 🔄 ⚙️ 🎏 Pydantic 🏷 ✔ 📁 🎚: ```Python hl_lines="26-33" {!../../../docs_src/path_operation_advanced_configuration/tutorial007.py!} ``` !!! tip 📥 👥 🏤-⚙️ 🎏 Pydantic 🏷. ✋️ 🎏 🌌, 👥 💪 ✔️ ✔ ⚫️ 🎏 🌌. fastapi-0.110.3/docs/em/docs/advanced/response-change-status-code.md000066400000000000000000000023541461403617600252010ustar00rootroot00000000000000# 📨 - 🔀 👔 📟 👆 🎲 ✍ ⏭ 👈 👆 💪 ⚒ 🔢 [📨 👔 📟](../tutorial/response-status-code.md){.internal-link target=_blank}. ✋️ 💼 👆 💪 📨 🎏 👔 📟 🌘 🔢. ## ⚙️ 💼 🖼, 🌈 👈 👆 💚 📨 🇺🇸🔍 👔 📟 "👌" `200` 🔢. ✋️ 🚥 💽 🚫 🔀, 👆 💚 ✍ ⚫️, & 📨 🇺🇸🔍 👔 📟 "✍" `201`. ✋️ 👆 💚 💪 ⛽ & 🗜 💽 👆 📨 ⏮️ `response_model`. 📚 💼, 👆 💪 ⚙️ `Response` 🔢. ## ⚙️ `Response` 🔢 👆 💪 📣 🔢 🆎 `Response` 👆 *➡ 🛠️ 🔢* (👆 💪 🍪 & 🎚). & ⤴️ 👆 💪 ⚒ `status_code` 👈 *🔀* 📨 🎚. ```Python hl_lines="1 9 12" {!../../../docs_src/response_change_status_code/tutorial001.py!} ``` & ⤴️ 👆 💪 📨 🙆 🎚 👆 💪, 👆 🛎 🔜 ( `dict`, 💽 🏷, ♒️). & 🚥 👆 📣 `response_model`, ⚫️ 🔜 ⚙️ ⛽ & 🗜 🎚 👆 📨. **FastAPI** 🔜 ⚙️ 👈 *🔀* 📨 ⚗ 👔 📟 (🍪 & 🎚), & 🔜 🚮 👫 🏁 📨 👈 🔌 💲 👆 📨, ⛽ 🙆 `response_model`. 👆 💪 📣 `Response` 🔢 🔗, & ⚒ 👔 📟 👫. ✋️ ✔️ 🤯 👈 🏁 1️⃣ ⚒ 🔜 🏆. fastapi-0.110.3/docs/em/docs/advanced/response-cookies.md000066400000000000000000000034721461403617600231610ustar00rootroot00000000000000# 📨 🍪 ## ⚙️ `Response` 🔢 👆 💪 📣 🔢 🆎 `Response` 👆 *➡ 🛠️ 🔢*. & ⤴️ 👆 💪 ⚒ 🍪 👈 *🔀* 📨 🎚. ```Python hl_lines="1 8-9" {!../../../docs_src/response_cookies/tutorial002.py!} ``` & ⤴️ 👆 💪 📨 🙆 🎚 👆 💪, 👆 🛎 🔜 ( `dict`, 💽 🏷, ♒️). & 🚥 👆 📣 `response_model`, ⚫️ 🔜 ⚙️ ⛽ & 🗜 🎚 👆 📨. **FastAPI** 🔜 ⚙️ 👈 *🔀* 📨 ⚗ 🍪 (🎚 & 👔 📟), & 🔜 🚮 👫 🏁 📨 👈 🔌 💲 👆 📨, ⛽ 🙆 `response_model`. 👆 💪 📣 `Response` 🔢 🔗, & ⚒ 🍪 (& 🎚) 👫. ## 📨 `Response` 🔗 👆 💪 ✍ 🍪 🕐❔ 🛬 `Response` 🔗 👆 📟. 👈, 👆 💪 ✍ 📨 🔬 [📨 📨 🔗](response-directly.md){.internal-link target=_blank}. ⤴️ ⚒ 🍪 ⚫️, & ⤴️ 📨 ⚫️: ```Python hl_lines="10-12" {!../../../docs_src/response_cookies/tutorial001.py!} ``` !!! tip ✔️ 🤯 👈 🚥 👆 📨 📨 🔗 ↩️ ⚙️ `Response` 🔢, FastAPI 🔜 📨 ⚫️ 🔗. , 👆 🔜 ✔️ ⚒ 💭 👆 💽 ☑ 🆎. 🤶 Ⓜ. ⚫️ 🔗 ⏮️ 🎻, 🚥 👆 🛬 `JSONResponse`. & 👈 👆 🚫 📨 🙆 📊 👈 🔜 ✔️ ⛽ `response_model`. ### 🌅 ℹ !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.responses import Response` ⚖️ `from starlette.responses import JSONResponse`. **FastAPI** 🚚 🎏 `starlette.responses` `fastapi.responses` 🏪 👆, 👩‍💻. ✋️ 🌅 💪 📨 👟 🔗 ⚪️➡️ 💃. & `Response` 💪 ⚙️ 🛎 ⚒ 🎚 & 🍪, **FastAPI** 🚚 ⚫️ `fastapi.Response`. 👀 🌐 💪 🔢 & 🎛, ✅ 🧾 💃. fastapi-0.110.3/docs/em/docs/advanced/response-directly.md000066400000000000000000000051001461403617600233320ustar00rootroot00000000000000# 📨 📨 🔗 🕐❔ 👆 ✍ **FastAPI** *➡ 🛠️* 👆 💪 🛎 📨 🙆 📊 ⚪️➡️ ⚫️: `dict`, `list`, Pydantic 🏷, 💽 🏷, ♒️. 🔢, **FastAPI** 🔜 🔁 🗜 👈 📨 💲 🎻 ⚙️ `jsonable_encoder` 🔬 [🎻 🔗 🔢](../tutorial/encoder.md){.internal-link target=_blank}. ⤴️, ⛅ 🎑, ⚫️ 🔜 🚮 👈 🎻-🔗 💽 (✅ `dict`) 🔘 `JSONResponse` 👈 🔜 ⚙️ 📨 📨 👩‍💻. ✋️ 👆 💪 📨 `JSONResponse` 🔗 ⚪️➡️ 👆 *➡ 🛠️*. ⚫️ 💪 ⚠, 🖼, 📨 🛃 🎚 ⚖️ 🍪. ## 📨 `Response` 👐, 👆 💪 📨 🙆 `Response` ⚖️ 🙆 🎧-🎓 ⚫️. !!! tip `JSONResponse` ⚫️ 🎧-🎓 `Response`. & 🕐❔ 👆 📨 `Response`, **FastAPI** 🔜 🚶‍♀️ ⚫️ 🔗. ⚫️ 🏆 🚫 🙆 💽 🛠️ ⏮️ Pydantic 🏷, ⚫️ 🏆 🚫 🗜 🎚 🙆 🆎, ♒️. 👉 🤝 👆 📚 💪. 👆 💪 📨 🙆 📊 🆎, 🔐 🙆 💽 📄 ⚖️ 🔬, ♒️. ## ⚙️ `jsonable_encoder` `Response` ↩️ **FastAPI** 🚫 🙆 🔀 `Response` 👆 📨, 👆 ✔️ ⚒ 💭 ⚫️ 🎚 🔜 ⚫️. 🖼, 👆 🚫🔜 🚮 Pydantic 🏷 `JSONResponse` 🍵 🥇 🏭 ⚫️ `dict` ⏮️ 🌐 📊 🆎 (💖 `datetime`, `UUID`, ♒️) 🗜 🎻-🔗 🆎. 📚 💼, 👆 💪 ⚙️ `jsonable_encoder` 🗜 👆 📊 ⏭ 🚶‍♀️ ⚫️ 📨: ```Python hl_lines="6-7 21-22" {!../../../docs_src/response_directly/tutorial001.py!} ``` !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.responses import JSONResponse`. **FastAPI** 🚚 🎏 `starlette.responses` `fastapi.responses` 🏪 👆, 👩‍💻. ✋️ 🌅 💪 📨 👟 🔗 ⚪️➡️ 💃. ## 🛬 🛃 `Response` 🖼 🔛 🎦 🌐 🍕 👆 💪, ✋️ ⚫️ 🚫 📶 ⚠, 👆 💪 ✔️ 📨 `item` 🔗, & **FastAPI** 🔜 🚮 ⚫️ `JSONResponse` 👆, 🏭 ⚫️ `dict`, ♒️. 🌐 👈 🔢. 🔜, ➡️ 👀 ❔ 👆 💪 ⚙️ 👈 📨 🛃 📨. ➡️ 💬 👈 👆 💚 📨 📂 📨. 👆 💪 🚮 👆 📂 🎚 🎻, 🚮 ⚫️ `Response`, & 📨 ⚫️: ```Python hl_lines="1 18" {!../../../docs_src/response_directly/tutorial002.py!} ``` ## 🗒 🕐❔ 👆 📨 `Response` 🔗 🚮 📊 🚫 ✔, 🗜 (🎻), 🚫 📄 🔁. ✋️ 👆 💪 📄 ⚫️ 🔬 [🌖 📨 🗄](additional-responses.md){.internal-link target=_blank}. 👆 💪 👀 ⏪ 📄 ❔ ⚙️/📣 👉 🛃 `Response`Ⓜ ⏪ ✔️ 🏧 💽 🛠️, 🧾, ♒️. fastapi-0.110.3/docs/em/docs/advanced/response-headers.md000066400000000000000000000035531461403617600231400ustar00rootroot00000000000000# 📨 🎚 ## ⚙️ `Response` 🔢 👆 💪 📣 🔢 🆎 `Response` 👆 *➡ 🛠️ 🔢* (👆 💪 🍪). & ⤴️ 👆 💪 ⚒ 🎚 👈 *🔀* 📨 🎚. ```Python hl_lines="1 7-8" {!../../../docs_src/response_headers/tutorial002.py!} ``` & ⤴️ 👆 💪 📨 🙆 🎚 👆 💪, 👆 🛎 🔜 ( `dict`, 💽 🏷, ♒️). & 🚥 👆 📣 `response_model`, ⚫️ 🔜 ⚙️ ⛽ & 🗜 🎚 👆 📨. **FastAPI** 🔜 ⚙️ 👈 *🔀* 📨 ⚗ 🎚 (🍪 & 👔 📟), & 🔜 🚮 👫 🏁 📨 👈 🔌 💲 👆 📨, ⛽ 🙆 `response_model`. 👆 💪 📣 `Response` 🔢 🔗, & ⚒ 🎚 (& 🍪) 👫. ## 📨 `Response` 🔗 👆 💪 🚮 🎚 🕐❔ 👆 📨 `Response` 🔗. ✍ 📨 🔬 [📨 📨 🔗](response-directly.md){.internal-link target=_blank} & 🚶‍♀️ 🎚 🌖 🔢: ```Python hl_lines="10-12" {!../../../docs_src/response_headers/tutorial001.py!} ``` !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.responses import Response` ⚖️ `from starlette.responses import JSONResponse`. **FastAPI** 🚚 🎏 `starlette.responses` `fastapi.responses` 🏪 👆, 👩‍💻. ✋️ 🌅 💪 📨 👟 🔗 ⚪️➡️ 💃. & `Response` 💪 ⚙️ 🛎 ⚒ 🎚 & 🍪, **FastAPI** 🚚 ⚫️ `fastapi.Response`. ## 🛃 🎚 ✔️ 🤯 👈 🛃 © 🎚 💪 🚮 ⚙️ '✖-' 🔡. ✋️ 🚥 👆 ✔️ 🛃 🎚 👈 👆 💚 👩‍💻 🖥 💪 👀, 👆 💪 🚮 👫 👆 ⚜ 📳 (✍ 🌅 [⚜ (✖️-🇨🇳 ℹ 🤝)](../tutorial/cors.md){.internal-link target=_blank}), ⚙️ 🔢 `expose_headers` 📄 💃 ⚜ 🩺. fastapi-0.110.3/docs/em/docs/advanced/security/000077500000000000000000000000001461403617600212105ustar00rootroot00000000000000fastapi-0.110.3/docs/em/docs/advanced/security/http-basic-auth.md000066400000000000000000000101001461403617600245170ustar00rootroot00000000000000# 🇺🇸🔍 🔰 🔐 🙅 💼, 👆 💪 ⚙️ 🇺🇸🔍 🔰 🔐. 🇺🇸🔍 🔰 🔐, 🈸 ⌛ 🎚 👈 🔌 🆔 & 🔐. 🚥 ⚫️ 🚫 📨 ⚫️, ⚫️ 📨 🇺🇸🔍 4️⃣0️⃣1️⃣ "⛔" ❌. & 📨 🎚 `WWW-Authenticate` ⏮️ 💲 `Basic`, & 📦 `realm` 🔢. 👈 💬 🖥 🎦 🛠️ 📋 🆔 & 🔐. ⤴️, 🕐❔ 👆 🆎 👈 🆔 & 🔐, 🖥 📨 👫 🎚 🔁. ## 🙅 🇺🇸🔍 🔰 🔐 * 🗄 `HTTPBasic` & `HTTPBasicCredentials`. * ✍ "`security` ⚖" ⚙️ `HTTPBasic`. * ⚙️ 👈 `security` ⏮️ 🔗 👆 *➡ 🛠️*. * ⚫️ 📨 🎚 🆎 `HTTPBasicCredentials`: * ⚫️ 🔌 `username` & `password` 📨. ```Python hl_lines="2 6 10" {!../../../docs_src/security/tutorial006.py!} ``` 🕐❔ 👆 🔄 📂 📛 🥇 🕰 (⚖️ 🖊 "🛠️" 🔼 🩺) 🖥 🔜 💭 👆 👆 🆔 & 🔐: ## ✅ 🆔 📥 🌅 🏁 🖼. ⚙️ 🔗 ✅ 🚥 🆔 & 🔐 ☑. 👉, ⚙️ 🐍 🐩 🕹 `secrets` ✅ 🆔 & 🔐. `secrets.compare_digest()` 💪 ✊ `bytes` ⚖️ `str` 👈 🕴 🔌 🔠 🦹 (🕐 🇪🇸), 👉 ⛓ ⚫️ 🚫🔜 👷 ⏮️ 🦹 💖 `á`, `Sebastián`. 🍵 👈, 👥 🥇 🗜 `username` & `password` `bytes` 🔢 👫 ⏮️ 🔠-8️⃣. ⤴️ 👥 💪 ⚙️ `secrets.compare_digest()` 🚚 👈 `credentials.username` `"stanleyjobson"`, & 👈 `credentials.password` `"swordfish"`. ```Python hl_lines="1 11-21" {!../../../docs_src/security/tutorial007.py!} ``` 👉 🔜 🎏: ```Python if not (credentials.username == "stanleyjobson") or not (credentials.password == "swordfish"): # Return some error ... ``` ✋️ ⚙️ `secrets.compare_digest()` ⚫️ 🔜 🔐 🛡 🆎 👊 🤙 "🕰 👊". ### ⏲ 👊 ✋️ ⚫️❔ "⏲ 👊"❓ ➡️ 🌈 👊 🔄 💭 🆔 & 🔐. & 👫 📨 📨 ⏮️ 🆔 `johndoe` & 🔐 `love123`. ⤴️ 🐍 📟 👆 🈸 🔜 🌓 🕳 💖: ```Python if "johndoe" == "stanleyjobson" and "love123" == "swordfish": ... ``` ✋️ ▶️️ 🙍 🐍 🔬 🥇 `j` `johndoe` 🥇 `s` `stanleyjobson`, ⚫️ 🔜 📨 `False`, ↩️ ⚫️ ⏪ 💭 👈 📚 2️⃣ 🎻 🚫 🎏, 💭 👈 "📤 🙅‍♂ 💪 🗑 🌅 📊 ⚖ 🎂 🔤". & 👆 🈸 🔜 💬 "❌ 👩‍💻 ⚖️ 🔐". ✋️ ⤴️ 👊 🔄 ⏮️ 🆔 `stanleyjobsox` & 🔐 `love123`. & 👆 🈸 📟 🔨 🕳 💖: ```Python if "stanleyjobsox" == "stanleyjobson" and "love123" == "swordfish": ... ``` 🐍 🔜 ✔️ 🔬 🎂 `stanleyjobso` 👯‍♂️ `stanleyjobsox` & `stanleyjobson` ⏭ 🤔 👈 👯‍♂️ 🎻 🚫 🎏. ⚫️ 🔜 ✊ ➕ ⏲ 📨 🔙 "❌ 👩‍💻 ⚖️ 🔐". #### 🕰 ❔ ℹ 👊 👈 ☝, 👀 👈 💽 ✊ ⏲ 📏 📨 "❌ 👩‍💻 ⚖️ 🔐" 📨, 👊 🔜 💭 👈 👫 🤚 _🕳_ ▶️️, ▶️ 🔤 ▶️️. & ⤴️ 👫 💪 🔄 🔄 🤔 👈 ⚫️ 🎲 🕳 🌖 🎏 `stanleyjobsox` 🌘 `johndoe`. #### "🕴" 👊 ↗️, 👊 🔜 🚫 🔄 🌐 👉 ✋, 👫 🔜 ✍ 📋 ⚫️, 🎲 ⏮️ 💯 ⚖️ 💯 💯 📍 🥈. & 🔜 🤚 1️⃣ ➕ ☑ 🔤 🕰. ✋️ 🔨 👈, ⏲ ⚖️ 📆 👊 🔜 ✔️ 💭 ☑ 🆔 & 🔐, ⏮️ "ℹ" 👆 🈸, ⚙️ 🕰 ✊ ❔. #### 🔧 ⚫️ ⏮️ `secrets.compare_digest()` ✋️ 👆 📟 👥 🤙 ⚙️ `secrets.compare_digest()`. 📏, ⚫️ 🔜 ✊ 🎏 🕰 🔬 `stanleyjobsox` `stanleyjobson` 🌘 ⚫️ ✊ 🔬 `johndoe` `stanleyjobson`. & 🎏 🔐. 👈 🌌, ⚙️ `secrets.compare_digest()` 👆 🈸 📟, ⚫️ 🔜 🔒 🛡 👉 🎂 ↔ 💂‍♂ 👊. ### 📨 ❌ ⏮️ 🔍 👈 🎓 ❌, 📨 `HTTPException` ⏮️ 👔 📟 4️⃣0️⃣1️⃣ (🎏 📨 🕐❔ 🙅‍♂ 🎓 🚚) & 🚮 🎚 `WWW-Authenticate` ⚒ 🖥 🎦 💳 📋 🔄: ```Python hl_lines="23-27" {!../../../docs_src/security/tutorial007.py!} ``` fastapi-0.110.3/docs/em/docs/advanced/security/index.md000066400000000000000000000010031461403617600226330ustar00rootroot00000000000000# 🏧 💂‍♂ ## 🌖 ⚒ 📤 ➕ ⚒ 🍵 💂‍♂ ↖️ ⚪️➡️ 🕐 📔 [🔰 - 👩‍💻 🦮: 💂‍♂](../../tutorial/security/index.md){.internal-link target=_blank}. !!! tip ⏭ 📄 **🚫 🎯 "🏧"**. & ⚫️ 💪 👈 👆 ⚙️ 💼, ⚗ 1️⃣ 👫. ## ✍ 🔰 🥇 ⏭ 📄 🤔 👆 ⏪ ✍ 👑 [🔰 - 👩‍💻 🦮: 💂‍♂](../../tutorial/security/index.md){.internal-link target=_blank}. 👫 🌐 ⚓️ 🔛 🎏 🔧, ✋️ ✔ ➕ 🛠️. fastapi-0.110.3/docs/em/docs/advanced/security/oauth2-scopes.md000066400000000000000000000260751461403617600242400ustar00rootroot00000000000000# Oauth2️⃣ ↔ 👆 💪 ⚙️ Oauth2️⃣ ↔ 🔗 ⏮️ **FastAPI**, 👫 🛠️ 👷 💎. 👉 🔜 ✔ 👆 ✔️ 🌖 👌-🧽 ✔ ⚙️, 📄 Oauth2️⃣ 🐩, 🛠️ 🔘 👆 🗄 🈸 (& 🛠️ 🩺). Oauth2️⃣ ⏮️ ↔ 🛠️ ⚙️ 📚 🦏 🤝 🐕‍🦺, 💖 👱📔, 🇺🇸🔍, 📂, 🤸‍♂, 👱📔, ♒️. 👫 ⚙️ ⚫️ 🚚 🎯 ✔ 👩‍💻 & 🈸. 🔠 🕰 👆 "🕹 ⏮️" 👱📔, 🇺🇸🔍, 📂, 🤸‍♂, 👱📔, 👈 🈸 ⚙️ Oauth2️⃣ ⏮️ ↔. 👉 📄 👆 🔜 👀 ❔ 🛠️ 🤝 & ✔ ⏮️ 🎏 Oauth2️⃣ ⏮️ ↔ 👆 **FastAPI** 🈸. !!! warning 👉 🌅 ⚖️ 🌘 🏧 📄. 🚥 👆 ▶️, 👆 💪 🚶 ⚫️. 👆 🚫 🎯 💪 Oauth2️⃣ ↔, & 👆 💪 🍵 🤝 & ✔ 👐 👆 💚. ✋️ Oauth2️⃣ ⏮️ ↔ 💪 🎆 🛠️ 🔘 👆 🛠️ (⏮️ 🗄) & 👆 🛠️ 🩺. 👐, 👆 🛠️ 📚 ↔, ⚖️ 🙆 🎏 💂‍♂/✔ 📄, 👐 👆 💪, 👆 📟. 📚 💼, Oauth2️⃣ ⏮️ ↔ 💪 👹. ✋️ 🚥 👆 💭 👆 💪 ⚫️, ⚖️ 👆 😟, 🚧 👂. ## Oauth2️⃣ ↔ & 🗄 Oauth2️⃣ 🔧 🔬 "↔" 📇 🎻 🎏 🚀. 🎚 🔠 👉 🎻 💪 ✔️ 🙆 📁, ✋️ 🔜 🚫 🔌 🚀. 👫 ↔ 🎨 "✔". 🗄 (✅ 🛠️ 🩺), 👆 💪 🔬 "💂‍♂ ⚖". 🕐❔ 1️⃣ 👫 💂‍♂ ⚖ ⚙️ Oauth2️⃣, 👆 💪 📣 & ⚙️ ↔. 🔠 "↔" 🎻 (🍵 🚀). 👫 🛎 ⚙️ 📣 🎯 💂‍♂ ✔, 🖼: * `users:read` ⚖️ `users:write` ⚠ 🖼. * `instagram_basic` ⚙️ 👱📔 / 👱📔. * `https://www.googleapis.com/auth/drive` ⚙️ 🇺🇸🔍. !!! info Oauth2️⃣ "↔" 🎻 👈 📣 🎯 ✔ ✔. ⚫️ 🚫 🤔 🚥 ⚫️ ✔️ 🎏 🦹 💖 `:` ⚖️ 🚥 ⚫️ 📛. 👈 ℹ 🛠️ 🎯. Oauth2️⃣ 👫 🎻. ## 🌐 🎑 🥇, ➡️ 🔜 👀 🍕 👈 🔀 ⚪️➡️ 🖼 👑 **🔰 - 👩‍💻 🦮** [Oauth2️⃣ ⏮️ 🔐 (& 🔁), 📨 ⏮️ 🥙 🤝](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. 🔜 ⚙️ Oauth2️⃣ ↔: ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155" {!../../../docs_src/security/tutorial005.py!} ``` 🔜 ➡️ 📄 👈 🔀 🔁 🔁. ## Oauth2️⃣ 💂‍♂ ⚖ 🥇 🔀 👈 🔜 👥 📣 Oauth2️⃣ 💂‍♂ ⚖ ⏮️ 2️⃣ 💪 ↔, `me` & `items`. `scopes` 🔢 📨 `dict` ⏮️ 🔠 ↔ 🔑 & 📛 💲: ```Python hl_lines="62-65" {!../../../docs_src/security/tutorial005.py!} ``` ↩️ 👥 🔜 📣 📚 ↔, 👫 🔜 🎦 🆙 🛠️ 🩺 🕐❔ 👆 🕹-/✔. & 👆 🔜 💪 🖊 ❔ ↔ 👆 💚 🤝 🔐: `me` & `items`. 👉 🎏 🛠️ ⚙️ 🕐❔ 👆 🤝 ✔ ⏪ 🚨 ⏮️ 👱📔, 🇺🇸🔍, 📂, ♒️: ## 🥙 🤝 ⏮️ ↔ 🔜, 🔀 🤝 *➡ 🛠️* 📨 ↔ 📨. 👥 ⚙️ 🎏 `OAuth2PasswordRequestForm`. ⚫️ 🔌 🏠 `scopes` ⏮️ `list` `str`, ⏮️ 🔠 ↔ ⚫️ 📨 📨. & 👥 📨 ↔ 🍕 🥙 🤝. !!! danger 🦁, 📥 👥 ❎ ↔ 📨 🔗 🤝. ✋️ 👆 🈸, 💂‍♂, 👆 🔜 ⚒ 💭 👆 🕴 🚮 ↔ 👈 👩‍💻 🤙 💪 ✔️, ⚖️ 🕐 👆 ✔️ 🔁. ```Python hl_lines="155" {!../../../docs_src/security/tutorial005.py!} ``` ## 📣 ↔ *➡ 🛠️* & 🔗 🔜 👥 📣 👈 *➡ 🛠️* `/users/me/items/` 🚚 ↔ `items`. 👉, 👥 🗄 & ⚙️ `Security` ⚪️➡️ `fastapi`. 👆 💪 ⚙️ `Security` 📣 🔗 (💖 `Depends`), ✋️ `Security` 📨 🔢 `scopes` ⏮️ 📇 ↔ (🎻). 👉 💼, 👥 🚶‍♀️ 🔗 🔢 `get_current_active_user` `Security` (🎏 🌌 👥 🔜 ⏮️ `Depends`). ✋️ 👥 🚶‍♀️ `list` ↔, 👉 💼 ⏮️ 1️⃣ ↔: `items` (⚫️ 💪 ✔️ 🌅). & 🔗 🔢 `get_current_active_user` 💪 📣 🎧-🔗, 🚫 🕴 ⏮️ `Depends` ✋️ ⏮️ `Security`. 📣 🚮 👍 🎧-🔗 🔢 (`get_current_user`), & 🌖 ↔ 📄. 👉 💼, ⚫️ 🚚 ↔ `me` (⚫️ 💪 🚚 🌅 🌘 1️⃣ ↔). !!! note 👆 🚫 🎯 💪 🚮 🎏 ↔ 🎏 🥉. 👥 🔨 ⚫️ 📥 🎦 ❔ **FastAPI** 🍵 ↔ 📣 🎏 🎚. ```Python hl_lines="4 139 168" {!../../../docs_src/security/tutorial005.py!} ``` !!! info "📡 ℹ" `Security` 🤙 🏿 `Depends`, & ⚫️ ✔️ 1️⃣ ➕ 🔢 👈 👥 🔜 👀 ⏪. ✋️ ⚙️ `Security` ↩️ `Depends`, **FastAPI** 🔜 💭 👈 ⚫️ 💪 📣 💂‍♂ ↔, ⚙️ 👫 🔘, & 📄 🛠️ ⏮️ 🗄. ✋️ 🕐❔ 👆 🗄 `Query`, `Path`, `Depends`, `Security` & 🎏 ⚪️➡️ `fastapi`, 👈 🤙 🔢 👈 📨 🎁 🎓. ## ⚙️ `SecurityScopes` 🔜 ℹ 🔗 `get_current_user`. 👉 1️⃣ ⚙️ 🔗 🔛. 📥 👥 ⚙️ 🎏 Oauth2️⃣ ⚖ 👥 ✍ ⏭, 📣 ⚫️ 🔗: `oauth2_scheme`. ↩️ 👉 🔗 🔢 🚫 ✔️ 🙆 ↔ 📄 ⚫️, 👥 💪 ⚙️ `Depends` ⏮️ `oauth2_scheme`, 👥 🚫 ✔️ ⚙️ `Security` 🕐❔ 👥 🚫 💪 ✔ 💂‍♂ ↔. 👥 📣 🎁 🔢 🆎 `SecurityScopes`, 🗄 ⚪️➡️ `fastapi.security`. 👉 `SecurityScopes` 🎓 🎏 `Request` (`Request` ⚙️ 🤚 📨 🎚 🔗). ```Python hl_lines="8 105" {!../../../docs_src/security/tutorial005.py!} ``` ## ⚙️ `scopes` 🔢 `security_scopes` 🔜 🆎 `SecurityScopes`. ⚫️ 🔜 ✔️ 🏠 `scopes` ⏮️ 📇 ⚗ 🌐 ↔ ✔ ⚫️ & 🌐 🔗 👈 ⚙️ 👉 🎧-🔗. 👈 ⛓, 🌐 "⚓️"... 👉 💪 🔊 😨, ⚫️ 🔬 🔄 ⏪ 🔛. `security_scopes` 🎚 (🎓 `SecurityScopes`) 🚚 `scope_str` 🔢 ⏮️ 👁 🎻, 🔌 👈 ↔ 👽 🚀 (👥 🔜 ⚙️ ⚫️). 👥 ✍ `HTTPException` 👈 👥 💪 🏤-⚙️ (`raise`) ⏪ 📚 ☝. 👉 ⚠, 👥 🔌 ↔ 🚚 (🚥 🙆) 🎻 👽 🚀 (⚙️ `scope_str`). 👥 🚮 👈 🎻 ⚗ ↔ `WWW-Authenticate` 🎚 (👉 🍕 🔌). ```Python hl_lines="105 107-115" {!../../../docs_src/security/tutorial005.py!} ``` ## ✔ `username` & 💽 💠 👥 ✔ 👈 👥 🤚 `username`, & ⚗ ↔. & ⤴️ 👥 ✔ 👈 📊 ⏮️ Pydantic 🏷 (✊ `ValidationError` ⚠), & 🚥 👥 🤚 ❌ 👂 🥙 🤝 ⚖️ ⚖ 📊 ⏮️ Pydantic, 👥 🤚 `HTTPException` 👥 ✍ ⏭. 👈, 👥 ℹ Pydantic 🏷 `TokenData` ⏮️ 🆕 🏠 `scopes`. ⚖ 📊 ⏮️ Pydantic 👥 💪 ⚒ 💭 👈 👥 ✔️, 🖼, ⚫️❔ `list` `str` ⏮️ ↔ & `str` ⏮️ `username`. ↩️, 🖼, `dict`, ⚖️ 🕳 🙆, ⚫️ 💪 💔 🈸 ☝ ⏪, ⚒ ⚫️ 💂‍♂ ⚠. 👥 ✔ 👈 👥 ✔️ 👩‍💻 ⏮️ 👈 🆔, & 🚥 🚫, 👥 🤚 👈 🎏 ⚠ 👥 ✍ ⏭. ```Python hl_lines="46 116-127" {!../../../docs_src/security/tutorial005.py!} ``` ## ✔ `scopes` 👥 🔜 ✔ 👈 🌐 ↔ ✔, 👉 🔗 & 🌐 ⚓️ (🔌 *➡ 🛠️*), 🔌 ↔ 🚚 🤝 📨, ⏪ 🤚 `HTTPException`. 👉, 👥 ⚙️ `security_scopes.scopes`, 👈 🔌 `list` ⏮️ 🌐 👫 ↔ `str`. ```Python hl_lines="128-134" {!../../../docs_src/security/tutorial005.py!} ``` ## 🔗 🌲 & ↔ ➡️ 📄 🔄 👉 🔗 🌲 & ↔. `get_current_active_user` 🔗 ✔️ 🎧-🔗 🔛 `get_current_user`, ↔ `"me"` 📣 `get_current_active_user` 🔜 🔌 📇 ✔ ↔ `security_scopes.scopes` 🚶‍♀️ `get_current_user`. *➡ 🛠️* ⚫️ 📣 ↔, `"items"`, 👉 🔜 📇 `security_scopes.scopes` 🚶‍♀️ `get_current_user`. 📥 ❔ 🔗 🔗 & ↔ 👀 💖: * *➡ 🛠️* `read_own_items` ✔️: * ✔ ↔ `["items"]` ⏮️ 🔗: * `get_current_active_user`: * 🔗 🔢 `get_current_active_user` ✔️: * ✔ ↔ `["me"]` ⏮️ 🔗: * `get_current_user`: * 🔗 🔢 `get_current_user` ✔️: * 🙅‍♂ ↔ ✔ ⚫️. * 🔗 ⚙️ `oauth2_scheme`. * `security_scopes` 🔢 🆎 `SecurityScopes`: * 👉 `security_scopes` 🔢 ✔️ 🏠 `scopes` ⏮️ `list` ⚗ 🌐 👫 ↔ 📣 🔛,: * `security_scopes.scopes` 🔜 🔌 `["me", "items"]` *➡ 🛠️* `read_own_items`. * `security_scopes.scopes` 🔜 🔌 `["me"]` *➡ 🛠️* `read_users_me`, ↩️ ⚫️ 📣 🔗 `get_current_active_user`. * `security_scopes.scopes` 🔜 🔌 `[]` (🕳) *➡ 🛠️* `read_system_status`, ↩️ ⚫️ 🚫 📣 🙆 `Security` ⏮️ `scopes`, & 🚮 🔗, `get_current_user`, 🚫 📣 🙆 `scope` 👯‍♂️. !!! tip ⚠ & "🎱" 👜 📥 👈 `get_current_user` 🔜 ✔️ 🎏 📇 `scopes` ✅ 🔠 *➡ 🛠️*. 🌐 ⚓️ 🔛 `scopes` 📣 🔠 *➡ 🛠️* & 🔠 🔗 🔗 🌲 👈 🎯 *➡ 🛠️*. ## 🌖 ℹ 🔃 `SecurityScopes` 👆 💪 ⚙️ `SecurityScopes` 🙆 ☝, & 💗 🥉, ⚫️ 🚫 ✔️ "🌱" 🔗. ⚫️ 🔜 🕧 ✔️ 💂‍♂ ↔ 📣 ⏮️ `Security` 🔗 & 🌐 ⚓️ **👈 🎯** *➡ 🛠️* & **👈 🎯** 🔗 🌲. ↩️ `SecurityScopes` 🔜 ✔️ 🌐 ↔ 📣 ⚓️, 👆 💪 ⚙️ ⚫️ ✔ 👈 🤝 ✔️ 🚚 ↔ 🇨🇫 🔗 🔢, & ⤴️ 📣 🎏 ↔ 📄 🎏 *➡ 🛠️*. 👫 🔜 ✅ ➡ 🔠 *➡ 🛠️*. ## ✅ ⚫️ 🚥 👆 📂 🛠️ 🩺, 👆 💪 🔓 & ✔ ❔ ↔ 👆 💚 ✔. 🚥 👆 🚫 🖊 🙆 ↔, 👆 🔜 "🔓", ✋️ 🕐❔ 👆 🔄 🔐 `/users/me/` ⚖️ `/users/me/items/` 👆 🔜 🤚 ❌ 💬 👈 👆 🚫 ✔️ 🥃 ✔. 👆 🔜 💪 🔐 `/status/`. & 🚥 👆 🖊 ↔ `me` ✋️ 🚫 ↔ `items`, 👆 🔜 💪 🔐 `/users/me/` ✋️ 🚫 `/users/me/items/`. 👈 ⚫️❔ 🔜 🔨 🥉 🥳 🈸 👈 🔄 🔐 1️⃣ 👫 *➡ 🛠️* ⏮️ 🤝 🚚 👩‍💻, ⚓️ 🔛 ❔ 📚 ✔ 👩‍💻 🤝 🈸. ## 🔃 🥉 🥳 🛠️ 👉 🖼 👥 ⚙️ Oauth2️⃣ "🔐" 💧. 👉 ☑ 🕐❔ 👥 🚨 👆 👍 🈸, 🎲 ⏮️ 👆 👍 🕸. ↩️ 👥 💪 💙 ⚫️ 📨 `username` & `password`, 👥 🎛 ⚫️. ✋️ 🚥 👆 🏗 Oauth2️⃣ 🈸 👈 🎏 🔜 🔗 (➡, 🚥 👆 🏗 🤝 🐕‍🦺 🌓 👱📔, 🇺🇸🔍, 📂, ♒️.) 👆 🔜 ⚙️ 1️⃣ 🎏 💧. 🌅 ⚠ 🔑 💧. 🏆 🔐 📟 💧, ✋️ 🌖 🏗 🛠️ ⚫️ 🚚 🌅 📶. ⚫️ 🌅 🏗, 📚 🐕‍🦺 🔚 🆙 ✔ 🔑 💧. !!! note ⚫️ ⚠ 👈 🔠 🤝 🐕‍🦺 📛 👫 💧 🎏 🌌, ⚒ ⚫️ 🍕 👫 🏷. ✋️ 🔚, 👫 🛠️ 🎏 Oauth2️⃣ 🐩. **FastAPI** 🔌 🚙 🌐 👫 Oauth2️⃣ 🤝 💧 `fastapi.security.oauth2`. ## `Security` 👨‍🎨 `dependencies` 🎏 🌌 👆 💪 🔬 `list` `Depends` 👨‍🎨 `dependencies` 🔢 (🔬 [🔗 ➡ 🛠️ 👨‍🎨](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}), 👆 💪 ⚙️ `Security` ⏮️ `scopes` 📤. fastapi-0.110.3/docs/em/docs/advanced/settings.md000066400000000000000000000265631461403617600215370ustar00rootroot00000000000000# ⚒ & 🌐 🔢 📚 💼 👆 🈸 💪 💪 🔢 ⚒ ⚖️ 📳, 🖼 ㊙ 🔑, 💽 🎓, 🎓 📧 🐕‍🦺, ♒️. 🏆 👫 ⚒ 🔢 (💪 🔀), 💖 💽 📛. & 📚 💪 🚿, 💖 ㊙. 👉 🤔 ⚫️ ⚠ 🚚 👫 🌐 🔢 👈 ✍ 🈸. ## 🌐 🔢 !!! tip 🚥 👆 ⏪ 💭 ⚫️❔ "🌐 🔢" & ❔ ⚙️ 👫, 💭 🆓 🚶 ⏭ 📄 🔛. 🌐 🔢 (💭 "🇨🇻 {") 🔢 👈 🖖 🏞 🐍 📟, 🏃‍♂ ⚙️, & 💪 ✍ 👆 🐍 📟 (⚖️ 🎏 📋 👍). 👆 💪 ✍ & ⚙️ 🌐 🔢 🐚, 🍵 💆‍♂ 🐍: === "💾, 🇸🇻, 🚪 🎉"
```console // You could create an env var MY_NAME with $ export MY_NAME="Wade Wilson" // Then you could use it with other programs, like $ echo "Hello $MY_NAME" Hello Wade Wilson ```
=== "🚪 📋"
```console // Create an env var MY_NAME $ $Env:MY_NAME = "Wade Wilson" // Use it with other programs, like $ echo "Hello $Env:MY_NAME" Hello Wade Wilson ```
### ✍ 🇨🇻 {🐍 👆 💪 ✍ 🌐 🔢 🏞 🐍, 📶 (⚖️ ⏮️ 🙆 🎏 👩‍🔬), & ⤴️ ✍ 👫 🐍. 🖼 👆 💪 ✔️ 📁 `main.py` ⏮️: ```Python hl_lines="3" import os name = os.getenv("MY_NAME", "World") print(f"Hello {name} from Python") ``` !!! tip 🥈 ❌ `os.getenv()` 🔢 💲 📨. 🚥 🚫 🚚, ⚫️ `None` 🔢, 📥 👥 🚚 `"World"` 🔢 💲 ⚙️. ⤴️ 👆 💪 🤙 👈 🐍 📋:
```console // Here we don't set the env var yet $ python main.py // As we didn't set the env var, we get the default value Hello World from Python // But if we create an environment variable first $ export MY_NAME="Wade Wilson" // And then call the program again $ python main.py // Now it can read the environment variable Hello Wade Wilson from Python ```
🌐 🔢 💪 ⚒ 🏞 📟, ✋️ 💪 ✍ 📟, & 🚫 ✔️ 🏪 (💕 `git`) ⏮️ 🎂 📁, ⚫️ ⚠ ⚙️ 👫 📳 ⚖️ ⚒. 👆 💪 ✍ 🌐 🔢 🕴 🎯 📋 👼, 👈 🕴 💪 👈 📋, & 🕴 🚮 📐. 👈, ✍ ⚫️ ▶️️ ⏭ 📋 ⚫️, 🔛 🎏 ⏸:
```console // Create an env var MY_NAME in line for this program call $ MY_NAME="Wade Wilson" python main.py // Now it can read the environment variable Hello Wade Wilson from Python // The env var no longer exists afterwards $ python main.py Hello World from Python ```
!!! tip 👆 💪 ✍ 🌅 🔃 ⚫️ 1️⃣2️⃣-⚖ 📱: 📁. ### 🆎 & 🔬 👫 🌐 🔢 💪 🕴 🍵 ✍ 🎻, 👫 🔢 🐍 & ✔️ 🔗 ⏮️ 🎏 📋 & 🎂 ⚙️ (& ⏮️ 🎏 🏃‍♂ ⚙️, 💾, 🚪, 🇸🇻). 👈 ⛓ 👈 🙆 💲 ✍ 🐍 ⚪️➡️ 🌐 🔢 🔜 `str`, & 🙆 🛠️ 🎏 🆎 ⚖️ 🔬 ✔️ 🔨 📟. ## Pydantic `Settings` 👐, Pydantic 🚚 👑 🚙 🍵 👫 ⚒ 👟 ⚪️➡️ 🌐 🔢 ⏮️ Pydantic: ⚒ 🧾. ### ✍ `Settings` 🎚 🗄 `BaseSettings` ⚪️➡️ Pydantic & ✍ 🎧-🎓, 📶 🌅 💖 ⏮️ Pydantic 🏷. 🎏 🌌 ⏮️ Pydantic 🏷, 👆 📣 🎓 🔢 ⏮️ 🆎 ✍, & 🎲 🔢 💲. 👆 💪 ⚙️ 🌐 🎏 🔬 ⚒ & 🧰 👆 ⚙️ Pydantic 🏷, 💖 🎏 📊 🆎 & 🌖 🔬 ⏮️ `Field()`. ```Python hl_lines="2 5-8 11" {!../../../docs_src/settings/tutorial001.py!} ``` !!! tip 🚥 👆 💚 🕳 ⏩ 📁 & 📋, 🚫 ⚙️ 👉 🖼, ⚙️ 🏁 1️⃣ 🔛. ⤴️, 🕐❔ 👆 ✍ 👐 👈 `Settings` 🎓 (👉 💼, `settings` 🎚), Pydantic 🔜 ✍ 🌐 🔢 💼-😛 🌌,, ↖-💼 🔢 `APP_NAME` 🔜 ✍ 🔢 `app_name`. ⏭ ⚫️ 🔜 🗜 & ✔ 💽. , 🕐❔ 👆 ⚙️ 👈 `settings` 🎚, 👆 🔜 ✔️ 📊 🆎 👆 📣 (✅ `items_per_user` 🔜 `int`). ### ⚙️ `settings` ⤴️ 👆 💪 ⚙️ 🆕 `settings` 🎚 👆 🈸: ```Python hl_lines="18-20" {!../../../docs_src/settings/tutorial001.py!} ``` ### 🏃 💽 ⏭, 👆 🔜 🏃 💽 🚶‍♀️ 📳 🌐 🔢, 🖼 👆 💪 ⚒ `ADMIN_EMAIL` & `APP_NAME` ⏮️:
```console $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" uvicorn main:app INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
!!! tip ⚒ 💗 🇨🇻 {👁 📋 🎏 👫 ⏮️ 🚀, & 🚮 👫 🌐 ⏭ 📋. & ⤴️ `admin_email` ⚒ 🔜 ⚒ `"deadpool@example.com"`. `app_name` 🔜 `"ChimichangApp"`. & `items_per_user` 🔜 🚧 🚮 🔢 💲 `50`. ## ⚒ ➕1️⃣ 🕹 👆 💪 🚮 👈 ⚒ ➕1️⃣ 🕹 📁 👆 👀 [🦏 🈸 - 💗 📁](../tutorial/bigger-applications.md){.internal-link target=_blank}. 🖼, 👆 💪 ✔️ 📁 `config.py` ⏮️: ```Python {!../../../docs_src/settings/app01/config.py!} ``` & ⤴️ ⚙️ ⚫️ 📁 `main.py`: ```Python hl_lines="3 11-13" {!../../../docs_src/settings/app01/main.py!} ``` !!! tip 👆 🔜 💪 📁 `__init__.py` 👆 👀 🔛 [🦏 🈸 - 💗 📁](../tutorial/bigger-applications.md){.internal-link target=_blank}. ## ⚒ 🔗 🍾 ⚫️ 5️⃣📆 ⚠ 🚚 ⚒ ⚪️➡️ 🔗, ↩️ ✔️ 🌐 🎚 ⏮️ `settings` 👈 ⚙️ 🌐. 👉 💪 ✴️ ⚠ ⏮️ 🔬, ⚫️ 📶 ⏩ 🔐 🔗 ⏮️ 👆 👍 🛃 ⚒. ### 📁 📁 👟 ⚪️➡️ ⏮️ 🖼, 👆 `config.py` 📁 💪 👀 💖: ```Python hl_lines="10" {!../../../docs_src/settings/app02/config.py!} ``` 👀 👈 🔜 👥 🚫 ✍ 🔢 👐 `settings = Settings()`. ### 👑 📱 📁 🔜 👥 ✍ 🔗 👈 📨 🆕 `config.Settings()`. ```Python hl_lines="5 11-12" {!../../../docs_src/settings/app02/main.py!} ``` !!! tip 👥 🔜 🔬 `@lru_cache` 🍖. 🔜 👆 💪 🤔 `get_settings()` 😐 🔢. & ⤴️ 👥 💪 🚚 ⚫️ ⚪️➡️ *➡ 🛠️ 🔢* 🔗 & ⚙️ ⚫️ 🙆 👥 💪 ⚫️. ```Python hl_lines="16 18-20" {!../../../docs_src/settings/app02/main.py!} ``` ### ⚒ & 🔬 ⤴️ ⚫️ 🔜 📶 ⏩ 🚚 🎏 ⚒ 🎚 ⏮️ 🔬 🏗 🔗 🔐 `get_settings`: ```Python hl_lines="9-10 13 21" {!../../../docs_src/settings/app02/test_main.py!} ``` 🔗 🔐 👥 ⚒ 🆕 💲 `admin_email` 🕐❔ 🏗 🆕 `Settings` 🎚, & ⤴️ 👥 📨 👈 🆕 🎚. ⤴️ 👥 💪 💯 👈 ⚫️ ⚙️. ## 👂 `.env` 📁 🚥 👆 ✔️ 📚 ⚒ 👈 🎲 🔀 📚, 🎲 🎏 🌐, ⚫️ 5️⃣📆 ⚠ 🚮 👫 🔛 📁 & ⤴️ ✍ 👫 ⚪️➡️ ⚫️ 🚥 👫 🌐 🔢. 👉 💡 ⚠ 🥃 👈 ⚫️ ✔️ 📛, 👫 🌐 🔢 🛎 🥉 📁 `.env`, & 📁 🤙 "🇨🇻". !!! tip 📁 ▶️ ⏮️ ❣ (`.`) 🕵‍♂ 📁 🖥-💖 ⚙️, 💖 💾 & 🇸🇻. ✋️ 🇨🇻 📁 🚫 🤙 ✔️ ✔️ 👈 ☑ 📁. Pydantic ✔️ 🐕‍🦺 👂 ⚪️➡️ 👉 🆎 📁 ⚙️ 🔢 🗃. 👆 💪 ✍ 🌖 Pydantic ⚒: 🇨🇻 (.🇨🇻) 🐕‍🦺. !!! tip 👉 👷, 👆 💪 `pip install python-dotenv`. ### `.env` 📁 👆 💪 ✔️ `.env` 📁 ⏮️: ```bash ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" ``` ### ✍ ⚒ ⚪️➡️ `.env` & ⤴️ ℹ 👆 `config.py` ⏮️: ```Python hl_lines="9-10" {!../../../docs_src/settings/app03/config.py!} ``` 📥 👥 ✍ 🎓 `Config` 🔘 👆 Pydantic `Settings` 🎓, & ⚒ `env_file` 📁 ⏮️ 🇨🇻 📁 👥 💚 ⚙️. !!! tip `Config` 🎓 ⚙️ Pydantic 📳. 👆 💪 ✍ 🌖 Pydantic 🏷 📁 ### 🏗 `Settings` 🕴 🕐 ⏮️ `lru_cache` 👂 📁 ⚪️➡️ 💾 🛎 ⚠ (🐌) 🛠️, 👆 🎲 💚 ⚫️ 🕴 🕐 & ⤴️ 🏤-⚙️ 🎏 ⚒ 🎚, ↩️ 👂 ⚫️ 🔠 📨. ✋️ 🔠 🕰 👥: ```Python Settings() ``` 🆕 `Settings` 🎚 🔜 ✍, & 🏗 ⚫️ 🔜 ✍ `.env` 📁 🔄. 🚥 🔗 🔢 💖: ```Python def get_settings(): return Settings() ``` 👥 🔜 ✍ 👈 🎚 🔠 📨, & 👥 🔜 👂 `.env` 📁 🔠 📨. 👶 👶 ✋️ 👥 ⚙️ `@lru_cache` 👨‍🎨 🔛 🔝, `Settings` 🎚 🔜 ✍ 🕴 🕐, 🥇 🕰 ⚫️ 🤙. 👶 👶 ```Python hl_lines="1 10" {!../../../docs_src/settings/app03/main.py!} ``` ⤴️ 🙆 🏁 🤙 `get_settings()` 🔗 ⏭ 📨, ↩️ 🛠️ 🔗 📟 `get_settings()` & 🏗 🆕 `Settings` 🎚, ⚫️ 🔜 📨 🎏 🎚 👈 📨 🔛 🥇 🤙, 🔄 & 🔄. #### `lru_cache` 📡 ℹ `@lru_cache` 🔀 🔢 ⚫️ 🎀 📨 🎏 💲 👈 📨 🥇 🕰, ↩️ 💻 ⚫️ 🔄, 🛠️ 📟 🔢 🔠 🕰. , 🔢 🔛 ⚫️ 🔜 🛠️ 🕐 🔠 🌀 ❌. & ⤴️ 💲 📨 🔠 👈 🌀 ❌ 🔜 ⚙️ 🔄 & 🔄 🕐❔ 🔢 🤙 ⏮️ ⚫️❔ 🎏 🌀 ❌. 🖼, 🚥 👆 ✔️ 🔢: ```Python @lru_cache def say_hi(name: str, salutation: str = "Ms."): return f"Hello {salutation} {name}" ``` 👆 📋 💪 🛠️ 💖 👉: ```mermaid sequenceDiagram participant code as Code participant function as say_hi() participant execute as Execute function rect rgba(0, 255, 0, .1) code ->> function: say_hi(name="Camila") function ->> execute: execute function code execute ->> code: return the result end rect rgba(0, 255, 255, .1) code ->> function: say_hi(name="Camila") function ->> code: return stored result end rect rgba(0, 255, 0, .1) code ->> function: say_hi(name="Rick") function ->> execute: execute function code execute ->> code: return the result end rect rgba(0, 255, 0, .1) code ->> function: say_hi(name="Rick", salutation="Mr.") function ->> execute: execute function code execute ->> code: return the result end rect rgba(0, 255, 255, .1) code ->> function: say_hi(name="Rick") function ->> code: return stored result end rect rgba(0, 255, 255, .1) code ->> function: say_hi(name="Camila") function ->> code: return stored result end ``` 💼 👆 🔗 `get_settings()`, 🔢 🚫 ✊ 🙆 ❌, ⚫️ 🕧 📨 🎏 💲. 👈 🌌, ⚫️ 🎭 🌖 🚥 ⚫️ 🌐 🔢. ✋️ ⚫️ ⚙️ 🔗 🔢, ⤴️ 👥 💪 🔐 ⚫️ 💪 🔬. `@lru_cache` 🍕 `functools` ❔ 🍕 🐍 🐩 🗃, 👆 💪 ✍ 🌅 🔃 ⚫️ 🐍 🩺 `@lru_cache`. ## 🌃 👆 💪 ⚙️ Pydantic ⚒ 🍵 ⚒ ⚖️ 📳 👆 🈸, ⏮️ 🌐 🏋️ Pydantic 🏷. * ⚙️ 🔗 👆 💪 📉 🔬. * 👆 💪 ⚙️ `.env` 📁 ⏮️ ⚫️. * ⚙️ `@lru_cache` ➡️ 👆 ❎ 👂 🇨🇻 📁 🔄 & 🔄 🔠 📨, ⏪ 🤝 👆 🔐 ⚫️ ⏮️ 🔬. fastapi-0.110.3/docs/em/docs/advanced/sub-applications.md000066400000000000000000000047131461403617600231450ustar00rootroot00000000000000# 🎧 🈸 - 🗻 🚥 👆 💪 ✔️ 2️⃣ 🔬 FastAPI 🈸, ⏮️ 👫 👍 🔬 🗄 & 👫 👍 🩺 ⚜, 👆 💪 ✔️ 👑 📱 & "🗻" 1️⃣ (⚖️ 🌅) 🎧-🈸(Ⓜ). ## 🗜 **FastAPI** 🈸 "🗜" ⛓ ❎ 🍕 "🔬" 🈸 🎯 ➡, 👈 ⤴️ ✊ 💅 🚚 🌐 🔽 👈 ➡, ⏮️ _➡ 🛠️_ 📣 👈 🎧-🈸. ### 🔝-🎚 🈸 🥇, ✍ 👑, 🔝-🎚, **FastAPI** 🈸, & 🚮 *➡ 🛠️*: ```Python hl_lines="3 6-8" {!../../../docs_src/sub_applications/tutorial001.py!} ``` ### 🎧-🈸 ⤴️, ✍ 👆 🎧-🈸, & 🚮 *➡ 🛠️*. 👉 🎧-🈸 ➕1️⃣ 🐩 FastAPI 🈸, ✋️ 👉 1️⃣ 👈 🔜 "🗻": ```Python hl_lines="11 14-16" {!../../../docs_src/sub_applications/tutorial001.py!} ``` ### 🗻 🎧-🈸 👆 🔝-🎚 🈸, `app`, 🗻 🎧-🈸, `subapi`. 👉 💼, ⚫️ 🔜 📌 ➡ `/subapi`: ```Python hl_lines="11 19" {!../../../docs_src/sub_applications/tutorial001.py!} ``` ### ✅ 🏧 🛠️ 🩺 🔜, 🏃 `uvicorn` ⏮️ 👑 📱, 🚥 👆 📁 `main.py`, ⚫️ 🔜:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
& 📂 🩺 http://127.0.0.1:8000/docs. 👆 🔜 👀 🏧 🛠️ 🩺 👑 📱, 🔌 🕴 🚮 👍 _➡ 🛠️_: & ⤴️, 📂 🩺 🎧-🈸, http://127.0.0.1:8000/subapi/docs. 👆 🔜 👀 🏧 🛠️ 🩺 🎧-🈸, ✅ 🕴 🚮 👍 _➡ 🛠️_, 🌐 🔽 ☑ 🎧-➡ 🔡 `/subapi`: 🚥 👆 🔄 🔗 ⏮️ 🙆 2️⃣ 👩‍💻 🔢, 👫 🔜 👷 ☑, ↩️ 🖥 🔜 💪 💬 🔠 🎯 📱 ⚖️ 🎧-📱. ### 📡 ℹ: `root_path` 🕐❔ 👆 🗻 🎧-🈸 🔬 🔛, FastAPI 🔜 ✊ 💅 🔗 🗻 ➡ 🎧-🈸 ⚙️ 🛠️ ⚪️➡️ 🔫 🔧 🤙 `root_path`. 👈 🌌, 🎧-🈸 🔜 💭 ⚙️ 👈 ➡ 🔡 🩺 🎚. & 🎧-🈸 💪 ✔️ 🚮 👍 📌 🎧-🈸 & 🌐 🔜 👷 ☑, ↩️ FastAPI 🍵 🌐 👉 `root_path`Ⓜ 🔁. 👆 🔜 💡 🌅 🔃 `root_path` & ❔ ⚙️ ⚫️ 🎯 📄 🔃 [⛅ 🗳](behind-a-proxy.md){.internal-link target=_blank}. fastapi-0.110.3/docs/em/docs/advanced/templates.md000066400000000000000000000041311461403617600216600ustar00rootroot00000000000000# 📄 👆 💪 ⚙️ 🙆 📄 🚒 👆 💚 ⏮️ **FastAPI**. ⚠ ⚒ Jinja2️⃣, 🎏 1️⃣ ⚙️ 🏺 & 🎏 🧰. 📤 🚙 🔗 ⚫️ 💪 👈 👆 💪 ⚙️ 🔗 👆 **FastAPI** 🈸 (🚚 💃). ## ❎ 🔗 ❎ `jinja2`:
```console $ pip install jinja2 ---> 100% ```
## ⚙️ `Jinja2Templates` * 🗄 `Jinja2Templates`. * ✍ `templates` 🎚 👈 👆 💪 🏤-⚙️ ⏪. * 📣 `Request` 🔢 *➡ 🛠️* 👈 🔜 📨 📄. * ⚙️ `templates` 👆 ✍ ✍ & 📨 `TemplateResponse`, 🚶‍♀️ `request` 1️⃣ 🔑-💲 👫 Jinja2️⃣ "🔑". ```Python hl_lines="4 11 15-18" {!../../../docs_src/templates/tutorial001.py!} ``` !!! note 👀 👈 👆 ✔️ 🚶‍♀️ `request` 🍕 🔑-💲 👫 🔑 Jinja2️⃣. , 👆 ✔️ 📣 ⚫️ 👆 *➡ 🛠️*. !!! tip 📣 `response_class=HTMLResponse` 🩺 🎚 🔜 💪 💭 👈 📨 🔜 🕸. !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.templating import Jinja2Templates`. **FastAPI** 🚚 🎏 `starlette.templating` `fastapi.templating` 🏪 👆, 👩‍💻. ✋️ 🌅 💪 📨 👟 🔗 ⚪️➡️ 💃. 🎏 ⏮️ `Request` & `StaticFiles`. ## ✍ 📄 ⤴️ 👆 💪 ✍ 📄 `templates/item.html` ⏮️: ```jinja hl_lines="7" {!../../../docs_src/templates/templates/item.html!} ``` ⚫️ 🔜 🎦 `id` ✊ ⚪️➡️ "🔑" `dict` 👆 🚶‍♀️: ```Python {"request": request, "id": id} ``` ## 📄 & 🎻 📁 & 👆 💪 ⚙️ `url_for()` 🔘 📄, & ⚙️ ⚫️, 🖼, ⏮️ `StaticFiles` 👆 📌. ```jinja hl_lines="4" {!../../../docs_src/templates/templates/item.html!} ``` 👉 🖼, ⚫️ 🔜 🔗 🎚 📁 `static/styles.css` ⏮️: ```CSS hl_lines="4" {!../../../docs_src/templates/static/styles.css!} ``` & ↩️ 👆 ⚙️ `StaticFiles`, 👈 🎚 📁 🔜 🍦 🔁 👆 **FastAPI** 🈸 📛 `/static/styles.css`. ## 🌅 ℹ 🌅 ℹ, 🔌 ❔ 💯 📄, ✅ 💃 🩺 🔛 📄. fastapi-0.110.3/docs/em/docs/advanced/testing-database.md000066400000000000000000000050711461403617600231050ustar00rootroot00000000000000# 🔬 💽 👆 💪 ⚙️ 🎏 🔗 🔐 ⚪️➡️ [🔬 🔗 ⏮️ 🔐](testing-dependencies.md){.internal-link target=_blank} 📉 💽 🔬. 👆 💪 💚 ⚒ 🆙 🎏 💽 🔬, 💾 💽 ⏮️ 💯, 🏤-🥧 ⚫️ ⏮️ 🔬 💽, ♒️. 👑 💭 ⚫️❔ 🎏 👆 👀 👈 ⏮️ 📃. ## 🚮 💯 🗄 📱 ➡️ ℹ 🖼 ⚪️➡️ [🗄 (🔗) 💽](../tutorial/sql-databases.md){.internal-link target=_blank} ⚙️ 🔬 💽. 🌐 📱 📟 🎏, 👆 💪 🚶 🔙 👈 📃 ✅ ❔ ⚫️. 🕴 🔀 📥 🆕 🔬 📁. 👆 😐 🔗 `get_db()` 🔜 📨 💽 🎉. 💯, 👆 💪 ⚙️ 🔗 🔐 📨 👆 *🛃* 💽 🎉 ↩️ 1️⃣ 👈 🔜 ⚙️ 🛎. 👉 🖼 👥 🔜 ✍ 🍕 💽 🕴 💯. ## 📁 📊 👥 ✍ 🆕 📁 `sql_app/tests/test_sql_app.py`. 🆕 📁 📊 👀 💖: ``` hl_lines="9-11" . └── sql_app ├── __init__.py ├── crud.py ├── database.py ├── main.py ├── models.py ├── schemas.py └── tests ├── __init__.py └── test_sql_app.py ``` ## ✍ 🆕 💽 🎉 🥇, 👥 ✍ 🆕 💽 🎉 ⏮️ 🆕 💽. 💯 👥 🔜 ⚙️ 📁 `test.db` ↩️ `sql_app.db`. ✋️ 🎂 🎉 📟 🌅 ⚖️ 🌘 🎏, 👥 📁 ⚫️. ```Python hl_lines="8-13" {!../../../docs_src/sql_databases/sql_app/tests/test_sql_app.py!} ``` !!! tip 👆 💪 📉 ❎ 👈 📟 🚮 ⚫️ 🔢 & ⚙️ ⚫️ ⚪️➡️ 👯‍♂️ `database.py` & `tests/test_sql_app.py`. 🦁 & 🎯 🔛 🎯 🔬 📟, 👥 🖨 ⚫️. ## ✍ 💽 ↩️ 🔜 👥 🔜 ⚙️ 🆕 💽 🆕 📁, 👥 💪 ⚒ 💭 👥 ✍ 💽 ⏮️: ```Python Base.metadata.create_all(bind=engine) ``` 👈 🛎 🤙 `main.py`, ✋️ ⏸ `main.py` ⚙️ 💽 📁 `sql_app.db`, & 👥 💪 ⚒ 💭 👥 ✍ `test.db` 💯. 👥 🚮 👈 ⏸ 📥, ⏮️ 🆕 📁. ```Python hl_lines="16" {!../../../docs_src/sql_databases/sql_app/tests/test_sql_app.py!} ``` ## 🔗 🔐 🔜 👥 ✍ 🔗 🔐 & 🚮 ⚫️ 🔐 👆 📱. ```Python hl_lines="19-24 27" {!../../../docs_src/sql_databases/sql_app/tests/test_sql_app.py!} ``` !!! tip 📟 `override_get_db()` 🌖 ⚫️❔ 🎏 `get_db()`, ✋️ `override_get_db()` 👥 ⚙️ `TestingSessionLocal` 🔬 💽 ↩️. ## 💯 📱 ⤴️ 👥 💪 💯 📱 🛎. ```Python hl_lines="32-47" {!../../../docs_src/sql_databases/sql_app/tests/test_sql_app.py!} ``` & 🌐 🛠️ 👥 ⚒ 💽 ⏮️ 💯 🔜 `test.db` 💽 ↩️ 👑 `sql_app.db`. fastapi-0.110.3/docs/em/docs/advanced/testing-dependencies.md000066400000000000000000000034051461403617600237660ustar00rootroot00000000000000# 🔬 🔗 ⏮️ 🔐 ## 🔑 🔗 ⏮️ 🔬 📤 😐 🌐❔ 👆 💪 💚 🔐 🔗 ⏮️ 🔬. 👆 🚫 💚 ⏮️ 🔗 🏃 (🚫 🙆 🎧-🔗 ⚫️ 💪 ✔️). ↩️, 👆 💚 🚚 🎏 🔗 👈 🔜 ⚙️ 🕴 ⏮️ 💯 (🎲 🕴 🎯 💯), & 🔜 🚚 💲 👈 💪 ⚙️ 🌐❔ 💲 ⏮️ 🔗 ⚙️. ### ⚙️ 💼: 🔢 🐕‍🦺 🖼 💪 👈 👆 ✔️ 🔢 🤝 🐕‍🦺 👈 👆 💪 🤙. 👆 📨 ⚫️ 🤝 & ⚫️ 📨 🔓 👩‍💻. 👉 🐕‍🦺 5️⃣📆 🔌 👆 📍 📨, & 🤙 ⚫️ 💪 ✊ ➕ 🕰 🌘 🚥 👆 ✔️ 🔧 🎁 👩‍💻 💯. 👆 🎲 💚 💯 🔢 🐕‍🦺 🕐, ✋️ 🚫 🎯 🤙 ⚫️ 🔠 💯 👈 🏃. 👉 💼, 👆 💪 🔐 🔗 👈 🤙 👈 🐕‍🦺, & ⚙️ 🛃 🔗 👈 📨 🎁 👩‍💻, 🕴 👆 💯. ### ⚙️ `app.dependency_overrides` 🔢 👫 💼, 👆 **FastAPI** 🈸 ✔️ 🔢 `app.dependency_overrides`, ⚫️ 🙅 `dict`. 🔐 🔗 🔬, 👆 🚮 🔑 ⏮️ 🔗 (🔢), & 💲, 👆 🔗 🔐 (➕1️⃣ 🔢). & ⤴️ **FastAPI** 🔜 🤙 👈 🔐 ↩️ ⏮️ 🔗. ```Python hl_lines="28-29 32" {!../../../docs_src/dependency_testing/tutorial001.py!} ``` !!! tip 👆 💪 ⚒ 🔗 🔐 🔗 ⚙️ 🙆 👆 **FastAPI** 🈸. ⏮️ 🔗 💪 ⚙️ *➡ 🛠️ 🔢*, *➡ 🛠️ 👨‍🎨* (🕐❔ 👆 🚫 ⚙️ 📨 💲), `.include_router()` 🤙, ♒️. FastAPI 🔜 💪 🔐 ⚫️. ⤴️ 👆 💪 ⏲ 👆 🔐 (❎ 👫) ⚒ `app.dependency_overrides` 🛁 `dict`: ```Python app.dependency_overrides = {} ``` !!! tip 🚥 👆 💚 🔐 🔗 🕴 ⏮️ 💯, 👆 💪 ⚒ 🔐 ▶️ 💯 (🔘 💯 🔢) & ⏲ ⚫️ 🔚 (🔚 💯 🔢). fastapi-0.110.3/docs/em/docs/advanced/testing-events.md000066400000000000000000000003701461403617600226420ustar00rootroot00000000000000# 🔬 🎉: 🕴 - 🤫 🕐❔ 👆 💪 👆 🎉 🐕‍🦺 (`startup` & `shutdown`) 🏃 👆 💯, 👆 💪 ⚙️ `TestClient` ⏮️ `with` 📄: ```Python hl_lines="9-12 20-24" {!../../../docs_src/app_testing/tutorial003.py!} ``` fastapi-0.110.3/docs/em/docs/advanced/testing-websockets.md000066400000000000000000000005641461403617600235140ustar00rootroot00000000000000# 🔬 *️⃣ 👆 💪 ⚙️ 🎏 `TestClient` 💯*️⃣. 👉, 👆 ⚙️ `TestClient` `with` 📄, 🔗*️⃣: ```Python hl_lines="27-31" {!../../../docs_src/app_testing/tutorial002.py!} ``` !!! note 🌅 ℹ, ✅ 💃 🧾 🔬 *️⃣ . fastapi-0.110.3/docs/em/docs/advanced/using-request-directly.md000066400000000000000000000034511461403617600243160ustar00rootroot00000000000000# ⚙️ 📨 🔗 🆙 🔜, 👆 ✔️ 📣 🍕 📨 👈 👆 💪 ⏮️ 👫 🆎. ✊ 📊 ⚪️➡️: * ➡ 🔢. * 🎚. * 🍪. * ♒️. & 🔨, **FastAPI** ⚖ 👈 💽, 🏭 ⚫️ & 🏭 🧾 👆 🛠️ 🔁. ✋️ 📤 ⚠ 🌐❔ 👆 💪 💪 🔐 `Request` 🎚 🔗. ## ℹ 🔃 `Request` 🎚 **FastAPI** 🤙 **💃** 🔘, ⏮️ 🧽 📚 🧰 🔛 🔝, 👆 💪 ⚙️ 💃 `Request` 🎚 🔗 🕐❔ 👆 💪. ⚫️ 🔜 ⛓ 👈 🚥 👆 🤚 📊 ⚪️➡️ `Request` 🎚 🔗 (🖼, ✍ 💪) ⚫️ 🏆 🚫 ✔, 🗜 ⚖️ 📄 (⏮️ 🗄, 🏧 🛠️ 👩‍💻 🔢) FastAPI. 👐 🙆 🎏 🔢 📣 🛎 (🖼, 💪 ⏮️ Pydantic 🏷) 🔜 ✔, 🗜, ✍, ♒️. ✋️ 📤 🎯 💼 🌐❔ ⚫️ ⚠ 🤚 `Request` 🎚. ## ⚙️ `Request` 🎚 🔗 ➡️ 🌈 👆 💚 🤚 👩‍💻 📢 📢/🦠 🔘 👆 *➡ 🛠️ 🔢*. 👈 👆 💪 🔐 📨 🔗. ```Python hl_lines="1 7-8" {!../../../docs_src/using_request_directly/tutorial001.py!} ``` 📣 *➡ 🛠️ 🔢* 🔢 ⏮️ 🆎 ➖ `Request` **FastAPI** 🔜 💭 🚶‍♀️ `Request` 👈 🔢. !!! tip 🗒 👈 👉 💼, 👥 📣 ➡ 🔢 ⤴️ 📨 🔢. , ➡ 🔢 🔜 ⚗, ✔, 🗜 ✔ 🆎 & ✍ ⏮️ 🗄. 🎏 🌌, 👆 💪 📣 🙆 🎏 🔢 🛎, & ➡, 🤚 `Request` 💁‍♂️. ## `Request` 🧾 👆 💪 ✍ 🌅 ℹ 🔃 `Request` 🎚 🛂 💃 🧾 🕸. !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.requests import Request`. **FastAPI** 🚚 ⚫️ 🔗 🏪 👆, 👩‍💻. ✋️ ⚫️ 👟 🔗 ⚪️➡️ 💃. fastapi-0.110.3/docs/em/docs/advanced/websockets.md000066400000000000000000000114671461403617600220450ustar00rootroot00000000000000# *️⃣ 👆 💪 ⚙️ *️⃣ ⏮️ **FastAPI**. ## ❎ `WebSockets` 🥇 👆 💪 ❎ `WebSockets`:
```console $ pip install websockets ---> 100% ```
## *️⃣ 👩‍💻 ### 🏭 👆 🏭 ⚙️, 👆 🎲 ✔️ 🕸 ✍ ⏮️ 🏛 🛠️ 💖 😥, Vue.js ⚖️ 📐. & 🔗 ⚙️ *️⃣ ⏮️ 👆 👩‍💻 👆 🔜 🎲 ⚙️ 👆 🕸 🚙. ⚖️ 👆 💪 ✔️ 🇦🇸 📱 🈸 👈 🔗 ⏮️ 👆 *️⃣ 👩‍💻 🔗, 🇦🇸 📟. ⚖️ 👆 5️⃣📆 ✔️ 🙆 🎏 🌌 🔗 ⏮️ *️⃣ 🔗. --- ✋️ 👉 🖼, 👥 🔜 ⚙️ 📶 🙅 🕸 📄 ⏮️ 🕸, 🌐 🔘 📏 🎻. 👉, ↗️, 🚫 ⚖ & 👆 🚫🔜 ⚙️ ⚫️ 🏭. 🏭 👆 🔜 ✔️ 1️⃣ 🎛 🔛. ✋️ ⚫️ 🙅 🌌 🎯 🔛 💽-🚄 *️⃣ & ✔️ 👷 🖼: ```Python hl_lines="2 6-38 41-43" {!../../../docs_src/websockets/tutorial001.py!} ``` ## ✍ `websocket` 👆 **FastAPI** 🈸, ✍ `websocket`: ```Python hl_lines="1 46-47" {!../../../docs_src/websockets/tutorial001.py!} ``` !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.websockets import WebSocket`. **FastAPI** 🚚 🎏 `WebSocket` 🔗 🏪 👆, 👩‍💻. ✋️ ⚫️ 👟 🔗 ⚪️➡️ 💃. ## ⌛ 📧 & 📨 📧 👆 *️⃣ 🛣 👆 💪 `await` 📧 & 📨 📧. ```Python hl_lines="48-52" {!../../../docs_src/websockets/tutorial001.py!} ``` 👆 💪 📨 & 📨 💱, ✍, & 🎻 💽. ## 🔄 ⚫️ 🚥 👆 📁 📛 `main.py`, 🏃 👆 🈸 ⏮️:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
📂 👆 🖥 http://127.0.0.1:8000. 👆 🔜 👀 🙅 📃 💖: 👆 💪 🆎 📧 🔢 📦, & 📨 👫: & 👆 **FastAPI** 🈸 ⏮️ *️⃣ 🔜 📨 🔙: 👆 💪 📨 (& 📨) 📚 📧: & 🌐 👫 🔜 ⚙️ 🎏 *️⃣ 🔗. ## ⚙️ `Depends` & 🎏 *️⃣ 🔗 👆 💪 🗄 ⚪️➡️ `fastapi` & ⚙️: * `Depends` * `Security` * `Cookie` * `Header` * `Path` * `Query` 👫 👷 🎏 🌌 🎏 FastAPI 🔗/*➡ 🛠️*: ```Python hl_lines="66-77 76-91" {!../../../docs_src/websockets/tutorial002.py!} ``` !!! info 👉 *️⃣ ⚫️ 🚫 🤙 ⚒ 🔑 🤚 `HTTPException`, ↩️ 👥 🤚 `WebSocketException`. 👆 💪 ⚙️ 📪 📟 ⚪️➡️ ☑ 📟 🔬 🔧. ### 🔄 *️⃣ ⏮️ 🔗 🚥 👆 📁 📛 `main.py`, 🏃 👆 🈸 ⏮️:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
📂 👆 🖥 http://127.0.0.1:8000. 📤 👆 💪 ⚒: * "🏬 🆔", ⚙️ ➡. * "🤝" ⚙️ 🔢 🔢. !!! tip 👀 👈 🔢 `token` 🔜 🍵 🔗. ⏮️ 👈 👆 💪 🔗 *️⃣ & ⤴️ 📨 & 📨 📧: ## 🚚 🔀 & 💗 👩‍💻 🕐❔ *️⃣ 🔗 📪, `await websocket.receive_text()` 🔜 🤚 `WebSocketDisconnect` ⚠, ❔ 👆 💪 ⤴️ ✊ & 🍵 💖 👉 🖼. ```Python hl_lines="81-83" {!../../../docs_src/websockets/tutorial003.py!} ``` 🔄 ⚫️ 👅: * 📂 📱 ⏮️ 📚 🖥 📑. * ✍ 📧 ⚪️➡️ 👫. * ⤴️ 🔐 1️⃣ 📑. 👈 🔜 🤚 `WebSocketDisconnect` ⚠, & 🌐 🎏 👩‍💻 🔜 📨 📧 💖: ``` Client #1596980209979 left the chat ``` !!! tip 📱 🔛 ⭐ & 🙅 🖼 🎦 ❔ 🍵 & 📻 📧 📚 *️⃣ 🔗. ✋️ ✔️ 🤯 👈, 🌐 🍵 💾, 👁 📇, ⚫️ 🔜 🕴 👷 ⏪ 🛠️ 🏃, & 🔜 🕴 👷 ⏮️ 👁 🛠️. 🚥 👆 💪 🕳 ⏩ 🛠️ ⏮️ FastAPI ✋️ 👈 🌖 🏋️, 🐕‍🦺 ✳, ✳ ⚖️ 🎏, ✅ 🗜/📻. ## 🌅 ℹ 💡 🌅 🔃 🎛, ✅ 💃 🧾: * `WebSocket` 🎓. * 🎓-⚓️ *️⃣ 🚚. fastapi-0.110.3/docs/em/docs/advanced/wsgi.md000066400000000000000000000021061461403617600206330ustar00rootroot00000000000000# ✅ 🇨🇻 - 🏺, ✳, 🎏 👆 💪 🗻 🇨🇻 🈸 👆 👀 ⏮️ [🎧 🈸 - 🗻](sub-applications.md){.internal-link target=_blank}, [⛅ 🗳](behind-a-proxy.md){.internal-link target=_blank}. 👈, 👆 💪 ⚙️ `WSGIMiddleware` & ⚙️ ⚫️ 🎁 👆 🇨🇻 🈸, 🖼, 🏺, ✳, ♒️. ## ⚙️ `WSGIMiddleware` 👆 💪 🗄 `WSGIMiddleware`. ⤴️ 🎁 🇨🇻 (✅ 🏺) 📱 ⏮️ 🛠️. & ⤴️ 🗻 👈 🔽 ➡. ```Python hl_lines="2-3 22" {!../../../docs_src/wsgi/tutorial001.py!} ``` ## ✅ ⚫️ 🔜, 🔠 📨 🔽 ➡ `/v1/` 🔜 🍵 🏺 🈸. & 🎂 🔜 🍵 **FastAPI**. 🚥 👆 🏃 ⚫️ ⏮️ Uvicorn & 🚶 http://localhost:8000/v1/ 👆 🔜 👀 📨 ⚪️➡️ 🏺: ```txt Hello, World from Flask! ``` & 🚥 👆 🚶 http://localhost:8000/v2 👆 🔜 👀 📨 ⚪️➡️ FastAPI: ```JSON { "message": "Hello World" } ``` fastapi-0.110.3/docs/em/docs/alternatives.md000066400000000000000000000452661461403617600206340ustar00rootroot00000000000000# 🎛, 🌈 & 🔺 ⚫️❔ 😮 **FastAPI**, ❔ ⚫️ 🔬 🎏 🎛 & ⚫️❔ ⚫️ 🇭🇲 ⚪️➡️ 👫. ## 🎶 **FastAPI** 🚫🔜 🔀 🚥 🚫 ⏮️ 👷 🎏. 📤 ✔️ 📚 🧰 ✍ ⏭ 👈 ✔️ ℹ 😮 🚮 🏗. 👤 ✔️ ❎ 🏗 🆕 🛠️ 📚 1️⃣2️⃣🗓️. 🥇 👤 🔄 ❎ 🌐 ⚒ 📔 **FastAPI** ⚙️ 📚 🎏 🛠️, 🔌-🔌, & 🧰. ✋️ ☝, 📤 🙅‍♂ 🎏 🎛 🌘 🏗 🕳 👈 🚚 🌐 👫 ⚒, ✊ 🏆 💭 ⚪️➡️ ⏮️ 🧰, & 🌀 👫 🏆 🌌 💪, ⚙️ 🇪🇸 ⚒ 👈 ➖🚫 💪 ⏭ (🐍 3️⃣.6️⃣ ➕ 🆎 🔑). ## ⏮️ 🧰 ### ⚫️ 🌅 🌟 🐍 🛠️ & 🛎 🕴. ⚫️ ⚙️ 🏗 ⚙️ 💖 👱📔. ⚫️ 📶 😆 🔗 ⏮️ 🔗 💽 (💖 ✳ ⚖️ ✳),, ✔️ ☁ 💽 (💖 🗄, ✳, 👸, ♒️) 👑 🏪 🚒 🚫 📶 ⏩. ⚫️ ✍ 🏗 🕸 👩‍💻, 🚫 ✍ 🔗 ⚙️ 🏛 🕸 (💖 😥, Vue.js & 📐) ⚖️ 🎏 ⚙️ (💖 📳) 🔗 ⏮️ ⚫️. ### ✳ 🎂 🛠️ ✳ 🎂 🛠️ ✍ 🗜 🧰 🏗 🕸 🔗 ⚙️ ✳ 🔘, 📉 🚮 🛠️ 🛠️. ⚫️ ⚙️ 📚 🏢 ✅ 🦎, 🟥 👒 & 🎟. ⚫️ 🕐 🥇 🖼 **🏧 🛠️ 🧾**, & 👉 🎯 🕐 🥇 💭 👈 😮 "🔎" **FastAPI**. !!! note ✳ 🎂 🛠️ ✍ ✡ 🇺🇸🏛. 🎏 👼 💃 & Uvicorn, 🔛 ❔ **FastAPI** ⚓️. !!! check "😮 **FastAPI** " ✔️ 🏧 🛠️ 🧾 🕸 👩‍💻 🔢. ### 🏺 🏺 "🕸", ⚫️ 🚫 🔌 💽 🛠️ 🚫 📚 👜 👈 👟 🔢 ✳. 👉 🦁 & 💪 ✔ 🔨 👜 💖 ⚙️ ☁ 💽 👑 💽 💾 ⚙️. ⚫️ 📶 🙅, ⚫️ 📶 🏋️ 💡, 👐 🧾 🤚 🙁 📡 ☝. ⚫️ 🛎 ⚙️ 🎏 🈸 👈 🚫 🎯 💪 💽, 👩‍💻 🧾, ⚖️ 🙆 📚 ⚒ 👈 👟 🏤-🏗 ✳. 👐 📚 👫 ⚒ 💪 🚮 ⏮️ 🔌-🔌. 👉 ⚖ 🍕, & ➖ "🕸" 👈 💪 ↔ 📔 ⚫️❔ ⚫️❔ 💪 🔑 ⚒ 👈 👤 💚 🚧. 👐 🦁 🏺, ⚫️ 😑 💖 👍 🏏 🏗 🔗. ⏭ 👜 🔎 "✳ 🎂 🛠️" 🏺. !!! check "😮 **FastAPI** " ◾-🛠️. ⚒ ⚫️ ⏩ 🌀 & 🏏 🧰 & 🍕 💪. ✔️ 🙅 & ⏩ ⚙️ 🕹 ⚙️. ### 📨 **FastAPI** 🚫 🤙 🎛 **📨**. 👫 ↔ 📶 🎏. ⚫️ 🔜 🤙 ⚠ ⚙️ 📨 *🔘* FastAPI 🈸. ✋️, FastAPI 🤚 🌈 ⚪️➡️ 📨. **📨** 🗃 *🔗* ⏮️ 🔗 (👩‍💻), ⏪ **FastAPI** 🗃 *🏗* 🔗 (💽). 👫, 🌖 ⚖️ 🌘, 🔄 🔚, 🔗 🔠 🎏. 📨 ✔️ 📶 🙅 & 🏋️ 🔧, ⚫️ 📶 ⏩ ⚙️, ⏮️ 🤔 🔢. ✋️ 🎏 🕰, ⚫️ 📶 🏋️ & 🛃. 👈 ⚫️❔, 💬 🛂 🕸: > 📨 1️⃣ 🏆 ⏬ 🐍 📦 🌐 🕰 🌌 👆 ⚙️ ⚫️ 📶 🙅. 🖼, `GET` 📨, 👆 🔜 ✍: ```Python response = requests.get("http://example.com/some/url") ``` FastAPI 😑 🛠️ *➡ 🛠️* 💪 👀 💖: ```Python hl_lines="1" @app.get("/some/url") def read_url(): return {"message": "Hello World"} ``` 👀 🔀 `requests.get(...)` & `@app.get(...)`. !!! check "😮 **FastAPI** " * ✔️ 🙅 & 🏋️ 🛠️. * ⚙️ 🇺🇸🔍 👩‍🔬 📛 (🛠️) 🔗, 🎯 & 🏋️ 🌌. * ✔️ 🤔 🔢, ✋️ 🏋️ 🛃. ### 🦁 / 🗄 👑 ⚒ 👤 💚 ⚪️➡️ ✳ 🎂 🛠️ 🏧 🛠️ 🧾. ⤴️ 👤 🔎 👈 📤 🐩 📄 🔗, ⚙️ 🎻 (⚖️ 📁, ↔ 🎻) 🤙 🦁. & 📤 🕸 👩‍💻 🔢 🦁 🛠️ ⏪ ✍. , 💆‍♂ 💪 🏗 🦁 🧾 🛠️ 🔜 ✔ ⚙️ 👉 🕸 👩‍💻 🔢 🔁. ☝, 🦁 👐 💾 🏛, 📁 🗄. 👈 ⚫️❔ 🕐❔ 💬 🔃 ⏬ 2️⃣.0️⃣ ⚫️ ⚠ 💬 "🦁", & ⏬ 3️⃣ ➕ "🗄". !!! check "😮 **FastAPI** " 🛠️ & ⚙️ 📂 🐩 🛠️ 🔧, ↩️ 🛃 🔗. & 🛠️ 🐩-⚓️ 👩‍💻 🔢 🧰: * 🦁 🎚 * 📄 👫 2️⃣ 👐 ➖ 📶 🌟 & ⚖, ✋️ 🔨 ⏩ 🔎, 👆 💪 🔎 💯 🌖 🎛 👩‍💻 🔢 🗄 (👈 👆 💪 ⚙️ ⏮️ **FastAPI**). ### 🏺 🎂 🛠️ 📤 📚 🏺 🎂 🛠️, ✋️ ⏮️ 💰 🕰 & 👷 🔘 🔬 👫, 👤 🔎 👈 📚 😞 ⚖️ 🚫, ⏮️ 📚 🧍 ❔ 👈 ⚒ 👫 🙃. ### 🍭 1️⃣ 👑 ⚒ 💪 🛠️ ⚙️ 📊 "🛠️" ❔ ✊ 📊 ⚪️➡️ 📟 (🐍) & 🏭 ⚫️ 🔘 🕳 👈 💪 📨 🔘 🕸. 🖼, 🏭 🎚 ⚗ 📊 ⚪️➡️ 💽 🔘 🎻 🎚. 🏭 `datetime` 🎚 🔘 🎻, ♒️. ➕1️⃣ 🦏 ⚒ 💚 🔗 💽 🔬, ⚒ 💭 👈 💽 ☑, 🤝 🎯 🔢. 🖼, 👈 🏑 `int`, & 🚫 🎲 🎻. 👉 ✴️ ⚠ 📨 💽. 🍵 💽 🔬 ⚙️, 👆 🔜 ✔️ 🌐 ✅ ✋, 📟. 👫 ⚒ ⚫️❔ 🍭 🏗 🚚. ⚫️ 👑 🗃, & 👤 ✔️ ⚙️ ⚫️ 📚 ⏭. ✋️ ⚫️ ✍ ⏭ 📤 🔀 🐍 🆎 🔑. , 🔬 🔠 🔗 👆 💪 ⚙️ 🎯 🇨🇻 & 🎓 🚚 🍭. !!! check "😮 **FastAPI** " ⚙️ 📟 🔬 "🔗" 👈 🚚 💽 🆎 & 🔬, 🔁. ### Webarg ➕1️⃣ 🦏 ⚒ ✔ 🔗 📊 ⚪️➡️ 📨 📨. Webarg 🧰 👈 ⚒ 🚚 👈 🔛 🔝 📚 🛠️, 🔌 🏺. ⚫️ ⚙️ 🍭 🔘 💽 🔬. & ⚫️ ✍ 🎏 👩‍💻. ⚫️ 👑 🧰 & 👤 ✔️ ⚙️ ⚫️ 📚 💁‍♂️, ⏭ ✔️ **FastAPI**. !!! info Webarg ✍ 🎏 🍭 👩‍💻. !!! check "😮 **FastAPI** " ✔️ 🏧 🔬 📨 📨 💽. ### APISpec 🍭 & Webarg 🚚 🔬, ✍ & 🛠️ 🔌-🔌. ✋️ 🧾 ❌. ⤴️ APISpec ✍. ⚫️ 🔌-📚 🛠️ (& 📤 🔌-💃 💁‍♂️). 🌌 ⚫️ 👷 👈 👆 ✍ 🔑 🔗 ⚙️ 📁 📁 🔘 #️⃣ 🔠 🔢 🚚 🛣. & ⚫️ 🏗 🗄 🔗. 👈 ❔ ⚫️ 👷 🏺, 💃, 🆘, ♒️. ✋️ ⤴️, 👥 ✔️ 🔄 ⚠ ✔️ ◾-❕, 🔘 🐍 🎻 (🦏 📁). 👨‍🎨 💪 🚫 ℹ 🌅 ⏮️ 👈. & 🚥 👥 🔀 🔢 ⚖️ 🍭 🔗 & 💭 🔀 👈 📁#️⃣, 🏗 🔗 🔜 ❌. !!! info APISpec ✍ 🎏 🍭 👩‍💻. !!! check "😮 **FastAPI** " 🐕‍🦺 📂 🐩 🛠️, 🗄. ### 🏺-Apispec ⚫️ 🏺 🔌 -, 👈 👔 👯‍♂️ Webarg, 🍭 & APISpec. ⚫️ ⚙️ ℹ ⚪️➡️ Webarg & 🍭 🔁 🏗 🗄 🔗, ⚙️ APISpec. ⚫️ 👑 🧰, 📶 🔽-📈. ⚫️ 🔜 🌌 🌖 🌟 🌘 📚 🏺 🔌-🔌 👅 📤. ⚫️ 💪 ↩️ 🚮 🧾 ➖ 💁‍♂️ 🩲 & 📝. 👉 ❎ ✔️ ✍ 📁 (➕1️⃣ ❕) 🔘 🐍 ✍. 👉 🌀 🏺, 🏺-Apispec ⏮️ 🍭 & Webarg 👇 💕 👩‍💻 📚 ⏭ 🏗 **FastAPI**. ⚙️ ⚫️ ↘️ 🏗 📚 🏺 🌕-📚 🚂. 👫 👑 📚 👤 (& 📚 🔢 🏉) ✔️ ⚙️ 🆙 🔜: * https://github.com/tiangolo/full-stack * https://github.com/tiangolo/full-stack-flask-couchbase * https://github.com/tiangolo/full-stack-flask-couchdb & 👫 🎏 🌕-📚 🚂 🧢 [**FastAPI** 🏗 🚂](project-generation.md){.internal-link target=_blank}. !!! info 🏺-Apispec ✍ 🎏 🍭 👩‍💻. !!! check "😮 **FastAPI** " 🏗 🗄 🔗 🔁, ⚪️➡️ 🎏 📟 👈 🔬 🛠️ & 🔬. ### NestJS (& 📐) 👉 ➖🚫 🚫 🐍, NestJS 🕸 (📕) ✳ 🛠️ 😮 📐. ⚫️ 🏆 🕳 🙁 🎏 ⚫️❔ 💪 🔨 ⏮️ 🏺-Apispec. ⚫️ ✔️ 🛠️ 🔗 💉 ⚙️, 😮 📐 2️⃣. ⚫️ 🚚 🏤-® "💉" (💖 🌐 🎏 🔗 💉 ⚙️ 👤 💭),, ⚫️ 🚮 🎭 & 📟 🔁. 🔢 🔬 ⏮️ 📕 🆎 (🎏 🐍 🆎 🔑), 👨‍🎨 🐕‍🦺 👍. ✋️ 📕 📊 🚫 🛡 ⏮️ 📹 🕸, ⚫️ 🚫🔜 ⚓️ 🔛 🆎 🔬 🔬, 🛠️ & 🧾 🎏 🕰. ↩️ 👉 & 🔧 🚫, 🤚 🔬, 🛠️ & 🏧 🔗 ⚡, ⚫️ 💪 🚮 👨‍🎨 📚 🥉. , ⚫️ ▶️️ 🔁. ⚫️ 💪 🚫 🍵 🔁 🏷 📶 👍. , 🚥 🎻 💪 📨 🎻 🎚 👈 ✔️ 🔘 🏑 👈 🔄 🐦 🎻 🎚, ⚫️ 🚫🔜 ☑ 📄 & ✔. !!! check "😮 **FastAPI** " ⚙️ 🐍 🆎 ✔️ 👑 👨‍🎨 🐕‍🦺. ✔️ 🏋️ 🔗 💉 ⚙️. 🔎 🌌 📉 📟 🔁. ### 🤣 ⚫️ 🕐 🥇 📶 ⏩ 🐍 🛠️ ⚓️ 🔛 `asyncio`. ⚫️ ⚒ 📶 🎏 🏺. !!! note "📡 ℹ" ⚫️ ⚙️ `uvloop` ↩️ 🔢 🐍 `asyncio` ➰. 👈 ⚫️❔ ⚒ ⚫️ ⏩. ⚫️ 🎯 😮 Uvicorn & 💃, 👈 ⏳ ⏩ 🌘 🤣 📂 📇. !!! check "😮 **FastAPI** " 🔎 🌌 ✔️ 😜 🎭. 👈 ⚫️❔ **FastAPI** ⚓️ 🔛 💃, ⚫️ ⏩ 🛠️ 💪 (💯 🥉-🥳 📇). ### 🦅 🦅 ➕1️⃣ ↕ 🎭 🐍 🛠️, ⚫️ 🔧 ⭐, & 👷 🏛 🎏 🛠️ 💖 🤗. ⚫️ 🏗 ✔️ 🔢 👈 📨 2️⃣ 🔢, 1️⃣ "📨" & 1️⃣ "📨". ⤴️ 👆 "✍" 🍕 ⚪️➡️ 📨, & "✍" 🍕 📨. ↩️ 👉 🔧, ⚫️ 🚫 💪 📣 📨 🔢 & 💪 ⏮️ 🐩 🐍 🆎 🔑 🔢 🔢. , 💽 🔬, 🛠️, & 🧾, ✔️ ⌛ 📟, 🚫 🔁. ⚖️ 👫 ✔️ 🛠️ 🛠️ 🔛 🔝 🦅, 💖 🤗. 👉 🎏 🔺 🔨 🎏 🛠️ 👈 😮 🦅 🔧, ✔️ 1️⃣ 📨 🎚 & 1️⃣ 📨 🎚 🔢. !!! check "😮 **FastAPI** " 🔎 🌌 🤚 👑 🎭. ⤴️ ⏮️ 🤗 (🤗 ⚓️ 🔛 🦅) 😮 **FastAPI** 📣 `response` 🔢 🔢. 👐 FastAPI ⚫️ 📦, & ⚙️ ✴️ ⚒ 🎚, 🍪, & 🎛 👔 📟. ### 👤 🔎 ♨ 🥇 ▶️ 🏗 **FastAPI**. & ⚫️ ✔️ 🎏 💭: * ⚓️ 🔛 🐍 🆎 🔑. * 🔬 & 🧾 ⚪️➡️ 👫 🆎. * 🔗 💉 ⚙️. ⚫️ 🚫 ⚙️ 💽 🔬, 🛠️ & 🧾 🥉-🥳 🗃 💖 Pydantic, ⚫️ ✔️ 🚮 👍. , 👫 💽 🆎 🔑 🔜 🚫 ♻ 💪. ⚫️ 🚚 🐥 🍖 🌅 🔁 📳. & ⚫️ ⚓️ 🔛 🇨🇻 (↩️ 🔫), ⚫️ 🚫 🔧 ✊ 📈 ↕-🎭 🚚 🧰 💖 Uvicorn, 💃 & 🤣. 🔗 💉 ⚙️ 🚚 🏤-® 🔗 & 🔗 ❎ 🧢 🔛 📣 🆎. , ⚫️ 🚫 💪 📣 🌅 🌘 1️⃣ "🦲" 👈 🚚 🎯 🆎. 🛣 📣 👁 🥉, ⚙️ 🔢 📣 🎏 🥉 (↩️ ⚙️ 👨‍🎨 👈 💪 🥉 ▶️️ 🔛 🔝 🔢 👈 🍵 🔗). 👉 🔐 ❔ ✳ 🔨 ⚫️ 🌘 ❔ 🏺 (& 💃) 🔨 ⚫️. ⚫️ 🎏 📟 👜 👈 📶 😆 🔗. !!! check "😮 **FastAPI** " 🔬 ➕ 🔬 💽 🆎 ⚙️ "🔢" 💲 🏷 🔢. 👉 📉 👨‍🎨 🐕‍🦺, & ⚫️ 🚫 💪 Pydantic ⏭. 👉 🤙 😮 🛠️ 🍕 Pydantic, 🐕‍🦺 🎏 🔬 📄 👗 (🌐 👉 🛠️ 🔜 ⏪ 💪 Pydantic). ### 🤗 🤗 🕐 🥇 🛠️ 🛠️ 📄 🛠️ 🔢 🆎 ⚙️ 🐍 🆎 🔑. 👉 👑 💭 👈 😮 🎏 🧰 🎏. ⚫️ ⚙️ 🛃 🆎 🚮 📄 ↩️ 🐩 🐍 🆎, ✋️ ⚫️ 🦏 🔁 ⏩. ⚫️ 🕐 🥇 🛠️ 🏗 🛃 🔗 📣 🎂 🛠️ 🎻. ⚫️ 🚫 ⚓️ 🔛 🐩 💖 🗄 & 🎻 🔗. ⚫️ 🚫🔜 🎯 🛠️ ⚫️ ⏮️ 🎏 🧰, 💖 🦁 🎚. ✋️ 🔄, ⚫️ 📶 💡 💭. ⚫️ ✔️ 😌, ⭐ ⚒: ⚙️ 🎏 🛠️, ⚫️ 💪 ✍ 🔗 & 🇳🇨. ⚫️ ⚓️ 🔛 ⏮️ 🐩 🔁 🐍 🕸 🛠️ (🇨🇻), ⚫️ 💪 🚫 🍵 *️⃣ & 🎏 👜, 👐 ⚫️ ✔️ ↕ 🎭 💁‍♂️. !!! info 🤗 ✍ ✡ 🗄, 🎏 👼 `isort`, 👑 🧰 🔁 😇 🗄 🐍 📁. !!! check "💭 😮 **FastAPI**" 🤗 😮 🍕 APIStar, & 1️⃣ 🧰 👤 🔎 🏆 👍, 🌟 APIStar. 🤗 ℹ 😍 **FastAPI** ⚙️ 🐍 🆎 🔑 📣 🔢, & 🏗 🔗 ⚖ 🛠️ 🔁. 🤗 😮 **FastAPI** 📣 `response` 🔢 🔢 ⚒ 🎚 & 🍪. ### APIStar (<= 0️⃣.5️⃣) ▶️️ ⏭ 🤔 🏗 **FastAPI** 👤 🔎 **APIStar** 💽. ⚫️ ✔️ 🌖 🌐 👤 👀 & ✔️ 👑 🔧. ⚫️ 🕐 🥇 🛠️ 🛠️ ⚙️ 🐍 🆎 🔑 📣 🔢 & 📨 👈 👤 ⏱ 👀 (⏭ NestJS & ♨). 👤 🔎 ⚫️ 🌅 ⚖️ 🌘 🎏 🕰 🤗. ✋️ APIStar ⚙️ 🗄 🐩. ⚫️ ✔️ 🏧 💽 🔬, 💽 🛠️ & 🗄 🔗 ⚡ ⚓️ 🔛 🎏 🆎 🔑 📚 🥉. 💪 🔗 🔑 🚫 ⚙️ 🎏 🐍 🆎 🔑 💖 Pydantic, ⚫️ 🍖 🌅 🎏 🍭,, 👨‍🎨 🐕‍🦺 🚫🔜 👍, ✋️, APIStar 🏆 💪 🎛. ⚫️ ✔️ 🏆 🎭 📇 🕰 (🕴 💥 💃). 🥇, ⚫️ 🚫 ✔️ 🏧 🛠️ 🧾 🕸 🎚, ✋️ 👤 💭 👤 💪 🚮 🦁 🎚 ⚫️. ⚫️ ✔️ 🔗 💉 ⚙️. ⚫️ ✔ 🏤-® 🦲, 🎏 🧰 🔬 🔛. ✋️, ⚫️ 👑 ⚒. 👤 🙅 💪 ⚙️ ⚫️ 🌕 🏗, ⚫️ 🚫 ✔️ 💂‍♂ 🛠️,, 👤 🚫 🚫 ❎ 🌐 ⚒ 👤 ✔️ ⏮️ 🌕-📚 🚂 ⚓️ 🔛 🏺-Apispec. 👤 ✔️ 👇 📈 🏗 ✍ 🚲 📨 ❎ 👈 🛠️. ✋️ ⤴️, 🏗 🎯 🔀. ⚫️ 🙅‍♂ 📏 🛠️ 🕸 🛠️, 👼 💪 🎯 🔛 💃. 🔜 APIStar ⚒ 🧰 ✔ 🗄 🔧, 🚫 🕸 🛠️. !!! info APIStar ✍ ✡ 🇺🇸🏛. 🎏 👨 👈 ✍: * ✳ 🎂 🛠️ * 💃 (❔ **FastAPI** ⚓️) * Uvicorn (⚙️ 💃 & **FastAPI**) !!! check "😮 **FastAPI** " 🔀. 💭 📣 💗 👜 (💽 🔬, 🛠️ & 🧾) ⏮️ 🎏 🐍 🆎, 👈 🎏 🕰 🚚 👑 👨‍🎨 🐕‍🦺, 🕳 👤 🤔 💎 💭. & ⏮️ 🔎 📏 🕰 🎏 🛠️ & 🔬 📚 🎏 🎛, APIStar 🏆 🎛 💪. ⤴️ APIStar ⛔️ 🔀 💽 & 💃 ✍, & 🆕 👻 🏛 ✅ ⚙️. 👈 🏁 🌈 🏗 **FastAPI**. 👤 🤔 **FastAPI** "🛐 👨‍💼" APIStar, ⏪ 📉 & 📈 ⚒, ⌨ ⚙️, & 🎏 🍕, ⚓️ 🔛 🏫 ⚪️➡️ 🌐 👉 ⏮️ 🧰. ## ⚙️ **FastAPI** ### Pydantic Pydantic 🗃 🔬 💽 🔬, 🛠️ & 🧾 (⚙️ 🎻 🔗) ⚓️ 🔛 🐍 🆎 🔑. 👈 ⚒ ⚫️ 📶 🏋️. ⚫️ ⭐ 🍭. 👐 ⚫️ ⏩ 🌘 🍭 📇. & ⚫️ ⚓️ 🔛 🎏 🐍 🆎 🔑, 👨‍🎨 🐕‍🦺 👑. !!! check "**FastAPI** ⚙️ ⚫️" 🍵 🌐 💽 🔬, 💽 🛠️ & 🏧 🏷 🧾 (⚓️ 🔛 🎻 🔗). **FastAPI** ⤴️ ✊ 👈 🎻 🔗 💽 & 🚮 ⚫️ 🗄, ↖️ ⚪️➡️ 🌐 🎏 👜 ⚫️ 🔨. ### 💃 💃 💿 🔫 🛠️/🧰, ❔ 💯 🏗 ↕-🎭 ✳ 🐕‍🦺. ⚫️ 📶 🙅 & 🏋️. ⚫️ 🔧 💪 🏧, & ✔️ 🔧 🦲. ⚫️ ✔️: * 🤙 🎆 🎭. * *️⃣ 🐕‍🦺. * -🛠️ 🖥 📋. * 🕴 & 🤫 🎉. * 💯 👩‍💻 🏗 🔛 🇸🇲. * ⚜, 🗜, 🎻 📁, 🎏 📨. * 🎉 & 🍪 🐕‍🦺. * 1️⃣0️⃣0️⃣ 💯 💯 💰. * 1️⃣0️⃣0️⃣ 💯 🆎 ✍ ✍. * 👩‍❤‍👨 🏋️ 🔗. 💃 ⏳ ⏩ 🐍 🛠️ 💯. 🕴 💥 Uvicorn, ❔ 🚫 🛠️, ✋️ 💽. 💃 🚚 🌐 🔰 🕸 🕸 🛠️. ✋️ ⚫️ 🚫 🚚 🏧 💽 🔬, 🛠️ ⚖️ 🧾. 👈 1️⃣ 👑 👜 👈 **FastAPI** 🚮 🔛 🔝, 🌐 ⚓️ 🔛 🐍 🆎 🔑 (⚙️ Pydantic). 👈, ➕ 🔗 💉 ⚙️, 💂‍♂ 🚙, 🗄 🔗 ⚡, ♒️. !!! note "📡 ℹ" 🔫 🆕 "🐩" ➖ 🛠️ ✳ 🐚 🏉 👨‍🎓. ⚫️ 🚫 "🐍 🐩" (🇩🇬), 👐 👫 🛠️ 🔨 👈. 👐, ⚫️ ⏪ ➖ ⚙️ "🐩" 📚 🧰. 👉 📉 📉 🛠️, 👆 💪 🎛 Uvicorn 🙆 🎏 🔫 💽 (💖 👸 ⚖️ Hypercorn), ⚖️ 👆 💪 🚮 🔫 🔗 🧰, 💖 `python-socketio`. !!! check "**FastAPI** ⚙️ ⚫️" 🍵 🌐 🐚 🕸 🍕. ❎ ⚒ 🔛 🔝. 🎓 `FastAPI` ⚫️ 😖 🔗 ⚪️➡️ 🎓 `Starlette`. , 🕳 👈 👆 💪 ⏮️ 💃, 👆 💪 ⚫️ 🔗 ⏮️ **FastAPI**, ⚫️ 🌖 💃 🔛 💊. ### Uvicorn Uvicorn 🌩-⏩ 🔫 💽, 🏗 🔛 uvloop & httptool. ⚫️ 🚫 🕸 🛠️, ✋️ 💽. 🖼, ⚫️ 🚫 🚚 🧰 🕹 ➡. 👈 🕳 👈 🛠️ 💖 💃 (⚖️ **FastAPI**) 🔜 🚚 🔛 🔝. ⚫️ 👍 💽 💃 & **FastAPI**. !!! check "**FastAPI** 👍 ⚫️" 👑 🕸 💽 🏃 **FastAPI** 🈸. 👆 💪 🌀 ⚫️ ⏮️ 🐁, ✔️ 🔁 👁-🛠️ 💽. ✅ 🌅 ℹ [🛠️](deployment/index.md){.internal-link target=_blank} 📄. ## 📇 & 🚅 🤔, 🔬, & 👀 🔺 🖖 Uvicorn, 💃 & FastAPI, ✅ 📄 🔃 [📇](benchmarks.md){.internal-link target=_blank}. fastapi-0.110.3/docs/em/docs/async.md000066400000000000000000000452371461403617600172460ustar00rootroot00000000000000# 🛠️ & 🔁 / ⌛ ℹ 🔃 `async def` ❕ *➡ 🛠️ 🔢* & 🖥 🔃 🔁 📟, 🛠️, & 🔁. ## 🏃 ❓ 🆑;👩‍⚕️: 🚥 👆 ⚙️ 🥉 🥳 🗃 👈 💬 👆 🤙 👫 ⏮️ `await`, 💖: ```Python results = await some_library() ``` ⤴️, 📣 👆 *➡ 🛠️ 🔢* ⏮️ `async def` 💖: ```Python hl_lines="2" @app.get('/') async def read_results(): results = await some_library() return results ``` !!! note 👆 💪 🕴 ⚙️ `await` 🔘 🔢 ✍ ⏮️ `async def`. --- 🚥 👆 ⚙️ 🥉 🥳 🗃 👈 🔗 ⏮️ 🕳 (💽, 🛠️, 📁 ⚙️, ♒️.) & 🚫 ✔️ 🐕‍🦺 ⚙️ `await`, (👉 ⏳ 💼 🌅 💽 🗃), ⤴️ 📣 👆 *➡ 🛠️ 🔢* 🛎, ⏮️ `def`, 💖: ```Python hl_lines="2" @app.get('/') def results(): results = some_library() return results ``` --- 🚥 👆 🈸 (😫) 🚫 ✔️ 🔗 ⏮️ 🕳 🙆 & ⌛ ⚫️ 📨, ⚙️ `async def`. --- 🚥 👆 🚫 💭, ⚙️ 😐 `def`. --- **🗒**: 👆 💪 🌀 `def` & `async def` 👆 *➡ 🛠️ 🔢* 🌅 👆 💪 & 🔬 🔠 1️⃣ ⚙️ 🏆 🎛 👆. FastAPI 🔜 ▶️️ 👜 ⏮️ 👫. 😆, 🙆 💼 🔛, FastAPI 🔜 👷 🔁 & 📶 ⏩. ✋️ 📄 📶 🔛, ⚫️ 🔜 💪 🎭 🛠️. ## 📡 ℹ 🏛 ⏬ 🐍 ✔️ 🐕‍🦺 **"🔁 📟"** ⚙️ 🕳 🤙 **"🔁"**, ⏮️ **`async` & `await`** ❕. ➡️ 👀 👈 🔤 🍕 📄 🔛: * **🔁 📟** * **`async` & `await`** * **🔁** ## 🔁 📟 🔁 📟 ⛓ 👈 🇪🇸 👶 ✔️ 🌌 💬 💻 / 📋 👶 👈 ☝ 📟, ⚫️ 👶 🔜 ✔️ ⌛ *🕳 🙆* 🏁 👱 🙆. ➡️ 💬 👈 *🕳 🙆* 🤙 "🐌-📁" 👶. , ⏮️ 👈 🕰, 💻 💪 🚶 & 🎏 👷, ⏪ "🐌-📁" 👶 🏁. ⤴️ 💻 / 📋 👶 🔜 👟 🔙 🔠 🕰 ⚫️ ✔️ 🤞 ↩️ ⚫️ ⌛ 🔄, ⚖️ 🕐❔ ⚫️ 👶 🏁 🌐 👷 ⚫️ ✔️ 👈 ☝. & ⚫️ 👶 🔜 👀 🚥 🙆 📋 ⚫️ ⌛ ✔️ ⏪ 🏁, 🤸 ⚫️❔ ⚫️ ✔️. ⏭, ⚫️ 👶 ✊ 🥇 📋 🏁 (➡️ 💬, 👆 "🐌-📁" 👶) & 😣 ⚫️❔ ⚫️ ✔️ ⏮️ ⚫️. 👈 "⌛ 🕳 🙆" 🛎 🔗 👤/🅾 🛠️ 👈 📶 "🐌" (🔬 🚅 🕹 & 💾 💾), 💖 ⌛: * 📊 ⚪️➡️ 👩‍💻 📨 🔘 🕸 * 📊 📨 👆 📋 📨 👩‍💻 🔘 🕸 * 🎚 📁 💾 ✍ ⚙️ & 🤝 👆 📋 * 🎚 👆 📋 🤝 ⚙️ ✍ 💾 * 🛰 🛠️ 🛠️ * 💽 🛠️ 🏁 * 💽 🔢 📨 🏁 * ♒️. 🛠️ 🕰 🍴 ✴️ ⌛ 👤/🅾 🛠️, 👫 🤙 👫 "👤/🅾 🔗" 🛠️. ⚫️ 🤙 "🔁" ↩️ 💻 / 📋 🚫 ✔️ "🔁" ⏮️ 🐌 📋, ⌛ ☑ 🙍 👈 📋 🏁, ⏪ 🔨 🕳, 💪 ✊ 📋 🏁 & 😣 👷. ↩️ 👈, 💆‍♂ "🔁" ⚙️, 🕐 🏁, 📋 💪 ⌛ ⏸ 🐥 👄 (⏲) 💻 / 📋 🏁 ⚫️❔ ⚫️ 🚶, & ⤴️ 👟 🔙 ✊ 🏁 & 😣 👷 ⏮️ 👫. "🔁" (👽 "🔁") 👫 🛎 ⚙️ ⚖ "🔁", ↩️ 💻 / 📋 ⏩ 🌐 📶 🔁 ⏭ 🔀 🎏 📋, 🚥 👈 🔁 🔌 ⌛. ### 🛠️ & 🍔 👉 💭 **🔁** 📟 🔬 🔛 🕣 🤙 **"🛠️"**. ⚫️ 🎏 ⚪️➡️ **"🔁"**. **🛠️** & **🔁** 👯‍♂️ 🔗 "🎏 👜 😥 🌅 ⚖️ 🌘 🎏 🕰". ✋️ ℹ 🖖 *🛠️* & *🔁* 🎏. 👀 🔺, 🌈 📄 📖 🔃 🍔: ### 🛠️ 🍔 👆 🚶 ⏮️ 👆 🥰 🤚 ⏩ 🥕, 👆 🧍 ⏸ ⏪ 🏧 ✊ ✔ ⚪️➡️ 👫👫 🚪 👆. 👶 ⤴️ ⚫️ 👆 🔄, 👆 🥉 👆 ✔ 2️⃣ 📶 🎀 🍔 👆 🥰 & 👆. 👶 👶 🏧 💬 🕳 🍳 👨‍🍳 👫 💭 👫 ✔️ 🏗 👆 🍔 (✋️ 👫 ⏳ 🏗 🕐 ⏮️ 👩‍💻). 👆 💸. 👶 🏧 🤝 👆 🔢 👆 🔄. ⏪ 👆 ⌛, 👆 🚶 ⏮️ 👆 🥰 & ⚒ 🏓, 👆 🧎 & 💬 ⏮️ 👆 🥰 📏 🕰 (👆 🍔 📶 🎀 & ✊ 🕰 🏗). 👆 🏖 🏓 ⏮️ 👆 🥰, ⏪ 👆 ⌛ 🍔, 👆 💪 💸 👈 🕰 😮 ❔ 👌, 🐨 & 🙃 👆 🥰 👶 👶 👶. ⏪ ⌛ & 💬 👆 🥰, ⚪️➡️ 🕰 🕰, 👆 ✅ 🔢 🖥 🔛 ⏲ 👀 🚥 ⚫️ 👆 🔄 ⏪. ⤴️ ☝, ⚫️ 😒 👆 🔄. 👆 🚶 ⏲, 🤚 👆 🍔 & 👟 🔙 🏓. 👆 & 👆 🥰 🍴 🍔 & ✔️ 👌 🕰. 👶 !!! info 🌹 🖼 👯 🍏. 👶 --- 🌈 👆 💻 / 📋 👶 👈 📖. ⏪ 👆 ⏸, 👆 ⛽ 👶, ⌛ 👆 🔄, 🚫 🔨 🕳 📶 "😌". ✋️ ⏸ ⏩ ↩️ 🏧 🕴 ✊ ✔ (🚫 🏗 👫), 👈 👌. ⤴️, 🕐❔ ⚫️ 👆 🔄, 👆 ☑ "😌" 👷, 👆 🛠️ 🍣, 💭 ⚫️❔ 👆 💚, 🤚 👆 🥰 ⚒, 💸, ✅ 👈 👆 🤝 ☑ 💵 ⚖️ 💳, ✅ 👈 👆 🈚 ☑, ✅ 👈 ✔ ✔️ ☑ 🏬, ♒️. ✋️ ⤴️, ✋️ 👆 🚫 ✔️ 👆 🍔, 👆 👷 ⏮️ 🏧 "🔛 ⏸" ⏸, ↩️ 👆 ✔️ ⌛ 👶 👆 🍔 🔜. ✋️ 👆 🚶 ↖️ ⚪️➡️ ⏲ & 🧎 🏓 ⏮️ 🔢 👆 🔄, 👆 💪 🎛 👶 👆 🙋 👆 🥰, & "👷" 👶 👶 🔛 👈. ⤴️ 👆 🔄 🔨 🕳 📶 "😌" 😏 ⏮️ 👆 🥰 👶. ⤴️ 🏧 👶 💬 "👤 🏁 ⏮️ 🔨 🍔" 🚮 👆 🔢 🔛 ⏲ 🖥, ✋️ 👆 🚫 🦘 💖 😜 ⏪ 🕐❔ 🖥 🔢 🔀 👆 🔄 🔢. 👆 💭 🙅‍♂ 1️⃣ 🔜 📎 👆 🍔 ↩️ 👆 ✔️ 🔢 👆 🔄, & 👫 ✔️ 👫. 👆 ⌛ 👆 🥰 🏁 📖 (🏁 ⏮️ 👷 👶 / 📋 ➖ 🛠️ 👶), 😀 🖐 & 💬 👈 👆 🔜 🍔 ⏸. ⤴️ 👆 🚶 ⏲ 👶, ▶️ 📋 👈 🔜 🏁 👶, ⚒ 🍔, 💬 👏 & ✊ 👫 🏓. 👈 🏁 👈 🔁 / 📋 🔗 ⏮️ ⏲ ⏹. 👈 🔄, ✍ 🆕 📋, "🍴 🍔" 👶 👶, ✋️ ⏮️ 1️⃣ "🤚 🍔" 🏁 ⏹. ### 🔗 🍔 🔜 ➡️ 🌈 👫 ➖🚫 🚫 "🛠️ 🍔", ✋️ "🔗 🍔". 👆 🚶 ⏮️ 👆 🥰 🤚 🔗 ⏩ 🥕. 👆 🧍 ⏸ ⏪ 📚 (➡️ 💬 8️⃣) 🏧 👈 🎏 🕰 🍳 ✊ ✔ ⚪️➡️ 👫👫 🚪 👆. 👱 ⏭ 👆 ⌛ 👫 🍔 🔜 ⏭ 🍂 ⏲ ↩️ 🔠 8️⃣ 🏧 🚶 & 🏗 🍔 ▶️️ ↖️ ⏭ 💆‍♂ ⏭ ✔. ⤴️ ⚫️ 😒 👆 🔄, 👆 🥉 👆 ✔ 2️⃣ 📶 🎀 🍔 👆 🥰 & 👆. 👆 💸 👶. 🏧 🚶 👨‍🍳. 👆 ⌛, 🧍 🚪 ⏲ 👶, 👈 🙅‍♂ 1️⃣ 🙆 ✊ 👆 🍔 ⏭ 👆, 📤 🙅‍♂ 🔢 🔄. 👆 & 👆 🥰 😩 🚫 ➡️ 🙆 🤚 🚪 👆 & ✊ 👆 🍔 🕐❔ 👫 🛬, 👆 🚫🔜 💸 🙋 👆 🥰. 👶 👉 "🔁" 👷, 👆 "🔁" ⏮️ 🏧/🍳 👶 👶. 👆 ✔️ ⌛ 👶 & 📤 ☑ 🙍 👈 🏧/🍳 👶 👶 🏁 🍔 & 🤝 👫 👆, ⚖️ ⏪, 👱 🙆 💪 ✊ 👫. ⤴️ 👆 🏧/🍳 👶 👶 😒 👟 🔙 ⏮️ 👆 🍔, ⏮️ 📏 🕰 ⌛ 👶 📤 🚪 ⏲. 👆 ✊ 👆 🍔 & 🚶 🏓 ⏮️ 👆 🥰. 👆 🍴 👫, & 👆 🔨. ⏹ 📤 🚫 🌅 💬 ⚖️ 😏 🌅 🕰 💸 ⌛ 👶 🚪 ⏲. 👶 !!! info 🌹 🖼 👯 🍏. 👶 --- 👉 😐 🔗 🍔, 👆 💻 / 📋 👶 ⏮️ 2️⃣ 🕹 (👆 & 👆 🥰), 👯‍♂️ ⌛ 👶 & 💡 👫 🙋 👶 "⌛ 🔛 ⏲" 👶 📏 🕰. ⏩ 🥕 🏪 ✔️ 8️⃣ 🕹 (🏧/🍳). ⏪ 🛠️ 🍔 🏪 💪 ✔️ ✔️ 🕴 2️⃣ (1️⃣ 🏧 & 1️⃣ 🍳). ✋️, 🏁 💡 🚫 🏆. 👶 --- 👉 🔜 🔗 🌓 📖 🍔. 👶 🌅 "🎰 👨‍❤‍👨" 🖼 👉, 🌈 🏦. 🆙 ⏳, 🏆 🏦 ✔️ 💗 🏧 👶 👶 👶 👶 👶 👶 👶 👶 & 🦏 ⏸ 👶 👶 👶 👶 👶 👶 👶 👶. 🌐 🏧 🔨 🌐 👷 ⏮️ 1️⃣ 👩‍💻 ⏮️ 🎏 👶 👶 👶. & 👆 ✔️ ⌛ 👶 ⏸ 📏 🕰 ⚖️ 👆 💸 👆 🔄. 👆 🎲 🚫🔜 💚 ✊ 👆 🥰 👶 ⏮️ 👆 👷 🏦 👶. ### 🍔 🏁 👉 😐 "⏩ 🥕 🍔 ⏮️ 👆 🥰", 📤 📚 ⌛ 👶, ⚫️ ⚒ 📚 🌅 🔑 ✔️ 🛠️ ⚙️ ⏸ 👶 👶. 👉 💼 🌅 🕸 🈸. 📚, 📚 👩‍💻, ✋️ 👆 💽 ⌛ 👶 👫 🚫--👍 🔗 📨 👫 📨. & ⤴️ ⌛ 👶 🔄 📨 👟 🔙. 👉 "⌛" 👶 ⚖ ⏲, ✋️, ⚖ ⚫️ 🌐, ⚫️ 📚 ⌛ 🔚. 👈 ⚫️❔ ⚫️ ⚒ 📚 🔑 ⚙️ 🔁 ⏸ 👶 👶 📟 🕸 🔗. 👉 😇 🔀 ⚫️❔ ⚒ ✳ 🌟 (✋️ ✳ 🚫 🔗) & 👈 💪 🚶 🛠️ 🇪🇸. & 👈 🎏 🎚 🎭 👆 🤚 ⏮️ **FastAPI**. & 👆 💪 ✔️ 🔁 & 🔀 🎏 🕰, 👆 🤚 ↕ 🎭 🌘 🌅 💯 ✳ 🛠️ & 🔛 🇷🇪 ⏮️ 🚶, ❔ ✍ 🇪🇸 🔐 🅱 (🌐 👏 💃). ### 🛠️ 👍 🌘 🔁 ❓ 😆 ❗ 👈 🚫 🛐 📖. 🛠️ 🎏 🌘 🔁. & ⚫️ 👻 🔛 **🎯** 😐 👈 🔌 📚 ⌛. ↩️ 👈, ⚫️ 🛎 📚 👍 🌘 🔁 🕸 🈸 🛠️. ✋️ 🚫 🌐. , ⚖ 👈 👅, 🌈 📄 📏 📖: > 👆 ✔️ 🧹 🦏, 💩 🏠. *😆, 👈 🎂 📖*. --- 📤 🙅‍♂ ⌛ 👶 🙆, 📚 👷 🔨, 🔛 💗 🥉 🏠. 👆 💪 ✔️ 🔄 🍔 🖼, 🥇 🏠 🧖‍♂, ⤴️ 👨‍🍳, ✋️ 👆 🚫 ⌛ 👶 🕳, 🧹 & 🧹, 🔄 🚫🔜 📉 🕳. ⚫️ 🔜 ✊ 🎏 💸 🕰 🏁 ⏮️ ⚖️ 🍵 🔄 (🛠️) & 👆 🔜 ✔️ ⌛ 🎏 💸 👷. ✋️ 👉 💼, 🚥 👆 💪 ✊️ 8️⃣ 👰-🏧/🍳/🔜-🧹, & 🔠 1️⃣ 👫 (➕ 👆) 💪 ✊ 🏒 🏠 🧹 ⚫️, 👆 💪 🌐 👷 **🔗**, ⏮️ ➕ ℹ, & 🏁 🌅 🔜. 👉 😐, 🔠 1️⃣ 🧹 (🔌 👆) 🔜 🕹, 🤸 👫 🍕 👨‍🏭. & 🏆 🛠️ 🕰 ✊ ☑ 👷 (↩️ ⌛), & 👷 💻 ⌛ 💽, 👫 🤙 👫 ⚠ "💽 🎁". --- ⚠ 🖼 💽 🔗 🛠️ 👜 👈 🚚 🏗 🧪 🏭. 🖼: * **🎧** ⚖️ **🖼 🏭**. * **💻 👓**: 🖼 ✍ 💯 🔅, 🔠 🔅 ✔️ 3️⃣ 💲 / 🎨, 🏭 👈 🛎 🚚 💻 🕳 🔛 📚 🔅, 🌐 🎏 🕰. * **🎰 🏫**: ⚫️ 🛎 🚚 📚 "✖" & "🖼" ✖. 💭 🦏 📋 ⏮️ 🔢 & ✖ 🌐 👫 👯‍♂️ 🎏 🕰. * **⏬ 🏫**: 👉 🎧-🏑 🎰 🏫,, 🎏 ✔. ⚫️ 👈 📤 🚫 👁 📋 🔢 ✖, ✋️ 🦏 ⚒ 👫, & 📚 💼, 👆 ⚙️ 🎁 🕹 🏗 & / ⚖️ ⚙️ 👈 🏷. ### 🛠️ ➕ 🔁: 🕸 ➕ 🎰 🏫 ⏮️ **FastAPI** 👆 💪 ✊ 📈 🛠️ 👈 📶 ⚠ 🕸 🛠️ (🎏 👑 🧲 ✳). ✋️ 👆 💪 🐄 💰 🔁 & 💾 (✔️ 💗 🛠️ 🏃‍♂ 🔗) **💽 🎁** ⚖ 💖 👈 🎰 🏫 ⚙️. 👈, ➕ 🙅 👐 👈 🐍 👑 🇪🇸 **💽 🧪**, 🎰 🏫 & ✴️ ⏬ 🏫, ⚒ FastAPI 📶 👍 🏏 💽 🧪 / 🎰 🏫 🕸 🔗 & 🈸 (👪 📚 🎏). 👀 ❔ 🏆 👉 🔁 🏭 👀 📄 🔃 [🛠️](deployment/index.md){.internal-link target=_blank}. ## `async` & `await` 🏛 ⏬ 🐍 ✔️ 📶 🏋️ 🌌 🔬 🔁 📟. 👉 ⚒ ⚫️ 👀 💖 😐 "🔁" 📟 & "⌛" 👆 ▶️️ 🙍. 🕐❔ 📤 🛠️ 👈 🔜 🚚 ⌛ ⏭ 🤝 🏁 & ✔️ 🐕‍🦺 👉 🆕 🐍 ⚒, 👆 💪 📟 ⚫️ 💖: ```Python burgers = await get_burgers(2) ``` 🔑 📥 `await`. ⚫️ 💬 🐍 👈 ⚫️ ✔️ ⌛ ⏸ `get_burgers(2)` 🏁 🔨 🚮 👜 👶 ⏭ ♻ 🏁 `burgers`. ⏮️ 👈, 🐍 🔜 💭 👈 ⚫️ 💪 🚶 & 🕳 🙆 👶 👶 👐 (💖 📨 ➕1️⃣ 📨). `await` 👷, ⚫️ ✔️ 🔘 🔢 👈 🐕‍🦺 👉 🔀. 👈, 👆 📣 ⚫️ ⏮️ `async def`: ```Python hl_lines="1" async def get_burgers(number: int): # Do some asynchronous stuff to create the burgers return burgers ``` ...↩️ `def`: ```Python hl_lines="2" # This is not asynchronous def get_sequential_burgers(number: int): # Do some sequential stuff to create the burgers return burgers ``` ⏮️ `async def`, 🐍 💭 👈, 🔘 👈 🔢, ⚫️ ✔️ 🤔 `await` 🧬, & 👈 ⚫️ 💪 "⏸" ⏸ 🛠️ 👈 🔢 & 🚶 🕳 🙆 👶 ⏭ 👟 🔙. 🕐❔ 👆 💚 🤙 `async def` 🔢, 👆 ✔️ "⌛" ⚫️. , 👉 🏆 🚫 👷: ```Python # This won't work, because get_burgers was defined with: async def burgers = get_burgers(2) ``` --- , 🚥 👆 ⚙️ 🗃 👈 💬 👆 👈 👆 💪 🤙 ⚫️ ⏮️ `await`, 👆 💪 ✍ *➡ 🛠️ 🔢* 👈 ⚙️ ⚫️ ⏮️ `async def`, 💖: ```Python hl_lines="2-3" @app.get('/burgers') async def read_burgers(): burgers = await get_burgers(2) return burgers ``` ### 🌅 📡 ℹ 👆 💪 ✔️ 👀 👈 `await` 💪 🕴 ⚙️ 🔘 🔢 🔬 ⏮️ `async def`. ✋️ 🎏 🕰, 🔢 🔬 ⏮️ `async def` ✔️ "⌛". , 🔢 ⏮️ `async def` 💪 🕴 🤙 🔘 🔢 🔬 ⏮️ `async def` 💁‍♂️. , 🔃 🥚 & 🐔, ❔ 👆 🤙 🥇 `async` 🔢 ❓ 🚥 👆 👷 ⏮️ **FastAPI** 👆 🚫 ✔️ 😟 🔃 👈, ↩️ 👈 "🥇" 🔢 🔜 👆 *➡ 🛠️ 🔢*, & FastAPI 🔜 💭 ❔ ▶️️ 👜. ✋️ 🚥 👆 💚 ⚙️ `async` / `await` 🍵 FastAPI, 👆 💪 ⚫️ 👍. ### ✍ 👆 👍 🔁 📟 💃 (& **FastAPI**) ⚓️ 🔛 AnyIO, ❔ ⚒ ⚫️ 🔗 ⏮️ 👯‍♂️ 🐍 🐩 🗃 & 🎻. 🎯, 👆 💪 🔗 ⚙️ AnyIO 👆 🏧 🛠️ ⚙️ 💼 👈 🚚 🌅 🏧 ⚓ 👆 👍 📟. & 🚥 👆 🚫 ⚙️ FastAPI, 👆 💪 ✍ 👆 👍 🔁 🈸 ⏮️ AnyIO 🏆 🔗 & 🤚 🚮 💰 (✅ *📊 🛠️*). ### 🎏 📨 🔁 📟 👉 👗 ⚙️ `async` & `await` 📶 🆕 🇪🇸. ✋️ ⚫️ ⚒ 👷 ⏮️ 🔁 📟 📚 ⏩. 👉 🎏 ❕ (⚖️ 🌖 🌓) 🔌 ⏳ 🏛 ⏬ 🕸 (🖥 & ✳). ✋️ ⏭ 👈, 🚚 🔁 📟 🌖 🏗 & ⚠. ⏮️ ⏬ 🐍, 👆 💪 ✔️ ⚙️ 🧵 ⚖️ 🐁. ✋️ 📟 🌌 🌖 🏗 🤔, ℹ, & 💭 🔃. ⏮️ ⏬ ✳ / 🖥 🕸, 👆 🔜 ✔️ ⚙️ "⏲". ❔ ↘️ ⏲ 🔥😈. ## 🔁 **🔁** 📶 🎀 ⚖ 👜 📨 `async def` 🔢. 🐍 💭 👈 ⚫️ 🕳 💖 🔢 👈 ⚫️ 💪 ▶️ & 👈 ⚫️ 🔜 🔚 ☝, ✋️ 👈 ⚫️ 5️⃣📆 ⏸ ⏸ 🔘 💁‍♂️, 🕐❔ 📤 `await` 🔘 ⚫️. ✋️ 🌐 👉 🛠️ ⚙️ 🔁 📟 ⏮️ `async` & `await` 📚 🕰 🔬 ⚙️ "🔁". ⚫️ ⭐ 👑 🔑 ⚒ 🚶, "🔁". ## 🏁 ➡️ 👀 🎏 🔤 ⚪️➡️ 🔛: > 🏛 ⏬ 🐍 ✔️ 🐕‍🦺 **"🔁 📟"** ⚙️ 🕳 🤙 **"🔁"**, ⏮️ **`async` & `await`** ❕. 👈 🔜 ⚒ 🌅 🔑 🔜. 👶 🌐 👈 ⚫️❔ 🏋️ FastAPI (🔘 💃) & ⚫️❔ ⚒ ⚫️ ✔️ ✅ 🎆 🎭. ## 📶 📡 ℹ !!! warning 👆 💪 🎲 🚶 👉. 👉 📶 📡 ℹ ❔ **FastAPI** 👷 🔘. 🚥 👆 ✔️ 📡 💡 (🈶-🏋, 🧵, 🍫, ♒️.) & 😟 🔃 ❔ FastAPI 🍵 `async def` 🆚 😐 `def`, 🚶 ⤴️. ### ➡ 🛠️ 🔢 🕐❔ 👆 📣 *➡ 🛠️ 🔢* ⏮️ 😐 `def` ↩️ `async def`, ⚫️ 🏃 🔢 🧵 👈 ⤴️ ⌛, ↩️ ➖ 🤙 🔗 (⚫️ 🔜 🍫 💽). 🚥 👆 👟 ⚪️➡️ ➕1️⃣ 🔁 🛠️ 👈 🔨 🚫 👷 🌌 🔬 🔛 & 👆 ⚙️ ⚖ 🙃 📊-🕴 *➡ 🛠️ 🔢* ⏮️ ✅ `def` 🤪 🎭 📈 (🔃 1️⃣0️⃣0️⃣ 💓), 🙏 🗒 👈 **FastAPI** ⭐ 🔜 🔄. 👫 💼, ⚫️ 👻 ⚙️ `async def` 🚥 👆 *➡ 🛠️ 🔢* ⚙️ 📟 👈 🎭 🚧 👤/🅾. , 👯‍♂️ ⚠, 🤞 👈 **FastAPI** 🔜 [⏩](index.md#_15){.internal-link target=_blank} 🌘 (⚖️ 🌘 ⭐) 👆 ⏮️ 🛠️. ### 🔗 🎏 ✔ [🔗](tutorial/dependencies/index.md){.internal-link target=_blank}. 🚥 🔗 🐩 `def` 🔢 ↩️ `async def`, ⚫️ 🏃 🔢 🧵. ### 🎧-🔗 👆 💪 ✔️ 💗 🔗 & [🎧-🔗](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} 🚫 🔠 🎏 (🔢 🔢 🔑), 👫 💪 ✍ ⏮️ `async def` & ⏮️ 😐 `def`. ⚫️ 🔜 👷, & 🕐 ✍ ⏮️ 😐 `def` 🔜 🤙 🔛 🔢 🧵 (⚪️➡️ 🧵) ↩️ ➖ "⌛". ### 🎏 🚙 🔢 🙆 🎏 🚙 🔢 👈 👆 🤙 🔗 💪 ✍ ⏮️ 😐 `def` ⚖️ `async def` & FastAPI 🏆 🚫 📉 🌌 👆 🤙 ⚫️. 👉 🔅 🔢 👈 FastAPI 🤙 👆: *➡ 🛠️ 🔢* & 🔗. 🚥 👆 🚙 🔢 😐 🔢 ⏮️ `def`, ⚫️ 🔜 🤙 🔗 (👆 ✍ ⚫️ 👆 📟), 🚫 🧵, 🚥 🔢 ✍ ⏮️ `async def` ⤴️ 👆 🔜 `await` 👈 🔢 🕐❔ 👆 🤙 ⚫️ 👆 📟. --- 🔄, 👉 📶 📡 ℹ 👈 🔜 🎲 ⚠ 🚥 👆 👟 🔎 👫. ⏪, 👆 🔜 👍 ⏮️ 📄 ⚪️➡️ 📄 🔛: 🏃 ❓. fastapi-0.110.3/docs/em/docs/benchmarks.md000066400000000000000000000053741461403617600202440ustar00rootroot00000000000000# 📇 🔬 🇸🇲 📇 🎦 **FastAPI** 🈸 🏃‍♂ 🔽 Uvicorn 1️⃣ ⏩ 🐍 🛠️ 💪, 🕴 🔛 💃 & Uvicorn 👫 (⚙️ 🔘 FastAPI). (*) ✋️ 🕐❔ ✅ 📇 & 🔺 👆 🔜 ✔️ 📄 🤯. ## 📇 & 🚅 🕐❔ 👆 ✅ 📇, ⚫️ ⚠ 👀 📚 🧰 🎏 🆎 🔬 🌓. 🎯, 👀 Uvicorn, 💃 & FastAPI 🔬 👯‍♂️ (👪 📚 🎏 🧰). 🙅 ⚠ ❎ 🧰, 👍 🎭 ⚫️ 🔜 🤚. & 🏆 📇 🚫 💯 🌖 ⚒ 🚚 🧰. 🔗 💖: * **Uvicorn**: 🔫 💽 * **💃**: (⚙️ Uvicorn) 🕸 🕸 * **FastAPI**: (⚙️ 💃) 🛠️ 🕸 ⏮️ 📚 🌖 ⚒ 🏗 🔗, ⏮️ 💽 🔬, ♒️. * **Uvicorn**: * 🔜 ✔️ 🏆 🎭, ⚫️ 🚫 ✔️ 🌅 ➕ 📟 ↖️ ⚪️➡️ 💽 ⚫️. * 👆 🚫🔜 ✍ 🈸 Uvicorn 🔗. 👈 🔜 ⛓ 👈 👆 📟 🔜 ✔️ 🔌 🌖 ⚖️ 🌘, 🌘, 🌐 📟 🚚 💃 (⚖️ **FastAPI**). & 🚥 👆 👈, 👆 🏁 🈸 🔜 ✔️ 🎏 🌥 ✔️ ⚙️ 🛠️ & 📉 👆 📱 📟 & 🐛. * 🚥 👆 ⚖ Uvicorn, 🔬 ⚫️ 🛡 👸, Hypercorn, ✳, ♒️. 🈸 💽. * **💃**: * 🔜 ✔️ ⏭ 🏆 🎭, ⏮️ Uvicorn. 👐, 💃 ⚙️ Uvicorn 🏃. , ⚫️ 🎲 💪 🕴 🤚 "🐌" 🌘 Uvicorn ✔️ 🛠️ 🌅 📟. * ✋️ ⚫️ 🚚 👆 🧰 🏗 🙅 🕸 🈸, ⏮️ 🕹 ⚓️ 🔛 ➡, ♒️. * 🚥 👆 ⚖ 💃, 🔬 ⚫️ 🛡 🤣, 🏺, ✳, ♒️. 🕸 🛠️ (⚖️ 🕸). * **FastAPI**: * 🎏 🌌 👈 💃 ⚙️ Uvicorn & 🚫🔜 ⏩ 🌘 ⚫️, **FastAPI** ⚙️ 💃, ⚫️ 🚫🔜 ⏩ 🌘 ⚫️. * FastAPI 🚚 🌅 ⚒ 🔛 🔝 💃. ⚒ 👈 👆 🌖 🕧 💪 🕐❔ 🏗 🔗, 💖 💽 🔬 & 🛠️. & ⚙️ ⚫️, 👆 🤚 🏧 🧾 🆓 (🏧 🧾 🚫 🚮 🌥 🏃‍♂ 🈸, ⚫️ 🏗 🔛 🕴). * 🚥 👆 🚫 ⚙️ FastAPI & ⚙️ 💃 🔗 (⚖️ ➕1️⃣ 🧰, 💖 🤣, 🏺, 🆘, ♒️) 👆 🔜 ✔️ 🛠️ 🌐 💽 🔬 & 🛠️ 👆. , 👆 🏁 🈸 🔜 ✔️ 🎏 🌥 🚥 ⚫️ 🏗 ⚙️ FastAPI. & 📚 💼, 👉 💽 🔬 & 🛠️ 🦏 💸 📟 ✍ 🈸. * , ⚙️ FastAPI 👆 ♻ 🛠️ 🕰, 🐛, ⏸ 📟, & 👆 🔜 🎲 🤚 🎏 🎭 (⚖️ 👍) 👆 🔜 🚥 👆 🚫 ⚙️ ⚫️ (👆 🔜 ✔️ 🛠️ ⚫️ 🌐 👆 📟). * 🚥 👆 ⚖ FastAPI, 🔬 ⚫️ 🛡 🕸 🈸 🛠️ (⚖️ ⚒ 🧰) 👈 🚚 💽 🔬, 🛠️ & 🧾, 💖 🏺-apispec, NestJS, ♨, ♒️. 🛠️ ⏮️ 🛠️ 🏧 💽 🔬, 🛠️ & 🧾. fastapi-0.110.3/docs/em/docs/contributing.md000066400000000000000000000266661461403617600206450ustar00rootroot00000000000000# 🛠️ - 📉 🥇, 👆 💪 💚 👀 🔰 🌌 [ℹ FastAPI & 🤚 ℹ](help-fastapi.md){.internal-link target=_blank}. ## 🛠️ 🚥 👆 ⏪ 🖖 🗃 & 👆 💭 👈 👆 💪 ⏬ 🤿 📟, 📥 📄 ⚒ 🆙 👆 🌐. ### 🕹 🌐 ⏮️ `venv` 👆 💪 ✍ 🕹 🌐 📁 ⚙️ 🐍 `venv` 🕹:
```console $ python -m venv env ```
👈 🔜 ✍ 📁 `./env/` ⏮️ 🐍 💱 & ⤴️ 👆 🔜 💪 ❎ 📦 👈 ❎ 🌐. ### 🔓 🌐 🔓 🆕 🌐 ⏮️: === "💾, 🇸🇻"
```console $ source ./env/bin/activate ```
=== "🚪 📋"
```console $ .\env\Scripts\Activate.ps1 ```
=== "🚪 🎉" ⚖️ 🚥 👆 ⚙️ 🎉 🖥 (✅ 🐛 🎉):
```console $ source ./env/Scripts/activate ```
✅ ⚫️ 👷, ⚙️: === "💾, 🇸🇻, 🚪 🎉"
```console $ which pip some/directory/fastapi/env/bin/pip ```
=== "🚪 📋"
```console $ Get-Command pip some/directory/fastapi/env/bin/pip ```
🚥 ⚫️ 🎦 `pip` 💱 `env/bin/pip` ⤴️ ⚫️ 👷. 👶 ⚒ 💭 👆 ✔️ 📰 🐖 ⏬ 🔛 👆 🕹 🌐 ❎ ❌ 🔛 ⏭ 📶:
```console $ python -m pip install --upgrade pip ---> 100% ```
!!! tip 🔠 🕰 👆 ❎ 🆕 📦 ⏮️ `pip` 🔽 👈 🌐, 🔓 🌐 🔄. 👉 ⚒ 💭 👈 🚥 👆 ⚙️ 📶 📋 ❎ 👈 📦, 👆 ⚙️ 1️⃣ ⚪️➡️ 👆 🇧🇿 🌐 & 🚫 🙆 🎏 👈 💪 ❎ 🌐. ### 🐖 ⏮️ 🔓 🌐 🔬 🔛:
```console $ pip install -r requirements.txt ---> 100% ```
⚫️ 🔜 ❎ 🌐 🔗 & 👆 🇧🇿 FastAPI 👆 🇧🇿 🌐. #### ⚙️ 👆 🇧🇿 FastAPI 🚥 👆 ✍ 🐍 📁 👈 🗄 & ⚙️ FastAPI, & 🏃 ⚫️ ⏮️ 🐍 ⚪️➡️ 👆 🇧🇿 🌐, ⚫️ 🔜 ⚙️ 👆 🇧🇿 FastAPI ℹ 📟. & 🚥 👆 ℹ 👈 🇧🇿 FastAPI ℹ 📟, ⚫️ ❎ ⏮️ `-e`, 🕐❔ 👆 🏃 👈 🐍 📁 🔄, ⚫️ 🔜 ⚙️ 🍋 ⏬ FastAPI 👆 ✍. 👈 🌌, 👆 🚫 ✔️ "❎" 👆 🇧🇿 ⏬ 💪 💯 🔠 🔀. ### 📁 📤 ✍ 👈 👆 💪 🏃 👈 🔜 📁 & 🧹 🌐 👆 📟:
```console $ bash scripts/format.sh ```
⚫️ 🔜 🚘-😇 🌐 👆 🗄. ⚫️ 😇 👫 ☑, 👆 💪 ✔️ FastAPI ❎ 🌐 👆 🌐, ⏮️ 📋 📄 🔛 ⚙️ `-e`. ## 🩺 🥇, ⚒ 💭 👆 ⚒ 🆙 👆 🌐 🔬 🔛, 👈 🔜 ❎ 🌐 📄. 🧾 ⚙️ . & 📤 ➕ 🧰/✍ 🥉 🍵 ✍ `./scripts/docs.py`. !!! tip 👆 🚫 💪 👀 📟 `./scripts/docs.py`, 👆 ⚙️ ⚫️ 📋 ⏸. 🌐 🧾 ✍ 📁 📁 `./docs/en/`. 📚 🔰 ✔️ 🍫 📟. 🌅 💼, 👫 🍫 📟 ☑ 🏁 🈸 👈 💪 🏃. 👐, 👈 🍫 📟 🚫 ✍ 🔘 ✍, 👫 🐍 📁 `./docs_src/` 📁. & 👈 🐍 📁 🔌/💉 🧾 🕐❔ 🏭 🕸. ### 🩺 💯 🏆 💯 🤙 🏃 🛡 🖼 ℹ 📁 🧾. 👉 ℹ ⚒ 💭 👈: * 🧾 🆙 📅. * 🧾 🖼 💪 🏃. * 🌅 ⚒ 📔 🧾, 🚚 💯 💰. ⏮️ 🇧🇿 🛠️, 📤 ✍ 👈 🏗 🕸 & ✅ 🙆 🔀, 🖖-🔫:
```console $ python ./scripts/docs.py live [INFO] Serving on http://127.0.0.1:8008 [INFO] Start watching changes [INFO] Start detecting changes ```
⚫️ 🔜 🍦 🧾 🔛 `http://127.0.0.1:8008`. 👈 🌌, 👆 💪 ✍ 🧾/ℹ 📁 & 👀 🔀 🖖. #### 🏎 ✳ (📦) 👩‍🌾 📥 🎦 👆 ❔ ⚙️ ✍ `./scripts/docs.py` ⏮️ `python` 📋 🔗. ✋️ 👆 💪 ⚙️ 🏎 ✳, & 👆 🔜 🤚 ✍ 👆 📶 📋 ⏮️ ❎ 🛠️. 🚥 👆 ❎ 🏎 ✳, 👆 💪 ❎ 🛠️ ⏮️:
```console $ typer --install-completion zsh completion installed in /home/user/.bashrc. Completion will take effect once you restart the terminal. ```
### 📱 & 🩺 🎏 🕰 🚥 👆 🏃 🖼 ⏮️, ✅:
```console $ uvicorn tutorial001:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
Uvicorn 🔢 🔜 ⚙️ ⛴ `8000`, 🧾 🔛 ⛴ `8008` 🏆 🚫 ⚔. ### ✍ ℹ ⏮️ ✍ 📶 🌅 👍 ❗ & ⚫️ 💪 🚫 🔨 🍵 ℹ ⚪️➡️ 👪. 👶 👶 📥 📶 ℹ ⏮️ ✍. #### 💁‍♂ & 📄 * ✅ ⏳ ♻ 🚲 📨 👆 🇪🇸 & 🚮 📄 ✔ 🔀 ⚖️ ✔ 👫. !!! tip 👆 💪 🚮 🏤 ⏮️ 🔀 🔑 ♻ 🚲 📨. ✅ 🩺 🔃 ❎ 🚲 📨 📄 ✔ ⚫️ ⚖️ 📨 🔀. * ✅ 👀 🚥 📤 1️⃣ 🛠️ ✍ 👆 🇪🇸. * 🚮 👁 🚲 📨 📍 📃 💬. 👈 🔜 ⚒ ⚫️ 🌅 ⏩ 🎏 📄 ⚫️. 🇪🇸 👤 🚫 💬, 👤 🔜 ⌛ 📚 🎏 📄 ✍ ⏭ 🔗. * 👆 💪 ✅ 🚥 📤 ✍ 👆 🇪🇸 & 🚮 📄 👫, 👈 🔜 ℹ 👤 💭 👈 ✍ ☑ & 👤 💪 🔗 ⚫️. * ⚙️ 🎏 🐍 🖼 & 🕴 💬 ✍ 🩺. 👆 🚫 ✔️ 🔀 🕳 👉 👷. * ⚙️ 🎏 🖼, 📁 📛, & 🔗. 👆 🚫 ✔️ 🔀 🕳 ⚫️ 👷. * ✅ 2️⃣-🔤 📟 🇪🇸 👆 💚 💬 👆 💪 ⚙️ 🏓 📇 💾 6️⃣3️⃣9️⃣-1️⃣ 📟. #### ♻ 🇪🇸 ➡️ 💬 👆 💚 💬 📃 🇪🇸 👈 ⏪ ✔️ ✍ 📃, 💖 🇪🇸. 💼 🇪🇸, 2️⃣-🔤 📟 `es`. , 📁 🇪🇸 ✍ 🔎 `docs/es/`. !!! tip 👑 ("🛂") 🇪🇸 🇪🇸, 🔎 `docs/en/`. 🔜 🏃 🖖 💽 🩺 🇪🇸:
```console // Use the command "live" and pass the language code as a CLI argument $ python ./scripts/docs.py live es [INFO] Serving on http://127.0.0.1:8008 [INFO] Start watching changes [INFO] Start detecting changes ```
🔜 👆 💪 🚶 http://127.0.0.1:8008 & 👀 👆 🔀 🖖. 🚥 👆 👀 FastAPI 🩺 🕸, 👆 🔜 👀 👈 🔠 🇪🇸 ✔️ 🌐 📃. ✋️ 📃 🚫 💬 & ✔️ 📨 🔃 ❌ ✍. ✋️ 🕐❔ 👆 🏃 ⚫️ 🌐 💖 👉, 👆 🔜 🕴 👀 📃 👈 ⏪ 💬. 🔜 ➡️ 💬 👈 👆 💚 🚮 ✍ 📄 [⚒](features.md){.internal-link target=_blank}. * 📁 📁: ``` docs/en/docs/features.md ``` * 📋 ⚫️ ⚫️❔ 🎏 🗺 ✋️ 🇪🇸 👆 💚 💬, ✅: ``` docs/es/docs/features.md ``` !!! tip 👀 👈 🕴 🔀 ➡ & 📁 📛 🇪🇸 📟, ⚪️➡️ `en` `es`. * 🔜 📂 ⬜ 📁 📁 🇪🇸: ``` docs/en/mkdocs.yml ``` * 🔎 🥉 🌐❔ 👈 `docs/features.md` 🔎 📁 📁. 👱 💖: ```YAML hl_lines="8" site_name: FastAPI # More stuff nav: - FastAPI: index.md - Languages: - en: / - es: /es/ - features.md ``` * 📂 ⬜ 📁 📁 🇪🇸 👆 ✍, ✅: ``` docs/es/mkdocs.yml ``` * 🚮 ⚫️ 📤 ☑ 🎏 🗺 ⚫️ 🇪🇸, ✅: ```YAML hl_lines="8" site_name: FastAPI # More stuff nav: - FastAPI: index.md - Languages: - en: / - es: /es/ - features.md ``` ⚒ 💭 👈 🚥 📤 🎏 ⛔, 🆕 ⛔ ⏮️ 👆 ✍ ⚫️❔ 🎏 ✔ 🇪🇸 ⏬. 🚥 👆 🚶 👆 🖥 👆 🔜 👀 👈 🔜 🩺 🎦 👆 🆕 📄. 👶 🔜 👆 💪 💬 ⚫️ 🌐 & 👀 ❔ ⚫️ 👀 👆 🖊 📁. #### 🆕 🇪🇸 ➡️ 💬 👈 👆 💚 🚮 ✍ 🇪🇸 👈 🚫 💬, 🚫 📃. ➡️ 💬 👆 💚 🚮 ✍ 🇭🇹, & ⚫️ 🚫 📤 🩺. ✅ 🔗 ⚪️➡️ 🔛, 📟 "🇭🇹" `ht`. ⏭ 🔁 🏃 ✍ 🏗 🆕 ✍ 📁:
```console // Use the command new-lang, pass the language code as a CLI argument $ python ./scripts/docs.py new-lang ht Successfully initialized: docs/ht Updating ht Updating en ```
🔜 👆 💪 ✅ 👆 📟 👨‍🎨 ⏳ ✍ 📁 `docs/ht/`. !!! tip ✍ 🥇 🚲 📨 ⏮️ 👉, ⚒ 🆙 📳 🆕 🇪🇸, ⏭ ❎ ✍. 👈 🌌 🎏 💪 ℹ ⏮️ 🎏 📃 ⏪ 👆 👷 🔛 🥇 🕐. 👶 ▶️ ✍ 👑 📃, `docs/ht/index.md`. ⤴️ 👆 💪 😣 ⏮️ ⏮️ 👩‍🌾, "♻ 🇪🇸". ##### 🆕 🇪🇸 🚫 🐕‍🦺 🚥 🕐❔ 🏃‍♂ 🖖 💽 ✍ 👆 🤚 ❌ 🔃 🇪🇸 🚫 ➖ 🐕‍🦺, 🕳 💖: ``` raise TemplateNotFound(template) jinja2.exceptions.TemplateNotFound: partials/language/xx.html ``` 👈 ⛓ 👈 🎢 🚫 🐕‍🦺 👈 🇪🇸 (👉 💼, ⏮️ ❌ 2️⃣-🔤 📟 `xx`). ✋️ 🚫 😟, 👆 💪 ⚒ 🎢 🇪🇸 🇪🇸 & ⤴️ 💬 🎚 🩺. 🚥 👆 💪 👈, ✍ `mkdocs.yml` 👆 🆕 🇪🇸, ⚫️ 🔜 ✔️ 🕳 💖: ```YAML hl_lines="5" site_name: FastAPI # More stuff theme: # More stuff language: xx ``` 🔀 👈 🇪🇸 ⚪️➡️ `xx` (⚪️➡️ 👆 🇪🇸 📟) `en`. ⤴️ 👆 💪 ▶️ 🖖 💽 🔄. #### 🎮 🏁 🕐❔ 👆 ⚙️ ✍ `./scripts/docs.py` ⏮️ `live` 📋 ⚫️ 🕴 🎦 📁 & ✍ 💪 ⏮️ 🇪🇸. ✋️ 🕐 👆 🔨, 👆 💪 💯 ⚫️ 🌐 ⚫️ 🔜 👀 💳. 👈, 🥇 🏗 🌐 🩺:
```console // Use the command "build-all", this will take a bit $ python ./scripts/docs.py build-all Updating es Updating en Building docs for: en Building docs for: es Successfully built docs for: es Copying en index.md to README.md ```
👈 🏗 🌐 🩺 `./docs_build/` 🔠 🇪🇸. 👉 🔌 ❎ 🙆 📁 ⏮️ ❌ ✍, ⏮️ 🗒 💬 👈 "👉 📁 🚫 ✔️ ✍". ✋️ 👆 🚫 ✔️ 🕳 ⏮️ 👈 📁. ⤴️ ⚫️ 🏗 🌐 👈 🔬 ⬜ 🕸 🔠 🇪🇸, 🌀 👫, & 🏗 🏁 🔢 `./site/`. ⤴️ 👆 💪 🍦 👈 ⏮️ 📋 `serve`:
```console // Use the command "serve" after running "build-all" $ python ./scripts/docs.py serve Warning: this is a very simple server. For development, use mkdocs serve instead. This is here only to preview a site with translations already built. Make sure you run the build-all command first. Serving at: http://127.0.0.1:8008 ```
## 💯 📤 ✍ 👈 👆 💪 🏃 🌐 💯 🌐 📟 & 🏗 💰 📄 🕸:
```console $ bash scripts/test-cov-html.sh ```
👉 📋 🏗 📁 `./htmlcov/`, 🚥 👆 📂 📁 `./htmlcov/index.html` 👆 🖥, 👆 💪 🔬 🖥 🇹🇼 📟 👈 📔 💯, & 👀 🚥 📤 🙆 🇹🇼 ❌. fastapi-0.110.3/docs/em/docs/deployment/000077500000000000000000000000001461403617600177545ustar00rootroot00000000000000fastapi-0.110.3/docs/em/docs/deployment/concepts.md000066400000000000000000000347571461403617600221340ustar00rootroot00000000000000# 🛠️ 🔧 🕐❔ 🛠️ **FastAPI** 🈸, ⚖️ 🤙, 🙆 🆎 🕸 🛠️, 📤 📚 🔧 👈 👆 🎲 💅 🔃, & ⚙️ 👫 👆 💪 🔎 **🏆 ☑** 🌌 **🛠️ 👆 🈸**. ⚠ 🔧: * 💂‍♂ - 🇺🇸🔍 * 🏃‍♂ 🔛 🕴 * ⏏ * 🧬 (🔢 🛠️ 🏃) * 💾 * ⏮️ 🔁 ⏭ ▶️ 👥 🔜 👀 ❔ 👫 🔜 📉 **🛠️**. 🔚, 🏆 🎯 💪 **🍦 👆 🛠️ 👩‍💻** 🌌 👈 **🔐**, **❎ 📉**, & ⚙️ **📊 ℹ** (🖼 🛰 💽/🕹 🎰) ♻ 💪. 👶 👤 🔜 💬 👆 🍖 🌖 🔃 👫 **🔧** 📥, & 👈 🔜 🤞 🤝 👆 **🤔** 👆 🔜 💪 💭 ❔ 🛠️ 👆 🛠️ 📶 🎏 🌐, 🎲 **🔮** 🕐 👈 🚫 🔀. 🤔 👫 🔧, 👆 🔜 💪 **🔬 & 🔧** 🏆 🌌 🛠️ **👆 👍 🔗**. ⏭ 📃, 👤 🔜 🤝 👆 🌅 **🧱 🍮** 🛠️ FastAPI 🈸. ✋️ 🔜, ➡️ ✅ 👉 ⚠ **⚛ 💭**. 👫 🔧 ✔ 🙆 🎏 🆎 🕸 🛠️. 👶 ## 💂‍♂ - 🇺🇸🔍 [⏮️ 📃 🔃 🇺🇸🔍](https.md){.internal-link target=_blank} 👥 🇭🇲 🔃 ❔ 🇺🇸🔍 🚚 🔐 👆 🛠️. 👥 👀 👈 🇺🇸🔍 🛎 🚚 🦲 **🔢** 👆 🈸 💽, **🤝 ❎ 🗳**. & 📤 ✔️ 🕳 🈚 **♻ 🇺🇸🔍 📄**, ⚫️ 💪 🎏 🦲 ⚖️ ⚫️ 💪 🕳 🎏. ### 🖼 🧰 🇺🇸🔍 🧰 👆 💪 ⚙️ 🤝 ❎ 🗳: * Traefik * 🔁 🍵 📄 🔕 👶 * 📥 * 🔁 🍵 📄 🔕 👶 * 👌 * ⏮️ 🔢 🦲 💖 Certbot 📄 🔕 * ✳ * ⏮️ 🔢 🦲 💖 Certbot 📄 🔕 * Kubernetes ⏮️ 🚧 🕹 💖 👌 * ⏮️ 🔢 🦲 💖 🛂-👨‍💼 📄 🔕 * 🍵 🔘 ☁ 🐕‍🦺 🍕 👫 🐕‍🦺 (✍ 🔛 👶) ➕1️⃣ 🎛 👈 👆 💪 ⚙️ **☁ 🐕‍🦺** 👈 🔨 🌖 👷 ✅ ⚒ 🆙 🇺🇸🔍. ⚫️ 💪 ✔️ 🚫 ⚖️ 🈚 👆 🌅, ♒️. ✋️ 👈 💼, 👆 🚫🔜 ✔️ ⚒ 🆙 🤝 ❎ 🗳 👆. 👤 🔜 🎦 👆 🧱 🖼 ⏭ 📃. --- ⤴️ ⏭ 🔧 🤔 🌐 🔃 📋 🏃 👆 ☑ 🛠️ (✅ Uvicorn). ## 📋 & 🛠️ 👥 🔜 💬 📚 🔃 🏃 "**🛠️**", ⚫️ ⚠ ✔️ ☯ 🔃 ⚫️❔ ⚫️ ⛓, & ⚫️❔ 🔺 ⏮️ 🔤 "**📋**". ### ⚫️❔ 📋 🔤 **📋** 🛎 ⚙️ 🔬 📚 👜: * **📟** 👈 👆 ✍, **🐍 📁**. * **📁** 👈 💪 **🛠️** 🏃‍♂ ⚙️, 🖼: `python`, `python.exe` ⚖️ `uvicorn`. * 🎯 📋 ⏪ ⚫️ **🏃‍♂** 🔛 🏗 ⚙️, ⚙️ 💽, & ♻ 👜 🔛 💾. 👉 🤙 **🛠️**. ### ⚫️❔ 🛠️ 🔤 **🛠️** 🛎 ⚙️ 🌖 🎯 🌌, 🕴 🔗 👜 👈 🏃 🏃‍♂ ⚙️ (💖 🏁 ☝ 🔛): * 🎯 📋 ⏪ ⚫️ **🏃‍♂** 🔛 🏃‍♂ ⚙️. * 👉 🚫 🔗 📁, 🚫 📟, ⚫️ 🔗 **🎯** 👜 👈 ➖ **🛠️** & 🔄 🏃‍♂ ⚙️. * 🙆 📋, 🙆 📟, **💪 🕴 👜** 🕐❔ ⚫️ ➖ **🛠️**. , 🕐❔ 📤 **🛠️ 🏃**. * 🛠️ 💪 **❎** (⚖️ "💥") 👆, ⚖️ 🏃‍♂ ⚙️. 👈 ☝, ⚫️ ⛔️ 🏃/➖ 🛠️, & ⚫️ 💪 **🙅‍♂ 📏 👜**. * 🔠 🈸 👈 👆 ✔️ 🏃 🔛 👆 💻 ✔️ 🛠️ ⛅ ⚫️, 🔠 🏃‍♂ 📋, 🔠 🚪, ♒️. & 📤 🛎 📚 🛠️ 🏃 **🎏 🕰** ⏪ 💻 🔛. * 📤 💪 **💗 🛠️** **🎏 📋** 🏃 🎏 🕰. 🚥 👆 ✅ 👅 "📋 👨‍💼" ⚖️ "⚙️ 🖥" (⚖️ 🎏 🧰) 👆 🏃‍♂ ⚙️, 👆 🔜 💪 👀 📚 👈 🛠️ 🏃‍♂. & , 🖼, 👆 🔜 🎲 👀 👈 📤 💗 🛠️ 🏃 🎏 🖥 📋 (🦎, 💄, 📐, ♒️). 👫 🛎 🏃 1️⃣ 🛠️ 📍 📑, ➕ 🎏 ➕ 🛠️. --- 🔜 👈 👥 💭 🔺 🖖 ⚖ **🛠️** & **📋**, ➡️ 😣 💬 🔃 🛠️. ## 🏃‍♂ 🔛 🕴 🌅 💼, 🕐❔ 👆 ✍ 🕸 🛠️, 👆 💚 ⚫️ **🕧 🏃‍♂**, ➡, 👈 👆 👩‍💻 💪 🕧 🔐 ⚫️. 👉 ↗️, 🚥 👆 ✔️ 🎯 🤔 ⚫️❔ 👆 💚 ⚫️ 🏃 🕴 🎯 ⚠, ✋️ 🌅 🕰 👆 💚 ⚫️ 🕧 🏃‍♂ & **💪**. ### 🛰 💽 🕐❔ 👆 ⚒ 🆙 🛰 💽 (☁ 💽, 🕹 🎰, ♒️.) 🙅 👜 👆 💪 🏃 Uvicorn (⚖️ 🎏) ❎, 🎏 🌌 👆 🕐❔ 🛠️ 🌐. & ⚫️ 🔜 👷 & 🔜 ⚠ **⏮️ 🛠️**. ✋️ 🚥 👆 🔗 💽 💸, **🏃‍♂ 🛠️** 🔜 🎲 ☠️. & 🚥 💽 ⏏ (🖼 ⏮️ ℹ, ⚖️ 🛠️ ⚪️➡️ ☁ 🐕‍🦺) 👆 🎲 **🏆 🚫 👀 ⚫️**. & ↩️ 👈, 👆 🏆 🚫 💭 👈 👆 ✔️ ⏏ 🛠️ ❎. , 👆 🛠️ 🔜 🚧 ☠️. 👶 ### 🏃 🔁 🔛 🕴 🏢, 👆 🔜 🎲 💚 💽 📋 (✅ Uvicorn) ▶️ 🔁 🔛 💽 🕴, & 🍵 💪 🙆 **🗿 🏥**, ✔️ 🛠️ 🕧 🏃 ⏮️ 👆 🛠️ (✅ Uvicorn 🏃‍♂ 👆 FastAPI 📱). ### 🎏 📋 🏆 👉, 👆 🔜 🛎 ✔️ **🎏 📋** 👈 🔜 ⚒ 💭 👆 🈸 🏃 🔛 🕴. & 📚 💼, ⚫️ 🔜 ⚒ 💭 🎏 🦲 ⚖️ 🈸 🏃, 🖼, 💽. ### 🖼 🧰 🏃 🕴 🖼 🧰 👈 💪 👉 👨‍🏭: * ☁ * Kubernetes * ☁ ✍ * ☁ 🐝 📳 * ✳ * 👨‍💻 * 🍵 🔘 ☁ 🐕‍🦺 🍕 👫 🐕‍🦺 * 🎏... 👤 🔜 🤝 👆 🌅 🧱 🖼 ⏭ 📃. ## ⏏ 🎏 ⚒ 💭 👆 🈸 🏃 🔛 🕴, 👆 🎲 💚 ⚒ 💭 ⚫️ **⏏** ⏮️ ❌. ### 👥 ⚒ ❌ 👥, 🗿, ⚒ **❌**, 🌐 🕰. 🖥 🌖 *🕧* ✔️ **🐛** 🕵‍♂ 🎏 🥉. 👶 & 👥 👩‍💻 🚧 📉 📟 👥 🔎 👈 🐛 & 👥 🛠️ 🆕 ⚒ (🎲 ❎ 🆕 🐛 💁‍♂️ 👶). ### 🤪 ❌ 🔁 🍵 🕐❔ 🏗 🕸 🔗 ⏮️ FastAPI, 🚥 📤 ❌ 👆 📟, FastAPI 🔜 🛎 🔌 ⚫️ 👁 📨 👈 ⏲ ❌. 🛡 👩‍💻 🔜 🤚 **5️⃣0️⃣0️⃣ 🔗 💽 ❌** 👈 📨, ✋️ 🈸 🔜 😣 👷 ⏭ 📨 ↩️ 💥 🍕. ### 🦏 ❌ - 💥 👐, 📤 5️⃣📆 💼 🌐❔ 👥 ✍ 📟 👈 **💥 🎂 🈸** ⚒ Uvicorn & 🐍 💥. 👶 & , 👆 🔜 🎲 🚫 💚 🈸 🚧 ☠️ ↩️ 📤 ❌ 1️⃣ 🥉, 👆 🎲 💚 ⚫️ **😣 🏃** 🌘 *➡ 🛠️* 👈 🚫 💔. ### ⏏ ⏮️ 💥 ✋️ 👈 💼 ⏮️ 🤙 👎 ❌ 👈 💥 🏃‍♂ **🛠️**, 👆 🔜 💚 🔢 🦲 👈 🈚 **🔁** 🛠️, 🌘 👩‍❤‍👨 🕰... !!! tip ...👐 🚥 🎂 🈸 **💥 ⏪** ⚫️ 🎲 🚫 ⚒ 🔑 🚧 🔁 ⚫️ ♾. ✋️ 📚 💼, 👆 🔜 🎲 👀 ⚫️ ⏮️ 🛠️, ⚖️ 🌘 ▶️️ ⏮️ 🛠️. ➡️ 🎯 🔛 👑 💼, 🌐❔ ⚫️ 💪 💥 🍕 🎯 💼 **🔮**, & ⚫️ ⚒ 🔑 ⏏ ⚫️. 👆 🔜 🎲 💚 ✔️ 👜 🈚 🔁 👆 🈸 **🔢 🦲**, ↩️ 👈 ☝, 🎏 🈸 ⏮️ Uvicorn & 🐍 ⏪ 💥, 📤 🕳 🎏 📟 🎏 📱 👈 💪 🕳 🔃 ⚫️. ### 🖼 🧰 ⏏ 🔁 🏆 💼, 🎏 🧰 👈 ⚙️ **🏃 📋 🔛 🕴** ⚙️ 🍵 🏧 **⏏**. 🖼, 👉 💪 🍵: * ☁ * Kubernetes * ☁ ✍ * ☁ 🐝 📳 * ✳ * 👨‍💻 * 🍵 🔘 ☁ 🐕‍🦺 🍕 👫 🐕‍🦺 * 🎏... ## 🧬 - 🛠️ & 💾 ⏮️ FastAPI 🈸, ⚙️ 💽 📋 💖 Uvicorn, 🏃‍♂ ⚫️ 🕐 **1️⃣ 🛠️** 💪 🍦 💗 👩‍💻 🔁. ✋️ 📚 💼, 👆 🔜 💚 🏃 📚 👨‍🏭 🛠️ 🎏 🕰. ### 💗 🛠️ - 👨‍🏭 🚥 👆 ✔️ 🌅 👩‍💻 🌘 ⚫️❔ 👁 🛠️ 💪 🍵 (🖼 🚥 🕹 🎰 🚫 💁‍♂️ 🦏) & 👆 ✔️ **💗 🐚** 💽 💽, ⤴️ 👆 💪 ✔️ **💗 🛠️** 🏃‍♂ ⏮️ 🎏 🈸 🎏 🕰, & 📎 🌐 📨 👪 👫. 🕐❔ 👆 🏃 **💗 🛠️** 🎏 🛠️ 📋, 👫 🛎 🤙 **👨‍🏭**. ### 👨‍🏭 🛠️ & ⛴ 💭 ⚪️➡️ 🩺 [🔃 🇺🇸🔍](https.md){.internal-link target=_blank} 👈 🕴 1️⃣ 🛠️ 💪 👂 🔛 1️⃣ 🌀 ⛴ & 📢 📢 💽 ❓ 👉 ☑. , 💪 ✔️ **💗 🛠️** 🎏 🕰, 📤 ✔️ **👁 🛠️ 👂 🔛 ⛴** 👈 ⤴️ 📶 📻 🔠 👨‍🏭 🛠️ 🌌. ### 💾 📍 🛠️ 🔜, 🕐❔ 📋 📐 👜 💾, 🖼, 🎰 🏫 🏷 🔢, ⚖️ 🎚 ⭕ 📁 🔢, 🌐 👈 **🍴 👄 💾 (💾)** 💽. & 💗 🛠️ 🛎 **🚫 💰 🙆 💾**. 👉 ⛓ 👈 🔠 🏃 🛠️ ✔️ 🚮 👍 👜, 🔢, & 💾. & 🚥 👆 😩 ⭕ 💸 💾 👆 📟, **🔠 🛠️** 🔜 🍴 🌓 💸 💾. ### 💽 💾 🖼, 🚥 👆 📟 📐 🎰 🏫 🏷 ⏮️ **1️⃣ 💾 📐**, 🕐❔ 👆 🏃 1️⃣ 🛠️ ⏮️ 👆 🛠️, ⚫️ 🔜 🍴 🌘 1️⃣ 💾 💾. & 🚥 👆 ▶️ **4️⃣ 🛠️** (4️⃣ 👨‍🏭), 🔠 🔜 🍴 1️⃣ 💾 💾. 🌐, 👆 🛠️ 🔜 🍴 **4️⃣ 💾 💾**. & 🚥 👆 🛰 💽 ⚖️ 🕹 🎰 🕴 ✔️ 3️⃣ 💾 💾, 🔄 📐 🌅 🌘 4️⃣ 💾 💾 🔜 🤕 ⚠. 👶 ### 💗 🛠️ - 🖼 👉 🖼, 📤 **👨‍💼 🛠️** 👈 ▶️ & 🎛 2️⃣ **👨‍🏭 🛠️**. 👉 👨‍💼 🛠️ 🔜 🎲 1️⃣ 👂 🔛 **⛴** 📢. & ⚫️ 🔜 📶 🌐 📻 👨‍🏭 🛠️. 👈 👨‍🏭 🛠️ 🔜 🕐 🏃‍♂ 👆 🈸, 👫 🔜 🎭 👑 📊 📨 **📨** & 📨 **📨**, & 👫 🔜 📐 🕳 👆 🚮 🔢 💾. & ↗️, 🎏 🎰 🔜 🎲 ✔️ **🎏 🛠️** 🏃 👍, ↖️ ⚪️➡️ 👆 🈸. 😌 ℹ 👈 🌐 **💽 ⚙️** 🔠 🛠️ 💪 **🪀** 📚 🤭 🕰, ✋️ **💾 (💾)** 🛎 🚧 🌖 ⚖️ 🌘 **⚖**. 🚥 👆 ✔️ 🛠️ 👈 🔨 ⭐ 💸 📊 🔠 🕰 & 👆 ✔️ 📚 👩‍💻, ⤴️ **💽 🛠️** 🔜 🎲 *⚖* (↩️ 🕧 🔜 🆙 & 🔽 🔜). ### 🖼 🧬 🧰 & 🎛 📤 💪 📚 🎯 🏆 👉, & 👤 🔜 💬 👆 🌅 🔃 🎯 🎛 ⏭ 📃, 🖼 🕐❔ 💬 🔃 ☁ & 📦. 👑 ⚛ 🤔 👈 📤 ✔️ **👁** 🦲 🚚 **⛴** **📢 📢**. & ⤴️ ⚫️ ✔️ ✔️ 🌌 **📶** 📻 🔁 **🛠️/👨‍🏭**. 📥 💪 🌀 & 🎛: * **🐁** 🛠️ **Uvicorn 👨‍🏭** * 🐁 🔜 **🛠️ 👨‍💼** 👂 🔛 **📢** & **⛴**, 🧬 🔜 ✔️ **💗 Uvicorn 👨‍🏭 🛠️** * **Uvicorn** 🛠️ **Uvicorn 👨‍🏭** * 1️⃣ Uvicorn **🛠️ 👨‍💼** 🔜 👂 🔛 **📢** & **⛴**, & ⚫️ 🔜 ▶️ **💗 Uvicorn 👨‍🏭 🛠️** * **Kubernetes** & 🎏 📎 **📦 ⚙️** * 🕳 **☁** 🧽 🔜 👂 🔛 **📢** & **⛴**. 🧬 🔜 ✔️ **💗 📦**, 🔠 ⏮️ **1️⃣ Uvicorn 🛠️** 🏃‍♂ * **☁ 🐕‍🦺** 👈 🍵 👉 👆 * ☁ 🐕‍🦺 🔜 🎲 **🍵 🧬 👆**. ⚫️ 🔜 🎲 ➡️ 👆 🔬 **🛠️ 🏃**, ⚖️ **📦 🖼** ⚙️, 🙆 💼, ⚫️ 🔜 🌅 🎲 **👁 Uvicorn 🛠️**, & ☁ 🐕‍🦺 🔜 🈚 🔁 ⚫️. !!! tip 🚫 😟 🚥 👫 🏬 🔃 **📦**, ☁, ⚖️ Kubernetes 🚫 ⚒ 📚 🔑. 👤 🔜 💬 👆 🌅 🔃 📦 🖼, ☁, Kubernetes, ♒️. 🔮 📃: [FastAPI 📦 - ☁](docker.md){.internal-link target=_blank}. ## ⏮️ 🔁 ⏭ ▶️ 📤 📚 💼 🌐❔ 👆 💚 🎭 📶 **⏭ ▶️** 👆 🈸. 🖼, 👆 💪 💚 🏃 **💽 🛠️**. ✋️ 🌅 💼, 👆 🔜 💚 🎭 👉 🔁 🕴 **🕐**. , 👆 🔜 💚 ✔️ **👁 🛠️** 🎭 👈 **⏮️ 🔁**, ⏭ ▶️ 🈸. & 👆 🔜 ✔️ ⚒ 💭 👈 ⚫️ 👁 🛠️ 🏃 👈 ⏮️ 🔁 ** 🚥 ⏮️, 👆 ▶️ **💗 🛠️** (💗 👨‍🏭) 🈸 ⚫️. 🚥 👈 🔁 🏃 **💗 🛠️**, 👫 🔜 **❎** 👷 🏃‍♂ ⚫️ 🔛 **🔗**, & 🚥 📶 🕳 💎 💖 💽 🛠️, 👫 💪 🤕 ⚔ ⏮️ 🔠 🎏. ↗️, 📤 💼 🌐❔ 📤 🙅‍♂ ⚠ 🏃 ⏮️ 🔁 💗 🕰, 👈 💼, ⚫️ 📚 ⏩ 🍵. !!! tip , ✔️ 🤯 👈 ⚓️ 🔛 👆 🖥, 💼 👆 **5️⃣📆 🚫 💪 🙆 ⏮️ 🔁** ⏭ ▶️ 👆 🈸. 👈 💼, 👆 🚫🔜 ✔️ 😟 🔃 🙆 👉. 🤷 ### 🖼 ⏮️ 🔁 🎛 👉 🔜 **🪀 🙇** 🔛 🌌 👆 **🛠️ 👆 ⚙️**, & ⚫️ 🔜 🎲 🔗 🌌 👆 ▶️ 📋, 🚚 ⏏, ♒️. 📥 💪 💭: * "🕑 📦" Kubernetes 👈 🏃 ⏭ 👆 📱 📦 * 🎉 ✍ 👈 🏃 ⏮️ 🔁 & ⤴️ ▶️ 👆 🈸 * 👆 🔜 💪 🌌 ▶️/⏏ *👈* 🎉 ✍, 🔍 ❌, ♒️. !!! tip 👤 🔜 🤝 👆 🌅 🧱 🖼 🔨 👉 ⏮️ 📦 🔮 📃: [FastAPI 📦 - ☁](docker.md){.internal-link target=_blank}. ## ℹ 🛠️ 👆 💽(Ⓜ) () **ℹ**, 👆 💪 🍴 ⚖️ **⚙️**, ⏮️ 👆 📋, 📊 🕰 🔛 💽, & 💾 💾 💪. ❔ 🌅 ⚙️ ℹ 👆 💚 😩/♻ ❓ ⚫️ 💪 ⏩ 💭 "🚫 🌅", ✋️ 🌌, 👆 🔜 🎲 💚 🍴 **🌅 💪 🍵 💥**. 🚥 👆 💸 3️⃣ 💽 ✋️ 👆 ⚙️ 🕴 🐥 🍖 👫 💾 & 💽, 👆 🎲 **🗑 💸** 👶, & 🎲 **🗑 💽 🔦 🏋️** 👶, ♒️. 👈 💼, ⚫️ 💪 👻 ✔️ 🕴 2️⃣ 💽 & ⚙️ ↕ 🌐 👫 ℹ (💽, 💾, 💾, 🕸 💿, ♒️). 🔛 🎏 ✋, 🚥 👆 ✔️ 2️⃣ 💽 & 👆 ⚙️ **1️⃣0️⃣0️⃣ 💯 👫 💽 & 💾**, ☝ 1️⃣ 🛠️ 🔜 💭 🌅 💾, & 💽 🔜 ✔️ ⚙️ 💾 "💾" (❔ 💪 💯 🕰 🐌), ⚖️ **💥**. ⚖️ 1️⃣ 🛠️ 💪 💪 📊 & 🔜 ✔️ ⌛ ⏭ 💽 🆓 🔄. 👉 💼, ⚫️ 🔜 👍 🤚 **1️⃣ ➕ 💽** & 🏃 🛠️ 🔛 ⚫️ 👈 👫 🌐 ✔️ **🥃 💾 & 💽 🕰**. 📤 🤞 👈 🤔 👆 ✔️ **🌵** ⚙️ 👆 🛠️. 🎲 ⚫️ 🚶 🦠, ⚖️ 🎲 🎏 🐕‍🦺 ⚖️ 🤖 ▶️ ⚙️ ⚫️. & 👆 💪 💚 ✔️ ➕ ℹ 🔒 👈 💼. 👆 💪 🚮 **❌ 🔢** 🎯, 🖼, 🕳 **🖖 5️⃣0️⃣ 💯 9️⃣0️⃣ 💯** ℹ 🛠️. ☝ 👈 📚 🎲 👑 👜 👆 🔜 💚 ⚖ & ⚙️ ⚒ 👆 🛠️. 👆 💪 ⚙️ 🙅 🧰 💖 `htop` 👀 💽 & 💾 ⚙️ 👆 💽 ⚖️ 💸 ⚙️ 🔠 🛠️. ⚖️ 👆 💪 ⚙️ 🌖 🏗 ⚖ 🧰, ❔ 5️⃣📆 📎 🤭 💽, ♒️. ## 🌃 👆 ✔️ 👂 📥 👑 🔧 👈 👆 🔜 🎲 💪 ✔️ 🤯 🕐❔ 🤔 ❔ 🛠️ 👆 🈸: * 💂‍♂ - 🇺🇸🔍 * 🏃‍♂ 🔛 🕴 * ⏏ * 🧬 (🔢 🛠️ 🏃) * 💾 * ⏮️ 🔁 ⏭ ▶️ 🤔 👉 💭 & ❔ ✔ 👫 🔜 🤝 👆 🤔 💪 ✊ 🙆 🚫 🕐❔ 🛠️ & 🛠️ 👆 🛠️. 👶 ⏭ 📄, 👤 🔜 🤝 👆 🌅 🧱 🖼 💪 🎛 👆 💪 ⏩. 👶 fastapi-0.110.3/docs/em/docs/deployment/docker.md000066400000000000000000000675631461403617600215660ustar00rootroot00000000000000# FastAPI 📦 - ☁ 🕐❔ 🛠️ FastAPI 🈸 ⚠ 🎯 🏗 **💾 📦 🖼**. ⚫️ 🛎 🔨 ⚙️ **☁**. 👆 💪 ⤴️ 🛠️ 👈 📦 🖼 1️⃣ 👩‍❤‍👨 💪 🌌. ⚙️ 💾 📦 ✔️ 📚 📈 ✅ **💂‍♂**, **🔬**, **🦁**, & 🎏. !!! tip 🏃 & ⏪ 💭 👉 💩 ❓ 🦘 [`Dockerfile` 🔛 👶](#fastapi).
📁 🎮 👶 ```Dockerfile FROM python:3.9 WORKDIR /code COPY ./requirements.txt /code/requirements.txt RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt COPY ./app /code/app CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] # If running behind a proxy like Nginx or Traefik add --proxy-headers # CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--proxy-headers"] ```
## ⚫️❔ 📦 📦 (✴️ 💾 📦) 📶 **💿** 🌌 📦 🈸 ✅ 🌐 👫 🔗 & 💪 📁 ⏪ 🚧 👫 ❎ ⚪️➡️ 🎏 📦 (🎏 🈸 ⚖️ 🦲) 🎏 ⚙️. 💾 📦 🏃 ⚙️ 🎏 💾 💾 🦠 (🎰, 🕹 🎰, ☁ 💽, ♒️). 👉 ⛓ 👈 👫 📶 💿 (🔬 🌕 🕹 🎰 👍 🎂 🏃‍♂ ⚙️). 👉 🌌, 📦 🍴 **🐥 ℹ**, 💸 ⭐ 🏃‍♂ 🛠️ 🔗 (🕹 🎰 🔜 🍴 🌅 🌅). 📦 ✔️ 👫 👍 **❎** 🏃‍♂ 🛠️ (🛎 1️⃣ 🛠️), 📁 ⚙️, & 🕸, 🔬 🛠️, 💂‍♂, 🛠️, ♒️. ## ⚫️❔ 📦 🖼 **📦** 🏃 ⚪️➡️ **📦 🖼**. 📦 🖼 **🎻** ⏬ 🌐 📁, 🌐 🔢, & 🔢 📋/📋 👈 🔜 🎁 📦. **🎻** 📥 ⛓ 👈 📦 **🖼** 🚫 🏃, ⚫️ 🚫 ➖ 🛠️, ⚫️ 🕴 📦 📁 & 🗃. 🔅 "**📦 🖼**" 👈 🏪 🎻 🎚,"**📦**" 🛎 🔗 🏃‍♂ 👐, 👜 👈 ➖ **🛠️**. 🕐❔ **📦** ▶️ & 🏃‍♂ (▶️ ⚪️➡️ **📦 🖼**) ⚫️ 💪 ✍ ⚖️ 🔀 📁, 🌐 🔢, ♒️. 👈 🔀 🔜 🔀 🕴 👈 📦, ✋️ 🔜 🚫 😣 👽 📦 🖼 (🔜 🚫 🖊 💾). 📦 🖼 ⭐ **📋** 📁 & 🎚, ✅ `python` & 📁 `main.py`. & **📦** ⚫️ (🔅 **📦 🖼**) ☑ 🏃 👐 🖼, ⭐ **🛠️**. 👐, 📦 🏃 🕴 🕐❔ ⚫️ ✔️ **🛠️ 🏃** (& 🛎 ⚫️ 🕴 👁 🛠️). 📦 ⛔️ 🕐❔ 📤 🙅‍♂ 🛠️ 🏃 ⚫️. ## 📦 🖼 ☁ ✔️ 1️⃣ 👑 🧰 ✍ & 🛠️ **📦 🖼** & **📦**. & 📤 📢 ☁ 🎡 ⏮️ 🏤-⚒ **🛂 📦 🖼** 📚 🧰, 🌐, 💽, & 🈸. 🖼, 📤 🛂 🐍 🖼. & 📤 📚 🎏 🖼 🎏 👜 💖 💽, 🖼: * * * * , ♒️. ⚙️ 🏤-⚒ 📦 🖼 ⚫️ 📶 ⏩ **🌀** & ⚙️ 🎏 🧰. 🖼, 🔄 👅 🆕 💽. 🌅 💼, 👆 💪 ⚙️ **🛂 🖼**, & 🔗 👫 ⏮️ 🌐 🔢. 👈 🌌, 📚 💼 👆 💪 💡 🔃 📦 & ☁ & 🏤-⚙️ 👈 💡 ⏮️ 📚 🎏 🧰 & 🦲. , 👆 🔜 🏃 **💗 📦** ⏮️ 🎏 👜, 💖 💽, 🐍 🈸, 🕸 💽 ⏮️ 😥 🕸 🈸, & 🔗 👫 👯‍♂️ 📨 👫 🔗 🕸. 🌐 📦 🧾 ⚙️ (💖 ☁ ⚖️ Kubernetes) ✔️ 👫 🕸 ⚒ 🛠️ 🔘 👫. ## 📦 & 🛠️ **📦 🖼** 🛎 🔌 🚮 🗃 🔢 📋 ⚖️ 📋 👈 🔜 🏃 🕐❔ **📦** ▶️ & 🔢 🚶‍♀️ 👈 📋. 📶 🎏 ⚫️❔ 🔜 🚥 ⚫️ 📋 ⏸. 🕐❔ **📦** ▶️, ⚫️ 🔜 🏃 👈 📋/📋 (👐 👆 💪 🔐 ⚫️ & ⚒ ⚫️ 🏃 🎏 📋/📋). 📦 🏃 📏 **👑 🛠️** (📋 ⚖️ 📋) 🏃. 📦 🛎 ✔️ **👁 🛠️**, ✋️ ⚫️ 💪 ▶️ ✳ ⚪️➡️ 👑 🛠️, & 👈 🌌 👆 🔜 ✔️ **💗 🛠️** 🎏 📦. ✋️ ⚫️ 🚫 💪 ✔️ 🏃‍♂ 📦 🍵 **🌘 1️⃣ 🏃‍♂ 🛠️**. 🚥 👑 🛠️ ⛔️, 📦 ⛔️. ## 🏗 ☁ 🖼 FastAPI 🆗, ➡️ 🏗 🕳 🔜 ❗ 👶 👤 🔜 🎦 👆 ❔ 🏗 **☁ 🖼** FastAPI **⚪️➡️ 🖌**, ⚓️ 🔛 **🛂 🐍** 🖼. 👉 ⚫️❔ 👆 🔜 💚 **🏆 💼**, 🖼: * ⚙️ **Kubernetes** ⚖️ 🎏 🧰 * 🕐❔ 🏃‍♂ 🔛 **🍓 👲** * ⚙️ ☁ 🐕‍🦺 👈 🔜 🏃 📦 🖼 👆, ♒️. ### 📦 📄 👆 🔜 🛎 ✔️ **📦 📄** 👆 🈸 📁. ⚫️ 🔜 🪀 ✴️ 🔛 🧰 👆 ⚙️ **❎** 👈 📄. 🌅 ⚠ 🌌 ⚫️ ✔️ 📁 `requirements.txt` ⏮️ 📦 📛 & 👫 ⏬, 1️⃣ 📍 ⏸. 👆 🔜 ↗️ ⚙️ 🎏 💭 👆 ✍ [🔃 FastAPI ⏬](versions.md){.internal-link target=_blank} ⚒ ↔ ⏬. 🖼, 👆 `requirements.txt` 💪 👀 💖: ``` fastapi>=0.68.0,<0.69.0 pydantic>=1.8.0,<2.0.0 uvicorn>=0.15.0,<0.16.0 ``` & 👆 🔜 🛎 ❎ 👈 📦 🔗 ⏮️ `pip`, 🖼:
```console $ pip install -r requirements.txt ---> 100% Successfully installed fastapi pydantic uvicorn ```
!!! info 📤 🎏 📁 & 🧰 🔬 & ❎ 📦 🔗. 👤 🔜 🎦 👆 🖼 ⚙️ 🎶 ⏪ 📄 🔛. 👶 ### ✍ **FastAPI** 📟 * ✍ `app` 📁 & ⛔ ⚫️. * ✍ 🛁 📁 `__init__.py`. * ✍ `main.py` 📁 ⏮️: ```Python from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ``` ### 📁 🔜 🎏 🏗 📁 ✍ 📁 `Dockerfile` ⏮️: ```{ .dockerfile .annotate } # (1) FROM python:3.9 # (2) WORKDIR /code # (3) COPY ./requirements.txt /code/requirements.txt # (4) RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt # (5) COPY ./app /code/app # (6) CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] ``` 1️⃣. ▶️ ⚪️➡️ 🛂 🐍 🧢 🖼. 2️⃣. ⚒ ⏮️ 👷 📁 `/code`. 👉 🌐❔ 👥 🔜 🚮 `requirements.txt` 📁 & `app` 📁. 3️⃣. 📁 📁 ⏮️ 📄 `/code` 📁. 📁 **🕴** 📁 ⏮️ 📄 🥇, 🚫 🎂 📟. 👉 📁 **🚫 🔀 🛎**, ☁ 🔜 🔍 ⚫️ & ⚙️ **💾** 👉 🔁, 🛠️ 💾 ⏭ 🔁 💁‍♂️. 4️⃣. ❎ 📦 🔗 📄 📁. `--no-cache-dir` 🎛 💬 `pip` 🚫 🖊 ⏬ 📦 🌐, 👈 🕴 🚥 `pip` 🔜 🏃 🔄 ❎ 🎏 📦, ✋️ 👈 🚫 💼 🕐❔ 👷 ⏮️ 📦. !!! note `--no-cache-dir` 🕴 🔗 `pip`, ⚫️ ✔️ 🕳 ⏮️ ☁ ⚖️ 📦. `--upgrade` 🎛 💬 `pip` ♻ 📦 🚥 👫 ⏪ ❎. ↩️ ⏮️ 🔁 🖨 📁 💪 🔍 **☁ 💾**, 👉 🔁 🔜 **⚙️ ☁ 💾** 🕐❔ 💪. ⚙️ 💾 👉 🔁 🔜 **🖊** 👆 📚 **🕰** 🕐❔ 🏗 🖼 🔄 & 🔄 ⏮️ 🛠️, ↩️ **⏬ & ❎** 🌐 🔗 **🔠 🕰**. 5️⃣. 📁 `./app` 📁 🔘 `/code` 📁. 👉 ✔️ 🌐 📟 ❔ ⚫️❔ **🔀 🌅 🛎** ☁ **💾** 🏆 🚫 ⚙️ 👉 ⚖️ 🙆 **📄 🔁** 💪. , ⚫️ ⚠ 🚮 👉 **🏘 🔚** `Dockerfile`, 🔬 📦 🖼 🏗 🕰. 6️⃣. ⚒ **📋** 🏃 `uvicorn` 💽. `CMD` ✊ 📇 🎻, 🔠 👫 🎻 ⚫️❔ 👆 🔜 🆎 📋 ⏸ 👽 🚀. 👉 📋 🔜 🏃 ⚪️➡️ **⏮️ 👷 📁**, 🎏 `/code` 📁 👆 ⚒ 🔛 ⏮️ `WORKDIR /code`. ↩️ 📋 🔜 ▶️ `/code` & 🔘 ⚫️ 📁 `./app` ⏮️ 👆 📟, **Uvicorn** 🔜 💪 👀 & **🗄** `app` ⚪️➡️ `app.main`. !!! tip 📄 ⚫️❔ 🔠 ⏸ 🔨 🖊 🔠 🔢 💭 📟. 👶 👆 🔜 🔜 ✔️ 📁 📊 💖: ``` . ├── app │   ├── __init__.py │ └── main.py ├── Dockerfile └── requirements.txt ``` #### ⛅ 🤝 ❎ 🗳 🚥 👆 🏃‍♂ 👆 📦 ⛅ 🤝 ❎ 🗳 (📐 ⚙) 💖 👌 ⚖️ Traefik, 🚮 🎛 `--proxy-headers`, 👉 🔜 💬 Uvicorn 💙 🎚 📨 👈 🗳 💬 ⚫️ 👈 🈸 🏃 ⛅ 🇺🇸🔍, ♒️. ```Dockerfile CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"] ``` #### ☁ 💾 📤 ⚠ 🎱 👉 `Dockerfile`, 👥 🥇 📁 **📁 ⏮️ 🔗 😞**, 🚫 🎂 📟. ➡️ 👤 💬 👆 ⚫️❔ 👈. ```Dockerfile COPY ./requirements.txt /code/requirements.txt ``` ☁ & 🎏 🧰 **🏗** 👉 📦 🖼 **🔁**, 🚮 **1️⃣ 🧽 🔛 🔝 🎏**, ▶️ ⚪️➡️ 🔝 `Dockerfile` & ❎ 🙆 📁 ✍ 🔠 👩‍🌾 `Dockerfile`. ☁ & 🎏 🧰 ⚙️ **🔗 💾** 🕐❔ 🏗 🖼, 🚥 📁 🚫 🔀 ↩️ 🏁 🕰 🏗 📦 🖼, ⤴️ ⚫️ 🔜 **🏤-⚙️ 🎏 🧽** ✍ 🏁 🕰, ↩️ 🖨 📁 🔄 & 🏗 🆕 🧽 ⚪️➡️ 🖌. ❎ 📁 📁 🚫 🎯 📉 👜 💁‍♂️ 🌅, ✋️ ↩️ ⚫️ ⚙️ 💾 👈 🔁, ⚫️ 💪 **⚙️ 💾 ⏭ 🔁**. 🖼, ⚫️ 💪 ⚙️ 💾 👩‍🌾 👈 ❎ 🔗 ⏮️: ```Dockerfile RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt ``` 📁 ⏮️ 📦 📄 **🏆 🚫 🔀 🛎**. , 🖨 🕴 👈 📁, ☁ 🔜 💪 **⚙️ 💾** 👈 🔁. & ⤴️, ☁ 🔜 💪 **⚙️ 💾 ⏭ 🔁** 👈 ⏬ & ❎ 👈 🔗. & 📥 🌐❔ 👥 **🖊 📚 🕰**. 👶 ...& ❎ 😩 ⌛. 👶 👶 ⏬ & ❎ 📦 🔗 **💪 ✊ ⏲**, ✋️ ⚙️ **💾** 🔜 **✊ 🥈** 🌅. & 👆 🔜 🏗 📦 🖼 🔄 & 🔄 ⏮️ 🛠️ ✅ 👈 👆 📟 🔀 👷, 📤 📚 📈 🕰 👉 🔜 🖊. ⤴️, 🏘 🔚 `Dockerfile`, 👥 📁 🌐 📟. 👉 ⚫️❔ **🔀 🏆 🛎**, 👥 🚮 ⚫️ 🏘 🔚, ↩️ 🌖 🕧, 🕳 ⏮️ 👉 🔁 🔜 🚫 💪 ⚙️ 💾. ```Dockerfile COPY ./app /code/app ``` ### 🏗 ☁ 🖼 🔜 👈 🌐 📁 🥉, ➡️ 🏗 📦 🖼. * 🚶 🏗 📁 (🌐❔ 👆 `Dockerfile` , ⚗ 👆 `app` 📁). * 🏗 👆 FastAPI 🖼:
```console $ docker build -t myimage . ---> 100% ```
!!! tip 👀 `.` 🔚, ⚫️ 🌓 `./`, ⚫️ 💬 ☁ 📁 ⚙️ 🏗 📦 🖼. 👉 💼, ⚫️ 🎏 ⏮️ 📁 (`.`). ### ▶️ ☁ 📦 * 🏃 📦 ⚓️ 🔛 👆 🖼:
```console $ docker run -d --name mycontainer -p 80:80 myimage ```
## ✅ ⚫️ 👆 🔜 💪 ✅ ⚫️ 👆 ☁ 📦 📛, 🖼: http://192.168.99.100/items/5?q=somequery ⚖️ http://127.0.0.1/items/5?q=somequery (⚖️ 🌓, ⚙️ 👆 ☁ 🦠). 👆 🔜 👀 🕳 💖: ```JSON {"item_id": 5, "q": "somequery"} ``` ## 🎓 🛠️ 🩺 🔜 👆 💪 🚶 http://192.168.99.100/docs ⚖️ http://127.0.0.1/docs (⚖️ 🌓, ⚙️ 👆 ☁ 🦠). 👆 🔜 👀 🏧 🎓 🛠️ 🧾 (🚚 🦁 🎚): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ## 🎛 🛠️ 🩺 & 👆 💪 🚶 http://192.168.99.100/redoc ⚖️ http://127.0.0.1/redoc (⚖️ 🌓, ⚙️ 👆 ☁ 🦠). 👆 🔜 👀 🎛 🏧 🧾 (🚚 📄): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ## 🏗 ☁ 🖼 ⏮️ 👁-📁 FastAPI 🚥 👆 FastAPI 👁 📁, 🖼, `main.py` 🍵 `./app` 📁, 👆 📁 📊 💪 👀 💖 👉: ``` . ├── Dockerfile ├── main.py └── requirements.txt ``` ⤴️ 👆 🔜 ✔️ 🔀 🔗 ➡ 📁 📁 🔘 `Dockerfile`: ```{ .dockerfile .annotate hl_lines="10 13" } FROM python:3.9 WORKDIR /code COPY ./requirements.txt /code/requirements.txt RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt # (1) COPY ./main.py /code/ # (2) CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"] ``` 1️⃣. 📁 `main.py` 📁 `/code` 📁 🔗 (🍵 🙆 `./app` 📁). 2️⃣. 🏃 Uvicorn & 💬 ⚫️ 🗄 `app` 🎚 ⚪️➡️ `main` (↩️ 🏭 ⚪️➡️ `app.main`). ⤴️ 🔆 Uvicorn 📋 ⚙️ 🆕 🕹 `main` ↩️ `app.main` 🗄 FastAPI 🎚 `app`. ## 🛠️ 🔧 ➡️ 💬 🔄 🔃 🎏 [🛠️ 🔧](concepts.md){.internal-link target=_blank} ⚖ 📦. 📦 ✴️ 🧰 📉 🛠️ **🏗 & 🛠️** 🈸, ✋️ 👫 🚫 🛠️ 🎯 🎯 🍵 👉 **🛠️ 🔧**, & 📤 📚 💪 🎛. **👍 📰** 👈 ⏮️ 🔠 🎏 🎛 📤 🌌 📔 🌐 🛠️ 🔧. 👶 ➡️ 📄 👉 **🛠️ 🔧** ⚖ 📦: * 🇺🇸🔍 * 🏃‍♂ 🔛 🕴 * ⏏ * 🧬 (🔢 🛠️ 🏃) * 💾 * ⏮️ 🔁 ⏭ ▶️ ## 🇺🇸🔍 🚥 👥 🎯 🔛 **📦 🖼** FastAPI 🈸 (& ⏪ 🏃‍♂ **📦**), 🇺🇸🔍 🛎 🔜 🍵 **🗜** ➕1️⃣ 🧰. ⚫️ 💪 ➕1️⃣ 📦, 🖼 ⏮️ Traefik, 🚚 **🇺🇸🔍** & **🏧** 🛠️ **📄**. !!! tip Traefik ✔️ 🛠️ ⏮️ ☁, Kubernetes, & 🎏, ⚫️ 📶 ⏩ ⚒ 🆙 & 🔗 🇺🇸🔍 👆 📦 ⏮️ ⚫️. 👐, 🇺🇸🔍 💪 🍵 ☁ 🐕‍🦺 1️⃣ 👫 🐕‍🦺 (⏪ 🏃 🈸 📦). ## 🏃‍♂ 🔛 🕴 & ⏏ 📤 🛎 ➕1️⃣ 🧰 🈚 **▶️ & 🏃‍♂** 👆 📦. ⚫️ 💪 **☁** 🔗, **☁ ✍**, **Kubernetes**, **☁ 🐕‍🦺**, ♒️. 🌅 (⚖️ 🌐) 💼, 📤 🙅 🎛 🛠️ 🏃 📦 🔛 🕴 & 🛠️ ⏏ 🔛 ❌. 🖼, ☁, ⚫️ 📋 ⏸ 🎛 `--restart`. 🍵 ⚙️ 📦, ⚒ 🈸 🏃 🔛 🕴 & ⏮️ ⏏ 💪 ⚠ & ⚠. ✋️ 🕐❔ **👷 ⏮️ 📦** 🌅 💼 👈 🛠️ 🔌 🔢. 👶 ## 🧬 - 🔢 🛠️ 🚥 👆 ✔️ 🌑 🎰 ⏮️ **☁**, ☁ 🐝 📳, 🖖, ⚖️ ➕1️⃣ 🎏 🏗 ⚙️ 🛠️ 📎 📦 🔛 💗 🎰, ⤴️ 👆 🔜 🎲 💚 **🍵 🧬** **🌑 🎚** ↩️ ⚙️ **🛠️ 👨‍💼** (💖 🐁 ⏮️ 👨‍🏭) 🔠 📦. 1️⃣ 📚 📎 📦 🧾 ⚙️ 💖 Kubernetes 🛎 ✔️ 🛠️ 🌌 🚚 **🧬 📦** ⏪ 🔗 **📐 ⚖** 📨 📨. 🌐 **🌑 🎚**. 📚 💼, 👆 🔜 🎲 💚 🏗 **☁ 🖼 ⚪️➡️ 🖌** [🔬 🔛](#_6), ❎ 👆 🔗, & 🏃‍♂ **👁 Uvicorn 🛠️** ↩️ 🏃‍♂ 🕳 💖 🐁 ⏮️ Uvicorn 👨‍🏭. ### 📐 ⚙ 🕐❔ ⚙️ 📦, 👆 🔜 🛎 ✔️ 🦲 **👂 🔛 👑 ⛴**. ⚫️ 💪 🎲 ➕1️⃣ 📦 👈 **🤝 ❎ 🗳** 🍵 **🇺🇸🔍** ⚖️ 🎏 🧰. 👉 🦲 🔜 ✊ **📐** 📨 & 📎 👈 👪 👨‍🏭 (🤞) **⚖** 🌌, ⚫️ 🛎 🤙 **📐 ⚙**. !!! tip 🎏 **🤝 ❎ 🗳** 🦲 ⚙️ 🇺🇸🔍 🔜 🎲 **📐 ⚙**. & 🕐❔ 👷 ⏮️ 📦, 🎏 ⚙️ 👆 ⚙️ ▶️ & 🛠️ 👫 🔜 ⏪ ✔️ 🔗 🧰 📶 **🕸 📻** (✅ 🇺🇸🔍 📨) ⚪️➡️ 👈 **📐 ⚙** (👈 💪 **🤝 ❎ 🗳**) 📦(Ⓜ) ⏮️ 👆 📱. ### 1️⃣ 📐 ⚙ - 💗 👨‍🏭 📦 🕐❔ 👷 ⏮️ **Kubernetes** ⚖️ 🎏 📎 📦 🧾 ⚙️, ⚙️ 👫 🔗 🕸 🛠️ 🔜 ✔ 👁 **📐 ⚙** 👈 👂 🔛 👑 **⛴** 📶 📻 (📨) 🎲 **💗 📦** 🏃 👆 📱. 🔠 👫 📦 🏃‍♂ 👆 📱 🔜 🛎 ✔️ **1️⃣ 🛠️** (✅ Uvicorn 🛠️ 🏃 👆 FastAPI 🈸). 👫 🔜 🌐 **🌓 📦**, 🏃‍♂ 🎏 👜, ✋️ 🔠 ⏮️ 🚮 👍 🛠️, 💾, ♒️. 👈 🌌 👆 🔜 ✊ 📈 **🛠️** **🎏 🐚** 💽, ⚖️ **🎏 🎰**. & 📎 📦 ⚙️ ⏮️ **📐 ⚙** 🔜 **📎 📨** 🔠 1️⃣ 📦 ⏮️ 👆 📱 **🔄**. , 🔠 📨 💪 🍵 1️⃣ 💗 **🔁 📦** 🏃 👆 📱. & 🛎 👉 **📐 ⚙** 🔜 💪 🍵 📨 👈 🚶 *🎏* 📱 👆 🌑 (✅ 🎏 🆔, ⚖️ 🔽 🎏 📛 ➡ 🔡), & 🔜 📶 👈 📻 ▶️️ 📦 *👈 🎏* 🈸 🏃‍♂ 👆 🌑. ### 1️⃣ 🛠️ 📍 📦 👉 🆎 😐, 👆 🎲 🔜 💚 ✔️ **👁 (Uvicorn) 🛠️ 📍 📦**, 👆 🔜 ⏪ 🚚 🧬 🌑 🎚. , 👉 💼, 👆 **🔜 🚫** 💚 ✔️ 🛠️ 👨‍💼 💖 🐁 ⏮️ Uvicorn 👨‍🏭, ⚖️ Uvicorn ⚙️ 🚮 👍 Uvicorn 👨‍🏭. 👆 🔜 💚 ✔️ **👁 Uvicorn 🛠️** 📍 📦 (✋️ 🎲 💗 📦). ✔️ ➕1️⃣ 🛠️ 👨‍💼 🔘 📦 (🔜 ⏮️ 🐁 ⚖️ Uvicorn 🛠️ Uvicorn 👨‍🏭) 🔜 🕴 🚮 **🙃 🔀** 👈 👆 🌅 🎲 ⏪ ✊ 💅 ⏮️ 👆 🌑 ⚙️. ### 📦 ⏮️ 💗 🛠️ & 🎁 💼 ↗️, 📤 **🎁 💼** 🌐❔ 👆 💪 💚 ✔️ **📦** ⏮️ **🐁 🛠️ 👨‍💼** ▶️ 📚 **Uvicorn 👨‍🏭 🛠️** 🔘. 📚 💼, 👆 💪 ⚙️ **🛂 ☁ 🖼** 👈 🔌 **🐁** 🛠️ 👨‍💼 🏃‍♂ 💗 **Uvicorn 👨‍🏭 🛠️**, & 🔢 ⚒ 🔆 🔢 👨‍🏭 ⚓️ 🔛 ⏮️ 💽 🐚 🔁. 👤 🔜 💬 👆 🌅 🔃 ⚫️ 🔛 [🛂 ☁ 🖼 ⏮️ 🐁 - Uvicorn](#-uvicorn). 📥 🖼 🕐❔ 👈 💪 ⚒ 🔑: #### 🙅 📱 👆 💪 💚 🛠️ 👨‍💼 📦 🚥 👆 🈸 **🙅 🥃** 👈 👆 🚫 💪 (🐥 🚫) 👌-🎶 🔢 🛠️ 💁‍♂️ 🌅, & 👆 💪 ⚙️ 🏧 🔢 (⏮️ 🛂 ☁ 🖼), & 👆 🏃‍♂ ⚫️ 🔛 **👁 💽**, 🚫 🌑. #### ☁ ✍ 👆 💪 🛠️ **👁 💽** (🚫 🌑) ⏮️ **☁ ✍**, 👆 🚫🔜 ✔️ ⏩ 🌌 🛠️ 🧬 📦 (⏮️ ☁ ✍) ⏪ 🛡 🔗 🕸 & **📐 ⚖**. ⤴️ 👆 💪 💚 ✔️ **👁 📦** ⏮️ **🛠️ 👨‍💼** ▶️ **📚 👨‍🏭 🛠️** 🔘. #### 🤴 & 🎏 🤔 👆 💪 ✔️ **🎏 🤔** 👈 🔜 ⚒ ⚫️ ⏩ ✔️ **👁 📦** ⏮️ **💗 🛠️** ↩️ ✔️ **💗 📦** ⏮️ **👁 🛠️** 🔠 👫. 🖼 (🪀 🔛 👆 🖥) 👆 💪 ✔️ 🧰 💖 🤴 🏭 🎏 📦 👈 🔜 ✔️ 🔐 **🔠 📨** 👈 👟. 👉 💼, 🚥 👆 ✔️ **💗 📦**, 🔢, 🕐❔ 🤴 👟 **✍ ⚖**, ⚫️ 🔜 🤚 🕐 **👁 📦 🔠 🕰** (📦 👈 🍵 👈 🎯 📨), ↩️ 🤚 **📈 ⚖** 🌐 🔁 📦. ⤴️, 👈 💼, ⚫️ 💪 🙅 ✔️ **1️⃣ 📦** ⏮️ **💗 🛠️**, & 🇧🇿 🧰 (✅ 🤴 🏭) 🔛 🎏 📦 📈 🤴 ⚖ 🌐 🔗 🛠️ & 🎦 👈 ⚖ 🔛 👈 👁 📦. --- 👑 ☝, **👌** 👉 **🚫 ✍ 🗿** 👈 👆 ✔️ 😄 ⏩. 👆 💪 ⚙️ 👫 💭 **🔬 👆 👍 ⚙️ 💼** & 💭 ⚫️❔ 👍 🎯 👆 ⚙️, ✅ 👅 ❔ 🛠️ 🔧: * 💂‍♂ - 🇺🇸🔍 * 🏃‍♂ 🔛 🕴 * ⏏ * 🧬 (🔢 🛠️ 🏃) * 💾 * ⏮️ 🔁 ⏭ ▶️ ## 💾 🚥 👆 🏃 **👁 🛠️ 📍 📦** 👆 🔜 ✔️ 🌅 ⚖️ 🌘 👍-🔬, ⚖, & 📉 💸 💾 🍴 🔠 👈 📦 (🌅 🌘 1️⃣ 🚥 👫 🔁). & ⤴️ 👆 💪 ⚒ 👈 🎏 💾 📉 & 📄 👆 📳 👆 📦 🧾 ⚙️ (🖼 **Kubernetes**). 👈 🌌 ⚫️ 🔜 💪 **🔁 📦** **💪 🎰** ✊ 🔘 🏧 💸 💾 💪 👫, & 💸 💪 🎰 🌑. 🚥 👆 🈸 **🙅**, 👉 🔜 🎲 **🚫 ⚠**, & 👆 💪 🚫 💪 ✔ 🏋️ 💾 📉. ✋️ 🚥 👆 **⚙️ 📚 💾** (🖼 ⏮️ **🎰 🏫** 🏷), 👆 🔜 ✅ ❔ 🌅 💾 👆 😩 & 🔆 **🔢 📦** 👈 🏃 **🔠 🎰** (& 🎲 🚮 🌖 🎰 👆 🌑). 🚥 👆 🏃 **💗 🛠️ 📍 📦** (🖼 ⏮️ 🛂 ☁ 🖼) 👆 🔜 ✔️ ⚒ 💭 👈 🔢 🛠️ ▶️ 🚫 **🍴 🌖 💾** 🌘 ⚫️❔ 💪. ## ⏮️ 🔁 ⏭ ▶️ & 📦 🚥 👆 ⚙️ 📦 (✅ ☁, Kubernetes), ⤴️ 📤 2️⃣ 👑 🎯 👆 💪 ⚙️. ### 💗 📦 🚥 👆 ✔️ **💗 📦**, 🎲 🔠 1️⃣ 🏃 **👁 🛠️** (🖼, **Kubernetes** 🌑), ⤴️ 👆 🔜 🎲 💚 ✔️ **🎏 📦** 🔨 👷 **⏮️ 📶** 👁 📦, 🏃 👁 🛠️, **⏭** 🏃 🔁 👨‍🏭 📦. !!! info 🚥 👆 ⚙️ Kubernetes, 👉 🔜 🎲 🕑 📦. 🚥 👆 ⚙️ 💼 📤 🙅‍♂ ⚠ 🏃‍♂ 👈 ⏮️ 📶 **💗 🕰 🔗** (🖼 🚥 👆 🚫 🏃 💽 🛠️, ✋️ ✅ 🚥 💽 🔜), ⤴️ 👆 💪 🚮 👫 🔠 📦 ▶️️ ⏭ ▶️ 👑 🛠️. ### 👁 📦 🚥 👆 ✔️ 🙅 🖥, ⏮️ **👁 📦** 👈 ⤴️ ▶️ 💗 **👨‍🏭 🛠️** (⚖️ 1️⃣ 🛠️), ⤴️ 👆 💪 🏃 👈 ⏮️ 🔁 🎏 📦, ▶️️ ⏭ ▶️ 🛠️ ⏮️ 📱. 🛂 ☁ 🖼 🐕‍🦺 👉 🔘. ## 🛂 ☁ 🖼 ⏮️ 🐁 - Uvicorn 📤 🛂 ☁ 🖼 👈 🔌 🐁 🏃‍♂ ⏮️ Uvicorn 👨‍🏭, ℹ ⏮️ 📃: [💽 👨‍🏭 - 🐁 ⏮️ Uvicorn](server-workers.md){.internal-link target=_blank}. 👉 🖼 🔜 ⚠ ✴️ ⚠ 🔬 🔛: [📦 ⏮️ 💗 🛠️ & 🎁 💼](#_18). * tiangolo/uvicorn-🐁-fastapi. !!! warning 📤 ↕ 🤞 👈 👆 **🚫** 💪 👉 🧢 🖼 ⚖️ 🙆 🎏 🎏 1️⃣, & 🔜 👻 📆 🏗 🖼 ⚪️➡️ 🖌 [🔬 🔛: 🏗 ☁ 🖼 FastAPI](#fastapi). 👉 🖼 ✔️ **🚘-📳** 🛠️ 🔌 ⚒ **🔢 👨‍🏭 🛠️** ⚓️ 🔛 💽 🐚 💪. ⚫️ ✔️ **🤔 🔢**, ✋️ 👆 💪 🔀 & ℹ 🌐 📳 ⏮️ **🌐 🔢** ⚖️ 📳 📁. ⚫️ 🐕‍🦺 🏃 **⏮️ 🔁 ⏭ ▶️** ⏮️ ✍. !!! tip 👀 🌐 📳 & 🎛, 🚶 ☁ 🖼 📃: Tiangolo/uvicorn-🐁-fastapi. ### 🔢 🛠️ 🔛 🛂 ☁ 🖼 **🔢 🛠️** 🔛 👉 🖼 **📊 🔁** ⚪️➡️ 💽 **🐚** 💪. 👉 ⛓ 👈 ⚫️ 🔜 🔄 **🗜** 🌅 **🎭** ⚪️➡️ 💽 💪. 👆 💪 🔆 ⚫️ ⏮️ 📳 ⚙️ **🌐 🔢**, ♒️. ✋️ ⚫️ ⛓ 👈 🔢 🛠️ 🪀 🔛 💽 📦 🏃, **💸 💾 🍴** 🔜 🪀 🔛 👈. , 🚥 👆 🈸 🍴 📚 💾 (🖼 ⏮️ 🎰 🏫 🏷), & 👆 💽 ✔️ 📚 💽 🐚 **✋️ 🐥 💾**, ⤴️ 👆 📦 💪 🔚 🆙 🔄 ⚙️ 🌅 💾 🌘 ⚫️❔ 💪, & 🤕 🎭 📚 (⚖️ 💥). 👶 ### ✍ `Dockerfile` 📥 ❔ 👆 🔜 ✍ `Dockerfile` ⚓️ 🔛 👉 🖼: ```Dockerfile FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 COPY ./requirements.txt /app/requirements.txt RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt COPY ./app /app ``` ### 🦏 🈸 🚥 👆 ⏩ 📄 🔃 🏗 [🦏 🈸 ⏮️ 💗 📁](../tutorial/bigger-applications.md){.internal-link target=_blank}, 👆 `Dockerfile` 💪 ↩️ 👀 💖: ```Dockerfile hl_lines="7" FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 COPY ./requirements.txt /app/requirements.txt RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt COPY ./app /app/app ``` ### 🕐❔ ⚙️ 👆 🔜 🎲 **🚫** ⚙️ 👉 🛂 🧢 🖼 (⚖️ 🙆 🎏 🎏 1️⃣) 🚥 👆 ⚙️ **Kubernetes** (⚖️ 🎏) & 👆 ⏪ ⚒ **🧬** 🌑 🎚, ⏮️ 💗 **📦**. 📚 💼, 👆 👍 📆 **🏗 🖼 ⚪️➡️ 🖌** 🔬 🔛: [🏗 ☁ 🖼 FastAPI](#fastapi). 👉 🖼 🔜 ⚠ ✴️ 🎁 💼 🔬 🔛 [📦 ⏮️ 💗 🛠️ & 🎁 💼](#_18). 🖼, 🚥 👆 🈸 **🙅 🥃** 👈 ⚒ 🔢 🔢 🛠️ ⚓️ 🔛 💽 👷 👍, 👆 🚫 💚 😥 ⏮️ ❎ 🛠️ 🧬 🌑 🎚, & 👆 🚫 🏃 🌅 🌘 1️⃣ 📦 ⏮️ 👆 📱. ⚖️ 🚥 👆 🛠️ ⏮️ **☁ ✍**, 🏃 🔛 👁 💽, ♒️. ## 🛠️ 📦 🖼 ⏮️ ✔️ 📦 (☁) 🖼 📤 📚 🌌 🛠️ ⚫️. 🖼: * ⏮️ **☁ ✍** 👁 💽 * ⏮️ **Kubernetes** 🌑 * ⏮️ ☁ 🐝 📳 🌑 * ⏮️ ➕1️⃣ 🧰 💖 🖖 * ⏮️ ☁ 🐕‍🦺 👈 ✊ 👆 📦 🖼 & 🛠️ ⚫️ ## ☁ 🖼 ⏮️ 🎶 🚥 👆 ⚙️ 🎶 🛠️ 👆 🏗 🔗, 👆 💪 ⚙️ ☁ 👁-▶️ 🏗: ```{ .dockerfile .annotate } # (1) FROM python:3.9 as requirements-stage # (2) WORKDIR /tmp # (3) RUN pip install poetry # (4) COPY ./pyproject.toml ./poetry.lock* /tmp/ # (5) RUN poetry export -f requirements.txt --output requirements.txt --without-hashes # (6) FROM python:3.9 # (7) WORKDIR /code # (8) COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt # (9) RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt # (10) COPY ./app /code/app # (11) CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] ``` 1️⃣. 👉 🥇 ▶️, ⚫️ 🌟 `requirements-stage`. 2️⃣. ⚒ `/tmp` ⏮️ 👷 📁. 📥 🌐❔ 👥 🔜 🏗 📁 `requirements.txt` 3️⃣. ❎ 🎶 👉 ☁ ▶️. 4️⃣. 📁 `pyproject.toml` & `poetry.lock` 📁 `/tmp` 📁. ↩️ ⚫️ ⚙️ `./poetry.lock*` (▶️ ⏮️ `*`), ⚫️ 🏆 🚫 💥 🚥 👈 📁 🚫 💪. 5️⃣. 🏗 `requirements.txt` 📁. 6️⃣. 👉 🏁 ▶️, 🕳 📥 🔜 🛡 🏁 📦 🖼. 7️⃣. ⚒ ⏮️ 👷 📁 `/code`. 8️⃣. 📁 `requirements.txt` 📁 `/code` 📁. 👉 📁 🕴 🖖 ⏮️ ☁ ▶️, 👈 ⚫️❔ 👥 ⚙️ `--from-requirements-stage` 📁 ⚫️. 9️⃣. ❎ 📦 🔗 🏗 `requirements.txt` 📁. 1️⃣0️⃣. 📁 `app` 📁 `/code` 📁. 1️⃣1️⃣. 🏃 `uvicorn` 📋, 💬 ⚫️ ⚙️ `app` 🎚 🗄 ⚪️➡️ `app.main`. !!! tip 🖊 💭 🔢 👀 ⚫️❔ 🔠 ⏸ 🔨. **☁ ▶️** 🍕 `Dockerfile` 👈 👷 **🍕 📦 🖼** 👈 🕴 ⚙️ 🏗 📁 ⚙️ ⏪. 🥇 ▶️ 🔜 🕴 ⚙️ **❎ 🎶** & **🏗 `requirements.txt`** ⏮️ 👆 🏗 🔗 ⚪️➡️ 🎶 `pyproject.toml` 📁. 👉 `requirements.txt` 📁 🔜 ⚙️ ⏮️ `pip` ⏪ **⏭ ▶️**. 🏁 📦 🖼 **🕴 🏁 ▶️** 🛡. ⏮️ ▶️(Ⓜ) 🔜 ❎. 🕐❔ ⚙️ 🎶, ⚫️ 🔜 ⚒ 🔑 ⚙️ **☁ 👁-▶️ 🏗** ↩️ 👆 🚫 🤙 💪 ✔️ 🎶 & 🚮 🔗 ❎ 🏁 📦 🖼, 👆 **🕴 💪** ✔️ 🏗 `requirements.txt` 📁 ❎ 👆 🏗 🔗. ⤴️ ⏭ (& 🏁) ▶️ 👆 🔜 🏗 🖼 🌅 ⚖️ 🌘 🎏 🌌 🔬 ⏭. ### ⛅ 🤝 ❎ 🗳 - 🎶 🔄, 🚥 👆 🏃‍♂ 👆 📦 ⛅ 🤝 ❎ 🗳 (📐 ⚙) 💖 👌 ⚖️ Traefik, 🚮 🎛 `--proxy-headers` 📋: ```Dockerfile CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"] ``` ## 🌃 ⚙️ 📦 ⚙️ (✅ ⏮️ **☁** & **Kubernetes**) ⚫️ ▶️️ 📶 🎯 🍵 🌐 **🛠️ 🔧**: * 🇺🇸🔍 * 🏃‍♂ 🔛 🕴 * ⏏ * 🧬 (🔢 🛠️ 🏃) * 💾 * ⏮️ 🔁 ⏭ ▶️ 🌅 💼, 👆 🎲 🏆 🚫 💚 ⚙️ 🙆 🧢 🖼, & ↩️ **🏗 📦 🖼 ⚪️➡️ 🖌** 1️⃣ ⚓️ 🔛 🛂 🐍 ☁ 🖼. ✊ 💅 **✔** 👩‍🌾 `Dockerfile` & **☁ 💾** 👆 💪 **📉 🏗 🕰**, 📉 👆 📈 (& ❎ 😩). 👶 🎯 🎁 💼, 👆 💪 💚 ⚙️ 🛂 ☁ 🖼 FastAPI. 👶 fastapi-0.110.3/docs/em/docs/deployment/https.md000066400000000000000000000226721461403617600214510ustar00rootroot00000000000000# 🔃 🇺🇸🔍 ⚫️ ⏩ 🤔 👈 🇺🇸🔍 🕳 👈 "🛠️" ⚖️ 🚫. ✋️ ⚫️ 🌌 🌖 🏗 🌘 👈. !!! tip 🚥 👆 🏃 ⚖️ 🚫 💅, 😣 ⏮️ ⏭ 📄 🔁 🔁 👩‍🌾 ⚒ 🌐 🆙 ⏮️ 🎏 ⚒. **💡 🔰 🇺🇸🔍**, ⚪️➡️ 🏬 🤔, ✅ https://howhttps.works/. 🔜, ⚪️➡️ **👩‍💻 🤔**, 📥 📚 👜 ✔️ 🤯 ⏪ 💭 🔃 🇺🇸🔍: * 🇺🇸🔍, **💽** 💪 **✔️ "📄"** 🏗 **🥉 🥳**. * 📚 📄 🤙 **🏆** ⚪️➡️ 🥉 🥳, 🚫 "🏗". * 📄 ✔️ **1️⃣2️⃣🗓️**. * 👫 **🕛**. * & ⤴️ 👫 💪 **♻**, **🏆 🔄** ⚪️➡️ 🥉 🥳. * 🔐 🔗 🔨 **🕸 🎚**. * 👈 1️⃣ 🧽 **🔛 🇺🇸🔍**. * , **📄 & 🔐** 🍵 🔨 **⏭ 🇺🇸🔍**. * **🕸 🚫 💭 🔃 "🆔"**. 🕴 🔃 📢 📢. * ℹ 🔃 **🎯 🆔** 📨 🚶 **🇺🇸🔍 💽**. * **🇺🇸🔍 📄** "✔" **🎯 🆔**, ✋️ 🛠️ & 🔐 🔨 🕸 🎚, **⏭ 💭** ❔ 🆔 ➖ 🙅 ⏮️. * **🔢**, 👈 🔜 ⛓ 👈 👆 💪 🕴 ✔️ **1️⃣ 🇺🇸🔍 📄 📍 📢 📢**. * 🙅‍♂ 🤔 ❔ 🦏 👆 💽 ⚖️ ❔ 🤪 🔠 🈸 👆 ✔️ 🔛 ⚫️ 💪. * 📤 **⚗** 👉, 👐. * 📤 **↔** **🤝** 🛠️ (1️⃣ 🚚 🔐 🕸 🎚, ⏭ 🇺🇸🔍) 🤙 **👲**. * 👉 👲 ↔ ✔ 1️⃣ 👁 💽 (⏮️ **👁 📢 📢**) ✔️ **📚 🇺🇸🔍 📄** & 🍦 **💗 🇺🇸🔍 🆔/🈸**. * 👉 👷, **👁** 🦲 (📋) 🏃 🔛 💽, 👂 🔛 **📢 📢 📢**, 🔜 ✔️ **🌐 🇺🇸🔍 📄** 💽. * **⏮️** 🏆 🔐 🔗, 📻 🛠️ **🇺🇸🔍**. * 🎚 **🗜**, ✋️ 👫 ➖ 📨 ⏮️ **🇺🇸🔍 🛠️**. ⚫️ ⚠ 💡 ✔️ **1️⃣ 📋/🇺🇸🔍 💽** 🏃 🔛 💽 (🎰, 🦠, ♒️.) & **🛠️ 🌐 🇺🇸🔍 🍕**: 📨 **🗜 🇺🇸🔍 📨**, 📨 **🗜 🇺🇸🔍 📨** ☑ 🇺🇸🔍 🈸 🏃 🎏 💽 ( **FastAPI** 🈸, 👉 💼), ✊ **🇺🇸🔍 📨** ⚪️➡️ 🈸, **🗜 ⚫️** ⚙️ ☑ **🇺🇸🔍 📄** & 📨 ⚫️ 🔙 👩‍💻 ⚙️ **🇺🇸🔍**. 👉 💽 🛎 🤙 **🤝 ❎ 🗳**. 🎛 👆 💪 ⚙️ 🤝 ❎ 🗳: * Traefik (👈 💪 🍵 📄 🔕) * 📥 (👈 💪 🍵 📄 🔕) * 👌 * ✳ ## ➡️ 🗜 ⏭ ➡️ 🗜, 👫 **🇺🇸🔍 📄** 💲 💙 🥉 🥳. 🛠️ 📎 1️⃣ 👫 📄 ⚙️ ⚠, 🚚 📠 & 📄 😥. ✋️ ⤴️ **➡️ 🗜** ✍. ⚫️ 🏗 ⚪️➡️ 💾 🏛. ⚫️ 🚚 **🇺🇸🔍 📄 🆓**, 🏧 🌌. 👫 📄 ⚙️ 🌐 🐩 🔐 💂‍♂, & 📏-🖖 (🔃 3️⃣ 🗓️), **💂‍♂ 🤙 👍** ↩️ 👫 📉 🔆. 🆔 🔐 ✔ & 📄 🏗 🔁. 👉 ✔ 🏧 🔕 👫 📄. 💭 🏧 🛠️ & 🔕 👫 📄 👈 👆 💪 ✔️ **🔐 🇺🇸🔍, 🆓, ♾**. ## 🇺🇸🔍 👩‍💻 📥 🖼 ❔ 🇺🇸🔍 🛠️ 💪 👀 💖, 🔁 🔁, 💸 🙋 ✴️ 💭 ⚠ 👩‍💻. ### 🆔 📛 ⚫️ 🔜 🎲 🌐 ▶️ 👆 **🏗** **🆔 📛**. ⤴️, 👆 🔜 🔗 ⚫️ 🏓 💽 (🎲 👆 🎏 ☁ 🐕‍🦺). 👆 🔜 🎲 🤚 ☁ 💽 (🕹 🎰) ⚖️ 🕳 🎏, & ⚫️ 🔜 ✔️ 🔧 **📢 📢 📢**. 🏓 💽(Ⓜ) 👆 🔜 🔗 ⏺ ("`A record`") ☝ **👆 🆔** 📢 **📢 📢 👆 💽**. 👆 🔜 🎲 👉 🕐, 🥇 🕰, 🕐❔ ⚒ 🌐 🆙. !!! tip 👉 🆔 📛 🍕 🌌 ⏭ 🇺🇸🔍, ✋️ 🌐 🪀 🔛 🆔 & 📢 📢, ⚫️ 💸 💬 ⚫️ 📥. ### 🏓 🔜 ➡️ 🎯 🔛 🌐 ☑ 🇺🇸🔍 🍕. 🥇, 🖥 🔜 ✅ ⏮️ **🏓 💽** ⚫️❔ **📢 🆔**, 👉 💼, `someapp.example.com`. 🏓 💽 🔜 💬 🖥 ⚙️ 🎯 **📢 📢**. 👈 🔜 📢 📢 📢 ⚙️ 👆 💽, 👈 👆 🔗 🏓 💽. ### 🤝 🤝 ▶️ 🖥 🔜 ⤴️ 🔗 ⏮️ 👈 📢 📢 🔛 **⛴ 4️⃣4️⃣3️⃣** (🇺🇸🔍 ⛴). 🥇 🍕 📻 🛠️ 🔗 🖖 👩‍💻 & 💽 & 💭 🔐 🔑 👫 🔜 ⚙️, ♒️. 👉 🔗 🖖 👩‍💻 & 💽 🛠️ 🤝 🔗 🤙 **🤝 🤝**. ### 🤝 ⏮️ 👲 ↔ **🕴 1️⃣ 🛠️** 💽 💪 👂 🔛 🎯 **⛴** 🎯 **📢 📢**. 📤 💪 🎏 🛠️ 👂 🔛 🎏 ⛴ 🎏 📢 📢, ✋️ 🕴 1️⃣ 🔠 🌀 📢 📢 & ⛴. 🤝 (🇺🇸🔍) ⚙️ 🎯 ⛴ `443` 🔢. 👈 ⛴ 👥 🔜 💪. 🕴 1️⃣ 🛠️ 💪 👂 🔛 👉 ⛴, 🛠️ 👈 🔜 ⚫️ 🔜 **🤝 ❎ 🗳**. 🤝 ❎ 🗳 🔜 ✔️ 🔐 1️⃣ ⚖️ 🌅 **🤝 📄** (🇺🇸🔍 📄). ⚙️ **👲 ↔** 🔬 🔛, 🤝 ❎ 🗳 🔜 ✅ ❔ 🤝 (🇺🇸🔍) 📄 💪 ⚫️ 🔜 ⚙️ 👉 🔗, ⚙️ 1️⃣ 👈 🏏 🆔 📈 👩‍💻. 👉 💼, ⚫️ 🔜 ⚙️ 📄 `someapp.example.com`. 👩‍💻 ⏪ **💙** 👨‍💼 👈 🏗 👈 🤝 📄 (👉 💼 ➡️ 🗜, ✋️ 👥 🔜 👀 🔃 👈 ⏪), ⚫️ 💪 **✔** 👈 📄 ☑. ⤴️, ⚙️ 📄, 👩‍💻 & 🤝 ❎ 🗳 **💭 ❔ 🗜** 🎂 **🕸 📻**. 👉 🏁 **🤝 🤝** 🍕. ⏮️ 👉, 👩‍💻 & 💽 ✔️ **🗜 🕸 🔗**, 👉 ⚫️❔ 🤝 🚚. & ⤴️ 👫 💪 ⚙️ 👈 🔗 ▶️ ☑ **🇺🇸🔍 📻**. & 👈 ⚫️❔ **🇺🇸🔍** , ⚫️ ✅ **🇺🇸🔍** 🔘 **🔐 🤝 🔗** ↩️ 😁 (💽) 🕸 🔗. !!! tip 👀 👈 🔐 📻 🔨 **🕸 🎚**, 🚫 🇺🇸🔍 🎚. ### 🇺🇸🔍 📨 🔜 👈 👩‍💻 & 💽 (🎯 🖥 & 🤝 ❎ 🗳) ✔️ **🗜 🕸 🔗**, 👫 💪 ▶️ **🇺🇸🔍 📻**. , 👩‍💻 📨 **🇺🇸🔍 📨**. 👉 🇺🇸🔍 📨 🔘 🗜 🤝 🔗. ### 🗜 📨 🤝 ❎ 🗳 🔜 ⚙️ 🔐 ✔ **🗜 📨**, & 🔜 📶 **✅ (🗜) 🇺🇸🔍 📨** 🛠️ 🏃 🈸 (🖼 🛠️ ⏮️ Uvicorn 🏃‍♂ FastAPI 🈸). ### 🇺🇸🔍 📨 🈸 🔜 🛠️ 📨 & 📨 **✅ (💽) 🇺🇸🔍 📨** 🤝 ❎ 🗳. ### 🇺🇸🔍 📨 🤝 ❎ 🗳 🔜 ⤴️ **🗜 📨** ⚙️ ⚛ ✔ ⏭ (👈 ▶️ ⏮️ 📄 `someapp.example.com`), & 📨 ⚫️ 🔙 🖥. ⏭, 🖥 🔜 ✔ 👈 📨 ☑ & 🗜 ⏮️ ▶️️ 🔐 🔑, ♒️. ⚫️ 🔜 ⤴️ **🗜 📨** & 🛠️ ⚫️. 👩‍💻 (🖥) 🔜 💭 👈 📨 👟 ⚪️➡️ ☑ 💽 ↩️ ⚫️ ⚙️ ⚛ 👫 ✔ ⚙️ **🇺🇸🔍 📄** ⏭. ### 💗 🈸 🎏 💽 (⚖️ 💽), 📤 💪 **💗 🈸**, 🖼, 🎏 🛠️ 📋 ⚖️ 💽. 🕴 1️⃣ 🛠️ 💪 🚚 🎯 📢 & ⛴ (🤝 ❎ 🗳 👆 🖼) ✋️ 🎏 🈸/🛠️ 💪 🏃 🔛 💽(Ⓜ) 💁‍♂️, 📏 👫 🚫 🔄 ⚙️ 🎏 **🌀 📢 📢 & ⛴**. 👈 🌌, 🤝 ❎ 🗳 💪 🍵 🇺🇸🔍 & 📄 **💗 🆔**, 💗 🈸, & ⤴️ 📶 📨 ▶️️ 🈸 🔠 💼. ### 📄 🔕 ☝ 🔮, 🔠 📄 🔜 **🕛** (🔃 3️⃣ 🗓️ ⏮️ 🏗 ⚫️). & ⤴️, 📤 🔜 ➕1️⃣ 📋 (💼 ⚫️ ➕1️⃣ 📋, 💼 ⚫️ 💪 🎏 🤝 ❎ 🗳) 👈 🔜 💬 ➡️ 🗜, & ♻ 📄(Ⓜ). **🤝 📄** **🔗 ⏮️ 🆔 📛**, 🚫 ⏮️ 📢 📢. , ♻ 📄, 🔕 📋 💪 **🎦** 🛃 (➡️ 🗜) 👈 ⚫️ 👐 **"👍" & 🎛 👈 🆔**. 👈, & 🏗 🎏 🈸 💪, 📤 📚 🌌 ⚫️ 💪 ⚫️. 🌟 🌌: * **🔀 🏓 ⏺**. * 👉, 🔕 📋 💪 🐕‍🦺 🔗 🏓 🐕‍🦺,, ⚓️ 🔛 🏓 🐕‍🦺 👆 ⚙️, 👉 5️⃣📆 ⚖️ 💪 🚫 🎛. * **🏃 💽** (🌘 ⏮️ 📄 🛠️ 🛠️) 🔛 📢 📢 📢 🔗 ⏮️ 🆔. * 👥 💬 🔛, 🕴 1️⃣ 🛠️ 💪 👂 🔛 🎯 📢 & ⛴. * 👉 1️⃣ 🤔 ⚫️❔ ⚫️ 📶 ⚠ 🕐❔ 🎏 🤝 ❎ 🗳 ✊ 💅 📄 🔕 🛠️. * ⏪, 👆 💪 ✔️ ⛔️ 🤝 ❎ 🗳 😖, ▶️ 🔕 📋 📎 📄, ⤴️ 🔗 👫 ⏮️ 🤝 ❎ 🗳, & ⤴️ ⏏ 🤝 ❎ 🗳. 👉 🚫 💯, 👆 📱(Ⓜ) 🔜 🚫 💪 ⏮️ 🕰 👈 🤝 ❎ 🗳 📆. 🌐 👉 🔕 🛠️, ⏪ 🍦 📱, 1️⃣ 👑 🤔 ⚫️❔ 👆 🔜 💚 ✔️ **🎏 ⚙️ 🍵 🇺🇸🔍** ⏮️ 🤝 ❎ 🗳 ↩️ ⚙️ 🤝 📄 ⏮️ 🈸 💽 🔗 (✅ Uvicorn). ## 🌃 ✔️ **🇺🇸🔍** 📶 ⚠, & **🎯** 🏆 💼. 🌅 🎯 👆 👩‍💻 ✔️ 🚮 🤭 🇺🇸🔍 🔃 **🤔 👉 🔧** & ❔ 👫 👷. ✋️ 🕐 👆 💭 🔰 ℹ **🇺🇸🔍 👩‍💻** 👆 💪 💪 🌀 & 🔗 🎏 🧰 ℹ 👆 🛠️ 🌐 🙅 🌌. ⏭ 📃, 👤 🔜 🎦 👆 📚 🧱 🖼 ❔ ⚒ 🆙 **🇺🇸🔍** **FastAPI** 🈸. 👶 fastapi-0.110.3/docs/em/docs/deployment/index.md000066400000000000000000000016311461403617600214060ustar00rootroot00000000000000# 🛠️ 🛠️ **FastAPI** 🈸 📶 ⏩. ## ⚫️❔ 🔨 🛠️ ⛓ **🛠️** 🈸 ⛓ 🎭 💪 📶 ⚒ ⚫️ **💪 👩‍💻**. **🕸 🛠️**, ⚫️ 🛎 🔌 🚮 ⚫️ **🛰 🎰**, ⏮️ **💽 📋** 👈 🚚 👍 🎭, ⚖, ♒️, 👈 👆 **👩‍💻** 💪 **🔐** 🈸 ♻ & 🍵 🔁 ⚖️ ⚠. 👉 🔅 **🛠️** ▶️, 🌐❔ 👆 🕧 🔀 📟, 💔 ⚫️ & ♻ ⚫️, ⛔️ & 🔁 🛠️ 💽, ♒️. ## 🛠️ 🎛 📤 📚 🌌 ⚫️ ⚓️ 🔛 👆 🎯 ⚙️ 💼 & 🧰 👈 👆 ⚙️. 👆 💪 **🛠️ 💽** 👆 ⚙️ 🌀 🧰, 👆 💪 ⚙️ **☁ 🐕‍🦺** 👈 🔨 🍕 👷 👆, ⚖️ 🎏 💪 🎛. 👤 🔜 🎦 👆 👑 🔧 👆 🔜 🎲 ✔️ 🤯 🕐❔ 🛠️ **FastAPI** 🈸 (👐 🌅 ⚫️ ✔ 🙆 🎏 🆎 🕸 🈸). 👆 🔜 👀 🌖 ℹ ✔️ 🤯 & ⚒ ⚫️ ⏭ 📄. 👶 fastapi-0.110.3/docs/em/docs/deployment/manually.md000066400000000000000000000104171461403617600221230ustar00rootroot00000000000000# 🏃 💽 ❎ - Uvicorn 👑 👜 👆 💪 🏃 **FastAPI** 🈸 🛰 💽 🎰 🔫 💽 📋 💖 **Uvicorn**. 📤 3️⃣ 👑 🎛: * Uvicorn: ↕ 🎭 🔫 💽. * Hypercorn: 🔫 💽 🔗 ⏮️ 🇺🇸🔍/2️⃣ & 🎻 👪 🎏 ⚒. * 👸: 🔫 💽 🏗 ✳ 📻. ## 💽 🎰 & 💽 📋 📤 🤪 ℹ 🔃 📛 ✔️ 🤯. 👶 🔤 "**💽**" 🛎 ⚙️ 🔗 👯‍♂️ 🛰/☁ 💻 (⚛ ⚖️ 🕹 🎰) & 📋 👈 🏃‍♂ 🔛 👈 🎰 (✅ Uvicorn). ✔️ 👈 🤯 🕐❔ 👆 ✍ "💽" 🏢, ⚫️ 💪 🔗 1️⃣ 📚 2️⃣ 👜. 🕐❔ 🔗 🛰 🎰, ⚫️ ⚠ 🤙 ⚫️ **💽**, ✋️ **🎰**, **💾** (🕹 🎰), **🕸**. 👈 🌐 🔗 🆎 🛰 🎰, 🛎 🏃‍♂ 💾, 🌐❔ 👆 🏃 📋. ## ❎ 💽 📋 👆 💪 ❎ 🔫 🔗 💽 ⏮️: === "Uvicorn" * Uvicorn, 🌩-⏩ 🔫 💽, 🏗 🔛 uvloop & httptool.
```console $ pip install "uvicorn[standard]" ---> 100% ```
!!! tip ❎ `standard`, Uvicorn 🔜 ❎ & ⚙️ 👍 ➕ 🔗. 👈 ✅ `uvloop`, ↕-🎭 💧-♻ `asyncio`, 👈 🚚 🦏 🛠️ 🎭 📈. === "Hypercorn" * Hypercorn, 🔫 💽 🔗 ⏮️ 🇺🇸🔍/2️⃣.
```console $ pip install hypercorn ---> 100% ```
...⚖️ 🙆 🎏 🔫 💽. ## 🏃 💽 📋 👆 💪 ⤴️ 🏃 👆 🈸 🎏 🌌 👆 ✔️ ⌛ 🔰, ✋️ 🍵 `--reload` 🎛, ✅: === "Uvicorn"
```console $ uvicorn main:app --host 0.0.0.0 --port 80 INFO: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit) ```
=== "Hypercorn"
```console $ hypercorn main:app --bind 0.0.0.0:80 Running on 0.0.0.0:8080 over http (CTRL + C to quit) ```
!!! warning 💭 ❎ `--reload` 🎛 🚥 👆 ⚙️ ⚫️. `--reload` 🎛 🍴 🌅 🌅 ℹ, 🌅 ⚠, ♒️. ⚫️ ℹ 📚 ⏮️ **🛠️**, ✋️ 👆 **🚫🔜 🚫** ⚙️ ⚫️ **🏭**. ## Hypercorn ⏮️ 🎻 💃 & **FastAPI** ⚓️ 🔛 AnyIO, ❔ ⚒ 👫 🔗 ⏮️ 👯‍♂️ 🐍 🐩 🗃 & 🎻. 👐, Uvicorn ⏳ 🕴 🔗 ⏮️ ✳, & ⚫️ 🛎 ⚙️ `uvloop`, ↕-🎭 💧-♻ `asyncio`. ✋️ 🚥 👆 💚 🔗 ⚙️ **🎻**, ⤴️ 👆 💪 ⚙️ **Hypercorn** ⚫️ 🐕‍🦺 ⚫️. 👶 ### ❎ Hypercorn ⏮️ 🎻 🥇 👆 💪 ❎ Hypercorn ⏮️ 🎻 🐕‍🦺:
```console $ pip install "hypercorn[trio]" ---> 100% ```
### 🏃 ⏮️ 🎻 ⤴️ 👆 💪 🚶‍♀️ 📋 ⏸ 🎛 `--worker-class` ⏮️ 💲 `trio`:
```console $ hypercorn main:app --worker-class trio ```
& 👈 🔜 ▶️ Hypercorn ⏮️ 👆 📱 ⚙️ 🎻 👩‍💻. 🔜 👆 💪 ⚙️ 🎻 🔘 👆 📱. ⚖️ 👍, 👆 💪 ⚙️ AnyIO, 🚧 👆 📟 🔗 ⏮️ 👯‍♂️ 🎻 & ✳. 👶 ## 🛠️ 🔧 👫 🖼 🏃 💽 📋 (📧.Ⓜ Uvicorn), ▶️ **👁 🛠️**, 👂 🔛 🌐 📢 (`0.0.0.0`) 🔛 🔁 ⛴ (✅ `80`). 👉 🔰 💭. ✋️ 👆 🔜 🎲 💚 ✊ 💅 🌖 👜, 💖: * 💂‍♂ - 🇺🇸🔍 * 🏃‍♂ 🔛 🕴 * ⏏ * 🧬 (🔢 🛠️ 🏃) * 💾 * ⏮️ 🔁 ⏭ ▶️ 👤 🔜 💬 👆 🌅 🔃 🔠 👫 🔧, ❔ 💭 🔃 👫, & 🧱 🖼 ⏮️ 🎛 🍵 👫 ⏭ 📃. 👶 fastapi-0.110.3/docs/em/docs/deployment/server-workers.md000066400000000000000000000203121461403617600232740ustar00rootroot00000000000000# 💽 👨‍🏭 - 🐁 ⏮️ Uvicorn ➡️ ✅ 🔙 👈 🛠️ 🔧 ⚪️➡️ ⏭: * 💂‍♂ - 🇺🇸🔍 * 🏃‍♂ 🔛 🕴 * ⏏ * **🧬 (🔢 🛠️ 🏃)** * 💾 * ⏮️ 🔁 ⏭ ▶️ 🆙 👉 ☝, ⏮️ 🌐 🔰 🩺, 👆 ✔️ 🎲 🏃‍♂ **💽 📋** 💖 Uvicorn, 🏃‍♂ **👁 🛠️**. 🕐❔ 🛠️ 🈸 👆 🔜 🎲 💚 ✔️ **🧬 🛠️** ✊ 📈 **💗 🐚** & 💪 🍵 🌅 📨. 👆 👀 ⏮️ 📃 🔃 [🛠️ 🔧](concepts.md){.internal-link target=_blank}, 📤 💗 🎛 👆 💪 ⚙️. 📥 👤 🔜 🎦 👆 ❔ ⚙️ **🐁** ⏮️ **Uvicorn 👨‍🏭 🛠️**. !!! info 🚥 👆 ⚙️ 📦, 🖼 ⏮️ ☁ ⚖️ Kubernetes, 👤 🔜 💬 👆 🌅 🔃 👈 ⏭ 📃: [FastAPI 📦 - ☁](docker.md){.internal-link target=_blank}. 🎯, 🕐❔ 🏃 🔛 **Kubernetes** 👆 🔜 🎲 **🚫** 💚 ⚙️ 🐁 & ↩️ 🏃 **👁 Uvicorn 🛠️ 📍 📦**, ✋️ 👤 🔜 💬 👆 🔃 ⚫️ ⏪ 👈 📃. ## 🐁 ⏮️ Uvicorn 👨‍🏭 **🐁** ✴️ 🈸 💽 ⚙️ **🇨🇻 🐩**. 👈 ⛓ 👈 🐁 💪 🍦 🈸 💖 🏺 & ✳. 🐁 ⚫️ 🚫 🔗 ⏮️ **FastAPI**, FastAPI ⚙️ 🆕 **🔫 🐩**. ✋️ 🐁 🐕‍🦺 👷 **🛠️ 👨‍💼** & 🤝 👩‍💻 💬 ⚫️ ❔ 🎯 **👨‍🏭 🛠️ 🎓** ⚙️. ⤴️ 🐁 🔜 ▶️ 1️⃣ ⚖️ 🌖 **👨‍🏭 🛠️** ⚙️ 👈 🎓. & **Uvicorn** ✔️ **🐁-🔗 👨‍🏭 🎓**. ⚙️ 👈 🌀, 🐁 🔜 🚫 **🛠️ 👨‍💼**, 👂 🔛 **⛴** & **📢**. & ⚫️ 🔜 **📶** 📻 👨‍🏭 🛠️ 🏃 **Uvicorn 🎓**. & ⤴️ 🐁-🔗 **Uvicorn 👨‍🏭** 🎓 🔜 🈚 🏭 📊 📨 🐁 🔫 🐩 FastAPI ⚙️ ⚫️. ## ❎ 🐁 & Uvicorn
```console $ pip install "uvicorn[standard]" gunicorn ---> 100% ```
👈 🔜 ❎ 👯‍♂️ Uvicorn ⏮️ `standard` ➕ 📦 (🤚 ↕ 🎭) & 🐁. ## 🏃 🐁 ⏮️ Uvicorn 👨‍🏭 ⤴️ 👆 💪 🏃 🐁 ⏮️:
```console $ gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80 [19499] [INFO] Starting gunicorn 20.1.0 [19499] [INFO] Listening at: http://0.0.0.0:80 (19499) [19499] [INFO] Using worker: uvicorn.workers.UvicornWorker [19511] [INFO] Booting worker with pid: 19511 [19513] [INFO] Booting worker with pid: 19513 [19514] [INFO] Booting worker with pid: 19514 [19515] [INFO] Booting worker with pid: 19515 [19511] [INFO] Started server process [19511] [19511] [INFO] Waiting for application startup. [19511] [INFO] Application startup complete. [19513] [INFO] Started server process [19513] [19513] [INFO] Waiting for application startup. [19513] [INFO] Application startup complete. [19514] [INFO] Started server process [19514] [19514] [INFO] Waiting for application startup. [19514] [INFO] Application startup complete. [19515] [INFO] Started server process [19515] [19515] [INFO] Waiting for application startup. [19515] [INFO] Application startup complete. ```
➡️ 👀 ⚫️❔ 🔠 👈 🎛 ⛓: * `main:app`: 👉 🎏 ❕ ⚙️ Uvicorn, `main` ⛓ 🐍 🕹 📛 "`main`",, 📁 `main.py`. & `app` 📛 🔢 👈 **FastAPI** 🈸. * 👆 💪 🌈 👈 `main:app` 🌓 🐍 `import` 📄 💖: ```Python from main import app ``` * , ❤ `main:app` 🔜 🌓 🐍 `import` 🍕 `from main import app`. * `--workers`: 🔢 👨‍🏭 🛠️ ⚙️, 🔠 🔜 🏃 Uvicorn 👨‍🏭, 👉 💼, 4️⃣ 👨‍🏭. * `--worker-class`: 🐁-🔗 👨‍🏭 🎓 ⚙️ 👨‍🏭 🛠️. * 📥 👥 🚶‍♀️ 🎓 👈 🐁 💪 🗄 & ⚙️ ⏮️: ```Python import uvicorn.workers.UvicornWorker ``` * `--bind`: 👉 💬 🐁 📢 & ⛴ 👂, ⚙️ ❤ (`:`) 🎏 📢 & ⛴. * 🚥 👆 🏃‍♂ Uvicorn 🔗, ↩️ `--bind 0.0.0.0:80` (🐁 🎛) 👆 🔜 ⚙️ `--host 0.0.0.0` & `--port 80`. 🔢, 👆 💪 👀 👈 ⚫️ 🎦 **🕹** (🛠️ 🆔) 🔠 🛠️ (⚫️ 🔢). 👆 💪 👀 👈: * 🐁 **🛠️ 👨‍💼** ▶️ ⏮️ 🕹 `19499` (👆 💼 ⚫️ 🔜 🎏 🔢). * ⤴️ ⚫️ ▶️ `Listening at: http://0.0.0.0:80`. * ⤴️ ⚫️ 🔍 👈 ⚫️ ✔️ ⚙️ 👨‍🏭 🎓 `uvicorn.workers.UvicornWorker`. * & ⤴️ ⚫️ ▶️ **4️⃣ 👨‍🏭**, 🔠 ⏮️ 🚮 👍 🕹: `19511`, `19513`, `19514`, & `19515`. 🐁 🔜 ✊ 💅 🛠️ **☠️ 🛠️** & **🔁** 🆕 🕐 🚥 💚 🚧 🔢 👨‍🏭. 👈 ℹ 🍕 ⏮️ **⏏** 🔧 ⚪️➡️ 📇 🔛. 👐, 👆 🔜 🎲 💚 ✔️ 🕳 🏞 ⚒ 💭 **⏏ 🐁** 🚥 💪, & **🏃 ⚫️ 🔛 🕴**, ♒️. ## Uvicorn ⏮️ 👨‍🏭 Uvicorn ✔️ 🎛 ▶️ & 🏃 📚 **👨‍🏭 🛠️**. 👐, 🔜, Uvicorn 🛠️ 🚚 👨‍🏭 🛠️ 🌅 📉 🌘 🐁. , 🚥 👆 💚 ✔️ 🛠️ 👨‍💼 👉 🎚 (🐍 🎚), ⤴️ ⚫️ 💪 👍 🔄 ⏮️ 🐁 🛠️ 👨‍💼. 🙆 💼, 👆 🔜 🏃 ⚫️ 💖 👉:
```console $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4 INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit) INFO: Started parent process [27365] INFO: Started server process [27368] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Started server process [27369] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Started server process [27370] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Started server process [27367] INFO: Waiting for application startup. INFO: Application startup complete. ```
🕴 🆕 🎛 📥 `--workers` 💬 Uvicorn ▶️ 4️⃣ 👨‍🏭 🛠️. 👆 💪 👀 👈 ⚫️ 🎦 **🕹** 🔠 🛠️, `27365` 👪 🛠️ (👉 **🛠️ 👨‍💼**) & 1️⃣ 🔠 👨‍🏭 🛠️: `27368`, `27369`, `27370`, & `27367`. ## 🛠️ 🔧 📥 👆 👀 ❔ ⚙️ **🐁** (⚖️ Uvicorn) 🛠️ **Uvicorn 👨‍🏭 🛠️** **🔁** 🛠️ 🈸, ✊ 📈 **💗 🐚** 💽, & 💪 🍦 **🌅 📨**. ⚪️➡️ 📇 🛠️ 🔧 ⚪️➡️ 🔛, ⚙️ 👨‍🏭 🔜 ✴️ ℹ ⏮️ **🧬** 🍕, & 🐥 🍖 ⏮️ **⏏**, ✋️ 👆 💪 ✊ 💅 🎏: * **💂‍♂ - 🇺🇸🔍** * **🏃‍♂ 🔛 🕴** * ***⏏*** * 🧬 (🔢 🛠️ 🏃) * **💾** * **⏮️ 🔁 ⏭ ▶️** ## 📦 & ☁ ⏭ 📃 🔃 [FastAPI 📦 - ☁](docker.md){.internal-link target=_blank} 👤 🔜 💬 🎛 👆 💪 ⚙️ 🍵 🎏 **🛠️ 🔧**. 👤 🔜 🎦 👆 **🛂 ☁ 🖼** 👈 🔌 **🐁 ⏮️ Uvicorn 👨‍🏭** & 🔢 📳 👈 💪 ⚠ 🙅 💼. 📤 👤 🔜 🎦 👆 ❔ **🏗 👆 👍 🖼 ⚪️➡️ 🖌** 🏃 👁 Uvicorn 🛠️ (🍵 🐁). ⚫️ 🙅 🛠️ & 🎲 ⚫️❔ 👆 🔜 💚 🕐❔ ⚙️ 📎 📦 🧾 ⚙️ 💖 **Kubernetes**. ## 🌃 👆 💪 ⚙️ **🐁** (⚖️ Uvicorn) 🛠️ 👨‍💼 ⏮️ Uvicorn 👨‍🏭 ✊ 📈 **👁-🐚 💽**, 🏃 **💗 🛠️ 🔗**. 👆 💪 ⚙️ 👉 🧰 & 💭 🚥 👆 ⚒ 🆙 **👆 👍 🛠️ ⚙️** ⏪ ✊ 💅 🎏 🛠️ 🔧 👆. ✅ 👅 ⏭ 📃 💡 🔃 **FastAPI** ⏮️ 📦 (✅ ☁ & Kubernetes). 👆 🔜 👀 👈 👈 🧰 ✔️ 🙅 🌌 ❎ 🎏 **🛠️ 🔧** 👍. 👶 fastapi-0.110.3/docs/em/docs/deployment/versions.md000066400000000000000000000052151461403617600221510ustar00rootroot00000000000000# 🔃 FastAPI ⏬ **FastAPI** ⏪ ➖ ⚙️ 🏭 📚 🈸 & ⚙️. & 💯 💰 🚧 1️⃣0️⃣0️⃣ 💯. ✋️ 🚮 🛠️ 🚚 🔜. 🆕 ⚒ 🚮 🛎, 🐛 🔧 🛎, & 📟 🔁 📉. 👈 ⚫️❔ ⏮️ ⏬ `0.x.x`, 👉 🎨 👈 🔠 ⏬ 💪 ⚠ ✔️ 💔 🔀. 👉 ⏩ ⚛ 🛠️ 🏛. 👆 💪 ✍ 🏭 🈸 ⏮️ **FastAPI** ▶️️ 🔜 (& 👆 ✔️ 🎲 🔨 ⚫️ 🕰), 👆 ✔️ ⚒ 💭 👈 👆 ⚙️ ⏬ 👈 👷 ☑ ⏮️ 🎂 👆 📟. ## 📌 👆 `fastapi` ⏬ 🥇 👜 👆 🔜 "📌" ⏬ **FastAPI** 👆 ⚙️ 🎯 📰 ⏬ 👈 👆 💭 👷 ☑ 👆 🈸. 🖼, ➡️ 💬 👆 ⚙️ ⏬ `0.45.0` 👆 📱. 🚥 👆 ⚙️ `requirements.txt` 📁 👆 💪 ✔ ⏬ ⏮️: ```txt fastapi==0.45.0 ``` 👈 🔜 ⛓ 👈 👆 🔜 ⚙️ ⚫️❔ ⏬ `0.45.0`. ⚖️ 👆 💪 📌 ⚫️ ⏮️: ```txt fastapi>=0.45.0,<0.46.0 ``` 👈 🔜 ⛓ 👈 👆 🔜 ⚙️ ⏬ `0.45.0` ⚖️ 🔛, ✋️ 🌘 🌘 `0.46.0`, 🖼, ⏬ `0.45.2` 🔜 🚫. 🚥 👆 ⚙️ 🙆 🎏 🧰 🛠️ 👆 👷‍♂, 💖 🎶, Pipenv, ⚖️ 🎏, 👫 🌐 ✔️ 🌌 👈 👆 💪 ⚙️ 🔬 🎯 ⏬ 👆 📦. ## 💪 ⏬ 👆 💪 👀 💪 ⏬ (✅ ✅ ⚫️❔ ⏮️ 📰) [🚀 🗒](../release-notes.md){.internal-link target=_blank}. ## 🔃 ⏬ 📄 ⚛ 🛠️ 🏛, 🙆 ⏬ 🔛 `1.0.0` 💪 ⚠ 🚮 💔 🔀. FastAPI ⏩ 🏛 👈 🙆 "🐛" ⏬ 🔀 🐛 🔧 & 🚫-💔 🔀. !!! tip "🐛" 🏁 🔢, 🖼, `0.2.3`, 🐛 ⏬ `3`. , 👆 🔜 💪 📌 ⏬ 💖: ```txt fastapi>=0.45.0,<0.46.0 ``` 💔 🔀 & 🆕 ⚒ 🚮 "🇺🇲" ⏬. !!! tip "🇺🇲" 🔢 🖕, 🖼, `0.2.3`, 🇺🇲 ⏬ `2`. ## ♻ FastAPI ⏬ 👆 🔜 🚮 💯 👆 📱. ⏮️ **FastAPI** ⚫️ 📶 ⏩ (👏 💃), ✅ 🩺: [🔬](../tutorial/testing.md){.internal-link target=_blank} ⏮️ 👆 ✔️ 💯, ⤴️ 👆 💪 ♻ **FastAPI** ⏬ 🌖 ⏮️ 1️⃣, & ⚒ 💭 👈 🌐 👆 📟 👷 ☑ 🏃 👆 💯. 🚥 🌐 👷, ⚖️ ⏮️ 👆 ⚒ 💪 🔀, & 🌐 👆 💯 🚶‍♀️, ⤴️ 👆 💪 📌 👆 `fastapi` 👈 🆕 ⏮️ ⏬. ## 🔃 💃 👆 🚫🔜 🚫 📌 ⏬ `starlette`. 🎏 ⏬ **FastAPI** 🔜 ⚙️ 🎯 🆕 ⏬ 💃. , 👆 💪 ➡️ **FastAPI** ⚙️ ☑ 💃 ⏬. ## 🔃 Pydantic Pydantic 🔌 💯 **FastAPI** ⏮️ 🚮 👍 💯, 🆕 ⏬ Pydantic (🔛 `1.0.0`) 🕧 🔗 ⏮️ FastAPI. 👆 💪 📌 Pydantic 🙆 ⏬ 🔛 `1.0.0` 👈 👷 👆 & 🔛 `2.0.0`. 🖼: ```txt pydantic>=1.2.0,<2.0.0 ``` fastapi-0.110.3/docs/em/docs/external-links.md000066400000000000000000000016411461403617600210600ustar00rootroot00000000000000# 🔢 🔗 & 📄 **FastAPI** ✔️ 👑 👪 🕧 💗. 📤 📚 🏤, 📄, 🧰, & 🏗, 🔗 **FastAPI**. 📥 ❌ 📇 👫. !!! tip 🚥 👆 ✔️ 📄, 🏗, 🧰, ⚖️ 🕳 🔗 **FastAPI** 👈 🚫 📇 📥, ✍ 🚲 📨 ❎ ⚫️. ## 📄 {% for section_name, section_content in external_links.items() %} ## {{ section_name }} {% for lang_name, lang_content in section_content.items() %} ### {{ lang_name }} {% for item in lang_content %} * {{ item.title }} by {{ item.author }}. {% endfor %} {% endfor %} {% endfor %} ## 🏗 ⏪ 📂 🏗 ⏮️ ❔ `fastapi`:
fastapi-0.110.3/docs/em/docs/fastapi-people.md000066400000000000000000000131751461403617600210360ustar00rootroot00000000000000--- hide: - navigation --- # FastAPI 👫👫 FastAPI ✔️ 🎆 👪 👈 🙋 👫👫 ⚪️➡️ 🌐 🖥. ## 👼 - 🐛 🙋 ❗ 👶 👉 👤: {% if people %}
{% for user in people.maintainers %}
@{{ user.login }}
❔: {{ user.answers }}
🚲 📨: {{ user.prs }}
{% endfor %}
{% endif %} 👤 👼 & 🐛 **FastAPI**. 👆 💪 ✍ 🌅 🔃 👈 [ℹ FastAPI - 🤚 ℹ - 🔗 ⏮️ 📕](help-fastapi.md#_3){.internal-link target=_blank}. ...✋️ 📥 👤 💚 🎦 👆 👪. --- **FastAPI** 📨 📚 🐕‍🦺 ⚪️➡️ 👪. & 👤 💚 🎦 👫 💰. 👫 👫👫 👈: * [ℹ 🎏 ⏮️ ❔ 📂](help-fastapi.md#i){.internal-link target=_blank}. * [✍ 🚲 📨](help-fastapi.md#_15){.internal-link target=_blank}. * 📄 🚲 📨, [✴️ ⚠ ✍](contributing.md#_9){.internal-link target=_blank}. 👏 👫. 👶 👶 ## 🌅 🦁 👩‍💻 🏁 🗓️ 👫 👩‍💻 👈 ✔️ [🤝 🎏 🏆 ⏮️ ❔ 📂](help-fastapi.md#i){.internal-link target=_blank} ⏮️ 🏁 🗓️. 👶 {% if people %}
{% for user in people.last_month_experts[:10] %}
@{{ user.login }}
❔ 📨: {{ user.count }}
{% endfor %}
{% endif %} ## 🕴 📥 **FastAPI 🕴**. 👶 👫 👩‍💻 👈 ✔️ [ℹ 🎏 🏆 ⏮️ ❔ 📂](help-fastapi.md#i){.internal-link target=_blank} 🔘 *🌐 🕰*. 👫 ✔️ 🎦 🕴 🤝 📚 🎏. 👶 {% if people %}
{% for user in people.experts[:50] %}
@{{ user.login }}
❔ 📨: {{ user.count }}
{% endfor %}
{% endif %} ## 🔝 👨‍🔬 📥 **🔝 👨‍🔬**. 👶 👉 👩‍💻 ✔️ [✍ 🏆 🚲 📨](help-fastapi.md#_15){.internal-link target=_blank} 👈 ✔️ *🔗*. 👫 ✔️ 📉 ℹ 📟, 🧾, ✍, ♒️. 👶 {% if people %}
{% for user in people.top_contributors[:50] %}
@{{ user.login }}
🚲 📨: {{ user.count }}
{% endfor %}
{% endif %} 📤 📚 🎏 👨‍🔬 (🌅 🌘 💯), 👆 💪 👀 👫 🌐 FastAPI 📂 👨‍🔬 📃. 👶 ## 🔝 👨‍🔬 👫 👩‍💻 **🔝 👨‍🔬**. 👶 👶 ### 📄 ✍ 👤 🕴 💬 👩‍❤‍👨 🇪🇸 (& 🚫 📶 👍 👶). , 👨‍🔬 🕐 👈 ✔️ [**🏋️ ✔ ✍**](contributing.md#_9){.internal-link target=_blank} 🧾. 🍵 👫, 📤 🚫🔜 🧾 📚 🎏 🇪🇸. --- **🔝 👨‍🔬** 👶 👶 ✔️ 📄 🏆 🚲 📨 ⚪️➡️ 🎏, 🚚 🔆 📟, 🧾, & ✴️, **✍**. {% if people %}
{% for user in people.top_translations_reviewers[:50] %}
@{{ user.login }}
📄: {{ user.count }}
{% endfor %}
{% endif %} ## 💰 👫 **💰**. 👶 👫 🔗 👇 👷 ⏮️ **FastAPI** (& 🎏), ✴️ 🔘 📂 💰. {% if sponsors %} {% if sponsors.gold %} ### 🌟 💰 {% for sponsor in sponsors.gold -%} {% endfor %} {% endif %} {% if sponsors.silver %} ### 🥇1st 💰 {% for sponsor in sponsors.silver -%} {% endfor %} {% endif %} {% if sponsors.bronze %} ### 🥈2nd 💰 {% for sponsor in sponsors.bronze -%} {% endfor %} {% endif %} {% endif %} ### 🎯 💰 {% if github_sponsors %} {% for group in github_sponsors.sponsors %}
{% for user in group %} {% if user.login not in sponsors_badge.logins %} {% endif %} {% endfor %}
{% endfor %} {% endif %} ## 🔃 📊 - 📡 ℹ 👑 🎯 👉 📃 🎦 🎯 👪 ℹ 🎏. ✴️ ✅ 🎯 👈 🛎 🌘 ⭐, & 📚 💼 🌅 😩, 💖 🤝 🎏 ⏮️ ❔ & ⚖ 🚲 📨 ⏮️ ✍. 💽 ⚖ 🔠 🗓️, 👆 💪 ✍ ℹ 📟 📥. 📥 👤 🎦 💰 ⚪️➡️ 💰. 👤 🏦 ▶️️ ℹ 📊, 📄, ⚡, ♒️ (💼 🤷). fastapi-0.110.3/docs/em/docs/features.md000066400000000000000000000201141461403617600177320ustar00rootroot00000000000000--- hide: - navigation --- # ⚒ ## FastAPI ⚒ **FastAPI** 🤝 👆 📄: ### ⚓️ 🔛 📂 🐩 * 🗄 🛠️ 🏗, ✅ 📄 🛠️, 🔢, 💪 📨, 💂‍♂, ♒️. * 🏧 📊 🏷 🧾 ⏮️ 🎻 🔗 (🗄 ⚫️ 🧢 🔛 🎻 🔗). * 🔧 🤭 👫 🐩, ⏮️ 😔 🔬. ↩️ 👎 🧽 🔛 🔝. * 👉 ✔ ⚙️ 🏧 **👩‍💻 📟 ⚡** 📚 🇪🇸. ### 🏧 🩺 🎓 🛠️ 🧾 & 🔬 🕸 👩‍💻 🔢. 🛠️ ⚓️ 🔛 🗄, 📤 💗 🎛, 2️⃣ 🔌 🔢. * 🦁 🎚, ⏮️ 🎓 🔬, 🤙 & 💯 👆 🛠️ 🔗 ⚪️➡️ 🖥. ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) * 🎛 🛠️ 🧾 ⏮️ 📄. ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ### 🏛 🐍 ⚫️ 🌐 ⚓️ 🔛 🐩 **🐍 3️⃣.6️⃣ 🆎** 📄 (👏 Pydantic). 🙅‍♂ 🆕 ❕ 💡. 🐩 🏛 🐍. 🚥 👆 💪 2️⃣ ⏲ ↗️ ❔ ⚙️ 🐍 🆎 (🚥 👆 🚫 ⚙️ FastAPI), ✅ 📏 🔰: [🐍 🆎](python-types.md){.internal-link target=_blank}. 👆 ✍ 🐩 🐍 ⏮️ 🆎: ```Python from datetime import date from pydantic import BaseModel # Declare a variable as a str # and get editor support inside the function def main(user_id: str): return user_id # A Pydantic model class User(BaseModel): id: int name: str joined: date ``` 👈 💪 ⤴️ ⚙️ 💖: ```Python my_user: User = User(id=3, name="John Doe", joined="2018-07-19") second_user_data = { "id": 4, "name": "Mary", "joined": "2018-11-30", } my_second_user: User = User(**second_user_data) ``` !!! info `**second_user_data` ⛓: 🚶‍♀️ 🔑 & 💲 `second_user_data` #️⃣ 🔗 🔑-💲 ❌, 🌓: `User(id=4, name="Mary", joined="2018-11-30")` ### 👨‍🎨 🐕‍🦺 🌐 🛠️ 🏗 ⏩ & 🏋️ ⚙️, 🌐 🚫 💯 🔛 💗 👨‍🎨 ⏭ ▶️ 🛠️, 🚚 🏆 🛠️ 💡. 🏁 🐍 👩‍💻 🔬 ⚫️ 🆑 👈 🌅 ⚙️ ⚒ "✍". 🎂 **FastAPI** 🛠️ ⚓️ 😌 👈. ✍ 👷 🌐. 👆 🔜 🛎 💪 👟 🔙 🩺. 📥 ❔ 👆 👨‍🎨 💪 ℹ 👆: * 🎙 🎙 📟: ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) * 🗒: ![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) 👆 🔜 🤚 🛠️ 📟 👆 5️⃣📆 🤔 💪 ⏭. 🖼, `price` 🔑 🔘 🎻 💪 (👈 💪 ✔️ 🐦) 👈 👟 ⚪️➡️ 📨. 🙅‍♂ 🌖 ⌨ ❌ 🔑 📛, 👟 🔙 & ➡ 🖖 🩺, ⚖️ 📜 🆙 & 🔽 🔎 🚥 👆 😒 ⚙️ `username` ⚖️ `user_name`. ### 📏 ⚫️ ✔️ 🤔 **🔢** 🌐, ⏮️ 📦 📳 🌐. 🌐 🔢 💪 👌-🎧 ⚫️❔ 👆 💪 & 🔬 🛠️ 👆 💪. ✋️ 🔢, ⚫️ 🌐 **"👷"**. ### 🔬 * 🔬 🌅 (⚖️ 🌐 ❓) 🐍 **💽 🆎**, 🔌: * 🎻 🎚 (`dict`). * 🎻 🎻 (`list`) ⚖ 🏬 🆎. * 🎻 (`str`) 🏑, 🔬 🕙 & 👟 📐. * 🔢 (`int`, `float`) ⏮️ 🕙 & 👟 💲, ♒️. * 🔬 🌅 😍 🆎, 💖: * 📛. * 📧. * 🆔. * ...& 🎏. 🌐 🔬 🍵 👍-🏛 & 🏋️ **Pydantic**. ### 💂‍♂ & 🤝 💂‍♂ & 🤝 🛠️. 🍵 🙆 ⚠ ⏮️ 💽 ⚖️ 📊 🏷. 🌐 💂‍♂ ⚖ 🔬 🗄, 🔌: * 🇺🇸🔍 🔰. * **Oauth2️⃣** (⏮️ **🥙 🤝**). ✅ 🔰 🔛 [Oauth2️⃣ ⏮️ 🥙](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. * 🛠️ 🔑: * 🎚. * 🔢 🔢. * 🍪, ♒️. ➕ 🌐 💂‍♂ ⚒ ⚪️➡️ 💃 (🔌 **🎉 🍪**). 🌐 🏗 ♻ 🧰 & 🦲 👈 ⏩ 🛠️ ⏮️ 👆 ⚙️, 📊 🏪, 🔗 & ☁ 💽, ♒️. ### 🔗 💉 FastAPI 🔌 📶 ⏩ ⚙️, ✋️ 📶 🏋️ 🔗 💉 ⚙️. * 🔗 💪 ✔️ 🔗, 🏗 🔗 ⚖️ **"📊" 🔗**. * 🌐 **🔁 🍵** 🛠️. * 🌐 🔗 💪 🚚 💽 ⚪️➡️ 📨 & **↔ ➡ 🛠️** ⚛ & 🏧 🧾. * **🏧 🔬** *➡ 🛠️* 🔢 🔬 🔗. * 🐕‍🦺 🏗 👩‍💻 🤝 ⚙️, **💽 🔗**, ♒️. * **🙅‍♂ ⚠** ⏮️ 💽, 🕸, ♒️. ✋️ ⏩ 🛠️ ⏮️ 🌐 👫. ### ♾ "🔌-🔌" ⚖️ 🎏 🌌, 🙅‍♂ 💪 👫, 🗄 & ⚙️ 📟 👆 💪. 🙆 🛠️ 🏗 🙅 ⚙️ (⏮️ 🔗) 👈 👆 💪 ✍ "🔌-" 👆 🈸 2️⃣ ⏸ 📟 ⚙️ 🎏 📊 & ❕ ⚙️ 👆 *➡ 🛠️*. ### 💯 * 1️⃣0️⃣0️⃣ 💯 💯 💰. * 1️⃣0️⃣0️⃣ 💯 🆎 ✍ 📟 🧢. * ⚙️ 🏭 🈸. ## 💃 ⚒ **FastAPI** 🍕 🔗 ⏮️ (& ⚓️ 🔛) 💃. , 🙆 🌖 💃 📟 👆 ✔️, 🔜 👷. `FastAPI` 🤙 🎧-🎓 `Starlette`. , 🚥 👆 ⏪ 💭 ⚖️ ⚙️ 💃, 🌅 🛠️ 🔜 👷 🎏 🌌. ⏮️ **FastAPI** 👆 🤚 🌐 **💃**'Ⓜ ⚒ (FastAPI 💃 🔛 💊): * 🤙 🎆 🎭. ⚫️ 1️⃣ ⏩ 🐍 🛠️ 💪, 🔛 🇷🇪 ⏮️ **✳** & **🚶**. * ** *️⃣ ** 🐕‍🦺. * -🛠️ 🖥 📋. * 🕴 & 🤫 🎉. * 💯 👩‍💻 🏗 🔛 🇸🇲. * **⚜**, 🗜, 🎻 📁, 🎏 📨. * **🎉 & 🍪** 🐕‍🦺. * 1️⃣0️⃣0️⃣ 💯 💯 💰. * 1️⃣0️⃣0️⃣ 💯 🆎 ✍ ✍. ## Pydantic ⚒ **FastAPI** 🍕 🔗 ⏮️ (& ⚓️ 🔛) Pydantic. , 🙆 🌖 Pydantic 📟 👆 ✔️, 🔜 👷. ✅ 🔢 🗃 ⚓️ 🔛 Pydantic, 🐜Ⓜ, 🏭Ⓜ 💽. 👉 ⛓ 👈 📚 💼 👆 💪 🚶‍♀️ 🎏 🎚 👆 🤚 ⚪️➡️ 📨 **🔗 💽**, 🌐 ✔ 🔁. 🎏 ✔ 🎏 🌌 🤭, 📚 💼 👆 💪 🚶‍♀️ 🎚 👆 🤚 ⚪️➡️ 💽 **🔗 👩‍💻**. ⏮️ **FastAPI** 👆 🤚 🌐 **Pydantic**'Ⓜ ⚒ (FastAPI ⚓️ 🔛 Pydantic 🌐 💽 🚚): * **🙅‍♂ 🔠**: * 🙅‍♂ 🆕 🔗 🔑 ◾-🇪🇸 💡. * 🚥 👆 💭 🐍 🆎 👆 💭 ❔ ⚙️ Pydantic. * 🤾 🎆 ⏮️ 👆 **💾/🧶/🧠**: * ↩️ Pydantic 📊 📊 👐 🎓 👆 🔬; 🚘-🛠️, 🧽, ✍ & 👆 🤔 🔜 🌐 👷 ☑ ⏮️ 👆 ✔ 💽. * ✔ **🏗 📊**: * ⚙️ 🔗 Pydantic 🏷, 🐍 `typing`'Ⓜ `List` & `Dict`, ♒️. * & 💳 ✔ 🏗 💽 🔗 🎯 & 💪 🔬, ✅ & 📄 🎻 🔗. * 👆 💪 ✔️ 🙇 **🐦 🎻** 🎚 & ✔️ 👫 🌐 ✔ & ✍. * **🏧**: * Pydantic ✔ 🛃 📊 🆎 🔬 ⚖️ 👆 💪 ↔ 🔬 ⏮️ 👩‍🔬 🔛 🏷 🎀 ⏮️ 💳 👨‍🎨. * 1️⃣0️⃣0️⃣ 💯 💯 💰. fastapi-0.110.3/docs/em/docs/help-fastapi.md000066400000000000000000000272711461403617600205040ustar00rootroot00000000000000# ℹ FastAPI - 🤚 ℹ 👆 💖 **FastAPI**❓ 🔜 👆 💖 ℹ FastAPI, 🎏 👩‍💻, & 📕 ❓ ⚖️ 🔜 👆 💖 🤚 ℹ ⏮️ **FastAPI**❓ 📤 📶 🙅 🌌 ℹ (📚 🔌 1️⃣ ⚖️ 2️⃣ 🖊). & 📤 📚 🌌 🤚 ℹ 💁‍♂️. ## 👱📔 📰 👆 💪 👱📔 (🐌) [**FastAPI & 👨‍👧‍👦** 📰](newsletter.md){.internal-link target=_blank} 🚧 ℹ 🔃: * 📰 🔃 FastAPI & 👨‍👧‍👦 👶 * 🦮 👶 * ⚒ 👶 * 💔 🔀 👶 * 💁‍♂ & 🎱 👶 ## ⏩ FastAPI 🔛 👱📔 ⏩ 🐶 Fastapi 🔛 **👱📔** 🤚 📰 📰 🔃 **FastAPI**. 👶 ## ✴ **FastAPI** 📂 👆 💪 "✴" FastAPI 📂 (🖊 ✴ 🔼 🔝 ▶️️): https://github.com/tiangolo/fastapi. 👶 👶 ❎ ✴, 🎏 👩‍💻 🔜 💪 🔎 ⚫️ 🌅 💪 & 👀 👈 ⚫️ ✔️ ⏪ ⚠ 🎏. ## ⌚ 📂 🗃 🚀 👆 💪 "⌚" FastAPI 📂 (🖊 "⌚" 🔼 🔝 ▶️️): https://github.com/tiangolo/fastapi. 👶 📤 👆 💪 🖊 "🚀 🕴". 🔨 ⚫️, 👆 🔜 📨 📨 (👆 📧) 🕐❔ 📤 🆕 🚀 (🆕 ⏬) **FastAPI** ⏮️ 🐛 🔧 & 🆕 ⚒. ## 🔗 ⏮️ 📕 👆 💪 🔗 ⏮️ 👤 (🇹🇦 🇩🇬 / `tiangolo`), 📕. 👆 💪: * ⏩ 👤 🔛 **📂**. * 👀 🎏 📂 ℹ 🏗 👤 ✔️ ✍ 👈 💪 ℹ 👆. * ⏩ 👤 👀 🕐❔ 👤 ✍ 🆕 📂 ℹ 🏗. * ⏩ 👤 🔛 **👱📔** ⚖️ . * 💬 👤 ❔ 👆 ⚙️ FastAPI (👤 💌 👂 👈). * 👂 🕐❔ 👤 ⚒ 🎉 ⚖️ 🚀 🆕 🧰. * 👆 💪 ⏩ 🐶 Fastapi 🔛 👱📔 (🎏 🏧). * 🔗 ⏮️ 👤 🔛 **👱📔**. * 👂 🕐❔ 👤 ⚒ 🎉 ⚖️ 🚀 🆕 🧰 (👐 👤 ⚙️ 👱📔 🌖 🛎 🤷 ♂). * ✍ ⚫️❔ 👤 ✍ (⚖️ ⏩ 👤) 🔛 **🇸🇲.** ⚖️ **🔉**. * ✍ 🎏 💭, 📄, & ✍ 🔃 🧰 👤 ✔️ ✍. * ⏩ 👤 ✍ 🕐❔ 👤 ✍ 🕳 🆕. ## 👱📔 🔃 **FastAPI** 👱📔 🔃 **FastAPI** & ➡️ 👤 & 🎏 💭 ⚫️❔ 👆 💖 ⚫️. 👶 👤 💌 👂 🔃 ❔ **FastAPI** 💆‍♂ ⚙️, ⚫️❔ 👆 ✔️ 💖 ⚫️, ❔ 🏗/🏢 👆 ⚙️ ⚫️, ♒️. ## 🗳 FastAPI * 🗳 **FastAPI** 📐. * 🗳 **FastAPI** 📱. * 💬 👆 ⚙️ **FastAPI** 🔛 ℹ. ## ℹ 🎏 ⏮️ ❔ 📂 👆 💪 🔄 & ℹ 🎏 ⏮️ 👫 ❔: * 📂 💬 * 📂 ❔ 📚 💼 👆 5️⃣📆 ⏪ 💭 ❔ 📚 ❔. 👶 🚥 👆 🤝 📚 👫👫 ⏮️ 👫 ❔, 👆 🔜 ▶️️ 🛂 [FastAPI 🕴](fastapi-people.md#_2){.internal-link target=_blank}. 👶 💭, 🏆 ⚠ ☝: 🔄 😇. 👫👫 👟 ⏮️ 👫 😩 & 📚 💼 🚫 💭 🏆 🌌, ✋️ 🔄 🏆 👆 💪 😇. 👶 💭 **FastAPI** 👪 😇 & 👍. 🎏 🕰, 🚫 🚫 🎭 ⚖️ 😛 🎭 ⤵ 🎏. 👥 ✔️ ✊ 💅 🔠 🎏. --- 📥 ❔ ℹ 🎏 ⏮️ ❔ (💬 ⚖️ ❔): ### 🤔 ❔ * ✅ 🚥 👆 💪 🤔 ⚫️❔ **🎯** & ⚙️ 💼 👨‍💼 💬. * ⤴️ ✅ 🚥 ❔ (⭕ 👪 ❔) **🆑**. * 📚 💼 ❔ 💭 🔃 👽 ⚗ ⚪️➡️ 👩‍💻, ✋️ 📤 💪 **👍** 1️⃣. 🚥 👆 💪 🤔 ⚠ & ⚙️ 💼 👍, 👆 💪 💪 🤔 👍 **🎛 ⚗**. * 🚥 👆 💪 🚫 🤔 ❔, 💭 🌖 **ℹ**. ### 🔬 ⚠ 🌅 💼 & 🏆 ❔ 📤 🕳 🔗 👨‍💼 **⏮️ 📟**. 📚 💼 👫 🔜 🕴 📁 🧬 📟, ✋️ 👈 🚫 🥃 **🔬 ⚠**. * 👆 💪 💭 👫 🚚 ⭐, 🔬, 🖼, 👈 👆 💪 **📁-📋** & 🏃 🌐 👀 🎏 ❌ ⚖️ 🎭 👫 👀, ⚖️ 🤔 👫 ⚙️ 💼 👍. * 🚥 👆 😟 💁‍♂️ 👍, 👆 💪 🔄 **✍ 🖼** 💖 👈 👆, 🧢 🔛 📛 ⚠. ✔️ 🤯 👈 👉 💪 ✊ 📚 🕰 & ⚫️ 💪 👻 💭 👫 ✍ ⚠ 🥇. ### 🤔 ⚗ * ⏮️ 💆‍♂ 💪 🤔 ❔, 👆 💪 🤝 👫 💪 **❔**. * 📚 💼, ⚫️ 👍 🤔 👫 **📈 ⚠ ⚖️ ⚙️ 💼**, ↩️ 📤 5️⃣📆 👍 🌌 ❎ ⚫️ 🌘 ⚫️❔ 👫 🔄. ### 💭 🔐 🚥 👫 📨, 📤 ↕ 🤞 👆 🔜 ✔️ ❎ 👫 ⚠, ㊗, **👆 💂**❗ 🦸 * 🔜, 🚥 👈 ❎ 👫 ⚠, 👆 💪 💭 👫: * 📂 💬: ™ 🏤 **❔**. * 📂 ❔: **🔐** ❔**. ## ⌚ 📂 🗃 👆 💪 "⌚" FastAPI 📂 (🖊 "⌚" 🔼 🔝 ▶️️): https://github.com/tiangolo/fastapi. 👶 🚥 👆 🖊 "👀" ↩️ "🚀 🕴" 👆 🔜 📨 📨 🕐❔ 👱 ✍ 🆕 ❔ ⚖️ ❔. 👆 💪 ✔ 👈 👆 🕴 💚 🚨 🔃 🆕 ❔, ⚖️ 💬, ⚖️ 🎸, ♒️. ⤴️ 👆 💪 🔄 & ℹ 👫 ❎ 👈 ❔. ## 💭 ❔ 👆 💪 ✍ 🆕 ❔ 📂 🗃, 🖼: * 💭 **❔** ⚖️ 💭 🔃 **⚠**. * 🤔 🆕 **⚒**. **🗒**: 🚥 👆 ⚫️, ⤴️ 👤 🔜 💭 👆 ℹ 🎏. 👶 ## 📄 🚲 📨 👆 💪 ℹ 👤 📄 🚲 📨 ⚪️➡️ 🎏. 🔄, 🙏 🔄 👆 🏆 😇. 👶 --- 📥 ⚫️❔ ✔️ 🤯 & ❔ 📄 🚲 📨: ### 🤔 ⚠ * 🥇, ⚒ 💭 👆 **🤔 ⚠** 👈 🚲 📨 🔄 ❎. ⚫️ 💪 ✔️ 📏 💬 📂 💬 ⚖️ ❔. * 📤 👍 🤞 👈 🚲 📨 🚫 🤙 💪 ↩️ ⚠ 💪 ❎ **🎏 🌌**. ⤴️ 👆 💪 🤔 ⚖️ 💭 🔃 👈. ### 🚫 😟 🔃 👗 * 🚫 😟 💁‍♂️ 🌅 🔃 👜 💖 💕 📧 👗, 👤 🔜 🥬 & 🔗 🛃 💕 ❎. * 🚫 😟 🔃 👗 🚫, 📤 ⏪ 🏧 🧰 ✅ 👈. & 🚥 📤 🙆 🎏 👗 ⚖️ ⚖ 💪, 👤 🔜 💭 🔗 👈, ⚖️ 👤 🔜 🚮 💕 🔛 🔝 ⏮️ 💪 🔀. ### ✅ 📟 * ✅ & ✍ 📟, 👀 🚥 ⚫️ ⚒ 🔑, **🏃 ⚫️ 🌐** & 👀 🚥 ⚫️ 🤙 ❎ ⚠. * ⤴️ **🏤** 💬 👈 👆 👈, 👈 ❔ 👤 🔜 💭 👆 🤙 ✅ ⚫️. !!! info 👐, 👤 💪 🚫 🎯 💙 🎸 👈 ✔️ 📚 ✔. 📚 🕰 ⚫️ ✔️ 🔨 👈 📤 🎸 ⏮️ 3️⃣, 5️⃣ ⚖️ 🌅 ✔, 🎲 ↩️ 📛 😌, ✋️ 🕐❔ 👤 ✅ 🎸, 👫 🤙 💔, ✔️ 🐛, ⚖️ 🚫 ❎ ⚠ 👫 🛄 ❎. 👶 , ⚫️ 🤙 ⚠ 👈 👆 🤙 ✍ & 🏃 📟, & ➡️ 👤 💭 🏤 👈 👆. 👶 * 🚥 🇵🇷 💪 📉 🌌, 👆 💪 💭 👈, ✋️ 📤 🙅‍♂ 💪 💁‍♂️ 😟, 📤 5️⃣📆 📚 🤔 ☝ 🎑 (& 👤 🔜 ✔️ 👇 👍 👍 👶), ⚫️ 👻 🚥 👆 💪 🎯 🔛 ⚛ 👜. ### 💯 * ℹ 👤 ✅ 👈 🇵🇷 ✔️ **💯**. * ✅ 👈 💯 **❌** ⏭ 🇵🇷. 👶 * ⤴️ ✅ 👈 💯 **🚶‍♀️** ⏮️ 🇵🇷. 👶 * 📚 🎸 🚫 ✔️ 💯, 👆 💪 **🎗** 👫 🚮 💯, ⚖️ 👆 💪 **🤔** 💯 👆. 👈 1️⃣ 👜 👈 🍴 🌅 🕰 & 👆 💪 ℹ 📚 ⏮️ 👈. * ⤴️ 🏤 ⚫️❔ 👆 🔄, 👈 🌌 👤 🔜 💭 👈 👆 ✅ ⚫️. 👶 ## ✍ 🚲 📨 👆 💪 [📉](contributing.md){.internal-link target=_blank} ℹ 📟 ⏮️ 🚲 📨, 🖼: * 🔧 🤭 👆 🔎 🔛 🧾. * 💰 📄, 📹, ⚖️ 📻 👆 ✍ ⚖️ 🔎 🔃 FastAPI ✍ 👉 📁. * ⚒ 💭 👆 🚮 👆 🔗 ▶️ 🔗 📄. * ℹ [💬 🧾](contributing.md#_9){.internal-link target=_blank} 👆 🇪🇸. * 👆 💪 ℹ 📄 ✍ ✍ 🎏. * 🛠️ 🆕 🧾 📄. * 🔧 ♻ ❔/🐛. * ⚒ 💭 🚮 💯. * 🚮 🆕 ⚒. * ⚒ 💭 🚮 💯. * ⚒ 💭 🚮 🧾 🚥 ⚫️ 🔗. ## ℹ 🚧 FastAPI ℹ 👤 🚧 **FastAPI**❗ 👶 📤 📚 👷, & 🏆 ⚫️, **👆** 💪 ⚫️. 👑 📋 👈 👆 💪 ▶️️ 🔜: * [ℹ 🎏 ⏮️ ❔ 📂](#i){.internal-link target=_blank} (👀 📄 🔛). * [📄 🚲 📨](#i){.internal-link target=_blank} (👀 📄 🔛). 👈 2️⃣ 📋 ⚫️❔ **🍴 🕰 🏆**. 👈 👑 👷 🏆 FastAPI. 🚥 👆 💪 ℹ 👤 ⏮️ 👈, **👆 🤝 👤 🚧 FastAPI** & ⚒ 💭 ⚫️ 🚧 **🛠️ ⏩ & 👻**. 👶 ## 🛑 💬 🛑 👶 😧 💬 💽 👶 & 🤙 👅 ⏮️ 🎏 FastAPI 👪. !!! tip ❔, 💭 👫 📂 💬, 📤 🌅 👍 🤞 👆 🔜 📨 ℹ [FastAPI 🕴](fastapi-people.md#_2){.internal-link target=_blank}. ⚙️ 💬 🕴 🎏 🏢 💬. ### 🚫 ⚙️ 💬 ❔ ✔️ 🤯 👈 💬 ✔ 🌅 "🆓 💬", ⚫️ ⏩ 💭 ❔ 👈 💁‍♂️ 🏢 & 🌅 ⚠ ❔,, 👆 💪 🚫 📨 ❔. 📂, 📄 🔜 🦮 👆 ✍ ▶️️ ❔ 👈 👆 💪 🌖 💪 🤚 👍 ❔, ⚖️ ❎ ⚠ 👆 ⏭ 💬. & 📂 👤 💪 ⚒ 💭 👤 🕧 ❔ 🌐, 🚥 ⚫️ ✊ 🕰. 👤 💪 🚫 🤙 👈 ⏮️ 💬 ⚙️. 👶 💬 💬 ⚙️ 🚫 💪 📇 📂, ❔ & ❔ 5️⃣📆 🤚 💸 💬. & 🕴 🕐 📂 💯 ▶️️ [FastAPI 🕴](fastapi-people.md#_2){.internal-link target=_blank}, 👆 🔜 🌅 🎲 📨 🌅 🙋 📂. 🔛 🎏 🚄, 📤 💯 👩‍💻 💬 ⚙️, 📤 ↕ 🤞 👆 🔜 🔎 👱 💬 📤, 🌖 🌐 🕰. 👶 ## 💰 📕 👆 💪 💰 🐕‍🦺 📕 (👤) 🔘 📂 💰. 📤 👆 💪 🛍 👤 ☕ 👶 👶 💬 👏. 👶 & 👆 💪 ▶️️ 🥇1st ⚖️ 🌟 💰 FastAPI. 👶 👶 ## 💰 🧰 👈 🏋️ FastAPI 👆 ✔️ 👀 🧾, FastAPI 🧍 🔛 ⌚ 🐘, 💃 & Pydantic. 👆 💪 💰: * ✡ 🍏 (Pydantic) * 🗜 (💃, Uvicorn) --- 👏 ❗ 👶 fastapi-0.110.3/docs/em/docs/history-design-future.md000066400000000000000000000066331461403617600224060ustar00rootroot00000000000000# 📖, 🔧 & 🔮 🕰 🏁, **FastAPI** 👩‍💻 💭: > ⚫️❔ 📖 👉 🏗 ❓ ⚫️ 😑 ✔️ 👟 ⚪️➡️ 🕳 👌 👩‍❤‍👨 🗓️ [...] 📥 🐥 🍖 👈 📖. ## 🎛 👤 ✔️ 🏗 🔗 ⏮️ 🏗 📄 📚 1️⃣2️⃣🗓️ (🎰 🏫, 📎 ⚙️, 🔁 👨‍🏭, ☁ 💽, ♒️), ↘️ 📚 🏉 👩‍💻. 🍕 👈, 👤 💪 🔬, 💯 & ⚙️ 📚 🎛. 📖 **FastAPI** 👑 🍕 📖 🚮 ⏪. 🙆‍♀ 📄 [🎛](alternatives.md){.internal-link target=_blank}:
**FastAPI** 🚫🔜 🔀 🚥 🚫 ⏮️ 👷 🎏. 📤 ✔️ 📚 🧰 ✍ ⏭ 👈 ✔️ ℹ 😮 🚮 🏗. 👤 ✔️ ❎ 🏗 🆕 🛠️ 📚 1️⃣2️⃣🗓️. 🥇 👤 🔄 ❎ 🌐 ⚒ 📔 **FastAPI** ⚙️ 📚 🎏 🛠️, 🔌-🔌, & 🧰. ✋️ ☝, 📤 🙅‍♂ 🎏 🎛 🌘 🏗 🕳 👈 🚚 🌐 👫 ⚒, ✊ 🏆 💭 ⚪️➡️ ⏮️ 🧰, & 🌀 👫 🏆 🌌 💪, ⚙️ 🇪🇸 ⚒ 👈 ➖🚫 💪 ⏭ (🐍 3️⃣.6️⃣ ➕ 🆎 🔑).
## 🔬 ⚙️ 🌐 ⏮️ 🎛 👤 ✔️ 🤞 💡 ⚪️➡️ 🌐 👫, ✊ 💭, & 🌀 👫 🏆 🌌 👤 💪 🔎 👤 & 🏉 👩‍💻 👤 ✔️ 👷 ⏮️. 🖼, ⚫️ 🆑 👈 🎲 ⚫️ 🔜 ⚓️ 🔛 🐩 🐍 🆎 🔑. , 🏆 🎯 ⚙️ ⏪ ♻ 🐩. , ⏭ ▶️ 📟 **FastAPI**, 👤 💸 📚 🗓️ 🎓 🔌 🗄, 🎻 🔗, Oauth2️⃣, ♒️. 🎯 👫 💛, 🔀, & 🔺. ## 🔧 ⤴️ 👤 💸 🕰 🔧 👩‍💻 "🛠️" 👤 💚 ✔️ 👩‍💻 (👩‍💻 ⚙️ FastAPI). 👤 💯 📚 💭 🏆 🌟 🐍 👨‍🎨: 🗒, 🆚 📟, 🎠 🧢 👨‍🎨. 🏁 🐍 👩‍💻 🔬, 👈 📔 🔃 8️⃣0️⃣ 💯 👩‍💻. ⚫️ ⛓ 👈 **FastAPI** 🎯 💯 ⏮️ 👨‍🎨 ⚙️ 8️⃣0️⃣ 💯 🐍 👩‍💻. & 🏆 🎏 👨‍🎨 😑 👷 ➡, 🌐 🚮 💰 🔜 👷 🌖 🌐 👨‍🎨. 👈 🌌 👤 💪 🔎 🏆 🌌 📉 📟 ❎ 🌅 💪, ✔️ 🛠️ 🌐, 🆎 & ❌ ✅, ♒️. 🌐 🌌 👈 🚚 🏆 🛠️ 💡 🌐 👩‍💻. ## 📄 ⏮️ 🔬 📚 🎛, 👤 💭 👈 👤 🔜 ⚙️ **Pydantic** 🚮 📈. ⤴️ 👤 📉 ⚫️, ⚒ ⚫️ 🍕 🛠️ ⏮️ 🎻 🔗, 🐕‍🦺 🎏 🌌 🔬 ⚛ 📄, & 📉 👨‍🎨 🐕‍🦺 (🆎 ✅, ✍) ⚓️ 🔛 💯 📚 👨‍🎨. ⏮️ 🛠️, 👤 📉 **💃**, 🎏 🔑 📄. ## 🛠️ 🕰 👤 ▶️ 🏗 **FastAPI** ⚫️, 🏆 🍖 ⏪ 🥉, 🔧 🔬, 📄 & 🧰 🔜, & 💡 🔃 🐩 & 🔧 🆑 & 🍋. ## 🔮 👉 ☝, ⚫️ ⏪ 🆑 👈 **FastAPI** ⏮️ 🚮 💭 ➖ ⚠ 📚 👫👫. ⚫️ 💆‍♂ 👐 🤭 ⏮️ 🎛 ♣ 📚 ⚙️ 💼 👍. 📚 👩‍💻 & 🏉 ⏪ 🪀 🔛 **FastAPI** 👫 🏗 (🔌 👤 & 👇 🏉). ✋️, 📤 📚 📈 & ⚒ 👟. **FastAPI** ✔️ 👑 🔮 ⤴️. & [👆 ℹ](help-fastapi.md){.internal-link target=_blank} 📉 👍. fastapi-0.110.3/docs/em/docs/how-to/000077500000000000000000000000001461403617600170115ustar00rootroot00000000000000fastapi-0.110.3/docs/em/docs/how-to/conditional-openapi.md000066400000000000000000000037201461403617600232710ustar00rootroot00000000000000# 🎲 🗄 🚥 👆 💪, 👆 💪 ⚙️ ⚒ & 🌐 🔢 🔗 🗄 ✔ ⚓️ 🔛 🌐, & ❎ ⚫️ 🍕. ## 🔃 💂‍♂, 🔗, & 🩺 🕵‍♂ 👆 🧾 👩‍💻 🔢 🏭 *🚫🔜 🚫* 🌌 🛡 👆 🛠️. 👈 🚫 🚮 🙆 ➕ 💂‍♂ 👆 🛠️, *➡ 🛠️* 🔜 💪 🌐❔ 👫. 🚥 📤 💂‍♂ ⚠ 👆 📟, ⚫️ 🔜 🔀. 🕵‍♂ 🧾 ⚒ ⚫️ 🌅 ⚠ 🤔 ❔ 🔗 ⏮️ 👆 🛠️, & 💪 ⚒ ⚫️ 🌅 ⚠ 👆 ℹ ⚫️ 🏭. ⚫️ 💪 🤔 🎯 📨 💂‍♂ 🔘 🌌. 🚥 👆 💚 🔐 👆 🛠️, 📤 📚 👍 👜 👆 💪, 🖼: * ⚒ 💭 👆 ✔️ 👍 🔬 Pydantic 🏷 👆 📨 💪 & 📨. * 🔗 🙆 ✔ ✔ & 🔑 ⚙️ 🔗. * 🙅 🏪 🔢 🔐, 🕴 🔐#️⃣. * 🛠️ & ⚙️ 👍-💭 🔐 🧰, 💖 🇸🇲 & 🥙 🤝, ♒️. * 🚮 🌅 🧽 ✔ 🎛 ⏮️ Oauth2️⃣ ↔ 🌐❔ 💪. * ...♒️. 👐, 👆 5️⃣📆 ✔️ 📶 🎯 ⚙️ 💼 🌐❔ 👆 🤙 💪 ❎ 🛠️ 🩺 🌐 (✅ 🏭) ⚖️ ⚓️ 🔛 📳 ⚪️➡️ 🌐 🔢. ## 🎲 🗄 ⚪️➡️ ⚒ & 🇨🇻 { 👆 💪 💪 ⚙️ 🎏 Pydantic ⚒ 🔗 👆 🏗 🗄 & 🩺 ⚜. 🖼: ```Python hl_lines="6 11" {!../../../docs_src/conditional_openapi/tutorial001.py!} ``` 📥 👥 📣 ⚒ `openapi_url` ⏮️ 🎏 🔢 `"/openapi.json"`. & ⤴️ 👥 ⚙️ ⚫️ 🕐❔ 🏗 `FastAPI` 📱. ⤴️ 👆 💪 ❎ 🗄 (✅ 🎚 🩺) ⚒ 🌐 🔢 `OPENAPI_URL` 🛁 🎻, 💖:
```console $ OPENAPI_URL= uvicorn main:app INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
⤴️ 🚥 👆 🚶 📛 `/openapi.json`, `/docs`, ⚖️ `/redoc` 👆 🔜 🤚 `404 Not Found` ❌ 💖: ```JSON { "detail": "Not Found" } ``` fastapi-0.110.3/docs/em/docs/how-to/custom-request-and-route.md000066400000000000000000000071511461403617600242330ustar00rootroot00000000000000# 🛃 📨 & APIRoute 🎓 💼, 👆 5️⃣📆 💚 🔐 ⚛ ⚙️ `Request` & `APIRoute` 🎓. 🎯, 👉 5️⃣📆 👍 🎛 ⚛ 🛠️. 🖼, 🚥 👆 💚 ✍ ⚖️ 🔬 📨 💪 ⏭ ⚫️ 🛠️ 👆 🈸. !!! danger 👉 "🏧" ⚒. 🚥 👆 ▶️ ⏮️ **FastAPI** 👆 💪 💚 🚶 👉 📄. ## ⚙️ 💼 ⚙️ 💼 🔌: * 🏭 🚫-🎻 📨 💪 🎻 (✅ `msgpack`). * 🗜 🗜-🗜 📨 💪. * 🔁 🚨 🌐 📨 💪. ## 🚚 🛃 📨 💪 🔢 ➡️ 👀 ❔ ⚒ ⚙️ 🛃 `Request` 🏿 🗜 🗜 📨. & `APIRoute` 🏿 ⚙️ 👈 🛃 📨 🎓. ### ✍ 🛃 `GzipRequest` 🎓 !!! tip 👉 🧸 🖼 🎦 ❔ ⚫️ 👷, 🚥 👆 💪 🗜 🐕‍🦺, 👆 💪 ⚙️ 🚚 [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank}. 🥇, 👥 ✍ `GzipRequest` 🎓, ❔ 🔜 📁 `Request.body()` 👩‍🔬 🗜 💪 🔍 ☑ 🎚. 🚥 📤 🙅‍♂ `gzip` 🎚, ⚫️ 🔜 🚫 🔄 🗜 💪. 👈 🌌, 🎏 🛣 🎓 💪 🍵 🗜 🗜 ⚖️ 🗜 📨. ```Python hl_lines="8-15" {!../../../docs_src/custom_request_and_route/tutorial001.py!} ``` ### ✍ 🛃 `GzipRoute` 🎓 ⏭, 👥 ✍ 🛃 🏿 `fastapi.routing.APIRoute` 👈 🔜 ⚒ ⚙️ `GzipRequest`. 👉 🕰, ⚫️ 🔜 📁 👩‍🔬 `APIRoute.get_route_handler()`. 👉 👩‍🔬 📨 🔢. & 👈 🔢 ⚫️❔ 🔜 📨 📨 & 📨 📨. 📥 👥 ⚙️ ⚫️ ✍ `GzipRequest` ⚪️➡️ ⏮️ 📨. ```Python hl_lines="18-26" {!../../../docs_src/custom_request_and_route/tutorial001.py!} ``` !!! note "📡 ℹ" `Request` ✔️ `request.scope` 🔢, 👈 🐍 `dict` ⚗ 🗃 🔗 📨. `Request` ✔️ `request.receive`, 👈 🔢 "📨" 💪 📨. `scope` `dict` & `receive` 🔢 👯‍♂️ 🍕 🔫 🔧. & 👈 2️⃣ 👜, `scope` & `receive`, ⚫️❔ 💪 ✍ 🆕 `Request` 👐. 💡 🌅 🔃 `Request` ✅ 💃 🩺 🔃 📨. 🕴 👜 🔢 📨 `GzipRequest.get_route_handler` 🔨 🎏 🗜 `Request` `GzipRequest`. 🔨 👉, 👆 `GzipRequest` 🔜 ✊ 💅 🗜 📊 (🚥 💪) ⏭ 🚶‍♀️ ⚫️ 👆 *➡ 🛠️*. ⏮️ 👈, 🌐 🏭 ⚛ 🎏. ✋️ ↩️ 👆 🔀 `GzipRequest.body`, 📨 💪 🔜 🔁 🗜 🕐❔ ⚫️ 📐 **FastAPI** 🕐❔ 💪. ## 🔐 📨 💪 ⚠ 🐕‍🦺 !!! tip ❎ 👉 🎏 ⚠, ⚫️ 🎲 📚 ⏩ ⚙️ `body` 🛃 🐕‍🦺 `RequestValidationError` ([🚚 ❌](../tutorial/handling-errors.md#requestvalidationerror){.internal-link target=_blank}). ✋️ 👉 🖼 ☑ & ⚫️ 🎦 ❔ 🔗 ⏮️ 🔗 🦲. 👥 💪 ⚙️ 👉 🎏 🎯 🔐 📨 💪 ⚠ 🐕‍🦺. 🌐 👥 💪 🍵 📨 🔘 `try`/`except` 🍫: ```Python hl_lines="13 15" {!../../../docs_src/custom_request_and_route/tutorial002.py!} ``` 🚥 ⚠ 📉, `Request` 👐 🔜 ↔, 👥 💪 ✍ & ⚒ ⚙️ 📨 💪 🕐❔ 🚚 ❌: ```Python hl_lines="16-18" {!../../../docs_src/custom_request_and_route/tutorial002.py!} ``` ## 🛃 `APIRoute` 🎓 📻 👆 💪 ⚒ `route_class` 🔢 `APIRouter`: ```Python hl_lines="26" {!../../../docs_src/custom_request_and_route/tutorial003.py!} ``` 👉 🖼, *➡ 🛠️* 🔽 `router` 🔜 ⚙️ 🛃 `TimedRoute` 🎓, & 🔜 ✔️ ➕ `X-Response-Time` 🎚 📨 ⏮️ 🕰 ⚫️ ✊ 🏗 📨: ```Python hl_lines="13-20" {!../../../docs_src/custom_request_and_route/tutorial003.py!} ``` fastapi-0.110.3/docs/em/docs/how-to/extending-openapi.md000066400000000000000000000053061461403617600227550ustar00rootroot00000000000000# ↔ 🗄 !!! warning 👉 👍 🏧 ⚒. 👆 🎲 💪 🚶 ⚫️. 🚥 👆 📄 🔰 - 👩‍💻 🦮, 👆 💪 🎲 🚶 👉 📄. 🚥 👆 ⏪ 💭 👈 👆 💪 🔀 🏗 🗄 🔗, 😣 👂. 📤 💼 🌐❔ 👆 💪 💪 🔀 🏗 🗄 🔗. 👉 📄 👆 🔜 👀 ❔. ## 😐 🛠️ 😐 (🔢) 🛠️, ⏩. `FastAPI` 🈸 (👐) ✔️ `.openapi()` 👩‍🔬 👈 📈 📨 🗄 🔗. 🍕 🈸 🎚 🏗, *➡ 🛠️* `/openapi.json` (⚖️ ⚫️❔ 👆 ⚒ 👆 `openapi_url`) ®. ⚫️ 📨 🎻 📨 ⏮️ 🏁 🈸 `.openapi()` 👩‍🔬. 🔢, ⚫️❔ 👩‍🔬 `.openapi()` 🔨 ✅ 🏠 `.openapi_schema` 👀 🚥 ⚫️ ✔️ 🎚 & 📨 👫. 🚥 ⚫️ 🚫, ⚫️ 🏗 👫 ⚙️ 🚙 🔢 `fastapi.openapi.utils.get_openapi`. & 👈 🔢 `get_openapi()` 📨 🔢: * `title`: 🗄 📛, 🎦 🩺. * `version`: ⏬ 👆 🛠️, ✅ `2.5.0`. * `openapi_version`: ⏬ 🗄 🔧 ⚙️. 🔢, ⏪: `3.0.2`. * `description`: 📛 👆 🛠️. * `routes`: 📇 🛣, 👫 🔠 ® *➡ 🛠️*. 👫 ✊ ⚪️➡️ `app.routes`. ## 🔑 🔢 ⚙️ ℹ 🔛, 👆 💪 ⚙️ 🎏 🚙 🔢 🏗 🗄 🔗 & 🔐 🔠 🍕 👈 👆 💪. 🖼, ➡️ 🚮 📄 🗄 ↔ 🔌 🛃 🔱. ### 😐 **FastAPI** 🥇, ✍ 🌐 👆 **FastAPI** 🈸 🛎: ```Python hl_lines="1 4 7-9" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### 🏗 🗄 🔗 ⤴️, ⚙️ 🎏 🚙 🔢 🏗 🗄 🔗, 🔘 `custom_openapi()` 🔢: ```Python hl_lines="2 15-20" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### 🔀 🗄 🔗 🔜 👆 💪 🚮 📄 ↔, ❎ 🛃 `x-logo` `info` "🎚" 🗄 🔗: ```Python hl_lines="21-23" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### 💾 🗄 🔗 👆 💪 ⚙️ 🏠 `.openapi_schema` "💾", 🏪 👆 🏗 🔗. 👈 🌌, 👆 🈸 🏆 🚫 ✔️ 🏗 🔗 🔠 🕰 👩‍💻 📂 👆 🛠️ 🩺. ⚫️ 🔜 🏗 🕴 🕐, & ⤴️ 🎏 💾 🔗 🔜 ⚙️ ⏭ 📨. ```Python hl_lines="13-14 24-25" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### 🔐 👩‍🔬 🔜 👆 💪 ❎ `.openapi()` 👩‍🔬 ⏮️ 👆 🆕 🔢. ```Python hl_lines="28" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### ✅ ⚫️ 🕐 👆 🚶 http://127.0.0.1:8000/redoc 👆 🔜 👀 👈 👆 ⚙️ 👆 🛃 🔱 (👉 🖼, **FastAPI**'Ⓜ 🔱): fastapi-0.110.3/docs/em/docs/how-to/graphql.md000066400000000000000000000057511461403617600210010ustar00rootroot00000000000000# 🕹 **FastAPI** ⚓️ 🔛 **🔫** 🐩, ⚫️ 📶 ⏩ 🛠️ 🙆 **🕹** 🗃 🔗 ⏮️ 🔫. 👆 💪 🌀 😐 FastAPI *➡ 🛠️* ⏮️ 🕹 🔛 🎏 🈸. !!! tip **🕹** ❎ 📶 🎯 ⚙️ 💼. ⚫️ ✔️ **📈** & **⚠** 🕐❔ 🔬 ⚠ **🕸 🔗**. ⚒ 💭 👆 🔬 🚥 **💰** 👆 ⚙️ 💼 ⚖ **👐**. 👶 ## 🕹 🗃 📥 **🕹** 🗃 👈 ✔️ **🔫** 🐕‍🦺. 👆 💪 ⚙️ 👫 ⏮️ **FastAPI**: * 🍓 👶 * ⏮️ 🩺 FastAPI * 👸 * ⏮️ 🩺 💃 (👈 ✔ FastAPI) * 🍟 * ⏮️ 🍟 🔫 🚚 🔫 🛠️ * * ⏮️ 💃-Graphene3️⃣ ## 🕹 ⏮️ 🍓 🚥 👆 💪 ⚖️ 💚 👷 ⏮️ **🕹**, **🍓** **👍** 🗃 ⚫️ ✔️ 🔧 🔐 **FastAPI** 🔧, ⚫️ 🌐 ⚓️ 🔛 **🆎 ✍**. ⚓️ 🔛 👆 ⚙️ 💼, 👆 5️⃣📆 💖 ⚙️ 🎏 🗃, ✋️ 🚥 👆 💭 👤, 👤 🔜 🎲 🤔 👆 🔄 **🍓**. 📥 🤪 🎮 ❔ 👆 💪 🛠️ 🍓 ⏮️ FastAPI: ```Python hl_lines="3 22 25-26" {!../../../docs_src/graphql/tutorial001.py!} ``` 👆 💪 💡 🌅 🔃 🍓 🍓 🧾. & 🩺 🔃 🍓 ⏮️ FastAPI. ## 🗝 `GraphQLApp` ⚪️➡️ 💃 ⏮️ ⏬ 💃 🔌 `GraphQLApp` 🎓 🛠️ ⏮️ . ⚫️ 😢 ⚪️➡️ 💃, ✋️ 🚥 👆 ✔️ 📟 👈 ⚙️ ⚫️, 👆 💪 💪 **↔** 💃-Graphene3️⃣, 👈 📔 🎏 ⚙️ 💼 & ✔️ **🌖 🌓 🔢**. !!! tip 🚥 👆 💪 🕹, 👤 🔜 👍 👆 ✅ 👅 🍓, ⚫️ ⚓️ 🔛 🆎 ✍ ↩️ 🛃 🎓 & 🆎. ## 💡 🌅 👆 💪 💡 🌅 🔃 **🕹** 🛂 🕹 🧾. 👆 💪 ✍ 🌅 🔃 🔠 👈 🗃 🔬 🔛 👫 🔗. fastapi-0.110.3/docs/em/docs/how-to/sql-databases-peewee.md000066400000000000000000000463671461403617600233470ustar00rootroot00000000000000# 🗄 (🔗) 💽 ⏮️ 🏒 !!! warning 🚥 👆 ▶️, 🔰 [🗄 (🔗) 💽](../tutorial/sql-databases.md){.internal-link target=_blank} 👈 ⚙️ 🇸🇲 🔜 🥃. 💭 🆓 🚶 👉. 🚥 👆 ▶️ 🏗 ⚪️➡️ 🖌, 👆 🎲 👻 📆 ⏮️ 🇸🇲 🐜 ([🗄 (🔗) 💽](../tutorial/sql-databases.md){.internal-link target=_blank}), ⚖️ 🙆 🎏 🔁 🐜. 🚥 👆 ⏪ ✔️ 📟 🧢 👈 ⚙️ 🏒 🐜, 👆 💪 ✅ 📥 ❔ ⚙️ ⚫️ ⏮️ **FastAPI**. !!! warning "🐍 3️⃣.7️⃣ ➕ ✔" 👆 🔜 💪 🐍 3️⃣.7️⃣ ⚖️ 🔛 🔒 ⚙️ 🏒 ⏮️ FastAPI. ## 🏒 🔁 🏒 🚫 🔧 🔁 🛠️, ⚖️ ⏮️ 👫 🤯. 🏒 ✔️ 🏋️ 🔑 🔃 🚮 🔢 & 🔃 ❔ ⚫️ 🔜 ⚙️. 🚥 👆 🛠️ 🈸 ⏮️ 🗝 🚫-🔁 🛠️, & 💪 👷 ⏮️ 🌐 🚮 🔢, **⚫️ 💪 👑 🧰**. ✋️ 🚥 👆 💪 🔀 🔢, 🐕‍🦺 🌖 🌘 1️⃣ 🔁 💽, 👷 ⏮️ 🔁 🛠️ (💖 FastAPI), ♒️, 👆 🔜 💪 🚮 🏗 ➕ 📟 🔐 👈 🔢. 👐, ⚫️ 💪 ⚫️, & 📥 👆 🔜 👀 ⚫️❔ ⚫️❔ 📟 👆 ✔️ 🚮 💪 ⚙️ 🏒 ⏮️ FastAPI. !!! note "📡 ℹ" 👆 💪 ✍ 🌅 🔃 🏒 🧍 🔃 🔁 🐍 🩺, , 🇵🇷. ## 🎏 📱 👥 🔜 ✍ 🎏 🈸 🇸🇲 🔰 ([🗄 (🔗) 💽](../tutorial/sql-databases.md){.internal-link target=_blank}). 🌅 📟 🤙 🎏. , 👥 🔜 🎯 🕴 🔛 🔺. ## 📁 📊 ➡️ 💬 👆 ✔️ 📁 📛 `my_super_project` 👈 🔌 🎧-📁 🤙 `sql_app` ⏮️ 📊 💖 👉: ``` . └── sql_app ├── __init__.py ├── crud.py ├── database.py ├── main.py └── schemas.py ``` 👉 🌖 🎏 📊 👥 ✔️ 🇸🇲 🔰. 🔜 ➡️ 👀 ⚫️❔ 🔠 📁/🕹 🔨. ## ✍ 🏒 🍕 ➡️ 🔗 📁 `sql_app/database.py`. ### 🐩 🏒 📟 ➡️ 🥇 ✅ 🌐 😐 🏒 📟, ✍ 🏒 💽: ```Python hl_lines="3 5 22" {!../../../docs_src/sql_databases_peewee/sql_app/database.py!} ``` !!! tip ✔️ 🤯 👈 🚥 👆 💚 ⚙️ 🎏 💽, 💖 ✳, 👆 🚫 🚫 🔀 🎻. 👆 🔜 💪 ⚙️ 🎏 🏒 💽 🎓. #### 🗒 ❌: ```Python check_same_thread=False ``` 🌓 1️⃣ 🇸🇲 🔰: ```Python connect_args={"check_same_thread": False} ``` ...⚫️ 💪 🕴 `SQLite`. !!! info "📡 ℹ" ⚫️❔ 🎏 📡 ℹ [🗄 (🔗) 💽](../tutorial/sql-databases.md#_7){.internal-link target=_blank} ✔. ### ⚒ 🏒 🔁-🔗 `PeeweeConnectionState` 👑 ❔ ⏮️ 🏒 & FastAPI 👈 🏒 ⚓️ 🙇 🔛 🐍 `threading.local`, & ⚫️ 🚫 ✔️ 🎯 🌌 🔐 ⚫️ ⚖️ ➡️ 👆 🍵 🔗/🎉 🔗 (🔨 🇸🇲 🔰). & `threading.local` 🚫 🔗 ⏮️ 🆕 🔁 ⚒ 🏛 🐍. !!! note "📡 ℹ" `threading.local` ⚙️ ✔️ "🎱" 🔢 👈 ✔️ 🎏 💲 🔠 🧵. 👉 ⚠ 🗝 🛠️ 🏗 ✔️ 1️⃣ 👁 🧵 📍 📨, 🙅‍♂ 🌖, 🙅‍♂ 🌘. ⚙️ 👉, 🔠 📨 🔜 ✔️ 🚮 👍 💽 🔗/🎉, ❔ ☑ 🏁 🥅. ✋️ FastAPI, ⚙️ 🆕 🔁 ⚒, 💪 🍵 🌅 🌘 1️⃣ 📨 🔛 🎏 🧵. & 🎏 🕰, 👁 📨, ⚫️ 💪 🏃 💗 👜 🎏 🧵 (🧵), ⚓️ 🔛 🚥 👆 ⚙️ `async def` ⚖️ 😐 `def`. 👉 ⚫️❔ 🤝 🌐 🎭 📈 FastAPI. ✋️ 🐍 3️⃣.7️⃣ & 🔛 🚚 🌖 🏧 🎛 `threading.local`, 👈 💪 ⚙️ 🥉 🌐❔ `threading.local` 🔜 ⚙️, ✋️ 🔗 ⏮️ 🆕 🔁 ⚒. 👥 🔜 ⚙️ 👈. ⚫️ 🤙 `contextvars`. 👥 🔜 🔐 🔗 🍕 🏒 👈 ⚙️ `threading.local` & ❎ 👫 ⏮️ `contextvars`, ⏮️ 🔗 ℹ. 👉 5️⃣📆 😑 🍖 🏗 (& ⚫️ 🤙), 👆 🚫 🤙 💪 🍕 🤔 ❔ ⚫️ 👷 ⚙️ ⚫️. 👥 🔜 ✍ `PeeweeConnectionState`: ```Python hl_lines="10-19" {!../../../docs_src/sql_databases_peewee/sql_app/database.py!} ``` 👉 🎓 😖 ⚪️➡️ 🎁 🔗 🎓 ⚙️ 🏒. ⚫️ ✔️ 🌐 ⚛ ⚒ 🏒 ⚙️ `contextvars` ↩️ `threading.local`. `contextvars` 👷 🍖 🎏 🌘 `threading.local`. ✋️ 🎂 🏒 🔗 📟 🤔 👈 👉 🎓 👷 ⏮️ `threading.local`. , 👥 💪 ➕ 🎱 ⚒ ⚫️ 👷 🚥 ⚫️ ⚙️ `threading.local`. `__init__`, `__setattr__`, & `__getattr__` 🛠️ 🌐 ✔ 🎱 👉 ⚙️ 🏒 🍵 🤔 👈 ⚫️ 🔜 🔗 ⏮️ FastAPI. !!! tip 👉 🔜 ⚒ 🏒 🎭 ☑ 🕐❔ ⚙️ ⏮️ FastAPI. 🚫 🎲 📂 ⚖️ 📪 🔗 👈 ➖ ⚙️, 🏗 ❌, ♒️. ✋️ ⚫️ 🚫 🤝 🏒 🔁 💎-🏋️. 👆 🔜 ⚙️ 😐 `def` 🔢 & 🚫 `async def`. ### ⚙️ 🛃 `PeeweeConnectionState` 🎓 🔜, 📁 `._state` 🔗 🔢 🏒 💽 `db` 🎚 ⚙️ 🆕 `PeeweeConnectionState`: ```Python hl_lines="24" {!../../../docs_src/sql_databases_peewee/sql_app/database.py!} ``` !!! tip ⚒ 💭 👆 📁 `db._state` *⏮️* 🏗 `db`. !!! tip 👆 🔜 🎏 🙆 🎏 🏒 💽, 🔌 `PostgresqlDatabase`, `MySQLDatabase`, ♒️. ## ✍ 💽 🏷 ➡️ 🔜 👀 📁 `sql_app/models.py`. ### ✍ 🏒 🏷 👆 💽 🔜 ✍ 🏒 🏷 (🎓) `User` & `Item`. 👉 🎏 👆 🔜 🚥 👆 ⏩ 🏒 🔰 & ℹ 🏷 ✔️ 🎏 💽 🇸🇲 🔰. !!! tip 🏒 ⚙️ ⚖ "**🏷**" 🔗 👉 🎓 & 👐 👈 🔗 ⏮️ 💽. ✋️ Pydantic ⚙️ ⚖ "**🏷**" 🔗 🕳 🎏, 💽 🔬, 🛠️, & 🧾 🎓 & 👐. 🗄 `db` ⚪️➡️ `database` (📁 `database.py` ⚪️➡️ 🔛) & ⚙️ ⚫️ 📥. ```Python hl_lines="3 6-12 15-21" {!../../../docs_src/sql_databases_peewee/sql_app/models.py!} ``` !!! tip 🏒 ✍ 📚 🎱 🔢. ⚫️ 🔜 🔁 🚮 `id` 🔢 🔢 👑 🔑. ⚫️ 🔜 ⚒ 📛 🏓 ⚓️ 🔛 🎓 📛. `Item`, ⚫️ 🔜 ✍ 🔢 `owner_id` ⏮️ 🔢 🆔 `User`. ✋️ 👥 🚫 📣 ⚫️ 🙆. ## ✍ Pydantic 🏷 🔜 ➡️ ✅ 📁 `sql_app/schemas.py`. !!! tip ❎ 😨 🖖 🏒 *🏷* & Pydantic *🏷*, 👥 🔜 ✔️ 📁 `models.py` ⏮️ 🏒 🏷, & 📁 `schemas.py` ⏮️ Pydantic 🏷. 👫 Pydantic 🏷 🔬 🌅 ⚖️ 🌘 "🔗" (☑ 📊 💠). 👉 🔜 ℹ 👥 ❎ 😨 ⏪ ⚙️ 👯‍♂️. ### ✍ Pydantic *🏷* / 🔗 ✍ 🌐 🎏 Pydantic 🏷 🇸🇲 🔰: ```Python hl_lines="16-18 21-22 25-30 34-35 38-39 42-48" {!../../../docs_src/sql_databases_peewee/sql_app/schemas.py!} ``` !!! tip 📥 👥 🏗 🏷 ⏮️ `id`. 👥 🚫 🎯 ✔ `id` 🔢 🏒 🏷, ✋️ 🏒 🚮 1️⃣ 🔁. 👥 ❎ 🎱 `owner_id` 🔢 `Item`. ### ✍ `PeeweeGetterDict` Pydantic *🏷* / 🔗 🕐❔ 👆 🔐 💛 🏒 🎚, 💖 `some_user.items`, 🏒 🚫 🚚 `list` `Item`. ⚫️ 🚚 🎁 🛃 🎚 🎓 `ModelSelect`. ⚫️ 💪 ✍ `list` 🚮 🏬 ⏮️ `list(some_user.items)`. ✋️ 🎚 ⚫️ 🚫 `list`. & ⚫️ 🚫 ☑ 🐍 🚂. ↩️ 👉, Pydantic 🚫 💭 🔢 ❔ 🗜 ⚫️ `list` Pydantic *🏷* / 🔗. ✋️ ⏮️ ⏬ Pydantic ✔ 🚚 🛃 🎓 👈 😖 ⚪️➡️ `pydantic.utils.GetterDict`, 🚚 🛠️ ⚙️ 🕐❔ ⚙️ `orm_mode = True` 🗃 💲 🐜 🏷 🔢. 👥 🔜 ✍ 🛃 `PeeweeGetterDict` 🎓 & ⚙️ ⚫️ 🌐 🎏 Pydantic *🏷* / 🔗 👈 ⚙️ `orm_mode`: ```Python hl_lines="3 8-13 31 49" {!../../../docs_src/sql_databases_peewee/sql_app/schemas.py!} ``` 📥 👥 ✅ 🚥 🔢 👈 ➖ 🔐 (✅ `.items` `some_user.items`) 👐 `peewee.ModelSelect`. & 🚥 👈 💼, 📨 `list` ⏮️ ⚫️. & ⤴️ 👥 ⚙️ ⚫️ Pydantic *🏷* / 🔗 👈 ⚙️ `orm_mode = True`, ⏮️ 📳 🔢 `getter_dict = PeeweeGetterDict`. !!! tip 👥 🕴 💪 ✍ 1️⃣ `PeeweeGetterDict` 🎓, & 👥 💪 ⚙️ ⚫️ 🌐 Pydantic *🏷* / 🔗. ## 💩 🇨🇻 🔜 ➡️ 👀 📁 `sql_app/crud.py`. ### ✍ 🌐 💩 🇨🇻 ✍ 🌐 🎏 💩 🇨🇻 🇸🇲 🔰, 🌐 📟 📶 🎏: ```Python hl_lines="1 4-5 8-9 12-13 16-20 23-24 27-30" {!../../../docs_src/sql_databases_peewee/sql_app/crud.py!} ``` 📤 🔺 ⏮️ 📟 🇸🇲 🔰. 👥 🚫 🚶‍♀️ `db` 🔢 🤭. ↩️ 👥 ⚙️ 🏷 🔗. 👉 ↩️ `db` 🎚 🌐 🎚, 👈 🔌 🌐 🔗 ⚛. 👈 ⚫️❔ 👥 ✔️ 🌐 `contextvars` ℹ 🔛. 🆖, 🕐❔ 🛬 📚 🎚, 💖 `get_users`, 👥 🔗 🤙 `list`, 💖: ```Python list(models.User.select()) ``` 👉 🎏 🤔 👈 👥 ✔️ ✍ 🛃 `PeeweeGetterDict`. ✋️ 🛬 🕳 👈 ⏪ `list` ↩️ `peewee.ModelSelect` `response_model` *➡ 🛠️* ⏮️ `List[models.User]` (👈 👥 🔜 👀 ⏪) 🔜 👷 ☑. ## 👑 **FastAPI** 📱 & 🔜 📁 `sql_app/main.py` ➡️ 🛠️ & ⚙️ 🌐 🎏 🍕 👥 ✍ ⏭. ### ✍ 💽 🏓 📶 🙃 🌌 ✍ 💽 🏓: ```Python hl_lines="9-11" {!../../../docs_src/sql_databases_peewee/sql_app/main.py!} ``` ### ✍ 🔗 ✍ 🔗 👈 🔜 🔗 💽 ▶️️ ▶️ 📨 & 🔌 ⚫️ 🔚: ```Python hl_lines="23-29" {!../../../docs_src/sql_databases_peewee/sql_app/main.py!} ``` 📥 👥 ✔️ 🛁 `yield` ↩️ 👥 🤙 🚫 ⚙️ 💽 🎚 🔗. ⚫️ 🔗 💽 & ♻ 🔗 💽 🔗 🔢 👈 🔬 🔠 📨 (⚙️ `contextvars` 🎱 ⚪️➡️ 🔛). ↩️ 💽 🔗 ⚠ 👤/🅾 🚧, 👉 🔗 ✍ ⏮️ 😐 `def` 🔢. & ⤴️, 🔠 *➡ 🛠️ 🔢* 👈 💪 🔐 💽 👥 🚮 ⚫️ 🔗. ✋️ 👥 🚫 ⚙️ 💲 👐 👉 🔗 (⚫️ 🤙 🚫 🤝 🙆 💲, ⚫️ ✔️ 🛁 `yield`). , 👥 🚫 🚮 ⚫️ *➡ 🛠️ 🔢* ✋️ *➡ 🛠️ 👨‍🎨* `dependencies` 🔢: ```Python hl_lines="32 40 47 59 65 72" {!../../../docs_src/sql_databases_peewee/sql_app/main.py!} ``` ### 🔑 🔢 🎧-🔗 🌐 `contextvars` 🍕 👷, 👥 💪 ⚒ 💭 👥 ✔️ 🔬 💲 `ContextVar` 🔠 📨 👈 ⚙️ 💽, & 👈 💲 🔜 ⚙️ 💽 🇵🇸 (🔗, 💵, ♒️) 🎂 📨. 👈, 👥 💪 ✍ ➕1️⃣ `async` 🔗 `reset_db_state()` 👈 ⚙️ 🎧-🔗 `get_db()`. ⚫️ 🔜 ⚒ 💲 🔑 🔢 (⏮️ 🔢 `dict`) 👈 🔜 ⚙️ 💽 🇵🇸 🎂 📨. & ⤴️ 🔗 `get_db()` 🔜 🏪 ⚫️ 💽 🇵🇸 (🔗, 💵, ♒️). ```Python hl_lines="18-20" {!../../../docs_src/sql_databases_peewee/sql_app/main.py!} ``` **⏭ 📨**, 👥 🔜 ⏲ 👈 🔑 🔢 🔄 `async` 🔗 `reset_db_state()` & ⤴️ ✍ 🆕 🔗 `get_db()` 🔗, 👈 🆕 📨 🔜 ✔️ 🚮 👍 💽 🇵🇸 (🔗, 💵, ♒️). !!! tip FastAPI 🔁 🛠️, 1️⃣ 📨 💪 ▶️ ➖ 🛠️, & ⏭ 🏁, ➕1️⃣ 📨 💪 📨 & ▶️ 🏭 👍, & ⚫️ 🌐 💪 🛠️ 🎏 🧵. ✋️ 🔑 🔢 🤔 👫 🔁 ⚒,, 🏒 💽 🇵🇸 ⚒ `async` 🔗 `reset_db_state()` 🔜 🚧 🚮 👍 💽 🎂 🎂 📨. & 🎏 🕰, 🎏 🛠️ 📨 🔜 ✔️ 🚮 👍 💽 🇵🇸 👈 🔜 🔬 🎂 📨. #### 🏒 🗳 🚥 👆 ⚙️ 🏒 🗳, ☑ 💽 `db.obj`. , 👆 🔜 ⏲ ⚫️ ⏮️: ```Python hl_lines="3-4" async def reset_db_state(): database.db.obj._state._state.set(db_state_default.copy()) database.db.obj._state.reset() ``` ### ✍ 👆 **FastAPI** *➡ 🛠️* 🔜, 😒, 📥 🐩 **FastAPI** *➡ 🛠️* 📟. ```Python hl_lines="32-37 40-43 46-53 56-62 65-68 71-79" {!../../../docs_src/sql_databases_peewee/sql_app/main.py!} ``` ### 🔃 `def` 🆚 `async def` 🎏 ⏮️ 🇸🇲, 👥 🚫 🔨 🕳 💖: ```Python user = await models.User.select().first() ``` ...✋️ ↩️ 👥 ⚙️: ```Python user = models.User.select().first() ``` , 🔄, 👥 🔜 📣 *➡ 🛠️ 🔢* & 🔗 🍵 `async def`, ⏮️ 😐 `def`,: ```Python hl_lines="2" # Something goes here def read_users(skip: int = 0, limit: int = 100): # Something goes here ``` ## 🔬 🏒 ⏮️ 🔁 👉 🖼 🔌 ➕ *➡ 🛠️* 👈 🔬 📏 🏭 📨 ⏮️ `time.sleep(sleep_time)`. ⚫️ 🔜 ✔️ 💽 🔗 📂 ▶️ & 🔜 ⌛ 🥈 ⏭ 🙇 🔙. & 🔠 🆕 📨 🔜 ⌛ 🕐 🥈 🌘. 👉 🔜 💪 ➡️ 👆 💯 👈 👆 📱 ⏮️ 🏒 & FastAPI 🎭 ☑ ⏮️ 🌐 💩 🔃 🧵. 🚥 👆 💚 ✅ ❔ 🏒 🔜 💔 👆 📱 🚥 ⚙️ 🍵 🛠️, 🚶 `sql_app/database.py` 📁 & 🏤 ⏸: ```Python # db._state = PeeweeConnectionState() ``` & 📁 `sql_app/main.py` 📁, 🏤 💪 `async` 🔗 `reset_db_state()` & ❎ ⚫️ ⏮️ `pass`: ```Python async def reset_db_state(): # database.db._state._state.set(db_state_default.copy()) # database.db._state.reset() pass ``` ⤴️ 🏃 👆 📱 ⏮️ Uvicorn:
```console $ uvicorn sql_app.main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
📂 👆 🖥 http://127.0.0.1:8000/docs & ✍ 👩‍❤‍👨 👩‍💻. ⤴️ 📂 1️⃣0️⃣ 📑 http://127.0.0.1:8000/docs#/default/read_🐌_👩‍💻_slowusers_ = 🎏 🕰. 🚶 *➡ 🛠️* "🤚 `/slowusers/`" 🌐 📑. ⚙️ "🔄 ⚫️ 👅" 🔼 & 🛠️ 📨 🔠 📑, 1️⃣ ▶️️ ⏮️ 🎏. 📑 🔜 ⌛ 🍖 & ⤴️ 👫 🔜 🎦 `Internal Server Error`. ### ⚫️❔ 🔨 🥇 📑 🔜 ⚒ 👆 📱 ✍ 🔗 💽 & ⌛ 🥈 ⏭ 🙇 🔙 & 📪 💽 🔗. ⤴️, 📨 ⏭ 📑, 👆 📱 🔜 ⌛ 🕐 🥈 🌘, & 🔛. 👉 ⛓ 👈 ⚫️ 🔜 🔚 🆙 🏁 🏁 📑' 📨 ⏪ 🌘 ⏮️ 🕐. ⤴️ 1️⃣ 🏁 📨 👈 ⌛ 🌘 🥈 🔜 🔄 📂 💽 🔗, ✋️ 1️⃣ 📚 ⏮️ 📨 🎏 📑 🔜 🎲 🍵 🎏 🧵 🥇 🕐, ⚫️ 🔜 ✔️ 🎏 💽 🔗 👈 ⏪ 📂, & 🏒 🔜 🚮 ❌ & 👆 🔜 👀 ⚫️ 📶, & 📨 🔜 ✔️ `Internal Server Error`. 👉 🔜 🎲 🔨 🌅 🌘 1️⃣ 📚 📑. 🚥 👆 ✔️ 💗 👩‍💻 💬 👆 📱 ⚫️❔ 🎏 🕰, 👉 ⚫️❔ 💪 🔨. & 👆 📱 ▶️ 🍵 🌅 & 🌖 👩‍💻 🎏 🕰, ⌛ 🕰 👁 📨 💪 📏 & 📏 ⏲ ❌. ### 🔧 🏒 ⏮️ FastAPI 🔜 🚶 🔙 📁 `sql_app/database.py`, & ✍ ⏸: ```Python db._state = PeeweeConnectionState() ``` & 📁 `sql_app/main.py` 📁, ✍ 💪 `async` 🔗 `reset_db_state()`: ```Python async def reset_db_state(): database.db._state._state.set(db_state_default.copy()) database.db._state.reset() ``` ❎ 👆 🏃‍♂ 📱 & ▶️ ⚫️ 🔄. 🔁 🎏 🛠️ ⏮️ 1️⃣0️⃣ 📑. 👉 🕰 🌐 👫 🔜 ⌛ & 👆 🔜 🤚 🌐 🏁 🍵 ❌. ...👆 🔧 ⚫️ ❗ ## 📄 🌐 📁 💭 👆 🔜 ✔️ 📁 📛 `my_super_project` (⚖️ 👐 👆 💚) 👈 🔌 🎧-📁 🤙 `sql_app`. `sql_app` 🔜 ✔️ 📄 📁: * `sql_app/__init__.py`: 🛁 📁. * `sql_app/database.py`: ```Python {!../../../docs_src/sql_databases_peewee/sql_app/database.py!} ``` * `sql_app/models.py`: ```Python {!../../../docs_src/sql_databases_peewee/sql_app/models.py!} ``` * `sql_app/schemas.py`: ```Python {!../../../docs_src/sql_databases_peewee/sql_app/schemas.py!} ``` * `sql_app/crud.py`: ```Python {!../../../docs_src/sql_databases_peewee/sql_app/crud.py!} ``` * `sql_app/main.py`: ```Python {!../../../docs_src/sql_databases_peewee/sql_app/main.py!} ``` ## 📡 ℹ !!! warning 👉 📶 📡 ℹ 👈 👆 🎲 🚫 💪. ### ⚠ 🏒 ⚙️ `threading.local` 🔢 🏪 ⚫️ 💽 "🇵🇸" 💽 (🔗, 💵, ♒️). `threading.local` ✍ 💲 🌟 ⏮️ 🧵, ✋️ 🔁 🛠️ 🔜 🏃 🌐 📟 (✅ 🔠 📨) 🎏 🧵, & 🎲 🚫 ✔. 🔛 🔝 👈, 🔁 🛠️ 💪 🏃 🔁 📟 🧵 (⚙️ `asyncio.run_in_executor`), ✋️ 🔗 🎏 📨. 👉 ⛓ 👈, ⏮️ 🏒 ⏮️ 🛠️, 💗 📋 💪 ⚙️ 🎏 `threading.local` 🔢 & 🔚 🆙 🤝 🎏 🔗 & 💽 (👈 👫 🚫🔜 🚫), & 🎏 🕰, 🚥 👫 🛠️ 🔁 👤/🅾-🚧 📟 🧵 (⏮️ 😐 `def` 🔢 FastAPI, *➡ 🛠️* & 🔗), 👈 📟 🏆 🚫 ✔️ 🔐 💽 🇵🇸 🔢, ⏪ ⚫️ 🍕 🎏 📨 & ⚫️ 🔜 💪 🤚 🔐 🎏 💽 🇵🇸. ### 🔑 🔢 🐍 3️⃣.7️⃣ ✔️ `contextvars` 👈 💪 ✍ 🇧🇿 🔢 📶 🎏 `threading.local`, ✋️ 🔗 👫 🔁 ⚒. 📤 📚 👜 ✔️ 🤯. `ContextVar` ✔️ ✍ 🔝 🕹, 💖: ```Python some_var = ContextVar("some_var", default="default value") ``` ⚒ 💲 ⚙️ ⏮️ "🔑" (✅ ⏮️ 📨) ⚙️: ```Python some_var.set("new value") ``` 🤚 💲 🙆 🔘 🔑 (✅ 🙆 🍕 🚚 ⏮️ 📨) ⚙️: ```Python some_var.get() ``` ### ⚒ 🔑 🔢 `async` 🔗 `reset_db_state()` 🚥 🍕 🔁 📟 ⚒ 💲 ⏮️ `some_var.set("updated in function")` (✅ 💖 `async` 🔗), 🎂 📟 ⚫️ & 📟 👈 🚶 ⏮️ (✅ 📟 🔘 `async` 🔢 🤙 ⏮️ `await`) 🔜 👀 👈 🆕 💲. , 👆 💼, 🚥 👥 ⚒ 🏒 🇵🇸 🔢 (⏮️ 🔢 `dict`) `async` 🔗, 🌐 🎂 🔗 📟 👆 📱 🔜 👀 👉 💲 & 🔜 💪 ♻ ⚫️ 🎂 📨. & 🔑 🔢 🔜 ⚒ 🔄 ⏭ 📨, 🚥 👫 🛠️. ### ⚒ 💽 🇵🇸 🔗 `get_db()` `get_db()` 😐 `def` 🔢, **FastAPI** 🔜 ⚒ ⚫️ 🏃 🧵, ⏮️ *📁* "🔑", 🧑‍🤝‍🧑 🎏 💲 🔑 🔢 ( `dict` ⏮️ ⏲ 💽 🇵🇸). ⤴️ ⚫️ 💪 🚮 💽 🇵🇸 👈 `dict`, 💖 🔗, ♒️. ✋️ 🚥 💲 🔑 🔢 (🔢 `dict`) ⚒ 👈 😐 `def` 🔢, ⚫️ 🔜 ✍ 🆕 💲 👈 🔜 🚧 🕴 👈 🧵 🧵, & 🎂 📟 (💖 *➡ 🛠️ 🔢*) 🚫🔜 ✔️ 🔐 ⚫️. `get_db()` 👥 💪 🕴 ⚒ 💲 `dict`, ✋️ 🚫 🎂 `dict` ⚫️. , 👥 💪 ✔️ `async` 🔗 `reset_db_state()` ⚒ `dict` 🔑 🔢. 👈 🌌, 🌐 📟 ✔️ 🔐 🎏 `dict` 💽 🇵🇸 👁 📨. ### 🔗 & 🔌 🔗 `get_db()` ⤴️ ⏭ ❔ 🔜, ⚫️❔ 🚫 🔗 & 🔌 💽 `async` 🔗 ⚫️, ↩️ `get_db()`❓ `async` 🔗 ✔️ `async` 🔑 🔢 🛡 🎂 📨, ✋️ 🏗 & 📪 💽 🔗 ⚠ 🚧, ⚫️ 💪 📉 🎭 🚥 ⚫️ 📤. 👥 💪 😐 `def` 🔗 `get_db()`. fastapi-0.110.3/docs/em/docs/index.md000066400000000000000000000422131461403617600172270ustar00rootroot00000000000000--- hide: - navigation ---

FastAPI

FastAPI 🛠️, ↕ 🎭, ⏩ 💡, ⏩ 📟, 🔜 🏭

Test Coverage Package version Supported Python versions

--- **🧾**: https://fastapi.tiangolo.com **ℹ 📟**: https://github.com/tiangolo/fastapi --- FastAPI 🏛, ⏩ (↕-🎭), 🕸 🛠️ 🏗 🛠️ ⏮️ 🐍 3️⃣.8️⃣ ➕ ⚓️ 🔛 🐩 🐍 🆎 🔑. 🔑 ⚒: * **⏩**: 📶 ↕ 🎭, 🔛 🇷🇪 ⏮️ **✳** & **🚶** (👏 💃 & Pydantic). [1️⃣ ⏩ 🐍 🛠️ 💪](#_15). * **⏩ 📟**: 📈 🚅 🛠️ ⚒ 🔃 2️⃣0️⃣0️⃣ 💯 3️⃣0️⃣0️⃣ 💯. * * **👩‍❤‍👨 🐛**: 📉 🔃 4️⃣0️⃣ 💯 🗿 (👩‍💻) 📉 ❌. * * **🏋️**: 👑 👨‍🎨 🐕‍🦺. 🛠️ 🌐. 🌘 🕰 🛠️. * **⏩**: 🔧 ⏩ ⚙️ & 💡. 🌘 🕰 👂 🩺. * **📏**: 📉 📟 ❎. 💗 ⚒ ⚪️➡️ 🔠 🔢 📄. 👩‍❤‍👨 🐛. * **🏋️**: 🤚 🏭-🔜 📟. ⏮️ 🏧 🎓 🧾. * **🐩-⚓️**: ⚓️ 🔛 (& 🍕 🔗 ⏮️) 📂 🐩 🔗: 🗄 (⏪ 💭 🦁) & 🎻 🔗. * ⚖ ⚓️ 🔛 💯 🔛 🔗 🛠️ 🏉, 🏗 🏭 🈸. ## 💰 {% if sponsors %} {% for sponsor in sponsors.gold -%} {% endfor -%} {%- for sponsor in sponsors.silver -%} {% endfor %} {% endif %} 🎏 💰 ## 🤔 "_[...] 👤 ⚙️ **FastAPI** 📚 👫 📆. [...] 👤 🤙 📆 ⚙️ ⚫️ 🌐 👇 🏉 **⚗ 🐕‍🦺 🤸‍♂**. 👫 💆‍♂ 🛠️ 🔘 🐚 **🖥** 🏬 & **📠** 🏬._"
🧿 🇵🇰 - 🤸‍♂ (🇦🇪)
--- "_👥 🛠️ **FastAPI** 🗃 🤖 **🎂** 💽 👈 💪 🔢 🚚 **🔮**. [👨📛]_"
🇮🇹 🇸🇻, 👨📛 👨📛, & 🇱🇰 🕉 🕉 - 🙃 (🇦🇪)
--- "_**📺** 🙏 📣 📂-ℹ 🚀 👆 **⚔ 🧾** 🎶 🛠️: **📨**❗ [🏗 ⏮️ **FastAPI**]_"
✡ 🍏, 👖 🇪🇸, 🌲 🍏 - 📺 (🇦🇪)
--- "_👤 🤭 🌕 😄 🔃 **FastAPI**. ⚫️ 🎊 ❗_"
✡ 🇭🇰 - 🐍 🔢 📻 🦠 (🇦🇪)
--- "_🤙, ⚫️❔ 👆 ✔️ 🏗 👀 💎 💠 & 🇵🇱. 📚 🌌, ⚫️ ⚫️❔ 👤 💚 **🤗** - ⚫️ 🤙 😍 👀 👱 🏗 👈._"
✡ 🗄 - 🤗 👼 (🇦🇪)
--- "_🚥 👆 👀 💡 1️⃣ **🏛 🛠️** 🏗 🎂 🔗, ✅ 👅 **FastAPI** [...] ⚫️ ⏩, ⏩ ⚙️ & ⏩ 💡 [...]_" "_👥 ✔️ 🎛 🤭 **FastAPI** 👆 **🔗** [...] 👤 💭 👆 🔜 💖 ⚫️ [...]_"
🇱🇨 🇸🇲 - ✡ Honnibal - 💥 👲 🕴 - 🌈 👼 (🇦🇪) - (🇦🇪)
--- "_🚥 🙆 👀 🏗 🏭 🐍 🛠️, 👤 🔜 🏆 👍 **FastAPI**. ⚫️ **💎 🏗**, **🙅 ⚙️** & **🏆 🛠️**, ⚫️ ✔️ ▶️️ **🔑 🦲** 👆 🛠️ 🥇 🛠️ 🎛 & 🚘 📚 🏧 & 🐕‍🦺 ✅ 👆 🕹 🔫 👨‍💻._"
🇹🇦 🍰 - 📻 (🇦🇪)
--- ## **🏎**, FastAPI 🇳🇨 🚥 👆 🏗 📱 ⚙️ 📶 ↩️ 🕸 🛠️, ✅ 👅 **🏎**. **🏎** FastAPI 🐥 👪. & ⚫️ 🎯 **FastAPI 🇳🇨**. 👶 👶 👶 ## 📄 🐍 3️⃣.7️⃣ ➕ FastAPI 🧍 🔛 ⌚ 🐘: * 💃 🕸 🍕. * Pydantic 📊 🍕. ## 👷‍♂
```console $ pip install fastapi ---> 100% ```
👆 🔜 💪 🔫 💽, 🏭 ✅ Uvicorn ⚖️ Hypercorn.
```console $ pip install "uvicorn[standard]" ---> 100% ```
## 🖼 ### ✍ ⚫️ * ✍ 📁 `main.py` ⏮️: ```Python from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ```
⚖️ ⚙️ async def... 🚥 👆 📟 ⚙️ `async` / `await`, ⚙️ `async def`: ```Python hl_lines="9 14" from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") async def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") async def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ``` **🗒**: 🚥 👆 🚫 💭, ✅ _"🏃 ❓" _ 📄 🔃 `async` & `await` 🩺.
### 🏃 ⚫️ 🏃 💽 ⏮️:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [28720] INFO: Started server process [28722] INFO: Waiting for application startup. INFO: Application startup complete. ```
🔃 📋 uvicorn main:app --reload... 📋 `uvicorn main:app` 🔗: * `main`: 📁 `main.py` (🐍 "🕹"). * `app`: 🎚 ✍ 🔘 `main.py` ⏮️ ⏸ `app = FastAPI()`. * `--reload`: ⚒ 💽 ⏏ ⏮️ 📟 🔀. 🕴 👉 🛠️.
### ✅ ⚫️ 📂 👆 🖥 http://127.0.0.1:8000/items/5?q=somequery. 👆 🔜 👀 🎻 📨: ```JSON {"item_id": 5, "q": "somequery"} ``` 👆 ⏪ ✍ 🛠️ 👈: * 📨 🇺🇸🔍 📨 _➡_ `/` & `/items/{item_id}`. * 👯‍♂️ _➡_ ✊ `GET` 🛠️ (💭 🇺🇸🔍 _👩‍🔬_). * _➡_ `/items/{item_id}` ✔️ _➡ 🔢_ `item_id` 👈 🔜 `int`. * _➡_ `/items/{item_id}` ✔️ 📦 `str` _🔢 = `q`. ### 🎓 🛠️ 🩺 🔜 🚶 http://127.0.0.1:8000/docs. 👆 🔜 👀 🏧 🎓 🛠️ 🧾 (🚚 🦁 🎚): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### 🎛 🛠️ 🩺 & 🔜, 🚶 http://127.0.0.1:8000/redoc. 👆 🔜 👀 🎛 🏧 🧾 (🚚 📄): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ## 🖼 ♻ 🔜 🔀 📁 `main.py` 📨 💪 ⚪️➡️ `PUT` 📨. 📣 💪 ⚙️ 🐩 🐍 🆎, 👏 Pydantic. ```Python hl_lines="4 9-12 25-27" from typing import Union from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str price: float is_offer: Union[bool, None] = None @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} @app.put("/items/{item_id}") def update_item(item_id: int, item: Item): return {"item_name": item.name, "item_id": item_id} ``` 💽 🔜 🔃 🔁 (↩️ 👆 🚮 `--reload` `uvicorn` 📋 🔛). ### 🎓 🛠️ 🩺 ♻ 🔜 🚶 http://127.0.0.1:8000/docs. * 🎓 🛠️ 🧾 🔜 🔁 ℹ, 🔌 🆕 💪: ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) * 🖊 🔛 🔼 "🔄 ⚫️ 👅", ⚫️ ✔ 👆 🥧 🔢 & 🔗 🔗 ⏮️ 🛠️: ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) * ⤴️ 🖊 🔛 "🛠️" 🔼, 👩‍💻 🔢 🔜 🔗 ⏮️ 👆 🛠️, 📨 🔢, 🤚 🏁 & 🎦 👫 🔛 🖥: ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) ### 🎛 🛠️ 🩺 ♻ & 🔜, 🚶 http://127.0.0.1:8000/redoc. * 🎛 🧾 🔜 🎨 🆕 🔢 🔢 & 💪: ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ### 🌃 📄, 👆 📣 **🕐** 🆎 🔢, 💪, ♒️. 🔢 🔢. 👆 👈 ⏮️ 🐩 🏛 🐍 🆎. 👆 🚫 ✔️ 💡 🆕 ❕, 👩‍🔬 ⚖️ 🎓 🎯 🗃, ♒️. 🐩 **🐍 3️⃣.7️⃣ ➕**. 🖼, `int`: ```Python item_id: int ``` ⚖️ 🌖 🏗 `Item` 🏷: ```Python item: Item ``` ...& ⏮️ 👈 👁 📄 👆 🤚: * 👨‍🎨 🐕‍🦺, 🔌: * 🛠️. * 🆎 ✅. * 🔬 💽: * 🏧 & 🆑 ❌ 🕐❔ 📊 ❌. * 🔬 🙇 🐦 🎻 🎚. * 🛠️ 🔢 💽: 👟 ⚪️➡️ 🕸 🐍 💽 & 🆎. 👂 ⚪️➡️: * 🎻. * ➡ 🔢. * 🔢 🔢. * 🍪. * 🎚. * 📨. * 📁. * 🛠️ 🔢 📊: 🗜 ⚪️➡️ 🐍 💽 & 🆎 🕸 💽 (🎻): * 🗜 🐍 🆎 (`str`, `int`, `float`, `bool`, `list`, ♒️). * `datetime` 🎚. * `UUID` 🎚. * 💽 🏷. * ...& 📚 🌖. * 🏧 🎓 🛠️ 🧾, 🔌 2️⃣ 🎛 👩‍💻 🔢: * 🦁 🎚. * 📄. --- 👟 🔙 ⏮️ 📟 🖼, **FastAPI** 🔜: * ✔ 👈 📤 `item_id` ➡ `GET` & `PUT` 📨. * ✔ 👈 `item_id` 🆎 `int` `GET` & `PUT` 📨. * 🚥 ⚫️ 🚫, 👩‍💻 🔜 👀 ⚠, 🆑 ❌. * ✅ 🚥 📤 📦 🔢 🔢 📛 `q` ( `http://127.0.0.1:8000/items/foo?q=somequery`) `GET` 📨. * `q` 🔢 📣 ⏮️ `= None`, ⚫️ 📦. * 🍵 `None` ⚫️ 🔜 🚚 (💪 💼 ⏮️ `PUT`). * `PUT` 📨 `/items/{item_id}`, ✍ 💪 🎻: * ✅ 👈 ⚫️ ✔️ ✔ 🔢 `name` 👈 🔜 `str`. * ✅ 👈 ⚫️ ✔️ ✔ 🔢 `price` 👈 ✔️ `float`. * ✅ 👈 ⚫️ ✔️ 📦 🔢 `is_offer`, 👈 🔜 `bool`, 🚥 🎁. * 🌐 👉 🔜 👷 🙇 🐦 🎻 🎚. * 🗜 ⚪️➡️ & 🎻 🔁. * 📄 🌐 ⏮️ 🗄, 👈 💪 ⚙️: * 🎓 🧾 ⚙️. * 🏧 👩‍💻 📟 ⚡ ⚙️, 📚 🇪🇸. * 🚚 2️⃣ 🎓 🧾 🕸 🔢 🔗. --- 👥 🖌 🧽, ✋️ 👆 ⏪ 🤚 💭 ❔ ⚫️ 🌐 👷. 🔄 🔀 ⏸ ⏮️: ```Python return {"item_name": item.name, "item_id": item_id} ``` ...⚪️➡️: ```Python ... "item_name": item.name ... ``` ...: ```Python ... "item_price": item.price ... ``` ...& 👀 ❔ 👆 👨‍🎨 🔜 🚘-🏁 🔢 & 💭 👫 🆎: ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) 🌅 🏁 🖼 🔌 🌅 ⚒, 👀 🔰 - 👩‍💻 🦮. **🚘 🚨**: 🔰 - 👩‍💻 🦮 🔌: * 📄 **🔢** ⚪️➡️ 🎏 🎏 🥉: **🎚**, **🍪**, **📨 🏑** & **📁**. * ❔ ⚒ **🔬 ⚛** `maximum_length` ⚖️ `regex`. * 📶 🏋️ & ⏩ ⚙️ **🔗 💉** ⚙️. * 💂‍♂ & 🤝, ✅ 🐕‍🦺 **Oauth2️⃣** ⏮️ **🥙 🤝** & **🇺🇸🔍 🔰** 🔐. * 🌅 🏧 (✋️ 😨 ⏩) ⚒ 📣 **🙇 🐦 🎻 🏷** (👏 Pydantic). * **🕹** 🛠️ ⏮️ 🍓 & 🎏 🗃. * 📚 ➕ ⚒ (👏 💃): * ** *️⃣ ** * 📶 ⏩ 💯 ⚓️ 🔛 🇸🇲 & `pytest` * **⚜** * **🍪 🎉** * ...& 🌖. ## 🎭 🔬 🇸🇲 📇 🎦 **FastAPI** 🈸 🏃‍♂ 🔽 Uvicorn 1️⃣ ⏩ 🐍 🛠️ 💪, 🕴 🔛 💃 & Uvicorn 👫 (⚙️ 🔘 FastAPI). (*) 🤔 🌖 🔃 ⚫️, 👀 📄 📇. ## 📦 🔗 ⚙️ Pydantic: * email_validator - 📧 🔬. ⚙️ 💃: * httpx - ✔ 🚥 👆 💚 ⚙️ `TestClient`. * jinja2 - ✔ 🚥 👆 💚 ⚙️ 🔢 📄 📳. * python-multipart - ✔ 🚥 👆 💚 🐕‍🦺 📨 "✍", ⏮️ `request.form()`. * itsdangerous - ✔ `SessionMiddleware` 🐕‍🦺. * pyyaml - ✔ 💃 `SchemaGenerator` 🐕‍🦺 (👆 🎲 🚫 💪 ⚫️ ⏮️ FastAPI). ⚙️ FastAPI / 💃: * uvicorn - 💽 👈 📐 & 🍦 👆 🈸. * orjson - ✔ 🚥 👆 💚 ⚙️ `ORJSONResponse`. * ujson - ✔ 🚥 👆 💚 ⚙️ `UJSONResponse`. 👆 💪 ❎ 🌐 👫 ⏮️ `pip install "fastapi[all]"`. ## 🛂 👉 🏗 ® 🔽 ⚖ 🇩🇪 🛂. fastapi-0.110.3/docs/em/docs/project-generation.md000066400000000000000000000115631461403617600217230ustar00rootroot00000000000000# 🏗 ⚡ - 📄 👆 💪 ⚙️ 🏗 🚂 🤚 ▶️, ⚫️ 🔌 📚 ▶️ ⚒ 🆙, 💂‍♂, 💽 & 🛠️ 🔗 ⏪ ⌛ 👆. 🏗 🚂 🔜 🕧 ✔️ 📶 🙃 🖥 👈 👆 🔜 ℹ & 🛠️ 👆 👍 💪, ✋️ ⚫️ 💪 👍 ▶️ ☝ 👆 🏗. ## 🌕 📚 FastAPI ✳ 📂: https://github.com/tiangolo/full-stack-fastapi-postgresql ### 🌕 📚 FastAPI ✳ - ⚒ * 🌕 **☁** 🛠️ (☁ 🧢). * ☁ 🐝 📳 🛠️. * **☁ ✍** 🛠️ & 🛠️ 🇧🇿 🛠️. * **🏭 🔜** 🐍 🕸 💽 ⚙️ Uvicorn & 🐁. * 🐍 **FastAPI** 👩‍💻: * **⏩**: 📶 ↕ 🎭, 🔛 🇷🇪 ⏮️ **✳** & **🚶** (👏 💃 & Pydantic). * **🏋️**: 👑 👨‍🎨 🐕‍🦺. 🛠️ 🌐. 🌘 🕰 🛠️. * **⏩**: 🔧 ⏩ ⚙️ & 💡. 🌘 🕰 👂 🩺. * **📏**: 📉 📟 ❎. 💗 ⚒ ⚪️➡️ 🔠 🔢 📄. * **🏋️**: 🤚 🏭-🔜 📟. ⏮️ 🏧 🎓 🧾. * **🐩-⚓️**: ⚓️ 🔛 (& 🍕 🔗 ⏮️) 📂 🐩 🔗: 🗄 & 🎻 🔗. * **📚 🎏 ⚒** 🔌 🏧 🔬, 🛠️, 🎓 🧾, 🤝 ⏮️ Oauth2️⃣ 🥙 🤝, ♒️. * **🔐 🔐** 🔁 🔢. * **🥙 🤝** 🤝. * **🇸🇲** 🏷 (🔬 🏺 ↔, 👫 💪 ⚙️ ⏮️ 🥒 👨‍🏭 🔗). * 🔰 ▶️ 🏷 👩‍💻 (🔀 & ❎ 👆 💪). * **⚗** 🛠️. * **⚜** (✖️ 🇨🇳 ℹ 🤝). * **🥒** 👨‍🏭 👈 💪 🗄 & ⚙️ 🏷 & 📟 ⚪️➡️ 🎂 👩‍💻 🍕. * 🎂 👩‍💻 💯 ⚓️ 🔛 **✳**, 🛠️ ⏮️ ☁, 👆 💪 💯 🌕 🛠️ 🔗, 🔬 🔛 💽. ⚫️ 🏃 ☁, ⚫️ 💪 🏗 🆕 💽 🏪 ⚪️➡️ 🖌 🔠 🕰 (👆 💪 ⚙️ ✳, ✳, ✳, ⚖️ ⚫️❔ 👆 💚, & 💯 👈 🛠️ 👷). * ⏩ 🐍 🛠️ ⏮️ **📂 💾** 🛰 ⚖️-☁ 🛠️ ⏮️ ↔ 💖 ⚛ ⚗ ⚖️ 🎙 🎙 📟 📂. * **🎦** 🕸: * 🏗 ⏮️ 🎦 ✳. * **🥙 🤝** 🚚. * 💳 🎑. * ⏮️ 💳, 👑 🕹 🎑. * 👑 🕹 ⏮️ 👩‍💻 🏗 & 📕. * 👤 👩‍💻 📕. * **🇷🇪**. * **🎦-📻**. * **Vuetify** 🌹 🧽 🔧 🦲. * **📕**. * ☁ 💽 ⚓️ 🔛 **👌** (📶 🤾 🎆 ⏮️ 🎦-📻). * ☁ 👁-▶️ 🏗, 👆 🚫 💪 🖊 ⚖️ 💕 ✍ 📟. * 🕸 💯 🏃 🏗 🕰 (💪 🔕 💁‍♂️). * ⚒ 🔧 💪, ⚫️ 👷 👅 📦, ✋️ 👆 💪 🏤-🏗 ⏮️ 🎦 ✳ ⚖️ ✍ ⚫️ 👆 💪, & 🏤-⚙️ ⚫️❔ 👆 💚. * ** *️⃣ ** ✳ 💽, 👆 💪 🔀 ⚫️ ⚙️ 📁 & ✳ 💪. * **🥀** 🥒 👨‍🏭 ⚖. * 📐 ⚖ 🖖 🕸 & 👩‍💻 ⏮️ **Traefik**, 👆 💪 ✔️ 👯‍♂️ 🔽 🎏 🆔, 👽 ➡, ✋️ 🍦 🎏 📦. * Traefik 🛠️, ✅ ➡️ 🗜 **🇺🇸🔍** 📄 🏧 ⚡. * ✳ **🆑** (🔁 🛠️), 🔌 🕸 & 👩‍💻 🔬. ## 🌕 📚 FastAPI 🗄 📂: https://github.com/tiangolo/full-stack-fastapi-couchbase 👶 👶 **⚠** 👶 👶 🚥 👆 ▶️ 🆕 🏗 ⚪️➡️ 🖌, ✅ 🎛 📥. 🖼, 🏗 🚂 🌕 📚 FastAPI ✳ 💪 👍 🎛, ⚫️ 🎯 🚧 & ⚙️. & ⚫️ 🔌 🌐 🆕 ⚒ & 📈. 👆 🆓 ⚙️ 🗄-⚓️ 🚂 🚥 👆 💚, ⚫️ 🔜 🎲 👷 👌, & 🚥 👆 ⏪ ✔️ 🏗 🏗 ⏮️ ⚫️ 👈 👌 👍 (& 👆 🎲 ⏪ ℹ ⚫️ ♣ 👆 💪). 👆 💪 ✍ 🌅 🔃 ⚫️ 🩺 🏦. ## 🌕 📚 FastAPI ✳ ...💪 👟 ⏪, ⚓️ 🔛 👇 🕰 🚚 & 🎏 ⚖. 👶 👶 ## 🎰 🏫 🏷 ⏮️ 🌈 & FastAPI 📂: https://github.com/microsoft/cookiecutter-spacy-fastapi ### 🎰 🏫 🏷 ⏮️ 🌈 & FastAPI - ⚒ * **🌈** 🕜 🏷 🛠️. * **☁ 🧠 🔎** 📨 📁 🏗. * **🏭 🔜** 🐍 🕸 💽 ⚙️ Uvicorn & 🐁. * **☁ 👩‍💻** Kubernetes (🦲) 🆑/💿 🛠️ 🏗. * **🤸‍♂** 💪 ⚒ 1️⃣ 🌈 🏗 🇪🇸 ⏮️ 🏗 🖥. * **💪 🏧** 🎏 🏷 🛠️ (Pytorch, 🇸🇲), 🚫 🌈. fastapi-0.110.3/docs/em/docs/python-types.md000066400000000000000000000331711461403617600206060ustar00rootroot00000000000000# 🐍 🆎 🎶 🐍 ✔️ 🐕‍🦺 📦 "🆎 🔑". 👫 **"🆎 🔑"** 🎁 ❕ 👈 ✔ 📣 🆎 🔢. 📣 🆎 👆 🔢, 👨‍🎨 & 🧰 💪 🤝 👆 👍 🐕‍🦺. 👉 **⏩ 🔰 / ↗️** 🔃 🐍 🆎 🔑. ⚫️ 📔 🕴 💯 💪 ⚙️ 👫 ⏮️ **FastAPI**... ❔ 🤙 📶 🐥. **FastAPI** 🌐 ⚓️ 🔛 👫 🆎 🔑, 👫 🤝 ⚫️ 📚 📈 & 💰. ✋️ 🚥 👆 🙅 ⚙️ **FastAPI**, 👆 🔜 💰 ⚪️➡️ 🏫 🍖 🔃 👫. !!! note 🚥 👆 🐍 🕴, & 👆 ⏪ 💭 🌐 🔃 🆎 🔑, 🚶 ⏭ 📃. ## 🎯 ➡️ ▶️ ⏮️ 🙅 🖼: ```Python {!../../../docs_src/python_types/tutorial001.py!} ``` 🤙 👉 📋 🔢: ``` John Doe ``` 🔢 🔨 📄: * ✊ `first_name` & `last_name`. * 🗜 🥇 🔤 🔠 1️⃣ ↖ 💼 ⏮️ `title()`. * 🔢 👫 ⏮️ 🚀 🖕. ```Python hl_lines="2" {!../../../docs_src/python_types/tutorial001.py!} ``` ### ✍ ⚫️ ⚫️ 📶 🙅 📋. ✋️ 🔜 🌈 👈 👆 ✍ ⚫️ ⚪️➡️ 🖌. ☝ 👆 🔜 ✔️ ▶️ 🔑 🔢, 👆 ✔️ 🔢 🔜... ✋️ ⤴️ 👆 ✔️ 🤙 "👈 👩‍🔬 👈 🗜 🥇 🔤 ↖ 💼". ⚫️ `upper`❓ ⚫️ `uppercase`❓ `first_uppercase`❓ `capitalize`❓ ⤴️, 👆 🔄 ⏮️ 🗝 👩‍💻 👨‍👧‍👦, 👨‍🎨 ✍. 👆 🆎 🥇 🔢 🔢, `first_name`, ⤴️ ❣ (`.`) & ⤴️ 🎯 `Ctrl+Space` ⏲ 🛠️. ✋️, 😞, 👆 🤚 🕳 ⚠: ### 🚮 🆎 ➡️ 🔀 👁 ⏸ ⚪️➡️ ⏮️ ⏬. 👥 🔜 🔀 ⚫️❔ 👉 🧬, 🔢 🔢, ⚪️➡️: ```Python first_name, last_name ``` : ```Python first_name: str, last_name: str ``` 👈 ⚫️. 👈 "🆎 🔑": ```Python hl_lines="1" {!../../../docs_src/python_types/tutorial002.py!} ``` 👈 🚫 🎏 📣 🔢 💲 💖 🔜 ⏮️: ```Python first_name="john", last_name="doe" ``` ⚫️ 🎏 👜. 👥 ⚙️ ❤ (`:`), 🚫 🌓 (`=`). & ❎ 🆎 🔑 🛎 🚫 🔀 ⚫️❔ 🔨 ⚪️➡️ ⚫️❔ 🔜 🔨 🍵 👫. ✋️ 🔜, 🌈 👆 🔄 🖕 🏗 👈 🔢, ✋️ ⏮️ 🆎 🔑. 🎏 ☝, 👆 🔄 ⏲ 📋 ⏮️ `Ctrl+Space` & 👆 👀: ⏮️ 👈, 👆 💪 📜, 👀 🎛, ⏭ 👆 🔎 1️⃣ 👈 "💍 🔔": ## 🌅 🎯 ✅ 👉 🔢, ⚫️ ⏪ ✔️ 🆎 🔑: ```Python hl_lines="1" {!../../../docs_src/python_types/tutorial003.py!} ``` ↩️ 👨‍🎨 💭 🆎 🔢, 👆 🚫 🕴 🤚 🛠️, 👆 🤚 ❌ ✅: 🔜 👆 💭 👈 👆 ✔️ 🔧 ⚫️, 🗜 `age` 🎻 ⏮️ `str(age)`: ```Python hl_lines="2" {!../../../docs_src/python_types/tutorial004.py!} ``` ## 📣 🆎 👆 👀 👑 🥉 📣 🆎 🔑. 🔢 🔢. 👉 👑 🥉 👆 🔜 ⚙️ 👫 ⏮️ **FastAPI**. ### 🙅 🆎 👆 💪 📣 🌐 🐩 🐍 🆎, 🚫 🕴 `str`. 👆 💪 ⚙️, 🖼: * `int` * `float` * `bool` * `bytes` ```Python hl_lines="1" {!../../../docs_src/python_types/tutorial005.py!} ``` ### 💊 🆎 ⏮️ 🆎 🔢 📤 📊 📊 👈 💪 🔌 🎏 💲, 💖 `dict`, `list`, `set` & `tuple`. & 🔗 💲 💪 ✔️ 👫 👍 🆎 💁‍♂️. 👉 🆎 👈 ✔️ 🔗 🆎 🤙 "**💊**" 🆎. & ⚫️ 💪 📣 👫, ⏮️ 👫 🔗 🆎. 📣 👈 🆎 & 🔗 🆎, 👆 💪 ⚙️ 🐩 🐍 🕹 `typing`. ⚫️ 🔀 🎯 🐕‍🦺 👫 🆎 🔑. #### 🆕 ⏬ 🐍 ❕ ⚙️ `typing` **🔗** ⏮️ 🌐 ⏬, ⚪️➡️ 🐍 3️⃣.6️⃣ ⏪ 🕐, ✅ 🐍 3️⃣.9️⃣, 🐍 3️⃣.1️⃣0️⃣, ♒️. 🐍 🏧, **🆕 ⏬** 👟 ⏮️ 📉 🐕‍🦺 👉 🆎 ✍ & 📚 💼 👆 🏆 🚫 💪 🗄 & ⚙️ `typing` 🕹 📣 🆎 ✍. 🚥 👆 💪 ⚒ 🌖 ⏮️ ⏬ 🐍 👆 🏗, 👆 🔜 💪 ✊ 📈 👈 ➕ 🦁. 👀 🖼 🔛. #### 📇 🖼, ➡️ 🔬 🔢 `list` `str`. === "🐍 3️⃣.6️⃣ & 🔛" ⚪️➡️ `typing`, 🗄 `List` (⏮️ 🔠 `L`): ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial006.py!} ``` 📣 🔢, ⏮️ 🎏 ❤ (`:`) ❕. 🆎, 🚮 `List` 👈 👆 🗄 ⚪️➡️ `typing`. 📇 🆎 👈 🔌 🔗 🆎, 👆 🚮 👫 ⬜ 🗜: ```Python hl_lines="4" {!> ../../../docs_src/python_types/tutorial006.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" 📣 🔢, ⏮️ 🎏 ❤ (`:`) ❕. 🆎, 🚮 `list`. 📇 🆎 👈 🔌 🔗 🆎, 👆 🚮 👫 ⬜ 🗜: ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial006_py39.py!} ``` !!! info 👈 🔗 🆎 ⬜ 🗜 🤙 "🆎 🔢". 👉 💼, `str` 🆎 🔢 🚶‍♀️ `List` (⚖️ `list` 🐍 3️⃣.9️⃣ & 🔛). 👈 ⛓: "🔢 `items` `list`, & 🔠 🏬 👉 📇 `str`". !!! tip 🚥 👆 ⚙️ 🐍 3️⃣.9️⃣ ⚖️ 🔛, 👆 🚫 ✔️ 🗄 `List` ⚪️➡️ `typing`, 👆 💪 ⚙️ 🎏 🥔 `list` 🆎 ↩️. 🔨 👈, 👆 👨‍🎨 💪 🚚 🐕‍🦺 ⏪ 🏭 🏬 ⚪️➡️ 📇: 🍵 🆎, 👈 🌖 💪 🏆. 👀 👈 🔢 `item` 1️⃣ 🔣 📇 `items`. & , 👨‍🎨 💭 ⚫️ `str`, & 🚚 🐕‍🦺 👈. #### 🔢 & ⚒ 👆 🔜 🎏 📣 `tuple`Ⓜ & `set`Ⓜ: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial007.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial007_py39.py!} ``` 👉 ⛓: * 🔢 `items_t` `tuple` ⏮️ 3️⃣ 🏬, `int`, ➕1️⃣ `int`, & `str`. * 🔢 `items_s` `set`, & 🔠 🚮 🏬 🆎 `bytes`. #### #️⃣ 🔬 `dict`, 👆 🚶‍♀️ 2️⃣ 🆎 🔢, 🎏 ❕. 🥇 🆎 🔢 🔑 `dict`. 🥈 🆎 🔢 💲 `dict`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial008.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial008_py39.py!} ``` 👉 ⛓: * 🔢 `prices` `dict`: * 🔑 👉 `dict` 🆎 `str` (➡️ 💬, 📛 🔠 🏬). * 💲 👉 `dict` 🆎 `float` (➡️ 💬, 🔖 🔠 🏬). #### 🇪🇺 👆 💪 📣 👈 🔢 💪 🙆 **📚 🆎**, 🖼, `int` ⚖️ `str`. 🐍 3️⃣.6️⃣ & 🔛 (✅ 🐍 3️⃣.1️⃣0️⃣) 👆 💪 ⚙️ `Union` 🆎 ⚪️➡️ `typing` & 🚮 🔘 ⬜ 🗜 💪 🆎 🚫. 🐍 3️⃣.1️⃣0️⃣ 📤 **🎛 ❕** 🌐❔ 👆 💪 🚮 💪 🆎 👽 ⏸ ⏸ (`|`). === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial008b.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial008b_py310.py!} ``` 👯‍♂️ 💼 👉 ⛓ 👈 `item` 💪 `int` ⚖️ `str`. #### 🎲 `None` 👆 💪 📣 👈 💲 💪 ✔️ 🆎, 💖 `str`, ✋️ 👈 ⚫️ 💪 `None`. 🐍 3️⃣.6️⃣ & 🔛 (✅ 🐍 3️⃣.1️⃣0️⃣) 👆 💪 📣 ⚫️ 🏭 & ⚙️ `Optional` ⚪️➡️ `typing` 🕹. ```Python hl_lines="1 4" {!../../../docs_src/python_types/tutorial009.py!} ``` ⚙️ `Optional[str]` ↩️ `str` 🔜 ➡️ 👨‍🎨 ℹ 👆 🔍 ❌ 🌐❔ 👆 💪 🤔 👈 💲 🕧 `str`, 🕐❔ ⚫️ 💪 🤙 `None` 💁‍♂️. `Optional[Something]` 🤙 ⌨ `Union[Something, None]`, 👫 🌓. 👉 ⛓ 👈 🐍 3️⃣.1️⃣0️⃣, 👆 💪 ⚙️ `Something | None`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial009.py!} ``` === "🐍 3️⃣.6️⃣ & 🔛 - 🎛" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial009b.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial009_py310.py!} ``` #### ⚙️ `Union` ⚖️ `Optional` 🚥 👆 ⚙️ 🐍 ⏬ 🔛 3️⃣.1️⃣0️⃣, 📥 💁‍♂ ⚪️➡️ 👇 📶 **🤔** ☝ 🎑: * 👶 ❎ ⚙️ `Optional[SomeType]` * ↩️ 👶 **⚙️ `Union[SomeType, None]`** 👶. 👯‍♂️ 🌓 & 🔘 👫 🎏, ✋️ 👤 🔜 👍 `Union` ↩️ `Optional` ↩️ 🔤 "**📦**" 🔜 😑 🔑 👈 💲 📦, & ⚫️ 🤙 ⛓ "⚫️ 💪 `None`", 🚥 ⚫️ 🚫 📦 & ✔. 👤 💭 `Union[SomeType, None]` 🌖 🔑 🔃 ⚫️❔ ⚫️ ⛓. ⚫️ 🔃 🔤 & 📛. ✋️ 👈 🔤 💪 📉 ❔ 👆 & 👆 🤽‍♂ 💭 🔃 📟. 🖼, ➡️ ✊ 👉 🔢: ```Python hl_lines="1 4" {!../../../docs_src/python_types/tutorial009c.py!} ``` 🔢 `name` 🔬 `Optional[str]`, ✋️ ⚫️ **🚫 📦**, 👆 🚫🔜 🤙 🔢 🍵 🔢: ```Python say_hi() # Oh, no, this throws an error! 😱 ``` `name` 🔢 **✔** (🚫 *📦*) ↩️ ⚫️ 🚫 ✔️ 🔢 💲. , `name` 🚫 `None` 💲: ```Python say_hi(name=None) # This works, None is valid 🎉 ``` 👍 📰, 🕐 👆 🔛 🐍 3️⃣.1️⃣0️⃣ 👆 🏆 🚫 ✔️ 😟 🔃 👈, 👆 🔜 💪 🎯 ⚙️ `|` 🔬 🇪🇺 🆎: ```Python hl_lines="1 4" {!../../../docs_src/python_types/tutorial009c_py310.py!} ``` & ⤴️ 👆 🏆 🚫 ✔️ 😟 🔃 📛 💖 `Optional` & `Union`. 👶 #### 💊 🆎 👉 🆎 👈 ✊ 🆎 🔢 ⬜ 🗜 🤙 **💊 🆎** ⚖️ **💊**, 🖼: === "🐍 3️⃣.6️⃣ & 🔛" * `List` * `Tuple` * `Set` * `Dict` * `Union` * `Optional` * ...& 🎏. === "🐍 3️⃣.9️⃣ & 🔛" 👆 💪 ⚙️ 🎏 💽 🆎 💊 (⏮️ ⬜ 🗜 & 🆎 🔘): * `list` * `tuple` * `set` * `dict` & 🎏 ⏮️ 🐍 3️⃣.6️⃣, ⚪️➡️ `typing` 🕹: * `Union` * `Optional` * ...& 🎏. === "🐍 3️⃣.1️⃣0️⃣ & 🔛" 👆 💪 ⚙️ 🎏 💽 🆎 💊 (⏮️ ⬜ 🗜 & 🆎 🔘): * `list` * `tuple` * `set` * `dict` & 🎏 ⏮️ 🐍 3️⃣.6️⃣, ⚪️➡️ `typing` 🕹: * `Union` * `Optional` (🎏 ⏮️ 🐍 3️⃣.6️⃣) * ...& 🎏. 🐍 3️⃣.1️⃣0️⃣, 🎛 ⚙️ 💊 `Union` & `Optional`, 👆 💪 ⚙️ ⏸ ⏸ (`|`) 📣 🇪🇺 🆎. ### 🎓 🆎 👆 💪 📣 🎓 🆎 🔢. ➡️ 💬 👆 ✔️ 🎓 `Person`, ⏮️ 📛: ```Python hl_lines="1-3" {!../../../docs_src/python_types/tutorial010.py!} ``` ⤴️ 👆 💪 📣 🔢 🆎 `Person`: ```Python hl_lines="6" {!../../../docs_src/python_types/tutorial010.py!} ``` & ⤴️, 🔄, 👆 🤚 🌐 👨‍🎨 🐕‍🦺: ## Pydantic 🏷 Pydantic 🐍 🗃 🎭 📊 🔬. 👆 📣 "💠" 💽 🎓 ⏮️ 🔢. & 🔠 🔢 ✔️ 🆎. ⤴️ 👆 ✍ 👐 👈 🎓 ⏮️ 💲 & ⚫️ 🔜 ✔ 💲, 🗜 👫 ☑ 🆎 (🚥 👈 💼) & 🤝 👆 🎚 ⏮️ 🌐 💽. & 👆 🤚 🌐 👨‍🎨 🐕‍🦺 ⏮️ 👈 📉 🎚. 🖼 ⚪️➡️ 🛂 Pydantic 🩺: === "🐍 3️⃣.6️⃣ & 🔛" ```Python {!> ../../../docs_src/python_types/tutorial011.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python {!> ../../../docs_src/python_types/tutorial011_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python {!> ../../../docs_src/python_types/tutorial011_py310.py!} ``` !!! info 💡 🌖 🔃 Pydantic, ✅ 🚮 🩺. **FastAPI** 🌐 ⚓️ 🔛 Pydantic. 👆 🔜 👀 📚 🌅 🌐 👉 💡 [🔰 - 👩‍💻 🦮](tutorial/index.md){.internal-link target=_blank}. !!! tip Pydantic ✔️ 🎁 🎭 🕐❔ 👆 ⚙️ `Optional` ⚖️ `Union[Something, None]` 🍵 🔢 💲, 👆 💪 ✍ 🌅 🔃 ⚫️ Pydantic 🩺 🔃 ✔ 📦 🏑. ## 🆎 🔑 **FastAPI** **FastAPI** ✊ 📈 👫 🆎 🔑 📚 👜. ⏮️ **FastAPI** 👆 📣 🔢 ⏮️ 🆎 🔑 & 👆 🤚: * **👨‍🎨 🐕‍🦺**. * **🆎 ✅**. ...and **FastAPI** uses the same declarations : * **🔬 📄**: ⚪️➡️ 📨 ➡ 🔢, 🔢 🔢, 🎚, 💪, 🔗, ♒️. * **🗜 💽**: ⚪️➡️ 📨 🚚 🆎. * **✔ 💽**: 👟 ⚪️➡️ 🔠 📨: * 🏭 **🏧 ❌** 📨 👩‍💻 🕐❔ 📊 ❌. * **📄** 🛠️ ⚙️ 🗄: * ❔ ⤴️ ⚙️ 🏧 🎓 🧾 👩‍💻 🔢. 👉 5️⃣📆 🌐 🔊 📝. 🚫 😟. 👆 🔜 👀 🌐 👉 🎯 [🔰 - 👩‍💻 🦮](tutorial/index.md){.internal-link target=_blank}. ⚠ 👜 👈 ⚙️ 🐩 🐍 🆎, 👁 🥉 (↩️ ❎ 🌖 🎓, 👨‍🎨, ♒️), **FastAPI** 🔜 📚 👷 👆. !!! info 🚥 👆 ⏪ 🚶 🔘 🌐 🔰 & 👟 🔙 👀 🌅 🔃 🆎, 👍 ℹ "🎮 🎼" ⚪️➡️ `mypy`. fastapi-0.110.3/docs/em/docs/tutorial/000077500000000000000000000000001461403617600174375ustar00rootroot00000000000000fastapi-0.110.3/docs/em/docs/tutorial/background-tasks.md000066400000000000000000000101401461403617600232170ustar00rootroot00000000000000# 🖥 📋 👆 💪 🔬 🖥 📋 🏃 *⏮️* 🛬 📨. 👉 ⚠ 🛠️ 👈 💪 🔨 ⏮️ 📨, ✋️ 👈 👩‍💻 🚫 🤙 ✔️ ⌛ 🛠️ 🏁 ⏭ 📨 📨. 👉 🔌, 🖼: * 📧 📨 📨 ⏮️ 🎭 🎯: * 🔗 📧 💽 & 📨 📧 😑 "🐌" (📚 🥈), 👆 💪 📨 📨 ▶️️ ↖️ & 📨 📧 📨 🖥. * 🏭 💽: * 🖼, ➡️ 💬 👆 📨 📁 👈 🔜 🚶 🔘 🐌 🛠️, 👆 💪 📨 📨 "🚫" (🇺🇸🔍 2️⃣0️⃣2️⃣) & 🛠️ ⚫️ 🖥. ## ⚙️ `BackgroundTasks` 🥇, 🗄 `BackgroundTasks` & 🔬 🔢 👆 *➡ 🛠️ 🔢* ⏮️ 🆎 📄 `BackgroundTasks`: ```Python hl_lines="1 13" {!../../../docs_src/background_tasks/tutorial001.py!} ``` **FastAPI** 🔜 ✍ 🎚 🆎 `BackgroundTasks` 👆 & 🚶‍♀️ ⚫️ 👈 🔢. ## ✍ 📋 🔢 ✍ 🔢 🏃 🖥 📋. ⚫️ 🐩 🔢 👈 💪 📨 🔢. ⚫️ 💪 `async def` ⚖️ 😐 `def` 🔢, **FastAPI** 🔜 💭 ❔ 🍵 ⚫️ ☑. 👉 💼, 📋 🔢 🔜 ✍ 📁 (⚖ 📨 📧). & ✍ 🛠️ 🚫 ⚙️ `async` & `await`, 👥 🔬 🔢 ⏮️ 😐 `def`: ```Python hl_lines="6-9" {!../../../docs_src/background_tasks/tutorial001.py!} ``` ## 🚮 🖥 📋 🔘 👆 *➡ 🛠️ 🔢*, 🚶‍♀️ 👆 📋 🔢 *🖥 📋* 🎚 ⏮️ 👩‍🔬 `.add_task()`: ```Python hl_lines="14" {!../../../docs_src/background_tasks/tutorial001.py!} ``` `.add_task()` 📨 ❌: * 📋 🔢 🏃 🖥 (`write_notification`). * 🙆 🔁 ❌ 👈 🔜 🚶‍♀️ 📋 🔢 ✔ (`email`). * 🙆 🇨🇻 ❌ 👈 🔜 🚶‍♀️ 📋 🔢 (`message="some notification"`). ## 🔗 💉 ⚙️ `BackgroundTasks` 👷 ⏮️ 🔗 💉 ⚙️, 👆 💪 📣 🔢 🆎 `BackgroundTasks` 💗 🎚: *➡ 🛠️ 🔢*, 🔗 (☑), 🎧-🔗, ♒️. **FastAPI** 💭 ⚫️❔ 🔠 💼 & ❔ 🏤-⚙️ 🎏 🎚, 👈 🌐 🖥 📋 🔗 👯‍♂️ & 🏃 🖥 ⏮️: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="13 15 22 25" {!> ../../../docs_src/background_tasks/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="11 13 20 23" {!> ../../../docs_src/background_tasks/tutorial002_py310.py!} ``` 👉 🖼, 📧 🔜 ✍ `log.txt` 📁 *⏮️* 📨 📨. 🚥 📤 🔢 📨, ⚫️ 🔜 ✍ 🕹 🖥 📋. & ⤴️ ➕1️⃣ 🖥 📋 🏗 *➡ 🛠️ 🔢* 🔜 ✍ 📧 ⚙️ `email` ➡ 🔢. ## 📡 ℹ 🎓 `BackgroundTasks` 👟 🔗 ⚪️➡️ `starlette.background`. ⚫️ 🗄/🔌 🔗 🔘 FastAPI 👈 👆 💪 🗄 ⚫️ ⚪️➡️ `fastapi` & ❎ 😫 🗄 🎛 `BackgroundTask` (🍵 `s` 🔚) ⚪️➡️ `starlette.background`. 🕴 ⚙️ `BackgroundTasks` (& 🚫 `BackgroundTask`), ⚫️ ⤴️ 💪 ⚙️ ⚫️ *➡ 🛠️ 🔢* 🔢 & ✔️ **FastAPI** 🍵 🎂 👆, 💖 🕐❔ ⚙️ `Request` 🎚 🔗. ⚫️ 💪 ⚙️ `BackgroundTask` 😞 FastAPI, ✋️ 👆 ✔️ ✍ 🎚 👆 📟 & 📨 💃 `Response` 🔌 ⚫️. 👆 💪 👀 🌖 ℹ 💃 🛂 🩺 🖥 📋. ## ⚠ 🚥 👆 💪 🎭 🏋️ 🖥 📊 & 👆 🚫 🎯 💪 ⚫️ 🏃 🎏 🛠️ (🖼, 👆 🚫 💪 💰 💾, 🔢, ♒️), 👆 💪 💰 ⚪️➡️ ⚙️ 🎏 🦏 🧰 💖 🥒. 👫 😑 🚚 🌖 🏗 📳, 📧/👨‍🏭 📤 👨‍💼, 💖 ✳ ⚖️ ✳, ✋️ 👫 ✔ 👆 🏃 🖥 📋 💗 🛠️, & ✴️, 💗 💽. 👀 🖼, ✅ [🏗 🚂](../project-generation.md){.internal-link target=_blank}, 👫 🌐 🔌 🥒 ⏪ 📶. ✋️ 🚥 👆 💪 🔐 🔢 & 🎚 ⚪️➡️ 🎏 **FastAPI** 📱, ⚖️ 👆 💪 🎭 🤪 🖥 📋 (💖 📨 📧 📨), 👆 💪 🎯 ⚙️ `BackgroundTasks`. ## 🌃 🗄 & ⚙️ `BackgroundTasks` ⏮️ 🔢 *➡ 🛠️ 🔢* & 🔗 🚮 🖥 📋. fastapi-0.110.3/docs/em/docs/tutorial/bigger-applications.md000066400000000000000000000371771461403617600237230ustar00rootroot00000000000000# 🦏 🈸 - 💗 📁 🚥 👆 🏗 🈸 ⚖️ 🕸 🛠️, ⚫️ 🛎 💼 👈 👆 💪 🚮 🌐 🔛 👁 📁. **FastAPI** 🚚 🏪 🧰 📊 👆 🈸 ⏪ 🚧 🌐 💪. !!! info 🚥 👆 👟 ⚪️➡️ 🏺, 👉 🔜 🌓 🏺 📗. ## 🖼 📁 📊 ➡️ 💬 👆 ✔️ 📁 📊 💖 👉: ``` . ├── app │   ├── __init__.py │   ├── main.py │   ├── dependencies.py │   └── routers │   │ ├── __init__.py │   │ ├── items.py │   │ └── users.py │   └── internal │   ├── __init__.py │   └── admin.py ``` !!! tip 📤 📚 `__init__.py` 📁: 1️⃣ 🔠 📁 ⚖️ 📁. 👉 ⚫️❔ ✔ 🏭 📟 ⚪️➡️ 1️⃣ 📁 🔘 ➕1️⃣. 🖼, `app/main.py` 👆 💪 ✔️ ⏸ 💖: ``` from app.routers import items ``` * `app` 📁 🔌 🌐. & ⚫️ ✔️ 🛁 📁 `app/__init__.py`, ⚫️ "🐍 📦" (🗃 "🐍 🕹"): `app`. * ⚫️ 🔌 `app/main.py` 📁. ⚫️ 🔘 🐍 📦 (📁 ⏮️ 📁 `__init__.py`), ⚫️ "🕹" 👈 📦: `app.main`. * 📤 `app/dependencies.py` 📁, 💖 `app/main.py`, ⚫️ "🕹": `app.dependencies`. * 📤 📁 `app/routers/` ⏮️ ➕1️⃣ 📁 `__init__.py`, ⚫️ "🐍 📦": `app.routers`. * 📁 `app/routers/items.py` 🔘 📦, `app/routers/`,, ⚫️ 🔁: `app.routers.items`. * 🎏 ⏮️ `app/routers/users.py`, ⚫️ ➕1️⃣ 🔁: `app.routers.users`. * 📤 📁 `app/internal/` ⏮️ ➕1️⃣ 📁 `__init__.py`, ⚫️ ➕1️⃣ "🐍 📦": `app.internal`. * & 📁 `app/internal/admin.py` ➕1️⃣ 🔁: `app.internal.admin`. 🎏 📁 📊 ⏮️ 🏤: ``` . ├── app # "app" is a Python package │   ├── __init__.py # this file makes "app" a "Python package" │   ├── main.py # "main" module, e.g. import app.main │   ├── dependencies.py # "dependencies" module, e.g. import app.dependencies │   └── routers # "routers" is a "Python subpackage" │   │ ├── __init__.py # makes "routers" a "Python subpackage" │   │ ├── items.py # "items" submodule, e.g. import app.routers.items │   │ └── users.py # "users" submodule, e.g. import app.routers.users │   └── internal # "internal" is a "Python subpackage" │   ├── __init__.py # makes "internal" a "Python subpackage" │   └── admin.py # "admin" submodule, e.g. import app.internal.admin ``` ## `APIRouter` ➡️ 💬 📁 💡 🚚 👩‍💻 🔁 `/app/routers/users.py`. 👆 💚 ✔️ *➡ 🛠️* 🔗 👆 👩‍💻 👽 ⚪️➡️ 🎂 📟, 🚧 ⚫️ 🏗. ✋️ ⚫️ 🍕 🎏 **FastAPI** 🈸/🕸 🛠️ (⚫️ 🍕 🎏 "🐍 📦"). 👆 💪 ✍ *➡ 🛠️* 👈 🕹 ⚙️ `APIRouter`. ### 🗄 `APIRouter` 👆 🗄 ⚫️ & ✍ "👐" 🎏 🌌 👆 🔜 ⏮️ 🎓 `FastAPI`: ```Python hl_lines="1 3" title="app/routers/users.py" {!../../../docs_src/bigger_applications/app/routers/users.py!} ``` ### *➡ 🛠️* ⏮️ `APIRouter` & ⤴️ 👆 ⚙️ ⚫️ 📣 👆 *➡ 🛠️*. ⚙️ ⚫️ 🎏 🌌 👆 🔜 ⚙️ `FastAPI` 🎓: ```Python hl_lines="6 11 16" title="app/routers/users.py" {!../../../docs_src/bigger_applications/app/routers/users.py!} ``` 👆 💪 💭 `APIRouter` "🐩 `FastAPI`" 🎓. 🌐 🎏 🎛 🐕‍🦺. 🌐 🎏 `parameters`, `responses`, `dependencies`, `tags`, ♒️. !!! tip 👉 🖼, 🔢 🤙 `router`, ✋️ 👆 💪 📛 ⚫️ 👐 👆 💚. 👥 🔜 🔌 👉 `APIRouter` 👑 `FastAPI` 📱, ✋️ 🥇, ➡️ ✅ 🔗 & ➕1️⃣ `APIRouter`. ## 🔗 👥 👀 👈 👥 🔜 💪 🔗 ⚙️ 📚 🥉 🈸. 👥 🚮 👫 👫 👍 `dependencies` 🕹 (`app/dependencies.py`). 👥 🔜 🔜 ⚙️ 🙅 🔗 ✍ 🛃 `X-Token` 🎚: ```Python hl_lines="1 4-6" title="app/dependencies.py" {!../../../docs_src/bigger_applications/app/dependencies.py!} ``` !!! tip 👥 ⚙️ 💭 🎚 📉 👉 🖼. ✋️ 🎰 💼 👆 🔜 🤚 👍 🏁 ⚙️ 🛠️ [💂‍♂ 🚙](security/index.md){.internal-link target=_blank}. ## ➕1️⃣ 🕹 ⏮️ `APIRouter` ➡️ 💬 👆 ✔️ 🔗 💡 🚚 "🏬" ⚪️➡️ 👆 🈸 🕹 `app/routers/items.py`. 👆 ✔️ *➡ 🛠️* : * `/items/` * `/items/{item_id}` ⚫️ 🌐 🎏 📊 ⏮️ `app/routers/users.py`. ✋️ 👥 💚 🙃 & 📉 📟 🍖. 👥 💭 🌐 *➡ 🛠️* 👉 🕹 ✔️ 🎏: * ➡ `prefix`: `/items`. * `tags`: (1️⃣ 🔖: `items`). * ➕ `responses`. * `dependencies`: 👫 🌐 💪 👈 `X-Token` 🔗 👥 ✍. , ↩️ ❎ 🌐 👈 🔠 *➡ 🛠️*, 👥 💪 🚮 ⚫️ `APIRouter`. ```Python hl_lines="5-10 16 21" title="app/routers/items.py" {!../../../docs_src/bigger_applications/app/routers/items.py!} ``` ➡ 🔠 *➡ 🛠️* ✔️ ▶️ ⏮️ `/`, 💖: ```Python hl_lines="1" @router.get("/{item_id}") async def read_item(item_id: str): ... ``` ...🔡 🔜 🚫 🔌 🏁 `/`. , 🔡 👉 💼 `/items`. 👥 💪 🚮 📇 `tags` & ➕ `responses` 👈 🔜 ✔ 🌐 *➡ 🛠️* 🔌 👉 📻. & 👥 💪 🚮 📇 `dependencies` 👈 🔜 🚮 🌐 *➡ 🛠️* 📻 & 🔜 🛠️/❎ 🔠 📨 ⚒ 👫. !!! tip 🗒 👈, 🌅 💖 [🔗 *➡ 🛠️ 👨‍🎨*](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, 🙅‍♂ 💲 🔜 🚶‍♀️ 👆 *➡ 🛠️ 🔢*. 🔚 🏁 👈 🏬 ➡ 🔜: * `/items/` * `/items/{item_id}` ...👥 🎯. * 👫 🔜 ™ ⏮️ 📇 🔖 👈 🔌 👁 🎻 `"items"`. * 👫 "🔖" ✴️ ⚠ 🏧 🎓 🧾 ⚙️ (⚙️ 🗄). * 🌐 👫 🔜 🔌 🔁 `responses`. * 🌐 👫 *➡ 🛠️* 🔜 ✔️ 📇 `dependencies` 🔬/🛠️ ⏭ 👫. * 🚥 👆 📣 🔗 🎯 *➡ 🛠️*, **👫 🔜 🛠️ 💁‍♂️**. * 📻 🔗 🛠️ 🥇, ⤴️ [`dependencies` 👨‍🎨](dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, & ⤴️ 😐 🔢 🔗. * 👆 💪 🚮 [`Security` 🔗 ⏮️ `scopes`](../advanced/security/oauth2-scopes.md){.internal-link target=_blank}. !!! tip ✔️ `dependencies` `APIRouter` 💪 ⚙️, 🖼, 🚚 🤝 🎂 👪 *➡ 🛠️*. 🚥 🔗 🚫 🚮 📦 🔠 1️⃣ 👫. !!! check `prefix`, `tags`, `responses`, & `dependencies` 🔢 (📚 🎏 💼) ⚒ ⚪️➡️ **FastAPI** ℹ 👆 ❎ 📟 ❎. ### 🗄 🔗 👉 📟 👨‍❤‍👨 🕹 `app.routers.items`, 📁 `app/routers/items.py`. & 👥 💪 🤚 🔗 🔢 ⚪️➡️ 🕹 `app.dependencies`, 📁 `app/dependencies.py`. 👥 ⚙️ ⚖ 🗄 ⏮️ `..` 🔗: ```Python hl_lines="3" title="app/routers/items.py" {!../../../docs_src/bigger_applications/app/routers/items.py!} ``` #### ❔ ⚖ 🗄 👷 !!! tip 🚥 👆 💭 👌 ❔ 🗄 👷, 😣 ⏭ 📄 🔛. 👁 ❣ `.`, 💖: ```Python from .dependencies import get_token_header ``` 🔜 ⛓: * ▶️ 🎏 📦 👈 👉 🕹 (📁 `app/routers/items.py`) 🖖 (📁 `app/routers/`)... * 🔎 🕹 `dependencies` (👽 📁 `app/routers/dependencies.py`)... * & ⚪️➡️ ⚫️, 🗄 🔢 `get_token_header`. ✋️ 👈 📁 🚫 🔀, 👆 🔗 📁 `app/dependencies.py`. 💭 ❔ 👆 📱/📁 📊 👀 💖: --- 2️⃣ ❣ `..`, 💖: ```Python from ..dependencies import get_token_header ``` ⛓: * ▶️ 🎏 📦 👈 👉 🕹 (📁 `app/routers/items.py`) 🖖 (📁 `app/routers/`)... * 🚶 👪 📦 (📁 `app/`)... * & 📤, 🔎 🕹 `dependencies` (📁 `app/dependencies.py`)... * & ⚪️➡️ ⚫️, 🗄 🔢 `get_token_header`. 👈 👷 ☑ ❗ 👶 --- 🎏 🌌, 🚥 👥 ✔️ ⚙️ 3️⃣ ❣ `...`, 💖: ```Python from ...dependencies import get_token_header ``` that 🔜 ⛓: * ▶️ 🎏 📦 👈 👉 🕹 (📁 `app/routers/items.py`) 🖖 (📁 `app/routers/`)... * 🚶 👪 📦 (📁 `app/`)... * ⤴️ 🚶 👪 👈 📦 (📤 🙅‍♂ 👪 📦, `app` 🔝 🎚 👶)... * & 📤, 🔎 🕹 `dependencies` (📁 `app/dependencies.py`)... * & ⚪️➡️ ⚫️, 🗄 🔢 `get_token_header`. 👈 🔜 🔗 📦 🔛 `app/`, ⏮️ 🚮 👍 📁 `__init__.py`, ♒️. ✋️ 👥 🚫 ✔️ 👈. , 👈 🔜 🚮 ❌ 👆 🖼. 👶 ✋️ 🔜 👆 💭 ❔ ⚫️ 👷, 👆 💪 ⚙️ ⚖ 🗄 👆 👍 📱 🙅‍♂ 🤔 ❔ 🏗 👫. 👶 ### 🚮 🛃 `tags`, `responses`, & `dependencies` 👥 🚫 ❎ 🔡 `/items` 🚫 `tags=["items"]` 🔠 *➡ 🛠️* ↩️ 👥 🚮 👫 `APIRouter`. ✋️ 👥 💪 🚮 _🌅_ `tags` 👈 🔜 ✔ 🎯 *➡ 🛠️*, & ➕ `responses` 🎯 👈 *➡ 🛠️*: ```Python hl_lines="30-31" title="app/routers/items.py" {!../../../docs_src/bigger_applications/app/routers/items.py!} ``` !!! tip 👉 🏁 ➡ 🛠️ 🔜 ✔️ 🌀 🔖: `["items", "custom"]`. & ⚫️ 🔜 ✔️ 👯‍♂️ 📨 🧾, 1️⃣ `404` & 1️⃣ `403`. ## 👑 `FastAPI` 🔜, ➡️ 👀 🕹 `app/main.py`. 📥 🌐❔ 👆 🗄 & ⚙️ 🎓 `FastAPI`. 👉 🔜 👑 📁 👆 🈸 👈 👔 🌐 👯‍♂️. & 🏆 👆 ⚛ 🔜 🔜 🖖 🚮 👍 🎯 🕹, 👑 📁 🔜 🙅. ### 🗄 `FastAPI` 👆 🗄 & ✍ `FastAPI` 🎓 🛎. & 👥 💪 📣 [🌐 🔗](dependencies/global-dependencies.md){.internal-link target=_blank} 👈 🔜 🌀 ⏮️ 🔗 🔠 `APIRouter`: ```Python hl_lines="1 3 7" title="app/main.py" {!../../../docs_src/bigger_applications/app/main.py!} ``` ### 🗄 `APIRouter` 🔜 👥 🗄 🎏 🔁 👈 ✔️ `APIRouter`Ⓜ: ```Python hl_lines="5" title="app/main.py" {!../../../docs_src/bigger_applications/app/main.py!} ``` 📁 `app/routers/users.py` & `app/routers/items.py` 🔁 👈 🍕 🎏 🐍 📦 `app`, 👥 💪 ⚙️ 👁 ❣ `.` 🗄 👫 ⚙️ "⚖ 🗄". ### ❔ 🏭 👷 📄: ```Python from .routers import items, users ``` ⛓: * ▶️ 🎏 📦 👈 👉 🕹 (📁 `app/main.py`) 🖖 (📁 `app/`)... * 👀 📦 `routers` (📁 `app/routers/`)... * & ⚪️➡️ ⚫️, 🗄 🔁 `items` (📁 `app/routers/items.py`) & `users` (📁 `app/routers/users.py`)... 🕹 `items` 🔜 ✔️ 🔢 `router` (`items.router`). 👉 🎏 1️⃣ 👥 ✍ 📁 `app/routers/items.py`, ⚫️ `APIRouter` 🎚. & ⤴️ 👥 🎏 🕹 `users`. 👥 💪 🗄 👫 💖: ```Python from app.routers import items, users ``` !!! info 🥇 ⏬ "⚖ 🗄": ```Python from .routers import items, users ``` 🥈 ⏬ "🎆 🗄": ```Python from app.routers import items, users ``` 💡 🌅 🔃 🐍 📦 & 🕹, ✍ 🛂 🐍 🧾 🔃 🕹. ### ❎ 📛 💥 👥 🏭 🔁 `items` 🔗, ↩️ 🏭 🚮 🔢 `router`. 👉 ↩️ 👥 ✔️ ➕1️⃣ 🔢 📛 `router` 🔁 `users`. 🚥 👥 ✔️ 🗄 1️⃣ ⏮️ 🎏, 💖: ```Python from .routers.items import router from .routers.users import router ``` `router` ⚪️➡️ `users` 🔜 📁 1️⃣ ⚪️➡️ `items` & 👥 🚫🔜 💪 ⚙️ 👫 🎏 🕰. , 💪 ⚙️ 👯‍♂️ 👫 🎏 📁, 👥 🗄 🔁 🔗: ```Python hl_lines="5" title="app/main.py" {!../../../docs_src/bigger_applications/app/main.py!} ``` ### 🔌 `APIRouter`Ⓜ `users` & `items` 🔜, ➡️ 🔌 `router`Ⓜ ⚪️➡️ 🔁 `users` & `items`: ```Python hl_lines="10-11" title="app/main.py" {!../../../docs_src/bigger_applications/app/main.py!} ``` !!! info `users.router` 🔌 `APIRouter` 🔘 📁 `app/routers/users.py`. & `items.router` 🔌 `APIRouter` 🔘 📁 `app/routers/items.py`. ⏮️ `app.include_router()` 👥 💪 🚮 🔠 `APIRouter` 👑 `FastAPI` 🈸. ⚫️ 🔜 🔌 🌐 🛣 ⚪️➡️ 👈 📻 🍕 ⚫️. !!! note "📡 ℹ" ⚫️ 🔜 🤙 🔘 ✍ *➡ 🛠️* 🔠 *➡ 🛠️* 👈 📣 `APIRouter`. , ⛅ 🎑, ⚫️ 🔜 🤙 👷 🚥 🌐 🎏 👁 📱. !!! check 👆 🚫 ✔️ 😟 🔃 🎭 🕐❔ ✅ 📻. 👉 🔜 ✊ ⏲ & 🔜 🕴 🔨 🕴. ⚫️ 🏆 🚫 📉 🎭. 👶 ### 🔌 `APIRouter` ⏮️ 🛃 `prefix`, `tags`, `responses`, & `dependencies` 🔜, ➡️ 🌈 👆 🏢 🤝 👆 `app/internal/admin.py` 📁. ⚫️ 🔌 `APIRouter` ⏮️ 📡 *➡ 🛠️* 👈 👆 🏢 💰 🖖 📚 🏗. 👉 🖼 ⚫️ 🔜 💎 🙅. ✋️ ➡️ 💬 👈 ↩️ ⚫️ 💰 ⏮️ 🎏 🏗 🏢, 👥 🚫🔜 🔀 ⚫️ & 🚮 `prefix`, `dependencies`, `tags`, ♒️. 🔗 `APIRouter`: ```Python hl_lines="3" title="app/internal/admin.py" {!../../../docs_src/bigger_applications/app/internal/admin.py!} ``` ✋️ 👥 💚 ⚒ 🛃 `prefix` 🕐❔ ✅ `APIRouter` 👈 🌐 🚮 *➡ 🛠️* ▶️ ⏮️ `/admin`, 👥 💚 🔐 ⚫️ ⏮️ `dependencies` 👥 ⏪ ✔️ 👉 🏗, & 👥 💚 🔌 `tags` & `responses`. 👥 💪 📣 🌐 👈 🍵 ✔️ 🔀 ⏮️ `APIRouter` 🚶‍♀️ 👈 🔢 `app.include_router()`: ```Python hl_lines="14-17" title="app/main.py" {!../../../docs_src/bigger_applications/app/main.py!} ``` 👈 🌌, ⏮️ `APIRouter` 🔜 🚧 ⚗, 👥 💪 💰 👈 🎏 `app/internal/admin.py` 📁 ⏮️ 🎏 🏗 🏢. 🏁 👈 👆 📱, 🔠 *➡ 🛠️* ⚪️➡️ `admin` 🕹 🔜 ✔️: * 🔡 `/admin`. * 🔖 `admin`. * 🔗 `get_token_header`. * 📨 `418`. 👶 ✋️ 👈 🔜 🕴 📉 👈 `APIRouter` 👆 📱, 🚫 🙆 🎏 📟 👈 ⚙️ ⚫️. , 🖼, 🎏 🏗 💪 ⚙️ 🎏 `APIRouter` ⏮️ 🎏 🤝 👩‍🔬. ### 🔌 *➡ 🛠️* 👥 💪 🚮 *➡ 🛠️* 🔗 `FastAPI` 📱. 📥 👥 ⚫️... 🎦 👈 👥 💪 🤷: ```Python hl_lines="21-23" title="app/main.py" {!../../../docs_src/bigger_applications/app/main.py!} ``` & ⚫️ 🔜 👷 ☑, 👯‍♂️ ⏮️ 🌐 🎏 *➡ 🛠️* 🚮 ⏮️ `app.include_router()`. !!! info "📶 📡 ℹ" **🗒**: 👉 📶 📡 ℹ 👈 👆 🎲 💪 **🚶**. --- `APIRouter`Ⓜ 🚫 "🗻", 👫 🚫 👽 ⚪️➡️ 🎂 🈸. 👉 ↩️ 👥 💚 🔌 👫 *➡ 🛠️* 🗄 🔗 & 👩‍💻 🔢. 👥 🚫🔜 ❎ 👫 & "🗻" 👫 ➡ 🎂, *➡ 🛠️* "🖖" (🏤-✍), 🚫 🔌 🔗. ## ✅ 🏧 🛠️ 🩺 🔜, 🏃 `uvicorn`, ⚙️ 🕹 `app.main` & 🔢 `app`:
```console $ uvicorn app.main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
& 📂 🩺 http://127.0.0.1:8000/docs. 👆 🔜 👀 🏧 🛠️ 🩺, ✅ ➡ ⚪️➡️ 🌐 🔁, ⚙️ ☑ ➡ (& 🔡) & ☑ 🔖: ## 🔌 🎏 📻 💗 🕰 ⏮️ 🎏 `prefix` 👆 💪 ⚙️ `.include_router()` 💗 🕰 ⏮️ *🎏* 📻 ⚙️ 🎏 🔡. 👉 💪 ⚠, 🖼, 🎦 🎏 🛠️ 🔽 🎏 🔡, ✅ `/api/v1` & `/api/latest`. 👉 🏧 ⚙️ 👈 👆 5️⃣📆 🚫 🤙 💪, ✋️ ⚫️ 📤 💼 👆. ## 🔌 `APIRouter` ➕1️⃣ 🎏 🌌 👆 💪 🔌 `APIRouter` `FastAPI` 🈸, 👆 💪 🔌 `APIRouter` ➕1️⃣ `APIRouter` ⚙️: ```Python router.include_router(other_router) ``` ⚒ 💭 👆 ⚫️ ⏭ 🔌 `router` `FastAPI` 📱, 👈 *➡ 🛠️* ⚪️➡️ `other_router` 🔌. fastapi-0.110.3/docs/em/docs/tutorial/body-fields.md000066400000000000000000000043521461403617600221660ustar00rootroot00000000000000# 💪 - 🏑 🎏 🌌 👆 💪 📣 🌖 🔬 & 🗃 *➡ 🛠️ 🔢* 🔢 ⏮️ `Query`, `Path` & `Body`, 👆 💪 📣 🔬 & 🗃 🔘 Pydantic 🏷 ⚙️ Pydantic `Field`. ## 🗄 `Field` 🥇, 👆 ✔️ 🗄 ⚫️: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="4" {!> ../../../docs_src/body_fields/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="2" {!> ../../../docs_src/body_fields/tutorial001_py310.py!} ``` !!! warning 👀 👈 `Field` 🗄 🔗 ⚪️➡️ `pydantic`, 🚫 ⚪️➡️ `fastapi` 🌐 🎂 (`Query`, `Path`, `Body`, ♒️). ## 📣 🏷 🔢 👆 💪 ⤴️ ⚙️ `Field` ⏮️ 🏷 🔢: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="11-14" {!> ../../../docs_src/body_fields/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="9-12" {!> ../../../docs_src/body_fields/tutorial001_py310.py!} ``` `Field` 👷 🎏 🌌 `Query`, `Path` & `Body`, ⚫️ ✔️ 🌐 🎏 🔢, ♒️. !!! note "📡 ℹ" 🤙, `Query`, `Path` & 🎏 👆 🔜 👀 ⏭ ✍ 🎚 🏿 ⚠ `Param` 🎓, ❔ ⚫️ 🏿 Pydantic `FieldInfo` 🎓. & Pydantic `Field` 📨 👐 `FieldInfo` 👍. `Body` 📨 🎚 🏿 `FieldInfo` 🔗. & 📤 🎏 👆 🔜 👀 ⏪ 👈 🏿 `Body` 🎓. 💭 👈 🕐❔ 👆 🗄 `Query`, `Path`, & 🎏 ⚪️➡️ `fastapi`, 👈 🤙 🔢 👈 📨 🎁 🎓. !!! tip 👀 ❔ 🔠 🏷 🔢 ⏮️ 🆎, 🔢 💲 & `Field` ✔️ 🎏 📊 *➡ 🛠️ 🔢* 🔢, ⏮️ `Field` ↩️ `Path`, `Query` & `Body`. ## 🚮 ➕ ℹ 👆 💪 📣 ➕ ℹ `Field`, `Query`, `Body`, ♒️. & ⚫️ 🔜 🔌 🏗 🎻 🔗. 👆 🔜 💡 🌅 🔃 ❎ ➕ ℹ ⏪ 🩺, 🕐❔ 🏫 📣 🖼. !!! warning ➕ 🔑 🚶‍♀️ `Field` 🔜 🎁 📉 🗄 🔗 👆 🈸. 👫 🔑 5️⃣📆 🚫 🎯 🍕 🗄 🔧, 🗄 🧰, 🖼 [🗄 💳](https://validator.swagger.io/), 5️⃣📆 🚫 👷 ⏮️ 👆 🏗 🔗. ## 🌃 👆 💪 ⚙️ Pydantic `Field` 📣 ➕ 🔬 & 🗃 🏷 🔢. 👆 💪 ⚙️ ➕ 🇨🇻 ❌ 🚶‍♀️ 🌖 🎻 🔗 🗃. fastapi-0.110.3/docs/em/docs/tutorial/body-multiple-params.md000066400000000000000000000120261461403617600240310ustar00rootroot00000000000000# 💪 - 💗 🔢 🔜 👈 👥 ✔️ 👀 ❔ ⚙️ `Path` & `Query`, ➡️ 👀 🌅 🏧 ⚙️ 📨 💪 📄. ## 🌀 `Path`, `Query` & 💪 🔢 🥇, ↗️, 👆 💪 🌀 `Path`, `Query` & 📨 💪 🔢 📄 ➡ & **FastAPI** 🔜 💭 ⚫️❔. & 👆 💪 📣 💪 🔢 📦, ⚒ 🔢 `None`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="19-21" {!> ../../../docs_src/body_multiple_params/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="17-19" {!> ../../../docs_src/body_multiple_params/tutorial001_py310.py!} ``` !!! note 👀 👈, 👉 💼, `item` 👈 🔜 ✊ ⚪️➡️ 💪 📦. ⚫️ ✔️ `None` 🔢 💲. ## 💗 💪 🔢 ⏮️ 🖼, *➡ 🛠️* 🔜 ⌛ 🎻 💪 ⏮️ 🔢 `Item`, 💖: ```JSON { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2 } ``` ✋️ 👆 💪 📣 💗 💪 🔢, ✅ `item` & `user`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="22" {!> ../../../docs_src/body_multiple_params/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="20" {!> ../../../docs_src/body_multiple_params/tutorial002_py310.py!} ``` 👉 💼, **FastAPI** 🔜 👀 👈 📤 🌅 🌘 1️⃣ 💪 🔢 🔢 (2️⃣ 🔢 👈 Pydantic 🏷). , ⚫️ 🔜 ⤴️ ⚙️ 🔢 📛 🔑 (🏑 📛) 💪, & ⌛ 💪 💖: ```JSON { "item": { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2 }, "user": { "username": "dave", "full_name": "Dave Grohl" } } ``` !!! note 👀 👈 ✋️ `item` 📣 🎏 🌌 ⏭, ⚫️ 🔜 ⌛ 🔘 💪 ⏮️ 🔑 `item`. **FastAPI** 🔜 🏧 🛠️ ⚪️➡️ 📨, 👈 🔢 `item` 📨 ⚫️ 🎯 🎚 & 🎏 `user`. ⚫️ 🔜 🎭 🔬 ⚗ 💽, & 🔜 📄 ⚫️ 💖 👈 🗄 🔗 & 🏧 🩺. ## ⭐ 💲 💪 🎏 🌌 📤 `Query` & `Path` 🔬 ➕ 💽 🔢 & ➡ 🔢, **FastAPI** 🚚 🌓 `Body`. 🖼, ↔ ⏮️ 🏷, 👆 💪 💭 👈 👆 💚 ✔️ ➕1️⃣ 🔑 `importance` 🎏 💪, 🥈 `item` & `user`. 🚥 👆 📣 ⚫️, ↩️ ⚫️ ⭐ 💲, **FastAPI** 🔜 🤔 👈 ⚫️ 🔢 🔢. ✋️ 👆 💪 💡 **FastAPI** 😥 ⚫️ ➕1️⃣ 💪 🔑 ⚙️ `Body`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="22" {!> ../../../docs_src/body_multiple_params/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="20" {!> ../../../docs_src/body_multiple_params/tutorial003_py310.py!} ``` 👉 💼, **FastAPI** 🔜 ⌛ 💪 💖: ```JSON { "item": { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2 }, "user": { "username": "dave", "full_name": "Dave Grohl" }, "importance": 5 } ``` 🔄, ⚫️ 🔜 🗜 📊 🆎, ✔, 📄, ♒️. ## 💗 💪 = & 🔢 ↗️, 👆 💪 📣 🌖 🔢 🔢 🕐❔ 👆 💪, 🌖 🙆 💪 🔢. , 🔢, ⭐ 💲 🔬 🔢 🔢, 👆 🚫 ✔️ 🎯 🚮 `Query`, 👆 💪: ```Python q: Union[str, None] = None ``` ⚖️ 🐍 3️⃣.1️⃣0️⃣ & 🔛: ```Python q: str | None = None ``` 🖼: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="27" {!> ../../../docs_src/body_multiple_params/tutorial004.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="26" {!> ../../../docs_src/body_multiple_params/tutorial004_py310.py!} ``` !!! info `Body` ✔️ 🌐 🎏 ➕ 🔬 & 🗃 🔢 `Query`,`Path` & 🎏 👆 🔜 👀 ⏪. ## ⏯ 👁 💪 🔢 ➡️ 💬 👆 🕴 ✔️ 👁 `item` 💪 🔢 ⚪️➡️ Pydantic 🏷 `Item`. 🔢, **FastAPI** 🔜 ⤴️ ⌛ 🚮 💪 🔗. ✋️ 🚥 👆 💚 ⚫️ ⌛ 🎻 ⏮️ 🔑 `item` & 🔘 ⚫️ 🏷 🎚, ⚫️ 🔨 🕐❔ 👆 📣 ➕ 💪 🔢, 👆 💪 ⚙️ 🎁 `Body` 🔢 `embed`: ```Python item: Item = Body(embed=True) ``` : === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="17" {!> ../../../docs_src/body_multiple_params/tutorial005.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="15" {!> ../../../docs_src/body_multiple_params/tutorial005_py310.py!} ``` 👉 💼 **FastAPI** 🔜 ⌛ 💪 💖: ```JSON hl_lines="2" { "item": { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2 } } ``` ↩️: ```JSON { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2 } ``` ## 🌃 👆 💪 🚮 💗 💪 🔢 👆 *➡ 🛠️ 🔢*, ✋️ 📨 💪 🕴 ✔️ 👁 💪. ✋️ **FastAPI** 🔜 🍵 ⚫️, 🤝 👆 ☑ 📊 👆 🔢, & ✔ & 📄 ☑ 🔗 *➡ 🛠️*. 👆 💪 📣 ⭐ 💲 📨 🍕 💪. & 👆 💪 💡 **FastAPI** ⏯ 💪 🔑 🕐❔ 📤 🕴 👁 🔢 📣. fastapi-0.110.3/docs/em/docs/tutorial/body-nested-models.md000066400000000000000000000223001461403617600234540ustar00rootroot00000000000000# 💪 - 🔁 🏷 ⏮️ **FastAPI**, 👆 💪 🔬, ✔, 📄, & ⚙️ 🎲 🙇 🐦 🏷 (👏 Pydantic). ## 📇 🏑 👆 💪 🔬 🔢 🏾. 🖼, 🐍 `list`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="14" {!> ../../../docs_src/body_nested_models/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="12" {!> ../../../docs_src/body_nested_models/tutorial001_py310.py!} ``` 👉 🔜 ⚒ `tags` 📇, 👐 ⚫️ 🚫 📣 🆎 🔣 📇. ## 📇 🏑 ⏮️ 🆎 🔢 ✋️ 🐍 ✔️ 🎯 🌌 📣 📇 ⏮️ 🔗 🆎, ⚖️ "🆎 🔢": ### 🗄 ⌨ `List` 🐍 3️⃣.9️⃣ & 🔛 👆 💪 ⚙️ 🐩 `list` 📣 👫 🆎 ✍ 👥 🔜 👀 🔛. 👶 ✋️ 🐍 ⏬ ⏭ 3️⃣.9️⃣ (3️⃣.6️⃣ & 🔛), 👆 🥇 💪 🗄 `List` ⚪️➡️ 🐩 🐍 `typing` 🕹: ```Python hl_lines="1" {!> ../../../docs_src/body_nested_models/tutorial002.py!} ``` ### 📣 `list` ⏮️ 🆎 🔢 📣 🆎 👈 ✔️ 🆎 🔢 (🔗 🆎), 💖 `list`, `dict`, `tuple`: * 🚥 👆 🐍 ⏬ 🔅 🌘 3️⃣.9️⃣, 🗄 👫 🌓 ⏬ ⚪️➡️ `typing` 🕹 * 🚶‍♀️ 🔗 🆎(Ⓜ) "🆎 🔢" ⚙️ ⬜ 🗜: `[` & `]` 🐍 3️⃣.9️⃣ ⚫️ 🔜: ```Python my_list: list[str] ``` ⏬ 🐍 ⏭ 3️⃣.9️⃣, ⚫️ 🔜: ```Python from typing import List my_list: List[str] ``` 👈 🌐 🐩 🐍 ❕ 🆎 📄. ⚙️ 👈 🎏 🐩 ❕ 🏷 🔢 ⏮️ 🔗 🆎. , 👆 🖼, 👥 💪 ⚒ `tags` 🎯 "📇 🎻": === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="14" {!> ../../../docs_src/body_nested_models/tutorial002.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="14" {!> ../../../docs_src/body_nested_models/tutorial002_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="12" {!> ../../../docs_src/body_nested_models/tutorial002_py310.py!} ``` ## ⚒ 🆎 ✋️ ⤴️ 👥 💭 🔃 ⚫️, & 🤔 👈 🔖 🚫🔜 🚫 🔁, 👫 🔜 🎲 😍 🎻. & 🐍 ✔️ 🎁 💽 🆎 ⚒ 😍 🏬, `set`. ⤴️ 👥 💪 📣 `tags` ⚒ 🎻: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="1 14" {!> ../../../docs_src/body_nested_models/tutorial003.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="14" {!> ../../../docs_src/body_nested_models/tutorial003_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="12" {!> ../../../docs_src/body_nested_models/tutorial003_py310.py!} ``` ⏮️ 👉, 🚥 👆 📨 📨 ⏮️ ❎ 📊, ⚫️ 🔜 🗜 ⚒ 😍 🏬. & 🕐❔ 👆 🔢 👈 📊, 🚥 ℹ ✔️ ❎, ⚫️ 🔜 🔢 ⚒ 😍 🏬. & ⚫️ 🔜 ✍ / 📄 ➡️ 💁‍♂️. ## 🐦 🏷 🔠 🔢 Pydantic 🏷 ✔️ 🆎. ✋️ 👈 🆎 💪 ⚫️ ➕1️⃣ Pydantic 🏷. , 👆 💪 📣 🙇 🐦 🎻 "🎚" ⏮️ 🎯 🔢 📛, 🆎 & 🔬. 🌐 👈, 🎲 🐦. ### 🔬 📊 🖼, 👥 💪 🔬 `Image` 🏷: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9-11" {!> ../../../docs_src/body_nested_models/tutorial004.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="9-11" {!> ../../../docs_src/body_nested_models/tutorial004_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7-9" {!> ../../../docs_src/body_nested_models/tutorial004_py310.py!} ``` ### ⚙️ 📊 🆎 & ⤴️ 👥 💪 ⚙️ ⚫️ 🆎 🔢: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="20" {!> ../../../docs_src/body_nested_models/tutorial004.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="20" {!> ../../../docs_src/body_nested_models/tutorial004_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="18" {!> ../../../docs_src/body_nested_models/tutorial004_py310.py!} ``` 👉 🔜 ⛓ 👈 **FastAPI** 🔜 ⌛ 💪 🎏: ```JSON { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2, "tags": ["rock", "metal", "bar"], "image": { "url": "http://example.com/baz.jpg", "name": "The Foo live" } } ``` 🔄, 🤸 👈 📄, ⏮️ **FastAPI** 👆 🤚: * 👨‍🎨 🐕‍🦺 (🛠️, ♒️), 🐦 🏷 * 💽 🛠️ * 💽 🔬 * 🏧 🧾 ## 🎁 🆎 & 🔬 ↖️ ⚪️➡️ 😐 ⭐ 🆎 💖 `str`, `int`, `float`, ♒️. 👆 💪 ⚙️ 🌅 🏗 ⭐ 🆎 👈 😖 ⚪️➡️ `str`. 👀 🌐 🎛 👆 ✔️, 🛒 🩺 Pydantic 😍 🆎. 👆 🔜 👀 🖼 ⏭ 📃. 🖼, `Image` 🏷 👥 ✔️ `url` 🏑, 👥 💪 📣 ⚫️ ↩️ `str`, Pydantic `HttpUrl`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="4 10" {!> ../../../docs_src/body_nested_models/tutorial005.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="4 10" {!> ../../../docs_src/body_nested_models/tutorial005_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="2 8" {!> ../../../docs_src/body_nested_models/tutorial005_py310.py!} ``` 🎻 🔜 ✅ ☑ 📛, & 📄 🎻 🔗 / 🗄 ✅. ## 🔢 ⏮️ 📇 📊 👆 💪 ⚙️ Pydantic 🏷 🏾 `list`, `set`, ♒️: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="20" {!> ../../../docs_src/body_nested_models/tutorial006.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="20" {!> ../../../docs_src/body_nested_models/tutorial006_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="18" {!> ../../../docs_src/body_nested_models/tutorial006_py310.py!} ``` 👉 🔜 ⌛ (🗜, ✔, 📄, ♒️) 🎻 💪 💖: ```JSON hl_lines="11" { "name": "Foo", "description": "The pretender", "price": 42.0, "tax": 3.2, "tags": [ "rock", "metal", "bar" ], "images": [ { "url": "http://example.com/baz.jpg", "name": "The Foo live" }, { "url": "http://example.com/dave.jpg", "name": "The Baz" } ] } ``` !!! info 👀 ❔ `images` 🔑 🔜 ✔️ 📇 🖼 🎚. ## 🙇 🐦 🏷 👆 💪 🔬 🎲 🙇 🐦 🏷: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9 14 20 23 27" {!> ../../../docs_src/body_nested_models/tutorial007.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="9 14 20 23 27" {!> ../../../docs_src/body_nested_models/tutorial007_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7 12 18 21 25" {!> ../../../docs_src/body_nested_models/tutorial007_py310.py!} ``` !!! info 👀 ❔ `Offer` ✔️ 📇 `Item`Ⓜ, ❔ 🔄 ✔️ 📦 📇 `Image`Ⓜ ## 💪 😁 📇 🚥 🔝 🎚 💲 🎻 💪 👆 ⌛ 🎻 `array` (🐍 `list`), 👆 💪 📣 🆎 🔢 🔢, 🎏 Pydantic 🏷: ```Python images: List[Image] ``` ⚖️ 🐍 3️⃣.9️⃣ & 🔛: ```Python images: list[Image] ``` : === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="15" {!> ../../../docs_src/body_nested_models/tutorial008.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="13" {!> ../../../docs_src/body_nested_models/tutorial008_py39.py!} ``` ## 👨‍🎨 🐕‍🦺 🌐 & 👆 🤚 👨‍🎨 🐕‍🦺 🌐. 🏬 🔘 📇: 👆 🚫 🚫 🤚 👉 😇 👨‍🎨 🐕‍🦺 🚥 👆 👷 🔗 ⏮️ `dict` ↩️ Pydantic 🏷. ✋️ 👆 🚫 ✔️ 😟 🔃 👫 👯‍♂️, 📨 #️⃣ 🗜 🔁 & 👆 🔢 🗜 🔁 🎻 💁‍♂️. ## 💪 ❌ `dict`Ⓜ 👆 💪 📣 💪 `dict` ⏮️ 🔑 🆎 & 💲 🎏 🆎. 🍵 ✔️ 💭 ⏪ ⚫️❔ ☑ 🏑/🔢 📛 (🔜 💼 ⏮️ Pydantic 🏷). 👉 🔜 ⚠ 🚥 👆 💚 📨 🔑 👈 👆 🚫 ⏪ 💭. --- 🎏 ⚠ 💼 🕐❔ 👆 💚 ✔️ 🔑 🎏 🆎, ✅ `int`. 👈 ⚫️❔ 👥 🔜 👀 📥. 👉 💼, 👆 🔜 🚫 🙆 `dict` 📏 ⚫️ ✔️ `int` 🔑 ⏮️ `float` 💲: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/body_nested_models/tutorial009.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/body_nested_models/tutorial009_py39.py!} ``` !!! tip ✔️ 🤯 👈 🎻 🕴 🐕‍🦺 `str` 🔑. ✋️ Pydantic ✔️ 🏧 💽 🛠️. 👉 ⛓ 👈, ✋️ 👆 🛠️ 👩‍💻 💪 🕴 📨 🎻 🔑, 📏 👈 🎻 🔌 😁 🔢, Pydantic 🔜 🗜 👫 & ✔ 👫. & `dict` 👆 📨 `weights` 🔜 🤙 ✔️ `int` 🔑 & `float` 💲. ## 🌃 ⏮️ **FastAPI** 👆 ✔️ 🔆 💪 🚚 Pydantic 🏷, ⏪ 🚧 👆 📟 🙅, 📏 & 😍. ✋️ ⏮️ 🌐 💰: * 👨‍🎨 🐕‍🦺 (🛠️ 🌐 ❗) * 💽 🛠️ (.Ⓜ.. ✍ / 🛠️) * 💽 🔬 * 🔗 🧾 * 🏧 🩺 fastapi-0.110.3/docs/em/docs/tutorial/body-updates.md000066400000000000000000000111561461403617600223650ustar00rootroot00000000000000# 💪 - ℹ ## ℹ ❎ ⏮️ `PUT` ℹ 🏬 👆 💪 ⚙️ 🇺🇸🔍 `PUT` 🛠️. 👆 💪 ⚙️ `jsonable_encoder` 🗜 🔢 💽 📊 👈 💪 🏪 🎻 (✅ ⏮️ ☁ 💽). 🖼, 🏭 `datetime` `str`. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="30-35" {!> ../../../docs_src/body_updates/tutorial001.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="30-35" {!> ../../../docs_src/body_updates/tutorial001_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="28-33" {!> ../../../docs_src/body_updates/tutorial001_py310.py!} ``` `PUT` ⚙️ 📨 💽 👈 🔜 ❎ ♻ 💽. ### ⚠ 🔃 ❎ 👈 ⛓ 👈 🚥 👆 💚 ℹ 🏬 `bar` ⚙️ `PUT` ⏮️ 💪 ⚗: ```Python { "name": "Barz", "price": 3, "description": None, } ``` ↩️ ⚫️ 🚫 🔌 ⏪ 🏪 🔢 `"tax": 20.2`, 🔢 🏷 🔜 ✊ 🔢 💲 `"tax": 10.5`. & 📊 🔜 🖊 ⏮️ 👈 "🆕" `tax` `10.5`. ## 🍕 ℹ ⏮️ `PATCH` 👆 💪 ⚙️ 🇺🇸🔍 `PATCH` 🛠️ *🍕* ℹ 💽. 👉 ⛓ 👈 👆 💪 📨 🕴 💽 👈 👆 💚 ℹ, 🍂 🎂 🐣. !!! note `PATCH` 🌘 🛎 ⚙️ & 💭 🌘 `PUT`. & 📚 🏉 ⚙️ 🕴 `PUT`, 🍕 ℹ. 👆 **🆓** ⚙️ 👫 👐 👆 💚, **FastAPI** 🚫 🚫 🙆 🚫. ✋️ 👉 🦮 🎦 👆, 🌖 ⚖️ 🌘, ❔ 👫 🎯 ⚙️. ### ⚙️ Pydantic `exclude_unset` 🔢 🚥 👆 💚 📨 🍕 ℹ, ⚫️ 📶 ⚠ ⚙️ 🔢 `exclude_unset` Pydantic 🏷 `.dict()`. 💖 `item.dict(exclude_unset=True)`. 👈 🔜 🏗 `dict` ⏮️ 🕴 💽 👈 ⚒ 🕐❔ 🏗 `item` 🏷, 🚫 🔢 💲. ⤴️ 👆 💪 ⚙️ 👉 🏗 `dict` ⏮️ 🕴 💽 👈 ⚒ (📨 📨), 🚫 🔢 💲: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="34" {!> ../../../docs_src/body_updates/tutorial002.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="34" {!> ../../../docs_src/body_updates/tutorial002_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="32" {!> ../../../docs_src/body_updates/tutorial002_py310.py!} ``` ### ⚙️ Pydantic `update` 🔢 🔜, 👆 💪 ✍ 📁 ♻ 🏷 ⚙️ `.copy()`, & 🚶‍♀️ `update` 🔢 ⏮️ `dict` ⚗ 💽 ℹ. 💖 `stored_item_model.copy(update=update_data)`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="35" {!> ../../../docs_src/body_updates/tutorial002.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="35" {!> ../../../docs_src/body_updates/tutorial002_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="33" {!> ../../../docs_src/body_updates/tutorial002_py310.py!} ``` ### 🍕 ℹ 🌃 📄, ✔ 🍕 ℹ 👆 🔜: * (⚗) ⚙️ `PATCH` ↩️ `PUT`. * 🗃 🏪 💽. * 🚮 👈 💽 Pydantic 🏷. * 🏗 `dict` 🍵 🔢 💲 ⚪️➡️ 🔢 🏷 (⚙️ `exclude_unset`). * 👉 🌌 👆 💪 ℹ 🕴 💲 🤙 ⚒ 👩‍💻, ↩️ 🔐 💲 ⏪ 🏪 ⏮️ 🔢 💲 👆 🏷. * ✍ 📁 🏪 🏷, 🛠️ ⚫️ 🔢 ⏮️ 📨 🍕 ℹ (⚙️ `update` 🔢). * 🗜 📁 🏷 🕳 👈 💪 🏪 👆 💽 (🖼, ⚙️ `jsonable_encoder`). * 👉 ⭐ ⚙️ 🏷 `.dict()` 👩‍🔬 🔄, ✋️ ⚫️ ⚒ 💭 (& 🗜) 💲 💽 🆎 👈 💪 🗜 🎻, 🖼, `datetime` `str`. * 🖊 💽 👆 💽. * 📨 ℹ 🏷. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="30-37" {!> ../../../docs_src/body_updates/tutorial002.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="30-37" {!> ../../../docs_src/body_updates/tutorial002_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="28-35" {!> ../../../docs_src/body_updates/tutorial002_py310.py!} ``` !!! tip 👆 💪 🤙 ⚙️ 👉 🎏 ⚒ ⏮️ 🇺🇸🔍 `PUT` 🛠️. ✋️ 🖼 📥 ⚙️ `PATCH` ↩️ ⚫️ ✍ 👫 ⚙️ 💼. !!! note 👀 👈 🔢 🏷 ✔. , 🚥 👆 💚 📨 🍕 ℹ 👈 💪 🚫 🌐 🔢, 👆 💪 ✔️ 🏷 ⏮️ 🌐 🔢 ™ 📦 (⏮️ 🔢 💲 ⚖️ `None`). 🔬 ⚪️➡️ 🏷 ⏮️ 🌐 📦 💲 **ℹ** & 🏷 ⏮️ ✔ 💲 **🏗**, 👆 💪 ⚙️ 💭 🔬 [➕ 🏷](extra-models.md){.internal-link target=_blank}. fastapi-0.110.3/docs/em/docs/tutorial/body.md000066400000000000000000000147741461403617600207330ustar00rootroot00000000000000# 📨 💪 🕐❔ 👆 💪 📨 📊 ⚪️➡️ 👩‍💻 (➡️ 💬, 🖥) 👆 🛠️, 👆 📨 ⚫️ **📨 💪**. **📨** 💪 📊 📨 👩‍💻 👆 🛠️. **📨** 💪 💽 👆 🛠️ 📨 👩‍💻. 👆 🛠️ 🌖 🕧 ✔️ 📨 **📨** 💪. ✋️ 👩‍💻 🚫 🎯 💪 📨 **📨** 💪 🌐 🕰. 📣 **📨** 💪, 👆 ⚙️ Pydantic 🏷 ⏮️ 🌐 👫 🏋️ & 💰. !!! info 📨 💽, 👆 🔜 ⚙️ 1️⃣: `POST` (🌅 ⚠), `PUT`, `DELETE` ⚖️ `PATCH`. 📨 💪 ⏮️ `GET` 📨 ✔️ ⚠ 🎭 🔧, 👐, ⚫️ 🐕‍🦺 FastAPI, 🕴 📶 🏗/😕 ⚙️ 💼. ⚫️ 🚫, 🎓 🩺 ⏮️ 🦁 🎚 🏆 🚫 🎦 🧾 💪 🕐❔ ⚙️ `GET`, & 🗳 🖕 💪 🚫 🐕‍🦺 ⚫️. ## 🗄 Pydantic `BaseModel` 🥇, 👆 💪 🗄 `BaseModel` ⚪️➡️ `pydantic`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="4" {!> ../../../docs_src/body/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="2" {!> ../../../docs_src/body/tutorial001_py310.py!} ``` ## ✍ 👆 💽 🏷 ⤴️ 👆 📣 👆 💽 🏷 🎓 👈 😖 ⚪️➡️ `BaseModel`. ⚙️ 🐩 🐍 🆎 🌐 🔢: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="7-11" {!> ../../../docs_src/body/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="5-9" {!> ../../../docs_src/body/tutorial001_py310.py!} ``` 🎏 🕐❔ 📣 🔢 🔢, 🕐❔ 🏷 🔢 ✔️ 🔢 💲, ⚫️ 🚫 ✔. ⏪, ⚫️ ✔. ⚙️ `None` ⚒ ⚫️ 📦. 🖼, 👉 🏷 🔛 📣 🎻 "`object`" (⚖️ 🐍 `dict`) 💖: ```JSON { "name": "Foo", "description": "An optional description", "price": 45.2, "tax": 3.5 } ``` ... `description` & `tax` 📦 (⏮️ 🔢 💲 `None`), 👉 🎻 "`object`" 🔜 ☑: ```JSON { "name": "Foo", "price": 45.2 } ``` ## 📣 ⚫️ 🔢 🚮 ⚫️ 👆 *➡ 🛠️*, 📣 ⚫️ 🎏 🌌 👆 📣 ➡ & 🔢 🔢: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="18" {!> ../../../docs_src/body/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="16" {!> ../../../docs_src/body/tutorial001_py310.py!} ``` ...& 📣 🚮 🆎 🏷 👆 ✍, `Item`. ## 🏁 ⏮️ 👈 🐍 🆎 📄, **FastAPI** 🔜: * ✍ 💪 📨 🎻. * 🗜 🔗 🆎 (🚥 💪). * ✔ 💽. * 🚥 💽 ❌, ⚫️ 🔜 📨 👌 & 🆑 ❌, ☠️ ⚫️❔ 🌐❔ & ⚫️❔ ❌ 📊. * 🤝 👆 📨 📊 🔢 `item`. * 👆 📣 ⚫️ 🔢 🆎 `Item`, 👆 🔜 ✔️ 🌐 👨‍🎨 🐕‍🦺 (🛠️, ♒️) 🌐 🔢 & 👫 🆎. * 🏗 🎻 🔗 🔑 👆 🏷, 👆 💪 ⚙️ 👫 🙆 🙆 👆 💖 🚥 ⚫️ ⚒ 🔑 👆 🏗. * 👈 🔗 🔜 🍕 🏗 🗄 🔗, & ⚙️ 🏧 🧾 . ## 🏧 🩺 🎻 🔗 👆 🏷 🔜 🍕 👆 🗄 🏗 🔗, & 🔜 🎦 🎓 🛠️ 🩺: & 🔜 ⚙️ 🛠️ 🩺 🔘 🔠 *➡ 🛠️* 👈 💪 👫: ## 👨‍🎨 🐕‍🦺 👆 👨‍🎨, 🔘 👆 🔢 👆 🔜 🤚 🆎 🔑 & 🛠️ 🌐 (👉 🚫🔜 🔨 🚥 👆 📨 `dict` ↩️ Pydantic 🏷): 👆 🤚 ❌ ✅ ❌ 🆎 🛠️: 👉 🚫 🤞, 🎂 🛠️ 🏗 🤭 👈 🔧. & ⚫️ 🙇 💯 🔧 🌓, ⏭ 🙆 🛠️, 🚚 ⚫️ 🔜 👷 ⏮️ 🌐 👨‍🎨. 📤 🔀 Pydantic ⚫️ 🐕‍🦺 👉. ⏮️ 🖼 ✊ ⏮️ 🎙 🎙 📟. ✋️ 👆 🔜 🤚 🎏 👨‍🎨 🐕‍🦺 ⏮️ 🗒 & 🌅 🎏 🐍 👨‍🎨: !!! tip 🚥 👆 ⚙️ 🗒 👆 👨‍🎨, 👆 💪 ⚙️ Pydantic 🗒 📁. ⚫️ 📉 👨‍🎨 🐕‍🦺 Pydantic 🏷, ⏮️: * 🚘-🛠️ * 🆎 ✅ * 🛠️ * 🔎 * 🔬 ## ⚙️ 🏷 🔘 🔢, 👆 💪 🔐 🌐 🔢 🏷 🎚 🔗: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="21" {!> ../../../docs_src/body/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="19" {!> ../../../docs_src/body/tutorial002_py310.py!} ``` ## 📨 💪 ➕ ➡ 🔢 👆 💪 📣 ➡ 🔢 & 📨 💪 🎏 🕰. **FastAPI** 🔜 🤔 👈 🔢 🔢 👈 🏏 ➡ 🔢 🔜 **✊ ⚪️➡️ ➡**, & 👈 🔢 🔢 👈 📣 Pydantic 🏷 🔜 **✊ ⚪️➡️ 📨 💪**. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="17-18" {!> ../../../docs_src/body/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="15-16" {!> ../../../docs_src/body/tutorial003_py310.py!} ``` ## 📨 💪 ➕ ➡ ➕ 🔢 🔢 👆 💪 📣 **💪**, **➡** & **🔢** 🔢, 🌐 🎏 🕰. **FastAPI** 🔜 🤔 🔠 👫 & ✊ 📊 ⚪️➡️ ☑ 🥉. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="18" {!> ../../../docs_src/body/tutorial004.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="16" {!> ../../../docs_src/body/tutorial004_py310.py!} ``` 🔢 🔢 🔜 🤔 ⏩: * 🚥 🔢 📣 **➡**, ⚫️ 🔜 ⚙️ ➡ 🔢. * 🚥 🔢 **⭐ 🆎** (💖 `int`, `float`, `str`, `bool`, ♒️) ⚫️ 🔜 🔬 **🔢** 🔢. * 🚥 🔢 📣 🆎 **Pydantic 🏷**, ⚫️ 🔜 🔬 📨 **💪**. !!! note FastAPI 🔜 💭 👈 💲 `q` 🚫 ✔ ↩️ 🔢 💲 `= None`. `Union` `Union[str, None]` 🚫 ⚙️ FastAPI, ✋️ 🔜 ✔ 👆 👨‍🎨 🤝 👆 👍 🐕‍🦺 & 🔍 ❌. ## 🍵 Pydantic 🚥 👆 🚫 💚 ⚙️ Pydantic 🏷, 👆 💪 ⚙️ **💪** 🔢. 👀 🩺 [💪 - 💗 🔢: ⭐ 💲 💪](body-multiple-params.md#_2){.internal-link target=_blank}. fastapi-0.110.3/docs/em/docs/tutorial/cookie-params.md000066400000000000000000000023641461403617600225200ustar00rootroot00000000000000# 🍪 🔢 👆 💪 🔬 🍪 🔢 🎏 🌌 👆 🔬 `Query` & `Path` 🔢. ## 🗄 `Cookie` 🥇 🗄 `Cookie`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="3" {!> ../../../docs_src/cookie_params/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="1" {!> ../../../docs_src/cookie_params/tutorial001_py310.py!} ``` ## 📣 `Cookie` 🔢 ⤴️ 📣 🍪 🔢 ⚙️ 🎏 📊 ⏮️ `Path` & `Query`. 🥇 💲 🔢 💲, 👆 💪 🚶‍♀️ 🌐 ➕ 🔬 ⚖️ ✍ 🔢: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/cookie_params/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/cookie_params/tutorial001_py310.py!} ``` !!! note "📡 ℹ" `Cookie` "👭" 🎓 `Path` & `Query`. ⚫️ 😖 ⚪️➡️ 🎏 ⚠ `Param` 🎓. ✋️ 💭 👈 🕐❔ 👆 🗄 `Query`, `Path`, `Cookie` & 🎏 ⚪️➡️ `fastapi`, 👈 🤙 🔢 👈 📨 🎁 🎓. !!! info 📣 🍪, 👆 💪 ⚙️ `Cookie`, ↩️ ⏪ 🔢 🔜 🔬 🔢 🔢. ## 🌃 📣 🍪 ⏮️ `Cookie`, ⚙️ 🎏 ⚠ ⚓ `Query` & `Path`. fastapi-0.110.3/docs/em/docs/tutorial/cors.md000066400000000000000000000101121461403617600207220ustar00rootroot00000000000000# ⚜ (✖️-🇨🇳 ℹ 🤝) ⚜ ⚖️ "✖️-🇨🇳 ℹ 🤝" 🔗 ⚠ 🕐❔ 🕸 🏃‍♂ 🖥 ✔️ 🕸 📟 👈 🔗 ⏮️ 👩‍💻, & 👩‍💻 🎏 "🇨🇳" 🌘 🕸. ## 🇨🇳 🇨🇳 🌀 🛠️ (`http`, `https`), 🆔 (`myapp.com`, `localhost`, `localhost.tiangolo.com`), & ⛴ (`80`, `443`, `8080`). , 🌐 👫 🎏 🇨🇳: * `http://localhost` * `https://localhost` * `http://localhost:8080` 🚥 👫 🌐 `localhost`, 👫 ⚙️ 🎏 🛠️ ⚖️ ⛴,, 👫 🎏 "🇨🇳". ## 🔁 , ➡️ 💬 👆 ✔️ 🕸 🏃 👆 🖥 `http://localhost:8080`, & 🚮 🕸 🔄 🔗 ⏮️ 👩‍💻 🏃 `http://localhost` (↩️ 👥 🚫 ✔ ⛴, 🖥 🔜 🤔 🔢 ⛴ `80`). ⤴️, 🖥 🔜 📨 🇺🇸🔍 `OPTIONS` 📨 👩‍💻, & 🚥 👩‍💻 📨 ☑ 🎚 ✔ 📻 ⚪️➡️ 👉 🎏 🇨🇳 (`http://localhost:8080`) ⤴️ 🖥 🔜 ➡️ 🕸 🕸 📨 🚮 📨 👩‍💻. 🏆 👉, 👩‍💻 🔜 ✔️ 📇 "✔ 🇨🇳". 👉 💼, ⚫️ 🔜 ✔️ 🔌 `http://localhost:8080` 🕸 👷 ☑. ## 🃏 ⚫️ 💪 📣 📇 `"*"` ("🃏") 💬 👈 🌐 ✔. ✋️ 👈 🔜 🕴 ✔ 🎯 🆎 📻, 🚫 🌐 👈 🔌 🎓: 🍪, ✔ 🎚 💖 📚 ⚙️ ⏮️ 📨 🤝, ♒️. , 🌐 👷 ☑, ⚫️ 👻 ✔ 🎯 ✔ 🇨🇳. ## ⚙️ `CORSMiddleware` 👆 💪 🔗 ⚫️ 👆 **FastAPI** 🈸 ⚙️ `CORSMiddleware`. * 🗄 `CORSMiddleware`. * ✍ 📇 ✔ 🇨🇳 (🎻). * 🚮 ⚫️ "🛠️" 👆 **FastAPI** 🈸. 👆 💪 ✔ 🚥 👆 👩‍💻 ✔: * 🎓 (✔ 🎚, 🍪, ♒️). * 🎯 🇺🇸🔍 👩‍🔬 (`POST`, `PUT`) ⚖️ 🌐 👫 ⏮️ 🃏 `"*"`. * 🎯 🇺🇸🔍 🎚 ⚖️ 🌐 👫 ⏮️ 🃏 `"*"`. ```Python hl_lines="2 6-11 13-19" {!../../../docs_src/cors/tutorial001.py!} ``` 🔢 🔢 ⚙️ `CORSMiddleware` 🛠️ 🚫 🔢, 👆 🔜 💪 🎯 🛠️ 🎯 🇨🇳, 👩‍🔬, ⚖️ 🎚, ✔ 🖥 ✔ ⚙️ 👫 ✖️-🆔 🔑. 📄 ❌ 🐕‍🦺: * `allow_origins` - 📇 🇨🇳 👈 🔜 ✔ ⚒ ✖️-🇨🇳 📨. 🤶 Ⓜ. `['https://example.org', 'https://www.example.org']`. 👆 💪 ⚙️ `['*']` ✔ 🙆 🇨🇳. * `allow_origin_regex` - 🎻 🎻 🏏 🛡 🇨🇳 👈 🔜 ✔ ⚒ ✖️-🇨🇳 📨. ✅ `'https://.*\.example\.org'`. * `allow_methods` - 📇 🇺🇸🔍 👩‍🔬 👈 🔜 ✔ ✖️-🇨🇳 📨. 🔢 `['GET']`. 👆 💪 ⚙️ `['*']` ✔ 🌐 🐩 👩‍🔬. * `allow_headers` - 📇 🇺🇸🔍 📨 🎚 👈 🔜 🐕‍🦺 ✖️-🇨🇳 📨. 🔢 `[]`. 👆 💪 ⚙️ `['*']` ✔ 🌐 🎚. `Accept`, `Accept-Language`, `Content-Language` & `Content-Type` 🎚 🕧 ✔ 🙅 ⚜ 📨. * `allow_credentials` - 🎦 👈 🍪 🔜 🐕‍🦺 ✖️-🇨🇳 📨. 🔢 `False`. , `allow_origins` 🚫🔜 ⚒ `['*']` 🎓 ✔, 🇨🇳 🔜 ✔. * `expose_headers` - 🎦 🙆 📨 🎚 👈 🔜 ⚒ ♿ 🖥. 🔢 `[]`. * `max_age` - ⚒ 🔆 🕰 🥈 🖥 💾 ⚜ 📨. 🔢 `600`. 🛠️ 📨 2️⃣ 🎯 🆎 🇺🇸🔍 📨... ### ⚜ 🛫 📨 👉 🙆 `OPTIONS` 📨 ⏮️ `Origin` & `Access-Control-Request-Method` 🎚. 👉 💼 🛠️ 🔜 🆘 📨 📨 & 📨 ⏮️ ☑ ⚜ 🎚, & 👯‍♂️ `200` ⚖️ `400` 📨 🎓 🎯. ### 🙅 📨 🙆 📨 ⏮️ `Origin` 🎚. 👉 💼 🛠️ 🔜 🚶‍♀️ 📨 🔘 😐, ✋️ 🔜 🔌 ☑ ⚜ 🎚 🔛 📨. ## 🌅 ℹ 🌖 ℹ 🔃 , ✅ 🦎 ⚜ 🧾. !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.middleware.cors import CORSMiddleware`. **FastAPI** 🚚 📚 🛠️ `fastapi.middleware` 🏪 👆, 👩‍💻. ✋️ 🌅 💪 🛠️ 👟 🔗 ⚪️➡️ 💃. fastapi-0.110.3/docs/em/docs/tutorial/debugging.md000066400000000000000000000042011461403617600217110ustar00rootroot00000000000000# 🛠️ 👆 💪 🔗 🕹 👆 👨‍🎨, 🖼 ⏮️ 🎙 🎙 📟 ⚖️ 🗒. ## 🤙 `uvicorn` 👆 FastAPI 🈸, 🗄 & 🏃 `uvicorn` 🔗: ```Python hl_lines="1 15" {!../../../docs_src/debugging/tutorial001.py!} ``` ### 🔃 `__name__ == "__main__"` 👑 🎯 `__name__ == "__main__"` ✔️ 📟 👈 🛠️ 🕐❔ 👆 📁 🤙 ⏮️:
```console $ python myapp.py ```
✋️ 🚫 🤙 🕐❔ ➕1️⃣ 📁 🗄 ⚫️, 💖: ```Python from myapp import app ``` #### 🌅 ℹ ➡️ 💬 👆 📁 🌟 `myapp.py`. 🚥 👆 🏃 ⚫️ ⏮️:
```console $ python myapp.py ```
⤴️ 🔗 🔢 `__name__` 👆 📁, ✍ 🔁 🐍, 🔜 ✔️ 💲 🎻 `"__main__"`. , 📄: ```Python uvicorn.run(app, host="0.0.0.0", port=8000) ``` 🔜 🏃. --- 👉 🏆 🚫 🔨 🚥 👆 🗄 👈 🕹 (📁). , 🚥 👆 ✔️ ➕1️⃣ 📁 `importer.py` ⏮️: ```Python from myapp import app # Some more code ``` 👈 💼, 🏧 🔢 🔘 `myapp.py` 🔜 🚫 ✔️ 🔢 `__name__` ⏮️ 💲 `"__main__"`. , ⏸: ```Python uvicorn.run(app, host="0.0.0.0", port=8000) ``` 🔜 🚫 🛠️. !!! info 🌅 ℹ, ✅ 🛂 🐍 🩺. ## 🏃 👆 📟 ⏮️ 👆 🕹 ↩️ 👆 🏃 Uvicorn 💽 🔗 ⚪️➡️ 👆 📟, 👆 💪 🤙 👆 🐍 📋 (👆 FastAPI 🈸) 🔗 ⚪️➡️ 🕹. --- 🖼, 🎙 🎙 📟, 👆 💪: * 🚶 "ℹ" 🎛. * "🚮 📳...". * 🖊 "🐍" * 🏃 🕹 ⏮️ 🎛 "`Python: Current File (Integrated Terminal)`". ⚫️ 🔜 ⤴️ ▶️ 💽 ⏮️ 👆 **FastAPI** 📟, ⛔️ 👆 0️⃣, ♒️. 📥 ❔ ⚫️ 💪 👀: --- 🚥 👆 ⚙️ 🗒, 👆 💪: * 📂 "🏃" 🍣. * 🖊 🎛 "ℹ...". * ⤴️ 🔑 🍣 🎦 🆙. * 🖊 📁 ℹ (👉 💼, `main.py`). ⚫️ 🔜 ⤴️ ▶️ 💽 ⏮️ 👆 **FastAPI** 📟, ⛔️ 👆 0️⃣, ♒️. 📥 ❔ ⚫️ 💪 👀: fastapi-0.110.3/docs/em/docs/tutorial/dependencies/000077500000000000000000000000001461403617600220655ustar00rootroot00000000000000fastapi-0.110.3/docs/em/docs/tutorial/dependencies/classes-as-dependencies.md000066400000000000000000000137661461403617600271060ustar00rootroot00000000000000# 🎓 🔗 ⏭ 🤿 ⏬ 🔘 **🔗 💉** ⚙️, ➡️ ♻ ⏮️ 🖼. ## `dict` ⚪️➡️ ⏮️ 🖼 ⏮️ 🖼, 👥 🛬 `dict` ⚪️➡️ 👆 🔗 ("☑"): === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/dependencies/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/dependencies/tutorial001_py310.py!} ``` ✋️ ⤴️ 👥 🤚 `dict` 🔢 `commons` *➡ 🛠️ 🔢*. & 👥 💭 👈 👨‍🎨 💪 🚫 🚚 📚 🐕‍🦺 (💖 🛠️) `dict`Ⓜ, ↩️ 👫 💪 🚫 💭 👫 🔑 & 💲 🆎. 👥 💪 👍... ## ⚫️❔ ⚒ 🔗 🆙 🔜 👆 ✔️ 👀 🔗 📣 🔢. ✋️ 👈 🚫 🕴 🌌 📣 🔗 (👐 ⚫️ 🔜 🎲 🌖 ⚠). 🔑 ⚖ 👈 🔗 🔜 "🇧🇲". "**🇧🇲**" 🐍 🕳 👈 🐍 💪 "🤙" 💖 🔢. , 🚥 👆 ✔️ 🎚 `something` (👈 💪 _🚫_ 🔢) & 👆 💪 "🤙" ⚫️ (🛠️ ⚫️) 💖: ```Python something() ``` ⚖️ ```Python something(some_argument, some_keyword_argument="foo") ``` ⤴️ ⚫️ "🇧🇲". ## 🎓 🔗 👆 5️⃣📆 👀 👈 ✍ 👐 🐍 🎓, 👆 ⚙️ 👈 🎏 ❕. 🖼: ```Python class Cat: def __init__(self, name: str): self.name = name fluffy = Cat(name="Mr Fluffy") ``` 👉 💼, `fluffy` 👐 🎓 `Cat`. & ✍ `fluffy`, 👆 "🤙" `Cat`. , 🐍 🎓 **🇧🇲**. ⤴️, **FastAPI**, 👆 💪 ⚙️ 🐍 🎓 🔗. ⚫️❔ FastAPI 🤙 ✅ 👈 ⚫️ "🇧🇲" (🔢, 🎓 ⚖️ 🕳 🙆) & 🔢 🔬. 🚥 👆 🚶‍♀️ "🇧🇲" 🔗 **FastAPI**, ⚫️ 🔜 🔬 🔢 👈 "🇧🇲", & 🛠️ 👫 🎏 🌌 🔢 *➡ 🛠️ 🔢*. ✅ 🎧-🔗. 👈 ✔ 🇧🇲 ⏮️ 🙅‍♂ 🔢 🌐. 🎏 ⚫️ 🔜 *➡ 🛠️ 🔢* ⏮️ 🙅‍♂ 🔢. ⤴️, 👥 💪 🔀 🔗 "☑" `common_parameters` ⚪️➡️ 🔛 🎓 `CommonQueryParams`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="11-15" {!> ../../../docs_src/dependencies/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="9-13" {!> ../../../docs_src/dependencies/tutorial002_py310.py!} ``` 💸 🙋 `__init__` 👩‍🔬 ⚙️ ✍ 👐 🎓: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="12" {!> ../../../docs_src/dependencies/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="10" {!> ../../../docs_src/dependencies/tutorial002_py310.py!} ``` ...⚫️ ✔️ 🎏 🔢 👆 ⏮️ `common_parameters`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/dependencies/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="6" {!> ../../../docs_src/dependencies/tutorial001_py310.py!} ``` 📚 🔢 ⚫️❔ **FastAPI** 🔜 ⚙️ "❎" 🔗. 👯‍♂️ 💼, ⚫️ 🔜 ✔️: * 📦 `q` 🔢 🔢 👈 `str`. * `skip` 🔢 🔢 👈 `int`, ⏮️ 🔢 `0`. * `limit` 🔢 🔢 👈 `int`, ⏮️ 🔢 `100`. 👯‍♂️ 💼 💽 🔜 🗜, ✔, 📄 🔛 🗄 🔗, ♒️. ## ⚙️ ⚫️ 🔜 👆 💪 📣 👆 🔗 ⚙️ 👉 🎓. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="17" {!> ../../../docs_src/dependencies/tutorial002_py310.py!} ``` **FastAPI** 🤙 `CommonQueryParams` 🎓. 👉 ✍ "👐" 👈 🎓 & 👐 🔜 🚶‍♀️ 🔢 `commons` 👆 🔢. ## 🆎 ✍ 🆚 `Depends` 👀 ❔ 👥 ✍ `CommonQueryParams` 🕐 🔛 📟: ```Python commons: CommonQueryParams = Depends(CommonQueryParams) ``` 🏁 `CommonQueryParams`,: ```Python ... = Depends(CommonQueryParams) ``` ...⚫️❔ **FastAPI** 🔜 🤙 ⚙️ 💭 ⚫️❔ 🔗. ⚪️➡️ ⚫️ 👈 FastAPI 🔜 ⚗ 📣 🔢 & 👈 ⚫️❔ FastAPI 🔜 🤙 🤙. --- 👉 💼, 🥇 `CommonQueryParams`,: ```Python commons: CommonQueryParams ... ``` ...🚫 ✔️ 🙆 🎁 🔑 **FastAPI**. FastAPI 🏆 🚫 ⚙️ ⚫️ 💽 🛠️, 🔬, ♒️. (⚫️ ⚙️ `= Depends(CommonQueryParams)` 👈). 👆 💪 🤙 ✍: ```Python commons = Depends(CommonQueryParams) ``` ...: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="17" {!> ../../../docs_src/dependencies/tutorial003_py310.py!} ``` ✋️ 📣 🆎 💡 👈 🌌 👆 👨‍🎨 🔜 💭 ⚫️❔ 🔜 🚶‍♀️ 🔢 `commons`, & ⤴️ ⚫️ 💪 ℹ 👆 ⏮️ 📟 🛠️, 🆎 ✅, ♒️: ## ⌨ ✋️ 👆 👀 👈 👥 ✔️ 📟 🔁 📥, ✍ `CommonQueryParams` 🕐: ```Python commons: CommonQueryParams = Depends(CommonQueryParams) ``` **FastAPI** 🚚 ⌨ 👫 💼, 🌐❔ 🔗 *🎯* 🎓 👈 **FastAPI** 🔜 "🤙" ✍ 👐 🎓 ⚫️. 📚 🎯 💼, 👆 💪 📄: ↩️ ✍: ```Python commons: CommonQueryParams = Depends(CommonQueryParams) ``` ...👆 ✍: ```Python commons: CommonQueryParams = Depends() ``` 👆 📣 🔗 🆎 🔢, & 👆 ⚙️ `Depends()` 🚮 "🔢" 💲 (👈 ⏮️ `=`) 👈 🔢 🔢, 🍵 🙆 🔢 `Depends()`, ↩️ ✔️ ✍ 🌕 🎓 *🔄* 🔘 `Depends(CommonQueryParams)`. 🎏 🖼 🔜 ⤴️ 👀 💖: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial004.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="17" {!> ../../../docs_src/dependencies/tutorial004_py310.py!} ``` ...& **FastAPI** 🔜 💭 ⚫️❔. !!! tip 🚥 👈 😑 🌅 😨 🌘 👍, 🤷‍♂ ⚫️, 👆 🚫 *💪* ⚫️. ⚫️ ⌨. ↩️ **FastAPI** 💅 🔃 🤝 👆 📉 📟 🔁. fastapi-0.110.3/docs/em/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md000066400000000000000000000043041461403617600325350ustar00rootroot00000000000000# 🔗 ➡ 🛠️ 👨‍🎨 💼 👆 🚫 🤙 💪 📨 💲 🔗 🔘 👆 *➡ 🛠️ 🔢*. ⚖️ 🔗 🚫 📨 💲. ✋️ 👆 💪 ⚫️ 🛠️/❎. 📚 💼, ↩️ 📣 *➡ 🛠️ 🔢* 🔢 ⏮️ `Depends`, 👆 💪 🚮 `list` `dependencies` *➡ 🛠️ 👨‍🎨*. ## 🚮 `dependencies` *➡ 🛠️ 👨‍🎨* *➡ 🛠️ 👨‍🎨* 📨 📦 ❌ `dependencies`. ⚫️ 🔜 `list` `Depends()`: ```Python hl_lines="17" {!../../../docs_src/dependencies/tutorial006.py!} ``` 👉 🔗 🔜 🛠️/❎ 🎏 🌌 😐 🔗. ✋️ 👫 💲 (🚥 👫 📨 🙆) 🏆 🚫 🚶‍♀️ 👆 *➡ 🛠️ 🔢*. !!! tip 👨‍🎨 ✅ ♻ 🔢 🔢, & 🎦 👫 ❌. ⚙️ 👉 `dependencies` *➡ 🛠️ 👨‍🎨* 👆 💪 ⚒ 💭 👫 🛠️ ⏪ ❎ 👨‍🎨/🏭 ❌. ⚫️ 💪 ℹ ❎ 😨 🆕 👩‍💻 👈 👀 ♻ 🔢 👆 📟 & 💪 💭 ⚫️ 🙃. !!! info 👉 🖼 👥 ⚙️ 💭 🛃 🎚 `X-Key` & `X-Token`. ✋️ 🎰 💼, 🕐❔ 🛠️ 💂‍♂, 👆 🔜 🤚 🌖 💰 ⚪️➡️ ⚙️ 🛠️ [💂‍♂ 🚙 (⏭ 📃)](../security/index.md){.internal-link target=_blank}. ## 🔗 ❌ & 📨 💲 👆 💪 ⚙️ 🎏 🔗 *🔢* 👆 ⚙️ 🛎. ### 🔗 📄 👫 💪 📣 📨 📄 (💖 🎚) ⚖️ 🎏 🎧-🔗: ```Python hl_lines="6 11" {!../../../docs_src/dependencies/tutorial006.py!} ``` ### 🤚 ⚠ 👫 🔗 💪 `raise` ⚠, 🎏 😐 🔗: ```Python hl_lines="8 13" {!../../../docs_src/dependencies/tutorial006.py!} ``` ### 📨 💲 & 👫 💪 📨 💲 ⚖️ 🚫, 💲 🏆 🚫 ⚙️. , 👆 💪 🏤-⚙️ 😐 🔗 (👈 📨 💲) 👆 ⏪ ⚙️ 👱 🙆, & ✋️ 💲 🏆 🚫 ⚙️, 🔗 🔜 🛠️: ```Python hl_lines="9 14" {!../../../docs_src/dependencies/tutorial006.py!} ``` ## 🔗 👪 *➡ 🛠️* ⏪, 🕐❔ 👂 🔃 ❔ 📊 🦏 🈸 ([🦏 🈸 - 💗 📁](../../tutorial/bigger-applications.md){.internal-link target=_blank}), 🎲 ⏮️ 💗 📁, 👆 🔜 💡 ❔ 📣 👁 `dependencies` 🔢 👪 *➡ 🛠️*. ## 🌐 🔗 ⏭ 👥 🔜 👀 ❔ 🚮 🔗 🎂 `FastAPI` 🈸, 👈 👫 ✔ 🔠 *➡ 🛠️*. fastapi-0.110.3/docs/em/docs/tutorial/dependencies/dependencies-with-yield.md000066400000000000000000000212201461403617600271070ustar00rootroot00000000000000# 🔗 ⏮️ 🌾 FastAPI 🐕‍🦺 🔗 👈 ➕ 🔁 ⏮️ 🏁. 👉, ⚙️ `yield` ↩️ `return`, & ✍ ➕ 🔁 ⏮️. !!! tip ⚒ 💭 ⚙️ `yield` 1️⃣ 👁 🕰. !!! note "📡 ℹ" 🙆 🔢 👈 ☑ ⚙️ ⏮️: * `@contextlib.contextmanager` ⚖️ * `@contextlib.asynccontextmanager` 🔜 ☑ ⚙️ **FastAPI** 🔗. 👐, FastAPI ⚙️ 📚 2️⃣ 👨‍🎨 🔘. ## 💽 🔗 ⏮️ `yield` 🖼, 👆 💪 ⚙️ 👉 ✍ 💽 🎉 & 🔐 ⚫️ ⏮️ 🏁. 🕴 📟 ⏭ & 🔌 `yield` 📄 🛠️ ⏭ 📨 📨: ```Python hl_lines="2-4" {!../../../docs_src/dependencies/tutorial007.py!} ``` 🌾 💲 ⚫️❔ 💉 🔘 *➡ 🛠️* & 🎏 🔗: ```Python hl_lines="4" {!../../../docs_src/dependencies/tutorial007.py!} ``` 📟 📄 `yield` 📄 🛠️ ⏮️ 📨 ✔️ 🚚: ```Python hl_lines="5-6" {!../../../docs_src/dependencies/tutorial007.py!} ``` !!! tip 👆 💪 ⚙️ `async` ⚖️ 😐 🔢. **FastAPI** 🔜 ▶️️ 👜 ⏮️ 🔠, 🎏 ⏮️ 😐 🔗. ## 🔗 ⏮️ `yield` & `try` 🚥 👆 ⚙️ `try` 🍫 🔗 ⏮️ `yield`, 👆 🔜 📨 🙆 ⚠ 👈 🚮 🕐❔ ⚙️ 🔗. 🖼, 🚥 📟 ☝ 🖕, ➕1️⃣ 🔗 ⚖️ *➡ 🛠️*, ⚒ 💽 💵 "💾" ⚖️ ✍ 🙆 🎏 ❌, 👆 🔜 📨 ⚠ 👆 🔗. , 👆 💪 👀 👈 🎯 ⚠ 🔘 🔗 ⏮️ `except SomeException`. 🎏 🌌, 👆 💪 ⚙️ `finally` ⚒ 💭 🚪 📶 🛠️, 🙅‍♂ 🤔 🚥 📤 ⚠ ⚖️ 🚫. ```Python hl_lines="3 5" {!../../../docs_src/dependencies/tutorial007.py!} ``` ## 🎧-🔗 ⏮️ `yield` 👆 💪 ✔️ 🎧-🔗 & "🌲" 🎧-🔗 🙆 📐 & 💠, & 🙆 ⚖️ 🌐 👫 💪 ⚙️ `yield`. **FastAPI** 🔜 ⚒ 💭 👈 "🚪 📟" 🔠 🔗 ⏮️ `yield` 🏃 ☑ ✔. 🖼, `dependency_c` 💪 ✔️ 🔗 🔛 `dependency_b`, & `dependency_b` 🔛 `dependency_a`: ```Python hl_lines="4 12 20" {!../../../docs_src/dependencies/tutorial008.py!} ``` & 🌐 👫 💪 ⚙️ `yield`. 👉 💼 `dependency_c`, 🛠️ 🚮 🚪 📟, 💪 💲 ⚪️➡️ `dependency_b` (📥 📛 `dep_b`) 💪. & , 🔄, `dependency_b` 💪 💲 ⚪️➡️ `dependency_a` (📥 📛 `dep_a`) 💪 🚮 🚪 📟. ```Python hl_lines="16-17 24-25" {!../../../docs_src/dependencies/tutorial008.py!} ``` 🎏 🌌, 👆 💪 ✔️ 🔗 ⏮️ `yield` & `return` 🌀. & 👆 💪 ✔️ 👁 🔗 👈 🚚 📚 🎏 🔗 ⏮️ `yield`, ♒️. 👆 💪 ✔️ 🙆 🌀 🔗 👈 👆 💚. **FastAPI** 🔜 ⚒ 💭 🌐 🏃 ☑ ✔. !!! note "📡 ℹ" 👉 👷 👏 🐍 🔑 👨‍💼. **FastAPI** ⚙️ 👫 🔘 🏆 👉. ## 🔗 ⏮️ `yield` & `HTTPException` 👆 👀 👈 👆 💪 ⚙️ 🔗 ⏮️ `yield` & ✔️ `try` 🍫 👈 ✊ ⚠. ⚫️ 5️⃣📆 😋 🤚 `HTTPException` ⚖️ 🎏 🚪 📟, ⏮️ `yield`. ✋️ **⚫️ 🏆 🚫 👷**. 🚪 📟 🔗 ⏮️ `yield` 🛠️ *⏮️* 📨 📨, [⚠ 🐕‍🦺](../handling-errors.md#_4){.internal-link target=_blank} 🔜 ✔️ ⏪ 🏃. 📤 🕳 😽 ⚠ 🚮 👆 🔗 🚪 📟 (⏮️ `yield`). , 🚥 👆 🤚 `HTTPException` ⏮️ `yield`, 🔢 (⚖️ 🙆 🛃) ⚠ 🐕‍🦺 👈 ✊ `HTTPException`Ⓜ & 📨 🇺🇸🔍 4️⃣0️⃣0️⃣ 📨 🏆 🚫 📤 ✊ 👈 ⚠ 🚫🔜. 👉 ⚫️❔ ✔ 🕳 ⚒ 🔗 (✅ 💽 🎉), 🖼, ⚙️ 🖥 📋. 🖥 📋 🏃 *⏮️* 📨 ✔️ 📨. 📤 🙅‍♂ 🌌 🤚 `HTTPException` ↩️ 📤 🚫 🌌 🔀 📨 👈 *⏪ 📨*. ✋️ 🚥 🖥 📋 ✍ 💽 ❌, 🌘 👆 💪 💾 ⚖️ 😬 🔐 🎉 🔗 ⏮️ `yield`, & 🎲 🕹 ❌ ⚖️ 📄 ⚫️ 🛰 🕵 ⚙️. 🚥 👆 ✔️ 📟 👈 👆 💭 💪 🤚 ⚠, 🏆 😐/"🙃" 👜 & 🚮 `try` 🍫 👈 📄 📟. 🚥 👆 ✔️ 🛃 ⚠ 👈 👆 🔜 💖 🍵 *⏭* 🛬 📨 & 🎲 ❎ 📨, 🎲 🙋‍♀ `HTTPException`, ✍ [🛃 ⚠ 🐕‍🦺](../handling-errors.md#_4){.internal-link target=_blank}. !!! tip 👆 💪 🤚 ⚠ 🔌 `HTTPException` *⏭* `yield`. ✋️ 🚫 ⏮️. 🔁 🛠️ 🌅 ⚖️ 🌘 💖 👉 📊. 🕰 💧 ⚪️➡️ 🔝 🔝. & 🔠 🏓 1️⃣ 🍕 🔗 ⚖️ 🛠️ 📟. ```mermaid sequenceDiagram participant client as Client participant handler as Exception handler participant dep as Dep with yield participant operation as Path Operation participant tasks as Background tasks Note over client,tasks: Can raise exception for dependency, handled after response is sent Note over client,operation: Can raise HTTPException and can change the response client ->> dep: Start request Note over dep: Run code up to yield opt raise dep -->> handler: Raise HTTPException handler -->> client: HTTP error response dep -->> dep: Raise other exception end dep ->> operation: Run dependency, e.g. DB session opt raise operation -->> dep: Raise HTTPException dep -->> handler: Auto forward exception handler -->> client: HTTP error response operation -->> dep: Raise other exception dep -->> handler: Auto forward exception end operation ->> client: Return response to client Note over client,operation: Response is already sent, can't change it anymore opt Tasks operation -->> tasks: Send background tasks end opt Raise other exception tasks -->> dep: Raise other exception end Note over dep: After yield opt Handle other exception dep -->> dep: Handle exception, can't change response. E.g. close DB session. end ``` !!! info 🕴 **1️⃣ 📨** 🔜 📨 👩‍💻. ⚫️ 💪 1️⃣ ❌ 📨 ⚖️ ⚫️ 🔜 📨 ⚪️➡️ *➡ 🛠️*. ⏮️ 1️⃣ 📚 📨 📨, 🙅‍♂ 🎏 📨 💪 📨. !!! tip 👉 📊 🎦 `HTTPException`, ✋️ 👆 💪 🤚 🙆 🎏 ⚠ ❔ 👆 ✍ [🛃 ⚠ 🐕‍🦺](../handling-errors.md#_4){.internal-link target=_blank}. 🚥 👆 🤚 🙆 ⚠, ⚫️ 🔜 🚶‍♀️ 🔗 ⏮️ 🌾, 🔌 `HTTPException`, & ⤴️ **🔄** ⚠ 🐕‍🦺. 🚥 📤 🙅‍♂ ⚠ 🐕‍🦺 👈 ⚠, ⚫️ 🔜 ⤴️ 🍵 🔢 🔗 `ServerErrorMiddleware`, 🛬 5️⃣0️⃣0️⃣ 🇺🇸🔍 👔 📟, ➡️ 👩‍💻 💭 👈 📤 ❌ 💽. ## 🔑 👨‍💼 ### ⚫️❔ "🔑 👨‍💼" "🔑 👨‍💼" 🙆 👈 🐍 🎚 👈 👆 💪 ⚙️ `with` 📄. 🖼, 👆 💪 ⚙️ `with` ✍ 📁: ```Python with open("./somefile.txt") as f: contents = f.read() print(contents) ``` 🔘, `open("./somefile.txt")` ✍ 🎚 👈 🤙 "🔑 👨‍💼". 🕐❔ `with` 🍫 🏁, ⚫️ ⚒ 💭 🔐 📁, 🚥 📤 ⚠. 🕐❔ 👆 ✍ 🔗 ⏮️ `yield`, **FastAPI** 🔜 🔘 🗜 ⚫️ 🔑 👨‍💼, & 🌀 ⚫️ ⏮️ 🎏 🔗 🧰. ### ⚙️ 🔑 👨‍💼 🔗 ⏮️ `yield` !!! warning 👉, 🌅 ⚖️ 🌘, "🏧" 💭. 🚥 👆 ▶️ ⏮️ **FastAPI** 👆 💪 💚 🚶 ⚫️ 🔜. 🐍, 👆 💪 ✍ 🔑 👨‍💼 🏗 🎓 ⏮️ 2️⃣ 👩‍🔬: `__enter__()` & `__exit__()`. 👆 💪 ⚙️ 👫 🔘 **FastAPI** 🔗 ⏮️ `yield` ⚙️ `with` ⚖️ `async with` 📄 🔘 🔗 🔢: ```Python hl_lines="1-9 13" {!../../../docs_src/dependencies/tutorial010.py!} ``` !!! tip ➕1️⃣ 🌌 ✍ 🔑 👨‍💼 ⏮️: * `@contextlib.contextmanager` ⚖️ * `@contextlib.asynccontextmanager` ⚙️ 👫 🎀 🔢 ⏮️ 👁 `yield`. 👈 ⚫️❔ **FastAPI** ⚙️ 🔘 🔗 ⏮️ `yield`. ✋️ 👆 🚫 ✔️ ⚙️ 👨‍🎨 FastAPI 🔗 (& 👆 🚫🔜 🚫). FastAPI 🔜 ⚫️ 👆 🔘. fastapi-0.110.3/docs/em/docs/tutorial/dependencies/global-dependencies.md000066400000000000000000000014741461403617600263010ustar00rootroot00000000000000# 🌐 🔗 🆎 🈸 👆 💪 💚 🚮 🔗 🎂 🈸. 🎏 🌌 👆 💪 [🚮 `dependencies` *➡ 🛠️ 👨‍🎨*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, 👆 💪 🚮 👫 `FastAPI` 🈸. 👈 💼, 👫 🔜 ✔ 🌐 *➡ 🛠️* 🈸: ```Python hl_lines="15" {!../../../docs_src/dependencies/tutorial012.py!} ``` & 🌐 💭 📄 🔃 [❎ `dependencies` *➡ 🛠️ 👨‍🎨*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} ✔, ✋️ 👉 💼, 🌐 *➡ 🛠️* 📱. ## 🔗 👪 *➡ 🛠️* ⏪, 🕐❔ 👂 🔃 ❔ 📊 🦏 🈸 ([🦏 🈸 - 💗 📁](../../tutorial/bigger-applications.md){.internal-link target=_blank}), 🎲 ⏮️ 💗 📁, 👆 🔜 💡 ❔ 📣 👁 `dependencies` 🔢 👪 *➡ 🛠️*. fastapi-0.110.3/docs/em/docs/tutorial/dependencies/index.md000066400000000000000000000153341461403617600235240ustar00rootroot00000000000000# 🔗 **FastAPI** ✔️ 📶 🏋️ ✋️ 🏋️ **🔗 💉** ⚙️. ⚫️ 🏗 📶 🙅 ⚙️, & ⚒ ⚫️ 📶 ⏩ 🙆 👩‍💻 🛠️ 🎏 🦲 ⏮️ **FastAPI**. ## ⚫️❔ "🔗 💉" **"🔗 💉"** ⛓, 📋, 👈 📤 🌌 👆 📟 (👉 💼, 👆 *➡ 🛠️ 🔢*) 📣 👜 👈 ⚫️ 🚚 👷 & ⚙️: "🔗". & ⤴️, 👈 ⚙️ (👉 💼 **FastAPI**) 🔜 ✊ 💅 🔨 ⚫️❔ 💪 🚚 👆 📟 ⏮️ 📚 💪 🔗 ("💉" 🔗). 👉 📶 ⚠ 🕐❔ 👆 💪: * ✔️ 💰 ⚛ (🎏 📟 ⚛ 🔄 & 🔄). * 💰 💽 🔗. * 🛠️ 💂‍♂, 🤝, 🔑 📄, ♒️. * & 📚 🎏 👜... 🌐 👫, ⏪ 📉 📟 🔁. ## 🥇 🔁 ➡️ 👀 📶 🙅 🖼. ⚫️ 🔜 🙅 👈 ⚫️ 🚫 📶 ⚠, 🔜. ✋️ 👉 🌌 👥 💪 🎯 🔛 ❔ **🔗 💉** ⚙️ 👷. ### ✍ 🔗, ⚖️ "☑" ➡️ 🥇 🎯 🔛 🔗. ⚫️ 🔢 👈 💪 ✊ 🌐 🎏 🔢 👈 *➡ 🛠️ 🔢* 💪 ✊: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="8-11" {!> ../../../docs_src/dependencies/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="6-7" {!> ../../../docs_src/dependencies/tutorial001_py310.py!} ``` 👈 ⚫️. **2️⃣ ⏸**. & ⚫️ ✔️ 🎏 💠 & 📊 👈 🌐 👆 *➡ 🛠️ 🔢* ✔️. 👆 💪 💭 ⚫️ *➡ 🛠️ 🔢* 🍵 "👨‍🎨" (🍵 `@app.get("/some-path")`). & ⚫️ 💪 📨 🕳 👆 💚. 👉 💼, 👉 🔗 ⌛: * 📦 🔢 🔢 `q` 👈 `str`. * 📦 🔢 🔢 `skip` 👈 `int`, & 🔢 `0`. * 📦 🔢 🔢 `limit` 👈 `int`, & 🔢 `100`. & ⤴️ ⚫️ 📨 `dict` ⚗ 📚 💲. ### 🗄 `Depends` === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="3" {!> ../../../docs_src/dependencies/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="1" {!> ../../../docs_src/dependencies/tutorial001_py310.py!} ``` ### 📣 🔗, "⚓️" 🎏 🌌 👆 ⚙️ `Body`, `Query`, ♒️. ⏮️ 👆 *➡ 🛠️ 🔢* 🔢, ⚙️ `Depends` ⏮️ 🆕 🔢: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="15 20" {!> ../../../docs_src/dependencies/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="11 16" {!> ../../../docs_src/dependencies/tutorial001_py310.py!} ``` 👐 👆 ⚙️ `Depends` 🔢 👆 🔢 🎏 🌌 👆 ⚙️ `Body`, `Query`, ♒️, `Depends` 👷 👄 🎏. 👆 🕴 🤝 `Depends` 👁 🔢. 👉 🔢 🔜 🕳 💖 🔢. & 👈 🔢 ✊ 🔢 🎏 🌌 👈 *➡ 🛠️ 🔢* . !!! tip 👆 🔜 👀 ⚫️❔ 🎏 "👜", ↖️ ⚪️➡️ 🔢, 💪 ⚙️ 🔗 ⏭ 📃. 🕐❔ 🆕 📨 🛬, **FastAPI** 🔜 ✊ 💅: * 🤙 👆 🔗 ("☑") 🔢 ⏮️ ☑ 🔢. * 🤚 🏁 ⚪️➡️ 👆 🔢. * 🛠️ 👈 🏁 🔢 👆 *➡ 🛠️ 🔢*. ```mermaid graph TB common_parameters(["common_parameters"]) read_items["/items/"] read_users["/users/"] common_parameters --> read_items common_parameters --> read_users ``` 👉 🌌 👆 ✍ 🔗 📟 🕐 & **FastAPI** ✊ 💅 🤙 ⚫️ 👆 *➡ 🛠️*. !!! check 👀 👈 👆 🚫 ✔️ ✍ 🎁 🎓 & 🚶‍♀️ ⚫️ 👱 **FastAPI** "®" ⚫️ ⚖️ 🕳 🎏. 👆 🚶‍♀️ ⚫️ `Depends` & **FastAPI** 💭 ❔ 🎂. ## `async` ⚖️ 🚫 `async` 🔗 🔜 🤙 **FastAPI** (🎏 👆 *➡ 🛠️ 🔢*), 🎏 🚫 ✔ ⏪ 🔬 👆 🔢. 👆 💪 ⚙️ `async def` ⚖️ 😐 `def`. & 👆 💪 📣 🔗 ⏮️ `async def` 🔘 😐 `def` *➡ 🛠️ 🔢*, ⚖️ `def` 🔗 🔘 `async def` *➡ 🛠️ 🔢*, ♒️. ⚫️ 🚫 🤔. **FastAPI** 🔜 💭 ⚫️❔. !!! note 🚥 👆 🚫 💭, ✅ [🔁: *"🏃 ❓" *](../../async.md){.internal-link target=_blank} 📄 🔃 `async` & `await` 🩺. ## 🛠️ ⏮️ 🗄 🌐 📨 📄, 🔬 & 📄 👆 🔗 (& 🎧-🔗) 🔜 🛠️ 🎏 🗄 🔗. , 🎓 🩺 🔜 ✔️ 🌐 ℹ ⚪️➡️ 👫 🔗 💁‍♂️: ## 🙅 ⚙️ 🚥 👆 👀 ⚫️, *➡ 🛠️ 🔢* 📣 ⚙️ 🕐❔ *➡* & *🛠️* 🏏, & ⤴️ **FastAPI** ✊ 💅 🤙 🔢 ⏮️ ☑ 🔢, ❎ 📊 ⚪️➡️ 📨. 🤙, 🌐 (⚖️ 🏆) 🕸 🛠️ 👷 👉 🎏 🌌. 👆 🙅 🤙 👈 🔢 🔗. 👫 🤙 👆 🛠️ (👉 💼, **FastAPI**). ⏮️ 🔗 💉 ⚙️, 👆 💪 💬 **FastAPI** 👈 👆 *➡ 🛠️ 🔢* "🪀" 🔛 🕳 🙆 👈 🔜 🛠️ ⏭ 👆 *➡ 🛠️ 🔢*, & **FastAPI** 🔜 ✊ 💅 🛠️ ⚫️ & "💉" 🏁. 🎏 ⚠ ⚖ 👉 🎏 💭 "🔗 💉": * ℹ * 🐕‍🦺 * 🐕‍🦺 * 💉 * 🦲 ## **FastAPI** 🔌-🔌 🛠️ & "🔌-"Ⓜ 💪 🏗 ⚙️ **🔗 💉** ⚙️. ✋️ 👐, 📤 🤙 **🙅‍♂ 💪 ✍ "🔌-🔌"**, ⚙️ 🔗 ⚫️ 💪 📣 ♾ 🔢 🛠️ & 🔗 👈 ▶️️ 💪 👆 *➡ 🛠️ 🔢*. & 🔗 💪 ✍ 📶 🙅 & 🏋️ 🌌 👈 ✔ 👆 🗄 🐍 📦 👆 💪, & 🛠️ 👫 ⏮️ 👆 🛠️ 🔢 👩‍❤‍👨 ⏸ 📟, *🌖*. 👆 🔜 👀 🖼 👉 ⏭ 📃, 🔃 🔗 & ☁ 💽, 💂‍♂, ♒️. ## **FastAPI** 🔗 🦁 🔗 💉 ⚙️ ⚒ **FastAPI** 🔗 ⏮️: * 🌐 🔗 💽 * ☁ 💽 * 🔢 📦 * 🔢 🔗 * 🤝 & ✔ ⚙️ * 🛠️ ⚙️ ⚖ ⚙️ * 📨 💽 💉 ⚙️ * ♒️. ## 🙅 & 🏋️ 👐 🔗 🔗 💉 ⚙️ 📶 🙅 🔬 & ⚙️, ⚫️ 📶 🏋️. 👆 💪 🔬 🔗 👈 🔄 💪 🔬 🔗 👫. 🔚, 🔗 🌲 🔗 🏗, & **🔗 💉** ⚙️ ✊ 💅 🔬 🌐 👉 🔗 👆 (& 👫 🎧-🔗) & 🚚 (💉) 🏁 🔠 🔁. 🖼, ➡️ 💬 👆 ✔️ 4️⃣ 🛠️ 🔗 (*➡ 🛠️*): * `/items/public/` * `/items/private/` * `/users/{user_id}/activate` * `/items/pro/` ⤴️ 👆 💪 🚮 🎏 ✔ 📄 🔠 👫 ⏮️ 🔗 & 🎧-🔗: ```mermaid graph TB current_user(["current_user"]) active_user(["active_user"]) admin_user(["admin_user"]) paying_user(["paying_user"]) public["/items/public/"] private["/items/private/"] activate_user["/users/{user_id}/activate"] pro_items["/items/pro/"] current_user --> active_user active_user --> admin_user active_user --> paying_user current_user --> public active_user --> private admin_user --> activate_user paying_user --> pro_items ``` ## 🛠️ ⏮️ **🗄** 🌐 👫 🔗, ⏪ 📣 👫 📄, 🚮 🔢, 🔬, ♒️. 👆 *➡ 🛠️*. **FastAPI** 🔜 ✊ 💅 🚮 ⚫️ 🌐 🗄 🔗, 👈 ⚫️ 🎦 🎓 🧾 ⚙️. fastapi-0.110.3/docs/em/docs/tutorial/dependencies/sub-dependencies.md000066400000000000000000000065061461403617600256330ustar00rootroot00000000000000# 🎧-🔗 👆 💪 ✍ 🔗 👈 ✔️ **🎧-🔗**. 👫 💪 **⏬** 👆 💪 👫. **FastAPI** 🔜 ✊ 💅 🔬 👫. ## 🥇 🔗 "☑" 👆 💪 ✍ 🥇 🔗 ("☑") 💖: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="8-9" {!> ../../../docs_src/dependencies/tutorial005.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="6-7" {!> ../../../docs_src/dependencies/tutorial005_py310.py!} ``` ⚫️ 📣 📦 🔢 🔢 `q` `str`, & ⤴️ ⚫️ 📨 ⚫️. 👉 🙅 (🚫 📶 ⚠), ✋️ 🔜 ℹ 👥 🎯 🔛 ❔ 🎧-🔗 👷. ## 🥈 🔗, "☑" & "⚓️" ⤴️ 👆 💪 ✍ ➕1️⃣ 🔗 🔢 ("☑") 👈 🎏 🕰 📣 🔗 🚮 👍 (⚫️ "⚓️" 💁‍♂️): === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="13" {!> ../../../docs_src/dependencies/tutorial005.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="11" {!> ../../../docs_src/dependencies/tutorial005_py310.py!} ``` ➡️ 🎯 🔛 🔢 📣: * ✋️ 👉 🔢 🔗 ("☑") ⚫️, ⚫️ 📣 ➕1️⃣ 🔗 (⚫️ "🪀" 🔛 🕳 🙆). * ⚫️ 🪀 🔛 `query_extractor`, & 🛠️ 💲 📨 ⚫️ 🔢 `q`. * ⚫️ 📣 📦 `last_query` 🍪, `str`. * 🚥 👩‍💻 🚫 🚚 🙆 🔢 `q`, 👥 ⚙️ 🏁 🔢 ⚙️, ❔ 👥 🖊 🍪 ⏭. ## ⚙️ 🔗 ⤴️ 👥 💪 ⚙️ 🔗 ⏮️: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="22" {!> ../../../docs_src/dependencies/tutorial005.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="19" {!> ../../../docs_src/dependencies/tutorial005_py310.py!} ``` !!! info 👀 👈 👥 🕴 📣 1️⃣ 🔗 *➡ 🛠️ 🔢*, `query_or_cookie_extractor`. ✋️ **FastAPI** 🔜 💭 👈 ⚫️ ✔️ ❎ `query_extractor` 🥇, 🚶‍♀️ 🏁 👈 `query_or_cookie_extractor` ⏪ 🤙 ⚫️. ```mermaid graph TB query_extractor(["query_extractor"]) query_or_cookie_extractor(["query_or_cookie_extractor"]) read_query["/items/"] query_extractor --> query_or_cookie_extractor --> read_query ``` ## ⚙️ 🎏 🔗 💗 🕰 🚥 1️⃣ 👆 🔗 📣 💗 🕰 🎏 *➡ 🛠️*, 🖼, 💗 🔗 ✔️ ⚠ 🎧-🔗, **FastAPI** 🔜 💭 🤙 👈 🎧-🔗 🕴 🕐 📍 📨. & ⚫️ 🔜 🖊 📨 💲 "💾" & 🚶‍♀️ ⚫️ 🌐 "⚓️" 👈 💪 ⚫️ 👈 🎯 📨, ↩️ 🤙 🔗 💗 🕰 🎏 📨. 🏧 😐 🌐❔ 👆 💭 👆 💪 🔗 🤙 🔠 🔁 (🎲 💗 🕰) 🎏 📨 ↩️ ⚙️ "💾" 💲, 👆 💪 ⚒ 🔢 `use_cache=False` 🕐❔ ⚙️ `Depends`: ```Python hl_lines="1" async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)): return {"fresh_value": fresh_value} ``` ## 🌃 ↖️ ⚪️➡️ 🌐 🎀 🔤 ⚙️ 📥, **🔗 💉** ⚙️ 🙅. 🔢 👈 👀 🎏 *➡ 🛠️ 🔢*. ✋️, ⚫️ 📶 🏋️, & ✔ 👆 📣 🎲 🙇 🐦 🔗 "📊" (🌲). !!! tip 🌐 👉 💪 🚫 😑 ⚠ ⏮️ 👫 🙅 🖼. ✋️ 👆 🔜 👀 ❔ ⚠ ⚫️ 📃 🔃 **💂‍♂**. & 👆 🔜 👀 💸 📟 ⚫️ 🔜 🖊 👆. fastapi-0.110.3/docs/em/docs/tutorial/encoder.md000066400000000000000000000030121461403617600213740ustar00rootroot00000000000000# 🎻 🔗 🔢 📤 💼 🌐❔ 👆 5️⃣📆 💪 🗜 💽 🆎 (💖 Pydantic 🏷) 🕳 🔗 ⏮️ 🎻 (💖 `dict`, `list`, ♒️). 🖼, 🚥 👆 💪 🏪 ⚫️ 💽. 👈, **FastAPI** 🚚 `jsonable_encoder()` 🔢. ## ⚙️ `jsonable_encoder` ➡️ 🌈 👈 👆 ✔️ 💽 `fake_db` 👈 🕴 📨 🎻 🔗 💽. 🖼, ⚫️ 🚫 📨 `datetime` 🎚, 👈 🚫 🔗 ⏮️ 🎻. , `datetime` 🎚 🔜 ✔️ 🗜 `str` ⚗ 💽 💾 📁. 🎏 🌌, 👉 💽 🚫🔜 📨 Pydantic 🏷 (🎚 ⏮️ 🔢), 🕴 `dict`. 👆 💪 ⚙️ `jsonable_encoder` 👈. ⚫️ 📨 🎚, 💖 Pydantic 🏷, & 📨 🎻 🔗 ⏬: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="5 22" {!> ../../../docs_src/encoder/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="4 21" {!> ../../../docs_src/encoder/tutorial001_py310.py!} ``` 👉 🖼, ⚫️ 🔜 🗜 Pydantic 🏷 `dict`, & `datetime` `str`. 🏁 🤙 ⚫️ 🕳 👈 💪 🗜 ⏮️ 🐍 🐩 `json.dumps()`. ⚫️ 🚫 📨 ⭕ `str` ⚗ 💽 🎻 📁 (🎻). ⚫️ 📨 🐍 🐩 💽 📊 (✅ `dict`) ⏮️ 💲 & 🎧-💲 👈 🌐 🔗 ⏮️ 🎻. !!! note `jsonable_encoder` 🤙 ⚙️ **FastAPI** 🔘 🗜 💽. ✋️ ⚫️ ⚠ 📚 🎏 😐. fastapi-0.110.3/docs/em/docs/tutorial/extra-data-types.md000066400000000000000000000052071461403617600231610ustar00rootroot00000000000000# ➕ 💽 🆎 🆙 🔜, 👆 ✔️ ⚙️ ⚠ 📊 🆎, 💖: * `int` * `float` * `str` * `bool` ✋️ 👆 💪 ⚙️ 🌅 🏗 📊 🆎. & 👆 🔜 ✔️ 🎏 ⚒ 👀 🆙 🔜: * 👑 👨‍🎨 🐕‍🦺. * 💽 🛠️ ⚪️➡️ 📨 📨. * 💽 🛠️ 📨 💽. * 💽 🔬. * 🏧 ✍ & 🧾. ## 🎏 💽 🆎 📥 🌖 📊 🆎 👆 💪 ⚙️: * `UUID`: * 🐩 "⭐ 😍 🆔", ⚠ 🆔 📚 💽 & ⚙️. * 📨 & 📨 🔜 🎨 `str`. * `datetime.datetime`: * 🐍 `datetime.datetime`. * 📨 & 📨 🔜 🎨 `str` 💾 8️⃣6️⃣0️⃣1️⃣ 📁, 💖: `2008-09-15T15:53:00+05:00`. * `datetime.date`: * 🐍 `datetime.date`. * 📨 & 📨 🔜 🎨 `str` 💾 8️⃣6️⃣0️⃣1️⃣ 📁, 💖: `2008-09-15`. * `datetime.time`: * 🐍 `datetime.time`. * 📨 & 📨 🔜 🎨 `str` 💾 8️⃣6️⃣0️⃣1️⃣ 📁, 💖: `14:23:55.003`. * `datetime.timedelta`: * 🐍 `datetime.timedelta`. * 📨 & 📨 🔜 🎨 `float` 🌐 🥈. * Pydantic ✔ 🎦 ⚫️ "💾 8️⃣6️⃣0️⃣1️⃣ 🕰 ➕ 🔢", 👀 🩺 🌅 ℹ. * `frozenset`: * 📨 & 📨, 😥 🎏 `set`: * 📨, 📇 🔜 ✍, ❎ ❎ & 🏭 ⚫️ `set`. * 📨, `set` 🔜 🗜 `list`. * 🏗 🔗 🔜 ✔ 👈 `set` 💲 😍 (⚙️ 🎻 🔗 `uniqueItems`). * `bytes`: * 🐩 🐍 `bytes`. * 📨 & 📨 🔜 😥 `str`. * 🏗 🔗 🔜 ✔ 👈 ⚫️ `str` ⏮️ `binary` "📁". * `Decimal`: * 🐩 🐍 `Decimal`. * 📨 & 📨, 🍵 🎏 `float`. * 👆 💪 ✅ 🌐 ☑ Pydantic 📊 🆎 📥: Pydantic 📊 🆎. ## 🖼 📥 🖼 *➡ 🛠️* ⏮️ 🔢 ⚙️ 🔛 🆎. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="1 3 12-16" {!> ../../../docs_src/extra_data_types/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="1 2 11-15" {!> ../../../docs_src/extra_data_types/tutorial001_py310.py!} ``` 🗒 👈 🔢 🔘 🔢 ✔️ 👫 🐠 💽 🆎, & 👆 💪, 🖼, 🎭 😐 📅 🎭, 💖: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="18-19" {!> ../../../docs_src/extra_data_types/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="17-18" {!> ../../../docs_src/extra_data_types/tutorial001_py310.py!} ``` fastapi-0.110.3/docs/em/docs/tutorial/extra-models.md000066400000000000000000000155171461403617600223760ustar00rootroot00000000000000# ➕ 🏷 ▶️ ⏮️ ⏮️ 🖼, ⚫️ 🔜 ⚠ ✔️ 🌅 🌘 1️⃣ 🔗 🏷. 👉 ✴️ 💼 👩‍💻 🏷, ↩️: * **🔢 🏷** 💪 💪 ✔️ 🔐. * **🔢 🏷** 🔜 🚫 ✔️ 🔐. * **💽 🏷** 🔜 🎲 💪 ✔️ #️⃣ 🔐. !!! danger 🙅 🏪 👩‍💻 🔢 🔐. 🕧 🏪 "🔐 #️⃣" 👈 👆 💪 ⤴️ ✔. 🚥 👆 🚫 💭, 👆 🔜 💡 ⚫️❔ "🔐#️⃣" [💂‍♂ 📃](security/simple-oauth2.md#_4){.internal-link target=_blank}. ## 💗 🏷 📥 🏢 💭 ❔ 🏷 💪 👀 💖 ⏮️ 👫 🔐 🏑 & 🥉 🌐❔ 👫 ⚙️: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9 11 16 22 24 29-30 33-35 40-41" {!> ../../../docs_src/extra_models/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7 9 14 20 22 27-28 31-33 38-39" {!> ../../../docs_src/extra_models/tutorial001_py310.py!} ``` ### 🔃 `**user_in.dict()` #### Pydantic `.dict()` `user_in` Pydantic 🏷 🎓 `UserIn`. Pydantic 🏷 ✔️ `.dict()` 👩‍🔬 👈 📨 `dict` ⏮️ 🏷 💽. , 🚥 👥 ✍ Pydantic 🎚 `user_in` 💖: ```Python user_in = UserIn(username="john", password="secret", email="john.doe@example.com") ``` & ⤴️ 👥 🤙: ```Python user_dict = user_in.dict() ``` 👥 🔜 ✔️ `dict` ⏮️ 💽 🔢 `user_dict` (⚫️ `dict` ↩️ Pydantic 🏷 🎚). & 🚥 👥 🤙: ```Python print(user_dict) ``` 👥 🔜 🤚 🐍 `dict` ⏮️: ```Python { 'username': 'john', 'password': 'secret', 'email': 'john.doe@example.com', 'full_name': None, } ``` #### 🎁 `dict` 🚥 👥 ✊ `dict` 💖 `user_dict` & 🚶‍♀️ ⚫️ 🔢 (⚖️ 🎓) ⏮️ `**user_dict`, 🐍 🔜 "🎁" ⚫️. ⚫️ 🔜 🚶‍♀️ 🔑 & 💲 `user_dict` 🔗 🔑-💲 ❌. , ▶️ ⏮️ `user_dict` ⚪️➡️ 🔛, ✍: ```Python UserInDB(**user_dict) ``` 🔜 🏁 🕳 🌓: ```Python UserInDB( username="john", password="secret", email="john.doe@example.com", full_name=None, ) ``` ⚖️ 🌅 ⚫️❔, ⚙️ `user_dict` 🔗, ⏮️ ⚫️❔ 🎚 ⚫️ 💪 ✔️ 🔮: ```Python UserInDB( username = user_dict["username"], password = user_dict["password"], email = user_dict["email"], full_name = user_dict["full_name"], ) ``` #### Pydantic 🏷 ⚪️➡️ 🎚 ➕1️⃣ 🖼 🔛 👥 🤚 `user_dict` ⚪️➡️ `user_in.dict()`, 👉 📟: ```Python user_dict = user_in.dict() UserInDB(**user_dict) ``` 🔜 🌓: ```Python UserInDB(**user_in.dict()) ``` ...↩️ `user_in.dict()` `dict`, & ⤴️ 👥 ⚒ 🐍 "🎁" ⚫️ 🚶‍♀️ ⚫️ `UserInDB` 🔠 ⏮️ `**`. , 👥 🤚 Pydantic 🏷 ⚪️➡️ 💽 ➕1️⃣ Pydantic 🏷. #### 🎁 `dict` & ➕ 🇨🇻 & ⤴️ ❎ ➕ 🇨🇻 ❌ `hashed_password=hashed_password`, 💖: ```Python UserInDB(**user_in.dict(), hashed_password=hashed_password) ``` ...🔚 🆙 💆‍♂ 💖: ```Python UserInDB( username = user_dict["username"], password = user_dict["password"], email = user_dict["email"], full_name = user_dict["full_name"], hashed_password = hashed_password, ) ``` !!! warning 🔗 🌖 🔢 🤖 💪 💧 💽, ✋️ 👫 ↗️ 🚫 🚚 🙆 🎰 💂‍♂. ## 📉 ❎ 📉 📟 ❎ 1️⃣ 🐚 💭 **FastAPI**. 📟 ❎ 📈 🤞 🐛, 💂‍♂ ❔, 📟 🔁 ❔ (🕐❔ 👆 ℹ 1️⃣ 🥉 ✋️ 🚫 🎏), ♒️. & 👉 🏷 🌐 🤝 📚 💽 & ❎ 🔢 📛 & 🆎. 👥 💪 👻. 👥 💪 📣 `UserBase` 🏷 👈 🍦 🧢 👆 🎏 🏷. & ⤴️ 👥 💪 ⚒ 🏿 👈 🏷 👈 😖 🚮 🔢 (🆎 📄, 🔬, ♒️). 🌐 💽 🛠️, 🔬, 🧾, ♒️. 🔜 👷 🛎. 👈 🌌, 👥 💪 📣 🔺 🖖 🏷 (⏮️ 🔢 `password`, ⏮️ `hashed_password` & 🍵 🔐): === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9 15-16 19-20 23-24" {!> ../../../docs_src/extra_models/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7 13-14 17-18 21-22" {!> ../../../docs_src/extra_models/tutorial002_py310.py!} ``` ## `Union` ⚖️ `anyOf` 👆 💪 📣 📨 `Union` 2️⃣ 🆎, 👈 ⛓, 👈 📨 🔜 🙆 2️⃣. ⚫️ 🔜 🔬 🗄 ⏮️ `anyOf`. 👈, ⚙️ 🐩 🐍 🆎 🔑 `typing.Union`: !!! note 🕐❔ ⚖ `Union`, 🔌 🏆 🎯 🆎 🥇, ⏩ 🌘 🎯 🆎. 🖼 🔛, 🌖 🎯 `PlaneItem` 👟 ⏭ `CarItem` `Union[PlaneItem, CarItem]`. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="1 14-15 18-20 33" {!> ../../../docs_src/extra_models/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="1 14-15 18-20 33" {!> ../../../docs_src/extra_models/tutorial003_py310.py!} ``` ### `Union` 🐍 3️⃣.1️⃣0️⃣ 👉 🖼 👥 🚶‍♀️ `Union[PlaneItem, CarItem]` 💲 ❌ `response_model`. ↩️ 👥 🚶‍♀️ ⚫️ **💲 ❌** ↩️ 🚮 ⚫️ **🆎 ✍**, 👥 ✔️ ⚙️ `Union` 🐍 3️⃣.1️⃣0️⃣. 🚥 ⚫️ 🆎 ✍ 👥 💪 ✔️ ⚙️ ⏸ ⏸,: ```Python some_variable: PlaneItem | CarItem ``` ✋️ 🚥 👥 🚮 👈 `response_model=PlaneItem | CarItem` 👥 🔜 🤚 ❌, ↩️ 🐍 🔜 🔄 🎭 **❌ 🛠️** 🖖 `PlaneItem` & `CarItem` ↩️ 🔬 👈 🆎 ✍. ## 📇 🏷 🎏 🌌, 👆 💪 📣 📨 📇 🎚. 👈, ⚙️ 🐩 🐍 `typing.List` (⚖️ `list` 🐍 3️⃣.9️⃣ & 🔛): === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="1 20" {!> ../../../docs_src/extra_models/tutorial004.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="18" {!> ../../../docs_src/extra_models/tutorial004_py39.py!} ``` ## 📨 ⏮️ ❌ `dict` 👆 💪 📣 📨 ⚙️ ✅ ❌ `dict`, 📣 🆎 🔑 & 💲, 🍵 ⚙️ Pydantic 🏷. 👉 ⚠ 🚥 👆 🚫 💭 ☑ 🏑/🔢 📛 (👈 🔜 💪 Pydantic 🏷) ⏪. 👉 💼, 👆 💪 ⚙️ `typing.Dict` (⚖️ `dict` 🐍 3️⃣.9️⃣ & 🔛): === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="1 8" {!> ../../../docs_src/extra_models/tutorial005.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="6" {!> ../../../docs_src/extra_models/tutorial005_py39.py!} ``` ## 🌃 ⚙️ 💗 Pydantic 🏷 & 😖 ➡ 🔠 💼. 👆 🚫 💪 ✔️ 👁 💽 🏷 📍 👨‍💼 🚥 👈 👨‍💼 🔜 💪 ✔️ 🎏 "🇵🇸". 💼 ⏮️ 👩‍💻 "👨‍💼" ⏮️ 🇵🇸 ✅ `password`, `password_hash` & 🙅‍♂ 🔐. fastapi-0.110.3/docs/em/docs/tutorial/first-steps.md000066400000000000000000000201211461403617600222400ustar00rootroot00000000000000# 🥇 🔁 🙅 FastAPI 📁 💪 👀 💖 👉: ```Python {!../../../docs_src/first_steps/tutorial001.py!} ``` 📁 👈 📁 `main.py`. 🏃 🖖 💽:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [28720] INFO: Started server process [28722] INFO: Waiting for application startup. INFO: Application startup complete. ```
!!! note 📋 `uvicorn main:app` 🔗: * `main`: 📁 `main.py` (🐍 "🕹"). * `app`: 🎚 ✍ 🔘 `main.py` ⏮️ ⏸ `app = FastAPI()`. * `--reload`: ⚒ 💽 ⏏ ⏮️ 📟 🔀. 🕴 ⚙️ 🛠️. 🔢, 📤 ⏸ ⏮️ 🕳 💖: ```hl_lines="4" INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` 👈 ⏸ 🎦 📛 🌐❔ 👆 📱 ➖ 🍦, 👆 🇧🇿 🎰. ### ✅ ⚫️ 📂 👆 🖥 http://127.0.0.1:8000. 👆 🔜 👀 🎻 📨: ```JSON {"message": "Hello World"} ``` ### 🎓 🛠️ 🩺 🔜 🚶 http://127.0.0.1:8000/docs. 👆 🔜 👀 🏧 🎓 🛠️ 🧾 (🚚 🦁 🎚): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### 🎛 🛠️ 🩺 & 🔜, 🚶 http://127.0.0.1:8000/redoc. 👆 🔜 👀 🎛 🏧 🧾 (🚚 📄): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ### 🗄 **FastAPI** 🏗 "🔗" ⏮️ 🌐 👆 🛠️ ⚙️ **🗄** 🐩 ⚖ 🔗. #### "🔗" "🔗" 🔑 ⚖️ 📛 🕳. 🚫 📟 👈 🛠️ ⚫️, ✋️ 📝 📛. #### 🛠️ "🔗" 👉 💼, 🗄 🔧 👈 🤔 ❔ 🔬 🔗 👆 🛠️. 👉 🔗 🔑 🔌 👆 🛠️ ➡, 💪 🔢 👫 ✊, ♒️. #### 💽 "🔗" ⚖ "🔗" 💪 🔗 💠 💽, 💖 🎻 🎚. 👈 💼, ⚫️ 🔜 ⛓ 🎻 🔢, & 📊 🆎 👫 ✔️, ♒️. #### 🗄 & 🎻 🔗 🗄 🔬 🛠️ 🔗 👆 🛠️. & 👈 🔗 🔌 🔑 (⚖️ "🔗") 📊 📨 & 📨 👆 🛠️ ⚙️ **🎻 🔗**, 🐩 🎻 📊 🔗. #### ✅ `openapi.json` 🚥 👆 😟 🔃 ❔ 🍣 🗄 🔗 👀 💖, FastAPI 🔁 🏗 🎻 (🔗) ⏮️ 📛 🌐 👆 🛠️. 👆 💪 👀 ⚫️ 🔗: http://127.0.0.1:8000/openapi.json. ⚫️ 🔜 🎦 🎻 ▶️ ⏮️ 🕳 💖: ```JSON { "openapi": "3.0.2", "info": { "title": "FastAPI", "version": "0.1.0" }, "paths": { "/items/": { "get": { "responses": { "200": { "description": "Successful Response", "content": { "application/json": { ... ``` #### ⚫️❔ 🗄 🗄 🔗 ⚫️❔ 🏋️ 2️⃣ 🎓 🧾 ⚙️ 🔌. & 📤 💯 🎛, 🌐 ⚓️ 🔛 🗄. 👆 💪 💪 🚮 🙆 📚 🎛 👆 🈸 🏗 ⏮️ **FastAPI**. 👆 💪 ⚙️ ⚫️ 🏗 📟 🔁, 👩‍💻 👈 🔗 ⏮️ 👆 🛠️. 🖼, 🕸, 📱 ⚖️ ☁ 🈸. ## 🌃, 🔁 🔁 ### 🔁 1️⃣: 🗄 `FastAPI` ```Python hl_lines="1" {!../../../docs_src/first_steps/tutorial001.py!} ``` `FastAPI` 🐍 🎓 👈 🚚 🌐 🛠️ 👆 🛠️. !!! note "📡 ℹ" `FastAPI` 🎓 👈 😖 🔗 ⚪️➡️ `Starlette`. 👆 💪 ⚙️ 🌐 💃 🛠️ ⏮️ `FastAPI` 💁‍♂️. ### 🔁 2️⃣: ✍ `FastAPI` "👐" ```Python hl_lines="3" {!../../../docs_src/first_steps/tutorial001.py!} ``` 📥 `app` 🔢 🔜 "👐" 🎓 `FastAPI`. 👉 🔜 👑 ☝ 🔗 ✍ 🌐 👆 🛠️. 👉 `app` 🎏 1️⃣ 🔗 `uvicorn` 📋:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
🚥 👆 ✍ 👆 📱 💖: ```Python hl_lines="3" {!../../../docs_src/first_steps/tutorial002.py!} ``` & 🚮 ⚫️ 📁 `main.py`, ⤴️ 👆 🔜 🤙 `uvicorn` 💖:
```console $ uvicorn main:my_awesome_api --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
### 🔁 3️⃣: ✍ *➡ 🛠️* #### ➡ "➡" 📥 🔗 🏁 🍕 📛 ▶️ ⚪️➡️ 🥇 `/`. , 📛 💖: ``` https://example.com/items/foo ``` ...➡ 🔜: ``` /items/foo ``` !!! info "➡" 🛎 🤙 "🔗" ⚖️ "🛣". ⏪ 🏗 🛠️, "➡" 👑 🌌 🎏 "⚠" & "ℹ". #### 🛠️ "🛠️" 📥 🔗 1️⃣ 🇺🇸🔍 "👩‍🔬". 1️⃣: * `POST` * `GET` * `PUT` * `DELETE` ...& 🌅 😍 🕐: * `OPTIONS` * `HEAD` * `PATCH` * `TRACE` 🇺🇸🔍 🛠️, 👆 💪 🔗 🔠 ➡ ⚙️ 1️⃣ (⚖️ 🌅) 👫 "👩‍🔬". --- 🕐❔ 🏗 🔗, 👆 🛎 ⚙️ 👫 🎯 🇺🇸🔍 👩‍🔬 🎭 🎯 🎯. 🛎 👆 ⚙️: * `POST`: ✍ 💽. * `GET`: ✍ 💽. * `PUT`: ℹ 💽. * `DELETE`: ❎ 💽. , 🗄, 🔠 🇺🇸🔍 👩‍🔬 🤙 "🛠️". 👥 🔜 🤙 👫 "**🛠️**" 💁‍♂️. #### 🔬 *➡ 🛠️ 👨‍🎨* ```Python hl_lines="6" {!../../../docs_src/first_steps/tutorial001.py!} ``` `@app.get("/")` 💬 **FastAPI** 👈 🔢 ▶️️ 🔛 🈚 🚚 📨 👈 🚶: * ➡ `/` * ⚙️ get 🛠️ !!! info "`@decorator` ℹ" 👈 `@something` ❕ 🐍 🤙 "👨‍🎨". 👆 🚮 ⚫️ 🔛 🔝 🔢. 💖 📶 📔 👒 (👤 💭 👈 🌐❔ ⚖ 👟 ⚪️➡️). "👨‍🎨" ✊ 🔢 🔛 & 🔨 🕳 ⏮️ ⚫️. 👆 💼, 👉 👨‍🎨 💬 **FastAPI** 👈 🔢 🔛 🔗 **➡** `/` ⏮️ **🛠️** `get`. ⚫️ "**➡ 🛠️ 👨‍🎨**". 👆 💪 ⚙️ 🎏 🛠️: * `@app.post()` * `@app.put()` * `@app.delete()` & 🌅 😍 🕐: * `@app.options()` * `@app.head()` * `@app.patch()` * `@app.trace()` !!! tip 👆 🆓 ⚙️ 🔠 🛠️ (🇺🇸🔍 👩‍🔬) 👆 🎋. **FastAPI** 🚫 🛠️ 🙆 🎯 🔑. ℹ 📥 🎁 📄, 🚫 📄. 🖼, 🕐❔ ⚙️ 🕹 👆 🛎 🎭 🌐 🎯 ⚙️ 🕴 `POST` 🛠️. ### 🔁 4️⃣: 🔬 **➡ 🛠️ 🔢** 👉 👆 "**➡ 🛠️ 🔢**": * **➡**: `/`. * **🛠️**: `get`. * **🔢**: 🔢 🔛 "👨‍🎨" (🔛 `@app.get("/")`). ```Python hl_lines="7" {!../../../docs_src/first_steps/tutorial001.py!} ``` 👉 🐍 🔢. ⚫️ 🔜 🤙 **FastAPI** 🕐❔ ⚫️ 📨 📨 📛 "`/`" ⚙️ `GET` 🛠️. 👉 💼, ⚫️ `async` 🔢. --- 👆 💪 🔬 ⚫️ 😐 🔢 ↩️ `async def`: ```Python hl_lines="7" {!../../../docs_src/first_steps/tutorial003.py!} ``` !!! note 🚥 👆 🚫 💭 🔺, ✅ [🔁: *"🏃 ❓"*](../async.md#_2){.internal-link target=_blank}. ### 🔁 5️⃣: 📨 🎚 ```Python hl_lines="8" {!../../../docs_src/first_steps/tutorial001.py!} ``` 👆 💪 📨 `dict`, `list`, ⭐ 💲 `str`, `int`, ♒️. 👆 💪 📨 Pydantic 🏷 (👆 🔜 👀 🌅 🔃 👈 ⏪). 📤 📚 🎏 🎚 & 🏷 👈 🔜 🔁 🗜 🎻 (🔌 🐜, ♒️). 🔄 ⚙️ 👆 💕 🕐, ⚫️ 🏆 🎲 👈 👫 ⏪ 🐕‍🦺. ## 🌃 * 🗄 `FastAPI`. * ✍ `app` 👐. * ✍ **➡ 🛠️ 👨‍🎨** (💖 `@app.get("/")`). * ✍ **➡ 🛠️ 🔢** (💖 `def root(): ...` 🔛). * 🏃 🛠️ 💽 (💖 `uvicorn main:app --reload`). fastapi-0.110.3/docs/em/docs/tutorial/handling-errors.md000066400000000000000000000204471461403617600230660ustar00rootroot00000000000000# 🚚 ❌ 📤 📚 ⚠ 🌐❔ 👆 💪 🚨 ❌ 👩‍💻 👈 ⚙️ 👆 🛠️. 👉 👩‍💻 💪 🖥 ⏮️ 🕸, 📟 ⚪️➡️ 👱 🙆, ☁ 📳, ♒️. 👆 💪 💪 💬 👩‍💻 👈: * 👩‍💻 🚫 ✔️ 🥃 😌 👈 🛠️. * 👩‍💻 🚫 ✔️ 🔐 👈 ℹ. * 🏬 👩‍💻 🔄 🔐 🚫 🔀. * ♒️. 👫 💼, 👆 🔜 🛎 📨 **🇺🇸🔍 👔 📟** ↔ **4️⃣0️⃣0️⃣** (⚪️➡️ 4️⃣0️⃣0️⃣ 4️⃣9️⃣9️⃣). 👉 🎏 2️⃣0️⃣0️⃣ 🇺🇸🔍 👔 📟 (⚪️➡️ 2️⃣0️⃣0️⃣ 2️⃣9️⃣9️⃣). 👈 "2️⃣0️⃣0️⃣" 👔 📟 ⛓ 👈 😫 📤 "🏆" 📨. 👔 📟 4️⃣0️⃣0️⃣ ↔ ⛓ 👈 📤 ❌ ⚪️➡️ 👩‍💻. 💭 🌐 👈 **"4️⃣0️⃣4️⃣ 🚫 🔎"** ❌ (& 🤣) ❓ ## ⚙️ `HTTPException` 📨 🇺🇸🔍 📨 ⏮️ ❌ 👩‍💻 👆 ⚙️ `HTTPException`. ### 🗄 `HTTPException` ```Python hl_lines="1" {!../../../docs_src/handling_errors/tutorial001.py!} ``` ### 🤚 `HTTPException` 👆 📟 `HTTPException` 😐 🐍 ⚠ ⏮️ 🌖 📊 🔗 🔗. ↩️ ⚫️ 🐍 ⚠, 👆 🚫 `return` ⚫️, 👆 `raise` ⚫️. 👉 ⛓ 👈 🚥 👆 🔘 🚙 🔢 👈 👆 🤙 🔘 👆 *➡ 🛠️ 🔢*, & 👆 🤚 `HTTPException` ⚪️➡️ 🔘 👈 🚙 🔢, ⚫️ 🏆 🚫 🏃 🎂 📟 *➡ 🛠️ 🔢*, ⚫️ 🔜 ❎ 👈 📨 ▶️️ ↖️ & 📨 🇺🇸🔍 ❌ ⚪️➡️ `HTTPException` 👩‍💻. 💰 🙋‍♀ ⚠ 🤭 `return`😅 💲 🔜 🌖 ⭐ 📄 🔃 🔗 & 💂‍♂. 👉 🖼, 🕐❔ 👩‍💻 📨 🏬 🆔 👈 🚫 🔀, 🤚 ⚠ ⏮️ 👔 📟 `404`: ```Python hl_lines="11" {!../../../docs_src/handling_errors/tutorial001.py!} ``` ### 📉 📨 🚥 👩‍💻 📨 `http://example.com/items/foo` ( `item_id` `"foo"`), 👈 👩‍💻 🔜 📨 🇺🇸🔍 👔 📟 2️⃣0️⃣0️⃣, & 🎻 📨: ```JSON { "item": "The Foo Wrestlers" } ``` ✋️ 🚥 👩‍💻 📨 `http://example.com/items/bar` (🚫-🚫 `item_id` `"bar"`), 👈 👩‍💻 🔜 📨 🇺🇸🔍 👔 📟 4️⃣0️⃣4️⃣ ("🚫 🔎" ❌), & 🎻 📨: ```JSON { "detail": "Item not found" } ``` !!! tip 🕐❔ 🙋‍♀ `HTTPException`, 👆 💪 🚶‍♀️ 🙆 💲 👈 💪 🗜 🎻 🔢 `detail`, 🚫 🕴 `str`. 👆 💪 🚶‍♀️ `dict`, `list`, ♒️. 👫 🍵 🔁 **FastAPI** & 🗜 🎻. ## 🚮 🛃 🎚 📤 ⚠ 🌐❔ ⚫️ ⚠ 💪 🚮 🛃 🎚 🇺🇸🔍 ❌. 🖼, 🆎 💂‍♂. 👆 🎲 🏆 🚫 💪 ⚙️ ⚫️ 🔗 👆 📟. ✋️ 💼 👆 💪 ⚫️ 🏧 😐, 👆 💪 🚮 🛃 🎚: ```Python hl_lines="14" {!../../../docs_src/handling_errors/tutorial002.py!} ``` ## ❎ 🛃 ⚠ 🐕‍🦺 👆 💪 🚮 🛃 ⚠ 🐕‍🦺 ⏮️ 🎏 ⚠ 🚙 ⚪️➡️ 💃. ➡️ 💬 👆 ✔️ 🛃 ⚠ `UnicornException` 👈 👆 (⚖️ 🗃 👆 ⚙️) 💪 `raise`. & 👆 💚 🍵 👉 ⚠ 🌐 ⏮️ FastAPI. 👆 💪 🚮 🛃 ⚠ 🐕‍🦺 ⏮️ `@app.exception_handler()`: ```Python hl_lines="5-7 13-18 24" {!../../../docs_src/handling_errors/tutorial003.py!} ``` 📥, 🚥 👆 📨 `/unicorns/yolo`, *➡ 🛠️* 🔜 `raise` `UnicornException`. ✋️ ⚫️ 🔜 🍵 `unicorn_exception_handler`. , 👆 🔜 📨 🧹 ❌, ⏮️ 🇺🇸🔍 👔 📟 `418` & 🎻 🎚: ```JSON {"message": "Oops! yolo did something. There goes a rainbow..."} ``` !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.requests import Request` & `from starlette.responses import JSONResponse`. **FastAPI** 🚚 🎏 `starlette.responses` `fastapi.responses` 🏪 👆, 👩‍💻. ✋️ 🌅 💪 📨 👟 🔗 ⚪️➡️ 💃. 🎏 ⏮️ `Request`. ## 🔐 🔢 ⚠ 🐕‍🦺 **FastAPI** ✔️ 🔢 ⚠ 🐕‍🦺. 👫 🐕‍🦺 🈚 🛬 🔢 🎻 📨 🕐❔ 👆 `raise` `HTTPException` & 🕐❔ 📨 ✔️ ❌ 💽. 👆 💪 🔐 👫 ⚠ 🐕‍🦺 ⏮️ 👆 👍. ### 🔐 📨 🔬 ⚠ 🕐❔ 📨 🔌 ❌ 📊, **FastAPI** 🔘 🤚 `RequestValidationError`. & ⚫️ 🔌 🔢 ⚠ 🐕‍🦺 ⚫️. 🔐 ⚫️, 🗄 `RequestValidationError` & ⚙️ ⚫️ ⏮️ `@app.exception_handler(RequestValidationError)` 🎀 ⚠ 🐕‍🦺. ⚠ 🐕‍🦺 🔜 📨 `Request` & ⚠. ```Python hl_lines="2 14-16" {!../../../docs_src/handling_errors/tutorial004.py!} ``` 🔜, 🚥 👆 🚶 `/items/foo`, ↩️ 💆‍♂ 🔢 🎻 ❌ ⏮️: ```JSON { "detail": [ { "loc": [ "path", "item_id" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ] } ``` 👆 🔜 🤚 ✍ ⏬, ⏮️: ``` 1 validation error path -> item_id value is not a valid integer (type=type_error.integer) ``` #### `RequestValidationError` 🆚 `ValidationError` !!! warning 👫 📡 ℹ 👈 👆 💪 🚶 🚥 ⚫️ 🚫 ⚠ 👆 🔜. `RequestValidationError` 🎧-🎓 Pydantic `ValidationError`. **FastAPI** ⚙️ ⚫️ 👈, 🚥 👆 ⚙️ Pydantic 🏷 `response_model`, & 👆 💽 ✔️ ❌, 👆 🔜 👀 ❌ 👆 🕹. ✋️ 👩‍💻/👩‍💻 🔜 🚫 👀 ⚫️. ↩️, 👩‍💻 🔜 📨 "🔗 💽 ❌" ⏮️ 🇺🇸🔍 👔 📟 `500`. ⚫️ 🔜 👉 🌌 ↩️ 🚥 👆 ✔️ Pydantic `ValidationError` 👆 *📨* ⚖️ 🙆 👆 📟 (🚫 👩‍💻 *📨*), ⚫️ 🤙 🐛 👆 📟. & ⏪ 👆 🔧 ⚫️, 👆 👩‍💻/👩‍💻 🚫🔜 🚫 ✔️ 🔐 🔗 ℹ 🔃 ❌, 👈 💪 🎦 💂‍♂ ⚠. ### 🔐 `HTTPException` ❌ 🐕‍🦺 🎏 🌌, 👆 💪 🔐 `HTTPException` 🐕‍🦺. 🖼, 👆 💪 💚 📨 ✅ ✍ 📨 ↩️ 🎻 👫 ❌: ```Python hl_lines="3-4 9-11 22" {!../../../docs_src/handling_errors/tutorial004.py!} ``` !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.responses import PlainTextResponse`. **FastAPI** 🚚 🎏 `starlette.responses` `fastapi.responses` 🏪 👆, 👩‍💻. ✋️ 🌅 💪 📨 👟 🔗 ⚪️➡️ 💃. ### ⚙️ `RequestValidationError` 💪 `RequestValidationError` 🔌 `body` ⚫️ 📨 ⏮️ ❌ 💽. 👆 💪 ⚙️ ⚫️ ⏪ 🛠️ 👆 📱 🕹 💪 & ℹ ⚫️, 📨 ⚫️ 👩‍💻, ♒️. ```Python hl_lines="14" {!../../../docs_src/handling_errors/tutorial005.py!} ``` 🔜 🔄 📨 ❌ 🏬 💖: ```JSON { "title": "towel", "size": "XL" } ``` 👆 🔜 📨 📨 💬 👆 👈 💽 ❌ ⚗ 📨 💪: ```JSON hl_lines="12-15" { "detail": [ { "loc": [ "body", "size" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ], "body": { "title": "towel", "size": "XL" } } ``` #### FastAPI `HTTPException` 🆚 💃 `HTTPException` **FastAPI** ✔️ 🚮 👍 `HTTPException`. & **FastAPI**'Ⓜ `HTTPException` ❌ 🎓 😖 ⚪️➡️ 💃 `HTTPException` ❌ 🎓. 🕴 🔺, 👈 **FastAPI**'Ⓜ `HTTPException` ✔ 👆 🚮 🎚 🔌 📨. 👉 💪/⚙️ 🔘 ✳ 2️⃣.0️⃣ & 💂‍♂ 🚙. , 👆 💪 🚧 🙋‍♀ **FastAPI**'Ⓜ `HTTPException` 🛎 👆 📟. ✋️ 🕐❔ 👆 ® ⚠ 🐕‍🦺, 👆 🔜 ® ⚫️ 💃 `HTTPException`. 👉 🌌, 🚥 🙆 🍕 💃 🔗 📟, ⚖️ 💃 ↔ ⚖️ 🔌 -, 🤚 💃 `HTTPException`, 👆 🐕‍🦺 🔜 💪 ✊ & 🍵 ⚫️. 👉 🖼, 💪 ✔️ 👯‍♂️ `HTTPException`Ⓜ 🎏 📟, 💃 ⚠ 📁 `StarletteHTTPException`: ```Python from starlette.exceptions import HTTPException as StarletteHTTPException ``` ### 🏤-⚙️ **FastAPI**'Ⓜ ⚠ 🐕‍🦺 🚥 👆 💚 ⚙️ ⚠ ⤴️ ⏮️ 🎏 🔢 ⚠ 🐕‍🦺 ⚪️➡️ **FastAPI**, 👆 💪 🗄 & 🏤-⚙️ 🔢 ⚠ 🐕‍🦺 ⚪️➡️ `fastapi.exception_handlers`: ```Python hl_lines="2-5 15 21" {!../../../docs_src/handling_errors/tutorial006.py!} ``` 👉 🖼 👆 `print`😅 ❌ ⏮️ 📶 🎨 📧, ✋️ 👆 🤚 💭. 👆 💪 ⚙️ ⚠ & ⤴️ 🏤-⚙️ 🔢 ⚠ 🐕‍🦺. fastapi-0.110.3/docs/em/docs/tutorial/header-params.md000066400000000000000000000063301461403617600224740ustar00rootroot00000000000000# 🎚 🔢 👆 💪 🔬 🎚 🔢 🎏 🌌 👆 🔬 `Query`, `Path` & `Cookie` 🔢. ## 🗄 `Header` 🥇 🗄 `Header`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="3" {!> ../../../docs_src/header_params/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="1" {!> ../../../docs_src/header_params/tutorial001_py310.py!} ``` ## 📣 `Header` 🔢 ⤴️ 📣 🎚 🔢 ⚙️ 🎏 📊 ⏮️ `Path`, `Query` & `Cookie`. 🥇 💲 🔢 💲, 👆 💪 🚶‍♀️ 🌐 ➕ 🔬 ⚖️ ✍ 🔢: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/header_params/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/header_params/tutorial001_py310.py!} ``` !!! note "📡 ℹ" `Header` "👭" 🎓 `Path`, `Query` & `Cookie`. ⚫️ 😖 ⚪️➡️ 🎏 ⚠ `Param` 🎓. ✋️ 💭 👈 🕐❔ 👆 🗄 `Query`, `Path`, `Header`, & 🎏 ⚪️➡️ `fastapi`, 👈 🤙 🔢 👈 📨 🎁 🎓. !!! info 📣 🎚, 👆 💪 ⚙️ `Header`, ↩️ ⏪ 🔢 🔜 🔬 🔢 🔢. ## 🏧 🛠️ `Header` ✔️ 🐥 ➕ 🛠️ 🔛 🔝 ⚫️❔ `Path`, `Query` & `Cookie` 🚚. 🌅 🐩 🎚 🎏 "🔠" 🦹, 💭 "➖ 🔣" (`-`). ✋️ 🔢 💖 `user-agent` ❌ 🐍. , 🔢, `Header` 🔜 🗜 🔢 📛 🦹 ⚪️➡️ 🎦 (`_`) 🔠 (`-`) ⚗ & 📄 🎚. , 🇺🇸🔍 🎚 💼-😛,, 👆 💪 📣 👫 ⏮️ 🐩 🐍 👗 (💭 "🔡"). , 👆 💪 ⚙️ `user_agent` 👆 🛎 🔜 🐍 📟, ↩️ 💆‍♂ 🎯 🥇 🔤 `User_Agent` ⚖️ 🕳 🎏. 🚥 🤔 👆 💪 ❎ 🏧 🛠️ 🎦 🔠, ⚒ 🔢 `convert_underscores` `Header` `False`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="10" {!> ../../../docs_src/header_params/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="8" {!> ../../../docs_src/header_params/tutorial002_py310.py!} ``` !!! warning ⏭ ⚒ `convert_underscores` `False`, 🐻 🤯 👈 🇺🇸🔍 🗳 & 💽 / ⚙️ 🎚 ⏮️ 🎦. ## ❎ 🎚 ⚫️ 💪 📨 ❎ 🎚. 👈 ⛓, 🎏 🎚 ⏮️ 💗 💲. 👆 💪 🔬 👈 💼 ⚙️ 📇 🆎 📄. 👆 🔜 📨 🌐 💲 ⚪️➡️ ❎ 🎚 🐍 `list`. 🖼, 📣 🎚 `X-Token` 👈 💪 😑 🌅 🌘 🕐, 👆 💪 ✍: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/header_params/tutorial003.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/header_params/tutorial003_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/header_params/tutorial003_py310.py!} ``` 🚥 👆 🔗 ⏮️ 👈 *➡ 🛠️* 📨 2️⃣ 🇺🇸🔍 🎚 💖: ``` X-Token: foo X-Token: bar ``` 📨 🔜 💖: ```JSON { "X-Token values": [ "bar", "foo" ] } ``` ## 🌃 📣 🎚 ⏮️ `Header`, ⚙️ 🎏 ⚠ ⚓ `Query`, `Path` & `Cookie`. & 🚫 😟 🔃 🎦 👆 🔢, **FastAPI** 🔜 ✊ 💅 🏭 👫. fastapi-0.110.3/docs/em/docs/tutorial/index.md000066400000000000000000000043401461403617600210710ustar00rootroot00000000000000# 🔰 - 👩‍💻 🦮 👉 🔰 🎦 👆 ❔ ⚙️ **FastAPI** ⏮️ 🌅 🚮 ⚒, 🔁 🔁. 🔠 📄 📉 🏗 🔛 ⏮️ 🕐, ✋️ ⚫️ 🏗 🎏 ❔, 👈 👆 💪 🚶 🔗 🙆 🎯 1️⃣ ❎ 👆 🎯 🛠️ 💪. ⚫️ 🏗 👷 🔮 🔗. 👆 💪 👟 🔙 & 👀 ⚫️❔ ⚫️❔ 👆 💪. ## 🏃 📟 🌐 📟 🍫 💪 📁 & ⚙️ 🔗 (👫 🤙 💯 🐍 📁). 🏃 🙆 🖼, 📁 📟 📁 `main.py`, & ▶️ `uvicorn` ⏮️:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [28720] INFO: Started server process [28722] INFO: Waiting for application startup. INFO: Application startup complete. ```
⚫️ **🏆 💡** 👈 👆 ✍ ⚖️ 📁 📟, ✍ ⚫️ & 🏃 ⚫️ 🌐. ⚙️ ⚫️ 👆 👨‍🎨 ⚫️❔ 🤙 🎦 👆 💰 FastAPI, 👀 ❔ 🐥 📟 👆 ✔️ ✍, 🌐 🆎 ✅, ✍, ♒️. --- ## ❎ FastAPI 🥇 🔁 ❎ FastAPI. 🔰, 👆 💪 💚 ❎ ⚫️ ⏮️ 🌐 📦 🔗 & ⚒:
```console $ pip install "fastapi[all]" ---> 100% ```
...👈 🔌 `uvicorn`, 👈 👆 💪 ⚙️ 💽 👈 🏃 👆 📟. !!! note 👆 💪 ❎ ⚫️ 🍕 🍕. 👉 ⚫️❔ 👆 🔜 🎲 🕐 👆 💚 🛠️ 👆 🈸 🏭: ``` pip install fastapi ``` ❎ `uvicorn` 👷 💽: ``` pip install "uvicorn[standard]" ``` & 🎏 🔠 📦 🔗 👈 👆 💚 ⚙️. ## 🏧 👩‍💻 🦮 📤 **🏧 👩‍💻 🦮** 👈 👆 💪 ✍ ⏪ ⏮️ 👉 **🔰 - 👩‍💻 🦮**. **🏧 👩‍💻 🦮**, 🏗 🔛 👉, ⚙️ 🎏 🔧, & 💡 👆 ➕ ⚒. ✋️ 👆 🔜 🥇 ✍ **🔰 - 👩‍💻 🦮** (⚫️❔ 👆 👂 ▶️️ 🔜). ⚫️ 🔧 👈 👆 💪 🏗 🏁 🈸 ⏮️ **🔰 - 👩‍💻 🦮**, & ⤴️ ↔ ⚫️ 🎏 🌌, ⚓️ 🔛 👆 💪, ⚙️ 🌖 💭 ⚪️➡️ **🏧 👩‍💻 🦮**. fastapi-0.110.3/docs/em/docs/tutorial/metadata.md000066400000000000000000000102421461403617600215400ustar00rootroot00000000000000# 🗃 & 🩺 📛 👆 💪 🛃 📚 🗃 📳 👆 **FastAPI** 🈸. ## 🗃 🛠️ 👆 💪 ⚒ 📄 🏑 👈 ⚙️ 🗄 🔧 & 🏧 🛠️ 🩺 ⚜: | 🔢 | 🆎 | 📛 | |------------|------|-------------| | `title` | `str` | 📛 🛠️. | | `description` | `str` | 📏 📛 🛠️. ⚫️ 💪 ⚙️ ✍. | | `version` | `string` | ⏬ 🛠️. 👉 ⏬ 👆 👍 🈸, 🚫 🗄. 🖼 `2.5.0`. | | `terms_of_service` | `str` | 📛 ⚖ 🐕‍🦺 🛠️. 🚥 🚚, 👉 ✔️ 📛. | | `contact` | `dict` | 📧 ℹ 🎦 🛠️. ⚫️ 💪 🔌 📚 🏑.
contact 🏑
🔢🆎📛
namestr⚖ 📛 📧 👨‍💼/🏢.
urlstr📛 ☝ 📧 ℹ. 🔜 📁 📛.
emailstr📧 📢 📧 👨‍💼/🏢. 🔜 📁 📧 📢.
| | `license_info` | `dict` | 🛂 ℹ 🎦 🛠️. ⚫️ 💪 🔌 📚 🏑.
license_info 🏑
🔢🆎📛
namestr🚚 (🚥 license_info ⚒). 🛂 📛 ⚙️ 🛠️.
urlstr📛 🛂 ⚙️ 🛠️. 🔜 📁 📛.
| 👆 💪 ⚒ 👫 ⏩: ```Python hl_lines="3-16 19-31" {!../../../docs_src/metadata/tutorial001.py!} ``` !!! tip 👆 💪 ✍ ✍ `description` 🏑 & ⚫️ 🔜 ✍ 🔢. ⏮️ 👉 📳, 🏧 🛠️ 🩺 🔜 👀 💖: ## 🗃 🔖 👆 💪 🚮 🌖 🗃 🎏 🔖 ⚙️ 👪 👆 ➡ 🛠️ ⏮️ 🔢 `openapi_tags`. ⚫️ ✊ 📇 ⚗ 1️⃣ 📖 🔠 🔖. 🔠 📖 💪 🔌: * `name` (**✔**): `str` ⏮️ 🎏 📛 👆 ⚙️ `tags` 🔢 👆 *➡ 🛠️* & `APIRouter`Ⓜ. * `description`: `str` ⏮️ 📏 📛 🔖. ⚫️ 💪 ✔️ ✍ & 🔜 🎦 🩺 🎚. * `externalDocs`: `dict` 🔬 🔢 🧾 ⏮️: * `description`: `str` ⏮️ 📏 📛 🔢 🩺. * `url` (**✔**): `str` ⏮️ 📛 🔢 🧾. ### ✍ 🗃 🔖 ➡️ 🔄 👈 🖼 ⏮️ 🔖 `users` & `items`. ✍ 🗃 👆 🔖 & 🚶‍♀️ ⚫️ `openapi_tags` 🔢: ```Python hl_lines="3-16 18" {!../../../docs_src/metadata/tutorial004.py!} ``` 👀 👈 👆 💪 ⚙️ ✍ 🔘 📛, 🖼 "💳" 🔜 🎦 🦁 (**💳**) & "🎀" 🔜 🎦 ❕ (_🎀_). !!! tip 👆 🚫 ✔️ 🚮 🗃 🌐 🔖 👈 👆 ⚙️. ### ⚙️ 👆 🔖 ⚙️ `tags` 🔢 ⏮️ 👆 *➡ 🛠️* (& `APIRouter`Ⓜ) 🛠️ 👫 🎏 🔖: ```Python hl_lines="21 26" {!../../../docs_src/metadata/tutorial004.py!} ``` !!! info ✍ 🌅 🔃 🔖 [➡ 🛠️ 📳](path-operation-configuration.md#_3){.internal-link target=_blank}. ### ✅ 🩺 🔜, 🚥 👆 ✅ 🩺, 👫 🔜 🎦 🌐 🌖 🗃: ### ✔ 🔖 ✔ 🔠 🔖 🗃 📖 🔬 ✔ 🎦 🩺 🎚. 🖼, ✋️ `users` 🔜 🚶 ⏮️ `items` 🔤 ✔, ⚫️ 🎦 ⏭ 👫, ↩️ 👥 🚮 👫 🗃 🥇 📖 📇. ## 🗄 📛 🔢, 🗄 🔗 🍦 `/openapi.json`. ✋️ 👆 💪 🔗 ⚫️ ⏮️ 🔢 `openapi_url`. 🖼, ⚒ ⚫️ 🍦 `/api/v1/openapi.json`: ```Python hl_lines="3" {!../../../docs_src/metadata/tutorial002.py!} ``` 🚥 👆 💚 ❎ 🗄 🔗 🍕 👆 💪 ⚒ `openapi_url=None`, 👈 🔜 ❎ 🧾 👩‍💻 🔢 👈 ⚙️ ⚫️. ## 🩺 📛 👆 💪 🔗 2️⃣ 🧾 👩‍💻 🔢 🔌: * **🦁 🎚**: 🍦 `/docs`. * 👆 💪 ⚒ 🚮 📛 ⏮️ 🔢 `docs_url`. * 👆 💪 ❎ ⚫️ ⚒ `docs_url=None`. * **📄**: 🍦 `/redoc`. * 👆 💪 ⚒ 🚮 📛 ⏮️ 🔢 `redoc_url`. * 👆 💪 ❎ ⚫️ ⚒ `redoc_url=None`. 🖼, ⚒ 🦁 🎚 🍦 `/documentation` & ❎ 📄: ```Python hl_lines="3" {!../../../docs_src/metadata/tutorial003.py!} ``` fastapi-0.110.3/docs/em/docs/tutorial/middleware.md000066400000000000000000000046621461403617600221060ustar00rootroot00000000000000# 🛠️ 👆 💪 🚮 🛠️ **FastAPI** 🈸. "🛠️" 🔢 👈 👷 ⏮️ 🔠 **📨** ⏭ ⚫️ 🛠️ 🙆 🎯 *➡ 🛠️*. & ⏮️ 🔠 **📨** ⏭ 🛬 ⚫️. * ⚫️ ✊ 🔠 **📨** 👈 👟 👆 🈸. * ⚫️ 💪 ⤴️ 🕳 👈 **📨** ⚖️ 🏃 🙆 💪 📟. * ⤴️ ⚫️ 🚶‍♀️ **📨** 🛠️ 🎂 🈸 ( *➡ 🛠️*). * ⚫️ ⤴️ ✊ **📨** 🏗 🈸 ( *➡ 🛠️*). * ⚫️ 💪 🕳 👈 **📨** ⚖️ 🏃 🙆 💪 📟. * ⤴️ ⚫️ 📨 **📨**. !!! note "📡 ℹ" 🚥 👆 ✔️ 🔗 ⏮️ `yield`, 🚪 📟 🔜 🏃 *⏮️* 🛠️. 🚥 📤 🙆 🖥 📋 (📄 ⏪), 👫 🔜 🏃 *⏮️* 🌐 🛠️. ## ✍ 🛠️ ✍ 🛠️ 👆 ⚙️ 👨‍🎨 `@app.middleware("http")` 🔛 🔝 🔢. 🛠️ 🔢 📨: * `request`. * 🔢 `call_next` 👈 🔜 📨 `request` 🔢. * 👉 🔢 🔜 🚶‍♀️ `request` 🔗 *➡ 🛠️*. * ⤴️ ⚫️ 📨 `response` 🏗 🔗 *➡ 🛠️*. * 👆 💪 ⤴️ 🔀 🌅 `response` ⏭ 🛬 ⚫️. ```Python hl_lines="8-9 11 14" {!../../../docs_src/middleware/tutorial001.py!} ``` !!! tip ✔️ 🤯 👈 🛃 © 🎚 💪 🚮 ⚙️ '✖-' 🔡. ✋️ 🚥 👆 ✔️ 🛃 🎚 👈 👆 💚 👩‍💻 🖥 💪 👀, 👆 💪 🚮 👫 👆 ⚜ 📳 ([⚜ (✖️-🇨🇳 ℹ 🤝)](cors.md){.internal-link target=_blank}) ⚙️ 🔢 `expose_headers` 📄 💃 ⚜ 🩺. !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.requests import Request`. **FastAPI** 🚚 ⚫️ 🏪 👆, 👩‍💻. ✋️ ⚫️ 👟 🔗 ⚪️➡️ 💃. ### ⏭ & ⏮️ `response` 👆 💪 🚮 📟 🏃 ⏮️ `request`, ⏭ 🙆 *➡ 🛠️* 📨 ⚫️. & ⏮️ `response` 🏗, ⏭ 🛬 ⚫️. 🖼, 👆 💪 🚮 🛃 🎚 `X-Process-Time` ⚗ 🕰 🥈 👈 ⚫️ ✊ 🛠️ 📨 & 🏗 📨: ```Python hl_lines="10 12-13" {!../../../docs_src/middleware/tutorial001.py!} ``` ## 🎏 🛠️ 👆 💪 ⏪ ✍ 🌖 🔃 🎏 🛠️ [🏧 👩‍💻 🦮: 🏧 🛠️](../advanced/middleware.md){.internal-link target=_blank}. 👆 🔜 ✍ 🔃 ❔ 🍵 ⏮️ 🛠️ ⏭ 📄. fastapi-0.110.3/docs/em/docs/tutorial/path-operation-configuration.md000066400000000000000000000124061461403617600255630ustar00rootroot00000000000000# ➡ 🛠️ 📳 📤 📚 🔢 👈 👆 💪 🚶‍♀️ 👆 *➡ 🛠️ 👨‍🎨* 🔗 ⚫️. !!! warning 👀 👈 👫 🔢 🚶‍♀️ 🔗 *➡ 🛠️ 👨‍🎨*, 🚫 👆 *➡ 🛠️ 🔢*. ## 📨 👔 📟 👆 💪 🔬 (🇺🇸🔍) `status_code` ⚙️ 📨 👆 *➡ 🛠️*. 👆 💪 🚶‍♀️ 🔗 `int` 📟, 💖 `404`. ✋️ 🚥 👆 🚫 💭 ⚫️❔ 🔠 🔢 📟, 👆 💪 ⚙️ ⌨ 📉 `status`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="3 17" {!> ../../../docs_src/path_operation_configuration/tutorial001.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="3 17" {!> ../../../docs_src/path_operation_configuration/tutorial001_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="1 15" {!> ../../../docs_src/path_operation_configuration/tutorial001_py310.py!} ``` 👈 👔 📟 🔜 ⚙️ 📨 & 🔜 🚮 🗄 🔗. !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette import status`. **FastAPI** 🚚 🎏 `starlette.status` `fastapi.status` 🏪 👆, 👩‍💻. ✋️ ⚫️ 👟 🔗 ⚪️➡️ 💃. ## 🔖 👆 💪 🚮 🔖 👆 *➡ 🛠️*, 🚶‍♀️ 🔢 `tags` ⏮️ `list` `str` (🛎 1️⃣ `str`): === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="17 22 27" {!> ../../../docs_src/path_operation_configuration/tutorial002.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="17 22 27" {!> ../../../docs_src/path_operation_configuration/tutorial002_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="15 20 25" {!> ../../../docs_src/path_operation_configuration/tutorial002_py310.py!} ``` 👫 🔜 🚮 🗄 🔗 & ⚙️ 🏧 🧾 🔢: ### 🔖 ⏮️ 🔢 🚥 👆 ✔️ 🦏 🈸, 👆 5️⃣📆 🔚 🆙 📈 **📚 🔖**, & 👆 🔜 💚 ⚒ 💭 👆 🕧 ⚙️ **🎏 🔖** 🔗 *➡ 🛠️*. 👫 💼, ⚫️ 💪 ⚒ 🔑 🏪 🔖 `Enum`. **FastAPI** 🐕‍🦺 👈 🎏 🌌 ⏮️ ✅ 🎻: ```Python hl_lines="1 8-10 13 18" {!../../../docs_src/path_operation_configuration/tutorial002b.py!} ``` ## 📄 & 📛 👆 💪 🚮 `summary` & `description`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="20-21" {!> ../../../docs_src/path_operation_configuration/tutorial003.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="20-21" {!> ../../../docs_src/path_operation_configuration/tutorial003_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="18-19" {!> ../../../docs_src/path_operation_configuration/tutorial003_py310.py!} ``` ## 📛 ⚪️➡️ #️⃣ 📛 😑 📏 & 📔 💗 ⏸, 👆 💪 📣 *➡ 🛠️* 📛 🔢 #️⃣ & **FastAPI** 🔜 ✍ ⚫️ ⚪️➡️ 📤. 👆 💪 ✍ #️⃣ , ⚫️ 🔜 🔬 & 🖥 ☑ (✊ 🔘 🏧 #️⃣ 📐). === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="19-27" {!> ../../../docs_src/path_operation_configuration/tutorial004.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="19-27" {!> ../../../docs_src/path_operation_configuration/tutorial004_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="17-25" {!> ../../../docs_src/path_operation_configuration/tutorial004_py310.py!} ``` ⚫️ 🔜 ⚙️ 🎓 🩺: ## 📨 📛 👆 💪 ✔ 📨 📛 ⏮️ 🔢 `response_description`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="21" {!> ../../../docs_src/path_operation_configuration/tutorial005.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="21" {!> ../../../docs_src/path_operation_configuration/tutorial005_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="19" {!> ../../../docs_src/path_operation_configuration/tutorial005_py310.py!} ``` !!! info 👀 👈 `response_description` 🔗 🎯 📨, `description` 🔗 *➡ 🛠️* 🏢. !!! check 🗄 ✔ 👈 🔠 *➡ 🛠️* 🚚 📨 📛. , 🚥 👆 🚫 🚚 1️⃣, **FastAPI** 🔜 🔁 🏗 1️⃣ "🏆 📨". ## 😢 *➡ 🛠️* 🚥 👆 💪 ™ *➡ 🛠️* 😢, ✋️ 🍵 ❎ ⚫️, 🚶‍♀️ 🔢 `deprecated`: ```Python hl_lines="16" {!../../../docs_src/path_operation_configuration/tutorial006.py!} ``` ⚫️ 🔜 🎯 ™ 😢 🎓 🩺: ✅ ❔ 😢 & 🚫-😢 *➡ 🛠️* 👀 💖: ## 🌃 👆 💪 🔗 & 🚮 🗃 👆 *➡ 🛠️* 💪 🚶‍♀️ 🔢 *➡ 🛠️ 👨‍🎨*. fastapi-0.110.3/docs/em/docs/tutorial/path-params-numeric-validations.md000066400000000000000000000106231461403617600261530ustar00rootroot00000000000000# ➡ 🔢 & 🔢 🔬 🎏 🌌 👈 👆 💪 📣 🌅 🔬 & 🗃 🔢 🔢 ⏮️ `Query`, 👆 💪 📣 🎏 🆎 🔬 & 🗃 ➡ 🔢 ⏮️ `Path`. ## 🗄 ➡ 🥇, 🗄 `Path` ⚪️➡️ `fastapi`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="3" {!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="1" {!> ../../../docs_src/path_params_numeric_validations/tutorial001_py310.py!} ``` ## 📣 🗃 👆 💪 📣 🌐 🎏 🔢 `Query`. 🖼, 📣 `title` 🗃 💲 ➡ 🔢 `item_id` 👆 💪 🆎: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="10" {!> ../../../docs_src/path_params_numeric_validations/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="8" {!> ../../../docs_src/path_params_numeric_validations/tutorial001_py310.py!} ``` !!! note ➡ 🔢 🕧 ✔ ⚫️ ✔️ 🍕 ➡. , 👆 🔜 📣 ⚫️ ⏮️ `...` ™ ⚫️ ✔. 👐, 🚥 👆 📣 ⚫️ ⏮️ `None` ⚖️ ⚒ 🔢 💲, ⚫️ 🔜 🚫 📉 🕳, ⚫️ 🔜 🕧 🚚. ## ✔ 🔢 👆 💪 ➡️ 💬 👈 👆 💚 📣 🔢 🔢 `q` ✔ `str`. & 👆 🚫 💪 📣 🕳 🙆 👈 🔢, 👆 🚫 🤙 💪 ⚙️ `Query`. ✋️ 👆 💪 ⚙️ `Path` `item_id` ➡ 🔢. 🐍 🔜 😭 🚥 👆 🚮 💲 ⏮️ "🔢" ⏭ 💲 👈 🚫 ✔️ "🔢". ✋️ 👆 💪 🏤-✔ 👫, & ✔️ 💲 🍵 🔢 (🔢 🔢 `q`) 🥇. ⚫️ 🚫 🤔 **FastAPI**. ⚫️ 🔜 🔍 🔢 👫 📛, 🆎 & 🔢 📄 (`Query`, `Path`, ♒️), ⚫️ 🚫 💅 🔃 ✔. , 👆 💪 📣 👆 🔢: ```Python hl_lines="7" {!../../../docs_src/path_params_numeric_validations/tutorial002.py!} ``` ## ✔ 🔢 👆 💪, 🎱 🚥 👆 💚 📣 `q` 🔢 🔢 🍵 `Query` 🚫 🙆 🔢 💲, & ➡ 🔢 `item_id` ⚙️ `Path`, & ✔️ 👫 🎏 ✔, 🐍 ✔️ 🐥 🎁 ❕ 👈. 🚶‍♀️ `*`, 🥇 🔢 🔢. 🐍 🏆 🚫 🕳 ⏮️ 👈 `*`, ✋️ ⚫️ 🔜 💭 👈 🌐 📄 🔢 🔜 🤙 🇨🇻 ❌ (🔑-💲 👫), 💭 kwargs. 🚥 👫 🚫 ✔️ 🔢 💲. ```Python hl_lines="7" {!../../../docs_src/path_params_numeric_validations/tutorial003.py!} ``` ## 🔢 🔬: 👑 🌘 ⚖️ 🌓 ⏮️ `Query` & `Path` (& 🎏 👆 🔜 👀 ⏪) 👆 💪 📣 🔢 ⚛. 📥, ⏮️ `ge=1`, `item_id` 🔜 💪 🔢 🔢 "`g`🅾 🌘 ⚖️ `e`🅾" `1`. ```Python hl_lines="8" {!../../../docs_src/path_params_numeric_validations/tutorial004.py!} ``` ## 🔢 🔬: 🌘 🌘 & 🌘 🌘 ⚖️ 🌓 🎏 ✔: * `gt`: `g`🅾 `t`👲 * `le`: `l`👭 🌘 ⚖️ `e`🅾 ```Python hl_lines="9" {!../../../docs_src/path_params_numeric_validations/tutorial005.py!} ``` ## 🔢 🔬: 🎈, 🌘 🌘 & 🌘 🌘 🔢 🔬 👷 `float` 💲. 📥 🌐❔ ⚫️ ▶️️ ⚠ 💪 📣 gt & 🚫 ge. ⏮️ ⚫️ 👆 💪 🚚, 🖼, 👈 💲 🔜 👑 🌘 `0`, 🚥 ⚫️ 🌘 🌘 `1`. , `0.5` 🔜 ☑ 💲. ✋️ `0.0` ⚖️ `0` 🔜 🚫. & 🎏 lt. ```Python hl_lines="11" {!../../../docs_src/path_params_numeric_validations/tutorial006.py!} ``` ## 🌃 ⏮️ `Query`, `Path` (& 🎏 👆 🚫 👀) 👆 💪 📣 🗃 & 🎻 🔬 🎏 🌌 ⏮️ [🔢 🔢 & 🎻 🔬](query-params-str-validations.md){.internal-link target=_blank}. & 👆 💪 📣 🔢 🔬: * `gt`: `g`🅾 `t`👲 * `ge`: `g`🅾 🌘 ⚖️ `e`🅾 * `lt`: `l`👭 `t`👲 * `le`: `l`👭 🌘 ⚖️ `e`🅾 !!! info `Query`, `Path`, & 🎏 🎓 👆 🔜 👀 ⏪ 🏿 ⚠ `Param` 🎓. 🌐 👫 💰 🎏 🔢 🌖 🔬 & 🗃 👆 ✔️ 👀. !!! note "📡 ℹ" 🕐❔ 👆 🗄 `Query`, `Path` & 🎏 ⚪️➡️ `fastapi`, 👫 🤙 🔢. 👈 🕐❔ 🤙, 📨 👐 🎓 🎏 📛. , 👆 🗄 `Query`, ❔ 🔢. & 🕐❔ 👆 🤙 ⚫️, ⚫️ 📨 👐 🎓 🌟 `Query`. 👫 🔢 📤 (↩️ ⚙️ 🎓 🔗) 👈 👆 👨‍🎨 🚫 ™ ❌ 🔃 👫 🆎. 👈 🌌 👆 💪 ⚙️ 👆 😐 👨‍🎨 & 🛠️ 🧰 🍵 ✔️ 🚮 🛃 📳 🤷‍♂ 📚 ❌. fastapi-0.110.3/docs/em/docs/tutorial/path-params.md000066400000000000000000000172741461403617600222110ustar00rootroot00000000000000# ➡ 🔢 👆 💪 📣 ➡ "🔢" ⚖️ "🔢" ⏮️ 🎏 ❕ ⚙️ 🐍 📁 🎻: ```Python hl_lines="6-7" {!../../../docs_src/path_params/tutorial001.py!} ``` 💲 ➡ 🔢 `item_id` 🔜 🚶‍♀️ 👆 🔢 ❌ `item_id`. , 🚥 👆 🏃 👉 🖼 & 🚶 http://127.0.0.1:8000/items/foo, 👆 🔜 👀 📨: ```JSON {"item_id":"foo"} ``` ## ➡ 🔢 ⏮️ 🆎 👆 💪 📣 🆎 ➡ 🔢 🔢, ⚙️ 🐩 🐍 🆎 ✍: ```Python hl_lines="7" {!../../../docs_src/path_params/tutorial002.py!} ``` 👉 💼, `item_id` 📣 `int`. !!! check 👉 🔜 🤝 👆 👨‍🎨 🐕‍🦺 🔘 👆 🔢, ⏮️ ❌ ✅, 🛠️, ♒️. ## 💽 🛠️ 🚥 👆 🏃 👉 🖼 & 📂 👆 🖥 http://127.0.0.1:8000/items/3, 👆 🔜 👀 📨: ```JSON {"item_id":3} ``` !!! check 👀 👈 💲 👆 🔢 📨 (& 📨) `3`, 🐍 `int`, 🚫 🎻 `"3"`. , ⏮️ 👈 🆎 📄, **FastAPI** 🤝 👆 🏧 📨 "✍". ## 💽 🔬 ✋️ 🚥 👆 🚶 🖥 http://127.0.0.1:8000/items/foo, 👆 🔜 👀 👌 🇺🇸🔍 ❌: ```JSON { "detail": [ { "loc": [ "path", "item_id" ], "msg": "value is not a valid integer", "type": "type_error.integer" } ] } ``` ↩️ ➡ 🔢 `item_id` ✔️ 💲 `"foo"`, ❔ 🚫 `int`. 🎏 ❌ 🔜 😑 🚥 👆 🚚 `float` ↩️ `int`,: http://127.0.0.1:8000/items/4.2 !!! check , ⏮️ 🎏 🐍 🆎 📄, **FastAPI** 🤝 👆 💽 🔬. 👀 👈 ❌ 🎯 🇵🇸 ⚫️❔ ☝ 🌐❔ 🔬 🚫 🚶‍♀️. 👉 🙃 👍 ⏪ 🛠️ & 🛠️ 📟 👈 🔗 ⏮️ 👆 🛠️. ## 🧾 & 🕐❔ 👆 📂 👆 🖥 http://127.0.0.1:8000/docs, 👆 🔜 👀 🏧, 🎓, 🛠️ 🧾 💖: !!! check 🔄, ⏮️ 👈 🎏 🐍 🆎 📄, **FastAPI** 🤝 👆 🏧, 🎓 🧾 (🛠️ 🦁 🎚). 👀 👈 ➡ 🔢 📣 🔢. ## 🐩-⚓️ 💰, 🎛 🧾 & ↩️ 🏗 🔗 ⚪️➡️ 🗄 🐩, 📤 📚 🔗 🧰. ↩️ 👉, **FastAPI** ⚫️ 🚚 🎛 🛠️ 🧾 (⚙️ 📄), ❔ 👆 💪 🔐 http://127.0.0.1:8000/redoc: 🎏 🌌, 📤 📚 🔗 🧰. ✅ 📟 ⚡ 🧰 📚 🇪🇸. ## Pydantic 🌐 💽 🔬 🎭 🔽 🚘 Pydantic, 👆 🤚 🌐 💰 ⚪️➡️ ⚫️. & 👆 💭 👆 👍 ✋. 👆 💪 ⚙️ 🎏 🆎 📄 ⏮️ `str`, `float`, `bool` & 📚 🎏 🏗 📊 🆎. 📚 👫 🔬 ⏭ 📃 🔰. ## ✔ 🤔 🕐❔ 🏗 *➡ 🛠️*, 👆 💪 🔎 ⚠ 🌐❔ 👆 ✔️ 🔧 ➡. 💖 `/users/me`, ➡️ 💬 👈 ⚫️ 🤚 📊 🔃 ⏮️ 👩‍💻. & ⤴️ 👆 💪 ✔️ ➡ `/users/{user_id}` 🤚 💽 🔃 🎯 👩‍💻 👩‍💻 🆔. ↩️ *➡ 🛠️* 🔬 ✔, 👆 💪 ⚒ 💭 👈 ➡ `/users/me` 📣 ⏭ 1️⃣ `/users/{user_id}`: ```Python hl_lines="6 11" {!../../../docs_src/path_params/tutorial003.py!} ``` ⏪, ➡ `/users/{user_id}` 🔜 🏏 `/users/me`, "💭" 👈 ⚫️ 📨 🔢 `user_id` ⏮️ 💲 `"me"`. ➡, 👆 🚫🔜 ↔ ➡ 🛠️: ```Python hl_lines="6 11" {!../../../docs_src/path_params/tutorial003b.py!} ``` 🥇 🕐 🔜 🕧 ⚙️ ↩️ ➡ 🏏 🥇. ## 🔁 💲 🚥 👆 ✔️ *➡ 🛠️* 👈 📨 *➡ 🔢*, ✋️ 👆 💚 💪 ☑ *➡ 🔢* 💲 🔁, 👆 💪 ⚙️ 🐩 🐍 `Enum`. ### ✍ `Enum` 🎓 🗄 `Enum` & ✍ 🎧-🎓 👈 😖 ⚪️➡️ `str` & ⚪️➡️ `Enum`. 😖 ⚪️➡️ `str` 🛠️ 🩺 🔜 💪 💭 👈 💲 🔜 🆎 `string` & 🔜 💪 ✍ ☑. ⤴️ ✍ 🎓 🔢 ⏮️ 🔧 💲, ❔ 🔜 💪 ☑ 💲: ```Python hl_lines="1 6-9" {!../../../docs_src/path_params/tutorial005.py!} ``` !!! info 🔢 (⚖️ 🔢) 💪 🐍 ↩️ ⏬ 3️⃣.4️⃣. !!! tip 🚥 👆 💭, "📊", "🎓", & "🍏" 📛 🎰 🏫 🏷. ### 📣 *➡ 🔢* ⤴️ ✍ *➡ 🔢* ⏮️ 🆎 ✍ ⚙️ 🔢 🎓 👆 ✍ (`ModelName`): ```Python hl_lines="16" {!../../../docs_src/path_params/tutorial005.py!} ``` ### ✅ 🩺 ↩️ 💪 💲 *➡ 🔢* 🔢, 🎓 🩺 💪 🎦 👫 🎆: ### 👷 ⏮️ 🐍 *🔢* 💲 *➡ 🔢* 🔜 *🔢 👨‍🎓*. #### 🔬 *🔢 👨‍🎓* 👆 💪 🔬 ⚫️ ⏮️ *🔢 👨‍🎓* 👆 ✍ 🔢 `ModelName`: ```Python hl_lines="17" {!../../../docs_src/path_params/tutorial005.py!} ``` #### 🤚 *🔢 💲* 👆 💪 🤚 ☑ 💲 ( `str` 👉 💼) ⚙️ `model_name.value`, ⚖️ 🏢, `your_enum_member.value`: ```Python hl_lines="20" {!../../../docs_src/path_params/tutorial005.py!} ``` !!! tip 👆 💪 🔐 💲 `"lenet"` ⏮️ `ModelName.lenet.value`. #### 📨 *🔢 👨‍🎓* 👆 💪 📨 *🔢 👨‍🎓* ⚪️➡️ 👆 *➡ 🛠️*, 🐦 🎻 💪 (✅ `dict`). 👫 🔜 🗜 👫 🔗 💲 (🎻 👉 💼) ⏭ 🛬 👫 👩‍💻: ```Python hl_lines="18 21 23" {!../../../docs_src/path_params/tutorial005.py!} ``` 👆 👩‍💻 👆 🔜 🤚 🎻 📨 💖: ```JSON { "model_name": "alexnet", "message": "Deep Learning FTW!" } ``` ## ➡ 🔢 ⚗ ➡ ➡️ 💬 👆 ✔️ *➡ 🛠️* ⏮️ ➡ `/files/{file_path}`. ✋️ 👆 💪 `file_path` ⚫️ 🔌 *➡*, 💖 `home/johndoe/myfile.txt`. , 📛 👈 📁 🔜 🕳 💖: `/files/home/johndoe/myfile.txt`. ### 🗄 🐕‍🦺 🗄 🚫 🐕‍🦺 🌌 📣 *➡ 🔢* 🔌 *➡* 🔘, 👈 💪 ↘️ 😐 👈 ⚠ 💯 & 🔬. 👐, 👆 💪 ⚫️ **FastAPI**, ⚙️ 1️⃣ 🔗 🧰 ⚪️➡️ 💃. & 🩺 🔜 👷, 👐 🚫 ❎ 🙆 🧾 💬 👈 🔢 🔜 🔌 ➡. ### ➡ 🔌 ⚙️ 🎛 🔗 ⚪️➡️ 💃 👆 💪 📣 *➡ 🔢* ⚗ *➡* ⚙️ 📛 💖: ``` /files/{file_path:path} ``` 👉 💼, 📛 🔢 `file_path`, & 🏁 🍕, `:path`, 💬 ⚫️ 👈 🔢 🔜 🏏 🙆 *➡*. , 👆 💪 ⚙️ ⚫️ ⏮️: ```Python hl_lines="6" {!../../../docs_src/path_params/tutorial004.py!} ``` !!! tip 👆 💪 💪 🔢 🔌 `/home/johndoe/myfile.txt`, ⏮️ 🏁 🔪 (`/`). 👈 💼, 📛 🔜: `/files//home/johndoe/myfile.txt`, ⏮️ 2️⃣✖️ 🔪 (`//`) 🖖 `files` & `home`. ## 🌃 ⏮️ **FastAPI**, ⚙️ 📏, 🏋️ & 🐩 🐍 🆎 📄, 👆 🤚: * 👨‍🎨 🐕‍🦺: ❌ ✅, ✍, ♒️. * 💽 "" * 💽 🔬 * 🛠️ ✍ & 🏧 🧾 & 👆 🕴 ✔️ 📣 👫 🕐. 👈 🎲 👑 ⭐ 📈 **FastAPI** 🔬 🎛 🛠️ (↖️ ⚪️➡️ 🍣 🎭). fastapi-0.110.3/docs/em/docs/tutorial/query-params-str-validations.md000066400000000000000000000276341461403617600255440ustar00rootroot00000000000000# 🔢 🔢 & 🎻 🔬 **FastAPI** ✔ 👆 📣 🌖 ℹ & 🔬 👆 🔢. ➡️ ✊ 👉 🈸 🖼: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial001_py310.py!} ``` 🔢 🔢 `q` 🆎 `Union[str, None]` (⚖️ `str | None` 🐍 3️⃣.1️⃣0️⃣), 👈 ⛓ 👈 ⚫️ 🆎 `str` ✋️ 💪 `None`, & 👐, 🔢 💲 `None`, FastAPI 🔜 💭 ⚫️ 🚫 ✔. !!! note FastAPI 🔜 💭 👈 💲 `q` 🚫 ✔ ↩️ 🔢 💲 `= None`. `Union` `Union[str, None]` 🔜 ✔ 👆 👨‍🎨 🤝 👆 👍 🐕‍🦺 & 🔍 ❌. ## 🌖 🔬 👥 🔜 🛠️ 👈 ✋️ `q` 📦, 🕐❔ ⚫️ 🚚, **🚮 📐 🚫 📉 5️⃣0️⃣ 🦹**. ### 🗄 `Query` 🏆 👈, 🥇 🗄 `Query` ⚪️➡️ `fastapi`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="3" {!> ../../../docs_src/query_params_str_validations/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="1" {!> ../../../docs_src/query_params_str_validations/tutorial002_py310.py!} ``` ## ⚙️ `Query` 🔢 💲 & 🔜 ⚙️ ⚫️ 🔢 💲 👆 🔢, ⚒ 🔢 `max_length` 5️⃣0️⃣: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial002_py310.py!} ``` 👥 ✔️ ❎ 🔢 💲 `None` 🔢 ⏮️ `Query()`, 👥 💪 🔜 ⚒ 🔢 💲 ⏮️ 🔢 `Query(default=None)`, ⚫️ 🍦 🎏 🎯 ⚖ 👈 🔢 💲. : ```Python q: Union[str, None] = Query(default=None) ``` ...⚒ 🔢 📦, 🎏: ```Python q: Union[str, None] = None ``` & 🐍 3️⃣.1️⃣0️⃣ & 🔛: ```Python q: str | None = Query(default=None) ``` ...⚒ 🔢 📦, 🎏: ```Python q: str | None = None ``` ✋️ ⚫️ 📣 ⚫️ 🎯 💆‍♂ 🔢 🔢. !!! info ✔️ 🤯 👈 🌅 ⚠ 🍕 ⚒ 🔢 📦 🍕: ```Python = None ``` ⚖️: ```Python = Query(default=None) ``` ⚫️ 🔜 ⚙️ 👈 `None` 🔢 💲, & 👈 🌌 ⚒ 🔢 **🚫 ✔**. `Union[str, None]` 🍕 ✔ 👆 👨‍🎨 🚚 👻 🐕‍🦺, ✋️ ⚫️ 🚫 ⚫️❔ 💬 FastAPI 👈 👉 🔢 🚫 ✔. ⤴️, 👥 💪 🚶‍♀️ 🌅 🔢 `Query`. 👉 💼, `max_length` 🔢 👈 ✔ 🎻: ```Python q: Union[str, None] = Query(default=None, max_length=50) ``` 👉 🔜 ✔ 📊, 🎦 🆑 ❌ 🕐❔ 📊 🚫 ☑, & 📄 🔢 🗄 🔗 *➡ 🛠️*. ## 🚮 🌅 🔬 👆 💪 🚮 🔢 `min_length`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial003_py310.py!} ``` ## 🚮 🥔 🧬 👆 💪 🔬 🥔 🧬 👈 🔢 🔜 🏏: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="11" {!> ../../../docs_src/query_params_str_validations/tutorial004.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial004_py310.py!} ``` 👉 🎯 🥔 🧬 ✅ 👈 📨 🔢 💲: * `^`: ▶️ ⏮️ 📄 🦹, 🚫 ✔️ 🦹 ⏭. * `fixedquery`: ✔️ ☑ 💲 `fixedquery`. * `$`: 🔚 📤, 🚫 ✔️ 🙆 🌖 🦹 ⏮️ `fixedquery`. 🚥 👆 💭 💸 ⏮️ 🌐 👉 **"🥔 🧬"** 💭, 🚫 😟. 👫 🏋️ ❔ 📚 👫👫. 👆 💪 📚 💩 🍵 💆‍♂ 🥔 🧬. ✋️ 🕐❔ 👆 💪 👫 & 🚶 & 💡 👫, 💭 👈 👆 💪 ⏪ ⚙️ 👫 🔗 **FastAPI**. ## 🔢 💲 🎏 🌌 👈 👆 💪 🚶‍♀️ `None` 💲 `default` 🔢, 👆 💪 🚶‍♀️ 🎏 💲. ➡️ 💬 👈 👆 💚 📣 `q` 🔢 🔢 ✔️ `min_length` `3`, & ✔️ 🔢 💲 `"fixedquery"`: ```Python hl_lines="7" {!../../../docs_src/query_params_str_validations/tutorial005.py!} ``` !!! note ✔️ 🔢 💲 ⚒ 🔢 📦. ## ⚒ ⚫️ ✔ 🕐❔ 👥 🚫 💪 📣 🌅 🔬 ⚖️ 🗃, 👥 💪 ⚒ `q` 🔢 🔢 ✔ 🚫 📣 🔢 💲, 💖: ```Python q: str ``` ↩️: ```Python q: Union[str, None] = None ``` ✋️ 👥 🔜 📣 ⚫️ ⏮️ `Query`, 🖼 💖: ```Python q: Union[str, None] = Query(default=None, min_length=3) ``` , 🕐❔ 👆 💪 📣 💲 ✔ ⏪ ⚙️ `Query`, 👆 💪 🎯 🚫 📣 🔢 💲: ```Python hl_lines="7" {!../../../docs_src/query_params_str_validations/tutorial006.py!} ``` ### ✔ ⏮️ ❕ (`...`) 📤 🎛 🌌 🎯 📣 👈 💲 ✔. 👆 💪 ⚒ `default` 🔢 🔑 💲 `...`: ```Python hl_lines="7" {!../../../docs_src/query_params_str_validations/tutorial006b.py!} ``` !!! info 🚥 👆 🚫 👀 👈 `...` ⏭: ⚫️ 🎁 👁 💲, ⚫️ 🍕 🐍 & 🤙 "❕". ⚫️ ⚙️ Pydantic & FastAPI 🎯 📣 👈 💲 ✔. 👉 🔜 ➡️ **FastAPI** 💭 👈 👉 🔢 ✔. ### ✔ ⏮️ `None` 👆 💪 📣 👈 🔢 💪 🚫 `None`, ✋️ 👈 ⚫️ ✔. 👉 🔜 ⚡ 👩‍💻 📨 💲, 🚥 💲 `None`. 👈, 👆 💪 📣 👈 `None` ☑ 🆎 ✋️ ⚙️ `default=...`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial006c.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial006c_py310.py!} ``` !!! tip Pydantic, ❔ ⚫️❔ 🏋️ 🌐 💽 🔬 & 🛠️ FastAPI, ✔️ 🎁 🎭 🕐❔ 👆 ⚙️ `Optional` ⚖️ `Union[Something, None]` 🍵 🔢 💲, 👆 💪 ✍ 🌅 🔃 ⚫️ Pydantic 🩺 🔃 ✔ 📦 🏑. ### ⚙️ Pydantic `Required` ↩️ ❕ (`...`) 🚥 👆 💭 😬 ⚙️ `...`, 👆 💪 🗄 & ⚙️ `Required` ⚪️➡️ Pydantic: ```Python hl_lines="2 8" {!../../../docs_src/query_params_str_validations/tutorial006d.py!} ``` !!! tip 💭 👈 🌅 💼, 🕐❔ 🕳 🚚, 👆 💪 🎯 🚫 `default` 🔢, 👆 🛎 🚫 ✔️ ⚙️ `...` 🚫 `Required`. ## 🔢 🔢 📇 / 💗 💲 🕐❔ 👆 🔬 🔢 🔢 🎯 ⏮️ `Query` 👆 💪 📣 ⚫️ 📨 📇 💲, ⚖️ 🙆‍♀ 🎏 🌌, 📨 💗 💲. 🖼, 📣 🔢 🔢 `q` 👈 💪 😑 💗 🕰 📛, 👆 💪 ✍: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial011.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial011_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial011_py310.py!} ``` ⤴️, ⏮️ 📛 💖: ``` http://localhost:8000/items/?q=foo&q=bar ``` 👆 🔜 📨 💗 `q` *🔢 🔢'* 💲 (`foo` & `bar`) 🐍 `list` 🔘 👆 *➡ 🛠️ 🔢*, *🔢 🔢* `q`. , 📨 👈 📛 🔜: ```JSON { "q": [ "foo", "bar" ] } ``` !!! tip 📣 🔢 🔢 ⏮️ 🆎 `list`, 💖 🖼 🔛, 👆 💪 🎯 ⚙️ `Query`, ⏪ ⚫️ 🔜 🔬 📨 💪. 🎓 🛠️ 🩺 🔜 ℹ ➡️, ✔ 💗 💲: ### 🔢 🔢 📇 / 💗 💲 ⏮️ 🔢 & 👆 💪 🔬 🔢 `list` 💲 🚥 👌 🚚: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial012.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial012_py39.py!} ``` 🚥 👆 🚶: ``` http://localhost:8000/items/ ``` 🔢 `q` 🔜: `["foo", "bar"]` & 👆 📨 🔜: ```JSON { "q": [ "foo", "bar" ] } ``` #### ⚙️ `list` 👆 💪 ⚙️ `list` 🔗 ↩️ `List[str]` (⚖️ `list[str]` 🐍 3️⃣.9️⃣ ➕): ```Python hl_lines="7" {!../../../docs_src/query_params_str_validations/tutorial013.py!} ``` !!! note ✔️ 🤯 👈 👉 💼, FastAPI 🏆 🚫 ✅ 🎚 📇. 🖼, `List[int]` 🔜 ✅ (& 📄) 👈 🎚 📇 🔢. ✋️ `list` 😞 🚫🔜. ## 📣 🌅 🗃 👆 💪 🚮 🌅 ℹ 🔃 🔢. 👈 ℹ 🔜 🔌 🏗 🗄 & ⚙️ 🧾 👩‍💻 🔢 & 🔢 🧰. !!! note ✔️ 🤯 👈 🎏 🧰 5️⃣📆 ✔️ 🎏 🎚 🗄 🐕‍🦺. 👫 💪 🚫 🎦 🌐 ➕ ℹ 📣, 👐 🌅 💼, ❌ ⚒ ⏪ 📄 🛠️. 👆 💪 🚮 `title`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial007.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="8" {!> ../../../docs_src/query_params_str_validations/tutorial007_py310.py!} ``` & `description`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="13" {!> ../../../docs_src/query_params_str_validations/tutorial008.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="11" {!> ../../../docs_src/query_params_str_validations/tutorial008_py310.py!} ``` ## 📛 🔢 🌈 👈 👆 💚 🔢 `item-query`. 💖: ``` http://127.0.0.1:8000/items/?item-query=foobaritems ``` ✋️ `item-query` 🚫 ☑ 🐍 🔢 📛. 🔐 🔜 `item_query`. ✋️ 👆 💪 ⚫️ ⚫️❔ `item-query`... ⤴️ 👆 💪 📣 `alias`, & 👈 📛 ⚫️❔ 🔜 ⚙️ 🔎 🔢 💲: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/query_params_str_validations/tutorial009.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/query_params_str_validations/tutorial009_py310.py!} ``` ## 😛 🔢 🔜 ➡️ 💬 👆 🚫 💖 👉 🔢 🚫🔜. 👆 ✔️ 👈 ⚫️ 📤 ⏪ ↩️ 📤 👩‍💻 ⚙️ ⚫️, ✋️ 👆 💚 🩺 🎯 🎦 ⚫️ 😢. ⤴️ 🚶‍♀️ 🔢 `deprecated=True` `Query`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="18" {!> ../../../docs_src/query_params_str_validations/tutorial010.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="16" {!> ../../../docs_src/query_params_str_validations/tutorial010_py310.py!} ``` 🩺 🔜 🎦 ⚫️ 💖 👉: ## 🚫 ⚪️➡️ 🗄 🚫 🔢 🔢 ⚪️➡️ 🏗 🗄 🔗 (& ➡️, ⚪️➡️ 🏧 🧾 ⚙️), ⚒ 🔢 `include_in_schema` `Query` `False`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="10" {!> ../../../docs_src/query_params_str_validations/tutorial014.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="8" {!> ../../../docs_src/query_params_str_validations/tutorial014_py310.py!} ``` ## 🌃 👆 💪 📣 🌖 🔬 & 🗃 👆 🔢. 💊 🔬 & 🗃: * `alias` * `title` * `description` * `deprecated` 🔬 🎯 🎻: * `min_length` * `max_length` * `regex` 👫 🖼 👆 👀 ❔ 📣 🔬 `str` 💲. 👀 ⏭ 📃 👀 ❔ 📣 🔬 🎏 🆎, 💖 🔢. fastapi-0.110.3/docs/em/docs/tutorial/query-params.md000066400000000000000000000107211461403617600224100ustar00rootroot00000000000000# 🔢 🔢 🕐❔ 👆 📣 🎏 🔢 🔢 👈 🚫 🍕 ➡ 🔢, 👫 🔁 🔬 "🔢" 🔢. ```Python hl_lines="9" {!../../../docs_src/query_params/tutorial001.py!} ``` 🔢 ⚒ 🔑-💲 👫 👈 🚶 ⏮️ `?` 📛, 🎏 `&` 🦹. 🖼, 📛: ``` http://127.0.0.1:8000/items/?skip=0&limit=10 ``` ...🔢 🔢: * `skip`: ⏮️ 💲 `0` * `limit`: ⏮️ 💲 `10` 👫 🍕 📛, 👫 "🛎" 🎻. ✋️ 🕐❔ 👆 📣 👫 ⏮️ 🐍 🆎 (🖼 🔛, `int`), 👫 🗜 👈 🆎 & ✔ 🛡 ⚫️. 🌐 🎏 🛠️ 👈 ⚖ ➡ 🔢 ✔ 🔢 🔢: * 👨‍🎨 🐕‍🦺 (🎲) * 💽 "✍" * 💽 🔬 * 🏧 🧾 ## 🔢 🔢 🔢 🚫 🔧 🍕 ➡, 👫 💪 📦 & 💪 ✔️ 🔢 💲. 🖼 🔛 👫 ✔️ 🔢 💲 `skip=0` & `limit=10`. , 🔜 📛: ``` http://127.0.0.1:8000/items/ ``` 🔜 🎏 🔜: ``` http://127.0.0.1:8000/items/?skip=0&limit=10 ``` ✋️ 🚥 👆 🚶, 🖼: ``` http://127.0.0.1:8000/items/?skip=20 ``` 🔢 💲 👆 🔢 🔜: * `skip=20`: ↩️ 👆 ⚒ ⚫️ 📛 * `limit=10`: ↩️ 👈 🔢 💲 ## 📦 🔢 🎏 🌌, 👆 💪 📣 📦 🔢 🔢, ⚒ 👫 🔢 `None`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/query_params/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/query_params/tutorial002_py310.py!} ``` 👉 💼, 🔢 🔢 `q` 🔜 📦, & 🔜 `None` 🔢. !!! check 👀 👈 **FastAPI** 🙃 🥃 👀 👈 ➡ 🔢 `item_id` ➡ 🔢 & `q` 🚫,, ⚫️ 🔢 🔢. ## 🔢 🔢 🆎 🛠️ 👆 💪 📣 `bool` 🆎, & 👫 🔜 🗜: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/query_params/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/query_params/tutorial003_py310.py!} ``` 👉 💼, 🚥 👆 🚶: ``` http://127.0.0.1:8000/items/foo?short=1 ``` ⚖️ ``` http://127.0.0.1:8000/items/foo?short=True ``` ⚖️ ``` http://127.0.0.1:8000/items/foo?short=true ``` ⚖️ ``` http://127.0.0.1:8000/items/foo?short=on ``` ⚖️ ``` http://127.0.0.1:8000/items/foo?short=yes ``` ⚖️ 🙆 🎏 💼 📈 (🔠, 🥇 🔤 🔠, ♒️), 👆 🔢 🔜 👀 🔢 `short` ⏮️ `bool` 💲 `True`. ⏪ `False`. ## 💗 ➡ & 🔢 🔢 👆 💪 📣 💗 ➡ 🔢 & 🔢 🔢 🎏 🕰, **FastAPI** 💭 ❔ ❔. & 👆 🚫 ✔️ 📣 👫 🙆 🎯 ✔. 👫 🔜 🔬 📛: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="8 10" {!> ../../../docs_src/query_params/tutorial004.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="6 8" {!> ../../../docs_src/query_params/tutorial004_py310.py!} ``` ## ✔ 🔢 🔢 🕐❔ 👆 📣 🔢 💲 🚫-➡ 🔢 (🔜, 👥 ✔️ 🕴 👀 🔢 🔢), ⤴️ ⚫️ 🚫 ✔. 🚥 👆 🚫 💚 🚮 🎯 💲 ✋️ ⚒ ⚫️ 📦, ⚒ 🔢 `None`. ✋️ 🕐❔ 👆 💚 ⚒ 🔢 🔢 ✔, 👆 💪 🚫 📣 🙆 🔢 💲: ```Python hl_lines="6-7" {!../../../docs_src/query_params/tutorial005.py!} ``` 📥 🔢 🔢 `needy` ✔ 🔢 🔢 🆎 `str`. 🚥 👆 📂 👆 🖥 📛 💖: ``` http://127.0.0.1:8000/items/foo-item ``` ...🍵 ❎ ✔ 🔢 `needy`, 👆 🔜 👀 ❌ 💖: ```JSON { "detail": [ { "loc": [ "query", "needy" ], "msg": "field required", "type": "value_error.missing" } ] } ``` `needy` 🚚 🔢, 👆 🔜 💪 ⚒ ⚫️ 📛: ``` http://127.0.0.1:8000/items/foo-item?needy=sooooneedy ``` ...👉 🔜 👷: ```JSON { "item_id": "foo-item", "needy": "sooooneedy" } ``` & ↗️, 👆 💪 🔬 🔢 ✔, ✔️ 🔢 💲, & 🍕 📦: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="10" {!> ../../../docs_src/query_params/tutorial006.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="8" {!> ../../../docs_src/query_params/tutorial006_py310.py!} ``` 👉 💼, 📤 3️⃣ 🔢 🔢: * `needy`, ✔ `str`. * `skip`, `int` ⏮️ 🔢 💲 `0`. * `limit`, 📦 `int`. !!! tip 👆 💪 ⚙️ `Enum`Ⓜ 🎏 🌌 ⏮️ [➡ 🔢](path-params.md#_7){.internal-link target=_blank}. fastapi-0.110.3/docs/em/docs/tutorial/request-files.md000066400000000000000000000152211461403617600225520ustar00rootroot00000000000000# 📨 📁 👆 💪 🔬 📁 📂 👩‍💻 ⚙️ `File`. !!! info 📨 📂 📁, 🥇 ❎ `python-multipart`. 🤶 Ⓜ. `pip install python-multipart`. 👉 ↩️ 📂 📁 📨 "📨 💽". ## 🗄 `File` 🗄 `File` & `UploadFile` ⚪️➡️ `fastapi`: ```Python hl_lines="1" {!../../../docs_src/request_files/tutorial001.py!} ``` ## 🔬 `File` 🔢 ✍ 📁 🔢 🎏 🌌 👆 🔜 `Body` ⚖️ `Form`: ```Python hl_lines="7" {!../../../docs_src/request_files/tutorial001.py!} ``` !!! info `File` 🎓 👈 😖 🔗 ⚪️➡️ `Form`. ✋️ 💭 👈 🕐❔ 👆 🗄 `Query`, `Path`, `File` & 🎏 ⚪️➡️ `fastapi`, 👈 🤙 🔢 👈 📨 🎁 🎓. !!! tip 📣 📁 💪, 👆 💪 ⚙️ `File`, ↩️ ⏪ 🔢 🔜 🔬 🔢 🔢 ⚖️ 💪 (🎻) 🔢. 📁 🔜 📂 "📨 💽". 🚥 👆 📣 🆎 👆 *➡ 🛠️ 🔢* 🔢 `bytes`, **FastAPI** 🔜 ✍ 📁 👆 & 👆 🔜 📨 🎚 `bytes`. ✔️ 🤯 👈 👉 ⛓ 👈 🎂 🎚 🔜 🏪 💾. 👉 🔜 👷 👍 🤪 📁. ✋️ 📤 📚 💼 ❔ 👆 💪 💰 ⚪️➡️ ⚙️ `UploadFile`. ## 📁 🔢 ⏮️ `UploadFile` 🔬 📁 🔢 ⏮️ 🆎 `UploadFile`: ```Python hl_lines="12" {!../../../docs_src/request_files/tutorial001.py!} ``` ⚙️ `UploadFile` ✔️ 📚 📈 🤭 `bytes`: * 👆 🚫 ✔️ ⚙️ `File()` 🔢 💲 🔢. * ⚫️ ⚙️ "🧵" 📁: * 📁 🏪 💾 🆙 🔆 📐 📉, & ⏮️ 🚶‍♀️ 👉 📉 ⚫️ 🔜 🏪 💾. * 👉 ⛓ 👈 ⚫️ 🔜 👷 👍 ⭕ 📁 💖 🖼, 📹, ⭕ 💱, ♒️. 🍵 😩 🌐 💾. * 👆 💪 🤚 🗃 ⚪️➡️ 📂 📁. * ⚫️ ✔️ 📁-💖 `async` 🔢. * ⚫️ 🎦 ☑ 🐍 `SpooledTemporaryFile` 🎚 👈 👆 💪 🚶‍♀️ 🔗 🎏 🗃 👈 ⌛ 📁-💖 🎚. ### `UploadFile` `UploadFile` ✔️ 📄 🔢: * `filename`: `str` ⏮️ ⏮️ 📁 📛 👈 📂 (✅ `myimage.jpg`). * `content_type`: `str` ⏮️ 🎚 🆎 (📁 🆎 / 📻 🆎) (✅ `image/jpeg`). * `file`: `SpooledTemporaryFile` ( 📁-💖 🎚). 👉 ☑ 🐍 📁 👈 👆 💪 🚶‍♀️ 🔗 🎏 🔢 ⚖️ 🗃 👈 ⌛ "📁-💖" 🎚. `UploadFile` ✔️ 📄 `async` 👩‍🔬. 👫 🌐 🤙 🔗 📁 👩‍🔬 🔘 (⚙️ 🔗 `SpooledTemporaryFile`). * `write(data)`: ✍ `data` (`str` ⚖️ `bytes`) 📁. * `read(size)`: ✍ `size` (`int`) 🔢/🦹 📁. * `seek(offset)`: 🚶 🔢 🧘 `offset` (`int`) 📁. * 🤶 Ⓜ., `await myfile.seek(0)` 🔜 🚶 ▶️ 📁. * 👉 ✴️ ⚠ 🚥 👆 🏃 `await myfile.read()` 🕐 & ⤴️ 💪 ✍ 🎚 🔄. * `close()`: 🔐 📁. 🌐 👫 👩‍🔬 `async` 👩‍🔬, 👆 💪 "⌛" 👫. 🖼, 🔘 `async` *➡ 🛠️ 🔢* 👆 💪 🤚 🎚 ⏮️: ```Python contents = await myfile.read() ``` 🚥 👆 🔘 😐 `def` *➡ 🛠️ 🔢*, 👆 💪 🔐 `UploadFile.file` 🔗, 🖼: ```Python contents = myfile.file.read() ``` !!! note "`async` 📡 ℹ" 🕐❔ 👆 ⚙️ `async` 👩‍🔬, **FastAPI** 🏃 📁 👩‍🔬 🧵 & ⌛ 👫. !!! note "💃 📡 ℹ" **FastAPI**'Ⓜ `UploadFile` 😖 🔗 ⚪️➡️ **💃**'Ⓜ `UploadFile`, ✋️ 🚮 💪 🍕 ⚒ ⚫️ 🔗 ⏮️ **Pydantic** & 🎏 🍕 FastAPI. ## ⚫️❔ "📨 💽" 🌌 🕸 📨 (`
`) 📨 💽 💽 🛎 ⚙️ "🎁" 🔢 👈 📊, ⚫️ 🎏 ⚪️➡️ 🎻. **FastAPI** 🔜 ⚒ 💭 ✍ 👈 📊 ⚪️➡️ ▶️️ 🥉 ↩️ 🎻. !!! note "📡 ℹ" 📊 ⚪️➡️ 📨 🛎 🗜 ⚙️ "📻 🆎" `application/x-www-form-urlencoded` 🕐❔ ⚫️ 🚫 🔌 📁. ✋️ 🕐❔ 📨 🔌 📁, ⚫️ 🗜 `multipart/form-data`. 🚥 👆 ⚙️ `File`, **FastAPI** 🔜 💭 ⚫️ ✔️ 🤚 📁 ⚪️➡️ ☑ 🍕 💪. 🚥 👆 💚 ✍ 🌖 🔃 👉 🔢 & 📨 🏑, 👳 🏇 🕸 🩺 POST. !!! warning 👆 💪 📣 💗 `File` & `Form` 🔢 *➡ 🛠️*, ✋️ 👆 💪 🚫 📣 `Body` 🏑 👈 👆 ⌛ 📨 🎻, 📨 🔜 ✔️ 💪 🗜 ⚙️ `multipart/form-data` ↩️ `application/json`. 👉 🚫 🚫 **FastAPI**, ⚫️ 🍕 🇺🇸🔍 🛠️. ## 📦 📁 📂 👆 💪 ⚒ 📁 📦 ⚙️ 🐩 🆎 ✍ & ⚒ 🔢 💲 `None`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9 17" {!> ../../../docs_src/request_files/tutorial001_02.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7 14" {!> ../../../docs_src/request_files/tutorial001_02_py310.py!} ``` ## `UploadFile` ⏮️ 🌖 🗃 👆 💪 ⚙️ `File()` ⏮️ `UploadFile`, 🖼, ⚒ 🌖 🗃: ```Python hl_lines="13" {!../../../docs_src/request_files/tutorial001_03.py!} ``` ## 💗 📁 📂 ⚫️ 💪 📂 📚 📁 🎏 🕰. 👫 🔜 👨‍💼 🎏 "📨 🏑" 📨 ⚙️ "📨 💽". ⚙️ 👈, 📣 📇 `bytes` ⚖️ `UploadFile`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="10 15" {!> ../../../docs_src/request_files/tutorial002.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="8 13" {!> ../../../docs_src/request_files/tutorial002_py39.py!} ``` 👆 🔜 📨, 📣, `list` `bytes` ⚖️ `UploadFile`Ⓜ. !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.responses import HTMLResponse`. **FastAPI** 🚚 🎏 `starlette.responses` `fastapi.responses` 🏪 👆, 👩‍💻. ✋️ 🌅 💪 📨 👟 🔗 ⚪️➡️ 💃. ### 💗 📁 📂 ⏮️ 🌖 🗃 & 🎏 🌌 ⏭, 👆 💪 ⚙️ `File()` ⚒ 🌖 🔢, `UploadFile`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="18" {!> ../../../docs_src/request_files/tutorial003.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="16" {!> ../../../docs_src/request_files/tutorial003_py39.py!} ``` ## 🌃 ⚙️ `File`, `bytes`, & `UploadFile` 📣 📁 📂 📨, 📨 📨 💽. fastapi-0.110.3/docs/em/docs/tutorial/request-forms-and-files.md000066400000000000000000000022151461403617600244350ustar00rootroot00000000000000# 📨 📨 & 📁 👆 💪 🔬 📁 & 📨 🏑 🎏 🕰 ⚙️ `File` & `Form`. !!! info 📨 📂 📁 & /⚖️ 📨 📊, 🥇 ❎ `python-multipart`. 🤶 Ⓜ. `pip install python-multipart`. ## 🗄 `File` & `Form` ```Python hl_lines="1" {!../../../docs_src/request_forms_and_files/tutorial001.py!} ``` ## 🔬 `File` & `Form` 🔢 ✍ 📁 & 📨 🔢 🎏 🌌 👆 🔜 `Body` ⚖️ `Query`: ```Python hl_lines="8" {!../../../docs_src/request_forms_and_files/tutorial001.py!} ``` 📁 & 📨 🏑 🔜 📂 📨 📊 & 👆 🔜 📨 📁 & 📨 🏑. & 👆 💪 📣 📁 `bytes` & `UploadFile`. !!! warning 👆 💪 📣 💗 `File` & `Form` 🔢 *➡ 🛠️*, ✋️ 👆 💪 🚫 📣 `Body` 🏑 👈 👆 ⌛ 📨 🎻, 📨 🔜 ✔️ 💪 🗜 ⚙️ `multipart/form-data` ↩️ `application/json`. 👉 🚫 🚫 **FastAPI**, ⚫️ 🍕 🇺🇸🔍 🛠️. ## 🌃 ⚙️ `File` & `Form` 👯‍♂️ 🕐❔ 👆 💪 📨 💽 & 📁 🎏 📨. fastapi-0.110.3/docs/em/docs/tutorial/request-forms.md000066400000000000000000000042501461403617600225760ustar00rootroot00000000000000# 📨 💽 🕐❔ 👆 💪 📨 📨 🏑 ↩️ 🎻, 👆 💪 ⚙️ `Form`. !!! info ⚙️ 📨, 🥇 ❎ `python-multipart`. 🤶 Ⓜ. `pip install python-multipart`. ## 🗄 `Form` 🗄 `Form` ⚪️➡️ `fastapi`: ```Python hl_lines="1" {!../../../docs_src/request_forms/tutorial001.py!} ``` ## 🔬 `Form` 🔢 ✍ 📨 🔢 🎏 🌌 👆 🔜 `Body` ⚖️ `Query`: ```Python hl_lines="7" {!../../../docs_src/request_forms/tutorial001.py!} ``` 🖼, 1️⃣ 🌌 Oauth2️⃣ 🔧 💪 ⚙️ (🤙 "🔐 💧") ⚫️ ✔ 📨 `username` & `password` 📨 🏑. 🔌 🚚 🏑 ⚫️❔ 📛 `username` & `password`, & 📨 📨 🏑, 🚫 🎻. ⏮️ `Form` 👆 💪 📣 🎏 📳 ⏮️ `Body` (& `Query`, `Path`, `Cookie`), 🔌 🔬, 🖼, 📛 (✅ `user-name` ↩️ `username`), ♒️. !!! info `Form` 🎓 👈 😖 🔗 ⚪️➡️ `Body`. !!! tip 📣 📨 💪, 👆 💪 ⚙️ `Form` 🎯, ↩️ 🍵 ⚫️ 🔢 🔜 🔬 🔢 🔢 ⚖️ 💪 (🎻) 🔢. ## 🔃 "📨 🏑" 🌌 🕸 📨 (`
`) 📨 💽 💽 🛎 ⚙️ "🎁" 🔢 👈 📊, ⚫️ 🎏 ⚪️➡️ 🎻. **FastAPI** 🔜 ⚒ 💭 ✍ 👈 📊 ⚪️➡️ ▶️️ 🥉 ↩️ 🎻. !!! note "📡 ℹ" 📊 ⚪️➡️ 📨 🛎 🗜 ⚙️ "📻 🆎" `application/x-www-form-urlencoded`. ✋️ 🕐❔ 📨 🔌 📁, ⚫️ 🗜 `multipart/form-data`. 👆 🔜 ✍ 🔃 🚚 📁 ⏭ 📃. 🚥 👆 💚 ✍ 🌖 🔃 👉 🔢 & 📨 🏑, 👳 🏇 🕸 🩺 POST. !!! warning 👆 💪 📣 💗 `Form` 🔢 *➡ 🛠️*, ✋️ 👆 💪 🚫 📣 `Body` 🏑 👈 👆 ⌛ 📨 🎻, 📨 🔜 ✔️ 💪 🗜 ⚙️ `application/x-www-form-urlencoded` ↩️ `application/json`. 👉 🚫 🚫 **FastAPI**, ⚫️ 🍕 🇺🇸🔍 🛠️. ## 🌃 ⚙️ `Form` 📣 📨 💽 🔢 🔢. fastapi-0.110.3/docs/em/docs/tutorial/response-model.md000066400000000000000000000377401461403617600227300ustar00rootroot00000000000000# 📨 🏷 - 📨 🆎 👆 💪 📣 🆎 ⚙️ 📨 ✍ *➡ 🛠️ 🔢* **📨 🆎**. 👆 💪 ⚙️ **🆎 ✍** 🎏 🌌 👆 🔜 🔢 💽 🔢 **🔢**, 👆 💪 ⚙️ Pydantic 🏷, 📇, 📖, 📊 💲 💖 🔢, 🎻, ♒️. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="18 23" {!> ../../../docs_src/response_model/tutorial001_01.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="18 23" {!> ../../../docs_src/response_model/tutorial001_01_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="16 21" {!> ../../../docs_src/response_model/tutorial001_01_py310.py!} ``` FastAPI 🔜 ⚙️ 👉 📨 🆎: * **✔** 📨 💽. * 🚥 💽 ❌ (✅ 👆 ❌ 🏑), ⚫️ ⛓ 👈 *👆* 📱 📟 💔, 🚫 🛬 ⚫️❔ ⚫️ 🔜, & ⚫️ 🔜 📨 💽 ❌ ↩️ 🛬 ❌ 💽. 👉 🌌 👆 & 👆 👩‍💻 💪 🎯 👈 👫 🔜 📨 💽 & 💽 💠 📈. * 🚮 **🎻 🔗** 📨, 🗄 *➡ 🛠️*. * 👉 🔜 ⚙️ **🏧 🩺**. * ⚫️ 🔜 ⚙️ 🏧 👩‍💻 📟 ⚡ 🧰. ✋️ 🏆 🥈: * ⚫️ 🔜 **📉 & ⛽** 🔢 📊 ⚫️❔ 🔬 📨 🆎. * 👉 ✴️ ⚠ **💂‍♂**, 👥 🔜 👀 🌅 👈 🔛. ## `response_model` 🔢 📤 💼 🌐❔ 👆 💪 ⚖️ 💚 📨 💽 👈 🚫 ⚫️❔ ⚫️❔ 🆎 📣. 🖼, 👆 💪 💚 **📨 📖** ⚖️ 💽 🎚, ✋️ **📣 ⚫️ Pydantic 🏷**. 👉 🌌 Pydantic 🏷 🔜 🌐 💽 🧾, 🔬, ♒️. 🎚 👈 👆 📨 (✅ 📖 ⚖️ 💽 🎚). 🚥 👆 🚮 📨 🆎 ✍, 🧰 & 👨‍🎨 🔜 😭 ⏮️ (☑) ❌ 💬 👆 👈 👆 🔢 🛬 🆎 (✅#️⃣) 👈 🎏 ⚪️➡️ ⚫️❔ 👆 📣 (✅ Pydantic 🏷). 📚 💼, 👆 💪 ⚙️ *➡ 🛠️ 👨‍🎨* 🔢 `response_model` ↩️ 📨 🆎. 👆 💪 ⚙️ `response_model` 🔢 🙆 *➡ 🛠️*: * `@app.get()` * `@app.post()` * `@app.put()` * `@app.delete()` * ♒️. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="17 22 24-27" {!> ../../../docs_src/response_model/tutorial001.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="17 22 24-27" {!> ../../../docs_src/response_model/tutorial001_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="17 22 24-27" {!> ../../../docs_src/response_model/tutorial001_py310.py!} ``` !!! note 👀 👈 `response_model` 🔢 "👨‍🎨" 👩‍🔬 (`get`, `post`, ♒️). 🚫 👆 *➡ 🛠️ 🔢*, 💖 🌐 🔢 & 💪. `response_model` 📨 🎏 🆎 👆 🔜 📣 Pydantic 🏷 🏑,, ⚫️ 💪 Pydantic 🏷, ✋️ ⚫️ 💪, ✅ `list` Pydantic 🏷, 💖 `List[Item]`. FastAPI 🔜 ⚙️ 👉 `response_model` 🌐 💽 🧾, 🔬, ♒️. & **🗜 & ⛽ 🔢 📊** 🚮 🆎 📄. !!! tip 🚥 👆 ✔️ ⚠ 🆎 ✅ 👆 👨‍🎨, ✍, ♒️, 👆 💪 📣 🔢 📨 🆎 `Any`. 👈 🌌 👆 💬 👨‍🎨 👈 👆 😫 🛬 🕳. ✋️ FastAPI 🔜 💽 🧾, 🔬, 🖥, ♒️. ⏮️ `response_model`. ### `response_model` 📫 🚥 👆 📣 👯‍♂️ 📨 🆎 & `response_model`, `response_model` 🔜 ✊ 📫 & ⚙️ FastAPI. 👉 🌌 👆 💪 🚮 ☑ 🆎 ✍ 👆 🔢 🕐❔ 👆 🛬 🆎 🎏 🌘 📨 🏷, ⚙️ 👨‍🎨 & 🧰 💖 ✍. & 👆 💪 ✔️ FastAPI 💽 🔬, 🧾, ♒️. ⚙️ `response_model`. 👆 💪 ⚙️ `response_model=None` ❎ 🏗 📨 🏷 👈 *➡ 🛠️*, 👆 5️⃣📆 💪 ⚫️ 🚥 👆 ❎ 🆎 ✍ 👜 👈 🚫 ☑ Pydantic 🏑, 👆 🔜 👀 🖼 👈 1️⃣ 📄 🔛. ## 📨 🎏 🔢 💽 📥 👥 📣 `UserIn` 🏷, ⚫️ 🔜 🔌 🔢 🔐: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9 11" {!> ../../../docs_src/response_model/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7 9" {!> ../../../docs_src/response_model/tutorial002_py310.py!} ``` !!! info ⚙️ `EmailStr`, 🥇 ❎ `email_validator`. 🤶 Ⓜ. `pip install email-validator` ⚖️ `pip install pydantic[email]`. & 👥 ⚙️ 👉 🏷 📣 👆 🔢 & 🎏 🏷 📣 👆 🔢: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="18" {!> ../../../docs_src/response_model/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="16" {!> ../../../docs_src/response_model/tutorial002_py310.py!} ``` 🔜, 🕐❔ 🖥 🏗 👩‍💻 ⏮️ 🔐, 🛠️ 🔜 📨 🎏 🔐 📨. 👉 💼, ⚫️ 💪 🚫 ⚠, ↩️ ⚫️ 🎏 👩‍💻 📨 🔐. ✋️ 🚥 👥 ⚙️ 🎏 🏷 ➕1️⃣ *➡ 🛠️*, 👥 💪 📨 👆 👩‍💻 🔐 🔠 👩‍💻. !!! danger 🙅 🏪 ✅ 🔐 👩‍💻 ⚖️ 📨 ⚫️ 📨 💖 👉, 🚥 👆 💭 🌐 ⚠ & 👆 💭 ⚫️❔ 👆 🔨. ## 🚮 🔢 🏷 👥 💪 ↩️ ✍ 🔢 🏷 ⏮️ 🔢 🔐 & 🔢 🏷 🍵 ⚫️: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9 11 16" {!> ../../../docs_src/response_model/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="9 11 16" {!> ../../../docs_src/response_model/tutorial003_py310.py!} ``` 📥, ✋️ 👆 *➡ 🛠️ 🔢* 🛬 🎏 🔢 👩‍💻 👈 🔌 🔐: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="24" {!> ../../../docs_src/response_model/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="24" {!> ../../../docs_src/response_model/tutorial003_py310.py!} ``` ...👥 📣 `response_model` 👆 🏷 `UserOut`, 👈 🚫 🔌 🔐: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="22" {!> ../../../docs_src/response_model/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="22" {!> ../../../docs_src/response_model/tutorial003_py310.py!} ``` , **FastAPI** 🔜 ✊ 💅 🖥 👅 🌐 💽 👈 🚫 📣 🔢 🏷 (⚙️ Pydantic). ### `response_model` ⚖️ 📨 🆎 👉 💼, ↩️ 2️⃣ 🏷 🎏, 🚥 👥 ✍ 🔢 📨 🆎 `UserOut`, 👨‍🎨 & 🧰 🔜 😭 👈 👥 🛬 ❌ 🆎, 📚 🎏 🎓. 👈 ⚫️❔ 👉 🖼 👥 ✔️ 📣 ⚫️ `response_model` 🔢. ...✋️ 😣 👂 🔛 👀 ❔ ❎ 👈. ## 📨 🆎 & 💽 🖥 ➡️ 😣 ⚪️➡️ ⏮️ 🖼. 👥 💚 **✍ 🔢 ⏮️ 1️⃣ 🆎** ✋️ 📨 🕳 👈 🔌 **🌅 💽**. 👥 💚 FastAPI 🚧 **🖥** 📊 ⚙️ 📨 🏷. ⏮️ 🖼, ↩️ 🎓 🎏, 👥 ✔️ ⚙️ `response_model` 🔢. ✋️ 👈 ⛓ 👈 👥 🚫 🤚 🐕‍🦺 ⚪️➡️ 👨‍🎨 & 🧰 ✅ 🔢 📨 🆎. ✋️ 🌅 💼 🌐❔ 👥 💪 🕳 💖 👉, 👥 💚 🏷 **⛽/❎** 📊 👉 🖼. & 👈 💼, 👥 💪 ⚙️ 🎓 & 🧬 ✊ 📈 🔢 **🆎 ✍** 🤚 👍 🐕‍🦺 👨‍🎨 & 🧰, & 🤚 FastAPI **💽 🖥**. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9-13 15-16 20" {!> ../../../docs_src/response_model/tutorial003_01.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7-10 13-14 18" {!> ../../../docs_src/response_model/tutorial003_01_py310.py!} ``` ⏮️ 👉, 👥 🤚 🏭 🐕‍🦺, ⚪️➡️ 👨‍🎨 & ✍ 👉 📟 ☑ ⚖ 🆎, ✋️ 👥 🤚 💽 🖥 ⚪️➡️ FastAPI. ❔ 🔨 👉 👷 ❓ ➡️ ✅ 👈 👅. 👶 ### 🆎 ✍ & 🏭 🥇 ➡️ 👀 ❔ 👨‍🎨, ✍ & 🎏 🧰 🔜 👀 👉. `BaseUser` ✔️ 🧢 🏑. ⤴️ `UserIn` 😖 ⚪️➡️ `BaseUser` & 🚮 `password` 🏑,, ⚫️ 🔜 🔌 🌐 🏑 ⚪️➡️ 👯‍♂️ 🏷. 👥 ✍ 🔢 📨 🆎 `BaseUser`, ✋️ 👥 🤙 🛬 `UserIn` 👐. 👨‍🎨, ✍, & 🎏 🧰 🏆 🚫 😭 🔃 👉 ↩️, ⌨ ⚖, `UserIn` 🏿 `BaseUser`, ❔ ⛓ ⚫️ *☑* 🆎 🕐❔ ⚫️❔ ⌛ 🕳 👈 `BaseUser`. ### FastAPI 💽 🖥 🔜, FastAPI, ⚫️ 🔜 👀 📨 🆎 & ⚒ 💭 👈 ⚫️❔ 👆 📨 🔌 **🕴** 🏑 👈 📣 🆎. FastAPI 🔨 📚 👜 🔘 ⏮️ Pydantic ⚒ 💭 👈 📚 🎏 🚫 🎓 🧬 🚫 ⚙️ 📨 💽 🖥, ⏪ 👆 💪 🔚 🆙 🛬 🌅 🌅 💽 🌘 ⚫️❔ 👆 📈. 👉 🌌, 👆 💪 🤚 🏆 👯‍♂️ 🌏: 🆎 ✍ ⏮️ **🏭 🐕‍🦺** & **💽 🖥**. ## 👀 ⚫️ 🩺 🕐❔ 👆 👀 🏧 🩺, 👆 💪 ✅ 👈 🔢 🏷 & 🔢 🏷 🔜 👯‍♂️ ✔️ 👫 👍 🎻 🔗: & 👯‍♂️ 🏷 🔜 ⚙️ 🎓 🛠️ 🧾: ## 🎏 📨 🆎 ✍ 📤 5️⃣📆 💼 🌐❔ 👆 📨 🕳 👈 🚫 ☑ Pydantic 🏑 & 👆 ✍ ⚫️ 🔢, 🕴 🤚 🐕‍🦺 🚚 🏭 (👨‍🎨, ✍, ♒️). ### 📨 📨 🔗 🏆 ⚠ 💼 🔜 [🛬 📨 🔗 🔬 ⏪ 🏧 🩺](../advanced/response-directly.md){.internal-link target=_blank}. ```Python hl_lines="8 10-11" {!> ../../../docs_src/response_model/tutorial003_02.py!} ``` 👉 🙅 💼 🍵 🔁 FastAPI ↩️ 📨 🆎 ✍ 🎓 (⚖️ 🏿) `Response`. & 🧰 🔜 😄 ↩️ 👯‍♂️ `RedirectResponse` & `JSONResponse` 🏿 `Response`, 🆎 ✍ ☑. ### ✍ 📨 🏿 👆 💪 ⚙️ 🏿 `Response` 🆎 ✍: ```Python hl_lines="8-9" {!> ../../../docs_src/response_model/tutorial003_03.py!} ``` 👉 🔜 👷 ↩️ `RedirectResponse` 🏿 `Response`, & FastAPI 🔜 🔁 🍵 👉 🙅 💼. ### ❌ 📨 🆎 ✍ ✋️ 🕐❔ 👆 📨 🎏 ❌ 🎚 👈 🚫 ☑ Pydantic 🆎 (✅ 💽 🎚) & 👆 ✍ ⚫️ 💖 👈 🔢, FastAPI 🔜 🔄 ✍ Pydantic 📨 🏷 ⚪️➡️ 👈 🆎 ✍, & 🔜 ❌. 🎏 🔜 🔨 🚥 👆 ✔️ 🕳 💖 🇪🇺 🖖 🎏 🆎 🌐❔ 1️⃣ ⚖️ 🌅 👫 🚫 ☑ Pydantic 🆎, 🖼 👉 🔜 ❌ 👶: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="10" {!> ../../../docs_src/response_model/tutorial003_04.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="8" {!> ../../../docs_src/response_model/tutorial003_04_py310.py!} ``` ...👉 ❌ ↩️ 🆎 ✍ 🚫 Pydantic 🆎 & 🚫 👁 `Response` 🎓 ⚖️ 🏿, ⚫️ 🇪🇺 (🙆 2️⃣) 🖖 `Response` & `dict`. ### ❎ 📨 🏷 ▶️ ⚪️➡️ 🖼 🔛, 👆 5️⃣📆 🚫 💚 ✔️ 🔢 💽 🔬, 🧾, 🖥, ♒️. 👈 🎭 FastAPI. ✋️ 👆 💪 💚 🚧 📨 🆎 ✍ 🔢 🤚 🐕‍🦺 ⚪️➡️ 🧰 💖 👨‍🎨 & 🆎 ☑ (✅ ✍). 👉 💼, 👆 💪 ❎ 📨 🏷 ⚡ ⚒ `response_model=None`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/response_model/tutorial003_05.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/response_model/tutorial003_05_py310.py!} ``` 👉 🔜 ⚒ FastAPI 🚶 📨 🏷 ⚡ & 👈 🌌 👆 💪 ✔️ 🙆 📨 🆎 ✍ 👆 💪 🍵 ⚫️ 🤕 👆 FastAPI 🈸. 👶 ## 📨 🏷 🔢 🔢 👆 📨 🏷 💪 ✔️ 🔢 💲, 💖: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="11 13-14" {!> ../../../docs_src/response_model/tutorial004.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="11 13-14" {!> ../../../docs_src/response_model/tutorial004_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="9 11-12" {!> ../../../docs_src/response_model/tutorial004_py310.py!} ``` * `description: Union[str, None] = None` (⚖️ `str | None = None` 🐍 3️⃣.1️⃣0️⃣) ✔️ 🔢 `None`. * `tax: float = 10.5` ✔️ 🔢 `10.5`. * `tags: List[str] = []` 🔢 🛁 📇: `[]`. ✋️ 👆 💪 💚 🚫 👫 ⚪️➡️ 🏁 🚥 👫 🚫 🤙 🏪. 🖼, 🚥 👆 ✔️ 🏷 ⏮️ 📚 📦 🔢 ☁ 💽, ✋️ 👆 🚫 💚 📨 📶 📏 🎻 📨 🌕 🔢 💲. ### ⚙️ `response_model_exclude_unset` 🔢 👆 💪 ⚒ *➡ 🛠️ 👨‍🎨* 🔢 `response_model_exclude_unset=True`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="24" {!> ../../../docs_src/response_model/tutorial004.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="24" {!> ../../../docs_src/response_model/tutorial004_py39.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="22" {!> ../../../docs_src/response_model/tutorial004_py310.py!} ``` & 👈 🔢 💲 🏆 🚫 🔌 📨, 🕴 💲 🤙 ⚒. , 🚥 👆 📨 📨 👈 *➡ 🛠️* 🏬 ⏮️ 🆔 `foo`, 📨 (🚫 ✅ 🔢 💲) 🔜: ```JSON { "name": "Foo", "price": 50.2 } ``` !!! info FastAPI ⚙️ Pydantic 🏷 `.dict()` ⏮️ 🚮 `exclude_unset` 🔢 🏆 👉. !!! info 👆 💪 ⚙️: * `response_model_exclude_defaults=True` * `response_model_exclude_none=True` 🔬 Pydantic 🩺 `exclude_defaults` & `exclude_none`. #### 📊 ⏮️ 💲 🏑 ⏮️ 🔢 ✋️ 🚥 👆 📊 ✔️ 💲 🏷 🏑 ⏮️ 🔢 💲, 💖 🏬 ⏮️ 🆔 `bar`: ```Python hl_lines="3 5" { "name": "Bar", "description": "The bartenders", "price": 62, "tax": 20.2 } ``` 👫 🔜 🔌 📨. #### 📊 ⏮️ 🎏 💲 🔢 🚥 📊 ✔️ 🎏 💲 🔢 🕐, 💖 🏬 ⏮️ 🆔 `baz`: ```Python hl_lines="3 5-6" { "name": "Baz", "description": None, "price": 50.2, "tax": 10.5, "tags": [] } ``` FastAPI 🙃 🥃 (🤙, Pydantic 🙃 🥃) 🤔 👈, ✋️ `description`, `tax`, & `tags` ✔️ 🎏 💲 🔢, 👫 ⚒ 🎯 (↩️ ✊ ⚪️➡️ 🔢). , 👫 🔜 🔌 🎻 📨. !!! tip 👀 👈 🔢 💲 💪 🕳, 🚫 🕴 `None`. 👫 💪 📇 (`[]`), `float` `10.5`, ♒️. ### `response_model_include` & `response_model_exclude` 👆 💪 ⚙️ *➡ 🛠️ 👨‍🎨* 🔢 `response_model_include` & `response_model_exclude`. 👫 ✊ `set` `str` ⏮️ 📛 🔢 🔌 (❎ 🎂) ⚖️ 🚫 (✅ 🎂). 👉 💪 ⚙️ ⏩ ⌨ 🚥 👆 ✔️ 🕴 1️⃣ Pydantic 🏷 & 💚 ❎ 💽 ⚪️➡️ 🔢. !!! tip ✋️ ⚫️ 👍 ⚙️ 💭 🔛, ⚙️ 💗 🎓, ↩️ 👫 🔢. 👉 ↩️ 🎻 🔗 🏗 👆 📱 🗄 (& 🩺) 🔜 1️⃣ 🏁 🏷, 🚥 👆 ⚙️ `response_model_include` ⚖️ `response_model_exclude` 🚫 🔢. 👉 ✔ `response_model_by_alias` 👈 👷 ➡. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="31 37" {!> ../../../docs_src/response_model/tutorial005.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="29 35" {!> ../../../docs_src/response_model/tutorial005_py310.py!} ``` !!! tip ❕ `{"name", "description"}` ✍ `set` ⏮️ 📚 2️⃣ 💲. ⚫️ 🌓 `set(["name", "description"])`. #### ⚙️ `list`Ⓜ ↩️ `set`Ⓜ 🚥 👆 💭 ⚙️ `set` & ⚙️ `list` ⚖️ `tuple` ↩️, FastAPI 🔜 🗜 ⚫️ `set` & ⚫️ 🔜 👷 ☑: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="31 37" {!> ../../../docs_src/response_model/tutorial006.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="29 35" {!> ../../../docs_src/response_model/tutorial006_py310.py!} ``` ## 🌃 ⚙️ *➡ 🛠️ 👨‍🎨* 🔢 `response_model` 🔬 📨 🏷 & ✴️ 🚚 📢 💽 ⛽ 👅. ⚙️ `response_model_exclude_unset` 📨 🕴 💲 🎯 ⚒. fastapi-0.110.3/docs/em/docs/tutorial/response-status-code.md000066400000000000000000000065771461403617600240670ustar00rootroot00000000000000# 📨 👔 📟 🎏 🌌 👆 💪 ✔ 📨 🏷, 👆 💪 📣 🇺🇸🔍 👔 📟 ⚙️ 📨 ⏮️ 🔢 `status_code` 🙆 *➡ 🛠️*: * `@app.get()` * `@app.post()` * `@app.put()` * `@app.delete()` * ♒️. ```Python hl_lines="6" {!../../../docs_src/response_status_code/tutorial001.py!} ``` !!! note 👀 👈 `status_code` 🔢 "👨‍🎨" 👩‍🔬 (`get`, `post`, ♒️). 🚫 👆 *➡ 🛠️ 🔢*, 💖 🌐 🔢 & 💪. `status_code` 🔢 📨 🔢 ⏮️ 🇺🇸🔍 👔 📟. !!! info `status_code` 💪 👐 📨 `IntEnum`, ✅ 🐍 `http.HTTPStatus`. ⚫️ 🔜: * 📨 👈 👔 📟 📨. * 📄 ⚫️ ✅ 🗄 🔗 ( & , 👩‍💻 🔢): !!! note 📨 📟 (👀 ⏭ 📄) 🎦 👈 📨 🔨 🚫 ✔️ 💪. FastAPI 💭 👉, & 🔜 🏭 🗄 🩺 👈 🇵🇸 📤 🙅‍♂ 📨 💪. ## 🔃 🇺🇸🔍 👔 📟 !!! note 🚥 👆 ⏪ 💭 ⚫️❔ 🇺🇸🔍 👔 📟, 🚶 ⏭ 📄. 🇺🇸🔍, 👆 📨 🔢 👔 📟 3️⃣ 9️⃣ 🍕 📨. 👫 👔 📟 ✔️ 📛 🔗 🤔 👫, ✋️ ⚠ 🍕 🔢. 📏: * `100` & 🔛 "ℹ". 👆 🛎 ⚙️ 👫 🔗. 📨 ⏮️ 👫 👔 📟 🚫🔜 ✔️ 💪. * **`200`** & 🔛 "🏆" 📨. 👫 🕐 👆 🔜 ⚙️ 🏆. * `200` 🔢 👔 📟, ❔ ⛓ 🌐 "👌". * ➕1️⃣ 🖼 🔜 `201`, "✍". ⚫️ 🛎 ⚙️ ⏮️ 🏗 🆕 ⏺ 💽. * 🎁 💼 `204`, "🙅‍♂ 🎚". 👉 📨 ⚙️ 🕐❔ 📤 🙅‍♂ 🎚 📨 👩‍💻, & 📨 🔜 🚫 ✔️ 💪. * **`300`** & 🔛 "❎". 📨 ⏮️ 👫 👔 📟 5️⃣📆 ⚖️ 5️⃣📆 🚫 ✔️ 💪, 🌖 `304`, "🚫 🔀", ❔ 🔜 🚫 ✔️ 1️⃣. * **`400`** & 🔛 "👩‍💻 ❌" 📨. 👫 🥈 🆎 👆 🔜 🎲 ⚙️ 🏆. * 🖼 `404`, "🚫 🔎" 📨. * 💊 ❌ ⚪️➡️ 👩‍💻, 👆 💪 ⚙️ `400`. * `500` & 🔛 💽 ❌. 👆 🌖 🙅 ⚙️ 👫 🔗. 🕐❔ 🕳 🚶 ❌ 🍕 👆 🈸 📟, ⚖️ 💽, ⚫️ 🔜 🔁 📨 1️⃣ 👫 👔 📟. !!! tip 💭 🌅 🔃 🔠 👔 📟 & ❔ 📟 ⚫️❔, ✅ 🏇 🧾 🔃 🇺🇸🔍 👔 📟. ## ⌨ 💭 📛 ➡️ 👀 ⏮️ 🖼 🔄: ```Python hl_lines="6" {!../../../docs_src/response_status_code/tutorial001.py!} ``` `201` 👔 📟 "✍". ✋️ 👆 🚫 ✔️ ✍ ⚫️❔ 🔠 👉 📟 ⛓. 👆 💪 ⚙️ 🏪 🔢 ⚪️➡️ `fastapi.status`. ```Python hl_lines="1 6" {!../../../docs_src/response_status_code/tutorial002.py!} ``` 👫 🏪, 👫 🧑‍🤝‍🧑 🎏 🔢, ✋️ 👈 🌌 👆 💪 ⚙️ 👨‍🎨 📋 🔎 👫: !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette import status`. **FastAPI** 🚚 🎏 `starlette.status` `fastapi.status` 🏪 👆, 👩‍💻. ✋️ ⚫️ 👟 🔗 ⚪️➡️ 💃. ## 🔀 🔢 ⏪, [🏧 👩‍💻 🦮](../advanced/response-change-status-code.md){.internal-link target=_blank}, 👆 🔜 👀 ❔ 📨 🎏 👔 📟 🌘 🔢 👆 📣 📥. fastapi-0.110.3/docs/em/docs/tutorial/schema-extra-example.md000066400000000000000000000130621461403617600237750ustar00rootroot00000000000000# 📣 📨 🖼 💽 👆 💪 📣 🖼 💽 👆 📱 💪 📨. 📥 📚 🌌 ⚫️. ## Pydantic `schema_extra` 👆 💪 📣 `example` Pydantic 🏷 ⚙️ `Config` & `schema_extra`, 🔬 Pydantic 🩺: 🔗 🛃: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="15-23" {!> ../../../docs_src/schema_extra_example/tutorial001.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="13-21" {!> ../../../docs_src/schema_extra_example/tutorial001_py310.py!} ``` 👈 ➕ ℹ 🔜 🚮-🔢 **🎻 🔗** 👈 🏷, & ⚫️ 🔜 ⚙️ 🛠️ 🩺. !!! tip 👆 💪 ⚙️ 🎏 ⚒ ↔ 🎻 🔗 & 🚮 👆 👍 🛃 ➕ ℹ. 🖼 👆 💪 ⚙️ ⚫️ 🚮 🗃 🕸 👩‍💻 🔢, ♒️. ## `Field` 🌖 ❌ 🕐❔ ⚙️ `Field()` ⏮️ Pydantic 🏷, 👆 💪 📣 ➕ ℹ **🎻 🔗** 🚶‍♀️ 🙆 🎏 ❌ ❌ 🔢. 👆 💪 ⚙️ 👉 🚮 `example` 🔠 🏑: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="4 10-13" {!> ../../../docs_src/schema_extra_example/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="2 8-11" {!> ../../../docs_src/schema_extra_example/tutorial002_py310.py!} ``` !!! warning 🚧 🤯 👈 📚 ➕ ❌ 🚶‍♀️ 🏆 🚫 🚮 🙆 🔬, 🕴 ➕ ℹ, 🧾 🎯. ## `example` & `examples` 🗄 🕐❔ ⚙️ 🙆: * `Path()` * `Query()` * `Header()` * `Cookie()` * `Body()` * `Form()` * `File()` 👆 💪 📣 💽 `example` ⚖️ 👪 `examples` ⏮️ 🌖 ℹ 👈 🔜 🚮 **🗄**. ### `Body` ⏮️ `example` 📥 👥 🚶‍♀️ `example` 📊 ⌛ `Body()`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="20-25" {!> ../../../docs_src/schema_extra_example/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="18-23" {!> ../../../docs_src/schema_extra_example/tutorial003_py310.py!} ``` ### 🖼 🩺 🎚 ⏮️ 🙆 👩‍🔬 🔛 ⚫️ 🔜 👀 💖 👉 `/docs`: ### `Body` ⏮️ 💗 `examples` 👐 👁 `example`, 👆 💪 🚶‍♀️ `examples` ⚙️ `dict` ⏮️ **💗 🖼**, 🔠 ⏮️ ➕ ℹ 👈 🔜 🚮 **🗄** 💁‍♂️. 🔑 `dict` 🔬 🔠 🖼, & 🔠 💲 ➕1️⃣ `dict`. 🔠 🎯 🖼 `dict` `examples` 💪 🔌: * `summary`: 📏 📛 🖼. * `description`: 📏 📛 👈 💪 🔌 ✍ ✍. * `value`: 👉 ☑ 🖼 🎦, ✅ `dict`. * `externalValue`: 🎛 `value`, 📛 ☝ 🖼. 👐 👉 5️⃣📆 🚫 🐕‍🦺 📚 🧰 `value`. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="21-47" {!> ../../../docs_src/schema_extra_example/tutorial004.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="19-45" {!> ../../../docs_src/schema_extra_example/tutorial004_py310.py!} ``` ### 🖼 🩺 🎚 ⏮️ `examples` 🚮 `Body()` `/docs` 🔜 👀 💖: ## 📡 ℹ !!! warning 👉 📶 📡 ℹ 🔃 🐩 **🎻 🔗** & **🗄**. 🚥 💭 🔛 ⏪ 👷 👆, 👈 💪 🥃, & 👆 🎲 🚫 💪 👉 ℹ, 💭 🆓 🚶 👫. 🕐❔ 👆 🚮 🖼 🔘 Pydantic 🏷, ⚙️ `schema_extra` ⚖️ `Field(example="something")` 👈 🖼 🚮 **🎻 🔗** 👈 Pydantic 🏷. & 👈 **🎻 🔗** Pydantic 🏷 🔌 **🗄** 👆 🛠️, & ⤴️ ⚫️ ⚙️ 🩺 🎚. **🎻 🔗** 🚫 🤙 ✔️ 🏑 `example` 🐩. ⏮️ ⏬ 🎻 🔗 🔬 🏑 `examples`, ✋️ 🗄 3️⃣.0️⃣.3️⃣ ⚓️ 🔛 🗝 ⏬ 🎻 🔗 👈 🚫 ✔️ `examples`. , 🗄 3️⃣.0️⃣.3️⃣ 🔬 🚮 👍 `example` 🔀 ⏬ **🎻 🔗** ⚫️ ⚙️, 🎏 🎯 (✋️ ⚫️ 👁 `example`, 🚫 `examples`), & 👈 ⚫️❔ ⚙️ 🛠️ 🩺 🎚 (⚙️ 🦁 🎚). , 👐 `example` 🚫 🍕 🎻 🔗, ⚫️ 🍕 🗄 🛃 ⏬ 🎻 🔗, & 👈 ⚫️❔ 🔜 ⚙️ 🩺 🎚. ✋️ 🕐❔ 👆 ⚙️ `example` ⚖️ `examples` ⏮️ 🙆 🎏 🚙 (`Query()`, `Body()`, ♒️.) 📚 🖼 🚫 🚮 🎻 🔗 👈 🔬 👈 💽 (🚫 🗄 👍 ⏬ 🎻 🔗), 👫 🚮 🔗 *➡ 🛠️* 📄 🗄 (🏞 🍕 🗄 👈 ⚙️ 🎻 🔗). `Path()`, `Query()`, `Header()`, & `Cookie()`, `example` ⚖️ `examples` 🚮 🗄 🔑, `Parameter Object` (🔧). & `Body()`, `File()`, & `Form()`, `example` ⚖️ `examples` 📊 🚮 🗄 🔑, `Request Body Object`, 🏑 `content`, 🔛 `Media Type Object` (🔧). 🔛 🎏 ✋, 📤 🆕 ⏬ 🗄: **3️⃣.1️⃣.0️⃣**, ⏳ 🚀. ⚫️ ⚓️ 🔛 ⏪ 🎻 🔗 & 🏆 🛠️ ⚪️➡️ 🗄 🛃 ⏬ 🎻 🔗 ❎, 💱 ⚒ ⚪️➡️ ⏮️ ⏬ 🎻 🔗, 🌐 👫 🤪 🔺 📉. 👐, 🦁 🎚 ⏳ 🚫 🐕‍🦺 🗄 3️⃣.1️⃣.0️⃣,, 🔜, ⚫️ 👍 😣 ⚙️ 💭 🔛. fastapi-0.110.3/docs/em/docs/tutorial/security/000077500000000000000000000000001461403617600213065ustar00rootroot00000000000000fastapi-0.110.3/docs/em/docs/tutorial/security/first-steps.md000066400000000000000000000154401461403617600241170ustar00rootroot00000000000000# 💂‍♂ - 🥇 🔁 ➡️ 🌈 👈 👆 ✔️ 👆 **👩‍💻** 🛠️ 🆔. & 👆 ✔️ **🕸** ➕1️⃣ 🆔 ⚖️ 🎏 ➡ 🎏 🆔 (⚖️ 📱 🈸). & 👆 💚 ✔️ 🌌 🕸 🔓 ⏮️ 👩‍💻, ⚙️ **🆔** & **🔐**. 👥 💪 ⚙️ **Oauth2️⃣** 🏗 👈 ⏮️ **FastAPI**. ✋️ ➡️ 🖊 👆 🕰 👂 🌕 📏 🔧 🔎 👈 🐥 🍖 ℹ 👆 💪. ➡️ ⚙️ 🧰 🚚 **FastAPI** 🍵 💂‍♂. ## ❔ ⚫️ 👀 ➡️ 🥇 ⚙️ 📟 & 👀 ❔ ⚫️ 👷, & ⤴️ 👥 🔜 👟 🔙 🤔 ⚫️❔ 😥. ## ✍ `main.py` 📁 🖼 📁 `main.py`: ```Python {!../../../docs_src/security/tutorial001.py!} ``` ## 🏃 ⚫️ !!! info 🥇 ❎ `python-multipart`. 🤶 Ⓜ. `pip install python-multipart`. 👉 ↩️ **Oauth2️⃣** ⚙️ "📨 📊" 📨 `username` & `password`. 🏃 🖼 ⏮️:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
## ✅ ⚫️ 🚶 🎓 🩺: http://127.0.0.1:8000/docs. 👆 🔜 👀 🕳 💖 👉: !!! check "✔ 🔼 ❗" 👆 ⏪ ✔️ ✨ 🆕 "✔" 🔼. & 👆 *➡ 🛠️* ✔️ 🐥 🔒 🔝-▶️️ ↩ 👈 👆 💪 🖊. & 🚥 👆 🖊 ⚫️, 👆 ✔️ 🐥 ✔ 📨 🆎 `username` & `password` (& 🎏 📦 🏑): !!! note ⚫️ 🚫 🤔 ⚫️❔ 👆 🆎 📨, ⚫️ 🏆 🚫 👷. ✋️ 👥 🔜 🤚 📤. 👉 ↗️ 🚫 🕸 🏁 👩‍💻, ✋️ ⚫️ 👑 🏧 🧰 📄 🖥 🌐 👆 🛠️. ⚫️ 💪 ⚙️ 🕸 🏉 (👈 💪 👆). ⚫️ 💪 ⚙️ 🥉 🥳 🈸 & ⚙️. & ⚫️ 💪 ⚙️ 👆, ℹ, ✅ & 💯 🎏 🈸. ## `password` 💧 🔜 ➡️ 🚶 🔙 👄 & 🤔 ⚫️❔ 🌐 👈. `password` "💧" 1️⃣ 🌌 ("💧") 🔬 Oauth2️⃣, 🍵 💂‍♂ & 🤝. Oauth2️⃣ 🔧 👈 👩‍💻 ⚖️ 🛠️ 💪 🔬 💽 👈 🔓 👩‍💻. ✋️ 👉 💼, 🎏 **FastAPI** 🈸 🔜 🍵 🛠️ & 🤝. , ➡️ 📄 ⚫️ ⚪️➡️ 👈 📉 ☝ 🎑: * 👩‍💻 🆎 `username` & `password` 🕸, & 🎯 `Enter`. * 🕸 (🏃‍♂ 👩‍💻 🖥) 📨 👈 `username` & `password` 🎯 📛 👆 🛠️ (📣 ⏮️ `tokenUrl="token"`). * 🛠️ ✅ 👈 `username` & `password`, & 📨 ⏮️ "🤝" (👥 🚫 🛠️ 🙆 👉). * "🤝" 🎻 ⏮️ 🎚 👈 👥 💪 ⚙️ ⏪ ✔ 👉 👩‍💻. * 🛎, 🤝 ⚒ 🕛 ⏮️ 🕰. * , 👩‍💻 🔜 ✔️ 🕹 🔄 ☝ ⏪. * & 🚥 🤝 📎, ⚠ 🌘. ⚫️ 🚫 💖 🧲 🔑 👈 🔜 👷 ♾ (🏆 💼). * 🕸 🏪 👈 🤝 🍕 👱. * 👩‍💻 🖊 🕸 🚶 ➕1️⃣ 📄 🕸 🕸 📱. * 🕸 💪 ☕ 🌅 💽 ⚪️➡️ 🛠️. * ✋️ ⚫️ 💪 🤝 👈 🎯 🔗. * , 🔓 ⏮️ 👆 🛠️, ⚫️ 📨 🎚 `Authorization` ⏮️ 💲 `Bearer ` ➕ 🤝. * 🚥 🤝 🔌 `foobar`, 🎚 `Authorization` 🎚 🔜: `Bearer foobar`. ## **FastAPI**'Ⓜ `OAuth2PasswordBearer` **FastAPI** 🚚 📚 🧰, 🎏 🎚 ⚛, 🛠️ 👫 💂‍♂ ⚒. 👉 🖼 👥 🔜 ⚙️ **Oauth2️⃣**, ⏮️ **🔐** 💧, ⚙️ **📨** 🤝. 👥 👈 ⚙️ `OAuth2PasswordBearer` 🎓. !!! info "📨" 🤝 🚫 🕴 🎛. ✋️ ⚫️ 🏆 1️⃣ 👆 ⚙️ 💼. & ⚫️ 💪 🏆 🏆 ⚙️ 💼, 🚥 👆 Oauth2️⃣ 🕴 & 💭 ⚫️❔ ⚫️❔ 📤 ➕1️⃣ 🎛 👈 ♣ 👻 👆 💪. 👈 💼, **FastAPI** 🚚 👆 ⏮️ 🧰 🏗 ⚫️. 🕐❔ 👥 ✍ 👐 `OAuth2PasswordBearer` 🎓 👥 🚶‍♀️ `tokenUrl` 🔢. 👉 🔢 🔌 📛 👈 👩‍💻 (🕸 🏃 👩‍💻 🖥) 🔜 ⚙️ 📨 `username` & `password` ✔ 🤚 🤝. ```Python hl_lines="6" {!../../../docs_src/security/tutorial001.py!} ``` !!! tip 📥 `tokenUrl="token"` 🔗 ⚖ 📛 `token` 👈 👥 🚫 ✍. ⚫️ ⚖ 📛, ⚫️ 🌓 `./token`. ↩️ 👥 ⚙️ ⚖ 📛, 🚥 👆 🛠️ 🔎 `https://example.com/`, ⤴️ ⚫️ 🔜 🔗 `https://example.com/token`. ✋️ 🚥 👆 🛠️ 🔎 `https://example.com/api/v1/`, ⤴️ ⚫️ 🔜 🔗 `https://example.com/api/v1/token`. ⚙️ ⚖ 📛 ⚠ ⚒ 💭 👆 🈸 🚧 👷 🏧 ⚙️ 💼 💖 [⛅ 🗳](../../advanced/behind-a-proxy.md){.internal-link target=_blank}. 👉 🔢 🚫 ✍ 👈 🔗 / *➡ 🛠️*, ✋️ 📣 👈 📛 `/token` 🔜 1️⃣ 👈 👩‍💻 🔜 ⚙️ 🤚 🤝. 👈 ℹ ⚙️ 🗄, & ⤴️ 🎓 🛠️ 🧾 ⚙️. 👥 🔜 🔜 ✍ ☑ ➡ 🛠️. !!! info 🚥 👆 📶 ⚠ "✍" 👆 💪 👎 👗 🔢 📛 `tokenUrl` ↩️ `token_url`. 👈 ↩️ ⚫️ ⚙️ 🎏 📛 🗄 🔌. 👈 🚥 👆 💪 🔬 🌅 🔃 🙆 👫 💂‍♂ ⚖ 👆 💪 📁 & 📋 ⚫️ 🔎 🌖 ℹ 🔃 ⚫️. `oauth2_scheme` 🔢 👐 `OAuth2PasswordBearer`, ✋️ ⚫️ "🇧🇲". ⚫️ 💪 🤙: ```Python oauth2_scheme(some, parameters) ``` , ⚫️ 💪 ⚙️ ⏮️ `Depends`. ### ⚙️ ⚫️ 🔜 👆 💪 🚶‍♀️ 👈 `oauth2_scheme` 🔗 ⏮️ `Depends`. ```Python hl_lines="10" {!../../../docs_src/security/tutorial001.py!} ``` 👉 🔗 🔜 🚚 `str` 👈 🛠️ 🔢 `token` *➡ 🛠️ 🔢*. **FastAPI** 🔜 💭 👈 ⚫️ 💪 ⚙️ 👉 🔗 🔬 "💂‍♂ ⚖" 🗄 🔗 (& 🏧 🛠️ 🩺). !!! info "📡 ℹ" **FastAPI** 🔜 💭 👈 ⚫️ 💪 ⚙️ 🎓 `OAuth2PasswordBearer` (📣 🔗) 🔬 💂‍♂ ⚖ 🗄 ↩️ ⚫️ 😖 ⚪️➡️ `fastapi.security.oauth2.OAuth2`, ❔ 🔄 😖 ⚪️➡️ `fastapi.security.base.SecurityBase`. 🌐 💂‍♂ 🚙 👈 🛠️ ⏮️ 🗄 (& 🏧 🛠️ 🩺) 😖 ⚪️➡️ `SecurityBase`, 👈 ❔ **FastAPI** 💪 💭 ❔ 🛠️ 👫 🗄. ## ⚫️❔ ⚫️ 🔨 ⚫️ 🔜 🚶 & 👀 📨 👈 `Authorization` 🎚, ✅ 🚥 💲 `Bearer ` ➕ 🤝, & 🔜 📨 🤝 `str`. 🚥 ⚫️ 🚫 👀 `Authorization` 🎚, ⚖️ 💲 🚫 ✔️ `Bearer ` 🤝, ⚫️ 🔜 📨 ⏮️ 4️⃣0️⃣1️⃣ 👔 📟 ❌ (`UNAUTHORIZED`) 🔗. 👆 🚫 ✔️ ✅ 🚥 🤝 🔀 📨 ❌. 👆 💪 💭 👈 🚥 👆 🔢 🛠️, ⚫️ 🔜 ✔️ `str` 👈 🤝. 👆 💪 🔄 ⚫️ ⏪ 🎓 🩺: 👥 🚫 ✔ 🔬 🤝, ✋️ 👈 ▶️ ⏪. ## 🌃 , 3️⃣ ⚖️ 4️⃣ ➕ ⏸, 👆 ⏪ ✔️ 🐒 📨 💂‍♂. fastapi-0.110.3/docs/em/docs/tutorial/security/get-current-user.md000066400000000000000000000105721461403617600250500ustar00rootroot00000000000000# 🤚 ⏮️ 👩‍💻 ⏮️ 📃 💂‍♂ ⚙️ (❔ 🧢 🔛 🔗 💉 ⚙️) 🤝 *➡ 🛠️ 🔢* `token` `str`: ```Python hl_lines="10" {!../../../docs_src/security/tutorial001.py!} ``` ✋️ 👈 🚫 👈 ⚠. ➡️ ⚒ ⚫️ 🤝 👥 ⏮️ 👩‍💻. ## ✍ 👩‍💻 🏷 🥇, ➡️ ✍ Pydantic 👩‍💻 🏷. 🎏 🌌 👥 ⚙️ Pydantic 📣 💪, 👥 💪 ⚙️ ⚫️ 🙆 🙆: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="5 12-16" {!> ../../../docs_src/security/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="3 10-14" {!> ../../../docs_src/security/tutorial002_py310.py!} ``` ## ✍ `get_current_user` 🔗 ➡️ ✍ 🔗 `get_current_user`. 💭 👈 🔗 💪 ✔️ 🎧-🔗 ❓ `get_current_user` 🔜 ✔️ 🔗 ⏮️ 🎏 `oauth2_scheme` 👥 ✍ ⏭. 🎏 👥 🔨 ⏭ *➡ 🛠️* 🔗, 👆 🆕 🔗 `get_current_user` 🔜 📨 `token` `str` ⚪️➡️ 🎧-🔗 `oauth2_scheme`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="25" {!> ../../../docs_src/security/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="23" {!> ../../../docs_src/security/tutorial002_py310.py!} ``` ## 🤚 👩‍💻 `get_current_user` 🔜 ⚙️ (❌) 🚙 🔢 👥 ✍, 👈 ✊ 🤝 `str` & 📨 👆 Pydantic `User` 🏷: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="19-22 26-27" {!> ../../../docs_src/security/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="17-20 24-25" {!> ../../../docs_src/security/tutorial002_py310.py!} ``` ## 💉 ⏮️ 👩‍💻 🔜 👥 💪 ⚙️ 🎏 `Depends` ⏮️ 👆 `get_current_user` *➡ 🛠️*: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="31" {!> ../../../docs_src/security/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="29" {!> ../../../docs_src/security/tutorial002_py310.py!} ``` 👀 👈 👥 📣 🆎 `current_user` Pydantic 🏷 `User`. 👉 🔜 ℹ 🇺🇲 🔘 🔢 ⏮️ 🌐 🛠️ & 🆎 ✅. !!! tip 👆 5️⃣📆 💭 👈 📨 💪 📣 ⏮️ Pydantic 🏷. 📥 **FastAPI** 🏆 🚫 🤚 😨 ↩️ 👆 ⚙️ `Depends`. !!! check 🌌 👉 🔗 ⚙️ 🏗 ✔ 👥 ✔️ 🎏 🔗 (🎏 "☑") 👈 🌐 📨 `User` 🏷. 👥 🚫 🚫 ✔️ 🕴 1️⃣ 🔗 👈 💪 📨 👈 🆎 💽. ## 🎏 🏷 👆 💪 🔜 🤚 ⏮️ 👩‍💻 🔗 *➡ 🛠️ 🔢* & 🙅 ⏮️ 💂‍♂ 🛠️ **🔗 💉** 🎚, ⚙️ `Depends`. & 👆 💪 ⚙️ 🙆 🏷 ⚖️ 💽 💂‍♂ 📄 (👉 💼, Pydantic 🏷 `User`). ✋️ 👆 🚫 🚫 ⚙️ 🎯 💽 🏷, 🎓 ⚖️ 🆎. 👆 💚 ✔️ `id` & `email` & 🚫 ✔️ 🙆 `username` 👆 🏷 ❓ 💭. 👆 💪 ⚙️ 👉 🎏 🧰. 👆 💚 ✔️ `str`❓ ⚖️ `dict`❓ ⚖️ 💽 🎓 🏷 👐 🔗 ❓ ⚫️ 🌐 👷 🎏 🌌. 👆 🤙 🚫 ✔️ 👩‍💻 👈 🕹 👆 🈸 ✋️ 🤖, 🤖, ⚖️ 🎏 ⚙️, 👈 ✔️ 🔐 🤝 ❓ 🔄, ⚫️ 🌐 👷 🎏. ⚙️ 🙆 😇 🏷, 🙆 😇 🎓, 🙆 😇 💽 👈 👆 💪 👆 🈸. **FastAPI** ✔️ 👆 📔 ⏮️ 🔗 💉 ⚙️. ## 📟 📐 👉 🖼 5️⃣📆 😑 🔁. ✔️ 🤯 👈 👥 🌀 💂‍♂, 📊 🏷, 🚙 🔢 & *➡ 🛠️* 🎏 📁. ✋️ 📥 🔑 ☝. 💂‍♂ & 🔗 💉 💩 ✍ 🕐. & 👆 💪 ⚒ ⚫️ 🏗 👆 💚. & , ✔️ ⚫️ ✍ 🕴 🕐, 👁 🥉. ⏮️ 🌐 💪. ✋️ 👆 💪 ✔️ 💯 🔗 (*➡ 🛠️*) ⚙️ 🎏 💂‍♂ ⚙️. & 🌐 👫 (⚖️ 🙆 ↔ 👫 👈 👆 💚) 💪 ✊ 📈 🏤-⚙️ 👫 🔗 ⚖️ 🙆 🎏 🔗 👆 ✍. & 🌐 👉 💯 *➡ 🛠️* 💪 🤪 3️⃣ ⏸: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="30-32" {!> ../../../docs_src/security/tutorial002.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="28-30" {!> ../../../docs_src/security/tutorial002_py310.py!} ``` ## 🌃 👆 💪 🔜 🤚 ⏮️ 👩‍💻 🔗 👆 *➡ 🛠️ 🔢*. 👥 ⏪ 😬 📤. 👥 💪 🚮 *➡ 🛠️* 👩‍💻/👩‍💻 🤙 📨 `username` & `password`. 👈 👟 ⏭. fastapi-0.110.3/docs/em/docs/tutorial/security/index.md000066400000000000000000000070341461403617600227430ustar00rootroot00000000000000# 💂‍♂ 📤 📚 🌌 🍵 💂‍♂, 🤝 & ✔. & ⚫️ 🛎 🏗 & "⚠" ❔. 📚 🛠️ & ⚙️ 🍵 💂‍♂ & 🤝 ✊ 🦏 💸 🎯 & 📟 (📚 💼 ⚫️ 💪 5️⃣0️⃣ 💯 ⚖️ 🌅 🌐 📟 ✍). **FastAPI** 🚚 📚 🧰 ℹ 👆 🙅 ⏮️ **💂‍♂** 💪, 📉, 🐩 🌌, 🍵 ✔️ 🔬 & 💡 🌐 💂‍♂ 🔧. ✋️ 🥇, ➡️ ✅ 🤪 🔧. ## 🏃 ❓ 🚥 👆 🚫 💅 🔃 🙆 👉 ⚖ & 👆 💪 🚮 💂‍♂ ⏮️ 🤝 ⚓️ 🔛 🆔 & 🔐 *▶️️ 🔜*, 🚶 ⏭ 📃. ## Oauth2️⃣ Oauth2️⃣ 🔧 👈 🔬 📚 🌌 🍵 🤝 & ✔. ⚫️ 🔬 🔧 & 📔 📚 🏗 ⚙️ 💼. ⚫️ 🔌 🌌 🔓 ⚙️ "🥉 🥳". 👈 ⚫️❔ 🌐 ⚙️ ⏮️ "💳 ⏮️ 👱📔, 🇺🇸🔍, 👱📔, 📂" ⚙️ 🔘. ### ✳ 1️⃣ 📤 ✳ 1️⃣, ❔ 📶 🎏 ⚪️➡️ Oauth2️⃣, & 🌖 🏗, ⚫️ 🔌 🔗 🔧 🔛 ❔ 🗜 📻. ⚫️ 🚫 📶 🌟 ⚖️ ⚙️ 🛎. Oauth2️⃣ 🚫 ✔ ❔ 🗜 📻, ⚫️ ⌛ 👆 ✔️ 👆 🈸 🍦 ⏮️ 🇺🇸🔍. !!! tip 📄 🔃 **🛠️** 👆 🔜 👀 ❔ ⚒ 🆙 🇺🇸🔍 🆓, ⚙️ Traefik & ➡️ 🗜. ## 👩‍💻 🔗 👩‍💻 🔗 ➕1️⃣ 🔧, 🧢 🔛 **Oauth2️⃣**. ⚫️ ↔ Oauth2️⃣ ✔ 👜 👈 📶 🌌 Oauth2️⃣, 🔄 ⚒ ⚫️ 🌅 🛠️. 🖼, 🇺🇸🔍 💳 ⚙️ 👩‍💻 🔗 (❔ 🔘 ⚙️ Oauth2️⃣). ✋️ 👱📔 💳 🚫 🐕‍🦺 👩‍💻 🔗. ⚫️ ✔️ 🚮 👍 🍛 Oauth2️⃣. ### 👩‍💻 (🚫 "👩‍💻 🔗") 📤 "👩‍💻" 🔧. 👈 🔄 ❎ 🎏 👜 **👩‍💻 🔗**, ✋️ 🚫 ⚓️ 🔛 Oauth2️⃣. , ⚫️ 🏁 🌖 ⚙️. ⚫️ 🚫 📶 🌟 ⚖️ ⚙️ 🛎. ## 🗄 🗄 (⏪ 💭 🦁) 📂 🔧 🏗 🔗 (🔜 🍕 💾 🏛). **FastAPI** ⚓️ 🔛 **🗄**. 👈 ⚫️❔ ⚒ ⚫️ 💪 ✔️ 💗 🏧 🎓 🧾 🔢, 📟 ⚡, ♒️. 🗄 ✔️ 🌌 🔬 💗 💂‍♂ "⚖". ⚙️ 👫, 👆 💪 ✊ 📈 🌐 👫 🐩-⚓️ 🧰, 🔌 👉 🎓 🧾 ⚙️. 🗄 🔬 📄 💂‍♂ ⚖: * `apiKey`: 🈸 🎯 🔑 👈 💪 👟 ⚪️➡️: * 🔢 🔢. * 🎚. * 🍪. * `http`: 🐩 🇺🇸🔍 🤝 ⚙️, 🔌: * `bearer`: 🎚 `Authorization` ⏮️ 💲 `Bearer ` ➕ 🤝. 👉 😖 ⚪️➡️ Oauth2️⃣. * 🇺🇸🔍 🔰 🤝. * 🇺🇸🔍 📰, ♒️. * `oauth2`: 🌐 Oauth2️⃣ 🌌 🍵 💂‍♂ (🤙 "💧"). * 📚 👫 💧 ☑ 🏗 ✳ 2️⃣.0️⃣ 🤝 🐕‍🦺 (💖 🇺🇸🔍, 👱📔, 👱📔, 📂, ♒️): * `implicit` * `clientCredentials` * `authorizationCode` * ✋️ 📤 1️⃣ 🎯 "💧" 👈 💪 👌 ⚙️ 🚚 🤝 🎏 🈸 🔗: * `password`: ⏭ 📃 🔜 📔 🖼 👉. * `openIdConnect`: ✔️ 🌌 🔬 ❔ 🔎 Oauth2️⃣ 🤝 📊 🔁. * 👉 🏧 🔍 ⚫️❔ 🔬 👩‍💻 🔗 🔧. !!! tip 🛠️ 🎏 🤝/✔ 🐕‍🦺 💖 🇺🇸🔍, 👱📔, 👱📔, 📂, ♒️. 💪 & 📶 ⏩. 🌅 🏗 ⚠ 🏗 🤝/✔ 🐕‍🦺 💖 👈, ✋️ **FastAPI** 🤝 👆 🧰 ⚫️ 💪, ⏪ 🔨 🏋️ 🏋‍♂ 👆. ## **FastAPI** 🚙 FastAPI 🚚 📚 🧰 🔠 👉 💂‍♂ ⚖ `fastapi.security` 🕹 👈 📉 ⚙️ 👉 💂‍♂ 🛠️. ⏭ 📃 👆 🔜 👀 ❔ 🚮 💂‍♂ 👆 🛠️ ⚙️ 📚 🧰 🚚 **FastAPI**. & 👆 🔜 👀 ❔ ⚫️ 🤚 🔁 🛠️ 🔘 🎓 🧾 ⚙️. fastapi-0.110.3/docs/em/docs/tutorial/security/oauth2-jwt.md000066400000000000000000000227661461403617600236510ustar00rootroot00000000000000# Oauth2️⃣ ⏮️ 🔐 (& 🔁), 📨 ⏮️ 🥙 🤝 🔜 👈 👥 ✔️ 🌐 💂‍♂ 💧, ➡️ ⚒ 🈸 🤙 🔐, ⚙️ 🥙 🤝 & 🔐 🔐 🔁. 👉 📟 🕳 👆 💪 🤙 ⚙️ 👆 🈸, 🖊 🔐 #️⃣ 👆 💽, ♒️. 👥 🔜 ▶️ ⚪️➡️ 🌐❔ 👥 ◀️ ⏮️ 📃 & 📈 ⚫️. ## 🔃 🥙 🥙 ⛓ "🎻 🕸 🤝". ⚫️ 🐩 🚫 🎻 🎚 📏 💧 🎻 🍵 🚀. ⚫️ 👀 💖 👉: ``` eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c ``` ⚫️ 🚫 🗜,, 🙆 💪 🛡 ℹ ⚪️➡️ 🎚. ✋️ ⚫️ 🛑. , 🕐❔ 👆 📨 🤝 👈 👆 ♨, 👆 💪 ✔ 👈 👆 🤙 ♨ ⚫️. 👈 🌌, 👆 💪 ✍ 🤝 ⏮️ 👔, ➡️ 💬, 1️⃣ 🗓️. & ⤴️ 🕐❔ 👩‍💻 👟 🔙 ⏭ 📆 ⏮️ 🤝, 👆 💭 👈 👩‍💻 🕹 👆 ⚙️. ⏮️ 🗓️, 🤝 🔜 🕛 & 👩‍💻 🔜 🚫 ✔ & 🔜 ✔️ 🛑 🔄 🤚 🆕 🤝. & 🚥 👩‍💻 (⚖️ 🥉 🥳) 🔄 🔀 🤝 🔀 👔, 👆 🔜 💪 🔎 ⚫️, ↩️ 💳 🔜 🚫 🏏. 🚥 👆 💚 🤾 ⏮️ 🥙 🤝 & 👀 ❔ 👫 👷, ✅ https://jwt.io. ## ❎ `python-jose` 👥 💪 ❎ `python-jose` 🏗 & ✔ 🥙 🤝 🐍:
```console $ pip install "python-jose[cryptography]" ---> 100% ```
🐍-🇩🇬 🚚 🔐 👩‍💻 ➕. 📥 👥 ⚙️ 👍 1️⃣: )/⚛. !!! tip 👉 🔰 ⏪ ⚙️ PyJWT. ✋️ ⚫️ ℹ ⚙️ 🐍-🇩🇬 ↩️ ⚫️ 🚚 🌐 ⚒ ⚪️➡️ PyJWT ➕ ➕ 👈 👆 💪 💪 ⏪ 🕐❔ 🏗 🛠️ ⏮️ 🎏 🧰. ## 🔐 🔁 "🔁" ⛓ 🏭 🎚 (🔐 👉 💼) 🔘 🔁 🔢 (🎻) 👈 👀 💖 🙃. 🕐❔ 👆 🚶‍♀️ ⚫️❔ 🎏 🎚 (⚫️❔ 🎏 🔐) 👆 🤚 ⚫️❔ 🎏 🙃. ✋️ 👆 🚫🔜 🗜 ⚪️➡️ 🙃 🔙 🔐. ### ⚫️❔ ⚙️ 🔐 🔁 🚥 👆 💽 📎, 🧙‍♀ 🏆 🚫 ✔️ 👆 👩‍💻' 🔢 🔐, 🕴#️⃣. , 🧙‍♀ 🏆 🚫 💪 🔄 ⚙️ 👈 🔐 ➕1️⃣ ⚙️ (📚 👩‍💻 ⚙️ 🎏 🔐 🌐, 👉 🔜 ⚠). ## ❎ `passlib` 🇸🇲 👑 🐍 📦 🍵 🔐#️⃣. ⚫️ 🐕‍🦺 📚 🔐 🔁 📊 & 🚙 👷 ⏮️ 👫. 👍 📊 "🐡". , ❎ 🇸🇲 ⏮️ 🐡:
```console $ pip install "passlib[bcrypt]" ---> 100% ```
!!! tip ⏮️ `passlib`, 👆 💪 🔗 ⚫️ 💪 ✍ 🔐 ✍ **✳**, **🏺** 💂‍♂ 🔌-⚖️ 📚 🎏. , 👆 🔜 💪, 🖼, 💰 🎏 📊 ⚪️➡️ ✳ 🈸 💽 ⏮️ FastAPI 🈸. ⚖️ 📉 ↔ ✳ 🈸 ⚙️ 🎏 💽. & 👆 👩‍💻 🔜 💪 💳 ⚪️➡️ 👆 ✳ 📱 ⚖️ ⚪️➡️ 👆 **FastAPI** 📱, 🎏 🕰. ## #️⃣ & ✔ 🔐 🗄 🧰 👥 💪 ⚪️➡️ `passlib`. ✍ 🇸🇲 "🔑". 👉 ⚫️❔ 🔜 ⚙️ #️⃣ & ✔ 🔐. !!! tip 🇸🇲 🔑 ✔️ 🛠️ ⚙️ 🎏 🔁 📊, 🔌 😢 🗝 🕐 🕴 ✔ ✔ 👫, ♒️. 🖼, 👆 💪 ⚙️ ⚫️ ✍ & ✔ 🔐 🏗 ➕1️⃣ ⚙️ (💖 ✳) ✋️ #️⃣ 🙆 🆕 🔐 ⏮️ 🎏 📊 💖 🐡. & 🔗 ⏮️ 🌐 👫 🎏 🕰. ✍ 🚙 🔢 #️⃣ 🔐 👟 ⚪️➡️ 👩‍💻. & ➕1️⃣ 🚙 ✔ 🚥 📨 🔐 🏏 #️⃣ 🏪. & ➕1️⃣ 1️⃣ 🔓 & 📨 👩‍💻. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="7 48 55-56 59-60 69-75" {!> ../../../docs_src/security/tutorial004.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="6 47 54-55 58-59 68-74" {!> ../../../docs_src/security/tutorial004_py310.py!} ``` !!! note 🚥 👆 ✅ 🆕 (❌) 💽 `fake_users_db`, 👆 🔜 👀 ❔ #️⃣ 🔐 👀 💖 🔜: `"$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW"`. ## 🍵 🥙 🤝 🗄 🕹 ❎. ✍ 🎲 ㊙ 🔑 👈 🔜 ⚙️ 🛑 🥙 🤝. 🏗 🔐 🎲 ㊙ 🔑 ⚙️ 📋:
```console $ openssl rand -hex 32 09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7 ```
& 📁 🔢 🔢 `SECRET_KEY` (🚫 ⚙️ 1️⃣ 🖼). ✍ 🔢 `ALGORITHM` ⏮️ 📊 ⚙️ 🛑 🥙 🤝 & ⚒ ⚫️ `"HS256"`. ✍ 🔢 👔 🤝. 🔬 Pydantic 🏷 👈 🔜 ⚙️ 🤝 🔗 📨. ✍ 🚙 🔢 🏗 🆕 🔐 🤝. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="6 12-14 28-30 78-86" {!> ../../../docs_src/security/tutorial004.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="5 11-13 27-29 77-85" {!> ../../../docs_src/security/tutorial004_py310.py!} ``` ## ℹ 🔗 ℹ `get_current_user` 📨 🎏 🤝 ⏭, ✋️ 👉 🕰, ⚙️ 🥙 🤝. 🔣 📨 🤝, ✔ ⚫️, & 📨 ⏮️ 👩‍💻. 🚥 🤝 ❌, 📨 🇺🇸🔍 ❌ ▶️️ ↖️. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="89-106" {!> ../../../docs_src/security/tutorial004.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="88-105" {!> ../../../docs_src/security/tutorial004_py310.py!} ``` ## ℹ `/token` *➡ 🛠️* ✍ `timedelta` ⏮️ 👔 🕰 🤝. ✍ 🎰 🥙 🔐 🤝 & 📨 ⚫️. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="115-130" {!> ../../../docs_src/security/tutorial004.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="114-129" {!> ../../../docs_src/security/tutorial004_py310.py!} ``` ### 📡 ℹ 🔃 🥙 "📄" `sub` 🥙 🔧 💬 👈 📤 🔑 `sub`, ⏮️ 📄 🤝. ⚫️ 📦 ⚙️ ⚫️, ✋️ 👈 🌐❔ 👆 🔜 🚮 👩‍💻 🆔, 👥 ⚙️ ⚫️ 📥. 🥙 5️⃣📆 ⚙️ 🎏 👜 ↖️ ⚪️➡️ ⚖ 👩‍💻 & 🤝 👫 🎭 🛠️ 🔗 🔛 👆 🛠️. 🖼, 👆 💪 🔬 "🚘" ⚖️ "📰 🏤". ⤴️ 👆 💪 🚮 ✔ 🔃 👈 👨‍💼, 💖 "💾" (🚘) ⚖️ "✍" (📰). & ⤴️, 👆 💪 🤝 👈 🥙 🤝 👩‍💻 (⚖️ 🤖), & 👫 💪 ⚙️ ⚫️ 🎭 👈 🎯 (💾 🚘, ⚖️ ✍ 📰 🏤) 🍵 💆‍♂ ✔️ 🏧, ⏮️ 🥙 🤝 👆 🛠️ 🏗 👈. ⚙️ 👫 💭, 🥙 💪 ⚙️ 🌌 🌖 🤓 😐. 📚 💼, 📚 👈 👨‍💼 💪 ✔️ 🎏 🆔, ➡️ 💬 `foo` (👩‍💻 `foo`, 🚘 `foo`, & 📰 🏤 `foo`). , ❎ 🆔 💥, 🕐❔ 🏗 🥙 🤝 👩‍💻, 👆 💪 🔡 💲 `sub` 🔑, ✅ ⏮️ `username:`. , 👉 🖼, 💲 `sub` 💪 ✔️: `username:johndoe`. ⚠ 👜 ✔️ 🤯 👈 `sub` 🔑 🔜 ✔️ 😍 🆔 🤭 🎂 🈸, & ⚫️ 🔜 🎻. ## ✅ ⚫️ 🏃 💽 & 🚶 🩺: http://127.0.0.1:8000/docs. 👆 🔜 👀 👩‍💻 🔢 💖: ✔ 🈸 🎏 🌌 ⏭. ⚙️ 🎓: 🆔: `johndoe` 🔐: `secret` !!! check 👀 👈 🕳 📟 🔢 🔐 "`secret`", 👥 🕴 ✔️ #️⃣ ⏬. 🤙 🔗 `/users/me/`, 👆 🔜 🤚 📨: ```JSON { "username": "johndoe", "email": "johndoe@example.com", "full_name": "John Doe", "disabled": false } ``` 🚥 👆 📂 👩‍💻 🧰, 👆 💪 👀 ❔ 📊 📨 🕴 🔌 🤝, 🔐 🕴 📨 🥇 📨 🔓 👩‍💻 & 🤚 👈 🔐 🤝, ✋️ 🚫 ⏮️: !!! note 👀 🎚 `Authorization`, ⏮️ 💲 👈 ▶️ ⏮️ `Bearer `. ## 🏧 ⚙️ ⏮️ `scopes` Oauth2️⃣ ✔️ 🔑 "↔". 👆 💪 ⚙️ 👫 🚮 🎯 ⚒ ✔ 🥙 🤝. ⤴️ 👆 💪 🤝 👉 🤝 👩‍💻 🔗 ⚖️ 🥉 🥳, 🔗 ⏮️ 👆 🛠️ ⏮️ ⚒ 🚫. 👆 💪 💡 ❔ ⚙️ 👫 & ❔ 👫 🛠️ 🔘 **FastAPI** ⏪ **🏧 👩‍💻 🦮**. ## 🌃 ⏮️ ⚫️❔ 👆 ✔️ 👀 🆙 🔜, 👆 💪 ⚒ 🆙 🔐 **FastAPI** 🈸 ⚙️ 🐩 💖 Oauth2️⃣ & 🥙. 🌖 🙆 🛠️ 🚚 💂‍♂ ▶️️ 👍 🏗 📄 🔜. 📚 📦 👈 📉 ⚫️ 📚 ✔️ ⚒ 📚 ⚠ ⏮️ 💽 🏷, 💽, & 💪 ⚒. & 👉 📦 👈 📉 👜 💁‍♂️ 🌅 🤙 ✔️ 💂‍♂ ⚠ 🔘. --- **FastAPI** 🚫 ⚒ 🙆 ⚠ ⏮️ 🙆 💽, 💽 🏷 ⚖️ 🧰. ⚫️ 🤝 👆 🌐 💪 ⚒ 🕐 👈 👖 👆 🏗 🏆. & 👆 💪 ⚙️ 🔗 📚 👍 🚧 & 🛎 ⚙️ 📦 💖 `passlib` & `python-jose`, ↩️ **FastAPI** 🚫 🚚 🙆 🏗 🛠️ 🛠️ 🔢 📦. ✋️ ⚫️ 🚚 👆 🧰 📉 🛠️ 🌅 💪 🍵 🎯 💪, ⚖, ⚖️ 💂‍♂. & 👆 💪 ⚙️ & 🛠️ 🔐, 🐩 🛠️, 💖 Oauth2️⃣ 📶 🙅 🌌. 👆 💪 💡 🌅 **🏧 👩‍💻 🦮** 🔃 ❔ ⚙️ Oauth2️⃣ "↔", 🌖 👌-🧽 ✔ ⚙️, 📄 👫 🎏 🐩. Oauth2️⃣ ⏮️ ↔ 🛠️ ⚙️ 📚 🦏 🤝 🐕‍🦺, 💖 👱📔, 🇺🇸🔍, 📂, 🤸‍♂, 👱📔, ♒️. ✔ 🥉 🥳 🈸 🔗 ⏮️ 👫 🔗 🔛 👨‍💼 👫 👩‍💻. fastapi-0.110.3/docs/em/docs/tutorial/security/simple-oauth2.md000066400000000000000000000216151461403617600243260ustar00rootroot00000000000000# 🙅 Oauth2️⃣ ⏮️ 🔐 & 📨 🔜 ➡️ 🏗 ⚪️➡️ ⏮️ 📃 & 🚮 ❌ 🍕 ✔️ 🏁 💂‍♂ 💧. ## 🤚 `username` & `password` 👥 🔜 ⚙️ **FastAPI** 💂‍♂ 🚙 🤚 `username` & `password`. Oauth2️⃣ ✔ 👈 🕐❔ ⚙️ "🔐 💧" (👈 👥 ⚙️) 👩‍💻/👩‍💻 🔜 📨 `username` & `password` 🏑 📨 💽. & 🔌 💬 👈 🏑 ✔️ 🌟 💖 👈. `user-name` ⚖️ `email` 🚫🔜 👷. ✋️ 🚫 😟, 👆 💪 🎦 ⚫️ 👆 🎋 👆 🏁 👩‍💻 🕸. & 👆 💽 🏷 💪 ⚙️ 🙆 🎏 📛 👆 💚. ✋️ 💳 *➡ 🛠️*, 👥 💪 ⚙️ 👉 📛 🔗 ⏮️ 🔌 (& 💪, 🖼, ⚙️ 🛠️ 🛠️ 🧾 ⚙️). 🔌 🇵🇸 👈 `username` & `password` 🔜 📨 📨 💽 (, 🙅‍♂ 🎻 📥). ### `scope` 🔌 💬 👈 👩‍💻 💪 📨 ➕1️⃣ 📨 🏑 "`scope`". 📨 🏑 📛 `scope` (⭐), ✋️ ⚫️ 🤙 📏 🎻 ⏮️ "↔" 🎏 🚀. 🔠 "↔" 🎻 (🍵 🚀). 👫 🛎 ⚙️ 📣 🎯 💂‍♂ ✔, 🖼: * `users:read` ⚖️ `users:write` ⚠ 🖼. * `instagram_basic` ⚙️ 👱📔 / 👱📔. * `https://www.googleapis.com/auth/drive` ⚙️ 🇺🇸🔍. !!! info Oauth2️⃣ "↔" 🎻 👈 📣 🎯 ✔ ✔. ⚫️ 🚫 🤔 🚥 ⚫️ ✔️ 🎏 🦹 💖 `:` ⚖️ 🚥 ⚫️ 📛. 👈 ℹ 🛠️ 🎯. Oauth2️⃣ 👫 🎻. ## 📟 🤚 `username` & `password` 🔜 ➡️ ⚙️ 🚙 🚚 **FastAPI** 🍵 👉. ### `OAuth2PasswordRequestForm` 🥇, 🗄 `OAuth2PasswordRequestForm`, & ⚙️ ⚫️ 🔗 ⏮️ `Depends` *➡ 🛠️* `/token`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="4 76" {!> ../../../docs_src/security/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="2 74" {!> ../../../docs_src/security/tutorial003_py310.py!} ``` `OAuth2PasswordRequestForm` 🎓 🔗 👈 📣 📨 💪 ⏮️: * `username`. * `password`. * 📦 `scope` 🏑 🦏 🎻, ✍ 🎻 🎏 🚀. * 📦 `grant_type`. !!! tip Oauth2️⃣ 🔌 🤙 *🚚* 🏑 `grant_type` ⏮️ 🔧 💲 `password`, ✋️ `OAuth2PasswordRequestForm` 🚫 🛠️ ⚫️. 🚥 👆 💪 🛠️ ⚫️, ⚙️ `OAuth2PasswordRequestFormStrict` ↩️ `OAuth2PasswordRequestForm`. * 📦 `client_id` (👥 🚫 💪 ⚫️ 👆 🖼). * 📦 `client_secret` (👥 🚫 💪 ⚫️ 👆 🖼). !!! info `OAuth2PasswordRequestForm` 🚫 🎁 🎓 **FastAPI** `OAuth2PasswordBearer`. `OAuth2PasswordBearer` ⚒ **FastAPI** 💭 👈 ⚫️ 💂‍♂ ⚖. ⚫️ 🚮 👈 🌌 🗄. ✋️ `OAuth2PasswordRequestForm` 🎓 🔗 👈 👆 💪 ✔️ ✍ 👆, ⚖️ 👆 💪 ✔️ 📣 `Form` 🔢 🔗. ✋️ ⚫️ ⚠ ⚙️ 💼, ⚫️ 🚚 **FastAPI** 🔗, ⚒ ⚫️ ⏩. ### ⚙️ 📨 💽 !!! tip 👐 🔗 🎓 `OAuth2PasswordRequestForm` 🏆 🚫 ✔️ 🔢 `scope` ⏮️ 📏 🎻 👽 🚀, ↩️, ⚫️ 🔜 ✔️ `scopes` 🔢 ⏮️ ☑ 📇 🎻 🔠 ↔ 📨. 👥 🚫 ⚙️ `scopes` 👉 🖼, ✋️ 🛠️ 📤 🚥 👆 💪 ⚫️. 🔜, 🤚 👩‍💻 📊 ⚪️➡️ (❌) 💽, ⚙️ `username` ⚪️➡️ 📨 🏑. 🚥 📤 🙅‍♂ ✅ 👩‍💻, 👥 📨 ❌ 💬 "❌ 🆔 ⚖️ 🔐". ❌, 👥 ⚙️ ⚠ `HTTPException`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="3 77-79" {!> ../../../docs_src/security/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="1 75-77" {!> ../../../docs_src/security/tutorial003_py310.py!} ``` ### ✅ 🔐 👉 ☝ 👥 ✔️ 👩‍💻 📊 ⚪️➡️ 👆 💽, ✋️ 👥 🚫 ✅ 🔐. ➡️ 🚮 👈 💽 Pydantic `UserInDB` 🏷 🥇. 👆 🔜 🙅 🖊 🔢 🔐,, 👥 🔜 ⚙️ (❌) 🔐 🔁 ⚙️. 🚥 🔐 🚫 🏏, 👥 📨 🎏 ❌. #### 🔐 🔁 "🔁" ⛓: 🏭 🎚 (🔐 👉 💼) 🔘 🔁 🔢 (🎻) 👈 👀 💖 🙃. 🕐❔ 👆 🚶‍♀️ ⚫️❔ 🎏 🎚 (⚫️❔ 🎏 🔐) 👆 🤚 ⚫️❔ 🎏 🙃. ✋️ 👆 🚫🔜 🗜 ⚪️➡️ 🙃 🔙 🔐. ##### ⚫️❔ ⚙️ 🔐 🔁 🚥 👆 💽 📎, 🧙‍♀ 🏆 🚫 ✔️ 👆 👩‍💻' 🔢 🔐, 🕴#️⃣. , 🧙‍♀ 🏆 🚫 💪 🔄 ⚙️ 👈 🎏 🔐 ➕1️⃣ ⚙️ (📚 👩‍💻 ⚙️ 🎏 🔐 🌐, 👉 🔜 ⚠). === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="80-83" {!> ../../../docs_src/security/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="78-81" {!> ../../../docs_src/security/tutorial003_py310.py!} ``` #### 🔃 `**user_dict` `UserInDB(**user_dict)` ⛓: *🚶‍♀️ 🔑 & 💲 `user_dict` 🔗 🔑-💲 ❌, 🌓:* ```Python UserInDB( username = user_dict["username"], email = user_dict["email"], full_name = user_dict["full_name"], disabled = user_dict["disabled"], hashed_password = user_dict["hashed_password"], ) ``` !!! info 🌅 🏁 🔑 `**👩‍💻_ #️⃣ ` ✅ 🔙 [🧾 **➕ 🏷**](../extra-models.md#user_indict){.internal-link target=_blank}. ## 📨 🤝 📨 `token` 🔗 🔜 🎻 🎚. ⚫️ 🔜 ✔️ `token_type`. 👆 💼, 👥 ⚙️ "📨" 🤝, 🤝 🆎 🔜 "`bearer`". & ⚫️ 🔜 ✔️ `access_token`, ⏮️ 🎻 ⚗ 👆 🔐 🤝. 👉 🙅 🖼, 👥 🔜 🍕 😟 & 📨 🎏 `username` 🤝. !!! tip ⏭ 📃, 👆 🔜 👀 🎰 🔐 🛠️, ⏮️ 🔐 #️⃣ & 🥙 🤝. ✋️ 🔜, ➡️ 🎯 🔛 🎯 ℹ 👥 💪. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="85" {!> ../../../docs_src/security/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="83" {!> ../../../docs_src/security/tutorial003_py310.py!} ``` !!! tip 🔌, 👆 🔜 📨 🎻 ⏮️ `access_token` & `token_type`, 🎏 👉 🖼. 👉 🕳 👈 👆 ✔️ 👆 👆 📟, & ⚒ 💭 👆 ⚙️ 📚 🎻 🔑. ⚫️ 🌖 🕴 👜 👈 👆 ✔️ 💭 ☑ 👆, 🛠️ ⏮️ 🔧. 🎂, **FastAPI** 🍵 ⚫️ 👆. ## ℹ 🔗 🔜 👥 🔜 ℹ 👆 🔗. 👥 💚 🤚 `current_user` *🕴* 🚥 👉 👩‍💻 🦁. , 👥 ✍ 🌖 🔗 `get_current_active_user` 👈 🔄 ⚙️ `get_current_user` 🔗. 👯‍♂️ 👉 🔗 🔜 📨 🇺🇸🔍 ❌ 🚥 👩‍💻 🚫 🔀, ⚖️ 🚥 🔕. , 👆 🔗, 👥 🔜 🕴 🤚 👩‍💻 🚥 👩‍💻 🔀, ☑ 🔓, & 🦁: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="58-66 69-72 90" {!> ../../../docs_src/security/tutorial003.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="55-64 67-70 88" {!> ../../../docs_src/security/tutorial003_py310.py!} ``` !!! info 🌖 🎚 `WWW-Authenticate` ⏮️ 💲 `Bearer` 👥 🛬 📥 🍕 🔌. 🙆 🇺🇸🔍 (❌) 👔 📟 4️⃣0️⃣1️⃣ "⛔" 🤔 📨 `WWW-Authenticate` 🎚. 💼 📨 🤝 (👆 💼), 💲 👈 🎚 🔜 `Bearer`. 👆 💪 🤙 🚶 👈 ➕ 🎚 & ⚫️ 🔜 👷. ✋️ ⚫️ 🚚 📥 🛠️ ⏮️ 🔧. , 📤 5️⃣📆 🧰 👈 ⌛ & ⚙️ ⚫️ (🔜 ⚖️ 🔮) & 👈 💪 ⚠ 👆 ⚖️ 👆 👩‍💻, 🔜 ⚖️ 🔮. 👈 💰 🐩... ## 👀 ⚫️ 🎯 📂 🎓 🩺: http://127.0.0.1:8000/docs. ### 🔓 🖊 "✔" 🔼. ⚙️ 🎓: 👩‍💻: `johndoe` 🔐: `secret` ⏮️ 🔗 ⚙️, 👆 🔜 👀 ⚫️ 💖: ### 🤚 👆 👍 👩‍💻 💽 🔜 ⚙️ 🛠️ `GET` ⏮️ ➡ `/users/me`. 👆 🔜 🤚 👆 👩‍💻 📊, 💖: ```JSON { "username": "johndoe", "email": "johndoe@example.com", "full_name": "John Doe", "disabled": false, "hashed_password": "fakehashedsecret" } ``` 🚥 👆 🖊 🔒 ℹ & ⏏, & ⤴️ 🔄 🎏 🛠️ 🔄, 👆 🔜 🤚 🇺🇸🔍 4️⃣0️⃣1️⃣ ❌: ```JSON { "detail": "Not authenticated" } ``` ### 🔕 👩‍💻 🔜 🔄 ⏮️ 🔕 👩‍💻, 🔓 ⏮️: 👩‍💻: `alice` 🔐: `secret2` & 🔄 ⚙️ 🛠️ `GET` ⏮️ ➡ `/users/me`. 👆 🔜 🤚 "🔕 👩‍💻" ❌, 💖: ```JSON { "detail": "Inactive user" } ``` ## 🌃 👆 🔜 ✔️ 🧰 🛠️ 🏁 💂‍♂ ⚙️ ⚓️ 🔛 `username` & `password` 👆 🛠️. ⚙️ 👫 🧰, 👆 💪 ⚒ 💂‍♂ ⚙️ 🔗 ⏮️ 🙆 💽 & ⏮️ 🙆 👩‍💻 ⚖️ 💽 🏷. 🕴 ℹ ❌ 👈 ⚫️ 🚫 🤙 "🔐". ⏭ 📃 👆 🔜 👀 ❔ ⚙️ 🔐 🔐 🔁 🗃 & 🥙 🤝. fastapi-0.110.3/docs/em/docs/tutorial/sql-databases.md000066400000000000000000000623021461403617600225100ustar00rootroot00000000000000# 🗄 (🔗) 💽 **FastAPI** 🚫 🚚 👆 ⚙️ 🗄 (🔗) 💽. ✋️ 👆 💪 ⚙️ 🙆 🔗 💽 👈 👆 💚. 📥 👥 🔜 👀 🖼 ⚙️ 🇸🇲. 👆 💪 💪 🛠️ ⚫️ 🙆 💽 🐕‍🦺 🇸🇲, 💖: * ✳ * ✳ * 🗄 * 🐸 * 🤸‍♂ 🗄 💽, ♒️. 👉 🖼, 👥 🔜 ⚙️ **🗄**, ↩️ ⚫️ ⚙️ 👁 📁 & 🐍 ✔️ 🛠️ 🐕‍🦺. , 👆 💪 📁 👉 🖼 & 🏃 ⚫️. ⏪, 👆 🏭 🈸, 👆 💪 💚 ⚙️ 💽 💽 💖 **✳**. !!! tip 📤 🛂 🏗 🚂 ⏮️ **FastAPI** & **✳**, 🌐 ⚓️ 🔛 **☁**, 🔌 🕸 & 🌖 🧰: https://github.com/tiangolo/full-stack-fastapi-postgresql !!! note 👀 👈 📚 📟 🐩 `SQLAlchemy` 📟 👆 🔜 ⚙️ ⏮️ 🙆 🛠️. **FastAPI** 🎯 📟 🤪 🕧. ## 🐜 **FastAPI** 👷 ⏮️ 🙆 💽 & 🙆 👗 🗃 💬 💽. ⚠ ⚓ ⚙️ "🐜": "🎚-🔗 🗺" 🗃. 🐜 ✔️ 🧰 🗜 ("*🗺*") 🖖 *🎚* 📟 & 💽 🏓 ("*🔗*"). ⏮️ 🐜, 👆 🛎 ✍ 🎓 👈 🎨 🏓 🗄 💽, 🔠 🔢 🎓 🎨 🏓, ⏮️ 📛 & 🆎. 🖼 🎓 `Pet` 💪 🎨 🗄 🏓 `pets`. & 🔠 *👐* 🎚 👈 🎓 🎨 ⏭ 💽. 🖼 🎚 `orion_cat` (👐 `Pet`) 💪 ✔️ 🔢 `orion_cat.type`, 🏓 `type`. & 💲 👈 🔢 💪, ✅ `"cat"`. 👫 🐜 ✔️ 🧰 ⚒ 🔗 ⚖️ 🔗 🖖 🏓 ⚖️ 👨‍💼. 👉 🌌, 👆 💪 ✔️ 🔢 `orion_cat.owner` & 👨‍💼 🔜 🔌 💽 👉 🐶 👨‍💼, ✊ ⚪️➡️ 🏓 *👨‍💼*. , `orion_cat.owner.name` 💪 📛 (⚪️➡️ `name` 🏓 `owners` 🏓) 👉 🐶 👨‍💼. ⚫️ 💪 ✔️ 💲 💖 `"Arquilian"`. & 🐜 🔜 🌐 👷 🤚 ℹ ⚪️➡️ 🔗 🏓 *👨‍💼* 🕐❔ 👆 🔄 🔐 ⚫️ ⚪️➡️ 👆 🐶 🎚. ⚠ 🐜 🖼: ✳-🐜 (🍕 ✳ 🛠️), 🇸🇲 🐜 (🍕 🇸🇲, 🔬 🛠️) & 🏒 (🔬 🛠️), 👪 🎏. 📥 👥 🔜 👀 ❔ 👷 ⏮️ **🇸🇲 🐜**. 🎏 🌌 👆 💪 ⚙️ 🙆 🎏 🐜. !!! tip 📤 🌓 📄 ⚙️ 🏒 📥 🩺. ## 📁 📊 👫 🖼, ➡️ 💬 👆 ✔️ 📁 📛 `my_super_project` 👈 🔌 🎧-📁 🤙 `sql_app` ⏮️ 📊 💖 👉: ``` . └── sql_app ├── __init__.py ├── crud.py ├── database.py ├── main.py ├── models.py └── schemas.py ``` 📁 `__init__.py` 🛁 📁, ✋️ ⚫️ 💬 🐍 👈 `sql_app` ⏮️ 🌐 🚮 🕹 (🐍 📁) 📦. 🔜 ➡️ 👀 ⚫️❔ 🔠 📁/🕹 🔨. ## ❎ `SQLAlchemy` 🥇 👆 💪 ❎ `SQLAlchemy`:
```console $ pip install sqlalchemy ---> 100% ```
## ✍ 🇸🇲 🍕 ➡️ 🔗 📁 `sql_app/database.py`. ### 🗄 🇸🇲 🍕 ```Python hl_lines="1-3" {!../../../docs_src/sql_databases/sql_app/database.py!} ``` ### ✍ 💽 📛 🇸🇲 ```Python hl_lines="5-6" {!../../../docs_src/sql_databases/sql_app/database.py!} ``` 👉 🖼, 👥 "🔗" 🗄 💽 (📂 📁 ⏮️ 🗄 💽). 📁 🔜 🔎 🎏 📁 📁 `sql_app.db`. 👈 ⚫️❔ 🏁 🍕 `./sql_app.db`. 🚥 👆 ⚙️ **✳** 💽 ↩️, 👆 🔜 ✔️ ✍ ⏸: ```Python SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db" ``` ...& 🛠️ ⚫️ ⏮️ 👆 💽 📊 & 🎓 (📊 ✳, ✳ ⚖️ 🙆 🎏). !!! tip 👉 👑 ⏸ 👈 👆 🔜 ✔️ 🔀 🚥 👆 💚 ⚙️ 🎏 💽. ### ✍ 🇸🇲 `engine` 🥇 🔁 ✍ 🇸🇲 "🚒". 👥 🔜 ⏪ ⚙️ 👉 `engine` 🎏 🥉. ```Python hl_lines="8-10" {!../../../docs_src/sql_databases/sql_app/database.py!} ``` #### 🗒 ❌: ```Python connect_args={"check_same_thread": False} ``` ...💪 🕴 `SQLite`. ⚫️ 🚫 💪 🎏 💽. !!! info "📡 ℹ" 🔢 🗄 🔜 🕴 ✔ 1️⃣ 🧵 🔗 ⏮️ ⚫️, 🤔 👈 🔠 🧵 🔜 🍵 🔬 📨. 👉 ❎ 😫 🤝 🎏 🔗 🎏 👜 (🎏 📨). ✋️ FastAPI, ⚙️ 😐 🔢 (`def`) 🌅 🌘 1️⃣ 🧵 💪 🔗 ⏮️ 💽 🎏 📨, 👥 💪 ⚒ 🗄 💭 👈 ⚫️ 🔜 ✔ 👈 ⏮️ `connect_args={"check_same_thread": False}`. , 👥 🔜 ⚒ 💭 🔠 📨 🤚 🚮 👍 💽 🔗 🎉 🔗, 📤 🙅‍♂ 💪 👈 🔢 🛠️. ### ✍ `SessionLocal` 🎓 🔠 👐 `SessionLocal` 🎓 🔜 💽 🎉. 🎓 ⚫️ 🚫 💽 🎉. ✋️ 🕐 👥 ✍ 👐 `SessionLocal` 🎓, 👉 👐 🔜 ☑ 💽 🎉. 👥 📛 ⚫️ `SessionLocal` 🔬 ⚫️ ⚪️➡️ `Session` 👥 🏭 ⚪️➡️ 🇸🇲. 👥 🔜 ⚙️ `Session` (1️⃣ 🗄 ⚪️➡️ 🇸🇲) ⏪. ✍ `SessionLocal` 🎓, ⚙️ 🔢 `sessionmaker`: ```Python hl_lines="11" {!../../../docs_src/sql_databases/sql_app/database.py!} ``` ### ✍ `Base` 🎓 🔜 👥 🔜 ⚙️ 🔢 `declarative_base()` 👈 📨 🎓. ⏪ 👥 🔜 😖 ⚪️➡️ 👉 🎓 ✍ 🔠 💽 🏷 ⚖️ 🎓 (🐜 🏷): ```Python hl_lines="13" {!../../../docs_src/sql_databases/sql_app/database.py!} ``` ## ✍ 💽 🏷 ➡️ 🔜 👀 📁 `sql_app/models.py`. ### ✍ 🇸🇲 🏷 ⚪️➡️ `Base` 🎓 👥 🔜 ⚙️ 👉 `Base` 🎓 👥 ✍ ⏭ ✍ 🇸🇲 🏷. !!! tip 🇸🇲 ⚙️ ⚖ "**🏷**" 🔗 👉 🎓 & 👐 👈 🔗 ⏮️ 💽. ✋️ Pydantic ⚙️ ⚖ "**🏷**" 🔗 🕳 🎏, 💽 🔬, 🛠️, & 🧾 🎓 & 👐. 🗄 `Base` ⚪️➡️ `database` (📁 `database.py` ⚪️➡️ 🔛). ✍ 🎓 👈 😖 ⚪️➡️ ⚫️. 👫 🎓 🇸🇲 🏷. ```Python hl_lines="4 7-8 18-19" {!../../../docs_src/sql_databases/sql_app/models.py!} ``` `__tablename__` 🔢 💬 🇸🇲 📛 🏓 ⚙️ 💽 🔠 👫 🏷. ### ✍ 🏷 🔢/🏓 🔜 ✍ 🌐 🏷 (🎓) 🔢. 🔠 👫 🔢 🎨 🏓 🚮 🔗 💽 🏓. 👥 ⚙️ `Column` ⚪️➡️ 🇸🇲 🔢 💲. & 👥 🚶‍♀️ 🇸🇲 🎓 "🆎", `Integer`, `String`, & `Boolean`, 👈 🔬 🆎 💽, ❌. ```Python hl_lines="1 10-13 21-24" {!../../../docs_src/sql_databases/sql_app/models.py!} ``` ### ✍ 💛 🔜 ✍ 💛. 👉, 👥 ⚙️ `relationship` 🚚 🇸🇲 🐜. 👉 🔜 ▶️️, 🌅 ⚖️ 🌘, "🎱" 🔢 👈 🔜 🔌 💲 ⚪️➡️ 🎏 🏓 🔗 👉 1️⃣. ```Python hl_lines="2 15 26" {!../../../docs_src/sql_databases/sql_app/models.py!} ``` 🕐❔ 🔐 🔢 `items` `User`, `my_user.items`, ⚫️ 🔜 ✔️ 📇 `Item` 🇸🇲 🏷 (⚪️➡️ `items` 🏓) 👈 ✔️ 💱 🔑 ☝ 👉 ⏺ `users` 🏓. 🕐❔ 👆 🔐 `my_user.items`, 🇸🇲 🔜 🤙 🚶 & ☕ 🏬 ⚪️➡️ 💽 `items` 🏓 & 🔗 👫 📥. & 🕐❔ 🔐 🔢 `owner` `Item`, ⚫️ 🔜 🔌 `User` 🇸🇲 🏷 ⚪️➡️ `users` 🏓. ⚫️ 🔜 ⚙️ `owner_id` 🔢/🏓 ⏮️ 🚮 💱 🔑 💭 ❔ ⏺ 🤚 ⚪️➡️ `users` 🏓. ## ✍ Pydantic 🏷 🔜 ➡️ ✅ 📁 `sql_app/schemas.py`. !!! tip ❎ 😨 🖖 🇸🇲 *🏷* & Pydantic *🏷*, 👥 🔜 ✔️ 📁 `models.py` ⏮️ 🇸🇲 🏷, & 📁 `schemas.py` ⏮️ Pydantic 🏷. 👫 Pydantic 🏷 🔬 🌅 ⚖️ 🌘 "🔗" (☑ 📊 💠). 👉 🔜 ℹ 👥 ❎ 😨 ⏪ ⚙️ 👯‍♂️. ### ✍ ▶️ Pydantic *🏷* / 🔗 ✍ `ItemBase` & `UserBase` Pydantic *🏷* (⚖️ ➡️ 💬 "🔗") ✔️ ⚠ 🔢 ⏪ 🏗 ⚖️ 👂 📊. & ✍ `ItemCreate` & `UserCreate` 👈 😖 ⚪️➡️ 👫 (👫 🔜 ✔️ 🎏 🔢), ➕ 🙆 🌖 📊 (🔢) 💪 🏗. , 👩‍💻 🔜 ✔️ `password` 🕐❔ 🏗 ⚫️. ✋️ 💂‍♂, `password` 🏆 🚫 🎏 Pydantic *🏷*, 🖼, ⚫️ 🏆 🚫 📨 ⚪️➡️ 🛠️ 🕐❔ 👂 👩‍💻. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="3 6-8 11-12 23-24 27-28" {!> ../../../docs_src/sql_databases/sql_app/schemas.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="3 6-8 11-12 23-24 27-28" {!> ../../../docs_src/sql_databases/sql_app_py39/schemas.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="1 4-6 9-10 21-22 25-26" {!> ../../../docs_src/sql_databases/sql_app_py310/schemas.py!} ``` #### 🇸🇲 👗 & Pydantic 👗 👀 👈 🇸🇲 *🏷* 🔬 🔢 ⚙️ `=`, & 🚶‍♀️ 🆎 🔢 `Column`, 💖: ```Python name = Column(String) ``` ⏪ Pydantic *🏷* 📣 🆎 ⚙️ `:`, 🆕 🆎 ✍ ❕/🆎 🔑: ```Python name: str ``` ✔️ ⚫️ 🤯, 👆 🚫 🤚 😕 🕐❔ ⚙️ `=` & `:` ⏮️ 👫. ### ✍ Pydantic *🏷* / 🔗 👂 / 📨 🔜 ✍ Pydantic *🏷* (🔗) 👈 🔜 ⚙️ 🕐❔ 👂 💽, 🕐❔ 🛬 ⚫️ ⚪️➡️ 🛠️. 🖼, ⏭ 🏗 🏬, 👥 🚫 💭 ⚫️❔ 🔜 🆔 🛠️ ⚫️, ✋️ 🕐❔ 👂 ⚫️ (🕐❔ 🛬 ⚫️ ⚪️➡️ 🛠️) 👥 🔜 ⏪ 💭 🚮 🆔. 🎏 🌌, 🕐❔ 👂 👩‍💻, 👥 💪 🔜 📣 👈 `items` 🔜 🔌 🏬 👈 💭 👉 👩‍💻. 🚫 🕴 🆔 📚 🏬, ✋️ 🌐 💽 👈 👥 🔬 Pydantic *🏷* 👂 🏬: `Item`. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="15-17 31-34" {!> ../../../docs_src/sql_databases/sql_app/schemas.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="15-17 31-34" {!> ../../../docs_src/sql_databases/sql_app_py39/schemas.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="13-15 29-32" {!> ../../../docs_src/sql_databases/sql_app_py310/schemas.py!} ``` !!! tip 👀 👈 `User`, Pydantic *🏷* 👈 🔜 ⚙️ 🕐❔ 👂 👩‍💻 (🛬 ⚫️ ⚪️➡️ 🛠️) 🚫 🔌 `password`. ### ⚙️ Pydantic `orm_mode` 🔜, Pydantic *🏷* 👂, `Item` & `User`, 🚮 🔗 `Config` 🎓. 👉 `Config` 🎓 ⚙️ 🚚 📳 Pydantic. `Config` 🎓, ⚒ 🔢 `orm_mode = True`. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="15 19-20 31 36-37" {!> ../../../docs_src/sql_databases/sql_app/schemas.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="15 19-20 31 36-37" {!> ../../../docs_src/sql_databases/sql_app_py39/schemas.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python hl_lines="13 17-18 29 34-35" {!> ../../../docs_src/sql_databases/sql_app_py310/schemas.py!} ``` !!! tip 👀 ⚫️ ⚖ 💲 ⏮️ `=`, 💖: `orm_mode = True` ⚫️ 🚫 ⚙️ `:` 🆎 📄 ⏭. 👉 ⚒ 📁 💲, 🚫 📣 🆎. Pydantic `orm_mode` 🔜 💬 Pydantic *🏷* ✍ 💽 🚥 ⚫️ 🚫 `dict`, ✋️ 🐜 🏷 (⚖️ 🙆 🎏 ❌ 🎚 ⏮️ 🔢). 👉 🌌, ↩️ 🕴 🔄 🤚 `id` 💲 ⚪️➡️ `dict`,: ```Python id = data["id"] ``` ⚫️ 🔜 🔄 🤚 ⚫️ ⚪️➡️ 🔢,: ```Python id = data.id ``` & ⏮️ 👉, Pydantic *🏷* 🔗 ⏮️ 🐜, & 👆 💪 📣 ⚫️ `response_model` ❌ 👆 *➡ 🛠️*. 👆 🔜 💪 📨 💽 🏷 & ⚫️ 🔜 ✍ 💽 ⚪️➡️ ⚫️. #### 📡 ℹ 🔃 🐜 📳 🇸🇲 & 📚 🎏 🔢 "🙃 🚚". 👈 ⛓, 🖼, 👈 👫 🚫 ☕ 💽 💛 ⚪️➡️ 💽 🚥 👆 🔄 🔐 🔢 👈 🔜 🔌 👈 💽. 🖼, 🔐 🔢 `items`: ```Python current_user.items ``` 🔜 ⚒ 🇸🇲 🚶 `items` 🏓 & 🤚 🏬 👉 👩‍💻, ✋️ 🚫 ⏭. 🍵 `orm_mode`, 🚥 👆 📨 🇸🇲 🏷 ⚪️➡️ 👆 *➡ 🛠️*, ⚫️ 🚫🔜 🔌 💛 💽. 🚥 👆 📣 📚 💛 👆 Pydantic 🏷. ✋️ ⏮️ 🐜 📳, Pydantic ⚫️ 🔜 🔄 🔐 💽 ⚫️ 💪 ⚪️➡️ 🔢 (↩️ 🤔 `dict`), 👆 💪 📣 🎯 💽 👆 💚 📨 & ⚫️ 🔜 💪 🚶 & 🤚 ⚫️, ⚪️➡️ 🐜. ## 💩 🇨🇻 🔜 ➡️ 👀 📁 `sql_app/crud.py`. 👉 📁 👥 🔜 ✔️ ♻ 🔢 🔗 ⏮️ 💽 💽. **💩** 👟 ⚪️➡️: **🅱**📧, **Ⓜ**💳, **👤** = , & **🇨🇮**📧. ...👐 👉 🖼 👥 🕴 🏗 & 👂. ### ✍ 💽 🗄 `Session` ⚪️➡️ `sqlalchemy.orm`, 👉 🔜 ✔ 👆 📣 🆎 `db` 🔢 & ✔️ 👻 🆎 ✅ & 🛠️ 👆 🔢. 🗄 `models` (🇸🇲 🏷) & `schemas` (Pydantic *🏷* / 🔗). ✍ 🚙 🔢: * ✍ 👁 👩‍💻 🆔 & 📧. * ✍ 💗 👩‍💻. * ✍ 💗 🏬. ```Python hl_lines="1 3 6-7 10-11 14-15 27-28" {!../../../docs_src/sql_databases/sql_app/crud.py!} ``` !!! tip 🏗 🔢 👈 🕴 💡 🔗 ⏮️ 💽 (🤚 👩‍💻 ⚖️ 🏬) 🔬 👆 *➡ 🛠️ 🔢*, 👆 💪 🌖 💪 ♻ 👫 💗 🍕 & 🚮 ⚒ 💯 👫. ### ✍ 💽 🔜 ✍ 🚙 🔢 ✍ 💽. 🔁: * ✍ 🇸🇲 🏷 *👐* ⏮️ 👆 📊. * `add` 👈 👐 🎚 👆 💽 🎉. * `commit` 🔀 💽 (👈 👫 🖊). * `refresh` 👆 👐 (👈 ⚫️ 🔌 🙆 🆕 📊 ⚪️➡️ 💽, 💖 🏗 🆔). ```Python hl_lines="18-24 31-36" {!../../../docs_src/sql_databases/sql_app/crud.py!} ``` !!! tip 🇸🇲 🏷 `User` 🔌 `hashed_password` 👈 🔜 🔌 🔐 #️⃣ ⏬ 🔐. ✋️ ⚫️❔ 🛠️ 👩‍💻 🚚 ⏮️ 🔐, 👆 💪 ⚗ ⚫️ & 🏗 #️⃣ 🔐 👆 🈸. & ⤴️ 🚶‍♀️ `hashed_password` ❌ ⏮️ 💲 🖊. !!! warning 👉 🖼 🚫 🔐, 🔐 🚫#️⃣. 🎰 👨‍❤‍👨 🈸 👆 🔜 💪 #️⃣ 🔐 & 🙅 🖊 👫 🔢. 🌅 ℹ, 🚶 🔙 💂‍♂ 📄 🔰. 📥 👥 🎯 🕴 🔛 🧰 & 👨‍🔧 💽. !!! tip ↩️ 🚶‍♀️ 🔠 🇨🇻 ❌ `Item` & 👂 🔠 1️⃣ 👫 ⚪️➡️ Pydantic *🏷*, 👥 🏭 `dict` ⏮️ Pydantic *🏷*'Ⓜ 📊 ⏮️: `item.dict()` & ⤴️ 👥 🚶‍♀️ `dict`'Ⓜ 🔑-💲 👫 🇨🇻 ❌ 🇸🇲 `Item`, ⏮️: `Item(**item.dict())` & ⤴️ 👥 🚶‍♀️ ➕ 🇨🇻 ❌ `owner_id` 👈 🚫 🚚 Pydantic *🏷*, ⏮️: `Item(**item.dict(), owner_id=user_id)` ## 👑 **FastAPI** 📱 & 🔜 📁 `sql_app/main.py` ➡️ 🛠️ & ⚙️ 🌐 🎏 🍕 👥 ✍ ⏭. ### ✍ 💽 🏓 📶 🙃 🌌 ✍ 💽 🏓: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="9" {!> ../../../docs_src/sql_databases/sql_app/main.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="7" {!> ../../../docs_src/sql_databases/sql_app_py39/main.py!} ``` #### ⚗ 🗒 🛎 👆 🔜 🎲 🔢 👆 💽 (✍ 🏓, ♒️) ⏮️ . & 👆 🔜 ⚙️ ⚗ "🛠️" (👈 🚮 👑 👨‍🏭). "🛠️" ⚒ 🔁 💪 🕐❔ 👆 🔀 📊 👆 🇸🇲 🏷, 🚮 🆕 🔢, ♒️. 🔁 👈 🔀 💽, 🚮 🆕 🏓, 🆕 🏓, ♒️. 👆 💪 🔎 🖼 ⚗ FastAPI 🏗 📄 ⚪️➡️ [🏗 ⚡ - 📄](../project-generation.md){.internal-link target=_blank}. 🎯 `alembic` 📁 ℹ 📟. ### ✍ 🔗 🔜 ⚙️ `SessionLocal` 🎓 👥 ✍ `sql_app/database.py` 📁 ✍ 🔗. 👥 💪 ✔️ 🔬 💽 🎉/🔗 (`SessionLocal`) 📍 📨, ⚙️ 🎏 🎉 🔘 🌐 📨 & ⤴️ 🔐 ⚫️ ⏮️ 📨 🏁. & ⤴️ 🆕 🎉 🔜 ✍ ⏭ 📨. 👈, 👥 🔜 ✍ 🆕 🔗 ⏮️ `yield`, 🔬 ⏭ 📄 🔃 [🔗 ⏮️ `yield`](dependencies/dependencies-with-yield.md){.internal-link target=_blank}. 👆 🔗 🔜 ✍ 🆕 🇸🇲 `SessionLocal` 👈 🔜 ⚙️ 👁 📨, & ⤴️ 🔐 ⚫️ 🕐 📨 🏁. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="15-20" {!> ../../../docs_src/sql_databases/sql_app/main.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="13-18" {!> ../../../docs_src/sql_databases/sql_app_py39/main.py!} ``` !!! info 👥 🚮 🏗 `SessionLocal()` & 🚚 📨 `try` 🍫. & ⤴️ 👥 🔐 ⚫️ `finally` 🍫. 👉 🌌 👥 ⚒ 💭 💽 🎉 🕧 📪 ⏮️ 📨. 🚥 📤 ⚠ ⏪ 🏭 📨. ✋️ 👆 💪 🚫 🤚 ➕1️⃣ ⚠ ⚪️➡️ 🚪 📟 (⏮️ `yield`). 👀 🌖 [🔗 ⏮️ `yield` & `HTTPException`](dependencies/dependencies-with-yield.md#yield-httpexception){.internal-link target=_blank} & ⤴️, 🕐❔ ⚙️ 🔗 *➡ 🛠️ 🔢*, 👥 📣 ⚫️ ⏮️ 🆎 `Session` 👥 🗄 🔗 ⚪️➡️ 🇸🇲. 👉 🔜 ⤴️ 🤝 👥 👍 👨‍🎨 🐕‍🦺 🔘 *➡ 🛠️ 🔢*, ↩️ 👨‍🎨 🔜 💭 👈 `db` 🔢 🆎 `Session`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="24 32 38 47 53" {!> ../../../docs_src/sql_databases/sql_app/main.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="22 30 36 45 51" {!> ../../../docs_src/sql_databases/sql_app_py39/main.py!} ``` !!! info "📡 ℹ" 🔢 `db` 🤙 🆎 `SessionLocal`, ✋️ 👉 🎓 (✍ ⏮️ `sessionmaker()`) "🗳" 🇸🇲 `Session`,, 👨‍🎨 🚫 🤙 💭 ⚫️❔ 👩‍🔬 🚚. ✋️ 📣 🆎 `Session`, 👨‍🎨 🔜 💪 💭 💪 👩‍🔬 (`.add()`, `.query()`, `.commit()`, ♒️) & 💪 🚚 👍 🐕‍🦺 (💖 🛠️). 🆎 📄 🚫 📉 ☑ 🎚. ### ✍ 👆 **FastAPI** *➡ 🛠️* 🔜, 😒, 📥 🐩 **FastAPI** *➡ 🛠️* 📟. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="23-28 31-34 37-42 45-49 52-55" {!> ../../../docs_src/sql_databases/sql_app/main.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="21-26 29-32 35-40 43-47 50-53" {!> ../../../docs_src/sql_databases/sql_app_py39/main.py!} ``` 👥 🏗 💽 🎉 ⏭ 🔠 📨 🔗 ⏮️ `yield`, & ⤴️ 📪 ⚫️ ⏮️. & ⤴️ 👥 💪 ✍ 🚚 🔗 *➡ 🛠️ 🔢*, 🤚 👈 🎉 🔗. ⏮️ 👈, 👥 💪 🤙 `crud.get_user` 🔗 ⚪️➡️ 🔘 *➡ 🛠️ 🔢* & ⚙️ 👈 🎉. !!! tip 👀 👈 💲 👆 📨 🇸🇲 🏷, ⚖️ 📇 🇸🇲 🏷. ✋️ 🌐 *➡ 🛠️* ✔️ `response_model` ⏮️ Pydantic *🏷* / 🔗 ⚙️ `orm_mode`, 💽 📣 👆 Pydantic 🏷 🔜 ⚗ ⚪️➡️ 👫 & 📨 👩‍💻, ⏮️ 🌐 😐 ⛽ & 🔬. !!! tip 👀 👈 📤 `response_models` 👈 ✔️ 🐩 🐍 🆎 💖 `List[schemas.Item]`. ✋️ 🎚/🔢 👈 `List` Pydantic *🏷* ⏮️ `orm_mode`, 💽 🔜 🗃 & 📨 👩‍💻 🛎, 🍵 ⚠. ### 🔃 `def` 🆚 `async def` 📥 👥 ⚙️ 🇸🇲 📟 🔘 *➡ 🛠️ 🔢* & 🔗, &, 🔄, ⚫️ 🔜 🚶 & 🔗 ⏮️ 🔢 💽. 👈 💪 ⚠ 🚚 "⌛". ✋️ 🇸🇲 🚫 ✔️ 🔗 ⚙️ `await` 🔗, 🔜 ⏮️ 🕳 💖: ```Python user = await db.query(User).first() ``` ...& ↩️ 👥 ⚙️: ```Python user = db.query(User).first() ``` ⤴️ 👥 🔜 📣 *➡ 🛠️ 🔢* & 🔗 🍵 `async def`, ⏮️ 😐 `def`,: ```Python hl_lines="2" @app.get("/users/{user_id}", response_model=schemas.User) def read_user(user_id: int, db: Session = Depends(get_db)): db_user = crud.get_user(db, user_id=user_id) ... ``` !!! info 🚥 👆 💪 🔗 👆 🔗 💽 🔁, 👀 [🔁 🗄 (🔗) 💽](../advanced/async-sql-databases.md){.internal-link target=_blank}. !!! note "📶 📡 ℹ" 🚥 👆 😟 & ✔️ ⏬ 📡 💡, 👆 💪 ✅ 📶 📡 ℹ ❔ 👉 `async def` 🆚 `def` 🍵 [🔁](../async.md#i_2){.internal-link target=_blank} 🩺. ## 🛠️ ↩️ 👥 ⚙️ 🇸🇲 🔗 & 👥 🚫 🚚 🙆 😇 🔌-⚫️ 👷 ⏮️ **FastAPI**, 👥 💪 🛠️ 💽 🛠️ ⏮️ 🔗. & 📟 🔗 🇸🇲 & 🇸🇲 🏷 🖖 🎏 🔬 📁, 👆 🔜 💪 🎭 🛠️ ⏮️ ⚗ 🍵 ✔️ ❎ FastAPI, Pydantic, ⚖️ 🕳 🙆. 🎏 🌌, 👆 🔜 💪 ⚙️ 🎏 🇸🇲 🏷 & 🚙 🎏 🍕 👆 📟 👈 🚫 🔗 **FastAPI**. 🖼, 🖥 📋 👨‍🏭 ⏮️ 🥒, 🅿, ⚖️ 📶. ## 📄 🌐 📁 💭 👆 🔜 ✔️ 📁 📛 `my_super_project` 👈 🔌 🎧-📁 🤙 `sql_app`. `sql_app` 🔜 ✔️ 📄 📁: * `sql_app/__init__.py`: 🛁 📁. * `sql_app/database.py`: ```Python {!../../../docs_src/sql_databases/sql_app/database.py!} ``` * `sql_app/models.py`: ```Python {!../../../docs_src/sql_databases/sql_app/models.py!} ``` * `sql_app/schemas.py`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python {!> ../../../docs_src/sql_databases/sql_app/schemas.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python {!> ../../../docs_src/sql_databases/sql_app_py39/schemas.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python {!> ../../../docs_src/sql_databases/sql_app_py310/schemas.py!} ``` * `sql_app/crud.py`: ```Python {!../../../docs_src/sql_databases/sql_app/crud.py!} ``` * `sql_app/main.py`: === "🐍 3️⃣.6️⃣ & 🔛" ```Python {!> ../../../docs_src/sql_databases/sql_app/main.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python {!> ../../../docs_src/sql_databases/sql_app_py39/main.py!} ``` ## ✅ ⚫️ 👆 💪 📁 👉 📟 & ⚙️ ⚫️. !!! info 👐, 📟 🎦 📥 🍕 💯. 🌅 📟 👉 🩺. ⤴️ 👆 💪 🏃 ⚫️ ⏮️ Uvicorn:
```console $ uvicorn sql_app.main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
& ⤴️, 👆 💪 📂 👆 🖥 http://127.0.0.1:8000/docs. & 👆 🔜 💪 🔗 ⏮️ 👆 **FastAPI** 🈸, 👂 📊 ⚪️➡️ 🎰 💽: ## 🔗 ⏮️ 💽 🔗 🚥 👆 💚 🔬 🗄 💽 (📁) 🔗, ➡ FastAPI, ℹ 🚮 🎚, 🚮 🏓, 🏓, ⏺, 🔀 📊, ♒️. 👆 💪 ⚙️ 💽 🖥 🗄. ⚫️ 🔜 👀 💖 👉: 👆 💪 ⚙️ 💳 🗄 🖥 💖 🗄 📋 ⚖️ ExtendsClass. ## 🎛 💽 🎉 ⏮️ 🛠️ 🚥 👆 💪 🚫 ⚙️ 🔗 ⏮️ `yield` - 🖼, 🚥 👆 🚫 ⚙️ **🐍 3️⃣.7️⃣** & 💪 🚫 ❎ "🐛" 🤔 🔛 **🐍 3️⃣.6️⃣** - 👆 💪 ⚒ 🆙 🎉 "🛠️" 🎏 🌌. "🛠️" 🌖 🔢 👈 🕧 🛠️ 🔠 📨, ⏮️ 📟 🛠️ ⏭, & 📟 🛠️ ⏮️ 🔗 🔢. ### ✍ 🛠️ 🛠️ 👥 🔜 🚮 (🔢) 🔜 ✍ 🆕 🇸🇲 `SessionLocal` 🔠 📨, 🚮 ⚫️ 📨 & ⤴️ 🔐 ⚫️ 🕐 📨 🏁. === "🐍 3️⃣.6️⃣ & 🔛" ```Python hl_lines="14-22" {!> ../../../docs_src/sql_databases/sql_app/alt_main.py!} ``` === "🐍 3️⃣.9️⃣ & 🔛" ```Python hl_lines="12-20" {!> ../../../docs_src/sql_databases/sql_app_py39/alt_main.py!} ``` !!! info 👥 🚮 🏗 `SessionLocal()` & 🚚 📨 `try` 🍫. & ⤴️ 👥 🔐 ⚫️ `finally` 🍫. 👉 🌌 👥 ⚒ 💭 💽 🎉 🕧 📪 ⏮️ 📨. 🚥 📤 ⚠ ⏪ 🏭 📨. ### 🔃 `request.state` `request.state` 🏠 🔠 `Request` 🎚. ⚫️ 📤 🏪 ❌ 🎚 📎 📨 ⚫️, 💖 💽 🎉 👉 💼. 👆 💪 ✍ 🌅 🔃 ⚫️ 💃 🩺 🔃 `Request` 🇵🇸. 👥 👉 💼, ⚫️ ℹ 👥 🚚 👁 💽 🎉 ⚙️ 🔘 🌐 📨, & ⤴️ 🔐 ⏮️ (🛠️). ### 🔗 ⏮️ `yield` ⚖️ 🛠️ ❎ **🛠️** 📥 🎏 ⚫️❔ 🔗 ⏮️ `yield` 🔨, ⏮️ 🔺: * ⚫️ 🚚 🌖 📟 & 👄 🌅 🏗. * 🛠️ ✔️ `async` 🔢. * 🚥 📤 📟 ⚫️ 👈 ✔️ "⌛" 🕸, ⚫️ 💪 "🍫" 👆 🈸 📤 & 📉 🎭 🍖. * 👐 ⚫️ 🎲 🚫 📶 ⚠ 📥 ⏮️ 🌌 `SQLAlchemy` 👷. * ✋️ 🚥 👆 🚮 🌖 📟 🛠️ 👈 ✔️ 📚 👤/🅾 ⌛, ⚫️ 💪 ⤴️ ⚠. * 🛠️ 🏃 *🔠* 📨. * , 🔗 🔜 ✍ 🔠 📨. * 🕐❔ *➡ 🛠️* 👈 🍵 👈 📨 🚫 💪 💽. !!! tip ⚫️ 🎲 👍 ⚙️ 🔗 ⏮️ `yield` 🕐❔ 👫 🥃 ⚙️ 💼. !!! info 🔗 ⏮️ `yield` 🚮 ⏳ **FastAPI**. ⏮️ ⏬ 👉 🔰 🕴 ✔️ 🖼 ⏮️ 🛠️ & 📤 🎲 📚 🈸 ⚙️ 🛠️ 💽 🎉 🧾. fastapi-0.110.3/docs/em/docs/tutorial/static-files.md000066400000000000000000000024601461403617600223520ustar00rootroot00000000000000# 🎻 📁 👆 💪 🍦 🎻 📁 🔁 ⚪️➡️ 📁 ⚙️ `StaticFiles`. ## ⚙️ `StaticFiles` * 🗄 `StaticFiles`. * "🗻" `StaticFiles()` 👐 🎯 ➡. ```Python hl_lines="2 6" {!../../../docs_src/static_files/tutorial001.py!} ``` !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.staticfiles import StaticFiles`. **FastAPI** 🚚 🎏 `starlette.staticfiles` `fastapi.staticfiles` 🏪 👆, 👩‍💻. ✋️ ⚫️ 🤙 👟 🔗 ⚪️➡️ 💃. ### ⚫️❔ "🗜" "🗜" ⛓ ❎ 🏁 "🔬" 🈸 🎯 ➡, 👈 ⤴️ ✊ 💅 🚚 🌐 🎧-➡. 👉 🎏 ⚪️➡️ ⚙️ `APIRouter` 🗻 🈸 🍕 🔬. 🗄 & 🩺 ⚪️➡️ 👆 👑 🈸 🏆 🚫 🔌 🕳 ⚪️➡️ 🗻 🈸, ♒️. 👆 💪 ✍ 🌅 🔃 👉 **🏧 👩‍💻 🦮**. ## ℹ 🥇 `"/static"` 🔗 🎧-➡ 👉 "🎧-🈸" 🔜 "🗻" 🔛. , 🙆 ➡ 👈 ▶️ ⏮️ `"/static"` 🔜 🍵 ⚫️. `directory="static"` 🔗 📛 📁 👈 🔌 👆 🎻 📁. `name="static"` 🤝 ⚫️ 📛 👈 💪 ⚙️ 🔘 **FastAPI**. 🌐 👫 🔢 💪 🎏 🌘 "`static`", 🔆 👫 ⏮️ 💪 & 🎯 ℹ 👆 👍 🈸. ## 🌅 ℹ 🌖 ℹ & 🎛 ✅ 💃 🩺 🔃 🎻 📁. fastapi-0.110.3/docs/em/docs/tutorial/testing.md000066400000000000000000000122561461403617600214440ustar00rootroot00000000000000# 🔬 👏 💃, 🔬 **FastAPI** 🈸 ⏩ & 😌. ⚫️ ⚓️ 🔛 🇸🇲, ❔ 🔄 🏗 ⚓️ 🔛 📨, ⚫️ 📶 😰 & 🏋️. ⏮️ ⚫️, 👆 💪 ⚙️ 🔗 ⏮️ **FastAPI**. ## ⚙️ `TestClient` !!! info ⚙️ `TestClient`, 🥇 ❎ `httpx`. 🤶 Ⓜ. `pip install httpx`. 🗄 `TestClient`. ✍ `TestClient` 🚶‍♀️ 👆 **FastAPI** 🈸 ⚫️. ✍ 🔢 ⏮️ 📛 👈 ▶️ ⏮️ `test_` (👉 🐩 `pytest` 🏛). ⚙️ `TestClient` 🎚 🎏 🌌 👆 ⏮️ `httpx`. ✍ 🙅 `assert` 📄 ⏮️ 🐩 🐍 🧬 👈 👆 💪 ✅ (🔄, 🐩 `pytest`). ```Python hl_lines="2 12 15-18" {!../../../docs_src/app_testing/tutorial001.py!} ``` !!! tip 👀 👈 🔬 🔢 😐 `def`, 🚫 `async def`. & 🤙 👩‍💻 😐 🤙, 🚫 ⚙️ `await`. 👉 ✔ 👆 ⚙️ `pytest` 🔗 🍵 🤢. !!! note "📡 ℹ" 👆 💪 ⚙️ `from starlette.testclient import TestClient`. **FastAPI** 🚚 🎏 `starlette.testclient` `fastapi.testclient` 🏪 👆, 👩‍💻. ✋️ ⚫️ 👟 🔗 ⚪️➡️ 💃. !!! tip 🚥 👆 💚 🤙 `async` 🔢 👆 💯 ↖️ ⚪️➡️ 📨 📨 👆 FastAPI 🈸 (✅ 🔁 💽 🔢), ✔️ 👀 [🔁 💯](../advanced/async-tests.md){.internal-link target=_blank} 🏧 🔰. ## 🎏 💯 🎰 🈸, 👆 🎲 🔜 ✔️ 👆 💯 🎏 📁. & 👆 **FastAPI** 🈸 5️⃣📆 ✍ 📚 📁/🕹, ♒️. ### **FastAPI** 📱 📁 ➡️ 💬 👆 ✔️ 📁 📊 🔬 [🦏 🈸](bigger-applications.md){.internal-link target=_blank}: ``` . ├── app │   ├── __init__.py │   └── main.py ``` 📁 `main.py` 👆 ✔️ 👆 **FastAPI** 📱: ```Python {!../../../docs_src/app_testing/main.py!} ``` ### 🔬 📁 ⤴️ 👆 💪 ✔️ 📁 `test_main.py` ⏮️ 👆 💯. ⚫️ 💪 🖖 🔛 🎏 🐍 📦 (🎏 📁 ⏮️ `__init__.py` 📁): ``` hl_lines="5" . ├── app │   ├── __init__.py │   ├── main.py │   └── test_main.py ``` ↩️ 👉 📁 🎏 📦, 👆 💪 ⚙️ ⚖ 🗄 🗄 🎚 `app` ⚪️➡️ `main` 🕹 (`main.py`): ```Python hl_lines="3" {!../../../docs_src/app_testing/test_main.py!} ``` ...& ✔️ 📟 💯 💖 ⏭. ## 🔬: ↔ 🖼 🔜 ➡️ ↔ 👉 🖼 & 🚮 🌖 ℹ 👀 ❔ 💯 🎏 🍕. ### ↔ **FastAPI** 📱 📁 ➡️ 😣 ⏮️ 🎏 📁 📊 ⏭: ``` . ├── app │   ├── __init__.py │   ├── main.py │   └── test_main.py ``` ➡️ 💬 👈 🔜 📁 `main.py` ⏮️ 👆 **FastAPI** 📱 ✔️ 🎏 **➡ 🛠️**. ⚫️ ✔️ `GET` 🛠️ 👈 💪 📨 ❌. ⚫️ ✔️ `POST` 🛠️ 👈 💪 📨 📚 ❌. 👯‍♂️ *➡ 🛠️* 🚚 `X-Token` 🎚. === "🐍 3️⃣.6️⃣ & 🔛" ```Python {!> ../../../docs_src/app_testing/app_b/main.py!} ``` === "🐍 3️⃣.1️⃣0️⃣ & 🔛" ```Python {!> ../../../docs_src/app_testing/app_b_py310/main.py!} ``` ### ↔ 🔬 📁 👆 💪 ⤴️ ℹ `test_main.py` ⏮️ ↔ 💯: ```Python {!> ../../../docs_src/app_testing/app_b/test_main.py!} ``` 🕐❔ 👆 💪 👩‍💻 🚶‍♀️ ℹ 📨 & 👆 🚫 💭 ❔, 👆 💪 🔎 (🇺🇸🔍) ❔ ⚫️ `httpx`, ⚖️ ❔ ⚫️ ⏮️ `requests`, 🇸🇲 🔧 ⚓️ 🔛 📨' 🔧. ⤴️ 👆 🎏 👆 💯. 🤶 Ⓜ.: * 🚶‍♀️ *➡* ⚖️ *🔢* 🔢, 🚮 ⚫️ 📛 ⚫️. * 🚶‍♀️ 🎻 💪, 🚶‍♀️ 🐍 🎚 (✅ `dict`) 🔢 `json`. * 🚥 👆 💪 📨 *📨 💽* ↩️ 🎻, ⚙️ `data` 🔢 ↩️. * 🚶‍♀️ *🎚*, ⚙️ `dict` `headers` 🔢. * *🍪*, `dict` `cookies` 🔢. 🌖 ℹ 🔃 ❔ 🚶‍♀️ 💽 👩‍💻 (⚙️ `httpx` ⚖️ `TestClient`) ✅ 🇸🇲 🧾. !!! info 🗒 👈 `TestClient` 📨 💽 👈 💪 🗜 🎻, 🚫 Pydantic 🏷. 🚥 👆 ✔️ Pydantic 🏷 👆 💯 & 👆 💚 📨 🚮 💽 🈸 ⏮️ 🔬, 👆 💪 ⚙️ `jsonable_encoder` 🔬 [🎻 🔗 🔢](encoder.md){.internal-link target=_blank}. ## 🏃 ⚫️ ⏮️ 👈, 👆 💪 ❎ `pytest`:
```console $ pip install pytest ---> 100% ```
⚫️ 🔜 🔍 📁 & 💯 🔁, 🛠️ 👫, & 📄 🏁 🔙 👆. 🏃 💯 ⏮️:
```console $ pytest ================ test session starts ================ platform linux -- Python 3.6.9, pytest-5.3.5, py-1.8.1, pluggy-0.13.1 rootdir: /home/user/code/superawesome-cli/app plugins: forked-1.1.3, xdist-1.31.0, cov-2.8.1 collected 6 items ---> 100% test_main.py ...... [100%] ================= 1 passed in 0.03s ================= ```
fastapi-0.110.3/docs/em/mkdocs.yml000066400000000000000000000000321461403617600166420ustar00rootroot00000000000000INHERIT: ../en/mkdocs.yml fastapi-0.110.3/docs/en/000077500000000000000000000000001461403617600146455ustar00rootroot00000000000000fastapi-0.110.3/docs/en/data/000077500000000000000000000000001461403617600155565ustar00rootroot00000000000000fastapi-0.110.3/docs/en/data/external_links.yml000066400000000000000000000524031461403617600213270ustar00rootroot00000000000000Articles: English: - author: Kurtis Pykes - NVIDIA link: https://developer.nvidia.com/blog/building-a-machine-learning-microservice-with-fastapi/ title: Building a Machine Learning Microservice with FastAPI - author: Ravgeet Dhillon - Twilio link: https://www.twilio.com/en-us/blog/booking-appointments-twilio-notion-fastapi title: Booking Appointments with Twilio, Notion, and FastAPI - author: Abhinav Tripathi - Microsoft Blogs link: https://devblogs.microsoft.com/cosmosdb/azure-cosmos-db-python-and-fastapi/ title: Write a Python data layer with Azure Cosmos DB and FastAPI - author: Donny Peeters author_link: https://github.com/Donnype link: https://bitestreams.com/blog/fastapi-sqlalchemy/ title: 10 Tips for adding SQLAlchemy to FastAPI - author: Jessica Temporal author_link: https://jtemporal.com/socials link: https://jtemporal.com/tips-on-migrating-from-flask-to-fastapi-and-vice-versa/ title: Tips on migrating from Flask to FastAPI and vice-versa - author: Ankit Anchlia author_link: https://linkedin.com/in/aanchlia21 link: https://hackernoon.com/explore-how-to-effectively-use-jwt-with-fastapi title: Explore How to Effectively Use JWT With FastAPI - author: Nicoló Lino author_link: https://www.nlino.com link: https://github.com/softwarebloat/python-tracing-demo title: Instrument a FastAPI service adding tracing with OpenTelemetry and send/show traces in Grafana Tempo - author: Mikhail Rozhkov, Elena Samuylova author_link: https://www.linkedin.com/in/mnrozhkov/ link: https://www.evidentlyai.com/blog/fastapi-tutorial title: ML serving and monitoring with FastAPI and Evidently - author: Visual Studio Code Team author_link: https://code.visualstudio.com/ link: https://code.visualstudio.com/docs/python/tutorial-fastapi title: FastAPI Tutorial in Visual Studio Code - author: Apitally author_link: https://apitally.io link: https://blog.apitally.io/fastapi-application-monitoring-made-easy title: FastAPI application monitoring made easy - author: John Philip author_link: https://medium.com/@amjohnphilip link: https://python.plainenglish.io/building-a-restful-api-with-fastapi-secure-signup-and-login-functionality-included-45cdbcb36106 title: "Building a RESTful API with FastAPI: Secure Signup and Login Functionality Included" - author: Keshav Malik author_link: https://theinfosecguy.xyz/ link: https://blog.theinfosecguy.xyz/building-a-crud-api-with-fastapi-and-supabase-a-step-by-step-guide title: Building a CRUD API with FastAPI and Supabase - author: Adejumo Ridwan Suleiman author_link: https://www.linkedin.com/in/adejumoridwan/ link: https://medium.com/python-in-plain-english/build-an-sms-spam-classifier-serverless-database-with-faunadb-and-fastapi-23dbb275bc5b title: Build an SMS Spam Classifier Serverless Database with FaunaDB and FastAPI - author: Raf Rasenberg author_link: https://rafrasenberg.com/about/ link: https://rafrasenberg.com/fastapi-lambda/ title: 'FastAPI lambda container: serverless simplified' - author: Teresa N. Fontanella De Santis author_link: https://dev.to/ link: https://dev.to/teresafds/authorization-on-fastapi-with-casbin-41og title: Authorization on FastAPI with Casbin - author: New Relic author_link: https://newrelic.com link: https://newrelic.com/instant-observability/fastapi/e559ec64-f765-4470-a15f-1901fcebb468 title: How to monitor FastAPI application performance using Python agent - author: Jean-Baptiste Rocher author_link: https://hashnode.com/@jibrocher link: https://dev.indooroutdoor.io/series/fastapi-react-poll-app title: Building the Poll App From Django Tutorial With FastAPI And React - author: Silvan Melchior author_link: https://github.com/silvanmelchior link: https://blog.devgenius.io/seamless-fastapi-configuration-with-confz-90949c14ea12 title: Seamless FastAPI Configuration with ConfZ - author: Kaustubh Gupta author_link: https://medium.com/@kaustubhgupta1828/ link: https://levelup.gitconnected.com/5-advance-features-of-fastapi-you-should-try-7c0ac7eebb3e title: 5 Advanced Features of FastAPI You Should Try - author: Kaustubh Gupta author_link: https://medium.com/@kaustubhgupta1828/ link: https://www.analyticsvidhya.com/blog/2021/06/deploying-ml-models-as-api-using-fastapi-and-heroku/ title: Deploying ML Models as API Using FastAPI and Heroku - link: https://jarmos.netlify.app/posts/using-github-actions-to-deploy-a-fastapi-project-to-heroku/ title: Using GitHub Actions to Deploy a FastAPI Project to Heroku author_link: https://jarmos.netlify.app/ author: Somraj Saha - author: "@pystar" author_link: https://pystar.substack.com/ link: https://pystar.substack.com/p/how-to-create-a-fake-certificate title: How to Create A Fake Certificate Authority And Generate TLS Certs for FastAPI - author: Ben Gamble author_link: https://uk.linkedin.com/in/bengamble7 link: https://ably.com/blog/realtime-ticket-booking-solution-kafka-fastapi-ably title: Building a realtime ticket booking solution with Kafka, FastAPI, and Ably - author: Shahriyar(Shako) Rzayev author_link: https://www.linkedin.com/in/shahriyar-rzayev/ link: https://www.azepug.az/posts/fastapi/#building-simple-e-commerce-with-nuxtjs-and-fastapi-series title: Building simple E-Commerce with NuxtJS and FastAPI - author: Rodrigo Arenas author_link: https://rodrigo-arenas.medium.com/ link: https://medium.com/analytics-vidhya/serve-a-machine-learning-model-using-sklearn-fastapi-and-docker-85aabf96729b title: "Serve a machine learning model using Sklearn, FastAPI and Docker" - author: Yashasvi Singh author_link: https://hashnode.com/@aUnicornDev link: https://aunicorndev.hashnode.dev/series/supafast-api title: "Building an API with FastAPI and Supabase and Deploying on Deta" - author: Navule Pavan Kumar Rao author_link: https://www.linkedin.com/in/navule/ link: https://www.tutlinks.com/deploy-fastapi-on-ubuntu-gunicorn-caddy-2/ title: Deploy FastAPI on Ubuntu and Serve using Caddy 2 Web Server - author: Patrick Ladon author_link: https://dev.to/factorlive link: https://dev.to/factorlive/python-facebook-messenger-webhook-with-fastapi-on-glitch-4n90 title: Python Facebook messenger webhook with FastAPI on Glitch - author: Valon Januzaj author_link: https://www.linkedin.com/in/valon-januzaj-b02692187/ link: https://valonjanuzaj.medium.com/deploy-a-dockerized-fastapi-application-to-aws-cc757830ba1b title: Deploy a dockerized FastAPI application to AWS - author: Amit Chaudhary author_link: https://twitter.com/amitness link: https://amitness.com/2020/06/fastapi-vs-flask/ title: FastAPI for Flask Users - author: Louis Guitton author_link: https://twitter.com/louis_guitton link: https://guitton.co/posts/fastapi-monitoring/ title: How to monitor your FastAPI service - author: Precious Ndubueze author_link: https://medium.com/@gabbyprecious2000 link: https://medium.com/@gabbyprecious2000/creating-a-crud-app-with-fastapi-part-one-7c049292ad37 title: Creating a CRUD App with FastAPI (Part one) - author: Farhad Malik author_link: https://medium.com/@farhadmalik link: https://towardsdatascience.com/build-and-host-fast-data-science-applications-using-fastapi-823be8a1d6a0 title: Build And Host Fast Data Science Applications Using FastAPI - author: Navule Pavan Kumar Rao author_link: https://www.linkedin.com/in/navule/ link: https://www.tutlinks.com/deploy-fastapi-on-azure/ title: Deploy FastAPI on Azure App Service - author: Davide Fiocco author_link: https://github.com/davidefiocco link: https://davidefiocco.github.io/streamlit-fastapi-ml-serving/ title: Machine learning model serving in Python using FastAPI and streamlit - author: Netflix author_link: https://netflixtechblog.com/ link: https://netflixtechblog.com/introducing-dispatch-da4b8a2a8072 title: Introducing Dispatch - author: Stavros Korokithakis author_link: https://twitter.com/Stavros link: https://www.stavros.io/posts/fastapi-with-django/ title: Using FastAPI with Django - author: Twilio author_link: https://www.twilio.com link: https://www.twilio.com/blog/build-secure-twilio-webhook-python-fastapi title: Build a Secure Twilio Webhook with Python and FastAPI - author: Sebastián Ramírez (tiangolo) author_link: https://twitter.com/tiangolo link: https://dev.to/tiangolo/build-a-web-api-from-scratch-with-fastapi-the-workshop-2ehe title: Build a web API from scratch with FastAPI - the workshop - author: Paul Sec author_link: https://twitter.com/PaulWebSec link: https://paulsec.github.io/posts/fastapi_plus_zeit_serverless_fu/ title: FastAPI + Zeit.co = 🚀 - author: cuongld2 author_link: https://dev.to/cuongld2 link: https://dev.to/cuongld2/build-simple-api-service-with-python-fastapi-part-1-581o title: Build simple API service with Python FastAPI — Part 1 - author: Paurakh Sharma Humagain author_link: https://twitter.com/PaurakhSharma link: https://dev.to/paurakhsharma/microservice-in-python-using-fastapi-24cc title: Microservice in Python using FastAPI - author: Guillermo Cruz author_link: https://wuilly.com/ link: https://wuilly.com/2019/10/real-time-notifications-with-python-and-postgres/ title: Real-time Notifications with Python and Postgres - author: Navule Pavan Kumar Rao author_link: https://www.linkedin.com/in/navule/ link: https://www.tutlinks.com/create-and-deploy-fastapi-app-to-heroku/ title: Create and Deploy FastAPI app to Heroku without using Docker - author: Arthur Henrique author_link: https://twitter.com/arthurheinrique link: https://medium.com/@arthur393/another-boilerplate-to-fastapi-azure-pipeline-ci-pytest-3c8d9a4be0bb title: 'Another Boilerplate to FastAPI: Azure Pipeline CI + Pytest' - author: Shane Soh author_link: https://medium.com/@shane.soh link: https://medium.com/analytics-vidhya/deploy-machine-learning-models-with-keras-fastapi-redis-and-docker-4940df614ece title: Deploy Machine Learning Models with Keras, FastAPI, Redis and Docker - author: Mandy Gu author_link: https://towardsdatascience.com/@mandygu link: https://towardsdatascience.com/deploying-iris-classifications-with-fastapi-and-docker-7c9b83fdec3a title: 'Towards Data Science: Deploying Iris Classifications with FastAPI and Docker' - author: Michael Herman author_link: https://testdriven.io/authors/herman link: https://testdriven.io/blog/fastapi-crud/ title: 'TestDriven.io: Developing and Testing an Asynchronous API with FastAPI and Pytest' - author: Bernard Brenyah author_link: https://medium.com/@bbrenyah link: https://medium.com/python-data/how-to-deploy-tensorflow-2-0-models-as-an-api-service-with-fastapi-docker-128b177e81f3 title: How To Deploy Tensorflow 2.0 Models As An API Service With FastAPI & Docker - author: Dylan Anthony author_link: https://dev.to/dbanty link: https://dev.to/dbanty/why-i-m-leaving-flask-3ki6 title: Why I'm Leaving Flask - author: Mike Moritz author_link: https://medium.com/@mike.p.moritz link: https://medium.com/@mike.p.moritz/using-docker-compose-to-deploy-a-lightweight-python-rest-api-with-a-job-queue-37e6072a209b title: Using Docker Compose to deploy a lightweight Python REST API with a job queue - author: '@euri10' author_link: https://gitlab.com/euri10 link: https://gitlab.com/euri10/fastapi_cheatsheet title: A FastAPI and Swagger UI visual cheatsheet - author: Uber Engineering author_link: https://eng.uber.com link: https://eng.uber.com/ludwig-v0-2/ title: 'Uber: Ludwig v0.2 Adds New Features and Other Improvements to its Deep Learning Toolbox [including a FastAPI server]' - author: Maarten Grootendorst author_link: https://www.linkedin.com/in/mgrootendorst/ link: https://towardsdatascience.com/how-to-deploy-a-machine-learning-model-dc51200fe8cf title: How to Deploy a Machine Learning Model - author: Johannes Gontrum author_link: https://twitter.com/gntrm link: https://medium.com/@gntrm/jwt-authentication-with-fastapi-and-aws-cognito-1333f7f2729e title: JWT Authentication with FastAPI and AWS Cognito - author: Ankush Thakur author_link: https://geekflare.com/author/ankush/ link: https://geekflare.com/python-asynchronous-web-frameworks/ title: Top 5 Asynchronous Web Frameworks for Python - author: Nico Axtmann author_link: https://www.linkedin.com/in/nico-axtmann link: https://medium.com/@nico.axtmann95/deploying-a-scikit-learn-model-with-onnx-und-fastapi-1af398268915 title: Deploying a scikit-learn model with ONNX and FastAPI - author: Nils de Bruin author_link: https://medium.com/@nilsdebruin link: https://medium.com/data-rebels/fastapi-authentication-revisited-enabling-api-key-authentication-122dc5975680 title: 'FastAPI authentication revisited: Enabling API key authentication' - author: Nick Cortale author_link: https://nickc1.github.io/ link: https://nickc1.github.io/api,/scikit-learn/2019/01/10/scikit-fastapi.html title: 'FastAPI and Scikit-Learn: Easily Deploy Models' - author: Errieta Kostala author_link: https://dev.to/errietta link: https://dev.to/errietta/introduction-to-the-fastapi-python-framework-2n10 title: Introduction to the fastapi python framework - author: Nils de Bruin author_link: https://medium.com/@nilsdebruin link: https://medium.com/data-rebels/fastapi-how-to-add-basic-and-cookie-authentication-a45c85ef47d3 title: FastAPI — How to add basic and cookie authentication - author: Nils de Bruin author_link: https://medium.com/@nilsdebruin link: https://medium.com/data-rebels/fastapi-google-as-an-external-authentication-provider-3a527672cf33 title: FastAPI — Google as an external authentication provider - author: William Hayes author_link: https://medium.com/@williamhayes link: https://medium.com/@williamhayes/fastapi-starlette-debug-vs-prod-5f7561db3a59 title: FastAPI/Starlette debug vs prod - author: Mukul Mantosh author_link: https://twitter.com/MantoshMukul link: https://www.jetbrains.com/pycharm/guide/tutorials/fastapi-aws-kubernetes/ title: Developing FastAPI Application using K8s & AWS - author: KrishNa author_link: https://medium.com/@krishnardt365 link: https://medium.com/@krishnardt365/fastapi-docker-and-postgres-91943e71be92 title: Fastapi, Docker(Docker compose) and Postgres German: - author: Marcel Sander (actidoo) author_link: https://www.actidoo.com link: https://www.actidoo.com/de/blog/python-fastapi-domain-driven-design title: Domain-driven Design mit Python und FastAPI - author: Nico Axtmann author_link: https://twitter.com/_nicoax link: https://blog.codecentric.de/2019/08/inbetriebnahme-eines-scikit-learn-modells-mit-onnx-und-fastapi/ title: Inbetriebnahme eines scikit-learn-Modells mit ONNX und FastAPI - author: Felix Schürmeyer author_link: https://hellocoding.de/autor/felix-schuermeyer/ link: https://hellocoding.de/blog/coding-language/python/fastapi title: REST-API Programmieren mittels Python und dem FastAPI Modul Japanese: - author: '@bee2' author_link: https://qiita.com/bee2 link: https://qiita.com/bee2/items/75d9c0d7ba20e7a4a0e9 title: '[FastAPI] Python製のASGI Web フレームワーク FastAPIに入門する' - author: '@bee2' author_link: https://qiita.com/bee2 link: https://qiita.com/bee2/items/0ad260ab9835a2087dae title: PythonのWeb frameworkのパフォーマンス比較 (Django, Flask, responder, FastAPI, japronto) - author: ライトコードメディア編集部 author_link: https://rightcode.co.jp/author/jun link: https://rightcode.co.jp/blog/information-technology/fastapi-tutorial-todo-apps-admin-page-improvement title: '【第4回】FastAPIチュートリアル: toDoアプリを作ってみよう【管理者ページ改良編】' - author: ライトコードメディア編集部 author_link: https://rightcode.co.jp/author/jun link: https://rightcode.co.jp/blog/information-technology/fastapi-tutorial-todo-apps-authentication-user-registration title: '【第3回】FastAPIチュートリアル: toDoアプリを作ってみよう【認証・ユーザ登録編】' - author: ライトコードメディア編集部 author_link: https://rightcode.co.jp/author/jun link: https://rightcode.co.jp/blog/information-technology/fastapi-tutorial-todo-apps-model-building title: '【第2回】FastAPIチュートリアル: ToDoアプリを作ってみよう【モデル構築編】' - author: ライトコードメディア編集部 author_link: https://rightcode.co.jp/author/jun link: https://rightcode.co.jp/blog/information-technology/fastapi-tutorial-todo-apps-environment title: '【第1回】FastAPIチュートリアル: ToDoアプリを作ってみよう【環境構築編】' - author: Hikaru Takahashi author_link: https://qiita.com/hikarut link: https://qiita.com/hikarut/items/b178af2e2440c67c6ac4 title: フロントエンド開発者向けのDockerによるPython開発環境構築 - author: '@angel_katayoku' author_link: https://qiita.com/angel_katayoku link: https://qiita.com/angel_katayoku/items/8a458a8952f50b73f420 title: FastAPIでPOSTされたJSONのレスポンスbodyを受け取る - author: '@angel_katayoku' author_link: https://qiita.com/angel_katayoku link: https://qiita.com/angel_katayoku/items/4fbc1a4e2b33fa2237d2 title: FastAPIをMySQLと接続してDockerで管理してみる - author: '@angel_katayoku' author_link: https://qiita.com/angel_katayoku link: https://qiita.com/angel_katayoku/items/0e1f5dbbe62efc612a78 title: FastAPIでCORSを回避 - author: '@ryoryomaru' author_link: https://qiita.com/ryoryomaru link: https://qiita.com/ryoryomaru/items/59958ed385b3571d50de title: python製の最新APIフレームワーク FastAPI を触ってみた - author: '@mtitg' author_link: https://qiita.com/mtitg link: https://qiita.com/mtitg/items/47770e9a562dd150631d title: FastAPI|DB接続してCRUDするPython製APIサーバーを構築 Portuguese: - author: Jessica Temporal author_link: https://jtemporal.com/socials link: https://jtemporal.com/dicas-para-migrar-de-flask-para-fastapi-e-vice-versa/ title: Dicas para migrar uma aplicação de Flask para FastAPI e vice-versa Russian: - author: Troy Köhler author_link: https://www.linkedin.com/in/trkohler/ link: https://trkohler.com/fast-api-introduction-to-framework title: 'FastAPI: знакомимся с фреймворком' - author: prostomarkeloff author_link: https://github.com/prostomarkeloff link: https://habr.com/ru/post/478620/ title: Почему Вы должны попробовать FastAPI? - author: Andrey Korchak author_link: https://habr.com/ru/users/57uff3r/ link: https://habr.com/ru/post/454440/ title: 'Мелкая питонячая радость #2: Starlette - Солидная примочка – FastAPI' Vietnamese: - author: Nguyễn Nhân author_link: https://fullstackstation.com/author/figonking/ link: https://fullstackstation.com/fastapi-trien-khai-bang-docker/ title: 'FASTAPI: TRIỂN KHAI BẰNG DOCKER' Taiwanese: - author: Leon author_link: http://editor.leonh.space/ link: https://editor.leonh.space/2022/tortoise/ title: 'Tortoise ORM / FastAPI 整合快速筆記' Podcasts: English: - author: Real Python author_link: https://realpython.com/ link: https://realpython.com/podcasts/rpp/72/ title: Starting With FastAPI and Examining Python's Import System - Episode 72 - author: Python Bytes FM author_link: https://pythonbytes.fm/ link: https://www.pythonpodcast.com/fastapi-web-application-framework-episode-259/ title: 'Do you dare to press "."? - Episode 247 - Dan #6: SQLModel - use the same models for SQL and FastAPI' - author: Podcast.`__init__` author_link: https://www.pythonpodcast.com/ link: https://www.pythonpodcast.com/fastapi-web-application-framework-episode-259/ title: Build The Next Generation Of Python Web Applications With FastAPI - Episode 259 - interview to Sebastían Ramírez (tiangolo) - author: Python Bytes FM author_link: https://pythonbytes.fm/ link: https://pythonbytes.fm/episodes/show/123/time-to-right-the-py-wrongs?time_in_sec=855 title: FastAPI on PythonBytes Talks: English: - author: Jeny Sadadia author_link: https://github.com/JenySadadia link: https://www.youtube.com/watch?v=uZdTe8_Z6BQ title: 'PyCon AU 2023: Testing asynchronous applications with FastAPI and pytest' - author: Sebastián Ramírez (tiangolo) author_link: https://twitter.com/tiangolo link: https://www.youtube.com/watch?v=PnpTY1f4k2U title: '[VIRTUAL] Py.Amsterdam''s flying Software Circus: Intro to FastAPI' - author: Sebastián Ramírez (tiangolo) author_link: https://twitter.com/tiangolo link: https://www.youtube.com/watch?v=z9K5pwb0rt8 title: 'PyConBY 2020: Serve ML models easily with FastAPI' - author: Chris Withers author_link: https://twitter.com/chriswithers13 link: https://www.youtube.com/watch?v=3DLwPcrE5mA title: 'PyCon UK 2019: FastAPI from the ground up' fastapi-0.110.3/docs/en/data/github_sponsors.yml000066400000000000000000000645611461403617600215450ustar00rootroot00000000000000sponsors: - - login: bump-sh avatarUrl: https://avatars.githubusercontent.com/u/33217836?v=4 url: https://github.com/bump-sh - login: porter-dev avatarUrl: https://avatars.githubusercontent.com/u/62078005?v=4 url: https://github.com/porter-dev - login: andrew-propelauth avatarUrl: https://avatars.githubusercontent.com/u/89474256?u=1188c27cb744bbec36447a2cfd4453126b2ddb5c&v=4 url: https://github.com/andrew-propelauth - login: zanfaruqui avatarUrl: https://avatars.githubusercontent.com/u/104461687?v=4 url: https://github.com/zanfaruqui - login: Alek99 avatarUrl: https://avatars.githubusercontent.com/u/38776361?u=bd6c163fe787c2de1a26c881598e54b67e2482dd&v=4 url: https://github.com/Alek99 - login: cryptapi avatarUrl: https://avatars.githubusercontent.com/u/44925437?u=61369138589bc7fee6c417f3fbd50fbd38286cc4&v=4 url: https://github.com/cryptapi - login: codacy avatarUrl: https://avatars.githubusercontent.com/u/1834093?v=4 url: https://github.com/codacy - login: scalar avatarUrl: https://avatars.githubusercontent.com/u/301879?v=4 url: https://github.com/scalar - - login: ObliviousAI avatarUrl: https://avatars.githubusercontent.com/u/65656077?v=4 url: https://github.com/ObliviousAI - - login: databento avatarUrl: https://avatars.githubusercontent.com/u/64141749?v=4 url: https://github.com/databento - login: svix avatarUrl: https://avatars.githubusercontent.com/u/80175132?v=4 url: https://github.com/svix - login: deepset-ai avatarUrl: https://avatars.githubusercontent.com/u/51827949?v=4 url: https://github.com/deepset-ai - login: mikeckennedy avatarUrl: https://avatars.githubusercontent.com/u/2035561?u=ce6165b799ea3164cb6f5ff54ea08042057442af&v=4 url: https://github.com/mikeckennedy - login: ndimares avatarUrl: https://avatars.githubusercontent.com/u/6267663?u=cfb27efde7a7212be8142abb6c058a1aeadb41b1&v=4 url: https://github.com/ndimares - - login: takashi-yoneya avatarUrl: https://avatars.githubusercontent.com/u/33813153?u=2d0522bceba0b8b69adf1f2db866503bd96f944e&v=4 url: https://github.com/takashi-yoneya - login: xoflare avatarUrl: https://avatars.githubusercontent.com/u/74335107?v=4 url: https://github.com/xoflare - login: marvin-robot avatarUrl: https://avatars.githubusercontent.com/u/41086007?u=091c5cb75af363123d66f58194805a97220ee1a7&v=4 url: https://github.com/marvin-robot - login: BoostryJP avatarUrl: https://avatars.githubusercontent.com/u/57932412?v=4 url: https://github.com/BoostryJP - login: acsone avatarUrl: https://avatars.githubusercontent.com/u/7601056?v=4 url: https://github.com/acsone - - login: owlur avatarUrl: https://avatars.githubusercontent.com/u/20010787?v=4 url: https://github.com/owlur - login: Trivie avatarUrl: https://avatars.githubusercontent.com/u/8161763?v=4 url: https://github.com/Trivie - - login: americanair avatarUrl: https://avatars.githubusercontent.com/u/12281813?v=4 url: https://github.com/americanair - login: CanoaPBC avatarUrl: https://avatars.githubusercontent.com/u/64223768?v=4 url: https://github.com/CanoaPBC - login: mainframeindustries avatarUrl: https://avatars.githubusercontent.com/u/55092103?v=4 url: https://github.com/mainframeindustries - login: AccentDesign avatarUrl: https://avatars.githubusercontent.com/u/2429332?v=4 url: https://github.com/AccentDesign - login: mangualero avatarUrl: https://avatars.githubusercontent.com/u/3422968?u=c59272d7b5a912d6126fd6c6f17db71e20f506eb&v=4 url: https://github.com/mangualero - login: birkjernstrom avatarUrl: https://avatars.githubusercontent.com/u/281715?u=4be14b43f76b4bd497b1941309bb390250b405e6&v=4 url: https://github.com/birkjernstrom - login: yasyf avatarUrl: https://avatars.githubusercontent.com/u/709645?u=f36736b3c6a85f578886ecc42a740e7b436e7a01&v=4 url: https://github.com/yasyf - - login: primer-io avatarUrl: https://avatars.githubusercontent.com/u/62146168?v=4 url: https://github.com/primer-io - login: povilasb avatarUrl: https://avatars.githubusercontent.com/u/1213442?u=b11f58ed6ceea6e8297c9b310030478ebdac894d&v=4 url: https://github.com/povilasb - - login: upciti avatarUrl: https://avatars.githubusercontent.com/u/43346262?v=4 url: https://github.com/upciti - - login: samuelcolvin avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=42eb3b833047c8c4b4f647a031eaef148c16d93f&v=4 url: https://github.com/samuelcolvin - login: Kludex avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: koconder avatarUrl: https://avatars.githubusercontent.com/u/25068?u=582657b23622aaa3dfe68bd028a780f272f456fa&v=4 url: https://github.com/koconder - login: b-rad-c avatarUrl: https://avatars.githubusercontent.com/u/25362581?u=5bb10629f4015b62bec1f9a366675d5085551af9&v=4 url: https://github.com/b-rad-c - login: ehaca avatarUrl: https://avatars.githubusercontent.com/u/25950317?u=cec1a3e0643b785288ae8260cc295a85ab344995&v=4 url: https://github.com/ehaca - login: timlrx avatarUrl: https://avatars.githubusercontent.com/u/28362229?u=9a745ca31372ee324af682715ae88ce8522f9094&v=4 url: https://github.com/timlrx - login: Leay15 avatarUrl: https://avatars.githubusercontent.com/u/32212558?u=c4aa9c1737e515959382a5515381757b1fd86c53&v=4 url: https://github.com/Leay15 - login: ygorpontelo avatarUrl: https://avatars.githubusercontent.com/u/32963605?u=35f7103f9c4c4c2589ae5737ee882e9375ef072e&v=4 url: https://github.com/ygorpontelo - login: ProteinQure avatarUrl: https://avatars.githubusercontent.com/u/33707203?v=4 url: https://github.com/ProteinQure - login: jsoques avatarUrl: https://avatars.githubusercontent.com/u/12414216?u=620921d94196546cc8b9eae2cc4cbc3f95bab42f&v=4 url: https://github.com/jsoques - login: joeds13 avatarUrl: https://avatars.githubusercontent.com/u/13631604?u=628eb122e08bef43767b3738752b883e8e7f6259&v=4 url: https://github.com/joeds13 - login: dannywade avatarUrl: https://avatars.githubusercontent.com/u/13680237?u=418ee985bd41577b20fde81417fb2d901e875e8a&v=4 url: https://github.com/dannywade - login: khadrawy avatarUrl: https://avatars.githubusercontent.com/u/13686061?u=59f25ef42ecf04c22657aac4238ce0e2d3d30304&v=4 url: https://github.com/khadrawy - login: mjohnsey avatarUrl: https://avatars.githubusercontent.com/u/16784016?u=38fad2e6b411244560b3af99c5f5a4751bc81865&v=4 url: https://github.com/mjohnsey - login: ashi-agrawal avatarUrl: https://avatars.githubusercontent.com/u/17105294?u=99c7a854035e5398d8e7b674f2d42baae6c957f8&v=4 url: https://github.com/ashi-agrawal - login: sepsi77 avatarUrl: https://avatars.githubusercontent.com/u/18682303?v=4 url: https://github.com/sepsi77 - login: wedwardbeck avatarUrl: https://avatars.githubusercontent.com/u/19333237?u=1de4ae2bf8d59eb4c013f21d863cbe0f2010575f&v=4 url: https://github.com/wedwardbeck - login: RaamEEIL avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4 url: https://github.com/RaamEEIL - login: Filimoa avatarUrl: https://avatars.githubusercontent.com/u/21352040?u=0be845711495bbd7b756e13fcaeb8efc1ebd78ba&v=4 url: https://github.com/Filimoa - login: prodhype avatarUrl: https://avatars.githubusercontent.com/u/60444672?u=3f278cff25ea37ead487d7861d4a984795de819e&v=4 url: https://github.com/prodhype - login: yakkonaut avatarUrl: https://avatars.githubusercontent.com/u/60633704?u=90a71fd631aa998ba4a96480788f017c9904e07b&v=4 url: https://github.com/yakkonaut - login: patsatsia avatarUrl: https://avatars.githubusercontent.com/u/61111267?u=3271b85f7a37b479c8d0ae0a235182e83c166edf&v=4 url: https://github.com/patsatsia - login: anthonycepeda avatarUrl: https://avatars.githubusercontent.com/u/72019805?u=60bdf46240cff8fca482ff0fc07d963fd5e1a27c&v=4 url: https://github.com/anthonycepeda - login: patricioperezv avatarUrl: https://avatars.githubusercontent.com/u/73832292?u=5f471f156e19ee7920e62ae0f4a47b95580e61cf&v=4 url: https://github.com/patricioperezv - login: kaoru0310 avatarUrl: https://avatars.githubusercontent.com/u/80977929?u=1b61d10142b490e56af932ddf08a390fae8ee94f&v=4 url: https://github.com/kaoru0310 - login: DelfinaCare avatarUrl: https://avatars.githubusercontent.com/u/83734439?v=4 url: https://github.com/DelfinaCare - login: apitally avatarUrl: https://avatars.githubusercontent.com/u/138365043?v=4 url: https://github.com/apitally - login: logic-automation avatarUrl: https://avatars.githubusercontent.com/u/144732884?v=4 url: https://github.com/logic-automation - login: thenickben avatarUrl: https://avatars.githubusercontent.com/u/40610922?u=1e907d904041b7c91213951a3cb344cd37c14aaf&v=4 url: https://github.com/thenickben - login: ddilidili avatarUrl: https://avatars.githubusercontent.com/u/42176885?u=c0a849dde06987434653197b5f638d3deb55fc6c&v=4 url: https://github.com/ddilidili - login: ramonalmeidam avatarUrl: https://avatars.githubusercontent.com/u/45269580?u=3358750b3a5854d7c3ed77aaca7dd20a0f529d32&v=4 url: https://github.com/ramonalmeidam - login: dudikbender avatarUrl: https://avatars.githubusercontent.com/u/53487583?u=3a57542938ebfd57579a0111db2b297e606d9681&v=4 url: https://github.com/dudikbender - login: tcsmith avatarUrl: https://avatars.githubusercontent.com/u/989034?u=7d8d741552b3279e8f4d3878679823a705a46f8f&v=4 url: https://github.com/tcsmith - login: mickaelandrieu avatarUrl: https://avatars.githubusercontent.com/u/1247388?u=599f6e73e452a9453f2bd91e5c3100750e731ad4&v=4 url: https://github.com/mickaelandrieu - login: dodo5522 avatarUrl: https://avatars.githubusercontent.com/u/1362607?u=9bf1e0e520cccc547c046610c468ce6115bbcf9f&v=4 url: https://github.com/dodo5522 - login: nihpo avatarUrl: https://avatars.githubusercontent.com/u/1841030?u=0264956d7580f7e46687a762a7baa629f84cf97c&v=4 url: https://github.com/nihpo - login: knallgelb avatarUrl: https://avatars.githubusercontent.com/u/2358812?u=c48cb6362b309d74cbf144bd6ad3aed3eb443e82&v=4 url: https://github.com/knallgelb - login: johannquerne avatarUrl: https://avatars.githubusercontent.com/u/2736484?u=9b3381546a25679913a2b08110e4373c98840821&v=4 url: https://github.com/johannquerne - login: Shark009 avatarUrl: https://avatars.githubusercontent.com/u/3163309?u=0c6f4091b0eda05c44c390466199826e6dc6e431&v=4 url: https://github.com/Shark009 - login: dblackrun avatarUrl: https://avatars.githubusercontent.com/u/3528486?v=4 url: https://github.com/dblackrun - login: jstanden avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4 url: https://github.com/jstanden - login: andreaso avatarUrl: https://avatars.githubusercontent.com/u/285964?u=837265cc7562c0685f25b2d81cd9de0434fe107c&v=4 url: https://github.com/andreaso - login: pamelafox avatarUrl: https://avatars.githubusercontent.com/u/297042?v=4 url: https://github.com/pamelafox - login: ericof avatarUrl: https://avatars.githubusercontent.com/u/306014?u=cf7c8733620397e6584a451505581c01c5d842d7&v=4 url: https://github.com/ericof - login: wshayes avatarUrl: https://avatars.githubusercontent.com/u/365303?u=07ca03c5ee811eb0920e633cc3c3db73dbec1aa5&v=4 url: https://github.com/wshayes - login: koxudaxi avatarUrl: https://avatars.githubusercontent.com/u/630670?u=507d8577b4b3670546b449c4c2ccbc5af40d72f7&v=4 url: https://github.com/koxudaxi - login: falkben avatarUrl: https://avatars.githubusercontent.com/u/653031?u=ad9838e089058c9e5a0bab94c0eec7cc181e0cd0&v=4 url: https://github.com/falkben - login: mintuhouse avatarUrl: https://avatars.githubusercontent.com/u/769950?u=ecfbd79a97d33177e0d093ddb088283cf7fe8444&v=4 url: https://github.com/mintuhouse - login: Rehket avatarUrl: https://avatars.githubusercontent.com/u/7015688?u=3afb0ba200feebbc7f958950e92db34df2a3c172&v=4 url: https://github.com/Rehket - login: hiancdtrsnm avatarUrl: https://avatars.githubusercontent.com/u/7343177?v=4 url: https://github.com/hiancdtrsnm - login: TrevorBenson avatarUrl: https://avatars.githubusercontent.com/u/9167887?u=afdd1766fdb79e04e59094cc6a54cd011ee7f686&v=4 url: https://github.com/TrevorBenson - login: wdwinslow avatarUrl: https://avatars.githubusercontent.com/u/11562137?u=dc01daafb354135603a263729e3d26d939c0c452&v=4 url: https://github.com/wdwinslow - login: catherinenelson1 avatarUrl: https://avatars.githubusercontent.com/u/11951946?u=e714b957185b8cf3d301cced7fc3ad2842122c6a&v=4 url: https://github.com/catherinenelson1 - login: zsinx6 avatarUrl: https://avatars.githubusercontent.com/u/3532625?u=ba75a5dc744d1116ccfeaaf30d41cb2fe81fe8dd&v=4 url: https://github.com/zsinx6 - login: kennywakeland avatarUrl: https://avatars.githubusercontent.com/u/3631417?u=7c8f743f1ae325dfadea7c62bbf1abd6a824fc55&v=4 url: https://github.com/kennywakeland - login: aacayaco avatarUrl: https://avatars.githubusercontent.com/u/3634801?u=eaadda178c964178fcb64886f6c732172c8f8219&v=4 url: https://github.com/aacayaco - login: anomaly avatarUrl: https://avatars.githubusercontent.com/u/3654837?v=4 url: https://github.com/anomaly - login: jgreys avatarUrl: https://avatars.githubusercontent.com/u/4136890?u=096820d1ef89877d57d0f68e669ead8b0fde84df&v=4 url: https://github.com/jgreys - login: jaredtrog avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4 url: https://github.com/jaredtrog - login: oliverxchen avatarUrl: https://avatars.githubusercontent.com/u/4471774?u=534191f25e32eeaadda22dfab4b0a428733d5489&v=4 url: https://github.com/oliverxchen - login: ennui93 avatarUrl: https://avatars.githubusercontent.com/u/5300907?u=5b5452725ddb391b2caaebf34e05aba873591c3a&v=4 url: https://github.com/ennui93 - login: ternaus avatarUrl: https://avatars.githubusercontent.com/u/5481618?u=513a26b02a39e7a28d587cd37c6cc877ea368e6e&v=4 url: https://github.com/ternaus - login: eseglem avatarUrl: https://avatars.githubusercontent.com/u/5920492?u=208d419cf667b8ac594c82a8db01932c7e50d057&v=4 url: https://github.com/eseglem - login: FernandoCelmer avatarUrl: https://avatars.githubusercontent.com/u/6262214?u=d29fff3fd862fda4ca752079f13f32e84c762ea4&v=4 url: https://github.com/FernandoCelmer - login: simw avatarUrl: https://avatars.githubusercontent.com/u/6322526?v=4 url: https://github.com/simw - - login: getsentry avatarUrl: https://avatars.githubusercontent.com/u/1396951?v=4 url: https://github.com/getsentry - - login: pawamoy avatarUrl: https://avatars.githubusercontent.com/u/3999221?u=b030e4c89df2f3a36bc4710b925bdeb6745c9856&v=4 url: https://github.com/pawamoy - login: nisutec avatarUrl: https://avatars.githubusercontent.com/u/25281462?u=e562484c451fdfc59053163f64405f8eb262b8b0&v=4 url: https://github.com/nisutec - login: hoenie-ams avatarUrl: https://avatars.githubusercontent.com/u/25708487?u=cda07434f0509ac728d9edf5e681117c0f6b818b&v=4 url: https://github.com/hoenie-ams - login: joerambo avatarUrl: https://avatars.githubusercontent.com/u/26282974?v=4 url: https://github.com/joerambo - login: rlnchow avatarUrl: https://avatars.githubusercontent.com/u/28018479?u=a93ca9cf1422b9ece155784a72d5f2fdbce7adff&v=4 url: https://github.com/rlnchow - login: dvlpjrs avatarUrl: https://avatars.githubusercontent.com/u/32254642?u=fbd6ad0324d4f1eb6231cf775be1c7bd4404e961&v=4 url: https://github.com/dvlpjrs - login: engineerjoe440 avatarUrl: https://avatars.githubusercontent.com/u/33275230?u=eb223cad27017bb1e936ee9b429b450d092d0236&v=4 url: https://github.com/engineerjoe440 - login: bnkc avatarUrl: https://avatars.githubusercontent.com/u/34930566?u=fa1dc8db3e920cf5c5636b97180a6f811fa01aaf&v=4 url: https://github.com/bnkc - login: petercool avatarUrl: https://avatars.githubusercontent.com/u/37613029?u=81c525232bb35780945a68e88afd96bb2cdad9c4&v=4 url: https://github.com/petercool - login: JimFawkes avatarUrl: https://avatars.githubusercontent.com/u/12075115?u=dc58ecfd064d72887c34bf500ddfd52592509acd&v=4 url: https://github.com/JimFawkes - login: artempronevskiy avatarUrl: https://avatars.githubusercontent.com/u/12235104?u=03df6e1e55c9c6fe5d230adabb8dd7d43d8bbe8f&v=4 url: https://github.com/artempronevskiy - login: TheR1D avatarUrl: https://avatars.githubusercontent.com/u/16740832?u=b0dfdbdb27b79729430c71c6128962f77b7b53f7&v=4 url: https://github.com/TheR1D - login: joshuatz avatarUrl: https://avatars.githubusercontent.com/u/17817563?u=f1bf05b690d1fc164218f0b420cdd3acb7913e21&v=4 url: https://github.com/joshuatz - login: jangia avatarUrl: https://avatars.githubusercontent.com/u/17927101?u=9261b9bb0c3e3bb1ecba43e8915dc58d8c9a077e&v=4 url: https://github.com/jangia - login: shuheng-liu avatarUrl: https://avatars.githubusercontent.com/u/22414322?u=813c45f30786c6b511b21a661def025d8f7b609e&v=4 url: https://github.com/shuheng-liu - login: pers0n4 avatarUrl: https://avatars.githubusercontent.com/u/24864600?u=f211a13a7b572cbbd7779b9c8d8cb428cc7ba07e&v=4 url: https://github.com/pers0n4 - login: SebTota avatarUrl: https://avatars.githubusercontent.com/u/25122511?v=4 url: https://github.com/SebTota - login: fernandosmither avatarUrl: https://avatars.githubusercontent.com/u/66154723?u=a76a037b5d674938a75d2cff862fb6dfd63ec214&v=4 url: https://github.com/fernandosmither - login: romabozhanovgithub avatarUrl: https://avatars.githubusercontent.com/u/67696229?u=e4b921eef096415300425aca249348f8abb78ad7&v=4 url: https://github.com/romabozhanovgithub - login: PelicanQ avatarUrl: https://avatars.githubusercontent.com/u/77930606?v=4 url: https://github.com/PelicanQ - login: jugeeem avatarUrl: https://avatars.githubusercontent.com/u/116043716?u=ae590d79c38ac79c91b9c5caa6887d061e865a3d&v=4 url: https://github.com/jugeeem - login: tahmarrrr23 avatarUrl: https://avatars.githubusercontent.com/u/138208610?u=465a46b0ff72a74252d3e3a71ac7d2f1919cda28&v=4 url: https://github.com/tahmarrrr23 - login: curegit avatarUrl: https://avatars.githubusercontent.com/u/37978051?u=1733c322079118c0cdc573c03d92813f50a9faec&v=4 url: https://github.com/curegit - login: kristiangronberg avatarUrl: https://avatars.githubusercontent.com/u/42678548?v=4 url: https://github.com/kristiangronberg - login: leonardo-holguin avatarUrl: https://avatars.githubusercontent.com/u/43093055?u=b59013d52fb6c4e0954aaaabc0882bd844985b38&v=4 url: https://github.com/leonardo-holguin - login: arrrrrmin avatarUrl: https://avatars.githubusercontent.com/u/43553423?u=36a3880a6eb29309c19e6cadbb173bafbe91deb1&v=4 url: https://github.com/arrrrrmin - login: mobyw avatarUrl: https://avatars.githubusercontent.com/u/44370805?v=4 url: https://github.com/mobyw - login: ArtyomVancyan avatarUrl: https://avatars.githubusercontent.com/u/44609997?v=4 url: https://github.com/ArtyomVancyan - login: hgalytoby avatarUrl: https://avatars.githubusercontent.com/u/50397689?u=f4888c2c54929bd86eed0d3971d09fcb306e5088&v=4 url: https://github.com/hgalytoby - login: conservative-dude avatarUrl: https://avatars.githubusercontent.com/u/55538308?u=f250c44942ea6e73a6bd90739b381c470c192c11&v=4 url: https://github.com/conservative-dude - login: miguelgr avatarUrl: https://avatars.githubusercontent.com/u/1484589?u=54556072b8136efa12ae3b6902032ea2a39ace4b&v=4 url: https://github.com/miguelgr - login: WillHogan avatarUrl: https://avatars.githubusercontent.com/u/1661551?u=7036c064cf29781470573865264ec8e60b6b809f&v=4 url: https://github.com/WillHogan - login: my3 avatarUrl: https://avatars.githubusercontent.com/u/1825270?v=4 url: https://github.com/my3 - login: leobiscassi avatarUrl: https://avatars.githubusercontent.com/u/1977418?u=f9f82445a847ab479bd7223debd677fcac6c49a0&v=4 url: https://github.com/leobiscassi - login: cbonoz avatarUrl: https://avatars.githubusercontent.com/u/2351087?u=fd3e8030b2cc9fbfbb54a65e9890c548a016f58b&v=4 url: https://github.com/cbonoz - login: anthonycorletti avatarUrl: https://avatars.githubusercontent.com/u/3477132?u=dfe51d2080fbd3fee81e05911cd8d50da9dcc709&v=4 url: https://github.com/anthonycorletti - login: ddanier avatarUrl: https://avatars.githubusercontent.com/u/113563?u=ed1dc79de72f93bd78581f88ebc6952b62f472da&v=4 url: https://github.com/ddanier - login: bryanculbertson avatarUrl: https://avatars.githubusercontent.com/u/144028?u=defda4f90e93429221cc667500944abde60ebe4a&v=4 url: https://github.com/bryanculbertson - login: slafs avatarUrl: https://avatars.githubusercontent.com/u/210173?v=4 url: https://github.com/slafs - login: adamghill avatarUrl: https://avatars.githubusercontent.com/u/317045?u=f1349d5ffe84a19f324e204777859fbf69ddf633&v=4 url: https://github.com/adamghill - login: eteq avatarUrl: https://avatars.githubusercontent.com/u/346587?v=4 url: https://github.com/eteq - login: dmig avatarUrl: https://avatars.githubusercontent.com/u/388564?v=4 url: https://github.com/dmig - login: securancy avatarUrl: https://avatars.githubusercontent.com/u/606673?v=4 url: https://github.com/securancy - login: tochikuji avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4 url: https://github.com/tochikuji - login: browniebroke avatarUrl: https://avatars.githubusercontent.com/u/861044?u=5abfca5588f3e906b31583d7ee62f6de4b68aa24&v=4 url: https://github.com/browniebroke - login: KentShikama avatarUrl: https://avatars.githubusercontent.com/u/6329898?u=8b236810db9b96333230430837e1f021f9246da1&v=4 url: https://github.com/KentShikama - login: katnoria avatarUrl: https://avatars.githubusercontent.com/u/7674948?u=09767eb13e07e09496c5fee4e5ce21d9eac34a56&v=4 url: https://github.com/katnoria - login: harsh183 avatarUrl: https://avatars.githubusercontent.com/u/7780198?v=4 url: https://github.com/harsh183 - login: hcristea avatarUrl: https://avatars.githubusercontent.com/u/7814406?u=61d7a4fcf846983a4606788eac25e1c6c1209ba8&v=4 url: https://github.com/hcristea - login: moonape1226 avatarUrl: https://avatars.githubusercontent.com/u/8532038?u=d9f8b855a429fff9397c3833c2ff83849ebf989d&v=4 url: https://github.com/moonape1226 - login: msehnout avatarUrl: https://avatars.githubusercontent.com/u/9369632?u=8c988f1b008a3f601385a3616f9327820f66e3a5&v=4 url: https://github.com/msehnout - login: xncbf avatarUrl: https://avatars.githubusercontent.com/u/9462045?u=ee91e210ae93b9cdd8f248b21cb028316cc0b747&v=4 url: https://github.com/xncbf - login: DMantis avatarUrl: https://avatars.githubusercontent.com/u/9536869?v=4 url: https://github.com/DMantis - login: hard-coders avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4 url: https://github.com/hard-coders - login: supdann avatarUrl: https://avatars.githubusercontent.com/u/9986994?u=9671810f4ae9504c063227fee34fd47567ff6954&v=4 url: https://github.com/supdann - login: satwikkansal avatarUrl: https://avatars.githubusercontent.com/u/10217535?u=b12d6ef74ea297de9e46da6933b1a5b7ba9e6a61&v=4 url: https://github.com/satwikkansal - login: mntolia avatarUrl: https://avatars.githubusercontent.com/u/10390224?v=4 url: https://github.com/mntolia - login: pheanex avatarUrl: https://avatars.githubusercontent.com/u/10408624?u=5b6bab6ee174aa6e991333e06eb29f628741013d&v=4 url: https://github.com/pheanex - login: dzoladz avatarUrl: https://avatars.githubusercontent.com/u/10561752?u=5ee314d54aa79592c18566827ad8914debd5630d&v=4 url: https://github.com/dzoladz - login: Alisa-lisa avatarUrl: https://avatars.githubusercontent.com/u/4137964?u=e7e393504f554f4ff15863a1e01a5746863ef9ce&v=4 url: https://github.com/Alisa-lisa - login: danielunderwood avatarUrl: https://avatars.githubusercontent.com/u/4472301?v=4 url: https://github.com/danielunderwood - login: rangulvers avatarUrl: https://avatars.githubusercontent.com/u/5235430?v=4 url: https://github.com/rangulvers - login: sdevkota avatarUrl: https://avatars.githubusercontent.com/u/5250987?u=4ed9a120c89805a8aefda1cbdc0cf6512e64d1b4&v=4 url: https://github.com/sdevkota - login: brizzbuzz avatarUrl: https://avatars.githubusercontent.com/u/5607577?u=58d5aae33bc97e52f11f334d2702e8710314b5c1&v=4 url: https://github.com/brizzbuzz - login: Baghdady92 avatarUrl: https://avatars.githubusercontent.com/u/5708590?v=4 url: https://github.com/Baghdady92 - login: jakeecolution avatarUrl: https://avatars.githubusercontent.com/u/5884696?u=4a7c7883fb064b593b50cb6697b54687e6f7aafe&v=4 url: https://github.com/jakeecolution - - login: abizovnuralem avatarUrl: https://avatars.githubusercontent.com/u/33475993?u=6ce72b11a16a8232d3dd1f958f460b4735f520d8&v=4 url: https://github.com/abizovnuralem - login: danburonline avatarUrl: https://avatars.githubusercontent.com/u/34251194?u=94935cccfbec58083ab1e535212d54f1bf2c978a&v=4 url: https://github.com/danburonline - login: sadikkuzu avatarUrl: https://avatars.githubusercontent.com/u/23168063?u=d179c06bb9f65c4167fcab118526819f8e0dac17&v=4 url: https://github.com/sadikkuzu - login: rwxd avatarUrl: https://avatars.githubusercontent.com/u/40308458?u=cd04a39e3655923be4f25c2ba8a5a07b3da3230a&v=4 url: https://github.com/rwxd - login: YungBricoCoop avatarUrl: https://avatars.githubusercontent.com/u/42273436?u=80470b400c416d1eabc2cc71b1efffc0e3503146&v=4 url: https://github.com/YungBricoCoop - login: nlazaro avatarUrl: https://avatars.githubusercontent.com/u/44237350?u=939a570fc965d93e9db1284b5acc173c1a0be4a0&v=4 url: https://github.com/nlazaro - login: Patechoc avatarUrl: https://avatars.githubusercontent.com/u/2376641?u=23b49e9eda04f078cb74fa3f93593aa6a57bb138&v=4 url: https://github.com/Patechoc - login: ssbarnea avatarUrl: https://avatars.githubusercontent.com/u/102495?u=c2efbf6fea2737e21dfc6b1113c4edc9644e9eaa&v=4 url: https://github.com/ssbarnea - login: yuawn avatarUrl: https://avatars.githubusercontent.com/u/5111198?u=5315576f3fe1a70fd2d0f02181588f4eea5d353d&v=4 url: https://github.com/yuawn fastapi-0.110.3/docs/en/data/people.yml000066400000000000000000001617011461403617600175730ustar00rootroot00000000000000maintainers: - login: tiangolo answers: 1878 prs: 559 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=740f11212a731f56798f558ceddb0bd07642afa7&v=4 url: https://github.com/tiangolo experts: - login: Kludex count: 598 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: dmontagu count: 241 avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=540f30c937a6450812628b9592a1dfe91bbe148e&v=4 url: https://github.com/dmontagu - login: jgould22 count: 235 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 - login: Mause count: 220 avatarUrl: https://avatars.githubusercontent.com/u/1405026?v=4 url: https://github.com/Mause - login: ycd count: 217 avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=45aa6ef58220a3f1e8a3c3cd5f1b75a1a0a73347&v=4 url: https://github.com/ycd - login: JarroVGIT count: 193 avatarUrl: https://avatars.githubusercontent.com/u/13659033?u=e8bea32d07a5ef72f7dde3b2079ceb714923ca05&v=4 url: https://github.com/JarroVGIT - login: euri10 count: 153 avatarUrl: https://avatars.githubusercontent.com/u/1104190?u=321a2e953e6645a7d09b732786c7a8061e0f8a8b&v=4 url: https://github.com/euri10 - login: iudeen count: 128 avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=2843b3303282bff8b212dcd4d9d6689452e4470c&v=4 url: https://github.com/iudeen - login: phy25 count: 126 avatarUrl: https://avatars.githubusercontent.com/u/331403?v=4 url: https://github.com/phy25 - login: raphaelauv count: 83 avatarUrl: https://avatars.githubusercontent.com/u/10202690?u=e6f86f5c0c3026a15d6b51792fa3e532b12f1371&v=4 url: https://github.com/raphaelauv - login: ghandic count: 71 avatarUrl: https://avatars.githubusercontent.com/u/23500353?u=e2e1d736f924d9be81e8bfc565b6d8836ba99773&v=4 url: https://github.com/ghandic - login: ArcLightSlavik count: 71 avatarUrl: https://avatars.githubusercontent.com/u/31127044?u=b0f2c37142f4b762e41ad65dc49581813422bd71&v=4 url: https://github.com/ArcLightSlavik - login: falkben count: 59 avatarUrl: https://avatars.githubusercontent.com/u/653031?u=ad9838e089058c9e5a0bab94c0eec7cc181e0cd0&v=4 url: https://github.com/falkben - login: JavierSanchezCastro count: 55 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro - login: n8sty count: 52 avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 url: https://github.com/n8sty - login: sm-Fifteen count: 49 avatarUrl: https://avatars.githubusercontent.com/u/516999?u=437c0c5038558c67e887ccd863c1ba0f846c03da&v=4 url: https://github.com/sm-Fifteen - login: yinziyan1206 count: 48 avatarUrl: https://avatars.githubusercontent.com/u/37829370?u=da44ca53aefd5c23f346fab8e9fd2e108294c179&v=4 url: https://github.com/yinziyan1206 - login: acidjunk count: 47 avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 url: https://github.com/acidjunk - login: adriangb count: 45 avatarUrl: https://avatars.githubusercontent.com/u/1755071?u=612704256e38d6ac9cbed24f10e4b6ac2da74ecb&v=4 url: https://github.com/adriangb - login: insomnes count: 45 avatarUrl: https://avatars.githubusercontent.com/u/16958893?u=f8be7088d5076d963984a21f95f44e559192d912&v=4 url: https://github.com/insomnes - login: Dustyposa count: 45 avatarUrl: https://avatars.githubusercontent.com/u/27180793?u=5cf2877f50b3eb2bc55086089a78a36f07042889&v=4 url: https://github.com/Dustyposa - login: YuriiMotov count: 43 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov - login: frankie567 count: 43 avatarUrl: https://avatars.githubusercontent.com/u/1144727?u=c159fe047727aedecbbeeaa96a1b03ceb9d39add&v=4 url: https://github.com/frankie567 - login: odiseo0 count: 43 avatarUrl: https://avatars.githubusercontent.com/u/87550035?u=241a71f6b7068738b81af3e57f45ffd723538401&v=4 url: https://github.com/odiseo0 - login: includeamin count: 40 avatarUrl: https://avatars.githubusercontent.com/u/11836741?u=8bd5ef7e62fe6a82055e33c4c0e0a7879ff8cfb6&v=4 url: https://github.com/includeamin - login: chbndrhnns count: 38 avatarUrl: https://avatars.githubusercontent.com/u/7534547?v=4 url: https://github.com/chbndrhnns - login: STeveShary count: 37 avatarUrl: https://avatars.githubusercontent.com/u/5167622?u=de8f597c81d6336fcebc37b32dfd61a3f877160c&v=4 url: https://github.com/STeveShary - login: krishnardt count: 35 avatarUrl: https://avatars.githubusercontent.com/u/31960541?u=47f4829c77f4962ab437ffb7995951e41eeebe9b&v=4 url: https://github.com/krishnardt - login: panla count: 32 avatarUrl: https://avatars.githubusercontent.com/u/41326348?u=ba2fda6b30110411ecbf406d187907e2b420ac19&v=4 url: https://github.com/panla - login: prostomarkeloff count: 28 avatarUrl: https://avatars.githubusercontent.com/u/28061158?u=72309cc1f2e04e40fa38b29969cb4e9d3f722e7b&v=4 url: https://github.com/prostomarkeloff - login: dbanty count: 26 avatarUrl: https://avatars.githubusercontent.com/u/43723790?u=9bcce836bbce55835291c5b2ac93a4e311f4b3c3&v=4 url: https://github.com/dbanty - login: wshayes count: 25 avatarUrl: https://avatars.githubusercontent.com/u/365303?u=07ca03c5ee811eb0920e633cc3c3db73dbec1aa5&v=4 url: https://github.com/wshayes - login: acnebs count: 23 avatarUrl: https://avatars.githubusercontent.com/u/9054108?v=4 url: https://github.com/acnebs - login: SirTelemak count: 23 avatarUrl: https://avatars.githubusercontent.com/u/9435877?u=719327b7d2c4c62212456d771bfa7c6b8dbb9eac&v=4 url: https://github.com/SirTelemak - login: chrisK824 count: 22 avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4 url: https://github.com/chrisK824 - login: nymous count: 21 avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4 url: https://github.com/nymous - login: rafsaf count: 21 avatarUrl: https://avatars.githubusercontent.com/u/51059348?u=5fe59a56e1f2f9ccd8005d71752a8276f133ae1a&v=4 url: https://github.com/rafsaf - login: hasansezertasan count: 20 avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 url: https://github.com/hasansezertasan - login: nsidnev count: 20 avatarUrl: https://avatars.githubusercontent.com/u/22559461?u=a9cc3238217e21dc8796a1a500f01b722adb082c&v=4 url: https://github.com/nsidnev - login: ebottos94 count: 20 avatarUrl: https://avatars.githubusercontent.com/u/100039558?u=e2c672da5a7977fd24d87ce6ab35f8bf5b1ed9fa&v=4 url: https://github.com/ebottos94 - login: chris-allnutt count: 20 avatarUrl: https://avatars.githubusercontent.com/u/565544?v=4 url: https://github.com/chris-allnutt - login: retnikt count: 18 avatarUrl: https://avatars.githubusercontent.com/u/24581770?v=4 url: https://github.com/retnikt - login: zoliknemet count: 18 avatarUrl: https://avatars.githubusercontent.com/u/22326718?u=31ba446ac290e23e56eea8e4f0c558aaf0b40779&v=4 url: https://github.com/zoliknemet - login: nkhitrov count: 17 avatarUrl: https://avatars.githubusercontent.com/u/28262306?u=66ee21316275ef356081c2efc4ed7a4572e690dc&v=4 url: https://github.com/nkhitrov - login: Hultner count: 17 avatarUrl: https://avatars.githubusercontent.com/u/2669034?u=115e53df959309898ad8dc9443fbb35fee71df07&v=4 url: https://github.com/Hultner - login: harunyasar count: 17 avatarUrl: https://avatars.githubusercontent.com/u/1765494?u=5b1ab7c582db4b4016fa31affe977d10af108ad4&v=4 url: https://github.com/harunyasar - login: caeser1996 count: 17 avatarUrl: https://avatars.githubusercontent.com/u/16540232?u=05d2beb8e034d584d0a374b99d8826327bd7f614&v=4 url: https://github.com/caeser1996 - login: jonatasoli count: 16 avatarUrl: https://avatars.githubusercontent.com/u/26334101?u=071c062d2861d3dd127f6b4a5258cd8ef55d4c50&v=4 url: https://github.com/jonatasoli last_month_experts: - login: YuriiMotov count: 40 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov - login: JavierSanchezCastro count: 11 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro - login: Kludex count: 8 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: jgould22 count: 7 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 - login: omarcruzpantoja count: 3 avatarUrl: https://avatars.githubusercontent.com/u/15116058?u=4b64c643fad49225d854e1aaecd1ffc6f9071a1b&v=4 url: https://github.com/omarcruzpantoja - login: pythonweb2 count: 2 avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4 url: https://github.com/pythonweb2 - login: PhysicallyActive count: 2 avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 url: https://github.com/PhysicallyActive - login: VatsalJagani count: 2 avatarUrl: https://avatars.githubusercontent.com/u/20964366?u=43552644be05c9107c029e26d5ab3be5a1920f45&v=4 url: https://github.com/VatsalJagani - login: khaledadrani count: 2 avatarUrl: https://avatars.githubusercontent.com/u/45245894?u=49ed5056426a149a5af29d385d8bd3847101d3a4&v=4 url: https://github.com/khaledadrani - login: chrisK824 count: 2 avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4 url: https://github.com/chrisK824 - login: ThirVondukr count: 2 avatarUrl: https://avatars.githubusercontent.com/u/50728601?u=167c0bd655e52817082e50979a86d2f98f95b1a3&v=4 url: https://github.com/ThirVondukr - login: hussein-awala count: 2 avatarUrl: https://avatars.githubusercontent.com/u/21311487?u=cbbc60943d3fedfb869e49b604020a821f589659&v=4 url: https://github.com/hussein-awala three_months_experts: - login: Kludex count: 84 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: YuriiMotov count: 43 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov - login: jgould22 count: 30 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 - login: JavierSanchezCastro count: 24 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro - login: n8sty count: 11 avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 url: https://github.com/n8sty - login: hasansezertasan count: 8 avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 url: https://github.com/hasansezertasan - login: dolfinus count: 6 avatarUrl: https://avatars.githubusercontent.com/u/4661021?u=a51b39001a2e5e7529b45826980becf786de2327&v=4 url: https://github.com/dolfinus - login: aanchlia count: 6 avatarUrl: https://avatars.githubusercontent.com/u/2835374?u=3c3ed29aa8b09ccaf8d66def0ce82bc2f7e5aab6&v=4 url: https://github.com/aanchlia - login: GodMoonGoodman count: 4 avatarUrl: https://avatars.githubusercontent.com/u/29688727?u=7b251da620d999644c37c1feeb292d033eed7ad6&v=4 url: https://github.com/GodMoonGoodman - login: flo-at count: 4 avatarUrl: https://avatars.githubusercontent.com/u/564288?v=4 url: https://github.com/flo-at - login: estebanx64 count: 4 avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 url: https://github.com/estebanx64 - login: omarcruzpantoja count: 3 avatarUrl: https://avatars.githubusercontent.com/u/15116058?u=4b64c643fad49225d854e1aaecd1ffc6f9071a1b&v=4 url: https://github.com/omarcruzpantoja - login: fmelihh count: 3 avatarUrl: https://avatars.githubusercontent.com/u/99879453?u=f76c4460556e41a59eb624acd0cf6e342d660700&v=4 url: https://github.com/fmelihh - login: ahmedabdou14 count: 3 avatarUrl: https://avatars.githubusercontent.com/u/104530599?u=05365b155a1ff911532e8be316acfad2e0736f98&v=4 url: https://github.com/ahmedabdou14 - login: chrisK824 count: 3 avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4 url: https://github.com/chrisK824 - login: pythonweb2 count: 2 avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4 url: https://github.com/pythonweb2 - login: PhysicallyActive count: 2 avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 url: https://github.com/PhysicallyActive - login: richin13 count: 2 avatarUrl: https://avatars.githubusercontent.com/u/8370058?u=8e37a4cdbc78983a5f4b4847f6d1879fb39c851c&v=4 url: https://github.com/richin13 - login: VatsalJagani count: 2 avatarUrl: https://avatars.githubusercontent.com/u/20964366?u=43552644be05c9107c029e26d5ab3be5a1920f45&v=4 url: https://github.com/VatsalJagani - login: khaledadrani count: 2 avatarUrl: https://avatars.githubusercontent.com/u/45245894?u=49ed5056426a149a5af29d385d8bd3847101d3a4&v=4 url: https://github.com/khaledadrani - login: acidjunk count: 2 avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 url: https://github.com/acidjunk - login: agn-7 count: 2 avatarUrl: https://avatars.githubusercontent.com/u/14202344?u=a1d05998ceaf4d06d1063575a7c4ef6e7ae5890e&v=4 url: https://github.com/agn-7 - login: ThirVondukr count: 2 avatarUrl: https://avatars.githubusercontent.com/u/50728601?u=167c0bd655e52817082e50979a86d2f98f95b1a3&v=4 url: https://github.com/ThirVondukr - login: hussein-awala count: 2 avatarUrl: https://avatars.githubusercontent.com/u/21311487?u=cbbc60943d3fedfb869e49b604020a821f589659&v=4 url: https://github.com/hussein-awala - login: JoshYuJump count: 2 avatarUrl: https://avatars.githubusercontent.com/u/5901894?u=cdbca6296ac4cdcdf6945c112a1ce8d5342839ea&v=4 url: https://github.com/JoshYuJump - login: bhumkong count: 2 avatarUrl: https://avatars.githubusercontent.com/u/13270137?u=1490432e6a0184fbc3d5c8d1b5df553ca92e7e5b&v=4 url: https://github.com/bhumkong - login: falkben count: 2 avatarUrl: https://avatars.githubusercontent.com/u/653031?u=ad9838e089058c9e5a0bab94c0eec7cc181e0cd0&v=4 url: https://github.com/falkben - login: mielvds count: 2 avatarUrl: https://avatars.githubusercontent.com/u/1032980?u=722c96b0a234752df23f04df150ef36441ceb43c&v=4 url: https://github.com/mielvds - login: admo1 count: 2 avatarUrl: https://avatars.githubusercontent.com/u/14835916?v=4 url: https://github.com/admo1 - login: pbasista count: 2 avatarUrl: https://avatars.githubusercontent.com/u/1535892?u=e9a8bd5b3b2f95340cfeb4bc97886e9334911669&v=4 url: https://github.com/pbasista - login: bogdan-coman-uv count: 2 avatarUrl: https://avatars.githubusercontent.com/u/92912507?v=4 url: https://github.com/bogdan-coman-uv - login: leonidktoto count: 2 avatarUrl: https://avatars.githubusercontent.com/u/159561986?v=4 url: https://github.com/leonidktoto - login: DJoepie count: 2 avatarUrl: https://avatars.githubusercontent.com/u/78362619?u=fe6e8d05f94d8d4c0679a4da943955a686f96177&v=4 url: https://github.com/DJoepie - login: binbjz count: 2 avatarUrl: https://avatars.githubusercontent.com/u/8213913?u=22b68b7a0d5bf5e09c02084c0f5f53d7503114cd&v=4 url: https://github.com/binbjz - login: JonnyBootsNpants count: 2 avatarUrl: https://avatars.githubusercontent.com/u/155071540?u=2d3a72b74a2c4c8eaacdb625c7ac850369579352&v=4 url: https://github.com/JonnyBootsNpants - login: TarasKuzyo count: 2 avatarUrl: https://avatars.githubusercontent.com/u/7178184?v=4 url: https://github.com/TarasKuzyo - login: msehnout count: 2 avatarUrl: https://avatars.githubusercontent.com/u/9369632?u=8c988f1b008a3f601385a3616f9327820f66e3a5&v=4 url: https://github.com/msehnout - login: rafalkrupinski count: 2 avatarUrl: https://avatars.githubusercontent.com/u/3732079?u=929e95d40d524301cb481da05208a25ed059400d&v=4 url: https://github.com/rafalkrupinski - login: morian count: 2 avatarUrl: https://avatars.githubusercontent.com/u/1735308?u=8ef15491399b040bd95e2675bb8c8f2462e977b0&v=4 url: https://github.com/morian - login: garg10may count: 2 avatarUrl: https://avatars.githubusercontent.com/u/8787120?u=7028d2b3a2a26534c1806eb76c7425a3fac9732f&v=4 url: https://github.com/garg10may six_months_experts: - login: Kludex count: 108 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: jgould22 count: 67 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 - login: YuriiMotov count: 43 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov - login: JavierSanchezCastro count: 35 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro - login: n8sty count: 21 avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 url: https://github.com/n8sty - login: hasansezertasan count: 20 avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 url: https://github.com/hasansezertasan - login: WilliamStam count: 9 avatarUrl: https://avatars.githubusercontent.com/u/182800?v=4 url: https://github.com/WilliamStam - login: pythonweb2 count: 6 avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4 url: https://github.com/pythonweb2 - login: dolfinus count: 6 avatarUrl: https://avatars.githubusercontent.com/u/4661021?u=a51b39001a2e5e7529b45826980becf786de2327&v=4 url: https://github.com/dolfinus - login: aanchlia count: 6 avatarUrl: https://avatars.githubusercontent.com/u/2835374?u=3c3ed29aa8b09ccaf8d66def0ce82bc2f7e5aab6&v=4 url: https://github.com/aanchlia - login: Ventura94 count: 6 avatarUrl: https://avatars.githubusercontent.com/u/43103937?u=ccb837005aaf212a449c374618c4339089e2f733&v=4 url: https://github.com/Ventura94 - login: White-Mask count: 6 avatarUrl: https://avatars.githubusercontent.com/u/31826970?u=8625355dc25ddf9c85a8b2b0b9932826c4c8f44c&v=4 url: https://github.com/White-Mask - login: nymous count: 5 avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4 url: https://github.com/nymous - login: shashstormer count: 5 avatarUrl: https://avatars.githubusercontent.com/u/90090313?v=4 url: https://github.com/shashstormer - login: GodMoonGoodman count: 4 avatarUrl: https://avatars.githubusercontent.com/u/29688727?u=7b251da620d999644c37c1feeb292d033eed7ad6&v=4 url: https://github.com/GodMoonGoodman - login: JoshYuJump count: 4 avatarUrl: https://avatars.githubusercontent.com/u/5901894?u=cdbca6296ac4cdcdf6945c112a1ce8d5342839ea&v=4 url: https://github.com/JoshYuJump - login: flo-at count: 4 avatarUrl: https://avatars.githubusercontent.com/u/564288?v=4 url: https://github.com/flo-at - login: estebanx64 count: 4 avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 url: https://github.com/estebanx64 - login: omarcruzpantoja count: 3 avatarUrl: https://avatars.githubusercontent.com/u/15116058?u=4b64c643fad49225d854e1aaecd1ffc6f9071a1b&v=4 url: https://github.com/omarcruzpantoja - login: fmelihh count: 3 avatarUrl: https://avatars.githubusercontent.com/u/99879453?u=f76c4460556e41a59eb624acd0cf6e342d660700&v=4 url: https://github.com/fmelihh - login: ahmedabdou14 count: 3 avatarUrl: https://avatars.githubusercontent.com/u/104530599?u=05365b155a1ff911532e8be316acfad2e0736f98&v=4 url: https://github.com/ahmedabdou14 - login: chrisK824 count: 3 avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4 url: https://github.com/chrisK824 - login: ebottos94 count: 3 avatarUrl: https://avatars.githubusercontent.com/u/100039558?u=e2c672da5a7977fd24d87ce6ab35f8bf5b1ed9fa&v=4 url: https://github.com/ebottos94 - login: binbjz count: 3 avatarUrl: https://avatars.githubusercontent.com/u/8213913?u=22b68b7a0d5bf5e09c02084c0f5f53d7503114cd&v=4 url: https://github.com/binbjz - login: theobouwman count: 3 avatarUrl: https://avatars.githubusercontent.com/u/16098190?u=dc70db88a7a99b764c9a89a6e471e0b7ca478a35&v=4 url: https://github.com/theobouwman - login: sriram-kondakindi count: 3 avatarUrl: https://avatars.githubusercontent.com/u/32274323?v=4 url: https://github.com/sriram-kondakindi - login: yinziyan1206 count: 3 avatarUrl: https://avatars.githubusercontent.com/u/37829370?u=da44ca53aefd5c23f346fab8e9fd2e108294c179&v=4 url: https://github.com/yinziyan1206 - login: pcorvoh count: 3 avatarUrl: https://avatars.githubusercontent.com/u/48502122?u=89fe3e55f3cfd15d34ffac239b32af358cca6481&v=4 url: https://github.com/pcorvoh - login: osangu count: 2 avatarUrl: https://avatars.githubusercontent.com/u/80697064?u=de9bae685e2228bffd4e202274e1df1afaf54a0d&v=4 url: https://github.com/osangu - login: PhysicallyActive count: 2 avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 url: https://github.com/PhysicallyActive - login: richin13 count: 2 avatarUrl: https://avatars.githubusercontent.com/u/8370058?u=8e37a4cdbc78983a5f4b4847f6d1879fb39c851c&v=4 url: https://github.com/richin13 - login: amacfie count: 2 avatarUrl: https://avatars.githubusercontent.com/u/889657?u=d70187989940b085bcbfa3bedad8dbc5f3ab1fe7&v=4 url: https://github.com/amacfie - login: WSH032 count: 2 avatarUrl: https://avatars.githubusercontent.com/u/126865849?v=4 url: https://github.com/WSH032 - login: MRigal count: 2 avatarUrl: https://avatars.githubusercontent.com/u/2190327?u=557f399ee90319da7bc4a7d9274e110836b0bd60&v=4 url: https://github.com/MRigal - login: VatsalJagani count: 2 avatarUrl: https://avatars.githubusercontent.com/u/20964366?u=43552644be05c9107c029e26d5ab3be5a1920f45&v=4 url: https://github.com/VatsalJagani - login: nameer count: 2 avatarUrl: https://avatars.githubusercontent.com/u/3931725?u=6199fb065df098fc13ac0a5e649f89672b586732&v=4 url: https://github.com/nameer - login: kiraware count: 2 avatarUrl: https://avatars.githubusercontent.com/u/117554978?v=4 url: https://github.com/kiraware - login: iudeen count: 2 avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=2843b3303282bff8b212dcd4d9d6689452e4470c&v=4 url: https://github.com/iudeen - login: khaledadrani count: 2 avatarUrl: https://avatars.githubusercontent.com/u/45245894?u=49ed5056426a149a5af29d385d8bd3847101d3a4&v=4 url: https://github.com/khaledadrani - login: acidjunk count: 2 avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 url: https://github.com/acidjunk - login: yavuzakyazici count: 2 avatarUrl: https://avatars.githubusercontent.com/u/148442912?u=1d2d150172c53daf82020b950c6483a6c6a77b7e&v=4 url: https://github.com/yavuzakyazici - login: AntonioBarral count: 2 avatarUrl: https://avatars.githubusercontent.com/u/22151181?u=64416447a37a420e6dfd16e675cf74f66c9f204d&v=4 url: https://github.com/AntonioBarral - login: agn-7 count: 2 avatarUrl: https://avatars.githubusercontent.com/u/14202344?u=a1d05998ceaf4d06d1063575a7c4ef6e7ae5890e&v=4 url: https://github.com/agn-7 - login: ThirVondukr count: 2 avatarUrl: https://avatars.githubusercontent.com/u/50728601?u=167c0bd655e52817082e50979a86d2f98f95b1a3&v=4 url: https://github.com/ThirVondukr - login: hussein-awala count: 2 avatarUrl: https://avatars.githubusercontent.com/u/21311487?u=cbbc60943d3fedfb869e49b604020a821f589659&v=4 url: https://github.com/hussein-awala - login: jcphlux count: 2 avatarUrl: https://avatars.githubusercontent.com/u/996689?v=4 url: https://github.com/jcphlux - login: bhumkong count: 2 avatarUrl: https://avatars.githubusercontent.com/u/13270137?u=1490432e6a0184fbc3d5c8d1b5df553ca92e7e5b&v=4 url: https://github.com/bhumkong - login: falkben count: 2 avatarUrl: https://avatars.githubusercontent.com/u/653031?u=ad9838e089058c9e5a0bab94c0eec7cc181e0cd0&v=4 url: https://github.com/falkben - login: mielvds count: 2 avatarUrl: https://avatars.githubusercontent.com/u/1032980?u=722c96b0a234752df23f04df150ef36441ceb43c&v=4 url: https://github.com/mielvds one_year_experts: - login: Kludex count: 218 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: jgould22 count: 133 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 - login: JavierSanchezCastro count: 55 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro - login: YuriiMotov count: 43 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov - login: n8sty count: 37 avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 url: https://github.com/n8sty - login: chrisK824 count: 22 avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4 url: https://github.com/chrisK824 - login: hasansezertasan count: 20 avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 url: https://github.com/hasansezertasan - login: nymous count: 13 avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4 url: https://github.com/nymous - login: ahmedabdou14 count: 13 avatarUrl: https://avatars.githubusercontent.com/u/104530599?u=05365b155a1ff911532e8be316acfad2e0736f98&v=4 url: https://github.com/ahmedabdou14 - login: abhint count: 12 avatarUrl: https://avatars.githubusercontent.com/u/25699289?u=b5d219277b4d001ac26fb8be357fddd88c29d51b&v=4 url: https://github.com/abhint - login: arjwilliams count: 12 avatarUrl: https://avatars.githubusercontent.com/u/22227620?v=4 url: https://github.com/arjwilliams - login: iudeen count: 11 avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=2843b3303282bff8b212dcd4d9d6689452e4470c&v=4 url: https://github.com/iudeen - login: WilliamStam count: 10 avatarUrl: https://avatars.githubusercontent.com/u/182800?v=4 url: https://github.com/WilliamStam - login: yinziyan1206 count: 9 avatarUrl: https://avatars.githubusercontent.com/u/37829370?u=da44ca53aefd5c23f346fab8e9fd2e108294c179&v=4 url: https://github.com/yinziyan1206 - login: mateoradman count: 7 avatarUrl: https://avatars.githubusercontent.com/u/48420316?u=066f36b8e8e263b0d90798113b0f291d3266db7c&v=4 url: https://github.com/mateoradman - login: Viicos count: 7 avatarUrl: https://avatars.githubusercontent.com/u/65306057?u=fcd677dc1b9bef12aa103613e5ccb3f8ce305af9&v=4 url: https://github.com/Viicos - login: pythonweb2 count: 6 avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4 url: https://github.com/pythonweb2 - login: ebottos94 count: 6 avatarUrl: https://avatars.githubusercontent.com/u/100039558?u=e2c672da5a7977fd24d87ce6ab35f8bf5b1ed9fa&v=4 url: https://github.com/ebottos94 - login: dolfinus count: 6 avatarUrl: https://avatars.githubusercontent.com/u/4661021?u=a51b39001a2e5e7529b45826980becf786de2327&v=4 url: https://github.com/dolfinus - login: aanchlia count: 6 avatarUrl: https://avatars.githubusercontent.com/u/2835374?u=3c3ed29aa8b09ccaf8d66def0ce82bc2f7e5aab6&v=4 url: https://github.com/aanchlia - login: romabozhanovgithub count: 6 avatarUrl: https://avatars.githubusercontent.com/u/67696229?u=e4b921eef096415300425aca249348f8abb78ad7&v=4 url: https://github.com/romabozhanovgithub - login: Ventura94 count: 6 avatarUrl: https://avatars.githubusercontent.com/u/43103937?u=ccb837005aaf212a449c374618c4339089e2f733&v=4 url: https://github.com/Ventura94 - login: White-Mask count: 6 avatarUrl: https://avatars.githubusercontent.com/u/31826970?u=8625355dc25ddf9c85a8b2b0b9932826c4c8f44c&v=4 url: https://github.com/White-Mask - login: mikeedjones count: 6 avatarUrl: https://avatars.githubusercontent.com/u/4087139?u=cc4a242896ac2fcf88a53acfaf190d0fe0a1f0c9&v=4 url: https://github.com/mikeedjones - login: ThirVondukr count: 5 avatarUrl: https://avatars.githubusercontent.com/u/50728601?u=167c0bd655e52817082e50979a86d2f98f95b1a3&v=4 url: https://github.com/ThirVondukr - login: dmontagu count: 5 avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=540f30c937a6450812628b9592a1dfe91bbe148e&v=4 url: https://github.com/dmontagu - login: alex-pobeditel-2004 count: 5 avatarUrl: https://avatars.githubusercontent.com/u/14791483?v=4 url: https://github.com/alex-pobeditel-2004 - login: shashstormer count: 5 avatarUrl: https://avatars.githubusercontent.com/u/90090313?v=4 url: https://github.com/shashstormer - login: nzig count: 5 avatarUrl: https://avatars.githubusercontent.com/u/7372858?u=e769add36ed73c778cdb136eb10bf96b1e119671&v=4 url: https://github.com/nzig - login: wu-clan count: 5 avatarUrl: https://avatars.githubusercontent.com/u/52145145?u=f8c9e5c8c259d248e1683fedf5027b4ee08a0967&v=4 url: https://github.com/wu-clan - login: 8thgencore count: 5 avatarUrl: https://avatars.githubusercontent.com/u/30128845?u=a747e840f751a1d196d70d0ecf6d07a530d412a1&v=4 url: https://github.com/8thgencore - login: anthonycepeda count: 4 avatarUrl: https://avatars.githubusercontent.com/u/72019805?u=60bdf46240cff8fca482ff0fc07d963fd5e1a27c&v=4 url: https://github.com/anthonycepeda - login: acidjunk count: 4 avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 url: https://github.com/acidjunk - login: GodMoonGoodman count: 4 avatarUrl: https://avatars.githubusercontent.com/u/29688727?u=7b251da620d999644c37c1feeb292d033eed7ad6&v=4 url: https://github.com/GodMoonGoodman - login: JoshYuJump count: 4 avatarUrl: https://avatars.githubusercontent.com/u/5901894?u=cdbca6296ac4cdcdf6945c112a1ce8d5342839ea&v=4 url: https://github.com/JoshYuJump - login: flo-at count: 4 avatarUrl: https://avatars.githubusercontent.com/u/564288?v=4 url: https://github.com/flo-at - login: commonism count: 4 avatarUrl: https://avatars.githubusercontent.com/u/164513?v=4 url: https://github.com/commonism - login: estebanx64 count: 4 avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 url: https://github.com/estebanx64 - login: djimontyp count: 4 avatarUrl: https://avatars.githubusercontent.com/u/53098395?u=583bade70950b277c322d35f1be2b75c7b0f189c&v=4 url: https://github.com/djimontyp - login: sanzoghenzo count: 4 avatarUrl: https://avatars.githubusercontent.com/u/977953?u=d94445b7b87b7096a92a2d4b652ca6c560f34039&v=4 url: https://github.com/sanzoghenzo - login: adriangb count: 4 avatarUrl: https://avatars.githubusercontent.com/u/1755071?u=612704256e38d6ac9cbed24f10e4b6ac2da74ecb&v=4 url: https://github.com/adriangb - login: 9en9i count: 4 avatarUrl: https://avatars.githubusercontent.com/u/44907258?u=297d0f31ea99c22b718118c1deec82001690cadb&v=4 url: https://github.com/9en9i - login: mht2953658596 count: 3 avatarUrl: https://avatars.githubusercontent.com/u/59814105?v=4 url: https://github.com/mht2953658596 - login: omarcruzpantoja count: 3 avatarUrl: https://avatars.githubusercontent.com/u/15116058?u=4b64c643fad49225d854e1aaecd1ffc6f9071a1b&v=4 url: https://github.com/omarcruzpantoja - login: fmelihh count: 3 avatarUrl: https://avatars.githubusercontent.com/u/99879453?u=f76c4460556e41a59eb624acd0cf6e342d660700&v=4 url: https://github.com/fmelihh - login: amacfie count: 3 avatarUrl: https://avatars.githubusercontent.com/u/889657?u=d70187989940b085bcbfa3bedad8dbc5f3ab1fe7&v=4 url: https://github.com/amacfie - login: nameer count: 3 avatarUrl: https://avatars.githubusercontent.com/u/3931725?u=6199fb065df098fc13ac0a5e649f89672b586732&v=4 url: https://github.com/nameer - login: hhartzer count: 3 avatarUrl: https://avatars.githubusercontent.com/u/100533792?v=4 url: https://github.com/hhartzer - login: binbjz count: 3 avatarUrl: https://avatars.githubusercontent.com/u/8213913?u=22b68b7a0d5bf5e09c02084c0f5f53d7503114cd&v=4 url: https://github.com/binbjz top_contributors: - login: nilslindemann count: 127 avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4 url: https://github.com/nilslindemann - login: jaystone776 count: 49 avatarUrl: https://avatars.githubusercontent.com/u/11191137?u=299205a95e9b6817a43144a48b643346a5aac5cc&v=4 url: https://github.com/jaystone776 - login: waynerv count: 25 avatarUrl: https://avatars.githubusercontent.com/u/39515546?u=ec35139777597cdbbbddda29bf8b9d4396b429a9&v=4 url: https://github.com/waynerv - login: tokusumi count: 24 avatarUrl: https://avatars.githubusercontent.com/u/41147016?u=55010621aece725aa702270b54fed829b6a1fe60&v=4 url: https://github.com/tokusumi - login: Kludex count: 22 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: SwftAlpc count: 21 avatarUrl: https://avatars.githubusercontent.com/u/52768429?u=6a3aa15277406520ad37f6236e89466ed44bc5b8&v=4 url: https://github.com/SwftAlpc - login: dmontagu count: 17 avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=540f30c937a6450812628b9592a1dfe91bbe148e&v=4 url: https://github.com/dmontagu - login: Xewus count: 14 avatarUrl: https://avatars.githubusercontent.com/u/85196001?u=f8e2dc7e5104f109cef944af79050ea8d1b8f914&v=4 url: https://github.com/Xewus - login: euri10 count: 13 avatarUrl: https://avatars.githubusercontent.com/u/1104190?u=321a2e953e6645a7d09b732786c7a8061e0f8a8b&v=4 url: https://github.com/euri10 - login: mariacamilagl count: 12 avatarUrl: https://avatars.githubusercontent.com/u/11489395?u=4adb6986bf3debfc2b8216ae701f2bd47d73da7d&v=4 url: https://github.com/mariacamilagl - login: hasansezertasan count: 12 avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 url: https://github.com/hasansezertasan - login: Smlep count: 11 avatarUrl: https://avatars.githubusercontent.com/u/16785985?v=4 url: https://github.com/Smlep - login: AlertRED count: 11 avatarUrl: https://avatars.githubusercontent.com/u/15695000?u=f5a4944c6df443030409c88da7d7fa0b7ead985c&v=4 url: https://github.com/AlertRED - login: hard-coders count: 10 avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4 url: https://github.com/hard-coders - login: alejsdev count: 10 avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=1ee3a9fbef27abc9448ef5951350f99c7d76f7af&v=4 url: https://github.com/alejsdev - login: KaniKim count: 10 avatarUrl: https://avatars.githubusercontent.com/u/19832624?u=d8ff6fca8542d22f94388cd2c4292e76e3898584&v=4 url: https://github.com/KaniKim - login: xzmeng count: 9 avatarUrl: https://avatars.githubusercontent.com/u/40202897?v=4 url: https://github.com/xzmeng - login: Serrones count: 8 avatarUrl: https://avatars.githubusercontent.com/u/22691749?u=4795b880e13ca33a73e52fc0ef7dc9c60c8fce47&v=4 url: https://github.com/Serrones - login: rjNemo count: 8 avatarUrl: https://avatars.githubusercontent.com/u/56785022?u=d5c3a02567c8649e146fcfc51b6060ccaf8adef8&v=4 url: https://github.com/rjNemo - login: pablocm83 count: 8 avatarUrl: https://avatars.githubusercontent.com/u/28315068?u=3310fbb05bb8bfc50d2c48b6cb64ac9ee4a14549&v=4 url: https://github.com/pablocm83 - login: RunningIkkyu count: 7 avatarUrl: https://avatars.githubusercontent.com/u/31848542?u=494ecc298e3f26197495bb357ad0f57cfd5f7a32&v=4 url: https://github.com/RunningIkkyu - login: Alexandrhub count: 7 avatarUrl: https://avatars.githubusercontent.com/u/119126536?u=9fc0d48f3307817bafecc5861eb2168401a6cb04&v=4 url: https://github.com/Alexandrhub - login: NinaHwang count: 6 avatarUrl: https://avatars.githubusercontent.com/u/79563565?u=eee6bfe9224c71193025ab7477f4f96ceaa05c62&v=4 url: https://github.com/NinaHwang - login: batlopes count: 6 avatarUrl: https://avatars.githubusercontent.com/u/33462923?u=0fb3d7acb316764616f11e4947faf080e49ad8d9&v=4 url: https://github.com/batlopes - login: wshayes count: 5 avatarUrl: https://avatars.githubusercontent.com/u/365303?u=07ca03c5ee811eb0920e633cc3c3db73dbec1aa5&v=4 url: https://github.com/wshayes - login: samuelcolvin count: 5 avatarUrl: https://avatars.githubusercontent.com/u/4039449?u=42eb3b833047c8c4b4f647a031eaef148c16d93f&v=4 url: https://github.com/samuelcolvin - login: Attsun1031 count: 5 avatarUrl: https://avatars.githubusercontent.com/u/1175560?v=4 url: https://github.com/Attsun1031 - login: ComicShrimp count: 5 avatarUrl: https://avatars.githubusercontent.com/u/43503750?u=f440bc9062afb3c43b9b9c6cdfdcfe31d58699ef&v=4 url: https://github.com/ComicShrimp - login: rostik1410 count: 5 avatarUrl: https://avatars.githubusercontent.com/u/11443899?u=e26a635c2ba220467b308a326a579b8ccf4a8701&v=4 url: https://github.com/rostik1410 - login: tamtam-fitness count: 5 avatarUrl: https://avatars.githubusercontent.com/u/62091034?u=8da19a6bd3d02f5d6ba30c7247d5b46c98dd1403&v=4 url: https://github.com/tamtam-fitness - login: jekirl count: 4 avatarUrl: https://avatars.githubusercontent.com/u/2546697?u=a027452387d85bd4a14834e19d716c99255fb3b7&v=4 url: https://github.com/jekirl - login: jfunez count: 4 avatarUrl: https://avatars.githubusercontent.com/u/805749?v=4 url: https://github.com/jfunez - login: ycd count: 4 avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=45aa6ef58220a3f1e8a3c3cd5f1b75a1a0a73347&v=4 url: https://github.com/ycd - login: komtaki count: 4 avatarUrl: https://avatars.githubusercontent.com/u/39375566?u=260ad6b1a4b34c07dbfa728da5e586f16f6d1824&v=4 url: https://github.com/komtaki - login: hitrust count: 4 avatarUrl: https://avatars.githubusercontent.com/u/3360631?u=5fa1f475ad784d64eb9666bdd43cc4d285dcc773&v=4 url: https://github.com/hitrust - login: JulianMaurin count: 4 avatarUrl: https://avatars.githubusercontent.com/u/63545168?u=b7d15ac865268cbefc2d739e2f23d9aeeac1a622&v=4 url: https://github.com/JulianMaurin - login: lsglucas count: 4 avatarUrl: https://avatars.githubusercontent.com/u/61513630?u=320e43fe4dc7bc6efc64e9b8f325f8075634fd20&v=4 url: https://github.com/lsglucas - login: BilalAlpaslan count: 4 avatarUrl: https://avatars.githubusercontent.com/u/47563997?u=63ed66e304fe8d765762c70587d61d9196e5c82d&v=4 url: https://github.com/BilalAlpaslan - login: adriangb count: 4 avatarUrl: https://avatars.githubusercontent.com/u/1755071?u=612704256e38d6ac9cbed24f10e4b6ac2da74ecb&v=4 url: https://github.com/adriangb - login: iudeen count: 4 avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=2843b3303282bff8b212dcd4d9d6689452e4470c&v=4 url: https://github.com/iudeen - login: axel584 count: 4 avatarUrl: https://avatars.githubusercontent.com/u/1334088?u=9667041f5b15dc002b6f9665fda8c0412933ac04&v=4 url: https://github.com/axel584 - login: ivan-abc count: 4 avatarUrl: https://avatars.githubusercontent.com/u/36765187?u=c6e0ba571c1ccb6db9d94e62e4b8b5eda811a870&v=4 url: https://github.com/ivan-abc - login: divums count: 3 avatarUrl: https://avatars.githubusercontent.com/u/1397556?v=4 url: https://github.com/divums - login: prostomarkeloff count: 3 avatarUrl: https://avatars.githubusercontent.com/u/28061158?u=72309cc1f2e04e40fa38b29969cb4e9d3f722e7b&v=4 url: https://github.com/prostomarkeloff - login: nsidnev count: 3 avatarUrl: https://avatars.githubusercontent.com/u/22559461?u=a9cc3238217e21dc8796a1a500f01b722adb082c&v=4 url: https://github.com/nsidnev - login: pawamoy count: 3 avatarUrl: https://avatars.githubusercontent.com/u/3999221?u=b030e4c89df2f3a36bc4710b925bdeb6745c9856&v=4 url: https://github.com/pawamoy top_reviewers: - login: Kludex count: 156 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: BilalAlpaslan count: 86 avatarUrl: https://avatars.githubusercontent.com/u/47563997?u=63ed66e304fe8d765762c70587d61d9196e5c82d&v=4 url: https://github.com/BilalAlpaslan - login: yezz123 count: 84 avatarUrl: https://avatars.githubusercontent.com/u/52716203?u=d7062cbc6eb7671d5dc9cc0e32a24ae335e0f225&v=4 url: https://github.com/yezz123 - login: iudeen count: 55 avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=2843b3303282bff8b212dcd4d9d6689452e4470c&v=4 url: https://github.com/iudeen - login: tokusumi count: 51 avatarUrl: https://avatars.githubusercontent.com/u/41147016?u=55010621aece725aa702270b54fed829b6a1fe60&v=4 url: https://github.com/tokusumi - login: Xewus count: 50 avatarUrl: https://avatars.githubusercontent.com/u/85196001?u=f8e2dc7e5104f109cef944af79050ea8d1b8f914&v=4 url: https://github.com/Xewus - login: waynerv count: 47 avatarUrl: https://avatars.githubusercontent.com/u/39515546?u=ec35139777597cdbbbddda29bf8b9d4396b429a9&v=4 url: https://github.com/waynerv - login: Laineyzhang55 count: 47 avatarUrl: https://avatars.githubusercontent.com/u/59285379?v=4 url: https://github.com/Laineyzhang55 - login: ycd count: 45 avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=45aa6ef58220a3f1e8a3c3cd5f1b75a1a0a73347&v=4 url: https://github.com/ycd - login: cikay count: 41 avatarUrl: https://avatars.githubusercontent.com/u/24587499?u=e772190a051ab0eaa9c8542fcff1892471638f2b&v=4 url: https://github.com/cikay - login: hasansezertasan count: 41 avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 url: https://github.com/hasansezertasan - login: alejsdev count: 37 avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=1ee3a9fbef27abc9448ef5951350f99c7d76f7af&v=4 url: https://github.com/alejsdev - login: JarroVGIT count: 34 avatarUrl: https://avatars.githubusercontent.com/u/13659033?u=e8bea32d07a5ef72f7dde3b2079ceb714923ca05&v=4 url: https://github.com/JarroVGIT - login: AdrianDeAnda count: 33 avatarUrl: https://avatars.githubusercontent.com/u/1024932?u=b2ea249c6b41ddf98679c8d110d0f67d4a3ebf93&v=4 url: https://github.com/AdrianDeAnda - login: ArcLightSlavik count: 31 avatarUrl: https://avatars.githubusercontent.com/u/31127044?u=b0f2c37142f4b762e41ad65dc49581813422bd71&v=4 url: https://github.com/ArcLightSlavik - login: cassiobotaro count: 28 avatarUrl: https://avatars.githubusercontent.com/u/3127847?u=a08022b191ddbd0a6159b2981d9d878b6d5bb71f&v=4 url: https://github.com/cassiobotaro - login: lsglucas count: 27 avatarUrl: https://avatars.githubusercontent.com/u/61513630?u=320e43fe4dc7bc6efc64e9b8f325f8075634fd20&v=4 url: https://github.com/lsglucas - login: komtaki count: 27 avatarUrl: https://avatars.githubusercontent.com/u/39375566?u=260ad6b1a4b34c07dbfa728da5e586f16f6d1824&v=4 url: https://github.com/komtaki - login: Ryandaydev count: 25 avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=48f68868db8886fce31a1d802c1003914c6cd7c6&v=4 url: https://github.com/Ryandaydev - login: LorhanSohaky count: 24 avatarUrl: https://avatars.githubusercontent.com/u/16273730?u=095b66f243a2cd6a0aadba9a095009f8aaf18393&v=4 url: https://github.com/LorhanSohaky - login: YuriiMotov count: 24 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov - login: dmontagu count: 23 avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=540f30c937a6450812628b9592a1dfe91bbe148e&v=4 url: https://github.com/dmontagu - login: nilslindemann count: 23 avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4 url: https://github.com/nilslindemann - login: hard-coders count: 23 avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4 url: https://github.com/hard-coders - login: rjNemo count: 21 avatarUrl: https://avatars.githubusercontent.com/u/56785022?u=d5c3a02567c8649e146fcfc51b6060ccaf8adef8&v=4 url: https://github.com/rjNemo - login: odiseo0 count: 20 avatarUrl: https://avatars.githubusercontent.com/u/87550035?u=241a71f6b7068738b81af3e57f45ffd723538401&v=4 url: https://github.com/odiseo0 - login: 0417taehyun count: 19 avatarUrl: https://avatars.githubusercontent.com/u/63915557?u=47debaa860fd52c9b98c97ef357ddcec3b3fb399&v=4 url: https://github.com/0417taehyun - login: Smlep count: 17 avatarUrl: https://avatars.githubusercontent.com/u/16785985?v=4 url: https://github.com/Smlep - login: zy7y count: 17 avatarUrl: https://avatars.githubusercontent.com/u/67154681?u=5d634834cc514028ea3f9115f7030b99a1f4d5a4&v=4 url: https://github.com/zy7y - login: peidrao count: 17 avatarUrl: https://avatars.githubusercontent.com/u/32584628?u=a66902b40c13647d0ed0e573d598128240a4dd04&v=4 url: https://github.com/peidrao - login: yanever count: 16 avatarUrl: https://avatars.githubusercontent.com/u/21978760?v=4 url: https://github.com/yanever - login: SwftAlpc count: 16 avatarUrl: https://avatars.githubusercontent.com/u/52768429?u=6a3aa15277406520ad37f6236e89466ed44bc5b8&v=4 url: https://github.com/SwftAlpc - login: axel584 count: 16 avatarUrl: https://avatars.githubusercontent.com/u/1334088?u=9667041f5b15dc002b6f9665fda8c0412933ac04&v=4 url: https://github.com/axel584 - login: Alexandrhub count: 16 avatarUrl: https://avatars.githubusercontent.com/u/119126536?u=9fc0d48f3307817bafecc5861eb2168401a6cb04&v=4 url: https://github.com/Alexandrhub - login: DevDae count: 16 avatarUrl: https://avatars.githubusercontent.com/u/87962045?u=08e10fa516e844934f4b3fc7c38b33c61697e4a1&v=4 url: https://github.com/DevDae - login: pedabraham count: 15 avatarUrl: https://avatars.githubusercontent.com/u/16860088?u=abf922a7b920bf8fdb7867d8b43e091f1e796178&v=4 url: https://github.com/pedabraham - login: delhi09 count: 15 avatarUrl: https://avatars.githubusercontent.com/u/63476957?u=6c86e59b48e0394d4db230f37fc9ad4d7e2c27c7&v=4 url: https://github.com/delhi09 - login: Aruelius count: 14 avatarUrl: https://avatars.githubusercontent.com/u/25380989?u=574f8cfcda3ea77a3f81884f6b26a97068e36a9d&v=4 url: https://github.com/Aruelius - login: sh0nk count: 13 avatarUrl: https://avatars.githubusercontent.com/u/6478810?u=af15d724875cec682ed8088a86d36b2798f981c0&v=4 url: https://github.com/sh0nk - login: junah201 count: 13 avatarUrl: https://avatars.githubusercontent.com/u/75025529?u=2451c256e888fa2a06bcfc0646d09b87ddb6a945&v=4 url: https://github.com/junah201 - login: wdh99 count: 13 avatarUrl: https://avatars.githubusercontent.com/u/108172295?u=8a8fb95d5afe3e0fa33257b2aecae88d436249eb&v=4 url: https://github.com/wdh99 - login: r0b2g1t count: 13 avatarUrl: https://avatars.githubusercontent.com/u/5357541?u=6428442d875d5d71aaa1bb38bb11c4be1a526bc2&v=4 url: https://github.com/r0b2g1t - login: JavierSanchezCastro count: 13 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro - login: RunningIkkyu count: 12 avatarUrl: https://avatars.githubusercontent.com/u/31848542?u=494ecc298e3f26197495bb357ad0f57cfd5f7a32&v=4 url: https://github.com/RunningIkkyu - login: ivan-abc count: 12 avatarUrl: https://avatars.githubusercontent.com/u/36765187?u=c6e0ba571c1ccb6db9d94e62e4b8b5eda811a870&v=4 url: https://github.com/ivan-abc - login: AlertRED count: 12 avatarUrl: https://avatars.githubusercontent.com/u/15695000?u=f5a4944c6df443030409c88da7d7fa0b7ead985c&v=4 url: https://github.com/AlertRED - login: solomein-sv count: 11 avatarUrl: https://avatars.githubusercontent.com/u/46193920?u=789927ee09cfabd752d3bd554fa6baf4850d2777&v=4 url: https://github.com/solomein-sv - login: dpinezich count: 11 avatarUrl: https://avatars.githubusercontent.com/u/3204540?u=a2e1465e3ee10d537614d513589607eddefde09f&v=4 url: https://github.com/dpinezich - login: mariacamilagl count: 10 avatarUrl: https://avatars.githubusercontent.com/u/11489395?u=4adb6986bf3debfc2b8216ae701f2bd47d73da7d&v=4 url: https://github.com/mariacamilagl top_translations_reviewers: - login: s111d count: 143 avatarUrl: https://avatars.githubusercontent.com/u/4954856?v=4 url: https://github.com/s111d - login: Xewus count: 128 avatarUrl: https://avatars.githubusercontent.com/u/85196001?u=f8e2dc7e5104f109cef944af79050ea8d1b8f914&v=4 url: https://github.com/Xewus - login: tokusumi count: 104 avatarUrl: https://avatars.githubusercontent.com/u/41147016?u=55010621aece725aa702270b54fed829b6a1fe60&v=4 url: https://github.com/tokusumi - login: hasansezertasan count: 84 avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 url: https://github.com/hasansezertasan - login: AlertRED count: 70 avatarUrl: https://avatars.githubusercontent.com/u/15695000?u=f5a4944c6df443030409c88da7d7fa0b7ead985c&v=4 url: https://github.com/AlertRED - login: Alexandrhub count: 68 avatarUrl: https://avatars.githubusercontent.com/u/119126536?u=9fc0d48f3307817bafecc5861eb2168401a6cb04&v=4 url: https://github.com/Alexandrhub - login: waynerv count: 63 avatarUrl: https://avatars.githubusercontent.com/u/39515546?u=ec35139777597cdbbbddda29bf8b9d4396b429a9&v=4 url: https://github.com/waynerv - login: hard-coders count: 53 avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4 url: https://github.com/hard-coders - login: Laineyzhang55 count: 48 avatarUrl: https://avatars.githubusercontent.com/u/59285379?v=4 url: https://github.com/Laineyzhang55 - login: Kludex count: 46 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: komtaki count: 45 avatarUrl: https://avatars.githubusercontent.com/u/39375566?u=260ad6b1a4b34c07dbfa728da5e586f16f6d1824&v=4 url: https://github.com/komtaki - login: Winand count: 40 avatarUrl: https://avatars.githubusercontent.com/u/53390?u=bb0e71a2fc3910a8e0ee66da67c33de40ea695f8&v=4 url: https://github.com/Winand - login: solomein-sv count: 38 avatarUrl: https://avatars.githubusercontent.com/u/46193920?u=789927ee09cfabd752d3bd554fa6baf4850d2777&v=4 url: https://github.com/solomein-sv - login: alperiox count: 37 avatarUrl: https://avatars.githubusercontent.com/u/34214152?u=2c5acad3461d4dbc2d48371ba86cac56ae9b25cc&v=4 url: https://github.com/alperiox - login: lsglucas count: 36 avatarUrl: https://avatars.githubusercontent.com/u/61513630?u=320e43fe4dc7bc6efc64e9b8f325f8075634fd20&v=4 url: https://github.com/lsglucas - login: SwftAlpc count: 36 avatarUrl: https://avatars.githubusercontent.com/u/52768429?u=6a3aa15277406520ad37f6236e89466ed44bc5b8&v=4 url: https://github.com/SwftAlpc - login: nilslindemann count: 35 avatarUrl: https://avatars.githubusercontent.com/u/6892179?u=1dca6a22195d6cd1ab20737c0e19a4c55d639472&v=4 url: https://github.com/nilslindemann - login: rjNemo count: 34 avatarUrl: https://avatars.githubusercontent.com/u/56785022?u=d5c3a02567c8649e146fcfc51b6060ccaf8adef8&v=4 url: https://github.com/rjNemo - login: akarev0 count: 33 avatarUrl: https://avatars.githubusercontent.com/u/53393089?u=6e528bb4789d56af887ce6fe237bea4010885406&v=4 url: https://github.com/akarev0 - login: romashevchenko count: 32 avatarUrl: https://avatars.githubusercontent.com/u/132477732?v=4 url: https://github.com/romashevchenko - login: LorhanSohaky count: 30 avatarUrl: https://avatars.githubusercontent.com/u/16273730?u=095b66f243a2cd6a0aadba9a095009f8aaf18393&v=4 url: https://github.com/LorhanSohaky - login: cassiobotaro count: 29 avatarUrl: https://avatars.githubusercontent.com/u/3127847?u=a08022b191ddbd0a6159b2981d9d878b6d5bb71f&v=4 url: https://github.com/cassiobotaro - login: wdh99 count: 29 avatarUrl: https://avatars.githubusercontent.com/u/108172295?u=8a8fb95d5afe3e0fa33257b2aecae88d436249eb&v=4 url: https://github.com/wdh99 - login: pedabraham count: 28 avatarUrl: https://avatars.githubusercontent.com/u/16860088?u=abf922a7b920bf8fdb7867d8b43e091f1e796178&v=4 url: https://github.com/pedabraham - login: Smlep count: 28 avatarUrl: https://avatars.githubusercontent.com/u/16785985?v=4 url: https://github.com/Smlep - login: dedkot01 count: 28 avatarUrl: https://avatars.githubusercontent.com/u/26196675?u=e2966887124e67932853df4f10f86cb526edc7b0&v=4 url: https://github.com/dedkot01 - login: dpinezich count: 28 avatarUrl: https://avatars.githubusercontent.com/u/3204540?u=a2e1465e3ee10d537614d513589607eddefde09f&v=4 url: https://github.com/dpinezich - login: maoyibo count: 27 avatarUrl: https://avatars.githubusercontent.com/u/7887703?v=4 url: https://github.com/maoyibo - login: 0417taehyun count: 27 avatarUrl: https://avatars.githubusercontent.com/u/63915557?u=47debaa860fd52c9b98c97ef357ddcec3b3fb399&v=4 url: https://github.com/0417taehyun - login: BilalAlpaslan count: 26 avatarUrl: https://avatars.githubusercontent.com/u/47563997?u=63ed66e304fe8d765762c70587d61d9196e5c82d&v=4 url: https://github.com/BilalAlpaslan - login: zy7y count: 25 avatarUrl: https://avatars.githubusercontent.com/u/67154681?u=5d634834cc514028ea3f9115f7030b99a1f4d5a4&v=4 url: https://github.com/zy7y - login: mycaule count: 25 avatarUrl: https://avatars.githubusercontent.com/u/6161385?u=e3cec75bd6d938a0d73fae0dc5534d1ab2ed1b0e&v=4 url: https://github.com/mycaule - login: sh0nk count: 23 avatarUrl: https://avatars.githubusercontent.com/u/6478810?u=af15d724875cec682ed8088a86d36b2798f981c0&v=4 url: https://github.com/sh0nk - login: axel584 count: 23 avatarUrl: https://avatars.githubusercontent.com/u/1334088?u=9667041f5b15dc002b6f9665fda8c0412933ac04&v=4 url: https://github.com/axel584 - login: AGolicyn count: 21 avatarUrl: https://avatars.githubusercontent.com/u/86262613?u=3c21606ab8d210a061a1673decff1e7d5592b380&v=4 url: https://github.com/AGolicyn - login: Attsun1031 count: 20 avatarUrl: https://avatars.githubusercontent.com/u/1175560?v=4 url: https://github.com/Attsun1031 - login: ycd count: 20 avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=45aa6ef58220a3f1e8a3c3cd5f1b75a1a0a73347&v=4 url: https://github.com/ycd - login: delhi09 count: 20 avatarUrl: https://avatars.githubusercontent.com/u/63476957?u=6c86e59b48e0394d4db230f37fc9ad4d7e2c27c7&v=4 url: https://github.com/delhi09 - login: rogerbrinkmann count: 20 avatarUrl: https://avatars.githubusercontent.com/u/5690226?v=4 url: https://github.com/rogerbrinkmann - login: DevDae count: 20 avatarUrl: https://avatars.githubusercontent.com/u/87962045?u=08e10fa516e844934f4b3fc7c38b33c61697e4a1&v=4 url: https://github.com/DevDae - login: sattosan count: 19 avatarUrl: https://avatars.githubusercontent.com/u/20574756?u=b0d8474d2938189c6954423ae8d81d91013f80a8&v=4 url: https://github.com/sattosan - login: ComicShrimp count: 18 avatarUrl: https://avatars.githubusercontent.com/u/43503750?u=f440bc9062afb3c43b9b9c6cdfdcfe31d58699ef&v=4 url: https://github.com/ComicShrimp - login: simatheone count: 18 avatarUrl: https://avatars.githubusercontent.com/u/78508673?u=1b9658d9ee0bde33f56130dd52275493ddd38690&v=4 url: https://github.com/simatheone - login: ivan-abc count: 18 avatarUrl: https://avatars.githubusercontent.com/u/36765187?u=c6e0ba571c1ccb6db9d94e62e4b8b5eda811a870&v=4 url: https://github.com/ivan-abc - login: bezaca count: 17 avatarUrl: https://avatars.githubusercontent.com/u/69092910?u=4ac58eab99bd37d663f3d23551df96d4fbdbf760&v=4 url: https://github.com/bezaca - login: lbmendes count: 17 avatarUrl: https://avatars.githubusercontent.com/u/80999926?u=646619e2f07ac5a7c3f65fe7834197461a4fff9f&v=4 url: https://github.com/lbmendes - login: rostik1410 count: 17 avatarUrl: https://avatars.githubusercontent.com/u/11443899?u=e26a635c2ba220467b308a326a579b8ccf4a8701&v=4 url: https://github.com/rostik1410 - login: spacesphere count: 17 avatarUrl: https://avatars.githubusercontent.com/u/34628304?u=cde91f6002dd33156e1bf8005f11a7a3ed76b790&v=4 url: https://github.com/spacesphere - login: panko count: 17 avatarUrl: https://avatars.githubusercontent.com/u/1569515?u=a84a5d255621ed82f8e1ca052f5f2eeb75997da2&v=4 url: https://github.com/panko fastapi-0.110.3/docs/en/data/sponsors.yml000066400000000000000000000064601461403617600201750ustar00rootroot00000000000000gold: - url: https://cryptapi.io/ title: "CryptAPI: Your easy to use, secure and privacy oriented payment gateway." img: https://fastapi.tiangolo.com/img/sponsors/cryptapi.svg - url: https://platform.sh/try-it-now/?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023 title: "Build, run and scale your apps on a modern, reliable, and secure PaaS." img: https://fastapi.tiangolo.com/img/sponsors/platform-sh.png - url: https://www.porter.run title: Deploy FastAPI on AWS with a few clicks img: https://fastapi.tiangolo.com/img/sponsors/porter.png - url: https://bump.sh/fastapi?utm_source=fastapi&utm_medium=referral&utm_campaign=sponsor title: Automate FastAPI documentation generation with Bump.sh img: https://fastapi.tiangolo.com/img/sponsors/bump-sh.svg - url: https://reflex.dev title: Reflex img: https://fastapi.tiangolo.com/img/sponsors/reflex.png - url: https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge title: "Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files" img: https://fastapi.tiangolo.com/img/sponsors/scalar.svg - url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge title: Auth, user management and more for your B2B product img: https://fastapi.tiangolo.com/img/sponsors/propelauth.png - url: https://www.withcoherence.com/?utm_medium=advertising&utm_source=fastapi&utm_campaign=banner%20january%2024 title: Coherence img: https://fastapi.tiangolo.com/img/sponsors/coherence.png - url: https://www.mongodb.com/developer/languages/python/python-quickstart-fastapi/?utm_campaign=fastapi_framework&utm_source=fastapi_sponsorship&utm_medium=web_referral title: Simplify Full Stack Development with FastAPI & MongoDB img: https://fastapi.tiangolo.com/img/sponsors/mongodb.png silver: - url: https://training.talkpython.fm/fastapi-courses title: FastAPI video courses on demand from people you trust img: https://fastapi.tiangolo.com/img/sponsors/talkpython-v2.jpg - url: https://github.com/deepset-ai/haystack/ title: Build powerful search from composable, open source building blocks img: https://fastapi.tiangolo.com/img/sponsors/haystack-fastapi.svg - url: https://databento.com/ title: Pay as you go for market data img: https://fastapi.tiangolo.com/img/sponsors/databento.svg - url: https://speakeasyapi.dev?utm_source=fastapi+repo&utm_medium=github+sponsorship title: SDKs for your API | Speakeasy img: https://fastapi.tiangolo.com/img/sponsors/speakeasy.png - url: https://www.svix.com/ title: Svix - Webhooks as a service img: https://fastapi.tiangolo.com/img/sponsors/svix.svg - url: https://www.codacy.com/?utm_source=github&utm_medium=sponsors&utm_id=pioneers title: Take code reviews from hours to minutes img: https://fastapi.tiangolo.com/img/sponsors/codacy.png bronze: - url: https://www.exoflare.com/open-source/?utm_source=FastAPI&utm_campaign=open_source title: Biosecurity risk assessments made easy. img: https://fastapi.tiangolo.com/img/sponsors/exoflare.png - url: https://testdriven.io/courses/tdd-fastapi/ title: Learn to build high-quality web apps with best practices img: https://fastapi.tiangolo.com/img/sponsors/testdriven.svg fastapi-0.110.3/docs/en/data/sponsors_badge.yml000066400000000000000000000006371461403617600213170ustar00rootroot00000000000000logins: - jina-ai - deta - investsuite - mikeckennedy - deepset-ai - cryptapi - xoflare - DropbaseHQ - VincentParedes - BLUE-DEVIL1134 - ObliviousAI - Doist - nihpo - armand-sauzay - databento-bot - databento - nanram22 - Flint-company - porter-dev - fern-api - ndimares - svixhq - Alek99 - codacy - zanfaruqui - scalar - bump-sh - andrew-propelauth - svix fastapi-0.110.3/docs/en/docs/000077500000000000000000000000001461403617600155755ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/about/000077500000000000000000000000001461403617600167075ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/about/index.md000066400000000000000000000000771461403617600203440ustar00rootroot00000000000000# About About FastAPI, its design, inspiration and more. 🤓 fastapi-0.110.3/docs/en/docs/advanced/000077500000000000000000000000001461403617600173425ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/advanced/additional-responses.md000066400000000000000000000214441461403617600240200ustar00rootroot00000000000000# Additional Responses in OpenAPI !!! warning This is a rather advanced topic. If you are starting with **FastAPI**, you might not need this. You can declare additional responses, with additional status codes, media types, descriptions, etc. Those additional responses will be included in the OpenAPI schema, so they will also appear in the API docs. But for those additional responses you have to make sure you return a `Response` like `JSONResponse` directly, with your status code and content. ## Additional Response with `model` You can pass to your *path operation decorators* a parameter `responses`. It receives a `dict`, the keys are status codes for each response, like `200`, and the values are other `dict`s with the information for each of them. Each of those response `dict`s can have a key `model`, containing a Pydantic model, just like `response_model`. **FastAPI** will take that model, generate its JSON Schema and include it in the correct place in OpenAPI. For example, to declare another response with a status code `404` and a Pydantic model `Message`, you can write: ```Python hl_lines="18 22" {!../../../docs_src/additional_responses/tutorial001.py!} ``` !!! note Keep in mind that you have to return the `JSONResponse` directly. !!! info The `model` key is not part of OpenAPI. **FastAPI** will take the Pydantic model from there, generate the `JSON Schema`, and put it in the correct place. The correct place is: * In the key `content`, that has as value another JSON object (`dict`) that contains: * A key with the media type, e.g. `application/json`, that contains as value another JSON object, that contains: * A key `schema`, that has as the value the JSON Schema from the model, here's the correct place. * **FastAPI** adds a reference here to the global JSON Schemas in another place in your OpenAPI instead of including it directly. This way, other applications and clients can use those JSON Schemas directly, provide better code generation tools, etc. The generated responses in the OpenAPI for this *path operation* will be: ```JSON hl_lines="3-12" { "responses": { "404": { "description": "Additional Response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Message" } } } }, "200": { "description": "Successful Response", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Item" } } } }, "422": { "description": "Validation Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/HTTPValidationError" } } } } } } ``` The schemas are referenced to another place inside the OpenAPI schema: ```JSON hl_lines="4-16" { "components": { "schemas": { "Message": { "title": "Message", "required": [ "message" ], "type": "object", "properties": { "message": { "title": "Message", "type": "string" } } }, "Item": { "title": "Item", "required": [ "id", "value" ], "type": "object", "properties": { "id": { "title": "Id", "type": "string" }, "value": { "title": "Value", "type": "string" } } }, "ValidationError": { "title": "ValidationError", "required": [ "loc", "msg", "type" ], "type": "object", "properties": { "loc": { "title": "Location", "type": "array", "items": { "type": "string" } }, "msg": { "title": "Message", "type": "string" }, "type": { "title": "Error Type", "type": "string" } } }, "HTTPValidationError": { "title": "HTTPValidationError", "type": "object", "properties": { "detail": { "title": "Detail", "type": "array", "items": { "$ref": "#/components/schemas/ValidationError" } } } } } } } ``` ## Additional media types for the main response You can use this same `responses` parameter to add different media types for the same main response. For example, you can add an additional media type of `image/png`, declaring that your *path operation* can return a JSON object (with media type `application/json`) or a PNG image: ```Python hl_lines="19-24 28" {!../../../docs_src/additional_responses/tutorial002.py!} ``` !!! note Notice that you have to return the image using a `FileResponse` directly. !!! info Unless you specify a different media type explicitly in your `responses` parameter, FastAPI will assume the response has the same media type as the main response class (default `application/json`). But if you have specified a custom response class with `None` as its media type, FastAPI will use `application/json` for any additional response that has an associated model. ## Combining information You can also combine response information from multiple places, including the `response_model`, `status_code`, and `responses` parameters. You can declare a `response_model`, using the default status code `200` (or a custom one if you need), and then declare additional information for that same response in `responses`, directly in the OpenAPI schema. **FastAPI** will keep the additional information from `responses`, and combine it with the JSON Schema from your model. For example, you can declare a response with a status code `404` that uses a Pydantic model and has a custom `description`. And a response with a status code `200` that uses your `response_model`, but includes a custom `example`: ```Python hl_lines="20-31" {!../../../docs_src/additional_responses/tutorial003.py!} ``` It will all be combined and included in your OpenAPI, and shown in the API docs: ## Combine predefined responses and custom ones You might want to have some predefined responses that apply to many *path operations*, but you want to combine them with custom responses needed by each *path operation*. For those cases, you can use the Python technique of "unpacking" a `dict` with `**dict_to_unpack`: ```Python old_dict = { "old key": "old value", "second old key": "second old value", } new_dict = {**old_dict, "new key": "new value"} ``` Here, `new_dict` will contain all the key-value pairs from `old_dict` plus the new key-value pair: ```Python { "old key": "old value", "second old key": "second old value", "new key": "new value", } ``` You can use that technique to re-use some predefined responses in your *path operations* and combine them with additional custom ones. For example: ```Python hl_lines="13-17 26" {!../../../docs_src/additional_responses/tutorial004.py!} ``` ## More information about OpenAPI responses To see what exactly you can include in the responses, you can check these sections in the OpenAPI specification: * OpenAPI Responses Object, it includes the `Response Object`. * OpenAPI Response Object, you can include anything from this directly in each response inside your `responses` parameter. Including `description`, `headers`, `content` (inside of this is that you declare different media types and JSON Schemas), and `links`. fastapi-0.110.3/docs/en/docs/advanced/additional-status-codes.md000066400000000000000000000052221461403617600244110ustar00rootroot00000000000000# Additional Status Codes By default, **FastAPI** will return the responses using a `JSONResponse`, putting the content you return from your *path operation* inside of that `JSONResponse`. It will use the default status code or the one you set in your *path operation*. ## Additional status codes If you want to return additional status codes apart from the main one, you can do that by returning a `Response` directly, like a `JSONResponse`, and set the additional status code directly. For example, let's say that you want to have a *path operation* that allows to update items, and returns HTTP status codes of 200 "OK" when successful. But you also want it to accept new items. And when the items didn't exist before, it creates them, and returns an HTTP status code of 201 "Created". To achieve that, import `JSONResponse`, and return your content there directly, setting the `status_code` that you want: === "Python 3.10+" ```Python hl_lines="4 25" {!> ../../../docs_src/additional_status_codes/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="4 25" {!> ../../../docs_src/additional_status_codes/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="4 26" {!> ../../../docs_src/additional_status_codes/tutorial001_an.py!} ``` === "Python 3.10+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="2 23" {!> ../../../docs_src/additional_status_codes/tutorial001_py310.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="4 25" {!> ../../../docs_src/additional_status_codes/tutorial001.py!} ``` !!! warning When you return a `Response` directly, like in the example above, it will be returned directly. It won't be serialized with a model, etc. Make sure it has the data you want it to have, and that the values are valid JSON (if you are using `JSONResponse`). !!! note "Technical Details" You could also use `from starlette.responses import JSONResponse`. **FastAPI** provides the same `starlette.responses` as `fastapi.responses` just as a convenience for you, the developer. But most of the available responses come directly from Starlette. The same with `status`. ## OpenAPI and API docs If you return additional status codes and responses directly, they won't be included in the OpenAPI schema (the API docs), because FastAPI doesn't have a way to know beforehand what you are going to return. But you can document that in your code, using: [Additional Responses](additional-responses.md){.internal-link target=_blank}. fastapi-0.110.3/docs/en/docs/advanced/advanced-dependencies.md000066400000000000000000000075561461403617600240720ustar00rootroot00000000000000# Advanced Dependencies ## Parameterized dependencies All the dependencies we have seen are a fixed function or class. But there could be cases where you want to be able to set parameters on the dependency, without having to declare many different functions or classes. Let's imagine that we want to have a dependency that checks if the query parameter `q` contains some fixed content. But we want to be able to parameterize that fixed content. ## A "callable" instance In Python there's a way to make an instance of a class a "callable". Not the class itself (which is already a callable), but an instance of that class. To do that, we declare a method `__call__`: === "Python 3.9+" ```Python hl_lines="12" {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="11" {!> ../../../docs_src/dependencies/tutorial011_an.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="10" {!> ../../../docs_src/dependencies/tutorial011.py!} ``` In this case, this `__call__` is what **FastAPI** will use to check for additional parameters and sub-dependencies, and this is what will be called to pass a value to the parameter in your *path operation function* later. ## Parameterize the instance And now, we can use `__init__` to declare the parameters of the instance that we can use to "parameterize" the dependency: === "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="8" {!> ../../../docs_src/dependencies/tutorial011_an.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="7" {!> ../../../docs_src/dependencies/tutorial011.py!} ``` In this case, **FastAPI** won't ever touch or care about `__init__`, we will use it directly in our code. ## Create an instance We could create an instance of this class with: === "Python 3.9+" ```Python hl_lines="18" {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="17" {!> ../../../docs_src/dependencies/tutorial011_an.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="16" {!> ../../../docs_src/dependencies/tutorial011.py!} ``` And that way we are able to "parameterize" our dependency, that now has `"bar"` inside of it, as the attribute `checker.fixed_content`. ## Use the instance as a dependency Then, we could use this `checker` in a `Depends(checker)`, instead of `Depends(FixedContentQueryChecker)`, because the dependency is the instance, `checker`, not the class itself. And when solving the dependency, **FastAPI** will call this `checker` like: ```Python checker(q="somequery") ``` ...and pass whatever that returns as the value of the dependency in our *path operation function* as the parameter `fixed_content_included`: === "Python 3.9+" ```Python hl_lines="22" {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="21" {!> ../../../docs_src/dependencies/tutorial011_an.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="20" {!> ../../../docs_src/dependencies/tutorial011.py!} ``` !!! tip All this might seem contrived. And it might not be very clear how is it useful yet. These examples are intentionally simple, but show how it all works. In the chapters about security, there are utility functions that are implemented in this same way. If you understood all this, you already know how those utility tools for security work underneath. fastapi-0.110.3/docs/en/docs/advanced/async-tests.md000066400000000000000000000075711461403617600221530ustar00rootroot00000000000000# Async Tests You have already seen how to test your **FastAPI** applications using the provided `TestClient`. Up to now, you have only seen how to write synchronous tests, without using `async` functions. Being able to use asynchronous functions in your tests could be useful, for example, when you're querying your database asynchronously. Imagine you want to test sending requests to your FastAPI application and then verify that your backend successfully wrote the correct data in the database, while using an async database library. Let's look at how we can make that work. ## pytest.mark.anyio If we want to call asynchronous functions in our tests, our test functions have to be asynchronous. AnyIO provides a neat plugin for this, that allows us to specify that some test functions are to be called asynchronously. ## HTTPX Even if your **FastAPI** application uses normal `def` functions instead of `async def`, it is still an `async` application underneath. The `TestClient` does some magic inside to call the asynchronous FastAPI application in your normal `def` test functions, using standard pytest. But that magic doesn't work anymore when we're using it inside asynchronous functions. By running our tests asynchronously, we can no longer use the `TestClient` inside our test functions. The `TestClient` is based on HTTPX, and luckily, we can use it directly to test the API. ## Example For a simple example, let's consider a file structure similar to the one described in [Bigger Applications](../tutorial/bigger-applications.md){.internal-link target=_blank} and [Testing](../tutorial/testing.md){.internal-link target=_blank}: ``` . ├── app │   ├── __init__.py │   ├── main.py │   └── test_main.py ``` The file `main.py` would have: ```Python {!../../../docs_src/async_tests/main.py!} ``` The file `test_main.py` would have the tests for `main.py`, it could look like this now: ```Python {!../../../docs_src/async_tests/test_main.py!} ``` ## Run it You can run your tests as usual via:
```console $ pytest ---> 100% ```
## In Detail The marker `@pytest.mark.anyio` tells pytest that this test function should be called asynchronously: ```Python hl_lines="7" {!../../../docs_src/async_tests/test_main.py!} ``` !!! tip Note that the test function is now `async def` instead of just `def` as before when using the `TestClient`. Then we can create an `AsyncClient` with the app, and send async requests to it, using `await`. ```Python hl_lines="9-10" {!../../../docs_src/async_tests/test_main.py!} ``` This is the equivalent to: ```Python response = client.get('/') ``` ...that we used to make our requests with the `TestClient`. !!! tip Note that we're using async/await with the new `AsyncClient` - the request is asynchronous. !!! warning If your application relies on lifespan events, the `AsyncClient` won't trigger these events. To ensure they are triggered, use `LifespanManager` from florimondmanca/asgi-lifespan. ## Other Asynchronous Function Calls As the testing function is now asynchronous, you can now also call (and `await`) other `async` functions apart from sending requests to your FastAPI application in your tests, exactly as you would call them anywhere else in your code. !!! tip If you encounter a `RuntimeError: Task attached to a different loop` when integrating asynchronous function calls in your tests (e.g. when using MongoDB's MotorClient) Remember to instantiate objects that need an event loop only within async functions, e.g. an `'@app.on_event("startup")` callback. fastapi-0.110.3/docs/en/docs/advanced/behind-a-proxy.md000066400000000000000000000271301461403617600225150ustar00rootroot00000000000000# Behind a Proxy In some situations, you might need to use a **proxy** server like Traefik or Nginx with a configuration that adds an extra path prefix that is not seen by your application. In these cases you can use `root_path` to configure your application. The `root_path` is a mechanism provided by the ASGI specification (that FastAPI is built on, through Starlette). The `root_path` is used to handle these specific cases. And it's also used internally when mounting sub-applications. ## Proxy with a stripped path prefix Having a proxy with a stripped path prefix, in this case, means that you could declare a path at `/app` in your code, but then, you add a layer on top (the proxy) that would put your **FastAPI** application under a path like `/api/v1`. In this case, the original path `/app` would actually be served at `/api/v1/app`. Even though all your code is written assuming there's just `/app`. ```Python hl_lines="6" {!../../../docs_src/behind_a_proxy/tutorial001.py!} ``` And the proxy would be **"stripping"** the **path prefix** on the fly before transmitting the request to Uvicorn, keeping your application convinced that it is being served at `/app`, so that you don't have to update all your code to include the prefix `/api/v1`. Up to here, everything would work as normally. But then, when you open the integrated docs UI (the frontend), it would expect to get the OpenAPI schema at `/openapi.json`, instead of `/api/v1/openapi.json`. So, the frontend (that runs in the browser) would try to reach `/openapi.json` and wouldn't be able to get the OpenAPI schema. Because we have a proxy with a path prefix of `/api/v1` for our app, the frontend needs to fetch the OpenAPI schema at `/api/v1/openapi.json`. ```mermaid graph LR browser("Browser") proxy["Proxy on http://0.0.0.0:9999/api/v1/app"] server["Server on http://127.0.0.1:8000/app"] browser --> proxy proxy --> server ``` !!! tip The IP `0.0.0.0` is commonly used to mean that the program listens on all the IPs available in that machine/server. The docs UI would also need the OpenAPI schema to declare that this API `server` is located at `/api/v1` (behind the proxy). For example: ```JSON hl_lines="4-8" { "openapi": "3.1.0", // More stuff here "servers": [ { "url": "/api/v1" } ], "paths": { // More stuff here } } ``` In this example, the "Proxy" could be something like **Traefik**. And the server would be something like **Uvicorn**, running your FastAPI application. ### Providing the `root_path` To achieve this, you can use the command line option `--root-path` like:
```console $ uvicorn main:app --root-path /api/v1 INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
If you use Hypercorn, it also has the option `--root-path`. !!! note "Technical Details" The ASGI specification defines a `root_path` for this use case. And the `--root-path` command line option provides that `root_path`. ### Checking the current `root_path` You can get the current `root_path` used by your application for each request, it is part of the `scope` dictionary (that's part of the ASGI spec). Here we are including it in the message just for demonstration purposes. ```Python hl_lines="8" {!../../../docs_src/behind_a_proxy/tutorial001.py!} ``` Then, if you start Uvicorn with:
```console $ uvicorn main:app --root-path /api/v1 INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
The response would be something like: ```JSON { "message": "Hello World", "root_path": "/api/v1" } ``` ### Setting the `root_path` in the FastAPI app Alternatively, if you don't have a way to provide a command line option like `--root-path` or equivalent, you can set the `root_path` parameter when creating your FastAPI app: ```Python hl_lines="3" {!../../../docs_src/behind_a_proxy/tutorial002.py!} ``` Passing the `root_path` to `FastAPI` would be the equivalent of passing the `--root-path` command line option to Uvicorn or Hypercorn. ### About `root_path` Keep in mind that the server (Uvicorn) won't use that `root_path` for anything else than passing it to the app. But if you go with your browser to http://127.0.0.1:8000/app you will see the normal response: ```JSON { "message": "Hello World", "root_path": "/api/v1" } ``` So, it won't expect to be accessed at `http://127.0.0.1:8000/api/v1/app`. Uvicorn will expect the proxy to access Uvicorn at `http://127.0.0.1:8000/app`, and then it would be the proxy's responsibility to add the extra `/api/v1` prefix on top. ## About proxies with a stripped path prefix Keep in mind that a proxy with stripped path prefix is only one of the ways to configure it. Probably in many cases the default will be that the proxy doesn't have a stripped path prefix. In a case like that (without a stripped path prefix), the proxy would listen on something like `https://myawesomeapp.com`, and then if the browser goes to `https://myawesomeapp.com/api/v1/app` and your server (e.g. Uvicorn) listens on `http://127.0.0.1:8000` the proxy (without a stripped path prefix) would access Uvicorn at the same path: `http://127.0.0.1:8000/api/v1/app`. ## Testing locally with Traefik You can easily run the experiment locally with a stripped path prefix using Traefik. Download Traefik, it's a single binary, you can extract the compressed file and run it directly from the terminal. Then create a file `traefik.toml` with: ```TOML hl_lines="3" [entryPoints] [entryPoints.http] address = ":9999" [providers] [providers.file] filename = "routes.toml" ``` This tells Traefik to listen on port 9999 and to use another file `routes.toml`. !!! tip We are using port 9999 instead of the standard HTTP port 80 so that you don't have to run it with admin (`sudo`) privileges. Now create that other file `routes.toml`: ```TOML hl_lines="5 12 20" [http] [http.middlewares] [http.middlewares.api-stripprefix.stripPrefix] prefixes = ["/api/v1"] [http.routers] [http.routers.app-http] entryPoints = ["http"] service = "app" rule = "PathPrefix(`/api/v1`)" middlewares = ["api-stripprefix"] [http.services] [http.services.app] [http.services.app.loadBalancer] [[http.services.app.loadBalancer.servers]] url = "http://127.0.0.1:8000" ``` This file configures Traefik to use the path prefix `/api/v1`. And then it will redirect its requests to your Uvicorn running on `http://127.0.0.1:8000`. Now start Traefik:
```console $ ./traefik --configFile=traefik.toml INFO[0000] Configuration loaded from file: /home/user/awesomeapi/traefik.toml ```
And now start your app with Uvicorn, using the `--root-path` option:
```console $ uvicorn main:app --root-path /api/v1 INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
### Check the responses Now, if you go to the URL with the port for Uvicorn: http://127.0.0.1:8000/app, you will see the normal response: ```JSON { "message": "Hello World", "root_path": "/api/v1" } ``` !!! tip Notice that even though you are accessing it at `http://127.0.0.1:8000/app` it shows the `root_path` of `/api/v1`, taken from the option `--root-path`. And now open the URL with the port for Traefik, including the path prefix: http://127.0.0.1:9999/api/v1/app. We get the same response: ```JSON { "message": "Hello World", "root_path": "/api/v1" } ``` but this time at the URL with the prefix path provided by the proxy: `/api/v1`. Of course, the idea here is that everyone would access the app through the proxy, so the version with the path prefix `/api/v1` is the "correct" one. And the version without the path prefix (`http://127.0.0.1:8000/app`), provided by Uvicorn directly, would be exclusively for the _proxy_ (Traefik) to access it. That demonstrates how the Proxy (Traefik) uses the path prefix and how the server (Uvicorn) uses the `root_path` from the option `--root-path`. ### Check the docs UI But here's the fun part. ✨ The "official" way to access the app would be through the proxy with the path prefix that we defined. So, as we would expect, if you try the docs UI served by Uvicorn directly, without the path prefix in the URL, it won't work, because it expects to be accessed through the proxy. You can check it at http://127.0.0.1:8000/docs: But if we access the docs UI at the "official" URL using the proxy with port `9999`, at `/api/v1/docs`, it works correctly! 🎉 You can check it at http://127.0.0.1:9999/api/v1/docs: Right as we wanted it. ✔️ This is because FastAPI uses this `root_path` to create the default `server` in OpenAPI with the URL provided by `root_path`. ## Additional servers !!! warning This is a more advanced use case. Feel free to skip it. By default, **FastAPI** will create a `server` in the OpenAPI schema with the URL for the `root_path`. But you can also provide other alternative `servers`, for example if you want *the same* docs UI to interact with a staging and production environments. If you pass a custom list of `servers` and there's a `root_path` (because your API lives behind a proxy), **FastAPI** will insert a "server" with this `root_path` at the beginning of the list. For example: ```Python hl_lines="4-7" {!../../../docs_src/behind_a_proxy/tutorial003.py!} ``` Will generate an OpenAPI schema like: ```JSON hl_lines="5-7" { "openapi": "3.1.0", // More stuff here "servers": [ { "url": "/api/v1" }, { "url": "https://stag.example.com", "description": "Staging environment" }, { "url": "https://prod.example.com", "description": "Production environment" } ], "paths": { // More stuff here } } ``` !!! tip Notice the auto-generated server with a `url` value of `/api/v1`, taken from the `root_path`. In the docs UI at http://127.0.0.1:9999/api/v1/docs it would look like: !!! tip The docs UI will interact with the server that you select. ### Disable automatic server from `root_path` If you don't want **FastAPI** to include an automatic server using the `root_path`, you can use the parameter `root_path_in_servers=False`: ```Python hl_lines="9" {!../../../docs_src/behind_a_proxy/tutorial004.py!} ``` and then it won't include it in the OpenAPI schema. ## Mounting a sub-application If you need to mount a sub-application (as described in [Sub Applications - Mounts](sub-applications.md){.internal-link target=_blank}) while also using a proxy with `root_path`, you can do it normally, as you would expect. FastAPI will internally use the `root_path` smartly, so it will just work. ✨ fastapi-0.110.3/docs/en/docs/advanced/custom-response.md000066400000000000000000000273121461403617600230370ustar00rootroot00000000000000# Custom Response - HTML, Stream, File, others By default, **FastAPI** will return the responses using `JSONResponse`. You can override it by returning a `Response` directly as seen in [Return a Response directly](response-directly.md){.internal-link target=_blank}. But if you return a `Response` directly, the data won't be automatically converted, and the documentation won't be automatically generated (for example, including the specific "media type", in the HTTP header `Content-Type` as part of the generated OpenAPI). But you can also declare the `Response` that you want to be used, in the *path operation decorator*. The contents that you return from your *path operation function* will be put inside of that `Response`. And if that `Response` has a JSON media type (`application/json`), like is the case with the `JSONResponse` and `UJSONResponse`, the data you return will be automatically converted (and filtered) with any Pydantic `response_model` that you declared in the *path operation decorator*. !!! note If you use a response class with no media type, FastAPI will expect your response to have no content, so it will not document the response format in its generated OpenAPI docs. ## Use `ORJSONResponse` For example, if you are squeezing performance, you can install and use `orjson` and set the response to be `ORJSONResponse`. Import the `Response` class (sub-class) you want to use and declare it in the *path operation decorator*. For large responses, returning a `Response` directly is much faster than returning a dictionary. This is because by default, FastAPI will inspect every item inside and make sure it is serializable as JSON, using the same [JSON Compatible Encoder](../tutorial/encoder.md){.internal-link target=_blank} explained in the tutorial. This is what allows you to return **arbitrary objects**, for example database models. But if you are certain that the content that you are returning is **serializable with JSON**, you can pass it directly to the response class and avoid the extra overhead that FastAPI would have by passing your return content through the `jsonable_encoder` before passing it to the response class. ```Python hl_lines="2 7" {!../../../docs_src/custom_response/tutorial001b.py!} ``` !!! info The parameter `response_class` will also be used to define the "media type" of the response. In this case, the HTTP header `Content-Type` will be set to `application/json`. And it will be documented as such in OpenAPI. !!! tip The `ORJSONResponse` is currently only available in FastAPI, not in Starlette. ## HTML Response To return a response with HTML directly from **FastAPI**, use `HTMLResponse`. * Import `HTMLResponse`. * Pass `HTMLResponse` as the parameter `response_class` of your *path operation decorator*. ```Python hl_lines="2 7" {!../../../docs_src/custom_response/tutorial002.py!} ``` !!! info The parameter `response_class` will also be used to define the "media type" of the response. In this case, the HTTP header `Content-Type` will be set to `text/html`. And it will be documented as such in OpenAPI. ### Return a `Response` As seen in [Return a Response directly](response-directly.md){.internal-link target=_blank}, you can also override the response directly in your *path operation*, by returning it. The same example from above, returning an `HTMLResponse`, could look like: ```Python hl_lines="2 7 19" {!../../../docs_src/custom_response/tutorial003.py!} ``` !!! warning A `Response` returned directly by your *path operation function* won't be documented in OpenAPI (for example, the `Content-Type` won't be documented) and won't be visible in the automatic interactive docs. !!! info Of course, the actual `Content-Type` header, status code, etc, will come from the `Response` object you returned. ### Document in OpenAPI and override `Response` If you want to override the response from inside of the function but at the same time document the "media type" in OpenAPI, you can use the `response_class` parameter AND return a `Response` object. The `response_class` will then be used only to document the OpenAPI *path operation*, but your `Response` will be used as is. #### Return an `HTMLResponse` directly For example, it could be something like: ```Python hl_lines="7 21 23" {!../../../docs_src/custom_response/tutorial004.py!} ``` In this example, the function `generate_html_response()` already generates and returns a `Response` instead of returning the HTML in a `str`. By returning the result of calling `generate_html_response()`, you are already returning a `Response` that will override the default **FastAPI** behavior. But as you passed the `HTMLResponse` in the `response_class` too, **FastAPI** will know how to document it in OpenAPI and the interactive docs as HTML with `text/html`: ## Available responses Here are some of the available responses. Keep in mind that you can use `Response` to return anything else, or even create a custom sub-class. !!! note "Technical Details" You could also use `from starlette.responses import HTMLResponse`. **FastAPI** provides the same `starlette.responses` as `fastapi.responses` just as a convenience for you, the developer. But most of the available responses come directly from Starlette. ### `Response` The main `Response` class, all the other responses inherit from it. You can return it directly. It accepts the following parameters: * `content` - A `str` or `bytes`. * `status_code` - An `int` HTTP status code. * `headers` - A `dict` of strings. * `media_type` - A `str` giving the media type. E.g. `"text/html"`. FastAPI (actually Starlette) will automatically include a Content-Length header. It will also include a Content-Type header, based on the media_type and appending a charset for text types. ```Python hl_lines="1 18" {!../../../docs_src/response_directly/tutorial002.py!} ``` ### `HTMLResponse` Takes some text or bytes and returns an HTML response, as you read above. ### `PlainTextResponse` Takes some text or bytes and returns an plain text response. ```Python hl_lines="2 7 9" {!../../../docs_src/custom_response/tutorial005.py!} ``` ### `JSONResponse` Takes some data and returns an `application/json` encoded response. This is the default response used in **FastAPI**, as you read above. ### `ORJSONResponse` A fast alternative JSON response using `orjson`, as you read above. ### `UJSONResponse` An alternative JSON response using `ujson`. !!! warning `ujson` is less careful than Python's built-in implementation in how it handles some edge-cases. ```Python hl_lines="2 7" {!../../../docs_src/custom_response/tutorial001.py!} ``` !!! tip It's possible that `ORJSONResponse` might be a faster alternative. ### `RedirectResponse` Returns an HTTP redirect. Uses a 307 status code (Temporary Redirect) by default. You can return a `RedirectResponse` directly: ```Python hl_lines="2 9" {!../../../docs_src/custom_response/tutorial006.py!} ``` --- Or you can use it in the `response_class` parameter: ```Python hl_lines="2 7 9" {!../../../docs_src/custom_response/tutorial006b.py!} ``` If you do that, then you can return the URL directly from your *path operation* function. In this case, the `status_code` used will be the default one for the `RedirectResponse`, which is `307`. --- You can also use the `status_code` parameter combined with the `response_class` parameter: ```Python hl_lines="2 7 9" {!../../../docs_src/custom_response/tutorial006c.py!} ``` ### `StreamingResponse` Takes an async generator or a normal generator/iterator and streams the response body. ```Python hl_lines="2 14" {!../../../docs_src/custom_response/tutorial007.py!} ``` #### Using `StreamingResponse` with file-like objects If you have a file-like object (e.g. the object returned by `open()`), you can create a generator function to iterate over that file-like object. That way, you don't have to read it all first in memory, and you can pass that generator function to the `StreamingResponse`, and return it. This includes many libraries to interact with cloud storage, video processing, and others. ```{ .python .annotate hl_lines="2 10-12 14" } {!../../../docs_src/custom_response/tutorial008.py!} ``` 1. This is the generator function. It's a "generator function" because it contains `yield` statements inside. 2. By using a `with` block, we make sure that the file-like object is closed after the generator function is done. So, after it finishes sending the response. 3. This `yield from` tells the function to iterate over that thing named `file_like`. And then, for each part iterated, yield that part as coming from this generator function. So, it is a generator function that transfers the "generating" work to something else internally. By doing it this way, we can put it in a `with` block, and that way, ensure that it is closed after finishing. !!! tip Notice that here as we are using standard `open()` that doesn't support `async` and `await`, we declare the path operation with normal `def`. ### `FileResponse` Asynchronously streams a file as the response. Takes a different set of arguments to instantiate than the other response types: * `path` - The filepath to the file to stream. * `headers` - Any custom headers to include, as a dictionary. * `media_type` - A string giving the media type. If unset, the filename or path will be used to infer a media type. * `filename` - If set, this will be included in the response `Content-Disposition`. File responses will include appropriate `Content-Length`, `Last-Modified` and `ETag` headers. ```Python hl_lines="2 10" {!../../../docs_src/custom_response/tutorial009.py!} ``` You can also use the `response_class` parameter: ```Python hl_lines="2 8 10" {!../../../docs_src/custom_response/tutorial009b.py!} ``` In this case, you can return the file path directly from your *path operation* function. ## Custom response class You can create your own custom response class, inheriting from `Response` and using it. For example, let's say that you want to use `orjson`, but with some custom settings not used in the included `ORJSONResponse` class. Let's say you want it to return indented and formatted JSON, so you want to use the orjson option `orjson.OPT_INDENT_2`. You could create a `CustomORJSONResponse`. The main thing you have to do is create a `Response.render(content)` method that returns the content as `bytes`: ```Python hl_lines="9-14 17" {!../../../docs_src/custom_response/tutorial009c.py!} ``` Now instead of returning: ```json {"message": "Hello World"} ``` ...this response will return: ```json { "message": "Hello World" } ``` Of course, you will probably find much better ways to take advantage of this than formatting JSON. 😉 ## Default response class When creating a **FastAPI** class instance or an `APIRouter` you can specify which response class to use by default. The parameter that defines this is `default_response_class`. In the example below, **FastAPI** will use `ORJSONResponse` by default, in all *path operations*, instead of `JSONResponse`. ```Python hl_lines="2 4" {!../../../docs_src/custom_response/tutorial010.py!} ``` !!! tip You can still override `response_class` in *path operations* as before. ## Additional documentation You can also declare the media type and many other details in OpenAPI using `responses`: [Additional Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}. fastapi-0.110.3/docs/en/docs/advanced/dataclasses.md000066400000000000000000000101551461403617600221550ustar00rootroot00000000000000# Using Dataclasses FastAPI is built on top of **Pydantic**, and I have been showing you how to use Pydantic models to declare requests and responses. But FastAPI also supports using `dataclasses` the same way: ```Python hl_lines="1 7-12 19-20" {!../../../docs_src/dataclasses/tutorial001.py!} ``` This is still supported thanks to **Pydantic**, as it has internal support for `dataclasses`. So, even with the code above that doesn't use Pydantic explicitly, FastAPI is using Pydantic to convert those standard dataclasses to Pydantic's own flavor of dataclasses. And of course, it supports the same: * data validation * data serialization * data documentation, etc. This works the same way as with Pydantic models. And it is actually achieved in the same way underneath, using Pydantic. !!! info Keep in mind that dataclasses can't do everything Pydantic models can do. So, you might still need to use Pydantic models. But if you have a bunch of dataclasses laying around, this is a nice trick to use them to power a web API using FastAPI. 🤓 ## Dataclasses in `response_model` You can also use `dataclasses` in the `response_model` parameter: ```Python hl_lines="1 7-13 19" {!../../../docs_src/dataclasses/tutorial002.py!} ``` The dataclass will be automatically converted to a Pydantic dataclass. This way, its schema will show up in the API docs user interface: ## Dataclasses in Nested Data Structures You can also combine `dataclasses` with other type annotations to make nested data structures. In some cases, you might still have to use Pydantic's version of `dataclasses`. For example, if you have errors with the automatically generated API documentation. In that case, you can simply swap the standard `dataclasses` with `pydantic.dataclasses`, which is a drop-in replacement: ```{ .python .annotate hl_lines="1 5 8-11 14-17 23-25 28" } {!../../../docs_src/dataclasses/tutorial003.py!} ``` 1. We still import `field` from standard `dataclasses`. 2. `pydantic.dataclasses` is a drop-in replacement for `dataclasses`. 3. The `Author` dataclass includes a list of `Item` dataclasses. 4. The `Author` dataclass is used as the `response_model` parameter. 5. You can use other standard type annotations with dataclasses as the request body. In this case, it's a list of `Item` dataclasses. 6. Here we are returning a dictionary that contains `items` which is a list of dataclasses. FastAPI is still capable of serializing the data to JSON. 7. Here the `response_model` is using a type annotation of a list of `Author` dataclasses. Again, you can combine `dataclasses` with standard type annotations. 8. Notice that this *path operation function* uses regular `def` instead of `async def`. As always, in FastAPI you can combine `def` and `async def` as needed. If you need a refresher about when to use which, check out the section _"In a hurry?"_ in the docs about [`async` and `await`](../async.md#in-a-hurry){.internal-link target=_blank}. 9. This *path operation function* is not returning dataclasses (although it could), but a list of dictionaries with internal data. FastAPI will use the `response_model` parameter (that includes dataclasses) to convert the response. You can combine `dataclasses` with other type annotations in many different combinations to form complex data structures. Check the in-code annotation tips above to see more specific details. ## Learn More You can also combine `dataclasses` with other Pydantic models, inherit from them, include them in your own models, etc. To learn more, check the Pydantic docs about dataclasses. ## Version This is available since FastAPI version `0.67.0`. 🔖 fastapi-0.110.3/docs/en/docs/advanced/events.md000066400000000000000000000174501461403617600211770ustar00rootroot00000000000000# Lifespan Events You can define logic (code) that should be executed before the application **starts up**. This means that this code will be executed **once**, **before** the application **starts receiving requests**. The same way, you can define logic (code) that should be executed when the application is **shutting down**. In this case, this code will be executed **once**, **after** having handled possibly **many requests**. Because this code is executed before the application **starts** taking requests, and right after it **finishes** handling requests, it covers the whole application **lifespan** (the word "lifespan" will be important in a second 😉). This can be very useful for setting up **resources** that you need to use for the whole app, and that are **shared** among requests, and/or that you need to **clean up** afterwards. For example, a database connection pool, or loading a shared machine learning model. ## Use Case Let's start with an example **use case** and then see how to solve it with this. Let's imagine that you have some **machine learning models** that you want to use to handle requests. 🤖 The same models are shared among requests, so, it's not one model per request, or one per user or something similar. Let's imagine that loading the model can **take quite some time**, because it has to read a lot of **data from disk**. So you don't want to do it for every request. You could load it at the top level of the module/file, but that would also mean that it would **load the model** even if you are just running a simple automated test, then that test would be **slow** because it would have to wait for the model to load before being able to run an independent part of the code. That's what we'll solve, let's load the model before the requests are handled, but only right before the application starts receiving requests, not while the code is being loaded. ## Lifespan You can define this *startup* and *shutdown* logic using the `lifespan` parameter of the `FastAPI` app, and a "context manager" (I'll show you what that is in a second). Let's start with an example and then see it in detail. We create an async function `lifespan()` with `yield` like this: ```Python hl_lines="16 19" {!../../../docs_src/events/tutorial003.py!} ``` Here we are simulating the expensive *startup* operation of loading the model by putting the (fake) model function in the dictionary with machine learning models before the `yield`. This code will be executed **before** the application **starts taking requests**, during the *startup*. And then, right after the `yield`, we unload the model. This code will be executed **after** the application **finishes handling requests**, right before the *shutdown*. This could, for example, release resources like memory or a GPU. !!! tip The `shutdown` would happen when you are **stopping** the application. Maybe you need to start a new version, or you just got tired of running it. 🤷 ### Lifespan function The first thing to notice, is that we are defining an async function with `yield`. This is very similar to Dependencies with `yield`. ```Python hl_lines="14-19" {!../../../docs_src/events/tutorial003.py!} ``` The first part of the function, before the `yield`, will be executed **before** the application starts. And the part after the `yield` will be executed **after** the application has finished. ### Async Context Manager If you check, the function is decorated with an `@asynccontextmanager`. That converts the function into something called an "**async context manager**". ```Python hl_lines="1 13" {!../../../docs_src/events/tutorial003.py!} ``` A **context manager** in Python is something that you can use in a `with` statement, for example, `open()` can be used as a context manager: ```Python with open("file.txt") as file: file.read() ``` In recent versions of Python, there's also an **async context manager**. You would use it with `async with`: ```Python async with lifespan(app): await do_stuff() ``` When you create a context manager or an async context manager like above, what it does is that, before entering the `with` block, it will execute the code before the `yield`, and after exiting the `with` block, it will execute the code after the `yield`. In our code example above, we don't use it directly, but we pass it to FastAPI for it to use it. The `lifespan` parameter of the `FastAPI` app takes an **async context manager**, so we can pass our new `lifespan` async context manager to it. ```Python hl_lines="22" {!../../../docs_src/events/tutorial003.py!} ``` ## Alternative Events (deprecated) !!! warning The recommended way to handle the *startup* and *shutdown* is using the `lifespan` parameter of the `FastAPI` app as described above. If you provide a `lifespan` parameter, `startup` and `shutdown` event handlers will no longer be called. It's all `lifespan` or all events, not both. You can probably skip this part. There's an alternative way to define this logic to be executed during *startup* and during *shutdown*. You can define event handlers (functions) that need to be executed before the application starts up, or when the application is shutting down. These functions can be declared with `async def` or normal `def`. ### `startup` event To add a function that should be run before the application starts, declare it with the event `"startup"`: ```Python hl_lines="8" {!../../../docs_src/events/tutorial001.py!} ``` In this case, the `startup` event handler function will initialize the items "database" (just a `dict`) with some values. You can add more than one event handler function. And your application won't start receiving requests until all the `startup` event handlers have completed. ### `shutdown` event To add a function that should be run when the application is shutting down, declare it with the event `"shutdown"`: ```Python hl_lines="6" {!../../../docs_src/events/tutorial002.py!} ``` Here, the `shutdown` event handler function will write a text line `"Application shutdown"` to a file `log.txt`. !!! info In the `open()` function, the `mode="a"` means "append", so, the line will be added after whatever is on that file, without overwriting the previous contents. !!! tip Notice that in this case we are using a standard Python `open()` function that interacts with a file. So, it involves I/O (input/output), that requires "waiting" for things to be written to disk. But `open()` doesn't use `async` and `await`. So, we declare the event handler function with standard `def` instead of `async def`. ### `startup` and `shutdown` together There's a high chance that the logic for your *startup* and *shutdown* is connected, you might want to start something and then finish it, acquire a resource and then release it, etc. Doing that in separated functions that don't share logic or variables together is more difficult as you would need to store values in global variables or similar tricks. Because of that, it's now recommended to instead use the `lifespan` as explained above. ## Technical Details Just a technical detail for the curious nerds. 🤓 Underneath, in the ASGI technical specification, this is part of the Lifespan Protocol, and it defines events called `startup` and `shutdown`. !!! info You can read more about the Starlette `lifespan` handlers in Starlette's Lifespan' docs. Including how to handle lifespan state that can be used in other areas of your code. ## Sub Applications 🚨 Keep in mind that these lifespan events (startup and shutdown) will only be executed for the main application, not for [Sub Applications - Mounts](sub-applications.md){.internal-link target=_blank}. fastapi-0.110.3/docs/en/docs/advanced/generate-clients.md000066400000000000000000000250141461403617600231170ustar00rootroot00000000000000# Generate Clients As **FastAPI** is based on the OpenAPI specification, you get automatic compatibility with many tools, including the automatic API docs (provided by Swagger UI). One particular advantage that is not necessarily obvious is that you can **generate clients** (sometimes called **SDKs** ) for your API, for many different **programming languages**. ## OpenAPI Client Generators There are many tools to generate clients from **OpenAPI**. A common tool is OpenAPI Generator. If you are building a **frontend**, a very interesting alternative is openapi-ts. ## Client and SDK Generators - Sponsor There are also some **company-backed** Client and SDK generators based on OpenAPI (FastAPI), in some cases they can offer you **additional features** on top of high-quality generated SDKs/clients. Some of them also ✨ [**sponsor FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨, this ensures the continued and healthy **development** of FastAPI and its **ecosystem**. And it shows their true commitment to FastAPI and its **community** (you), as they not only want to provide you a **good service** but also want to make sure you have a **good and healthy framework**, FastAPI. 🙇 For example, you might want to try Speakeasy. There are also several other companies offering similar services that you can search and find online. 🤓 ## Generate a TypeScript Frontend Client Let's start with a simple FastAPI application: === "Python 3.9+" ```Python hl_lines="7-9 12-13 16-17 21" {!> ../../../docs_src/generate_clients/tutorial001_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="9-11 14-15 18 19 23" {!> ../../../docs_src/generate_clients/tutorial001.py!} ``` Notice that the *path operations* define the models they use for request payload and response payload, using the models `Item` and `ResponseMessage`. ### API Docs If you go to the API docs, you will see that it has the **schemas** for the data to be sent in requests and received in responses: You can see those schemas because they were declared with the models in the app. That information is available in the app's **OpenAPI schema**, and then shown in the API docs (by Swagger UI). And that same information from the models that is included in OpenAPI is what can be used to **generate the client code**. ### Generate a TypeScript Client Now that we have the app with the models, we can generate the client code for the frontend. #### Install `openapi-ts` You can install `openapi-ts` in your frontend code with:
```console $ npm install @hey-api/openapi-ts --save-dev ---> 100% ```
#### Generate Client Code To generate the client code you can use the command line application `openapi-ts` that would now be installed. Because it is installed in the local project, you probably wouldn't be able to call that command directly, but you would put it on your `package.json` file. It could look like this: ```JSON hl_lines="7" { "name": "frontend-app", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "generate-client": "openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios" }, "author": "", "license": "", "devDependencies": { "@hey-api/openapi-ts": "^0.27.38", "typescript": "^4.6.2" } } ``` After having that NPM `generate-client` script there, you can run it with:
```console $ npm run generate-client frontend-app@1.0.0 generate-client /home/user/code/frontend-app > openapi-ts --input http://localhost:8000/openapi.json --output ./src/client --client axios ```
That command will generate code in `./src/client` and will use `axios` (the frontend HTTP library) internally. ### Try Out the Client Code Now you can import and use the client code, it could look like this, notice that you get autocompletion for the methods: You will also get autocompletion for the payload to send: !!! tip Notice the autocompletion for `name` and `price`, that was defined in the FastAPI application, in the `Item` model. You will have inline errors for the data that you send: The response object will also have autocompletion: ## FastAPI App with Tags In many cases your FastAPI app will be bigger, and you will probably use tags to separate different groups of *path operations*. For example, you could have a section for **items** and another section for **users**, and they could be separated by tags: === "Python 3.9+" ```Python hl_lines="21 26 34" {!> ../../../docs_src/generate_clients/tutorial002_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="23 28 36" {!> ../../../docs_src/generate_clients/tutorial002.py!} ``` ### Generate a TypeScript Client with Tags If you generate a client for a FastAPI app using tags, it will normally also separate the client code based on the tags. This way you will be able to have things ordered and grouped correctly for the client code: In this case you have: * `ItemsService` * `UsersService` ### Client Method Names Right now the generated method names like `createItemItemsPost` don't look very clean: ```TypeScript ItemsService.createItemItemsPost({name: "Plumbus", price: 5}) ``` ...that's because the client generator uses the OpenAPI internal **operation ID** for each *path operation*. OpenAPI requires that each operation ID is unique across all the *path operations*, so FastAPI uses the **function name**, the **path**, and the **HTTP method/operation** to generate that operation ID, because that way it can make sure that the operation IDs are unique. But I'll show you how to improve that next. 🤓 ## Custom Operation IDs and Better Method Names You can **modify** the way these operation IDs are **generated** to make them simpler and have **simpler method names** in the clients. In this case you will have to ensure that each operation ID is **unique** in some other way. For example, you could make sure that each *path operation* has a tag, and then generate the operation ID based on the **tag** and the *path operation* **name** (the function name). ### Custom Generate Unique ID Function FastAPI uses a **unique ID** for each *path operation*, it is used for the **operation ID** and also for the names of any needed custom models, for requests or responses. You can customize that function. It takes an `APIRoute` and outputs a string. For example, here it is using the first tag (you will probably have only one tag) and the *path operation* name (the function name). You can then pass that custom function to **FastAPI** as the `generate_unique_id_function` parameter: === "Python 3.9+" ```Python hl_lines="6-7 10" {!> ../../../docs_src/generate_clients/tutorial003_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="8-9 12" {!> ../../../docs_src/generate_clients/tutorial003.py!} ``` ### Generate a TypeScript Client with Custom Operation IDs Now if you generate the client again, you will see that it has the improved method names: As you see, the method names now have the tag and then the function name, now they don't include information from the URL path and the HTTP operation. ### Preprocess the OpenAPI Specification for the Client Generator The generated code still has some **duplicated information**. We already know that this method is related to the **items** because that word is in the `ItemsService` (taken from the tag), but we still have the tag name prefixed in the method name too. 😕 We will probably still want to keep it for OpenAPI in general, as that will ensure that the operation IDs are **unique**. But for the generated client we could **modify** the OpenAPI operation IDs right before generating the clients, just to make those method names nicer and **cleaner**. We could download the OpenAPI JSON to a file `openapi.json` and then we could **remove that prefixed tag** with a script like this: === "Python" ```Python {!> ../../../docs_src/generate_clients/tutorial004.py!} ``` === "Node.js" ```Javascript {!> ../../../docs_src/generate_clients/tutorial004.js!} ``` With that, the operation IDs would be renamed from things like `items-get_items` to just `get_items`, that way the client generator can generate simpler method names. ### Generate a TypeScript Client with the Preprocessed OpenAPI Now as the end result is in a file `openapi.json`, you would modify the `package.json` to use that local file, for example: ```JSON hl_lines="7" { "name": "frontend-app", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "generate-client": "openapi-ts --input ./openapi.json --output ./src/client --client axios" }, "author": "", "license": "", "devDependencies": { "@hey-api/openapi-ts": "^0.27.38", "typescript": "^4.6.2" } } ``` After generating the new client, you would now have **clean method names**, with all the **autocompletion**, **inline errors**, etc: ## Benefits When using the automatically generated clients you would get **autocompletion** for: * Methods. * Request payloads in the body, query parameters, etc. * Response payloads. You would also have **inline errors** for everything. And whenever you update the backend code, and **regenerate** the frontend, it would have any new *path operations* available as methods, the old ones removed, and any other change would be reflected on the generated code. 🤓 This also means that if something changed it will be **reflected** on the client code automatically. And if you **build** the client it will error out if you have any **mismatch** in the data used. So, you would **detect many errors** very early in the development cycle instead of having to wait for the errors to show up to your final users in production and then trying to debug where the problem is. ✨ fastapi-0.110.3/docs/en/docs/advanced/index.md000066400000000000000000000035271461403617600210020ustar00rootroot00000000000000# Advanced User Guide ## Additional Features The main [Tutorial - User Guide](../tutorial/index.md){.internal-link target=_blank} should be enough to give you a tour through all the main features of **FastAPI**. In the next sections you will see other options, configurations, and additional features. !!! tip The next sections are **not necessarily "advanced"**. And it's possible that for your use case, the solution is in one of them. ## Read the Tutorial first You could still use most of the features in **FastAPI** with the knowledge from the main [Tutorial - User Guide](../tutorial/index.md){.internal-link target=_blank}. And the next sections assume you already read it, and assume that you know those main ideas. ## External Courses Although the [Tutorial - User Guide](../tutorial/index.md){.internal-link target=_blank} and this **Advanced User Guide** are written as a guided tutorial (like a book) and should be enough for you to **learn FastAPI**, you might want to complement it with additional courses. Or it might be the case that you just prefer to take other courses because they adapt better to your learning style. Some course providers ✨ [**sponsor FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨, this ensures the continued and healthy **development** of FastAPI and its **ecosystem**. And it shows their true commitment to FastAPI and its **community** (you), as they not only want to provide you a **good learning experience** but also want to make sure you have a **good and healthy framework**, FastAPI. 🙇 You might want to try their courses: * Talk Python Training * Test-Driven Development fastapi-0.110.3/docs/en/docs/advanced/middleware.md000066400000000000000000000077341461403617600220140ustar00rootroot00000000000000# Advanced Middleware In the main tutorial you read how to add [Custom Middleware](../tutorial/middleware.md){.internal-link target=_blank} to your application. And then you also read how to handle [CORS with the `CORSMiddleware`](../tutorial/cors.md){.internal-link target=_blank}. In this section we'll see how to use other middlewares. ## Adding ASGI middlewares As **FastAPI** is based on Starlette and implements the ASGI specification, you can use any ASGI middleware. A middleware doesn't have to be made for FastAPI or Starlette to work, as long as it follows the ASGI spec. In general, ASGI middlewares are classes that expect to receive an ASGI app as the first argument. So, in the documentation for third-party ASGI middlewares they will probably tell you to do something like: ```Python from unicorn import UnicornMiddleware app = SomeASGIApp() new_app = UnicornMiddleware(app, some_config="rainbow") ``` But FastAPI (actually Starlette) provides a simpler way to do it that makes sure that the internal middlewares to handle server errors and custom exception handlers work properly. For that, you use `app.add_middleware()` (as in the example for CORS). ```Python from fastapi import FastAPI from unicorn import UnicornMiddleware app = FastAPI() app.add_middleware(UnicornMiddleware, some_config="rainbow") ``` `app.add_middleware()` receives a middleware class as the first argument and any additional arguments to be passed to the middleware. ## Integrated middlewares **FastAPI** includes several middlewares for common use cases, we'll see next how to use them. !!! note "Technical Details" For the next examples, you could also use `from starlette.middleware.something import SomethingMiddleware`. **FastAPI** provides several middlewares in `fastapi.middleware` just as a convenience for you, the developer. But most of the available middlewares come directly from Starlette. ## `HTTPSRedirectMiddleware` Enforces that all incoming requests must either be `https` or `wss`. Any incoming requests to `http` or `ws` will be redirected to the secure scheme instead. ```Python hl_lines="2 6" {!../../../docs_src/advanced_middleware/tutorial001.py!} ``` ## `TrustedHostMiddleware` Enforces that all incoming requests have a correctly set `Host` header, in order to guard against HTTP Host Header attacks. ```Python hl_lines="2 6-8" {!../../../docs_src/advanced_middleware/tutorial002.py!} ``` The following arguments are supported: * `allowed_hosts` - A list of domain names that should be allowed as hostnames. Wildcard domains such as `*.example.com` are supported for matching subdomains. To allow any hostname either use `allowed_hosts=["*"]` or omit the middleware. If an incoming request does not validate correctly then a `400` response will be sent. ## `GZipMiddleware` Handles GZip responses for any request that includes `"gzip"` in the `Accept-Encoding` header. The middleware will handle both standard and streaming responses. ```Python hl_lines="2 6" {!../../../docs_src/advanced_middleware/tutorial003.py!} ``` The following arguments are supported: * `minimum_size` - Do not GZip responses that are smaller than this minimum size in bytes. Defaults to `500`. ## Other middlewares There are many other ASGI middlewares. For example: * Sentry * Uvicorn's `ProxyHeadersMiddleware` * MessagePack To see other available middlewares check Starlette's Middleware docs and the ASGI Awesome List. fastapi-0.110.3/docs/en/docs/advanced/openapi-callbacks.md000066400000000000000000000173771461403617600232530ustar00rootroot00000000000000# OpenAPI Callbacks You could create an API with a *path operation* that could trigger a request to an *external API* created by someone else (probably the same developer that would be *using* your API). The process that happens when your API app calls the *external API* is named a "callback". Because the software that the external developer wrote sends a request to your API and then your API *calls back*, sending a request to an *external API* (that was probably created by the same developer). In this case, you could want to document how that external API *should* look like. What *path operation* it should have, what body it should expect, what response it should return, etc. ## An app with callbacks Let's see all this with an example. Imagine you develop an app that allows creating invoices. These invoices will have an `id`, `title` (optional), `customer`, and `total`. The user of your API (an external developer) will create an invoice in your API with a POST request. Then your API will (let's imagine): * Send the invoice to some customer of the external developer. * Collect the money. * Send a notification back to the API user (the external developer). * This will be done by sending a POST request (from *your API*) to some *external API* provided by that external developer (this is the "callback"). ## The normal **FastAPI** app Let's first see how the normal API app would look like before adding the callback. It will have a *path operation* that will receive an `Invoice` body, and a query parameter `callback_url` that will contain the URL for the callback. This part is pretty normal, most of the code is probably already familiar to you: ```Python hl_lines="9-13 36-53" {!../../../docs_src/openapi_callbacks/tutorial001.py!} ``` !!! tip The `callback_url` query parameter uses a Pydantic URL type. The only new thing is the `callbacks=invoices_callback_router.routes` as an argument to the *path operation decorator*. We'll see what that is next. ## Documenting the callback The actual callback code will depend heavily on your own API app. And it will probably vary a lot from one app to the next. It could be just one or two lines of code, like: ```Python callback_url = "https://example.com/api/v1/invoices/events/" httpx.post(callback_url, json={"description": "Invoice paid", "paid": True}) ``` But possibly the most important part of the callback is making sure that your API user (the external developer) implements the *external API* correctly, according to the data that *your API* is going to send in the request body of the callback, etc. So, what we will do next is add the code to document how that *external API* should look like to receive the callback from *your API*. That documentation will show up in the Swagger UI at `/docs` in your API, and it will let external developers know how to build the *external API*. This example doesn't implement the callback itself (that could be just a line of code), only the documentation part. !!! tip The actual callback is just an HTTP request. When implementing the callback yourself, you could use something like HTTPX or Requests. ## Write the callback documentation code This code won't be executed in your app, we only need it to *document* how that *external API* should look like. But, you already know how to easily create automatic documentation for an API with **FastAPI**. So we are going to use that same knowledge to document how the *external API* should look like... by creating the *path operation(s)* that the external API should implement (the ones your API will call). !!! tip When writing the code to document a callback, it might be useful to imagine that you are that *external developer*. And that you are currently implementing the *external API*, not *your API*. Temporarily adopting this point of view (of the *external developer*) can help you feel like it's more obvious where to put the parameters, the Pydantic model for the body, for the response, etc. for that *external API*. ### Create a callback `APIRouter` First create a new `APIRouter` that will contain one or more callbacks. ```Python hl_lines="3 25" {!../../../docs_src/openapi_callbacks/tutorial001.py!} ``` ### Create the callback *path operation* To create the callback *path operation* use the same `APIRouter` you created above. It should look just like a normal FastAPI *path operation*: * It should probably have a declaration of the body it should receive, e.g. `body: InvoiceEvent`. * And it could also have a declaration of the response it should return, e.g. `response_model=InvoiceEventReceived`. ```Python hl_lines="16-18 21-22 28-32" {!../../../docs_src/openapi_callbacks/tutorial001.py!} ``` There are 2 main differences from a normal *path operation*: * It doesn't need to have any actual code, because your app will never call this code. It's only used to document the *external API*. So, the function could just have `pass`. * The *path* can contain an OpenAPI 3 expression (see more below) where it can use variables with parameters and parts of the original request sent to *your API*. ### The callback path expression The callback *path* can have an OpenAPI 3 expression that can contain parts of the original request sent to *your API*. In this case, it's the `str`: ```Python "{$callback_url}/invoices/{$request.body.id}" ``` So, if your API user (the external developer) sends a request to *your API* to: ``` https://yourapi.com/invoices/?callback_url=https://www.external.org/events ``` with a JSON body of: ```JSON { "id": "2expen51ve", "customer": "Mr. Richie Rich", "total": "9999" } ``` then *your API* will process the invoice, and at some point later, send a callback request to the `callback_url` (the *external API*): ``` https://www.external.org/events/invoices/2expen51ve ``` with a JSON body containing something like: ```JSON { "description": "Payment celebration", "paid": true } ``` and it would expect a response from that *external API* with a JSON body like: ```JSON { "ok": true } ``` !!! tip Notice how the callback URL used contains the URL received as a query parameter in `callback_url` (`https://www.external.org/events`) and also the invoice `id` from inside of the JSON body (`2expen51ve`). ### Add the callback router At this point you have the *callback path operation(s)* needed (the one(s) that the *external developer* should implement in the *external API*) in the callback router you created above. Now use the parameter `callbacks` in *your API's path operation decorator* to pass the attribute `.routes` (that's actually just a `list` of routes/*path operations*) from that callback router: ```Python hl_lines="35" {!../../../docs_src/openapi_callbacks/tutorial001.py!} ``` !!! tip Notice that you are not passing the router itself (`invoices_callback_router`) to `callback=`, but the attribute `.routes`, as in `invoices_callback_router.routes`. ### Check the docs Now you can start your app with Uvicorn and go to http://127.0.0.1:8000/docs. You will see your docs including a "Callbacks" section for your *path operation* that shows how the *external API* should look like: fastapi-0.110.3/docs/en/docs/advanced/openapi-webhooks.md000066400000000000000000000055041461403617600231420ustar00rootroot00000000000000# OpenAPI Webhooks There are cases where you want to tell your API **users** that your app could call *their* app (sending a request) with some data, normally to **notify** of some type of **event**. This means that instead of the normal process of your users sending requests to your API, it's **your API** (or your app) that could **send requests to their system** (to their API, their app). This is normally called a **webhook**. ## Webhooks steps The process normally is that **you define** in your code what is the message that you will send, the **body of the request**. You also define in some way at which **moments** your app will send those requests or events. And **your users** define in some way (for example in a web dashboard somewhere) the **URL** where your app should send those requests. All the **logic** about how to register the URLs for webhooks and the code to actually send those requests is up to you. You write it however you want to in **your own code**. ## Documenting webhooks with **FastAPI** and OpenAPI With **FastAPI**, using OpenAPI, you can define the names of these webhooks, the types of HTTP operations that your app can send (e.g. `POST`, `PUT`, etc.) and the request **bodies** that your app would send. This can make it a lot easier for your users to **implement their APIs** to receive your **webhook** requests, they might even be able to autogenerate some of their own API code. !!! info Webhooks are available in OpenAPI 3.1.0 and above, supported by FastAPI `0.99.0` and above. ## An app with webhooks When you create a **FastAPI** application, there is a `webhooks` attribute that you can use to define *webhooks*, the same way you would define *path operations*, for example with `@app.webhooks.post()`. ```Python hl_lines="9-13 36-53" {!../../../docs_src/openapi_webhooks/tutorial001.py!} ``` The webhooks that you define will end up in the **OpenAPI** schema and the automatic **docs UI**. !!! info The `app.webhooks` object is actually just an `APIRouter`, the same type you would use when structuring your app with multiple files. Notice that with webhooks you are actually not declaring a *path* (like `/items/`), the text you pass there is just an **identifier** of the webhook (the name of the event), for example in `@app.webhooks.post("new-subscription")`, the webhook name is `new-subscription`. This is because it is expected that **your users** would define the actual **URL path** where they want to receive the webhook request in some other way (e.g. a web dashboard). ### Check the docs Now you can start your app with Uvicorn and go to http://127.0.0.1:8000/docs. You will see your docs have the normal *path operations* and now also some **webhooks**: fastapi-0.110.3/docs/en/docs/advanced/path-operation-advanced-configuration.md000066400000000000000000000172441461403617600272360ustar00rootroot00000000000000# Path Operation Advanced Configuration ## OpenAPI operationId !!! warning If you are not an "expert" in OpenAPI, you probably don't need this. You can set the OpenAPI `operationId` to be used in your *path operation* with the parameter `operation_id`. You would have to make sure that it is unique for each operation. ```Python hl_lines="6" {!../../../docs_src/path_operation_advanced_configuration/tutorial001.py!} ``` ### Using the *path operation function* name as the operationId If you want to use your APIs' function names as `operationId`s, you can iterate over all of them and override each *path operation's* `operation_id` using their `APIRoute.name`. You should do it after adding all your *path operations*. ```Python hl_lines="2 12-21 24" {!../../../docs_src/path_operation_advanced_configuration/tutorial002.py!} ``` !!! tip If you manually call `app.openapi()`, you should update the `operationId`s before that. !!! warning If you do this, you have to make sure each one of your *path operation functions* has a unique name. Even if they are in different modules (Python files). ## Exclude from OpenAPI To exclude a *path operation* from the generated OpenAPI schema (and thus, from the automatic documentation systems), use the parameter `include_in_schema` and set it to `False`: ```Python hl_lines="6" {!../../../docs_src/path_operation_advanced_configuration/tutorial003.py!} ``` ## Advanced description from docstring You can limit the lines used from the docstring of a *path operation function* for OpenAPI. Adding an `\f` (an escaped "form feed" character) causes **FastAPI** to truncate the output used for OpenAPI at this point. It won't show up in the documentation, but other tools (such as Sphinx) will be able to use the rest. ```Python hl_lines="19-29" {!../../../docs_src/path_operation_advanced_configuration/tutorial004.py!} ``` ## Additional Responses You probably have seen how to declare the `response_model` and `status_code` for a *path operation*. That defines the metadata about the main response of a *path operation*. You can also declare additional responses with their models, status codes, etc. There's a whole chapter here in the documentation about it, you can read it at [Additional Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}. ## OpenAPI Extra When you declare a *path operation* in your application, **FastAPI** automatically generates the relevant metadata about that *path operation* to be included in the OpenAPI schema. !!! note "Technical details" In the OpenAPI specification it is called the Operation Object. It has all the information about the *path operation* and is used to generate the automatic documentation. It includes the `tags`, `parameters`, `requestBody`, `responses`, etc. This *path operation*-specific OpenAPI schema is normally generated automatically by **FastAPI**, but you can also extend it. !!! tip This is a low level extension point. If you only need to declare additional responses, a more convenient way to do it is with [Additional Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}. You can extend the OpenAPI schema for a *path operation* using the parameter `openapi_extra`. ### OpenAPI Extensions This `openapi_extra` can be helpful, for example, to declare [OpenAPI Extensions](https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.3.md#specificationExtensions): ```Python hl_lines="6" {!../../../docs_src/path_operation_advanced_configuration/tutorial005.py!} ``` If you open the automatic API docs, your extension will show up at the bottom of the specific *path operation*. And if you see the resulting OpenAPI (at `/openapi.json` in your API), you will see your extension as part of the specific *path operation* too: ```JSON hl_lines="22" { "openapi": "3.1.0", "info": { "title": "FastAPI", "version": "0.1.0" }, "paths": { "/items/": { "get": { "summary": "Read Items", "operationId": "read_items_items__get", "responses": { "200": { "description": "Successful Response", "content": { "application/json": { "schema": {} } } } }, "x-aperture-labs-portal": "blue" } } } } ``` ### Custom OpenAPI *path operation* schema The dictionary in `openapi_extra` will be deeply merged with the automatically generated OpenAPI schema for the *path operation*. So, you could add additional data to the automatically generated schema. For example, you could decide to read and validate the request with your own code, without using the automatic features of FastAPI with Pydantic, but you could still want to define the request in the OpenAPI schema. You could do that with `openapi_extra`: ```Python hl_lines="20-37 39-40" {!../../../docs_src/path_operation_advanced_configuration/tutorial006.py!} ``` In this example, we didn't declare any Pydantic model. In fact, the request body is not even parsed as JSON, it is read directly as `bytes`, and the function `magic_data_reader()` would be in charge of parsing it in some way. Nevertheless, we can declare the expected schema for the request body. ### Custom OpenAPI content type Using this same trick, you could use a Pydantic model to define the JSON Schema that is then included in the custom OpenAPI schema section for the *path operation*. And you could do this even if the data type in the request is not JSON. For example, in this application we don't use FastAPI's integrated functionality to extract the JSON Schema from Pydantic models nor the automatic validation for JSON. In fact, we are declaring the request content type as YAML, not JSON: === "Pydantic v2" ```Python hl_lines="17-22 24" {!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!} ``` === "Pydantic v1" ```Python hl_lines="17-22 24" {!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!} ``` !!! info In Pydantic version 1 the method to get the JSON Schema for a model was called `Item.schema()`, in Pydantic version 2, the method is called `Item.model_json_schema()`. Nevertheless, although we are not using the default integrated functionality, we are still using a Pydantic model to manually generate the JSON Schema for the data that we want to receive in YAML. Then we use the request directly, and extract the body as `bytes`. This means that FastAPI won't even try to parse the request payload as JSON. And then in our code, we parse that YAML content directly, and then we are again using the same Pydantic model to validate the YAML content: === "Pydantic v2" ```Python hl_lines="26-33" {!> ../../../docs_src/path_operation_advanced_configuration/tutorial007.py!} ``` === "Pydantic v1" ```Python hl_lines="26-33" {!> ../../../docs_src/path_operation_advanced_configuration/tutorial007_pv1.py!} ``` !!! info In Pydantic version 1 the method to parse and validate an object was `Item.parse_obj()`, in Pydantic version 2, the method is called `Item.model_validate()`. !!! tip Here we re-use the same Pydantic model. But the same way, we could have validated it in some other way. fastapi-0.110.3/docs/en/docs/advanced/response-change-status-code.md000066400000000000000000000027671461403617600252120ustar00rootroot00000000000000# Response - Change Status Code You probably read before that you can set a default [Response Status Code](../tutorial/response-status-code.md){.internal-link target=_blank}. But in some cases you need to return a different status code than the default. ## Use case For example, imagine that you want to return an HTTP status code of "OK" `200` by default. But if the data didn't exist, you want to create it, and return an HTTP status code of "CREATED" `201`. But you still want to be able to filter and convert the data you return with a `response_model`. For those cases, you can use a `Response` parameter. ## Use a `Response` parameter You can declare a parameter of type `Response` in your *path operation function* (as you can do for cookies and headers). And then you can set the `status_code` in that *temporal* response object. ```Python hl_lines="1 9 12" {!../../../docs_src/response_change_status_code/tutorial001.py!} ``` And then you can return any object you need, as you normally would (a `dict`, a database model, etc). And if you declared a `response_model`, it will still be used to filter and convert the object you returned. **FastAPI** will use that *temporal* response to extract the status code (also cookies and headers), and will put them in the final response that contains the value you returned, filtered by any `response_model`. You can also declare the `Response` parameter in dependencies, and set the status code in them. But keep in mind that the last one to be set will win. fastapi-0.110.3/docs/en/docs/advanced/response-cookies.md000066400000000000000000000043151461403617600231570ustar00rootroot00000000000000# Response Cookies ## Use a `Response` parameter You can declare a parameter of type `Response` in your *path operation function*. And then you can set cookies in that *temporal* response object. ```Python hl_lines="1 8-9" {!../../../docs_src/response_cookies/tutorial002.py!} ``` And then you can return any object you need, as you normally would (a `dict`, a database model, etc). And if you declared a `response_model`, it will still be used to filter and convert the object you returned. **FastAPI** will use that *temporal* response to extract the cookies (also headers and status code), and will put them in the final response that contains the value you returned, filtered by any `response_model`. You can also declare the `Response` parameter in dependencies, and set cookies (and headers) in them. ## Return a `Response` directly You can also create cookies when returning a `Response` directly in your code. To do that, you can create a response as described in [Return a Response Directly](response-directly.md){.internal-link target=_blank}. Then set Cookies in it, and then return it: ```Python hl_lines="10-12" {!../../../docs_src/response_cookies/tutorial001.py!} ``` !!! tip Keep in mind that if you return a response directly instead of using the `Response` parameter, FastAPI will return it directly. So, you will have to make sure your data is of the correct type. E.g. it is compatible with JSON, if you are returning a `JSONResponse`. And also that you are not sending any data that should have been filtered by a `response_model`. ### More info !!! note "Technical Details" You could also use `from starlette.responses import Response` or `from starlette.responses import JSONResponse`. **FastAPI** provides the same `starlette.responses` as `fastapi.responses` just as a convenience for you, the developer. But most of the available responses come directly from Starlette. And as the `Response` can be used frequently to set headers and cookies, **FastAPI** also provides it at `fastapi.Response`. To see all the available parameters and options, check the documentation in Starlette. fastapi-0.110.3/docs/en/docs/advanced/response-directly.md000066400000000000000000000057641461403617600233530ustar00rootroot00000000000000# Return a Response Directly When you create a **FastAPI** *path operation* you can normally return any data from it: a `dict`, a `list`, a Pydantic model, a database model, etc. By default, **FastAPI** would automatically convert that return value to JSON using the `jsonable_encoder` explained in [JSON Compatible Encoder](../tutorial/encoder.md){.internal-link target=_blank}. Then, behind the scenes, it would put that JSON-compatible data (e.g. a `dict`) inside of a `JSONResponse` that would be used to send the response to the client. But you can return a `JSONResponse` directly from your *path operations*. It might be useful, for example, to return custom headers or cookies. ## Return a `Response` In fact, you can return any `Response` or any sub-class of it. !!! tip `JSONResponse` itself is a sub-class of `Response`. And when you return a `Response`, **FastAPI** will pass it directly. It won't do any data conversion with Pydantic models, it won't convert the contents to any type, etc. This gives you a lot of flexibility. You can return any data type, override any data declaration or validation, etc. ## Using the `jsonable_encoder` in a `Response` Because **FastAPI** doesn't do any change to a `Response` you return, you have to make sure it's contents are ready for it. For example, you cannot put a Pydantic model in a `JSONResponse` without first converting it to a `dict` with all the data types (like `datetime`, `UUID`, etc) converted to JSON-compatible types. For those cases, you can use the `jsonable_encoder` to convert your data before passing it to a response: ```Python hl_lines="6-7 21-22" {!../../../docs_src/response_directly/tutorial001.py!} ``` !!! note "Technical Details" You could also use `from starlette.responses import JSONResponse`. **FastAPI** provides the same `starlette.responses` as `fastapi.responses` just as a convenience for you, the developer. But most of the available responses come directly from Starlette. ## Returning a custom `Response` The example above shows all the parts you need, but it's not very useful yet, as you could have just returned the `item` directly, and **FastAPI** would put it in a `JSONResponse` for you, converting it to a `dict`, etc. All that by default. Now, let's see how you could use that to return a custom response. Let's say that you want to return an XML response. You could put your XML content in a string, put it in a `Response`, and return it: ```Python hl_lines="1 18" {!../../../docs_src/response_directly/tutorial002.py!} ``` ## Notes When you return a `Response` directly its data is not validated, converted (serialized), nor documented automatically. But you can still document it as described in [Additional Responses in OpenAPI](additional-responses.md){.internal-link target=_blank}. You can see in later sections how to use/declare these custom `Response`s while still having automatic data conversion, documentation, etc. fastapi-0.110.3/docs/en/docs/advanced/response-headers.md000066400000000000000000000043651461403617600231430ustar00rootroot00000000000000# Response Headers ## Use a `Response` parameter You can declare a parameter of type `Response` in your *path operation function* (as you can do for cookies). And then you can set headers in that *temporal* response object. ```Python hl_lines="1 7-8" {!../../../docs_src/response_headers/tutorial002.py!} ``` And then you can return any object you need, as you normally would (a `dict`, a database model, etc). And if you declared a `response_model`, it will still be used to filter and convert the object you returned. **FastAPI** will use that *temporal* response to extract the headers (also cookies and status code), and will put them in the final response that contains the value you returned, filtered by any `response_model`. You can also declare the `Response` parameter in dependencies, and set headers (and cookies) in them. ## Return a `Response` directly You can also add headers when you return a `Response` directly. Create a response as described in [Return a Response Directly](response-directly.md){.internal-link target=_blank} and pass the headers as an additional parameter: ```Python hl_lines="10-12" {!../../../docs_src/response_headers/tutorial001.py!} ``` !!! note "Technical Details" You could also use `from starlette.responses import Response` or `from starlette.responses import JSONResponse`. **FastAPI** provides the same `starlette.responses` as `fastapi.responses` just as a convenience for you, the developer. But most of the available responses come directly from Starlette. And as the `Response` can be used frequently to set headers and cookies, **FastAPI** also provides it at `fastapi.Response`. ## Custom Headers Keep in mind that custom proprietary headers can be added using the 'X-' prefix. But if you have custom headers that you want a client in a browser to be able to see, you need to add them to your CORS configurations (read more in [CORS (Cross-Origin Resource Sharing)](../tutorial/cors.md){.internal-link target=_blank}), using the parameter `expose_headers` documented in Starlette's CORS docs. fastapi-0.110.3/docs/en/docs/advanced/security/000077500000000000000000000000001461403617600212115ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/advanced/security/http-basic-auth.md000066400000000000000000000136361461403617600245410ustar00rootroot00000000000000# HTTP Basic Auth For the simplest cases, you can use HTTP Basic Auth. In HTTP Basic Auth, the application expects a header that contains a username and a password. If it doesn't receive it, it returns an HTTP 401 "Unauthorized" error. And returns a header `WWW-Authenticate` with a value of `Basic`, and an optional `realm` parameter. That tells the browser to show the integrated prompt for a username and password. Then, when you type that username and password, the browser sends them in the header automatically. ## Simple HTTP Basic Auth * Import `HTTPBasic` and `HTTPBasicCredentials`. * Create a "`security` scheme" using `HTTPBasic`. * Use that `security` with a dependency in your *path operation*. * It returns an object of type `HTTPBasicCredentials`: * It contains the `username` and `password` sent. === "Python 3.9+" ```Python hl_lines="4 8 12" {!> ../../../docs_src/security/tutorial006_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="2 7 11" {!> ../../../docs_src/security/tutorial006_an.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="2 6 10" {!> ../../../docs_src/security/tutorial006.py!} ``` When you try to open the URL for the first time (or click the "Execute" button in the docs) the browser will ask you for your username and password: ## Check the username Here's a more complete example. Use a dependency to check if the username and password are correct. For this, use the Python standard module `secrets` to check the username and password. `secrets.compare_digest()` needs to take `bytes` or a `str` that only contains ASCII characters (the ones in English), this means it wouldn't work with characters like `á`, as in `Sebastián`. To handle that, we first convert the `username` and `password` to `bytes` encoding them with UTF-8. Then we can use `secrets.compare_digest()` to ensure that `credentials.username` is `"stanleyjobson"`, and that `credentials.password` is `"swordfish"`. === "Python 3.9+" ```Python hl_lines="1 12-24" {!> ../../../docs_src/security/tutorial007_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1 12-24" {!> ../../../docs_src/security/tutorial007_an.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="1 11-21" {!> ../../../docs_src/security/tutorial007.py!} ``` This would be similar to: ```Python if not (credentials.username == "stanleyjobson") or not (credentials.password == "swordfish"): # Return some error ... ``` But by using the `secrets.compare_digest()` it will be secure against a type of attacks called "timing attacks". ### Timing Attacks But what's a "timing attack"? Let's imagine some attackers are trying to guess the username and password. And they send a request with a username `johndoe` and a password `love123`. Then the Python code in your application would be equivalent to something like: ```Python if "johndoe" == "stanleyjobson" and "love123" == "swordfish": ... ``` But right at the moment Python compares the first `j` in `johndoe` to the first `s` in `stanleyjobson`, it will return `False`, because it already knows that those two strings are not the same, thinking that "there's no need to waste more computation comparing the rest of the letters". And your application will say "Incorrect username or password". But then the attackers try with username `stanleyjobsox` and password `love123`. And your application code does something like: ```Python if "stanleyjobsox" == "stanleyjobson" and "love123" == "swordfish": ... ``` Python will have to compare the whole `stanleyjobso` in both `stanleyjobsox` and `stanleyjobson` before realizing that both strings are not the same. So it will take some extra microseconds to reply back "Incorrect username or password". #### The time to answer helps the attackers At that point, by noticing that the server took some microseconds longer to send the "Incorrect username or password" response, the attackers will know that they got _something_ right, some of the initial letters were right. And then they can try again knowing that it's probably something more similar to `stanleyjobsox` than to `johndoe`. #### A "professional" attack Of course, the attackers would not try all this by hand, they would write a program to do it, possibly with thousands or millions of tests per second. And would get just one extra correct letter at a time. But doing that, in some minutes or hours the attackers would have guessed the correct username and password, with the "help" of our application, just using the time taken to answer. #### Fix it with `secrets.compare_digest()` But in our code we are actually using `secrets.compare_digest()`. In short, it will take the same time to compare `stanleyjobsox` to `stanleyjobson` than it takes to compare `johndoe` to `stanleyjobson`. And the same for the password. That way, using `secrets.compare_digest()` in your application code, it will be safe against this whole range of security attacks. ### Return the error After detecting that the credentials are incorrect, return an `HTTPException` with a status code 401 (the same returned when no credentials are provided) and add the header `WWW-Authenticate` to make the browser show the login prompt again: === "Python 3.9+" ```Python hl_lines="26-30" {!> ../../../docs_src/security/tutorial007_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="26-30" {!> ../../../docs_src/security/tutorial007_an.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="23-27" {!> ../../../docs_src/security/tutorial007.py!} ``` fastapi-0.110.3/docs/en/docs/advanced/security/index.md000066400000000000000000000011711461403617600226420ustar00rootroot00000000000000# Advanced Security ## Additional Features There are some extra features to handle security apart from the ones covered in the [Tutorial - User Guide: Security](../../tutorial/security/index.md){.internal-link target=_blank}. !!! tip The next sections are **not necessarily "advanced"**. And it's possible that for your use case, the solution is in one of them. ## Read the Tutorial first The next sections assume you already read the main [Tutorial - User Guide: Security](../../tutorial/security/index.md){.internal-link target=_blank}. They are all based on the same concepts, but allow some extra functionalities. fastapi-0.110.3/docs/en/docs/advanced/security/oauth2-scopes.md000066400000000000000000000507211461403617600242340ustar00rootroot00000000000000# OAuth2 scopes You can use OAuth2 scopes directly with **FastAPI**, they are integrated to work seamlessly. This would allow you to have a more fine-grained permission system, following the OAuth2 standard, integrated into your OpenAPI application (and the API docs). OAuth2 with scopes is the mechanism used by many big authentication providers, like Facebook, Google, GitHub, Microsoft, Twitter, etc. They use it to provide specific permissions to users and applications. Every time you "log in with" Facebook, Google, GitHub, Microsoft, Twitter, that application is using OAuth2 with scopes. In this section you will see how to manage authentication and authorization with the same OAuth2 with scopes in your **FastAPI** application. !!! warning This is a more or less advanced section. If you are just starting, you can skip it. You don't necessarily need OAuth2 scopes, and you can handle authentication and authorization however you want. But OAuth2 with scopes can be nicely integrated into your API (with OpenAPI) and your API docs. Nevertheless, you still enforce those scopes, or any other security/authorization requirement, however you need, in your code. In many cases, OAuth2 with scopes can be an overkill. But if you know you need it, or you are curious, keep reading. ## OAuth2 scopes and OpenAPI The OAuth2 specification defines "scopes" as a list of strings separated by spaces. The content of each of these strings can have any format, but should not contain spaces. These scopes represent "permissions". In OpenAPI (e.g. the API docs), you can define "security schemes". When one of these security schemes uses OAuth2, you can also declare and use scopes. Each "scope" is just a string (without spaces). They are normally used to declare specific security permissions, for example: * `users:read` or `users:write` are common examples. * `instagram_basic` is used by Facebook / Instagram. * `https://www.googleapis.com/auth/drive` is used by Google. !!! info In OAuth2 a "scope" is just a string that declares a specific permission required. It doesn't matter if it has other characters like `:` or if it is a URL. Those details are implementation specific. For OAuth2 they are just strings. ## Global view First, let's quickly see the parts that change from the examples in the main **Tutorial - User Guide** for [OAuth2 with Password (and hashing), Bearer with JWT tokens](../../tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. Now using OAuth2 scopes: === "Python 3.10+" ```Python hl_lines="4 8 12 46 64 105 107-115 121-124 128-134 139 155" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="2 4 8 12 47 65 106 108-116 122-125 129-135 140 156" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="3 7 11 45 63 104 106-114 120-123 127-133 138 154" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="2 4 8 12 46 64 105 107-115 121-124 128-134 139 155" {!> ../../../docs_src/security/tutorial005.py!} ``` Now let's review those changes step by step. ## OAuth2 Security scheme The first change is that now we are declaring the OAuth2 security scheme with two available scopes, `me` and `items`. The `scopes` parameter receives a `dict` with each scope as a key and the description as the value: === "Python 3.10+" ```Python hl_lines="62-65" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="62-65" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="63-66" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="61-64" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="62-65" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="62-65" {!> ../../../docs_src/security/tutorial005.py!} ``` Because we are now declaring those scopes, they will show up in the API docs when you log-in/authorize. And you will be able to select which scopes you want to give access to: `me` and `items`. This is the same mechanism used when you give permissions while logging in with Facebook, Google, GitHub, etc: ## JWT token with scopes Now, modify the token *path operation* to return the scopes requested. We are still using the same `OAuth2PasswordRequestForm`. It includes a property `scopes` with a `list` of `str`, with each scope it received in the request. And we return the scopes as part of the JWT token. !!! danger For simplicity, here we are just adding the scopes received directly to the token. But in your application, for security, you should make sure you only add the scopes that the user is actually able to have, or the ones you have predefined. === "Python 3.10+" ```Python hl_lines="155" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="155" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="156" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="154" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="155" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="155" {!> ../../../docs_src/security/tutorial005.py!} ``` ## Declare scopes in *path operations* and dependencies Now we declare that the *path operation* for `/users/me/items/` requires the scope `items`. For this, we import and use `Security` from `fastapi`. You can use `Security` to declare dependencies (just like `Depends`), but `Security` also receives a parameter `scopes` with a list of scopes (strings). In this case, we pass a dependency function `get_current_active_user` to `Security` (the same way we would do with `Depends`). But we also pass a `list` of scopes, in this case with just one scope: `items` (it could have more). And the dependency function `get_current_active_user` can also declare sub-dependencies, not only with `Depends` but also with `Security`. Declaring its own sub-dependency function (`get_current_user`), and more scope requirements. In this case, it requires the scope `me` (it could require more than one scope). !!! note You don't necessarily need to add different scopes in different places. We are doing it here to demonstrate how **FastAPI** handles scopes declared at different levels. === "Python 3.10+" ```Python hl_lines="4 139 170" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="4 139 170" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="4 140 171" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="3 138 167" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="4 139 168" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="4 139 168" {!> ../../../docs_src/security/tutorial005.py!} ``` !!! info "Technical Details" `Security` is actually a subclass of `Depends`, and it has just one extra parameter that we'll see later. But by using `Security` instead of `Depends`, **FastAPI** will know that it can declare security scopes, use them internally, and document the API with OpenAPI. But when you import `Query`, `Path`, `Depends`, `Security` and others from `fastapi`, those are actually functions that return special classes. ## Use `SecurityScopes` Now update the dependency `get_current_user`. This is the one used by the dependencies above. Here's were we are using the same OAuth2 scheme we created before, declaring it as a dependency: `oauth2_scheme`. Because this dependency function doesn't have any scope requirements itself, we can use `Depends` with `oauth2_scheme`, we don't have to use `Security` when we don't need to specify security scopes. We also declare a special parameter of type `SecurityScopes`, imported from `fastapi.security`. This `SecurityScopes` class is similar to `Request` (`Request` was used to get the request object directly). === "Python 3.10+" ```Python hl_lines="8 105" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="8 105" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="8 106" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="7 104" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="8 105" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="8 105" {!> ../../../docs_src/security/tutorial005.py!} ``` ## Use the `scopes` The parameter `security_scopes` will be of type `SecurityScopes`. It will have a property `scopes` with a list containing all the scopes required by itself and all the dependencies that use this as a sub-dependency. That means, all the "dependants"... this might sound confusing, it is explained again later below. The `security_scopes` object (of class `SecurityScopes`) also provides a `scope_str` attribute with a single string, containing those scopes separated by spaces (we are going to use it). We create an `HTTPException` that we can re-use (`raise`) later at several points. In this exception, we include the scopes required (if any) as a string separated by spaces (using `scope_str`). We put that string containing the scopes in the `WWW-Authenticate` header (this is part of the spec). === "Python 3.10+" ```Python hl_lines="105 107-115" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="105 107-115" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="106 108-116" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="104 106-114" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="105 107-115" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="105 107-115" {!> ../../../docs_src/security/tutorial005.py!} ``` ## Verify the `username` and data shape We verify that we get a `username`, and extract the scopes. And then we validate that data with the Pydantic model (catching the `ValidationError` exception), and if we get an error reading the JWT token or validating the data with Pydantic, we raise the `HTTPException` we created before. For that, we update the Pydantic model `TokenData` with a new property `scopes`. By validating the data with Pydantic we can make sure that we have, for example, exactly a `list` of `str` with the scopes and a `str` with the `username`. Instead of, for example, a `dict`, or something else, as it could break the application at some point later, making it a security risk. We also verify that we have a user with that username, and if not, we raise that same exception we created before. === "Python 3.10+" ```Python hl_lines="46 116-127" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="46 116-127" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="47 117-128" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="45 115-126" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="46 116-127" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="46 116-127" {!> ../../../docs_src/security/tutorial005.py!} ``` ## Verify the `scopes` We now verify that all the scopes required, by this dependency and all the dependants (including *path operations*), are included in the scopes provided in the token received, otherwise raise an `HTTPException`. For this, we use `security_scopes.scopes`, that contains a `list` with all these scopes as `str`. === "Python 3.10+" ```Python hl_lines="128-134" {!> ../../../docs_src/security/tutorial005_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="128-134" {!> ../../../docs_src/security/tutorial005_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="129-135" {!> ../../../docs_src/security/tutorial005_an.py!} ``` === "Python 3.10+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="127-133" {!> ../../../docs_src/security/tutorial005_py310.py!} ``` === "Python 3.9+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="128-134" {!> ../../../docs_src/security/tutorial005_py39.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="128-134" {!> ../../../docs_src/security/tutorial005.py!} ``` ## Dependency tree and scopes Let's review again this dependency tree and the scopes. As the `get_current_active_user` dependency has as a sub-dependency on `get_current_user`, the scope `"me"` declared at `get_current_active_user` will be included in the list of required scopes in the `security_scopes.scopes` passed to `get_current_user`. The *path operation* itself also declares a scope, `"items"`, so this will also be in the list of `security_scopes.scopes` passed to `get_current_user`. Here's how the hierarchy of dependencies and scopes looks like: * The *path operation* `read_own_items` has: * Required scopes `["items"]` with the dependency: * `get_current_active_user`: * The dependency function `get_current_active_user` has: * Required scopes `["me"]` with the dependency: * `get_current_user`: * The dependency function `get_current_user` has: * No scopes required by itself. * A dependency using `oauth2_scheme`. * A `security_scopes` parameter of type `SecurityScopes`: * This `security_scopes` parameter has a property `scopes` with a `list` containing all these scopes declared above, so: * `security_scopes.scopes` will contain `["me", "items"]` for the *path operation* `read_own_items`. * `security_scopes.scopes` will contain `["me"]` for the *path operation* `read_users_me`, because it is declared in the dependency `get_current_active_user`. * `security_scopes.scopes` will contain `[]` (nothing) for the *path operation* `read_system_status`, because it didn't declare any `Security` with `scopes`, and its dependency, `get_current_user`, doesn't declare any `scope` either. !!! tip The important and "magic" thing here is that `get_current_user` will have a different list of `scopes` to check for each *path operation*. All depending on the `scopes` declared in each *path operation* and each dependency in the dependency tree for that specific *path operation*. ## More details about `SecurityScopes` You can use `SecurityScopes` at any point, and in multiple places, it doesn't have to be at the "root" dependency. It will always have the security scopes declared in the current `Security` dependencies and all the dependants for **that specific** *path operation* and **that specific** dependency tree. Because the `SecurityScopes` will have all the scopes declared by dependants, you can use it to verify that a token has the required scopes in a central dependency function, and then declare different scope requirements in different *path operations*. They will be checked independently for each *path operation*. ## Check it If you open the API docs, you can authenticate and specify which scopes you want to authorize. If you don't select any scope, you will be "authenticated", but when you try to access `/users/me/` or `/users/me/items/` you will get an error saying that you don't have enough permissions. You will still be able to access `/status/`. And if you select the scope `me` but not the scope `items`, you will be able to access `/users/me/` but not `/users/me/items/`. That's what would happen to a third party application that tried to access one of these *path operations* with a token provided by a user, depending on how many permissions the user gave the application. ## About third party integrations In this example we are using the OAuth2 "password" flow. This is appropriate when we are logging in to our own application, probably with our own frontend. Because we can trust it to receive the `username` and `password`, as we control it. But if you are building an OAuth2 application that others would connect to (i.e., if you are building an authentication provider equivalent to Facebook, Google, GitHub, etc.) you should use one of the other flows. The most common is the implicit flow. The most secure is the code flow, but is more complex to implement as it requires more steps. As it is more complex, many providers end up suggesting the implicit flow. !!! note It's common that each authentication provider names their flows in a different way, to make it part of their brand. But in the end, they are implementing the same OAuth2 standard. **FastAPI** includes utilities for all these OAuth2 authentication flows in `fastapi.security.oauth2`. ## `Security` in decorator `dependencies` The same way you can define a `list` of `Depends` in the decorator's `dependencies` parameter (as explained in [Dependencies in path operation decorators](../../tutorial/dependencies/dependencies-in-path-operation-decorators.md){.internal-link target=_blank}), you could also use `Security` with `scopes` there. fastapi-0.110.3/docs/en/docs/advanced/settings.md000066400000000000000000000373221461403617600215330ustar00rootroot00000000000000# Settings and Environment Variables In many cases your application could need some external settings or configurations, for example secret keys, database credentials, credentials for email services, etc. Most of these settings are variable (can change), like database URLs. And many could be sensitive, like secrets. For this reason it's common to provide them in environment variables that are read by the application. ## Environment Variables !!! tip If you already know what "environment variables" are and how to use them, feel free to skip to the next section below. An environment variable (also known as "env var") is a variable that lives outside of the Python code, in the operating system, and could be read by your Python code (or by other programs as well). You can create and use environment variables in the shell, without needing Python: === "Linux, macOS, Windows Bash"
```console // You could create an env var MY_NAME with $ export MY_NAME="Wade Wilson" // Then you could use it with other programs, like $ echo "Hello $MY_NAME" Hello Wade Wilson ```
=== "Windows PowerShell"
```console // Create an env var MY_NAME $ $Env:MY_NAME = "Wade Wilson" // Use it with other programs, like $ echo "Hello $Env:MY_NAME" Hello Wade Wilson ```
### Read env vars in Python You could also create environment variables outside of Python, in the terminal (or with any other method), and then read them in Python. For example you could have a file `main.py` with: ```Python hl_lines="3" import os name = os.getenv("MY_NAME", "World") print(f"Hello {name} from Python") ``` !!! tip The second argument to `os.getenv()` is the default value to return. If not provided, it's `None` by default, here we provide `"World"` as the default value to use. Then you could call that Python program:
```console // Here we don't set the env var yet $ python main.py // As we didn't set the env var, we get the default value Hello World from Python // But if we create an environment variable first $ export MY_NAME="Wade Wilson" // And then call the program again $ python main.py // Now it can read the environment variable Hello Wade Wilson from Python ```
As environment variables can be set outside of the code, but can be read by the code, and don't have to be stored (committed to `git`) with the rest of the files, it's common to use them for configurations or settings. You can also create an environment variable only for a specific program invocation, that is only available to that program, and only for its duration. To do that, create it right before the program itself, on the same line:
```console // Create an env var MY_NAME in line for this program call $ MY_NAME="Wade Wilson" python main.py // Now it can read the environment variable Hello Wade Wilson from Python // The env var no longer exists afterwards $ python main.py Hello World from Python ```
!!! tip You can read more about it at The Twelve-Factor App: Config. ### Types and validation These environment variables can only handle text strings, as they are external to Python and have to be compatible with other programs and the rest of the system (and even with different operating systems, as Linux, Windows, macOS). That means that any value read in Python from an environment variable will be a `str`, and any conversion to a different type or validation has to be done in code. ## Pydantic `Settings` Fortunately, Pydantic provides a great utility to handle these settings coming from environment variables with Pydantic: Settings management. ### Install `pydantic-settings` First, install the `pydantic-settings` package:
```console $ pip install pydantic-settings ---> 100% ```
It also comes included when you install the `all` extras with:
```console $ pip install "fastapi[all]" ---> 100% ```
!!! info In Pydantic v1 it came included with the main package. Now it is distributed as this independent package so that you can choose to install it or not if you don't need that functionality. ### Create the `Settings` object Import `BaseSettings` from Pydantic and create a sub-class, very much like with a Pydantic model. The same way as with Pydantic models, you declare class attributes with type annotations, and possibly default values. You can use all the same validation features and tools you use for Pydantic models, like different data types and additional validations with `Field()`. === "Pydantic v2" ```Python hl_lines="2 5-8 11" {!> ../../../docs_src/settings/tutorial001.py!} ``` === "Pydantic v1" !!! info In Pydantic v1 you would import `BaseSettings` directly from `pydantic` instead of from `pydantic_settings`. ```Python hl_lines="2 5-8 11" {!> ../../../docs_src/settings/tutorial001_pv1.py!} ``` !!! tip If you want something quick to copy and paste, don't use this example, use the last one below. Then, when you create an instance of that `Settings` class (in this case, in the `settings` object), Pydantic will read the environment variables in a case-insensitive way, so, an upper-case variable `APP_NAME` will still be read for the attribute `app_name`. Next it will convert and validate the data. So, when you use that `settings` object, you will have data of the types you declared (e.g. `items_per_user` will be an `int`). ### Use the `settings` Then you can use the new `settings` object in your application: ```Python hl_lines="18-20" {!../../../docs_src/settings/tutorial001.py!} ``` ### Run the server Next, you would run the server passing the configurations as environment variables, for example you could set an `ADMIN_EMAIL` and `APP_NAME` with:
```console $ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" uvicorn main:app INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
!!! tip To set multiple env vars for a single command just separate them with a space, and put them all before the command. And then the `admin_email` setting would be set to `"deadpool@example.com"`. The `app_name` would be `"ChimichangApp"`. And the `items_per_user` would keep its default value of `50`. ## Settings in another module You could put those settings in another module file as you saw in [Bigger Applications - Multiple Files](../tutorial/bigger-applications.md){.internal-link target=_blank}. For example, you could have a file `config.py` with: ```Python {!../../../docs_src/settings/app01/config.py!} ``` And then use it in a file `main.py`: ```Python hl_lines="3 11-13" {!../../../docs_src/settings/app01/main.py!} ``` !!! tip You would also need a file `__init__.py` as you saw in [Bigger Applications - Multiple Files](../tutorial/bigger-applications.md){.internal-link target=_blank}. ## Settings in a dependency In some occasions it might be useful to provide the settings from a dependency, instead of having a global object with `settings` that is used everywhere. This could be especially useful during testing, as it's very easy to override a dependency with your own custom settings. ### The config file Coming from the previous example, your `config.py` file could look like: ```Python hl_lines="10" {!../../../docs_src/settings/app02/config.py!} ``` Notice that now we don't create a default instance `settings = Settings()`. ### The main app file Now we create a dependency that returns a new `config.Settings()`. === "Python 3.9+" ```Python hl_lines="6 12-13" {!> ../../../docs_src/settings/app02_an_py39/main.py!} ``` === "Python 3.8+" ```Python hl_lines="6 12-13" {!> ../../../docs_src/settings/app02_an/main.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="5 11-12" {!> ../../../docs_src/settings/app02/main.py!} ``` !!! tip We'll discuss the `@lru_cache` in a bit. For now you can assume `get_settings()` is a normal function. And then we can require it from the *path operation function* as a dependency and use it anywhere we need it. === "Python 3.9+" ```Python hl_lines="17 19-21" {!> ../../../docs_src/settings/app02_an_py39/main.py!} ``` === "Python 3.8+" ```Python hl_lines="17 19-21" {!> ../../../docs_src/settings/app02_an/main.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="16 18-20" {!> ../../../docs_src/settings/app02/main.py!} ``` ### Settings and testing Then it would be very easy to provide a different settings object during testing by creating a dependency override for `get_settings`: ```Python hl_lines="9-10 13 21" {!../../../docs_src/settings/app02/test_main.py!} ``` In the dependency override we set a new value for the `admin_email` when creating the new `Settings` object, and then we return that new object. Then we can test that it is used. ## Reading a `.env` file If you have many settings that possibly change a lot, maybe in different environments, it might be useful to put them on a file and then read them from it as if they were environment variables. This practice is common enough that it has a name, these environment variables are commonly placed in a file `.env`, and the file is called a "dotenv". !!! tip A file starting with a dot (`.`) is a hidden file in Unix-like systems, like Linux and macOS. But a dotenv file doesn't really have to have that exact filename. Pydantic has support for reading from these types of files using an external library. You can read more at Pydantic Settings: Dotenv (.env) support. !!! tip For this to work, you need to `pip install python-dotenv`. ### The `.env` file You could have a `.env` file with: ```bash ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" ``` ### Read settings from `.env` And then update your `config.py` with: === "Pydantic v2" ```Python hl_lines="9" {!> ../../../docs_src/settings/app03_an/config.py!} ``` !!! tip The `model_config` attribute is used just for Pydantic configuration. You can read more at Pydantic Model Config. === "Pydantic v1" ```Python hl_lines="9-10" {!> ../../../docs_src/settings/app03_an/config_pv1.py!} ``` !!! tip The `Config` class is used just for Pydantic configuration. You can read more at Pydantic Model Config. !!! info In Pydantic version 1 the configuration was done in an internal class `Config`, in Pydantic version 2 it's done in an attribute `model_config`. This attribute takes a `dict`, and to get autocompletion and inline errors you can import and use `SettingsConfigDict` to define that `dict`. Here we define the config `env_file` inside of your Pydantic `Settings` class, and set the value to the filename with the dotenv file we want to use. ### Creating the `Settings` only once with `lru_cache` Reading a file from disk is normally a costly (slow) operation, so you probably want to do it only once and then re-use the same settings object, instead of reading it for each request. But every time we do: ```Python Settings() ``` a new `Settings` object would be created, and at creation it would read the `.env` file again. If the dependency function was just like: ```Python def get_settings(): return Settings() ``` we would create that object for each request, and we would be reading the `.env` file for each request. ⚠️ But as we are using the `@lru_cache` decorator on top, the `Settings` object will be created only once, the first time it's called. ✔️ === "Python 3.9+" ```Python hl_lines="1 11" {!> ../../../docs_src/settings/app03_an_py39/main.py!} ``` === "Python 3.8+" ```Python hl_lines="1 11" {!> ../../../docs_src/settings/app03_an/main.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="1 10" {!> ../../../docs_src/settings/app03/main.py!} ``` Then for any subsequent calls of `get_settings()` in the dependencies for the next requests, instead of executing the internal code of `get_settings()` and creating a new `Settings` object, it will return the same object that was returned on the first call, again and again. #### `lru_cache` Technical Details `@lru_cache` modifies the function it decorates to return the same value that was returned the first time, instead of computing it again, executing the code of the function every time. So, the function below it will be executed once for each combination of arguments. And then the values returned by each of those combinations of arguments will be used again and again whenever the function is called with exactly the same combination of arguments. For example, if you have a function: ```Python @lru_cache def say_hi(name: str, salutation: str = "Ms."): return f"Hello {salutation} {name}" ``` your program could execute like this: ```mermaid sequenceDiagram participant code as Code participant function as say_hi() participant execute as Execute function rect rgba(0, 255, 0, .1) code ->> function: say_hi(name="Camila") function ->> execute: execute function code execute ->> code: return the result end rect rgba(0, 255, 255, .1) code ->> function: say_hi(name="Camila") function ->> code: return stored result end rect rgba(0, 255, 0, .1) code ->> function: say_hi(name="Rick") function ->> execute: execute function code execute ->> code: return the result end rect rgba(0, 255, 0, .1) code ->> function: say_hi(name="Rick", salutation="Mr.") function ->> execute: execute function code execute ->> code: return the result end rect rgba(0, 255, 255, .1) code ->> function: say_hi(name="Rick") function ->> code: return stored result end rect rgba(0, 255, 255, .1) code ->> function: say_hi(name="Camila") function ->> code: return stored result end ``` In the case of our dependency `get_settings()`, the function doesn't even take any arguments, so it always returns the same value. That way, it behaves almost as if it was just a global variable. But as it uses a dependency function, then we can override it easily for testing. `@lru_cache` is part of `functools` which is part of Python's standard library, you can read more about it in the Python docs for `@lru_cache`. ## Recap You can use Pydantic Settings to handle the settings or configurations for your application, with all the power of Pydantic models. * By using a dependency you can simplify testing. * You can use `.env` files with it. * Using `@lru_cache` lets you avoid reading the dotenv file again and again for each request, while allowing you to override it during testing. fastapi-0.110.3/docs/en/docs/advanced/sub-applications.md000066400000000000000000000056361461403617600231530ustar00rootroot00000000000000# Sub Applications - Mounts If you need to have two independent FastAPI applications, with their own independent OpenAPI and their own docs UIs, you can have a main app and "mount" one (or more) sub-application(s). ## Mounting a **FastAPI** application "Mounting" means adding a completely "independent" application in a specific path, that then takes care of handling everything under that path, with the _path operations_ declared in that sub-application. ### Top-level application First, create the main, top-level, **FastAPI** application, and its *path operations*: ```Python hl_lines="3 6-8" {!../../../docs_src/sub_applications/tutorial001.py!} ``` ### Sub-application Then, create your sub-application, and its *path operations*. This sub-application is just another standard FastAPI application, but this is the one that will be "mounted": ```Python hl_lines="11 14-16" {!../../../docs_src/sub_applications/tutorial001.py!} ``` ### Mount the sub-application In your top-level application, `app`, mount the sub-application, `subapi`. In this case, it will be mounted at the path `/subapi`: ```Python hl_lines="11 19" {!../../../docs_src/sub_applications/tutorial001.py!} ``` ### Check the automatic API docs Now, run `uvicorn` with the main app, if your file is `main.py`, it would be:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
And open the docs at http://127.0.0.1:8000/docs. You will see the automatic API docs for the main app, including only its own _path operations_: And then, open the docs for the sub-application, at http://127.0.0.1:8000/subapi/docs. You will see the automatic API docs for the sub-application, including only its own _path operations_, all under the correct sub-path prefix `/subapi`: If you try interacting with any of the two user interfaces, they will work correctly, because the browser will be able to talk to each specific app or sub-app. ### Technical Details: `root_path` When you mount a sub-application as described above, FastAPI will take care of communicating the mount path for the sub-application using a mechanism from the ASGI specification called a `root_path`. That way, the sub-application will know to use that path prefix for the docs UI. And the sub-application could also have its own mounted sub-applications and everything would work correctly, because FastAPI handles all these `root_path`s automatically. You will learn more about the `root_path` and how to use it explicitly in the section about [Behind a Proxy](behind-a-proxy.md){.internal-link target=_blank}. fastapi-0.110.3/docs/en/docs/advanced/templates.md000066400000000000000000000063301461403617600216640ustar00rootroot00000000000000# Templates You can use any template engine you want with **FastAPI**. A common choice is Jinja2, the same one used by Flask and other tools. There are utilities to configure it easily that you can use directly in your **FastAPI** application (provided by Starlette). ## Install dependencies Install `jinja2`:
```console $ pip install jinja2 ---> 100% ```
## Using `Jinja2Templates` * Import `Jinja2Templates`. * Create a `templates` object that you can re-use later. * Declare a `Request` parameter in the *path operation* that will return a template. * Use the `templates` you created to render and return a `TemplateResponse`, pass the name of the template, the request object, and a "context" dictionary with key-value pairs to be used inside of the Jinja2 template. ```Python hl_lines="4 11 15-18" {!../../../docs_src/templates/tutorial001.py!} ``` !!! note Before FastAPI 0.108.0, Starlette 0.29.0, the `name` was the first parameter. Also, before that, in previous versions, the `request` object was passed as part of the key-value pairs in the context for Jinja2. !!! tip By declaring `response_class=HTMLResponse` the docs UI will be able to know that the response will be HTML. !!! note "Technical Details" You could also use `from starlette.templating import Jinja2Templates`. **FastAPI** provides the same `starlette.templating` as `fastapi.templating` just as a convenience for you, the developer. But most of the available responses come directly from Starlette. The same with `Request` and `StaticFiles`. ## Writing templates Then you can write a template at `templates/item.html` with, for example: ```jinja hl_lines="7" {!../../../docs_src/templates/templates/item.html!} ``` ### Template Context Values In the HTML that contains: {% raw %} ```jinja Item ID: {{ id }} ``` {% endraw %} ...it will show the `id` taken from the "context" `dict` you passed: ```Python {"id": id} ``` For example, with an ID of `42`, this would render: ```html Item ID: 42 ``` ### Template `url_for` Arguments You can also use `url_for()` inside of the template, it takes as arguments the same arguments that would be used by your *path operation function*. So, the section with: {% raw %} ```jinja ``` {% endraw %} ...will generate a link to the same URL that would be handled by the *path operation function* `read_item(id=id)`. For example, with an ID of `42`, this would render: ```html ``` ## Templates and static files You can also use `url_for()` inside of the template, and use it, for example, with the `StaticFiles` you mounted with the `name="static"`. ```jinja hl_lines="4" {!../../../docs_src/templates/templates/item.html!} ``` In this example, it would link to a CSS file at `static/styles.css` with: ```CSS hl_lines="4" {!../../../docs_src/templates/static/styles.css!} ``` And because you are using `StaticFiles`, that CSS file would be served automatically by your **FastAPI** application at the URL `/static/styles.css`. ## More details For more details, including how to test templates, check Starlette's docs on templates. fastapi-0.110.3/docs/en/docs/advanced/testing-database.md000066400000000000000000000067271461403617600231170ustar00rootroot00000000000000# Testing a Database !!! info These docs are about to be updated. 🎉 The current version assumes Pydantic v1, and SQLAlchemy versions less than 2.0. The new docs will include Pydantic v2 and will use SQLModel (which is also based on SQLAlchemy) once it is updated to use Pydantic v2 as well. You can use the same dependency overrides from [Testing Dependencies with Overrides](testing-dependencies.md){.internal-link target=_blank} to alter a database for testing. You could want to set up a different database for testing, rollback the data after the tests, pre-fill it with some testing data, etc. The main idea is exactly the same you saw in that previous chapter. ## Add tests for the SQL app Let's update the example from [SQL (Relational) Databases](../tutorial/sql-databases.md){.internal-link target=_blank} to use a testing database. All the app code is the same, you can go back to that chapter check how it was. The only changes here are in the new testing file. Your normal dependency `get_db()` would return a database session. In the test, you could use a dependency override to return your *custom* database session instead of the one that would be used normally. In this example we'll create a temporary database only for the tests. ## File structure We create a new file at `sql_app/tests/test_sql_app.py`. So the new file structure looks like: ``` hl_lines="9-11" . └── sql_app ├── __init__.py ├── crud.py ├── database.py ├── main.py ├── models.py ├── schemas.py └── tests ├── __init__.py └── test_sql_app.py ``` ## Create the new database session First, we create a new database session with the new database. We'll use an in-memory database that persists during the tests instead of the local file `sql_app.db`. But the rest of the session code is more or less the same, we just copy it. ```Python hl_lines="8-13" {!../../../docs_src/sql_databases/sql_app/tests/test_sql_app.py!} ``` !!! tip You could reduce duplication in that code by putting it in a function and using it from both `database.py` and `tests/test_sql_app.py`. For simplicity and to focus on the specific testing code, we are just copying it. ## Create the database Because now we are going to use a new database in a new file, we need to make sure we create the database with: ```Python Base.metadata.create_all(bind=engine) ``` That is normally called in `main.py`, but the line in `main.py` uses the database file `sql_app.db`, and we need to make sure we create `test.db` for the tests. So we add that line here, with the new file. ```Python hl_lines="16" {!../../../docs_src/sql_databases/sql_app/tests/test_sql_app.py!} ``` ## Dependency override Now we create the dependency override and add it to the overrides for our app. ```Python hl_lines="19-24 27" {!../../../docs_src/sql_databases/sql_app/tests/test_sql_app.py!} ``` !!! tip The code for `override_get_db()` is almost exactly the same as for `get_db()`, but in `override_get_db()` we use the `TestingSessionLocal` for the testing database instead. ## Test the app Then we can just test the app as normally. ```Python hl_lines="32-47" {!../../../docs_src/sql_databases/sql_app/tests/test_sql_app.py!} ``` And all the modifications we made in the database during the tests will be in the `test.db` database instead of the main `sql_app.db`. fastapi-0.110.3/docs/en/docs/advanced/testing-dependencies.md000066400000000000000000000056671461403617600240030ustar00rootroot00000000000000# Testing Dependencies with Overrides ## Overriding dependencies during testing There are some scenarios where you might want to override a dependency during testing. You don't want the original dependency to run (nor any of the sub-dependencies it might have). Instead, you want to provide a different dependency that will be used only during tests (possibly only some specific tests), and will provide a value that can be used where the value of the original dependency was used. ### Use cases: external service An example could be that you have an external authentication provider that you need to call. You send it a token and it returns an authenticated user. This provider might be charging you per request, and calling it might take some extra time than if you had a fixed mock user for tests. You probably want to test the external provider once, but not necessarily call it for every test that runs. In this case, you can override the dependency that calls that provider, and use a custom dependency that returns a mock user, only for your tests. ### Use the `app.dependency_overrides` attribute For these cases, your **FastAPI** application has an attribute `app.dependency_overrides`, it is a simple `dict`. To override a dependency for testing, you put as a key the original dependency (a function), and as the value, your dependency override (another function). And then **FastAPI** will call that override instead of the original dependency. === "Python 3.10+" ```Python hl_lines="26-27 30" {!> ../../../docs_src/dependency_testing/tutorial001_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="28-29 32" {!> ../../../docs_src/dependency_testing/tutorial001_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="29-30 33" {!> ../../../docs_src/dependency_testing/tutorial001_an.py!} ``` === "Python 3.10+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="24-25 28" {!> ../../../docs_src/dependency_testing/tutorial001_py310.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="28-29 32" {!> ../../../docs_src/dependency_testing/tutorial001.py!} ``` !!! tip You can set a dependency override for a dependency used anywhere in your **FastAPI** application. The original dependency could be used in a *path operation function*, a *path operation decorator* (when you don't use the return value), a `.include_router()` call, etc. FastAPI will still be able to override it. Then you can reset your overrides (remove them) by setting `app.dependency_overrides` to be an empty `dict`: ```Python app.dependency_overrides = {} ``` !!! tip If you want to override a dependency only during some tests, you can set the override at the beginning of the test (inside the test function) and reset it at the end (at the end of the test function). fastapi-0.110.3/docs/en/docs/advanced/testing-events.md000066400000000000000000000004061461403617600226430ustar00rootroot00000000000000# Testing Events: startup - shutdown When you need your event handlers (`startup` and `shutdown`) to run in your tests, you can use the `TestClient` with a `with` statement: ```Python hl_lines="9-12 20-24" {!../../../docs_src/app_testing/tutorial003.py!} ``` fastapi-0.110.3/docs/en/docs/advanced/testing-websockets.md000066400000000000000000000007011461403617600235060ustar00rootroot00000000000000# Testing WebSockets You can use the same `TestClient` to test WebSockets. For this, you use the `TestClient` in a `with` statement, connecting to the WebSocket: ```Python hl_lines="27-31" {!../../../docs_src/app_testing/tutorial002.py!} ``` !!! note For more details, check Starlette's documentation for testing WebSockets. fastapi-0.110.3/docs/en/docs/advanced/using-request-directly.md000066400000000000000000000044331461403617600243200ustar00rootroot00000000000000# Using the Request Directly Up to now, you have been declaring the parts of the request that you need with their types. Taking data from: * The path as parameters. * Headers. * Cookies. * etc. And by doing so, **FastAPI** is validating that data, converting it and generating documentation for your API automatically. But there are situations where you might need to access the `Request` object directly. ## Details about the `Request` object As **FastAPI** is actually **Starlette** underneath, with a layer of several tools on top, you can use Starlette's `Request` object directly when you need to. It would also mean that if you get data from the `Request` object directly (for example, read the body) it won't be validated, converted or documented (with OpenAPI, for the automatic API user interface) by FastAPI. Although any other parameter declared normally (for example, the body with a Pydantic model) would still be validated, converted, annotated, etc. But there are specific cases where it's useful to get the `Request` object. ## Use the `Request` object directly Let's imagine you want to get the client's IP address/host inside of your *path operation function*. For that you need to access the request directly. ```Python hl_lines="1 7-8" {!../../../docs_src/using_request_directly/tutorial001.py!} ``` By declaring a *path operation function* parameter with the type being the `Request` **FastAPI** will know to pass the `Request` in that parameter. !!! tip Note that in this case, we are declaring a path parameter beside the request parameter. So, the path parameter will be extracted, validated, converted to the specified type and annotated with OpenAPI. The same way, you can declare any other parameter as normally, and additionally, get the `Request` too. ## `Request` documentation You can read more details about the `Request` object in the official Starlette documentation site. !!! note "Technical Details" You could also use `from starlette.requests import Request`. **FastAPI** provides it directly just as a convenience for you, the developer. But it comes directly from Starlette. fastapi-0.110.3/docs/en/docs/advanced/websockets.md000066400000000000000000000143421461403617600220410ustar00rootroot00000000000000# WebSockets You can use WebSockets with **FastAPI**. ## Install `WebSockets` First you need to install `WebSockets`:
```console $ pip install websockets ---> 100% ```
## WebSockets client ### In production In your production system, you probably have a frontend created with a modern framework like React, Vue.js or Angular. And to communicate using WebSockets with your backend you would probably use your frontend's utilities. Or you might have a native mobile application that communicates with your WebSocket backend directly, in native code. Or you might have any other way to communicate with the WebSocket endpoint. --- But for this example, we'll use a very simple HTML document with some JavaScript, all inside a long string. This, of course, is not optimal and you wouldn't use it for production. In production you would have one of the options above. But it's the simplest way to focus on the server-side of WebSockets and have a working example: ```Python hl_lines="2 6-38 41-43" {!../../../docs_src/websockets/tutorial001.py!} ``` ## Create a `websocket` In your **FastAPI** application, create a `websocket`: ```Python hl_lines="1 46-47" {!../../../docs_src/websockets/tutorial001.py!} ``` !!! note "Technical Details" You could also use `from starlette.websockets import WebSocket`. **FastAPI** provides the same `WebSocket` directly just as a convenience for you, the developer. But it comes directly from Starlette. ## Await for messages and send messages In your WebSocket route you can `await` for messages and send messages. ```Python hl_lines="48-52" {!../../../docs_src/websockets/tutorial001.py!} ``` You can receive and send binary, text, and JSON data. ## Try it If your file is named `main.py`, run your application with:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
Open your browser at http://127.0.0.1:8000. You will see a simple page like: You can type messages in the input box, and send them: And your **FastAPI** application with WebSockets will respond back: You can send (and receive) many messages: And all of them will use the same WebSocket connection. ## Using `Depends` and others In WebSocket endpoints you can import from `fastapi` and use: * `Depends` * `Security` * `Cookie` * `Header` * `Path` * `Query` They work the same way as for other FastAPI endpoints/*path operations*: === "Python 3.10+" ```Python hl_lines="68-69 82" {!> ../../../docs_src/websockets/tutorial002_an_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="68-69 82" {!> ../../../docs_src/websockets/tutorial002_an_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="69-70 83" {!> ../../../docs_src/websockets/tutorial002_an.py!} ``` === "Python 3.10+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="66-67 79" {!> ../../../docs_src/websockets/tutorial002_py310.py!} ``` === "Python 3.8+ non-Annotated" !!! tip Prefer to use the `Annotated` version if possible. ```Python hl_lines="68-69 81" {!> ../../../docs_src/websockets/tutorial002.py!} ``` !!! info As this is a WebSocket it doesn't really make sense to raise an `HTTPException`, instead we raise a `WebSocketException`. You can use a closing code from the valid codes defined in the specification. ### Try the WebSockets with dependencies If your file is named `main.py`, run your application with:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
Open your browser at http://127.0.0.1:8000. There you can set: * The "Item ID", used in the path. * The "Token" used as a query parameter. !!! tip Notice that the query `token` will be handled by a dependency. With that you can connect the WebSocket and then send and receive messages: ## Handling disconnections and multiple clients When a WebSocket connection is closed, the `await websocket.receive_text()` will raise a `WebSocketDisconnect` exception, which you can then catch and handle like in this example. === "Python 3.9+" ```Python hl_lines="79-81" {!> ../../../docs_src/websockets/tutorial003_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="81-83" {!> ../../../docs_src/websockets/tutorial003.py!} ``` To try it out: * Open the app with several browser tabs. * Write messages from them. * Then close one of the tabs. That will raise the `WebSocketDisconnect` exception, and all the other clients will receive a message like: ``` Client #1596980209979 left the chat ``` !!! tip The app above is a minimal and simple example to demonstrate how to handle and broadcast messages to several WebSocket connections. But keep in mind that, as everything is handled in memory, in a single list, it will only work while the process is running, and will only work with a single process. If you need something easy to integrate with FastAPI but that is more robust, supported by Redis, PostgreSQL or others, check encode/broadcaster. ## More info To learn more about the options, check Starlette's documentation for: * The `WebSocket` class. * Class-based WebSocket handling. fastapi-0.110.3/docs/en/docs/advanced/wsgi.md000066400000000000000000000022041461403617600206330ustar00rootroot00000000000000# Including WSGI - Flask, Django, others You can mount WSGI applications as you saw with [Sub Applications - Mounts](sub-applications.md){.internal-link target=_blank}, [Behind a Proxy](behind-a-proxy.md){.internal-link target=_blank}. For that, you can use the `WSGIMiddleware` and use it to wrap your WSGI application, for example, Flask, Django, etc. ## Using `WSGIMiddleware` You need to import `WSGIMiddleware`. Then wrap the WSGI (e.g. Flask) app with the middleware. And then mount that under a path. ```Python hl_lines="2-3 23" {!../../../docs_src/wsgi/tutorial001.py!} ``` ## Check it Now, every request under the path `/v1/` will be handled by the Flask application. And the rest will be handled by **FastAPI**. If you run it with Uvicorn and go to http://localhost:8000/v1/ you will see the response from Flask: ```txt Hello, World from Flask! ``` And if you go to http://localhost:8000/v2 you will see the response from FastAPI: ```JSON { "message": "Hello World" } ``` fastapi-0.110.3/docs/en/docs/alternatives.md000066400000000000000000000563061461403617600206320ustar00rootroot00000000000000# Alternatives, Inspiration and Comparisons What inspired **FastAPI**, how it compares to alternatives and what it learned from them. ## Intro **FastAPI** wouldn't exist if not for the previous work of others. There have been many tools created before that have helped inspire its creation. I have been avoiding the creation of a new framework for several years. First I tried to solve all the features covered by **FastAPI** using many different frameworks, plug-ins, and tools. But at some point, there was no other option than creating something that provided all these features, taking the best ideas from previous tools, and combining them in the best way possible, using language features that weren't even available before (Python 3.6+ type hints). ## Previous tools ### Django It's the most popular Python framework and is widely trusted. It is used to build systems like Instagram. It's relatively tightly coupled with relational databases (like MySQL or PostgreSQL), so, having a NoSQL database (like Couchbase, MongoDB, Cassandra, etc) as the main store engine is not very easy. It was created to generate the HTML in the backend, not to create APIs used by a modern frontend (like React, Vue.js and Angular) or by other systems (like IoT devices) communicating with it. ### Django REST Framework Django REST framework was created to be a flexible toolkit for building Web APIs using Django underneath, to improve its API capabilities. It is used by many companies including Mozilla, Red Hat and Eventbrite. It was one of the first examples of **automatic API documentation**, and this was specifically one of the first ideas that inspired "the search for" **FastAPI**. !!! note Django REST Framework was created by Tom Christie. The same creator of Starlette and Uvicorn, on which **FastAPI** is based. !!! check "Inspired **FastAPI** to" Have an automatic API documentation web user interface. ### Flask Flask is a "microframework", it doesn't include database integrations nor many of the things that come by default in Django. This simplicity and flexibility allow doing things like using NoSQL databases as the main data storage system. As it is very simple, it's relatively intuitive to learn, although the documentation gets somewhat technical at some points. It is also commonly used for other applications that don't necessarily need a database, user management, or any of the many features that come pre-built in Django. Although many of these features can be added with plug-ins. This decoupling of parts, and being a "microframework" that could be extended to cover exactly what is needed was a key feature that I wanted to keep. Given the simplicity of Flask, it seemed like a good match for building APIs. The next thing to find was a "Django REST Framework" for Flask. !!! check "Inspired **FastAPI** to" Be a micro-framework. Making it easy to mix and match the tools and parts needed. Have a simple and easy to use routing system. ### Requests **FastAPI** is not actually an alternative to **Requests**. Their scope is very different. It would actually be common to use Requests *inside* of a FastAPI application. But still, FastAPI got quite some inspiration from Requests. **Requests** is a library to *interact* with APIs (as a client), while **FastAPI** is a library to *build* APIs (as a server). They are, more or less, at opposite ends, complementing each other. Requests has a very simple and intuitive design, it's very easy to use, with sensible defaults. But at the same time, it's very powerful and customizable. That's why, as said in the official website: > Requests is one of the most downloaded Python packages of all time The way you use it is very simple. For example, to do a `GET` request, you would write: ```Python response = requests.get("http://example.com/some/url") ``` The FastAPI counterpart API *path operation* could look like: ```Python hl_lines="1" @app.get("/some/url") def read_url(): return {"message": "Hello World"} ``` See the similarities in `requests.get(...)` and `@app.get(...)`. !!! check "Inspired **FastAPI** to" * Have a simple and intuitive API. * Use HTTP method names (operations) directly, in a straightforward and intuitive way. * Have sensible defaults, but powerful customizations. ### Swagger / OpenAPI The main feature I wanted from Django REST Framework was the automatic API documentation. Then I found that there was a standard to document APIs, using JSON (or YAML, an extension of JSON) called Swagger. And there was a web user interface for Swagger APIs already created. So, being able to generate Swagger documentation for an API would allow using this web user interface automatically. At some point, Swagger was given to the Linux Foundation, to be renamed OpenAPI. That's why when talking about version 2.0 it's common to say "Swagger", and for version 3+ "OpenAPI". !!! check "Inspired **FastAPI** to" Adopt and use an open standard for API specifications, instead of a custom schema. And integrate standards-based user interface tools: * Swagger UI * ReDoc These two were chosen for being fairly popular and stable, but doing a quick search, you could find dozens of alternative user interfaces for OpenAPI (that you can use with **FastAPI**). ### Flask REST frameworks There are several Flask REST frameworks, but after investing the time and work into investigating them, I found that many are discontinued or abandoned, with several standing issues that made them unfit. ### Marshmallow One of the main features needed by API systems is data "serialization" which is taking data from the code (Python) and converting it into something that can be sent through the network. For example, converting an object containing data from a database into a JSON object. Converting `datetime` objects into strings, etc. Another big feature needed by APIs is data validation, making sure that the data is valid, given certain parameters. For example, that some field is an `int`, and not some random string. This is especially useful for incoming data. Without a data validation system, you would have to do all the checks by hand, in code. These features are what Marshmallow was built to provide. It is a great library, and I have used it a lot before. But it was created before there existed Python type hints. So, to define every schema you need to use specific utils and classes provided by Marshmallow. !!! check "Inspired **FastAPI** to" Use code to define "schemas" that provide data types and validation, automatically. ### Webargs Another big feature required by APIs is parsing data from incoming requests. Webargs is a tool that was made to provide that on top of several frameworks, including Flask. It uses Marshmallow underneath to do the data validation. And it was created by the same developers. It's a great tool and I have used it a lot too, before having **FastAPI**. !!! info Webargs was created by the same Marshmallow developers. !!! check "Inspired **FastAPI** to" Have automatic validation of incoming request data. ### APISpec Marshmallow and Webargs provide validation, parsing and serialization as plug-ins. But documentation is still missing. Then APISpec was created. It is a plug-in for many frameworks (and there's a plug-in for Starlette too). The way it works is that you write the definition of the schema using YAML format inside the docstring of each function handling a route. And it generates OpenAPI schemas. That's how it works in Flask, Starlette, Responder, etc. But then, we have again the problem of having a micro-syntax, inside of a Python string (a big YAML). The editor can't help much with that. And if we modify parameters or Marshmallow schemas and forget to also modify that YAML docstring, the generated schema would be obsolete. !!! info APISpec was created by the same Marshmallow developers. !!! check "Inspired **FastAPI** to" Support the open standard for APIs, OpenAPI. ### Flask-apispec It's a Flask plug-in, that ties together Webargs, Marshmallow and APISpec. It uses the information from Webargs and Marshmallow to automatically generate OpenAPI schemas, using APISpec. It's a great tool, very underrated. It should be way more popular than many Flask plug-ins out there. It might be due to its documentation being too concise and abstract. This solved having to write YAML (another syntax) inside of Python docstrings. This combination of Flask, Flask-apispec with Marshmallow and Webargs was my favorite backend stack until building **FastAPI**. Using it led to the creation of several Flask full-stack generators. These are the main stacks I (and several external teams) have been using up to now: * https://github.com/tiangolo/full-stack * https://github.com/tiangolo/full-stack-flask-couchbase * https://github.com/tiangolo/full-stack-flask-couchdb And these same full-stack generators were the base of the [**FastAPI** Project Generators](project-generation.md){.internal-link target=_blank}. !!! info Flask-apispec was created by the same Marshmallow developers. !!! check "Inspired **FastAPI** to" Generate the OpenAPI schema automatically, from the same code that defines serialization and validation. ### NestJS (and Angular) This isn't even Python, NestJS is a JavaScript (TypeScript) NodeJS framework inspired by Angular. It achieves something somewhat similar to what can be done with Flask-apispec. It has an integrated dependency injection system, inspired by Angular 2. It requires pre-registering the "injectables" (like all the other dependency injection systems I know), so, it adds to the verbosity and code repetition. As the parameters are described with TypeScript types (similar to Python type hints), editor support is quite good. But as TypeScript data is not preserved after compilation to JavaScript, it cannot rely on the types to define validation, serialization and documentation at the same time. Due to this and some design decisions, to get validation, serialization and automatic schema generation, it's needed to add decorators in many places. So, it becomes quite verbose. It can't handle nested models very well. So, if the JSON body in the request is a JSON object that has inner fields that in turn are nested JSON objects, it cannot be properly documented and validated. !!! check "Inspired **FastAPI** to" Use Python types to have great editor support. Have a powerful dependency injection system. Find a way to minimize code repetition. ### Sanic It was one of the first extremely fast Python frameworks based on `asyncio`. It was made to be very similar to Flask. !!! note "Technical Details" It used `uvloop` instead of the default Python `asyncio` loop. That's what made it so fast. It clearly inspired Uvicorn and Starlette, that are currently faster than Sanic in open benchmarks. !!! check "Inspired **FastAPI** to" Find a way to have a crazy performance. That's why **FastAPI** is based on Starlette, as it is the fastest framework available (tested by third-party benchmarks). ### Falcon Falcon is another high performance Python framework, it is designed to be minimal, and work as the foundation of other frameworks like Hug. It is designed to have functions that receive two parameters, one "request" and one "response". Then you "read" parts from the request, and "write" parts to the response. Because of this design, it is not possible to declare request parameters and bodies with standard Python type hints as function parameters. So, data validation, serialization, and documentation, have to be done in code, not automatically. Or they have to be implemented as a framework on top of Falcon, like Hug. This same distinction happens in other frameworks that are inspired by Falcon's design, of having one request object and one response object as parameters. !!! check "Inspired **FastAPI** to" Find ways to get great performance. Along with Hug (as Hug is based on Falcon) inspired **FastAPI** to declare a `response` parameter in functions. Although in FastAPI it's optional, and is used mainly to set headers, cookies, and alternative status codes. ### Molten I discovered Molten in the first stages of building **FastAPI**. And it has quite similar ideas: * Based on Python type hints. * Validation and documentation from these types. * Dependency Injection system. It doesn't use a data validation, serialization and documentation third-party library like Pydantic, it has its own. So, these data type definitions would not be reusable as easily. It requires a little bit more verbose configurations. And as it is based on WSGI (instead of ASGI), it is not designed to take advantage of the high performance provided by tools like Uvicorn, Starlette and Sanic. The dependency injection system requires pre-registration of the dependencies and the dependencies are solved based on the declared types. So, it's not possible to declare more than one "component" that provides a certain type. Routes are declared in a single place, using functions declared in other places (instead of using decorators that can be placed right on top of the function that handles the endpoint). This is closer to how Django does it than to how Flask (and Starlette) does it. It separates in the code things that are relatively tightly coupled. !!! check "Inspired **FastAPI** to" Define extra validations for data types using the "default" value of model attributes. This improves editor support, and it was not available in Pydantic before. This actually inspired updating parts of Pydantic, to support the same validation declaration style (all this functionality is now already available in Pydantic). ### Hug Hug was one of the first frameworks to implement the declaration of API parameter types using Python type hints. This was a great idea that inspired other tools to do the same. It used custom types in its declarations instead of standard Python types, but it was still a huge step forward. It also was one of the first frameworks to generate a custom schema declaring the whole API in JSON. It was not based on a standard like OpenAPI and JSON Schema. So it wouldn't be straightforward to integrate it with other tools, like Swagger UI. But again, it was a very innovative idea. It has an interesting, uncommon feature: using the same framework, it's possible to create APIs and also CLIs. As it is based on the previous standard for synchronous Python web frameworks (WSGI), it can't handle Websockets and other things, although it still has high performance too. !!! info Hug was created by Timothy Crosley, the same creator of `isort`, a great tool to automatically sort imports in Python files. !!! check "Ideas inspiring **FastAPI**" Hug inspired parts of APIStar, and was one of the tools I found most promising, alongside APIStar. Hug helped inspiring **FastAPI** to use Python type hints to declare parameters, and to generate a schema defining the API automatically. Hug inspired **FastAPI** to declare a `response` parameter in functions to set headers and cookies. ### APIStar (<= 0.5) Right before deciding to build **FastAPI** I found **APIStar** server. It had almost everything I was looking for and had a great design. It was one of the first implementations of a framework using Python type hints to declare parameters and requests that I ever saw (before NestJS and Molten). I found it more or less at the same time as Hug. But APIStar used the OpenAPI standard. It had automatic data validation, data serialization and OpenAPI schema generation based on the same type hints in several places. Body schema definitions didn't use the same Python type hints like Pydantic, it was a bit more similar to Marshmallow, so, editor support wouldn't be as good, but still, APIStar was the best available option. It had the best performance benchmarks at the time (only surpassed by Starlette). At first, it didn't have an automatic API documentation web UI, but I knew I could add Swagger UI to it. It had a dependency injection system. It required pre-registration of components, as other tools discussed above. But still, it was a great feature. I was never able to use it in a full project, as it didn't have security integration, so, I couldn't replace all the features I was having with the full-stack generators based on Flask-apispec. I had in my backlog of projects to create a pull request adding that functionality. But then, the project's focus shifted. It was no longer an API web framework, as the creator needed to focus on Starlette. Now APIStar is a set of tools to validate OpenAPI specifications, not a web framework. !!! info APIStar was created by Tom Christie. The same guy that created: * Django REST Framework * Starlette (in which **FastAPI** is based) * Uvicorn (used by Starlette and **FastAPI**) !!! check "Inspired **FastAPI** to" Exist. The idea of declaring multiple things (data validation, serialization and documentation) with the same Python types, that at the same time provided great editor support, was something I considered a brilliant idea. And after searching for a long time for a similar framework and testing many different alternatives, APIStar was the best option available. Then APIStar stopped to exist as a server and Starlette was created, and was a new better foundation for such a system. That was the final inspiration to build **FastAPI**. I consider **FastAPI** a "spiritual successor" to APIStar, while improving and increasing the features, typing system, and other parts, based on the learnings from all these previous tools. ## Used by **FastAPI** ### Pydantic Pydantic is a library to define data validation, serialization and documentation (using JSON Schema) based on Python type hints. That makes it extremely intuitive. It is comparable to Marshmallow. Although it's faster than Marshmallow in benchmarks. And as it is based on the same Python type hints, the editor support is great. !!! check "**FastAPI** uses it to" Handle all the data validation, data serialization and automatic model documentation (based on JSON Schema). **FastAPI** then takes that JSON Schema data and puts it in OpenAPI, apart from all the other things it does. ### Starlette Starlette is a lightweight ASGI framework/toolkit, which is ideal for building high-performance asyncio services. It is very simple and intuitive. It's designed to be easily extensible, and have modular components. It has: * Seriously impressive performance. * WebSocket support. * In-process background tasks. * Startup and shutdown events. * Test client built on HTTPX. * CORS, GZip, Static Files, Streaming responses. * Session and Cookie support. * 100% test coverage. * 100% type annotated codebase. * Few hard dependencies. Starlette is currently the fastest Python framework tested. Only surpassed by Uvicorn, which is not a framework, but a server. Starlette provides all the basic web microframework functionality. But it doesn't provide automatic data validation, serialization or documentation. That's one of the main things that **FastAPI** adds on top, all based on Python type hints (using Pydantic). That, plus the dependency injection system, security utilities, OpenAPI schema generation, etc. !!! note "Technical Details" ASGI is a new "standard" being developed by Django core team members. It is still not a "Python standard" (a PEP), although they are in the process of doing that. Nevertheless, it is already being used as a "standard" by several tools. This greatly improves interoperability, as you could switch Uvicorn for any other ASGI server (like Daphne or Hypercorn), or you could add ASGI compatible tools, like `python-socketio`. !!! check "**FastAPI** uses it to" Handle all the core web parts. Adding features on top. The class `FastAPI` itself inherits directly from the class `Starlette`. So, anything that you can do with Starlette, you can do it directly with **FastAPI**, as it is basically Starlette on steroids. ### Uvicorn Uvicorn is a lightning-fast ASGI server, built on uvloop and httptools. It is not a web framework, but a server. For example, it doesn't provide tools for routing by paths. That's something that a framework like Starlette (or **FastAPI**) would provide on top. It is the recommended server for Starlette and **FastAPI**. !!! check "**FastAPI** recommends it as" The main web server to run **FastAPI** applications. You can combine it with Gunicorn, to have an asynchronous multi-process server. Check more details in the [Deployment](deployment/index.md){.internal-link target=_blank} section. ## Benchmarks and speed To understand, compare, and see the difference between Uvicorn, Starlette and FastAPI, check the section about [Benchmarks](benchmarks.md){.internal-link target=_blank}. fastapi-0.110.3/docs/en/docs/async.md000066400000000000000000000560341461403617600172440ustar00rootroot00000000000000# Concurrency and async / await Details about the `async def` syntax for *path operation functions* and some background about asynchronous code, concurrency, and parallelism. ## In a hurry? TL;DR: If you are using third party libraries that tell you to call them with `await`, like: ```Python results = await some_library() ``` Then, declare your *path operation functions* with `async def` like: ```Python hl_lines="2" @app.get('/') async def read_results(): results = await some_library() return results ``` !!! note You can only use `await` inside of functions created with `async def`. --- If you are using a third party library that communicates with something (a database, an API, the file system, etc.) and doesn't have support for using `await`, (this is currently the case for most database libraries), then declare your *path operation functions* as normally, with just `def`, like: ```Python hl_lines="2" @app.get('/') def results(): results = some_library() return results ``` --- If your application (somehow) doesn't have to communicate with anything else and wait for it to respond, use `async def`. --- If you just don't know, use normal `def`. --- **Note**: You can mix `def` and `async def` in your *path operation functions* as much as you need and define each one using the best option for you. FastAPI will do the right thing with them. Anyway, in any of the cases above, FastAPI will still work asynchronously and be extremely fast. But by following the steps above, it will be able to do some performance optimizations. ## Technical Details Modern versions of Python have support for **"asynchronous code"** using something called **"coroutines"**, with **`async` and `await`** syntax. Let's see that phrase by parts in the sections below: * **Asynchronous Code** * **`async` and `await`** * **Coroutines** ## Asynchronous Code Asynchronous code just means that the language 💬 has a way to tell the computer / program 🤖 that at some point in the code, it 🤖 will have to wait for *something else* to finish somewhere else. Let's say that *something else* is called "slow-file" 📝. So, during that time, the computer can go and do some other work, while "slow-file" 📝 finishes. Then the computer / program 🤖 will come back every time it has a chance because it's waiting again, or whenever it 🤖 finished all the work it had at that point. And it 🤖 will see if any of the tasks it was waiting for have already finished, doing whatever it had to do. Next, it 🤖 takes the first task to finish (let's say, our "slow-file" 📝) and continues whatever it had to do with it. That "wait for something else" normally refers to I/O operations that are relatively "slow" (compared to the speed of the processor and the RAM memory), like waiting for: * the data from the client to be sent through the network * the data sent by your program to be received by the client through the network * the contents of a file in the disk to be read by the system and given to your program * the contents your program gave to the system to be written to disk * a remote API operation * a database operation to finish * a database query to return the results * etc. As the execution time is consumed mostly by waiting for I/O operations, they call them "I/O bound" operations. It's called "asynchronous" because the computer / program doesn't have to be "synchronized" with the slow task, waiting for the exact moment that the task finishes, while doing nothing, to be able to take the task result and continue the work. Instead of that, by being an "asynchronous" system, once finished, the task can wait in line a little bit (some microseconds) for the computer / program to finish whatever it went to do, and then come back to take the results and continue working with them. For "synchronous" (contrary to "asynchronous") they commonly also use the term "sequential", because the computer / program follows all the steps in sequence before switching to a different task, even if those steps involve waiting. ### Concurrency and Burgers This idea of **asynchronous** code described above is also sometimes called **"concurrency"**. It is different from **"parallelism"**. **Concurrency** and **parallelism** both relate to "different things happening more or less at the same time". But the details between *concurrency* and *parallelism* are quite different. To see the difference, imagine the following story about burgers: ### Concurrent Burgers You go with your crush to get fast food, you stand in line while the cashier takes the orders from the people in front of you. 😍 Then it's your turn, you place your order of 2 very fancy burgers for your crush and you. 🍔🍔 The cashier says something to the cook in the kitchen so they know they have to prepare your burgers (even though they are currently preparing the ones for the previous clients). You pay. 💸 The cashier gives you the number of your turn. While you are waiting, you go with your crush and pick a table, you sit and talk with your crush for a long time (as your burgers are very fancy and take some time to prepare). As you are sitting at the table with your crush, while you wait for the burgers, you can spend that time admiring how awesome, cute and smart your crush is ✨😍✨. While waiting and talking to your crush, from time to time, you check the number displayed on the counter to see if it's your turn already. Then at some point, it finally is your turn. You go to the counter, get your burgers and come back to the table. You and your crush eat the burgers and have a nice time. ✨ !!! info Beautiful illustrations by Ketrina Thompson. 🎨 --- Imagine you are the computer / program 🤖 in that story. While you are at the line, you are just idle 😴, waiting for your turn, not doing anything very "productive". But the line is fast because the cashier is only taking the orders (not preparing them), so that's fine. Then, when it's your turn, you do actual "productive" work, you process the menu, decide what you want, get your crush's choice, pay, check that you give the correct bill or card, check that you are charged correctly, check that the order has the correct items, etc. But then, even though you still don't have your burgers, your work with the cashier is "on pause" ⏸, because you have to wait 🕙 for your burgers to be ready. But as you go away from the counter and sit at the table with a number for your turn, you can switch 🔀 your attention to your crush, and "work" ⏯ 🤓 on that. Then you are again doing something very "productive" as is flirting with your crush 😍. Then the cashier 💁 says "I'm finished with doing the burgers" by putting your number on the counter's display, but you don't jump like crazy immediately when the displayed number changes to your turn number. You know no one will steal your burgers because you have the number of your turn, and they have theirs. So you wait for your crush to finish the story (finish the current work ⏯ / task being processed 🤓), smile gently and say that you are going for the burgers ⏸. Then you go to the counter 🔀, to the initial task that is now finished ⏯, pick the burgers, say thanks and take them to the table. That finishes that step / task of interaction with the counter ⏹. That in turn, creates a new task, of "eating burgers" 🔀 ⏯, but the previous one of "getting burgers" is finished ⏹. ### Parallel Burgers Now let's imagine these aren't "Concurrent Burgers", but "Parallel Burgers". You go with your crush to get parallel fast food. You stand in line while several (let's say 8) cashiers that at the same time are cooks take the orders from the people in front of you. Everyone before you is waiting for their burgers to be ready before leaving the counter because each of the 8 cashiers goes and prepares the burger right away before getting the next order. Then it's finally your turn, you place your order of 2 very fancy burgers for your crush and you. You pay 💸. The cashier goes to the kitchen. You wait, standing in front of the counter 🕙, so that no one else takes your burgers before you do, as there are no numbers for turns. As you and your crush are busy not letting anyone get in front of you and take your burgers whenever they arrive, you cannot pay attention to your crush. 😞 This is "synchronous" work, you are "synchronized" with the cashier/cook 👨‍🍳. You have to wait 🕙 and be there at the exact moment that the cashier/cook 👨‍🍳 finishes the burgers and gives them to you, or otherwise, someone else might take them. Then your cashier/cook 👨‍🍳 finally comes back with your burgers, after a long time waiting 🕙 there in front of the counter. You take your burgers and go to the table with your crush. You just eat them, and you are done. ⏹ There was not much talk or flirting as most of the time was spent waiting 🕙 in front of the counter. 😞 !!! info Beautiful illustrations by Ketrina Thompson. 🎨 --- In this scenario of the parallel burgers, you are a computer / program 🤖 with two processors (you and your crush), both waiting 🕙 and dedicating their attention ⏯ to be "waiting on the counter" 🕙 for a long time. The fast food store has 8 processors (cashiers/cooks). While the concurrent burgers store might have had only 2 (one cashier and one cook). But still, the final experience is not the best. 😞 --- This would be the parallel equivalent story for burgers. 🍔 For a more "real life" example of this, imagine a bank. Up to recently, most of the banks had multiple cashiers 👨‍💼👨‍💼👨‍💼👨‍💼 and a big line 🕙🕙🕙🕙🕙🕙🕙🕙. All of the cashiers doing all the work with one client after the other 👨‍💼⏯. And you have to wait 🕙 in the line for a long time or you lose your turn. You probably wouldn't want to take your crush 😍 with you to do errands at the bank 🏦. ### Burger Conclusion In this scenario of "fast food burgers with your crush", as there is a lot of waiting 🕙, it makes a lot more sense to have a concurrent system ⏸🔀⏯. This is the case for most of the web applications. Many, many users, but your server is waiting 🕙 for their not-so-good connection to send their requests. And then waiting 🕙 again for the responses to come back. This "waiting" 🕙 is measured in microseconds, but still, summing it all, it's a lot of waiting in the end. That's why it makes a lot of sense to use asynchronous ⏸🔀⏯ code for web APIs. This kind of asynchronicity is what made NodeJS popular (even though NodeJS is not parallel) and that's the strength of Go as a programming language. And that's the same level of performance you get with **FastAPI**. And as you can have parallelism and asynchronicity at the same time, you get higher performance than most of the tested NodeJS frameworks and on par with Go, which is a compiled language closer to C (all thanks to Starlette). ### Is concurrency better than parallelism? Nope! That's not the moral of the story. Concurrency is different than parallelism. And it is better on **specific** scenarios that involve a lot of waiting. Because of that, it generally is a lot better than parallelism for web application development. But not for everything. So, to balance that out, imagine the following short story: > You have to clean a big, dirty house. *Yep, that's the whole story*. --- There's no waiting 🕙 anywhere, just a lot of work to be done, on multiple places of the house. You could have turns as in the burgers example, first the living room, then the kitchen, but as you are not waiting 🕙 for anything, just cleaning and cleaning, the turns wouldn't affect anything. It would take the same amount of time to finish with or without turns (concurrency) and you would have done the same amount of work. But in this case, if you could bring the 8 ex-cashier/cooks/now-cleaners, and each one of them (plus you) could take a zone of the house to clean it, you could do all the work in **parallel**, with the extra help, and finish much sooner. In this scenario, each one of the cleaners (including you) would be a processor, doing their part of the job. And as most of the execution time is taken by actual work (instead of waiting), and the work in a computer is done by a CPU, they call these problems "CPU bound". --- Common examples of CPU bound operations are things that require complex math processing. For example: * **Audio** or **image processing**. * **Computer vision**: an image is composed of millions of pixels, each pixel has 3 values / colors, processing that normally requires computing something on those pixels, all at the same time. * **Machine Learning**: it normally requires lots of "matrix" and "vector" multiplications. Think of a huge spreadsheet with numbers and multiplying all of them together at the same time. * **Deep Learning**: this is a sub-field of Machine Learning, so, the same applies. It's just that there is not a single spreadsheet of numbers to multiply, but a huge set of them, and in many cases, you use a special processor to build and / or use those models. ### Concurrency + Parallelism: Web + Machine Learning With **FastAPI** you can take the advantage of concurrency that is very common for web development (the same main attraction of NodeJS). But you can also exploit the benefits of parallelism and multiprocessing (having multiple processes running in parallel) for **CPU bound** workloads like those in Machine Learning systems. That, plus the simple fact that Python is the main language for **Data Science**, Machine Learning and especially Deep Learning, make FastAPI a very good match for Data Science / Machine Learning web APIs and applications (among many others). To see how to achieve this parallelism in production see the section about [Deployment](deployment/index.md){.internal-link target=_blank}. ## `async` and `await` Modern versions of Python have a very intuitive way to define asynchronous code. This makes it look just like normal "sequential" code and do the "awaiting" for you at the right moments. When there is an operation that will require waiting before giving the results and has support for these new Python features, you can code it like: ```Python burgers = await get_burgers(2) ``` The key here is the `await`. It tells Python that it has to wait ⏸ for `get_burgers(2)` to finish doing its thing 🕙 before storing the results in `burgers`. With that, Python will know that it can go and do something else 🔀 ⏯ in the meanwhile (like receiving another request). For `await` to work, it has to be inside a function that supports this asynchronicity. To do that, you just declare it with `async def`: ```Python hl_lines="1" async def get_burgers(number: int): # Do some asynchronous stuff to create the burgers return burgers ``` ...instead of `def`: ```Python hl_lines="2" # This is not asynchronous def get_sequential_burgers(number: int): # Do some sequential stuff to create the burgers return burgers ``` With `async def`, Python knows that, inside that function, it has to be aware of `await` expressions, and that it can "pause" ⏸ the execution of that function and go do something else 🔀 before coming back. When you want to call an `async def` function, you have to "await" it. So, this won't work: ```Python # This won't work, because get_burgers was defined with: async def burgers = get_burgers(2) ``` --- So, if you are using a library that tells you that you can call it with `await`, you need to create the *path operation functions* that uses it with `async def`, like in: ```Python hl_lines="2-3" @app.get('/burgers') async def read_burgers(): burgers = await get_burgers(2) return burgers ``` ### More technical details You might have noticed that `await` can only be used inside of functions defined with `async def`. But at the same time, functions defined with `async def` have to be "awaited". So, functions with `async def` can only be called inside of functions defined with `async def` too. So, about the egg and the chicken, how do you call the first `async` function? If you are working with **FastAPI** you don't have to worry about that, because that "first" function will be your *path operation function*, and FastAPI will know how to do the right thing. But if you want to use `async` / `await` without FastAPI, you can do it as well. ### Write your own async code Starlette (and **FastAPI**) are based on AnyIO, which makes it compatible with both Python's standard library asyncio and Trio. In particular, you can directly use AnyIO for your advanced concurrency use cases that require more advanced patterns in your own code. And even if you were not using FastAPI, you could also write your own async applications with AnyIO to be highly compatible and get its benefits (e.g. *structured concurrency*). ### Other forms of asynchronous code This style of using `async` and `await` is relatively new in the language. But it makes working with asynchronous code a lot easier. This same syntax (or almost identical) was also included recently in modern versions of JavaScript (in Browser and NodeJS). But before that, handling asynchronous code was quite more complex and difficult. In previous versions of Python, you could have used threads or Gevent. But the code is way more complex to understand, debug, and think about. In previous versions of NodeJS / Browser JavaScript, you would have used "callbacks". Which leads to callback hell. ## Coroutines **Coroutine** is just the very fancy term for the thing returned by an `async def` function. Python knows that it is something like a function that it can start and that it will end at some point, but that it might be paused ⏸ internally too, whenever there is an `await` inside of it. But all this functionality of using asynchronous code with `async` and `await` is many times summarized as using "coroutines". It is comparable to the main key feature of Go, the "Goroutines". ## Conclusion Let's see the same phrase from above: > Modern versions of Python have support for **"asynchronous code"** using something called **"coroutines"**, with **`async` and `await`** syntax. That should make more sense now. ✨ All that is what powers FastAPI (through Starlette) and what makes it have such an impressive performance. ## Very Technical Details !!! warning You can probably skip this. These are very technical details of how **FastAPI** works underneath. If you have quite some technical knowledge (coroutines, threads, blocking, etc.) and are curious about how FastAPI handles `async def` vs normal `def`, go ahead. ### Path operation functions When you declare a *path operation function* with normal `def` instead of `async def`, it is run in an external threadpool that is then awaited, instead of being called directly (as it would block the server). If you are coming from another async framework that does not work in the way described above and you are used to defining trivial compute-only *path operation functions* with plain `def` for a tiny performance gain (about 100 nanoseconds), please note that in **FastAPI** the effect would be quite opposite. In these cases, it's better to use `async def` unless your *path operation functions* use code that performs blocking I/O. Still, in both situations, chances are that **FastAPI** will [still be faster](index.md#performance){.internal-link target=_blank} than (or at least comparable to) your previous framework. ### Dependencies The same applies for [dependencies](tutorial/dependencies/index.md){.internal-link target=_blank}. If a dependency is a standard `def` function instead of `async def`, it is run in the external threadpool. ### Sub-dependencies You can have multiple dependencies and [sub-dependencies](tutorial/dependencies/sub-dependencies.md){.internal-link target=_blank} requiring each other (as parameters of the function definitions), some of them might be created with `async def` and some with normal `def`. It would still work, and the ones created with normal `def` would be called on an external thread (from the threadpool) instead of being "awaited". ### Other utility functions Any other utility function that you call directly can be created with normal `def` or `async def` and FastAPI won't affect the way you call it. This is in contrast to the functions that FastAPI calls for you: *path operation functions* and dependencies. If your utility function is a normal function with `def`, it will be called directly (as you write it in your code), not in a threadpool, if the function is created with `async def` then you should `await` for that function when you call it in your code. --- Again, these are very technical details that would probably be useful if you came searching for them. Otherwise, you should be good with the guidelines from the section above: In a hurry?. fastapi-0.110.3/docs/en/docs/benchmarks.md000066400000000000000000000066661461403617600202520ustar00rootroot00000000000000# Benchmarks Independent TechEmpower benchmarks show **FastAPI** applications running under Uvicorn as one of the fastest Python frameworks available, only below Starlette and Uvicorn themselves (used internally by FastAPI). But when checking benchmarks and comparisons you should keep the following in mind. ## Benchmarks and speed When you check the benchmarks, it is common to see several tools of different types compared as equivalent. Specifically, to see Uvicorn, Starlette and FastAPI compared together (among many other tools). The simpler the problem solved by the tool, the better performance it will get. And most of the benchmarks don't test the additional features provided by the tool. The hierarchy is like: * **Uvicorn**: an ASGI server * **Starlette**: (uses Uvicorn) a web microframework * **FastAPI**: (uses Starlette) an API microframework with several additional features for building APIs, with data validation, etc. * **Uvicorn**: * Will have the best performance, as it doesn't have much extra code apart from the server itself. * You wouldn't write an application in Uvicorn directly. That would mean that your code would have to include more or less, at least, all the code provided by Starlette (or **FastAPI**). And if you did that, your final application would have the same overhead as having used a framework and minimizing your app code and bugs. * If you are comparing Uvicorn, compare it against Daphne, Hypercorn, uWSGI, etc. Application servers. * **Starlette**: * Will have the next best performance, after Uvicorn. In fact, Starlette uses Uvicorn to run. So, it probably can only get "slower" than Uvicorn by having to execute more code. * But it provides you the tools to build simple web applications, with routing based on paths, etc. * If you are comparing Starlette, compare it against Sanic, Flask, Django, etc. Web frameworks (or microframeworks). * **FastAPI**: * The same way that Starlette uses Uvicorn and cannot be faster than it, **FastAPI** uses Starlette, so it cannot be faster than it. * FastAPI provides more features on top of Starlette. Features that you almost always need when building APIs, like data validation and serialization. And by using it, you get automatic documentation for free (the automatic documentation doesn't even add overhead to running applications, it is generated on startup). * If you didn't use FastAPI and used Starlette directly (or another tool, like Sanic, Flask, Responder, etc) you would have to implement all the data validation and serialization yourself. So, your final application would still have the same overhead as if it was built using FastAPI. And in many cases, this data validation and serialization is the biggest amount of code written in applications. * So, by using FastAPI you are saving development time, bugs, lines of code, and you would probably get the same performance (or better) you would if you didn't use it (as you would have to implement it all in your code). * If you are comparing FastAPI, compare it against a web application framework (or set of tools) that provides data validation, serialization and documentation, like Flask-apispec, NestJS, Molten, etc. Frameworks with integrated automatic data validation, serialization and documentation. fastapi-0.110.3/docs/en/docs/contributing.md000066400000000000000000000341771461403617600206420ustar00rootroot00000000000000# Development - Contributing First, you might want to see the basic ways to [help FastAPI and get help](help-fastapi.md){.internal-link target=_blank}. ## Developing If you already cloned the fastapi repository and you want to deep dive in the code, here are some guidelines to set up your environment. ### Virtual environment with `venv` You can create an isolated virtual local environment in a directory using Python's `venv` module. Let's do this in the cloned repository (where the `requirements.txt` is):
```console $ python -m venv env ```
That will create a directory `./env/` with the Python binaries, and then you will be able to install packages for that local environment. ### Activate the environment Activate the new environment with: === "Linux, macOS"
```console $ source ./env/bin/activate ```
=== "Windows PowerShell"
```console $ .\env\Scripts\Activate.ps1 ```
=== "Windows Bash" Or if you use Bash for Windows (e.g. Git Bash):
```console $ source ./env/Scripts/activate ```
To check it worked, use: === "Linux, macOS, Windows Bash"
```console $ which pip some/directory/fastapi/env/bin/pip ```
=== "Windows PowerShell"
```console $ Get-Command pip some/directory/fastapi/env/bin/pip ```
If it shows the `pip` binary at `env/bin/pip` then it worked. 🎉 Make sure you have the latest pip version on your local environment to avoid errors on the next steps:
```console $ python -m pip install --upgrade pip ---> 100% ```
!!! tip Every time you install a new package with `pip` under that environment, activate the environment again. This makes sure that if you use a terminal program installed by that package, you use the one from your local environment and not any other that could be installed globally. ### Install requirements using pip After activating the environment as described above:
```console $ pip install -r requirements.txt ---> 100% ```
It will install all the dependencies and your local FastAPI in your local environment. ### Using your local FastAPI If you create a Python file that imports and uses FastAPI, and run it with the Python from your local environment, it will use your cloned local FastAPI source code. And if you update that local FastAPI source code when you run that Python file again, it will use the fresh version of FastAPI you just edited. That way, you don't have to "install" your local version to be able to test every change. !!! note "Technical Details" This only happens when you install using this included `requirements.txt` instead of running `pip install fastapi` directly. That is because inside the `requirements.txt` file, the local version of FastAPI is marked to be installed in "editable" mode, with the `-e` option. ### Format the code There is a script that you can run that will format and clean all your code:
```console $ bash scripts/format.sh ```
It will also auto-sort all your imports. For it to sort them correctly, you need to have FastAPI installed locally in your environment, with the command in the section above using `-e`. ## Docs First, make sure you set up your environment as described above, that will install all the requirements. ### Docs live During local development, there is a script that builds the site and checks for any changes, live-reloading:
```console $ python ./scripts/docs.py live [INFO] Serving on http://127.0.0.1:8008 [INFO] Start watching changes [INFO] Start detecting changes ```
It will serve the documentation on `http://127.0.0.1:8008`. That way, you can edit the documentation/source files and see the changes live. !!! tip Alternatively, you can perform the same steps that scripts does manually. Go into the language directory, for the main docs in English it's at `docs/en/`: ```console $ cd docs/en/ ``` Then run `mkdocs` in that directory: ```console $ mkdocs serve --dev-addr 8008 ``` #### Typer CLI (optional) The instructions here show you how to use the script at `./scripts/docs.py` with the `python` program directly. But you can also use Typer CLI, and you will get autocompletion in your terminal for the commands after installing completion. If you install Typer CLI, you can install completion with:
```console $ typer --install-completion zsh completion installed in /home/user/.bashrc. Completion will take effect once you restart the terminal. ```
### Docs Structure The documentation uses MkDocs. And there are extra tools/scripts in place to handle translations in `./scripts/docs.py`. !!! tip You don't need to see the code in `./scripts/docs.py`, you just use it in the command line. All the documentation is in Markdown format in the directory `./docs/en/`. Many of the tutorials have blocks of code. In most of the cases, these blocks of code are actual complete applications that can be run as is. In fact, those blocks of code are not written inside the Markdown, they are Python files in the `./docs_src/` directory. And those Python files are included/injected in the documentation when generating the site. ### Docs for tests Most of the tests actually run against the example source files in the documentation. This helps to make sure that: * The documentation is up-to-date. * The documentation examples can be run as is. * Most of the features are covered by the documentation, ensured by test coverage. #### Apps and docs at the same time If you run the examples with, e.g.:
```console $ uvicorn tutorial001:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
as Uvicorn by default will use the port `8000`, the documentation on port `8008` won't clash. ### Translations Help with translations is VERY MUCH appreciated! And it can't be done without the help from the community. 🌎 🚀 Here are the steps to help with translations. #### Tips and guidelines * Check the currently existing pull requests for your language. You can filter the pull requests by the ones with the label for your language. For example, for Spanish, the label is `lang-es`. * Review those pull requests, requesting changes or approving them. For the languages I don't speak, I'll wait for several others to review the translation before merging. !!! tip You can add comments with change suggestions to existing pull requests. Check the docs about adding a pull request review to approve it or request changes. * Check if there's a GitHub Discussion to coordinate translations for your language. You can subscribe to it, and when there's a new pull request to review, an automatic comment will be added to the discussion. * If you translate pages, add a single pull request per page translated. That will make it much easier for others to review it. * To check the 2-letter code for the language you want to translate, you can use the table List of ISO 639-1 codes. #### Existing language Let's say you want to translate a page for a language that already has translations for some pages, like Spanish. In the case of Spanish, the 2-letter code is `es`. So, the directory for Spanish translations is located at `docs/es/`. !!! tip The main ("official") language is English, located at `docs/en/`. Now run the live server for the docs in Spanish:
```console // Use the command "live" and pass the language code as a CLI argument $ python ./scripts/docs.py live es [INFO] Serving on http://127.0.0.1:8008 [INFO] Start watching changes [INFO] Start detecting changes ```
!!! tip Alternatively, you can perform the same steps that scripts does manually. Go into the language directory, for the Spanish translations it's at `docs/es/`: ```console $ cd docs/es/ ``` Then run `mkdocs` in that directory: ```console $ mkdocs serve --dev-addr 8008 ``` Now you can go to http://127.0.0.1:8008 and see your changes live. You will see that every language has all the pages. But some pages are not translated and have an info box at the top, about the missing translation. Now let's say that you want to add a translation for the section [Features](features.md){.internal-link target=_blank}. * Copy the file at: ``` docs/en/docs/features.md ``` * Paste it in exactly the same location but for the language you want to translate, e.g.: ``` docs/es/docs/features.md ``` !!! tip Notice that the only change in the path and file name is the language code, from `en` to `es`. If you go to your browser you will see that now the docs show your new section (the info box at the top is gone). 🎉 Now you can translate it all and see how it looks as you save the file. #### New Language Let's say that you want to add translations for a language that is not yet translated, not even some pages. Let's say you want to add translations for Creole, and it's not yet there in the docs. Checking the link from above, the code for "Creole" is `ht`. The next step is to run the script to generate a new translation directory:
```console // Use the command new-lang, pass the language code as a CLI argument $ python ./scripts/docs.py new-lang ht Successfully initialized: docs/ht ```
Now you can check in your code editor the newly created directory `docs/ht/`. That command created a file `docs/ht/mkdocs.yml` with a simple config that inherits everything from the `en` version: ```yaml INHERIT: ../en/mkdocs.yml ``` !!! tip You could also simply create that file with those contents manually. That command also created a dummy file `docs/ht/index.md` for the main page, you can start by translating that one. You can continue with the previous instructions for an "Existing Language" for that process. You can make the first pull request with those two files, `docs/ht/mkdocs.yml` and `docs/ht/index.md`. 🎉 #### Preview the result As already mentioned above, you can use the `./scripts/docs.py` with the `live` command to preview the results (or `mkdocs serve`). Once you are done, you can also test it all as it would look online, including all the other languages. To do that, first build all the docs:
```console // Use the command "build-all", this will take a bit $ python ./scripts/docs.py build-all Building docs for: en Building docs for: es Successfully built docs for: es ```
This builds all those independent MkDocs sites for each language, combines them, and generates the final output at `./site/`. Then you can serve that with the command `serve`:
```console // Use the command "serve" after running "build-all" $ python ./scripts/docs.py serve Warning: this is a very simple server. For development, use mkdocs serve instead. This is here only to preview a site with translations already built. Make sure you run the build-all command first. Serving at: http://127.0.0.1:8008 ```
#### Translation specific tips and guidelines * Translate only the Markdown documents (`.md`). Do not translate the code examples at `./docs_src`. * In code blocks within the Markdown document, translate comments (`# a comment`), but leave the rest unchanged. * Do not change anything enclosed in "``" (inline code). * In lines starting with `===` or `!!!`, translate only the ` "... Text ..."` part. Leave the rest unchanged. * You can translate info boxes like `!!! warning` with for example `!!! warning "Achtung"`. But do not change the word immediately after the `!!!`, it determines the color of the info box. * Do not change the paths in links to images, code files, Markdown documents. * However, when a Markdown document is translated, the `#hash-parts` in links to its headings may change. Update these links if possible. * Search for such links in the translated document using the regex `#[^# ]`. * Search in all documents already translated into your language for `your-translated-document.md`. For example VS Code has an option "Edit" -> "Find in Files". * When translating a document, do not "pre-translate" `#hash-parts` that link to headings in untranslated documents. ## Tests There is a script that you can run locally to test all the code and generate coverage reports in HTML:
```console $ bash scripts/test-cov-html.sh ```
This command generates a directory `./htmlcov/`, if you open the file `./htmlcov/index.html` in your browser, you can explore interactively the regions of code that are covered by the tests, and notice if there is any region missing. fastapi-0.110.3/docs/en/docs/css/000077500000000000000000000000001461403617600163655ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/css/custom.css000066400000000000000000000055321461403617600204160ustar00rootroot00000000000000.termynal-comment { color: #4a968f; font-style: italic; display: block; } .termy { /* For right to left languages */ direction: ltr; } .termy [data-termynal] { white-space: pre-wrap; } a.external-link { /* For right to left languages */ direction: ltr; display: inline-block; } a.external-link::after { /* \00A0 is a non-breaking space to make the mark be on the same line as the link */ content: "\00A0[↪]"; } a.internal-link::after { /* \00A0 is a non-breaking space to make the mark be on the same line as the link */ content: "\00A0↪"; } .shadow { box-shadow: 5px 5px 10px #999; } /* Give space to lower icons so Gitter chat doesn't get on top of them */ .md-footer-meta { padding-bottom: 2em; } .user-list { display: flex; flex-wrap: wrap; margin-bottom: 2rem; } .user-list-center { justify-content: space-evenly; } .user { margin: 1em; min-width: 7em; } .user .avatar-wrapper { width: 80px; height: 80px; margin: 10px auto; overflow: hidden; border-radius: 50%; position: relative; } .user .avatar-wrapper img { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } .user .title { text-align: center; } .user .count { font-size: 80%; text-align: center; } a.announce-link:link, a.announce-link:visited { color: #fff; } a.announce-link:hover { color: var(--md-accent-fg-color); } .announce-wrapper { display: flex; justify-content: space-between; flex-wrap: wrap; align-items: center; } .announce-wrapper div.item { display: none; } .announce-wrapper .sponsor-badge { display: block; position: absolute; top: -10px; right: 0; font-size: 0.5rem; color: #999; background-color: #666; border-radius: 10px; padding: 0 10px; z-index: 10; } .announce-wrapper .sponsor-image { display: block; border-radius: 20px; } .announce-wrapper>div { min-height: 40px; display: flex; align-items: center; } .twitter { color: #00acee; } /* Right to left languages */ code { direction: ltr; display: inline-block; } .illustration { margin-top: 2em; margin-bottom: 2em; } /* Screenshots */ /* Simulate a browser window frame. Inspired by Termynal's CSS tricks with modifications */ .screenshot { display: block; background-color: #d3e0de; border-radius: 4px; padding: 45px 5px 5px; position: relative; -webkit-box-sizing: border-box; box-sizing: border-box; } .screenshot img { display: block; border-radius: 2px; } .screenshot:before { content: ''; position: absolute; top: 15px; left: 15px; display: inline-block; width: 15px; height: 15px; border-radius: 50%; /* A little hack to display the window buttons in one pseudo element. */ background: #d9515d; -webkit-box-shadow: 25px 0 0 #f4c025, 50px 0 0 #3ec930; box-shadow: 25px 0 0 #f4c025, 50px 0 0 #3ec930; } fastapi-0.110.3/docs/en/docs/css/termynal.css000066400000000000000000000042201461403617600207300ustar00rootroot00000000000000/** * termynal.js * * @author Ines Montani * @version 0.0.1 * @license MIT */ :root { --color-bg: #252a33; --color-text: #eee; --color-text-subtle: #a2a2a2; } [data-termynal] { width: 750px; max-width: 100%; background: var(--color-bg); color: var(--color-text); /* font-size: 18px; */ font-size: 15px; /* font-family: 'Fira Mono', Consolas, Menlo, Monaco, 'Courier New', Courier, monospace; */ font-family: 'Roboto Mono', 'Fira Mono', Consolas, Menlo, Monaco, 'Courier New', Courier, monospace; border-radius: 4px; padding: 75px 45px 35px; position: relative; -webkit-box-sizing: border-box; box-sizing: border-box; } [data-termynal]:before { content: ''; position: absolute; top: 15px; left: 15px; display: inline-block; width: 15px; height: 15px; border-radius: 50%; /* A little hack to display the window buttons in one pseudo element. */ background: #d9515d; -webkit-box-shadow: 25px 0 0 #f4c025, 50px 0 0 #3ec930; box-shadow: 25px 0 0 #f4c025, 50px 0 0 #3ec930; } [data-termynal]:after { content: 'bash'; position: absolute; color: var(--color-text-subtle); top: 5px; left: 0; width: 100%; text-align: center; } a[data-terminal-control] { text-align: right; display: block; color: #aebbff; } [data-ty] { display: block; line-height: 2; } [data-ty]:before { /* Set up defaults and ensure empty lines are displayed. */ content: ''; display: inline-block; vertical-align: middle; } [data-ty="input"]:before, [data-ty-prompt]:before { margin-right: 0.75em; color: var(--color-text-subtle); } [data-ty="input"]:before { content: '$'; } [data-ty][data-ty-prompt]:before { content: attr(data-ty-prompt); } [data-ty-cursor]:after { content: attr(data-ty-cursor); font-family: monospace; margin-left: 0.5em; -webkit-animation: blink 1s infinite; animation: blink 1s infinite; } /* Cursor animation */ @-webkit-keyframes blink { 50% { opacity: 0; } } @keyframes blink { 50% { opacity: 0; } } fastapi-0.110.3/docs/en/docs/deployment/000077500000000000000000000000001461403617600177555ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/deployment/cloud.md000066400000000000000000000023551461403617600214120ustar00rootroot00000000000000# Deploy FastAPI on Cloud Providers You can use virtually **any cloud provider** to deploy your FastAPI application. In most of the cases, the main cloud providers have guides to deploy FastAPI with them. ## Cloud Providers - Sponsors Some cloud providers ✨ [**sponsor FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨, this ensures the continued and healthy **development** of FastAPI and its **ecosystem**. And it shows their true commitment to FastAPI and its **community** (you), as they not only want to provide you a **good service** but also want to make sure you have a **good and healthy framework**, FastAPI. 🙇 You might want to try their services and follow their guides: * Platform.sh * Porter * Coherence fastapi-0.110.3/docs/en/docs/deployment/concepts.md000066400000000000000000000437401461403617600221250ustar00rootroot00000000000000# Deployments Concepts When deploying a **FastAPI** application, or actually, any type of web API, there are several concepts that you probably care about, and using them you can find the **most appropriate** way to **deploy your application**. Some of the important concepts are: * Security - HTTPS * Running on startup * Restarts * Replication (the number of processes running) * Memory * Previous steps before starting We'll see how they would affect **deployments**. In the end, the ultimate objective is to be able to **serve your API clients** in a way that is **secure**, to **avoid disruptions**, and to use the **compute resources** (for example remote servers/virtual machines) as efficiently as possible. 🚀 I'll tell you a bit more about these **concepts** here, and that would hopefully give you the **intuition** you would need to decide how to deploy your API in very different environments, possibly even in **future** ones that don't exist yet. By considering these concepts, you will be able to **evaluate and design** the best way to deploy **your own APIs**. In the next chapters, I'll give you more **concrete recipes** to deploy FastAPI applications. But for now, let's check these important **conceptual ideas**. These concepts also apply to any other type of web API. 💡 ## Security - HTTPS In the [previous chapter about HTTPS](https.md){.internal-link target=_blank} we learned about how HTTPS provides encryption for your API. We also saw that HTTPS is normally provided by a component **external** to your application server, a **TLS Termination Proxy**. And there has to be something in charge of **renewing the HTTPS certificates**, it could be the same component or it could be something different. ### Example Tools for HTTPS Some of the tools you could use as a TLS Termination Proxy are: * Traefik * Automatically handles certificates renewals ✨ * Caddy * Automatically handles certificates renewals ✨ * Nginx * With an external component like Certbot for certificate renewals * HAProxy * With an external component like Certbot for certificate renewals * Kubernetes with an Ingress Controller like Nginx * With an external component like cert-manager for certificate renewals * Handled internally by a cloud provider as part of their services (read below 👇) Another option is that you could use a **cloud service** that does more of the work including setting up HTTPS. It could have some restrictions or charge you more, etc. But in that case, you wouldn't have to set up a TLS Termination Proxy yourself. I'll show you some concrete examples in the next chapters. --- Then the next concepts to consider are all about the program running your actual API (e.g. Uvicorn). ## Program and Process We will talk a lot about the running "**process**", so it's useful to have clarity about what it means, and what's the difference with the word "**program**". ### What is a Program The word **program** is commonly used to describe many things: * The **code** that you write, the **Python files**. * The **file** that can be **executed** by the operating system, for example: `python`, `python.exe` or `uvicorn`. * A particular program while it is **running** on the operating system, using the CPU, and storing things on memory. This is also called a **process**. ### What is a Process The word **process** is normally used in a more specific way, only referring to the thing that is running in the operating system (like in the last point above): * A particular program while it is **running** on the operating system. * This doesn't refer to the file, nor to the code, it refers **specifically** to the thing that is being **executed** and managed by the operating system. * Any program, any code, **can only do things** when it is being **executed**. So, when there's a **process running**. * The process can be **terminated** (or "killed") by you, or by the operating system. At that point, it stops running/being executed, and it can **no longer do things**. * Each application that you have running on your computer has some process behind it, each running program, each window, etc. And there are normally many processes running **at the same time** while a computer is on. * There can be **multiple processes** of the **same program** running at the same time. If you check out the "task manager" or "system monitor" (or similar tools) in your operating system, you will be able to see many of those processes running. And, for example, you will probably see that there are multiple processes running the same browser program (Firefox, Chrome, Edge, etc). They normally run one process per tab, plus some other extra processes. --- Now that we know the difference between the terms **process** and **program**, let's continue talking about deployments. ## Running on Startup In most cases, when you create a web API, you want it to be **always running**, uninterrupted, so that your clients can always access it. This is of course, unless you have a specific reason why you want it to run only in certain situations, but most of the time you want it constantly running and **available**. ### In a Remote Server When you set up a remote server (a cloud server, a virtual machine, etc.) the simplest thing you can do is to run Uvicorn (or similar) manually, the same way you do when developing locally. And it will work and will be useful **during development**. But if your connection to the server is lost, the **running process** will probably die. And if the server is restarted (for example after updates, or migrations from the cloud provider) you probably **won't notice it**. And because of that, you won't even know that you have to restart the process manually. So, your API will just stay dead. 😱 ### Run Automatically on Startup In general, you will probably want the server program (e.g. Uvicorn) to be started automatically on server startup, and without needing any **human intervention**, to have a process always running with your API (e.g. Uvicorn running your FastAPI app). ### Separate Program To achieve this, you will normally have a **separate program** that would make sure your application is run on startup. And in many cases, it would also make sure other components or applications are also run, for example, a database. ### Example Tools to Run at Startup Some examples of the tools that can do this job are: * Docker * Kubernetes * Docker Compose * Docker in Swarm Mode * Systemd * Supervisor * Handled internally by a cloud provider as part of their services * Others... I'll give you more concrete examples in the next chapters. ## Restarts Similar to making sure your application is run on startup, you probably also want to make sure it is **restarted** after failures. ### We Make Mistakes We, as humans, make **mistakes**, all the time. Software almost *always* has **bugs** hidden in different places. 🐛 And we as developers keep improving the code as we find those bugs and as we implement new features (possibly adding new bugs too 😅). ### Small Errors Automatically Handled When building web APIs with FastAPI, if there's an error in our code, FastAPI will normally contain it to the single request that triggered the error. 🛡 The client will get a **500 Internal Server Error** for that request, but the application will continue working for the next requests instead of just crashing completely. ### Bigger Errors - Crashes Nevertheless, there might be cases where we write some code that **crashes the entire application** making Uvicorn and Python crash. 💥 And still, you would probably not want the application to stay dead because there was an error in one place, you probably want it to **continue running** at least for the *path operations* that are not broken. ### Restart After Crash But in those cases with really bad errors that crash the running **process**, you would want an external component that is in charge of **restarting** the process, at least a couple of times... !!! tip ...Although if the whole application is just **crashing immediately** it probably doesn't make sense to keep restarting it forever. But in those cases, you will probably notice it during development, or at least right after deployment. So let's focus on the main cases, where it could crash entirely in some particular cases **in the future**, and it still makes sense to restart it. You would probably want to have the thing in charge of restarting your application as an **external component**, because by that point, the same application with Uvicorn and Python already crashed, so there's nothing in the same code of the same app that could do anything about it. ### Example Tools to Restart Automatically In most cases, the same tool that is used to **run the program on startup** is also used to handle automatic **restarts**. For example, this could be handled by: * Docker * Kubernetes * Docker Compose * Docker in Swarm Mode * Systemd * Supervisor * Handled internally by a cloud provider as part of their services * Others... ## Replication - Processes and Memory With a FastAPI application, using a server program like Uvicorn, running it once in **one process** can serve multiple clients concurrently. But in many cases, you will want to run several worker processes at the same time. ### Multiple Processes - Workers If you have more clients than what a single process can handle (for example if the virtual machine is not too big) and you have **multiple cores** in the server's CPU, then you could have **multiple processes** running with the same application at the same time, and distribute all the requests among them. When you run **multiple processes** of the same API program, they are commonly called **workers**. ### Worker Processes and Ports Remember from the docs [About HTTPS](https.md){.internal-link target=_blank} that only one process can be listening on one combination of port and IP address in a server? This is still true. So, to be able to have **multiple processes** at the same time, there has to be a **single process listening on a port** that then transmits the communication to each worker process in some way. ### Memory per Process Now, when the program loads things in memory, for example, a machine learning model in a variable, or the contents of a large file in a variable, all that **consumes a bit of the memory (RAM)** of the server. And multiple processes normally **don't share any memory**. This means that each running process has its own things, variables, and memory. And if you are consuming a large amount of memory in your code, **each process** will consume an equivalent amount of memory. ### Server Memory For example, if your code loads a Machine Learning model with **1 GB in size**, when you run one process with your API, it will consume at least 1 GB of RAM. And if you start **4 processes** (4 workers), each will consume 1 GB of RAM. So in total, your API will consume **4 GB of RAM**. And if your remote server or virtual machine only has 3 GB of RAM, trying to load more than 4 GB of RAM will cause problems. 🚨 ### Multiple Processes - An Example In this example, there's a **Manager Process** that starts and controls two **Worker Processes**. This Manager Process would probably be the one listening on the **port** in the IP. And it would transmit all the communication to the worker processes. Those worker processes would be the ones running your application, they would perform the main computations to receive a **request** and return a **response**, and they would load anything you put in variables in RAM. And of course, the same machine would probably have **other processes** running as well, apart from your application. An interesting detail is that the percentage of the **CPU used** by each process can **vary** a lot over time, but the **memory (RAM)** normally stays more or less **stable**. If you have an API that does a comparable amount of computations every time and you have a lot of clients, then the **CPU utilization** will probably *also be stable* (instead of constantly going up and down quickly). ### Examples of Replication Tools and Strategies There can be several approaches to achieve this, and I'll tell you more about specific strategies in the next chapters, for example when talking about Docker and containers. The main constraint to consider is that there has to be a **single** component handling the **port** in the **public IP**. And then it has to have a way to **transmit** the communication to the replicated **processes/workers**. Here are some possible combinations and strategies: * **Gunicorn** managing **Uvicorn workers** * Gunicorn would be the **process manager** listening on the **IP** and **port**, the replication would be by having **multiple Uvicorn worker processes**. * **Uvicorn** managing **Uvicorn workers** * One Uvicorn **process manager** would listen on the **IP** and **port**, and it would start **multiple Uvicorn worker processes**. * **Kubernetes** and other distributed **container systems** * Something in the **Kubernetes** layer would listen on the **IP** and **port**. The replication would be by having **multiple containers**, each with **one Uvicorn process** running. * **Cloud services** that handle this for you * The cloud service will probably **handle replication for you**. It would possibly let you define **a process to run**, or a **container image** to use, in any case, it would most probably be **a single Uvicorn process**, and the cloud service would be in charge of replicating it. !!! tip Don't worry if some of these items about **containers**, Docker, or Kubernetes don't make a lot of sense yet. I'll tell you more about container images, Docker, Kubernetes, etc. in a future chapter: [FastAPI in Containers - Docker](docker.md){.internal-link target=_blank}. ## Previous Steps Before Starting There are many cases where you want to perform some steps **before starting** your application. For example, you might want to run **database migrations**. But in most cases, you will want to perform these steps only **once**. So, you will want to have a **single process** to perform those **previous steps**, before starting the application. And you will have to make sure that it's a single process running those previous steps *even* if afterwards, you start **multiple processes** (multiple workers) for the application itself. If those steps were run by **multiple processes**, they would **duplicate** the work by running it on **parallel**, and if the steps were something delicate like a database migration, they could cause conflicts with each other. Of course, there are some cases where there's no problem in running the previous steps multiple times, in that case, it's a lot easier to handle. !!! tip Also, keep in mind that depending on your setup, in some cases you **might not even need any previous steps** before starting your application. In that case, you wouldn't have to worry about any of this. 🤷 ### Examples of Previous Steps Strategies This will **depend heavily** on the way you **deploy your system**, and it would probably be connected to the way you start programs, handling restarts, etc. Here are some possible ideas: * An "Init Container" in Kubernetes that runs before your app container * A bash script that runs the previous steps and then starts your application * You would still need a way to start/restart *that* bash script, detect errors, etc. !!! tip I'll give you more concrete examples for doing this with containers in a future chapter: [FastAPI in Containers - Docker](docker.md){.internal-link target=_blank}. ## Resource Utilization Your server(s) is (are) a **resource**, you can consume or **utilize**, with your programs, the computation time on the CPUs, and the RAM memory available. How much of the system resources do you want to be consuming/utilizing? It might be easy to think "not much", but in reality, you will probably want to consume **as much as possible without crashing**. If you are paying for 3 servers but you are using only a little bit of their RAM and CPU, you are probably **wasting money** 💸, and probably **wasting server electric power** 🌎, etc. In that case, it could be better to have only 2 servers and use a higher percentage of their resources (CPU, memory, disk, network bandwidth, etc). On the other hand, if you have 2 servers and you are using **100% of their CPU and RAM**, at some point one process will ask for more memory, and the server will have to use the disk as "memory" (which can be thousands of times slower), or even **crash**. Or one process might need to do some computation and would have to wait until the CPU is free again. In this case, it would be better to get **one extra server** and run some processes on it so that they all have **enough RAM and CPU time**. There's also the chance that for some reason you have a **spike** of usage of your API. Maybe it went viral, or maybe some other services or bots start using it. And you might want to have extra resources to be safe in those cases. You could put an **arbitrary number** to target, for example, something **between 50% to 90%** of resource utilization. The point is that those are probably the main things you will want to measure and use to tweak your deployments. You can use simple tools like `htop` to see the CPU and RAM used in your server or the amount used by each process. Or you can use more complex monitoring tools, which may be distributed across servers, etc. ## Recap You have been reading here some of the main concepts that you would probably need to keep in mind when deciding how to deploy your application: * Security - HTTPS * Running on startup * Restarts * Replication (the number of processes running) * Memory * Previous steps before starting Understanding these ideas and how to apply them should give you the intuition necessary to take any decisions when configuring and tweaking your deployments. 🤓 In the next sections, I'll give you more concrete examples of possible strategies you can follow. 🚀 fastapi-0.110.3/docs/en/docs/deployment/docker.md000066400000000000000000001045171461403617600215560ustar00rootroot00000000000000# FastAPI in Containers - Docker When deploying FastAPI applications a common approach is to build a **Linux container image**. It's normally done using **Docker**. You can then deploy that container image in one of a few possible ways. Using Linux containers has several advantages including **security**, **replicability**, **simplicity**, and others. !!! tip In a hurry and already know this stuff? Jump to the [`Dockerfile` below 👇](#build-a-docker-image-for-fastapi).
Dockerfile Preview 👀 ```Dockerfile FROM python:3.9 WORKDIR /code COPY ./requirements.txt /code/requirements.txt RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt COPY ./app /code/app CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] # If running behind a proxy like Nginx or Traefik add --proxy-headers # CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80", "--proxy-headers"] ```
## What is a Container Containers (mainly Linux containers) are a very **lightweight** way to package applications including all their dependencies and necessary files while keeping them isolated from other containers (other applications or components) in the same system. Linux containers run using the same Linux kernel of the host (machine, virtual machine, cloud server, etc). This just means that they are very lightweight (compared to full virtual machines emulating an entire operating system). This way, containers consume **little resources**, an amount comparable to running the processes directly (a virtual machine would consume much more). Containers also have their own **isolated** running processes (commonly just one process), file system, and network, simplifying deployment, security, development, etc. ## What is a Container Image A **container** is run from a **container image**. A container image is a **static** version of all the files, environment variables, and the default command/program that should be present in a container. **Static** here means that the container **image** is not running, it's not being executed, it's only the packaged files and metadata. In contrast to a "**container image**" that is the stored static contents, a "**container**" normally refers to the running instance, the thing that is being **executed**. When the **container** is started and running (started from a **container image**) it could create or change files, environment variables, etc. Those changes will exist only in that container, but would not persist in the underlying container image (would not be saved to disk). A container image is comparable to the **program** file and contents, e.g. `python` and some file `main.py`. And the **container** itself (in contrast to the **container image**) is the actual running instance of the image, comparable to a **process**. In fact, a container is running only when it has a **process running** (and normally it's only a single process). The container stops when there's no process running in it. ## Container Images Docker has been one of the main tools to create and manage **container images** and **containers**. And there's a public Docker Hub with pre-made **official container images** for many tools, environments, databases, and applications. For example, there's an official Python Image. And there are many other images for different things like databases, for example for: * PostgreSQL * MySQL * MongoDB * Redis, etc. By using a pre-made container image it's very easy to **combine** and use different tools. For example, to try out a new database. In most cases, you can use the **official images**, and just configure them with environment variables. That way, in many cases you can learn about containers and Docker and re-use that knowledge with many different tools and components. So, you would run **multiple containers** with different things, like a database, a Python application, a web server with a React frontend application, and connect them together via their internal network. All the container management systems (like Docker or Kubernetes) have these networking features integrated into them. ## Containers and Processes A **container image** normally includes in its metadata the default program or command that should be run when the **container** is started and the parameters to be passed to that program. Very similar to what would be if it was in the command line. When a **container** is started, it will run that command/program (although you can override it and make it run a different command/program). A container is running as long as the **main process** (command or program) is running. A container normally has a **single process**, but it's also possible to start subprocesses from the main process, and that way you will have **multiple processes** in the same container. But it's not possible to have a running container without **at least one running process**. If the main process stops, the container stops. ## Build a Docker Image for FastAPI Okay, let's build something now! 🚀 I'll show you how to build a **Docker image** for FastAPI **from scratch**, based on the **official Python** image. This is what you would want to do in **most cases**, for example: * Using **Kubernetes** or similar tools * When running on a **Raspberry Pi** * Using a cloud service that would run a container image for you, etc. ### Package Requirements You would normally have the **package requirements** for your application in some file. It would depend mainly on the tool you use to **install** those requirements. The most common way to do it is to have a file `requirements.txt` with the package names and their versions, one per line. You would of course use the same ideas you read in [About FastAPI versions](versions.md){.internal-link target=_blank} to set the ranges of versions. For example, your `requirements.txt` could look like: ``` fastapi>=0.68.0,<0.69.0 pydantic>=1.8.0,<2.0.0 uvicorn>=0.15.0,<0.16.0 ``` And you would normally install those package dependencies with `pip`, for example:
```console $ pip install -r requirements.txt ---> 100% Successfully installed fastapi pydantic uvicorn ```
!!! info There are other formats and tools to define and install package dependencies. I'll show you an example using Poetry later in a section below. 👇 ### Create the **FastAPI** Code * Create an `app` directory and enter it. * Create an empty file `__init__.py`. * Create a `main.py` file with: ```Python from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ``` ### Dockerfile Now in the same project directory create a file `Dockerfile` with: ```{ .dockerfile .annotate } # (1) FROM python:3.9 # (2) WORKDIR /code # (3) COPY ./requirements.txt /code/requirements.txt # (4) RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt # (5) COPY ./app /code/app # (6) CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] ``` 1. Start from the official Python base image. 2. Set the current working directory to `/code`. This is where we'll put the `requirements.txt` file and the `app` directory. 3. Copy the file with the requirements to the `/code` directory. Copy **only** the file with the requirements first, not the rest of the code. As this file **doesn't change often**, Docker will detect it and use the **cache** for this step, enabling the cache for the next step too. 4. Install the package dependencies in the requirements file. The `--no-cache-dir` option tells `pip` to not save the downloaded packages locally, as that is only if `pip` was going to be run again to install the same packages, but that's not the case when working with containers. !!! note The `--no-cache-dir` is only related to `pip`, it has nothing to do with Docker or containers. The `--upgrade` option tells `pip` to upgrade the packages if they are already installed. Because the previous step copying the file could be detected by the **Docker cache**, this step will also **use the Docker cache** when available. Using the cache in this step will **save** you a lot of **time** when building the image again and again during development, instead of **downloading and installing** all the dependencies **every time**. 5. Copy the `./app` directory inside the `/code` directory. As this has all the code which is what **changes most frequently** the Docker **cache** won't be used for this or any **following steps** easily. So, it's important to put this **near the end** of the `Dockerfile`, to optimize the container image build times. 6. Set the **command** to run the `uvicorn` server. `CMD` takes a list of strings, each of these strings is what you would type in the command line separated by spaces. This command will be run from the **current working directory**, the same `/code` directory you set above with `WORKDIR /code`. Because the program will be started at `/code` and inside of it is the directory `./app` with your code, **Uvicorn** will be able to see and **import** `app` from `app.main`. !!! tip Review what each line does by clicking each number bubble in the code. 👆 You should now have a directory structure like: ``` . ├── app │   ├── __init__.py │ └── main.py ├── Dockerfile └── requirements.txt ``` #### Behind a TLS Termination Proxy If you are running your container behind a TLS Termination Proxy (load balancer) like Nginx or Traefik, add the option `--proxy-headers`, this will tell Uvicorn to trust the headers sent by that proxy telling it that the application is running behind HTTPS, etc. ```Dockerfile CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"] ``` #### Docker Cache There's an important trick in this `Dockerfile`, we first copy the **file with the dependencies alone**, not the rest of the code. Let me tell you why is that. ```Dockerfile COPY ./requirements.txt /code/requirements.txt ``` Docker and other tools **build** these container images **incrementally**, adding **one layer on top of the other**, starting from the top of the `Dockerfile` and adding any files created by each of the instructions of the `Dockerfile`. Docker and similar tools also use an **internal cache** when building the image, if a file hasn't changed since the last time building the container image, then it will **re-use the same layer** created the last time, instead of copying the file again and creating a new layer from scratch. Just avoiding the copy of files doesn't necessarily improve things too much, but because it used the cache for that step, it can **use the cache for the next step**. For example, it could use the cache for the instruction that installs dependencies with: ```Dockerfile RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt ``` The file with the package requirements **won't change frequently**. So, by copying only that file, Docker will be able to **use the cache** for that step. And then, Docker will be able to **use the cache for the next step** that downloads and install those dependencies. And here's where we **save a lot of time**. ✨ ...and avoid boredom waiting. 😪😆 Downloading and installing the package dependencies **could take minutes**, but using the **cache** would **take seconds** at most. And as you would be building the container image again and again during development to check that your code changes are working, there's a lot of accumulated time this would save. Then, near the end of the `Dockerfile`, we copy all the code. As this is what **changes most frequently**, we put it near the end, because almost always, anything after this step will not be able to use the cache. ```Dockerfile COPY ./app /code/app ``` ### Build the Docker Image Now that all the files are in place, let's build the container image. * Go to the project directory (in where your `Dockerfile` is, containing your `app` directory). * Build your FastAPI image:
```console $ docker build -t myimage . ---> 100% ```
!!! tip Notice the `.` at the end, it's equivalent to `./`, it tells Docker the directory to use to build the container image. In this case, it's the same current directory (`.`). ### Start the Docker Container * Run a container based on your image:
```console $ docker run -d --name mycontainer -p 80:80 myimage ```
## Check it You should be able to check it in your Docker container's URL, for example: http://192.168.99.100/items/5?q=somequery or http://127.0.0.1/items/5?q=somequery (or equivalent, using your Docker host). You will see something like: ```JSON {"item_id": 5, "q": "somequery"} ``` ## Interactive API docs Now you can go to http://192.168.99.100/docs or http://127.0.0.1/docs (or equivalent, using your Docker host). You will see the automatic interactive API documentation (provided by Swagger UI): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ## Alternative API docs And you can also go to http://192.168.99.100/redoc or http://127.0.0.1/redoc (or equivalent, using your Docker host). You will see the alternative automatic documentation (provided by ReDoc): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ## Build a Docker Image with a Single-File FastAPI If your FastAPI is a single file, for example, `main.py` without an `./app` directory, your file structure could look like this: ``` . ├── Dockerfile ├── main.py └── requirements.txt ``` Then you would just have to change the corresponding paths to copy the file inside the `Dockerfile`: ```{ .dockerfile .annotate hl_lines="10 13" } FROM python:3.9 WORKDIR /code COPY ./requirements.txt /code/requirements.txt RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt # (1) COPY ./main.py /code/ # (2) CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "80"] ``` 1. Copy the `main.py` file to the `/code` directory directly (without any `./app` directory). 2. Run Uvicorn and tell it to import the `app` object from `main` (instead of importing from `app.main`). Then adjust the Uvicorn command to use the new module `main` instead of `app.main` to import the FastAPI object `app`. ## Deployment Concepts Let's talk again about some of the same [Deployment Concepts](concepts.md){.internal-link target=_blank} in terms of containers. Containers are mainly a tool to simplify the process of **building and deploying** an application, but they don't enforce a particular approach to handle these **deployment concepts**, and there are several possible strategies. The **good news** is that with each different strategy there's a way to cover all of the deployment concepts. 🎉 Let's review these **deployment concepts** in terms of containers: * HTTPS * Running on startup * Restarts * Replication (the number of processes running) * Memory * Previous steps before starting ## HTTPS If we focus just on the **container image** for a FastAPI application (and later the running **container**), HTTPS normally would be handled **externally** by another tool. It could be another container, for example with Traefik, handling **HTTPS** and **automatic** acquisition of **certificates**. !!! tip Traefik has integrations with Docker, Kubernetes, and others, so it's very easy to set up and configure HTTPS for your containers with it. Alternatively, HTTPS could be handled by a cloud provider as one of their services (while still running the application in a container). ## Running on Startup and Restarts There is normally another tool in charge of **starting and running** your container. It could be **Docker** directly, **Docker Compose**, **Kubernetes**, a **cloud service**, etc. In most (or all) cases, there's a simple option to enable running the container on startup and enabling restarts on failures. For example, in Docker, it's the command line option `--restart`. Without using containers, making applications run on startup and with restarts can be cumbersome and difficult. But when **working with containers** in most cases that functionality is included by default. ✨ ## Replication - Number of Processes If you have a cluster of machines with **Kubernetes**, Docker Swarm Mode, Nomad, or another similar complex system to manage distributed containers on multiple machines, then you will probably want to **handle replication** at the **cluster level** instead of using a **process manager** (like Gunicorn with workers) in each container. One of those distributed container management systems like Kubernetes normally has some integrated way of handling **replication of containers** while still supporting **load balancing** for the incoming requests. All at the **cluster level**. In those cases, you would probably want to build a **Docker image from scratch** as [explained above](#dockerfile), installing your dependencies, and running **a single Uvicorn process** instead of running something like Gunicorn with Uvicorn workers. ### Load Balancer When using containers, you would normally have some component **listening on the main port**. It could possibly be another container that is also a **TLS Termination Proxy** to handle **HTTPS** or some similar tool. As this component would take the **load** of requests and distribute that among the workers in a (hopefully) **balanced** way, it is also commonly called a **Load Balancer**. !!! tip The same **TLS Termination Proxy** component used for HTTPS would probably also be a **Load Balancer**. And when working with containers, the same system you use to start and manage them would already have internal tools to transmit the **network communication** (e.g. HTTP requests) from that **load balancer** (that could also be a **TLS Termination Proxy**) to the container(s) with your app. ### One Load Balancer - Multiple Worker Containers When working with **Kubernetes** or similar distributed container management systems, using their internal networking mechanisms would allow the single **load balancer** that is listening on the main **port** to transmit communication (requests) to possibly **multiple containers** running your app. Each of these containers running your app would normally have **just one process** (e.g. a Uvicorn process running your FastAPI application). They would all be **identical containers**, running the same thing, but each with its own process, memory, etc. That way you would take advantage of **parallelization** in **different cores** of the CPU, or even in **different machines**. And the distributed container system with the **load balancer** would **distribute the requests** to each one of the containers with your app **in turns**. So, each request could be handled by one of the multiple **replicated containers** running your app. And normally this **load balancer** would be able to handle requests that go to *other* apps in your cluster (e.g. to a different domain, or under a different URL path prefix), and would transmit that communication to the right containers for *that other* application running in your cluster. ### One Process per Container In this type of scenario, you probably would want to have **a single (Uvicorn) process per container**, as you would already be handling replication at the cluster level. So, in this case, you **would not** want to have a process manager like Gunicorn with Uvicorn workers, or Uvicorn using its own Uvicorn workers. You would want to have just a **single Uvicorn process** per container (but probably multiple containers). Having another process manager inside the container (as would be with Gunicorn or Uvicorn managing Uvicorn workers) would only add **unnecessary complexity** that you are most probably already taking care of with your cluster system. ### Containers with Multiple Processes and Special Cases Of course, there are **special cases** where you could want to have **a container** with a **Gunicorn process manager** starting several **Uvicorn worker processes** inside. In those cases, you can use the **official Docker image** that includes **Gunicorn** as a process manager running multiple **Uvicorn worker processes**, and some default settings to adjust the number of workers based on the current CPU cores automatically. I'll tell you more about it below in [Official Docker Image with Gunicorn - Uvicorn](#official-docker-image-with-gunicorn-uvicorn). Here are some examples of when that could make sense: #### A Simple App You could want a process manager in the container if your application is **simple enough** that you don't need (at least not yet) to fine-tune the number of processes too much, and you can just use an automated default (with the official Docker image), and you are running it on a **single server**, not a cluster. #### Docker Compose You could be deploying to a **single server** (not a cluster) with **Docker Compose**, so you wouldn't have an easy way to manage replication of containers (with Docker Compose) while preserving the shared network and **load balancing**. Then you could want to have **a single container** with a **process manager** starting **several worker processes** inside. #### Prometheus and Other Reasons You could also have **other reasons** that would make it easier to have a **single container** with **multiple processes** instead of having **multiple containers** with **a single process** in each of them. For example (depending on your setup) you could have some tool like a Prometheus exporter in the same container that should have access to **each of the requests** that come. In this case, if you had **multiple containers**, by default, when Prometheus came to **read the metrics**, it would get the ones for **a single container each time** (for the container that handled that particular request), instead of getting the **accumulated metrics** for all the replicated containers. Then, in that case, it could be simpler to have **one container** with **multiple processes**, and a local tool (e.g. a Prometheus exporter) on the same container collecting Prometheus metrics for all the internal processes and exposing those metrics on that single container. --- The main point is, **none** of these are **rules written in stone** that you have to blindly follow. You can use these ideas to **evaluate your own use case** and decide what is the best approach for your system, checking out how to manage the concepts of: * Security - HTTPS * Running on startup * Restarts * Replication (the number of processes running) * Memory * Previous steps before starting ## Memory If you run **a single process per container** you will have a more or less well-defined, stable, and limited amount of memory consumed by each of those containers (more than one if they are replicated). And then you can set those same memory limits and requirements in your configurations for your container management system (for example in **Kubernetes**). That way it will be able to **replicate the containers** in the **available machines** taking into account the amount of memory needed by them, and the amount available in the machines in the cluster. If your application is **simple**, this will probably **not be a problem**, and you might not need to specify hard memory limits. But if you are **using a lot of memory** (for example with **machine learning** models), you should check how much memory you are consuming and adjust the **number of containers** that runs in **each machine** (and maybe add more machines to your cluster). If you run **multiple processes per container** (for example with the official Docker image) you will have to make sure that the number of processes started doesn't **consume more memory** than what is available. ## Previous Steps Before Starting and Containers If you are using containers (e.g. Docker, Kubernetes), then there are two main approaches you can use. ### Multiple Containers If you have **multiple containers**, probably each one running a **single process** (for example, in a **Kubernetes** cluster), then you would probably want to have a **separate container** doing the work of the **previous steps** in a single container, running a single process, **before** running the replicated worker containers. !!! info If you are using Kubernetes, this would probably be an Init Container. If in your use case there's no problem in running those previous steps **multiple times in parallel** (for example if you are not running database migrations, but just checking if the database is ready yet), then you could also just put them in each container right before starting the main process. ### Single Container If you have a simple setup, with a **single container** that then starts multiple **worker processes** (or also just one process), then you could run those previous steps in the same container, right before starting the process with the app. The official Docker image supports this internally. ## Official Docker Image with Gunicorn - Uvicorn There is an official Docker image that includes Gunicorn running with Uvicorn workers, as detailed in a previous chapter: [Server Workers - Gunicorn with Uvicorn](server-workers.md){.internal-link target=_blank}. This image would be useful mainly in the situations described above in: [Containers with Multiple Processes and Special Cases](#containers-with-multiple-processes-and-special-cases). * tiangolo/uvicorn-gunicorn-fastapi. !!! warning There's a high chance that you **don't** need this base image or any other similar one, and would be better off by building the image from scratch as [described above in: Build a Docker Image for FastAPI](#build-a-docker-image-for-fastapi). This image has an **auto-tuning** mechanism included to set the **number of worker processes** based on the CPU cores available. It has **sensible defaults**, but you can still change and update all the configurations with **environment variables** or configuration files. It also supports running **previous steps before starting** with a script. !!! tip To see all the configurations and options, go to the Docker image page: tiangolo/uvicorn-gunicorn-fastapi. ### Number of Processes on the Official Docker Image The **number of processes** on this image is **computed automatically** from the CPU **cores** available. This means that it will try to **squeeze** as much **performance** from the CPU as possible. You can also adjust it with the configurations using **environment variables**, etc. But it also means that as the number of processes depends on the CPU the container is running, the **amount of memory consumed** will also depend on that. So, if your application consumes a lot of memory (for example with machine learning models), and your server has a lot of CPU cores **but little memory**, then your container could end up trying to use more memory than what is available, and degrading performance a lot (or even crashing). 🚨 ### Create a `Dockerfile` Here's how you would create a `Dockerfile` based on this image: ```Dockerfile FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 COPY ./requirements.txt /app/requirements.txt RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt COPY ./app /app ``` ### Bigger Applications If you followed the section about creating [Bigger Applications with Multiple Files](../tutorial/bigger-applications.md){.internal-link target=_blank}, your `Dockerfile` might instead look like: ```Dockerfile hl_lines="7" FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9 COPY ./requirements.txt /app/requirements.txt RUN pip install --no-cache-dir --upgrade -r /app/requirements.txt COPY ./app /app/app ``` ### When to Use You should probably **not** use this official base image (or any other similar one) if you are using **Kubernetes** (or others) and you are already setting **replication** at the cluster level, with multiple **containers**. In those cases, you are better off **building an image from scratch** as described above: [Build a Docker Image for FastAPI](#build-a-docker-image-for-fastapi). This image would be useful mainly in the special cases described above in [Containers with Multiple Processes and Special Cases](#containers-with-multiple-processes-and-special-cases). For example, if your application is **simple enough** that setting a default number of processes based on the CPU works well, you don't want to bother with manually configuring the replication at the cluster level, and you are not running more than one container with your app. Or if you are deploying with **Docker Compose**, running on a single server, etc. ## Deploy the Container Image After having a Container (Docker) Image there are several ways to deploy it. For example: * With **Docker Compose** in a single server * With a **Kubernetes** cluster * With a Docker Swarm Mode cluster * With another tool like Nomad * With a cloud service that takes your container image and deploys it ## Docker Image with Poetry If you use Poetry to manage your project's dependencies, you could use Docker multi-stage building: ```{ .dockerfile .annotate } # (1) FROM python:3.9 as requirements-stage # (2) WORKDIR /tmp # (3) RUN pip install poetry # (4) COPY ./pyproject.toml ./poetry.lock* /tmp/ # (5) RUN poetry export -f requirements.txt --output requirements.txt --without-hashes # (6) FROM python:3.9 # (7) WORKDIR /code # (8) COPY --from=requirements-stage /tmp/requirements.txt /code/requirements.txt # (9) RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt # (10) COPY ./app /code/app # (11) CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"] ``` 1. This is the first stage, it is named `requirements-stage`. 2. Set `/tmp` as the current working directory. Here's where we will generate the file `requirements.txt` 3. Install Poetry in this Docker stage. 4. Copy the `pyproject.toml` and `poetry.lock` files to the `/tmp` directory. Because it uses `./poetry.lock*` (ending with a `*`), it won't crash if that file is not available yet. 5. Generate the `requirements.txt` file. 6. This is the final stage, anything here will be preserved in the final container image. 7. Set the current working directory to `/code`. 8. Copy the `requirements.txt` file to the `/code` directory. This file only lives in the previous Docker stage, that's why we use `--from-requirements-stage` to copy it. 9. Install the package dependencies in the generated `requirements.txt` file. 10. Copy the `app` directory to the `/code` directory. 11. Run the `uvicorn` command, telling it to use the `app` object imported from `app.main`. !!! tip Click the bubble numbers to see what each line does. A **Docker stage** is a part of a `Dockerfile` that works as a **temporary container image** that is only used to generate some files to be used later. The first stage will only be used to **install Poetry** and to **generate the `requirements.txt`** with your project dependencies from Poetry's `pyproject.toml` file. This `requirements.txt` file will be used with `pip` later in the **next stage**. In the final container image **only the final stage** is preserved. The previous stage(s) will be discarded. When using Poetry, it would make sense to use **Docker multi-stage builds** because you don't really need to have Poetry and its dependencies installed in the final container image, you **only need** to have the generated `requirements.txt` file to install your project dependencies. Then in the next (and final) stage you would build the image more or less in the same way as described before. ### Behind a TLS Termination Proxy - Poetry Again, if you are running your container behind a TLS Termination Proxy (load balancer) like Nginx or Traefik, add the option `--proxy-headers` to the command: ```Dockerfile CMD ["uvicorn", "app.main:app", "--proxy-headers", "--host", "0.0.0.0", "--port", "80"] ``` ## Recap Using container systems (e.g. with **Docker** and **Kubernetes**) it becomes fairly straightforward to handle all the **deployment concepts**: * HTTPS * Running on startup * Restarts * Replication (the number of processes running) * Memory * Previous steps before starting In most cases, you probably won't want to use any base image, and instead **build a container image from scratch** one based on the official Python Docker image. Taking care of the **order** of instructions in the `Dockerfile` and the **Docker cache** you can **minimize build times**, to maximize your productivity (and avoid boredom). 😎 In certain special cases, you might want to use the official Docker image for FastAPI. 🤓 fastapi-0.110.3/docs/en/docs/deployment/https.md000066400000000000000000000277201461403617600214510ustar00rootroot00000000000000# About HTTPS It is easy to assume that HTTPS is something that is just "enabled" or not. But it is way more complex than that. !!! tip If you are in a hurry or don't care, continue with the next sections for step by step instructions to set everything up with different techniques. To **learn the basics of HTTPS**, from a consumer perspective, check https://howhttps.works/. Now, from a **developer's perspective**, here are several things to keep in mind while thinking about HTTPS: * For HTTPS, **the server** needs to **have "certificates"** generated by a **third party**. * Those certificates are actually **acquired** from the third party, not "generated". * Certificates have a **lifetime**. * They **expire**. * And then they need to be **renewed**, **acquired again** from the third party. * The encryption of the connection happens at the **TCP level**. * That's one layer **below HTTP**. * So, the **certificate and encryption** handling is done **before HTTP**. * **TCP doesn't know about "domains"**. Only about IP addresses. * The information about the **specific domain** requested goes in the **HTTP data**. * The **HTTPS certificates** "certify" a **certain domain**, but the protocol and encryption happen at the TCP level, **before knowing** which domain is being dealt with. * **By default**, that would mean that you can only have **one HTTPS certificate per IP address**. * No matter how big your server is or how small each application you have on it might be. * There is a **solution** to this, however. * There's an **extension** to the **TLS** protocol (the one handling the encryption at the TCP level, before HTTP) called **SNI**. * This SNI extension allows one single server (with a **single IP address**) to have **several HTTPS certificates** and serve **multiple HTTPS domains/applications**. * For this to work, a **single** component (program) running on the server, listening on the **public IP address**, must have **all the HTTPS certificates** in the server. * **After** obtaining a secure connection, the communication protocol is **still HTTP**. * The contents are **encrypted**, even though they are being sent with the **HTTP protocol**. It is a common practice to have **one program/HTTP server** running on the server (the machine, host, etc.) and **managing all the HTTPS parts**: receiving the **encrypted HTTPS requests**, sending the **decrypted HTTP requests** to the actual HTTP application running in the same server (the **FastAPI** application, in this case), take the **HTTP response** from the application, **encrypt it** using the appropriate **HTTPS certificate** and sending it back to the client using **HTTPS**. This server is often called a **TLS Termination Proxy**. Some of the options you could use as a TLS Termination Proxy are: * Traefik (that can also handle certificate renewals) * Caddy (that can also handle certificate renewals) * Nginx * HAProxy ## Let's Encrypt Before Let's Encrypt, these **HTTPS certificates** were sold by trusted third parties. The process to acquire one of these certificates used to be cumbersome, require quite some paperwork and the certificates were quite expensive. But then **Let's Encrypt** was created. It is a project from the Linux Foundation. It provides **HTTPS certificates for free**, in an automated way. These certificates use all the standard cryptographic security, and are short-lived (about 3 months), so the **security is actually better** because of their reduced lifespan. The domains are securely verified and the certificates are generated automatically. This also allows automating the renewal of these certificates. The idea is to automate the acquisition and renewal of these certificates so that you can have **secure HTTPS, for free, forever**. ## HTTPS for Developers Here's an example of how an HTTPS API could look like, step by step, paying attention mainly to the ideas important for developers. ### Domain Name It would probably all start by you **acquiring** some **domain name**. Then, you would configure it in a DNS server (possibly your same cloud provider). You would probably get a cloud server (a virtual machine) or something similar, and it would have a fixed **public IP address**. In the DNS server(s) you would configure a record (an "`A record`") to point **your domain** to the public **IP address of your server**. You would probably do this just once, the first time, when setting everything up. !!! tip This Domain Name part is way before HTTPS, but as everything depends on the domain and the IP address, it's worth mentioning it here. ### DNS Now let's focus on all the actual HTTPS parts. First, the browser would check with the **DNS servers** what is the **IP for the domain**, in this case, `someapp.example.com`. The DNS servers would tell the browser to use some specific **IP address**. That would be the public IP address used by your server, that you configured in the DNS servers. ### TLS Handshake Start The browser would then communicate with that IP address on **port 443** (the HTTPS port). The first part of the communication is just to establish the connection between the client and the server and to decide the cryptographic keys they will use, etc. This interaction between the client and the server to establish the TLS connection is called the **TLS handshake**. ### TLS with SNI Extension **Only one process** in the server can be listening on a specific **port** in a specific **IP address**. There could be other processes listening on other ports in the same IP address, but only one for each combination of IP address and port. TLS (HTTPS) uses the specific port `443` by default. So that's the port we would need. As only one process can be listening on this port, the process that would do it would be the **TLS Termination Proxy**. The TLS Termination Proxy would have access to one or more **TLS certificates** (HTTPS certificates). Using the **SNI extension** discussed above, the TLS Termination Proxy would check which of the TLS (HTTPS) certificates available it should use for this connection, using the one that matches the domain expected by the client. In this case, it would use the certificate for `someapp.example.com`. The client already **trusts** the entity that generated that TLS certificate (in this case Let's Encrypt, but we'll see about that later), so it can **verify** that the certificate is valid. Then, using the certificate, the client and the TLS Termination Proxy **decide how to encrypt** the rest of the **TCP communication**. This completes the **TLS Handshake** part. After this, the client and the server have an **encrypted TCP connection**, this is what TLS provides. And then they can use that connection to start the actual **HTTP communication**. And that's what **HTTPS** is, it's just plain **HTTP** inside a **secure TLS connection** instead of a pure (unencrypted) TCP connection. !!! tip Notice that the encryption of the communication happens at the **TCP level**, not at the HTTP level. ### HTTPS Request Now that the client and server (specifically the browser and the TLS Termination Proxy) have an **encrypted TCP connection**, they can start the **HTTP communication**. So, the client sends an **HTTPS request**. This is just an HTTP request through an encrypted TLS connection. ### Decrypt the Request The TLS Termination Proxy would use the encryption agreed to **decrypt the request**, and would transmit the **plain (decrypted) HTTP request** to the process running the application (for example a process with Uvicorn running the FastAPI application). ### HTTP Response The application would process the request and send a **plain (unencrypted) HTTP response** to the TLS Termination Proxy. ### HTTPS Response The TLS Termination Proxy would then **encrypt the response** using the cryptography agreed before (that started with the certificate for `someapp.example.com`), and send it back to the browser. Next, the browser would verify that the response is valid and encrypted with the right cryptographic key, etc. It would then **decrypt the response** and process it. The client (browser) will know that the response comes from the correct server because it is using the cryptography they agreed using the **HTTPS certificate** before. ### Multiple Applications In the same server (or servers), there could be **multiple applications**, for example, other API programs or a database. Only one process can be handling the specific IP and port (the TLS Termination Proxy in our example) but the other applications/processes can be running on the server(s) too, as long as they don't try to use the same **combination of public IP and port**. That way, the TLS Termination Proxy could handle HTTPS and certificates for **multiple domains**, for multiple applications, and then transmit the requests to the right application in each case. ### Certificate Renewal At some point in the future, each certificate would **expire** (about 3 months after acquiring it). And then, there would be another program (in some cases it's another program, in some cases it could be the same TLS Termination Proxy) that would talk to Let's Encrypt, and renew the certificate(s). The **TLS certificates** are **associated with a domain name**, not with an IP address. So, to renew the certificates, the renewal program needs to **prove** to the authority (Let's Encrypt) that it indeed **"owns" and controls that domain**. To do that, and to accommodate different application needs, there are several ways it can do it. Some popular ways are: * **Modify some DNS records**. * For this, the renewal program needs to support the APIs of the DNS provider, so, depending on the DNS provider you are using, this might or might not be an option. * **Run as a server** (at least during the certificate acquisition process) on the public IP address associated with the domain. * As we said above, only one process can be listening on a specific IP and port. * This is one of the reasons why it's very useful when the same TLS Termination Proxy also takes care of the certificate renewal process. * Otherwise, you might have to stop the TLS Termination Proxy momentarily, start the renewal program to acquire the certificates, then configure them with the TLS Termination Proxy, and then restart the TLS Termination Proxy. This is not ideal, as your app(s) will not be available during the time that the TLS Termination Proxy is off. All this renewal process, while still serving the app, is one of the main reasons why you would want to have a **separate system to handle HTTPS** with a TLS Termination Proxy instead of just using the TLS certificates with the application server directly (e.g. Uvicorn). ## Recap Having **HTTPS** is very important, and quite **critical** in most cases. Most of the effort you as a developer have to put around HTTPS is just about **understanding these concepts** and how they work. But once you know the basic information of **HTTPS for developers** you can easily combine and configure different tools to help you manage everything in a simple way. In some of the next chapters, I'll show you several concrete examples of how to set up **HTTPS** for **FastAPI** applications. 🔒 fastapi-0.110.3/docs/en/docs/deployment/index.md000066400000000000000000000023021461403617600214030ustar00rootroot00000000000000# Deployment Deploying a **FastAPI** application is relatively easy. ## What Does Deployment Mean To **deploy** an application means to perform the necessary steps to make it **available to the users**. For a **web API**, it normally involves putting it in a **remote machine**, with a **server program** that provides good performance, stability, etc, so that your **users** can **access** the application efficiently and without interruptions or problems. This is in contrast to the **development** stages, where you are constantly changing the code, breaking it and fixing it, stopping and restarting the development server, etc. ## Deployment Strategies There are several ways to do it depending on your specific use case and the tools that you use. You could **deploy a server** yourself using a combination of tools, you could use a **cloud service** that does part of the work for you, or other possible options. I will show you some of the main concepts you should probably keep in mind when deploying a **FastAPI** application (although most of it applies to any other type of web application). You will see more details to keep in mind and some of the techniques to do it in the next sections. ✨ fastapi-0.110.3/docs/en/docs/deployment/manually.md000066400000000000000000000114611461403617600221240ustar00rootroot00000000000000# Run a Server Manually - Uvicorn The main thing you need to run a **FastAPI** application in a remote server machine is an ASGI server program like **Uvicorn**. There are 3 main alternatives: * Uvicorn: a high performance ASGI server. * Hypercorn: an ASGI server compatible with HTTP/2 and Trio among other features. * Daphne: the ASGI server built for Django Channels. ## Server Machine and Server Program There's a small detail about names to keep in mind. 💡 The word "**server**" is commonly used to refer to both the remote/cloud computer (the physical or virtual machine) and also the program that is running on that machine (e.g. Uvicorn). Just keep in mind that when you read "server" in general, it could refer to one of those two things. When referring to the remote machine, it's common to call it **server**, but also **machine**, **VM** (virtual machine), **node**. Those all refer to some type of remote machine, normally running Linux, where you run programs. ## Install the Server Program You can install an ASGI compatible server with: === "Uvicorn" * Uvicorn, a lightning-fast ASGI server, built on uvloop and httptools.
```console $ pip install "uvicorn[standard]" ---> 100% ```
!!! tip By adding the `standard`, Uvicorn will install and use some recommended extra dependencies. That including `uvloop`, the high-performance drop-in replacement for `asyncio`, that provides the big concurrency performance boost. === "Hypercorn" * Hypercorn, an ASGI server also compatible with HTTP/2.
```console $ pip install hypercorn ---> 100% ```
...or any other ASGI server. ## Run the Server Program You can then run your application the same way you have done in the tutorials, but without the `--reload` option, e.g.: === "Uvicorn"
```console $ uvicorn main:app --host 0.0.0.0 --port 80 INFO: Uvicorn running on http://0.0.0.0:80 (Press CTRL+C to quit) ```
=== "Hypercorn"
```console $ hypercorn main:app --bind 0.0.0.0:80 Running on 0.0.0.0:8080 over http (CTRL + C to quit) ```
!!! warning Remember to remove the `--reload` option if you were using it. The `--reload` option consumes much more resources, is more unstable, etc. It helps a lot during **development**, but you **shouldn't** use it in **production**. ## Hypercorn with Trio Starlette and **FastAPI** are based on AnyIO, which makes them compatible with both Python's standard library asyncio and Trio. Nevertheless, Uvicorn is currently only compatible with asyncio, and it normally uses `uvloop`, the high-performance drop-in replacement for `asyncio`. But if you want to directly use **Trio**, then you can use **Hypercorn** as it supports it. ✨ ### Install Hypercorn with Trio First you need to install Hypercorn with Trio support:
```console $ pip install "hypercorn[trio]" ---> 100% ```
### Run with Trio Then you can pass the command line option `--worker-class` with the value `trio`:
```console $ hypercorn main:app --worker-class trio ```
And that will start Hypercorn with your app using Trio as the backend. Now you can use Trio internally in your app. Or even better, you can use AnyIO, to keep your code compatible with both Trio and asyncio. 🎉 ## Deployment Concepts These examples run the server program (e.g Uvicorn), starting **a single process**, listening on all the IPs (`0.0.0.0`) on a predefined port (e.g. `80`). This is the basic idea. But you will probably want to take care of some additional things, like: * Security - HTTPS * Running on startup * Restarts * Replication (the number of processes running) * Memory * Previous steps before starting I'll tell you more about each of these concepts, how to think about them, and some concrete examples with strategies to handle them in the next chapters. 🚀 fastapi-0.110.3/docs/en/docs/deployment/server-workers.md000066400000000000000000000222201461403617600232750ustar00rootroot00000000000000# Server Workers - Gunicorn with Uvicorn Let's check back those deployment concepts from before: * Security - HTTPS * Running on startup * Restarts * **Replication (the number of processes running)** * Memory * Previous steps before starting Up to this point, with all the tutorials in the docs, you have probably been running a **server program** like Uvicorn, running a **single process**. When deploying applications you will probably want to have some **replication of processes** to take advantage of **multiple cores** and to be able to handle more requests. As you saw in the previous chapter about [Deployment Concepts](concepts.md){.internal-link target=_blank}, there are multiple strategies you can use. Here I'll show you how to use **Gunicorn** with **Uvicorn worker processes**. !!! info If you are using containers, for example with Docker or Kubernetes, I'll tell you more about that in the next chapter: [FastAPI in Containers - Docker](docker.md){.internal-link target=_blank}. In particular, when running on **Kubernetes** you will probably **not** want to use Gunicorn and instead run **a single Uvicorn process per container**, but I'll tell you about it later in that chapter. ## Gunicorn with Uvicorn Workers **Gunicorn** is mainly an application server using the **WSGI standard**. That means that Gunicorn can serve applications like Flask and Django. Gunicorn by itself is not compatible with **FastAPI**, as FastAPI uses the newest **ASGI standard**. But Gunicorn supports working as a **process manager** and allowing users to tell it which specific **worker process class** to use. Then Gunicorn would start one or more **worker processes** using that class. And **Uvicorn** has a **Gunicorn-compatible worker class**. Using that combination, Gunicorn would act as a **process manager**, listening on the **port** and the **IP**. And it would **transmit** the communication to the worker processes running the **Uvicorn class**. And then the Gunicorn-compatible **Uvicorn worker** class would be in charge of converting the data sent by Gunicorn to the ASGI standard for FastAPI to use it. ## Install Gunicorn and Uvicorn
```console $ pip install "uvicorn[standard]" gunicorn ---> 100% ```
That will install both Uvicorn with the `standard` extra packages (to get high performance) and Gunicorn. ## Run Gunicorn with Uvicorn Workers Then you can run Gunicorn with:
```console $ gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80 [19499] [INFO] Starting gunicorn 20.1.0 [19499] [INFO] Listening at: http://0.0.0.0:80 (19499) [19499] [INFO] Using worker: uvicorn.workers.UvicornWorker [19511] [INFO] Booting worker with pid: 19511 [19513] [INFO] Booting worker with pid: 19513 [19514] [INFO] Booting worker with pid: 19514 [19515] [INFO] Booting worker with pid: 19515 [19511] [INFO] Started server process [19511] [19511] [INFO] Waiting for application startup. [19511] [INFO] Application startup complete. [19513] [INFO] Started server process [19513] [19513] [INFO] Waiting for application startup. [19513] [INFO] Application startup complete. [19514] [INFO] Started server process [19514] [19514] [INFO] Waiting for application startup. [19514] [INFO] Application startup complete. [19515] [INFO] Started server process [19515] [19515] [INFO] Waiting for application startup. [19515] [INFO] Application startup complete. ```
Let's see what each of those options mean: * `main:app`: This is the same syntax used by Uvicorn, `main` means the Python module named "`main`", so, a file `main.py`. And `app` is the name of the variable that is the **FastAPI** application. * You can imagine that `main:app` is equivalent to a Python `import` statement like: ```Python from main import app ``` * So, the colon in `main:app` would be equivalent to the Python `import` part in `from main import app`. * `--workers`: The number of worker processes to use, each will run a Uvicorn worker, in this case, 4 workers. * `--worker-class`: The Gunicorn-compatible worker class to use in the worker processes. * Here we pass the class that Gunicorn can import and use with: ```Python import uvicorn.workers.UvicornWorker ``` * `--bind`: This tells Gunicorn the IP and the port to listen to, using a colon (`:`) to separate the IP and the port. * If you were running Uvicorn directly, instead of `--bind 0.0.0.0:80` (the Gunicorn option) you would use `--host 0.0.0.0` and `--port 80`. In the output, you can see that it shows the **PID** (process ID) of each process (it's just a number). You can see that: * The Gunicorn **process manager** starts with PID `19499` (in your case it will be a different number). * Then it starts `Listening at: http://0.0.0.0:80`. * Then it detects that it has to use the worker class at `uvicorn.workers.UvicornWorker`. * And then it starts **4 workers**, each with its own PID: `19511`, `19513`, `19514`, and `19515`. Gunicorn would also take care of managing **dead processes** and **restarting** new ones if needed to keep the number of workers. So that helps in part with the **restart** concept from the list above. Nevertheless, you would probably also want to have something outside making sure to **restart Gunicorn** if necessary, and also to **run it on startup**, etc. ## Uvicorn with Workers Uvicorn also has an option to start and run several **worker processes**. Nevertheless, as of now, Uvicorn's capabilities for handling worker processes are more limited than Gunicorn's. So, if you want to have a process manager at this level (at the Python level), then it might be better to try with Gunicorn as the process manager. In any case, you would run it like this:
```console $ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4 INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit) INFO: Started parent process [27365] INFO: Started server process [27368] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Started server process [27369] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Started server process [27370] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Started server process [27367] INFO: Waiting for application startup. INFO: Application startup complete. ```
The only new option here is `--workers` telling Uvicorn to start 4 worker processes. You can also see that it shows the **PID** of each process, `27365` for the parent process (this is the **process manager**) and one for each worker process: `27368`, `27369`, `27370`, and `27367`. ## Deployment Concepts Here you saw how to use **Gunicorn** (or Uvicorn) managing **Uvicorn worker processes** to **parallelize** the execution of the application, take advantage of **multiple cores** in the CPU, and be able to serve **more requests**. From the list of deployment concepts from above, using workers would mainly help with the **replication** part, and a little bit with the **restarts**, but you still need to take care of the others: * **Security - HTTPS** * **Running on startup** * ***Restarts*** * Replication (the number of processes running) * **Memory** * **Previous steps before starting** ## Containers and Docker In the next chapter about [FastAPI in Containers - Docker](docker.md){.internal-link target=_blank} I'll tell some strategies you could use to handle the other **deployment concepts**. I'll also show you the **official Docker image** that includes **Gunicorn with Uvicorn workers** and some default configurations that can be useful for simple cases. There I'll also show you how to **build your own image from scratch** to run a single Uvicorn process (without Gunicorn). It is a simple process and is probably what you would want to do when using a distributed container management system like **Kubernetes**. ## Recap You can use **Gunicorn** (or also Uvicorn) as a process manager with Uvicorn workers to take advantage of **multi-core CPUs**, to run **multiple processes in parallel**. You could use these tools and ideas if you are setting up **your own deployment system** while taking care of the other deployment concepts yourself. Check out the next chapter to learn about **FastAPI** with containers (e.g. Docker and Kubernetes). You will see that those tools have simple ways to solve the other **deployment concepts** as well. ✨ fastapi-0.110.3/docs/en/docs/deployment/versions.md000066400000000000000000000065341461403617600221570ustar00rootroot00000000000000# About FastAPI versions **FastAPI** is already being used in production in many applications and systems. And the test coverage is kept at 100%. But its development is still moving quickly. New features are added frequently, bugs are fixed regularly, and the code is still continuously improving. That's why the current versions are still `0.x.x`, this reflects that each version could potentially have breaking changes. This follows the Semantic Versioning conventions. You can create production applications with **FastAPI** right now (and you have probably been doing it for some time), you just have to make sure that you use a version that works correctly with the rest of your code. ## Pin your `fastapi` version The first thing you should do is to "pin" the version of **FastAPI** you are using to the specific latest version that you know works correctly for your application. For example, let's say you are using version `0.45.0` in your app. If you use a `requirements.txt` file you could specify the version with: ```txt fastapi==0.45.0 ``` that would mean that you would use exactly the version `0.45.0`. Or you could also pin it with: ```txt fastapi>=0.45.0,<0.46.0 ``` that would mean that you would use the versions `0.45.0` or above, but less than `0.46.0`, for example, a version `0.45.2` would still be accepted. If you use any other tool to manage your installations, like Poetry, Pipenv, or others, they all have a way that you can use to define specific versions for your packages. ## Available versions You can see the available versions (e.g. to check what is the current latest) in the [Release Notes](../release-notes.md){.internal-link target=_blank}. ## About versions Following the Semantic Versioning conventions, any version below `1.0.0` could potentially add breaking changes. FastAPI also follows the convention that any "PATCH" version change is for bug fixes and non-breaking changes. !!! tip The "PATCH" is the last number, for example, in `0.2.3`, the PATCH version is `3`. So, you should be able to pin to a version like: ```txt fastapi>=0.45.0,<0.46.0 ``` Breaking changes and new features are added in "MINOR" versions. !!! tip The "MINOR" is the number in the middle, for example, in `0.2.3`, the MINOR version is `2`. ## Upgrading the FastAPI versions You should add tests for your app. With **FastAPI** it's very easy (thanks to Starlette), check the docs: [Testing](../tutorial/testing.md){.internal-link target=_blank} After you have tests, then you can upgrade the **FastAPI** version to a more recent one, and make sure that all your code is working correctly by running your tests. If everything is working, or after you make the necessary changes, and all your tests are passing, then you can pin your `fastapi` to that new recent version. ## About Starlette You shouldn't pin the version of `starlette`. Different versions of **FastAPI** will use a specific newer version of Starlette. So, you can just let **FastAPI** use the correct Starlette version. ## About Pydantic Pydantic includes the tests for **FastAPI** with its own tests, so new versions of Pydantic (above `1.0.0`) are always compatible with FastAPI. You can pin Pydantic to any version above `1.0.0` that works for you and below `2.0.0`. For example: ```txt pydantic>=1.2.0,<2.0.0 ``` fastapi-0.110.3/docs/en/docs/external-links.md000066400000000000000000000020011461403617600210500ustar00rootroot00000000000000# External Links and Articles **FastAPI** has a great community constantly growing. There are many posts, articles, tools, and projects, related to **FastAPI**. Here's an incomplete list of some of them. !!! tip If you have an article, project, tool, or anything related to **FastAPI** that is not yet listed here, create a Pull Request adding it. {% for section_name, section_content in external_links.items() %} ## {{ section_name }} {% for lang_name, lang_content in section_content.items() %} ### {{ lang_name }} {% for item in lang_content %} * {{ item.title }} by {{ item.author }}. {% endfor %} {% endfor %} {% endfor %} ## Projects Latest GitHub projects with the topic `fastapi`:
fastapi-0.110.3/docs/en/docs/fastapi-people.md000066400000000000000000000213631461403617600210350ustar00rootroot00000000000000--- hide: - navigation --- # FastAPI People FastAPI has an amazing community that welcomes people from all backgrounds. ## Creator Hey! 👋 This is me: {% if people %}
{% for user in people.maintainers %}
@{{ user.login }}
Answers: {{ user.answers }}
Pull Requests: {{ user.prs }}
{% endfor %}
{% endif %} I'm the creator of **FastAPI**. You can read more about that in [Help FastAPI - Get Help - Connect with the author](help-fastapi.md#connect-with-the-author){.internal-link target=_blank}. ...But here I want to show you the community. --- **FastAPI** receives a lot of support from the community. And I want to highlight their contributions. These are the people that: * [Help others with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}. * [Create Pull Requests](help-fastapi.md#create-a-pull-request){.internal-link target=_blank}. * Review Pull Requests, [especially important for translations](contributing.md#translations){.internal-link target=_blank}. A round of applause to them. 👏 🙇 ## FastAPI Experts These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}. 🙇 They have proven to be **FastAPI Experts** by helping many others. ✨ !!! tip You could become an official FastAPI Expert too! Just [help others with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}. 🤓 You can see the **FastAPI Experts** for: * [Last Month](#fastapi-experts-last-month) 🤓 * [3 Months](#fastapi-experts-3-months) 😎 * [6 Months](#fastapi-experts-6-months) 🧐 * [1 Year](#fastapi-experts-1-year) 🧑‍🔬 * [**All Time**](#fastapi-experts-all-time) 🧙 ### FastAPI Experts - Last Month These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} during the last month. 🤓 {% if people %}
{% for user in people.last_month_experts[:10] %}
@{{ user.login }}
Questions replied: {{ user.count }}
{% endfor %}
{% endif %} ### FastAPI Experts - 3 Months These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} during the last 3 months. 😎 {% if people %}
{% for user in people.three_months_experts[:10] %}
@{{ user.login }}
Questions replied: {{ user.count }}
{% endfor %}
{% endif %} ### FastAPI Experts - 6 Months These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} during the last 6 months. 🧐 {% if people %}
{% for user in people.six_months_experts[:10] %}
@{{ user.login }}
Questions replied: {{ user.count }}
{% endfor %}
{% endif %} ### FastAPI Experts - 1 Year These are the users that have been [helping others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} during the last year. 🧑‍🔬 {% if people %}
{% for user in people.one_year_experts[:20] %}
@{{ user.login }}
Questions replied: {{ user.count }}
{% endfor %}
{% endif %} ### FastAPI Experts - All Time Here are the all time **FastAPI Experts**. 🤓🤯 These are the users that have [helped others the most with questions in GitHub](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank} through *all time*. 🧙 {% if people %}
{% for user in people.experts[:50] %}
@{{ user.login }}
Questions replied: {{ user.count }}
{% endfor %}
{% endif %} ## Top Contributors Here are the **Top Contributors**. 👷 These users have [created the most Pull Requests](help-fastapi.md#create-a-pull-request){.internal-link target=_blank} that have been *merged*. They have contributed source code, documentation, translations, etc. 📦 {% if people %}
{% for user in people.top_contributors[:50] %}
@{{ user.login }}
Pull Requests: {{ user.count }}
{% endfor %}
{% endif %} There are many other contributors (more than a hundred), you can see them all in the FastAPI GitHub Contributors page. 👷 ## Top Translation Reviewers These users are the **Top Translation Reviewers**. 🕵️ I only speak a few languages (and not very well 😅). So, the reviewers are the ones that have the [**power to approve translations**](contributing.md#translations){.internal-link target=_blank} of the documentation. Without them, there wouldn't be documentation in several other languages. {% if people %}
{% for user in people.top_translations_reviewers[:50] %}
@{{ user.login }}
Reviews: {{ user.count }}
{% endfor %}
{% endif %} ## Sponsors These are the **Sponsors**. 😎 They are supporting my work with **FastAPI** (and others), mainly through GitHub Sponsors. {% if sponsors %} {% if sponsors.gold %} ### Gold Sponsors {% for sponsor in sponsors.gold -%} {% endfor %} {% endif %} {% if sponsors.silver %} ### Silver Sponsors {% for sponsor in sponsors.silver -%} {% endfor %} {% endif %} {% if sponsors.bronze %} ### Bronze Sponsors {% for sponsor in sponsors.bronze -%} {% endfor %} {% endif %} {% endif %} ### Individual Sponsors {% if github_sponsors %} {% for group in github_sponsors.sponsors %}
{% for user in group %} {% if user.login not in sponsors_badge.logins %} {% endif %} {% endfor %}
{% endfor %} {% endif %} ## About the data - technical details The main intention of this page is to highlight the effort of the community to help others. Especially including efforts that are normally less visible, and in many cases more arduous, like helping others with questions and reviewing Pull Requests with translations. The data is calculated each month, you can read the source code here. Here I'm also highlighting contributions from sponsors. I also reserve the right to update the algorithm, sections, thresholds, etc (just in case 🤷). fastapi-0.110.3/docs/en/docs/features.md000066400000000000000000000224341461403617600177420ustar00rootroot00000000000000--- hide: - navigation --- # Features ## FastAPI features **FastAPI** gives you the following: ### Based on open standards * OpenAPI for API creation, including declarations of path operations, parameters, body requests, security, etc. * Automatic data model documentation with JSON Schema (as OpenAPI itself is based on JSON Schema). * Designed around these standards, after a meticulous study. Instead of an afterthought layer on top. * This also allows using automatic **client code generation** in many languages. ### Automatic docs Interactive API documentation and exploration web user interfaces. As the framework is based on OpenAPI, there are multiple options, 2 included by default. * Swagger UI, with interactive exploration, call and test your API directly from the browser. ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) * Alternative API documentation with ReDoc. ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ### Just Modern Python It's all based on standard **Python 3.6 type** declarations (thanks to Pydantic). No new syntax to learn. Just standard modern Python. If you need a 2 minute refresher of how to use Python types (even if you don't use FastAPI), check the short tutorial: [Python Types](python-types.md){.internal-link target=_blank}. You write standard Python with types: ```Python from datetime import date from pydantic import BaseModel # Declare a variable as a str # and get editor support inside the function def main(user_id: str): return user_id # A Pydantic model class User(BaseModel): id: int name: str joined: date ``` That can then be used like: ```Python my_user: User = User(id=3, name="John Doe", joined="2018-07-19") second_user_data = { "id": 4, "name": "Mary", "joined": "2018-11-30", } my_second_user: User = User(**second_user_data) ``` !!! info `**second_user_data` means: Pass the keys and values of the `second_user_data` dict directly as key-value arguments, equivalent to: `User(id=4, name="Mary", joined="2018-11-30")` ### Editor support All the framework was designed to be easy and intuitive to use, all the decisions were tested on multiple editors even before starting development, to ensure the best development experience. In the last Python developer survey it was clear that the most used feature is "autocompletion". The whole **FastAPI** framework is based to satisfy that. Autocompletion works everywhere. You will rarely need to come back to the docs. Here's how your editor might help you: * in Visual Studio Code: ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) * in PyCharm: ![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png) You will get completion in code you might even consider impossible before. As for example, the `price` key inside a JSON body (that could have been nested) that comes from a request. No more typing the wrong key names, coming back and forth between docs, or scrolling up and down to find if you finally used `username` or `user_name`. ### Short It has sensible **defaults** for everything, with optional configurations everywhere. All the parameters can be fine-tuned to do what you need and to define the API you need. But by default, it all **"just works"**. ### Validation * Validation for most (or all?) Python **data types**, including: * JSON objects (`dict`). * JSON array (`list`) defining item types. * String (`str`) fields, defining min and max lengths. * Numbers (`int`, `float`) with min and max values, etc. * Validation for more exotic types, like: * URL. * Email. * UUID. * ...and others. All the validation is handled by the well-established and robust **Pydantic**. ### Security and authentication Security and authentication integrated. Without any compromise with databases or data models. All the security schemes defined in OpenAPI, including: * HTTP Basic. * **OAuth2** (also with **JWT tokens**). Check the tutorial on [OAuth2 with JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}. * API keys in: * Headers. * Query parameters. * Cookies, etc. Plus all the security features from Starlette (including **session cookies**). All built as reusable tools and components that are easy to integrate with your systems, data stores, relational and NoSQL databases, etc. ### Dependency Injection FastAPI includes an extremely easy to use, but extremely powerful Dependency Injection system. * Even dependencies can have dependencies, creating a hierarchy or **"graph" of dependencies**. * All **automatically handled** by the framework. * All the dependencies can require data from requests and **augment the path operation** constraints and automatic documentation. * **Automatic validation** even for *path operation* parameters defined in dependencies. * Support for complex user authentication systems, **database connections**, etc. * **No compromise** with databases, frontends, etc. But easy integration with all of them. ### Unlimited "plug-ins" Or in other way, no need for them, import and use the code you need. Any integration is designed to be so simple to use (with dependencies) that you can create a "plug-in" for your application in 2 lines of code using the same structure and syntax used for your *path operations*. ### Tested * 100% test coverage. * 100% type annotated code base. * Used in production applications. ## Starlette features **FastAPI** is fully compatible with (and based on) Starlette. So, any additional Starlette code you have, will also work. `FastAPI` is actually a sub-class of `Starlette`. So, if you already know or use Starlette, most of the functionality will work the same way. With **FastAPI** you get all of **Starlette**'s features (as FastAPI is just Starlette on steroids): * Seriously impressive performance. It is one of the fastest Python frameworks available, on par with **NodeJS** and **Go**. * **WebSocket** support. * In-process background tasks. * Startup and shutdown events. * Test client built on HTTPX. * **CORS**, GZip, Static Files, Streaming responses. * **Session and Cookie** support. * 100% test coverage. * 100% type annotated codebase. ## Pydantic features **FastAPI** is fully compatible with (and based on) Pydantic. So, any additional Pydantic code you have, will also work. Including external libraries also based on Pydantic, as ORMs, ODMs for databases. This also means that in many cases you can pass the same object you get from a request **directly to the database**, as everything is validated automatically. The same applies the other way around, in many cases you can just pass the object you get from the database **directly to the client**. With **FastAPI** you get all of **Pydantic**'s features (as FastAPI is based on Pydantic for all the data handling): * **No brainfuck**: * No new schema definition micro-language to learn. * If you know Python types you know how to use Pydantic. * Plays nicely with your **IDE/linter/brain**: * Because pydantic data structures are just instances of classes you define; auto-completion, linting, mypy and your intuition should all work properly with your validated data. * Validate **complex structures**: * Use of hierarchical Pydantic models, Python `typing`’s `List` and `Dict`, etc. * And validators allow complex data schemas to be clearly and easily defined, checked and documented as JSON Schema. * You can have deeply **nested JSON** objects and have them all validated and annotated. * **Extensible**: * Pydantic allows custom data types to be defined or you can extend validation with methods on a model decorated with the validator decorator. * 100% test coverage. fastapi-0.110.3/docs/en/docs/help-fastapi.md000066400000000000000000000333021461403617600204750ustar00rootroot00000000000000# Help FastAPI - Get Help Do you like **FastAPI**? Would you like to help FastAPI, other users, and the author? Or would you like to get help with **FastAPI**? There are very simple ways to help (several involve just one or two clicks). And there are several ways to get help too. ## Subscribe to the newsletter You can subscribe to the (infrequent) [**FastAPI and friends** newsletter](newsletter.md){.internal-link target=_blank} to stay updated about: * News about FastAPI and friends 🚀 * Guides 📝 * Features ✨ * Breaking changes 🚨 * Tips and tricks ✅ ## Follow FastAPI on Twitter Follow @fastapi on **Twitter** to get the latest news about **FastAPI**. 🐦 ## Star **FastAPI** in GitHub You can "star" FastAPI in GitHub (clicking the star button at the top right): https://github.com/tiangolo/fastapi. ⭐️ By adding a star, other users will be able to find it more easily and see that it has been already useful for others. ## Watch the GitHub repository for releases You can "watch" FastAPI in GitHub (clicking the "watch" button at the top right): https://github.com/tiangolo/fastapi. 👀 There you can select "Releases only". By doing it, you will receive notifications (in your email) whenever there's a new release (a new version) of **FastAPI** with bug fixes and new features. ## Connect with the author You can connect with me (Sebastián Ramírez / `tiangolo`), the author. You can: * Follow me on **GitHub**. * See other Open Source projects I have created that could help you. * Follow me to see when I create a new Open Source project. * Follow me on **Twitter** or Mastodon. * Tell me how you use FastAPI (I love to hear that). * Hear when I make announcements or release new tools. * You can also follow @fastapi on Twitter (a separate account). * Follow me on **LinkedIn**. * Hear when I make announcements or release new tools (although I use Twitter more often 🤷‍♂). * Read what I write (or follow me) on **Dev.to** or **Medium**. * Read other ideas, articles, and read about tools I have created. * Follow me to read when I publish something new. ## Tweet about **FastAPI** Tweet about **FastAPI** and let me and others know why you like it. 🎉 I love to hear about how **FastAPI** is being used, what you have liked in it, in which project/company are you using it, etc. ## Vote for FastAPI * Vote for **FastAPI** in Slant. * Vote for **FastAPI** in AlternativeTo. * Say you use **FastAPI** on StackShare. ## Help others with questions in GitHub You can try and help others with their questions in: * GitHub Discussions * GitHub Issues In many cases you might already know the answer for those questions. 🤓 If you are helping a lot of people with their questions, you will become an official [FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. 🎉 Just remember, the most important point is: try to be kind. People come with their frustrations and in many cases don't ask in the best way, but try as best as you can to be kind. 🤗 The idea is for the **FastAPI** community to be kind and welcoming. At the same time, don't accept bullying or disrespectful behavior towards others. We have to take care of each other. --- Here's how to help others with questions (in discussions or issues): ### Understand the question * Check if you can understand what is the **purpose** and use case of the person asking. * Then check if the question (the vast majority are questions) is **clear**. * In many cases the question asked is about an imaginary solution from the user, but there might be a **better** one. If you can understand the problem and use case better, you might be able to suggest a better **alternative solution**. * If you can't understand the question, ask for more **details**. ### Reproduce the problem For most of the cases and most of the questions there's something related to the person's **original code**. In many cases they will only copy a fragment of the code, but that's not enough to **reproduce the problem**. * You can ask them to provide a minimal, reproducible, example, that you can **copy-paste** and run locally to see the same error or behavior they are seeing, or to understand their use case better. * If you are feeling too generous, you can try to **create an example** like that yourself, just based on the description of the problem. Just keep in mind that this might take a lot of time and it might be better to ask them to clarify the problem first. ### Suggest solutions * After being able to understand the question, you can give them a possible **answer**. * In many cases, it's better to understand their **underlying problem or use case**, because there might be a better way to solve it than what they are trying to do. ### Ask to close If they reply, there's a high chance you would have solved their problem, congrats, **you're a hero**! 🦸 * Now, if that solved their problem, you can ask them to: * In GitHub Discussions: mark the comment as the **answer**. * In GitHub Issues: **close** the issue. ## Watch the GitHub repository You can "watch" FastAPI in GitHub (clicking the "watch" button at the top right): https://github.com/tiangolo/fastapi. 👀 If you select "Watching" instead of "Releases only" you will receive notifications when someone creates a new issue or question. You can also specify that you only want to be notified about new issues, or discussions, or PRs, etc. Then you can try and help them solve those questions. ## Ask Questions You can create a new question in the GitHub repository, for example to: * Ask a **question** or ask about a **problem**. * Suggest a new **feature**. **Note**: if you do it, then I'm going to ask you to also help others. 😉 ## Review Pull Requests You can help me review pull requests from others. Again, please try your best to be kind. 🤗 --- Here's what to keep in mind and how to review a pull request: ### Understand the problem * First, make sure you **understand the problem** that the pull request is trying to solve. It might have a longer discussion in a GitHub Discussion or issue. * There's also a good chance that the pull request is not actually needed because the problem can be solved in a **different way**. Then you can suggest or ask about that. ### Don't worry about style * Don't worry too much about things like commit message styles, I will squash and merge customizing the commit manually. * Also don't worry about style rules, there are already automatized tools checking that. And if there's any other style or consistency need, I'll ask directly for that, or I'll add commits on top with the needed changes. ### Check the code * Check and read the code, see if it makes sense, **run it locally** and see if it actually solves the problem. * Then **comment** saying that you did that, that's how I will know you really checked it. !!! info Unfortunately, I can't simply trust PRs that just have several approvals. Several times it has happened that there are PRs with 3, 5 or more approvals, probably because the description is appealing, but when I check the PRs, they are actually broken, have a bug, or don't solve the problem they claim to solve. 😅 So, it's really important that you actually read and run the code, and let me know in the comments that you did. 🤓 * If the PR can be simplified in a way, you can ask for that, but there's no need to be too picky, there might be a lot of subjective points of view (and I will have my own as well 🙈), so it's better if you can focus on the fundamental things. ### Tests * Help me check that the PR has **tests**. * Check that the tests **fail** before the PR. 🚨 * Then check that the tests **pass** after the PR. ✅ * Many PRs don't have tests, you can **remind** them to add tests, or you can even **suggest** some tests yourself. That's one of the things that consume most time and you can help a lot with that. * Then also comment what you tried, that way I'll know that you checked it. 🤓 ## Create a Pull Request You can [contribute](contributing.md){.internal-link target=_blank} to the source code with Pull Requests, for example: * To fix a typo you found on the documentation. * To share an article, video, or podcast you created or found about FastAPI by editing this file. * Make sure you add your link to the start of the corresponding section. * To help [translate the documentation](contributing.md#translations){.internal-link target=_blank} to your language. * You can also help to review the translations created by others. * To propose new documentation sections. * To fix an existing issue/bug. * Make sure to add tests. * To add a new feature. * Make sure to add tests. * Make sure to add documentation if it's relevant. ## Help Maintain FastAPI Help me maintain **FastAPI**! 🤓 There's a lot of work to do, and for most of it, **YOU** can do it. The main tasks that you can do right now are: * [Help others with questions in GitHub](#help-others-with-questions-in-github){.internal-link target=_blank} (see the section above). * [Review Pull Requests](#review-pull-requests){.internal-link target=_blank} (see the section above). Those two tasks are what **consume time the most**. That's the main work of maintaining FastAPI. If you can help me with that, **you are helping me maintain FastAPI** and making sure it keeps **advancing faster and better**. 🚀 ## Join the chat Join the 👥 Discord chat server 👥 and hang out with others in the FastAPI community. !!! tip For questions, ask them in GitHub Discussions, there's a much better chance you will receive help by the [FastAPI Experts](fastapi-people.md#fastapi-experts){.internal-link target=_blank}. Use the chat only for other general conversations. ### Don't use the chat for questions Keep in mind that as chats allow more "free conversation", it's easy to ask questions that are too general and more difficult to answer, so, you might not receive answers. In GitHub, the template will guide you to write the right question so that you can more easily get a good answer, or even solve the problem yourself even before asking. And in GitHub I can make sure I always answer everything, even if it takes some time. I can't personally do that with the chat systems. 😅 Conversations in the chat systems are also not as easily searchable as in GitHub, so questions and answers might get lost in the conversation. And only the ones in GitHub count to become a [FastAPI Expert](fastapi-people.md#fastapi-experts){.internal-link target=_blank}, so you will most probably receive more attention in GitHub. On the other side, there are thousands of users in the chat systems, so there's a high chance you'll find someone to talk to there, almost all the time. 😄 ## Sponsor the author You can also financially support the author (me) through GitHub sponsors. There you could buy me a coffee ☕️ to say thanks. 😄 And you can also become a Silver or Gold sponsor for FastAPI. 🏅🎉 ## Sponsor the tools that power FastAPI As you have seen in the documentation, FastAPI stands on the shoulders of giants, Starlette and Pydantic. You can also sponsor: * Samuel Colvin (Pydantic) * Encode (Starlette, Uvicorn) --- Thanks! 🚀 fastapi-0.110.3/docs/en/docs/help/000077500000000000000000000000001461403617600165255ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/help/index.md000066400000000000000000000000721461403617600201550ustar00rootroot00000000000000# Help Help and get help, contribute, get involved. 🤝 fastapi-0.110.3/docs/en/docs/history-design-future.md000066400000000000000000000101731461403617600224010ustar00rootroot00000000000000# History, Design and Future Some time ago, a **FastAPI** user asked: > What’s the history of this project? It seems to have come from nowhere to awesome in a few weeks [...] Here's a little bit of that history. ## Alternatives I have been creating APIs with complex requirements for several years (Machine Learning, distributed systems, asynchronous jobs, NoSQL databases, etc), leading several teams of developers. As part of that, I needed to investigate, test and use many alternatives. The history of **FastAPI** is in great part the history of its predecessors. As said in the section [Alternatives](alternatives.md){.internal-link target=_blank}:
**FastAPI** wouldn't exist if not for the previous work of others. There have been many tools created before that have helped inspire its creation. I have been avoiding the creation of a new framework for several years. First I tried to solve all the features covered by **FastAPI** using many different frameworks, plug-ins, and tools. But at some point, there was no other option than creating something that provided all these features, taking the best ideas from previous tools, and combining them in the best way possible, using language features that weren't even available before (Python 3.6+ type hints).
## Investigation By using all the previous alternatives I had the chance to learn from all of them, take ideas, and combine them in the best way I could find for myself and the teams of developers I have worked with. For example, it was clear that ideally it should be based on standard Python type hints. Also, the best approach was to use already existing standards. So, before even starting to code **FastAPI**, I spent several months studying the specs for OpenAPI, JSON Schema, OAuth2, etc. Understanding their relationship, overlap, and differences. ## Design Then I spent some time designing the developer "API" I wanted to have as a user (as a developer using FastAPI). I tested several ideas in the most popular Python editors: PyCharm, VS Code, Jedi based editors. By the last Python Developer Survey, that covers about 80% of the users. It means that **FastAPI** was specifically tested with the editors used by 80% of the Python developers. And as most of the other editors tend to work similarly, all its benefits should work for virtually all editors. That way I could find the best ways to reduce code duplication as much as possible, to have completion everywhere, type and error checks, etc. All in a way that provided the best development experience for all the developers. ## Requirements After testing several alternatives, I decided that I was going to use **Pydantic** for its advantages. Then I contributed to it, to make it fully compliant with JSON Schema, to support different ways to define constraint declarations, and to improve editor support (type checks, autocompletion) based on the tests in several editors. During the development, I also contributed to **Starlette**, the other key requirement. ## Development By the time I started creating **FastAPI** itself, most of the pieces were already in place, the design was defined, the requirements and tools were ready, and the knowledge about the standards and specifications was clear and fresh. ## Future By this point, it's already clear that **FastAPI** with its ideas is being useful for many people. It is being chosen over previous alternatives for suiting many use cases better. Many developers and teams already depend on **FastAPI** for their projects (including me and my team). But still, there are many improvements and features to come. **FastAPI** has a great future ahead. And [your help](help-fastapi.md){.internal-link target=_blank} is greatly appreciated. fastapi-0.110.3/docs/en/docs/how-to/000077500000000000000000000000001461403617600170125ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/how-to/async-sql-encode-databases.md000066400000000000000000000125441461403617600244340ustar00rootroot00000000000000# ~~Async SQL (Relational) Databases with Encode/Databases~~ (deprecated) !!! info These docs are about to be updated. 🎉 The current version assumes Pydantic v1. The new docs will include Pydantic v2 and will use SQLModel once it is updated to use Pydantic v2 as well. !!! warning "Deprecated" This tutorial is deprecated and will be removed in a future version. You can also use `encode/databases` with **FastAPI** to connect to databases using `async` and `await`. It is compatible with: * PostgreSQL * MySQL * SQLite In this example, we'll use **SQLite**, because it uses a single file and Python has integrated support. So, you can copy this example and run it as is. Later, for your production application, you might want to use a database server like **PostgreSQL**. !!! tip You could adopt ideas from the section about SQLAlchemy ORM ([SQL (Relational) Databases](../tutorial/sql-databases.md){.internal-link target=_blank}), like using utility functions to perform operations in the database, independent of your **FastAPI** code. This section doesn't apply those ideas, to be equivalent to the counterpart in Starlette. ## Import and set up `SQLAlchemy` * Import `SQLAlchemy`. * Create a `metadata` object. * Create a table `notes` using the `metadata` object. ```Python hl_lines="4 14 16-22" {!../../../docs_src/async_sql_databases/tutorial001.py!} ``` !!! tip Notice that all this code is pure SQLAlchemy Core. `databases` is not doing anything here yet. ## Import and set up `databases` * Import `databases`. * Create a `DATABASE_URL`. * Create a `database` object. ```Python hl_lines="3 9 12" {!../../../docs_src/async_sql_databases/tutorial001.py!} ``` !!! tip If you were connecting to a different database (e.g. PostgreSQL), you would need to change the `DATABASE_URL`. ## Create the tables In this case, we are creating the tables in the same Python file, but in production, you would probably want to create them with Alembic, integrated with migrations, etc. Here, this section would run directly, right before starting your **FastAPI** application. * Create an `engine`. * Create all the tables from the `metadata` object. ```Python hl_lines="25-28" {!../../../docs_src/async_sql_databases/tutorial001.py!} ``` ## Create models Create Pydantic models for: * Notes to be created (`NoteIn`). * Notes to be returned (`Note`). ```Python hl_lines="31-33 36-39" {!../../../docs_src/async_sql_databases/tutorial001.py!} ``` By creating these Pydantic models, the input data will be validated, serialized (converted), and annotated (documented). So, you will be able to see it all in the interactive API docs. ## Connect and disconnect * Create your `FastAPI` application. * Create event handlers to connect and disconnect from the database. ```Python hl_lines="42 45-47 50-52" {!../../../docs_src/async_sql_databases/tutorial001.py!} ``` ## Read notes Create the *path operation function* to read notes: ```Python hl_lines="55-58" {!../../../docs_src/async_sql_databases/tutorial001.py!} ``` !!! note Notice that as we communicate with the database using `await`, the *path operation function* is declared with `async`. ### Notice the `response_model=List[Note]` It uses `typing.List`. That documents (and validates, serializes, filters) the output data, as a `list` of `Note`s. ## Create notes Create the *path operation function* to create notes: ```Python hl_lines="61-65" {!../../../docs_src/async_sql_databases/tutorial001.py!} ``` !!! info In Pydantic v1 the method was called `.dict()`, it was deprecated (but still supported) in Pydantic v2, and renamed to `.model_dump()`. The examples here use `.dict()` for compatibility with Pydantic v1, but you should use `.model_dump()` instead if you can use Pydantic v2. !!! note Notice that as we communicate with the database using `await`, the *path operation function* is declared with `async`. ### About `{**note.dict(), "id": last_record_id}` `note` is a Pydantic `Note` object. `note.dict()` returns a `dict` with its data, something like: ```Python { "text": "Some note", "completed": False, } ``` but it doesn't have the `id` field. So we create a new `dict`, that contains the key-value pairs from `note.dict()` with: ```Python {**note.dict()} ``` `**note.dict()` "unpacks" the key value pairs directly, so, `{**note.dict()}` would be, more or less, a copy of `note.dict()`. And then, we extend that copy `dict`, adding another key-value pair: `"id": last_record_id`: ```Python {**note.dict(), "id": last_record_id} ``` So, the final result returned would be something like: ```Python { "id": 1, "text": "Some note", "completed": False, } ``` ## Check it You can copy this code as is, and see the docs at http://127.0.0.1:8000/docs. There you can see all your API documented and interact with it: ## More info You can read more about `encode/databases` at its GitHub page. fastapi-0.110.3/docs/en/docs/how-to/conditional-openapi.md000066400000000000000000000045301461403617600232720ustar00rootroot00000000000000# Conditional OpenAPI If you needed to, you could use settings and environment variables to configure OpenAPI conditionally depending on the environment, and even disable it entirely. ## About security, APIs, and docs Hiding your documentation user interfaces in production *shouldn't* be the way to protect your API. That doesn't add any extra security to your API, the *path operations* will still be available where they are. If there's a security flaw in your code, it will still exist. Hiding the documentation just makes it more difficult to understand how to interact with your API, and could make it more difficult for you to debug it in production. It could be considered simply a form of Security through obscurity. If you want to secure your API, there are several better things you can do, for example: * Make sure you have well defined Pydantic models for your request bodies and responses. * Configure any required permissions and roles using dependencies. * Never store plaintext passwords, only password hashes. * Implement and use well-known cryptographic tools, like Passlib and JWT tokens, etc. * Add more granular permission controls with OAuth2 scopes where needed. * ...etc. Nevertheless, you might have a very specific use case where you really need to disable the API docs for some environment (e.g. for production) or depending on configurations from environment variables. ## Conditional OpenAPI from settings and env vars You can easily use the same Pydantic settings to configure your generated OpenAPI and the docs UIs. For example: ```Python hl_lines="6 11" {!../../../docs_src/conditional_openapi/tutorial001.py!} ``` Here we declare the setting `openapi_url` with the same default of `"/openapi.json"`. And then we use it when creating the `FastAPI` app. Then you could disable OpenAPI (including the UI docs) by setting the environment variable `OPENAPI_URL` to the empty string, like:
```console $ OPENAPI_URL= uvicorn main:app INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
Then if you go to the URLs at `/openapi.json`, `/docs`, or `/redoc` you will just get a `404 Not Found` error like: ```JSON { "detail": "Not Found" } ``` fastapi-0.110.3/docs/en/docs/how-to/configure-swagger-ui.md000066400000000000000000000054441461403617600233740ustar00rootroot00000000000000# Configure Swagger UI You can configure some extra Swagger UI parameters. To configure them, pass the `swagger_ui_parameters` argument when creating the `FastAPI()` app object or to the `get_swagger_ui_html()` function. `swagger_ui_parameters` receives a dictionary with the configurations passed to Swagger UI directly. FastAPI converts the configurations to **JSON** to make them compatible with JavaScript, as that's what Swagger UI needs. ## Disable Syntax Highlighting For example, you could disable syntax highlighting in Swagger UI. Without changing the settings, syntax highlighting is enabled by default: But you can disable it by setting `syntaxHighlight` to `False`: ```Python hl_lines="3" {!../../../docs_src/configure_swagger_ui/tutorial001.py!} ``` ...and then Swagger UI won't show the syntax highlighting anymore: ## Change the Theme The same way you could set the syntax highlighting theme with the key `"syntaxHighlight.theme"` (notice that it has a dot in the middle): ```Python hl_lines="3" {!../../../docs_src/configure_swagger_ui/tutorial002.py!} ``` That configuration would change the syntax highlighting color theme: ## Change Default Swagger UI Parameters FastAPI includes some default configuration parameters appropriate for most of the use cases. It includes these default configurations: ```Python {!../../../fastapi/openapi/docs.py[ln:7-23]!} ``` You can override any of them by setting a different value in the argument `swagger_ui_parameters`. For example, to disable `deepLinking` you could pass these settings to `swagger_ui_parameters`: ```Python hl_lines="3" {!../../../docs_src/configure_swagger_ui/tutorial003.py!} ``` ## Other Swagger UI Parameters To see all the other possible configurations you can use, read the official docs for Swagger UI parameters. ## JavaScript-only settings Swagger UI also allows other configurations to be **JavaScript-only** objects (for example, JavaScript functions). FastAPI also includes these JavaScript-only `presets` settings: ```JavaScript presets: [ SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset ] ``` These are **JavaScript** objects, not strings, so you can't pass them from Python code directly. If you need to use JavaScript-only configurations like those, you can use one of the methods above. Override all the Swagger UI *path operation* and manually write any JavaScript you need. fastapi-0.110.3/docs/en/docs/how-to/custom-docs-ui-assets.md000066400000000000000000000170301461403617600235100ustar00rootroot00000000000000# Custom Docs UI Static Assets (Self-Hosting) The API docs use **Swagger UI** and **ReDoc**, and each of those need some JavaScript and CSS files. By default, those files are served from a CDN. But it's possible to customize it, you can set a specific CDN, or serve the files yourself. ## Custom CDN for JavaScript and CSS Let's say that you want to use a different CDN, for example you want to use `https://unpkg.com/`. This could be useful if for example you live in a country that restricts some URLs. ### Disable the automatic docs The first step is to disable the automatic docs, as by default, those use the default CDN. To disable them, set their URLs to `None` when creating your `FastAPI` app: ```Python hl_lines="8" {!../../../docs_src/custom_docs_ui/tutorial001.py!} ``` ### Include the custom docs Now you can create the *path operations* for the custom docs. You can re-use FastAPI's internal functions to create the HTML pages for the docs, and pass them the needed arguments: * `openapi_url`: the URL where the HTML page for the docs can get the OpenAPI schema for your API. You can use here the attribute `app.openapi_url`. * `title`: the title of your API. * `oauth2_redirect_url`: you can use `app.swagger_ui_oauth2_redirect_url` here to use the default. * `swagger_js_url`: the URL where the HTML for your Swagger UI docs can get the **JavaScript** file. This is the custom CDN URL. * `swagger_css_url`: the URL where the HTML for your Swagger UI docs can get the **CSS** file. This is the custom CDN URL. And similarly for ReDoc... ```Python hl_lines="2-6 11-19 22-24 27-33" {!../../../docs_src/custom_docs_ui/tutorial001.py!} ``` !!! tip The *path operation* for `swagger_ui_redirect` is a helper for when you use OAuth2. If you integrate your API with an OAuth2 provider, you will be able to authenticate and come back to the API docs with the acquired credentials. And interact with it using the real OAuth2 authentication. Swagger UI will handle it behind the scenes for you, but it needs this "redirect" helper. ### Create a *path operation* to test it Now, to be able to test that everything works, create a *path operation*: ```Python hl_lines="36-38" {!../../../docs_src/custom_docs_ui/tutorial001.py!} ``` ### Test it Now, you should be able to go to your docs at http://127.0.0.1:8000/docs, and reload the page, it will load those assets from the new CDN. ## Self-hosting JavaScript and CSS for docs Self-hosting the JavaScript and CSS could be useful if, for example, you need your app to keep working even while offline, without open Internet access, or in a local network. Here you'll see how to serve those files yourself, in the same FastAPI app, and configure the docs to use them. ### Project file structure Let's say your project file structure looks like this: ``` . ├── app │ ├── __init__.py │ ├── main.py ``` Now create a directory to store those static files. Your new file structure could look like this: ``` . ├── app │   ├── __init__.py │   ├── main.py └── static/ ``` ### Download the files Download the static files needed for the docs and put them on that `static/` directory. You can probably right-click each link and select an option similar to `Save link as...`. **Swagger UI** uses the files: * `swagger-ui-bundle.js` * `swagger-ui.css` And **ReDoc** uses the file: * `redoc.standalone.js` After that, your file structure could look like: ``` . ├── app │   ├── __init__.py │   ├── main.py └── static ├── redoc.standalone.js ├── swagger-ui-bundle.js └── swagger-ui.css ``` ### Serve the static files * Import `StaticFiles`. * "Mount" a `StaticFiles()` instance in a specific path. ```Python hl_lines="7 11" {!../../../docs_src/custom_docs_ui/tutorial002.py!} ``` ### Test the static files Start your application and go to http://127.0.0.1:8000/static/redoc.standalone.js. You should see a very long JavaScript file for **ReDoc**. It could start with something like: ```JavaScript /*! * ReDoc - OpenAPI/Swagger-generated API Reference Documentation * ------------------------------------------------------------- * Version: "2.0.0-rc.18" * Repo: https://github.com/Redocly/redoc */ !function(e,t){"object"==typeof exports&&"object"==typeof m ... ``` That confirms that you are being able to serve static files from your app, and that you placed the static files for the docs in the correct place. Now we can configure the app to use those static files for the docs. ### Disable the automatic docs for static files The same as when using a custom CDN, the first step is to disable the automatic docs, as those use the CDN by default. To disable them, set their URLs to `None` when creating your `FastAPI` app: ```Python hl_lines="9" {!../../../docs_src/custom_docs_ui/tutorial002.py!} ``` ### Include the custom docs for static files And the same way as with a custom CDN, now you can create the *path operations* for the custom docs. Again, you can re-use FastAPI's internal functions to create the HTML pages for the docs, and pass them the needed arguments: * `openapi_url`: the URL where the HTML page for the docs can get the OpenAPI schema for your API. You can use here the attribute `app.openapi_url`. * `title`: the title of your API. * `oauth2_redirect_url`: you can use `app.swagger_ui_oauth2_redirect_url` here to use the default. * `swagger_js_url`: the URL where the HTML for your Swagger UI docs can get the **JavaScript** file. **This is the one that your own app is now serving**. * `swagger_css_url`: the URL where the HTML for your Swagger UI docs can get the **CSS** file. **This is the one that your own app is now serving**. And similarly for ReDoc... ```Python hl_lines="2-6 14-22 25-27 30-36" {!../../../docs_src/custom_docs_ui/tutorial002.py!} ``` !!! tip The *path operation* for `swagger_ui_redirect` is a helper for when you use OAuth2. If you integrate your API with an OAuth2 provider, you will be able to authenticate and come back to the API docs with the acquired credentials. And interact with it using the real OAuth2 authentication. Swagger UI will handle it behind the scenes for you, but it needs this "redirect" helper. ### Create a *path operation* to test static files Now, to be able to test that everything works, create a *path operation*: ```Python hl_lines="39-41" {!../../../docs_src/custom_docs_ui/tutorial002.py!} ``` ### Test Static Files UI Now, you should be able to disconnect your WiFi, go to your docs at http://127.0.0.1:8000/docs, and reload the page. And even without Internet, you would be able to see the docs for your API and interact with it. fastapi-0.110.3/docs/en/docs/how-to/custom-request-and-route.md000066400000000000000000000107001461403617600242260ustar00rootroot00000000000000# Custom Request and APIRoute class In some cases, you may want to override the logic used by the `Request` and `APIRoute` classes. In particular, this may be a good alternative to logic in a middleware. For example, if you want to read or manipulate the request body before it is processed by your application. !!! danger This is an "advanced" feature. If you are just starting with **FastAPI** you might want to skip this section. ## Use cases Some use cases include: * Converting non-JSON request bodies to JSON (e.g. `msgpack`). * Decompressing gzip-compressed request bodies. * Automatically logging all request bodies. ## Handling custom request body encodings Let's see how to make use of a custom `Request` subclass to decompress gzip requests. And an `APIRoute` subclass to use that custom request class. ### Create a custom `GzipRequest` class !!! tip This is a toy example to demonstrate how it works, if you need Gzip support, you can use the provided [`GzipMiddleware`](../advanced/middleware.md#gzipmiddleware){.internal-link target=_blank}. First, we create a `GzipRequest` class, which will overwrite the `Request.body()` method to decompress the body in the presence of an appropriate header. If there's no `gzip` in the header, it will not try to decompress the body. That way, the same route class can handle gzip compressed or uncompressed requests. ```Python hl_lines="8-15" {!../../../docs_src/custom_request_and_route/tutorial001.py!} ``` ### Create a custom `GzipRoute` class Next, we create a custom subclass of `fastapi.routing.APIRoute` that will make use of the `GzipRequest`. This time, it will overwrite the method `APIRoute.get_route_handler()`. This method returns a function. And that function is what will receive a request and return a response. Here we use it to create a `GzipRequest` from the original request. ```Python hl_lines="18-26" {!../../../docs_src/custom_request_and_route/tutorial001.py!} ``` !!! note "Technical Details" A `Request` has a `request.scope` attribute, that's just a Python `dict` containing the metadata related to the request. A `Request` also has a `request.receive`, that's a function to "receive" the body of the request. The `scope` `dict` and `receive` function are both part of the ASGI specification. And those two things, `scope` and `receive`, are what is needed to create a new `Request` instance. To learn more about the `Request` check Starlette's docs about Requests. The only thing the function returned by `GzipRequest.get_route_handler` does differently is convert the `Request` to a `GzipRequest`. Doing this, our `GzipRequest` will take care of decompressing the data (if necessary) before passing it to our *path operations*. After that, all of the processing logic is the same. But because of our changes in `GzipRequest.body`, the request body will be automatically decompressed when it is loaded by **FastAPI** when needed. ## Accessing the request body in an exception handler !!! tip To solve this same problem, it's probably a lot easier to use the `body` in a custom handler for `RequestValidationError` ([Handling Errors](../tutorial/handling-errors.md#use-the-requestvalidationerror-body){.internal-link target=_blank}). But this example is still valid and it shows how to interact with the internal components. We can also use this same approach to access the request body in an exception handler. All we need to do is handle the request inside a `try`/`except` block: ```Python hl_lines="13 15" {!../../../docs_src/custom_request_and_route/tutorial002.py!} ``` If an exception occurs, the`Request` instance will still be in scope, so we can read and make use of the request body when handling the error: ```Python hl_lines="16-18" {!../../../docs_src/custom_request_and_route/tutorial002.py!} ``` ## Custom `APIRoute` class in a router You can also set the `route_class` parameter of an `APIRouter`: ```Python hl_lines="26" {!../../../docs_src/custom_request_and_route/tutorial003.py!} ``` In this example, the *path operations* under the `router` will use the custom `TimedRoute` class, and will have an extra `X-Response-Time` header in the response with the time it took to generate the response: ```Python hl_lines="13-20" {!../../../docs_src/custom_request_and_route/tutorial003.py!} ``` fastapi-0.110.3/docs/en/docs/how-to/extending-openapi.md000066400000000000000000000063551461403617600227630ustar00rootroot00000000000000# Extending OpenAPI There are some cases where you might need to modify the generated OpenAPI schema. In this section you will see how. ## The normal process The normal (default) process, is as follows. A `FastAPI` application (instance) has an `.openapi()` method that is expected to return the OpenAPI schema. As part of the application object creation, a *path operation* for `/openapi.json` (or for whatever you set your `openapi_url`) is registered. It just returns a JSON response with the result of the application's `.openapi()` method. By default, what the method `.openapi()` does is check the property `.openapi_schema` to see if it has contents and return them. If it doesn't, it generates them using the utility function at `fastapi.openapi.utils.get_openapi`. And that function `get_openapi()` receives as parameters: * `title`: The OpenAPI title, shown in the docs. * `version`: The version of your API, e.g. `2.5.0`. * `openapi_version`: The version of the OpenAPI specification used. By default, the latest: `3.1.0`. * `summary`: A short summary of the API. * `description`: The description of your API, this can include markdown and will be shown in the docs. * `routes`: A list of routes, these are each of the registered *path operations*. They are taken from `app.routes`. !!! info The parameter `summary` is available in OpenAPI 3.1.0 and above, supported by FastAPI 0.99.0 and above. ## Overriding the defaults Using the information above, you can use the same utility function to generate the OpenAPI schema and override each part that you need. For example, let's add ReDoc's OpenAPI extension to include a custom logo. ### Normal **FastAPI** First, write all your **FastAPI** application as normally: ```Python hl_lines="1 4 7-9" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### Generate the OpenAPI schema Then, use the same utility function to generate the OpenAPI schema, inside a `custom_openapi()` function: ```Python hl_lines="2 15-21" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### Modify the OpenAPI schema Now you can add the ReDoc extension, adding a custom `x-logo` to the `info` "object" in the OpenAPI schema: ```Python hl_lines="22-24" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### Cache the OpenAPI schema You can use the property `.openapi_schema` as a "cache", to store your generated schema. That way, your application won't have to generate the schema every time a user opens your API docs. It will be generated only once, and then the same cached schema will be used for the next requests. ```Python hl_lines="13-14 25-26" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### Override the method Now you can replace the `.openapi()` method with your new function. ```Python hl_lines="29" {!../../../docs_src/extending_openapi/tutorial001.py!} ``` ### Check it Once you go to http://127.0.0.1:8000/redoc you will see that you are using your custom logo (in this example, **FastAPI**'s logo): fastapi-0.110.3/docs/en/docs/how-to/general.md000066400000000000000000000044331461403617600207550ustar00rootroot00000000000000# General - How To - Recipes Here are several pointers to other places in the docs, for general or frequent questions. ## Filter Data - Security To ensure that you don't return more data than you should, read the docs for [Tutorial - Response Model - Return Type](../tutorial/response-model.md){.internal-link target=_blank}. ## Documentation Tags - OpenAPI To add tags to your *path operations*, and group them in the docs UI, read the docs for [Tutorial - Path Operation Configurations - Tags](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}. ## Documentation Summary and Description - OpenAPI To add a summary and description to your *path operations*, and show them in the docs UI, read the docs for [Tutorial - Path Operation Configurations - Summary and Description](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}. ## Documentation Response description - OpenAPI To define the description of the response, shown in the docs UI, read the docs for [Tutorial - Path Operation Configurations - Response description](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}. ## Documentation Deprecate a *Path Operation* - OpenAPI To deprecate a *path operation*, and show it in the docs UI, read the docs for [Tutorial - Path Operation Configurations - Deprecation](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}. ## Convert any Data to JSON-compatible To convert any data to JSON-compatible, read the docs for [Tutorial - JSON Compatible Encoder](../tutorial/encoder.md){.internal-link target=_blank}. ## OpenAPI Metadata - Docs To add metadata to your OpenAPI schema, including a license, version, contact, etc, read the docs for [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md){.internal-link target=_blank}. ## OpenAPI Custom URL To customize the OpenAPI URL (or remove it), read the docs for [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}. ## OpenAPI Docs URLs To update the URLs used for the automatically generated docs user interfaces, read the docs for [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}. fastapi-0.110.3/docs/en/docs/how-to/graphql.md000066400000000000000000000065611461403617600210020ustar00rootroot00000000000000# GraphQL As **FastAPI** is based on the **ASGI** standard, it's very easy to integrate any **GraphQL** library also compatible with ASGI. You can combine normal FastAPI *path operations* with GraphQL on the same application. !!! tip **GraphQL** solves some very specific use cases. It has **advantages** and **disadvantages** when compared to common **web APIs**. Make sure you evaluate if the **benefits** for your use case compensate the **drawbacks**. 🤓 ## GraphQL Libraries Here are some of the **GraphQL** libraries that have **ASGI** support. You could use them with **FastAPI**: * Strawberry 🍓 * With docs for FastAPI * Ariadne * With docs for Starlette (that also apply to FastAPI) * Tartiflette * With Tartiflette ASGI to provide ASGI integration * Graphene * With starlette-graphene3 ## GraphQL with Strawberry If you need or want to work with **GraphQL**, **Strawberry** is the **recommended** library as it has the design closest to **FastAPI's** design, it's all based on **type annotations**. Depending on your use case, you might prefer to use a different library, but if you asked me, I would probably suggest you try **Strawberry**. Here's a small preview of how you could integrate Strawberry with FastAPI: ```Python hl_lines="3 22 25-26" {!../../../docs_src/graphql/tutorial001.py!} ``` You can learn more about Strawberry in the Strawberry documentation. And also the docs about Strawberry with FastAPI. ## Older `GraphQLApp` from Starlette Previous versions of Starlette included a `GraphQLApp` class to integrate with Graphene. It was deprecated from Starlette, but if you have code that used it, you can easily **migrate** to starlette-graphene3, that covers the same use case and has an **almost identical interface**. !!! tip If you need GraphQL, I still would recommend you check out Strawberry, as it's based on type annotations instead of custom classes and types. ## Learn More You can learn more about **GraphQL** in the official GraphQL documentation. You can also read more about each those libraries described above in their links. fastapi-0.110.3/docs/en/docs/how-to/index.md000066400000000000000000000011171461403617600204430ustar00rootroot00000000000000# How To - Recipes Here you will see different recipes or "how to" guides for **several topics**. Most of these ideas would be more or less **independent**, and in most cases you should only need to study them if they apply directly to **your project**. If something seems interesting and useful to your project, go ahead and check it, but otherwise, you might probably just skip them. !!! tip If you want to **learn FastAPI** in a structured way (recommended), go and read the [Tutorial - User Guide](../tutorial/index.md){.internal-link target=_blank} chapter by chapter instead. fastapi-0.110.3/docs/en/docs/how-to/nosql-databases-couchbase.md000066400000000000000000000140121461403617600243450ustar00rootroot00000000000000# ~~NoSQL (Distributed / Big Data) Databases with Couchbase~~ (deprecated) !!! info These docs are about to be updated. 🎉 The current version assumes Pydantic v1. The new docs will hopefully use Pydantic v2 and will use ODMantic with MongoDB. !!! warning "Deprecated" This tutorial is deprecated and will be removed in a future version. **FastAPI** can also be integrated with any NoSQL. Here we'll see an example using **Couchbase**, a document based NoSQL database. You can adapt it to any other NoSQL database like: * **MongoDB** * **Cassandra** * **CouchDB** * **ArangoDB** * **ElasticSearch**, etc. !!! tip There is an official project generator with **FastAPI** and **Couchbase**, all based on **Docker**, including a frontend and more tools: https://github.com/tiangolo/full-stack-fastapi-couchbase ## Import Couchbase components For now, don't pay attention to the rest, only the imports: ```Python hl_lines="3-5" {!../../../docs_src/nosql_databases/tutorial001.py!} ``` ## Define a constant to use as a "document type" We will use it later as a fixed field `type` in our documents. This is not required by Couchbase, but is a good practice that will help you afterwards. ```Python hl_lines="9" {!../../../docs_src/nosql_databases/tutorial001.py!} ``` ## Add a function to get a `Bucket` In **Couchbase**, a bucket is a set of documents, that can be of different types. They are generally all related to the same application. The analogy in the relational database world would be a "database" (a specific database, not the database server). The analogy in **MongoDB** would be a "collection". In the code, a `Bucket` represents the main entrypoint of communication with the database. This utility function will: * Connect to a **Couchbase** cluster (that might be a single machine). * Set defaults for timeouts. * Authenticate in the cluster. * Get a `Bucket` instance. * Set defaults for timeouts. * Return it. ```Python hl_lines="12-21" {!../../../docs_src/nosql_databases/tutorial001.py!} ``` ## Create Pydantic models As **Couchbase** "documents" are actually just "JSON objects", we can model them with Pydantic. ### `User` model First, let's create a `User` model: ```Python hl_lines="24-28" {!../../../docs_src/nosql_databases/tutorial001.py!} ``` We will use this model in our *path operation function*, so, we don't include in it the `hashed_password`. ### `UserInDB` model Now, let's create a `UserInDB` model. This will have the data that is actually stored in the database. We don't create it as a subclass of Pydantic's `BaseModel` but as a subclass of our own `User`, because it will have all the attributes in `User` plus a couple more: ```Python hl_lines="31-33" {!../../../docs_src/nosql_databases/tutorial001.py!} ``` !!! note Notice that we have a `hashed_password` and a `type` field that will be stored in the database. But it is not part of the general `User` model (the one we will return in the *path operation*). ## Get the user Now create a function that will: * Take a username. * Generate a document ID from it. * Get the document with that ID. * Put the contents of the document in a `UserInDB` model. By creating a function that is only dedicated to getting your user from a `username` (or any other parameter) independent of your *path operation function*, you can more easily re-use it in multiple parts and also add unit tests for it: ```Python hl_lines="36-42" {!../../../docs_src/nosql_databases/tutorial001.py!} ``` ### f-strings If you are not familiar with the `f"userprofile::{username}"`, it is a Python "f-string". Any variable that is put inside of `{}` in an f-string will be expanded / injected in the string. ### `dict` unpacking If you are not familiar with the `UserInDB(**result.value)`, it is using `dict` "unpacking". It will take the `dict` at `result.value`, and take each of its keys and values and pass them as key-values to `UserInDB` as keyword arguments. So, if the `dict` contains: ```Python { "username": "johndoe", "hashed_password": "some_hash", } ``` It will be passed to `UserInDB` as: ```Python UserInDB(username="johndoe", hashed_password="some_hash") ``` ## Create your **FastAPI** code ### Create the `FastAPI` app ```Python hl_lines="46" {!../../../docs_src/nosql_databases/tutorial001.py!} ``` ### Create the *path operation function* As our code is calling Couchbase and we are not using the experimental Python await support, we should declare our function with normal `def` instead of `async def`. Also, Couchbase recommends not using a single `Bucket` object in multiple "threads", so, we can just get the bucket directly and pass it to our utility functions: ```Python hl_lines="49-53" {!../../../docs_src/nosql_databases/tutorial001.py!} ``` ## Recap You can integrate any third party NoSQL database, just using their standard packages. The same applies to any other external tool, system or API. fastapi-0.110.3/docs/en/docs/how-to/separate-openapi-schemas.md000066400000000000000000000152521461403617600242170ustar00rootroot00000000000000# Separate OpenAPI Schemas for Input and Output or Not When using **Pydantic v2**, the generated OpenAPI is a bit more exact and **correct** than before. 😎 In fact, in some cases, it will even have **two JSON Schemas** in OpenAPI for the same Pydantic model, for input and output, depending on if they have **default values**. Let's see how that works and how to change it if you need to do that. ## Pydantic Models for Input and Output Let's say you have a Pydantic model with default values, like this one: === "Python 3.10+" ```Python hl_lines="7" {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py[ln:1-7]!} # Code below omitted 👇 ```
👀 Full file preview ```Python {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!} ```
=== "Python 3.9+" ```Python hl_lines="9" {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py[ln:1-9]!} # Code below omitted 👇 ```
👀 Full file preview ```Python {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py!} ```
=== "Python 3.8+" ```Python hl_lines="9" {!> ../../../docs_src/separate_openapi_schemas/tutorial001.py[ln:1-9]!} # Code below omitted 👇 ```
👀 Full file preview ```Python {!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!} ```
### Model for Input If you use this model as an input like here: === "Python 3.10+" ```Python hl_lines="14" {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py[ln:1-15]!} # Code below omitted 👇 ```
👀 Full file preview ```Python {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!} ```
=== "Python 3.9+" ```Python hl_lines="16" {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py[ln:1-17]!} # Code below omitted 👇 ```
👀 Full file preview ```Python {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py!} ```
=== "Python 3.8+" ```Python hl_lines="16" {!> ../../../docs_src/separate_openapi_schemas/tutorial001.py[ln:1-17]!} # Code below omitted 👇 ```
👀 Full file preview ```Python {!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!} ```
...then the `description` field will **not be required**. Because it has a default value of `None`. ### Input Model in Docs You can confirm that in the docs, the `description` field doesn't have a **red asterisk**, it's not marked as required:
### Model for Output But if you use the same model as an output, like here: === "Python 3.10+" ```Python hl_lines="19" {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="21" {!> ../../../docs_src/separate_openapi_schemas/tutorial001_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="21" {!> ../../../docs_src/separate_openapi_schemas/tutorial001.py!} ``` ...then because `description` has a default value, if you **don't return anything** for that field, it will still have that **default value**. ### Model for Output Response Data If you interact with the docs and check the response, even though the code didn't add anything in one of the `description` fields, the JSON response contains the default value (`null`):
This means that it will **always have a value**, it's just that sometimes the value could be `None` (or `null` in JSON). That means that, clients using your API don't have to check if the value exists or not, they can **assume the field will always be there**, but just that in some cases it will have the default value of `None`. The way to describe this in OpenAPI, is to mark that field as **required**, because it will always be there. Because of that, the JSON Schema for a model can be different depending on if it's used for **input or output**: * for **input** the `description` will **not be required** * for **output** it will be **required** (and possibly `None`, or in JSON terms, `null`) ### Model for Output in Docs You can check the output model in the docs too, **both** `name` and `description` are marked as **required** with a **red asterisk**:
### Model for Input and Output in Docs And if you check all the available Schemas (JSON Schemas) in OpenAPI, you will see that there are two, one `Item-Input` and one `Item-Output`. For `Item-Input`, `description` is **not required**, it doesn't have a red asterisk. But for `Item-Output`, `description` is **required**, it has a red asterisk.
With this feature from **Pydantic v2**, your API documentation is more **precise**, and if you have autogenerated clients and SDKs, they will be more precise too, with a better **developer experience** and consistency. 🎉 ## Do not Separate Schemas Now, there are some cases where you might want to have the **same schema for input and output**. Probably the main use case for this is if you already have some autogenerated client code/SDKs and you don't want to update all the autogenerated client code/SDKs yet, you probably will want to do it at some point, but maybe not right now. In that case, you can disable this feature in **FastAPI**, with the parameter `separate_input_output_schemas=False`. !!! info Support for `separate_input_output_schemas` was added in FastAPI `0.102.0`. 🤓 === "Python 3.10+" ```Python hl_lines="10" {!> ../../../docs_src/separate_openapi_schemas/tutorial002_py310.py!} ``` === "Python 3.9+" ```Python hl_lines="12" {!> ../../../docs_src/separate_openapi_schemas/tutorial002_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="12" {!> ../../../docs_src/separate_openapi_schemas/tutorial002.py!} ``` ### Same Schema for Input and Output Models in Docs And now there will be one single schema for input and output for the model, only `Item`, and it will have `description` as **not required**:
This is the same behavior as in Pydantic v1. 🤓 fastapi-0.110.3/docs/en/docs/how-to/sql-databases-peewee.md000066400000000000000000000571561461403617600233460ustar00rootroot00000000000000# ~~SQL (Relational) Databases with Peewee~~ (deprecated) !!! warning "Deprecated" This tutorial is deprecated and will be removed in a future version. !!! warning If you are just starting, the tutorial [SQL (Relational) Databases](../tutorial/sql-databases.md){.internal-link target=_blank} that uses SQLAlchemy should be enough. Feel free to skip this. Peewee is not recommended with FastAPI as it doesn't play well with anything async Python. There are several better alternatives. !!! info These docs assume Pydantic v1. Because Pewee doesn't play well with anything async and there are better alternatives, I won't update these docs for Pydantic v2, they are kept for now only for historical purposes. The examples here are no longer tested in CI (as they were before). If you are starting a project from scratch, you are probably better off with SQLAlchemy ORM ([SQL (Relational) Databases](../tutorial/sql-databases.md){.internal-link target=_blank}), or any other async ORM. If you already have a code base that uses Peewee ORM, you can check here how to use it with **FastAPI**. !!! warning "Python 3.7+ required" You will need Python 3.7 or above to safely use Peewee with FastAPI. ## Peewee for async Peewee was not designed for async frameworks, or with them in mind. Peewee has some heavy assumptions about its defaults and about how it should be used. If you are developing an application with an older non-async framework, and can work with all its defaults, **it can be a great tool**. But if you need to change some of the defaults, support more than one predefined database, work with an async framework (like FastAPI), etc, you will need to add quite some complex extra code to override those defaults. Nevertheless, it's possible to do it, and here you'll see exactly what code you have to add to be able to use Peewee with FastAPI. !!! note "Technical Details" You can read more about Peewee's stand about async in Python in the docs, an issue, a PR. ## The same app We are going to create the same application as in the SQLAlchemy tutorial ([SQL (Relational) Databases](../tutorial/sql-databases.md){.internal-link target=_blank}). Most of the code is actually the same. So, we are going to focus only on the differences. ## File structure Let's say you have a directory named `my_super_project` that contains a sub-directory called `sql_app` with a structure like this: ``` . └── sql_app ├── __init__.py ├── crud.py ├── database.py ├── main.py └── schemas.py ``` This is almost the same structure as we had for the SQLAlchemy tutorial. Now let's see what each file/module does. ## Create the Peewee parts Let's refer to the file `sql_app/database.py`. ### The standard Peewee code Let's first check all the normal Peewee code, create a Peewee database: ```Python hl_lines="3 5 22" {!../../../docs_src/sql_databases_peewee/sql_app/database.py!} ``` !!! tip Keep in mind that if you wanted to use a different database, like PostgreSQL, you couldn't just change the string. You would need to use a different Peewee database class. #### Note The argument: ```Python check_same_thread=False ``` is equivalent to the one in the SQLAlchemy tutorial: ```Python connect_args={"check_same_thread": False} ``` ...it is needed only for `SQLite`. !!! info "Technical Details" Exactly the same technical details as in [SQL (Relational) Databases](../tutorial/sql-databases.md#note){.internal-link target=_blank} apply. ### Make Peewee async-compatible `PeeweeConnectionState` The main issue with Peewee and FastAPI is that Peewee relies heavily on Python's `threading.local`, and it doesn't have a direct way to override it or let you handle connections/sessions directly (as is done in the SQLAlchemy tutorial). And `threading.local` is not compatible with the new async features of modern Python. !!! note "Technical Details" `threading.local` is used to have a "magic" variable that has a different value for each thread. This was useful in older frameworks designed to have one single thread per request, no more, no less. Using this, each request would have its own database connection/session, which is the actual final goal. But FastAPI, using the new async features, could handle more than one request on the same thread. And at the same time, for a single request, it could run multiple things in different threads (in a threadpool), depending on if you use `async def` or normal `def`. This is what gives all the performance improvements to FastAPI. But Python 3.7 and above provide a more advanced alternative to `threading.local`, that can also be used in the places where `threading.local` would be used, but is compatible with the new async features. We are going to use that. It's called `contextvars`. We are going to override the internal parts of Peewee that use `threading.local` and replace them with `contextvars`, with the corresponding updates. This might seem a bit complex (and it actually is), you don't really need to completely understand how it works to use it. We will create a `PeeweeConnectionState`: ```Python hl_lines="10-19" {!../../../docs_src/sql_databases_peewee/sql_app/database.py!} ``` This class inherits from a special internal class used by Peewee. It has all the logic to make Peewee use `contextvars` instead of `threading.local`. `contextvars` works a bit differently than `threading.local`. But the rest of Peewee's internal code assumes that this class works with `threading.local`. So, we need to do some extra tricks to make it work as if it was just using `threading.local`. The `__init__`, `__setattr__`, and `__getattr__` implement all the required tricks for this to be used by Peewee without knowing that it is now compatible with FastAPI. !!! tip This will just make Peewee behave correctly when used with FastAPI. Not randomly opening or closing connections that are being used, creating errors, etc. But it doesn't give Peewee async super-powers. You should still use normal `def` functions and not `async def`. ### Use the custom `PeeweeConnectionState` class Now, overwrite the `._state` internal attribute in the Peewee database `db` object using the new `PeeweeConnectionState`: ```Python hl_lines="24" {!../../../docs_src/sql_databases_peewee/sql_app/database.py!} ``` !!! tip Make sure you overwrite `db._state` *after* creating `db`. !!! tip You would do the same for any other Peewee database, including `PostgresqlDatabase`, `MySQLDatabase`, etc. ## Create the database models Let's now see the file `sql_app/models.py`. ### Create Peewee models for our data Now create the Peewee models (classes) for `User` and `Item`. This is the same you would do if you followed the Peewee tutorial and updated the models to have the same data as in the SQLAlchemy tutorial. !!! tip Peewee also uses the term "**model**" to refer to these classes and instances that interact with the database. But Pydantic also uses the term "**model**" to refer to something different, the data validation, conversion, and documentation classes and instances. Import `db` from `database` (the file `database.py` from above) and use it here. ```Python hl_lines="3 6-12 15-21" {!../../../docs_src/sql_databases_peewee/sql_app/models.py!} ``` !!! tip Peewee creates several magic attributes. It will automatically add an `id` attribute as an integer to be the primary key. It will chose the name of the tables based on the class names. For the `Item`, it will create an attribute `owner_id` with the integer ID of the `User`. But we don't declare it anywhere. ## Create the Pydantic models Now let's check the file `sql_app/schemas.py`. !!! tip To avoid confusion between the Peewee *models* and the Pydantic *models*, we will have the file `models.py` with the Peewee models, and the file `schemas.py` with the Pydantic models. These Pydantic models define more or less a "schema" (a valid data shape). So this will help us avoiding confusion while using both. ### Create the Pydantic *models* / schemas Create all the same Pydantic models as in the SQLAlchemy tutorial: ```Python hl_lines="16-18 21-22 25-30 34-35 38-39 42-48" {!../../../docs_src/sql_databases_peewee/sql_app/schemas.py!} ``` !!! tip Here we are creating the models with an `id`. We didn't explicitly specify an `id` attribute in the Peewee models, but Peewee adds one automatically. We are also adding the magic `owner_id` attribute to `Item`. ### Create a `PeeweeGetterDict` for the Pydantic *models* / schemas When you access a relationship in a Peewee object, like in `some_user.items`, Peewee doesn't provide a `list` of `Item`. It provides a special custom object of class `ModelSelect`. It's possible to create a `list` of its items with `list(some_user.items)`. But the object itself is not a `list`. And it's also not an actual Python generator. Because of this, Pydantic doesn't know by default how to convert it to a `list` of Pydantic *models* / schemas. But recent versions of Pydantic allow providing a custom class that inherits from `pydantic.utils.GetterDict`, to provide the functionality used when using the `orm_mode = True` to retrieve the values for ORM model attributes. We are going to create a custom `PeeweeGetterDict` class and use it in all the same Pydantic *models* / schemas that use `orm_mode`: ```Python hl_lines="3 8-13 31 49" {!../../../docs_src/sql_databases_peewee/sql_app/schemas.py!} ``` Here we are checking if the attribute that is being accessed (e.g. `.items` in `some_user.items`) is an instance of `peewee.ModelSelect`. And if that's the case, just return a `list` with it. And then we use it in the Pydantic *models* / schemas that use `orm_mode = True`, with the configuration variable `getter_dict = PeeweeGetterDict`. !!! tip We only need to create one `PeeweeGetterDict` class, and we can use it in all the Pydantic *models* / schemas. ## CRUD utils Now let's see the file `sql_app/crud.py`. ### Create all the CRUD utils Create all the same CRUD utils as in the SQLAlchemy tutorial, all the code is very similar: ```Python hl_lines="1 4-5 8-9 12-13 16-20 23-24 27-30" {!../../../docs_src/sql_databases_peewee/sql_app/crud.py!} ``` There are some differences with the code for the SQLAlchemy tutorial. We don't pass a `db` attribute around. Instead we use the models directly. This is because the `db` object is a global object, that includes all the connection logic. That's why we had to do all the `contextvars` updates above. Aso, when returning several objects, like in `get_users`, we directly call `list`, like in: ```Python list(models.User.select()) ``` This is for the same reason that we had to create a custom `PeeweeGetterDict`. But by returning something that is already a `list` instead of the `peewee.ModelSelect` the `response_model` in the *path operation* with `List[models.User]` (that we'll see later) will work correctly. ## Main **FastAPI** app And now in the file `sql_app/main.py` let's integrate and use all the other parts we created before. ### Create the database tables In a very simplistic way create the database tables: ```Python hl_lines="9-11" {!../../../docs_src/sql_databases_peewee/sql_app/main.py!} ``` ### Create a dependency Create a dependency that will connect the database right at the beginning of a request and disconnect it at the end: ```Python hl_lines="23-29" {!../../../docs_src/sql_databases_peewee/sql_app/main.py!} ``` Here we have an empty `yield` because we are actually not using the database object directly. It is connecting to the database and storing the connection data in an internal variable that is independent for each request (using the `contextvars` tricks from above). Because the database connection is potentially I/O blocking, this dependency is created with a normal `def` function. And then, in each *path operation function* that needs to access the database we add it as a dependency. But we are not using the value given by this dependency (it actually doesn't give any value, as it has an empty `yield`). So, we don't add it to the *path operation function* but to the *path operation decorator* in the `dependencies` parameter: ```Python hl_lines="32 40 47 59 65 72" {!../../../docs_src/sql_databases_peewee/sql_app/main.py!} ``` ### Context variable sub-dependency For all the `contextvars` parts to work, we need to make sure we have an independent value in the `ContextVar` for each request that uses the database, and that value will be used as the database state (connection, transactions, etc) for the whole request. For that, we need to create another `async` dependency `reset_db_state()` that is used as a sub-dependency in `get_db()`. It will set the value for the context variable (with just a default `dict`) that will be used as the database state for the whole request. And then the dependency `get_db()` will store in it the database state (connection, transactions, etc). ```Python hl_lines="18-20" {!../../../docs_src/sql_databases_peewee/sql_app/main.py!} ``` For the **next request**, as we will reset that context variable again in the `async` dependency `reset_db_state()` and then create a new connection in the `get_db()` dependency, that new request will have its own database state (connection, transactions, etc). !!! tip As FastAPI is an async framework, one request could start being processed, and before finishing, another request could be received and start processing as well, and it all could be processed in the same thread. But context variables are aware of these async features, so, a Peewee database state set in the `async` dependency `reset_db_state()` will keep its own data throughout the entire request. And at the same time, the other concurrent request will have its own database state that will be independent for the whole request. #### Peewee Proxy If you are using a Peewee Proxy, the actual database is at `db.obj`. So, you would reset it with: ```Python hl_lines="3-4" async def reset_db_state(): database.db.obj._state._state.set(db_state_default.copy()) database.db.obj._state.reset() ``` ### Create your **FastAPI** *path operations* Now, finally, here's the standard **FastAPI** *path operations* code. ```Python hl_lines="32-37 40-43 46-53 56-62 65-68 71-79" {!../../../docs_src/sql_databases_peewee/sql_app/main.py!} ``` ### About `def` vs `async def` The same as with SQLAlchemy, we are not doing something like: ```Python user = await models.User.select().first() ``` ...but instead we are using: ```Python user = models.User.select().first() ``` So, again, we should declare the *path operation functions* and the dependency without `async def`, just with a normal `def`, as: ```Python hl_lines="2" # Something goes here def read_users(skip: int = 0, limit: int = 100): # Something goes here ``` ## Testing Peewee with async This example includes an extra *path operation* that simulates a long processing request with `time.sleep(sleep_time)`. It will have the database connection open at the beginning and will just wait some seconds before replying back. And each new request will wait one second less. This will easily let you test that your app with Peewee and FastAPI is behaving correctly with all the stuff about threads. If you want to check how Peewee would break your app if used without modification, go the `sql_app/database.py` file and comment the line: ```Python # db._state = PeeweeConnectionState() ``` And in the file `sql_app/main.py` file, comment the body of the `async` dependency `reset_db_state()` and replace it with a `pass`: ```Python async def reset_db_state(): # database.db._state._state.set(db_state_default.copy()) # database.db._state.reset() pass ``` Then run your app with Uvicorn:
```console $ uvicorn sql_app.main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ```
Open your browser at http://127.0.0.1:8000/docs and create a couple of users. Then open 10 tabs at http://127.0.0.1:8000/docs#/default/read_slow_users_slowusers__get at the same time. Go to the *path operation* "Get `/slowusers/`" in all of the tabs. Use the "Try it out" button and execute the request in each tab, one right after the other. The tabs will wait for a bit and then some of them will show `Internal Server Error`. ### What happens The first tab will make your app create a connection to the database and wait for some seconds before replying back and closing the database connection. Then, for the request in the next tab, your app will wait for one second less, and so on. This means that it will end up finishing some of the last tabs' requests earlier than some of the previous ones. Then one the last requests that wait less seconds will try to open a database connection, but as one of those previous requests for the other tabs will probably be handled in the same thread as the first one, it will have the same database connection that is already open, and Peewee will throw an error and you will see it in the terminal, and the response will have an `Internal Server Error`. This will probably happen for more than one of those tabs. If you had multiple clients talking to your app exactly at the same time, this is what could happen. And as your app starts to handle more and more clients at the same time, the waiting time in a single request needs to be shorter and shorter to trigger the error. ### Fix Peewee with FastAPI Now go back to the file `sql_app/database.py`, and uncomment the line: ```Python db._state = PeeweeConnectionState() ``` And in the file `sql_app/main.py` file, uncomment the body of the `async` dependency `reset_db_state()`: ```Python async def reset_db_state(): database.db._state._state.set(db_state_default.copy()) database.db._state.reset() ``` Terminate your running app and start it again. Repeat the same process with the 10 tabs. This time all of them will wait and you will get all the results without errors. ...You fixed it! ## Review all the files Remember you should have a directory named `my_super_project` (or however you want) that contains a sub-directory called `sql_app`. `sql_app` should have the following files: * `sql_app/__init__.py`: is an empty file. * `sql_app/database.py`: ```Python {!../../../docs_src/sql_databases_peewee/sql_app/database.py!} ``` * `sql_app/models.py`: ```Python {!../../../docs_src/sql_databases_peewee/sql_app/models.py!} ``` * `sql_app/schemas.py`: ```Python {!../../../docs_src/sql_databases_peewee/sql_app/schemas.py!} ``` * `sql_app/crud.py`: ```Python {!../../../docs_src/sql_databases_peewee/sql_app/crud.py!} ``` * `sql_app/main.py`: ```Python {!../../../docs_src/sql_databases_peewee/sql_app/main.py!} ``` ## Technical Details !!! warning These are very technical details that you probably don't need. ### The problem Peewee uses `threading.local` by default to store it's database "state" data (connection, transactions, etc). `threading.local` creates a value exclusive to the current thread, but an async framework would run all the code (e.g. for each request) in the same thread, and possibly not in order. On top of that, an async framework could run some sync code in a threadpool (using `asyncio.run_in_executor`), but belonging to the same request. This means that, with Peewee's current implementation, multiple tasks could be using the same `threading.local` variable and end up sharing the same connection and data (that they shouldn't), and at the same time, if they execute sync I/O-blocking code in a threadpool (as with normal `def` functions in FastAPI, in *path operations* and dependencies), that code won't have access to the database state variables, even while it's part of the same request and it should be able to get access to the same database state. ### Context variables Python 3.7 has `contextvars` that can create a local variable very similar to `threading.local`, but also supporting these async features. There are several things to keep in mind. The `ContextVar` has to be created at the top of the module, like: ```Python some_var = ContextVar("some_var", default="default value") ``` To set a value used in the current "context" (e.g. for the current request) use: ```Python some_var.set("new value") ``` To get a value anywhere inside of the context (e.g. in any part handling the current request) use: ```Python some_var.get() ``` ### Set context variables in the `async` dependency `reset_db_state()` If some part of the async code sets the value with `some_var.set("updated in function")` (e.g. like the `async` dependency), the rest of the code in it and the code that goes after (including code inside of `async` functions called with `await`) will see that new value. So, in our case, if we set the Peewee state variable (with a default `dict`) in the `async` dependency, all the rest of the internal code in our app will see this value and will be able to reuse it for the whole request. And the context variable would be set again for the next request, even if they are concurrent. ### Set database state in the dependency `get_db()` As `get_db()` is a normal `def` function, **FastAPI** will make it run in a threadpool, with a *copy* of the "context", holding the same value for the context variable (the `dict` with the reset database state). Then it can add database state to that `dict`, like the connection, etc. But if the value of the context variable (the default `dict`) was set in that normal `def` function, it would create a new value that would stay only in that thread of the threadpool, and the rest of the code (like the *path operation functions*) wouldn't have access to it. In `get_db()` we can only set values in the `dict`, but not the entire `dict` itself. So, we need to have the `async` dependency `reset_db_state()` to set the `dict` in the context variable. That way, all the code has access to the same `dict` for the database state for a single request. ### Connect and disconnect in the dependency `get_db()` Then the next question would be, why not just connect and disconnect the database in the `async` dependency itself, instead of in `get_db()`? The `async` dependency has to be `async` for the context variable to be preserved for the rest of the request, but creating and closing the database connection is potentially blocking, so it could degrade performance if it was there. So we also need the normal `def` dependency `get_db()`. fastapi-0.110.3/docs/en/docs/img/000077500000000000000000000000001461403617600163515ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/async/000077500000000000000000000000001461403617600174665ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/async/concurrent-burgers/000077500000000000000000000000001461403617600233175ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/async/concurrent-burgers/concurrent-burgers-01.png000066400000000000000000006151761461403617600301140ustar00rootroot00000000000000PNG  IHDRX#IDATxw\Wy߹wwU͒lw LhĄ$/ @ $`BC&`6ݖ-muv{]vwfgVj%ye;3gg<!B!͸B!B!'!B!bB!B1H@!B!$ B!BB!B! !B!sB!B9@B!B! !B!bB!B1H@!B!$ B!BB!B! !B!sB!B9@B!B! !B!bB!B1H@!B!$ B!BB!B! !B!sB!B9@B!B! !B!bB!B1H@!B!$ B!BB!B! !B!sB!B9@B!B! !B!bB!B1H@!B!$ B!BB!B! !B!sB!B9@B!B! !B!bB!B1H@!B!$ B!B =!ĥGwt EݗlR&!B!ΐ8w}@!B!$ B!BB!B! !B!sB̘w$/8o~4CHK^wbX_Bq)B!3DrBC!B!sB!B9@B!B! !B!bB!B1H@!B!$ B!BB!B! !B!sB!B9@B!B! !B!bB!B1H@!B!$ B!BB!B! !B!sB!B9@B!B! !B!bB!B1H@!B!$ B!BB!B! !B!sB!B9@B!B! !B!bB!B1H@!B!$ B!BB!B! !B!sB!B9s 8 x8\o_(P W2ߕcl e%-B!ĹBe,,%QVG;ahR燐c(B9$-x#Ì0Qx3 iRЁ$&FBL!83BxXE$HVrfU&~2w=:v1 0Ą 8yɅI2ՠx=xZ=gP8إ6گ1B栉=l~fJBqёB!ǗCj>X% sIWe.|]xz14&X-Jt$5hH" לm`YXNޞ 氉Ƀ?9 vM1ST8^TTB1H@!I{Ī./uuT{l%0<ĶmeE%gqk mzss]Lӌw#d4=c2>vt%uƪ0,i;.&9?w vNc #>~X*NkB!^$ (E$K̬ԝUgmf>Ϋq3 tvI SB1H@!=>B^YײUΫ"'oznW}kKrXNb$ )qNO3==u<:Мv|:yxiXB)Bt"ܸxi[I;t6lYźWLy|QI⻿׿i?mJaZ|kw7r32<# s +v V}gN~{h#mM; p'hܭnKmS!,/i-9=]G;8?S׼,/<+i}hCv1UWcP2eW$$Nf f*rvMbE8u =ah3à {!( ym> wRYS7ot׭gt-4Tиx=Yf!jR CmĪI֐r#(,'PB'ƐJENj-N#tfZF0^{e"7BpP)tmT7WFBd!(mz/XלU?Pͯho),~~xcxX .2Ɛ3 s L#оN`3mVn |FDNbw~!PE_u^ Ͷo5g<#J,bx-ī qqPr[ŦnWe` kL`;v=uF祎əH}NB!grB, H0|^ok-`~ wx 0| О-τ-*zWބ³6G6"[x(;CWcTPB17]\B1y3<O~٬ٴh$NCcMcamX%NxdF(Df&/vV2Sn!LiLr{'A{3T~!B[ӱ6?tq믚Z)bU~ 3,Ņ;#1  ̕n@r?:s1Lc&'/LP! 9ƹ紐07ĵnyJ+*(Уcޤ)r`;L1= 6\EjB9RB1H@!ot6e(j˹Oneg|)_(Va#+$YX~"C>TbZEӯ04EEY*mhR&ڣ3sBK0Q>lǝz.r 3ٱ-tStTRavN3 2T?%[i`g\zFSH@! !`(k⪠aFChD.˲?hLOM4h_ן0ؗ}~$eC@$KY~vnnGwćOo8k8/F8N{-@:c[I!+0⑔ɾM\JY,{bUrr\~:~O8x|n^esPKgh rUPJhF_`Z|tLSLNe> $\uCQ,3fֽ: |uNFo*ߏ=(B$!mX@)_n.Y.k9с/e3^aq'~ ذe۟`持~GѓDi-ц| {;}5tSC=8ey _-̲>ۇAO# S[DX,[Fc,!s,M!F1c)0@] :JyՙoXP֚][S_ZQ={d"sqo@{;xRīY:byڧ`n^P.M]xPrY8 )&fL8g3-Xkky>g(`HxR =^,"}B !`#6't#L{N$J (*95mۼ.l\Faq_uel{fQp׫LQoMWa3{HSn\;wsij۝<;` NJ߫-<4S ?,A[C/WJb__g]^ ԋ| _ N cS!f/+Dr}9hmzQZݣ[vqPq86@%V-L`ģPJm !^ $ H]1bװBsY h:{1Y^#S 3*jSar1|MS(e [TaababMn J1#xF1#({AI@!QMhxK6}n~5fNvj< Byu)aV3:w_o+ʑq%ƶ5ôw08ep8p0F4j$H$l G[8~yP]OUe>e%9zL MYIl ^1.vX}RV_tש+. @n{ގP-Vq[4 _mRb ư1ld9AW`UD0qta. )2;؍ 8 teG:[[dʀByJ EE /#^;'oEF)'YXNn ft@w 2X3!p0H(N87Lk0'9xa:D"IFB G}jqXZ36yMLS%7KqQٰ[ sSpxf,B~Iit^=Ǩ,+[6qxK/p.ц~uQrhw8uotxċ m<=a(qț2eUn]{PF2돮Q_\ NC ߛݣ 30{Mq!k-0(#S/˩-@JP*tbʭ` g}TJjr@'<MpN Js呷t%؁ .EbX3jy0 \?j:cS%ksh[DV,VFXã&.>8OFB Z8p{;ٹklYZ_LG:̷~Bg/p&yOhu$Kw|Gĸ@peX8jGiXb<>+)\]@$([i>OD 〙f>L[BB1T'4eeiIJl ~hQR@$:F&|&~k\gWG8ѤCv@)LC(*ʧ+/[mׯgj|ٟ$I>AѸe(L' BK /%&mx=,YHmC%^:HOG?am~1 ."8ZC@(mA~衵}1V/&ݽaa5] pڦpO+-E砞PO8plz8a(jAoKϴpBJsܻ5.L(@y>ׄhFb0q',`;]ϱ.ܺ]$G' oCMWsˆen"3bEy0M6_$Xh8J4#<%4!'I&-vز-p(J8C{SVY),oi:N(a@> ay^Lboₒ$ZCgO=̃gO|Pݓ4Mzƾ^/yyyx^|>mF B ², PJ!PZ+gB*(Tˇ:'~DZN6Ytyss $ &_Ǯg]ncXx:S{a:pzb<:Qqc|?ڈWJT~mM# '}&դ.c/,GŇЌLqÞe`m98C1>t׋u٪$~jbׄuprXR y>'iC, {pFW_C(X<㎗Sœ;{0Hn~W^c]w rQyM@H$I 3Dphx4e8C$#EW{/%,^HM}mYE~a.w'L`.D2$Q#Ͽ/g^hmx+ƾ|>aPXXHnn.TWWpB7oPTT46Ak3TS2$r wg}6xP_y%D9%|$; >Y$ɭl@&Va9ޡ=^b)fHmĩ+0c*aVvy[larT5vU),cA]@2*-p0 |c'mH\2G;^ت5tӀ][@@:^Z?W?߿o(NΜH4΃bե,]@oxy me$%HRCq~~aAU)}AL|^|>/yԍE CW[/P۲I&,떰lB^/{"HP>|Y% qpm;;im%ۤ"??BY;Q7u?wGn)M/z?Y޲ 7+ @cB܂Axr8IbAsܙ߿}CۉǓ؎=c^[ٸf^SU[NrE 'G" h顯{y kYj/[ʞ퇈$l.䎲@\s.`ۚMor8tH'zz<<yyyQQQAMM gɒ%466h")(( 7nii?eU]5ږ 1%=O$|;!N0BgRۻ]GwPS~q^{w}k{*|3y}*-'8VZOvƈ?BgkWgl/\0d7es&`YW=@wok7i0 CQQeee\˗fjkkO~~`Ν'JQSu]Yw{l+a$X<ɏ)nr5,T"'9gd[tb %4b1 ^*RWgiy.s-Sy)vnwGbm"k>`5`OJ|~i{a`- K1@'QL(7v?N`ۚ}{vp}U>~JVXٰ͛aW Lb۩+^^sNB7G~02~/nnױ19125v%8(ڙ;}S@}]!E9a $0gL*}+S_`ye.%9Lhb~# ذe%ZNt`zL #y/㷳1s.p6~v^z|o999,Zk׾l޼RL}pMJ}(l+b8ьeMhax[M'Abd;t3.fF2w`y0F_85Q[E^5>SQ㥪dž/yE,|P $.~` ;݉8p,尷3ľÂ|s w]VCu;)qpZ*BxFе%S5Te:[.2) we!ce=Pf1JMyNeft N]I\v?'Ӹwb:Skoe f[|06hꃇÑ <}7Os|6\%+sxIZOv'j G߰ #(/.>@p${7wZچh⯔"//yqsn:JKK/&ZZZR~lPK]M !'{ab+,-'^?%{Ԣv"#X1ktE (ۢ{^>vɴ-85[Vn-^$KCׯU f.%Ͼ?}kh ;iPs{xOJp/XEoTb bjZNSt"Y6,e桭t-Ħ5qvgJ+]0foX~vp_7 l>n`"w+'~]c?ZsIN9/+WpivduKi=4c'D&Yp]|㹗ZǧW2|nFNlr o/R4f-#ޔBW/^@Qzq#]})8_WXh)œSJ|)h;1bGC؉wˀC;6TUzf>t{FMciMo(Ao(_~W//myNǁ(_ 38?i嗻,:k71{L}[Ex!tv_WO)*Sc:*[!:هՒ-f ^ߎL ݾ\z2q&ϗ&b8᱃ۖm!g,Oc8d;hs*>z|Kϰ*,{v>Omg;Y6 omoGD|;8e9g.)2H16^$jz-ʛ?}@;1xN; `42lq+񰩡m#n 7\u;2)H}=%m]7Qj* mB?`"o@sRJ-q{YnЇQDTaxӗy*kcV; ڊ؉cSmǴ-)Gz)'3~6zF< &WW:IH+o8zkLia*Z`4ɷRKϿn /*%pm8?~6 7@C^N\\RXVHptP8HNd5t|4St mXD Ey>MogsL_ IL;wt%}R.;f})'ډN Hd,$h|5,s@0fcd3No^]-TyMx&Kvwbv~hg8 lg` n/k(8ʞ;H?q4>zsxֽJ) y>6l(w6nJGGjReS=sʶ;Fʳs?gt;NJ[SYfr<4q5h4g?Yjkky~Fc@) Oxr0EP0.Gkt-7NJXz0& kme%PJ1q cMT d怬!?7bJ ( ㌄ G HX֔lGr{틹s}?~w&gV?,_JUi <D2A0!nKeLI$R9^na֖ UÏwtWeHXB P*ͤV)EqAJ^6p4b``#Hp]w۲R,))Gtw> l딁7ԱzJ#=ChP8%b>K>FXe).,P?|^ŕWj|7'ڎz㝔::q E gR,wc^kWQgvc)ޭAT,>RON8  \[}@#Y\H 8X`fy1Nt2 nv4EwlG$${B?~|ߜ\Ȉ$m×iaoW(+ہ'Ƴp0 (:-_m}ZCg ;S%6,ۆg !1Md@kw>ؔ'P|>6o>^ב088ȓO>vU8*\KK׋-)'joイ~$t >88mgLUe%l^g^ދmN{{{y /'> 7a77L{/uۦZ4MRV\xFVr>r>*ˊYH,N{w5qH,>ߠ{$?(y^n^ra;qo&K.wy'%%1O=)?W 6lnC|R+'l4 r b$&T>JkHL+ÉδaowTT\`\alxǐX[GN=4 E}Uo^GCU Ls~̯c:7o`wb .Laӏ2rg5_~9M'SJQRX_º%'lY?ՅfIrߝ}[%9ܸ[R;#vE ͞uʩL[&NC c#XVjpүmnSvb(37UIY2~Nu0и}'V4BMeh'f9hԻUoj =4yC-o{jz>y疗J9{Ϭડ`i5T\bÑh֝Gkxߟ[DKKk@q~\rܓulb '-ǟg`(1pI>/}n믿͛7pB+tvرcڵG8fpmmJ 7ok֬a…466qFw 2`(y:}{;l7r9íTZTȫzyew;q+ȝW_}wL` JnXPݿRy5 (fb7頕֌>֚pp!ܲ;W ekY?{eG0Hqj 1NZG MyTm'I;x9Q03Uf V4ZN *w7 [C}%g0 y D,iS}}G%ޱommO<R)ք#I>~C^Q߼rx2 ΰ(ṭ'Or;dxL9^XSoX?u(Sj{;~ %53._#qfxBds`Ύ`0Xr%ԧ;,E]]]l۶-e~nqv$yM:!hbc;ɛrwQHNzW+ˊye6XEkk+w~@QQ444P^^NII $ <ȁ' m9YWW=?~^]]MEEz+7x#-7McMLy_y=\r oZwkLbQC-EygMdq{{_0O=̏:=1RJQS^MNYd{sr ,[³;g4alqlS&5{;C ]\\yEbUZlB⌫+ƞjP[^ezޚ(Ç'%hNeNUpVptɔ izaI,Կ0?yr/BvΩ|o(':sMCbW7=LP8m=͏~O~zX9A `{ԓq,q 7i w!~$-GC[wϹlY Yۅ8[\ Nk_Zn/>('x洗zE,Hk$Nx\@)Rj,7n.N92P``ҹVoO?pzH^Q! ]YEAhl] LZ3<{'Fz;( 4RrnǁjXH?&?ɷq?:|CM^w蔶Z䦥gO}єvqG;nMSlG;Gϰ{_7,lErHj慡`y ZBPl+8 ;GN{U=>b;y/1w\rE JXX'\}3F"H$%Eww7]]]c`!B###$ `6x7Wݘo8'Ko pHx4 tQXI9Qݼy=}n tA^4^ =rq<R4}+3f(X@^N^s:bCyH?٦#It`((/.-Xv:hn\|~ON4 $1. [xO|rɧ5X^:`˞z2363^EgY!jY50z+b4^5iȾBN3d.ZG@9 :9:l729`Ehs^^g߯pԗXUD;,▻3'zd;ٲWw];q zG@pٵś|XP~ݲz}єZkv?y3R6X|rc$ob:.əy [M8r_׼]b˖-ptgf``X,Foo/### 0888Vk``ng``x00׿u6mteb1bH쉫/d쓼n25uOdt~18dk--^<y\~}r+Iṓ<4|޲ )XXyճS@j~/eA{Z}x]' h {¼Ug8!z:ԫ:fQ6D; a2<(|h&=򔡭19iVԆByĿaN)+끺bزXp:OC kay5l= Ciһ>{_y7Ԟ̠€Ӏ :sPS|a(0 &})zg%RĪiIy q6.33P];\? +SG׵U\Fjb7=K(2ض8 _eiMb<-+YzeC@0:W l&f$)NȔ}` RLc1Z^PYm=4'CaE"{m!n]+OTT_ְg7?ïE 3iX\â\vu{}%,nh, ṣ)"Y?5o d y߻6O=2֚zz[neFﳳ#Gm6y:D__XlWR|> 77@ @qq1~۶appx<~A GMOVWvUIM_[Yoe gu sUgv\ڥ Yt!H3!H'@k4>$Z<GIoڱB*m)$8;߶ݻ^nop7bIx۷_|{GqNS=}YoY`ԧ";wx ϪMRiPxM1{{Mrc xf`$N4n>ɤ/R@\.(;/MOБpH4NQ^ 72 S ֚nشL%?7TvI ibXG!LDax$DM])駟o<۴mzl۶&XQ2B@ Gyy9TUUq1ߗn0(SYCUI./&:HMM wueSOi'iP磼(E,+biC1eJr(!?K^a(lG5 b qry_l7Ϟ{0r_'ٶܲG!f­K˨<讔EcqNw~yj˲Bnb=YіvkD:=0 |xxRO!HAZzXc6LC{&g[p&܊[us;{@q3M|Yӝ.1`e-e1agfh5j;'q|_`Zj.y|/ Ҽ_kbOv3t#SN?~U\i, +~}tW/㶛 7 70K---{g?Ägl(ū.|KVmZN8?aۋeJ%qu#5ey_=)s}/~]v12~d nm-b {0ϠwuVqżF?ԗ6KrHQťp{q8x5K`NƚÆY~4q`(LҲXt!y9Ң< XxukW/NHJj7=oy"Ig,HcMdA 悀/7 NMosj 0M,Q'Qx T e=Pz&Tݘy`xJ8y#5N;1p+`9&q>}4` ̪>8x x&޶ }{|/~Y5?yDzgi{8k{om7ⶤLC)՛WῼoEA8|7_h֚;viӦ)k.~so|8<G9tPA))X_߱b]|CؓRV `޽u]D'=YX^뮜y%ctŊ*J tOQZچ=݄np^k2^0U\!Nw ':ia$%sَPTǖ+Xq~P]AC{0bijo(x[v?<^}y险,'=8t3S{.v;1 X+O/_8iڟ@kx _r3@c53 CF.)@h}237\hG,[Tv$R: vN2 b^seI߹i,fA] E $`9T^WR quij㙗7xFRGyvP[QR*emˢrN)E]V[)S.r_9|=o@{RDK@̘WDw%=pCG~Ga޽[nG?ʑ#Glї$q<`Rz"q>&xG6`_2Pjq7, ﻚ(zlOڕ[)(-pz{*Z]<"&0%CS\ 19r3g|J nic=Kyj^sdL|(y\~yaf%E<bԶ_C1b3LN6qG+rem.rWJ p~~ Wz‘8_غ?V0Ѧmzo^na=5 b8 twfac +U}WX'qx9~8Gc==PCNN\s5]}{ݻ7bJk|['DPʒn߲1.jS$nZzzERGY^# 5~~ozrRx^-oZ~/4Y4^fQCy]z9BqI_I{gwV.\7E c(ӋǼ?Ʃg+yvcXౣ5=Ǫyh ':`IƷ<ԁ<>tBœgb88:|'x Vch;d.qS/D/ épac LNp ̫g#sWS*k8 / Upj[Fuv/v/WWRUr DGp45 6Knbż㯯՗Ov4,'J x_YEedӻ;u/e%9Yؚaqy.muAFۇ̎ze)Bj*7=Ĵ(ytܲ =OG)eu$D;wR=E>Bc Q,- ޶gIO] UA%!a>@^nZv~|ݕܦ48xsux餻`C5hpZp7&බq-&>7};?! X+W*8o`euwZ =vB0Unʯ=G'Kk;qhW61ha%tv~CIl t<76J3q,oۼ瓟$7nd޼ロ/}߲O|©oix<&llﻒ2YEEoH4y>,1A-]c_eY ! 1Kްm|V▃8>|"6@/Q9?w~uv<ƪE(;KcPg]߿NLX)/ʵ7<ɽ>A)E@'kld+g~.嫯pt9+7 sRMƟ^FnYT4.:]c(b.N1a b}S1 Y&;` =Ev?_?3ȱtW߶t' F> Yp޶N |鿶rՍ:p"5òꊳ_9}S {:cc n)ԍ;o-ʁ 9Ov'X sbx{k *z.h=b</7g[EZ`hb ~(婭g.ڿČm I@1.rӶk z?^nǟj9͔dV|){=j7-,dzӻ xxkW`.;An^@`_r4d'1Ydm;y9O;0x"_?IV(g]Y\4qxٸJj*TJr(o{I֚p4Ģ0 W~{R'o,ķ,cڥh@h2<&f'?6Ln[T<I= 3r)vS;^ k؏}1DapWwӛs~B"jѱD w_:1i^=^}qC)P‰#qw7/CE>llL=?g `yB^x:w.hrW}(=a$Vo"BKBܢW_&,dք- xJ1< fh3 $>Bs uT,0'O055nUd2g?YR1 e|N;ݾw? |-kS2y YR_;Bp[76pifh~a>$ضjy%\pG&Dfe F,;6h8= [֭$?w\} g/TϮCY|j۶C|ARﯥ#Ϟ$tmm#i%Xl3qfZG;i:{"iwei5yY/J),ȱDd-L[t@{ !tsk|f*;9f#as߯RE{h{[0Nɿ-g4] U-+/v<56:cqeN[';wmW2qS ޳aX~{ꩢ[\<}} [n~eRpW:>gn€eX G:nm;S, 탖mnn<ӏ:!@6E1FUa8c_̪K6p@JNMY.~CҗēO>>9nf~iSR/D^** {M-:~&V/(rכ-h/޳.)~\FJg窺޶h/q&HuAZ:{j*`^{Tmax$̉Nں{Q(ϫeicg[qA]<0p4F$c{YU Kwoė"#A$Oau,k\E^۵"0]}v{X<:a2pպ8p*+r>GSk F,~u>}^XO{=5= cD r1B&vsىg.g\.'ߙ( Z2MPN>DY`d2qm,(w{Om[(+%N?g硭R_L@kM" ţ$D6N]^Q\Iu٥]p<knq[k@)T:s1 X>'63"fUgM9y$j(%lc=ZЯ7)ob5Zh︶`v /*A{&>GQCPQDBTx$c{&* ws|Ooy{r'itSD}2-.C`G[nDml^QM,<x|vu:4.i9c~.XNlx}&ē=hr XPΌRM FܠCϭ0~m]=u| ;@A뀛Oݭ-v 7H*֯ eLѰs+? 0=PT Y:q>\H뱪$E|ᗻ#G SFk'dcWiYM,?2ݸe-өzIZ?p;Xƫ)YJl-*w=au"HSM]d~= ꪩ(Uw˲ Gc G駻A‘d2p$aѓ,m(C,io0KtqB?s_S}wO=PH,D89e"az} 4Tx^Y5WۚrYsN$k`Ԟ< OkSC4NYI5{0b~T22nPm?]=~sm2|!vQ U8JX)a{w@0<s{}1~s_tM/qÖEnZ]¤xgSSZx)egv- fe(W7-ÿ=B n@nF@~]]=)uWRp'Yn8prSټ=7w\%OH-px墙Nrw>xl(/廓zma8y={`*PU ޷z乏W3ts }W?Ύ#))RT.,}oX=z^m[|^ +\v| y~aBi S#j qWq;p_"cIAzxqAr~ ))̧ /ϋax<&2&0Msg֣+I" G  .pp4vQnr<v*uOm՛vҭ,Qkpݕ{j/ѣY'9~jϠe]õkk}f$䧏XO__f/.)U>zYw?̮q'I8HS6Cs)Fc(cJ?ZJp:%]|-6ϫe~m':38?x"IP˼ڙx<Vam559S56dh888PXৢ,$m](e~l\y%Zkr)/8zsddբuUΞ峵n)y9C)6OHO; * 0ь obcSAy7?}a8E`)R *e`v!aa>ww;P)+I aX?unegiҙ&pzEq<=NBcIP]/m-y~xFGܕq:Bx.ox *X]Ͽ>o0R͢ 8'vc }>hrێ0Mn@8>7"~T 3ϭ;A;wp't_OϽ&4ʋy/^.@^w {w)_uj{#mCiW_WW/b4̲v^<=e|ݛ^,+j q!yMśVrR˷+p, '茶jtbusJ Xb_ණ7_=5Љn:P`qߣXQB*-ᆫFGYttAMqQߤ+kzYXiB:TSד2UnD+tb>Y>EzÃ]jT8:zOߐ[-ǂ?~+OY w/s Q?zo,lӀ7wYv'Smͧob(w2z#% 'ġ6.am/8Ǔ:=UG󤿙v2؎70羋qU+v3~l kYaj H^cYxKf M>_!,dSCQ"SNY1_|U|{;./_/?#8َ7ģ;Ç~w` >yWJڿ(i`K-ǝh~>PRo*j8pS}CdD"- 2WW)"r5lJi:֚=G)ǰ4@E<ǏuwW-;3n"eAkMp/ohA≉- àr>%)׽TRS@K ?ΐCwK5=PR󪡾2Z#blLqAQb}^6KNV?At Cr޸vBH .AxMN0wy) Y::_[ ˫:|jkoB9݉2@l9'WWsWtv |QɊ_,IZ6[wai׀ %&opRwE_h⪴ݺ1s϶A8VչE Cp bj[~001{)ki@g1OgڰfވfQjSnbGbYTxFћ$篣_r}1YhGHD-Fb(G>w*i7gfo;0G+mU%3ccL$v6 n`_h7d7MI3{0436%uK= c5Z*99ϑM8lVʊYT^BIA.veVQVO^v&}>U.˨E?@WWd 3r 4 }hP{ktq8 mޘfb6ډ8ͦ%hh@ӣIm! BQ'E$@ƨFCHQ$?cA˷o0(FOA ^$Sd@7a -"%)r[/j5zӯZz@ Gǂ& (v/ XZ$:9masU>>q~9_4LcCa0qZ|!1/@0",qtn_o`[tݱ,6GUt`6C ыQ*V) \3m< !}_īcj#MT %rq8LQ|Y`$I sT._A:P/D3@c7h DYXP>y5o:,.ҤmI<]!IdddwUފ4wD"*_qX-86r2d:d9ldSM?WXQU1a s|5[,o1lrGH8<"M C8=4ws,=_Q 䗱unʋ 'p|)p.FoV̈́(/cl6Z.I5 =P {䑐Qta(ØQ?P"#>rZem$FЊAD%)i "DADHm#g7'9U Kakܹ[1Ua?ęO8ܸ4m|DHH" G_H5NFqݵסi7ç)åԶSAL_/ބrӱd\C#SK쿡rq1jDZ"QYߣW'cr4iQ[UE6%EtdBay8f:ǫ{xhp"RqzB*nt- ETPD#QuBa1l"pM᎕|Yl BiϖO🈾0D$,(4?TyWџ / \N^, ƶ˳̬p =eQ Mא#H]9W{35|1Y!'35K7bZ?Jq^YL A/|t t!h끎^ a,<;[ dgDN0 R;z9cYB1q 7./BjAy,KH8{|#^3{qx"Kc&r{VUQdyp^&ƱyؾP$&>AQ&,,IT9#KNwQ3jMvx]dJx~s|-ci`p8hDtU9\-ogY=ڜ* S貄'Dۂ ]W [:T.K!Spv:"  Ya"NΡ ]DT \t3$i}Sub~4C3&– |۹X-I!R w@S4X\;*d:ΰ'r;"/{z+q[/$ Tdo}'odnP dg&MedoD`$'# ײj5v4Ğ%Y5!%ѭ^!zH͘j*G/4 `RqW|ԋ+#d49# t5}1 Qf²[FQ[}H'1<~@sO~F'%:'/YPd(AQ]+2ܹ^_O$t*`%){dIL/8㡵y3g* 8?P=;n"GӅ7@燏я#&~BPBbge)-uы (k'H&vH%a4x}1D"p=$peiYI\V[dCOUfË%.ڤQ0Ω&xnJ~3ÒI] Mt(Ods E4ràȼinVq 7_(߱neEfi<1s0[*{մoӍH7/˛qӮx<uT h1YwEV0xEEyZKy,yF#):N`,- dtQùo؎^ VH5i| Pk#Pj\> N7^?CQ|j"Ipg__z '2$F; Q^M|ELoVySam١DMY$7i18坸C"p8>}PgyO zCWנ@Ø qDJD _(U # .a|yz1A4&v u($ AGSd4Y"hQX Z,sд$2yv'OXSmv5s}C9ȼNRNVޑI+ȅiItsmeܼb\u_s?9@} ];<{R=_j1rY>|`oc%e%W_BztI`LhU 2:Rs,O=]] rqO_0BaE^rT{jaPFnV+9]}p$$,vs ,^HE"r2熙tb1ېXOwE7T/H#Dž؍43݌n̈́#vn! ɏR{ a>s"3̨hhHg/ǝy`k"{cjUbuk:#ys0i,FضH(Fښso ifMY k YYh]sCIj0>O?͙3gLaD?#<"lH>1Lx.!8:rVc{DkDEՄ2w mձϗ:2dpZpgȳ26 SE*F/=. Mje,]üt7Om/c\Oh|;xm+Op ߫\}4gc9]7S0md勇'H YlZ_oX;*͹2*Ii^{t;uHIW15X5ׇ뛑 YZEqވla9aM:- '/,/Q5ol z!2* I[Wd!HL^Vf,U@gL#֨=`t~|Uo܀]C}{?z㻫{\{L?0kϟIɽ" C1\[DMn1>m"A1ӭ³\Q4u8a{x,ݻ-|oӈ9`Iδoo#KRj nNcbP㵥~Rr斁0<}\$ Ƽ0R/6.Ƀ4i1&.бVTu/~6|)8?u0_%a54=7_uAWˣXZ-[+y[7a{{n[/EGHR|YV6fe!e%Wx6fkRvj&#όѢ,F"> %{f&9ϖ[P_ܰ +Oi&| ]=,Jѹ<M,qꂔ/NK,IR3k(deĞ7i7(4$d  \xvx\z8 >z0|BGTkU*pӪM8B* s,/%uMt% $S"fC$ O@${cai&%8(yfJf7ӤQ7YuMpb7pbG7}ݶ( nʙ>IṇGu%΢da:J8Frldϲa(FiE%eBn\^ 1I8*@[_LEYf:OsPy%4J:F x4Z h١ ߛ^&ϲe- ꓡr=|G]"2yR$Sp>VI ]F5(edIaˈbr4Bn1h݂$1cQ58}|ZjC8")1vw\x”(QmU1I]˙nٷi4.WuRkiwƯ@)r4YT-z?$FzxP ~ALc=ܸ*7/^,!:Hu4yX8+ yPcn_:X`;ҰhZ{|{w^e u|50Pu>߉$'ʖya -:[t:mbn] nD@,4rl#K&]wOJT_Xw#'NlhHE4 MP˗s {/7Bx29,(sN-;D]K;5h]%iyi:R+2H"b|t+cBdif(^EAhtD/Hׇɶ\#3M Z" O_H뺘>SJubBk>?ܸtvg߱ drk<< OmatFYׅK#UgbcH`U)т:ƒa1*th?3@߱E+,]MaC<~} akqHp%x`-붦 xBd']ـ73is|%ZUFesM1y>1}Fs_>u{<K˳v})rAv|=J Z~VRUd  vvy9yvU%i3BY6 |F1^g29M$K3b3Nwba gر>? |f?x8u@ pyNWxtO DT:L$Y3&]:Ҧ  bQ(<*DF+e)6v'APg6miMZ0yVoo06H]YQkBcc3AULh B}!@}?57a02~5 9cl>2fNT)nq.f%ɋm EbцCQGiҤʼL:48m&ٹ6G({OgFс'(͞QcXuh=Oƒ9w,_<2@2ș rc@Tl2Mұ"f`U,YƢ-"{XGſ/g+c+ٿ@k>[ 0d2--7G%"ƿ?|4} iwm2˲,k?/Tdme7l*'7B[HOf6F:JGUK ?š4wΒ46 +M٤>S(+h,Ed "D%ںz'œ3yw<5?WT-=SJ4 ǏK2l(v7QtINBj*Nez{y.>˞aHO1So??Ae )o+YAjOQDVF8 e_Lv9z#Do1 O~s 2pFۮjpQmC ^>i,pP!x lSE8mpKj* E'^?|X0;f0]q<`29ݠ8aa p2a285__/y p$-I$ R(%,h ц/M"lHBpcjx +"AuζeEATwS3rɶC(2lZc 0w`!@mLJ(^LO~ReM_wօɵ\ޘuAh:S g%UƾXBgaTQj:=^s(JUBE+ƧS?ׁ6KL c58Yy]>w{ ۾Ͼe{6mqYK">6EL]>Vm`4(Ny[f ͔+Vpӗ'FwdkH(/rV9mO7>8gGSS5ڇ^QwM7E/Զ&Ww"I[&9y p{r:?՛n$ o 6o~ltq !asYTIm'j-V?pMxL'nZNѿ'\^ŸEʒ-9pv0z7(~FdȰ' T6h.m 0]\7ǥ5,dA@Y=n;%4^(Ȳƭ߲/ޓm麎1x56,gÒ|8Sˡ]l}N? U'0(V Pƛ[š E2sƞ={O~/|7Yƥ4vu|u,YCņfι\ 5śU(V$\cLV yDr2Ȱn rmX /IXhgk[h|_2\jhI(YEiep0$>8Z&I /Xݽ]\{J$dLsE>yyX``8H}k 5lYL{6.yw9Ei\j<[ O0`IxǞ2c] "۹8J8$!}={>y*aZKl}Z޵AȹDzB3#f8,6V&\X\(Ww`17*h8枕.obϩ,kr+K?6"3i46HuG#!O(Ra*#(.xHg1+x˺2 yy̛(;+BE%f1^]NgSU[E ,,΄PDk9tU☖w_oO^Tm/:n^$($ag2lZZB  *}~ 6zm=>7YYn7~{m+ q[: p=qGMLp".֟`XplV-Zϫ'^@9 xk&ӞE+؞tec` _] ?YT{9ޠ_z~ W/‰dP5!߲=68WdmޏvpS`e(aQ @9EC5ejxAܹjf*5]gt#GXߛ"%6ܐ$ȶ­kֵwvht1g$#Yf3 gLu L;NQtd8Lãܾc"@\dd|i tvHY(ε0pߵyt|g;Qf s{aO٨`6*dNF4Ȳ%##~c<ƻyKV!nj<\ ~ hV&| 7wkl8/Q>D@a,pTاcmFKל?Iض6Vv;P, nc{򰨼K&%Lus͂b0*xԷvx- Qe9)or2 <)! Vݒ$aDD%6TwrSV۶S4im]MPPgr h:"VKc+Ͻ=.  udl{_`…tuuzd;|ܰR/i $ xt EBV?*밯~@D2Nwok$AYAU;P1Dd֔NO`FEfMAɯSEIh&M̛EXVtxQ,ANI?AfQH0{n[ɛ,bOnc-4uzpBeZ~S#_QExᇹp\tvvl2L,^9l^yÁ#-YP1;kҤmJ:^M~40`c5b5*#OBq~\T^BanUUً?q@(D>n*/;^ j( FL$^`'Bu[:g̊w<<Y$ xx$c1~P88nkqٗe$ ƣDzՔﭶ(Ώ~W/0l;T3~e0S_hq _O},B>tP5xM|x\hO8!aiڣnsǺ[Cʒ+] GO?A"a=+&ƣ(n^sgqTXYfU~rfKb(̘7a[9μ:y 0muylCL@-Vn1K?F<0^V#e$>x4ecoX[*'bg2*<˿ }{),,3-rسcq[{+MӤBuEğdGI ą,&V-6C4-b*vۺWW#ga#\ͽuěZ=OӅYab씶7M:::P.{6- D:U$ҟmg+Kb#޺/D-Tf䌣 $$oWbўȳXauLmU(iҤ¼:s2|ב+*ǫ{xps۰VTVI ?s=w\H~eU[$YbEexUqUt}(Ww_)**#P#Q2Jwy.]$zɓz[P37O5F_zN ScF!I%:Fśq d6xwŝ Ip< =kWH0,+ џ8 1:"vysvmfM&$3p:~cT3/6At i?3 &㖒_hn7]J W/<䓟$`8ҏjc3bD\mHmr4~GZ\Q-a]?̳?/FsU |FXW 5]q {iB%6Y\1S}\}Uŗ>}-ga~)n^IS:vu,+rX\EN_0BC+ y`cTkOir+ǫ{xp3}>LFL m(cgVlሎ(L&F#k׮ŧFnߑ aI>& jԵ9y׭+8ppA_&Ҥy-U>δdʘJ!8]Kg7O_ 2j\WQn8z_xmݽqg"s9id3{.Ff%1ϫi硽sۋJ))WYaqT?Ɣᘑe%L`ܲsu!.6Yh죣Csxsj]}x;WwxO '+hh]_U0Lop^CL,PD'F:!N{Y53J;s$q*%$D^W24$I":#d-FU "ǖ>]@CJcwr?B]8e HUqwZnZGo Fپ@czX8 ؼlfI;|ꫯgVL~qnR1E pX A4wf5M~ul ryVk4c~<>@3z]2 ]p|e 6K򋭈Dq'.J9JEm4 :] ިT10U4wm@TRNx$Jy"@OP-ݖ1#[aC 8&4oY<>0T5;g$Jp @$HOeO("2s8&seܪ/Ϟ5˄Qx>eّ٠8X[`~e..(_9w2 穚΀'ȉ g ?hzw6@~;֭gA!~-JMrUU<})޺>wl+Xz6n8>~*dg.iP?j=-]J܏عKuE;/ayUŔul[5@0߯4Jcn33QS4]C0[3ⶈ"[w`(u`p 1RDJI-9F,Ĉ DW݁hS! `T"%MOxۀxKSH$x<L"Ֆ1~CT'̕nͦoU9ڒd9™h0|_b{]#,C%CkUm¬p>&bkuĸHc܉1c2_de",. k>& th>PE483'G i?b2jԵ L}/9E21X:}47p+Wߏ,I<}9zN=?BS'on ~8<UչX'>)kvgFӓ&M*|nNo5Vάz.jFv@J|K 35MOh/4 Y"'ۂ,K#3/V Ht]u^7"D11L@lovRm !Н|65Ef;ԉv2SDyFӢ1(FpM$TMϾ=H4Z.B(sdM9nNB=A?uer!87( u8!j.q+%HL>,-IڮX%DA# ǀ({7&(\~1F2unEbP/I:FEGurrB,-OIN<爚"üL>g鯏J&0FxSY8MUHUU9s4]gN롽|8QC 4~bf6dtǪ"6/+॓OUo-w=||w- kNG"GRC .o|E)G$r$Ie'?g9 Nelf*dG_CU]#u7s8ިHX?0$2Gȶep7q`.#.⅐:ҟ¤?nؒx.z<ឯ#nMmY <0_⣃nk[MAHZBEM,Ĉ H|y ˷n '܉E!*r-;oB6ҸHmɥ@M$@:^x61D+C3fFE2>|ȒKȲ, 0tdIl0tLLͤmaQɶEȲEȴXKq0$4id^&~$aPę2o1>_ B I ~0Rgk?#aTGA~BM*X$ ;EEf6Vsi=ټ RҤMMwЍ;8qj8HDE(;5fmx![;$eEXL @?lqt]M&Z~qE\%/׊ 2bu‘Ԥ큠cp$7{Pd%+f?U<.ȅz q;5:N8"D ,[xH@ >>2uI7@;r4- CzrƅȱEt>Qh% |l{s'(:]Q;5pcs8kjxFx@xCj+VC("&+Kඵ0pP#ѿ v*.uM-ȕu.EG -F Im1dQN X.TD7AN3?w xȒ,f1c5+a6jۜ}NCB*̂\ln_ xy7DRp|Gٴ4VsE4toLd4HD㹽u_{^"DwG5=qqlP wE/΋r(/< (UحiM0D"*/:FV,][cZ:{*!r| ,HK(MTE2߃k'HFs˜>|$c6YXVͫvN^.˒Va!73E$EFZ "UC~,p-6B"JqG\2G O"ݏ WC{.8,F &KE.G{Xչ%/OgW"E),p-Fghh O|'&is|1x#uXH,v.GND.O4 b1ߨrXe@2(RKې‹@F40 cOBA-[j}w޲`X.~l5h+V"e77Kw6#k%GTPDF2G珵$lmZWƋE|?J?ycw&lu磟~/|&4Vu>qۇb^i ?VcL:x}dg80hFDU RƕK0CaZzXLgo?@Y)⺭S'SN`tu=vkCƑF'og/k r„F2 ٢ȁf7ޒRRu7sp ,\e5ITMsa1Y1b7ŵ$sA?Wͳ&/aq썊zM8p#nm1)Cçx@cT6E,*ɤ$ώ霮xu7QߝSm}%9ʳG[%$nOO~pfܭI,U篧] ˊ}dj?giD?YN>8ʏS'_Uti 5=jXK s&c.7 GL4Zvy }3Isc,X|P}tJ)XIr%Y`©8%~n ZmTwXvh:Wz{]W/cHlLsJ_i;G8o}𪤃!&>0(әޛ$Y>r#QIvI`n1aI>sJٽlG|A3l٣-Su ʣ\^ 麎ןl)Wl#CZkhhbȡkDd88}@u[/q8 Mړt&l wQVt؝Oy#E & 7IsȢ, 9IByxNy/yرha&CC$:F':]d"y \ܼ:9~>]e3&mw'hR$aЗ,-}rD ǨWMtKm8E66C 7[uY8hǂ;uo~A_/Ls};MT9lqYԋ,aa\bRݟ@( ^n Sd-q 0D(\m[wo}iIoeڌ<_u45 ܼs3sltA'/Lߣ|T?ΌPK^VyYvq{]CC\ږ}> G][a[KcUv eB[4d L:'"Ȥ FC|LbU#Fh߲f{&ȶtcow Dʘ, r'QA=h: }%R!aYItKZfdLΕ_D*-BRdXyUxH8Il+0XÉ2֌s+ԁPDSRiR"w4tIUy̫#Wg2D駏w -${||][yuK.>O\?xJWs2 A1K_ z d[GvrA [4Mjx~_=04iCmMbӧ ȋOrPx$tظmQYde8E`(ž Ey9wռ| ZDԉ*bI~}}U8S@(6^/(-"aw zvD\Ϛ QVzEB#a|*Hlj;궒r,s$ ׯ)`Eaʗ,Cq.?^c(\e d0?lP@bLQU͚J$ c.E/A =,vƾ1TZWTE[&y+ CBQ#;9"aI!E#TMLE}K\lޠ4ɼWEt Sg⿯,㷾[x< -)+:iBșڬSO.Oϻx`Kt+@)01&6K˳No<[=E|c?><0y9:Ysmin{؛5Q DF~-%y6>}t7r7ǹyh4NwWj2Y-F꘍A‘ȔǢi:r -=Q&{Y;ڒ/@Qd*^04%MWmf*wށq/}+_u1z@Q4.7xa&* ^EaݲEtT`@{~ S0% f"ҰZ" I%*Wlgˉ(4`灹6k3G2hqIh^%D;wrls޻ܢ-`"DeH#"8VJ0!D'~\&L~su9jRC}x0tpz"EL811} ];NrF`niv,É&a@3^'a5JyezF-uYh66ju84ʹ?yU`4Efn.og waqi׮up7JZ[gOk k|/..t^>Ds7Z1Md9;d0)r\Վ1K?jh! %I"/;wn,_kZ.o[:&/[TrJi} _z6fu3ضv[V/NZ_SbT?'`%rmQk`873ʞ!I 5Iy{3l@V`Q$Cm|{$`*cA#I#].db (-/7Wa<$FYL#+3ɷgX)Lo_|Ϝs} ^R)U1w~U+OI܏6PH()69Ǭ=au~_M'LUeL~Aq5M]ns2(.0E%\oQ4 ܷv f_>;˂(àJUU#8='#˷|.5O&|ݤQ|3@.5g1 R 7;/do*z  1.zԫǏ x' q{]=0EӯB2d>} |0YJ᥋;X5'$MŽŗiꮄ $!!~$k3( +ϥlFE;d8- 2m"מ6N35U /6|jG6--ggen_<[}E'"x>l5 '/ʱrAN,K 瞧I3h ؿx,tx|Q ]שnleQVoɗsp8k׼DUtI0fm W#3&p4=Qv+&o }+I&-&(Ȇ8s_l“qFf6`, $*9.z*p^LXu'XQT1D'!1M.8kgsۊ|~3k=5;͢ .u@%U|N E$?2-x4*rܪ킟, PQ, ^݆QAG7DlM1·4syu9TUOBo0(]DDE}gcO`ܰR`(e7GTMe[s3$غ&2Pup̡>4ihq[cBʹ)f=N4eטMF~'9r}"u4Jo2pب*-bŢJʋQ ΟAZnWXž3z=e#A.19,+Xo峏pa;ičcn'.ݳ(*SQI]NO礷졳N>>HVD>lfv PD Mf۶Wd8Uq'2IJҤE 3 e8& ɵ0#IV5g.כ +X\QJw.nEj6AQ~yY#p{i(2 JfxôtN\6 iu=aA{u l|K0 Z̤`J^9Ld3}.<>7[r2֮&р7!%m!]kNq53*Y2JwC$*F%7%c"śq h@=y2q%:]8\?t (rUQ4-FVfP;T i&*PodRkπ'HAv7/Xu7ʊʜ$jMe Q^`Tf{Yğ_Oh8E݋xVLirҫgP$ذuN&L m4a2Jg ']RdgU'@S|_ߴ*яC2W;\b|vR\8̢~ u:(0񝻖ߜ|g֘@XoḢ$&8_I ;Waۙnpͮ\"ClN+yu&,!?Fҹ! 7^_>u][MyKyQ=/4/wZ/V&٨p|۰O U;W B;D@V5rmF &F3Lst^[߸ M-NB NDQ~)5EVPLV,&+(OgS[- 3>bJIiCGor=W0984:bA4'O&p$55, L]ȵhCixt'/k{&:18 HYbgS \{v]x p\:2ۻ `G0bY>ubNV-$fyo?[cW+%ai3a|`1(2_xTUO/7 ,w߶޵zaU\~ ideY b4) ĦpL+3Y|-*B}3!-9WXet p':aP^-Ş@0 Npb]Rʧ?xJpj8j`X 2Bu%λ߲o߰ ËltCDgNk[*2R> \ȴC{^d)оTjسbp3A0見;R۬i=!Y+Tt_kMQm3C';ee] 3gFImL0/ &EfY^6k r0ϓ_l1SZYkYv1YBK  ]1kyس{!O>WC8{hj:Uà++pJnR򊜩UX?X3A6yْ<.}c4iR!,sly悛 aUD]:lM%o$]|9=^^>v.nܱ% J YPZHMӈ _ :N]C׉+,)dZ^??ʅ(DX&>֛yU ߿rsErUujy\f ʼmVK[?QCW6/f#5mP|IhN-I4]j +`!O$yM N=%{)Nn+/5'Cǣ"-E*9M}*{$ bbSq>Ys?,I + 9yY,\Z]kXX@)2V_l+ЅN;,(oܱ*vۿ?5Dc(p ]ǓXTu6#X[*hr㥽G3@ALJrm&W ߾y.KҤI, +K L\ rG]O~铊'$Iba^~MhK'8A^vUE)Ua3#ϿJSGw[}.)妫6a4$w+4N^8tMFoj>[&= 7z?4XU50MܰEլ>{5UEnY>*3k=qLt V7V\k}uPxT[nJO]O=zoL`2Fm`>_)*1SlV5m_3DcTCQi$[n7 $(Ͱ`NFL&9UxE%JH͒&M̱+ĬYYȦ%<\ -^~%mnjy{"/srϗO"ҌO 2KX\:3n/h#2akhE!M$ɴ(l]`cS_0}!{CT|! bDU5^QdF#FL2s2(,(GoQ諨qt{y\y ׮Hɘ/akwՓБ_$ʋm6 rڶ ?_?N+CV޾qQ-BMdWkK@icOP$!jGNɹO!y/0[، l=WO{UW0{/vx:fp$0PY^]k5 UPU HDE$4MC =:$C{Ah6b1,6 fՌdd2b[,YF15r84ic^&Ex=wi:/nxwܲ KqX# 'k{{Su8Jm\gfa/n'Rރ'YP[o\vY/3|wq,*e3Wi,G6ޅC5 ^;z'p*wy_c\i &cr5Y*-bAI!aH*:Nņz [I`k?¢=Ai= j@t|٭*ćvSm3PKut:oNuqjhݰ4UEVt]CEHC 40/Wm-3|0sy/,a4(DT}\LOܻI"fwXu7>wO׫} S0p9ijˁ_>Ӈ$dY[QQ6 cҤ_Z4sS*}6<?7UesvvaOZ%IRRit99~K- _3YX/}M\w՚ck8bJZo^OSǫG ʥƳxz yY)$^=NKgb_ 3_y![\,],@>ZF? j<~J;;*r}(Ƶi{Ey1a(h5#UDc IqLei~=rCew`eLPz?dׯ)daOkV\|֗k`iajI#]+5"60C1 Y8:W$ 'fZ okzߟ$8x!U5U %E |ռZ߳{!o/Q5:}|own;p&uhriWδT;˲_=k}_!Byƴ+`A%)od4#'N.~xfOb%ͩK4v>^d2p5Geq+iƁNM17K3٬O PQ6]il౽r[XPxt=ISG]B"7^y{MF8QsQ -C*~a7_~wH85nm9|360t:Dt$&JK a⽁՘?Z)0OP5th0J3m''D~LS6w}ܹN#Ϟy$rڼB1xf{/\!Vm*U #&#?x5-$?s=K]ճχ?!<[ܴkTpoX\;f s!M [L$s R8HU>ww o8v6[ɺe0|hNsg7G\PxrFTF¦5mu ~-1w5!g|5 {2F7sAN\8DKg#6^OEQՌYUMRYz 7$ yc \lp ft}rgK I4ZO >oQؽTOI WDy,H8ē#`X$(˞|2B"`¤ܳ-|~y^o/>z0+Id01xjRd3MSg>=OL& }]l wO^w:å^z躎 J@`Ƶ,W-|;?|'/ B V^>~}l+E6J,)bAQYfU qBa@H qsqyCxat,I%T4uſ*ei&#_6mdح|om̿iC΀3q| W/c rP8LKg.ּIDATQF bjI(Mw}HQ~vD xbiEi٨p5KʹKpfŢlYusS}T7'I|\Il)߸y3RXX 9b3Hܽ{D?w?~ ޶Tn&KbpYȾ;]"ց 39j`E0&d;??ycTKnTY,Is:Ue۷/[cIVׇ>d?,=+`]Eqa1? eIr'~]\_ӤI+"0Dfq-oo-.#ʩ|O,U H:ݣLFi*o!NG4zz7 !aP$aڥȨ=#! /sJ_oeI"7M[*oaՂXß'\>ޭ+IB5O(tⷐ~Z7~cB/x#?q%,,+&;3Yp|4wIW+][VUU(rs^בC,XZkPWnEf6Pd=*ȰsoS5Y\2$‘qA\=V eIbKE?o%K'K=,&p5Xb U>1nw>Mn &.IP#舖,SB #$CtC|!Lʛ>ip]gΏٕ?x3p\e B%1 [.*KFu:BX-s{udʹpær>xjZ]꡾ŷ~wo^AmeHfΡȡ/ɲ_{?WsLa7ۧ鎑kF@xu'ٶj˦-  ij"2A[Ayy?|rΞ?U%Bv`8 $w섟$*p>/ܾnjz 2B`DP5x5`XƱ豑YV>Y$)& I`235pݎ5|k 2F c2* 2v +YV YPAaǤ{CzR-jcql+{J4CڇmꫛYflql6;𸼄ad:0r$M&CNևٸzalxPolϕ'Yv3m l,Oȹ`(@]%j*d1+SS_ h;@go;]4w4:QW-w/#s &;њa KG4ѓ?z xn j0,/\Ktݢ|{j;@Ec[E2aE [Raw%vn]+D/n n7qR3/?󯞦~jzTK$IH(&#`%!ZXRg^ٹp& amHs1GȗPX!SEB7m7!Mq躎F"d@Q$,&EdT.aSa\IC֍S&|A1/> ' Ez|88ܸ{]tw B!Ԉ((EAq.kFZ~%UűP݄:Yb]_ܿN<Ƀ';qQhFO']>d#Þlb"IH@Џ;@ '&n;?py ĦH#Npyp昹_&H@Y|E%VΚWMHAH8>5 )k`Lpx BL Ӌ!? X2`XTbbʑʷ;50I N)*/ Mv;! |X2Ac}`pI3?@Q_ׁl]6QFdvkgz^W`Js,P] -\~OgsޚE̚Qܸv*i9Bd5C9LփxQL;}_<#I7,N[RzW!AӰA4. ο pYQ@DQ$ 1ƶl-RN[̛9v|Pʀ^$Qd4PRR;mjKRŋ9槟u"rLܲ-( ͦ.GAo ?ύ?Vg'̛;7>Qb_Q%0e&<{z'"j64"#3HL6΂Ī-o:IB꥘:aWkDFXBcr_N U%kFKϏMbpx{>{]vk Hb P`v$Xk΄cA4꛺QQ٧/5 Y8g:SXpXigl^ae I,[TN'Rhq_k8^oݻ g2g\bܫǭ7.H3HAgBmT1:Ou#VTVpY+9gb{iedEAaͶQGAn6vN"Pܞ{^zm_Z; (Pl7peyc#]ǂ$JحٔV0o"{ +̚2EF x0uۖ02 +*Z GiP< )9tO9[c NuDJMf_6boY::Y˘5ai#}˶'n Ջ>>$&,QKv8Ku f,&E(+NIA96}4hH~ [Ҫgz&pM*X1EXt-pirA nt^߃ "ʑ SS*]M/߾Kd 9Qxk/#gWajED(ps[sv$+./~x1YLo 0uBW-EfiDߞ^*`X{"Mm9 $&T ~pI& p"2X4Bቑ|jm{H4u`mV'Wr5cY!q-j>N&v[Y:5]Gt\RTp+"2d/vt~" #sQ%y|A~g_o t̮`Ylr,777@6$&zo?c֐aPT&gtPߗ. &.˖Qo10@7oi}ܼVQl?γ s`h$ icckv DO+acUVbId>_6G=() @%Q`y?_3^m1`f\(fHl-yܐr- I^nz-0zv F'4-h7 fLHr;ЛB"X E8_J-ٱ2M6߲/\4/]E^A+X2d8R ?E{س;-Qx{g;뢲esY3Y>ۉY *oknagAEV_]Aqa&ϐ!]HS!]f;Q{>=9+`F@ԡ DcϾKdP$QD'MQͫQ|:=~w [GEV5jzFG`0 ʊ̞mlݷ q7rU\Ҭt.nt􍽊c !(F#>߽Fi/TfǪ#:0Y|4AmBA{ͣ &l/g6TUp$9T5@o(/KAQQ.4f4č _yj&3M'ـR]89]w,p&=, 1a]2w>t2M(JX8g gw_59'Oa0é)X4u%_Ƌlގ"Gj\Ե̩5\y |׶y:ޑ%ƒ RZ|cY2dȀHX ]ļD hA5q?~b+}H#QFc{3KFp z?})O.d܇QTG 8*Y2^oϟ^4tcmͼm; JTos*J(E$²ٱ?S:(6r~zƂgωb3K!U8dqiz{@ً˘UMa 4tы`bMI US#7izRE>t\(/ڛ N$UUA'G厧"^zw \1./*`Neԧ5IV5ɺCNqk*e8vhB4_,FLZJ{1ŠJ; K^;J49,O\QOVsR|[%\$H!fV?yElS60wV>z|inuT ._u:xww'<9̙òYTfQUEŀͬ4Y^YPO?@MulAS 7O.gմcw|͛(dp]ӊ`aUl ά࡭B g_;h5ju²Q7Q N!4 zqy( =ޱ%L|:4j*tgmV+A3`ĵUő%45;;bSrEd9+Va]V4M >z6Mh!_3@ep~/g(ϧ%3mQ?Np/~`K۟]@uyl#C8Mf;?ǯ]_rҪi1(hbOA!V^DUAQU Nb* ѐ M@Vt&^/r53 &{9 tȌ<hm}nS˚%Y2 q@DQUz]kdfИP5^>~U*ɷL*D0,کks*G6H4Ls!Z1XL&+H_G0GFA$/]}.ZaOvmJ8DQBԴ;UEuK?7) P(ȁ,@CcIiW7Q5T.tagC/B0^ 8\oC~p,x:]Gn^bI&[cc&398:@i{}+#$ôB[Lga?cD ?v.}o;4 vŸߎ%U1a(`_He+{a:s1o'ȮDsIM.:Ei}G2d*dC$3VUrYuxɎFIt_hE;|lUe2d,|~ A'1ʢDQ@D`Ny!;$9gx|^ߴQ^Bei9Yv&ېD2n>;z'NH?wHWŒQDiP?fHNyA%PS?&?:Iku?`4v~7 @%.[} .m7$?@{7u]Rŕ '-dʒؿϬ.;Kjg@"<>Q[DöDٶIwt9pɂAM_PHb^g2ːc><o<_CUk0T !Ib(`o_yImހτ2lngw=#LU%T˱2G7aY0oixu~  4EV.+c2<Z\x})7%]$Iʇ>0o]E%fĚ!CD(_{.lԳ\{iuQyw$EVU^^DN TGG40fiyTx'ﯚSo&GwrS;pGߏD4|ol{(Rt*soKn'ۚK8wOm V4;dYrxsQGQ3G4hwހkWGT6-1Nw^r<9.=&NdqwnKxL w[b~a!9g) y|KgϜ<6mm :ned"1IfHUe.]k>Uy{i2e;h}iV+Ȳ$艂4 #F-AȲ)̲$:6 ͏ksXpvc;kp%-9?߼{X#nGQ+Az#g8.\$ƶ|olvF>v(͟,o}/4}(}uŭʎs|rE)/X@ yeFGz*6WmyB'B%hn$s!mI_KZlm=J'V2Ae,,yČ Nj;knGݝ$$ʾr市UMH]ymxw߻TĎ]Zlϡöj֛/_u'_==|i2L4@Xz;k5/BM]ik;vw #7iG$ b,6da1V9gVlq )qΐTa}u5Ϩױf^%cM( ̩(bPI(XAOyA63s1HH]{zhZ]WGgVx*ke׾.ѱ%_A ^^g;<Ê9gdž= ?M%V-?5.= <"n.3^ko=ۚ|O7{Oh"O,=#OplFÆ 8ܵH3=ݝxy}=w(<+V9b1-kc=b!4-VlraٴȺ<8CO$b5ݝZd[N/zF]N~-Y;,ǒD;['7H6=?Cy7ц;FGwqʲ)51CTd"£n3jy_ZE8d^jعNݽ~ܞ#'YQItYQ%B'0hZy:IDdEtϲy̘j`zE6W3<XLʐ! t{GEA`<ׂ^(o |s`(α1$8(S^jw/ AӋ\0+@PX殿n_Ù~<Ăl9p%#Qwpxz2?.~?ƶxR׾H4<"@CbTj[Ӈןr`2$w.)˿g\+}ƴXOug 1օ3su#Jɐii+v oTǔNvdӠ@&Xo+s$ǛPKqW< $LIv ‰kڨi\ : ˂iq׭E@g.ѷ %kvqɜMDd0d(1NnQvoo K-kI`X&VP5aH4v$ ،eVh4»;; $P5#Z#Q(-vt>vbV(Gq'͐ᘱW&AȲ(KJJr-huEz z ,(#jJZA7o0Lslp49|s|.I$CQ4~6%GC%r]|19,: Iԡ2W}GdiԷ;~|\q>֬W=#:7ޅ0z|hKxd F,Źe|_5ײa֞&:kN7_>Ŀ>kfX2ݻCVM.oUFTV ÕIqgOl5]?U,<^,XX%nW@/-2E}x(?HR(`VHϥ8x9R/00UxjwO& ܞ0g|z MθnW48oY9olocsM7nOdYLٽ7i_=[1Hʐ qSҚ,ŹAǂA'QUOEAo./H(*(k zIf2Pc8WOŪ9qԛǑht5*m|v?{c(Tg}V^IeIu˾D{_3my&_4;k_?W1{>}- pu*Ef ᯱ$klcUPSUgćκo7ƞC[G|ކ&oSR~aD~ti5-Ӄ6dDc{-aj!g Ƃ= w1NJ߃eEQABMݨ4k(d?=ZH~BU;Ǭ0#do&GA %gNN`˷3wTUBEv(`( (e?ϤǏnOHjVaIL0 MNWxz"IUq'L?q.~ihRM>w,_IJ' ]s?{맶>Oy$ :\;%vUEEBV#IXMlf#~pT`,.(Fcw 4fϓܸee'ok?x +~kAX|~a- ?s zaKͻl6n35 /'<&uD:1Yz`4"/L}(-B)Ԃ^"ë4orLǰKow~`81a$F=ƙx5E7_y7ɽl%]}9xC Fk! @|NjKD(] %oEQ⌅öpyͻ>ρn?/k2sJUϽ-wÇQ'rќVx7͋',Mvo3Bꁿ - /L |ly)R+אwMݸ܍x߫!Jt۠˧6EA A`z*2wuRz:{1YGΥa[=ߖZo@STYXUsRg̛tU<j(!$p/0Djms яOG}iT4 LCs3' Yxo'}(2T $%^<9r;V=ю ] V@i|.Yus/&ۖBi4~'ϋ/}ND=/`m> rN ~_hœ3gڢ8 lj\?@.\v$*+J137c2ī=Wjpܼs l]49Ci:%%s M'V߾lboO^@ÁM3_[,G9zccfXiLPz"5mqklk 3!VK o%C<ee>BkrÝ!'?;άl* I+H_c2d((^ƒ[:hvxiȪF0D $0-U9\5YYQ5~n nBNS/Ppb FS^@A>= UMZj.SԨ@m>+aԟ`(Z&^8" E 1˚ rly<}DW!^}o uqYtvOX1q4A3bY> 7w7S*DA% vMag㆔((n-ט.fR(dި59C"-t{#c E ,+ӽ+* <#e_kqc_}A*f1hIP&،O nxúdƱ] LNOz" (7CcE&&LWCǞ>gYy_yIq [*luq/s^wwv[0.DZRS & wHfVSO3O}߱Q^mLoVE6'@cHHi^g08oıa ^ºCy'L46x Fe9kEWo<˚! w6t|pFkN{Hxq?'}Mek_x5 'v#U@u܄j{w)X(U=|vux \ş|(e9K~ޭ CkΛRE> e_HD//d^ v%l7Jَ߹FId$dۊY9rc3d8^dZFoppCEGN=|OU,((K.^Dp4-62խlŹK5K8giF]O4t"W^PX/Q)*?;!.`Bgƴ 7wv +c{=Lt x1*ktHE_Ma=k3Ǧ#0~/4qnW$QLJκ>'fW?(q+*_-;';D??gy! .+ȁ;W<\?sTD'۶9fÞ7u\}j{,(̦7~4RRS}" %O=G6MrX1F ݞ.CI. nhBKA/mų~uþvX[ykjtS%GK|X <2}wFNi SS>ifnvbNjGeuc$In;d<#p80+y$|(/̆]|Y\|0^XUnzT?5 a_Mln a)*`n!zE9)ȷ`>#j2DvEM!6~zU㕃G>hRxBʝo43AOer](Pb?ocPyvwQqu>Vxayy:fZ >th쬛(-t o޽USR;Μ^ͽy X0LNҳz兕 ~7Q ԥt{JoY G])JWĿ9DCcg&9|!xvy $0!3&||d737RsO]Ê+(Vxiol+ IL1; eA`zߟ^8Nk򖎣D6 旅 ɡvw]^.O2 pFyM-.~_8@S^??t:+WD$/_ҥK֯_SO=Ŗ-[hkk#h|a~^Ԃ!:m/{#HL0S c2Ȳ7Ӗr̟S@Y5̐>4:+(`6ɲY(&?; ŌACV‘(_Ϗ! QTủUxoiD/M]ܿcFXPmC736|Qډ(nje%)<~=NJ$dV^dgqՊI0T+׏@؏no|;6DԾ8 Y~튦fϬ8A׉[:u0Z o:J}eΥQѳ}^:ܹ0p@Qa_s38b?'Y7/9O;:Yg/${b} ^kub D8JDi)uKt?~oUш8[}8=!t&+Y Hy$Nj>sY't@yea-)E&7$2LMN@_{Fc3yy|@EjDQkk֭[SO=!Mn7Mzqz>O *xk}+r ( hI)MEQ:}U,_d2*ec1&no$f1s̝9 لNF|jA\4wt rBZPi?1c8(P}jU# b"RYáOt˪8yF*|>x @x5QiI'y)zV|@{vM-ʳO֒RZ E4,jLE0JE4 wzcב`ZZo $b&{!Qo~Ƽ!$*y-7v%ʽxnW?47;~4 :=~"I mB э*GWoW;RPeMՐ#*agUDv+.v'ΗzmW9=eq%݌/WTu NU;c3dH)?K046ӮTFf͚Egg'G,o@ 7gXTTu]G>ZZZx뭷æMp:(JnsppA`YS]]ņ[imm# XUUUPX&wٶ|<}_U˒f81r[P]ߤjn03.Á: FKmuyx[%dU78st&fl/(UxS5vvTOEQ4z)Aq6r %^Dq$dQ߶QWTPm-CSSv+V`r@-ʳ N,dU㯛i<ʟ~KOs5U_C>ǁ~B#> ?~x!JJב}~YuYU$$+$RsQpha(I]ʴDA%CU4<~zk]DrįY%sa5Q0+,APQ*W1j*] yJ KE(;|m28:Tb&x?;<Ԟq(gz-^O ]K_D7I:*>Ou b0'/((f .(ֽã>ʭʂ Bi+8A6mmw>$>=5C"!m#^]m3 +ȅk X: (Ux`?]މ PިsQZRm-lf#ؓ$a[Q8bҰ])?ꊻM'9wiL^{MޢǙd0|~ {j>A*eKMGvuǪI0*eEg%яiT1Uğ,5bes`΃_=f?@W K،q7X#$t9#Ͼ?ز]Dhz7s S wsVyPrCD{j] 3-R9$3Gښh!Tى>J-xbG fʼyXf _~9+VnpWSTTw].?я||hL $ `>;w SV ]]]رP(1m28̘䩤 ݻyyH$2j;j46NTV-+N|RQ7s<ohd},?q| Q()sVz>gꙻ[[=|pLz|H@z 'o{*GE96z݉J V|d{*;i{;bVϥ9*G}h00Ac~' <3yhlk +؍/r"j^/yT[ΊULɬҴ+ES ն5`WHއW#Һ7R&HR! 3 x_b|u -r=≝4Jn=AqNT _O8([d] L'e߶zL}{5o+UaqJ$;;dX$ h"ϟ˩h0ڵky[o,ɴn~_ˏcrrrF\G~~>z+^{-*x7|>n 6$ sssYhQv::~gmƺu먫-.0 ?YOg?"QsDBa@0ѠCU5C6h a4$APU A8DT5XYV $ ȊJn9OrQ/Aq~?HwagMaIzR&y(R=,Z;8܉.,C-ֈ9~.ugqvr?嗱3 =vV2<{?yp+ \H>Z0ew\5> s:=ILn/P6ɦp>HUy(9|Y oS F=>~t|y`_Ť*->$ؖhH}gѠ̴UM_uȹV Gl8@gOk/&wiԷ9D Sk/as'EI@QQK,3`͚5̟?\mf͚ţ>ʷm~Ḋ{_W̛7zOnkA׳~ p88]!z|xa<0D :h BRT )i`JN%z EQ%TUCDɨCn3b0HY5SVbJQIN'b6I"6,FD~N (\C짭Nj(8=^nZ@؅RU57# -piyxghviՃ:=uT<;ᑆK6Y+YVf#dl;ͪy%'ĄO\ ̙hP.+2zݱ?VA/p2C$DAdMӨkElZp^~)vmBUvqW"#)WHO agz2R`0}<ʿym8U#;}I硏m,>)OFd$ceWAgcU6a}x׭//&&J,0,'8zs}QmێA47~7vrOht 0}U4F )ꄍ4T`YXvpxC} 9;tr;ȪU׿ڵk)((@ŝ< 뮻>}:կpd(/ y\y啣noKf ?ihhHO$.ϙgəgWUy7wCGGTU7R^\1Oj GTUOX eO-IWPTa9^/b0HMz Z;̮cZy6s-S?0.מ[;Zxn_H4ayqP$¦Q^L^vUټ佾}>zDx( U%yoNf$qB/S YQXOJ@EA@WԶ:qz|U./ʐj(H̛x>w3y`"NE#Q5wĂ_ Umul.g,~rܳKr%}O|"@)!׉T]r#DMVp-zx&t3LI H:ʗ MM#ҋ8Jq#~% ˴t{2 S: /Kիy')2}t~4XTUpm;)ENUU?qƔo',qEȴiӸ[v\[@K[~t8XW o@8EOT ȚRR|iimh_|QD,f=Y&*eSYÒTNfr̘L:t:I1M yY&9wK}npDAC zwزKLN'xLI78B};{7bjBL=Hv$tvV͙ݜqq6h'`NIꉵ\sM?¬†ݯsٚkɶ[DQ ȉ^g7HqK B,!|xhcԴ8%I] GiS(0hQ)$CI.Ŀ~}<5D;g{*zz3~^}0udYHG:x7}Ra7%Ҷ_rH*@Ĵ e=lfr*F?Hv3e3q{d ZhbsMa6EQ's CNlK' ~6):O~̝;o~lܸ1Gt_;vp=jʗ5@=\fN_N_=ioo-yc]x1Z'#keQpX銵;@3$ v^d sf%i̛=>"jdqUF8D~fƪGQƪEsƤ3 ;&UcKM6mL(/@hl+ rϺN'almeŬz,&=n߭luj]^4 ^,lk.EysoNpL\>'jhy½ onBt)U5E[둵->aH+t:)"Ok-e=ÿ)vXjSB?f"phT|qI o:'7|b X8I?=e|&?<-ocr.ZlhRWĪ91≄ywA Fz, +%0TL2"[n׀nxR\N0(eۉӕt|3aڵd-W'oO0 <|OzG?-5Eq?]nn.zQGKݦiޖ6|#M5u}> WsܒZv6*`zqUc._rω Y-IZ1w<KPJIp_] ˄{`]VpY^ha^ef.kfb8S nc>VБ“}\+fō =](ѱkr%8{AEv7a3=y[l{tgݦ)*rrEgO9w!M4yƤY /~_?TWW,n::^z{/jUӑ|C6(|'t(W\qEBb]OP˝ȍj{?w'GqyUըo bD*TOO9A돰>M_goLJHB͌Q쇢єӡĘ;d @8*s7 :" tA[#@߰DT5lkL hOBⓅc,FWq&98Lӆz*\sq 8ӘtOlfr/=-v-*zmG|ˀ Ev>h'ep>y\)eYȻ28BM-->|h 3JdDVS$~JlY<;^1[Rbs%9kx)UV=4zAt96|\<}G:GOVdp,9i(oohNoIs 7h"/~Aiݻ[no /+nĪk׮Eez{L6Hf((,Z~)gn8bFٰsΜ\9{[ZS$c|h?@fi($hwto:NJs7dyOɯ>!3m6"2DjR~OheY1YV NOw_4}4̦O}<}VvˑX8"48[VgZzf[)a\(D[[ex!}avʦg~"񦫢ɐ4J5UC4&P}"2H?4ɿL] )yGO~ŵD|&CYƙr~wW$ c+e_# & 6" (KVTe 7e0No"MTΘ1믿8-⩧?!w>_,X4~?VVVロ 6 .n*** ʬY5k7ɢ+Ɔ[MNWꊠ fF#vٌ`@EDQ<,tNC@௪*$% SUUQ;5E!eH$2xי$=8\ KL4 e7J(cJX&*Jٶ.[vtpӖl+y#5ZM( :ʊJ{쑫Fɀ˟|lqR%[I g %j*ng~%ΎA2QϽ=D'&<Rtn0j"cfYVy `;]vy?ފ AgS_"ᰪp|mȄ`m.LޜTUB8%D$qU ̴?B8@kuys1# iْC \_=0llﱡ:zbAz#'!~ nxÉ8bWӋhHI pqR&|[v' \pTT$9_ /חxr|{c._ԕ_Ӌ|eCVs`7Xl@ᰂ1 }{j(=.' Ḏv @!3IdXɯVhF2i,B4Q$,}jƕ@(%k}aڨ=yScdW/Gki5|D$Ys⎃'B79u2-Ɗxn(õk6}޴sѓwX LJ .NJivYB@bUoܜc̐!'e`ˎzzml67tqXQr$I3 [l7w7ߌ TUU[4M1dp2袋_B pgN.>/g"PU`0EG GQi6Mjшhj:˲<YFD"AELz CQ:~Ddebrkupf?fl )ƓK]B,*vˢ BAmQUdHB:Q?o~>WJEc7LعO& M#c?!|xNc3f/*G$5D$1>ۘ^\}L8@;g1>, "kϦo & Z\!Cilvї0Y0谭LTz7&AHi6U8B|x䐂*hQ 8[z&˭dX1Xtc> d!;io! o:l/6 *Kg~kw Op`$hsh6/8 hSh.?~J3*Mo빶j{|{@@{B!#錿AӈPCXb_3-Cp{BܡL Ôajh&:D0UVV|㰢Yv-O?4Jtfn6oO6-o]UU&lMO?4_~9_RV.]*l>yU}#$Is%Dx^p<Т1l6rss),, fΜܹsYp!˗/4u5c*'.< .iNMF*JSV5:X%}ooh'v5a n"]j0M!DC7LiOHLAdilvwS6w9bŵȲ<([oiyBbUtHD(aB< ֬  eڒ)\>p=Nv"D.-f&%^W!&, GEU4\m>kZlrG Ŧ ztpRv;5б̕g}QN\zl1 Xt%,!e=s2 I QyCMCuq-fJjqB˪-HLV{ -j'`bbl$W {G?tٖ]LU% Ꚕ̐h8`w7$ĉW\vl*)c_s=XłfcΜ9G?ˑ~!;^zo|$JJJXti܆QULb VR*$ICK433<1LI_U.YIQA|eNQUj6b`Hw&TC|goij ,+XLn G^8HQǂ `6x7hmw{V,k9< vK&EhdW2Ue߱X^+cRU6gp"L:wT`ˎ,/a>zmgIm4B @.hM$ iv*kz4Z?Sڼ`ZB+C3v}x5$~^z~ܯ?$=mA0N>O\;NGhL?(Y (2Qoμ{ҫe",#$Ӈ"1X'IBqTUddit'1&ϐxq%9W8l6|8(} 7pO?4< :_W\xcOOOh `$DQK.IX{?u8e5E`0$ PU5<~jc4wؘLJm,_u-yQCIAjueGǘ_]>SV^> ,+t8 c<ؒ(Q^7Nِ:q'*;xFF @Av@_3oAQh5!@$$A"X$&4M:F|" q&VU9Uٶs]{K'e}[t$[Vȇ PV;DC;N4Ua};PR(c؞jBH4(„ L(ޱ$|˳?葝>VDӰiP:ʬ6 3t7xl[@ M 6猸%FTOGWsnv<7,8l"Ζd|$!}4ߝVR<Ȕh(CC `O}nvBce6v#3}t?fJq' )HI7Ȑ8pR%%w5L{a֯_[oE089"?[l7rСZ$cH$Bj2ļ n Gdv잘z2RO}ĩeypDOoDQL{Fcf&v̘ ֮\ޱLgH?#Æ-&G,&#\lbբ\{ɹ,/{}M){5C'4f>e5IӠ;:DMhA(T'JT7pi1*Th &Ɋݐ< zh쬛 E! +ݎkerj'";t&J9Vs~r ,w[yS7!I- C]I}E7_qzWƾ|vļQRHy 5u `$Y$}z{ΨfvvC4vu/s玍|Gtb}:d3# &(r05-˜[ 'U-IxUUU=Lz O4(BccѣA Ox %K{'Dg60oti$CӴIKKFRl)ы8:ȵ^^?L S2vsɅfk_oU,TQ^T0x[IA.h- +*:ꨢRK(:c0ۊ$ +s-&CRB5kaT{hGQ'xI6 [ ͕)'j?0weQx2jƯ;Yع+ilQ$'6ΆĪ u8@%ҶخDt!ǩ*tqHW1/qNy/ G1MA6nnMIĕW^9pc!?Xfg_"yyMȎ;^zipӣQUuB( ~jV+~I(((g 4otMX-cdPH(IP.\r~5y8:xeя!ѓc1;1!|iK rYd^Bpd11m@><PV$QDI´]>wDAIe`D&+ф9IjQ\xboolq%2,F+EqQT%`~Y?S<1[ONS 80oۉ#eOvX(bz]G`Xk~y[>l3Fz8)1@AVW/Y9I # f{:؂7S.,dY~.۳:7:>uޢV7P]b.N  =](ѱ 6 7^g/`eQ)= pwpVg%^  eyzQB8(*,D6u^"^Ğvr+#eM0k>tC-xyAѴ#G1%٤JÓ$Q/ }̚<ؖ0ay= bsХ8Ê -Mu*r3ݖ?4 A'EgPPm;%3ƼTt>=`͛4$NWL(J*/PW@%*t6$>/b YMM5*.r^޷1AI/R0+1=Mq<Bl<˶ HئcxjD5xGdz23LN߁^\ˢENvo߾M(L6mRT999v#F &~`x￟Cz1bX,zsW& ((( //H8r?CTV5++7ϣj&1rG,FQTU=#wQY!YGϘo.8g&YvcBdGo?}L/-JDA`y4ut ' 3-H+ kG'Iu7P 88h $lk QT z%"z)8;7N.w(.~ʶ%~EQrK{o3Šضh#" @'0F_O7, Ci3Љ:"C*gFyIsP@KJr1͊Wa"}ۊYi8=(1V˧W 7yKT7@F>{]alpcEA2$Fd<YcZHJr)|G;?½o0[nOdVF[\Mȶ&(E $La0K:1}>~=h eK[h3n^snCmE : vEd4E!gSxJt#$Eߞ&B:<ĴVNqN N@m}B^ΛH(̟?RsJ㡷7?!R4 YxJqiֻMF=bބh̬e+sAʵsww޸庾}m5M5 &ҏf Ndbđͬŭ[4j[Y6^!ųg,[Q:@ms9҉H=.F3 N -mn#AoS%\]*IG[-, ֞~'IqU8 8M@D {IE4G˙X tG.汏[UX¹eEx_g?9#9X2I RFO҇U :!X)ec[8ڻ:}I\o8dT>z^}Pz }>Z"3UkKiЅ⓵^da tH#1\zn_>GqmZ8oG7o G$b3%0褴#Ub5 *2䎄Ŝ'Noꫯ4zA ,_|&$cܹX,8C{ә \>swvq8nN'@EQD"^Gyx!:͆d3gb6 ҿ*S{wE]Cr^`Fnj ]LO8a<7OްyS5MCN^vW_6朗`8( dblfeuvVDL'P,=-5-\]Q(MoE$=Ɍ0.2I! `8@m^Wf{䑺iVGAfcWt:q/LԵsvC ~JG5+FK GatRZ lEff_N>'=N"o%{d[J?A's2r.ZF{W݄'DbƋe%_iYcjW̐XpB%x;2jzG JUW]58OOO]]]8p6^ذa[n_*W\q lO<X(tv7qwQ3gvNEE`GQ^{5'ihn^}U~m:{` n?o{RO i8#MHK7K9X_IDl}EcKf๫iωѠܜPohsLǐh@7Th%5{RT57Sa4 ۟/c#?;? %(BD9%i0I} WNjʁ''m%=:IGT>r]r4ado5iJj^v<؎#Ѣ?ѠKh7nO+ VͣbEN򄈢Ng+wx{:ОAf-$\=a4Yv o:(v:=C(۬>urJ_@'°l@36E{8^ymG;)"ދeɒ׉_N\)7qs;ɽq8q^eɖbK^.`A, xq ny=:i~mIOf(f,UB)BZ&# D.YEU?ߢcֆ~SRºuw_C"~qVYJ..h??k P(011A2cǎ{nOww7###SRJ vb޽-ٲe˜?Bkk>!###SU|X'!ČA|>ϧ?ioWEMԩS`q$7T_:]]|Ϟ} өadV=` (pjO'~?"/0zGxQnҳ~]CΆιLd}Hhd†"oԤOlx&\ lL _,F>-6E,BѴ&MߴL2g)傚L b; bz-F#iR:]/N\qgDͲ\x1%T|v2{}-5 tךj +:zY %x  |n>9rv%fjnݎ`Okyw xk 'n~'aOdg u]*wڕ|rp8[C$<?O9ub,K<11婲s!۷o?s=7mCCC8i 47gP-[r62OɣE4j;b4o%FՔ"1oE laCnW]^E= O? +oĊ1ŅZ471 " k_Z^?yg2R(x:EQ;i\Yz5Le4lZpY.GaϞ=A6ehhGrAþ}HR ^' Oin[?)NzZ՟ 3-jS8.Ţb¢eI5kR g^޻w5K_9|/Pt]f9}ZߙL|>Omm-W\qPhJ0M~h똦9e7X\\qVӗg{-޾_#Ǫz<!lܸ9|+2ĥJ5@QDYKkoWv>RrX7]gǚQxt"Z`,6W)QQ55{>KMPՁMe"Tٛq-}#'}|ED`P!oWX\uɍ 0yL`"'-C;:'./^~f>D* ^JLߞ#%Nx-舓UUkSױCMУ3 eoah{oCxb(D״%޶];Šɉ*f7yJ؀UUDEʢ?:syǗ !H$~/wK6{<]JW<ԧho{_liiiAUթ4MyOѿkS-Ƶ[ZU7FTElr\w3*I4Mc۶mqqnC @*ގ(&~1%xm7)|M:;)ʔ/ ǣ sm,jrch(^u`23Z5/c+]GU, *HBo csg߂lgٶ)1b=GEMmr. g/Z o%'8rb,8 8 01ڦ&>4mõ0oݴSt~}q OM 5m1"g6^XK1?+P:_{xK6=H*],Oz!КjϲRdl>lۥPgZa ɢ~aj( uuu~o&wq9ϖ7}n뿦oa&f|s t_PUD۶1MOE_noy[@.;粺mEת-RBHe׾~2ůFQ ЮK ày~ Re!T>PU(z5Wt;?:8Ñul]YOlᡧ 1BbK7])g!fzGKb6+XM6RUAec,CFh8سb";xi'dӣLLs/+!ZpP- nRr( [qT6 4li>Xoֲ2lߺ PH=*6%udιf(_~U&ZԬ3v|" nl]Eo6?{?cY;дe5J ah5L2Aj_ MSt ˟E/$!c@B[ڵky[ yϦMxlj','ODCCp|Tm۞*B|ccǎ|_d߾} ,BgW￉wuI`o:B@gsw|+o{f?~r1S-5?ʪ6oL}}x11/폥iߧmeARDn_?=xi}t6.\g'f(¶k9t?=lŖ` ]XW`<&ʐPUX$Lm6(0 #* 2yHeq{4M|?n/| \.FG~P$)p]7[ooo?뺤˄Yo29LJt 5ˮ[sF10 .nݺ` }Zrl\̪bG߹p]#'XG1Xho>r'Q^@ h._$_(xNerVc&DGdj@!֡k>S*D پ(VZ\ *J:Bc}s}Da!l3P\ռ8"_ :> ^k;^krc w(]:.o">Bo6ÿ{ª+H}!=Q>AGJoܝVmWĂ Go@O߅>IgRz2Fju$Ur/um+pYer˪o>ۿr-|[ߚ10?N8\߿gyf^`||Cr)jkkDN_TUNOZ6ŸI)ǧGu$r饗N7\h B| aMˣ{|_>9~uUK4G?ݹg ˑ SC˱3cВ-Ɠ=R#SuF }aL>˦ 5bPj5X~V@(U3!\:cyotú;:ћ^qεdz~8b` mD"mQgEmoeK= "_~ ׬*(O|M 5.]lPFXx13iE9^tÒ EJ˜烧~^ {9wwǏW}vo^݅]]]mRJWn׼5MobeC 8Xwܲrg{/Y;ɯD[U3\??c˷ιLHGO'K[666rS[{~Ζ\ayu!ffe.oz!gu\ݝ %=OyӚ=$n#P9r|ԗ<3Ag qC|ʹ\X:fυBnU+M`K)U0ͬo_)܉"sP7}#'m+EjUhh_E(Lch;_XeYz+y9nִj;:MNt^Lg_ }Wm#dT\kF3pުA ! Ywz,`Nӟ9 ԝ %*vX(P $$ UTbf  ~׻:|+il%wq'hk+/kt.~=<_lٲ7=H,8W4þ Qww7eMnUaIJ,>s}U-W^͝u缭? g(7Svvk8?a) וlW6f3M]=|GP>z%ou:5jqABP]<l Lw(w̗ cy+ |Df<^ 5 ^ɾ?`g#D: ~q"˰Og898  <2:屧zo"!^`5aXuE3Fln<*]ct\ֈj2jxt<\bJx8W`Pܗ=yC#Y zڧ7$PKw٠FzcSUۚ,[>/#y?Nߚ񖷼[ngY7~,0-)弎&ܴi_/Dhk;]( G>§>W5x.=g㿓C~7> ǫfk׮e۶m-X*3{!Dt3oyPR=Pmᇿ|dzLǺ/1:Ex抉0;7gⲞ]OePdL&l2/V݅ kiL_U5juM8A.@Ml̸TM5E' ՒЃ&;8U-G%5 ? !PkճEFC8Uz'TUY3c:VWXa>XdbA( s/'?Ɏ;?sC)%|C²,wbFY]Q_+\ٶmɏ~#:::;c6?_2O>$2|c#~sڶ=p?t ft.mٲW۞R%NR. ߲cj)%c)|r(H9D7_O]\y7>:_2* acff,fy]B4 ౱B"X}LTPt41c=_P10XFƉv|m}IPf˝S)v*j*Ww: }^{ E  Ѳ+g3~*ّ8[J#YeZ[￈+v |ݧ&Aq_`uϙ/T?.kk@'JA5UJz2;X*jr@Eil屖Zj" eYXAlOû|otU[QU 9tͱiUX,F{TEkh^z vOe<})1{G YBqmnp38Z'{`וmWp/zH tv(]+p{<91KL9 VCRJTE;{..zUu*YR !ضPTT*E2IJ,L4MǙ CXF㴴zq7o~}C?,˦я~|eټyWjuB'@Xb't4ES5I _83 T |)O<Ӌ+~wqX/ =cS) ;~X(MVѿxKH3&߲[y L= o hUai:|[Wo;/bmX幠DCj/@ބRzkVX,j ]z}}}'yD8,KPbW/? +SVX,(w].e")%i2<<ڵk*sTd'dݻիW88q} /{n4yI4UxUjR:-W<\!\zDKC=^.nahh [45Fij\c}0f,-)B EӪ5t[ӗ*7Jy+W@ ,C[Rj"PPqz650_4n!PLHOU2 KRߎUɉE#Cz'Tah =訪ຫV䳽IWMguy2Y0[77/ L~y^UMK_ X,TT +*QfoX-J E>7쥻gִ&*R)›mM^L[b\"WHeML۝=qbEB){z3MD1jjjRbYccciRm8μfUU;w[7y6Rx; u@ӣ(yy7?\Ht7Ĵ>3=M1Е3gW2?uӥ\yg H ,Pa,5x_S]k}"UdrIM r2s0<8P mf'ENQ(ݰHD'02UWFG* dž\Z~ucTmoC~>>R *(J)wy.(o?L!߿`TWםF8p}"Л.~!]h9:E!ְlCn7t\FUM`sTh?=}lq&d Ǒ<w"Q3N>JXԠ6ʥ[xMkYG* rg԰o VRzUע N/>@(i> BX ahK7`,Whʜ[ WXaYq|sW5x+Q79o329f, OΐO #! U)Gu2DY(aģ!ְִc}3/f^(C=}|f_،'qF۫^Tnrt2-sel<Ͼþߋ˼,=LUbU+:RJx UtJ f\`4;ms5 k(7`J(:x`}\  U#H)u\O4 R̞~ts jkœLRH 3$,k`_/HH(VKz @0ruO/"aW-?I cY/ȏV;W7 04q.8/lД JS #!8W\ J EmOIO%nW57gӪ/eNLɇDZ*~Bx;AۑRĢaִձ5εٱͫjX'69HgqR~)HU qm۶$(ʲk0i\ x-Iዠ5CS*K5b.}g4# .3Mb{޴z6 vG<;|?[Mk:oĴ TE&Z}خQ!4$5]J8xxt0Ζk{pts8 ٢׫^Uk@?8.Mo0c ƮGO>#wpWu ȖJKt! y7`H']0d[Y!7L./VHhJW -|麊_.~E0> E!^j_L|豮5M;xel]SGmy'IfMg$l@J(L9z2YR@aژU5\qŦ&:φ r6J=ɪQ6oXfPe*X^N !{W~/=6/'* iaWi(EեoYo.ހQ?g=QܬL"XɪwÞ0+rͯ14׵U=grIqxQ~OKQ[Ӽ`ۺbGh2׭unxS**0뷬&5zRinMuanv5{ ~Ra"-*ljmlO9DƆO$' !;0ʂ\kpiڈo_jgp&ծ+XXp/_[qN GS6o/f5NMUQs9s&HeM,EUq†Dvr'rQ+y[UDž`uˆ8M2= mnj 􍜜P>d֋CؾxX'S\T5`ϩg!F[m$XLH Sxx:꪿-S^ã9F "@[݈xx5'b2E#tiͲJ2oN E%[â{~ ՗4s%v~lBK p;g?k5jUjJoZ{c`4U0Gz&/2P8֗⾧NV5RU 6v%iWJ(FsWx+?I/VA,tqdP󋄌2m:kVE더PY,L B2%T]`fh*ŶR^&dq/ƲǺ_Rp+Ek_NgJjPEȄ*G$.VMq˕m[hmIO8>╤Wוر j#^@%ִ<(дcG%Y=lU<2;Rx;N]yI]<6t.;(m} JHǙ&cTfPM[>Ϗ0%14d9gs5|/^vNRBJ~陘=מU _(݃isc( ݆ Xnݲ X6-AߓʕҴDw20c$!P5@Q`% E֥@:czy 2:~Pۯze[嘼00[24;*^Mmw*7ڰj[DrjD}m/p8 [CWQNj4`}sp* cZwU 6'La  G W=Þ?\H6gǭɽе ۰Qbajj?/Fք ]+,mY<{kpuM \r&] g)T:4m]x01CSHL UkkkYvy-<_zK8K^ET5j[an' !|3 #?l39 M̀K)=J.o \I %\י򉙎 ^~#_ftbh1clGZy;[\E(q+Xnغherrco /hGW Ba pX|(*vxl?q;: (B<ロ{g*NGG% Zަ&-ˡ@uTUŲN_ȅ筱%ml[FҙeW1הiX2_oEQf,ת)B9ձHzq 'Bp7[q^"Qjc2|#/W^F8SNƲ0 nE-@p&j6wzGD62nWS]J +wc]'FPJ~S]8Yh1ٳ:_^OKu6DYȕtzdأ)+?QurcѮZ((3} Me"Sd($<9N2SLa455qeqM7q]wcꮲs_u]_ ȻAJg &Y<94"Z {V3tF X [ѱ<aC  (QM Bi6]O>-Yo,ģ >?XV‹a#B]lztN GjmY.' 9$E&ѱESa}yY)m7¾>kʛ_eXgѝ"%j#8osHӦp|FZM5ĮDv҉ZV~&j8xk$E #}PLbpE܂OY`z~E dc#!CòNE?ϲ]rOk =xT$phD)4??}/mmmg_r%<#ep(Z˥ ȼhHJhsi;8m V5Rib0{k^<5 #@QdBp>ugHWBQkgIg'Bpe/]y?Z6b"1z>nYϑ}L2=DvxyXR& CËC'"\}Y'N oJ@zc%MCmB* p A/44Ÿ 縵c"U,1N{Ԋk"iX#)&Q!&[_v";0P"jmlS#i8f(f(f(cXc{Fp&rX#)܂7ugv?B+)b…fFҫW dpp!f Ze G 226$)gJȚ`# fqEQpMعs'k֬9׼q!˾_(.9+؍}9i'`t;2A"fuS-m5]<.Bb^=sZ,ZXJ_vrEhD>ToǑ ^\^tZ ozb 7,?fEUQV7hgkճ'N兀n^KgGM'cr?/m@4tnY)qnϐ{=TCCMDQa:ԺzK-j"VEBSqq2Tok$7+brุ8%K{c!ҙQ+,~Qׯ艱w2ko泿;ƬΝ\!Sdk\TRr?S8l\.ؓ#:ciMMM\wulܸuH$B&AA"qncZjjjWW@y|>8@la.l3希s$3yӘR&JXJl\u)ZE&W4L,jj:ҭ*J`V`*+ɚ>xÌVj<=:3V,$ʼn>lǪZpظj+mM im 5M(Bős࢛7P.?zvv-]B"V/˒23_iCԨ \ 5,@׈pH㍯4j>I L xP߂ 8>qS%:k1gd_8ue#VPzwp]8(|Wv^9}9qt'+dR/JKK ۷o oxwu7nd<!;̱c0 ӽ{RJI:u]r9X,N|ƼʋX,i LาgY.=TN_ʨ8ض8SO{)S]*!V)L:߫rJ/WEQ4|>_:SgVw鏛ͥUUuo&`;. ו g)mbĖh6wքg ɪ RtXؠ!&"604CULq%^6"oze;  "Gz0 M̸mᐁ4h$D,Ϛ$BKVϗ !֕U݌>"^\17IhH4-lZ5ik$ :oL rŬwn]D+# NzUpڂY`(lK .rg˦F6/, by(!U~B`^p xt_/L-u綡gArPS7'M{ Ff|ӫN=( ^Nv'N.5MVX,Zr-L#?{l%Wbz:c$JlZ/0.Z8֗H=)Ƌ`"c2b;^|l~cc#W_}5W_}5]vX ۶ٷowu]~|>O?d+1.?(r9ripb3Msm>H߿jPv5fł^z{{O%|. AtK+k6u[V%BUթ|PߋPMSFtl%p]Sz&kR,z"MoE㺸DS\)Ft2Y']::B>osի߼k\~K ^P7-h:@ 蚗TUSq),w*"떂wgbO~HynɝmRMKVp|~JSg>55fZK0a @ 45p۷D±y b\11B3ȩ}9OS'He&Wp l۱iB PUU/Fna O?}AU›y=4&dh#).lT$W(R4-ozHӴ)}0( S5bw'}O}puۏ|,W)gw>i1"lc ?GQTؔ0TʺͬmDg::'tIȴI/en}/Oeg>\+>e `} ZTuiOKo?{0:9o7ˀRhߊMf7Ȑ/llpkvΖ,ɉi]|w[=Tu1;W 72Awfk!(rTh=!XG.NPM 1ԅXBz5FD^fjÏ=HxO)F/3Oa ЗA%ؾ3ћ :Z$WXpi"U[nU7mM ߅Pu5Dj`u'uE icG'("i!]@qNV5 BU!QLjG0QԐQ:Jy8Ѕ/4M'T<6h +,6r{IFsL 6`Y.؎oǑeK-Kd +gry-_!Ru,JStMV95Tur3RJI6_y"b /bx$׾ s zPUĝ{`h~q+vۋbu'Q3~FQ4 N:7XDfSG85ўDZHض+BFw}\pC?&y}%&_@;u=%Dt[X)Ϳvbbaqz x>UynݼfU-/>f_4BCOHD`6;aL( z,+=E삉k;8ޛIaRUiZ@5t Îeu.!j#_Q-(?yYWXahrf""rJKg&הQg31JQH==WX1[27'Gm׽2zlUɿL۾Ć,{I]Ve9l4Ū0ULGA}"J}"eVJI*[`od"3$d舀qu4\xed&s6 !زf' *c'Oby q]0<<"AA*z\&ΖuC}dkx>H#`pc99x#=g89@cY&tQXIYCk̋nxoޏm-M4[chhZ%Jf4ƼiYd`rb|=/މ0 %fs>89Z}@k lm?ysϟ|:mlo@~u#"catP\AxEISkhK,S)ٶ۹ sA E|i]*3Db^OTXS aM]! s /U7zm\)Q+ەM=~^])(Lš T(IU>씛9*|Cb2ر].9ylƕI<1qt$EGb:钳%[]r:q!oKWR|BaM,)h9,G(s,&Wz]13M$tAc} Ai&u%=}癆fЪA][MS_%jkBsRJr<ng<=prdf *97Tt'_<fbUDJwpQBHd}2L? w{Dz-fS)ž_&&-۱໨o /*x.i?x(S5łUCQ Q!F|`ZG.VܙL{:k[]ΙҠt JYizI0uU@DP SzLWx@pM{[:DuAmH!+Ԅb@S CAWQ]+]3ҹMā&[jr_WyhHwR-kRȰ]}X`=w=k'>WɌ<+#xxǯ:yL{LﯡE4O#O;<Н>J e(m3[dcsN:ReS**Ӊ|6'JI._E,): Nȳ z^؈q5c%&Ig'H璘eRz|+fw}!P jbԷSo 7p[MGgRJN 6Ac8|] ܸioztڹ0w''pgOgs D#:W %?rOQ5ep/-F.[IDAT@ErQOWTBR %<2B`/ {ډ)ԔәnUlLJDS 7ZT ZޏhK\$31^W Secx/.e!Mѽ nDSp\5h0/t|zop!cz/+0ґW@^Xj8G]k;5/2.\=qNKL4NRR(+DK{<'#!=Dg::[M62>%_I:lˎȔ(`;`ZEr,E3OòL,vl\A jc>˟B/1"; (4U'IDkHDkGjczlA5QDGVcݚ:~7\v֡$ϞM=g-?ww:ZS zS J, #t%bDB0j"騱0BUNj,ZHWH-Z89,&$N4*ܲy  omwnƜ';*r& ]BpGPLg6Ѹeot` A[Q P^ ϟW'{&H K56nJR`Qc:Ng_䏎[m¸%+,=šK0g5,M,jP3<_DI$*]+ o0S_Jhak BT_5[:8 ۑ`Pȑ7XI%W"]x-feR(p ( ]5X8NWWnǍ/>A8*pi<,(6&;8 RLtQf5(FZwJt;V*R4K^~a> +̑`s` tEYz'.^(ZCr"`2@QU g+:fМIjD¡vrx¥ysx칐@%޶Ɋ?f,L`ނ5C+E%!;7_ŵoF|)恇Ou2ɺ5u PHC g9 86T 9C^V -B/h¹> {#* ו֤dri8!=5uL|K_, ڀRg)ao/ Tq^o6a#mE$ZUʻ5{+.z/'*̅#秝_V*|XQ 2[Bl~mZf\ iϢx׿\6wELO&kS3c+SVXbOVL !M ֣j(|"WG MHs>݆D\8rI%oZImMvȴVq>۱`q,vbxQ|CoJ;@v[q]ɞ ư&3QnuQhCmd) \*I‘n}l_ ߿yW=;8Dӳ|+W#EAR5WRLe19BrⵁDp}7b^y 30l%646ƜJ=󭗳yC|`p)+" ag8.cM:h`E+2V)E\ș׽u5nE,{w9kN t,)@_ V*΂xMհlXM S_-\%h=-#93o@@hD6-TUQ*QDx}lO(^t<5o{RpD9ם.LndoL:BAEƲ0X M-p0ӆ> dž45ڛvۋTsFXU# ]FqIӼSDM4؄6cвs V3Əž{`s'zT6 O:"x.+"3yTR=JႻ!3K #Y67DZq!3\X$ qS<]ݙwtk26MorUt*# \"&ch[Ĵm~Wvb &FL`ױ}s' 45Vi8Nt'[4X*9''})8aHzm mHU$2~$N2e::~[k= \W{->oۿ seeUIni+e+,1ssUJ 5$%uXw\FۑTj*U5K.qRbǶ_Vq)MJ|3alQxQ02>8u<]yRe7T_B7ݫDWFzp_|"dƿ\Wx_:?jۊ6ܿrUlUuM+7]ꆪj~|΅\b,YQigh*'+U΅]'23*0;6UhܲM{^AY>~UmKI 4ۇ4\a NJ9SbWBYXaiQ›\4j.DvAE#( R"с1i2TsDQCMMUX=qWN4xe𧯂7_ ww@1XtwV oS&T`jȊ'\;i:Bq3xi &{:#23 wz"Q¡#gYYǯHXiX frִ̄L.+\44EU UO_$ o9QSb6˓+Z汤@6RDyr!#͓dU37m_O}|KKضS9I4P`o䫘0dúzCegi~uhoCU5Eqb+LQZ/WrM0*!+p|}7VnnZVX\YI+,RE´IXFɂDe40w9dlD%Ut|ݡ3+ƙj#@ZյU[>j;LG˳02>A4NyP7>BrQ`nB^"re!HjMDzL~}[[hiZ-|spZkW5%]( "ICJM[W?]Tr-ʙ"͏ )gm{BŹLA,*X,ZؠfM. w߈$%a0R282h({&&ݫs5.ȘJ,ۙtuXMSmʶ]3yjg0:Gz8Ճe/,nҵ@n1ss._$ Xp5aB~x=/<r,{?j8Nb')(taD?BN'Mz">E$47Wd~%5'->Bƫy^Sf0S  HVRW_#^No?)[)?MWO^za\*7I**(U&TG6FݗOSLe4T8IR]!! ܾ cC=pGe/4 _a9",R2;5S9h)UtyldנŁqEt)m`K-d&뽦x&1]= nxLG"< d,9UcJr=|0rŰS>B?5Q(`{=3)=!C MnOP'wMP6 ~QSš'ƨJcD)RRH 'ԅↂjC9{(UTi]gmLdؼy߷ohl>8LN λ0S@Cm a#8C+ V- t]O_RJ)H\$`*Y?g";ft +6_O$4m%T3 !WA[߰a\7rѓΘ^UVعʛyh`ʱL};=~Z0-TY)%9>msGJ"O,x(?-9Mv`d^ >7Hn ք Wwk)7fplZ#gx.DƪE rr]Kh"u2I:cR_77or"xBEقm@y8xB2]vt]R=C4]a+;D/QvWq\ W'^WJxnk:uWXaά]~U[ޙxlĴ@,jL-]W.BhK2Y ӳOgit^Z$HgR\淯𬻈^eB%Lq <Ɔd_R2}l8S6nUWs{75tζ]}+XFl >'/oo߯xzwɉL#oݲMtm~&IRÌGiiOjc ( . ;o|يٲ@Oxf5>YP`<м.*@p߫!譐ɚcgKѴl2㘎eG-"Xzl擎i1 $f*~ɉ~sٶAYFgȲ&2m&P? d&tl";߹E`]W"C6k/XdsLepMˡPqt{ {R`p]E8u]S𡐊B!CE4M|_zSEu%ŢH6\W"9N ERWUONOd˄8mXuMF׎ (K7*ϗSy KcmD+LӡXEQ4bQC#~:Wĝl O"g0-g~ڎښ)%lpV;Yj~{<p׋7pMkՓs}9>D*l0< gz׊G{pE2?ӊMN|F4EU@@U̯i'X 4BtlPY{V_Srq)rF!<dP #T7't\Ci~jƏB=?Cn$CS[ʘseMEJ~1C9W +",RҦ"c}۳Hڝ'!ifm¤`qI.oQ(ڌ')ٙ QDo{or͚R{Ѵ9]Qm܅@LΟD&kua&Mrxd~ g-.`cά\_Ghc .6 n*߲oYG&k7/!u)so9t ]Gټɑ`,~t-ZJ-hKR+5MJyPSZ0) :X6k$s߯ʤYjڬ`y# P/@G6%uj zdf;n? :Bskg祷o9",RLt8@]H9+"TEM f楯vzda~z%7:9vj)P(ڨB:SDA:Sh:'LĄD"*J*yJ:kw+|ayO"m+cOX*& .YnbS>,5@6-lkMCrrj(IͿ6NFlWh0HK6f\-AZG&+|107>|`4NsQ9{2d C ÆQ!GӝT%%ڸp_:7[c1s[-#,jX2Q9({5o[(WuYRK&%qbSx0K>?zJCDWy{KФ'0r ǧzA>"?w ֦Q1|e+,=iWڍL'(x]h0A0z)gE1xO2!`b+ލM42_<ǫc+}\7ܣǞp#qv<,4MeٻutU"Kpz9JMM2߈jqWzQ=Ro$UAt4K1T旷֖ -oPemmm_;tc8[;+Ua d U:Gڸj2A6Gܢ sM8 \%D0b|4xxbY16{kPP p"ݫkA6 Tڎ<3>+/=R&,KWn/: q9>DSMjcJFTE\6M׮mFo rq+?ˋ]n{\ʈ{C }쿭S]cw\ S-W_1"!1\SZV|~F7ڟ3Z` #WՖ!!d{%DD좵>>.$$f }1{\,(Tz b>oTWz_#ϝƙKP37;S =܅L#=Hw M!繘Y$l**[#@x7߅ok 6K? ܽ< zT?7)̬ik,?{ ;{ۅ[Ǜ.$/\zDNICͺ;H6zί_g:--'-Hf_^…˫{-&M !viZt+6\CB:]|O*Le>p21*5=Nh ui9>`nOdoyUv+#12 nt9-;41QL?d - U7>rY\%FLn{0@>/K)B9q|N o*<pyI]*hԸeQ 3_F0NՀ]nQHxM|_#O]~/snPe0|j;$d !%oҦJkc{|ʺ+|$TWt]  _('Fo/L۠Bٰ`0@SFqӱ~{ܷuGR gA7O&ۮƼ{>َw$=hc%P{m@+ d!80WWgƧ D# ;KɝM ښĘ/"ʄF$OdU.(Cmc Qן= |,}ON%1|/4) a`ɛF8U?MQ7~WQ$L 㱂n 1g(Iw;n h-EE "Cۤ_ӣtE0?W:aj"&zsPBV\J=̯ Fl $s ۩r4MOGՈ"cmUXӼ <lvP_/pU\x"y-x;e];{sr}:%D%AʌfRBE,QGGQ>Nv̱Q"WpJ^x[HH؃å5Lڥ@CxLTׇq]v)c=R 'r|,h9.VU{Sdi`r\x7ިB%x&R$3|ym! 3XH+ @qȒ,TǬ /T:Wu߿l;`vK=ɑ^9;/%3_"7ճ]^QnG?WTD# mW6~zܑ^4^4PLB8ĮhgT8OWr|eUk[_21PlaihD)C> ;ț6Qzr-L;- M'&LN$ľ-Ut s{+h9 T1iM֓|E/*J0?)@xb` %կ8?k58ԬB xn[r5`#tRۅku^H`":P6?23N "K݇yϣܗm!;JBL6)T 6qT`*2T5CòXДڌeyl_M8)c[^iRvzɣ]9kDUy%ȡ4~[~kp쿑l:*lal &b9 p"ڎٹ+$L~n}Dp@W4Qx`K!sQ (2W8Fޞpvg>S$ fP$Ak縰K'<р]ƧOCkR ls ƀǟE8=dE6e )c3Bl퐐n BuEdUjCIP@"aj"9SjXWc7c1sț1]w`j"L:l&t*UkkhY(V88v'"$IдP+ns]F1ԳsxE]4aQeW_I'(ߑxLŷ;M=7qI.n(-i>頱JPciYS%bp|s.z:IA]-@QT(n_ռ߳!$O tW1jsٝX(GSVb?aP,D\kk¹Z4ч㸽3>$־q(\F016d^;ؤYDm~5,ǂ ǵ'Ipyv 1\)v=>GA`B!$AH  @U%|_܊px&uԙH M8 ,t8 2ny_"Q+=hsZ>W6^8 00C{ Ϸ}ҫ3^# JW%楆 @8v8~f}2=lTM ]bq)lF\F'؆UCܦdGthEƀ Uaب+A~GǀS@;+It]F:㵯<_7m޻m_pS!)>H@Z`d¶\x]5``I[!:O6r=g!!&F&Qkln(ay!m ˢZZ0 &,k:|0X]j]lL,wk'<̹=^'ȸգ@Co9JBC⑄* ) 0A+I-ஃMrdBO}>'ߊ76?t]U3yO6=#hx(@^I)dOlJB%x]8:Aj1&t##|/_=Qp&k!I٬)I*I~q èwj$Ær>RGgZTmtSu=c=Mt[(cτՍNɉvsI-?c 4CTA 02_`ye8& J"UM34 s y!!MV/g.(!!n f'4w,W, L{"=mOB$8^tv :`$]5C/X7fUR<؀QU4hGI`.VMpd Lrs(|soHO xͣ/] | _ld h~` vX#j<IU൴QDž]BKvdQ:8x;xEj=0Mp@ q~CHA4[*!!]"1[`".*Ӗ틹OV퍏lbmFROčr8sC&Ƒ炲nƣxxrmVPU f.ë`X` P4 Z3E<W=px$a;+V0U_Ȫ -!6}$Hst.F 1a+!w>/T!A+-&IXT D, %Ķ``4W ME'dR Ct$`Fu>誂x}U>2>V7pgvH޲MTj~ҦģbG)f S) E0E_Yx+͚ Ԣ1_}H =)蝧V gdv83[ ZH&4Շ!!]&%` @7 RI=TtM,*n9!lc"95VO'bM62PG&7y,D􌠑z`\1zzB< O@W ƀG5/Wm8ubcEI_zt4#ޮ1km'= &?vHH !ģi.KuYD˸uSbcHH;E P0=}R+ FNnX&6}%=q48 q=ԬUuSML8ԉv=wh\h9v We/TV 0w]@D)Mjz D.K+UܘL#_Sşy E"1UOKAk=! c[o?<=Zeo}kE{Q) /BH,x[0Rӹ C0!lG8y<~rwDT7kLd7W|!脱 mڃiZ&c:0W@E l]+vN6[D*t1L{${3?&LO%!IDf NMA[Pv]*(-P|y&I"_w+mb GuRz  c-ڢ0ڹnBO>`GC] P%ϣV$7l/ : Z0x*1 Cy55UWKek߬Epr(;+Kagg@#k{oxa5mT&z^'$v‹|boc#1|_>CoHHCr[wg HkL ur+S{{zHoR !_~31HI}I豕ռǞݫLAOD,xGw4BS4ȂXY5P((~V$ ;CX*"4|"l0i2ۿN|}@1L0A:"#)f2%<ˁ+Jҹ!W W%)p[<ҐCHܸPHuqe>B05,7$ʘPN LboJL bilGr1O@I6b9.oyBOwt؎5pS< @D @8H}r 354'>tyu}& *H=[%6)cz8 43WԖ'@ЂHͷ}!!$L .eX166JE;OT~ ԄC$f-Tb?\p]onc#12(e9moy^2Y`stzϻW9|0-}DXv\ #@MU{nJ=+xMõp8׮LqrZsh Ӿ3σCvQU@fP[HGS0 Bɤ_S<ڐ&`42dnylnHfPn[Gny,r\8n$X@Rk+fFpx|wGe)R5p$c ~VvąxB\Qr^H"D50A1kk; $N|2hƛS5P]q> 俆x kK!!(W@LFZcBq8dY'ڮ CYw"5,(ao=k<̣L@:A%O( I!!*MbuvַŪێ!uhB(̣pj"bNՄ],&FzJ^c.'nn31P [?V$]x 00d,V=4^\kܘN%V$ԭ%Z1 _0A)n@:ci/(iu( aև榣՚FGMCx?n2\iM0T20n>ɿa l TY5W\+\LՙXJ@b߾FFuX\} 9l:j: ՅԖ1M 9=Hj=%v3Q:fy߿n!(Em1M:NՀ#!>$U..1&[Ͻ #琐 L s^C Ԉw:ݠCXF\y'9r(l:*L؎ Eo*D$ikA88*HEmÇ>v]S pcݚ11EV*1@WipU\@UTZ @-be. q3X&Wdqӱskv /&Ga+X*Vr 5C4N@KơD4Ȫ g,vՀUȗ`,zj.X[\$ 9Fx,Y1+^q&xLO&6Cd9s/.nZ0%y%I*eB6² 6K(V劍KW8z85DSk>?q]hyϿw-:P ^g_3/̵-Sσ]1`W TWk&D" H8ƚЇI&fH$Kpj&t,v@m9Ԗ]E.W$~ Kn*E#"czOث9ێaa$t <=S_Zs5NAg;dž.qՃ[8c G=*M2|ZN˗в]<'q+)c ` =0CQ$81W0=.]|Y,p,,$;yR 0Y6 ײ끉T/0th+<_ٷo:9!00d4Jwph.mZCB:f8@UW3lD4=\+19q4 I" eyDWEX3-ܼ<*g ԉa6xW]m0 df ~D*,p[|(exҀj8Tm,>#B ͉,y7L߈_ͯ %Eel }!'x٦Qۅ\Xwua!I#([Ə|1=/NH CnH . MnP@Ȗ uRF h~3IC[b90MjX(~v4=G\i{szɞ>^44U2 1 .$& ۮ]4ypyѢeŗ`Opos--0 J!`Qws \)[p`s~׿)|Q,;v58׼9Lz#=,вXUk"8mދo !CM2-?8} 2Lj-&D8уRTn䏦BsvQ5FuHMm~@)ãO^;@[FGbP}הz0, ]Q=I}oQ%'Lwhx$`.TQ,vBBUSP4Pd :U@X3wM^wapz?ŵEiA]DD|}e{uzvl L{aܘ+#_4Q(`q(t])8r(;n;rz &bQ'L m]T"j.kRˢY͋ш"&e`x2=B$, @j;UFRqaGR@:At| s?PO{q`TD0 0ptFH0QZL$$#'em+m"٢#= "TR&X52U4E cWjCQn.c}4UGDrtF)Zߨ@q\cCOg@0{Б KWaD 'tC.΃ݖkc3/ö=hּt]}xiGNdZ\q'ՀTHEti\-//@&7>9<<Vj[[Z Ɓ< ,^9:SđCizl&C&a`hT(颇`Pm(pǭQƒ1l_Ba|4+ ji!٣|TW)rpB[MIi47_;ty˒h$b?Rr >kl  5':m+:sroBZۅtF"+`5ǧv9was9Tňry`S?EJ{>bkG%[WF\ђ7ϿK8 UHH#>dx5)./r!!A؎g -N/>SH80)ѻ﫦ʛ:+tde{X U21.NXF& ێ 4o1(`? Q=Ee1|aeG4Ε?$RHpռ;!jx3_>TI,LO%: dp$0*ƤV*{p2H^&L !,][-5%)eZHo(M8">\S)Z 0~AppFrw*&'qe$RS{o&\f$ci"^,ۀ,7W(c0]Q-UVɗeCB xO%].O28]D9 ƀ "(do& A:JH&Ijط%-L{5bMba~q/$PUcSn^5c3}yđC8)dzḃUxţ h@a&E$h](T4u1Dٽ!]R;Y"ن@t-5@ScjW}1C?ij(tzdɰEisNADWӺEDKg.os10ԬhE|ؗ)37(k,qk@D0/M|.eCh.W(pDU:x):$!NoL x{|Q c ]< t:U&>~IFdS-Yŀ~M03p1<܍`xeTSB q J)Z{r>z[eENG7-A$4nɵR$Mfp`Ȟ$L  )e&9,8N9&0" Dyl_zHCm2,0 GMM+7F7w7Gg?7mtY 4Ofo9YCTO0piuWg;JP N2u" X2],q e@=DFݒI)d|DJh Ce~z)VK0y VC%+pKFP(L>;'%厥M5՟vvq3E,-v<*ƺ FP#؎|UM# 6[č+$:Ka.^F1;}V`3"UJ]y)@ߌM6ڊ"!w֗K+Uq$c@j _ı(fޛn8.gsp,ք// #k?`kȣ!8f$rUbuj>a'B% /z0'$rGEz翾N6_Z /+V#L 6e= e`5yE$&B:g5oTely`5@ !8v8r\a%b+DTr@vuQg4[.G6)~u(ex<^ar"`=g`=Ń$ 6x#D,IApD;Oh#()3Z``/L@Ep@+!B}T%DQ iIњXwm%6-t,!]R f#[.DsSILOdžt Q]I+e Nh%o? 7#[<σBK `eg0Q&m+l+y ! 0eu2`Р1j^&H8uP0iS辖XtO`9ESKE=g(kJ~;MNMo 1?J2!%Ro > 35c5?'EW#ƀ Wyu|#'0 *ci,Tt^R TR zT<@'f!0;DеOxN)FAp `HKPWģ^^`dI9[a!ۼrQMETP21d|p|LI33\Oh.M~3ƀ@B  nc]d,Ւ߃bvG#s =#&5 8p7.'lRdbRHX.pf$t VM(HOMG&|u!e Ѣ`v1<ߙ7 [J 5HQG EZ6[8v BF 762Yw'OEAXn6Ro![ò\>DW2l)dIڴ:p;Q"#inbB^0oz .eagĭW5E N+sHg! U8 2`!QwM%Gy( 㗀;Jt"锖-D?̄tP ؅pOqeo@i8|XBy!1+#@f$ᤓ 3"*QuHޯ8F&߻`8\Vo0t"/`ku".pTc ̷w=g(PSC]/GykfU2b'*dY]q<%`CW$|߫1CՁt #fYkY*MV](ѽ5U I- a00L0ĥe n DJF2 8_ G2nl"6v`X˃f+f6۵oREfzA0ƆfhTQ"8*P%$áL@P%{ \-p9h>I-'sW`2́:2KQ:cJ"HIC I2AD(BSʐE"r)r(e @%C**mLl6~C0=*+tu(jV*'"i?Wby|ߎaW8|4ůr\ ~C@RzoQo(u % 1|B ,sx; 8.O\M6=Ưz8ALaDJ|łELtSdIf(jkIDJCeww߻!$4$Z58g/-\!}G4g44[A@MX"@X@,mZir=>ӏ^1ZFL!W<υ >HE;8l誸T4PB+DW rgmX.0++"!xP[pj,㒥3k$*;Q?ZPv #,V~A7I hfz e/j=cvK"d(UiF8 ޒmFv],O/@$B) n?:}^{}0FDWK'xԃ ޭ]"P'N||)D*`p [QezQ|]- {xY ׹?BTTM⯿N9yLWGv,IQ`]&Sew>p* & 1 _ _7 -ȇN2REJӐM`]پ ( 4'Fa_7cJ7k]UgLq'7U"\͛X 9P@04٤ _2Ϯ4ECWG._.,%C<: 鈂oy7;ԟ:|}'$"Vy$&RWtm-M1Aű:TQ  h?79АYR'Z sd.Cv Eż% n%^hW& "*pdW$@"ud")VFx4 EV`o`n$AY,)p8n hJ }ytDϽ8n?uVj 5* HG4K1Wq~J*O8 HPFv"?JV`{@k^D6ϑc@i{3FƉRQ5]XNW ,f؆ e@Eiϸ1~!G!}?d:}ƶb=ILd$ ^̶͜zH,񂃿媃% 'FG&HDUbqmE F$:0%$}?׺ASt(KDÍH` X*3)s %T;1gs=?ZLRQ H=DZ=~Be.w'ɤogqj4sd `J?QdI`<铎a4Sx`$FWףYǷ},;N ہC CG."6/ ejH5\JLBPx+G3~L>`X ˁ_5)*Zpa:OΔw   v,;,ɈGȗWޏ1 oF!@m aM9}/ NzTq~=σ~ʰpu!!UyFFpy$$>s{-7mngם}h#QQP7$,Vԓ01GB6@}3\G,olZoJFyِp\+XǓ!!- !mNQP&ПC Gxg]Jxj Wp(cX.;"jxfH7J*8|g Ka 5BxXKP]d)(۸XWU&FUh_{(~RڦMB6L"B +;5$ԣ8cD6W( oGh0c`8wqB !{00dHdC@X^W3CBLf`l[3F@@K ~2 L /` ro#T,6zJUTOS,I825t9ӥ SеSd{]1Q 1Dg.$MA"2<\᧌ tMϯ`;p%j\Lw?x|>~v|:-pJ=ύq@+R:91Mp&~BBQe`27&h@(Q^I: 5bZ8Pc7ۮ?hY]c%P*7O2XZ3m-Ki < Ql8d& \[3DvK2d(q e,RKn''ʆe$0IB@~`1#UqlrחIN||AC sTMo?0,Ip[L^M{8BB$#I+6waS1Ȓ;.ǥPtd {VP$;&o ?U|%|RyÅՉi`?!d#МLYqsgssjX.0l `<;4E9Rn pmX*S8.X0x /ز>ԡrs?yd#)! ^*l|~\b  n~~1D"G9՚(1mMnN"H?&LĐkfEf"W'!CSۏ૘LADāQ!'))%:O: S,ɕ%d֘ТUC&s1*f9|#(m\K58w`"t|ƹH*0H{x"&b4/c16_hmе]vkm ;z} 8[R-̗-\/XV0Ս=Ɠk .0_mrq q MFDKFT' XiPJP$"_ѥu6p'0A!I 5Kſ}ok emH:>Lť.͕O^Mio (T#A*7[68@*)kJbHNtlh5$0W$p,̌6 _MeWWLR[)GQ%[وG4LR(.KxL_e(M&]GU٧lBU/NDPe  |mw6B"(ךG1te Nv>H81ʼnq2Lkš+eZ}-naZdj\)n 9 O>b]\/ ωu\ s?|h A,Ra`h 3n#6!!"2TAuHv-k !ûp=`nHMbCcaԻу82ɆJ ŀ֔=hOuH.c$%J8C@A21v\C@<,M<3dc_x67EUR2'u00޼vP'f/w{ J~of+}}q]$ idP`hMy =BA acb=o: nCˣ4Lp}?P5qTI]m: {+&ID5-3KŝLRZ[l…?K/u].G&x|ƛ{.h ,lz\ρ"R-MNxJogzr彷w)ÕU/7$E_# 6xj\pdxT`:j(20i"-Lp .*&w]W:RSgn a3. :O:0OQs2~n07T4Q6XScb PFoI"LJgc2h^H)}6eJAҳp\`ap8A.|ѻ,I̥ (,W$EK&jǯn`"(_%|?cvF x$V]υe[h۟p+$TE%\ocg^vZQsKU|J_\ӳe̕bu"k2O_u9_=e s]VF. DI4ZegH<ᒉ狳Y{i9xzNv|l!I,prBS=w)WU]=T,:W 嚅HNMj`c O̔=EPՁlbK#6o>,IMɡagj`2UE:# F" ¥UTM&]w<+¥d'X)x ^+\ g5vy@70Gߌ;dɃiWme͘0aQ0z5Ë !!A !ڰ !F"ŅkYېAl3FjҦsMX ʀ:ڣ2iެH,4"JH1J5I9I! ,UlL:1|#LL[=Ɠ r۵0L_T,b%5z`jsU`43bgo U킲M: @zm&1+7?yϿThoHJv H6>uoE7x="G|=CY6y`0],Kpz J ˅p(׀qd ]4oD]DTG& cX١IXdmhxqw^[|@,hldžgq\ l7YUPF!QYh6~zr ZP; @×.K/^*lm|!H;B2D`>u WVB/ ~'phT\7UZ7k/~Gq8ߩ[(.g>?vga^#@KK<{m\||?ɯMdu6Lȩd&¥XX?{rwveRm?d"02ff aCȆRzgE}^+v YRa"]scra9,Q^TƦR:naҜ]Ǧ|FӘ].j AY fL2<{o;iՁQ]X&K=ghX $k嘰lQ}x#ZH—'_^rhGZ67r/Ka -TtlHu2y,,sܮD2z1|*;X(Ùyߏ}V+8%2V+$%7Qe ^__c/]JBoi#\ _"esÔP&Ǖ/[oy=n;&6]"mD('27NP$Cu)G Q'c>%#c J7N{B+QUqT1,zlspirqMBns0Yv_Frh=GC9~lb៟|\`ɤX x| A|\Vx52RJmǥ3SwOD<BSuvSZz IBv5Á#q%KD9cl1},E7m{ pc.dwUǩ\"  kGFd6 U55B5~#Vn?t:1FQ6 ZBS48,[lHEͬ"|NKA"2<0m_xnx=aD\?W`Bs ihDVB~+E6LIaHCm1_Bz(󩨚qwL>W,"._}_shQ>{(lgWY\+m?o+27M\ j;z~q_+xG^ N/WgY6;gk?Z|g< c\021$Z?ذOvݻ>NE"]TDaOwHt ImA,ߨ B9ȗ (۰ J T'M QfH*%2ۮ׹p,iXcԆG:.I2"Z vhQ=^R셕.{OG_ZO|<-:S+n?rQ&G3>q/.WAHr q`aa(]Yt %*_/1<{irz/al{Qs1`̗\Y [_vh67 "oH CF矱ϔ,q]j-t FKL˭"z~IRY6Pnr$# ̖ Vm @TSGQHH8'TMU0i(^]E͇3U)U c=A*uX:s&*zܗ(Ume0&fep(~K?>+T8>f;".iȝ]7ae *Hmǡ-Ee~i5 iH!GF@`\k-Ul.#ѨTHwjp?y·^ju^QMWW ̸*PA]]NM^fI2/⇾Nk2~@M }CW$ ludι\43q|]ݑ1`+ BC֨'֜%Twnh?6?R񦔅cB ytʂpYwHH'XOpIۿp_ 0eo}Hh2~F)E۾SEڶxbX%w&>4n= <3[7xh28o@XMg̍JHdMkY͂S|!)2d C|r3U1x g~߈8& weM٭z?g_<ۺ^?7)*&p~MWx5ܥ2JAsk5}+uW7?wq5/3( < ,yk% PRer9:_eB[5b?qމma.MPKrgR7Xo1P.?v.jC1t*ėy( [B:Fd(9~TG=j&7tDKO> JzU#hSd|MI"b$h" SDl2jqyl} T:ӣeg=kI c `X5V %\;d4CM*AȒ UQazp +Jn,_rqm`c宽e\;x$Qex82U( O K Uqp %a䖣ȝ<b[S?`-R&PY/<3_օv8s# .= °/|Qm}^BgٸKίϷŊEFh.*"*|W}2>̬w,Wx+x x2߰p|+Nq˫?~o߰GQ8y"^JMT{F&v.jtgF<& pz0(I$"mG -mCmzx5TR%L暫ɚ1ZG: eE> aaM&xĵU^um<`{u"/x_"?XWmϠj _ 4WVT)a7J*}q6P @7*|w5 @ڮ5)'[Řsm CHwuTel\Cv?& =T@te4֚ Ys?/O}׺x£tbU\Ʋx\[#3 S%TkVbQk[E*IA[ M?cfVqyVga;ג6<~߮`˫͇^nYBz^UPFQ3U,c;ZDXg9b~un>pp=s?|}#7#d'>CEˆƆP'._5un?ȷ" DG3bgQ[_J@8G:PUL UkjE(_EFCV(I$˘zv%cK/W_;;zMm OH4׼]?MG혽xaLWcp(7"KG? H2X#4FBFAkn6?J&P66HBxbfWWWV?'-!!4~/(Wgm]Z& Ej؝́DH [BB D{Jףp\n@|}y|O~ -}or l,T pcv?ʕDl7McH ܮGS Vt&o0=UPKjޟZC6dI@ dMh޷Ï/}D,Pe$ QQ Э*Ff^+8:uS#*"mF2FAǵqiX 4lJ%"lkIףxK{z ?1rla?&wQMF^u5mIUϚ̻^?i݋K I$+nCN/>|pC@.w.{;_\ KbΛ0rQ6I;E0y͸'ᵨl>}{-moW9,ǎ-PT~OǏOVp*VOy}>@Owr0_hfD'2gz [{܆^P1b%00d҆W=1) ^[6sCBZ,Op(`8 m^cEL҃n>?֌t Uʐ%i}#Q xqv=yu5ɰ0ƚ6Ū_gR68o7(VR̵tcqd '!G5㨘J|(DBj;҆ז>F7rB[MEVPeH>&qmv ]E,lxU=c UW_ji7Q*]5yլ̕RZmRC5jteYL OH,@ͪja5x:!PXG^k?Z։97l׫yKs%?`bA4=ٲg9 D@$a(H)ٳ\}x_.˸7;m )H]';~}ɃMP/ wzBę|o䑃?|C+ϼ5cY3ĢUDRbnL48 &+|SWM 5֟>_fD4`4ݷi! 2!6)n& u.P$ 3<zӢ/1PE45oܶ~pͲ6!-w͜!3\6k#Q'b,Π1UFjdXZr خr0\/c/b)_R{OT g-2(n= [LueM|GH7}{g Rk=NX2r̓G'rl+B:vʼn8 <>,\{_% 8q CO?@:G1NN(jkscBv7L{2m(CR|Cbf!g|S(i6$}LZP$m_4r-X*B2sIDBD!0X k(T",Խ1,DŽ,&Y*^$*FLIO@"^B4EHry+'\~}gOf+]9\~wm;¥YBk#N Z{LW/,lb'"KPcL!{!Dsrv$F0VM? ,`0v @+V0go,_UqW' /~ ^M~pC=}JyԡAA%c<7͵ `2(WOkp,vd}m '8Pش*L iML6ҼM>FZvJ]_1 .'3&4/yz9E֡LF]](_SGqt"UſSH# ƀ3WgȳZ ̀z>'/$C'mH1;sXtC)^ @w&kDj" H7mƅb0=࿕9 J=*UjyXFP1mK~IOO!4BW#E.1,JqSAe ^-]oS'BBvT00d.kj=Z6:*R1RA)fC6ASe~bDt~DWXfG&RcvySQs71/#i&Zm9.7(X[\:4=?Kh*9q@LWKpd< uQ6,,ȗ ueHj lR_oFqųC;M\Ob2{hGk*\bhs$#Ic$5D$#v"!"IX[Ri]kxp=9|+q Un:-}鿙/c@5P|"W >ocHʹ(][]nS2@RdȚ=Dl<("ARdxvQHWƀ2o˫bS'wMǏj*$>U%Hk1HA$ lMU7dA$PJ?XSЭRl75^v̬x,AGH '4j l׸B2pxlptWm>w}+`:\GQo;^du.5oCv'#( ڣ 7ATc0F"k,%Ɛvf/vNl*K쉃~|V_gz:j$_G1y-bWM*CE'5u#3lrඞnX:X4^Bfvx*W!|/>g>EX q|>]I~F{,PTBF| i(W8.Z R*+\6~rAaCVL=F_Z(qow~"4'j6/_/Džl eF2bU"*e]HO׊DBHd3u]ʺh N@"h-&~'/0 Ej ] bbzoz%B0#bn 7Q1MGCkd@"d}DFSՓ?,m̗ U֐;]GQF ?úDGF1 zp=k_iE,"aГ>"fUP6e8ymƀ TM_> $c*"Q3_/«k?<lrn }G/ GDUpUJ=?o)MO! A蠔RjZ.,aenRUX ZpA|/}HI K0u?0y ~7Wa P2gwf"q0Y_\,:j"fr.CFD!MQMHTj2I- cF1~ͣ s+,'@FC$Ed.o)|C'R6Zå-e\](#_`;t-H LR-(6C$Mc$ËWXM~0UsN_]rmrWKH !X& e?|; '41vDK0m)cX]UgBւI@ |dAm~䷌ϱOB(RVaՐ h4"ȼ^5(MCm'ZV5~F0aNVJ:oִ~wu]IwDi|Tj& !yߣ{֓I|ZOl# ;B.G-ds\id^w}Q糍JsY|#QZ]nP\SckNjd hM)PQ&x$Ȧ]f )i)XuK縲4{d=ỗ٭5XpS{QXݪrpD)y` }.<:@1)4PN",dbK9 ZK9~;=ōr˱~8iW17Z:Af*2lCv l>wϲS (ddf19y<^=I!.#ȥ|Gr?uENգ=tjaTk44vԷ4v*:A Bz`FRt?.+pi J3ۣt%Z/>,*=Ha쌬$K9pi6bÑ* !]ÑtZE >uݴP(RR!oǾt"?|7R5F'1lV6U%/=˔ ׅ˟&'| GH4A7u7wsxX.̰PH@`FCڇXRޅgZ*V.;Vn[$Ƚߙ3E9|nЌvz*;:pZq&eh:]7묨`ѥB|Qd&ޮlCSLFj7s䰑 #I{O9d}tVH4[u6k!Jk.e=>RN}ۑ`y%x|D[ *]\>W{^UjGg7VFjnAiHHI.'-(f}f-x=JYcc-͑.2D:GkD+E5^o#{XT/WoQVzb~|~ec͝^FI`9/|˃//O჏s}t B#9?NF9W iRR˥4wϥkCy_/hXgG>e 5 xzg̿bax/=+(-_Z>+zmsx˫8ҋFhFčfkXN1#\j)ZY(y7`a)Sї>'QcAEct1,f} =?,(dRx$DFr"TFBNUxZ 000s,%f*R Tخr+8b=^?VfvyK5.W6yN[5ʍZ̸M1v] o+YlܻpY!IfBΧqYe=r3iPHD 5B\**6ϬW'oN ٌr1.yd9#3%eD171><)K{W* _rZNN=T!A(WRɦ\\G$6íj 5AS|a\bs#װHZiW}TIHW}es $K[TD=RR--Q ]f'֪\ߪssf5dR Pv&p\3iS13rL%rYy,}):ƀ__H\Au(e܎^3n%D?!Lv /g"6}O݁gנvq/q~*Un<,O~<gܹz;+rJ!xK⛿yeʉKgqt: cEY VVfH4'B:AWz1u!M-Y4kEx͚~AnqO=?mOxJt|5Tױb{bhAl$gbY7/N- } -^LleO81f$i}xf+"UVںͶRk1+^|+K#V8u0Z(׃Ëޘ6*aU^y,wFX+lTCnlXBr$CO7ECS)9I^#t}/-g$/vּ޿|#>{k^/o촌FT{1c$KFWoZҋ^xB HB |r4\v8i_3r?D8C1s>GhW\>Bgu+RmO]#oWG]gvܻf3.rX=4V-$4j4"{2CڕS+u2Q^]/<'{o0>>jAc>2Ս25!_ ԣ\~}<x<3 sGPoШLõ 6nr&7~;WoFuL#9)xy^ąE-SJk o{NZfA#T¨Q[\4ZfvW;8lMqоQkk #4j˹D6ݦwkzSc=.ѽpGJ1#<ޯ#wR)xK6{Fm?8R4{Ziߌ,_5{HxFRRon(BJIksNj>@zgu)5|h-~2yN(nMq54ˆH"i>WV*\ E*)!^#M=[l$y ף:,VMԕ}):vJ^R!~,Nً>yZJjQs U;#DMרm7Bl37x^5-wa\9{/@hz>zkvfr)֌8^r]RZοß> u$y]Oo~1:m& lm&weX݄Ll6릆1uv0.؈>`eLv=piA:vخs}f-`Fq "j#ۈh9Rn:F|G9Wf2.Ŕbd7,S\,7 Y!IEHR~'Z=ZuOiV2:eJy:) 2. %S?[0KYyQ^ީ^4{~1t=]+Ҁ8 ?gm@R tQ%a&k^~\X3O1#3bR5Dܿ!Z) "TiDTCc!ai)VwةC|"t+3j~r&DJAʕx$9F5-\MEQoHVjk኏mŅ#dy5- h?6ZZ٬ySbMC.7ṲQRĆ1ބxZ8mle;R.#IBYl6vQ,DThi:M֑0RpN3Ƌqi>̜H ={hhWfZ QüAO>|ϛnW$1EmC@ώ_jΏUh+oX~/g&peߜ D㺓 WZkfo);qjDj3_%wC̵,kuλRFBNKP}eFΆ?ʔ]c, 2Qd@gb'm'@w;ڸ0) ~U~sw=;li)ѓTЋXe\W"p9M D8;hʑP5kFwWB}Fz %]]]֎`fƛ40aBq 8cm:\G0H{] |M'7*TQS $#Hk+ǯ{swv)7Lb:3}פ3.\ Y8Åf3Ҹ$r;O]6cij҅jӪ<}k"بNd `_@sfAtfM[Ր?>Ɵ_f)6>,yeW(5ߺoc Y幓[2d9!hMrh.OJCfCP iѺHt+@hn .^+ V?cX s=dRO1 s2)tY65 pD+{1N;zo"WW#Roq~aB|'wM9$'O_?ribOQ]i +Y(fHFcW7N0R66*lָ^ZklTYߩQԂc趚x}()LőbDf%!<-5407i{/BzoY߮6[T<PkDH+BnOܡBjOL>E)zRd|FsT^#eg)MTj!vz%PL;#ncM_Q~zJ5̩YODi5tڰ'{.Cidީa”-|#(A8|CF!nrhId'/LBCȤ#m7N_hgͺ>ʤWHRHYNu_Qo#`Zc=PQ;5ƞn#f[ݺIUZGG9O8dV$Lm4e4vKS ")Six9 nӐqxz2fҹ\3K3r8 iK}f`r!aRc}rlKqLH lBV mڕ\I5rz5hȥ.gA6 !;\)xlBy/;J2Af>(osm %;C` վ v|nvq$JCf󐉷|\G2>bA"v`'/=X`?L, &6PZ^i mBY2V PzhM\A7g3y˥Kir3VtMÕs{rKIc9{B9&!sz,GHOvGb9|ѤMFu"]39s}V6X:r]Jif iRSO/Vnpٶ+CNGM-4m+Za ;} L$lsN.GDϐYl}(b^ Y4+XL5 5*]fҤ\v-4΄>d={ƿ#Kf]1l6xvs3k yg|򩵞0ơF Ibs"ǞXA UY.]ڝ2Zqi\1581Pq}j F|1E>ުl؅gnN<0=Oe+!豜P9gD'7*V2ush_ۤң$} ;ulV42^mL Rt:4wMy:#SXCeԮS˅qV pr${ gW+dlW_0{b6Dʬ)΀"`2 쉚oT^үpƿ9O >[p0'%yRfzSQ2Om]1Fie#(lJ#4s(0k[#h^d_dS|zelj[0u$3#g#.f. 2m)[39xy:ZNXԍmWJ9 _;zCA.r߅:&Jr:fJ!]B`vJ`4dQXo-~lbYSzlJCL=@loهrͦN3gnV2 YW¶LEah"ɦ.e<#$?[+_1=ygr &lMc9aHeXv+ez](e;4",N}a˘4Bu4g8F}V@43}-N"ez: ق'qrPA1PЅ #ҢIƿe?uSoN<̼a ֮b^t5Z}zGb9jd3oq(Wa}wV)E7fĩw:L/eU_>!n(,Ay22Gex"6m ەglh`c*wY1au۶F违,3v69!<ۛeH#װ@V2,-uSnX\x2,պ)L7i[,6eX5A-Qԏ-{taѦ[@7MeҤ{FmH5L7E;wXzGIٮ Pʔqz)X2 zeⅼMϛ^flr0v*V,b{yk|K/ʵ#me9![avs.ln.æMZ2ߵ^z˰qڶR|Ga9( +[M.z!&<&'qr Bnct8f5- Zy ۶!lPKՉD4u]gωhXE!4xu_ָW٬CGJQј̡rXqy؋rbcPִfP]4b(ML.5FHC#o ,Qs=P .[Bp2?Ou^5DۖL !(4Hq '0Kf98;x)z!aض)Lb:Foy~ʿ;%@jߍp%{o WRS_%>W|:b#ʑy+bJ l%K)/O|uSk2t]tpmc98Zښ{-|Z&w^&0JJk\9 3Ki `1aSÐ0D>=kK|"F!T`Qʐχ)>uƋB6x?>Ͽ^XaɋZH<:ve4' 0w!11òtTWFH:֎4qud\3VlJC # h;BFOF9~~=jϳ[|q`Ohcw8L){Dns,|]ѨFYs^v{ ͓&1yﺹl;N3)~z1~#BgPe0ێTCmWt87>NTscw֜5<f8?̱]<59o)p=rylG_`A(Żk{#!zo;~=XmX8:`ɆԶv9GiP=W6|gL^Nn|7/w+cGk"!Z\ó3=YwlxVS6u2JԼƋxAJ#͍LƋBW]v c)D|snߩdٵ"!kJFf_{]O@F(ƿeHi2H:aJ;5-lw=z~}z:2.#[$8: zX{Ufs}\s{f]:}{c9?F9.mq_ԋB>P+ ~;(Әmљ^:c/wϹ)@;-=7ux4}zO'{wȹ %~˫ӷ;0*}Y|Qa>tPҚ7igON'[y'ꜛopυ:jX,G7c9^rb}fza;o'qc8{~la k쩛Vrp*5#8m8=~׺}$뵿k{nsw9%oC{ߒ?T^Mvpx%Ab^h Br?;F' E^l}b ;c̱BFCm";t[^J:X4?Km-0(ɵ/T8eLz;]I6~HYE?9!X,3pcu7龑EdZ,VDʹ8)t*Ke4ƾOܾ}}Ϣ=ǷqD.e"b[+9-qU}k[>Z"2(PR򽳻\t'מT MM8w iq:jRkQX=!hָCCa9ǪOy :|s6*+ߴ"?ܑH~S|WKCx8pJ9e(d.,0F]Y,(WGI˞UEfsA/*cֶk;tIBݚLRY#;|:.G/;7yuOEzwngG~T54|>_wXQ[ 4/9NK3_tdk +Cu."K|ؙd#<*˜i ,:*]QѴ"f[;<)a B0hZ !ZK /Fk^8Qˆ_Kxe}2NR(7G|T'e\ c^'_9./A1aV(cdw[]MuZwz{DvAgXXlb^ri({ӆRƉxJŝ,#P̍L׷8*;XXP!sFZZ3ó5AڥZd.XykW]?y{'^k[#E.juZon}ouyEa<Py>y ιhlb\Wnfzok9~0z5$ԩ&4 PqGQIөH -3&?Fk |,ap]aL & }O>6o;Z(go-p؞yGkX߶)$K|!> s2R.-g '7W|sm"mJ9TgQU[y޵!;b_+Vx>_x.]z"Hf^MPeDHLG:<X5AOJ wyMc=D5JTm0YfO%Z oo|+|֛I;a竓2&l +7΋`73N?c__ހT>"7\4[*jk|F,Fpsm8w`0c9(AdD?C#?=(D[o P58}YQhBgqT >zMJD\>_ u{ NM~zs˻ܥΨ,EuK/joJ&u{*_RH8/olFyPlgSqy]&MV+ZtK϶_5~w4_Ӈ6QStr2 tWiyErJ9|n-+e!LF,ИS,1%SgIor +Nն/?` Uj︽م6(7w7yBfJ3u=~䈸Wٵ~g'B_[7F0vDw˼5zgq/vr$/ml.XO0m[?4QdI(ig\g"ۡd#ca0U,݀> <xAhՆK8XMݢ]/.|mbCk QCA͏O7D+}ܷ |@k^,"ͽyOu wh~]uޛAӱE<`co+7}|/ՑҚƙ3;e8 eFbwf9clWL?t0_d2VC!e?!/G{FӫEv'!Zj$PA|[ Bm;(a F6@,!w3Hv/&'}c6DϽ++F}-x"5g XrP2=5C&Rpkcoe: Xr *娘` -|IѺ~nHM8#u!PڼCW Ha uD=/&}œ Xur>wggG6.( ^+s(oV?3ZS ?L@ Pkn[ra $ [Hi2KTўMѝcc: Ffx:ݗWx:( \>^MSzPQ=8'CL|Q,qMhwj"]k5#+O 9o xR0S`/R<ńbc~hu6? \\RPG*s8I?s6LF94{fRk,ְeź,mΕ&2|bӁ??v ɫ3p|-2"-nUiF$yvo˚GZܠit!~h8j(ߕ}㴝A@U8+}wEK< Ύ~\d]wm8._nօA6,u<瞟(e |Sc,. $uie R,m2)w#Re\PJ \ŬV΁$H:7w3=wn?TN7F~wSht~dYw}wBˆ=EMbTԺj[䟤J\p W_nqϱ맍["#95O֟NJnMB> xVdvZ!t&5Xk:Vy^1dvAWW`swbL we"jL'B϶ƙhD5(J}g"C y|w~_Z^q1?g yB]8+cBA+@kЪ-0"<-L6@r~""wǍ'6H)ۆ:e!n]cE$zf3"?|n 6vZQ$dKe]yݪJ}DN)ڊX4gn 6f&ų畷:ldj+Z @tV"K}^DQgrID5G)(s.c⺈ )J""%5Tvp+t،([g;<mYZ~[⏜Y~9~(6'ɟ"t .=N4:K$'7#uxEu5rK2D_ƿePOM!^zጵ1ZŨl:^*U:lM9x'QD_!腼$ӻ4p+tJSHxK~o/H*=FOE WMH/e~$?,}"os.GNMM}#`W:T$o'>!.y^G?2 F$;_EXmC2.1oFp5-Hx -XܔfeTu8M,z+u#xOF-Ԕ|E΂szart:dYKw5<[g Zë5qu1C=?>Ʒ֮)Scg815_ѕZjMy]: K-$[^aWo"fjeTpgGa9)qVȴG2_7*h G`|[v~{'mjB K*ZƆ5 D 4_6OG 5/zW Y.y.Lmg~u{}-!'52cO;i1\X,Ee0J Xvae׋/Sq~4KәY{uи{5 YZ;u5o^eZ~,!W%n9A)sn0;㼅ȩ(1<)n,QY][aj;Xڜv<#B7Cq:]ixD/Ha¿)"эALJvӫSWHt֤ =~q&PR(Yq>"|_01K'Ȱ^!'ΨiΆq'e?tfpjlgIF;ܥ?I}FqrH^\c,cRl41?sBpn9Km&UH/IWy)Nud4LDg1yCxǴ&庬笇εR\)v&>;tCő|3ѳ[Ud><#]X*M}2w1ooLV2}-ј4MOLs%+gaF߅‘/HunuI+-HkO&}He G/43R1;RLp4%l,P~Q7:߯ܔeH~=b*Xz]kDi,NXK2 27׬o\f϶e4lX2)5dztqj+Vߟ+R99AIE#m?&vFѕ0Ň+(cw> " ]%Mk,>̘L6ɖal>y4QQQȜy$;mjSq-!\7=y-~hm7eHaRHriEl*'_\^&<'.?x$^CR_k!;6vޖA)!9QXN:YN ]q dOy7+m)QħEW>w̔\q5V@#T|Byu=^mp/6OW(k#4Z㔅E9w'uxe^1C<&ޒ~ nmYlAgyK̨:c[9!(k|݄c^vyqGRZc#犐=I; \cXQ nwY5;oXF%bQXNsSeH9 *)wߚr!]+z~qgY 4m#^)h(&Pc[_𗢀|SF@Bzl zr8Nwy#~yXm6Qλr:ZC`].*~U7dYk9gQZ'5v죈ǝ<%:Z;ģ'X=QsQ;R32>, Fͨ0t=-gMîe)MBݵ‹: TyODTIGH6￴zƿۉZ^WNhqaJ7L\wa%R9#6:QzGJ}Ω:\/:u՛p!tjt3U<}9 Skߧ*|Ya2vg4b5 ri4cК=9 떽<} pY&C󧣭eD6Q:fAu~ny,@=5'25r>B_iw;%V6Bٚbh@ߝ=b[Dĩ sProܩ7 |8JQq}MFߡi5݆ZR!Erwm{}Wp>$K<-2&X7i⮨7UCswT9O/M~u/k2vs9xst:lVRysI"on[j8bq.R\졇 rlh=.ExBr YBtC#oe2 v!oL_YGùYp"yS֦u(qd_~g7:US Nc EV!T [<:@gwBch^ˣyg5VS<HvB*Zd1CHI i.s^7P[E>%$.U`S:bF, tmE&>e'd5Qkf\du"2_m R°T%SȄ]'E&F(;?p(va( #-cύ1Tlvk4杓g%փ hbiɿ![ct-`\YC6ZΟІ.9.( 3( Jlb3", 2>[armm-DX;b<B,WLZ4('2=,̜yxW`cyܣ$0Cc $Wm2Y&V2qqMɳLF6?5A!q$,ρgU-PxmX<˘YEv^fl!^l(,'8; d M)X&\YrF,!Mɳ.<J夡n{)c`2-uX&Iʳ">foqS~r fa$ #X:QXN }:,!NI=Ig ;$๦dȦY%e:Dlِ%IKY^ LBfVX2FhL: -.|V4E`k-]0[I`X X06g ic~dX,1ز@K)L&߃=-3_|Ga9뙷sV2P!훬C%UtS۹`߳,1=Ӈh, ژ/kҍҬT,#, eub]{SL-+&| YF b 2V'vfl l e;h_5)˸Dv?u:-1 I_2RX?pTMjRȚ]{SL k= Q! :Xe&`5bј-@1wܣtno t:ih2Rtz(le/5ZGI1kp =b98^\k.4>wz#K`ĥ3JVf1|2יfI,zFrXX cEb m=GǤhoK\s4!Cl՜0Z< pkF--casd n#tS7NC 2{ w|QҦ]ņngh\ƿiڎÞ}6R'ŋyW1ecc,eJ,& r Q:x^H9$b]|]ך#cK'^U9:%1'~$1t]J#=$[v[[k VXòZڶm1UFxQ kbZ7 2ް0I8IzD:_Y usͿo !@ݶ0^ % ]F-?kLNpn]V_#8 ˸_<^ Nj:(O/Θ}X;XN,6;@..X?FbY, 4j, 4adTcqXvGGZw/dBo<7^94LKMaP'^ֿ>F='$ ^sa̓22\;PvLa~XKY1b IY;M2(mz paaCq*i 02kaG)C:uQadLsNP{L#ln#/F@]?,'1A()|ӖN=kCv9 Bث2:qfukt^)f{JĢR?5n2n>/B5g۵q4$Nuze0uo[Fz+Q܀X&#%Tʦ e:ٮXiBJtvƲFOߴƿe8<,'@f2,JqrY1JR6?̵o$i[F:,{mjs~DHC5A!8QX ?Qc$7`e)Qt]˰a$[{Ec2.v0R 2}( 7l i¼, 0씛j I)k[:٩4t\bׁyLc68TjFL2~{ Nh Y&uL3պՍl+ ːxicq-I"l[/[jmi%RS)LYtDwi%M:M݊iXDXm/-Pu1=XHD;&C27; d(0(e>\ѦZ:7`ŊtY&wْwǻw@)IIYZhIi [/-Ba+()$$$aɾ;;n˒}>q%Y-z"g4s4=y(B!B!NkƉB!B!= !B!sB!B9@B!B! !B!bB!B1H@!B!$ B!BB!B! !B!sB!B9@B!B! !B!bB!B1H@!B!$ B!BB!B! !B!sB!B9@B!B! !B!bB!B1H@!B!$ B!BB!B! !B!sB!B9@B!B! !B!bB!B1H@!B!$ B!BB!B! !B!sB!B9@B!B! !B!bB!B1H@!B!$ B!BB!B! !B!sB!B9@B!B! !B!bNʦ=!N u'̎kQ!NeB!0IPN'O!B!sB!B9@B!B! !B!b"BY܉ N%;1לE!8H@!BY"A9!C!B!sB!B9@B!B! !B!bB!B1H@!B!$ B!BB!B! !B!sB!B9@B!B! !B!bB!B1H@!B!=!ĩ/8dle<*!B!D48?IO_޾)S$YFYlŶ/դ9d>s0 R 01 EoWP8Fq&8&` C>~5T|T-> M*8da3%EoR x. 'W-B!)GB-<^x-o CiFY%sQʛF)9j4@0L JaCѱLB MEy"h`@iФ"2&6g~YR?!<`!B!N!$J茑8$q&uPJ8.Nw /mb.$9-zR&ܧF:޿pF_ w~d^yL 9 `ԗXeem5 G) ۟B![ Xc,sٵ޾$C)t7P4DD"Gvfx)9Akk?׌^3q9^!C{0"7/sns׮EԗB!B$ ,\^xϵmg)wnWfNj^p mv&n+qE5839B!8=I@Y`.[㟿̯,e$]v&?E sjY%Q)2(B!N3(ij|'m7_?\4M,q$I\%Jc @kR u1Ms+ $sܳ pnSםQI'!BqzG;'r;t&ئiO]u]l7<5 >O8 ***(//H$Byy9TVVR[[K4q; 0MqmqfT*### 388H" ff7B!,B)E&!HߦD"tzmcc s|Cixhϵx E=C!BS8B<?;پoJ侴/_FB!B似O0_,~8@kk+b1lƲ,JJJ&ihh-֤R) `ppuIrE&axxxo>vMWW$ RԤXWzy#ΧZğxB!KB!>727 6l_z^ױl2JJJN`O#J)0 Eu],===tvv{nz)}QZZZf h R|$7]0)B!$!S"o?{^zk|o&\}xlܸq<^xa inn;oxpF(B!ѓG2x׻w]NirYgOD"I?]Io<{F(B!đYE~$c}%d |}{x1mC~L!B#'3!^{TLSS 8V,S͓.:.E2眠 !Bqd$ D~uD~Hkp S64*!B!(үZ-^?H]w.8R74 B!&!}W{N[%^~V\Ʌ^Rj2Wk~sބB!D@S0K Z?#K o;od2㗷y3U*0pA\_7іBR(r\(;;o!B!(³/ty 9묳N7ZZZ/Kd~s`@J+V#WV*A[~0 MRk'1}s +,\F96u ccd4f:Iad 8ƴ_V.41b'zdB!Eع5J+VFOqTUU\&O/o&,:`–F F_izd kdF*ag"B=7[ír> uj/-qq*t@c ATo{4j~cfBqґE8_=3&ǟ al0:+;\.xs1h4?FG+  Eɕ84.]z1236!N7& lZ`$5hʡ {ql6n9lbXE89­tRy&s( E"M|>+-z‘Q i"Sӄr^{tbdӳt?BnKnQ`z(>QFf.(`ۓ'c8fyLn;i?VIBLy4 ~ڵD"qXwT*Ŷmرcsy{曩:q|>/^̎;h1}ebCq*Kp0c҆I\E=$%ԈdShrr85 : tPc&ہǴPky6i<1=ǂS1}ظB-4JaHXnjr]V/yfoIEץ(~{[/ V\G(,6w3oAm6iL EkF.#qJp* "̙|;|GCzׅ҅ϸN[p`A^B1H@ uxɶmbϞ=߿Vz{{#Jf|TVV|r9֭[Gss3'!?ַhoo?&l6=C,?1;444`&spsp`Zv3<8†Wܕ3?_}k# _zEtnݎbnlʁx)pDgnʽjXE a}L`>*BqzxW|Voo/wy'w}7/2C$SI8wYUJqD"\mq'aN޽{kdbˣ>>~ӟRVVvct>|W?=y.c+ByuhC/rk|ſk"ݸL"m[b&$ NN7;e9|O#: BIO8NuQ40fmyR~Bӊ(@)ggL,w<8֭[~wIww7l良5LL&O<3<÷mJnf6lpd{ᓟ${oQ{ C Y0XsF3>EZ{8=@^؎;u]~}/ˇ]G&{jxGAmC>쾽=JCS 0XxA&麅d+n#Ծ!&2 TV-7n1;M-w*_Į{u6mڄ|橔"𱨩ka٢Jﺚ$O<~,?X<5mqWr5v\,0Ԭϟ ںҞr~_|1 x=;Œlq1 i c+r[#ndFmsPYoo1t8HJB5I/~g>o>m;P}>BA?e%aA`g8K2a`8Al$I*%g۸Bx{/| -o[ã>M7g PAyY :?B.:gŴ CQQMWn 3/o'WJ'?%\rXjkk d\2Ex h_:5U ǹǿ-7\5}U1*' y7B/VpjtpS㭖OR>#afFup1`E,1$ާJKB5ބy``W.;ट)47pɹ+5,jdvpV-[ĉ2 "4Wx%ބ͇Vqu0@[ElpdDLpHNBIB!3Mzdd۶*y.k_OD,va(J"rsf1e%iaL8K-~5qkfx$#O /lKj y__OD2SԬ<ܺu+7|0)O _s! 函7:wwr>呧bPttte4`q-*++D"3M<*fT~7zLڍ+H%34-l(x]mVDIǚ+-T98f_qm*Bqq5AT*BӆlZC2y&=wy'_&M?L?n?W\q'(+ מOn_付P5i=22¿s-9Pn>e˖)k.ZϾQ>gXW1+Xȷ/?J.<?>iStBZv/xӅETRk/Z)u 'r8U7 0:dm @G  B/Ɨ/;`ܡgtfYr !!|d2c p֭|ӟŠ,ʧo}/9e!k/_͟4|<[yǦL#}?g,wǍS3' [N$?}z R_җhmm->+**t]ޡM2?coK^{ kϓRkDFaU}ũ:o+3"J*S<n!8H@",Jyio6ٵkD4>vuV-k{_khsQu=ضm?f'+//x;W@4R8gpe<)_x<6k?pdP?|go~E=˲t8v2uռײ|w[5DKYuWo/7FAnad& eǘPt\.M[{Ҫi7kOn: ҮW۲d*3ri2پ3xkϙ{-q͛7Nmស>"LӲo} ~25!i] FV.)8B+~T}&,[F|¯;; m輅 f@n9&!' QqSm&hw>,_?= :S'l>b/mk|%&]Go+']k.~ӟ3{ٿ.\ 9LK߹S.75M`o Oogu']n5lxmOx N28' q^~v;͋ W{z~M"{p$c;^Bl8O+bS~fT_v6 B+VGq[Rwrpk6'w" a@8f]ZiOl{w2zh, BqZEp'fJu1?}}/_/=s|r ~y۰lRz~ǔcEK{ϔJ.[sF3ؤBA?x&r~nQRկ&eJo=}UV.Ϣ)?k蛒0,ʯ|xb<=sJ֚m۶144T𶍍Ρh+׺DzU v%?}`Rl85=23.O(俿K^yqהI3ц|ǷWܾ}Kc7|rkثp畣~t­k0f~^k~BE/" XFg7]YFh1IB9r&DLSORS&G㮻_U7 ]z&Օlj+&+*ʢԉZwO|Zpͤ;s/ok!ڋ׳۷oD)W a{{;/¤ buU%ob׿U|g?壼/gyߵxe88I(fPh u&gJq7cߴ5~g\5nqǏCdp؅EցjK8*ᩫ▅QfRL&8¯7n[%3X%%$@B[>"!1̅8M)'ZYƾ}vm;XȮ<[_ghmo8­qmf^;Nn|_g_9뗎_9)ie~t; VR?ϸz\/##++5,?$Кcjf>EPe~ X)mUVVF089=+j*J(8 k0Lqf֞}לų̯~{r&K^&,ЦEb ܦ&.CF)X-W ?4|k0f? =4ϕ77 cJo-GWC?Gf߀i}ruH0v;Rp!?6-4Z5Jk/zpJ(Ev#Iau8H@"C eYS&Gg```\U˚ɂz.ܸR^y _8D>E4Ͻu-#2}F1e.Źi'N[<_)Q4n4JOi7tgyfcM@C8RXsr֜5uLUS7/0@j2$)Q8B-vw[5ٕYt@k)\wd:ư1lVxOT`$1ti.*g Qga%΢*o;8zW_"f N+U&)(N n0Lj8pS ȕV 35BofJkĩC'XxD2GOo?ȶ}#F2c$ux+ R ⇞ h31ME(#Q^dQs95p奋ظ`@"*@`Vtvvݍ0V幅p3?s\_Ï~ nB2$x^abmI zާ;g 6m˿㎂Iu!epX>¤VRYynGI9 %9t@qdAW~LR'{eDfY :cWG e$c; LqBژuHI6y.y@c,SDzr \A'3m \z{Z{*I@fwQ@mi;u]=qciRd Hp&s>w>XI'̦3 C"饠+y\@yN߭eYRp``t7 yg1t9GkMW{t3?D23il˗//!JLLWJxxgC6g6ln7;48wu'Df>/-\P%f2MڞRQ+Wۣr 0{M8 `y3|(#vyjF MKL:;s0uաH[J~N0zBr6dvW|~ 0mTekoW;ODUYN2RB' ##,-Ct]t&њH6wo{Ż>C:l Є){D:]aF"QUQ26Bϕ"2&dst Ҷݳ./V7 V +BIGMMMTVN7'ws-?XAp ٮpҗ *>"~|6?!>MnYsЄCЦ­"hLb% ]y)fZLIob_ Tl*-> 4I!plޕPѰ'i+EWMHx,8$T\8hQ/;(6%ѮF)5<8K.gJgB0觴Lр@<02 J>VVWcrq'mD"̟??JJJ0Ms0O1HQ9 hJl *FO%)6o"D|D,]TIYiq[eGok3 v'3v*|ESyKsΨ N~tHo<&C +nanF%Xv dm0:@R`n0:q"{‘lʪt5@"$8ys1 x-\tfXR0ir%((!ɑIgI%Ri#)#Iҩ L\F^fc;$)lyU,] *˸ʳZv uxh JV'YIKMP8=#O[Or,(AL$(--% |>">ߏ8R)8CCCimX,F<g{ʊ>!|9üyhkk㍙>\ o_ p'ZOG*rf=^sp;1371 ~`Q"A;m; RJj*OEEŔ@T"vRYN(.^ֻ2P,K4,V,f:.p\) ӯt: X ѯt2ړ|6`u {b 48f #jzYC>AEؚA_`(@8" ar>@.k3ngEk1xQ;.0wt81z IemuI&ҤZ:KumKW.a~ ghimx|0\I&8$0j$MmS>|+ƿ~?aPZZJ8z/^LSSRQQAYY$? XS.o600{^)7 řk~97Y9ҥKwW_ @#q\gVxi% 0K*K %mםUB㷊;iܾ};mc(EyЏҎCq{c}S B>eQ PSY|fXD`˲,7060W %<|"mإ>d2w޻~ k&IxrSOnj;?z Vqeז`;.>/q IM1 Ml[|k0yh ?ǃ$Y\ۡĀϠ<Ⱥ(˖T`M[^ >'[^dHkhuZ3qO3NSF0Fo©rzyR\^՛!{@YUy[ JWLmQ(hC2q5I4f(e/FJB{z*&]ױwq`7}=dRIm,B %e*(-RR! `P4mDZZuRYSҕ }ʿ8cɼ}>5Ne^t裯gچ*V_kxd9RjP/-IcdN1R1[(Hjjjhjjb̟?:*++S5},4>i=>Ο =Wh4:k&6Vc)KOeNgIێ7g(!ˤ&$Lm$D7-!H~`e 닪{( t2dIdUƜn Z~Ja(i(, `M"hD>~A$P +a"u?> iuuu\o dAd9f#3Nf`Dڕ?(ɟ z:KO=~ŭh}N=~x`y^DBl{m|;཰&: %!Hрjn/o?{:^;پΤA xl =y|qE,d6dpˊ &2oKYXџ71Rnd: :*X!m]d^~(̲pZf+PkiQ&PQ<3fgO>%aλLj+q]M2g'J) SZ~^ uDKmYx,mqlmUkyC|>Cmdv;f6=uҼvYGKysA N9p͞~q6իlG2ut`˲,H$B$,XeXp!K,Y(Z[[guQ֭;#:9Ml7Nodr6 ʘWAY!JgHdm9ms]jlŝ+$o}A?a4]Hexxv g.*걭]` @<+d(rto^݄}Z5(Ƴ\}9lȷ_,GkZl?ljD"S mL&Qf` %z %;|$uA *ub7ؘ9TFGg(nE t t"_D),n{-d >Yvf*8Z85Tm`6ɥQνd>[@\6w`eY#Aj+k`(8C `Y5@2b ;PO:%1<8#[P;hI*&βg{+m=,]E˛ؽm?}I'\`(ڜ ضm=ݯݛ'aXEYYUUUZ+VvZill@ 0+Ƴ_$z2{<NޱOJѽhj229IltI2:]9^fš'}JA(m a[ FsSJŶMLlfxn=O"[GKcp |/0} KpxjO1gh]Oۋ>zYxq,Ϸx5˝# m2KiТ$ye\%UaBk8'.[X!(՟Ȍ/pWa &b t3'Ťbzf ? h+FwA)U9s@@=# Ötr ǐ, S[_g12 ˍwQJyEIYy5VSY]囝i?Vo6Ne>G۾N-9մL8d+zQJQVQ†Wlv}dR[AEU {ؠ)TrK8f_^o yDm&~\s9 6f())p?>^m"o8(WuNcǶQ̖ $R%Dw]?㚅ij9by &;*e"៿v;ygr31KKKyWrtē<Ǚu Fz>tm~ 7Zkc+fYV3T;3g B-NyoV]VS e{Qf:JAAO>妀mjd#Km\C&7 hU -|aʅ"64Bl8N,_pGJ£],0rKˣl8oV.`}$ɍgG xi;QyC 1N@l$m?}|)Zۇk⯔"W_W_멬<#>1ZZZhmmrRpΆF5NXTWW~>L&HwU Q4QUN44#Ib&}W ̋;ޮW^%F_سqNIi (ahMlv]29}h\ ztv?6|rC)>y b|_tl6 U'+9$2FƱ}=ة~\;kAzZtWwݷd4Jy7+T^'EK Ke?0Ӏk77 ~X4xCs%|^= 60Z{{h>vق8N33EU> dQR!TZ\kP4AZ-x3eLCB=]RS2Da&K7`"[bV\Rc1P8ҕͼiw~-oP8j,lEK#uj/o՗vu\+-'ԶA1Uu5mOlj%) c\q?M6M;L}'`D'\mg=|'>,~;٬WHxS) e`^e[|&ARa7ګ t C,"^ǢP[/p)K6~}<088Ȯ]8s >/^q1~8Cqo5?gٌ$S(2Tf2s2(X+.]Y떲~+9\lDz,|iZ뢂ӎc*Bvq#8Nf;5 i*̅ȦEc7*7[R7_U?a?MƏ4EP 㰠 (TF__-3= qd?YJyr/n=&N}qv V,S2auX̰BUcUMU(#cɑ xSo$hChytv ĜfXm1Wp|,%e,7x[t>-12uOKV4O{@e1wQQ]EWM.OuZ?̃Ong^e^-U-Z&kYT̯`֬ZgASS-bm Wl L.TIA a&j\;vsnv'Id㸹1x hrT_,pmxa??cP~T7ZuxkKe^ҠW۠~ [*R@1.A9%[LCpJZ-Muo5=*M_OEß=I``pӅhPl1)Eq a[H[p}i^8m@ 4 aq_{_POUM9]W SэEN}??UԪRJ7s=_?TWW/´?['0}kB!01""Βuw9՟3zs=0F^596`' L\կHDAB1K+;ر%H28i~*ʢTWPW]NI$DoJɥD#Aj*K,eJK# no6:{&555^Aç0G!2bָNmgqr񠀓4/0k;m &L>df첱OEi#H'uc01-jɐMsB&'Oc2 8kp(J;`Dkx-FO|ߌoQʘi7$4PfmK+S=䢵&%l߲C1i?ˆa^WU8s#X< 4/>CV_LQ),S:ບ~߲sOJ)JKKy[?A6lpZ;O?4Sӌ7':Ȱ֣ofݻ~@ζF|7Ӱy^za'Z:%ImxLK#,YPk.\aŒy T(糰)r}}}Ek,_=uK)/P^a݊s]5`Y&ϸ~Z{&g~z gTVVN8a 0X!`Lx Z:k xvsVמG[C09_X:(;rT.ˠO.N>z2o8g/M$3o?B3G'G`ٸbwm\} e! 4ZgQK7Q*>$v , elW&{SP>ǁ)#L\+7 `v;m@{[G; r$&=q;e?r9d3~(/#W^y)ٲo6Wy8㵗/9#:hz8G;_{ hj‹vv-{xnhw F"!7ZqiCjYT떰|Q+6Q_S~XL&7)=c=i a( 1jmw;ݻx詭nW^y%ph͂K n-r,:^U PA\ȋ/wN xOfÒ` <`^v6 ^L\g֡+>2k+~lL34pV{:Jgi&n@A>;loqR*fh`aJ8ҹ q6}$ ڙ 7g~$} ))+u:Q PT X#yY qNpmzs9|MozHGs ?N!V1]tn ,8N+߇' ;v2MV,ob&m0Kບ$9f$"g;$S>Gc}%%l6֚ǟۆ\)|,^/]z !~𹏾I>~z< Sapy}) )_u`PQSj킳,4cb#}v$΄\" w}Z~pFKpɲWjjq?10cb8UEY; y_rnU2ٟ75VXT:"͌n(;Pv@wxs;"B/zU59/[HԯiZNgiobcI1n|8i1\*)HN3Ϸ}04M/_?AwPQ?#L[)8{}5UsB1*+B[ZZf:K2]xty̪,?bbEc/qǽOMJFlذ_x?%.w9YaǪf`(=x<̫A*6꫹[hjj*~  -#^ @Y<up @_z{jV/}kNAA^Fpj^K}SܵCom=hO;8)yyVU-2w+?t ne p@p]غ:`Bh9!9iGjBY$E˚طT"M۾NXcBa2u\,ydKk@qlr4itYY'?q,X0"5?ϧM6 7cYds6Cqc vso'_m]$ip`0%\'> .# twwOڲPP̻uumB"8<2X*k!T2'J0g$ 9]5nR9_ƦR J||ص6:\( E(t[D1F34Lz 5;MG!Sm^΋W4Ӿl&K$ E ?\ۅ8R;{<%ze\s _WXt4=gKYoOuX^M8#u㴵jsn#R~:i;[Wr>tMYYYȺu>//x' f9~vȋ̫bz7TQYET:H"H)rٟ'w^PjN1CvN"/u!sN#sy3)Ȯ*P;`'g"N] {qX]&QF?vEY6C,ARPLPiZ}Sno[PS^4BJg͌;nPeuUtvO2"ğɟq*o|L[r\8CqhB<c?R Gyy9\pG_zXjkk2G$͛嗠ꇰq1_ 5 q54z07F'BƄ-ǣ Ƶ;uFۣ\'+Z8 Ivgغ_)0X·9s,[xs/i+j#^`F \`hމ. BB%ttF;IB)EsH1>u#O" bFBPDy_nnrcq\,U !|D) ;[.^>>ҩ XzdH -?g‰8r%*Xt\tEX)f%HEww7]]]O,chhx<ll68C&cT0`+eHs'H24&6!q0ME0`QVdтr/:m4EYTΞ}r6m⦛n/\+^oya/笜3?iüU?3mx<>y8o(N,LIJ,JJJ7oW檫⢋.b;L H؀.zc-1ggy jAbh8*VK3ƃx)F _x1-{xvs̓ˀR8h |78͆x3ͽiLWqn Z,l_BZ/Cq ć8vb  PFhjEk;ﭽp ۡ+t;R.rSH`mc5ђ0C#tlBGfsX>_8u #Wx8^nxZ~l7u/{^?8300@:$H0888p~d2$I!ˍXNBd"w:Gwa0mM00bp(E*mJ~F)p]=>/( qC#^\ *Nȓq/=D<'p8'?I6m4Eq]߲?[Yt5˛YHR|Gq"?8cn7#ϼPǝ:)//ooG>rT`0?y=\oyd2I²,477sgsfjjji)՛3/up^ W3|U9*AB ?XS@ mpr vӲ{'7oc:[O_"Kn]eGCaUXZbIU9ft_l4{P*_*%,$n ԧعsx'z-:{('gc{ @4qGW}]Gjg((++;-[6^7c0CCC b6eQZZJii)UUUDQJKKgЌ1>כ5âWL9Yl7A]ԏi(R9X͎~?L2Gvq.\bzخ''8EUyͥ\+UR_roJy+)eee1rG^`ppr2?XwSY ''gGx|dgoщz &HFSXZ{ce^Ϛ(7l熳O@@, !Ƞ\)ԖŸ\I;2*9G˭ Z-+ RzTC@chD^) JpU/P?f:7ZG _m3|c]%P[ΞRUENcE)3j%ɡ[PGyE' D[>di^)x9|⳿T @ko~yYNvɳ>~;oN__t+A8& R^^N qzzz$ɜ,e X|&5~T&uɐdO.w})_^|Q:%o˻cr_~׳~z>hmme׮]u$Dt:8#loi&Zk|>`*.]ʚ5k8sذauuu.`40tM3EЏ#<=D'ӐOPkkN!+" 1O5" )(7}!wHN֚xG}+Ⰾ8<ͳ>KKK Lf !R(C TWWS__O]]{vW2PGV̶nR444p7b6<'y'(:8L҈KKY:MTQS" 0 E$hi:8KPmV||݃SO$ 񪥇{s?ǗJضwgyl۶u֝vwb_twwO,l`a;w_Kt)3fRJrj 9<9UG gCܫI^jĴ\ޓ}?Ƈ.n#5?笨/>^o lnu!KÖ-pK^!数T ĞW Hf *O@P :dyngbaBv?U;0nDޘU4ك-Ca)d ad8[H~cS~p _Tqʿe<~~jyyٸq㌷߼y3vw}7S q7}{|`S JACey5Ԕ{'(O>0 l7H**jLUEhϦVQYr>j ŔN p"26o௯U'nDž߽:s6Ҷߴ1D+lOwpyd Gw8wmld<=0ٕyB `x c VɼvD<6eQ_ `PF =$Ogn'vQtOW0:[DB悧 WM%dBiRDK@̚"\]`˴wc˖-_~{O|SOʻgZP/ֻrow2W׿uU>/_—?pW7y5iN[{$3SW, CQYqzx5+ן;i/rߔ@8=<|_!, ˋ}Yۛ: zJyx J#|bO_ H,o8g!T 47Q/ ’Zk}{{JX^H, ]/ Tp]K,8N,]yxk=Qh4c?.2 +}#qJK*kM.l {8ky]ۏrKgNa7*XO: jDL~j{/)FY4[%JLkgj0>N6u`wA=Hv\/ۈI՚V=ԉg0ލl%-,9mk#|]{oo~?я3i"m>2e6ƪ7mU$6)y׻C=D&3u47S8eUo8~(5e!pn3~=T>J2=;9||n=$9'qk}ljev8}}}.Ιҳ$eru@z4 `^+-ˀHg;|<x>yRK|d/tJroH\Tê?rZz]޶Bpɲc?.<{-5'ykA(C)W'k ;`W;8.FW s05Q\241=w5F3iFsrډ΂*zavGP{15)T.=OGQT|/VmL Oc^J_}d+d!,ieLL03ѭC&ӱ~Ӂۛ3Egc/71r\8xv'2Pvī?ĀF;)?4MztR i;7a%/KH)%ZSէ6jZ.&%]}UY56oC]{z 40 5hoo??bֲb .R^ײvZR_ʴ5K_@]HގEPlBp'ryRo,`a} o8?{J-:}"UuyDVI?}%;w{{ZyuWq7p݉8 痿%wعs@^Mg_*rk'3( kVW{+{z9ye=XTbe9mӧ+3¥$,tt)s1./϶%˽G!񌗥RLQ3MGOx5+ʹT;%>,ںkS9csΊfð (. 0h7Mg(؇RP#a e LǮsI5cR\ tkǏbwr#;OE#ع٪F5e )&fv`}'z44rʾr._?x4g۶ǵ^g>>l'O_5}8`wMշ} ZUg7S-bIc Li(J#~_U[/^m6:QdDz. Lu)8)`Zn7 7w\}_aŊR$f6]]]͛y'xWƶng Lʅ\/޷{C&m'r+i3$;ɍk)\Kv'ޑ6 X|,:@Urtvz|IN'^3|'2xtn#v:oW-$8C-l0TM :8gwܚT*.9ȡK"~xmʨ%!n t A^,G݇' {~ov  'qz0){vqHv7 P hcѲZ}شUs!)(fuuv籧 3<<ƍkyQk]dɽw @@BvR9靓~rBO`0l{-Xn/3~jݕ%Y%ܵA|);_N}[! n[3WMavE.رţX33ekf%#z'pSW7{`e!K<\zeu9]LӤ& K(Ncc#---~apT>O\  CPQ8mu^>Aj;;ME[9xH H;9Sw_? w&-=Ώ^=Ʒc+'. tEl} >CK 8*"&ǏzfBE>쩃_!ywT&/teE\tChPi^+Td}Hۓ;~F ςxpmMiGQX9/)n'3 E &`MC d` B&.t'FI ao |ɥ(iIC&v^v (Ɣ:k BQ,!P#!HSQ10FċcFFaDeR!|]`ǃnUCT BDB BZ:)u;b&"MNt )j$-Ew؂^=b5E2Y`e+mCu/| TUU/|9ϱccT>xL%In*Jҹw '_|b>)L/k沥tiِYX̠zYMU5\òeˬd(#Çyf^{5:Dkk+`7q"7*Z6\97@ =y hBNu i=`GB|H<6 p;sK>9/'mm<9e{ '.d'AVO0L۲ojW6KVwׁ_TVK+mӕe Q$) ->i VŸ/Ќ"H4 pNĈKgAk-z " A2QbG9v$6EPB~DƀcF#.| FuD OEv- @=h ZW&rpti1~E=jO2aꀊ0=> b .\s-ܮjCE!@}5uci00(CQClya7ayO@zorBho<71Di9Һ5@= 8\i}]`=b(A8:uJ^)P;jѪ֠QT=j[Vmh;1=RW!;I3H_[G\r%_._Q` |#+pS_\ $(P^O>~7]8eD &Vy (ɽ7wi\JNvjw sg?oA]]7"lq/q/EY`Vb̜9q}iiiV*++ٻw/۶mf0i&  &Nly Fo@W n]y s \mQl%\5q\BQr[8&4[*ޙt#{k8gb&9cH0+΄?=pԏU톞覣p 4! _^]7Dl|yMK&z>k!dS}%^v'vX8qF'C8("}14_N&TAk07 6EGS&P4N 3J#WP:ȩE"{ց W@Q)dd!G[T+VďLCs 9pI&WߚC&  I҄HW7wD\OaہRdʯN, m-&2DI)É&J0vߓVd@4P*ʏ~ 7nKn*xP}dgG*_^8ϡK-]ٶmr w}7[l+a+K5/ͲYdim*,){w`A15~M<hiEKKy-Oޝ9r/=73ɀ0^a䩧tDŽ ;w. ,`ڴiL8lrssIKh]Y~=O?4@ C`?vɠ* .ʔ<7WK[;g*HaOn|?Rp jS3[:l څpo > u  g>(pOjWz?3IY+@? aǴ{eve%` NȖ9ķ,;jZsO+6+ñ3;bR#2UjPEkKP:'H89=݂~$ݰfm>IG>ca:Qb6-{Ah g~j C1^#^rQA ,J ?(ǎ KdlN'N". G_੿A$ ~W:ls}Ecgw`@%vpcX%3G&+zn/,˧es_&cʷ?MOh6*8XX m=P)q .S^:D?؎~ӟ"DbЦylΙy}2>|,Z{6oi|d=tM}o?GZS{%|˫>Sۗc{ 4 PSS͛QݎtCvv6'NlHOO'+ ӧK4%D"(H]{;N,X gy/~=z!Ĉ*Y#hʀ?c,yX3-E2(H8;aG>u׎Pv8mخ_~Ò85+*]n@ n_?{  wo7E\6# `j#+BGtuAG7pG+`O*d H|[ĝvo'|7?[^3 =l2|Ag;|0e8Hi³@K#|p'K!@8|*Q?t|J( Z[xp?q f&B o(~|\^ηʶC- b}AyC.㚕h 2<9gԎTQ//ӟ¶t_y>oٹ1JلL>eu_乗+$ŹVT 赑lhh@>l6p8p:8p8nl6nAFF\ ''ӉB4EA4TUn$ݎUUu] dNiii.^/HH$i躜3MEQp:{|`r؟MUpT9n;N M;5&d:fz7y;t:Z]C1Vmr85~f/e'ahqQǷ%Vvbc[E/IglҗH6L+zCR,7y+~ΐLo3RuP=t'\PnHI[/|M *Vs~ o...5ɛl';-:*0- W]e)%CjWBR1 faQl)SN aka2[viBUQ}`>+EmcsR:݈>S164 `d4?? ^xn>sD@Ϭ ?|.Y d*w&6HXv)hIv\w|,uwpq:5[>O_ۏkGy*Tu$3܉|brD|I_G緪!z5M뽿~OJ!zgG*yF< >c\]]}mH ,'s9,2qᴑ4N*Ig*Rt{}6\…3 ] .:8֖XO3/! R jȉUYM/FY6Du7= ~Ɔ6L/ɟ@V зmڣ}c=t)P__0,^ mph\u3j}ڛe[~y2O6:xˁ9'9XX qH{| 7'Q)O…7s3RQyܲz)n8yp+okJߟ4k_V ƪZYi5յ]l}m;ٲcw'xIr0M7x/˽ dx<8RĮ)d8mmLw38LsS!?;mCQ@]ǂbޓ߼*N\ 08Au@(frߦ\?w?)\;Of ˊ{Kz:ϲ= ɫN\5_vF2Ɲodxy_]cD 8spxAU&Wd3"[ni [og3{4{_3u^Z1b;:`0Fwn`֬Y)7{l6n؛(v]vۤt6t(>BQ~UG4r‚(AW& [:50`#54 h2 v ?jlO7fH˻&}[jzy1w/(dSï= %AxyT_5O0zj!hAVWd6\'7 nZ ~wLgP䧟kﮓ:)^Ϧ9 η(KJ߿ dD D@i~VTg EhMJh) 5l6\C ](5ak웵>ީ.Ww?!3 D(r(8氰8@섄}Kg`@+rx'v3a s=}.YRv|lb?/o`ːE3 ƗWXm'*S\҅}c%]aC{9VI}.7x  t $"ў0+wUEޖ 555W?y@,YŸ@[ FgHgFGtz@f+QIWd?٧t?Wu{Ri=X"xgc}[nZ&+X/~x=;2in M۪ec67pլ3`S(0y퇚bc0(nye݁~7-~~ir~rؙ^6Ye?iiz0MsGeaĠ!'ʋ0i Ul 6bb (oQ"afZ7/6pET% ~mQaDfs®akP*"FюcS?̺BX9(ǚpNF kOKksٹXcB@PLBI@Y SĸM̚î22@ ӝ|sx3ysO#~Lc 8Gq&-al=~a,2\N_<.<,FDv,S'簚.oEQ"&ikK.Cu!F ٻMӳhөkx bIT7 GutCN"tlU̞1jM'Ӑ,4;߽r*u7> !/O=}{WTT{z 397YgUв ܻ"! _/ĄҭC=/[;B:oTu) ܵvOvD . 0<^OYpׅ2ȟ3Al?z5toT?OevX:vVM!PvH|R0*& SCI&9Z|Eg48'@t5ND,̀[7`x OB dF p-#Į/C:i6pHKTBj{#Y@Um*jPLI&p ( >UC/݀ٷтa)b֡b`(p([ Ӕ^ad4psǘv+XD( Bۆ7IlˣfZL'~mmfƮ6GS Sˆ7ILڊx"nv6%3CQ/#܇/׿Fĉp8+9x !Xq,P/=wB0"2|5"V M2l=&6SlsU| W RvXHGl**js9ⱑTՋ'rʪ>F]eR'ف'!y ϺSkCޖIx|;L/=mE2ߥ3] Dxʩ8 Cb!P:@ۮR݂v !͉HsǁR*v-+3Q&vd jA&tFP1}0 w ;$mPcb46)C{ 4L̠ab뮝Lv[-! dtFnx:nbI6EACSPL0l *|ݦbTBQ7lj?Akqn:\t滈lC<6jfQ;5WWdvDHFj&+J/#b`'sh6`;—3υ/I̡l?YORɊd\'fgܸ@0㵝\uzhbշ󽏬W-*`|g7Us2n^=5K(L5kV~WG)meY,YXm7ゕ }_-,Nĵs |fnc䷿-wPW_{|><5z#Qm}`j`{2*{no  󲹲?۪/{TU w+q;`l πE7_ YDy5㩽->i0׿p_ZsR(K1MW_}qI%moikkK_Ͼt8gҰ[RfOMGgblya0:faeEyF|^GMΝZuN (J(  ]7 yz㱤[>-E,Db{#;ꞧꞧyŃyzpV* xp"7IQ yiL)d\*ҥex.YR#I!1uX3VoqJYZ{$s777P(~M7݄nKRPˉA{\^cRMPOѵ2i+( xѷo TY p?H@zdoWk`a-oݘ8hMg?Srq8Y9w;` lbѢEnn7'sDD2XBqFy<Դ{(ʄ/-}2IulSش"M{;9t d\:wn1n@ km5Z|98+VJ8o^1OY5dnRÔy^X29;W0?&ie 3p9lDh}Mvm' m-,N Nfw>pPo({eժU̝;ٳgf}QLD7l疑6`V@wz/hM.t֕*s@Zt'ܾwvza&}5Ugd'BV~.SƾK@Ov_jSqœH~\iy}Z{f4{iiiPuB1Mz)z d>DioGÒ9%5X]%;INt'!M!ظfS'*VVNVoU8Vq|>lf-zѣGO|AedЇ>s=+x%{{EiHeFGe ]0p mUPJ2+/M ]sGnצBZ= 6PM)t]Ae# .9D5G"|F1S`vy1N¯P偷:xa/Cb47/;ʳ/Fl9_U1M)7`DN$j-N9, Ya д+2;|~%/G-I!}!~.:^QW޻ aZyQ A8gb&_d2_y`?Qկ2uT̙5kꪫCa AD77x&垜:XLM}wEU:A_a܏66UVY¿ߖ:+1vc4e/Bus9B ww sb.{}#tL/+|*to`Tee&b1;߷ز8|te)[j<1.۽o>.yJKKq8|_gƍTUUPfT\_p0G!6un3J4oɦ‰BJ@-˅}%SCqrם81Ѭ~GdccL@L`MC-O]Eeb2n.nk.-lNr3\\ q(OK:7O->v.Y+ FYH2!cw;hZ>_x"Ty3!&6M18rEӘ797eR//$3O~.b>z4Oϧ)y`ܤ[X 6^30t5l޼;3￟R̙>9{#o7qB.1vQ6]/W*a~J2]>J*c6 jUe po!/|]V_[gMv&>n &g]f?XO[9xx~h&/v6v%yM &轜Uӡ#/ITWY_6yhMgw  #FߵdTkŊ3 C:n;9'Ao r `> };g ǒ46ycV3!ɯoa]eu]<Ӭ]2B@{(Ʒ_:ʒ <# uU&  `7`z3=wv[ƚ~(Gt|Tv8lR ]f/nQ +dKX`P0:a*R])*اOs!FC N %@jxxgfn%,Fq3е 2Ͼ`L.;gb࿇SQN0d AU7KW\N>y<5?.d;v h’| pkdzL/b<.\0sf20}H?tM TU%?6k!'Ùr_ C[Mq-[foz+/2HosؤЙϊ)2wɟ\-E*yd'9t*ġ){|:! *<` R x[X qFZ0Yٸo<߳(DL+nSպMeʄl7w^5\19pܷ^fsrV/ u2Ѱf9FHYx$)pMB͊FO;YKg܄ X\6 `1:#郷-bǮF3GwU|9Cl\*CR_0%nOs{[|b[)b<,i>S>;]駟6G(,,'J/.eᖤ7V F't|JH(&!MMM|k_c۶m|_eڵZ`?w9EL;9WUG?fݿک*rݮɟ۪2]+ ? P%+yY7#,΂+߿_/y ^?,N. 8곦‚21M:/W:E#4+R? ?=oj@7N<2CP \ Ge`j<FS`mh18'ۥd1n`1)߳ 1ډa1G+y87 &xPT(&7REQE9Al7s1٢q0"!Q?_qB~-W?ky}ͳDq5p%p=PcVy69ɫg#O]8g8Ս3Ә~B!z!nvP^.>A:8]*3Z2Op !g}qgiqsKQ/l5V^#[-Lx~r.xyɍ(J`cuט*J68Ґ@Q4' m4{*RoDKZ@*^X=x)eObz8k0275K ),4xba1U +7|yREYqy.ƬmʟYM&?˅*( 5UaVy?\{z;q8~PTTmO##^߿Ci0 A6n֑(k|‰<\>#gaڵ|+,]ty̛B6߿-A1#^ +qV7=(Y`!&MGt>R=KW~@EEh^]G\^?3`)7RH(ɖ#Il PhhRx{nDžL|<. >i_PKKPѴ3ep֒x ӋBXѧMUXTfA 0V?o|y5i*H_=])|kkW.";E(Du t#]+oZ:Cl=؜Gu {SW͛xGx饗ظ5 ΙYP""ffeEbJ8Wy]ahpB}.x flB Q Gtl▿fKГdұw[ݖ[mG FV?6l[i&|Ha0n[.,): ێIUuCputOK^Zc=dRl9!(p̼ -,N/cIpcf `QE]ȗ9MZ5!HGǮ y=:PSbi:K'%|zLc@;9wpDXM'>knm ɞHy2wK.aTUU PԲ`ʉծQ^RSoVh-! yuEKL3 6>ۣ/fyeBCw_x#|`".׫:| >l8~J 'Њƫmx=hϐW}MkEUU:$nO!&7|EgggKjviP/ ^= /, FoۆT)Bkxs 5WzAF_cgm@$Hk p,sj*Ktx( C J-,NF@ dRAIa\AWPIMN>;?a ]5B_u(kNA 4USezq%!Jrd0ǸL:_;Sj0:B.I('A0سgO}l+e* 6%XβC:^85UQ0RPtwblc{[nc|Ν[̻VMX};]I>ہGyGu)z5`qtua\"c } k+;SEmN`WAr{]vO\T'x,u E$ή% d$aKΚ}`AV|S1P@DQ52 F 1ڼVӜ0 3ɿM!ӓu1y|g{=݀PUskyĤ7$?oR6d :r3ĺ[Dh C*!{<)P@xPbScvw.?ަ6qaSiζ+fl=_>3i%YiTN;&l n}pӿX+R6#HC{oy ~J2ԃfC{I$ =s uw¯__6Ar.Hn@À.ZhꂒC^:de#(ItwK HDtz?8Fʩ"5xsGC֢jErĢqL%se ={ lפpmpcbp:{^U|_XZݰxIQ7Ü CF[x'@wtٱ9] JU׍PIyhi dA-@SV]R Pc`Z%X<d1(eXJXHLPݑN mp騪EgAuuj۝tm}1U qe3uRӀW Q{%KU9wnxlz]tvν18sV-6.Z6㸏{_mcF=5m̈́ +Kpۇ~tm8mnH$8Ғ;L{S  ^/&ӄ 7dcT$K}3C[ Ӌ`kŽX5}Qӽ2l0A2J€J?F0fK#m~=!e9ep\ P Ta&\<.1t(pl=u,n[4hl;. Agxy5]-p]iNlN^F4Yi:9C i/7_?4[]ڰK;C$j.+rnaq2C~MUm4r?5uٸLY\0 Ni-%ygV8j E{w$rҝqIw7-Wv#q]p%z(/ҥƟ6i_Ӡm!u̚9cl&¢MeeE~`Z5j) fu҇ t:E@T70I/S [J|Me俷Vd*RM~I <xJ[@M˶ųpS_ۣb- 2]|{X ť#|䋒:3ʪ~%2XlW !Xj7"Vph8Kv_ 0+'ϟXs 5ӆPv;DN,^kaa1|B/ևFSw=*t9 <12bdp6]Tc0A Q(8좲MUfU<,ɖ%3utnkVV$}lT77+#zo5:/Śe|%,?YiWXCe uMb9RY55. =צY\W?ohcՏZ^}7-,s~H ! J]TwA S`Li*̝_87d{i2Hr Q݃l?wW@ '—WesE,tw dBx =p=f'0 f gXMg H TV~r˟ҜQٿ3JiL 1P7dEFT\ 'Cb,N["70pL^ kD&-vlAG'/=FQVy1]n ~FeMn5ȶ~j(;8s\ocquI*O@3++V=֮0V6ezѴS#8_^ú河fIiX<9 `8m*v F&aj dgvEz`Kʑw(L+Rg@u#i nL`"LAy20 4\)Ep)NqČwT brܺQ4Uf \6#wWU(΅]8ۈ 6v 1Chŏ 4ANN~F( "d(Ȍ vuG ` FΞ:ow 4u^srΘ;q ^4 Dˇ{;/^gbc3Źn[3!$[Qՠt5>}|J<|؞ o;⩖5Ÿɧ42d=d:;tSfy'Cxq/<Rsd}&X9%Au[p ^`CO[vK @|g.K>Z Gr yj<.,8u)+^x Љ0 SFScN-ֵl+l!L` M]vE4a2(̌Q%?C8+J ۣvCGGn= T8X<3!`_c΄iYXg\%cTOK^yM)<VNbaQcTŵ K҆5J |hqP%e(N$.Ey +} 㐁zOwwaW,|+J|0!8@G8S( A3oN@9Uʘ!mWxf,.ègvIaÁd?{aʤˮ2dx7dx +tV Fw+膂7 iw8Yy0IsddB ;M'eಙDuPL#`=`;32 VW m8?pMo1hT 4t||-WI`&oH2:tAOcۡ~Τ ֶ:+`11l>`ˤЋ]mW~]vr 4N= Q^?,NTEN$ROB~:T,u9+IYT'GuvPw:x󰬎WʍK©:|Y gɬdWU-"g=( TCs5p*;1iů']ߍ7"JDW ҝj?4f BL32T)xg+~<5*)Ճa9c7q!+'A-yqK)C.ޮLJr;l,Y0i—n[҅!9t-}c&oVe:9\ܩxg_*2}J Q-EzΣ=b?7#]%g$ DΤE%IuZ0L8fycLE[R4i/^o>+ͩGUo=Wvsh qpa;!_\X:qdrTkVT`6`WPČ2 piSyqic`=`1Wg\O:"匿?s94L//_Io_0^>|Jy&?t- t'&hE9fW$_@f,>ڣFI 3GeBn /kp j*=V4J4UZߟ`ן3l9\r3bi,eN% {OKIv3ԶïW: (3ćWIm.u( t޻xr@AȟoqbnHlG`;肨!NW 4Μ;1%E齂r!R{\8Q ts+L❼H+u-C)KC1:a ;C`-~@*Y@xTB@z@f/%:0RS͋O. m)+c)2A7eDFHGV@ YEY4?rdFsL!$<;ޢ*?.ZݫI~5~aTqk3)w!&%&,Flq)ʴ<cU{XEt"TTOө/5tLLWBelT1*^j}c<^$Eiۆ? G[aO쭗% 4U]㪶:nNaS[R,o]> d@?bX>gPeiX㱑>B71ʸ:JһՖvMs̉d;c(H+i*r/m%Ë&pʊVNe+^:BqeVyW./۽a&_l]v&gx,;N 2OESZp~yLNxrFpe0zCJ3fķ 12]4l[p+i<^́N˥Ai d@OlR`1Vm~*lҔn0d) Ο.흈#\ @U.{aS2]6.Ck".-1Suh ,CmgKR iӇۮsv['ϸ+/@sG(8CyaC@V#nAv9 S`)gMm ]Y FtOGK[4{ڡÆ)׽"6Y= Ol?uJ#eja|u̐] =i+r jmB$D9oV¦2Q29.m9dߟ2!e[DCDTȃ/NE ~n_Q`iY|L>lw,-P^qU?Xg̾b 8*Τ<ټ0? Gw@h O|6TEaVy~mn;k$k6 ז r|cT޵j w^=6i dTQ`bZE6=xsJL\H\Sm =covbn|nȎF4q f8R,+_EzZE:2&1u >Uek=v ]0n__RjJ5#))~: z)&d[b1v84.[0s;nSOZ/^E-f%a,Fq&2)\r ;Q8薋 9\CDuC1|(Xn82_><,]'ݏ,'m$n"1g6U'O45L>c-7K=vX_'vn&̱CuڅR0'UGkdP.g20HVByfh0mUT3X|[:4q:d(,d{`V??$;7xL8mp,KŚvY]oKSRkA 3$ rTBxft/HW{KNCGBE14%&,N8'LCϐMٹky_o=E-FMc2V_b }釶]x0#~df85#GoĜ$-N֕\g|Ą/X0tg-^NN)h<4z97%ݦ24_5_?Wa>ƶCɫ~.YP i;c-U}DbWILsdAH EZDi\T^C &2;fo@86:"b65i+{8fLb{w(*Hs9c?ԚAᘴ.;8;]qaŽxx|p@Yy߻gSv2v(-N%8Xg ;Ñx.w8?g&Nb#lY5Mo'DQ@4r/ZZcrخ6vۥ+Aݗ8m*7-IQ*/#!dٗc]LkЎ5sXl[w;+io4L0z>Rݎa#0"*|rR`VRbTw y YV"ԵKK[x}WC-!QF}TU98Me,N:-9֘2#%NIzx!ӥÒrAڎQڢt Qf0L/L0Mv6c~-]A9]:HB]H;p/GUt_ MI'wm'KA=н1"HE*#OhjBY73믜7|_RtK&L72aSIg^9v'X|fm|te)_hi'7fvRdx ? jǏ5 MTUU&L,dB.|]>Ziil6.?N4C&)B$&|t( NAN^&EP\Z@n~t7ncE(68y]@>y2TE7L~n` / ?v$(+ L,L?n`@djS|`RAEK˘:9gM4yi6ɖHx1<"iD:6MCQA4Z:_S޷.gG;P,o>%+?b#f凸(ȐJ#WmRn$8 |%7o6 PEmRsFg!!EO * =|i\?) L+',R?kPE!;7Lϙ{{,#vh"EFbC)R4Q0P}w}(Pٞ(}W B`PTÆrAFf:ydfFvn&in;tbQt |fqUNg^&k20c|M.aTZQ$/,$eaV~n%1aOcl6k$-,22}d2|3s3Y4g2 aҎdl0n{= LX6 Οř+:;kw. Bn|="Pr3?_(~efSGP$0 {S_n߽E8՘BT?w$jOnJL$AQ(C֯mĔбfh5L0\dk'#+D[& L$`=tii1h$J4 GFe "]ab .ibt'{nD4boi؝v\.'6t;;l8vi.w MUlSTcad.Cd\&4M__ wpLM'm't"<:FW 4;8JW-?9ř̛G ~N*2xߥ3|5d0L_(pl|i+ ӋM`”m6MFnAӆ]!^-5;fBߚ*0xJ7$=Njr"!gf;?i _Owv~q vƗW63 ;k ޵VN=#l:ZWR>:TUvt\,N+p1HpT'|nqIOک40P5W@d]̰8IeeeU^%a NhݦatH*VC޽ HIDAT\dx|l?܂?K@0+ga? SIC[4)+8GxqKmu*\{ &fFp|L+dֿ ÿކE~ oCM2 O(&@^TUe¢r8gTXL0e5MCnv|4tBFq;Csms)Ę}|?א'z3&@)kA)v `W<8_2࿇|_ !FcR=:6o;zFb~q\{Tߵj2lܽrH//dӾWd} 1iw0 rb t>OHpDOZ0e%ٲ"\4NS} ̆avAe 10LkO|\G00$=t8Q4O|&dr7_=zNt;+uy8*UWHo ?_JTZNXԄƲhXa=gB`w齰x0Ư'&/Ͽw%˗r7pX~Y}_.2j%yt>xas Q$3Xqڳ,M*]'SڂT5xq {q Ns9[=$ۓ*,6F,,FXn1zfoT>ز}k0Lx lp˲ĀVAZzvSpt <$%jۇUrNHxYLͦr5\͗<>X3`_=`zD{"߬Ʉ*am(xƸSKazv2#'~;-˲ ;c-G 5fa1 }d'n_MOPeͭ NFGgwUƵVzCi~g ?~hzm]aL!ֽ}7v7n0MQ yiL+͢(,n 0t"1(N$fJ!Na_0JkWv_o J CbUEaB~ܾ]7wHf_5MwgQ,,"!W{(/-KO}WbWV_߳|ۻR$[IG ZMU`34Z/ v::Ã?!:9fb2-ek O]Q ?] 7! 8Cw8r8)+-ޑ(J]ͨՅc1:#=df8y-y9ॽ#DL7F vms_{{3LBQ)\te+ry966i$ 1ݤ+LkW5ai `TnXPO,/3}>s&?9Cnhr% Zn5lT q ajsc%bX;@[?{+A)OKrfɮvVwPIC_ /])  "F b2J "I#4+Y)V (L(Av YQ%_[SDN0/mOf=ttS{CϼMEY fO}s(-g]{gʬV}t\A?6>Ѝjs{굟 ™a!?e!ޡy#vOob5@4%XMqmÊu"da/>y%ow?>[J@{>gRo4nᅠB]g_XgǤ Eưs(iPkIٟ46/L(rZ"ذ'ڙHD`}1Jy|Q,Ȳ6/j=sa19fM8܇2:$PǖtƖLrraVQzlRA?g\S&o.>Σ::CUI*F(#9JyWIIsP01GJ@8tuB~|m%4[ YW.J&|(Lӂ6-It]]]>.YB~-$vaS1e:`9Q;)9&r._<}]V@`HrxSJƵ_t#4yBZK,m}$ш]}M ӓn$0(g A P{O:c`{'BHm0tAo㰛:TT5#+*?)OxqY4! Ӭtt?oZ/KqDÞmy(,DdYAL&#$lhsQD%h?@y \sf.kMOJ~WK4V} Js(cx￸j[͆hoxM1>hVu}& a#5DJ R))H'`VŁVe~:xB2)ffx%铽 tU6׹`Qjak[c(jl8 I(h퀆6 )́iz8FPw5tW/an(Z1GhWGg 8ngb0ý_nj8otWEK.u_uk$knSNk!݊>xWE_gKAQ^VU:0Ok{`f#8+D T;Smcp0 쨋N4"Ƿ# FG]2SfҌUEQ z 60oTTg65 I;ZDa S2Pa̩3-yvҏQ$ ̝AN|M@GhFU|*w`O$9Pf!,dU΀x*"#}ׅcz\OaKɛMMY,Æ 5ѽDu>XZ'O 7|^w苀t8sl6/}SawGHPQU|Y@UU=!ֻy}W+j aF6*`"> qˊJ/L/NZSt+qLy"y0H|ɐ4::Gb8S[=ьlKVي*Hc/jy4r1qbpct y:GmutGطr3y_8Pu{ $lO$?VUxg}71͞ "W_:;~BoщxJk!ڇQ[5p -c8}YтZ'ګ؟2MS+ojڵ۔a Zư !Q-`M;;|NOu(j 2!Λ ݩUv㠪 h˓뙘fi|}a':J(I=^KljZbx ~t;pՂՂf/фlkI{*{يb "$- !D|.$ ۉ#FBNgDGgW r.SBDSe~xqŤݡ ttSpCsvj0& نbȖ$m*PE'ޓ`?' #H$FAm_up$ %lR|>eEeVU\wt.\ZDXxV!4 ݟ(h#iclsi<w N[U΋+Y?QD%mdQ$d$h?iGʚNTuʬ`CM'+pJ0J) 3'kր|$ծW9"!H^ [(hA=j0Jjt̨&,] UUwU.=m_S{tu5]}1G>`!@"LF@Z,j:ٱ)q $jkj(K&rɓY05TY GT˝}Y?\HN 1RscAؑAđF$9dE1@4 r֒Y]*Z[~F P#2bdUrP?(iq˧k[?â58u3tݾɮ k>ΚJ"D(ʀ hbc5! 0͉dZ}JX_YSӹvQ>'MJ!P @S;ԷÓj% m6::+ڣ/ GE4bW/J]=DɌw'PQfut.sOf:p0,x{ S`i:՝|^݉U)- 'h܎8aW/ލ:̚ 9͋f+ !Yt8àn|cJ'/k҂zgܤm>CN"pŷ3𨆪B'T/)eb!qشjkp:ߛ:::::Guj1p7rb:yN*iT7{pK-IDm&lyI;LȶSe 3$$ c(#2YFhviP⡮G' DGde~S 0KsK3xvSHׇMUh]}CQϩ @~Usha_ڎ uA|!GYAys Z%Rѥu%nj-`N+J8V|dX ,˸֏TF`8z[^xo7\}ةgˊ֩3YLNJ7"p}Ľn/vπ=Qx}W+#MgjI C]K h2aV sp')W.ãOn͕pT=FU50i-n@^ۮ jQDQhQADUUA@VT-G%" "+cUb4t,_:PYpTfѠ(<[k}] @D#G-STK6dPUIFZ%-wowMKfg2{$ kl ɸҎpWQ@L'yLlDݽ(*|i%ww[۵ALyL~FRY{f#i-$yx6wx+q'>_5هnhy:&Ldх$ ,[\ȢlƋ殮G$2LUpWA F( :η.r&4;=M^"F %1/ f(4=cވ[Bpn@Fv<} E;5nL92id%#0@ (*t=??쓹`2`HI"id˦r'ŵœWbf!LXLP 8"p^>޸?_AeunOL$ dg&JE̛;f:::#y<.`'jVʨ/<@'DWSI%Z!T.$Fe*>;wcpۡs5>Ntۑug#}C :~lOAڅI_)/_h1y)xWݶ l'W vn S|  6,E"q} 5+_߯IIF 29z2p"7{X6;AAHv).J㊋grg28};2&[֒|\YA_kʴ.~9avTh$3|B;Ɖ`^ So(j^@DD=^ &dbct 郻d]}5}@SUպJY% ?׫Sa&Sz i/v!$OM?i|m"ޘTVWtx+1I"6'Obɓp{B-ke:meZtD"ʰtIE-OK2wV'P'1N.Vrܸg77+ E0)sm+:+ ð+s'os'o.&)r{_ {ZٺNZpuVMDA (]ZYAͮ !J૯u(h (Dd,a 3ib*$ SX )H㯣s4a3rz ^~Dk3( ë \0G|ktE/xf-\{r-߸d t߅l~8v `gNe3?$#GU+ڻ'9h_(>²^FE,(TêxLAN+H=sވ7fkNǐo`Mk:̃pLCIGGGGG(EOfČi̘sfFf`=/ZAz,# ?( kI@Lz Yv2l|?PDF'z]5{Z dr,_2/Ò6I#/-E Uh^]dۇhlSWM?&fE4W =!Tk- r:Am$j)=IOəqUdWK `9{^_+ `ţ A+ѥ:h|yz{Oa]9-Ԃ}ڏ;e=wi?x#SGuH;o!%B7D|v4se::::::"z`puyu]W:{7̢4O>V/͵ۄ3B$ҫ~e&>b.sc~wZ}jh *(@^]^xf*l c~Nxgglp(+6hm5?,k{2]SG+ʇ´[eQ- A\ǑϾv} u [K 9c/ld_%P#q*VZ&t#-d^u**a&I )TDFHVxns#.atttttt‘U9(tr{Z/XFINn5(*8W {Z{>dQSGGgi˦3%֛6I" ܵ N~h}DO~4KNk&x*Z/byj( ?~l$ Zav7 nN-莃`ȹY)c?Cn"K dU6`H;?=S%ivQ<|V1ǡs'77W'?7*o~VɎ6[iBS[u$#tttLON+f0+k " }a4r[ce9@|N2'̼Q EEU} /mJ0P=V5FAsW?NܘB~٩<"6pȈl ~|)3^qReltd7_`mZe^|ȎEGGGGGhGOlw"ˉ( o^OuNpˁVZ:I'k(t{:::Jxٜ8!+ؖDSS'z&+*j;]6tucYhhr+Na {\N6>Ї&q`fڛbRNyrθې`ߦgW`p =y# 'fs-IsqIbnWUxo;$utttttCt 1b߁6Fm|G_IAb~>'Nϡ +?>=j1 1Igֶ~P:::G4sx\5wHcY5<w0(˴sV8A@^A@UUñI ~p!9N$„ti:? F#'~Q"Ke7\ IL8RWqލƾh6bC}Xg~=CwcDATvz`L~jVfo59Ȓ9YhBԼMtxQY%L'7n[Q=Tyi{3ƇDW` Z{Lq{PTd`u mvWǨ +ҿ__)Z'@q#GD@QTjN(g9S^!;Cjg/ ȞQBL$O lj0Oƿ7:M?BU2>mlH}NOEU ws&(ꐙ9{G[[ېtyCX]6/]6Sc6J(}f$~(}' ӧf2cZӦd0iB*F"'(vtQQZо|~ac܊h63D)% ۜ$ls&wyp[ҁLcꓷQ'izb%J0/!ehK aDQPe:ѝPuj!>)m[]"ʻڸ!utttttS@kǞDEpx{C! QKE\.r.ry饗Xz5̈́Ãom4׾d*5D" QPU&TdY ih*LٜqdϧhB 6.uttQ'TiWQ@1姓v"z:ES@xW³`RYjz 6 9g<1/,qr -{-J8B?> Ғ7 f6PN [=2PQ5cnA}ܛ#;0d`"ǡ'utttttq\%<Wv$&f)S@{{t[~ee%7|3>~b}vv6W\q_җ棏>W_eݺu8Ndy}N;v\|"%%ŬYZF#ٴ_AĴ N:qW^2 _GGGN*~( mXO ٤5H)ѳI9<ʾ'|{jXE?9k+k(*o҂ <^yyBwCff&l߾ʘ pƙ466n:x ֭[Gmm-~U`P&nc-7[{5 0!^::G;@>",sɼr9/%i$D S)-/vVL0=p|m(iDX_O E<|ZI+p7Ƕ#6L|ϛ7$^YaOԹuƄk|_r}ސ*܍>QPHH!qvcJ2i! $L6C(x+{ c.bU>tq4=& ۇwWFV+IIIL>KrpBzv饗m͛;::뮻x"N\.>ZZZMjjǑu]_ʕ+Ƈ~#rXfM=--ٳgp889~@[[;v`ӦM|ǔQ[ },}p/qY0w⇀PHG($FØMEg68eIBUU&$ " !ADQu#QؖDbx ٮz6mK0$A+: "VEp"&}9.2F#W/ZA+Xb?ikkc߾}]+Wo>)U5.z~+8&DQTܞhCEgGf @ "b4jA)ڵLdu ""tƪ$-`4JȲ((*($ ,fI"3Fz\9Idg&a1DVIĞd"%ق,f;v/] `X&YqD=qI uFuHI&jFfo*d?nI%M `(')'~}qD6%q)-3M0Zϩ;"[Q3 FX%g aHRY! (bHM&ĝCDUT<~WדL'ni  ڨw[9F,%y:ndl<~h >:::::::A`ˎ|n+8bZ(xb~|r233\fĉr, ü;s=p*ߏ덻_e$qg`4?XओN⤓N?uuu|g=EQy7);t y44zp{C2TxH~%IDUU YQ0(b2IX-FrJtJ& SZ΄2md0 'e|ph*x BKO0 ux#1OE_qa1쨅x*]&Oń_\ct1~CED ~%l%BO?4ˉʮV<0^CN 9b|ܩY )AYk p@nk+a s0Z+ gC݃gӁ1K>7UdDV[΂iKEGGGGGhNxtͭ ,Y_|`6g?cĉqTVV\*ž={m݆( <k׮M*VH欳E &o|~GT׺X+.9} }/ oy=҂=,kaeNZ-q{e bIIP4!TʡhB &jb1`0HHZEwhCVTLCa?5G֒}N}E@0Z?w19Υiz]|{kQ!P`[rXI_Lη!1۬d j3u$M磌fJ*lDgjhǨu& \^*6pmߍ"4,%gcF7 I)0ky)cv|SִFݮ*j2l.utttttSMu8{wc0׿Nii)?OYvmԌ׿5w=3[lT/h viL:uW^y%> uuu=CZ%~51ȲL0( IEmh =T _?S8^owvQS> 泝NHS ~W̉ ֶe#ڗd5ɼl9ѹz/eZIs'4op>G ɸ$D^ZCiX GdvW@s7aj˜o&A`2`ʋ֝;Tk࿛$)@L!&ՈֿZi#1FSa&YE1 &vwß98fSo+d0X|!9%K /pwOѳ:yJKK{n.jkkc)bU<ҸF?EEE̛7/*نZ<_޲V^ykqP 6oo??"no̙r-c2?Te/IEEEOD㏹+~ǹ瞋(<\2`0FKK|aC]t2v-} y:l'>y孽tbuQNX |yn<)0JX ih%jw_c~qwQ~4SiÐ@v0`rD5"_t] 3iz}|;*ciFBP˜l7` onsԗPQ))yH$M{EXSE$NvXM(]; #4loÞi0=a>2w&X/h1!{dYaWE';cc6jM%ͱkC~LF/̞=[oիWЊsNop7sg?9E ˗D YEٳg_2h9Sp8Yfm;֑ڢ(ݽؓ|雄N}nTUvv.:gi#oplPP pu/9 @.YJS&Ӯu<* Qp1{.ESfŬl:\ 3I9m6m}@= ~{v  ~%PX`)O緝:,™-m CDQ뤞5G' iׁ+fWeť\?c.!s]Nؾmm-=7:/%WE۬~ VLc7d1sQ6Q@uS'`98 uttt9fW~t0JLI&qW#eټKy<xMMM|gg2eL{ne5WΎAZfVɄ( `@E  $EQ$)&WUGeEAeTUEQɲL8D"Bng<[v4т?(sGZ͓IԪ/- onykhl=z˱[2K˜ZP}m<ɺ,:ۊ ȸd zD_·:fYk硨*  )N"η7z$-cnn rmv.<-aeު>ocg{KO_BR'ڑI&Iis'0;N/I!Ni%cOc2ذ.ER8 c/5iiid֬Yq444~PXa#d^z饨ePO?k2nnV+˗/gÆ Q뮽-8;d_o#BJJJ0CzGwߝ~?>`0H0dm0L])VH緱浝wF ’bf? ",Q۪otGu QYscZ_VPp$q 7Kb0$(Zvm\{@qqqRQQAjj! f:, /7>E,YYY 0;v0twfHOO'??̙ '%KXt)K,aŜp ̛79s0c LBQQdee%|XgfjsVLo:࿛G>y]OS>]A:--0d'^|lYHBJw=Bww1v%K1]V&:<x!ij@IoS~:9SdMȴXd~7U[6c?@ .%Ivv <шjnFVV2ydJKK5k , //Pu=7J"4TS.y)=nc-6xQ NYd_ofF0 OTU ;F%-.tz1CɼT,S@U=~~?eR97CUշG'p+@Y}1' S~Fc3D3|&0+<Ў\|\_MxGnT<-CHB @_{ñ<)>n1::::::8>OULjĉȅ^>Y ''?"A@g.|T(փ.BH|a ZL\w7ѹv6 d_s:t/ql·Ccp"{Aƻ"JP1$8:|('\^<{ʎVn]>wnZC=1O@ekL/Yv;QGGGGGXKl[Zw}ėe^y^{5}>~iii|O[[[O@cEs9'Nqs%Q_L `6o(BGG#B[G ϼW,)4vمϖOUQ%X:h6Dyx6 XݧZz*~\wЌC"QdUTTBijwܗ̯yrOsHAI I⒄Z[v4n~FחyoOMTE #5a >. |TW}guYX%ƂB Tps[8NGb/g\2VGGGGGǜp{b/0f̘yGzaaaB¦&dY&77T{y<\.iiiq;TeYQ,Xj56{(t2w[-aBqE3" *@`00Qp IR\AH,x+>&aӓFəu`]tpS[[_;aDmw[!_ {zۯQ i~qm:Coop`JDh=`n&iEvDƦ42.;UVpBmԖpA"h ՗Ρd΋#U{l G%E$%JV$J\=e&m*0=5O:3j=$«ylVZK[m{CRuu;HeMRe::::::G#T@8ʛ{EN;mԁ _ .dŊ1wKKEZ[[{Dd7&M#OK(aH @eA $t8$)տ|ުu ̛H aҜ1`P汧6L S@\Q͌}q|F>isD_TE|u=u[[G(yIH)Z&AKkGu\8qʫ,#q+íDڣ݂h̴ Λ%m씦X .#o!9$<"Ķ#R0a Fc*P^doY|.l\ Yz5}~T9|I6l@cc#k׮QP(0R+G" n "lg'xE*H^o,'7(&|aeLݎT^xun/uN:eH,3{_ +?:8MVtD%gW=鬒!#kigYw62>LV>oQRZZuZA@LKkDF /bHUi'kzEx/pؕ8=u0H)IޤfRyȮ pytrmIDT5f?$˼_[7>zvoc?`0MtҘPÑq4f c]=a% q1lC -m_c||+Gpp'dYbD"QAכJΝt2.fŀt PUu7:6Ј+G M-^n (Jinhxhs߉z (F+ Jbt\^*6qEViA!w#$/.w[-c\b)# #g3a QCxR C(LrpAQ`?mȷ?~uD]ev fاB}d᧪*U5c?c*v}ML$I\|ö>/k6.r+Vƨ1Y~JJJHJZu%I"3s9ݩSېUT_$b $%e0-6vn*Ze!b)q?6okw ksLs* `n?o $Q eŜ(33Hպ&zN4nvc ]i{qW(Hš5<1PK"z`yc}ƝlHơ}e_4)ljiƏ-kyFd`KNhZT*t}CJi:q ::::::)L Q|S]LphZ9묳uo&Z{ HDr\ofl6fΜ-#Z7ם HԩSc,Ύ "8 Xvc[pֆ^HNTYN/̟Yc梁(rAH3'd'hA)5Sg-jm^[ AG\)^m3NתȮiіmr νCgڸǃ m)=T6+P%ل1x2+b Ծ|7y yd:VxHv+Bdi6kbm}'!s̸t)..fq1v[=cUUIOO<`v֭[$;;{O諪J]]=rQ]]֭[ٲe UUUDvl6Ŝx̜9J=% PU"7N[dgGBQԄb^Deyԝ9 j;@ I3M7(o o,ҦPh`4`3w;4( @g:ɩ|"uwXM(]; #4loÞi`gZ pS*F*!45^,n}srlcҏW I@NOBUUA:J zo%8ـ{;6pG4 s0;h?U%:> sjk#3#VPGGGGGxIBGgٳIIIsrk׮(L0a\ggkw8`[[[穧'xtw1l6F#/2_|qBLioU\GdDA`B '. S5q$p4(rT'z߅#2@{fxF֖I&c=6Vh`PO|gOeB@{ۿ,"^G@{D#A}r eť\?c.!F<}=Zzn\ >\u^2J$ $2 TYAxo%D\{~B *߯.LKD.@sG]ɝ4P}[*hJҊ/-|y l#AY歪v:v8$)CL0 j(;_~zˏ::::::]3bF#+V655Q]](̘1c\MnnnL3 _wy'6lp8<D":;;ټy3_=zkvN'|{/>ͣHغ7iC;1q@]%7=k1Q$4_LU2pirr2vB;)ë'/A+vUε{tx1zD$QNt h#%'Ղd4h NUA QLӦ=xn099}WnVF#VHrr2vm=++<4iӦMfEΖ-[ɔc 99g`0*߻w/~+W}z @|G.t- Q{(Q!0ێ6/ȬYY_u >-b`ۢEeӶ? ZOWLҴZ԰ܱcr ȸ_δXd~{|ƚZC#xCNH)I:m 嵤5<⥔$&{-|}?H\رD&8n( j Ƶ3$bH-L"$=ΨfZj<#RO)@ H^1nz V4ߒ}D:<RV5,#w5u"[( ~SVՃ Nh?Fz<iutttttV@$nc->Z[(\8mL&ftJJJXp!vrʀ*v 333y;\M$IQbΝQÞ'ss?~>{h5d_VcQiG#_6T 8o%pՉ* =~swtJ&`ԹhiӞs{P5H%ztz?pZfE'~ٿ?D=RUH.YWJ#El"Tߎ cX \?~"ƮPUdrQ˗Nw'Bw]vfk孷ފLhnnpӧ'JJJb1IMMeڴinh4b20 Hh4y^8SϏJ*גp0h7$J1IF47ip, e9𥋦sڲ"DQZ_W0\X_/o_|W:  kiaߡ3p,wgecIF#Oޥ[׼ϝP;G*N¾xZO?vT1?@ф&l7-d0SKS~z»XMLZ- y/J.M`4v ZUE Gz[*w%}+Y *C sL:c9V9:r/Zn ZeAv'|>UUU<쳼⋜p \{\z饤kgnz, ,7xb٢uuu=onn A_"=.v\.Nχ,˄B!E |M^xC CBMM 'OpDVTw{_ sff1ʲKoׇ ҿk`G21`oo-0.09@^ ' f oYQ}86 fh Ee&n\Ǐo9D({psGo@$O ;j7/.$Mk $J\=e&[fpIgFDxr?:@"[}>wk95{H=gbj8BsՋkb ,w)bxp%/_wfGY&%Qrj>UeU"n&3ӑLKh[2S' T4ů6]5_TUGGGGGg9*[{gfg?-<r蠲uVvMUU=nTU%vZv_Ƞtԏw8dggC}}==]~?*a?{}\P`TU>^SoZ͚8eV_Ƕ]}INNf„ #?pkBcxB?en-J^wMKüZ 9p˙G{ZF" ~V(E&;C1JXs74̶i7.?)Jc{ϲtXYA,jt> 9GaX۫oh~Coy9./,,/oL?(`2`IҶV^@.'#2%Gy$?,EJM/o^pk'jDd R\ƭ7.W'6@NGGGGG8Ho {jw3yd.X,X,rrr`0H{{;ׯ?wޡ`0U%v\<=m 0k֬C*8ٲeKϱ577#2!m4{wQ#!^ 'Lt<:o4f̘1P@Hpk@EQ͏r߽sYSyu\EjlGViUKBA_Y]S)KUP(01t)+J7V,%ѭIf\Ȑ(Qx:$"qe>i-ysa$ #[\wV[˱/2Ȟm/MKNV߳8>ֱlX0'ԛ{94nLIF&,"AC$=JҊc{i $RϚOYõjM 70}MXĕbBAQ(+o`ې7 \ve0qssw[o͛7GUE!*d(rgȊnL0Q{nKJJ %*W2mۆd́ػw/۶mc׮]tvv[+/ "IL2eT}c@[v] ";'نZ[u5$ GdaKcB~jDf$vD8sdk[A*d[O; 7gbH̤:l@a .kx|6۽zg"f7zIDZpH 4m%u{QxnsWg/q!m>Q)h$sՄ!uxIMApXgYȝGg3@!DQ@4d, Iس#J  y'iwFUa҄Tnnޏ:::::: GE;ַ5&NKKk_"O?4?0 EaxWGJAAAOJJ l6$*B~;H(j,v]K,Уɠ ᅪ_brJUᕷ_@Yy{BAX,7V%DQVxdŜU,%۝~}7`vmŋ Qb*[ᱏႹp ~ M{mPuް[%_B EaEJbKγ!E!t\4uVm݊Fw'ۚ;8쐚 )`#)J{?$ặI(*m%`HahijP$?1OBEPcMDqb(`M5cM5]JY㡭o@J~YSReX F8c=n08`s4aL;4uj~kjWcN::::::#Oa~lP2Ap8\pVdn?|^y>ƪ?O~??yyNu8;;IzP(߯r/Z=ˆl`qi6/( /ÆAl9ʞ*'MNY褨 wsquCky쩍:ۉ f̘np1XHԅ_"ZU;Սνlf߁hMTF4J}4ͣ]DHΌ4rf bGx9)SyLQc﫵@ @?BGGGGGxO;lј0xETN?tosgH ~sI'qwS__SqBKx^*Ann.$kIH$sq?i$*x |>߈#٩V~%\wt*Եzxoc-kw5(^[5`˿d1}}&TU=&u$(켎vi\|~)߽a <~ڼe;OQvC':WUUkZnW#gUY‘cӒXOhwz3ZN+9mvͭ!3x>Mm9OHI>(05w>O? "ZI?^| $.K+}vG: I﫰5ȲB0хttttttO8f2A. k7̔)SYyx衇HǪDz f3wy'g'd׮]0 (ʠi3$9{ZO" \wt>s*v7{x[=-~a ֣(A 99S6Lyqc0⾞]V /.F_# |^%;Y4\<Nl֒~'CD $B79h)sŷsv =*{&҆7͉IMš2k_ߝ PUZp<֕?#\#xT3k1mIXMlf҉|*jh4?.gͳ>5\e^{O?na܏#==łǣY  7W\;ؿ?{Ggggm?j>_=k?Ċ,K]x=Z7u .IyyyJo Cs1`4&uDQ#D=om~**5N lM _gL"lNbn$Ě=ȱgK)`>\Xx چ^0RVkT(q}r)|{{AQg/w4ifDq^2,S?;N8h2d21m4O>n7FcⱒG89G#3e߯˗_1]E'{z-sxY0)~zuˑ&ukP|ܟ퍹]2d(}O-n#(yDw7OJMf<4ғbT/.+fu`hSHTNxtUq_kAĪ::::::rT$3J. UUeݺu=scʕ+c=w]/_΋/8``xs=`Dl޽M68NG}DMM )))X$% wy'ab_[c):yJl63g7oL}t80Lq7Q;Ƃ;"~ݓIvINBnxi&8c:O/sfaɴG25{.J-L"$wX &'IB ]^U?.w6 1:5?-I3Yt&IN@n xq1r2MKd evkP ~~$SN`x ד::::::rďX-zǴBqFPU@ -[xo~Cqq|~Cn&NuR$I MKKKL~UUvvEQ&F0s+WL/W9#>pDO˹Wݑcnn.O?h0q1E%>Gg2q%7M|^+l]P,C(F^0Vw*WG٨ٳ hkJQ/ F'F^[\-٠"`j"7Iiw˿Ӫ]# =vګwt(BEshǥ%'D'T2Z8hlj8x2`4`Ȉ?p!ZL @+Y7c I|E#^౧6Ŷos[8UW]ʕ+Y|y>.O> SRRGU1&2e K,[Vrss{nWU5nκd&qE3G,W\7=U[A{1ca f&v!Jנ/C!ӧf'./Z0sx^ߢUA!d*4iܻC~,K (3?!*Q&{%J *+g\ o0on-ŚâKk rN aaŐ~$EU;$eptttttttb8nO7WBOII;$++k=g^unmdYfӦM|_ v{T/IcvL6_̜9I0 q3o޼@]]]_8y衇+$[4i#*UwgV´i())IJ7C @tFFn?I DUP=Dt }># @)fpsGPA1>W 3 0UU].Ը`fϡ8 ;D9>ffU#ADQqD'VE(\q4?PPP(VUU}~EQ0LQdƌ<3qHY$)..SBCOw3xxc4\s\fN?uk OѴ.^0se @SLB럓}Y8NYUr ee$HD8oȇ} PT# օ uQf$sWK 5Fjö`y+rcQ_Kt})>=^EQwTUEhh3G'paqQ[{@he198&+k:fCA`ҥ̘UEN:;;  BȲf ##Nvv[ϗ-[ /=x㍨nvD%&OԩSH?w8vXq،hXsSlɓ;UkgAq<^yOyM90^ρ% Nfúb>J,&v}òJofL0xAC=LRrT_RlpB8&=IKLI@8&/!HЭqbH!,Ȯ h{)NGt sR__Ouu5x^As H,ˈ(#f4INN&==ɓ'3o</^ '@vvbB{@7:p?pOh2+`0H]]k׮weݺu444G{=jkkuZ bdl>c*2T|j= x7Jii]GL&SOK_|0ሞ8L|S?g6d9HQnȾ 66|hx*9v{ѧ퍻\N%QU"5qD׸\;n_;qĎKN\ˢ(Iuno+:n=?0r1`fz\yy}m1P:3<_6 jbVcL:S O\#)%GW_e޽5-A077G:;vGrFGGq5I,(;vfe-oK^!DuRA?r 0Aд}d#F,Ƭq|JX(G7.~Oϟfl"4Ք sf]]5ԳHx<-5>դN aH5gɑR6j/@J FhwBO7w{W8u?Q`nQ)!bQD0 Sq<H %B%wp`0Rꄔ^z7?FH$S u]fggfd2<5\V ֪aƳO⒯aܹÇ$T捈eY L}{zCnݼ?C>\4x5Xbp [tk伪@VJQA= yx&ք@*U` -mHԄ/6UD"ƺJcBM [k (ʆס@hx6t@h4@wW_[o=Qsi~[bI#خO2nzQKJ!(kߟ:矿L:oYeH3gF;n{ou$_?1d²,ρ:rc3r5I f]1MnwI{isT*9>ɚ HU`~-O_4[ g'UK1+O{}*[]lbx۔i}r'HMΒ ADWz Fh4 s~]={w3} f"*GiW"p=ӰOg.Pt dhd}{ao7aIQ8_G~ ]]:t;wb\~͛%4;|rmz#ͮ<<d׭ ~rge QN]{_L^_; ƪmQixlCp~ KXXX0n}qR믷moa֪bK=@66iLC+4FiOx^\<_s!~wRL|p* BY?`*؏Jٷۻx~n=EEèL%-l/pǹ0igB7߼!aƦkB0`]5cz_Voằ>&\ppYR1y83RY R*Y2Jܳn ]`?CD=_\E}qoL\0:H)v߄Xsɇ%7t FѴD46?|X9b`Ǟ8ǧW<o w}}vŘ/F W8zn\ѽj !DփyC<|vb'N*}rܷu>6ƿ'9?ּA7tƞ\K)7 4*@%4ÙsuLD1(";~==> rܴ3y87/]*^{D~/\T*= xjݧv$˗!ۨpsת~5K^C+ ,BP Z%AXDWX֚h4JwBB;˭VtS):B@*lw߿m]wʼn,|}'.1PE?jS'%Dbmd׷U)Sٝ/'% W{b`$ ZBL>ɣFh4N|拧)j ٢xW' }O?05`"%Lx\~o_/#oN6sMћ 2Ryxoo/t?,W} 6!2 qUں5Wl| $qSsOF,33+L䏜!p=/3"b!^~FRw$a5Z $~p;oÛQx"_%q/O ;mC/#כo !_kZ3ܩ _% V"b"INԀT2=4Fif4n8}}޽ݲ) 8ueO|<%`Kۤ8 /fm'$AMg33[T7Qvu?fo<tf1Y's7Q+Mk7FϛoC:R%>9^<5LԴ!-EBl @}Y1+ b>;Mvy-!w~R9ljB)U_[%5y[k? Aj֖I=ɚv hS8zwu׸8F$[)en)FhVJZ^,WEm)2繓<O:ι4鼳A5RMߌ`脽gRJrz ܅9/iX]Zv2_}̧K:;̬2?˓:$'JlE#& ~'X_ӿz  +Oglȿt.n1bDyE7 Xh4Vcӳw"{e=ɥ_|2{/12%*$ir7.333\! z`hYVVlLΞmh߈l%2ySGAF p=п ʑL2H+9Bѥ;ƞ]=|߳ل8>["oE]$( ɑMXxUN]5xA%|4FT:6noW*x(3|RCo5r-!w}7N"\ww6^ z͢Kj͆33 I1.8u]~D"{vg:m )0:W7u!brS#@gtw:ClW،:DJ^@j4FH<֗$ݜjD//36YFap7?<D"njH!FEjKHS3 A↕OD1S)kS ;8.]1YȾ>DԪ0e/{uWz)Φ%ڒ u! LiFh4б 0'T"ҒoȌeb/ҙ).Mp<- 1 .vɻ.۾m!f׮]$(!殮Էl@$4M\w4K54O6g35]9Oӊ֎n5 sLL:RοF2k*#DQ:?pt=?xW{]qWF];Ih4Zѱ ۺ[y9". ~|k^F qw7wvmtuu5eYٳsj "ȦW;o0)X-bTD봢%y^ .-l| a5U Lk(|s>?Ww!H&6ZDh4M&n84H,jẋ"EQ~0>[XfyI.g97!w]UQ `-g~g>vV~ 7OXl+,˪ 7 ̼vt`|2`$cӊ֖3ѧrKׯֈٹ"xHR xwx,A]LcL=r7CAt["ҙQ?*)6Y$ˣ=Ph4c#齻{عe#S9Όzl~&X nebf gg46T YFrLI׿j#(x|>Xξ}ھϷ-_łl\Af_Ilćn&ff{l[1;`ģ~ 9:NH crƭZ&l^ܹ}^i{짞cs/3D}z a$:LH~36G%'~UgryXoݬ4FiMǙ #O=L%/S}rd:,.KNe8w,FƘ$S(Sչ-,!~:B\!Y{affPYmj@y|@ WF35PM# ܁XLH >W|l6p5UMM}=,rl>ND:s΍3gz$oG}m$nCd{VVrOR| Iy A&(H?Mn,@V-qFh4Y໾v3'U$*w4 ~Ю518=d3%N\J3:kse||D6CJYcvB`&۶m[o |;9tǏgE;gF_읕R2;;KXq,AP((S1۶b]v1;T q_฾gRY\"Tԃ }<˫﷾^0R68WT}u5 ˲(5366T?nW.^+ki0yZ`x~@$ruhA cCMgk>wBM&2؃78dfXvS365洉oG~?jtWt< _%1Qd!mįI.;0QTc#g ųcW A!(:*_KBUA [x4Ftp7]=P8]k|详:yQZ[p^'* 41*Iv<&&sXA21 D"B;ضJKdl[A@H, d"B. #{,шIW"J"f'/)9M&P(؎KtɛbF)J|k_+_ RJl" JȶmOښN|+F+,(]P|u *C$h 3=X9 Q5 A}F|誤Qy$_uA 1Mu2(]vzbp-LMkj|f}=*u`;.6LiQ Pc'OFJ@ S*QuH2LaHR0(@2;_l8_h4M#W=ٜM$b/8X aTQf" Kp[3sx e֜q!/#͖x°J㐬Z\7`t<̵֖ 8? [O\ضLAlJt?x/$$GO,s|Tw7Vs6o X]IK2oEYaDqv xsg4^ JWaFl>j W,quٜ@޶}JG./836sEryLq}  (]waL֦'D.AʓU%#$pjƠ^޻P0&;2In|PB:Bz#C`B?ҕ 1GxUV„Dhb`>]UQAh4Msǐ"@;>m$2}NT_:T2DcUeVE @Jr{n $SWyA1@"]NXin;LOfw1 a]qj|e.]܅9c:n|s*GĂ1`EvB"w R:Kar*C?_$Kl_P$%OR P$~ )P*߷$l$$@='חJ5R] u\*1Q_y}՗a 'A 2v !fѝ: =S'/M7Q~{П|}XF$ܮG^ 26,4ř4v&W *+T}xf0 x +%E+A+b"(fŒFUӘi4&ClFhց\) j*QΌrpZ.sWfrmꦀ%!L0XS^)1_og7퉓zcAO X;j1Ɉ b"$ʳ޵*r ]*A`*9EWn {VPŤ/թT A9y!)n9qe9YW>-J`,7(U/g T$!ZD%LCf6N帵 u5_R]bl}1vR]*y4MFͅvX(4ASOc|&ǂi az7f xz|4+7lod6@GޮAACÀ@oBksU\Fh4k{5ia+TJ`kkzsfΥ)EKYg▁*]KѹNb?@bayH&zb\Ǻ"KgO1pB+ [>x;1$Dph[ Pn;QI$WOL^j4Fyؘ;-k3\WT'4TD0oLvΚFn@ `6-/?2+ecC:{{/2.N|JO53 k Y@6 7XD6)Ïa+D&Q)wFh4Kq+'f1bhI+Oi1Mx˼vJlϜG~vzJ7"= f?u>JFߞ'^ev"ط{4^wݍW.80$`v_|IlP7{65: $B.;{ ×IgJ$⛿mBh4v[7\H{ ]Q-l,f脐l w߱~QΜ]|A%`d?"ǿ|}׳;Bσ7۷ kY)#yrϝplA ykџ,ˎm#{uR 4[(~n'_"}q ̈Em vpC2wܚ ,H$v@\c'6qh4zv[t_V1rh6 h]' vy[ ?6~?G~v\R"'{F"JtG?ѝ$oG=$nC"ýJ x3YrGΑ{4p2AA~]S埠%ZB_ϟt_Wkɗ8nU4tJ #b<?ÒLj?{0#~ 7翞m=q.d;>O<}9d҂Fh4@':+Y,\O) F@t_O}qݯR/d oS:;N8"Mb$bXݘ`VOk7 \K?Kp'fsx9민`\NM,p]/ ﺁ w/מ& d泌pq5]IvaśYȿz+/: |kmXl%N4F@stU$t_Q~\4 .?_c㵱RRc% %AɁ^^r $5vBJߛTWhZ Yo$ܟ,Fk&\g7D+{<!;NF;zR^>6ΙzZ< Fh6v˛"_MFs e۬Ӵgx=6;¶n XIPJ?\Rɽ?7Ts/%B%ٯK,_8͑W'Vk鳳Նv&-k7`m }Ʒ> `hV|K^mFl:JVkif50 /n|A'>}\53)Sz|29Uz !TP1{@Jk%`^J<i;@&S/^w.L35bgzhY:-23yld>4B@Ki6MboQK@UJܹGK|94ڙi~ί;:3Bh4kNt(9'X*4ڌ2v3OO˹N@p\5_ГR}hC, r-C"DD%* S|ϕ|ۗ o\Ab(+:BԮ+d2W/+/uzVLJȐb 2f9x ) װxQI-<$>& I_̠;j5Ub;"}1Aƌ5SsMZW35mD.0HetŅ?sK^ L`kZy7"tنWr(L2sbc˅︤/_@i.KD7 {_j{LH@ߗﻉ7ܿwh4F':PR/=ҋ,f<}a)+ +STS9WJHfQiI$BצzDOpPAAԄTr'jx8kOQ3(Jbڠk)S0yO8o벬J%ep`m7ߕDE4Y6MJ)a!llgnH:c3;W\H&̧KLHgldsC:c8>7(6/96.nFXRllwVQr\|!n +Naj~o:X`c4$3i|H*O;!ۺ᝷NAp|qwϖȟi4F P8꫗ avn^_:* J"t%"UX,#c^c|"T(8>jJkb% ܐޕb% 10>khl(rؕJ.~4~~lKP7BM5*e앆6dsgPo27)J7o>J[H>Y\fFh4PX>Bp*c6z+ C,k6&G% ׫%Em*EA:SPpI=;.+ | HgJ3!GTJ5®&e_Z$3CN"fr3.LVʥZ,s:-1HŚJ_)zp5^X#aP aA)kHd&gJ6 d3\e(|гI|Xs(\>:h4- ;1xo˓lXvc1M38`Pméǎ4?cn nc\C% oD._y5^T8QLm*BM%гoF-(fV|9^i^٧ ֊^>峍54FB@2UBQ82io\]ѴaR_!T*anefiry6Q"$c붞ucK ɣ_80=c=ٷMɅ|v@v!0֡ 9K'p~gWvR2u,^ؿnTkZoPpe4ó/ci4F % BKm/䁔.M,RT `a#N'+ͥ.sJ.(XAu&ZH 5^ %% Ʀ/-+1 nE;| 4F@@2W /`c5GYf@79+b4{^mtk  *m u7")+cxQ $ٽLǃԏ ,# 690No߻c(]' m7lrܵBR“\ljrh4fG':R@/4bBw*Zm:i)Y#`hl PS-ݺxkFnVM fkEbjL@x%'访i|I{Z&ʾA:צ8s~ Flpt)z)-\{TvY%j694W. m}[2$VS*i4tś?@ԳB 58UO͂\!81ڝ$jtA@i=#@7_j4z5."gїJ6Ƌ E|[h4 Iv6YGb ~gZ@8BoeM=<3_^e$߲LχS7h 2n rp|7)>\@O7}I>a`jS_h4f#2 b?k/)Z߬i45ZF{Hc@J 285ըHn@ԂdERJy p\u{1@˗F5mP&Wwa Bó[e ixdK fA%X)w U~4F %U*~ nb[gXb\/h: nTĠ7VU#DȌ{ŒxLC5RM+fx-OTdHBHKa 9aX!*p2{-XXm.t3Ij Xudy#̧kh4FF':?5o) kTŒichKHm{Δ |P&[.[t\5rm;y ۅ/o xCRTͯ1f4B+Lm!HzSՉj8=Q܅hLMh/.jFl-t%ToXHRM5NĢZi AH#QFA6笻̹Sdm ź֝L:]Њ.(/|e}"[(Wŋ=a&Q|6DquwR7pp10n:GO5F@@Ro,h}wї Ҷ0 H`}Whgfs6ŕ-p3:m̭=^]=wlT|*ІWAw~}51&1n:d|a]WvLlh;C}qdh4B':VQ_FL«eRm%SfCj۾6jlZ3ͷ$C]M9?˕5^P#C*sϨvhzj!KtjْĚK 6 X1lJ[|ީbDS9ʅKOAcoz`_cYp ĤUJPu_ $;5~} 0BOSɒpbL5F`wurOuj) ͊LiU_q_2b;#-jIDɈٹ" j@pá җ PJ;Ѐ$Jq}x$(*v֛5Fـ@u~om D:Y K%WU+ !j*3lW:]7~ln7 +Z ֓;⚪Ȯxu4 {=7Rh4[ @ 뿔mm,VnMSsGUXf+ZѤ XDt\r: ) @ B6@ؓ;n7~A,pK1!#ڝBL%mU "Cʕ#[WvFl`+-n {cX܄޽l)C[[-i tF'Ꙛɓ<[H58sn|eaw/[ٽfH&{+%ڝĊ7_o `@)Hx8=0oƛ+XFh40@2S\ 'ZO$#C(xbϮL lD4'#>0 z\7 _XF52BRWF3m;K%Ё~>3;9W JRZ3ubXo>N<ֈ@dl Q!`7aϔFh ZaL|߆b4 fe9@tHHsls;L֦PG DYM}k_ jhu>t_[,!W" {{x_;oŐ!Z[a:,dgYpm;VRFh66:adI[LTB 5b$Zi Mn+eGj.q+҉PLI r'MG<i8?p5_)ɡ%{ 'd.ㇵBZϿ fB/!~o:Dh4͎Nt#9bz /h!szHNs85 C]s\I_Ƕ=Dڹ쯆p?f1IdW0{22lawvv'E8z%t]CI~gfǶj h4Zdާ5H6͔g2,G6g: ]%MJ/uSzʱEKS/ZBFcx(ݽ K]Cjv%BL`  SIΆ4q]*RdG&{8'?vq_rp8|DLxM3ye|׷ěDGh4[0 H %L!ӚJε &te C]:Ο;ds=d{LjϴLX.O7Ⱦ@\R} C|S'qF9/1tu*_ p E3iJn-PKw= 3i+6#$;:8)qQ}R*{@\CI"?>Fh5:aE 0,yN_HЬbhA0[mRY|!fTaПDB Sr:-ny,G9:KGǖ,+gx>!@0 dWDDV\R6Qz0 B +CI_#77RwHIDxblNS?~' Rh4e0쪀H-/Pj4;*Ya 1ZE>_ 5zHNd lɝmO7?(m99&T$1!ΜI,ǥ!~ iRf^db vp%<+ o@ʅ7T迈i nqwηEFфwF UOZp,.xF&fnR΅[M {+$^}j 35DZ"RU?5c``!pSӅN{N>oS|S'HgJ+i_3LS0؟Cr>0ZQ'fTk0 @;|;i4F CZYc7&J WnHASV$d͂5͸lf B6\Y߷>kk 'W~/_s%)]v)^|^w7w߾?xfkYlN y]h4ftèVXہVhVTL,n VB) 5=۪[+3]r|& gx1փ봸0Mo:C|'ħOrJL^g#SG"nѿ@sWo[xo^*/}q}eKORI,jo/ݼ0oۇS5Fi0*&)lcSSjB4 4f8bNP?} DueʓdjΖR lkr޺cYw߱C|lO}UQKz@)H 2=pbk0IJOW*ʯr0o_oˆ!ȿ}9;%JEw|;Fh4Nt[!(ڞ0qF n^hc*E=FȮ2S I044c'(\9.3nsⅩ(v^p" =qIބ1߯!?|Oϝ#c~LT XD{U(\f^b$C6_)Fh4K[%W~U Q[2 ADi$wB!`{jm2t_L@+$Z+̄LM癝+n@5=ݱ3lOo; .!exN3v{ͿO>u~1ȕL ^S+k31c֟Fh4a4C@ @5)%M\[ry'40 *aES-)k-㡪ٹ"ͮÂ֞$KڻAXWNVLz;@ކvpR!TZ$+$NNFh4wD X B@_wԠzji:iP#:T0X=̧Kgh@&0 Z{z{b9(1%V6+n@oD%׶ԺR gI g6IFh4ND':/q.A{ 0F ZAbU ;d{(7v =mQʲ;9 Z{c.9$gh .SpoODU6|.\_4F,YvR@Ĭ1S`VnDMff ]ѕU&3Ms\͐UJ H;ņMmCF|wPEℜM=f]7={dDFh4 Jܪͩ!hkzX說5֚6P@*b+I92]b ܅Q χ3I2ڃ8+k{{kp@EC+Fh45C,;C1Kpyv DTr5+VI-c%BokVx9S_} i! 41kT9x5!aRΔ}QʄT,te:c\Yh4Zw/!ڽڔFA]AGf +W]~)$k Q픸fc`Y(:,hm7)Q-!'XupwLxb"Uu ^h4*ePm\:rrNefz~+V-AE$bn@9=BIӴ@w_6/@#Ø+ #f5kJbXuɗ Y!1a4FTλV&hvBi<4ѕ5 v}I5Ɨ[ߗ\h sp$SM\7}q̰@ɅL`0~V;$R*͕ ǸLφ'"5FѬ '" j 6 ^@z%*95[b(2b~,G"ѐ|+uٴ] (#ey xA-u-'z*u;Hyb"$R!Fh45A':x]os#VteLenдm{ nX)QS QI*-t14bkA],J3]kZCRcIS4 j@"nUo0nRO6&|?`v~Okh4 "~Yw;upFӄb(:qٻ,Q.9ql.pG0"k .@'7$ IR[B(*|?Z'GwO~ +¦)5j4FӉe3=眠eY&50fƑRB*abl"W[yR6MP2[.^gd,zF`?A2@(f!k32)!07 D#ԣ5F:@r_NRyPqд\?h LCx`H@4=.ǯ%t`U"2.ʱk4@B9h0VjQŶxM;H5 0&mh4UA':zI/kAj4 iB.\5Mr0܍a4+c~MkH,$qVj2W5`k%0oePjUɠh4-tèl6RP0@K5m17_ =,+BL--XufҕtgUVOoD"eޗ38DJh23ӌDrI+#l5FSH.QɎ/8 $=a<=PZREafankogGg"yդ .s $לhbu5ADLQ?9'k6\A uuUVco-a 0DJy&DxDQЋL ADo!$kH# 'hSS-+'01e~kɗ }V2p^mJj2!6Us)c_e@A`eh-6-k3?? !Օq+DBaʂ$L_֓4&( |BA@4MJ0]z˶>H6h$djZcA-};|_J.D;k&0H$ؘ5$_rhfχ4|X900j2JS1 ?<$2f( -*oN4d)5+ڵJZ"@Uu뒈` фS_DH2 @-C #4ŖO^Yg `{02f@ Cꅀ[vj!L ͦDa) [l-`ͮG’ $LU/M-"=/4[!` h i;rob nCn 0vD kSĬR[ְ=DF͚weۻ|-e¶}f96 d&]ji9\ ~6UwzN~5mޔh°t[U zM2X!=Y>MM 96WBx Ń]tAӜJ?ta ۮʋ\czˎT<ī௅'jsh@M}$+vZ4Rh&4͑YD':j/:=־?RJlifEÈ\4DbVE->Z/LR|a:m=qn~HRbQ:Ke\`t)iY Q@_p]V^hׇy] @*L s_ #5:^6c֞ihDPYW4Ko!%0 .<mГX5| ͫ !`gw}>|  Z[o53xm5G+^*s6~ [hv4§{B~*XWvzu$0U^I4}:a GJ͂Nt1sQ&&%ds:iC:@Ka!!rٔD-0:\Fa*"`LHLQUgrJ2BOR$#&iyx?]_#1nƣ&=TDŽl2yG5;Q3<Ь j 8ou?GM^ J +&,8I, I8b0[zm2ϙt@2 ֣Nэj3* ̖ gCz]&B@2y@/nwݱ 8BmC>@3umx5׷GR.&"&V_*eK%_r[2HTe[d\ED:,F͗vV.RRҳ5m2T*&[M:PO=g?%?:O*XΖTB bBw`Kɹ;E ޮd9[̀ϖTo N7 ?s] (jd@E~PwQ"(٢ےnl@ .֜kÌpKc;0=ޫЬ';Ք& ׃i]ԲwF)VvZFi)eV_hE̶Bn#|٧On!7d9LLSI*ЛPjl~82+]%߯EGU{]_jd! j\77 mwnݤo$p6٣L@zZ!H_4mP ztH21}7S7?}cgY,Q_·\ FUPy`oB%JjR (~_^5CC_oƛc{Wt`{JMxK%%#JXgԏ\}RcoH\ѥxM):w+c5i*IԡW $N,I}SHzdD$U΅ f $#|ϭ|˶[Y~INRrTs6ͫqoT*[梼#(~/PR@~& 1 (w_ݳ7]ǮXK !`%@џRJ*)W/77m'4$3%<uu3 YlMUFsDNtXT[hU6nєl/4pIɓ3ky %LTnm34~[hKGy~(/*Q'}eA4NYܽGn~0j[a޿Vjz jIܠuzbs}DC] py2}7n[Z6%[m5[ ;6 D0dl@yAW,6׻ RF*VTeM[m<gx "SD_iF8@7]={e{ݽ1b[/2aX OxR$[lu`љBk]ސSDu_HIDAT'b*zƳ^Ǧ`lfݔ8`O4Ro6zU F@/FӌB =)q} @W bUУHTOo8j8<;6'Mql4K7g;)@e[?[n pj@kXDD`ԫh] fpnt=BWzbjG-ɩ+^Ǧ$[PImY׃^ѿF)Ud CХ%֚6(ƒO`M*NձgHedQmYHT$%yms%NO8;S,#9Ƴb\1-iBwf__gwo]=1㯎ؙ .~PS׸Pzbn잌Y!?9[*wguCUb&VQ3sVxWLkUZ0DY $P)35_dl=+^Ǧ˲^f]0lWJ!& ~BiF,F}uT/R359M1Sj} Cq|ojgxDM38ӋcnԛVC`)8|+~׍p+SKwzt_s M'#m:i_^@F0I=g]"3cXسǗ5~eA u\Q]#&W!ġԎkSaT8K[x3RSVz^RUE$$|[q끁=Dɟ}jFCJ-M_th*xJj4Kc,S':@XTH &$\yW~r/-{U=TxqՒplfd0sȄgPpB#%74j&<'l l2£/nnh_=3mm򧏮}x/_?"_92.L2a[_hT﩮k'Z&>mGPoR@:hc[íR!9o\&f >f <%ˣǧ9>| ۓ1U~Jgo;R7aX6b+*OLsՈ(g^CRhƹLkuP[^Ƴ< ύsy侽W1:Jߕ[nHh?'YC6"0*}֕vڽzX5jI^Md6 dyn/dk3<~vצlz!`goy^8FIq ?ܻS YReZWGB+ޞ/W=~CA׊5LB(/DT[y=訿g=jD`qH>e6=|vLV.O61ltKSo/EMTYD; /5 bMeM=A C+ddQ N5ػ䕱,$_<=w[ߊGz]hbXS/+)+sMgS*ȨSf4k+p n]1h8TǗd/OVFRME@bnfY0V=d -bFӌFV^@c60X-M[d6vHdmU֪V$L56`{Oʹ+롏 zӿntIUm~ y@/vXw5kPnd zWf+6QˀZHd1%sY>< !dX {w?~JUR0T1 6{LfWY/bۂ?R-BݏR':y)!FUMU?0M/$w6#c7wp<`Iw)9:㷾rϜal@Uz#%˯gg/|ߛK'ӹ6`O̅ԏQ$f$BZaPrR Ϟ}}ܴߔI C'"i%E<|a:]b`r' -BHj68W8_ ( ֍.tӈb@@OJX>2rf;E'Ik< n f^=;<~sRQe&?c+pvN S@5[՗Dc!g=um%^ɔ8zn979>u| ;jh)s\9n?p;KK,bշMЄEP\1(?$St G )Un4CHo#J@(,C4mMx^b& aTK)ܻml<=߼4~\*p;2*$:rcx'!!B4F)J=B%՜=2MBI"GLQy#2[+}͐@YRw)%gG_=3?7 77mg'>хM_‡}uSiZf)lWyh4HU"1a$#Ƃ@P${3WH4kJM!<ϗ؎O2E\Om,ݿ:>q'-_APvwqou$Q; zf8'.S#*A$c눤=wP }x7Ե8L0WM*놦=83#_<͟vtoS^"׎gpJ)U_A]18]]vqM74LϜ?j~s|sMRX3RkCqy2)tK.拐ί*4Eot_Ap퓄XLJb o0MC%_8-Z]sJ]p[>R=1^I0Qu@': ۗ ڇ*yERnԝgTiu%^^9>@}4Ej|kZA': XTHI %$~ u eQ+$JXk3'G@= %e_>i/ coXr{rG H?PorGݰL JƈuH'1؋Q5r;7+\D},{x7}rh $Gr|?OKdw3;K;9\@UQbK_D]T F]*/PpT=RV]}0/OhdǏ/~93Һe˄pp;"e6%5{n"dt ݦ$bpxO]ExWk*{VNt8n@Q"] e@ ]+yaLjZʹ<[p|?ao'X X=? \'_͗RbX&V,M%0"V:`;H':d;aW@йMѨ1VQ.AWJKk3+B.܈ ;Syr&b2a;30);~L;g9ϏSoz[a-a]'a HrvW;IkK5} UOF]*P6 4j{&͒ HFacЛl~Tj\ 2%!js\?%@*8p ǎ;?Ί+r%iV'i W@`ShJɺ˩;?:HU5)p lך50.kVO:’W zTDM.TĠPB .͖4Eo/j qߧxU/զZR#aJ% N 7uUW8U[oeЕ\[Tlp~mz֮[JL|y/J% GV:V2g-3 x};?P_ρ}!^ד'_e.8$},(kL %_fnbuvÿӼ|VDU>O>!BQI/*{PՔJ6[Uoeg1Tt `RGbPS2E5A ?N=݇_Fs51MUpǃ3#PlA}65kC_ Z3h01S':ި)6`Sy큔dCR(I*Q'i*E% ] j;mGN8ٶCŮ'sKPE@L 03*1=8qFgFftyQd LTP.psO+UkWuUwuWu~^>_ⰳSfnE1 ʤVK7[)j A!%n';Qb󌜟+t^)Y=ǥzD/۝K5;+zȵ$>q<b3O?𼗽x_b~{|7ֆqy -ѠS~p5;.trWQ 坟wkWe8Ikh +'q1l*sVhvIX_%VVwX,cY*D&1wȺ'}+d%>J}=ivI,GQrTL ŲAh<cF5-kjJٮl6Ji*Zv fߧ .pTLm+;o41f,^]/NȎ8q2ґzL5*QQLTlVXy !M1'2r~f+^z" =Lmevζ!f'97Mav7<Y~mGE<dYoxc_:_u;_=5/CXj`12230:;kFL`.t2ǩGm1pdݸ4e'uel:: (t7rVhƋ `ְa?:03f{G'7u^(E-n9F:J&?]*qZH>L dQ?gkk̯4E[FV7nllj/‘ [Ea놐S'tq /|nvw.d MycTW։j*qFوx1 9dwCS`D`|`~i?Xڌ g!?ɃWV:j0I}ygaF:Vhq3n6캿~ɎP<7#׶=Y9rGxՏ|=ů{d\3khnC=<#eR铭H@"pcZF1qBűyj8spabWWTC2ί(H@K*pfԴFETpcy#*؁u޾}3^4BIԮn唓`RBː)! 8f]'AC-VzO5y)[63cmYJMb'”df&w@,mϸ;oOKcre~zвt#[nrtq w^`:h 9n,U8;C`aǮlt|k^==?Catwﱺʹ$׵n_9RqZd 0C PF4dBU$Z|h!L>(b8WkT66ˈ*zjM\4$ㄸ4iZQvw-R뾅u8 {Np33[R3{:YW걩ι-"&s%[s}n5,=39fpJs@=[-G &;hk4g0uaS"?g]/O??u/#f̈)r疷=vua_9|Zc)%_ _W(_S>JZ#fKm"BRJaJE2]#gLFZ##; #*Zf{v\PÃ7!qK|շE')rk?G=|k7!SK+!{6?dP #Rb̹˸q~;Ώ6c6k!*TjalsB>f>.lTŭs# sk aQd=Dqp+Kb*yow3yfO[2},#cd y2ٌWMṉ<ҍ9-.S֨+QDcP+3gAW0QnTCX*#"?k[oU2~G8<w=r$J3=;` 价@X_aJ -CJͥ /~x*PH4SW 5iDa TBMDD0F!*0Y[ Hh6:F8, щ9f5Aܨ)Va\k۰gzhfM&yF,Q2O&ͶiPLjo)X[5leR*%x󆿚'PƠqZv^;y߾A%d[?n{;nch&vFH!{owrmgC#Y n xٍI=?|sq={x\$UsR^qp GA}m>e1<ɜ7M놣Hֳc,UD K.,}NVԹ ~/vVZ B: {sw~{~ϔ|qxE#NzS_B S.dtC6t5X l= -Y'E M*Mtf5֊AsLd!Tc!z!A52Mc65guNf(;'0PE1u׈/x禊%%-Xi1mqXIV6JxR3{j,՛$cx1uqbwc<Mב\a֛ 0#ShQ:iju,?tE zH'|Sڦ&HGqu$_ \t4чج-/d<əRّ,O:SL|)(dX$ͺ#ñ]3-΍m+AL6ů~[wx ?W*ucjFyfGVLg5 Xl/BfYRD>uk! RԢ(VD"LޒA%n6`AnMnj\S`k2U1(Q)5oבhƵQo A7~.uu WqdmTbL#<ٯ#w2RyK>{Fm?8R4{Zi/|֠[߻9h :J㹒 qFqZ~4zF\ib|F8 si,+q:aL}qnH0D<Gߕ&4[B5:8R4)xw &FtP6%Sg1H,&Z }"q4pdSB)E|5jRQho(m^75獞HS{[&\JY30Vԣϛ/0'疘zm 522ե5jkV6n৿yL_oX~L-ACa\mkRR)ˏ)*|dUau+qzH>L`c#Y-y.N4xG1ܭפ8\ 5m E83jH2ǹ[n{VY)řyKO$usO?kj>!`zZvf-iD̯Dt﫞,6 H醡ŜDD&b/V,nYڨQب#xi1BkrDJAƕx$9R҈9h*@DR R`-LmDry7-#jk%Vtq$Yߴ+d=cf<"kՐ*7֪+Q4 /l? xlpM!BJG"!VW8j0T! O᧾NcoK=̈́dO#;&ϕG4;9ݒR{<ѓ;89ƠwO*TRv |y Y;?HNtr?'Ā+57m5YP#xg=qK<3Tk`t~sYOEK^(,mDQNj8Z+`=$עXҭϻc/}]?s垄8nW2 >Y^p=y$Hi28%GbFf#94!a)&MaBǗPE*Us# *Q#}Pk-bP5(¢k"I{dA1I] ^DCF͌]E:yR!ҭhf?0+M@Ɠd\ށ+bzCs̜o4X$R@-Zh[HjY|Sli qb F +y Ig";Jk|׈cEX,:HSi)|'+zŚ>]GDfPS kEBZ#Z*( $;UXd|cjqvp09|-z8J'M#0!qD~rmKd'|y{CB9NSPLxƝ3;˧l_K]IfG]6kͺB)3wd\2[I~gV /oҎ!ה튀z16vrUjlY:h6MU6 yOg,(\9J7dػM`\磟{?~ia[ B#,0;Qsc\-q(ΌΖD*+K)/wL۟h&3Sr{ 魖~ H| L;i;_r9࣏, !&FHgOy-101ex1:(qvG]h|.1)9K;Ql< 5oː{'J ԓPf*]@Wf+-nهn{/\^i8}p'sjwp: L8;Y4 &L.C4nu3Pd.2zJ ͪɐD\*hf=|qMCyRIsϒ,ŀ\;u$G^#LSibKe>"MVԣdL;rTϗx<(џ= 8ʑ?o."vƊG=I&VpynC`Nhmkn,H,Gpq&GO\ޕjt%%A٨vK)xYQL33nM}<ס$ҫv G  S/KjYnQoc5|n7KUgwm^[ z&"=Ċ/\_k\YPF;cMLi8u}ym/0U#lB'Lfc|.>Z,; x8YOxQ vT=Vi|4O=Vmi'feFlVƤ컒ṒBi8N^lbKD*9.K7( (AÛrגG薚,#a!r!y,(= BC,s6j!Txdaǖ,m֑(pT1T1-9΍8WyØ/(GpMFiR{GV刈YSIh9O`-Df pƿe7/ZXq8;qLzWhfL5mo'QXROxCN<i1\Kӗ݅t(*rrYnui5O3K8֣H4dMG7e"l҅ J0_L>F5kA*sܒWK .LvB "m?_h4]|I)@u[JI%Mi;O,)XIKEQ8=0-5]K$ҘLC4(xFŴ cv}La=rP^ k[v"ڢ+RIOTLx̭EȼiɢF̵FxsQ{R';YZZ㿾1è{ lV3^&3 (pg4񤒦ՊiAɃǙ=8SZ06YVo&H Y5\:kyIh0r`5D JV9jG';RQFѓ6ЕR0;2SrYތ<\>FaiGqd͓J񃜣yHS`e}-(,Ǚ]W #7~btH5-Pa RҦi&0wn_XތƕRx2QtxǙ Jz{ %aht"gaxԣdC$;]W11=yG LHP"QϞ!qq녙-%K!*\wBwج~wa.-;y(cFu2A7WP8paƬoaa 3ٱepd\'+ճmB+eNQrdK,} 9 &ݨMe883a 6MȆЮ1,w}i9F߮),PơZ[a^-=:D0m,^"m17,]#X\;QX(ڶ>I?,Óo[nXz XH,GE1g[XzG+P5CԨ 8X,h Dz=Ivndqu&a^-=R M\r q3gXK[.d1ޅQr\6?LBXh Op~ Ǭo$5,ǐ1N/s33fhm><״iG^;|퐓Y߲nהz$5z{JnJ,M7K' 5Ų_*#:Y%BIi=P Ʋ R^-=+dfdKg>rJ#?N@46̂bd!o󆗩Q썍 x҉rPvY =b~XzlnY/êMZrߵ^zKqڶ84,A<]r8YGcfjeM1ack m,Xډiۥ #rRHpЈhE-7W^gŨE~8 mIx``$wԣt!B%PB)48&c^x;F pqz,{R}y5%CV/+I;")bÖNlV9ɯag Zb#F Špx[<m=S3}N *!pQlD91/uEBY e-fk|k:) "Bj,PM-)!  ŨTL;1w1Oܝ ˏv fsT2Oo`qd. AmIaDŽHv;ޗ8j>bhIѳ;^aѶ3G= q$ڿFȢyv#h:'2x;E1u7]K Keǵ2Z¼oi"݌E?p52hi4ݍՕтi)~HE nF.nu~~h]ZƇ'/oUwԙt8t3~kf;ЩqC s$qXd'e">_#<7 Lp qFMh e1i;;ݿ303ehmjk6yy[kJ zYB^b(m"*[i+2&8 )CAX3q7t4Sb\F<epD/Xh,^ԓe'mFsi?_  uj9oRcc+}NLU 4 lH7t(o'P_GS%%䚟`P-X%!UY>3k|E~oOhc8L)6{Dns,bn]Q0Ҿm'MG+b"vqv+mǴ.Pco;=/Dm˟` RCu81#x8pS=-x= CRj+Sv t8PHV*?7F|,5ՌMݵLj^xLkxEeuHs!vk+/l[n7ղ?MWNzGyJ؊ܲ?4\[i4n_;/&vytv0B!u;~._<m7OnNk6=q`a˾<{cX౿ !?6O͍^qWxE9`þGz u\+E#;aF1_$;7ChŝcJ!FК8Y;;N2am))Xx٥:/犖ov-e+K"BZ &LڍuG4'!1>.ΑNgأ;?X،D7G`sb9fߘׇ rwtn/SyCpFV9F}wfRm6C%Ɛށww*&MpUu Rࠑ%w]CUIccexq#sS-wN?@ƃZbSϴFKʨlF;V%eKフwȵX,$sDz/?F2+B~dbx*8󮋋%@ ſ))C8Do+o˶WIeuIqᷖDmOD9 {ea,W*iHJ__*q Wj|)92Zp izI+뜲onX,ѽ,;]]hK"]b`ک&ySM}v)su Rui )wi ʑal[J8"3k}oNb~Fg*V ꄽlmMځxzoZwsuKdyw 9G(Rgo]w\No:zfgn?7 cZZMBW-MS" ĭsٖC8MpiŲ}7x,GP5mNSܾuVoI]'Gt{[k-:!'ՀJ͈Cn3NOn}~ze:/NA9^i~kj7t oIow?Tߝ^MwpL%Aii9Nh{ Fr\iErk(_~a~t9\ȩ[=s՛fmKD\͵A.ޛmjqE]yXd_b[^wmzx'9<ܑ bB닃Hwt-"b"lIZ|&ϧU9Xb'wIu낼6Ytv1Nڣ5Bhř>[X8+ Ҙ6.[eHk/=޴\BJJ~p|ړJ ȊiHCZ1P=Ž1js7!s, 5 ësܦ|_tcZS3%Z,1y'9yF6Ddk =uZ.c| a,)BΨ:OU6KWMU5aGX 2'r~pk0k|c F C9ω8gIl}@|Vesq"GY(Z`mFvNFP֗?նպ)%= u`?Œ&Rk{RXGa9i(e'TɲJ{ZG}+#Mfkr;%޴4oor&9^Zb!/M^9RJvb\>ջtS0NMֶZNJBpuX3QI>݋󓕇sޔ$./ٍ"'et(\E3hte=,2^%֩4 P1/}F=9\Ua=ۑ d ZZ-Luazimu0ӆvf-u{u`p'\3o9h 6ebLXeV2H c}/j "e.:jͽ,df~y-{'!`P|_i<ʈLJ3Cr>/cG;f'{_Yu6{1F(&brREKM`SK֥k[=O.ԚYϯtu^^?U7Ӻ\' 8L!:,]6djoxV}pLfV8(ԹA;oqx:jl4!|n “pl4-u9Rc;n3ceNڭhj5[OHOo!ųfwϳ SFb Zzkt3V4>y9K,e߭gH47"OU}^z .1 ΅>('y?Ŵ1>hqUUjuχ_6LT͎^:_FSbN( _YօӖAb'E-ӟ+/X bM+[-lJsgF5Okx݉b{ tF0v0a"Qs|} <ŭvP48]Y{Qh"8Z*~=`{sbn|S;K9^?7 )'lf2vu˟Qq)i|ڞ%]厸ʷċÇ)2|9?u\̶j8./npkws|v:=Rxˇ1@H0J;M,;|y;ћV˲;BYv@cvN$L 5?8gkޞz~8 6bڿ&/5nؗ1m#UjmB/]M9i*v]~pGbZ+g6ŝ (L(?ޱt-su%ӣ;I&][zh,=&boEe8pD"J,2B!yFwvl]*<zȝъ+K8XM;MҏE7O/bm`CRYЌNJt"í]sZ>5ψOOk:wF8yD]keޝ;añ`o 7=smבҚoƙ3mc GY+ganňvY,`\,ig&KLbP w@^YRt`l+ϠKY>-|H[q@ӓY9‡#yUm"Gi|w3wJ[GX?3n~qxypv5r vSh-y,C@ G= q!5^')o9 VȰ09ކz(dzfZyMaݯ>,9 cD8ji;vgm^en 7Zk壈9<('c6Bp[xs)ho>J7 X߲Wr=5&Vpse{e8 Xr *` -b|i7NlߧuiDM8ByN^挣uL=/{&Ꝫ„ YtSr,/f:.@n н9tķ hs|G8/Ԛ9|FN- @ X.7DGEd/Mbm|ѹ %ca<qt ڿ5-{s`vԤXaa͊uY̌ eQ:)7&'`S=:Uk!1YqtbG~ĒxzO<*U -._"B {xֿO8M'@R=ǟijox׆7y>_9N4 v[ws|DδܯpWr2LU:^)gN_:[ieDn[uY2&-y-HfҁκqG=Il_o:J%?LN7F~wSh|~wmمQys}w!a$I's/,ĩVn_Ό"*/VO6rk TD7׆sRvlmb^9eig9LlPL0<3ejNjm S<8@X.-CmXV-Dٶ}q&Z!wM3JRsg&3Fg8:7iy<7W37p3~}y4IaD{e"B(joxVe;3l _☲p-q8eaF;䙦 (,mb{ \5DJGiV3yNL:_V]G_+JDLrA׹kܮ\RUA.a.e/lZfYtCZU; Khj~Ad)4ˋ8nCN1F(s'JmF+CɐsbLd&ւE7#DrK[/e~;;<̓6s-q~?]dϺ# .$shJH(۝Y~$_G:|z߉%+l>8E=5-H徽S)kc9dQuTk uBNa\_3Bz}8dU늫&wgBFhBPA >y.+_Ӽ9vƈ=Է96ÏJXHx{Z!Q&OO|2,ju߻93.VOQ Wo4ְf"v jf,Sel;P4G 5%%_3\G;6\sr<)9#C+ /9eLB.-QE,MNi;!֡84<@S3!6JxN JG'6ɓSWX֤ m~w-LdPK|\?etcZcOCAĭQi 5W9oqxJ[-4`pL^4{>cecf9edm n,Y?>6sq=l5!̥& UCo:2%"^3pм:7 F.˲oC1ֵR\6>.gLաH^kh8b޾ cCa*e *@Zqۻ۲3[>鉖33f,GkXwabweB8:G jdWfPa ͨT GNI&Px0Y2;  c?57d/2B$lk *^kzw/*!58JBm@i!x{:cD{#GxwuB0T _ⴧχ?;3glpf<5+qwS2O:|1rH禆>yE5l•-!,2VbGa9TGZg9fa YE5tܕx^sm %mDF8M)n[&SӼT-XnNcY^,3Z U䇌H[!(A3 .?>M-x;u1b|pFkspxP gxYp]\+X`x[ku٧&Uȣ`GD97˨6ܩֱH78?jgk|<3>珂Yy(A +peq8;ZcXnMC /kvް$}-Ǧ\*{v1ŦxPQ[R˓:8teEns)(fNz$~1dRL1 @gA,2.k#bOe:y68LB2" )A E|}OR ~*||G7DOg.~'w+B6(u"kSkc"] #ۜ_U]C;}xM 6nٞP ћV2(?m5,Dkm,`Tg'JrCXz"CXdzUss8/̏k\m*ѻ! 5!EJ basj9{ȶHRSg? zaQ޹%^QYq5h: co7Ԣ(K nA5 Q3~!+n+|[e =O?[yy-?9l1Uf&ng?9T-sVێ;H]f(!x35|=AcCR4'0,-' %~Hob"xIXHn?g򖝩6bS.g9AhmZX>X)s0?{6Qw5R ٧0_@9Ym#5~aj'g&|Lͳ!Ey8>_{|sO5ãdi#ZA<1D0MrN8K:`B=7 {e%>' .Ub3:fTG!੺—k\Ps\Pv B4(i"DX_m7N X^'RS5wod@%ˑnTYG\ˋ5XS?Wp0P3(2%'IVWQeȲ(գ8d'lA`?`(ZcEXD1,(, υ>Iad帳VQr\S2dS,F2Hi"zlȒ&q%͙q^ egDm uZ],h[(dad6?֦ߪZ*FQ`$h`:-)0V|vd SgbNX?`X+C.o-4VX]Kmeͅ9,>%+gQld \ײ Jmg,gM /]#VJRo\X+`RX?KolTMj27l(׎zBtl'`a8,!Lj uX G= q'anhXDױNCۖXfYYuZF wĺG,{KjxeݬH,ǁ1ϲ7A+UJLkѤ=;#9m,wo aEj M=GhnJ\s0!CtƼ՘0Z2psF--cۻa33f C[:Fͅn=RMc>VOiSC_73in,xi5wö}6naN_)̓ż+M瘲11%l>@)XްEHnQ<ϓ?AzI·AWɹHs_ҩ&sUnsNnLM ɘsY}C.}xRn/;ݬ@F- &J5OuXFև)+aaicɪNjEu(5Z706ިm1I9RA@vG:b뿦@69 gǁYB@-m):4a"?NiڌZZokLNpޚ?ڜ[[|Mrz'D'Zx:݃8j@H#<==jJP}}c9=qVd#G8?e,S (2=@/Dӈ)FQqjU}=$dZq`bNAȟe8Wl:eLwonw19!mwh)n[~ڣft-#oi0;n2F,=a?)Kv 'JF膞875،$U݌'E|ԶO֞;9ta|Qlż VPkL5aӑ;FSڏnt,{3A()|Ö=kCv#B_سDz:U"[\-鴝R̶HD: Lo'5n2un>I{J/Wӂ$MNQ-#=]K SdnXɦKgVJߋr"=1\J`r2I6=[oM)a۴ hi)Je53v*M0isSNm{fq^ LU=0$Mn˸}m'nI pm'|\j v췈\z )Z2۪l>EN#[ }sw<:,;+`mTmﴧV<<m\F,Kzݲ7f!kԿ,p|e9:PϘ.2Ak[WiBz'[Q)t4a.<6$Mm.rLbhҶ-t*eӆ2W0!%\,۩5{%A-l'­ PLEiҼy#dGMR%Q.3ܷXh W}aV fRaB|ªs[0u`XKƃq3C-,Gzٶ&9nKY+l K_XKXtk92;cEs?6c mβFXcMJ¨b9dDZ绥D̮-:,M+գ8тQ nϱz{|dY,w10@duD1o2QT`su-;8X-qsTJGXU^QGb9霝0R}- Se?Kz kN:hwݦZzEӖ'^-H%D~/6#2eCi[-DsVGҙ+ 6pXQniZ#cEFJN%>p83iZiFJ͈ZرQ1BaLnjucJ#kZt\KXUۖ2&KVZ۹fXi#j@ SVh,$-2PuX #NSbΌ7K TmݿO|Rl$p8ʆP #Vҙ F26lM(`dq-X"]035J&<f; 7Jª0l$βiT]gi"Dl|&FRk %ෝDQBK6aV7+e S&bIS$ ى< /:,(,E7g鄍0L$:e/d}hK+Z{qO)vNp qQr6R# IENDB`fastapi-0.110.3/docs/en/docs/img/async/concurrent-burgers/concurrent-burgers-03.png000066400000000000000000005216171461403617600301120ustar00rootroot00000000000000PNG  IHDRX#IDATxwx?UŖ{/l %!@rI~)7i7 @15^duL1Ѯ+[yw5;3[s:~B!B!4L!B!BF%!B!qB!B8@ B!B!d!B!2PB!B(@!B! B!BJB!B!%!B!qB!B8@ B!B!d!B!2PB!B(@!B! B!BJB!B!%!B!qB!B8@ B!B!d!B!2PB!B(@!B! B!BJB!B!%!B!qB!B8@ B!B!d!B!2PB!B(@!B! B!BJB!B!%!B!qB!B8@ B!B!d!B!2PB!B(@!B! B!BJB!B!%!B!qB!B8@ B!B!d!B!2PB!B(@!B! B!BJB!B!%!B!qB!B8@ B!B!d!B!2PB!B(@!B! B!BJB!B!%!B!qB!B8 ]XLmјx\ϳ$ Ѩ`HD8"" DcDQA\T *DQjdHd +RU50 EQ TUϳ4@X0`q 4 `Yo*0gϸβ cY0 ܟ,#q{Uգ40 ce3/UMaa޽~ا p9V+n"pຶ8ςY\\מY0 H EQ!+y> ρc C:/X7VA4^]?DzPw,zEU5mZyuE @.eܯ™d((5^O I dE_"$IE4&AդQ8,E~66gtX0. 7 E$Ys8|B!3qP!q DQEQf@&Jzp,PT hG = G$PXD,.#ˈ$ lȊ(+]F0hFjC1wy )j\74ps\rq+j^8=szEEF"`~$^JDU5OHX "#!*qiӺg<$KVS' 'ێ,()rc<GB!2n1ZǏ(\!}DEY%YE<.CT#hy8,!ѨpDB u>Z%Ii$=N54 ]pM9J;O ̍moy {y |+KqT @!.TpHvoE$*E(,"E($#Ufnk<w:vOkEM.-O,4}\U5MԵ1*E/V%7ڍ}<ғ>-L!Bȹښ}."Qn?(;"C G (UU5ҝ8z2汪X>סbTTJڮ`Yea!Ңw_t샌mB!UZxȊ YKa=m5N@@ԮMl6V Ci鰘Ͱ,l(s,859wkn1ۘj\eUJ;G\mQRRt\}X'5JJ|feƗOYQ}Ɋ;WTĻ杋Qtk]]3_oФ d`9< `Y jBl6<!88ǙqDA:(ҕ0Rv=,hcKn\34 BQ(b_<(yiEQ,ː$)8ۦz]ۍ01qa?T@!.?YRn|y{t .FݳHͱ}ͬfR=S9= +1x0ĠTK4YqI<σeY` bb$ƥɀFK S,BQ<EQq\ҥxK UU*$I$IfY_I4$i#HL%&q_#Ή_`$AMOwrF瞣rFGv/|'@} #7_#1c#P6g ffǙ RTl׍!d`;xbe_ۑӫ۶m3N~_ !BҌw8fgt% SM0ר٨ϩ5.9 mZ<, 8ȝ\'J?KNul#(6F8eY6LKBØfcbgl!BM<`5F"b1B!aq3)`F|Q!"8(bx|]UU!r9=55ո8މ=G{Ġ=1eƜXJ|FnX`ۓ|͖4B#j3x6B!&>7781?{5~f̙9gs5c:g8՘jM,OG6=%22=+Q( (!BHɮnlu9BIeaSdd,g!B-4B!3JUu9xψB!C B!c_T7B![(@!dLZJ1!2B!d` 2&`VHB!D B!cB气 BI/JBx{aUgl!B= 2&lU<B!s%! B!!1yaM BI+JB,MQJB!%! Ǚ4  BI'JBxvY<B!s%! ,˚M5 D !BH:QBȘX0g!B- 2&*B!iE B!c |!BIJBI%żN!BFBVP L}!B҅?'@H*"aY 2(8DQ4/eY$IedYiP}$?UՃ MC0 c#<a<83e0v1zǡ( Ȳ UUsE@$稪*1/y^h0sm<&3ϟqΉ`d{mS Ø7K|]3~7M|>9jM+g$GyjB!t H$e!%<1|/JόE3UU<$Iqf`jR0 dY6c3UUyiܸ-11I, c<^u`m)%_$ QEQ4Q%x&^O$o__:%'V/k>}s?75Ǒx>=T}93F%տ%~O? bV+x7$NL^$~N&>$}I>u5؍؏2cZǡiy{$IJʈpD;%B!@0(D"bEhX (#H#큂/߆Tq{@xࡧAR Tۤ vR=7=3KB~p8xOƥt\8XX,xfnf`[`YqlV`zMcBU0 {Ddv.mW=hjDIII^slj}KgE@*dIE_ʊx\2+>T lLQ0%c^&&Px*fi0[/U5Fe\n0} ̈́3J:񢯄(*<3B!s +4_5 &j` p9m-plzƱX<baڬp,瀮c* 9( $+Z3P1 M Ȋ e 24MLDIo '2X,דA7:',+xNeˊ A 2,oc|e9bỷڏ$b K F#҉e0Y%|9* $Hbpj<pح6kF@ıμeUMUIL EϳPNcq0Q۝M$Iq;tQ9YjC4*Bx, J23sMV.jx;ԓ4h~ ;3gB8Ν;3㶋qUAV HNu%gE5+-EP"q;#h0'4BDzn5 Uՠh$i8|y Ӊ4 N_:ϙI'=BH IRKE bbRHQE4D9HvIJuUv.=a ˚S=w> caY` ptZ,BMGP[׎6DQF<.SC ]2Y.0 4:D(JҒ DZI}4Mf`r <2=:gY)EF{ǣ*w(7[,XmKggQO4 D!BHIcޓdMKלiܬ-Ab1P|ϙ砳 a` p8tb҄B̜QiSKPT9&_EQ bqIOf(*2\]UFAH4vwƼĕ}*nENN&Wҋga#% P!b{PϡtXxsȲ`(~ψB!B 2.7tOyu긞>$!f|!y^ic;B}C;DaA>q- MoGm];|0(q dYtsp:mrrb!‘)I0233iZZC:6[O.U+XJ#FsJ96rD.Ijw B!F 2EOc :ycI;eI˶irqTEM 4MGvvy12~}i@ukpނI {;w?؅f/92v2Wwx\5O ->I9oUSB!$](@ƍ f/y,[a2fk9 n[ Q3Q8)ozaGR)Rg+W&DfddL8w)T@ƅkngy1^8)}"ko &5VnxJfc5sbwxc5dPI6Y.XxTߟ`^;E2r3r Bnd]ؓ/VH̘V>w*s, lV p߽Wv3{KMJ B`3xeN YCvqwdn}ڒIdHN1If,B?i[vq:]| T塦pXLnjT8K !B҆s^}crܲee6EK 0T{82YG}0E,9M+PSvz>He(+Ye 24B!$]9Ul63, sK\~h|ƀIZB.|0 n;Ym J&@\`}x3I4 2d'B!%99a.6;`@IIUM$Nn##5*J^ ",˘]0 IRGm B!i).m F2JQ%,urqhJ)"Q@ IA~ADcTA!"8|y沢2\ðic*YA(Ki Ǡ$4tf9ti:тͯUhoѓ1rf/WsPaX˱s$2(;M-5Ve`4XљB!dQC]ҍD ԽFet9b# tQZ>%Q;ه'v AUU*l}m'λn.>U~Kg9]Ut-Hv<쫪QR TF!2R voJW1aY3k쯽nsْBST IIrfi9نgvH{ˀahM DZ՝+wP&L/. UMy30]$!BJsZkli2/'4 -'G.Nw+ˑ4 G4,;| M>P83, B_zy**TEwa뻰Kv6^iZ#>orY-8; jRB! %9 YE(EOb?a\ e =ADZ0y˨U&rA9.B^> Xo8$ cqr“` )Z"rݥ) !B4ZA䂴cËka?6薪3$ t[053L5Ǐcۇܲl{k Ӌ3]MShj65)Ii@8Cm5"׍Õ%WQ"AN//t'$IE,&sB!2X ,EQ!&]-qWi5 e $k:Gֵ2?)WT3A` 6K>p&~ o?t{}qHlz;wDCS¡(1N yʅx m_KVTֶaػumE$>WjąK+eĸTnuZӲ}[mvUQ?1_OBqִdZᰏS<%;Gx96s$]UTH<h |[^E; IV RE;(RB!DG ҋ(سoG7 Xiz{0Ł8~ ^2LZo/MP[ߎ܂m;s.w4&",7`{V&. TE/f4o߂`Gy9cI.2hl8yLh< e +A40zAt-?l{cwR7}AWi8mEE H sAb}!BQEőc x 8p#(%__ևO߹+MwwU{sUpJWᒋgvK4 OZ6nv<7/bIwEVZ>.cG,$F4&b N=VThthk}l{sObp}1YޟÓ4 7I$͚2 NB!% 7vG;_߇,+y6YQyQՍ8QY_{{z]%] ua{}#cS۳3dvXnt4tabRZ9XuT !Țo ?o9%w.ǿuݐz4s3 Xyĺb~Ug[`4`V B!(p%t¨khGͩV Ae##Î7&N,@Ey>r\&%jjēϮƦGF勶?S_ӆ/V?i>ZwF[Ov,_iޮXKXZl6_z쳘dR^m#oWP FEtBLrY.`HQOEl_G%wi6Q@ZΙYU"!Bҁg IRpvǾPUӌXL2KՔnŔIE8Xr4{̀zZ/TY˲p:`Y C$}, ቧvj;<(((ĉ1aʅNh\I*' {=96}ĵSpD(_6; =B4 hF 9l&B!$M(08w?؅kDl,2DQ]'kIV,>*؅_ۄKKӴA-;wPYY9pWo. >Pu\?|;(//s;͆`Y/&?Uհ~!,9*,!  l, EQ Dh™^+!0 M <6gYszA,&#@ ˱`*40  QI+WaL (&P ! dx(044zWccӍa?)>ObZ +ַ 00a~; nTb.? p7p'cE Ng a(F&3@7hڧCiI.8NOH1 M~M~+cI+aP>ĽȫIidZx3qQBf̙U3XkhY+m#0vFE8,"!+*dY1 }iL$,ˀa0^X,yas_^e`Yv.:PRFV Y;ATDcBaQReXy"emaAA.NlB!Q` 9t==8QeaXۍL χD"В `xǰt>|{gw}²,.B\0[V?ƾ}f͚^8^Ռ ǣ80O?H UQ:yN3 EqxcZ9yNp 3M)Q='oc'j6 %NڂzPyٸK0VmT);/m%5MÑ :o2=2A@MNtbׄZQ}> EU!I*fpn4Ls؀U9NO*p,E $Y5 ,۽@N!cΰ"cGvy:QZFQA2=6de|IWB!d)avG?mۆ`0X,RCR`uX+T Pl{ lJXz5,w]4s6"CS54iN]5ɣ,7Ǿ,Ĩh䮠N3àX |({#Ѓ &R^e#d44+Fj`BQ41<Չ@3;"G$(:t4m?WV3e=[ M^3 \6+Ca y.̙S0{F>̇;c䫼B!%ƀUMVmAff&n|_\gi¼y0o<|+_G}_زeK%,bٲex1mڴ|,a{-4ϑŋcؼysutt9ANfw^.z%Ӌv MӰguZ\ÊL]='NZ ?jA4iBݡ0i8(Y;8^Մ3G2io<`LUH';EsKͭ!4C(," ɊP^)b$ BPFqH>P c) WeV0EKBd[%JXB 3͏ǟ }<㢋.~#,[ q>\|u!`ʔ);qw~'b8q"XMJj$IXSiPd\'rz+05nU g8yw%u_ ϝls C#a%.7-7wC` @S5 UQl(Zr&\?yDdH=ۺb4Wl0ki\ӓ,8p>q4 PUFǰX\Ʊ/Ep] pťp9 !`FC?8!Zr#999~}si-Yf=jkkDPZZ܁8bEӦ'5AB0Zےh@Zma ,8v=P 7m4sRQo.pr{ &/~|wa o+tMW03^% <px(^ܲ^:,x6wWHqH=?oϟyzs;=0zS%G7/D7bEO2ra`ID$I]?UU!BWs?@t-UUqy=9qѢQ|>\_ /^.z2&*('%Πm;#gn;l6L:cMSS^_&AMGUI˱C0:u܂c[o wATEŖn r˲1V TN(fA(jV_޾B".5{hd |⸄fؾ_رi=o}i==8 UUe?w˲zw|A`Xp8x,dfft"33YYYF~~>\.rss(yl]Kb 8(e@E3`O  h4 χ`0ߏNaB!Qqfn`xpؼOGG0^/bYk$I2k\IӀPXćcO#._6p޼",}02>gж!hn0 nQ b7nPUh :i.Q{j? &,uGq׮҃~he\o6VfG"?σ =iU3S&ivע'4 8rM^  9s<[w6?:oUonEEE:u*JKKr`a<336yhhh@mm-ZZZ 2xGFFrssQ^^2pXkh4 e UU IW]]'NmmmÈFI 8xlq ki~35#gL,&3l6>Ϝ={0!GeaժUx}vBA `֌̘m1 S GtUxᕨW79vL9r` x|Uͨng"ǁJQ[MRӊ/ &ߙT2e9f::ض8nU"`Yli4Zͷ{,"## ,W_ SLAFFƨx0{hSU(MMM8q6oތu֡Ͽ T?ሄ?0)!lA8ck9gJp)dff,Eݸq#PR22oXv-^{5|Ghmm5KAq;p3qf(Euꑕ̷zT:v!Ѓ_5W~aמaO,±Uf{0Ň%˖ #8YDsQ/+*vµW>: L#'`sb\wu뮻h"y,fXx1.B!ܹ?8># c߬CE&=B!g V|Ģ"D1||F( VZgطox__={6v;~m|_sa͚5կ~u'cqspJqdgg CUU|׮Q@Q4)e3qdӉ^r,CHeyyygu c_V\*WO? ۍF,^K,1HիqjfY]8wq)x@7CS5TC+kr^E>GWr˲1iXx\LW:{̿j6Cymn:,]2}8W= 88^>cUQR݆֚vִZ4mBӉ;#GEgbbrRg :>#Z333op=YeY̙3/|?0V\X,cx]w%BJF?ںv lK(?;w*4 mA|bʔ)/npq|R/.Z2_+NG!2|~n#[nvdQ,'8byK͈DQºMҒ˗kp o}̺d7 vo dN>=?܈7? ER*}=1 J ^2Z1nj< Mx=C98,\?/͟˲^އ|:B!%FFKU'qHԉh4QS~8i9_x  "QG/l&СC:>0(,ĵW-o\ 5kep9m!#"vo @_갌x?CUpg]kpG6#ܜ7'8q㱿(#XxW"uZӎz/N-hAI pa0urZ1DL MӠF@,1ሞ,..7 AVڊ?PS]C}_yg !Ӈi$I wz7o/~ ޽\J{}0@V N`ޜ ?eY.j! NZL9Pa_񈈎z/|x:VEKu|~x}Pd әvw~)~KD8>WwM4C4W@=NI7pg@eVWíǂ v8Ӧc֌rLR W r1 cg4mtzQttHNrKڏAƖ\yxG{7c&, !QDzP-6UAaO%]QIF(0a߁SxpX=dY\|LIY{{;^z%<ؿYSnn.~nbUW]K.7nի}vYᢋ.“O>lD1D1 kuuAOQa B[G#_NBș VȞ\9% Zи^#H24;'_uo E= z!`!8zݍôc Uý~fu(j˲yp:E~~>.bx(..>T__{7o6GY`$%<&N*߿~e򚛛q!!RF8^D8GSU+mœˆ"+vE\Պ6l@kM;N# Ad( MyJ mv9nL\+0cZ)J0LRY^Qt`y˲p-p8 ?*QZ<3-2%~74N!m K :'cjߎ> )\-ұ[G!ŎxA]Y.u"X]2h` Kg3_x}J 3g@roZiӦaɘYb1[o~zD"O ?>ja+K/~3f@yyyMXjU,ٙ ??XrLU1`)cq=W` X^8ٌ`( YVJߔ 9 l<ӎ,' 2Q\d崍J>B%=+ҩE8},"333^/^|E/EQFqa=z+Wg?Yn7 W|λp ` ZPRQ0ckx~9yeb!\ VK%zDcK;{" X,[  jkkvZ\s5^F*p8몪bΝJ}; ^ohp|q`sgW$LȊQ]K 8*fzф[Q}x㍣s~Ȳf477 NBmm-ގh4 Q!1uT;wX_3IJǢ(bʕ?STVVѣISZۆV@!!V2eH[xPR^kncjO,)~qs 5Gx2amvqX|=uy({&M[[[vZ[Xf ŧ?i22]`Yh/MԄcǎaѢEK,4 ǎC(BII 222ܜtUUQW>`D pj6HIt51` ֆmmmx[oa߾}|D"4lx2 { tbƌp뭷^uĢ㙿◿ jj aОMWCUU[ /DaaaEC,D!d`Ӎд\_X;_!Mo!m_}Eey0}U6W̥b f^{c`CDD. K,Iq~|K_š5k( ~iw}QVV24 x뭷yflܸ$,˂a|Ń>vͅ Xz5}3;GQݻw3gTTT5xB=,$~3ɚxJd6-x'믣(:4 !#cƍغu+{1X:qW"S12pm(ԉE=3V4xQІNܨUV'? ~ߌ}QTTVneB!Cq<"3-19,ˤe~~:4Եު~9xO_rJ*X1cCGt9p\(..N1$I=ZbZ[[xqb娨˲hkkÉ'm69rf,RvTWW&eAEkk+>G<,X~=>ڮ8i(Lq 6焐sFYqgXarfkNw{9tttZִ˲:<3Xr%nF?@eae|_}#0lXV,eƔEHj#ظ0`;>rP$s 2x X_KNNN1TUCUB°Oh E0| QT6y9CxMw^zU+:Z`KS`G|tկ~zר$IE]]^}U, "TUs?()) 7܀/}K׿'N?K p ++L,?g{Q# ^3yp!Kݜ9sz@ ?6PB0&äw 09޳Hя~#G\eYX-}y ;V sPT h^`Q>5M3_<n~?Gbݺuqȑ>_eqb颙pySXAljV,5bcgGFwe˖Q5*!d, V4@w]4gPM5￶gV`}nZlN_ٕG0p8|p\#޷$I7F8999`Y---IMRqfϞ믿z+ODH{{t탦iؾ};0q>YQQA̞hii(--IСC'M{%(Nն 1G5 Xq[a] Ӷo@,C3g a$Ο.e0UM_rDQF$Gcuؼ6>5UUq 8y$|AXִ>k{EuuuX+k`2KyE9xݓ))( :;;#ŰSVVVuMZÐe<2Bȹ@-zEX&yM~Y4He^Fc9Df@8 6%@v_׿wK/!tb{A5LbUVV*++q5k̙3{5M2F"V\2%Z bƍ&JKKp8~?كɓ''mWXX4EUU=z,yL<nmmmIS'p)>sX2Qk:8c $=~!,LLg?qή'Ñr,f#)eFv!< Hw_vg?C$~58<)ɓؿ??u֡xٸbҥ~0 σeY8q$Ae ''EEExG[n?~1?zL:v3g΄j5 ر((HM333ؿ?\wAHzގlXV̚5+iZ>ћC938{jΕ?NK׾qh$8zmY| 7[.Ւހf-%ʏ#'P(~f•Wmy?c݊~2|7| nٸ6 nhjW?Ec^0hկpקl;l8ΤqQF0z\B!@tbXŹXv:{tAdx));ux @)0&y¼M4:t7t.r̝;>8uֆH$b6K2 I0m4'w Bf"˗/GYYYsPVB{{;rss|< 82PQQcСC}&ozqzg򐑑7$Ihnn6cѢExW{pX| !g7g$T[i`KeeY?Ǐ홙n/I2=͜\ UokkO~̝;>|O=9nd8{}w] !UgZ;Q<߾Ï6.hy`{AN;FТWo'ifq??C~|>HkcԾvB9}X1 FS1֓j_qXE|z髁AM/ֱJvz~2o&l*6˗ρ՚m-y.$aÆ )+++KJJ}n 8lO_)e!y'k[z>u;0QԎ;=h<"X/&X( ^|E455 eeejGܔB౱pe+_XUR/C4CzH8}; \mdWCq$7b-[:/:ct0( V\[&t:bS.)e(((0|=1عsgôim5MæMd??~o}[.\T2cZQTr޼y(,,u?MpP-1*$\cJ,txl(ʈE_פ2x%|>X=l0WE0r0Y{E$q݅+z|'jzUD{<~O(?+SSe,mޜ4U ΠW"{UɲS!B`^*Xq5}C ط+v \2-^npڡ ,y>ol=J !Xx}ǥX0*SQ:::p`;|^4r r3ԯ O^K$^zUrR)..NJkGf!V] b$~՞l&` C;3'VCN] т%c>tvwiR6^{=+0TN,W|&O*JNa̹3gw{{;֮]MfG666b}n[PPt^{My֕8z耏g ˗/NJ+`v},.袔Ñ8kzBnv|B(*!s+{g.Jp%k6kvbeKؼgթfNz2xI͞VH|,򧯁G?:jh47|3yX]an!̘\e~Vޫzq5<$I ^xAkx~})))jjB!r \w^cn퟿ې[= &A4r[pLw ,%yxwG  ċ& C >+eFF=iy5R%TUM" ,0GɍXVTTTa|AVTT$ߋݻwvʔ)?DZgϞ>=XxGӟv=i;/r`Ͼj !g^$IE,6 'YŢϱ,d>rIVG_FQ~lϰ, ~;X[nP˖Nm)w_x&OHN9rk֬0V^IvJArW/I%g?\ʟOriʟ}7ą"]0;)1<&L+)E 2B+x`>^bݾx2P"=< EQm|W!.|![:?W[1Ebq<fCr*#1qD#6n9j Ë́5ה9XVL'3]8oI4ڵ+iY9sr!BUU[~'y͞=ׯ(Xf hЛqgȲܫhiGEIKL8u̙BTW'8ٌhLL",>iοGR}:y=9r)tW/6V5kz'k[p %ӣ͜oYl{ϛlrڰdAOnXx~E8ZQ^._m6ǵk.ӫ%@^\|~]QvnOz~~)..t3`Hyv]im=Mp8P^ĊL̚ut:gBdmAxcevn3ÁI˱ga9o:ΞW|b,\:9)@:8#Ų M-% "O-dzR{5U>ZG,o߾ǎ̙3ԩSMԄm۶e X ؼy3.(˴ivݹĉIbe˰w^391/Z>,CUUs9X,l䠺Ĕ)Sk(,,ĤIz%mmђM޿wc֌26c ʲ֥91?ڽ6lo 9{IXhz{DruMmN;bڤa ;wDcc#n˖-IM^-/?/҉[%% /))nG,3oD"#_tش_{{jq0<3bɢR̚)^]- l2&1Wnhx~YQRQX&Z0NWAڞ_(лN"£bf%҉X KR+b>hLZW^16 ]vlEQFoXp!Q[[h4M6Lvb/|UUUسgϟ~I?WǏq18qBEh_.UUnDkk+|>2220uT<?Á+~ahTĉ&J[o^ԕ<DzI$ {Xv- *ՂO\4i:ٕx7]obѰ%QqA6/ljjqxǏ']/ą EdɽrdYƟg<裃`x1Mر EޏOf呟DEfbBTVd0e%nHwv6*F:+Hbz(XS1{aʾ䢠$MRL[t&LJI_f4MÓO>|+(u]?P}^oN0yd,8|Z,VXcǎu<ĉKfΜgyEZذa6mڄ;wbϞ=@ QYmgg'n݊ݻwW^k,^h`*\|ΰEșr-Kl]w\,wGK Dj"7\`&8F4žY郾gn]>c2r|j9 @$|ᇃJ'O,GNVډ򁚦W_ߏzx#l۶ Z$"^{5lٲwunwԶ"夒Fr(*y &Zn?;&5Idq1}M5?j.MMMhimi`Y.3_͡*vZ9! *jjDp8[[[Ҳ,`zȦ$Cu]+^yw3^}o jZr^/^~!%,K7IV 7Ԡ{yɬ,vm8tсxK.yOgLeFD Z6B 1n`ʤ"s2`0UV 9s`޼yXf e]6㫪 ۍu=ZZZF=g}teK:cJ&oO"+Ӊk\7Vni{ٴKiH*hwS_s"2>g(ae`~a.2xD:HCN$47C"ڻ,ˢ"vSNԩSq7CEtvvȑ#Xv-֯_#G\?Dc21|XUkOwmlu\|c3QT@帄ӇD8d{![88P`X|.vNңi{9fwމM6!!`֭J;vڵkqĉ>ʯi 6 \'fxm蠓6ѠxLxz< S~TU$/c hii1WoQTAttqkDzy,@y0 Uspحpڭp:lYXO;@GGߏ7|6lÇFU)#*ZBx{1ov!ni&naJ<ݞ2:&-܅a`͚jڏA(cDn ੤0 B<򗿌`0Xl/_,^z ---}9eA4 %aba s,Z:#xsc ^Yw[5# 1 ۏbg`b'}&@x| Ge,wނIxmxn>ӧs N.*i`L9b `?> P4C=g.fe!aftDbР?^Qq.(xm` cȲYQviydXr} `̙(++qSέc< IsS0e]. >o+WPhሄM}w{jnn:>wLM O !~&Yaϝk;kflBӆLccb8Tk[oo~f[oؿ?x>)Iv؁'xo^2 p,sYK=WU'. u]Y|ᆙUӰ1$Z:獉 s,QRLHVߐ!c&EIF,th,5yɓ'?/nSˎx\(РL'z5*l7m6{fil\% f (F1ǰ <,6 gȸ.gۨ?Ӗ^ {ϲWP e(-ee){5@ 콧c'qdqbEJ_/cqw<4JfkZ=v#""Fw}lX]}V'weGDGG3{lfϞͣ>͛裏Xbx<LZ>~.X2o̠1D@!ām%jcW]G@(Ї32/|֭[hks;,k.^|EХj ٠#5̜,)h5g8Zȕ eHb$~wx>\yH,WJhDI| f}6gNr>}=9m8˾Ɗ{抹}8N)j 5w# 0>. FCӍU6aw{x{O4/bӈ&R#$0/:Q>lH:MH48xd: MۃGVHjVj/jbBl!Њ"^!LŨaj0tJhW)lﺐ%\<[mn=ٓ(r,d21o<͛Gyy9˗/磏>bƍX PPl$w~dc!BE840DgiUwYrrҲ}PѠ H\.>N;4w֭__՝EQd3 %S8{z #!ڄ(9Rϯe@\`xj_oO+||u8v}$E&;Mh z0%!>Xn?N%<;X@w597cǥα.LR(;6 KEۋeܒ$+xe5pM-s NKQO@рYE v֭sYYKSVe%#шIf&y`RLQId4^%HBQN\&) )px;<磧 ӣ=fAxIII+d֭{|TVV $)ίOϬqϯgpYT !BỉmD-TH.+"\H.FJ!bcOvN튢zj:DVVVn>S?q`kL`~?kSG&i>Zr!h?93Ըgc# ܸx7x\6nSV3;?/^}ƌ$1!CL;2&o[SG9 .w)4F{PQjEA=GZ\VA!fIFAQ }w}\F#ȀQ#vJ]pS@ywEӢzh_ǍOH͎+ٙ)  ;8N(jau<Og0L&S=nu7zOYf1k,>>3yN1vt$i%k7dtuʦcSɶr? kx_QQYϓ)3~_ZQQfvtlZ==Ei5RQj @GHLdSY߀+9D5zPQvSasPlQpJִ$;СCs9vSxϽ&'OLmʯRnn&=2XN{4dJ=^,.76G-I[# jDH3" |\.n7]E$dYVIwi|~-K/QYx1~:{_K.u,mkX~Ø'CqJsx#CgA!hj@D*Fr6iE::hR c Ltʪƀ> ;v裏?v8 d2cT2;3&ganz#+ 7ϭ1Qazpdn\<[+QL˳l^^{iEQXl sf:e=eg4D]DW!* p"I))cPPd$eArY:VeD%чC >FtT#SUˣw}_|vza~(Ο5p #:r7GԸ0v2f૛X w;2yW֓sϓ{'9eu LC2GnC6{lj z~eO7=16톛oaǸv'م""ZQ53iDtZ ZAD+rnQP d啚.nMU"ZHrb g0 /PWWǡCc?Lmk +Z$_vtzCL6VN!l$%1Ә8z#c܈L`H{|ZmPwf{hG2m4z-.]O?ݻke~lVǀ{!B85i(q t7 1D1Rnكq HnmCUŀ"ڡz!9(a %(01kkgH߫8sٳgO۽ 08- Gۅ9;URTl `ê5'B=|NiYaa|.Fcώ J`qPY ^oGU ;'u7a:8]]e[pG"@s@VN|}ZHxQC3X`"g"-ˉcr>慇SGAQ}.VlTawQdUj>*@Am 4Ab4Id@z"#30#2R4c6~Y8RN$pdEvI6Yle]ƬYxgKeee {a߁*"r8D& e0"}czx!% j >ޥ(ȒF4˂u"Kn/9H+~8w{i|*(22"#& h-5h,@_dܘDEQ[/elܹM3A(=g`Jt[9Tp{/w=<LCn"0p(f~9HI=OiY"!>IOYE=N@$w #7o[i&$IB2ٝXmOqr|Cp˾i59O`4`LK[+x ƈ_QD &4(H=z KGD"{V=ഢltجSɋ K^7$!x\zjD"2I1@oEfzB@=_AqwE3Gbuϯe{nuzKY'- *XpΞޟg `TX.x;װf~Yܱ5Oz{a)U@Jr rIOTu&b)(zN:QStg@ZÇ[3c7M26laPh|}E4N%6*I̛6yG3|PZs\L:ttPSSө}s8ݼ:&Ltdёa{ IZoBwd/|BAI_bEs%c0 eYSz &߿EFaƌ|g+<쳔iOi$%t~p!~`q@l@"L`CܹP%;Ls4}`}('PW ?w»W鵠(E9뵈ૐ $#$#",h7Iՠi鴘z4ZVAE`60 DF0DF4f <\\9}8{t耯ӊo.EsuϿ56{o50xIu.'N{ʹ(! ߇NcX>E,{iO+w;5c$1ѡG7@N .p&IQ#BSBY@E@yX p VI .!&z,9t&i,FKo݉H8mAld ʙO`!~.Lɻ?>͇+M6D|P!ESs 666H 4 VQN',T&LO>^:$If|.c^zz1 fYzAV+lN,7K2Um@J?w:u  QqmJdL6oS;):Uֿi%euqHQOָ vB|Qa QsG3(*9ɫ弙8cJ:bM8twew_:V{ʹ[8p ([oqyl~}=coK^D$7ۘ5qr9XG|0+cDG mSٶ{-G۵$Ixё76:߭'_oKթϘ1>ۍ$|6hCt*B]RVmǚ)tt:/^ /@zz 7XBhۭih"n~r:x{uS(,o3nLsl;DIY-NQ8 ʪ \8g ]?1~&W,W6;Wb21v:`IFꭁUAWN˲|n-;KI5xj _j:;^I? ""#+ h7.AFb7.on 7xU((7pQK G"DCagᑬEy'o90}.`hN@ ֓pzb3Nh}6j`Bjj-$&tzذ9ϿLQQ5NۯڕS±3"Mz-w_2ϹxeA|uvv6]P؁q]^6ro2h%YW jX8wqk_^ׄFd8߈&^¹3sYpavZ) SgK7qs 3?CR;-5 ϝ璵K{Ŏdy9_kZt1& .Ldddp/kdsIpϪOoRRBC=DXXÆ cԩ|W,^|fDA7-fPfrxkhi"Gٕ]@AI4]HٳϜ9sO{t:<l;YD`2|^6>{CEEn0f"##IHH 33!C0`233IKKWOzz:??~Lm3luQd5S$էJ (¦yb@پzZ^+>"bؚ+I%l6'o#+}wy$^FWon^IP K?V%#x~|3Bo01w\}S޸!\)1h/eeeǼVI5sEcsk^љk#)h>^sߵї}QVp{?@մF#*466vO(2e o/Zq?e& <^O_^رr-lذZ5r{,_8g&/%بpQtcmr`9hکoQhцULi  曹袋z0N!;'ƇmVUsmx._VQh4zHNNf„ L01cЯ_?#LF#wq#G䗿%jCBJ!~ ؜]6MMk qo0n$Q:]^lRGYjmhKhUº"(9ip8N^/I$/1 2$&n}{{A_XŌiOjjr6nX$Yr)}I N|5 VYsbiDK7MtLs+̞:ȬY>GPg kVDN~KN%6p 泵GX H?G 6g{mC<֬OI9czmKM:F;Hj.X,***8~9݌3+.噇~A|{Wd尰0N.oN_y&HL]r|2JsO׳7 鈎f\z饜quy[QYY"Dn~Դ +PmBYL,#  ~ tuԠ! 4`R@ hN4os@򀣁5RP\ONUe7675Mn@?>~,e]F\fM-mQ^U+gl!wl6s뭷F#?8^_N@hjDDDƨQ8Ә9s&=xH[c4h k? /*idw8pjjڱ;<8]^^YʈZjEz `kh" D?1#2!a0o7 (Ő!CzX,l6oՖ"5-EF)**bÆ [DFF2p@ϟς 3f ))o&Mw[nQx[/ygrֿ!NUV#I$¬aPX;Lg@tbHA?) hɃUضq-{wST\BYzۋh(iԒgrz$sF@k))رvZp:TWW\k,'r} sa՞[p%V(mo,'&@TJ5]XܪӼp}FPUC>y}ee%/2g}6/?f e#gL`~VQaz'>9周npVh& KsGv6YVa ux!69%TFĬA?AGVQYϸ1{d' Uԍ&ŚhhT]̙3{{fx-[PXX{>8yF1zh'f">6k뭬zoWdlmA?'w}= h4)SK/k.\.WPV` 11 &NȌ3=z4 Ĝ8zk7MUXojE;{!B8IA#v_D! ::H=xꏥ v]ԪF<!1:- K}˶|6UQksJ![UBMMvwwT@V^H6*468mljDŒZ oAV~^BI\G7-aiqYJaU(iyɠ偫&0exb5 ?OyZ}uJ|<7OӡeuAGwk~sV(e/V/aCQb^KΜw,UՍ *k3ʂ@E_P!ݷHI z4yȲ̖-[NhYYY殻0Wkc4Z0AGTH"I&&*0#fV^Š!.FuVPXRMEu &-_0d?p%'d+dѢElٲUV}vt[iZ4 f0߿?SLaܸq >^]WRRLM:́2 7ޱ;(X)ؚٚ4¹ұLN='Ohbwٱcv˖^ fΜɜ9s0Ldggg )++n|,R Ȳ:9>|pƍggͨQzl6`|MnF֭[4 PRKTy3O);DQf}h IrH >-l.cC~?iPG9Rkqz$ܒBzHrJh;;܄H/$Pi4Az(Oyu^lOUҚ&X_g G`aNJҹVX a3dpY#=~DYx$}sçkpS+gҎi1yX"kܧӊ Ƅhe=eckнYsiٟ][&'E3a^>p^9$шhOR}jjw&M H¾}lOȕW^h~UI2nX^U"G'ЋEVh4Ͳ@YR DEEq2dȐzMg,^FV+uuu444P__EIdd$qqq-IIIImIA%xrv A$ z F]dye\ GB6 ]Ɩ*`sb땩19?t:RbAQر5*.;wo>^u.2n222HNN&99O?Eii)O>$o6Ng D /@^^< ÆuoOx/ҥKbM.yj5{b!v !BcĄa } Ah( V7&w.d`u/C\+բ0 upˠ vku,Dzdd `j5"=@iN+*n̖U~ӈg88-Qcٰo{SF$rFYG}ˮKfh(Vʼ^r>h5F )mui(g =˶/-Yds}23::i9aCz6;SEDA@F5W @=:ƍJ˹뻭]3n8ƍǝwމbC~8@aaϐEjRzEӜ tF_9cS`@_FW14K_B8 '합/=uX<"RQN 7,v R+盭UF9x'7o'99Y=V08Щ5,l2.nmIJJ_W_$9^?3qy#]C8 EaO1dU0ah2W6"ʭ -i5ڗ+ Ay@ZW2‰8ż*8P ;\^ Y춫uIplz{g.^{ÍLr >lPCxXlvI1ۿGsvwi|7E?QzlYdd$Gf\p$ ݎr@ehF#iiitSe<%L|MjϤAqCH '#1S3qUظٓWKYm.Oɀ$KFӆ6<_b-}ه|@M:?w}w\wuL&,  ؏FTdE+mU|nv~y,TVVe˖5d^In_"D>QF{٥ju}ogG:>̎+ `6D5H7ӫ&A;=ͲceR:BhB`@U9]?d@[F1^IR/d_l G -vwELlp'V{t7ܤ㡫'U\4g W⣌aW=C˘և_}(/[Cy*;nO{qw!YbE@1K 4>$I&psM-ң͵g {+haV.Ѯ*կvyɤƩܶx .}6[v^(@B%u7@E#< 0¸ lCyiUXSDF[='N#4#[?Pim'7hjS%p ȌksjbsaP",w,/;N-s'4⩡oJZZ\X+Ã!*,0nr16>kѤ >C+vAhǐFLQTc)pS+qߨiծRj|Ս`""u|!?hR%'_m鮓En 3Ӫz<p5U ( DF7{t+;KBBm7'<Z|!676m;GogQYf6?k@DYrPTSYS?~@ԙ9" 7(~?f#N630t8Gzl5MN7=EQ30_;$a\phd̞Z6 Zz4֋-0"3qSgsؒSX+?:*LϓN'w?cIM0S]HK#TT qs.M4Lw:BLL8}CuBXQz.0Ʀvc!uuu;<=}Z{Q1D/o̻졨|s@uJK";u' 0yx"=|:+X$`1(q~n ?(h!RWDw[Ko%IR}(iMiMQo/DŽ!z ,隸)|$Iݻ\bbbHOOg z!?vq?< "OAmxH*w)ɱʝn ,tw30nΧEŢa|siIh{|߸DEQ?ң/gn zmw˱6oqhSeƄ3p@_vkQ ۛDq|9Bf`ę$+. Ţ\w戠&$mGMG=$Ip7t8nxGPh4yZ$Kj0jdz9 ؤ@wq ( aŊ<~ӣGqTLHC`V:CFpOUr9Tr4UhD".:aaQq5MA ѻ4Z_X5ͩ$|z6m=,nCpޒ)=m;0t 3 QPd1=aӉu4&~oGw9t{/551Nʋ0j(#L2Ң$~kL^wϜ˂4Lth5"u'OSۉ0XbnZ<͵(dC{GyArx׹{yy)..h;89˖-/fժU_ve{IYVn :<!B^b7R S+Rvyժ/AO%BTdʤ!s˫*CůSjm5GLkRb? htSZVwшZшDwtiAXGB :*~Kplv~}>"b+̙8opV+R__u]wc q9r7|3{S Lԏ_4*qxoKHKu;kxCmBddϣ_ S2"Y wIJ\9#6[fvIDYn^{5^z%Vk( z뭬]>^ϣ>JTTbBIs"DS% ?T"_gh0đZCA}Wt8m$8Y< ,;SHTTݖo\NOHF OkV9RT[/?noBC# MH"^Ip*QUﭤI(k>k2cG}VV5RUȨ6 G9/p=yd!3c$/rK3ɡg}%Kvڀ0p<⻖;m@Eቷmj;S : cq,}b1vkEn\(R!m'wxCl/&: Z8}\6rᵵ$SdSm-H~> e<\Txݼ9/lye:{jBtYQX^\Gva]/¬g.owHZZp_]x7D?N?a^ĻP`ܘ\t޴uޗ]$C!}cz$YHv7G$“gq]_RRfw}Nǯ~+륢Z صkׯ';;ʠ٤g3ofIëxͼbpEY\4;3)_o2ex"S'vygOO|׾>@Iq-j0󒑘 Z~zA*k0Q{yf?ÓvTN( ;vh4z?(0&D|lVAph"{V Pm8Qu RA(ej8Ve0p-e*Pe{`zB] kœZuejH A ¾GE5y3# gIQe` a$*}V"1DLD:5xY`HഉkAtQ( =!zQ^E`TOnq#I2)Ir"WҎw&+gN6-^Iv.x}_{+iM7̙3D3ȲLUUS\\Lmm-Áf l455]AuW'd\U_sճ+y$n]2da>-Lቸ=%3z}U剿aˮrvfXz :o4/)üF: ;(uX579xYh 31۵gن}4cyꩧXh UUU1H!z:Lh_hי"% g2O,ߴO:5ooc9[M:O% (ޯMJָlzзUE5&:cz]51p'NNQ=~w;rP(%FTֆ(EwESGߘ4f_"PMIY-ETW[v{q<-U1ـd -%Ne k>?@SrR*_#(Z>e_Hcc}uVeO}>xbV^w'%e^ ٹs'< ;YfŰaHN>yQOuÇ~oNQQUUU8NdYw53O[a0toFp̙GKs_>~+ᦳmxc'IЉ'bixi4:bC/ YA p%ؔ]ɲM~¼<|I>}]!B 5Ʈؑ ԈZҳF=oZHZZFvnN; }. vAeA"'VcEa͎#< Qٿr@va >37p%Q+mikc(Ĕ觀+q qs.MMN</N\T:2_CIGBeN'"//Kb0#55QF1vXLzz:P%@zİt.powY$'(=0d& =z;( M_L'&+ E|k<8W8ģ\CYE=nglN¥Q{DQ@eJKOi u^ f8'>PLZj, 'g'x7dn8"mKO?[W^&ؼy3 1 bbb&== Orr2фtlbvq:˅rz} cǎ%5se˖q=pȑcUAZF1&F2cJ: f`dNn&̬ʋpCne/~V,h42 %٣52 L"0]Miw\8:;I1ceTX\8> XGi4_9CCw?=Nv|\DFer\5 /m;py @OIb%S8WΚ~/XpՈĞ5%r!,zKFH%vb c$PuϙF#sj&Yع'O>@R݁=?\v,#&kq:=TU7HN"D/b͉N4 ƞ}WU7#Od +LMX/KW7N榫'}w_,SX@݃%m ˁ~7ZQ z=aaazL&ZɄ^'""Lll,DDD`h4h 25NO:EQEKR455Q[[KCCUUUTWWSYYIcc#˅%6EɲN0>}:>(ӦM{79|pw՟EĠfm"EZ6dYaW(`4'͌Wb t:-{*W<:  33cJ:>[v#XO^~=v<s}˼s˅j kboz5Ƿ%,IjOKo9N;n7| 11vMQT}aLFzF2jx"R7*h"[@^aA,?u|>>^M~a=FåFD4AAkEtZ("<^ˋ^'2iX"ILֳƢ}pn9{$-HIǝNe)"Oh4@n_.Ԫ?b_+yZU%Po8z|lG=DQ9sL;I 03PTπn9T3)9__\y%ٯvaq쁜;sG,.m$BIH#1&2"H 6@x7'=V(|_TSw.Ǖ{͔Vh>'3~#n=g}}DF#dѐP?D>W-RM;iK5 Q] [b) P͵(b-91׶[Ԡ>/U_m=5!Ћ*>h@9ߎHLߜ .j,khD!J:Z`ؐSf }Zߚ"^x}YL07|ӗdSGD9s`\#*TT8RPO^~=oG~a)NW.RH9YQ8THiM#2b:e]p^r?م~;^ K!:&?R~'7o$@Y@+0oX'Z6X{A  9 n#S@-~Ao|\qO< wܿP5671'ŖSRmӇaԟ:ARYon > 111Oj2@Aa;vk#f,6;YQ{Rmw zaF[.p GdFݟpJ8|jIs?^VGmb08wɔG6dOj&QF \;' `eFKmF&J,6R[砺 ӋAe[3=(b0h4:"# FHN '>LL Q5jQ$|A>_vhBF$>C f͚ugeea6}&72eBZ? R#HM@y;9WaGfRaJ}s[X.$sm[gu{`!jLӷ`0㢱:Q5uv^N&<γCq2qi`mU߻ǡ9*pph R˯nVq:) n '_QP`%o>hc?UÍ\zLv-3H l)`s#t?(osy։r!TneVQP@v,!BhZjי+ hO/MͿ+xWW!Ɉ(+@ kmmD ]Ӣ!3Z`A8m䉽O%DQlTf( $%FQZv%RKuv_K-V,%-!+33<#&T;xǃmẺ}3d~\WOZQt8z+?K@!xU?m+dxwhDQ 1x$~m2cəH&#Yv?.Uk1o(ھb9RPIAAj8mXL:Dڛϴ)COFK@I) FוD3 Oh5zMQ{.]ʕW^𼤤$fΜɁ|m;()0 3s7QH3sEcDJ_'bYTew1udfCKD?ȿ\͉ fדDa:\2TXw+ډ'xB6]u+4OT'xG֪^h{^ooPax2\=2)0e R@|OWyTʽ (h5}sƄ*vih3sDžćdEƓdtLէJ.m*dۓ:<yw;xwV#hx2NuQ=2/FۧJuVۍV[DA`LR,qALk-}c,Y(*(/nC6v A+1|hFv: :Ď?"eִ r]ǍOd6q1R^+VT3y} Y7}o_\Ǟ#8Rg|TM,@pۼ^?k[ "DTԨ vẮ;8yA (3Qpi S^Z7+)/ERPglw3}mjqyVD AZ%¹>|Wb 2\&SnOE=--rWw$U( 95ʫkY]cxֽp!{.v_ n-`sx]^*A^]mwVZoymq|DEъE5rm>6)dMVcQ<`u{hY [km5|WFD_^Qpۉ0g("Q[rr*P01-\tt>|F_h}Les')!{~=pUW_89z3<MOQ`ǞrJ˃?WV/`ˎ c <|$>q&zodm/y,RDI [03xeV.`xmJkA6xC]l?x⪮K (7:ؼ䄷"D!ٮpAEE2)M :.)N[kQq @.[Y-K '@_ `g{͠ҧ31!i%D.hwJn>{${߸$*LUPkqvd .|0of+/Èa'+lNw !ZU%Ys7m[\nOAm+[:QdKi5k;(nocBRbsfB**뻵ŠؼnQ7f{xÍ\r lN^N&)s^[ө3g eA׍Ç75/l>xnS 5v_AyD|K|v s<y5[]HT/`2hZDA_BVU6 ^ǫSX ?gl*f,0]k8_rS+x?x<<)@vK|n!(ܔ-s d&Ut F .@M?LTKe ꘿cNpxBFTMn +xF5AckjD^K dzvC6B]QT+skcOUy|zlnnuB (2~p^mM">ýMdGÌ)-߇-z: zR˜ҙ0$1|% +e bZp5cX8_ID &4$(b# Y *it3(S)Wl_r_7oVJї4u hkUqobnñkj徻ъDrZ`kT[0"wa_`BW&9)S;: s%IDATffy@vaW{b7-.}~vs)IrH9{PbUielAjv*A%"aaaHoIu, ܷIr>_XD~\;,BЅ_He<@W@P 4NF߼/Jmgk;~љ$%ES\R-,>cB;]nDQhГݫsfwz>0 S54kxl]EG=do<se֬Y,_EQM_|u ]0Ȉ}>x2~ksՈ\~u~p: dk˫Χ-*qy$gĐN|SkQc/I4L1hI Hy"BP5BWL 5.ꆶgFfO$*2 aSȍ`2E@$O5FօԖQ}OE6WZ;=vUQ zj7@A 5kk]ϖCĄ(;g*q7[#"79\^~^J&K3stbNmeqwTyX߂ Fe[ٽӆMJr,IQDEa~ڠ @^[_] 辌pJ,Mx64Fo' ydEQE )&$g:*)=/  HtTȦ0 RRZˑ jj$GȾ:PdwZYxUWԓۇѨj+Ir(p ?8/&.^xs9`6;شiI^w'w6W/q` ߮8kk58?W Hk&2v`הGQ #1c|+*i$56#2cpX!$Hr(U(X [t`u–#@U:B wN[ߎ`wNb*G ӧ(`2IY=s$ Q}X}ؘp~s vrQݬY L)\`ǣ;ELn^+y#]FumS+(hk)(A^Ѩ#3#12:y$wI>US` zF9THH0Oxi ? (PtQfm҄մp3Hd.6WPpMTntZ C%Y&e oc:ػؾ:Ed:-ڮN2cFe"\lWvDw4>~7uxA1rH,XYg|,˸\/Ft/hr559<:}.S*=<~ 'q-9u\4g ]?%:!*FNQ=-~:H.3IFb8_m, ;]w{e0~p|i76HD9<7+^Ӿ b!zX'/ٕ `ӵ_o 00NaE#/^/.tb5jނ/'fX+@ չٰT 2Vn _U9j߂ rӺ.h&Ȩdf$`2vߨf=h>b5=uNDva=9E FH0Sa/ p3F%&.N]n ,2 Itb"6ܒF4`x< LUSILt8 ܓ WB@%uI0'3Ga6[Uꔐ_LdRl@vv67t1iiizz!6nH~~>E\yk(&Ad>) MlܒKR?g*_0Wյ7VDUSji"A5jyϜ^ͥ據[{=^ ,'$jp. MF"Ȉ pLDR l쫪k N#..J߱iDGz~iqTW7_PQAG(h`0~ (H?u04()j}_"g˖-p 뤥1rHNxs>o`ミ^b)(n۠p~9<췦տ@ӑg~Ȯ5i]o_=W_j'_sxnnZwmiK{{LI0 P,Bn?6l(P  $dg8q˖8D"Nu$i;F ;xLx{q&_;j؛SɶCeG޵B8)6,S5e_@# " c AW% >5ZF`{O_9CwcZH8ޑ2p}]P IpƗ(+$˰6˷g8 ۷/(RPTjj5(Vž={+(Ыg& "܈Nhԣժj ZjJDQf#BA/r1[p1oP]IVp)HQ +vCI639?!=c21AEdְ@)[p9fFZBߪ xd2p8hYbAQ|>_K byԙuZ*VTWājV(=&&$lN62*+[lM6  FE\\/?'"\s s|;O?DMM+NDx ;)IѨTb%I8qXÕf ^EHZ ;TFѫUDuD4/5.7{J+3nׯ=z49$$#6SJh4]JfQ<)wNN (:^n mX89 [/ۿe߁Ҁ$u~Nj/̙3׿\@aa![vKk#QqaɤVڔؽ/. Niw{y} u jݎ-QZmoZ]_b6&YQ 9|pÀF#2gF43+D3{kXe5jpH x%y/BA# ʷuy(#5Ja_sL:7x\_ſπWBVI84okڢթnPW50u̜> }g6WfOf.EWI$*+UpxA@UL `ԩ;$[iW_VK\\sK.aРA\zx'~fС 8os]wt Hdd$.` ѳ{Çi Z,*+qla`oWA$E.I*¤QWЪf=,Sp]UCنmRhEEӧQQQ@ujX5DEngШUKsԔ֩ L&}@20#'Kٰ%?!2k+vwq<^/L;=s|ڿ*AU3%lybbb8q"[noG?(M^Y1d ;wj* R^;0XuQ~9^7({ޛSٌhWCq:55UKh}ye_- [h"LZYoh>oCi YT" HqƎ-9Î}ڗ__X$ mhZN!2kɅYM4 c۲ظ %UXNdYi՜/hS:|IV: 1j(:f̘Ajj*jEɓ,uKYhWYQ<;۷@Ew?3ϝGd9(.D-S aZ aڶ+Bͱ+;U^YnZaFRRM+xqt\n/e6DQYbPQio\Π۟Ӷ=||~c$lWTagC!k$I$?0p񯇰9=\)SRᡇ|k-`PZ:jLCfI pHJKXϫTW\VXQTȲ߀jdhYKtt4={졢xyy9˖-/`ڴif?$EG\~ɤ{u0u=uBvz%UPFAmRpPjsRdcxHRA?֭h G*٠#@PUm :IVeѿǮFMYu&Fqqq].njʭlذYfq!6mK>0$|8P ?G5Т _Y:kRScgm8%Ju<@l*Byy9-bƍy :m۶l׫W/&Lhh,Xc)ªUfѬY^\z%q SHJrLcP&Mغp<^/GK)&d$!2X(E+ φNedY)ɸ<Vj ۃ+!+rzF!%%nݺa04^EᤴnG))3czxIOd[((IIzUFr{;[KC{YyFТ@hvvE/D:\,!@~U֍  qINs=J;A!2%222@OR1w\bb5 {/K.%//b_梋.bժUDDDv*+Kkf3h-1a̞9;~ox6Se}*Q+yQdokSAtѭ[7š *7 NU ( 5Bڊ( DE6nu4f)DƏNw/{;f_f3~-111h4<^̧_EWck-ˊl AI P#*L"/.Ry6γ3o͠í ӟ; t|"c؝^T6-t7ZdA\6/4"oVeFE@@@M؏*ܢ1&jF́v@ (D F¡8RzB%{}AQ-Z tZ5o[ >l 5f 'OСC** FVvȲF9>G`4V|ĐLq< t,X@jj*.ϿhGqqq\ve-\_+en&F#fɄbNdVs}rZ##h4jsc~Fߝ1oQj$&&ҢICEQ-LF' -*Q<-JJ1ĄSiJ%"ֹyZ'2BwMbΌ>Bn+;V͵עpy9t:h'5fFk؛SѬXkRC'p̝Н9n]N@lnVjmi= wiyr*ܼK;Mu״ 9rXhT>@uAݾli{9c1wRg@]ySE `*j>dk7dt6<ȅ^;CEE9_5l6#oz[V0ӳgOƎ˨Q6lh4ոEQXpa|(L6d&Odl6#"`ԩS -G}Dyy*~ʊ+6n>sGXbq88!M%pG׷"3 C> )vt:q8vS#n5# ̔VL8+,pT ,)4t% 9@Q.|(1CrTczoǭ:\n0DQ^wa\wu\uUL8'׿_ vkjj8|0=ٓs=>EQ\\ ;IN('&&JAAPXXϔ)Sxٶm[F/gԩ?|/_bbbuܼ2*`ؐγL$*+5,N^l6S]];6s]]1J^h4MDD߳,x<l6555`َz'&f; I(x<^^$j--Aurһŝh UV61 Tuژ%Ij=!:^=y\v r(kDrKX.I'G9VXCXNU QI/|-uQ(׷6] MjV/t gʰK୿LgW6X,+j ݙ=CzƠR94iyh"h;o= 6(`#\#),o sKSǵT|-N[b[g@_J o ft@d7@l\xϐTO-9pȀMۼ:VC6EY|zl?8~K/a0xGټy3۷og޽;w}\|$''pBJv~˲e <'KEEܹ^x<h4 2-[`ZYf > Æ ^/͛O?Ԇ9f̘Att4eee<`ذa,[,cbي Jn9^ Hmn2'>>. Y^DQDEj5jگRt:X,fl66ͿtGX` :_ۋ9e Q<'|Z.,x$*+-TJuv_W{zh*ԳvSZn Zv$>[SNʹŬ۔E13sX![ *&皡OZjVMKİǙ4$n񝯁3v@w6|5]^T(!\}N_EA+F#>r??M 0DÞ~k ?F(>T<kxT|u-Ѱ=е]^>e`ҶN`lOq E>%Z.:IuAP'ձ"Fh߃W iIDYx0ye=oo5"⫢~O|}&=7ؓY w|=]ȥzcҟc&@MNʹ),՟ac 3wTZ%bԫ1pf,ݖOQE0BJa2v@o{6UvKɸ KK1 `< j D۫~WӮQSsx VtлJx_W@j+ b?l8 7@' O<ai$78ؙ7ks@P8rw_ƮG[>9s3l0㑑|8Ç[ordž Xd 7o h2|CZ3f aaa~COnPT31cƴkFaĉر#<?~<}6n:%MlLnn)uqݘf)//r+E4jÆ`άͿ5u2l˦PV^Wo`Ա`S}J-u%^J 838=10ޯ`5ze:˜oS綉]SųpvcVlhO5M~Vo#x\2lu*Kfƨ&^*c;slY=x]->1_[U`P DӄUYVdִ>:-U $ ^ -S!&=|[|W 6jaDxuP%¤> DW0Ew`A"+->Ct $|n_}gv?Z˾իWs%pE[oT'O?ܹstHĮ]Xp!}QZt:}O>aݺu\x$$$kϣ{<37zom(++###Q۷oڙiӦw]̯vc^jun~W橬r~f{F`z4k u,w.'DiӸzSIQCpx(i<.8?01vcn/ "Dao{kpy;k[%YAvT08%pߨ'D#|A֣𿍾{OIwυ`p߿0Y)U5 pfwշM-yjDFFbZq:ff3999,Y'x /oC}ᅬرcs=l6nfSRRaڵYcǎō7ȬYa0|p3{a޼yC$o΢EXxq`W$믱Zn斲ם\.R3kcL-iͿAPI1-nS^^NEEf9@+qev=^=IL":*(ꔴk5.f?ϻ%p\~ɤ_ɸ^6o=ĤOcBsh( {=z?>ߍ8}U^K⑧Wˊ="x0sq AG6Hӟ#S9VfoZqh_7;߬=¡ ^Io"D면K|Lc; &=jA(]V~LZ_>i|_p( '{L_" mcT߿`´~[#%֣'Jݢ@ Ad/S$u&[ʛG[+"}ᡇb\_dddp8|,\ロ^z%j5o6.2( [t~ѯ_?~GST̘1Y$蘍aX`8p-$aX1c `AJ2_~}S28c)%ز0WU*HcF{sߚIl~ݎnuZ%b0G> ܝ $Go,fgiP|‡b j z-|~\/݈+2Bwaw4q);|vPmn}M&&^{v.7g^Y;hze>7?'=m1/v'g⽿`갆 ̓U{J5[vvK[B jG*Xmϗ gt&_7 = FO( YXDG6!BYsJvY !B%LȾ" %( ,8Q6¥c|] `n?7Ai_4oxkg'(,l_xx8W]uw{ /s?_@R$yYt)<]t< |~U|ZVW [#R7o<}QBaa!$bc6lMطo%%%8f+111$&&Ν;$@eWY#|Ȧh6hT$&DqÙ:i)1')]=>5V#XWds ƐAwteQZffuI{º !B'!3&{[)\C -6}C!\4w uf;WW֓u2HG%S{7:^VEJlkWzPPq,ݚGiFm_#R|&Rc?I=n[4N6p!B%)!:?\7w?Ia?s_IzQ6nl`O)$'رeYsz/s5gf <&J}z/aqp$T}~OIKd()$ӣ[$p9}$' oo;vcjȕ3#4Шp{evp][3x擝-Uj.‚)tKʯnv?[Bq)Pn#auMЩk|ᾠ}N]0Е8x% RR6dz>ˠAxG(--?vψ駟?]wUU> |^kt|ɛoIyyW_eӇp\..o;wRRRjmS+"tޝ)S0o<&L@ddP'O I}A k2WHJb̜>sLt8 יJrݸݭk^C8F;˷~SPP ¤ ,yStҾo&**)g :)k/F P)Irv.GX)#GvKx<2js_PC֑Jôh*b |>G>ɭbݦ<H`D8yT}*;N#E5a ⻮P_GtKS0iY8DSl/_ܹ jTBŬ!"G+8:/w$(d e *ֿkj˽29Yq<=3_WfmfI5ǏognV[n!!!nbsnz(z!?+;v'W_m@AA x'|hDQDVOnnuEJEDD 2ɓ'3vXCTTT3j(t:;3G}@\--gbāDGnn3-5^z3Q0t$%E3vTƌMI~W$8]n0>fE3GއٛgUKƞ-y㈌#u4$n,+JSJ%0vd cG I N vJlXv zG(RIo}2JzIbt~}R#nN^z7NDI??gfJeTx0TDtjlNV* FE.VQVQ3ըUDjUx<k-"D )*cTrpaf{O+m P@Wl-܍dzpB~;VxtMTV)r8?a<|w8p}\p̝;nj[nYN@U`Oʸq㈏ojraV^?@VVVmZ[ۗӧs饗2t&[hgϞ( C5޽;o~:Wp46J$̤'9)#{3fTzH_u-K+`szxe8nYD\0]@^u{6ܧtŌ|.+gmtng+hTÇ$]!B DTFi9PqؖhAsV*% *εmG@e<oP⠸*s'%t3#.6Љh5j:-a1CQuirT!J13VuLQJ;fmwUƛ8RJ2?m+|. xֳHOh\* xLS3qlۄChzɫrcww[7Xl[Vשap``f:E/ö10G^KRT(hLM@@>3+Ҡsޢ(rwr &&oիWTyWK6mKnCuu5N}jFC\\9QF1rHuFll,^UV裏F$bbbgϞ$%%ѭ[7jZ{CMZT*=C߾} ئʛ״X?gILjˬZ{Q{bcN`һW2vPQcmH#:t'ApJ2"D p|JUQʎWQw߱Ia@z4ңV.ꢢƅQf@zi+0~`"W]Θ 5b +oX& %BʌN7_aa+&FJZպJ~߿BQ}q<eW;A\{Df R k^GгgOt:]@@Q/_Μ9sx?fqȑVGѠIKKL4#F0x`V+9 {fM.:h4HIIa֬Y̝;ѣG7.SRRƒ>ȗ_~b \p h/}jLF NDTR-$s0ItW݋+q:t'0ufx9ęIHLF?Pavhe&ڋbwSY줴ʁpyAq'p Q&NbTcZ7NHJ1IVn]\6$+ko<\`0_W]z8q&ddu,;`!̅GR-۷AbwG _q+T)QGR$uZh4~Kx8]OEwW]`Z-M&~;6l$?O8^/(h'99}2i$ƌC^HHH66˯( ?3<EejjjXx1WfΜ9oc7|OvvvBc2DQ^/{?_\\O?ʕ+y`::\R[璖ڄh&ٙ{Pg lBW <܀J.}oߑMll8Cdb{QĀWn.5DFjJ8)a/^Ye3ԵKBEejr-)Aa]^. I"bX7 alXTj F& M&ܣ5Wy=< :{2)IXg*`myvrHHǯMEzDA@*IҲH6uzm;wgibMPjE@khtÙ hٳ[m6 )--txPJJ"<<P7rAFAZZ.ݻ.v{zK-!;UhX\JJ>84>/MȫhzSd3tk>^8$qK~fvgWHم5T8;x$b{7{VmQ=mD %|Wڹ_s+=G*xX-'p#0yT*e*61k ֤&֤fD#]jP5,\(n/j A x :tz_P+Ɍ\U;Nc ô6ͭ+k&͂*N ^M>1aq(6K̞@XX|>S>#Ro EQxGە!$@nn.[$*X5ic\СC׻wot:$}G6]uv{g$/ۑ& "BGu{q=No"`:DıiDE(Cʪ:Vݦ@|]ɿCRF顬IفPh[Kl0jo JõJĨSQ4*<^ug*,Z7kyujt[Rm=?_ͬ{'!@i{'u)=:Ϫ4#T[B% z۳'-VD`kdb9N<[[r`R+k[ >-9>Af Aelf:"I2Ngh7*EQ/B~m>c=H{xꩧk 6{&*Q 9ĄAĄd U*mn.o`ĉyG8h/ѣ j8΀Q * e@+غ0E%UDEq廉) ݅ɨG@;NJ%b5?ҕQT(x"f"ϛ:ңɆ}̫n<~s i5*jHppQa:"MZ z5a':\GA^t{e..9R?WٗSę4Ϲҹy ^2#`lsc_ ;x ܮ sx3[f^ٜy"py}}-G|AAjw Ef(@WH#\8f l{7BL:9@Lx@2qԯ^T{9/^?NFFF ~`0( V*++1Ȳ x<7|/Q7ji |d%eW U ru6EQ4 F *X+ `44hSNe֬Yݛ? Dkj Ɯ#37jo#,nƎCzS}:#Ÿ\";TX52ˆZa<>JJ>8hD.?ۏȊrĄ^ok9UYѰ]Δ( DZĤ`ҫI1mgr}R#NjX:HS 1:#Aο" \9U9Z-2y|:<D!BR{Ⱥ֯ z-w8=rf:Vm[~o"t7V,_"@fFV:] cq0$)6Bp-J-2nOHno vAP$%%1rH͛ǘ1c޽;:._Q8v7nfݺuTUUeɒ%Ok+xǰln'q9PШERbMĚ2,.KҗX.Ea<< yyyMvRHBB ,/gȑ~ì, *x )?l8QbT*OOK؛ "ߵ @ezhTAD ȜyꅵWU?L Qz\~ڔǿbϑ noÏ0i בc$->xH1c$¨%¤EU5F=PKlʥ.aˁFqw\#1|EnEX8xn=2|^-;FbL 0usq'Tzot]IvAm{^x }Qk3f ]t{.{?Å^ȍ7Ȟ={xsϓO>ɓO>걅"͛Yz56mjmZfϛƳpV FaL_XփAws2ybbb kW]u7|3ovS4Ey?^IXS~^ARRj&::AN}VGry8KݱaDQ‚:mDQ< 8B.!NCaDVAQ|˦ƤoJVՃj^Ibҫ}Va>+)~V9ӪUL!(7;S|7ψpsh!!~Δ>(b;i*;;̪#@.ɰ վj|kLz\ؕU- h#􌇁ɾ6$H\G++ԁbUg2 rY[,2O4NÙ1c{/Ǐo>7ߤ L&Ҙ6m=zppݼ[L2y5z^b233ٲe ˗/ѣvzPDn7jS 讘4iC ;V+VF]jX|K%%|GOcl6^=SEHN&<@UJiv7`"DWDUq񼁬٘w؛Swr̾w|TǍuY|`=3F(tHgd&IC+B8$NO[.ֿu}6oS ݒ/Sw|_:f-N(;j32lয়~⡇ .A 55'|ɪ?ϋ/Haaaٷo˖-#&&4\.l^`ҤIDGGz#;;Çk.233ɡժ1AÒyA[JߴH^s2?*KCaQ%Kp饗<#,Y$ 14X,,^رßXiٛJtVH}6aw2=SQQi!X9NO݄N@ӕK.ēϭfwyy .8aN^$./n>Q8Bwu@+bcf?)(`sxcCgvU2{&ȯk3H>{>pX24>Do ;h4"XĄ҉TQ-$oέJqqqiii̙3coݺq _LJDYYeeekor!*++F 5EHElTn;jfZy嗙?~c8p 7n?Iqq1III衇ZAj?֚Į9̞9BI5j?`33wfMTTm5odvfΚpz&e%dA%1i=䫽}G+|anH<6Y{Otykn uJq&!H[6FfrÞ^6fCn6w êp  :jDQu8ꑄQw*OE܍UWØWZ\u fwm4>ȈV8D͠(;;FdWWB~ lM}z~-FV|V@N>믿_~L2QF74QZ$Il8Y6jC{t1Ax2JJ[6hTԶIRf˜4fLpOۛShP>p%Z,2&v/.͝/a q&$O!~h+N2ڛCuEMMީw*@V/ sd#niXmE\fa2ꈎ l;0 m>?GNd#""xǙ?~]]]͢EǮ]pݧJ(>}eùhrN93uX ?mm(lذÇӷ qcIii%K{n:>Cn7ƍfĉTTTp 7͛+~_PD5GfyO%[Bd"<(SRYZvClzS|Smu?5baUck$9eਜ਼&39ǫX%/h!Mr8;a D"js7gV̚4MHE p^]Uo5l AC3BXHfn7G x,??^z) pTT\}\:Mx'Xb.שT@Qa\1/v#=͠Ө]QRRºuuY|wDIyy9oo:= ,@e_&33QDQ'%hGșѨC`$v +}wcGa#lۙʹ);8JUY9Єz6GDdFLZõVtv+Fnocf>\v v^^q$D4iQ"BFv9[U`&Ԋ-ҩ%.R 0wb6.}t ;w:(e*Mh45D3@[Q;.ʊ+Ojb1WY0WZTUP^RI~NjQԚC*X8wp@Q8yyv7|%ЪAAZ%BGz[gdeYf۾;dff<6tPy&by׿EII)k"&-Esۍ~iQNg嵐M z^n`n`ٲe$,,^L edڵ8 kQDsG5`khT@u;tĥ>#hq1,]29D( H B8UTV98]-lQ@qb+ݗPze F}b9k\7Ο՗T`0pw7?'/2:/B J%(VgZV#bkI1Fb#L )HzB)q&b]&o>4A,4u?>={?u]7O?Q3̲,S\RET) G++c@S}:BdOߟhv=J^~OJ-" 2 rlCrͼF>v%eqe}ʸeFX0w +q8} E9\_yq\1/?(Gˋ_fp#!+JަTF-{R8sƦstG:7,ۖϺ=EXfEU_ `Ї R!BÊ!/[Qe 3` kcIٗmd,)gX A0_𱀶Bv):jZc LW% Zo'UYa4HJ(Orm6FmÜ9sZ_~~9:Z$=1iS;0FNN":\GTVMlEQiNZlRnҥhnx>5b |Kp) XddW5 o(\wn K`~5u n+# Z:(#q&apu[BX Bep`2noI/SaDFt~T!N/ YxbqtLԕs'l.ǫR34ptd VoW(`a>&v0ݐk@<͋ tphJ- me%ܡ9Z LFF֭[ρ袋n @H|NM\d)wE6w8‚>w5K/,##$ %øi Tlj17?l Hlp'0uL/@Th  =x|iV[&AFQ">RɠƠPi(7{0XJRD]vo<6 IR$Q|Ye0(#< '5>̝Swy$./ H>FZ%ըP;xqW%ٛS ;'s%C u!B8$/aY۩9Y~==C( [s/sO'}{'J2UǛ`A&ذ Y`sl9K8x 3 tPZiXWY1u0}z%u* {nh.fzyٽ{w*7qr0: @JJ E袋xW$br|OYx)  1Ob 23vZUeOsMO^CnTTZشsnt02wh%¹:xN{dYb u*b&&DAdP3W1b`:I2Q4*\^5{Kx}l}x\}0zɨwȿrWt_`CTdȭ@̯"l*F%”~3u`'wJc-o#dz5˒@.D7IyII +W X8 DwתbFY]Qa:ΎCe1IםL:^=;mf٣u;o =w_vgsٽ7Ecİ~̳a},YS&Jݡ_gRng1kt_ .%S{qݜ AER@#FIk0o\ ?_>&}b -?6Qÿ=(yg U'T*,ْavW;J{dEvPZZB{,+KY} pZ -;F-XEۗؼt8Jj> pn[K50g LvŽ\ߌ~#ȲLEE¯(k|IV}rv~-nrAE)ZJt(I1DF60[peV7QωU'\#;vlZ%ryAG*~wvcۯ6>j}z!|spһ+N3rxO6'_ Ihm7\s4Ukv:V) k!:r;w',*-jxwH@@eߺf\cK"D]EDYR\Էױ\e^༶঩5ۙ(O,K&l>1Ci/К_`luuTbEEi>7PEFF2sf%%%/ ZA`Tdebzk|095AKMMeM`0p饗6HĄc |ң5&-@8IQ`˶,2mݛ81̘6G/?էfZ57]?Ԕђr!9{~e{NAUd{BI#c @jnaT߶9h M70蠮J5,]Mz\w3xIQK_f}?/7Qq:<pk8sG+KU1W,6-$ƽ^}<f_!W,"(ڊ"3V~h ڊBD6&2vЉ-FkQ[5Ԧ"FxT@.g/.iU@t;ӨQ7"#GW^k4x\c8U;xˌs(ry瑘|;\@BB`z}J! ɢ׆kZjdeSiiKw.p=qv̶b4NOرӯY|npHo4×Px-,[rȟjn1dTr닫%9'ʪ|"+Xʹ/2)maJ Ҥe޹lVtw,JBˁ꠯ze*|~.,VۄvC!LD}a6{Vs97a?\aEdƯ' h8!>yp֣f^@8)wy0Ov5'F׃F:J3dP:aaz,G㵋Z矏V|ƍq8#vcƈF^u. ^ ZOrr2SL>OI\~vF#3st'":-rVg:DF),:էnƌ0M[cZny_u}:.3PDu<;b~AMy؄aG(ۍ2n `ZK85w^Пުh A^Kq5; KftOq_GbSf ~==E)ZUT(gL0(nr?f%ٺKL{zU'DfFe3C1>mQ3" Z΀֢5(H L1YIq拭^/C֖wJ^ "xhf2ɩt7!O/. $'Z* Eeꎉ5$ɸ\Chd21}k 4DQҩ=ЪۧyH}7hBE,XaZ .ojsT= (>};>r/(ԟ ͡ӪIL\N1# q6iHPx,$+!+uGٴ-xȾqs٤u]OwPR8~ߧD.E)ncPh&Mfd LlOqJYKq̆i"V% 's޸tn7!=cPW>·KbwƋHTTqQ@O+ W;x2[uW')!/3STbAE ;'5NËFK:ǘ) Ot *&,DF%%^7ت~J7YEfvرc|}uwuɨSYyo9*Ȋ :RjTɑx%n7WɯN}B.; Abdgz!:JdAYLKKO>m޼zɓ's 7p85̮+r)>fE2uT?fY-~ ?> ""r=EV8Vƅ-d*#0rp"ŷL'7"kFNJ2B ky>\:_SVް=d2vq\s5b2 JqqqGH>sgK/ E/U ;#G|w,huC/On/|qش*f4N{L=uv Q N:`6:?B:J]^;5sFuڱLMG wGq+k1EaDVoȥhQF././6)B4jF^ƠSU_pKXn<^U}up)RtZoNBTi?l8Ji(̟?#F0fywxmvKzqڏ땱X,%`o}ysq;*kvMs3FeYr;=\ jQ )\KRx  eEv]{F uaqBn/0W\vD!bÙ{Acaa!no!vytVa;51Bgyevzz ˶_ w_˕W^^\9_Mfn3C{r^ *!ZszشJNvoJ?^_g@-ChvzɱF]\:bѪט_qt"+Beuw. )K 8f*;G-:VjUWjځ-)Wiau0>w?:oq|>'`L/""믿">>| IR(-ޢ̿.s>j/U.!õ,Z&V|NjQb7Ok%N-.dEAVj$2az ҵ/{du˒4Dh?sMzVC|dgg?[RSSەMĄl-[8"3 VniԾ`0pw3`6o֬Y *-.nmB}#8x<?۴t(Xm@a{XFEA0eh H~QEVٓ{ktO8DGsxIdʑB3+ 0vX&Lt /S[WX\4n_VdIB8Cal2ݢNn7\^H :t&))b;AkK;b% 6Sns ʌFad1իy<~aY|9ՀGVkP[k 6˭bje[v6UX_RxG3<m|N3g,>$Yfٶ|A'5˦n;V m>!~+DF_Qf%BhVPnk ua  @T9ZZx:yBDzZ:/j"Q4xs[痭T[O?Nǵ^Nh4c2uvC0./+p_)%C#MS֩kV,P T:3XAQ!"Ȩ j*LƏYjO@m݆(qJE߾}TWWEQm0>2G 5e.ƅ##+J<.ڣ:\.$IjRRfΜ /@TTTs޼y,Z ])T8yKb! !BDFX\hB4!GzZ$a&mqjEN3h5k0a   m65N"#t:}.=ZY95rټfN<^ YV$Vzqݘ37G0Ee/Voj?{h Wx$`={v5 "JLt*Q+@ye}D'uZS'OHOCKKA¸d@.?Cy=_CeΩNف%r撬Re^^[j{pJD]s8.7p+mg1{t>9̯(̞=cp8vAN>8p8 INIe׋  E K⓯}:萀oUbу[:_eV@92?(?qW 8(dR; ᆖ'|ujlRy?ccwz1O|z Yx +:=k+|.OWd@)MP\tE&)cccc:u*/$Y GAhRDwsix,]& B L"6:?&I2A!Z( āIٰc4iTD.3n a s5t j ACzZ$i̝eJ;6*;e6j,.N/*@IKrb8I aD9p#Ao]nKq?<DfJ @~ٚGU^ϼy,"''5j뮻 x<(BM3x^<NYX,mV\}&g=/d`xkR^sň$SwʐEQ8x Z퉖}->|➤U!= 6^$Æ&#6I.**,^ǓԲsWe~̙9oo[znFZE4aTTZ ǭ}ܭQ8y6 | ߬@^UV7##‰pS?r=c*pQ9Zϣ*?cX);;Ei$''s 'p ';KO oP^oiy=}q/,lmXN} ncO]H"9MU8eKOxt*Q~c4Aq ˋ^]u_G&_7z"=-ĨaʊR]++:q<]^\n/*x .zU.*+p8ݨo_@nWsavѧ06]4+בIJq(eOnqvݜ{̝;ӵkWCBDA Qp=`MgUMgݮ2l3߯ɧբҒ/ZMD%\UW]Q5blݺ5pzy?ㆳG4i0~hW~Xz(e`N(չ؝[u{عJE Akv RClIBUk0fҭV3) $%HKM$%َnj1$fDRUJyٲ5(߉~G奺&tƪ7Y;]Ea)k:$Z`tB%Ij1a6Z͘$ѷ4IXfDQkAj9fƏȸ19JHb27 5njj݁dCaԈn M#ޫvxamA://`ehQ0[Dy5;"~-f#Mٕ[׶U5<<_܃a )iLwLNNf-ρXjUx`ӻw?:tn&|N| ӧ;ct\O勆v"XM"9NYeޖ24u6PVLxKՓ}iۊCBlL\55<ϾX( X,&,Iv,f6)̺^dE-e:kzCv]_yk):SĎ]G{v:lgEXvi<̜9=S5CWT率am5EQc񤤤t:)//@n_jj*]taԨQ;wy曁B rjУ09̍`FOEPY`M,^¢J5vx((ӎbQg? F4 LVF2Ӧ 猙HJ<|^tcSG3m6noP(9,9 1:|!zp3uLC}zүϡ܈tnv}YJKK#SU_6咇Jq9sK7'%?W^AC5u=nGiӸ馛?k_m#```prLvf)5-S{bkGJChDu?}( ҋn=>>G*~>uAt@j6Q=% 7+s9'n4Wb˖-1EX:mEɦ,i ?M,B6l)[%vt-,h,{q{e/nE%+(Ruwzb*և 8V݃,7^'IH4$,PtMYQT ESJn麎Qx.7?>Gz<}OSuv)b[`r$&ZE(Bm`p(՝cuyUynu!;Uyy5!$'Ѥ&6zG#K-"dv۷/v999y睔DF1 za)#{RT8FsmQ>Sv~ȑ 4UUz7|3y*/0J ~JYϚ2k|7u5~3rQ4XuAUGuLRx?7ӢYV0I_*ч?\Ub:5"vb`Fj}UQuᯣ:hްlF40 sUϫpnk4 7A@GGQu܊81s G1ZEn30h)&5aպBa=\:|$GYۤo6\q`Ι/dޢZ~c8wj.ꝡ$qYgW\f3:(|& 2Çgȑqz ;tbd2qg4Iz`\Q)q:C'Yt>l+3g s(Tp uȮJ7m)+EmN@_ эZНA&͆(|s{Xl6#"łnfaٰZPXXȶm"pr`q?O[1m0$BfD)qQQW)ij_,ϋ_ne˾ʐ즰X,p饗r0dȐw$FC*j8.@aCaa)3Zy8W{x&AV}3M<.$Q. N8]EӐ5 s  ,eUՀq }tB_{͡y 8{; 8%Gr3S}*M +yj:>*tKU1QT-4 )EңPUZ' * NT'++hwWUN*nNNWsNt\-q)=}#۲{#5-GI-cDΛ#s&d=FIĴ/mǣʼVRRgyfO׮][ؼysLzA8c#5+¶m"իY!A׋ilC ={6-x- 5ƩӏRmq=󷗳eW(xRX SZɞRV<%Z4uT Y,hAe^o`Ρ,˨Ձ(=(!& Ʉbjb61X,{mc=E1#WVBp]lXY+pIBB Yؙ_ͧKspr kYb0h nf.6U?3yd6mnxrIM8Zx#kv6Pʲw 70G|[yem0%.I Y1K" fe]Qt_u Y-UMG5'!5<õq5Mg:AstEgE{xm-vl;P潱Myid$>*j|87R(piC蒙آ{URRZ~Сs1ׂ 0m4Ν=_|US*]y뭷:t(\sM;v矏E:8jH`bb"ٲeKT̓Z~|^}N|ET ږ2Q}x]>K)(`홉R@opex/`!jʨaR߻WOHH}MPU׋tp8p\A^CdztjMUV!EQk Žpߟ/Σ^Eg۹hΝҟ=S2FQQ懵|x?o.t^K&}rM7yi.wޡΧnOT*1@EG*:Ut]gێ|lL\C:JtAK;W^GeU謻7+#}c$ 1[%Qxp] #'&O.ਏ©P'ENN:?< 1o6ILL$33pkbEhN}qM[G`Yʆ=<3w3v'nv&Y r{\^7%UN*ٶm*-ƅjq$ѫW/zjzjQO߾}ٲeK`]i_pLލEK̗_رZx+kz}lhmM0X.jRB#ن\srXu88W0n~:Or'"шQt;=y.yåQe ||?D̈́(X"3^_ޮ۫i:fm[lG\s57i_gd21sLoHK*>qīg7{o67'C)cH?)54Bگ|xl{+aAx/- M'ĉ8w;  |6R*ш R;;vLJ2SD]h/_VE4h\s gϦO/:{!ikvQQ&3%>%i3kR_>Z'`x }"5+wRXԴC^ K֠2uRߗD8V:ǻxSY ?cbtM3f`׋n-?X;jՀúrgۊhi]K.Gy+2dl6ӳgϸ\z饼 7͛7sRPP}ff&w_iڵ+?<_F8t]g2~wqFt7CPVxyT sd-yM a  ] :zt4Dc2I:v`[kFȯ>k [:f;h6_uJ222;w.yyyVA$DƍYgŹˀ~4Ȍ3ؾ}{*F8DtM$F^cwܩy۝׫U8uII ( @P;!Z>ux|ϱW ^k胿Gђ{9X-Y6GEkv[zh/uuqïg6$ ݎjfTqW& ܲ, 5Mgb~{ئ/A 9̘֏tz|s 9=R8m|G-^_w Fb(_|;[@^AM)P藺09t:ywXnO>$'|2(2v3%.ٳ+j$Is9hQ {\uU,]4l(;gg/~Ό׫R^Uq{.ńXRvcH躎bB|CKaL"VQ4f1pOKjC70O6 E$Iݟas}wJ+т*"f2ΙHodZst:+ݺb1B /=?G}իٿ?,#rV8{ZZc֬Yqs1$%%;*9SyWdC!NBk(P1nؘ$9Ԇ.(`/ۘuڸǗ$1DNzM߾}0IF0 6~l#B ةBnFs6;o͸ vX4^ !~4Z_N5ܾe9\z55ql6D G1 33Q%ɜǗ🛧p޴Ch`,rŅ#VUye]*s>aī&MK$lPU YBtDQ8 lVIV,2N[Df%b1Dv&I$)Bj U"3=C;ުjA**VK6z2W#5}RZ_ `F[Φm %FtX3fίУ{YY)օRYYIFFfb֬Y}v֮]˖-[+V$I"3330gfСL0 &0p@lwqtޝ{:]PVFD5~;(SeYoVsX>.tf D /7—۷LA4D;oeicxuQC TXL is1F8_H=iYNiE<#{=[  -LA"b;:@$hF+I }*%%%8pƐ,Mƴi\.y,X@FF&d$I =z`Ĉ!jE # &|Q$r(^GAYIAQfڔQd Ei1DEGг.G'=M_cwymʪ]++p%c j:O}qJrotDf7m-ᦻbMA%6V+\s ?"~Ku3<øqNAAA̷eر#Z$-[INNFu*+#l yGѣ!~eȐ!\Q_}?k^x,2ңCn喸y?{楗^Bu|3jk֬gϞ<쳼̙3C=x9ӣ˲o'v C;4.y[ڻ;͐[XM3(_H0Vvj26`G9!ӝ$ M6QWW _um֚UI'2xUZڻQ$E4MgŪ8?=g`5nk6# :2Klڸcxs32;fGV[;kU;B+ :"))m?}@s4, \r q^PKtM|}1iiiL:I&WWW|J)Ayy955}͋/ȉ'x<*}qO<1(ef5%V!/BmXX,lnfn /G~p`?De ڍ=U!6h52mDv%]@ѽ-k :ebZpSSSOfHTT唔 9yyy(ny555@HI7:!Y4-/%v!jMSxm?.}Y5?dełX,t]d2i!CDmmo]-am)VdECTMG@dY$Ғ, ʺeTu{9ii$'!fs)Kב>M /)>DVV./zmHV=4NxF?k6Ĝtx<*sWe U*]HK5*"ӧ㳷.,/E vyd&1袬\4}߭gƢr2Nmxn6Ǎia:OY 7BcԨQ|G̛7_lݺǃ $$$p5pnݺ mYoꪫ9[o~2zCjgϞ \z饬_>Vy_Ls(yIKUMUkݎj%99ݎb 1̃#CKG+++y÷SU5P[eE7SY:$1w8CzElWRE>Ϯ lO:jxov1V+wqX,\|Ŝq̝;o;JF kϜf3G?v̗r  듎( sSHNhZo_q-g5TwgVM?(\}Vy$]wp𧦦_3yvӇ~ȕW^D+x(7o7x#%%5MP635=~}m ?9vxOEƌ|YYv-ƍpi&8GTUU`$I㊋+/r+rkW4 ]7ٮ۵QԆ\K,FO)4U됩wPgM"%;)$u#Y:e?L(j^O^x 5N^: ˋM] ۋAUUiXZ #+jW5M4UBj**(ȾjФAaa!9{q#OcrZt>b}ߚ1"mI_Z4-Koxg3rxu#vf#yU|ݺ$񯿝1S+xх %IjӤKmmmGw۷fCE o}-H" GlWj @)`j^[Sun tU4ECtQCU^D3Y6R{&%q:Eu@ca) 5LQ|S$ȷ~識ɁP-}WG?Џn^]ʎQ. /j”j;(ҍ `;]hS5G 75Ez$xJu4M˶h&$.2֔pZx>7 _^?y'}c D n+~sh^?u$)  o9_~b?,4~-ckmǦgюќC5X>JK;{χhߏuP_/f"_:'Lܯf۸qlWCtEy[;:UQsAy嗇ko?x.\-//'//]3g$;;.݇*ѳ{ ]==nRLGUy9~<2CNIiy}umLA%*Ջ6 Vh*Ÿ[#U 7#z0Gf 7ʂgX`_'l6ro6Bi`о2H˘; ,&1>%1,hz70S0lptZVsKMoU@Q/'=AղsՂ]WA 6~ͶqFA`СRZZ k2gΜV?nYYׯg,\|*++ᛋzڰa>=և~ȟg1Z,f̘7&LE]u;?\n=*yɥzx/3M/P4eSSS{ _3:CR$bPcn\;C˰2S}ˊq״MAv)< 6Fzlpv p#?ZH5  -#)tҿoڑAn3q/q{|Τz/ ٱ6.Z(/ݺuo; 976k:1#Mnm&Qút]uT\Ӌۣ`7&:!͔[Zueh ^H7 D'U63D=Gg!4DjS*i OMP o+V^mSm6Vp_Fj ԺƼ+,~Y,n)uR5000,kYQ+a=qyelX}2>\kWsƶ<rʵ_x1SRR8n/{A (,,O(Q__ϖ-[/tdyw;~Ψƿ$IL0L6-q9w߱e˖fY]Vrʉ9^kf;\yhNU1Q2񨔖=C۠ZsQÆwAH>AlQ9@ĸ麎OT47WNZ/gϞ;@hNh,hw|(vgsrbj3ܦ|h|8FAbD}˲#!Njkm&ˣć9{r?%vTBtW70cj?flK~ُDrrr>}gv2^s:Յ'ٵkWw櫯/dڵ8 N2wopӽ{hfml6.2D2vXmxOAAA;rXjrJ~7("fqm3L|@}.x27@zU@ @4 MӍ*4w.M$7kQ]e,m}J*ҝըrpA~;l&!}jxj*6V?5Nj bX,lR]pd#蒕Wa@Y4Yxm\t@OlnrH* ml&;;Ç3k,&MD vܸq~!E+ +,..' $I\zoK>55QN$wv/z4= NYCtF0[!)^#˪j.XLXt@nD ֕8+iyJvB*rl, )eդI2nA !!Hh^55`p\vH^wCH@~lY@?7s K7hhFOg`gGԷv:oʕ+4- ךߟիWfEf3$%%l]ٲe t֭6WX޽{޽;ӦMOfʔ)ݻI#sL4o6dƍK4gyM6Eӟoܾۛ9?ݻ%1cZٚ(f VÑe-bנٶ,!TWh5:c{nUCp_'YQ/wus3uJ\=%zRRR^ kۡG ;W_::$'ZuXe-H5IN09ݨ(][/@|`q}FG;ve+V/i7#T՞ihY, 9sYf *W\qkvfqUWE{<}n7;wߏ8ݺuG܇qFv~Y+Ԟ,rţ;2v%#h(jtcPf f]ףMECU5mmfwߵj[zf.7iP\ R``````Ҍ%wǍ1*>]p Ͽ{**jݵvVs|FȜLx4za9n]*}x!o<4]g" kҐYvmԶDQOkF{Ę,Yfk[2N>}XjU``ڵL8U4M h~2a;SPnW;Z11!ǠcqA種cs)Fxmf2gx][DkaTG̅9CIjPRY?/뼽8;\`````Au^o`( ǜIRUʣ޴AW7rѱT'9^$X%XM‰%7Dk(ܾceUh?dDLVF O"%I:Rǣ-7 ڎOL!"ޒ-=2I>~huuN]9GoD@uUl b%{:Tyݸb/6o:_8?7s8-+//+keРA1g%tB~(((|.]ʏ?̙3>0fRRR(//+--sݻwNrr2uuu'0eʔ۪ʖ-[oYp!6m2𼋆$I$&&b6 ٮ*,QF /8?//뮻͛7G}l()s-/~!A[# fD, `ht Ju$ȥ|@AXzdwV[ݴ NWO Te'lRŋ6P<*m۶!rO.U`b  /1[@.Q6$I 9_܏`ёh#oY+7<>|?TG;^3iܗO8yo<OY=~_/}ѮG>cG|=CܿhYXZS7?¿mγhZgCV]9p}s .,(ѮU4G@\ߛ~g A_mtxͥ9ã2/}{pCz]gʛCUUÓO>_7L_Z^xMvHJ2p@t 6ӧzUU7os]v}i&VZڵk)..zX,RRRݻ7z*f͢w\3y6,FTWWszC|!33UR: V,k;¼;/ ll}Ӄ\c|7J/~grz@YI!9jyqݽj;0F5~2zc϶MXNje7^s&-=~S緩gh}{9js2xqiQphI,OK>K0|#܈:v׬Dh~CpL< k Z?o.fqn+nWgÞr+|*b2eA@&GSO=W_}~;̙Czzzv^x!>,UUU Yh+Wd-;-@FzeҤI?i$֮]'|2& jjjp\!6юo6ٳ'cƌSOe ><#PYYã .v֍^x?>⽦p|W=H HC47.]c_+-BRJc+(VV5u f [Nc21JK#  %;!%^Ueiq>X(-.fa~mʹgۦ XziMZzC9gN?g߶[&9^ߓxQo$'Yxƍny.H9al?8puzy)~Eúq)Q²UU%99SO=[oO?sRRRܹs=p'QF1rH.]اW_}Si*ĉO ,vZf=3x뭷FUUms%Ƅ  8#J`֬Ylذ!"cɜtIq~FzM|㍘"aD&D 63]$tId7df1a5K$QE)WVqyT^zӣPQ5GAt.5{< ΰaHL<*䢿]bG ڟylVJLKԠ𯹼hrcl6 t+b'xWb2D}myqz+&[0uJh0L^Q$&ħn`:m0r uXM{+8vp_qg=vBqwyfرc}vvGo^7PnΜ9s=h>e˖35Mcܹ#FĉIJJז-[eY5ӧsoƌ^l6RSS>|8r gy&C +o.⥗^$d֭[)..nQ5yRhe5K$XMNfHt&fdN9=RII[\joWqQh:XEwK,2<=3GkyA\*}i=6 WEt2-d \YitIIvL) !tO@2hq87AW_wp,!݊ił9QVQOIi=%eJ멬rQQ颶CKS)RjM)+jΟߩ# HHаQU-28eA|Z[, `ZLHKѳqczp┾$=S1+CFUuZ[&3+.- g e߾}y晌9K/ /O? kd#" +++y:t(fUU̟?Mk׮ٳZ233fq:lcȑL8c9^z]&5j}pBʸ),,~KAqi{)6RM"6$1O:cfrLLzf%do۫ćy5YV D)? fXQ0qYV)@U}mzjUHshw\LmqY¿lGJ DX&MY6; "6^zE=;xrJrj9*S )ˎW ?"5n4MopTVuUnj|>Go?ǣB\ [*B E4= "$EՐDU-UCEC·V÷ vXt6ZϾ'㶴obAlJoc]֦Ws u_x"93ceL:X-{->( ج&L&1`[&fńfbHL0c$͘L"VkeеS5=`, }ImY-LHB$KK!Ib{XMM'd}ϬD\NkQ{. dggSYYd";;k}ҥKypDQdȑ曌1iӦbŊm=X-[vH i^z)|I‚ SȲoj%##l)x㏹qCg8 f$3w̛7/ {}`1I$躎b:"ϰ=5O|:?n A`$''ʱXf ,#cРAv{uV #'|ULA07Y~WBK j3AQ 4D$O"X:[VLC N#dFvUW|:sx$vFhT{dޗ?Xsd$QQE|CEx\nWAih^Ux}J8$Um'+*ǫjkʲދWVq8Ȋ)M}ΈWV1|NfMbqA:&0$4Mf )0X lj a6:;$$"I"$`|Z%߬W'ϛPP4MGG_kDTsLI sqT{̼^]; drv?];YwDQlDyV06t'Ug;}(YmCQQ|nǫ=J>4{ ɲ2)c2 3@/+Z:Ip_W.1`̺B[߀݄̾$9_=`1p?{p/YmSY] ^_.߰D`ߎ4EQb}?m%=k\kI YѐXoxˊ,!. <k q3'5>Ỗ&fBDX,IlVI-XV,5֦LzrE"1 0hQIL0#+6)6B ~;#wy!V:y]ZԞj9ٲ :L>={P\\C=ΓO>ɴiӰl̜9O ].+W`XӧOYgE=ػwoUVi&ƍsߚNOdi2=2luGov;kb0LӇ~&DpoȇW6#Ij'% u.b[j HLO{7jҁH0*uŹHꒀ=Ҽ’ֶ+s( W D !v+.bUYM("/*6 [n7v+$&QUo4oL"3=^Մ׫bH#ۿ1{u7=^Y-}Q.%f)`(ʲPFo\_3QFǃ-c2x*f04ġgRfBQ5ȲJbEx>d~iy˃"t6l7M7݄jl4kjj7o^9柔DuuuOvmmv̖bۙ={6O=THzUU^L஻wAbܦ'[y[*`u>.OaIII : bx~ 5?cu`.?@M;LOe-+73XlIZH@Hn=8[O 弽k+Vrt @&`3y]!&GĝiqUu.|&/$`„ ̝;D>~mLBB@Uu~^/_o-"&M={{ĉ,X;1c6l4h+V #\bgqFQgȐ!,^8B ׿cPӣx )Ak uV:,)I&r Rxh/\RHo RvF$[b```````NtEWocؤ'[hΚ5k_lnয়~> 99?< A:u*seΜ9!MXjU ;۷cǎ9^5jTq YfMP=z4'N8?{/ Y'2O>$30{.KrB |'K &pw2sL#g aW@Hz~ᇸt]޽ѣGN~Տy8v.OQ,[}bs LcX,MlH48dfGW 3jD,Er EHY$u Mw AE}D!Оa$7: A;2g>$BSVTl 5+?GMj.;iP@tcdɒm333;d#O?4z j{ވe!k5Kw4"{qq17|3wnA% ^y0 j>oAuu5.[yٜ~3N" ?w:/1Z^S]E,O66p:ʹbW:P01+%8D3h} kBW$ZdhhoGΠ=%zTA8\U%DIY1p3wcI"fmyh@4;n=BS vyGiii;=ztD*.]zH*R>IDAT F8_WVVlٲV9fksi_5w}7֭_I<}Tj< tg3% ;ZL4ݻcڴo65M;V5@t:;ev {7cUBsE/="w)[XIt߬ddDwvlȌio8'Ο.=(\uviشiS9r$}'tRTEUU.]*e2.r9Z1c0rȈ{QRm<~dN96zJFkK_\Jg橩̘1S d= kLuM A-R18)ҏ;)~oqv|J/C)R,QsA3m ޓ````````8nLN?" Qxይ p9#8ZN۷3gꫯ(oo߾{\p9̺zy-%##믿>1c`7hΊ+?c6gώpAh3еāM^EE/r~EQbF~ :u= GCA3rg_-"!D MgMZ$, &Dc<A@2ӬY}I00000000X,3!j%|gEhX̙13C˲Lyy9r zkRxW1bD{eee_G>tBff&{.*&L6Xva9ENug o3㿪/.w-ff$#G2vXQopўD-Ёqް{O"0kgg!~4&g0>3?COMI64ɤL$G"}:$>2dfoFCbNhZ00000000 L:30^BiuC-2.iTUrꫯrE(% 11?.ŋcă>ȧ~W_}G}رc9묳B RQݠ#0`&OU=[ʸyyf&ԃp?~<Zա!sщU jAM}xD NF ]ըb%mVc!d i1*'`}qV?՗agaEZ$$sf}500000000 Yϒ_SVjṋ65y=<O?qy'Ō3ҥ  4+Vv[E,j2mڴuSL!11@.\}3L&.r+سmO!;[fgV"3W-NV$3iILˣP"({)vQQǍE|dUqHzz:$%%us:M#(rؽg7*Ʉaa;@O!qT>: A1=8fΊƷ;8oZc:ͳG[Tk_ou{rsr 7D Q 0 m6JJJ۷!)H߾}ټys`ݮ]eРAmrCeƌۗ;w6x42eV(A@lEEBD&$QfP5]WAG(wMyDZZ "9`/mgt:mbpTUq9PI4^,A~1 6NM]`n_ 0|Q=# 2W!ܱY$Dn} 9SHN0p+<O<1" 6r?#33LJ̆UTTt44;Hb3ߺU\:e.Աmؙ_ͮjJ}N:Uu^5nl6ӿF! "*i/@Yj®d$5YMp\?=V00000000`>&/$<HO&g3sCYB Z{1qdAԩS#B^ow^H(|R . 55.,fGΈ#߿7GgbDu 9]2b8:"EuxCQd_U T+ Ϳ!]"sdTܛj#Q9R{:g6}HKa0|?eo4>A ΨQHKKkچkz*LGbDMzUuFud&nP\_40000000\z1j; !x^u>1S ncIQx*d޼y'ӦM 1jjjظqcy|xӧCQ4j<ϯfOn5,QQU EՐ$Q8Xpa4H4hPTlqp4r4`2];U8+2mĠ})( ]a5CVn[~]GuT00000000$'Y)XQ+3ú$QGWZ _l 0شi{/ZTqĉX,,Z /U3fЯ_¾/һw6;E]T8u M&t;vƍIUsoeL&K~:t4u]mjp8B:• ]u!Yf_pZ@cE B2)_'yoEjx 0GH|g;Q=z4!t]gڵMkI'23\\\dB{[DFuX~6n=cyu_v6!CtxXGttlXUk(2)>1@Qj'Wq@č00000000"e2Un˾ |n*jc& ꕊv@C=Į]"`ĈK^^^-{. n>M/zCH93"يJUP%{yUMN, @rr2FgϞ.5"^DQt)@ԈA #KM njd%Awၰ`1cJ ho^=RN!kR{Up?MԷB-*ZU?U3ΈͬaՇݧ8c߿ȺuֱcǎV?1+"D{/hk%+d̛J˲Ur+,ƌsԈ"<)D!2|nO|'tK9wA L52Hc8 N??.Y :9 9ޯ짽!"~-Aowr2z>MϘ7o^{'pBD{EQXpae,Lb 2ViP]]MII zE \=N81b۲ 'Ͽ%Y=?DQgϞs1-0Ah{H wU(Q:=ӀGydړdÔfD{f*7r#?p_w;kupZƕ2d}߾}իW:@ͅ^* ,>bk64α?&$IӇ!CD1? v躎ܣ!3Ct<:;v*AE!U)Rj"Ekc8 f9E)Q5t7qK8[kXZgEti.kqmܸ_~9dϏض}5iӦѭ[c5]Ynܦ(X,HJJ"!! h?gDW]WVm;_IaG_,)4Hhi"l8:VVS`z8#X{g!DwI2GADY-J>"7W؇HgTFMwDGV]P%. y>g)--+!uuu^;B#s矧DQ 555,\08a{c2ŋC#4MXoiy}3&srrׯ_9+: )@Iiz\ Gf@ V*2ʖMTp̘ڏ_ϿѤ8^Rl Y:zdRY"h`[TT?u]7vu_MZM^ey|@|UU7o7tS ?8yC:/){c2EJҷoNgCdhvV5ZAnR^V0=1P%R>44=8-brSgsxlOv|j:޼5+dnafsQ4>cxB.:Wfb֩8d"5rQi>JtNs9&%lųGЧW*?.;U8]2S&ѽ+];M rv /ᠲt2dJJJXt)W\qE-x)** Sw?uW##@UzgY"9<^%AJEޤ%@ - @Q5 ֞Rǘ{7I< 2cPr WEU,3HOhi6Rd:S'qc{}!Bfn̊_i5/&HKK ;3YlAUEqwXuݻs3 ;rcQgAb9(pF@GbպB\ @LoWJ}p#x| @Z=S:'ПOIӧW*I2rX׈vOkA]Ʈ58ךO?jA[u»l.d}xڦ}loS:Clʆ|~Qa/.9+ ؇nNƉ000000000huFMjJ1kO!5Umz!C7q#Fpg>k|)_N>[4i7:\F @GͶei Jq'v (Vg` zHX_XTöK7.Pt8mzl6Vke EBg"EGLߙ"7zJA;Pt⒰)嫆"A.PB#7+Ym81*q~)ʺuAc+1{lnʕ+eM{L83g|`6fΙNb~gpQ#7rp8Y:O V&[pV 3sf"m©sx5!Y eٱ'NHvv6uVڵk7<uuuDQn78NƎ_SS᚛10'O q8͛ZbA$$I wl(w2!ȲRʵ›o\Y蒂`89 A0ntwzvOaϾʐ[=HRֈ6;vnݘ>}: WVVyfN>69를* 9pSUUEmm-555J]]veMx<躎,!]ΎQC4<x)E1?jl)i( A&`AE]w 5A7wEQDL& I1L8]kQ~]肈 EE}GF/#xkpMpjGEQ5涍4z<.Y$&`͆j&%}*'!5Sz000000000tJ丱=_˜_XŞܽjC|ݬYxp|e\.?a9^/QRRݻٿ?[lRSS7( pۇH7{:y(Irݗ- >q6(cT $Q@}@}2t̒$("f IBh H(!"R_Y (/DxJJL" v3a4Y z/ϩr+hx|KU4$: v3z/S˥0؞zDƏq.l&šЕ)vJ厰`Jm>````````` F٧ xP[fŪغt:#I 4@UU͛ȑ#qx<C+**p:ze˅ 8N4Mpxp\xN#Fnw$"*Z'u>R|7 @/WcB" pſ]{*rk躎!ڠaH :t-\.A%UU 4i:dqd^5{Ue{)o',i3nU"}K:(!m^ KU؟W܊odl^:MN;tΑt>`&`ןq^mgD "G'{LZcu {zI/… VlnT1QE.gP ؠ"OL>h{a}O++];)W">čv\ɥ+[+3>/ 2Q,6t.Cv  0BT1~O|2*I,Ոݫ?kiV{{;jۗ H_hHLCP+'؍-Sti UaHE=nl^/W] zGʓOU(glW݅߆7'X@AAW?n=00r+4ZQ@3("k<ꆘWMn('bcI,%20$eg<|̤LV0+jS oqBhnm=n{ZbؠPFT^ǟ%nܵRʱ[*TCb[cַO T%ΆCu(hؽ&2nLƶjc㶉6Dz!h(v81Fnj~ZSLLމ͜G20#AA1%2z.c>ӅRA3:h&g, @bc&ZiA8#9Cbv΁DN @+*qiXLá` K%2DuGFlqm9_j\_v־9eE$9 bc"1֍OP/P~"kAAIq%0\ڎ)Es}" x1by%'n Ax3ؕk(F ŗV(Qk4*AeD`qvy)tClcJULFQ",QAV$(a~[  0lnUT[Ӊum!O7WFN{5I k땣RT t cOKޔqv&[`Lnl$To:]  PD$m!8><T\>8xqvKno/Kʕrw @-Y?7@zukMf>^.(Lj+סV̹guQFIBlg&6}").|I  #1CA1bH:Śk" {GW29 %)<@'ryV(ݕ%nXrʵ{9_o9sM'-1!UPlTjodviDY4" q  Z 1Śivgp!b'K% \M5Vc($8J:i_yɼO>PLg41VQj jFhLNtS7lXm(W#hkqZڜ 1Tci| c's'%Nܛ0uGMi5 T)X(x,5y٬f*x:lV3Z1Mp>+JɦTXvyv_:d  00]:эG횡oҟ{47#.=G_ڷkj/eP쐆y٩ecƲ18m?~dZ;>oqĝ(>/j|fw;gd(j)0VKf^q(Wތݾ׉ծ!3zM  #W060a GE9ona +j JD!܍$Ơ"@mFݑn#YѦ?nd<4F-x6_Yם#M>P@N] C3d86^cZB[uv AA|+@u*r I-tJ Ke|K/} (!I RR9T\T]Lj(r ZP*ETrD4#(ZI!Lȉ`h<{7|6 |B56,x`a4Z-! c& ~Xd~Gv((vihŁh AAhȟ8FA+Eb]Dn{P2ͨd׽ ?1ja] IKQ c7*Uq@Nq05ev&ǙSLNd}# ]jxxJ(W"0\(W"JJLdžZqQDu@] G.xLVL2x"sF)ؐxND(vV_{v{\~[˲|MhI6 GEcY;}~`s1lCRlCZFͭJәYeeVFb*rͭZ-!̇&J,`f&VgNM ffԵ"_^'G2AA~ı!N3HHQ英xZM?b(JZqԁh84@kDlm;-._-{qk׋\_.ֳ/j [!ql(׳!4K,a0lQRRFlv׶pN-NueXkᅕVKn6*N'-  BȠ5M/E0|sRJq g\iLK^e [!a֖QU\ج?^[wϭW.ʹ86lnU SSZSBfֺ15\Rb2z_]F7\78AAFkmG?y ;_FJ[6#nEi5͟p;ouI26fy4}Fpq@-J sg8{z:omm@)M,  k,*Fr(t~3b.7s7jTF{?q;y.Kdn6|SZ{DIzZ? A G+527WlO~qo Ea8AAF %.z'Qg4J7a3ѺNAk ݉kFqxu[kKjԑn  #@+uk"?D͸O~/Z& S AA[P}c;&ӞR>ĵjBIR~2YŴ39_2a 9_ӓ;߫NpD  Н`-0$/\A(l" a8 jg&{2 5qNޏwڷ-_ yVDGq  mGTDZtwm`ߕ#wUUj {C?=bFeCf(r6ۈcCu'joywq  H SmS͉)nݶTG'>jBmQ&u {s(j"JAvtA  #֪#V+%F!G,]>\8={}"CQ!&@%Z7 3-A  #cž6qh]MK+ >6t~NxHWRx}]ZA AAaLweVISZ > Z[S=3y#ƁT@zE*A+z2 jQFuo;Xt5+=:AA1!I 1Ƃo6V/`0xoSMM)S=@ °lk}5fHi[N)HרutGPxE  #VVu@c[>`2-lڇrl;2P#&;^I]5Zz^1fyDXkwXi}뫡 v0$厬{0:z,:.nvC;<|cn6zG (ZWVz$Q0ϹHpP76#PKbfCFӥ04۵SgT"KuL§~OϽ^K!slD[B88?(gzQQQB8 s b`,ۍ?t|5וtZcՒpY]/j9_&gx@4xvmw(АG=&gzApvAJb*$2IK`L0qRlq *JuI`a4 ՙ0MM帒˅jgiV0{|~%`\x !N٣pX k۰Y:Gc0, UʶFMDCO,dž$D^mEWg"sӯ@k2D0Y\:ǧ|sW z~Yq'a׎zQ8QB8dT=%ZHH 驩Dz [-(Uz$Q 8.Ԣ#-\~Kw04iBӑ5yZ4X^-q/ա?yOV13Aka}E%Rxe MXsN=a< |q ĖD~G?kE" G'&㩎ks/hEv̅*_cOb,;ZDƞFF_g^ T '.'<څ֪e6߽008|Ł޿yI{M /eX-8B ILz(P 8 `aJB\Z:_ftl`~7^Lv xߌ z~|O4w/tJ|>lUd\2ޟq՚3#{ pjX Lbښgg (j˅GkeV8D@Gj-l I kԾˆ D84G \ـ=׷ܺ?bZ@{n;%uXNL.|'՘z@+MbcY>OKTp}֪ k!-we]-fg5׷@:RmG$h$tѮn,js$", 65H EpP ^w4];>q^&LLz,Xcau<r3`&ދI-{#q@N/MbK[8p$Ib;BX Bz`2#4 gWOY~"}qRmMk%P &xʵ .K08n2ظISWz[e804M\pdi8&P8ƚSG]( }d,#V pZ idzCP Hsd,lCk1ΩPSNLd\ yZGnO\/\Q=,@+E&c('pxyzW ys C/E$i(k\A+~W'/q>K,t _n Z碀/pk6]KQ6cݶ$@lɖ#|e!/My]>]Pq7sm_txca1 sE@ K`֍Ϳ{M(QC1$ |x <Ztv{BQnY/^{eQ{OXoHiU/s&CٕbȧYὟx+`яїC60 +:ac+{@mP+(@v$o]ݹQ XO')5SXvEkwL\QYR e-I]gNueE u^4bãϯ[x}_xiJ'8]wX)vXy~l!=0iMe6'@ZbB3ڟ^Z*jxڟkuhߏqO|Ht~O9΍LǗba]F^aSv6kj!nscŇx 2m&n9eF{|ϝ5n+=Mxov('V7r.o1dU2,,oT>Vj'6wL]ay* [LhCN N*Fs#ѼXx< jKs9~K͒f/ֆNG%|ѫw=GFeo]xwg+KN=jJOgGPYMiR0;R?*+NOI(Z~ {?JS~imXulƭ*rЊ[=÷L.(_N lj3×m|Z>*7>{>~b8׽r)@gg IQ+jd?ϭ3S79'(Ny0ק)$)%mi*mۦǍez˂ڝ)КZ*d;kӎSJ3 hdƾ7V~鬦}~̗q-37hr?^s+n~7PN);*1OT4.]CZUd)5uɐwYSe~?[៬bs^`,deo*qF O~s<us <|Cpsb+s7R{"e4mcGσyL{A~3u}iNaHɬ4r_hOA=fauTK!PFWg 8=g9{I?3/4R?֢]~nۋ3lٖ̫_>߼6צZ-?L \rШ 4-^,Ճbvn67JP7"Zҳ4Tl+hꎊmJb{IN}1c6jHoڕ>4=ͥjv:JGuC0=.s8\(€xgRgBM4shUG}C9Ebq7\[*'u¼JAp%$vl_/Nm}oorg&ϖc~us_ȭ{LO.l`!{;'|gy=_]ѿǝwl|"|Ǎ*Zy3Y˦i3; `/k]B[PFQ ۻR&!s)V=2?/k:[)q;ӯ2mi Y8U9W+]6&jD35d_Xbf [Nlsr K*Ld/[dal:[BYkDK8xf-9s/z{њ7t-Ƿߚ?!݊S> -UUo9xiyi (#޴d{b閽VBſ}翽Bsnle5& poc^E O{CHI&o\?Gx9Oy-SgrVsm|q>$רƲkx.??>mx؂ب$%5 /<Eai֎4GfjBf2wp}Yp}W Ng$[X^$f~Ҳ_6}G2״=CNi@eP'ncٸ NR@ڧ OwՄݣ;aq)w (M_Os'#p0 &ۅRZ?_#<1 ~& $3~fVROs\C֐kE-7`ו𲻨z3e ?[Ȟ4|lidNNiR1XAzkNobw|a@@/0qjŇb)TۏFx*+ONױ{KwC$mLim/ktx˶-g&@7z ]b^ZTY~AC3tsS]FFF1(gfy#rV>eu 5;1gSWaaw _wm׃烩;< ot7ܙI Ymm'|@9&+&=7jb_{vω#d&NͳpL^hq%KؾLTt$u/L.tEO.SvZE:Mi.ݒ.ɒ·'Zd>>QLG &eq+,.24/H;N,+VBuΆ]}ׂ}qBC7䴫K1lQߌ_X-Ov"\Q|'2lSsIhĉ"vS;;b~),mYO3*q[SGӘ ,Wo)/,ٷ+ZÍxiS5 /_hm'xl|T)_>W ڴ3liç.> >y{?e0b´O_)~rW_+Ng Cx>`:=e5Jqĵu><.\_檹i,Sq*ZYx+:[<ܝIw̖;YYVԂL4gE}mysK#؎~,k-զHz7O(E!<ے^SÇT|K1}~rߏ 9LWJ)2.Y&E&&~}k[N-8*FݶӼ&W2ַ|e'}S;ٍJ>SsjV'g;-x0?!gp7˫^BatsG#~幈ndZlJ%> ׫)|Z^9smX2d׊药d|d;Ul!Ǽeك s{-<[<16-m1u^?fˍ?cW Nȡ۰:/ϔFk;4Ly~la+U`o(?O|V Qc-ey|Oayf#5"_`egJ6+OO]Spn`*CõMKa2/5B/ X琲τQf*sS]ƃ87'2 CbZ[XkI:2d4: {2 n?0D1 ŷc[kCw~Y+S2 v~Ϭi>yX)1X,STo ?@_y߼_|Yw&GK;q]i]n}U.u*&D@?-0缗755~rn[3wo l_>M'e)}I0yb`=sԪK@S 3ɢk=@1bqR4 , aWm)*Z.\i.px> =zM/y%Ϯ)osmqnU2IBd, ~ho O :[AFkY~ vk_53'B0͟28q!8Na%x9Lrt]` c]_&#020]nֶ$m# 鈯=wż9piXxf+tNbzYrȲ[bIr\|nTX`,YqKxU6'm]s*w\)lVIIBI)~j~)m,o? 1bSSkRP`Glo;21˵6;X629޹oo;_ ͔]K˴gX fn b"fDWrc%-Ml}p t3}inGsJksK}MjFŢBi-QR'g!#aV6zQ L'X0mƈyidQExenB?DHWYmKVJו$+vk-n?/xc9l7GE 0Xډ^\†pDŽW_W~Y|}ͬ$ J}PO їzutO;B.˟}W5x3~xHW1@2w^?$ń7=|_ʿOE";l,kЁҊ{nK5 9oCT"r?s }H \]޸2s=i'솵Bdn^>ˑgAP>4|M|M8Qyë环ZU ߙ:Cw]E<Ypܬ+8J,I:W=c|=?7>Қ̔+K/@Fv_G#wx#ż10,pTôM}'s3z {"+ѿxVְ7d=֦lPҼyɲx|;.j.l֜$/+ SLP孧G0|1K?}K_:@{g.>,1e{9h'zm-Ox] yC\= 1T /%}86h\ʶI%}nkaj֝c||\Kl\W>NS?%%!K#Wr3ŝ8][y&shj@QmX0}u3$m-6U6!Ql]qV81xZcQ835׽KRP҉LǒL !Bcaq@Ӿ+cv%Рs5ƽ cc%2.]AyN~"1&3 7K[z)Ed,Z՗j_+&2*gF}0Lgd>ICwxGn\ZRnT] _тE/7LJ u'XcY;.A89c-Exc:c`~u0|?n5Iz0<0 !i=Oy}Ww~:Wk}<' ozsgBbv }Y=nzZxf=h;~X͏gCR7 \31I)_/7* xFx`b-J(VjJJF1a-WJsJVJ1sۙf*A2^BE;(c߀C@)8;Yq 'pmm1fvP N)m[1˕JzP !2.g,MǁZьyʉK9DƺuaZ)լOqu>QcݾmP@w\#:BQױ#W$6h=)ޯ gBzhi5[Zcm}+Og<TcWջgƢ;V㽫k,aj\c7½Yk;/΅>ZwpVm`Y%,q֒~=R{u@i6NhĒnl7mZzZmwXv?TEp-p=Y ؅,@T46-˶]O {Wg5lV٦3pX/e@[cNeQb&h(l~Qb#w37N )#u| .ƿ~ԣ p*Cq'+!i'zQoSmƬʕ+|;#313SGd˵cAx(:9+KLϼ~@w}173>"apclkqRjvmW,AϽPP7WǍOf$m퍲( 4fyKbZ.2ƥL.9Vb ṷg[(3xމ.Bۦ_Ow=J易PR70Z4t9RExaTX ^rAkQ$p-ni׀s <"5 VLf^)7LUxl+KXޱS;6*9QdΝ(1}|o;X!il@Ýgdb/v7zQQM,sj/ƝB'Rx5]sWx&*+eJ!*(ZC'DVZi&<H.e9 Lt@sfcPc37ޅIثsYΝtG[e3g.^૷/R(d|2&{O+S+SIPut@׷ɮc{Zw ܁N=XPoL!оM ֊dk]F7LonX4#ZI~[k5_Y=ҔP @yn6g7VPurBcܘ-2J#ΣFם4K3Zm"E1K^7ݒx$6^Pl9o`%lab=ɽEWݿMSe4QG@'Mυ^ۇ&DVU#%p̴sznBj3,PƒwO ڿND \^!qE+8{+kPTO8,OOq)u:a,QLdžrņR֜7lY,].kq4 Q?gFkM6|ת4kGkӦnic3Zmc[R;8u|k:)lfPT@{x&q&rٌO.nhmWUߗF`=emƚ+V@0LS𷿞z弘 H{6}(o/[w~}Wy_EiS'eya;lȇe~|pcfw+y5^[ZZIlZJ Zd&nI=oxJpwexɹ u \&')țe:#ǫ _Й>-*ⁱλ^v-Nۈ5$ x\SU|ܛaDrxs,JQC3ʯ,M{ o\#ِOVX9 4,ek6 [񮢁$N_ZeJט8=;^߃O;Q/ .K2? ^E8TBX:QGI.3owH]$1tQ؝:.#@SxZHVԣZ|$l' LlNQhd4F=I Zk8!5QlVy#׷OzlՌ Rx?A[6۷fW8_"HPַy8s jzЙi^LE$ٓFm񫏱\ۂ`lØU{;;/ ~>}7Sƌșz4QHylkpoJ&O\۽9ZZĄM pWNb -c3Sk7&E|k(7+d){K''xXM>-n!Z+>k \=Έ"_yV3Q|tOlt?Ʉ:ށsyܘ-x w hx /P" C.}3s9 j4k,qJR*hb PJ*8 P c]XTǚiaxD<аQ2T#C[oFV[cJR=bc)|u-hDԍ/en*T@6( o5ô7 NSZI߸ntce XiKJ+d=/M??#QwJ {מ\TIse|NÜM񩹳N1 ף[[*BvڔSؠ6'@JQ>%\x8ݺF5|A3wzL"RZܾkv~\9/A{V|RtƩ2pFQֹO>X53zk?|hd{AeHXd+dY)r3_dǘ8!*WJURZ# k8 ֘=΋/D\OOD,QʩBoR,zG!%ߵ =Bf s;o%S{AQ֊ Tj haZj bC94$g[ nbۨut'Rm2 4{_8k)rۏHאh|ϝY_8o#.1Id=ffm_Sx43G ӳ\VY| 5Mh^ߙ8Tk cwv~y"-( ԌBJ [b&+Eb(ץY|Ð3 $Og΂;Y2qVu}x2?A gcڌ|j ςӓs Gr1`@yf1 yfޓ|D)B_P8*l6hW=Œ= 746ۜvllbUTE{V= jsrY1]7xL%Cb\i:MA68Q DCʫ;kʵ6w`Qal4 A).ם9]/EP2.҃D[)TCj*aul:W?uod>Ϛ{,59~ch "Z8H|8䧫N6 4;{s Ozn勗 (qiE@d0 nZC#@HJ&tJUmO-?[Jy̭|>7Mɵ4DB$16lqU'ϒ,x<_e$[t7Onsܓ{6~eZ_ژʹdmyFxsP;]yu9>,W嫜7My.Ovq\=ΧAѕa푚}N:lN[ֶ񒄯K~CK6U}Nx.kr)_؝r,JE T-xȗ 7Oý}CHZ$]|țdH'D|s^[^j*(d243sZVc)0C̬9ek,Q㌍8g%䬭1od'6Ϝ)>_p5֬'D֢PdaFY /|Q. %N嫱9>Vlc5T ʲE)Biu'Àkq %T5mX,ESOUL¢phy|.D~9XF,xC¨-#@UB[Ո>?y\\g%390-ƿ;q/\QD8 pjV`bx2wN8pVtAhӗRCnzhiV) `XCޖC%l4};]O;{ChuX%;:6b/lqLa8.FlUL]T1U.`{=Z,JJ: q:%J-K'ya7u<1Ǘɼ8 k'ƿ5T{ [e>xwyTc}o2 9kk*)6$+mp a\Ͻ!h;+\[J, Kfԙl-NYOx}Zm j1Dme~-k2>ӹ|d1P -UGYr^σ{9' B\rYRа tS> pIxJx֛%PQ $ l;L{mL%&Ysj"% ZVGȵ?tG'Wm/kbC1&{b"i'mH]_YOԬB:-G^`xYX&|S TkrX ]Xsb CRL̂Li'(%-C*{ ]_DAbqCwuۄ!|QrSu-ѷ&'_6a ]ʚ17 + N-r5y0;uW+30%}Fb13pi S) ߕ ^0(va1cfµ> N͹9jcE%m~4]ߴ;3vJZc)Vz$Q1Y]a8u)"urQE.ҜgN[XJ t CdhO}}=n7n{nwC ӽ^nIvC}v>ﶾ?gaOS"%0rʚHc6AtOTvqx/m}mdkߞCQag{o34 -QǴe{aTkZߞ|NؾmyO4)YO3uH!Xz/]&  GNatd?́t~4qăLyq_LyOv)e=]iVp9z@Fet|I+5AA;fϴ^گdc,eͷ='5̦|uk{bS>Zy kʼnәJL`cmsm\NW>k>i24ҿ3igW!2~a[w_uʋs\ia3Np;NwЈ)hRݸykOs>Acv&©?]gƎkԷeS2qS7DBrՉCד1ll߾ evikmΐObn50ޔj鷴/wiom  Y) Rnl1M!ZE? ??!p1tHW$ZsDh6llOrzX^Mw3]:!l?iSǷqP.w۩}Ǝ$RHӒeCd鳴]-daJBV6z(;VbG3R߃TxJCb#uHDM2yaII$]qPt_beVpj B7vI?FY0fWk31mH3i}Zӵٝ{? 'pe D0 0㜈&7Q8LOH_O90k}#9|SaӠt ZZc9w u';9a+\u;=mӪrvSIϼ3ږ  8 a\[Ya<f^IjqN4'd3;\+|{K~Z5-HOz1ۣ܉k:caܾӰ)ZpS*Rzx&07%΄\[?Q+3a7[Nn3;!zTB'*d<<>w2Tnyc[NCX:lum0-mGw? 78GDA0ֵ<Ԭ( F2'F_B 9xg,.reDĻ 8iN#ca0&6Me~Jx+&yB-`-n0N]VIʁtf&_;kmM+}S9۴sFLJ/Q(l ZH axR牫j5uP' \#Ȧ1qL #L'$I e+sĈ- !FBq@l Սx,πVg^gā.!TNK2!.Waj%FG^65)r?8Ŭ1/K~RjPT!r! !(0H5o z^0<7ĩ- mǴ._6LFFk~ԘT%G4_A@k?]A}:qV8 _.* _nU BH@!V4)>"-4j R:B^V6\}k3@~8z`I%r*:u#:oƶފ[Zq1*"8`_ܝ ArV*L-}Z,;:f_R B\U@!fpKˉ_s7㽿jt3iZYGkעfla tjMDڏ8r/221F TV7iv0M{iU~9¢H Y5E ψo7f3HBHBӦEbvwwQ CaރyOLM}%y#/"vđj#f*ttx!G+ %rgO98+-`N<I9 BF^@$]Guewvkal4η0Y)FwKq5!(J:7vx hV ,бֺK.t1xSyi$ ː$0 3}UȦ1S:"|?~iLxpJi;?(ޟL8蜎eם$qUm lN#<De/LtE `$?t* /(Zw+cBquBF&9+!iwGY~HI@_ ^4븜:^cqOed(6{NY5 95^7};[o^s[T,3f^{'7 ᮪«(|f!*I@!yۧP /]]6lY}A+,v8;leS,\1z} 0_xlu3ס yk 'p20}K㬚8[VTK萅WSk6f~b/?64^skqvĽv f&0"Ibّ4!=] $~6\X5Mha|_WU};[x8oPA^yTLC+u\!9*&jteUqBY(< )Wv72Ҡ3XeuR VJ {9R!#Uw5 p"QQUFEՅ7av5WF^\ϋO_y7uXy TUkyd3ڴHކ&0:p-Ը<{`s./:k8$B8-p *G?*3*F9uH @!Atm#gˌb2mp qxhNi9: FڴVhe(V>=F,=Xb\Wss1GR I,٬K&8io|PȢMe4GiRS! L*CM96{ԭ%80ۮȶ7: +jiXQ8 b(X^fj&Vd~ƨ1jU9AW%1ty],ʪΛj55~;q 1=~]l?$oR*34:@(x25+4ō]d !ZR+6`?[ q!$Ȍ23$6} ur0GpsɤX FHXOq n8mvNqY haj.Ǧ]ϙ W(Wa"%[rnE ,4 3 3FeޭC!yO$#"z"-̾_Zi Y[Ң-U x_Xfl{|}hO PPYSNeu9jFذe5+yr0́xK҄"@,"ZP]1NA\(]=c/& cg,zqB\-!?My Ri-*~a,&n;!t&klTBa?ia[D]Y^rʌ_UTYDO|T(گ_eԴ q9N'sKX}#h[C:!HJ%QyzB ;O=u>taA   R:y.PZV-Gri)ʄ9 q{e I\PqId2Ÿ:bd2$Qo "E{^g4Ɗ,42@&00T( Ԕ,9VpV{9lTxU%Ri` '1`$@A  '0f(^$ u e8Upj4{6 >fB(yIyj8h{vsI|,I<`txHXL*m8h<e(zsuTT™*K=R|`myJF82JzZ(bÖW ӝ8e^`]Ij$!.7I17P:cdB]~J)qŊ(8YejQFʵ&3NU h)oK)MDcd }4p}zHJKEC_SMEb ~|l}]qz2la(R TE,VVcm%l¶=V̶ S~?w]-*Rx;ybuX8U @PSL(fdvķud-Քb ב݄MiVZyŋ!JJ#y.*j \!z;"Obgl\O8z>;ћB{{>ȭ"kgYE)0LnNeUM&%HJI%I2d36=-qIS$)z9z5UJm}յz.tij. E$JӒ{ J3h ݽc0iW˼ܷWyeXa"uW!3AfvOfLP p)լo c|[et'93/#0Y\Ii$Gzp)R4, Q(@T0?gGo᫿ýq+]ܷs}!2;3xsK&9Kl/'h⮮L`)4}hm*;Q0㹭+#VWRZVMw^G]c5IS ՞;WJaP(+hh%Z^B08VW%8y,rd,p$D `v\b ÑHZÜ9AoL;@06q]{̺<>ZΛjb,jN =$SO#YeYRZZJ]]MMMaV^ͺu먭"|y388{ QomG$""\Pe+viN<7is uoneƕ?u/=az"4M=~" \ 7CSh];|}LV8xiw^ey#1t1[ Me!nZUk*XWSBdGdgvפP]? pMa^ 㣘6Lxq#8펢uʪΟPlǞ)$Kt&As='' E(ҸZk+Ci Oҩ ;͚ XM$ JqG)EEU;laÖVN>K.2 x/rF99j2RF+_ROOБ>_k9PSJ gp ܹm۶@YYz)\wC `򦟹Wuny 020%R{ vh;XZV#;js{OjJ@x\7To>?S4oۍۇǤ"k2t Cdi1qcmh.c2^>W{ӨQra;V;VgUAY9б]?jJ1Ňz*w/7 k0mChM!X,<8 5#qX\[4QCg2;?Hsx;L_aE-u DK1/#յ۴#OaŪY3*({;NeSB Z^=[Xi~t*`id{JirXXWu!>/0D"[n7p TWWcK?m>::޽{sn\]%bܗ 谭\$X` NmN LV\vHB?L`6k[Ͱol! '&^xõ~~!6CK`:x`ԖM.醯SӪ6I"8=LzFuE'>g]Ƿt{G+6 ^sc _(`n;_ֺ+t-+')2+߽( sLR@}ЕT㖔߼L;o<Uhmz͇WsL1bqNvq꼗/-+do--lʱCg8wl>_1<Օkؙ<\ X~>1zARRVZ7c//6g}])ag3+H|N>oRjڕ[ʚn7I `'pRxN_XI: u-\Qy(g;FfC)u]{`S@e!cE%ܺOSpJCpzuÅi??wX9}[`U5|<)ގϕ~z4͇l=@xu9M TyQr̎TZ5e(@R{-z5eLơHeRk TML`R ԭ$~'f)Nms]phY 5U6TQY]N(\򈔄Xy_8븜>v5[YُAItn-/vJ?IOg?vI+69wiQ~LfpZ[[y;={|@ /06630y, 6qnN0V,.02p6auY@h{g!#Ϫ΀*V;8*L`x!FD!Ai=u;Vر{׷Mg)( X쯴[h;`XiUˆAd/sEƪ ngg{8$iX3#8ba\5 X^??OW؜Ή'V[xZZZ.z Ry?яp+e 7\߼G%13v/20Cɢ=Nepq(n6g'ϗ.@r@kbiL.GgύbI~ '4U^q~`PA2m?|<6h {e 2 C!RU)th.oCe`ravxm*{vЇ;ypgI0x <`<2j)Ey;doF-R0`5A<̉VkY 1 W%V}MHM]%=C5֠ {CtҎE">ʃӪRj~~W~o_ퟩ_~9my (tv,l{=T]ЛSVaP:ebxndq4=?_|r`b1~Ĉ_L(硴IaGzb|2wY]{qAbb탹sL׷/' j[ 3 ؒ/>:xk ݐS)tisS᮫%2sP xq0K$^OHLH(3vF@m!iRj]3Gfd(PaZfa+_%Rf7/!6*5mXK:y9s`^o?;w*]{eFJ-D W\j78/f]D@JaX" (R5;9KOhg36BGN k<dQ3v㟗W!QZut1l\]#w?D򬠗`KNK eV`pV8xsYs>n-*"xeX=v4ZgQ*7Q*1_{*{vPVe+en`.%}'ĺWn|2 Z8(p hom,bגlJ }(*dls_|$ᮻCsϒܲo>}%}^ ڻ- eo $oV˹a߃Ú/^hJaXEJgꅇ2QUff^==9}n/_Sp7k6PӋuh^d̵sAl .s1T:T|/wgx (E32VS5,Y <"{c21m5qKv%hfN=KznZ}tzva(n۳ >B\u\^`t&j s?Vo_ [wB a]('dk9̧yͽT?= W_ni@Emrͮ.h:G3d] UJauZ"D;(弦rT63k3*ӏI{|5/fke~ha+I'3FW6BTK.Gve=NYBƼ)(eNo'6kCXS4e- PdVBg1R'גKJ/ҕs΍alٲMo"XdOE_|1Bu+{@B,$׃W_@X˸">{k{I.}WcM8w%Ū<׏* f됅clwV{U4DA;#)᥊`Z(3 QT16=-JWh:b; ða%i[IJoEW׹M8C6d@|,B $l#z,ykɽYR+a7O~_>5c=ٳgs~mTB̕p_d?Y(- ;[afl`20mr /rR^ 1UvмWX"o|{|NJOe(uK|Rٵ'u8j v[n54o-P 0S{c<2o0 ;ו1OX¡v@>YOs|XR -oTDs8練Xi7/I,V/Z$]<CG *" I tѩ&QVMP eDD(0og1KsB0Ra?<{zcx;C1hm-wK) ϡc nevc ]S:qR4JAM k(=B,hoݚ*6mo`l:_"z+~9fH$顷$122B<glll6K6<\%Օs8dgo7ːJ &J22&6!q1ME8dQQfMk%t ''-\o_n >߾W}VEv!0 P X-k1Ξ:c?/N3j76>)<0Ut2"(jvkY08 \'U)@a%7$hY #ctajFfmECSD"nh%rU xs~g幽doo}=ٳg Ngll!I$ 344Doo/ 244D&!L.m/E}])c|꟞Qu۟`h8HT!u5JY4DU7;ְJb2]ɰ]'ہۮNa8; 3*W-PJ R0əʜDۀk3K]'vށAYlUh* 5FXWSB\~l2m޳sMW@Mԟۆ ܾF)Ӛ=q~Gwl2n g\<ZU `J̇nVĵү @#2ܚX(:??0bק2fjwO,G;~u\dl-`x vmW!7ZU~\.ͫcd0FW{/()RV۱`Po^!.Ԓ|}ן~}}hh`݋ N322BOO*Ga߾};wAm8Zk?Z_tP!:j?s&0L$'Nf m|P+ ('s[|!WoZTvA+_7,* X(D*!T:OH?JpdxAkp_sLOR"lQ {e9w5VgMou9 65{n"rW킛>8 GǷ9w;&/5i3!9$cJBʢp`tqCsc.UQfNk'9s=} Q&Ps*̪ p)Y}!,TFȟZ;W۠xpy K\JQhNl! ҺnBڜ8eUxFv6B\%P ~iӟ4rev<޽{9t dd2(ί/7s??~~֮^CV2`uxH©>hVu=^3#<~jI{{&H.YW{?WZWy F~ƫ20K|̄%X /_lElWC]T-oʭZCztFy0(ezE?[%=>GPj?j1) \Kj E u(X{*z:fl TVٲsaIy$+WG?YZk~s}vwwsq^|E~a=t+AII pJB0LfA ciL sV5d:b=|Uz"Y6K$da(p~"RC\CU~~3,dze@jK ?PL X`ʎSnϋ(0N/*/3#Z0cҘss B\Uw/V5TQXMeQ^o'F)t!!.Mw䅗;}}ll|3}ݘ?Y8t?<>('N뒂js/:Xf Yb TTTpI>c{~0Jai -H"0Ie2Y Cض~U~w<Tǡkjכ?^k4lhR:eցd wAIB{~tln-jU e,7;%8Md\Ӹpv5LI;mC)4o ca-.9ᕏoD'oO{*ۄst9Rh=c;?<`<02㪙9Џc!UHGk %+`qדd 1 w% {~~Dr<<}t/|_|62|se(2p`0Hmm-444pI^}:LCQ Q_ Ļ.xgsrB)Aj+"k.g 6sAgM2ؼwfou5M5W^].Fw߰o>f]&ª(wlo XNJR"! [UFCllͷ[VtvϗJ9/ 8{?hpt6@̃J]£T\i$1ݣ H[mع ޺ L#ݰ %iѾm+Н( ,R 7ljl}w :A~?7Rp27O>N0ME^ $ TmTZ3:Wn  /Y<7fWi/ ^vr o!A.8kK `d=NiA%6,a q!392'=䛯֚'K޽;?yގm_Dpy`я~GJ,(Mե曶oJ]=CGgy׻E*1,][Ûo]7iU~>ݴ0]ky?!捡 _g{` i*^Nk^Fo㵾ң!H;~c08K6mxb2!pZt 9 mVb~E,hi?zZBK3 0`eNMvZk ׃ *+g%'Mܚ,:\=M!ZuU*B[AvB rk3(UM.^<ٕ5{̀?2QYv^egdzHnbrR嵋2nR,4+c'vlk=8dԧ>1ٳ|;===/`!\ZëqlBOO|o]Pܼ[isD,Ͼ|5]]fR "Anȯ߿ZIY}v\'GiFcsL,BS}[VC6Rw5`,'&zcvRQ|:k7C.}piLy ν*i?^8O}ե~ң,'v= ;<]SH;y—!yxZs}o>q]#NO<~̯s' ݻkzE| #Z]h/,_KUx|0݄hPV 5֌DŽ3 " 32ތJ>E{TRE}g^", ^}&rvu$x0FϚW% Uw<翦ر׿я~ǏݢO)U `liw39Dd%|S"=\%0y]J}շo<~ҙ3Z5A). s~M[e[+t'biꪫcXF %AX )?!Au*'l?p=?U&,/壧|()@B!dupj-+\h(?P/ úz~R66rL66 w^Κ>!x|N˂kVc,KOk97?P,U<_OhWJxA){]55FNé,8DyK W5<ԶO9%aԨ.0*ؔ&~FA5Q*fz]c(O94^=GPEF q1 '_&a7NJ u>5ӳejUO)@3~39~F6-?64EueI$kk"k p=Qy ceёc8W:hgeA 3rڍ΂*|&1ؽyۚʶS\cX_x5c\WJ`x S~kwnbr,ieLOL03[,g𣟜> ֮b5uׅ7~y=Nĉӂ˲D"466rm}v_g߰{ܸW39`ޞ2-9WЙ9 +۶sYQKf~9/ŶWXj ?82}TKӀrxyҘ00-~u=SiVVx% 1#g7nMW}le9$m^> OGD{o_A[s8;4EYc[Ki]nc wk%X~NEgcP(41J<BG |f *+23~vmC& VI_S*Tx+ ,SG1Gʵ w"8El] NI^('%>EhcF\E쫸m{}|#pvcvbժ'?I\/ Y|m;~io9 е,{wow3V.Qܾu64{(/ gKom-q9nJf?HE=^CG /[ж5Uo ~ N8җwwZ*#mpoN]lnwk.*PM?d~o/;?@[/PD<|Pg;o 7Nݴ֟_9I3.6vwܡr}s:S{NøR h%^7R#e5ZOGjӞ?߱13 }1#2P̫uugιfttݻw`YCOtz E$dwqWm:9OUK_ l3k7O=I`xk6ֲpplw_?sL [卛1s #bKYjD"c@} V5-qMyQ/uxqndv2 =WO_S\]CȬok ǯ_KpW/gGO(V v{E~G{ı]hEQ_p~eHMu7IE\_71T~+U</ǎ-m~?+82MR_xN̪gӰg-DB{[J%N2!.D~jpFz+UX?ݧYLvz0o(mó_ Ļw3 'w_> ?kbEw,]?>r~v>]UwX<eXxσ6+S~ߒr >^uZo]m,O,m.A?q@_ @§o[95~I=1®M_7MCthwAPV9@yi@0*Gx8#,13S) V<'v̓1|6ҥ5JkccJtfF{`,ud,A؂7߮a2L;Ru[chv,x.k,ڱ/`-hLE{\a+VAt|xbSIT0 9Y6 뢎t c6TM1ay cd1+j&Nv4ՔP qs4g}&O'> x ~Çf+whOs@7pD$*ߺޱ&\o[S͟w_Jlk?_G,pp7~yU. ,Z5 wo1?Ł!]` ^^oLn.rF IJz|~Q}hY k*!Piw4m7_{_&Iu3*rc xY5o-PU~b-@!ZO+ϡ8iAE#!Da&V"V]\_>qY擟$Z{~ikok¯޷?^ȿg9}NJ"20H\]BJ™yN;X,7y9O9?9:q7< CYv=gmwC5Y|џPZD)Ⱥ~ jچ/>O*WJWw? ){E]#gP'a}7oZ唶G}Pm'sn~ҦT ;0!0R < ` ڸS.6CJ- nEDu3[c_ b J@L7~::#R~)/)'aFC2#p_4ad>qX{_q_߃_|z/Kݺ30WU'8oy(AD@|`Vgٟw0g.7.%[ Tz9OV~UY'w5津^YI7=IiU[t;Lwٶl\Y4G w޲WHH1sܵ=^bӇqC&Iig/;U*'.`Ȃ[[|󥜫)6nn Z~kܶL$'N -չWb~0Gk׷_O kp57}?7oTߒj,&+Õ~iYǟO\7A|ExlLJ`}m l_HWP*eK+1F ܺ񿣗Aq'92! ­wlW ˳}6 nyr1+bq"zG0,'&g=\nos)_i4Ϲvmr]7՗a߁^Qx_~6mк3в/Ϥ*3j /f#ݰz#ɇ?7IG;6@շh(%t8clFeVvϾ/=rh Y[x[֕,n4/5cI/=r~Nvx8$ÿs 71_;@L uU`x?t{N?oeq v?Sh—u hϞệ b2ie_ش],޳x'VWUP]:<26$3#~ eOۅ,V!~Ŏ}%&hSNvz! GD!Z!c×Y5y,V;v|4X~ 1c ,9hֺrmJDwkh?1fUL&0ǖY}&U{,@iI|}9j?swh ~ܺ߹2^?ܛwT n%Uۡ8cxJغ~SҘsMd62)G IϜK_ 16 W2믾5`1* 3=3lz7m[*[WWWo෿s)+]_a}^fg%~sֆ,Z2rV)2|;ݰ9<]c>Y?"?> ޹'Ik]K4F(^cy߹Θ5AvFˀ㗨^e Vw "[om? -M8hT(1~zpV" 1CM3 qlh;\(^|rkwey`ڿ~Ob~ە$d(32Nݵk֔wPVNi><K k#onB |.o@(?Onn>[Ch1 iHP10d J(u*Bm\ 86՚NiM;n+d8 }2jl?,moyWs|/xlYnL(CPT}$ ߶arƁupg| l[~K᭻sOOv$vE Giš&h?~j@8Ǎ* 61nh"(P 2 ʟ`.2 032kL. PI(^^j-]OͫNg~'I*)C+a&ZWVJHILZW?:[}i.=׷\#_\O瑗:X`:>;H"s2FYfvRޏSd~_4mxr XX=H[~~Iމm'ݽ<9q;5O:[6Ko.d4}/#Og?m1 ॳ~co/tsߦ2;7R{OS!pkÛۇz~M魾az ,ASg&`*xg5|\w`U# DmagԠ2X]'03{Mܪɞ~ B]G`(T~ {Քd]PX&F@gӘ a=ߏіBB,:iT[/Aqi ̣.]靿A5߸7w },9+)aRj2ê%K3dg4U!b3dLxY1vVO9zɐZUW{iFC X,? 33 b]BZ4 1͕0T(40^t"Q#BO@O&l&NљDzpf2'wXLP! WJ#+By{WDnᎇشogJ HG,bU!nW(Qg>63N ^ ٰE2DǚrNm*J漝*NqJ3u7?%z*[mSk8>LP|}.N'Nc?wzqKcɁK^Xu/\;ZvrfD16휽Cc,@ PĞ6PvS(}03GJAAӝ(u!;u?hZy3gxo@s׶?{_z\/+aC=>[_;| [W?317E~"g/Uk,Cpߟ+ۅSYXQp/cVcqO|imY8C`&1Ύ A ?Nwj[oB7TBy]^O_0@ԛ5dӘ'q)KB2`ēH|0Kt`eqv}xSWZkIm~?}g h_mz Z-&'ۖ"ˀ=r "=X_#Ν+933C:Z'mOn};z|wd8|64l ~?Jvʃ_ {C/H n؇Q 'oW'4. CIuv-4{ Y=yErHfPiۯ>[t,]bg Q<נO Wѽ޿4U)Su'(R9&v(I8G a' OT(\K~Xe*ȆLbU!AK0Rf6L&lye=Ubqn]UZ f\ʇ3DcY*Tf) f\)]c$㉇0cAFjŒUFK|oAEƣ)x[/ⴤ7ֲam@2c.ui%3ԓ|3dOFɟgzߦ֓g8;_Kf#'xܽݹ\B}^iO躠4dUKho{VQ]5cmzr:_K,..½D) \Ik֍j^Sx y?Ɔ ^*y)kms?<ʡ3O:.RgB&ooضMeRwUXU^7C/IRfTʷ EgipW&CVgXJKu~YSm ꃯ<;Wwlˍkp2N?=_kf' G4?:6n[E48V"??EyMYؾo}[>1|үu$*m{^|A?؞@Ȃ8y¡ Xʯx?q>x$ܿcz˩> [3z!A1_=E-BțۖJ+?9ySht`![^w:O_mgvRb~2i>'m9wz<֐]o/ك&T!D#J* Q[,DCU 5m*gjnTϽZxk9K:׬cr " xkf'zCIL+]F#m;ح1.tus~fGSJli>v/B 5}w;o?i-Cte4 뗞(Y:&ܰ&o1N,$T翾MlX[M0Xy|< '{D"D";٬,kygC|ϗr[-MhVMSHt͒riopa~-[;y/B6xy# htʠ}< g)&ߎrJ!pF_P6f3>L&H,#`pu=T(4ۥ(`|&k > a^y1ͲX/NR\m lhl3MA1)}8o2oSEAAI F4_ FuHrX|l~exe;->r:<Y הDe'Qθӿk'kXRISyM xvo5rzF.6bZ,fd+)Vғu1oM4(/*VLZ + ̋.$(Ce |E((%a&XԜu 995)A [簼1@jPp>Mb2bۿ*ݽ(FV^?'mFoצf{(:N_~UP: BQ}8LEוŎބt=&'|zA(ԝF эcF7" ɥN.yIZ>.*s8ö1VLq\1& >AONW6.^. Dwt h} Ww; ",.K^" J,!3ج5߭bUQS5t 5Ä8TT f%(0abq4UŦ#,pe A2u .;غgPlRIKl׶9U?z(?1]2 8pf7_y14sMa9].7/dبoRpXa[B4{il/ a^l,-ˤfb5R=x}!Đ奆7sTC} ܖ0jjwo)]&^u]QKSy2zWw~e`Qv_L7"{Tn[f % Nfu{j=Iپ}"&0)ϑ[r¼vsZ'j Fӗ bd +L7y dB~/Q`dޓ,X\y5ZPuljo n7\3}? .Iº ~oppm/ jJ;ʠpalW`"%N0/;t@&t1 ϋB9XW'EWk9a =D@;0]@Zb;.Wqf$A9SQs M/fF6/﫪5w竕?@;!nS¤3(3{l<|/cS)Y,-ٽT5o^q9"Yc|[3qd3;Y`b+ BsY.a"aecE(l`SUп0_Rs",=V>j99&.@Y^c]@[7B4176/mCW6TVuĿn vWYr&1np}Ra Au/vdJnAbn329Hkj:<֑HL xK0Â`Y7C`8uA(6b;]~A:@蔏 zKH=؉q \ ׍ĊVbA4EAzpuTP=)$@qe$^v_8GT)9YU1 )7o 7t@Po]r^qfM ԵzՓ'ѴUl}xno5z]'{FJVݱ7qE ܸ<|/:rxmoM"pbB]+8nC՜"c;ˣ\]Wի7CJ}.c'Bj @UUAF}LUIU\aпaEݿIcO7֗+gbn2:\qT"c#cHqC\FEYԮ#r?z|>K7G:aGQ%:"sdr//<DH\a{gp[øކ̊a[I8G >).n7mK1+`Vd~kF&3I­ctM!= c˯1'XO Ɖssok1X-n:=mgGf" w'ffNa* E$?c)2PǤMw,7/TUlbȮMUppk6[5/T[@(d⁷JX^l:< c FRl9ü։SXtd=t~ߝPb K8?U{"o%YY>hsňB$;6N`n|Z-]ζzeGs'zsStO12ub,GE"㍦53RȎSy>Ud'@"0 W8%E ,xKh%6n1ٙS _\(>VA&?=KCOj6:c<Yz-Cr(E 4x"YI`F3cEi>-4Uܳ!uNS]pXMTSDv0lȶ=̒L1f'/[gOs|>hr\U-%=9v%bRY=/d}X7tڼxa:Vyf2RF烤t{_4z!Acw\L$&[j>M>\2v-Wg}B=~3\!` M' ثsÝ9 nk0zkߣU%l؅V,>\bm,>s|? J޼AOkQ!xlvv_:jq~]!)6 g#c`gpB]oY8oIf7Yi٭aHw/NL8Yy{ >iHI#6m3=Aq1 \͘0ϵ!<:zC %@xjL3D+H$f̷+fl靭ty<2Sʜ['Wg*\ !l袲!ZYU3'[ϻkyrE}WVH&]%R`1ỈI$a(#cQ  DV(&9ˊDYbr5YaA蔏Щ p:fB 3&|I ek_- +@uOܻ2o(b6#j٤2/ɐn[q}5l=XKu.oT׭.S8g}Ťl7|Nh_ؽK? fE1_@ z_1a* kB6i!Ɂ =BP&C&:B\d_/2[BV ߰F?:<} .ۄ‣ Ɠd(Lh p=g*'} 2>~3rl7耷8cxt|&KP! -xtˎXZh ܞiJDNB%1c…KI!7%9$f7FuNj%c18$)*ʰ:O7 Q!n(;)20b2RlZϮ1-mm%'/C$lԮ$o;94oJo㶄yhM5<7h5 H-0Q8g0 TE=ɟI:\5Or {N;}}cK{V}TX^޻!8P- 'h}A5MZMpwço2P;1Erܗ&0 IpiSeaE` Cntt&A+Kٰw |b08JRp Mŷ/UQHuXX4;YShxO5!_KH]= yDJVq%C8xj..Ǐ/ӢL yva'dd(l9W_Lw*MawJ n'65Z9<>|l1 uuplF'x|y1`rNdSn@Euxϻ9z Uxl'RmraI 1vj3-˘^] F"p|-9EXL KQ$ 3*j˟L,:sj EcᬌM>}w]QFv MUPkY|}cSxI r/[GsGO?dȲ9gr\$P)DS Lb Yo+j ̺ʍgssctC3z6.oh+|_^5#El' :K2CH[OKђ"GCATAEOpS54hk3*~!g 23?VOh|Yܿ%;16%$.[2oe^o5k *,$u0A0F/>xCx!~ܺaMnvlGAv%bsź<*忹GaǾ~ ε۽X*Y6]Y'`6Q =.&rn6mh$.;|:ٻ}rkp)%/Td c(ׄsE|pf.dzUn9.xӾvEQ?ѤZ~e0.D_~ 6 %SҢ%c"5 %20}5/ odz(IR`T؍r~$XaVVJ;6/+ '~\$O_b#==;,,G~g2q:EL]U'-;rҡ!1>$:.kݼw'fB2Ѕ`lfu/N#1:Lkf\@QZGUn?oOpV7WU$oχ܎lRU϶<5sX3xXƀERS<|Gr3o*%?AMsta~ǃd79…{pO`5^%O*rAV¾bEC<MHOm?xr#:ip@Կ?/K hp)Zw JU.?|ዬ p5*}2ltc8[6@Q:j *gdhP 3| T4_2Jf!VߴI8B(^jn=oPZycyi+# mAT~K9cv:XI0y$99!vUk\l?ƙ;6fXM\eEp6IcFj7>w_̵üz6ntC tht?oZ:}?% 1g:Nw jfgtb2Sq07tc?0r_UxzxJm{v;^rϾ`R? pAd Ǣn*Q07vWD "njg9u5('/q&:9cjQOx@@A6u% & =LȵdP4-+:pz5jۭTYi2 f8Bt_+z.7ϯ̚@SIa2GAF 0#>~E~CG(5_]r>fivy/NZ-RuI{6yM #GV cW5oy?xW\ @h|wmg- cPu ]=.aNY#%y=GȅL9 oY$VV\+m]Uv ܵn[&vs}"l=)狭U[M@fWIA7ߺR*8mg${td=,/6Rl0+Z]QO/L}j/gM-\T:|/?7nZzA rd=&T_#ᙓ.:k$H`b0.s8Id%JbVTPWT!O4B? +x˯x*!]%+2Y֥8aBAS!5D_†{JEd{0MQ*!TU*&M@UV$ R:AzRN#L#L]f6HE2$> ƙݟǿIG!d3p>^pgq2 $@;Y(V !PzPUta`XM! ZȪ|O^wrB(4vfTl&lf7I1*B%~J0̸@eU'.ܞhUQW=Y97UKjl?Rz'.o(n2isaұoz.486yE9ɨ5:{O5q ݧ _~6b_l~{xm #Dϝ|^;iP,{፱OO[NKkI5Մ) ) If'SL|;syt: ae5i(=?,7p-vK-KJK;F<Y'5E>O >w!/>p-|9t yc`a „sTyLlxKuAv-&7^;o`Ywܼ@Hgf9]Eu+2d!+-Fa "0BG08 UU0b. \h]tzp;]CV +;𧞦޵7XL0d_gjbm'ϴ5kl1FwzߡP3/DC5]7*K63'us34;ΰтt\4^<֯*r1:22E2P2a")Nx 嗖|w$[eS?sͰpHˠf/n*pωӃ8EWvAmc(ne`SVS $/4Ƙ,;xIva$J= .+ vPՑL6|¨H B(BBUjڭ8&|cLU|nl+Yo֕ hQ =jh½[$7?r5sst|%|U.լ<F2vIQ.  g'M0[7>CPꥢsg0 If Rɀ)Ͷ0f>`Xԉ.:5a2aVUNj b9TMpt ܱB:/+clpgóeVwIG߱zVH݂{KCdBmdဋ7 =tYRm}]8AJaŁ,-_/:U@9,`3c$SMQ:\18i)ZxbPoIH r~s #%,eMPnsGU{6;hͨJ>!3)&͡cf͈0t4*[lspNp5ȯvq4i >+amE<TM{HKcrҧbҢOSx ǴL˳:] 3*cӒ<~ɓqm{tw_0?7ܵ=5̴IdN &+%DVRiIa2a)LBUITpb:}:$ +r XQ wh}%/#SS<}]'Hu)/Jel^Qլ YS+b#a GϷSrBSTS`Dg /޵֔eɦA}|X8/eL%|{dShN.GH)‚o#-'Wwwv;inEGC'>O86 9,| jzʲlܶ0,?yI9R0R"U2Os9u?63lY({z7%`N0oK^O2c۽!\)"l4+H`;".﷢Eib@C:Z|٘Xķn;66v*½ADVVW|NW-&djG5n\cNu,l4E u.O̔&MUE,+~=w Bdζ࡟` Ƅ]o3-|#:|K/9^4?J篳3Q"ҪtB.?]-.-]u\JfZh! vC!N5yyh[ffaVꤌ{u8?zo,*zJ :}Whm_ۤQc1r3+K87 dBC Q|A0@O! ?=\D5+(RC!_Mu1v_0̑m]0JzaV׮,EյzdaӒ|nW.͏>n{E3C٭[RFCwٹ7r?9#w~E1 54-FfY? |3Pyc81qCA~δquYvWOh"`{-c'MaRBBĶM’AN5^ȶLNv \3ZP H}[d¡G1dHAv,ԢA{* Mq[Mb%b,xR1>C}hTcq~ x*gBC[hH&s}R|4tk"G|UL #)LvJ e9rRCV:#0 _exvڭ#o-0ϟk3L&J?+N'#F NUu Ĝß,n\[ƒ º኱W5:RfTEAAMvRw]Yg޲%ы0Y,c؛.?!nRj"hkf>t=kn_XGJZn*iZRV! Pw{s`Vlqnw m8!S-l|jK)g{R &:7GwNHZHI$y's'#EG5ن?Dqqa~JHv elDWUQtg"cKZ~hǓ BL hI8,6ASI;½()+ݣG OP ޠJLe 6.Xiqэ9Za F} AfT?&Meؕ.O 1<Oya׬8iI>֨p^ yӝrnHA3!?w\N0dBW 3!u1drwZTܵe[PDyaW[5)(AG 4WQ{Ԟn wgN!^9]KԖR= u.9ÏV|&F~L:V/G[j*/jSIM BHȯl3F у|hHL$'J0I#vÙ*Kwr`t( Дӛ!亦{iPX^d'/%';(>IsRSA藰Lq֠B3ׯ!-75n"@8XѣM#ڇ{/|om9KC-&2%S,L;;%=/5aTy _ShO(pTi׿ Wp)I jlXSLvB}  \ٗ@=$<"24jG[3:  ufoX~ A&'UcY '}`h+h\!d7l;A]LV!hvMMKiS:| QU躈Bﰙ0i*Vd %{7o5~|+-nsF18N|ky^Lc*De{ڤd9ؼ7m˲Lr3dk>u351' ! 9yT_bs.E|lV0q0q'(6 ;dXeK6/p5t+9Fg3J' 6]Ň_p< M(;9XX}ٱ֛|ewc-* l6Y Jѿxɖ6d{XXs&Ar'&"KY';huɑe ,A[bZH?p\)"8H~FiE&!{M_b/U ZM}pB+R`p~]M'f~50Jwl]]Wosl.ЏM0r>Pfb Ƈ %̨oQA^rw;׮nXPNz7$`B[ I(lpl o=/%& |l`Ӓ<>yߪa ^hG:iK9:jڥ`,(,ы}oJȊt!F7ސdm:,S}n+e$kZ+5]':@@W NN+IV .2I~~]-T;Wa혶y/ORaW{ϰ폯e)?8!ZkMT Ox69qERuh9C}^Y'6`YY9d!^$S=iX -(:H睞y*Y |*>gq{FNY)8DT[Lp i 쪀d5=~_äZq:-'Rd{-~IҒ`]>HbB%-]=%ߔA ID&5II66_k`ꨚIp0sJ3t]iqc&x\z j;fEa7-/%O <0LuGTRQ +Nh rezUѳКc8L5[NևK39c 8y#{??EQEᢇu<b<Cjs>Q{3˶,s pc1V[9~ 5t^&4H2K̤o6'>x-_7Y?ëU7x5Vfh7P. PdvQeE8u\0it V7l? /m kV\Pb]&RkBR4k`3AMIAq? OX* \1;ݳe0;F1 >  \){.=3{s/>*vn14Js-XCsH>w-%tSS,͹ {1l2S㫷pu%Q_d+-}>ũ3)09{FYAc8p6v%;+NOa*Hv>_䌩# ɀv0c;:4oT_>O{fָ➵xx/FJw"$}!x|dKFiJŁQ+ 0?wXU^" Ia971t&m dܼt?(pq@(Rt]Wʑx;O{@ yGp\.ap~FlV'V^~2(z0,SpC `nn{<[mGþn`t~{bƪ?2!5 :\C?6I^6U%P0'ⶤd;s-sgP_D(C&QڬcUX4ٽ%@l ccF%\UƳ[+ agT[|lAtsL5Q9v,S =4w/wE'[XQ] TYE^ToBv! E^*T{rt ^1s2hN<$7Sg[c?G˓MKFMV\pZ&;<5UօYEOvW E9N' ݞn>[f]%:z}ۏPW݄OEUJl^1k\FIY#B3!LfH$224xn ֍nsz|o"\@Mu#tyzOGϷᰙ(tyEa&z/f/N4\']K~ft 剝1~dR^X@0EAZkAuҡzRx !tNBl A5T89կCQmYHFaptI+[pY*/*vᐴu/>Ǝ<\~gEP`ѿPX]bgn3MW{çbXD7(Sq~ 鰷uVq \^) C~s. Q K/H+e|7>AK7A "}JW/T^_)/73bXlvVVmX̊u ikENIWC7Hf,ʣ|,f)$#;-ba$ ƅX(+ xvkB@m?p߿f8tGnoμOwVG*NwEn8וP^ISopBc ty1')3eaLq1v{eJ7})c&E*F*(/NP T|8UFI쯱 ϛwb7\iG*?{YlCN`FZ\Ԝ]Un_MebpRmf;X=A7LMG mA::ޠ_C3F{i*vtѯ:/+/35 3޲6Y=}0l ?xP'C456ԏ[O]g"8RIÐc%8Z:ixTPd&޷O^[Jv:W EӠf}.ˆaJaI.%\}:.Ziil6TyhE7^)d"+b t,@R:`i-o0j< 8޲ s*kN[U`v(mf V͂n޼,2 { 2c>/refRGP8/BMʈժo&6/7 J{[vdOa<(F&nb(pL{skNl$1`$f/Ԡ50Rdk&%- >?ᐎ C 5caA0A`P&N@ t]GA!0л=t"h[74V36Yaڭ-&,3$vM;نh&ӄ&?Ր%P#dF&4M+-^ CnML(l p|ۏ '3;lNj}KU}/ԛu|@-y$+ʳkqmɸ ܶa6~>5pTUrG7|NZ7~8p%qQ=w꡶갰Qa?ȤC~ynDEVAkH8t`}IYM0񔭈&iTJv=7AU ؍íRD}b,v鱂se/p\Qdpd~33Jd  VUQb/N6_5:|,TC^ 6OH?SǺEwM}KIyxpc$\P!Ԁw\C>W#i⟫)uTM*4;0KQ>ٙ  MGK2^_CtES& {(bu=:,|d ]pzWW]]7īx7_w-$-irEvOܻG"o(fn_zZsbWX_=jb UU᎛SR:ڗ`t8R"Φ.Z]fT3bRa ( 7o N{}'ugL̪- SLxKaX_\a a}]0w:!%?L>`1mv3̰팯 c}N6]+`b/{h-x4je/(NG1IR\>aL]Sz;_h&67|@qa&9Sv@ntC qXM|%U_VF=_ N?!*"'}r<-O=vG_9F_USlf6.w- W|w{qT&?7޺T*ZۼEty {?ȎPswLZN ߲>t=<߇Ӝ~&6US,} Wݶ0xjLY|fcUw?_#+8,+`m)uw Nod@fbb`CA4;p|4ijp m9l?z̈́xrddgT4=EI 8|SlBe#ĢfEzWC:ŒNX,0T+*qHOw*p[~BNY62p^y4{yW<{D7Z lZ^:XN\ a]`18,qq>rn6Ƀ/vly*uΛט@:TVܰ7- WNW{"j۩>QgB  ԝi`_w¯jsGܯT5C9(7a/PWްj>wް?>OH8X7.*Hv TJ8,lWOX/? YK`  5፶I1: Q4k-Ņ|+/PQ=' \7XTN wL 4_J·s5}WR?5V@ is!&wTEKi~L;-_]w.vL%sF4dT>U|U|S۫H=g[:7’Lfao YSͰc1i1-bqo`\!$5F`T|-63kJp{xxp6Z94|")=LWܜ}{/pP^?9([9kTmYSu1E>GuT? )~:A0NdP4V6E亣 |©w 0i*[wj x LuC[L0/O膬w ̚g%Cm#!A B[v+}XU c vK4ɤ/lV: ly`AxHzipR;n!%=Hf&̚Bkr Ep|z6A x1y% ;F5  |J^"YqVAt[YEVQvwl=bI67)j^%e|{ۨs" lS??˻n]Ƚ[撕:9VOJa7|fW5M,cQ?Gёbd^)YaSGp5ၾDCpb^zUMQo{g]OCTY5ׯ|t߇h茺nV~l7:9BNk&}](BA("fNZA>m>pd.vYE9|w_%.-ܻ~ݚ*')$pzk꟨itFcMUO7ZW._ ޏ1 eH&~]8U@vAxDT@ F |] `,W&$Q0D``v6]8 ƇK"Cjqoy2h :GO4=C{ |Ag*-ſ}nUͼ/sc #[nA.Wrn6)d%M}P<[8)/C^Ov KwX/*İRd^^@}"C0kᅡ>V1Qʹ#7R b?^fcUu[5ry+gݴ9~NHE~;~ξA %::6ux~Ǒ;B^sm urB 4Xq ]Y' 0%{g^i+֗nȉ=>\ jeGN*Δ'Yd%Fjڥiaܹ\x2! ޙyaH-#.v1OuJ @, J"g>X[j%yD+ R\'uE#R0; T5X97:;rn6}>Wx@-~ 4y< Մݪf'3Jv$  Ef1d3`h'[IIIuY`* ]|CxV>9SY} hhrviirhmRSŹ mT8iI۽vZbnn5we~q:κ<ʾy톊f4>{.8|Y>s1G6N#6)s\Nm >82CsrN{fD%zP\{h@_Z`&w:^zXy'l\` k4>+oP=3uF,;!]0!]`fŢve!|7ZۼCtC+tx\ktbmV,.H MVẇB7H᪈@z~&o(ddRdhxUAKUtjRqgVKWCx,:)~j|P.Osr%LX;` fK[=\mpx%Yg ϕ`ay)4HO^w_%#{!'e=GV;RKVb8}aKP\wzo{ pz]!F+uQlYK"Rl&Ad @k$k +#HT /3pKkm"0X/ Ə&n:E\Zb q2R7qղ9xeHIn=̽[jBGYɣG3/>} @04 T>UQLr>qJV͎W@p pako_DZWN<pgH8$vf ] ))d&弜7kiI F PE\ N"?7Ewe*ϷWO|,tCZ>}Lݣ$U"bjDj t2fĿ;~'H@AK뺒l +7Jr:PZU[& h#\X,@f@w=CYp{}TFK&0 \lbAI<陚Nvl-Ϭf7\SU gsN0;(R` ˸X&p澺WXȖ>uF_M ~} lYIlYUnq'gk;#Bڒ|gog9}fP={WƺVQzqfWEȠڒTJ'O > >(r>}X fQWDKc;9CWC0 g|\l$M0]yuWwiiM<u{l֤լ vFLAeYܰ s)N)PCm *FfO>qkvN[/B{sxm#ho褥:C^Sn_e$g$]8B0ekf呒f6 tvA|^N4EaаC U ޺Q*O {aYL FX |p)r=;N1-r)l7-[=˫ꨨ {fG͒Bx c/v4gȒ(jy$;Ou`;3dI* !.wAs8= lS.J0{陟(I  F ZdkD@pbtܺ?xN<qs|xm9n*t( $g:(IfnQI6\wuC..g_Gf S,[MGgmf$T3dqXM'[0i*9YZ>cFޜ/*o>gBI,a={Nrfg {[5'vE[te%~7y:ԲY0#{OqH^CN8F Eb1c2HJq03íT6P}{hsï˪ݕV'..8\3|-2`,[*׏oY0l 3')V6.)`͂<8^ʱux@ﶽAl o0?($V9eAt&ˠ)[ +V OTU> 6'4CkGԍBYMpՊN8%@ xI?2>m .URr#=gZpyCoqٜ,T=!NOr7 ge0+7y tc5kg:t~)CY!q,6+Y=Cѳ`}Xy+7[+`e'[:]S?zu:V3@᪘:r(ϚF&!H:Pz.Y9\w&ܶ G0" JNMbIIC|{UE.cs u/u\O![HoxTҪ2`mͬL2QI(t.?KN*ZkQ(J2/Ae쬉H5dfe~@HPsqۢ gsOl'*+Ź2EvCuvBCx D2F1 ROsi.L BX.`;! 8p$V.dR .]vac_zZɅp|+KS׍( 0xzwn:\FUUu/]o]8OϵFY9I~?='pQٳFOHb޺9ԞjC{wvjO5Dk 2g 4{IJIkdk=UNɶGC '> U '[8,V9H z|. $UՖhQ%aΓzl;_^{6'.H,Eٵ6}/wmfYPQ8'mk"o-K^>T{ʆIKofnYbkhk5BzLcKXwתQo;932BlBJ*7t,vlaYQ0йz Ȃ7ܶg_9/]6V7 VWEW$dU%JS>,f=B+>.rY=b5s>Ţ[WqN]~躈nh2PÁ3Ie;"c@?|]65EvGAW Ogtֻ(J4n);]밯>~3|)7U&'T4|YJyd쩄dr! 7eej@ P/LC !ACY@A;zOh3mTw 5n 'eOjZ 1vovo]xg ev6El6D ٚ0ir~I&  fj(K[=يH |t{ ՎP PCALLv4w'j(m4 O,o{1xPPXOa/vϽu5oRЅ!!ivNKX4+sbΤ K UM.qLR{*>Wn`2KʧMO0.w!8NavlO⹽8݁kۢͣz7c 8F X\"Ѓ$$XZjI9u1 2Ғ8[-2*ufeW@72( p \3dd@Y;?Mu,ѕvHaEi#WRUuO^yTj1ut.vTw9[Ωv^FCW_X~Z.G#$nY  )!&w@X~Y6n8ez{ ,*x-MΑ1Ip١5f -Y& 'g`XVBQ(3[@!PAp׉qbryP>pptF$UD7oNi9D=3-|M+<ʣISyX oO辶b!if~1ғ:ح&<0] w_Yo㸵|ſO?_aTnqꍤLejB쪪BXqp ! T]' -|PNrFodz"nST+W0/{f؊Σx 6]7wL; :楰?"Iρ*rss)//gͤJaT[C~ujEvL㍅[$$LQBALvLv?d0Ձau`X$yLUEM&'D{(" Ԁ5Gt\h^υ HMD`sY%4M#Cu<¹S7Gηo9ͻn]g5Lױd?1OX7$/{Wsܲ~åW~?>&J?p 7;Ѻ8YD}'uZӹk+7j]ˆ׭ҩVnۼ={+QqمaޛinnG$;ZOr~>U#N<u_ B/mdρZ[<5XǐT' !#u5E%b!:;/vo+x<LaON:,.րq!IOI`QApL SA7&3B0LVņc",V, (P]-Z(e$P+jЇ ?Jȏǘ(L` 6X +4նu:n0,cռlғ4TE%_vqV`<1&i x>gu)PUO{;y9HrП?po@܄`XnxjݘG;^zUghdq!ν,ټ`t#gKLba"BEa<0^]ÅL*u[u[s(Se#c6\5Vkc%=PJ ©Y; qȶf ( : 0 G59Np\xpd!.#)6r(vbrS~fپή5 IDAT;TGcW Mnam0; n[&kCU0(;RF@P78_oqüLޱ+JH0Q(/vo @($Q@ 4*L((FX&pof')0Ƙ-O`fq%.?iE!9[ɹN~)s}e)KJ32oTVfl>yJW.pvMb"3[nϦ%(N~Q9:\ h wP7=ק3'L2$L"Ԫ|w]5T4-2H5 Y>¨Ԝn vtx顝ԟmb_%?yo 1|Ņ./t48c:*=)kOc;Ґx~~PPp42}fړXژʚ 6b2&ʨGݺj-v ڹ,_̸ǥ7( T]67Bw@?Q)藗 /s:O8&] Ír|Iwt+!uLq%!W._x[-mΕ1L]'f A+_58?y6gbL:Mdbm,-(`g$HppY&֬(?yڋ<?~ۢ8x#[?<֕pBn'PIsuxӖԷzhwkPDVL;̪Tu6)Bζ'O jCf;o^u+EEHhW=g,iR"ZtMBe^Ǽ7 +)ɑoUUƩ)#,ro,vaj/BP+>`S_7 rc<'p1 :,-vhݬن* X!?XɞYx,:~N#,[`dy,oH,6UeX jc {5&d{!] ]=?rH5ũ|RlG{hd;sFv2͓-hiE؃'<'nZ0^$Y! @ge7_㡇uh u+ϡ~.Dk( IKIݼiA tرfv\W_WLs@,S20TXP A Ls.Y?|gntCʑzvmay/Igl20Td[w($S9Y*4CtԶy9]sm=\ŚN doZ>%1? `C]:;zR7݌u@W B1gꘉEQB4Io(gۮ`ݫDGJV2oY{ԟm[^M^Y6m~&@KQ歟V ZVׁ5LZ/lN'_mx~!MM Ex,^j|0+ԶvM@et&9+[Z6_0H0,Oo6u=]tBx2id[|_55iFpejSOo)V)n;VDw3)6v!&X&"؝*:噭ơ V\ ;b :0'iy)K3iųx_Dw>!4Ju-`V$)Y76&H݀5 !-qL A3:`x;psvǎ1 !Dݼt  $2S(;$ )MUzm)6uº tiQ⦶M]6w' Rz$EM=h=6xD+Y8 gA0u-}֖"eJra A .@sJ3x7,ϓϟѢL)Aٲ{";na٤ !d;!a] 赃 Ƹh*?{6a$oe$d3eQf)PhI me@M{CI =.=$(7|ogB,[mI{=:;pf#>#+|sPQ er:JJBq7"S4r$` /^KbFKQSgR~SSN\C[ces3&,4t \6Swd*ޜ\IݏEECC̱fcs>E廵b_PݷXC @D#SF'-STsĞFdPUqF{;卒7{wQ@g2[5`J+52rdI}zhi.$l6a>OEovaZ{` -&8)+@HҩIG BO|6|jU%.DVxr;:=`MeבtڌA"yOT&5~L%r:².^D̃l }f5r1LNW] ZWɊ5TMm6PH$Q+'dpQ97wS'ebH5Cnv|BuPlBrxbVQQRcߕy,| oQęIJ<SjwmQ sryq] k=| Rm޶w=#,PvEf~orWlJ`KGB|+L9)0pCbw\m|>%7?ytCQU> kz֡#pM̜ig3e6mG=Eذ6j46yhm̚APM h mAtd}f9},L&0kzy9 H9*Lg)Йmmvqzf6ս _D(%IJ:z#V d3~2{)6#t-'MF v R7D<yr_څttttttTt`0%ƍNeN#1'Ȇ5<:^xmcGbW #^C /jI@Lr4;Y)6Tͽo $‚$(hWLVyI̚A/<,t`3@hjSQ"5! 쮢QcO>|fRG(a3m(L\{[뵀]UaS6}[],/iZTAx;m*AWd J}A-6-@m_[&{JӌaxjTW1,wWUVR=Ebq{UbA"g*`/wmE*Z09W whѓQ!؏M>sԠ7INgcױ!X2[}#]yV4w%1slq\WZZ :ݯlZ˗_ &)IV&M dv0udS(! 'A\RrhvPT|g#g"/̘8#{QGZv eufaE(oqs gq`c"4X%28XU EZY@O+bTj|&d1`tFGK{JԫzCX|ʩn:& ɶD/!XL;ߡd!-ۿ|o E/Hv G`駘ONN-S…6 0-i?ʢ/wDpy!6m`1Itgc!YlJ=m>>KNʼnX-,F}9$cȩ񘢪6! q&8#r2: O`:P0*ƣ׶cD {6ky ]ZJK$0v9J+ _WٻQ`whTpڟ6n/H&j퉬DM,P: jdbooc`ȸjƴa>t-@lҤ Y &hy!8^)^o.:1Z@W@VYS`e{%e-  'L<|ֆ9L>&WQJyǐyiXGVSG`j?fhv,MmN|Qc"3&5(ҝA|Idb˪6zCfNuUavWDY58f?\ >l<g|.ܹ8fA0ZUjt/#Pӌow5VBEYuZÕ@6(\EFO0Z`qkMLsN N8 kN>\k.6`L6q'N1g~7/I?ID1B mo> } 駦EeVvmd*E DQDQV"*ìq\{N)VKs9cE[Q|j\\[ r #gk<=t2}fj!oMPe'x{-d%X-姐 4iL#AD )2A_9$S9Z#ӠM2= {\AuʕYQ\⩕U|:WOPּT߱Vгq`hr[k=тkOW!{yQTdY=ﭠxEw +ӿρhfV Хi @QTl`)M0$Ƒx4O!%d@r qp=sA:ޢp[UamoD~[/e< 6}g;4as U5N*B\U%6M]jj* ,?B@:[>[S5̟oΛqS1%|gsX6`0pgX_(%{;*q=2DCD[rmEq$ f_ǞSyO'ͦjTņ TԻqz2! *UA[v׀ ( !APdE+&$fwy,[*cru?-Cy񗍞 -+*sݩ:-h7y啰&j^4IDzq?( %amRY Ϡ%T?=+})qptMh'!2e->e NbT` H)o\EˡoiLO>mDCqi9g::::::{@U[jٰu)@];@(, Iꪫ뮻شi/o6xe)n9#dzjGxAjj*s%%%GCUa:i& LzZǤ1uR&00V żɎHQ;1nOzb2q2 ; RRdOe+n67RVbou+.o/_vګ"GO틂6. c`LT"XS Θ}IYWozBM.d>P_^YU8ermL_\rXɼt38ȺLNAѫ!XaΈZ{C{EU)i$@PZBs Vd nrݡØ3o#O@fEi.6+)kᝏx픔P[F``ƌHĴiӘ2e XloW@ '1@U/ъ2Nw:qc1 kp>؆l afTűs1nt*ٙq~vp"R<욎 A#Sy'68xx8N MN?eN4-TԻhld_EwCmۥ6XQ[ZC?{4yPGQd'9dxwE;+=bX۷uer;\Xcz"y^H/NC4΅22Q@-Rg((#N= aX&&l8,a!Eeuy+s[Aj1*XGe=:|O!F!|CHQdG# =ē?ѹZg}OVjvWʈ$:mg`51Ic>a@VT!zo}?JY9n_1J097h. nj҂aߠe5ud6=D sN I  @m?׺=_X]hs,|jowF0Q_|,bc `}Uޯ9MI \82Y\Ƙyic;L9)XFeGj:d8tZGGGGG'+şx ȑ#), xK^t.~QVVŋywYbczp0|رcGrAwьQȷP^^@QT|>&/k7Vۛ="Gq99-qn/.nX<,ӿ?F źw6~j[V̅'d 2d&ۈE$awys#K6TGMɢMC7H0$(j_{G4=Z'h'u,|X*<_bB zVlH8~ 'O1sRBx ]?ZDe_^ ;j™Z+ ;kgmtA:2OfK6{5(*uvVUX[ıciQ`ڮ;ȋ}{K_o[%pi.wT܆ɇ"GʈxiV$8QFJØ:tg~H+vD(>6V;Y8J|oPHo~om(vL¥^ʏ~#nnM}}=]w&Sxf`0PXXHaa!?Oٱc v"t|i&JJJ" 'QSSÊ+Xbx^T~ˊ5XSCObln<0Aβ!nW>4;O|bGF~ ,\͢e?h]]Gcoj0$f( +*N?0ff_ 95O_g6kP^礲EYM8=WoNɠeqPeGGl fӫ͌]EUYV!Bܽ(;ex7jDg7ֳý}(FgKig j{Z?Q2nAXUNƈuJWoU~|fj34ytd>t֨ X|]㋨}S2~~j*&-.5B>%**JsST 9qgaA(߰at'Q'!Y廒VX|o>ɋowߞZ1vXfϞ駟q8ٹKzz:7p֭ soii;rq-`6Gi$3~xZ}z)6l؀fz԰~z|>]ܹsssti&V\ɒ%K(**@ Чv@@fr.MN9~aGumexo YVIoiDQ(ӣٌđ̜ bD69=oʸ:48k`?f6hIqڈ:1r[_1pLX[ s@Ua]foԸCmeEi5F |ا\gjxFpОWUnzm&OGՂ اdģ>}d0$;~Ƴ, 5 dx$Dž :n)V}?ZYTD=-T dCB YMZ+肞**BU~W $ #H)lҼh Ǐg[9-'ܹ^g;IÐVBpto3҂Α͇Bvrۿm׎$IL&RRR`ĉ7iӦ1b;̛7W^y_}sw~pWrgSOW_Ep\F ܓ8qbc9c9oF6oڵkYt)vBk+ͭEE,[Y՗ gzGo44yd|oɀaU }L& UU1 H6NQ]2DE{n(`4acBBR5lnﷸ=m99`qdNvb2ILɍ٧SG~z'gLp8ͥ}d*6ָ8ȜCs cTUU\/̘g+GIY uQ\Ls:mN?mN?>_  "b4xU֧-S0$9EUƪ$M0%dYhPm}P`1p͘L yg5heVA[$ę0$R-{2iۇ?(WSe̘ (a6ih=M0EFpGqمSHI9 )նE" d@ |%Rp(QRad?y2rS({Ҽb 2ɺL~sր |l_Y@8nsO#=W4 cA9ý~6 QVDCblACZuؕ}DUT\u^."9)Hvn}+Uqo܋ˈA_;R Ѹ8jAôуsr 7WE @DQd̙g޼y"IcOMM$??{֎e`Ew^.>^ pQ{^NL$N[A]Cd,f7$;{g0f?mFIIIͩ(l߾p X,ѳj裏|dɒBBzz:'|ߏ(qeqꩧrm3DPU()k[?a*d ݍOo(yR.JYvRDA ,L p0,Aav<O`Ad0>`b_P["THOgax~S#+}Oխ4zH>tZS[KѮ{F*YQiuٸ[^Y%1Y {*aʈ藗%qy$q8=VlBRbv1MBNv]\0;zy_18H:}_A [>]ǎ/ȺLS h>!נvi,R:A w- b{#u9B&Zb -&ԮYUՇ L*(x!jۆt[::::::G GPZʗ_G-?~<]wݐt}QFB!.]\E:L|I>쳈`0cQȱ]ewF# .駟f̘1=z46yoll\3QQLS-NE^{w٦#΄<(C kU֕@~W͞@ISqUwG% FYA<<\m\Hoju_~Ry `6"FLupz{0eg8W){֑YHNG2'Mmnq*O?sON=O`NF6byzS#>NVmled7B}訕%qHspĶ,l`+ ##h?1'N׿5˖-(W-[ӟ rI'F yBwN6h3dYFE&NȟC$I~q 7tҘ#OMѮh~vQ$ `TwˣuĢ]*P 0n!taUU#뾞EM^&9ip͂ sGG]ik-O/BSsdH505P3IP났,ZYLdnrc`E["$NRWZvsH2Ck7وm0Zv ӃSnim\ax*PVۆj>bostb-y / Q''N䭷o駟҄ UU?0aÆzo#4Lvi֒˯~!I&ꫯrw3t*;E;9|!]YF (3<2cpj2AZfVɄ( `@E  t큿(HܫGeEAz=/ !",#2`O("t}םr\*e<59~* QvOhx Jc1{ qGv8k=8k_is1,Q~[ꑣ\BH)ɀ BBb!فuln p…c=j9GrX2""'x"G$III{L0n/ilp8_¬Yx뭷–N8.R,~G#55ロswS\\3 d^^ʺՌFC7Ǚ?/63+F? 2bLy킀zx<~~T{Ao2UNFO>+Xe,fnpDr{iض>l01ݐ2!Fghc}g27>4b3Be 4F*J]G]kn3+3ub~>d+D{&#3c-K:1X**&? {Zi)wm D1 &?&?M8 3yvRG$`K6+dl W4vm˶RΙu'TJ'|`lL7 DC jG1e'c1=OYT G&*|[]]ۚ JBUU@ "(xqh5!wV w9^::::::GH]6lӦM;{3wk%>>>LjrUWq-t+޽{ly>h{~ yw뮻ԂȲߕrK<э$Iw&thk;[F#VNRRiiidff3f &L`ڴidee\__me]QQYo(g4`O|%"# gO{DŽ44zxuذ_>}COz} ?>cәQlfCdpXWώ˩؀5Rq7˩X_O=Q aT?wfp R;&Uw?* z;Gu!*l1# Sv Ҿ1~WYyLO iyyh:Z1K BB sA=}bttttttq ooVEܼg`?ӱlvFwwߍfx~~~~ؿnիWs7SV_馛裏HJJqR@wdYݏX1_Y IRG:N MMCP~X,Q?lwOiz""hY9v~r$ (m;$ cc 'rv!gװ>!`YVϣ߱fCU喑Y^t\l}DQi]\ ]LTpxص vXصjOś&"u`\wѶ|v+@'`H~Mw{ j?Թb,!y wo,35lfLG["N;qF#nԪnTT675oRr[7Fvv*`HòM+msoΑ'֢ǭV+zAأc2;{_|_͍7'%%aa ~$XcccG@x"&ScqwFϟQOdZ^f χ( jcPUhlXbk˷Hl2T](peG1fd[Y{4$挀OcFk_7xxt?bŚ~ *<R]],k(CRƳ>|3wO`*|d/gLw:jʈ@ |!8H"f& !z h|by9Y|q;/ .x x3 "ph-ܵ Oo-^"_o)ѐeG]͟*f6:&+Oq= ~<Q njJ|Wm,ЪJ )B UD/A"bH^ )II~Psg2}t??vn77YjhhgWS@n 6D]5\Cbb"_}DF yuRdi>[ 2  ]p( IR@l0Pk @WT1-D8?kJWG?AJW{Qҩ1$\[ixkc~r|T/<ʃ ;lflh#ު -.Z?'pj&ˎ3&1`][xt}<#j/L(f8QGGGGG%-mhWyw~ݶgٲe,^8f{<쳬^/_Ξ={²@kŋ.EQxy; "I^x! , ==v{u-74g @(7Qc~Sx״E3JlaTȟo:Ι1 ۫EW "@aJTM 6S?UOYp ?sOcc{E$S"ػ|Wջ`H:&;Hٚ5@> Xdž^Ue׿ 30@oR]@eWUV?ZdGcEh5} %GHU#,EE ?]o@K_`TcVRhC}]O Bm@::::::g1߭.1Ǿp?s=A.\ȟ=ѽ 2ŃN( e˖ x]K,;nwI&q뭷b0ضm_|1~3ge˖Ͽl~X UUps !fCجM d>>#ָMMNhx͑* wa])Ac˂]uF͛"!Tؼm;yvH(&PQ>2v(?g,( ^/؏rcfOmv'j̩*[)su|,m5j77=L qVX{^w2"ϡ䦧Ìکot\^HJrF m1!cZBGjB߆d\MuVAC%CnӇF]䶍f H]R** 1O7s~I<*j]ߡ vG ىoJEdEZ,`5j^G!QQ'!@UJZxvW/TTasQ ~F>y=9#8^ZV  O~W$ASģz(}]lZQJRg|L=~\6$@e'״}9OUUM Bye Aْ[)\ tlHF%J%Uw~X0Q -o_ghؒvG[ jתEnH6,0|O9bPHaʈjr=k ? >W ꫯRTTDAAz*?x I@jj*iZZZ(** ;YfMԌh+OdժU('ã6 HbV!ܞ ៫@]53RNq+T`TG&S}'ěoensl"&-^" rA&#=G!i0g$Lc!`V &͟Bֻyݭ|xr|ܞeqyz},#5&vRbNaO+~gK =|c@q[ l^+la;4iŖl >sT<ۺTU>XE uR?z82=2{Fn5 =6, +E&)xf=b± "ݸ=>8vGڷ nEŰSG 56!LU*K$)ijSXXĉ?裎챪$''y?ngŊ477NQQ>lG^UU*++q\Fza֯_Oii)B! vFaa!G}4mmmTTT ٵk~GQAcq7|#%%kV꫰UUUBJ{ BȲ>r7K뭅\(KPԎ|2,)'' gdD|tSԠ"yy ڰj-.2'$cl) $0yߨR;o"'OwQ 5}Sgihhia$ 'ǡ* Z.hޑaU[r15%ם-Mܿy5oف388̀=o!ف䰆SU G0@0v846yHM4%>rwyc4qDbhhmme֭(yzvsᠹ3;azyxgٳgN.U VxΜ9s9>077`s„ qg2sL.]JYYYk[Zc;:$p*AE9`H a*}jDɸ_Edvpx֑`9g[otK 8}jҲAa|6͂MR >M-zckiaqúl$ƹzgxp( 7[.ǹGcr{=kq?GD\3|b^^{g W]}a=4Z1lIfA>ȑpcJ9s_Gf0e>*?7`KS}$5o$ Iv5J0ljn/;9jՋ}1Svn7ua(7nn̈L[[[(W_}oիWD0ۙL{(tLQQillXoׯfqsG=~M7Gqc2ꫯ{IߝVȲNq8"b!TP$*VjxPo3R,;*8qhKuUx+X;,gDAk)XxImmQm*n'ex饗(rs%D,!;;AP?< =w UUZ:8@YV"D"! *#B-cFp-dzkx ̞Kj Ո( QѼYoѦ Aa)p<p (HϳvKU\=Wܫ{]Dvsi,dqXe8޾+J7NJ#񔩑 T=:4Do"17luPc N ; "C.IF1IQGY%gfks?ڼ!K̵ݿ,zqJZZJdڱwKAEF:T(f[_PwQLj!Q::::::-ik-k7TG,|׿h4bZ1cIMM%9946l=79ׯ3bĈ!yo}Â"v9|>>3֯_ FOtoٲ%f?++;M6EZLO|">~m EŎgb ?Fp8&8R5nA -A3pջٵ] )n&/->B!`HFU5PEQq{NO@3jgiJf3 N[+=_߯*EQiY^+g7bU|gc_J}LF2M}WVN\Ä03ipЅ`] wN>tGJW]w R[bCh@Dk[DUacV2)7hs@l֭aAcjj*كykbH{e˖Cuu5s ))/^aJIꪫ;vlxêR-79ݕ1`0!L811A Lpb36pҠ݄nb$N=id㲬hCX0(y<񿵔WF7 )pL?}v3*k[a]ؕ7in-?Ȩ);ZːCI9G`࢑H4kS \kIX阮ߟJ}^ݱm0F,y#2==dbGOOg#$2;w7r!V4Kb||[UyX:BA${J*f?m՝nn]$HT}3JܤaSUVhbK6@:+5"@U9*'FCU!)@C?^HM]}svzzP\\̗_~_Ҙ?>^x!͋0 A`ر}<1"= 55ʼnxp:Ȳ(o/"ba`II sk֬/K.aԩX,-[5g?Y粒O?4lGˠo/$)* - ekHQ}: i<C7c"IBW٭7ˏ˭E_^P-)>*0r?N:'쮅͕PPF FTE  @%ys4MO) F~2j?"_O[5ҏmdJnz*L>oxq닅QԧJDZպ$ěY]{b?1);9K,& fg{i%}-@d$:1@Ï{UE v9'L7tdg:(OkutttttD;hW7)_~`/7e,AnOx<JKKyy79ꨣ+8sINnΜNgGp,ӦMo1fl6[XCeeeՅU(YgC=Dkk+MMM܌Aeh4"~!zĶ,Y’%Kx衇8)))x ,XaÆE,NQQ۶m {LEf'l*^[ ѽj`%b=1"17xZ]1i؏xUw440sUNk H9 $j^i6am t&~g~uT6l `9#0"roߧQp8Ҭ6dElא٢M»2bYkh]QQe=>M$Pu X0/sfN7\=}Qh=J,86e3'$;-qW?/`0%~|DusrX _~] ~֢^K$Ist:illhhhvv;FEE߲f{9nF80;n"..CeN?V."Gpp8͍nY)..[G4/^̒%KF |xLό| ?zFRRRRHz }PgÄ/c_32 .d\K@ԝ1k;;m<ԇvv\/ ӰA"vf#c95P7-STMcw|Z^vqˤrRȸz%<{{)k0ZKG!#-ןح]CNz`-ӷsP0QLj)]UK[{@p0Z%'9>48A:6[W\SjlV#]4?t(::::::W @QT_aյ>?l6?0cƌ}>PRRž={ذa۶mLx;X|9[lRRR3f̠oHOO'##*@ :^oXP+BA;^~i_b3s^_Ǔ71[wH8$ yhFH?ʗ_Di PT\ܣ *mp2UŽa/9`fvے` &;S6fWk,I$*z]sg[M c{\ jojr\&%Zx4~Ec^y|>]ˮ}6gߛ`2`HӺVFCfv6pT6r7h$3)1G>¹b6r?\ aISVÍBض5U5}/K>|x%BFFFXijjbժU|W,Zr~X_|\&Lp@ Gvvv󾪪!2!"m4IKKi^z gKKKYp!/>}:&-VAHJJbܸq=5$IA{N,!DQTQtƎJ~#ϬʎVwZ n?{yd%u'k`ٮf͆]J+̶D3M~M̉sְQH]֥{Zo*^߻@* aMdLO\A( J_#i2d?^C;/E{ $,~(~\N Ybڤ,vSt} Si$ sа2~W0A4$=Jڨ90Z@0H$<ēYI8+ӵC A3^3 n|a!Į=}~`5Ѝl&++>>n>GyuօeEoβ(xE7XE#{t:q$$$`XhEQصk7nd2vcqFnJ[[ېe 99f_'???yEEE}6$LF9(Ů^-~'%ZOb rb4E}AXj90zhco@f<|`V #J6D<=5qIrEakkq\2j P@k ܛJPܾQ8\vGruhltumQ4nœh5aH쟨) +4 U{hmp4}A "%ބ=B|v4+P*out??n}JDU /k~`LIutttttG  =꫇dIII\z饜uY<<ܹ3"PTm۶v(999av\x^:u*fC`0`4  ܿ\o3mڴ}WyX,1wkfxKEcb~|DƎJw|WG7?iL~ (8}2ʀ7hMpX;X{kGT aڣ{ff꽃& ,$/%b*+T]Bn@^U\8 R_$ 0&~{ |9%}ʈ(<&<;&_v~VGeRVV+X\UN@<1ώ6i^&@m |#3/!Yj\(͐` bOn$c\F5E?(& *&Y _;ttttttsyˆ51DQ$11N8xr+#F'dܹ#h [n|I22s>233$`PIBVfZPPE]O?pvD>c<_7)v9$+YSmN'w#Gd޽ Dnn.iiiCvbnt}hGu$l?ıs_R!M/ᄱ`ُbv3sLʅ5%Kwjz5$k% uD{E;G%(<}mYKm@F0ۍHQ1rR4hQR1HBA`ư>RXj@?hm!U'%> s)!FuIPzlȲҍttttttzv3i)% PPP 7'|«ʂ kߎba…<- |p 455}HMM {ߡPl6sٳgdBR m?#7cY2xwSe=-d_/! Q mt"oXGd9/8V >,握Gi9n b{֞]aMOQK/-*Q~R$Ib9::::::C2!̼|YY0s=wymN9^|E.R;e{N8kfGrr2hl2D.6oΝ;ٽ{7.j>sڢ[nxdz >6ן;1륵,RI$1bĠz`0t|VF1j( xϙ7wbW/z8~,,;C9@vg lh#P݌5SDxhlIqloi9W3mdKԘ8S^ֱy UPDTdP Iq [4InpIY 5.KmNvA!ӷMUM#";)Q_ )|!lV@GGGGG'|9g%+#; ' y6opBz^͝;~:OjeEZʞȱ~3p]w( NgQb疋BčlY,}޸d21zhƎ߂v9RhC o^WF+2_K/=f |'aߐ +P9"Mvz̛&cgUU͍C[MNOl\eHaNFɘRgtdхڄx7\ ŮPtTcF_+L)yOT.m=xըj AĪ::::::=rXgG%DTUeŊ}Cg}{qz͛Ǜoc`x 'p]waln۶k477c/^Lyy9 XHIb]ygXhQL_+|!,qʗ=66w7ߘQ t00LQ?7Q+zc<~>% !'+X ;kdž _k9XRkQ|1i窪( 3ϲ`APU|bcd݌1}^_oW ~ 2F)v{Y^]BC7Df^oPf*++QU+ٻwo]r%L0!|}>JJJlTUW_OgܹuYlذ!L|UЕM6qwL(\qXfM~2~oދ?FƴҤI~}X"a/{uVhc)WU5t%%%}ݬ\&\.V⪫jvl[3?O|NVNh.aKq^dAHIIaʔ)$$Xv|82Ƙf.Wrv|I$&peWovim.{BNSPB/hhX$IB}PכLj٤z-ՈKNvtQmTck߶ԺCC3TvDDЪ?b| !Yآ.(* ٟwF38< {\eJJJ)+,)3fL hb@q:G엖 ;W%0 뮻bK'bTn5RxmnˆFr2,ߎ*+Q "@He}PtgoisX}i008z}ޑh1CMs* 1Sn-Ց&uSLa…C~Cj0袋?~$$$폪C:nȑ̚5j֭[QUU MMMq<=q=7`0GaaaxrFA5J_ǐc2Iyhk)-o>-@<ZE5`1v'iu&غP. $v̏We;7d^zbF򦧑2<=PP D &줎HlҬ]/ *S_T`[zvx}!lc6gbH&*'h:::::::vF'$$p߶=i$}nvz0YYv-_~9߹Eݎ`%I"55ufqwcoߎ _+ r]ee%O?47n1mD$F j~rV!r#fX(,,$;;H-щMj?vg>\{;Je-Riw2pKOk;˛=~*zy0dD} ĥZ%ɜދދɏ DnošdƞnŞfd3?J0ǙuẐWh1Br4ʪuC$Ah3<BjRS@SxbYI>LOlEu7r(rpi'%%q2qDn6:CUU)--7 `/yE1`7^x?lN>drss{: >_dժUTVVnʈ_\1'_ˢ/vQ^BUAÒ'pxuKU쬢oPеK(ah(`1ۍ$oJ(|U0&Z;!Y3[Q}@W`WmgcW#NW=ƈL]OFdJ#CM6Ojڢ0f0z*sh F0vKc!IW_}5&LছnbժUabcc#7|32&N84uTNfCEdY&_Ff)w#3_.Aj,2^2̒$Maaa `)Iݫ\np21>=ͼ6p{uk0$6y3sZ$˒e%ګʹWeW~8fxzz=HUeָ4jTTգSD~2J++[ij4@C ͌ ˦?_Wa5j|immeʕ|TTTk=.iuNO{nO|~AZ >ZߝC=Y`@?-9_1oVb[|} @lV#Fgrc&df۽_w\u-42LpQ|l"Xx"&I0^t)ibX: 0S{yG͂Կ5m3a6::::::=qH NW +*ʨv#B8`0$IȲ(((hFx>|8SLa̙uQ=Ο婧w/2>_g0{n~d2q4c(~J/_'|Š+w=-.ʯϛ͏}ǫ_"C#"Ɍ5 3: ݏ 7E$I:u g2],b7 AQeQDE2LOΟI 'Y# b|EmVdl_U_ BPH~nvw.Ȱt ?bkQA3TwmFU7$Q O8+1FNu!-$%XECPU˗|nW㻮ߕ|MMMn:}]L&L83{l&Mѣ, ̜9/wdv;׿e9lx?RYYɚ5kϩmjA8cӹQ3o8iiZ_54ѲZ3ǪC#;&+o`H$9YrW" klĜo*(6m7J M-^N>J0sBU a >aU] C#RTp|wCh3#z ʑ7v3U98NjPŖ-[غu+/ 5QXXHnn.'x"ׯ&A碋.ٺu+ׯgɒ%ٳ&Hz3fG0k\v_^jyfΘ p8;v,$IQgSw[|8]~C׉H 6vsK?Lo j6̣}+|A '0V_Rq7ط Kˇ;Ɣ5؏$ $%VGGGGG!59_1{ZoQ0Lklذ-[B( ʹR\\֭[ټy36l&$dFGq´rR0 ۛpzb@RRǏf;<̬+}pd2a0"F?2t. EQ).m`#z'. lz^qF|q5.[|EOTxH,9=rVR7-=~V(ŨQpb4ò݃s P!?8 @3pWՈ_)< UUE"x64 eƏIcM9\wcd$>Fy9C2R֮!~C;!ݮDzB ::::::}v|,we(Kle,FA@0`2h"_ICx|!vlM9n^*JsK-m?y0DLL r8mV>c1o&nW=VnQ0 6C/]+>f3.+1UojQsc+ b\gEmACQDU v=m!ut;P.מ&75뵛)=63mrOȲڻث<@@wЄO)::::::}6u딓g#qu3t}{l1i[$K_JF(bOw0qx2 f1sl:yi`(X%M=~>#F(]G`4FrxIa(%=!$Fp4W2uj6F_r)gf$4F `eCwF$+-~50D0H^y RxU=. g39/enŽKygވiAn$}Crԁ`?b$?ΰ 3Ǧ3qx rϰGè6OYVI k}K)iy*vqfEkaOCg46y"CB\cV[8K T8rL]cVV`G5pr YȖ-fWUgW#j:~_0q ::::::}␿ض݊,g$[řp{𻒎3`X39nr6cIox}%_`F\nↈ[L(Hf NèR$ {)wg[P\ARSS;v,V={ka @+itZ"`B`HEݞ,+ֻHK1|X"u &Tjz|J,"[YV[ "śn (#&C@mP^`sCZPUx44y8ez '?܆7B bd .[0S'=[0;,Se)u%|eʹrG2bDA3.׷(+vS>G(3( $͌I`$ԑd kv̝sc>oGy 5;+Zb>GE5jT2 Q;#i` v#$Cb j C(#E8gj]ex{ x/)lqm 6 ajt:؈&(1[^bњM^i;n'JTm+mf[i3IdTN^83027 N s&SJ;@PVD4;DCf/No?D`_c`2,R-g8HvIMGǏ~u 2&s/Iyyy13 a&#w2BK𠬢5ܔl_~h V(*J{|._P$0cc.9#fE1"m;α{/pw\^((Y$gr%qĎ'c;ƒdɲ.Z)"ErInmvzxb̼3;p{kwPJ,!FY~d@,f[[Fh;-<%FFِn澛c_wmY"f5vk޷FmL#Lϗ2'/eok@y>&Md޽޽{M5 0%[TW}Z5l|$v]qW2H'OVu3t޼8;aP6 /2ƽwn]C.Py#fw oAJi I=)i"֤RILzWi4FsƧpRސ-n|_v||?կ_V𿖐R=ޏ?u5׹ȋ|/|ys9rnR `޽p *`ݴDNA ,5MFNpHrMW;Ѥ)w(v{gzqF5#=}?g/\/srg!o v,q:&r6FhLV./<Z xoW*Wu\^1_tx$x={K /c<|Le0_t(7)e״?ZQ핯>Ay#2 oKB;Qann@ģ3П[74 %7 U+ Fh)+LCw*Ɓ}x'&|ᅋp,#y<_4Mn\ezzuUpχߍPh-ˊkggBMĆ;oH;43s\|%ɄWz9W^C]Pt` 5ķlcuqA y1'a-nQl7mc飋n))>OP1],a*QU^@n%h4FSOFuZvܿ]HL'^tg3-[?N8A\t! ^\ J7z(>%oܪf7|dd4G,ߣo@lSUQܲ>Jh3VZ 6E=b&b71Rg\'kW$,UQ"+Fh4ѱP9ߦ4kTG=}xOEF 8<0 n~'~zX,=0]]]!@A<_4zQ`-2;Wf|2_!Hݴ(Bm@\<ܿMÙzexM`g`Tvjˇx#Vq,E`7}}U? `:^d4whK*6'atFh4б@o&ik7bFP2>[䉗/'ҩI.q<UgTAWW[no;m߶ײm6R"JA"+- a&h%!o MLN utDGˬ LLΤc=?[xaZhl牯&|ԖLb&Fo|v|*z\oG~U?zmUcEJZ"Fh4E [6ua߯l9*y'.̑qzdcf۫ qw׽G}o,;vpLU,[ ʻAJB4Dba*J*NrtDGD܂r}XJ=WL%l*$O>{I$ne\MV^W~g9_fbO}3;n@X+9W'`bBaҩ&FFhX}$(-Qzc3EΌs X3r%&~QTX˲xe˖n'|.N$TD7ڎh5D>`$v^1vW ;ErV /]Wj iSr<85w,N8r|㧦+z Wbf[JL?ݵ LazzW O]fS3ѧp^>JbS۞UtX~-5FYtl$s{[7wqxP6.?Ln=Qu̯A"5\t=1=S O!*#F=ؿw^x"B%/S}d*f-.INsi.2>>APX,sWtܲ,xٷo !T|>Wi@lS;e yp]ߗ^0.]k G~"*!xW/f/lMJF0?o7"~m!X{Sxz/b*މHǣ|f1? VOmw#oԁ6a7oZM"lwj8)}~g|ojd]DK"PU xFh4zc|?}s4$)L^m]2EN8?Qx\46KXSV!0MM6qmG}}q{9o//9}4x}H)T*8\ (m "FTb۶m̨ʋL&8-68n왯fU }}6f߫0B`Rʐsu?xLWW0,RTх~^_]1W4ͅUWjW Om ].ru;!V׺zp+F*N;~Pg 7@:7[3{vC%NNϟ=|XuF  ܸ}1xSd8DˇcC$l$oJj6[0RqLc#J24iiJpGg/MgSe@@5ݟDV n9h4Fï#o;8]}8Ec+_wvgptT$\ 4\tӗ8Uĥyfm.gf;d2xÇ9x AJ%FGGCJI\g~g0 bHXq"cj18B@uqZ ֫A.ȑ#Mr6FFFI!hl A-EOխ߲(>T 4nێD2Hbx~@2aX\V"MEv?o?eRN{a'>SSJ޷=V8\KJndzX$R%M&r%F j4FYD~ <4ƙs AdSLRqR $ }I /eq 2yB,8W8rg}/}KH)mB{em駟^ck<5k!Pڅ3ɚqxo>s|-Wtwyw.-cR*C,= w'O^?"?c]͇|@wE O{*2;~^UѕȂI]j:|T @ʈ pb7$3sFh\uuryX̤PtLHbߗ⾻_Û_,Ssx =kj88CP4f Dz\7X [.A y?>ɷ2Пm@KHnF_jJex,ηD'L ;-8>v"X&sr0m81X]iK1oY?8kX&tmK[ ѭDu-!FhR'l-$2wZ+nS+5Bo&׸mlQ]Pՠ1SHUu&jn 1#܇HD4լ.mbN^?&>#N-Ass疺mi/C8N%h {o>>*/R|w5m|&-|gc Ei=3+#ޭ!eRfRނʼnYSspKe<V YJ@NRI%R }]{2$zX8f2a^9 aC% xA/՚%/q|I (z')yEW<Hʕʕ};܀*HT\_b({6n)j{/P۸~0_}~kQRIH.]v#&[0p4W(&d(_-oCo\}K#y':CWK g#?y߿[nZ^Evo~Г +t<܇L`Ģ azI 2 +ٔgsf @P5P歘4 dxO4f"a&1 3kz◝, CݑFh-c/fm39ST;sw%]̵R f 2b!X Tfs$oؑ$& 21A&& Aw f1A HUfȕt(28%Wn ^{U!(y/o7 AE"dx_Y `Q({ߕoP_($!:>LCf6ڦzZ7ORB1Uy|iA26l{$jH&>x!bv}#E_`d_vRB2`ۖnnyg/=8>ʅ;?|抑 !2?#{.ҩhf||h|! ` d7Bxs]VkU0eR2)w@R W+1A4@eK%Rqx 3q& ЛZ,Oa.[ft,Vh4Mֶ.ZP~ˀ S i 1CS nK 2ʞD)U@Tl_VJMPz0Z *US'@c&_*#@ r!{\ f* Tb f+vO Sq ѮfkU4IZjq.hn_j@*zߏstcݹR5b5"d*1CD檲-WASB*Cr]+"FUԨjTVt\IS:8a2ipd4Gv&9VH-̚gd*a`{{d:}PfIo'>B%xW>۷+?@r4?>Cc]-=>諔j'X&<'lc, I# }_j P?ԭ( nP-W%W-lO qJj\WJBy2A ^)fUj\~,?P0A_dymod'/3Fx(TP'UŅ66} v].{%њ%ͅvTZw:Ռ_<ǟ>;lr.]oOOws7>4dKM{w2|Hyŋ<=74%X/=uR+7mo<4Aua" zġa@wЛRmzq}N th4FڜYQ-XīrC+sj֥ x;їFsIZffU,Εٶs@Ԃ\Hx= nwc]"KO2pf#3wXVs;s{/ j];|`q sxNM}_򥯜;KWc}cL5՚X Pq%|ó+3 w*D )%Nh4fitJ9>.uŵY;dbdX 4϶jqo~ U3#g˯T:x}E~q?sy?X?9sn6kQ瑀62|7>wVOH/}ٿOt1 {!U,M}Ek H}[D"%;9E?[4FY -t8GUF*fRZIфs5Kb@ Wx sOFF]cS:y/g8-ǞǛ.soF돾'8|rkQ瑀go:&?{皎={aT {EfbwO>| cW%4G̖8|l2x\()w߱[/~,]#~ܺ5\J(G Fjy`'ѿoS)#dϏпo]ۇI`,m3U#zTFd;>_~<_ƈI Fh-t4r7XS4k !Skz܋#yKف$(ؔOQ>=W"McXݘ`VOk7 |E?[q'fxsy/?`[ٳ818>C՗ћ5Œ|ׇcp۶(V'g#+^x2w~*+7LXpkD?@ގbd坎0 A_pb s9F_88xxWCX&F=I5M;!$O={I$֞ph4͵@ ̫6֟KRi4@@xffKo Q(ү?ˇcǥ*J@Je?[R%2)7d! U9|oZGwR]wri&`r9I&꿺G. #LrJe%|7_P_kO67ȗ~VAc{9?ylaTιFid 9 c:;m7h4fݡS)(RkUXk4א]fͥ5a>s&( [M 0RWZ?q:r9q f4Z2ޕwmކhC#L@}gfqFѬt @3^r/鹮GѴPP[-2ҴLCG'ɘWBUt'U]rTydr%dALsۈ?P{R+yMy {'@DAH>쏿];3o~ X)!QBE!/첔p)s^P)e_b,]aW9(M .23W&I1תJr̝aJAbۮ5FBW?s=vxmvFѬС嚠IpW+{ΐ@ x(j@rٟ'}@cREҖ !\iuX hoe|WV.{A}v_HBZ[I?}}Wlgh0]*1s`5J;?}2dwR_ef2^ihF ƛxd9l^Μxec߷$fbn&?1é>Z o:#oh';9FhhC;m!HBTɧJnC *ȵ7n R@ʠ'~^ǗL}fJcrtgP} f5> @CBIJ8>/ח fjzN Շ= Ao i Ph_sd)I(,TPm*-AW>V:S$LA*.,Pثt?8%b%T`q'-LL=׍_)9x1<kՀZEi^sU}р/<^ï]Ng1n=0̹ s:Z=OAu;^}' ciGhV&`X&f|M{=?J$nD(\LPߪG#._g/%ܵCK|1RD9~jïVL]Ah4 % @FҼ̘.Gg}F.P=WTFߨA 31A*D ~-CTe_e9;B_ɠr1dT*׾f!+b2g/Ou,>PJȐd 2喡D[:) +@jUGULIZJ< iPʤ/a7JN(A/a7ބjF֕:t͒9>Yoz'I:ƲW :;/Z,85oy/zx4Fc6:aAj׫Yaj݈Yd нc^١81 ƧJ q^j@y6Gxܳʭ]Ixpn:r$K>7yϻnu\h4f %t`.#U+bYZo3Ul]8eST ЗKHfQmI !vkQ;qM'Tn7!SS7H Y<5[&ګ(N$"*ʶ$ڠk) 7$l@z++n۾WJٵ][(Nq_-4/HI$1VXL>E1ܭB^eLM>]o!^™Fh4-/zcigOg $~ qHD%c]]6+_-ڝ>Vp9<lM;-{TeB#$ *09PR.6כ.dLޥ(ᆅn?DwWbQDK`hJ[7~8-8aGa^9=G-L=4Þ/X> c/!Tx u_;'BWK }O>sW~FѬqС8[B5Kv%۵{q\s6KwR*{uUvH)\JeBq :>}x!0 KJYeIA mߗ؎G\- "Fu}iH)LU_OӬo2y eھ (Wx$ʗᩋ%^`j[[optF Ε)DC~' tX,' [6ws{S5IɅ ADݓ9YhCDfrs7XVޱBQZU@/h;` o>{{|! 7Gj4F߄J 0;Sn`!kݕ{\QXT*$`Xr)s%gJm q:+A_o-I,bI,VGD>lGo/*Bz.[>q۱!3Fh%# ;{{Pu} CusQ4BF_kjK|N#YO+eg>gyJ5D5CJYb ܈ޕR%;acl"hl P^=7S?rS.%\Y${¯i( XNfO_ xeV==}\ P.7'_ }䳏 j4F@z[㓪0BfmR}z{Pڮږ0m|b%[̬nfD.o/{^@vLv>?ʈJFSBfRc,t1dIlPG¹L癝[lصx\x/0WRf镵0_9}k7t,ZQUπ.xѕ0f=7m/ӷw;bⓓ/1u  #mG+`̹Y^|e=oh4E J]\DdZf]F]/52TӕQ|_Ud Q~?~&L_lDD>sΕ-qZI4-?sn&y 36 eƤ Ƒ!?$h'ҝih.23@qZ҃$z#?0L/)|4^ؿnUkjkPDp<Ͻ8zh4C J օ(?)]5VY*lKTꍘ`ab!`4'_h4t7/=?{~ p9,%\a_0͛ؿWUHWz@MhR`XG0bRZ\#?Lxۭ nA/8|'W4FYChC-4&Ze}@dx0hD~ ۛ3B`=ݚEfGCD6{L~NNyх8=+8zegO{b14۷v`t.z#+C`fFM#q {w̝g7 T[7Jܽ"o)g759h4fdP o;gey4!%K}c>6C!h5%!T`ߠޭN?. oyx} Sy8>N;;,M]M_™{AS5-*V{1m\])ϧ06~i‚V,3ɮA:㓜:ʣ!5FY#h)yŚ)-\{d1oi~& phߔ$ j81RF^uOWiCHy"^E8Mܴo~#ǃ/m Ss|~ Jzٽsqv'H g'fA81ޝ& ; <۞[(  oQ;_ixee޸\bf |U-FѬa6J9ۯZsIdbf 5˦Tp` H1p8mk^Uܥ*6@]Sgg8 ?HqY6jFFR %Q044 E-,řD冿N6@p\/<0&&so /< E8xr y#92ˁOgNOt='^XSI;nTχя)j q}+bѦNw#Ȩױ*A@g—C_vFO.^X5FY2 b?Vߗ.t,ZF{XX0} Wa7? pPgv|C}B&-* 0Tx1 ^'x;O.>Ex}lP&?-Wk uxxj\$ 3 %|ie,E*}ipNxRs|wU?1Bh4uN w /ث8UCY]F4D[I&fЛ"bƽfRXBCD5P&'౓S\Y7 x0,JTp9>GGg_$FRFdͯ1f'!m`|[n޻ІJ%0Wh*6bc |FeҷgC]1ٺД[F{qdh4f IHbqTrsYJ5}/mleHvaX&- 4z${(MxW=H j!!)$[R߇+93 MPi@h4-t 冠)*дM:KлUu 9ZjB5BIm@̄"oӎWz|mRV5=K?F2S5^_N<V@FR$¡5j1Lw?~Oi4f+:ɢO^\B,:6,#/stwS{0)d "ʰ7< ^<4 eSgh4Fs-@1QMv RLꁌj4W"#ԅDƽI ssj޼rx>v@*|i*U+@y5>Js{orXb]H#@{>O m ysWWIކ?r*?0{zFh4k-ty& ꎋf䝚 XB=0FEJ-VDIA.:EC KaЛ%O={P{tepgYw+DJ[(`# ~ɭ|B(37ROGez'o FllØ,.@ `(e֌,dZ]o(%hZB_0-C.ۣ{ʶtBWb Ʋ gsձ]o?HO <}| '_06 0Ba +"W'/j sy^wV - 9NDqrQsP@u峪CJbfep? &FlT7caDBly%MhZ `w\гL ȌPhxޅnM=Nj e^=2Nٕ&wݾ?o~1vr☔R+7_XC:3S',Dž|iRˑf`NdRvp e<+!BkY迈i n=0Ϗ"Fh"+#*'Q-]m8=YW&fnRFKZM{$^j.`I\!Y&-wV>?~+'//50M`?eߞ=(] Ӫ5`a C08{.~G^W4FYhÐ1VBJ .ҟ4H.3 u#|VlDcgy6|>7~N/O/_v^s^No;ܱ?9ttrBH&,6 gpm[t_h4+2 bftfLL5)X:$l23[ WDX3]p|&rl{(yu:0M#o_WLO:ƅKYs3/RI~;xC]n元~|%ykvqy4l\ H$Lq;{My;<0th4M+hkLEM٫_ !rM3z /s}̖' 좫|RJ^92mMλX=wn;?0/㓟=o}!z)U C@* %`Kѹ3 q+~n=08=W[2 ]ضO.o39]u}]8}Ɏoh4S@Q2 AtIjCA qMeܨz}`4k)"LN곻B@L -ӓbhh(B&)]ҩ9.0y6qhNB~IRqKh .Sp_OLekm*mB8wqnYǠh4e!պ0fMfA\;kdz] +ldiznwK2:R‘b@:<=\;Ihrقv&Mvo?g]Ʋ7xd !Ch4M[h(fqjښջikMNd@&f-#I6cyJ2u@$,sa5@*drwND8Z%arz]|VFh4^Yvh+d@ċj4K1=[̒ZIKD4 ]R,(G:B@&i| sx2QX1ߜ0)Wfc v%>(dʄL"revގXh4jW/!Y%,DgW5mEvuǗ_Pr%^D`(^ N ?vJ\IL3XK./2zhuMO /hh!EObxp&=|0 EG.h4Fs@a'-Aw=%/\v9f2=[-,d;&lJFKFg]o^ & C71libBEyeBow]h!Rh4@a8IqS`t]j7}_⮠S-GUče{s93Go4fJ\|nM{5W d,q]h /hh%rE He=Th4:dCls!VreLenдm{nrX.qS]Q".l9,cMؚ+ ie/^cZE2s!~4V\JZt5 ddafFh:-t\,ᗕLvh0=SyzW e˅7 gϒ7nɸ2$2$_"fR@ U}K[X+Iߐd iqFt"zuA$EAy'xYA#/Q [V@: Oħ[O a|V˄:DS(üYOx5Pe(X%kOE3 ҨC(CL1옆nX \WfG/(ǭ W!(EUD fe=XX &H4-R,li/ Hl,ti $}Y_r)%a]6A u5,^E ercٶe?ThLr64ש eF2fDT[ P9H%,L!; `\?bYW, ?Po\R !hJ.hȺ /h/C% ѴCueĨ(YLSlx":cX#pa2ҭ^uK20lJD_VTJ lL2%.$E(i| a A2QcB5@T f]0 @ !-k!3VX+" Vb.*4H,hKrN@OƷ[;)kڠY0f<#dL`g▉a:Y`cs0Wm=Izvӣ{H )j΅x2wR`t)i q@4^hˈ<֍6s:LTMF.B F&n,TfzZ {=1!D(+V^Lt3@K&c6*s0 7nu;D2!3/#{!lN _wඵ  ^oO43xm5LƠ+6~ [he=G]I06$]:)s/$>-kfrꤠF#a.V;dn}Ԙ ry-h#dH|)}mr.uI2}&r9)!`{X-Rq2yU2BORc&_ d7]FRxq dsSA&<&l6o3_pfgb2nF Z1&:Wyi48_tZ0 !j*$ J&K-th,0DH=`*ސoĥ9Ndk0>8`S=?PWa yr%+7Rkoλn;!>B1 #zm遣붷ֿsy*뗪%T8p)ݖ 7<+kÒNfD!Q4hè] ,eM$֌w3Sҟ~'_*XΕ 3;]0Хʹ;:@V]_m5>WVA8?3;] Cz&=Go'RyU20̩CuKGTЌd܌6l6o f.ʷaFGlWSB4(\t_S^O\ VƺRR Xy9C 33@ܼ/O?u]?7@:90MUݗRb@oJU XfKYj_rTUȫV,M=)iok3n&ӬG~-ahoR*3-mAeW{*% gB.ls׶n{=}lIX._t%3R+FʕBЛ(9{B!uv3 lLUFD: C,V[_hGe6nєm/2'W4 /aֵ=zIE2qom3Ǧ/ 䚼NHGy~(0 n 31nmq0Z&U PLgMn:=JDāP+\sM+>uIV{$f–gv4E kCL7hڠ\"+X?2Kq<٫yo杷 3sWG9&|>7aB@&n; Iް{p {$6_e+/13e|ՖnՕ.O[ F/؞'j;*j 87[qKF[%c4ͩf^lxaU9#=j- 4Xr# OJ\_b+n3BUУz$hG^7 ޺TOMh gRĉv˦ g pf@k])Eb!ZYpBՠDr܊c]+$c4Ky091⾦@!OʵoBlTP,FVXY/?g޴~^cS| Kd/3U*S@Zχέ= ѳ"fPoK TLz+S@U OD)W_D;h$a63 Ё"ժ`Sk&[hHh@ A}@; F)%ɵ<[s) ]&f`bzQRmM^?MU8ƞA EJ6LlW&nrPҼgH2''.m^3U .PD> {Rܵ]}InޔaW $xO-fpʘZ.Ml$*R4 =CJIT&B4T\*0wVxWM[0DAI09Wbtޭ=>uWzh RHBsK}(~IDAThkhΕ%p#2{=z5ryIv8aBa6uLX[!j4 {|u ᑛUxс~pCw <ˍRTX@xeZD)ȖE09xJ?.NkGW>|17EW?q+%i?^o\У%YlΗ`{ }`I I2z%bfef O/UF$$|ۛq ˺d yHY? ~; pۇ6`0i]5ifsP%H'aIaԮ%UɆG zuMk&EdН0Vje|5ğ)1Y$H6 2D)Mf^t^r,#r̝Qކz(!Ptc/@ w,;}eqaY~m? SGqVRŒ^oh+bFSH,ŖL-t1X!}iMXMFI  fP(_qݍT~,G(Ֆ7`u#ۤɼ|kxE'zF;ƭHcLR)f* o% Hǟ:˫gm'~xGEtpdU.L2aS_hTg5W'Z&N@ CM,!'0B (4s(\ye}Lڥx selOmI83U~ fҧOoΝ[* R7 \mF<V_gF &ϕ  6mьe>}P[^r< όfy;}t 쿽?+72ݐ~N%pu_s ۆڈaTij\΂hP#×)LnZؿU\ϕ<^ǧy' mʽB˼`ql_ gGW'xMvrߎn O)jdIuiEf=_x"ek\GB(/T\[E=UxχOÝ;ԈF?|k Ni W7uqzj|(jڦZIutaxXIAiYFH ! [ys =@YK^/O3(PrpӖe$c9zq/G^ "۞I(utҗrcs7-{ׅ&ы=5^r4 T<ʌ"m m֞ЕPB :@\?YI0aBJ̖$0U=d dFӌF|_j1X ~y-s6vDdu*fA9单H 6`{Or1wC3'M{TMp)kk?koŎN4YftN@&#hh2/~/sSTv93C-!7  TC sy` eQh m/HMHƃ!R ֯Ns^Jx5n9CiEqf}l7ތ\dp@ %/Ǧ- PY7wݩ ?FQaT>&R8=j\ K}5T#B^CM,?K K&Nx~|(]}-}lLcQM|u-^,>S2[W~k"Pټѽ+`ØbY Fze 4k|ĕ5:I^|,?Pe̼?}2)-3+ӷ6Gg_^Pr_Td_U}iH3WԵΧzz̫g9va3=?&Ogs,@҆dw)k2RJ0fce٘jh!j#-Bf6:tL,D`"l84myn 'Sv-/޵!_jfc9_i3qno!Q!A8K;; `1ti`l!ҖJ4[wq/s@Ug5&J<5/˗9;:OPv<yaWQ~ gYRӗ_|gk4to`O"zGckzDق^fb"1j:kvGFӌLR O#3*$k1E9CYU%7TB @|¾f8N˺ifNd/_=}_ LB:&=0W|> _Ǎ{#N͛?ߢX>8* іIaSP٘tԼn wFQ7I6lUa8m.dI !h5 "Dtk4Q^t_y4D@_ͩ}3Ni)eWퟷ %%',%̗[8R#|?}[svdlf jD5Ez^ܺT{ucrEF)B3 T=%D-t}5=RJ+ yBQ;jZ/nrDy~QD*ہ7>}lqʹ5ܣ2%:L0F.!F瑹ň| eYtmm{Ic,LĻ3Mv c?:O>L|.: y'gl)b\5YHn "\yp%ω@J>٧'rtcN)^|GfOV-m< Ky׏wG7DedwF9mDAũPުp_Mt~Rd@N_b&e{j6&GoLl@ WBRq^NkG/|1cob`,L>{jTz,-`cd6 0t^mB|ܹQ$ CermU]U~{-k ld/AΎί,H;JX 2?PΏΩv|);>ثὡV?n.hLᕋ0gy@J8xj?z޵9Pg76M#45Dw&5`ik*Q_5BW1MnC ߉Z@@J^k"|_R̈%莯|1mX"p_W"᱓"-0bF+ًAx{;a0 M MfBld/-KyҟVɧMy~mûҽLRxϾ:ʯx94`נ +7OPx~ xlsIJ|sA6".N~"?M=qPlzz,A\{a,\4\{J_ kuin+TGBk{hð}PPpZ{'-AcV7l\k?>2jIpQwL|c9zl kEl|5#+ %B%~ u eq+"JY3'G@=ee_0ϯ|L_Af ;p7^5eqSg5 hq[BFmBHWw& ߗwz!#n`t晢?vM a{VbL3 C7Ş2RJ J1qFJ&z8"3{nlu|_tc4WĹ|D]g_tܷBh);1վɟ!T~[ؗ]e-)`+ 7 5ah!`ϰ2m/^;߲74[*pz1%RvΫdL7mQ G`|~LW?5vmm\w hm`~CMIrDF6j&v@ iCҪɨ^s͚vUup~  -t v)#k4Qf@$ZG]>Jԇz$_]12w_8#6,v[1IIߌY7ô L9t`$1S o:\.c]pnrq?|,{Қr5y7y˧)./1vfp` LT-Ңpr|Q +mEa1S[7 xv N/Y pq"}inwrÖ6,ZZnm롉.:i727n,mfM532AFA4i4M31}Xm8u|_}T'R F;J; m :XMwiͺ ϗؾkK@c''(T+8F9ˆYlF6ݵnjL=sEu5zl-;_J+؟9ƩYRJ)T1~[n᝷ +:0szx2ki5L1ԅoX}AS9 ?f;?F(.te K3͢{,4}Mݰ_jW}/(sKWηCpC ~7^ʓz#d)C2 w56WhŻ69bW1S,_kznh4OV Uw+ 76Q;=?m]A nдET ` ^@r=|G8;m,w CQ}G{8v6Z.Pe[֭^կJ\_VߎBD^N:ɇo㍷mVVOPhȺ_!hDc2 [ M"U[lUkAeMX_)w PPW0x`}XH*HuQܷ@ y[=84Ҵ ʨ;w]#JIĠ.!c.! k3fQ.%~EYPv-Fz0^WV@3X([ageJR^͆ƶ 7+Yal !* k)᯾p]B0÷]E $dr SBb6߻ ݭJ`V02ʺ\SJXpol'-$S3E$9gwڴX4\ O=/-wo}| TV IU>@zw+ajO2l}9vd,6;CL~/UQUt}QK*~lSUǚVK./滷gkG$p`Gt?*M QAgkU jUaz ^`u _ ACiMfUTkƕh_7u5ϻ`WOЬ ?%ȵa$ ]ֳ~2&QPh X)hܽ!%\T&^+ .jZV69\qLX&V9x$O\y⽻= spb\ق ĥ2ld޾ >wCϟf"%|/_˟$˾zx} zw? vȗa @-DI97W?ΊK,ID**=S{(F U|6ULɈ *N `f!{Y mfd+.:Qi7*ۻ,21bR wi6<)"}~VJw$}c5ATq@X2pZ^폆˪O6GYtW|q"l{&=-dY&^><ad5s*GV*:UeyUW4 zwmRC}5>&x'+Ob6~@/ܳ'e egmX1ޱ/?_|%U~qFރzfy4kCzPV;[yuJ@C0SR&caQj|IM$ImgЕI e(Pu]ixojV tf4a|O-tqS,m|f)uSȤ$&dF2 Yj[`A*2f̢oKGWܴVXSez O [sW> 4$y/x0Mb8mܒ1G5%Sz+<~ ­OYLDkdsxK#fѽ}nGzS?RJġbAm9im+ =GMtm"Ӆhe#r&SC$%<}h/1]%'mh;Ͽ࡯Kۿ}*.:JtA=뭶 THWd+Z8ʌQphadKy O|/{E4ki]۠µv8.L]\/z uoJ8*L FɓukRNٖQ_ % A 1I&4] rԝB@* ׋p?2ػ v@2ynK3)=$f׬ )az-tնyG ~.dF{κfH:R*jM@,wo7b ]\\n}\ 0J"od:Z{J] s + `"f10::k33(bEQEQ{O+Ǫ]U]~>쮴^O=PغnBN ]³>?;WZ3z&Y6Y*K$ѢG3y#ƇOȣ q7RLq \'[=|{ 3nzm_ޥc~Qk%X(a MT\9MTW(zjJi!c7w#\R Xl$'6J[<Gv0(?3LYW!̨"_(^19\o*P 5XV GJlRwb$tqtY;8uA&{7rkR^Qٱy\ W>"qe=h&J4RZ1zŶ#A!-70z XcJU0"*WZ sYBvuJntIU2/oglzrOy+|coQ-tYW~w^4NqX4Qs-a$1`ĽԝCۥKخFDdZ"]TB04bx 33î5^D`Dp}ƿ>ޱP#m[!rw^J(9ƺm4!cFZcU#=YjcJ=3:ےj(v"j0֞ bv>"w4gx?WW-ks@iMfеpˏwP{حX}N¿=õ2gwh5w-Wxj.v ~Wy_A&? C0h3/Mjump%_?Mo! b Q-Ff{:!U$Zxt}a=CBa8VR^[R*+ؕ6qqܵܮ%!8'čeqWc;\繺^Y ;!fj2:\u@nj _-")[su&ž-l18cV< m45Zw8uoy*'|3˕ZL5t߃+0xagF| ?>Lifqc#KGX25_kyO(O|2J$7;XZQJFZ+W*b톁gҨUUgdQLTZa>k;w.(sI*A&7=9tc) ÐJ̕oy[+׈+|yˊ؎sFX Z-a0{H"%쌵0Q`{QA+kmKvBnj&`k R*^ _,35q1zj-& JD%T1ql1aF ZB-Tbʕr%R X]ݮu+0ƒ(GR7kaLX~L7yN,xx"G6yzAࡵ"5 |Պ$qSAŷ54U1륐J5by>rDblx}]=8vq=:6wl*džJ5" K4.~X[^a,-P^[guaZ%VY#TX_Y# C8!\@(֘rw%??ؙG<'}3x7o?S֖V`~>|7Ў孎"++5-İz ;S`}pQ GZJ()eX+e]EefE-Q)DD4hFXSkhbF`*%1PMWM,RDƢ|6db0Q,փI,D:[JR,R]d5n*\ػfϩ~OJ)) Ib8R0LHzS7b|׵g0&u ÷O+=hX;'͕%4qs v+'#N|X(`|)g\ lG%tCף{j"a *r X%ۋ= m$2(iYlVx闆a䄔20qj[: x'0 U{W_.M=m2| oyt(< 6'q/4n@ I?a첈jrM(Q4ENFFɫ|EDij~\ ʬ>zS["m=ysn#G;:/}hAY;юVG f}2xMpKՃPa&5y ѩoy~Ƿ?+Y}tkpx%Xfm09;匞t8Aʵ}+v t !@=6NE8: Uo]ZqXk "uk'XUpY&(\:o(v"aiMm#Ƹtrt!1ƍiƟ1)i7$%i)HK]K^R۶JO4ƫm}mR!7Eի췖lH_1ҭՖϲ=~q5!E7[F,2F5LabO+Z.+߹-*L <_\_xx^)לn eW(B v5E(H!,t& soJR\)aBXN>N6kj0t,Qh5-Bo"rθRmx{F8#Y)׳>V2N:SN=1J Ę 85ScxxZx&e|r>p1K>14! |)d[uX1u"mĐ l C.(#R+u ϫ냜ŏpl1f:v"?[w4R Q⌜0jaC%rQ•WWk,#1(&DFt "hf hM>Έ6VAnlT"Cbܱ`S/=vHS}Om(;4&𡮶uCEVڲ-xf z dAhN{OVrhņp9[)40RHGXo)8qtio1΃]p|<mFtf %9֮QYd`zlWwN\ 1qLR+5ZHT,+ĕض~5/|%~m7t (euy5ϼ|)*,T{f<\e\D %Ԙyv3ŬPg097PB@F ޠ~B:Δϸ4{]0 =0 /P5^ķ;)x jOg?q>aѫ,˛ywvY+"$j*=ʾu !7OB'ay򶽢^Wio)tJaU@Q5 dKwhyS(6r>qb7")di L߃/@d_>^Aj )A>)/#?>DPm(k,qJD*qJ\ D z$HMeBྦྷm/ɑ;iKYG,rDXaz-RR f= ѼO.z:u?w3WT !n|c[y?gZHXև K,1wW|G<@eDi]^tO&ajD Gz"~$m7@i Lj8C8p9)TCwUp aFN+gm|ꁅ-idȍ .rhx&1qBTD q5H7qZ׹zCk]2>ϾopC9־peg|:?.mdJkT&qGІxX2ZY(GY+гRP]4sne4N0)a{VKpUq#x 2f8=ȥAs097>@>mt49q'jឹ2Yxcy!&(Ӯ a+^D8jre#^D8$@Cۇ@a'kpmX(`|zU>r>v<K)QC9Ύ8;^D3cyF 3dB1k)'5W+J-6|U3|/Sbc:J9LgwK/(qNCi' B&(㈱0Iw *guTGȱ*xh,6aM %=< zI&GzpL 91}FpU}Rpf\ޱi'(%-C)U(>y?ycܣXގeA3Iȓ:/HJ-F]_DAbqCjOqE&Tʚ1a#+0cĸ]!R]O[9YP0m \h:Yygfk {| {= ab 2 X+Ȫc <&텏`x.NM?gߕ ^Wv ] VxW/AXR=[)^CT1v %1'pe^Kѓ蝰*5v^04lG!Gk̫ ?sD7ɾM;ӳ1Ia~\o%P5dǵn0n+޷v팋?o!j1~E&|gpsLo~v7v׶ ){o)[0s,͵~lm^^uyKq#/yx6ӜnlwX*wq XdfcPyj`7iAy<%wy@SnjMFǀmwO`.NIaXjkֻyNł XEA/ᘡ.6 f 8r`|( |"'1MUfb3Ym K,m|0w51tl<ɛi'-Fsz2W3PcE;0{e鐩W?:ɇkr6R5,[ Ak`+^3,* XH:}ՔaO&_9XGGWxFa@Yg79\){DnY<\.`"ُ.p[=I-DkQxooÕmSz6Ph?͙CQag{ێDMCmKt4q1yvmvۘZ ,A Ӯ><c`FKyrd+gV= 16Ct~ak4@ۦG`+睇붣qc0Aq賆6qL7.P-M1~ȷ(O慷NeXIB4Q=W nt_!{}jV9jVRw`K͋i oLv{]tmX ۦjZಽV~7-:;)e#wgs`X\hln];.&nAhE!gljA8{=ǫQJ @x6E?>{,_wy4E$ K3EJ xU/4߽ЮNm j>s{k:kjEs禳 "/9I&f[Anro[@Ím5 6#cT{[uAz6}; -IcѾ0mmv]km[61BjlW!rՉCn1NO6?q _k{ Av[8m >|oJm4nw?Lvom  J~mayvh As^i/(VyNֵ|ț[-s1dm z5cI߬wen=M-8]Ʌ3]ڙ֖,3U~*w[s9@pPü*Nrws1߳!p 1w"meKu=-Ng|ۉ%[;;}T].ȷ6~n.IkF)ͻ8aHxtNZl8Dvٚme, v&L-WIFњ]߽ZYgFȩiBl(֒9HcZ71 !𽡏c^˄H=^Z&[㫼Nm>f-L7D#~!FxKKCx7қ30Xغ`';Q"+["V-2 tQllIZH{g.ƿ_֫.@Q'mqE|:_!5}$K-ǛW|Q(!ex00jsc%T#|ij 5P;L-)>r7fU@Y9?a3m:27"ezܯ 8bFۃi1UOq9S(_6 _,p[ADTO!u]>ƛ0 E>npqj(G#nyn팠4ѻnv)iC[3 B#qWۻ@Fp09Op:I:VO=cL{!"_7X&JZ 6UE 6K= kU>VXlj:/,y ; 1Ϋ 3gypNM׶ '$vjv?ߘl1$ؽh~|??߿!λ2yk\( N^lP5Q,FsmO wΆ rvPo'LB^[rX2XU>niV sFXqk٥mWTWeϲm^(55&C ͒ X>^eZs[r@+R뽯327ٜYi^Yan|K|?3y? sd6su߳4K5O8O;i7Ho?Fz0H(;Xܹ>O#& kaa9U8݌]C#ѺVk^3ƨw(˵8ࣕ ?Y3 72OG<-_ Āgiͧjp[W$i(2w,u䆠4IķVknJHи5s*ç'32x燋=D[fy߇?3نZo}sV;ny?νqǘ2s*% 7h7<OƮ`-lC}D8oZlo(g4woT~rv'NSMwaF/Q"~"UpaQ|y_?[ dGI^aǿUpRi MvFKA.VxPWLDXֳY`1//mV9*I?~/2[S},Y`V%<>>*~ ɛn4|^^wSoJfe=M4y{P6:9 !ܸ"9 lFuvG)(`9EHquy,.?9>„<<# uaoEOa2\ڿDǮ^W3f)a<1[㛆v\T,|(@$݊5<DV*h8[y^Pvmh4T淗ʼ?،'l*˥m3d<|Z,"?|M-bzj:ZG0&aPǧd ^4XŦxh@a E)@hsӼ:K#ߜ\L{ ~3{iq{mL6S Ύ7gPx!5W_T8%L wܒGJX\(B!NS^qsˢ#/>w/f=)'gbAV޹N|uQSݯrZl3Y!F'qZM {ijAn(=fZ88Sޏ1*߂K|QifFS>= ;nDa3Lbz-?Q =Trף.FJ!׈ڱu n-_]u!0ֽC]|?ha s3dlBQ^)2c&bo0LFs X-$VZbQ6=z0c#a:b4Z4w'xodqOuDž?::V W+|u'u,ϙńfx_^ ({F=7X6lw0LYد:^Ux5tD9ޚLs{+Y>xgG߫?ix>ύfua|C2?멦}lw%-G\.XT%YaoJ[{t5]@KͿp0&G] /A؉rMZu .-y#\2~blPJ }ègX5޾4pg.omwcL̝n:43 L!޾V-&* ,/u ǕLe)NEk7R?3~5W|w|K뙜rL·fyͶI{RtSM%L'!O ynn 2;{(G`yk-V-BKpuD2K?uƐܚy( ѹG< E~uqW3m4rgg yaq$TP `-X)p@^5~67gXd]6@$$ϟn-4/,_yzr|54og6 u(!%m Jʜj1lEPTV-緇%c CČqָhl*h*;Y9E1\s\1wqX)Iv >pDTj,I06th) Ss5[);Eo(IFߢ~d~cGEtĹ0ڒXE*fbrA9Ѝ»a88Û݃mYV)&柼Q~z?_>ɿ!>6;/e]w\"`,o2AY*U~'N_#[]QE1pzj HŎ)ᔵkaaubT8ޡ }@_^0X t#oPbo_bp{)4 |ϜVOqg]_NX +.b'.ʢ"JM2C2|Z-H4jFk]1\G؛ \<9#,}f/)mcfy^@i;Fm7Gy_|} ֲ5J~"Muu eA—s[zW,\irrL~ƹh.wek=ㄿГ,cT L"^c`fI#msJBP %OL ."el'WkA*-쯥qoN=|Tm|xY杕ɭj̅8}janeoITdZ og=kyeQ R}UOso:d<%W] a"^؅t69x#֕šd|ixD;/.kCNtK5cթJkҕ@?b^>@fǴ#4[4G-ik\_Gots<~Xe6 6jOkdgb{̄SFNRx=%pmA'B"\'Ƈ<[G#"隹Ij#Ź _w!u%"^3GxX^Ϻք)b|E7`1QUYֺ>vol١i^lfk~YPY\2tPq̨ھ, $َ=Ǽay<%Y e9kZ35XOwUp_ O_#;U2/Bg(]O^Ak]Qxr{ ]D+DB^)d#' M?,yf*"R˝G#˳dnyEe-,ãs[[B~)B1QǝJy1c#"'tE5CnƼ2ΚQ6T=)GN[pSyP_M;%IKx#|pLĠ*jAaQ(h>y^umONVxg%KjˌOYu))ϩ<ML? y9zl _j_߃c5?Њ1pm9 M_EeJz_ؔ =Xw.m&X7 f:Rco>?υte|> 8aF8<1&0Dg=E">+* Rj_eΟ y¿{vˆa3J1Y,('Â07ZB^="ᇢ<~;Nn DXV!v[[ϬqC;`xE2ˇDm??Ȁ=jƇR>xxFs01spX-Jף wQyCZt,}#btgxPǘ5>ߚ:F+ G^S2t~fNgY\c,bpӈ7BUy Yo}q5 2\1NbXQ@m֓ۆ㴖7zfo43E o"iRyhhW|Trqk7ySɞ46_j9?VYWg$y!c5g**<4#s;20y<<1&N\Q?)ZZ/u 9fW7L vTyoKK}'h"*0ƿ :,eyӹy^[t -J ܸ_RgLC)[[ 7C:x펣5d2Lo|巢5gːktj3,$ߗ1Q+s̳%[};,j렃9aSlIXluCG[ XtO:;W%˼>s+A{O|3Ig_M)ld57v|c2û̴s1sEe9FAذ`V +VG d) sv½%HpLcNֺ{=(n=^dWv=O,ht| yLK &Zl5M ˓sE}4>[5G*Y4 k1e 2H&fLِIB؈sYj!c6ړx_Ee pBY0lcr- OOGOXzE&Lx[⋓efVn0?(cLv#%<>i5rB#)+&5 b†"q7ƇTCD>G~SJrg6b;zVʾ{ݷ% ,wߣxC,c#u8o$kHZ{T T/ R烱hkаcfUch' ;p;1X`qYz`\c]j؞Q ,xʐZ6J|'߃ǜ;F\Cy12:(mY-_ k]+Q1T /, fxZ/L-`1vu;m9xA en9e ]!av 25! BGwlv`jdz\1f%&t,xcF*gb%ಅF{= Ʋ' )OYrqO-(H{TP(-S^Ac21DL7X\dD 30.> 0#BQ ǎpLH"'JOI#!H01|* $\ \;&anףJ9N+}Kj}@5٥#M1't0E B#W\@e( D҇.i83 ;`K cle( 8n DO؝$KH8 NIS~>zHѭ;8^B8N>q!Mfz=ḳRrG!ߕ IJ)Q@kѓ!(3^Yu a0Ev&]_4,b "*I@F>iAB"#섵_Typ'$'tNKvYbq hRE| 2{ 3>|G!wjxVpvLR,\e B#/2Rb tF&].̑p}xDOq"~c||q HJd m|*Q GDW؝JM /e{7$l%N HhfrN! cR+10+mܢ}zԥ B$;FE[h&G:OEJVqy0XprQjJ^B8*8\A4vD^B8 ,9 Ix=q ] 1./-E^8:C''~W.a,>wǁOi錱` _cyf[X= wFr T5ܯiwVz(Udn'rs;N[I+7s^1/J_pm=o835"^xawf%B'z~tZЍgɦn̦1w;3ոз4m e?rW+t1kxlcZo>w/1&E`qy:/4sHz>J5O/tJݜc^q 6L I:vc6pאֲ2%/y \&DXCkaaUzs <7~yQ.xmXn,}Eo\6480]=F{Tm: tWws8@)FP}RNЫQ(<C-.{pޘ?Z[KovvƵj>[s~QNxzrؕF8Hv8A+2('DO؝jDyar^U3nQEś5F՚ ֨ǭ >1{!I<7]y #|4ɠn0E7%-oc+6FCpFNv[|2bJ(brˢ/ԙu#žOJ;# N/]36&1b7#iu'n,(~cJ랰;;C(H?8qNb PxP5&hӑ;FuݶO?ż BikRbd|W'!d(G88inmܶ,iۥmI+m j'0wZקB3~?TvW`fmb ISx}OR7DxXK ]dnXdSÍg=Bxg )գQ9mJ!?XpZ c_vsH-jX&U?h 7LBb3ׯ(e7traY|Z\+im؈76[[{߲-ل kfmڴOR;ms,mm> rvZ`_\u˩1xQx6ǖ:B6OFvcmn:&p])Uk {ձyf/Kk(i$H?aӑh u$Ca|ǿe v oSw|΁u-}'7;8H \sjU?FmW<yj/sؖqpj%q꼵PMj!<<+va4Λ9n z7.w$ ,l_QȺ.2A1F ixJ6D1<4^D8 26\f q]ڶ P.6BZ~Bk0%"R`@h1\vNreNyy#N2.0@V}I\pf̝Ј8p  4' I%ah儹rS-. n.%ԨWj zDBX-I~$Je !k Fk92=#EwN ~lcW%Z'S98c }Iz ‘e?B 6-:FZJc~##pjܺx#.HJ1#u8vb`Ba@$:"䈤 Y0(N+ r]P׃-ICUùq%S<հ#N:g\0m)$avףLCُ 4R anE.!W~뒮+\[Vr,Α(%DB7#qeBa,,I ~ܸ ytN2 8R]MSaatP~rNW|Ό`ph`R:1Q?(@cZi ]CLjui!wy$Wh$1pY]`|h2+qmDeNre"'[ȕ_bNS1 a(gF7炐2:$DC/'XZsB0:(B{.H*Gq֤yt\Zs"%tokeW9?|mjXoe7Rѿy*/yB W!!, 6DKl}/DaIfІ75.a?L AhTU$ئ\r Wz= g8vH@?HKa?209"hk\*mjퟴrLǑJ(C`[}BIENDB`fastapi-0.110.3/docs/en/docs/img/async/concurrent-burgers/concurrent-burgers-05.png000066400000000000000000004701751461403617600301160ustar00rootroot00000000000000PNG  IHDRX#IDATxu|\,33s'q&iiSmmץnL)& CN옙?dI˱ͽ3f99q܊OȨ =&M|:'NY0c_DDDzE VU U A0--߃A C!5/7p( H<z - LaHMp,=oA _>p0퍐.- ]VSzWUC}~Zp(P館Knhp[sdfٱq-޾ "iCK$TULVẑBZh G~`ߏ'"""B :kAdS3C~.7˛V(&&|>HCv=0yd'~'񧡢@R왰l1O%P\b4@cSjka^ ]u ;^7kH0hGֶ';cDDDdDP@DD 9 [[/y}r{}_y\ƂD@0do ).`Vɱ_J;*yXڻ~ g[@;z><}k+V[h+.bw?^y~JLْ8uԳTp P`7=QJ}^X}5ҽ@s5 {[IQ .xT """1,""'k=[yimfą6Z~2y_GXfmw0q|# w'fUmѫذֿ_Ʀonr8b ^Ο8 ,i S#pĎ_:r #{VA l=^tbōB܄޷!7{EDDdP( ""1Zm0m+ΛmRon?ZW=#nmyaUt[aPWߞɶ蓰gM0}*$}2- ,Ю`\!8{Ύ{TΏmOc[4tn22lbsUo,KnǞ{vXEDDdH) ""#Z}۶q$jͱd7Xlj+g ww^MNwn㗚ysb~p]Y) Ϟg,VY6EPWgC& ;~- `- X v$)ɞ[V%0a;x뭲o/ Ĉk} {Jਫ3WǏkxX[@:18rooZTb^]c]P^>.5"~qZ$l$' /g lW,:' U5PScypM>O8ť𣟷ID:=m7uTkukrq:'XG[\{m[uxH7;aA Ժc+&_y?[k,P{?{V;I~tmDBG~{^֖PXdIE6 Ӟp]8z Qs[\[ &Nνm /?M{ =ңKX;vAC=x%Kz%zV*&cˁcH篷%LfX@O^sJ踽\$be]),j/o ;k߶r ;>nBAiMTWp{Ł? ֬| { +$:&6g,n}J:X 㔖kgɓPv. ny` k>Di07. """2kdl؆O=ރZoOfm+,Z`57[ Z~-[y]< ,vɋG=/[q2+؞nHI5&[߾˞cą2xaPnUtwz`ɓG.0e]e;2U>$%ٿKww!1bDJmၿZZ; 6 {aXp\] O?#w}*Cm+?yddt\׆E͝1NOc}74³/_zaGmC in C""28Lĩm W'Y{gIH}z ğt:\{̚:?fس6nҲ֖=oC֭hmA}_0h[ >"9מp[ i}{qئ|SkxfN9.ЁkVZ /[@cckyގyNC ̄׾3οUEov^S'5pHL8O? ;X!s>v"v6AwˇXmSIK4LܻDDDdH( ""g &xiVggWVrm̷Ɂηge7Y,YX\V1Z ԯ]^),_܆BI U.WVe; ē l/bůiSbN\Υ ,_E!"""ÒV|*I"""ixaMo_V_~)w80j`.,^x~}<}3z}~IAز/jn]u}ۼ5::'m©a 1A Ν[ ?&O:fzīO=kml KZ@ԷshU v>~=VOcz+$Ae/ZgJzېA"""2T ""-p""""È*DDDy=U/"""""o4ԧ 2 eC} """#EDDDDDDdS@DDDDDDd P@DDDDDDd } )ҥKDDD*DD[HEDD Zw{%=9/""""""#Xw.""""""#TJJȘ~D$Y#5(8>_JȘ՛x1? yV$)#58yB+1c6隷1a$4㊈z#W7+3 %DDdT2P+P@DDF2<"""c""2G>q_pHrS@DDF$`ߪQi ١s]IM u}^m"""""2 F;ZWU ""2) ""`` Y"""""2 vyhK@DDdR@DDFXm+QaVGJ*DDDF/%DDdTv)X."""""2*t7x$H1 %DDdTn:سF#)!""") ""P`s"""c""2t[m)@$FjC zw #HPMR@DDF߃䎤YDDD%DDdN:I>"""24A@#a"""2) ""#^OցL t"""c""2&$p""26x$PR/"""p} " 0܂i"""F w`8U(m

JȘ2$)Xn[%5痧u-W4FvV<A W x ?o'SWu]\7غ<xp?gw_߸T">[3/sxUMRXt"4뮜Ÿ|""#""""o^r|^tPu)Ⱦ|O9kn _lHIY}hl cj'߼+֏^GNaqpD".M!8C<7;w'%"2J( """"}mzږwz 9pjBaG"./m:?|a~ |#^44),{w;kVLs>{ʷ_{=096̅a|}u NÓP"-qyqi>PVȶ]D"qV|q7<Q͛P0 5ֵpt%U4 EHN2ib&S'g1ov9)񲉈 :%DDDD"#+8q`(̟Or/ekc)+[,?GaO?m'A}n@83p]7fe指ۖɐlQ|U#l>O셊 纰}w_+'pTO=w7fRk! EpuI{IJ2}j6]2wy%NWWDdp( """"q䱧GqTUMnFZc'+c9/u^g 4CVx)~uܹ;\:eh|oPTsP(¯~n]UO{پfHŦp{`)^s|]ɂ]??aB 餱)Ȧow'j"ԡ<͹VÚ? oX p0vſM^OY_`܀F?QVHK ԫa UM=[r;O 2P GW(()kwij.\1H7;\:n]ufL9A$r|-- =*HYcCkR#eSSGO=cucr//3猇_wPᮕwGZ Wqk-O 0=&dlǁ&8\ {CemׅCGO?C>cAG? $ӍNd?i *=ړ)p*ӳǛ;>f@'u`t۱ =A)Ͱ̅ss]xuy~{DD""""cܶ]g{M9#8<}/kĔXNJxml1e5kyFHk'n;6) |Ih}-!~M+HOI %DDDDƸb;Uސ+ ٝ׬G"X9n^ = WsR9lx%v-DF2v5|)hi߶*~w߾-"2 'b{ӓmyMʁw\a=`[z=ضaQipB9x2e@Q/55/xm /PP@DDDdjh rL5gPX\GCc LyH-g).*zpayÙk=fY~wvf m /m:gA""DJ""""HyE#>vy{%qD\>/ii~.;޸CG $߻mF*M鸟`QIo?2eR̵WuӘ5=_ww/ J˦es:shn Ҧlq̌ ]1W  _r]mG?.u7,kfkH %DDDDF8ׅi/?r\Mij| jMαj9WXZ|w ]Bf"2Q!vn>@aq%e47#8!=OVf2)~&3ur1EdċD\~'c>C d%805w`OzL!ia ׵ ;x_nص\} <ٖ "%Ddjjcw/r8tBB8C8tať$ӓ6% s)]9sO?>tlsab$ól ċ9qlPZ` G. W|%֓<."c"2"UU7yscok0h^MA(kĩ*^|4_n ?E %r\O""k_e_tqKcKiy6 X}.o8!+n CU 8Y,\uPRkoVK 8%DdD "_m?JUusu6fLnz6~j֮vC|sXEe{Ssv* +d7Դ&r @Fhq '\ ' ‹Gt%4:U45IIO@ZH JȠhn QXTGye#MT4 z~m[pq@ ̯.Z<',""o"f+9}=K8|#+(.K0q.}\RR|x<)>RR|}e 46;_0ׅʪ&y/m:õft9r=~ږ/8XiYDZ_Ay`4? }`Mm V^s|RSt."C."' v--gٹJ(.!H vo~j~st/0P]̃W;^Ɯy8,"C; ;'E|p=2&ݫ#þClYȕMN ׅ^~li wu)N"\J/S߻tR7ԧ!+K.SW`ti7"xz<۫8jj9sfOLDF;}JHر?#Oڡ]wy0k/'4Hױ@gm z+lh&."CGǟM^ˬ9,DT IICsR3>aR!! "ߔaEC`J.61`Q)ݘq!࿨T"8Yf7?X1o*gnf%@Da\~Z"~ Y6xo'"H px?NΜ=WjlWq,Q }2^>'-AЍHe䋟ߵDI¦ړ.p I7.tI>N@ 餸j?v ~[S6=ka=F^:\9. g+aQy.Zpt5()k}XEdz\~7ڿ/:Ca%OĴ6E 8J`d$CV*o+y{n"2f( 2ƅ.;?_{;NCct1Zpn3btB=-5ڞԡ%\.f Ip0.^6̃ٯ]:j_zr2<xw )HYɼmkغƎ~xU GMC1^9̌!:1 ֏^8raVÔTHOEhےmá>' ^̄?o]gZ!ʪ&>g>%1x)"c?g_hGaL%V|PF( @JQ{/<˓%q0ˀ53`T 3S0=>p=̹>'˯e:KJm׃㱖RR,XJFPZ y0eL9ى6ndX&M42x~#Cpe0}j=PY|W{_1ohhY s9gg(PKB}INpmS`— `0C9+Yh\>dž%\bą=/Cim–޻oIZj7(QW/m}DZsfaDKP[ PCz:lXG`n{ = N` $:_a.sj*^ 7\c1:|g|xʈ|̗'0d8C*THEI{S~U2#03ZyFx5v @jq_ h6ƮEƶ|;/SQot 6/{ _xX9 `ID".y+Nw05zz[2c;!+Ӿm\Z[,8'hmi ΂̌RVa+q"A;ϩS+`D@Z%6aKvlz[!9N ƒBaQOG᎛m{{sȂ͌lڟu=P?>|p1|#|fk+ғm7 ;gϷ?.jZo'7gDdT%T"r1%e >g|P|.-ኹc;hv05/a̋NIg;+.<$ZU++BնOع8W=+,o]2Iݟg-rn a^*hi| O= G?Lr@e?u`Fj)@tt{axt7[A8VjSйv)?Ocyqv G}ւ6oB||Y끵3WC-,?m'; W;y˂!gyo"/WsE08`!} ?ofIKko#h[MgώcUvU+pk:SFmMiYG-aX4ߎ74[!9ms-Q}Ahj08$ì-Pw?}mNJ6~/v%hm[>8C5pm{xӥ^x|O<׵_~L-ha{硸!bB;6n^jI-eMMANan=tA"PCc<ы;̿R?R˰U?m}玿d5=S.[w{?>|v у"d޾̟IӸPn>h7ok}gwONn C]],_& k`|ǁ+[W[w谣6; mB#p7xo-ll:ZYPOn޵n)Jx?~/\2;Z<ْ쀆-\p\>{Rc-f 0qaqr#nP`uįPIK SV0D'$""L z? %|[ @4ǁ+.=,w#na}{Eetۿpu[[ʈ4.(kRVO[Q?Zb_9if+J-*xc7.$#{l?}0k/^ ҎL]1x|jl ª|(aJƝ٩ U՘%DFׅ_~7fxK+V"Kj4"6%.XO}Wf 3`\d GGV0D=P}"k>of:%MM+Ka =JmnRqܜ:x@dĸPUc?'vd-wNdȈ5 d:^DUP^% Zx=VBd ,6}D8Pdg*,IbɆiy/3);s%<^>fq;@ZU%ܵʪ^9~PXmI^eT7vf[\uñ $/S'g 1EdQ@dyii>:Oݵ+G@VjӬ4P4X8/h+6)h $k|x+:[+%dk:'^[˸AleQM Q!>J> bR!+&wLðqS{A$b5oSV޹ m_5Y*iS%'h7ʼnSA.1۝p:t{_S]RGxlg $;.rz6$Ho ֜VZk-lQIrsL\~]Ozy2`Mb}L%U}=Km*J$GpM:2l[kBpw qTxݶ1 PD[2ʯ]=A CJ(9xsRS`ɢt]kCQc,>|ƶ]dPwBr8b'Jc8K]p*"j8q_;g`D9z\,,H ""=cO_&(Kt%Mw`jj]!ud[+ׅgl-2s [|tO ںeL(H+{=_!u^;t;4{sY+Fϴx\-eө~)!N%m|ǯӅ^ʄ ˖3YY~[_|a$Z g]|UJsgwO `/C| meP- 4&qX"9QF$>ײp8M;TJ08d'q G0>@-m ڴєhⷁfY|ӓ-IjsdW8^ک5T:"ҿ"r;/r:2-$~4896?a[M#z|&Jypr֪%_gsUƊU,kvگz[=Un0T ~ y?i}Êaq{i~zL[R̞iu#vm-Y;vף}^]ۡ ?klA{1Ȉ8{q͆_qsB -.*<ѾQ8{`u~W`;8VUp-xa/j/͟8x[ 5n dV̟vam8KjyyGʂ뮂[!3ˈ6yb&}jvrjj[lJ!';7Z`7VcFV*=6.%;NôڹtE:C~HR@djj5Kq,Yj;V^h v Kݚ;Wڔؖ ׅW[?zOj/iw}l[ ;ͪVrA$>oʓ: ;&vI@~.sU totkS8tĎZEC~.Lfkq1@Q/%GJ3FC8[j4$k%+jX6fp0_8b[/(Z{]ǪҒ`N bc /"J 蹗N;8fyѬ99 wO {{X?@c ء@޷o%&ؽ~.V,t8~Ξ d??}ֽĽɅ6>_pd*XJ7vaw9G$T5M@I)H?UѾlU#i;u_L8JpQ-km?Qӧdf"ҿa|<=޸R _(N+D{d@Ty%<&]R39l=|Q- {HKX 㤧% l@KUdofLn0?2酘-aK&J"6X޿ U׵a|Z ڙ6`0*wY3p]-74௻CP;M!}!sfPYJ0>u$CZwRA}sl.\'d.`a"Mn\>crQ\*<|og]Z\5,9ى#2̔W4DUKulA]V ᵫTfgҚ hhUDZ!Z>gSa ȉG,ٻluHč;ADHmP]̷ƦI_1V`ƚ@*J ^r:{I\l?oO~ )զ09.54_)2B$%YA+;u۷v ~񳟓xM?w#8S\>9fLCY]; 2꠭}W[+@]foB+<H6/:灤]J|d5/<] !M!~m45'y0~]`䎫3^\{dU*J'ڪ96y|f[^xj8YyV@d ޽I2v,n}u#= _g̘aC3jzyMVVR[[k ~>Xs%Xv%qрy0g<,li^%~|{n7XsDdT;y9v+N|iyp;ᦰ&6Gb{=~6|FX1[[E\mͿ+|l9gkv""P]{C§>)=ƍ׿n_So}[iiiM.>]h kAm6ϧnXlœ- ]~^M*DFqOt6~/ܺ{[FͱV\|U%]'`[Y0Οء?6m˧Z+c.C?vL8Ɔ:Ƞl>xJ{Acgǁsjzえˑ#Gذaoy[~f}̎dxWYXxKܼ>/z,)P 팙PY/K&-~"үT 2g/vL΁53󔆗-uUI~+ [IK KGOdBs*?quc\Z~=H‘63_J Vo ڝg.>|O~4SAO&j{s{9>|i]-ybn ]{(e >DDz@"#+[rLU+! hal?*M;M-g[X> ;N[_bڿ9h-VvF窀LȂpA(G;ߴܞPDƼ 8T&_ԻvۃJVSD͋) Ҟo)7/NPTRǡ#L(F2AD "'=N `PV oIzN=K$5൫Ww;.um6~OtvvCD[BxY)Սr)H-bz~KX{yfT)]&%DF^xT"||ԋn[gZ{^Lɱ>7X3Ӫ j-GlB7*'zEeĽiǞ"6o;1&"UkUj7vR`ʩC7p 5Wx ~0{_ g'pfy󶢞pRcjIKmh/ *~@Mm3?oGlH?n>+ՆƓ?'OHpX8Jbq&M~D_) 2=$u7%8h{_)~keUq ~&ǭC Vv.i쇓鬬'zU=L'OOJ dn1uQI {>n @JSDdQ@d lz.jji G`[/K0"6o0+Fے`,"v1e▷/假ytPZ'x :x|o-֖ Y) LΉ;)T8R qMK3e*DJؾ0c}jhGd'q`L7؃oæ<ǁ+AfrM#O6C^n ģF:@^|/ph½@f|Ͽ#%+q5#c$/"J ajkbh,Lo ;O۠>k0/ozSSI%h0-/v Bׅ'uo\*vbv-yD>lsm}*/_bPxmbnl@V*l &o2W"/9QxVjAsIS~VjwDwT{rgOȊUTcIz ['ED: "44F͜qI yW<[o AMSkӵDKDÍK,y1u KBCluWR60[w&oFm4Z5F9, pUa8]WwX5VŞ9~FC%`w,b>E".=}4qHU4uUUyjݶC&f[f_o\6cOD"Pqi=O%$, j/Gl^"OէDFӗ=>s pJ eTEC<1Rb70sأ6@3rT4WlK֎j+mUi8]T޴|MJ aj**؀Ѩ~2l9û]uay8Qn+*PO'ZiKjO0k,uUC g-mh g "8 x-/Ƕg9X{TGpo (U -3DDP@d:t@e#^]3evۗIܛ V5nwX$.3yd{2KT'ğbHl;uasvPye#誫T,:x|o߁׎!x)l>3!/7[CEdH( 2 S{!fBV* W-_{k Vv+oy?@eÅ~Maa떍l?7>]*wk#+8x7@Ds?בǁ%s DGegǁ.%DdR@d "9WFGYYec~+>xeY` SMI9l3< &K|8UvQsMMVw,%mzDDڝ<]f6-3ma <{Ȧ)H}XKjJ oR@dptU=LP-MѮ߱0<y8PhUoy"[d &L`Æ g?c칰L}N8"Gۍ.&d["!B^|tHOVG!uN,I] ;nbxlO7^3k6QM a%D}C I0%wpOh4w ӒuE_ _{ ~T]A-yu{m% شishiieVPi{ds X%AݺKDa; Jk/]bOŴl_W؀%S~TߝfBAO"ҿfJꨭKP4:VYZBEKO7\b~o {ζoGqۭ,@;o}F7jjj_*[n#'OS_f86;**< 8W5$q`|fřROccoK\{o>cXWE})(_yxWv}"2&HdlJ<p\[dAxPF2ܳ_Ծ  ׅ<ߪ Cl_+a=?`V֋E!*qoaL͵פ[SsJYBSEw*bI xUXv v >f\U1#܍3dD;WiYtruLOπKwQvɪ{iND$DFFB.  ?.F`ئ?w(n)Kyav{.CAcErXgE"h3!ˆd(}epfnIvm5}; }WowEoGW&}ۘ.b pޛ*=_>}v;X"`z>vj{Y{]{T1yb&_g Y~0SZ@$}|L ԁx:zA:JۯToT[_fZž%.^ow_0vOnȇw\a[Oǯ⊸ 1-]Gާ|d~*bfH(2:ԶĈQpzPeЇ8u㖛o xzX?6'$Np~/WMJhvֈ;SA57{uֳ oݫ>J*ޝbdSЧlv㧺H."LUuS i\^>쎝Qz_{e5l3fdxS]_Ý{iEdP/٨*>_LN\ZkmޙJ(`*^HZ;sz~O0 JḿBK#vl3ٮ2p`jNUiu5)'Z[ך;}VBlq~QD<%D`XI_uT$xۋ |ӟ"(ۖX1īHذbA q]gm6d_P=KŽ{."2f/~w}SG]ğqKG/>AzZ^UwI[Cf(o¬f[l7˶ -aoPR?zrąqdf+"fB.L|p]x0l<籾ѻWOY~~zlQ0ܽ!{VNgIEdWn^,h[5rk] y+ɞ:I9bjV3rmo9ωq+A!W"2ԶtN$~J%dܿ;XbۥsO7/Yxahl;Y8KGV ̛j.0#Xdlhi™J[I4½L$Y}>ѠAhEʊPQwMX'[/V;,fSٙR'f; ]o柧iDyX3qslu&3.\;}9PSҳ&"c^m]Kxߥ}zw?vja9X?۸v_9uM>M}9 pNv=lƓ䳹 mYCTqy\}??VJ 3  s|H=~!΄'l nUN'Y ﮚČ` ~ޝuϥl?؆(7[}.U`ת47(l ""l={F{Ua޽GZ+68Sb>6#qNW=;5~/\`w8WeSe}8_;O5$'k %D@ D}ma+.lo̶K&fU 8f$rb_dM9k'WJO洿{j 8Kq=̛4.2եk/!UW/H\yuƦ`ϟy1 -l5?- ޸,% gJ?%ׂdvc*N[x)Է&t -.cO(bi =Uj6g*`۩啕v%Z}=K'/Ƭ9{n""Q)Ǿ?o-$~Z"Er?ᱽ]Iv<2#^j=!~[׋Q R"H]>L^M?'O'hKēCH^""1q|ӹ~2S7Z`)8h%>}$+5%h~]G"Ó}߱k{EU&_߽j8w~tN)>e>_̜ӿ&""L0Q ڊpq6\), W/nm B,-osn[nCjy>V|i$Q=sHn}U+B]~2.%<|dGcuɔGtͮ "ɏb]3l>-}Wcy>n `3;ǩdZ+aݬ5ap` &|)I^rEssm~sf]oYEj.EdpFdzq^OJ['=\98>.Ӧ@q[v Vo~]T}v ||:{y)O %Ṍ*̰!!?04Zv|,uU´8'F\81oR^ѡ}*02D^k?`l[|^pUp=sV;JO[gQ8bmoJ<{vLaM[ϒ!e֌\ ˙4!WEa&Ip![Nhb8-bsɎ}3R%d}{מffS4Mkwm-T$deʚYd{d=W>y:w<18Pd϶DZ_~/d$dmÚh_"ˬۆxxw-o/k 'ka,֮  3~_ -[ Z7:os[I`_P~>WVمBax5TdtFՅ-?A"4y/F'5qv)ﮚSk!396⺰5S`;)IEg~lYHm]D#.zY+@o^X<MjK04KOm?;wkǯڎoB"v~sA57+g""`F"vYf8dWۯxü r؛ؓRO/ؤn}:r†R%SuN1U>K٤k9GJ[%cZfZt3m 蠾rc٤$/9\sL~p緡@i.V6o\mC϶Uem˗L~ iWDib0b@9Xd<ҿ?/_-Y ECAf0t[IKb}SrmCZv>w2Ip6o=_zP/-yq۲Ӷ]lӝ^;8λDȰSq5g?n'y+ڝglm ]ǁeStVhVӧfOȜYq^O!Ea&%$p0ůLHOPBIp9۫'%KڇT}r w׍y/|?ʦPfjs0닷nzlE7²)퉎FK|i+q펩v<%eA?xCKݒ^R$"z$_6ğ%RluGQ5zS{l']V*껼넂tY};Q@dN0(~C@ϗ⯙Դz"97rec6>x`>p t] 87, %lnlQ~/^0Rk6]Ot4*ᚖk_D\x̂ʆ.W?w3޽pA a'/'5vHRt. y[Ӄ)R1!?W7OQ* ŵPӡﵡVݕ ]`vZh @؅`]2ғHv [߻"PuknvOrˬXi*~mw쾝K(bzWR]ǛY_D5 f'O !'N~05̟.aa -0O`|(i5$;U48a;0,59{|r)nhs(F9fSx[^=EC솒Ϋa>~QN}bl::;n ӵ$Wسhj y=2kF.8m CN /s'՝g:'].}6~vhCVf2/{J 3'd$h_ςǘu6LE=5N){d}pq.8ɂ4>^6F9B|h.CID28d[3[4&pqy&jt>BV[z`Lr~;]m0` ǁ4]|*+oq`)M),\eJnnN mD".~`l vުR|UíGgD"0#{U]UH1ܷ9q̌$x;WDF %D3IM NzZ)sŮeįHya>οVL<<+i5࿣Hĥo`3o|ϟxp#qwp׭ Kl6m߽z^nY3>zdpR Ƕbu00 큟d \$M*}T 22iBqƞ5MP5VHKvw4s}zXH㜿NGgӫ?g](oX̗ƝI@/ǝص\-DKj۷<7'*(A¸ L[:L2W*E^r>V~ "lz/|?oZ9 ૯uˣbZB~h͑y6Ut8xb0džx`<{0v@S>qo{Ê aN a&7'3{4Ʋ:n Y/gC¢I[dLU>Xה qvR~])Kf0͜L1-&8!'~͟y0qń,h}>)>MQ3?T࿣z%ć{阞 P0.~vGGlxz /}^*6tH}V暅0-U/_ְ?ǁsm7DD%D''D?6i`v1M|QURKd,"qM[Rin%w<,=}_cm?e4LiM&ӒMBf6o;׽%UT6ٯ@A~:޽°ںRSBeUu-Զ9D;=OvV S&e2{f.de&dB4}C zX׵{n[fd2,'ؼP]{)+oɂK0qNk`AKzz3fww.`ʤ~{K^n*[HMv]6bLgK̿pĪ [|>\?}vUZȨ0l23l|CĵՊKg m\@τ~@=wuY=UӲt] .ƿ-U!7}{;\d}懋L5z Ψ;Mo hjQ^#<\}&Əxe'O@Zl q*! U½`?hMNµ go`\fۈ ^"2 ͙ˤ qV\^W" Yjx\[X⨢؀ a#XcۥYlډ=+.v 늋TEŻ)6D2ғǮܜmi ';Zul0Sn)>-ޢ_DF%DT?'3,iㅙ¡ē'ry<3~;H~+CN9ocfxV%EdۼOH h^kݿɯwph"9G>o]7;GKy>r%_Md!0at8˺u6?%CŁ>NIz$e]pl= ?rCl%tR8YfUQwJa~܉@dyS{=#?g8J^n׍*6oyr~XdBjPvo>JxZ[7ҪZ>T S@dZr2~_rP&SutFy_D9 M>ݖOatcaĵeQ&M`x issӭ7L[J;S$~N2ǁr]9 / V6o_j6'Oc{Uu]|>O "2Md;;T.(7;v6?ZMsw_d,z? }QRk^+`1Jpx<JFzRP\ZOqi} dr';򹝓uť|g[~a`qgZKzZxr|I <`aî GU<%""Àv23Xl"N,Ɯ~L4%ǦͷMwqNYymCqMOwo"/ε+l˯p|;g+7/׬}(?mK{բ cap2"#IHz=3Rk#fϫcOY Az&u^<b~#?>t|%̟߷rSnfq_|Q֡}nX -׽Bۡ6æ [*i&5EU"2( 2|x`lkCHY뙊:?%~M{CS.zK[ w\3zy1mo.CZ_] z Λ`\DFFBVwS0s\o.mt+Ts,iZ i6t0-Ɏq,hTq'wtۨwe|>ٿcOQV û X;ZkוPN{3iqlںil RS̤ J0n^C{Ţɶt6@Ql Kguelx St ׅe18Pc% WV%E`|OP5̈́%[@eu6dꥣ~,㳬7Z}/wNܻc‘}> oU W|nvUɘ q8۩qVZqW+oowz\~OoBIY}M[%率œa8hk*d36%~`7/YdQT5V8rx8O[DdR@dLf岉 Sp1.ӂ@[|y}ؑ.*]P_SbZ'p]ĕM(bws [rvd2\&>؟`:'Vek vN /$^7P6l/%0"\<]i~j+-DbZ07yq]x<7^3~S}|vd>xճ7^K>=gI߶ mh/2%.捷6yړqC;""#" W#9TdnR?;C{C-p떠 a?}@ dcVYV a7vV<.v4V'u\Vʼkm+hPM(n8]CVϰa`Xj_mJuY-X07% {ǹ(Z%ḊqjZ76ri]O|įʋlq!ۮ7m.kVȷ.QGOT&9yසLQD:Zr2iq.O<|" W=o XC`ooHwWj1mLRzSJH}eYA>S0./F~ݻYb;_o;VoZ*DD"܌i,]4> lEz ZrKp=hA=빶 ;Nwz ,j.6Qi~7Y#^t<~fܰuihDFI2㯒7fz% 6/SS;^ 7=w.ߎ]TKMʉ[IWS˯i'DDzA-"\Vf2Ogs7,x6muJ'dzzrDBے)Ό~S f8Un;,/osfêֺm:tݓq"uɆ)9c .L# ƥ1n>E%QEU v05Y;t"|ox?A^u{)p\Н2S Qu>aUx""#"#7?|@ *)W]i(y~چFij䵷-$)i{xu|: 3omS-;>U_lȚyUM_qilX?5+&3}j6YvΤ( 2\z2ǥs EpZo:Ua[M{O|Gc+09ǞL ̛zpx{H#ލKަ̔;D\_r@(nO_E˻Xr;w 4m9ŸBcs\u!8wD%_d¿l[Pz@F23z߮CMׅG9t_~7YL(Hg\nW\:EǍmEdS@dHKs͆=7)w۫$O,j/OoWOX`ZnLm: hm}7!˾o&ٿx}AG~>zS>4x0-/ eE%=|QS5#]{l).u@aMu-|g[ٰ~:8CFcsTe;[_"Y:v ]p]ʪ&-wKNv ӧfs9,[<ܜAH2R"#DAIP7âV輢q%~ _z_u| &ZPlﵹ:~~8b[%?hx宇~-,. 7*s"#\R*P X {ӒS_"?B}$w~|xUm~o`0TT6sO1_Fn7_~_=KS$q)+$@m}UVvҧnWπ-͞i,lÝeBV‰=^ =_7`l*uFSǽi䬸_r2LsqFi?~ P(¶]wM[vmRTcޯ7Hĥ1E|߰/{g^81wtG bBAy9qz+?r ./y{@.r 7Nom]iޫn}-{6p(.ǭKI{zZRpIܛ/(]rS\]p>fXIÍV< vtrB=&\Ccc'*ۋ'rX W1D">>PNW{"km8$O_Ouˉ4(Ծ@q5nk֝Sw~ N獯[ W&/w?Dd "W6* 2̟ϦT4X=`n>s=خiS;ĽV'cm}TAi(J$}Ը[s%uicc;X:/g-2*w%#wHgﯴ7S8`iw$I$w%Y}/| J@'ZB>x|_J7N[v]T Q2ғX@"sbz8qpTuС"p lF(b?5pZiѻAuK؎({cTʖrޝw?;}7玳@ $ ϼ:+Wߪzx`% q\?'Җ͌9iJ>s3og+T= 7tu}R.?ʚw_7#))άsQYDQI=Eu+sTU7QQDSS&KC\um}O֤tq!C `Υ6J.2絋ZOZNu -oZ;XdU PVf["&mXŻ6߽윛z>˝ /(`~NII^>_qt7|bA/^5 ` O+uPX:d̶,@Ui%coX[﵄˜$`sK_ݿ{H--a}?N*P(20 ]גYq8m=Siq8>/97bw>@ʬ<~W&}l&n-T=%"fy[v[3ӋhJr\ 'NUql5EW6RWB}C`0BsKu/TU}W dBAzǁʆ9/\X k]m@U`+m/NXnu47/^;8m33Y-3sp4m6mڔ_WfN9M6 ;8d[,fZiygHY2eeigwjybn]:A^-,cMQ$.>oiYlbr?yv𢡊U8\eVO2ab~wspʽaXs3aIȟIG+ݴFp=;]3vLc\(irX }b/4] >]%h%!tnY&-!^YiLj: sy?M^|0 UJ:}vhUV*qX6 Un>) Uy7`z$$%х5=Gq6 &`Id`IqSWhU@֮6Ҝa9D*iԁ"}6/C?k(5C$_:SOppS׸U@t6l~ !&&& MiiSSaǞ:6lbˎ:$ٵW#|"!KHY$2LLK!%Vp*8d"wX$"&&g)Nڍt/Jg@ОH3탷K7t\ K#ˠ8cD !K '$ŻkyvjuCQVE2D%@SgUUgJt;LZZwTdQPf^ezX%;ȸBKgҎ^ӆyWZe =e%ȼrT(cbYMTzZ{pcGԛHtA&OL{_?u-~MLLFL'3HM#e< 9ݳu>Q$ ,$&8xx,BC&ۭgHqHȒԛ j 崒࠮jv ®k0"vbkhzBvLIsu wN/3A;bM]ym^߯U-zVE"@"%9}}g #`bbҏx޹/s%[nIIXdv I3d[UY&>'|V&CsgTqam†&/˼K݊}B:!9f☒+JG%EBvEW:F4G1PE#Zsdj?)#X )2dlY$^8O\‘Oދo_ET T[9-[yJkb~EUuJ[wرZ ]tyCCjwBYQR'з+bG>.TȏW(NPRHvȸ$`&LL RHJc^j ??oXh(ɿhb!FyW%y `:a^>=.R_6awJ=DbaaϞí7XLLL Z?<#e-*(h`P% Kc*(DrRqL)̜NA^iN3C*3eY.\FKq&l) 4Z^ _{^=-4;ɢC~rNNWǚOݟ^$_tPE8Z?<)lYžNW}( '6La̡@i]5̚ixRvVaK%US[I'@$ 9'B@E05¬4 3R%*vG}? 3;bG^Ն=D+{\Ux-:B0p @don6 ˾8JօR=M]>[ʅ*py]X-4AX[._k)rdwX0'sgKSf/.k $Ǒb1S-S ڒMδ,[ 'ԏ+CE9}q@[8gNǏW?D/)2DRoXN9-}4b }'#e-|Wy$1t11+:BNe4xQѫd4̄x96gؘn%-Nmk4 3TgZ ne]g@X4Z6xĿq5Js :b\^`x6eI,#Y4McA,+ZD0$J>%fob2ĻmĻmL*Yvu}ϺZAU ɢ Y칩L"U$5 I|xQIpX/¢9\{ikb2|0ޫ{W/KbyH8-IUۏ"bQkbY(_.53sILp ]%M Ux2L:d?}g[_HX> u I?gK?Tw1D:|sSqL9#T&J_}#?!PVu=O~.gg1!/@Pi3kulYCS@02_~C&-3't+S-2] vE"Fg019ɊGQdTՠ+xrINa(T삂vIcH̚?[EB[{@l:q=XO|̙3`lӒD2] ]:k(U]Vsw.>1wyC|{#;cJLG/7wbIDd"KM'nzɸSH޷oDF[o1u)LLޏNuW*sPM->TuhW QI3~ ~ٰh̄Iiy+UN39339p)zm¢ q#?iv+T3mYC75f/K!v_ 훣Ё5bg(meU`S(URnWoK&]4=* g_>x:OY8ǦdhfiAgt d4tY\>r/#v׳[sZ]ODZ5Uw߶RBM`QP\҉-'%~Yg#{k!Gj74u񻿾XffO=a;8EV`erF3`brQDrR M]!xTEip,xjx&@$N4s.DD͗"8hV`v9mL)NR\nj/t8DV m>xd܇ "H`L<^9IG4$HDP8p\Q vo&Vd~2d>]w6Xۘ\t%xŃw՟6Ps}dSN3<sOKQ>B0ӲaaaL@MyŃlibbrby5 r HDW ή4wà Ej!s|FOA4ᦎQ]Gh{y+%C][ ]Yv TBkQtU_RMkȆ6Kq)4xi2MY^%\~1%9bV:/f)LFvf|MIu&j).aD0G.[T4Mזʍ J\M=- HY5 bok#Oe1119=pYcWu@`y)`3.)u(;F[{dQHlS&K1hyv#jF2! n[&m 1^ YhWwqjQ0C~|c%a,$K eG͸\dhQqb&LL@$IwG|^vI^?M?@ܴ!O)Y-d%괪 e-e W_*I(N'SGۍ4{uwWaVte 'ıb؄dY<933vZ"9R`j,JO^|:v:72Բh .rjHNܹ>{LLJgؑ.j?iK;@G VqrhA%X^%<&&&&:h$v=LRBGhVad%vb6xh[Ft`U/B=}]{7@[;:Sc#׵/KZ֬1مHߓm~vȤi@$H0!^A+rmlo]Y019C /K'a^](K$]4I\`IWg? ˱d ;l[Z!7\+`X|I0;5*׼1 {܋'3Oa_0呯}L)F>Ie,ĵCA* Rp^?O 0Ўw{kV2R/$eB$y{Y`brjy/$*FJRGX"4?./.m/oW4VGv$ v[AS59I > ~h4z> OB MNY/:I.{aX,žbVUmcbru|]tި)sY%ui2~<6z(8v1f $e'eTªj)sRx`H{A7,g_f_1gïix|!Q Z(ߵ62 FFЃ$e3}>@?߿OY`brlQicMCw2H@3X/gO=eP@ItVǂd'ܹJXOt:CP{hϛG< φ*s|#AIta7MLΦ{[ᥣ6OOMK8'ƃ|\L3_z-!Bc~LaBytbo@dk_6m#=1$,ү?>`=QsɃT.^z!3Er1Diܪ6޾$҉"[[&&+Td`79yѻ:"ayR?gORnl`It! }pIp-K+"욺kP?w7#WBBiyj=?Z՚4VF(qX3[,7@b+|f==6vq?:7d#}|+zJ4lLw 28ᎅ;lXJ^XL]nc,G;:6 b/=~U݂kq[+ɢ jl"Mw큭@&&&-4nhŤ #%UN1Z DCos%PZ74P@GX70=>!|rX1E80"Rww8z_l80h" XL;{ %VĚ:BQ`nx?1aLh>|lfL=ց5!_H|dgMy.VwC|v.y/[ABfU@,HsXPa ;|,jWJq9ȿ5'=,45)`:"P&[~:q⊳wuct{}JTlUk|,( BeOo,j/z寙RTW5EA׎#C7 C1:d`UD ] +4pc; H@׎;o4, II T 3$?Ck:ϕv*<7=r ?>7WnH9.2]*[fYaC"03`brrQOt;X'8gx rNl ‘R y1t+K' >,l<7Ny<*&&&ǼY:>|Ҿ8m Vꂻχ-On 0UF'@ז#`q;@|" p2Qd w_LNKk{wz˴6ړ<ЖJʙcdƖdxifϕO˟YO0z,_n坪NU,beoL;♝&6xFn/7Eelf _j/N!8҅h@Y" )6:m@he C"K~jҊN+nwevpVN9F]וsįebb2$0!`^G0/xwmۖ \:x1L3Tw1J?u/ޝ#${'5ZYX~apԉ͋n;ްΫޫ qn.t4;Vq+\R`Gӡ=q-0;lPӥ #:!TuhzEYNvET$eIv8DLMi+Mp(hqY%R2$%'1`&LL0+ی-A,&Z3 "(2zDk8[U #%c`Fn} U !A{G^wۑ 1TbΈ9agqѪ"cqSFA~S&F'T JE9@ĵQA4? |a2XdݡjHo<)c1A!7 nY΄\sCW6Q2nO^cR֨pz$$7Oɲd0dr.˦?m`Ho"=JY 5!,'H^8dfD`gTw@i{N?ф(aX LSͅݟumGFLE6Y*MkoI-ݏIPuš$~J"a%"J86LilRp2!6Fr}p`,b'q`Ix J t+.lyiя:c+IB pQ!08r:&p60119%(UNfrԾ:pY8ORlIzpcT; P'q/LŠF 4ǨDv֣IoGTSoQS7jPC{:Zu+ע}d1S!85 *EU.*8[ä\xmvJ36I2]L~|ptA8Ԅ?!t+W91d@EbRII xB:u^FO5ht5|ΐ7,* |a.H\Տ",IIϵ{}־ףob@LaŰXZ9NRsܷjAX.۴ʰS 7u`9 dQP1`$vpHİ4RB[Ⱥcdנ3 MJ ĪݣM HDWq1119L)lV@ GOnDb"I߱k\uԔ8>v>]{hƚ CaG309ssld*Ԕ%ϟؽO6#uZ!QuD @P v'}!hU BQ °#K %B:ވNH f2 vd+bE"o㇒:ka`eY1p(,ntDkӒ+aKq}D7H1زmȀIXKs;zw{ر=X$𸉉ɩ!mc9ز 8"˚Tt?Gq#o>{;_rLJnWMI:wzO? sI')J0ʵ3`bri:=`]Z<\@|֗/ R/ ;* x6D7:~w{pL2QnUSb: 05_Z( N#M=`,-9FMy~u)ebrdA.I֮UX7jFL->&)q)=WWށ{߂#oᕽ7{מ.OVM/] X!,ʢ'@;}9=d,~k:߱Ze߿ ?~s5_TLJr\C9Qy␟ϼǚV~u!F`brph U?/I0;Wٿe+2G]8J Gqv@)njM up$^86eGvZX0-Bvgm&&&eNHstJX6Ԉ䥸D㛣`tE ˉ_ڿM!X1:U]K0oQxkwT *uOy{]hZsHk#BCpLRvk3l*7@m :J?gI2AD .\֛ǭ7f^|ϽR6P?gM=5]*]* ʤH$Ƣ,+IrNP;t)LL4Mv<`"Ìxq7: S߶fH{dXxj,lbNcWFszw$bƌOYoS=dxCf4+qC;'kE;ZfhcԼnG1os'u;莛ǔFw鱵P/R$6=?$vW:Q+V5Vя"3vN,#%̀ŅefM tM+9?3%򅃞^FW:$cb>a0Nd/gZ^yoSƱv:<!أ4.⿵\ u=!X=lRNGhzm2>z {AЁx.'0b#:OD %h>m FȒYPjX:f1! `-o9dHf,o/vsj&KI:wVn^@@y}9 Z)]/Fŏ%Tdܠ#VjEcb_ӆOD +5s!aXFCnZ$%V(}XrLF3e\`㌳r޹wnoE_kf1h#@$uaNM!,D]"ۥ0=L3S-&Zs+P f4'սhjJ፥wb$ {% 7I&)vTkG)˦391rRwu+3[Op(:`ڨ>{EŽ֌;Ꜹ0a,fAfT>zX w|o-XOn >pTLJ=-MN=n뮜ƦmD| ֓MI=6V>]W."XVOWItn~7}ry (=ɀuW6j (J\ / ?TO|˰MZ/ٙ $aaѼk]Nm}'Wky{5M^|pTTUѧ~D]&=NfZV$[P`;=t:iKxћ':Qu,:9&oVAc;E9bKv ڀ6H{M#z@OadcIǖo_E 4uNEӅ8Qd}2K`KU]AEgBLɂmk3Wnѧ论VݵZ՗NLfV+o|MkcԪw]Fͯ VEK[Vc]3&i|(߁ 8<BDoE~6y1d$[Չ9F~%F9zZe `+$QTG?8V5r6lfZ#jt5.b9 *.=Ma$I$,28d&%)LHP(LIqdN019tccAQ$sw.ίLa Ո]HCh:m{al{a1^4w¤t )BX5vQ痘,aa|66"pG7aK%2l3/t-7AUu}45W*6 ZʒLMD$Hoiͦ`*X q "c)8dYgE߭V^XdlVUIc3$nq?U.7`DQ zT)cWI–jxȝ;% )zjwՊ noBn1 # eb7T!KBeދiË.* r7جE%$$NY,KdHsq޹B*M->eJfP0![q3RQ I$&j $22q NLLC$ RdDSƦ>]`&LLNc:2nW)'{Q.uE=JA2`EG![N)qs9ZY: @YOiya3kt\E6+Z`?$*40NK^NK'H{G@0"T U0F !V #J(kz0ᰆjH3%Gy~!$ $IB%t]GQd4MǢh_u$IBRXdtみ"#$a ocUA,cX EnWXdv Lݮ`v 8+ vHJteaI1D%b^yw(]~HD7~ї^2}u=vq6lyiI4͝3"-G[V?ƗA򲑖/Sn:xu 8 -&{]./Mx IaߍGT[{d>}u l63`b2l fO+]ǚ唖2ЗĀ5^BO'g&KH8,VY$ \V U".Ƀ88Dj{aۺB I'pXdbL§n_ȝOB-k FE[6ϡ<Qizt-[IX nrb`- (M(Ro:jQw $-7U$LBBL0%DqX: rPU::Btii꣡K[F/]]!>HD#wxt]5Mں>} tt]ljq!ƠyGOA&"zVBO !ގe#9)82]:II#=EFF FbYHJ4Xdg_z.y_h|ʛMPR$qv$d;i>ij1PR u.!`@N) +]#߆$+tĎ \z*9yUpژ=. %,tM EU$m019IL󕻗qcygY3i|L,]5`dY9/솦NROW`MO$C@w ^4vh3X(=P+vtwl*ִTM*-cі` ±@0 .`\{wO?Lcή M^4xij棭=@gWή@@0B{>ҭhHԻMn?3ϣ',Jzݫ x'$aHa8V\Nko )AFԔ82\$Ǒ$1ARx;i$;͹鼽Om? 8xXp;30π5-kfҠt5[ɰ|>dUEAU.g fOC\[vZEU@|!xujmP?U΃/l ۩A>-l)dzzZEuEDb7;͊eomsҲVhXUtxtyCǿG?Q)LLNs.9h%G15믞μYYQ~7gncpA,b MH!u,?|o*=៯v*'Cc2%!p~Kт0 fYYK$^8kz"XZq Rµ3ꐮö]D"PF꠶6JZꣵO7 Q5AQRa86'ӻޭ(K% ]E Ey?=w KY*]- rUMk契~T~EF^'nuG+ NSr 1 FX)2\> TW?-_ڶQXU=ɠTV Xe(-oCc(s E?}REy%{w,u[iepXD*Ju\w"z p-M+t&a*"KrK'kDJ~qmԕ6Rf?[E;A0\z!U'BHc-JTfeUYiVDH_XGuU`DU{ tj:NP0Tu:Czϱ?4x'2҄ATA߿kvMBBbD%R<1I)NH"=IVƙi}Ͼw RU z|lH eMv _p?nS/;_]IJr?:;$Yg%`qSr5IDtQV@]ߗx^&?h38i:߼*-'@EKgd֐t< !dYB9UV&&&CbĻmĻmL,Lܥt]*ͭ>[|7v䥾 "A m. T4]GUWZ %WFR\ܻKh~r]eGTx[ QdIBc!K$X6 ^c(!kD@U׊~hY9B9`oiQZ:@7DUNJZj<44~A~,ۑ󮓤Uz]%DDzMJIcV$$bx,/.Խ/1e4]9y_`[uOcװc}LX tv7 'sN96ؙj~*I":|!րF__k@-D4&ΥǓ F}خ E B{Go'zDϒ$PD )ɁJ\6O߱?mS&~h|{GPx&&WvٸXdvm`k]k;$I8g9KD>ᨑe7 95˯S=E39cSq1R ܸZoz|A~q !D SUpD>ήHjKSPt "tuI|n&&&̑VfYHψ/{@K9ߖB]SF;T7SGV!9j$B ъa(b[*Imb*ww梸D4NwDx$e +_v aρV-/w3Hm}'5u-o#G[ꣽ#@('rwIVUw-ʵvE(ۤ^k8/5N`Iʵnة9U45~ _w?ae%3Ǟ3a*_λob*AuEt|*Շ<{O](Š\+lL钱@G$eIM1vGNG#(OHh t5|"QГ4hjt5a,GD XD{zw 9 RY?92x8rMdʤT.:~ϟKH_O`}P;*PlUm_D5/bn~Viw-gDpl\Ǣa#njވ{B97L軵454 &2ߢK3,+/&01}Un&;fjEP eX=- $րj&LL&H+bMs?7oyiQHb!6g$~4?wat|pO GPvZ+j l)piP>s$#Ar?3Q., @XxOtNH.$TUb(Wv"]"P& B]"!mAc%ݪ1NܿH/1#xKagX@~n.s΋UF}gȍsHts]~ !G3R-,Ȱ,$ N0^y 8q!E+*xC]a&FgH$ }NzJ[@#*z>&j<,)t0!/ yL(SHKqTa¤D%D"?/ z!X*]pD@0b(  EX ~".XQu\%3EőVJ[0cX̔H.Z|(b [d,ĕ`?5=j$ф>Bu\2C叵PM D@4WZ{#ۓ,q1&&g7\={먮`*̙W?{W]:x}`y`Z<\Jܯ@(Hk?{O?w# Q&p_>)285Ae @ݿ_'{* nubqlUFuadxj[*_}p&Q›8NޅiB 0UyE:.]01d^'~Fոxtyop1,$ 6q"PvP}VZ<7!i\C>M(H0+ E&qel,-#  2P9֝Tu|a}?-~J4ۥX- I3=# 7;1LNr{.d,w8|e\zv sge򝯮 ۇ7_V)GvN;=WYP;5]Dj[$IBJ8mNL ubqv n% 7%c/e.D4]%\LX(2\9[|w4Nxf*9vb01111&&gV̊ez}H{xô YȺA%B7oQ6wZ D#qլa @麎lݔ^qdE6 RX"K`u"U-`Dw} B¤$KwVp*[kBT'g檩't^΄LXP_F=Į7qdK9maC]D7,AlNYmciiV\ʸ%T] v*JYJYHv7TuFkb׾z}f/T'yI,͢y9̝Ef˲ɼYwxtvEɩ|˸3w?homeGMtE!q1`>!E|7BgO@g7jV *HLqNÝb^2+LKwhxd쪄[B ?cI n]ǿfSz6MLLLC[oJD"1VY@V" w G 5z$I^![nb2]rstMG kHP2"שV5̒8`*\6Kذ .)]gM`[a7LLLǜ%LLr+{Ez$L5wn=g6֨WQח 뚆6D=8(l"/zjsN`fQVQvEA@;;^c^;佺P@0Z ;nהdRsYpB05%u[[G8(]]'^Ѓց]a~ى"I||;(8-H傌󑪃?Sӥr5̎0{ÔEh0U*-u&^|06BJr̝ŲEy̝I~NqVnf:,շJyl]K[{U5n$PF$.>o"7_;{GQ&fb/Hd KwpwrkHX>M%FT:BaX2VNP:fܮ,Xhbbrb&LLrXASˀ]iB+$ۭLt(%Tۿ^ Ӌ$A11ҝ7Yp$xhQ#₅Bkh (#2@:cM 2Xs"QסSE9yg*]!m+tYd.y8ǫJѼ ͛OS'{o)P jX@_7:N~I{>(mbjB@3®0i S%\ *]UW֝]9,Kh~.σgqS)9̆U]Ǒ|pE_B)ũ̚Y̞9^zpKHDp/C_//i4CX> f厽ݫ7(gNKu&&&œ)LLr_]B(?PɸtшSH篡ꇏjZ(L{XӌղG*vS} ,2\8Mx+ݕ*C%lh&oP$ #bjsF_N1O{hB"nZ|F$iI$g'1YA˛8#[8<͝H5]*ϕ;ȐtX)鰦Sݩq=0BFhkx:aM TB!O#eE&3҅\va1[HQAR8,͂9ٽU oHwF=r:cIgo#aL~chh{Q{%X^,~>Qxt3n݌E0199V]uo$Nǚ:r[O_Nmx@z V28gɷx"@+> 싋eOGLÒO>D ˩Ӌpc{vP/;/t7L΄)P&ڵ5ml-n3/v,K?$?x1x&&&YJ WXYI$3cM8w:_=%iq.Ė3z$ƃW11VL>{XTi)ZAl6a 8r;UTKquwᳵ>c%~V̪^Jrv)hd w wL\>_g{(qYqHVnn{EpRu*;UEfkCZZo@JCf/7Wv٘5=ϛȥLbt'幔kcLҥ#y )29L^Ckh}~ƨ6(4!QP*lN6)D>%L*LoVO/'7;~_3`brRZʶ]$ XSFP, _2Z_KUFOgBbtpӶj |<YLW;g\j:Tx`XxB?I2pfn_qF5~ <ЭDqD+lݯgq+D4f6+ԅh #ZʀpX=Ml\'rBbKb_~S%)-KuO'$לB\/_K;iziЃ詉wS&Kk㘁l ~*v.XYHiY+iN<%!&&&g.添Y7Knv \uV]cV8ڿ^W59EduրFkZx{wEEJ}9*}0= bipxh'Q=0֨YtY%\V3.ccM?G~% g[{CmQ[ed& L)q4xU7y,0U*q]B vղcOvrX/yw>%.`&LLBvHYK%_>%~SYBWR ˾O=MfL9[݈N}Y`8X7 ס9X ʯ͢9vM-Ps 0ޏ":?~JOdn8\빎"{˛ԗ5 "x$ ]ב"=9Zw"98 [[B@bJLʙ NS;jmzeW*CTtBjdaQ^cba2^1> IǺM44E'S%u]tN G($AR&/dɂ\Sd 1&&g!Ͻ\](^rbo܈7E}wLyM/Ўwvcnaԗ<ё4"YDg_ZC%m1,N`у>TmX ݹɋ'-խsAuO9jhFjaχx3ϛ6Oe؄a?eh9 Hˬȵ"Ʒi fuW*BvjN  x\r$>y,Y;7)#<01q4= շH|kZFK RU㡡6*:HIC,_Goˊb@f,wJsǾܒ$TFC{uG)L$7{PMέ յFU vw 09_ngVoGð&4jXdyfPj]#}K%S_imppazwaw;~} o^b99;-խTeY=U*&'LEbi6Y]ժ0Zx}д޹@Uu<^Er-si$'93Ⱥ*[%K8Gjq˙$I\ˎWiݎ@ M$?7|&&&&cZ419_dط霖8{\(d&njnJ?> #{G'w՛JN^:M7$X2%/*vC˜sr- 4ˉ.ү^:^O댢r&)pɲHX2.LJeʤTb|37119)&&g/vo@Y"vrqYt/D__Z նRqσtm/'^y԰R "m񖀙B pO]V/vk]:3:v7NBA86]-$`㐤A&&&&,bˎ*;nw/*Xxlk:=(󏽻vC_ ǶQpޔ~b q7R0??eOmX3<)9 8xu (w&q= [/?te jpٙu4߳_^ݞ:7ʟH 3W5m\$)B!mj7^|Ű5ܓ93Ph󻉉8cML:;ύb*u~vV^ jBׯFþ jGHvӻܳCqFwߵ楜8+ 4U򱽠$!{}2{0$ h IY^W'se~D)W/9I#<UG &&&&35ibr~sedUHe% }$dz9Qh}~vcXR奒h%h?\9{g$` /.c3h AQPG7!#,O]$ʛC+bUSS̩݈N;:"j?s{X{<磔tM5KpX:D`i8DDӱmT3tb%ɱ03׎.v4 slb;Aҳ#Gt\%:~HTO"aŌS4 ,m7,Os ;H$d Ą܆Qj4흪{Dy< F@$>_@m[A bUP>1~Y AD5,!7^7%r^nDm`gc(/M߹z:`yԕ6:&**8R$]i>ڣH6yvt]UU'KTb2g36EI.*s/U}NMo( >HV䀉ɩL5trhKE 2N",|`)IΧe{ʉuψ]p. ㎋{8?a[/BniVA8zc[z.Lk;xX0j];+jU"WFyU>F;kf{?cz;xkػtWO OKNB0)ɜs1EtxxCמd(QU 4ttS}"n;=Y$НUwrC${~1^whu0kbbbrj1go%MwQ_6 >JJ4@vH\R]wWOcU(n˦p/qq6/K^tU)tn;1(dLgnx\įvA~mM!%f+XiRU[[ݿB$res? plJհ~ s-;m\qu@ 7P 5͛b뺼01191&&gmm6W:E#"f.ɸM&A kF$wm=BF3U Vꥐo$bh=$exϷ]]l ֌4eΉgR9Qۥ;x"vQ]: \ W/ۖ]gޡ3?5N薙84Y]\Km|7uQ'6p)Ә9]ƺ,Y`bbrbMLpTUgͺcQ$7qNѨF5=kzb][s_8Z߫/?6p-pZع=EmffDUglgmuD>ۘscXl\IQ=گ^şX1;]y#QY6H=,*2F;QbF#,fޘ_71#>#7 Qҍȸ,nW v<ѕ nĥ}DCG)N=f$e~"I~^'xU?Lg<;(au=Jt,ML_lYCS[=I½dY!hgpM Iv>ɕE~G7'WAAa1ÁZxn,ʴa1ܧ/$&q]q:Ut슄,E?8oUJZ"Qɠ>[X~Ӣq]NrV"})*נT SXvBιa3rzkk],ʲ1O IngZۤ?B{w /@8 L;E#;4_{Ļhʢiq2XGgW9]x'Cg!/g}0±fx l;snXONC~,,I@K!5LTuۺF/3bՇ?bUXxf?-{ "}ZD갲Cȟ3nߵ舺aЎ,}?[&& Or rKWo%@C½ǤS;1F4$yς--JL7 Ǣ- N3'A!-oͽ=EI1V޼9=-u"ׁplHqÔL(JZN zp^ŴK xXQ7$6-~o>|?NrvGYz݂q bwXy2\Oo婟@^?])Y}oɩ719y{4dتl ]eN[OQbX+VY3s]t}*Euꈀ?m>av L#S MNUTYbBOI<Ϯ#?;P7.GOx_;YGȠ*8J$lZ M޲x ̭N~holaHX-Y`bbrzb&LLP;lVe$]tϩ$TBkл?{u?gfAwnUUlٖ{o8vzn'{s&Nn)nq{mI%KV_I}eoѧ`HK|B9o 5w4𮭡L@c5o?]]+x d\(%:?~͇!޺qQ(tRܳ&0ETR"Z޲cnzR|M5!=w!ȗKixxx,Oc7M5+?]њ^XhΓڠƿS2EA=M5\oziK6yFσq%Ʉc!{_ -G;A:>XOߚ!7 N1* ]v]/==#எ* X:CQ5dr qݖ=_2) 4< A[5T_Z$0[Y7^h^>ȓnӜ; IJlWWhid bhC)q%l5g]wm @=KJƖ|`753/4AFow]p "+;b{RGGlR{njD *Zr$B(@u@cUh17Y?ybϖT }.ofU3__?{SSgLp򙳼ïbFgR9>|8-㴓R=SvxkaqR?: Ȩ/=<3rE8*(ຒؕqe9</O<'`ύoױj{%[zݣ|ϾCnҹ\:8xqOF}}T9wv_ֶ4uAzTH G3خ$d^*aKe.郝2JZb ROx/cS]$3-X9z*tA'37#y%UF65ܸD>+y"5Yuqqlo=wqY(ҕ&k qy/"f D=<<#cǻJ 7̺1|f}IȏdIʒ ~/j;) I?fZL4] w/?o"R#xM|_Gu;<}Hf zAss$ClBbz<˿!H~!1u'嚆qe;ƒK|5s+\с0tۗWdzs LRDO[;#[Bʥ)'Ƹ?CdG='.5ޗ>uPUbG/`б_wO{Fo~}qc!&Æ|=<*h1% ޳-7q$:zL!./cL*Q&nl4UHnS:iKrxb[k{"Kqː!Xc4tI!+]pO>css_K@li==_ǑǎHMfq]膎 bUmjwMoKjQ!s|gL wo Qfxż%Ge|D<`(ZOn=) I+~MV7B`m3|5ߕʴcqW #,Jz$Hp^*| ѝk=݇W€[7xPư6/*Hೇ&K)8?·<'W^«>t71a yvl;V΢D?]C &ɥDjTGJ 6moR=ا!ֶmAS𘝼#})eDŧ nj/!ZtI*Rbgt?ZЏ o!Wځl4}9GE +$fEƥ\ٵwFJ#{grmQ߹.%eJ~qBlWA GggO]c6m_Ǖ ^+m~o?w=|mэk(UfՒC|L"ܧ=aiY&XSMӓrO<ؕ'kK|v?~OxJ`U4KJ#qqLg,yas@MCѢ!Wݻ]CM[ЫwZf^]~Jض1GqF$hDQWQy@@n$0ֺ6?6Kұ PI/r5c~wn /4!W2қÿ~೜|,/ҕ|]rOaVUtz=c5ywGL-낗WN=vgr {H1/ .|}_>З%nvr]j3lwym+,=s1WJ#Y8]T_lR7n9r<Ύ#6Q>s(C\㊡J.$(RSXW/5b#u%1~_?/^1#pVhj3?>~s1K ^.ȝk&5#Q˟>1ۿ7! WBmsI)S@YRf;Üqp]!=x|JwSy!t$xxx,/ cd4;I!Ԣg]EVނ5h:>L_Zjߗӯ% 6'|$>#lME\TB:Aͥ'"Dz*]+Dz[=¿?6J\ w$wUS5OH$Yo{t܋9I, ht٤Ƕ:,y2ˋ)&sx g[Cv߽Vݾ_`yNRJ=xϿ?9ڛ)ko1ОQ@4 /c,>/:lVUeS4O/}iIjZnE:.f:bҘ,v>mZHW?EL;J[O>:Z~'7n^n;]ESLjfC+y2<<.7əLY۩JdF-~$gqW7YٟK2؈OclL|7NГП>ZNlN4eX6d\pg;Ef;$`8C~SiyKo@3zR_+f0Z%xxx'/~ӝは/&AMukwpxٹiRu%ic9{0̓˓1̓Lk%85jBhؾwJF.Tdpino6;s\A~Ά)F^:ͭ~w:H|o<`SΛ7xӦGcX1 IK2qHjl5TkmaX;_^ĚcAcH#g@]3v g6_;'t9wj(~B_yh cSoٽp@!-"BsksFd d$d#9 XM_MnŨ_x\!>sHIHp2|(k T+C(}M0>͖շP͖`y`>C.exx4oCNVPXܬ菞KFg[ok%iK͓Y>u0é#%;o{Z^+GJ2ќ;#+ wy'In:CMłlnwfn|b 7(J:.|ߤhOk@sDD?p[RW+TOJ@gN`O?Wf,%|~1CVZ>*~'E|Sf+~~M1b ZֈF@PĈ́!qIgVgcaYȄm3RҴ{]<*_\ o0Y ޻=̻y\:^oqߙ<{|{[W $t!hZ#+I.9[u hbmp6asyOڸ;:. :GUŶ6zV5.:;??dG 5[ >tMu3,^32;}Ү0o"/<6bG`0[Ihh: cZ$-UJh9ʡJm0_}92<z50fs!w"QPWNڣt"gGM;O&)sҸs ]\"!$H?ȩXLYG]9O'}5*yFmt!B~m |\7|XP{ktCCO%KjlhinmW%sqjO HKbh|P-8rbx(f-1]Iƒ8R9lW9r6R6%YG2%cX^$i%@t\HY.4^J9CXaܯ~/}無sw5R;\E;BOwdvŖr_D?'F1ƽƵQv7?wy\/LIڒ j{y [79xLFr.KRGBgYXd 05VQǚ]4m qSt@j85SA->>;¶z΅ i2{+)90h399lV,r"$5^*/ ssفg =uBha;%} Jgax'DO'@ "o^Knw{43-))^k{KT.m|Wu^Y1Gs.x1dI;ӗSi*-u>v5h4#U#32].c-&&lR+O?;#`ӧP\2M(hF83g>.iϿ+kZ #pj`R.ڛ7562ɋ},C dLGU_uA^*XzRLd߀}Xem,([RTi݆ o^ۯözeHXCYCC?<6Yk9|cʀiNŝ)0GU4__[-5v6OcI<EOmypFӵP%mhobO>@K+GB[.ǗV:ns3|P @-;C>ADtڣ:ku6tTFtڢ:Y˩9G2q99j{"+ƆQם"']VARb &%Es em WP00pJ4a~qg>נ&Z?<8>'zL3Ϫݫ|M >+g𨜨O-ld$+ i.xa^#6㖭l)f *fob{Gا'zL:АEo!kOԒZ4ACHco7n U~Zg?)$Ҽ0`aN[ !TGiٻ국 .7F(@öun ѳdNeN:3IEO{h7Pu6 |M5%lf4e{خo{1h6m1>xMv,FlR[2U֎)S]CA ʫb~AmP!Qhԅ* fu*UXil܀߯O,h=]w;zaӜdgG"~Xm5*b!ػGkRP1/wNgy"}QxoT39q:plАŧehk5zy=*ǯ Z"FΆ˚+;$=i<:rr$2q\9d :{OpzTPAVr%./ _W& >8O#h*34UU4>h&c܋b,|ngW+G3TW2ϒ==??|NE0{֌(ʾmSm Ƙ3UHsgc#6OεM>^V?9o=V6.h4%)#l YK&kuAMP&wV#e#:F)ty|<N_ZBUœt>,ѱۄѼ{3{,%aNt9?NtˌO=ӌW?6<X9 h2Tr%; .*x %@G $rJJPW}^ҟqM)'ωQ|ҡ?0Xrf"2TkcSZȨtɿHnLil UӸs-eK?sh #'1zft\4X\Z|kT6kn 90.]ȼ9#@:.8HSOM-[r8*еƒ[nX~ŷn_t¦>4w; 6l1x9G2uɂw(2s1])s\ h\E'oqܿUzŹxk#;[̏\gn/ sxx@15]FM.igUoTxR^P=a$g`4 3Ra?c€ŚXW A4+25uUxiKrpg&O80`w\cok ^jiQzZ.m-Zqq$EkK@ħVJzR.}ie蟎;sκ$*} }u*kݍOLGy{:ˁA\dj>`m[R ?{vW,Rp%x]$R9YBZj'igt TT s&sxIt >VB[;TM~q1/c-u5!Rd,cLnl4u-sk5-IV|VN-I[.)K &~Ph\IVQND C*GqQ b?!03ݱ0bkrxH0h(wRY1t!|8f; 5! U\s(Oԇ4Zt45U{CJ i,l Cq! KOڒ\'N99js>i3d,IΑ驡S4BZfM@-s};:\= ˕y8:S;Di~ZZ#EK_&)9"#zM+z/(8HlrdDO3ه}ZJ"W# 9͇]]dJ[k#*(RXA2LG-s CSN-ͻ g]Fs.c,8D^)N]r6Rbh>~~6jcXFx\l2gȞ{g]S[T~$!XߨG!cr#!w?Db`UU:/A6*MӄRM~>tMlѰ~k<]x$ҟvx‘. ƪF{T- ՋV ZAIV#h0gGWY\ gUpbTR5&J2fL߯ j4Tg-u[ E-fӖ2>gs$X kA״Rqآq nE"4fb eDhľ0̅2]oG}:~D^88dq}XJ4Z!XWL*:yJThXTx5-Z.I4mH>~d(߀J9E4C>?Ss@<3<_ eJ+U:J?^f &{|g'N9:bџVFHʒT=0*+DTCrh3!+džtA/).Z*%p$\3.]IUy|Tܡ70fN^bh]SԘۣ:c:[j UFu@[.w92l`WWDi-Yׯ.X:(uWS_$t2 vfirԼZA?5ک߶`m%Z 0hZ&?JHWe_un jYJU/Rz!IW`J+* CK@BЃxSR3fvh^kt b,a,qLBT$g+!cH7Nfiki Anj/(WQQ5o[Ռ e]z**ٓR1x%eJLTk9 9ŕR*&TqЦc6 *~A'0 Wd]m*- j4&5yx\,3^5/$IK&ZHsmÆ \4nwJpƑn,Wb[9yU#)j[֖P*5#A_kTO3 }i-W p OSWpWmM@]P1h44=exTF%kKRI9g\sT:S][rNW^քNI!ֈ*b5Q9)S]P}JSCN!C`h* p,-G⢌b .Ʒ uC^o:b& WZ{P~_t.fL4u\Uօr bӅLӅCQσ¨ NM w …5Dl!%SK[cK[.N  K<ϩ糶$Hlq}(eRe_PƚΆXcijKEOL~ܕ^;\ ! TG[L#t)eeY \Ti׶Qqز5I>$T_=5:-m/r8x0thҤs0WQWmiu5Tl{I5a jċxC>a?d-YqĒ9ܼE}SfׄjQ{ehĂU0Rc90˕ f%<\wt#Ze&_To-: cy%I9ڳ \ӖĖ`Ֆ;eJ2T[hk v51+xv1.!&sZ EU]-/ b hcڿńqk9QPB]p͆C9)lW>79js3,~1hciB r>6Q)wtqY7r<*^W.z%0ɉShhi謫֩ h45|/:YwuȸX,Ft(fV5}:c:|`b_-#%JlgƱ,qF4]'@-y0;g$c\u 똛j Ǖ+axLe,C|O_C})FsZO}xOƖ<js\mxGj5{h[; mj[J=W 64.E߂D:Z0V΀DvF[AeԨ4s&b*Bq]}+һ jauͭS[Ω--D{mW?' F)NZE}<(zn!T.G[Mw\ b09Ē,h&Lh ;Yk,IQf_4K/~_'']dz򾂉,ǭtsMnȗz!Tv@eB,hMFSX45Z"_' h $b}}CTTa$'{BChzG:JkKS6ӷ i~Z- h(1B3?Fv8ATmC~ ѱy,XhDž @}9z\4۬ZGuB+)0blОM{RvȳMD>pa̔_%m+q8fەlr0qöXSgPQ-FՋ]Ωb6kqCECBk:۝"pT&:(f:+~}TBa.(dL8tm͑O+k@SE@-!ڀFsX'VV,Elz6?px`T*:(# `Dꫩjo`MrV:_Ad/l(타ar}]\ښvŋlv97f98SҟTA_4RLU{eIwKm ?fm[^}QmmYCRܣϳdz1Vd/yd@ t6և՛y%x7eț0WQ>][;4N1VNbw7o\vxEȇͳ tN,t h<~w̩]k橿G[?iڜe?=___ *C mipם7WV47϶:ueR]89>j| 6GmFr' 5PD#Xe'R=DWoEϠf];lZYHM)~ CGNn 4mkiesf2Ù`M]w{۫/K`c;DC|+ ) /̛wSCYI .WvEx U~oT)^N߈g_ Ǧ;XԿ=LT/k~<:wSL yL "+Ud7 r0\בS&8H+OZB ACRkǵM~6Ee*ᱜq$ d΍98h|Ł!ތ˘)1m/ t:m7 #W\H)IwQcg J!Obg+k6ع)bu=M͆"Mu´ߴ=k%u~4ǟ?xΞ*ګSGDK{Kނѕiv{k|{'xxYUޑ<ӫT?7=::exW24]>PU|;]=yk럧rѧΝ X^9SB a!q9E!HQ=XhsJgs:j :t:t=yMgdȰلMКpr9GY5@r%]iz.H:)œT/{/0I*+ؙ7gгc >G|2&CN,{,;H!o(iAM#AGԂU -tiΪ* 5uVtZ*{c92u, .p!0sIӑ!B2 -NWOihIe^KW2$OVofIӢ庭k JUa״0x-y䅁q@pC ޡ9+r>ٕ`߅1>L_vpP{w(ῼudQ04]jG'.܅1L $D&15 l>/ j':5BʈOgY4:Db0elIoА979w<Bck*ollF靱 /eطkz iRYrDFd NyaS 6΁4ЄRpQuV4u:U=(L5!jVaC#d@'P+MzPl[ ]t`D&82@.}i#6] 3 9$\V§$}|k+7ؓ=0h"8Ћ$>>N!?lkEV3me UeȚYDZǥ ΁*+hGu(*ծ0dbA̿k=.iK٪.;ROmy۪=h 7ubAkC|:ƲKΥs㬪S?DZ39LePjCjq]>k,K'\EQB 53ZXrKLf|=+yc Zn,YEVRCS\|<5œF/\i ̹1 n{#J?M@[@SL\$;[lwPocCΒ.%3^ɞu+ms\ H~ԏc &ʣ';ak}Ύv?MSXu:`;pzPzT&`S*CWu){Ϟ#7YEJPH?SB/*c T¹B ,߽s5CJR$e269;k4˩,Yd,RygN܉gUjzk0'P5sA,! ja,jD}Jǯ6Az^OMl"oAC4AM`%B)ʹt%`WХm$"wRyLG i yGBvqn]r<:?sɹd,It;5VU"7 :#l^UږZh \Ƨk غJ8xUJ@J}4l[k\DknovBwM{*Pײ{GUVH4< %dvs{q;ۘDG2.sͫ7T_(Pr_e'^*~U3Bw#iΎdXYvq')%x㪾 OoE#4BB~QNuOMʝam'w/Z]U2&np4VAk5\)k}s+6ӡ:@Gukڪ))Ejsuz8KhMtY.v!m<{Rǂ9&ةc`K'7N2p }M+١ x ']^҅ mhJ0Ak ( Ttr Hr' *[~|U;.FU+*|>VPܜIP?|HB@/!A_AڪYRESMBDiw_|@OBuߨ `k .)Ӻdq14 OݦkkUUfD EsG0Bb~`M)*;dyL2k}kk..?cY3'2ʐ]>r6m4EKj)FW_.=mUi{9ҝ32J[I乐1HdLD\J|Xl18T19V48 ]=W4hu^"x-uoQyO??qد#pj04aq%/\2T;wnȂ:Xc9Df0e1X ,R&#\*&մ`9*֝LI٘en皁oXНR'VU0=Eu!ДPyרkBJ(D}F8"hڪ5!kBǂ4T o   mɌػdLѴ*vԬZJʛ,N޼$)%BԔrQܧۮW+ `st?u_8H"!PS59;'O2| Yf0 _&jig[7o y4wfp\cDmhw%y̎m+`X!66m&qےʫldFJ.na_t gZg(mSP(D cYq)űu]\w*h5&\=y$Є@5AM~nmO{T+)U_޹E<9A?7\[';B"=ɰO^$sȞIfϐËJxhW<^Ѡ;(;v\H }{)Jo{ȩ4&xf(m2UHF=69/s%|E{WʘL=Y..}cW2O  B>"!uUho*E㾶`W~!5Q?m5J$d‰#36Z:vJ\(#'aef)@]^w ܹYEP /_~;hH@_ X|>~+G'}c6b&qum~cǎ;l޼_ޤUp ~Є שtTl޶}ZXH c_ET=6dT1zଯO={gE¨J5@)f%r5HuPME5$)!d-6FPZ$ U`"Y.+(oyqDA֕wRJ4ME](!G&/i&Vh)`V[ij`VLt C O:6&HCu1J:  "ANoXP\ DC>n3Gf5jv鸳/v6.vx-D+%_Ϊ͒tܺ=,F0#;'>,mD|_??ʏL'gk}-wmU5^?Yl2ʯ rS !Vܱ³?XiH t{W͵"ҫݤs]僯&LJJDBV#o*Jjqq ΜegG|u? ! hh (\)LEYi;JNjoҧ#%Y.89<8n(B!n&83ݷ, ۶qgJahF.⪔&}BMԏߧJ>5t_G2~ q]I;>q  lGm+#v&[J~p sB᱓$$_,|mݪʻB}vg"$~@,B˵[VPqgY{j 9|5)>u0M.L|s\Hs=\RZjP B/)bap뭷R[[oŲ,>L!&_&{^c-=7lm1 %u&,Z?<0 % J%[Mpݚ3ljgΚ(g7[2ڸj% ٌO{"'Ɩc#6>]X:vk!}&Y %^ BπM]?z?7~3,dgx㤞=It_5.~\ cB(mPYB~eyÃVis88%'YNN'P:qh q? ׅ++5x.:C8uB?:s$Y~jUb;+bMz!Ώb> pe]~Yq"[~]{#H+ՌDiy6²"Sǒ~(f Nƪ謄P+P+M~'?aYzӤ[\4sXF7_p*u9 t^JVE? wBg! R$ E!m&=]h{-w'P_g0i%Bp&2|"En4yZriAR *MY#˅r*h|*">!l{M$j>,}#7DXz] %<| wW ^WbJD"QҸN}E-u``#ǁAX!^sY/yn3@u@oA4NW69cF|mD-b/ɉ>>jK%JX/x!ج<!Ƀ'/,Bk"dLbAqIy{ eƽDVuѨqX6ycCAZaw0`ʷ ;{Ht,0*xaO*ʺ# ~"Y9ڠ/ J8~>>qP E!S4MLst.ɋu<rq{F.Rq > _|~O3ϖ\߭|uus>i; |Asz|wO^(:ƕ?6oL5 Opz(:f-E* Ģe+ɿAud,kJ*+%Ŧy\4-ua^Pm9RƱ@>B^d7W1Z:.12;\>YZ6NbVl̺ps oţ~aCpת$^.Hk&g<9c=J`yKh4&8Y@0>{"Dža~WA?/߲][7ʖ6r[":o6/ LIo%k--Yf@ jA{Ѥ,DSP}qQ#SkqYH*cACʏ3q^y5WF^ wt8z,-&xçJgd텑teeI!P'b"!| B o2 ]6-I5Lep&NXlj°IemU@.dYZ߾ײHfɢ([8Kq!Lqhnk-sgՇ4:tΕ(pd0zLC)/L ";͆6mސ:bpBzJL,eGנaʏoF=)|J)r Q~17T @ƄΕ6P /GNcTeAJѱa^I]‹ZJč0gA1Em\Jt4Fi{s2Džإ> M:.`grX,١8#ddXr4̚8YZaUҕtmnHX+geq,ps˻gs3]~>v7VHINUGcRȘ x,[J V1%,ec'_WN}Z鋸s,;\W}#nRX Qh]γ`ɯ^:o_Q/߼6KWJ}DŽPUۗRTB.Pk-=J`y2aY|심WfNunq6MMeΏ@p_$r-5aX[Y7нt%CN3v~`5X}H?Ƀi2;A]A>ڊ lP`Zo/w2K֚ԗR.@7-ѵt4Og8tJV eJNLOFt*Z7XvF^X<RPB z,[r6iq?R)F?,/H9!!l(+]USn@rʶw{c}Uͺ >١/55XGeޟ4 }U `4|Ea$ociOiPו^pIEo7Q7K,e‚__lWZ"%3(;c 8.䜩q8rmso߽.J??/P =.SV#oy"+I@ 0X0ʛO`ٶ`9 R<7<2KK-DV,">l7חgoq87jDzޥ,GEH e#ԣdYOhnyT/e^2c:#gnt\x ܵz}ܶ YCWcoRC tMuA[,@s]QU)q^Nb %'*wN-]kWʳ:Oֵ"4/qBt ;:ڞ7%07+#94]$njk1ף@T˞δ0ͽ~•f" 9.'RX˶XѠB@SmH)!wi|5 OWeBC@U0Ϗӏq }u!Ws{[ 0tAԯH ͕}Eeu-5;U 9]4l_tUJeDWt ڪt][j0]L~'%S"A]P<.DdeMX~F/ .8 ZVŊkb8 Q|`rJ[9_.$$t :!xBK~CcusOTN[.vXIm$^!ȭm~`@ ?` mr Q"jtZ.r/_B޴Sʈǯ@^T6ND4K@ەН^ aJuFʹ eG*~t]FNnj4ߥ[&:{x밠.m sGGJvGpvpۺ:D:#˧sFh0>.c,Ҧ#'%aRT_Yו9Nb'?Fp;g.ΘKQ*S 2w^Iv֔:3fD =᭛C4# Twc O&y,2Z)Eg0R\ZJ9cҞ 0fd=-ܰ0s+vҘ;mNɣgFguܼ<3C}Z:S--s_[T0x`M]X8@vjQ#7Tqk):|x-3jGc[xVc iq9a1H.X.˦3Ȓ#߲A8vuoiA/䔋'}14kO<S8/uIlL߱LRL|{2{5ܤmSnTg;N9mǛ$ZuʙǮAxZ^)~c߸?ÏEҔЀwl /(@`smЗv96blŁASqK֖X.kԿ+粬hz e:{$,)Xϖ>aSKF A|adM44B ^[LH s]y`%wIےKֆb:wx'l  1<9R^&\ZBʦzc :J"lkqԲ'?LmT^b@uiLFbKǚ*=ى~e`\šԬq9_:3j]Yt4qJg)2Cq-v)eaFO_@lmՁֿSy]yNm2.;X;_ҍ45NJ&wf캮 -)Lr]`2 ҩ.eb)C校:}6Gj~3C YNs )73?za=(UیMj.^xc{f$Y3wܰ8'4mW?n mMSgmƿC-8\)yH?+K¯ *5tmḄ-X dMd2)>CCoȕrs]m( 8)QlWb27ՆuG }c3ŃIKr*D3u ֖u)#TYIe)er}H}#3R<əܓe% ϧJw0wŝh0Dڤw8=kh =AJu}KYAᏅɍ&KnOv`g؝)%'1rel~>9Bblo?܈fQ)a4%Aנ v\aX;#C0¿(%,,[")#s"֋!u-"_ȒnTĂxZX_GON\%>!x Z":k#M>6l3^ʿx#/9e%k_0q/*@(8p]TT-_Ĕֶ~;L&t7]HZ0vpaΣ AP_\YSYmFSX#Z^~ΞjYʯci p]ɑK|Q˃PW @q4uy"i  s)x|ߢѬtL$} 1e  Mjb^C 7J9J(tV5Rr&g33$*WeL %/v$Ε(? 3G,8ַt!f-pLͫ>U2Mu=;dz94t! P]n젲H #IUqaTE@GN[S MJ L1DJxׅ yƿ´{H ,bA_h;s[b\dxشS"ԇSԯ޹>uUH3 BYپ%sw+ѐxjQJ0C4Ln{IcgsDG2|gT@4! k^_ϭ;[sw+:j2-J,z ;L+ue슱I*ȚG< v°3=ghYՇ}ҍmuw QF3E(_YL,H*/Ɂb@pNUXj|LMxVs)2yR[D}3 rw9v%/yM5;Z"<{Jx ձ0JFѥS݉oZcX[zgnMPjVJdq, iTi!O_LT05G:.{ EV3tOgUS m1^4eU-5ʣ(FJ {\|P_}yϯJi'3Ծ|k/mu-m kClh."Y!5M^Ϳ"Ri{˘X;yzN eA{xviEx)*n X/+"~!,+\mkj/]^tMYm)a4Mo( <J:hpNO{pnXEJrNHe9;pDC>ʓfMdx:ʋ]¤hfeczYZHy?FL>C&>uM{665FCuh4/uT+ξ$/TwS Ҍmbh%*,'(/<  C>|lm s;Z )Vؕ 7U i04vDn_4?== sl Mt& ^"S2Lަw$s9%]םW벢`Ǖ%_fGi޲O*)41<oZÿ| % Gzͥ/YXq VG KcA#EUm]AG& UzoixV5E R(H K=c@m< %ёt}xjDJB_q3նm8NEur]vI,YNƒ'iAFk a^ײ)LupbLPUHjt<@xVj+OcO[{ڪV=@O%x3΅xdӑAm5%jqWwv\F.Oˍ^Bɲ,,˚ޯH]ױmY/%x)̭k%p΍1Z[:Mx-Us-ԅIfE%J0Wb(*uM> d%'3!O;Б3 9]A iر;M躎/?oDz`zw\9y F*qkXV=MӈD"[;35kxfttt84gϞe ۲J.=wulI(x|v RJåSwTn)v&͛W'{h D3lkl6;uGH1q<9!rBTuϬ @J5K>]) iZIt&e7 m!#VIxwW;o (hQ+%GFۿ޶g˔V%>743K21&\ :#5ehm}*ܗR գ& (ni\)97g<_` VMZm۶m6 u<[n"orϛNdJK?0puqIFGGr /_fhhd29+GPn)$'5|">o^drrsαsNsIĈ1_#~TLL\/xL'bYVA4!BPI_rIQs{;CÜ/S)xdkFT?BԔ`v )<1XpZjMT3*溮s]w͛3222;)%`._5$30YߒjzI/?`׮]lٲyvK/~N8]bD /hiΎ;p]X,ǎ… 8bBzR)hJ=zm>̎;*O%LvDc3m)t繵8albDԽJ!J)%a,x#qN '0b8ES/($3\!k,!'X,F$Riy -ujcYzq2"2^ܲ5#qx$_8}T*_>:+tRhzVEסY՚ԹjD>8qqT!͛ٵk|;ou]?~|v^ dllۿe_`0H,L&Kɚvښ An֭[I&:uCR\"[3"#ojj#G_1ákӕj^gfIߜF-|hz+Xy<_>2hߵҩAo?dTAGD,xb2~m~nVUMBה,q-4|޵ʏpgǹ|27o.ֲZ]+ےuU)Juѩs}_=xHfl|"vb4 kײw^6mT|]^Ν;7RH$8z(ǎ]ZLkk+ׯ_qn6v]w_z`) 3 :mŋlڴ`X,FK=zJ <N&OYD,* BqjSw\kΏ/sjE^_~6wV]GD8b,WF^@zxK\Da>t!D{B@$w߿vvbޙlۦ L8W`2sӴS#wY4ډa[WΤEî]蘷V4MdttR­eǣzPWStƕ׾N2iϗ.gϞ%G c ]{ *8K(wpM:ͳ&?=|dՕ?u52( ==&"aVۅ(y[ok<&?kuMOg߻{vt+Mh 79u]KJY25QSjmM. O* PgE<6 #YYiw͎;ѦJ6oOY0?0G[&[שr)! 2LNNL& G?;_$=չrZoRgX f-8.$׹|Q>3287 C[^59,̕hMeu#:#LFI©!̓C%OZĝKϝ{_)b,- à|;vtZ 4M;  +Wۦ/'<-[[P7TBJz^%eҼLfvJC-uAw~iûLeBK (u5( 6ܻAeCGSPuKI:/ x ɡ*h`A*L],G"\uO,iqn`ܿ 'BPClj%r@[3[\ۿ:fh"ݛ|Lϥ?ݻwQ~KA֭[Yv-Oȑ#\rd2mha466fvڵk!ǭyEfGr$304^XCs,I{NLNNԤƘFMYY,g^5ߤ!t'.9-ҋ4͂H+%4>,QK!3S IrДj g`PA^J8?+%Z ᯾}t)Q ݊"b[ٻjJ!ضM4`eY%uH`:2s}AE"% àeųn=@ k; ͯZ_`i8* X"t6ԣ7Y{zpT>[OO-t!pj40A>]S65Qybk2 ?8)_,Х]7VHg8nl1eh0u\吸gCr$2*⛆@u$Vrw+p\ "L߸qoӗ9r~% pwr=pur]6 UurbHuO=Ec)%s5-[F*=Ѽہ |eċ(Raגqnu8; ɢ~ \WBuX^8fn gC+CE8?J (3 ]Y^S؊b%ˤ%N:qjVd}NqH=q?(G΍5v<@kkmDNfԍ:K:: {RJfwrqa0ZϴQ&FjOEbu]/N,^gebMSQW*Gfbyr$p<T6k*Δ٠2^S=]FbPXms"IבRuxޒZ!DGo]r(V6 $G/L+ev|>vɧ?i>׍ WT@:l_oS!2X,F*[èdJ8;`<^ ]82^teqSؾ*5R,㕋..Dq)kͪW7~8*Z.G"K)+&:.ZB2BȩJXijfsH/.u+p\5R%U[H=L$$#8qqhRAWW?Noo5:1US )U?QES_f4a޺u+͕wJej`RF\e8rEQgmg}[]AJCX\0 !VPNUHz LCI9*e dm+RPE8,寂= 5Kp]8_S\NϤ|^oIٍ@06LQ=|a3[$*0 '?eowrs!ӀuJNJR0GqCN-"P{oIdDVL$W x_h/({/WJF%!^ߒ5[H"1+S-VuRurCm{e׮]ycJ}8c x<Rm ̕Cxu _lǩM$xzHWZE\+juW >B Yޯ,$ڍM]ܻ|H b XXv}'x/k6>.[W\A8*ȾyT<خJ԰!Xٝd8rȵ9`谦MX2R$$_:!RLΥAuSlGo]OÙa5OV)a*}Way ַ?HGT #m!*k&8\{=k*N)ge5*D%CJm0Te5'/Ma][S9%B.7{BT dmn ӉVDMβӋ[Veua8⋜;w _gzh,#.xU8#s%;0z_ROrAJUnqʸRΗ*0twu70߹z:iZt4!ʖvmש+:n1v75VP+huM& Ӯt*+8r>y ?}~ZJxzSW*8 ]qX 1t|"Iu|ZMMM%΁d]ͲgEngU&w;gCwo'TԪ4/~G\w#au4gR)拦-h Qř. Bȏa /&&2H z%] ]< cq0Uihzm?vnVI,^.=|Hd]YlMCo}O- hJdM;{1\3UH[ǕU? ._{r5hm3QN~0Z>E+=SBdhh(Nfgh /R8:s kWg%ajÈc ݾr`:99En6z!ZZoQnêvhu@J ,֠b J=A9۶m[րJ5SZ/wUlڪ TqjHUS5_/skz" -~l654K qm|Ư}p;M2+輭2W98U6젶yT4]),uH5^Sc.n;JJ21}ˆⶭsc@:[1u0u5k?ywn*12 :K/TPZGqsdjS7uB2Βh rfB=s[ω\긪D Q==Rn BsPe ۊqd$ԜN4=ORR态(*ud2[EtŔ8*,dlxET SFI ˕lSo!ػy hA|m:͇_÷T.}c* V<㯮keZh.LQk?!*ރpTh;R*}2tNscDZSHO0sގwC-q]1osAn6S6Vwhz۠9\7,L.ƴ:4͒{NqiLɷ?^Le.m6m)?새!3UDf+j20TV]닌y =['{+Y{AE֠(ȈmKv^ה?pq^4hxH3N͚W&U~s&MW,G_9];Taw6JXKbi.yk޶~ F^oA./ˆ* \4!t e]#^0SPJJ66'7..҉r+W000ٻw/===e@onlu@Jz*r4[LO\H~^#kA>'S5I[JZe{ zU?G7"QiVhREbil&X_|hxlaot$0|Oe;ZlƲ,]Ve#,>@r8ɓHWR"~h`njJ-8S/sK Ow\ܰ.7t7 S|<ZVG'XNXq #OWPf;.g}06]-B.f^eZj Iq~mYn7op8\fu-PTG* C"3w2 t`dخd,eGg|d-͗9= e-CLJ5e0CtM~r4 Q?9R5wV`zM[Jua V[[Y^ްdU zI޲. (mXuqP/kpq2M,c_WBc4 \z`S{Fgt8ݿ=ׄJq*UN*`Ɍş|(ݹ|:h(m9Uݑ'7+UD|}\#v%VSIMLm<9_iΊˁLz32QQdv,g,W?qۻg: ?\xK.qEn@&nש)Uol: =hYV P()vxxcB^lxg(cKݕIY^u{ \Ƣ\$muF|/g]ktF~7=T7s2d } ҇u-SrMhϽ5߾1@Dv 셖1Д#vXR[ot7(EcJrNwm?c8p]UZl8][ o4H$JOeCM JpO|u]aZ!uEh9RY%W֣cΊ L1(~HJΣq׎U|_o$̖f:o)%RJ\םu s0Nǃi躎Y:ˁwg2(Xa&LNgh%B@W @: |e&x,3g9 (I S`k=at( ŮrA~6uaTh֍ U yt$8μ0Ŕ*ITG199Xr:\)CWjSނBV#V](/N:e΅ l%7 < i +O.Q3GJ5_+xoK7tvvVܦ\pqyo LC,lkM\m>YqBS]|ZCrs9@o]xCy`f 沃dvzZ9rDl ahi@Y%9C2q,L&eYR),D۶fJ7@m5Ϋ*[N|==f6FIpb$ATN[$V1B>WihhM4&aϬJ,4Ҭ]wԂ+IES|x || f|bɚB',Bq4@"\Hu8ysblyBj!_<]оy8>P22 I&8D.h aO/V%Cx:Nj ?1ѐC;Yֺi6[dvy3ꨖ UdԹ*~Su>\ ^Sg6m߳T4}Qq. M1Oeq%8[U P@fpc8ZnשMo5Wrx ٳN+_IvKbS'jgyR%~ǃ_ QP(;9$u85ho%䑍6vue%"7Vћ9%L` }޿شe glp-WMSe,]t^e<ѤqkyU W]p\I,ab*Ņ(8?XTdr\,!4JUchE7)+qS,9t;^ ˼yydi0_skkk:×{'jZM<;{#]T敾)\/;ħu6^ uF7/k \uё҅ 廦z;l]>YoIb4UOYzc I4*KGT76ꚠ11c]O긒d&2>b<li. M16d,"H,\Wbs]W^ @gt7Ymln)x;iS;t/olW҅(>^%Yx>@WW>x<^\\Ɠ>00վ)~ lh rYtMBM7w/dUCi bK'XYǕXJrgS;Li6Д*'&ehj5xTd9!nhϸ˨\wDϻ6A,T%Nڲ]>xO3ѿxݵF72RhŘVV@q15}#@ #i{$ AECEY3^kH WD3< Ɍ!_|BrMJR}IBH4)qȼ5$8 }Cr Fs֓(7()=x:_ GapJ HWv9kȑ#>|luɑ|ƍy뭷 ix<uJhE1Tϣ1tB^"A/=-aZìjdmG͑Ax+ u@X ޷+y4ً<{ntŔ,')-4Ijjj8HpfF_±xcf"0-+Lo=ʖMESLҌOgJ16f|*D"˹4Ό15:]wZA?fPE 4C&G&5)lTk2TAk4<&!iL:`u;չ&b_~㍈+%o]?g&LUk7 Xz5===N6m] x|r%#*@{}[=#5hk\3.'݄{ MJ8ݗN%ԗ2 7ޯ]vқU;Ȥ'x֣ھXo<+ǝk1?იZK9fCYcj2,;y@(އ+%L k,qԥ.mfqsΗ`-#iY^n"5`q 2VhReT(Ǣ9UuT}#`/-kXiB9yi|+bvMQ\ Jr;w=)%^-[~&q9=hq?~ yƱ+%芲6+Kfs~g$c3ɯz6󊯋:J̮kͳ =BhdžVBiI]nͬ#d7^.at+`yyPR06]_YqqJl,4Le !U`6xt͓W/h^&))c`TR,ִڰ:uX04qڠfh?~z?CLUKΰ߽{7~;]]]oF9P2Y|5M"Ķ\D!8A΅ ~^a={^"LѰc琮TQaj\Ӈ":{0+gDc_K|?l8ɤ$QQ9{h2˥[Z~ ):18,Xq]d|g-0Eׂ_x$P|]q\Ap.kC(SǷF~eԮ˟ECLc|'Bn[Je&)gJ*ϚQ~;5y} t2++9U p}9>j:7w]Y4M ksůvT*?pnY~]!K/Ñ Ca&۷;vD )&5*555O~aΜ9C__XUy(Pk)UG2DyR\*LBйws_;7 1:97<_xuXEt*!Fex}p\.Ydd@q2'R߼w/KJg $ʌ$;Z3\Rrh&7wR)WOYs{SWٰk>̜*2_5-J7#5X\Q٠FҖ"jccq+x UӤ gPT 8+8Lb sF^<2W^8dzLA5gr̙.4CCC|y3<<̋o"S(߹s' ~v8f˖-lٲuI$ Dž H0B8Hw.AЊůƪ n^ik=cl\T~A 1j uDWWOVv8A|*ͥ\1S#͝u}n,rBTQ&SsI }V b%YB$ʔI9|R-yut&W@Fe`J`Rlbnu5Ar|>tpq;.O-7MxlRb,[f9}82Mp8Lkk+;v N344ĩSxIB(ֹ@X~0zd v4Ӳ}ݼۚA+!14>mw\NClHׅ2|1L 6vݹ*2l*U9e)g"z䤲>!v:JGIGO])}|g[ʮS DSDFTi%hWH?݋5bTi"GbDʵ+K[LҠk׮~N$Hc٪[Dɧ-ԅa?$k9d-{FPA$# "t4M5^ GZ$0t]Еg@o{#V@SOS$~& 𩁲Pܟ\~J('5`gTW[xyҔ'CpKV5vǛ}{ʟEJ2a֮]wͺu :gɣ>J2رc 0 {ݻwtKW<.S@/ʶR%3Bȅ3 3#ۏݶcUT&f%k1oĴ9()-sԚP-.!@ക1S4w(燐gT/wi3˄HcΟ <.PNR@'U`;sq RR>!}=ѫd5k] iZpHIhʝ3Wg*D0s\ 3s(Yܩ@T0tiMZ;LvըSg1"(ykq Ǖ-K=䫏Pcta-];5>C$|miea&l޼]vQ1:DG>Bgg'477O]tF\ y@PQ bԩb$ͤ0u ǖtlmGy(Ҏ[)a$ Ó 𻥖[Ƃs|l#iZhN?O/zcN˶w.C@91cA,ZEr~(80ˏ/w-p\pU\qUُ#l"E.pR4+g:Q]HLCk B3ݥE)s2CK@֩sO5?ڵky'Xvǝw 3}گWl L &%3nh;lR!%2giWcLU-d|83:gyeRxk?ΞjY+IޖMZLigI|ˊ߫mbumk:!}^8+EnqWƦ* !D"w}s=|+icw}7k֬駟ԩSdy}]w5jp``<} gn=:xpVt%l,I6$>0oie"hí4<P` F$/hټ\]H8tfNpՔag˪Ul)uR21Q~&X캃c)iǵbd9yag^;c{X̺vmf"W!k$N矦i{Yr߹ _O2sJ8iRخfHf`2cRy2 "yXmg]پ};<󶡝Mhoo=y<dh4iKcc#p_4JR٩0:3MI^m5af||q? W\ Me=茺:SFQ) uInq@=>k$ZYUIaKz 0"LB>\Zt3l)q$BpkZjB,-Zs\vx,䨮+?⌳9Vu?jS^Y'^\~uQCoD|~Iߠ)`StM0fH&%Fv]nr3駳u9܏[*w2F:Djkv7.>ƿa۶m<#tuu-_-tuuS?SX?lzͥM He,ƣ 7;JauW3m嶭jZD`omlHS{@CT{[X9%w9-G[EӶROf|)c+GƻUkrhַn!2/TAw#4SAx3.e)(XT?i%Q i@CCÒ5Ú-NPi p/Tz7'IاZa2Ŵ 3%p@Nk!5]VeqMg$} G/qLxsgtqA*{'7ݧ\ q :YW3IgczzzXf x^<iF=9vXz%eHl˲H&R)Rhh4di6p]I"i ƳGٰwߵ[z W)YN H$˧۱ 94]ɦ3|/d4Gc)K3|sFEr*JԔ*E?y%e`8/H< /mU U]ߪVr9>|-[-4w ˡߡi<ٖV.e]ו'E+ 4^REhYLSMϤh|g_>hz3!jzx/?TaolxTI4qG*pgֵ %~uI s7iڴ=0wYm7#9-xu%'/3ekϲ/Ù+2ٚ픜*MXjUUTgg'ǎ+XVkM.xY~@5i300DT*+J0>+7ozڷ՝5G*-)+(`mhU=B &[gǟw4V"=Q+Zl3R$8xQ|$dw Ρ=^C d,O̍R222E{1>.0BBf<`|h4Z^]J`Ds]OzstZ7-u 3e=uk&\KiP)2YJ#ew[5:29ZDsD o>`V.7CeaAcRLhqݣ2[%dlviEjZsd SZ' ]a _r JRk'ק MyԑxeU1]%@ږd[$iG⸐q$ەUrRv.D#΁ eU#;6sV64=HgNqꦝF:EFzJpW/3Z?;w^Z<ϟ駟⯘S7,MS-'rHRgS*K? C00 S)5hLٙ,cΓkvB]Vu.xY4q_e;up3WHejB`ݻ;wT{<==ի1 c~?׳$js|>|>---lܸqV 322H$ض8Kv d-+Qxlɏk7TIqx#vfZ:*0x#/y)\RVYg*챈VPNm]٠ DSssZ!3%43)187x'I<ץ&q5 }RӸ/~ n$bA䭔o,nvz,V6OhRîьNʴG |S$[0]0#c|k48J]c [4TG QY<4-,BEXgy<;QU9Ҹߍ1wxZ "$ʮd5q!O F g/d~E1- %"h4XlQc: e$ e82r零0p~f(͸$syp\T4gx Ϟ#5Yu#c@{o!.d 'Bz{{ٱc5:wT74@g8i U0 Uÿ`g*ᬵp9%ɄJ=t ^>$F&{uZmzt[OkW/4lŲ2qƧz?x4GT\pHBظq#wy'6l]LNNRJB===e)r._TI ]Yz> gg1N)%Ӊ4։t6wzz:)og+rH)y9«W-h_CS{+H@$ztu;۷:.ãL 0w1F#Kd$S8:p,IDATM6Ʊ\u\@8BIQ麞,L=Zq81DmN͉Z\ CKnVTa҅[h Q/+.C*g,y䑫1c!$pEgetX.w:|_gddp%MiIW5kQHlMqtnOi;4k Z 1IĽ^nNV0QNs[:1xLIgu!]uel]|^(4 An姜a~4=>>?Vx z#|'$K,Hun;0g_MQ)+&.iS6'&,.L9\ve]YYB%rUrI[.єɑ?85.!N{?wnඞ0;:i[޼RouDK.[oq_8>,WT1|!. "qgcۯQa=Mpu>{rrؙ,GNҽ'ކ_kD/3tn#)T[z)d,^y"IUVDصk{{IQx|3LLLv+¡Cuqd2LMMF-˚M/rYZUBA0$ Ν;g r9#VHpqp|߹wߵm;11^Vw61:YZw+$ΐMgw83H) !T_hJzRzp]ӣ^u@J9;v3N;=3κ]Ӑk8&r #uy9'cZRJ~SteXNn,U9{&y }򩌄rd2AoNW1!K.Bp%p, εtDίkHڬqA]x&$I GO7ۇ)8|?wY*_j~.-*6 ~)q_ # Vp.sS>#0] sױy_u.-Vktkܑ&P\>Y] hk565va:2t97es.jsd\a 0v\W HL$-N&q4\t#G088H<93u%XCsj>n6i/~޽cIWѥ#73VvKFqA)ZMB@or0ӯ5C:駟[.1,XtYo=^{dAhۛxfS`9DE@\XR`.UgHl4>R\1UT?IWI^s|2 ƃRǙ] |.t:;nY&yĞnȵuNa6AY|Vg#x uvq<pcY~>fƖ]lI,+999asx$ˉ )咲l~%r)W2 Lg8x%_ɚ&?ku ܻF[gt dmϽ/g.M0>]@J&|;attwקClzzg}bݿ5:voiC/v7b( Ꮮ-pFh _;g@o݈?}9U:y3.HIj,ʥߢ]DVw^լX4ɱ(ӗHL%JRs۲-$:sqq8UC\6lP_A>sqY`---]b͚5|ꢫ}1::ѣG9~8CCCm EJHp,o̽{wfMל+7B1S=]gٮU9*i:5Ѥ`[ٖʤ:>t'V$XBε\w/T7 ]~l>O.:JHɸ^Irp=K $?5 'y!ZyCoa Dm¼`4FuG t44mv̵w 675eHL:s˄㫒7~Cpou$IKoZ=jΘhJd\)qeey45h%U_ ]/AOݠ!hmPufQM+$壏ouLQd,NK/qey6mteGVuҺcB}+v:K|T܈Z {WN%`|\qik3vcQh[`;O61U6+om4m\t]2 qd15u}~܁\Q"dm,>ϓdMiaپ};k׮%Z {vɁ8}4X uu@nv͖-[]Yi->>.^ȡC8{,xfG<8r}&ϾqX2 ]S>ֈxhL/,9{c ";ja*UR}p+銎G~^z%]{$#TjB"uq Ͻ\Qmc<~FG!2bӓ Jq?F= ٫qk-!:.B%v,mR"MLͱqVIkz? ́^e>w1}s ce=\b\0Csmi`J-d#8+|h㯍^N{¥!@.!H@ \3.XYֹG`+96nƐ٨`!U<7u2OexBe">~j=A]=xç,7RH$C S8\ץ`ݺu<]vE눫ell7|J7mhEǤh+ SUQhGLDGr[r*ؾ|΀Lx1EE8;d:k\y#A6aM#G=wg:+wFe'\!3'56ErlT 'c. ?z6~-29Z@ێˑs|鹣0\u_40֭cݬ^p8|կ0H$8{,ϟgppT*E&AӴYap8LGGVb444\k5~n͛fll}^)%C17_ș>#w ?y΍<:y8Yj-wN.0k&=^z#6C͓W;;OW+JD4G{"3mmJt*`ǀ]HsEV]~6UU1~*9#9Dȧ^,#ᇷsᅮ9H8!-tL6!Tiu5ׂX;v#2*B($ͮŘƲߗk oe*1vp[LGVW6??} ym bR2i-d"-q-@+Tyi 'OЕ6Pr \?2 DtDt]0S˱q7,Y\vI:dp$mK,#,.Ni ܵliMͬi{p2-Sk}S> ]O#+$Jq Ν;G[[;wd֭ttt\3~5cBhݾ_ciפ]xÌsV+,(!:"zqַ"׷R_*֕JJTfW12jT]n>m߬ͽ !v*g2z@kfЏ{L4fJL6ksKdi4hTl<e"wl#d}WS[QƼFt/=w.Σwm4t`v). Mr(F&&ZLGe3gʼdi^湋X !YQb]蚆{M/- jo%LOkdb:ɡ3c-V w#@\8Vb1gƞne/p{Sz3"?MQ{ZrK? j~U\,ث ⹣p6x[koqtE>Sإ7x]9h*Ǖ\FxJ6b6)[u)+%IRT3BKdGg'--lmU%sh 45ˍNB^_>v7g_ynѤMJI&ʕ+ /Ζ-[ذaW|[ő#G*ۛi޼z}hAZ>tt@EZ,gre;WCGg  Mδ9rK[i\]\A|M^?Fpe%x%92Ard5 Fx%uT)l6t:yMl_ӎHp+H7~8 8'rM6o>֯_}WM4m-w0c޽qaN8A"<@Jg_zO匿5 ""lV_:kJgI-&ē),E&kΪhe;  P&Hk3J4M c`yLi890+Q\ ~, ;A jlD&* RJ?c=R <ҼFϼT~/ݾOVu4"9õ%%HBxV_[=n"Wg,N[R^fL[NU9CfgcioN)hwoS9U_/|VRt5AC:jq9Q^,:DxnG9/J炦h)~պo|{@1GvM~fg˅)7<%Éq3C@JՍ@LIswwMͬoםW S&f%00 ߿]:oųoQF/u]$}}}\t{H$Bkk+k׮V@`ٍi۱JQ@k#k߽ϓIWeH5ͬR4- tBꎊ _c5'8}q|c~i^(^5 zmS7]-Q @d,or/?xjlߺu+{/Vי4M6mĆ رcWUl?x)>ܶ$1y "P1J)!k#-!ft\8hGW1Ӽr"/4tm,*nVr%<ٙTݽ*q\el8x\ `U3 O+mX\{6X+=2LOOsk@KMK1*?.{Mvnﻝ;ve BbhKK!h|b6 * 2h|~:禃N$us@F-OǶ$*2Ӎ'\`']sX)_7_q:3G!vIJ|ߕp۸B;M 1^o;./'9|fxj"B@Уu7)#$VF>i \7@O*g:]f=QUZ=GOȪLCG\/mۜ>}:bCCCs9F1_)R[}00عiaۺv2.t B 04u:zg6_b`^X|^c~s20甯.CVh,Vt㧝!IF'RDs'Zy=/Wx؞._5ډ{|u=}w3}sbSZ3bX$ ^p%^'Keo6{ pX_7evMGm~6~aOxmPeHd93GG1vvɽzFBKJY h+-&`T]qs<X48IriTT*s:eM0 ]|AuLӜ}?j.=|4._S_Sƒ$G'"O!z^ m hm j>&tdcB <:Lr5EfC1t5Yv6 /ʷE&)ы* !hkkd޽x<7*@k.z-yh?KLwų\=[#q;E&c%w+@T͛­kΈџ*Ȧ-8| k[U˽×J^NeKZ(|ȫʧVkcdI)F 000 `zzqS֦ڔmgg~pf~Lړ9Tc^R9vy=a~cvQv_.ګDZaJ3m/=^ lspK^lug;{%}rAZg,!;KB%b{ iFEJ_LM2'XbS玭ܾo.pcSI[*[^uə.9$*Cfpyj75Cu4mYHOƔV2k93E9ȩ{!Dx#!|M-<P4(@Zŵm:Y@J5y[Nqi$D,E4&k9y.1xM~Zt6j !䣵!k+x+Jf㯼'[zٵk>(--O:\~>lSO=ѣG 2HeS?ȮEf]\zy=?~ .Lm3Qi_PJ&oSޠ"dS35mw +w\u*瘘 ظbLMM1>> L&IRyJ /Ur窢_i?l)̞^D.wol?Lc-1Z1 eѭYt.I)HJ3dDsjK֭i:{c]NwqΜi?8%YR4;xQoҧrkZ#Fp|0i\D|^W02tv⶟K/[24|p6N82g2pRgJΌ%O]o^wv;MSjΎT2Ma?gr:IaOKfjr,Dà6vz'Bnۛ 7됮d-dDzq-{ Dh:σ1g_xi!d?ylKK#S$x|/8K:kcRJB~/BPM_XyB'@"Ͼq`^_4:;;y衇صkW&|#_g}yNjT {V,aƗW D&b|ᙷ9yidcl$Ӆǚ̪WCSU-g_>gU};>SImnY)`6vGTU\D~\םVRxRgk饔LOOFF 266dd2m۳~Z cf"5Zw6WNguP: K]:|<8a-1zR01.J6 "!^&.mݼ7Qk:*+K/7:qLd*--7EfE1~RI[zV%Π·7&?b?Ki^eݒ ە\o?1Ofs[` P*5 SkVCF4 &p]Ui]Zӄ!@KC}{p}fF9?t"C2U1ǭ̀*FHON,DZ:÷!ii87yU4{ZY `Z}{>}z^mx*zٲe/5dfĕB:Kpoƿa4wu^؏{I&O_yp@NeĠj-C=R\6ghXrIZ!NC414Pcxtl޶m/z0el˲Hs)`W2M@[l{ap` C~(X~_ІMSl *2$m>aq{FmdMPun~7]nWqa-mŅ+"%VdW3!|wŬ|zWopt⋧R||]̱]IT?|?4O?wknT9zש6jKeZ>WHu Amu%dhIFc\b,db*I*cHgltq%r}M6.nku6.)ԼP6u h(sʏPsD<5MC7 :VݼG˞wE[O:|?S qP&p~vFsPKgTm(@k$ ]L!2}{AvWvRʊ"+&7FƻѤhrU4)He})1_^K!$10tX6ɻIޕE6puI{'V}o/;z `?䴊Zq&yuE+ 7q\(Oÿ=g'GJLe/cc==̾n|S;/m7mj Jp8&p\`^0^爦 B>"A{ޖ(AWHe]I~? )iR LB/뺛ش:Xte[VXyƝ4d9H!8g.=U[6FW.7wS-g#]WXo<+:d_).%|^,ReZȪEZt^rwF]Λ?;n.o|T/Nqz&[v%'Gwc#ky`}^7pP~"RfZC\L%.(VC`!S`ָΤכẒtF Qmrޗ%Xu4t:L$3R.M&W1u C!@KckXU7͢ vA+V ;dK_6k֩2`)h8 Ʀs߳gx]u..%YtP0%S"հTsy0lN%??nl`獎r SwTIoX Owp2ɱ1t# cc}]ڃkw (ws k\+z5B'-v4} J\z-Vݷ`g]=_C`g %M'3\\VAFTɅ477O{z6l>!/H$Jޗ n D _(UR.ʩo ^'wdW}97UyzfF%H#$Em YwmNఏ1쮍m0,`-1 ! PiF#iLO]9p?nUuUwuwuwu癩UK/2J[N-mun{ g?LB=[7~׾w玿24ヘd/ rglj$ylg)uAD_})44EldCW;l  ն{Q3@R(ӨWPrؗ8Ĕ ]&gSo #Ц8ƨm '蘕'|$FUm'W orf/ 8Q'sFY)k>s-}!޾=f_Ϧxy2#@JI|>=3v loY Sm7%uǯ )LxF89x!qMo wܰʎ%8ç:=kb !hMܕB )8T?xs;;!&`tvNoΡCx_LXv@ rjq3lnςpK$/vgjưk2ȺFW'묻fs嵐uj:Ï.?'4Epnis]Z$cv5(7G a?~CcBܠKeP^/~?b~CH+ >S1@IsX eʳg43[yoeVcFD #<`]-W_96O 6|vE)H/޹֋_[㑮naB@w[n@AҐ6!gV^`ń*}xfOWM'\ѳdi߷ oqW'H!bUHF,V)8QFB{OcVrǸi %ٺmהCNY6/.bN@BQFy5H7~:b#+ X 2:i8uC{F~[A q|6G񡑪h sB~B~|y~5LoW~qt",~c$M!E,aLV>QP|;V"U6ETcvӿq!MZ.-4$"^@¯\u s6Kjq56 нVK겶J!(AvsӦ\ǀɢXG9l8DvT wA.MMOmkU&Y[Ne%eEѶ,iT>͖v6 [\GDל,$2^8lIVEU%nFz[mzpS we7T!}Y-7wɈ#/`HhhYpRO ]$ݶo=YSQ`_b1YH PQBwZ;eXyZzO8αՙ^=j~sNsxjW+E1dMe6GSL-]Tݭk>ubsn䛧c ƬlJۮecY4!? DU X+K'V)Bemw]H j?&P\`Mt$*9ĥC*͜"Sf"kh8tfZZ;c%$X54hZտ^z#*5Hɧf5őOK_{{.:"kιUXst7r$B;{ԇOt۞~acMbI\"@6tWeV@v,_"׏{QC;{\vg2_ Or^ih*8xN L^dhhhvoEAzZ?ƫǻUTsv ]%~q;*9xm ]. `>ߛ,D7hd bh߱n=fmSR'c[>8_ܣMզiwU{U 7?T ! ֗s4O :37B#yGMU=?XwKo94@>?q: 3leo)'́gEG7ܴyl}e~&;T\C-sz+Rn;hTϔh>Q"p\v787ImÿYB(8yDi^{z폺u*ZMxE§ >?0ƅĉHO:_/ 7ki AsFaP޶O|5׏NKμxu,(1_8E=:[PY!ئ>Ɗ] 63wn4BH M50CJɅ 炙{wz!L_ѐw^wۮvROf.5^zڢXѓ->:Q{׾Zihmf](A dS5@tPRUpy 2C&28 2YHrˍf1"AZ{{5ln]5ŶeܣOO 2ɩm~e:;!h)v]ǵOuIig ^Mm7@,UѴ>KAc(qڵ/@d]U/u/4-s5c״[ Xmtmu6|ibQ4ϝ}y2w]dtWQgl#烈>{jKDJ^ӚKsV'm vUtd?:\핲ߥHr̈́YPy[6uL+ȼnu|Kɉ r$_yvmA~6N޵@XX,h@hОu??KcX3d[o2cePG36mM *rH,W{ŋ1#Bw6om-ٲpi}up+ :_3t <{#lsa> ǩɑ|(~Pg$ˑN$gsئULBT]¦;!z#o%y̎mO|g~t"9kqۮu]{mL]`K7/&np4 h!hgy~lob!8 "$dzBؚJ+:Ư4%Жxy)em/?vDώG#wx *XDf{y #(h$ vXgysz:TfiϹ8,p*sB0evۓ1#X@QK췞]tT-\>z!&elW:3BۿB0T""^ i~|_[/H6w)eMHDdf__}4tI3Vh*zЏ ooCT"2I&&8?g*TA_a6uͮl$7X:~;R58CqiZ7b} ~U[:9]GϟָB]~ oҳuӜυ8wg6YPdti;^k ie1x Gxsd M wn=ت)䤂%T, 9ZeVu ]˸$oG3>PԔ06GU;od'ŜΠVT $M:y"ktYSa$a)]A 6 X4Jv<ҤE.Y57ƄQ%cJ0W1FFQ1qKC|ҦAZtgLsȎq=N <4rJ3"u=GҦ 2a{8eK"DC);g!In1zBi%2e"+(+PyZD+02Ϟ-g% Mv8oj9.I4|KDޖ??iKN#esU*Acb[cmrRx},Y(!܊L( =D5TCkʖtƱml3%K'3#JP[:}k_)Ͽ2Gwwe #/Jf -a>ew;ڏj/pO'?78T֞NweN4v' ?s/bMۮٰT~U HS=l~/{Ȧ]i_EqlO4UCGE64wc7Y~lZ5ByH˱?JȪ8E:(0cf Gq#-X$p[5H`4}~WhZ9, A>)Q(.h,>W 9r<r!aorl"*߸]JZ})kz̑$B0H4'py,E~"PT]G14у~CC(jES(H)V6cX'9senMk>Bl?߼=Zျޘ .*tN:LK%S/V$FbaҦP . ,(Lcc㒎ɣ3pQڢ{k'm7%[^|PwH~y8}itl@QU Z{q`?[d]tjڼ:X(Ϝ /q 92C'悝tF /ݼ}ݑgBnty=<1-8y 2^ߣnKÚO<2~{'ܹoo?T?éb}8Rrb47^{ soD"7 GAȯs.x19sg+EnxeA|I;XMSf}}ۈ!??_dj|Kd#KUTeK76ijZm44  E>@3zG.CA6&N'6<0W1wg3>2?z<ñԜ(%vn(nhwU4mdq˴ܲ&Ih*{¼yOof :=|ݻwx@.… <+$ ,v[hVtڛ{?,H&S?(ulmCB̴!K(g, x LZAPІ=j=Fm[JU5)X.&l>TC#QsR\Sm|em kxh ,`2hba/3ȣ ߣm'eK/}.0w~$_Bf4cf-B_} Ls0WdkƃzSU03b M-7;_ūo?}i^:O:/*m3440Gm۶m6^yfI& q ɐɸ s5on{kܲ[:/b9 7MUi1Kq'/s IF򖽬"0TFo[66r]O{"lhԥ ȇ {L´BEB~hz$<"җxr 68ԫ"}*S+z̄n`11. Dq0g3ڽk,)dss'KyxlRd8<}}}<裄a:;;ٸq#֭+B.cxx1FGG+=r}tMecw 7moa3RtV:B@[c]@2g`,ɕ8gqa`# i8R8!cuK@W4U9bOg=avwiS- nG Ē^+Y<"1vK_nr`$XQ4Va}JKK󘝜*="M7iE+28>_זpU pk1 5M+xy5tl6K6-ըkF(Ch4}ӗ 4fI<'ɐL&e||D"A" Nf, qٯ)4pm/Į-]DBK!?  ft7sލdr&P,EHX+#I,T\"lqmE)KFV(W2uC>6\UY_~SE=&i`K9 !Cް=O[d. UN Cwx[p{a^H{e4"MsAFbU*ԚʞkٽDg_O!l3أ<ϓٳ8 455FFa (uχ((|!58NeYXU2O:.l6K*¶mrRJlۮk!hٺ;leZC +Wmr t> ;ַUv\c?5# UU0-bbv%G!E(hգ {2t:Lif:sb#<M!~aOy맲$SWA]%:=UM &;cG~ խ2dks pkx [IrL?G_6t*Rp.#/lST3TU-*i%ǀa~4M+94MCQz(8mۘYRV:S[U2m.=_4)}A/,_* ]Mܸ{^M˫`PLH}-h9"" yLŲa8ܣXI5B P' q>o(1 [_{G~S^.%ms6[u+Lj*9E=fq`pMӽa[DQfTų{^VeP?9CUڢtEyMHr\9E_%UdSn@S7͙]~;_Wo}!@U>({vsî^mh'X^%9.{CU ?"L$*L4V\q3=<kW:!}2-$8sϧ:nڿ.O;(mKiŦA৯mEWWOϣ675*E-di!K^(0K 779=!_ٴ_`B惪u"!;6ucSo}>F0/qo8ټm'~amKMq} P|>u4mll)D_0WeʶXϲ(c^A6'EFCn_`W:Ѳd^0Mra`lU [D- 8q rutLXUY%ۅNd-$39F83"!-ZXDgk(춊w_b'D*6-"_:I5Pr=Ԙ#ֵ:x8k6T֝X|h3oݾzu ]3 X ɲHF~bG\jpּ҉`fhڜx|{|li57m'o-$,IF$dMR<퐷,)O +(>~HhOc$@c$@kchhUULN8UQn((8N} I,lӇCŇMX)s|˰\-؎{)^Ai!=ǣ#ty=b[D:`f_z9C< qS߸5+45-Gr|DsPgt;y=f4a` Α! &! (e Ly 0e7V ]UUC.oHgL c)Fc Oeɛ62 $XI`EqkUU *Hxk*">]#7*誂]U|FЯ0t~H_'0ELf۞V(Q=^r&_S|~6a?S6@5'AQ*D?6lb(կH$HR,۝%ghwY|\ȉ0q)kDe-[4ʋ/fq,n/CeCq̶3u̓I2y>t;ZvLCڋ{hybx9rl~~0uT~@ W1xh"oȢ. h5ok :4͍H(#q$*B k >]C>-[\Sgӓ%eG*ʍZE(>b"S4$"X©)6aLE]JE3gFWk9z=aexZ*K@:sLǩ49>ʷW|<-eN6䤱W3e{_^P\/,`T.m:(~H |g?!l::y"(1A NU%94m{t3J*QVpq/TաJ.t?Lə½Dr>yp;+tBa&$-XOTXXApzkvetz=4F~U4g0hiΜlk޻qq   qS(fxԄMqQ/H[EB?+ȯ5/n-$_&_Wt:vw1.kGT :Ov)0".LLF jIv0 6yy"\](X;(ʄAV!]c^POx0H M@a |&Rx}hZ枑-]1-[[Ӎ֛ք?ctl[1';ty̝p B)x%kCsC,2GD#3 iKW2$} &7opkuy[gS|)sW,ܸo~imX*tR)'Ŵ5k3ՍA < T)-ֳkܔdE~dsB5W RN&! 9/jɑ;H)1z)'+drL5H_4say9 *q!ES04;ˇOTO ~н<>0ces怫Cm qS^SngLv;EMg%[pg?u.Culj5: [yv$Wd,*>?\$lLrz*Om >V_dnU.zir%I"^eϗL~~"thaU2:rgT#OV^"58qԱJ ۡw-~H"xAG6!є$:nw90,CE`ӯ~*ŋT`EsY)x+2ɒSu"fFjqE僲yF438xԍc O!h Pjs)3mcePmLOqV)>Gr˞(&.o{~v*l'hĥhGK+ uuVWg/,9H%QLkfߪ$5 {^&2aqmiX %`4 \x Oq;5hMvD4FW? #RAwԠw{ )/,eG dgH#@kЗ|d 5f«z}wC] ?SO&yJ|5" |7 i{$; 4mFw^@"+e, ^,W9Sl])]|kDTC~)eK#2#귭8poBz!L FH!ַ$Pm:OyL%g- =6*5X$ O gܖ~"荨ܷ Uu t!a$ʉ ge* |W_EsdGG5:b)] a(|s& $ c@DCjrf b^ΈZC)8hH !(\b&  gm8UB_;t6{ H }3v5p$o & Ч)s2AjqUǷV1Bۿǒiu<<)jy@ s\JIe"w~]D V^~gMY߷O|?u:ԕ^;<#XNHّr)n]ˣ ecJ)l HԒ#@S!F^8R yG%]0lYA:- !DTpJ n$T1`bZ# bV~}Z &Ƃib`k)DP,f`V 1yb2j28mdQe[g/\i2άg{ut1=Bnݭe]DWQR"UPi CS3=*I u\4:[`E&,ė{KEgH!鉀֓es Rd0mӗO6Cix!gIl #q$h@Aq`[Fؘ1q BZB@CݛZV:% ޣ*Bǿ9!!߻_~zË2E(7yUqUU\ft}){Du$ⱂik* y,>ɌWHh2$s$cJ҅})(v#nVXDWF B_;Rh|:`KxaK/gb[77kZoKA6F=.fxxB$/plGT WsyTË/V}Pw,6+iXg9e S{=ܲu'Eu:so@[wDJ8]=N4 T6)Z} pgxԁLދ/"?GXgɡIENDB`fastapi-0.110.3/docs/en/docs/img/async/concurrent-burgers/concurrent-burgers-06.png000066400000000000000000005017461461403617600301160ustar00rootroot00000000000000PNG  IHDRX#IDATxwxlUmɽwcpc:zKH^?F!BB Bb*[k3q%K]ٲ-jy#ivvJث={f?d"B!B.!B!I@!B!$ B!BtB!B!I!B!݀$B!Bn@B!B!D7 !B!B!B H@!B!$ B!BtB!B!I!B!݀$B!Bn@B!B!D7 !B!B!B H@!B!$ B!Bth@!Ca1׃ N$&B`¯`4BqR$ B*@zS~0?Vk: VAA!t0 Xj F! >Dz4?ؾnRB!0Bѵx}*6M5;wAqeT`nA| [ ԛ+-7BQZ4Ə]{ 9  a@{04u cJ&\zdeRe xX}nSB!"BB!4U@ 2!;muPZf}>(+| vHMQ -|k̀y0f$de(*VxPXM lܬ} XGU `s7ށk6 [~jjuƤ?B! By&p(VUk]ujjS̩p$fV׍q8EŰsX iiƫRJa|ꡪJu U?s c>uuk]U4bQA Ե7Pkϟ^Uapࠪ8T@AJw1~pm zhi꾞 Z@c4@!T$ "n?WfW]~jxNiYS M{ˀܤPx \O|")5ii7 ؼ Y3)`iv=VQ_o^~٘ o:R}}&+N|N@m;ཏT%iž}ptUp2C ֬"),V5Q?5V$ jF8B$ "7UMv˙{P3ٙpYS_< HW3vTZ_fMԌ0q\pƙzSdۣ:ZJ%fLUKVp |-և+YajQCm[Q}uK:1qw-6SS k٩@!!7BMELTa¢պpe’Զx=s oϾTU-gߓP:Zu_Vʺ KtԦꁺz,8OP#\BPhWiض  2bΜ>nޭU@8N'; ^zMP i-8e_Y j@F:\rZ>B2 #LnW^| Y,0k&L*4-8zݰgNSP)83ϫ$b`*Zc:YT 5,5.PQ3]wUޚ@ %8j~dH[ UCK-{WzC$Go~wזEYjB!: I!jFvd|]?R?עz!Lo0*ZSS<^gìyV fSɂD^>5E:hBLIQ gt3}"ykm<=^Q[wH@!d$ "2YO v4v. ]ɟ9Uuo++Wh~/^f:ͅ7[AzzhuuN}߮:XD%I.:W%NDUoh,״K407&L4M&@SNg.BBhac)(l*o 7k8s7~?ԼGvi4$*ޠֽIIJR0Qz8@䃆*v*7w `6 Ç디 VJj]W=RmXF8vSa`p]BUB*ƋTp<^U|U{9I*hm)X`0Mǣo6nVavX+Pi'/vw?l*h$%6U(k85 {4L(-2UZ撓o-GPɓ&лLvdh|p8< BD{B!^=xYpGFU0}>4UЛ`Cp0or= ЙWU շY|E%&̆~P /:ig6XTRg|rեY Ő5B!Dg& !gBi*7L(,R]m6M]A̳fuS}LO֬/Z7$ ዅꞧOf%nx}.?7ob8(jNN]}+kqɅY3#~ ,j+XI%tCyϾm W\M *;vB!DTH@!DχO>W[ڙYkYCƒT8,\FÆ:HKSU*Y*H.- rzPK* *<>_T0?~j4%+*S0nL$% &NDޡ['Nvè(B)ifC$Btaת|c>P[𥤨iCv汯밡߰0rD]ukرK5<7vM3hUk.l mMMdݯ( GB!I!ÄGXm =!-iv{Rj '814*`m߮O!HݞBhjֻ_ӢiUR}1 o& !"¤@!hI7@lB!D'"B!DKV X%B!D" !צF{B!DĵB!B!b$B!Bn@B!B!D7 =Bٖ-[=!Nѣ=!"@!DH/bB!$ B!Bt B!B! p>ָ 5|LC-1B!H@vf&ESYڃ@ V qq62IMGN"=s=dъGʖhaXrpN.OPG&vM B!Dl')*qg[wqK9tWZ0u4MC l6 nbj&X4 E#.FZjҙ<>Is7chV:Ï @~䩊՜П'0-/{G+B!ıI@&Y wRY `&y~**;P ah$;20kŅ f,vmeNci!z L@-olcn'{铙8$#JBtWʗ>̩$kB0$ qjdo=eTרgU XGf q<e9SC9|=jC7˧=,?Č~|?c g' Bcn~[Ro #Y\2*B I@V]ez|w+E%.~#*㨬{[h.M=B|h$ ?O+'\D5 ̵e4f>84k,jCbTo}mrj oT&A0_/e[()C;nL|hKWsكx3<>7C.JLj3ָ 0¦*lga.O2Ngl\H/!ĩ e-=ڣY9'q&BtfW__ZN5-83$';X ]?}=^ɴ[9kꭞk6k㎴I tGnB.'_ZY Ȳ&4sg4)?)DɂGnS!>_]sNff&}_~,[T㩫;zn\\III$''B\\N0(//|qGժ1fd}\f&;R牊Ub9%VjYHܖ6Lk|\poٲ%#ԍ=矽65#91~`^v~WYfᴸ\~s6g'j#!$ .,eۛ|MHJJbРAy晜}L8=zt:1MM|N]]qqq8N^/555>|e˖d.]JII >ꙓw4 `:& pBV7®YדfrqҐ ѕbG˖2z.4n綴q"s9hS!D~7.dݦvE]ĵ^رcIIIAQQ_dݺu\c.+'/f;̱(+yjW5@֙LMU]I,%|5Cvʃf횅{PY8{'~ BѹH@tK5^ϥ畵\Θ1c曹͍|=͢ExY`.sm6 ]82# Lָ MBm< HqQ`ϚgN$I@t%eKxf+u-f3ܙ>dNDB!:Ing2}s/{̵V#Fps-QvOxGYvm}l6 ]9| ) *Λ5[yl)[= kOOd[:v'H+ zT53p,f&B!N$Da&}?)Z%iݛnロ}FvmPZZ{^~ežc[-yILR_kyr6/ kWgrvB^Y ѕt_/[5ۨ3G7vӸ' ҭqB9a _z🐐W^#<)l{1z)  /ǞXJ жhqrm<}&ao<4XRS!"LW7sYkjSPЬLOǛ}$Bq$ <0yu) {i 8W^y &`toy1iҤu{_+yc(1.Ow\I8<(S\wm6{K:~B) IgY!۽eGK2LOf;s*t7-GşR)}i[\m~_2hP >>/b e)@gbqrm({/^9HMkwrӑw8R~~^9w~>_F4ScsjF;sgG)2toϬ`ݦx~qDgpQ0`~_ءռ1okF%"!|fʘL{*͊UXuڜn bZܚ6ڴ%B$  x.ᄏK5ks=7 ^|m5(LS25O^p^ ҭM_| D{" /hG3䘥"%C-PMΈz_r/c#wB$ W'QXm<#ag;itRmۆqqq?$555]{bѾ(JlkInbiܙ>*nyp6}eWB!Dg |w+UN'G~"2r^x 􅅅."jϵ^j :&EYy}D#Dgq234G"fr+n?7yDy{ɶ&D{hB!1I@ĴҲz\3f 7|sQ__Ͼ}og&֭U/r=*XGhj_m7 \ç=ץ<8 !m" 6n-c6뮻#)) צs@L|$ 6)Sl xm!K(:{_Wcxyf+1%7/"H@Ĵ/ 5\qt]oӹ#|-!!K/4la[( tD\O:EC1 sdF{8B!IY~eC'L@#:u 챔Ng$K.!77M~iyVGaDBDN,̜hד mK&0BS& fcv??c9>---0`&M 9,ZBDJw V!YwR]?11iӦEe<f-BF4Mز7ʳ]'CgOud/BC"f\W^1"*iKidee])'N$>>>*jkPXrkO"T!ݗ$Dں$h]4FMbbbTƓҦz#9rU磬> #cG HKB}I@ĬA[Y,ƍdddBVVVFӺdCd'DjrcG*BI"&|:c6ѣGGiDjA[D 777da!?S!bYG]T!ݗ$DL**qQs87J#Mm^*БCUV!Dl5Hk_"Bv |~nKJJjy}~l=/9999,@ths D!1D"&qqq$%%EiDпvkSR`&.@ľHb V+B>$ bnb ㉋҈O>akbDmZA4M I "R {!I@$Jv07sDbbbXt:1 4C*BĚhpŒz$E!I vai ~G ^s6-Hz!Z-DBS:x B('nbx$Y\K}uRr~_%pKox&oK`ޛV&a`ӢBqr$ bVIX昦IEEETԣGz8:C$'9UoaIu?(?S ƙxfłFfîYqjV-5)'I UG)'i88͆Cb,ذ`4 knŁMߞJEĄ"I@Ĭ̌NĆap(X,t\44&7o4yX.ES D{8'1𘪢r_ÒCGI!DI@ĴaC2ᓦu]g˖-P':_5aw85Fqga<5ۯ7쑭 S9ՠHB!D5D5|Hv{SGd4ٺukH;֭c!39mb(81XAm[5H>D©&BѵI@ĴCs6ɞ={pQU tLI}׻s(dDbɝ%>dB!.I6zDA سgOFap!͛=Ϯ]6{矇TF8VyHNWZĮ f#HB!H@ĸ;#egժUQ>èeܹlݺe On4cڷoofH?W&;+!#w{Argo' BM"s@Rゎ]6vo[***>n|/Bd׿6 WXHމ&baF]*BK"Mӓ2Gt֭cΝ< /PTT1m۶^{ ]׃}k DXQ$B=I@<ʭ׍hjd:oVDSRRBiZrf͚5>ã>ʑ#GB="nc"R:2=`9FB!I.F'7%Ν;;wn0p@Lyי7o^;?k*=sZygO^ @!^$ 8nv,6[_i3'"DWR(/Brt38h޽;#@g}|x)OѯOjF'DDcT@t~~B!,I.'!΃p߾}yEidORUUxfF<7"¢GWt$B!MK7$%6ŋ;)))GMM xy<)}?uW脈Κh睬BBX" eͱv8-t]磏>[oe׮]Q3Muq7裏R[[rNBΏwFЮBtu b#q_MRp|+ͪB $2]ժfq9Z8ΕW^;#(OLuu5>(^z)1>/;?t~n3VOZ)Rp|})ܓq:}\|h*mhK!h3D^0 鯻al۶oqlٲ%bkrWCQPPi''9ygU>ѝD# p* 3]a c ?͜;ۙ}%&7*2f]"{:pECy3zoJϞ=+;5jֱ'< 5 zHW?=;nT ĩG?߲eKGr"5}3e+h?FnkSOz|]*1H15/wOA5gBѹH@t:yyvGiG[Vrrr>}:1c)))/̝;ܹե i_b?Tj Rl{'wgIBtNU݂Y>Աg1đ5)1u ir/!TI@t;k7}|!MHLLd\}\s5 80bUw7`֭xr/kSS + ..LN'SNc̙$''㥗^b޼yl޼4 Ӧg"پUs3lk _I!`ϦYoOGg i#2 Oǻi5a{'D"PEV XH:863`wxBFWg|Z,9@IYq"?Oj[Y={ȢEzrA|r \qpRSN[ĆCjުƛ5[-eL6ߘ:2cKlzN> prDi|ݮC`^PmRaԀd }^dO$!Jh2kzgMcb&>lU'vPoO> mgYHOc~kP^YA+Vno|A6&7/3x@v!Օxv'lf05 z򓌩\2]H˧4G;ؗc%p,J_˗~Nj oпsg0 x|)I7SFkk2!xd m̯f,\z[ؾ@ 11+Vw33tHsV4r|7m"weF52>v%u`9AW# iU~Re _:4+\2R2‘MBS#SGBfaЀt H&P]kra^/ks%M4 C.o|:r_vmsbq͔8s*#'wm6I8+1jwl6C}:{|<^62+!'03T!8iDiLjY\{]yw~F||qt4$ ?5qP+qYy4s*g%aٿv;z|wnNU)#(yskl 1) xf v3ʙ]qep,(^!D,`l~={rJf͚u%&&i%DRyfVazߦ5 c=a\/9990L Sg̫KW+\2Od#i֊V .五Q|#i(Gxj=Pixy}10)ݼVe.g67ȅBtvXW{uz͛E]t5XV~&\ m$b5[ 6߸u)=mC2['hsvb3W^* HM(޶df%EcB!:1Iqfя5^ `…УGV0Lk<OVjSЬӸ)u 7a#]!q4 #ٌtfsO,k[XR.k{ I!! !NѰ -l2VᠾV>_%]c9ܔ:RFӖ$a$[\<_Ň2j /v,5+3E{B!:!Iq2qz?6m-4v/s饗b'i‘LS-^E*O%qn@L}dn!Di82q|?c UleM-<{Z(k6Q]4M/_Ύ;=zt322HOOҲz\u>$H5L{hhdZmKar|. !:]0ؑ`GFrTU [ V8F &>.zo==Uԓ$;3QBnIB3&aW_}Gy$dff{J(.uy1%7S{G{(BnٺjG%&̅ [7gvMx;N+.c|>_PY'1NzZ<Ӧ冫Gsڄޒ Btphl( s=62d+Wl pp5H@!D?Ró/ᵹ9\PUaOiY=[۸3ڱV;r~]| ك# 0XB# 7/9oob2v]/sϾ?)%+$ D;5wnEڍNF qMHK;izJiBeƦґXR ,?E}rSeMo|>>,G {q㈋kzb&6FdB!DsAIY5^KyW*oK\dz/᧿j ා-Ο|ȺMA?ٸ%W&KWw5^n?n;_|s`tBA*hG߾q_@ `f._/ j~6o/ߝ漵zťu|R!'}!$ D;7Mා-7̙3뮻 &ۯ_?KiicG kر B!NUqi^kZBzj<#esc5W Ht0u V&[f~PЦ࿹Ҳz~"L7 4W,o _gX"H@vv׷Oշ7}PPP>K/@=uh ]!DUQ}sPS{xTm&D@8)p1 c9# wb-621'$f;5=0L>__]O0Lp]7p{$;J$)AfF|3+GֳhL\.?8f"55y'O&555hEoh ]!DS^G|iֿ-B Nok=oۦY\A.|)(wO4J'!j BK6 ;BU<Րp6l)zLtn紑@ݓY0'Y BtZ npgݞ4MV^s=tްa8p`бZ>bw*x_;45[iO5cP3 hp-/C-٭zN(ܑ Rk77 >?zÙC~E%.jg*j]>\u>ܞ5^JضOão{<Ϗ~)V[E!ړTA9s ^7_M `z?E]ȑ#p8\|ŬY]W%vps?Q!'wVE͔O dSz(urȯo C›&ezMg_FM_6>|??歃e{ڭ'sfQU Bn@!yu~WʛӶ!DhfC٩a"L, W\qs!.NU];ʣKMq2[2w.ܰ[lH8uG>gMH"c%e4 23BzB/CI-+ DOwu⃜UW֫3!3 HxY[TX,}rSG3PP)!:PϜ$,RSTo| :QNJd !tf4M-78I?4>|xsv7d@!ĉٹ YlĩG\Un;AK}z"zw5B! !"+GqMx<WgݦBu61_Lf-BIy{z++OY!+)OWZp:J"$ D'ϳ79E&\l 5}PQu0ӄ:=650S쳳+Og>cw5~7&JԛYgWZk0CyTCeZo}<_85~K?9QóO#ǞX[-u1ra`wW\R"$ D'ѫG2n\V9aTTT8-`yE=yj9Gwvc!eu=t <5޶LfQݓ2aX/&OJ$3 6êhjFz|`]1k:Ky&6l.U *VV*=H}`@Mjzc䴩YIj~6ح`XOW ouDiUྏٺ_3. BDߞ}T4Ä~VT @aӄ ι['u˪2!DI@NW$^~J~{en:?呚l77+wf^*7_i6fTlY nG¾ikTj Ck !"orfUjrRT'!ӄo>8CJeA!$Rw'7ǟ\Fiye +s8{=hk* ^Oz<6 fs`HφF}?V54 T5 _T>x:o*O?v țn!Ddy4aS 虢D0'L Mu??}SQ6:>j7_;!4Sp[{كٺ4wdm|y0w?Ѷf}[K$Y=oBMG@-iLzDpBoϬއ wόDs5njòbޭZQp7F0~LsG=^ f P/*q+N_8}9oo:vi!>p4xRx2gSVjgʆV rX*?CBto~o1]13?!\vk p51HMż&<|\z6?7<օ?ɢAT5 f7=fg>Ç רWtzn?\*P8Ū輖wp 9{snyǽU.`6ݏw̫B' !bT `p J>ǘ ?.h1j)3%c|_w'o޽rcdh{aKe.4؃ %Yh>,[Ң_lx. 7]bBi9@1]%wcu8T"0h`S"aJ0QA1pE Dށ# ߔ@ Kk/? 4"T Ţ럝oզ˼&^| hsL'! B!D#=Q62N(7Mߛx_5 zu7!8v+\5QIlDHa-?|^{gj%`~pnYLD}Y] Zu[x'wU5B8AB]7Q ko_@`4'1QafUUm0aWkO gN?\{(Κ*L>RۚY V4 *6:iy[IPcڱN~m5 .>oWOwЅMBt#}_ **ݡ,0<8}` wWV \4;M۶{~)yy-~َAy\>fLI`蓫f TN ֆ`Xy01p`keplٮ=q3|@-M7YpۍpNGS"Q^{['%+!-My|z\ ߓI(IK㱇cҸ^lЩ{Բy`nX_k!,aA٪A`3 U9x޳شǟ\7k iV9 Zy"jl/gHamqv5qYmьP?Au PQ?-GvBinSz |+רP5e:G5'j^4[2~U[7a.pAf/04UѰh)8fuv՗CeüTb@U ΅ `fL#O{9k/]Ի[_DO% #q,~]5Ӏ$I*z@i?ntfN+onss79? lQՇ~$.[n?m;KCLrn8]i0u: 2[=_<~EA nAԍFCņ 1POrYƄҲ礦4UxP]>TnP MݶS7>DӸUg_!a 3&:~iYM9zDZxO`] `SU9|Sp/xǿm^=x|TѝH@.չ7lU~hߞRK9c 6]͈~F7:pnoJ%$4-#hM?PY>45oBE%,^:Ħ7%Y0mjװ %嫠cMK~砱DAkDp{oK{" eeL'ҟÍ6(Rۢ~ VowWΐDj!>ӓòY0 hszJ!,[BB6y/DfgW{lߙfũ48-p~/Cfheox{7pU>h ܳ2% v!Cm;cGIa뎦5 S&6kxlGAyp7qKxTRaρ^?f»a5YC:nb[0[V*e Uִlj0?RCyEelBGBta>Οup9Zsݙh?{3ZM&,[^4[lgj^zԿ޽`֌Q09>J 4! :0x~Z }SF\qq3-+iL?]uo(4`ښÇ78"|j]SGg~sURK'zf8crkoqϯuX4Lᐝ?.O.j2~/i0=Q̍/|̶FL-M#A׃| =xͿ }ͪfTɂ_VO;& ~Es HTZ(*QP] i jMyCJ2deVf;TvؽW}+[0 u[^ +?^R妝==%p*Ţq>$ğ>)$'9(plU>#f23BnA*jjh%y@ V|:W~;NB%>>%iq\0%'9IK<5^Ldi}HL8"6I]a?Lf@"H@._=Upy 7޶ ~T?~ en-14! lvHIRZs*3fLU 8 %õW㩫۱5$44?)hJؚUdh8tX0F >F?]f~jYSدz^0 ާ^6Cap|=㇗$ഫ}Z+ |)Ţqك=s)]j4 'w ={ !bDBtO.c͉qpiukߋ6uc8mBoƌ sqJZֿZ,pjj;iVrFfcm,oM p WRRT#>>z : Gmf u=C!ضS}MCA^+|Yt9?)[v1QR8P*AP\Ƣy#ahOU!PPxi-k l*  u9p41x|XUZX'7_x)wt ש=!!D% !+y卍i1FIӿsV]S{p5i<{4bjo0R`(b*o\_PC ё߯8iU=Kas|>uB !D5 |鿢Rziy L^ƀЄ|"ee&_.aЀt}a E%= M[lR(`g =\hZ՟+K UuoPɘfl6 \;q4!=A^ްb߲B !z?{|%e-fzu|4yg'_Wswi8AU  ˯Y\j<'; G#z7yS5H 5߫znkEM #LԹfCո$ 5}auLͪvlgt~l[1qfg(-[ijxީ\yp,Ǟ\ԋTKtHUEb_͐9\Vl0L^7gcoOV X,vB]Gwr7vv+\0 rM~`> +xٕ̞9ò\@-xFb N$Ù`(ܞXsY:~ySV @SU^#7=HaSi~HleΔP]fLꃡ`:m ͟án)%f +VCr25狘fjӓ'_3%2^*ԅ׫fN{%3vT.9o(SOCVf7NrÄzӦ^|jdז5 8G⚆% d߁J2d'd&^1ꄗ}/p ]$qu~jϬhjk&yd%7'~uk3䑿-?8yyn jLxKMJlZ0tN@mz\Za 3yh_^?La.uUU4dC#|p4)J .j7}rcRSWâiIIv-?wٳYR\^209T;̴h`crjV;?lV+'td2~UNfk{_ۏoU~!’W!b vCar<\1 ~3 aN.h\>2Jb,q Ǎi=oMR"\tػCa nUC?OUc\hd6t:UUϭUi`{scm8IM kM&*o02WWC[%,dU* xw߉f`)akAR+/'ʮa|:@8Oa;A!D% BİzP[.fƫu{Bֺׂ|_3~|qpSNbꀤĦ S ff@lts8IG kJXU,?XkLhZp@wXj 7{|1b@6] iBFZ<ٙݼB$a_8Ē'z_4|XS=wi)=A We 6m+^#:Gvf O9g𡐖9BtB7m!(mݒT; (9sj=PX KG+UmCѡ=:qWگgRؼ?6.;cÖ"d -Bt"Fy:w u6 32 Ū*xm%nX;~ H jl3ǛCfo 2N_spuցP8uM26Ǩʀ꼰, u*8QD' ^;Gci>Ϭ*2[4@M|w+^71#"BFzu%eu ց߀"+bɊ|d?MZ8shݕZ5#k=-\< tN!:؎e[@5/ X ~9~Tﴩ qɀ pSu<~<lWxƛPv"X]ﮃh`p|Jp͗KOcL@*I^xuV84$@}҃gL`.6x4\ӄEK;fBъЃVKp{ߋ@(|225F\x`.<%,ةF۶4Q6«+9oIǫI3aٻ2:Bt9"8T¯X EmL5VNJ1>1}`RZ<>RBF `ji0̚y&\p:VTv ho*o8 @[% Z2yW09 }p0w?! !I>ruM6hZ)kƐ7o&`؎bּmg)sBpWSSڜ8[2(g޼y䨤@FŎؒί*[[S6="d@pL!I1FM/{t4T3dS-J~X7ᬡalyy-eR x򫂗5w4}){'III\.JJ'mZ8쩵~$NVMT7oݭ$Yc͘ު*Bt9 1 [&vU9:r6O73 ͭ?Q=+vmR Y!?X?"YijF>@ UԱF}X-0kZՕMK s2`bu^L$> }DE, AҕڴBTcv)oZ1}:&ь͢J8[X{Ujk]3[zu^z}cBo.BWԸaBa5}_5_qM;~r.ud}To+j$ 31pϹ#tfP;`K~۝˘>!|>5'*IcXf;fm8yczCnZ1XJ4j4{zƦ|P Q!ٳ"/T^Yn%%%̞=  8怪(8o$1"m+Z>pwն'SS i}a4 jOgB41fCM3aR^T#ˆwZj7|5l<ԾBf~l[jBVHaP|E;U[ }Zؾ0}HH@mZf XdiG[*FBĐ{T> Fni ->i=޷zƐLZ_@ !:]TׄiTv=)N% g`6\5Q,\8{U*  {j'BS# !bȦTTU ce3LY-;F),!:}( jj|d-3JZiėI4Nz@ϔ 8Tqj jjE aiX!ABĐJ,'9aH@Qtvjjkݲ6:LIl `Ƽ]{q/jZbH /V$*RªPPNx] Cl/0LƧgɕP2l4*-yh2V/y?^!DPWœ ^'~ӛœ2ְzf̥1grz$3Wf:RM]lӦp px=?nr:o D!hG'RU}-H[aD.<5x?,ESe$9lu AggŶ[GfBY D+6m-dž-EIJG:Cp]ohgVAOTճa[A1Y{fR@xߴ&,^~;J?&n1on/9κx /QuB 8oThzf_Ze8]9*Bt51 )D۵[mŘ&nv,^_{T*pt"<1e`^؉zX{.9YI0=PUyUEcF\ TA_? 7Ѯc=!H,'$Nnۡ8}{22/h?1 )Dt~l^iF{j0v.Shˑl$Nݨ\ո9ÀݱAm>[^+VtWspvG%8aowgשXh,vI!兽l00/+/A !{V,t[x;~=#?X ^cNv2i*_nU|ٮ(*qƼjXK?~p|gjZWh遢z۪3׻MH@f|>{%u~@O˕߈nҺɁ$gT#NECCg [kZ¾9zu_ѦՆ>'0o:r*X[ഩ$q jm۵A!(^!X_<ĮGv8|Eܾҍa@BKElZ44Mp[޴Ay[ _-- LKg 8c²=PQ{A, |w+ťB !b>j]Mv)NfN) jo>˛Jxѹ9lp٩zrLUZa&\u>j^]*mVP/*`Wq|kY+S~jוX4ؤl^ !*IڍMAy7eVK"5`[#lY .|kbv"UVyBK6r  >zWFoV:lpe\2~/.h?Z7 SJ#{U7%&,Z58MV0̶.עg!9aK!9l;-cpͰ\ȯP g!Xr)0wbE̐aTn/B# !iklHX紇-gXP-M\wU9dLJsXU ( n|aA`J 4WWWBm+͢fca c[ -vms8mB'6$hfؚ\Tc(JU&XgVw]uMZa:w':^z}COK =X$AFBqXSp<9zA6䈨\FiPBHB4s5<謉aXU^^7N~MUDU•`:5#Rŕa|.Դ`hi}Io1#cґ` 8R_m,/%o%ccw{HpFEЫG $ D3yoΣOnc T>力_J5Tor ă=l}z#`ǧ lu*y뽭3F!DL;={xFqGgPUkDom?mq'W[Ųj7|]%?IMqr7`hcC!D$ !Z=sBM Z?YWg\|.u`;y5UvKnEWq4 z7lDz`rBB QBtw=s#a{JمwӏL8g䩯ߜku歃CA-f b( LUEժq7Fзw* QVೝ_Aҙ~z?.6k8,ݣfZظϾWi@mXwi|f C'0kTUaaIQ3QZo mįM^i>)wd!tV]ѾUEV6!__Y|:o;JٶWHzZ<}rS32z0d`&OZjq'--%Ղ+|@ȯ?>EP.X: PosFE;Z`UW݀;YN}!b/~J/_bwcʛUJF % lVzߙgljjf 8F$'\>&kqu$~W*RQ;f3etB?,/Bt[*33WW[r/qO@!zp;\ @B PRIS\b;jVﻫ3,˒-)|dY;3gWڳ0x޿#; b)UUAQntZp9d;H&'INӊaAq0uQp$N,fph;6֊kj*T H\qn[P}q9n(XD眭SO( _J,-O^# Ry2iG4vrbK$3FM~ǝ_3IYQ?5^U QdpEҏ@q&\TKuʠP ]%~{3q(p[D"!RHN^M[ys|{*9pi `c ʐX)N6MwۄRIaƹ-?ngG1pڏa= f~1[Ze&DZ'3x|hhy@n&ȘDN3b7g6(f,$ay\P!>˦rZSdPb}~UUaղ"~sH$$q`&]!juCD:јi}` o&Z"'>fEhJNX!?\"wE T^,?xztcGJX5"`9I0t;\s D"8WϾX=msJ]]h |A/lugT+mMß EW{-*eFD"uVIɯ$0kSJ;Nc-O_$4t/^5YWwv 9O"L- Ln+MI2MG3S1;'>xh<[iWy7fD2cpl Tw$/O:Wg at(VsǶzCBH`#m35vp_ݷ6D\".xvrG5bJL 9 nQ+v5 v¯^߇>PTZUÆ#/B$#7x%oyÒzD2H@dtX&t[IfBaĥ&Gw\JEk{>㰰2Iwnη|lM%HxM7RS3@܀\X^vn7lh{"i \P }1h袓 #Οfct7h5rnH$S)H$D{g]7).Lp8,X8r=9 -~#iR]ۍ* M)| tCԳf:v %2EU" CZ|E")h=Z~.t>h&~CpLm,b\5vLyi"c`,QYZi &in9N Ә]Ų%fZ|)H'RHE%y*>Κy9Z:e++c0y t8oq?+t|9]7rե=lD2PUwm%]AMlV>JBWWvNu \5DtWRz87$JlX-;Ԝ<0L7̟ܰD"LQ !9. U{n>vYYn@Lݞq8m$K0MJ[3N_K9މ1ƞ@΋^Q̂'HVʧ?rј%1 pVx޺V̟nEa 7C]CQ"#o. ESW~zI01QN{D2KR^J c'&Zs*;( QzK!dvձ;Ţ7,_[n\1vl H5Kg/Lv6nfy {||A x4 TVXR2';inTD2𹏭W >—>} |ךԋqRRiEQ_810KɎ:#%%S ʠp=cK_4?﹕??t3 MdacU\V4K$ժ?]|D}bw%K?V  %;aCSD"L"RH&|:Äq6m=ɮ-,YoZMgqknט7'c':%NǥY b :ȵpׅ}5)EM8-s~[\~z3wq).^TG ((ʜ["xv K]W=EEݘ5>Ù'Wn'J$ C akꇯrv6CQvibV-,]5Waݚ2#;qekWU03E;b.By%,+5WDp4v ~W\R=C^‘8lI:JdYD"I|s+76qk͛I9ptݠ#0 גH$$ $m>9]9-Gt;tl yIlV Ei3"Yed;qlX,*n ttim죺{p4@ӠEVut4V-ISSM)c$mK*tvLSKK%kKc`iDCwqZfEՎ.)H$$ F.^WCs_uG#"8A,fhieρTUAUEASan?뺁(C)6ry,/yHVMdz¡Htb5M0Ma.(sJ$nk[xՆSzDQ =͎e=DU˟Ny$L{'ZD2ŐQD2I8r.]9^yg_v[zu!躉i|EiX,*vBA/2;-K7MNB #3ZeWD254/uxaS-?qm;1 X@ӄmjlyn*feqb.ٯ>>R4Max;8ӟp;HEgDC 3D"H@"^^$CO!|6unMz3@H[I$$i̒5t< @QHew$dRw҃ םR=#Vv'= uD"aH@".\&w4L,0JidK$4f- 2&V-eiA  Ou%#dSQchJxG/n@3GK-Ѩ~$H$GWwk fNs"`_"d Lc ӆׄ{CBL_T%bId%dapX?Nl(͚t&͚G.Hf&MJ"夳+(nٓc"\v%72 hLfH$I vϼPMu]7^_${q&dMB p FЧO}˖L%"dQT.qC܀nX7L2~41@PJI$遮tv9~6U9މ?=umb:!'0-u\{|ID H$)H$Ӝsrؼdbʄ&ϹLI@"H*HJ=[w4{ Ahjd*/U۠MDId8m:~멜5H$H\<H$G$s'PࡥOgw^ J,f1Ms`=]u$rƒH9u7Dyҹxڒb(BH$ɑ}44OiM7Qۨ? /(ɂJ$DŽ()f}N {-Jܫ*}BUMx71q^\]\qI{Z].%p3j8v=[ɇ&9Y b:3D2QQph8Li8S1Md D"9kTtvGG|Q6\+(d߸,*ٷ]7I E;EY@OڅJ5fh)cn?7?a+f#] % )>\_熫cݚRlJ$>'ٱ[h * M`VeWI)RHf++⟏?HL_\iN\"HFvRUu󎢠ep.(}ב{zsVb;9mN||w/0W}m Æcȼb?|)g+c}WきC1MGcy^w>`U)~.df`&]!Z|– ^ȄZЦ) , NBC%ۡRR)tkUJ4 \9L)2@",[\>/vM?YrvH!(.K$$r?}RUi1#mv|[gƥKwRߡ ǍV6au!@/Vt4ce(|5}X2N4T샤_o>@%i AӄOs?O=_oZG߷K Ѵ.H$GUM7GuPU]}5q+)MS i69U554 E!ǡ* 3H@"̭ ((\HJ$4-u|OqXV ZY_Wz.1* :FZ pbC&,^[`G%7"KQʧF;L)D$C[)*2/[֤ Sϟ/{3_"L=tDm7sp죵͏?%Չq+];YvFyƼ, nlJU7RHfs+t390]IaiH$K[gꮱ/hŪa/Ž7\HںOubPշ´f41A0ډuqqo Z4-' =~s'e4|;0"[ Isk/?Wx?GRH(5u=lȖWOmg#-x|aqceP*| YXk2So~ l6Tu[\V/,*:C32H$Cm|OpDש(+5̫̑BDr{'=΋ꨪ"XTᶟT)ϰB+򭔧kS"O$yX,*X$W)Wӏ H0Q'a-H^/*ϾX:_Q}s,Ynf}Nܫ|_#2i( `r* \VfYvd[2-l)HE^?h>g㑌`T7IZT2gy@dap{hHnZT9e(6˹)GFƥKɸd M:HdGR?ӄ]Zמ_"{$A!:>~T98N[A  BnE8HCrY$L_IڭsJ?P ˘};)MY:p}{aOc"fghȷr]E6J^{AP b1L/B1HtrZvI$SR]@.?#z`+cNWPD1cóQe77];5+΢D2Ei lCGWpԶ}n, 7U:yy2RHfhehQEIO^2h{I^`eWDrqy(z 1fעe&&Lg3TtssB&@Cl3Vl6R"9>u'jG mB[r;w,t6# &HfP>"@6o_._w^eM-K$&^ݔtq.(% &#iN߇ -Î&kẺD"FvoIz\[)|u(s,4M'JwI?zTO#:NK{s2I/tNϾZVn7Mظs4:Ԇ= l =צa~渚$BGWEQ0WL)Z4E*:z!+ժQT6IH$3HD{?̽^&6ǂRrnDQyK7zډbF$DUFl2\`F$ù {ySYevWch[]Ám^>猯#LU{B|/=|$ۡ yy.4g!%d^cidFWBǣqv͙\dFbʏP8y{QiSL(Igc5д#:^ohqwP|&0 G! &YׯFKw&=:!אH*~v mUio[Hf]787$H #42S" ӄwx^_yGQX\|V`7H9L4$fB\ ;=qݽx7$m,g&8`+!3h7N ml}%k]7o 'Au)ܛ(|ߵ)|=CFo!Qj㯞rlu>Zvx484ɄeK8* Qm^HǨIy?[I?ұ!іHWw|DzS4.>eC{yϋOlcW ݤ;r5g |,LWvX>& |yOd\kdUz$ȭvt!ڂUXD2iiR[PwZ$Exlq 3cuaD7/5DeY<<߅,*Ǻf_<ť̀8 HX"=:@Sð!a p"R^4&tXȑH$]icD~4e3_x)$R'x&%ȸUE͕ )r Hu`sK# 7OQ*"(p:'hC%; [aָƑ n%eLiP[a D2UXT>bDa~.wn7E5>:-wrcx%JGpW=q8aQ(t,ʱ|++^;,RH1=0 4dx]7x膁j(-N6drp:atJsIpoCs;&t]'0B}`ح_nϼV}^~wO%jhC7U~,HC'=OJl*qq:+ִ0L}-N\Kf&]|{x\dDuQ>\|dKlX^K]4uu啖(q:Cڂ:;cd\j8;kiixR{(['l_3kq/!\ۖPso3U],_Z8וH pUsY(>L 9ť6>&uũ״%i%iζcT9cw[#q:I$n5GW0ch(MR6Ȱd*NLJMeQk MSphiWq[r*dgQED2ٵP@  ܻIԭţ09;oɜeM7`Ih&=UA;߲|mm9>y4ѻbV֙>bU5]3.ԅ׉as?M $"1?n?&Ӽ]P䦟uǂܺnNZR&(+g߾_;(&"&̖(Kl<ȰWq+ `&t{uv a'NCNW 7”0fcBTze$,-MQ0*H`U q: (X5 )BDPxEQMAUQ`MUpZfUpYm$̫Rp =NM=MP6|w&CR =AnE1UCq CIEn_~t=&X*_?v1nש[ M>|=vGƘa ٽ}ZyჼU|k̐&d>?9~PLX_pu+?ۏ ޠ%'mX-fU6IEsc4tHncL2\ܹc+0] g[D#AËŒˎ<^t$d^Bݮ&~Ѕ$K24nv>זGswrh@TTm#,α9޲Ie#"Z i QäWdNWΧb&a]d !A7LLL Sb}!K 1|_ GfFo1) iJ@"xœA 3(HNh$љ?j;_CX37L?#·޽&ͦ_ȅSG9e ܴ3]:Kذ[ HDMwK[旮UI0LZ$in.,7cZgQ^RϟK[ 2hbJ虱8ݏo'{?{DGa;(Ӭ-/*a]aI|8ɷw“ 5) N)}-餭]@``{iUTMŒF )ɸx1A%'W:ޔ𻬪b6.X5aT!+޹[_8=c±aڢi˽~V[1 84YfY|aBoԠ7j⋚tAw6DL`ܤ7jL`$ncO)D7LTE3 ! Cc.U 4hU';7fܢ` /(_mP Z ^XPg='aˉb8WeE\tAycVʥҋf$cO㟏f>?:epD:O>W|s󮷭!;RH& ʎ=Cp%hx8?ܷc1%CidN}G~۞w&zbu̸NǶxJٗnӵsް?>YE磇 yMwξ_ݷZ cN|Wœ65Fn? :%64AUD=f_; ḉnx""cAX@D7M "0B 3LTD05 MITD2mٲp(s b?n?ܸLȨ~x8E?}slv߹fҝc1xis^q}s|iBSK/ڳ9~JY 7@_?b|u]7 Ei^^7,+R^,ˎ=lZWꩪH!(ê஋i5KQ! 4 ?}1DNMY^:=\]:;鱺^/?*VE#vk :S ,(j_։fgº7@OEwrUs'ɆkΚt[ac c?/l6;LDpثԫ|}"|'Wβ>MU2ΒvM<x LCto,MO&OBESwƐ8c F/ |σ4k'w>BqQ[MמNX0 zv6Җ:^RGsk/)v S(` ' ҡ4 5Q0JP?{-Hg+fx `|LSdlr'/JJJI@$SU?+6Pॣ+@,f-9mB| u;q~ )ރ7-1;>t9%h /1M|R27E``_-Qp-Um!uJ@n\@E dG{ ݳgP”GٮI Hzlhd'M.KKED+̀]*n%o,f?b $3`(?OP4݇ݎb`&P`( < w nE4EfB+~'J ]R"ᾊ;'jߨ]irr!~' UȩHN{t?:n?UAsڱeyrro]Oe'&Z{d۸ D2p-Z^ĪE|cٱ'jk /jPTmE!סRqAV.(1;c L3:l82+ߵ/~s _o&#pV ÄǜC[$>!($υeebLk\Ha3Tw$x?~ukJY0?ɉ`n:\D7!O~3_S/EYr ֦-^ lw:?|h~8;Н>"|vo%%D9vf4NoĵJx{`bÆ{YrB'YeitV{W+YO?*'?E8ț9jﶣ &b0z L7FΟO#hg;}tg`>(ϾP-d V.x6_<9tg_Mu8FWG: L1:ۚXTLB[cq56ZȴPM)H$ӌ=ZiiMz_[_xUk{i|C_CCͧ/9 6dJ 8"@ZZ T@y<Ե𻍢B؉.~m㛓*OWwm͵x}U7, 7.di*/] Wr1M& 6F(}YZYp^\8fM s({S?ZXFÎEN8SREpI6ޖ`bmwpK|SƁ΁^@,٣ v8; &F(o!;h9ʾtYWHU1/FKwoK5|scGD":WZOsk/lH{G`(yٖn !=h4_C5LJSeQ%Vd[Qa[RHj IfӸ ~ױl^̺n53@!q|*QsRz/)駧:ELG|qH]=bl׌Pp/(:/ӄ GƔ@D7 /MBA%.%"/Bd?}N$ɣO9ˋ'<@ ?u` =M~xu /ȓc`Venf.ȞfmhzE{hsQ\ۡ(r`Y)(#8U떊l b/~ioӡDG|^YeP2\-Φio'>E'W1<o42,uEQ0Gm<ȱ5d߸wȔJh( Ǫ9r5+*kvYTۗȱN^T˖'9r>;7D@_gG EEJS,]cnƬ EnJy H@"f^^9<2`]zI@2 U ;~LXuϾAýaxl// _FE/_o\5|^>&Zԕ D&QĨNq00sy5?LA 26J7,8CQ"fU<ߊU<C caijU|KWNxgW4xQ;x}<0Dc:PX #qb1X\'ՉŌ@=:.A8utH]rG:9ZɣO L4M0L,ai( Z߇Ţb }`i( ج*~TUjհh*vŢ[\?v[p9drpw-*2xŚSQn]-'BT!"䥉.oP^Q7(oz:6}lB]YP+ZCs\;gD޹^v-k͸N۟7>ﺚ}&êuS^0k]!``Gpj]ۡQ~~E#M='Mo{&4zpM+'ze7ށsqi"U  auG#r HƇͦQZNiBnq! m~ng^\ˉQK/ Ì&8_`. Ub۪fUȲd9xTsjdrqE|O/&ㅒH$W_F'DA=}:dd`(f̽ ÍLCԏL">YUb+~Ã~a1oH<}ȎzL5?{NL @I!pƿ$b}Ed283e&d9[㑸x~z(⻪4UjBPי;U+'x4v?n$}x$G ;H[GO^_/% ň "}q]J !m3'duaw sQ&$>~A 2 2(( v6d9)w"'I~4yn.vTU!+)'Id:ᮋ¹_4V<|BLO0@@EVM.v \O7rYxyY̩C0zC|ϴ$ADKu;Rʶ3bj6 &CcB 73M'CO@DLUP6dDat Z2 K4af<ްl(L2Eiqs'.Oum7cO3 ׍Nw߻'P%{X`Q 4V!)H$ӕ,ǀH~N.&]#=O0{iHX8kV&k;gJb:tr(+<ZGzy0;[$?Gbra豽sNU:ugC (yp?u'=xtt %ĉE5/_,<6telO7%by |ҷPEEQ MvYLynrsv"3#OxuWمSEs]첉 iSSDv@M*ln\ޕ0oM=!%xb[V}vAH+p2귷m L̞n?׏g1[c 5*P.[{n'ه~j=e&MT?~35<k~&s6w' RUͺ5I)H& E4 ӸY؉.Ntp5u=7x"сLÉh۟UK*h0WiYm'bޝV;nB/q 0a -oA:0*7t~,CñpEɩ}6U񮀁P;P0wav&׷ V?ٟ28xP=0MtH=bPP迧9 CI5@ͪi@FV n^ MlB tG7iN IFuޝ`4頣ʋؔ{Eek(r N]D%Z:_QD[Y8pAY:+Pxt1 N'Ѧ.fNyI2Qf!mzٕ QlD2HsHsۘUɵWlx F/5=䣵ݏ!7nzL3SK"Ƒxau#B1ÃH.Rc$v,|MŵtCoWsy0 W !jA_\Iɲ\4ܑ}lc){=bo EUZvE*n2P;QS(ش[nQl]6V4U{bH-W{z'-'9!j_OO +}T7;- YyyVBT71`0MBq݄H\Fts8n3L&IDa0fMzf_cP$j栞^NW0H2H ^9 n8o3n;_d_u(J!Z 2ɻ].JEEdr {(C(`OQ /]Bo$xqTaXTX1 y`ח&` r /OOR4BQ{HC's?…6+FxxəiیaHd*bHO1" z0t:tvimOGW6!x1mEѨaTӏ$ΑDR ]Qn=[g[%E{ qRJ>&CqR~"O$A) ̝׃kD ] aWY;9ƈݼ%m0#tSAw@ ᄛiW3q ,8nUr(@]d_LZZ} .[ʛVMӋr:oP Xd_/pU\E%6֗X_bgi_4M};ިAwؠ;d6FpMqa7Ĺ sPIt0*5Jcw-9?P-*s2H/rSKgg=zz)3lT?7gEUĎzՏ=uReej!ۃ I[Vމ}qgvq?f?kÚ['`l?*L3.^y.~nB8 =0:t<|"8~T&HKVo2SQUі螗 Mz]Kf9X:H]0QT2\μ>XsӉ j,;!i(.v,r /'C¾(Y[%k{)=^fSXghm_NsM%)kӬb\2N?z:k=;;]9.6>ǽt"&{ux*D]2%6.-4J[zjGI۪wۂQ,,x#"EM|Q7bBAhx#IcN0>PճaVnIW-e'GbQ&P$ܹ:x:nb'4n+<n2a۽W{zuh8L7/GFyxzCרs"oa#c<c+NڹKK@"hYp-c/"(2t)H$3@ hgACXbXr3P6` ?֜ (J3a+d[H!~&u.9STvʄePUχޅR\-} ݠdoDɈ=A;3lMaSm4I_n>>gp;>gywTb.'\WqWBvG{㩂0wWȠ+eW[{+d;TZX]`,DdaQE/J D•xψ̢2\Ջdw[aY׮:cXn2K1xX'Q@s"ȅeA5m:?o8gˢ"Ѻu^qP)*vק6QN}y|kW&8 x:yRDH$ z `zc, Yݘp&5nZwg06&?; LEG_b!3,ڪ aE* ] KЉ)*(D|+@CV^{e}(y/",y6(n|;F&> >sG;?0$ u:#8J&fYeK,i仴sE_ቈr`'PT*  ld2ҵ\qAh.y(dt֢FhV{5Qik|p# }[F#)NYᙃ1קçyڄ8 >tvn}D"QH@"tvJmㄿ($*Mb;`SDӗ|NWPwcnuJfY=)ՌHF8/rsevBv&8X "=m i4Dj}p {Ew8ut ᠺ3,ѺleHvXR50*dEmޔBm!g+Z?)Qp^^ɕ+YmZ8 McU; a-2 M:CQDyX&|fgX8/ª-Tfj8& d mlM'`T\4.lHw@E.TÜ|!900f }Vp.xLj?H-I./923: yNvl X51Wq݀pX `v.h::}Tۏ }g 2409Z9'+H$ɐD2GS7nO\ܥ9p-&xS7QmT-IwV%[r)|$-,FŸ719ߚ<_^=U`  ' Q r!;K|D aw%Joӡ 6MBK?tC1'څ !W@AUT@lM.YT%jg/+ge vY+?:Zk91>wWki džqCb:u>#ش 6 \eiXWleY"6Ɖ#)p8-#.0L:넢Xva .#=LSc!G4E˙.(ˆV#ĂbPsf@~wE!E_( HF(Jcm/LUKEɳ" 5j>U!u n/K59vS"HF2}V`w(u i0򯿝^_''\DȻR<vD{E%e_S1t.#~{%՛#QFP ɾaMBHLu)V [B=$v{cjIu}H<Nj jm.H_vf0E:GH'AN4>2 S#K&z  .L]-aEEiŤ]STrK-fˉc4mG9c۪w<;{c|MQxyrU#]o.?w]AP6'M[DUސ:'2ɇ`jx~.0,;!9'*:3!B PE3CP47^%gtL1|Om>LL8Bxyp?["ʩp9+tOÂ?eGYГdݞsD"yM#d⣽#qf(\\NL =af4 % GOu̾?lv#Wޤ*g5{xY\ R>]aɯȉ_59їYkaw4Evʥ$5{HpHڧqNE0˱tC|jU*Dl ©>!2qnM?4QఊU/m~ļ#0Q~UJd8Qn%_畝򒱰v_ĿO1ep$NW|v$k)H$3UtuTei=%Gpc-maص#NmIPlKnb@Q&3VGbTmHU oߗ a3B1McZ-"X\,l'nw0;C㺊s>Z: s r2 3Ȇpۙu^+w^ixڼt7{hvI4x_g/0iqt)tm]֊"d=wCx}SUªB+o סr;Α8zx#yƍ@%d"lϐ`?ӨXU* )!dȷR|0tky" K4T2Xs^=i06w.:H*t[_DOx߷Ϭbxٍ8Œ9)$$RHf(v4-b#IweˆƉ'hs7%=OJHT\6i9aveVQC[W.fw]\M?Mz 6荞&bm DBGx j _( -8j7s=-YUttgىi4uw9cgkFN_'7UO2#hhiN\H;>W.'؊s״{]o%xx/insݥ -uMOaŽZxpyX,*wg<}g̭!H}((l ?`"x|9)3_…6>s~ٰN i*3-TfZxF :CU8GSc&INf$F<÷0-GhXrұǽz.(6 f|[3~,}畊d2 Y4Gե|kHݯ]CI/RwZ6Jzԟk%ɹC   )MTSgWX4!&.hett3O9-EY cQ=FSEM}StX?oM(Ds?GB(FE)_\LCjtCsanرoz+?eQgb3ӮiWe q[D=a7bc[K*'bH:wPM##MW"Mcơ | \0+A-o`3£ ƗH\n~Pw3˖fP^:uJ%C  d+)-8.;F_XhK79?C/O)`{S(u.%&7ApL. \>4-+ai ܿ NM'd9T޾ɧפQi7r7|28;v 1EGtVi 4MLAij*Ex~u׼2͂GKdY(皾چ3BTLyi ey+uS> ۑ6c-EQs^՗U}BW~^4KPﳐH$ 0{B8ܖcv>S2Js. #0ꖔ@ci_ѽao[t[GMr  S^)6`ff"v:/+i-bd'oGNX5~ߥ̿`Θ= ?4OI7tC78yF^h"ʘc\*oQv.ߩ+2̴CAZ+@MR=?5)>v1KJm|1od}^`(.~y>>sVM [bgYpSu >i#-( =0fg9.o^[t[便IЇݮqSH$- 0h;E+6U!NY`Iǽr}"3ſkW%ܷ/uPo_+KY.xbq6bբϤٯ9J/NwD7Et&v2fYXWl㖹[qY=cq~O(>(‹O\2V/?lJپ+zLc{x`m=t5vs`cnʺsTiWҺtmlk2ƕ*PYShC+\Vfu8- m+`g xU(1c" "۩8@E.dT7"L:BG(q zqH$RHf=}L>$AYI[`ʻR=4L/s }q?5 6ϰ*Nw_,\%Su1BMGһ v h do3u95 َ)pnW|_{#yΖEq9 `/!IWS} ;/:g4vm& b~tH6ο11 rccq1a׿A;5EaAl<ɲ<˄MTE_m-TRj=#?{y?̠cٻ(6u7[rk%iv~7v$IiN"q].ͪD,x6.]rV X`=|L XׯURJ 'T| PmP!BھL h%YK]*R^yE>[ܧo DO̻>cK\5-Ul<'9kvx {lhÎzӕyidEgf( 04A]P%6jڠ)S^ş=6BGbg}!TFWf/74hT?ׯSSRpjPz*yΩ#ML)k抶3_ Ex4vqq/HЩ~O훯a I_{5'?/@\rqLE\vM"kK]P -cq:'UPWڕh/\|li/[׏͗"?i&O|?o&Δ@T'ꗈE{ߜM/=[M 655b4y`V%UoB1xu+ڿۉf"Wܶ{+ڢܰs9Vנ/a spq@,Hق^b݁×!rF48|G?_9xjlS{J_v,9.c4U*%ǧ$=sԑNk\-k^Tyߌ_SdewyŽ4s&O5[+ |rd?ɕ(S߹Vϻ) >%Z}\\\\'n?O&[FkTy3mGD{nK?ɚ&OzGmXfpz@" _FpƳ'AuYX*TŰcFWs&~|xnb/\Դ#L Vwg#ȳ'; @K{L JVD F `8`j~{gˏD wP@8 Q}@x i"|:,# os z44圚s{d̥_g;&\\.F9|ZG[9Z?F0_??F+@v SJ.}F(r\,n3:Kz:ş<dܚ2 p3̾#s!ȷ)?ؖ=+3Y!%'ڹw?(RpUW`9C g7}A sWy]PtGU?_ 6U}v/AU<7 LnR2|&\\.vs큍m7;QSA럽Os`=@ _oʢ9gر>y#ܰVF]@ F [$˺^W-@+igN&ͼSZ@ x}~st-9 4ꖪ5R>Ǧ**׷F'ٶĔ-.υe@^BX8533-+CǷk{ۍT\Omd>6''$QP=.... 7rSHg7 AdF<x:Wle;xt -RڨJ #]2ɢ0u瘽ᾗlGCT^ կmYDzX\)Az\\\.(.³˅E>os8e -UW[J '&@Uhc7,Ͱ"P0 B S,QJ#ZGeC{_0=Ӷi%#dyoro/~uǎħ=ܶBe1 ]" ӑxd \+Xxg?xS5j|=5w$+y︸-eXz޶e 3P&"Na:y8zW{!Ue5Z VȻZ0,Hf!XZmޜ @ǐ2*Aȣv.6}0Y&pկ_z'w,_}3 ~^yܱ͟- Rӝ* \r}$ECep2me9 v{lz@ޱ[1֗x neVt...8c8){{1d_˷nyj\E==qlx~RS~Ocd,1CePM~@Kl- P SmudCP zF VfUy L!SuJ1qRgd%o D#ac5Ezlrnj<\%mq1.1L@^J/ :{`:^΄xj#DD5\RΪAN4AExjr|Vt...Sxq_taT޼EB~M˩߿ӟb'24%Jnxf*- N<ǀO^uߣ]h8~Ty:y[wMc 66Fv.[ھ_Rvޑ& J 2o+E@W= W;/օr[ϖ_ҷtT,>p0/Swrū-VGwH2jhF(U[̬97U^肠-/ [X%"C^<9vX?Ϸ#S MTqU(jfVNLJ) M,qvBY k9}*oBHw┑'u\}e\smj5 \h2CI)pyujgm`$|.tzRNUAr>[*AiJu6Țpċq0+53JKf(tuHor6p..KTdk"F+N@x o'z62N3| |Qb)57y#ffK%D%s5ܺpcpj].krC_lW®$=%+# ozA'{t.{6ߴg~<8|;$c9xմmj>k?‘Q(tx?B")2rSmGu`8U!XW+`e/~I Վx sf$(B੯WWtb8mv۱c)5#$Zy$....M,ac;boUhEi6h+0FH nO$RH'oK/{R*{o•֍sk ÈG&D"h,`oIiS.zݎrۮ6sbЗ}p^P:GzՇ'⇺\ k롥J% /ucGx? Jl&2JYc;BʈNfB P Cs,:#N"YڸM:/9{4{\[q9Ct|0lj=1E81 7ua21ēGў=MZy}ۗ/R [#q=ǚ,q};r?W>k{vhXU?4{ zײGGґ~OϾ$'G8yrã XǯB"!Vk ^xnU $^ISY*0}J%z⥧H$ C#*1V(QmGzawR Ђ>*oB/YQ~S_N:7{<Req\\0ɖ6Լ x_݄uկ}{ݫ v6{h=iJFr[JR1NQ瓅V>B"5K;ݳ y M"?^m_{4^xX@]N񱯽,]+}7 t>ޟ7Z}ȦrL>n#~54^퀍24Es+ }98:.#&'OA^eq&\\0┉|ɢd0> W}ã?m<g~;>Y;7n'Qc3۴9B+@q..K47j?''}=ΕMZag <|U7)mћM:a޸.(3;)l/bŖ)I_߹]H y~_rwKH,{:ubU ֑R_8C<ܺlEڢۻqs?|j $sAGjaC4D"؅0g8=x03'C{j:^;#cIUt&}zȏ5=@lhMQkn$B>&̚&ťpqY$y#ْ ]'i9ޣ쏓]zu} Vor}_'G>SZD* /u/tvW~@ IK-v<[Clw%JR"3&PPBxuA$ &,iLv~]pCO\Y}&:=x5ށjKiFz_;}'IԁNqa&k7v;.#|}-sI P L=㻸,Q{d,,i>֍34f =VE >yEy~x$Ë}&Iӑe =Nyr?|r-Dԧ7O'NK oK$Y?s4؎0o kI#q,G07?hb`'Ծzx %v2Ki2Gȵa #<ZGp2B[WmE_(#Åb "u3˹ ŅpqY<#/ӂ%kjɍ6邠GYn]_r QkVyj?]ICCM ZJkJlUM^lRǧ/78|a2>}ӕ4]yӡ{t^/[~5p2,ds嫷tϙ)0#y+/`xêo?Ioh ?rd}g^B xbU!w&xiBJe(g6"zEk _b@m!)=|&\\(݉UEos Fu9ޣwCޱU gKov湺uZ:,swXJ 8\cssLY㻾̕Y qC?pU/.=w][~(??'ru';-aŭq)ǵ-^j?7_Jsr^DO\/ sKo!aCb- ajgl쨦;RC6"v... 7D9qjbSW8|zC|(&Sd p]<1:8@ާƟ'<ߛUH 7`WJƳOe[$*42n|NJk|)m *j5~1 ,oY7'sXM9%k: W oZ&0,|4H ޹1kV%YcJZsՂƥLIx;$_Frp..KXeփlGBkm?.u!PӰ%+\kR0K)'Kヷ;0`mMYý0ҟ  ӺUus+>Vٿ1>r%@B5^v6OUT5Bޥq_謈f%e:66IMXSepIƔQ9[]Iewx j7E >?6 :^Bߋ m[^O`C+Mlh\Q][~טLⲸp..KǑ$][&H9`'t b?{)%m!:tY;L2/iH_ô׵x\kcY~v,Kv$g¯A{7ҼDunB xY[qlw?pk-awm bLRk`y{`X9sc6$}92ģ mۣ##{oY@J-vHM 4 =G nj#c nb `I(ۄ@S[j2Yeq6,A2$Se1x0@$ ;v{M|`?(=u`i iɈW͕}c6e:HG=m-ϋt$4_?'QzX#x mSmaLSyϒ$^]p2wjB{cs<;glXbK^ |Qrq.0)7RJw ˢM,A9T̢Bs~NgErWu|z7 xϯ4r( ꀚh 2_W)ǑFx/_E-ƾbK3 {Gα|++"{}ar \v> dt.... dM2L-0qN+7Rhzi/J;j6Ofx._"3]N}@ǯ9t,_^+|`g{d̉:HF<}>66s;wrRtw!o^͔EpEwl*낕g e钷%>Mo"oVO[B)=ΉI(KEcd|Q7.a>yext.5Ty"`asGwǫ,^}"m}&?:>Y^kx le#7s'[Ƿ8RJ޷oޗ9UT{gM!}:!@CΘqq;`]I~3n†.`E]Y|n9}ׂqOe0D+ʛHG㜙DL˷r=FYz֘<_!^OȟUok37{\\.V#9` ]=G{GXA(!8Oxs2-YVGCQ8/y L$%bW!=Dc7NأI".^v|p$SVb };i yT:ƚ'|8]ɱ_zh|#h6-rf0V2@d#x7P+i|M׵4㛎~קk)S |KIb,_ |{9vrd*F:Sůk}K#\߲',EG۟">;AOoH4#,#d;G*mN8U:J:D~KY wPpLzu C3{Viam-WVam-[77N4.e {>5u1b-[;טZqVYK1]>OMX?n3998d7$mg-Ç}]elR9 |P=&9kQ<>(b+7*\꼪l{wΖ_}P. sEio 봖0t8:|PܓDrTr̫ VGu>=̛SOwqA4j7KJB:dD,N,#{z'9}thi+^Ϳ?)9LK?# t ,DNߞӟ{^"W*ThiR<c`(TY vpcɅ3\/ユ)5A"쥺*@MU5UA~D*|V{T&Y %ȷO_{5i\:/HG)3_9Ё-= h>}uc %m}De~m3rTPđp,fOwHYe5A2Ȫ˸7rk[5I&{3I&K@0״x'k+*] dw(79jj=߾CJcF׹Ohτ#xOمb?C OLtMMVPJ]iѩika:Vby[mpqYX]ja$#R*8XI=+R{N ;'-gL0uUuXؓ^<gm]k~menU.S)K$ꌯ X[e2y#}yS[HGNx(m|\},Sf돾9ĂUAٸ/} /vl c?3m9Q4nYWg9G&e\e?C E /D!}Ȓ~x?G:L%hWP53? B4}svuxtǠEK@{50@ct􏧸_xBQ )3q<0 SSp..K/9>{'띅SofޅtU@Lq2y3O*[/&`[M%URGG2ܽ7ј-%>[{S+ [JҒ3E9Ihh!ҧ˚#y>HдUBՑJm0Z_~p..K.>_N ]cWwߢq_Hz(K~,F˧ ^o>X>w$[4?>'Ma׬AUe .)S2uԉ~\3ux3ϯNȑ5B4CUۗs/cMi*;/|<ґ׵xKCMNV jރȾ.gXޓ9s03=&3@=k ~/_#+|4eI:քófDWrեdrL@cm_F;nX5M d^ P=y7^|r!sT^U::GFk 5cۮ<7Ʊ5E G+WsM5?~S#6R fz6IS9d,IʔXRKIT[(l QJ0(*BOTt(Vp?p{,DM,A+) aw>I&!}dO1gGG",9n;MoLpD/GҜQp6o&/T\. d NoUʔsykC,6aZ6PX9~Vޢ}i< .1գoZ+% M q?#y]=&8塎69[.5^m'3CV3iO&ɱ,ϣ'njj7<BJI.$vtD]9GǿiMވQ5Tv;2hds`,zuϯmon[csj9 ̞GKޑ e$[$/ ȐEl$c6Fr{>]pY7oS#Qaqh≮<ʱo;ezIA-T=6KShcʔs<˗x$?iQ,Wq*W4!q|3>j7ju+ 3DZg<_$Am^K΍hs;6Fdžw)ot=(3A&jk#:[/e88d4bTZ;&jz/h.04^ FCP:]UJFO`hJ8*R.XVBw..KMS =C:qv4R/ğ#4:h*l`rAHCNݮ?=ὗxچ[7xGcro{c1Lޗ!qEWsc%v=^M444Gt^*J<~#y<#ԓ,!Xmp*?4yOꏋgjqY() }y=< GQ y4A_c[ۗ};NmɃ9mw'dI(!|T.o5"3~}a&3Md'3@:MDW.xZz^FtE#{+S]ߊ {z..,hG,XmpqY|{{ݏdJ ɿX^fr!_Pϟ}̡ι eժ?鬩Ð1GQ*޴>1THޖמ7'6x4h lpKguY8C"/L<7`qhȢ?eȘG` Tn Qz׷xX!e#:"S8*ӓR-$OTEG-F -14xc˭|ܺGSX/mR~s2_J$Cѽ"m m^M6:!ؕ@sctz'L[Q+7 DzIt{~dΜTE^C(ɏ=!}z..Kk O<1|gs^Ow9޵)ȵ3eyu*U99/6 D .opmKk=UN6, 4 D:`}M7mS#'6Gci- hlJ5H)'H'SU#\!eJ,[5y/OPFJ c  U%Z55M^{Y%pp;XS#6nnjMRmIЩٰDg?Rxi;OtӰc'Щlk \H }OS^仆8Y?J)_ـе Xl΢7R6Ԯӣ6n2KG֖t&lv<ޕɱMtFVBq3Wl.S9[GLI h^`G6R֯M,QJyȂIweB(U3~MrCҒdLAv%hK@ȣҖH=)6iQժxNG Bh'Q~.ilVM^ͭ?1_c[$NE1WUP~ѕۭĤ8 8bPH‘dc oLgLJs| XKEC >AoV2'n:Ba٧ތM3N&`TWWGңf-::\l,%ׯ:OeMc\xaylR$c|RI%IISsr/t$YK=>mIL[%B8vT8grqqܟ`;S h]ne Rv ӅTC{g R99&~F21 q0NM$,'KiVT*ۗ%><\ő4 Z oCKx-A#9/˛}~/D!P_M|u?===0A)V N,E`hi voS!98zis wܺ,"IsclM88#C(R4;ST@~y[-Rf,$Hƒ 3Y,$xN)8Rbh ~g1je )bB 4qF6;99=uMI5*}$KN%:!eN֖9S&17E[M>^ώzϬ{4_jrUn )$vy ezS6RhXh 4T f*#O+8j fp(x<2U9Yh8<IC"c-SkƤU\a}jjvFٔ:rD#K!t OO&״ᯎ,A=}t:9<{āM^lAiM#@n^:gTQ)Nr-+ol/'Ԟc*3GsHyvo..K[nX#OcYJbΏ l oX(V*QJnef#)[$ۗfx XנSE3Qm0Tb ɼruiZ+tlU~.o[nl{/U޴MGC&)$MIOR?R1OJ,0T@+i Og96 B^AG~5V8Y..K[p֡?ОP}-l6#yUA11%L@> YY_eR65*}ڂb9-kHj'JNɾ~W^MxB3ߑI8MD''4{lfJUT6aPzN>@9}8=ַ" iQfR=YgoځR[4}/$wXhma %g4,2=))}QL6@cݧ3Aנ>F* p$-9Z) Am^^UMyz5M!UT@ơ;]I(hyH^9՚$cArpڮ*a \%3EJ B~2n(̳-kT!רjs:)i=ڣ>O'lzR6 S1F<9r!OkzR\XYLVU*NCPU:i92<ޙD"eN3Z(#'TCtE3Z4/\N$K н*7Ri(b1%i')6TLOCd^8>}KrtMa˦oiއ! ?;[\Z{]`|{\K5!&=K.N:7}#THd䀁<) Q.'GlG2D*Ǝ/_畫4Ln4Bq]ż#UxR3T}cK[*9ϩt&Se,HN՘rOْ,>F40t$Pphi!fF} AKX.3-aWe2;zKқ99T~WҦ70U v{!͋N0J҄L{I5β +#wSHUs:yC9~s2yz6iS/@*PPc  F}g`Mb;8p!нj6$TW5osIP}ɞ~C%#:&ji ksEWyotw޴3\ !ѫ2LH[(Id"K' qI \L՚6UEI>q{2<9j7pK!hA/u2y oHI?○V-E߼}gY5dLJd@<3e jm >b{vg{_?9/8C(u@)F !&"^Am@>ZJ!}Ԍ/T4%$gK [7y;ϱͩ5F8B}|a* ᯪ@MLf F$NO P}55WnE3Fi˦d܂'rE3CS{9k/ceY9;O$ rdrN?"+G?=LR e>C%g^y&.&?re!h:2c(1_JّuKg= MJx#꧵J)&0KSKRɟSr;7({M@oAk `R`%,9:(&+~㊗RJ K ؘ#Vk_aRO>.5*FCP'R-,E,S6b;<ޕ@d"_oQBz9 TG:ҁYM& YH͆*di8Ķt$9e7 PRۮ{Hv#g|S@{y%u|;Wj5ye2-o`3g(Z[G3t$lW4{XwbQm.*RkSl 仇׀H~4EՏi$@B dLuҝd"*ʬd\ʁ%Ƿ{QeuTU;0:IPZL#<;⟹T,&]o:pْ6(^E>$MJfd fqY{->cĄmST )al}1P-7ݮSĎ?h_G7L>A#Ź_(, oAS##,]1r.8>/**Zh;/yǶw!#\!DW4Sas$m?QeU_Nd7V!!$=Gg-W1ݴS?O ~ޱw^DK!R\~x6l/2RI℔3Gx%A*}` c]p\uT3Kn RԀ<1O+>muW,/Y<:4Dԏ(RTLx[c`6qo#h>UQ57zXm8^.c2*0~$Fᾞq[TH=,:-5ybNa$?5 OO6JEK=jo-C.ۻg%<ѕ-4l]$Qj)WSNN7PIAz?@5[]>U@B}oc3;Z*Jt5s)\:"&xU-4Uӟ@fߧ;eO&ٱ,4+W&.tz},@K݄{]tj/rT&Od໏_QyKPy14G ,N" iHf!cb8-q&%Zd^̫gۗo v4x^eMԠ9-JbƖЗ9ydWO=&YC ?Af4_y F wm|!$KdGfM.V=i.Yȩ fq>Itu+jAZ̉1 c8_w^¶ Z*}G 5s,]r& /xUjYV??dž1 x9[L2S Y ݑ&.d)pYDZ7%)2P>\GDW3 {S-dv;Vac[y P5aLDV ĎgMgCxb9Չ,˜ uU=VV49..r]Iɸa_M,琳T?ČqqgДHdM:OЏ"xV^\d)w񏕒T'zmY|юOXRlR5im v)*ynX*p7x=Pu.P&aﺔ?Wb0e2~}&_45U\Zk B:umI J6ǥ! Kԅ4cOJIas? sg~q/OM[@,Lp:0f0(O;Xx[kH/k~0r ѢiHO2.oLVrb,9НP:16T"`UJ:Aְ~d]iCɑB?bs:i/TAUH5ȟvJtN8GcwUŬ1m$zSho?lk7)U]aZ0e[_gxր2򢧒ѿPE#ˀE+،mhcm59QnFGWx558W+-4B99!Qm-aΪJUqC "#r~HjfR}I%?(9UYj<h 5{u#X<*:M 7j%)+Lmb;|z߂EfP;ǠaEI_W&P2/7dTb^Dzc9N䁣CWf Dܱ.e@,]=:w]Z7׳7Os!t'S|fCqSQTiQ4TN3:ht2ڮ^ ~B($?MHV )^(aQQU O'u RB:awYDTȿUq^p!y?4-z隒F\EP?+}pBdjTr Iau4 Ɂb&ۧQy\ԯm܏>z]W/Є"UԹLD;FFs?u8ŲB"g)S˼]qAi Ecڢ,`Us UA^$W}2S7BOP4EUbDΛsH krdYo!Ƕ 4p^T E&Ssh K:w6|gNWw՛ hqw]c?{qN67o\ƾW86!FKX\O9Oִgr )UT,] }&\O?ǐy W<1NuZ=m1 mP-Ӵ qM5jg91ʓ;MI fHkSGvG1%Q))eAWPS*XҠگ j!R y. K֖$\p!sJ262K9D!O[X(;,V%@-R̍> 5AìkUMW:idu# '`C;XWU!MIXp[抴z;8g@B~u#ܴ; Q#%p,1>.Yd*5L:RvNcUuA~r8Rr/?&ݲ 뀪i].r$J|=:W.pv xdG 7EH/$3/ƺ]}ޙ[͍T=S𹓽d:}=*o1.sg(NOJ8֗?ZϪIL91}8с '3tr M9{duصJZ7ol' @gί2*FīQTɂFأ~@7!5jcy 7dyM`h}޳DhKq/C}~7E;g y[I<@rpa(6%CV1 'Ba(?t.o Zb][V6VX:Gצ #aYO;FGp,Z>R* %Aj7>·lbJ__X7'sYgQ}J|vNŲW)oUkRۆދN-|69iy3K)N eJ*+M,}l!-i*,tò*ZjCSVxthZcks}~_d(mrrH:6}8KG,KЫo%-[Ktٴlh}%ߜ\<7ϙceg 65ۮ5o5xvoRFΙt?FGa;GäIL)uБt6u޶!W|lïOf ǔQeYFԇKj??aζ 5Wm H ItKHt82KImRy` P{^|;%% xu[#n`IHsASڙ' 6M0://SWrC?{\4AZÑ^ȘjĖ ۑ|}W7ﹼUe t147u(m6mFEd8c26O% uɜ:6-َ h=<ULg;CMIڴLь+Z! ?BE":>d~>ykB֕Q{ OU#AѰ uu5?~+||>OO ^r͑%<Ԏ,s0 l j䮵/mg4ۑ(_|Z>+~;ez,K%\UUh.0m%Im9I,`ZuRy~{""1MBdc88k֑* CAQ1)*\^u+\5wK)\M\9~/M_x˸He'"&9LHσᩛ~f'2 qd9yx}‚KC߈:U=gDدG;Ns|>}91P'NYu"g-҅g,c13Qd.g-CHFHQ7L"L=i]z'/ſ@ja54<^NgP xPA{}!/U` !ĢY7(m{fht M1-LosoH3tfz)T[uJ?>C% |{/V.{XqxBK OUzئEߋG0o6u@"h\V? eז# =n[;r.O @. Wj sX|~/OxߍŲ,!8\۶q˲x9xhB@}}c GX:~OgYOk}RXH #i?wŋ66eu Op;f_δI>{tB^=VRS7pԜmVQʹA]@*T |JrCƴIRyIJJwcQ5i;v/V&vǞnx5cDgK fI~Zwn9gm MZDل_aoF#x%AlOp{nmg2Y_~{WUq*euLi ^%*ֆfL8={L&w⏯EzRCJHeuhRs|πh]ׯك}X㤘vט9ocu︙%eR2'ʏB:QGPN3#PH-=1{{D~CohTŠ‘ o; c: [8~Z2[(JԿ@Ɩ`  W]uBleYض=AgqT;#1 x {zt|W29i^yx%7(tH[V<_|/$P΃..@,嚂/"jFkYݴ\.7]&5ΣWe\6A._W~u7:{#Jq-X5 Y0 SAZԴT)yrtur$_;/k,mBD( ~Zϙ?r|xaܹWLK_RJ~W>G@_2A օ8rN*{fW-oï91HI~J!]~Lp3 gOLHkD-1Z@{?|x[jرg +"ϿgwVPg%RGx;i,~.猐W]/E[9^.BySL ?DoOӌ=wɛ!{me=E|p$t ܷ@eaxU3y/}Zbyl.yžvTj+.hחj8]+/ MS#{qb"?OVd q\eVY\]/;ɏb. p2wd8c~x8S^];BuӦw3scEE3&K9qCuM, $O]634o_(iSV,ũO76_ɕ \oo'>8/u)!VOۊ }M˖*㿃NϭBg)#%J\Θ 7mk.}6m>[ީ ?M.D4G8cC#clhp,M%gcZ9Z [Q1}K]<:&7{47&ʕ~B6ټn2֥[_8r3jJ3 h=&ہAt~/4̻ߴ{ҏ̔rC:q{O_Lq46`a'W6Ut_12_BmżI Q TW㦭*C{qHfg7EQ0?˵tU`aMRm͂l,4]ieHL(P5xuI%9'$4׶xyt5 S%)鏹m.pҭ/R}@!&7xv ƒn`R `r5h+B?nY/ aAK7/'ҩO(wc.q9vNTyfeF2]S^ u)A*ogiuޅ.a'gI"17rBi-ZxlyC~CM/L][#t"tMz=Mߺ IJm,!!k"G%D3Q[qTv,]'ڶA:çZӆ?zӐIѿش^zsd'wpi/%+A1VF}L oB9ŏyr)am۳j(ΫcqRw%qN.!*%s7v3TZ^uk'VnlKJ,<{3&(DP-,uJ P)y+ywj(a72R"X!q)UZM l?2`0,nvp,+Lf H"=#3nj%)d&9K'gVh>{-] 41xĢ[ئE{puW'S]M^([fJ%t%*CeRЈ*,ZJfbyKbϲml^ujM_đn`8*Zt'EyR߻]K~$p2xYhJ߿>=mkr1!sgl^ITBv (UY-]J`*y2M`˚|.3WxBp U"c ֵeTPCpr` y eoMB% 4yV!Hco5XM@7m_{S)S!|UNĭ>KV8qN:1'&j(e* {fR κ E#a`f;sY"|Ӎ3d;#r ?YA[\"lz]FMV֜Q'BsjVߣfm[LC%'|p;6!$J*? Mȹ4D=]ޥpúRU$p+.my<~iNtҷj(A2/9,.2tYd-B0)Uo')ZCx'%!7h(w ]y3t䒚cUodetO_}5ݱK|RLsbM =!IiDy`޲IfNʐ]K{N,F xx65zDBQ+,8-]kHIx'o/ y`yY{bNoZ'/ -~hҔ"ܼyR,>rkOɕH( Z%>c;&R*S}=.K*;}c%<oX;縢˿!8rCpjHڏdhs/ԥ.[VY&a!٤9 sK[CG;v9:;DDuk5˫fLȗb8?;R^5Uc$CJ%wbDs? \*eŬDVR Ue'zO^ra C]tA$BC"ΖZ|(7F,W&ԓkxuH !W+g5H-ugbQM|hg9޹)eͩ&*Lq+پwwNvpWpZHd :fLul[=6xuASGcKlk`C}ߞKON ]ՌRJvPaЙ'c<H%P>>- ^PPĹ=[d:ns] debO:|><™X TH" 0޲\ ~/֪P_2%e,jxJ?v[O>cҼ J9Z0Tytqȫ|j44<]tI3/ ;N,Q{ᒖS{SJQӖpOᆲI/,kNm]ױ,u/.7ߴ.=Q\@$[ZՏDB1wQhwް?ZGU ^}$}8[:\ ?ۭ&3%MUgoJ K':^ҩ{< ;Wxˆ %fş>SpiyŅ0첨{87rexYՖeKdr\Sď[8;qbȊXeIz']ѝt#s%{. l!$ޯ3 f~wh&SzUeHYz 6bx.И<% eBb{/ U6,В[SXx_tBxjM^v DdiҲ aϦBAx, GC&nFvk ̾;+HnՉfpj$ 7vV!jyɲ(K4e=`_W !2e3&xϥ܃MӬIrLbzj5{/q4='85Id83C1cYք ot;;&J ^A/llj#1uܾf!O=Ng4iGo$SesXĿ{hd[˂ȍV|$YQ yEb׹b_{5s`Hü^lG_^Jg B]tIG !^[w 2Y{uۑb)磪9\:5!yϽaA  ckp6'sID 2Aڊބ¸soןXGl$j% x]dq*>/<%k"VK6,iuaN JYW-vYŪ a2u qdq^;F6ViϬhO ʐ%K✜<4~?6-&z#j꜆5%H|n (5 Rrr_=H @S ˲d vfd:rf>5;y4%'oUYv<.X~%S`ͅ,cmnso+hٞK)^;?r Tn]N4G6}ȰO'ժE]Ja¯^۟{2׉e%iCgNmY'Ka…J>3ŌL6Vh@O R P ~o,<ןKI9*-Go&BU[z"rFHv|.WˊxQUEzXB<34O“+?bjRݿLE&MA~fOŹ)FtN\L,RDaQoƗ˪-n5@.`2e0|⏯OlhPРCXnU44\L- h9;)0$ٹ|s1#b K $=?ɿ~lmEAۙT/)Ke rYV@/Wsi!z1sU(wu:X6PZ⩻7u.ƥJWtx566rha?YuJ;* (i:gdq-˶+n0i#+8hOyߜ_6xk$ W3\%- Gh!ԹIe]UU|:X9cK ,}ݘ}\}[YsXhm~aFS:788 W/xk$'vtV&SM^&#i }ͨl5V6]3M~;ZP4)gkO ӧ6qE7%(s%APZd=|{KdC y׼GQB^S @2c0ZXS?~S1GL^wy>,\jXD}Mۊb;Rʧ  +iw-wc98튪`)cD M#g<֬_*$tX´c:\ )"MUص'wG6US.s+rrY5$3:FQx坷9D~f,RB*[ew#sn221wGpTu}vl#_9r ~Ps:#k|jw:]_E^8EBSaKڭ|>ŷ. kst7B`M\!6W0JqЫ N|LSb$]:{ײ+٫ӥ M.xhݯ{)4 N14d]{쪪"x==|KG- Ocexaf&3#u8Fa\?c/b \_\k价z ;%\joZ<ǩ,4 X]mx[Ttls24E0Y[K%uu0ah~loŏO^2D1}NSI`m?F6 mwE >{*IRx%౅<}v[2x$M {6.`׭[Sъ|!JR*t7:7O=˃L'0ݻsMdLTtέܽ wfH~ƨ0:+@{S=qVIi%¿N8 KiV̎# "[K! "_uҮY f{5Sytc~wipВ`$oN} * nwIcG!ݘL h .!`]Kݹvm2xJx0-1 W8,4hMwmsGQay3/y*X'oӬe!uKʤ>Sָ/>;_>؟5,}k oE_ɵ8訸0;7:V0m߿Jeo)%an/0c4#sСӘD\B{ww6yUJduΝIs|ۍttiZUYMRJ`B4E"N7c36 cq$u$a,rSwAG741> G*`Z&\Ϛ\3(BU![Uօ,Jg@ݯ]^,_jBwC_gep8XթSG w6uX8[L^ŵ b {ohVfuLc>ɼΉ(Fb7Pֱ؏PǼ 'GIB,sv uvϫW;>˘0%9!| tttZs#+b i޺ W-$?T@J3t4FD҅EkGt{zxdOڃ%Aebv;Mz64%VDש8 c09S8R^CW7d qVaƧ惻q>wdCfHfzR)% pԄr6WhBv ɫv Bn1\  TTcX zvMG3f9JgIɑ5 (7 &@0,)T\I-/x2 )|l{_>8@Rw844@ 7D $+#MO v\<7N :ʋ]ٛBӗ˖\q}d2}e1]BcCwKx|_77+LkozΦnSܢ87( N$ɐu6;p<叾pU4Wbc6?ֆd]@s>îV~2Y;ivuYsK0˒5ef臮z#yeɌTs-˪uYN0iIFb/3??:N ^w[|}(4M39{OvXqfe!xtRMSב9!Hr"xݡ@r"$FTUUE |nR 2i}`kۃ+/, RxwJ{)2]eÖH74á~z&Id1-9pDɼ0 LӬ@Bek E23Iqi0KQBn6ybSolb[VwTCh6^Sσ-ϥ; d81kQ^p=a$!kJfᠶ⨊5spkvK9o#S7 Funu]K#*aG@H|C |xB kSuq[,3YH7q`[~bɢhLdlƭ9f/"PUVQǛM6$9L38s(xPUW_IZضq)߸z2:LUP6Ch*lYgUqzcun$%esb*B!ܽ ;v~H Y"kZ̤ Ώ'y$>–V? C['\w,H u,9Hfɲ*u^5zyN{r:Jqy*8OɐZ$c`iCG=PD^iquduì2vW'=?IکJ" o\Z\*kp}<ν܄ϣ{t I쨾^hJٖTF:Hd,h4-:Z 1r<( EQػw/??L PV#HC{vۿz$ˊi3|k<5.Fe0- MGGwu6m3 33󎾙( z\.1gL҆PgM#LJx2{7kxsΊ*,I ܻ9٢q8ñk+fdI.}ZwniS.LA.d((Q*TUe|p]sRsEHeWPB3WWg|+0N<פ%@Q06lvfttt84.][pۺ^uvfLOODso(ɵYwn)0ap&ۅG%Qi {4s'?ɹ&lv.j&|9q>[_9!:K* @J3K^Wix) RBQrAJ;nڂn>vW''ΝV"I8t޻7mhQ%%gݷ .%>[y%:t>G@rlEQ뮻x_711QM8;pBw4Ϟ[ose8Qcf(|>֮]ˎ;رcMM:Hn۷s9_49|0w}wt:M&SZy' BXiLOO3>>`ddT2neu~oSHN'vg9(4}}}޽DB:;fטC_#zFf7twV nRru `$/[^~|'(M ^u))}r(]8-&GIIj*pӘKmp&`K,֯GHrJ=fq4S|+ 'jr4D:::سg۶m߮]xW{mppgϲgOy$X8 ( k.,"122ӧr s9bzR).kIj0 ;Ʈ]ϣ8So-* +v\l.1IgM;ˉ#R!(qtXڀf$YN 9;TX!wP`ak]m臀Jc)R_#.)vr;*dmrSX~}DтV["Voգw4MA;X30:^ՑXՆm۶c֬YS@_ss36l ̍5-xeY3ϔ !(0( 444m69s .F1z @!_]:wYnWayRJbå).\@XmO=,PMdwVKl4Ikˈ(vdq˶:7xcy-Ln(B 87Fv-Z >(]42$U9Mk"gixǎ<ڊ;΅̕]pT*n:jj]4t=lךԹaDE9{uT!֭[ٳgx;o9sfn^ dbbbƍlܸ@ @,L&KɊ~ oI&?GsR,iGwfzs9EF^4ettpʵn zb+sD鳫U7Q ^ iZ p0;_O1/VP:? -þ٬*>#ҙeh_[:.$팃BUl\~ZhxCˇsi u֒uu]/U--.%\.:uV7a7d7_=ɛgGK_e˖|+~zzzz뛻K)I$=0wt$iɕLfnuj킶~uaZyvwxS gcϞ=tttTEQx'-)*Z|>~aZZZ?u:eIgah) |Z%2 bhnnW)~;iTy4!0wpS+߼K}˟>6_z ~ʟ2(aZ }k]LNJY -B[W?z_~M5*kUEC߻wu+Mhs rveY;nKJY2VQSjmMXNw*퍶Ί20r/xHr,EGG<v"\D*ٺu+O?4>lA[jBI8?bƲ9dYP w?yS|K|5.\KfD {5ll]ob?GCM;6"H} ɔ4-rى4DksԹMy)֗d AţbI(xdO~'BPClj%'TEȜ߉NBwE32w0{T{/Jo)!ؾ};ׯ… 8qׯL&1 EQ4Fz{{ٻw/ׯ_rw5buHf`d~@UN`jjF}+6Uge͊jA6ZT8/*XR[I΂kvf*®{Ƚ޻zٻw/{!N3::x^4Meų<;g &*ס-P9c&cccs CCC%)s D֨Xlٝ U<7@~$ZE)@C7m~TEX vSk?:ᨭ_,赅]?QHg͚8on1ad05-!পU2%2*4M-LtRU$VUrw+0- w"l_qn&?}'^^B0!h,cG}յ˩s!}{5U41R2>>_S:<<\> )rs=uj$\ 5ͻm1L%^L@ߒ^ ss5|w($R%pm68 `V<'3ۄy477߈%mU6asguAyO~.v>B. 6t*u#ދ[tR:CD6 ؓߡyD=#fbICapTU#غ&kK-ԪiZ@J.@ZȆF/Nj) ̔0TE6As˒2\[^V$00YW%ReE!JJ,),S>x=GXo1$tWrŔݩܾf׍:M{kDSAOlFAٳgOuجa/ЍCfdyN^z6ŏ쩩-/ ^lӬM$xzߥ=S%2]2dI{?GT:KI$ӵ"xhwsX b PPڿTtRZMΤk *;/kט¾-X`e#DZh-WHE3+iq4558ik)N7ݘ/~unQ^hC7 C $T~ *b|K_ɓ5i,{TX _2l=|Ѵ\(BDqffJkb {4 IiH x%] /]ӂ8\Uih>vNb+$L;+;; U @"kZ6un,OlnM<{v4K:&E|nv EHv %G2 >r5zim1~?jQDEcxgjB Y3, ME GGsu rmʵ,{6=x i/q]wOҲ|r̜UֶCcRx.гDZn%\َ;ʷKړ [+ pjNM2rm*۪5_=xgeGDZ-$lmj.MFz~C;i :[eV˗tfaZrE"F`֠ 7L?yd#O޵uuyhhξr@ 㯪*h-4TeP(T,1>?XJ[$ Z(e>8p[2i;?'qo@3Dz,&&&ַő#G뮻طocϝȭPAsnY\iuJiJ9@4.E)p55>og0XLe.m64U>hˎHݎcgqC*k닌5}[[N4DƂޭ7QSk vlKv7a1pz48o^a f,%60LIv֩YS}mhwk6MFfV,G_=;;Waw6KX=YB]sKUmWq~ F<OAƜK}*0QdۋLלsliO~}Ͻ HD7`ƍ߿5k8 )3-7T053T5­*V3SnJ~~|0=4TAfA͘/JB؆[O;[k ؆iְ#ז*a'ߵmˀ!etT!ɨ2 LK*0LAւ`JP}ӲZ,1-1ܦK ToE(Rbb +'x<;Ve),:@R79:sXɤnW"~h`nj~I[vT.sTN]Z^8rg^#oZpP,ݴZeV[%$ۑVhllHm*%Lsߩ7*iL/WwO0C㱒=099illdÆ lݺ.BPہ[ t@KC«S,SWs d24@i=.0,D"ˮz~n eIiOfu6CT6}nјRs5laT~LRe-[xUmSOo秞NoG5@U$Ԭg !1MP nw]yC,K`X5)BHeudN W}> u&KMJQ 4 DAA" bIb<54qcdB, ,00a/i-0>t "|A=N=%södFO$:dy>M>Ev<,*ݰ5ȴJ5ʕ!hnnf||+öPL(KFGTZBJ$+kR'˽z_ϽyTFwTd2266Çx<455BOOmmmR} [˲EBVhku#[-~>Jk؏>en W"|RG WQAoGk+|66v &ic>*D3 ѴLV()kh2jW^A5na\jߜ4SE!}qcYH 3ɠJ/wv26x$ypgI+oftRMxƎ'e^Onqbg-)wgF]?⮭i z,D5aU|K("1JnB³!֓. Ft* ;)m>pitkeFtuELj64~|c0L:RbaH$ɓ(Lss3455܌#,M|z*׮]իD[uj@JAl:x55z `0.6[g&xrswqj$Η\H6IY^y \ǢH^nϺ٨ 5{Oޱ0)f`<1VTfհϹ(\~iT>5`󸵒:c˲jCzdMdƔИ_OqcBiIT 4y=#[COEy%oLPT;,7^(EcJF7iеC'e-r46 BU'4]ސFQKQ+DWKގ[zXdCWpS/yt4wYq(nzqiMߜvrPUۍ|sۍs0,!7d2D"b0::J2$N}?JhשtV$rz'w+ݥ鄦i%1)!5 |TE;ľd/\ V[.υo>,7RϤ86`=2[[lbS[;ɨ.jI4͊08 _QLI1I~QOY2 ܺ-Qg_:>2DD׮ϕh*t5mAjwv8?i֥tN]0->! ]!:\viriK̑Ҟ9=e܉tβ87L} \ݲGWK{}3wUv{eSǝMu[ gIh$<'H)^>r_Hx2i-Lۙ ̽̕h(\9@aAU9풜!54uL&R),D0fr@ m5VTSӂzz" Ώ%97XhaٓXq;\UGCCÜG5LHʠWyHjTȥf,I6=swCuY 7IbY5;e& P t,{rՒM7" UJTaa`p EDAC &-Ҙ>t, TP1$@ą.T%,Sev>'๋Ih@SSSWR d4aSEu;= 0Z)%3 [;sfep8 rYU#bCe4$Yهf\.h80;QQ@t;-U,AٶY⵷d|*x~bG B>6_S(DYQ&Jc_munqX2ʥ(U! Bj@g6oj[96LwCUL.NvI<Gl|JxJ(.7L1B>>߸`@fYr'39Q %df?[T4o4U)8kv <)t6@w#\h߱kEliw5οO:L)_) nkiTzllFMMc9SI^|ER%~ۍ;Hlv0dzzzbZDxIyf[eWg67ûĝ7ZyQm0Ԋ4h#~+$&d[8bG9^gYP-`7LhD3vciqu]+[׵`ZKdIreh}ק12#ʒHe1L 0gWcUpk [qSKXĞ)!cXpq?ym3L&K[,Jϭ% _9>wMA˻4ԖfyS&ߪbn ="4 N16YswU f)#l;?ַqqvn6&a y=m*Dc5bno&JCAi"fXR]{qmx8uq[U;}.^Kо6rnt{sH좮6K +a){FIMW91)M>Uێ59 !;Ԯ#l{t 2J_ )Vs~;صg_ZV PG`HT*M險 "(hIfI2ٺ~ aKe`dOS-d;þo&ܔx:_ 'a8ZSJM,Kw`9ˡ^&&8qǎcbbb,n49Rؼy3ov1 vc&eg/KJY0˞6ZPӚU@B 5Ώ;VFVS;8\˂%ޥOPho呰s*DB*sF 4 .%aP9us)ѯ *S!f R!a>"cрZbfU3ؠQA!$7Oy5ey`EF7HtL O0I2I&I&2ēI:k`I ӞKJ?"ĬKSQm 647 A/>ߍ(}n\Zq)9:!?kܽ:)a*[rbIcח)SեڍA֭[ǚ5kPUl6;׺$ us-K*m#*pC{? 56vikuX^̧;c{ h*ҲHqWF>mlrޯ]ΝU;ȤI|ǖ] tȵw>UsVٵ)8y@()#JMo yWGٱ9_s24Ÿ)Bqj鍊vsYb;&gkB+I$igT؎ElVQִMYyYՂa9V<6_5/oJV L`. y||.qo* _c5T ՕQ4"Bۅ IrE+K vp^VFn^Ü~(_d$j3wMWWWEcr||644L^\f@M6-Kڢt4hT6O]ufc7='1Mt4btҒvT߆ᱭtoϟANߘmgDV0XƦ/GgkK ZUt8V,۪]wp =! u[G~8v@Akw'"c)x,Q4cr(^8 xC=NxTŗ\LaB9Tw4Ki_PɬݮMcc1XrS\1L$?8>ė_K'&H$U kzb1,*1ü\hFSSb1v/_fbbb6O|!ȔRbvR0UO445 VU,T⫙c.fm0ȅc` 2*ڂKڏ`"jPA)]t#gq(ˡ|ŲHO5&*˷X0/7qCuBy_|4 ;7w;V4 rv**q)B]u%~﹁:ÓҚ\Z|zwc2{-?oHf q+8qe 墣{w]v R(T&{rU0wy̎o봅4چGȻ|NӲӅ_,t43y*fy(%< ޻-%S*+*SvHo(n šV֚bD&{-d8HkT}!5t޳Кv$qK)9t>Ǔ}@"Ӎse'tmr&dfm1aN2Y}y&7X3}#])\Mo+QqMRB4U]WV"W&q|t?rc´ZѵS&7,|v@5d sOJsoϩ+SixذaO=^}08x Ǐ'xH&qR5fyjzPP(D(b֭~iGLKKS 1iƢ _ep^[v8$Z EjSe#o$=w@gSA>NRhoQ*])] «m+2R˜ПU9qV<_`َ =p& n(d-'-!hĥ&$jBGZ*px\ 7Y0'nm1Ώ"N|cn=3lmJiO \-xUUx v޽`~9lӧ Lgedd'xbn5>>Α#GxD"Qu8 ^/ׯAΝ;W:Y`s{m;]!xuE碣ɇǥbZ?iE`sǕ6X^aol,9/;!!M};di-\}c~#eަig;cc$FtFϼMklk,Y.R+!PxL< QǦf`dHX"n?ğͷ٬1[  |45i 5 kX*;sl.EU9Gwظ{{\5MkW 6E;W.D&K3)=McfEb)S#sO%RG㡧zhy:{СC\d>BC=ڵk2WUJP9̍ "1B0gCE NSlk&AV@9e)C/XLe+Ie-'SA E+ev08$}@:;.+ɇTM1%}0ۥl[ <6gùRfiAptLBNsxn]7,bg\HytرH@7 M*BKK >(w48ja߾}|gbbT*oɓ'ihh0 fffF\|>sc0W^u6v*8.],j{5>!/:]|&g蒶ҷb~0m)*sԚd U0J瘩 \[;8!tx^;>ozKQx7ӼF掁ƻ߷(d{10Y}GQ~..QJ~\J/O7'zlYo'K{#A>q}Y(QN)\?i{/sY@tz~C9lj]m;န9GJ4sF9tn.2 &\ xOݽ-IĘ%52E6 a ̏f#gsLMExۛ">'T;gcws幃RJ^>tmgז] Pg|GxSLG55`;9#enJ)ۃ#pfaZ´44F"\ivWml+2- -wu J#kR)IZ!|,H{팉ZX .WE~?l߾͛7Yuƚᩧb޽=z333S zilldu]jaL,D;/kR!eao6xŭiԊ!vTXb~&Ii[F{[N&k]Bʇ3l)~yW)%)k~-4om(7 !:v­iI>y~/^g"Z^GA8]LMx^dيUUiii3Bx8wJثhhi4]4xTEw-fWX\qijowHl#5;ݽ-d;n[o9u63uL2kϗ2x E6[H͚ݍ䷝ 7ct113 2zM=08s .5j8rhhha۪Ĩ"9X(۴XHMWLa V*\FNP2idOUl Z}M 0첸ϥ=a_já2 LV.gnĵѺl{'7]\ ܴYW2}s1 ^Zد_]/'F_mdou ۸mw[hjjq5GNsME1^?\Z1JF[hRr4{I/ Vq q"<~ S]Px)!??tD)yF% Y?PENθ4VYʕG|A׫| qUT52bqc&x - '>fDUWWj7?k ]L ,aiR\_iYaDؼ/<41L3=rk .M1)a}g mbcw] 44RjHwz1ܦ=e9܍֕{{Y;_L.f",|Z}QNFb{ܿ?O=X7\3MW^y_|xr5 ]{-j*.ire#iYdf :Mv:6]4oq.He>syU9t<1.K8wXUUzY^x2 Oñk]B崿љ+eY/|~l۶mE?o@,~8..r5pv-K $|1m=ڹG]e3n|6LdH k&j)N6c}D\(Ǐba%~!jG)vR[OUٮGy,nicNeZfks5UXa!0<6{\:,=aM0-؊WGc\TB~M~z;ܵصmkSq{\(355oay"9| 97E$ IJ Ft}X(~7{k&oo3^i/G G[LdH\"cKa9,Ebd/iZm[eBL|xD`eI. U$arU. djSr[lᮻbڵU]S>}ZksůgTC:&H0== CCC H$HR˞1`Yh%N吝9轻l9R릣wT{Mz"]-6\T-D\k^$¥[38G{ <3a21?AJ_җx׻}ݷjo*L),(g?K$)y_]J`D,t3a#>DxC0MsN]7;c][u'SZe oo>[i/lTM |=|͙G:H:u+eY)F~V11*TS`Gt6"9W3%hk 4gSc7f l3ϒNyV"uRQx8> V8\Ywvdpvͻo,unV}:2vu^EHiNf|.3>LE)4uo*OlOLLy\!*4:?c0ۭ~Li%KJ ϻ[iiZXVr̔#VIk'g|q|r g\ ybZhbuˌP2HleNƂh_P=c;}%tIBMZL,g DM.G FE";\րiI&i&i.Fx4rǾ w#5^u#A{cŷ9IC0T1,D Evupqb1oOyS\R '߼.ͮ_B0_buY[9%鄝*{vRCH[OmW/4 ӺRT4ơS}|S Mvx^6óشiO ǎczzfƐR Yfs\xhI UUYnݒCVFC2&3 %FgqGU7;_d-fAjGtvMK0GmozRw{bǺbX~6wrNʢBw-QFy*6*qEKTb:mq9j19;s%jru$g%% ]Wi"[DR:X]kB E}NEVfkFYkSh|>5VJɵkxoR1M^z h^7]v230B 2x|Λ')m5Mpw}ξtnV'LHMEo7կ "W9zˡ RcνLVh׏]I`uSUp8̞={ؿ?K*>c|ejj UU^u=I&!Eu]KwBJ,! bsNictt ,VTJ_+GL6Gv<|t1cϮ siE_19,|F[S:S/.hk߭m,WZ} [7aX0OZE "'u"&C 鴅nn.-`ZTb*s~k<ܷօ-wvmG.gX)0}v:}}to|~Kh;wÇ5$T5[G0g#w5 ]pa94.4-F&Ҭ( 02Yf2u*ɱi,Cv]0Kr^=z ä2ٚ"ӹh{{;w۷o_c9>я|sΑfg||}sSSk׮]}|@OO{/ti]Ɖ'&ל`Yh,KOܽk#^6v؉~'پUeucB1dy< o]{"]յIi vHӼ }ه%K=k0ΛH& B0'{}l(I](hH.  [X^j 6*4j'Ir:|4ߴ$= eܣU|@JJXgBGو9]qݭ2SuCirl3Ǜo7sX %4@h*4{5o:eHbYɥ)ccYNGMbEJsȕ,IJ04>-~M>xM]uῌi.l70TQMZ26_^z饲uBUػM=ִӼy-gFf1,0 kG6ێs4@hM1u{#%׾6kCx] ꐖH030BrlL,QCUڿ']hW#@VE_KK 6mIԯVx9xb4}Qz{{yOkEWW{/9k;[1V%7YݣuFJJP%MG +V%hgRBLKy蠩iJ.|E!Hy~e MUxM@(.+DTq[ )T+>݆,: wEBI~)̼_`w!qc/$'?К ‡cYx\IsoXEK_P;&vm/MwP5%Ik3&u뜚O٥YsKJ,FbYFbY_O^\ljs0lhdwg6(oZ ;y}۽ko)MӼ SOe˖U pСᵝ8\( woHg\,5Ӻu5uZ k>D6MA(mh>/MTƓ\8ݺA敋K"ʐH O"afu.K;7D*ëo7Npmd(ƍٹs'ׯ'\ {vpX ˲*:r Oww7{e۶mBUW֣(\χ~WrQ.]D<HyIN_{܋AUq['p5 }LUMuk3bv*"ʊEݚYcaQdӲ[$f ػ.{Z)B^y:bt`ppW_}7;RZk{5B"Uq:3/VVmޥ?yP,=♸A܂썸Ce{:0m).L4RI6>e̎`vqy [QcmMAq .?[PO-n!%ZzF ^Bea-wpTTܪ`mHemH5[iӓ:o\ 'LbY[<ЬphhWD{56om]kBݨwܪ熶[>f9(sR>Iu'eYlذׯhqLLLpa2ڞp;P2?T }ם SӲT$Dx].}S b(z=ru k&LVw\y6]tϡ' y *4^k2M28(ɉiRQҩfF]!ma]nũKŹ˃UGE! a˺uB7 s~#!Hp%._0TL&(s|P֮]˺uhhhXk5|>o֭[?~׹RJ&#|k|} ?#Oȁit 0nXݥ HK[MxsgïWSgl; Lmk!>n ]ÈoYǎ.+yJ- g5g_QW S>@ȧ5p2LZ9,\1Eav]pKL E f+I3y z޿2;{Av0[ܗf!, ~y(b_;w2J(n, BATh WSJ3g;a.<Ǐy"jke`Ȩ.EV ׾D3cIӓ:GtNL\1KdLVXR6$xxWgAZ.m=ZxfzVw;!<~jruYJ5._ChW_8N,)XOJI*ٳݻپ};7M=LO;׌ UuFmT5b%w9,LfWơӌ.fkI{ҭ*vficp}ʮΫ`[i,4Ҽn:چٮ7<К6F#)#5Rt> >\>ۅvh-x*EKb$di2hlyc|={pi*[7tx#]R0SY "0g <)/;{1YڅynDHɜ(*(r 47ii B{KNo-3$_ IgױQՠ%mikGX{CpRnkSeǪX,Ƒ#Gn@`G˕ ?}pTzv7~lfo>m,6?98V̲~U!$%zrWq/h@z=$_z#cozrT +]x^m沫HO|ҏ#l~iE_WKj0y)|]Bu<彞k;8fl|*un\Do {HL^z/#yw,G(ToT\d[JXvŖKb;;qlY%P-(Pz/m{]`Xtz;;3;mʱ1B ssGBt85br# Yr+M )ɚ6Fl.&}4uvg[wok`{s]KB_zMo~Iz8&mRJ .]GyfmƦMhnn&2߷i+ߺvu(F̈́}8)#i1-R˾×MEJ"\K-ʎps7W-BЁ.J3;"7Bݢ4%oPQD:ґn ۸QUH[:=l]߆%RJ^;}Ü܏=s=߲e `ƍsjw%QEQoD8pܹsK=zL&3)o0?~G>qu6QA<" {P(Er"ÉlT&G*#˓+)-E)%3- pGH7Ht$(SƧkhJCS>]PUš(MQ ~H8@('*hiZ.\x]s5p] [g.k)ؿQkFU`{+2[t3j ȑ#u]KW6n .Mi)ǏUE!Pm3o։Nͨ,=DVXԶ]|s0ufƢ#ᄩbǫ3ƐuQYeui<-63U|Gk ?guq=46׀."s՞]>'{Ǎ EcFXΖй(<=2/V!WɲwG5kVYw;Mh(ئp[NUk*ou'6o=O=URFqf;w .ӟh4Jcc#ׯF `p˗/OW4]QgJl?rl0v~QF)t'S B!F˾mֶLz#z;ЉWNH4U#򳹳}qu4F{/R(CϑHgΖ ۷s7ٹ{:[laӦM k2888iGokq3t|N<yRc( 9MU{]]0 fl|;w|E_%eVߋP"ki&?"qԥ>IWiDf(F!Flm+ѵ#dqnNLհ!PK̦(׶ozk# A6_{=4Mczlڴi \zFQ9x wZG3zo|qˁ z< w#4>pB7>2H*p~! d\#0uJ&r nun9Ӊ3m w_315St3[O4-10Xi˲8quR)zzz|2O?Gu՗H ]}0t5uܲo7PPU MJEvrF*5l+Jk!  5( ?lZ^! XN5?EC_0fkg]kxY56U±9{N{+l_A*I;-7rQ뉪.bWLq3='ۇXhEf'@%h (4 |loDxxd(P΀ow -}-yFACtE,$>͡3frnDGQ$SJk*mNOW10)$\.G.#H/)̚*~M0 UUu}n3gjG }lEEhڵb*K>rC vf]>z{ͧ |x`c]=qnAu}mr'CEd)Z9K"ܔe]S:- l\ڶFcaB+3ƍ2|?WNL/n}a^׫`0ٳg/?0###f W8;|j)N˗/cY֢dI).Ξ=d۶?u;, ny-ӥ?ҟv'ŧ}i NEM"c/-9C>=؀k3U"0t{ϵ]WV҆66Ufp1Os _QZe![E2B 72O(q$# 45wXsI !X4`) y6:9;9ө8+7;y9#Ofku~qOͳ=&="i5 %-.&yr%_XzWcR†ژŤV*SulAkXu;0̫x9`"C`mf-/nѺBI&2]1,9m-vSQg@ݶ8EpU`fs8S,cBJ[c/@1tTC 㯋hb yQ4XcYpv9kC0LsodtӴ(Z6(B3\HX- q"DCa4UTb3!w珜g70I$p!mƃ>ȫYKl| CSy-PrޓZ9u/<(.t/NmQW̴?sVRH&ލ\o@YϞsJqcm×]AȀ]wL_fhht:M<&SDA立l6K.p":mBL>вmu칐&, Tb2o 4Hgъ!LvŤ]w " +J2RVn#G<_[i~ֶ'dH!£j?'[$_IVER{qK$ɗ~ٺ>WGr0Ks{T4,JVե)Vyfoӛy7NyHOr&:,Grr >x>G3׷1 ꩹D}6.t)]CoZҺh7޴;op"A^<~ç9siT&O~0;{O>U 5j6 +_.X4( ~ٳǫ_4667)Nj\w޼wfGtS=RY2 TG 4ULI`?'w{L}XY$;enZuknSSZGOuuۿ=WȺzƖ 85 F#,%N̨+peVRbRJh )%dFFFf``,l˲F  ? w6E_6g9 `KAnq]`pK7zPyTU}>MgQ FOV 3)V#d?*S<MΣj[7ܬq]Y4H%['8\m93MȜW(%U_FުU 5-޽%<΄H.Ovk[v6GyUq+0fkMuE :t&+!h TbضP2!^93=4H2'7q.b-hjW(C( zЏ$BUh~$8-ݼ-P/G f/sYgh<“/ݻ;cYX4Mtvv'NL d]G#[ַm(Y˙ U tlt9qOs75]}L67?1?r+n%ojhcڮ`g+"uiHVHWk!?8 #Q(Q#ɚx˲򗿌Zh*;4MQ^V,1M|>?, 8w~ؽnFEH:"&߂p[@z(ӏ+ @U>V!4`]2 KX GnzxL7v'Ԛ(z6 -78^\ w) /-T2ۜ ܵgU;Ƴ6{Bܷ3ȫ&_9gtglqˑ\NG.{u|NխTE> 5u~@wZ/c9;ƣ MuaߵǑG2{ ŞaG2 & &\Ӳ-lR my4ϡ ޼Q}:m쏞!q/˓G/lj8l#yx5k5Mロ 6FB??O1^ޛs1ppI& !b~߿WY7wFFFjNJx9^»?|O M"B᠏l^Įk'E^5?*ZPK(#4 ഩUk*{,o@U޴d:#[E~_6T[?u 96hNRr_" rr[—z^pc{|AUug'{V4tFT~?3ȗډ'-XX_O^mCW=&Y#&w/$9D^!ST)nfMY4J=}4qQ#l\Q,8t? _,LKD(ƝHNڝf٤A/|L8sä}Ǯ];inn EQkB |]Pgoz-^`$Fݾ|'wXWdώ|#˿)nkhS;hV8:_XnѾ̛&\‚U~vodSik vi 3Α-H9?]rkhBcAW(66t'0tϟ+O1q,.%C)0K u:ڼWRiظ}\RRYSP~΁-ċ"~7Zݨԝ7lObm[1#/yhVO,L3'<72 :l Opߧ?/0}>{dlUdvoj+ \*3Aktl~}߽wK;r|Uoh>z9^=DZ&-.eY#H⊾ghJ,.dm[=l)F]4Ht BABԸ.TTTr*Nrg?1c.0tT$Z}<ڔGRt18z8\>RB#66Tw:} fp*l ?fW}9fIS@{Co[PuF05G/Mܳa5O3-bD|h2-p$ yK!o q# E/)FtAJ(h]͝Mv 5[cSIƎU1!oh'qԭ` [J5Uh*A2tcg/^]{wIm۸y衇jes:}!dىZDUMe{e["OW;]=X7}ߕĴ]?s T5Qٲ~C>@sǿ'$EppZ#5Dعٽ9)Mo$p2p2떨 XpG,3uYZ|PwvxNYk /~GI5 WnYm-ROtsi͛eR3E},VϏ[ pTQݡap<,n`+p$ o[M|Һۛm +Z #u~vy&?Zy)]Ud9g/&;[;k<CָZPU r9;lhBR,1T9IW++2\|=G53,{{/Zc#Jk'eS͕\r?zѺ!|=P(N4-$ֶ\V7$Z6k.L7M|~C#ݔ`*AXmtC}z{?k O|?@<}l"! hl/3:>#39Umm < 5߈qU\_&dnqLpTx,Ds\:2%aYԉvt۸љy%‹jmYFU8n'=_:ZWH ڢ) XrktD pmᆱwo '9CYi>#t%kyV B@{qUVT%ZvPWenm Ūq>' mORmӢӜ$/Lz6$. AA$@x(Q7|=]y2003<3i6C0fM6E_%)0[fCK3vnH }i8OO T? Rv>W׏2/?W)EvPR%$XXf,~"[׸Sո˗w]Cq)1'8V168F&s^-wJ;9%uNTs\i9\~WEmUk-1N8s6ϩ1^(W}e,8O8y/ҟ.k9l! ?*%shXtƆ}N_RH;s[hٷ`s݌ŲV ґ 8O+FaW1LvDbknYX!21gss36RcU!|ߦg׵~[C;]߲AX(p,yۡRm[n՟*_ӿ){5MQ{뮉 } B.z:Y~& TȧJOY/7=Z϶S+7O$m,}ݶ9,~exK(6$HL, /+YFSVҚuvZjYfccHUc #TNMAꯎk*ô, pINQW%WTf{Y ` 0gD<s E"sghҹcZ$/"@[QV~Sʄ{$HΖERO֤gUZqF !hkk<&%NOM+ 7>qg VM0DGByM3p=+-w =7\fX p^XĭLi-7?YfVI FěXi=|]7\kO"-~3/LZ_I}$/sq)BϘ>Uq\,}/y6W:RYnBЫY 4(6MMXDhXGe1+Ef 5HJUq$<&1Ǣ(>$EaAE1 |4YS)G'?fg|P:^6ё8 XZ)#qHJ9`tUR9E&8#nIΠqx3Jc7fuBǪAKX3%3o%˟=b(NG)yG%JcǪcM§a ߹?_|^ĞN.$O>F|cu ~(ɋ=IUQ8k#:=̣oi;*9$xN*LW_塇voeA?yMݱۙx\Wk]Do5r^RJ~޷q{;;\K}S#}*6 KdTF(F(e\{ˍ\w!6JS-JmGoxѧgfJ_ ѻ='>i3߽NRTP$QM}-Yϲ#U{s4tgvF#szbq[] ~)ɋ'8PtB0΀mVZ>/nVIGINBƶUx i7͠N/]j`+U r% {E-V %Λ:iO|b_1O4؉HɏN =ݻc  hyEpx7*ymo|qasɡ䣿G?s}֌ϔXc=5 @QOU UGY - d*!3y4-h_/kn9ȡ7}cmYgW{\zbZ(B_g?vEUhfgkܗ]Ӧl)wmu60EM'|=&%}Yd E\6K"$qgMkִڶ^9ad*/$1Kt];;JVpE~pi"3t};wFg[o(cԾexƭлy/G >C#s/-^(ʨʆ]~Z؂?վږEߥn#<ůs칗ɥ336UEaS[~/]l  1|įICHThp~@Gs>P=sGdUX+4&[ :}ZUR-\7 +W!wt`"+R 4$AlbXĥE,DVii@,R/)'ƋJ'(*a1FNQ1q}&&-Z)KfNp=BOzTR J|)6M#tTGEŇRq>:Bɰf 1…"JdB&P`\V?YVa8e=[$NGC6[쌩qԪr\$=>uvW-?M#YqkذU5=V7¹a Ȃ;d'x'fEBSQT=GGz8k)[qpLǶLB"Mv``b.SfܶKUvo:ַO,3LE=1ɗ~cwe#kyAy٤K`.I$B slהSQ;Z9yG?Ȧkv3wR>sNfı֢ʯaaϡlص5mOǶ9{>0QNtAdzQ.;nnJ]80ܣ `h N _s]ujߞ-Fсogp2>D BB(n{9>OsspJqE P@BTub!FK46:4t:J<B}@EPU|6tu4Ơy)kz̎=AUqd yt 10'PT]G14у~CC(j裙"TEQRb-|+_.E\Ƕn-3Zv7@$xSM4|?Uus= zN•J2䩧gxxx)~{72^&a \c^;}yZ'(Dl߿~޽.sÜ|0^~Fgsi!q, tnȺ[i߸- Ţ3mY\8~O>kO='el*=xp{oEgSlov#@@4*$* !CXw: yom8_H|$|9^qIEU "4v}>6kvJ(%X:D]gsգ|U>Fn2VќSHw=7ogk{=@i-Ob [z^JL N^(![[X~"/=8BqGͲ \ӯᱸpkz GDIHI`']c9rtHqL`ֵֽ1!"%%9;؋ǫEn{eW}}}<3>|G5MeV|uܰw ~<:I<é ?|UzI-[2|G8#Rܿ&b uAB0χ3 ס( !gYC#$E.vu<# Q1 E * u!n;oʆָ֯&\#Gh)Ok=aj$00zO<lh[XNX~ RK_9X PUܓ+6y2 dʗaDbVsE˦?~^8ñKdH劘=IF7.ڻ-k[Qkh%9E+l< %4MCw^Yy\9!Lri^z%.^H6(ze/i7]QXD.l>0Ov@c@as#!mN*BЯBeJUqEx<^ҍ/bK&M@#S66K`:®&YEhZPXd梢ժC%%Ͽ}So?}g QP)%\sE}Q0_5k ԠP(0000CCC\xqqPm7W87Cc]G̡\[ZB߱L@Pupgޡ$C4IѲJ9Z4}5MASbA -qֱmq)v}R0qXâQfiIyC(#DKCu%X$ȨW[o19\LNST1={c2GLFg!Rb`#ƢTu "V5Y=(S2Y(Ůk,*PIkw5Mݛf:NkgJ,k48||>?ZiP:FXh4}ӗ 4I2$ˑNbddT*E*"͒, qٯA\ύc!{F\ Ć&nڻ\H6_dp$M`= ),EӢhإv$B"Z _5 iih    9Ds䉒Nfge Oc"G<9 !C޾=OX 'N U3~'M B<^T8ҽ0/@WPh$EԱP(a`) Tp@U8AAa^fݨ(.HS, `YGQFƮkٹe-TWrBLPQ^,) sY躎' RWWG4%1 cOu|>`iƁ@`Q#َ㌶ѳ, ˲FbH>X,fG r~>'`6B)%m/h!lZʭv{Z⑅ Ag m]Ks]#E;3$lt!ijU(EQ@-L1n\*?nӤMHPɢ2SC4oQFG -u^$x#sbTwˁ&!~qOp7OI'N:ZCWxT5='Wp!~,259!YZy1rҘ<#`5T.4sCQGCNN@cg.kg8w$Ţ#\(( $ zzzJUUUGoEAӴQǀa~4Muhb}V4[)eխ8xm6m./~A/~B34:ٿg7]ζ^pV~:hD|\נ)XR%n(3%;)<*CXQ .s3OC<&b0XXN4!LX  ?v ]drJ* JYXev2ƿn6֖*AkS][:vo#&V*r PĐ6Q'N&QVW-M'.8 XEfR4בyB4u7ãL<2>W'ijO&s,_0wܴ]3;CQY%&A-;g,P'13R975oWQ2{9_A:En_!?[7uC;xAKGrb/}#&,<ށ0:g+My~*DBBA-6ձe}m 4E_\6ͤpFhFR ȑI NV)e'-"P$"  !D, /Σ6BK}jvلo=G l9ׇkUe6_>î1H ޼@**WX,zW}n?&ۜ^K"EIXVJawU8tv2԰#ݎV;uP7XiΌRcw#k%a  $2MHaY`=rQ- XUcF('g}G3wܸӴ(ZC),) &NNdrlmfW*z?/r+6 ᠟   GBD#AabaHMU&1Wr=`8X(H²@<d81g)%.B5޼ce`;ǵyU8 =C+1 mɧ4ps`(OұɂMpsĴ.D}Pg^-ӄޡV]@ezesegH( Ulʹ%Po!y|]uPDgoS(Zdryr"Td:HDDt&O*4-rW, ضUW#vkRJT}W$PQ#GuMEQ~C5B~C3TMS轢1tGECCPe(:sI!JO 1nٸ7e%?:u|$X)JW xIvRkwY~\ȱ0v)k}*sMVl_P-?_YVl;y:)S++ݚbi: Y/Q>Ɖy9f_ig{L ROž]pS)s{O3# ߀FOXc$伖<%&sY1zE!$Ay5R+ pe>f]A8MteS4-ibŢt$EFWNX-!JV Bh*蚊OB̢ӄ$ύdT: 1XT*nOH`.}3GWk)z=fxZK\Jùz3+ zGOU$jTyrܾ2)mg)<+<sKP˟k DzN`X|p<7k#%`Οc_smUڼ-'av ԉ,*@GK%D%^cVt5fOݮX\G9dl  "߹+1\[b^Y"ҟlΞIZ\LY5 m>ᖎ_gϤȘb!UҤLJ!׼_6UG?+RA-*kܔeL["BqVf Xmby@z$ *}J5UqԄҁjF+ǁe!zreea`՗;ި/$4!; C( 5!Q*~3Qa0: V%]cylp+rJ;cr!*lU*mqV\. 1rhy*53*-}a*]u72&K4OuYU>/Gv gMdZX?_J+)W/ɍ;<ĭX^yk3N YԒ*Cs^U)m섨կ/Su[N\XNa,:ulZ v]˟?t"ˬW*#곉e\JdT*E{\,*kg֤v{W' @W1jZ2*14__D MHwBQLGʧn=U6Ca4aŪlGhk[=7 TQ<;Et;q[60exMTwkOmS,0RFPRcr`Je@[΄:B93bܯZ\66gx UHŋBLQ?1WIBPv,5]sҳaπK 0$$i;}RD FW$~!*|<$2nڿ@Jc44.pwvs=an!]f񶪌}? | *TPZ9z< G(! +iׅmwyx5}%COƞTxBn;pUsfteC3f WP9~Aq/$E[*(,TAa(1RP0ySe#sz6,+BQL"11=O0FmLm`bJA{Ġ7z_TꝌfGUdVfH#@p1eϯeRk~uAnl30PxgIdwb-"xMӏD$Xk\/$E3oViC`iwc!hDA!WɚdQ!YHg~Y65t^׽QĐ6 R$&ȡ"4aĂr`$yUI2멾&:S)n HU? *,Zo91ȹ-tEQyF?dW>DB9rΔS2MUxˍ_}e-ZpR^+#ku$2Jt-tV7-?ˆ 13kJP*U@KȢ%T?2WȌXErB 5 .77^"H4 `H?a 62ۏӡW E]%-s=d2޼d@sluv[D+z~bk'r|L %_m uDSZMG"b'.Og1?k\C,4{=<<*QZix$eC44,P5l*R.1,QD8 GwpK cX>Nj5O-(քMPK ?AJQdSzFhkpU%أ{*["(:]3Jd^&мYqiotCk bv5g7v~p9Ks:O8u?{75_u{,x,GlVȏ\E@W=ofU``"SrPt7%аQH|HY  :  &ER@sP(H*-(l!&$#r(8mqk]"Jvi?uԒanK1EwRھ=.m4,,0 Sl]:)IP,^8ib`)D9R=j;EsbEp;REɑA/"LJLGJ!0T׸{wo pmK ??Le%ԅ}=*Jiv zvɩ5ho*4₭2"Dj,';i3(*Zumаd`a`c:f`H0QC Sﺴ36)q8BE ms&*6dϋ2ջr 5X-^Re?ПX9׸%sf%,5y+&N&h iap?_#n0It,_bʞ@nʧ?tw_v5LX$wkKBmy*[yjH\%D> $(M:c r9F QjNɋ'mWA]x,h;n)e&yriot|73k'rՋiΌؘ3h_%kKo߶Uʔ4=cP~jRR7xMĽzI6ɥ +hRDz#',/1%}Y){{.iӟu9 Ė`9GMT^q7lk9oW($B\w=74\]\՝K.Չy+%-@I0WJoYtycjAnY'1Gcg,(U-IUCإYħ֮H4E %d-Iі,Pa$Y)COf(KNW(•`2J}C5AgoΞ&mu:!uG7O‘, wS}զNlZn:M!B@kãL0cbXjr{,N'QTXP>߇%]ߩ .u*w0jl;__%hKWY%%R-]dMqUtATG57hlk  ZWMz"fm:TE5ʯo/~֫xmhẑp^:G5"{"] @s|%5)fbZSѫ&Z1hő?E/P%tU8Rv*t/X0E & 11PXh )4U aO!Š'c8n9!)ߴ_~:ËNYorkWYsy{P=<&#HE3V%4_N"˜`y4ПsH%C2%9S-KF wp3r$"73 ~J[H!s#>u)sjɗeg3Owx-w]õ[qoa󊈈ȐQ@DD.,6v][O[lbAzMM#UUÏByq ܮ:Y0oNq®Mp5]B!`:8p؂ w Egm?c:hmKFع&],u9 LgL `46ZZ#/N歶V>_y&k@=1Nw߃<;ū,>RU k|Kg = KO} h{E^rqs KJ`}p$\s\<'́eaIlO1=jml aCNkk V=[nnkk؊zetz7v qB!65ËXPl@Ŗy33_3fo}T{.W^ `o[& - b6a\ilaɢT """qYDDO ^{(,U6q`]xM۷(M#,;z#Lx8l-k;==v=; +7X[m [፷ '7'{Ղ DE8 ]  2v ``b+n1cܮ-}+("""B>XkI|^8b+`=| }l`<2sPזΏ_U̴ 6@^V,g^]{l߂ -՞m`&u/>"3vc'zj|hA|mDZ#zDg=8e;,C|sg[ps8ss`qȈR@DDGصqjϳ?7X#Ljk`+pWSĩMKV0/20nsSS{ Xpm8~&ɧSThlVE?shj"{ݕikcgKXbtEvZ;gb-'e?- >reVB ip]:*O(0w8bۿrWA:8t/ynF̤3vż&v@umOqtēje$ 7\ZWm2E u `[ }7DB?W~ԵM"[{n=ku[DXwmpIM*qpȨ hy | W޴4Nر EggEROKl?rKD"=`TDfʹm e()>/8c5wOa@D1z/~w.VHy&q  R{kfNW 5lZZ-"<  zOK+qpm1QC }P~۫_RfzZLUx&ڳfZOS{?gFzDpXH)z]E,ςY_>7j$D699`w}}'?Ǟݙ:t| eU{>.6>[v.ɿ2W^OWU|'@jS 0O'> NW.sm--[7,Hr d[ΘNw-яwLj|"""2,^.ޔwO# uW^wON8rx⾍ TW?TOƁ?.^,;@?K_Ax% >>ǃn-E 8YY$.o۰i xt]OA8l̀y ,ȈR@DDGaM$C]iVD/x=M@S=βIkJZvx6at [].Ow6v#=R/>NVfOB \bٸfτo+[w{ PU>WT[C:ہ<~S'Ú#CwCJ󀈈(H@DDƉɓ5aãOt׵I 6DO]> sfwU&5ůq zo#[+?Ip=eeE5I=׵{?GN33S[Zᕍs0]0V0qm"""2f(@DD)0m ;6~K?eMx{,Tĕ33 blhs]{wkAЎӇh޺5= V^XKW6©3=ADZUә vlNWN=&ܮp zCOg8E< LO=ok(dݺ>H<(*b|181LipUPUmaʭ g`=؄+m{"fX6t`W߲ٞm]Ax5;%k z=E ΂nL(tk-5m \syB+Y>A leP|X|m**'OYŒipNX 5n `-\l:Q;%=7ZŦw[2ZZ /3 ^`A(lN:PWXpIګ =-1&VXѼ`'9̠OIr2sm\a tx͖=m8k?OobK[,]8BDDDF%ǭ$DDDVM`X [_ ~Pvt[8,N^^{}3?gþ+~ 9Ƀ:y/ju`iwEхqkQ8m ,[ܷb"""2.( ""##™(| a$smoߟ|uWl?Z^&))7aDDDDDDddx[1mYڂu}B3sVһ j/"""L"""Ba_DDDdQH,ȅEI! ~yHADDdu   ""}gϞȀ,[l ""2 ""}ɿe+""ȸ88H!7L遈 DD:|`HGDDDD( " /S|ٴwTp#=$DDF;(fIx .HLDDDD "G>&29YK!""RԄT$PDDDDm t~G1U9xQm$^MEDDDdS88888888888888XDDDd,R@DDdqGz"""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( """r:x^9J[{p"""""""f>oxHGDDF DDDD.0!N4P3/& DDdP@DDD#-G8P%eM#=$䥓#=$&e.A!(hڔ! spHGDDFDDDD.@Ӧ8?UDDd) """r ]Ni DDd) """r5#vjZGxD""21uĩz*Gz(""c”I٤phic$""#LyrslU>rHOԙ0DdLxvafˎR~HGDd+.$?/ljm1aƴ\^P79I !j~ 0%e#<"i ȘxA^:rV{YED`,2TCEDD1a"R}.ֵqXHIDdԛ6%njZFx4""21atԶQQ<#݊ 3xǡe7il +3OܿjX)"") qƎȨ6jBaۃC~fxA1^1k)""})S&eB[['֝e|;r为藛kS / ^INvꐟSDD7鏉řLEIY#KiyӰ3oSW֝WQA>p%ں)`I[{s 臖DD "ca!v9]2|h'W㺨HsLV1YY)O C{zkiv 5GYN^nڐODDGs/~֒ O v>5g-2"@qA_sKڰTN=[Bm]ېk6E>/mSi!;s/ >!; "2(;ihlgk?yzH3&gASW>v_?vvy̟S8>"2s)gS iqǁx=Ca}1sgyDDdAN0-/?2d*.̠(ǡ@`>aj2RR~a.A%3t+x"2RS|쾕X@0O4-O'-͇!+3eHqT=;vSTor͐CDDΟ"2(-iy87sЦx: <38h(O9;lu}`5K "W6c{|))^RrSom:MKk릳h~ѐCDDΟ$EdPdeỗ۪~Cv,#H}C,Ew*\.[;s ȅ(j-)#ihszB0C+Gz>ыzuA.b҄,nh!ҿhu]j뇶[d7)|m%"2޵5M9pdϿ|dΗ3mA,c z\v`A?ϴ)9L8T]j*Zp(*; ٹDd|IKJ23, _?>$LuHO6;V*8*"2( "w>Iphj' 9^e'zඝeX|OsnT<Pg 6LR}C2Im㊈S@D݂|}x\LJdnT!pH `TECv󗑙'vٹ% ~trs}~Mm+LdԜA= DdH|恋(uzvs\j >!ph 0oN_5{#"׍+f:ַƻ'f1{fޠw zߢA? DdH,_2W9V-DQaM̓_d[YE>o1_=[D$-ǟz \^xeΘ˂~X""2) "Cu֐}~U&Fj!;;>t!"rť3v:}WwONebq֠`ἢA? DdȬ_7+&pX-U̓~/hlYxhN "F&O̢i4kFޠSDD"2~s棶/[;T/GN4n-""7'?ettysST1 DdH]wlV-Du2&zp  v), EDO^uA=nQAA== ȐVcAOH6$]9쬔!9HT7pƦA;nj3x""26) "C1sz.KohCIIq۹lA?HoV̧?zoo>=ǝ46upHw,cYCrl|:0 "2,u椱ugH ә4A+f"2rSt4ZZͩ?**"uO\̮#=>[8p "؊Gz""rQ YAk[HEDDDDdQ@DMqQe!G׍PDDDDDDdXs,a; Ȱ?G{EDDDD"2.[;pa+ "#qFz""`v\\;߽쬔Axw""2cΔ6yC;YGuM+`P8%5Y\y k)۷WG/-nҟHk[{*y6+p#2]`S@DDDd8|o`3<ps::B4@Mm m/'Kf'_Xϥk16sOŀ6tGv-LcQ@DDDd{n:BM][y>v X:;/LEUy5 9=u,\**"""2B[)luB ?Bye3_wugY~l0w<83  wc a< 9x ~ӻl4s)˗L8@ ׿ڛ4t&?k %ܻy<ۏ?z 7];6/%*{`r.,3 yN@ ں6gk؀&M"+SEEDF}""\KkV*[(-o`(L0q2SM#/793).!J7ٳgG"r-[v/a=w]};C;9~`05Awp4֯|rM7~NX6Mhhó )!\:3?ÛJ\x2L!x(]hl{硸0`o˴)9,_2;o]uW&3OQDDΗ"rhm 3<0[vrH mڃB6yz=QT+'s\~t..)B2R}}W8NggJy,ǁn~U-ɹsl5x4B; ?mr+%Ǐx𭄙czSs<1OS@DƼf~]W8~>8Z58U'VrsKA ȅd$o{>VRwV@½k קf[4 NQ|*X1o?>i'ô)9򩏬PY""CE5Ddjk'Gie7kcϔ6r_?||C˙>UD6m-ēx a:C>u}ǁھ]p<^ޟѿ?X t-d 9qWxpv""20Xz~Gg4Εj 9^˫<¡ c |C+V3{fސo4Q\H3z#lV=wTX> VMi6= %,& Æ}VhHT ܸu͗@Y}80kFW{ ""2DdH.4tRWƱu<\É;QGeU „Ba153l4V.9d[^?Ɵi;T$޷:Ȃ0'O7__=>y* ҇"2t۲4zҩm'b`"\^ IkLܴ|SqYpO3SW^݁rZy®G>\""H"2ZZT״rX [@%{TQVDSs'A\>M~/Y)Z6o^߾&Mu{>/vXm( 4Vju7r^1- W[p=kz/p ~w;!+vr/7٪|F!05_bAv܂Li~ocpZ:=D1-~p6v-畍yki?|a9%qxB,l&cP6AYY=R UM8>fe^_l@B2\?o tz=K-kM<^KM=fgan d <Nu%d:L΋N@N +x lr!@EU 7|'_i87CFy-p]Z: =ܭ"Rl < \^}b\T@D#Ȧ-%|'[yeq*[Ff6]g |_lۯ;VSo"H%-I0n8;Xz0-[LA"'CĩzNi8g'ՏUQ e}ߵ\z&Y`DE B(=+#4H "'ˎ=/}PRO>}c7ӟU4l.Mr7,#!B]}l4<( 9:=~TV U/-bgXIBTdUCn:ܱRK^4Lyn'L5uaJ>'w>+u/2=SqlO}nPRoj躰ᵣ?TEXADdO$I_=|-M^|6fDZ>*)yV/=&1ŲppWGz`4JN {*[溰`'7b҉7FQ@g~3k:9432wv2ϻ""@1+[Ʀ~av\Њ]dZx _!T_ ?/<0?z]{!&&ZfPOþҸ<ׅTii>V,=w..W @D\q؉:W'uT,Q[ܞ+MS=x,c4[MOcl,nl=ZZ 5 ad8r|Ra2i~^'/k/x IB5Dưٹgyk龧{=0>.1'͆k]/{_%Wo'-Ua oCKMmт)~((a2ȊX脭mbB0@0d 3f<:lit^df"?7>捷azpd׏CI';U4lɿq +wFK_0R&wM+^w͢kBvuvxkin?t'*2N4çoWpQY^ܺN]{f?7];޳|d8=>Dʞs~ɶ_z ~d 4BAh耪́^UJs]-0P 6iSa@@F6B! v Z[[!5A1@J"Z9Myxƽu=c--rUk P[lbKT=z/L+'DD.-݉COpO};@V*ܸ6c&501qzvSs'st0L8y:z$͡'Vg^ήUݪ?D>Ǔ|O>? |[ҚWD[&w̄cᗏWl"pzi `nxiC /ljYrGT.U00t4߇W̳28OEG;Y~mZ?.1Nq$ry=?͑{Gy`T⍶uJx[쟩,c9?fຫpEt1L)]0?i.Yޮɰٳל0õW/Rس߶ҫ6Az'>`MM _>bYpup /Ϟ } 5!r]i}ǜ_<>w&|'-?el]0 Eprk! ywxIv.Ͽ|y"" 7ܷJypRqUY?UVa_fߴo^0B"' ~M#gI O=Y hkys k8۞:t0lS~N56 ek-)[xE౧,0 Y!5nvW`ْ15s/8p"-7.9wQȣ!m8')pk@ȲѲ썶63uqo?ڋEDF)DƁ6{Hb[7aTF`MHztmܗ:ekSX2ag8Ma pk P'(݅:;7mŽ(59y[~C%Xz붕 }aV+Fhe <:o\f+R`^,:J_](l3d$YNXϹe|5r"{8ry_;~ 1m؄x 3X@[{ےU^aEg^Trυt̿ԞB|4ES?kRXwBXz8pnuDÈsg]G'*\= ' cw@v]?GȐf[j﹵< ?}:2%MQS[u#3&QJ F>滧z/:oEFvxk[)^uQՊfߠyD_\7m_l?nc+'))@W+N DL^)k\dm k)4--zE>6XwxtFێ‡%qB9:9]Yi ) vur;@Ykן;VtT)"2|?q/3')pxߊ/X >Q# & Z8]^~?.~SkFf|A(=y ᕍEϚ|^>Rc'>oϾvk mm+Kѯ ~k 6?| ?Ndu{0dCQ@]*"Oh?gf-kǩܜ4<:^_s.pvĺ$Jn1(?V0l[Z;-sl3 ΚSl?ztu#8(g -H_ttҿ/I>wBN>nlNVMI ko@]4Zp+@[{o|3N(Eu+.]At믁'#9FGl {J{i9TW[M[z ukj}.viSY1=s|oD?b98 Nk: ̴)9ds]W7Cg @Ƣ;V #9!پXIVa|yxggZ78F2LDdR$ oGA d‰+`zpy=pr8V fV>~Yr}Rj绛?)/"z˗B^ncc&5p$x=V?މS=wǁ'[aX'(Lf:{i uA$‚5sX|V o䄯 $ .4TCL@),p:^kZ bBmphT?z >,k-=KKխH$]E. Ͼt۴%Y8r:| (@d箲Kza^WAA&1&8ry}|^x!硣3~@v=\i[ag 3YʿgR!'*GB!x󝞮L]U y^gW nXOJMy@zá5gBǷ.Jn4ˊ;UX0 TFgJBL]`\+ʲ:3"k 9EҵꟖc!<1 r8p+[9a embUɫw^i[?o( +'+\V׾ {& <?{~cdý>AU?RK+Td}8{<,F- g_WCLSg׺ʼn߻o煮z{ ~f-=\[Aۉ닌igp[ֶؤ>RV|b=gJ^|hON( X;˺L/8j?'zN!NEz`_sup2k*,h =rHO5eBa(S5޳mÁ/޵_k]""^oЙUgmZwqțNH|g Ár.`䓧qlG8p FX*==:Е y_~vlpVkWVP  le${mdJtiyϪ}fLLsfspW3ܜ¶xg׺ >(.LYZm@Q E|w`WuK`oeP-xksl > =`>R ~,[[#RnCXW( m;-<8W®Mcﯾn um䧟"""cXeu שIʛ\3{\H;[NJOU7'{`p"J2D,&~]\74|蠎HeL"qXVE=+)I͟423qhhuCVWe`uRR,zm-wU{ W_ǑSs7e~4D@Y=l<<ǁlCugZ1%קL!xd 통qX{@d f[ǁ5zǪG{avqWZ@]v]M{s{G? }c/k:(y>#ꪸߑ`Öa02j[PzRjA~M]WWzE""0DƠ _7%~BgM΅vbM_g77ºj2?A~1\<3ao~|n#!ztr2B;(R5 X~쀬Li,);gj_+} |Wߠ15I~ N]\H|"wRVl{*x=TfðMOEBqb]z:Zi'@SoXS[gTU1P*'{!u&O5>1nD.Ͽ|oL|S_b)Ic{|n-Lvq@Mz&d|Z>\6^ucy[ os[odeۯ؉믆E /7sdmYWV^+ <&p”eSaN+k˕aZ3W4±*kYf["6LȱI99~^&L^ڿ`eӗVm^X<%2fǪhv$ 9^˟هUPD-DƘ wެX?v6ǴX@$Ekp6y@p2 ]lqE֊.: -믚՟\Ƙۧ/Vgg;<] 9VN6^Vgzٵ&3 !'u%PgC{v4% owA] C_`3/iOR TK"Pݔ`c;|uWf?Ǯ^`8}1^X8 [ "._{J x니(5N6\86vqvܼtx4Z,oqgB s (l~=xЛ)yvcs^׵]*v\-;Jyq NQ6^kEThS={r|eT64{+߻.WX'sBM/_iApR[J%2D6vںr'ݏege֞Z p'x#<v$99X4Ƕ{% ˔פlѪ.-Pkju eθ-۸9qeDƞv^zXj؍0}/T(mu`ѤߍGk>\.;V?u۾ۘa|hM |yk3vrB|5kU<ݶD^p2njǂQ6V }5ܽ2q:U4ω^kWDZ¸3?Sׅ:ɖ DD.`#v`/dZZ?ŦkL>v.V{ez,`VN+G MH"m 2{gߗM#W,(3f⋕]nX.عGt"|ElήmskWٮlfJiV?npRћq-<t^h >DƈWVˉS_(ʆ}vYWA}[F m6}/"2F( 2lVBm}L福ȘF muIږVnH^g7&z">[ Lޝ_ü91[^}E9/{~eT5G{[Yw:!ܹ?Qaٴ;VA}1\ײbȊ\VY 60j 4l?pf c8\Ͷ] 2&M>it8ׅS5?__o‹{mwO޶pYoD|)wٖRj8OcI۸˜%e ȸ@U|TG9U6J,!7%LjWkւO>w<*"|

{uai(ǰ$i)^iF;EdUVښ`ebٲ+~sٳݻw°#A~t oY gL*K/{_~o6˗/gʕGw%l_W[O" "܉S #A l:n\`thp,f)IvVtM|.b".)*HDFgXͿ ̙oWcȠT yp%w\s#ŖIzzeT(v F:dM;շބ.*i~n~ JDdd(wP(f֘K>Ѽc[ɋeݫmH @9<#yJZ[NkUğU_?8ȠHMُ憫ßmgJ\e,||G[(jA ' mmȠ{R e}@EYV g` ʖI3Nނ sfst""8Am5um8NLԤ.({KBC[⯧᎕0`xOLZa&}^㯙~BnAv{ X3 υ{^A]n Ad Dƶw)ѩcUo&O}zps]xaRL+7G .lZBye3S'h7eR6WQsUv]:lذ 6D S5jzNrm#&Mv ={ذڲXvC]kkUwÂX5F"S0%Cܾ NI= HRӵu# q ~^ foG*pEϑӈ-;^Q̶Ddq%dn `if%b&g 6w@mK⯅6?P;NYE|K72y*"c ]EƟVϹDuy&'֏l!Ď <50a.o.o_1ٗo"2blf|Ǝ +tyɯk[=O7_I'hO:Ҽ[d,,kr O b[]vFBT{V$cE>w'`yci~çIXkZ~_ׅ6)>~na~l2?Uk״I3Z;{emGm$ ] 0glm'HmQQ$#Wt#7];w%"2( 2YqNf+#v7>{iOEs\d7i~jA}Mα+3ժ\g$/=%d$n[;ʡ oZ {u_b ѥS-8ְ> 8tt?I@Q, {+u!nmd)[?[_ ~ѡ4z)pSD13aB@E؅~վhFJ][{7# "#S9=/A׵lΠmгk` .Uefa/8+_ mոUylj}aݷ 8ԵS}K.J^6g͵ls8pvQOr:}{8;*d@0L\??DD.P b~oJ@6xxV٘['< %h`+=>O|D(l߶o ! ty$tZdBax5 @B.>Ȉ:9U'E_\HKMn齨[-a 0v/HM B"0?4B0m@Dd R@dK0͉u^9`)LʵSv s7-?fBva)+()NfzA æc޳ 2: .Шv"cAj뮜}lqbKO&/>uy2Wk'<rGA4R\gQ<DD DFT~_ `W%_힘V@*wD-V)th"aذNr}&Jݡ0'هKEL^ڗ<@XFDLCIY#N͈hpӵsɎm#=[HS}pE0w:Žv-[LîmH5*p( ""įcIm <٪'R %-uѩi6ٟ`I;@~fb/H.Wk/}=sm[صbpjX?/qqnxfY0 b*76ubDfLˍ~0ev۰,Azт&X7"pHusKth) 2eI]p΄!xt+߿޵|jW4Z n&ԋ''?b}eʻZ}8Sknl`U{RӬ U z6ï$ϐ5vyB繵AD~ 5X:IҩypZ޶ 6P~xߊޯ[í3H1V6BUSCӦ䐟7""Qt5Xcǂw;vy-k[Wwren~L͏~6;ںZ b{K a4kõjԪ|'v%z~f\/ׅ;˨MRKDF+/si-G::Y|``{80ol7菖5O'zkVQpe3pp"""\nNjczqI=<-zǁum>xOIrS.T6%^A41>ӂLMpۊ vEH_L+Z;XDgU[ 2V\6:NKUY pخ3{ Xv. }$*x熫 EDFQvEXY1\y U|WmBȥnev{>Wͅzjҩ{HceF]q&`0oB1[׃DlidβEDFL cÉWS}p㒳כ!h갓d^Y`fG}NF=XdЏQDdR TQn,'枰uUMbQؕ$5?o|66.)ʂ_t_4öKF ,j+b+HAxr.L*Ȅ\_ jaglaBݘwv]صbaUXi:Q$uz,>]UXЊF"HU {>8lpD[|ޮ]ž))^gY)' T*nt!o@E#<-qn]8/α)69m<ߪsE{wԂIVoWኸ2BDpeJ0Ȉp?7K:?ĕm"fLN➮ nAT6Zq>P׽khK;x /HglmSDdR@d6%lj$-+׾1kN׾_y=z7S;{\Z~ GǷ[d{TU㉷+LʅUQ+ih젰@DƂ93\mA~ԵZ!@W伾vԷX~Y;]R_FQ(hF,+"2qb')}ps><КOɳ̄T?.1DZKDO]lւ`}QmB\@SIkZ9q~`a7{f>޾%[:ٮD3wlV}+:ڢ;tKZ-yyΥ}((7yb`hZ:c]x`i~b^n7Y?JsV ?~NݽqbNW?>9/.3N"cȄL[vMLwkC煼QMT٘8 |vZ<~o =M"" r9i)xuӀT4Xzw; 0{RggX /ӉuYIV:֒+V~x? ;X1ibiRo^Յx| ,ZY}OWi5SZ-`%ǁT>y*~?W꿈HBEF |ztݡ ^0l:x|N0t:_K._+!W>' ́e'k7aaeStFX{p3XDye(3qOϿ[뱖y%hkw:5`z5ZC(lEe&1,[4?|E ]JWDQ.+3%%&N?_56-x u{4=\9G` HZەwu͹ 4wӻ`9; ~ncWCa8\_}\A2EYVp+Q  @ToiLv;Im;xӼ4MTVi* xa׃㐙g|UicޜXT+v qݸ,?9:0/G*/k2mJy}̾rsRʌYq݈^̓Zϝax~O| k<9AjݣV =R/wc)c)eeD{!'~ΉSL: w @ ̱u1~PZD ^ׂ]=:;Cl|$s__EŃ2ƹdEu,u"{J`Ѡk{".[PQDD( 2$\mjv}*z&йWc*6Ll|4' EY˭3;DM|zjc^?3 3+pÄl;fӃp|:8b~mj#j+f1'g};ۗP2{VowL G>俗4i>>ᕚ"c@vKFaQ59K==M8#u¾R8]gc.ʂ`n^t, / 6{%\ROT0ѾׂLb#!H'+_GGcSv8ׅx.^9W\9m  +̣lGnHv5u ,/MǒvVxz"k0LDdR@d (*̈_n $}5[N+:ן@Y=_1JO=oXׂk S6 rC*qqǂ}K8Q^/:~`.ORMmu"]V~C^n*[=Kf0sz.S'`naT!P Hrz 5ZNp?K|k~.<&`av/c*Ǫg$.o]_~ TOD? 2b{#`g,\o:L|k)x_fwnc}4FV`u\x{e%vB}^}cmWjDEJn'f2N.{p+oRSVefX8yb׭8^mTBUnGpDߝ gKk'%eMWO9\s,>y*.d[wݮ m=Nu \¶j_ZoYM=Aq3vܸԮWoÎSpP?z d/oD1 aKΠMjMv#b7eooXW]1nR8 =7.VWپ{ nD=w0n-`+tLMШo. " .ͿB]}b2_ +ۄ%x`)#CUuju؉:{g䑑JjV)ci8Ve]-XhB, *CODQ,2wɦ:Ze#|Զ_`L^ۗ𩏬\2gW9NiUD6<3u5 <u=fLʅm{CkwEE,Ȃ/_ŮK5gAm Zggo|3G6!Xy%g!K/# GoF umֵF/練੝,>=b PUԗ7~{6(GǮ)\; .eAXW-{Z;hh'O}>޹+HIL.q@103;` aIqoslE*?(- p=|5J { +Vㆶ3?|&`7ɮ}vcHFX+F{G&V.U;a |G[mL0wȧ8@TSn*"P׊;=Z &$*Z{w7np9Rh ǮY]8ɲ{ߒk{Ğ7:cX6u@OGoW+p#PUDP\AfFus]N2at"} ?VSmx2> |U[ eG3 ֆzTxRΤ{^N$ B.'N"c{# Zn 9IS;ٶ0nmrq '%7'̌T rH%;3ݲa::4utthm v$ünfž -`53h׸=7355~VHeOFSkz *`kn{LyKgu;&$Z~Q@d 5=L?DfF.Tbwo5off*_}[`FAhE:\aMo]n7)Wךⵃ3YBQ6="C0'RSTUty,Bv>\ACJy(I8dg30fb,̴̞EgIVԲyv?AYeU457QFCc;mijO7rja|ni~HS=0tX5O-{jwkP8]P'#76f󊈌c >sX&?T5¢I2"9ȴd ܽ~Ntw0Pvǫ(ꭅܸ %G+2}јv^uy2 døo߇9㐞BqA.+5Xb.3ߛF}}Fg?+^Z&K hna.uaS΂q<Y?V/Y52k/[Fnv:P[O~?}uJkΙ>ܰKRb.5ι m]&2r=ql-O V7Ï߂w=9g ׎ϬDD$"cĬyxNe{$j4Yr޽"v-Ͷ) 籷~MχKX/XG~dQBq*lͽWNt#byV6{ZnΨ[:lfbq|@'9wt!xd+jK.g/]JFz &s {Ϧ@ L8_o!<ض@\1 ai+w6~*o OlgY}+ vћp"~ h;|s)N42}jj҈H#)$-G 1 'UٳV{u"M?zqE ngwY뼌=J؞39Lpհ`i{$gš.إ-@IY+\[ٺ4zޘ WvMz &{<gOw>zwt !~y pzC={K@9< n^ 7/K`&G+m];X߻  pZf}e_T7ƷgfuY~)V~m_^sCDDA1b23Rhjà ?#Vz:d%~%';-tDMɳc7U~VM< 掞ZV^t=i0%g$\} ]k18$2ŽtI̶i056'vo\_]Lr~J0 |稭o>c P'oÛGWŒ}jlDmJ6z` UVc3W„ 4t6ص g,4Yx3uI/d=kaNq\VKq͠ռF$ٔWFp*=X,@MtG: PrX; ߲ [ #F@_y=_=VafqB!An)2(-riVmq`fOOwiWoyhnIжs4pxZ^YurhdAD$PRp% '$7] y7Ok"UrlbޮjFM=~.Ͷ9v=9PfvY0Ѯ۱5PIŐSʑJ , W.DZIp2X:R ǫ'/]UEsհgׅlK@BbvZ,[<.K8 iFv)O^Ǯo*w7q.f҉ Ƞ쌞Lxg?|#w|ɠ*smvvݩ'zcu1yzis'Wؘf83ίBR㷭@VYu|*<wkwNiyw"ȜdPU  [ I2zn\7Z&УPi}4Ur}e7]W@;aEZl3o`w/ \*Zȓ߹ţt[))16mB1ώp 7]uGKX8w*/w՟c+̺ tkw28^mL]nu~y|.IضecJZd+aQ/-SMd1-vރ[9 !~s 9p:&٭8+:-aegVRcw}H:X8Re3{=ư#{Jv(TUxǟ9?յu"Hִ⾝rOFVfڀs^¹Sq]_<m{-/PWX`[ ua aNL0uْ0mq.L1eB6e-<ߑKc/‰\uw~VN0̚fKO@M9p珤xq@J67_m'-(2ԓX8NΗDZMNZO1Em C!Ÿ?׿@`;0ȸ`nق@tGlݪ\::jӎÔVWqӾǏ`:^ƞc ?֬"3W&lɩk!M*u£'o:'Ňy_oR3SaԄח ^;61scV,iEuVQ6xvMVV(+sӣ3\tcm:߾[Z[ 5~ʺ3 W!g̘RD]C357IGgP(Lu{Oiv-Ͷ* pR+{pnu23|.ꕓ}RבQyKV͏zn ?gst%GNԜU(DZ DC'p]hvdIsBS`j78Ucv齵jvܱK9 o1R3`+"2( 2̙?&Jr.9iV/ؕJ+H;Oۘα"5ljᩝ+RO΅yM^ذ>w^e!{ׅΐ}AKAN>MQ~6_O38&j)-r,g3.`_]m!_g^d(OؾmA64v: qS\AIY¤M`=k/ӏ=gdI9Yׯ%U45R]ľç |od PiSi -sHg:ө )R`qYdߺ -;M}w'W~IڱvSJs{6#۞Z'4L?v)$dz6 .iFiI&LPP)=^ w%H"/#Ѭ3 O#F×`$<-*lȥGcXvȊl' dyt'4C/4::Z׎dt!J s()aq=oچ6^_[N,[p*\<+(qVcS;?}Y\bL͢yc۟pLU.=onWo0܇,5!~=T?A0`t,cxvt$0u.(4uDi "U@1M&&UX8N# 9eSj%M䑧ʸ閒bX ӌ12]`)@U5{[ekj#4I[\7cH7緓UpyNcor8g|_rzEI,(w͕ɕfYV)N)av>zJz\)$Xۯ=o;#ϭeö4ubRH߉gwJ5ˤwAܸΚ oc} 7WK:¢R^zpQͦr2Orޯ%`{ّ-QJi1j[ɃezNfqQ,s3ٺvquCɔSQ΂f˹y>ZσO/o-u"@7d__ F}C 2"7;Ydxq9_c~gҘ5ulΞ1)&egGYp6#7ۉ")UAum'/>r;ϬlT31~1&fmVxE i^.Ma,,*a|, `aaaq b!ol Jf(Fz`C@*n" 0ɕSK[UEJ5I gI8V:; #ϮeԱ=@7k~+cVmMw>{3_>w= O@{g0y d"e>acuΪ~y{b?ς ̴ɘ06E[:fsɤ \3:>ŪdмHʻlQ|g[fC%O_?L}C d. 5?Ѕ1Ν*BGJG0~!*pUҼLˬyre}gaaa?8 :9UUeg4w~!L˔.Ji 獕IgX?p+CtNIHE36o0=b^œDc~ d_}2i˸3P"QEKqͥgۻe͖}Ērc" Lt%aL{ef]WHw"D2%(? g🳌L7sپt梷/h*p4Y4w y]\vd\vdV,LsK;xClYVB8ƶD5 h{υrehMo_i]707WkNE~9J4I$/exٵI~Mx}toxڗYc`\.Oz4uG9T)\r=X>' ik9H4&[-|0Vt.v^& 6(`j*kdF.i,YTyge4> ޲8 XiHqQNG9hb*=`wud{6LX{^)K9#c 2yqV8Vª0>w??BZݦu=Hjiz!w^]NJ^%3MvTv4 Gl5YI:~NT/$+3?In`-3GO?fҵ1S'NTS\΂X>/ƵWLg~ɐ֣Qer>\9ۨ?]7G9pǾ^}˯7TZXXXl4͠1`),,NG23^̀QHD ̀uRZ:UU7HjV/,8R/sKθ/J#m=[{dS3?9Y霿t}f omןS'on,K4 xuL/͖}HT6C&7'׿=Y}+œ8"VLp=Z[#O>e$5kvcj..p酓߄ʼn"G 㴴hl R%D]Pp$NAp߯>wCɘ l6XטO,%5)[/eޣaOr|ݐurMMhLdR`O t1Zxr]o&W,[wQYi?ON0 "?qa9fBQυV,$Nj[eUhn湗ju9S',Xc-,,N`z?maS]I]CNô q4 lޗ%[iͦ$*LSe)-EQx}b /M H sGXmk$u7\5mukaaqhʏqͭ!(`x 0M{V4.Hު}y9y`Agip)w `Ur4yk}ܾˍ ɽQ#H6 3#rBq9Ⱥb1YW,&؎WnmZ!q{ol?ϟ#7;09Zja:ʏQUIGgpX#1 3l[;/ 4Q t,*[* FM|Dxr`_,͐֏_ {)UwcϝJe"Tu\nCCgcH= a4 pƮ뉴qbŠ3e˜cvyݶzΘ;,9r?x+vaU^ybv=x)1(j k4C&/YT~ʹI'/?S<ĤHj2;ڜ1)9IسM3RG?,TCgQߊ,i[PXoތ34M:{q|>:+@k }֧7nk0!$vQcOp53Υd&XXXI&ldӶZ)H[{f ^T UT^s*;8qx6G(6RѾ &+<* 9!7͆O] d" Y@k(;xiOw/U\P#mhkl*7_uv[{IT6{_۟ _پ4Qݦ;.筍{ٹhL75EfSzo>faOaݦ*q;t|5^z&EY'r2neǃ/ew9H,u[1g~q;0Ŵ{$mjh (=؋c_|U=Vi6s٥h7`n(O*f3_! #?G=Ny8o6z Bhgm/nmVA+Z*kg߹sv0 Ð!5ulYǚ UlZC]U{k=sE&pY.,BG2ƫ0&M%ߣRte*,ieK>0 pҡ/>3h4^{\3iA_>|nYM+s i`Nέ~vK%l 5(L^0h2h~~|6C&@t::?"ԍ Qx V?%04'_oZN^Nrü |u%2 4 _5?kսއ/clB10kl4msnbCTukk0}@M쭓Z A}p5ͅ!VGM$h) j@ } &8JrB11jf~ |#>'H=0]7YI~˸ҩԦ3J?JM]'[ٻ{8xg?6l@.Y4 s cUJU *9.4M(B0JXXUNu!_l/\Ai핛嘬{`C nMd%VX{v%.#F┊#Ҹ59^NV n7ʱUǕ'CMU0M͖Pۃ/@%jςP8?7|{~IJr*)np!>:_ VSఫdN!iqYo Pu׷b&?L*Kf_%c햽5z6t*kDH1;duٚ)ٱNsK^u|rnc?N8v4vV"H[<)w}ĶѠo27η;CT&l_MKbaaqj&*Zٽ]e lYGum' јqtNUV}NAGeld*3U*Y.4t@iJ,jqztE9YnF3ɩ}qpRh봡\'ĕzMq:|dlLnz}?|z4~jr/ "%I :OD\sa~{Vɑ28ay/9; nM u(tb訪_Muz`OE ^|}um|p3Od0(l`[;Yz{U6ݭjMQQn ʀ=/Q?hdJhL㙕՟k+\0 4Ejzᯯ˒}&qf3_5`3t79.%EtMoUl\ɸ>fME #mT͚\Mmf$?|NA[eZٹ6fؙRUwd8MJ~:kt<6GK e_V.%&yiR:efMU丫UFuh tNrꀮy۬;,U.iBXc$[^Okh>!lRw3Nѫ22(dssgY~*s\0ØX8.]@Y3hy|-5|pY1 n;?}jKdaq عު9TJSK]"r= *gq <;n4Zp)q3qwU+Rz_- ^*Àp4Syߣ}M(o .;,(:p  R)c!M~)B~*64'tC{X>?ZJ*LSnG&y *x=.fM˅pPZn]KtL}=_}x\c|IFzҸB&+֥oq|p$Ipc 45?bDLiKEWk&0/76Qcތ̞VJiq.y>}x\l6UU0 !Yu‘AjR^@M} hA:T3]c(ch.~PL2 2J¦R  =4guiʤ}kaf>L.`PCp[;(Eya5lΑi.\yT~A=|6Mxa!v/}bthk}w=Ͻt<m kp6Ef8;sMWO`?V4<&Ba{e%HDh=5pOi]1M1a7mRG ??#сCwsvQ!ce?M]YGrc ySf4vJ= ځqPۿ/>&X2Q*R4Cz4XW L2 ssr|S#G[d`?ɽT -G9M^xQ'|\Ӽ.wӅsMWX>%rɶ-::(6)䨏j7E>BfMjR0Qɟ $Bsztc G66&I7ε\+ʵm{#]wѧBMF~VOG%30*]p8wjNxzL('i{ Ǜ:5{ Mp(P\*>OI}r--`4ׅ.Kśd9L؜*/աEکFğ"plh%UWqgtc[䄀Iǫ;wO(mV,Lȹv)KRgh})_NJZ)[4iy;ux9O_o! L~BDURzD:z`0v[Xtݤ_9#OlM-!t8nG@[3vE:(('ݠd`DdVPmjpL88.)P7UyW#19nj|Laf/̀1@_l 3d)79C*:É?N44[gM- _!kM0)bW6^≕hiK.NKs0wq0LBAniboΦ"79ǖ'C!TqxT|%3~I.E2qg:RN! wĩ ;n'թ V[D_Ye`gqUTn_1{^˿(q?wKͯ popӤ_Gq;zgl6|r x~ G?5?ջ)d; 1kFxOdݟ-Ta[a m˞#QP ֧7t20 l>DG'8dSK8{1xwDxVbhjS{8~*v+,..-q2ƫr`%,,N3*#:]5n|C;]U/I4;VVWl< ̼"t)Gr\tn,EIYµ>y8G+Y~w6q 93Mf"g!F*ePXWѺc=K_#E\rD;)=Y.9M ?* .Z⃇7Cuq[LMsMo9_-'1'l*WIybu)ۚQ'Ry(lM##|vTϢ7O;ӄ G4 bɁ-Nk;[W42/Υ]Y8Z,,N3ʓKr`lNV$qʐ&wV+yߤBK@J@ MGvwB@y4V-7uɉtgV44MdӎC8v| 31sr Ņ9d`D.B(Աk_%wd{Y5u; wor=\s]m[vc.#PGwreOd<55J%A @(hM R9U2Ǹa#l`L.aա~EΘt9Ym%QHxt0ܞºh^r=.`W͠&۩6wdZJr#9W/wOFM)U[Vi%߹k9_7F8F-AE`3u4p/ Y4?V-8~46_7phj sl"kLٸbKε|G;b6v&Hs MRLJg.G&{X&TL+ۉmP}^\ qOgFɨUi!ZՔLzNU!k"Z[ 3Bf ^PE1*(*\8ܜY4 iɫžcF\18?"p1גrl>/ߺ=e|敏?-7Ӌ8!+ÔJ/ITfU}|:S?GZc1 q)9SLHk ;bb&&`0L]cT *>A\5+@*Bdq3ﺱ$eԇ-,tǟ]a<~"}F4G.9%հ yYLpOSDOYk @{xp Vy2:6[N mԄX}Uy}NpӮ *aŦp3uy!9J6A혮1CB1Fq\!Ҍ7cU%LHcoe)|l]6:[9nwtq g;K1XL:aVo ϨncvYncRV2 H E~KJDž$?\wn\4quCU'lxx#lJn4;# ʪ[ȽDäo5>llYiIf@?">x~nsI3Ob+`aq@I])f"k{W5ͅo"?-˦'lB4~>B{h: e0o,8ljP 6TFzɬUL.0M rOPYKN^ TnJf$JձVCQa$#'O0*S9Ө7IԯŎ=^k`+2L`y_KFTb~_bBX0oXr-%_2 =!a]7Eȏ")}[a!KgfnVi !06T54LS: C 8\}r4Sۡ5p54 ~JnEJL<)fUr_2 yQ^=Hy}5kttF7V'v_#Rdrf1o6UiN,ᆉ'cG%<i'm|zߵY8ߡwvULdKýe*=5pd2V_v>}=Jr9{Z̬7<^|FJTKn货8±?71 =f=4325:hQC:7!B 9Ti6]L`l e^Bu?f#,3\EQA0/wb67xe"@crPM (B5uR%I0// eAi4#AeM'-' $@|C3Κ,Ǖ$cJT8lr}w,t$熳o:@o\br4U3ufZ};?wL<_k"T@Mss=Ґj/¢qR0.ړ?n{#6'IJt :kC=i0{ ;|Nӡ : h #Ҙ Y4̞_)m6lG -Iz _"7iy.N*x9MsQQf>4ӵ̟S88b:n}w=Ͻ݌(UuA aW֓%]Us:u;pڱ)ʒ /u[;h G "܂ljj{T^0aM'iCoO 9Ҹur4Z54BElmOkH'  !2׏`5G A3Οxž3gw1w9qCtG_7*^ܻ DiUIm]qv'쭇kIqGnPPwځPn;gi;I7kX!glw$>3F^y Fao]M /a0LP\=0M:jZwL jiI,hQ=j`h&n &;T+݆ l7h%`Q}{=v۫8c7`|Dc5se2$o;@,6t(B ˦Hwp:z=7?!1]GQz#nJ㿈4:11Hp,Kcdm*Eعk(l=*?k~4Cm;q_e)y`=xs'5~~=d=s2PΒܔyma[Bx='-,NWZii r)|ki:8MظJsFQ__yIy]@3sͦL/Q։*y$.7C}e$!M* +f)ہkH2ΝŌgCW)*\f^(My8<^1${ B0 iFaMUGbq%;ċ6A3N6a W13qߪ v?WC,ԥz;f;oS|C]N凿z0(dep9_huSO?wth@d]!d?ͦv9Pl*nrn:&&q)Bvx2n\4]3'onڇ>i"怿 DP.GEWaA xm'o7KQOAӃ*-!ȼp.g8,CqѓFcZRC3 x왽k|4>8Nj5o wB{RU79^-')w}쫗˴s|i7%Ti˺0쪖gHEtCV%kBrcL6~a2/ϡoߋVV:զI#k_m?ᶩgg&nʬl64(hP ~_( j:>4Eو>`K}/sdC3(l';) (e/RIQiFkr7 _,,Ȕ,?w=0in ͷ?+cઋ3oʍT5'hBsw> Gumvb \b 7lĈ5nj5t3.˧˵itmKd[ė 5MbuT|n܆}ksJwrbw"u?JqfQi3|^#l,֞|4;M3%TMvV?X Ӏxsф*K.[wI&1V2Uʔ{>ڽ|qD͐F| &$IE57-1a' fbK݇*l*9W/ŵh"-I}S*p9pԵڵ#t<Ms<)+H-hILilLTqsɌ 9IwovQ8P?G7EE LD=~UUXq|^vyE;Z?k,?-APQħ.JrG7\Ț-xbTAkk?oj@4b0>p<Ql 2q]{Fș3sM  mkn'z]Mdi,oHfŒI%utzNYZ:YXf𽟯XHs֢|73}rqT׵P^pP$a2(*xN2<)bڤbΚiv IU]3sna[Y9`$2O%e;@(Oi!Ha"8 9V ծvR4' NA?7x=/􇿊drF6$u9m<5 MA[jEyJZT|4獔FLJI=ATxQUӁ3lWS 67ĭ(b0v[ my3wz7 B?)wr}Z[wz[^,9 6r?hUჵ͗FG/3s,~^BſnDo) #פ"|D oGBeUv>{O?w:ڟٔ|cIycLL8 7nFa 0zG+bʡyҦiɽ/n`\v|Θ;2].9 +SCeg&-m~Qvu[yW9M-#c"n\_!%Β-]2cgnWp>CMOÔjgUcFIyq͍흈 !er'f&)Sm)doނ}uCƈS&YTE1 7  (Ms|C:7kM)3/`嫇30Wʤt@LX]+y֧6o@ jqR^F/}*nWwo#}t & 璾t:l/߰508Yilέ8KS6=0u{ߥ <6 _'$㤄3&y"f\}i|=[.&3gۻ {9dh0v ہn!NkᲩ8U`|U;CD4 v9MA(tb4"4"cqb~1+3cà0?jWy]C $0X~om,#&'+ c5u,c2&?LYwm8vDbq4]tFij Q]Ɓz*kZhj EcOdXfIrj_6(̔Mw:8 o[tvR(b:݋1<*']emۮqh8G5ǥ0MS7(x|xH_ݐ;i1FZXS)5ڢ,`clLɲBؑ`yXX=y{m1{ +0V˕P՚psf2ocPä'SG: gqh^s|No4[x߫tF6dvP[3ukjZ@@)kLݠRGWV$_ mA]s6cG%Q$bw_eѓBDnEo>nS1MӉk:i $څ| u[X 4߿Ѫdt(B`Pa'&a=զ=p'8T K'?;?E>') LG%1H2a!z!n|̚`L3R9r`k9廉קNBM0/ID,buXYbi^~N,D 7Ws*從VϿAyܼw VBm8X S]7ײ}w}1EgL_ xf$VwP3Goh[5i2T4Pۋz|ᰑl:Ki=7o}i=7>fEw\x L |jL?c'a#{L6KME_^/o7wphpǘ_=q0I,~ s2#ܲ[6nP籰8l s!3?}?~y??``2x s_JCW)MFK.} SLYi]o‘vR-r߻ u|k;v4e;Yh յL_^D˃R_L "\> IPQs/6Ǣ"W*l +N E^Vocn"GEVB+s瓛~=c ٶuMϙ%g Tյp'E[Gx+WLߌn}[t^s^;ƭ5mE׍ -0"zpo)z1 3i\ [r_d`)le+hSzv!V\ 8拯o[$g`ݟ5h<"wYly#2]oÕYXڴG]~I_w0a K\;͒BiK +`aq |r'SN-͠YV^gCڢ'Z9ΔR"j 03Wq~'#XٵMr7:'&.3sqŋ4-4k:m4 k"1(hH,N(%5uuFeBI>XLyg@~G5[XL~vi`f*#B,Z_ nS9![GQAV-!+o*:xF~* ᑵ||?qpYϽoc% m$>EJR$D7'$}'$#$%,,N3~q?45*}qN~q~&2CaC1ĩ &dڸ\QhJXX"}C0)>{If ?{=)`_>3D*g$z]xN.'3NLϦiSW] aK{5ɏcWR E93Ʊ|,[2)WZ:yu.*v?R.umG<T-,"Q M%t#M7p9m ~^ ˎyTiɫ%䆀}@A&ܹ 旞멌C`~H1Ə#Url`*3{SFܞ$@ٻKnn~6~nh-Ͻ"`Ny%Τ[*cu k|q7<>asl.3_>3M1`kOPtXq|x9-Þf 66{?RT+?6K7/F7n oޗ)z0!PU/Mq '`ϙJ1<K,}OOpXO| +F+P>Ͻ|Wť*eP6~_'^,v:_3uL5|?2Ν59J{/ž7 sFnaT2^'fWsx3Q9k BqL&|d44 ͭAvEU"3EQ^cќɌKAۉaGQ6U% "4tRzײ`5m#Ax뱰_\F}cMj ڂRE4ehcQG̙/f0e[?"O.J7iI%+"C%rs3FZHpGZ{r5eLkqqlRXM-A9hrsUG|z]mun..ʯJegG%b5jx=G~1ےlWʿ3`k7qW 0eT|6nGUcaDcqt x=fe|ZXUM[zcXd3)Xo<G]N LqD|Uy-@8lxfs8Ƽ=mH~/ݕ4;8ͯ~Ěba1H ^ez>]xJ|lsK؏X iX_cm]jFs UlS6vU 20.CȫPRr [7x'p? [aM%}z]AOqI_:3Riy|-YM`-`+P ;/K4ΆI͟lO"EUܨ%H 8}>!٠6 '|J!ۭ4HCD&~_fZEsfs_}gDNw-T $,$C!6C0 }tI 2x 셎В]1T>J㽯RȽN$f,@v>yI"i>XTElVCM]PUy|[XlZÇ? 6UfS] O/@8w߰GpxR 8L>jqP\v gP)j(]䱉7wsK8~}9_9'Z,,׈tV.XÆ5DcZ5U 8xlg;p (PԩkCU~AX3 )|}JDP˿PvL{ ]VL"!/@*u_`eWv\H T!0LJXXL\w}iʏ% ̄~=tN*aS侻 [`-:st_pQgLeߤOMC4Lb5-T~A_xEErU\v |y0ߔ|zL3YO~suo4YmJs%2Ǐ]0Mjl(` >p6 = ɄȮj9Nu P K 㜙йv/F0ؘt:2]|΅\ xn/g eGZ4˳s+ƻ FR|6&l0a?ftL:QAkԠ=b54$JPD3e~UNY7L!z[Q{}}Gx9һ`aa1lB8_*W$wO!7l{jt_ 9xfYkĿI Kis'2/*7'^F #E n<Ќ1]#s M#7B`s*z37"Oss%$z!`A)F+&~L/wO8![<..%oLA $;(֝uAMv>zi6|b hpdq^f_T|. `ab҄,e^ 0|d4E=Ac`[bkH;w<Βbbu}Ɣ&쮆߽:&@Ow"`XlwDx86tEnVn%߾;8Gkܚ;k|23N߃;l7c!i.O=?kw 1J|K(oV \?cJ"dAfG{fαj݄f&QADInJ BD71 2Mt4r E@̀fK:b&A$t+`aqزMǽ ܴwDz]UÔUsaWɾv)#WMs(ǩq,Whczg*;xu'5Te U=>I\Gó;C&2L&f*OB{Re(=DpvK.4jeaaыegsexrx'YA{G;D~ΪQ K0ͅΓb ڥ\u(ݪ#;Mڣ>X'hLCM!7 g/+>@JAVG9x~y#V4Ȫ)v`\DUg201㱯d>jlj iBe lqIvv>QN%BͿ^DNVaV6&]H3hQf HpqWY#IsK@pą&#=BHsm ^rsf&S]h-3MFSqpIYXX^/U>qS'tR&L*:t/F>RSCKaBEv'3sy2B8"pd;/Š_?x[# *ӗMQ(Wňi{KW8q"nf{>=>()Wg Y\v é#aJ)c;k)0 jۓ+]o / d ZEl6m^B&f_Aum54T!]=Zl ЧqtnPȽ\[Nc>-4*uWЁrכp"s ok<`Pٚj F4N=wa2M>sf3noaaaq|vs ?/},YyGÆ-5tF&4#:0Vg1`FK9oV$߻+WL%p1(q%df{7O4c؅;+zWu_q7u`kʈV6輓A`->{o~1i^1sϭmكy6@:QOE7t&fFMsO؜6 h.;,.7๝nPcF#hKIî2y菝_P{1yb6 ;*L(/I; Ϗd .UMz4 յh|,Q#%tU&{&Z +f$HEٓ8vJ`5Z_q27~ SI)Ɠv=xxm3+8\F07^0e}M@6ґ^B[af3 ,.3gcNI$7 W8}8{T9>lnY-pS7Z56Q+Fept'ySQ5 'I1m-IaAp5+in} AGAvU*c!_.u!֦B(W4ҒQH.XX.:oOw3JV.'`k쩅߮ϐcIG`wt8=oA[_ЈigH1{ WnI^1#Ly-,,FƂ,[?yz#UttFq`{>w3f38ҡBEMRrFv(t0.No9AX Suu}$6U:jeȼ`,#I4cMAG/?G3Qޅ|&Rq0J~ll Ky GE`p)@ gj+B^ΑNkYMOdpviO"kU,,I9<m3&Ե]oߕd{84twxi~11 б0fk{Qx|hpmMD i=*u=Pxh\k<"tz#(ۉ㲘?pH細8qxv?{=W4kڛGU@[GM3)G&N_g}m "t *3rl,*p0+L%i)ݶ  X  Nj'TUQw)Fl4-MiB}#R? cgbu[ nSd5P5G< !@Q_Sgx 7\>.% R+\'~:½>xarc_:y ^-<]r4 2}4q,Z) }մz>uU#m*sB0xX$@n_:aMbjt\fCeR8 R#OM {%O(+˧vY[m ScX< _YycQ^z0T$St&!ƐΦ8TN۞L21U\~d23FiۆáR\Nq4|`WY#[w[h=f@_i7 Ig2z>;eӡM`Wdk>%9n\JCVzltGDQfju9p! =ńR4`YQ9x?9wTF8F_9MiNj(ඥ0.>t\5M4 8X_,IX8n=}hLpƖN`M28vUk",?Hb6h/&D@ֶ0(-![C44ik3B{g@ F$ 4hT&4ܘ]bÐ>}޾~T^WCSgLÐ:CQDO4MTU0̞֛PNd;I:%=A~AfE2G$=+aG{tNj:ƆylH`pbKM{.@Ղ]=@Q& h4W&|s)B001iu jxֶ0-!jwDb躁ݮqu`(NK[@ F$jb:.BtBKXOW5kޔt9OuͅMAeFEvI:ev㥨0l] _t'y9C<|K#}LS&^ gN%$+n?5*όi>_"{BMŝ|9hlI Fe¡-$iC Q8:C% j!C_f7nNvJ皲W8gI)3 :-,,NK4 8g[xP [Y@6V%i=m0=G@nmV8Ű>e|E6:Q*W|qf^fĄ_}\Pi{a SH2sXMRnh:R.$cb3R;.%7Ǣ4IJQ`($z"qYk z?e{-6R rJ0߷|/ž==gEާLU̢v?.|\Ga|4 ϣbPѩs]îIS /V0"`\ *0%ˆKE j:6AD7{r=!oai\svMy̞BhT??UQHw2{F>id;ql9)O×""3C&zq)y7_]o LT.W˜,?&ʵU&M4H izuJzSO 4;ߧ`Er%TLA_uHiC 0]M (6))G[Tt߱~=/^ákgY`ҼҼJK2iiFSsmhU57鏢ihaN(iRcO=- ǯZ{M^EHCI3kz<]8?y={]B1TE:/MG6c=s/?}I0M$#b]3$:]P5sbК0|+{({ߎ`w6EtI \6)svSpw9me8T\z3q݁&#xl.0M+S|5u{h]=wkR c?f&QqAD39#I0h1:.+wc1kαAX3q$^c6́ P8N}cXORFHAAn YLńR31uRLydgw.̅kYГ03upA !y"!Y 7&|^#?I\ncX;1y l Q XS -;1+ ^.; p z<~֧֞ مX~N۱x{98>NVQq-!46o A&:"BqmEazU_}89R#}QswǘlҗL%z*h?)ʍ~C'?8! r"`r>׮<^б,,V=Ⱦ҄h$&WZAgH ª7ʇ & P"]H'L &-o|Ny,.$ǝlPEt%%sB=mIf)d3h F ڢLDuѓ04&z'hkPUɶҟtQZɬy̝U¹E̞OFp8Tna65=̗VC0I4Ir&,8%S.D416USے]!Y;\#rb#oKpO-]k PRVvnCnbaa1xGٖ)&qM'ơp &=ZBuDhj-i1i<|_0wEgi|q+Tϡ 6,|RoӨ͓AVǯXdypa̕aD&d*.%D+ߘѬRfy+{߮%FuF)BV3>KȱRp(乥sm]Vl,N &A^d1$&&Q0錙F :mHh& :cQ&nujWs6nB._nЭ,0 xt(o}<><>d';4 mdus9~=1Ĉ?Gݫ(Њs(L8h Nڧp_4lKbj"} ~ :pь ݈ӎ)R3l{ׁ?,c箥;w$OF6x*l>(fXXXX U FUƎ(BHA,[ S#w兙XHhOqEJzO^99d_Npב'ܒg4DbSX}:Mۖ:5:ݍp2x|T/7:mOB nPUYV4qcUB„ ӲmεS.~ 9~^?®nEota$C0fK_`,- i&AvƐN]Р>S0h FL†l0ӓ`&ѨN4*$;v7#P!')Jgl-dNΡ(m'(.J<6uw^fۮcⴓx2Bqd-7XM~pY%fLC8ov,/aKU K }>׏@-7Ȫ1 (9P`ێܻ-y`EDP0"A(ػp%05z"ϥ ]+{5 H:;Y=JXXwgetn<̘Fÿ^& JM0&uJ!t]s>.*fsӜ0 J;=-0@f*db\P)R911Ol uv*5&WBn-q2)Pp>WPe/ML} ӡʙg'* :c1Ρvm{5k4 Bva#FCSm;y2l6Na~sfbdQ¬-ƸbB c @B !$$B5lܻtE}ٕVҮN_/ivoyU}s!T'V *!p)RB٪"Ss1&Δ:U:X c]x'&1ީ[9eeK7v ڳ3 H4Xӹu0Hv96.x%MN+~'Q0t^w o@k-8ZrVC;HDI*z*v#Zo=򧿅'8WBG?|N\p\?|`i؅X7g<97&V_ޯJn_״2r 65xxxx$<*Z(91V4|݋T@ GZ6=_k/ tt[0dž5 6.\oք7VU -U+aU,Ew, Rik}"\2ɔ䎓}"'.X0X05*r%GS.FlxdאMo%etiledhO[?x]D~ sV8 v3vA؃)uAVh2YeRM]57Y|L~vUg < hqf Ӯꤲ:(oMS9E'=<x##l;iNzxxx <ȱZQS} k8)g)HR@Y!q*{2QUjP UoECa*CU8lU n&,Z 4z~S.X0X7xG췸hz-:G[Mc+18O>;& ׅ9{[ /bU+cmwO\_}ֱrC_%[h$w#:70mDB}t*yhl@fQY>cp  =jZ+"%Vo ~h~׋ix4mHgL|Xx%̡B_>C1}:'ȧ~@x*"g ς~5 TZBƒ2+[U(g(7*؃pU-l8=SŴ"~e˽VM@l3Tgڍ!l.#6ʂ}rBKBhO-J9e D^L(:t#}wl#3𭏡 Y8xAǪ:P8K BӄXu|kx*}Lѻ/#qbzg<` 0wmi UĨ<7u Cl3ƺV`g;3]*-%Wo+T;ÅM,YR0E@Qp aO)t$>M\$2%iK2wIHA=1wXR A@W~Mm(MBJS ^ڮDX_!i:E)e&= :vħZ OD} הb~P2 A .gxZ\Gʕ\ 9[rhAGzUd%g{:\We^1J.GRZe/7߾Ff-|>(k^mg4ϓΌG˥{7f0-y)uלOWn;av Jo\K{^J{^LOF|Wl?5N07?Mݾy @ UKDIM2HO_~e:r{2tj)iVx䅢WyU_jʱpxH=B .ҟyj(?;P~;}]&)ӝ(G@ 9 4_F8'L<~6,lWpaנͳ*z 璳%GŤ RԘօ 7'sṯ0i:Qm_sI{\|R %?UƪWO br.)SxѪ:3š"0[|=չD0S.p1)g쳩Y;8CCⷻElZ3[yk96"h3\ C㌍bzR8K ` Ry^roOUX7|}v OB:8uwȶUUZz}?}~|Qj5a^v?ַoWEgJ~}\ wEX HL-B~I4V)'cu,zx~zta"N*]^vPB J1z]BEU*'.jw5^!ī7Hugܣ{$q!xoY ^>īև8r_ߙHʙ9츪m߽T0Eq{u;E8g{mXM:j(J@45ʖ-uTV('l[Y\cbj[:ũ]akeەwZ>I˶-WBO9hMwls Cuscdn:{r<3`YRB&kq3IϟbŲ8W` /F9mt{;&B.B;9Fm_J/هQBZ5-w0rǓ nFۥq$M?*nڸ6ҏ쫸|d4aᱤK#F&bĬ0ͅ؅X{n;f 뎻;,X: *%6#Jhp!3 W3xxg1;(yd(r o¯l&9Qޱ5ON0m. 7Lx ⦧0vCyYss% .9Gs<=`, 쒱,+<Ǘ. u BBM#@@@ @8 u,~ ~8utM%\,7)PBxBqB,:VL %Q ]z$I Y U恜/L$p/=7\6uEGGumz.tpw{Lrn`;8w~Wla&9lX;5SJ&ئ/x[D[ji|e4أY2OMi{z4H삍__y ˤi3㻱GXwW{4;Atp'F2;Dp:L&_=|;M!ذ%[DŽJ#̏S{a2!P) t@H֌ӖrI yGy ;-S ㈀0P/`:Q V4 k Rtd(?ZgQ/,EKp8ޝ0z) e:%utWWJ8Ryoayt8ik|] 2Rpyڑ+b0P*v>˷\.h%~̟ɆuhPK%kU.Q4l۬7=o3=_b)%>z)/qKq&E˃kZNj_z.k8_WB}eH%y~Ϳ#vyCаJܕA% m~IO.X/~]3¼aS |4tX í(y|>^j*a_e^{k 0;ݧ`߀^JMY&%`Fx<3h-@\.74rk blo4UJ:#d>CGT2JT:+T[.Xg-O^TMjk#\# ܉~  6V#%<|sxxx, <@%H`O_0[ͧt+?&B96u Rb s3?aΝ,r{Ŭ_C Z͇_oWõۡ!Zy娚  [\c@pa̫&hjFtC!czΖci4)7N_>qzQ[]8d\ 6-ɻΌ3dx̏9پܗgot)7 Ǒ=0rV,#ĤvRCDk',u;֡øy˰ryxx,>c ̉_C͌)ݢ}!o 2'NIaϓ}9+aLkZ9(ܱKx\u4WWZT2!Ѵ44fo&.(?ܝP a x= ء6 ϺP)П,|4S6rI|-&=& >v^<ەc& Wp Ene&3@)EXɊGSK,US KR0EO/C  %Hgҏ,,ĸ+![?}*,TI\Oæ)S?]l5S;ۓKWk,豐W+GЭDJȦ AN?acUryG:gQ,Il:Op-~j%)z}v}٧'Fm~)l]91;qUOgo_?K4`SQ-)Jʔ=tOB\Ïp% U?|ݯTp.t(u&9'?gADJ,{Zvۜ{Ӂ؅*kܠ(?|d?c1Kܤ 5%|>Z%qK#QWb%ٽ1?SAެ:qX~ ۝0D:*US#|oW ڀlQxU7 C=V'xNICHKkyɪ @,r̀2\F]QW]`0CKȉyx,Ai3X'1޶u_s}.XU)qy2O~obd+A}lއ]q~r ÏvᡊY@_y2wVL7\| ã|'Xe!?RCwЗLt֋j5Ir2ͻ'Oӕf|͉ˏv?9<<<,I^M=r'y̥4'Yٷ޶ F[ԕHsj5D4A}/SY JyRehJ,2@{XceɁHL.Qj&>W4T8n{F*~#xm=< ~^ qA [|#'~'m܎~Ԓ(~Y%#m|FSKd~bͪrb}M v% ox݌~'[''77%h| ^X^m辔6Ak|S+% 1 BMhn|^JV\|^AƒFyˬhrPfdj]8uy"Q?f] Ӓ=#we Hp۔>DUx|S/ !nU'j>jȤFMy(g{C@p?睷@5ş4m>=FC muH),il]b榦K 'mBA;xxW %Hr$[6pWVv\wɥ^j-+oYA˟g#Ŭ4F]ș=o}xEJ%Jr`4Cʈ!P_= PC 1A-["K3+i~{ _1E{ιflZ+ٟ  &ˣHC)rUL'U5:_w:n9ѳE<3F} rWw t<Ǣ]<< blU5I\}۹o/)VMK~M7^s% ``NdLMfL7VxO~/?!_% DEYJ<0P^pJ]gyz`1YU+\wkz ;7IVk/IT3etgehxQ*qjr[!9%`&NǮKn u)˂˗s˫1'竅 'OXsUl7S^o3)LX +tKJ`eMW$TkL$GwXs;QHם Uz{ZDžXX;I`SK7L1pժXDk >#ϯWϋqk8Q' 5ڵyGNwxB)GBS+_|^doTq\͓HӦ7S8rzܹӈVBJXV*ϕ *.8Yx%e9ҕgGgEC%4.8gGŵۥ5asYӉt4]:H ..OpɲS?c&7Oy5y|ίJ<ْjGkN}Ӂl sӡ<fKCAG,̬u]dm|ؕR{sxx,A4MLp\5t<6H߷o i<.a-qFUQƌ%I.$YpI[)I. c:c:mQqṾ)K Ӏ?7|ْy i`Υ.f`58W--B9g ו MwqrKp7!!p ys'S ~nZJtCCD|)`.07OӁpaw|WP2L@D(8ZlW+ jU-Ke73F0_Z'W`܈/)(A)甖1-[SVޓR5,P7]>;DqKQh 1\bbykt_ v}%%pI_֡5P.6t4W2t4Ӣ{6 ]Ӕ cKH?)ܲ4&ǑT1x@ώz$eJ2uw, [㎂aC:ȵ2mT$B%~%HO$lVIvyJW &:9ʿSe#(H=yE= G϶/gKưAޖhbbV扃X}Iuw |"pe'qKx]8eV=8:FI3I?~p|\Ϲ-B2\pletxJ{;R4ǃ@Ζ췸l/yP>q%uA^`v  j}Jе$k @Mi3;|Xׅ'Voddb`_/Hڤ'bl*>J/Ի}ˉ1vES~1ZCb<(Pc)r\qrd*]zTA)疭M] +mi5iV`|9νB\ {*8ml<<<<in!8z#cAHm|.E1^ [X)G ccUۅu'x\21ADi8/~ta-dR4h|'%nhybN(V!&.wQ?aoIqǍ11EwbIA 3f^^nQ'.إ@o[r4ˎSwiZ([o2A G`1ɞ_y2K:/~t1^ #t _c|Qs`4 |&F{9<< ~D" B|PPIaCP8F!o`5>|nci#X6+aSD1~3LS)qb}ePje R{yi PyM rFMDC iȐяgo^2lb<\e0! -Ʒu'jKh0].>//U0#ʞ)>z%"S\^[<2]]zmceϟژ[~t+b:O#ly(}-y>vK@qsk5A 4ij]Zjbdxy"9<< a?Cjn͛lG@9,=ڒg-6K|,>+sc\7N9-Qe>&2vK} ɲiy@w) +A3Ғe4^f/P$P&Xz9.x.J;~ Fk[jߜל@Ng Dp(Ǚlj{xu!:Qʂ;ݺ=*zJ !^>nOx͆bi+%-TkhOqptn oL7*<,d''=_0q P*ac kSTWXIe#iDO\?/Kuﵔ{B 4~0M6-#| BoèKcI GB*)ӡPp*.8x%H,ꧩ!By5m TAʉBs mDJ58<-saҦm[ |=b Jqƻy w1 A X7x kK`i[u>r,%>Mv?_*AS1r%x*THTb ~BУAhˉXG]=D3diF $W%@D/ <eĄvNNt]s>9'2|5h||cKE*fi.%h nCW 1wx,z.Y-12,&Vp Ҵ$.=/Oy+_'a]6DHD'҉Q ">A@ _u ЅT--4:A]#F~IJxCwkR:u|ee8jr~Dv2 {_)A-Ծ\bo^ܣ}&xdi:ve'DY""zl]䳚=,=W_B{w")?ޓCe>{G7a^1DECЧ5#ROƐU\\ؒQS2s͸\2.}9KΖ-2'`+q+~EÄHTN?)/CqCW iהbP"^kPcj5et%CSƳ0@54$Bɘ*ܔJA:Ec_ /Z!@hBЋϊœ~d#hL/(_kՎ1s._|<72Wׄ!xy~ q#/kI\FM%I+I|1k HLGb`9cž3TDM)\55nQ 3P/0]ؙ|uf+cj8u@U`v& ʒ*gMS5O.ڠF]@/HqFQ sHbVDOU r)=߂`:; )1;4}f%<ʏf9kh= )y# ~mᵗPwٙ4+m NT:.1TFKZXl<eZ~cL,H:.fv"'|QCh5#-՞֎Pů 8tRGZoQ^|84,[R]ʬY, Q>'+*'SjiCQvQ5Y[(N ,GU yP]r&4\ה TTb(_ƃ%}vӪZ*0S*jiEM,O X|4tH!`Ux INջÙ! Te&u9t3.MEaF~#}85/:^Ju m뢋bi<<<#ǻxjWG$G 6>C'򱼽qf+[65%XH2d&])z3 f2̓[ .0 pG(#  jbB!DM_6Do Dc{%J[KP^>\EMZ`Mv!TFL >pvd,RUA.n ?O3Yyk-?;U+=G\躥22s^D `2'@о׽C~QfH|tdMW4T$$* CTx _>PѣA?.s._|"vg.*xWwְ~0.9BWz]h= j7OYߵl˦0\Ȑ`NfpeYsdo¿kΧO.#aٜf+X+ 'Dߩkãɑpvl9y=wp0i;4 +7V<3|jߗgYR$ 䬹eH y zvv`+y6p=6^BexxxLv7t>5vY`ӗsL]"D@I* oc;.+rܹ0ˏZmiZ*wX~CٜUq_AM EՆ 6L0h`шX0X4@&@uiD`9<<0{8#u´E+;x#&myv"zoҴ{d2;u9yK VW2HskS hQҝj"ܗ=<8ON&@&հyC#kWղrysxx,ev:A03#0K4 >z|mSʻ|؄XV?9;3 }qkwBБQkӮD,OhczJ)2}wASG1Am;{T2'@.&=/zp,z.TjaJQuy(F5GDŽ 8Di ДQLy5_d 6?ݛg{st:c h\"GϋQy(GG'5+ZhLiDfD!-"BsksJddșJg9vIϗomW +i8[s(81MY~>uq * ӟsp=BT߈OhD}& oè钷%)KbJ9֞`799<<8[65=*]ڕ?ɣGilyt?__?": ,]#h^)}_ȓ6'F| [Ұy/RJ #i1V:cXA_L_Qy'2%e?ßAK/^ V8x|g/|o{3|ļ.R@^MsDc{+V]t,ǑP(fLO EG@)yʑCR6AI%+ZJTtS dLIΑMɨ2Z-Ir;1],ҖBڒخޕrB&xKsj%4HUm9!8!zv =_{hzŖj_E@J^N]I-WP5KVxQlQ-{1޸9 |WzL?:/Ylc!I9G ۲ؚs}bmP}k [3e]Lo>+=VhpcmA ѲcW< #,E{>5w'm#^~ܺTꢅo^tӕ491CpV36Kkғl3fliZhhᖎ1-9>5h4-QAEe,#;2mն9m \:F84ph&mJY(RGy]2v'zh!]Y*`[~'d8g:M@hp۶ jðoR98\UB/yƫև5A.p iG|eg}du˖ zxxx,$9,n(pϱ69k1+Wx0[|̔i>j ̰?L>j- N`F⋄hܺڵHvt1|259ҴI߷}ۿגr;Zx~Ҫ|c<<ADtڣ::b:N@gr.@/:yKΊƐ82^ޑe] ۞ca)븤}`MW9'c߸UM(cUԀJa Gpˡ<)۶Vs J?ͺyx.zLa5о|y+W.7Ӄ=C6u~=^K iƎfX~Z#3kd, |eg,Ib!xjE,d WSv#= :DnpיYMFn{}I\śVI*I u9t' LpٮJu?^4z^ vV:|lҖ[1UƎiSCo~ ʫjڠFCH>֩ 16X,Ҡ.XY=ǩE-?)cڼ6lϓ锌3_~{{_au#%J3S+0tBz\ʑ1omM!jj7؟`[;H:yzOgikek`{xxTTL>jhɑ*~>MP㪕Zdu|vIӑqp_I(\5B+[iܶ@M__39aNbU+5XV[ĪVF20Ҭ'{2nod䮧hxhˉl[9nRNr`Y[͜_̲jCcFf[ %*޸9̃&ؗǔvdj%J΂LI( (: TOסƯ  S#>A_i _S2b~Am@# lno9h'3W OT3r*ߕ A:>mr{MOS<|z1c dž!g³6Q Y5CKӦl3TgGu]g[:9v8'/h.l:Xܢ'XŬ6EߑrXJ745xl k+\"@kTmRxtYȘr`WYLֵRy6خ߸G 4c}v~V|/1|,o!=@NrG*cHpF~6o~?wxVBN6BZ!4q9ơ$C (' .]eUw.`aU_x -K$* VJPW~ d>A̯5ujF/h k,4iۼz]<s;6{t\FAHrr,teSʋ- x#ǧ̏}?[9ߗqZȗn񚲾?n>trLyGr,D=]&-$R;&:O3ف9WSUsxx"?7{9k5ghuAKwc~kTԾ&xbQ Tꓽm[\*Ho:QMnD۵h!υ>j<6}ǩAo֥;?iwXI9fU^Lo3h쯯US*>m9fҗ]B3tBuqfEK4J&'釐f* ZD>J x@cS_ƹE's0issGo2݊LgQqm˭Ĥ _y+?+Ɨ6hM ⱥMcx%KK$8j. mQ!cIrlIQ%m)z2%i,cQND U₣R?!q:i\筢!‘c*IhU":> ̞W!X 񼥓o4Gwք-3d8=eU\_2f?YՏ+!myng,C[OgFKXcyLgc5:Maqq2X%ԑþa]C6ml%;w"Si2ι>.YFYdx(ϮAݩBHKVkmDL#:բ_ddzt`V Qt41)6 n2Cogw@k/E1{qRX1[659\ .#K*(R;^AbhޖuAΖrlpe02w5eѹ\2mp;}p{IS✽]Jva}ߤIye]eE/&5!5 pd2yd ɂ}J$OeXӹlYWum&~.h"䊎GzM҅r.G{-) mOX@=QE`jZQIV#h0c̩HMǨMLjaeM;e]R*cdN1O74U_h  6f,eyM+5| ԭ[Nf[Ie=q N`:4 +443pgb0Q )r_XWODq) g:ݙ8_ĶUғO Xۼ8Y'MVW%B)r_7d!(Mw4<A"88 ~Y8p$ ].)Uǹgfҡ;0j厧^Rh]SԘۣ:+jt6M45mA.wɂ˳6sUN܊uG۰V|:C1>@~$=FObu;W` ~bg;5ƨ{ ύPx ׼xBic;ykO@PܷmߗN? S_D^"$3  JII~G`kjͷT5hQe yNB (s|_&?׮ rA^iֈ׼emU36sΨdWZ9 :G)5RHr6mWJPǥZ2C *@/O`AԯZ+- j4!h kPڞOoe w:)CʒO(Tm-EOJkJoM\iu4Gt*~MUB~>c&Fl24@5Phk=UmD[&g-ĹL1|2Dgg_Bk'K! ꛛH?{qS oƕHălTa+3h3[Ȣr\wfm h Q}{ ^*i_m SU2)SZdAՋem)lQ&YPrdj,,Gq$Cy)~JiF/JtN&@@C.M4%NcH#`ڣ^ͺlIohhZ]iެ`^9JwRK˚Pi66>YY7X]_H;#=LzYKV@#HHK=-rpLc :D~x~eo^Mv'DjI mJέvS/1X٬.dzdUQmr.{ڠ]^( S.xMܴ{|,Ĵp/ A!"Wd2ŒX.ɂN K̫9[s$Ø_>T2]2^/h(T]PceڄKDtZyJ;u<vf1J!N %ROfB u-n=Dnpי]4|UmԮ[NfvޤLeMhN9Xʢ~Eh/\Od͵QLtXl^KV'qص.g,N8 nK\ċҼdS=A=f'8)`7%՝5Z-= '][ՠJJ@p4=`>Z?M&np2?. ֠a TÑ0ZpIY==4ktzzƒrdz \ TYؕ wt b׮&&>v.¥}0x\8PR0(o&(߿Z$Sz\2TKu.QiRZƭy,/:G_ M9'TrRخ,o}Ԋ.,>Jh}iB rȔ>]w֨e;Rb:Jٸ,ٛni}9XSrFΫt |x_X(s5#k VuZ"::ưoR-W= sdgE_r15 ͧR&،q=3'gmk>cLfE H ;W``!X WӸmmm`Ez ycE]o_8q% ,%Okx'MpP͟ \@;>S!:-p#l_5'NqkpC_͙ӯ\gPQ)!gPF9FrS NT_(z8ziڪ_`^%mp1k05eŖ8d0Hq*(A,s :w9ET.(V*tS@"4J۔a78K EcU=>.Õއdٹ i;哏U^_?ِQCE!V%%a>& jb&bRp$mv[mr pxT,4@_S÷I2jiWÎ)|35!87AY-a[V*ʌ;ʲ%ҟ3ConR!U翽ǎf:=:ŝ%+v=&vYvȳG>`aԔ8Z3V){̸v%y[ r̰-T_e(ǮTD)1õ4Pؚvdz\9q+dzJþΊR_=/mWzTT(.Ŭqǀ9it|M(vb"PѢ_Ҩ h4uj Β ]v;p i~{L6f1Da B Ft>NX{DFϭL1Nak=$ QMƖtV6[4+)Xx|FV_y>GI9]$+s&0o:+a`d9?za:_q$/p^deħ;JMiEbCX\W1aj)AJpq_2TK !&jvAz"{aCit / ,xAã69ךe;ri%X{㢤̻C`Ol ?"Mģ'D)@TyY!vCAU^ٵry1RHmįs8|<(jj=*+#[w3aUώ-a>W<s]KNc4ơqwgBq»iE zXixۦo kO vp`JedL0mU3Uk>5 \gXt-ۅ#)=6Z9go [6` M>޹-ql;=Cpl`xMyq{|ݱmZhҢ~qWl/0=TRy7tr:r [\@WưZ>n.aՖdRƑЗuqxyCaRI3tBLm~R:K# ΘTBAi9vljBVT7;EX}D楎qp-4!xzm1 £',Uț(T.uvvoXX#j ] 꼖9NgF2pIB"zV|jlঅiz rnSv~X]Oux^خ*I啐H8#yF!DI=Xls<`c e1e1fO8d+r$e1ⰻ(9,lU1]\042xƪ%턼 ]оt?,v0}"Ao~%ޯnz;! ;!GH:Vu_B_hpEno5 jC'@pAzH C=C%pwt͇XS%%妰ƊF5X_ki idىsMYc  VT0:̗5 /QO-0ە{(ɿ(Kl>A]P9Ǧ:umDP{N9.3.%G=To*?YkГGF;;hWGV7z'xשrGsNt 6؎+J #RV]S"o1FM@YY0XY^VKKQJSGSySb:r54Y14Bc 6Šq?<)ZR_B'ԾٵDz{jir&tIhs7O,J0-?spbEh@>N!A{2K)!k99#GGC]~{3o9*JH`8uZf_jq{Q=:JƜz=S%#H8ekjUkp}l/ j;5BʈOeY4~du;-y59t<iBLa85]-0u|.A~w45h{xȆ(i'M@PHcLͳuS#G| q f.،;39 ^W7ƶr묊4uEcqͺ \:Gm:FFѴH1_2KjOn8ZK67zˆu<bmo- ܼ{o_iBJ-sÆ@.9MG"}I֖d,@Υ'kȦsMR9N'\OAO2J}|q ˮ)z ]+&`gXEPjO<Ʊ^P㿄8 D4qI:/'jHLiW`B1/3خѣ}{ CMdq#d oFpاmMrkܺw)FΌʕ(-%U;MxLSmdPՅj[E'C)@m+n/*G*2K RB6Z|Jv]4J -/8꿮4ؚ3<#gspBds e:d`߰EE@ɓXz\" !OkPϗhF4HTݽ+atI*1RPK̻dQ-;{kdjayM1ִ\6LЯs/9ԝ3Yd&c1-T;{ kreUaaqhٱiQV|B2='SdX{Q%kvK:h;ձY8)[[lm/Xn5M80#U't8YXOcS)=흮ڲp: S?vSPxCc=НEOvNJ?v_1_D`;p6ch7iʃ`]g4st`$cd-I3fX%a##x&T8:2 b~A<qA]P#ԇ4">e-y,,yG6%t, %9p^ 퍚Khgm%WJ;,E%@ J߇RAm,@[}MQ6,O9ƚZ4Ն:iҬ!ֶTvXM3`c j#%OίHǥS(1+6e{ᆝJ{A`-kNzIW*qg7|(Y: Ytpe Οѣ)>q*"=HTVsP,9E 篨㗯bW_:u`gz3tY.fљ\zۅ#}0V>KCWu⭈?4L}߻^mz77}Ч+GU: Jeګ6>$E&CCy:s1HP"]pft(KsԺzs,wJbA5ja,jD}Jǯ6Az^O/JiCD`%B)Ȼt8$`[mJ"wRyLGi yGB87].9λ ]$eU>aMtF~{Ce6,O-1Z4ׅڴFtDC>6g{.t%Gdˌ}pZx#ܡ>vC\˦~뗏;EB)'սLe>p.k89P?p2Ͽt]u@J=j8 $,OcG{1 f84c(ke E]L!<㪾#)\ !$K#}Yg-8!`Y-ԜU&Nz8j}u|tX,ଶ:%c/m1qh(ǁy$m2CrqĴincie fNt[29<ˀT+ X]qVC9~-C+ Q2ۮDC MDBܯ7$#Puˁ#ےt–*nٮ2mWw\" {WU|#9eoP5:?Ћ4c!m -ΪMMZ}=_~v;߿moe}c6eZcߜHǴNbtyg h?VO\kUS~YP?E$/K+CV/;ǟl +}TB_h9wY8q%'aQsZ@+kE;qF0lzz3 懮‘i~5 \þ^YŖiǕ|nznkRb9pfg"P"k9mF6i`֢?mї6ʪy邺fLˑW)4O,5pw%ZҪ5coE+ZZQGqc$SZ χt&TW F1 34 HD4&B4&BiƖu>C;aFtH,c(U!h8^17 f&S0O@J4l5tM9x_wl[VܧkUw `e{)| q!Mg )t"\BgFƲBoUCup14+qa?v=JVR>0B@mGmj*Lǥ`K2CyR)!oE}A0UcɽFx7=QB!uR%DL-%![W*ǃ/I_~\s8_5,K=)g̢^KZka\, ]kϦI=jh% M2 }jhP}^;=<BxcՍt$o-<9pNy&CY5/c:mKJJH)}o̘a!{("ӜKU'/Z u5B> O'0|DB>bho*%㾶hNJFDԏ@,yee X`gveT3;K ײr.]/fha4S5g3y&r gΪ?Hd 9LDz{r4MuWjH KVtYqmW{X]\~;h3Q<UA0c=ώOjkkyߌǶm\4M\ץP(8b6> wsWmlu `0^bPR▥ѫy9Pi**DeUB4yD/O+yEܵb MLho۵bb MSCдRʽkg|hhDx)J QBHG(SѐЮUxCjCp2u횴Ӧ/v.N93] 0][ΖHz1V%;Dϰ3OZB`Sv@r8UmWmD|n s~O7mm/{kk_k1 _B4*["S__?v;w\o/.z<Cg:\'3mH=8ܟ-LC[n_g/%?z?!Tkňۮ|tz3gooՁ졡?y|h! hh YHQR" r (a;RJz^Y,H}1C1 q q1eYض8R @4:w2T\h7_DԏߧJ>FЯkP@OЋ븮$~{;!WIS3BT2$T_(|ښS^t |*Qcj"J]ٹ4cm>Y;;'xQy07ʐ+V}sWƉ4תG%$xK+*ڶMww73n[( q=)DU>SX ?zGvñ$姶&iq t2>X UlGЩAZҴתlJHo<)BI0PTT6;O34 /V, _Q4&u=IR~e'651¾u2&]|y\n9 %Hgw6uB9+/ ?{u龧C8=0S$EE+[kZ{]koʲ$ے,2)a3=@Uit#@z(TPu|rnFl_ JtUs0!_ _[N͘߾?ʖhyHԫEh G'nߥ K PuCCC>|xu8[-\>^.B2ož76u&:/s<%&4-|,cw]$q9F Է]CeuxS<='1]ggb*cOƅ,_; g2zu=Ŀ8]7][,@fF\a]hdffJωb`)ډ%. r} ظ)[^7s Ot .M0;z~#عGWkaxr*}V>v7jT*o+#2ADb^eYd͍|,|esI%LN3 OYsif;R;-&ׂbimz R>5 s}׮$xU: s5a۶v鲛izл\UKgKq/Q]4%2Ibm4mYtVo>^m`)R!>8z_#4hGUT旞g2uDuA<5YNŚy .7 `nhx+||~ʮpR\6XX OE \"-agi۟>KL2󻎀NV*ٟ}^ 7\lh]%-Nb>(0%\ 8? 'Fj@8  -Eɚ* Ƣe+נmۤE BY*-%JS\VLo{;Kռ7J[mK+I ؚe#=s~= pF,n`2q,v؊.u_gGg48hڸt 97ټɱ 3Ł_ضByr 5Τw.zƲat݋eL?1Hfސ'J'82VLq.V=XO1_^痐J eI 1MB. ͔36E0gً1޽s57|@Jt@eiX -&x|s'Ga&XYR[U*ן!J@{O('G:~JM iVf@#4=#LcXJ"~ڴnX;weHɢ+8{5ɕU8ܿZ:#1ѹP.`Kd-u@I7N{*Ҏ@ )!]= E'X*H>\st 6t]|̱Q^iG(lR8ew=6lb+%u'ȜCtEUz`:R/pyv@!1*tMiL&Ը@*oׯ69{*oΒDl-)eYqtK @W s xcٽ^sC #tMՋz=M] ҶRbZ- m[9DKY;-7ÑŲ:H[2s2mlzuͥ<~kǿ9˓rd+wpo_+-6+P>]\VƏ5Ǵ*3βJex U~\# 0k:eX2|c3^]ȎC}ԁ ^2󵗑5>|}-( /;BVע[NWXe@JiI^ŃZD:!ƥTNk@W8X6<{!c0lj_eҲM 3̐!51Cz*Ff:N!DΦR< д +nx~6HQOsw^"5 {t83}S.39UZQCd^rfƤ2YG{"|]ml6wS꒽yڣ>nwuX\Je25V B4]J-zE[zH 6V8!n(t]]i7 Wj :c[x L>=:kVLԣkFcljXڥ>CeԹ'c5 Z"P7-Rz%#lupImEπ>tHt(Y-j^‚_ߠʵEJbů}yQf:kj (cِplv~0aos3&{2S!6FYy.\ L98X37fqR)x^pv\Axiߥ0snh|ߎqg?}G+=%.{ӆOUk?QWTPCpsi.o`Kgdnykn4<\.G&x{ !i`]I$X:l C[+Bh ӄohlhqǦ tT֒Vnylfr̜Zi9_<֐#Ȏ_p|Oےy'f6\G܆~-Z?Tnغg,PBKɿo* iM@y@ uܶ^hxhgcU+$208 `$LAWǫ >z#^9awwcܕyPrqԲ5mo~Gaݒ07M2ǃ똦 Z/.׌|x;Ͻ5ܡap N)÷ #Q¼?4µ(4ukm.{Kf_?| աA ,Ktݶv倴%S'.2s撣Rw)lC4B䗾ۗs!_P\n.bdu\*~n bŹx1XP?ѠeY̝9_+$iܽo$t zBK^CcSO7WM 6O\qK#%|p|X8b2]ݧ&E>g|:x T*(! iQ(Q"jt;Kx_u2 zUKS5͎\㭱$lnǶΈtuj|Nm7YB% u\wPϛ9eį+PI&lҒ\@mm0T3RHP,ixi̜LMh750%a~]m>*[ӆ'.eOqrڬy}r0P,獕ҹ$M95+Z˲jlirjwpDެvt;\ GH Kcz獄,w17_\}$[ig&@"k~!3yF)z8F~95:}7ftN&s^u,) S5H Fgݳ?[ՙE1Ѹ$Y-N$M-=@wN)5v~֥dc SD7ݱeO{}N/eRiI{a-+#UӘS֒]sk-frll,5Ft+%D WwFoʌ9>w:ͫ2N* {?{/ `@ED\.hTɎ5yY%S L// XzXB|ձ3 ΏJO24bj*Rnrr|ld&k3)X6Y2 6?[l qДM~9]U^j:,[Own+Hv#V;r#U%<Ƴ.orn!z3SphU(wi6D26J[:l2r8ΑZ(;싓O ^a:mC[%z`2qjf6*S~V?xGKPő<߹+9vSt&_]ueʍx]pBJ|]^tL܈ꬥN\j#m#B@kHߤkSbEsu[谨qx?GNO.Ufmˋ ޘ(kwGѶ:&3abYX&Lfl9)dLHl, !{ACpfj ۄVB2dT3F 'Cn]'U./Q8ߌ@u }:kڱ'#mH>;3 +YIxk,Y74CǙΫօk3钋'IOvڡXW3{ YoWggM^K9L&6|\4ɻiv..5UeN X+{LeIAY] c3P}0ןzeml\kQ-~lO;S^A }I@_ͿHeV3qMWuq-2XjUs%| veT&."JciIT%^rR!YPE5^taиS @:g2Y߳yf,<{~Y7mi[T4pK)Ii ä+,յέshcq5]4W`Y5l^=K+eW(@~*H&6gf 6Q]-=J}xor40*U疢rUW²RPΖ.'8O 0UTA Lj4'cpeF2?.d4mcZ*mgxNWp#CsgL 4lC !WR"~hYKx 5Xt.hе-R竚 d&LXx ~?>FY36^wYTpRYL[bǻܷjGda܋hz*m@[[M@.$5>Cm&c9%Z&w4>7cy$oM,T]-~mwk{ ]2)heP5/5R2J_A%!󝚬M.~He UV:t]G3 %SJIXũkŴqԤ0:S}F `/3WK_;˓ggi*lKՊ3|Bλ7yhۻtOhBݽ!^+*wdfd̕I$uC^mA9J,ut \wndk_fZ*o׽CjB'f3L yC΄/-M _kmt af[sCcD78Fa o.,q=kQݽsc+.f6F*y Cf㸬 !7Vr}UmN}-ƾR] ǖ>]u5ozL FUdwwsC3CLӨv 9=crv6ɟn :wwlm1 C|So |JPmejۓ,csضz] ^CǨ!J[ y[K])Ѡn~/^t`28'G+тx*t[n 0<*_ :,{ A{=xA LOe%R2{vWOa(1m-j|;jfJ wYt ` F2t èuI XJ%XZE2?,݊صZWB8[{{E\JR,nVD#[x۶6~ۃ| C[mĦҼ4/0tAoHgKHp{m{ vxxWdIS\יu :\ڵU: 5L7Oߔ˶3e۶I@؄ Zۖ(ꬿLJK)Y4kYJorݪ2}&־+qxݏco2>0Mpƕm 1k`qy<{zꮾ7-P FbkW-6-"5f:Gzb-} h|+wuhBGn r^>6Qտ*!t9iB-縆a4$t &Sy$t`vfq,G"A'.05=M޶[t?_86'_+eUX6WWfuzU QMQ% it5u6+2S-#~oi]ac/mKN\> <]7FS+鋓VSi0; -ڼX|,'Y9ۨX:j:64z M,pr)tϳPOj{wμHL1-ױiIN]v(?@[y[;uK |>s1M߶,b#;dF^>:t! }8ǦpUvPMw0tnu7 %+&N4ͱT 7-C鹆z]k(& O)au@ow}]|I>(/_#cZMI lH,FSoM@C^5^AīCAȣ3 h@J3i6ͮhB9c&tzzii;zMlJbz $aDV,6>‹V!XyDrqA߁x%+b[*[YB=괵Eo8HvƧ139%Ҷ>}WN4L4! Z}x`;ZiЖ3 0_u>jq:7(<`fڨaWyr@&8Z ¦wQuYwy,ym2.`@ᨸf1 WѰGPJŀ.8]V`]Iҹl)i z Z7Z2ߴ%i7x=pxe%v g?c_g8Fѥso[soV/TrV2dXBhK6p_t4[knGZ6y؅+UV3t GgcwQ>ûصVQZv.7>t|'Mf2^;6>&wnn3DO[Q<1EA\+!(bI >T'99f.g:W-wp+%Mf]aM! Ǔvڢk1W(0M1`0i ɤh|N^N8#189wnYNCܧY’8o; Ǫ[3pzl ŮM!: 5.ҺH239^;EC5죿#-m*&:!AKö]Ao7̦V?;nhp^߽P]\^_'mp|ƾzC8=;gy4&R'-Y=9ϭ_W<*WΙΤo:ס>۶ZEXd,2\ Wt`Z9}GQxlC-8wfHTf6t?\)ui H&=s|]z2F@z*H4t/.j@d9d"R=|p/ RdwrY'}YePYΏq?>ƛ禘gKl5WpDռ4M,j@B M:[`2(߭qyxZm^<#\#I^Wb99$ojk5k^Ys޴lfMk T(( Uj uTP! qSvwos _9>YPLJ l\bq.o1˰7&ꢷ=H"]m(!TN}6^1{T>@=:IOo6d\,0syN\`EJ4Mc߾}moC4|>O9 .ؿ]'Wt\n0V.늳W|O1+&Il`N,uH$B2\w'1)!o-4&MQgw'w D]5])ƒHV]ljTL 3&95bp6\T&NkzCu{ͥ]Vjd;~鴚h,KT5~^4Y+gl1cyiK9׆>G y\@]jR$&9tOOOO r9%](Tg]z^n _hm"ea Sc-rY9~ONRY{KYU L2p÷rt4i%/4rVdR24x6]{ snء ̸*YN|"Ǚ=;'pt'fʪ4n|5qSSSeTUW/s7'D(njl)918˧;_hVMlܸ={gu^/w… "eqn)l\) H$mX,\r!ȤBxp"wrb=)%7DIfgg9<R>dNNZK[303^zlP(/E8Jl2 .<_>anˆGv7od=']2zۃܵ#eC30K6E#()z/i0uᄏn¤Ăgm!Y7SRLkKW+]dx2Քӯ!Áصkudz>sÜOfL (kB^ W3Uj;dUm[oŖ-[j&5xۍԴU34_?guKc b]WWvbϞ=lذavnJ,[k =h͛7޶myG4ZZZصkT!N83gX[PNh7ֻ&!o {oȓR2<^eXE6\FD`LWlsf$s߽0߿1K2Eh!g 7݌AKͤ꧳T3!xǞƏ|ƚ;΅ -9sL&C nH;j]6YumW&.WX2=y?qN^m(_봷sN8@?~!w}7'NXH)ضm۶m# H$p*Gilٲ6áPݻw{n4O_w Dnߥ[LoEȋ㌏;:;Zk?CO-%H]gD^E-feH˖n+ux"o>q<:dP@(g4@OTG2S`6~]nUUKBהcq-||-{7bΝU Z]kےݶU)ZuqYtFc/]pNWg=9P߲e bǎ c˖- p{T*űc8~stvvm۶eG0nP6uƿK5aeYir%vQD"7w]P-#7 ʊ ~.W5ɷάMmO‹]K3T8 +vkS+[{&&+I1Usɚ70g͗/sJD:-%Aop`[c{h;7EZB^B~XrѱŪK\Ue˵+Ne!ޜ!k[_rs7m߽α KنaC=ľ}Wqw͕+WK) k׮U3fvƿK-9uSjqHNRrV&a||F 6u8 v}Ǩnw3 !.0 L@Hks15&<~ۮRR2Nݫ>kv|Nt7^R$5& K"w?qt#q=6Jg>zۃO҅J$LL&N@[5țbۿoe36~T|C-Ko%!ؽ{7[l̙3=z+WN1MM0 V6oٲe˪#9q8ش{C{SfM MMM133S{#rY[ V]5pCK&Smo&[8/)RXKeI͈Z PugHJu8cq֍+dpn8-%Zo? NTNe&kj2+=Ct6ib1˞/ UuHe`.6vY߄вr9j9޺X?_lwrwi#~<ȁfS(AGGǚg%|ƿ3#SU] UgXĂBHUB@oțuy#AL_i2K, U(7i28tMDD퉥AЫʘ:Czb>FJſRx/W//k*Gd,C6o5%yNZ>f* SV{7Tǔʒث14 |,QtKtZ]Xݭa"nFqi\ 4.&CJuv=K⩘K)\)54踶X&I樕 l 9FnXL f;DP$]pî%{U^n -{pn)< ť2z8ueeY8 qNf*[%paRV#P"jfϻƑJ$UI)te7*)iwNqH ŷ8vaB 9x > e DTn{ :DnjuV F-:Iw^lez u^JwZH""0.=V2$7߄yݴވ-%Uԍ0\e98zE;(7ʝAJ:^Q,Yaek(JB%T[/99qV@ބ(uA9PeZeC ] džޞ3aj"\'n*LKEkãGoL"[>zWp"ص>늮zR\(HT`0}W,Cx63)7#ZbK/lhY&[ٹߵ&o!G4`F@Jȯ@x`k+wHQj$4M9Ŷ ׎;vvU7 MW,v r}z_x-[J&bO!FoJZkHQN򻛕1ڿkԣ`oC}ieycJ}"xAr x]=T )[,~ljN$xU$oH) piZkF Y]|lƦ \?*ETY~I)k^N粎u ]G͇߫o5"Rar9=zt:lHн]j#%LBM_m tz15 |ݻw7eZ}u=&3҄p,1S_%l6x46=cK8XGDiW<6m ^oO= M_"|LA-%|~Oc] BW!jB{ ehYO9Κ+q7rCM FR OUi"sǎk fcuGkæh ƿK}7|tC_ k+k8c0S_F^~oI@F%Ygup'zTHmy۱-mܿNNVYcR"Uưmg$ET -Ger&I&|fCgcm9ZtqR5h135!DUvMꬎtd2cPbۿZ>]VQ2<|V}LgcWJu<+R fϣ nZJڪffnc[&hcN7壗 '_9wCٗx'?ɳ>[Vꢸ12t 6vwYLNC±r۶EA-[$sgP*m!hL~l,H(c.[Ƅ%ol!'U DEs.ö통/3d"X}˪3m&y9FrsL ̦ lIƴ>TNw5ɵ7-粋3!M">(3q/̱m)ꫯrmq뭷:f܌\M@G\eiM=TT܋"e9]jV5j^vbxs9ŴlAEtM?DTGEnıB)C: Iչ(иN~cw޻6 Ѽwgȋ@e4[zے݀g5%g sOrl4KeHgMLKwj6피2/xӄ[`lnMbܽ`{o{ʁ$ 8mș]A le ڢmI@ϤgZ4&%&:H2O>@>%i |>;VeK[u@`pNM`i \}%+FcO_+ҭK"Q}ǩõ.%|+<%Knr{ XSTBJꄜW@e;z5Ӳ9;knR\Y{Pbf4tIGb:x]uFn|GLTŌi|MZ[[ٺu+;wH$Fu^x.ØZDcp'ˑf ^oUiKRylN_dLa"eRlR31Dה*g@K^SX:N)UqM% ɫlA)u550?{w'ZRkMLf@/1ąXR'jh 7Crз6-%w @FYz~'?H/ M]Q]ưhIJ/-%R f$rՑ %:F D v `r^&T ׀_SA$pjT9+H i y@DuɼZni(Aʚ&(fYv@!LNN=qT΄ nfE\*mtA#c.^^?{A7+<92cj.c|| 9磭ꢻ[X_'ضu6tBWk4F1ඐ[-ڃd8;~aW16W7Z':/LKӀUoCW%>Cj5慭rMas^4z̙| [W1\]I-\F{"vwb[l5#F<5Zv1{)tYuj|P lY @ކcv7YBB#H]J|cymx&曦`Afi LT=_, {TRاƟ~%+wO>~p_CF5 fSͿRV D_Lάr ! ϶#XXOJ87') 6`Iwnq1R#ewoӏgF杝RJL4MR;v M|ioo6 BZ_%.]\tx<~:4Rl+ȸ74<`Pzeі|outaC{xk,'8;&kkɓ:x/,E狑y {vޱ(Kd`6k☋2KQl9Fʨ~hUuƶm7Շ;:J 3``?ŋID成MU0t(峯W08%[ ⃎1Д#vX\o (cJ`'ѷmN׎@K5ض*-Z h2MFV'૧ R[ېGӴsq//B_G=v ;־(^&\n>zj;\E &=T6=y yv=g^OS#$ӹLH)m{)0==7/(z1 @ $zx<t]zB! @(λsXD"8cccNf !ܴ&atfM"73AF[=q+NQ5Ry/EG?¯}3\xUV[./16RRƐIy?ݱZJCÿhYMxOfcC׫@e͆I̲m e1ӄ ',sx1Q%\so qj"<&WuRCզx)mG'.Ͳ)Sୋ3M8!/BO[ Y+ v9Rng]žVo !SpӲyo ~MJ @4<ς0u}vIPeY rBL&C>'Ja&|,Qqyֺ..eX6Ny 59=D)9fL[Mv#Ts@jIk.t/PL#͛lI>*?߻y=k&G:N%NnJ)8YhhP0]QQxIeR= [BCK.l l4l4@6aI0rH!0W `c>i: #P:BJ؄:BC_'( ɣs|l},\f(+'X ۻW>^'F&Sy~ϟgt:\˖h=mAz":@!^(ʁgVi !ذv;ĎκTҖ$W,FxB@ثphC7p\7.&x Xlbϖ.~CwpnhOa M31$$h:Fz--_jjvϦKs̥ 7B*oqn*q}ncIFy‚'19( /d54i#f*nj<W0^)%s)+q"?=r`bt PO>J0̶1l) C}4rYÁ݉ʬj ih`UB̷E6Ͻv}3տKU:m |C3/qzM%ym0Rc_mZrjqD:ι8B VB@GC;vyKkk: `9rx$59?oM74Z| ܻZv`!"҂.gZAGCbg!3)U΄sQ-Zq<6[Z L5y}&)D\>mŏV2Cq.r8g.Oqi,\2G2ǖ˲[F^@g ƿK 02ul# $Oxdެۂtzξ>4M+k̖;,[TR*C;SmMV풟Rheռi`&gc1͓O>I<^z hafggW|,-I-NO9=k'& yuxv>}a%sYUF'O!f0^X&]9d'y5in5GT.&$]!t  :ٹܳˆD*\# 8ec R?|94k'od{tUƻ Si+2̌ON1K3KOfIr$9E6obKLKy-%bDb^WV=1ttM*Aְ ;logkO+-oY7h fwYSMxX䕡9~Kkdצ6bfYrL3LųLdz̤)Ss}5'3:J5=1I!`gڨ>ϼo(CQWW!rM*;Wca-;Uv'%vmNkU)2y⯿!ݧ~a^f >(1_VSiVk4f#=4?(gG: \MiT&\pT*հsV^q}tttN2<<ME#x꟯ozQ7g^>ct]P꼣;cK+oȨ̨T6O`Jɛl\A9˖ ~C(%'z4pǨ,%t>Gק MY粎f~Z&v%:;lTbp8̦MذaZa044TneImwtt055pDB^6D(]-~Z+*~l n4CG6B(2}Yz3WfA~vZ pa04:7~ҷJ׀bqS8wxe\{Iif 2)ɭ$:,8{iK{%o*l,nKmEk0=XBe%i-PE|VQR?MHˬ +MSgtILl* _lU˰P΁W-RصkW1MϟرcLLLŰ,m?}y0.m)uM87t6mӇ^#.x,Yxj<.HJgjkUwوέpqJ}-aDŽYɵӷS8ìvv@#LsOJe9^䭋3diӔغu+<~2}4yy7F|>4dL&xnذx4M#Dعs''LPhe5u l=:?ђ`a.& >~J'<&*Ig"1JH*upq䅴yt&Gx[!O1GHk cM@NB֘4:s^O r|Qu Õ6S#o |Y XAMD$ !1te >}^shMHׇ灭}J7NRA_Ic]I/F֝z d>lTlAR Ga itG kkX\/q]so_deZ:sAE-4k+~mUJJs=U&B<]=I: )R̊rQ#)&g e"100}ݷ. 8p_~ŢR#BظqQ&4BK ű~I$2t$cxSm|y4Ȫh_'ػ*eWZ5ef+|z2Iɽƺl&ul⡘&/O|+-yjL5Ft{Ц(}t Ru>gb@d~e) 󎴰a:::}~¯ϵwx]e4ARv!ec"Kr/C1~/L4q!GnV055U|&^رc`&sss5#.@;ñ`ttK.9Sao:sWb|ѕ '̣/^Zu5ҋ0>nM-L^avx{rnM[ d `g+ߺXo;$ǜŅF&fGfp)%c1. q(g.05;G"\h iڂ"%\`Dqk1L$u% uζv  _'mv|ng֖)uRN27TBezuEV'j+ER2y85oZdc(`ָݻ2JN6' enZ9wt:Jc{/ _u^mJ3KNN߶cUD.oMomk9dǴ9i))ˮ4dV u瘙\X=8!t{,~J/MaRX lMF /$D) >+W{ZBwĀ,~w%3cgAP̊Z?\[ǀ-=m5\\C1B_Eˋ',[đ!~OBz'Anx%k%CcNGLDQ0;_xⳳkۻW.f~8 % ւ#%*u|j.6MN\ OGlܿ[H%'36C>.H ,fV"*g,LCGD#2н TX7dヷs< u7v\&_V0;y_zxiB*N%8sňeP0dUS?Ƽc  =Jg[pHϋoNĉŝ @8O֯:2!Q`h΂^ԱCx 5e[LqWߩCOcci7uj㡷;wrzzzjF(??@oo//`-t]D"W仆WpDUBVX0=K_s<}Vtli3Qpm1RD g-\Wϡ)OQBhry-~ֻ'=Z\7iA{Jt5 L\7~7owX[_;GWxeH~ ɗDEul{^lٲqa|IxSF;ࡇZr9z%>2㓵'o{/"Y"FBED7Ѝ5y|^Z:h@6tB*C>afrXi-4 w!zO6@7tt x=x~ECl>oK|[/SV1 1SS9>j"r/~W:O:]!B)eSHP̥+?hi噎%4y<믿ӧ+~n6hn0w=6KX. ڥA9}bs$ٲ>.u&$Yk|{$~q}/bJ0 kR]ל+T󆶅D RqRboɔ<[hn2O#i~ϟg*^[GA4{_L0{ؼy3ַ8}4|#@u:::qN9T7 '^%8>kDE>&HDy tб{3с4í4 pPF$/عbMH8z2GO_Tlx+r3%/ٹ/ѳu2s֓sE뱒f)u$M$Yc \;/!𱱯ٷc; شh@4| Nlۿ0@:QtJ4iVfH`6uL NH|W̯tGaFts.ljol&)8Yu#*@\nxPn_!YivDT]=iy_uga^cZieb|So74ߠ5`0h z{itMf5?w&UFv]?J넊 uE](K^[,?Ck y!^k{^#Y(e{m;{ Rbfs$'HMዄhߵx#q6!wQ 1nݵy]WQD <WԹ!kcR7w~~t]ot`)dsy<3GO]䱧 -ܽ}kݏN8P~u7ナEDɯ_V]zzs,,eLu̚J?W󥜩v9Sw6րNhun!6oz\eB[P947g2\)i8q>&5^x<Ҳmc\le 66a+]-#DG3a~0&}گ%k:'-\ g(j-ߦ ,YN?ڒ|$RC2S{67Fwu*(ր-g79~)wfڼ3ɓF˾xy~<~<7,qT̎r|z7G5Em3f7jzWBLdRxмDuSS% wAcWFȫ zkEuݻbppd2D"ikk+Fm{z}SM<:ܳ].w̸u#<?Q6xM6`LHm2Q'0>zoå^̖R©\bkt5`"xir/'+%~ i͖;u8]PHmK 0amAJ0HK8q2_~Emޭ>U;~O-luKں;y~?\D?`yi'(G@429퓨KQ;Dԇ$޴'(Q|i-yK Z].w/t^[T߉h@ H4ʙPT,Xi?X9j;l[x%ṆOa^{?vm!ql.O**u.Zktş%O XIeٙj7_4|F-F"zNbz"bWs9$>*KCp&UBt:U\5mΟ?g?Y>k׮5J"yCx8ɥdڵm/R$Bw 3!Sέ4ھ*˝iʻ BL;n_Of V;8-J1r2+kzk/ إt݅8sҭ2{)>kM7<-<]h]Xa#0<6< :^+=V0u2-rJ1x7ϫ/ףkx HCO[=an-mή˩[8/>..^v˞۞[.J< qQ?kAor]yscXX$~7wyk& 3~TQ3CT c0TTNER9:,SPsX'm4:BێtߺO`}MuSbel[rfp|ۀZR0-מ~sCds픢*;ظqcCToo/Ǐ/{ٚbvAsYfIR2<<###R)2̪g ضd&d&~jrϡ]} v6,,G@!Ak3uV>g(uZb.֮HՊHK?W%b@fog3@өRJ&&&>ǻ.u{aFcIqե˴yG?ʧ>)bX늧J#m󝴗)KS_k6OAÞo[4WlHJ9P[.i.[quN.fV0,| ^b\@0 B>;GWÌfԽ*UBG.NkV5>Gz(,#1w9?eS%|!R9H|Xߩ~^#gA֔S]$YKbِ$Ӗ ɊR޴ɛ6l4G/L/khK{ǮtsC [CDFanU疭.څh]nü!^a>7M~Ui(țXVg*.03W|eυ ַU_%yKէn_RvR$ J˨,,3j2]mҘ2sy_ =1Kߝ{ uZ <?3Ȋ{Ϸ NyKdBhJYS gM$WNυcB5{Eue\͞B(gBGXi Sp~BKl3Hcfyץ&5 }RӸ? v4Z_wvdZ˻o,M^mv -cҩ5&j1lkyt<XVn 3Q~$fwjj`l? ]*!~e"C0)BKb|jLG9u Tf|۷5o0;;K{{;H) lذEEQΞ=x{lڴiZENGGG{W,fddQH& dzD*+Gɋv}NzjkrH)yw_  ҽq]شk;7I(! x}^4]g]ؖ$3139(Sd)q *3l2|Ț"U8ǘ-uSY!0;\@7xo~ J zR|}q͎w|Wo%_A]뺣U#:qE[Lf6ks!nr>fqrŸť9D&l\ElXFO;e[G{6pۆzCln-o\P׉PZ12f  'Sc\|^{o˲xꩧrwx/sCc/-"I^;Cë69ԩ%Z0syƏ!3ZWr`8맱 FW LgxYfRMFt]'r:D> ԧA_]ױ,\.G<_ t|'ҚBBP>߿ett3>>|F*l= )>gx#ܱ{? ;LA?LVRgsħg9[ؓH) !T_hJ!b6z )k;=|&-5 iY躆eh)b^G89֓(Bl @~zJb VnV+ ʾ UFSr< P j0%$b٥R/H.<7MFGGdžG$ZRJ~cYOS殎3%a 3)%AMb8xؾ7!eO=E,JxTZsZ!|Yņϥ;{yie]IJV,*w9)9'%_%\z",Ez)^ް]l.~H,`>aA="n/k?Zq6ڕ%>l@a<5Kv{ҁ"koM%1\ɜzE@]@.ztC_ܰŹ>sqδPtd0019՗0TAu@5rVvuGAn5 fr9~aLӼ&4N<ɡC&5$TN뭻ݖy!?ArD~^ѭ_^ط^Yq:0C!ˢ$H0x! й-fOfx}$/vf.E8p[n]c%>я}'OR(룯ofsմ-1΄rUؿ?\!9z(]]]RYg8d8kqz}~6ic'>e']QVGi,,3A9Dz n $v :vSxǨe֭ s $)$Y7]ACۏ^&l]{[?&qQ9s2mpaJ>_I!PXG-qKMy{xA 7i34ͷJǚI=6|@JS pZ:TV),3c pJmmz 5ON?.nlQ5V@Jk;N:T,OSƯPWR3%I$g'-^-pbMtȚrT2JYG5t&o_ڠΚ1|h=AUsL5MSǹ Id2|;ߡ{w`py:O<ĤuBUhܽ 6PQ"{յpFPY:gj-$rxMئ5sGJqڟz[w]tU:`sd$.w"LOH/ ep8ų'ݏ9[}lذaV~% }'|_|qDlo.hFmm-wqk֬Y#=~fٿ?}}}?~3EJ.8]q|][a:WO GiTX~=۷ogڵË_Vٹs'/"O&L8Δ΀" ݻٲe Hdٕ(2\t^{gϒJfHgr<ywuܺ`*|=o!3x7Ier p9 o Sp{n*ʊ*R 5(- ns˞n\| '1g}wK~)m{5B"U~ēM6k*ݺ}"!?r\YHfc] H9P#(μ,LnQCJџ|B-$-;@2_VB`>jh93\ãeZid̕+W&t6 Ӵ8.uo宛wk*׵qM3T+k.II E._@e 2,;{.YcO҈> !QbUUPO A?50UV5P㶺! p>C>:6j5Ha;eɿ47"9t-H!탓UdÇ/@F'+/c.‘cS`MK ?[s&tMEd0ơXİ'B⛧WtyE ȏ{9EB,p3ikF#cϯ6W qrQ8?EQ~3%l/+4Q`oX61a4vRt<-/7+8܊]6~<{? Ϸ{qY9*)|7p$Lq#&O_s|=ihW 8R1m6scuv4yZRֆEuZ )d4l@IԇnemK OI)\rN~iزe 6lP|ߦirIӃC 5l^=6]aFuvTgߔtPe߱+E"EPAC} W%G@8˹tVֵY.j]+(/IrJCwL 1bt FBQF8HG)slVBU#!vnjޛwym3H)y᧸ч=s=ߴigsjw5QEQoDؿ?{ŋ8qt:=)w`c;PAU4DU4ͮ.B` 'Ier$Y,ll@`Q(H)1-}iY=BdGJ#Eq2>]CT~躆*,EhBoDB?UQFdLRWΝs`rt͍g nԿ8.a5ll8\+'sYطQkFU`k2Sp3* w}KW6n ,.Mi(ώB ;mGs3mMQ_IL{~$mu~v0ufƢ#ᴩZyƠqQAauy)4W1|[?fur=8f׀."岼۞]^'~;sF}ȢI#V |"3t.( h*Uf_˜vk6p}QD nlAsm^.ԕ<',z2)n~ O>yM!ȽjX_W ]&f TlS-5wޱ'_9[TFqd2\xv|I(uuu]z7R:::&+J3L%U:;~LvnQF)t'S B6F-V7NzWEXsMt:Kݗ#NH4U#򳱭[װ{kc#\LC SFgK֭[hkk[V=FuM6ax7yWQy@x :{{dֵ2N|Щhn}懔X m!BDSUl^0GWg/= { N6ఝBW*)Swr#\~ºzhW~+pTWe8DK.-iG%EuLhLfip"Og>a[[R՘_+f7/Vҙ͡v\ot2>R=F]ò0%Vd`/'N:0MBa7NaZͨjmuaP|9arּ0R*G)5fd{E۝6]\3R灛u>'D°k=&/v8oқqHIM[қ*{TtX_G΀/;!#xK*-bq~HF"J5O}l?<«'Uv #mN:00 P(D h4J4i hF(uEr7 uȪY}/BQj P.Wz %\͚MDW7aN;C~z_?=}V#@-F0뫣l\-kټX$8b/\|y{i۽iƍ;ذaò(s]wq;s=GOOϴ)%ۻ?_>;}=lU|v8ţē酋 !mRWLk3eVL+ϴ֪7o}oCƏ邛)zhA@ŗ-WL&sїJb~SK^-Ϊjn߻ɫ*/Ќ,;hc|V6UuMd_qR|v \]۟ fl~ο#즖ROjQ~WşyXWZAoj ] 5}ӧG mG.f˜.h[Hr3~Ov u|]8@}@>`pλ/u{Ly[N |x?;||oȪg.8AFԚħ9L.uEb;o)(rp:hnI^|"Ci,۞rNRJfdYR͋ifMPUߏi>zI\JF#BPelWGWG߱B2CodG/a ,vf]>z{ͧ |*Q֟m UzɝB rh.^VpSuMgDB~kc5ֲ~U#먉 Oo= GOO/;3{b^k`0ȁصk*O=x|읁xڣ %x߽yN]J 8.7&:e֨dc#ʾuuukMds&7:ߗ}%m-M_46 SMIuttt`Y֢dI)tvvɅ $H`۶{zve]!}]vַO:<'@e}Qx JLedy14wݳn姺W|g8޵87D]1r[I9 \n[6F}8L^辮0:\AȀ-x/O_bppT*EUUռvL&f``.!ɐf'o)%\ 7x_%ǺlE}-d8BD%q9pm;+u8ҙ`iӤE1iORKR[+s}8żė&6sN/ YR7ZN9kW(GX煔'}s%j#?k]A#KS9MH? ח_9+h o{7I)7hObrILX=?'nhZ\i1CTō_5_l.0S1m 0I] A}uvƶ.urL'wstLđ(P^(A?z\Um&㘶 MP/G Tfosf`o? GNOjAw߽Zy,qӧHg|/MkSGNϬL`(`:6x.s܍MשigcgdO4?2v@Dے7n 54Wsc1m ؕDpx$$ck!/8TQUQRDeY|+_A-f4t(-+ I.Mgd\ P_3R>nF EHZ#&߂pg0Oz(ӏ j`L>& 54`]2 VKX ŧ.yV/6S(o;qnv*w o+ ..<)Rb:_6: kϊvguD'wxp{7Lz*wJX9#O׺čM|6T_"BMA1kU<])ޔL*WojG9HWC gMe+XضiinCQuUs[:F4ߴ T1CToN\a_UqΓ8Gӯԡk5M￟u֍D<zlvrQ!zڬ Ң)e(GQT]-7=wL}c ?Oʛc{({ak(UMb'17c:xc.<1/49'2;}^MH)']l!4]@sZoH?,L_"P;R8.U?R`rbH $w8Cܑmqlkzvr?PI$Q*ǭ_UB9q-I-WqjyuE'%t[_q]P*do ~:ak#v$WSHZ>??|*M"B᠏ul\]ώ-i!EN5?*\PK(;4 MTviA_|юw8q#noO}[OjzAWDp Hr tI _V&U)y0{Z H9}V+Z#j`Tqh7BЬw>aaPh=+u"*~s+|tCqL,Gr7sGk-UH]DcoSwo$YBRݶ3ݦh{LiBe=sGٜrEc ye(t ҽn:/vbf&NJe6i ;_)R>cǎ{444LJBQvM(⡇bpprOr֢XnTvR z&n}NF:6c]]۶/w7Dt[E['^A65 ]UJp`e-Wwg+[c~_϶7uvݶL23|]p d&ROצoPW:̖kczj8#|8Ar2cP?W",Se>=VQ(3l.r)?^?W\8Jgh *:g D.!$׹ 5W)RFUa漷_B ɟ6B\QZp^x* r CpgraM_{*^ mJi *:TJtsq,|$FlWm S.!m)-~(j(KbhX"0K #[|Bzc3ɟ?sg7-+| n U#sFzp$l#!UPY 9KPp#)B b;R(@WVϝ7mZ5Vn(ɥ'Ӽ;[W;#j]  FXo$#^OqB}^իyhj$lٲ[nH[&gh8=C?>βW9VyŰw51mκ2](qWmZǻ? c#Vf9s9I+@Eز͵ipACRS鍧JdJd5ASU Q }Ƽn?kT9) wtA/~!Z%*}>)]\zTLf* cGRҥ8!B"0QxHkFg7Vbf-p$[|κ͵׵_96G n ~ z=r$\NwswVx+[XZAnWnSH[ IVWPASH&^֯x(pvpƒ|M833 W}l=7@B SBǑ &R'eK͕\|ˏpt_Akk+'=id2G)M˦o0Ս49FM9=R^( yyxlG)9)]d0t5ۆN?QVry/Ͽ*Psucl"! /3:#YTmm < 5_kDlݓf0tJ%)K*²%씩 *ZhgJԘ泄rSaNj_:Z=V|UkE SLA$p ­5 aZ>)@Hx fL3QBZj]_kEH'ݧ:t.ъ*v)R[36DGonImZys}D{JCJn=!(8oXE"$ߴ8GOG}C#K~?|;=cZy衇x'mfƌɦKgJe̿0[fmcoB<̈́ŋIނsgKp)~;EUTWm^7ǾƏc:_)EakƽKIޱ9!oL1_^0SLU>_߬_zw! ~% dHOZ^kyjy<sJ  qTs\iOF+_W~S&,ڈcWEջ(>¸aRc(ZV}e,4mUEgrtٻeOq+W pCjiܻ`CŲ#<}ޣgGa1LrDb{YhAQgCC6RcE!ܹsʇ1OZ[EX?odrTi)K-rf EM_m ?w7c4 ebD!8E %:vzChs=̻~(3TacHUc -TNJT2hXrdUzx`NQyпݼa#%ChSkxDo$9{ Ս=!sgKuR`v(_+4r\NJM׿_9`6dߟOs9@k9野Oti*4׸yê Ht?=81-{H nvZMu(+@?)fB==Ik,qzą-)#b̫B1ZqF !hnn<&%JSOK/Nƫ*oOM,$Έ<*`ˉd}{ޗa[4~} ]7߄fX2p^XĭHi<,7?YfVQ FTײjZvv7wO"-ןzɉ_޿Hz~Zƥ >cUp7wQ2983Uo*[<_mM_KFgAcEqIbSل ք l9T:f( 8I*Wj^B$XTc‡2(c08^7 >Ko\*X٫&:G@K+f8 )(lJ g>6S:{yY-߲.W\54hvVLz h[ט^I2uF#[.wa[Ovh D7U :근F}>G q ~, tZK9o."8[E%!tAQat_}wp Ns ?jLw9EcBYkU%Vu|YmpssvϢÿw 9RB+`sF R;jiO|vo1_~rHcov  y+Epx7"qu=ԢDe$?Dg4QPS-qڦI;HO!*l[]| a|ɑ#F2v=E:wلg\DJI{{;ݴa&o&O=XN$#- 0k{vif&nZb0|oWa A du5@tPRUp <2G&8,2[Hrˍ1"AZ}lauM3m3/o}%m+j~8c5MFҌ 03'TIg6"CȘlzO$#Z?]fղPf6d\Y(8Az)e=P{c!!rK??cE3x}5mʖϩUbmΆ#fT(i4i O[ӯhRI2Y]N>\ǣj-8(3Y\|ktdƿM:$b5^A$yƄPWR,E+.s<"u~Xl9^aK}߳ez="pkׁ1?|Άg 2 TG'5ן\HɐLg<{NPc z 5""9z:u '^MV !`f>ѷR MqwF931ᏙTP?Wp a _}%l!NO} U6~#ǶmΜ9?Ε+W0#Bښk{=fsf&s`'/v/Ltfutg<ϱ~׶9g9ç)FV6Oe`}CA ?D:B>O&c&Vq=UUT5ԲnV~ o?- *Ocۼҫ|ןzL25mqε|m76^Ԫ֘2FtK&?TBp_wfdxlu/[? (IgJ?EH4"3t8R`k*uXF:vJ_J>>21z,?g[0Pl|EԱXKn A0;0RpϿm>Ù׏AG Eü֭T=ʝ:*5.U&VY4 <7C!Mȩ8E:( Gq#X=U)n v`R/V10 ((Xb9*|R0_,H5¦_'m>A oi޷]Jbְ5=fGgIGfP*4tF"(:zЏbhh>EP }$@T( RJ삅c VcXق^6vEtXܳ;y*MG?դXJ?|IА۷z%H/raf78gxͬm*e _NG湎ib뾽g}wi81yn}2Y|˴B8[ PPO66gͶʹ_CۦbǶ,O xC{;{$S :Gg:>|c|0tT!1TIHwºWܐ^x>ZG^)꫏K#A屠 ꫯkߏm,*i7ϧ-Gq Gqo%MBU%P}{ٸg;wP,JfQu4R <sokopI:H'XsOEj#n۶ݶ-5hBp*>|.\:C.!1gx_?]/{0K>R.X(4Uc{y3뚪ܶ~U2NLO|:l] {Eqh]#XNBynB3<p.nqC N#/~\b^\[yxH})ߖGW Z, 'xl7'O0m{֓쫍nsu$9gV7VKrc6(+ & iFSSdϞ=Ez8C"ܹs\|L&3cQQ- 5wu'QO{{;GԩS$I,kbd0wƻG}n/xuA{!7}"ns-ё!ܖu4 &bςEE!$-Χi&ƴRYI2pzJMM [ne477/1 Agg'gϞL&3n-Zy=7sj }ԗ%P0k˶Lp^zWzNc9˻I" 0ZuZ*B)wȲBcrEqx 2JC},Vv<<"h𱭕oX ˳vqZ"{,ZB@ư3$$ctM. MTB{3Å"%~Ncu0xa e (y`'s:A69Ulۦ~:DCC7of 6s ˑJ룽nzzzfdY6񯎅پf1K5khJK}5-w.\^N^w0`"iYKZ.(]U h gm[[kٶ>] OpZ Q\Vd)LCk31r yx:'g (lVq$̉7@E5L*1RElc`Q/S#"Ptȡ㔬M!G_F+i(X#Vw46(kqPDQwߺ_OɋǓ9}L.?Rft/_g!ڵkYj^@< 188˗G}ss:4ֳִF޴wHҢ!*B]U ;?Ů~.w3`p8E.oRF)}nyMSXGUǺ*65UUԄS(`X;E((3=ژQB)/cE@sו`8|_W;k4:\NLSTڨ1=y{c2KLfGg !``#FTu #V U MQLwatQ]q#XTjM;7{N_'y ,k$8\\.7RiPjGXh4}ӗ 4rI" ͒J$L&I&d2re8Μ"4X8kefmXE8_mψk2ΡRB(XRUJTJ_ZeqV @ZqF:"N,emE ǣ;6f '=y\{7tv3ԣP(P(… !uO0h4J4%c?]|(a(Ed;3Fϲ,,1 \B@&1K\t:myض}# auwͫ,t\g|0[4y?NP 7A=CH†@ڠ_u"Pq Tƥ9Mڄdyj *p>FAeH E=Uh2&AC{<΋],'v]:#U8) h ]#B@c1=ټ cɉ/Ѧ7ˬ'@SJcίrB@U4[lྭ'8y yWzJP(X8S]2<|acK<*i#0h6 4 !zV4͑G)GqF"V1}۶mlY^2,%^J9j!gh5ױona m͵K\#Y@arcJ:bI*CA瘙.IyUHt2OzqrtW1Ĝ,& .֥K)8f0y5k* MU4Wq;Istrt;GN^t6?&;rRiVh7VF.[h}JgT_ŎMmܰ}6\+oQ>(BbHQEzNW-N'* `1 IL\GjTQ "sӬ5#n桇GR" y\c|NgLX~-M3sܴ]#ۃQ .OLUա -vYOcf$nj &Hvr\RjQF{9_A:EX!?׵y] {k88m; b0w LپjS"PPGkc MlZL[s-e`8 WdhM)Z8 T\*gi!O_T<&bY7<*#ݗ%og\g^I_ ׎5c $0TvڷD <~Eˢ.DgԌER$ U3B?V?k[ELHeJ?w`C)lvFZ򕥊OK);Ԋg訪B8'3TEBD#ATTECTEh7AONnu$,!GH" L?ǥ@כw\؎q-y^Dz6GGBuSzx90s|dDAoc߹-BshbZy:]9_}ͨʍ{LiBV]@jdaGbP( ٚiKeBX0։VW}&_Hgsds $C)S9,iͻb~fQo"[RsE""p9">k*": :~*hF}k>~Ϡ:"7}(GՙtvMQ㖍{mzSPR_{zƦ΃O B2Ouv/ B`SR,u.KK;r9^gBf_Ze떌˷Y:JAmg1fi1>ݭ'2Ej+k`7'y*b!_'v'(w_L2PYc_y % $ -1%Fbn# i J3y\,k/1m:!߸/lt[0-i&P(HGRltUAJbMpU (t!,ZMa /X8MMMuX aZ+XfWQMgYfKa`F`sEyښtgnwm>tƏeo)aC5:5Ip ڄtI`x,_˴/ޗ<JӞn@{-RJsAy`dmgPdM841z*:M(#Y?Ks"eޝ*»}a6TMI^_f Xd|۲b505S ,/eL#3)ƫZ4HicC!ޠ} PdMU5U󜥐!]PKk T9KsM\&lX+Rf1L+ IBs_(D6áo+I|uQ:nڿ@Jc44.pwtݐan!y\fਰژN9~ e j)ϵߪ8|L/pz"oKpg  {4MwڞT.Bn;pUsfteC֙j{xόkxΛ/xY sh7-HB20ՈLgTyȜ֟e>_wEH"I$#fR Qqc00Gq5 vbPd=zs4CNF2373|L+I5[| 4S(X[<י_NBWB%""xkßHr׀eiHxm#XdVRmMet`%GH8(82B@sr,qK^VRUAZ yxS&2uH|k.F"`G6yZ?gF_r$ S[gCӷpύP*zn|c9b;Ŷ"eg~,*.y=Hm{MTELH]0CݤEFE a"d00S(hJXB!/1mD` 1!ԐCF׼V˝%o݆@-TYt(Fkұb}C0֥C<1 PUT6MW c!ہ(꫼ B\꣸.ɂSW~[@s5U<S^˭kRW&# HRDz#',76%Ix1aӗq:yKbK#AS&hlѸs[Z 6Wi}Yood8($Bo?x&v)ټ[;6]+]s[\ -Wہ+^[6 `XRƔ"ܲBOcյvMG))!cI $kIske.'mriCrW(ft8EC_W(E ʎZ=:5Tt!0 :3\L36}ʞ Ƨq6|ך:i4yOLcMգs=C]C]YkɡpH`(f(z #Ge7cAnB/t ~,.Lˆ)O)_%`KWY%%R-]dMqUtATF5jlҨ+&$GLv:#rdl:TE)/~d|kxmhẑpj^:XD<*ƚiNEhekX͜y/_ތCb'/GJTEH90o!F)0T04OUuڨFsH!RTh | au,iG/,/uUK?w^c\tJ^],PW[2]<~fA𘌠j"eX;x,sciO*/>TK_!Y IS5%bn?o{7S@+z,G+]q#1C&PWh 4b>7S瞲?l o|d9?<4p Ua}?ܰn*˻Oc6 r9HxD @cͨK_d?Gq_4u_!ˁI'. ,9gVdm={.nلz'Du:o@}wpϻ9{̟hbP2)Z} pgx,ق_Dwv-IENDB`fastapi-0.110.3/docs/en/docs/img/async/parallel-burgers/000077500000000000000000000000001461403617600227315ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/async/parallel-burgers/parallel-burgers-01.png000066400000000000000000006713111461403617600271310ustar00rootroot00000000000000PNG  IHDRX#IDATxwxlO=޻tA{Wz?{/ *XX H5dd% )9ٸ3y{8mZNDhB!B!ťd+u' 2CB!B!ıVjR'贊 ĘN! !B!x0hNA!B!B!BH@!B!h$ B!BB!B!Z !B!-B!B@B!B!D !B!B!BH@!B!h$ B!BB!B!Z !B!-B!B@B!B!D !B!B!BH@!B!h$ B!BB!B!Z !B!-B!B@B!B!D !B!B!BH@!B!h$ B!BB!B!Z !B!-B!B@B!B!D !B!B!BH@!B!h$ B!BB!B!Z !B!-B!B@B!B!D !B!B!BH@!B!h$ B!BB!B!Z !B!-B!B@B!B!D !B!B!BH@!B!h$ B!BB!B!Z !B!-B!B@B!B!D !B!B!BH@!B!h$ B!BB!B!Z !B!-B!B@B!B!D !B!B!BH@!B!h$ B!BB!B!Z !B!-B!B@B!B!D !B!B!BH@!B!h$ B!BB!B!Z !B!-B!B@B!B!D !B!B!BH@!B!h$ B!BB!B!Z !B!-B!B@B!B!D !B!B!BH@!B!h$ B!BB!B!Z !B!-B!B@B!B!D !B!B!BH@!B!h$ B!BB!B!Z !B!-B!B@B!B!D !B!НB!ĿRJuUUUX %,2É>T!BB!Nq8 7+})dIEY)UJ6NӉBuhw0zYv|?B!1 gVk5wA^V&ibY2r4:DBSDyi rJ 9wYdEnfŅTr:heao0L!D1T]e!/+H^=۶FeE96Án4O93Ǟn;G/d*8w@nAV~ sQU+j,r`n_!' NLvmeرy#Q]enfv͇>K0lĿuB!N7(\+/;=۶}&e6cZ}w(hP5G(ʊrV/Y !*K%v`߮dw%EϏv :k ImN!\nV˒f{J l) 5;7DFFKiӦ DDDIHHaaaVE,;/dŬkx]&DKViI^&$,wd'8vnIf߳r|DQZ-iӆ>}0rHzA Dkg>sy)**<7Z׮)(hsE9Eyd`ݱ򲳨(nl"cg{z;zC/L'Ym1oX nT}mj#Z-о}{z޽;hF_w(bTKS&/;teAv rs(ZUEUUq:( 8˹\`?G!Exn~ rX/n:{wm\^쇢(={2vX F k{vЁ8o@UURS0~>"r2ؾik-"=u/YتmjQ{SiJ=z1QB ۷_zɂC'\LL ]vO>ߟ޽{Ӷm[]QӊfԽl^IݳsE9r~Myi {vtޟzu !N -:`Vm:V,5E`0 4hIIIG5XtiӖ۷{o k !b\87Z}}ΛvٰrEy%}~VIag~Һ }5}EAx Kݛ38}ҳgOg7 ైޟ'Zu vnIfHMz^جG(nT2Oq9<қBj2(͊pvQU^^`4NlB"6)X:OTY*h43d.RFMB?*|<-f2T*ܒ̦H^ԽT6(+-fۆLx\/N_Og߰qr}noq=/U4vԉaÆ1x`:vHvhժϒmk;b fH @qp:޶%faRڎҌ8n _Ȩ/bqi*m\ޝLOYqv (i4g!M;zO}h۱31 ! bO3ؼvCt:ZnϤIٳ1M r8mTwԹn,Z,syRٺ~ K=(FNh$::p)/-9.'ɨ\-,; /citѣ0`{uݤىjh2cR>}UfNRσ5U bܹr-0h BCC}MoryLo0{[rػs3+g߮m֣@]A@HTT$&&Ixx8颢)~ {wnBLv;W/giJ,抣>_R-`VcVSǶ/ K ={,g=v{#sZ\N'a/?/?v/NGLL Fkeck4D[Eu֭trطk;~ "m_ Uc6[h7o:ubĈ 4޽{]y߾}{.k q);cna?E]mF};8VYYΝ;}Odlܿ~,B4vSTǚ% پ#vfJNСݺu#!!$""" 00uVdWU8\N'}_7`bZɢ 7 ןm 9ϝ@n=e_vZ67gW|\KKIT???z_̕W^yf($FQՓpk ĿRIھV-?#m_1M4 ҭ[7ȑ#ӧQQQM***p4rn?l^|.r2}8ƪu\tEL4޽{75[XXXH@@nOIFFFͿyu$nj 3(.ȧ˅OHxa&"*6N؈c\kX0WV,& 67vWLL qqqՋ޽{ӧOZnMddQgDGE7 J,'̴4 r]mYmVh4FNu\XlgH.\.KKؼn56iҦC'F;3GK.0gvZv;֮?fբX*MkZ"""8sk>|qoBD?FR4썴bTr:Iۗ’yY/vmIRyLRδZ-~~~oߞ}2~xKbbb5M)..Mn$_3)-.ox󓔔UW]u]GϞ= f rd9ɛ6q`R!117x֭[7yf*++=Nמgݵ܌tֆ &]O~ιK'qÂYhݹYYOa2= tڕqѿ:wLhh1p:ʲ!DiQ!yY ѱ][:v@iݺ5 hDEAu ??w^7u?Ecۛ}r(+e놵ش/?|}1y &Gd|\4syYAm+ꪫԩ (`)>7`Bjk]¼<词HGGGӡCƏYgEN?^fѨuph #}4W kvmiN#];\[Uolۼ G,ϰCy|;Nع%VGhFլ4WsK2;$ӗ3h(v/_zU?h\.6?bݲ5뉊bԨQ?ÇM{˅jw!M}( ˆ#ϯy3׶ZeTgٴi۷o'77ł6z6Z7Sḡ\r$iwDW)<ʗ߳~ɁNK zw*BO*֯XʏʆU0uf???4hG3Ϥ]vd5??ߛV_dL Y-Nn0OyGh4\UeXucE TMCkWw6,\vDr`ټ?lJYEQgϞ\{$&&k'gXpYQ4\L4?4$А3f UUUk.֯_ϪUHII9vRw$}_ s&^e7J\b?>Vqe:'dHm<2(M~ :[o? @JXjU] V,m[cZ-aaaoߞq1bzAdd1jp^-qyvh馛xIJܠ\.o0|SOѽ{&_v-M~?!K_Lm:SWܶjTh468W_`F[h0ĶԦ3VhOj᪪-<\UfPݞ8 J3m:tг-Ciq/f_ٸj9ŅͮT6fn&cZ]@~,B4CSe>nu޳ZϞ=+l߿Eu6 j&bgt:w^c߸۸ > tS&Yh>7m/(9묳5jaHJN\4ĩff3~KT6R8:9رcܹ3Ғ֝h!ǓӸm՞vx~'f3۶mc۷Fǔԑs"۠}.-2ܱܾ PAQdo?I@vٹy#}%M^v&vDv˹+ر ]sjh4(EQ04"c(˩{PUY~=N_9F#]vk׮u]dffh"Νʕ+)**j.d#,'w= =ʔמg⿛]43p'5fPHe)Ҋ9&cW.Ǐd13z%KE3qlNvmןyRYQ~VKTT]veĉ5vy{,2я^Ca/ާ Զ ]}ܯu{T6{r:Yr,Sp  79DRU'rUWKqiݾ#m9R'33_5-IItM\wul2f̘Arr2EEE.lZ4[۹ WtqRSOx,ՍTzSO<ovv~֯_ϺuXp N#4<ǁݼ}`џv"] ,/;o?o~IIa u:ߟ .ѣGӱc^UU<7;EĩelZ/|嗌3ƻHjSc駟6ʕ-**cԩ>u+& 5Tsbmg!#ta¢j_xEik^ m\Z7ۯf*;nhZZjyǭJ^Nڠ_  NFm:vnXYi k֬t:kرc9; zJa^.Sz5+o :SIlL}%=,MT m۷{',;n:֬YâEHMMÁZS9dG\N'o<RVW1 zCҞFf1HݳUEϏ=zpe1~xڷouٞg&2&8YشLDhhh());Dx=,ǚ=RYx 2 ,mNF]rh8ˊp7s up3BXop^{M:ۓ!vQ䏚]yji߹ۑOr2>fҢf3 t֍K.Rf3yyy瓗GNNS^^-^V{(,,ݮƗ qu}[dܿOh4ٓwy{iӦ?pfB_beנ;O'h=<~ش񋅢ƕW^=8[\5- gV8@QQъgSXdV7Uԭ'WzQ_LRY0W2( !!!5[n:hxt\!aGVP \[ь3u36zV빩Q4D_~DΧ/z.:,PSl,dy^ ~mk]5ݔ.g߫^€g56'PP2#G,/&ƻXvyOϱЭG_q11ofdoVXù3fqIlw^oݻ3eeeX,N'vgLm%-4ާ*2'v@U{Ob銢СC^{5nVN)**9TU%?'pJ f:i.s{nir0p ^x9FuB Էcϟ… INNxkC tE ׯ\7^jEC^Ag/㮶`⫏qIHjsT!ZɊ+ϰgf}E!44s=￟zN<4 `oPVVVF!'PI,mnݺQ#O2Szӆ5#7=JŷhuCQ\Uf,U5YpJw{}hkkP4c(]SUEEv=wv-u(]sz߶'jvC=ajL{evnInL۷ꫯf„ te9N ٻw/Vbٳ, ⃇)_w:>Wn̐؊N{fBNj Yz5{ :i4:vɓKyYlY6e|8vnIvn/v7Mu:v=QQQ*++cɒ%߬ZLY`VELUUO᧠ZbPtaO?{a)kMNf:|7;{C, fL?~f&((QF3pm௪_XȾ֭[ˆ HOOj\.g4$. \@tz==8u:N^HzZ7nW^4# wHy`>5=$'.snw,+pm5Ƙ؞h )] Ɩ>hS6p+-.7^d3<"D߾}3f *ݻիWl2mFII UUUͺGt:oиUVk׎p1zt:SL)IYBx~ sW,]bgZ!C0sL^u>YJ3_ZI="8n7o>r#F#Qt %%%Z? f;dBb4$))2x`Zne] (Bdt_ Iz^OzNG+=Ŝ͊do?1G1ũeZ74C1 0'|ѣG+8, Yj ͮ],'fӦMg1t8tهV}Idddu:L:gTNP֛3b|;C3T,\2B}[UќW} tؑ{L竫,|F~Ys'<p e7S|pp0&MWKUUrrrXv-gf͚55ko0G5йsg۷j׆EF5;a٘7|2Er2<9EK?[)ta2OQ2`؈#\_/?xf8nݚxoz|d̙Ò%Kؾ};fLnz}ץgbZC0}lܹn/lt:ٿ?۷ogƌ,\JJJD]t3, Ԭ-D_z;1Wni2Mu@Zag_ڣSv,7Ql6eg,m]EWCϿN@`w8T+x{Y&E!00!CC]v1g-[ݻkEѠh0LDDDO~߿?z"..fO|iNw,O`m;vӗ|׊FIQQz &$<~Ss7<Ν;}j30NN诔}]>e{v;soaڵx+6Eb4iժ}a :&gC|.NJ gX*16;ajvl #;#w{sԑ8 j|A:wnZXp:lذ iS27o4RnSb2gذaXg;?^u PDp7_aYQ2>c>Bk׮eժU^͛7w^~˽߯>È~|΍T&I!ܘtO썏2 PsC $顷xw 4paLz`'+ܼS@h=Yj9:6ko OSNSaMksG(xbf͚Ŋ+^ RDll,}eذaՋv߬eYYl۶JF#DGGcX|5Yܼƞ[)Eo0J2r4}#:6B4d'e62 Y㪶ȓOMzz:VÁ(t:OLP0QtԉݻӾ}{'$$^Ohh(Z0zhf̘IؼyoPIa$= $.1;nANh +m?+k‘ħ~رcqh"kV\Ieeej4 2f @bb"QQQ,נ7st6ͧaӺUuv>";ǯCG{o\N')۷}D˱yj^lO^bHZ^zOpb8kf3֭c֬Y̛7\f k/BZ")).]кukoΎ;3gZ3̑GgpeWן{<űuV}]-ZDzzz0 vBb㉻t!u\N YC_o 1z1-090Z?AFzޥLYp()YVy,7Gځc5 ο{[Ph$Sî]*ׯ?0Q ؾ};g&##Y^OTT}ᬳ⬳΢SN"Eppp333~`W0((rdeeX/Ukij -_gͰsqҺ}#% /ؽuy9\..)Mj:(4y~Frr2๦zz=M\\۷stԉ6mw\>g޽9s&7x#+W9̘>\qBv 'RHH|q\.믿ٳ)--=-nJZZ̚5"""hӦ }eСՋ֭[dPza3OJ?)s8$G5Z}D,AU=7l2##p,{.Xhٞƛu9Cnx7p݄$6} 2S1'/V;5סFCLw}@BSJJ߱g2㮶x Lx[5=`07_{>:=N~r, [o婧"""7XUUo̙3믿عsߡFbbb>|8&L`xg#n܏d|2ӨD˰aø;|_<ص 9_( BR4\qXFu{|ZcJ6(Ō-,sYp<}!gX:o6_~{wnRinMSVKxL J3, kV;Y&%%!6;~ AѧObcc}pm۶|L8ѧ>bo?q{|ؿQQƍyw7''￟YfakFPUIyy9߿ŋ3e֭&LK/%11ߵˊBPHh:v,]>xVT4HEl (+Ri-돼̣egr[EQh۶-O=W_}5cP@fyf͛GNNUUUh׮#GK.[n5۶m|nb8ҫ;yP\f̙kgUU%88o|D^}UqٵTQxnNGT?Lr 4EA l@Ua Ā@ 3$UW\뽆nC I^< '|zb |oFNNN21kڷoϽM7s2L:>lTÛeSۼy3?wy'=6m; ## (B%d8ڡhu2pMyS ֌8Q.AD_q'nDX`V.lOXt&? p3 ј][7+ϲ~ŒF(DZ{ؒƍ9p999PYYIłv{̓jrrf8+tбcGFŅ^HgС=n2Ey[_[j/UQz\nsQV rj%77\.]ɓx饤R1 x۽K0Iwߥw_ Qy騹1;.X\qp}&r[\ /@׮]{WTT3}tVXmPE]ĸq㈍=cؿ=uz=^ g-O݉o՚|T*{gk~di׮qq|2u1:Q|cAUu#x(*-T:8cj5c15m%~mխOU)Fy\OZY Nf6\뮻3c YLng׮]u7Uxw,dLĤIp )(( %%gnϧ t8ڠ@AAY>m2vX.bE4ǏK./^6}%c/LɧW/Q\Oʎmda4l¹6 Ws>|_s VK{j˺ռ+BBB?87|Qnә1cj6{MdM6׏?ؠlfQRRBuu5fJ***Φ(vz9=zsͷL8b{6knrEE{/:N'>BuaQ$ biEp;>flvp[-u~}U+Ӹڛ y{9ZVV{ j95lٲ/_&gu:AAATZ,MUU̧~b?d޽|TUU(t8cj`ĞNOSoVTT_y/1o^cjYCL+h8Ohn,;7`޸, ?!hM)oc./kr;F`@Ѣ( 6n0r[xʋ0 ӧOIaa!Vf3UVON[CUU\.eeelڴ[2uT=z4&L`Ȑ!G-h4O0oBr23]tѻj Nh .UɦM{߿?/fr?&??#"15l, *UUv\"6n }+Vzo"@11BU2tl{9;pRo6Z ryJ6ZAo0dȐ)//g|_Mrg3qD \UUMjFl!unRAqq1Xl8ΚTp]( ngݏ?Gxԉok#NnNoKj~w?hv:D^xC!: n}8 LI z.s Dt~1̝/AL L>|j9NfΜɄ QU;w[o1k,JKKL&ZjW\a:բ1\v6n~}N)))\S[{ts #|!ʖ+lj݉670%{3&(<}їcٺag%*qXN/?|}*KkwgopbVW[7eӚd\^=+3Rz"sQ}[&TLB"^93ő}ۅFE_uQ-s\\54عs'9]vkaرo߾Ym۶]>٬D- Q7R\\d>`ƌdddv_LHT,Qah]\X; FD_U㲘q(Ǟ S58Wi>͊鬩FUsc|k]E9}֒vaI󾯪5> %N RF.x =JJJoظqc+B@@ 4 .#FMii),\Kl2RU: R6 :vnI?IW}׮Vڬ8J X1- ?y7vQQ~h&И! IXvYQ`D><mP(Pt!(:ӎ kz =L^']ο8L~\rͬ^*K%PS[毿ؼy3gqFXV>S}]) Ð!C}.y!rr*t2SQ]NV+/톜K:"_G@׆ɕŲsg O]muЇGZOݥг.hԪhvElXL=EQ 1sѷI^q<ʼ~/>_9gI۰p8SsOXUE'%K)]:<(%'0'/ſcov6ݨnښ5kؘLXX#G?g}!;v`>EFҮ?_z9} ʢEˏh~ krss;j KDB!. ɟ ߮):O| \1],ʎL~1t8??l6`]3|{ݱy3r=Ĕ,GЯ:[6oNψQ<L3S,x}xn4Pi9bLhKc/Ȧrj|gi8aS̙3;w.;wf„ \xݻϼ r9Y#Nh?M uNzη~E]B2L2[Di=oEuԟ}kGЅGup[Xvm|_؋rL1&ïmWG4ߘu'Ei*_ϫʝwy*?dʔ)_):`_NIKKG%##R܍O;b5E]S_V^|.&^l\8S1IEPu\8O4F˿Ŝƚ`BF@~ ;>RU14K"<.aR˧}nM悆l^y>0Yp tC]qΜ9$''{6l]wErrrYH``f3F:R 2D':t\t4$y [O?]"/{~&<SU1.}7?^n' DeٿgZFmF=<*I=U܉a2voLqa>j F#qI1LΟx1*0rٶ]dN&S`ԺVP*MNaR~w!`ۍy24 nY`o.4+ s&eK~Ǽy%nV 6xk5޽{Ӷm[HNN}oLHXth }ޅ|>Yhb֯_ϰal6~g|Moެ?xfon~YF(-ڠPCs8(SzYAu{ejj@ݭ[#v/_ɓYr%K5hE!003qDƏOaa!}*lZhuѠ1И CIe D,/y]yx =ylPM}ll+<_i:suՕhVs5l$gf2<6(߾(-K~ƞ \hZ<`=K`3Iz}SZcٵG~6nAnn.mڴ~`ΝFvO7F9\Bn=S tه>b_>sE}1C i20++z_zmEq0c|{͓uޜ8K x!l|ҳqNQ-:6- UUUN߷o:+%%%Mk4bbb;v,7|3۷?;d׮]ʰGүh(z=xL;߹b Cy 1wUWQUU׬w^Ͻ&#m_ 抚bEx55nI/y*Lb*+73p @.nPUi{M{>'H{ .8 EoD (zg7z[C }o\JsA8iZn6\ʖkPUͼyxW1c_QBCC8q"cǎ?w3>г&`LlGu}[0Lu=;b~dMygY!8ͫ #bus)}LBn~1UUؿDU˘ aZѳ@sxX<om/E\ZܨV)+.bWןxxNG`aU*t,O׾;m}x4~Cdovqu聳qmڢ:.ͳPtފN68tYwK`!T[D'ڭ- 1l۱?>ӧcfErR&d⢫od>kUUe֬Y,\1c4xʕ+yٸqϬa@@ڵ#33<3IE@AEyd(+|*<p/r aٱ}D &xMjO0AJϢUeO}xNn6sf`MCm,^7cj՞UXг. |Ux8+QO_u9w]W*BAh߹1p83G~Xr x zMtt]3g#xV޽;7|3_|?~A$i=!'X3jsŌ08Fӧ`jeʔ);F_{n{9f͚EUUUԦ?;3tymFaaSkR?5&? 10&#cj}D Vt(AuYQVA>@󸹢^z.=zئaaO2UԶFfbmyE '.heF}屢# FM$K{O&;!`~]gU3Шՠ5jMWWe \@ [bZ8Z~X~=V~4&n|W6wј{}ޘI7mGag_Dyb͊!* tO}5p)gޯ?sFᅴއ9kx6/=|7kVxS΄}D,߾5s_@Q( Κ:FK`a$ڠP f VGXĥlޮɞft!8J )]0FJ@2f(fbAuSr.g]>"^)[6 CF̭ϐLzPU+tl>c?yA!\wF87mUU>}:w}wܹ3:fbUl޲AZ1zBTn/p%O?597 >~Ν;s-p뭷_Ѡ Y/txc&m!l%D{5m6OAnY|GfOtV^Zf[Q=koEQ÷Xd>KQs};{&wF4tRdgf+eW .3zɓO>Iyy9UW]_< ~"eaD_~|-TnYEoܴa{vxiķ:Uqh4\17l6ogy&}F>5EQiA,g~eUUY~=7pcƌ[n,]̻Yc0q5*w4=.=& AgEg<2t,%~DuLgo?q-w'ںIݳ{ϼd"c>fLPq$):aLDvQ;FKp(:=@P &OByuhqQ2{"_m9:y>_nT]tzgWKw4 w<4V-#uNv;ӦM&<< /={( |Ԫ >sRd'\X3SܴaJ ;KHjO3#'(~a2v=>ϥ2}t?yGҩ{&-C.0/eЅEumϝAδh7qUSmuw$:!C Ct<F5.r2y{A6ї潹O_;O@U=zw- $ʻ62?xgYM /!_] |<Ԛ& qWy.TFPo HUp۪fסxt18ʊe`ٱC= mP Q~} H}OpmеI<NE7t:8NBCCy꫽-[{ﻏw.$I7!0!g墰>6SQ0.,}S@B#e*);NO`ޢQ\|ƪ%*n[vnt~E#ܫvyTnZVo-Ovu*) ]f7.XRU QZyj*NRM38m:u'n[O@c4c kn1B‰8?yay$TcsCOOc]VOyy9O>$n+]vq`[DU2-YNn[50oXe&l{qY̞033Z.p3#F7FƁ}|Guc,x7q:TTTxjpM7qyRQQф!63:;Qy6IeﯹitQf>ٟ<[n:0̑<ފR_ڱi}ed}dGajwU%U)[ܺƓy=]5j ) -7`Wݵ]-P~NwYVeبq %sgQZ\ F䄛P]NrzN{=cN^ZoB@p[ wfBs{jK/捻 64(jsaL$@~"X}x,|⮮BQ:v+%IJk#CŲs,*Ƹ6yj*}Nي9 )#x3NG7c FK@~tGPU2| x|1h6UBBywyHٱճ05$WT;P4b&qt 8-=˸PpWWR<[JFP3 9]礡;βb^ ](a U)[٠<էxsP:GQ.nkc1'mQ#$`Ll&'3{w˲zNZUUY{e|voQ԰Pyy9?C3HPbozKTR?Z}Z 9n~ChjșGop57h *vm\wutؑuquבMG0Mģrg__ۮ ޫd7@uf=1aLhG([gq!E|k3y/SδuBKџ_Sg3ˉ68%Y3YY_5h۴f%R@SURZ;sR~:Iϒ;,魢ﮮ$糗=jIPCޗkjSv|nkSz~M MmzU]NO&Mߡ% x E.4^RkEތտ:N-7[mu6]Izm!)q B&糗ڳśB\[[rm>KqKO{ŵjពdgyZG'5E^+ƿSoS<ܖݧ1mL[V7` NQWl]Q0ƷٷՂZ kuz_>;+JQ{A'QյQU\em>2EoDU{ *f̴ TY*d,kv|'t =П$kT1oZ!:IQq;]F}1;ah.=g_nR{l6CǎIOOgҤIN#84#QoL;ySwrznE*J)sJ}\j1}m)#,,Gc0 ";f&DQ83(mF>"氟]8JYWFeͺgr)BEy7 Scǐ]`zcٵQWveڢ&PtzO?TOVM՞>kU'׶+_Nr*&@m D6"̧|6'͔PKDAN](/)fs\^[gx-mY1'/7Ʒ%s2~5=缵g,klI~zx4ykP &0%l*JqgnU.]VɲS;~3?FL$f9v4O"4¼\b'o|`^$Q=^J$oƻ8rQZJ@wvhloj6<)Q<̋1arS&q_OJKK/ǟ~@ZFC 1Wbj݉ڰS/R0!ul,rɏ؛߆?ĺ'J(:=/БפA'>ˎ#1&*Rtzl9i.}D,ބ><ݔN<JyYDa2 XԦ =aٵF@~n@ }D 3?-T5yЭ?^ER4{:ִ=.g^Aب5YnLkB[/ nIuN  kz \yA} mOnT܌tMr8vTU a=}x4BL :z ܶGM4, <9&Ŀ`4r3ٽm3>v E#6 f >rope஗_?m.P4Ozj5o}yakEG[o׶ ޻m(\25˞CPbEAewkƚnŸhЅE65-7+𧹓"`4sUرyDХ/|SRo_t(C15:Tێ-+}x4z4l8 sjˉ-7Ot)s}N kTGI?o* &\. tSH͚ }}L"Z~A驿IJc=߽GI!eĚܯYV:EAc㍗"#=^Eo@v5X `]{ega4o};k&ށV]tӏ]7:ap4#Agu [ wu%3 Vmڝ'Ҥe៿غnSIkǯCOvxPkWۯ ǔtPaz}Eo]w5zwZ t> "t蹞L7Uev忩mW4&zjlYtge^@^:]v=FS˦c nr(/iPoKu.w_x[)HM1{^9We9߾OÈfF\ؠBѬp@ſs_n{}|*uYܺ/JqD_v56BwKծd*/|ߞhpAUٹ%﹅!đGfTZ_LtѨ.Orƥd(NsMɂNj VG@H B@~ۂ G_g,7>}PRRBq\fe8i.-rds ~rg\gf5$lEv@?aN^VMPDOe{~&lw't {N_]X4VU]\2iƥ/b0{l6)A}1xj YZȁRoBun7HGPqA> AYI1.EQhЪm{.z.FZmޝPU7֚9 s%*9Y f2~bo4vQN0~4чFzCL%uA:ڽCT|K]xw]s }JGQ.V0DױeﶪbͨͰ]UYS&Cd ;JI5 zpÆZ>jM㺖6]ܟoX_ſsoSa UkZDK"dXo}Ȗ,9xb֌rvVlϯ=]X%{Izmh= qX{f]g_?PngO7y!x"'H^üa2ڒ[>K~]$(+)O?d!UQ\b/)y*ʚ5?ro*W`$=`\u:)%v~ΥDΧ LsYƞI>}`0p3Yi9\z1Ĵjtu~NV;qӦ5+=2p*rrV≹~"/ [X,޿WBP~}AdhLuI]vKoE1kۓ:]h$zaٕj`_?wѡKwM#s/?|֭i*n"Jصu_ FU4.6-|mVzuw9Heto.[NzI=z(-ZY.f\lM[n(v|$$lA@~\.|%|;Һ>MMa?vyfkeK<߽9q7>nɕَff8Xo~mZ{T uZX/ @W(>]H w2=FO]k澺LꚎ3Pki]]{udCF!2:cmNh`ќI^gOj\c' ? m`\Uf~KSiʷ>*/"g 2"(-U!|*oϠŖxBUŖFb[h5C_PQ8+J)[1u 1&'x(B_MgA*3e^(j>#ϛ@L\¡CF4ό!*}fM*yh4ޠ}D WE9)_5>gblաA[oMAXUflг& 1 60~#)[.)j> Ouno?ºkR.=Tq۪Qja*+m߇G~$Gye%DO!/geŗ[)N!azUۆn/@7>ZR13I #Gc/UY}dβBTՍ1*g{_cNhwO媫So^mkFmAҝMV2G57ק1{{?n?}BO{fU 1'/Ö\ dύ-kH5{ {a߷*e ?m۶EQf_q5"Gx(MUUoAUUY{8Mch>EJOKqaeO/Qt?ݶll. ]ޡ:VکBaZqm?y6fQPP}Qs;JS5ŕT[e.!Nmy9{OzA_Ǟ,aUeme1c9=7WƥxvbPQOb4Ƨβ{SfhܣjSOOUV5゚l1}<Ȏ>$=>?O WntD_uGIZ1w!:3.)~ Gu:=Ewk/ETl ۵6̬uEX3uv%S2GTКlcLl3(!糗1ķƞW/ZNʖ6 mžwj E}uNnS.hBPGţ k4GM[mXvmm6 .-p:iWr'!aQX>"{_oɞkbjSR'!א~dIV^mbIkv;ZnkB3.P\ tæÊW=u1U7ڠPny}XQOBF滏UUSl'pa]իƝ@Q0o^Vc53)YЮx '3hWڀ`4:=.n6؇85If~4~$!Auy;eX#gzД5S맨N1EyތSF߼kNgywhߥq<*qt(7PZޘB=!KRβ"UfMFvhӦ ӦMCu9p~~Va]M*sz$N 9>s޵ I7~"핻ePy%ȑEiE)! gI'Ќ BWr**Kv!CECRUQyl\JTgYUa޼nbf?G&HزaϬ>"3P>wy.÷Э[zfT ^Њ!H/W}mQO7.eT:"P () 1D%4hhcG`˪'mֲ٬&l, E!^ xf[*/&d8eiTJQQ0l6WUO_^/t]Xw 8   -XiqA޴sZ=07c>bFY{Eoltp8ˊZbٵ>cnku Q42v_શx庫-kOƚUU )fh F]jV2} ]ui튂Ѣh=czW|*঳]80$z ?+n_Qb.hbWkcǵZ-ZڴĈq9gŴԥQ/QRTOܤÿ}=z|TOqFTIGOEٲYD]t1YS4{: ^%N`-;hNG`a8H{v*UY&},7mciqUY(eEа[KtB%ggT+ ]zX4wVPmV>E+ GAǣ1Qbn/=Hi2~gYMv(;U Ag '{1$ͻ  T[nA/UЅGԪ)ZwQ߾gf7WzEE}ް^ vQDQ*J{ d{I6YvBz;3;wvMں`WzOH s(Oh &ܹ{})<%T-! Kˆ!e "yvnwu ^/j鼠D X}7*uAHHN {jfЧf(!'ՖO]Gqrͽ~&ޒ|4 Md UAԠidsȟ<ފC^DCjۺ&V\fd'<ѱqjHﯨUyֵșHG41d!aD}ZLmu߫#hCV"h[VA7[ ܽ{_!Y_9jhٮ\q uyv4kcDp+k0ذzχ${ ~ *h17=wqUW1g"y^&RKqq1$HGRke@OSo/ޮ>wkZ|"HQRH"tq^քj]l MH :r}'lLz-ɧon3ic;!bN?6]7>N/ ^&2~C4Z⇍ՆecF+sTEe2w?9[6`\'{vla{QV$5 qI\y;P&LVK{wn.0wV V~o([Q}|U\uW@mh 4Z Ym[{j =lg*BBrh:}d X\mYDd類u8woƺvF5ѢOS\.;wo"ĵ?6&2@u{W_6|՞qY0'Zh'ߋ^ja<%]b)WAY6ɯBv;611b[k꼢`۴ Py)D7`Y9_m\w$<S'7GcFrPgHjZ3'J9u`H@eǞc%6 `J (-AEz&*M=*khӦ eee8ǍǝkWd8/- ~SY*X|*tI3[Ѧ 3] c&Pdɇђx ۆȒm[ ުh zҁcoD@ٵm3FCܣ7 9ؼM&7{/jdgsn Mqka„ZUPD0JjNERy)=m\".jB :F\əAS11nUY*3c6k٦QsrY rةVfIԡ'V uT.4tlWkT@U$$[ވ&*}J&(UEv[ ΀SQo^}@^j0<ħh۞- [(a*Q}ZH*>xN/blюfmcZ7ʡVͿ]Au%eF+ }۱o]CTkw~OR)DՊ1zk E7P<}jyׄs[E(5qSbz s!;쁭8ɵS<Q%LO@բV[{|״QqzHJvIrr2!.JZF#<[*?|?r"N~;()nlўw ]|2ɗBwSMŅ]. #֓-* ;֘"%zmսkAZ+|"ԑխQN'k*rbܗA-ѽܳ--5Dڐ4 .. Գ{Ȋ j3XVbp1;A͑QЉ:qeW!2jti%E8:[ =oY(hLQFW&@cDd)ht2Z4mJk䥱v^h CFZ\hh99m0L|fi9^Od;%UGd±o"ZÕǝu)esN\ȮSy s=mqg]FD.4E!')yZT;JA 9 m=R͊?[^6:ӹGo <d 2*koUV{K ?NZ<>X#Νc|rrV+Mvv+"4w~6%}Ld~Rzx;7 d`j) 뺿PP%h0|m:=׃cfzWx3.MX,R[P<{2_d\RAҹ[sݝalt0atz=xN[`R0d]Svڙ̠XI巑SS>~lF4: PGV˪Q1"RMUWp61| ~tz=$фm9ve,[?~5C* )&|˪?6:fQJٯT~/&ajםWl,Sg3ab]!5޲"l떨uV+2+?v -\2oE-#W(117g}`73Cz(=[ѧdb]=M2h>{~g ?oĞ[TTt0dկ^6]ܹjJi*; Qy:UKH2ۉshEra$ttAODKNp%JN;y?.NBK*r{R0y=-^U^DШ`GU>+I&""zԱ7܏mgAܱ !w\MgֹY-b*JK,/j鰫t:EPQVϋ71ͤ7kAwƙ=mI96䲫N>O&S$U+~#ʱhЈ;"l8H;9dnHkE_M _wۮKB[(2%}co_}ꐋ2[4NEdd+O4Z6ܳYZ(hbјlUBvFKٗ,DzLzCcHo!E+EVs|!UK jGIdw1@8?IPa jEݤcz Q|^Wmرx[^LS=(fx s|X.k Yĝ}9_oTܹ{&=EcBvKj5qhbUa(~$m콷3C'„9: u (/EF뉨Vt`o\œsD 5޶aK|1>9VWܓpAɲN&K@{Rt 9h(>_L7W7R&LˆΡv\:uD,JTuPmΤI(-U%K掽Bq"Bc(ںﺉg'~H~(=eKXr);l@ ^\{}qZ=)@E}?D=4œ\tڃ+—eB gL$mOU!Y :nn p>2hi]Iܥ?{ T[aNL|^/?x+9pho^%QT.dĹw+$YHDMd, Dv;?+V|_6.kԊ4(.A`jӅƾi%VѢKL#mĜ: A%u}h"");_B)L{v#;ܾdgHoN55"Y*I>s(-h`@4hcUzڸ$RGK:Q주YJ˶nTEx=lOQ\.'k-f {TAĘՆ'|N}:_"{\XV'AQoؼ=7>.>ſV|>;ܵ N^E62gv5ӣKH%1$w "ִ|C~u2et 4@饉&ok# AoĘ՚#a3Cfk2z_ǾummCȸybO?1E|魪)A洛#htT-Gժ$9\yC8hѶ=1+ A Q߀ E>%%sXmk? eMT!';}X,DcR'Nݨmz|p!ZN[ 3Y [ﶾl ܊zOs]Do_RF݉ Yqx=:jS|&XQΠ3S}Il(ª e\2&]ωeÚL-,[LeYi*5KQ(gY+(Ȋ~ߎ;rqb4x?(Z^ duUQpڄd&۩?s~&Y*ǩcHoy;l/"mD 2C-X:o 0rvi'r(D/- E#^3*A$bOdĦ7鳠H/AԐq٢=c_s[hվ#,#Gpl79!  F!'RicFrبۀgH KH^kߑW;`DKo%smXeB<٠ѡ#i8G/"74C^CO"Ix 4Zt )!s羴|f uK(-҂ O Y\= [7O@\Ba_f ]es6 MT,u&5шw#v @ܙ7Ǎ.>̱1A%۩\:_e)>k%Hǹ..e‡Hj~$ @M{ g,^d,TM$^G/HzA4E)ʡׯ\2'HlHoItFz( 8Ү{=O^+  ϸٗ*̿oJYq(V)o#BoHv]BY]vmtފD M$ !#ј:3/BqpJGȺڶ#AZ)YnKއ݋RtU?JLmB+ %%| 6Ɵu)?L{eIb߫j0͠scsc,cЩ(x+K &%*1:}Jf Soh`{ ހ"7#W-tV@\Bbxtz5U "")ʭtνPVUsj/#nj;ǑrX=]k.1y!{&*Ao:OQCQdq_n4,A KFȸ9>s=ޒ|f/?rkz&_y? ïyh a"()3pu$.!f/1÷8ww5אjWbHфQE mc9(,#)2.*Be+-dgUfeS(),ї&ټ~ӕ#]lXBUGTK;vxdРx]JW7ZEs(]ڼaWHOBJ.% OA`ۂS/ Z*+ogSIHN9*0/&JZ=`?mkJw~?~o HNjyP%FI&CR4.o>dѼIjV`XA'{IysSJ>AmZ߅[IĶq9mkU!"MMTѹg ޲B R5u2[O@0fU[Kb]Sc|$ɧ&1b?rRg j0Q$ĝy1*ipQr( zœ;Ltz=Nh jV|>\([,[^tИIb kҹD톰{YCd#(mtÊ!E@BoYE3Xj#UJUEQHNK'٪9n z?V/ ; h4A#Q.)p=. ?{fMt*6>}iՅA˷o[k.Z>7s^wb7jKD cG$ <..#<lQ4W#Y+CwAG\ըPĞ6ǶXEcjۭIǪ) $ <%y8w+r4ZmP-`20݂r xY*Z E;w/U~Ev;{h0t-X7,= N,bT5W${BLQ@) e՟T {7QCQB]Qm hⰮh@Ttjfp`n~&cHLI%-S3ܰz%! 7rFZs.lюv1bS+dEƐùڲ$Y{wD(l]ȋ}Jٹmιr~,P{UKAVUg~Aĕ;` &2sCEHDˎz#9a+wYGGɡ[s~I i -I p}5H#yK~pgVqb Ϩ-cR:J'ȝܽWԠ1EeX#iĞq>x=`0n|^/.ku$ ky3Z- _KzK #$7X(c/ŐbҤIt҅-[RPXDwɼk|PxK o_GܩQ,"#)7yU(dm|2ctE0D8m.+WU6&E:Z(J7(/)U+ HdS7y޲S-DcZ<td|qhCH֝]L?I=wna ^EQزn {+>v´D1xU뺿pބE{ͱ_T]PD>Md4lJ;&SE(#/a8TI8%2/箋a_p;̿^a]HeyMEgq1WUcz igDòv1>$"p߉!yY2e?O|7Ȑ sAjQHSB&,L = ǩ`SZ\V䆧?{ج- ׁ]X.¹w+ۅbl]w]LFx *KI1F\ BuL`o6r=JE (Ի?E3g,#+w;ya :l,cmi>,9$ܸ@ȕm0ug"c?A^7W/eiaA,,m:>q(\|zLxHR`cu`'ފb5PYI=uq廈{&=_RGh"1!~O߃n'eL+ZV/?0Ü\@a^D@ޘU}6,ԡG 1Œ}L{ԾXn]z40UWw[jyvZQFQ/ CKwam\UCQ[ne֭\ד>[V3QĞq>wPo/huu,J\4F4*-"'gH>\v`Y9?p< Pma߳hNOܙz,^s?ïw T݊;g>{7C(q֥DZ=Dk:x+J.>!/!2?~y@WQzNm MHu7+ A;}ilLVίE ޿(XjL{#;}-PT@ƤM+xϙtKS\@EΪr6RAVg^`R@'j{&&u_$ˏߥGS0iǃs/=XˏTvB44q[oJ>44fFGՒ9HU\}ژdX.Ʊ}޲B#h !4xlQo R췠EY381G=i@'e)2Hv8xJ\%{+JTU׃.!gm KHYꖚp CRJid(Ѐ p[<@PF MMԫ&4P9nŝOmk{ >ke-:Xq&Kʘ6moi! @@c*6Q'EMRzԐA. &~AF;2!֝|LglxJu:kQ$ɟ`;عٿ{gk +'gѢ=ͫMEu-ްBQZ;ֵP|-Æw~|*A֜17P测*A5z2ypm(^^HLue8Vo$Vo}l"4o"Rk9*1z#R8;5QIh7P8%/+r*J:vE\oah,[ ٰj9?͚~ HM#&])m<&Sz)E3l[ (^/׭V,Fvã+DFqӸn}@-ְgV9bFS%Mٜ 1H*#hi!GUkح'@Q@i@UK|CcFx [^U= H}j3yIӮ$tFrhw]"qqj ~_Um9*6a¸\N~-^Dh.!w]m\?Tn#œ( \ I'^+ %?SXVӘ̘r"Lf6b>Q8.O_:z3 r ;w[F *5z߼}?Nټ([~A/X#M+F3 #nxùo'Ajx0KA %IbQQ^Li7uVG)Y\۶Kêf?ZJ򥷐ukhc߷OmFׅ* okx(FI) :Br݌!*! ]1]C)l58=Ehv﫤\y7]%G!%ѽ~SykR{Gĝui16$'WoӺ]Gtz?*iM#;E|XV'g#Q@v;)1_Cv:#L\u7'8vngY߁9ˑe9<e\tnoE _n6.h`Ի6a(8mC:CBzP<s0dLm]5HOm\k6.E>aYÜ0ܼfhMנ풯Cf+d~/F~rr&=BT.˚XVA)E_rEcnZfS0f P*^%?LIN;ֿ֣IA$aUX/EyЭ'{-U&G\NxOg1ןN&{AQCT3O֌RjЯ(طº/ vQl=DԠ:U@zÚOkF: *JjQ#hc0Ny`ػcV- AڻHcITt 6Q1|{dIbCy;:f\ؼ=_ cFV.a]vήȲru ݔk]B%*zd?c۸3/!j0r}Z3RKnBVS#ic0FUeȲ=TKq/~*N}wZο_ϦrOxIjy< H_Q|>3)W=d"k wI z{)/-a޷_vVe:h3ҏ„;/ޭDzPhL>ĈH2|cGT m Y6.IMf(j~O_s]4ZO9+q! A ]Yrtli0aj޳3@oHkҐނ{^"o89{j;!a۴A# V'>VYBDRVu:ƖeޡjKAjtf?x#O{Cqs/Ӳ]e,.'mnt`_ [#+@5~/eJьuR(D̷)3d\#뢍GhS:g:m5`s~xsUx+KAP$ mL<)YAQGu$Fr+X@\bS&YɶVŜɘ=BO&nە?QpPEr2Y'i@j)x?e|3h [?w%|?E?g0qCGbԷ J(d]umMNW!u86"lxQ\yjZ/;mͣ0wlxhLQ$9gc/NtIi},oi lt)hI߃ yHt'o^& ^꫚ݓX{ym;uiEQ:˟0w>% ׁ],?; Pn#i (oi͢bOm7̝bl}J&ф6*_Y*pۆed fp2ǎo`(^!6>.lÜuH.}=͘Wx d@TAuӆ#9mLyoE >KeoDFT0h>5 )m\?wێcfl/ybdQ'uoyQgH3} }]/Ȩhƌ}A㡛fۦ4ꬃ1D? w^ OsVqZM k'an1eP|^{ށ!ufc|#dSy;`2GrMwp0ǟĔ:k0E3Q ,x صw^<U mjE]A hc0d$1\[}k0d&s0w}DENrJ&.#iүNeyPss/3ۯY-AhŶqeX~svb]!UP6gzXЧ5k0 D;?oY=EkTs4q@_x%$r㽏kUٱr PŮMtO&o C3[1{6*%l:z1HHA,,t )^{?Dd|c>|,8msm\3΀&ŒaFcBj]N|*$[ۥ) ٪t(2] Ьeke6z;{}{Xl )8@|$j HϺ Cz 'ùg3׃RNXAE4D "И":dVyjp`HmF¹?J1vA\2ТM;xȇQIٻsN4H}oJyR%x+J)ouU: ^7G#4 OQ{m\V;%f0xSi=oYaP@SNcȹ{A Sza.es$LXiFajWVG[uQD60{Hnב G5 Kȟ<OqBVsբ)M"MĊI>Ea%H>_@pZY^k,#%A2bS^5BjI>܅!mZ}j\;EEMO3x5T-8ֵdp 7?G`k.(r ح?rE$ʯ_w6?g$#I'uYd4}=wO9\v'a(=45lH3p+o_.!Eu1hOg?zjnCFjZKmj$ h;2tw?p z]ѣ߀9aN|2[ĝ׳~2jfKv+u/~3ULs>~K~3gx(E nKޚŞh0O" H~U{{H%$>KEd0:]O2KO`]h;"Ͼ"h[}Z3ϻoXW/rjkVhԎ <2[;pDqoe)}۩Z6o'sHCcEZh s܍j+6,ÕcCQm aГV>eϣWQ,i56bvgSx&?d¾}=Y]D3 cJ| \{bl.sP$3ƶaY@+6>+o㰏w,ٷk_| ~₼CNhB:Lh-X (+)"9!2q8cbEy517x cV׾hC*pDW7"b]exJ V5ਖ਼~4A#"hⓉ> #U&췯@ SsZæa[ȲL6xiLx6,ùg3qg^Bʕcm(&M$]t=CGb]8wmWYr]'?3{G{TZ8Eu  FN=y'=MJ F->Iؾi=6 0hA@JMObt<t=8S4<9(^:PQJ Ԑ1#nHPd _Ues>rԾ'Vh=.yV%ҟ>ún &]mD;Bb]-WU8i6:k>YL|oiaP0}]aN:Km[4Zb]׃Eڍ=6$kZKw0fOd$k}$R_MJ8lxK peoǺn ֵ)%.F\դq܈<ؠ GjFgH.'A8cy+K6e$_v?޾\kv|@DLTF( ųòzApϿ ;13ʋOPѤ@tL,:W&oL/"Zw&^#@6:FD̀3Fh(=@o_*#gUu4ZϹcNN.rlWcߺVUwj:3]9UN(>/%~Do!{S3ֻqkU%<|>4H^O FdGb*ƓX0#b^MkW1xꧢ?~YNs4t?{ s(r7=uXA5ج- < EFF47` bb캛91IDEѱ[O&SGKqT]KV.hSOm}#>?#o!+_=OGՆOB[ׯ[4FRs _K7vm2>x.A'!9,xK &579 9 cvOq._G_#٪\S#{ͱEQG<8UwssbrʠD{r\I#u"c63&)ED"ZwA4D`߲o':Ȕ͛ICk&H n'~]wc4i%ݦSSZGhLB"Ⓢ0+9R~w>rrY#>OzM_sqH֥1F˧?cZ| TQC0DO aw*^E_Mw`0i5Ņ,mNǺ5Z2QٚA-2GI$dYfsbٱyP(Dohՙa}ATKy33Y0R㙡humw*_sRujݛəsx5DVmPkϟ}7'*:&Q\Ojc0fiԾW܁s,VQ/hL,n`:3ɸY,S޲F"9ض i;+xKh`0uKHuN bяu"B|8vnI6@v;cvd iCjo|jP_e=[pg)_F'y RgK|2H4"`Bxtz<GfrHĦ͗X菠>h4Ȳ V > u2P7gDF0r EN/u]/OYorj73-7d$1S/VE7(35y]{SxndR2+CeYiWA@ dnԾSwng~qStТ|6,#n%iUX4űc=X-u#:_sн)]8%׵w+ֵ tLۆ> %,7E8[?Z!>O*B "EjUώ9EZ)/H{fѼُ!,sf|S'{6&M+O[=~2Ǎ}:7S2#\Li#0dlPV,hen Iԗ)y:dl}Nh<<̣eėAD OV_R7"*XCN5uKeŤe6;NgVK3>|Sޣ;:#Fj* eފ<}DIJ;OdZTUVԁe7bb,5U/Ӈʅ0Yjҭ$O&P2C_Dܐ:95^M<$U~1 Ek5ާ ~BVm•A=q}Z32ǾȁW]_M]c$ʎ:>8#UOBDE!Y)Õޭ>ɇ3`xcY[PXN;sX8sL8ePVm>zMIXOqK)}=[u 1GphRF (s} ܅FqL@YPȨn#&i?W"HiBAiSa@=uT-(J^hF6eҳ ,ނF&*>;2̝C!Y+x<~2OI7WڶG_^7jO6]ㆅ?`ԟйG/-sz9j0 5_~YfO`˳3g]rnEQ?zs]: tދ.aRmJ[q/0)hZZ'wqg^LTρG|AS)~ dTxp|ZF$0+(?]b*JD=}۰^S]jۡ, 'ԙ! d C/=65(UeJAy@%uVGTɺ.xK yxˊ^7GF;pѺ0a8vQI>!{ŒJ-/F..Mt<ڨXDcR8wmĝNШ-V^{?1VbAYҝX, 6CRj3~[FlQt6uq/H,h`57qxqT"{XVǾe֘uجڸDĈHt=*UB-7/^QgӂKHWƳ{H>|1eѦ ï$v9Mwo&l떆LHHNg_Fn .#Hn긩c/.m }xa (UPwy-|ջϱRY)3c۔ڰSHJJ`0p-ᅬX吝v~mrb9G986Z_$j4apz %<*: Sd|\2v\񴌊E}E??DQ$9-+n-S/)y~)czsV1 1GwV괙z~Ce% u+pyW0#UFa=W-Gξ= jv${A 钛ȸc7"gør|D6}m#>MʨI"lUxU#huh[v@44-vy`_ew5a4_f;8kh5~!mk)m[V!(޻aqբM$$s%vG%J/M@S?OD4ςnSoZiǸ'j4',㽗EU ${^n(DjGP3\F_w_zW`YC.1„!.0wmWpy+Jpl[KyX/W^#/9_ިcܲ\A A@EDQ$Rb0iD |% "#+ r~Y%{F |u vn_?&M/),IӬT6z?]\ޝY!R+ /z싙?ݻPmzx.q.DUoO"]XVFѬqZ}4Z-m;vᶇd azϧ'c2: i1HD#(>/{bߴOQnz#L|ߣ~pcͲżںI $BCE4hGD :O^ºvQTXIy<}Z<=~AOsڡGK}8wozk~|D'?CYq^6m!I&r|8nrطSH>DNiގȮTt M\C%Lꘫ#x9n)iJHÐGE{ -DƢ1G ",*qgٍ !*[K9srk/nR6kh]A8=Syspx⃭klFøw?9#K6Yɛ=KBNo8"yQ|>4Q};yV͛r={|wTUV{Ms~$S X^B/q5΍DEzXFm?V9,*Jq|ѻlǂV;rS9C{ҢB`TI(w@TMNk3t(]R:m}rdb37ܵ^9vf5#qiP"9dfqAotSK>5mWQ"{݈41 urxOq^ ^gܻ_E Ii;uq7_2 燮 ڐ~cDڤ*W~k4.z O>Z\N)AhUBCluKU6 YԠ{ yj<]z=zVG$j,*svZCx>}:cǎtܦDC IT30wugNU+S4{NT Aci4=ƽi5wkU%ы? \tutߣl>\QRT@ށl~K#_HI#onZrv*hI:2n}`;Q}tMҚ!nYk.z$i-(-\Dwv F|*Q1T.Cf+bO?;r~<`M 5y퓙aX|u[7 LZ>3o)~v< 8k<+2{&[֭a93q7MsTLkpز1h!,41.Ivp؍eT.oa6AFT\5 ݺucժUAJĉYb* IXrp%K,k~O)#Y;Z>!_wJղ&5,KH{Kcr,ĝuMr>1A5'f;AQ8TC[x<HNMgw1;pcT-3?~'"gңx sBoPa0ҾKwR)\7p 8* CTtL KHUUQ}\_U9Ϣixr eD=[~ǖ|>S&nCFu4dCc߼?رoy$5#eh">: ӭwwER2HI`amV 1DDzYj{kPó} |ìO'̃ (mۖ~ѣGc0OAQd6I-7мysڴit|+튌v݋;w/:1 30놩]w"ZvD&2&L|Hv+ w>ܹ{qXkNx.CȨEQ$::5p!رc3fLnӶm[;^u&OLyyy) 9yx \= 0!&jU)ɗފh2cߺx,n_`$vЅ;KҾKw:]?L,W VċG4F[H;TP+|GhӕV>#gPM<.M]\"\$>F%DQo@vP${S04ѡվ2?zw~v{z+o=ѵ s 9Eg4AW'VPMsy>De`4E30bL;hTt ow_zrO|8l&ァ)-"ZԡЧ6C&*V=")Źw+5nXp,j5za<6a"Y-[Z-U3|d\.'V"4"/]|2gO)ži-pe@V!9m"{=[  D<^@O Vd*6G=iJ K1Ept͊o en' @x5DQAs<dd$]tO=׎h4d(]B*(j*\.z 65 W\q+V%I"-- Iee!%C|xsmj>5 }B*4D [RoYA e@AHLLK.[.e1rHnvq>luƸq߿??vp+),`s`ԵkQodEy:Q=OGԁd--Sʲ66)ܷ cˎhQ;G5Cf2Yˏ e}J&QMED$_qS^Dv;q@ԗɼݑUə4*Lɷٍ"Ijp/}^@54T$V.9]bNO@ we!βM'/a[4^ 8n)L`4Fpcϲi* r%ܽL{_=dcߴD5B%;ڷ1в]k-5Soi޲B,k#tZ=ހaB@AVd'.I\\ݻ{R}vS_kG5z̝LC3:EPN$VIއa%XVW<$|dvo7pGIjX!+ FN9%6o*HDۮ$wh0eĞ~~GşܷaC[k'$Ɠm!]b*q."k%Vh*>3ߡoCNj޺-{[Kg]8 E\掽Hq?wBBZ6/PzYBܤ.q:SESar3V,OEy)>ן E,zB塏-=)$]O^|n_ jS%`޲!HQu_1b9tTS柤 ~>/ Y'*;R^BVd 7wE Dۅz]ӡ;ŠG eCzs=W^ymۆ&::ЈOrڡ{mZY|y h^~eFE^zYd ]vgf̙3۷c?MAAMԠjb\mۖ[o7l<@˖ju]vA -[\]vY_1eEL-Zѱ[]yÜܺO&Y,=W4WD$[\U",K{wlDzE8Rҏ̙=ɅREa^_szi?k.\9]v>}B*ѧ}X F\MܐKp߅u[)_=Z(BF41DLt0w66c+>/|Hknǝ=G. \XsY"~5=`m(N{ CFK"KŢ)15}1T.-z!h0G1;Lz8\V/]Em:J Y-Ȓ, ʂEQDCr2`Ȱ&BEasx)4*'e FlC0!aid(ZC&A@d@KĊEyI'w|Dn 1qWYYǍ추%&?+~f^DLG||I[,>z衠]LYF[IXx17pCtiOSU||7oͽ͛ߘ;w.vj6pds\tE5-Z /"?SG 0p@*յkW̙tm۶ɔ)<0S?o;ylc9p\|L2e@B|6 Զ5mL3f cĉ~?ǬY(++cɜz꩜z5Z-/y(l_CJz&{oXSQ2Ǿ䖞CKއ--zO4InbN}wkzzŴlwd0m.nS͎,UEtL,@d~w9x dW^Ջ;Ζ-[Xt)k֬aTTTPUU rZ<tؑ0[v-wy'eee   l%f3Ǐt2Ob^Oyާ G0'yyظvUmK { :r,ϙ2F|Tq5װdtY*+70#OgTFrhIXH>֒ 8wnD%;6K"`@ş)#a("{D|>WUF{Oܳ%(Ss⇫>ɗݎmRɇeuhZbi֪Q;0tɬVَۣaʥ|?S^¼|^o`00p@`b(vb߼y׋ԛdGX,2 ֭wq>3^~6/r,FQ~q6\p5h\d]֗r_pUu @bW]KjZQtwDhе{ѼYrA֭ӦM[n>fBBBPu_r9 @-[0Lx<M.2;vફ⪫駟&-l6ӯ_?,x^))) 0qDzpw}v~a"##ٽ{7~; ^ ^; X4MPvٲe :VGFFꫯRTTO?r%|1ML:~YԠ6`n[^HԗdTL{~c~Sb(GoLq#"g}.=3?v<~ؗDEr+|8&j4r A_o1- O>$~)փFC˖-y駹+…bpe1~uTM&^o13ロn%K[o w[z5 N qx'<ݻwsŗe&&|½)>`oW_=S??)"Zw&Who$c߶vA'j{oM;n׬UFrNvÆLQ>}uz (q?Cƶi%_A1Hd>T ڝA'n|Vuw)<6!cfkĈx<ֿ#"}f‡HIk\B.LEyI1w_;+5Z)#hu`Dhՠ] huvz5ZdOI>ʲShۘ;xݝ^Vj}X3Vg|>V.oL`߫d.#"F:7|6mڠ( :ǿHUu[#"]df3==X@sN֬YS '"I)i n~17OP4S$9;+stz:@'jx:Ϯ2dErCK`Ȋ̈fmtMNB~ |n=#||} -轤$MÛt|0(DK) >~T+.S2arssYgń ԩɓ{pQjx<bcc袋o $''SPPGGG[oquׅݻwӿ˃[.jf̘ooj L g_QaNnsclߴ(=?} ߏ?= -ȸ9YVr/dVXn!2˖-k%;;;8:9m3K8ZiN۬+{ogY IAܡi7<eBJoYQ펂 OA@TSeEADN?l1S>rfLĕ'rFCACyHl(aظf%7mS(j} f,Z}k||L6-#2J~X0Ǘ7Hhт ТEm.\]wŖ-[dR}/GSd?~> \2eFt>7ofhDEЩ{/s>g ;7ܟafbSvnوRܺ}'κm\)׎DAEv9@?A 95^s'7{oAt^{?fuJJ gI_t-5)6x<[$ h{'o<1/dB0z=7HudbwΙ;gO@qU5(::^o1=٩I۷7p%|^:SNeĉt(ɲ̶m۸Zm%A>^Yq#+ "$E+rNGq Xǯ!J]v宻:"O={Ҽyz߷X,TTT4ݺucټn:^eswp7SXx7n۶m 8^禛n"**իWsM7Ҷm۠^j\ve< f5oj뮻HHHzt`ۚ(C+߾ \\O=T@KD!dox; \?tfEʞNu`ᘉ[U|b>?.Koa4u8 dbAE$ LsSxsFuSnjOCS+avܺӮ [xxk'Idϴ'g1XֽNY|U n'?~Lbٵۢc8N4ǢZ脎C NYQSUCE${nD#{<;}:>(]t}SL!&&F#.))Ce?p;n:Vntq,\0fMJJb->l,mzuOe;#cO.vlI8k#nLmM9KvZv ZZO7,w;ɫ ۞Бwh,Key=a6+HM?ݻ 餮.5f .SrI'xxO  3Z?[Y938p`ϛ$IviL>}fp8"D9餓®IQ}IJN5n2.x$w$ ^_bw7n {m̚538C/Pz7xvfS(**o/XS0cPMPʲR#S︁<u+u_$a!w_һ$%C_10[,ac$I$sʧsx虗tyȠ#yϸ[]5 _n{ΧwWgP|j뗆xB@2`a<ȓ$vInswq LZ^{y >4Sڝ $nY_r܉ T;—ĝ@T @=xygmH$JA^.}_{v"27o๩|+ ̤#ϾxUșu]L0'xuu5ӦMC.uFJJJѠ( +V'w}7^{-O=_}lDbcc{?~lގ:!A,mO9[7(5L8{1c IC3NzO t:1c&L`ܸq\wu 2o͛7*L:M8 bVP4yٺuznnV, Æ cxI"/EaK r2-7ð؍6 Ro}M4Gh2cǒ_Yz>kFnn.^{-<\s!㟔3<νKQq.xS(tIQ4<|g?g̙_3Vsw٭;lާF=@1n/O=ł_Ei rMX):k^ -k Ն\]}J۩))QWl } qߓwv_Ey~ڃd2qQGZܵT#}?!I #, zo⢋.4(,,Xٳ mXO:qǞQ'LWb;C{³l/iiiy̙3.,bMaرi,Y_Uϰa6l49NV\qqq\uUt`RSS P2uT^CgsWΜj#騧Q*f CqXtC^C0- ݣ#a̢HD&_IJ5ppsa3-A4V-Yh7`~##QR>;fҤIQQQ|{|͜uY\|ŘfΝ;9r$?8*sN"j &Nx6ohO=:QQU^[?gKO2C6>>Mٳg \s5㏼+L0sV]M53gM#Vܲ^a3Gѓ7S̝ͮ-l6h222 5|:o=?J w"0sL.2P;_UUEz A XVO<ŋFcdMX`7|s|U[Sò_ṩsG2.3Ǎף'th_eۦ_3{|mѼl6s]wb ɬ  .}Ȑ!yddd*Nonݺ! I 7oׯQQrxO :4"*(J`@ҳgO.RfϞիg=X{d ,qzhj'tEc+8lf֬Y\s5,\P?LL 7|3#Gd,駟SWWȑ#7m6zѣ׿EUUÆ %{8QWW(^{lipm*"--!CgzYd!u8Ң $&&bZuKO|8w#F >>p-~iӦvZC)  :wy{t4?=s&Z3uZ|2;kn=+HYqx6frwe*Znkfexy?~AFܻwo>#n6͛R:c:u*& I,^z@"8"NeCW \?zp:<PsIIl pN@ AXs[+Z/JvmhwgڵyuJku㺈-Off~)A ...9i rX[jeьh՟DRR!p8}\ـia i (2qD~wiutP9y~AN8ロ+Vp]w\{9}Y9$)SĭJNN~~kbbbxdYY7|[ ,\P6*۷ok;mƸq.u5Wܐ ns9uV|!={i[֭fG!D' @|Ӽ0,\qvabcc ?ҥKO(--5Nff&[n ذ.9spˆ,fon溻N"v mz~KeBT1A Xvv6{n'~8v#˲MonVXiXhQDϩ }Yzi)[iFUE9:K+oui?@+!KEaoA8q3baDEUU~g 2o_O?E޽yyge9Pm& c=M]6&4浫yJZa7I"bmuWkJdU ٕM3cJz7ιv/ݰr9jgaرQ4hQrmroODEEرcGgOƏo~~X'@KsK.aewut0h|h^Z cbb8餓?~<{!P>M6){1`>t:;Yt$X4MOS 8ΰ,-ܢ/:묰=??#1e2z4ls,]0:'a'#8jڵkKXfMcl6N8^{5/^̷~M7Du,=\=y4p>sXhxu]h Bxظz\s1^|Wؿ/h']N֯\<%NsOf'ټv.#b🚚\{|>~i>|>Oǎ[ȑ#ؑУG&5^Huu5EEq|ٓ?M!ZյӧO6c_'Jp Ncgζf%QQQ;?9spqaff&r>xq1k,l |>:=?fz~۶m۷733gy=:gϞa:^~*33 &YQV-]^GW2]!@lڴ?~㉢HJJ |'zq\Ygyۭ233qzMyy97p~aQvGp7G4kv:Y4nY<=Th(’?sוcFqyyGXb5U͖ȈȨQxy7⋱X,ogڴi|w>66%Kr8 ={Xp!^Eqeqg2k,?9×_~'oOz'zhzBדTu+qFhYۉFtHU_OMUx155 L>laLOJGu[|¦׿e GENFu1l!}ŏϫȼy% (tֱh]z7QESyzJCZLF]NŻ*];(BͶmy &7߰h">#&LfΧj>;'''ӧO>YNp[f7_4[oX8xW?>sNDK/ ,fϞݬzlĈ 40nOΫ7kk׮ k'G]EԌ/@s R/ Ѐ-5lnʲ"JĩM}oĎ-8#Hccc[|?fEQ`b/ MQuDZPzq8I #G w4; ֲz∿ Ջ~_/z~@M5~xoZZ~S'l`okjjXxqwHLL4 >ATTsiݻ!4 ]N[Zʶ <L4Gk O_K6.n^o}4b3t P45L/*k+ɾ卭# zEjS+w;;l{lllB`ۍtM(EQX|yݖ#INv47;O [@jFA^.NGD'\f,X[oĽw9l2k֬G}4?A 5\u](XV4MrXJ? >sΝ˙giPfرafUU^ ={u|} /n߿?< y䑺+>G[o4eee<?'I,cwbZ.}]/AD=܈DV\\=?0)))}n6K2d۶m!I6^x9׿&nݺq3w\Mf p:\yt9r~n;/>C :$д Amѣӷʕ+n64 UUZ Atd˲Lmug#>n'[;Ux e^UXQ'h+>EjeѵGx Ǿd0@Hț|A0ԴENvv67ogkk Pv=Aw|n/TTTpbU$Я_rb1. =eC壏>"++M; ];4McݺuMhχL&'Ofԩ"-)) APUuoX;v,'NK.-saCNNNEGG">>y۶k.bE$y3,YbX׏Sꫯ2dHI&`EN?t; sӥKfIUU)-Û3dI#o;щ};キQ35I̖Q `NNߌzԯY#&:38GEEqw0zh8پ};3f`ڵb&8у'L&s=,Xz7Klڴ];1+-QVLVVVXlر|GPUy<5 :$V4M ,X^/[n%77YHII1yfros m.Eh Iy)/9tR ~YQVտ}ô5~V*&QgQQ0j)] ;y *KskXA1HΞr>)w4X:fw8RSS` #1VUU /Wߌ?'c.F >bO=r }2&^'! I袋m zfWVVƪȥ J^0$$$0eC[@@' 4MkY[KX,aUU5 Czz3J]Mu {t UUYo~lZ2|>ʉ'Zyw2ea/2k֬/?4Gvo}S~ӧ7p%#DQ/O>hI&oǂ(܊,`=rCj׉ ˌG#?wa dff2 1Y Is%܊s4MeС 6ĉf<|(i9{|\yt֍x ƴiXt)ӦMc{U3/AH9 j28p =ɍY<wD$3g111lޯֈAS;"?o^>nߧr&^=|N/~; ^D{JAKyyGy7xWT@ArY4nݺ ܛZ뫮* esH'.|^/\s1;DTYZm6nV.f믿?\ pOnC/I&MK.ѷedd0}t4|̚5M6qW2c bxj#AE=\^x`4,0e?YӉ_|Ÿ7j(2~xf͚Ŷm:iX3H8ڥ?H&38V'RRRXh555$''c6^JNNO>O?~{ ~h4KJ!W/DUFs gq/?iI&{VUٳy뭷(--%??z͛7!IR»M$7SS3{ƍIIUU*:0sI}^|$>8Ft#%N7{,vq۰#X{ "X` @ZT47KqpUUmUd^۲*_$Μt! `j"6mמ j n4ppws뭷( ] ]kGe\x%lݴE ҥ>=:]*J'?gv؞l5=zM4V\٪$1a>&MχWsΡW^lڴI'Z`}e(Z+lQѽk:(-ngMiq3 0d0&MWfqwFN`<a`'O6tXd 3gl6s5O?gEwo8쳹!y5jT ZQ5rNx[h,yf6mh|Qn,FSULxr g dž ͆$IH(>hN96+KKK)X;XvbZT.M7ݤ+,5Mc&0-z! k @ VhZ\MM ۷ogȑ"!߽{7~xx- ZVV㡮. ;@E+,,dݺuF+66xC Xw {V\I,{oHGOQ V`TJWn: r0"d خY|+ O`Ԁ-ĶE|_䅹$e!Ѧky~%.~O۷/_=ap5L25 Wp8xט={6g}6>Gq@#&&F6Ex%`ǎYbsrغm;Օ(^/,-HFAgsmST߂2vىvu7m3fArV3|pvܩ=7[k7̙38ϟ=//@IwB}c&߅ t\\':(V1;Kt҅3fƇ~kϾ$./ /̙3ΨiJ+{G5h{Hc}d"cAI9=tDptJ7֔en'k+J8kf B4ǹ#lLq~!hxkw͖-[Æ w8\nJK@Uf½3B@ݱ~)lj J;blln!2={K/۔qdoU|A߾}[ҹp.]Cy >? tH@TIB EUX: ( K,# RPP@aa!ŔSWWG]]N<}͛7s#NT=i |-H5h~C߼)zd "l :ǧ`VFj{¯*,-]3<;xcjZSJf+#ι>G^CLaDH̲ر}جY8ꨣ8Su-;`- S|HNuֱ~zfΜItt4)))$$$ll6ʗw,X,, $&&ҵkWILLl6c20x^),,M6&dR>YA}Q ;ptuA0`6-Lj^S~DO'Z1rHV>y<֮]Yg%7خqΙO,77t:ȲVSc&2>>>ls\UqqqF7M${%u"& A0hd*ŊdbDa!:)4bSz[lņ-&b#* f۾+2:~pV+^WE P>,ƜܕؾCq̯ʔ)S5k^IQ1b/".KW ?O?tPEKKSL4xݻwSUU[oUW]ᡇ2(U%\;N Fkff&]w hѢH0wI'!2u~CSTLf3w\m%4 Q 푣\boKz$9b:,5ז次p;I=MmWC$L[D@[ H 9W_Ï?!@i @+ykQ]UŜ9s?}[$c1N]d2#5,i{O|"bX-Y?Pu7KN<1 {*/【2~9yndxvMyy9s 7er} w=˞W~ou˚xx<͑crao aQQT5c(Ad_ ZX&u $s&BPjr>AZeHOOS+y5ԗ$yi*~ @ kKLٸ(!,&3V{&kDDɌd**2BC]h2%ņ-&[\RzܝH'މ8/?`E]DeU_ER]_CT!spujl$i߹馛z: ^/_βe8fqUW裏i.w$qS\\̳>k0.Y_g97;GYe$Iwydee*cݸSk5[0i6#:JJK lrM|WVJuvqyh]v -6DBfjaCa!bUU6,Pz~ h\]4 pBa!#!}2  ${|S rRl*@.Ux\Q2_Toͫ"r3Xl2ud2ǃN K@ME@Ɲө߾lZ:= }=RA@D=t$>) jMi+ڵ۶|zvo#}>v'M']i ֭[%AM4Ubbb"]te*wOvö|\lq-7#PUN _(&bOH!k) = Zq;QY\ Ѵc #pWxeyk~xwe3|yzviwdTUb( ݺuӟ?_~.)S磠UV1f, =6moT%/nRaHDpePRRڵkuc97DqԂ ѣGD׶@hVՐ|XQQ# \[a6[ =?BUdvQܡ:$ ;6& ~?v_d=7'aN}aD%=):y_Ph 5M ذLo٣u㩯Юʸ voCS4 u%IݷhsU_k[Vlsa֓mt3@YU0zrh9@bpħi a2dc͆b EQ'99.]AP\4EA'אpT9տ~g_ڐlv,زc5Kj7<Qшfk PU N'>Gzlz)dBI]lgPnB`aihj bTJ d7M@=5:SP"}^pBjkk#&]ڊJaa!>_~1c1f.a]_y+5z9R/M[n HqČ8Rch(Q9r~%. P] $h"`<h~/He{+73f4ii Fe\5eEtH 65[LA.(n-抢p' E(㴆 Jf3dVRL<5 )6SLCLH1q5KF (@MX}%''߯ ˾#o H˜M1+^08OwlfTJ0k[Vh 0(132Zv4MG32+5`sU9k+IƜyu;^ll2u޽;111iׯGUU7Dž\_g)H6q kQ{9k*:#I(TT7P~/r} iLfDDD phEQ1c.$( ~׋FUU^/(Gp8]aߕ66(;4ȚD"#Y%3T>hz9.ZPU on#Ν;WT{7M(**" )**"//;waÆ0@nW^+1-!/K^:щ_3Pj٘2e1_ǒҘtsFSLf3Ǐ߯ܶ^ծTAO*KJw]ҩ] ׃WF4崴4H]ij(^Ag5rM- =5M;ZHnҠ2t({ `mvLqRblшDj >fNCrA*Ý-Si̛?EQt[ۢNKعΞ QPUMَvϻtB]{3d,pNX,aYi!35^*J# "'͢| rR;_Q(wn߀ pҭ/)쏸 IHMMD?ƍKB>Tw)>%3W݄c_^\_&M w xTkMT )&sB2R|LqXRȹnT/-[h >-5,..6ds ~Ϻ3!P_+fOyɌ|ƴNaۜ5 vIJJ2t8È dkf (aI:Pdk6))){/^ S\BC_Q\W @\lGydA@7_Y$"t==t قğ~c 7Ȫ(\*w˼_Pe9^:( sy  4ȐA7L2555yl&m-Xeץ{K P=.4ϮmU"y,Eu2 \񞜜(*|~z J6J5=9,|n|p)=73cmv~ܺ $޾coyp-oŘnEESLhgd㫝[{HaCʝo[fF4Q]r5`6lؠ[I#rX -#HMM 3n8222޽;$%%aucMIuu5555TVVxp\늢'EQ馛|BQkk"UU5b]̰al۶ 0όIBQE֒&\եԖ$>$ʢwڕg}I&XſロKRߐWT1&W^}SN9e%ˡcaڵh(,\]߫Wo}YYYIII_~wm=-׍Gj-Y]U4̓"#<U*dd"*6tLAIR Յ9ԕ/GyNjmڴݻwF碽P@mPTKVkIkjjDF֠49Oll,Vʍ3l u*ߞ갟>I]ps1l`$YQP]o TGy 4g@Q dJ ,+@ ߇m^>FiYVM8{~ѓl{bc&nEAȩͫgQXG4yozbdfB >݄]Tx\|NHu@r`Ns&]ۧg4Mko`|rl2F$rM^A2aN9+m0T@]UM!$(-P*WZlGigP*nXD՝@ A v͙zXbvPw 8[ϜRXXh;ܖ.׾ŚqSPPsmmm2=D||ĆR`w &riHPvEE|[nk-a„ |I̞=[ E|8M+Y V^Y˦8yu-//}U %1UVz<֬Ynb 2 н{wY}ٴb[_ OC7Wuu*qז:i(^AoEA:VLo u$Tds5Mf3g}N_$Hэ@{eehmEii).K[DQܧ%c6b!氣 yގYc=U^~!ĿkhՅۨޓCAv͇":(tSEIbbeIKK#--M?V$$D:p`"-HXLIXRgmYh*n\fPT,KKޓC rrQr_?bZ'#| }Ush'}Wߡ:*UBg>!?iuؽF}B4]͔^mW@ԈZI9v,Su1qD n А|M2x[ȸwmk,3\U fPdM:2DԖuo=|r?~<~mD2Jf<8.G8nd2ETL&D1`|]$AX,hXDG DW@+P%AQf SDSCPؙ˞=ƃhZxwȬ">Wx]BBӧOouCk_U"}HIV[o;0tP@V>%Kt2jw8u:)aWY%Ebn **Jo+uuuF'EfSc(~_`WFVh*XϊOGZy@ى֣111-(y r]54 _i!&~°Ad67,:彑Aso?0@={wBoiw66j(=# ]d!@/7C0mvDkD]b苵Go]-a%?PZVxވdF05$( ""|Z7 U2#j ("⻉t@DL&)\QD-wFR&$+ . 쵽wCf '?c_s߿e߶gϞST(cp:dggsauw}_ wn.hϦ6by(܇F͞\v@޽0bI[`$EQB$4M( :{<=eM WfdY `}>n~n=~SM&S]рkEfzԯ^UQxᥗÏ *>h& d m8[982GHtKXLc_W4D^N'^+~ ǸqZ@VQY; zX@A uU5נx(-YgxUUe /R^^ p†9o4.GFL8׷mzPi*e{?@pPG&-tĐ11[ʩ}G0Y4^]Te|8~wk?^Y%b͐>{N#.{Bj+}?@JJ QQQxNvb ,ŗJiQKaI끿_@MӈWހ)ZVY4 a2`!(-jHbщ#wt,!Jhq%IB2Z̆~5k~GAKw)yk[Hj~VP`[h@ f3'O~Jy&x/bM4EhhߪߋG8,iݱv-L&CIJ#5J z, jjX)pԶvK h(*RNk\5$PVVwqGDhs/֬Y؎ Q>><:h @UU֭[y(, DAM'ڀ ݻWQ”ظnBTDr}8f  v1 %xāi/~L&CףФDp[pߦI@ca -EE|PD%"-dYt69j\nŋfϞ=ñj&sNcĈ-RD}R;i*M~ȵ[Unr0qڑˮXj m.(rvQ5wF0@AC{Q^WP-8ڧ lڰӯ(߾zm5lY8#9;k_m f[4x\pPk'b&d2!Rv|J&666緆(h~o44?["]Z$l!}v4M{aN\=vp2 : lҖд9xMV{;djg8)))E[nHLL3ߏ-=n~ij{rU)rTE13 Ŋ` %bOœǞ7++S!cm-[U DjBUedT3g!<@hZ߸W>gϦcDQd͚f;SyMŽc31#'P۷|WwϿ;߲,}/ `؉wmQk21j({]E]Ϊϋ-Vy;{vxC[7MLy.[l!WG%,8DB`& |+:J@Cپo -P^v]t|/OC%Ćl^(TUvs=x ,b6%--Mϒ.g  H&]y/udX8L]q،c2 ХKzffC4A {k*&s/eHfKXۇI^\.JKKINNַvUTFeBQ\b謣z\+KÓϮmʋPu^ޒ3 AS*-D4zПQi͒'k+:k¶1`:$Ix|J8QNr> ,hW{ziUUUx<URd>(sb0-3EQ/73X,, fsTb覜 6PnRҩP8j v;G555,Ն)!rV.Gu;c7Wu)}*:, -aXEQ _knݺ)&1I? 90Zcf}v\8j}&3ο~G]Rf>C'-ӈOEr25kL&KYUvlܦ? R$azu=5[AK(-f3,dAGc Y)>i?väVaMA; Ϟ BًX[[(45J^%I[Bjj,~JKK2ΰW^(,ŊRk86\]FS~@"R3(K$h&{)٧F~i{GPs˜1c\9I8 kg|>k׮DEES% S_ոML,]~O2z0m61l6v;QQQzkj |>3A0>RwMf[C"WHM7)BdR:0tdtX 0`lҪ i۷o7򂀵{oH$i$=x'A? ]aeKp!_qX^8uo+g! A h!XSW5Gj~wqc@[p hfL$pVF\$7WVdeehf(;wSZZjPδ- MDGG+BC^CQE8!RRR静*n<^_ Q̘ؑQuL}hiw{+}>_9N9u;n0ݰa񾌎Փ4ϋjo' Pe?JgLVAQNRR~J<OD67laIz@3r]u<\fժ˻9޵kz*9belj7vWZ0l0LNpf͚ KZ(-l "ܰH !BKK=z )w;q~~?>UAD*¯$s9`v?HKKk׮vRD>CY˗  7!BsMUF΄(DLL 7oO4xE頬y:=!..ueŊE_D?[ r}Ց|YAP& 8?(=CuuMX7(tKRڡKEd2ѳgO?xN>dA^`ʕm^\1U;fz\9eЭ; AX$`ojkkuW3(nY|_C1 vQeC!"VՐ?"㮋pז\5+ɯ!QdTMCmZ3^7gR~ i.YC >#9șP#1U#Ȫ>CEcUA=DaYR#ZmA~o}LȲl zg @>Cl \.a2PUX, 6 EQt t"==hgYo"v>\|e)Z-1stDEHʕ+9s#d2RPc5M:,) W$sՅ%2A0ZA`РA,]Q-vč=׆e,YI& ɽlr4#6Klb:I㎂dPRRAj^!XRD>IKS755$^/EQ/X$%.'[lLpy*:VZP`Pw@%voXآN=;2e 3i$0 W0(e ?MT!g2 <&Vm޼v;cǎ5xJJJ춦]S'7.5mdYYϪV vm[Y^g ~],f>h|)YOrMr!cdƒvsGpk/өUUU2:dBle;*gsi999䴰wPoѿ^z%Əo%,x0є0F(ӧ\2>:==ݐ =FG%"zJi^8hbwa!n;mm[0o<~'DQ4Y, 4`L4*hN#Bql\}>$#GS]^/XKdDk9H?lFE"5Um_r*ܰ_6lyc}vdYoXƍoȲx<3+6oie?ts֚KӥoQ,Bl6L&)tQqno5kbBvkVPlhMU(ܸ_>ϞMJ 1XD (g`Ę-Ep+2jGVUrG{]ްҜs*G]>YSW񳖖uh ATrr2yt҅nݺ1jԨR$\n64-B|h&M'Tņٶ^[}ĊOh[#/^CuwFB1c BnݨSN #l(TQ:l4ED(uc؃ ^%IRMJJ2rC.HJKٹkCCiNSW\.]#IR^(A4j5۟fecekk$$$0f%%%}!6,]Ž#Zu̾xhpTWtpMc/"htڕ_|1̍7HUU~>}pI'q)D\?/~[e~6,nӵ`꓉(x^p_ [Sq(eaFXd'g-^+>}K^ 4CQ$EFD%+64{ V&A֐( PP޲摠i.'l"bilO'(@Wsjw rvك]Q }=lQQ2y×Wb~^Օ'w6rnaצ0!R.ͷ%N MU:c![VV LQ"İ8^$I-&s\խOVG / nZGq?ٳgmWm۶j*6nڵk),,nhcEE$/6uIVU" ǒ5Z_xPstLۂMiTUU!rYD@G-MeV8y`:`E-6RBbj%j#b Qdē=Pgqq>?PçȺ*@T* 2k{ :}ܪg%;y(߹qBdggXV5Ity$I엦@ PNʿ~ `զ6zwh"TN@ (ٶsk ^CuC@3n'668Xhͼy5ŪRJ(]> 9jҭ[7öyeYF𺠃k"d$*ټO@nn.r3^{-3fз[V3L!c__h({VŊji$U+x}~<^/>_FQU2~ͥAry Ud!!MM /? :t|ԕP}UdSN1(n,Gth1ʎh{vlSӨ+ͧ3F*Wu)zcOzA8묳kZ]/x;w.o֭Lo n-hZ{ISUu2GAAA l30)T$b\]ox<ՑQq6dy_?eهQ[עX%iF%3*+Sj1_@8ƹYYTy[ɮ)r/jʘ-N~U[JeG{oxl:zrgsa5N0< , זUklsQʑI ̇oghGR3ZtޝIϞ=ڵ+l6[%ء%GGGcXt`ꩧ2w\~?_~%iii4M~;Xb¶9ꈎ橧$Ā ԰@(EKBźue|C#^gx9ԯ\+w3 U sRpޏܰM@5,Z6GGd WWDsϟdtD]/fM1y晆6m(JUhڑZ Yq <׫;W<ٓSEe.\_V\I}}Mx&!oH{KiI&336iZSꩪJUUUb 4-`:>W=K?l1' & SqFf?OJԟTG̜ҳ/GdN~_JV^=΃btⅭ>nɶ{FJ04McΝ|L2DWSk!Qu b`l#͙*rqnsg 0vx̟?Yپ}; ⎔i6#H8.)B}}=+V~Xl 8I2߿9L(A4S&i "cmB KjzcWJ͢9r6נz\h hhP*h( ~I &ꤛN܋RX4 KZ,ݱeGe*PW…HDr'<4Uaݷ݇8Zn ..,T ѷ &3Br%):^R|(V큖Jܵx0t:^K1X,\qex ~PQ$u) ǞnZhQyy9;w ܣMf&ʙYwljw>݄A4jjjuJ gom)gfQȦ4krtz&i5[w({,سS'L\,y=1,rJ(~7%W@"**`G.]EEQp\m|>n[og}9? Jd:,4^S`to6ES_vuА6l;DT|rXvWD.ROnzn7bdYoe׮]XV ?HRSv6R\x/pCNN=\Xy vXkJ4ג`#ب*r!g&Q1a]l-QUӉ 2zA -V<#OEFWMJm>C $- lAL&浆f h*?|DEd=F CǠ9c䎊?llxP{|.LeӦMl۶>+=-gԆJ1oz(ݯ֬@ypV#ž=t(Q@H$> x".eYfL:-[IV($}g^r`PYY:P5V\.rss +HpLٷPWl"]11Ks\|̙b0)~/C2,֗אz^W̄ &d}FϘxu Y1 }]$PӨ+͂ninX?8{EjeȐ!Oӧwqݺu#99hC,%rQSSCii)lݺ׳e k\ףJՑQz1Us?k`2ӧObaQ(Y3-H5(۠o4~s꽊-(fcܸq\|Ō7.7m-Bee%`ZQEwߖ$ HaJHFPBqUO?eڵa~tt4j 2p(D沮"b!JMڤ "PN7񋔕"?Mqͫ[ ; A2<ͮ1ljKΒ?"1D 90gӝ;wc֭A2ߏ` LJCɳ=Y"ApT!?:/s!{ͶmEe}^3f3PYYX[i*rmJ]5h{B? Ą1oMdZ( 8 7ru0 EJ.UcpD$Vne, ^%;y5^k( LHʁ#NHVĕGb5xm@M|zx+g>1 r}Vb69묳fa)**bڵvv;UUU|>l6]veLJ0?(-((`ʕZ;vХKƏƍ3f O=yyyM~[d7G-%Gq6:[eo@DDo\i"*^ǿ+e7 $Ǯ]PU5lAгN#/ݬx]i>s_loLя"#@.7zs6j*l-F{s'B6ă><͛Y`K,a۶m?4 łl{1GyYi{$@BBÇ窫bMd;  +{m_>} %RgoDP^0de)jKv'%%MdC n`РA7==/UU/;GLL wq/YBl#q6;R[]Dv챚k&" (2ށDB>XbpT4McϞM4# ~ IS1#bs7hI-#GxNAU #:"T!px<m~|e4-0jl2Ӝfpw#y"iB_3:wEAn_1(t8Ŗ-[Yxq, bIN򙗐x}HL|4 qn]iב~tR US(n-!!a͝pPPP`m6fl%a%4 &,5^lgU ??s5kD-V.?aGYǂ@+U݇p$iawVo4ŋӧOt lذy3x`bعs'UUU?,#..bbbHKKl6c™RM[R0;R; -E,N(TUC|| f qu*gU1Ѿ袋6mZe rl6O8fŊrF8)2J}xp} "bSM&%0^zu1@GCVSf'SDkT[ZZ:[QB( sJ bI kLGϡ(+&-&KT|qo$ʁR^{ z, 6͠; $ !40'稃@g~xRN< Сp460WMŻ6"6al6t‚ ;ظqch0 .-6LL$s%K/h"ޘ K1jFOAy)y)\[jqh$4 4EAnYٿ5:8 gHЇyۉk\<.y/1Ocسw$qqVQMS_ӯi߆HRc( 빂dɄd"))޽{sg&:,u,Xȉ$IXVbbbդXP?t$mvL{ 1;4Ep^Ԗ;pHfKg A@MrH"C=D^^SN%.8g%]24ُqEjuKPTahDGGSSS5MSٽ~! ^S~p¬y+PۄXd ӦMcΝdҦJ7V.LNY/6P6b]}cj~M_d EdkGUUUTTTޟϵFa݇IG`)EPe?+?}_? jt{ >(ƧKhjb,FEwY_Y!Eo=\gT=oL&-C','|;E[Sp믓2d_bؓHӚU/`׮m%[9*OYZz ?O?$SU {理$|'AĖїnW?@ܘCL"#@\Ȕ}jL,87?}6}\J?{XfE^'VT*U4lOHش%^~#v>s uH/>cL6 S+gdq=)@fMGR)T?G\9 }^ơ`+Ψaض]"> \39ߍo:L]pQ~΃i\˓Gw>tPՃh֭x[ߊ[o7poߎ\.z;v[ϴm6~XZZÇ}!JGE.irN#8W>p=j2K!zM$0, "8ԁT7WIxK_. G*uh;y͡\P(2νn `Y`&,V" U' $a@ GrEH `hZiG1oQ&?bǎ&1$T8KZ *󘞞ƁAe,Ml,Ugs#GC ,T"w7CYelI)i-5Xc 0 O?~~Hsq|]w݅~SwejƁW 2ַV*Y^hih(E#P OR7 ƚG&Œ k!ns*EX` p |?lviO_x5nS^7808f}6/V$#3G l_Wp׃1|_??Q*pW-oy 򖷄~RR4dpE!J!NjY*cZZ ~ݵɱJ n>k = B(H"j&BEr$Į0w ʀ;&a=t;Bot71]`~ =z";+pzÝ"jVJ\3N: H@4](< >`Ld2} y ;mG !H$x_Omy睨T*m_җ7#}FtCT?5j/ϱF*ڋ%D[v0_,}"_޿]ǖI>Gf[ڸ}f`kسl8Tϭn❙\?61PQc׮]u'c ({U)xq @{lIi:^s[)_ỿK_жvDbY+e/éS'Oʓ'O۾򗿌ÇcnnǏ$Ţ߹,ffؾ};v܉b޽ؾ};m47SSS>P=9xQ݌N> {q.ntti? uẮvj8f9k%v]r8`y=(e Vsp`";O>EE{֖ +K^ G)ؽ{wH TH Hz5!.2T~vu8oVhiulT [nFGGt|G|7Bc6HСCkdmgGfЍɁQg~0N<-KMFmI""2 C-;ԡː}^0#J-U+DogDwlț?GT)y'4YḛFbJ*(M]@H?ƃ@7wkyX,²,|cCEYvW\~Qx1666]ր{Dŗ@Smyۋuz"Rg.npǻގW6lo|71YN ME@]CĶU5=0Vbt%8SX<#"=<`ݎw٫njֱ&U/þ8׿?cMo{?=U4v2dԱY.[gb}t]oZ9  SxT#=]zRMh*t*>q0ʮKF߯ #!{C800ʅSa~_c?4 v149_tjK%"ꎏ㭖1CtAu0)سg<9 n*rw\=za̞ܱ:6h" : 3 T8Q#[ @ L/anEʛ0w"}u\8Gܪ;X)\_ge k4*aM0 TCJB5[&0xñy/|@jWS:NRA8"ƪ!Jl`jտqR3j_*oĮ,}x25L ~]O8ܘɢn3e3x׏(mVgnA$Mo5/Gbׁ573}!%fԟ:Oޏm~?>m)صkNdLͩL&dHEMXq䉐`ә Qp*#xWbgJi7D~ߟ<%i|1WKj:ߎ'Z^Y&^f`kp7&jʬb!!m``i-UzaNtz>Bbu}ăj:] +_cH[Q!h!C FZ:S}_F_6 \s \\;3B朗eQϭgq)TGsNY<V*-D cAValَ^-$;pVn8CTxk2O`ЌDU_JioI Aqc BHHpii 䧰L4k޶[OKMl'M@-ےR Ɂ;~AS/`a4Ï{س'ضmRM$Et)a؍XwN&p v^z Sw1=s|/+UJ(~` ^s /J@m`?Hw>aPUq+ڧ]LrHt:IMB뺱‡*q)a4Kl[e&'pFjݻw7788fBe})=F3Ye1 _.lw)8|?lֲC:a?6aСCuF4%+&_տt)%]M~~N:0w s z\ R$ܢ;Ypʠ B$&vD+CRR|5i@ 'K O}"̓kWH}XU`b#kV?8 Gy>X+oȫog߮4e=ԛAQ>6[ϻ ~_SJGqw? upZYGHnmZzk\u^D[T1~ "~o[~v|W_%L/]na@'0w?Aނe7b襯C+amo _&]O):X9㶅}w*#iǎMG1yD3L~{**g.]<}yĖ-[|UN쀙O^p]a<Ɯ'!ELDd0Hi nvKlFwHZd2B!uaKw;JG&`bbco 㣕,zulDf#˘_ {`n]j;Am`7Ľ&O%INTWCng v\ /M@ɓ'i躎{f111m؊bn]k1[%Iw`]⫛Z%R~}{=^kobe4Q / >oƻnxCT mP ɺj$@#h5zQ̞菴 زdF'PZŖ-((a6q`Ma{__B%e^u3;4L4^u3f> iR+Ѩ*Wk;vÞ'^ĭbo0]\ʭiسgOISVA vU[ϊD-;Ҽڟ--V#$la7*%~ J504 @@(43L&R2hzDAmB[ʃ `V*7ڏ" gysGJ_~q!akׅac9ɏ!~fgX*^###n {΅iX Mxv.q]~X^^eY~*r2 v؁ .`JBzd.mIE]!\48pJuݮj:RcpF}uOHض'Oӟ4/c=qxƔQz D^d26p Nyۯڈ`D s޽ ;g ]-Ŭ Y<|'hfbગa uࢪN Haw {aoYj-y5 m011ӧO*<~.m=SP?l_3^s貺t 2}+pDLSA?׶poἛo:Ց\@ݱ81֝HclmAtZvf7wlsApr8_G3gٳ(/KCXP:JPJwU)Beg9*QĥBat^C7bߵŋ?"{+?fچš960Vz/D'vo'Ru]<3)cnnGww LcܴWvjb6KT7`lBSDZt7* J]OP﷙m݆7x^6DÌvW>~_{{0p1x-Heҹm7v`5oGᙇ1w?}%2̚T @0Yv8xvq⵻. urȚ6 ut)$\04Ds #)ttҺGJq0KXPn'm~?F^LrЇ=jpg}C?H??׽.DXEК]Q!nuȎnGnF³Rg>8oܓnQd,*; P)-V-285^ׂvF~sgTh}6i4M!NSqQ\M7d3QZc7[h\y!H_p%}zOsM?qol"AKu@cmf@?kl0Q9f`OXgtWa͞+m DwU3C]*nR^D#,z@󜙕ض ]7pUWG@G_TEQ+zsׁ[[DӘcH؏_knAj!sH p;w\S*< wfgg |9،]~cͺCCcyӧO#6dF ѭxM0`Wv'8e,[l{CؚO`y8쿴jߤNʶ<Cp0o~ad^+~UT%5Mþ{Ak(,yJ։v\p;?G>Y_%G0:"I 3f__+`pmK,]Wzy?s?.}M Z*^@H'`kܿ"dXB044f'4Mjk5%|u_3M>? ly{6> VVHoJ1qu+܅ҋO-{EDti~H܏׈2CCw>o}nZֺѺYcH_4\pu333~-y޴. 2 la=A3r0(=\96Gf'z޼mr0d&pppr!Kz JAbR֋D[0#H&T1_-`S9###ZD[rvn9r"-5o﫢;gyX?0K_e,98 3Dʙp`/̂UJBx3!4˹0Z [yJ}ৎ.|U LJz5 ThxeiFF"X[T ^ cnn X\\UDbyP: OL{OQ _Bttj+Ai׻]oCp +&tXS0;^V c5UzulBp7#=FG9mƱc0>>-9/>:H9CC?k4Vr~O/ 11 `.ܢQSg{>nx foX "\W/( ZiǗJp%`dd??+y at!3 NV̙3غu+iB4"J^c?.DZոdd:p]\,4Lg9c8ݸ?S_kb&*U>T*xC[1z;Z~`_Ae>h/:vIhn :'@eI6אݲ/?·?X=綅st)_0ېZ[A)d0sa=⑧P><*8BG;6o(~+oBP9{qw nYwsUsޑ@aHHURn>vi8x[ނE|{ުRLmNY0{D$U سw07tS zND-B.X H>ֆ$Ͻ0R]yaoP 2Z1Lh \&҃~ s=믿;&Φ5{RՐؾ~cox)^|߁3=+AX|*oǒ$(y)fܹ8{xdn +v5}WT*8~8.䒆)4 $qbg=0?zn./n\2:DS^ . /,GFaP- 8 *EquV-RN$7}kW%4&FFF1:62_4M_X6i!ggl\}ױtpHcVgF@TLIpW8n1':qXR'~]  @(y3_@)W%I,{HRDHR-ڮt#nK)ŭފm'쫋-oCl?iVؔ/ ]!mpx[A8'$jtPˮ# MAP &ӑ>tUGإω2(;v 0:2N/q2u[wܺ C7?}g=7嫦{r`xxh*R_^bsǎRcၙxi7OvNMjsssX\\X0qivb:E4ѻp$'u[w"-vg0]CXY33D Ѻ4r'j#>#/aC's5;dhЃT1qQR'7!ir9/$/OLAٶǏchhbf\$'xC E\p+MDM1pppϞ flDG)l t!篫1CUX"KRЫp9QRZv~wAK_廾 0<)-!DdeYL&iZQ=8o%dj:r'?IMw]dLjﳄP#D"hfj$4݀f$@f$`$0$Hd 98 L!f&a$!58ֶUiyjeYm0044]v+u][n>NGqogy>4c014*ewEK l:Bh˺"ƶS&pTMWp.ƫS.*t5Q :ËZ cfFOLL@\&S*[wb5o߆G)ž}) 0Bf8j0::p?8@d ?rRSR155]v<8CcxMipk1luPccXM;Buq橻q~2]*u*\PU1[0-on1 GAvph n#b[:FIñ zv:+E8VYLC$mYVql~ٶWhJRh)FT<HAO'00S030S0R$҃F" LLfAL!_A&h:ЌcC3uDryJ0a qUWᦛn(PT9dz> 9"R$Ggmf.fȸP{:m uDp :":ʹGspTV 0/{Z> &#+nαP`̍mG{<7̭;AY` weZ2WZMw|9H'cbeE0`LAycUVV.`'Xlق]vM)  5 tlٲO-9J&icxéS0>>^RU*'%l߇:9tFkƎtBaC<@ˮ+KjDնWM i(:٧])괭J|)}U#@+1_F@dj!"[E-+Bc)М PQf[H9pm N(wZqMw^g"`8žYuje=o{s"u`$ qX* lR^.S #*9884M5-.-rLJh2@dKKKxp=CtC!_]&cM؇~6p&1~TZ^D,?E ?uNAe[:+갯l'fF:,#|҉ñʂ rA$3n{kt BaMrxvp{iZ&T1֍F=@׮GgYk8fp̱5co#Uf2y1X[+<<0==] nKet&.M҆Rb QG;;,y;.~*:U0Af'J {M?ZdSA)u΃i!I+1 cmҞ#\K(~Y5>e]˸MuT6 }LlTT΃PᐄZ#r<>cI:R$I8m\]D9%{o"TMzkTBu%Xjs8u]?"2J_wHf@@𰒁%VD@=A3BL 3B5/Āf&ᔋ(.``|&HeI,Y.^ FCDW 98BqZsׁ={HN !&+$'V5Ewhd 3h͞ V~Jԉh_& ZR`-bǎ8~;wۺ7o߃o> ۜ>}۶mC:N۳mu[c:|OBF)^mjlKeM{FGr.D0q^XCDZ"J1P.n!/"! ̉=sdž=7 f[`"clGPMEFfLӄi>.l^3WKIUB`MNimڤ C6ib;Mt0LnuO25_KdMZs/?'u}?i~}A oK #@!^X/3HӾCTjl1nbͱus,o]X?M(mgk•ʿCWB%Sr -ہф^+FRd@-?c,1 46> T3&43 L A"3DvQ$2H maTnz %ΰu$Raf@`͜ uFCwqஃR%fG U\.19[<,ήi~gQ9sjܹsMj={ JɓX^^ ]75ߠ?zexdn Q.q \tEmjS79sDWODbKq*^s*%Ĩ߼}n?rV-Wm[F7V0*IE4LLLm,//\. CoG#SSSرc/x9lu?8+̂kwlqMBB3X(0{)|ٟ,p=A29yMGwȡ Td"&@ ̜oRm/rBPT)!qu}q#tGֵύ ( :".-éԙY,M)uc̪9 !.LjmH\ .F5AEո LKKKq)q kh ~yJq, #<;\{[g Db|CU-xe``ZF!ǚPJ€Rڰ%Z!88AFGdW(*ƥU[ o|o% A6KiM|rYSEB{d2 0⣿4@uJD sö,S%;\*kӹ F}:} s1i5R2-gAHR ؕq8aNE팹͜lٴ:ibALm\O ӄM= zn08瘞FX87r|ʔh 9n4M/Eq~%P`Ec 3\ "xnr{^lQ}l^x qlr{u׉h v_C!3JdUYmln[kG0&JY^xDl+Hۄ /37,U#PL%֊=>Sr5 oesPh=DmRd֠&ښoҴk~2cHf7N3`VO1Pޏ70~,ιܑ^56 -2 ˲jRA2D*BRARg]~5;{gS'ɓ'144섽C8hޚË 8[,֙UQ;0#o 28 `{g>y*10WIehqǘrQg8 (Z2-SQ81Շ $5] ~<$R ɴ( ۦ2^ z 2M@ׁRR O<tfU7| (H#FĩSqi1iMLT8Nt2QYZh*!*Kg~}t7Iea%gD4bZK=T*;!-Fq(ԧ6JX=ލ@Y. ?cA.ޯUg4ك`jնiUo7a`pcT| 2Ij^{۟ƞcyY Tӿ *%̲*pLKZRH1TJ7Zs,~?"/wM"D oQ!-5D x.}#[T 43dvWHlW gN=,̀/NKs@n^c5T~/ ͠\.F?k&AaSM M^x5]\90??_[v[w=ӧ`GFflKe1`$|KymG3G?J 6 䝿L ŕ+'  i;kt=M g9As=xo%DV#ZK.ӽ {ZuQU 7;̜s̝9LjpO|6k?~ﵥDo9̩s+ m{ou #tn[*VgU_340 \2Q 70s{_<| xg1x4vޅ[J4 3LbSԨjǁeY-A)ֳNtJIbqͫ Zk:`bXפ6F ]&68V(&)@.5EA X`~XA si[2 isuhYTfl@`}l{ ^jSh^5D kтBOR|#Zkj %ě+sB xe (s"P|0d@4.FT4OA#G1H$sN*02 %J׍"qu8ΆDQ&a>}1<>3e!1=OѣG /mAcZuF׽H",&zϒcٳ# :t EUPc9 e[_ Rdƀ]k!S?>:F "0 }}#\w\}NaOI,\c-f ,QBp_Nz2XLS JrmnX>*vU{#$x,v7i oX7K)2 caot%^IrQROĶ^M4tPpV!~{UF"e`oId 6E0߄Q{dzF n(]t젞q":AckQ@X!֯#BDo AT4ľ)I:~Kݷ,FDY[EH!@=Wgew4^X\. -۱cF3ؕ\7ƣs#:'r\1{ Pg.} H!wb.$Nl\Pۑzv% 'gu/@nϛ)̠pGNRd 7},©g Y׾ PM. ^AJcǎavvs,--رcb};l /2< z6X%o?ġ]Y.;3scXH{ϝ(?G(G @ d|U(eXU`VGW- ҆bu]D37Z(Yj9*B:>sKAz{ob2V/JT 1gΜ\xBGrɺ5rs&bW0`4.w/Ǟoy'q_\X%gP 7Ŧw$ҡVq LMGū @?}O&¶~-x= d遈jUb\8QKskѻoW=dʪURhx9$&-7d{]IKDdS97 \Xccmo~:pLr9";Dus;XwCp Cwǂu;~,Gk%-3-huSR he5S;% zT'_.UM%|!op~! xq,7_Rf~6;A-u|"Dv_"$5 1 `ZR/3?j &IJO4D20=pqbfbѿJ~IreY(K6P%*̮Iܲc_ӟ# J]iJӘ/ D n]7I]kFmM$qb0ʴ>h4hĄSZ}}4JB%3!z%~'80?)2 `` U;U78A pk;OC!Bmvx*Rڥ/!@*"җ*$3 /}.Ȓa.]W.k߹# ١P.^|䮾mһȊAlM,nJ=$j* erʂuy|C$ȒjQ)z˲?W:weH2'T8W9&b?zҩM6sՓ/TE ;+%h槼p8+LdtPD{LRB5vĻ]/{wL$+@~g΂Ҟ v}vl RD$G@`pM? NrZ]ŬN|•jF 4J)Pp0Pp̌ pMv B-QpM /Rӽ0N_<~'p ar/`c) _AF7vA:߭e/x125GtnxOJ]5'@SHD'* ԁsVSwO©|wdkŞZ  P\56:U q!ܶF(2s peOY4 8}Ǻ@/>.IsuA6D #A\ }٣BBj('BifiLTVؗk#G]t2V*@5gB8sa{nēA UwC2: My;OdJ _35Y@S0=+v8f ]٣O0 kɹLW0q6+&ZDRӡ)9p`p%m,t 8.D I`{k'%0A ^*GQ{uBkvZ}Tv|NK5)=]7DjL]STFZPfٱr$s,|}VLVo+ ϟ3yOnM( ivT(SkS7ŠT(ʢo$<W.>׾ZPc"͹^xst)\קNW(g Y3[~Bd,VI؍Iݮغ hyfzKs_Ħ}$3 ׽,"/xJmg'ӢPv jd4Щ8^ Qu:$p$i4pIw-McROWPt{eN pkIg .G /RQu uCp"DsgNsζ^Er*6p0.jhA'ʱU%xi0 9~gֺ}ᴖv(auukΧqu5~)r]%*("TH/>$:RPȍ(nVi^$V}D"JdjJ Q0a"

b+G(EٷmVG)NPq" Ve,U3B,7 .W^й(?qk5c>Xsg@ ɏZnC۸Ur IшPWyYv$ fG20 e(?=wD;jIdjR[qcIotV}wu^^7o[Gؘpٍ4k)1A^ s%z{o_S<' `-dK:1-o>5%ƱȽ#]6zVYr+o@)j}r#T-ZnfߥVK:~֔,^F`qxp| qpOOZ.stLqr8]apKq$9/TJnXhsKsXűdld'AjBMp\~3wtRwNI@Z7Koɕe<>yc?o]2ܸm} J.C#cz98PemMgS*yLaͤl)QJ{fH "GkƈȴMu?̺O qqr5#6d%a6ՙUϵ?Gg/}@ft-DntGUѮUiVůM$}G5)?Y>QHYǑє樁:lcёCH"(vkb,q]jRjH5k}jw}[gZ;ԃA){[ai|FL-wm( ,ߑR/ji PeaYGt ݏ#ٍ+ C87`W.O{Hop!/cjrUk[ ~1&ŅE5y \<2߸fwR9;W. n{&<4iU@0pxvDi*p"mF)$4ɨ[vl UÌ S7\ZI~x$Ii1;ZcHgP:7ƮH]?,KZ•%Z+%'ܯ aGՋun œj5ʈDdKn-f+r~)XtьIhm yxzhhy-dE. ˱!QgydWl|Or5B*P7㈹>: <~Y]"dٰs!'<"!W~&K)Jy|n(d/x}"5d!y!rnPEᝓ'Sgqxz핃2OY2 H׭yσR~wx[B6Э!+"rRt`ۈCUµr0ur2Ncrг* PH܏k(pA0I̵b4@* J5{I]2oEdp@@дt#.ķ8DR /'~Rr钌1K\b'%} P2sf7WPX Z %mC8qLց,-7^hzJTJL̀ FˡdI)/Ǟ?ط/Pݔ:~,Y@v?wVwFu/mT:;qo҇*y(WIXvݑPB_+B]Z}8ȁ2*p2꯲0\9IMd&S8Sɓ(VhTWmުo6d $桼lݞ[:6< :G ?/>c/ >i2dF/sDsv<%bn$\U 7 GF8vkyGlIhXՙjt"yJng;*t#j<K։)ׇ^<}/0upq6\96/ق߿'X)U=&p4^ğs^ %7mN$,6`Gf:!夑[l)GPv꣏Fq%V0>E86|<"Bu2S@ Zd|V8rK6\!)[scqo w2.Tt3#Sd4\M"3򊷂#$~ bK"T[i7>IDAT_>u?_V:j|Y 56 NWݑN(l Y=E@}V9kG)E& 8QY! uuڡ2l1` ;A%YeD- u bRJRFpjԟf:nUYQ#3:N UQ:O?]x#;x tʉOaT* ðO% KltJsLikT$KYs},Ɖ]T>cm(Np>Pf_:nQ!]4t[v%X 1y-^q.6 vPyj"Vv 8GЊWՔHotQʮ m(s>URp'P@(~|~GyQN4Δ %aNGS 3UPPB5LH?=7:d̔ `Z!&R0^yi(d}l6N0^bayϨ>2E>1rnAú=:l}J0E&t( k=m! *y/ν*& "I]`eIbKfOyO/W`V~q,=gݰuۆ#808a3,NDZ7<22FYĀijrG,C5 gG+PUU裫[C /H Mc7D#!78"*=KKᶽǶ`gbU"](WI]FT"o[(VDƀ_$kS >GIIч_!@ ߶%2ZH@?߸x Z&,௟}?zgƓ 3XRZq'CGm;{A2MZue"n1}țx~ XY\둧1l&E=ibRdqKVҿN5lboH{`R-9T1++j5GU\Bߩ> # Mp}(Qk$q. ubz'^@vS}ʂ~s j&gQ  tUb݄A3D#5sp(Jڠ>x-{ R'>8Yd9Ul}!WrF@Jo QqvykSQYw {iB?W^(!Uu9JhBJ#̈́+Qj} Z}2F_}hWə֜ȫVm)u5߆ Slg$DN2! *:8NH'PWAL}10r'qcr#T8{/uxHhZ׫ötTԔOM&}Ci G؈>X8Z~%XgWX=:B±=#/:!bȚ~1b|dςoej&bu㝻w^R]97\&%ϵzBg&=MMP=ϼL8HjW@W@8ak VɳyF 1(6fXn:nh`$u}3)1Lp&Z٩&%NDi\?=t5ל`b,]N >V l m/7 ]@~Y$00<瀙SO0TTjX) @>[BY%t΂c)Y)\_OT>g`W1)K/ig{u1 5~@sRL"ulpyNs)5%@fn'u|grTMLڤz)NQS>GqKhQą+Edfs,ؗcM8w7tدU,[qǗ37p Ĕ"g9k/l`lsIl]*F +YMIyEV5~r}GI5{;:!^n202IDZdfR$@u@26[\hջX3 mkӡa3ؒJC#p%"jy>V T@ί{xLg)LIfLuL.:s[nx#:˪4COހxP]fsX>6sL&bF:(: %A0s]HH:88 B,YM 8LCֲNt1ue 2B^^8bm)vܮNF;2gI#TFh$S*mS*@(3S'J%JR^#8=~ aCΊ=)]HuVCٯznྯHGw AK\ DҰ` R0*%5^JQ%r@R{m0ڽo&ŏPp a@(g\ һ>V8,]U]+Ј~wAUc_q=㎁sY[8]5֘5ըyr- >d />:5'7 4̶mI2&! |} Ɂ08 24.^ga]*D* /[Kk4AN .S2 1PK\FژCDƼdp 4]8G^4 b$:g}`a&4T?Z =ށM=h"Ls޽zbe gzB@+_sB 5ebȠ0ڰ+, 8*ñ(-ϡ<s:9(,X.sJ(FYtECTγR` P(kkqZёz[JtpAlVk 1yN\uG py~uyѥZ8A {P0`k9q__4׳1ΥDb1J Hߪ}[u|F#e)\ 溠ޒPT]W,9Y[h8cz顿@s8cA7p]Dh9_uX:vwХw\$B,3)TVI oU^9?>5,?ez gxivfxifB)Iu2Ou]RBv"Nb{5]!15I Zi݀jr xfq6\= -MsiL")#m\5IY4nZtt裏>y RgIqρ%hT$h(D@uTӡyptfj PhfB,b{JAuS8[Դ`;BAuClʹy<z {~58s]w@Rf)f f&@5T7 Pp cyq~5+5wtrֽzr;k0z870Ypΰet$ZF_ǭ64wuD炘e.OWCiG qHn$ Si3 LH:0݅XU.k18jf4<"vf6JfʚP 4eQ>L)k]BI)?uZ֢KVf^K:w(%q?7Q<27 ;nso~sǩm'w"x ' 1 >㧵H 07 6^$ADz>Y~5ޏJA*>Q!4doGu _ᜁQ8w ] ?1\z7,5kϘ#*EpA)*|wYyi´\]6ф4MHW(ʞ1u]pE1(X"Ƚ%bHDJ)WmWbSP `"5M ز;訌}QyPy>(Ir^l[Q]r<*AmCg mZOG96wW!'f؏C70\RkҡO HHf@ F2H@ PN ǝ(sekDsǞ3w|2L߈WŸXȮ2{Zɰ`p^UDQ}2sXP?4j8ayjfغG0^t\*=t?ix~wqyF*JE-c^%n]-cWmοU\ǾבؤxPMpdv/qsOj0۶9wa\1|>;bSmHlm -@MUsmo߉ 9G"1o+fIcjz& Lu#4ݽdffst9ڝzT&!T¶JaUF9C-rv |hYV>=X%\#uoܱl&˲dvkժբLE[ZbG.鋑Dﭡ^$ދҫ#ҶR2%mXP#D>O#"0 3D&C$#7{ Kgߧ?FᵻѭKA;hrm%C3gѹ)qxA s(޶`˾KcՎ3²OiBHۘN26ʜ> i@{MWl\JOc f<\9@G 0w)pAȬc}g_rb~yG7B͆S͚6G4G}Գ5 :V{{p e݇wK=n(.Ϣ0?,En$VfOeLm}.3S?hIi dt"9Q@$($i` e!J4.}٫}%)˜h'"%po\Gxz'BS/us̕G  xɶ]px u% qǙcxxnS=PBp|^W}vq^su,8QDuT8c7 =p͔;qYmոfЌD=ɣz }4FYv 4 ú* *#5Xѱ T7ێv(6g.`yb.]kQ)ZeX8Vv)" +wدc郬Ϣ9ɾv1oba -7T7p+ށ=W O}W?ų/Ye,Ye<4}2xntnAPѱqSe<4q$Jei딂q{//14r#3._. rȃtZ;a%y9Gnx[ϥݐatɸvyY'Z&Ð{ RQ_3֏FUZAyefzMgt]z>VDvxOe TF5$2C q~=6c96ZkWP-_B9PXB9z3NX$U`u7!58~אKk-9q8y;ph 2ݙAlMe5Yv@u0_)a\dqp4Ӆ%TSmmPܶ||s8Sq*+'_n ӁV!ٺk+`NBi-jk#V # `D kٶd|>A3] ]t3_,[VKa m&dZu/"VNBGdXs z-Zʹ n-a񉐝ǐ%6"VfN]H<_U#ȇ%px ^\GjMdxai/.?NPd f;ؚ`{:D)MN),:,*`[ cr]T\9ԃiؕ[]W:D wO 9:J<0 Y8i\5^*OIV] I^|{t֣nu/ !Z*sBRnv9'6.G\۷՚$j_+xV3A\džn?C u纚e44Pxpgaⷯy9E|=us":0 %\ExV"\A@{UZJ2F}⦉=d*ݰT)//4&.~bWB~ZY ;*BiiBmїd9ݠlU'Z ~^f$b'~PZ9jh(^LWB~@G0byXf㠙\M-(Yݍk[p*uorP\6(Š!"nO7y>}/.ϣ:MG䥆V}5% MڲڱÌp1:ju]zhJd-(Y8zN9'0+O@^DyguݾPSZe8Wٛsh@fٔWu{,-ϡRX#T8p1޴^ŝ'p̖ (yiL S0HbGf׎c۰o` 0DA|OQK`l0R'râ_WZԛt\ۂ pp_õz/:E@hesH}dvn=nR3XsױzP֟Zz%:]}/L F8JOuIxα<#-'5ڥ|D'ևFQ[2s*@Tj(t׎. ox+~+q֝؞A$O`P )MX2]A\7zK_zބ'οWM4t!~7V`ynl KoAj~ԭ;J(.϶l *iWEv;vVbzvؕLW'RZ;8qpJQzBC 2tǽ݌hF/7J2˹֑݈8:h#kAc nAqi&V/`Lv|\ΰT`Rĩ|Wpbe ӥE]%:AI)tJM!3#m,2؞b R5)vKIJP w9s⾪џ}3 羓2v',b:=ZQ6~$== # D;ˍ>N` r+Ů,V!uh>&6өfQ5JZuu1Y\Ѧ>d c׻aŲ`32*E`jLaL A5u MN) 6bRdv#olEW@b^BIuPYK-pU"w73L35"!][W̵=n=񜱮$D*{ʱP/Uh}َQK\𓪿sm0ii+uyBVcִNJi`x6C97.gޯF(I28x nōv-qVa"Š@B7]A9(QBu`dȎhrJ#tzjHҹ^h)-LKKn7ʴN,7\NJ%5{ a_κį(*T'gT7v0ߝVFZhFm>o}(TJK?wf"g̭*Y/ E[Z Fw,D@ظ8c)u)b2a֖/ΰ,#r3Ίf&}urڛeAjR{3l6{xitr{-h2͛V :?g?:u=T%b9*֌ۨߨ]v̱&S\kWസ~ݴ8FP2\ (t6EJh:tr=ujάIfWxx6K t8Gye'%dFX9v`6¹lȐzL6DfkX ^C1̱Z0T*.zMfC5\${6J/@O1m ٔɪNcpF3fxFCQE[/G\GTsV:BGΈl'zhmg! ܞPPkw'v`3s܆æBT\띶8hF7ԉA$ m]l}b]􈃙lhs/fBH[F7q-<\3ZX&n3Zwû+,NL6o?p1k\om]5H18t[j~K'NwP7ZY\i6SI85 :=Dw#5^/Ps 0z8gKCb5ǺɁѶ.e 7-9c*o4jƵfUX`5Yq(sr$c詅|;%Fo̎`oht$߉FZ`s=Z_vkې6 3ZFB ?F\d# Nf&CCzeknEr`BiRh4BIOd 3=%-dXޘrJO kmqr;75AH1+iQ-pƺ^7ҽfzhCiƹ#qeS [5u$uzw mmkWgpA5LaZcW$҃ؐ"\:eh4B#RnyhΤtS)Q^ߨ V-B͞"+ m9͂3QF6M7 㨗A(B]]Mph?`u[>FHψ遪u3r-=ΚgRuJ@IvQ}$sK9=Zbmy]1vZ͎\X=iz"Ujz˅b;nV}^pG9jzw5 F(aAvq1[-Y0X Jazz\M\ NI 梴43Z?(ժ"5yw#O$p$W^"8Ni:lkտ\r4 #w9g]m|5kk"ّFcթ8sXnzDWcQ-PÄftrqGYsK9op3ƒN+Vjl$P&k N4"38gU 5#w(ytli|LZJTG7TarpD]OnQԳ(dԫW& ]m|5Fjّ˺bN fjZOfT;]O&d͝24لh*[G @uN3$ZIlSҰɩfftI~oٳU 6sqAzQѱDv \} n8l:hBHN,6#7@B%_6:@;.ײ$(vY[+9z *s76c5zNŵ^JT7 NwEn#Ar瑍B#9,H,I]h}. mB@PdX6 ׮J[aÊF7 g=]}y}4%%MLy+g\3y,:֪ĭKVLff+8G.͆L,3l6ږ \XP}2-m5 8[Ѥu:P5 6C&w0#,i]b ޽R9gc[RZEBkUsA\l3F'M31@5ŭ﹥$ָlS%2O.L,FXM\(Cxb2LN = !p87u 1nsf:YȌ1mrTך._ 9%بIK3drg VM`Uj,݄g'g-!9?Es%5"/lիʊ4́|)>"-4q^9*V_6T2 &,XJfgZZPO xjE(rgh$@|L} +M4Ul4񶎚Z0Pwku;+%(Ƈh4Ж4 džpmw^s3Wo8שNh![cͮXIYK|K,.8ʯV0٩X]ljߘVuAz8nI7uZ$v6GTU.$F3'VJ=u8XeLo*{Gnv+fdǛXҭ5w칄=dǃܚD\+Vj31麸34+^D[A^ZehEfJLCkWBȚVn{l禎 _hX3a;QT6~K-M`3;rѩ^UC `9hv%07;sZ @ܲk>S[Jta7p%nYE|WhZ9\3;3X*r)V()-|y:̇_?o`qZ6xVe-aVzK䯴(&ɔ NS%VMnb!C,Q[BuCKtps%6 Y-IZ11pt1/Xd+D+q˪7ȊUje4~s52cbL֮5?IbDv)ӱTf-3{d %"-`-NԾ{|1FO@~z6aޫxs\RQJ=^[Ď%Q47&%˱϶@*%NnGF0/( -cRH5IZ[wf18ɴY(% ^JbYlH;1hcg5[@XkN J;fceEVS˲c-7"l2JVKn4XN̴qեk\g]_o'C ;6R v"Emu/_>Pzh%Ѻ%:h4Za~!˱߇%uZ%&| JNmb7j%!3&frxSe-;VpMNfEi|LvII^ChZV+@u˴ @kM?/K嫱RċL8*jZvjj3D#YZxhh9:4+zX̘ܖrEȚi5m$Cp˩};"?9/9j !\IZ(k+[e7wk2RkzlKkA51uKx' P~҃[ ?MoӚ\3Y37ҺmN(/3U,zMLZk%PXD 3uWFZ9I-d&o3|?_}ǿq؟25|j,YW|>·>Tc,XxMs\fbE#[$A+dB@,6,j*711i.#ZcR5 0ە\.IL8TPh&=BDujIƖ_ {$-)*Ģ.eděb a9F5\Ryn84t=)NwR|{<~'HuSNo('`[/\ifaixvF3ޭ"gxX0 yc?s8'C ~!;.\P'P745j6x-y̥![;ko sznxL,uj -Qn$-F%)h eSjhZ5tLZvE4%r9uNM +tbk=AhRjɓq r,˚Ng[/`*ʽ2dqpYөt}j3)̭E>|9wgfizNk;^Mq})i8|<󣯲vs91|)|h*ZT;=[ʞD{Ϝ߿C gNkjn<E.\*c%\ʱ̈́O-R lüԪUyYp'kf_mtSMҊ%*=0Ĉ< iX1!5`j߄=-g&^ts-ۙv)M2S-)/fӵg(hÚYM33SIR~S]f"3:]=n7q[ٜ'b69ka}W`Mjxǵ)?zwO9ďMrhJ AȎqr x۟5aZ :^gmG8D{ϒJr8Yq!jH=.43 H0?fSdǚߏIZv ,^YlgQɬ ';>D9{x澥R$-xUP{MfOD'l5)zt̳V>SçXuIƲTĒ큁y!+n>8}A=}dF(d Y,Ɗ%Hn ݻmӷB7&ݳ~m|7ϑ$wI ֻ5P(#mL&I$ח;LGft`Q_{1Q=~?~ ֘M&.ΌxUhG?ñiS37M?a3Q|qz/o!ܗ:K++vRVQT*EuӚ.ucZ?&-"bo] hhC vޕ̌;8MBbǓ)+NKeYG~h56l|(?1jT3N2')'[ .۞QjDZ8tg-4@9yop92Ag6rQv~)VȌ{,JgjWMfk:LI;u6tOa: Jػ`m\;tP5GqͿY^M]SqZ,Zx ߄d5Z5Z_΂T3&V@ٱMSպPuVCe%2[@+$VD_&P eV>Y՚虠mZC_HTyq4ˤ fΡe_,+δB'o;SC'}hnnkXv 'k.y{p5xw}#}мk6UypfxslX69#fo}LR-=?{W2 <>+ji}J"HDEfE13BVtjV*fۤ$ګB4 v,T]@G*18Bf%$*eO[@4ڑD )*8T^x Ir#$;Z`Re&b+!v'[;쒍e8RZR'9=ٟ|ݘ.־Q W=Ν5,'V1kk h.0_ypZx {l_@r:nw>YT^ogv]*~NSH.&+KLsC!dB֚.A ɒ g^Hh8-Y25 dGoj eP;gXUh>[+V:Z􂭠_v)QnHpMfGZ fd93naBf|$˘U& dDØ@:N T ReIoIH8V>sgҹn[d"!שV9>R\\,,'ֲ QU*ڬ T̴@:5r%N̢`16/ N$;z cYմ9 '|Y3 &eEAyJa5j2*5 y&O4lرdY/$Le^>gqhq]r V>o19x|/ ;͊|O 2b&v,s Fl 1/ %-XO5e\w}S'Kie%a k>㻅2DN/jx epz{mMAOs&s3ptNT;.hLȮ5&Vc?HԒ%ZBഀMk]T.Չf-WeYn2b$gQ7i7iXp@u&SnNS- '*I/Nߧ۶?R.tQĒidFN+̱v#H6VՁ< O:|MaKY|o"&x+q=&.hۉ1!fm{?O$&@d e5ؖ6Z?w|Fg+|z @8R4l8[ʘc&M^dY ҽ뱜xE^>ې/8Itdo`& lJ)RR ֻxW90dhq_,eJ/gyGs?Β vۍCW:R8o=|'@]@{U)_3`B컟 f߀%~|pNxQ\iy-=&Ԛi2#9ܐmÊ%j-՘I7Qn&,'^DŽz(}1!.kw:Մpz͛s6~U_L4lR=K7ϔ];W^=aBO(sC4:dwݬϖ+f` &ҲzT+a>S"l1%оfI捞)ާ?j,8ַi; B)5y]=tA{u^/<VAZ6}[_a̋mW> ;:_6KZr CwGx׹es}]8'Ct:qoiG5@zN' 9o,%s;5t77"0Ok5mнOlrCg :`k/|>cPXy=UQZzӇ9t7Kc/jFݔ:+[v_X>o#|f c'һ~zd$h.+*^n[1f>l\'8s>ܔ1kDɼK *<]{M'ൗpn:ԕa\X(eWJ{_|r8Vҙ 6-k ~*;K]* @6~]~}w].'v\IuOw-+˞ @++{Q o J- @ڭobS;_8bv>ݛYa̋{K 1^e7r Ni25G''㫇q\ܻ-N !׊\F9MMO p<3[UKf$]رJ_6)lv%!M7hdR|r8X=vD ?O@W q-\c1ټ}Q9s_{9W݈ɍ|Յ#jg㎋x6|b-kN{4tl.x;xk:sE'^ӺX6s~_ęOLP-O3gYQK,fw=ē?6꼇}k7NEon qExǜ=KaW}yCMK`׹B0 VJ166mŀX)O7\cՏӨL^?] ?]b'ض]$YRDRCkJusMo㼛F~jBf8sS8Ir#&XV/[9PZ),ǘI)ЛTaV IaYT;N2MTW?5]:Iu%M,&cVBPg,+438_zW~3G{Jt?N.[vEkI6  Dw9~B),'"BZ$;z~Oq[.wg\?c60z9doZkt']p{ˉo@[@7q0Hؚ$iXzgU/%g_OS[\Y3<6|Oxs^w?St;q)IS,|hD!OAQkji 9,'f&u!Lb+%?5FnbirL)x,^>QWșN A($1|7#0}ߔ'4GHiAQd ,xĒHob797KEˉRZ'FO- nv ˉ2W+ 9Sh2s \!ҲsJHYJ܅I1i٥i@Z(eJɵ:P >aW!-^vmsl8n:'q!ӧ54 MmW'6|$Ƈ>Evl !C22s|<$Ӂw sOplHN"qi)&Iv(nC:140c ȷ%)=X,gU]3E\EJaCv\26]t=g<ȡũ1rt?8n>:r%x5 BH\vÒ-6ե0ݘ㠵#O[znd9jk4F"sZg5&Fg}~<0,'7>LvlpIWVaRŒVPe*IDКɁcALߵf؊{LmwTZ P-B2eXcƲjdotyQNR̄QL&3rƇ(d&ML2.pZ7gդ։zͼW>@ǚ-+n~qȎlL#|Ow\TZv ˎ͚$V/EWȡ$t*+TiNͨɢk#(jUx+Kt(%gjg29x0~r#Al52.PGtF025m0@IJ$ڸտ–nѯxv,Bů%.oaǓ&Z±[%,\j:Bn2I'6M Ͳ킯ԪNԾ䕿LY-{ ScdLJɎ PL{r# 2c'F9mkL݂Z ԑPR(mM.߶NPkK+/dTP]M_2r_߾TGa) @;f}֊8vV{}!4q윙0ee86֟{2 (b#ZC]w6jqxuY{euB2#]ynb8QrAkI>²NBv| COKL1J6/3hqsS^!gL}XR6w&:p5\aӅkr\ˉ#(BϐF:RDйn;.w߂Og-G&Ƙp Ly<((_a;q}tmΫ^Ʈ_J=5-'V!r d}.Ot­rlb!"bhRpR;aϺX. w>Uٟ|xz$-O^5"Ո%Ӧup#<3)T=5}`%9]KaZE,]kL{;0-1Jngv\rz6kwD&'TI!'{f}^yc+?@ov- cxUA+X8NFHI_"Ŏn.[ΎsipsiKS9O&mY:\3y%ߑui}Σ#"U27N8=C ݷ ZT&(u8[:𖫡+UK+gѓq`+z~iD*@Zve"Lh%"V$7m<[Z׮LCwDeY:XB`Wp+ 5"dF޹X|`Mp-ÀV'_B'Fw@5 7W#}|Σk:9O+9:K׺s(:FD"㧏TXpNXUsR>A|\$zŲLE+yD- .z.%FTP?uzRMsE O^4z[V 5GCx5NQ/!I<! 3{DD4#*L 3Hkk/ZsgfNZF,\F{mc00|jzQ;LĪ~3)"V 5%/Z1-(2+>3uΜXAnjN/#- > S3DǏOO<>Y9=Wm2ʋ*2gM /ÀZ{U1.Hk3|$ڏ#JL,RDku2/h"),'OS%\an%Yӷ"}r{(jAiNjJ"ZO҄&V^KK*k{(+c$hlz֟{eIp|>wQۺ"dR'YE4ZG ՃE&DDd`|oZgeR24Ss|AwGe{&kř%RȚBw "YYFO v,πV;;92qi.oqO֝O;AO <\è5"f&3B ;DQHjq׺-Q bE#Q<џ bVe lډHIEarpfB>iȜ֜Fq&]@k7gADDs09t;۬E,=;MEU[htqzM\wW> yx684ڤ^<[z\de 9VӸG:[z-H;JD0ҲIv/ ߭I, NLkۖ@[D);crL 6{A΅W]R߈@XQJ]/({7_kgSt*W)Cƈu*4ŇC3U6Z+9vh>RY"lZ,OC&~ bxǵ%= ($/c }28oͻ9 ˶,lJhhs,oH+dW2 &bEROzD9ՀR5ǁs&iߌ}\ewwV<Ƒ8TٱA\f Aay)p.˔V'H]N+ ƁG*ZdَyshTׯ5kJ-^McO/d'8sMK;Uhc˥/b˥/O1vs< ?< SB`Ko 7Eӧ!S -/"VӭG U} JDX'R N`I@Ec dZ'ۘ |n.Zc#"*ϩŦBg"_y.n "P`<~> _dCwRjєAwjnO|)#0|3I>x=&*=kY p)w^XqQhJ!6mRX 2Kt~]*]sQXY6MunaV1&.kk ى=MDː=Cfltz _1,JC#pﳕm5^ eD-Ԗ3e^3efcp>xë +=*囝{3}|!ѪHABJUl![X Қi63[#i7lR)p@ԖQhc'G*FӵUYue+/M~(k&p8|Ie0S#VrScRӬED4ge+RpQKz , NqUd'5&P?9 nj/4;1 -=# }!^W |;p|83nCe򇇍AEZ6ڰsqmDYk}D *"QgTZ+zA+MR Ly|VUR@+М_+յdk䴏O(5ӌXL BeR#+(m C␮Q'œˮw 7F"UcD|ē2%4 Ӗ.$)S".OQ!iXO'p[Fʯw/Ot]3jKNp'y$B3ZDh+GU+@X{7z.ui ]@,N0ˠt}CD QZ PMD~bm3iE,:j Bƪ{U0+Kqv(߯T|i՗{ڔ59<ƒp6S14߳뛲f%Sr}'TbDGVu\BMVEZvEi;ۺl%"b޼xpde+ݩMӔsîUBBm@Ҳkе+W""X4V]JQ;/9hË+d2φCҋJ(}N x.lL yʴlfǼ9>-G#"dgwxth5(:B+ş=?Ve I{Zϫ @ +jm&$N )"ZXeԝELC4F&X*3>8;k. m ejx4fM/ v h;l8\(#>2*b%WΔDR~€xc]pĊrŝ_i]7KLybi;|SlkylܲjԺ>QҲZ!R>BHtPV^Bc('Z2FSC)reR")-4ڼBIZBs+-ee9htpƉ'Qǎ%QKrXN C^>cnˎy,]PWwB3~AlxOCQMcOkl֩;h Mnc MXersL3t.h,-SefoUs]HT~5L=̃XiSA'^!FV\념QՂ?>9Τ[ ]%'&O+M'?5/>YQײf ˩<|~D JKAm(0skm0/@QT/)M!=kɇ51)߯IVHF+JZVH;$$:pI4BZ¼UJ7 Y{ iǐ[aHi!UzR"4X~.B mvıbqx ˉKI,'^̶J1ߙq*3N!DqaЬ.}>S>.H)|Ek(W{|{b}l"H my])-Lr,|q,'eǰb e*cZCy>bӻ[g ;Lز&Y ̱uL]k?1}RהLX9oZ /_qm$;?sx_XM(߭UGXn> w)L3vR 糜LkRie;, &᪍=ie8&841ZwIۮ)ZG5J0 q!Ii~7*&Sɒ_ *&|u6YTznq1FzZ+A2"L(A2AɗXn7z+JWk&8wZa9qEBfaͲX1ܱ3섿br0\y E%Gy. XA@bMTj h]N??=Qjh^hrUKZ:q@+'&[qWȑXED,-nYc gOָ ~!oVڳƇM $?9Jv|7;I!3x sqYn{R&&k{hkcљ]Ń:DiZKX6qb"2.n ɨ.-D^ŇV33IUz X3ݸcI7].=}χgT`IK2@k>?R" DITZ#}|z)PeS RFڎ m<)A!, =BȢQGeNJ@ YIrܒ Bh5wX%_$_, >$ /8]ӧ+RBow NZ龳"Z5[JoRT.ZP~(*KA4kO!-7;H≮QϚrPfT!+/ss)$n>C!3"?9V}71)_ȣѥwWOU>'j;I,^T&GZ 8"{ٕ ƩjOѲH++ V ad!qfH5exoÒJ %%Y<&ٖ#y~(T,AŎ%ANҔoIdc CXAYXUx2?ۢܟGV5\*Fy]WTW{Ia)%lVX_n?(zNI!,S||nX)sq)<7O,^LDRk+~WKv4RDV%[ ?9\|7_rN!W{rf8{ ZӞE^q2|Y.*F(J*65&+ur*24 B [0vúRM(ʀWnfQ\W0w)QnaYz'{\*\PNf&k'IIy&nm/Lr^m nYtm 'ezp+]W? yteXWM)|U۲}u>mYm6Rq>۬gfHL$`d,ϭsu5bܧGmzQ){nXlX1QN1Ls},mj̧E1aW*K =7Th~|Y0s0kCGr @+T>U(B0}~) MKK*I+/@ O$03%G#lC`Y}%skUuA)s6&tV$d,Vܶ. B _'Re*7 1gVSϨ*&e 7~I$Ǧ*WLο[رҶIdǹ۸ӟaq2RxqnxMX9|%+}P |>/şo~S=PCUae_ϒcusds({ϳQ@h H!rz}|cP>]Ŕ.ps9+(LMQr9B/̷t)&^0BS%_PbEDp7TkWL  Cݓxx*ZDq; 5 +4a0"bzWqt Vx1ǓIl!N"ntg'.]y+O?`N|B6;xltŜ);9Źw9c|/~_8v ϝ>[m beb)v6^wU~~U`> #t鱢u~:;滝k(,:k76-H))hJIGv}aY X P0`"R.#˶]q w]@UaI +Ti` >_[hiR4oLTȅTr$u^Tt nUH҅}G%()Ӟg5gT7WT % ʓF+o-<'T2 c:M=E^ׯx֌+;,\^ט>V+ #pƶܸ>|'h!$"b9&QZ2.iPv T304P# /v"L>3VY#l;mSH IQ^8q,;G*޶\;wi0Dv8X_ҩ# ^Bɲ!فL8QF_,К6F(Eβ@堪dħllF(#'Oe&OՓ2vpN'9Lڶ!tpPm['irbh]HH$ֆŰT njK6vSL$RO8Xɤ'HcwtCJ&)+"X]zMNt 055u']t98o cO8,q72؆J?8\9\ SY'œLoހ*~&cn''* k䧢%H!P3`j~떮m/|r A]kO:\~lS63O%Fk9.6];m8ZOKF !{0GPƤYS&ɠ]?1D٬I gNW^Sǡh>w ^[MƴZnL.HVXmi#Tc%H{3jr w'ϫI!f19tG?;0lo"t 5 S$mÓsA,Kٿ~?k&ugAٲF4 .qmLMp#e=bq9OQ"tֈXp=M@JSD;mE'8p+UJd2X otg-U;9GJO= ¹}G O ϻ]9|oQ? ArֽW DOOv])zI`sPzJa)TxҺsYfN8*,e/TiW>| `2h$^W@w'M[,|ax| '"RΩ_2 M ;9㟢Ki`AZP<27jD͚s9cBEB8s1 T8Q~ɸMr|a*H,T2Q/g.-P\n*PT*&}< <-,e\CuG1a aB$4%.I ME}t4| S|SQ7sTg[pO*lXT^rU/q3q]70޷XKp'rJzRAh~#ѱ5ov #E/粲2^{Jq23Ʌ=a)wЩqFnJ_}6& yGLZ\vS/#wNb-ԕK!Xj^8TTx?e-)yD, @AW|64aьԩҥW:C11='5|VV|ԓz?37NzP3~/Xٝa W NHϔf-[Cvsb jpmf"TXYe {?!͖\i{UOVC1NP2YSF(TJ$R((Tt>oZg&yjԍ(\`<ԤVˡ«2LtZ WFT.W|('\|˛ dC}l!uR-aLq@W'0(bt՗s3 N IM*2Z x"k)5OR|TẻqUzY}n[ʢ]\nܴ/=$ 0!H׭vo=b

H6h}?aK_-o{WC ƢpՠY @ʉLSisk 9 &h},Ż,ſzZ!=>[֧s|l냍$B8p;^9.SN:ږMA{$ܰŚw,=z2,LhwOryT쐚>(1Xb8A&, ϱ2hY2ʁEXU(I&񧦌#+):aRyJ((ue3\Ǻ\ϓdyʚF&''d~y&!Yt"_Ro%* ta"7s]J8k3 -mL-*%= h+Te e&ӕ˯P ܡ.KZ,Fa>Nu>wM''&j_HjD߽n^{LZyh05rFNg&yjt_kŮ֥*kjwwp|$d8^=$ `\5T`*)3YD "?3]F8U8Β5;(A,;mxa3f L_7_ NO80KɁTa]<;jŅGJ3fмVQ񸊘'ar"4::RXA.(Mb}Byf~% -^%‰r٢w[XR ò 7e6a"F@XCrEuQPP0?$WTuBc]˖ߋ~&Fu*KTo{=Ɉ9$!7YCZ ɳu n4SGB.̅ '333xÕ,eh`0S vS[;[ӝ3ےm\׷GJϓ]M0utM_%$۱>hY} o2k(9r` D3Ժ@R#0rN՜.쮹%#n%H ⭶c~_74>W{] o;OGGj'eR.o3ૠ G ǘ.FjYFa-WF[q\&5g=3 . XhL2uR\-5II)Z ҃Ey [XJS2mk[Z,T~Ҙ4zR I$ Fg3Ə/EMM S:g2\rU(OL_Q-sWKM/o(SP }9(Caƾm9&~ܡ,<6t_WK||BYCo^x52uΞ^.]N*Cr7ɉ[A5j=6{lCׁT+'[\pMiwuEv_BpԼV|ʓvN3fO]8ov05+\ n:&M \{dvuP3($2Dp2}kmŵ mgm w=-K.d{{7>>@`>htkV@XVü?}D(3P@ ,3`j][E%DP\,4˺ܩ/F˶E7t/mm RRvAN7@pX/d-OkيBbKq|ʗ (pupL WiANg&w;4ƙ޵5#_mN//X:ƴٗ*JՔhG\ rme%cgu4F$yU?;tBdW˱$l6@Gdl4yJ DGzWERbj>߶(4|8Py#5a\*ﺕQ={\-ub"UhF?mh <[缮}Uxً9GгsA upQy!m 6lg]*ӺGƇis5W%$WXJ1㻍,SU{.$Vrdɤq-""Gʥ+2遉zHwغx'=1m^b^T&S.΀n[igJH3qp&\RuS%6/ۊK(%vڊ7[eЏX5|ܓ|ؕ& KՁr8bXMRD]_0zl__9O=}w^au7suM7|w\;s{8_|:[Z8׮݌#+ks>748sCU{.LZWq+bZr7\txӔ2BUX,R%9?=ɀ<_*_Zn,sﶚ40G A_:rڗpMH!ß]B^ܚU/z'F'g F'f}nXE[Fd5Nܲ荧8Mvڝھmï^p%J+n9_WNFY>aAe0i'ƶ.Ng&K^G'\0B`-KIjCnQ`MPYf8d`@w7V* 6N?o+^n)2HQkE&%dMc#pվIص<ԏڟŪ"Ox, Rq4Ǣq-Kk͛,MмR Vv51) Ҽl8-|Vo2d["V]mSZ`V;(>>? ǎ LlcxזXʖ.]{.nl~+O@9ݧseyd^j&"93ޱJ3/2*ݡ1&dQ2UPU&ʿd*EDc8Y x)4m_BlN'gp̌_QqcZ`uoV|2hI){'pJo>D''9>.fK9>WFKªRKcٲ)-+9ymցeҭ\i a7uG,/X MsҳOR@.YS; g̪K"QV$-qces0<=1qUeb`$Sg7oO8+Ղ c\czڟ.yn|q*_m%_} [6T|س8VRSLhWOU_zn/b%/]md"s [bWRUhkYӃ㍎Lesݺ-7+^%}ybĬj[&lgQ z n<8t!%IQ]kkGd.=A+U6l#S0R#Suiy, D,v޵\}<d[ފQرƿ52 w `o}>V .~kyߕ/uR\Y%p,7pa⊹z/B璪.y.{!H#YGz3+ \:bvϾkgc6#ĕ7c-P7姁{5 ь1 ,CJ lfՈrܩ$i4k9jlH}262/ׇ/>-Tʮo²5}In%Rb*>'2G{)"4n1 ~kq~RpX( j{|'N55DT2529 YD \Չ$9䳞^k([=тz HB?KG%" bUV9 -~ݏVaBxrtԞ=8ylw\Xvgֵ,!yͶscrE~0;ů/7"e;RϤ[$'G9b4#xZ Be~ɥةԌa(UipaUKNc6#IBY}X< 9.\qbTܣUٹb-C(n~s߭62^gּv4%ӧ3yeehYS3bмVl_%&?c)JRQ|B 4</4KS-UZ)/x r;+VEyAJp0:4Ҙ)C":3'\?ykxEHZ6m\ֿD88>³#E?@ Yt²*6{UDryIj==X&צ Y)LSϜTJ@w@R'9'{cĉƲ{n y wj̔^ ޵.%,0  |~V\$5ZBq_2%Z3>I^f)4kl]J #Z _Ce*Kq$BV[s% b,)Ri#E=λ:o} +YO-$/5 fwWJk\> ~>BJ^6㝜ض ELaä6gU۰ΑHf<2'NH>oHZDK/?sծ?S 4̼x3UvE!,?xtLʙ `CL"gIS#u_RаC:=ޒ}z! q7Z؊Uz]^LhSt"{E;2\-xh%jka?%B X7#Ly{, H݅7O`w %SN e(Gz^6/p}m;R:Bv҂!,:,:* !H98^apӓpѵb z9ט5)]/e lH'#߁ Ֆ5_mx.]{y ӗj# ~Ɋ*O({s7lˣϪ|ؓ'9WSPj~i[ysK:\% C8Wx֎|l鷐;tӷ~US?#ݿl+kGO?*?BMo&?0@QrNfQAp;HlHsHnNrf[AlF@<>k :F{0ͼWU:p֮3.EșYSU\ݪAKu{hinoƐ/w{3>rG_A2oqt.l1 ~lw p?jz9Γa`"ٛf K]BJ_SXD<oۥ,f!'6"Vcٓ,]~VQ{AA(c\Ks4A Nj.>?Po`tR_pzNd'5wF.vm51nMU>ʓ|n^\6u,Y" {1>wq>CJf+^IێW]S R!3D,`AHDA; C*ݏc:fB `Yƍm*۶`8 d KFyTtTJ:ictyn`8}]Q-xkx{Of,GM ն4*GZ 9^m~p|~ƍ{}|a8p¤2}=~mc_/`XGINF}ˡ08*Oۚ5BslvG" ~[BjtxRG*򌘎M Xj4|CE먍6 X2|acH3PJiF9>uQ8~6%w5݉-绚\~p0_z)i2`k_Gh jDA)s8mT_)A~+Vo&mBuM ռ̹d\JH^ٖ6ҧK-ſD~,xӧ_nl-[_ = lfw=\ y{Lc]458mēsP_+L)BʽVs#|?[{*ӮO6ď`}l㣥Uɓ.fs{_q2ISc&?:ly~+ ּgJpRK~ ͛m_p/տ$1FOZ,!t4_ jͲUh^miJ_L)Ғ Bs kQdC9W,: e!z0`Rl}ϯܺNia&0Zq?peӗH>N_"IG,NrhsҢ͉"㹌8&F-t]Vg v-ֿ{MBLI'D T5%1m$f ݿa<{jN,_[ieobO.Y'C%\ ->%ENAkT*¶x .W-$LאJ͓Je_2Z/ YGwhh4ڌ@ Zb{HC cWSPҚ\Ne&ylLQ`5VuxU٫ +KwѾ{7*G[8KDR4NWp7rhZ7b'SkxTJ6@'2*fW<nhi% ϛCtŏ3ɪhYs`G« TƣpZ#?1Z e[Lkc#;~n>ߨ\O}Ȑu!M ;G_QOK|KSj~]|ڗ–|V\.5e+rU^W;x40 Zjn=s}Jp/mc-LJ69?N %hI^e;NI 0Q#I=8}˗9ɏ;qV]U{Y;7{upQg&ٟcU'mH$6tj,}*h`JC0*UTVg':i봡h 9X{ϯy A H t;js1EF_y[T?<6AxWjm֠5LaUbU&Z* F)eФ}Uu4:ՆZ3& qֿMt_{9|kk:,*RbӤwb+_MUWcNɏ)!Љ$ގN4+ 40 OF 􎎘'cz*4HIvұ1)_v" }ŕla3BMMutU֯§]k,G#CE|\_ev_r ?R1ѭý{L2sְcYx$K,k-ŵ3u>K:l?xykTVg'|;yNG{s(-2&Y>1OFKD {xGSm4 M&p!#4_wS&؝]==!m'uE]쮮DxTSZ Op<2kYL`wI`TRyi2"V[Q }|EVe6p w\$v L+ҩ9Fd~_$c'`~30ЃL<ÇqFY}T`ueo|¶CX_]LDž޹XoެLj}уX^2h2HWVk*L&rLju)O`߲u^\!1D a ~?g }ed_{e`\t"4'}sxXvT~={#,`ښ[|ɏXK_%Ok-EH&GiOppx9 .(w0 /;(+L,קe+Z"GXֳH, 0bbhj }%/Q(OLNOe3S<*gj #İi.k_x_?|F;aH Sֆ^0Y`vwU{vW70)uўXiBp[}h!qT >Ki^ź/|c{fy"@is|͢$XiG@ewW*:ȶi l%'X JvI.wD%xD P*{V-|l@ cG`$)rYsӃ|S@Y@~]Z-2c)E|ݺ`kezβv] 3~R.t[Esec$FZ,#-[oLqsGօq!hynI& sq%xJ .!RO „/|yg;829킽MI|̙KIn$u?ePYsJ(>ŵ,#>I^li^()?e)v U|/0 |Zt`$yCI~--_kiܧ#(\ L\Ay(,t[ߴDx<0(:C'x¸;ضY͐´+e n˲vA0I4m:ټ/'oƏ3ƑPU&٫-4@In{"yx럽Q=uoxΝ_}_nnkiki|;7q>>1F ܁3h7#%2_C f:ooz),Q]h:7D(W!-5o;|S;tJD_ @jV}$նf0FY[sP @y'oiG]4Ћ?XŸ:B'IcYe |%~({0`,tYb+fXAӶnX?Da>g8!b Q@A'w*](h9Xx}r(Lpݘ)X>H*corCdQ,{zyZ-6KbRKQ~͵_s-ӌ. ǏX]$K|v5Be2*?ki8Z{Yfq%x"5YB _Fe2-2&'Z 8{hsKK-E0 r{7!eF\B NWJ #7EcąY~l?g!n"ELes+@ E. L̐Ӕ&"`B XUqqM2Ȱqwjo dlVgY R|9op |5nSp;>ab67W:>?{'U?Vuwf6UI(! "X&0`c9k 109 9yw6ܩ{:L[sF_f+VI-E?goAozˉ@3;&[c]#Qas$yV ŻmE\ni%R SV$oD_]ZiRsWR$A9%BFKBj|@wيH3g!p`VbcEjzlcF:}Zp4M ZyHo/ִ tV9FIi?v}2b8"{6t>8 BfTdP%Lrm k Jҁ@AK :>!f$_ >@+[]:1Z { k$2a# ri'vN?F.:pInM,Y7i! <*s{}U .5҈mU1ξ_|-fȖ:Q'?+th#y9q<fg!d+wI9-#zlӚ6W\m_]U V.5WdkpX+5uqWp+v Gt,Jj>&5۔W|U)i$C]H86Z(rymD?Nxny$FɈaGaA+ zH9A|hBhHT#HNPYEFjFz'nN֦Z2pe'|ў GqfDI N p58B&r7|"ذbҥuP= Dpbud8=yPk·9EI*^zdߗF k@M --&hQiU=5Yq/u =‡zٷYeF8LJnπ_>{q=b^٧HI>A̗yd.@9'x?g,W%I^dۊ8ggqR&KYhġ7 m3F(6 A bbXu֬%t5koD0#}͖lpx,a S'ڔ\%!WZUB0dxY ) (OwgIzNn>s7 0HiRvzEOv΂$c,'WI}ac oW!ӀH/=}ېDdJign_$?k0z4U%L:psmN?U^#Ed~tVߧh Wb*C,ȨG^dt؋Ғ[y]d^Cf0fvmyqS\ guãZs-T66-#ޣs4x"N0ܙuO>\h>s k֎v |k7F8`87Ek_ a!ߏt";\@Yg\'qJ:]AfbG\A%ymFe"#\nefe" 乢@`qLg\lR<[gKǕ<_sY/+yzjRӈiL:-L}&Oq#4{ƈJyI7^'Ej9tbbyGBEvt`gWdG+ZĤ V&) #fqz;i L=Rgu\:sg:j29rXIg\U#. ;)bOM$L㌊aR& F [s;X .F<;E@>hpvx >둮\Çl_<Ѯ?g3Mt<єVGO_=FuݢuNxiz\nyO;Ѧȝ\6Hn*4&M x?ɗv]:[ZeB: 1Qy$=n4l:#x'Γe{7qHTI9y}x2Pyŕ~ f}N4| &Q*o]'TMԚ_-G/ ΂6צ* EO rl~"Q^, ͖Ľy%+q::IcÄ v5ǮJYR qd^c+?{e1ed9s04%jo4qK|& ٜ t ?۴72t&{^˕ڒtd>CKg>S+xRZwmA~HvI,q,)~ v5!dpT N-ADx}ħّ(`N9Δ~~5l8vbx=QynLFu=꓌F'G{2Gؽ\?#FK!1ELY't#Xd:W }7v- f =[l܄]W;0v]{V;%uK9߿pVe崮<ZRsԼ8BV;? >83sωRuZL}#+)wc;Oq8e H\sDFTzZk"4o>Y~S7RQ~i%%Qiwc`4'AsSd?Ẅ S:-[*3"$-:.^MD2d(, ",-cu,v*Q8:FPCQ܁0:]5!vbǎ_/egC7Q} -()?_sNKFa']1jɸΈTo5-RƛieG;dW`itx*˰!JVf 7rdtOQ ^Tҡ#?9-)\MK:$pmΓ,Z#8Ss)ʡ]-9Lk,>W5gXJ4wbacRrICB YG$澓.%^FwBDETPڤd d)3҄!>W[Q'4X{vӴ'(O>2#!Hs*c\xG-B D]SN`Q-%Z߂*R Rrª(A"Wt *Glp!%@ovfh!"z8 ^p}Ax^͂Cg"|YO-ťVbD< $žFu#ʌke\ϡoDfIpoԤ,xJ*]7@Jc8L]Tᨑw( t3MlHnS|0 b8bXGJճ\OJb2#S(\<ˌC"DpWq_Gl)KAT#[q ϰpHM'g973")Ps'/LF١@S[ (?|dI n_q`vf yI[ erJN? d$'RzK0J$R_ pGf(zN8%bՙᔄe #Xda,f,2t$J5«pr\ńv GMڲm\hw Sӌ5Cs!4Nw? mbDsaIS(]s[],mYsn7_?>!v̩ l Y$SWPqFJO]Ape#4 s,ufE`I%uT_6nv{tѣ;3@)﹛' X7Kͩb|M[f)KFO3Gw)55X㍪%%DlTʤ? ҫa kx"!RͩԐ vA\%3MJb9FoFӎH2R%0S2ې޾+| ;hkUbHQ/)n%x,M+-M_ >]`H:%)H ?&DMY( oY"!1p<:ҳ ƻ'3G'ZZr1-=\ܻtoDGf f9F\yUEO լ}bn7S7W^Pqt[t,k_9͚,Y Lov{vuonA =r+n=pOjґ #I7xe0qf ǿt{j0$7V}WS)ٸ+Y’ֳ=WQ{_O1(Ng"Zoo;ߦGXW̙8p+957[FDJϜU.2 ?p$HLYs+1C9]oiazp1$+k,d;2Kqg:9aeޑڟkmHjN o/^!Τ簘'( 5emO|?OmH.F3-}X(4]]H~Y!5AaD3u*MD44ҝȌ!{'{RaUTttf誚1& ˢ3m*'i{q'Z_bΖpRxT- (\4wfi@_cюC|#YƯ$"_|/YjeEhBs{_nn(&e#sGmblN,kWrkxxޕD^Ĝ+Jd~q^ s;}мҬLa (W vMiL1":Mp3鑌$:|v\kܖ?(9"XF\:(ahJ @pJ::̄fF0tp6ntκ egBعG"pJMGҢpZ"%`(v;ǵkq p|ܧXTx.9Rw; Һ,5fEf;J8?Xuuzz uK rUJַcvF%\e'd"%f8bD'>J14B@U \3B{D#/wQ#A~6ǑGbE > {o\Eם{şyA7YfvՄ9Q-J\JB̺QhV\*$%NWߎx"`|V\e4Š]8(A-p;%R3ψܹgW[(IRTSa; a"0tjY]t`UTPuuD^+xAzpg"/q?I5Z0al2a~)opKծ+7aRrgU֭܆0q8/m>T]y:k)fmv{+uiCʩ(J‰7؊lEpWd٧< b@-lE}Wdk#f\rPRul+>S2bYIM-$[t"r]Y%RL}ڵxj|ee餛jY84w@ ,^B)e?!?8/0#;>{=?1nz,S`(` /fs-y*,b7>jv67=ŵ_}}ʗqvPv$ڨt%5E7/R)RY(2>'I?v$')SmKmG.4)*85*?0ʀQ!J"`RMx[d&8kxwo[5Gx03Bskksf8o#8d|>}-\hʝ>ۏ/H" [kFn@8]UE[oV>?q` Y7ZW1 oSSZS?6.Oׂ/-'R&R.*lW/-^Rf\mŇmUc xA =.ӕh3O茼VTr>KSi%{"yfIg(P i#ObSw!E°X `L1ߞ/|>>+z2tSw>eG4, :3?֌EF1zJ4Qq(?7iHf5wԗ5enѴmOVxpSuRThw]+Fep)A=˛a!?omIfh؍XeEn7eBklN J~0)(ğ4<_r,vT[mmEyQdcK7R cW%&>SaT0+,E G]A1tRfAEis{ρ٧WcQUTƪ#*5J]P,ْ_g_hʋn&r@ؼبgPߏW>F(ҵ+1_j}U+VRyŕڮBF;?QVEi+z~V; Ǿ[_xN9/ܐo;DgJbobe|V\P >)mG;Gҟg8xHH'%$4ﱍdRo x=;vcu' F{In[;3tkf\piNZ{iH1%ҲJ U!TY/T2M/4o˥Vm%ݑåJ[ .-E0kRF*](9arD\`{1 P&@0thDxy!~oW_AX"^8#+*,zViMfT*1i X<Ϥd[@ݭز?H#mN8#h˂w]Uۈ-?w-vUTx)"V.\[>ޖC<Ӎ_j*U3"Co8,RQ"\YS*'.,LDQH}}@ST ES_yq"%U^Gh(U0=>v<.Z)4yا5=N/Qso!q޷xqPk\Wo=HjR"I>iCĎ!엟j ןAyc\u۔V[Xhۚ͟g\\YLU5iBy4a෮17[ RR@Bc9!() @ht:DnWCgb.<Z6rMH8r׾oE"e@@CEc*._@?2/_~)MR}Tp'!`(bq,u\, Pi޿NG;>Cv9W( B T|xIRO~tBKN,Lǡ]tEͲ,>bBUS/)::dsz,Z@U2*90iW-Ŗ1.4`Dx/Tj &6OHo7с^bC8*u⸱Vn¡fal,__`E5:Jj UN1s}[Pe͔O:4|ב۳Dhq-Vu5 Mi28\PD4I,PЋIQI}C۷Q\X5-+;My MT]fd@֑E{?x9 ,jx %O"}O>XZOeR 55#tJ󗝳>84ЎQ7T sGi۽%OZ#w O 1 H"4Z:sŧ]@㦳rf*fdҼT1>zy_I9OpVux/?pl'Hi6 c a]?!pO8H&° M:nZj jWiRm9z;!9-چr$٣_ϲu ;P,^3F8H*)w(Ǯ.F0¶TgwS}9nB8\5P p{0#(Wk*T1rt FhpbmXqkJ1c erR\?.-c ŢcaYiv]Z (>:qYy]r]h\/%C= вyf)R0j$@Ea#8gaГ[Yk q_yxDb58{ +$^l"N%FuUvm+hD$n:|.+ws׍%%4~cԽmS[oٻirϛb* ") j)DBn=vN$#<^4g)gqH!]' 4]m~v=9ʃ$ ~_^^J1xB,-}+jZ0Ώ裫y4GJ? ||nw¡1n{}ޝwE1+1yf҂YeQZXaLiQ Jh28|t,F3Osߦp{{ DLٻ =-HRO.`F'%HR09c#Yee4|,̩0C==iӂX`v4GJUm"P29hbv6|t,Fx^/]=P9z߃"ۤdVa3RWΔaσg(fAЬа`f%eYBƒT6 Bh>aܯ$ܮhSrlIDAT8}mDz+dpbNjԭ0:EiU-Oim/:(%$:Pw;D<e UCŒ;p(iN1w"b(t~ LI|j w?oBy:2&AӦUNe-xE N27ZSg}֝/H[r%Cw}-\|z P%5׎'N4BC<mƑݖXݔYBúӦѳό?N?Z<`2`vQ$D$u]F'?7LoݝY)CSksb=s-0\%%U^O`iYmP~8ێ=l^l5#cC!\7so~K?01siT\~[57esSc8#_zJd0=: gwe8G`S U^h)BizOONMD/2eGkS |s)j\玐|1-F0@tX<"m+OD3Xf^hl6>?]&.QIr)z 9ɎFi7!v"{?`c_2 6^hwVHҡ\i ~?>7XWt˔bxʄ@O?=gcA3OhOkiphM Fp82K;T8Fhv$UiZ=:9iZ@_DZI'рqc  Pnk9"s <_r,+S\,Ňl>K-Ba)}~V^tQз=_ǡ!׀<"mKμŧ^VuF3c0SLiD_ GgEBS{2CXզ.oItr:;9w'>Jx<$@e7?F:`R w׿2"r?m˙kUU_<9iƩ=s[)0gUUT_sk~cv_w#VJ9r?PN h(!JGgכ>Ϟ[H:fYHפkdc>tNO7I$ _2vL'P%@v91Z)\'3lZ׭5uͺ4<< Hnw$}h h }S/mQl J=-y5J N25O/N:#TA1 Ҹ}`cZ"QL?[d!4ڙOrG JYW7ވ 7T=x|ÁvXZc~<1ߵϟ28ebuw aWɟAdƷ/m*QcgtFD.5WR7SvY"uapH(RoU#|%) ,- g0_(vX ˟[t2csN-8\/xIAbEjh#lKAhB;{sJTmF$xC&K~2yp} iS:/u]a~H`7!+M#3dd kj ,]JEPyŕv: (,n:Kkw~w$gw4);gM5~NK >F{:g"N!Ĩe篣&X;cGazz4(hs:S 0=B@ӲjWGl}F 9 B|=hx65& ;0-;_}6FGXN[UH! ,`3[q+um9̖;~3Q̱Db}~޸T*Ͼ'8][ 6K)kYv3j?NJ6.M.D:aJz ÕiKf^3f3d*A)|s54'ԖG~I I`԰[ߡ3/^+8S  ҹCky_s{Pt4Y "Q4NOCJ8= D}V\NYOkMr㊑]4SdՔS( vI-}9]囘rOx\ǙjbpB# bE,KVv#Z0ۖWi ɇRʂu*Qpk˫fqXZS,P1 8@[ P;aZmN]W5?T\Ք5}Ɍ]xh'?n쎜YԾD){ :#ᴷ:-HϻR}wJJ);Wk!osZhXDdtK6,0#Z̮|rS ܪsa,:Y)#V[P5֖7n(]{m􍊔4n8;80m/XvS^GPRS]M.P̾j qvh县bAC~!K׵I߶˲"QLdn2`/Gҳ>l9U𖴴,BeTe Wi rd8!8HM!ɓ_( @%'iBD04˦xṬQYW|{ Vyihd0 HuldԠ>O侜&V~Խ:q״|+yRvzaM|fϔ(޳=iӄϦ3رNG2#;s¶үqFwʒegN3#Wi:Z"ZkUԯ=5O-Kd  ki7e΂3%JBX}%봆hC{q36qDHhJ+(@ ˶C Q&3׋hNlşي(vs`z?KR˚~fŲhqP[SHem=RKSE%h_9jOy9bɰ"JG"ZhrZhץCE"_,|-|n*&~s@': BPv*Rzx%#W{5P9ƨWK/4wB!.9(*S >.^kho /+ܔ#8}U#og9{tzUWR~zݖUD" "^N)Fv@]q30S%kxf)U5A?\z.8}DԕN3Ox9[I+ ,KLooݍvR˿#vlG{#8JP>+DHDx%MBs<@ rD!dSCx~oH B ol"Xm97t<=Tq ڊa@/66dJ%SUm|0tz5G^|"$YsjmcW2b*@k\,lkbekqq?t}ץywHiXwZN$GW5v1-R\p81cuO$p!eh@d1}1xq/w 6 u% ?:Xd=#GfS6΄YV/2FnL~ {~q D&wOL9XTe3?{zӵmkoޔadgn >ЎC/~J寡 ok7૯FXQ:0~;B e)Ɓ?FK-GiYooK&C~:=RуYjk󾾙Į*2ZT$VaF{hgu#8Ȕ5c+9:h@bJKB(~im!`vX罖%+4Ui*}-|W!64@,we|h-Dz֔,9~Jj-Nښ\Wwp,T4e{ VPѸfHFM.nzR|sԚRLe~T/)A\~CV*z*U8#@`ECN`+JNYFpEMcFko:sצw,.ܿ+[ TlS '*9m jǡweTQzꊼg t9UBdh<{-U>p?ڙ1QN|jN9g}i\ǙX(4GHD/O\HhǍ,tQ=#L#bE,] x^ >窞6ڎ$5׎\_}JV:!Ң}6~80ݯd)-B%T/ۚ+#1-*gH Pqy:KQvC ӭMMM.{vm>>Q^]]6IAsS_bVd0`U >e}̌'w% n5rpuOhF13)q@{v(ecMBPyfӭW5jU\ސo"s1C?`K0: Nwןo]ɐ?pef"٬ceg7 !j0]Odi0ܖf;"v"5=;:7n<`y/(]@uc;'sc$>WѦN[fK1ywD2N)^R =_kģ#˗٦J]Bg#c@۷8@2Z@<8Ǜvy)E[e]?GjXrţe%j*Iy M(xl 'A2wJd7g1ydPtCUWOęUU7uPutL(gQ ƸVf3m&C*#wXېZA |I#Ю" Y ʟcW71_=N*E/C۷yc98SJHҮ)% Unw bVDYxnZY|oMUHr S t }:"1J6,Al܄Ў-&JΑ .a)M)QZM ָZGWSIn5 bK\*~w1$/,E 2D!P8aUNܣw>~c>âΟN?/*Ψ˖{uaYT68|~jWS>I1X|ƅSoć9r }\ƢĆ2Pw;*Kq&jWnz ;*5i * *N$u`d:˒8 \7.bA@wzGkx` }OLuzNǯ2';߄3#eguֈ_~?%Ɵ.aY0(^+^oAKINhhY&R@Ž4Q!*9y聬Ҙiq KA?!'X%xZOnZvdbp9Ss\Z d䙞D,,׳-dR< ƞ ? p9Qu~.ҥR&jnX*Ա_w|)4bxiO'XZmgƢ]a秋v5e`)Ǚ;/"Zyi6AT,;W7#MYA**jJ9 &kt4sX>?BZhOh!h:|5kmj @x: u\-bґL60~#Uc#ñ&`GCD{pՀB(5$Xt=cYiКΣ>%_%Sxi:nOvIAvJ؊MJKWVR@Y]'<".z[S$99uEcXt4rD=yu4 4=ZDq Cۯ?]d6E6tw=r$kz`iǃ}tl7U⢔BvgRsùᔑ(Sgߛ&#~M?={_ n8[.ۗrcW5Q~޺y7&^u͙Կ5R~~*=r=\+YNaYysH HY/B=B`zx {V .> fZ{99Jl^I8d<*PiP T6.vI;v Q>)%ث-i)&D<Ly@!&3:vұ'PBsDaJ!\j@Iu+οOkLMo8y<ΣlK]꺼lt9]iZJ,LRr+ye{N̋`$Qm,_Mg*c/RݢqY,,I6{ߋAmJ產MTӃdKAy[HueNv^jpA6?˔K3draBPyũ,xו6.뎧C󔞱_ Kۏ \Ȳ7 rm!VY%9'ol^&tq^s:UԠMXh}k 寳]_ SFKW9ھ-}%Rq%ۦ)gs=-wnQzJ8A1g/XM4s@l WRR=oJB(4 9huGrHmښ>Ww|ՐgrG 'm()ԭބ8bQS.^K{89o{%hXw:MK͉8:Qu"ל:oZmT%#G]/?E\u=v@߈Ǎ`:E?,fUVRd򪩵a7bY'4#^c4gp05}`mq0M`^:=e pXĎv_4#O:u) O9#i۳#hg8\ ]S'."o:@r (7I\v[)#H~SZˈ= 5k BS?0iXEfܿ_+:]yrLUYWs%rvj_xe E }%/ې>QK(9eٸFVRtם "wYΣՙ+W=r?r˜ijC`4 +5 ~ n>5"qoF쎶Hˠ2aj\eP^AMXK ѣ"3EY]j>$Gd Ae )W GrL ,BK>B1;9t=)B*`Y?}Kʩ\,v HMlx.Yc2Gms/lp"aN.F[;ff}E}ЬV-x8_&v8yºLvcy>{W"laBX^)|E~\IJ{'>) e"-y(ZU/^UQ r̹}fzx/YE¶4w&ĂKlW5Wb{>Uv~\%d(0-i7DTdd@s/;ng?4 \wVvY5֤G&L]5y!cZYe lEL=AH r/ʝ^q1k_s#} ԄJ o{~Vz4 ;C 4!neQiWJ%QF(KKYcnD\Yj踓= Ue&} >he !%6>Wt"1,mSuڕiۿ1EUƳy_VfmQ?$PQ= c!-e^@q;[.8(n|9B}]@ ˋ;C_T{,PE /n.[&Y Nh1oPtNc,R 3rbƜ$Y/Tϴ 1r*DwufMk;սoAt%12XsqMfTiMX%!*w5o5}opiF@MJg,]?`E+/weC"`q Kivm?C|vƿeQqԿqpضoRr}[]Hf2"r|>E !ק;_Kr )}tC\)0y/Ims!ƕ|בHh\tz5vvl%BsP s B&}N @0~~فޞ5ݮ.C2 W(VD8g>[eA93kzO^wd 3_\ʜš~}C lLYq,f!;iǐ;;5Jg;,-`*ཷh;#ͮo~к%TUMHe_kXzei5G?S礔+Ak^t щQEf%۫5C=tHY>QJet_nhdeeMȬҸBռoJ*2~&Ra4Y-ML`N2+IJ6%6+x T T$V4XK44F+4+A?*?-򾎦ސ-Ao6֖A8Kƹ*+s:QL?"T$,Ro?˂wL߷Uwe{ƶ{ܨ7ʈ: NCe~Ȫ)дl*V^F-SΦiI[66x9Q>Ҳ ;["M߉y[t1ݑ>Ap풚 ۦԖVͳ eQZ@Iu?'gO\bU@i:ΛfՂEYxC7픓,^nEW\/=܌;86MA`قQ}50TU{>"=.&mDE1Jq_ppSKk_ eeŋJpX͍VY>4}Y`Bw~73'^b'f 1sYDL,*.96~77܄SD>V^t `iJN}_KAeb~a^4Qf+nT~愠iH3xT1JѶUێO`G+m{ X1pq}<8blhDzw؉dsI jԾmJE5؎Hphc-o+22-JS#HP9-Ycl !XJ9h>5$61"{*n(sOJ7/gh[3hMihy[4i(w>Cťٷϓ;`Λ4=;C Ԕxop%߿X9b9ϻzzǷX+BRv+U`U`WQ?Ď$f;Af'mAT3I2bgW\5 $ZV]:m Z"ƿhп9Z霥;egWq싷S}ùL=l2Iޝ kui)b{vbO m#Kg.lUe7H~f ۦ9ɏe]?It!r'ӋFgڠQGRʅEp™ش*3!y4KëG@ňی{) r.%mӴl=}oJāػHhSbSJs) DU{@zmQް`EՄxRZzHU8ͻ q!YpTLL%i4QO9Za F[Lט0Jf-ERt%sf!SA)"fvU);iiQ/t*.ل,MGuvm9X(>2ZdيB /p%M!}?NaiW ;P.b-]r˒,h !pqԕA8ݻfSvz\~#Pɤ4VܤsԳ7Sp?v$q$VRL[|T/@ 8e6:"2؋'W9fJjm ĺ\7F4PoYWO;^+OZ8_z֥7,su7Rh2_x< Pr]8;E `G:oOKPb=9Ql Yim\)\f>0RS9%SdfXv^2p8$u41#rBt#X.Զt (rc|m9y {ӛsO[k52!%rV5ʒTy)g`I `'k<*B  JTƱLoRo;@՗@|֣f0OB$H}qB`*kt`fmrh/u RD ekhx֨A]zZ@뮗Efu6}@eԮ@W>妇KIբC-:*[} s^i9+}_:ŬSؘ:»ߓ́иIM 'UQI~@b(y PQ`p1hJ޳;]@@ Bke#'c @Ρ珢*Z'h f?7cn~d9/U6IMDY/ af ::^g̗>z V4c4#f+cWWSddPk-#4vD)h c r%ʕ4ww'ha &۶JJah)֙|_h9 -'Fo1ۉ D"(堔@ , +)#TSOyB&)mNk9B1"}]80JgeءRJ(_M)mʅx-&T>1d]@YcJhZ@|Чy ׾-h| 噆gRlu>MIui<.4C)V s]`WqΓJ\\kPwFfw-JO=G3b{:|ͩ2<-͉_xOcWPv<6La9U_GѺeZpixNF!m^ gkXOm7ea8uAH-ȄLyKfU4m Ng^6zx">zn_)T/W !Ls|TwlTBXp\.R1MeqP(HHLK:3_:qz()-Ywz\ 8We:EVR\IGEӒ >pB*J&$E"Рf`yl7cŒpTyDIǞHRta̳mTb:ROuIv,K:f66$;e~R3pLw|"5Me/Zkw8صtǿ4 ,Σ'eHU%p$t,]ZJxgHxQ\#cH$# H\=/PG$i>8G ^J7笡d5h!$AHArQ: ·eQ|1q{=L'2d}ZRZ@T-YA01j;8QXs'kel)<ۆ4< Z)Cǂxޑr<$ƙ!~:О{}l\Y#;Lr wϳ% ? ϼ:ˉH:,: ShR)Jdi$%_^'WkG ;5bNds۔V[Dh GlJp+de0 @[4"7N1."x;"ɶ/}$:͋{'윷3\X"Y$MzFN>1?@d- <倎ljhe"$PVIƮ7/SJpDKakJKL(~)iy q4r,&zD@d2%8䠊 {$#Αuds2?9"Ae6 =τyʨ &9E? -[x ,ȸ $ 9u8tYC75M%Gv )͐5`d$FIc2MBb (r,'K2;4&#oIaN<_K<c37-9k RC q3 C.i2߹apTsmZ,4XZpZׁ-^$-/wIgaUUtuM8n4N[v\H%(;g KPtck}RG uo#C[ Ov8۪߱Dw8kĞJh'U\V2HͳPP 9p }b? HS׎K$pHU< vGLsˊGq%RH'Q?yH G;bd7NoCf$EDz_ޏq8>N=ވ VFb2G3n}ߩa=zGG04Hb#rIb^%ȊI*)[N<3Î/da>= ^HzxZȲ),Ca#OI1VF{>I9%^LwHL9[:Gw]UFm[ӕ(VNN@F>i# nno͒uJwqZq'lO"&% QߕV UY m߆x_@SqL6hO0B_m0n)4FHBNhKNqpdf|Y nIMl J| &ˈ,M)\9aopN6AHd*DeL ۰[[#Pl"@|=v$āc|%ʥy苘 A̰vMͤۙoQ `\$O(Y|x mۚ^:SXR=eY{qS K’W4NsLDeD8mmXl),૎6KFjN>Ik#{2Б)57[JaWpNtboĨtfIM6TK!9 I2o33 `M,' (&Fɑidz٢Zc171¤Gw) FPB@-cWx/*5±D(R tkxhxtqP;MO/n2ͱg*+aJCoįe+0؝L-ŏ٩N]ׁmI-yz)Ø@|n͜kTh1i'!ۑ\g).LI.s%/"%%8-j)KM|<$b1O"OTVno058m5SSdض`NNRs=+.=">{K'( 1Z'[¢_C0k:d@Y>|9þ68iB]erǓB |c9)(?w-|#4-߸]][>u"> /li ;[``tؑ.BUՔ{;8] T ښ^E>ˤdLWiEurgHO/ḧp]nYЁ(Rh#y!al '=Ho8 ݦRWޙQw^joB:@s qƷ]Nc]T*G%U)B2T!6`sd d:JZ]ݻ;=3+fT-Uϼ~w|'}MhSpkhKNϡKI;\-ez-cQ9hi5P-/xַ3_d:m*%`QSK8V\P4f\.[ Nh]_2S~oI޿.L˷!eai/^2]fQp$gz_]PA`ZSߌf*^ # <+^ת%kBR^’L}ZZc|P79_hQpkcby8R-l;v{6S l  X1 Hy ze(c!~LkF2v3$3]WƐ޶ V?-ؠ߾[⛰ FcZ&7w[.6 Tm; #F+D(^ Pm]K<˾'IE8 $-doKy LS_3kRⶬfC7W >gTgDoV=)eD^je i/q^8::ү!5oo{9S)گ$zn+`xv9S.&'cA߿n-f0'fhG{`9M\L8 9b^((7jrF{Bǎ5%~dyӮr`\94OAI\j Up TYBI4 U %5L ' r"9d4`+4[o"ǧ,-yK>̯}#/lz=m/l*hh8uS/r?f;Duoy'f[vQ 0ڍj5G) 3"v&=*R\2Rﭦai (ں a{fς;.`ϡ {cڦUWLḛnmFyW#Kty*Rz2/Z9AGSP 7C6jYhV\ʆ&2T*Be(~k@\km" p/gZp\[QK|(pR@S(Gj(D6GGp}8P",}&gp1k|'1Vuu̼WoXz9s {^x/t0ִ_ySxUx&}ƒ3^&1ckaD~'p\Z)WΜt*M+y%MP >۵7G 433mуI[bD E^wopMk 1jx~NL:N>oGp%ayvea%`\ Ӕp#V} -6; VTՏ'RYLMq]kMbzGؘƈ,g}q:XeWiX0u0fΠ`Ϳr }),=ą|~Q$˝#}wQ>:`jCa+<.݇U]SH֋VT( bbJEx]=1,׵]|:Yb?;mf &ZY*sbUn+X W(l t#9wU=0N+"1#;Rw>~/;>ĴȢfɧXbDi"OkF+/cbfd4q"Cmqȯd 2tN9 sȃ@[(hH\z%HS\.@h`1'm3;ǡpoAw,R r3ɴ51\잃Hy;Aa&tԢ,zwpM+l\t,~u/y'48;)09nC4̙Z  ݣSMIn$R hU4}+[=ӖsEJ*IXF=M@*ԟ5k m?1gz([1l8&c|mͥsۄR`=Q{$9wz\? H6;Jino%Xl2$Vrlx(nSavkk5P,PA)@R2>  pXd(E<P_<-w76ށ>{pQ3ZQ 'R ٵt{NX07<NR-ܜ0|?l/X\tYJ5U>b<-hE!Kn˨|53H:( f(r`z : Zڴ,Lt4u6&<+nQBiyuH|GSP owlru2m B!޾RlE+$ 93bR=CJ% uU0'lm,&Yg]|_񸯩Is읫f"Jק>wjhXhC CLc; ]Ptɤ{X/cзv A+Q{dNk+Ebz3:ud츓ӓ@(n mĘIK@Gskb.,!.#^ Dn,\^3;CLJP _KɸQ-@G{ߪL &Orp[[ɜxx>CvMֈ=(Цx==dLNp ,-] J{ ;F;!W&Um2=x=yMş߂1L.cFO8y(e\v⎬fQ$r _p Yc4OFu +c,Is|(m+j'd $PnT044FzkROÌ|4/T3W̎A /E-{ݻMB!B!F6B!B!B!B!@B!B! !B!bB!B1H@!B!$ B!B B!B! !B!CB!B!@B!B! !B!bB!B1H@!B!$ B!B B!B! !B!CB!B!@B!B! !B!bB!B1H@!B!$ B!B B!B! !B!CB!B!@B!B! !B!bB!B1H@!B!$ B!B B!B!sQ%OB!B!.JB!B@B!B! !B!bB!B1H@!B!$ B!B B!B! !B!CB!B!@B!B! !B!bB!B1H@!B!$ B!B B!B! !B!CB!B!@B!B! !B!bB!B1H@!B!$ B!B B!B! !B!CB!B!@B!B! !B!bB!B1H@!B!$ B!B B!B! !B!CB!B!@B!B! !B!bB!B1iQT]2Ҳ4eEq8XmF,iJ$ƶ,̶c9LDUU4]Ƕm32QB!Bqӟy~@k+cLrac,I0'o%k4 XH8mYb1E2Mbh̶+*mc6$&&&eaZm~Ʋc['N zIOrzq8X;1LMP%~.MKtӅrxp8nEp\x<޶NvxtO!B!vH۶t=1V˲LUӰ-+q;vݿ{F@7(({Υ((WQ-UU۶PT zaTUöQi@AFfYdWPHvnY9@śǛFN^>o޴t22x(B!B;D#QTMt9QUU&+(j (j|4jK﷉gʞ[:Ķ-l+96e'XmmvC@y}b4AU -kRĶHb@Eu[P{v`{iY躎MFfid䑛?Br%=3̬qÁpMKǶmrr!B!+ʵeGBa.YIiZb;(j<_w8@Q0 #]0 #jDmX,q%Rm+^L,DA!`[v۱Q,0 ,&M4-\nWIhN,CT4MOE#f$&p8 b&f۶4oY&ea!K ¡PX$3E#̶a{c-4{zH oO?7-纎tUGFf9gdMKvv{𦧣i:M0M}K;tp8ǫYىB!BC>|̘Ž)n?xNo |{h$A,%`&PH(D4Iio k%ǿ.`f^B{@fD! 6EAUlNYb[Vbk-(  xq<wv>B!BIAHQ4]Ǜ7##P;EcDa>!zZp0H(0bƞm m t@mƺZ|B!BE=ii>vŲ,hP @,#F""xaCÈbD͂H8D$& &2:^LwgE4`6wl$B!bI`RUݩPc_HEo@Cm uB!BA|i5<*!B!}.'m5Ճ8!B! ,H 4 ƆAB!B >|(4XB!BI@VoOhB!BD btP0qDB!B!@|DÑmEqDB!B!@,L|( *fB!B1df&۶QeG$B!$ X8IJ犢tqDB!B!@44`wh>HB!BNOmmsF#B!DjilLrHB!Bt$ѧ>_ EUq% B!MضMH=#+{#B! >lm% vMUU<޴AB!Bv}2-p4U##3kF$B!DĢNFZF H!B!D; >1 mAZF H!B!D;} &XmAZpo( H̬l4].'BCc>klIJN\.i(}-PU^FSC=4HKc``k+i`a`[p4#mu[X UUAQPUU, UU1 M^iz4q:](JfV6n"rQP2sp{ض "b(m;qFfoyxI Y!#}Ԅens\Иt!ĐabڶƆx:~}M5UWXWKKS#-~F,bY&by&CM=X4~غqK>xUx1}1}| !b3/BXwXoހP0+߾5j)ضi[}[}ܺ7?|ܯ0yB1H@?sEQH!D0 -/S_]E0Dz,Y?EavnLu9q:8.+m PU&,"H$BKKKcnJuu5uuuBPKXlZˮ/lB~-EeD#QTUITUT 2lxhZ o~;QRRg_GHOUUn7rrYl{/.555)Z[?PR:?gB۶{ޅ:M𻻯߶mh@h4ݕoݖtHdL>jgd!ԔhuNU522iDBqzY{DZvN7ѣ{xb|n:S]]t]P[7^3d X!{mg 3v;2M?-<{x;]DgdKp̣qdBZ[OgضMVv/|ߐ"q4Yjӟx饗UVuG0H#B!\1۶L>}]sm|ʫI㇛֦TM#-O{ֵmo%ߐaD4:(y~_~0xX_7H#B!\#۶igrNjmnIJt88AB?۶yч5r~0rkKm UW헞 !}ﰹik'߲i8zʏŏU뻱WU꣏H(D8L]RKqٶi=V| W/0rA/sSZZX4O=J8'Bѣ ٵ6~Ou4UAT*h v|D,FU$mETӲ}*pȧgi.k.N 1u ׋$== ۅrێu`b1TU%; |F*voFF "HX  c?lCKNml]h$L+őw^y<4/D碋.⦛nJt*ظf%V.cqtB!DRm؍)8t ˁm+mcB4fMMb1X$30 3qӡ*.]pNtMr7l4&i859p\d4 vm_N}m~muOi;0b1ijnfznJ}}#H4Mu2E1nT !ġ7^l3nX;Aws Vxi:!G!Kwt:r`|&qZ~Mmۦ]](*cEn^aNTo`-i=~h iX4J,Iraw!7R}k9; ݷiDB!D@ްQ|ee۶ڌJ캗}U{  (ddf~I!!gm_&ODzz`I _5H#BW[Yxo4i2eY466Lmm-]`|m{6kqB6(Ǣ[$`Ufrz;'Gvyg۷,Ʋ:O|5[; 'ݦ*Y90!͍ t#>CmbÆ ^+W{nØ"###F0}t>h>hl #33s7V5B!ڠ Ǔ5lײL+6 4wy;5(NOGTWlLyM5UaҒfVF!@J8J|3: .cŊF1Au%Kt:=z4 ,;fxf 6lX@8j.9-B A ddcDAxd jwty(LfV׭~&*7OS,⺣N56UH!LSzy-]466O-[M$ a6mK/7M {\cDziӦm4!8ƌ3(-e̮W2 ),HWxӌS8(]t 8\ 774$Ǵ-  88N4MCQTU@?{I(˲(++㦛nbʕ?-EEE,Ӥ)B G J?2ܽp1ұк NT#bض2Mp' 8ضmXE,EӁfTWWm6vEYYuuu F8rss8q"saƌy766~FQ^z%|><Ç߯iZ"榾B1(0_0{#>P͍4ԕuyR>b)slf/ҒvBq0Jr%S9(uuuMEIem˲xKyEscC7_!B,r{)qĠS Z([~4رui]m82¡h$vEfBbәXn ڵkyx稩!zk6mDD",Zŋs=p'sW0k֬~~m۶kW^yW{UU!fԈaLS̴I8: M(:ZƲ,z-nn}pEy!Bl,P2_,Iw5UjMez¡bwIg($_XJ>`(Erddfp{첲2nv)<ޮݻyy饗8쳹;vl_?$| ?OXd V7Er0fd!gr4 Ƅ1d%w, >o,OR~ O3ܧ¶mk1 M&JB!w07a⡒45PEeȩI}TwQon]KPbP1SDtxaDBq`ii((37l} NIVہqe Ehl k  GgRlv|M7~̾\~lܸdgqQ̛̹39夿#UUJ㬓s'ïhFbPkS=\.W" J,BCV麓 u"cY]Os/~2ٹui EFx*bwU_+F49ASn) !r'Rb{/ij\`NQ'%Ø?1# H[:GpʚFvh&&%&euV.roW\{o;v\:hqL7 2̞>'_=2Ս LӤn?>wzzzRFZq{ƍBCSL8fP۶EuŦnSN7Kuےvޯq8ϧ( H^C]KyqIK-BC-0e<oo{*deqQy 8jX2RO8egNS';3#&Φ5{|vBV \}pڵ\q)'R4,oY?s.}Rr/ıGN䷷?{uWYYɚ5kø{ޔKZZZL4!v@!`Z])(GvNI>D xӺ ؽnWU3ib[T'>^QB^Ķm`=s=M7iv99#__7OrY^9un(ʭʝwćި᪫b͚5Ig+}&%9}^x p:-4MK A+vxBo'f JӈQQ.vi +)/*w' ;:\tSTX,yo.В:›>(>@GߑH_Z]_Wd+㾛ϱGNHYOf]N.<{~%GL? }|I4.i1iܾCfVEndnrO3Gﰭ  q-PVuKrrr Imu>_!8X[`zDx 47U~U^:-VGokjB@-N;e D!vݑ(<0 ?e˖gvf7B.)ΰ0n'v q 7P׃ 6vvgggs.~jnkhaIϝ=nw{=__qGMyq]wN~~~Là|WمB!_:?FvdevymYT^i_۾TՁU=,+c@qEpg,Z_=QΡk\>ɚF/8;~t\w #KLnmfɒ%/x]3 XlRٺu+ .LLr]N]t{-|&wTKQDv+>Uvv~]4nyLܹ -[xߕW^y]:o=z4W|38[}EI? 7x)+[1 k7,Yibov {?45 }]!b L}q7n8Jm..$oبnX{QIyIa)kƪ9CIƺZj*/ j:v6,O^{51O<2e;kBa|lSҹfgymY^^{wEۦM*?t_w,G},UP( /)SB4?k>`_)G0fdA}+듲f=go#'$VmfÆ 477%%%{-j45J+@!>lTaΔ^goef.>6{ܹ ;k!bp@U5F;M뿶E=m@s((mQh$HmxبtxX3Xe98] imi+ز~ U4ELW_}5o?iTWc咏WS?xA]ד&?1G #Uܣ'YWD5Kqe_H~x. ?q(yuʫl[ltq| Ȟ|.3?3STUćnJKKϓB:u ,_!84p`ܤePifpvwgPPQpvtgjAknb+\1;l" 1,buo+(dQs{H ;ɢֶ/{Θ۩hQm?J=xJKٝ}<\5ϻ> /ǯ߲s]<5^0s>0;t:+0b4PB~w@qdXeT1dd ~pOm>:/޶tJ\mISLd놵y)۱H8ԧ+i㚕tB!V^0LM]rI)BԬQUSɋo}xwz(//?f0rm`ۛIjh6< _~9GydfvB!ġ`.WK(;miW>;ᓺm  ty̾Q@MZ܇&*oZzš,b".!Mu}7z 4M R{rd @UU555mgO R )GŲx詅{u?عs'`댮:=몪2ymI ;v+ߡї~@fffiܸ݂B6{Ņ^ƌ7"iToHyc[`}6&N2ʶdö-^Th$§wUK?k9(YiW%&WeaFZj*(Q~1EB{2Zt]@Wcccs'uW6uͼJz#m-'tVU'! ( %јͻYqn`Ѳ7;1Mk.ϝٹ0m!Cc!3[͍[SGsF7ۯ,-HTbA'U[5UՆLp YsTkiZ- ӤGu]3Wxfn.O8TSS)HPuzZsv}B!;9y#, R^&}NQSwk?Ķ,4Gt]<~2"pwL`|EQD"(=OM0[o5em"m۶{0 \28YS0\Džӡt8:{UI7D #BW5wy{%wTk 3RdŲl}]^{n.B⣲mVo|)5bdexu ˙؉14-,&Q䣢z*kO/@( cL"1'UQq;9( /nMC(? RVVm +++5dc}]C!`X*m=_\۾p Ǜ #Jum%SUMY1Pz+(Vġs/>u5U|lY{ס* ]GQ.HHq8:?Vڶ-A|AZ "L0^-+J|ܾDXre_SZZ}x-۶ lQɖU<‡8:r:PU6(iaXeYDF2kTf10xaú/v#D_2  8nTU%+'7ܼ 1x3{>Zj([̬ FoѦV_'?mhIoҴL"/qp C럾?|"8 Ҷ:Iae{b[(J1>NX,e]wR2th$Du~+djŘioZ2:tlX;:}ܨJVV'|2_W?~+iLn!R1=isa޽O׮cZRO ӽLC͢jBal;\b=t4c9&pkn_(节;ur.FdSƹ׸ÆIs8(qƜES2D/Da+Ssx3q2ya$~^~Q⫬Jbꪫضi={};=Vܺ4MZ1MudderΑ)@ ǣv?Vo%hNy_A83OymmCLEBCDobraYa𤥣jV˲!G}^O Eaذawy|[#D?[˻^um[1"Ӊ((Bvvvs3ti.^fv' J+lƩdƍ(d(@4V螽x]'"$8tnwb{&s9X!6H(D8$+g;CC4헟- 9`DaV.?%=3ISgpI03xt?>|9CR:=X_dz}ĩ3x˒d b^4o:EG2q N>̙2UWID]SfQP<E~f8䧮vO?S ) .%ezPNTfNvCDZ$_[~ k)?77?L6DWWWwP:Jǂ}v޺:|taBZQ†cYEeqh*]cCI4޽ ӆb=TUa^8NP2]N,C|(he3-mc'0* *.Mũi9uܺFAӁ[pC@ݰ,v5YVY!(XXX{<,X,J,XW ^z=m֖f>}V,+fYp!:W+ 85pC~:dxA( ah? L`O/>~k!jv DZ4QGy}?0SfW\ ~^< q / }۶ؽku zEQ(9(eTUl ݳ1w%Ӷlp¡;qiJ.Nc]-aZ}-: k87ʺ X@PUUJm"1QyY H?fca fYDM Ӳ1, Cp !}Tll Cǡ)4",Bqܑ7}t.@jpܶi{:6X ˆڹZ2m?ifggyҒ a  1UW" TL!ieߡ0ҜuZxe m۬t1_.Hš;b*ʶxiYګcvAc]-|#phae^kWk!ɰbf},1png* ݾRP4~%#aOSާN<M4cTDz:;;P1)蓪em[pST5ezhXVFpgyn#Օ믪*cǎ_:^z)%%%0ҾJ}}}kNN^+bhL3^EQt:sLn7~@`aiwh?OCa]R~GI~$]nϙ_bT,w/hG2':QUU0:믿9sE+}>_R?2s/,CM{ /reqW i ymn悹aބ}™3O1kjq.3Gv! #4F@bboSykۿ{? ۶iលo?tbK'wiƺ( q{TE0E%gEžfddL_S*v1_QF/~ iR]]M y~ANWb2b^}}_Yt)>(hEkJMQP]:iN Cík芊(J|klKh+"z,Oo/.'/\;&lœ9sz|~'p.8XHcf|5?f‰ H.۝Jı%,8q&G)pwȮJmGu{eٶM1t|[Wֿ/NIP냰=Q9c /=UQyBnu} _輅?SUc8G)3bS!HMI썦rRf7lTohMtQq,L~<4kvqE.Xr)߹cn7gu7x#'O .{)¤i3ֶ"322;wH4~Qm`6`5!fZ|+ m@mmk*iM*s'bxឭt㝏&ZEc1jjХ_ilw\쪨#`Y񡶏 ,FٳCM8trnF ab1ٳ'1rd^OFwwNmr%eDY%nD'w%u׎;M_o_M.L1p„xLwzxcl鴍g/ 1Ht xpɈ) gԅEd"NgOlv jt U J^ %0_H( K/9*|>:~?2{l6oL,j`YCMFEgŷ9s-n6k/aGC`(Nv7j+ܳOvnU#5U[٧MJ}`4CO:"īdVŞsa,[1qq?A@ ֭[Yf 6l`TTTP]]M$!'&l0vXrs. ɔCMW6uVxbAz{t9V7ag% X>}537ΝIOc8{hIác{&4u=& rdgƌɣYeۘk((}^'0-^{w9ivbuxov:pvB@|ېMcON-ޖ9"s8GCMK6]%YB Tta9ز.Fai6 ueCG/EBup )3hDzz^).V!^ .o<([YŮ]X|9K.el۶ \sbo7ovwy\𑌝4?/N+ޛ"q_!Nr:;%̝7iu[%+l5XFPX[!?ړF*(̞ؑ1c2~$Eòir0;e}vv6`Y6 aZƌL^SU}4`rnZcWUO> v&uDD̜ņU+:Ow7S ~Q2n?>ܲ W2c(Ue0X!DOt6UJIzFޠ4 wrU@fvջ#a?u5=&Ě{UK( בJ+پiCTUe„ ׿}g*>7;rCCw)X[?O %oLn !W Umjwذ#TMd"}Ѷmv <#\|LQ~)(54UM0 X4I'ukRz|_嗿%Ǐ% ]z~UVҫv"=3}~} qMT߹sge^XӴ#=~MvfZwnv`OqttfݶsF1-{FXmۦmZ_M+ )3gqwy'#Gᤠ⫺TWGe16,/ϟ>mwg̈OO]p3PݸV_ߍOk7o %5@ Y.$#sX Zه7P50 *躞*>9VWS:/kR(mSWWDzexWرc~_&]2c3f'/ P2ˉF}5z3y{% mڛyO^{1[$;w.+W5sCpuX{7|eu,[oh;-:R\pz] eCT87_GKYU YaKa65ĢQQVCi郛f1*#z)>nJ4jꊢt:x<ϨQ(--e̘1<,^רJn^w65$J<w=c9/1)3fd/hݻ4p1Sx5M| ޘa+Gu]s~nj3z}>=>DH4/.V0(QGnV: Gi hhi 짱OSP8F aFQ\.f.{.Q]]M4ytx{ƺZ/%=w*0P0k>ɲ>odf~+r!wj6P{}-4A)(Jh۶1igˠ.dٶieÃըqk޳FYv>]p8yxٽ{7`OVE͌31cc„ 6NA̻;u]bw9aё֚, (=YG}S9W JͣH$̚5k7o^ܹdff& n/^ swk*zފJiii\y|k_r)|;H|ϴ,46Y)^[mmotr?³9 8;ݻMO.CE8ⷿɿq#n7dy"93Օ#+IUUEEE?SO=:ɓ'S\\=`˗$z= u)=MkI,~M6YNKS#a*xذz?o8¯⊢̜sKe,[Ozzߤz^Z,Y®] 5/ftTM,e"2QH6+'aEŔψQc(;c ~kK3ïy'LطC ?ZVʮee~{e2y>T!A ضMc^/9%RCSC@Z"}ŇL.GL4f7w^}dv׮]|ǜ}}n۶Yr%׿xר w(dffRZZi={6%%%;fL8ɓ9cٺu+N7ypW.^.Օ,C>xUVj"+s?l_Jact޹28>;YUW]E]]<n6KWmehJǍ +K~N&ygNzDžCp:u\hjSQȶ]*f_4SV4 &?Oޯ<]tvK,ᝅoKH$B4ô̶i^4Fѣ9c9s&'O&++k@wzMPp8IJEvŧl۴eVWkn"gfoO9igf_YG30y5$oݰ7$OXU&wCVΛ Ǐ 6TmMkWq_|’4h!_`LF`Y4%#)#r7Q#^˲h`evk^^bHu\i; <k|'_4ә:u*'tsӦMuuM4_\>YIp(dz>EaV^ybo?c'O ~3 |uVqJ~YUeIm;jȽwFu#-=c8893,G}ԧ._͛;5- 3j[U6m-c$MŶxWiczEQ_"DŽ 9sgpgBkk+477ԄaNff&呞Nfff`WM;U?y h_sF,a +D4xEoΪ@4/6ƺZjٺq/?(ٹy̘},}<ál'Dz/PO|:ɏwP[ضKyp?,ЄL6X4Lyٚn[+(m6өj/T2R]85~"Ê;lwޡ^'+pwd~G46m~:r GqR7E-ɗoC~&۶mgx˝IOo~tj  ~R6^C }9]] J((*Π77֮"Mݾ)ă;\qjP1iL0 ^yo}[}:/Sr7ꫯR__͖۶ fVd[Z}TڋkΟ?+  XЬ,1_[|yR[Q)E[|ȧcʹ45 1MƛN$"a[ڶM,<oʄ)88@@un0>cd v|HCs"#㭗[?9Y9=wBހ.ږEU|5=;\ h8䣺r3)7 XNҲ̔uKP;H#ڲrr9zgصmKU|M?[o孷^݂&Ng͂ 2eJ'6a`eU5h'E#F!(m:+B.{+!\F(:}8JwDw' MӤ;~=o\tUt_XEg]p1?o|^vmݜg$橇c}WL N7_Xd L4ロ 6;yfCD̵p\r'rs'!+]Yd 2r>j̀<~Me9^zVcĒs;X6Ib&>kh{>mDXrׯgk])|edjNmL UY :j 4\E]^;t eTWn&@KXy"є\P*'},^|¡=Y6X\xxl۶;466z*p'r 'p2z^6˛"ث  !/ X?P H<۰.B,eͲ%Xu~0r̸A`#xVAI"0e;7o_ 1 ،4Qk5*ǛI~A͍4ԗL4::ofUXrjtY6;OLE ({EIp2| ߧEl+`]Dg3?w%cmTyN0A_&S;gĢQvnĕ_2s~xᥣ1ӹOeImwn~w|8C~/ю;ذaC4MN-}ms&|^^z45m eNjǫ' '`}%ԶBK0ͤC Y|)?Ϝxh>w@ظf FWlXb陙/D?W-ӌQ{=cEeأP\ zPH =E&U7T"pmے02sW) [?~%+[oE8򜪪t:9r$ӧO3dܹ=>{lU!¼Zd8SU+FڴcHv Կ0M 5޵0ߐ6vM{vEk)uLfwWӺC^?l&/q1GN@w8_`#K >2MW~ uc{"ng_5VV, 60cƌAO=3t޲x9f>,'oT,&Di)t?Qm(oxJ˳jW@ʉZGecF~KWrrHo V6oo7BtgQ^]/gEQy ~/i6u5;hJ}n22 z8EUF>a55e42LQ@UCpp92cVlfҥr-A>:,^~唓EQ`\}<,Z|f)'6m M1' ^ -\ Zculxɔ4t{Gc~ aҦATl#Fp*vꞽs(8rGb|2*@+bJ_DSu5WSvd(~w0bN+ +]\ġ0e,E; T[j}48qspǃGg֔Ƿt1p(y'Hp!!4Mټ=u T6{w}.' pK!_gH+źN-n( GN>(ߵKi)Wu(J MȔt6ﳧsWC|ͤMI^^s?O7n\} u* ;{7 Yu ?N1Փư/|bn#Fٲ~-y[WwԸ /wsG⣅o8r֗xo7~r+mwpIo… ;/tAs'NLLW+C&W]T|TLPXcm '΍T{^}u܇O~W]}یx'L5Rܼ:k ̰sH&V[Aڌ:VZF6ZFvP0FYcWU?Gx|~ݞOzt*/F,7/`K-[pWS__v/k/ =Dד 3}(tYpx~k(P .B8_&&{1 2$/_wkPwlvRUbB~ڶE]6kwћ.w#FM_Ks55U[zuH˳,:ГN>J&_]#X,Ub¿}F_n?oпvSk9݃xOKTz&vWwLo2,@tl y5#?I:^u /!Ҷ yd8ٹm>yX}ZzfRTZ[y{ʦ|Wۏ&;7CgǜM57qU?aʕ=,чow]V^)H( 3>Zm^{}BV,^z"0<u 8f xz~T N9~tr<[ ~}`Ƿ,[&-!xfF'^ `rBek-e- qPdZ)>kBK!B5ERKel1|4wdG PO~'F(ޱ/!`M]vqsg$޽VbY?2wH? g̈́΂&z&UvՕپiC L2t6o3*\ .Oҝ[C4]Os;VBԾ [(۱#` `4#=ƶm*v;SzDp&Tm=L}L⚶ea[e &t;ԯYJ1m4T /WhjsAgSzvA|E޶WQ?P]FE`71k~mA?~E2L 9O %FMMOIûXumպyDR Sqw&2jʶo墯~o^C֯_2*aP^^ΪUx8Ә7oW_}57nL=^;bd*\sj_PퟜΉO2Um  ؾi ,m\ϫo>h0u8\9InځRJ^Z^,w.@[Е@^^ y~",>ɵǎ}O y[Y<0!}^޹PW{Ӳ)1֖Zkު{x\)+}Fm;4òlQs8+#$N7hlà?!SAQΥzi~E:zV<]KϢ;ױח꣠(D 0 6 LڧA3Ik陌oڹlUT=| #sR~ڔz>OߋmXњrT +Bȶ ǰ\{_=/O4[6kn+/<)߽y,)eYRSSÎ;ؽ{7 |>B~Fyُt+[?^c+v'ݧc{軛o.WL*279n۶佷?koफ`2ȁ|듮Mk?ngT'B,/^F}ÈkNJCjq,gCF,.ð,rWe$-߂kM`myxt>GN>oiS"y|: =`þ^u~o0}MmX!? ՓF羚X‘vflˤekd 9 `E! ߦVŷTBe ھǰ% }>]>g]pq>s2})nU|uU<أ ?;.}xӦ¹{,jx\2V|y/F,Ɠ˴YGs9S*/K?ᆯz 'L\xz{y^Wa|![mu +WBuPoSsW'] m+;˶m|.׭fꬣvlBdfu5ۨޫEdYم=(8X2E9,Wá` uj;'O4|yw< SG+!k3Ǟ0X4G ~E&vCSy#P]Yi[}ZWq3fp '0k,&MDQQ/VuuuQ__֭[Yn˖-Z0eGM(> }~8]kn˒ƢX'O~( rw]SNj*>݋{oSgMQ0d ɫe 3uZܴ[]`4'ĉI,OM aE|ŏ;Μ.Tă kێ>B|mwuv~6,3 4;;oJ@>Ɔr*z>+¢(J‿>IͶ^EJW%/k?`[Xۋ\Mhm5 \#b4'+۶ٺq-Rk~|!O=OzYj*AP->ms?"//Nʌ3?~<#G$;;\҆n+0xy饗X~=v"ڊa~_ZPUcw3~Tf,Gﻋx9iǍ# ogߧ&>[;|׀RONʔVs_}dau\G 95_yn9 K٣iӟ;t)gτv`ؒlR 9=Ο\lOj?}S|%^´LJcdDN<W4 ʶoA qx:WV_wuu~+ݿXmvion}-vA֑i}bDa3,h+Cu8)j#cIFw䃢bG4b@ޙ_eX!?k}x16 (*`+R}'j8 F{yTn171i쓜zι]p O:_s5>xriNCwOD!jq цc'ڊϔO*םL7\z"1(l$:RU{DI|A/ O_u P֐td$g# !~ 邁fvnhw-DEt*i=[WKwkv;¶*уo헟sQN8'ovjى}5cz*{65 PlӠu"LKU{YG#e5adU=Z[ @}֓RO\oZPb#U=)8hGO0GbVk@wR;69qweu|,[>Ņ|ިҨfǩiTh4EDm6v;6 ۍftbXp:l6q\dddFrr2vJSf(Ȳ*JwV+a 269)^/QQQAee%@0$ :bFK9HnO䷿-f{gػ>IP,l6;Nt\$v\$  Afd<`'~/Eou:P. rE~u-h剿'˝t ʈ:k./~ؖ% ;T4/;JE@E;mg%=4ds&}%  n(Ȁq? Ν(TpL3p6ƽ>$Yf a n0.gDffB! vyL}$z#kt}njC6] =赨uY[wT"2JrZˮ$$EL> 7~Iܳ[x&}04 ȹf7 p`'j*O{'ϡ1T/uU{X5|{bII%7``P@8RO\кFdIME$km>63g3yl~|=lY}Ī?>jQᄎaY ilLpm69`˲a-F(-˛O;)%r]ub>CBvOYsĝL΀|)5a NJdĹߋʾP,y,q븲zgp:6s;u:S IBæ+tۜsGyp/ٹecT׆P(}oL$ ̈n0  ';D ,?-B+`HVϞȼT ׍Me'a!TEŽQP\#aq/=r4nfr1j; 4 Hc}eqP0Yikm7t/b(Ǐv'1"=QڎI:=@ҸvG#I F;UGd(Vjb0ޭIf#(Nڈ{܌,w8ȯ0԰XwxdԹgS@?3f9WLsvX3/O2 { I[&,ݶVdD;Ɩ=@Լj>_ s|uLc&FSNšCTD 58RgE9(M͎cdIQ0pUY!fy.9p8f @n!2?h .]ש;w6voBy!+|jkW;ZB!{1.Fp1cưbŊcOjz)iTWuF݃yth'>xbYbD4Qo/Z-_erYEsp:onhhǜHUG;.aٰ b, icǦ> 7|cJ/{zIzM6$Fa0g^20O66:z~?u5xꩮe%TSSUI(kkgH$͎ftBjzY9gfv(,MB4w߈25MW^+`ܹq{ʔ)\.DaULvBo|=J(qIN' i07Um%a(6uӛ+9Bu Z)6cجcA?&6]m +pT5F EKlqwH,(E(]'B@P^m{9f쉺8~Ib1=֕$Kg҆!CԖO aw\+[_WFuUQݗQU-Uh({uoJ2 .GmkUoBv'c@{l&VAq04 "F(HxHُ=j2;Jx6-p0Tqӱf涖x=ʊ(!= q.*g7^LL$@rJ5MCSU~`U i⟒jaّd R Ϣ0V}ܫgʔ)h2|og~AKtBKlRQ]T'/ ֈV c'갏6n]q ,z>hfi4Y]a*D_>,Q02W\ޠ( XhY(m)'ƸZX=F'ASUܓy% 6ggbb҂,upC2 " 7i]7Sj8HM]r.eTM^V>?4SNm$\ HNI>`>>^cD: PlcIow熨RfX3#(~8i!;֮`mq# y#>DQlv;)id䒛W@ Ɛ6z,#ƌgĘ =!+ _6Y,nbwadz뭸0gΜ0ضa-e.P0է*- 5x5!&'y𽹐& K`ڠw{oRYVz JJ#¨?iDea } q^QƧ,aߚ%>6.:}(51uAmu1E7vYLNݥv}PHa|%[q6,}.{wlJpX.$Kdݺ#h%-+aĿ-jcmKZ?N=UUUqˢjY"6G_am^iԽA%"h+U"mNrSړ!/MGCd8;*XGyPc:rÀC5B9/$ۢaBl#3׎=دv: !x5q &&&GD;3~R o@ w&%2FpvPQKCj0bQaZaf1`LIZ6mv)܁Ȏ>AM}TD$`olFk€qpZhaTO|Ǡs$dS\X;hea;Qb1DIvtQvmDmU۟|]Q𧌝45fwO>B|ޛ}÷^jحgm9P.Á5=W 2`DvE`_~OMҳ1ӣZX=oފXGNPYx2ûzaM-ۇb_wo_N&p.Z'/mJrgebbiu]O_JKOFV JiT5zaU1%Irx_Վ}1"eƩMN(ŕkUAT@|ABy%=)" PU~ӱk%= KRg)\#'>|2θ4z T*z{L?O7ٴ<dwbJvljt*11m2sޏoQB<lc8묳ZDs `ǦQz} e3auVQT מt({4>f Ko׶ػ(*1,sw%oUUF|YgaqfaBE7""T@%>ZHBf eѳ111AUzj9omVǠ(׻֔PWӷz@0ElZf:t(l-7$2tY"ֵ4aVKh6M wꐤhT?̝C4?[q[hۗs se] \yE/f/e̺#bZF .711fY2{1N{+3jM(c]-XS:2,vcDjs$ ";^2" ǧŶsrH77X'qÄ.UUm۶q³a|xP0cK,"𷼶f6IUKMmQ3ͧà:aXykÇDx#͕ @4x1>o׍B$λG1f|Z;"2\?ͤy7xw[5kiaر\{ ×=XRke3`hgvr⚿ua/Ύe!uYƲm2%+)mbrrB~[ӽ.W*rum:{}"z1nڴƓ$IU.X3s @q%3qk/ j]'TI04U_3Ŋku8: 1?@Y )T1v`p1cƠ( ,3`u1v f#cm5Z N9^ 3~=vo|K͎{V{cC=Whbdh18,ڮx*\1S('" Mu D|WY  f Ip疍޶(}EϼʷnAFjJ [ɓq:8NnFQ>* l+VCQ0{zh95΋x%"hK|fėWB*|'f]I8+Ĥ{V| S۔$cGSY[9x1iV+YЗe+y}+:Oz6.G6*M3t U<~=ݛEEuU?y+ Wcݚdk3E/9 %Aw0`ٲVc_ev/|\#&`IzؼlhbYE;?'Lz_u-Zij>OZZZr>x^iר8\ByDB͊>m`J?xvFK@ . S&bR|c*8oKZ p>e9/nYpĥ/4MQWW'Mks=w}bYWI*m3Y9=T }.9ap+,.Z)p'%3blI5]G”oQ~ep=]S))$ ;xGdkЗon_E~Ѱ~s55߻=qrJ('J5fjKڽd<处5JRj$aI8?s=YlWƷk53I |;=lٹwl۶-1c0',~}x-QdPop0rB)p~G(2>Nߏw/.NW3Zo*%W0xĨ-k[jKA׹/y={X{gAy뭷2dw}w2M/HxX'] q-ŅMZ[K%%А#IdÀ)/6;$3 l*V%}`gJ%HH?6 kȐ$p$r24ůP/lZՏf #){o-B?$㴋qK ȹff6a@vQz%9 IQؿ?s3 /-.&Y$MmXKeWOĤ7\.կ~Z\}ո#vovľ][% :D8b?k&9' uEi"*6tCDaTD2-~Рp;Q|`_b9R^px-\@IE?Z秦=Gْ %[`x6;I8Rlg*%F6dmTHJj6I k".k&ۨF{%I"%#qJLILc@NVǓay ڇZ[+w(}/:6`Pwóm o#Cz!1t 0:)s"˗vk<&&_W6r'ϊrvcܹ-^xᨨQ])њ.K0oH?R2Yp=Lt 4aX{>u9Oidm[ e Q4 <x-oAu {PY6 DB1|"Q`U`DչB{sO۬(>Ħ+{|LL#2%Ih ͎- ׊Ƅ:|AMUYng HCKjr̳%79)j3UjxRdMw3Fg 07\&:>z?9k6a5!&Ȇ!T-`(f%Vq(qZteسc^_#nDSYPɲ,8EFtƃ|A$I hihS_'VN0Fua 0КnN׺oM)M礷1 ,V+9[|$)(,]0LzCC!0 Ԇ{14M8^}J2,g7kF?;S 5`xſg395{}'_~9aO%A$om ՆZ•E&$ ژy*J&&]dܔp]d"J|F_v4Y ˆw6 @D9@D!8a|+n;{vRSYAfvS46PZ,vH t9^j|"N^r0E2$KhW4Ev ЦuAt'H$ 6z'("aarkkHMjLL/.2ӓP]0Z;EAƺ$ c]7 7H.Ic }~4@o2דe h47 G$hڜpM h?B4B!PTsl{=n#>z~fm >c&N!95 GDytO뺨hXCk`IVis[i'G 9]Kԯ;YͭoҵfE}<}I&="Һh( DCL8]%s*=TDc}01AZ >|7I(1wjo $8N,K}qMzwR2CQV"NppUiKZk%/&ʟ<$0E4_~TBeE l6V+ΚsAI<ڏ^r~ǶH5bmDTO=.DoLLLPVr5_|_z5yꩧcر'?; i*{O=㘌_4BֺnM&U_<haxm0fQAYI#r8XjL5nr79n1f U1Q0`ӚL;c3v*/C0vk !lP !77A6xjw-掀Z,/I"z?cHBA(fE!"j(U^gYngbDFB!̿¯l]:N"#:&GgdĠi 4 z`F߉lݺX^׈ '\]ZW}4N^{kٵ/w~,SOJ(g:IN>UٹecabbJv~uÌ8%JP4>cJv^9sZ֫{ޓ hf%/o{d*/"} ϯm ?=&jRcq#tMcŧK:XXêf$;`PV:+5DNF_jt+ʞaKu'֍SElQ<8ydqTc}I Fh9rZf:,#GHh"tΊł(X6v$7dRI$=d%߀Qs8QSpw_1ӧ3E\++AI2o9I-YF(@,P[[ IVY}KJ:5__\g}:f]š&~}oq,^_,ZPEIXҲHBÚ8i*̰c>z\/.㣏>rEalY?cpȑP60Nm c}]!  lx6v+\?T]܊!`tnk| 良4A1d߮U6pF\ߝ]/!t"|bi0_>sEgЙdP\BsBoBgĈ,8yG2b6X 6lNC]AƺZj56mh QU5u懭a``u-?_m׉x?w5+;r&&&qegק_;!o`DMM -"+3U84U__݊st]V[Nգ%uݹ̙1Ei&qYV,DlwdÆ L:a8\׺nN \7OGVFt ?\_(tqNvWᾺ7^p,flQ̆"X?6_GWⓊ·n1߿t 3fdIJu"-&jck&p!GO?SONؾv&M͐>I꜅ +JiX%}XR3 5|ޭiXU49KZ#Km XSYzOELLgSR'Ћo2 ج@0w?5>>5;&@8<+KL%##$f̘!8wbo9yyyHDjj*YYYҠ.z4$HmctzUfF€⪮o/Iahd(0{wlK,`g@z/omے*#_=qMw,;61-Lc3tC'8hr'1dW--6/M'\Nɖ;%] >xF>;ى`י-;<@1h$( 6 Xr_[8xϵ4-% k?C'%4 eKg/{&&&q5~yYAu% Ww/e5:.ZMdPt?B}>Y8 ֬[Gqq1<䓄Aa U/_N]]k׮eʕ–a0"yB,tUԁB Qaֶ]aX*e_ǂ}w$^nT\{0:d\5Kh3|[$9-@inbbrnkR/E}~9#f1QnKzRS: 6._,Hwi"YmϿ}׈N7$>C0!`SO@/΁FǯcMG%7 4Out%߹;$mTu+/'m(KFv'Z Em"q2{l5=9d w2d3gΤIl0ApsMOwaB~kV/l]!;bﳆeꮏؿkGl=3[C$VΝS ~`Ug;i`m~?0 ASX"J' WIU$!Ymh*D7"A#82ޮ$wz?JR*.q.a㱤e!;\Bk Rl00P(o$p7߰j9kۿ{N< Ck+i%E׿7]+hX[DV ;wdd1@Rbq9Eh?q>Ǒvw]Gf8Tx(`Q= c Cecpx\ EHImbH3ue2aaMLL"0&jŵ,V+N3#2 u4IVc,iȎMaQAɻnܣ'GִL$#w3I?Bf4"0UT ;\~,)[UUmI'l[psCGjU |+xgD}VcY!hmCw 5sR5=I}3@7' ? +%ᐈCyi LanXK@jAM_(!PZ-aw0f D"K'Eڃ{aqΣhÐv&&GƤfB`:ɱ@dE$YFlYkdk@ٙ%%PYF8mT}o# .?vbGU?1xWXŞ?5!Yx6--Z/c:g!w®*6˾uDc311i&κ2ܓS..DSը]9gfV~1? |b%j2MձP@cTↃKjEΈY~8??Zg`xN1'bX8_oP{W(H³dX0CF :6Ŀv/+D>ߛE&4}aM'Wn \~B Dnki"+$?-Y=&&&`m,6k܈j5DQă׈sahUS/–5+Թ e1{L z!w?E)ڱ4d $ UD+$Bo '%0 -Wh$1w̻r-w2ppO0zYKxٹ|ƫG/g@ $-B-`d]3νCAoS+kw|$qӭ$8}L,b(.I1 GFWߔ-цp(Ȯm& qi9ɭMbhEd5]eR8=>KgvOxbiRs4r'%3oA׳LLL06`-\ֈ1c)$6GPIMW3G|?ɾG.>CGp4$e)8 'IԺ* C( {nJR\jebb)r橷?;~b24Mc߮-7R~PY80诹ֶݛ hWjTc\}]q΍_Wޙ<т/r>ptdFp mS"c ap`ήieMWMbߟ+t ]C X!MgX#k>ezdQtt%~,XQJ79:dn3 @lMEIJE4P#ŊkOQ7!_z^Zw0{n͎e~(Ii y=Q%7kv;/,Y|sJ3 Oc?W{*,z+FD3d,"$!$碑- (¸n&/Hd]"+K]sv"J"," 2^pk;%۷{1Rv^o E2>n:Md i]u80s(E`I`^xsppw銓bbb!x~{ ԰J0G Qa~?@&avp:;8XM70 p8A/׌3NdۆU{%)ר)4Ϧ/| r.1~4MkDvi\ӾqtN~G/5 IXR2кPiO0 gbbrHJN+싯` <|> @ug߽9w~,/?Ycu襾[C]Դ73G7OvI! )]*Ⱦv(Ǹ<JZW`Ώ#?q!;5gBn&J8Tj*}$[; ۓXi]⑟πPXQ&>zG!Ka%$Fv3Hd|</~KCm- 55 躆#!i$ \0tI1tYQ0t*R-V$2dϚɐcp8;6eYI>2{[5ղz!USزHQoQ}w}0405Fc,i:͓.65=_&&} Τ~~>|5F @ |{\|+̘3<|$nBu<qCSAFHa,N$]lOE[@E9#DZzgpXѰU5XODJ7/Y5K3##3rSh c=\g|0=.1(>oI"Z" a:9\p,5'":j ?/$LLL0} O}=o>[V" M@a IR(TE}b8$~<j+*)޻U}̔r&9=jYFu30frr)>Ъy W&mETjCCHQLݿo&%Å-p #y)GthX1zGXt7l]ݒ:댨Qn?`9;I1t~/ƲwڭoNbg0 Ǻϗ2pN:}5VYNL$Ij1[rr1g44/17ƻm ] USoBe?šiz`g%5~߸޷Zʋ 5 ŝ:C~yj&͎ZջmMB!DYvIGr*&&&LJZ:7[NW~ MSYp%]Np4 '{&mOߜ'kVAW'I02&ngwUFBaUk?,u8m,օc3Zd& 'B@0=Heyi$)v#B=T8DEI$EQ}뛘*k׬96 woԡ@4t-~(:Ho\·oAi w8Kn$phCgoc%\ySk-IXҲȽ't=8*K[ Z fܣ&2[nTX5 wSr ޭDM>|l9-148DڢX,;O䈱X|ٜ|.]` ž[;SZ{0m?KmwT5,AMVOEu+8ED zNdՕ]Wmln|IW0Y omcᜉ!sE[} )]J!zg,&&&bZh}`$%忹޾yX,bQwI^˲,,KMv蚆' xZ&/aPWUE8jO\s&r\ EQZz#{ϙ1ظzE{zOoP?3䟿w z8Dp]Uk$KmvƑ[H27=`@6ޔ堪vmķk#b?6;Ål!Yz8菘Kk4nqE{ W$nNJf.ܚsj2Sٻck@Dw"AJlW C !Z_͇!o/IM_.Q_z[4kU7\u>xe ։mhJoa _h-Wxo3Ls6 aö91za:{D"Ţ0u ge"I݁araw8eÁbf6 $ՂXVtMbi*$ |<>r` hVoaZIױ\عeSKozCSiX1ˊq_?Ύ=;=tCGq{8b䴞,+&X@~d [f.If#;;ߝ"iL&H"=١10hG")f2a͊NlYiHmfv &\nbb^˒w^miUD<ghw/ c͉DḠ AGɉȐQoAyIb'lo7p0kW,TZ{[{Dt@p\4UtZjβ$. <̊{Y>PuwᦀM\cCȲ+fYQ,L?qu-EJeV+ `m ֦}ې$ FrJ2iiQ5& b:+I 2L{/=Oo\Qk+Y92pkF6~_~50{L;и Zpd7'[?, Ôw@X `I$ ɹ&,m"%gJQCG711j3xHr b$K )F4!j`VB A,kmlvJmTW; _m鰫L(6ρR]"! -`)izOhp{)4/eXAmp>4191}YP}ErSEQmڬQtMHNM;?)QYuM+N$Yg3j} )3NųK֢<}L3tj>e=@DӷhFvtyJR 싮%XrmopRt=$0R’ES8RC"Sj ؙ¤gµUv'Jr*JP${I`7k$MMPY]mCFPRұsXlyCe J5~Rmbbr|R|`_j3r"|"~MX7o Mxpl9$ PV M|Zqy G 0>_nlcU(Y/^+(HvkZŝmĻk#/aC%X`'X=P$X3spq%- C00 -:@XŞ?9 ߮@r>41:q`.6ϊ 3o4!Oq:t^{]i. 033믠m7"L?N}.2J~QP8L,rDi"a҂N^xnuY9YQ I))̘{ I)70119ja>8ETEQڕZԘHiCȲlfQdY{?AGg*U>}ঈN10K8 ]ZL$ %%b~b 4_}@ᮄeYf3Q,_D]uUSWf6⽥]eG5m*rt-{|﯇p8]p]pw|V_~ 'g!TEPz'EAp1w??k$q+˯ԅƿIAYIڟ@H*לO/%_힔uWCFO뱓!>CtHV;RUݶU0"zkF6Ig4ySb*?bX۵p;ftQI_ S䶃WEKm\u&2#UN@;0 vFڟݎGg!xgpl*u, Wu'<ɞ\0:8~qД3ZECCi]q0h؈I`Ft]rt:ڟ@(bo5H5 )ɍEQ5놁mؑNj~7Xb/?(b-+Q)uUj^o0nYfٗϦk+_!_~DOo0tV.A2`CG&&&G@+g;'f``Eli_ӡFl7gÈ) 3D6CMDXq'RKnfؔϋfI;6g-K" pknSFO@X,jZЍ&!D])ZpXd { ?Ym q3p=XTBg1tPY1km<[Va?}g9n"Yٹ]БQ,֪D w^;aE?T+"̺D<3 &a08KU!2MMAND4Y^ ~5Utoĩ owߞ9uX0{ˆI> ;$qAzfj_ibb.zO kHb,2¤~"H0塪(JL @ H fI#5=[vm+OzIM0PjzyW,&<[sqk{N=Ngovd.Rt 8ɀcH(I{,+ C8 ##(sveIhFdD((!޳fd0/=v:w<-+};bg0ē}&&&7gii:|Wc;('(}TH:;f 9# 7%=xS1v!#IGI@܇~vXg)5`0Ncn[B yo sd'Tzʙ "Q+\} qIsn<|QIOc:avE$rS"+--W}k#j Ij%R6aЯCq\OMUDghkyKS UǨRg/ +q#@v&yU=5P]{6y0aqfgy 'Aq%Y1v',GCu&&&?…ߺ1"-JUsw}~X_( U"5;x|+h7"捄QG"lK:'6Q T@t>޽67s@ض{}ɍp(īOJ 9I/:mq'ut(,vO~GR3x%0bO}K?5=E GaWY*G`&&9zSݕ,IQt`kVgw;wj1=GI 2W\s#_D]MX`/to#jc]e2?xKH~]=X"Ymr zₖ>/:z0kHV:Jr(kt3Ԅw5 I̚_;[d VW.8T ϯz$3BV2, [Khmէ7|*B?;&yE}Mu`b% ad@/:S@ cf$I}~p;INM㱿Z2U,'#ƀh^%VܪQ$𯉉ɱt!j8,j#` ]nJ #8| ը}B@e+f?)ݷSRx@L PY1 g F30V U 6Q d%)%Np'`) 6wnbbr\1u\μƩaTWUb{? ݀Ow›[SA8NiuOܦ@PMz6G 's0ͤ(|%E&nl4uVx~d(8Rz05~;DcW`bb#>Vu)߆@$lV VdK-2r:ht,9z&,s0v4o7`l5b"߹=Zg2h+S/[DΕ7z wݺ:rYu|#l|eP,ذj9mn].pX0{:{}!>ZMen㯎#Z^P N[lM,ڗP,N?" __|~eX*g]Qln^L8\סVE|oqʲl:LLs4`j~塠( 2`XZMkȼh,g= zCF)g3K˰?n}WƳyEzǚwC&s 9#211n-vgwXU1FUPX /$9!MF9R7Ms<0zde{:gDCx‰Tax#;:/IBqK f3[=؍J3/P[Ţ`لdKy݋ǣ9@TN$tMmֆ";YHW04$Iٴ74y9)l<|nWy三 9(xcIX š^k fu-k (pVL*Hl??6LYmk; j}1^۸҆{U%0 8g}Ln*OUu]20CxК& Ŋ,KM^;~[>M:| __w>έ\[U@$ #$y<Y ẪXGay[k?%i2θIsPܽ|:-+Qj] N:}QƨIȠ2vnCȧp\(5&" @M>!Y`6C?LrSE@W KA[Zt'4]fiGL΀|n},RZ ow?sN  S?z3IjqC^(֚R˳'RyCA4UE$L: L CG=?.vDW-~C\ψM)Ph\ =ݑayEF@pO)6l92vCS _1P*Y{&&& ǰcYW4=@Dq|$ v{(hF7Dymphȶ k <'{䀈s\2JDLr$P^ZB33LLcL>Dklo=mVbtt|}7e:x)+BE@C0WQÞ?INPVbk9{e<;vDO4P*M_}`1``.&&&&( sX~[\8X|"TcbHvbFO[,(8rTC*AtHdpBTF/囱*<` 壌f/>ΔYsp8ub܃(pHuT20Lz|dbrcf!>aD[:޲8{hs5Fm:b!nO83練Mװm۹H+/=|^u nCU Ge~j?18b&ĒtCPl[g4k;No]#ƌ&&&_/tvCc Dme3`Mtxo|SďHp ˫anhU5 ~]=d;¶q3s#֝y_ũgϲi |^OKh7;TgcC]-U$xLLL6IŢж?cD-owN Mm_P!poy7YFϼoeKά2e=[vS._.n K_5;'6,\&!;״Ji\߷pu(Of&fKvbLLLLQٱvm}'ho%쯄 &ǯoV# !§魏zg0u`" %qM}B Or¡+i&%p%Wpڹk&!>CTUiZKf`bb?i]37w }ǐ{z&&&sۇTϷXM|W"O8@mM:t؝$I 4 ' +(ZPoG6FI2q Y|_n"Ԛ =qC G5K^1pi'C꜅XR2܁kjWPwuuh݈%95s/8]Gk;)^uZM/$Z.s' [gipT4T} F&BEkkPmbGyPWuѪ.>cHU[ W>`w88}&[wR/PY^Aer1h>X[(κ8/!>6Y PsgKL+B-," HCyY{X(jF(lv#/ V)u__Dr@ TYJNfl# Ρcw5TuM]G۵-$A :n$ 3xdξ~MLL6x}{?T7N aXǯt8P%6&x(h#ؙVt8X lDǂ0$qGǝy<6HR@A Ȋ_}{w4s@Z\F]y?a#,0119 3} ][RdEtDvEE ]o)KH3`:7] S3?zC[*A 90iF8oϖHlp]dM?x/*?Ծ#QyNmg$v =lϹQ3{XkAfrwql7PH=Bp#kז *]"r _%d+N΂bǺP14#IB0n{9WIѴeְ_V- \;ŶXڒ= v&礉qC44gt-ߙa:nwtj5oTkCA6WJ'dro8dGr1bE rvzqtO!) v)ʚp*!Hq_ӡ^X Y`pL㿲V; p:6Vۭð44 5嫆a뫨ػ}fUW )+2 uǣik(UCaRsP0d:cOĞ㚘*l,If#>6ؼ8K @41Ƙ{pN_-Y.I #_ tÚMYW~vmWiXjc}q# Gr'3h v:)9̒^Ñɐgi2UB``aؿ j}.CNbHVݽ/_%:׈.:OeYG E.A&Nփ1(XYLɖ/8Cl\L3 HRg[EJH|L Pu` Iig03r*R[&&&ChjdK'~tН(uunp9;4kߤOPSxWqEQ9s&O<WZ.YHGB;Ix"'߻^EhzQ$o̘H@V۟a)W'!Z"h7fF+Eӡ 'f$`UzMPηKDsauPE[+IrRcK 'Nq-rfJ|AƏ.݅ NW3,2:{ GL]EB1vEa)IM..~~C'2o1b΅3r.Jhbbc3>FKڝr8]Q7dC6`sƦi! 38fj .&''7R[:)$ ŝ"&-=dȉF'R]*zS2%Ҙqm1` 2GQcxCoj`\ݜ !U4Fbzc$wEmIDATm[F;b⬑%Q2]b245gs0e8n ּEU=Ηj$ª!0"GЎxs)oQՌa5RKvakcK3 2 F!#9CZD@đ9EQ}d,K6=҂ͤOWܷ)2)) 1={,$l=dCF;d4+orl6,Xŋ Q|xԗ` L1$`T(DS DZ~E#(* jXuF}wVEomvFticC4bm8'zJ~ɖ́{(Ξ {C0*-eO2h_]x&&&=CD }_c805x 6{aAۙ_았TQN'䡇bnQHYq„0(i̞=ӧsS__fۇP^ș?^ 0d60!_ hP֒Fz~ۢv !藓YC> tڮqOvCmp0QoӤ]Pm2A_Sm}1tM79xSRO.'P ]W[ΎO^dߊw< _srG`f癘̿>Ȑn*P6K;3n$P065ֳI_uļ?k,nCuu5K.EUՆ-w`QH! ì^_|<~pP$0t6~3M$s2#{$Mi(ILPSd85X{PERl9YWɶ%ϲo;ԗخF%Iԃg%+Rj|"q=IvDI$ }UTfͫ7s?Œ=Kae% my]XX{?{߾Yf{quױxZ aj| %ϑ:`CN83&k)=6fCf,`Gϣ Z+@dD$c9_91}Q\[)Ec!p]ԖIߌ4\=+ܾUo8Ջ4$9܉"lpʨ##N+@5;nZՕ?wwQ$d=Wl+N9M*/NXo؏!\{`9id_}:YẈ͔>.+wx=w-d 9㧏7g$ Ї0t0@n7o`EP0ZDM?t5LXM G/uBNswsg>q7tpm%M%8&u٤t#k҄TF'$BڤO4e L˜*cD&E,:2/yX-$8䙣m/w~}9Ƹaޱ.g4v&ȲHdJk~4ztg2Tp(-"=uɱpݥliեj8(<<31˜N'^x!o< '|2nwl{CS Ssbs?@t]?šя9 "ԃ |'~ dqcĈp6/ 4PS>HLMLLL:Gŗ a-*2j`w_]e8$YW ˎM7b_Y  7%F0k X{=*ndŻKhDG!I| FtW1o\E)d9a#򓐬mWvl0ܿؓdדٝ߷,?4 Jwaؒbbb3>aB؋8[wL10 nXT{68n7oI"X>a^(߽.ݔf#99䣾,Z(KYh=#%%%΁uԆZ@_nbߤٿ(<I&+f8"n6^{'N/~ v{]ibaX,/śoW[񚘘|mIs.#*/Zuw[^]~*ui,=ʀ4Qz P_v،lxaMoI!1;} 'd~c6q]1yPVY%~U;:D\ 2lY +D;H3;ɻ",iA(K}-eb҃>$"mh74\]FZҲ,d~\:!60>p.?lܸYf!2aPVVm֭[rqE/`c% =g3/^O'0;j$kDOGwUW1f̘wAK>}:#Fy*6 *np&&&&ϽZ(o8b񶒭_v`p&L,?xVMV28KP?ǚlv4my L fϙ[~y)P7`k d6oތHDrr2 -% >wyロ|^x>sctMhgo1`;ٛ|}4PC~+;C-b3 GJ,\i8S2ILz(S+3%WX/76VgPoSd9,gO-h4<;'-_oAfPoSG f1[H=ub)PX͡?E/4 [.'kk тrC|J/S$#H;mRNŒ¾"X@ }{A<wf;h.6UO,׾mD"5z5R0KyU:el6!w EED*b{QQXDICKh!$!޷:}9ٝٙlM8)̞9sok>Kd-UFŅ^틟={6r ?ikk0 -[ΘU"z*'x"W^ᥗ^b׮]`Fh`(w*;Ɠw'_F'>}_Yf1j(M,aL8***y^? l2 xl;oy5g?;g] ml|(v'$6cDh1'c:[dE1?S6W tۅO:HfC}0s1c'C;qyc͗yь Dㅤwk r~ V`$Q,IrWKg#EY4 gדց`fk0>5G|,:z#i;3f3.K.a#D<#L6kOWUI&l޼7x~-[m[K`V;Tm[GBew=H薀3 y[V38?\[Ϳ{DkVe<}\l8nHCM`;?IT2$IPonuVfYa@[asu=w_$*`z0&BpL6#k&kq +hkJkr1ל5$6J~)f_Z4sCyGi"x|$J~)~&IGS8ySL?rHXXX$ƊF0Wߏv~ hz{;DQz[Ö`H%ma~ξ_O(_G3o~NǞokk7 ofc٘;w.r /_cܸqB|6s?iskˣV*tt]g7@U4㰂."jD8%In \.?яxꩧ:ujBm[VUX|h`]E6߿aP:>2'r'hBW\E^8cYx'Zs Yy_iSsav=!5{`wtn¬ mwJ~6*4qɂ@k 53;  W-7}Χfzwud8@{CRRf2k=7O*QݳI1&6Qm3It ;Ea‘MHT։{H#! j,=bce)wGّS3c ߤ_tA^M8&Fuuu\}ռcɒ%gΜ98]@kmefv\{:UHcm`ZZZ}_Wlذe˖E[NSO=EQ1o޼6gvi<̙3'> g>X|:0>\s?=M?hZ뻿Taa=x8)l+vI> <Gt0aZ᠅ "0VKuI(q~ơ Աo[I奓C~^[^￞KOIpHd ǘ<vS_ yWr+47bB{HϮe/XX|V#/KJ7Mz ;t)c&zCUո*B5"slyhYq2to+w?Pm9;[s4F<jjjꪫXp!GŸqկ~Ż=ĉ'MoixaVG D$f̘]۶m'? UU]q)ܗ_רY4_z*ߜ9sxG2eJ#!?kk3Cͼzy/W\ׄPxؼ찜0z|OS8h$+ymSkoq9]jv)ptS4o0N1+Z_f5L^*nZkgla| u$Ocl~ػe//FN{FpR0}s8Jg"f?!.t,,AlhH6w˿/M7KI= ^lO`& 0M-Nsn?[4A?K_cϿA/#t 9I=$aǖ͸nL !UUU?{%| %\;?̼yp81C_߹:G~lٲdYώI,X F@Q۹۩>>sL׿_\^9CfZT$"˨(1фP۲3v_B'u sz\7r=k^ZBWw$̀C40{&Y$$EFROd.@mFgMZ(k*K6/G [/a?#9 ~$!;f.d[1Tkr#0* !D+$IO_?s-;꾭GɕD=*`bbq_Z{ $N0U2*}ȿFyŔTV.|TU!r-~! ``^}+%Hq<ڵkݻceF+7S|Q3rPN%//"B={(((kۼys\IASSS5kiiieƍTWWǼO?WT1c't/R*n yꩧ+4i`x㍼1M;(߸cFockGh+KZ( YYY;th$Il6t]ZNhdܸqk M-@unc駵f?>|ҝI[/=%G2o2?1WXM@')2g9#blob wM7SoS$IJ^^3gd$:4 ֮]ݻioo&l6Fb1LVgҭ_fnzK9*< v$߯7֗ރ T?2c]Ԭ٩x>=dO@kfG2# pV{?G,=y -jG`D Sis S_t$ t 2PUVe{U- zTG[zIP#a,I^x!-3όY%7!^{ڧ6NocOG7{%='.!!0Xf ]tWk7_ ,g3&7X娲'<ü˼曜wyٳgG?@Oz:Huu]Z=yk??afjgG$v;̝;3gDACC֭cǎ1$Ix<MɓlqF$E ^e项Ew]O!h?D%Tf~qEh؉H$XĤ'~JW(in.;-,!3.7"b7M;tlz i{ZIr?Cpg]k@5tA5L&v5`ٻ /ZHs} TiO%ʼngvކJ{bX.#ݎ!c/Uma;̇!(+YmKB"Z$mٽŸS7ML0(RSS뮻 xNw`'pN?Rmiŗ^oFnƄ%Ժݻw<.Igq7tS4Px<';;QFFii)x׻ێI'\E3reߎscǎM6 Cא{ y[ظ6z?u TU%55^ TTTP]]Ufcƕ'Bes}[WX|ZYvsl9_Y_Y@QޭD=&2?7r F`^_ Ǎ7m[-H#ZCI=c aSR]J"4-Z_B02`R D>[Bcm} -^kZhAC3@ 4cO$8nSCv|폸&3;T`0y8=jJabX3B( Q-) p8JZ)h'c3ytNaߪ7hWE.,,^ʇ"==믿&gdyŤ)UJ^{5N~S^^=^CCz+׿wꫯy=;3n=%%YfuFqq1q{Q K4׃l\ vggg3k֬8JBV\i#kFO_S=ѣIZ߉TUUQ^^狻JDJJ Ǐ'//z7tZaZwmB d̢ d;#>Pi)u&zdg3ћ)iLzf|n5<~u bhѵ0{WfeY/UPp'w݅ x`) ;}7:P>Ym۶O0mڴ׿믿Ƙsq9N~_1u2qu]ICX[ol)ĭG^gGBlzA^E_v\( 999̜99s搗wev܉ ;]f͚^DCZu/ 'wyw xWSaVr&3w2k,S_5Vf_vȹ<K߉sl>cv 'AE`~F}F+wSgak"x*>';TqF__$\l`[+kn[ I04>U\RN6$}ſq?#^W^s\A+w'u8H!h) $RsntZopvxU% Ba7HN{]9 Ľ\wuNAAw3fr0t5I2ęD"> v^x3<3 : s'RRRqe]ow9spe jeʔ)u)BX4 .0aB\{E84@[.A7o6z$[3221cfӪ?@mm-6l.BE$RSS:u*Gu))^뉪I`XI>ka-y~z:>K*|D-@:!A$X^Go%>k?'EW%5zNƎO?͏~#:J߱c|o{;w@-ޅmK=k?Pn8jZ$fs Cr|ig:c-d*2Κ~I/@Q:$mjM^-[Fyyy\{-!֘xa&ڀH"lP3ufj@H$\eJj6@$SjT0!dŻnO/{Sg"'~HK\Sy?*qs:a)o=m:QT5nis.<*F #DÁh=&)))|[y\y]B߹^:yde$;tR233۹)--"\iYY2n8: $Ƅ{h9F8&f Ux}]āclv;%%%s1=hٽ{w{fZ7_PqIHVBT?_7"0m$gǨޱzVØĂlW)$Qt<,M1BIUP3=r)#G=tH/:Fs.}&2<Ÿ.B:P7zF(BC:&0ڶHȟ`/ dX (Gغf5@$$E-EGjH)BU3^8̀~Y k >}hUEomi\8Z[${s u]!l\~<3̟?+p 7 _ʤ~V ƎWMmHj17;|g 'ܹL<Ӊah7C7o*ze,f͚Ŕ)S:fZ= qV9?-4m;5o$K=-b0Tm]sL57SJwn_Z9s).מdQ^Woe+![A."Ѹp9O~ q{?-l{C2oKvi@QU:B %03f@sl^׏$@Ͷ~UMG l+&5$|jYXX$r!nB A`ZAIH"E#C‘0H_}1 #.9r>!Pmz$ `sr;aMec%Ibʔ)1CE^^7p7pG7>׬8&ԯ^+Vp fy馛Xh$/||;C>DbVH%% fuu3~ CO`1Z,~"/BȲ %%YٳgGLK(l6)..FtyDI=>WqF?@ @[[[ڹHa(9TR!oGI*S]ENߦ@A:U Nw@X rhrWPe9OxhƸ,9vR>窻^!5;z{^$KMcbНN#| 93 5R2>@5%}^n1cwM(Dqw]6ӴSqicHފpVVE5"Mxr\C(.<ҺtK1=JN<'!;E]ppL>Cz> 2֬a!+rM@ _ I2}5&`$ !&v#+-8|4W&썵lC&TnP^?v9|=iiir-s_yFU4 h]8p֬YÞ:T&W+w_N`_rS_oǍ9|rC-l\ MMrlk"ۤʢ'/ݱޑ 3? g;1 #F޼y=vqV+EYuxl!WdX7 NgU ¨̸2+ϚkcJQq?!᪦ @1CMgFKL >qN(L\se|5|L=[!DoB=XJ.L)~k/nWpII*BKwqٻ-GW ͠~oߒ]Q;O؞dfSoZX`a;^,Mgݦdgv:QM%0t`(D8@ hcwA$l5]Ca + M5'ȊܑD@زqCL?$kt.\3.x(,L<*v;ַذaYE"kV(*9f2l]믿7ߜpfqI' xdӚp= k.N?tlk;v,ee]}˶S43 +-`߹V}:t]p8 c+::_F [uX*}2gv U&@YS̱ U_3ξbP Zio-s++7!Hp[݌f^wn"S_eЮJ/AhmO3uZyIum~Ŷ.Uk1!`;zK1-3O˽[?ѝi ^ “F% M^"DE#ѣؿm0ͷX(HaCiY9호J:t)kH¬@P(Fp m4.ʿD2XŪ?~s0D>|-I4i4UMb/16[^ZPB9N_?G %M,+Y^SAZ@[8d0{)M?eGq.-j#`aijAL?v MD|DSc#Mʹz|~ @P`0H0$  hkH¡`0DSVϛq/TOZz[ŐƉ/fff&L0mߍ`ʣ>RQQ<g'"dk\}cUկU) ވކ{H$g8~?a* ]#ZJ0X?Vw?Ud8~tqp`hkDVv-)2ck^[BCq; zK[_;v]ZEK-J8'9d PE9Kɾӹ'BgZVv8 hm9Migb/ʎ <„O\8sck w'\ V)sw$ź` 45j-:YX+0z\xݵ9DƖCJZ u$S0cA߄\I͖ËVrs<E3όQ/Ak%@vpIVxؽ{a[iii;cѢEqBԹ"͍1crƴ4U~ߦ>m]ߏfU[[۠7l0#!B7Jþ]ZW߿"+7Lq9쐯mbHJI٣Cкts'[5CxTg2yuB:{Z~%^?Ⱦe4m% i'3M>Cоf7m+zCX"ۧf$d}{#oA ?)6uݧ{~F4VWbqѸ)x:M p;~r*Z=4,-jF Ή 8l!ߑW[X|ڰZF6cO?cO?ׇEmmFsCM54J%iZOe3e@^X]F7el!TJZ*g FNSRSJ J`zKDffp,G*o[G ]ǝM۲E477Paynvvޝ4l4;nD TU+W_0'):_?XBڡZ[[H#3ԉw'ٟ6$&  W),1 lPW"[:;wFbddn%ԒO ڪ}jG$% ka>@ܙNr&=. gz9:"8m5 R#{݄u{ֳ͇Y[uқr$oc-B7PZZʽ|[E]>*oW yA}X -n}@"u-0sh2RL饕3F7BVBocaiJP\N-5#aAk:MEdEFQTEU5 C CD"ap0 dYFu-.W[#1eDmW֝ŋ,iZ\L5~;pK/_aXr-Z#<͛ %[dRkԮIǸs1|x3?f)ߠx >Ȳs׮1W!>/FDpq(C:y"YrW0ꄫ`Z 9 M{}{WQ_f@ 5 JR;@3{ʯ%Y"e^jS#{[34jao+3sAV_(j/$ynмx=F IU(94*¼kl]?v EuAU{a Ib(g)8ypɄi9s`JF6?v }Jh]Kjz>#y.]Jyy!e (()HjWaq OS}8=ױS8jCb! |=L#PׄFKX}Z9n u/FCI< 9fVظmT߇V81qZ6ŔnyO٪Z [`GU4gQ43˜ 7КډԶ ~A LoBZ=vRO^S7$y:loNFr 6q"%i´lm&k(%]7mh!a(  Z{aNR9@ 1 ¢XC+%%N@D[ /vwl)$I8j|>I2Y!*,Yd׍znN8."}Qk/;̘OON{lV!h@Ǵinn[c5^k_ B=1m,H!Än @ڲПv~zơ V{vN Jl:dkAWkvkf\w2/{VVtߝHPrCW5yIq:/,0Dя40tv4[W \$%,Y:|=͎t+w]̙[O~ ;xWf5V'SdRk0!*/r lo&?Okڶ $8&% x7 湿@QJŖg8*WThku;[(_[RNd/L3.B۸}C2.B~USh0zV<[mÉ2i UMPHJEwQH}$ni Ǧ\-VTGjmYlF O'>`=,,,zbX 6=.2@|0h1Ia?\$[%UR')se,͛)++cءkhh>`…455E|;d~JR}Yn p/tg?+&Imz3! ! v-}+8!+m7t[lP\ݏix84:q:D^Hx@voۙ(e9Z"'7*+_cʩHlDpN,{z{w6,~QHJךM9k ob3 `OQ) )F и#3)0]v OHmO Al|*^_ I^W`nR7B7MC2K㙘oZX1+`Rԝ7!MDRD|(in pYXX5Nu/$-zǑ]B IIt_ lrj=e455t!INuu5| }QuO$e7IڼSQ<Ƀ>[Vk | 5jkky7V{E7~&t-l%FŮR ԣHT8Ö́-YߥHSkZƮCaNu\}[J9ކJBޖ,rTij-Djb{ɕNH#5OdMIS"Knh՛؆/JQf56PI)EK=AL|򽌙{ |}rORE[^H@m{IF :8Rmlqxݪ|ZgoWuCION|}" Ic^5-{z ˋ۾};YlYtAA馛$Gas +YtCl+`$3nw.>(yVi, 7&T8y,\WPw#;>Ǭ/}O 7G*$oCVR9X6Ӵ2Qǐb뽬-b8I$QO ٷpBDj[L}56If 3fSw xie{K?'g9W7m2񓊄mo-0Ե\[C!5ߍ>}GN/lFZk߻A0*%ԬTTF9 0< |$[̪@[#9NXX|ֱCbSUUq-+vFk Pˌ3صkWlu(q5aӍºux't.0?^`ժUաiZWŋ~O>_|J"H3xJn;?怂%5#:1 .%Kp饗iӦq_4֯_kTXMں=+^e]B[yCO_Ooc,b{yZNg MdLj !8NnҬI],۵f!hؿ%ZN8Zc,a#ԙk]Ⴑ!]xl疄džfPɇ3f#;LMҾp(H p3xf@/#pWTTYb| eeeB~)K œt2 $q[œ۷EqW#23f/x'eo=SB㒑gЭiG^Q^+t-#ͨ_ t-pɠ چM (kY v:^̿0X^]WHZ@[Gq2=J d1{ȄڔJr{c O)z'$p'6Z8jTBk<5=%aCƨrƧQ9&nIe[Kd޶!5F>vQzk{_ίA姣xQSPR]Hvk[a֚zZU˜l~S7~/ * ZqzA8hOYX +`1$؝T[Dl18R2ؿEmm-R\EpBH(vJJJ7'SQQ3r4e\k0z?zdd[v3Is")ӏQ8WŖS !ؼy3_~9MM%$q13}W\qV=! ϥdhgqx2qe^8v0LC#!$IF#H$+CG%YQPT; YT].L”)SsLN$BPUUU:y|]"d/=d93/ 8㾦WTX WFFsu[BW 6WH;_FWl  ܳu>BIoDKZ|ݠu*ɿ,R|!7±v-]hR$$c{+Yr*I!5o 5[NZL@-l`tTR4) _ K$a1Hb 0bH:G|΢ 3\yf)//sӖ_dҥ455{ ąhiر#fR%h5n*s"ɚ$!;SuiǞFԣQn<*{%8lRڏLٸh< P`KS#w_e 0O {f)yhyg _LӢ|~;}}icH/lo8R9S{=͕o+^tgYZ|}ÐАYMΌ-#M%T`]D[!*Fc0Ā<}:Cz 07U#!?[3)Y IȊڕ$$fPRͤj+6 еBBNÕMJv!)3qd`sd +6.6WWwe!væ 0RjVȒS7i3'O]5-q{7߾Khc()r_3(IxM [ʽɅ0/F#|PU6f{s#vvGx9$[P{>ӎ1f0O~@OEI\[@-_vˊ/.7{M|?d7Mo%t1SIĹ6Ő D|,+!FQў"B&cۗ`0?wͦMx( 6 Á/К1$mީr h| >Fkm͕O $fGQTJʌcIz4A ŝ-Igc1iҤ^t:o\)© .9?wq]L?l(3*fOI2`>fS Q G1Pd8vٯr\'9maP}v'fSrq5K (3]RS[)د]Vd4CS2l4^>mS -]oȶnM!mGd5NJ&QR._V$?~:ܔ;s3.&C$a=kZa O*Zڪ|Cv˶fP0- >הQ*kfڙqܷoHbZXXnszGɰC tu]< ؼy3vo~$In 8䓙2e eee^M7SDUA ]ÿ}~x'~ Q H>%%`Mc "ҀiEّ])Ȯ$YAID/w5#FƷ̚5z(7nzXIiN_QӾ}g-m%Qͬ$Idgg3}t *UzB \DGgBC7hUJ-_U'ADJv!5Gk~v y)^a㷱M!wV|u6*1ON7[ߑt5*6/CQl1f% "u-]ɦW{~eO{ש_[Qmxr6Z1pM_}Aj^L鳒&P{=^Uu{-')م (:/4ּͫ=*Ul}:'SLݮf¾ʊDjY9 ?Y_]B}N" mMdc?dW g +`1$6[ LMf1ID^/=wy'eee}*$ ɓ93 ={66pMrGɒEPNAKt/u>.+YUW}Dt"Rjvw&Y A;m؇ }> Ҹ#*bDAɜ=֡@9ț8Jt={9&=-4y y#}nQ25*d13fUIi_ƷסW3$^0_SNjG X !2KR ÉK !hii! t:)++׿5/bVeY&77:K.; |>w׿8p@am_G2֟GU53PԬ<!$3f30f̘>c…$i't$`kpXHUȲ|DZkŴ|'{/]ۧ}eEe/Q2%TnY61b [@;0| 63 (2>+͖@Tj;ijG/BMNJ[:$h ypFض*r]IK)hz} ]L;0zyoݙt1oCHpcdVDb'e5+ג,“`zj?m5~A> -l*KʨgO<%rkR1I\{Wt":~ YXXX !kgj|߷Щޓ`0[n+V2`W.0iҤ"m/ŋ Vn|4jF Kt#=ŻBJJJxLIqH=yenû~<jx`H?;;iӦLn4H :,,#ryk03s :M6TZ{]pp+:BV ]0hg¹X J).}.on"9J %-V"Ѝb1hRxmvɆ ظa--Դ*-f!z i.'hĝ9[|`Zl@kf&hx#{1B^mX*DEXi~3J0d).qqڈ{O8Lm\͇Kvp@tME˴5LG:i̚n (vxr/)q-}54KN>nu4њ}3Ǟ xOD5ݍz#,aȟIԑؓTĉYff[Q1GfnH-,,2h)dq0]P(į~Cns=w WX}o~$Bat]O0tZWEܓ:}|#GD$EAh74QUӊW^y?>Y,vꞿWFv76tc&";&͎p 1d"UxmջFkiD u2N IQLNK1MCD% D$+B- Iaڴi-nw4MyN;s6L :?:ŭ ֔,]?-8r+mZH$awbwQ4 '|9_u/ŦEoђ-ˎ\v8u .1[ ؿ*y\hYmSա[\TNjj&OujZ[cz}Bחdkd!} ̛ ;6' %ř0)h"iUMTe0Afa"mK\$WR](O_⻿C$9ғ\W=B0tHVbHIBIk1^SSÞ={$1vXn6.袄Vyy9ٶm[cȲLZZ3g㨣"77EQ+yTƕ MK#m G2Rdg Fve}/mAz7_~lYP#}Gx7pOEIz)rb%Y?d5"uun#\W.@ :֓U$O$I"77SؚxEQp\/I0dY'pP!H ]3ʲ9A!`s - yܠ3 p tWfIOd@GKPሙDD1nMl܂ؾ{h#FAc3gV+}r3 ]#fpDBfp?>hk 3@}g$yg߿]Kն2Ck |m.?wN2p) i }pu3|7inH!m>9Pyh8/X' fjO†H 򵌐@[ju!Ia*:v5y Hk 6!*q,,,CFJZ y[̀>ǨRd/OW>~鸕% 'G?766'=L*iiڄ-0}xұ<04eBط]4/}쳿IY@IIff2c>y]Gx7Ļej11AI(((`G$s=QHK|EwZ C$3fɞ#~)×!W '%S?cׇ #*x8VhJ4~q܇xT4!z\W?Hy\MΤS _;}I81iQLG7~JNsK`z1<>o$製P䳀IiJd:~XXXX !ĕ  NY} n77poq'u%t~C0Xd Y*^&Zc-nGQ)ΒI9zQ(N7rJZ| t Ujz,SXXɓJ{wEk0 chJ墹9vgsiDgdj$hM5עka&R 9Q4u/-v-p8qpĜ6.Gkn-ED)HAƨrƧQܼ>]Oꅞݾ\>Bx-Z/MW5vb$EᤫocۏT -!(Pn&W& G4F=ơFC30#ɦ$WyCE@ .xXXX2<6U0/?!_]WW4~x.¤hu]鐫Sѽmwm¿klŹioF4xaCfVa¦+CVǞÔӾI[AwEQll[.1h B~iםL5X bWO6`dIkτu3 H"qj*,,2RR= `w!!* $;[oj]wVYfc1uԤoذo>w^@CFRU$AqyPRQRRQ3rQӳeebGEqf nPkͧh|i_$$Նlsf fnjy$mCp#Zs=Տ^Ak*.O4O:7y#BiAkŖ[sd |$v&L@qqaWO6I!iVc#[o?uݮe RҐN= >~ }dQ^Mz8޽Fvj{t}8e2|e0!3Frh ׏7{N3Nv6ҹ'Ù R5AKL#fb)Ԡ ^M-͌@ ٲJHc;"6 @Dt$YB ١#dpK/|$cR7 DyK3߷ #.ӆsl IM7O.h@VCrƖǕLZ ;~ԨQgG}Dee%3g$55qA0# Wu !BsrSIV:m@YIP-353ٕ@ IVl6$\[قo" Sї$dGQ) 9ct"tHPAӾa9;YF`4-yF-+lw gz+-QVH8&OL~~;I;R ^g0:{m%?鼫as$^Z8x$9߽|-0, k `bA߫!掆vwv@xSo73 R5O"=M]$"ąLlJalH]׉ljqҚ?/joYƝ'fZot]؄J\-k ۰W0TDzIxv"TCW}P݀f_|GoSdaYJX iYYLm &YŊVu 2]tӧOqKKK)--M|SSr O< ,$ [FYg7ה#"(~$A]@.fL$IXٓ$ ! $YR$c3D2O)ӎI*׹re :D>6˴}$4Z P򓿡fFel!h]5=t2uTrrrFTk3tzm^<}8/g`.0NGЩi)k#=d Y>O f]C𥙰,8Ԟo-@0_`( ERH: BJ≰< D~?,k23Z G<З%ՅyI3NI2~?VbȐ$ OF:] A^CGSqx27=5\3VYY7x#oZIQqOMᕿ eƱdq!ZK#FGr?}@[E']UGz+`+&/uE8!)ʮ<3seӴYeI( KzOȮ ֏Pq߭Djnx!Xڈ5DˆDyWɊ$(*5&Mo?K+iMwNa);?ER{YM, eT"/Iddd0y#DG fŌ%H3 A=? - Dhyt%@Q{uN7 C'2elo*GKk_D eP_ 'LRO=uk=eQ**y{]+dW+Yu%9fhvNiS-Zdۯt<Ȧ+ڡ/Ha&sO.0rk5(ܖv&p-+%îMDIR1a$Ƭ c%,IHZPcuɲf`ؿ?XbEDI דd')*Β8K&y@ U#\]&BUWDafyH)$Դ,2Erz;5=gR_@D4 )3#Sg0Bм5}_e4iNN :dYIjD77-XY2:lBY =ԋ`|&:$c ];r"ɐU6c~L1zjt >ʜ{Sy`[yݠU]y Jj`_7LEsEʛMvM7ϧ,S6nvt;mvF6.ۏ~+ PLzaTs߃~ Fvĸ%|ޓ =;ŧ Sc1fd= ۭ HMh SSS7oސ믿e˖% ԴL/0$G\4fZ{H`VBѽIN7'2gY2w?5O72{6R=x< mkާ?j,tCQJJJ?~&UNGn#r( ^uƶ%H sNJ$,wp@'+Ī'og'(F= 揃IQ-I^d7ZhzeUL^C#RaQe QftK.D NjĪA掉RJ1= r1H =_IBIjFq;[&* ˉA9౅EbŐi*wAP[ -ǍGqqq=O0K,IXR[:!9_w$UŖ-3ׄdUAoo!X m#wZ[uX$ՆkT.iO/(45#gIhسKI?!=oj*5cSƍGiiK(B$ҵ{6[/g)DAmA8X zpYҩH]Y>NjI$\iٜ|ݝL>=E - xo?06c9@]S n߶ejV*ljYp&J!N͇)y&72`W0# # oFsɚ^?lh 'g+`1RR&z8H8N GhT?Z&,--k0XpaB?$k&vطm@kmu@zP( cƌa̘1࿓R @z$`*?w&T;XtƷ $e0>U#$3Kț0={Vn h0K\9jk-{њcT6ѹ+VtUYwyq8mp$k=cxC&ms〻е+V$s#Iė+mdZX|CJZf&w ]K<P ,L vv܉ћ*܃xA۝\b&JkDLVξAFlQbK6ϼ(35|BrHz$ljR{Ő-|B[x H^Ž[#v>b8CJjfF܄"VõBB oI()|m6~Ԕ]H1«J5v*S̋Z 6in𵣵77cACGc/[N!jFMrdSxO_F2HS-M+H-`|C{O0SYeBP__ݻzSM:2ɔ)H>m0*9\f9 6>O{}ŠEX#v4jFg{#IK\&t&"!IHatdز{ #z`?LQYX|C+%AdU# Ű ) FUJNQQѠ-Ž;>oEwoŖ7N$ՆڰRdE|$a-"Sh|]h*-5O[F.jV.V"@2 # $!)JGϪ t ƚqqF/=~aPQQ޽{c4p&1W€+<= 3 N%x"|Nf}_}^X}HxIVʇ:=1PsҺ kÙLmaZLt%YQֵ#hiڡW@}Z at'%3Vbaq|y,Á7 JF"A?/_\O?oXϝJ?=ia1xf̧g8ppuYפ::_bX}gEЧ?6`]vQWW{A}LQ^Kt֥0eN#rJIF !$r?`[p`bjEB1Ú3-ѳNaϊW0B x pOՕju) 0UPjfc4wa@`: $rQ8aE񄂕?_.`Vƽhz$tDC,[ A`%,fÙCZ0bsQXl6RS>!o~d-2No1<HCHyTꎖ 0fI|״ Fyi0>c&2}-Rzl׋Óbj![$YBq|^!E{ ?vGQY"+`1xJBޖ#7DfDw<DX|9G}tY__#<00eR[Pӳ'ȉiA|+]3r$~`$ $+V |y, nOlY@)e1cm ^ uԒz O"HEuGJ*lf>SRHW2ҋpfAŕy=njyXCqq=Weы3SBԎ4=NfM7ϞkF-o"}Zn_"--ǔt=K-sK ?U˲xg xN(g4:4L4 S$l-+99' KBB41 #6bmI#4N4wL$'IEwB\Yqtb×~!mO|$S]CkxFnkv1y}*05Pv*h)t4HĬa#[>Mi~=iJTB7qF4R:9 d=Jq7TQŪW0fv:uL1 `Er&TJ$a0 }Q12@<}$2;RLȴd?{ =)q\wQU3¡c%q }Uaѵ}vLsiWa iL@u]l۞R Lraz{{h!Ԇ&zVUK<v?|02@X(]ݪh9B[:$51N}sCOLd~ϣ_$" BDhrZo<#rֺ1nleoԱC0n1uL tt"~9|^+o%:uTϜzu]Uٟ)sv0 4MTfW$r|$Yd$* Q8Җ7#t(.];G{4s;>KThuRڽ{ äay:Y%y/?El ـ\7VNa*ؖM z'u␏WzOh0"Mx(^>{`|i1DJ,E#޾ Ӡݗ1 a³fJ44]KpFe|K: m\N߂3%Q~:O&X /U'"X|b.UpBڼ Z3qB) F[#ԑv{]:uf&4M'bF.TuiiZջ_s}d$L?0=c u]$" Qp1N76]N jSԩS6 F-oTDGU'!?:VΚc8Э8㹓Nma̒ a!*z tІSڏ@{.=cFpn4YS!X{ok9 (3֠͂H/$y4K@EGZэFRNӀ9{hB &44ݯ)?]e`1/ Z K[I`&@ OM'ԫ`<|?9y_ bEN* 4KQuӶz+ο߱R +| ;x/#˘tvvb خ8WIu8 gM蘪cKp'FqQ^"5S**5,,htTSJ<5]klp#u>5jyɝ+վ%BLo1 mH8@<>wC[ Zκi߃ ^R"\?|V#q*fH T;%ZZ`*qB :F[#Z0h3μHEG>ک![pt3@-u9mFc?"T]Sλb;#ZD| *z'lbԍԙsuP ϓOLo ԇBۦK@!\p=eaY֢Ae":%=qu\͍:|:бK>Gq!@)͸466?{$1gtU?:Jd7M&sUpmY y݀fhnp 4-uڦgVkZZ*ADc+uʍо|I8 :g,RkT Uφ5۠Cr6{NJK@ U+<ǏsС[4]ӻ)wsA<=rW\^{ 0җ= k?!ffi̮y: 24c|%x>R1cDO0 v2Nt;/ey|6E*>Z1`sRd7 ⻎S%ɑ%I8$`KN]Sg1 M%ᚖ3Su̴]_S2w_Ը?oAzqgLREʲJEJV7)}GiYMM&B7Lhy֬YhO><}.@O+\q}Pap6bB18ywN@"~ SUc5bZX (ӱվ5-uXT4XfȫhU4Z]di'Lo>}}3 wQ s\k:يc*QUk1cK%BYu&f-W~4u&6ԃn1!6WQ!U  ݍa\w+qAVD(04/7n3{cU񢶠bE Vo'Sg Da]K +Gt ٮk<ӿQ@_M3 o2'o6TR5pX$: +1 RgqKl2˿< MMIa*\?Bg_:\z 7r)5}$E* 3u]BJK3L^4i4EAU-HrhY7HR:t*ZL֟Bp@^N@c MO# & *M ASj.s[5[7B@9)a>i%&H lF5tF#IM!H3v)xV5!ޓt+b՟*i2RJ,ײ,l&Ja6d|Lp 8?o?F/ŸuւĉO MCn>O;VL1z } nlQk_ SB)B3Lo?|Ņ7J7,gԈ b' M$pЦyx3u,zQO[2 xy!KNc68\HcM]EdztVXC<~ԠŮN]hfhթ3J@ 'YL1LWMyHcxB4Bhl\/i-y44(ӊ t40LH"Akf54^<9v=ϳՈ0 ״Uh/+ vݱ~xa&&& *I @:ZuD6 juXʉ|*o:(4w .{+ ,d0Cȗ#orNc#w=8*};-~^9s_r,cyL@e>Ӊ۾#}HқU8Q3 sɇ7 0ʌWIDHNh\:?'Tc"G Rz|)%Oj2I7sI-kJ-^?Ul~^"ƋKix+՝hzg$;!='{uzpGv %em: ȿL?_la(?ZLCmQ \Ul{I8W^]„T<g``M6U|\y\~匍qIÑ#G8qb1&&&8BиR̮mWo"|k0V 2c v } X¹><|gp$L%LmR~ܞyLv#`N0l9C @Z-55 ™"}Tثa{K@k/GQz<00dc4yj> dQkռd$ᡍ¹R2rbma@."C&5/y dϨNDZC$2t"gʹ\}6m1b͍DI#'HK6&7-F~WUsvXR ?]UU~27qB@\ʑH/QLcq7i/HY6)˞w٦d 8,m%JN{{;رpߞܹ+"{~i;yd/g&^x7#ކ o%+PSkF p_=?!zD@۶I # aUV=乙ɐ |jkPO݋|.H֟5.ё/}_uiR$:tp!F[Ivav4 !bC*d=l^إ!-{p_c{"A; mXFE[m^AxJ+FJHƒX'N a"qgԉAܱ88^K2ҭZ6߶yuN٤f+!T~P^4QhW|)Y[x^?SOn5 )TvlRV 401Ҵ)SqK$k,=c``#GӴl }_II+&d~5prp[>ݫsjIDaKȗ#ٿ AY|9mmm%骡8Ǐߐu(XN) l'&{n $ s׾_M1}߁ןIOkn Sac!:Vrb>~3W?V܍Ζy:ڣWvw2͊OY P/lJ No=$%^K8#Qa0Л"!F̮zKh 5g;c18֩aܑ(n8^BƒJB$W!OC uԩHFZWdBӿ*Tr9~}$vY~şä/Xg>@ jBuAly﷔a/u'?BK]3~#'{ WW_GB[J4^CՐb~ib?p򤗮NL<7D"%O!Ē_-f\.@)kkܘ 6njcǍc 2CDw>Qzpܰy.:Ie3V\I[[[ b:u^IU%466oL2dhhZ5ԫr2d0Omsg5 PahjITIK,Hxig+i~y;(~[_c=m"`\4Ff-K+D8oL m4Xs<<i8of8SD{pIf 4UпU];[1A^[+|֌R)^NQ4&P3Ig{3SɄIXTcQd 3O9Ol[smai=^zfgt/hɶPMS ॒?ƝE:6u& D^-߱a#L0YEi,[UVX1Sr8y$ض2!uF֮]˲e |JLJSqMm\SxI`VĻ?eF G 5JZFR ~%@*6VbpV/YЗ`,kϽN"'3><}}`B5ni2x'bœHFz } Mzo6 wjm$LA}!=Y(ʖob Eznda:u*3@f_֤/O2OOZӿb2vަ_/@Q(2(Aeg.q?" % )e]IΞR2008`l|7_'=S ܠ .~H'h2+VrJZѣGիYlY6`fi߶Rm+6jK窑{U w hjy㎗AZ[[ T+ יt"j(l۟\⟧AZAVB[<0sMc/=L)L:}QJ`H!L˺H#96A(QD'i)Z'pi6)5U1AB4bFBz(Vrs\@YbKi?:uNgZȿjś}jl҅ Z}{3s]ejDJ{b=±΂#)Vw8mәaἫ+Dtbv=|a˙U b VZE$R[)y2^x6|r}UNj4)a g&'V"Ihhcxg;^ B hiiZXɊgxK|1-TyrbB:.OuIu?6MkQ} 4Fp{ (^'"92AbxN"k٪6MwX@nj5P# H1L1 `MP4fs7iy$ &_?;SgL, `+EzլEUe:^zɔ2["'iZܺS2`ttK<__XqR}y7HF<? UeL.yCCC:uѬׂp8̲eXzuUlll,m91r: "CM6tvO) Svv*7٘iC Bڼi'Υu<3-qK=EʉWcµh/*A? liD3 Mlc6iZL"'Uq)*dB!4 00Ap=`pyo Q:-%%RQC=DږY֩tV0 3'՟lT 1 ([6 kgM<<鑲,Ra>p釸J`'c:ÿTKxr?]#D"__qȑҾM~!wCrQ82LVPF4Xr%˗/'  em+V=c666o'V:su䃷*#BP =^|;' v! 455~BIn*<`A_jDh?=z?|!_{" .i:9)VyfE&0BuMY&MhL {yvu,e4` ϰ&1D^_.ˌ+9_M^&O)AV}snh0 чs- H)۶㴵Mx޽|s{!Mbt3Ϯy2 Ɔ~䫏CQHƪ2"ufV\Iww7YB*^by6tttbŊ)I1M' oHg0`TF7ԿAegr2 3}_M'QVcB9O"2tXwƬs=q'vQG4^ȍ-ޭCC Pc+n)k-y a&[r wfICyK#4@d3 :tC/[&m V ug4B-~^@HqiTh D!bY<:u6SJ!&Y)Q^^-mܧs wV_,ws)uN[ӿb`I%QZ֙6(=* R)~77۷oU,[8J-\GUmK}%cyR\fGVKMOH_l(xa巸 `Sw :T#\IQ4æJ &$ï֩Jg* (| 1Yt+3UHZijWL8 [yG8-V|fzO|q}{D럑|4B2P/M+mR33+!d 3y&Jn?ql: /_W GX,F?b1u=2VIWW---5 `F}ɢLWfF]}i2ِ$ ="2O,Qu<TҩԦnPǛyzeזa%ҍ\sHߞI^eDU tyC1uԨB+㹴 $7 ֪U9ta%&_"(Z´̚sa۹,13l_ʳKƪ-0ȫ׻xfOI%kuoeŦY>:{aykA/;y$>44.y> J/R I=8DXNiPu@뿎&J]2_K' 6eyLl ۶O{MбbΪN923uihhty?0GīW) 2 \ÐClJI^~BS)DCp&C(cB~R"Z#f*ݕɌ˘b_*b``>(mg%9+V} ^,% Z:k:o+{RZ8{Z)(12O(^p@&x #);|B=$zm_JC[A sguiXU%V[U]k|~&+[`&SjeU-mFV3.ZIG.vs{Sf )}t9m$1| |QN*+<,CFrwԵvvv9L SM!رq $t}'5#JǶ4rR Ag^=^1TlSgTuф T#r~unfMs]1tMe|`)geWz3@gdLg)74`-=י.= Dssy _׿Hego x{5r_͕7LIJjv򰪼f28:R8vNQ D̀vYd^.tXe_u"H? (w]!)+_lYMa&a`E@ m]9F6ϋ3dL%j\b< dlB);\TC g AVAޟ\\H} TЄnbDV]ačճs,B/< P o8 5/mUZjto>~S^@fg/hh3~3͗o'cM87Uڗg޽&L֕Z Zm8NƎ2v4hZMt$\L,h@'U}G$':kѼNYHTu &a]1: zʑ?e&q}>iG>m雧3Shۿ(_OOxGKbZW .Nc:94R\2fVZEGGǴ+L&ghhQd3A4",[j}^e/"hqV,\''BD7˼6d%$>G EFGOD*K2d ^gNowIԿ$E8\Bm* ) v\~-+J"!G e3${M+p:iD^w \k_ pD&,&hmV9k-m o[Mhr̮% /"~!8V^BSl _C>\=s;W_Nc/=v^C$?/5ӨzBmj%֧F ᓌ!@ۦ4"֌nI U1JW_r_}\7;ON%̤a(=3򯊊}۴_U%m뫜ӿ{پٙ,M2v]m8Q`ru`4Em|<X"`7,6zn&feD^RTVqXU r]T*E*^;2p8L[[tttLy+>S2m"2]9Uc+ՇmJD؄JpX)HőR^6tt"2IK$>d|+2,ٖ/w,L,+O*{<_E[[۴] )'fZ4Gٳ9 V=K/oۓi:lqGgB\X:::غu+===R)<ˎ> nܔl_qE.="B ]O+L$ޗ&ݳoT٩gE&w*KZjiHDq"o'dݎ| v_tycy(d.3(} G D};3V < uْ/iA+JuԢQw5)9|KD)nW;n&F`ѡS/eeTdٿZA7qgObx@H#5%5Eh\1M!)wW9ygiԩsP6Fʬ/c 5Šu ]O)N?p]/-ϙH)KWd2cs}vf4I Ùԙ ?Y,[wuy?c^}Uɦ]#p7G{1B<?N8fڵ鱥Z68f2 ۆm1i hnny YC>2]y%30ΰ%QW Y$ 0H.plo~kCJNőo6s?g \^IOhBΧ~fHCdMaeܶ[*!WC,+32pVl_*["e# ?ED-`ñ = BQv4p DJ)=RkpeՄ)T_+[0N ,gԕ{{{n d pxHv+:|[/X VZpEkn M1qw4(aMq)̫-™ZPqQujC4\+fikB'(T%SS{/" !ef?@0 sJa0:0?FJT17ڝPNNzI1x2;/!"7`C$,%DBW@b 5=h({sX}5U{16t*OK?4w/̱#n4Z_Xl ׶@z'z0(**]Mt^ɲ6` 4wl}^82JDeeu6^^01p'?/tcq(ԙ+J}}B`ꪅD?5@CA$-w=˶gfNPIyѾz+B y$粲A8r[>v_C褥qA?˲m`pyRsũXx.|ȏ Wn9 %zVE:-\b=ҕc{Ć{?V!s/F jǃI,SLR sܵ.Sքfh4Tu1d푀JHpOupbl+@|Oƌ.J|:]C/g7 D=Gb``w$0[jh1AV]z6/術?FbdrJ ^v'Kn$?qۯPοNL'O! e|e+>DCU"AI'LW1ˎMI߿R8J̸4M ~_ܳܰ; O^܆]p3^t_Z4y3exG"X 4K޻rKׁ'B>}$`"{f=o ׆gC>~tP 0kCn1኏vnr'3;Z* 04Uo _fT^'9^au?/br-彌 s<v0S=v*NtDƀ|o)5^0{ xJbd=Gi۴&=vAǶutl[G=EȬ{3ux6eYX V&VYd?*`̼}ӿ|nkZN_57}ˌTNRV/q2}u46ʹdש'Μѹl.|(V Ma}.aiI LN K]"eA+י1V'ddڅoQmMo c! ?- j-r"=iF_;oNbG ~P_R %!u ĂV wһ;*Nj|q40( 8yt ]†/sz-hM$gdRWJXQvQ?||//KȺ?W:-j ϯT ȧROy\wA1)H6GMpCVUyŊO[y8x M-Lf2-sv'}A߾>Tj>Vo$> UR/df.x9*ܥ[0c!!`nLa!*n{ddvQYIlh)(%;"gF5%DY9>ة8]tM*HȮiа8Ix0CI~ر^5;|#D>M̧1 ˮ-Wg]QSg A41‘>> sUTs7Yz.f%3!gvl,^ZihXK\¹Xc;Ͻ7iUNu֝q6ћq^zh{($o%!8T ^P_r#w_ E *M+J"> &`]u;ڲ n:KvIS:uфizȿJ2Bl?0y ]%iHiRs_MyN*~<4 xnBMn 1հVwzxCwG}i;66mQ^K0NL37OrvVf i*6+gJ32T,x+DGs3)gJ=*0)ޝRfG'<&vuEHtds;]\Ceo;y= UƵSB~Xn~#iXx'ưciWs-WZ>MpYS=)>}K3N˓OC1t#/?#/&cۿe3$^sD*6w||Zve#}Aq%#g_t{\8*&Hջ{lFaGɁs|&A>v +f0WBqJS Ͽ?]:B.^[fpmI MdXU%poO;M˷XI={ <-ZY:\lr#m6'"Z6'H `hpv.kꭾ)=pjsSN &&Or5-7/GEޱLZ2/ό<ȿ:3CA8$Yu,p?;y䫟e*fB@ ͿסmBNY?8zuTg~ J%>m8w=CVGP,S4^R%i0UES(TpoH)>*y,]zr)2z)9ʣ$#s{NeBOF{%m(㰯{γH6cxߌV4Cx~Ŵ ]p{lh+}cѷN%er t_yT~Yӿ }ߜB/JpqNYhoK6>J(H:uJH}?>E&Yόsq\k#IIb X2z@Y"pͪeO(fęgIckx{,c(P(%6dRYI/z? Ͱh,e`3ȧQhZ7_aCH0Uje*_ U.4cKv"Z$"KF#s͞k 'm{w}-@HG Rzz9qAJ^;7 yjmk;'\UN_Ӵ?-k( S?ukhG Ϻ)Km??v?]RT MX qջa/t 8j?zŽ;JL,bma""NTnQ3>?D~`تobʭqkñm cCg-TAsZr{8QS7Lp 0C hYВ(1F@ih BS+cG?F s|b"̈́ۉ͋`,->[V%[4w(KIwPyqLф2>8JǧcpWg}}%IC+kk{:u9L]Z ?g=mKK]7-/O7A/ L}_ /RbbNxt#/! q=XT+%?P @~O -TF}TI܎x/Z..̥?p384)V,@O `&e?k{$(O†f~D:R wro=ݥZ*`*~?H$UA4J* 񾣥UJ]+ i DmRrrx$K:ם9_ )^Z- QfC*LI#92NΪeX+7x~jbuL]) N v2We :u Fؿ d3Aq>''J(=%t~8-`阜~urHs?;z<;i,6ZקOczT=ɓ@ immgŦZVQc ޣ;}G w:;c8G}#xBh4/_E,e EJO4@Ĥ2 <ꯁHs j 鈡_;uZ:ҹqF0Z3xW!ļAH$)IYE Wm> `t()t9c<Az. T:ur S3景=vt>kȗ UŤJ_z`"]k%Ѻ`LҿsoVRd N Mdtuu<,6$DGug w{!"n Xifwx #?`c g\1.zӲbc]'[˽ZџRzةϽs0ĵS{bfHir wLps*ZKJ D95k}Nd=PN”Ot:FFO—9z ?ҒRzeGZ02ϵ&u:"G߾>C_mFN.Z:׾?RcNWMX~=ׯ fLux*ׁm=kQ-̃!_gHЋ:u3HCNJvg's({KJdes`C f-,|13|ҤH4 h+cX+%v?M<>Y5dYW u< Whwg0͈`޳T50o=QgH*t58wy *u,q*jz4!0uCIy'=\qݒ}ȢIH=< G`3PUSIw?>}WU`ο W mû?JL;]Yv-6l b |9K v"o Rێx@۲[{^T el覂yM*Z];p1lIDAT~PT.qdpmD(kv:!FO?WJYwu; 7;t۪ v/vƫ`@8ҤH>q JSbjyu,qJ8YU0 t]KI}G@iY|A)۪CK*u~<ݿbbxuD+ӱ*^R=#}]4Mc͚5lڴ:?dT)xDRDJ oX~/TOCK%86R4[>M 7^=y]:pvIHcFBۋ޷h&`cgib`dCYv=ۉ(_YFaҁ %EAy|Nr`G -,jq{[?{ /若UrႷ>KoPυWG`-ƍsZ Wl 5X-Tv?U#j33 N@D$?o"]f"1!vzR*? T{29n T;\db':t 'Y0{@!l1ik؉kKʲ-~" hM+v^7S5yA*7+giSu 6̙d,T0M]ױ;)Un0\x!/~(+7iy.<;ΥC.|̶b#BӪV؉hfyPeV+%R@Q7DarsKZ#;RQfh A8\⋰qLpb=->j={o3^Jy n g엞D:F 4:Ug;n<5V\t&fC eJʨس4!()ˍ (3z7%pq<.֩s:R}7c+LaV(+Y~ͫt߿+hc9΢[t/%B@ c]ة8EҼJ@c f7BS۬sa/lo6lQ(>BHBL]1MdhyP,[^x.<3w@:+#йj;'T#yFÖ+߃{ ^/<ϝt|^o 5XM0_.q^ﮝ*/VxS$BmI`S0"*Y˹ןdˡ<B*:S_4ݓAuw}Loߙwd-4;g7WFG vکxIT7Y0?(rA3LА20 DIB*:ZPPHGhv)O'5cg+μso$,xd@JUagt$Ǝ'ma.iݛΝy:KԢHՆ xL],R)Lvl D"$I&&IR8y!pH@sq۲4vW- H4si<qhF"Sj, +BzE!SRbA<#0=7۶R.]EqBdURzI55!/yyc+9"*0m$z"eb;oWv=m%j 7+@[xi^&2 [jժy>; yekw ' 43k>5H 8U&]#)3T$ ؓ&t,y(#;v2V 4UG*?{H/M]|֘ N^~?nRʒ|:b}yj\/9h9*Y<7zT+AHw\5֩0z{- ''J&A*Hljb8eY8$ hT* :M'%myB F 2(!gӆa:FgǤ`0H0" 0i"@5Ԁ d&@ڱm] nޙ:yef_wc階nf@e?S2vl[%T\W-<ٖ"Jz2{Pٖy\rBA'VBId|$:Ǝt?kSg aşfluLp Ӂc~?w>=?g|Hna <0@^p3 CS *PH#KԹڶ:]:^2~=/a׮KirB7XdzO+YlK5< ިaaզxa`i:]M'x0krEQVȰE;1oK_$y@.QV A[7·yWCyOtqUPf^ilٲeLt">ҏp|Ƞp?UG~ݟ u39;mYߘjmVb*AzHM^tDŠԆKǍ%7C& s=5 *,rupbm7Џ~ē!Fى$~ u43~0IIXT nN=xT`~0 7h8iiE IRQ>,i!FlcQOUK{>N牿j-p楈 S#w~iy0T#W byj=':T ׼;Cܱ$`_fpd3X[_;:6cK, z`VH%';J6t#t?ɿkƟxLTC0 F\nX3]NP͋a)x躮ZYP.aQC q; `:8jOydUOj}9\(ЕQN*Q:ZJ*TLZBW,E )@pxWՆ0q Dwj 8}U$awJlNάr&9_c Hz`&o'25!w y;Pur4݄o~/lQ7 !Z:`+%?"`||tBӔw"O ojG\a8W|xfl]\#>/ UwT2YfhU!o!ګ^]hVqv] 5bg40F(PHG\o*8Qu*ڒ)d ?I>s3,pvrϧH# wu{igJMFX- L535I!) Nc3Os%t5,;?S?74UViӦFf 1h~F<gϞ= &,ݫ7|dtFa˅ 4]ysנkf8R$Ҿ B|'=}Q,JE_7<@z\s^B gxgtp֠K9L1Ϙ櫮hk/m$!##4YFӪn-.20cG{I{hyGh߼fʏ`R>8w54x8د|CY1s3uxPoas2 kkq)y'$}_5McʕlݺU-2ϹpR244Faٗ#!Xh1 g^x!<ÊH?N{ Bжr37}4w׾9_N7!؊$dSLH*ne,R֚H`qk'4`G>>N앗t ~m7oot=RcQƢ q#lnk&H#@7 NMY)bKG@&eHCL5*=Itb'k'f& #SVA54b ZQB;tI~ wZݸ|'A-%7vKL/bG?}UΓ\ƅ,V<R<4Mcl޼yQЅpGrq, k(x-p'R?C\s}dzLjtr} gle=7y|HQ[|*a%*'.J 3</J| U S]b4^cM0 {eb/X\+&M)ke>jC]@1Fe 4]Î'1BApSV,A|`=DGF!YF;}F;: ={+?a-TaZ]I${]]t,UKp.Lh0vDo1:N٧RU'#<ě*s:=꫌ Xu֮](e@RR2:: 2|`Ǜ{sŇ1 -j*l^# 2M)$t55%nN~~r&ڤ;NmpmUuذaâP XP ۶9r'O #n?USn+Rǔ`: oSٿcNI3[: j>rDO")>Nl~ 浪~֙ y N4\p![ۜǿc!B1;hMg nsOϱ!,?Mc}+WԄpOJ6IlRO!|MrK#1W'r`s~˔+!T%) Oޭde4ټy3VZ?& 0!|e֚amqGfnWk&U٠P՛߲ޥT[VqW_W=o:HǑ[22ń[yjZTtl;eAVm]:GPU%qP %o39xj7%y'e+t~7}>ܱ3^Fӥx4^| 瞏ښ}'>š]$Z6BB]ݴ׈sn꿈xRHbrBRO!8O\KڑqOcFn4_ 59W>֯x.<3wl۶˗INX>T!FC5D{S^;>5bbD63Vsb< )=W]`jgx<@%/m + + =xy߇A p V9b*<[t{:71* >oEM702ƇRּB79O$6[q6dZ 7 POTMG#1 KIW+K,Dap4w>O #ͩBzF ^JSԿe(˛^-Lj[&oll3\nw~OܧFACC\̩>B*%q=Tt֟W~{8:9>X T8Ç9qℯ_u\IӅװܷÿa]߀C6 kxIo҅{yn&_?|%Is;D$8Ά5 X}/ⱴui cFS87_;O'V;R##̿%C:{/V70ù]W:vJRW:[>^U0Vl,mnѺjsmUcRNoo2 u3֫5*{~[:0>UC^ iYE>pDa@|y:ڢ75cJNʞp,UNI9'#HC:U?(˚}'9Y\I$S/8<,Flowꮮ=yN8"d<{6<ǡ{Kit>;s#o4dUaɈk 3߮kb}cmêr?/ !Ќ,xwnT괹pp8joeS}ߤvx0qyWPB}XYhl mnpp6N zL%˦ ՅhPdK0,j\; HU L4 @s8QT 蕂;,+Nl :>Yt/v~PSϺj #-pv2k dmۘC Ld]vST Ynl92;Oݕ)ٿ.X&ϼj7I(t̹ 2Jfp_jpoL{Ua&щqRrO:Xx *(B@ÅFfoZhLwX$XRN@5*Պ^_R&Cȧ_E35qDWZ/hT ИO$#Rp%x6D t}[z˫]aͯ֕%{GW0p3BZZZTrh~*رH-XIp?#qI ]\ ̐%9A-ǂP}+Kƙ`)]L c%RMkNNJO]N}b.sY '&^Ƚ9QqEUx<[B[Ш%(+`X /Vkh|Ğ^XqU_€/@b2\q & qb߾}atR}.~ŠETV?uM'=;Ɲ#[ ƈ?{[Ly]tltfU/>ˎE\N*-]d w2h @H?{iY {7yߢ.F# $|F h!CDZlI$&O +a$HǙt uCzRJĔikAK#XӍ ' |}t~ˌ>lyu mQm*XX 2![c )eѠ\Xž}hoo*|[ UNf 1cZ!~9Oh[杰b='ۿ{rʎm1ؾǶk B ߓ$w , -pADO2iDt;\m|Ei$Ui*PWmʪmz{- z6L0P?D`2;i%[JQE--8\o"@Kb LE$F yc&Qɾ+"JS.x&eV8U $C P!,vxI$<]1?chZFT/2HAd>eɚ!"k7w\BSF@u#ȇmc [zJc`7蒪ΊQ{ipv:#T+k`ޟ侽x<>X{`ձgw[#Xc'/0 a^ŤL&ٿ?%%+Wsż\0̛H G+H[)e4剱_ XHGKfgD~.V@M#n`;`pkoMoyWUWP-m'V"XH_`{+-Bu~S cxKG*}y[)m5ҕCUXT b*$XCGs4ZMbCiਛ8]#WNY17}d9躡jϻ4;.!TKG@~ D98o>FGG԰:R71 [ f>T"z;tެ[>vȘѠK2 Ife"8nj<ض> ɯ8'PYogc3௮1OgF +B wbѢ6@B+He Y dkr4|C2{eB|E$JaBvGX-$5P' SߪSV(̱&5 >z]NIv 4x9IJxU@JI$!ϭCq[>ڬH=`ђ;xݹ/T 4WJ"ҋ_}m P( ]uƤH%>2-EU?) ~nNbp.Yi F*Ԣ{iImL$ܟWjgf_/?1=7}dG{}fx}pi%k ŏ PB,}*R)lq,RE*{}_Je^0jMTف\v:x<~^/wn3nk۶,+H$ž={J:{^ZD;r?{DG?J@swA,'pBW6yKJO^?ZW-dtth4Zoz?p_Ka~!Q1ًX2<|((xf3掎ߟI7?RO XEC8# fyn7>RmЌB@b|7PEdK xPWu$PӀQ|Y%`&sM!/ @0qn>y*LNB,k6 ɽ  x "x)` \ԞG<5ྊsipA_H*5!3ӌeOHzZZus4فb)aܦ` 6]+$gR!e  /T8"]S…E\qMH.ޝQaμbz"o֔(^ 1d_Ӏk3%>GUҲ᫪k%[m Tq[?b`xcÆciTSrLx(,C0*9yr4Z~ShŭB,j`K5?7+؀(K5P\p&iW.7[^o{,O`hZQ,Hl%h1XQ\1Xp@K5M(-, Q 'g}u8qB WCB{I"߆מ>4(Eqg:(ÿ&Cq@:$2쳉P 0G86hxr Ty1@JI843^>Ȧ7~.ᯮ/,c{tuU!̋q?հjJ{ɐ@, Ci2d0~{ xۖwg+F6~Tg+<RN(㿑 -a(F>J'C Ӯ9亂# h9A8(jl ϳ㿿J]wbӓUhئOެj+Ҙla~qc ufwÙ^>I%!Vra5yULN1t2mRJ"d%κ^ǹFWUOLiLs %!.e7/gKj(D2ײ!Uk=y8pF;r7ӆa("`YRRq$2J2^FMxЂAꮼeq:{#;%ekiX"VB,`)ԣ XRywt%M.=ݐyuNj5^vIPL~=WG`]K׀eWRR}>v"MfnO_smH2wy!2crw//I'kw6йo?w~<_)Ztk_ *Xpb@q s3[ᶛTIE~x6/r_U&F;r^*{@BӑSxX,"5 t!$>U+AlV.ɺB^mK,d5 NϑOٯ;Wul |ܴ{{.3A/F=/v?e0$D⪶ߴ'-χO sakpiϝ9=B}?Hsvt)sNhA}5=[f眬dy>XbѾm53gy-^cX/$'I<-qi>O*eK1zƢ瑊4qimJ"cA{!BtmE/ʱ2;u.npDCH"sLO4c4ul21Af.&@ޔ'\sIL:^M嵬eF?w ӟglyEpqǫH!cIJMI!ԣC}6dJ8_ E|2X^l؄8:h[ql LI䃿88Uo˔=6wíEF2i7?,K|a*bmxU9leYD"B m\_u>4mH;-Qvqȍ\ [\K-=O~N.#ܐF+r[x}Ï?/vTI(BCuJɹ:@M[G|$ӳ &qݻŦ+._Skew7II-2p \|Q-ljY"CxPsXh9N@ $X:OaI:Ux\ӱ@3OxcPDHݹ9@'>CDθ!r[EGk"q(}͝׺JZ 7o?ыK2ksڐM"g>Oefcj.&*;h*EIHH 0T-{.2?"=?p&٤9iiv)xg dɘ3cq0݂d:[*mG=[^핦òuJi *0_gN|~8roR{KRiy` 9ʬrH$ee& 9VlxAxUϸ!%gxĢ tM-ڭ7ytK";2HG` ~PPjC]{Z%M%wxJe{M[\Rz _7Mmbk(Veʽ"dbv-rdZ5➓nr{*k:ghQ ;!I!fF*j#f utf͡NE[[ct@B8ضt|s }'+ mOVPA2N:QU 钹߉}nzg?B`dd nR2:Y\Vl4%{?']z^z0GuQ_O{GÍod;ٲEڥ& 0a eXPFkZOU%`*ȏ\?WOZʱݍf+σz46Qs%4p#5JBaaL"qkFVǍUʁ?%j03l$|҉L0rI wU51* IYw_P(ߍ$ Vi9ov`* n])&srﮛVHjwg/ݗ7k][몭5Ty̘5+رj]@@ʱ "3|Ẻ\b8c䊻R $HPHsyLMFI:r䝕VMgχ8tđ쟎.1c>138?Q") 8m#₽8{ߡg?!]Fj8l9]oT0؋&KW 9u4G~y쑌\t*n._հ=Ͳ 4C+H)IRDY}c8jpw=v3eAij" hh o"tקyu 'B~4 ]êӈUf3qG[Vz ]F蔍4Uпdiq#BJ+R"&B}H)EYR"GGRwpex%*@*@0-\.*N̴f4ʡ.y )Tʻ1eIn9A i"s=ռ(O;(DMGe{&(K^:{V@!#¥eܒrW١ Dpc_Z*{dvD3c>yل[Q`d2LX v^{Lo.4$]$UM2]nǼY%N$F{'`~$|@e^v_@βR$XKzr_Z ]vd`45t R,dix`۶gr"lGeJ)2CĴ%K _LY},|*8 PJ) wv`|l%˄$.v[x 3m^tȧ5%g%ok4_"lj'^c0Tp4 @ׁٟ׼V0C5]Ƃ0)~)b3Uyz0|'JgTg7Crugd3POID 4֣&@G ^IfkK9죟 ElVbn!c;1HӜMCx;25gi+UYdo~^:T@Nèe¨SnvH$~H.%T m+l RJvD-$' #|sd`6V6ˇrƒI&5 &5xj52)mאvxzV0HKwE߯5881дq5pҹ: *8ZUU5 V=6CD:uZN"^ ux_-/E )&BмN}gj32y_g[/QNTmR [znQ9&CMr^[^!I앗U 77TuJY+i!YKV$pqVĻt%K~`lGmci]@ -D"崣IHp/i!i UČ/"h frTksCiPtM-G SG\A)x>: &MI.$K4%%G4~s {d_o}BiͭWTpC/:^Ԝ&<cQ[[oMJV*Al#σ-D#İ7PYoQ␍}ֻtτ\5'\Kڥ`{B ^eKHuw c|ܕ] %4?{3+?*.dA&тL[P,){Dh`}xp?bˁp^> /ל\]OnbSVuʨ0u^6LJ)I̋\tMr&I>P6TH%Ǧ~"sHIчi̿yidj"qдvଠ  $[)(3.}n'Pw}XQSS?ƃZɮJ-=[~{>!ʟv̺^o~Lqw|d4\}wgG58]!) Ro2ɝK&kgɀ#Ȥe)6UW⩪(pK<`u#x paG4 piQ(sPN'G?B>OSzꮺeSS r]/^vŋ gAzñ#3Ksy߻g72أB9wx/?дJ_AG)"ngQ@psޏi:Q!UUU Vc(SIÓlȭ㕎]v @Emw[|¶Ro>A_{%?Qɮ &K4ZRpU:(9/H2 f_=?j&{`1_TpA^5w}tУ}"w`P޽n K '!-Y+s$Bʼ9jN=x^ꖮwgsl~N%ǣF2~& y ]ˁ}Ķo#gy5$\@J>ET 'V%a*knDs ƐANиxso>@Mڬx.S);»bu_9?Zq&٤K,>[0RJ%V պd&JxR2pIp _/;_th^828y3*NTpc߫;yP{=TքQSSS2+RdIL|ڜR}x5޽/?UtQӨ:>gn6O.KIdH}D_x$c&Igãdpwɧ ҭ8eSMHz J?H`k'kKA~sBO@=REb>BB5 ls/WG-rtMqBOڂ5sO38 M:ˡanYA,\<?2fjW΋2HI=H&3dG]]ݜ0D'ل/T@ ӳu!4tO4CU«MDx'bPe|+W#|d7xL& w/#=BbNщk녀%iۗL.}MD8"BW=E[ KJw%!!^Ƿ!U*h 1ݷu, ,W-m3|}XCCƶR 1H-HwX"$ w #t.9Cs e'[^s$_c~7+ XǞ8:U_VPA(!T6ĕo 2^ ¶㡮n`DL)t FR`!%q_}Nx<=S6&[lp<)&[lHSCvaw'$ct;DzR%RCu@4tHe!%v?>WWb^ XJ!YVأ%Z, T C#d32ƅ8Щ?bm],cZno9GV{ͤ N'H[9YAȏ](dG2p_\jXYq" 5~>Lal'WaأyL=] _8qCD辖%F5MSĂfׇsPx^"K|Ed] Uҥ#VJ={*@mⲷ̫ƻR߂Y$J (=`&b oB*Uzm*\ g3VÊU0^nG޷ k/2Q,i3Nى0 XX<ӄ"s;kأ쑑0z2#>6s܎(DKJ!)"gpy)Vgm:Ugdte*%H;&tpP#S |Q N4n 啉~o[]|2$4%͓,iT:T"4Hs3 4`Yj9Nk,3~]:jYukidncdCt)֘8DȩGs_+3A1EbEӎnpt*"KUn)?TL/ Ve TJ22F ^{^%k׼סw}D3(?&!X\H.6oLx_ ^r,uG .%e۶<Ď.`R/s֪voip$ޤwO? I8L{,!}4O(@s1c%;]P5Uhj> -=W /=y@ U~ ^ji2{ìK~OF}=UgYܨp̬49B%IؠIN{@,T9,F{ί|7l5ea|*x-l*@{.`&4c*&  #QHDU2&&RAtpE\@adM JE`)j  S< ]f)5!BVA 4iWǙV0sDо[.t֟ڦyU|3UH'5cG[nRۛ Mӱ]2S⫟{]oKxdBZH^rF}-U[+`CʶgA$uڃD 8v,j {=T/oB`zEDzC [l) j9J1ܳ^zy@6v/-8IA@2s Mm3U(IHq< >ϬGM- .~҂:IdL uQr\_'g׾A&Q p. xW 0H<@7CR9(@z&`4&-'.qRILH%R!P1d20HYJ*Je. 2|TtMrSXOUr*-.C$xempokz_#}51 MKCtAղO\K>xCE '*mA9]6%h#8N>DJ3Vv~ n6Q4aXy8ᅬޟVVFe"lZ;hz6A&d;ƪ/|K.+ eB2(ដ<wyOnS/Dyżu \R/]5k~8P)G= nn[p²>m[=LكcgY[N.Lea2 +hUZ=1"΄#xh-oMp\-M@ Q/2 PɧE #_!`R qYƼr}ŊeZV1aͿτ C5[WգË _^{Z(ҏ3epTd .ʽ7eL|InR ~*d) 4?vJ̣qF@iU}%zcVf4$%t{2mTabvw#*s4^; xlH+( 0SW0xGc`zEoUZ='R$k .n2MI`&3(2> "ecv$UI쌁c)l5F30y`i "5G $+7~;^GK.믫f'௯s[viM*4 Z^BOH}i |hxrrP 958s5Ń<)1"/䧨uh㘅.tأtקHĺzJz-L?U KׄmWZ/Ӫ/jGQ@67m;Ku6y4v B x=c&q`$9~)CV??o |hvTv޽i 00>|!Mu 4֢y23$ã;hpVan=\4+-WMӟox.>ed!{y1*|g@Tu$}X_c &R*n?K`0 Pv0#>B[/=;FPeKjamsw#vK>!|~%_W=S!'g֛ڗm6Au/3.WADG4Ȑ*񶭂-Ocnۻl=dZZ)e*K4f=^UgVrG\5˜AeaT-EģJY+ IwfS3Q8i)3}caJ D~ۭsݞ욦X2H-I+l^ UjƌŁ;~1˔rh!vD{Cc/y<ѫyP""uH|!Pۄ'[lg *oZZ?I񑎓5IO?2BӨ]e瞌'>+j {ZCRf41|^to(10~;23CN.ۣ+wKZey}HnQg$a4n/^ObOxɠbЄ/S qEUπ5MpLj7UWauSir iVBI& ?Mo~+d-q5T^;{IL":E lhS :gd\kpß4ޕ+ʩ"CrXI*}~RL_PeίO]}[!ܟ1w4,yv^ll;ɨn^)7N8 9>s a?V)CH C$f*C:XRH9֒yX ?5:t]L-+WjqȰZ=T  tĸ=^:2d3Ϫ0㣤Fx9w_#{ RbGK@0s-w|.Nk>K?V<% ?W4@ +Yr "DZI_[ 29%Pr$J} %''O*8X-^Йh&z =V\ iۄ}]o+km.|D=KC!%fhv(Z8eSp+=Ip(i ayN "S>P\ N,FǗ>5<\mQ= 9:V7c{zUs_>F VQ/zs5IRݶ(.~ਆ\IT<&TW'_}9%G^XsR|#> _CnyH&h+,n9(fs(F=U6?[[ r;2ӭ%c1>Z2L1FHft:8n)(8vFE#0SSwqmJ~cYǬ ;~D1y^KL3(+.bSV ؈m&}Mֿ-I#p5AIixLN O0;`ƒ |Y\z<j8l$ykŠ'WHIb}֛Ķoc}I}e#5+`g2HtIXJ=CZW&2>khn%Co,vT̺F M%G6SxO]ka{gaCb۶O濿JQ-tF+!HPD >=^i@{_U4Xq .P';~LsoN_WWWvT0?&Z0f{Pms3qlJʶ~,Ca'?^]]#:p.[Xy ~8}{Βs,'A}*x|Һz]ݴ ްIeKn]=J*s%AtC'Hq^ւt{3")<_ksD}oe5T;GhhmfIkT0*‰KUkȆ))\ɐ4135tDwҥ I@$T.B(R*$;oK_=o5r͡YHv8#X+:3^O`fжq޵JW'D_e_{; ,VXQX/sm)%mc6Xa0X ˲Rlhp'/[AT? i@\py1zpǴ`F̚JLw3@mSNm&1QQ&6?%]o%Թ<\]m.xzY Rҿc?. rԁjKj9\0!T;dJm5 ڕmԯ[N.@eY5.1 ɶf C=8t} \iiqނO$cq%q?<\A}ֳ)/b߷*;_θ1QPH9D۪|{_⬫.)}%|< êBA)< 1ThP U~[_ i%M;^M#R5TMcFg"u?V,+A6?G>CGpM >9WCR*rq``s},!|444|rjkk'H$B?DѱlxpɈzzz6L܍ ƃmSw#C Vx_CC>PfلP} z1Gn^UU3jRAtIRǶ0 PLFαCN~9qV/. G2S@Hw`s=oz-+mXcPlWʸDޭ{qIXTGe-T-mWSʸ AMc/$<0uW^]ޘf ?pqPmc=sե 7<*Һ=E:@)EB%"3mUBJJ#Uc`WOq2AJ︝^$e<]\H:1TPgt4F?H:H7Eą'"λNZ(܅TB }`gu]' FKK @`F)%x>s$A!P[[KCCaח@TJ*:R WS@\H˹-F\fhY1o=9#vsYrs[  i[ "Z;$ڎi:,Gux΂-XI,`_zihh`ɒ%׏k5H)^RԄAix<jkkill@ 06p8\ )+@S WԵ1؊D'.wCWՒ !$Ln6 gZ C20yfZ0c|O%G%Q"N痾a88|֯7yܟ ӓM0 jZ[[illX8ô3000a%!חih6f&VxɡyczF\82.Ŗa.?f·){OBJ,=<:$L5S>w(J{ F T^ƨG!fD4p#^>g 8^엂}\mpNfÿowM@,u"S&_h OOԯ[th;ebH[u1| #p{Ӆ (xW7`;:{\v.Kc&SJV^CR'QRzQChB -djU'M B\FK?9Ba캈 aS8!@5t@j'䅶ZS *S"0{}i꯿am-$.OV6OSхZgj葂򈢣HCWn(>D`J߲−(F`0ܫ2B P]]Mss3J)a!3PWWGss3uuu3E|)UO *(#r5!x{zkK< åg b Dt|>|g<-'U`Al) t7gebƋOx[1|ʒF ^T߅60@\nO?|'U3t]'ixU @c팏14_ȡNR2Ӥ-q}}ķ\q+{[}j`'aL>@]dGg.Ul9;}R_ CCsA p0)ieҥ%EߣjA=}JAj T-d20Ù1^?{?Lp^^8%ʢ:el~&8!)]wnӄloV~C,y_yyyzI76ޜ Th ~-i"XKKuڜVpaise57Nj{jOpUpwd q>xTPL!1000b4 U*"Xox=~i-OJ 2-ѸT>dDYsA4 &kWs+/f͉JGct=wtaMխ2'/WRhRdD}IJF_x;Y%HkUW UPHwH EDhI$_2gA7auϸ\Yt4Uc$ %AMMͬXnzzzFy|hF(fBДz:QT¶?"[FNF\UZ4K(R GnAИ. k8!yte4!ܰmD׮#v]6T +:th 21lFR]'/{4]"+Ƥڪܷn+5R4Atǃq' ]'h6G}gXDž& 8NYO܄(5+/|0/U'p_s!IK` /q>ׇ}(qb٦ \shJ$tߐL!@"4 蔂WK+G\btoG:' cuˠb떁cu8{`X>6,YBmm-,b===2::k—WҥKgeLE DTy 0Ο Bw={M%EG'ȰL~;o+a? _n+4۶gkSϔ5,;L >NRJR= []%?{hx)<0! wM644 ,TVT&˙ŭfLG~itkhOƴ^iJ)L"D@BhG$jɁmY 07q-zǯǾbUJbېdIys=6/oYV w+XJfGRZmϝ}_k8a0nz`^@sʂt-\-$ ]5fiҵ'3" T5ҰrL$ b8f 2S)$RҽwM=& jM H'"kZwڙ#ŹC xJ13xۭt}kD_y9!V|=:~v3l Ch۞`)AP0imm 1n +Mdɒi'! g,]Ⰲ A}8KMBt2+BT!zc=c[+%Uz'r QJ:q\Kt͡HxxP/`5O=o^6xh7=ӟ jZcgLDz/1Sܒ*5{ƒnN&%FꖮqͱT5OKd}]v@*Kh[p&1R8Jwgȇ}u _uxNn~Swal'!NMu5+VuFk}aYtttm0@kk+s҆Jև m  :6Uߴqa S۞Reu嵓*vS> Vs d߼ iJ)s&ͤ`뛔rAxGT۽9KPws;y\\iض! 9A$90r4B*cp70 ꌙjTW! nfZ8{oOy8_Mj B@46|9p&_kWoqBMC3 ǃBx Cq'twwKB҂|vT04c ÐTw(-@dn"g j嚤ô7N%cC}ҶB%e6bz߻O}:ÞAlxXdmQr=KO:ɕ MS{ZRr<9ԥkŸJEM}}{|{zǗ4ܳ؀hB|=BcjV\IKKˬeMӤ."HQS?? LKK UUUFF)THYQT_K"nhY72!<8lGCqNGJjH ]4w֛b:3(u$h| `vO#a׳죟@+:q&YIrGJGZHv1O#I'5CNԂNj8o}[1x%4 !A? !%b4= à \I0XE\SNj!9E6}kaikim3Nzo}i ߇ oK+UKhZWmlB:Z -44@Bבm^P-/-R]a8inAnjErmɂ0m}"Lb@q~E75ԲؽRN vg KOz!(*cÓw #$*ht 7O OߚTJmO}ŒdZ$U7-~ ,bT:"@J9#υ@:΂)k&R:W|~v=vKI1,)*N$MBOBحm=˂!ϧԖ5V_ +/YB?].%>=Zg_h%R84Id 3'űI#MpX:b~,B,d¶&q0XIpJp#Hdo/}C7xq42c5kaN0t) ҄츗mypX~#~oF$" ux*CO?Ux9I (&ǭ)(a,"C Eo{'px4L 4Χʫ2^OM آ5t21g 4=~sVY~f4ÃcATT Dz1QabC}wf":=y.ncrP%LA:qƢ!z~=mR]MKg\'on3]hҡ*6?9J薧!1 à+V0+'a80fMԕ1uuJ'Bѱ8 \{~[R kfTux wLd2c?f婗)M+]O&)khX n , #`mBhJz/N3T,³X e mŶ)gSs&V}#ZZ3hIos1[pX. {NjX3{qKEdC.[={@- 7L<@1:ԫ[ǒJwp'ջVzY,MҔ?a IO.|@J=RiP'8 ck;us6`YhF}CkV~حx<ξ}ʺ~OCC#MZKU@U]чam7JPۘq)=S{.wD@q~̒Ϟ4w˜ )LO| hT-[UK90`}k扔sC_%Z͒}XE8K 1:8WX닷rj-,k[dHx]ׁ ᯫ_[6X߶ce8f4c%Rc2}Dzg, !м^+WtU4_s-Jx<;w=9%NS3RD<Ա;aW*c~F[] a(>YV\K#-!iRTf)-]_ MUtNgC!Q- ,5ɉ$,A{$#C ړjum+iWߣ /.!O_-о\rP'i\aƻ$tLMj_.^w``G"%*̩Jߺ tQG ?v+nAV^Mkk}}}޽h4zUߠ2 xWU Y5X9;|zMK׽GI*J˜u[dߑ Ռ7=k>Z֟66 J\/;YlђѼdFh)mĥ&;Ҟ;)k/fsw8YBBP !xi rTU=b}_oyenoDҙ,xV,9Vk!NjSO˨;LҁZ_rB =L4=10$@{CLdfXjG𢳴~ ۦfꪊwGTm#кuo?}:XI(ف0 kֲ}CWafՁw;HM@ufѻs 냦ax|5{poir8@l`C 4ÊM烀-M2gnZ=e9N$BbQbAN4JϏ@W< o :<Oɾݻ|,]+WΚ?(g{ݍeYA(fu`aU4hL(]C;UWM$G8 \d|T0?&Bu\4lv~**x$yoqQոMq0Jdj:p,ew\j|]L ]RN[c&ӆ 'BŗijȖWpL`tI`r*p.3{J5>( 1@nN9,)&ec׳+ӽ?p?ѽ{y6!|>˖ou7iDJ]G2B BJBߜIV !G]tV"FÅӰ|յlH=8g֜{sXvʹ p:d%iK L^X~Aۿ* I&B刳\G˗ ,+ǀO44M &P]] @,cΝDQjkkiii@ PE_,?X@>2vz(4!eig;E|8˖_?K>س[DjQbaIH.3T6lg$=io1:'Q୭ʫhZΙWä=!PuT|2unSԫRChDu^DlQW/A]jږv4*PD/ҷg+hDj),&4 -,=aop>iܒ;'1 jVjRDҲdmy2C8b`kx;WnYHlՑ(f2؜Hpq~3:E~X{ÒGpJ0 4M4m4IRض=FH)IRcln> !xdl\z阡UǏ!D!"@z$`^wu7o~Wwпgd`"XIn08 R2|x⭭SYYRd(fQQLă L**PDfk2#xGQ A @gs8~饡<͹&4 Iey K>1)G#/EK0+`+L+`\5^`<Ԫ^Zߗ=I#wQl /fNuvP t`T5@Eb=" N:GBNX%5 mJ0<[Кgq> e(\Է"6+.v@cw-"FGHK,0oXeY#@ 0LhfxDB8\&NieU>\fÈ-bx]$ȝbǂq[kZkeA-\?iJ%vpie;-ľb_(O f({-9!m9vQd_rU94H@s ^VhO7*aJDx<A!Z bilyimHܒ4#auDs buuxZ%Lk trRB Ԍqs~vZ!}tuDS@VW㭮؄< m18<ݞ*kd݉XNp3wcC,,=y܍QhE@0S$`-81ѱއp>gG܎ @qc}%7.APe3sS(o^4iG!]o.NCKCS'9wA#si%bZ(*i3g=w`|>|>߄v5mٳgQJK}} s2<P5#Qh\:s6^FDƉ놇܁ع ?zn^]UN6oL 0}`bbwm 1(b/lؿo|Rލx x<!z{2o֡Gź]TLM|z" ^yߖD"=&RNumc[6QDJY5#t:̉мe~G"c*Hc\S,p^ Q93X%5K {Ǎ?]دG8κG>g0Bhz3K<y``hk_3d5M- 0m'f^zJ/m;<0ceIh%n εBč&EDp8M-F?x'u[Wqony[:ht\@ioYtэVLY"h[e/9Vt׿r{2/↛zs~BX'5@eŮ8q;xhJV~`/Z*/58JϿ;V qN-!$Th!>C 7; NlRJe+ ֲ{8S*9NhX9Nt6c)a>"QѲ#+9Hh44^e_ǎD:7/ȊLI]cs8^ *ZʎpmHM0np@z:zN5ès kG"v`gay,CFboxc>OklYr5ޱa3z8ΩXd&3vLx&[ 3b~ةkc9m7_9mJ$xC^[i4_D*糍{F,]Ƕ/' F7J=xCg)mj糞řǏeP\oA\rOYbFΝFB9`-q5ZCW#zx$lTE?#6ۿy%7j2CNW`2N:?.gezz%\򾿠N5%Ս#r;!_8{^廿;*&4Ad* "e:PMgNC84.BUVatv NѿxG( 3cl vַlI AÚ 㪍7  Zs':!CfL6UY1EbA_@WdԠ@ i#L&C]5d|" s(?4޶9~e<^CdYT߈ɼz?8Rb_19ݦd:u=o,擂QoKq lxp 8ۣfQtZ+VgfO;G0n*q*혬BǾrr|/?K8QV<7]4=N0*hA-^wiIL%^-0poD#<znǏ K:;dJe0a"I&l(VM;lĿǙ,>۾FgБ ?j +W+SFztr1Q@ps=a,¶O".6Y M rAɕ&Zs9,9p;K/6 +#OfEU`㻾oMIm LJhz3 EG QZJ㗾JmUΎ;[hf,ljjl1ͤ YC:5.G=*n]Q(DCXP8$eURdUqufvB=_hExT Tq1&h9h4{ߣw!`Qޜ %ڳS|[fp?U& ؑZޚj6vCwX8@,J8q·s'hRtIwrġ;}Lotd94 uk8cܙTZ& Q).8"[:2zm:{#8EBaG&*矤'55ev"tlJ}G4 EWS(OqN߿3ȟPQ|+ݔLvd!"P`5J:NDG~/=|ek\G̵Jhvz#ۄ.[M_Ek$̩\9?3Iy7Y4]z_3)ס9vNϱĎe<@QN$瓐 űrx麑X;NvH}@rE+j{F{L~12defyO%Ź}t/=CQ,UהLKak3i@1 e{.Y̚ (B}t=M ɾye$u '] z]|xntEjW3Mҏ e%-#Z<^7ummu:crE[? H /xѠ,9qй-7D.H$BoooFѿoҠSNV%;foьxiۿS3?Wx&2w>ɚM7#&_a嚋xF'@GDM/kϡBNzњRQfXfR8q>g A woSi߸l-1ExiD#@?ܘ( cz}XEɃر/x&0}!;Q!à`=^`44uC&:4Dϱ(e;#a"Cz>PYT}#]~jV> L19'?:t0_6\F.K$D%?SPfDёŵz^R>YAל={~qEC_ivBYb1!jiA™X1̛υ˲˲ rGIYSSR[&GOݕ4G()k6*4+L|TsbtV:QHP@gDt-Q[$xbq|$64{Fl-[i#NlI'Cs>(8qƘcdseրW V~l}]QX\^~"ÁM;R%14LfKvQ޴c!q 5G_z344 WJgGGwQ*"I(OT&c\~S+) tqV__qA: t-9|gPK߶mz{{3$Mo4 /!c&l^B`[Q"CneIω<K44q 7?\Xf [LqfJǬo'T:ѩ_q;縣͘׍bt$ّQ i&<e6]qfFxQWfs,F͘Os46K&<3g8BjM\MzHiǙΓkmBPB{QcHybm"Qj>~<{~RJ~.֚.;0}Pu`ETTtErs a$Ck:>*Pt- / v O ;]t\bK -hXuO:;O', {(9MN!z-)40AyаfcA3T8O蜙TGwH JĦ[`Unt!A>Fg'=df~)erIqsS~:GPñMMIO&|E9ȵӓQ_&m׼ YED&_ ؞xY/b%gwwuKt =$;R똌"kEoDkԩ+iq:+XwYdAЄ7[;W~S>ŝD7qU Ə3\g_#F*a;4zM[cl;ωxv8=^~btvN$T'|^q?>ߕ]?ĥ=Oă #-B"0=h:7j]I^FOs2# L9y0 sqp^g4J~n~Ql?Bؠ5`E5.52'_{5cW\^6rMGב}}qb?hz KW#=m{H$쌼Kk`b#25]i^l1&ljOnPբ6oGۢa}Kf`;EP/"XYKybʛ/) %\ܝ+Y>N}8ocuvQ U o:.yC%dm&f&c.s IVddK ;/<+@\>X"F>>2M^ Mm2<FM3[`5"5˸ hvl]NQUǷ?C:&.?o`ۄ[|fkt\l6B`eJʈv%Bud/ 7L`!U1vm'@H+.'.8=4hMq_bp贋,8h7Zjkt۶sG4}B+w@D|OU[>ٍ ^AI+ rFi]klt^k=`{zz2 !7p?ERZB@ϤZ:y߾@Ɍxlgbh X2>5͘qN8ڶMO9(:[tx#/=MtӄhooQ Nj4LV(":fOs9d{{{uk\ !U-3'HCYbzN$eEyω׶fvV>9J7_ sg%fԼ\sS<bfoeTth#=vHt zjj"XY++ s  XQM˅`FWo?xu@m~1Xp);t|mI(7Il mdrpV+߇z:{87=G'# λ:[Cƅ$Hq'y y>K:a) qǡű-x'ၑ01=>G]kT4Q0Sns;q=ԷmEk&dle%Pׄwdü2\aPwR?RjnKW7+ ۙd&>\diN:"b [([pKӃP[6fjj1NΓaI pU\[)o66Bk!8C4hP@⭅m_wwcf,XQnZ:.ӄgȮ͹T/s@J9.A߃ǜk ?L(DBxhd4}8}Qʞ,i+*8Rv17|Gs.He ގ3}m?Ό[O_YT1g%R8?f]l]ɝ=IBǩZ*'A#b*d'4N*F ^ ;  e|y_LV&h$l͡bωCD"é3wbQ+y atG '&L:º}h$j H*1w) ޏ[ %=n\ TN "@ %R ډu|~Xww9B$B? xظ?[>Ɩ~}|]O1, 'P(~!_~!|s? 9U"Yǩ˔m]PQ6<ߦ8,Z(Q0"3I9Ԯ@~y~?~(v jG׷kIοYTƵO\$ IpZlhY3LQe=Ftڌ|EelX|jGQ\;z.?qal[E<X,4-Bs@ NI(dڋR7r) Z6\vlBJ!/~4 :J TxƯK߯DCC duv%B ran5KEf#sz&CpZ OS@) 4/Gӈ %fKعO$Y|9*7Y;4\.9ߠ/g cu#mrƐ*gO]8?m[Zu>i8-ZS(I٦Vh4JOOO)&鏜Tʜm?e_g*4~//)|q|fO.S` [%*nm4@idr`gX+ O3J2+#*XָBx 1^ v;^nUI ֥`_+M "x/N6%T|J*/\*:wI#HeKf췐BR2E~NSh!?i$軾'$-|u\aui'빻SjAZ1 D"q^?O_٬PRݔ1ۊ}3G# Uoyt8khV9$u>/]~EۧRPVDrbS҆d?Ek4b7xVs̞9XhVIi-ؖ&8Ι}$_9ZRۄ*yh9m D΃ІL^kHAUI}6碲uRö8PיoI*4<Hhzu%wCi=K8}@* 4MˡN0DZyzc|Ċ:sJ藬Ea(mt:t9HjSM['h3fog_QY=]q?S8ew~h^~:քx7‘@ _A 1 \eh<\e Z9ZVoawaGCSNrwrzKXzB3 ĎmR6C}]?]%*0<>Ǚ(mEmp>RET,@iXd2P >ý]t;KMx[| IJw8L¥0LZ+pP'}ir[>G*r6gJT̑shdRIRJ;OO) P\߄(wbЅU8%ŲaNz;axAGFJ(ec# O ua0}x1>?^eECD#1/%R5o4MVo`3$?J N} q$BK$}*=y@riPR׈|BI)Z[GҴnӜ Teå1^ Osm#wBUô%G!LP\^N۲)\bF#<_>ߨʪ#cYt!«׼ )g?я H[ h[zbc Zg 7B`-AA0Me: ?}Kv<iPȹ0CKR[5nϿK6UG|E{TP3M$< BPbU,+fVnex ͠Lr'+ZSTQdbtR؁ a'_ռ9οv3MHò+oys'E)Jc1ŠB8i|?s9!} J;η=Xc#%xx|l5zBH_v3&'?y;D=yiO)Mʛ;|&g癩D7rzF)Яșd 'Z(_Gƈő% [)//vSd t* SX͞ډw+AN_e˔2@Yο /?}JjoB"SW(xJ)S j!$_5v |d RwPٴ7iMz92dhjA[ғr]\rfVv`e›Mlm4c|, T-ZIk?8y<G#Hu,)LJ_I@sӤQ5S5rNt[ QٺU+Yq8wo'v^{6҆Vud?qqj"^e{0~ga cZuHL\?S :fgzeósH;{^HIӂϖJsxCˊ:M!; ?~쇢Rč mmxCo'#οa7rgGvB/gZV3!F((%0FlTwRT@i]k6v O S7Po7xRָƅؑ0g(8N 96VZ" TPR<ɷICR|-}.aTl`&f`E5%6$#Zh34jr|t)4lv㻓h2帳RpBl.k d(QVBױ޵(+G8ibYlS޴YO'?UʫYݣb%B4\ fJ%)*P hR sZ@1Ջۨeu"x W ?"Pڐ}54MJ K_R|Rd=-85h70";!߼+W̨N R:J9Ê=QmFOKc 4_q;Btr7WGJcb3@iKQCCCBPp T6 BHDYQzN5Gw\5752)VjQ6R'8L {' +ZtG# tb4եZ QTUGybʛ១lDFac- `HÀij(YG_ڿ<^8 B+{oMeoON0$YTSL'+gj Vq'uWOf <7~^ς|RS%]Ixĝ 1o)p( K싵49k3 0ŐRCXP@3g]軿/&(;# S8(R* h+*㊏K7yi Â~47\ -f]&RS/4;ป\,57- fXcyB૎X)9RJXpa^^7)&pJn d8uq` w+mչٿח\|۸:it)GUc@I]r= Yڮyߔ)MJphvpԠidb?_Jl xx\f7[  ʆןwEA}}=K,Iɾ4BH8%v!tJM۪so;ޟ@O&izXy廸,) 40q.%xA"cJϳd`` ᝟w\EItx`(F W<Gne\jh[F-KEwɒY"5!|NB³dX !fŊ9>/IQ+H]Ϗ̫jpZW3IDAT۪sEN9wsͧs1#jax|isU eTBtӛ\Ulj|#@ ͯ-729*cY~ OYyK R3q[J/$3Vį w_jOd&3l& q̙eeFٔ?fʆgE?}`"?u-ݎGI ˲-o6b=8&V@)ֺsA8رc3< `=v>gIο4L]|sLi!$ZNUNRi`R|("LP(DoooFfyP\ν()!XI?HG*GrY 5w[_2 Rs\ wHjfL\a(ւ| qbx3A[JICC˖-+8HiEkJ)Μ9aK A}?]ρV"Miʚ ᵧޙ ip\,m$q! Gߊ:}1%da# Z+@ DG_k5*ŽDŽ@ 0<^v :4=#}Z+RN@Ao$2p8qͧMe,h)0"CXQZʢgJ7s/IEPJf]Ah M'p@B}NVg3*țIkk+-ʻ_&iض]0S!pN:ec[e=P`v! qͻϷe浧AD_H/?}u>]0%Zvt:THH[)HeEGJ;5"w 6LBFFł  AzD"f UsǿE-|-T:bt6aZZ] Qj%sVtZ:cv)^74oVj" smR\fhZw0wn{^,YBSSSA{<#N\)dϞ=tvvD\p6<# 6.ѰȮQ{!$ V_ ᴔy%N a+.(qG J'HF<KXGopva:)l64Z+2 $p-8GJeE*JS~9q h;:=cqWq̚5Z)4vL'p(mq#ߐs>w 9A 9z;֎ߞ2߸ LbWA ̵H8ϸ'K X#dS703tv#2:ŬZm +fJ):;;9x }}} ^Xwݎao(4ͬ<)O8BPp57~GTq Ӄ4L40 Y.kMfYCCCy|ZAM5Mt3?c*􊫨O8z.ӯ_jņLU/x#RFd&`x|C\o$yG_챔Ǽ io1JJ`YI* vI6Il lArɒ5$S9RHNp$!^`p͐7M)ʷ֚pP[2700]_^dW\X3ɳRč Y+ZKG A%Ұ꒼kTj_kG dy|Aֿ\G_4I^vn}J h_PtEH6 5neR\{K2Cژ@Pjth70}ݎ's6Bikk=aTz @$V.B\VgpMo@\vP~wC8az?cKgθ=!؟Zt/X7PBd%lxgܞ)ut7/?aE A 7QŮBfԘh\&ABөef,&2\$ئ|rc3޴! )%rcRݛx?T".{-OĎvni ~7,XlQb!;R B,KujBPZ~Wu ~SR ,[NnC tQ}\ N.7Va,VKMLRS.WSPq kU9۱"}I.)N@A}}=+V?2P+֜={g7, 5p1uټ1ge hYcP\ocxէ6 cG t` -y2tiz@J4 ie\owcՋֲ-eW$sh=ϧTY-+Mjjne/5-RpK" Q[W\¤TRa+YpqT/?vXip9B,{맗h4ʉ'8z(POgߥ7Ǒ{owD-nF\9 9- _HqMӤVz8jAmRh-DHU%$mypHMݮ2A$pᨽ?l '2Ӕ GH[;n..rԔ |;n`*DÎ Odt^/˖-c)=!DR@Ck۶ȑ#egPۂ]!b7yɞå7;NKL*H4M˝֕X劲-zNχ)$)p/E1rJ4<Ķ}g%? W^M? R@h~f]&#ڥٮ\ΥR-^eP"^T]9RB'<XF翨˗S]]=8O# >|K"n|;/ʆZ6wm6+83:{^VΣam )d#s:yp1Kκ&%esHXgkHjQ#n`2Xq!eeeQR2Kb}dd sN:_ ]m08J4~.x!!n00Veϙc飩NCyyHʶ֊3mmZm29y~DLu/ΓeBY$4%elbyʝ>Hj* Ka J[(~7{TVVzj@) &GQRIgϞ Nq-pɍ`̒R$<U _|[=o> c\Kyyy"}(+w=+2V6Znpv4S?tB)pb \jhXY£Zzt=E8°gk4ߣYpqW:J6 !fժU)J (8|0G%dD! q;a}&q֕7|kmU LC~!α-#C}JҬB"M ^?uHKJ/~O,- BRh$sqFgkn)~L"Зr"(<XNZzy0.?'3mcYVR5X9vF ͈ow>yz:h? m!n#(*˷U?z;6 !Ftv4$/T!2InʓefC3l+y.KS xRѧa{.LZ8#fA@~]NyHJI}}=+VHśx^#NRj&X޽{9yd0<кqͰd軿ݎ6=cמF %=$  RRR*edES|`Qd]-9MG9Xpj|nf<$sq3Y￵{s6r%YvqSo;,Y,/> )ۥ466lٲiz2'iRH$B0q,bϞ=:u*;_Pۄp-gNegTE\z3leh#ؖ3_Ch(!!;c~3ʊHt50ʊ;NVQ^N}: ?W…@qyNms_qy-+L*x).maG¹tRhe#@Hw \E+]^RN4yߦPRiϫB(Z9cE\mw~hx̒S.XG㗾ahh]vy?F8#2._Cq3o|=1<vrIJIiii-(:CP`Fkծstɓ?2CݧS7>*gs8W`ö ^|rԔyL/|kY7қgH4"8Xݻ`lEҀk׾Z|9Ox}OaCϠ6Ve@c`L0 &Z8BJdm!4L `N1#s:)|Y,=l0,Q\v).ΨJpb-]rKGm_g4 M95 dC4cJpNJeF0DeM^@-rQ=F4zJ.q[]lFp 4-Eq(*ͷUہ4MJKK'˵^E.QV)uƥpQVg_y"uT4OP.ٮ;eB"vc5RSq% Z:q0pxJpx@6&iER-`}tvv:(vJ/q(瓎7}Loʞ3KUJ7Mz'~ҝq|lkwP.SGkŎW3!!(^!-_?Ȣ8KT*q.dԔ 2=&<_ {b km9X O*lTirِwQ~Y+ :*8ep}][򏀒 U;-.sۡ. MNPkp|?=7<x< ٶ& "(R?uǼ XԜfkJ57o.D bXV7x4Y-5 Q;G 0Kbي2a6K+MhE%y'=`0IENDB`fastapi-0.110.3/docs/en/docs/img/async/parallel-burgers/parallel-burgers-03.png000066400000000000000000005112641461403617600271330ustar00rootroot00000000000000PNG  IHDRX#IDATxw\uיd{!$!IkAzE^zφ+ "((R7!B !}s~|nv$~>dwv~bzō2U2ːD*BnuIr[8yU"2e䓴᪆w7>{|6l+$9}<-BTr+u[ $}*9qg'`[S34rz"""""""9ŭa * """"""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( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2( """"""2Amx4J q8`Ƕq]@0H2vl|X,8ͷi mχ?u]r,¢x """""""Ǖӏ?êdigʢZjk:kkmD˲„a0ٹD"Yd䒝K $|$$~?o *AB0HP8B$+p8B(,8@(&++@0HVvHHV6EC6t͊D"n,f6P(em6mqqL@ǿln.vo].|p|`Y-k{:hK)r (,ư#),FAQqk !++\s(VBVv9呕o@1 椽y7o- Y׶, \750вoY8 @2i7g؎.8cͷ4,Z-,Z-0u<2m .`..4͏m;.5w(3XXX>``0H(!/| Q\2a#FR4br /(l] $ #DDDDDDD:c7hp(Hqq|f~I!2'ɤC `6x߇B"$4D& 8 plvx<ٺɏ'8C2ip] "`6pE~$>߇8fmA"O ML:Ilm~~qpmzc46ň$`;ͯmq\ZgCkS9 Ba欂\ O~aydDLyDn.~`(ǶmHk)D0"  3'""""""#0eȣc-a {$ҶIϊ X,45I$m$XvF45ʼn7DmZj뚨oj_"$h,p1D5ϪH $,q)e p8 mJr+(`CvN.yK X EDDDDD>p,S*m9GjJ$lIں&6RSHMM#5 Ou545hl'I$I\vښ$: ns9L[oG $[e-A @ LǾuξ^=dcv|3Ons/8XX,AEeM1hh44DiƉǓb 8K)S:6U4˲(*w~U>2!3rO^^yyY;M8@4(eTVqpee46hhL&;[|>1im70MkJ\*Jyw) """""2(p7Oji.Ohog%O%O5Xx,܀є,ض$0kjs8>o`$"""""" H%IՈ( }N:dʊ]( H$aYTZDDDDDDP@2e!c4 jDDDDDD k"h`Yv2=DDDDDD?( U[D]$.!""""""Aɨ(۲,,~DDDDDDvfQU )c]Ų\a QmeYB\au8r?ՈH $q]7`(4@ HFUT֥]G`%""""""ҞQuMO|>DDDDDD1 uuMibDDDDDD$1uM46R.|de ЊDDDDDD1%R. ЊDDDDDD1hx"r''/V$""""""-ilL)ArhE""""""BɘzI@""""""MɘzM,"@dLUu=\ ge ЊDDDDDD1@j@N^>`p`$""""""MA@ɘڦ ,kV#"""""") MeY jDDDDDD=$#Ih<XtdDEe=˲$hlH)Y>hE""""""ҞUUɔ,";'wV$"""""") QQY|̂DDDDDD$Uضr''/V$"""""") QQQ frrfA""""""BɈꆴ|~?YYHɈHd`$"""""")^kih]D`E""""""ґkԔXtZ<$O]d3+^K$pq?1jxN=<ο*&OI0W'"NJn )!@z&/{_IcUy&7cLDDDz#ⓏͥրfYī?n_\=@N9o8q.u5,[O= o,{zDH69ٹ;srr9t( rh~+, k.e DO>Ə~{>|Lz{e$rI45#3ap;g@m@h3PeI.Q8&Tr%aBC?o9ǰ$UU,%N~36 IMRxrquY j+*>MО .. uxvlć?%n3Dyyk&Vύ0wD rz}2eeׇKc}F+<֯0"""P_>uu7c}p,L?'8?| k{6x߯%'578UeY)XŇ>|>0Vd7ز~-u51r>r4sO=<xo7kmc['>E9L4ٳ1{xƍ߯ |X> ˣM 9VHضͽw5.|odðQO:&u>f۔>]8Gaxש?{dxɂ,4 !}UPVD:g?`y9T~H}&q ?xy,8<>13 [@yyyDyy-l~_ZCNvay̝3g焙^R0ѱtu]kkfA%"""u>gqp 0a7_̮kz4rXV2X \~٬ĉc`\l+^әSyPP0a[+`{Y OaךMo2/V} |Ϫ@dm;5Q[Į=}ysCLq0xhػܲ_T?\5Y@dƌCYYd!.$6Wsp5˖oaܸ.<.{"%%l,lQ1@n7u8|"ӭ'CI?2&ð\UPQBz}f Ϧt]Y37_vol\|tGDz%OOtR*++I$:'پvy99gePp] D"X """ǹ{w_濅 {.ļ0zjh+:e<8wi>1 vó`2y/w+ 2@&Lood׮]K<[rlZlۡ^^ǒbܸvI\x\O=p<456* """ǽZxJn=|f N? ]`J j u]uo.GZ|6mӦMټy3?8O>$k֬%}a5zYp᰺~o\'r89% "Y|LX0 ^x+}@o^wxL٣pMJ0֯Q,& ̙3g'$'O&la2ٶq^(eYxx<6+?E0{+N?VLgMM?K|£Qx"=^tdggpBNx ..B uIߔ^6ՕApDԣÇC{X~=׿x'ٸq#h.lq;_!Σx[E,6rl,<{Aeq<һwgQ0|8(hjl=>N~oS[] 2h1zh~_/| lxko^㺞*+"""Ǽh[YS˂"A8zLPPy뺔:#zٹeS?.LdhQ[n?8NeS4s/Sb O\Mz G  Z3Ýo> &Ѧa^8h69c_&2ьCl44H'9w~\'0/yflڲ:J29""""2`jؿg;l0U$&F3a4M̄)?y T;nG  5ϝxCPo7uϩu:nM|bI}"CA 馛L#-[S2lV_.CW?@8+K6r+_7rpJƆz\ű͌z]4_xv"N>ƌH0to{k;6aY0k4|d!.3"pTV [~a]e5Orǟ1h"ǯ> \}?i%k38V ȐU[]E2 i'6|$~hZ^~ k/x,8)N&I*J,+eۦ <),gp5ER2rT_.شl?}aN(K̟fCY-<oM+ p]o.?|;|oY&2.mҤI\pix\eێCD "Vvk_)/=D2rSֲ<k\%aJl\Sn ]_D"8'/Z*@VFؚ> Ni WQ~"/yڋ-b̘1޽;8u ǰx"a$u/ij_l5 ς#aXē`:tYיD<κ˸s7gWS{A擕MC}쭄_ÀhRh{v1uX_ƍc֬Yh,L6?"7w,Xȱu]vm̃~TUg6qMӵ(|,ӽɁDjfc 6:i4ﺱ_Yrx8@-6[va< ^JDž%[ᾥH/)H藮>+/u9x5bD!Z˟k/澻ț ֟#<¾J8XX䚔w.o\߾>6DA_8ܲo}Fmj<}#wGfX~҅x_ fRXy0s_q.#aˇ~W_38p86q\v:e{d|>9uYe~zq͛$۳0La6a&ɤQjM 8BAVY@I.1l67® huPY^]?5ow*JU&a;mW ?y>u!L6p<<_cO<~J'E@m/}K|+_N?ɓ5j۷oO*bkl@n^~/FDDPTv}/ MlKkaaz]8o&)"&p$^ /luL@'K65׻$[xLMm7__W1oᙢ >xv/u^? r{?i߿"zXf oF˯~+Oۖ0n8@YY-U Y؛0y&[_E4 ?s*6 JNYf#cwb125>14[7wupoF=d(nW};/TA'_Ē&&3XU^g~=X // Kzشi[liZq{,bܹ+iQh,NiY ˗>;u]rIk_`ױmSe0SOBV̲L~]=b|s*li4?xo?r/Һ=kd}0/IYK1|[fw|4,53 榽[ٳӧO|ӏǓ[֛ i}B0 Au]^~|ױ%ޛ‡υ\O> ٦~|q ugw}=n2n;[̌,7>q$mst7wë[MyBҁMM &#˜Nm}FNEEEi\gʕ9sf6oߛ,ϺŐҶDDDs#qnbyr|J87^n(E0sPz?c[NO0'׋f/|R36 H%+[o X ߂~:mow̎1cƐrY"`Ş2e yy?ׅ;t2X RV??Ɨ(=t Jej? \wdF/0d?ϕuMyGk>8q,MqNz)tfXi' m zҁ7/BG! az?t!O;<o8rL;c Pϟ1+_SUxᥗ^" 6VSZ^{$gEgm: W/C]ggLz㿽 Fwzb: σ.=Ӯv]/~> _,fbW62GaW0$5cD>L,LfȰ\xBU#$fnY\̟ppԟ, /mm Ye1'8|p,Wy v.>_~3z99juO{孷ӻ 5kVډ1@Scf92I;U!""2۵۾qٕv/®7Ol7>tNd"y~^Xۓ^?~?vGb;j #o\<3`!Xی]<\۶LŻNVo>yɔ y%&@98faR|">"-u]lXk9*6lXռKO1gJVl}K$US4~ӒvrG∈ *~/qʴL9_8slǶ5voe8Nkv&_[]~] \uE)4Mc#†GԬO3FX#@A/a^8`JECiqbϟXDM[vIҏMc|G`#""rbp@`Vt Y{pkuM#oD)M)@R?P K7}Ir湩YCm~oeKk!\W_dZb8?,6&KrL%MMY2 KL`to|23atyn5Xp'a[)m%j+=- SeyE^wk>}:45vMmhh`ɒ%,Z(p8g3<8.=uNouԶn;i ["L+sgФ󉈈W}^|6%;`-IYGw~Uٌ5ꃝe aD`ͲyǸť G"iꔩ xߊ8Jᔉf*QMs4ŷL ςD.1L0ƛ 4n~nB~S3O3mly:`&4 9|s)8oFzV<&9z,3sH3YtRlN|ѢED"9lذ PXXx۟^_JLcIҶ޷uLDDd8_ﺓVGs8T54o%.G'sw]r ^\Nyǯ<}&%.& ^M&8&1 r#de߽>}8ǬϦOGՍ_@&g .|_#Qj,"G /s{EEwwcɞH$ٵ;y`ZD{bU\  @0 MV_L2M=M;NGhbVxŤwt`16gJZumj_iP.j~ГS4$m`z2l-55 Õo 0wɂ&IO~wd8(ȽPg ~x~JNn Eds*w1cP}nhfMXVEunܤ)>I NO }&S^Mf|/5M}H} SgJ>s;E0#Pp/Ŕ'0l<;4iRml2x ؾN_3fsai퀮c~!"""ǣ’M ~G7{. iX/}oY0kts=y.\vӽ7@C]-O]S78y-]+:|\^Qg Mk#ST S1g!PIٻs{fKDRd3HKr]τ;w.99sawbӖHL灇Cc ""CD,?ښ|?SM7u/ 4ZfWasaDz(=F4/y8/<e:WY^vS_8їכ.ְ¼)ogenda$h\vp`.yQ*28s;w:ɓ'S\]kl޿-1=pП3& m-~)ePbNF7L_0n<1)Mq3RXe5osb/:p& *M;5Mcǎl 3õGmOe7ՍmY 'MR3]0I{ʲ &r;aRdlդuMsYxy逿~h?/k'O/}ү:~Xkk)]xo{۰`awϡCذa_v9(321{@'a`֪nW7[5[=>ׇбPUqY"ҩ|>3fnݺu455y^w 7}@']8}{yJF*"?/}*ؾa0BDDxsO} 7^ 4wdaNY/9ьa8Nlk+z`N5ٝض͒bYW]_19}4k"͝˿/q/Mz&>n&Fٳ!%zX] =A CQd~;62?a~nۗl/M-@0CcEUFg̛7Q+++ٷo}0ַ83=wWl൥}CNv KhldҐ:[ADD8QW[e6|>b'Hmfljg3F'.a:w8q 䶻9aRSPf&C{#ijlX 碫; &NN0WDžm?>YYYdeeO|Li~y=e;Ͳ뺦Tẇ>njky/JvW'y7 lie沅x^ݚv[˲6|d^̜9amm-۶u>|8vÇ)νåՙZj9q"ڔp0|>Z>vqLH[@Q6T%pNkSu GR7c V큟>Vfp8a4ynll`Ogஇᆛ>cJ8<5VBSc6fB *7|]vqm\W`Df&C%!P߽lNy9gsX˝i9yL=ADRd40eFms.{/}3w_9>؀Ϛ1HVZv ϗѷ|N"""Ǚ-ץte-TMN-#ok槞͆.I%N5'/?|4<dq2F҉AbL>|?1K,'6EƽtxG'gc͊="C\&L|픗9})Op8y]偗Idri77qٶ MB^^omGUMqJ㎓x"""^*J[<|?Lhl+ɃN^|~e S]6HrfGLK Ѿ;6MvQja8UNߢ/J?FCv5,/_[3?_~*0v1%5Spt8Gdx`ƌQjkkٽ3C-cY bndQ^^KuMo'+!QSHiif3N=e*ϿX,qBM~@@c[DD$R&VYVڶ1$M߈hLpuYkTUfňH%Ə9 5kt1 ַѣ=w|{WryQeYDlݞ_YggVfq8-u"""Ǜ_j]4=UuvL_~{I.05~"E@6"Nھ=Օwh8"M|;SD,ddgW:fn[xx`tҞ@0u:ou5սYt'%=qXbEO窫tΝX-`r]z;|7@),糈'lolO϶ٲ`ϲ~⊈&ޮ#ij>0'wGpR3k}`g6W|t?WE(`Fzc(k:ÇH&: =ƻy ~w1>1O@`1{gcۼs#;)e5E`bl~X|4Ϝ`tA(LݧG3Gi#L]M{\X2mo|b i@8On>y*++e !1ku]֮Ow?۠;B&z[^QKcc i qgdw9ƅBa|v'@jhl֗})@A4l>fw 3mA"6l>x&Ֆ28|pa޾yc]BgCg[>Ս1\L`#?%'¨Bd/Lw\Z竗'4ˤ lj 9{:>y?)m_uu5+WdڴiiYd 'ظq#3f Ŝy晜wydees=sΔoGc3 .44̿ɞ`:O=& NJ'oĶ{K">H>P􁔆Ǿ5߇k1'fڢkvj$pꩧR\\vڟL&y饗R.>9JK:F"Ν>1wP\s7w^{-%[]{J5#3,r aYL:\͜#{cSyl޲9'f3ͫs $GDDXWX;4:|V܋~acoP= !i{ozНzхa{ L7J'MqO)ƍǼy.w]%KP]] mq|øc|{g#Eaa!YYYix(}deoy3xu}L׾9C,z-9>C!ڗ%Ԧzf^a6|X\'ff F8`8-OmIXˤOzI1o37{Wpػ#=7mf= *J`'M-+J=U,)=[D~Č5gAVܼ|>/1q~Z'P(\ݬYd2wJuu5e;^z%>SXXxZx1˖-K<';̄ݨ\t]n&1xsv@9o~2DD8ߖSIoXpyL4\KG0>s!|p.b3qDs*(3_l&LZMڶ_ǨxM˦h.Lbώm45ͨQv uuW~ 6J0wEȱ)_Y9|i*"g4-"777z?0a?O_ԩS7 x̘bF OGٴƬf 3RY]Ϫ5;3)Ho;6qeq,+/m/tR;NUן9ɓO>ɚ5k뮻سgv˭|+_aժUr)Kێ̇.2]ﭚ妄ho6}j5a0e9x$س+=ˣE(`J4ZoHϰqL 7}=zt}k 8yǸ馛m۶m,_<-%,s9|4m$9&IJ,E$eD ""ǯ`畄m tL鷀0}(..&77N;lr<m;v,eQPP@II m8XzpB(jހHӜ,3#ȞsѶ6t^2@Qs?8<X*=(8d"HfY3<3uj>C=ܹs{2=B3ݕ‚AƦx3H84CDDd m Ϳ*cCgWd޽qwf(yרfŊ,]쥽2 6]?S&>+w%쉩=' vm#۷r*ؕ"/7iz3 EJeq΅-"g,;NMr]H$]w5\s)>eee#[|=>r[c ѾuWXC(:ƎOlbl""2m+S`AI [\y|>liVfc|$6\dx9g쮀g۝f4q&֜x?\yӈ| ú=ʎoX7A$}W΅'8*Oaf;e`$2i:aÆy^g6D"B]D]l;@Sov"//5 HRY}yYD"!cyO#$<\%S9~e[RTo} `ӦMlܸb4o{! Ih4ڶ꼹8&f4=Gy-_=@#/=۽=^(=̮=#0} La(K~dk<&5զ|dU灑='_3uf3xE$Uf̘q}Ʊ;crDDD#G&7oʢͧ*O@#A(5$̸4 O]''6i[{S^sg0!f{AQPЃSGtRV}͏.U} YDqH@# =!""r|1j 9ydײ,| VfsblQ?yO:egywɦd=>(0YOm^f{bLaflR$|ھ->Ё}44t3S:3>uPl{ )p l7Ξ^6.xmj4EL:u.+z0=5<7lj[L~JrB/e6LyY߃0nȜı0}dJka՞`\Q[uPmۘ]*/|`7 )^uW//^j> Mk@AA|,|Ȁ,x6dNJ&,SNwϖ'" `ɓ'3|y晴l桇3LZ^}U{9***pkY0zT1(.JO!ܜ+u约@s eY(""ǷE$EC}v2~222k5'U 2˂#ᤱi#~T\V̀mM n +d-  ltAa&!E(aS *;Isie)vW~FEo4M#Ƃ8G}ŲϻkFo .5H~0m4N:$\駟$ rWP__߲A,c {}yY'iM{cSqm+5 v=j9L:'ӌo u pk&!]zgN1e -laƻuGq̨L{w]={ j"~ζ G5=IL!+}\{ >_@0Sn="ҩ~ X5\:3M[|`۶m/++Lpi5plM7E"oꂟ uMBcgYG[YDDxQ<|g,32u;8\ n׵ gyG S~~v_oYہ6N.658MMU d:w/QxOMՁ|†? \lz k@u=!wzL*̂ Ow #L=#"yG^^iى8OH'xŸG0Ȟy2NS=>fx˶py'e<) 5GM~<7'55߲\lnK6DDDeЍ<ڿ7ߤ{x֤F9nuT3%8O⭰`bA^:JrawEŮrx7}`IxxL;]vٺ}d9Yn(8t^xlK޽ 2> ϬhYwRNu, S1fľYt2Ni@-n}l μ# r瞅/˗RbD =? lMIieLG,>qd1r {iN_ݶYf{fG24ku PHn6vYyJ^Q>p=f_s'd1$lp&ϟ77&pW7U|z >|ACcPfrd~Sc'E μCs91jjٳ<@BEeͩreXͿ 奇8{W#8Nٔ9yf=X}f=mcց#2Gu8/.`gP4{ kLD~U_of|.Pڽpl V#` f2ć526 O<@5߼B2m>~x3~m}Y ~{yv y,F-⸦6v}PP^QGcS[B$2x;{m2"""ǣ;S_Tmi?,96-@]#cN$i l|GՐLojl ɳNI}Q^Zm)ᛏ?V,E|'8|_f߂Gy6T쵲:`ˡoc;$m?dI_tK87oƲ,|>Ǐ&SN9ɓ'z.o,؏J9a;_k۸Nzu\3?>c{FEJnnVƟ) ""CέE;|`°tX3 pW9D&%swIQ 55-T#m(}֑x>o#7 kp~|}1u5թW,m&վ%fX m3 GW oƛa&S1꣰ L~yJ{1l-4'v+ ZHuXn?xרq\eҤI\z|+_#Ol֮]in>>= yiÉ6_M}~ccS~ug.ODDSv`z{Vl;+_8(;YKr= ,F3u&憮{t} r&m>E,2~e3'N1(΁`&jd;']r |u>iHSZ!$Kn|>gur9zDG<׿?)ion555_K?I&I/:4/c%*p~ӫkjmg>wcLeQXI 3;i +q;nB^:c 49כ&:#`Mx6Y]N3 zQ454ml$/gP/}o.gώmWn9d6$#S! ۯg6yuCM ztgOoc8Ԗ&qͿeY̞L:=k^ܥ>˲bҤIL0˲xWۈǽ޽}c|`̙3Sv('ڈЭۻ3, uֿ2[SUpisAF _pG8I0$""rE C^t@av}m2Mo`&(3p.Gg:s67~d_n<tIOyG¬u,J^,;E!7FN})Ϳ;_]ng8WA,aΝy֦6;v,7y;߉\

[DVZwL,++}{|hC {\pXECCr wudqx7xG 뮻<X1*Ş慅9]®V>]VV UJ4j&%%q=G!k2\YJ I`TmT6gfu 1(3PS<5FB\{ui@ _;lb◼{DœfL^~\ >ꏌ8("=.+`w7j(ڔ˦LB  L+P[[˾}[3,ˢS'o~8~:#G\ԯ^ݿmyiY)TX,JMUeɗ&Ϙ 3 GWmHh;)Ꮯ׷u,r~p_9ޒ$ deFy#Hƴg}n'xX̤ 6onߏlذK2n8f̘šo YYu+CS{֚eq9]죳i>jF(|~c2q$b﵈n:f5ƻ0mfVn>G'`Mohd6e Nn FqJ}/.9p~'3ߖ("G/ݸs4_EEֲLx<-«Jo~Ox'Z/(YSIæU5m[_ >eYyLO ?[$1a\oGpi5K^SvvO^Gg F-"aHDD84e,5{l/߼?|o?l>tt7,'~qMjxgM:0Iˮ_.O[O<7;% y|a#zEdIӚ^]]bĈ7x?HiӦANN馛Z\g6+W$pBOw$5KRvldϏ@4n0uY=:tˆz>ƍ߼u..c72̔ߗu]BٴPDD$ӦΜͰ#9X:cw_4kو7%<o ptC@0`pdXր7|Cw6yߨ)XiTS?62M)GӮMrs#\yLٓyʪzh˂gyoC26vq3i^H/ FL R?;ut4s)xi6ͿKxL}eŹ]L^_]S紀3voDWuHVv7X~,,%gixyKzF'{I:%"[ڻiFNNNx>qX|9my衇H{nR*կ~̙ӺIꪫ@ccc9u^%~h/3}m\{9}}~}be #\U.nwA~6O+yG04DDD2/bgo;%0cI)nj†endd9}Z dWՐ7*U)9 p5"Y|[ߥ?G7,t1*l<Wχ}h7= <̘}REdK L4O.~lذ!vpm>Ә0a6mJ_PqqNR,Sȇ.$>ض [~N:qbFc4EMŲ(.̠ɥ}9Pc_o]EUEÊ}UpRiQ Zxncf55y v̉~}̜W4 ]l:l0޹L8 (ʆݴm6Ս&+stl`Y֠_y'ߥp7%- \>Λq=:S5cl3!j,osj鞴w\-ZkZ^^biN?yu*@O+),/#gCP3;;H$*s F~zJDDd9swПjo3fvdr n^S4o[J7 `T>\8l ;V^vہ}鷫jL؛ uYО8#ǎo=;u>&mpx9*Qi2%[aoezHK~mN-"SK=}N$Y_)`n&&OL"=7hhhH](EEo_~9v,y'Ms6]j뎃յus>12X[Ķ[׏YtL>8C"޽:2?>e0' ہ7?V[O*/] _ Κ r!7`etlu7L@tەי> zqH]&܃?+~3]>2 ;_Mؘ/MK07{O;˻=3|>"Ǹ z*&MJ9O&˼i>}:9tv{oN~1{vk၀Θ%ݺOo|+_ږS&h=ed:XzTr3}[XH &N_6_ ĚڍK0uItȌc]n6Ld |T}R 2t/\&u55?Tam l>O=p>NϏ7ǽ&`>Sfqd8q),C>ohKnl ueAI yn)Mhu]B!z92@(ꫯf).]J4ZoYXx1z+k֬IOH$W\ŋZN/(s^ȫ=)sLsZhs~^^trF/ҮyDDDo ڳO^M㵺_aÞ&?WVg4ՋFX3SKl6uZS#z(7]ץʣ`+,gq6wش~M \xX#0<&LvWM Sહ ,"ڔ޴[D-!]s5yTWW^VYf;l0֭[NUULu;bK2l=-,f3w-yGv;0gb \448ڱ4Ͳ,N 'XsjpB`2u~}'mfdZcl8[jmWO?'";ՒL$t_ B\xŵ9TxoRUQ~؎P[,k_pd\r"k7uң|",:=v={6~:V^n˲,{キ?@,xq|"7l"n49&t]z.KYYgUU5MMqVI;cS3A_n 1|>'Oe{бtC=DDd9z,Sg9`{Y.l\ ONT;-]:L'L5 hL$˲{Âbb fً r#N_8|pDq]dJ;`}ٷ_s޲yP(&e9 ^Rq6A7-$qDDdse]7r1>ē*E>EYBY{|AI/ ?@,%ھ1, q7=-?<'󁀠0'>y<NJVWiړ1]{wOӞ3#YYYRTTĈ#())aь53zhF/˺(O<[l6morG1cZ/SWCUx>v#Vo֊Yx!#,qo}1-t3`s hml9z.Pc{96kKMou] Dz<~Г˻9_yy0k)8,U @L&Yz5xg8x D'e1|p:,N8Ə)))eq,$mO}{,q]兗ױiq޿#F,_5`YM o'MWOA~ Dd"A0Կ%"""34soXі2ʯzg (kf7}F6o/3S ZXӹ.l^^|/<͡}{,/ŶmN9kHD_хN+|S(ޝۙ<}Ѿ<`]vTVVUeY;|S"???? |>1mq3zm!r,ؽLp u6t̨+S'~mAg;‘sO=Ǿu-سcoA|>FĩyYß kOmٸMλ^2Hxnm۶0;,ˢ /~̛7WJ .d٬\s O_[X-m҄L2:ϱbvnRJ 1?G) }N8XKt!""2O/E Z<:q`wznVO><UON/̆fA4`Aai5zV7ˊz0 ')2 8kz߽c =7:}O8 StMl޼uaƌ\}Ռ|L8=o{SNuRqq17|3;˷bն^=OWc,]uĝ3fHs/]iLcܜHZ:wT^DDH;Qsh|.4% rg{h^ ?|ʌpX4'm]osӽmZXhd<: -ñ:D=r[@In0jVY,)ݶdh(2T,@ @II ^z)]w .$++[oi~s9_dtQ}{Yv-wuX,(o,YM(+iwQQ. >!1u(LYa:ևى8X#+9^̹CY,N7+?X+S]פ?lϟgM5َVc5 74Gꭜw.szu +v-8eb4Ք{sz߲|?-မ`ϧRw3c2 x%:H &"Hɓ'wL>=gE{1֬YrD"?l?9#Gfn3=$w}7F\;w$m_^GyeY&R} mKo{j[쩄.7ÙSi0,:xc',aI0TpIK¬ h$КGM5n[cXQfz0t%GQnzxu^mJmYQ?8w:D29#NĈWg9)NRW^eכϲs3DkqbL bxxfW麝?h|:*vg"o&-3Nz0@DLo<.R~PSӖH$<\dԩ[\$!c1~wi uɲ,N;ef:dg}8N[7c͉翟9{)@$΁ݩ;8\[&4jKjpwu}p!LP$¢8cJKޣg'b4TlZ{ݫf&si>`ѕc}Y0il9 {*Lǚ.뒈5Rg{7?3|\Nzs-9ţzޔPD2[3Af̘Yx7H$B4LGW_}|}ݜpBfwɪU.̜MCU,^9BŵW'sSGcD;%T"""Qq jdؾQozD}CK5:{`HqMGV]Z.:_¡MY2cѻ9mxL|:0w r9lٲtouˣ0AKr 7p=0gΜ^/O:h[O'xw&UkvR]c>.X8dy'yY~m%""rrʥo^4oVz5g 7i.>du MsS<ƼOi#:;d3ԕsXC /aݳgH4>c̦}0$ӌ1S>4ϞNƩڿe랺\ĜK?Ę&E䈺}}嗓D"̙3SR]eժUp ]׋{gH$ҌQ@qQ439 (.%1y뚳tP m j$H;O4umo|T:.cS4v:`z7f9N8 y%2)}"/b6^|9mSu(̆@M]پ?Wp]v|z)v-[_~de]f6Y!Si^ el:6Uyyw>ā (^vΜ9=ߎP]]5\.k׮odGZ6ny #||q{O^ŨMVvLJ;43-iUaŮ֤GX~ OeMe8w|bh6Fc@Džv" Aypɉ 3!'  [M5>V_q~E*D{H"ཧ{NN赽5[9&3SW:ctc%X˖ȷh(2кU0b>loZo>pA/^Rb >q2q#>ԐL&W_4v>ń>j8}>yY&oYZ 3vιT݂6,7#ڏhk?u ) Z_: uzB!Q0coj<6@[3/l՗y 1i.ѺJd `Tsh'Tݘ:o0[]*πEL̝DQ i®vخKcu)K]o}}䏘 "@eqWqr33ۯ"NYr/rfL $C/HH iK@CS1{m5z:tmߝw{]'ngwgg>zq֯_CwS__?z{x~:tz9u===D"pjWE*+ 'zmKKhllllllN_^x#_z V6XY C!4{rXy݇Y~;K: v61qO(A酗Dѕjzñoe%xLZ)~W.9x ϙrMx'taBr`KNe0LXZP$8 (}ç l>u$ p~Baҩy 666Id먨ĉUkկ~{w{Md|䳟,uuuر{JWWDD"p*|Ӑd3!LSH4qbTFw2\AAR:Z L6gJׇ2Cnj*UPs I4y_CosTp1Hw3".V?/gϟ:sOP, ?@p/"UxWp+0%yί-q챮48+XOSsSrPx\w6mhsxKwjI?R}Q`_Mrquq} _KlYvH l;llllllp<eXJ(Fhn,3H$dYy9n(YN\Y.5uz̏ܔ6V&yHJm/n/Z ]kƷ(3/K7['JW 6ץ9E$d]܋>@э$i)Mn(7}W׬백Ia?Aޡx_9r**++STᥔ$ Øt8)a6ۊ>LCE\llllllpM'tЂ~&ȨDgKcHO f`2K` lK^)V]Ly)p@ `bŦшNBϊysk7O #_ vR+#0%Pz zw xhf㿺E4c+Y5,_ڵL%V^Ylllq;."֬Y\q|S^J znp6S15B tL~E-koDp.p2GՍ5HP9f1ϫI;L)UV0xk}Ov>C+> BUpՖSX?v÷YSKq/@ISPzU(5iJ~:t~$zpK5a>W’23u]yghJI޷xhkKL!vb1,X7MNč!P5 Cs2uy~;cw)糁4lcccccc3T-Zᙽ7i}o 口O?>!񿙦$<=x}3,:y0j|5% op0?y%T݈|oJS¾&+V۾шv=3v/`>Kd5 |,ϏYYv)M<ˁlll,^}rQ~!мhh%x)XHI| +p98xrp}4̫?@oʡ dێ:weԂ&#jA1 @7h=!"w\Gxȏ[p+“_ O^1_>gZdƓW'^V?<3vxQ<7fPUyZ ܿ>zYj[K~`HҤ88s/ c]41#R±6+pnX);CLA<˪YPpoa5ҏ\VGݧ~@Tj) [WNٹmlީG`ǎ !4GPpٟ3j YAb=m˯MR}g?sMnnjCQF8{ؼ18^OFh3GEH5Y,n ZQOLJ˗0Οg3E8ceK {NYeY~7]KNՊꏇpMVW&l&rW`Y?C1kXg U’ԬmZ&%]'ǣCO_]4zT}ݓ2ثh!#J>$V/߄a;-緱y'<}զ[PFŊ )[|E󭞰o[t80=ml_ u4qGsYl蛏&gӔlqGG*4;L#Ҝ3ymlllxq8R?cx(0qbA?_}v(+?4~sO0L\W( 9YF<;OX.]7 e K5 ޮC-VZiB_"qk9t=,C>ಥ<5ŰxPbx9o9zj?)9r&CciVשGf@AqS+Y3i|>_oCs߳]ͮD&=I[4{葉X,C (9,&.k{)^2r%/pr˃[&Ƿ<ÅϾ*[uߦ>F ynkWp9~l&G V[#Cs666g>F6?_zViÕԮ׈$ z)7|'<{i>f]7.Us_9|&Ů'~̶܂Wpa#`<+-|GR?b]^[4akMaqUvp<뼣QY`9 eFtqƿ9Wx\zy˒k?GZ[XA.8ɞh#jFEZ.pgP azl#P+q4kccc3YL=7O{u;6YwZa3sTu9)]R:]dp$ba{ǛH6JtI}넿VUNZ0-+k`l=<=zGY>Ew\vy^*ꖴ0G|dbcsK泟,vJ1Pp2쫸?C}_k_IW8y\/I4cz/^˶x8o‹n0l`{ϡԔn< 󳱱9S˓y}4Iջ& {ߜs Ͼ۾ +.,ʼWSR4 ڎlo~IZoK-tՖhd(ͅO_ >MHLgXQ8yV0L=Am3 YPg{BZ\ 'cA+eὟb?~87{"p-(fWdUR+䶗l)Iu]Us+`ŷPT+˯#o>±OF="nU(H)1MsY,Ȩ#M;'lNOJ0;Ql{2'8[_{`z ,n^V ",@ sߍ@ y9)!T_J%-1٠֌¡RtňiԪ |ɽx9M}[0"Cr︘^giWhE||5ii}Fgc3z{{RXnK.y:\\u=MGRҰ5v?S.?S\;"O{iVѸMKO_Q;l,^w;e R]}+GZXb^v̈́4%#LD49JOv>cѾ.b~Ġt:q:|>\.PN8RJTU%??N8i?G,lZ=-UvX<~Jwá26}Mnc6>]J% t1c [{k!GFw &8ie0|21+RD)J~h۝1.&32# # GI޳j(lr׭vRxۅhrkC=gl$ЄUÝ[ļ5W?gy׍Zg?g/W4#cc?wQ8_'~IhjX@(*9#D=i FذiuB)%.n(i[hH4nELIB70MI,@7 tD :x=.UUp854Uꮜ.ids)*)MfmgS?c󿢯!cpBRFR( BaJcc`{])%nEQYYIggw}]豈-zop?q|oVI).CV]vXgnĔ0L# hHQy0-܎V&>4ocab!iҤ~OF}Ϫ8+flFf ts߳_u@ƶ~QyQZZZNS!^wpD"Acc#̈́B辢(rJrrZ&x6H#۩4 ;_X7{} k'ѯX;~ iMW\JZݣ@]ûʿ߿N"Rג>#<(ηxSH@[ VNO&zӮB N. ~eQV@ιS@#[)[2K淚G7τ9YNNxZ(%~ yKɫ?!cal66D 7[񕃥4RsuiKW/pot\ohU&K߇6{CU+ /4L1oa}Ȕߓwat?Gx`wKڈ@II #//?*)%]]] !>ŋSVV6h$"ALg(mo4+0Cӷw!7ǯ'5YB& x <-GYr埾ŕ~n-%,r˿/bd؄VBM˱N$4 C[9OOjLSA9΁$/S+䜿-K3y>i:[;jFfc3X(+9_`6ЗneWޙv?/?F:"rϾjyWo>qjNIW0-0P w)iͦiMlZUuf):ܚDQUTUVTCU u (.@zQÁ48i(N'mMDbH]G:f4:ǭsd"4 X # RLJXc6j7`v i'h96)'H+m(x<JKKLD$رcttt+Iyy9 .Xmi Gxu[ֳ7@pVQx~r.XB?>DxI;喰^&VĆc4,)bB(75(fB7h[NO^ .kżBh _3*$u I qTQ񙛧chsgu1U)-V66s)w|Az . v?Ϣo͘hs ι&x JɯX8 ~GCUaXr$C1!" Ӊ4iܾC\])cׅu!.2@x,MÌF2~NL2SJ!%0#NHF8f4 " #t* .Pu:BQzMYЏiB{ 6666H]lԿWZ1ZUUɡr\یaiiiT@AAA/0%?ց=ig399?'@Y1"sȽp)j~r?k~컄+J-pЊǔp2 e G"#R ]a-[Tj ~4a*_0c-I[;!U 23%'+L`x0Aϩ }hn ŋ):1-%z$o썳D9o ͇S2NMwMll)L tÿ! Z Ƽ5WLyPZ}) ;_͘Y=eIxp+<$m*7Q`CՁQqMɭy `y<리 F Lv<=X.9{OJkkFnn. ,8c}htPᠺ &gBQ1˸D<:A,gh +(r} 5(19.e}1}'h6Nx9V=C"/C]Gҗ详u['SSc:<VTXʭ@"fh?W3h ꦬepw 0=j`74pJWȫjS4ޗwq_ó^vȿz ?>%;Hi>vLiq~_~l'^5hEkKW\9\q1ÉO'ގюs^xUEa;u)x(O$UJX0}F٢W85)))X?a477 4ƪτbb-zpjznK~*ag]ecU0їZzoZ5^' :C䜿?kr_28\)u-7nꇇw ,,"_@6<w}1mAJB-) N͇01LCH/W(%ҔuxX'h/B7%K)^+grZ=m8EK;)~ߥ>554hܽie >׬ŗA颵vS@q*F0dN`]ԿpXԿO&S𺡐^Gh0U6666߲߰G̖UU PTT4 #IoM(..fɒ%|uf2!M.88-axU臟?셬|+/~brZ> :wGq9(bj} c";Н_)D(] v==O|'/{=MGi?ؘwkJNqi8+ R˄Nw3CrFAۏM i[E8vgs),wfdޫ,?)OZL3HD8<˲rϱOw㑤~NJjjjՆOu9BKK ƈȼᠢSxAUU4M#HߒM {'}٣q象(N̈́ )r-JϞ'|3ij9(Ļ(”wZxjg rt#̢KnQn.bD+xK7=o|V@~c QpR24WN#Vfbm8H]S# {reN%gJi|`Xk]w g 0>[תV]NFR_mlll&i׼y߿T4"-ZD^W41M!RʌXՕTs( ,Zh~pZ: I+zӟ:Ph]&G5vRu:qQ)ye.wI)˄N[0c ){"|G6o~zEQ8va`R$^8󩮮FJɾ}L;Bt:?> ,Ⱥ [1ގ)=m`RMwy5ǿKw;|8[.m]O|3EG+LR9Ni7z|vd#$Mh>א z݆L ϊύV70iIs|GPj'Mݤeo79 eH}kXCzOGI^I ΔXO]f/YQca: k+$lWk3i,fA]ĶȪh4Jd`݄B!"}}}ƿ(xbTHi"i5h99فr.Zp~>ApZq.?<+|c(D(|Inh] S =r¹cIs _a9>sOPO{uΊ~CIc,Di]7Ԣ|}?ƶf$":-{)ez9g!2: 9/Cq;1B3rHpr+,)=͙4GfCSJQ/ U5Y_ R.8nGDzQRIu6666}ܛR  4iooGJw& VUUe1`uPO+zv{.#ޔ"̖M_U|f2 CxΪ"\ qG m2,q{kJ\#ʇtiĆF #c:SS/R{rcĹDfMfqF()RBUQ<r&wk&B`)K} ?)d%Akccc3AM;N$p4D"óS6Vi$"TH Uvav=OoV.6> ӐDqZul!v(um njId+q/)1Z4fdbprkM'%6<ΑO痖'-FܳY77de !Dr Wm9iuoll"BӨu;ä;?h)4t4 ՚A"t[p8]4{1f@,;4VĐaGPcJ°(7j! wGm h ѣn"M74pJWȫj+n'X֣m `JkM DE7*ojvX k!ғ@JS  5 mM(>kPfS0* R>H$9L5"]O>0{(J0ۜD;o`f*BY414颫O":~KB]Q:T-&EYQH/! wotK8T|&ڒVa4t[V\{7U'u Ar$F6'͙wC;:.SQ{*9$"'fDz )#0=3m P0x +Rilll9#2fϧ^ ~+6C*½ng@=IE΅K5̱ךh;3!8Ҕ#]HIk܋Sk-f<ɸN"\G/Aqx92L*,h_/ECEfh.Db0D"A,Sm4t:GuHi0%63$֣D' Ԋ,N9VOwh$M:9mBNyxU t=!InA]^N^}Sph(wQ+{$Fd0>觯ȕuGE\ ]ʔXq|gف]fk+;IGeaB&ii](GIL` `c%S0 OFj+j3d:C Du577%@aVEJ)D`x4)*/)f7˜9 J2\w=1Y9_r[oQH\!i?˩mYx]]ʊ KIhw=ǧd\ŕT{P\dlKm8;2:rKiE(ΡS0/e<_.Ԥ/Em|jllmBϲ*:e `FWR}nB䔟Ld<-4qRO%Q vBXީ(O /9tPst ?@;v> Z+s#JҪAcD}yWT($ EzbF?@3 r׭4ҍ`ߚq\$)iڷOdΗ SWr`oM`mbB^Ց,O6M)ʧ?wn)[j%ǝڢ4&cjH g lll@g^m| C[:o*5%g]'Q4y'x=@}lllˋHRMEp.hXwfc3iMIP5LH&ג>4)cS]nҲr)kjZI?5jܼm =ΎHˁSrlm:F&+Q6h^2'PyN\[)q{8eA>xij#:(! $5>j'I&л&t^PQ0lllt#yaK'Lزj1%if:it?8󷨹)J6SPHmccc3HI)ӡΎ3v#HnjLh\ԏphxvHބ,`>m,+ k.=/֌DDeO9%4wvuŕID]̘ ןCgc}v6?_M93 7_ "`'$GD?I^s{ vd).,ÑnݻdfëS@+E$D8\ OEuɟ\ 3 ;LC蛏OHcHF( +.eÓCӴoCZ#6ogt\$ә DUqmlll&JOO,XuEJ9+"` ' Jӛc$bC©ZP "HqB3u)9eG|ϔ3a`wBۅ 7jěqԟQ!ϖī9Ϝ㛻6cdȫNYYVC?L:&=*J[ lLh4 JeS&5gYrď*0?c{u?)9Xw!3IC!K)OgvNj;T9'ҐhtD62Ptj LA/CEu "0V`:˃ӓӛ+/w^1NO.NOZlcEG^L=VQ|V #v%:%e˩9pX}Fq9ȿf߁0wש21:3i&u,ɺ>=shŋ(0~j x'otml9 Sǔh0r߱-sCFfME98(zGT@xkA[%KWP{2TBɒ|-Yh*޵D6ecH=1%N":xS~^3q;L=g~Ά{ںCyQ\.uh*(]M 8ԕR^ )]hbȘv#qe)spi!G=@a58ֿKk; '?p4 LsZX1蔐 9<9#4XȏGE{zw@߁8N{$baiXƹ4dz)۹.ZEEQ5kpl/2eD0Fm78NEE0s4CJlJQ5i&;ɽtߝu~8Bp˂E*Lm Ȯ9XsA)8[ƃp^C&R;-iKvlV@"F*i?h~inSc0'P([^H_K8% jv{:MHܜ| _>yV&1m<B:H"8'//q:4>|6Ӷ wBiOYncc̸g#wELժuS2lPT|Rov}%$x!<7昄hQ,9oXXtke[Qp}w9d܎-CYI2urO-ޔֱdO_Dh)R4tb^"6o;Aw!=m[QXБO{iZR>`(w,^xJteNjz3f t6o OUEhqP#2a$Ͻx9ˡ mFQp╸F|/tiĆFYt#:H5G=dDt=ϙjo|f~Q½ӓ> .O>pC)a)8km)y<%h;ؓtˁNc#}S:t4*:wͻz J'I1VỾIGC Ps=L}amȸMPS +,Mzˆ {$̈́A$O،Ÿubhį`ג_^KWCj?CÃ/>A~ =8=@sj 1c"⌞b|ŕ p~['ٔԶQJR{D{oF΅K SBswv. . '%E[X`|Ļrf\)5S"_ém\|7)^:Eժu\>Ow㑬B2F#â+Jk[E;$ktT~vF©FuXq͟Q?\#k@M) IwQ(.uPi&(]MKԕRm8+flLg2XH.W UUSXCjٵ){8#lW vf?AAaa!n(Pcm?ꀣLc%"S\;RQPj8^ pZY괺hNÉ9UAuP*W^;uvq|ORSZf83]h?,XgTT^2ܑb뒶:8-h(m:$8 )xeBÄNϯ/ nO7roNl{D42H!p揹Y^WVq6CSuxT֖P9qb }'+m3dvYwb،F-bēӾg< iҝĶmp޲I4[TWEÎWҊFEҋ~/flLg*9ޫR$"//5HLf6h9=>Ѡ(PSS3xRZ@ii)r 4K(a `uWRjzV^{7j;9I4=CPq/gZbnowm|ə >~vp=@o,{ΤP^$5C#?!9wn!Ypu ʕsۿ<ȉ/?}N GyAV)jZ~xh⤊*ȭR}v վ =h36&هԍiq(F~"{p֍66g"Y9v"l^ {fD,Ϡ+I[% y|e{ 'H\ K@י}#imccN!Ny>ГD (֤Nol*A4Db (@~JГ"`d6x^)--8`, pe L2E" v6_0||;-,@?8~3fȪ܋+G(E\ =qS|}&|Fs9ԘЮ䜿$(]E$>0pO̚HpQ\Tk0`_Ԭ2p̿š\:$Ld]:rJ<.ͧ&gj#\ןCHtcLQg(!ȯX9WEnweַdBw5_~3O /Km:_y}jF|ŕ,l{SXoÛw"碋glLg &UPh@@&SuC޶RR ` lboêW_ t*e;ݖ2r8\zw NSsXT A* jiXcR5~v#_2Dxb|>.kTɐNp2Eb}06<>5#RFdlRs{Q\;}dP+ )_y]Tg \n;$]Sྷ,dr`3ݧ$-FנQi4@JvJ<܇ӛ">](}cH+D[oPؘ%nRMR$N 6&jizp(Pfj}l7}٥MA\~,=t&-#7??jII V1]׭I R zb[R"nYó;~1{PO97+!l'О9IݰRG^p]u [m$p{n塺Y:3jO >C Kpo)1 2us]=yg_6b&)tuj5gv8h1G6/M#ll&OcH9UsɿtȫPx{i{ih=^;CΞg_EQJ:HYgFt>~+bErjR𲡰dDՊS3$ İmlLCu+/2NwaxkeDAii)+WQV^UU<O \8JK81DSLĐiaCz pX 4!)AC<8f2011B1dEHϳh%K\y]O6 sr3pdtݕ1ܱxWqFHnQ%5āc ^0x.k)gf"N4=õ9m-'eow aNhmHDn~TAt3~cģ3*2ncs0,䎗 v6%-F#FL slOJcWe]q]lG{St?9L3E89\W+&+hV~STVTPUTXw:lcsƐ!2_+ +6$t"_mʸ /_>+?XQtPBdn8"jb(d(\ƫH7Ȅt<0a-9Y^9o~~f8J`!<+%-W e k dxTw.cO'ع7gA%rȯ5ǼPT\9V +[],E۟ $Z8Z&eq+ЄԼT/i)$lllJv'食ˁNc#}SiT-FuNLtm Rr_;^}C}0|IrE$::!DNI=,,/^i>Q4ml2ήi=5*,vp'X.w{h۵>c"roQx?}}$ۈ'g7cG>DZr!PNPUYU(..2%b[H܀gu4"c(-Cq:1FU66#`W3uњF4-n/,;qmP:oJiG>ƿi,XY50B-6䋿 } cF}]DWP;2VQ<rwQtI)B%{b M ?ٿ_Cr&ahFUE[?Ikozzcu+< bK5> @{Yq$YPQ1JEA(Jz]a9rd gh;fdao}PwK2{yFT+(!gEĚxLC9릏x/›eS֙(]=BM {Hn!c;];4cxF[3CC"Dp6}/3qi,Eդ~𖩰di!*Rva?7_vRT\h[JKt !4:p:,YW4N)嬔H2?gN7!_6G˳Z] Eq($O'"Δ~n7 YOaR_sR%Bq<'Tpl}nK!4 -wUP)ibĜPQ5D (3rݰ"cP]ʢo'H,7v|8C%!TF izigF"F1Gx"rϽ|毻WÌtG_ +MbɣlM4>#)*F\ j<9v 6Epv.`pjR1D9|Gy9f4"tO(7OXK$j^/F3y'9xt̀phh3o7j쏧jgLILv25p[kƻo8+5HYjg9='V^u'/>憜hk٧_ lHSOܾ豣0RO;Hà7wh%DUQQg2r.K.Ż,BYp*J1oo(ƃ՛ZؼsҤ6?_BE\}'T<-nEkn+WRRRrZ`mZF4pC;>ߔ "_05%ZZ Azv)s)eG(ٯc{ߤ#*},o29Gjm PTrqH_(`#Ղ1@U%-A zrdPs=hE#g* `d N7&ƽoxڅQp-czP՜|rϽXɴ㛟a9);^̦%gܻ%eL$z菔Q^0M6m'[:vD'o<,vතtAPSYQ,V~DX^4r>(hp2)f L#fד?a?"ݚ]Pq-p0W#ǑQ/_Nq驂%GgAYABbcBq䳿,k@pP_JP5dcMJr:1<&.yEp x| ?Qxj\))jZ~xh EVx>j^ZIhU3}[wk,αZi'iģ،3hVQ.6 q!@BoWec3IQH؆SzPȻ_~(m@t:Dْs'8䉑-pvd]; ՗C3ěO;D^\O7.pbr*`5;ek,QQZE؜IHԞ7xV̬jsZh\C]'R|rN߲tp8{' Fc$V:,A`i[tsL (#e@7n:Jg?:XZ?L7b?s0R kr*zO#[Ӽ: ^x-3C8 Ys [r/?ET{5'?`%~FƝŴshrnO~/VIq/>0W-Ņ?n 5'') Ҳx8`g؜јzOw_nwv"Bĥ-G\ 2`/^2Z DRZ@Ӊ(oG*l,|qJrYPqӟCJFTHV+@GS1"q/O >Ot?%`F(dD E)p)pQDXT}:#h*KQ5eړG<˪P 8i٘ e=a$4Ký' hΙsF9ֽBԼJm|/׍g(wzrP3fHqb]+(&?PȻ:z^}3KYo=Am,8qx2(Bk?B0cfM!UÕ[_gSBܹEI'ڏ`HI`6WG?ϗFC0S >C7D4L!?{9i^F=@ECȧD?UUeѢE֞vb4 UUI$J8fp=Kĭi!؋|~8 ׶+*ԮDze-C`(Bqsiq}V9d2%}oDe<)e4r9WRr32SCGsD=wNE|] f0(*64`}cd I*ֿLCs;$HD4ؔ,> Wqط JY8w,XӼ)9 O~)RʗKqjrwI[Gn^h9eʔLi#R~?I/jAAʲD4L<GH\ۼ_il]jV"T-⴪۞(zCp$jUUf.RJhlv6!<¯9KrxeCi95-F"M Y+0I9z'8hi_G.4 YND4D,ԋN%eٝ՟1REHDC8gX#d,&Rczz !䝞66sC{.B]iMu J=r'M?u½xgXܛ?Iہ-ٶt/bTu^IaRCv?½Y!qpΕsW$|OK )YhќH@U':|sֳt|hL~69p͈+=k=5"RLsn#:R&2ti##ԅk5wm8Fu"SXwN._~r1LL XMǞ cO̒KndyW5'e,^w;/[Xn!''o45F79g?&<5N4MZ鏡96tߓQ9a %?șБO nd4ɒ%s`Π-G "W4;>u͘?^SvӁx$1dʤ"I :dt77꠵|S5/6R X` Ȍ'23[08G1Fzc? BQq s66D`[I$j\yZlZ]h_CěA(^0@YQ/q{_:m,g,:dӤIi;l4p)}'Ҝx ڻlgD?X5Gv"_#t4dxd \cg `4ȑ#p2Xsٴi#o| Hð‰_I=BQ]`$NWfN~@J({v(Lw?YitttPWWG(\\]o̒D #(Bq]5->D#}]W s;7#jME͖jAD$[!dj,tx4V$s(fR[9c e[`c3a'w1,*-4WݎkbK&͔uHΈ$뿑n.ȯMZǣSzf|iE]P50%/47zw7-?K;M4/Ju؜:¯z6H PzV/c3ٸH$ikkCMeZmf^.ZP`0B"YmiKH9L\nGFh?P3"Pg8 ^)SEu3l;ؤtbۋIQq- &}&+ޘu؆ǹG(Yƿ9Xq>~Sh&ា넪QrYk9Cbu$ťDٳ,.Jg\)yadZeU/mcs`$b}Q6kt:]PV+{{NO/AþM=އ* .vNtZR"r_]]`pPv%▏CIՔcTZONInӧj<RwLHV=G;SSH2dEsĜE8hH3Mi:qacmjGQYVY:FθH IYRU@+}Dzh"m@v $N{ ǩBYr)9Ivm.*WNOy_q[Iƿ9qɇU79u gWU-%w||!mCLvpfAo=hɻ  6mSDllN34i= weJJᶦ3B[JJh"jjjRT:n{ R444pх2׬"Ti.䳿JUwWoj\<[8Ɇ{3:')4(iEq*K/\OCm­o~)BUaoJ+%|,|t#)FPSͦA8̥fY9&k4CZ'BuN=)K qĂ~mx|_=G|dHtO|׮_q崜w$hSGȄRxj'[QE=!oz!+_}[낔zȍ蕝66ZW>_se_rRgO/UU=#H)6Գ#G3 _7hģ O/pk\\s2׽ӕV$L"Ϙ Ɋso!s&5ǍV0z BNڀp~Mœzv7DE+%;y4pvX`0v@Hq4Гr MECs#iJw@@y#WKll& мͤNwESvi\q+[#JiR./OJkͿAyKwU\OkHb^-ӮS<^.&iYInQi&M̑ m9W_{0QZcGz66 .;v>#zS W"/i =h; wBP]]Mmmix<TU'IDDSNq)bRYdLr~$|-A#0oɴ 3X u qП.::RH5ߗuz*V$S)专?)7 ӊ˗"f)3I1ҮH'zgnP5Sj9$ҋ)u66g JWAI ŕO=Qv:ĩݯO[[OXAn|歽??3jDVJXqU&-Y.!{Š~@&dP>#ǣos`qoy'}ٗi:/KoE?yל?@{BPZZŋϨh$h&T ;wRWW7:,AɻhunQ#;/F|f/@2fϐ X'}9C{4'qB6)Hަc8<>4e1LUGQ5SO1RZ /%.d6N35cҒ=`P.dcc36/'#|G͙Cg<|+γGǣx]|+gő7r.\U֌vD輣 eăόFnRbdwpRrٌadF´K;=Sϗ枈&=Gx͑7%n' 0K3AxXb43 ˅ R HA4,J"..~L _tvs{WǪr[NztKgF;@gȖ uPs߽b:]( cn$btlɹ)t+?@SoFCQR@4KwH8K5&%zq1G;;,8t#buK akI/iմ,*R1;^VV_:H`? j-_q%W}۳ #܄UUvpPߘ)\F9bF-ڵK/K F8Sdp`T&a bד?|=ix *2p.66@n8d,jV7-'9{ZA ΖuP_-+/FLRTn7~nppyYs)ZbRǝ J(/F(>Hu9(vQ @ȹQҰ&AThxwnԟfLCĶoӼ6SK_] 䉆c~w sW wd+Ũ]k+]kiKdZ׊ÝBXZ|s7C}觎bf3x$xO&ل9@L0 #$*NMwQs^ eIO1x}dǘ=!##7tɮU((.0ky94 C Tb"OR5'mmcc36Xw ie($g%x¯49q&mxwDz ye Ͼo@Jz7Z&`(NgJ(VO\fڢEJ:Og#rxCCBoqMPR;ܔ%)31_?,gLx o*>Eg!nNa֗P~=Н] 8c&=i:)J9~єg5׃lF8}xW/ iXIJݭ#iMR }mrpgV< %;%4Y5yޤ ##ן3c šv6+I^dqfXLB3y\;BDߊsvuR9h9o~8鬂bl(id/Ps F=PTo}[0o:EQd5N;  Ί;Pw+{?v?Zs-[,3&Bx:yI0$fwhn°9P{sκ•iI+͖{v6PR{턏7U =j@MUY/u=3@&rϹ(]癧0#LIR) ܓ`q.6v6a YzC@Xe2R#q:1M<8񯨰`οgOĐ /uECSo:z±]#!r&cn%"A+\h,Rҟ8畠88b>MzF@F73v@k'6I`qbNý*~,%'1c=CdPIR?˄';VX{=a~B^dx Nl{}xBk=aHp姾5!O 9Q<}gTPkkwţ$p-C 7ھ;w1R"FKI^y Ǩ\9ml&Amlpjk$bcE_ښ oR3 =UglCPgVTz˗g9Ee wH)S2(G}N7{Н6V !aZ4獆o<;^4R<.kT-kH{#' p(x-j7钦U]Pͳo&4MEzƸG; Lv&A(8"Pi8tE-ג$:p- (e<vATO` LoV~񡂫5HYg$b},RZBwS)pJDJ3fY1H xˈAi>[&V5f0H/N@EOPÁ866SK˾~M1v=yKKa|K }]h)Gpֿ@/$b[ƾ4~CjV:R&]sZZ "=itvvRWWn*F_.8Lix!-IcpXz/NnMg?>ފۍK܉Q߁-l=c`zb@K՗\I3l!$e YӰ&i'eCcᰥ,Ģ5=ced oPhgih DEAJiV VaINEQPUuP4MbǏ5J-Qڕ̸dg3cú9G\v;\xl8|՜ܒy\t9릏F5ՙ)7'CݭnYB`#턢u#yqywm/8qرMn~7Nqc4;HݒԭVO|zJ:y}/MN gD* %]e18YQD{qׄtNto#ykt4-NK7ў>lӢqSDž] RN)*,@FFM/;m'n >}7k_2:G;@Ӫ=fTжL"F]eba9&ܽC7lDCAlےj>@ck9@RO ]3C!s gɑ'w6\ E6\SJ wr9|bA@m9ʹ+B~kf36.#}?o[b+)]<)F,Z 92Aux"!'<%ﺔ.gD ŋX@OQ(tܟwi Bhx%'/ LhFx޽SJ0v"MSx&Myku0.%qp? ,o۲nt=*!A%dakc4D2+ CJ{Nsx]JKjpro^̼i72  $f>WQxAܖ022X ˲FZ[ptbY%@h ΅7!z'̂9'ϋ竄LGdžO;A>ugU "B7 Ps Wࣅz =f6LyY`yCR(ff,.9_LДyO ]NAkޓ9n9;s/wvH>&d@K{.C:>hTJ#>·͞@}=G:gjKW@aU;2_As5bF72%ntf,H?Kh ț?XwND`+sF\6֙9JxkrC>sDѤ+H5kAjڌ5dn,/*Dbv2M*>IݙdF6CXR+}bum8Nz͜I16K\w]J6XH(Ht񷎓{v8؁=UyHL3PܨGYO FkcyGl#E'Pm3Bhnt$VLDBGj=~I~8i3oyժ 쪿DIsٿ%0d)eO]abt"=Gv>aĥoWNTpl8Cp0$L&Bֵ{'waA f|Faݹ=oԄ]f~F`?3+쥰5QH4!n?f~Pz,Bӱ|e k<sCʼnw 'c@s͂W!>dgWbBUNp_~ ˑ׆w1})iN;%0-˩p-לEhR|uG]dDZät8pľuIpJL6+*TP @i nGjmꛞ:KϾDe&4ۥma}e 뮺w&@hh0Fcg`o?4-f2g\:}MJFOT&6^p|㥵/Y6Xs9uI8&Tm$$P(4Zu}@uKd1Mo2PNy)˘ާ( wH>& 2[ ALIػU%{ 4{eԶ/}aR^p!s*l}'F}d$˛5Ր:ޓ]z{ݫ¹ ƋB5Z3) G=FYۊOx f0Cbt~p&Z\E-ƿ-G*mL[# Xt{S}H'u{(;L$9DŽqJvz8 stzj.[?JxݹcR&$e1477ϻ!1܇c[!8p%jݬsDoCn{ :}% PSSC[[tڲ,'No[y |~h[ L'&zls$ s׿[S1#߇]/g5U7*l86ld: th1'b)R{n4B ZJx^ }6=Ѣq:Jf)%NIXQ;CGaH_K-z]_s-Z$^[HMP {8NT?@{'Fƒ`gJ2$eIȯ tVVB)a rOg^W;1}ڶUpem`+k)CQTmR~C멻!W_x-O߃QKK/bt_x ̍Q_9yKXf%P!3'~k?W:x8dU׽VɼH]/#zzj!LCC`l48pJ:q;K֪G(~H%2] ds cv욦V C$/p a0|?VOtTb2U%3ƑN)ut ۩ tee䅐y\Y6y<^!6\=Ć~[6ږzL5> [.ɿϑqw͢Wĉ޿Bh<+ JE Z"TDՖ >sk*O^\WPlz/fR1@#.Q%vŽ$q7*WY!LeJb ϝ[ )eXB)cUT_0{{-沛n^ Y]5w_$ytұ]*_">ǜ5V/_ERnDj' |G`=$]@LHEg-Otl:K[Nx+U3AC+KfyplՆg*X.TWWh"jw!IU@UJTtU~v+o۶2 ZMSuCc&? `=TK'8cԱ@3@}>RǐN :Z6Sň͗ gD4'3-ǖ"nMXqλE?U àav_$gY m>za&+r\M1̋Xq3I_w2GI~iJA6Ndt0?mvӢ)h7%d _8Hdq3e1pCZx x<*T(׼$@e7tsloy8_S\|Mm}u׽L)C7^VFpz;^$D_o.C` a V~l3]1nl]1TνJ͖Z)86:1kŋ/XSNI2V4MkגL&sO:UWP+ivPr2 P~n&;_P?]/)?X|~+ҙ!#='#Дc3 ~9|iBt囦9ɓ%61A`uH*(@hۀ/`)}XI9GhVTDfBMu]| ?)uWPd -*?]xe_p,v>|[ ,Q/  .YաUO˄ۑ>G!`!>V,YB$qOkHE__파`&:H˗ڊi ~gQ{ t2Sxok*4XOÌ>xGc rՍxVJQ7aݘ !`eAxi' zEjI@»$Dgt46E":-6.ݠikS+$;H{7^$2m"9B&t}t j#X!X_C Q&tUYL *Q}U=nP|aO3@3ccgyM~i?9{ޯ,!u0N"3ۗ( :z6Nʻ^.}{hvUUUX/fDZKwup,?K?;:x}x!x!U?W忩8rÏOѢE,^رcQ[[ҥKimmͫ|>wv:e/Z~E+h:>OB ݊؏=ZT+ š{B \RJx+s`i+8IB[k^Xɷ@sАY:+'ꖌgnZB'Mo{yP>N:਱P(Dkk+K.-霑H )#gR=wyi.@IEa&v؏1 LlﯚS`8 zBC}sɝOϿ Ap"]/f i;wcp!ԍBh,=g;vpL.P_1Q$X6f**DR$Ha%8%gWB _(}聙O6٦g[wڐR$RA}[gp*,\攞D|v>)>SRd\Dh^{^sg3xyڳ=kT!ikn/cp&F?^) uK.+@ -µ+e%c{0q_s)D.S̙]R۞adP%&@4Xx1mmmK=22Bww7===b1%rѢEL꜑Hij;1w #DZ߱a݃9 !ڳtY3PuSB̹~wB^9aRǺs<.#,"9,4dď@tģl}e_3=k |UA|nMYc'"Mժcת f9Ы먿$l b#\J҉(R:h+WqlӒ-^}ɭyZxi[ (u׿@o ]("yt5[J:wx9M|nطwjʔ*G 'SI,pW&o߉W`*Uk*g2ZrRfz{ pUMVK KujjjXx1---|1[MRtuuI,ömA4,ZhR\|>G@oiÇUG72Q@8cNYZ_ZfSkZAێ|OaŦWE{^̂䏦iTWWVdQZ$=<r Ft@Y#4mzX[Ѡ \ ͕(H+=_"u Yf߅ֶ%y'ެc};gh)o{0LXFv>s8-5 !(0{4fp*,lT[}ڏI͇ Ug{_:6'}p;'2sXV* m[itCɜ ?Z@#& 5%\B@_jV2f3B,4A9sv*z.$Z{c{e$=2 -CȄGqH9\qJAT{~UJ.mW_-F>3n[TO:j52D#?eiQD%7:yX/>D?^Bm_}3Ϗ6bK>T33!"pH.J'yoeI=~IS ȷ^%cs< jRX&EŎ F[?Mww7X qR455Lmmm:1αdo@fn+s2shʯUM#S:dtu+'IlBU TDu;T347v>QSDFgcc&>tC^U2)[ޒMJedg*ѡ{]VV S}BDZi2#A]]~Ahqe?6cB.Ř&!ؐ]piMTg?Fߟ_8Wj6ivp?cXѩB~wBַsFRұ%{f_{ GED:38s\)QXp@?ny(~ ǫ]?~VƑ;yש b6`7b {0Y##ӯE8u\?V*ß<qsT. /kWV~TF9*Y_h y-ʅiޏAhJ10j b#WRn T2(wB͵KܟY̬f`cy(0qK&,shJ(d!WIou-*/ˤM< |MS Yq|G)NMBpq6B=h~V.YR&Kw_Q}9,?wR{4اlGz~4ر㱴~ĶD2QKl sϷXy"z3g1_OO\P=R.O [GM2}j+*^Ǐrtcg]CcrDfW4M6:+vv4fTR Ny ؖ:mNB5Xr%---imGww7E%e0 L 9"?Y!'ωҳc2.126aHDk}dF5 pl=XH%O:9V&"O^ҠXFȀzC[> Kg\V/1_;?Opb/X=b޶M RBچB&k(_x2yho=k|#-3oflj9AP7}DZG^uSA+!x,U"+}⬷}<*BװF+ 4?@t+8HIl׫N&|݄5.3q,'QJ-kFy*2Rҹ+Oӱ畉oF\Fu@umJ|pl5 eA*Ć='᥇\ùhFss3[lr}8$Icppd2 5M#HkkkY%,MW’+G1k`rz5&;{7X'>~ EFUTıǒ '[¶lKXI$9\$&Ijp D>3Ķeݽ${MLhVzs3wUg/;/FVAD&D{ {B~m5޲І6,% _sV퇉~{utN24mϹDQPzgMPJ-q: +d?dY1o{̜l^ % |F-kҷ>;m2xcj_Ȓf5>;6,yhQuKlS,/qfX 9L-w/#y?|iZt/he>*mHۯn?kukd25]0Y|V(?ұwxPƑB@r;~Vl޸hf9ZFyP,@~ʏ àP(Duu5~GWWTjTu=wgE?b1jmۤR)RVږ]BBcc\a5ގhmct\5@PH*2;cʐ؈JpS# fz̄rԌSXTDBNCVcP̎1J, bũ#!\.kQ__?R਑k(7َĉH$y!>DQF 0ѫ55aZڰ&piX'a 1XQiO}o@s5nVw*D) Q_ݹueSĘ(^0`sF4, \b&ƪ.a߯Œ%c}#a"0EP+~Ѡ\]:p[k1Pg~xz%-(fiTvԟF_LA$ L"JQdlXSnBx":WBۢnZ>XsB/gv<뚷=e^}Px$4$CɖQ)()G*nVrڰ:GuPg)]ڿBMyJxpNxnѾS u BkE4Y375Bz%zB((B˼ z}l*sMҴnX*TPeo{b;_Ai~`Fh߳oQo|/Ot24{NhZ0xrr-4֬i:-k++fضyJazĵQ'"~>ĉB!/_ih6, ۶G+1 ]|Ajjj#z_H(U1"Y1?Ȫ4WD"|Ga C}e2:0Э ߗ2P<`85J׋`uTC,^~tM.\$0P_ԨZwM&kXnW*׬G{N̝(NK"ׁTQՇe7Uk9kĺ{xK4SNާɑ>Ϳ+T8 sXBOЋc ?״NatcǢa(7b[I5e:Z.YZQ!=&eϚSeʹyb:/,ߢLKVQ{7UK@ˢP-/zLmɩm#2)"W XHe9~Ӄc[H ;މTӀpBM .Jvi?sֲqF|̹@B[f[LtC>eY&+w`߇|q8{Le k~=ZJ鐚Pm{ސ2!a*ys.7ӄ) ŵJJ=g f ӕ{{C׮ x#EVe1l۲U2>AMzVF,+{ϱaf@:8V2c=%#P&T[]3$ۮgaN8QnR:r˯Sdb *(Eo i*{k8$L$ر2ImJĎŰQ~T kp@#BJ Lf'@Z؄!|-ډʗMIf0ji?D51t3;,_한 {ν4mm{UU*qnjN R[/X QN֟q"Rɖ q Ø?0W%SP~}[zAefۙp{^U  aK3DhOñ>h)&@JgЧVͳAX GDa$k;Kd8L€d5! –{o&@ݳ|lS_4M#*[ 9Bj8c|okJjZ.u2!FkiX8p+Nb|V>vQb^$@Wu ģ %xWtKXʒLk΢,FS&3 m'@QTe'@U%uVu멾r}Sscp)z~u-3d o ]?e"g; *.e^Ҷ'\*Z(J&hQ41Qa C/SR]/g]NԝqP&P2:g4i:OP}5?sdž7F>uWFa!UpplsDp*H _F>]1P@(^ ǶƝjW`z4>]avĮv9`BRs/DjUԃ@2VهO)%jFV5V#%kUBb2BEu= -ոc;űm `HA"N!E:]C/f7D#OJgp^7S9D``UuXrY] 8Nb`;nק-o印ݵKJC/ǁ>XWw8W`{;sK%st燨zK"8Q.#=ۻыWR褒-̾N_a7k|^3}, BhHsL1>2kkvUo_)j3:GU@bcfP&xa4 eWh)Nԏ!>\in\f%ZZê/aMҴq%irpd̚lv3xaH$nST[&B>;PU(%=%\su?nӆGwI[]B`\) 8ET=`Xf5=`@h׫@ʺ ^+eװ򆋩]׀6:Y1!z5 _0H}j)tlv?]:RWsQtls[?_Dw5T+XWQhU|͗U[.XC}můfwZ@m/H:꺯'yRmR$NNSX&'| V % ~W"T`e@G>9!X?Ğ 7Aw}g&x ׷wv ɣi{)3)u)$15 "Ox`ΑC*:e' Mg fJuA?5Xu%~]J쉺aZ_Ț+މ(|쀧]3'ǟ b+TLcd\@{^9rRqwBo2b߿@ޭ#<'zB7 TG/prso 9a8_~7MC mDo]!|ιs-!.?"]}Sib^!;Fc+Z ?Dh947F~wx!:\4ض ty+\(8E7/#? |0^%č !SX}tgZg 3]zZalC}F@οqT" @A2qbcG+<M=8SԿgɐNưR |o@3|عk8 ?~еul9殏^Ѝ$'T nϷNrrdz#T|נ ,he/-8ZwLXg/K]oNx,5Tu&w 㞆D7ι:ZB`N"Jlv1#o5W\'Z q ~/sŨ;c>+ Fp~%z_9r)'Nb "4/(_>!\7ebNBYҡkVذ/:8]#n;1LN">ڎq Wʅ  R[[[TJ|t}_Iڶ\;]; pvAM5-*kPSt xrg`܏tl c 8~m xX}zǣ$Lr0?+4m.H{7ю^wRFx%,mAY -W+%'wm!^z0߁P><~Ltr˦T '#zgMK`'P3[ŀXbe*W%BƟ2U\7o!`&}B$@4I""u'v6V\`; (k R_C']eV2E5K}C'Iw\M#ٳYp/~I?BFLQ/V0 f$` 2C/=Bl׫XC}8fxmh +՗\V6C$Դ+w#/>:%O|5*iSz>Ѥ4'??:R_hhS}ϺBL!=ar5Ln8x 9D(.C@ JԚXi?+G=u}\ TM)c?D~058N|*5LʼnwҸxYJ} }4>H㲍ρEr2Z=pĆvڊNS]]CAtbmTT A،#|r:qp%O|~wcw'~^>T?ƛm3Tb+ifJ )k6n Mp(9=pBӨYFr(?ƻ)|)HIϮ<}B~>fiKV#]L'8ʃ@ L+ ġ݌$#oȸAQLWm$| M^BxO1{7#/=>-B /$G7y1tprA23`y7| H5kLn:7 Z B!t]w+1ԓ" DwWI0;ne ']~?IAJ9aRplK x*4o!HW_} @wx)j*h+T6l;:a"x9er=pGIM 6\4ŁB'M4U+i\nʫXm6H$ʉ^W9wmjV'Tw5e0DwD7ڙo͛7L?K|QA p',zaq\a߄}I_x=Zլp|6)//>Z3PݼYy_@: (5/U*!j0ͫ"s_ǶXtߐ8>r]$jGag;,o)g*jв|eiYN TK<3Izn;1!f XKDѱbT/*WJzvj\ /՘LBq`W) @f(t6ɑo f8_y`5-+6 ~7,pC& rg*/|-B!dF\sCn%IN;J&i|c~6a>x!iY7]FzN"sT&?]t `7PtpAxx@JtJe jWr!HC%r-,sb)֩p05 rJAY BMuRU^{vwteG.W0r+  0N~@J 4Mo3Φ[ٟ\T-Z̹_.κ R-m< u;)iC[#OR&Z0&!Pۄp޵d%B 89wO !HRB E{| ?4 1t/H%?WO4Am*nï›G7&N&/v^IM7z0-iB[4W]0/>Ǵ pߛ~%nj7׎?D/H=(e]Wևi$Ҵ{6-T+҅+z9W'IdQ3O\9G☱$ JZ T~æY")$)sN J nCͶխgCP, xUQ#$v+t 2|Z E+JɁ&y| ᙽ!Ԋz4=ARp`uWiY㉱-p/\Q"ei*-BhdHlR Dzugmw;Mt.7Bcnco1~N*,0y]Dm%nR'pId:5 Sok#a#ϡ]˚FX*$-![c# Q+!hw* I{;>h:P&.83Y|h شiSq)RO * @ _Σ9GuMw~ Vm9#$BHV@k~_iqj4(&[ XBt_k w#UATLP5!%/\-$[?Eh:՗>zдb3f(Pׂ#=ޥEw^gu_U;J!90LdQS2c #֪l=Vc)b {t08N5qNt%PBFpjkWS;=8LD'Bhq0@55^UZ͡JHl Gp18f-v5Q:h'ұ9Cѱ Wߔq?P5z&O~?7n÷W@0.[RtSc"ퟀ̱ۗ'!qBm}8O5ij { Ki& eϏJ/6 MF N'7_gkI1ǝC0t8qY-k}*>ґ{'u,+.4 cQ?ye7 lZb5:\?DڅBK[&t;7 ]w8K`Hck`~4055Ho;e* E>k?e7A3uԭӓE7jH/"4`7p}iв*| ՞t461BmCP,&Uxf;#QxS|Qe `^$*T0@xp. u4v pf\ JIUY ҡK 5n p98y@+9hʕ+YrZ|jW{*ۂ?^_^Ƃ E30}ȇCFBɱ PUYRNhbr'3J,8@=Hxa=IQ W+a`b[n`esέ͗͢3,r_yps$y{a&<s3TDLI[Xt H\*#I+!eHR)58w82t۟b-^)PI&V dh)w_-)X=T*E"$~ϗ3{t@\3ݿ#U?Ѝ׌Ku-[ƪUN | <@bB C}+6"i-$˓c{:)uQ|-Ks_̱LRʁbC0 $1õJ+a erKꊷ pC -cݕf7Px 4ݮFsvt eL&(4mKB.n۴H֕`*^{0/>vC4ZT%F /RұURwPaRR\K˶1[#1ѝ+F>۬Ex̩^*J7`z%_sO!. x4e˖fL 3O @cGLre#%2pN{)!T@Mi9X&l{}Ptڶ\;<{!̉gJcx=I'R@:?%;S!b}P&g:Uv'}qs, l5Ѳ|{5ecoE*X}7nXG˜Y$5\z@mcg$D!Tr jaQtv;GJm8ʕ+Yn 1P{7:8ʳP"ﻃT|06׿v|c1SbTz$fCPt":K`)ց"v|4ex Kۦsky@n4yw|(vmƶ i(41^1 KG,lGZ_8Hs+ M&w?ˁғ E9{l&9W(9hٚӆٚB.EJDch34 Ǩwo36i9S{ ?xFrd;"p omLns{:˗/gէ}{|bC(dm+&?:8MXL]/48y/›ϩ Hgõ?.f _1!RD(Z/HņH>ՈBǶ\ ;ѾSXɂY!x9'.y;./O˭Г 5pL4#HJNb~MWi_:ut9=Wa"c;MW 0pp. 59%R"R~ȣאm²8p:Zٶ:g2BٯdH/r^펽$%!%݇L|x;a~T?)Lx75@0Tt J,0LzGXh[xNcO,LP8Oq'a^"]ml4JVfRP~ŒmV*1a'! fe/ńPۋPI aMeTThмqR{dk1ĽWt]gժUo"Do2|>t],ldTṈcO ;_J7L߱TxP @u~O}7)b]yVLDK6;]+ {n$tlWi|'1kEW80vdCg=Xz5~x)pewt$Қr@mб ;mƢ6!70jP]&w䵨h%]MK}|$x?{!{EuWM/ RJ9=a,>)=XJ0_,蟪6S% ǶJ0_H- X1ŧCMM} lC414_:r=jk`RΉ0_Ug` ;Ez$C#5E M{&!RAtAyʪB3CĢ5{~5|:$c  #R)셩ʕjR<2w9GW:hC &3ǐaY@@@z,$ WjKa&MH^qk7o(%!€tl:o}ï>Tz?Wm+gt)፧z͚5,[lV0 #ql(e#:/35Y@Sвljή?w豅쫸wH(P%f* & EKnۚ{@3|!X$%'A 蠻 *Av)$׵QZ:6_ƹw|W:4<[ Zaet$+hHҮChqmH`OS%4=K 5V}+TOa#y-aPqӜE@#T nD3 Rm#r n,@2 df:D<IJt5BrJ 5K]V,jekfdcSR$ߺUruUCJrO/ Ydɬ܅lg*xL䳿.4кL<2@xݝ\;:@$Ĥ-WPmIYH)t^89a@7|81R! Pȣ&V=CG tR|ꮢc͚5s"=j?T}3J$m{ rW넀EU)mC s/&ViZ~@ HJl<]tMBӰKl8_H zV#HbߜI_'Zr,o 5q&Ο@* OEEq1+L*, C]c!,i[Q҂ #۠Y?󷮁.7i,!- kwP"oP& OP!]&R8a#GfgdNi6m!m)%=A =@C`ca6߯.rTأy~Mo䙠dm{xcφ;Wrv>$ (valo~|=g̶Tk~K>T@dWRDz&q%XiV38őWb]NKqFB?jE7UK!W=\2L=XX=|$TmvGIh|P {r0BU\?ITa~< %fRPlc>?ҞR9Ixh|@~];Y7-kO~Gwy`Fk@M|vDgqK 4{,]7w+TX@#H"%<ޡ2e~$ps{Kii[z92KPێǓI\ ` CqrlBHu$CTS(CHcI}yX 9~hne FxNf rj;3_vmB:&2 رRq!&?dV2MXv)d?@PB03>M WQ`ؤb IJU׿qZPlHTJ!k]Eean:.]:g+rcGL%Qy"|*-Gب&_«V/᲏\?Tr1@ J'BYQd~ i:vJhZi'qBt#t8Ɠ\t#y\qDx+DrxKfrnTWW! =F{ +ımtʧn^RO}ە@6\B~"FRQ$Vsl-Z,6+g&FO昺*M??pXܬV%tT#1đ`#$U[JK1 )_m[)REߖ̈~d(&Rt"e+2-gYU@6ldVSnTVvKBq_\6j[uI5'E8gdtcG%1N! Hv:*0Iw?}:_VmF\~,P/V'~R4ZjoĆ~}r2iڱ/GF`>\?| ,Y=X&NA\7 /4!t8WM̞)HZ*؅S?y\q JCm.t&{S_SvǴbI|2vR8RS(p$<ti5w;iהX)$[ 5-bs~&C6bMIux C>B@*JVV?zD=^d킲"MP Hș #}%TZ ҂)f(h=;ߤ+_8UU7TK.TNJg˪.a 4,|73>߀# ~"uS;c*3qK>SZ,LLU𝳭#Tt(蚯~4pyHs{O M'V+ _|JH$9S!z m%Ӟ-:O7Y#B?ǶIG#L8|6]ZxoiEP&]aT{oEKl/L bL o/7)4ўcD$@ni3/def& @u[PWtE*4|* HMPj ,4d1p2+,9e1s\In4`#xXX Jg??䡃HτYBą7y@f8Xnݜ1b!|>|rcF8q _]ܫ|J02O^}t4}ι\,(9`id'g΄M7\*8 Ǝ$7>OP>)N}ejq6>۩v~SF^xYL$L#IʧRS&f£+(UvO-TsGZY@WVF?gs {_}`]_%/'w閟:|1nԖ$4U=]豜s,xB , t#,Yc* !5MٲL@/F@+B´t%[ J1#?s;N'Z|)ⲷ*[ Qoڵkt `05_Z߂S \|3Te%cU'ן 5?՟GtW1 x;4iEQ0i{d'ǤQLғ"N<L!&kP8 >K累N`J`@6ḿ@R*c'1?M@ph <ڸEs=1׹Xs8%WLɑg?3J=U $a*ϛ=to4] r%ڮVK49dH9HMk"(P I1$p ̘pLsB-4iYD_{;Zb@Vж3UNT`e!x躮JY '3م|{pq;[ `*X*OdNc|bVA+%FBTZDV pO[J$4&i4EH;y',[> + _K ZUĕ&vknG #"} W ,+ 4%n[`45_k{STA~G)J9vVUˢ#kӟa[;lnPG{^Q@z!8!1W YYin9'έ鼣*@&8f<30طS_ލWMk ϮMS|5ɺχߋv^@pŁ7 bn@!8V|xQ?wqgLa/ ̔sC ̫ _~kU!pP sG5A9/8ªEWthj&lfw~k@iۘ% ˁ?] pvRH޹O|h x3~SԿiL,M2 1wc;rzAxdu\otҽ?6loz)5pN&w3fBܦ gsSKWQ <8',4-U6 X7S&fMI׷~䱣n^/+nsMo"^z^Y8ǎѣUW!K ?1]iʗ߆U[w7jn?ZYp+$6g,lk@^OT

>8?~ aᏲLgljWa23uT,)3fT7z`zz ? i6RS+N`z Ӹw2O9}Z[i\qC؏vM5 <\Sh_7fP}%۠iǹ|0yMXl˗/WAtX Ns:;;]kZM? RqՊoS9oF U3|ǐRSBY~_-[GQrمn] r~nJ !-e QXz"D蹏Lb9zE0r_ĉЪf%u7Lݿt%UP,IU,kE/6G"v0 }C$$8DviiV@JȩWq>ǸJHnӤk[61L#e1Keq%:~XE+6Q*A:%#?៦i,Y5k֌kd6)l5ikqK__;a!4hYH? 4]ys[PK RIL*t||Wq#*`~h&B&暳I xԇ}N'+WQmt;vH Eҷ(Fȏ/&T_C6 #GCW2JcLNT0p2.G&ݏtޣґDGF!v;F}I8 "eUiUU},˿BB]-T3d0!%e$'r;ݫIRO?i'Ut;@ 29w^9JUa D'&}E,D;8}?)GOZ@M=s5[^3_qlsKKs4KvyJ䮀eY;v'NZa W`nG># ݈=H%N#\V5c)ueI(F:1~@:X8g8xSBנ>Ҳ~i>Yà'7Ƹs_ǶIG b}$BSiJi;JDwI dR1_L#"F.54}H<9PV2JMG.h5W^I0u!ZOBql ^|@?HJ9RJ9tPF7|ξrn}>|W"oXUr\p|旰Qu/Xe,蠫 ~௪EӍ<L{x%E^ Zvp --5 !%];9]^uιsGl%.FdTAR<ˍ@AX^L?΃hNrp`]5 !+L$SiX+Jp,zBs96mf? 7ތs.k}W(;ſiʮ(E_ar< F|<7MIh ?cPk輽"!bã#Ov{ CB =-ڿ/ w޲Q곕ByM?No+V`ժU:|bN%Lѣ{ m+|VnbN-M)wë(Hr7a99כ*SL0>6a}s|l+8g 6s4.ň# )K6?Oz{p>wR~V kײdɒyC~@J9'LfhhSfΆ7}xyf_xc4(wZeZ#*#ś.OC-t<*R.SH0RQkTx6QO~:B VOJ0>~pj;%y fip\u>kt >PɊkiˈ\v9/1F}޽ #ђˌw-B"|ιU2%/ەcP, LzgqbEдL&ݫe4a^ϴ^79tA G3rJ06&8iMq0ma>d@[_w/߽~Z8*WdžBp_њ@ hkk;̓9 HӣJ;^=/퇐l񶏕ϧKuPϘ/Ƕp @Jk1!aU3cU@NbAY6XEv'ѓа** b価Œ2tBa%_Hd䕗91Snsb°B%oz{ `p 6fa `/f!feWah>1}mV]sy{FPʲMF_S" tt_0%$J1B$cxx8v" ΧYN|Ǜ XbOpU 2^JY<0J Bau@ n<|w~3Ҿ ?بWnbN-$2͛7p7Vf!`YGĉEWUDU[.H=|^NT+)߸-O֠a.|;s ^DEF_ 3 @ @2LBh򫘇X==.;5!<v$hmh/!r%$YwdVf>CMjB6%tQèw>Cdx~Z( \:o,]:~hFSE}9[4 hp_EF`@]~!ez&((ud 032[B(n)@N,G#K K%$M'KFnoX-|F0gcV?Q0:z]~6mIt 8=6]uthY6xQV + eUUUlٲÅDimVh{288|0 Ř7}e2+'f ]в\%YCҨfpݝ\ϖ?]t0@hZIM72&pT*i*nG£..s/`Kp?O55R Y_AKH^%o?{벮5X~"1_41,_Qc0#\9_iwF`8 h KUU#r6< 29Ud( \g ] pa۪q Z9frM-+^?-%0q!pu(At;{gN R >0_wF^~!vf\ Ra:HZ-G"6o޼`/f,)<8pG9*ZιSWTpJ,c ;_T*,+7#n84/g_y+cR)ƲsO~lE4 %RO"aixA_J0I!wҶ4ó L禵V_ZMRI<YXBcӆ7O2y秐8Aժ4Xv E5T8MK&= N * 3ih@DDl[e+13ZuU 84dU]j}>:<0cu1˒r_u`_LCNY .k\k@K` C7JR.$Q *F2AF"n4dPWߟ0f~TJ*f'IX0<~,Mr.ia :/83L:qfOwiu9qt݂Ak͘#M6QS(m\nh4ʁIo|$zF7U7/?m..J PU~=yNضА/x5\?ҏ ?\$o6ˤOD 5QQLP:.%=o=@ec CC,OOq M{*(o|FBbǤ!!-?-f$4hZz8K+F!On455yfL7|9Iՙp'Or!Oɿa,Z bߦI=cg_tɪԷG=#='G}\"y7ν+!ЌU4)K4= *qR5[9=Լvx0;;qϓW%`(y0Vw7q-[6+KT'S!j /_GJ>5ٴX?\}e *c'R ?p&VUy6'J+V"ـM`cl&c9Z !! j6ysU[չgzn;]ouWWDzHR9LH$طoE%`u#\̎S.u)xNW(ٿn9UE֜{Q2.l3.kmFFF !m[.yIP>UD;N.NcG ԣ!|0Rht%~0UK4 u;rO".=~| Jb 6ya_9zMR#๊CX``\KN!_ ~o v'W q|doOy l8 quU"*;؎!---'e*w[Uٶ]4K?gBlb3 6+9H%Rn@$ XpAYp//9C\Oqů"KS)m+]0( Ѵ ۯ@McARR3./,,cz+ڏXyv4J:gaxf F.9UoO:DWzvx=g%7Vz#{Tc)b&骴;)Q!m G@/o-_@ G\x#,y *4Nf إ$QdAJIoo/,OuYy+G6^Lo^{|pƅ4E2燰\Ag^4QBID&'f({!|_r;?>%‰௪G=fnp'ZL0G IGe+:X\xS{5 3Y a,Ob.w "++4/w\%"$ea [fFc|lEn3s۝TNIiaoo8t@\xDyv,8>?VBB xB"tuuZٗ 10oV aS*"]Ecn&GZA3u՛fSD~.Xf@M#n`VZ0S57X-Z૪+ߖ]s#  ~oL9VmF?+_T! O񖗶TrRXoYޗzrFaK(B@J9<4qTP>䅓o NAYN@D#N?xv4Яo_`g8놪&ش}n\+;CK'@~ D9ms!Nj԰jϼmg >|6OU θhN[>|;ѠK" Ib܍e"8njӞRJ,B׶mFGG ,@Üͺ'~34\Hs p! 8|',jĵ⿍ѣ$:._fhh(N$$u&3W BhyFeF돔V͚$]@JI8&˭Cq?ڜH=`ђ+tzzr_6mLhF/0HI稿ƅ,@#aQ)u*kk Wy_5Qɻى |`&iߘr; bƿJX%'GwM-_%QFY^ qэоV*Xh[ %DS!LbYmc3Mdz\Je^0jMҪ@.;@uM|x<~?^ǃ;leYZ8%^/+V{57\b"c{~T%J{NنmP= \|>jjj&TD{R 'p^xdҶ0׏*%S~)'_'TEH)sT k '˽7  OD"}eyRAqK t{n۳7 oQXKR9_ :+Nj*gjZ'%x$dI?FtWl@I f -PU Cq$p#G ,'B^V>SӲ}r4 0u=M x<` % ܠQut]x<|>^7, cNM,خ9WsUN>߄#{2lqowGY~zK]*vlSf*cKe*,"#X*H8?9'J5 EΗ\`i<،P@$;#m{m L2=zF-fbIHwK[ X*hZH~iUl';ZDj'im~I:=PuMg_ [/i0ׅU(DLt/7O9eWaP]]MMM 555BU=6(Z mrJb_7l}{UR^I { $5 L*?~`c i^E_NP*YPhCTf!e)` zKk6Q*'=6jB:W8~>=O3[ 3E!θq޵P4&,iW";C$LĀ^ \radd$]  T ccctvv2::` !sb* DGîOv4 8ڄR]rPRd5q>i;_**^OSuT[.B}9@fBL"Cd(im\y[-K Pc T!O=6/VUV jf΅!nw;' J%h{xUhme2im'؇K,A3ニ96:/rT4t0s ,3iҝu')W`*Xe)Y @V+O7(>`&y,m[ S5uN,ݫ,CV %dxDsGm;;d*E'3@ӡqp0r V#}3rJ;?!D0rBLp.^,6B]?rh]DFK( ebsyۗa2R._ h k.sNAyh4J Q&Kԍ`y #Pxk(/M;eB☌k"wbGSո}ҭ]bpM<*{Ӈ?A o|c1́ظiF5=h^oa+( +B҄+wwwͿ4UUeiO)T||h0K/%`mEK-\fV|`&Y.$?8M?$$wdO5 Jp33T(NHƚB}.jhs mNU.j'{#Jet˶׽>ᯮ/,ckbzpVEw,j5'<$MC EToM#0o[;?hy;lp.Rrm6 Ҳ I"%[0o-BV!(i!+Nzx͚ɓjK4*-xGZgas4:- *4#3>W-Cx(cزqa=H磮nJI(5AϻZĔZz@;/&$H$pY鬿U\n<#|Uۻdsdda4[Itto) F?JpHı+x5A z?Ru8G5 S̝=*Xcc{櫑\h~G)Ũ`hIH4VpҡUHZ:Kq8K\Kڄ Kxx'} ~_ ?~yuBL[_8? cwBtpל:?8nET8 ų6-Umb|3 T!4iE7F3˄eV.gyi(膀K=% .;A/F x_e+9Ra8 TmʚBT!-x7܄^]=;_@\ل%qʅQd$OYa񴰰 ~c:?_$*툋n *D*|/@\L\c?pF:f@`0)C< 2({@Ut>[`&p8PCgi]=25e=Ɣ`&D t@z=)kZ2ӉK:)İ݀)VGFe)JAh" ФY(e˱VK[𠒟OۂJqE>ЉHT ئI$-BN Hy[d~wƟ~+Mm *>?s5׫N ΃}{|$\EjZQ0*_ 4=g[U1$q;?ʭ|oJ3$FئInH7[:tJn@]@0I["nKloRA- قh^/5k_TmێZj5W ^rBӊoe—mg[y=QUy[6Vdä(!_b>TK4꥽dL=$xDm;J?j\#W%GHsmn9bs4Y{-SugRD%tȄNU\Vl$!yBUk:A"l[J^ulkΤ}_ݙ4{~]N*(0ᑲ`r*2=Wu97r'&`4"__|Iڥ&[0 eXPFkZOW%TM*hL?a*vWR1W~׋˯Ps%xZZOH:!Y%$ZZ&{%︱J9gv<5Z wb x}ylP`ZdsQjoՃiߘG^~3rOp~.߭if2빕{*pnlgmu+C(Bu@PKdj{<2!"1M 2sLTĤ}L(B=wȅ"R3J <[4]rnNKpfs&rN)xƷ *XxtD~ tfv5oSΚIڏk,# %qjh/OFưTY}N$I"Ha)\[tվoe}?,|' 0k ɘWϹk_ڭɐ-O@4"xu{27dܖj.`: iCtYu̳z6t.CP*eՁguR PRJx&oH1N14@nPf]Ջ;~XxZS@fؑvqe[:TAgn7v?kSfv2;z_PnWAfMD5wRfJd Y&o>`<[1BH%4eؽ&T QCxkX̗~'W2m3D,q ;;dw]fedOE@m~М}4:*" MR'/قQ9=T9WwrR:j2EMG{3D_Oݻ2N_Vհ|v. =O#.GH؀кjC1G/y _<@]sA{||d4L V)m"MH)|xޅ7QTUP`& RdxNmow)TPqnFYxUJBqiLcKL1`-uu6uP?* )@%kzu:}k"jV0չ)&`2ʉ̑f2; ]d79}d7,łK(e:!#DzBf{dȬ5kA![r@\I$AK:&Չ̵p=dn^22BܠC&(727#K$P \]z}Ȗ)ekId3Ï>{2&Zz]*ش֯ N&<;䃷B<yfts 3A?~?Q"۝b)EuiDxsZf 9KJ%2 !5d@7<\7_nYL?hez7+?QZ/J昄m2F_^Z_w͏X HG6$`}XElb6nͧѴ|9c,&2gM˩3Dž% (.2nU27ym'Bۋ4($`Tfy#RRJ`~,U><;4,-5Lsxg26ppx Rf: @*ŝY1 ڄdiisvMd3( 7:DIz S˴Z%\"KF 斐ܨZ/.0K_kDPGLT6ihY !Q`*A+&)\ۜ)$S ;mA|IɚTpp_2]]"`{2Ae XfgxYHAb+0f%.3k0D]/~?1oB@M#+a:1\t+2# /sQJ bQ}l㡮Ø[bRxtYH#@`A"96!4]JNOfe)m tzY?Q{s +ʫdwݵ{||iNwI"S7s7E횵qD0.g?w'͐}H}l{d6AKKz.rrn0?A/UG}&R|hYy+,6Mv<̘%JlPdK2>']| U0Օ}3CpGv-.Q)70p%^ )Ҳs%jYXpi2rbH4ҍ1,B]2撒 !iV[5 ź! 9:!bȜ;oTK/*%qfaH;Dk֩77hw2] WwD־pI[0!{WyN=q>TPA߆C/Leklt^K|hy K)qѱ$s`]37@JdynFK"̌$ Aev;Z0ml;^]ϭ8 aW6ۂ"VlI/ ( N?Fi_Vb,c3T R8tH)\fɂjgmmK nԍREQ.Pb)]^"ăe{DBWǥ[dS= @%p2AAT/ ԅ #wY!i,ȘiYۙ2Sn<;P$G .݀s(BV}L&O>Ag>a X ax`&eէ_A,QE >L5h^᭰fE tKaP[[S]ԿvYd(EbX$cN$+ϨPVodW8g ^޿.4% ΐEڄi:B!/ .d?L讝D_Atnb{vARi`c03xtxùm 2 aop.:ao1FxX.ՉHh'3jzv eOf~61חYFQ*|n;Fpi+ `48uΞ:* n׈Ώ/2nf=Yf }2rl>_ egMD:kn6qu'$i۟RFAz%̡Me n3.WPɊC/pzi4Myg_%u,ݦNujkkzN2I+`]3"WeNjAxBCʬ)4?^6SXmRČ;0d*5Թ G T']S8Hƿvݴq2c&9.aSwoT:=R H2C,956FG@Y~AM`+Ы *X<-x/2^`E+Ej.BigzMӨ+j 3'~6 ?`[&fg) X PJӒ2/Pc>p??[6kJDd I'N$N;>[vm2F(wndcl{P*;j̴ThtiB) le[{[pȞj R2Ѓt|?2dlq5TT*3[SQF\Nȍ^u:c:-J5MjƃS *,jߞO'yCNvodů!=y;J"2Zt@[1ϣ9\K4{S}$;: 2 e۷d@hdR@^(QYN[mk-m՚7}Pn^i.,~1ͧO-4p|R涡v<Α~O7-gR+z˖OkL'.$#Rpt1,>lє)a xh|2]7ӌi$wJVǘL'O قmsؾt~ ›oꝲMW3 *`!<燰Y0Muao\-n˼o2v0!" Nu.#w߯dȔ0rxm]i!v[-)XHXfG U|!2>g~6 V"ߗyAJ慛ȑc#>e[ŃXJyuå̀Tݬ&ЊO$9W@st,Nvua<-eF1-v4J!1_e4elh*'2 <c#MUeB`]9y!O7oXy aVeWA=[yPMz߾ ?5:s`0H(TX^ (HfT&z!௮ϑP MG+9wp{[Wp)[Kf8FwKN2]?oYEGŕjHr )10sVIhxJy^w+'˜X%$gO-u>șwW?:ס߶W{m>ڑ}fԩA&wJꮾvVT*p1K_ g[ F՚VMpuT ~odv"ЯnEl$C 9WWqR^Bޕe#IZ4LbYFGMMMɬ r]r%S.+&~ga٭Da@d5扣G8oBIp˙4S} 8 R])$.?H`goӗ!}B[Ϛ@FCOÇݽl`MAw'/ȒT2@K4mwJÖJƿ8lOe쑇#&jnqVPA ܇|_qkD$R ~s vHd$>y a" `s _@:u!4tOrXPմhaο2w:UYXRǺ>{nrc{{^h%0L>v"A7naQwմTm?;)jX/U$VVkxͭ!U*HF*oZۘ{_xhy;mLPTxΜ}L[OEN_働mmjSa\Z#F m+."g* @5 },uRYtRMrP iږ8^$s[/d)>Mc"y30'uW46h&$fM_`5 K.l0,I[I4qC&^ &e%UrAfJ=o\] ڗp%~Rf.8mܖTãH_|~?< |ǫdׯ@UfTPp|$^8\5 Uu 6o-{&vO7/4 6Se%4#7@ƲsN*oբ1NI[F)Fsxxz*K|&L%G{-epw \1 EoO@xQ]R1swnŒy6bS:_iox*MEyVh8~^':&##Ϳib$CT*pP-`# ΍:M\K2-RCJvO1;1GF&H g\ m0ԋ;cC ELpd;Z'z-T^ڟ~΅\uQwOi" 48ux*2ëHax Owj Cn_WCt{d>l[2;g]Kӕ0J^ E=xj +`<06N5λq+oi|NI2+uZE23 EXE鱱AlBcy-\XɥYH'{KNjEH0h}_Pw5< &<1Kr;;ߢ>K|" 3`Skqٽeî.kS-J%u%(Y㘣#x[<345W,6z/?|{~;5K|ISLR2{iMJ7 'ܾS|b5dqcH Uv/6Ւƴ /p9lCLsA[ۥT_/=_ ?P'NquPלD1( >b8Pm; b@>O4%ˬer 㾋2,yz!0>W,O'\%ow9DPײĈྦiX ^zWd/ D*CTpL*U?mB\F8Ux¶:H?FYo#쒫WsFө QF[߾ A h*檠g: `$ƴ*My=NKْ#u=_/N [Uۚ!)io7gM32Չ($JB4HDL=O%2Z϶mMrץu[v^s tV#r׊ǵ2t񠘂"[I1Ѫ#ܹ%Bd)#HpK1ADJe},XYG7 TS)XA#x;"nx+ذCӏþ7 (?!#X\t|Bxs| mnJDy꧟ Seg3Q0/8Ƀm~I?oa44 sv8 #D81%Eqt~}6O> Uj]A.Ns c3~YeP7-ċJ,~[tGُI L|CthZ%]BFa oY~ Pʄd\)q<E&xTɄ" dFyN<6;'ؙr|2!2p^surl_ga6"H2{Mr]W:\OjiVrv9?Zϲbu.[3sS+{_sTҲ0U->y!-]r&JNDp&Yw^R2|~H=2jἵ*R0boZ(D2#32U?՟4W\U'${쨍*8qc2 u.lkT!K-zG/Pg]8u^9 ~)zJj0P)_= nn²{ZJ8Oel+ZWfn9SA*هr0Lo96+Wi>{|i"}xh-oMp\-M@ Q/2:n(aӒ@Fι*c^P9ČfZV1k5n?3Ҷ Ҿ zt݃vxb@z1bCKO\B,?]bG53LΚ4M~IˆQewNܻpz[heC3Qe}V"ȑnv">4V2 %ZE$rE_|}V~? m=.5c | |0tT#\ n<_x~׼N$W ǡ d&)v|4=ਗ਼ɯ+ *`#2TE JbrfS'@% CDAƣ2X)H@*Ȅp dOroy ibO>i+ŀkgPM ȃ춓U,N 3V mk 6ł[1bނ@)@i[t,{?s o*^R@tjiB!&^ qn'a ?GäzKy 4Kdj~S 4иi5toD=CT$V:X\(F}Py RZOw6XOCû/`ŶF@NiUˎ dW'}6?rVC4$%tBXuTɎ"Mލ(UDÅO W*i$)"$nK?P8~@J;_a_ag`+^+7.ൂy{N n)&?C$IJd "cdlbaE8eiO1t4Gm0r|+cXpU*p~" (BtJp;&x ^,-Sb`|Qi' 3lC迱# ànVZ\*Pϔ5W4b J^~ ]reA>5[5Iᒖ~‘ @uմ}5ǞIkR/B OO-ZnL"]&3Hr<=%qeQdimWRӫЊ.Xt׿O-0)ܚWMU_~_곶\i?U-/RgQ@Z5vuM=B~+\!YpEձF8090~/޳ʇV+~K^W@:xwWh_)jM֩! ~o'%8띸퉦Cc;⒛ay':\ DAt qeSQGuuq1DBҠ d %8DG#YYUt/4-WpOyjQUAGq m~ׯX堿o@Ayl:qݟ ㈟}&O%-(aEJ"=Fs @2]J p//yK|!BiyۨbC+t`&ǟz~d/ KW#.=.sHW?N(ҲUv޽i 00>|!Mu 4֢y2S*cP';HP|*Kf[1O]Nj^iDw ]8`JL͇@|$Rߴ!Ղ0-4kR~<Ѥ B*_*Ʋ:8 ';3hzO?x`j 5zGRo(PG?ַj6Q;*1YYX.$y~˄o$~T[dŽtDw]:W9W #22񖥂-Ocnۻl=igZIe*K4f=^UgV򚆙r'\5BڠUWc2HEX"b,i ;!"4( l?AL`mml+Qp }vkN}ۓ]kZFeuR0>VM۝6[3f4l\E9ѽE4I_[ 25%Pb,CČ&&O*Tx&-^!r=: SZ=Ⱦ?{keꮼzѓDO?E} %fla<{Y^k-ly)8,߶Z))4Oԉ\|jG+S;^ĎFck ª?)Qߛ!?*չI8; q!nķzTzQTMb ybWAttM0,[ <〓.>)} K ӽ쵰BG &FlLV YrP mq;<z l~ف«.eV5rZKFxVkɈ2ILD!b-[;dzL@Zk p?>UFChlS [<G=Gz/Vl0 b01].<՘e&X1eF{\~6Mo Q+R] sfs%+_Îvj<-gle)9-fX=G{T4Q@ϗY+_J.}=ØxJ)<%꯿ݻzןҵPY눦*ۣ͊ m'M*G-+>/wg(j"Iƿ\_L,C KF}[aE* lU  ~=:޳Vº&|UX讝tGY/O4ɀ,_]ɁB;`` \ * a3O<~l~4". μX{+(#}98GeSIv4Wacp9|BRL׀IPp;R嶭T"CXVkU,AZ6Gy~/py@ɸ`s;Nkek$ T=0#2IDH9[ߣ˦B'uPmDJYGTvzH:?ا1\>zjd[>-RV7muN[eהp*ӹpWԫrggi%m3x/RZ)r!i-)Tp MA<_Ŕ㗖XBE i~:>oD^x;1/TW λVVP##|;A6Jfgn~M;nDlVsRIE7?l3dm~H_먽 p& P|3YL! uEX1#=~"%ǎr?*m? /Uv= f,2^CmRYCJ>ECjW+b3ğ[g_,͊:Dꘖ׫=R IS)AR2ljWQ~,xo!54TxL/oް8#Mg4-k!n|1(+NY}׽D4$LJ=z.1ZBehz9K: <-SkBuņhY '4[m1-Rl$~$U*Mb)[LY_!`b 6:? b{_FN"45Q?vyzőJwV~P?|͚5ՕtG\bpph4Z4φ%JZE\Lv<0>ΫN] [|icNfK (J O@mBYJi[<?XD T7KWŚ$<;[tw 4Aݺw>T{Qvjz݃t;#QߓYGdSP M{7Pn9[ MZl?"Ksp~ .B/l+g&J!VC_]wE`˥̽ϳ{V;Fwb+C0TA)HTNhC3Tg4L/o-IتIK`E]ABF!@Xi,+AZV[* 6RPk;kݺ;w`5:J?Ke/ qwZt^:qWM [;ؠ !JfV}":bIߐ0Umʤo̪s1gDsz -[OT~<w!*?ըI'Jfg?!mSI쯘U?O'-`1/{ym4ZV λN`Qd-R /Mz444N}}\S1#LNk㡶F1C P06EMu-9*+^{]-E-|+ܗ>@ҽUH)I$9l%R$" gifl%G]QX2m.%Il·j5~O?K)HH8}N=? Kǀ}fU++/݆/ M~J53=@f<2#ל O(@`c-:gvBO_رx!yO<`^# "ůk7oI6`?}h8.ZhW.)UOr\V&igLBK|2!i`}$%}>Lαe$<xXncOsKhpoW:U#}*/477H0Ռ!9(f: {#w~K9 ׼6]Hig&<ſa| r 7|{<וR+Pn? $>8mHŊOx;6Gv\iio>T^gHVh_r)6~w/DZ9򞺮S4ժ[vT6dXOa') =xu\~b_(lu7/û>aB020OL>@=8RΦ-k2gb:B RM*Ď߃SZR_1="B;OQr R]WK*e$bqqbb$nUkR- AkU+"qՒ!4`&m + p 0788Px}>iiiIg[&J[_[[Kss3MMMX/xu=Y '#Rj+ kKo#GMe jϳO3BYyeOߧy/!O&'<& b a׏fޏ*HA^%ʢw:sMWnȑ[m۳Q @2:a,=AtD-хW"@_tOEUݖh}詪KiRXDwblj=J1Rf ;vR)em9:IJsOG.d1]Hp:N&1{{c"]zȺzzB> q0֮B+ե ȑc<3O#q-K`Rh8zwރ`(O 4B`:mO4- apkn4TҼ.;gosã003W*bWl%:KL8iN)8>ஂ[48@;mL0'fbDvDg>o KꄀFz)kn^$G;2D4U {.Lddd.K !4:/_NSSӬ(zΉ *I˨t#)2o_p5"n#m _dn!Ԙɬ\FmƲ9#OhrJ%=>tfcGsrZDfCXw+\KR,hRnX"\>gS;Č#m+6S(m!I?5A_[Uܣò"V©aB6<ߏ]? :xG~۲?ƶVm@vS]_?a6)Ⅱ1M%, RjV0qlZ_COvB'AU'0/+.:>@c0֕P_|APQĎFIen.R IeiLaQ)mNy4,Bn1CCk@D*DN%CWLKk需@69uˡb떁mu#v``&>6۩ET4>sMXlٜ(g״V036|yw J!.z%\xC%EG8'ɰL=aߋۺe+%|yd1] *h, ,ffOW}JD >NRJ= ;%m0#>%cReUH*] mMC6 x2gΙfL^ B!&iؑ_y& #سDv*EguLUM4c)IFF%LƱSI,3L"@k 7lh&P8cb`!y]jgx\IQ)!Q}v, # 0Tůէimam;%ihB Yb:φpX1hF '! g,UⰂTo{Szg\ʅ xtNXӱt|[>{3cF%$JMW* hU_] MrMzUU,?WMbAInIC-k:D29=ӿ@ m*R)ch}/5ئE|h9܉K]׾Ș9dT=1+D0C:cG/m֚U(4Pl+o6otfB`Bډܟ]B%|59Ey^6yxfǮmϽx\UR慶=q\P%`;m(OLEHGfYX] ϱ]O8k:^͠ev xxwT2[RX!u\tu5)6Rl-k7Q<=/Ct,]':vMA=o+Dޝ!Mt~͝3|ny>1:|7ISS]ʕ+imm3i (ehmmy^\=Ox̤j}6_oxOZ! 7lRIUPW^;r|t_cn8x՜u{m^oޅдQ9ST쿳II)'|D 0KݛU|T_|)uW_;>K0_AXƮYHd!l ZB_ .(c{=C+U:@Au\1S @j0fgx.bNz'׬?}=^"-'A4 9{l[ W_AxP `^/z0Pufv0!l MQH;Plm_ȩ4,ϕۦ/C}Xx x_rZZݻuZRf+)^wvٳea:cX3;l!  нiWm`Q:5i|!YMJz} T?_ޞ5 k&7:G>[sG`jVZEKK˜eStww`fZZZS|xΚ9Mٯ@_ I˞Nz\L7? R7k+ )t^,`vi)F}=?aDEWQfNiu͏=ʐi&"^_;x+-1 #at 9ENւNj9eozs1x%4 !A? !%Vc0xeb5'/uPS jISA}-,k-M,8Lh?}ZRiuX ah2~t]GfclxS[VW`MŽ5(LrVi&["RROD $h¨G:3>X"mz^~[=YZ[_D PaFsX~hk&`,d*Яo3Tr,N٦jp[W?1NFy؝cHDuXbmmmsR/$M__DdzihhY3*e*# N8/<'3SBv͠d|f{EqDܚm!շr>׽\>}ӶuBR iφ7TqB\k-'0+…Nk]H~i-\Zcމ3B`ԯϕc2(%Dzi&>J$2 MjөmjY&@ziHUРiH)I!I]RZ~b#"Cbhigl 8XnlO)X0m X -Ȑ(Duh>/2qV=Jˆg G}&=K˫_ ic-2cB $q!El|ipGX,[GJ4^gTM"TlMб)bÃY%/f4O2{!yG ,ߠm-؏|׈#{Ь44rJ,رc J {$ʲbc C`d2jmC)n^ !}>%6t1WNrKpg?!Bs|4IlJ0c DT$F2%64F*Ì%,j7C%?D`E> |[aYjjh,`GI0 +W\7(>hbkBe5{.ESwd|28섗mcۘ!F6bV@wNH*EE6BS,x%Dp¶&էn)(a&M# M_G0H/thu]Be"\E|\BKn nSQz񔂴{~ u5}۬:늲wi31MkhX n ,#`mBhJz/vd4S?h ezּk:Im:Ύ_z}5h#~degFu3eZ׌'8rSTlv25x)Oȥ-1cqI*nj1I(hx +Jjŕs}uB:+i{i}k447g|nvpp B vᩩ%a[)+*ep2l} )ĮΗGIMČN_w&n#9I~Uo'.GTs#-wfM{M Ddܧ[ǒLt/VҺi |IB%[0[ϱ|iP[.B{IͶXսOӵoA0M4MkP__?gV,СCaf]L李&欥L*r Ѯ@[u=2JPۘq-=gR{.m>O#66 N}Ο4w˜R-)EDH&WުZ̃ [3OĚg=Η)ܿz {2[hS5Ԙ?BͲkM,_I/o#r0!M ;ȡNtoM]5*_r~۶dˢ1R8H 3LmBڶӟ!8!@z ZM5|ÍV. ':^4:Mi(yli iNҋ?Chk!y7a 8sˋkĸiZHڭgq?/~g~m~4]W-$gC!5A-+,[4Iɳ#>6Q׶=ߡS>?kO~z:wO< S8A'ӛ%j%mByx[Z9kMW]EԖ9ɑ x23lmj`|p>ǤYh/f1$6$,΁뚩*AR#xC׳#_s築;ZlN`rA`:V/i: kF+sAY>_ۻKA0<^]|=ѾNH9i2yPt h/;%5,D"l:sAƷRH9( ;ߠ볟XoxaFefs?wqh>|>˖-cժUs`&a jt]G"t]GӴܖgB@  kU>5Xq_@r=RR܃yZ-FƳC4.J0f#b%; NqQո MӱIKs5Kfg~i;\jٴŻU]m1\Kr\gMuFWij׿؎S(ݻ{ c. oc#5gn޲oS3q7wpI/!kj[Z8¶>v0T$`X%$g=2v!mdRq:F&J5hHtSCO1)K9x@g ÿ|FZ^u3ƌAua IA\QQ.t=/]~1"LHkƣܭJ=\: OW]Kƭfͩ{w«mS3/dAG !CئK|kqE̶p#%$ ZV οNSs :fVXA04>M4 oz7p8Luu5h{Dz@A}0`T0u(o=O!G9Ԅ!SrLƣw}.̸&t4lH5TL&+[_n_ts2ַn IٶLe!~N`Bh V׭'rk\$F_r[۰BV͝W[B9`<4";O8>CJ)7|Yd,2 [+6^y3Ï?0# u~os3[tÍԞw>ZuxѾDabIld1 5QӾP]Dp_'Ne:- o 8.:$H)/)%?mI}$!-i;m;+f|LC/bxGLz6Ɵ]":ԏLsJU=th#t0[1GGKTU_3KV2Afvy4MK4 #=4 ]u׋' ıc8tQ"6I#y%R"5Qe;$d#\W(m9Fy ZZ+ v/w%2uz=M"V41[2m߇xڦm9mϡauqor`cty{qޟsff z'@,XD5QdKnqw;\{;N|I;\d[MeXz EJ7ef]pbw<DaΙ 8xn6) ,ߵl_MsnIԤQ{Wf5|>.uWO8,ٞ8'u*[)sUGÒU̘qIw(ovVDGgX(*b^;}NW =ި`Jw@ӂO3,t)% DQ,"D,k"ֳ5:'0 ֬YCoo/CCCrʌULZ GfupfȏacN-~I97eȹΈ/_Y0{^}zF[Wr~30`6iUXr_,(` JaEDCrbQKR170BN1lVSt*GE.[va[H1Z+IMs7~u{0s{Luu`/)@_WQW_CFM zy/+CE襥k:4:îN%CǔSb.Z DOny {,` H62:>Rgv_`pd.jc_LhFt"Cl_.{] Jih zy9% Pb%W\EI\:䬸>F̐c;IaJ/aOscdyo[w `7᩵uU2&vL}gmq*u qbsXR9l{_a5hvx$Ѷ0C#NzZ00r[b8,5hlC\y,] 5M$FGHK1 aL4шY0u& P:T3[&N7:XNH:1q 9){^v=T"ny 4-6B8w#w<s}YMOU3*'}#ͫ{kwiål) ]Qi4^1dX-9X-)kǎ"3(@+PC[Z pM(&ۃ`0# -D!KO)gې~=ֆX-feRQ%~s  }dcd$%`׵֐>8` fs ڱλ'g{:1Ąm4Iދ.l!G)2p L`\PUB9nCq;F/JpPwcC,N ;y6"c )kZsv)8g[ގ4`Y%UUTkAc bQ2c%>Cߙ֘)%82[S'9M3}E buF(a=mB~?~FR ˲F?ܹsضM__ٯS+h\̣(+3Ӗz]P8 sZ[AƣmCd$vCw#v<ޏBP7%?]g K99I=ږ#Ji.ԍVŊsutO~ NA.x=4so6X`brlUQD\e)Wmꯜ_Fs!"aĹszz8h;06-$iH; eXD}3eR}0'=K˚G8(':41%R^lH+2i[1g?R'0ղf)APgdV*0nzOJy|MӈZiA?2u}=c^֫ބji-(G"OBD_L?,N 3;q%b:CIӲՈڹX eeX`9㿨eEČWSEU=+&|dEezc>U]&lv$9D\]-N`iD !|e|%5RVDIur B, 3ɹ;>h7QNx+VNlzEPa>v25hӸP(dst.9vG ?T_RNUs;d(͓>LXqOaXJ81@rMdx+ARg0 +ؙe?s x_zyk MDAjPߌvXr&~ra }>R߿+VLY?dzdd˲Rɳ=Q=݊z<:"6J<nH [4=0o[-9K_`JcNL8259脊Z3͹>iS8!%ʲsҊT)w<{ɿTo7%&BqTiJ&)N:>+}imU05A2=6j=6<=xJ)5]|V1e۠i(;'e" !a|NvT'fYn)@*I)1/Eŕ{tH=hqB\D13fUw?qF/u!Gqੇ0#1'I9V$BὉƿn|s%#*]R*jhh4F\wy`GS:& {;Rf7L0A((< _Cx% MPN H4Q6<['~El]4,$gC&<]kpUd>%oMyC+6(kS ]@gVQ~`$U0Wh)k1 #`2LȐդS]߀F;zdcUXmY9\ri 20!p(u=C+K4y`/b2heGvA% A2rP {^sV,&Z!Rp9gwoX4߲ _: 0: W!^ȢZVPU6= Amk~ng.c7͉c64'+j|ʦP JL{ӧ: y?_1c:.So/ْI<ք?VuMԴO=z!_)r>~ '#ͪ(yCX)$C]gwzJc ˅‡bk<,'u;& [/;@bw0wե3-O둟'.tOqm9T;)Ahh_F7IVS(-r8 m3ewR5ږ"{ ,<&me$Ql=O݌x@ u(.#2Ħ?@Wt <53of-s ȆoY}}}i/7}K7f% %2Vϖ=Pm֮9=6i6[N/c \*IjGh!5g4]tDH ?"m#K7Q:Ͳߌӱbγ #4hQF3 :Jk<+=~Sݡ]sl- iZ-8+},:]yI$խ)CYĉ,Z w(-Yr&'aىkRcEӴr3~`PH )=q̞|뛜ƿ9}*EPQ6Xs%i%@D"Dԑ)`Kl# LL)6#rwo8 ?z'0|_or4H U-<ԄԶ`󧿛StK+r-㿷7t:nc־ERD ]M=iѫbxۥQe$ًؠ)ؒIkH'jۧF_tA@nwy`'C]gvާ c{(ۜtGIu/>䘚sh[>\YEeTe|sESGu4ʹ'W:'nAM,n9J5%]`7kR jr q ?,YPߜazL,+m=Tm;a~~vyχ뉙5 _2aC'+E\&X1m&& !d >m^a $N7'ii#BHZ. 2p{gJe|f,P?~܇J#$(4?}՛o1fZ'̒{<<LS(B#PL̡ԎTWRR>j>?*9#sTtgdl59>AݢHswqn c}{/Pݲ9K/u^,1.n[ԧ7<;8, 1B `+$ #PJIMUP2@y0E|QFL SfWW~M^p=,p8L g{p2:^H4毼q;az/y6ߢ9eT1ݿh^Ě`+IiMaG3  4CxwJqz l5k fHy*hV[pzL?pT>`!0AJ0~n'@H *b?U*ٱCP[ zg=v~R=GYJ9ª+kWR-ԗ`YkDKRNJhݰ9{mD~hˬuM^8oC_ nӖH:b ғudK7Bиd7΢OEC+%U{T0N7?|31MZ0-^<z FN@;WYքiGqes&~:vr' +-G3|HMG)4 taZYJ^< l7+@zOe Z.jzFp<{sB),3ʾzB [ѹk.k5l[Y)@x؄Ӝp1{{(&jN K 7B$`vةpe)2L@8#O t~stLJn^GeëO(GyC ai>b) ?7߰6}Զ\+@M =up{f"l3ʋxߣ i'jC63_Z4wDŽR-՚rn'?alD+)x3C,75 n .KR(f$DC|ai'AIuka;o6v:mμq#,ʲ{i;t܉5ۛ"P9ϝQSVX-8P(=cٳ{|"* _SX^ i'S`d$" H HϠ~u##%u nTX?˄-FG MG72RZJMOzO% [54vg'Ei]"4=l=-4.iԾ4~ ZzfR=U4#oeuM+ uMETF!lj͹0_.<NߓdQ9}n *wvr>|q$x#{Q=m͔56C#=\F+Bi΃;/HJ(`ud'Yk8/Dtڗ;*͋>#G|JXM~w8WضS[Q>pZq{A=Kxwӝ7calۚ 0%)3?m?aSelwf]? #}3s~eFnSz %dinjcu,L]GOZHj>?5m9w#[ gSR?8&7W|^?rjT )jhaIC qg;s mc:'_{%H78 YW=qHd$9]г'V5Eϑ}P53Ё pۨ~̉Bj\bQ < _A(ߟvu3ljB$ &9=< C;Pς?G6PDB^~,Ar>:VŌVs0J) $ A㒵ΪTԵ:Y"ʯɩӔ9?knsFASx*,SedO?~J|[Es잍jllf2 &:\tj[m\. iv`F/O=+lrU}d/f$tVRd d.V*ΨԎJ!93P)5H 7!%O4mV4N#8?MRӶ8-58kkb9ew>e_SNX-+|᳄HmTMw| :{b[Cd0zDT kfFȡ4! @U#WiϾ_K0Jna[> '5)Lz05h)vʌ\/[s:Bn.VI~_x(ĸc9-EP_!*xxWSZr g1a˜Y&+Buݵ)ۺRJq7uSaP ūTe}gJW)a{dmJ@65ٍʗ7RRQ(2k+,a}dVUY8pYI;U:f@} qCy̏#sv<0e,Y70 |D%vZpyd'~zgNƺy7iCZ;7_E-7}Xuj(*,`U}2TN?(iR־r{gD}m[>[~v+h[؞xL3GPP鴷8''R^p"؎@.D̨S?kBpAevYd?D|nMw]yuBVL/L2s"9w uP<-KRwPP?/8#iH!6R /XRڌ(x-Q`U- +FvӫWBPRQˢknEjw)P`)'=%Xe1͎ūj^H;Ƭ옚mcQ'=Iq[3b&5 T.|<UVaxN1,(#};ٽۉFB)F6|%K|=C}] ⁶m_w0VJ٘^N!4]7o]nE#tݗؑ@4%H}(CiM= 4Aס=5F.UJ:B@E-bNkY` t>;IR_!kh`~kRJFa . 6{3؋՝pxc, ]P얬q(_rYk3M˫[YDKo>Vnz F0^iUJZe|g Wk xӠ^B a?y,z3|+n3ӊ+!UdJ']ʫi\_XK]L=‰]/qbsFѰe(ll cE"nƲ"`,}RC|>;p39"Cw"ƿH\DӴb}(qmc+;8o;G "()`_ Vw]|<U&"vA<²:W*G\hN7fNzƷBmSF19BC GܔSPVUEEIliZ!|81UZs3bQt!`F ocz9} No״u> V#17Q([*|tl;C/qyhHmYQѶmRj jYք!$-_ ZJ'ąP)&-9s)56U7j3 9RQ\t)8{їm(eߨsіi? ~/Ǝ59q! ,u_]/81; P3-he ūN'ko/XJMbP/XNxӻ 8=jM<PFǴl) e_v-XA飉iw0aJ.)BQ) <GxN(eL@pG'1[`6}}}iz WSߦ6P)mbN[2lm{,/*fF7=bPK&MB,^3n=dU7QӾ[qZIUgm:ʩ#GR۾K$XU3Ȍ5WӸ|-b#P{mu"[1๓ v!<؋92eg tcKb?eeeΓyTkNJ:KEq=g98@(e(B 1QRF򺹔7a^&uy_AU:1GFcsMуTQ0'~6D\4Z Epڿ׶/_JB!u_RY%ߞ8@aÝ!,_CUۢk걶NS% ©9WA=ylBjkjXppt}Mt2>l ^~ 2Uu:=#R8;H7?Bm"c[@&T?J)&4O~Sm͍c(E=I۹u }Nq[YyLc" DDj|*[>32p8 甸sX[T5ϧcMFu$}B`U-WwT,_Ahj-(QI8pB d QXT_2 Nt`U-A(AEShRשh,,@y Y$scXBȗPBB,[,G}.P5?Hm[y0g~VZw4rr,['K#6~VLHM.s8e Yfxx8QWr'eiV7RCj:utWҶ%+W%GU R1d0/YniԶ/})Cg>G MK',vU jO`ňCaFB-R Ǜ!eN8Ao(|8WJvgR @'edPJM_Zɵ]uVO|";d.)pT&gP ŝ'[VK0"o-&= RQ#`x*Cs_u:ORL{{{^>/"pR^ T8u1r o{Tg6_b ) BH9o= 'uƘ`Z_º?7s)K]omd&itPģ88قCSjŖN0? HHM (َƱ| \$F13WB\ol0c5Oƶct,Dl#@(p>NJ9 ۂj{Rn" &Eg!D..l+mw4ځs*jϾ~z;GI`uo㆏;ʬN>ԐRCfWcJK=$`hhJ`r<&DItd9!!y3zu+wHEp#yxL%R(&@PΏӳ\A5zDl#1Rƞgj'WcT:ϕ)T#p G<"V3(k>c1g\*%pc.bc=Ow#527e|jԸ38,_ߋkdyb{V@4vRR8垇fǎ;Wq1f:;sΎA~Rlb^pq1>qL5¹ozwz{bF&Ʈ Jb{ 7~Qa ƾ3fH@=Dۻ+P0 i&tBXt)zr^ߟ l 8^kW-ϞquѥnsGu6Ӊ* J|i,~ߗ1u uNΨuH0I}6 #1ftg?Y1ci,eX1#&3ڴ"A]@lQƢI*P9{ޣF5t9jt2v8|::\59Ww+ξ휋p {#C#ް5(㮻{\5r+n{!^G3@260DHtωĮAH}Wfܿ{ƧE cGh}q }DlyMB'>#񱷂kG՘AN[GM\(N)L9zx_!?S%y!cFQO(}1‰wL X" qeBٍXyeW <[3ChG05#;?{NB?M7X7ΤF‰dRt_0iD###`+*#S7**X򑏲`jl1=Qѱ|Q3!ެ('.ƌ c|gL}YA5ǢAc5res#fԝ;9Is=R3~iT ؈Ķq#b aԍb(v+m7 UnMou;@t("-BqDI=cL|5>PȪ^@wSy}qߋxq5bQ=#M|]+#1- 0Db8cF{' 9kG㍡xTdwܹt,zL`?ߗJ&M%cL(_ٍ5~QmŘs"1}M(Va"y|A=3x' B+,em*(l9vOfdd$Q 0xԘ>f@>OQyԃ?H03[cN!QdHo;茏~RC'¶m@9B}}}iߢ{5Y;[.nQiN$7!2e̐o+5f\(ɑ+wkx5RMǀTB:k*݈TXALjqa?&1j$k28w'<::8!cG)5.cij}blbWԺu8TVwtkcQH5q7 kLZq'o `#1v,8f?$s:]$N:7J|/T [pS|t6p&n;~@tsUce,v̸t=] dkjܿvi^=zQ-IDž:b6bdڳF[JISS/.8H*EmmsYv1},MUJؠQcc{xL&hg- T^9PU|Zy]ikkcyKG* ˲ F`:D"8S0`i =Nû:#nx;7߼#o I%q'z΄ !DYɎ= m36[9"0e!bQX#q<9&rH@wHF"j+C_y,dbLBM#MOM:5o"qkf].'-ҘYb8^_D**VԊo[> \a81a gΟ/A\r :#`+_WzhXe';ghL^WI[. `T`WRh*`Y֏;6m,qi>(igr~ߗYr&;R񿧾WDF M"p6 Gfa:=^) aTS3ʻ<0)WzH 0rzC tR ޘ6 #@, 4Tnv`1aŹX1qoB"6.ƹ^RS~q4,[>=*gl8r*x]fƿ/a[>-łeFxꮿضǒ_K+2XH:p-Yc{xŖ)=.\VHEP (x.l)zϡ~-8#Ĺ˗SSS3Ã~?)| h4Ç9~x:4.ڀő>SP^l]Gu~ ۞rj .MռE3;$PŠ A\RjO7\rLJY"!џ8zqH7SͥRqZ~/R%Vka`wOyJ^cٯ S?0q#eee,_4p3 ۶g&d`ȫgVo Pׄxyf)l{ȏA] 6;Զ-ait XӖ4M>4E}łjPL˳?[#2i;zJRqUc(>K}X \Q#`Pny,-B*iK59BhN***fvlu(D"QXp!N>㢤ܩg|3heO~c CRʺ|*3=2_۲Ms˰\5oyC:J>貤qhˆgOhh'KZ;/=ZyyF97j6۽GNSWpȋzHEwWh`<<@.9ù2TUUb JJH)GUR<(F f:Qk }&yA:W^alxQ#?P\!M6M/lrRJH/JF ]ּc\' #P:Û]|7IYd2sEEEF*B ^&Y\.m~hzi֍Hx3GX!d<@ػ\B (rMӒ2  gR~]~EƇnOH-SX)Us p@y qtK?8`ЀmAoaRVh!F'q'˜MFMrJ$ WpS3sLh:/GhLnsvsβ.CA(2cdէ284M"a;O0{< t  %BjB߼j~l7/fܹI5Ŏ"k eYtvvr3ЊmiDχ[QHd1nu:ġ:UUUNJ,sŶLzOH/SZ>Kk)cdhx~w;B*HûޛMIKxfQ*=<x$&R1YlU:a,YYgF! ۶twwg^ 5X ]^{Tly,čo5;׭p HJvG8XSMm)n=d~¡-&ݷF?**4X/] {p/6y3##(BvAxd+SdQ:2Hm,6jۋ{ kbriS.`-8Tnެr2XQ0}BX|yRd|* ۶9|0G%dPߌVX|I$߾mж CU}G9_~s6iU 2Is|Hxp?\4#H@z O;ZWU13Ǩ/q&YX*/HGqR&:mI7>`TEfGaC`&BapF-4̈́k61MrرIEW!z=xS߅aO2ߣʜϣ!u%,BS3h8A/_ر1!=.9_שP<,3Jpڳ’x+2MqV"y'WIHdTT 8b *3NBx$iF.]$7|H)G(۶s 4Mɓ'3?f@RU^?'zmo-6JkϠV !());lĊ9)l !Bzmg+ʶxW|+$tw7ita7k6zY^@;=(>VK9%8TFGЁ i->ȄNg!F#mOyD"ڵgϞ I_ol9)o.|yoùq)w21߁u*|ɟO{7e&QfotyG֬KYZNO!#\)G~D*`OkRRgJ*I-xLHa{EFmmFgu3 ~ SP^aeN Ĝ8]}.qSX8飌7 à ØȲNQQwۊ">h6px/ %5ͥ%#j쉄xIE Ki fв0[+R:dX-¹/N΢Md"hIENDB`fastapi-0.110.3/docs/en/docs/img/async/parallel-burgers/parallel-burgers-04.png000066400000000000000000006544451461403617600271450ustar00rootroot00000000000000PNG  IHDRX#IDATxw|Te߽S$@hMP`^mݵ뻺m]E"{2$$@$|b̔;g&aMB! 4wG bN.VxhSA *C#:nrпWz`" ڡ !B!؏TVxo-4MfvIsYMd B! ?ċLg-AjJ"<=J/@ B!B4MghA\\,'s9MB B!D;g&_of,"p\tmq5Mт B!D;7ɯ|T15wLvXB&!B!ڱ7[?PQCQ ?{;&ڡ !ZB!h֬׾4ҍO@NMRB!*(,W=/>!}#FF;4!DH@!BvaLtq%WqyG;4!DI@!Bv$xݟXd#al9xn!l6[BDB!h'L/uEQ;p>nwlB#RB!"q 3~MՕG|LJ(G&ho B!Db3~8/iBǎ<;t7ڡ !!)!B9y<7VbǟGE;4!D;%!B!ZXE^ƖmEƺ[w%QLўI@!B b `pΙ\r˃MI@!Bߙrt]GUU;gCBsRB!c5@ ( ؇}h&H@!Bj6^~;*+}( t^~MB!,g^Fqq));9(ڡ !#RB!Uy?(t̄Ǟ!oh&uH@!Bf]}G**'$r8qQL!B!{_Hs/3. EQB#!B!P aͺ혦ngigqp8O!$!B!@(3Yz DUUÄG&&6. !NI@!BF2M|h(8/?2iO!vI B!B4ECIZz<,Єb B!D#lܔϔ׿‹i'$rqر'D;4!h)!BEE<4rrK1ME_ЄѤ B!.A&6E:?^OѦH@!Buw>1 UU9pӸ1O!B!؉3i{^|B9)!BрK6G#|f =zvhBW B!l-)+ !1[QGȄb٣B!Iy_y%( .vhBOdB!B!_Κujqgrݝa٢B)!BQөǼu#pF;4!gRB!e|AEg~<;uvhB$ B!{ 7( 3:scһh&MF B!bis_r/`1G;4!hRRB!2/LRLrqq/vhB B!Kko~Ϫ1 uwއvxB B!;n'uQcgvxB, B!;?}`0ӏ^$-=#ڡ !DB!د,^w?tgh&J B!bek'JJ1M$na//H@!B**}Ldo0 ~͍?h&-B B! BXt=cw88{;O!ZB!D}6__ltOvD;i-)!Bvau~ :U嘦IjtxezЄUB!h|]y(),4MGuM!Z )!B6cMalLrqΥWsEWD;4!hU B!,3&g-4Ml6ˍ>,b(B!$ՙ۟,a/?:л ebB:RB!mis˙[A;gгХ[(G'=!BUK}^E!!)~a#GG;4!h B!ڔ &.%\n.N<(G&B!DQXT S~$w'uWz6- !D&=B!DxŬY0l:(nqh'B!D pS/1= !D !BѪW(Bnstu@B6C B!Uc>r>>Tn/sd#BE B!Z.rL)\Є͑B!h *x`&v/n]6B=%!BTVxqt֮ύt?qch'mB!D /,X0P f/͒B!h5L6^iwǟ[V(G'mB!D1oZ>:?@Bb<(#ȄB!hV Svs?ns/rdB>H@!BD]~A9ϼEŕ'q.Wv7*BT!BD乗4QUGʝ>vxBnH@!BDi,Yi(B<ܫuvxBѮH@!BDiY?-AtR;3S/ !D#!Bf/~!OH{C<&ʑ !D$!BVoDU:{uQL!/)!B_PK~KAa96cNfG9:!h B!Z`3ذ1N4qO!5)!B j[ð:ӏLz.O!=)!BfS,EtE!SyY?( !~A B!6g%@Mk/C>.ʑ !C!QQ饢GYǏ!A 4l8m8v.;N']B–oHE4q\k8+P% !~C B B嗱j6/H^~)a`JjSQAbb,ݻv`A}6'8>I!*7_ Lf33~8h')!n}.}l$FV10 >m/fuŻԿ##z1IF-KQl{;e{k6lʏ< ~F: !DH@QOIiϽ56P=ߤ4ݠ0:;&1tHO;f}dr[H߬Ae7Gfu}^CF(G''9Bs-4b@N^)Jzv1c2ft:%4oB!i'Sgh5#,CG|drtB7/jG ^ov]LCGG3Y h*ͅFLj@8c"GxZ#Bn0(+Թ<&&&/ ( a( ( 6 4B iuI|5}>Ça@TB俙-_o̠K«o^/BeRBD~}eu756zr vIIICp8p8B!fٲe,]m۶QQQ) 4iBE__K72>{a.3{L14h xiV`8Gd!6)!fPU rss1M7ҽ{w 5M*Xd ӧOg֬Ylٲ`0بb@etG9SOIN){T!{l4oQh=dbbbu_M7Xfϼ8&O!Ι&||b `ursBI@k tTU娣bfi/nN'Gu| ~!Gy$.QzLvc֬iBԷpzx*kIge7.hLϾn}.\{8ӿ8q"7ꫯx7>|8vuyl1 !M x(..όQm>rtB!|Ճv4jPM&Td+_2dg&11fϞONN<&a}v4M~?A<Od[XHOOK.`eeekAVVB!<4M# iiz$iu͆i8N'tڕ>}ps!0hР:M6q_~oGƑpqA!Ğ<4~ ]QNxwyh'b D;s&~}+Wo‡?Ռ&(* i8#wzG}G}χ# &&e˖QXXH  u8ǓgW_MFFFvP{{w>ͦ2)!h/|1m>)LӜqe N!nI@v1U||h;Mn70 9wqyW_i\qq,[ b 6mY4 04 EQ4k>4wdĈ |u?XpadQ}p'ӯO]V!ĮMŵO^?F!D%!ځsx_Xb >('$rqmʃ rPL;>`uV$5ե( 8@N6Ng}믿QtR/ { `˖-F4e<w۫bSY\yO/ !jB97oQ7WԘ8?ߤ?&nz?@ $z…{q+BQ@ ~u]Gyy^=/UUٳ'/"O?4(i2ay:|L47۞S˯~mE{BOA)o`՚m+2:qK/D;)cլZ'KelHUeE{I6)+”1w5^Oۉ5n$q(. #DQl6<:ukt,vn[nk uW_}u9 233馛X~=iRZZ-܂k,PU8nVwzlӄurw}$&ȺU!h|omf-JHLGbGE78!D(gɼ9͗Y*+Ы4)&!)qQ8qtݧ2]x*+y<&$0`pQ9Y DRVṗfu[l<']Hy7bOJmԱ*M]ҹsgHHH`ҤI\tEuʕ+?9sB8ƎoM.y\plܸ1 055'|. U;iԩ\vʙ沋BOL~1w>\ D9:!Dc*Jx=Uury~Gg? -UUEމϿ N YTUe[x{t͙3 .[F>:uɓ934M+Hss 2AB7 翢)\CϾrtB5g_f2s5 EjtsǏ?!#Fr1 iN ~⯄cW(v L|Ŧ÷\]18P>>lRhrRMdNs0 >?PȚӥ]n7 #c5[#Q+ ==W^yN;m4i=tܙ~K.>reEF[~tAn?c .2vy^Y<<2ғ:6!hO7e[i*zO1iO4Xd>'rE!>!cN9kȶ}ŔZ{'& :!9b m] BQz A*Ord 5mKNq8EӐh2YcD;v釟+#0Qb&O7`^/mFΝYp!< /ѽ{w{=ƌG4Sr=yft]'!!?|̽`ʔ)L0 (3/;ֻ_|e]}CTUSẫN븄(-'?c͑]Xzs|NVO41 ߘ+O=JQ>jltbӺ55 G8p:okazG*ivwbb躛p~MRh h21N6o-v-ѬH( =zdz{(vj}/.)裏`˖-\{\rk9s=z4NJz-N:$>3^|Wp㬮ɂ xꩧ0a.gO3|ŖI! /˯}["z. t] /'7^0KN:KOogƗmK$Vy{pɿZ}KvuT8y\xtJ&\v GC;r|09y=;9|~Dv!Nf&8p9e j<ܗJ :A_1jkؾPa."nAt ѣ?Ϫ*ٳg3~xJJJvz8CGɾB7-~ rqE !a_Cw`F4H4-IJꮵW :\ /e۬"PsGL7 k_a{Y, ^^N+m_+sjaN>:]=Y %9YPڼJ>{$]3)m]ȼAzj$ P։](d,[ѣGOio\xl߾}䦛n>t:k֬ᦛn3`ժU{tsw T7wfϞG矿 ?nyBUK潏f^jf93{%-቉3_Mߙys7O{ XSSb>lh7eڈ`Y};#wGuY߬ ]S eݾa]֌o:Ȩn&Òy,hRMnCYj++Vmv(mREf *^e5%rY䧤wTמo˔z{Ԍxo߾~@ E]wA||<3k,Əϒ%K='(x^f̘رc["#q饗rGFR>ok۹޽.ly6yC!ڪ[ yiVEfh}8<,qOv)WxlPvŸP=mxӴjs;);ஓ0k=G@F(u뎂N;N=LU`dOX~s|)K`I@49Ms}wve|!ڿ2ϼ0:}qߤIhI_0뻯/ãgCìݍg$B΍ G5c!^(}fuL^SY}̚ yֹaS4I@4I ғSCis< )MXl pYzEN$Ql֛cѢE8q饗t:1M|=E|vN s.:ʑ ʊr ;ےXvUHߦ!6|'\PK*95C^$Dؿ:$wJOKض8򳢨 <DܠCa[:1uTz!<D~\q7AH<̜9k v;`+W2a?p^yܷgϞ+tAq8warV`^{5OW\AΝ~On6>h^~HaÆqM7a=dȐ,A *v!hJJxa7l)tڳ=*2:E;]]hX'$6M`[欯aG$ R\ό/?ۮc(`VɯWDn4MJ!qv7uEV]y$GkPtNb ￟w}7&;`>S.#h>ӧss]wm۶nsAꫯsM7ѣG@%KpwpG㏓O~v{:EIIi~B|A&Vogpߓ/g(G'w^o` +?|*UFmA詪䫏k/a֌ozP^6.r5}c4UL~;7pZ/vzs ǞVZH)y*mbw8h:]rG- p|O^˟g5RRR?zl6k B06m> +W$ Enoׯ_=_|.ڼy39>W&`}rW]Ϝ>|8K,i:UU9QM%{s6Q^b8vni:jBN0( 6nGu@/iZ(;NcIM'5%bHHrv9;lźvh 7?"ҩxJ BhaVRꆥa4Mzgub|5}>_NG(d'$r냏qUbb"^C̝#?M|8wIû ̩Lm2:gχs)H]@;isY=Zwϼ2n =.pZ<5-0LTUǘcIA[O۸S 6ɸfNe7Ub&?r ׬SUofĉE.ޣΛbԨQs={챻܆oy;w.Ř$33 .nݺջoee%{c+Uog8h o sfb0M) `&D.3MߟmI=2͚e; _> TUp8l]N\.11NN;1.N;n8H!&Ibb,.ME7H0 32S,ִϐ?B׫ ÜqrGl/At@ B![F0 iB:`0 4 [?HE/@YPPi`"WEQ0 wd շX;=jtE/!D1MM噇au Xx]pq0UTS[}4z! @kg`&Nz0 ihRhV溛S.ڡWl}Ctz+$g Z۝6=Ljxpg߼M_IIζ:TNO?g}H̘1|K֙ ( yw}4뚦~z>cNJvv6>EQӧvW^yei3p]wՙPi6IB 49(465/V!RKm4z巰%#9?^U^Q?w~sJat?嚦?p饗2yd.--G}N:|?4MǏ?ȑGW_qWgIHHHSNO&'' rJLdƌ 0o9k@C)ɿh5K*np8PUUU##iz B~`MӪג[mx.{S/K/D <];O6 3?$QdHkis[ %,[0cO9Uk ؑځRܭ SF)~B8,DW i$w= ̺I[Z4t@W&TU0 ~W>l|IN::o~8| >&MbÆ eiFϚ5!Cp%pǒO}E!33LƏ@AAW^y%/e"IǍmVHƤ{[4Vxjz(|k i@p`PWa^Ov Ev/^V\χD~vk{[48@8U3 m- Pe&۩('cvA fq.t`huKf혦&Yd"CSd2}ZMJ &yo?I8?ra\.vmEw\y啜viL<~͛7ux<̝;ŋˆ#88Sݻ>_\\M7ķ~fS{ B:#zB^2v14M3  iE.&Df,"C o.X{w׎uw|Mj  ezj5֟yl6;f9a7c/?ZDM-wp(H$ĵ0mi&%TVI *p$}?ڧ5s:A^~YCZ4 CٛOcQq8x5$:6ʑ֕r߰'w GoPgmii)?8?#szjd@t|A;<&MĴi(**S w~1vXN>dFIZoS_؀]9oG`vy;!ZRN^I[C76ŎQ i:+ ?8!|}8qlWeffE~_j>;p^Q4̊jXh=@ \n8or&H-$o-?g;^O .;?67k^t0&.'ei b3Æc|Ah+tQU*?"[5Fye,[96pBUY7PB3.qfOG+'ptl5j#q83xV,ui/s;`ϔ)Sy饗)++s>A...fΜ9̛7^zL>hƍѣܹ.-((o?GӴ]޶SF2W]:}C DS+*s R$S;9oCɌ4)--寿IvN> vZ N-J?㪀5u=%Tz4j u (=zCzݙ9SU9tJoQUY^eꇟRYi5ċC~4ULtѭ1 ? \HH;-ُN&HWVVos 'cQXXXzao7|5\Cnv::Z)Sp2fN=T&M/¦M(,,6oUW]ը?))+/&Je`0JшԘ%a^իWGC0سݭ{ !#FJZlv{M^rʪgs֣Zs7V_dnp:9` N  WxUUV1%tw5:!M'`?hz_.iЁ.O&vA ly꟠(tYbOH[ٱ __0 mƃ>M7Сf!w? }\Ovv6̘1NRR;vduQL8 v]m|/: hF&,ɍ Z sDQ՛{53FlX2Ҥ.2lL  }3d)@c) >%:#~e\>#wMfee}o36i ih9yl)4>V.*Sxƕ(9elύpFr;|ؓM(bҥp p <dggIm6ݻw+o;`СM\4~?,_~s9QɿisF4 n'[]Zz<=wso!Dsٻ/g\xLp`}|<64 _ӄW+fVE1qx*u=hV4L^(-߷PHh+dm6TEi 6؜WTF{z oeS$W,Rǝ‘bat߸ v `L8#<>>M6IfN'r5kSN/&++ ݾۊ磼Qc9a)B6>_];kW 4M6mDnnn.>1~C{w?ls pW#d_^:+*L)5n,wV{>Wo3_ILL$##aÆ1h G 11;K.UV_7߰}v*++C٭MMә:r0i M2d@BsaÆHSզrLJwdM 1h3Pp;zT?=Ffj<`*&[p&95Mz@ QVQ#!~;Bz bLL4kOz ׊ƺ0Jj#q1('nB i;`̬{O1t,oOΧk6GH~Dۗ<`NG!5Wf]o|R՛TɺiB!B~}DKE_"EM7rN:nIIki@ RO@UVQUUX{^"So +ڇ*u;xzj@UVHIt .~PHfSiuYjK(֋mޯkMEܽ f~[Ni$ ocԊJlR.(Oo $:_vi'{b Zn^̲qIЍKLl[eF;r#Ow(G'SE-X5˗RZT!1)ԎdtJnjNtLRJ*]2oXiRVRLlZudlɦP0a5vlv;.wL,:ҵG} ;Npvg^w>O÷QTӬ^`78w$tomu~X ӗY3 #{Z zC+lch"(3G@rlu l-<8v@ӯlp;s5 RW?z[e@FMD%(z [-[$p4O/!> 1W,^5[l55ߺ>gQx)*1$߳$m]GQ6kzc2Z(Tӱ>2™!n yQ5z8~ R3M_t! e!y5,ȆNIಚVZCVG+I-Y#6zsg*VYJ/ D7?ZPdd%1tyMR2;&MDUնq$7\nHRR,!\ܨʧWUl ޑa1s&TU]/({6: Fpѷ EHI H=)FQo^Cs6+0|^kR]I?ZNE[]w e{X!aCz Lz^Y)--eڵu:=4gӉi邹ԣ,c6US!- n+}H4kwuxi^ô :o1G_f9[7 CpO8kDY-)31juycuuߣCN7YfM +1Wk)AR  Nj- ҚYPV s_n}=j/' n 5 ZuIUE9ŅMR2\.>j;vV>oyb co& hx\\,!5셫nmpsbBdz!m#Uo l߄VQbU3;@QPq9g]EC%n%) Z^(hxXjdNQ ŽO<ޢmy=|ڋvΊbFǻlX7kMzjT >(X 6Y[nCj&e,=.dGs]3hxٍk).ȯ h;;lYSU/)+d%i%úpP85?s?eF*|0uHC~\ݰF_B^bߺ_-ɩܭ{wI -Ϧkf>CtTZɴ $%ҿ_C7/mC z -> 5n#H>NxѠb=ރ0r9[o 7*1^+7 T.lq =C7z[*H3a[OSFs hdA`0ʕ+x<˺t}ODF=Ǽ_晇a_K";lV3 6+ڦ5*Ԭu!UShp9 =vֈmC3IUJcwGkV@-i⩪dwk|κ .fGJNM#PM'PwrHזkV$Y %nfb 3!V~Pa]7xޏR`P&G#jb베n+;fV>X~[[s1Gk|)D91fߺI(dZsYh=a3ΝRiRPP Ef&z }VD MCfT) W^"30u S^* kNw>LؾC^0Mش]m_ۉͦZ^)"9]Yv-eeebOrj*OzFD9:Jyeң|Pe$0<-1JcȦ^=Yi Bq,s*gnFpgZS{v.6kK0'l/7j&Ey'G8ce=[ӛCE%/p08v5"TKt,l%#)5ku[Ӵ]0 nv6X2]Q5cPPa)C&3VXq*VlD^ҭ_-_Käk^ =k)DQQq%[?V}28st8b̀0 O0MPUՆ#555[&$~@]ؓӈzh(6;zR]bĿ!(6fFK%%䕒գDhsכ)370uw=ǝZxp3+,4،D8|礝'$,ͦZEu]b@Z#.5#ͺ]Spجxd+UVsޖP..+[H!rv1kWx߆wr~/zU9(6;}P:99%RFl ÆVkMvhrrrغuk/>ʑk} O?t79jw #ZIzSuZ_;nV{P+]c%r;(),gglѩc1#O8bn5@d˭?8 ʱ—eu!(XK-*XϹUU sT7,BW/^_i-Ќ3Pw\p s:[h h ۹y r{ 7Sn|>JpԑIKM`x}{ѶKt۬[ +Jʊj5̊|JɏQ7Iy ]j{J 26O8_4:aw/ٲ0JQ Q_C]4u[ 6tWUs<7Oto ?FuDKGv}5<+'qǕqͪuč<#1 Dk /X7v'jȬ%Xӌ/yf58:ti4ƕVE%o>=10M((,'q47!nkpWM?V]@NEQ}OHns nwNipеu:X ۿ[; ʥ+x) >-‰gftޓ% k m$><]6H@f@1It0j.Я(oaaXך%j ߄=\t-167gRmЪ58tTt}%~eXN:nߺ{|A>F%I Pi)ZeT'͆=~ׅ`6|븻 a])b~e' DnkTmYfic =x=>tiakmcl䕐jNKJrtðuȠob3 3~\itڡU6;w^s  C*ǖFa'ZDC9r68]8;u\W"͆bw:f>iQQTL ^!M ֻ\h RiN fv:w"NW)vo>{u6[m(֔kZގ' Q-dS Rbufwڬ '8'?Jj1Mf/`wjuTZSۍD8a03æ*[uWZk-nVsҞb>0;\p[^>,EUuz*7WZXqI%Y=2xedWK&7ӴN\V\Y$$%G78o7& V⬑ioAb]t` Uذ)>u:dw#=&z -m[|"$o EnNvu i۩+2ǻ/GO(Ti` Yb^oRݘ(ۼOz-6X:JJ?[-ÛfW5gf}xO\h{m[]iZUGj h0w#<=<%<5=ǚf_ax0gC_Q`hW>2Z[oX( /l[c88ꨣ`e@H~VԱ_\lRhA%Uz=غFMv}6&:ѱo`zVَi Ѝ. |a?¢uBɸfbCgPTP}mko`OH{UK T k遠( .S#33hMl;P}-u(--HJNac2l(G'-|nMJxwB9=oT򦲹o.)L*?7զ*p 8Gߛׯ块Aoۜ'Rkk Lo+iCM"*v\9 bXرcxbb;nTShl&뮻o裏s4prp/gcеg/ ÐFWWdۺҹS([\RIYYUR!z&Mt!n's`خVxF7V e(v+Wf/Fs68`Zm(xV.¬n{1{#TOղ?]2Vv|yӧYBUCZ=ZaB!Yp:>Ɲzf!? 1^ WYӝiөqL@O9>X#i;Qfxc#6͚ѡ}u]竏eykk')i>Tn+VzYS5aZ7S3 52ZK $ңZ>֮]֭[QP00)**5MXjµ^f#!!C†zÄfsСGpS/qϑٽLCy<~ARs_{iwV>O3isY=>4lJJ*)*?"s)cf(gGWF^QZ]qU"MCdzbU.mi\8 T`aU|ڜ. 1ۙ+N7sS !inoPM4`0H0$ EB! @4Lӌta8= SQə(l6ԹM =Y3> ._7M͆8v;#NUUlMe˖H,Ͽ IG` ӦZkm*=wh>_8j Zl[R̫?<.]A`WK^KKxws 6wL8Z?AmBnL] w h$Ӛh,8F?lb]o!hSngEx |̚5 bmh] &ѩ+t~ zZ_Y4_{E>sZsQ5@ 2]uk;&J+,Uu8tw|1ma"&}u޺@LGZN5'ǑґPQUb({"YmqV5=unk~/[^/C*VVw\ll,M輱5V; ' 0 t]4:Iiw]##Y{{R8\x"N'\.111WHDRRR† j:T=j>oCpίlhKڧ{ 5޷?i7d:knX >oMoFlm8 >W pXي4w,c6c9cn .>gUJX6wPwS{_Qo!ۇg43CzR~7 `MC`ozʼP0 8{=TU^@saYM1dl\<}&&6]e)^@ rTU5Z2J˪8MrPYCҾ/3ۋ1M48l`S*T֪+2P5'=?pJWghcf_}5*x,ATYe~&Y#P@,wRkS rrKq`/7M_HIi%Ædq #dh5[Ъ*ϟ(Ik}9OcR'j?pCp׼ԞD 2qqq$%%BBBBzǚ5k"TC',`w,CWBwù[_۬iZ ú7\|5B0/ஹ<9̱ TۯqИ#qݴUvn7%k#E7ú~umY]`A=1V}~gJ%{+ou-҃j ӚTVVr9D^##Y6_QQ^FAnM@ -(>MYytc+E iY4x}k:bc]{D6g%a㸣n#UXLc?P柬 Y#>$ Jd 1ʹްZ:3TLZ\Qᥤ!z0h@wB! ѮzM/^o^* nRRR!//*kK+EQ#'_woO~?sgd5Kp}ޠ~^mn5]ٛ^8QS'xVw~X #pNIpx'kt!Eh͘k\l&5˗2C..9oVRNVvkVR]s~/W&l)Ÿ[BhNG@QPS,hJ x 6sWjìS>O3Mm^O%Ņ \tKhAIIhZl۴nC11.ZaOZw )jOfQ%YΑA{JGA\oj\Du]LW %ѽ6si?Q4 EQi:EVUUp$So/d֭]H 95>xLjD [*ɰF/kyp}![K V4 _Vqךx839bSCO}hsX'կ~DSYןf e%̚u߁Z]zuqwG8iHM(= n8y< bMh܏w֎r>p2~:IfzVAbL;7`b5C)W=M*)˭Of-)XM`8hYA#|&&Uѽ#5; *;ŮZ鉰+ᵾi=g'khE gāwJoZR#MN'NiKll,qqq111Fzzn~v ֨_E,Mڑ` gBg%j-̶4jojU~kS;'A񇬭㚚q;Y /uZShRX\ā6rʊ(.ȯN96fmBM;Z ;7 ߝcŹj74p<;v:Vl&4:|k2 `/IBo^JJ+:uqFN̂a, /&vЫgF3D:$`S4$jgoxلbYĂZ&o|xV,Ԭ l L]'Q&fb{6yCgmdo) ?r^o0t`V@}u:UE7 B!urUOŵ$&&Km6[[pr}Pwۿpv~p×^gE`uḬ>z;nOX14M=|vl~̰Qct]{DXj97CЇwB׶"Jbпs[75Ёe[4RO M{ sOdMm˼5 cب,]NYPiǹ_ۦ =򞇢Ԭj b>jlHWk{__ ga_CIf/{]4 ?OZŰh-]6}:Yo2*+OH,O -0L<qu_Nn UU~;6&ұC ]xB7u^"tl*+"T3TGVVw2:g 1RgL]ǿ{;,܎FݶIzŮ ʸv ɰ!=#&Bv@0aGtN{uV̤n-Ґn3dNgDGwM^՞^&nNU]DuB!֬Yk*BxIHl]bn~ݩȞu 鰱Z炔&<ჹVmD)L ._h>qմ@ߡrXWwK@ 'vzI X`.yL >pߥH\]p١[uaZw*e5ca&X[{L4qǍuZ ozg/Uy$[;l-6c{Bdu9ƎŴZʊ(+.">}omݜ}*lVnpA**y蔑G(BRb, ;%%ұc֛Ÿf H@4m!L[|"qBuŠI`SRk%ؓREgqTL$L6FQYx+cJdVDӌV4~?|d,z5u%KtLsMh~C׭k`[5nbMyEBg5̯K2?ʚSo aZ[5 +UM}Ԧ 3cּZRj5*y_ZQ۹{J XEۭF6o=WGkGfyH k5GuZő^Om[ڳa4~ B!X sGUTTa'!u%ȝ2IKI@QmV  1 -rieͶ~`Ožy mATv}W8&l@5m'e]b镕Nz$̑ Ѻaua{0 ֮]KIIId@RJ*wiN]M`%[x_%[Ǧ6܌oo%fvȞ$n.?e%5 ^ޥcn+PkNuIV3=T*hxPNc3u'a!oH!CaQ>GUU{86EQB:lc(n3whT9bzs4Mɟam?Pi83F>xb[#PiO5ō}.V`-{⪞!}wfV^B4z$ݣo9a:M R= es_&z~E2ғ^g'!ab=Jy+//H3Bə]߯1ʑ /V㬿$+y׮UxsEfNR~+NŹ:Nӭ ԥK~-`g6m(\yQ}sz\W)*2uKm\zt.pڭǪص> me'#g-,5%}:Cu֋=7gN\N;;FT5f+GӠ)yjsasvLL Ⱖ% sPq>e}&:tO%s4wFGqI [`㋎R֭[)6c>{ ԋRZ\ȶ͛OZ\}O|d7U+:~J\ `&ؾo碻upV}L`CAÍ{ul>d{Uxظx.m?kzC Ժv?3G*3lVjImZk._CmUZXlָfe;Xu0ws#qxfjnV;t!1sx.mcz_fzTQ]Hla82"{.A,_]PQnS<Y1U{0Q!9u5%54R"3eH(4&$۹-(\?VZ3Mg[5n7`]m8Oix*~P%YU}ոkTRwwR܆6ccƏ16| {P ԽI4iҸ{'7vMn&mJ}Εs}/Qߥ4/ w4ӧdHJM<Ƣe+gcV-~yNB7`D: >> U6 9N1q5s=66,8KΙĔ(*|}iX GiFpeZgEgEMhN&j–vEXsQv<4:eԮyc,Kgt{I PoW4Nl14d?郇4ⓢQ}7nl7mٶgm0aXnvrF* :zUnPgN[:P_WˑG $( Gp$*&Y@j \4:,aIoj//B>U奔 '>dȱ#**ir@+IJ=G }&p8]4]U詟wN뉙 `5mQmb\.PZRiGu9|&և4];ZȲDkq*Q Z@wQcǎSOǿ} f4Nrp]a!4>To]{)7tIp,ik PߊH Q^duNm_}1"g2yG۶v Pܕaj{ Yp#y a^{mun0nwq1x~$&Fs͕ ]AIxVy ߹q ۴T QH̼eĝ51sgϞFn}Y }_.GuAQP=nwi]wSR͉ztO[Î;ugOy?$I *)heeeo,ݍ@bTk 7/7h4RFzGME湢:MAq= } ~iC04oUU9{v[Zij󺘸xF.P%um%L+'~6mp96ܦ@צ`OiY=p"~i:KvO%'2z Oshp:RSb fx}I\l?"Ffs4_HÞMY6thիcR$TgY!-Ń"?P]N.71alFT`4"ς|<6 2 Z& #}nYDYI!8؏a+[7E>>n[G7E 6J6xy6+ ?  w,ʊo0-zrs{fm]oU߈ X65Ck+j~PZ$dN=úLƷ%sp"1YBK1 \l,aspF=qqXp08#r%Ӧ GR(IcQ~J^=Ί"n*]_eg*}-˯i T=njxYLXU}[OٵUU IrtfNIB|S& [8+QAe2cǎr N阷t?g~ nR' X \qw_C0&LNA C+g7@N'FI@KFí8v$ccء#GМ*[!ھEj?l8">+ Kh_ӫpGૣ7PbYNG@96'͚{7gL$& +k 0>5Ą(ϧNddד}؟v/W_b;AU45PvUE2p׷ЩV-#'1~&ցb;q]H)MޭS+< uѽzeAO#cP7X #̬k(7hb8|p;^g %' hlȶD"}9^_U7Ea=IM6HrG*ᅯE۴IԠuz8(}|3NC{w1Џ6h0#ƌg֯ZgHBn}}\hAT6#ڜ},9c)c^| z0bGS؜#ut,M.E'=B|RvhT?hxط?G0Km]yybXN46)-DAGsKkvm+w[p[j-K.L)&jּ.YVgǾUUJ÷Qɫ? HK#-UfaQԖT/Z@nijjjY>x>24R\N'$j;p7teɷM?< |+a(8wLO U/okU헬%u~{~WU٧]{MdsZWIgg]px |z0۾%^q'a[u(28T"=dBAF(Ó`VObȠi++J9O/LEsÇ0j x& á S';ؾ^4{ m}X0o,}s[:#-5“}#K>RWS]ۀǣL8[o^b^'sɌ37歇;|% 1'bf,Ʋy5)g/ƤE:Ĕ1e?+ jꂠ7x-?0֜]_b)h֮ -xEEQ Jnn.-FGL\-}uz=. ۶+ӆ`q6UŠq%$euvm $ FZ%Id$F gQ۴ H}\~l+V]FW߃>FS)v+qӸvT}*UFG8P- S}= bk4ݭ _Y`i)QU*(..nҫydőCq9 ?꩷]x t$FMsnRgzlb ﻢ ?Fq~RbOι\,ދߪFњ"bfo bLS2dLvE7wWM{m3#0&u{h> ávЏL0Q#y8:Ѩg18n6m=G# ӧfQS@uMʥ)).%p(Tk_r:V 7 Ձc^3nM[4]z̔Ix+y7(I3ﻌЇHW7 (xhhg45Pi޻˖zt cm7PNH^_/qq J vqOʿ(ZmU7۹hQ9#Kk:8t GQݪ*# hMD#C}_UFH;>Km {&ݟȲ$rn?ZĶi1r"DNɘDjIBc%A. {Nd*x6V8 ?Y?_)Sq2tc9j+Wk`$I\y\JJknDG~Á dDV*40E>@Ze⧿|D*lvg,UYWd&'_FLL7UEUc0z%+ |DfA֋pUb? @îB"Uڍ%j׽ޠn YS& 붰ق)pcX8zh;K_=ErjH' ## yEcBߋ$ =늴XeA">+HS$τ(h?2ůvu Ht»N/R;oz]>M?~v}ܶn]w._ ~. !:@w8(Vdu4\,A͒0~l&چ7̟;F_p*IOl2PSq zoXT\~ʯkbt$I mBy< k=c\yvr Cw!.oCb*Hr;C[qh< M'E[d] Qxp-{-o= . KϙHdIHL3l|;ݷ ANNN;1&EkmV0J촳dk ='E3/1apJzʨ \Xw X"k~t?b}=ŤY&c`n3ZX.%2_ҒЦdשf04dV.FE]{ѼyDGq!n뼄(f#vS=?8.V_>[&{Ibz\z j>[c$9̟;]GY!'c9]#jH #S -fDEwh}kjl85! 02i |HME#;F"# Am]pYi=-u&j^Z**-]IDLL .[#F`„ dddԊ= kGyE]h27fp{ xv~LܹD.2q̥QlV@Xv\?0rF˵W-`CCq>4 P\*++[d~41iATKU~-Í0D(G9G7w#CIDr;1a,8%[bILI(/w, >K@Q=.=%XQ4*]w~t2/Wq88"LƌhnIAl΍\`..b[ ~̙3ՋVTZXfwHƚŽw cPb'~ |?@+D6zݵUXDU<&3V [gEy8+KBr ;A'D$ |qZ:Fw⪾^2oيQRRҢ/i v;n5*Qg]WǓoOz1Nl|`onMG{fED(+aݢ:;IHN!cH;L F?dQ^ju#G pL^"T3;Mgh¨lN,=zLbhf2{[Լ+N7VC}lǍɠoՁJ ۇlqS=IdΜ9u]\r%$%%v„ y< k泌Oۛ0"+o_NBBgTUٻ(o_~&B9ܢ;?GC+GbeL\?7iAxe =;buhsG#:#CEiJYQUcsW7gʣ/dpz?jvro #Jf((=(x{< N|Wm52bx  eku F<)i$ŐW: lqؘ23<h`OQ ˲̨Q[5kzT?0MTg{[B*Xlsb[kTUVQBS?fS3[rYH63Iצ`MβAoo詟k]U[I~H4ێ$]GwF ꑽug#G`XZGT-yooYp 5F 6–\ .( x/|5߶ dawVpVΈ QcsO'6ܯ#tRZTؽs0f5^q\vwZ'a ;bKYBРMSUp+s!BآQB'ڔ-΁Xf,X9,ۭt0@3bع8u L&"¿?2%Rއ:=~[czΝˍ7HZZZNj!?߿Ӊn[sw.CعA%V.9GQWM G;nK5$^|3WE).̟<.RD†C2>=M4HK᪩@U+3g^xa[ƌ{ǭފChBB'Nd˖--Fo_[A#vN'lb#sR^QxpZ({ h# M4¿OC-ᣧ2';?m lhq8m"K^?v*R|ƦzT ͟vZ^R,I_<GjhhѠytiSTTNޟE/i d1/d<O;-%Ӆgð!:<Frƴ)ûoB|T3,]OuMGUQ$I9+VeƦMoΜ9v n$#/av>A/RrPpU84ForX$6B*<`=U,C`h;:.Ծe 9lvz7ߺ.-TKhpEz?vw4/u`iΠ5WNn^Uqn222cxowٛ q[oyc>#:vKgQ$ tZJ)ӹڛkoEߺ^j{]Q/JE./:YdKsS;GK EYq= ߭e^Ŋ˿h=A{Vţ*99)xNWSSq>`מ4[Y4\z7@Up$.bH~mm-Μ9PQQǏo7}1<~z5sgFs<_\DNBo覔vx)b=\q(~a< uAl6-FIDŒA7ru{aZ9|0N0dsV\wdkhtv?m]ߡ^ҎZ:/&ޖhx`HÞ7EE?;;{b:0BAs7ĉ-1RXנ[p#I`2'+F?M)B/tW7l`N}@ss{0-5TVpF7ft.v5sf⾻VrųpQYUbEU*D68T"## HNXn:{`ǣX~OJ7 *;pX1&)1~pΛJxVU Eqא0d!oیU^tP.JG5H3m1:۾}! @p:]y"Msr{[nITCo!1Yr]xkSK]Rք`Dq)oT}J-$ ¹LEmm#E%՜d2+Oѵkhh`՚qx<36񐓓C};h0~ $v.l3wpy2yǔ[}zZ<LyZ k;7x!4 ܟnA aQQ: ~=Qf!~I0t8v  ^;'PVSt(f~֏iNfd6sogBQ3yu*ʪzdL\LD$AUu4{__n<ᜓYp4{*Ej~+]4Ν+G@މr1 ̟?̝;'O{nRSS3WdڴilڴM61|p[zIX`458'h߶ӎ1NsFhHQiػeO} (J^z/GuϘ>$I{̝5_JVIZzF0t2P$hJ^^(Ώd~2r.hbЊ?:^ȉ bל&zjV^~6z=!# gmm(>s3P)@W9h0%y~F7,@nE͟fÔ;V $e K]ͷ8 kNuzRRb{upEO!6_x:vv:t=+3 ݹXt:fΜɒ%K:(L&.\^gڵX,K.\HEE۶mY7h Fv{b 1˟]+gw@uccAbLBiگn7 {wQvmfx:Ǝ\bDFINn!Dסp&vPUvQ_1~֚rQ|dXRHhCSg,CJibQ*۠%"_$:fpw*hHO[9I0{zM&~ǹхVQ-<^e q|K~~Y?Q1( {\0uv_(-$QK?P9E<7xO8[3ZŦ-SQR3U- /$1~x.? :dl6~mNJ||<;v젪ʷ~ܹ>:v}N1=$!>{n_|ªGA P,M 7.< Q\Q.ƠP6JM$HRSX|?t- ֕g*aaƀf,*Zt[&Wx+W~HlBb{ë\dh}J64 H O@ ܻv,56EZyT[UakDzz], q~.WUU^i7m0{?ShlwaBrJPo6j գ yFJWpPZVKye&b{Y*:Yczq{>t;{sq~,=Hw 3}iQQQ\so]x+Wb0e׮]>%IsϥuDֆʰay0N_n<75?8.NUdI:ث1a6CCܹ!EE3ί,1g(u|ECC#8 z6q" =zE_ӱ1ώaDtlCQEݽ0,_3 h`\[f.X' 9D@ƸCEaS-6"bЇs ?ƞ, gW{~/s:׷kP^ocNX)i_2sbM/h}yXb2v{u21hl9y/+멬4*{׾nS!)7\ӵ3ƌûۮN-,_͚5kFǍѣ&77ӦMkw#SUw%!鄓EUm(t_cr3"s9b ihhЖ06оUb3ՆW`ڜ*e(ˣ?^^{/^-_[>z\d:F?-`@hϨ̟;]löm|z^s5TWW+<%\Bdd$'N+ΤI(..fօ3zvƱǣing6t歇}(sbHf0$1a6c/q~ jhh=af#3EQYQ򨩩iq%$G)Z;Qޓ2ߍ5+{9G;D S;2cH~]e iH, 'Dz ;NE @bILfD3CDTT)Q6@nyxHj QҺN7MJMǏYWh!~fݗh:;:SCbBk>uo4쩣eODjLݝwC"\ŸqVح({Kj)}(`4bFNcOv妶njh1|'S]uc9](**%*,<~3ν~ƙaY&<6+tw>=%Z[:=湙ӾNޤ}1p#ܶP(W4apd >OW2([?$z$?8bs¦c"?yp$N+*;>xɃ@ImeKBQ34m 9ێ(* Ix^g^ߗݟpi46~8]M3bH*G &_wuM< ;wK(RSbsßk)QPU{2}t iĘ1cGa3g9cǒg} 7a̘1ݻ3s̖uiii$%%QPPвnw&O'$cNNYWU:< .'A[\MkZ[E5Nwҿ&O㧿+3/nnWl뉋`]Fj3o8͇*اOu, 6:[g^~KKZDd4wd~du'ۻ9}$_^9fG_y_=e]dѣdgg7of]vt1bDޗ޿aoh:8p `}-<0kۏOS! /U:>^?]q^{5#444z?=X[u:,>1>x ) NQWݑ ZJ{a<Қ"JN0]`ula9B 1tl.ar$IHUG ǒ/؜( #?px!ŵ*yK_sEb %iOXذ#I^SHCԔX `yw>n]$FMWKdsK~"?К#?(B1rܯ:]̤ uN<Ɇ -3vmF>#os(;<\.k֬ݺ#F`Φ>J8W"ߎ :[鴍_(QU}x/჏a^g3p8=Je8fDBa'<"òZ]U&BBdsTmp[E$ RڜW?7V0*:!2WT+$@8~3yK]"$qh.QfxZ ֦9{/a>]=qwpʨV~{ /pNf끇/|4"NU!Isg IsAa%vaC܌EQpնF,I𶋘5edgi?fQ<ݬC hh;s.9Cc;uk:~tq9arrrm]w݅h>`ǎ>Ǜ?>]?sL s`DF;lս ͇(>4ٜ<5$C}vw#3@PcǎP]]H?IS[J ~m6nH@*^ɭNvQϼp﫰!@w}kq {OBM7.(dMGWЋ,v4Jh&!)Yiæq:NƧ X6~f`M mp+p{";`a"^Z O.ku:ϼRsb4@?n>6'搨ݟdQ7(o27ufwn\™cIJF$nY{qĄ(υͭ1;É'm]w݅lߴiƎ}Ǹq-7Lsl*dba#^}Qxï9}qF PWٱD$N5ipI$ c*ޗGd#z? PUwRU*O m }͸9y, UA-sgfySu7Fhzz: ?'&&2tPXjϹ?XsMeTUwz:RZV|+4QuIjQ|LCC6 iPUB [2a9+ytg:G%ܛ*R%D*b&cr9SP icEƠA6G E"&37 HTVh_ ATVVbF.&n<2tiu7:DG#!5*"V'D?m^ƿ#7e͈N}E9Wll9Edv|(A8։f@auIQ[ V5:!Y#o6-+d b&X2\ ,) & f/ԫ3yοo|݅vyp8]nt(*E(*edN'afڔ,?nf798.˜<14޿ޖ^EBrM߈^'se?*CH?Y/wuWEe5 J}J!"LCcǣ8bw^6%BGUU***xkHOoTr]w /oEBߏdZbb"zUh~ҩ?d0>z*1!pU6QvWNa†2s3锝WCLG$$YUP__ѣG[:ȲČ77ta7{w.0Ǥn<6 c$a:MAlvn$3RE%[t:! t,7(?< |nְ#*PgΛ/``09|Dzq샷pJp@uFţ}p [h$k8Ν\xuD@=^sMQIh(t{ػ?>30BuHuM*C'1(=@T7hl2'2nkvUʷ:[†5ݴwa4Z픔p,GLTP^Qף1<ۿ}>*,BGUUJKKy뭷HIiXLII;gW^[nayn7kg:""oîٱ;+IfSDdwm?bkE]3̞1~TJ8C\?v5+^KDq<ijDFQ<$Y$xt8D;`w{`VNO{8 OFy( Սp";5^;;uuE DI! YX%s8w{m2b;NiC`d upD St: Fc&NknbeWh&ÛW;3<:^zyGe$& -d)R߄^c֌!IFN̮/).!7gѠWKjRl7(%;?;?#y%j af#'DGHQiǔ2heTTYϫ_`ꫯru׵HII?_y{̮]m۶(pdfYxoMott4XWR|fs}HRb4KObySHNZ{ihNn[ߞ'==W=S GeYSYV*%uˆ7ute%v]~0L.1aB)_E}cE]~(%a1+W40vߖIɭ g16kQl%FBF7Qf%"^dl9&J1 I:xRҘ91W\Ĥ5e) ǻ\6m9LIi w||&Mw_m>!2̌`b1̟;CġÅ-r[ƍ/BLT`t~oH%@UU*zeWΤΛlѬh*\}dffCv؁@] |߿P$SHsm: NVRZVbE c%IbS+ <,*:UUeEQtx<dYnފ9nKjx͍ZDZ⼩ zVG44z( TUU3:&NA (&8e ȱ*/IMuhdюV<eLjP/o.Aqo#D_^8;ۜ>$I"k̸ڰTUkS#O> [-K_ mΐ"ᢤen<йCJz/}AC Zi)Wc/q%sY).e( C364띺 ,?o*1!eר*؝o4E]n9E|v^Gtd3'e0:3GZR$PWF^'sU ]|j7.cԨQ-$$$bŊϑϧ~JaaOM`tr>5v:ƺ/qK[iw / $IȲ^'::xӉ%!!(∉!,,0G oNnSZZJaa!8qZx<ݎ8*Jm]1X.\>YCGC#Ht (**e^3ẕ;H ^y_-q9=  Dt5bmHXsHE5B%0lp#3TȈÓ -B( =^ !0DD$Ibɡ9iJޑlؼ3< B1 KvQ+<}sկPS_@JnqYSf^j0,Y<1$GlG%_rnumU3bh.r}1^h36}1^}# g^Ű;G"7Xih^x]8" MUUxw袋4{tNUVsH;]|o/RƵ$IzˆaС33f0n8 B||FQ&M |Sd`,}Ҋ!-FXtPr1|}||DxL $ݨFo<,CߧjaPw5a(%a|dm!K(:MeZ3:2m M[rE 5MWy znUmLIz7m֭'}] E6B 1%uB\ 0egn[?=ʾ_ z۱iKV^sj)}{x<<. EQp8Hn$ȲhDc4[mF׭['jOG׳fL6T+ks)SOw6l:Daa%Nf!1?\`s8g]TV͋㍏7Ski (WF_m;Ѽ/ⳝcjn_I&]L\l/%簾&>, .D?&Ν;ٰauuu3j?Ķ[gXyM߰zkz}^gDڿDBBɌ1 &0ydFŠA0c,Gѣgǎ[7rѯ@8n~Ò2)4554T|_lt8:t yO !}$Dž*wK gNU7BI?RD EvƔ-ip9F8V:aa!x!̂e`G+&{K%ı3YS;o1qxh/#mQZ(-#AgvЋ`7y'ٵ+и4 gCf*_|R:qh (Plhh߿jv;t:QkגΤIϧgPUsZ2n^o4,+}\bzYV^ǶG7{ؗ(铲14[?t2 bPqYG8WQUױt2ID_JK3fn:JKKYreNaa[ =W\2<[K/c-"Idff2eٷoIII!,, iPҥKYt)VoꫯRQQpF~ NiFO@BQv郇Nf(PddiL5^Z]Zm;q+j[Zv'ɵ0/Kd eaX P\+t*3 1&\%D^/:f8>?ԚS4lh#f7o`[rl hf\4YMX0:J OG'3ˆ;S{[PPPb!<<2339r$QQ6- k֬lMMM;v\L&}ٜ|f7EU5"[V\WT;'$‡}5nK.Om]#'E&#WC]}gΗZzuUU9QTGkwpy3Iot}2}H$Ib9HMhnIAt:ٷo\p="krrrZWry热FzPݻ??폘NzNtxy6lwٻgΜ9̙3_Us>{w_SFъ ǩlWTT$?L=TBk>9󉎍L*sLjL"7ioT<|`|sۿ(`hjNVQt `K= $Gsp( mp&W1T#8?7Wp{p5GO%I"//m۶ˌ3Xh,W_yfDˤ$bq8fdY (?x[\,[:}sK_Ue!NAG8 Jf^RU@CC{6=%Hųlّݻo^TUecӍ/rUWqS\\쳍ǣkOyÀBg;o@'OdzLa̽/á ѨDcXC1aIJO_',Jo#"s`ńV: ͂vo5UDr`p>(.8<MX^L5C+`lZD[6H:{Wׇ訪$;אG݅U9 ߚ G=ǘT&/&N+]|]}3~WQ1@FI!"ZUtvfݺu:t /۶؈Yl4bI#K 8d0DDD`ZD!³/}Rn:w|**-M.X6 }~5$qE6PRZNN$Rbyp28W1&1*(f˲lv&C@HL[`X~o p"+%{N&"Lc]Zs'1yuz0n}QRRNIIaذalذ/:Yb7o67oSVrP!S~+ϸ" ޢe:|M]]Gm)鍌_q  ժkqJ<Js !Zņ:m5USmDxu0k`(V>_d gq"Z'k0WLsI] rdՉdMz\US[| ݹs"/FhS\&pۭL{ȺSm^ȋej=&mRQ4)?1c`2x<~.9m7x5Ķ(#" N&4f<ghb"zUUdȑdffl+fln~>e @DU᫭qܤ1e^ΦYt >[]n(2{ dEPƿ>&KÈ?O~BԤ9޸˫kA yXbﵷ*2(:;6=NI.epYæcoa`28֌` ?c~pF߬v~U%̭`GB/$u4yy%h 6z\ɰLe*pL*vȴiӘ3gիWsr4rϟ)PHUu=G$EDžUQ.vՁҦ/(mtzL%8y2gOf`+<p]NJ+jn|jL&/̴)yͬr69&1$'p x"i)qHs L|~\LgI>|8=_~ym3g._CMrr2/"]wׯx֬C?wL?RCc!O\.45 IH6e?;+ZkhA# Ibk6D9<{.&RoE}'ajRQ'R_K}TAW Bb8QVЖ:x{Yi˦YFF0zON@;)2! dN]$e|6WnYQ>5wjNGD6@le=eЧ<#ŎL]qν Ύ t  R~osiA)U*(R[TFW2BJ  X .<Nd0}vN'ӧO+$##7mPUUϋ/}$&9'ihƢ{}<ŗ_O(w0F]x˯!|1 !)t﷿ࢥӱ4X9Q_ >1!_X⣸,^0_0d&1upFL'C[d;o]FFFoBG$Ibe "DE-b:%O~HɓzKr.xTJ\59R:<ئ֖s}O2rZǣc'Tٜ/`U.,$0 wV`79a @v%jQP(..ݻwspBLAAov_#D߾\fL1ܝ V}fds'wqa9IH2Y1Wt깍q. D[Ϡx{ƽFGd:dInl}^'3a|&nwfrBm0X0w,k 2_#Fؒ>ǏG??>/aӖ\rf?NCc!_RPP@IIIɹ>i7ڿFu QU& 獃åp:VIOq"/u @Qn\^ 2agBCRb>cK6ᓺ1CUŮwpϗ8m =3% l zXRXA5k yFp{(*o4&_"Ze~Xl™ԍRUU(:K4Cg.GLCߠr',7zlwL0kY- J0]2Lh(H *Q*S(osW3j(~zmK;^}.ǥ",l`v=-EQTLe}x0r>^JjٶhP1h"zrn~S.z -g62y._',K a,܄?[Mn^im$IbΜ9&++GcJOOoI=(((D|ֻ\>]E kosĉǿlb~FO92vGlbA6"y0"m ?<AkchL$)̈˦ UNadAC%^dNudͽ(r9vjzl"D/uz2 $VT{ ad"X ԕgգ1_2{1X7v\r.. DVF0~=$GK0W] ?.]̙3 IOOg͚5-mQUo7S]/'}.-AǤ Cz} EU~y!]]ͯ8YT!1+"aŵa]bIlW%4Y~U1U7ooG*t$++?iӟO>&ɢ*v>Βsmq(y'77E`3»p}he"yT UEE Hm.,j?= mC$ұ ӇDC/zwVUؑaId{z Ǝ7Ȏ˫ $CJ,M!%DcE61JwpRTnO|=-ރPk-=G:,lzT朻9jng%)`pC$ yoa>'8~7xߟvÇ \!ýzHEU#|eF(~'lٲLfϞ͵^ի\q}9M'*q=D$*}X1:Yb!]Ο[DNo rN76cтqF?ANN6\:Y/gηAK8=jA,3W3n7999X,TUEu %}HD܋+iUT9L5F oi"R'ˢ@A Bow!o[vyC!WL;GƖc>:QuU8:o$!%9s$q jhL=dDAQE[/0(3ݹc'eul.BVx۪*{x,-K& v='ðPUZuIgJ0Vg6 Tf+"Sv@o @&1<}Tp*vRVV_Lff&ׯo,EUE{+X8r^>(*aaƐv~6A"!Iœ9%rM]Wq z&O֫s*k[nc2xַaÆ?}ȑ#1 ~ۈv@';TUd(B^^|DqgӾ7 i r.uy6VQ)Mީvh`J&ĆZ5b =V .~ߛt"4 Bݒ}q)dN]sURx#Y˜K $^E'tRLCS({]<?sLFr!^#1mL[Rj~-:Et..1AAj>yGt+6ǴS@N1|ׄwGNõmCN_x` GEH:l oz?\0FX#:ݪKQ>[n?ѣDkj_˘Q ^xF}?E픶-j!.!?;aDž\2\uU/.6#B2>NY^A /^Ldd$ώz .hV}44aaFdYFQZ'h$bZ8%K?C7[q;m-8,X-ԕg[̾H$LXt1C<~` ksd[8i*| %t]"_6]"-݊p+i5g 5Ey/N7|vP_?G1 %uP!OH5䁝xrF}JA z>I-<" eƉ^_8ˣʽ'% ChLx+ N&1r":WDv9ys+#5I7^Na^?uāTK3ةa8r|W/: #dxLxڣvSSS[oM7_϶mظq# >ъҲ~+~HLhc;q{^1N<唧lpEuv/B%Zoj[y_s4s,?`2iu]1~xL—_~Ne<e46ڈyNTdOƥ}&//ʼnoc폑9>=oq;99lJtF3$coEq9q;lx\"YU}ފ;@*d \はQdxt^c17cWniԘL&=\d7>FE]u8ÉGd,455qȑzS3c\g/Jͻ?OCّXNPSCuaKWrX@lͿvbo/^+ Iby7fiC]s3c $Z`$!75W,NQ` J1PgQ$ֳ"JCM~י&3rKaz~."@ lã,{ƿ1#!}c\p<~ Ztƃ,O}oieF E2jTNE~<"/faFbC*U8(b[+B<^%U6Dbb"x<y:t(,Jcc#uuuo#t0@SF" Aɢ*bNqǃ0#zVVuUb:unŖ2'11 UO?vZb6/O. Exx# 3f`0^F#.]ɐ& @Ц FK'8>ҭC72v ̺ggTo^9_!"} '~ڀ1|`gdͽ]>IMaNB1ˮeuu8nIOvs^l  :\_Q;O#!+Y޽s Fa!x]>\7෈͡@Aˉp&o 4CM>>@-, {Nѹ0`3& _j M5ӄA6QH\Z<=P(0j1oml zP%pJTU^qϜVUT СΣ*|WTFJR, 9Y\qIJ`)oyu]D'!β8;QN'3CBQT}e :|;{ァptX3fHDddd;'u_cBCL"** ݆IDAT@C.UUC"^v"jϖcBPn H(.#L~=Nֺ 2NTp$b:I7 &czq =oׇb"HbqzwPvxl]$3xN/a) n\8Ʃ]|)-h,kUDSPTTTZ蝉߷8.N%"̞}y(AtY[;QQa]6(- ylvc8R^{;EQY~//vƍg%!wY";:]ϜZn;8DffO4SƙNd0߲Pű4蔁[ NV?m޸1[?/I$!2zN~Y&x8G85$ W#*_%廋[o HvKiK¯.PE~<"s.WWG>݅>ZE}Eh旡}`9#aT# DNbnf7d*"gD!IIBM•aYGG&QGEqstӻlCx:zƛw*{~GN7uu݋$qSZVKYy-i3T"͇NiCYʎ]|uˉ>"'y A$ILɅ˧B~ = ~]xSSSyꩧ3o=M;\.2Æ c5Rgi"" 3 Yf(7ՑӢ+`gN虽>vR[t=a X,\.Wo41DDD`2hjj Ӊt:bbbĉqo9$Lm+N?&M]tb"WN1ptqP#9[G|VԗyB̡5/XI6DZ)-('zx2vmGhWy-(LCS?cEL;49NW]v]^_bӳq;4z~ҥ455ap:l6\.˅raۅ :]saůQbֻ-2:^Ga4[y0IRU[0o,-pO[|:k 5} ===UC$]qGÆòDGs ፨'(JJ+ˍd 3#A3Q {[4#""x8ܾs:gtiA Y4iᢤZ]ًlhuK(m6n4#}ɚ{q_X*sWt3l0bbbPUe <eeeaZ[/f3Ç'--N2jzD%e0il|x!_$$ Z ͆!Nޞ/ 6v>>b\uxm *n?.3UUdHh:T4Vsl~8bhYj0"DEf݅QϠ_ev柈d,_lBвjb4GQ C;#_׷8瓎ݻwSPPaJiקs_l.p|aԈtj!.Q`64pge e%[Aڷ$ HuMutoa:7D].>5)*nb0dLF.թ?ѻo1[x7馛 X0bL&S;Xn g<ptx<<Oq@:DSSx ;&]^7ԐE z$%%$nr(**,2vX"#sLW75s4qCEօ6 ܾ}'BEP[vQ/m~CT&^*Zu |\&)az{~9F\upWc?^HT֖ 4p"a)]!K_4 cjܩT_15\JGcOV_֗&qisPbC%1q`DϜN%I@ 9)%'jNcάޫ^z,|g3˖N!%.6Rٵ7U[E{ϓ~ǯzc2+GQ:TU:G1y0ńBtnw}lz:㣘0.)aA_%gMfs,\uU?o%}~$p``ܸqжMJn^Y54N'dIm 9rv ooOCk^Q{o,IZ" "...=vSVVɓ' Uiiideeoupp 9* oaÉZH*/Uϯ׷'b"H|^@[)GF‰*xb-\?f\Уc6ƌDy/aͥNFFĤ~8)~}*)pڀ䞍=xNn|G: #Z?v_>'?inW/?y >g2AYrHPoq\>qb"^u|6n>ô)12 ` bb"ر+ {Jz&d<_UYᣧwe:Ok4S j;q<dQ5k%6&Q#3*3\_p0Š/)PIA$.]OJB@P*H?f'hNaګM.c^wBךSхOwPS45P#"z1Sx>p(P^aa79"# HTƏL$|CWsXȡ-{ѵI3g)))!9f0QSSs:G[13{lV^ΰoRRVˈᩧjfa̿:m!sĤ 4g;>~;`[+2aaa$%%ޒFnn.;hFRRR6lfsϴlTŃGs&1byVHU="({R%qoZs|AG+_ ! 8"%8A > lfqd>|=Z܋Y"Y9WPdQF 5p:=Ygl2tbtNt&vTJ sVig3t2 Жmjx uw`9);w2{[>5^*Nn^)3b Maʤa|FWM'xAw?L̂=."'%|4M/ҔOS}PUEQٝN*ٳ??NXAiJc dkI={6?<#G|hj:skE-Dʭdԩv-Irq֢(j2jjjv 8icfh}GE^vWcTUtDFFFJJ &SCV"JKK[HDll,YYYuZUiyXc09eu -6X{n'E $6&!aA}|#C(|u<5 aGt(#߉U v:d㷐|A$z߅4ͣ|K4Y߾oVPaĭ#;EFjћuDFMdR:ܣRʰiUzW֏nWK>B"(TxK#Q_`0 ٯ^76r+z}/ÖoOc4ҹ<\HEI¿>@/I{2z~Ӗ&gCԔ4E'65*NӍb%HCX0JKo w#Pv,\|<#Lxjax<g[Jȑ#jQ$(*'N054zo@sZ`HΌ̨EWj}}cGw|wSwHiN$$G=8;rCz]Zi]jVdɶ>/*3ߙ>y>Ƅ,dffRVVF~~-~?-?}tf͚ ̵Pz3Sx^ʌSîxr?QB{fi_ DzYW#;OKyma?o̦lʾqjLEܻjcleU_{Şb+ڎ[.w^9[hǏɍ͋/W ]Qw .+d80%*si!CWbJǞziL&30M8+zRD ڭ귯cw kV9,M>0>^]m}ͤxpHwu:gaXlDʢ#|Wh|h>zUdub# ̟?oikkθI0,]t%qaL5*;}tV;Z)M,,_R=uD3l<~#ۘt'SH/>9>O?H0cz>}r=} *g{rAkg_7F(pUi$5B]t<[4IR6%x(H2֊X+Spӽ;މ{5:[~4}D,0w˲ڵkyG?>cmGEn $NBv^^ϧ:f'>9S}dS8`͡4jzzzbyr>PComnJDnn.eeeUwٙ0)2̙3cdNf(?J^{pa^0 +ErKˤ_&{gkeVV1>K k%sn9%|= 빟Qj%|@Sj76t^)^ Xe7ݵ}#7kӇOWmӗ[(FkX$ܮ/@ cAq*pH+0>< x#L;$ X'! 9KW߶O\tS3 m Y{iQ>+ޣ{hn%|?h]`,ZXb-K5w|(..Mk8FPg ߋθ3-**g?,{9(deeQ^^NAAA v"A ## G:)2$NB),s0`gwUwUIѾ!X+K;(2ѺGkok49BmC$v!2֌ LA?<3Wn8 ?dBEtOf(S>Bm:|)@t>ol7iɿ+9۞ZVɽ{m(#Ei>Ao?fcS0eda躞9+sb{ÜR+=9Y8ꈄ*{f)dM|LrO/.R^hSaMw;`va2dgM@iI. MYŴ@~^&_k]ʋ젡3eK@4tM}`+'YJ?\|8SQՊ(vmde\nܸ1&ƼyF98~8'lHǶl锔 ;y|5'ci4)&p-H8rH(`P}#*z >|;Ycّ{i6I@ÇCEfϞ=H`2R躖Г| i=->/]_<8.LY*!-G u#eXn$!3}y)zPAɽn oAŲt]fB~&T+HU3l6Al? B3WQt]T:=:$c6Ir%]uzTB  Cx}B!7@  DPMBH$Kd DGgZΈdB4"n7#f_}DiriJoG|nt]CE, QAU#z^#$a2fq:$ ffΜIYY٘H3^!{ 'v9nyZz`b`Z!B=fܓRkwn-ٗ/K;XUIt郘 yw}s)68V"/i<]Q=NmL.J{[jHioxt*$i麎:iF2 m̈E)%@W52EʰtHySN#"?̵$I tcccc$)3a?+2(F{G (B(B4BP\FxU p 33gpm_Ĝ٥>Ⱦ'wyS~: 6Oc VTT0؉ 2sΨ8xq:\ve6Sd̹s'M`A| ݳ&զpfb/R{ U4ݘh:,!I"V Y6߂AET U3|&?0 G22{i^B.嫯8uMf/gN|èG'lL<>}%0RYYIvvj5pIׅk=A hn UZ=$%c:.bR16LAۂ9Mqﬦ}`d_Okb?MUzYc2TTo*%d_ )6WzݴH ߱foQEO]pZq×aJ]xQ6D!Bn2 lQzb$E3B*{?h=ܙB޺uk=k4ݛ0Rmkv ]a cDV֯7?ndË%CAz~Pg Μ3. v~A`#kll={VY&NC$ é@{d< ^y} Oʡc S ή#\ߩߋ3DQ_%u#`s? NfiDpibu{zP~L3WL~<zϻW1O%LY,h OC-"-im'yd Gh6.mLǝޣ*ni#{_ݙ &yJ@542:{>-\$ѨU}lvuwƱZ5{ȯdHvK!@s^&-Cqvn+,#:)84 O0].5ѿD;gzel 飸(nlV3y+L9]Upĉ|ZWr!_2tttv'a +AOټy3-PSd0(2,'Ÿ;o g'=6KWg#6$;/KL5oŽ&rnٗ-Mk[[B /\W6ES-78'۟js(4yi6@` g<=_|XvI:4YYY|d7AbY;nB=x:8$sWϥ8=&;wע(܃4_7Rt-'kj|(¨8;;;&ǘAn^xsrM7j'wK_?xfPLa!L|Hs&s&Ov4G*Q\\|~v܉,˔0G ՚R <Ӧ09]82Vkljm{PO$$'tMG3DC~?J(@MS BHWWMWW>!"@#E1m0$22 `%Dq*nb12o4YYɼiقMZ[ͼNS~a|\:*}4D !"DO:/tQUUţ>ʇ~H{{;o|faRBE`vvvpY]45w3cz x g%PeVVVă^eV+Պ,˨J(UEQPUEQ"jvx_h^xg5 &DQ@,^VI)j PUU^/z~p MU퐧09y|0PO?}@+;C*%c"<:AwF7=ux{VYdڐ⨓hY&|{_}Oۣ1>@M瑳~j uwA-Xz8w ^ke騶N>\[ LH w^9 G(t&&>:J]w|_[ D*:m .[JoIʉ4Y!gggT>|I?Nǃ(C,e.z "$a6e9j2"\SO|1dDQ@o>(ͰNrdXTmB戀]Ʀ}9+2ϛOC}CGRz:ZJYGNS!A( ===#\=8HxꩧQUL.0=}}}{1A}}}}R?͛7 tuسT` '/YfQ\|-&mkaw~6 1 Dw]שgXVFO; 'N"OX`8@<¨o](!&i]Aڀ ( lrj U4Ř[+Af GJrZpȻ~ 42]u).Lk;YƵ`ԜaDs\S iO7~<~B=[UsdMa2qd (G{Jq >` h1#!PnN9svgܺMw4L:mɌ L&rrrwvvrرCM8wXL)tOz̜\FD.8w>3 %@7TȻv{eRF6rFAb7TW/NFNN(&Bro=:;cƟI[{%i<ŭ:sJov68 ׮v)(Y?y}of)'NM3*KlE Q& d2E::w}m &- p,HZF-h61ѷ04UCgf!AE#UpwvbϵR0'YX2ҿgqdT mLX-r\Fے` gO_;n]K06G OpspPV02sⷫlٲeD(**J:nii5{=R:IEx5k<. uo/.p=}JVɵ^7DQBR5-6HfP躎Z4%7&zꏠbYfل}IE h73N[/oĖ6n7IQco6]?Jr-"e:v|}wJǐsx7lkD(Hَ1Pl؂ba)+$ڑz{#͢]sQd!  '.\ǫm]{l+%08k# $D%LiBkƟO4 uCU5]x<~zn\n^o`,vBN +;|K[Yڌ T誂6N|s nњ~k-kƸCp\df_*++n',wuu.56mO{{/]˻~? (( /ijJ[XXK]:HWTM-ֶq'=n@UQQU 4Q"# ل$IIq.˖VdQ3cN|@ eO{l$r SYC>xw2j޷mVzd֊>dR^__ѣGYfMZXx1ӧOOp:lڴi\;w.=G> |G`0:.{~:!VEnfΜIAAqe0bHS#<|蘬λT^pD--C=-PP(D f;yl6dF{$N)MZ|nڎ)7gb.Mlyq`$8VV"ZmpsbK+>'¢4"S5u<-[sSkɺx1KMU8/Ko8F\E°(pl?4v&}_ɻy~ ݇ p( >TU>hm{% 0d"eX3ROuP0!ˑ2 6wǭiȶ@@i>x{Qs?1%2^{je1lV3EX6VeVE #\>?]tvOk[/}:ݸ=~TUCtfDflyge'7Avl6݂$f]㱧ޥ#iCi)#+mKm!}~7|sD <=\93<]w5~&y'x<חi /7:{n'###nEU >=)CD : &pa.dfUdխ_补 1Jp8wt}4`0x(oGGGJNi<\.BN}vE,I$iCV}c:ǜ ) %O.en:/mkC$3;wrwv1tu6%}I80B_)%cu rfdEWf82|v>9{imKfl+m0XZ0nyy:Q@"#q7@Ww?ǪٱUM8qMjm䅗S^V,LP1A^nd46v&*k=Jd $"J"6L^n&%9TQ^VȢ3|=m۶E(qu=>cޢoXēk۬s#ϻ;yu]gӦMܹkצT8ts{Ix.ΝC=q&c8_Ç}abŊeC!j2q)L! xDMM ݽFK(Q .Hc!jF2&Y%Gm'jZ/ݨ j w/~񋑞^Eww|V&XN/!ahAiMMM4*˿ƚyz,v$Sb,+c+0 z yޥ` vKhCzIı2}oE?˹Xg~ՐF.<]Yq ez'\S4ZQh#gF<{npş?~@5nY)t<w]yv3vz_MY`5_ Q}[uی}ib)/B[] 5'}_[ȿut,3L!j 0G1k;V}^i[ uq V+%%%Zj܄t@_{wȻdrV6kg!.'x5kL\.o7pC.V+_җؿDu~p8::<_G=ᯩ`֭ l6r7j+NgʇQb,Z(OYLK8)$tϷNס@fQW}QK*&zh#ux%oA"hioMalHr)N ~C=󂀵 u{cokfg奫qR~=~-h; ZwQ`CN`[0̵ ~nsdWB-~!~~t{ gRw#I5vF{.JB׵d @h`0,鲯XNƚX+OuƸhXfu4dDfwg{^Ί"C==+tr P]&863g +*}oH[L ޾ SĤb!v2uu 8@YvUEPtU i*WTB_QQ4=-э@Pa˶c৯aҊa?~"4XA%8aR8 S$b$l80 iTMC ZNjix^hiiFtM|o?GǾ@W"Z}J,3f=7xFv puqWaÆc;999|i({ٲeKR*771?]Gs}EA{채Snn'` 5mD2n7U53K>.8wO"x{{8+vXu=f1\KPClC{Nܝ.4 m>'b"rBJ@54Bkdo2$m:Pog_wg$K_ A(w=/SpC 폽I`&]K׳6 {_=j-Q~V)} }uxѽa ͌mLo>¿KYшUC]/y%TȽ~Mڎ L:bmr眅eUZ~w+{:#AV[4E?$ԕ * G^ Y+x`2 ]7ٹ&P_"KX$ LL lYB,4V>E hzs:u/_( 'W秿xn$d͔dȷY ID(bN !MCtF@U!W0'hC2?ZZZZ{0Fʋ)/a9+ _w47gy~1U.z|~̙3؏p8wd& O|"c?O~)#-++{999e.ov9EU+fc>S|':>y +Bsn /mL|xzZzwEp.^J hlae`gašٖٖ%#ӏ;WEcm;'jJLf4yURQr>wmB vY>L՞z % n5/iPU^nG{Y$,ɔ|nuR̥yŽ=TO3)yn7AD]8eOryۊ J8 0캺|W]K#{j >v1Crv _Urdw%h3d9Ji\Pa\- )af+s~9+Nfg & 1aɅGChmM$Q&d[,ڭdM U|CY$DiPύ'&tZzo$w? feeIEk?cT,u@4?>? uW\qڵ+y[&c{ɹz >r?9Dk$n(ēO>ɝw_Xn555<1Z˗/6_կ~n>'w}ر#i[VV?̬YRnL$If_:+W,s:G?k-\vS=3 ,(O5@Q=(YX}WSJ݋Ջ}E{PFp.@4ME@@nv ؅ gFAAALoB:bl6#bdg&JO q]n!ĎCE͇%ֻP# וfQn;vS }2 Wt +,0x OC/r':c _7G֬<*Ͽ|?0]Q 4tkt>3ȿu-:45Wv@++ $R4?Vo &\1C]Ǟ-|DP;dOK^}Zqlpݜ{?b%qaB[_e*r2)[1I)3EŅ{|rTu8zW'4n[o-ێ%a8\04gG 0"V V }.u|c׮]<,_?Gvz:|IIד\zP±cկ~wZE?͏c.~p-z(|򓟤LPwmƷm,Y0ؾ};gٷo_҉]AA?ljM{+Iz+w_ޣ*?ؼysgNe1NeЦi555tu!"3W\b]'sܽN|N-(v<=m(A?J*蚖4O==0CKTTe |FFK.{s2M$I)GUhi)zl܀%n},2V&?8SV&T* !ʅqE*ElaS[4XvOK] gq?uTUネjrrb>硹5:^Vc7ڜY̬ vvq銙4Bee%v---l޼*$4MtnrnՎ6$ yǹYn]+_ /2{3 Ǐ_jկ~~~_%}>>,~!'{;w.$:/2_רN dff~;NE]wy7 9n\}SpC TN EDwajIASADTt]CWU'ar9yUU B 2,'u< )=B/> Kxn~@c(V `_8)]?H&N4A0HiV.fٕ̟7bOUvv:;OBdhٻhJkZ#&mY9y gK-sWhs3?fƲKoh9%0$h{UDի FǀNk۱8whV3ל3ۖ,2myf_C`~ D( (qbHD!aB(],\T?B? 둾3wxdO΅^h _HHAy3^V7ˍ H֕$ti&bH&d _v$Fw+¿OQs8BdMX% )IS찲#]Θ$@skG5%ڝI[0t] ;3dذ=ZUN/g0TVV""3fn;vp!NgB꤮ȡq[[w6.G?pp8~@VV@4Z[[/z)JJc=FWWWgp8|k_s)Ek#ĴJ444OO}FDnn s+ʡN ǟک:X]"sx]މ J Lvn|1M FϏN%dYNT>jDos ņ$dd:edBM躎ّ5Egz-7Kb;7BsNJٱvziցk?8 m0|IxLAa!s,ƽpg᳍<9ס/.GL@{g?vgZ^{ JS>۰¿0IFR ptB}t>wwL_rmGÚejoc|g' Q(YG\$ZZZO?m0ZRL0v_קa(%(\ve?g}}}|_fϞ= ?WYYʍ׭pfN(Jߴ 7t:F=233Yz ~4MKZo:65`ӓj:(躎7wBj'| ]8sFY p2j=xn${[{Ⱦd η&__<QdcEmj=Idq3V2D1N;),2CmG$*A$1ف)@tTHU$IQ4DA@dQ@@$ $DIТ5]o-EJP)ʹ3+'3YKl;ݵX2(b6JD, % bDt 7OHRhx!b( 4p\G4]Gآ-#lY& M|,8ڰ5S Akg׮]ڵ޴EEW^y#},~}i& ^{-/1<,Y~ڵ+QKoFcLQ`-Z~IEQя~/00{֓=Z)L! ?i{>G S-[6.BFώF^^^B6Ya'-A6!0TQE A1Yٖ &:4$5fllQxZiĹ6۱/ 5C# o?>TTW߅>@ }SA^BUbgC{AG'z{tB !# K`2V#d[Ҳ:% 5֣q?{g {Wwu#D(1Po;i4nXm}8l?Δc3H'p\M&HUioo3f]^&Ĵe,C2fd2dixIwy@Mȑ#q|[bp /C#t:GEz*BX$ꪘ_4}Q~_$7e>ry,]|)L@GQǕ 8r.iѿ?l6V\9.?מ1 O 4$.#}i.WEvQ/|c84o\ si^P@cl0?tޞ(Pn QD20-؋Ȝ^(x:zo F(~^{~uܚ"sBf|/Y?V\븶9'J{q~߰2λ럐؅PU aK-s`a <2ϟ?DFOP/U=g@f ȞHJH fk !.cYT@ 8c̽裣~<!_tE((;HBvA8@ΜNE3-E5H·";@~-Ed첌$08L&,$iz|:((SZ\~]}!MCp07긍h~$6J2ح1X& Cwww\*Qr+ZG0d޽,X~/+W_㴷:|[bƍ'?a֬Y.l۶-".DQJi*'bL /ۿ%<(p%K !ۚҁi )ީiUUUt$, ϥLL#)?ECo'*D 솭e _I2IZ_MIU`>ܼ|-]2n?ķ9L&$I0¸!|}F:f;( hu|}5|tE}9NUՏz.J'-Wp,h d;y|JO0GgS0LvkL`UVBɪ[ddA s.wD" PϺcln(=n} oolt/-dO\[%e.^N)dz."fLs|4P T]þN'}faǼG?+oGQ̏c~߱rʈ0m5\/~ mƑ#Gkx H5QLB< Hsss`c)LA ^9Q߀Y@{f-6m[dd%9!]wli@n 6 UT|άSbv/ Lky? L^[֎=G?8kEya%9)>i ԎdѢ!9P1֠k͸ۺa/AZ5  &zWh~?}ՃB' jQ J_q6=\'OWF8*/P`VyAl9l9*6>ޏˇlɞpN6|+,ADLE9%_ɯĹȲȵZȱɲVY*B@5Z BFP+*`W0D /SUBZb⬬,f̘t<qbCELr ?'=BF?H W0+tM$|>^7ҦnQz~`_8n]yk^2A^|E|M=\>裏ӟ^xP(d׮]޽;\ӐH|pl5E$MC=LJ]O[NKy2(kaEB(^CZ ڿH^Q1K;,%SC OqB%#2n,0$KcFW#ۘ$WGäLCˡ͉Q^z RjqmOJNC~Yv6lfSu"] m} 6(_VV7x#i5v@%$5#y뭷hooO|lڴk_nb .,L&SB ]q8nh?Pu]'ކIfpպyES)+ƣ?n@7<MRuwI _\̒NJ6KfKA>}:ys90P8! BUtdh7&`j>:(AЃ~cA]؎mƺf7 9ȡtx9ï|}{6UIɴg.5Ʀz7qtyqE"CN=m;F}h$f"Ȟ ; dۻ ,ZkT}grPieEKs׃ OC/Guޕ!!~fZPsDDrq0"Qo>Ś;^ E6"#fӐ/Zwֳ0a]b\c1͆C_<[(_~F{`aȌ36mw~!N(*|ر VX FO zjTU孷Jץ놂mP !h  ,cax>lfڵ\2{g8A ǺH"fY.XdC9"Ǧ:~H (*UC4BifA 77믿9sK 4j|***xWؿ?UUX~=g7A[[vtF*׉ޓ$i*0Y*F;Bjf™p֬3?q$lr@4jjj5 \ RBgWakWE X`15N%R1t]Ge Lg4'.u`p(FO|kb7^}&#::'Q=4Ua ӓYE|weF?o4 V@Gqm>P=~;{{=X^ꉞ`xi=datp!z dTUK]Q7,3z݇P}qm9Pg_maf'7lRaACOdߚЛgȟ6Cݗ\t"Aʰw466Z-|}‚# l6.".Q' yxٽ{wctST0ba0! qe2***NbK#CVVz+lܸa &<233)--χ墯/!3  ///{g# ɾFqq1ʲY0%˙9ypB;3ֶp B:t,ܒt-A)..f x'JL==7a?20hdo!>Yɠt0m'>z0z4v}YYVhQl]ƿ>@ ]wп0}!Bm`pEk!ӊdL¢|mcŰcw/@;մ$Ȫe8 7>uA%z@OQ;#: SɆtqHIś08{4,f=DC[K/ c,NדU\>>C0ig(2o6rd󳦂)rhԾdGS@>y=%ulBP+J%%̟?WڣȪ14l-_K]3'`TD_`ЭP ێ'm/#N,$(0ݴ¨^]hvFVqn<ĞKZI/}kB/^g]0VA@PI+lBN|I"׮>0D-Y@PdڂR]cٮ&v>;>>0g²,xb,X'ؼy3uuuUUwe֭TVVr9PYYyVUVl2ڨ.<ODW=\ OL$Ió={6ϧYE***g?Kgg'6mø8񺱂A픔rJ-Z4wQ)//8ǎc˖-477]{ٽ>r\vTNksQŎpǡ|D- t@$˔QQQ1?̹L${ @l~S'lKBD;Ŝj$su:8'H(A?j(Mj=ߘ[ H!WnP׃4#]2h/(ʌ QF,}C:> fBC\=R ܋o!dY唭kBzovFg24%D ,زUtԢᖎa( Y\v TGLDAʶc.%AP5drxa/F:-l`1&Fo/ݻma'N֭[YlV"7}-EQ$;;}~ bdaP(-4͑_, c2&~h($Ir ^/Aww7N@ h駔eDFFRTTDaa!jWȲ̬Y5k֭Cq!:;;G p,>x?lst:SnӈTUx=\tB^ mMXTUȑ#c(࢛t?c.ǿy(..TDUJ夅 F#_0 B.%'H}p? r&*PtU`W8 ,2ge Y)j_5/G@NJ h+fu 2jpQ p"|ٰ mi>@턂C P@GѣU #EIf ˡ7~*m}awAcdz%# * gVQȠ;ߘJ$i#%f=֭[iiiInkkc֭,X /qkxBfֶp2M`̞=;<|Ȳ(L&Ej58+OWXk /9r<O4-&z } 6x-B)9gϞfرch /mpJn\P^:tu *Gn wLӆSV RPP0qV5^=}!!ODFOӠkɫY ʜBcYR0tU!I* |"C^>`(IF0cFne:hB|( '1W K%ebd*=dŸeLf @ ;HU)?*Amj!V'<ˠC!Iy,z p{1qY 4-š 0JG@So}շml{MDfEuuul޼:t:ٶm5k0wHp:Cx2DL/_βetuuى餧ߏGNE93 UXXx$L|岳뮻bر#arPQ5zzw?o<Ģ3/}$[G*VtMȟfOI r 322?Mn՞EJMɀ<u ]p]]IFN,ڤIW2^au>.?6v>3f`X8vIʾ'ϟ>IWE3Aww7U5cd2F[HBFϟ?M1&c$(K1j8[F2W@';i*!_jݗSokYVXQr |UhgF/gl!bvcFaE2 g]2+v8[T&ݭ~zAwy[D@1Gx/f1`)‘_;JYp,' r3k:;mJ$'`$hB|UU B!|>^7vx CeȠ9:Fpx2Մ00 kDCAqFFdA_K0da"D]2lfO|!lxɲºE;hQ'"93Y0XʙVI{ծ]iSQ6IF `xg1B5@=h aȏ>h$Vp`t08T=<؅|kjXb"DzR&{/74]Cý{ DHf4tXPC~tt-7Ż=H"Sޱkz„F(ESD9ׅaQ/o(лFH !8 ܘF(w䳓)%p{[|TUBS͐kjj MB"C .hX!Q#TDLᖈpdmd20%Ɇpk(jJx{᱆ïP(51-`I, z3w^$I:+KVVְ q $MEVᠪ*qv+Q%#\td߃?K$fϞMEEi^wG?&* BIO Nמ;Az΋T,D>+~;q̀b54=~Wo|UQaNq6ɐLf \<ϠU3h,BatpuS҇ C^o1g%B0ׅQ7s=HjbD&saL gvH,o2&ܭ{^{j݂6NA? Lݐy2(Na a@H慜.RjRFD:F'eIBCq9>p8(+K[x[X,?||AΝp+ӧׅbFqx SHYN0t]X}#FC j߁fp*}m{aLϙw58ef#i @4IQC 1f' F5yA |t20Rbt~DHOPε'`۽p2|,(>cNmo;mG3k#CmLRAD}"=[3I= +,UqZ( 3kdL'g\A\ORi,e;>zj@0ߡГH鐧*S8ېNk$#$j Ԝ322~N mmm8Q+y|d޽۷sAykjjli N\= -4Rf^Q_S lD7Q9s&g>-hȢ1 ѣGS{5cgSlE%\# `N,7ʺm*. 2޵kTէg7H$F U5㰷Xw;$;ա PH !C(HztPٜJw$]Xq$h.¯cF -.$#Rc荟; dww@^h}}}_Hu]=zh@/+{ / x"*{l&U?gΜ.n RcHu:;;Nk71ɔuw9W$ٶNlġK f' =6uERyCQX2VPE='D!2͇612g ae'8'oa&Sa_ן`wD1atrH&шF3-0XsE|>n@ z#`@ (1ҚEp8[مUfsܿpvp>Z ?QB R='O 2 ߃Պtvv&GKݞ dRF4@@ICwɂӧ60t*iMMM֦4* 6'*NX~(=7O $+$3,}L0;] IHv 7BP>Hke@{=;[jh |Qx[QsJx,va(YEe`4 q/m_vwr}?07NaIA?2$ٌ#ݑrxm۱S@j}8  5lj̤;< +GO^o@nO-Q89N̨';CWWW f _ɊP(DD%#T>˲̪U&pd_:&㺨;555?Lںi?07nYz56l@UUx;"Mzfdffb#{v&Yl\I)~0dD`0Ȯfg7lF:X25glNJt(tg離 ҵ>l}m,@NUwÂ5~ī "(ő}pa~{\ WV5m)?Squb2/X[hSܺ ` xaOE˗9x9VD1飳vxX & 9Eye MB`R#lZ!2xXB[;^|]G BH!e;lUtfg#nB s6?p;3H5k.z-\.Wi^z<ׯgҥc: |-[F˲̙3ɉ$=BP$ 16HIp(u LhvJa%E:DCQCB{PHĢEFtNO:~G}}= ;v?1-ʗeVX!qƘw +R%=%YBU5Tw cU߆STUeWC&*ɰ"ɥ WH ?itvvR[[I/{&p8U{η ׁ(pb|WEdY4ަ(> , ws A X0d_Kƪl80Tt===K=z45 pTU 6e]ad,“`0kVQn݈ncc2 hooK.a@<AE@Ē)p'Q;FnC45<ۊno .Xj^7|ɶ tTo`L^^^䜜j(}GIHs=+}:A@SU`-:L3UMMG@{)⬞O477aF]uz[n,EW^aǎ eY&??QbpEQVVF[[;w=r\^_Rb&ѭ$Ĝ7="nAAAL'## VJioE>G^x!fҗDVV'Nd|8j&=1)i$G_WG>:k2fPe} %׍޳ppK{$Ib֬YTTT1,A0lNjkk7 A^)(6HVU6} V"%^8x45B`ۯǣ밧Y::B:aSI fsQuɒ֪ۏ=tBH}`sI.?+Vȧ0$hg>_BxQ_z~]CMA}MW/MPuwȽDNЁ?6r&h&RCN 8V^Wap {nLU;v'+nw$2'( ,xɫ-1AbW3gf5M7Fjm6jkkc+--+`ǎuu]f---',kX`49S89o! r O@S1}7,SYYɬYΨbcEQСC\d!SWEÏhlc  (Q!RǬ=P9;uC/ӕ8Oc&eI֬%Mr|X< Q`|] -e inܝ͉ 4ބ Ap)\N9Wf$[j;Nvߦjwlۓ Gg9l /d01;ТlSQlYiZ|t:_J[[[ d3g"I.ZvE}}=~?~w}Yfگ= ömaa%K"Un>xorHeì]6iL@‰^& 0 BE(a>V*++yǹcsϱb / NA/_|1E1}-E1Iv "R0OL$ *IFcn'-àuA驀-_$QQQAyyɘf;[TUU;8-f *::$ S [vE+ymp?ka~WU Q^gTSPLٗ-ewOs!:gA=_{1XI+ׯƶ VCRkTƇ|6uQ'У'OFD=LVðc@7Y>ذ#/au8!K"@swۜa׾iKmK鉯c s{v!y3j,gά4b~'@^{I !'N`Æ iNzy#voZZZxgp\L&⊘yRO Yf69sNѨbߟb:Ny֭[Cb==|A,\qcb+Vl/鸢UCv4EEId)Z*'Zs\r 6lWM-//{aʕ1IM8rHtQSSWX,tMr-X,x'#Boyyy~dddP__φ L6b(71Cv h#Cdf|ʳUU0,3ْ%˖b)8Nc&qb(slY-[+fvW ZaQ= U==L~4~[]sv>O~2+nmminnN۷:_ͺs#:;;mpmvvmʡp`pnDq=(Sg\mn+vB ;&2ټд6H$26)%ٳ'NTX|v\j?C-8'As,];=='c7-:Gο_E}CVHL_{Ԕm_W84|W{gίSy.[obKLePsYi©ݲA6?|*YWk UJZ<-NIqRlC1;zy$@@gݟmb8pegV^g-o v\Kt _EQ~b@4.+Bp)~f/nwdIihhɌ˗/g֭lܸ/UU7M2[b^{-Çc!̾}_\݈w}jWLpKf?J7jjS97'VHI$S=/Y3LZ i|c1~}P\+kYwgB]il VӇ)(*!WO"N gC7Ú [) wXxFnx0Uڕ(㜨Rt=|_]p3΄Y+v8W^sLpV^ehl@K e'L\lxBX,,@0L 4wWWYχaΝ46 /m۶!СC}Y_%_LϞ`0}bÆ `.c!宻J{\|!صkJr4 =m i {ppoqUD>>dzػw/?SHH$Yr%RJo&i7xcZ;n8*?p^J %ӉL̦@pUakN6ဥulٙen&sΡz{~pM7 8z(owz׻~z4MK۰L(3hR%-HSUwDww7sG(..檫}Ofm"g;3 Rq{vcc#_~Ƈ>!iӦi|1U >W\qmoo_*wu]v\s om_KmGvޝv_]]?8po{7 ĉ455eK .x>s AE!(LPEh{W8[O :CJx 7р+aOd-[V'vڙౡ̵LN PHg޳Hbz =g}6555?~Cqw}Rp]wq1GeeeP L)wfEEEɹ`=2;~x{ߋo;}}}455e=7W|'fmm1xFo3 f~QDxRNLv>z GapppIQn%feh9|?5QTXTNFW1%< =n7(>lt8:z00gG1~@q9X/Qqb<P+c=CǑPZzKEsy|)= TUnNnBż=aٲeDQ^|EN:|Oۀ(gﲛ˖-KKH)9vXVUSS 7܀Auz-}YIs̹ʪR]=f`O1CCCY}˃VR:ܹ/~\r%tMO?tscXZ%=qwlڴm۶>pCeg?KKK W^y%9|pAǒ%KL KA4_f6͔ ^fb‡4U YBY^$IV0l[-ߎ_ª3|yϷDztyכNw5#m䳿@ֱh[x$4gF&pJOU`gnH2 3nޗ8E/]%\mfiD84셷0VR%9]vUsC O ep:3`>WJp8^sx|')1VW-aK,}jlR\\ÑRz^nn7NJVMKKKy׻EII ~z(ݝJq۶mK'ɓITi&{VrM7eXiڄYUKiӑRbfh¬NVYRκbn&q:D 0hjjСCY,G+3)WEOݍ|#߿ ?B\9^ey[V7@N6Z;8/nK .`ͅ7sҭA1{ +Xz/h6N\c' u^9i]Ywu+~ B$(@Q8 (**`\s5<8pRny'hkk'䦛n ʽ^oqD(++cƍɍP8z\ve{nB>`rbfFmm-Pu# gUjJKWN믿G}nKYa~~?---dZU W_:\x\x٦vϱq(0) Cr^ĩU!`:7c6h>eԐP(f`-"mW+1)g;Y>Ӥ&Fa=jƗbn8 ĥL@>+8Zz²> K =~"R,.ĿPְOeXXȏÕ}&rg5o>K404.BUs⫬gYװQUב8z Ϋ|W1vywWs`zw+pOFo[h_0s,φ7ן >wC3˾>J>hnx_La]I"5ެcEsy|͇m ERfɰUU+(..N~>9眓ϧ_~W^y>l?|G[[vbʕYS'+9rHR-ԩS<|ip!7|3 @Z)ըE%}9Ҍf'yGhood&^7  _{I?Xt)555,[****pɊ]Q%,K OWWCCCtvv J`$֭[oWpgaoV@|f=˜&!1oSsڸ<3o)aZ 䇐6XĬi'Pۜ.s}K.2{5'TCӑZ= R0z5 N8ngIq9f> 4ԋptɿ;.Q"L`'_}`u}]\oP\@o;f %b&$Ib~=u'-J<ˆ[2U [ZM3Xy ,?*Jj% 5FLG!5(n? rx ["KM|$L{N4篂~qAN}Qz-"H^^z{{$BOr)먪Y~ srǶ(GM 2I8(:]fp|/C7#N{rtt_zrߋC2A8H\K8]1 #KP%*|"ٙ?ܑP%wjZgH'OёG%M~6?)".νi+7F>ci#8⪥'ۋ j,z K^B,䧯vB݄cQ"|uԮr&"ցޞ衑V>]Gd)E1y)gG۠88!vO|k:~tˠ$@ʍ1Oeޡ <QvY,a~N Cܭ3_cY k. om!JmJ7Z."9S(zwʺo&wM]]mmm ddpf͚)[_Lss3LO<W^s 7PUenx رc8pX,u/))n48ba!!bD" PX,Krp:8Nn Y']\KL'pגTIZOQ9[GGȯ~+l¿˿|^z?<tuu%xf>q| !m2}]?IwD2)BX2s4̀ yb9." w^/7v oXl 2+vh8&\"NH4fJx2OcG 5~Vozl={E>{B@m8>-6~hNkiOfmȑVt}ֽ G}Rbc?ةh4:U&F;*m O|s٦RžF㗌ps]s!zC3o7ᬛE 9ϡna~>'{N7k.'6Ų :DBD'ډ̓D"t]'%7)`VʄJRݻF\IJr]w`Rx JKK3mx-s y͉&t^h! M$@, GހmC5D"fpp@ ~vs^YSђRϮ]rv|饗xiZkfZݟ칟2omUJMN@430wTաJHC8u{Gzg!~)bF=~v=f?y+3溄ug*8߅Α;(ο.1kÔb>3p23AL z#0| w GI]%gx6,e=PD֪d$/ylwt^>^xٹ[cCKߘ}ħ]үG h{='z t``0˽6`̠j\W/Tm Q]48~8Ti`>3(L-xjJJJzTVVѣG-{371Vk,I*h[W畺>|OoOlLR[^VaJF-fNf /Ν;y֑QG?ʇ?aN:s=ӪӍ( فt꿩//Xb===~*++Ylk֬aӦMV;=s9 R}*++ 0;)n->o~<Ͽt=>ⲿr3[mpb?G$AI2NܟsPq%n4 MKSsfp/g g q`+==|8:៙HxC\AXjN3' t+zJ<-5LAӑShR"c"-˧DBZXRzl-{tg? ã s§/3=NlH~C5~ߎUml¿;$tXG?F4_ПJe,)Z5Eskp Eڴ*JJJ8묳8묳3HBApa=$x<)OT +Ñ SU5MV0Vu*JKKɓ'ӂ6)%HH$5Cws\l߾^ew8ɿLr,ΪrٵkiB\.+Vk."$UhDi}"H⧶Q$>gәԞ'zUm4M@$>ۄяÇٳg ---%D;Z읕R&36ZV^%\5\áC?LH%ZT%ra>Kʾ}o~cXt)V+9@4CL[WFcFz) 7?aC( Nr*++x0'T/ysQ/li0{_z L@܄#PdT7F-"A(eck `oB1_0l$Jv2(I0 ~=%+Ple/oBU1\G;š`1`*23^}YߟM&"GT-:JkxF,>?UWrrmg"g&R 2EQ|I /"XÕW^ɥ^3*V\9Ñ#G8p eQQuuul߾ 6$?:/ȉD"8dHNb1~?h4Xv?۷/BsYv__ſˋ^?g~dž =TUeҥ,]k1`~~?=== '044L$~^***(..*`R\\L_iVYYɪUxx{CSSa /p ߧo|g?2QLozmBB@:x@ ퟄriGw#w? }yHPWWGyyyx|4477n'ԭ0as'H"6|7TMG_WF5MqC!rĪc;^k-:@?a,1öDSMCRzr [{G#W~͚xeU-y緲bqX ?L{Љv"9AHs7F0LoB ]癒/i E_B9(**gǎ;v,ם i444p嗳m۶]3`d`ߊD0sbB+[kyzF؈hv,䭷3 wy'wzx0$DO *"]w`Nbat]}Oӟ4@pL(kr?kښqnAg 3]Ӑ^A*t1H(JKK=%Z`N%9vXr<5Б ކXo:<}4 Hhd*4\ŬkpzL<%f@@hΑHHϤa&&13 C,l#1ҀD+BD@)H_fz!W愪zEo g Cȇj6qw*4[P?=)a3ȧNh盓 !{@|a"N7uNhK 2GFḌ`:PFԲMɬdj4l:W0X @ @[[Qbڵk f'z;@ety0#%ST`&@qHK$ׯDipe"O(Vr0t1fjƘ]HB!,RM|l\ske%]Trɰl\ɯF?)FX~qN`&>UEfK@"MZIU%CAp1"qSՔ0e#WMUV%5z`@<AJ/hwH5vK0t ;&[b"@ pHG;~EԮ;C"YH$}y䑤ߦMشiVJI$xxgz0x{KKK D]ū93'֒Lk- L RJv>x\7+7#y? 1nMᠶ%KPTTէ?82<J.q3V{#8؃11AYh4Uc$ )leq̂2gUd$G- c:<VWˡ ~9`oxwI( ljU,:PKu 6,:ʗ[t!e&\G(NHqֻD8O8'NĉI~ۍ֬YòeXreҴMyyr0 z{{ D"3  244D{{;===477Coo/ H]vML#?QCYY'-@J Y`:,C\'`k>7z|S~uvvp2WR.]JmmmZ&d,1bʚYC7 !n %o|Fq\,zx$!Y0q*=r3A"Cc4HCa˞p|ɺYiQ4} w7s_X{9 /_Jo<9a`32FT^yS\gbehT8Hd^$L(.5:g_K}y2{'FU&~xĨDχLV~DÄB% "H:.p&RJ8?!QEX} {{2͉siiih ˓z #4Wo<:xR"g N[[v#!Z.]{ۛ~4)Ğy}dE g!n9Ea:4{YWK%A|~$w4F7_Tt.'Bqhh.ee?_>YP =N]<_m7_0)6ʺ0A,*ZxV_V:* ڍ><`|!Vs9 ]w7~sjAp:pWj&GΟ>Avi2MBͽ tN6å:Oe (U}u/n}-GH_Mq8n:K<;oMm߷(0]~G74BY5*zq7а墴۪ি5vODH0#́WJ3qJ9}9O8A 8Ĉ5 4$x/h;~6.HwK穪JIII҇c&D"(D{a(墲qISq8߇?'1~..3I"jN69:/8FT\[V?6qE?QspzubįMڙzE0 E35/4'- x]h=i#~K%H{@e[\l'رwzW~,CG4| dkk@Q+$e@.\)i9{ﻝU۩"E&Ǝ"LWVTN(J8]0Ǝ\"8pBs^.np/Գu tX>>_QQA}}=SX6 ~:::#$)Xmm-555p:A]8MG2Kyӑ^@?qKC|ˆ&ԑD6Dpy~bpnyiޮ:̤e=>2H88y\N6 #i0(tLcϿן@>{/DBiJii阞+ Cڬcz8m~/=%t$ 9|{ jFF[!,1:oWmC՜{)&P\ʖA54gݿ\(\sx"M(Cq X|ם\l8j~f?`oz_pw o[\ϙ\a&F|d $hllLY$yn eEQYvƕМnJjSRg]Z2q&O!8Ѕ ztr{0B`qUCzR) Es 9݄{*=KsII |uK*P.BC+}fUUJïqjsg߃?;Ra]̉ D"thv#.SxD #`=5YꖝR?}A2aޟxE5 ve$j| AYYٸH uxP,dz42SL v6_)Ѷ>̢2M hW|z1!dDžֽz dQs^mj0:~,b:|.[K~1_UZ4"%!GUE Hiд{'R[07?g\Hf!rӰBAWQ2ʖWx#EG\ţa =GL uSQAb"%nIKAd\'=HDC/E߈>JVݣ*(_~z3Η'Bs_~ Uԍ$;@"F FxxdH&џ㱑$ a>.3q% '0N \`9S0፧LF  @ ҸKGǜ Pnߛ|8C{os):{-eU8*In Id='?M@#}胁+uR S %ʕ/]7`q]:X},a3YEUڲzk8K|ҭhY KMUH0m|kW:?Y ;/1-rY]aUHi⃽VOEg\ʔ/kRnr8|ꎔw'ʖ>u=ߎD_񘞔XDqwz< HW^㡳H$'-&^~i$!$hj㡼*++g%!iuaF&朧;'k@-ɼ9Z)~XYFf"!F D&bQy[m z|!$RZs }4k&֘0DQ2ק8q"A㿂7]N ,RYלnnr8~zoD 2^zBPK<(SC(n'mjk*  QP(?Lt'a_7&/A}r֓s4|l[$j9('RZ6d1bRUU5i(}f '''+ip8pݔPVVFQQѬx<  D:IŖOlmH"awG2 4H()c:Z 7$PWjV9x ؓydQxfIȔ %sF`>m]Ź>_y" s'Lfc֟"`kl͎ulP4uuMn9,?Jtrq5NPt=!Y$ytur<^|M}7H0h6Np)'~.if:@Nk ̨q*^%roY+^ぶㄇo,@Q퀵5)&&bLb&#NsmfTcQrifNgEYB(.t[x~E uA(¶%J}..Dsoe֮;$f cၽߙʳjI}Eil SͩSGźۈu[i.uϝeN9GH۴9Ŕ/MWbA\C' UnMqmFx48@;Dim oy_pNh3V=H'h Fby1n:>=nW`r:yoG47lXSLOXI߸|@SJGOik{ u6eE6sa>SaL b_!⩣20fL~ dN3Pu9{Òrsvfo6-ޑE7,Eճ{Z>PY]=7:a %5O1\eE 3[u㴥?D7]!Pd^*0aSV`~Ғ ,xh(n>X+rU ՜ Hʬ/r1/u#jH`0lTQ i^79Ԋh Z.0sb:?3}CJ3q)bZ`~}bIOP(4/5;S@Cq{ӫ1qWC>_%AbTOBK'se ?D<;#h E O(f&qWZOc+#TYUj~"wiPVuM 3Yi\Tg7Y:\ɩEYԔLMp-^Hs;UN)V.nٙ,UE7//qy߆EXTٙntSAژTؔtOB~TfEsyrG-͞ G98Κ o&I͚3p# &.kBX~T8}"O#뀀U[|NCѺ +3)%`5 Q4dchجӜt#.y}v7EgOꢓ>2bEeR-Z=7Mwq s8K EES)[9yaHà MfbH+NC1S{}P>G#`Wkt= ]L#@ɓ !pXZ::4BsUIgbSPT}_ҰbK]O@_G].X|>TU͚ gŲnkG?{ᡀP*D)(2iUXy")H }c.8:ĥ0?@xӋ` # ~;`2=n"z,tZHU? 5?cNJܦ3a ep5!ѐ=<ҺU/]pwKMp6O{#cɁGX=Gyu/%ah EZ%Ea!8]_)6X LSF<-E(ۑ8q~5rͲ,^n g6DN{xr>/^wk`߇xGa胊JL쪘K)TAs[R(GF \6PS _g B@s`_-=)R!(cLQN(Dn!4ؓH̎_f͊C5]붔xw6h./t._ȩӝB\tdNp{Ӥ bFrZp'&YĢFI{0Kr:WL5 dpxlhLʿտo&#:B虆x:~zDC߯rڟԔӬЊ~%eprs|`wec?nycLϿof 8||ضhC-}=f.ES޲ft?aՇ?jӪ)KIa-3ɢtTU g(0~N>M,6R}Ÿ:xle kL6?B~gjFci[|An߲te~x$#\|-@RJN4玟=A(~T^DI(y¥rcY?0zꀳD\6RVs) '豨9vs d %19 P/cL7ł^ (%eHsW#RRҴ{'CM֭ESlg mn EeWN'Kh/?DC)) ={J+AhFEEcQ\\LwͿ@ `p/&L7 P:DJi~/&;Q`&6À:0҃DH=JٿW8`^LO$_N Px*!"A^{ՖaimsD/fB łav Àp9o5<}BmIC]M4ɶ}rk?B-YlEnC<EUX7My> 3cES޺ +}SNE^!=9X"Qf 2w ӄUl tt ߖs)r[o`+9gO2'Lh#'~A9LEbن oârQZj'^q)0yWDbzߛ16+}&ϝOfznq =|)ta󄔹Ue~F;d*< $8y$&/AG) zVX\%k{FE8y_Ы VmP <ܗ3^^^NQ_}ܳbfG€RM X7Lj6)1ay2<E(3@(r]yיfg)H REO 9vɧR+qv1H)*iVʝ@=}Fw "wqCa8eK3))ies0KxJ -;436LKfm8TT'TfoM!'쬒BTpcI-.û~{g=0L~`V6;Nd]?iz=s%59Rt&TVTTw.M嶀Igߺ.wC愍KA`ғr3 /j3ۤ`&4O֝n7`>#H$> h\VϿmoDR*/eco|Sf&%]Iy*&VS(0y'NH;떣:XW>EeWΩƎ#xA˾2m)~y+,{:AE4jEQXlل^7 PhLǵ6c`0|~{48j8!YDf͚I&'0x<TUV,0НBQB~#?^Kƻ ^WJ:3<^_|x*+p՟h8ne @ge:\ ST ͽX| j&6; 0%n-1%qd [.5@Q5\vj֜eO !p{޺u˧ꟊPbAo;IDAT XUV#'O+a,2s'ʘAz0˦ѣit6"+tæ]\N }y7ߜP<4lOyd9סS[K8hDv2xޜ*=n.QLÐ𧏳@y l8q+wqq17oTktpft:!?S޵]~/W/=P\kt;|?^dxjTC*!@CC̄RNf>3ݒ; aY^l+FP}H:힞M\;>.hr*ki{ BUpSszּb6L[!g.PR?k:4#XH,@rѴDp8):j)k(ZBIi]x8#z!p}4l3n{Z,  fVLvy^JKfi %W>a3K!pzϵؗfQZZʶmx&Ӊ!Ψ:`P/;$EefbrG4( ,MGFoc0؋╇dL!(YΕ]N 3; ic9>͑N(0 Y}xH1+Js{yszxq Ee 5Μ6P}MzFUUb1 Z"Ac5}JTk(z^\.j<(/6|m:g]iI {ۑ~ N'7nlZ̷֘kMN#1$ FӃzĭU[&?4 P(_7׿fKAvco<~V +1@u8Q,cz|%߉Tsi2x )` 8e")EN(L=';LB*@iuXz"[յY +4ܤ9MEUjXY:{lœ;Kh89Oi]S,̹s8^o6x\';&h;~$4bt_ QiE{dp8Xv-ӿQo UUQ601mzBGJϱPܬ4n |WQ)g9oOp;>sJf}< \I([.1fӃjb"cGcn=Q5G梩wAݥu+ 4ԛuM2:1˙R3LL5R =N_a X3wӈȒηLE?7gVThߙ>aщ`)S1٣nbD\7/sGX? eiӝ1*+Wdɒ%Ӷ__<uc>/9_P!`r) @O;~EsyEijVmS#J6"N(JUsOÂ!Fc jK(PG93΢LhfappMn+"%v벖& E}j='q qx|3a1[ D` c|8ֈFQaĕ67G`-Y|Ɍ}{by!ߴy["E!`Z@q߂77'* Q._nnU9\g"wC!LNx 1fb yg26eD"'qix7 gZ7ӾMx&#D(2xTP8\^vYʏ*DfR0&z]- hxPFw"l9K}1P2`&BS\t4Ӆ2F*a̠Af7D3̢=XmcXa@qsĉ-Ƴfsc_A,zj([9KCs? u̪PTYb:nmR)m۬ ;Ob5Bs:Oޯxƕ^̅SKHY`I~gwC\[ F>Jm n/r֦d|:*ba@x]2txdWW"Z2҃)-A(7/9 ju@ ==0 }y BC-V * _xcL0_wdOE($L\(DbEsx4.hjmaÈ}<8i~s-0ʢv] >ũSSN|BY9zwi=e|Ԭ1>y4*!P-P\iW6^Jn zp`ilTlwwؚjͷ@Y5O}c/?߮m.jqB=9Esd%"$|!<ԗ. WLMkۼGPn?7ڋoN& R70HY}:7!ptCN X ɢM8NK# -08phP(oYi}QpQ3q`Qi^`~7m/S8sl9.|;k~g\]_6sTvʢYWve|Kh",R C>}yuk Ŧ?{5ktHy&]:'#3j0,e|'מޮ!w!Xs-3 lciυ!,@IxwVBCGm@Uլ̸i\B455Gsw-Qrƪv{Zk:l{+pRP=M!l}2+ E13 ;V;&Xt)}m;ͥ9l/XT4gaI74V#n+z /= so3%( Њy]Zi0Ӎ Ev̟{2)}/`R+!Rz%3/,ygՑۃ! Ϩac }be2iQPț~zzҫZ镢7G>gSRw̘t@* )jym`CۚYI),qg J%e60 ɯz_=刷{o粭m9n6oV(b"LJ%Ѱiȷ)Hu7+cGp(g): Tz3 |\] Ь۞o)Α\@UqcMrHm'zHØ(9 Gfs.^o)i|k2_Y dikkK?^wÙMz`H[ AQ5k7ә~t*ވۇrWX{ !,k`8#R0|f?:HҧOgrn/5g]܉f.ef0R k G>sBA(bUcg6G%/6A7@:3DG t*P rak||#4؝f)(Ҩ.fnױ uul'biUG0N-P]TIRtx`86p8,=fWԩSiBU(v~ctv+JuzE͔PT5K- Ӎ=vF~*KŦ$ vE",GS}O 9c3O=(*bV'1O>;xёʿD8ݜťǁD@01sDvNlnsO5'k#?Wѧ K3Dʜ?W( ҺZ0x39tp6aA,h:]ˊmn!fUdFvSbBu@~tttmjTo1ލg=&f)pzKY{t.qLb ;k_],B%g>ER9Ǔ (׉gޅHKk/ߺAF.⢛@;o粽9BY,`ș9g~0ԋw.ӝ?†d&CWМl\ᯍw?AsPpsDEi&#X}3N0VjlOڳTgl08'_}Ҵxk_#a>8}=AdhFx*Jl:h;1o̝kR@9 $.:j⨪O-|ɘ;≚KM6 WlpxpzfF9SprWւB ~s令BY|W`7/SmgDB0,1߅w_u&r]fWurç9a/+Q =MRIW?Rc~U˪J]9gDٓl5* ȮFse%\ERي3GCt{cF3ߘ;G (@<>ϪfӧO VPn؁M$nWo鵗0֜2)Ge-I3*%bSx<9} CC'MJƫB"m]hNwVW @p+s)s_aNHIױ=ģsZ-6A7Ӎgՙ~1nz`,7|VAcc#N7"3(.î'-# ncXerYx@Qqm>=Bj THd->SK; 06ؕ|! $(/^2e9@ FSBZrQ5ME<U3( N0V\QHǜGcӓ 1`c;Xa0O9v1Y8N2I%KO3Ȕȏ:\C \{+=;0;K.xO%g00NJ=?h(\;[Un;n:R 0PSG^T;n!P4 +IE1 ȸ 1f/  j'$6`%/( CGGGZ@8]z\7l +6Ϻkpprb}t${F2\R Ø2\-06I.,u rEԗͪPZ]-9 kEQhhh`6LuFJIoo/ǎg^}0ȇ9`>]߅|08w /|%} \Ee(L"0&@J\PC=[e7F90 =܌.kSD9/b2|ucOp.N&LX& Ht=_TR[P<3Xg,X+[eޞޛVNa"Pr۴/_C{: g0Q"QTSPԜ-O 5MlHNIH[}xs)6TEe%]v^=uf&8477o o#H "uٟ \ȿ !t6.8ɽ 0jMP4 sBig|($Ƣg䐄GU~ǃVV>dz#1S~؁GQ]%%Kkq$ňDGz}CؼiOˉs.ldN33\ݘAgggڱUgCĺ[-_CQTJ3pOR%`:셢nUL2R5 Ӑj*Iܠ]5* z aF\n&QT˗K*\H)ĉ[lV"zll+:߃q+'g{Fu7}[n^ۆx+kf N_))f@a2٘Ysluv:~9pZMW_WNop}GP*b">7Bu5!0Ie0DA} #c'PkwֱY ą(02 sTUcDE%Ͼ1PgcQJΚ%("ʙ@ *JjWdZ%Sp $yuz!XHޡb='?xzv Xjռ?/*s*8}4U!n%M̩XN7}lz9T0!WTϹN[ǣS c̾Ҫ4ٍOW(娴jŚqtݢF5 ܿ .ZTD/~8y`:G vh79B TkFG"0[6q²g<7r<:`0̙ é^!qѶS̙#}S6"j2p%H (Rf8PbL\BQlM{(pBg"\0y㼩f?'8 ,]k.:uЬ'=*=o"fX"2DZc[۽w,gK UEX(I6_ЇkjrS>m0+u}3q۾-Nŗ 8>#%*C9hhҟr cPeAl6 Li;9pկz\夭lڙuзaŲPPܦ+AqgwMSMyZne0 A{?jC> HxPQ5T1h @Ԩ" ].6lnW9d^Wf;FUU%U(D\z+4ћK@>clJ7S5xLAa_'}T,FZDJi qTYFxvN9qbn'FiPy{o5.46~}uI -x7o?>4D)b_o~#]S /bHKYa&tzapQ]C'?ERvu{3Ǯ3U6ZukH$B 4k%EFF$5%m!/eFM-*M %`t./ !*WlKYVÓN8N3o-vErZ4OZ:~]~ӔTefl}3I12l~Ç300`|pa㹈+nYӸEOؙn',7 WoaʦR‹F*Jo?Ǽ+EuLT!;UQ5_pN0D犻)Zb\EP,&2'gwyѵhCZb~/#Qsӯؙ| |w|qm%hee׬‹xygIL!>)D-)}Gu m 5PK@U񈁣0'^ ͦdJ8}s8Ϣ=؍ñ(  _hly|,hhEU;$BUjUVmᾜ㛦g,gl04N=-H1I— VCN\ rn'{o3F2a&sj***b 6b.I)رcB%f|9#s;`mҮB7 k g7@A 3 OWJ"^Mhlu4wez8UC 0-UaL j9ye+5 M%F]~y<Ꝥ[:2VN?,08h Rn YB8,3Ov"wvV7M@YtLèmPr&XD4'0y[a.ƒ{=r> 'Rd,$6[ol#wO韃TWWsaQ}l!nJook M:#{>оC{r{5ަbae0Sn[>[j-ת*UV LI Q۶KʳsĖ w3SR3_}{m!ҥyX0zU$lbQt3zeRn}XOr} I:)5ա-(X*aW Ku(|)&YDKKWB@$8M2bWDOOh3B9ꨣ?!Ƕm{a"Hkx|p+?<}ۂ5"Q~lN~ 5 0oEǜ;W)@3 &RfJCӍb2lfpp_]󅊂  DB3ۋk]EeBDm*4hۛo));BJG|Be9d sȨ+^I@o`f>1P'UbiR- OݏN&6uOh_o(RgLeiMض@Դ.傏Uۨ(xAMI9ָI+^=hcGl;dՓ7 ۓ|46O, RIO%B2(៶v@%DFO)@)TyKR8pM%;*f YeYy( OD̓Sp3"J1}ArʶRD'yhh(dǎ~$w KIV8||[p-8ZIk称_6Gxg JF477%W^Y36۶Ǎdƍe.!ac-+"N{r1@.y7Yq4%mK&V._*Bqɑ?bޑػ<| 49T* C3_(Pvu=J ;7CPDkjk2\k z3t57}w$tJyJ$,?CT8bftW,c74qdLBii#\ `[Z񐳡DqɑxKGutt8<ʕXfw.fiKp6SG׿OjؔHwq)y ss{MG۶ٷo/2P8w{'\xGw #Kx࿶q{OLCy r;>!}RۛC@jlҶo,r5˘_C]21Y V0Y> TyG,Hءig8Z#L)%z! Ix>ТUJ[ft$+;vl8q-P YBptBDBtsQ.#$mFaJid9 Է\ =(ZvxKr'K# xn3yu]([Եp5R teB6z/$v˦im66ox߃Pڔ#2S`B@b#Omۖw-%ڸNTG(#uíH&ibWy+5 hׁea Mg^`xN.6+@瞝M鰓!K, dFU@7YuTxHO k g-Pؗ9.("rHkѓ-MqM[LVM:@fjTMD YylR`2Jwz`0X2XIR]]&/قگ$njۑ;?QBO=.!` ,k!'{)wNEu"+gϞVB`!ñLL<^ه۰ep{QMG!v3,(my@HD| HPLs@O身hr?@+[h&EjKO@Cp5ib M-{ H{hi~A6{{1Lc)eWvgl   ;yD2c+To/vljL_+h &!:[0R(언VR8Q3qN ,Y&P;OKJNM fˊ3Biض֭[޵Ð$Ύ:x4:moi8qk 698 sRHLJIGG/===Ed0\cAc0{֏ {6#o>4}L]4R>' {b871oso.qzyu)wh:!YgQKcd簦Xw qTlzj %U$jxw\t'Ee" 'Ty0;%8^K|@/PJ0K̢ʝTWsMCF% M[_E{*<䲫|JRb`xa@½ xcuD'?J"C\|54WAN2! 7`:)ޗC"`%[` 6ul8} asxc#θN\ɂ 7>%s'f c@v"Px|K*~PXQ `6Y{#[W|NF?LX2 ZĥYo+v$>x<۶uX+V`*&izHٶ` rUp՟woU1)j:0{: G,*=b+!s$ hai=r'r ۦ*e ƓV3ѫecKP=ΟeU'k/0(Ń0 㠖bFyhmskvrDLa-AFC2 ^v~CD_yYMZuVg\^hNYDf1f2 K J=,bϞ=YM Ѳt#ktF2| #P- 9/o<R>!|TWW$"J#7XΦRby׭ķ)M0$wTX 9(g U#ķ?TŽFI9f٪`9,uwx,?-D #sdrC:c!$ea6i"4Mdv]fʼ,7`ܿ5MDžns躎ix<\.^ۍܖ[zaeYi- l۶bJts'_ Uu5#B>*uͬ8VL9kz޼ H'V*8O%rfma&*'t-]Z!ǨR244T?8r;>]GH)U 9,'C)uϳ`ƥ$kg~fr!m P2Y/?gR@XC CJg7UpǦC@fBYYY8AkCA&diBwNʍEhzQrTlL߻88غq}$sL--'c1RgYöfIJɖyKIH~Ls!.}o_I5CH)ٳgOVgm!D~_Jԏݡiaz%|2R&H>/@M7 ˅Vx<n7; s޷o;w$Hr#uKy7 ߅k~un9Qس`:y<jkk % H/CdEDʻ. c.^ 'J|L-Htc| $M:–3(S" dOu!pWLXQxL`{y j E@F}vGsbFXvL@} y׏aNqe0ф-h&VN9 aXIRx%#C}Z'v@-/mh G3-Ŋpse7r{<N^I:D"s ed7å+xr5490Q7T&sk#GXvȄI",۹{C_}' өph>$]`wNB%fb4 jͅxLr !4̝EHxTlHi,9b6<|+.d޽XUU@t({3)UH.mFODֽĮO~TOڬTm掎Pǝl:lB\ [dɅl/R5B!`Hp6>vTThAʜDz,5sާ+MrX`*Eh:{]\iZa-%Qv2Y,vJ>CJvn-¹&}@EnFePIB*a~0K5^=4Dbqk:p&qRA})Mb,P VhQS!f Y8iE@!n, AS?i[EM6r"[:NlS,Yd-[JN{ `-8E.A&{z@9#`*yo;E ߅| PN.2upyp)a B wȼj!2ѴIYrmD "!d tf$2_F*4L15-u2 @FU #It Vf_.QAwcG@L4:v#t.)aCȢ羔Ӧ-B+jeGQeN Sݼ3t8i `EkfYV *eCWvv`lffL% C=/k#G2ʘF].(Tv? :? _8IPm8AiELFf(DaɈkPK:(&2*\ J*pri~W#mڵSO=u-Gd&𐥱Xi͚d]ݿ ]?DBųsvm,CĂ;2RqFK3 ^J02i+۫<>ENdTm QddRB*֙)wP&շ%`.@ tG`KJ};EMFBn_gUgT h֔8ͅ7Xn0s|U\ f3^ޛLWșOY8 e}Yaߔ; ;FWuz]BP!ʨĕs0O),Dq۶uuanhB)qy@^+Y"&)%!" c`m\SfW ٺВ/re-PX4hYyPq}__dr=߽^sv@biA 6$^b][ ><̞+5!.{T7߀r3SvN7DTȰڠ 9 CLň.Tmg*z#):WĉL|?@g:?ةe୮/괒G tXͶ,e u /IW!gu'10ܾgaChTc^Wz! T?YB` =aQhgE;=aRc Jk):0r \--{eW XkC3A8C [=k9-ۃ9Y,J! FBDMJrҶjj4TSE5B/YKe)IGMʴIM7l)YH.mlWb6C T!.,Q@dt6rۄm33xUVuz%'NmC N^"-MHݾ T9n989H'ު2)foJ-syAʂ=o@> _kC@"YG5΃ |5+ߵJ%F :%?0=_h:NS´ =lC2EQlI\`NxzlplC<{?_O<%7ON$<qbm{¼ܭs1u eXY#28FT HڂRVPh!8k8R( SnicҀ 8ack^L/(P fjJdд8?#L&uTz"⨮H\KJA_<W 5C9p vV }}iw0ĥ+OZKmmZ:gmRQ[ idg_%(LpَljF넠yќsy0 ૮Gtl+g:+LZ~RtbCQU뾽 }*p;'f,l }}CwIGhzǻӛq5OLc4MeoNP"hNJ:7KW|Ow\R:;y 5H2O-`FQ`V0r|yH,EPF`%(ו@Z&v85jo4RԉB!':CrL].. !f\[p\"}ܕXhʹ+,fA*|ON ?qѻ&m[UEFx@`ԦN" oWm uU| /9UI8[96->q8icYXI ,Ʒ=u}D֮Q櫅RK CoXeq!~IR7tB,5f?BWUQ}4Ԝ{>L5+A~cmp%icB"ʡ!XdGR$+#4IPZlAw%Je28xK)%[WPPXNr|f3E<qDhZ0']Bթ߰{%gw@L $DRK:R$gM-[y(G\49? ׿^OILHtUmrPa[L`TR`3%]m[U?5 ǝ;yzڕ@NvB>%>nR2۞`|Nl$S8i1ȑ=-=k͗ƒzu5sn Jm$9rVWJeJgPBKSAǥ[e=. 5~DWPrxVi cI5NV;V{e~fǟpkEtЄK@Rjtϝu*6Ts"R9ğ$ۧ~9ݰDHi*Y GeY-Ri4|k*294.4 (؟~%noM7c)픴-5bxi]@1L("J9]6Nrm~:;յF\t,o;   +<Ѐ {55~N46 XZTTE}nI)樹jGũWaɷ;!3jnAzt Z+( xDwmc 8`448ύijZ) Pp<%Z⠍ru]w9#|>e#+:=49:>l¶G[_5סTPHvZ v4XLDA [K9BQe@RbfF\ o٢&n/7ŠczhN<_Ax׿ZN8!}G69S4ڦP?h_)m"KH) ByǾz.Oqwmky%/n7x75_0E#89VZo0oa@M3א gđ̹]z5 -,j @}NYt\-S)R0pIY)sztBO)XbJ+ Ы'fQ!B)lr1'd?L:~⠇eN"E{/,`rUAڗ}i 9.i[$!! `S/lYq\66cixpKg׬ *7~UgIY {yO ; ֏Nno&vJvɗ Ny | {m[9J%ddt^ N [>>'$! v,Z3z˅y~ ?y CS2~iZZh;8i=]hނL)JZ[2$'XV +Nr0 c+%էk6tlA%A(W;ކBxm`aК'}]_t͗W9+lY1JOC^t2nWcCTw;v, &h2zUO6j.C7\|Dn̙St]/] $%fOX:鐦I׾Lw*!MWu 8?KJ; J=2[D/EJ˥*ϛN CT4P3l) e[p}c)m}_}~=XAs\KXvUnO aE֠ Zʫ"<O% J8z:6]Dx܂pg;x^߲Ihx[9|F њd`i T*E2uQSSCkk+;vsQNv{w Zb2V `~*14@_qҎ]x"ʶ[& qΕp0,HV?/ nP}`T3uIx1=wih|UD׿B߽wzD7mT%i3p0: ο3Ļtb֏+ .6:ԵyhV~%$;Խa9s|>B%e+ $f)!BZfOГBpϛO5o ᚤ!}TJ]~ T{ mnv|ķnQqzhj'B$]_Q!{8ԜO8nA>p :XoR8{L6\FmhEC}EW/IW}zZ8bscP~3_g$Q9g ߾mx߭\gI#< vEaB=ѨI&FzڎŐi޿sϪ=)9]j6?::BE#hHY ?f׿ Ξo[g[,WG ر6>3Y.bxXC@,, $B4c1 kp'v$8gv?<8uA, J ^djw?oi%hAU_ye"PWb&Kʦ\&=Է?-s8C<` v_~D_Ũ=M&6mZy}:s:|m(IB³`=Dds29SSzp@Jn~t{ @3+3M$X`ڰGC%`'8u^J'u um:}m4j+Dڥ`(p%{|bK/N:~5kgetÍ1 ׄ(x<\x4u}쐒}[zͼx==33fzYhgqW9 -p =4*y 6t?UTeZYALk7pESS]v.{(p>zQJ(}v1Pw۔n-+w$l'q+ [LtWtVXL.QdqC}{Q֩`_IJ&B2SoU]t42ƒ/ȋc R;w])7m̓_K>'Z?׼ddAm۹!Pviea Uf")DZ8G*o~ݻH᪯'Ci*~ߏC+?n%=}r;UL0UeRJÁ+,^%Wۻ=GNj!v '<8\|!0 e\kIxZ gjxz_;M XsСф*'9YђAsRt:k}+^h(p23IJh ,8RʼMƴ.cJH$$IReav u]4 MӲǔRbYT*{qA]B+9Rf1.5u]G6;w,նmd6vrp\n 0dƗwyg[!pdr9 H&HU %鶁`fח[ 6elHv$Q#7sޭ?fYgc YdȊ1sMxpͅfP 00s'Zzh#L,{t? l bI=Liif٠5#MR!,+e%3$>ߙ0i"$H T 41Mx< 32AjMӲΜo'eY$28 Z,P0[.w}s9B!NdRVh7}2c(I21T<#k]$+ͅeY1i9qgfX&򉻇U// 3 Mn555os~ѷ(xFCwU+.&jxcF<ϓ<=%,\ܛ?{s4NzdtMZ^#~~Yyw Y/%ݏ?F/ށt-%1&l9O&tM4,@t':ásThrζ,^Wl| 7`k+5KQhUMMjkHbqzYlo\Vz]&A?R=@ҁ{&#;*ɒ[ gǓ KS@RB8E 3r_G'"{/ 3&y9hʂKȗ7?ub2U@A\KH ae!#DY0?j` Q0-&`Hk&@G%DžmX,i$ɼ<; '|n:Lf:L@\" 7d bR:RJ CMN@8 kMxJѩLP$A%۔{%ی帕`,+Om35mzJgW=Rұ9g\ Kfg { 4a-R](hfm g 9n6B<'!P9Zy M&>?]8EmmmwCi6NuS"Vʊ=-d}?aR k MשildsƕWr%Sݪ# H'8b4K,ÄDb,M  6m"FI&$ d6˜eyj4Yi˲L9>(H)e,3uHƆHƆ׵LP[zwѿo+-+>l^q,;_xp|}@hF}=o~ o~`G"Dzp!;qLY7@7oՄL` UҼ`U]?.ښ,^ %)]>Dp{YέkX{+KWzsӄi@Pew:H*`!LA&3/qoVsŰ=$П(m6ډ8v"ٶC3 %nh$jO?.b%$tO؉͛.'W^Bf;Onھ%h9oJūiar ɖ0Z,;N1XISu[{{JA*Ew[mm}qj73=>Q1\j%FHK"JooQdL3rXbgí6HA.M1_:O$.be R;wT%ޑLJ@4MCuRdލ7 zI膻hby}^t1f͛Db8s>B@jKRux/ƷN>z z@R}k}'2Bh:r1_;g-޿ `S7pqo5{ ۥp?lo"ƲU3x3Ea ays-[Ɍz3KjB |o=GmgveLr@M ~FDU0%Qjy<9L13]KBWK`j]/5s\v BWa,_y ݴR4L]y)xlx<=C* OZ /md;$OtVz~[_T_p!o eZ`Gy_п'=v?'@< Awh:X\N-d5eԿjme&6'6o`c ƒwG*TTX5]LwP7c$(ѶH`qa WS3qɏ ň׿g`q5@_}8"og6أZݒ(RJXX۶И@'JNJ!EۺKK ]^@%c0r+DȬ+5;I2'c|6 /{5:[v"A}eh͋ȑ:Ud/]!pϝGm/}4An(Mxj/ 89Ymkݽ9Tҫyymڦ6^6a?{aG__TnRNѰz_БkfR~QժiDv85* t#!mgt]<)1Y)Tg)1?x?kEO!RtGtVR]koMyt]MuD'e/Ka I;RԴlvΞH!ӌL$1R9=l, hZz"#<-6-;1ml+Jsm;}L ahr χ ŝ ^]u vgThn7C<^@a~? x@_Ig IL&n 2{z¶A׳ڑB1!m|RĂˍة:e4BR8V(cÊTHvBdAs~4JՐUKCz ih~ǣ>CCmЛ~ax0㶍_8$SpywLP!v{&usط-,zؖGIoW_;6-KG <Rx|G*Su6 gQCȇ~^"=i]=0Ԏm9{Gm $@)hԷ]|$*6o#i+*3hC4 ƀldg #K MD8rN}|ٿLV,?ݎo|O?#g)Tm?aErtE.TE p0e G D! =g 7}K/|Em3O+1c(J*ZRSA֮bcB>;{gdIgɩ N{$ˁ"S^$isþJ MlF]Z7~)m+x&iJg_EA?2$ MWo Qad*OgWqdR$X!d"@4~)!4 ]W 0].4V|[ebQΠҶм>xn2p!-tKΞO6KidJa )HD]얕 y<ҿ FߏH|xrci"҄Jn}">݉v8< qfsfsONx8/~88SS1D2w<׋ͷu&[PG5Ei,@1K w"ym=u'Fyi/P^rB~{CbOvS3v~j~xTv`+̸Rdu&^y`?x_@"|UIg%gQ={ή_J5S? vdku]vTkJ"l+5m[tÍX#O|~v<]wQ})۽O۲y3Tnӫү sUI7s@==u5yx",KUg]?7Gs. "9TP0z`H*/,"@V(~5/+CՉ'MzIn^|HeJeL%t0 .OB xNyɖk2Y.]}:wO+ "nV8\2@cI'ǎto_ǜCNldS7㹙=X55 ;cgO;J"U@ d;8mGa52Q>=}Ϣw_SI/5@rJҠGe7.a*`g ; pO0Ȫw' =Ğ:ץ:B,Szၨ"Fߗ&r R&VXK!HأKa9Lj15^Sώb@*x揣 `rm0N .GE ({_-ᛙMj9GHj5n[obi}M]fi,quצ7s ϒ%+f2F׶4/?fjO|.?cD$Ďg﫜&nފtN000I,}kUZ#4ƹX>UBnӣ**DZˠH"o=Lkyj4I!#r$]e5-MK"O iA7PiÚǐFF8|ЧXֱ[e;d90`\IL'"d&ܵwǛxu L߻(HOGl__N {'pϛ?K_U\ P>DsNOG]ieYeC^zDW/Pmg17<@J5zW &y!Gx+`%ңD~CǏJmR싯FxL'9H%/C}ݰ: 3O#@'Hb}zx}OJ{Fс.^ƅBPwɥ8ְ\|{?`׾58Xzc](~vi'IǚM$K ..C<76L$9x|boG>8k%~?l*N v$B'o]GE׿Žm[+A6@SPqS"d| 腣/ј_[:GJ:y8MLZkTSRjTƹrf_ pV%lPff!,v/m[YßP}ƙd 82cM{`-8_| ;tj N뒭`WO7kؼF5!p=4/1s|ކaP[[;b?(/O!uxouǗR3`ӣӻ{Cf~ӫe-M'<1R/\~ ²U5pXws-mZ=. IcdN9'WG{9_>2W Viy 8eKAiY >O]mF$vbLJ?J:F 3N.]+Ơ kU^=7PdG:oK 1^/zhTAWB %w6!\`r6`Y,iR>P lm]=cnEۼ7e1*BR±8s,@蕰THΖL[l5Yy/Q ]DCCd A<Ѵ S&UPT & hH!s f,Qr-r2t9\!i:DV iŁǧu{վno Qs)}{vӷq񈋮ipkj7T D;0S&LJs&)' N5lpL2`u#kתp,ѷ@_꺙_Mpik8R2QhF뒅qE}ť,9jٵq+_l|IlvIw紎R!#$6U zQ4#-6bHbXm]sΥ7=ld ѿw g\9hIymJ9O}UHUwcn_I IE޷g}{IGY'g> l d-{m֏|Y@J;vwn`KkDal@wѧ[T!Gۑ_ӯkb[dл{|z:6FtFs8m#hBWR Ew;l& UL(dϐ7RxnhRBWxhPyBbWL^M,XۈG R$ 5lWCS.ф;ܰY$U#"\!׍y|oyIG@&#u]Bݥ< V 엂-ΘVSr<qfq.9tL&Ie >W_ ҎB*adg9ݟgo`¨TF,f7/}7ZN]sgJ ҶXsܺawf:ȃ~]9ߚϼ[>K9M =|;C ٲkLw EO)UPnۊH%.OHTBlH4#*`ҪJ+$le >]nG|^C` ĥCӼ‘N zڑw$_&?Y?JeN¶x۶Ч)гs=>Vѫ&yd8OBE<杺-XFЏKxN^ A@E*ۻU&8S[6V_wrƅѽsE^/U>P_՜FV6{nzdݒ*xtXa/ 3to's$̾>}kTuθN%UBe_1&)x.֘l>f1qnsAЎFctׄL'%BHۢgz{sIOMY2&tShWU`Wq"j7|3gӾ)j-S@= ѵ%7>Kۺi{I0 nZnd ԓǕȚeSYLV@2DHHf1 h讴ݰ%E.8$U<Gй;{W* 'C`$8O"u-yJbNl~@BP{E3=Px[64omO?`n/mZ*#z%wԍ[ 2 ˠj^MG.Tpݼ;ͅvS:Wu RJS;9MD{ٲP{V8^F^2T?tesܡ9&3aϑĜ %=cVɍoJ}8{ zۆw)ϥuU;*Mcpszx?fRh"M006-ذ>l^ ҿnko_#7lnKR82G/_- +#Z[ďgx/m[w8nY}wk|LǦ[$2qԌ!C'$m|&KJ\K6قgBÎFK]f3wc,5s7h\r$uwJr᢫h}-Uy}Tu~I%tx]Oe a }{7o]Ozv':؃:O@P},ϯЋ|ص7@@W#/|7.͢Rd7PS^߾SG<~8")送n? \.QP0KdZ)̮O5v;[gu.>y˸NWKuOM6oy$߶Wm@ \~/U__c ZUN纭޾>ZO8u -xy:Mu$Ba`~pGi._Jp>g_c--Ǭ%3V(DǏ~@yGP6畆HL~.Z}[;akװ'D<6q 6GEメ~?׾NjxbD?e 7H4J˲1S%IbܷNCs[7B{d m^ufFâ!S)}ktJ]Kpթ}.>ϼ7v™uϾIFC[$>͚; 吳UgR;wY?)mzٹ~^Oٹ3Y?dg[Y5@uMl}OҾ\5sSӺGR4@\ BhQ~zܿmHt͜jP^xZcߦwe{#?T'D"MU ;!C4R :od?,IH`[gd/lN]MirQCb`Oߧ A\oPߢTj9AcĞMYgqe.Pϔ T@HRmm$>&B ?Gm35mȉ :6=Yٶ- E4=߼e&ŕ [)6bLWU@.4`A1?xoOxh+[%m +5=ZbCMhB"ihx٢m{]CEba+ٽic@d>GGj*9#aO(`I|Ք%ΐ\K~is3:Q3V T{x+,ib8K쓞梑6ڞz e#Op;+{Z1+o|!QH2W\ "/0 jNcW=̾%e!k2'˦ Tof:9[+g]- Ͽk/ 09Pӈ=e TYG}E~߶ `лyǏk[2ع L <%3E(u$O@JDdzt( cfl[/<\s֫iEۿV!YI6Y͛ {@[ xODgdXk47W}=_q%kd۲۲ 81t@WWz90@d횒SMc=7k7W'X[ϿuTymhMyHBL{E׿~]~gs!;x^ѕYx<̽ m߆.V tO'ou?>ƕg{[6h(eY<`zO.!5>E@?Hp{_~ހ&c U^K`"g3léV0!3@:2@eG==g岉Ṡslwd3;L5o3A PW;e^#6ֲI >iu|&Θ pqWҫ{v~3_QiDAIb6|Δ0= >w{fj@.ayJpթ5Eϟvl,L.ۼXr@,X9${¾7Ca' 3=0L-pOHi#4!g),$L⩤ydjQ}U;B,sz(zy/%(1eDy܁M^KR/#1,3NeŒ%h{e{;K-7SOW *$ ›7SY4sO>ŭF3t6$mb/>jח:K$v']?7r./Λoz/߆1l٣2 dRBlPt@!s]/=w>i:vZP,&\mN's{GǖXۿc>,8ms֛/aۺWyy꾇ٷm'X ˴ hR1{u3GהR S|Ip@uҲH/Q^Ri* IxزG엂%Bv&Lj,x&癠ݝ^A*G,TR` qr2Pgl) 3su HHJAPHj %Qx lLIǚsſ3DC@cgv3Km~?W]>%j];\#M\E;N̾ #]6P >< WOxD^yg"}xdn\ s.9#p[~"N$oL᨟bo"e˃8R8,& 6 ?/4mD\.8xq,ݓ?M/BT+4G%ƞf7RVLh1&uhP % t;o"Udbg]-~iߊu'e|7P@s!p=!&ӥX&~Mgӿi>RJB2Yf`3:`2V8!q[n.r/Jvʤ>:zh8t -N[W;'ZDQg)DO744"=b^rg>/XYFOk?B@-R!^!&U??>ָo*~H?~'XzÍyTEۗ=XqUolxgqp{=ģ1^yj5xW~HDX׽D48xk|Nݽ|烟f41,.qp&g'݌#6K QK`a Ηn8m# ݍ4I ezLz&y,JU\@ѹQYrְP' gS >n,(Okz)fD  o`х;t:ϼ%yh|5 {رUZ& jg[v' t'#բm;H>`@x4&?F)2#5Ѝe \-uU^g6eƀL ?ݮ%#k˄E>{,; jmA_i3qE2_;M7Xxy\ɟSդT m\B`[01 qdAtDI a+2xo?#ԵzpgVjhg7$*!=, u(d-$wE/Xw9Eb#t~|;6n&$ӹv3;i<| K{7"c\SJDrN+NlNlz;j϶uMٴ=mD"#Q̔mYX.|,[u8c>7k{Q]gPZ!r{ T *;o3ȅʢk9$[DG&*2eȐB`#"s~;}&pt lƲZj`$&Og#{SUbwgfywM1138 ֌e23kTUqn[~G3Run2jI%`XA!kO ],U <S<.X*AW{ĎT[7|+֔#MݔM_Ky4G} x1+? K)3WFsϢvtwOnu*V-ld8w@ٹg2YvDw q;!% ozSsiĸ rM]>BAoX[>.upT2#os| \}ϫn YַwC-u)~w#ŵo{=׼-lIYPGUCҿ]OG'xN;:ꦻC kPhKQ:6Gx>#7Q|Z(v|c̗@y/p/EQ,Iu i~z3c zyLgO0`=]`T<*N`ߖU,mĈNaMb]5%7֋r&rΉsRu<׽9Oo"(Fivz^zL'Tq/,R+1\`Ӂ6E\[Ҏd|D-} qxg ?OՕfd(pk$F 9iwqR!c";|fߤ5wktV*)N*}}uqOdVbs-KDk+)^PM+CM${cۻ9Bos;mtdIIʕ'(t R$T[/|?cHW9.}Z;iyuT\Ddǘ(}-|UzN? AѪXC^r3exJnx[5+O~_{}^DrUFXv{ 7QTV~%_%e^ê k֎k#0v=Z}[ۛ3mu\7w_ƫrE,XP4Ӊ. ?k`/}?5GvR <||T1skVoqD==fGDPD~8mY* ϐS;6{=^{LZ Rӟ^`e*6?5: {+aTّhGKx2RmM/(E8*1~;2]<@ j:#2Fk߂^ |`]y_QO7ĀPߓe@xOA7u_\ ^ 1(E.0`+X/̂JhoޘFڜc؝XUY_lxnAVBxZoݎg2[Z8ɏ۳[GQaj NmCU=w_*ʪ;Σ{Pw|G%CH1o/ab4Ϸ` ԌG;W۽)_.kvPęR KK0Z|dSO<6$jR(vD8~[2PQ!LUY7SqEh mJ/+H jۯu Txի9L/ 8A;D3=Z"A)[@#0=;IZw&ѝ[0.5k)ÈF)f:}?sIŊM8K5P4tq`.FiP^Sڳ7ode yp]u.C^u5~2oi(iAD]ZV gI@:m_# R\D(J,Z%VSVUAqy(V"uTzz좷sKgkۨ5҉Z/}eLNs i׭InysPMۮŽ^S}!8bu F‹n/C`BGZ8\e(vZq&a۵3K[g`H09$S,,$P3R,Ċ#"E`:ʞ>Yq'R D9h+pS NvR-I6!z>8ZYUU4ɧ1v'zQ=q1\tSA% |i&)l+7;Q&t4OCEs?C 1`&0&BJоEf eŎ~@Y^΂~cIPt+@D{a$׳oc+RSꥄRJTyEP)^hmV8 #BJ Կ |+fIv0:9JrM'H6y{d)$B4 HSuD!PBwP醿a96H3*ҩ;R:2~ʛo~ƃJ8_r@z-7:Aҵ6#n|7D֎@PYy =o!rѻ5`i;r'o$21ҞN Z\Bb'^Phʾ^y5^k6s_ے!m/کfQ1K? */S9O?ՉJp:Xjk >zLBo/;;Ž=)0 UUT]q{t?!jni)*Z44=vb\ӭL$6pߥС!Cǡ)#l0&BHS\IűIܔ.a'|T]~%*IE"Q韱d#/r z3t-YzVqoǿރvu`A ,y)ۼaڑ: λJ3ɱ_#2NZ}Qk!)\O&9 ;1̚.ثkTlFrty5hAQRBx:zrH[}?lj/bUOoMDqz~z~eZ::1CEM,(T8<!?翼2 7sv:Q1moqaH0BvNŭe8pG՗~Ti0F&OS\wƔ"%`\R8}W9'VM- ܴv\*BҥQ Ui)+W``Ӥd7l"xDkdi1ڈv:Dr"%epzꁝ{?AhB*/ˮ d(@VנA@&PN5,jM8Ѓ$FNPB=y)²B|DW"[ed[YUN 'x'yXr]w^w7fDi;ƒWW 2n# ,%zN2X,}rN+ڟN_cC?oJ6d(Dť$lyNQ6L`'wT Mq9vpX*/tf1!G:Sq3[(!m7dNdo'j.{tjoi{'c!4qm{@:n~ k0 )v>/;;y+* sdu'u~88w8tMl? l%\xޕC p9#a6a!HiBHv8}<$ٗ#3EJ*n} 37O鸦+ uW)1D,S4 nh B`R/ڮ H IQ7-.mo`ZHyT]=Oh'@ [Oˑ_mo+޹8{aѭ?BuoMoƈV_oUi,I݇>8|H%ڱ;rҪ Գpr*j($\E)E"I?ıi=uz1aϿEoy;runF:SPnP u9ވ\!(Vd= rPGx&V[O<>CCZV'\ztSށnV;VB%Wp+8S*^Z`Pz9T^zh]r"ͷ@Y_2K'x $UZwW_$I!0BaT_} n#xNY4 T(~#߿O+7)A\fXnP`@NPZ9/=W.ԃ?V\Ilw_wޘv' swI);(Mg@oo/dvGhʥ&SK$mRĮ̉WzhR? Dg2A\8!܊J8kGeL9zhU?+xdDaE8.IGYT%Bgn(iPckk5NdW'*@/Ж"! XXh˃,*sXwS~:BG[ܚ;C!XSÑ7Ǐ錡"#~`SªZ_Qi{Ub*X@w=uuPq o{]4M=sldm+eڞ h9}CR%JL+-1/R!AtF7W#t>4q;w@yiGӴ'~_|ǃn<M-s?<9PIoMo!p!FH]AvX]+ĞwCp`EG(7ܙ XttCYIdW9yh7ƏȚo/#`9˜awlMӳovgv_σzH]c)!‹Sa#_AɆMHi/⩋ܥNsco o3.1dZN~p^vx27CʅgG!_3^|6jVnrGxW@oo/==ճmjD¥UfpLgaल{ ˢ"np000KJ);^ZJls5*+>)!P:uk~(ٲw߉Օ3Xk4w,Ȼ`bNeYUDVRsE^kC!^RڙiB@03@DG#Π(zDfݠwsaP~Ŕ_xvWmW0˴`X.@ki::=@T\q%7DxBw6Vz72Y8X  eJS,s≙ݬu?|: ) ʱzt?O /_Oxz:hqv{cFݝ}ݤښG!jk"|7M^1atVP]7J7&A%vS'I47PݯjA `u&~FXFZUDV$x ŋ7`D ﺱLTDck)8/. od[=:ޤ+*'E!W ȯۨg4[䘨MG@X,Fwww.b*8U6 K@h3NϿN}Ƕ,j)͸.jsU%ˏJ%٠4aPRRS@"/rXsƅ=_ 08{x0Mܺ:0>a$XU.%x@ƃAOF+ĭ13BBU]_ o?O?X*+uhS w!BbRf-7DΒbtMn\SP[0?/;,-hzKM;7Jю΀? }#$P]CySvlތUQ({޳dz@ҭWK8Th8kߑW.Atg^Yfu5+kj8hn.B) ؁!0F8UUYVMhJ K6,p ˆgxDnmGawvt&bTRj"?²"*2AȒ%Toupb -::pz{Huvb8mv,BJRHB,"̢bJJK(+%@E%",v Q޿eVVM\8?}!a:5oӎ]Ϡtw I99?qRGO^7oXtDscu$Irf0̙7}ޒOHy֐R8sr;:zv=!>FQpb颀GlÁGI&uD0[( uK9xt(ꎢ/=ºWu;֢⁘fX/ЄHB*YTDPC+ /ZLx"=I@]GfEEQKøuSu6%гk'O>A=SC7Q*oMgPrf"+V 9 #ӠM{i= S;uCqZ:[yߣ\cqܴl{eiEvX&ܺUWnK1G*O[v')x='f\X.1S MÎZOpZ8*A"+Vpߢ[͵C@zpc=tۤgDHCjBH+ i:( 7G%T@c4Aoo F3[Rba Buu<_~)tFY{2'9_qc^v!h+0sqxw'X/C#`tީJ)^Ԭ _LP2 _ƿmtvvt14-6aW0Wvl"e՘0ɾ 1qz~WĻ۳ eH4[bTPL;w$Cgښn""OvN?ܰ\n3|CJ^78= xVaH(**oZQUV+;B SmO$4='^}v^%8Qw?+klc搳Sv2T }O|FQ%9At5T1*<קE1q=0Ghb *b5Э!u\%EwOq=/SJd؈eE RQ.)tbsW Δ.B< QBK6^IֆE(ZS? Ge|]JydždbnRqE,zۉ\5MtI@Jų} s;JJb<4G%vo~?UqBx?R5puLzYGF91?>Խ?폂" AҍMSu]r isѻ6+J}&)ŵS᫽DRh̳dKKG3"ihb%,^o3I8@ZX9\jHYg #L4Zя!,!H!oUJqA2B @Bq$qEqz;uA]Z?5gM CG$0ܜ4c}~a$_/0iل0 ]]]9.Bp%\ I%+Wyv$Τs](g0 j>l1$ rاs7];G&V,+W՛0l]БeUt>g9} q+.J!8$o(+J! 㛎t@@Z PUTta "::m,.$VXypY+C*므VjǰlƿfCfzw~tf\Juxf4z>`rTYڰ $Remg =O[ ΰTU/c's^8 pǎji'83/eW;98⩙ W`r]:8Pʏ+vҴ2Z:v 'L֣x_9\E݇>2q+ 0ԫrbJP@ sQ/xq8y.~8xii"OFl]d빔p4 ۄm*yL3 Wa *+c]8V:q)pvtRfΨ2 bzY6?p|4َ#JQĴ,hΦEMlj5ȭA45"%Nixyh q,u=aD og:7aQ8L㐐)=Ԯ̳ؒ" *xa9إWI"gS`BHV b+íB67R&ZU**v\K4_ޱd{vG'ʱq$8{)1KJ0ED.#|9k_U^YZf4= @&(Fƨ4+AH@H(˫8U\:eYǕLrϾLiOۘ Qԟ ק3 z'㨻{i>jW7*+po>uϡE O0Gt~"b=<~W8y :2eD~f#+bPPS9VNLf"䷼C\pهY[S0 *zg{]IK ZA{;6 e H B$RL8ZL(^.g ̚P DZP3e/2A$$0C{I&c,!nv6/\A(RJs@ vh=g^yeU0]|ukkI&1&Q(JxΝ~93[mQТ 9L)8S*^jZ2jSH C~kz0 UUij P e8>^xLj#;0V@GKJ0Kn7 lk?NtɵnΏ&!Ls`imY$0UiU0{G"w`?2.X,W.w1~z.ňSP(^~ O[u%?kh t_ˏfW.Z _5+o4tEA@Q\?礒⽄G-{N*s,DF}oϞg]As˽փ;Za:oMsEqjsT.[l|rg9Z+H o9RϭQ|l/Yԭ?%A1Nz֢x|o&4p\ r,XNu2l&^|c OVofٗ)ǡiLiRZhdԬO 8\n6L8(YtnHzI%&s gըtt37h 6J ^ݎb8 F=UUȶ6H&P *@Ng(~R[0uU^[%|3:W=+tmLAGMSdISG ;Ґ¥^(3;z_zC(U!ny?VmF=;H A\| {ftiw3g !^q>w5+7Oڐ"0EE37}ͯhNLf1ĵS((FG*}91JJX/^>oǝKFg'y+8 R"Ԯ9sBSG(_47Dk{ۚź2ϙt6۩Y]5\שc|>b=)#q'C"­ w Hձɥ0gPW1z:2]AiW&״j֜9cNV8&b׏rx ƽRQ/tg=sl@7kW+,Qеs6}zHh@4usi/)a/>R怒42& hF1aRp#xETn0Ǖ{4"'s# q^)[~ @I%P^xPORM2.|G!P]~ӿLIͪ-\ۨZirdy56c$NޜҴ8qΛ>aNccU5`äb=(ű3;!^~8% ?~UozKގ9*!GҞy$eN;"%u`&W9TT=nz25s7!h:;g7!y0{ kߟ3g3v!*p$,Ir;G@=/{׶0 E+2,Ap{Lשc-s&!$"VM<\_ SJЃ`X@>˄%șz7^Dg'1AT p&2R3@w1>'jՠ:"**F(4.5GpH_;YDsO|ޗ^ ̀4G.0izt]QEw =2[d\[{_1o\2X3w @D"AOOO !Yz\˜2qRV@f-'֣x;_>_2bFMPt+JrDwdJ)B%T!J:u;gd*.LsA"&(mR:NP INOhiɾnzZOFEUuU)"- FC!Jмmwy[}"ԎZpFW#1#fldˊ5>Zt)PM*GΓll!(# 4N((\R12r]|pX4DG Z^ͦ[xD ,*| ڎc`'NWh*Ͼ4~d{3)#naC]u$#U00AB%/^JEu,h8$-vdj&e 4iQjG?9R8BrzXIDAT`' \4i/]Pd+ P& 'L_CJ`J(Z :s8p#xP\c:TD3*eY:MH>1B)d8F{n ʲt?~L*"CQ+7.?e޳~:8==+n?{WPw~Wn&l8q; 4[e9 h95t)5AHN$r4LwNM3b>s0%T,Z B)}]Wlj<#\謳ݡ;p ~$Ļ{Ϗ!xj ^LmƢR{QzN)SoJٜdg"Lqa`1˰bjTߝ8t?Ȣ<^DOgBugpf]QhWI"diLr/:Td5Z 0]Uqi9Mf-.T3#!)X7IEOe9@vO OK_ v(rCqt fA>@ONi?C жB*mHPjxm@`+ `ZɡLS:£79^)RGxvk+B T 'c'r|!`` :ĥz3D̋E !\mΤ"- |9ar>5ksQZL1(E{I{y춯vlOu̲2>ںqgQ-`TڈṒb'RW(5T*gH14>BnNCw(=t;BN{gw eSb=M_@4qwu!XTuT_/J8< z:i@)93 BJoY*n1@ʛ;v:NP|sGnS+ǵO 8G* ]OVKB^GB8+]^u%gؗGEhR)dOFmh+Cw\HpM֚N!u߲aep+lc2~ AwxZCqP :O5߫ X|9t8θ(džgA=_q`o8ZO[3ߢz! dRjBP>;::rF,:r.~`geHB96ގq;'~ٔ0 .ʷ0cF1\L G [p~.y x΄lIP)Dױ1:CJ -^0!bJ3;:K&hS T޶fgF IգVWnġ̅Ҡy+3`c}QN>tnm#%/_zlN^xׅ X-/P#P#tPf &Q?, uf@"> !Dx |qAG(RʛD+.Zȁ!/%X)I(]sCQln"_0 K`$e'{Z5#q`L{\4Fp2!Xb7)_zVډ>J * .OъŎVcB{Itk{噟Cn !n=~03BF(rRI;he ֌k{8vpw5!qR d2 ;iwHeMf-R`0!Sܕ0WAC@8)[`D{`t곸_;Lt"' "խB!p ؄J0ATr|hyi*8F;58$mvgdaUi(0prϋ_ nnpUT_f.ຎnL%I_{3}͸~F6.ˢn*K+h9P,R%W`b(NG^O `ͰQ!V'25m g@dѭ෎]^)uAe;7n"JV\Ο9b0pVi ume@6~LȲ\xqԽ?(YDrfaF wvvk׬u?HӢ~9r kx_īe8L>CEc RX*Nt$ 8[WSt1 ` XEHӌt $ Tn|B+lrZl{ʖ&q.atf2' e$2Y|v3Pa9zu/3 t^u{v2hkeWNhXFkAĶsZ`+R{D CJ#P\eҖL0,g;J OE :z#_Rqq1֭òNe!^~LFMbvoad@ k̽o -+M hevpSI X( si23rJBR\7Z6ZlbZ?{1mw~7qsܻaP7Ri`Bez~~V! Og1!? RN,bXADŽвk}Ѳ jJjfZN. W)Ԇ8Xpt?mPi?E+^ExjZ΋PcTRTUKw4EXoRh|5(7J@J0 Lixb8;g :g]A!X/gjgqs#Y/6K+'OJRWU&@/pWB[P(ٲTIUSDoNӂg#nx7f蛝D=ksRcdUoxu1 u~y\oϹ:ր:[FM_ij͹NtV_!3=$rX(|bV84-TbLY ([Dz#oC9= cO}؉8-wr`'qU}c{uIʵǜ) -S)\!h=~#Sl-),mt:`6,&X\:} !Z&=18Ɗ_]aRt5 &\A-uāF%(t[ā. !wtz.*+qeX"9U󟍪BQ%2J^sj9_jXw_'pQ>8kH#ƔUh[ A+EHyB,*DEG>>0.p՘qx4ҒHh4Q@_9pg(_5)_<#GAQuסzqr:) \M$zrvZ5B*$ +%RQCق-ZFlbcD39|R+fC+ K9r ^tHE뽮Wͺ~(ttPw}!E\t3\t3V?ދZ}#)%@c{O !dζqe8X,2w\?@U9Sr9%3K9YUK]1@PI9ޮ1m'g83W,jg۲VRڟy=,Y$g'``(Bt#~ PT-p%=thC; M`*-w|-x4İBTSMMI &HݝXъ:.ש]u2WcUNm_T[}<ʙOP' tƧ)TT]Ggqi䚵(68RcDG{wGXq67MMuIFQNhE3HOI:3υR8v}~ Sem@iPTU0'}3HcL*0;hT+pP|.|Nw8 5ˁ]\wNWWφeY_{\cv+ݨ;1UzU{TikD# .?qۻ3ԕa艪cۏz*VaYX7_a\&u3#s{r8uY40/8q^ƥ K8=wiEG_HES ˑgt0Hozz"z]^!>q/Y8PT -3K Nz_g]Jsi?vn<[6G8~(ǥspV&F(ӀdLb{qmoYLM a˻tu(jf#x=6J/P`W нX1܌Roo?-no/BXv6, Hw30jj ԯ N0#e5\f29.P3cYTR9 |J E9@T.Y{B-oO|/u|O X9YÜ,uBG)'XR>i12Ƅ~ M&-v{Rbìu:JaCY ҴD)];/Q|hMdz`p[X[\Jk-X.A8c4&;聡eR(Crpo ȜRruڂa8gq)Wzu| aKZm=8ajl_?y$h  1Bыp Ǩ,\x'a 6^no8y c^T+?olY73, Q PTِUpdrvf ę7s RW-c'Izx_huaPַSOg,pʕYbcX_U|2W?@y4Rk)mX:]9c3x7KEP+8GF%`(??(#A),bʕzƠ cۄ=@vyN]z7JgUI?DzLn)W|_Xy-T  :9SM0Z:О 7 g!.~_c&Oi&ShuJ_G^?)n= >% |`T,OADzFN|W&U= (nq6ŸM#34Sxp0K7pG8ۦaR^R!D,I V)Zr UKaB k ʥNRuI$zuFP6q'tn I|-I,/î0Xr4Q(LhǪ2`e&(Rv:Ż;j<60 \RKϣSKqjvHweƜ/]е^.^ %`(_Fw8O?UvqǨs WJ.rgYN~pȫJ!sf{ )1`!$zqRɬی#pĠr3CҖ<:T*tl:O!әL4x^8N*AIGp -}v/Ijժas Bp3(0*~/p &[t?+8ơ4 .য[F)7|*,_۶`ŅpG`4/ǜY N>Aѹ _Fx K$p#7+\VAæ2 rpi;?ǚl@, . @pRA޻s$#Kg@hW<@^; zXh7#p)을R gSR|K0x6%I8ĺ:}<3K$+۳%s`ۘ%MA>~W'0ii4a%R_i/Y Ơyh=sҜ7YRJf:\A1e,9a%xD~ I9JϳpOH`khFFـmϭtPiElH YW|qs`;@{3ƿiₛߣzln+Pʝ1mA N .$+qgEQ=.X˱u}K_K`t3*JEVIbEEV8迒څ,|a^4AIHw+Bqu>*`N(.[ѴeNcoK#Mg3$TRs⚅)zhψM}Đw \%kGunJŒUTD_[Sޏ7s 5k3gw8~T(yr$+RP<ǵb&V:"_Mogkx:wt8LҕR.v"Ni?q49/qRIڎH :R? D+kVTђ>!h=hęUR0Sq%X-A 4T\*]v{Z`}yp]R`U,;OठfBLNWU]0i7ppIlBHiZ".e cz墯R!Zk?1OR^nvxA]C֍lĢ?"0?WbPt+x؝|mقd 'sLJIo EX}%$T\N-$lĮ9SV8aX %qQI&E^i%xĻp$(ioOaXA`#@b'cqRXR"]hx. IKӤ~\W N}ۑhD!㢤N?=]KuU#$z2MJFY!%c/8.Gp˅3QeIa<[We Ys`+8C*n0\c7}C9BXt餴R"a6dy#@=sx!m.ZDΧ ;B!ΕW-4Niiuq3g$Os,;ְsߡzc| ;I;ї!Y5,#P??'LjCp-"Z岵HcwJkP)<3迒hy.k,|!Mt4drY꺺՜ة$BO.M3w) L)/_;N'8b`\A'Ϻ#ߪi?SG2J iЧsMޖd$Zl-9#&JŒUq!΍#,[|Ҏ=QKRI4+WS~l8AR*(?yF~J׬Y3.l @7gD-ozPwݯ^G2Í`{i֤iM-R:sDʪ L&!TZ?ԭ9{ǚs<˿ƿ})i`TF%xj@W7-֑Quje Quk8ޏ;HXQm:zZ*y^lXL3JΠc >`ìZ7>'d7PVL5~`SGHvy.?'&e&ief^'Il9W6hs%㮚=_̫ ^r`L L-Jl\o(+1eSOo~:n_(E׏[?Ej y+sz`;۠aaxf΄"T4TGc_?WHy-W|Xqq>`'b~$]kige?Wz$ῑ(g7sh2JMڛV›V/nIq! 򲛨\]/xW s?Gxj , R\eϸ>o՚UIש$;!`=VfAq8.p%_ְo5WʩѸEw6V0DI*kM#]'3[@J,'.ӘƎj:f^+M$s_f{lׂiƿ4-V]Zؿ6=`&˪1 yݏ _0Ze{V^uNcX -aY4|s%s{,\d( ŋ`40/+9U?aP(]GrnpG&ʢP, Gd|Jb44XctiZ  G"(V@3b)X&]$Ь4AK)]'7q\:sX"W5PT]D μ՛:uĻڰc1\ka(*kPTSƵa }"RB.Xh\`Q{Bf JY 'q CAGq5Rde9EzJ4^`+Bz8TP(}RY*^t ΟFa|0MիWSQ ǐ !u\q6Aq՛`=nוs'c܂R3 D\GӓS F8>ͺ6quu6Np"7Lшfa"ҭG2:-XFibڎn<+q9+Bh6e Qn'|JeTx]J|! `|t kue?#~%bx!0'%+.j:r~gg* 3="iYmM8iui PqixwF]VI0٫X`lVezC[J@vk+>Qz_z_ɒ%O1c#⽓v9ɡ ڛqÚ{T#Eԝ߅ΖEҴX{A0ZI3RZz*. EHJ=M@oo/===Yוņm7~6/s!$Xp+Pv6 >\o xAY0\ʥkm9M}ty7AW۟AejחS_ o Vprvm9_wg ,RqZ %ZUK[.$MxWɞNR8m G.)'TZ1r =Wo],um'v[25Cd˴mʻѵ:{6J[?z6:~Qg%"yW1H SJ,&7/\܀͜L T\"]vƂhVF2֮]7tRq2k]ud7by?u;QO}а qvtldw|gߪK^7i?x5G)' + . V rG`QYG:Ivf]nPOݼeG4s)ۂY` !*.EbA (BD.ux-~(P@ayޗĩFr h;jIַco-zda`Ơd: ΋$`{nɴY-DpߗRzOGcs҂ 2{Hx'gy*:W pgH] =[̈cs_?aÆ*$ ;Fcc#X,Q D"ٱ~/$,ۀ=P^3#;FCt?dy7x(:(iv5W +BS$r4\'5$*F<3_ 7)׬}Q#S&X"݁mSA agG P12&g+ E?޾,0^}#WF.T: n7mw_;^ z2`gc1Ġޫ|HL5p1ι9CLtD/޾1\o1ma#(R V; J.I1N2)gN/@Pg.kJ >} |uRx4ˣ0ODžs^(Nۑ,kbT6#(CgK/m>6}׏nCq CESާA\ }d n" a.P+4\zԑt{z00Пn9D_fhGPtvBzN z3"\gc4Ds8_̌4IVwe~h'`džNi˜?tPzVL[l\l|gH;9"gn$v.{P9s^qESWe:cf8K*H85[?YCfjC #T`8v~?cGW\wd2Ɂ8u=\hE̠팡];K!oq՛!惿 1.d˹ R^;BH).#Ey*i,UJ!\;ǵSWiR*w20 =2=sa84-5E`$8Nl>,tɈ*0֣m?LKp]21`(h2?*R4u?=[?+zzn&6@3 q~@QieWґyHdt !Vߦd0czj7wNwR2Ӗ;@|ҝ2}=8{(}A0` tsG - ۹I/)_*JP\$2/촾) 2+^;~Ǟod1o'jxB| W,k _93W Nw7>^}BJɢEhhhqz{{ٳg#+#͗sS_?h<&F0g}.*46\u֤b]`ʰEy?ƶziPR9gH1oX}v{J2֝\_~m62Lq ^GgؗyF*Xe:)zІotQ>/m> *A m ?OO.0Ihó[15κBNܴ~/s,y18!’}!SAVxJi:fZ) ,kwR Z9样~5}Dgq88vYexRs5bxLcg<@,Ā Ezq#xe(žB)F6Ge:?ݹ˗絷n[[w獵gy!Ҁ3v9NC(R}f2J8Z!5+7sKi)y+o#OqۻmDp$U H~ 'BG4 Q 'z L(̯'~piu~ ‡ItS=De Dt_gĻ<۝jf2C qDU"` iK:sspi4ӖNP3SB;8}O_$ zĈ4+KTҵ(|Ǧ!+,y 6BdA`q@ vZ+yDwEJ&BPVVƚ5k2[MT*Ç9~x. θqfEJqx'ԭ׽֞=ݣ"+ȪGdW/?1)Ptf5ց;0SJCf [?¹ordDvCv?S r JWOc?UG `o)u0T]㫱41F6ET %?~;2x8Sr̵7B Iy~+\?(-ȱ|9 ˛" 8|-[g=?]U$O{:P(.1 ]!f*wѿ D"[`08}Kkk+k3[@\Gt;U hb7}i5A l췩\~e0ari!lǡ=g߰q]_Q] fT,3CI+.?! g[jL}10+oO=]dJ1ЏݯkSPݴxV-+p=v.ڼ)N؉B`p^Η:ө]3X2Z `PTh+;R WrpӟQxC(vVb]Cb1:DccB>b]~60fQ6luO  nVMFw|HrZ7]}ִW1"ZՀa1@$0mu'x/~t5Za{.SVj0ϑR)t R[NUSe(]1ly~X&mo^|Td(]RM{(WVVNhJ~=== U :欙_><}7u;č F&n:nޟnxAVpgEm|{2Rg~B±9`+Xpݷq;p/)Mg1&!\n(ϑ-WcTz]Jp`k$pWҩ7pt+B?y.X*KB)I}*'ZQG ;qt˿? ބY_*bޗxDo O ov{B̚5 .&=z ~ç 5n`'/AuSwM˸f bp mNAb= .=gɁˮB T EB ?ZyșNg~$cJ-[|㛧g`3MR7Q `T4x+JpD r?VoTBD+S\zCqT o&ҷUSHd|r~[[;__JIYE%uk]?4CrE~(*QXOɁ$Vg\zDIiҴ@J4fd Msj&,r% 9q=ɲ-[/}eަGc.zߥ(,CQ))8<^q7~GQŕ巎mf&}c,+WRQQ1}R8qGG,%K\pGn1*(4)h&%%%tvvR{:h9ʌp .`"ΒW@x5gh:2!+ R^nF6\h(*Y^`|,eR4S bB&>G)8uD 1J*S?ke %_I;==8W)xhO LH-֩1)hM9ҳ$`xc/~2Bה̲ iۛB#cYmui^wG ǟiY>cM6%`_@?_6s?M?29a~}/b`{ǣǝ~1I )Wֱ;-y1DPñ*BJI}}=˖-tvvrZ[q]BHJk9 N,B[I=j]܋z8 [ْBҹ!]|?H$^W.GwO`biVpS` O9CRZ~+%%4֖tIzaP, ѼDyE=>TlAB,1`N'a*mBhCFokzw[ ^L=zRs7\x0Ҏ/a3`罖`zWzqޱ㦟v Qǀo'1;h3/»û6Ġ?O»c;O"ml{|vw]ܫexci>)o=!5?o˼A?s!33CFsAy>Dd8 Э0 _Ĕ^BkeL.?pc1TTTf(b19©SF--}k錖ssT"n|9kG5zaNjDYeeeX:PJxxGױܧRˢid*X/]Ӆl@0Zy+0zΑ2Ϻy5ϓ( 01|1v p XE \ ]LE1o2t)=VZO+ &dZOMN'Q;|cI>?AmLy}"\93io+(6]xbLI9 ־D;}3O{}A qTL%/l4] Ӎ8%Y]3B# <iD{%`.\p.Kb<0`Ч3YAKlWu;lt^㽿|{謙3GC5$tAJz?{QeYZl6رc0q⢛П<;]_'4u {;̦Otd,BJKg8DtzcB/zhiRwQv4'w* V` Z3T…4poRߏDaF1J '5 _`p@ ^pmta^^|>$q0 %KPW7mݻ'OJÂ%k+68yo@w;l\gI̖6JOue$ P\\SWbd'cCNp[G Zsxw;ttkhmn0])?IETh}'摱W ;H-(j ܾDSJV*,gE ;ZP-WH:xP$ǾT !uuu,]tD۶ٳgN/ Y8jp"yzs/ d6غS#x_KDQQѰ`f\;B 0qO|/9!Eԍ%\bPlC`%6zWTd^S/gGͳ{KaFJpT(H:7.gIˮp16\/N8BYzdݻwsQ (@lκ &/=z`ZߙNFҝ H v(LsBB,(!N'aT흔_mF7"WC(0..%B?2όHrCGr==)K ilw]Rq-ܼsGf#֭oŖd2ɮ]hjj7-XQ-fr4O!El{'v$K2P<<o8/jmYh4:v}}}ڵ޹GY^qww H 1Ոv,b* ւV:L۩S~Kgt8팗Xig #r(DbMbIL09nfC}<ξ;C/&\~u`Ӣ9f;3~' 1TTT+MS8ۨQ]Qptӿf`Y\cTfF)T \Y^MJac<,Mt5owG6zb0/E@[akpUgG,㰻>4B!9sl'՗!+'1At^^O w`T<"ee7/Tդd_0^I ]~ҙ)+{Fd!Zcl]gB`Q<v/j[F{4s4|u¥F#JOJ3-#Ghn ba޼yTUU}0mmm3? QQQqJ?p $>6>g0t6>̎5Q%y16fޢ+ʗ҃M9NeF!47%[}Xc#m 8qP!ZdP?035ki9pݙL Fl3p.CnَjjG_+t4%;BDQS?FGI8}T-{_}} <ӮXdG:{JKuLW;ubgQCwƠ Y 1+•FY)V з-ro_DK3Z}!LIâ cl:tW݀\} Z&g6,))!f4L)]wc*!>Gn۹kbX\xqUY, q,6JD`|$yJ ASw_[E 7j Y7Ԕ/՞?~k`9y͑/L:EQZc}vZZZNWOD`֜{3& W`;’U4imD> ݇a(/e&MD=G O)MH"ow9&9҄JAn6(ɒ'F+=DJu0> E3=QT |!2Jg\`& qtF:x`MZK,xUhi3Y!:#-|C 犲+>eQ[Nz<*444d6+oBCȁd,=p;!,Y6랇D)SLzi$24dY@ V .@A6?Kz'y yf!cEBB Vq|(66+rq) r{\mR´L !s/UM4]!pz}CQI)tk*D=nL$!iɶmö,( i۩~?`kF=?8Jpl1BTPB1x/! ҟWH[BQ)mExP5-4BJy @ E(.-CY<4Hz}󣤬^>HDDDDDD4DVQU^.@Q_Uu&B(+ P tevzBq&m;3-HiCN a2-U6aiu&I b òER)%l˄`C-ȎI57*ҟA@@( 4]p=(  (r P@Qq:Mס:|H)QTR F G|D,ۍRgҮPU55tBqR5]eviV͓{)aFi|i;5,ۂmYH&6 ۲a&lӄD2_,ˆNU`Uj^'v#mY-ؖz~۶`6,D,A>$c1LÄa ɔ|NzpRA8絩ך '- "KPP_ _ATUrAUUX]Im].˹^QQXTs&"""""K[PWwlL{~?^o-{1S$N"2M$lB"G"C2p}}Dog"b,ӀaN࠿^LB4$Ҳ EYBQ m;C(Jj˄jB@wk^\n^/~? E(-@y| P\"/(*)eF"""""iD PUx|>`|A 0`&b"}AA{E>}bG0I#6lvE:^K!$&2~mB8[]סjTMÒg_xq=/M G_FSɩC`!!#H ݍx$PobсA8b0񸓉OL 'p`[LӄTQǁLBW[7ߊ .}Ӥ>ӐWX_a!`…#>fA";08 b0z;;ݍΖVvt "4 ܎0ЦQ tU60z@Ph~+f^?ض 3D,4 GL$`$Li:ma48h*Sap; =ޅ7 )a="""""]ぃN@n,_UcI'bAiq4( a O#""""""tZ0I)!D<C<Cw{;J˱dse[ 6ս]Y4M0!"""""f46t]m+.[B==YUhh(vDRJt{Τ em].<<͚^{`(PUB׵\;u^N3X h4븦xy -цT=MӠ*\hY6"`ƓYl)?TE%49*TM(ug7BAA!TU˭CQh @}B. RyMSqPPV-m(BiPɤt&0Lhj؏p8H4dD"a 0`$MDqHHp$ ˲RZ?D2?-XvvmDDDDDD3v?]{֡ q)%LˆaHfقa0 IÄiZ]?0(puh [ウ*puU,Uò,8 ˲i3,GmAg{yN[@ VK0 ݽCss;9;va솑HfݣhtV # 3idxy y<:6\q0Pk΅K8Y)%zqdkPPlJ楎UU˸q7ݏG^? df2H&a$Y]n7DDDDDD4uŌT\[vvH9D 啋=ڴe._ B:0LdOgd<y}~x} """""B`ђSN}xH$h !rl¡/4PP܁ ۲&dM4ieu """""{bJkyڲ[k^-uv#skٙŲ^TW""""""ʯ?jekG[W*jPVhH/Zds+&\ 1;W# ! RJ4"""""""*o!,Yv4-{dK$"h > v',ġ/ö3'*̜ۖ;l ),\2\~]Dze=eB ;H`[6 c3U$D<>!nrWESTYzqdB(XPR Z?ǭCSBئ5{$hVnvyE,th[Y_r0"""""""eo iΜ{ JQ1)i Ds._w Ea$}.җ;WPmDDDDDDۤ:= =;=(*Ԟ0bѾ(Gc5fX4s !"""""%>~2Y=r wybm45e[>UQ@Qfe  <DDDDDD˄JJbޒE}E=`~Je _Be9gx4uLϟDDDDDDۄHulDHΔtBFJ`Y&Gn8= 3, e}L}""""""ބԗ< .o"o9.X-=_T<eFGowJBAi9ktMBQ y  gU W0P>Q;m-=i.T׬f`Q1Lǁ, DDDDDDDʄ Pp5k7¡_P:=;F06Vg?EU/"""""bSDHiy߰%lĢtD0@=-fcQ<2IFA ?] (,]y| ʱ hsfщ] qhpF#Y83A4xADDDDDDَ+P9)K&j,Ķ-47|ye *FG<F{ ̝/%YZp{y  gn jO"y)@Ղ#QJH$"2 (j !{{t 0""""""NxuNV?,DKPP]vԶH:Mؘ$OH U ADDDDDDzꖝ@Ixv7#yl!Jx۶ֲqJsgLr):gDDDDDD3Ÿ%e QZ^3id"ƣssZ Jt6t5NHۆ_V{CӜ+qe֭EMGw<(DyIi&Σ'g9RJ}26XD<QN hrtmu>XJFG$ܓCH '(ȑBm=^w1)% DDDDDD?#Hl2,H+9i j@UG\[]m+㸎Tۄ uR";@` ۊx,QNEsWï[?zI@<{Er1%ۆ`o[qUP1=ȑQhp餔3 """"""iMu'0P>c)C9Ϲ~Ti$ܸ~I; l uY7!ets\PXʺK2/@e2=ާHDoDC&*2-(N4˲@DDDDD4 ,ZdjDoOKs^_1*ڝ yobV @)Ôv HNFim@m8| w?!̯^;]$zLjtfa ΞǢQL|E`]> haQ\Z=}Z9,2DŽXQYYPve帚E,T_촼',ޜEż壎SJB0Q\e6nPrg$ $< rQt jNFAaY^cY&l*(?0:Mʱ*TuBzHC)iP_] ^Uj#IJtv#L 4̬cBQ(#+93Lӄ """""iC+ZG#}hn iEP^Xm8*0 T2EriTDDDDDD4(*yeh:DtkTUUP蝽GLf$gcU|2gm """""F x]QI KG_,Dg{ f S@ufM#yC]hn5l?PUU VC+ζy]r,kVƓΙ ef(?H&ch< dlKzH3c'B EJeh>""""""m ;:UPplB[~F~U,Ӝ+-yZBDDDDDDRaL{KkF.׆ tJsokp{ M#Jt wvL5FHF FTH&͜{mۆ93@M0"""""""8`$h<}Ė*/)%:"Ꞩ!Kf !#0l3HQ'm4Fmk5ݍF. yɐaXvv ۶rvL !2""""""mJ7И]X{4}>myD oB:\M}i񆑄̱a4DDDDDD4) cA4} nzyt"7a #6-M.#F޺ADDDDDDSkJeab `ђ P'Q47=Tд+ U}N#󘔒DDDDDD̤h;1ԗ/Dar{hiڃhwF84Uə`D1EQXh@$ԅ9'C./j4j`_;:O'3@i#WƂ5D"[aQB`AZ#'14>RGcYY@Q i%j Ey6i2ܰP/.]#^#D{D=0sd(*2M fH)QѴ ]Rh=#ȕ>EF-ۊcg>)JԶ-ضL.MӲl\n3 """"""Iq i7GbA zG3nq4˚\.=l*"g}Ǔp&< [aKyb׌xM ;}MN"+@we"""""ieB7F !>15?׎ζ[(םdd[䛴 ˲fe"""""lfiNѿ]icvG48rz&RJH{-3iYm;$"""""&$ h;4P0z%vg4sFtQPɚ !fx"mg;LÀeξDDDDDD3,Jtw51ü[ /A[+,fR(LcYN@zƃ9@ C߿-Gڂ#ف$q$qhUPVQXz-,_Zϫu2w Bcvv4=um?ɞ+ YL5L؊@`$htw# "ۃNĢ92MD00Zkf(ۃ 9\up/g$""""4#;tD"#k~y"`փdGv{LӅ熢(UUafu7s@(؇ζVؽ[^z;lim{R^RJXX44Ǟ[񩯄q5iKDD3iؿ{މf}(`5Y4gd"&t}@֝r:/[1hh #"1ŨYE9 ^J#^HT M`vV\;;p vlل/>("PF>5>QSN9=!"ކ"tu br6y.֮?56LGk x޿h=z{eA4hpo;ke<Q롿c L>)Kޏ{<^|sѸ7[]ncTUǂp{ F =]ִriPUiieeؖ5+[Up_oS>{&5c~zc 57??|翇Ǔ]Nlz)Q\y{xqx|??/>d".i0 BxS_y=wO  Ȯwd7oވwb~)nqlBK׊vż:TzW3ikG1++KjtݕAфlk~K^(((@II ~?***rݍf===FYRJ3lmK@DD/-ly9$?g?׋[7i<܄7eYرesvlلx+F7~(( 86Mvwvx#",X'Ҷv{/PWh< Dt%;`6--;;E:8X4Gػs۸&B\.~bXp!jkkQZZp())(G,B{{;كgyO=lق`0& bm wIߵL1<#³E#W[s#G"i+ixQYU Nj| =]H&].x}~,^6 ge+DjHLlW[>EQf-\C=s<+ :+[fx GO܆D<>ϬiPU~eeeq)`͚55 UUU q7~!LȄ>/MP_/~q`?' J5r{!X6`Z"("=8~@J3W=w]r>/3XMDSJ]Gpd,k|)eƔo 4Կ6tfZ6UU; c <c&}îz!xPWWN: ׯǪUtR"/.n7J,ZT;wޡ{O<;sPU {BҜcc@cgpky+V9}_$>@NX\XPPN ϸtvu [q[6sνұ8L+DOWowU~U V)y߸ Nwd5^[EQrfwݎ{n  #vEQ㢋.u].EEES<⑹\.R":""ʋf_#e-޸XZ 8xuHYJ3 `~53lpr g U Zot ɶmߵ?旰tT-=kD_O z1BQP`<ѫGho=0OwF*j* N,+;kCJ il7bd'먭[\wuXnݨi:m|Iس33e@([H* Z{s_xɻpr-pzVOZm!KJ㶟?|?+E2l B0p 5mhi >Uj&2L++5^%dy3f:۶we4CUUᬳv\~娨hϲ. +MWm'nѧ*ht>eݛ{{܏=w3o>րw6p&]e#H= +6N˲ Kz&C ჯSE~]jjq=MnsLwD2+^Y`†w_DowWy˅ mo{Z]V8 RJ <"""NoW'ؖ., OY <h f-Nq>p_bi R8c 6,r;cyWp'<ǯ665` ѤĐvuX_9=_P:ud -Rp C+6KSDo Sئ 4_?7e~04 VG>]ByX__{zR_ E^U""i#=Dy!P0jHtE_~"P2J6K=ί@Cqە%,\rp`a[cFH&@6ja-\3+HQdlH&c? "iPcbQӿֲYT/]$O"pݳ5^"/)["ǯng6R555>|#[t҂mX+Gmin\_htbUUnc߆uoYuӕc-v0TE(pgx{H}*a^\t[p{? j6"hʁV|1Bj\QEzg&GY]t{V5WeV֙f߮'6=Z~W\qaڵyٿb(7"4 twuvHSX>G誓a)bB#z'$w7P:BvhGwG;ށ+>q7pW-D4u4[ea'; (.}ѶL45u҅ÙBx EGk>E((,:Èa,7 nLB PZM\[,'=~}fNuyq7?A(}}}hllDOO`&TUEII PYY1r8夌s=_pҟoU'~/}w}?`Y.߼z9iְړOAxv~$ɥ&B(Z :rʷݝG`>D lـl-a&$X,a!f}kEwF}Cg{)Fpw:K.M7t̓˲Ѐc۶mxqA"0 Xi8u]|(**C H***P\\2Ԡ͛ՙqb~/_yLߦ7n(֏RqcR4^kR ߸֩xl%vlل/zԏf ˲k*B,hB#qDc   A4@0'`6 m0,H)@=l9{HEm4]G@U5h[LzޑZN: r u/0~?8pH&m{ĕd^8WһDUUP^^ա'pVZEA!e[fkMS\Z'å)Txx頳$'8] jK[$K8KM{˛ 4PVR;]JL΅3Y™R ?;g2EH`egSK^J(iH$& ۖH,F"i2-Iؖd҉*kZ'Bi@MvA3B2H}][[[o/=c{>^Ĥuxގ]vHnaݺuqgb(HH$n<1ѱIw=۷fT3]X0CN| 2S=so=8e?XP3L ٥mcˋ!Heh})`0`0dLYٹ%+pi[igu6l0㺺qFu]xgЀd29BʾiBrAQnض ˲L&S6MH7FFhll?ߏx≸+qgASx>xDٽUwnϪxǩٓ][Гj.VQ:oڈ`o/B=" ! "!uVLÀ9$`Z$$- ~eqI;k.w۶ =W˙Ȼ_XQ@n^nnh.t BTN۶kH'*PUuNVvJ:לm =o}k;gܜUAUUQVVO>]tN?t,^!{.=\p ػw/~}8x `xk:Z?y=4~a :l$-7#ÿ}3(7hhSOyRJ iۈGHbtѱmF20'=)3A?ٷ,HME/۲ N@ۆmd߶S+( ʼ@]:ERAspNMjכm"\{۫O?4<+Vn:::RA8MPPPZ_6liKfM[[[i&۷F[[8LӄĒ%K~zY/>gaڵXv->W_ߎ{ F"aHQoŲUkHDDEQn)HWsV)4֊?G~5'^k! Tٺidmx/Lˮس}+=܃ow>Ok׮v\xXbC7s=۶mCgg'bXj%>W@i7袋G0ǃ: guq 7zxϿ="<*( dgDNόpNׄ^b^۷+֞8u$h A&UQf@^U;>Q|KA<eY;xbp EEE.rg۝uzr ^{5tuuetn`MzH$H$l߾ӟh"\}x;߉իWCǿ5kxO}uWDD4q\U2@giO*N~*8@J]mYd~)Dm!a xuxο`BJݻw㓟$<Z|_Ě5kr>7s4uuc&&jPXV oQ1 .*"GwO:{*r 6MHۂeYbسg~7 ^x w^ر2x<~]'t 870pP3pŗ!玈ffKҚ6@]<xY p,->zp'zYsB~z0 rh>.O4۟ql٪S7mEow`ٲenݺԇ̮.l߾---7o>N<||ߣŽ;!*B+,(P3csp tZQ)Նo l@ڃTEJeJK/*/)Cdp M UEQ.]xVp?@4'a$Ccb\`>qpϮ *3@_$n{ [|Y̫Za{?S3踘Fv-m$1.eo}'_iďc~@yEo¡ғ`K{$2?o z1ՋQte}4&؉8lF<Ϻoˆ Bۂ-I"q2܈WOsޏ߀4B"v0Rōgv[o!Gb(8R_@&:5߽}R%4 E+Yo ^8".A/!E)M_|w?ADyc[N=`F=wwvo42 . ũ\or^5Fc&}Nἳ:)gXS ֈ@owMt8,y.L@;6ot~}O " k\UxgF?E@s MGFg+b(nՋK?EǽAǽ d]/Dc!| o_/èng&y;fN5X>xIj]a']h=oBg"<>/;`o^Y29x VZ H&M[$Ir.j7[E2ϿpZ)n*TЖgB&pͯɸ_ݿDPBÎ;{B^7= i n7_COP|s7S9SS4wo!:52]? ^UUW#pr3`QL'۠/%#& ,xb𗍃Łgћv68˶`a@DsťDi6$p~o(@u{ T-2B4\\US\4[Y-{a쪬F￟s5~8FOojF8ۖ:V/ eһqB~/g^_ 7d7 !ā=;1h̆mz f,< v0N]O8l ^Ӂ`N`4 |ow _45t[d@kgLD41@lE@wTYerUL[W}xGxء]|)'ltBQٹ #o:Eαx@NYz֣Y *pA@ƹς(o^{o4 h%(Bߋo\ eX!rڶx79NDS4 twvQTv,=BwG;;;ކ`oB}27'pmE!{K,[;{< H s4l:;ny{Pp M$p6!ja0("f9ʶm_#H&E0 x fҀiHbNz쟔{xp{=BuT{L3J'a$0UB}79u5IO_/\ O>'uM'`ǣWfm$!1t})Թaߧe;qzy=Oއi!p o~Jj€k>·;}G.[:77 E0{;1=EEW;ݿɶ4"!P<>n!D<3ʫ0zDt,homFطcC[sz:a$!mnQ1uK|:-_Į׶о8{':[ކX, #LP5 ťeXX{"V /3IsDKCˇ%N`< )ⷫXV \68} Ɍx) @_Y-z>|\ G3->a8 X2Od7loZt]sjBDi(aDC!DaĢ{zF_w8lۂi, BYHۆPHۆ UA!yQXTիq™gnjxOE>@9w _ےjx(>Jt=5??g#m /AϓB qHB0< JӊʠzhMoh:~S3 #WpUN?ⷡ_B:]igP `޻>:H^gV#㾿WND#cx'w`+/DҶa69 B@4EQ aZfd,}ahR-_ /{.ͨ]lB_\̵+w&ʣUv wnqgҫ*>pv6I+sۚ"?p`~zR:<XT@G[08tMMN0ŲN-]+~ԏfp_H&=rMÑQLv‰Ih848;oQXR<}-˄mgض ) ?vگP8X)[sJkFGHRN]N퀴\koH0#ۖhȁ4EU iΪ;ӾV@J Eҹm۰- X Dp8#àF" =^~1L+#UU-h1V [ (GjAQc %10 ve"eys>8IȎ ҵX˝;s qqjH5nG}f꾮.?N&m(>rhJ*Ppy~@{_y V$-G~QsQqo{VdmOtlƖÏ%ںyp+R:!3_XS/r&i ܿxѹ ,VV9i>:YUgVuh)E thwlh$v E%j/ƒw%3#cۀ8pH[=_],*s|I/8?ۀ73' n<:5kNaUBPS :#u#3RgkĐ !"U]_&B[A;>R6p PgJ͈ߎwZAIUqRzH&i*nMS'ksu8 V' <χ܄cz3s@ӑùߵz8j4UMNF D'3w=Ou:nv&ڝ\2Cܚ= æagkA$/4()L:79?S@SUNic<O]mqV ʓ=h;8wo8a'bzFw;@q{bJ*Rv2Ȑ"P܃iH8yЊ?6[4Mn8E @4->zK_Yj=KX=^ T /MNV0g{Þ[񕏽/<ԎwBK.~'u%,,N1dkfUq@Kl `ECi095iس}+0"ӌ?0+]QhDjeM'a>躞Lx^ȅdrM5p@EC np[^gu}kz{קRv׼(^x%`{ʅCnMN9[6"V 2${_Ǘf=[^P冢aLpj{^ zv5JMZX]͚r·>q<5I~۩ pR,g"wVգ9 I)x0~l8ܩwg 7vzm }=U҉7Iwkζ}_yڰȩ0Ix9θ& vpܱ|ft.F{K3-]>OD3?N3C'c]M4UiPSH{(fr F)}0{:r^kzqY^)ħWwWڷv}ڌwe@ $[ RJdX>EkR" +Z}đ}C;7i|HVg3V.[? t8w-]{!Ae~]B}B2Ve!|EdK=HpgEm'3;s ŕ0X3N' tM?ǹ_>D?w0iۀ .9eLӹ4.uRsL:8g'DwGԏq( оݙ9Cu~ g/\7/ß.'p)7r|ēPojfaF*+_uh_B7@(XeZ\x EQ0,Āv)Bd݈Lސ*xYuQ[QAoMUx|Ce/ɜ۱G/^S4oP2vXa;G.B(P$x]|ոgq9c$1طs~_IjO*/p.Z5v0{ 7 㞰s+@dLO"1,XL՛ j*Ų5|졭~4Š( UP\# Uo_ ̹{AaaF]3i m۩)MD,ȶP\n{9>eV ؉8B=+P|֭Fwٺ{i(=(ܐ][+,ZXZ(*yK˄l9pU-FIg;Boz*30  Q)M4d(/>~~ȱm&m5ݎړDy ku䇊Y6;2C=&Rq dH0DC!ض  kcB}KMU-%b0fL (0r MG5~BPz/ HBtT= 57VZq!s'm*ӁpxPV5? 'vN<< 2F |9i,,?`^>D9f#2 ;xy(m][yWEaG.۝6qg p8"b:TVUg'"vbl˂q"(J꿒nx}ɼeC`vRJ'AIggZ“wG*_+*EnDm iYnOF=*P^TP\X |+Ok~ ^[ ן; ^hEE*,]޿@-.Ctϫ.YPT؉`!,_z{m B>.uޘ^ :o:FVdn= 3>gS@A ^޳;덳7pn)K.ý= xXZl|`ߐu'8[Z}m+x{)_‘+w w8m0'-}NDWo%Ѵ6ލ4!? !kNDrm|Ń4QWq\}&L hR{gVU_!jnJHHUya&Qz\t5 y!g;@QDJJ-/nꗐH$pwϠT6؉X\n7N;x>KPX4sQ'?3߭9?IMNax:iV;줬c?x%y7|wȬޢ z{فiu,'ާ?s9gqGwWo`;1/f|&R"l~&ڃou* R?n!pv4;]N[Db XXrPV9PZQ91f%fL3xҶaIF( \U=_9˪@ՆT\OmB3Ąx}>݅Po![o X=fPrU(X.+Dz6Yk7[5v&q/gu.gH ;x}Xf]kN?10 w<(,pZ 'љ i6 __t{x'v>b^ gO׷-YlN`,†  GIxVbxa6,B__~a ^mFсL=muwg>@;G xdly5'} P\K7x3{f@.MwR?HGDo$ȫm @B:)9նoވdrG+,F _ ݏ݉Gg~* mO+V@kk+~|S+^﹇t]!^CUUPz{!4 ; sd_P >":nG?u9{+{IN$bftk[Ou8[$ W7 o~+W]ӨN,^Cܳ ťe8q?yFҊ .ՙH7`Ϟz<+DCOhVm;aYo# ! _֭[NvD->p.=Ӆ#.͙y3]I čQ[$z<^|#̾$Q10X{M@Iif@OS S/7I8YoRJ#2Cz۳}`P8Wݏ +Fý` '~lv]ma_bP5k<4Xf5\j~H6@9ۖ QP:ND;-_8ffag΄h&[X\ 05>Oip׺SNw~;}(.)K-]"10 |Sw܁^z t4t=_T'?}=M`F5BmGп߽?*liCI2,"r L3iAJ 4eRSUEM~#Cg4-3@s- H)?ZREEz{3L?uWSb|Ҷ`t4>CZ&q¶mض v =YBnd"d".Xfڞwik%?tVw5z\6jٙ W8p&h5[#9xu(-tizCi!$P__kl ef`](%wOdp |\ ~'?=P~m(:s;l i¥\yU &Ѭ3߉gX8)T¢7B*e`?p27lϒyvrRJ$#bE>IɈ*$@06@篶݁qJz婜DžP Q>1:[R7M33Y$Z xyc~"mϢBkCF[5NUXX hAe ؟snjQqRk'Gàf=;^^._מOf {6' ̠8zA\7:59Ti->|f׶L!YiĶ-QbEtMUa,sBwjd !Xɓa3f TSx]Ega~9mbHۂcUƞld'sAZ& XN4wL"'/s[_;6vV2N>IK<9:`7^#]l( P߾v`$?yIdڙA[:}X4fd[78A'ٌid`b'HW.ݙ+Șg26|0@0̌rN ѷ(Cp $  K֤Ε+b ր]BFpͫBӝABd'1 8ߗ )p4gIrQ{ZL\dg؇>A,F2n\,PP_AnW-^ќsel9'.*PNF mƑqGDsgjӈe8N nptMW>Q`"C m)p@N?+Ujq@/5؉6 >?cR\g'p/|WUmj C}^H?\0Dt\܏ƣp#OX|Rׁ mMpZdkUYhŵE[K<Er ^򤚑O3>'C?wA`"(\.. 8e؆F#tFSiBG] 8V/EU3XH$FOe^$IfFcʐJZQ !I9-6Pj4ё{UB(*PWmlo} 2W)7spUU4|bpRmT< [lu{4s4^`xv<.] g?B𺕹J|nc~ c););Q|b`iO7J!@ۃ'?\4 G__qZ?8͘O@WdUl-_  `7iym~V( v$DӡЊ3i9_~X%3~P]~sJ=RJl2d. 3r:=[pӶl8eVuplN˶!+eG< lhm?(S /lϧ'贷u篮|oY*Ξ8##KO\/MkUkScD4W00DTMt(_Hko20]xPTL"c%}YZG&uL÷deZ򫯇wI9/:2_z <~x4us V!kOBMص6Z? r{CA69UI?TE!|VRİ5 _u$i$V]vĤ27Q[ 8oDAaݛzٌHkj8ϡ+wc-`ގ~4~}ZI-GCN8 q @ w :%XߊsECH4uwv _N2t?H>$ʭ-ϼNhv NV$M |*$jW^YHZ?' X1olOXq 7\E.)V=UpxwED3H<Moq\?5w<1HЫ-Äe\yx00Np\6B<8_|ޕpw Ew?wJ&4 Zza'ʯ0 N:H"o~r#}<~ʯ0|oX~ˣ( pPpRJs#|~?̞N8ځ3^뿌 ނ7^ e8T!|?,@Ua'܉? I4F=pip/X]xE-ˬq9+Qգ"guVcK.oX,ƀ7*qxxk|P]m8g<,ю`oZ8sRM:m&ufO;{ԂxRk_F MMq[b{'i/&?_J8}_9e˪`nP:Lwevo{=]kK3W z$;Űx9N]h7]v{p0&pFҫkAi<7ˡX&uHv˴F CEv#2 ŀ}t{+mC()ߋk/M`! 0ގw} e-Ҷ`'0:[h;(>JEvO aI NA#nv/Td/yR^? tG?i9ΪF/έS}ɱ2L4Xx{xf`*ן|"vtC7"8KFd2>("5U}vLs2ct=s5߲,$d:jI֗s0Eoʝ/ާihat`>=A[zmA\T9M$ !T uglߗ]]>?DADW8zf_pҶ\WκOy5h3a}mZgNZuX6pYI7[ XR\Vm/i6T)b_W{evY֔$ĦW^ï SIHiG@qh:C,/>x.p)4g̕b<־'io)ӉmB80>] H5"5=j*yWZdg*YBQUD -@%oGEWC~m"A@J^}f_1VQ>V-&BP5%KP<'»Da'ߎq=awpym~CVDWIzeDm"m20"ftV;O]'ڀMoIͽ7ry>4OݮtL9{ۂn;jo@}H"op,کt^6BҚP]c܂CD[-YHɑ ~f^4 fO,# 3s2U0R(*`ۈ7D}{>tp %'mݷW v﹇h<4  5N@@JpW-ȱ(PG(c Q$Nu7#fLtH< /&yI3uH8[=Xr->ze"]-3Vg{N sپVfEZ+DEP{\l!c4biWxhƓ)0!d$<@(cUHq [E)!4 Ptii |U"DI2>_v<;89gw5gqw,PZ(BBBi ŝŝ!n7Z.)uU8$aKHA궊`Ehc͐* uV H& R/,ڻ3Ag~رw3M4vٻh(D F Ɍg&DC^%s ehx}Y(އ24>>H_+F >D^$6Wct> M@UU ^5 s0? ñ8P~PÖ;o#P-ǜk$2OI-z%TSo*Tט)X/˔QUC-{ Sgh߁h>O'ſ{+z-d&gԾ;`_DSh@Pi!/vTE_u@{lntߋ>8̐q!#':L*&u]lkeF:00Cvlp'B 08e,S5uk=aHĐO&5Oy">,f[\ L&cw:M(SзeVə835T1H?/4.܋n"uƩH?x/^'TY @ȿv7fbNN'_c' ;\>7`E1-E4 JdAû oBm[Z iCF4~,ÙA8GnSay!XMpaJ XV/Z%7%@SU \i]IS}ut[ ڴN䧉}(P4`K`1D$UsSaYPSĮQ(Ǿ V$&_V?MBž*=zcƑgTB4<{X5'scu -TOwC(?Mv=Gn; 8LDa'tkVa VT Ec< qX2s19,V$H-%XQ,^ǎ$S'){@_kmGaWu MFM~+V5Q[:^]i۳ 'Rb*B} m|WY3& BQ[*1ċݡ}t,%OGovM5Gg z؇@-Wcd&SqlzN۱}CNaOP>47'T]x/#TW%5v\Id~ D Ƿc=F||;۱o?&skICAcgN PZU- j7ex6/JJ䏟 ˥h 6i.Qo*?e­"VyI$1qyvJf"8c_B$-՗h#```# }(i\/:5tg@u1[F5G A ;'^]F17Xm?ݴ$~"M3߹KuJe8e& avGѕz(( | W&W"wۺ $AS'{؁=z;1CPÿg.[9 D\:gOkEDm4UٯKRP*#=AT.dtRipD܍0eнn{z R]0iH~<8'FO5* u [S >*vobXhiI0G麎CӴv< @6 P1}ǸDΨXc$dRz^j+{]q @e+Lуງ |#-o0g^FƩ,ƳaK܀XouME2[Lf)t1$NoF^y0n?w4rGܣi`cOL] I4T3-X_nͷY,E5}fr6*6?g``HC蚎" [Vz,XyG0- 4]ৡ̫]Ƿs} Wށso9b"Go$PB o"ei=ڞd6c|E~ M BR3pq=::b"hW71~Eǝ"jzZ*\et~{Ha LziP9k i6PԼa=?_8V8.^Onf/ F[9Z\wƐc_.0kbGJ217ڡ}H|s+6Љ-,~k= 4nl7?/ƚq^-ޭk(2j>Z*)3w-VR-<7:rڹclbđgcOLڱ:|#%RvV*~WQ5c"_e#P 9)~535O15 o}eϷ+[W4` ԉGB|pdA!IR_==:YG(a>_`K9y'I$ G3 }=<bum9Vا]Yra9$ Sm'$k%p&e"*PK͗o/AazFK4,G8c`ܻ``URM @u @$gZj'm{ *?|:-ݖ, S$0ӳ[D&h>Uo6,4+//D!rj?$l.%Ɗ=ޯMkSV4Y%\ UX~!ZXeiϭU&mjܱ]BM[Bz.kZ }IMж )O[h<ɲu _Cu1{4Ucw%1+Y7\骂{b o+MҔ=v9R){UEx.F;1%&cI%3YFW4FicCAcwѯ'~&Ra,vcC$(LfKC5"kw =5NA*xva פּŹ$ň}M[g& z_ h] p[ o6p_H5]T4B;¢DYLBځ0>?¿L t0X'vF۟`u&2k?`HCH_B%tWF7+VG99;`Y2K>C4a BS|Nl7{+ٿ/@ts$t 'h\<ӄk誂iD4sS煎$d{D{"f CCw?1ZB~/JЇoC;h*&i@UDbH#9gJt $`&s%)Yؓh@GT'~H|X*}NVn-p08e"I04 n;Z8G~鈄{+C""dI̥o.ڶV0s&|]xP|-|ni͉ț& ?MJD@)I0&7,{'1錿0ˍ{hntbz?:#Tfb@HQ>͆u3;`d27 ?vg@i&0%$u{Aݤ;澋gjbJI69H97}XWo=[} "09X=dWY0YH] |!Qy55:$L"!lqͿ%{^?nl@Ec~mN/<@$ w(o3 8DH;-p KYGQ9BEd 2q _c ΔmΠ)DZ磽!bp{}xOl Л )e!M#' Tgm海uI&r>?֯=V;2r?HK$!+ݥY*P5@T{ xuRLL8(!3~ `ӯfǴih>5`.[~lKf3qjcޭkn_Puz(d`1d4a~aޭ>;q[(^Z'(*ۭ X )Ho@rB'.Vv '\w,CT;BQQeG uWIùSo?Z òw<@7c]!31& xQC{9Lf՟=Z^QҨ-CDiO0jm*NL^ŸI')I@Ax^oAUBd3%A"&\$a482zX k>J|d`=mk7+TM% ( f%J V @w=j0v61Yl>꼘̘c.bO`PQxBLE74ufϏ!)G8ȖmK H]U_B㾖Gbi`TȔyo1IzkGۄًIaB€z$`x0.| 68kJfFXwxs\9{ _=Od$lS{UYгm1Yl;b>Ę?o/!Y{GlPyfb nZ?3,)^2seqoRrCP>V;`u&︁QݗYhYoYm6i:P} 4U%ay Fo> y2 u *}*'H&3Hr}Y4n0Lb3{ zغ]ޞ==+<6(otջɶGLbwE/gkc @/&Y=*Ip83ŨÚ"aDפ e=;FE'=B }_OAIhaqG(4`Jc nxf!,/k'I2'3%8SI3>HCY0rrA)W%Z=|_nuBJ@(RSBSc#11* ds Nd qgi׀/^Di'!I | )C~20hz:>|q߅o;/OV0WZ.Q ^]ܱT#Io}[ |JYwTDa^81I]S ={b*­0os6<ԃ߿57PZߺ,VJ\XGJPFRUS/m:_Q?r̟& _`=Vkj_}9a>4,{V|;ӸrajՑG3./5- xGb[T:E1͘LhkjcܶG O?=R"_ZI^'O`+v VS;I1uwʯQ~ǰN5mw~ w~j^EuѷPybJ|)FY %07o۟A70>_@>x>'Hp𯴩[,ѧD0رqQ[@@ϫtU4n[Ǟגvݒ4_C}P{(91x+>zM߼]If#==]ihh  VՊfx& :&dRRR(,,JFͨUI{܅lu+v_j6U OI tq[m)v(.mG|[+8mo&=䈣70Yl~]4V*㺖,*? ^U7ÙEJ{v6-pdal +>:H"Y |?{aOG5-:` `x%QkyHo9r_ 9PU@ 8P#3Z~ lJ؝Z2Ac̺Nn%T[E [] ٰ%_ǭvG,^gto}%k>y_Hcv&4 Drr2uY$ łS\\mQ~vLNNkaX snmIOtq?|IֺS,&ǂ |Vxt$$ڠrV`cOddo 1W> z*#YCjkB!pR~Uo-(Nz`Ԩŵb=utՙ䳮SUC1F`A Z.+ݧ.LMm1|߱dP~z )5lJKmI1x4KAWcD=oZr.;^p_FӴ;k^>YC&2p1_7ղYsX}~~>c\%Il >BŔxZ,¨QHHΦDSO??$B~M_sOތk6îQ;03&j8d^~Gՠ^>mZ@bf>ScwU1K޸YIq*Tf :2*x_#Hy*a#=Dq7|܀w[DycӲNdab`M Q] s_epזŭ7322')))vASSS$r2dYYYF%|n`G٦'qR!stQAN4dm.69|n=^Ч{9.gm˨YbrVTx.rL2L,)Z+ !V?Kf}] BI`H0t<1?`&G\zum?}G͘PƳl5uTM' bGܤF'|͊$$-?3ϡtӏ-vc>{#57k!e3+?kV>U?T7H5P]՟گŜɑl誂iBWBh>7m- \+= (ۼ5oNUUJj%;;AaL.k*j_&6/"I0,% m9}v,L海o7$AwȲHD L ̴nd;˾o5pΔ 2#qU>'u-oBm҉_$tIj&| 'H2'Kjf"ّ@WIgM]ϚOfOTY70$&&ҿoX,4hPT{Ȳi|osOuAtQf{~{N63~ <4'ୢQoBzz, vI1=W '5]?(' g#do"Lh_xCK D^TvYߌ35\g\CBOa``` F`!VÑ0 j*6-S@5fW5.ӠwY#9-yLurn*M b9p ligI&[H9D*{ {$@r fM`ضE5Лf)(( ##fTU^0L^5US2 ﴊС0$bEHr~Mc$G~b{N9*?N@ӅaOth+-Q$ 7ʂgndwQCC*쨄j8h0R(reeD?@Q%ʿrASۉ [B 'Mf|oW}h'D?"Il,`2$$lk'FՔغݖ$I0? /e]ƺuDRHQxQB\x#ٌk G|);aoel2HJ'){If9x䌎o  a+,yn* c.&TOZZZ?fǎTUUEOA c6IOOgС\SĻGkjͬw|I X BR=*c:;E`&I[ 'O-* p}īJt.&YL@Mȷ.1}Xx+_95zJF^O&63A@O=̤`‘=~A_c$`H[tMGd$pr-4taw8ZfXwS)躸9;ɺ5`w'.@3BOeTUe۶m 6:??`PH/_'XUJwchhOI;LGhZ6]H2Ɍ=1Wj6yc%w>~Ap׳[0ަdY&))_EE۶mŭ'$$0p@Lhl6چiHBF^l B] }#-\[}D^ ;6Iu%u";gJsFlX[ `pHU>.;O|]H`oo${$=w*kjP,onŐ$7/kvP}}M7dYC& N{B@,䟒;*v䟸) @#1L]6cِM2m?aQk]TU7vo`(((^oA(4-]H5M-0Mm_GxZa]C L2֌~~6OԼaybgf{Qc$Ip0`rrr:oFuؾ}{6sssjyŷD*%gp\5 9<3?o&<vURk]e H">\vcE""YGD͗RQP+"K=5`2[0ufel23hqw?zK}Cs/2:4cRM/ 9|bPoxjX{yϔoY֥90g{veN;3|vl?S]H+ISfgld fœ" UG/a?g Ӵk|5=y[ \9z&DV3yd +¦Mضm[LoXd{Htt\xF}D zIAt3UYI ;o,&_7MlĈvca@FrE﷉\L{hJ(vνA$egՏ7%b@Ľ0001^wk"'. 5@8utIB_cnNۢWZL#9:SmA+R[_?d[7&q1d`>ᡇc%==K.Crײn:Ǭ+K(z&[ג}UD"ͤzo!J:k*ZHbB躎(Igp~ =~;S=_$᫗[WܐfM6bS41j!,f3FP';b7aSY>Κ" {jŵ%j* Z,fpu.S7!2VRJ+q$ Ʉb!99W>#IJjp6*?cdr|wb+)wfL- &Hu-"5>Uo;&I'h7!_C5<ɠ3RrğcqaZe;QK,T'/ yض5Hb }R4`~s,+ԑ$]#-}`!_7Q#%Y&15X,֖H4UZz㧬T\+&)tJ)qұGc2HIIaԩ|g-C gذaQ:t( <O?bL³y_BSI;\!u`ԗvYrK" IOOGuꢪipٗ3k(p$/R}5^Dbje&Z<>Ɩ%YIKKcȐ!$'w)%&t] X z囗E'C*|QD=G].m{8v ?.Q՗ %cb]5TCUd' n(Nr5q8"p@5ƞmϠd&cX^&uU;ײgշY {7Պq=hS]b@QwiLAS`FTn_ܞAc$!dF>% ]T ЄZUHJcCC@IHjag_0Ao?JuzKϓmvd O=Ű=z4?yV(?^z%hykjj*?9cX8[Ԁ_J4R+8 'pYftRQUy6s甬[ĨY+_Ob_9<~5?~WQYYrFv{bJwlrTVçOSSZ1v1fw]0 )o L-'MFj.4a8vlDgajQA?v`]$IƕWZ?N>MU/NɆ(߼m+W6*A4T5$h$;4#Z@$ Æs[_IŶF`HCDњ#F: 2@$T$tM# jTUGXm6ҳ:|l2a(i"2oeׯ擧/o r.gWo8餓938c9C[ M裏xczM&ru~a*wmGWB誂R_{u55?P [ZPgoϢ0O<ٳZo۶ s=ǚ5kxXzuX8ɵ>C1+hbKwwסNə8SHw୯bzߌfw9T?|̏EU}n$2ﵻwQVE4oŒwO_5୥;ĻtZب\B&ᐡBK`n=nD00s\ж_RM)i{9~]S)۴di5$ ݅‘Ưm t/)ZL:Ek4 Rx }~ڸ]Xŗ,v&Yl6#2k:_D/d<&XGT$9$ Q#h6  Lr !/0YqbotM5Zڡp}/m4pi9Yfi&>sPC4{-^(5w^BͦU\pr饗r}Lhjj[o[ov< y/Wq-/|t@i!:MQhA`f3  xbN;48 ^x(ʺu83裏89Yb7t}]q:[+9o7 C5ꊷٹ3+vyZFƬ䠪TGC.J7ꏟ t&rOD%ź/'i aĐ9zPdIF`b)MM(D{# Ę)S:MHJ=FIչɠk汫+XjcNcɤ={6O<$P+Ȏrx܇z%cp ر~;OuVyF8l>i $Mj>JS}xLƸzhw}gɼ1c*7l\|@ff&SL㮻駟!:U;ͣ 7gJf?@>|_Dc垽Jim>h|0νz*"v.KNefBζ]ede$SQUϞj*(, q@ݻwСCIIIIg MUb]{IbװgշTn_tXK{Pk,#'_WfVQa&k{'+ZvHt Ɋ#+{[dg "MاKz{m)c珟N J2-$S0iFR0n50000&O%K)߳C0@ T5blZ_'$IbШ6K;bIWE˂A+:`83N%O_(,,䦛n⭷ FxA̙ÙgwI'<^ZZ?O***ZI39gQİ#yg)ݺ<>m۶}v^o6"ϙŋ3{l{lwy'Æ 㦛nUY꿙qCtPG{.Z ,IbIK<^7ղ)߼^ē/DEuwTl[١rF\L?h4hBSFEsrǵkbɪm"ن;UEujkkYv-Ç';;yka5 }GY^@~0·EO 2Dy t`V?,hD6Afb׷T.jjY\h*.YO= /%;c$;F`HCXVΚY3=(JoSF[;^xBRPPOCƏ4#d~?|7-*9ꁀh4z8/v_LMM +J5w{'h¦o^o]S7e لj!#-$i&iы s[4VᇗEɺELޫcW>>sbA<\78f]?:Y-eqqqx^x-ߌkټy3'Ił,QNa'130 p|V'w纳?RN"pذ=3Q*/)Naf@ٽk| 83n]FTVgޓR+VO]J@~uX =4B~&Ŋ3%8 ~6>#ASR.}\SU13IT|J@l1#&ddFGd6* (PZUUҳ +j(Nue?xw䩘,L<ロ?So36^|^@᝗1H=:W.iVn=P̫W\_|5;3-[p˪U#ׯ7x#ׯCey9#e( }[l>k,˖'prsASOn[T :.ʁceoҷ"2Yɜ0@ғIOIc$_&9ɒ8h`kޥ7zZn?~F]6z _;s 6+'͚EgdAX&(㯗ΊY OlwI#p y36n- پ};Vޯu6PSBx*:\׎lbwZ!hN m& l$ILMEŘחq]Adt. `CiT]Sʮ_0~*A|K޼'v%s̯  D_#^en=P yls~ bY-y0l/DBj;vF>dIHLh*Muԗl1Qř+=1 rFN%!3'b``a$ zӧ*AB8_HɺE17YYYWI'$IpۤIX,I'Ď;;[Zt]gѢE<#_jQX,nV,Yʕ+[Z^v ?ft]c 5KMNwΟΞŕx@0DFjzɚm svf Y% @~N:9"hzg ^h ?95u,zX..'l*fie4oc#۬GBjHO})u!ޟG_%UQ磰QFj+jP{{%M=v UM׸`|~Z%3 D PRKg1Q0 /׋dCwr2 %5GVx=:elR &;1Կff6}[MSeQĒK IR&@uS5kp=| gj6'øD ^4n`w8bnT%IUKwbnDdY3`ʔ){ߞ}6g|$Y]ٴ쳯ĜNII >hV.O>3gƴNqqq>1cp衇v߲ȀbpYgƥ^JvvW('ᅬZ<@bbAUo%3O7M28]s6ok72~䈊ع'ϜOwvK>1EIz>{#[{KǮ)!V}XnO{.wE-hҨsUg2~Ԁ@_u*++L.{9<#+v?C 6W89$IVVNƉv ]GU4Ux擘u4U  ^bT5%xc˂w/pe!dpf3}'F  s)yv'&3D8q"o6Tw3<M4 #V:|p.r@xvi1 *nV|GQGN8KǴ?b緇IMN;/dPQ2 QC 8V5Y-8{*\x1PL+o} -:=~_c {VϏi%/:D'{J}˼Q-qCnMh >l7 Ғ\cSxK]%B-&qOpIV2%k؁-ح>ߏ|Qq04;zj(FZr&E H.-3 `gULvN2._8G;|(X7ձxXxj:j1cadLhO$d9Nd&w_'S{c FWmV$ %g~m߽S1͜}ٌ3K>viZ@i!|kk#qT2|p9.Srr2IIn999{J?-uŋ[ol/a<$ v)^%|9#Sġ6.fk.&d'/'ۉ;zi)<}矙4N?~>og\v?:Ճb&!~BEU=o|eYAn9Y7c?t`?|11;w6[;fzl/K6g*i|3Ao[?O׈,"OTeI]]1R][ ρGmKp{'8pИ$s{)ݸo;E/BChM>]tX|$"Q4WBaRa$a``f7qXsҐK*_ė]Hε;n8 ^Ad6ٚ"AOܯKٽ)f#ꪫzOj]x!a4$U1ϳX,\r%NsPTZw|d.dfRbMK$HrqOk+vՃ5Tymwl#I&縁 y*F7 Y̸& "-_#޺~G¤O#uʷ,gS z_)g:}x9lvÉz6,%+Pvn୷+\I8󩭭GyUtK.t3g2~x-*A^}U>nk^ iIS5=Tl]Μ/bs`9::PMYa'n]qWḘ~i)}Fm@潧Yvc[vDum#x[yf)bۑ$)ڌ G^by\P" f($IXGpɟ5J$:Z b"g&KvPh! #G-œ0kl# gaf"jWRz~II< FIϿm |Il@Ss9 :ȑ6Cr!i^wS2*^O:kc (Ub\9 z;g:o}% b<~yF0p@ĆZ0@[F?lʺu7n\[,jOݻ)((`ɝ-6.˗RKrJ֬Y!xfZK/bke#(@T -#Ŝ7qg@ Xٳ,AܵebTYEy=7e gd2o_ {kG,atZ6mڄd2u*Af!FLa̱i4x뿮 'kHARXQ(%u t/;6T `x?Hns5B%ӑp]eƈ Kٲ/͂gn07%9wʼnz$4G`=:p7dWl~!_<[, bRzP-[WnI @ ~= ^jan[$BוU.f3tP#%-znEy39#Zi̝;7 b H$8p`T\9o>72o9-ENضeo?i?hBaZ82";⿷_¥;&f^Ņg͌YQpڌi|9\r7E\zS<[+ E~_b5Ø<}:+QH>jao&m,!n*,{.|/n/d& esW3d ۭΜmg /Ϗ;Ho[>Cd;v`ڵvXkK/9sDIm6_~9Gf1Us N}NJϐi'1p\_ ^O(=Iœlw.CjߞFq2i쐘|g{m/,7OKn5/&vu%U+_2>e#䑞nE!9ɉI>Om};yG)Wnawq5 3,@*3g"!F0ͨAzeʇl0ɢ|X)u%1LLVf`dقX]IXlv)YL>\j&/᪙"zǽI0ܱ?k᰾DߡC>Qqpf#EmaÜ|u}_U;ְ\:oyן5/=SQ̗hp?w[aB~tb/ &oXRp. ,}wVFw1koE+y\ Y8li}v>A`۰ęWKW jq\},\sU -˃%VZ(;idƌL<̟A{v@0[o믿 N'wq+Q HDnNx=uB>7[s5%!օRfATʜʠ^Ğ?Qcj*5ϗ߮bᒍ1e :æa^Q5 *Yr _-XŚMmaL&de)b(֤Z0PX\*NV݆j崑$-9$').BJumeu44zw(ڢ,R:?3ATM1BXM!d-4MCuTUEUUt]oy4MC4TUmYPC{HH&"뺎b E<.ɘm1ܑ(fXU J'[IspfLJaQтAh ?)g7BQ- ItZ̢p2PHEſ<7+֕=?ಉ /}U%Ȫˈ#&1#~)lcJ9 |O0]&iF@GH kĹ尥}0J0 i]K`xjY-d&3fSiZYqZTt|` l`N52lP.ɉW5MIQ衤=el^*Jko T{%@^rP6KL@ּ_c(*:$ΗG 6˲a9< ƞA ƞhA j^R͆OK7u_bŪ h  K.&D$RޙYl =<^}aAMH&3228ddt"͇ @G/2|D/r $u#obW}| a0wASUk>y.o !mb1y m6 v|St+zڣ/*? s7Ɏ~$ k^:7EEG#rҴ3rp5G|l&? I2z 0NV{썘 Ķ'83d9S__'S><֭CQNÛoLZ:ɓ9S2eJkgL:plɩF~Ŭ_~f*.~߳iӦFx*^C}Y -0'Wa$gyml[F[xXUvbYHMtrqحL2 ՂfA ^_Ǐ?(*@]QVy~[$Y23.5(U~5Uj{Gm 9cY]7SWd Mt<{yR0YX6r|u@dž=O " US&MFj.8k2]BU4_2ZRo5zl >mj 0x=OϏjTu_ș10֟cڢ-Q,) }*\QlM"Sn#x+++ϽSd1th:;R?wUK/?R1b5Dd?-!3Uzl۶#{vsmsωveY8v[inRuVk^z%.R*RRRzCӡȑ)+*JSwy$6lв\$;2T\VpC8:X*d$(LYeA`POxK fOVK䤿n)#A_k[ɽ& ( 4ℸyKV ٗw4X! ŽNE)..<’ܛ/[H3YEuqTUjqF ^d !-. Xn'|r믿^{-~JJ &M裏fРA|'|y1A]T?ロ;wc;ªuV"~g(B(ԚX9Cy'Pi rlƞ)!J7.懗oh(g'OqY=/j}`6YϠw(sٱf"7t^DücG;ر,Y/c$1%yLS,|]Қc```FװcJGƞ3Kr l$M4M+M)UUU\q|GQ1Gy$g#n>(*Q I&,4]A4|>oqfx(,,[ǥ,_rT-={[g9op8پ}{999'uՌIe"i:`o]'Cg(xjwTG%l؜fTE[$QTMƕn.2JPCS4Rr$Xa)>+aHq1 wiҭc$A&P8 М찈+I<9$H&,_"y"+@/;6M~xjGLKOcg% ȧ6Аe5R|M %”=nW ǏwN$@"ڝ`ДQMTXrH&ZB3_?^M.o<({5%:8g:-bzsz"  q)HCy!)C~#300%b$ z RAnFWvbÕKCya2]ٱcb2]2{~={6]v.k?˗FޭV+cƌ=gqG$~\?\'vlބ{1, } l߾e˖b 6mDYY|vf?I‚ NG}N8]v1{l***b7fՅxq$g`KHbsbKLi%-pe;Ԗc9HLC<ԕ{ДقLH39[b* 31,Sש/Ώ ژIf 'lwҸ|>?ųy0+PC*,zj<9#2[n l_XOЭ43 )$fl7aO0cK4 !F)NR\f$Yt]=k-4UGSt4Uk}u@ WU``X:CR*Ba =|WrS#6}YʆJh S&HFDLf*ԐPP(~2Ak QB"%$mTnmlipmxpK]7bƷ*?%\ W:\} fB*&2c *b^O &L(JW Czp(D0:mfSI@zQ}{ R#Ni'MUF&tW\qEcK,iyL$Z8 n77t֭kͲkwMi$#nv]o8h(/dϪoAe8H$ ]Ӑ‰IeH ؝8R2I7$kٗ# q#֬:U;t@%[Ef9v@MD!Y|4_@m,#8d?k}W4},݊ǯESJϨY ~Y ^Õ[ugq+QjkkٺukO@>|yf͚G{略 A$]w\R <{TVV5i4wyo卍޽u6AIDATֱpBVZΝ;ihh4i#nޖ,x8É`0Hiii!C$>8J &dkV>A#lXN4pzޜлޒ ؼ8r7@YCտ%рȄꪨ9IL S(#n!lɋj}MXTmk]@t A=`j:`%Bl[Nְ$F=̪w 5,v[DC*?vqYlTy}Qx's|̲b!iGC3G\ #3R蟔 &YLS_U ( AU#ne5ce&$% r}: )L]5 &A_Kp RH_51 ̐ i H+Xl`l`=~%>;j@Sßg֍cQ%9B`@9^^x7M;O 4}  rmQIi<0{|?9+SК۝dP?w5J}-;m8B,! fs@~5q0dLu6-!kL05q P0~3qd.iYx7oӧO6,X=g֬YKs=Q$1rHz!;tgIM|o۱ZڵUV_b vڅ! ]0YXhZ>]s3f [~hIfXV.ٺu+=8% cH? ј x6³qV4Ԡ65yhA^D$: t4_~V TFrɹxEhNPP4)o#R)^[ն#i {;0 Ut IzJQYPU IFSű;f&KgXpIt)^k͂&n3z@!P܀NJfa1RЏeUTx|Hb&'ɐ$Js)w{%$D'$ UVL4]`uy uZT•u]Q7+Y蠆 9\4xq[sfgRk]˵P+#Kҍ9E?h1`;Ѹ/ŽzQTpp]wa=ٯ_?9>C>hN:$EᡇpWzN%Kc]5Uowf;Jlcd6գ4գi1ɍm3"PdAH;[v1*<>]LdiIujf$$ۭ JICǏihHl&'E׏;B44,&IuEqMON :`oK&-'&^惆eHuK5P5e09 b%̒)s{'b[i  clㅗAByEB7-5E$EZh{&`YcBX;F,?"yC3$I(x]@jzN ,"&Du$*mqqyO :t>[+f7kt­tɅsB~d" ※ů~#7o9k)Ņm`m1Zs0:2^LI6oVԕl3| :Hxc5$`F;~4jYr%GqD*w}7WZ.2'p_`x6O<eMs_)\eLGw}BX] d$d";\.,9X<[ cCڢs=Do#w8 80jbo+$;;ŋywϗfR:ܥqIzON-'PZHyƥh~vmƷm-=(5h?Z0@>,"N(LoGBcx,EQ5W$ag\Aj}dIi6/щEBIO0D$R6JOϏ7r08%K-^?*kiΡb.@PHeO )HrWi7z(s{i ZTlINrQWn]  (b4`J#Ê4쭦͓'F p @+3ȱ0-Ҝ`5 '7V)ʎz5ka7kA`QS`$HNǸ]P ,Aɲs<ΠW롼q=!X['Ocƈց F UÇZ'uX8z}Ⱦ_Cm@JMSl,aC{X 5XbS-M^l2>8 ܒn77G¤Hfz06imo'Gt#`k$`X @'AZ*lYz㏻7oof~3e˖`⢋.n#52nf'oD$1`|I.l YdGg#옒R faIƔlNЃS#MzX, Z~n6-(0r/ /TSAoǹ]w6 >?B 8ɇ5ۄR[E3 Z$${c<$w j1ӏ?uLNf6mvݦB 9ؖD~8vhXUGۋ7!Dt]#5)#/ P}Q9YNSpIZ0pv;맬K/@S0HHb>VIHIrr"}]ch mQm LL"`J[6sS' D#Tן CTaZwhlq7 {0r23 -^KVl_ j? U׷EQ'2L2P@t1px1qݵ ~4~M>Hm Y5aF5c;AŒ@Cc5:JPPEŦ:J")bnf‰J}tUÿ`I YI^9~$e[++ھ ~ ^Õ3N׵z ͕̠Nrǚ`N4>.㎨J< 7Ac{{p8={67|3VkkRn{ؾvI" /3m4/^l[Ҳf:قls ;1900ebǚ9%KZxM]CWMb@g^_|~m˱rPp=T(iZ0nd6y L<4?{/U]OUu9yFQI ``6qxDsP$(h&Ǜs\8] L/}Z=twu{XEi;ho PAG>& [.M(e-'.C6\FQ1t4uۮ5iwle<* mLŔ@ 3F69`9)!aYlhb4d2%CdD C.\|Q= h&AOC "!Bfw'{~~ 1Jm+==w=\tlA|VoF\RXNGv! (,[ x3H`_?|q8>6몿0tOGoGb d$|HY|%`OW^?M|XOt_=/& CuL턡{&!5=ȁ R1뱔Xi+mO1zhu,\b&@G2L[ |^v#v篥]7!g@`E;F_\PC g7j  p@(DH.?7/"rؕ/K}قeB`OAW$DW]7cבec;LPoem:)fe;_}w/hBe"R%j#66#__bJq3}y!6w?s]O3zw'JUtVP 0 fWlR6-ZG'3~qSLE,i1Oot5S6imlGmC´3lp/q} A(˹`JsCJu_%0#LC\e=+Oz+{/=ý>CI,VAHEG:PN $>C7hve7\k mdG? u(Y1A` IpnYjX }5٣N0܋|^Zx)lZ*r$v)yzVn/b q;| WYmRU-ʎ^c!`iRx Ip0ǯ2/0vM]z旾sN*I%qqTB ~a@ )@_ZWZx衇^/%jcXc|i{{z_U%bi5VnkgzùcHp-(|$S4z$Q'c8Xo/Z4nB^rf^s_><1qLVqRbObQ[5B1 T@3 pϪe\|*^zf.` )~4+xg^ O`ۮ<.^~E}ujW?k4Ķml[5և( J<I$ [2U3o^ 'Jt J'J>s_2G9L!tD:awD!07"1W ɢ 6/Ur] ?EHETLICa,7"߅92Čۏ3;Av\ϸbg9HH`E;Z$@`o{B%lzlѲ)m 4/mq$zhLZMh2/4}gÍo^cPC gj --aw2V_@ڋpv'|={e˖ @ޭ_xᅞǹټys[o~'~QwQIk`ٟ-de$YtQb{#ya!i$HI%@Jviv U5Ϗ C@kuatp)KWcMD  /000P8q*N1zL=ۄnr˛z_zvtststsl G@ bh>BpO`_e]h~MY7|^{h|_] vpܵ[" Z|m VbNx2,|M]C"y較&HMn!$cSeIڎ2[8@ ~bo-%{±L4vZ 5P5,0=zdt|gBuz `||;3{n* %<>Do46oL>~/ EW:Dw<Α~Cpv)5˯$VtB!|ؠjD@  |X,S 6@ L5ƱЏDlڅF/H|KZ&B^3̼Ǚ\45BÕxhyw0K6z-/%p)Dw#P4a3t6^†Kx˫vɤ 4t].D׵,Z Nqw~͑C§ *܄7*ƃ5/O./X݆6ω*mpL2&UC`UCw4s%*HL!uۼ6u+`٧Úvxj86f nE ?t =佪Őv`r2ǐ9 ?7v)hR;// ڊċ'g\O>ZY_h n pacs i\5o ^D:6-7rj| &ٲDy ZR ͒*i @Z#%tdo,H|4`RƦ1=(Ҷ=X^Dӭ{<#9CjC-PÂYU{*}V:Yuxc%4.m{w!)TݺukݦMK'硇) ~% 8$ hzSt"=m8gn91#UB dޯLc-Oy0 ~?67,th\Ub@? _ViV;nh180fbk٫O zj7Oo?@(bu჆-͠ZoRh} v(?뇨 jod.[U:XFۛ .i}#fQ8drE"Yk*^ۮhkڡ%a P=ISUR)ɸoBXL) h ) 7 +NbL}d@xHգdT+@%LJB(ܹ]& ӣ2SBFK=3;#a)k_-ϾLev/HЈŚ_æNGIE'tY睘arHo>L|`NuD %5Fi=’ז+i#6IYȈ,Mʙ!5 mpfbUe}H@m-|*l ( U <;n4UC*ݨ6vAWy0Yzƕ08ٖ3E>D@%C oL #v) zhKXhyUs'hc|SၽsFJ'-5WzNZ O l"TH D::1Ӡ867/]B@׳ hrwO dB.l# c%e#~GRFޔ |PC 5E-PÂ0m ˣ{."is%UpӞ.HpXaE9𒗼dVܾ};[WT1_(;Z?8y8*Jh.o~3m Be*QZ[ C܌?fbi)~qsZik.>>h(SqzbxlX0;{TR`*sƽ .[KC,`(fvxEWo"Pikc}Cfw>M`SǿWV"rJ:e:yz A[w3<_1!yǶHE'7E#X\A›a4yZ}ɩTaxՄ 3_Wd:ŧ_x/zeeNp$cǧhЈRB=G=ߓpfF#vbVl3 PC A%HZ }X,S̄_b'tד@QWF aki"^yWoD-L?W0W.SD zoӳ #GwDj5kv/|:F[==1%RCcY\՝9u!E>$ ~IIiAL Fv,L[e7]ڀ94Qnzб|` 5paAD$bG)Rqs/~)6bc9 ^x^V\ I };::XjUWuNNh_r[Al3Ahe7^L`:Pap4N2519ҏ5159qd*HEJMgRoAz}0 W\q@dn( %AZ r5Uҁn}K8oQ~<*z4D@zB:&[Qa%xBS}vW!7]&J`'>L \_}؍&=đW7_9NU[ppPQ LAg9q?ۏ@)Z.\ujy>4p(aTs&`}@f_) )훮f 4A:Y>Bi^+gwQ-+p<}^u҉*p^#焈5kKBנ>B7^˖fy] 4'˿PEb,E1$rD 'B_@h:<$'o%jO5,(@aqZ -7ұv G-X>22s=M/_p*m8r$'Oߚg+ Ge/%rޥhƑwR Q>̱!Ad*J - iI4İJĦmmTA;?0|i}*Eq+Vk&=6)p3ViVxR /] S38G`zDmMge3#:(n#DSTgXȃ.RReLZ %_ j(f,iKWcsZM]*VB}{T@4r3e LG`I#T-j ŞKt7UwcK(FG#G\دIRp+7`4סm a*:u5_҂0*ҴE 0U;[.  6q 4*՝ePG󓎦Jt ۱i Gy |FҶх<5WqBmK)j@c|鍑iZ_L<+GH$=xB h8i`ߣ*F zHSuJ ֪>w=ª_FuGdSfvJ%i&Pu'Z@YaJ0#>Rr' | |Ui{:knڤlFppH Qyswa;j=Ag\զZUAWJ*!(G:F; kW3wOdH)pA/$M86+[Xue>KM˾o35bG˴$b6iWY N.i‘M=񑧶r`r߿I*j"r^>JKbOO ۤMh~N-4a"5jgS0H XN+.HKSz)%?0Ga|eos>p3W'c? .ZH%wiAh T;:96==55f 'D),WIT'ÎM+t#|KVp-4˫eQ}/1GHʃe&ʶϟY6hɣEOϣ$0@3ϙ{v*T@/|:?> V^FnVtg_9sQBڊ]u4N Mj|nVt1՟oTB` LH[jT^XAbD*0畴h )pȌ]+龱3&q aD '.ؑ;Yۡ!˷4#>1Ƚo><[脉c:+ t[3t~}0|1)HR L2{VP=!ʻV_Bp+IbjϳPK԰klDQ ƳA]V_*v_ȼ~⾾>o}5k t2'=:uzmN|i{g ۶7k_Z֮]&8qcA2ԂaK񨲿D΂Ƀ8-lU$r +M,;ߥ(Hs%ܗ0Fw#{g3 ]%[BJĘ dPh =_[mbdadXj2i*?2pD`Ejm`?pߪJ8 &HҌI̤ݑji$J(Ÿ+wKI:1}FL$WocfK)yg?Ȋ+ɮ;~8tvvθp8'%t*Q;hlaٟ} ׊tTrgGK( /^2 hMNR%tF/N\-3lm?p@p$ ce( &+%7^ǞG4kK8< WCÑM`dZ دbϞCˀ@ e}QE v7B}H%<+䫳84ZL/)B#Lv{A>7#|: A5W @brrMR}B`O'l _{# aFNyw,\ToQMϑ@uq[\Hq#OWýG`mZ0b8ho + sLQp),(C5<ڞJԂ4/ ){ Zᡇ Mp2I!z!͸oqڤ,{r 8(q)`4ϽtNw>ȟKHؽ lBX$v2#"w:M&/饩n/\/әB,]w .!T &!D.=~@/t6d4\Cj'q{ϲ'ć]\'_wRI:4cM;tĒEoB MDa|Z2Բc*ݚÓX190&r?k |-[,(f?iړ>3{14P %&0V @n^؎*iBHyfMhե5AޏDf.p.Y0^>B{H)Y7~bG ^:ja8ϏC״\\_GПD*&a7 }zQ&@=5?zRwER/FWg]NWY?ڠ#h*!8$` .'T|& T^T֨ ߴ!e)xZ ar$ (C!_ I'b2ϝDA_o7z _fxߞ4=;&B|_Oȱ>]HG|qx>ϫ]~qyj+UR BM_i@o {&uxk>, KZhyU-9mx6v[PC tF&C }蚮, />>?&*E)eed&*>DIJToYւZlat?TM7~;♟| P )%[ne\q9G)Y\ɤ{zaBϾL,Ҩdj-+6qPC g>NLEtaQ4xOinP''Kͭw/Lw3)%mH%1aO?}3?տ|⑇IoTp+La'*]S8N>`GNM`F'N0Ix$a+oJC m#C H,\.(z !˯rB=v8Pm72& ɻ-t.2  5b7u׃V׺9]݃+̲|LχKH`w/)xd´a2&u.[TlGGj);o=mC~jw<^XW |km!qZ `)ou׽t#.;;T"0Bи}㥗K._H=I9▕;}y R!e['0W\MRdtݏ5Pp >|>Mhh;_MS :3$~x]sK28NA6.vTߴEKT'fϳBi[uCH!D0p]wlذ!{uqM7vڬNaOvN"J~{' R'b☩\=kT/imtsHPK$O"{I4Mp3k%3q/2dTϹ 2se%Bн)?@ [weָxE*%h'`WL!m窋&尩[ByGC-EZ6J]HXcȷBtE_] mo>=/ݙx94t]i~4tG5@C`;z^t#yj+;)T Wgr:BH O` 3{W=5PùS#gY_ dc}U>3-︹?m6t"JI' 7Q- ىm$k49|0Y1/!e;3nv ֬Yaif_Q N"Fnb{c1Gfi-lŎN2r7z) WߊY\O%g$bHB&N*cMbE'I`{I[^HV6iy-n^WܪEuq!}+&&.'a9af~)KM(=}?"}7cp 9 b-˕ْ XڬSUU?k2mqc?dɽ\g<މ /Yw}97/N1KRJPOӊz)UK}Hi@\HKRqix5Hभz L>Zj5;j!Suߟϣn˴ f>?YnC*V"~?"c[io*_ 9Lqlp]w188 ;=y[l{Wt>>ӟM6Q__訢Ŏvn>ojIxkl #$ `82ݠ< 5;8|LJX?jSA59J>A/TxͻaEPvq2 uۆTBmo6J QH2LC: GB!bd2c] dvgNQ[K>(:30 ?x ׭K]B2`"GGUe LtBr,Q> u $9e"5}~B?-)H ol$gp.;d\wIF~'>C>鴮8VS4`i9ѿ+򮟆(*/uAX/3ezZW/NJ3:2IS{xxT*_mۼs\63 _җD"7M,]4Q/YW!3GLZ&$'y ;U?>J⤓ KZ׽3|*-'e|]>OK+1k6LH @tcqka5`˄Jt86D2t"#kW87H%KXv-m#Ⱥ?;mX}„"0o p5R}'%z! r;O*nS>mu#N0Uc1>p2eX}?{:%p X۱tUm=wbMcEOI@-p7'>Ò^к%,@ Z^{%vd ޱc>jl|׿>~d޶^M]GM͜xv h~y0 ۚ{7mmc*IiF kTeV\`N3z |wx `{yٿχ Pf=_o%lhzFR6ӳ YR&nңbi4vń@0Lt} 8p\p};Ԥqnx'U%$ [o.;wf,C2rwlК>[W*p+2ĎNa'#}$O'=ԇP]/Me_^\ :ÊG?F>z$v+Ҷ}_$ɣe7ÕmFaQHDiNDڟΰv}B#k' C2ąªC[7y R7@wZf==B m&ܤ@~}'' ?t:X61P__ϊ+@u9RpT L2ek$JPl MpRz-hQz:Ck"F`m'4 ~zf?WyunW]Nåu)>`Bеr^Aߞ'3eľM aDb#ton%:`4`YH[ltKO]'2w G@pYH F~(#Hs}w.jō0T߿eh{ŋWtMIg_qTW* {Py i$Sllry(\f[i3E(f"' eY}}}ٿ-[|XLOMM|Tߟ :?q^W 3QE;>Mtv? o&b=M\ _kzTiq1̡^̱!a̱!EߟIpQmdQidtZ|5x!pMO< 8"4'b7W>zxnoN*. !_S|Z,c~!}W\Xs!rc`Io~tM6]ױm; sq!̺ѸMn 5Mg%J!`ٲer^pWʏ 8:F3.] /e͕N7v@3iΣ4tI;llQL?"*hw}jxdCKth?d܋ BYz4/P''aUcᄢR/dD <'`)mgG}f?TjP^>͝sC 5pv%L߿/D-ADH}Wy.2U, ]hcb3-8Q lַg} w hooǶm,,[@ i :riHLO8~tD CԡG.C:JLᤒIt ')U>]|:!4#..̛ mK}/\|T߼@J̱!L>k zƿ2دqҩ#<crvBh?w?B,Xu0\$Ri:4MRifikg78ϯn&/>0uLOOi0r@ HJv\% xh/@W#i )1Йh@(`L>ngG_I|Bh}ӵ,e+3!rjZ{$SuN&\8Ur>@X! bu~h$~嗵ӱIPC g7NJ@Y3}Zu}3D ]ѿTk(X׋*Зut2@A˿>L߲,鴲~ 'Ŏc9MYHǧ abb``0'> z{{ 0x^G{{;J*"~6ג9Ǘv?R"- tgG2~$`[xF{Xo q} RVlB,['#ޥEl6|4^rZo_0*PϏ<f6t`{NJ,YSYڸ-gzzIbXAo1gHeY ,I0:'FXw1alIߢTPI6nۂ xx? ]`uJ4O_@CHa0x>Nz`¨Hb9{7[4x>h$g 9QrfOW-,Zg{D$~ìi)GdϻR_ F?/m]$?-+u{{ g|*5eh)m'I!pWA7G 5pR χi*3gJH Zh\?S v ˶U*X@ HNZ*AK!U|/}5k~~?r G l۶_WضdqlKn31O`G橦?k@~f|ںq$ؙ \UtI+S}!LUY~RbG{v& SٍD. _K;zN JiF~ :V~2B\tb&3-!Vt;S^!ZK'W#=ýJsmc i6YѶVBkjUB k.D />7!>O4J7<{ rX +[a}jhҖ iOARc+B#?~x Σw'M!zA->F_KR:ؾkeg~kZЏ^_FG6ܲ} '1e@A֕t_J[@R!CkhÚx]>'~BP߶\w^PC ,<g e>gJ᭳U& P 7UaaQ lVvyV(W )`N՚Bgg'6..][Z[[җ{^nZh҂aH=A7Q $g_1N$T=P/Cz&mKw-'t5eڗ0Vɣ{3Bg͈^ +6@jpUk(_$폡Ch FC3ZqǕB< {=g5ˍLud|3(/S}-]_Z&OBMU嶕I=" ۄ|nH~u:?/"O쇾*I`)Qi }8Qt *IʴŘ6A0JL)7U$7&h~3FS< g3g1+rgtŬ mX:籆-!3b9p,ÒU Ђ[3&V:kfz01ctnjeu^'g_O^MlAog!C,:.z{YskJ5PC ., __6k0 E?3-d&h9Zo M$NaWEc^ЊwTwR*lmp2#}.ⓟ$_Rc8z]JF\51LX:JOQZ&OZ(RElY?wbG==!q-pT@aˍ gcBhhhf~A_ eq 7ۂc+ h 齝!IPhE d ywaד\v rнq+!6 _#U\mp[`!y vVLر$ѧ3|p'c)ut,7V`(7ha3OZ:fc,|{KG/lCafh4.и gKײ?Cb8΅@o UPC <ladZ˿$'D&@PUZ5/>J}q$fF:  P,c+o -zCC`I%qqZ:}j$b?pC? շ|K]NϹվ?#/HOcc# g`||q0 [ GW t\j8yE%85(喉x X]> TT@ Ck$dJLXSI0jJH\ }!E&y!܄|~QȾdqkaejܧ)䯾]Vv5A]bCȽϪdREw"mshk{1DZ㩪lՄd-hyL›W" ild9Ƣmq.OW3`NUάugw//R='`<PC UcA\zz__ʿB* `GЪXE*~Rm-d,J<|P,Z&4ΩT/mg{#ITtAK'%oT 6_X@n{PUsuzikk[Р]ߡC:I삑k%\~a GUm[VfZfZ8g(?LJ㥓;N.1Z-:hJX>){H'v~ pZ[[Yd ͥZD,IuhFss3֭#L2::ZzDT y^}7쑙0t P1o9u&ݫoϱ']4(1՛7BasFzU:Yj(}ڵX42SQ@oǒ}Ϊ*,PFg aLLDg2tE ЂgVXN =0wmxjx5u*3 z4d[i&wTC 5-W4&P ~]ˣC(' 3ɽWڰ8)9­if қc[8Vmqm\_BQq!T*uR/W};L8}0p f !|tvvtRe1::Joo/Ә!u:VXAggmO*-8 3+d 5 o@O}ªU֟!Or@ 0Z1)K+䨝 . $q/rȧ}&6P&>j_zI :0fҽB#b\ :tmt3O56RxU=e#Gw-8kJY>7/WOψZѿb|y9?/_^qnW$'Q"J/}+{!05@8Y.˲ vS -m1K|սH2eֵraE8(PU~nww7K,!,$9v٠^4Ylɡp84ƟN6 :E )ծ]uw܃; Cm&TNt`@hMi+8&R)q!>dOnͽ@JsVv[\zgBD*::xAf#0y B8)dth 5k+N%[WdBv5PY9մ|꿖gW-]xQ_Vb_kB3=l&NK}1#A]w4V:H& qAKK P3_ s&O0dxsC%Nv5-/%gnzv?|̉UҥK JL&g``x< ---tuu24P(D<^=I #%۟Y8GQxTu#^~E?Y8ƞ*P !466f)7>::ZL ?׿|ny?0R=#L="fcHqdj -,+1qu00T] s-Ԃ>0uUrەVraȖ5 `kI2S x䔎t#.de|h()|:B/ϜhSɁ]d 50{ *ϏgW2 ye&^`;ɔ;9Ba4M+;]W@||D3a!ZG` tlSԓ$wt b~K^KLG`J `0 28D6q$  ɲe˪:f]]E4d)R}GTt|M"n{rQ8v=bNrϯbz-R:Ե-}ek]}G?.W} ._it<+"~u;~ }`ZԳ! !!tr"[PF/ф>}ԺKעرB)n\5w%+@R!e0-nM:1Ho-PC 5T9% 3YAŀsP+dnqN௨蟃#R4s?PJ`&c> G@o~Lidl|0|P%n t#ϟsA̶N& NkPEueѧkOߏ]EMӨϺx~4[X_L |;ϥĞ1_w#^6[o#y׆ SpnqJoo]{۠@K?>@?`Zy!!zZ< }*/!NiA:c'-@kJ! T$@Y?h?>_Ug;Gl/!Xl+F (dYsʨZ$& &;B:::d߮i |sر򁟨m)Q=(s3RM fH7Գ^hfl^פS7hmlUVLv"w?J磥nKqg``1RRJe :;;蘷18^.7 ˼FB.AgkafMS/~OMDI"BC0r_& TRPsѴ\BJ:Rd8/+IMeo/iG~/-NcccA[ʵV\B7<P8$އ44pe65tҕ~9緜?h( |SyN%f V_]D9')mjsULs>4]T ??r@2+i27gat+F(!4v +]lMMM oi;jp)/-5^!xzTyr"/@t4UnՕ[@#144XL]2!H6ill\0 Eπl+ٮ5K4dG& #ID'ܤu<Q߬u@G%DF֗ȍM|^U2moqR؜,S%:tyq}JeW22]O2}JlWIZB3|\#43ZRix1LEyй%d '^@ug~Yu_(;ȑ] g`D@D.bhfzPK9w)Qd _p;jG M3:(U_⿖I$T*eJqܞ|qHiLӣ_&zJIŧvQ!Ud-坛st`A ऒ0*z3?3w"ART .},&sl&JJ hnn vX HtrIOAC+2;9fHlZ%8)HőnΉPf($%Zl+M6ڧ;FF&DJܑ#>\]9x&,onG|F a߼ XDH!z>`)v?q$/Fsm J-.}c6~_zjw,\!vFYjPC Q1 p-t7{e3,,n6Wwy">>m:M9.:ϵ"Aܼ i~3 /E94 6T q{nCs,+XFOCCC6_(B.=7D.<ϸ#I4V35SJ; r&T/D& f&R- (26)eʲ;EwE':Vm4/r ,< (!$򮕖xy+/ kau,_haWn@ q⩂mѳQ._j=+kh{Ǟ <:`|PWYC,,%r 5POP3Q+̘ ]l"]qmu2șLEƵ Ko҉ɑ03!UCkk1FG72 %?B?Eșa&KިPHqN8A(bŊR-, ۶7Anll,444D]]i ,|DlZX1]"TkC&GH0!.p|_~( +-4|p./'D;|58B'$\qM0"GwO,M@yIDzfТHY4GaDxϡ@RPkϏf{TAU|>O)} srCt0m9S҈tOF|r!+W\}' yvBpu0`MMo +u/4*(uՃ#ȦM|g9P !6O*cR"/Y;߇{ZX_{f:1X%%,iq,nʩQ0w>o9ml|ѣY0S ~Ϳ7jgfeUf^m 3ioѺjZC 5ԀFuMU)kqy*.\=2/7Ӵ)t:UE׹`|kPHE'pJbŊ#G u*hC\Ja&C~ՙ|dq+Wmk$P4Rg?p)sI6UŧIdv@/y%7uk*w8m* 7|gkz4qlOHU0RmT+gx'{@[n"PThks% -}BU A  OQr\}c6MҖ5?Gs`sfXߕ[WNm}v8x` t C˟4r -7"~/wbF T02m Hӥzg(@±a{'ߑmﳗv=0>TX-t[㔴<#9hJ4-dIx$D.[~ұ9?/P@h/<ݰ-kF @I@iJkwgu~5P9)74 ?DҪA6No*lwk9 N"6>̫V^ >x`݇^B:6O~3N"Z*W! ßyN.eb|mip&8ka[]0^!!B6hj/L; OR ŋ8/pS{B)KYժ$#??;hI ?DߡSZeGzVgK6(Xn_5J{8dD\Bmv,Y ߵkWz0^_* %m_|#}/vêWp-~vQ,86˲x|xQ6L' Uý*N"#wA2H׿.Y33=7F+sC+|;)ڽW LVN 1e)_Ct\vAZ6C- %:<%8v@i"eϬ׋5h  z`TNPC 5#t=GZIAQ+ǣ_."xV=+GbxN(fKWyGj)Ĵ,K*@.a{"9=Nll2-[ *^ԂaN2xUol¹d͂󌁦0$j`vT=*A-0N Ox~e*vͫר"sc6~O č}-Ȳk6v*Rت/?<̩C|ل Bu#:[PBmTJ3ĶDBƮʕXY?M7Xyf7jᜇC/ !W B5¾۱;Kٟs22IfG"%{V*Y+@l@Au.d-c(-'9o럚QdLuVwW1o`dAxFAɟi-@s,H'!8X g,?\O/WފD( SJO߯yBhnn>i%fۮaS{ٻЌ`0(O$_S}O{\W39-xf9-+T,Ulߥ;WJ&J/*g#F.5WLN tG?g&fжy_G8de#.F9$8kHeEtAh 96?"3>%ު(ud5}:!*{6_;h~9% L0( Ekn#PjfM#י%kz  zރe/f }md14q$*\ Ih@K&DzXf mO[Pk>_Otva **8W2lޅ,6nVL+CB|ªeHd}ϓDr@MӸ+< xΫ eދxͻ>l3rl|Ga3(N¤AQ* ⪹(b-M3t3a&cXy^OH[T"C+/+ xٕO 3wsu*?{2 />2ׄJ ~f5PC h?V״LO_*yΧ5cUN^Z J`;_ `qINg;0zEb8ELç&χ`%֧ŐR"k?)stҋHk1 )eCl#~a6U):CMMM8g7XU/AJޏxL!gUkΫo:? \4EP[ S?ŀDoŽ ? n|C_%D)Ig[fQݰpS|苴'p[*ڊ~q?6ǶHk"x@<n` tpiyzVc;t-"}HpgvsYD.%3Q֝83دXǭre9mk-5PCJ*_Z^i2QAݤ[<[˿|˿B],I$Z.g8wo~G5Aſ%HF'=PîrhskӲ⁢?{Tl{&^C8)&j1|z5o߃2Sg3Ȼv"!hjjb˖-466Pxat}g5Fd߶dR]Kob֭q+6.MEȻP_@:Wr 7]Jl*eH.2(/A3J޺?XsKS1#_ccy Gt`+%F05H&DZfpx}uD.^yBSL1whF]C 5`en?3GnYoxt63/}5˿?P*%Ԣޟ,,߈/\zw|+81a o}[o/LLLTwP!#?a^ 6*_Dlll /~|BxS?3;R$ihA몦 B BE: )l1Ʈռ⯿ޔ=^lT,( X*Akбv ^Xq)/. hEˮ4=:yO5ǎW>L?kpɊׅ##~ Wl"< `[iC̪U/ N3sbW5PC 07U=2ҿXQLUeީV8\ĵK,N*|~ -LDI'm#b͕BxTmT.;X$Ca>x{ԨMB!;sD1`1%"-<LO@O @ ЗߛaټDK"eo| ??s%/O'O`V9b yPI(;-⻎x~w^o^VF`Nޖq Rv"aHb9Ӓ&螡(^rG洄2Nɑy`klV}(X<:?QBA%X)oZ]|N`zͪFa5jl+Y.䗿%ƶm7O~*W-p_p&h?/ÁgӦMsr`PQ\f S[7  7G>A5O>ͫ;4t܅]tt&V@4o@ČJGK,HK7Rk"Zxg:B_VzpaS7<rL=XU&O~9<ɡ?"H+Y%^ZsfIPC sEnfW^Oݛm1 rj'Tuv*bFXpe/˶HiEҏXъ.v:I:_ZsiZVm渇0{= ºݫf<~6byB!Jcݺu{xa{[q=$C=dBB@ mkۂ"x(9%k*8Z +f{ U^BJ.YumK=58ɣCԵT];l"~ }V:ɁG`/;#[X |g`mtki}uM ܚ/lӢ@\oJH0\aM'9'_D&͒cb+PC , %k{t,Iwt;C_bqWf*^uOW0_)MbƱ Md>| Hlvy'4IIeKQοݕy׻^{Z+ز%ˊlKx/Gt:)]k'6 $:Fw^G{9J?\3 aбv4P`mZZWQ`$nT}ʁzi'H -p8*uӭ[q#h]o!/#{bw4(`p:0&aSyl6/= `GB,4៟~t@wO -2loijnZA '] Fj*+whֳ:R0{a_[V|-&$^J+8J[Ϣ. oB?{кlwrè'x>1LVq9xg:Y:[ͦȌ #mѯuIPdϫu&L'W'Z4&dVG3לE#R *R}//j߼9x8|J3434NÜ=,#}  y%˰Z:!#dD2E&dFI!ɞ"{b2Ezh'I+WjH`;}UK@@?UL| `ȉDuf*#Py?s*\Hý{V&!c%!2 /`Ou9= w/tOo>H6!`N?_I([**i咛y}Plr.䩟|(jMQJM8MS NMu)}d~'XXxA rjH3E}:YVP `2X} <[MH*T!s^FzUkC00baM3#39TEejυF扷MAOdN '溉ުMeZK=.U5pg8.N_q-:+4K7aߓ?ooۨh3q-йE4m} o&f(Lh~&Gz:Q}eyХ! v@^sÔN9jKlp$IDAS{+ɑTU0G^z[n`NuؖPC_k_y?hY6@SWlo*Wrذ^q ^{k:ӛɆ زe˜'b%!#iV'.>J8ڄߟ~CgrέUBUu:ɤԳZ6'4iXvurd&Xl_P}Rd-sO!^ "-SӴ Y I׏#z u NC#'Ȍq3٩%撈 (˨ahX&+HJ)rGGuP(U)ARzFwϷumeOȦt?EH_9".v]!3%W࿖Ԗ`&7o3ÿXl ۶1M\:Er‹auffmttdЁgK>'\sPl/${v! n@.XtλN6E6VݴBU % M]k|@w$k_DŽ+ֆi‹[>kڵ=ݯoCtm]3?9H aTs}+L+"#=%DY4] +@oa_{uZUy2_ :΢tJÑ2@]Ǻex.^лUhnA\tKZ<҅WC=eYl޼y[MDqBb*mۤSŲ.<{;E՛Z;͝+xnԓw A-\WL{ȊHJwyAT9XO0_+蟮e[THיB}o+@܀l+dO:Z b͝G-rq}wtk>F:9w?_ y5 "D:Z:mn!=2Nj`(1T'wǘ|P4aXVtj'3U<@5yLF9nk"ڌxnb@@@@]L6M kgJ[&nQ8ӗK[Y] %]N}S|>r>PvG(<[net/eYضOp$]e^GP&j# +Oow- ug]ɻ~Yܚ*T?Qwg.J|:& 5Kn|/}e#RE@Lly8* ktM/*]3lYw,wNݸ+?"-\+Afe,бw?V}GȂ3!USzU !0C6M+:iZѩ7 7#3:Nd0D\2t\\E C}!@f̯cDڛ jbEϷǐ+WGzF}ґ $#50RuM΋;ɏ@O lOo(>+H^L۶99B0 bRiHg28!n^t89 CuE,öm $R܌8 R4ꥳ,ٌDRVdRض~.pJbMsyrd3I&bAqB^ $tZwM(IxwrگA2#gm0Lh,Z(#1 4')T`8iúmZܠ"ϠALeYرk{]xo+@85NٟTxX^-a2㐨UAjd;t|' `cͯԧR)$D'#͢uRLDARb&։Rs=!`o4en}ߊ8~a'OFy@_o8+s{"Ye w2§Zfrt3T6/Y.ɞ=9\wޣ8Ԣ[u ?u _.^pXc/z[V^{umt=~`F~+zԺo:oydkȶ#u8}{Ӹ8 {s:z(iOd,tB>jXϾɦu7*Odw n-zP ;JM\?IDTÊ,M@J钉O8P&15Lf0T:2l#SY4=kP>Nd3wK*tr}ɧ_k4`_6,E5/@7=2Nso"+pbԷÃvST'}LJhO׫$ `` '[+ {4uݖa`Y׉ Dt]T!*+' +?m>jm&_)dIP(25z/*u>{wI &8B-Z(ZP;ߣQSvnY۷ogݺu &Ź_.0VS2Ep HQWFy€nnVmҏ.?°74:8tJ+]c6^Aub@N[6a▬k+(D^2dr5LSu)kv]QG"56X}Gk̟S\UFeޓ6N:;Gx 9 ]-N#-M)R[:SR,]MT d]Jt1 Haҿm#B'3JJ La0"v6N̖p aZbbX&VXL7Pa |at L!S)d:;6##;Jgxgt s9T.w~) (yi0C|[+\s}_J˾ |q>w7,t^c3 BHmY/7 !vHO²OE8"dXs9=Nq ExF/K/#e+uFsLD'7 'Ӵðy[`Πο^%}fZj,n1Խ߀_疇a¦]u-]ԣ?~Z"1.?Ɍ' Uz@:*Yuso߂p@In?i.,؍BoaO0t NrpVe6S `]>OM&<_ +c?9>AȌU'BYk!ZG+kv.o/0j~3!+B?YCR/:LU얋oX~%1yͶu@fsˆD@J n1^@\8.aȤ lV'r9b , ö fu#M& u"FFSF8\x]@Z) sBMc2@.n"$2Ee2z=KDxϿOF(2 f)0BabX5ɜf=XH/,yƔ޿|RB&FRzRBvYa1 /_?ODϤrTLKݰP?5 IaYӽ> Aԝ_C n5hn޾ Oީ~V(ʅC.?EVV& 0#Mu=6IkLmO @-mBUrF":ړ  w4Ar1Fy?Mz_XW]!5G`8ϱT<#ŬcG3a m48,#30ģ- WoiyŅ7g(9{\KmBq0\ U,cYJs ea0fBqi(p@ R/O*4Z-rqϐ>(a@ WCuzqu;P_ml߾}q*Dh/8P~ \#P1/Nȿse ;uM%RrςaZU*6x5t>wo|QLJLraV ( ~sIzfs$N2|8}\} Wnw9ȥTR@L>H} Ņ<.wc5%kbLܨ:A`A(e*%W vlfj(!t0㺄Qr&M fQq|F}^ +i`5)DM,ckA\>&NNpIo㪟tݫp@W[|9TU|W2S0iP, c'_]w?{b|.L˕gٴ 6[er)1rv$sWg@x}^E.m#gpj-U =OvuuVSrD¡9\u_3S[R'0ÍWʜѓ sdr*pNyT_GQd Zu+ m6SVp+XĽd0ÇlRs7&Y)r%|e+D2ɑ9acQR^?`4tb:NK:.!Vvi|;Po(N*c"P*Vc t C"`k Y"*G,n67gN@W묡m@\~ M'QF|71 ׳aÆEDWu(,ɓUkVy=dˏs@S n.ϙ {_A=ѫ0p/5,Vv U)7B+KTcғV5(}=:U_`r;V9:w~.ChWT.^,x4aEKKx kaD;ۈvcT? ~o¶nMlKvϽRdJ)# ݵKϷxL8չЦ.pkл8F A`%jCP4 T{Ro/803|}AdJ4+ЁӃ:$ ߁d0 ֮]֭['42[TA [m4d~ɦ0`:č8@ь&}Cajo[~gbxdV+B괋B}]AD~*+Pe~*s @\ /oRRX M5 eonXA]<,(8C(F:/ die&J*=p>284"!"mYNN" }8s4t[.Xժ%v%;If)V{ѭ7YzS)/;UeP`J,e)x18 Y&2CrSԿad}:ԁ%3.{?ո9x>SwB_hk֬aǎڌnQ9RAG<-μ q݇`{hc{Y6_h̎1܇ɷtƻ𫴮0}眯&7cf!0Y2SJMv]&V0z!3O 8o8dY$9c=`f#LeWwͷޚ x!:ޱ x\"Thߺ"li`6^鏆j:O-q5|gt~UMEGtRٌ{iՉ˴`IIgH &V{q#R9xO?N2a-v wwae%Q1BcdG$sↃMݦq ضbfɜ5:9Ȭ?i3Z@%[L p "kMVCu HTga~[,1MťY@%)\_%Af;c\ Z0s\GԐɆ 쿔H)J)FFF8p>FJYԦr',\؏`+uiҏO6]L|ķWjj02l{%5^z耫Ƹ ƘF_2YRal[ZHfpR9p97 "oސ|zFuQ[P'<+! 5Lc?JlCrXyrbV+ZmQT_1V$50Bo2YŹ(W2vdZzdem֟;;}t}yh($N*t]]"~uOM+pҿ.90z -땦bxKj婢VKAy%H#MRC%c t ݟ uH}2mXU[2eYlܸ͛7/Br>|nU!`&MMSz V(HN:l=1zqm* ~sٿ uѶ2FnJJUQ}K' 5߳"!]q{|IeȎ%thszBBZ&^#)xrl[9\.dU'_# awtME!-&"i9R罦dP$ ƃy%H!8PTtwsOETÍvNI~~mp:5³f8fΝZj7{T&1;f 9T!VS ε8窅~>{ϴ t  |+AR%SDZadc`?LM`eL()}~L&偙)c $r + _cO=InpsVvBU(O̧ZnY[|N:Cjpf Ld_yuңatB-1w$Hii[v,ao4_ە͠_ A_d(RB#JQc}i} s e(3˄"tۋǥ@7 1ܳ|꓌>2[E8;/rgwK7O=aعs'˗/cllw2i&u{lYq;U>|7zK-pxf@=l<ο,dV{2T.joZ Ƌ#WRmW#e!%rݥat#㺕!ۚ"aP?}<]i@Zuʫ%jSSp+#Z./JZTDACE,`P7IKAo72#70PigM/,sS׮]tvvfk>pa;Vs?t ]:'XZ:߹W7nNG.Ԡzm9$(׭^W NEF}v8*: p8L:MBRx@׹WZo·PhBsFAN̓'  fHYHMzvSH ZbZbPa07̵eBlS'r]Ts۔t ]rL&x)Y)t t#k,aPd* s=JL8`*8~+﫯0azi6n0יTgA{{܎mt_fjyM>XE5n%6642G^zVl[ΠaJSwaLA߰lv^ s{~HZ_$aZѼ}RJ2u/AsW0- G..^-_BKe2f){cASso\V>=#'RiXmGòp+e2#=о8mD~xq ^p &ISr8'Ҙ# I(1[W~GT$P@psegj! k!:\(xIj[#onnf׮]lGǾ}HL455D&0J/cxZV m\=N[~ChsĊ82Pta8ރf+ li)ʹ=UyhٝN5E1C \fin2UA__GNwoKA2hA$:[ td7)I =iw| 6#.y7,[łjgvrϞmgA[[lnTjl*СC?~Wo&֬ky8fꮯ7uG(]e'-x xt!X\n.k& G1`bXB'םy*Jz dE4 ´0CA]Mo0D^ Q3^дkSX_vӾ;'|m~?R8%f8ӭJsƓM'L/EvgpvـdPB auI";c>[[3g)Tet wddǞ!; <-i.4g,48$A` ɐk(D~qP[w*!S)=?I2|IUaZf^q~P?׌TNTtttk.b!͵muO~dtvv9r-nisM: VӒ 8~@jpSu_f΋:7a˃_au{x@!su]FGGu9r/v(! Be*U%t,Ъg~28apc0~HIs\;Puށ8&aEE)]咓4Ī"=^Cضn=qQ#dh0}眹~d&9 BqUGg"CqPAMeLC0w8dn:d~[s3i`۹+nq#%OBVX$ARJU0::ʞ={wttmיOo1N.zʣ&b͈oK,Lj{Q?'R'\;+>M˧ti*%R٤V/A3c_`WLkeղ\Yq{lvuF&/1DE~xpOy shw~3@6dhG%:(9 ik @4L6^mDqW=l!W0|KmJBkR|Y ,pe^09 3}[!Xq`.]0GR#Z"RmH)9q$6,5kְz9qftY#9z3%mw!dv;džP?"<\HXg>`U1)颔UW_&κ+t>G}\2)*D,v`%n:nunU &=R:{,3&c!nY|0mUSRO]Vޑfxq?鿕okʫj7Z cE'Z1M%bx[ %t K'D'ATAk ~%x"E{l̑4Og?E7L\8R,`a^+H$)(RA{89~8Nqٺm;;mWUKQ]_} 6!~ίQCAfep.a[ BjQC8M߸1M²[\^\f*N7`(P,x@ E|; x%z>)F:!quptj_4#LB4~1ujL!Hw^B~w\ /gn_EÄg n(/f{YwNC>?iZ6h0M^BM|jT"Voa|ϯsoPlm>c+-8bt11H HS{ުj84_r)]aN~ @? XP)n 5IF2!ՉtEt\&ō??}4ѴJd3o/sٔ{\ [wZ)YHg>?;'< F08g?_@ v]fX 6UK9PܕRdQ3MիWn9q65bسw PgÙ!n04 h%F;劃2%^0 înyfL$'ۑ&ξ꣟YDD;0MG|39zUa,a@sX5\?'[?G&Y/<_~ gs&t>R ӬH#sn6[Q*.ެ$ jWͫnm**I㚀 v8'Vg*{EÒMt $RkY__ar&[`N"$ւfJk4e^~Zd2:DOOOMM/\3y A[ |l7ӟokdO!It6g6qL`]p#0L WLj+Pc\Ѱ Cdq7>Ρ)_7Yph̑# &ް 7lOwc)xr5I?f 3dcT k'=Ɣ9ԯK|0C6[ J޿`rV6轮hL7b X\\j(`8 K*|H]ge^:[d?G嗪Wj0-] |-q="MmMK~::n/=zG}4!g; FBLLX;{ /w$Amy3@)뺘MV)Xh3OCpHKV(B./]$ M/)NNqH:HW&]׳?7RRNPfsdM:ye(1ayPMp[3Ea c*#C\__r:C!OUcq0`L*u[Ò:v7 Rk|qiNgy聲:V .νZwF놼x)'"HU@JY,"HpaN<룔mWtqdQO 2*!`m;RO -b1lۮbe{gTIfu ;E)Xuiҏ.?RyBvX!"ez}{;K;H)!9T]埓9vرJ|{e۬pe[j27}tn__V`E#رDu3:3?7 9b8&X _n5ut~)X0-J*}RăuH_Gڝ:8ją7@G9rV Tjƭ3%^=v%͑#GHӾͬu wMi߃מ(&ݪV̲ͧQ, !FNki"13ci]cew4ca@M7b||T*Uzّ&.Пp!YoIЊlIma#>C5l"o^iu8oLTJWbCT xK1+J)]HvwC  Ӻ0fUTglZ1a4%;6L H,.5[{\XO-:N9R/LH8L*W  7k@g&C:T̟ luR8J)!WJ̞04+ PL0 0mDBضM(4kuqq_? rnKqzYLb o[Х=Ck2~_~t\0*RýL>pJ%]L`})_)8D*?g?%ߪWRLѣ8C؁eLS1#s0(fc]{y/_ٞn{>Jd&// 5EɯWW nV~hq&g9}Ger_A$F6SFq2P{d(^$VȔڛ/]eHLE)x+/JN@[뉒hk'EVvbihɞ^ R2sbZ:8窠T>iJtܗ x<^RH---JSSSUS=8pY0h\FY{^]gC?Kp0(  m}rYPE@bЂh(QK1F2#&RTUoZ!ιwnY@JrZ? HNXFf7$s(፛v\S0WUnd2Ile^)E֧.+ư,\@.ҭ pk3i KXJ*L\$eЇ6V-󿯳+"#P g` u6p)iCh[f2X : P䊼? բe'V U4R\̧޷~ghGh3/G\|uqu 1oS\yɅB,R5hY% FVFfY*H:t 9m9RqN2W,ɦŴ"Q}#&!svza_& }\h?k' QU)'TkG uj\ettL" ~:aS>tPz.KJT iR$5cj"=s 2v?Qm#۴ʎE4K^ zadK eoY;n"ʯ+q*E4& hJR suwօFVY]脀[LQѳ>un0%)`X s/+L$Nz>\y-]q`?`I!κum9TdI[as;O*~L~oNsmFv!!ܿsٟVʹ0`~k!_ve;Zx' eIգh}h3a"ݢL8=>n,~}xI !|&7~KDfۼ?gl'+ YpcR=Xcv=o(3l[*nW+7ִW TmWc[Q港g;d:/k2hio=o/UQG&S.!jRV W-B[t*`,o1%g ET@< ^ Vg1ܳ2cDXÄe g\ s( X`ڈ#ןlneG!ѓP ń' Co#bB os] q^p% <ăa}Fqp+]ly,:tNjmL[}b9y@w? !Z0%=56Hz|X:і/#?LNK[Wl?+67cZ;2w-Ȅ_QGf@t]JHV+#R$zemW1hyCV;C* 1 m@ GU'#/0 [bSqL txmRUBq!W@JkjSC'ϸwc D)RrsecUr5niF;t<*KR:dal@jI;VVH[,Ȧuf.1lPsOtDW`hjףa&{U@n]&wPG @J\N3 ܎i8$ɤnBP`$yUzm*Uw]:g1spu;6I׮wn.*W8#d{Kw Cyj#S)モ_z:ӆW}6|,=<@,% 'By"ڍɷxS+Nhnн_wnj %%VgXX"AJLbtGW~ JdΦ>%2Ӏ@P dj搒̑#s;rb-RD 8^yP$3'uѱe-Cwp$;WYG4Ž֟2lHg+@pO/.X\{jCNV :% &LI@>Q ƃSCi`(Lp]_z={N0`*]; 6s2>[H|пPѸqz-w8ۿ#~p)5'0 ±V̊U7R+@;Tf(+VNRd0zm\+ jL7w<&D Ӏ0 /(!9PSpD[+)I+KtSnscIXVo_ :DlNȆwbSOYޣU0Gx)U{nS,`TAb"%qWAp,wp̠B P %y\dHv E]W%VBg* mPR\_3?V>赠MX>ݯү[qȿ~m6*/o?>% QP;͒%X(=qS6;E W::i XxNO 87Gt:▏Bʹǡ7/뒊!XO Y ]KX (džkJ; 0 =Givon#]Ź*ۥ8YU~Aq^U+ӆebԙ 5G}kңa,?s1Fd먀tm!hoby;Ya-4HG+ef_ |lB>Ps|{ .8+K iy] ta$ tF Fy}X[U/ peXŋ_H~_O vC}Yyb@\H2TiAx8)&1|lQ C% ڨ࢓%*zم*떌׻hzB$cJ/U޸ @1k#Ȕ$p,G=|:tfFPvXpjˠ7xӿeîKHa9~Ex%?=y GTxUH!}eR8ԹkӴ87Hj_0+Hi ŏ;Fhde˖aRt/B='ҋHU MBW%%a(ps>6bקF} c 6MX`Ǣ!']H- dg!`pOu Aeٸ "6 v, f+Jbу|ĒϛO{sro X>XOm=Q$z =#_YM7K1)s6JKst_޾mq7F1>蹶*9^܋1Soo>ϖܖ˿޶zN_\p޿zt BK A$7ߢ.p8ߐyi[J4-U]bδnMTzu{bu^&ݪ+<GPz>/  o@\sS\}"#f#.@s׺*P aeU%8%uv> ֟s@Bfa$Ij!#67ZLDl] P/$./ռOhc½^2tWИ6zś3ZD(G-IDAT_O3M? wllt " eQw}]:Fsꟁ5wzVBW"N6NXeC'xD"A:]|Bιw8_tp& A*–2"Gx<72+Qﺁ𖭤Uu 7eX/c0-3lc7ǰc­McD[j&+{aeŧ$0C-kmĺ:!H1^iݹ2qU fKJPX4޿:%J^ D(]hz BQ҅RW7nc;VdBٮ(/9LkN&BJ6D*g @X+ V}𞟗!Y\h0ptIRK(y ̦$:vU+W?Jo($qTjT4f 1/Ef}1HVsRk0"%BD' 'h'v]湫 2 te7~[W#[ܱtR>Uˠ0-J RdYDsv.N>Cz;5>ɑT#4_8G]% \%RȫKˌ8|K"zDǪ,-JdT~D5UR҄WQT`{dcdي29yҐʒv$)zx7 ubУzS qJ,L$|Hy˿mR%l<qa\05_`|ߺmVnq$0 MɥNh@%&'ZRz%RxcC(6Fӷڟ.}P`XڝPlO} =4cGK(R7Q[!Miݰ 'Mg&RCjaCXƔIeǓ|mFvO80Y_?NӹսbPZ-xJE8*z՝D}oJ,`Xn% ﷗PY4!תE%A]%|"WZ+Uc%۷WJ(OxC $?rlQ%Q+}$<,ܯʒ^c"^We ޸+ ){}jPPl0)xW\K/O0DZ- v XJH^x!y!= ft!_ JfC/jvgH'N0PYkB|Mps@a=LOqϔlr?b a45M%`}VwVXl ICy yE)Xr-#Xp*&Tm*-^/7W_x{I .y/D1<y(Ts+5'ZKKThpCm4CO7a)xG+sIQN?0<3..C\p4͑w@@ F=y(\xV氮uuVmۦ˚߁tYȥq`ES< ,>7! \z+] kPJ>G_Lڂ@Mگ=~l4setl/cg>A)2vȜ ?5'GW\e* #xH$Y+a)x]\DN&gVEk5` KAig@)5Nw3S5 Rp+)BԜ-U3Vk.3G<< r=K?L&e?O_pOs@ԝ_f,_x¦]s:#5N?>KBoYmmmHk%r8nQ]gU9Nl>BTQ8Vso=o=!l^_sl>P"E(žK^V J&$^~#", gUDEV~xx˒K9 9sӲvl|"O1v$T}+Bٴ $~S: lJ !X! CbH@d_g!qWPG@p D3440k ™uKo>atӡljE{ԙI[[)YJt 0־ۧj]m!R%0!Xl}7j A:9'9HwkTJ,^TqƦiG[7/ eguȾ^88ϻt\~h9J4"P%N&K.&54R#_O~˯v Rv`$[L{$P,98P\g(V G+R4AK;?}C [CtG_bL Y#9M:' àpxvN6M{m;҄U ]']_rz:16sۂ(q(s}>3!j' ]ͳ?ŌeLh & ]7[D(L£otRd |+^MyS6z0ޯ0vNEa~=Q3 R8مgl'D+5y|;ۮx#8cFOo9Ĩfk+6aD"*[Ijk){gs^;VP'IeH Ĕi LC'l C͡sDWcgFtzbP<,-Y:`U)@&bubCa 8w/v!sMj;t y{jWk6ϩW@@c|;/<5 l9k·cz;v\N[!hnn&6Guȵn6C&>2'c;Z[w @uVy9\+Q+0N'8!lBr7G&lsNj*=ֲ.8+{3SAS ุ*K!B!/u]{ݔJY)JCrL ^dn]M/S7H])Ы;g9'O׾LH`OiKцKޣܫޯ0~d_Yhjw-! Z"-ex01^|{8=J\+A$V?=Ú6ֲeXm\5&&6Rd{zn,ѡ1` :ŤȲf}pZ06 ĈDoĊ_(]%Bh7W}gR4Cqp]X/I|=bHk C0t;oמx&,_z8 Ȁ%7P?Hv׉ODimm*?Ld_8ᦶ?0 7so_. Z 曾>St0hF9wIEMԮIAI Nae]?pb6`DlayIʹ\q+~hF!; NxK %I!얂W`RX 9M( iW4\#%/<+ƞ|HL֕ZN ߀:⃨'(5 .i^A"/߿Lx*>?Ls8 7#PSӮ;a4wM0O~;ZsۄM]D&VdֲeD9d]8YX 8ckB?/~-o6qJx(טB17/e,MŅIh\o>D?|I 5 ]kzX~? ٌ\?s#P:/Um۴Oژj|_*%IhjSRu{,X⵻̑y͊_ r}Eۀ"aKJw_gq.W7͹p|.]p9oq`:`C$ҦeVH' la%rݴ|rKp^s/އ86ߗWu8]\6R';AvDP ￲^j> DY~AUIM조,WT>,_POxAe=w,!oҿĈ0tB0tb F"HLxN:u6.NV=.@[Ϋ&9ONJL7* `FM\:A69L{B.U(m"B>wOmiw ҋ m_攙=o!BZԾ 'FIR_ҝ)IXuYX 0LJ*H2fMh'÷%I x x^ % % Y&s0'> {&&tA\^-]*aFkz˲!/qLȦR!LI ɂlF_plQy%!*藘:'b@OBiEuTNmB#"( OAQ0ԷY><;(4AE"xjHSV#LCIa8Zĵײɥ\MJ84'FcEbZG.NfqyG@69^sYgX@ olb #vq;>^X][@N–IDMaPՆC(~2SV($T$f wt~~B@K'{5խ{^ oS#xmv< ]ͯ,(mu\&\AşmgSK0epr2 ';nnҢ\T+$(J'{3s-oP ߁oxMM?ҫy{b.jCK/\,"4 01m`:5M$pGG0":!LoOPT\&=I'LE-`a6HA( ("{aX q*x #s+Nƾ 3)@Y$e*ԸN0 n$Sxeji3T& pUCIلgX3t>NN ^DŽPBU!)%ze &wK߫97GP?N bޣ-H&˲hooTzS!H ҾfH2pP/Q #oռ^5chQҟ%M|nwd\ v\sDdv&gNjD瓬lVe]N.ݙr;V$0; sXmIr8(J~,e6 $Aޯ~ޯ|l_m F\>uҔ1/b"7JɅ38x&e]Xm8G@ _g{ڊ]pru$l'L#T[9Uh[\BxH*x8^Xh? 3BR H[Kj"qp ::QXg3Zbhu0浽+5SjSAn_I0L:ltyEK[;gȝ xjAeu*lP:::yJheA:|GD=eJOPؗ0% PXSnm >nFq2ftR .(MthuAYoӺ8BzZ&'`%Mmގ]x&rF>>-X|m.U,.oMyxVW37^.~&ei\ =ySՅl̗|`%j7 #˷`<3WaT]&QsX)w8q-Nun0Q)x.( an ix%#d`5 ݕA^kګ:'()e F((C*lC%nT2&.$&E90x滾FgЫW1ད?N,$sDceYH'dwHB~iن.-H@vwvw)WO pM;E5pNjFf5A*t@jCU6SPk,9]t Ƃ 3 zO$&"Mo}L0l;qŭ0NJ*{GjE=iĚbtFRr8)e!QJj㤔[ئt[o>~*^v>c cpɻWܶ`D-}cS:fS]?4uD n6]su}9|%rkXKR(7YTkixGieJŗ@FQ鸐@86K[aik?-!JEK9d&5cRl$"癊xo^dK *p$JCO};oryn-T'^} ֭J۷mMhoo]Iā{||I&A)P\.WP qFO>ćy|-_ ln2owd [9Ky6ll`L 9 l vٜNI9Թ~n[ݭQh<nw{yE83t`}c-QUK'Llx:޵hxIּu ;<]8 O`ta8}E`TU/cdb&^rXpVPL/&JR1^;}΢P=;(?p.P','&~i ~'2фO#οjXO+ F>w?t΂MUU---O:?G__Hd?2Ɉ*m9"1<~ەxРu-ez>0I:AGr@s} % DǶHcLJ-D]/>Ͷ;~0_{wn˽l9%$.~𮩇s0M}a4l9ă[xp!$%PďL2^X&$giRo}JB]"$R"dEp.y1G# #t~?ͯHtoFą7*B]HU=hhh[_JI,DB`&^r0 \b`G2*!n @-m%6s|U:v=*䩉Q%R0GJ@3L&tl°(H0Q-oɈ}149.K>ҌkCR h$H3n"cןY]]xIB4e\2k1f=[Jma*,b6Q!!)O`aP.SK {x|؋'[tkA{-l<AT,R {Ho r )%tttC2!woA*Q]BnzW\5 Aހ r##řz^=plʡ\X'7va *ʥgOQ|{ ɮNbwa  ˅58q#e"Y̆,p᱀_z%[ NIMB[~\(p n):~qJ%'x xafE[rjN`s0ԣ*B aAjkkb(d``Ç =| jkkFAv},BC/4A\װvs{K,Cs:Ħo}pBi9bOx3rV J)/nrX)RIXv#(YWO>ҦT&j}y~k~u6T>xͺ6nT',EO٥ p/[N[Ng>[m.48}%=? ۑXO3W,"X!KWS3z _TrJL@޼eTg.ԁZx ρEJ?% =?!?'8FXa֯g!= & RWW7J/5M8JO[[ELOyy9L}4Mt],TEL;@s )O2 ˤu믎VKS?%XۂTȓ㩮3tRBlF.t}Y&lG8EڢSw?+xEG;d`;/*|sĺ>T4){,OXkqK}~D+_?+XH;|?܊5b;u9aSS,_,#;.qUpmVCC-4;wXB }^+x6PY^ۋ8iY,$=RТ"\t<[-tR'xн_c'{rv:|U}?$ %iPVV6A?@4n"8a1h李Z~r XI ++E,"ۂG|.0 XyPEaZ)QRfmU/e$OHۦbF/qx---חd_5vG A4^/uuu466Έm{.y /ۯcا >3PR)jB)R$#ćTy`+s4tHΣpv'Ez @'?8<װ[MM?Nds8I\~|s*?E n] >ؼv!cTWnˬWN#qvb!V wN2`g :"LBwd/CGh96nFqN;a2ӁD)Ѐt<9!1" 2؃ elGqtiVTFCǥյ`xJ˜ J!;pN0Z0:ԺxʫhZNjSPA:VI tu'I 0SO8hvl>sn!c8,YP} ,hoo' avQa(zjkkgņl#O<6= ws ||ct:Ï>[Q+OY^vpbz8j n7NII L",AA HB'+?/*)1=~t`꺔B?#=,jL܉> MWl%P( $-=e@v2Ie$mӹY>StMtE%ݧcXi1왝_D ѹi*[WѴ\SkY3kEɉpP2EN@|dwt*Ճ{: #6*RWW7kT*Egg'|>jkk#Z2LgH8py Oz?ԧM+7j` RUF4wݷG=2V.kH!8P6nN0t@@aR}}T'9.&CS?{T ;U@nw-Q% YZX}m.zy/}b(45M3l$af-gжw)4!(bɒ%TWWZ=88ѣG$JeN0G!T"N*+ MnedžnG>GT~KWn␆ HhBJRR}`;w('h 4k.yBt ggs`Z\ɟ3<{/{]IYWOG>*_mc 4W&4~#3-}~ TTJ;gv|ö'jD@AKod28GsЁ qD ?.]m]5M-Wig['14Iv8ND"aTVWdf$R244Ç"5{Q0SPp,s"N,LndyOaG\|}iDEu]_ÓO1Hʽ疱_rD/4-q1 RABtwv& _y Bhz/=ZO$E)F_3t\zηpY  jgR86{Pپ!\.2d*$2k(gNhh)D/@0k0ЃA`4<L3M@ljF8/L٪j.VUp:.bX}%.$dhҿ(0)[%~]*Rmԗ9Gt؝9CגVJtŰNn 0IiR./ Κgi)s;Yw*-hܸo<2N URs +rE YdY 0ye7MSlͤb%:ӱiƒ=jYIz!w kϘAjtQ[0OHI8OB@Y5v!✫OqhMk.*=Mޝ$4ʪ*/[Feeeb˲FLPUUMmm f)8Sd9Bh/@CI!m߃C zLTxϤ\:TJV}BhT㺏Misn1[x bD"LWes@a|Y^Rbϱ}ݳt bڵzn!=/.5(#2T?@n\&˾5|NI&$N,,Lh^/k>.`WU- zYN{qw>c"mmH VӰB C԰ηB1xԕ)6@W%RbdӚs|HyhEZzcۍ^^(݀z%T tO[Rԭ=w`-eiGnm룴s7U8%Ҍ9Jl$! NA >203^4ԭz5X s3"p]~5fRi[bPaNVI[ކwYK! }I+/%&g}wt4&))q^<yJarRAJ=˱{U/p\&Tr $\~&o be X,GmF5ka̪9H+Wd]D` AGc&FϞmB̓5 t8]zڕe1~@yf,9bжܤmH8 ͚ZH,Ig N$B~@׿61pA%lb8O}{p455:k8@WWea~Jjkk 躎D:Cu4M˵<b=}Xh,|tywCc'DFC z/% ߌRШ_>q35Ӭf`<bXQPi׿3-8T7i:&+3mԿs.+S)"[>FjZ^  s+-$[cB &x]J8ܗ:ZX:cGKxŴK*hרh'N6F}\y($2? NBHO?Ȇ߈@tպ!d9%۷?^?M*$G$sxϵQz= q˩[s98{6_p՜sh> <7.8,ꔂmBK8E/BDhPׂ8:x>&x8ZZZZ|X#ivOOldd`P=({!P^^N]]x޼* SsxO! )ѵg#nx;rb C"~&eb0w`U?q&S?"O&  3^^V^xS)>#*UnR ;m1CcMGR$&JYCC~"ϥ@JI2CLm5Fu ZD4 &0J!SĝC,}{QP ƾN{p$<L@n_pPȭ u<2CF:?՛JcC'a'AJc~5 5.ݽJig`/V,m[i>)WYwitIR}$Rb'ć&W6^X"L4GҰ^*[Vt,/r>-/4]~Ys Mt;s!a&ixb2KL q0m_~R@NHeN&R8H)4mS0^z:. ǃ罹Gq(} UKPp2I˲B,hə/[?`,%e̪2[@|\*ʗ|V$^M~AO=548 0&y. T_<[$eH֘ 1]zѽ&I ª=˪ṶV:g00CSK\UOP. U<t\!Mc}8.CYjtzI4 TOى T+Fﱽiذ+ssA"2+3@lMhxhp6f=BLRѲueۭ7SN5gd%S|Ҷٳ-wNb7i@w[sG=6pRNC/Ұq;W59'[БbRKEYg&¼_N,F-?߿BA+6!.y94s @4HRضM*"Lbh"@JI2C 49"ٴir)/9]Di6LoR{ [P Wy2:#.:lkrv(O@X,č07, axxt\j.zT`}6ةx,8Vo]{->:>1i&Gx u''ю Mf M}"=JT/uI#8v}$}3g`T)hċ\Af'$27ƙ"V 2B_OWzg/հCWB4R? ѧIYfv.Dz urʒn{!I''Pz;VVobyWN}3pH=;E9! s搐g[LZN:Ʊpa% 0up'8ԍSɯYmO`kb,8N3l]D,MҘLeR2ǿgsm{аq፰vs{py  3eY$IRԨBqFvD"eYX5Z1zɄI)2m9Bٿ-A7`8DB9P^4ueRD]2'h;N' 27~g%j@))%ċ=oKx~ӳi``# %ұgkߣ ]"0 ‰ljIoП&~`O<x}Vg@'7TmiBr$~Ԃ.r[*Bxs9с58YW_} 6Ek*aA]^~']m +e5plBiEG*&0 0a eP6HQ]pa <:iZ8'^]m> )h~+g/S7@0{rcߍ>g<  MHvv+N/B}9l 3@9 QL+vvK)m{t[8C(avN l'jMR@p,_xٻy2K=hu1= v>9f&Y^Ntd惱?@8&6A?q \?Ž%f9VN%ft73ݠm:笧R?Q/&҉y)+V¶cc: c z4@<{MU eP]f_ݟmСW; wd k4ohhh]C6eaJkdDô8K>>M>waVx`0~&c%c؎N[3)O NeNU`b~F]vIէthӳplKYp+5M"' К9N8/ =/"yCʍx' TRrه t#iI̛D3̢'B1XZ;wRm,9 c֞f4Txx`4S7*TU+] N`~AJ!yjq&ҁg&9SXY*<3xzcv$5 TiYj|I`5Dvbvg,9<4 ez;˜M:A a wIqZ%Y1f%2˓$ڞrknƃdzdvݎsWADǓAh2Z!p3>KfL?YKHbhy]5,]xky%}*!MED"9:%tZdOd7L0A^ ;O܍|􏐈LJ&8ZЬ M4aד;KNǟ94g3$7Z8cH΄I`TZr2!4VtfJ~ ox'L % +އv3`@F:uo}5)m'?J߯\Jrjx(}a6CV}#$ȞAt ? 5WP)Eg{>4VLUusTR#obSw-}tq%lK۫7Go{؊J,bxM P3HXܘ km\#Rݹ}o~#-OԽE-7^x۲ %V"c[˶Jkv[awgnu_uP *+@WR$0Vu$?&O'l8*At0^kH ? 6l-aB2^B=m2]j4u˩v&.tzmV԰1>0' ʖq0$ቩECIN<߿Btb.?q+864ʶmbXITjTHE W5 nx,8#SдQ@#7|T/Z5v:0\ VH$'Ʋ-pۿ~%+WU%?'!l9O~fJG>qzo 2Upr}iE/𙭁çHO " N,Ʊ^mi_4e[9~;vMUll!ƨ; Yx*0j&rCop<$~d1Z>ټ6z|-4TBg2:.zdCsAw8/MwP~vcA@%։]uR"M_ETTu!F=bxgʦK1bۜUg}whv[RSDo<*ZHFƒE,NS"8ć<=ۉGC璳/Fw-Aӄ:Jy/ ab%+^NOI.b (pm۲uXI˅H+"pBb_ޭ创 uK{dcpyI 'K: A3?YZy'IBPQѿe} M'PLSUUJ!hxJyw Wxٻ"j%LO v`/XkL[sçof1Lo\02MeM(竨w}%*Y%+Q1yx_[S LiɎv_ilfrh^mdS;2Thi*`hu,__ wy 6]pWrZBo{{m'xIqeAZ᧞틟gj(jYS*zhUς/4(p:V(ں-g /,-ہ P ^8T!1uM(`4+d,p_'_ .RցNjЈ%BID?)cy׾F˙g_;>n7Z$u3E>FawXF,.ۋ0\:zj5jyVp ̘٬?-+;Rr| 6\r?l zf+15C u">^O,_?b@͊tz9N oNN;͘!IJ t].P<ȁtV5 teXz3W Q)̴vGWsfw~!9ھyB\7aZ寁%kELHS) #T_hx< E #1 (!}3xxeFN}c4tg~>?c[hZ+g`6PhBpy8Ud9זb%k@l+E2/6 _~Txo~`?h oTa`L6Q)Ox__Ŋk.oABGHEbHQɀq4 44CG7 tqcx\>׍ucxܘ>i`zV"M^7pnr%9ٱo~/,pәk>ɣE %Z-e/Q-!3G,Sֳ, 1ÝNR2ࠛLoe i3ϸXcwg>*vi5.A7]4 z! KxB߾%4.5*[﫮'PSHwȢM,2D(KJc?~3l;40t Mitg$eB >VsfZ kp|ɮ"_*ą7/Y5<>e)F2$JdO8O6x<4M˥[Ixn/pH(_A$׹W+ *+c5!4m亏hV/3@fT`6CCCE5`odk>|(Cyr %]xGn,]Ǭ`?ISbeg U81i|iTݧC ԟ@d88JZDw*w]&B_Ӧ׍"/mznj:3QergXHIoog; 7?~teUՅ@3tn~ kh\ntfgxNgÙu$c8c^j]A8a8_8Vi\&^s9z'l|‚* p%PѤ #q(ݪ)u+֤l=5a{xH[ϐx5Av#ԗV"NEG~֌ ^p ұܢ૬aWq{T=Np G-v:^_M5  <7NuNA͊L$0UdQ罡T-[C-x+ ' .`!Iv$96 _>3ݰleږ sӁȪٶ]v:p'g~A. 0r=;B(l mi??WW̯DD󳜾;!4ל͵jW1/^t8St ,bhhh_%g\"tbh-②iog?dc! jo{+z鵸 {4I{7]1ELи{vp@k(_6㬙jӅj+ ʹK)@Qx嘭 )ٱ6Ghwā?P~n;(XwmWY$_mu$ _:k=dΨg)d" 8N /%y߇y+.Y2+%c_t0 b)d$Q8*?9 CY Q%(xf:^` 8x\c9|RBxj)f;ZU[Ӊ9GNOa_h9YC 砅0pdGyXt8e79>Aͪhɡ'%L(˻,Q^ld;+;ϭ+9 _ctf GbqUuǦv܆mc4{<-BIqf6`!r-?^#ѐ?:*WPd9`0K8_TKx.ݹ2= ~yVn`Eߙٶq=BhThVOE 8݁Dgm Nڝxġ3*!^4U_‚P*% 8sX,ms|[)spb>s'\߲ ǿ/ma~XBrTo갳 kId4ڔBU60VlP'x jàWf@/ņa¯&Կ۔hE+l\Q,Xs:G>W=. sM^}\x<!qcđI`& C'PȺk_3/`l$BG3 Tw%zq PD]h]|>sjOEd%);j  1O@q3@{j ҁ" Q0%Fu@w't=HRB grօcS hIy :(pLJoFGG좋miY8(<ʻ;!P"i.MÉFߧ쏧Bqք<_^E*Q *A珩s8[YLCwTZBYk1c߳M+{Tl\_ uEKQ8rDygb䓳9W\_~5R͟ otx4K#QexMpmT|Yvbx+`oץ̪+HL) P}2RGz@}׬Qb#+7૪Ew+3t"S͗Ҵ\g6F!MSq۶9HۡsgR.,*7M6^½]ODTaJ`u#8X?IT;o?#=/ek |z.:QkdyAI4s t#}%it=@?!bcK[)KJ/BM7 Ѱ\Yi5j]!>20zN{u_:7S&T kt #7V\xw ]r/>Y"/<_J\.[ cU┭cJ\` k~PުrZKْ‚ ׍T{xAsVBUH*b7Kmsq5tmwv D5]xoWxyֻTe5]t Z*UdohPCd1lLQTN/'rϙ @]o6wh7I++in//e_3L\Iytc3jWmvF{V>K98Z_ lc =F1[kܵEHCNiP ?x/~?ކ]U˄ev˪ig,bذI8;gq)3$LqTo" o.tSu[7]9b,DXI䃿 1jfp_s:s#4 n_\0<<v_tj6w66h]@yaq5g?s_I*QqŦut?>!aUU@cEPW0Cח(qLoY7Sr vN?kwҔz,>fR2vd~̊ 9n🳩Yt*Wx>NM2;f//6, %Wj?D2g3FY)+` ǒ/^=s5%{tJ?M8}%_7 U s3/ˡ/bɻќQ/3)BKz,bN=Y/A\zXHƑ { mq㻹]_9+ݧJ0pO dxxx4̍I_56az%2ICq1 j)ohp Ƕ & _Y%m\qP.$;x}+n3ѹ\e8L*'`y- qsG Y㙙% "řC"!qbV IzqQj4;s cDL&<>Xqˡf !eyY\.`;ՂaǓy^]GBⅇ #+8cvfPR?3/䭟W~`_3\_B<[^$k?H022Rt_.QYB'X$W䑛?Kx F^N;I ^StitoЁv.W7})IYD{>Mdz]Z|B\AeK7TiaRx~$k6( '9l':;2;6ji|pRI r Dkx`e87\ş{R*NQW#qBt 8Z.}҂#*A17\EiH)'LK&W,`W@4\s-1(T/[`B)бB0Lwn 8$#ةDtKڪZ[sEpw֔kBʹg`'UT|ec"Y"f dž'A>˗4#tA6L0c0xnvGF>sGU]7arguoϡiZlT19]7U! }(k3r˹mgy785MG~):1i"ضR *p8ćF|z'=/__I}.W1fOHD{ H ԗ)aq_5Vp:LX覆5 0M"J$qRJ9UZM ]W[wE4JNEb([`TUYz)k9?! }'ɞm~/{WS{Ңg *Uߥq ΂4㿆Ѯ^XOT%fк岂'4MC7ݹW!#lYH$! 8c1&W|QCg (CsB9UJ[6+&:20Hla~7n.N4\K|BUR(&4-G\:国(򷰱 _ HYs}Oʡ !f跈#1iVJ- /۾r&jۯEU ${yˤJ*bbzl~(n}#_L=籟|hUI/+SgLIM#)Rg3OkG8+ th.S]ax.CQM-/ R:؉VUEyF3<{8_RӨYs6" KZ;e!5VDzp*i0<.4p nkCEYg@ȬaTVQַ"o#O?5?cA/9}=Jn]wcێbx4LP}tPl@m4L>XϜ^ヿL;'VtM[(kBAbdCld6Wr].pL\b j螱i};fuM::|5n!hAUDw?HaY󞼙/ X'$#(y{>ƥ+[so`w` ?Yb=؉v"E"e" MSךA #U-+IAy"ކmL<_'?w7q~2\/,m? ^^biOa,o-AA [h9oD5.ewL')H?q/kx9mjtzm[YK!'BH6hn)x?"}]ۖk'SVqkAX62ZHYAy'a#!9F8;EAuW-]Mr?m!:Ѓ<p/YCvpu fu( 3%<3B7Xt) E:Zq6Kfth~r*JO 7K.):~:=ֶpU4dS H.Zkyl1䄕ts/S:rɚR ɑ-4yoF̐!&\nHd{qFx/C?NIme엹 PvԽ-XC=y4qǶisg)"p-iN.כ|>b1xl9կxɶ6=X}qqH'Fqa"wqc[Xi=?org',̜ӷnSx].ܺtc8,n8%L]F]gՓSؖU UހPqki lM^6vKVFEJ[pj6mT{V"'q,UuT"Xߌ |.,[G'8HG9B ;@m܊Sִx+_e-Px菄Sln9a""~C|N%8/7] *_]P_琺ОS2P!`;q FJ !qM$1@ 1Q孳G*4s>@zOz>ޭ !{ Jn)"m F ظ>#qلo7\Q@l~foY5`e]bLhot۸_= cGXrf`gk`gWN/ _(XAqy_gvb RʒW"nw1ٱMZD]G qpK6SN7C_' MayZ29E]MG[Q'-bhhh/4KUPF$H"b[ B8D =*"m*jcxvuH1SJQhlNp6^} gPvm>ӫ IȱFvn'՟t]V,4Hǡgwc71*+p.CM2M U?E>hL$O~9@Zҁp+x46m%Mn᎟vz GH!@ -8!DDڲQx}_[ wU,L&KD(U!hon[VV"r::Ƅv0M8gFRNC00 ͗RIOc7`?x;C=m)Χb4p)qh'pyWκcGc%3βWsGOvm9ǏB(Bɯ:3&l۞/ƒ3.|`TD@Dz HWKi[ĄۃQ߀L&Ù3F. <,YJKo q(H;J;V#F3F f麢j&Bn7ˍQVx׮ڊQQђ~umjYW㫩(V*Dqv!؄ o{[+YGY2 nX)DBgLLjjƬ&6ZO['_~Gx?M˪T𦏿7}tv< fX$<| k/Zp BkG#+fҴ ιlՅ6{0nV]Rks wdy&'$Ɂe nqWO4׭> a w%1R.5F%m+\^?UKWӸa?WΝV}p4 A>MƥTXX4*Wd:{X$#02;r^D}O;A]6dž'T{^h-M3xphɄLCRf!'$z y-7s{`6?P?nꂗqnJ-R: x5(8C("(bz#͛.ڏ0W7RV4g^xG˧K.sI+ ]016!LcoU߀9*Ad ;<50545<)mhKf4\.4=D<^4ͭDZ: #< n`x*k5kI7-e5AdxssO^w.D3[w׽!w,$;Gp6KW| U&FMR+$ A C>|'BXrp8~-R b$plx~d *j/{,]?#W"EaWr]TmBMq] iFd:)%###嚏)?yeY u)VONh'GRUS@K'4:SP|U5fU)$]K#hu=K)tۑ0vd\{&0 Cwımz od^,>?uoy+5z 4уe9 nZd*>׋pѢ%hfYT굄n%5~81wW++h^Xn5u5T 8)l"Ly#-d"I.`w/"R$vJx{sa2Ȉ귡USۼ@y50欭c$RS7 u&j^* %Ղ(i&Jz*X4 uuoz V H<#=0!TBF3m%m:eVBהavغ4aJh\愧lt+ʶֱ!P⑳tI;M-&4mQJl$MB=Gmaûw"/|>֮]o3i dp*h81Eȿ_MhQt*s ;@UogA3L5t{׸5 3Ab}oՒ\QbrHAx`޼:Ze\s>!Fm-i ?-% tii&j &r{!<:<+Vݽ+#Qzw7r|5*q]&{xi;$F"$Ba"]ćFHEb83QUE;MUW#LzyF .`+UH'\8(%^JI[ކ sˏq1@ocMNu+Ѣ≭h h-+5!*+~ˍ`=}A_ۦO. p(ق^BDKAVa1yyPLb͚5s"7ĻN&gHb` v>Vx;ahfEe&DYP-ъLL&.8,oXU6 kh?'+23$$EKKэADDtVݶӉ)BR MUt=VwgQ hhn"s.?ߓXJc$Q(]h20.LW+{ khc;8c.EO abXv"c3> 4]=a*wO̪kM` &BTuuۀwRJtahnOaK_@frNj( %B n'.V I&I8..&*g}_6 5kPW75aR0<'SQpZpJrLq 7B۔"ppgg't=p&@~0FXېi=iT"pWp1qFFTKጌ tJz%d$2z" P}c;R4_aTB lϑ4#O=g xg B!6M*- y'd16 B%tDu`Ws3p,Ԥ/L0A/0M g̝8OT{, *MbC ەX_'MhiiaٲeZt\9 )%ʺ!B[l:+_g]>ߣ:>sik.y5W~-WBFt<]5MpQck?+zmEc]&.=W~pK[M i:>wǃ'XG=   &{[^1~XĄB#^\5}4`d p0MP94ZVK'Bu#>n%dt\bճOՍ/W$_Wy MC/+÷n嗿gcVUu °4@4_8]ǻf-5c!2@ZN4adJ) ]W~  4.4:!yQ R t5MEELjUq$Zd&z;8ZRGE&tBjjjXv-9n;GQ:"`cyՍJoY5P?ff{*ypTmE覻`~<@4-/ƪ _%"{u t}ͬo?QV/lqh$B;KiN^  gt:}{}dG;V(ZG(BǷv3"ͣL-(2h>?NjߗnHBъYփ_ !I}Œe/u# #dS9z^ĨE%nE?pWZoӄ-jci]X4m+%ɏbzY 3Ϛ-\%d@ ti^/=ukY׿䱣D_|؁$V !pJiivP}ky+0+%߼7lG OXAhFm,=J''f j F>v9me1 ˭~{<,ba|+9GйX_$ `8oD o{ ձ~z\TD5I+\7D"c":RB~HDarYVyo``%aFčʅ>I? 5`y7 DА=C*B7ht tTTBӹ? P<=uԽmԿ 92XI4mF1^Y: Wۍ ܭKqRqUm ɞnDw&N'Ői%8!xWt3ķn=f]]>!8^ШWUcL; nبD"֟L*ÙA&X;*Q MkMє0]g"N<%]/b eC@a)1XLba=ǡ·i466zy'qzzz8x HK%(ԯ AS;q[`%1 MgٖkWZ.v)+JfBGeLha*)q1QM8ةzMt!mJ0Gd:44M?H\oQz,0$#Xh2_O.{ɼ-Ddƨ-v Ӆ, -Uۂa`a߰ʫIpb1@b#8v858c +QT F0p,Ѐv_B(jNjln9eAxre"-i;IPP$¶yH"m~{yye%-B2`c,$.cl0{l]{ꦩ$>IڤsܴI̙v<=GvNc7uI:7lsq]m/?ޕ I|f] z}.X:sW c͟Q.{\dh&W8Ҵ9!dVxpנ m3g @FZb;vsΑ|ԡ W=C!j=}O@0? rNEqһy+?`!?]D!Bޡ['g]o%M{  ZkMKN'"%%P}ʡ{Ņ $c---j䗔qחra/C*ho1,B7flpyH(@u$.^`yrmn{:;LT E'S,H+#p0׻]a&8 ]s~Q@p rRTfk ,V- k60J3A`0ȼy󨬬8} ;Q9|0O5 wO`D9/Ο@XpOM_UQ\c2޽. #,(V,P8B  }3|tǹ|ų`Ak]nZx诉u^X?ՖE d`eOmoiiFE%U4Sa$ &ʛz'( Jw.DB!m- _****2+ >ai:5lraZ ZR,OW2]F4 `# 43~xy8s0O^^UUU>}dqH$}Ts&jkkik^epcX.q W)Xzzí_^7.塯Ѿ\.+*qp'¢u7 p1>9ݔAٞO (-b`QaTa]vc$'ibtčE!EH!d? sDS* g?Fܪ4e % ,MouMߐ>w$F.h` KW 4GFBPpV`~%SWWӧeÒ5'>#EA:om)ȃf;.KݰO@d֍RrWU$uCQlOֺ'=dXS_rać|EjyӃ ;K|Ɲ k8tI0U:+w]hGwk( Qщ8:CGch'tÈxg./ZӐ\ɑ@ < JX^KӮaji4_𒢓M0555D"_%\ץǏښ[A]ߛ#{ѯ>P6y䏠r|5߂~߽ػlB}GLS3aYveو|,LX"c{/sA.|;~7;M(P|=TSFYSK\eJ Uh[q^kp](vccQt" n($o&eZ6Gh0Iߤ\`Ҵjl X\¯}S{Ν3PII olHw5#}Jgg''N. }WRU~CW̮Bv^,oZJ QX6+$y,"V ĢugcjgˏN<9{o%s ͉RIE10 vomoRZ~dH=$79 ƒ7+\:@ɿDXp!ê۶QJ|kF228Z{"P6W->xk#z˞UȺB6qYEwo]W!2s~̨Y\F3j "=b > ?cgI p<›|y|5eLSp"M@ӹ5ݯ&m';4l3 C,W@0vًc|iE2r˲R&zvӎ5]{?ݯ{ k ';77D{y' 3kVe/><=QV2r'_#M#'c'BY46ƪ0 ,Mvn_$ܶ5CP. ~b $= -~P^^Nuu5~~E)ꗘƑ#Gҳ@Y,YmF{_;AYȽO=a+Ľ];@t\֓,o'Xu/:-Yo'L 8(ZΝHy.MwQ9ZD+ ԺOkQm7d<`yI+ ƗRJe Mi"-_wSe ;R NBNhtGM.ʱ 0lC< yKUz8qx%䃷Љ^JkbmT.^: jL1Δϻ3[63WrSHEՊ,E7q8{#G6, o_ KJS7yJS4uNR,7d@>pr]?WL`GvBRYf1|l;_";D"SK)ȪߟOq(@c(.QG< olJ٩y8W."BTŇKNs"䅧dF~@Fv3:Z(ŔGe꧞N`>&wy^ Mߐ!phmW_K0^7IjD Ҕ \ҰB@W`{^q,I-kbiS4@SSSz ˆ56g<;ˆ30{!vTن~Ep ˲pbQq"峳Uerr3pso)݋kGkO?~ʔE7P7T+4ѼdpV\OjV)|wE;R,prq]nLZG=}3pضm̙ܹs'Lջ "i֏-x3gP__OWWߪpۃ8Y~yOrjO,~۶Mqq1W%v:?=Ƚ%3̹~-$X`lFцp}*/:KRijMfgyjo;&"h tY45kxSA߷y? 2|fΜ3H:+ɓ'immM/({poW`zOч%GzNmH$⭮$'W\'Gi ﭺB1ģzT'D(^ʟ|v97*Lt #uxdgr r2EO~'}w俰n wM1.---Ԕ`bdݓo \vZ:rp= t82BݝAhv]km Pe;8R%NޘrʧS7UJӂ]?);&5%6 ;̽Đ+fx~1 %%%TWWST4GbCxtvvrIΝ;_@ݍ;0d%Eoy U˳U\<>\OM"HOq•.;qDJ솉/~N20H۳+E0CV.al3^J_v+1Lq~1οPZZ… ɛM}v8q \ҥK;v& Uu`(xF섩3<َ*}N_|| `H$DžHgk#n"uD:h apQ4JT<ґ-Xeibe(MQ{] v{!V%/kؑs'%;7@","QSS 40uX,'JO3>]>s !De;9^1bSyyyq_]&J~Ա4-DL`Rp8垕nHY_z/#׉fhṕ UuƏ72=iϕЍ0L;uH&"Byy9,;H$tXGD"9uT|XY[`:^<(,vTsp"ғT?ģ}AD$}x;ʹ~ȃe)2Ҵ;}l/KQ~&9A6Ҫa pҔ793` Swev<QN0D)ՓD;fND#Gp9U0oc\iTi mGo|:Z<%"PTT4TJk)LI²A"ډ$nt]if֋),dWnFR4 E``>ay^$\?;,MD G@o¥9@=oC[KJ)f͚Ǭg@ubI$>|sΥ+ +[ otPY%Ȫpù$Opp8< G'eDDPm4&0n" glOuDKbF?cgȐfҜt;FY5ha2`T!KTZSJQYYS' mtVOX,Fmm-.\HCOnX~#˄cf/ln3O"9ژ2IAu8hF:" "26:{|)E'm}I<.K *5 '6b#&9%t?`jK#A-צ0hi~ t'k^w]73;ab:t/~7^1O0(++D= 7ޜ'EoOس }ߛJ)ҚBq]wN"vpӿ#wp2f0Ǝ*j l3;C,QJs>ΡaZf-|kAq7,ViHF?` ٖdض͜9s&u5H:::8tadok=?Ðw g7s^CJnloI)Eqqq+( EFZ]1h;gAG3@`zE" J).t s v/)BpZ8C0p)PICDdX[Lmm-Wʂ!>L}_wDoW8LGRҧЯKoY%%%/)ɾ(AauPeV&- lޟp`s*//ūd!?T~W8cv蒏'ցvHH"Iif&NnF@:co]hDbjxzO3I7"pgqyKPXҧPJo6F[b4qqoqqv-NfsRL}_6CX4{]1^݆(+1")E|s/i&1pPDSH¶ 1Hǧ8466zCFWlp¥PyvTsW?*6H`0gk[x/۸N}MõW\z#Bߢ `Jv!CPblwrǮ06ە&)t޴lbI .`+J)IH˦cEÔJ_^!G(<Ps`3Я=MyE\W6H@`dE q(/G) `ͺD·w<1#YP MWa*\tjjGJ3Siq_VOeo|Te'CƬVԹ F=J5n IENDB`fastapi-0.110.3/docs/en/docs/img/async/parallel-burgers/parallel-burgers-06.png000066400000000000000000004626711461403617600271450ustar00rootroot00000000000000PNG  IHDRX#IDATxu|6{fQlY23cLqM$m _22|ʐImq$Ye[̸ZgG+deiwT[h}@il """""""Ս\+SFXh:@DDDDDDD#""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ""""""(Q`( 0@DDDDDD """""" EDDDDDDDQ:@DDD>vo݄C5c2c6r `F󡹱I)}8DD"""QPW]?xujELl LÆ[I)x}knlcm(=y tj!1)fŪ+7W#19e()gJvehQhkmw?{/~y}^( bq=ef]ģ]{[+n{/ hpUUEjF&nz=})i~DDDDDDä?Obέ6HLNACK,\6ߝO< m8l/@@`ѝ+x'P|p0*,#k&V<pG( ,(k]+nchDDE8CDDDDRylH"q"""!8y*,V+t!n.6o9z*?5P6\x3@DO, """!6.^1T4GuחvX6`fd)X.EXRuLa؁h#"@DcRw(Xm*?SEF{[+E3&YEfN&L {>M`:T@O /EsKpQT=g!d;lfᮑQ]q|`DD>huaȢ_UaN;Q|0*ϡmzd'bnwd!p͚iaҴ@ i@UUʰ}صy#N=z:kйy^?p#%+pZx ] l%]Pdq3[8s$ꪫ6cS IHM@iX2\~퍘1wAױΌ(P[{aT+ ;Ed@+;ӏMqh`a]zߡ=;qt ܝPtn>!ghmnBksJ7#cXX{/ z ш:w~y~Yf'+E67ݤQ atu u5}ZmG|B"a;z,C3EcPWS uo;tnWzQq ʰ{x5܎?p/r zd0{>;"V $L`a>|я9j-JՊQ< ""6gJV;"Z|EQ`aڐTN,Ĕ1{b̘uϔb[kh`o|GEc]-ܝؽ8/TUELlSUUQq u]MEUEvE5Ia}uǏ_m߂|hy?G٩ſ ,\;!vZn*:9t@DDc D4(#xч+ϣ5}umhoCU?PQ8;$3d@r,kmnU Ǝ yx_؁<طJDrl~fb q\&EÑ}t;w|DDcrhWب̩"<_ӏzire;\88)j$4E I)>I }%~w,aj{`+v`(OHČ .p#6#%,(eKO g8[zjݟ|EӁYrn2د/fvo#_%JI3=^ 4w{(@KS#~R|;?BRJj?_.eGZr4!/: @[k nߌGbU3oL9" ѥ"UhgO>7h~Nxn8m@M:e8,ܝ6ӏK*'ÐqX _35a@89q`&יzգ޲`F@tA0Z|凿lH4Ɲ?SLW`N #l u\Cƹ%o,C%"T" ]ڼo=P- gR 3>w&(o b*0!E,G`mUxxEX |DM4ݹ~)'XUS~@1#4d5@}; 7-5l`yf%" QO'o-UWA0BC )2kfPحݟ XUsW Efoz]$nP\}8\ֿEUU:?IDti7JVD\v:~|󨫮%7S C.gZ | ,gNg.BߢR1_fr@0 Rr5K#xHCRw{(EQ5.-) ?U҃ }]ױ{&쓣w|DDP-MO?{hoӯv]|J=Keѯz`l.Ǐ*nnܻFJ K N>~^߹B m&FDܼ7~]Rt_TXR|j )fw O>W:x0Q`AUU45wm1p~zzTK\'jH󨊂8M/7a7OustQ~X,ܵwQW]Le%n_*BݏÙ{;T 09#@W@4<_ EQd"]r|^/~o+p, @5ގa>BZz6:wPqltQułJ<_L` X]3 }\)M麑} sOy)Is|xƋO> EQ Dٺ ol\Ǣʹj@Auigy8V9G3&gN[Mnw'^{I|F. E 0*4Ox͟"uD}+8G8!0ij:&K9@NRx9ю?{ؽwܡ13T5< \#P33`Y^NPT;y vwBUU]"؋`qEQ17.g؟WfWxԹFwo_?!Qj73g} M |DDDQ@ 4۶ul}U\ranlu2悺h<>w UScA Cvx/x'ht@[@vtF d;SpU> JlZ:o3 xp+NHT$6_| K;0%5R87^x⟣|pDDuFaPՕx_vEnj$56`{L.{ȂWΔ M'g  kHb;`JqxQ>0"q̬)o O>7W ?ϓ#yq$؁?45/ZM.>=~I Ը Wdzz}.'OEBR|c@v7Gv=U~4@yCxh`\|M_X=UJx 2ǀX0;LQ< "qM>w'mG`z60?pagJใ<#z&Uj-d"iE7 DEQpoiBdfXJI]J_H |M+ރ&Kv ", ?_Ӿvϛx<)oO>}&H4حrrXL`$`j1\ ְ)7ߏӣx@DD{sm-x't:~`gH-j|#ϝ҄);i/>M.ZU*MC 3`z`[I0P[~sphv|CC8od渼GC灕Syy@zsn~O4MVLto6!IcOX% ]y쁞 %ذaN >K̠"_K *_ϓ>m@Gv@J(h ,,x`ao8`^XUU8?ڑR8Wr(*U*;@rd\ülrɎY}uq;+g/bSzpʈHυ- Y'z$Y`[T9M/MjZ_R0Bj*H%{YJfhh&q}|j/lV &ܹe$ I!", |^/62`ע!n+&)#i{c\0}xB]Z!wIuyߚ~q,KA4!T`:t]ǃ%ZhM3})|_@zV6TUţ%vl5ӤjoNVv[\߻[cs5xO y\'prJ5oZ_+&_)inhr{$3o.y[| o$m.`Hs]Z@45-3#a`i|լjӀvKA3Vo%6'Y~#.Ʊ*׻ln+ x^qCD}IW;î-o>έHFvoܒ I7 > 4+d x̠f{X7mqN`$H6bC_ci@/j[ Xn+ y\EՒ.ȗ݋0&gȮSGװ;Fh0&L„I6{.<ػ}3N'>t{@xuVmo3 n .5]@xnGZU# #fl )xo?/);Jvջ(btWt8Y%fiJ@jI ]^;|IYQah*>zϜ{\uӻaXx" [7z ;%й`s1v̑>mYv? LJ-PXeAvcRBdl$'G(* \urDPC}-y[R3eH׶K"7%VvFy-)91vօ20$utHbOO ~J SvNTɜ%e6NUyWOK#055b/3@t X,ܷ~PU~aJ}C0ͽ"j!ob!|^/*ϟKSS5r^KbGj,\$-^: kmӺ?K4]>?o>N2O2/=o˘C"qOq(/;\Y9gWaD5H*}j2d> ,*vZY V /P_ <\Ы s+9VϪi62>D+V?-&N*14yBQ8NO{5O~ &isd?3ql,/DU<}y@yS}\!e[Og`sdCN)@VR1۷G;#"o"n˛@Ӵ`pwէE}HtC?7R ;ȅb\,ڥl3}8Q)7 ﭴV vƆk8>J9Mhv>}$N:,KU7 ;y -My;HLJƴpͭc͕vuGi(=y\jSvǣ|_&,$?;֙6_0+Wz $yۯKNHoaeRb[]ebnw'}}pO8tai+jYSiG+{ܳRb# ]?'HES@3nִ| px"=@3@vbX_zgσlHtQ3.~gTuUCbr 2szԚ+> ]ץg8)$gd}B`qe͓-r^=V)Nrn5YT ܲP(l^<$_f}[OϐA{o8Wן{  %"X@4Δ|) Atٵkk设]:Kuk޷B".?s%+fȟl.~fpQ iطc 4M?%b";/3-k9󑝗k ށDx!^>"}TJj2RBco_N}@8r5w[:g"?fd stuD?88s^:s;'Yv@wFv-I> xjtݥ9Y,cqdMtt(Qv{PJOPUUv h̋O 'dBvk~ҤIH5}'h:p]T,*m/3HB-yRU5Ы0pIUs 8sd.U&閚>WI<@sF8Y' ,uM udnݳ@d}+%e6*,H2Ӏ[:l@HDFLlanOq %%%x7<#Q,``_Yk$cᏫk=aZdx:;P[3$" G>~c32/hR3rFKjU]dtl |d 3 k4<00=V6o ܅BUUXwe#=R~*<:Tns=HNN1cv9t2 Ҧˢߪʘۖ]!jcnd:Iv;u01U2"xuy?6옽ჰ:F%.t ]U<. Z\g&q Ffl_ݐ. 2Kہfi5o~VWS(* eDńykL ,nu8p.]9pÕ<CySz#8U+ǔ ;7CQha=GD4α 8Qqt+7$ɮ>T7nYZT`bPR*eY^o4]:ҰEA7Hv['Aj\욍t4VNZ!MhKAhs&I4LOS8phnnMS>eVK.o2VRZA8#¯}"<ߢ^,o0t -epDDc Dc TV?%s+]1¯'[t7t㲋yzeUR#ſE;#Pq4{ܮ*w0L3^7`pf&NTS籝سgO"ǡpi3&]/fTnW#L!4a= =1gkh8{|h` X^4 Y]̂)xѕZ9le慒OWO"0<=}^pPfsQ3 E@)_@߰ >wT2q${2Xn+=DgJQ(v+%}F*gվ<4ߖ^5Z@sE t/})8EQio1Ir!4R)5Ӵ! 6 XlFPUKbȇzL:ݰ ͊̕"HF֜ Mh|HʙG\H;'4 L0-x{f?p(}I9F&7M.)9ʃ?'q#&1\ "/O)%2~Ԥ*5|ƄtOY;ǘ҃AU$": zH d9#HlvũI4/؆ˎR[ICV"pٔ*@].9{V3sgb`;W8/:Z K,:0JkuEFjݾ$= #!)[s\-uc W !#<#?yfd]?s{8)iZ1yh7w.\ {qk:ɞaN7$v5T4 UC;^"1,("MGJ}t7 514\ zJ.L,-ޜ~g4llamP۽zqFB|,ŸiThb A/MV\&~Y!:=P^chLńS CzvNxZ81?C|f6 FALzIssO*ajhJO:a@D4F\.")fZHazt`dzԷSCe`X&MqPa4zzz@:Sjhoj/~ a֬Y0 Eg.T&U-;E2i𔆤nƋ&xڛaueDbS-V(Pt15MJf;)U"^>,%U2 c}` "_@4[k!,GJ][pf4`{ y/ .5'ǹ}@il6Z#2(~x_a8qo駞]H߂qT09zv}ǰԯʿg<4>h;`'=)1v` r氎Np:t2ϯ~- *I2?2}׀h,ch 3y\F@va}oR1PH-\>χ^ lF~~>oO\?rPڪio K4Y*4?@y%WLXe9xVVLF|ճľ_CӁfi3V-VdLY0"oR:ۺ2*o/٭jׇv_D[17u>8TW #=~CGVV _HVV <ɓ{HHRQ5Q{D4&u4Tuȹ")&N~xtXO?Z!P&ݐ2#rqf^2>|#,pm]!c ){/DDcDcl qN ԥZԞuJYJNucǏcӦMBEe%^xl=v / =RTuKgRNʙ Rjdwo]#5-yUpW ~_ݒ)T+^#e?#asGβ}V0{Hohah2 (ζz\!;;iV [Y*10:P>wx}^;z JZ]k 0HJ`_ )^x<"7%UNr$յDPg}%7d'ܢ!Wq\`̤գ2 t* )X> x'l+M@QOƜ ̉.Q q:!]%8p)TM͢ ϴPTk)@ bEj@٬oiL*hq8by hQV3sk[ݫZ``"jKBCjsyu P\LKXvgd'o~=x:TU韖 \1 Xwi㼩Zm$ {2,(\v]IDt ch2翻%|hy@:d*fgnY@az4 E@7'#vʟC9WYN6 ^;.\`@,^!^`O0%3髪]+q $X.}/]^hdl?#eVIuOtu LJAvRMJa?=\*O3pn6h ູ@SpJܺ`@Go+jLj R~dYlvX{F]Gc5Ν1΁?<8\4/Բ)S*^RkG^T <(+q(LR@ jnjw"p?P `Qbj6T[k(<@ZkmN[uwJ)\lC ' I% Ypn/>E pb*uҽ:?Uv.0@wy!k4vnXnr:u36cvt4VߘR=Pۤyqڤki7Gֶ9گwϯi@㪩rT4$8{ %(V h8  ]ZjlKsmh.  5ԔҚV5xY(Wr k drk^Z`' 1ߧ'y)xs`HMF.VRT$5ξhe9`u E"uGOP+d 95,'J<1dH@ F Q~`t60BVux{ N#ZCf+&E,S䱑."5t[O *s7_"0ܐTZݝdxy`јWurwx2ߧK xݐ'LW9%8%yûZi:Pumz &tq3  J`G3udS 3ɲ%~?_?+Q#).b$2 @&pp,y W o戅7'H CjgbZ0&@yioFky4WT wYv8LHABĥgB_T d&]+#1d225 dK ѿneW- U?G8:m%45s?\^ 6l<)ZR i>X4\ɲ*\}o7-(6;⾡pyzEC1|u.S !0]к>G8@Wi ԁ8SKUf |gl̗ܾhgd,I?3 `B4{z+TW6 ` ZXUfC+ XXm`B:qv85T܍zx;aO1",(49~;JÐsٌUlpj3pƧ w*̾(X|]ILCը=u 9,"Mr.:Z.Z`spQvʢMix2>( 47K(93c'~[3)*EwdQ:4er֟ޜ qoQo2aF:TPLz6pAvj[EUTl7- 瀛E.$y-]g@tU'w7P uh؁0 ~\͵(KO`[x/N/tv}~``A_>|8U(vgGVx/R~|4j!k",kh<G^;:y=@Q$p,HXY"q1L.Fj̓ ݉n0 HH:`RR#=aHJ$d vY?ay cVq| EYx!lz&jJ`rEf`sDѭ.ދ-|S {2Y/G.3XW:v5|}ϵ^>+*V7ΗUz Fu ^30SɹS0bJYa`uQSVg,b3rdL?c#" o]󇏎_5;DsSZ̪CXK> xdԣ@C\ \;uCS%k0]H@Y<8}/jWXPcHLI@Ӊf46E؍*A#*4](tl}%qŧ~o򻾆C6uYyLf{ܲjRZ>+M4uERbgH9 y?8W 'x!.-3߅k=sY .-gpBDE 4F֑N 7?IS nTuKxw{E_00zɽ`6}s+uz0G^9cDQ\:Nnzw [FbfL}n!i>4l;CN5TUjAfjs1kfnAkͭklE]C+jZr x㷟(L; lݐ! FW'*e^W~=5UpV"bLS$Y,K9)+3Yۯ*r^떉0wÇ?Q a,EE {ouA5yLHX3g@y/E{\y᠈ N#}™)`j[J> NeXρ>% 핍ym?9\Wgώ8Jsnl,3 9}Ϗֽ'u @ =dXM$L| GxA@2 ׆"$ CǒySa!?7X\t<8| Ͽo9FARl‚>=OJ ^#o>SR〛Α$ L:hVU@A,H|㻥 A7+ߟIc=DZvi,טa;^ODDC(j1ppеo0:ʋw .B C-@!,怇˥@4p eܝ^ tdIgؔL C[Sg6]*HMUCw\y3 `XiI>޸XfNCrb<̜'^ޅGJt0ty _ɹSx(V |'mY'N߿E6U7$i`6 ܼP>py?C):^١OFĐ إi [$u!%)jA8QS{UxͿ" 9^.зNL*3qw̩z,`x᭽xaJAvŃ7vKoB󨮪 ;;ǩ-AeLxB]I l5vz S4"|@ؿ+gIs txL.=uk53@D4  ,6TEg֑j'd(@^73RseN`Y=7a6o<-7H플Ÿ,!5g{|6G, f?( y]m"xEVO ,;|D2jzaQUd w_LX"V gxdL)W~0~Z2x4 y53Eo7t3H谣mq2h" ?%xjsnTj?( + 0wHaOo9ji޽X~Btm2抒1Lڠtt<rgN}{M7/7yG73ʙ@Y=qoH}_̚/ bE fM 0(9] 3A.ƫ[?l1I]sYqnߛ("[.v7bZU$/}9&gAPRVX8VO??{ =GQ(ǬP^9}~.nd8E<-invJ3)FNuUVEU@IsHëKy}SwJɆk$c!DMɁ&Ed~ۜq?Jm{)\ "wl1߶XWlۮ% mnIdo^_6EVt]vFfc+EK@gK=>'i>&"3;A7u?Wm'gY>բJ#`s@Qah2 VG ni#+ ]&p-`Sryf [W1ɚ/ܺa96o)I'+>b?%]t7/?:P!SCG*哤HO޷N)+S虖*.Aۗ <<jD"z6Ylo WDcX%`twVQu1is^գN-Lw=r \5[յӲ5$19c NUhDŽyk/‚d:4_3}LIE*V.}=-7‚@j$ꑟ1y~m}UbB5>!8TvCz=~@#z6̦,"7oISK$F`KعK, %2…VMڞXkzo$*[! m琐1c!". EfWg"8Yֹ}hM@CgHVbneAsWGvҭxs?ſɀd5f!Dbf>1Pub39lR33%b `Nl~׬]-:Xן^؆xwPcDisc^ $E_i;unrZ w5 ܶD[UɒX5UZ;9o]z.S,c Ҁ)_7r jz-{WTJ 4o dhAU;&""HSM .N5! 6p/͚įrP(,5i>p>V l9lD0/͝4Ve eY+UCנ1XBt )?^WB;/Y{ˠ<bSQ[1CZJxo};6&>H_6 z601CLgvqt`Y4.`sԻ<}r{jkUS~$Ɉ#?^"(=&<g~]R=qzPc慑r X>M+'{ov7Cv,ҙ( ̺&Bm5ߨ 0;J+'EH9%?z,.[P/B d'|~ o@Uww. #\6Yj)~M}Ĵxґ<4alhyrڤ5/y;8 d+=4LDGJ4FiIS`uϻ=G- I2 is`M^ U iv{ t`vHyʹuyRi,z\ CGk0aZj~o'R 0j{7%)m(гμ )q>)߯tlq7zdJ3/m mߝ"H] |F¾CJ#"GUWJ&a/c ~~?﫭a9d"heLΝ{LVORGRvRHJ!)ٙn@  u:I )8t>zj~M/soQ ޖRnHrU+wyS=_b" ]#0EEA{>Z6퐆y!qZ3?r2|cWpۭt緢3Uv#͵i+eRukNTbYNҋ C b02}d%0c{N""bh,SYt>Y`4%Rぬ$)50 '~lGB=f(H bO> - _+7ܲrŽϴ6Q`K1@1rw!)㌮I.C ?rmz :3E pumq`){oYл'+F0z!,싪úwэCe@4iXa FybQ9VgV Tr[QCaFѠ0@4~3w[uu,Sb>>*OTIJ\4ZT5ڒceY꾻3sdՔLtyo}54T`Oi7 K7`+5 <.Vt6g\?QQ6,(:m] M1ȝWELwK]`\G3#OtOr&+MZ{OU~qp|QJj+{o4J䞕bf~3ua77; _g챣iAD40@4)qYӗ 6%+hH@kni5ษ޴_H꼢p&^#u؀IBQ\Vsl⟬[c4 X$f`B[yt6@ywl8c<$e")g2'">-wĚ O[6t6@K#. 1i0KJޜ՘}߇0  L=#k#N 0) )lnm"Vr|@Q-deS4{aCp]fQۖ 9}JfdtԡSkEKછMQ`bґ;=>ZQH `J, pFoQeDhtؑ72{;.3]?YQ<~/\jbsC|z.2,D޼șI9`sD T܃sFmA7T&(Xp'#69S"o\̉EHJڰ]U~m=/m>wVԡf?y',Ѓxyz, >-$ԝ9 C r.w!dJs&?пqv` NLuM  Dc]`)s"42X M EGejPNX*@]O3z =P$KlVk~p5ע 8V0K7!}\Xdi.ÁgOt5עGFbf>Ŝ D`sr3E-] X,y3C*뱺ך_y:x +N$?Bh.pWގGp BP v=~9l  hrI6wp'k4w[*nEѭ"cKP?/Y]fԙ?kΆ4t͏򰻵 (cdP2bs@XK-& yHΝIs1es&Ùd"xf#1H*^@#(OUkto2{wy <g_x4b0  @x&_qZǁcކ6 جMd:ҁ64v\1@1 jޏX "(WVFb0)N{6`#hisaFk@%J2LHQhxw3SWߊegBJ++I@W6=ZѝRf  ߇4WԖ`+/ g֊ƪDDc DH9io; `Iȥeg%JӧmԪI *t=8JJ7.n `F7$݋͖ Ò-`ޮ.7 t}(LU~ET Ţ??HMꥳ:ғqKpKމK@1+gwAUڵlD"7 W aL$ 7̓h|aZ:ou<@ 9DՂOu9 Ј:bvڐg׭ĬiϝZ?+򓗁u3`〸c%͝ҰE-}@9zf7е^V;>w6Ԝڏ#OQGkK0- ʵ V49`Xm(ނWu&oPb`h<, g#>5'pd!0p4BgHڿ;otE @laZfH1U6`D7#ף"1:1HpifHȗWA hu@u|FfB bh:,ex?1tnf 1>W+WCu]3rh9>yz}(n@QxFr2(V Hk-X7ή Pě"}<,zgAa\Wtl5&O ob|  /<~OtFy#q0V*{0|~ e7<&],xYBMWՆcqfk>-gR/cDCyq *#! ̛ KR3`:0~n/н~I2a\E{p'9V M]\ #6G, g AӁ@Hڛ)MeQ=!CZB`QH0d!nUSdGt? h$]8%N& $:C UK aX|0/úaUMHM"m㮛WZ(vϯAQTe!!OCYz $/[  |-@U>-@78L} Hy9N~ ZK|5յsVϺh-:*5?ʏnK?}?1iu rјxb0oNmy&xԶy#WJ`mfQ gic g`U ݧ%`qț {SW['UQK x83G-Lrdwo CQ35NOO^8l/  4t`R\d,ʚ&:X kv5Dun5M193&+-+;琌ATj?}ːr:q`=& PU ʋqG>es2 IˮCx?0eq5"#mii? 9TVf3(M2-e(EΝjUvM82ϝDGSM`噉? !emGYz 3!侳t6.BhUב2`jh( } " OsVꌅ]nkunI^,<-#39К.w1e@Tk`ǿx}^,˓Vyp C[RrOO,C.")viaǪ\|93X(@AԻVYu JGU:ΜAۋ Ͼxv3k%@׻1^oy= $oX0>_}0(*J=W܍@nuMDkٮVmq-k(h7?fOGۂ6.8n3'2?5|l_jC`=g/+Z/EAyPrIL /[z"l鉈lD"?NWkඥ gpٗ Û%"YD4$LB|jNWLX;jjxAm[q^먬DI벸RfOo ᫁;M{U! fͿ\]|rL;J +F^ߢw A ~ kɝu@Uq N/hr,Д W!#:ƀrTR*JdO75zo5Ft xC?z_?x+2% sz"r$a¢TL]G\s]΃Ca_E _7)m[+\F/NQ3s&c&G/*u(f wŌ'o9^Z?}-ezM"D#. Yh8%7hM^ /yq\qʀNJ)+oL l+K @hyDfٍ+eib\7dK.`OM P,`p#>fr(JZV밨*.[<'bɼ))PtWǾ礬LfEG7pz^@p^94^)s6|E@gK}Kg'0+>tӯ̆ߣ]z?{{7 5~`B" h¦|E<;P N #e)0=ўIs4Ղع!8#0|;❿|~~8Fx3bEr GZr,`bFpy60KX 3wн~|p^9Tw͔ڮx#ؔ/";n;Jg~!{ׄ//vjH._;(HG|҆- Ðl|}p>%?wQ<yHu% Àj.2 elm',sBL^qC,yNkV5㩗w_o+;cosZ0m}nB̼&EjQ^AMQ+=v>; b9@IY6=ſ%މPcENx{,$"w#a*_>3u|&=,;_l'"1hO,P͝œ=uӤ߼` R'jɯɂݢ2kiLzJR5Gյr{`Z03[u߉>O)30"|@!LѼjjx3Pzq"@a +EEQ]}<%.Q^Z8؊!]AicF^&ݮ@bc_Z{|C&d 5?vnڏ}GN >_*Șw`,b$htޅw uIU@߇ %۞#1yXSx*?}#á%_tܧI v9wp+3Muڑېk A5%?li (ٓ8~=\~DtbhQW`C!iwߋkЯvwg `ti7kʄCvEbB9`KOŏ>};G\u_Í=k’2(. =sZwkǾg>3":*PtO'Qr63kܐؔN7o%8ƅ41EQZm(?{%^wP68!Hc5NꐞIW.&%U. _u(&QlVd }b:4VwaCWoPó:(P.1 CV{Lo') ! ~O`Os;X%0'74`b* rLuZ:䓷&!pxb@M/x )FE B ~0;7p1)Nn4]T橮pmض$Xh, ߇ݏ wQ$߂+Ö޳Ia=V;'GY q}",*Ha) ~D(:,[;>[G6xTavmzs6|h^hhR,vE| iRkWJmjhl<LɐvyUz\?OfLұŹOv%ŐEa1/6> 5CHZ)Kig>4KI W,FlU HJEB\L_ϊe嵘3=+ 'dⅷ %13Aӥ:%]ϡd#> sbLPT>lwp`:/+m0 4t͇֖#9-TX~ϣAth>]}*ZQ<SyP#`烥tHLQnUQ_~pX.;17̞^$ Q`yբ\%Aׁ}үPb? [7Svp.CҰľik {F$"$6$]yLþ z,Mn/@wn[S$[½뀟|jY7.Yn]RXC_,K %p/VHuh_+. 8S^6Љ2xwXK_lحVoϣU_ӑܰ nJѾ{|63؃ 6%+3!/;c? #^rpg#sjnÐWuhor 'Aݸ_Q]Er^,g"nb\Hvb¦u]3gP뼗l:={uXa ⩾>T7.;&|.8 22@0}{D^+ VĔ? {dIEw%g8Q8*"1@4.u BpD-,BZvC/zN;21}LS1TߺQ*ɱT~&r . v]^ใƉ\DY7]uq-p.lsz{9tq_WK ᮛWÍ?^?k!+3%y mhy0@ow[޳bD8R#iXx@bmHɸ P" VeA;EvmN rb0l\x+pg"gn2:xG?{Y33ۤU-ޝBB5\8(Go!$%{,3xfve˲aޯzW33o|Y{~~-u9m5UR ΀:.lJ-4Ο}zѠlW/{p o^6Vsf2w?nx<]{&eםߺ\\\N97#' (at„&5q/K w3`rz\_EwMMlhVv+Q\hMʏ-5c6z ^y6_WA}Cp$*yKHgc[*ݗ==Wf-[ >F`3.a\i?$I5=v_Cu!Kd4 5sg呾N{uR7!9m,ut ~JoSO<(5zח y6~w ;&{ڔ;Vf,$ߣ;CuQ5ô=*ʟII(0vI [e"d>Iiq!W]z)g̟ OrAF欘>'bP_S}cIMU}^biLD(SͿ) wu&.ٗO+6%C Ȓ)Vp{ieL*k'ʰ%l;zYiDz { ^V`꠫/ugWQ"]hXI[+;p}2*eiB)<^R~a9dzˆ{_G؄7[+!*"}f?w[ -YѽGh(-,C@J7\\\\&$ZJL:$TꬶSΚ}U>8UM鱾 f8 \ S7˗vsU` PHbLyy{ުsMF"XObұE*rkͽK)lP$ _VWEiK̺AZ6 &tË-72Ko:g?L4`P R8wYXOreQOдےT!O࢚ڋ $xĒ OoPJI$a-eyhJuO?6{l-O/ 0?@/dk2Z 0s< x/70F~|h9v4[()7zw8޺r3e;h_'r:\\lHI;{e;ԅ#,i}*>]S~|ꏤg*9p TP I @6j΀͇?ҫ7 ɣhahyPsE0-[;JG|FmK CO(g"ӳh(,Ȯ :)^ϸ1_T%>SϽOI&ec読>~K\ vhBP1mcY6iU{!0wb ?oN"#%QaڪcYG~aݣ J.(oO!&}xi9xƿRrB&}i8&v6+0k/$x<.*;H Ӽw=]\\\ &` UtjRkԓ-U˦ON^u }P쇀7=L`隊cH*O/0>hl۹EgϠгul=cz\u0Qz?kAiNwL_ZTBRQd+'CY2J\W8RɌUN5pxd]Z` 9IzH WͅGS?a։~HHϧ=t#M쫛8s:ik1SqƿDsOCk{X]g\Q!3+K)̊j tFFU;3-1 i,?90 Is'Uzg!$1ʃ,2|h9MHb?|\B`8{ey( Rqy-Vh/#ݧ<5^xTq4|kм !c~l:\\d tPzD1bRQ͇aawtC/]i0jTԷl.H%O΀u`o^Y6<V)‰:ybsγ}$$<BPQڳe*KP[U 5cIB(}iVZނb{Wu{hA"2@C4?aj0H({) P1r~S~Sߟ-%(mmᄉ%oMx='Tsg=d;bMKʟ-א-{fpw6Q̸J2M]SSFɥ |Ϙ6֮_'HBMP~9Uq[_V e ކ: pqy3(gi ON͵28OlQB )V&HVԤ`T*R45 ySa3i48O`:d SqU{QC:N`MCW?̫…8eȤ=Y?|:Sk-r\z?3wޱsr #LW΁vq[EL,+c +1- :"QZ#DcDL˖y,~!&/2mWYvPtԲVH=`Q_>z]O뻲 Ay.:Ny `g DS&"ɡ/f%*43Iaxf [EV:Bא"CB}r2hQ]mpRU3=vZ \@iܽ2' Lh^>䵙U48pW6k[H=gތ͜i(+mp>3 3]rpӎ|fSU\9w݉)Q;l:o Lor q-XiۘqP~Px Jn07*?FhJ0cE'e....Gup&^} MEI VNc߯$笶DzOi,R FY5c >bM6#aV2d#@ hB;ᆅ*5>_wzzqlkVu7/fָcpϮSAFX1Q,)1ƗN6IX<شQQڪRՖ0Jꫨ-qvRhcF_W_ƞ-YDy/9 o8Ҳߊ˩ nfKI?>CO +6G,HM#,: Ƽk|TU3D.8k6KMaj apKٺXPa#k_E`Dbf{u,)UAP=mlKM?Hn"~3X!2}Ckha%GhMfR\[̎-9\bB=ZʻcN@xrR3epgj..o$M%V"#ݳ"g;*Z*"X!(JdG xtnsfk(-[hG☽!:ynmw@dGSIC_J%xUsSAutA!-(0B{ɄXՊp=!kYW Q'yʔb,DI>%L^Z:{ټK9tM4!WȕVQQ^DQQGO$ B_i릥ΞcQlpOX8Kn꽎f24, 3iݽ˶y~&ՖϿquؾz O|*eΘ9vz2%g/BSWL+Fh,H4gQ=Ga[n"meK11:QPn~0{B؃ʓ׃\zb|Eoluqq9EpF..9Vk[=-;dY)|?5 TbFoYDW ,&0g w۶1 ʲb~ﰌ$ɪ y5XCG:D9F?t7|ypoG>IߧDK^W˾UM^X}igZ5sMb_k2(PQ=/@~p6B4o*J?>@&O3 #*)2{}u7uqqqyq..3R"F{kAv?Sbw6xz},61V5;;ٲa={m&z-;P0]S尳]ٗ7|z?^y/?@ލX(k\fJ}LME3T[^Wԣ= `>Pg͏ /x_يfhOϳC+4A%K[$fN)(oU7rD7>svP:̨|7뉴'0c x/?(s AmR0o"9}˷b\.NG}zbV6K _ ghaPr<&hb`yeaz5Ơ}+!Ij=Ma%TfǯSR@hPW؀9H_nn n@Yj9&:տ\KG..I\?@rڶ}?)S's9s9g&֗SYVah IH#}[of6FyR%|rxd wfKobʧnBK9ho-6C(A# +eÿڜRi$LH<ljnF)C]\\Nu,~tgj2bD*”͈G#~p6fO8Iءt=*{E(_0n?JQc#Vj"= }j z] vˣ!]O_PxK5?0WPEpz4KFΩ@h]/b6&jSktA>:C EĉL ,VM[34 {5txTHR-*rJ ZZf|l,\v׏ WCJ/+2M9녦{_a1׏nx1 xx4D⇕| EjmIXVxxT?B.OwӮH-X3!;ʞ~ ӡP Ü:duqџ&zB0c} yϿ^'̤|LW}G[< q~tbjK-0j$Nߟ?39ImLj8F_@ǓrÓk=¾eGqx̮~~^=Y^uw^Oɻ?^7hD....ӌXu?;0"TzomT-j(2I'?(@oM/yܾJ TTkv} i;`p0]*|`1+nYJ'&|]ލOt _)}N]钐5ά%-!aKY%L i{B5Z7s;L@hlw7Ph;1$gVaxU6_aR< h_[P̴7/* F&uo$.^}pOJ?ޤ)xciȠW!PW i|I.GSiKʁaN ió[aj*.Ӫ3oWvyDlog-a¿#?`k;Q$RJ:,iS ӶyP#]OǮnB}۳5z.5_y{2D5GPh oЈ\\\\rqK\\N1,3n_1k|kMlѶ>e1ϚJ/_pm4/i*4Cp+wsgG&2h2NSy 'bvphy`KgNg_7&{ 0y/v.{YN$15P ~4h, Ņ\:!A"'5:#Q6vq?eB?^Fw_˖F}e m=Ĝ T1ŦG0-M4fh`fPPZuvEkn @ӇC;2M0cK"4@=xAO?XgU1WRy#a+Z^X^}A!Kk; ūS%f;4dIg-Fx%\0Ǯy[VCP"NLP`x(0G꧹c¢Kٙ ᡵ T+3*#U=oב[syycyctǢ+ RP)%ݱ(57κc7/1-B>L9<Y-qǂƜ2 W@ayeS'㱯ߚ"NnιVV)R=-2%4HȮLLBęQ[T e=&-n\JUT!0%̧}q=Ϭg`n"?ܙ ÏRr!c'™1JHe"+P΍ aeiH},h"# qE? a}4WUFMa=NUu!h( "`6OiJmJ:gƣ)5qq9 q+Q3}(?}/+`A +W_V#^ۧѶg=sxb=V탙p;0p]}ig. !~7K`Q2+O"`D-BCׇ&qۢ#~fגue4|.t8M/Ltϑz \˩pq9o1!-47ҵzw)MCU+!%-dʏߴFdх+{EouRowS]TRZ$Z{_ҫϠ\?BAd!ؑ U}Z/CG)*ΘF`Fbʹ8*[# Xq~/ Bx<:YT,cKI̲ 8g'OUA-M}!CxtB?K:R)m4M^HGԅ̼l{H~|] %O)ҦkPOlT?nq{Dܛܓ{={7](/㷗\Cǫ5[J;߻ݑWl ȸI6j>tFY;JuПIR>a&8 \\\\r 0~#~a/fmgdNf=؃6LJ`RRt,&f?u#%cx=M -7L/g+L%jxLwZZBSv*s@EJ߲ҷ,J}BQlIk;:k֣;p)-a~g7J^{>ۣqvtPQ]cP104M8&CM#^'2i33{ݟK¶3Y)_xp}+#*mlV{yg 79x0)n72iU]`>q$B /תU> 7"`ڻnգ9`cg;߹l?'`ȎlńIC鿄LQ0x}Vvg0nו%`ČT=M %3INqe`=^/+fg?B'\?ZݚqdW#u'ei]CRuzߘhw0<&9J4 DzI!z?/%ZtJ,0uJar#JttfŔ􉛙8 ϜC_˫ G ~z({)y)z(x{tiB&07t$5-F!{{ލ=(=W Rh{9E_x.iNqusq=0ZekM`.R-؎1c'xK2-\*-%C;6ӧrmcqqqq90|.z8ee۶,V&(:taխj7J h{):gk3QN{ &'G4lSRfINϓ5L$E2 ==WtB0L_wRN¬:pI:eFRE̒ƿHFP?qULĶ%7]y6g/Γ/W6]Dj5-E04BAox+Т}h(ӎK$, SB܆h"Nܤ7aǜ,l /*#ӖεOD-p[>͞@ze+1ڒq5>~xzv_1sꡦxpVJ4q}6o8Ei ɇ8sxDyqJ$q~˗O7#],Jj'Qp1u 8I\>ρu9j(XB*u<)aйl7VR)zTz0Hx|! \2v|ěJǨ4hs7=:z!+/ 1~>[&G 8vdEђB~*EM}Mwrxk7 {Xq7;5XXrY/B#jxԢ];-"E9DJ̸wtn 5l3)p~,|fDxIu.L){^;U)G/V%L#EU YNudDJɑfK/OyA yi|ۆ۶)zot#t31)X_=~im GІ}ďte/Ke p..NTJk?wWohI"i%#RR`2jE Pv͙4|}o0{BjenmortC_⥨r?ŵK;*C3?88Q}v#Y7btMôltM`d|mk+%4jcSvb}lq#mݹKFE2H.tIm)<:egP2P5ζOo9uy~ >?K͕1"^JU?<\4ď]l{_b 4ͧ>i>OH)i -2Ͼ@+R ߟe s!T-~uZ~#wOÎ&醗g\1vqqq9^\)DRȩt4.rε|~o]A4mHxOwZ˸/ނw|.zP}DON8@$v$o iP⺣K2v$\3 3`p"LГtv=w~ y)WRf9S9.ZDkG-=-lH[7m}t 1jhKUV}Գa}^fLcrC +3;[UAXft3\qK9=㽹7T^S \?5>P]cKONQ X RrA_aM|;[QƧ=c'@> " 7,`{I\=3UQoIJ\2z@ޗ68A|Rjg5vqqq #0[z[~tM2CߞXH))>I:1_Adg]׼iCeDԢk?=R” =jGW'5J{N0O h]f/4Olǧ_y6_ xMTRSYٓ0-P8J8#ʼnMBl[2"$O$B<~B?*zήtփ@EMPƄP$ L #2+qѭlyw̮TQ5'V8SaE8>xh*i[ԕ/e{Mp7;c!p=qn'pa:Hdk&V`_>Ibl9[g9cM=z_N؉fqa`b- z"&\\\\Fr "2d%J*y&@IώE>})BeA&}l!`v 񣷗-IZB̻q2'k}ϓkT gHN灹*ݲUD톎\pp.ǟz.?]stݰeD 0tJpl[_dX, ̇W7:R.hs/޲;WvT.X@8KFH koy^C?)' ?eYl\G&;c1[7πfCvDp"מ!%}l+zj#~2I+-Li:Sι{z....cpq9U0DSU!xA6_0+Ls L'p[Iort"=}]?2*Jcx[vFW#p9@y/qNl....cpq9bqoY&NpT/FpTM k!D칕-;sPJh:8x=ʀ6Qt$AMGC/Y{SN2i,;ڳg9Ƒ}Md bs*'\J 7hfx"BdFJMfro;ƤL5FTm+CS)-%hU<Fڶ[&f,m[X2ED i騷m#cEg%eJak1|HՌG.'|_]44ÃoAe5P\@q$+((Sr歟_ V"XOEl1Q nnϖ(Xb0\}>)aX:"}ڻrEpDžvh2G<mlO% }/oo%{ ep..Ik iKcHs9;i 0.\]z1li֛=!`?^/uP7-Ο,2Ku[6t8Fwp4xyv\$:. Ibݹ˲H~kdX9u0D<81q,PFu Lý@=g>4~ /PFX:>c뀖>S-֫h' ҦV8Mhr2z$NVPWW&9[+/4xT|r%6+Q-{  O R}DZ`{AK0N8ЙwxS{爆/&^:cƣ1tt@*4ˌypR6td¤hl*RۍX4~ׄ66-UWσ{L[J\z{{3gpWeQP'u7[&~Ԉ& VG#iiS% ssA AiΘ\; 𕁷 tZQ2ьhUFIYi޶2 fT|Qj;i9+7y<zyN2=.ͣƖs>YXq^'W' g0#wP3dZ:"Og:tнjWϩ1^i?Wpri)ߊ)GAS9Gz5+W[}wq.w2HwV'.QI7^Uo? ,CPH#!TT' B؀ftL! MQkT[E˯F&n?ݼPg3%uS{....'rtzsxcu/B/t" F3"9pt[} A|;ac6m~)vw#S)Q٣Njr: kQVq(Rdvt_iгJxc e eJ;#Dǔ4A>iN:2YK˶ԙgOSнjQ *83@.o[CKK$ ҦetoSAJXX9wtDB.8'BMkzsP^Puz„X)x{,ODϳz5C1;]xrr;nyTܲ֐>K"s[3i7^2}l\i@_w.=@%)1ȅ3Icr2 ~tڿmz OQۗZҝ-)'۶3B}$UӐ[wBlP9ѬMJO.K`фtj\2u$G*wz_n- :\cuH2t7V{ dܤp$<EFdx9KtԈQYBIz gMzߘxT*GPQ䄮PV ֗25M}봼Z(+M_!4Un0u3 @[kTkO-_e7ZL4 )% L h~T¡W)'tlG4ǩ{xĖkn?o)?7JUՍzQCbY͞]:@&L(G~Dnݿ%=:Rݴ +C9M${]\qX@G3={tF@p429R#q0n>om+h _C믟F2<:e2=Fv8VJ}BLhG6lB.{ɾ[S tvo?lzNvw2`Vh)y}:'1‰kDՒ...L럁K~ adou/^VF׀3&!_\3Osv׍Ikt)DNF4-:Y'eginkyHaJ0imk5|Ps2, %!G(EJKE7yt;ZSuM8qp>`y>0cףߐhu,AWRKLUzrRD]%X};$/ۆے_hy0tu x/σJ-zQ 56N\\\\ r#m:UFrLC/.8}+#`D|*kIOi>uEUwJKz?=9?}#QJSYTy)06ttAߠH+'BM?Ѕr<$ PS<ر7n%G.@/cQwUޖb&|=#) m9@oaxh9\a_a"> 2i߷i2SP/G NPaXs J ) WŽ:)R"&03StެOBYN@_N,/+ZԤuåTDXn03E*0zl`Hi$;$/C8Z g9` `/!F e12By -wy3 ~7Co;f;4FS #A5@veJ,y%u tB3ѱ*{W^1+C[3 M={}.oesT]]o3l).W@GWw0Rӂjx<^4n7Swu~}z30;n[WNh/uAۖ2S>w߸ M9k=mh;vqq9pJ..2N{"5D9 '^|`c9?3/a&e0zፍ&WHSC:pvflڪAYC`rͽN_n?hp ]OE3TfX$5VE`•i!HaO @eUiD_:TCv #?F@FAayXm ҄z#J4UR(Q'7qpӫ "uq}Ii 4 !%[yP8l nqQw շ_NdHڱ=+%i?V=I^_+Q+di/={z ۃIuDzە &kLҲ񎫠o!)Qϳ9?R+v߄J}MLRsP_: n9IGbTk (!D:?k:*V}걩I_1MÁm.thVQڈ΍#M$MLGQ^8N[~F^ ~WqCK~54#%&_ OB V6LA2J ۈ7uH%v0-oS7 qW0g]ʹVpѾNr:\\Na #گ&'Ҳ^6^%GVfo`KZ,ϡ캳ujPWlzHQ[<{;08.gNVMg$52 xaF? xgE3`ж:֧ {JzV$NPD'fkԵLf~ hvF#N@3ݶ}\k]K)CU,'(3׋AϙȌ3ߓ,woc&;B8sLof}fB /fdd ^ -~6~0,;rxׇV, 4-q %֎f_/Rp=lkF:/7(-dWMY&ȸI"g HI߫[c)?I!J.p?M)?8Oelq..pl; ԃ~^;l?=}> O[_><=)|2AŴGwG@کp,U'Pc:6G$*%4([ E ~?D rv*G%3IJ4p,ɼLՍh(Ov:G KU_"˷69SU_!(룫c '=] PϚ֣R؅%+YJ?S+XԶyN9l[vcm~$; qqcPt2ivBF!-Uѻ[9|}R >Q}W뇿pbUΔ(Z?5[ނ"f]nv|?V4 *~-ϭsa߯Rd](ЈmG0~DGn+U5T뢼5ʋaGH}/j>x}+c`7ٖIL9cIu$#=եQ>`$n|X v_2G>-Y-ENLwB9 CF糙Q<5H(iT5W>~ D2Yi<. gMV-M=g";7 qU'|QFzEp5З8mMS "-9`Q+8 jRy9Nǐ^ ݂}й/U2:L ޹>'Ih{/AbQ fm&Wv2ٓPPZ6ua+ My)o%ڄ񳗰>r!|t;f{V8ܙJ:U(_~;(Rb./mFfaxK(b1EX,;0 mۇpq9UR TTRF^." Yq/M;/ٓUCoԜ)S#ާndԉ6gS jP(bտa[)F_ Iw|Eҭ}Za9C`8Wɰuiltf\\\\%rnU$JT$-#!XzPV*E'7!蓌%ѱP֜TailW_ǒ'%B:PQ 2pp7|ky G[+UA$>do8&)^| L}'C~x.x4R5^;4m6 Љ #l:픋K3$wK/4sw @z;~R{ePr^?ϕй^(,GE3`ՏKY|]R?(f5#]XQS?['_J̦N2{s[$40헟?y%fI&I?9..(8f"2@It 9oM)X 4|GJ :) :_F}:խ 3}I7wݜ{nqcrq&I/O&fS۔r1{!rLWF9Uwq%fwfErꂧBE!̨I0Le<l64uڇX餃Tb1`^Ἆfo'tRBwIOk$)L|I = g[;-z9P,>vHfJO@@;!TpƗp6IMS%F3.9yIΦqC wCyu>.GAh0-ܻeqWPR;.1&Dg? A{/A/O%5Vg?c`^=K-IC +OB!ԟE܆9QN 0Gh%rvD鶺3FD/Tm)+} G GH R5BהsboJۏ Iq}KeıGDF"aah`8Ƶ hQ҆paGa8jj@! Q};=j>>&8b4|"mg:հK0. 8k? m/8T |5 HDd }9YrjѭRܷRޗ g,Euphd_򋙑 !2_J/rd~lW(98 22DR%!2}li딬OedDh)3#I3d` }G7b |.*oq= pr[XvrpW p8-*+ }[$%h:Y=S?Pu&,'go/_UP47@s`&k)#TI;yR },0d^ԾJ2G:erl} ҭ+]~,d}=>H_q`&ģd9MwR=Iw-Ų಻3et!|<} 4п E"f?}&.Jm#tVLXDs#c}޻~Nk;r[Eȗ`ݼf]qk7)2"hM5T* tp;ZS3!Vӥm#<zQ@y!֖1[}'v= k&դ V(IiM\26H۠Z3Ee8~$PW 8K{Y*">tclM[h 2616ʥoMϩ4U'mfw)g@rAj@ n6 UTiZ۳o%T]tgDeg z9Dgˋ:upZ 6TA/9fF3S92|$10–6 )4Н~2C&#JLN@Ed:J;!@9$*_jl qީv\uHtCCcнL]sߊW bRJ `]p2IDAT7FÍ/_T-_llϯ'#iuLէ(p1/Q[SFtϑRұ Ҷڛpq9űV<2?FRfkRR|\>X]u4~LP=u ;M9str@ +]un 0Y ImVz΋sH 0# tM\H4bA]4fD=VAJh{]e+?S|z+LFթjj :ƿ ~_u5TѴqkYsҤњ^pujnR.:i쏍<ƌd"h$d;3FH[9r8N8`QFZ0Cj+0+"mU[pr o?"HI=<;o;?nxD-ZPŴ_}~7|Ai : %[+E3T)-CUW!} '3gwRtެ'[=ljn#Br42l\˩cBSCoaycw_Dt_ Mq+ '_ 0-X"lZh~ _;_J@ U~LPOfrDz|"n!ΚI%P8Nc $>Dsd' s CNڪ!rG 6.xV\> nw(? O 3= 2zz['@q#"Cxn>{J-5iEʙS83:f٥h `at6cJA\|6*C*}8_fy20ʋRc}[BS7ܻ V5*'@kBCtKg3wR`p `D%:ȓu2Sdd? eM` Ҁ@x }&0G~RSQ"4A+"4|;(ZcK=p5_6NLtbUG_C"r=q-78+@JeW.VD?D ڡ^g:H˙P`R.Du8'V)}Ҍ_5G =W?KPՋx8X8wpq9t5J7JII #Ag_3-S@;WiB?3}^-/Š=Z؝Xzϥd.u/$0Oj4[k~}|_f8'/4(*V*o #55$@"  o-qDeo)S 8{?;iCx*\kip,aŒ;As3/S~9xJRaFE%.`??|FpRyѾ.btqqq9~.V023$hSD慮Qzb M mlTJIѽ2 uiuLA??y<=尿n\ Aض qS ڥ p' {v{]jJ{+V@ټp:i`4 DCbHF` o_a⭅[w@wdG P~)t<EIl6Lٽ+sfHJd6q(WLD0 }s:@m}-3ULϪ.'K~8^>&z_aZ< m3z%\McxW;6cb='@....yp..*qH-NFL,Yvp_Iݝ1o3Q}xS?BPt,S~j^P4S&V')]G_{_:ix؈q^לn{i7$j'PD;)~Vr/X?.z~JRe?:] 9dM? Moz'e% o񳿤UGUvRTг1B-yr9]\\rp ePHMs&YokX"ʮ=+h%C3QrJ|E&Us_H𷍰n=:F#gJ[ oR϶9tQGK0PYNS";+?(P}j h@騿D/Dr P<fJd\?NR..]캳ܝG( {ϵ-'@....yǽK&f8A)Z*C[_N)T|p37ģz 'BѹyM 19[®p)FA%RN$D/yLw {JUEPVLQu-9HeW\]\ *'TMл:{oP%$`נ7^E,&:h~b:hܯ[χ$+iw~F⒋pq9ű0ٞzMzAOEai^c࿞TpX}y`Oh鬑Fh[~%m(q; TF憓-OJNۺK1Ըw]ĬGw^@Hy-HonfXO+aw%m̀9 W*(SWDR/:Xסh!_K9P~h>BIL@T:ҿ^$tn$ oSBȏ oRw9@/).ɻ.Ղm:=....ƶ`4l8Nq̸ |-}Э+f?=HN ܿVٙx=(4kأ_iC[IbmHa(,8 ]/@xS"T\⒤,!y! Sߥτ 6to>O]#yQ%$?aP_ eD44J#sqqq9FhBO ]SmQ5gqD$:dt!=)}{Tj><1g@fKhXlEd'eχd 4Dn:(Lг:ƛO9T]R]4$T Gc] ]vD֏PPzNd:9zz[ }NU;uo}s:jm]ԗƋGH¹opqqq9ɸSCJϓj3x'wrн-k<] ?}~ΤKul9|g 5o?'7ivTp7l2G9ly77mjU_h^j4{Ghm`X(#oQm8iUxH:6:LP$J(WL!woàm4(J(6~V$G|.#[ KN{)l>.ﺔ*y?w,77wF _dI)ѽZI/|SItK(S=JB72c %kAp1<)0J ӆ}*SBWak2+L7 R"g}&;5Lk)mMM 1 yDUʡ0$b&,%. 4C\hJW]ț:yL܅J$w"J&#X0%sqe/zTo r?QvLFwQ-%r>%uB+?+ Xݷi,%SO8Lj)]Ke`%b:\\NE2"7CPHHqt*ʈhL_? ޿Gm5Ty"9fS74u#يUӪJPq4QhR m2&ÒwI1Idl)hn\,Z{IrޟSU&Y*2 (!@H9cc|kpM2ɀlrVZmirUuǩ3;3;g>3NwWW_k6TP.$ k*s%JezvCUJyU1ǐ/^?x |]zbyLvy'AA,{ވxYz=az3 C?sOUxq*߈xxffʆ~ 73BL>6 1KӖ韮LRxl3tzB \IgFWEfMa!zM?១viS8i;Lk!6lR. %a8Q8yObxv Xy#qXu33? R~8p <r=̀!JlRUc1X[pA^x9lR:Czm0}D7 J-u{,?X0 pkDhKw0t?1"mHF+s)MVBq^[Ȍk+MN{]p{/aq7J*T_'nXR*ů5"c߸L`ͺOubo N{- t>m'խA WË*8-go k3GRׅ]?`a>Mދ8. dq1FuKhY5P) x;6ܭ3+>>|C <7g^,4h.0,1GϰM?ibJuBM BBBBNRxiѺ|ڿ^@%P;8G_/Q[[S]yC?zG7鿵'x@y esK־ /V7Cbp^H/ d?hYиw+ Y' sd@tA9ze[XF~_O'#,j)rJ(߾]_ R5GcoB3X^2Ab-ZЪn|Hxwi;&X"LRaHA9.2. ?H⩽{׿;^R+mԭVt=GqvX2٧< ݏ 2(4K%Kc!y0sAf^7cBb+fmQ2׼Wnץ{ [F>yNsLY(u@m+ߏ]7$|*6tJg}'TfԂHp ΒY&tT9Ƒ.+(0/һ}%xf lzQVV N{$; y ҽgx…FDT1:($^ ҙ7VI*!ӄU-Xq9SRg;?k"{w83@Ȍrtcx&TGdI3euX-cvÙv&`*j,T}HH#tT9f$F$VNlwDO_H/Y(N6,mɩG*p[Z4)T-sZdO36"jr?v=J;ajqBI3(Mt򅠸[eZ\aoȨgVk,pqiM"{F̑!@&8} ٶࢿ8u"8;_)[QYg8hr%HEn DXZPRF]%ԞN lZQ5Ƶbuc8DENCBBBfR嘑|{c?B_t  y9ËJ\WTdsF[߿o[oĝF^[@wE djDQ,{HxݟIs, N9H!'"ȼ@WʌG &E,f(G+_rǯ\ Fco#ȷtZM3ΐw; Lf %.tzU6`ƴV?pGRGQ w%eᔗ',U9&3=Cdw11"fsՋho<7cgeWD|!s8RxHX]!&W`\1x8g`m-[φKg`t J)`Y 7|ğ_dGqVQVC62@r%榱1D [×%!*h MS~ڼ/@~|Jʳ'Row~#xm&dĔKP; 0[JHab` P <Bz7{ϼE-Lk ALCa.gs˗$B4Z8+!s-XZxRMuJ+qFq4Pw4 SYdFem]T1CC$OAlboW^LEc6~HMc8YJaDf+'$$$dlB@HHmyq=9 *U qߗkԯZfS816V=]0ԑm53ϟbW?Jӵ?e (G &%䋇Im?=;Ԃw]7!ʽԜK;{ fSLjT\H,԰ {rj"nEƉث=OPׂ% +H tkAD~=6t<NO=BH).cUt3!zOqVR_z;ޱCv85 @8ԯ끅a9%-Vveva>@. l/@|2^RH"39z}b7Co%~{p|r%hsHl=@I͆e4]{.-sbd1M#x Õe=Œ,RyC rX ^vT3J+T|pJRE# pɧ72']0AX{Mg!qLwKH)v$#2F᧝<>].LAByf} Oxs!bD)2}W/ΛخQjXI+Yq$Яedt&:+pGRg%n 7_@뮤 /:Af Ce0ք-,CBBRVƶ~\O@)JƘ$}#]Ϫ>}V]qr{|G[U?^;nFGr;acIuk{{"3oupsc_-'B+kq>LOόk췱ю m+Z' f xJ.ej T(3W@bL_L:9)01+BԲC,Ww3z'CBvO.s Z'zg?Ǔ3NFIuHɐw\=A,! N7뽦`3-Td{2;̐hpx2PI~7 "f1.ŭ]oǎ"1팙!0 '8M:я2R"},ԝ~G3j_K6#CoeOyr%vc;ٸEoEoqcY1MV4, {YvHH#aZԵz*BrN]W)GĤbՓ6; tר\@O: $)f6yXtbx=khy?OLO{s$PeM|%wK;!Ct{?azQNs?xgH}hG ԥF*;R/f>o5Va-Qw:V|v;2x 9/AHLHp샯`_VQhWTſoB j t"zhNkJ+ƊF 9QR$˾wS+ۧ5WQy>|+F~mcѝ#9uß:}y.+.KRbLYP#tT $dm 5ŔpY#RJ c&]ɭ6+U |TB;d^ ݴu[?%]:ts _1KTQU1E+7$Z0j.JWů쵕O鵇! - ڼQoVW5YRNf xch9e# io` _&0iwHH^BBoQ׺%k;"Af_'N+'_:LCdҔL$?u Z5Zom.h1s 1i]uH+s ]\A n?LTK!+'0( ,ڙ#@`>"ؙ[߰H dF!]y26 <6~Q#-pf/L9kN! "u[Nni,WkbY0NPh', a`E= %B@HH#TڦE4/d'ؾ #F^0T  |tn0D+1X4(o& Z ~;ĠzS(N"%=^6F8 0[-5!gZH@v5NNAq]Ft4\貖R/OA:u2* $/$$$$@8 rVFd*Kf'\ @) ]92멈 -geTPO9ijG G!c:$F#>B9.Pg(IjQvilp5 ;̤ <DJz$ĊӐ'ET3B6隖%VD69 Bz7WR!mof \?{!drL k $&.No΀JkKb9A)RLcwQ{J&n_*r tv $E '4,^MâU"n&JJfq菿JzOs$!,fR]H?U1,1KHaиj uKڈ'TRIF}}Ѧ Yb쫜S1SĈk!!!!S! rūi^~}!,[b83ZP(?~Đo?4cc Y$Dd"'O`\t58X* 16 穔PCDP@Iǂe# %C,I!$dF4KQg阩br%nregEmSh<ã &%V`JΠRD9֎BBWù?3}Gi>m&԰Ljښikb9I3zȎ$QRV8< a/0N/:e|%-xZ2DBBBBf2" MKoh!3:ȣ;qDkcBsnhO3ts@6eN28v?mӹ${rG0 jP;Y:H2c$OY񧯣骳'Q>uia;$$d BB~}2a'{_hsO,|Tc=ܑT~Lu\`)!!!!!m?oKPJ1|;w8f eD~|Dοg>Gz) bg8vf .B@H| h^cTDEUh 8Sc ?|`ah=?3;`mT*dˎ$nV\z6R_z6-`kO_&&oG5!"xiͤ$;D`I˚e4X.w =N;닿$>}]4\vƸm\2Bzc $$dN !!!peinmw\םMz~?k "L dA$zrC`'q0dNQϸx}F h߰vmހJ,(o0 EFvmVAcދF}(U[zf=p4qq_[{s]UTJOCðʏψ1 M9qAKyk?jhF@I^5}2i[=pm{r:希>5?|+?vfSc;^ xv:],xᴎ?$$$d2yMĖn$0nd2Sp"C݌qg ,|烛+dVʋF~D.| -`P2PdhڨƥD/[,3au4/[̱v8%Q|=~A=15™ c2}#:h\;BDIk[Iz^ںo(˝Ftw/d 4px 6iS%v!7:SH G߈+FL?&5b`4xqƻ+[qm@G:FnF~|cZUW>bvnU8O|s?| D|2|L|yGJw2ed#NJ<P^ Gjú* sj? u| }+.dq6@aߐw !0nZNr~ JIzlg󅄄#Wm&|+}!s+xheۈH c ^u,#:Bj ;tڶg!!'$ե ܈~F JnHgv"wz|WOkBTޏ +]9ȱ_nF*Dq^ju-6"16>ESHުՆ*,k?;J~Xq)VeG]OOA;/Nud D*ٛnahJ[8.;*Ehk$O"K ʳG$[o9Hdwt wGagxXPE.\1~aA"KD@x 6+4皕~?^7no=r^`^f~%i kCFƴi8 ǹ!mԧuFt.D</ꋽv/%ۯ6HJpƵoр ˦A~3VPkzmGƹ7zNjzƸw 30dgge!U, .D'VvhDH.B6߃IE4_5}wQw:.ވP3T ޵sA:2=QxSlA  DS@ڽOH;4L%Rѭ;-+W2 ~߳Nm_2dH< W]3a_;rF~6C=>lx OHqoR%{@mcA@.Fm-^@ؽ ߿oaֆ;ޏ;Fe@Y;)>ID!"-Nƶg;i52!jؕ*԰CAhHZh8A|د.SV &T`7"?f1B Y"[S0J2(W;ԩ` e:p %)7!_Nfv>mlBnȎC O*Ezq3dB%I(?YDߌGC'gjGg. ~AD8$*Lq,E7Nj(ǥ[ZLEmbJjcrh*k7'OH3"_OmЭ]_[9-eJ W`T}q?lDk Ӯ^`Ʋ,@ϧ{F|v3s7lAۯZP*ۥW^V-`* y~[uuM>=>u~OuIktlcte a/3yCFe3L"1Z691Ģ;o3ݭt?5(z(ni{[Ec%|yxm / tDg.y>0p{-8z3$ H@N 8D+HޅrFM齺-,L,"K.o%s 2θJ?) imߢ'> qASn;@4(N'ϋY󾲺0z"f Wcf=@/ \7}@[h|,*CA$w`?oPÎ j|w!nƸ{0=vVͯw7/Bܰ<.4k^{QY,l.^ɪ:hXSI BWךonF[ڟYE[&da" ؽtހjW]\`Oo%v~(Hol-ϡaXo(USI⅚t3cG=>0E!>{2HG;̘n/Cr P>◥xQcD ({w 7?)kb [a xw%6O:~T!BɎ]| ڗݞ3RLc3ֲ :n*BM W_%w8v}BR7*'z6)=owOaȼ~kߙ!Ǽ4MtI*?4AJ/ ˟_S^$89B t ?cƿ_c~ xJmW}?y)lzTk]Mw/yoԠ=7>;OhVRsaO45~Z6E'w xIJ)\BVl u30E߉f ~-H19xҙڹo2˲XU.͆%dn9+SBf )0ɏw !XWo`~#RcCOaHHW~_Z 9UP6Y0xزi_ho[k?lKB>z.";)/e;YHٖ9oFJo,k( w(πҕ~aFqmHaa`ŢX51P-DjNL7 7{Ng&MdR=kPL3Dm̅M&f,L tW8ZH%Uüs*Ӝ>1^o^ 3g]CP{jyZ4Ypd:8ѝ]neWCY1_Av|;|6këAΗ,ĴjhԪfx ]/t)<Ʈtz*)^E}- NZZ/}AF? sD@(^xH59ČZ(8Z ~ZXdc !{K9pcdG&,D,F_p!+^8+='&4%ֆEJ< Ur.qw$+Z-4( 1/ |J!">N}V7fǰV;8d!ն_-gBz݇ݪ-L<0ajC԰ !fSvŪ~ُ.BDF:#7Ν7l۠d %^ߑ7z4[?į׆@T=S0ܝ NY,81>bg!!UAޟ?4aBﱁ0,+ŌFjb"51ya:EKya/ODIyBb+WױMofd^N) :vVl^/,, |=U RB/ܡ2b-72c_|:g7: ` I#;8gyiHO_ W[5m΁x[A󍽼2#BP=xF0_O[O%vO&@ n Am`]=P[)nt0|T E~d&߂rI'M$Vz/86Uxb[x +EJUJ z|>xJ#R}U !=`Nj#.0QhH0M0Pc?èl%%"A."яJIHT3EX^3c /˯8z< o,ܖh(ץF,)YY."E9N~}5A)>d˪iCCy`0D5!YwF<ЈQ[؈cc`b!, FoG06>@)3ÊѨ6FkjDZfGerZg%tli[ޗkکHI+wfҲᐍmXi01o*]ٟ"ihOڰ`q=} إߧx΢3O`TF dHD Fz: 3a\پ477SSSaD"?Jo,8 ?B^ ߚ^eYeYXiDQ,"Dr|-rZ+@u K-Dב~s[i/1ںe,9o^QR2tJGi#`I#Z_?wuP'e`Q}3O!Ef,ZІBV n/ N907˖!.+KrP{AZ7&GR Q xA~fjt~W-̾Iz~EoZkX)39Gz}![JKA5fAmtq)/ (S%I5,zRl1bjmpBۢLa1;#:JYXa-^Қ0MX_ a_~$38r]d2tld"fQ2Fft S)DeLˡJ {?e!1b1zD,ԌQ_Ԅ؄{oYfM.5adIBzbkɸYU.jr%[гm/ҩ`PD `]IzpFՋ0_+2|;f[ K(0 6j`U㶝6E?C?mq#wXW=/eNPdʆKQ謞n ݀n'FzR& ;#g08 2JڳL{8 ri}Ky|QdL9CI2Yї~_M<3(DKG`E \6/ӓҰYڨSK `|?9wkO6~ϧ@a`b{<9X[ؙ4888Aޞ쌐b~Etv']Yp!s6Oީѻc/YV >vCx)|XRdxtд}>K3@im΀ ^y?\uXtEbuy]&6"ШtӦOS1JQxĄK\,,]xUP曁N 1ТCX'0ZD.cه>O}|7]K㖤?P0 QH]4=$GWe>˶)_Wt}dvRɊ!6ze5 FD-8}Μ(sh/}5F4kRj4HNh4Z­q53aNpbHɰnݢ12Y:|;y'޺<_-ːNp2ÛµedG8೤en2 qKaKe߇|%t?^n ,qnuUO4)x[6NOAD > Op:UWk J YVHIe?f?Mfʯi\.TqQb}+MdpFq:$(u w40i#D~-~~Bך6uyQﯛ 5ZfE @"Y:=c3MXӌ=LX3n/`AO(3 SsD.;%j7[ 4(KhTQpwYWbЎd q B9Wǩ_F髧pCuԌJoagg";ȑcu$Ȅl$~^a{3Dدv.(qY:Od 6Ն* ,LX0sQ p % 5Ǧt@-GXhdV%\<4dz_۲)A&7/~P iһ?}Y>&3ȤH&+Ǧ~kiy1 6-սGJBXÿ-}6>YW>הfR)RuUwҸT.Hh+t+]wZ#@dR-.dlmN%Zy[;rH[/[D~jc58o\ ڙ{H 3ǷcDrj9cG~a7vKP ބivWzY 1J->wp508-\.[,i W9Z[ont!gJ6 psKpIm{ICA~D];j I@'w)L,yE-J6LjkÿFߏE:c)< vq5oJWQs9١Dt+J144Te2Y1Cn~Ua[a6tSj#<~vws١Qg%gM:D:.Ç;Q7Y=4ۮЙ= >IWC-.|J8 } < ã.@vG)16BY\E!@#НT`N NO"D d"-y%oa%'MU+%8uy!sY.\z~/~l@znQ˂̍&yf'#:9榀uM&$0p'+(]9'ގQw ߀EnywKg: `g(, Uu}~jnfgJRO/!0u!Ron{Xа(Ov='aqYNO{Q&*on#(v:K!dl|c?b,B)J񪫉/z1 ===s4c&B`o,m,YJt*2u@?emþ/Ѷi 5m.OLشY C-Axl`f8A{Xu喅U Gyv'遑2 L>Baj93.VK)W_;s՚a_@ra,. .C*d ʼTiF/qղY¶67xA7V0I>-m&|÷Ἇk_I0"VI@:c@iC6#ؠWcueC!{DKB55iPy&O,(Knw{s?6U`O,,:|1<6, O \蒀daUbR̹ 1S3_HuҪt 9?kNQ QxRd݀O6h Q?]pt{s=j\7R)AJzer'e'J)2M3C7, nJ6xcMC ^Qg:pĺ9nBxmLwbIZ!ѻ@<&78Y{\OPZoke?+ 7qe{I|4d,nwȀ>Zb!O( \ӽ2 Vt:_qs\mW iT#Qᥟֳ0БK,E:DF/x_jƆV*86vÂ5Z? j6]3\INﮮiĬ/{m\tz~= ϋ(6+s:HݖXYp$ {OB]t\wnVCz]]f֗e1$IT`~\͓$Pc#RnԎ{Y{' qD Qj6n8(#=֧zN ̈́:Nhk]S ;-ӻ0 s%8.g`7(JAE!PxQ'l\_H=7y6_~|Btf| c|PoMrZuݪBT{{{O@WYe˩;bP-˩\-D ?OKt%LQm KLN9{lhj:m_-xOa'}*[YLf0 /9КW( Y SK\’2gaO!pO~gj};l-0r̈́ƴ.D!̉IZ͎>o,8Ui2hs<$Ҿxyv2Ŋm :_wZ0l=q\SAIq\zF-]25VJHm{@?X@ fS-sG8N(AjjjpxwQoۀR D-ˋCl<8}E!3nkP(]grcӞN_9Ggof]Ls@rBY sMfpCygwO.c@9p-?Z6xRGOzDi~[ ^m 8䓞ѵB ̺nwQiog⌡FG&cW]I]:q5\C{t@8:Mv<@)HfuóGt?OMᵴ ~@smyJr{2YPFm-$`YiV+1T" ;@xFU.zaB4:M/Z[rs h3ATMEn<6kD_4Y-LI@oPd`$z&ص@~𒿇W jM~.O *DhNbVO~:<: IwG'$ Y7p` i?K\+9d eUj رaBC#4b6ӓG>AAOTZ6C۹E`t>T 'mc=7Cn 2 cHr{zQЉBACӶi͘ ӨRiyY~M_voۢF?D\"Enzsifp ጷ!V.:_tXG5Mr'THEWD/ Y.{3fÙ~hi'̬L-RaU uI9z"Uu>B@jvv)أZЏᙿz:9сA^I#gvu!v cPt_'KP -a uY4|fZ[6>r:C#dR xKƅ:Ԏ.]Fŗ;Gi*44-N;E0*BWV-`۝:km{HWOft\c`€pԩoキCg5x׼_Zy;ʐ _B8թM *d2QȌ*܁"g`U^BYiP`h?U ^VHkǠ:Y<p_ ѵM ]]$rf=/aN Ga_6S:*lWn?5%HSGGݧohGROc\y`Y:|yZN#ì/wrթb>fI;2R-$d[;J7,/n(\|bhg1FYU#;\ u,GMQ1rCoVMvy 21Ð3$s/ kF~d*UX/;;iPh%Xtm#]c:bM_GetU^b7 ˛˲L8";bpQN'Ѕ@ jQ[>{O.o/BӺKxGDo8 ^{FMԏ2. _\x[NGI݀N_!}93:38C/":.d~p ϟBްyaԝs.\JzOhUeT`F3`5Fowvd : 7(*LE?DUm3 f 75ԽFO~byof QJ/k]J>+gp_׽~aT|ʜHZFG└ Q { .vaQ芕d)s=:2~)-VjX+Nb@rۺ+8i.X lK\Ijp5Sh7ARd =5ɌkQ,) 8~ ㆼ ,}YwY4Me$!pw&jS^_-|W2[g>/] ^Q@l:!(N DI,_C`-ʷҩ3k^ m/A 8 JKG?:oWUK#Ӄ.kC:ϐ=rX SJ9S+Bt.B)dz.[j@WJ+׆P2sI/--BKvӰP77 ,TW ͐^}#Ŏ?;"=CBJJ2>Tvb0q=>8]gg_/A#Z^!XtכX?mԎ2er":&GG[BN r"pbga?k.aF׺FˆXL(8:8u0Mƫҗ0Vh:=!,^0~*jrV]8S5Іy"7 w%YE7 QqN"ˆ%䆡s^?ji.: s C%K>oxlm3(O(O~ [v;_n0b0;$EcTmJ2@fhQn#V*8{r6};ʝ2Z$3t\ =-7懲X |7Mm8s]$8iN(@M/cn+2ghvG;v sS&79(u7۰A[3X.x;<%9K gVxoeG Y# -F7 Ěae79]B 0ˍ`'v۸9PN1ডav_߳sA@뿶zt^皥M1|TGbɻ3P9@J8D0r'@ei%t/ށL=<궜 NWӇ3ONu?YL d{0t'=g=vu'ͪpx+u&P N*'iu2t8a=RD˯c i{"cYV\ HAӆ+|O$Կ:\҅U^IB1#W 7un^QEv/8 4r.ratWSv@>-naUJ[93ԕhb!= $m|ӋV_>wl's`? 245@)bkɸ#K\x_c"á>2nVF\"M׳ µރ)~˅3Ҡ S&J(]'#R7daxaܜ=azhyj"8cxn"zAm ߜv&YJ6DɺPXBL~p]ǻ @(/֡sv*8hUxoנ SG.ߟ%c n##ZǎHQx?cpmM>,<:O3b™rBsrszXe' YpOAаfu?7•owH `j'; ݏ E 6Ieub'9.2#蟬#..s>S‹eon愛Db1Vq&~c\VV? w(7|C7p OyJU 3ξ <K G_J*l|]m|紡'ׯ`v"F?~c?U(O8c nW\b킟D _t|ϹpmM#^mC&DKsC?9ۜoxQolBxɉ3c"L^m 4M ?W~AIYp< =JE^ҡx?~.*Zę~=XT<:h\sFF}qyQ)B',3 8==s0&lqa $:ڛ76R FKy/ j>ϻ[f% Ʈ[jh'/Ual*6=M-Ǯ*`Qx|CSBJ4&(Yg~?8CCG`q$ݗ6igX ˢiZ6~wtn{xcA hX4r@%]ʊn&vᤳڑ=YvXR8 f2d?q+z9[;GJXKom#!4QH)qlg( Bݒe #8h498MRlV_h_kQ|\FCC_O0{s؁3Qؠϥ0dhՎ߉vEN<¢` Ǖե?0 _>axF(} ?_ N?ߑt<9!7v/uN4u[fENR5xFVt V-om}4<)YGEM}a?T9vh|iJ*:HzN/X(QW",Zi*%'L}?O^ Qʞ`0T_p  >Xk?8a.Jū[IPyB57~(x<5k%,ϼog~wq\x \NL!tAiiRS[g5/׽구Z?/P5Y0XP7= 2tÝdF 0"аV 6&n8pBIf.W]h,֩jBףZm5 lN^~8"#|߻ XpWNĕ.w#77ȡ c m΄*܏*{5@c!JKn[;d0>O {#) tmDoģ[2p(8oizV'8>QiG~ ktMk3\ 6hZipGSQKצ vl‹Ru}C+1JR ~Qݠ?Âr1hoPI뺤6HHݽY`%>+)΋S ;W%#EK `1Y>=WSsc=٪/x᱇ 섞X\LK]XM KVmrμ*p38HC#^_#=9G̔`mvv~VR!mDg};lvd/ _+[ΡB CoZ~C4^v ;Y0ఀ;:[G ۚt| ^f6JîÈvL4o)R (=) [<!Uɒ#;lQL:DwۅT #[~}/QXӯgxB5ӀIv`X -KB.?H/OT#zwV>ݻ@37U@ " >G:ߠC~mM05'~F!UZ[_BQ(#HyׇϕQf_߳nx.ۡe*h>jO>z2x&^UNآ`M#  ~P#57y$ѯ)FjrFݏ~-^ݏLNX1S:"T G{1\.}?IlB6@X|&,Ƶ 7q»>]R}LӺyGMbpH:>l> LC`Y__CsgJ_G#D`A?9eRV@Al #dP?cR)bO)T8)&z.%7G/'!2P#& xCNwS$)nsFnt`E<Z驜%\"#ߏ̽秅k}C mFU"_0~)9D) xPR [ɪNMH2ёww0*DžNw#En`bn"9*ph?&5#-q}oYV='^~; WhKG}|-6(D`~|7_Y(S.1 ~A^0R0bi̢fԧgEr0JA.:B۳m54v#Bl]4F[g{'d!p+جbZ<,̌`Ya`DRݻ=;c#!V3VOkiɁ0L@ibQ|Z_jFX,Z ?^B rb=͈v z bnrz)ttfu;OڻQ-n596 2/)egbaZӴ1瑈FYW}? _OzqvW'r"Lt M2q9af YV-*z}ku &ai'|+Ba#,]69Y]1n;s@\u<rX(UC5] J)Vp!3<̤C4gGo>ƫ;.8.6n7bbcuFR>X{M7܄OP,l;75h섚(41멿"Zn}7Ldbһv2C> ۱Pvny(e N# .hFbk",ǀspkDBÞ9/E'/0?:ZMlX/L)> ,: Waۿy.Yh1.x:|c7NܑX).Y`9Y"f!J/ 1.Amxu6c)W3F]F4[R:JU(=BE7U.J BHN| 8zl}a]i\T̞ؽ=D,sMgPqc8Ыvkڦ6hN w@!0jk]G+_E뭷Q{U..?!=CyA2=|H^k@>M%֬jmt KxS>ΠS._›mG( B,/Um$+=boDt@qRCZJiS"O6%da)9)Y˒wg?%}P/߀܌Nj1$1Ƣ& qs"~;Vl>abjhi-3i`icHS&J1Ǐc5| a쳨,n޳g̈́izk!9xt0F/f,ysg[//0Z[iFV|g=Lt*at2ۉwJ"aPSSSQ83~zCS#!;Z9-.r1(+x΄f=9r )b@עZoTh{:g"I%Ơ{Fi * ixfJ"tmwIw"YxYһvٷ7Df2EiSW2+HYSNC< cfxDg_d LuwT1|N__lz0M'X 3;8 _*G<Qhr.p1Qk`itJmd'Wi 7qo{{ 'ni6uCZ+&k'F,F|i2DXmsSwu8p#G088H6Ų,jkkYh˗/}{e"95k?z qۑ-ܩHJ7\ąZL0%Ά?e,Z_6Z'oJES8C9RZa|f~=V! F,i?z %(PLj6Vf2!{u'qg`wp7D&HFr}4Mi'J^0 0 T&WQ6 NvG0egkQqʶR "YkjLj\g\!$QC?/"K/%LkΘqypTޱG}8fkO[OK/nvî'HK5OuԴQM!VbժUߝT*E4Ųw/+ T`}P£Vp8)tIHȩG'#BGy_@ B& 6/t%.T?i}|J8f\A3_ YxĽ?1'R?}#7tuEøQ-2L"Y:? GkײaAJIΫv!X~ߏJ;w ͷ"VT$5 g-l(S;m|,7Zsאָ'e!&&2a!:>t}sOIfvX>ֵ2m"V.+VFi{Ō 99qJŊ\qgi0د$i6Ja!Y!2H 92[ !&^G_#o鿹+bW5H3N-5_ zmj̀|ǀ0 ̦&̦ #1G"n C|!@Yg/a,M'9Lg7j#4d::{{._1/3*)u"9 ViV)ڗgqGG'}(rډ;,7R~R_t Ԟ{,,Tn'#NXYfpFFݭю^V:qfCYf ;)e6Z .Ap +R*!36Jj+l-蝣cf_lUkhh񊐅GҎ|Ba LaYHDRZu1^D_NR1\dSX?Namcj؍+$Եz9)d*jggvbzm.b* 1.!ezϯo 1vd]/RǢ7-4? 7h b,vԄ "bB9B͐~3Я3 Ϟ ^sr\yXciEFtvO!w5ܰТ"Cg𘩣aOzm8"*e@[7|!&^ӓoAJ'"{UBMM R#t(8]$#L-wJl=l|]M&~PFpNy*OClj̊Ό/멘S'f¯zR …qS]G }NaN9JYX&m6ɤLe .s='/(Z-XXj ijmŬ-P !8rHpZQ{@D"A___~Rz;p+Mt4ML)dG N aw{=[?xaɸRUW>,d2c>͵pZp-jՏ7-uY(!ؼL_#c 7,YⷾQk}ۧ/ P{6 yR}v  N| Kg1[dR[l]Ӓf0W'!3O R(;Wiм+Zj/ݕBNmzv0YrZC-r4aOD_3>%뼶8^ r*Y)RGLEwB\d2\d$ }[^͵/\SZT[#jW-}L-ކQ__P)8NoU+4V\\ {3 V.CݛȢE,y{0Ju"90]_ϱ4fq&sŭa3 d=>r4pw~Snvy!ɈІދ&(x :aH։'ߋh6.WPrENAOtN*E;xfR֟LuueFGGǍ&Il.8r9!seVIݥ腘wJ/VYDъ̄]sϣ‹˟L eJ֌gre)x:Dz m_xR!82MZV)L9JmT%gDGQCN =s(}9 OZ`*݁W83oT?{L(e#3xW YZM Yڕ(Xy]fCSbEjBlrlqJ';\Q6dv $ xR݊jc D!Y/iJJ}^ u3R99ieOAF}dB[,y{;fws" c̐Lt]4/.+)5u/=o~,DBւa% 8˅g*9נGx̀'ˆ`^Ѕ}EN]םPJfidU6HwY #l8WV?Qv_o^|"\DycER 4pmaLRY\B{9W3'~j%eNxwت } TT@%x-^RyٓAlN] BW+x[Nk pwTg { bm3,:lK}ҩM!ܰBQCPDd2&ҶuyooeTNO6. B;bߢqp=ļ4MtۿU,[0l:d .hb/Ly{7̷{lʷHyd0kVFGYcC l9aeƉYޤ=O&E!r @5STrrq'M^_n&sZ/e68-jbrI5]lDUWɷSJ ˈXU<ˣ|7[g*xjCB7+Q9benDHh'7𓈶B;sp?Ɯќ.L3Hu}B&V 6uJ{ YrLbt"?BxG|4^qN^p_ tLӗp'y17 c5+)2B#c_芕O($-Icѭ];+?}Im ˢ:CK)%]3(cTJ S $ xބ{-J6pa#݆V:G;#!!K~e" lPp%u'18+6j8]N¦Q3.|@(G¤[lh`Eo~+U1'cHi!v  택N7ө>}α]ml?x>m! T˫9tTMa'sX"JiՆ}CK?{E$ʾwԎ'EuWv\l= #'3VA+0{Nt-:Čt,-qWs؀M jKBiL}4u`>\ \5Ŭ3K]X#>K!, *}-|joMj<?QFY4qs umaٿ7+?紼Ul:r')߫Up|HgPC{7=ꃬ]J;|j6I3<蓤1VZ0MbdS)UnLKR`JD-h-_?Q}Xl\ u˕"VdwEi|UV*Hء3Vareu7;7Th< 09qErDQ`eٲW_ϖ 9IhJEI )8 9ysܕM[@`j=Oзn^[F\r hJ WİEծB  >*6Q-xHQ'k ;%<(<:n(taB\p-Jq:wHۆ&ٓ՘꺎a5I+EA8uB6ڰ7 P} G>8qV/;]pDMk;XX juM9qkڨXJ-)<(;*)B%BHE&]|[@OބYSJ ZXwG?wJJUv(Qd9߿oQeR ;R+Y.,uJD= ?!v~oڼ~wǙۿWX C'W΍kˆ*͕+p(Z\B=jn 'j3kW3i|my~zʱrT@RKuQв2i(}(=y_u5q )y1 hBdp:, |R~w - '!ZQj0Wصp:L e,S^oaSAz:`N49Lވ -U+I|l\A:I5 4Fd2ZQ{f7S JzL{BӈًW.С*H?3 j]~,dMz`#j0k Y} 5j6Ծ5w)@>Իۮz z_䡑.4Mktv o= foz XlT:ܨ&'X/R8~ů| kltq) <6u')*ARMy釾Å?I yթT+Aӈ?@zTA>xwl>p m/z[BuiP}]L@QGPKϽ"%8?<)Kz-\7(_@D2lY ~??a~W)osJ`%T x/7I ZqSD@Dk8w<D7 pݕ`\cMY2}ax:=qT} /ZJyMayMv-,W,bRS5<"3/\I-6muDKpvUN$"B`1tA)tZB7tdHgs̗+J]ۗ Q)ֻeM̥zn:Z\ Z, -IVWDӴzbϯ+FxMp^J`$[8ΧC0wm?ZP%"׆ }>bפ2 l2@|zOijn. KS ַ{*;#1Z Hذ׃SV*$ /ﴕ dJ60)FFEl{%!*)_yNU2Rsϲ.b Ux9'O5õGk׀Va&H,:`tf3J^20MQ!hDm)@?Hk ~Mk^ {2iƀY֘O^X:Px1rO>AR8z7+Tql7uzrd=~_SW}z-*c\CsʯܹH ύ;m9SWTX\ "48 XӃij)<0CW|)',Gm5?Ѐu~ނOpuP3j'6sUbUK 9-.rz^WExyHT@˭V[0e~8i3fuQBռnR|% _ٱ -YXX}i F3 P͖[&~maKFU9T@Շ&A,|=8mwCoV]o ÿF\P f$t]KI?Ǥuϩ%#]W=w>_U!4m˚ jLFM?bVKN}!\CQ<~7em(Ē{Zpx };Ly_cZO[ 0[hP8rȃC^-cQuT9M.Tx_/&&۫-I?.iYx\MjUd$5˯Ƒ#o`>_ed?@l^Ӕ&T9U{?tGfqgfpUG<33?=?WJ");MTFA-.aba5X!,  #,Rx,<{WP.kj/|w5= =hѨJ)媺Y0 u% XdsW7诃}J_ބmEK6-5J!_os*PΘhk[V&WArˡ//&s׶U@ *|87nرcugqGM yBϛ~[e>b,^KB#NhkGo?m)VQ&SB'% ߛ~O ?]e&+aWh!ih8GX򗪟UT\kc*r^<6uZSE{*)@d65@lR 7q %GeRIf j瀍ph˪5W !Ӏߊ02'aϠ2+{ yf dH}d|Է?n7 z r>uqWq=dTƣջ׍/#k@T xK@ .- \fO^ldhQ qH}jTˆmeX,= -hH-^Ֆ  KRiI)`fVk|ΪJo8R"vG!S&<~z.k>}ZRs,=4zNkm]}Iu.׫hJbdK&Bj{SOq…Ğb'sY:>1l8XH㨤lB J aK݁TJNL-qB Sm0$}fZ -r-~W BR]eCaW`4IUґNPV4,%<72`mWqT eeU] 'i@^÷OM.a5칹ʀ^ yc9Diz [b؀:ooHm5{U9` j{]pB߄ѤZbqSg.- -Tבy^UcIl3-+ ?pXX!yfSL)yJ 4 ld5DAV׿JKt%٩F~ߨ@Ɲ6e%ᲢaAo 6UOtu~ft,_H3OT]0STN⧦m[0)o$c.s2SC,(?iWq\^mV_yM:V›6cts z1'`״h(ЫК(O]*X%(/N wkh+wfm'd}}H@Jn)UBs4ۧd_t mS%X8}3T5Bx4y衇~R*o#'k7}?=y-[v SLx˦*'U,`cq<ұq+{ظ}iFQBJ g+U /wAiuF/0|1$kaІ*X/摇#_b`IJ֭[JBM4URL!>?SlI{떳&&=t5vc 2nkrUv* ~0ֶ>C+L.[t; '5fQ}ScmxWlIe?OMZ4`nr(t_U GَDW-,@]o}@2:cUDR+]* }I>B!UcCv5S|<ӧ(>56J)BXY\v}0 <ƍwٳgqLHW*y G^b7= Y^#5z#;3(rQx . F ϾWc;ڼ'ڱ:cRW :6B[`"rn~^ŸT+϶< W^$Oצ+\bӋҋsiB*cZ\PM cFbDD;{umlb 5za\Գ}kp`AX y0u-\H5`(]43™[qA:;;%344ă>T\ ώ;x~{IN ʿ=|:_p]q=&dרfη|PWy]gO~N:W={j1KRنIRzPIlTvlL_-2%;6gT@1Q\.,F|J)j'.Z&ARf'(3K3oEPyVIåb9F.\`~tUYPh(B` F" _Hd&ЖꚽT-d,%\p5+DӌLݳ  = <0n.rM s۶mchhgy'|59g?>Olt7o@qJEF>3'^ hzڎu+I]8Ijon]%̝9$ҋaJ $<*)g gl*\`0!؇ޒD:L={Թ%6%[3@?AwAKȲtܪxF[wG?x4g(;ʞMx*&454o@) BgncVwhfjR*2 .%Bc8Ό7bFW_q+Ezo\ IgPuaC~׆A~ւτ:u<򌺗)flܙ tۺns]_^ A!5O!bStn;IoXzp@|Wܥ('u][oo|c%ӳm[|+W86z`jJD%\ ?jL3Ok^κݥ"X{x衇x駗8373C\VD^2ZLE1ux-J`bq,rٰڐкD~#OOReXp7WU<2R/G\8[ O$y-J^\kh70vypEM^i]"X-j&{=CCCxtw=Nv$x;ؼy3=vܱu뒒KGPkY3x`bxb}]=vm&~P8zmHDzui*u?XriY,^>Jaf^[(Tֱ;u_#Bhʠ1_}G"5ttt~_|l6y/k+:i%nV_Pv]S*iA O}VJ j+r!jZdK[GwZ `Æ ۷o%:0XnoQ{9=J.[<`.w+vq]#&g3hn+IrRmk) RR̤8/&O^|ϧ<@(ֶd5Rkc|<`r eS?%*FL}m{f M7xIs\Rr.MaqBNST0?qo^RKESN-`< V͸pSCf?x|]===s=s=ylOJټy3gi@Ȁ{+r_S'?v^ :\PyنR&7ef_%u[ֺ8h2 YѮv]p X"tr:+ʸe 'jq4ٿ?w7oLRj})t%9~&k"o?R_?rf70S0k_VǙ'7P/%MIָ݄BT< E EIl]qQ)%nFJԗ9-`XN)-!Y5_ mcMM^|U}a/>p%S,mqm*je%5M0D"I$0 BpB!U_saG__BJI&ann)FFFeqqr\i{v2\*)dYLӤ^R]]]U A|+^!ya! a6i8aTmۮ:mz Ȍ7d2<}E~ z|!˼ʼn3Z٬ 5y UU8Gơl7?]S%[uYy:xm۶qAo߾.<tvvr=pw266Ç9}4s4]`K s˕&ö́A\h|M$'IO1vl5>Rk(>i]W|*kmZ,8r4:6SǞV=нu ^xZ:~dG޼kݻ\ h7(vxޘʕ.J^YQMC6GEV&Xj 044wwߍa,_G@ cQ j3fP,={[`SW5V:*yj}:6 Vn%jOB@J&l"Hף8&;>Ca.62UƺTpmt:LNN299I6[P |k+ w!az(Fl۶{Bioogw}ضM6e~~HR,,,P.)xW ד> BDd2I__===tuuI4%VWs!;Nha\?J'3UUP?@@I#A,cY(;hMَZѐ"Fջ|dEVC2|xT,6tH.czsH.3'^' M{C!v`Ga{3pmk;D4OՖjz.Z@ >vy0#.ݳaV&_ON6X&rPH$¡C[ٲeKezmֿQ1LWuSLLL011$t\.w iu@" Ǘ,oDt\9Gx-z;I%wRբ]W/P 舩W?NFՠ-\u֮EpˁS3#9EPz;1"!2l_+GeRg\">Mbc~"J*=oY"Ot0T, 1H]5I,ͫGAvM4LӬw=i8Sy|% * e˖` ZafR@ZC,#144<\.">}JVv;4@5@(xY4C"( by4w  v#CWVR0خQMNޫAж3`>P^=uyg9tPSu]x'8q\nPU٤i4.\ࡇb``]vqM7188XӺGU:"`RU7%/̒@}} 0CU=pH!HN۹-w~3}[sip$<-`r UMxWݯu#߃ِ-ci %{} i϶=8nmɐ1sEvrNf4NS*B۹+kWhᲰ݃[W&,u>uܿY`}޽42r~qܹs099|rf)%mc62HF Us)1"iYrxŚ~A/mOlSORê@@Ê }CEda* gjL5x-i'ɎO2ETH%;>Cv|ԙ19L-KIY,.xLWrD3t‘!  zERTׁSiH!D3 < :;tMet M(  38aqqq"cffJzҡ 6w^I&\s|%q-] Uj7owM.cnnJL&s[6}$ApStctwwùsg^zyP&{AOyЪFl.&Z`-aXW/kB0s8N׼M_]8~sw׵,iZ`&CaKy'`w><I]'NG8Adž-̏'&|j([|xWʟɸj9:G%7Vla= SWg8u~ܿロT2AֿA 8s :(㥬:tl_f`JJұm+'ͱP`O.ܮْwA^CB`mzs?n=wLr,NTj&*RRdGؾ=[bǀS#f}DrܽfL{mەZ^\\daabU[#^1߱c6mzz!H$$ n<@6evvB(ϓN+m뺕) ذa0O?}p^5۲Dbh(PӃ@O`m%I!x)`6aP#َLb`tvabwbh0^59I1rO?x`JJIP… #s̿u5Ai@q:L9k%ڪH)L^)o6gD:'MS}fh8ԨyƟ[_umZ,gԛ ph 3W~cp"[D]vOȭ!i6wU6  ѻs?Tӻ#':3'f uT F Mpay C[ piDZ-u;[n~%cuɓ155E:^RYb,ԩ ?F3tf4B>ۦݢ`[d98sx-j^ފ-*ДS$nt杕}-3s0mz)ΦX<3Fzd7Vy g.xzܾ>82 'G>䅠}\.,ZC&|=%@ҽu֊W"U!DE!}vx2tJŠ3@PK]mr 癟t+0MX,F<oz?s0XVcuJ+Dz|sGq\J"y)i=E!T(`-llEQQuO ʠ*+` Ŧ׾뺜:ubX,~U o"~A_Z޺-hoWA 51_J\t-\U1L t i5e&9|QFG);=;C8`I=J$b,P[;Pxm:{"=LaaGX8[l#Oӳ&+/=M.- u#DߎtoC 0+dtRbj( 3y)$%ظ(Irء !Upw>k³U0@{}pѶNTCj"dJ*dq-AAn`]fZ }Zyp~N;u~@zqnnJ =ٳg]1ߍC )%a@vASdlm=[ u$fĈщ;ݢ+P)RYtd#/ַ9 39nŗaP/];76أHPwӳoiRg)U ᔬ2EF,EnۋnƳc3ع]o'l\٥qJNbaa9b%ޕ#_ !+m6ne-\{ÕwTe6bT*U!癛#Q,+p |)(oq~?g; u{ RE7o#33}qp/[j`F Ԅ<> muߺ{5m>>K4pi螋'4hlyWĎ?S^z}C?RJp3Jw$&V9]IxYPkzz@zz}{ن}Y 73qu+|wrb#ܴ {8oX* I\^b,ײX8>f8( K Ivҹi'mc:mlk_ ls&}.eG= t[ 5äwMXu9)qdQ6o]w=E*} 4X3"ZƱ˃Ϸ~W, Pq ;vg}tł~4پ};Vy>Ȧ_kqe\+Z$?;Cnrtмf 1Ի:hpd2 '${qllX2vQe!se(ٸt=VB4@D:vHTo 6w{fs)&M-`@@ g_:k HW/dfto~%AT*\d2K !]@ ;hS {{{*mZzdHNnEH*baaRV5js\g\GHSgӀ  iWV4 pvY"BFi! P[&n}x3f, ) fϫds)@y2ɽ;q:C\'Np),K[$ = o9-SWl4 CU.y7z?͏OJFy´-gR̊^p- ׶.>r05ͻpm3?zjuIe^)H9P2hᆬi4$bviη2e3J Iϥw-$Vfם1wClZ:r-fNk \S^hn KHk)^(yIA8;dÆ Kرcf?Of~w=JV!GI!`Hȱ)w\i)y]'Oܴ.X}ץ]$5~Z.7F~Bvqi)ܴ٩+paÇ APP@JɦMipeu7O<`n~ĺzVBh)r1xJv+Bڷ 6K~j'P%v/~wVL+O=O?4b}j[E"JJfܯ[hR65Mx>$SSS j`]e u5a"L=EГId;1ǎ25>ܹZ(Tdn]Vo330U(x v&Kϓm`P5תI]+x~ sy^@/LOO"ae|wˑ=BuVR ;=FjVД]VWZ|ͻ,`%ĺk./ `"js)Y8w]++̝=(t%Է l[ G(UqHO\^ rUc 'EzruXXI14 7;oxU5poa=уx]*ZX#nXX lr7 BbfE 033SWp3G{_[c8%?,aN$?x+>:n_r%2nnuϯ82G?9+,_O D"twwtwwH$0  uzzz[m9Ξ=˙3gp|~Ҳ EB^һ`6tl Y8[G-'^\>/33=J0?#J~?gS5Wo!"B(IHhx ujXàwf|apG'ў`91=XM}JwOpdu-v/F8ԝrǘ;s4!*{'.HYuaocPflxB0?v &;޺{u^D)@zB/n> -ΗPm@ZyחBz%n7\`Q bۉv\ۿͥ &UFEohs76YJZ];8 @'>Q1Z\.sȑ*y۷n_ R-f_z'(LN$ ޡ/ ,!<]bh%%>1o9.L?r:n X룳(p跰*ضm躎8^< Tp.Hn 4+ {L&ٳgygX,6 2WW!]̯= oc0dfad6w_^3pjF, YJz:V\ƌD+Q{4%5.oWTĞm;g' &_zBjA=v0"weQnK;ͻJ^<\9[nâ)2$cʅ^%fk@htU)ĕV-\8ߧX(E[2 zv܄f{XVY1 Z)ƎG6!ovvvYC8 I7.Pd;Xzod BTvH8}vT kg1Ɓ 8XJpL&I$l~˄ƂP[+8eYXUigvR8e<ϫ9SBJW u4j *G.RJ è(OwPp04BL%IbD6(Dښitttp뭷rAFGGWnƶ=6OFHnI '`p51JpԒ]Wzxi4r͂-۸?Kff1 8Nn-yț K5eo Jep||;w]Cv2=ˑ ҀdkH&ü0ⓌRzUApAH|reеy~?7w]QG083|>z/k u?s]x]gp\ :+ A8юP$ N2xO0%bcR_w4e_=_׆N D%'w0ؖÌTT k +i;Np tPζZR֠3 ,hY\plϥzW{\VlpMݷ{>՟1ŚJ55S}on)BJk"ʚjc +g;lc6fϦzF݊fTH\G[*vа(Eoo/tuuE"V\.S.f,..f+ eQ.q]qp]RByYc9W}P{$A@aL$HS$I(mmmA(jjz $N/O277XCs }Q+JK=V ow w[/_tK* /^EH-Phy~?a8bE.t4^z|Ø+_5nM/hPvHNLz('6 ob)r2LB}\%`FS/Ap6*p `\" xaCڌ|@TB^gY{[_5ZαӃBsÞ7CL=RG^$}4iԢ 5pG'mwl}׻vv!K1[R)X# Qͯy= Or+_J|f޳̓1mMF/@)eF!h7gvEwww+n]@oYRr9|%/Ŋ>xk)P%%߼4psH PN[[Hd2I<6D"誯t:SO=ţ>J.[o+կ0ui G{P7<-Zl섑 ]w`F$,5Ї6!kF2jzTZeD³,\?xsCI| 㕚~QGDH B6BKEW{[ KJx6t>kkjgWo"M. ɚekm)+?g$h+ [j WCIjT&k cu\ito宁- n:&a2ӳw A~Ԫv`7TEC 3|rM0=ߜ:wNbk@r_{XF `7:w!vAfm 2*grYZFq %ǣGy[~[5Ym[_~v5˩fr̵ Gе5zqn- q#yʮK-x"?>Jaj"v. H$n#>ab2 AB Q38T)OM${vp\s$|>OftM no:+Y ;zX^:t;WiڕF`ZiTޅ|P3zPP(*~PSk1JE-I>I˜ZQOXnt룻x6yl^5 {\ʕy|˃puM@7.HMv(e b%7!؏7o~GPԷFu]0-xN55 2&v@%f@kkk篥ޯcD*JMC$ t #Wl*xP(m:c'<$@1F5!~{Rg ]| 0ͨ pƀv;_@e Gh8CKt fi0hO#AhRuʺWnx镖i"=qpm I\ROKc#=Uf^`^h[Hϫ !b!P Sӫ^0Mn7)%Ϝ֟ LgcW} ݷHG"@:WB]? g#?fAgSotV;wU S*Qd v Mud j;qhG"9bױ<'uymyFo-[Q7oRGV2̗Mh5 ?c6HxB.!Jnr8A|E&';{3h;_CnvTRJL)92O# c-_ JzSJ]'bokjS5_z{٣-*E\&9\O7nbbH6f;CǨuJٞm[G\c` `Dcl;iߺ73UxdfȎ`#D:D:D{ډvwNV%)u}ݷu.\6ζm"|=պVr"0 ʦm06H3C7Mp PfWfhf ئDa.C&F8 _c-01bFxn*!%׵"TDEur 4K% ĵj qZeB|&E!"37Gjz مy<\up|԰^> BB0{n?ț~=k\*M$Cǟ᳿{uXڥ@m|Oi>J"'wzd;m~zPj^)'نL!m eSL>-8 ]ҦJJ@ H ѽmOE /XSmrVǙa\{-toCv$ *5_F0pyysY\B]^f)\!?]kKvF4D>h+޸>v:/PΥ _q:| Plk;%EBTixPJ]ٱBG;[(Mг͛p3L= | ;_";>21cBDhWH"de8ʪ `J%uuuqСu٤ zDht9C>Ƕmr\%ORR),|"@6dC9PPU M0F8BP4F4N4$ FDWmD;tp,*)LAM3UsPϪl,*ᠨ:55ЄEtMVk~fy@ uzbȆ"K-̽o}{n[Gu|w[g|?Zrِ1 JzS@O^dÙYXT0uv~_ ֐OO-Ngl{$wU}-NXpltFWBnZI\cio SKuSnb+3F>|uB4}bH.g+55G(d2sי|I1&@J\ƵlJ)ՏW3 p3lNLj'-Q ԢʩfQ͚JPy38z_Ν;io_\o(,Y\Hfd2Rn%F ׊{sMCzMӔ]בRf4;Bhat cBDcqxmI:;H$ "QtS'T2A]RE\;o0-8Zw C&U.]u:5Q-y ]V6YkLayMb:;ڀ8KXea[eJ LWߔyAj唚- 2BTBxBò0%BFZ>^:v,F1 Ӊ:mȑ]e]I6!'tHIKeqGxZ m tydhܴ/7 Bhꁑ R"uS/]"0[O:>b=|6)^' ޸qA[9~Tx2u,+ul 8Hw |IO9JU4Uav`tu8ىlG/ǺV˯LPL&RtM*A`phw^>SuJ{xe;XK H#lG1ۢ" bH4֤䬝s\\|",vDo_Fu]j.H.= S339ҙ,mS*U-vMkЮ>PWsk Ήj *# a! w8쿇4%sB&BBM3F7MBz( cD"fp4n0aj溄1MDsZ, br(/E\]3_0oc ]KYԚgAmp\Sg=xtE4[\Ӑ&#! @pl϶p- +ISL-RΤ)gg)ϑ(g2x](hZ_ 49p|7qh+DzRS85 7,wPlVo|S.Lg_ĀPAϦ!~?:{;kZ'}0U ][q?ɵۖ ܐK MȗH.Q'<ViRnaE ٜH m_+Bn]ѳS#{yOhW&|Ȇ^ C*{@INTIexou$޽U]B)=S/쥭wZ sS̜zݞfHs}[/fOD[lDg)UV];EA=[?ٱ'q\rs3f 6[XȯT&*5Yj!LSM3jFP7V-U Q.T'h8F{""Z,Q*ib+K٬ 5 TRrW( +W*ylO+e\ϱyyWTCBuY>˯Cm ׵m䖘eLm-GoDd?@ۈl݆L^OxEUYUf죉'~u h&Kxz=B]K`JIHHmMx[w}1q,G|#O?VϬ_$5*r&3(BS!]G3u4@Ѱ" aJD3@s\/be $X-[eD[y] :7Xwr1(c~vvr,3WwR̟;" c&k~4GݔS\ĺ.T.P.+A(^B(rPe@'tj9MC :V=lUAtRV]:= kO908jr&e^Hre :$6 sEh[\\&Cjab66PBcؽ=$z{۹)1fΟe{yfϞ-x%H(/iM*}Չl2 ^ ~yG9|0L7AjZú@M!?bFI"vb=D;uwm$F(G3MBqu캹AZZZp5Wd.Eۉg^_xNo@$/G?e׫n|_G_xW*ؕp<ɨ?U]'_.0ynɩ/6_mcp !(v$߿;rUo#_õK"}4M#??}Y)ѶvkK^\{2 ֥~BTN-($*c! H >PTmն+SzNJMbf/͖nkD.|!%qp>CrO>̟~_Jàfj0),A~ğV&LB@̟KʺbwWȍ} jQ$ZZZŁ$.>aQDe!-ޠ)l`ǻp(ynD3YBW<h\-|e0eh7^vL%S-uִja"a_ozKj5TZT9(4Cj;I>&+d{WYk4($j\-m +B:sgOEO[M=?pK:,C5 \A6*. ?o; Q_JlUrd/U¡r%|wUk4!H"Bj@svqe" RN28gNSZfqzt=AuLebbWΞ=lJGMp[phgV["D;; %vv2B.C@TWSA+'?o-'B}bp0?o~ZRIWm먠q=%H:TKq;o7ݟ5?|{flu{0C O{^.>v Vϐ2q#~ԺPS?Ҹ^fqiy|hM-sP23u:Y VRÕzRM_xIM55U/3J&0S6ABC d *wXM-5kT!Pg;w`?}`T_T7V7LHPrJ^y58}B#v1E%l'%V, 4PT[OQU5r"ehӍqMu#D9 5w}|8&äF0xΈH)%\qF Z|CPZ淌OlL\҈e;ޘ>ӲhY>A.c>|`/v )iZ~3"^Et57NY7ôxN| Ac8t\qԭ\7-"n6p{ӪFG/3 U=Ep%r l{#',L% J?¢p/pf{ 0{Q#GRٺƵ-h C<2BiEԭ:+N"R2R޼%$z1@QR=8!\A HJi+EX"B"pΓ҆VJZq)~C${ 2VhE5U (Rd4-@>@!}]8^n&f4Nj"Y-9a_p#=CJ{&"#_0:UX7|;SlphtT\B;4s}+6f =gDT3 V*B^j!T .f\FXB(M`cOCf8 ˟Cݿo'tjfݎycKIdqm4AL;(-)Ugꙸ.N*(:@ϊ rV!(5޽/7O7\HYH/0þJ7 FNJUc({k"\7n4M.xY,X-۳c}K"`*X& IG!VځtLdǺR!0C+q_]+o|QOqmo{xOIk"C5,;9)~p3*iF(k\Hu#,OJHt[n:OhY%ѲJ{k SRDI}6E |jaRr$hUVR8E3ZVIh`&6zp?vGԂI:olZ?"4{ƿ :ԿS Kp`X ٪M8I2t6zݬ SaϞjuT@_}n~b*18+ TJw$0ʐڟWǑ2˄m5Cy wзv/HEAÇO #ؗ|LTQG{%<8Hb(sBq"Gnzzz d"VVȎIKo@7e Ĉ4ݟ <0J{MȾ!>oBEp+ػaa`v=0LvR?tiurSZuU[qG>Ŗ0 λsojX43àu90$JKH(zK%<4tdP2JaRiq0rmF=0ch44XI~F%RRTYpm=ij~1;SH V~a3_s]JW, >;/ƦokL°,Z_~^%Vsdҩ #^UK3'=Od_^dϵU)l3.*%ZRNbJ!SMViDok!8/^"OJ~.Ԝ|%T|5)GvQv秃k=tztFܳEzȉ<`13&2{1ce"ӎz!f&- *IyAu ݤ3lf/>{QϘqfl\'Xwv\flݗ4G9I{Ɏklef{9,+X!S{;CWυ ,?$ڙwjGgP9rOL̾D< G-x9h/y-9\_f--i'T2s[ٓ) 3unƳ2 F1#Cʹ Gfp#8;֙2Od/8sF<^,aYAm[3>aǰSD+'72'v.g&"{2Lԁ@OO`ۃʠ82Bd r8Lˊu)}eлI#sS :>aVT`k>hN2aECl(kYȑ@*?1s/ȑ#ڵ[ )=cf$R0oחRܔQBwֈN|Nr?wWs9&Ň $?+l]Dg}azxLǽh#KyمUs0@ YX%eVt霾lVB/h;s߃~LFYkIǢVg^3A3 p(~n]&~6ɓHA91IȦheemV=zv =jOoo/?ӟ0su#VTҴۗn E`l€S@ϟ:|u̧t##, >cXrLay9dF?9&|Z|Fv NgC?De4;OoƵ={>G%f`Q gy'?s>Ѷ{G; "b%Q@M[%X/?umNh !)_3N݀ sHNN(fjL(VF!UY3Il:Zz=⬛fFzW~[Gۄ 2"30Qi:8dnW[MQ%7\ȡ c<F0 Z/K \?_t<@ew4 >‡>(k P`A((}/<3ߐDie Rma ^ԃvB!|$8aT,6xaDC:n10lv8t=t:$p-^.{`|Cpԇ AX|HCx>c#\O9z\ia.vHw1Π^6(HkQH͞W}\OF?Tհ5W5W ۩4Ґ8 O?-wjO'+o_JPV{Eە2oЄWSwp5!7%*[z.f*Mhp+J036Y'@8lڵ/Q~_IfUߘdOOo/Sqwq]aPĚL˅cB4Ӿxƣ{;,U=4.rW}$5sK.: ۾ Y_6x .Xxff,v|qt{C ._1K@D5'ŭD%P!{c/L@22յ4wKpIiC'ڱSE"QZ4,iz4'XpG'8:wDb!?_0-Gٳ|?B}k3\s9J=}F&$^νzMz8he%^u-ˮ~5*jkn׿˗ Cg>zpd9P|"0l®(lyJSn~լU3}hFST7t>k>8z[֠E ni%0eqxr귾 ip!Gܱ}{HR( (o]DH$B reS_GOCy@Rbi^I%)A؃ VW>Tz8D:.FjMQ./p*aHAx.1lG:*=Bdw<;!R\-RX^$@t2ž/r`.Ӻj\s9g^|˗PRQ69-Gcj?̎];yzy߃)pqG%%W`QBom5.O NnNCaxZ;,F_u5C۷ _}=_lר}4PE*Tnjq 0 ۩J*cKюɊ(_E9)%m %UkiVaS`T)%' pVu_0X$seNO16F:eJ"PDcqz,'b9/#UⳀy}l&>$Ѣ8Ս,} I_W7]Ggt"I:u<+X"pB Q\֍z髫pK[sʲ[* Xǯs@3\E%C~xPs.stV7#SM5SB;4 Apͣ%;`.R;}I &{ʐ,.bwbAt yyPB|H@E9= I(': ʳyISBU.,#2< QVJ5k9?Ǯ;opSwﺤ.D.;yHCR \CSOEh2\QVNWSGkkwSg x ܔT4f!uz}DÆ,CUg5SB;42 VrB_vvvLp_]Iu%zz%0JAJT,Py}5y 1 :d^[$́%lẓqmnjFhld]?m&W13^脎?UXѪ*֝MYP4•Uر]MtO1UJ/z (ŹHѺ]=6. 8V8,<^M(_9L hFIi~=;FWlj^3;c;G.5UTjW #/b |6pSsa GW%-cq\J.}]>îFSIU{~*@b1Z-3ןCђ~Qs,ZY5v@lm=qLyÁ;,vI5IoaLfƒ>Jh(|į}5doo>]ǰp4㨰|?S/H 1#BD+(_@IS /h$\Z#.pZa6HL4CK,bW_VȜƛzH? .:9?Wªa˗[5C4\FUFoK#˖#Y܉PsCD5q+`S7`D**TTRf-K f4piw0ʺ2/%iF髭f_КVUAچoh!7$ܒZV8(:<^~ѩn U*{[P~~{5CfuܚrMBJlI5PU$B*倀2b:Ys>4kόDt,jmRcGHK=F72J"~ΫP3 "]_Ǒei[ @iCa`P*vX4r4-7Q_k0*^BPa>my?^}qd([<#|fTO54~Ϋ27hf]:qS_Of7d_]Iu%f2Exh3&H`m p]uGʤvkxk80v$L_H< YS!~cΆBJ+D(p;Ѓlv -~|MGCx >Cfx} Мt@u</}$5 à gi# H?h*TN(uޣcg'Ɖ-.+\qqM0i8p~⿆eoVڏkNvh4Ǟ6pρF FWS~xv5 ӤZ'SB|Lʹr,/ІIC]OV뉸=!=Bj@Bw-9R}ϙSnj.WbG kg0pW ZOcVښvh9>G@]= 0Eg3;Caԏ9Ѽ/Y{{XdkN5^;S]8]5S_CLoJC)֟C>QT(>2Tv ߴ= yPm5g Ǐ@^L3$4՘y<'W4Bo³}xR4); _xQIDts@*= W S߿FS?1Rrhv wK=נYYI@p{63U-T } IO"l5vh/SҀ \1OזQ2 gg$E53Vju(cl1!CUE|L' J蒹Fg1ƊMtٶp;`ם3XM Xx}>m 76_f7 =48.*'I{H]NhNZ[p7J@ p xEI]O߾(ix;4\כ>;fga@3?Пs!Z 5GqpqӅ ltD}5ҤP:tsHUrh4cBsU:@3 cƒAte.\3ˢ>>t|ڌy&UjR鸚YC;4=? $,X9F2z_k0bv8ALUf&8$׫/͆R^@&nKU9Ց#wYJTpj`U[M_m̏CߝjR7Յtl?ɬ謳g~| ʍQ^rfiT=LG ]VO517.km qYJku6ף9CYgOaPٶo˕`@s3Xvh!C/*,)Z cn~AfaD9tf8*T0WJWukN* x@*=كҜ8CGlXW< owތƐj O}N-W7*ͭq@3u'$;U%'գJ ӤW?WNCkp^`pkA0 ` :o[3uR('@Th7Q_R|ҋ/C߆wgJ҂C4{MKFIR]xٛٙygvݹY2w@AA2@AA: J)BPFndDߔ؟Ɇu:7`0 (<P: X)rRQLєh#PJ)-Pa, BX 98"X`BdDN7@ fST"vT*D"f0xpJܸht2rԹ P*b9A˗# :pt3,TxRa X= M>8i!:G7PQ ի-  g@ XxMoF`0y^eD"L&mSf (aҔԍ[ţ\H%[^p0 c/6Ry![bYqhHL.F|v8:*XyFq,;ķ\i$f7SJ)K =͔Oam!<=6mw9}lrJ.-2˳TA<O):-3W(zEeD*y^fwҶJBRGG8|hFfS66SFMfoFSv:"2222Ry+6䡡!a׮FG߈vrR8DPM`/)S[77߈wrRcF) ۫Gf͚1 )lǽ<=[4o~̙L&ԻdA୉`\R=Q]{K 8FgNod$r1<BBB "Bɩi&]˺[n_yAV7i[єt焐аBq9³O7Ki^JNKZU-YpF0~e/Y@"`;nRRdfh ,'ȔJ}uR.dvBCBL&Ӊ=12"B$b|~z͛5mִWnU) <@p"R˘' 2 {oٻoG!UIq)K~ vXQ6h~8H#_G..f}z?xxTرCTdݼOʴ[8oO|S8-evNnXXgFַ- {﮳vMī3I7Z, ~|?baF|8$}|D3g1W'ݹǓBʼںHBCB(oٹk4>>or||BRR{eR5u3@y:=G7W(#:;;D\nfͨ/ʲ%z/~{V%_tgg|4^}kB<9:=֙{S~"ƿv,쎐gMvO?WfwkFEkv֭T^0LPPuV[]Vݻd4q"d#GZض*𦟂WePA_g\FAwB\}1pRGP8*rrr/P`nnr@ЫrsFD訔tAReVpqqN<"Q!&ԘLXV*g2Y Czzz6od2EGߨUf޽oYx`voմI'N%%%&c?kd*5}*_-'%@MjD,a}NfjFg<Νdfh1'>>G!r322zIU{y+Y^$n2gU@۷Ыg\~=-(m/l72ؿU,THK_~yUsyX|QN}^ֿ0(<)hnjbA_>39.GRߙQ >B(<|֔ii wϲeDpZJc*?kFEG݊lle]'|36o?F޶~ϯjRB,bŸox:tAo{=|I÷r]sM5oAkIQ r8~tbqG?R1@ݺ|foP#@ a`vzˉZ=LJo^G RRRHyJeLb-2l4]]]F2NN7WPZeUʷqk)F ϫ }}9|E!'JXK)ڕd4-q[V|)oK]&*]LQ5o xl쿻ݝD|t?ɬyG2YF讵;am{,̟/٣oX"*L@{Of^ܿᏇĻAS?Z"XNQA}?02H-&NO!rpQ)o*=VtwS yύQ q} >>NRtZ\$7Kde.urTt;aD'_DwK5Btϛ/(P]њI l_G*ťGm:=x@Nʖ.VUP4vN-% HęL&[A$`[2nTw1[ACYnz9Ih4ʤ yƍЂ7 Av9\ԐnU#{1@ @57JQ:훻Xp+&EY0#uo#)1$5vtbƊc* po]3Q_:wlpx 1X8h8;X \9u~R{ϞfM2T:ߩgխ[\]ʨ xXq@ouXvpbc* UAa]'8'G!EtM<M<&vvfK }\"Zjn^w ڵj7q] rX"< wӖ0_s'IJCx֝y?-}Jv+7M;yא^lwvrbn .D5ְP#@݊DcKpFʼ߸ѢY.ۯ;utrnh4Rʚ=s-Q@1LS$.X\b>X2`2Rj,Tgg -d ƚn%TF_`ɘqseGM>&uҵ?m'B/ ([CMKg_ kܺm 0'T-g\8 ߼y6m4/CM[Dyf7dff.%cLvo V>sKE"c 1BZrMxtcLD Tlr pͽ}*]"f+^/]?=?֥uwtp[foݺU׷Aw˳ڷnNe` n&=!1I׻O^5NtL7R!fF{ / ~Zrux5f=\L ZePWCr#RF&Udᛙ&cͻiW0qtǟR2n9]M4Gj{VT%zA. fS-~ԩ[nִq|\<'?O͛7JZ4kF)=ymk/.# iqeϤ=nLAsH][c>Ҋ*@7P::͇vWKh-SoD?|7ooG_@>F1^N،2k4[F[-wetz-]+)itrL=qkܭ}UC$(3ivH:=U@,M[vi~Ƴ w7D42327oٺ-^|Gђfg*{v˿KS8Dz DoG `Y6..!cYymҤňY4a @1|lU*+ےX2?n ]ҥV8zOXDYV-1ݳ|WZ+!'e7Ewk={t1uW==ۗ.U)LDkP7 ث[びt3El!%5ڴn5`@e?(Ôqc>b?'r*(y5uﶺӹۻֹC^Fr[koz݁5wl8(?4JP%sñfg,$YޡOc_3FMNz-"xtٳ|En]ޟ:H̫SS\FV٘t>)e ,˂ ,*1qiCNbߔCD(Ti7\"S]۱y$>v. YKx۟7biѿJ#e!FtيqG|0rķF ;yAQH$vvv0iiiNJkqӟ4ޗ5&7BX"2WwQf-Sֆ#(=ӣJ^R<)4ѣ*n.U=_e[e`ᢒw!Ǐhu+DxAs2NbW'LJJo_]`uUyɈTrJlp}8)S7%b!Mjy9L紴̌,RfjM'Me37-jjŸM#W꫈St%Rmۃzy{B)po_|^)#S:xYOpI CW\kՅcYGBT*2)+74JfXI*CT[SscyH+z LI$>>4A {ǟ,6A_}5 3/sfƙ=y#g( B;zAa1uBAƛxVR:$,W굊+>bP圂+{#  yB>2 9z˱2RqqoAؾq5R(cʈTr rN%Laa 7oy98|J A쭷hxN?J`~ݱP (2V}- ؇yP( 1V?w۳ryA[H)e"eDq 8 !huS $0P@1E+VF?A). 'I|bL@p'ULX2"H.7oO\s[ -(O ľP2VR=7zX*a; :-Dz:N"MFvXteDJz! j0[`"!Da1 CC!B HLVZ^ıoE"J+e2HT$JА1k(d2H$VsE"e@'8~Ar0,Ǚ_OF1W=!yoK4&IFe5C86%T"H$R0 PJ! eT Bh4jtz0(cʈ ]o'AqhR T' oB p+IHH`ͣsP`aY²D1A+\FA7ص OJu"QeA#  󃣔%oxܞkF&h+FDqCl8otq}OLJg.&x*][s٧F+>ix<\(up$cJZN~!SC_KV`8=n:¾/~ qC݃Qà ZFO0[*>wKM#;N?uȺ/SQJjlv7b 4A*37n4C )3$!|B>7XSiULtjj?48GML Y҉^[?I;aԘJREULluFMF =p 3?hƼ4@2ÿկZd)nJW;xA84 I'~[kZgHXMEEo/7D"o0@sb=h >q&`a}ڐCiRAbÝM_cj:p[5'^7bW}uY _s5n.@pO]21 ߙүiV_>Ytl_Ww&%:i[–rA^v}v[,x9ʐ!-9nzXTqtW`W޺P?sZY렿rXS=ͷeeKh5뾱Jo"Z3UejW3oہ}@3Ol;juӲu MFSd7UH?WgFܾ(_}fuT^:)RǘppwgL[[ 5z֢^k?.-m߂`0&#ڑuJ":EWZ5{=!⏺2Q>;wI3y]-×yF>^o7SR/t:,Uԍ .Wc9uʲeQ_w)ZFTNDV+20Sw5д ׏}PJd~}r /~ &dmt_jbA%xf*m3z۱mGX6e,EXw#вU!=!1\]L RBQS318=\;m}f@AJk6R^Is(iɮ8)s;gb} &yuT^KTۣK]Ѥ9,l(ZТdTg2x"\a6[vS78j1#6|L",0!枮WIcu%>obu޵Ϭ1NˎkaZBN(|k_w)EZ 5Sͅ貳 r5Z*'\ o-x9&A-M!NerU"ZG IM>\om 0i̋za<[oyj5{^w0Sj (_CJ]Y{,ı~Z3sھxp.KduDmTeO%*Zhޕ<Œ$ܛBbV75hz2Np$%%(@\[!EIDN]/]LڹoYoY8h;rt.3/!3ߠGW.[7|M |ġaϮUnT:?kö8#(e2w&ԅMy6oШ{{Y;-` wTޯ?xM.5]WQOp",rr co5o\Z;)ZXK<>WJY PA[E5v~bYO^lͣ$zvXiel:d7G/ӏ;^A""n=~~ڷI Ǔ^k |ʽ7t 7S< yMjxZO)P BvܵWE&mvGHpn7aD < Z$1PJq߷:+ԍyJ) 窵D"~Zlm>\}H*Yqfm$5]I6V/4_kE: zum<ڿCdf\IȠiS$X4+9ex`s)dCgMq\o69ǪM߭(-Y_8Ȫo7kAlH֡\փ;}2 UAZ77l` #3Vn}*]|OR4Ŭ' ve-!oLuؾJU ޵Mv=d5ҦM,@>u߲c8vh@Tu&ĵٸ\ön?th?ZAڠQhSJ]] =!3fpunQ "Od"-Lf !~3/jEY9XF>+GEKQ$FAe>UMA,EKX7GCqVlqdnhy9m|{@)_U#B) [xeI_SAeXn_ԚJ<^ .,L6CbwAKu֜۳Z cKg]_+]8 9tl޶ o'/+K}R*d9k-یrN~݌czJ{BקD^Xfs^vjhXՏ*ݵ8hi=]9 ɺFtS8xj%!0SjJ@N:ݻm:dZH/x#zє,G7ΘRSKӹc[?e& ^S% ƿYˀ-Wб#$˦V0Tb+Z={esKػ쐾n,>>כ^9J`&  9qw= y3Vf-sCH9fgZ=3 bWjB=@&VCF\Sd2NP/YW\t91mݗ^wW"Z0_U3}@WZI8oo'~٣_ ntpT uj1n~f=w^Zљ"k'؋jZȤf[%1_JeRPKpN^#&^Xj·z֑bъ!O:ޠIKc=yM?Y o 0䡿AAʧVJQJM6G%߹m,lAAvw~`ڻw>‹@AA#  Ra/AA7  FAA7  FAAm'L3{=Ϥ'?ЪDU/yֳPMVwxKt)VT[6ƍ  Kp|ߞ@lj2:aRH, Ӧ_Wy*~~ |zӪuIK=ZQp`K  v욅O*9v0-ڻtv=\ ߌseĺ|ރfƼhl2" -6z{uScV3iZB6h(d^ڸx*a-}QGt9ႣZpOڭ [ȁMN8AB\dRRãɺ=>QϯL^s2\ڰyIo{׬To7>A ӽӧmҴ`Gnq{|{x3%[Xc[Vr2^Գif ֽj_MnN] SٲZ |UQ4 3>En·m~-[uu6e$C,PdHzpÆ3: SX̗]0J ' \_A5Nwڅ韯7)9aM䝀t@k&j9Wm>۩esםOֳ-z?W½ gƭYˉ8uۧf\(4 *Ҷ2άY_'en-/ɝ1=<_x7Mp m9h̘a BW&_F=_ͽTwgS3=Z5C@O[p'pz{×l G~&k?wL:I^?}NZhT}wW=9)+{̺~=YhhͳV39aW{| )?1yc.~m:￉KL஠i7.^5gYM[a~;F)y\|SoN3NuGM*']҉1K .N9&oU?dޤko"]ã ho IDAT;"@ (+%KT4Q\mKӇVaf]'N(>9:?m\7 HEaӶ2 JӸљC㚼VHBUkaL>9Lվgol:`^G5=ѧ?;يT:˞wd&5\ppTE{<;w^.)ѿblU/gycuRYNvNlۙ;zSoLF= #E`wtѱ|Hs^%~}^VOqYYlP^d PC@ݦ YߨQ Bn.;~_nYډ՚/sՠi;>s|G '0rvLlRV LBMqJ:ճ+߼zD)9~LJʘO_>A,N(иx׍h>cĝxm`bRBcԪfxӂI'~Y۱kizHóQ~C@=C?t[k8Q]Mo&-B,OI--(*~CZùynUi0hfsk zfu鬼U]hB&עժ2;_K"J]DJHFsl֭?^>ZK?h cQAA)3%NQ#['>. oDW_}:Eqp6}ַtNm>[[K7 |Vsg,{%Bs. sex!*u1&1k-5U!3f=~ݽEjԨ~#Q +C&aߕs̬OhD:E&V{~96Й}\HYmoDSxj%!0SjJ@NkSOlZWm^wQM?O,\3Ξwd_57IT˾ox.5=ź9>;F95S{;GP2%Ja)ai]|Fn6I{?[?e& ^SŹpArx=f-|^ C|/Z(c"ճwȁ_,~;sߟ{ȭ٦:qD.#ּ(o:2v>dx{@sn\cގªAw޻퇓fD}q&N;/ [NgѬثWLԘsKڻCMOO2G T|vj{w=#z- 4uB߾M-d>Jĩ/r&yߦ̻oܲ,1)CKÇLvU66[68n5ΞaF/|g7kB+]U4ir̿'2=? ob׍ޒ"+Vp_$eNW4  mLNwQov;U@Q /{łDEwcQ@b5H,(V&*8ny1/ff}晙Şize`]EJG몒Yv25ӪE\$|By@dg  ߇_G6߲Gi*(y:]ulJOiܥ  BAAlAAA  AAA  AAA_|9=3;Ͽ@#  5cXd˧㻚 AAN>]|c!e%%+ïtݣmO`T͋Ϧ>i7ǟϣ0AJ^_`ꓖ%{DR0PP &gTVԡ {WS*Z`^ron^I'C᥋i.ytGE%AAʳn>z]O'( x~dw@L&SIocĝJ(jDaCZ+P515Sߟ" W z|dy?FP4"e? KD GE( -8rƲOo}*)~VD˹.: Щy3zpn?HPE~$cc5gwS%H]О:{K\Qf?_; {Q0-{7[ڂ[:Y[YYYYYYisggƣ)ΣPq9s\CYVF]:t ^Mg޼|‚`(1V#ST>bh=ͩ^GW 19G3&gw'FذWvFG T= ':VM\XbXdAn:PpuWUi[B"NYe76ΏnڞW[WQRDl??4 9hmDS@XPp4Wii_qG53Y:/IF:xf ΐH J˞h0>,$b-;JCujـ??:2i7"U]&T] ڶkgIL?NJ Jj*=t{gv:޵8uFu6nMdW2slk7WSN^},񴼜t ?:~PNIfөv%}i:`\p}h5{1pGq.á845 2ߍS3r]l8ө;nRf+pkàQZZFK?|\bh6s+fg< _uU! 2 "/ GQ]?>$|BHW/ .~Zu*⟩~N] Zn1;;bرGU6h#{-#ʼjJۥrc?k_܊U> [J4[)^[B?י?bOuz;HJr$Ƈ*Ҍ?=S-zvliHtwx>K^L {.\F )>(8:;"rFmR~<'kÎ.iXtdغj 5.Y'6cbozE0rimμl.5 YK=y|=qڶmT{6lTDqV1Ҁ`Υ)}4E7wke֬wnJlњCh!4?`wá˴f?7;iR)yy K:Ρ o?Be훷Ϫ/Uf@THR >TUVa8#4?`ǡ ro}b(ݴsŜLmàK/*-3ܕRN)=:!3 O$\]vnݒW f]ZL|SwY~Ndɘ/{vȁcVNj%Y)Qe/R'\ FW=.qƦl79@<ƒT.{a;+=Coz=}RPrG3*IO>ڊݑy[@٦GxN$3jYo~di@Y%.Ds][Rž}1eLU&8; UM]Θ+%U].\P3452us/۱L9V6wbȾtԪ!>)a[S|;\DRvd}VSg{nS#W Pѳ 8I 4>dǡ[*׭'ƭǐ?);N1sKl-sFYܚ<#TV7fҠ EWV+J9啀j:v>IS.+LܺvOLuV*ggO[ICgzH>,ϳ)JiǢiFQ [ɈUB-w·^to`7._ 3^L0G  ױ} UnX9WvAAAh  7OAA?~AAAP#  oAAAP#  oAAAw3n3<  3c&V%/jc+lAA×;tu}VRl喔C-O>FCAA;??_Q񝒱dOHJ? Jdqʊ:@1]xӏJsA  ȿO'( x~dw@L&SIocĝJ(jl AABs45Gja3 ͣHُB9{#jH .U\a6jI qդǯ?y%v {M Yl״ ۘwmd@]va͔gK`rFc$ B l&MQBD~Q]^E;8}CG=ۆ+Е'c~urوc^ VBPE#WZy:$&uצ-GeWݴI^eŎyK@A߱8Zsaj57˫;b i=<( 7?e IjDPF&Y*~/v^xPP08y^B欄FI;|Ɛ,G΋a>lxK~jcc5gg,PP зtRinF|re>0^.a!g7lO΀ɏM>7[ehiʹOqx}Meq: ~uʒR 63nv}So0[y< PeťEtwg]t&Xi[V*`5vXPp4i-UQBBcDTd&\^Yi7b هBq}D!t ?:~PPˎF;z`Og T^n.ҞC-F`F1g!|U%'w;8\ܻo;#>57--jcF]{G𦱾Up҂{p(DIPuwus>Mg%䓜_\XښoG[G Ӡ]vk&wOc9L[WA%w u۹>tM,[^ݹ+7dsz9^s,mL^;2L,Z3r(C:LtU ȷ=%jhi@jҜg/h]'ƙKfݛk^'LKM:k a*P3A5H[ئ PK\y62&59yVԿyr􇁞go? @pyyR$h&x~w⻆=I^KoTeT!KJ_nRF1=t*Ν _vlF⢵[w>3uA~;ڳp cU {tT pAoYv6OصyeuOK5Ϭ{-oϕzVjjز[ؾ>xb7c1D.{0ҋ&Jd w%9yYw]fFjdE?Yt2&*H?9~'E[L#6Rꪷ#%vͤ]4G+^-@htO&$cR! 5;tii,IU٫{qN>IG[[[ú;R45oa3۴~vI}]ɮ2%rz̶#ö>;0aJn]KSA˲UA#8rgnS#W Pѳ Ai/۱L9V6wbH^س/&j`aܡ 3z %Un8!T60n>$tiUy-,yv-9yGnnd5yͤAEӮE؄I6rl㴙:3'D2w(h_z-ǭMl뾳B4~)A`R98{z<0J>#G(}aM(pֺyN֋L!#Ђ  w~(,M ~7+~sAAA      AA7   AA7   AA俢/qyf}AA}w?5",yt|WXa   wɧst,b3,dEzhy4y6Z Be"Y= ofZ*yѺy+AߨR2IIgBA)0,SYQ(6"A?z|dy?FC(-yx:9;O to4ܔT#|zxh轑}y8gꨘtIâlEǗu֙]pveg5'%F5"#ץk0y$[G{΁W(T; ٚ+wRF>ob| ,L6arvM9yA$eLY6T(&GEвπÿ3KChH{ۉGKvݖJ@ T:BVXO5s>c$ NL6(R]!n.\\wͺnv3)zˡ+O %<=ہ "^2: 5AGn?w/+=suHMM[\(mKӇi@>ˊW3^Vc9q&5uY!Üj,Wwl?yJ{xPP_[v#e#*-w/{C}M1:oSnVr -4~W.;*&n~ Έ1vK dvo ;7o9taA%mھ Z3d[>O0<ӭkE:\Yx9#TP3o~ZWYq}UP/)C"~q L˕{+2I?>1/F^i5Sԭ^EN++rw:;+lyAAKø z̕23-.NycXvX}&7J჏t7 pd8r^dF*m݌11~ -~cc5gg,PT,ogkETm N[vXst[sCyaT@ }K'k+p >r{Ϳ]7/DedUO՜e_wEo@X/K }k<ؿ㺊QeIq)P \yf]Oy]FNT4I|E (JHHxOAAAu&>е't3biڤԷ[ >$tg\[5qaam \3tꮘhӝܒ[*)'MH2m҂֐ub9رʟݹSlx _b7l=!0bR [owԆP%$t?[v#1jVwSOAK`X [>G!i߿,;sb s$V%TE#֣޾mќ[tmfq*zSRU1+4gc֜_@Dveò)Oa s쎭mh%yu6F3ozm>aA [w At=nxǷr:\Tk.e>1Y*+,puM 7N}ÇonyˤUHאulK}+[K{@^ʹ;m .;,w]~XɩMM?Urvw`L_H a/90=t5WiiE~0}CHR|ue?g˯︣sOګ3V !m2&)*|]QcAD"7@CvӜy_r n.m|(%,_Hh>3J;T߲Uq4z))i}g]"#ϟ@ 4xFk#_LҲo̳o7D,oO .'⏎7Ԭ^[Q@teh{=0c3*|w/,]~iϡ 0#Wf߳ʐE*r.\mǷ nG1#.=#xX_u*sijcEZU!o)7WcU婘%h.K]õZv"CF5㏫wo*=t{gv:޵ܕY&ö,isKgd֎n7Xi)lö񿲹ڶkgIL?NEEVqSJm9monwd0,omҁsՔ[] %(>ǥ 9lF ]'>Xf sjeEb WFNi aT2[\ 3v[de{hG>Ņ%Vquya1 z 4ă{ oc+oæU)1ZlVƩ?x`Y$ C6 bW-"Tc\K7ezJ'X~IH3 hEf1!rR!KMcڞyt ޛ|M.ťָQ|aq@M\~%\/M#7o 8G`0@vZ*dFXԠ7Y+j[Uz.F̈́ʸQZZ&u2Dz.o0]u=̖5:6!,)ZpGPAPO—u]U;J%_mg loJwmjܪ{ye_zعv^^D;GkYL S3r]l䴎ŃU @ڨ e! 9ƎlRlř^S7_򪨊&J ]۱vg[96paͅ y\Vs#pQ27#l&}tgu1FWr-az޽+'$%OX9ʖpkq. r4aPxD>iWQS[.zSښ G'bL@d mQgPk<k_͐(бzg,9Sm[&_x9g6 H}>ى?he I׻7 o ̇OoFl*gjҚh*{ 7z⌃ m@Р_ 2){Ln6#f?7;iR<3}nze_$+ihTl0N=w[EwMp~]*k߼|V-DQ-r kLY,~㩊r􇁞g8Dž \*r+"f} #?،aDG["Y&1b*s⒲FǥqzK NXA)ȯ2\{SR8ٌEky=Zә'|f>8?#&Խi%sgW*3#޳-O%;tAF.7PPմ IDAT4|a`|6,=YSgY<o5:vm^kYR 3kBh~%~yW>t\hYեDztBSzEŻsy/3.9p:tIm*H?9~'E5^L0ݞӕxhʄu ĘbW%T#(>WRpY9gR97Dޘ&3,?qxGQi9%rۆA^\5qUz%[f+1lm 66P{?okt[QSI53e_0lYlH@R:h*s3k#5"ω:’{; =%E0 /mp#3> x\3z=ղN?,I 4p%殮$Ue2}{8}#8B_Ƃa)m0 ԙmZ]?;社dWrJ=fۑa[EL Si_0aJn]KSA˲UA#8bȕ1<T,|}zG}FNU~/o`[/J='uv4Wl}u[m K(j.ߙ՜g֥]?KjFf_44*nDz3[UJzǙkB8)1 $@nbKVijժ gL}LJD,9"ۏr -DE1EӮizQ ya5|7?enbԴL k;2٪!>c1Pg=br˪6j'W[\6D&;,?uxGtIU[#N;[1! 4]Z4xyϛ:CVOkB+Y63KsgS:)NkJXZrR [kIZ’z|*ЖWei&$Hd_ iwiPfhe[@KA S]ʙV79E z5w·^to`7._ oy6T$2#~O8 /\V~ɋ*7,M+;ߜVf?x61U%˳.ޟekS~ԉ  [>~m:ڠ߿qh*(y:]udO:AAU|'  A   AA7   AA7   "|9=3;ϿBAA ]+ȒOw56  +;tu}VRl喔CAAMP/l ]r0BW|;.%cɞ4,&Ym=u'UMW߻UBA"gL} W̯͠Kv d<6f*KܩTfp%we ItkL`# z|dy?FP4"e? KD GE&mM<~+W߶T+ݗU<}{AS yQEw%rE jyDP`/ki'.yR;|$EGK`ڼ}-Q1EȀ.fB 09*Zm| Ko;hɮR jqAGChڪKGг8∄  :=I i8y%5 ɣH_?=/.n*ҭ.A!G۰a'.]vyÜt1.* $z)˱`EL3qz*[KZq |ގ7?2@X++ av!`kc"yd6niAftdVuEQݔݻ#Cs>c$ = l&MQBD~Q]^E;8}CG=ۮPt3)zˡ+O %<=ہ ":2D̋WZT7u=eJEϢ˺rqlCA7)cHbP#42b`Wٰƒ*qɫ2 @ꎘ'o>}Cix kBPE#WZy:Oho p#vT?6\xvƲ EuJf'0YL/W+ R'oԯ 6|nBm*#gj-y!*# ?Ҷ.gj[:Y[-H9~r\k/2uST8==+qWJY+'t3biM2i6)= ':VM\Xb 4Qe1I*j U98! \YVF]:t ^JqW-q~t[*)'MP|+9J );=}y$J/ƃ !IՕM뭦 $\#cod@Z^~,/"7@CvӜ^0]raϱ|-NNPeeLRTƖ}zG<@]q6) ypJ,(GJD4_J%@7++-{Flv1jK7:/ƪ2qCA>ft;Yu;+ 4;PrUjTBp Z- GQl"zvliHtwx~6UEůCnUe^3ϩn)w9vHŭZŌ)$[wYԥ7? SRAΝS Q1aͣUyWVufτS~ގҪ)A2vʷH{[աH&μѬZX^ye0!]!*3idoF M" { Ȅ $H$,5=SOڻw儤 "G2hHs׍SEքb P] 45 0(ۢ- AյbVЙs {N ڰ+̤9H}>ى?he ?&8b1 ZP&GWW_ KJ0T49Z9#fi6sgg''xDNh@]z|>ʾAi'nOfd5;V姱& Pu_M\&Ymp>3fRok[mfe'AwD - (x+)3.~`Ģ58#24DW6t:kV޽v´t6@e[;mz`_ef TML5jRxVmA-όo@?^ TIVV1иAyJCp}nm_'bɱyw$h&o~uÑ$`nEH_IL&qiԞC,ta :{):]uzabmN>󀽿]Pѱn# io]ZVTRʽrŷJ n=+5u5uA~;ڳp cU {tTF7,,g'2M;X)6 ⪉;.2]IN Coz=}RP>3m#WW)[l&u?=B`=+۶q,.]ǰCC%omEG5=Hs"Nd##Ct$8ƺ%tii,IU٫{qN,_a)m0 ԙmZ]?;社dWrJ=fۑa[EL Si_0ϻ~,X<5-S;CUu;˷ą_({NAyA,/_cٙrm`fŐ?g_LnY5SC-65rl = @Ņ %Un8!T60n>$tTyˣ]&Q lL\FF\"fk_4ʊRC[^ (c|*٠˫~ޜ8?бzZ{$’gגwJF^LԚ<2ڍĭktkTor&qx`4m}GwQÚ,w·^to`7._ !AAˏb4`w:`k!  AAQ6  F;π(?齊"4EłaキbD|U{/E(UquP;8 zߧc}i`0\c0 `0\c0 `0`0 `0`0 `pC7|^;+ T `0}w1w"&vXK_:ba0 `kt{U ,Yf.`0 `ӯnHtguRߋ/`0 UȏpyW_~xOE"Iq/'X{̛{gj`0æ [r^ܰjLetm˹<%_ Smy˷Juͦƍe+xyjcˏ(Dֵ8iMk?_&'¡CgnFLqC*pYǦ㞺4pQ5RF\y)5WN%00s >_3G!*[<_M!`hZ!on! Sin(py<ֽH q{'k>fx7Z,G[B6ˁ+n=p3QA}wTpOYip.m];tk}!wsoAQxu͚$ZdShkZsxެ: >drҵﲙ- .m477-U6(ht} +={O^cZ}{,}F"Xs(G |] cV5C!MGo̤EV5{]3xlwSrUqNgY+$O@0ZRs`kL} 6?G>KSL^5-!=`MMإbn~I|Jo?yv]a<\7{@AB9?8Yq;ۖMY6aqIa(ȇzqkAԓd~u坻y5_}q"Ө6ٴS>ܼh98$=Tm-JţsuiS2O[K WqwwO]EEѣ{THQafn>=0Las{Y耡3F4Rgؑԣy}, {o}޿!] a`- `0\V[ ςJZӊM_)ywwls('sz.?K)QO KB;y.i&[ˊ -܏pt7AWx5E ,imo.w;kW[d9Oe\{"t89_sc0Fl^vE(3F|͢8K!z߹ ZH:=)BQ^n u)Z^\|j%EHo;<(lVYMaܥ᧟fV`X'D Td瀡O]wW!@ѭW.nNM'rT }]VL3sܴx[l*lp'UD%:Ԛ/77F!p금F o>%h~c`b*t? co^nL5RFQ!zf 5:v?K`Ү1$u4{]8d˱?lVR&U6no۽~!)Ueg735b٦b#jo  . ںc|ohn[Ig^{ $9OEں50 ֬0+ya``U6/^8]X%U]>Tmg/oCrj#C9jYUn 't%@ljmTy )ocrEW3@@s^>thGr.7hzV#KF#Z $y IDAT?r꽍CP6wN$_lb]f5?[#g1v?Iwo^޿јz8a0 `p]Y|Nei֫;`0  `0 FW71 `0\c0 `0`0 `0`0 `p`0 `p`0 [n&NXw]W0 `0?cD+"M찖Ntv`0 |s=XTB'\6:\n?îǪMq21 `0Kl⽑JL}%IV}[ so{~|㲣o\Lse>c0 `4A_bH5!E^Ng,;;`0wք$7ڸ/z ]r'!goAt1+#}С37#^Y۸_6Bd]yc;Jp%-k?[m#\ֱ=.tqdeiÁT,qxS$䰆u~?qLjR*. mKJf^?b 5zpyW\9 +~zzlWŻфV2+i`0̏w}c7O8qŒ-t%ti˹ȏr`7D5gyvdw4hP[kk˻(qC ^ߺf bF# fmjɁ~[.ںg+8Ytlfk oX9ŷT,⫕{ɽynۺj%Z9j&T衮>M.{)YǬlMK ]*Jz|vϞSWV_շۉoʘ{%f42T$)"(>ű,b/PT gDžj[=譗ȪfkO}+]8bn~I|Jo?yvqoMndK.c&kN~eq) ywٌq⽘tJ^S4*\owl? 65u7qbe;lVތNbsj;KVK, _A*N>KSL^5}hR`0?{{gp{M=0qOQkΖƉӍϑw#H?G"+nù_^r۲i1Kf"r=ЎKw7k[ܪ~~yljLCODWNl-p66Rs 8T .5\ *UZRwd>5+F7VGv\q^YWqwwO]EE hخQumuB?ѣ{THRhe)9̅25Sx0u\^q|6}:`5ԙ9vE=Yw kFCaN[)CN4 G3O7Oy5wL5?yӌߔ^*""e̢nGևXӈ1Goݴl^<E/e˼;9ORj,lO]nʽi,俊v9_|kOh!`EPй,BZ:hɖZÉ9EblG=’VNzֲ"*jC+>!zMr=J:LȹQ1{z#]vJ׮<6鳷ƵH$FEez GΣefzˆ_y\Z6l0ST\T}*:?ș.'N6޴mW 4鳑u~i;=7BQ^n u)Z^\|j%EHo;<(lV; ȭiFH/;cΆz2pmTh1{uAauw"z9H]Tܼ<:?322rByO?uÐujڝ>a#QPBpcMsUɻaZ$L;\ A!>u]5J.l?T]g5K@MْӒfh0017-.`F:3 0:I+<m7^ 3Vvv:.bCÛ{nɺ-NmG.ҲP02 c5kXQױYU+i䟛} 9Gٵ3MTre޽=Nm?x ?Aw;mhxceEmDZ֓=B@q&F+=4 +@$6U{6035 bJ\-ψbx~/7 L}HoO˰щLZ|9(x)DH 861&V.k˕E9 3Κ!3Ӣ  7-㾎TKN _ZA[uֱ ]u N0lWmt9)Ȕ՚v ˔ao.;#Cw ismR?T]^G/EBH{ :0ҤۂBns: iq%:;QYi^>Ĥoֻ?7uwW<4/]PcЀ"'ٝa&ŠIWVH-uw~Gwu\5#ރVgOQ}6SsnۻE~? enfY(r,y p{盄Lr]{N@dVA$Nί U5aU4w+F;45k NsF D@t<dKRkVŠ榐]*+#LMmHbQIY 6Ĝ\VŨ]:Zأm踉k77Tlh܆rf)FʳӇn7S% vutn&wvdT$a`\ڹ(CGw~צ@*X@XGӈC6ܢ,oiA,J =$VUls9h\oh4Xz,m@ZnHoiD"@FB]>uGv|.xo#%3]U\o# (2]wIx1I;- H#'oNDZԓ4V2!ȡ~׉ّSOai k?c0wU뙘@ZBJCyU6[1_&vMe(;m(bmQ2`s);+6.^jXŤ"Wܢؙ+}EF[H. Pu+[/" t0NݽH(LNZ&Urow؎rtb?ѻoS@03ӌ<%으Wo0w)s궹Km-(i:/X 4iբmqqg6zUƺ׽ ~+ٵo[GRwias/Y/ _eMu!\ZH=|FF'thlbo^/Ϯg ~5 j*n۽ql5+b5~YxjgVI'B+'tr#k+Gjx$_6@h9^n:>aLZ-obD||v 6(ɭWeNobRE^=vBj+F|eeS {# ?/+k ouZ(p;jUy v5.=N.SH(@&F=1kD/sP~ɣyoc;ydC6<}mGi9N,+b?0rMWA5lG\ݿ.>4{]8d˱?lVR&U6vjBoڽl6 X9-+;n NVV՛ hOdd8ֲ"7Ύ@Hr2uk޴8Px`0KsXz1֮jFjΖڲ"rdb_矑K6|rg;8h?^)՚SEq19Ȣv ;B~;Up@W@_ { Z۲d9n:#9l4Q=}oj9gnz+efU4.%rEF)3J8"!FZ1m .6! Hĺj̀ kzl8E~8NOu&bk~$EܽymzFc}s԰SukT `0eJ6pNeVW7+GpD~=mOv7`0C5'B|ZYTi=p̐f| `0\c0 `0) `0 7`0 #rfZ`0 `x`0 7`0 #ׯ>.$mrh^'Z `0\Wۤ^ X: DnH&h{` `0=}dڼBG/R.0n 7\a @VvEX"j0DP懳9d;ϗ ֘K`pw*BJ. |v}B:Y6%"Pb}%|'2!k7&̈́dT*sʯ;1jҍg#)ϯ7w(+g႓+Np>jJy0,GcQۥ`ѻOvZ㫦$|QQr287}?ƃ(|HiL$dlF[Pe-~JЦ-ӦSW!¶*RsٯG;/W(Ls,:deIڡM<ӥr)2mt9vcl:B0a0u$IlR!T+ U'rJ7`+Qswwfzji@*:k:R,$AFǯl!Z5S*T&uRR |& Of{U6-<FW3z4V2^-v& ogJ}5Uew}_ RL6Tw}V|l/?W/RYs,S z*Z[]xDxM |4lcB g.W~x9s_呝lNJB cĝ@Uj5Ff TaÆͅ5J"$d32F{ <(1a )nRC(3ȾT|,@6-t ~Ee=KƀbQ|cYŊ_d%g}}f2y_q$AR~ HC}<0[aXߒٔ;ʓ!) Sgm1Yce20F 6 86?ՙM,dfU;RS([ P$76ȯEͦHaDrɷ'7 tM+w(\%WmnͰ@-7RvVuqlBVU\XJ^Y6*ڃ ,UF'v /yQo>Ch\|s?Zܟ2ryiZ&BչQ޸@ HZ#< Eq.jWo, '!Pqi֧)iumxQ/Tsns2zqV~lHaze< fM-f$vNj}+~O*yk'f$$ ;ZdjovKZ>i!{,.а.w!؏6irA&.?oݙ.``WESq7: y߱B ՞dq|bsY)sj*S `q3F/*X=NV\ ȖKMIZEr>qYcNqT#5ki Yˏ) GrRqcN}wEu ,ASI*@D:(up ŨoDm F(i!v":׈ihHvZZ'4sm~:s1Ear9@Ƥj7{owȏx6_?pgq2Ey.G'Er_G*n Kg#a>ȧ)sһR2A'ק DT!l3]2LDؒP TV҄S#TjR,hQ<&{HotPeIfv<һCZ,[6;aHۻg@L^*9icﮐxq7 POq>HFڒ Khl\BfH:eC?dd3HJJs? {cFu" '2ZrNH-OdլbSCv (.߿/d5A(|<V&-h:ATw 2,a1}2k70@C&n|wsb$ĄKT} XMgS B2NNQͰ ع Eyy3Զ&ԥhDDJQ̯Oi9}nV*@@C: @Jn}~Tl qU8[ůWMu!<#~2Oʏ:;3~xVu")Iuf&\UrA9̹GfI0i| ⃁:vUZqRYBwSb>S 3DWFs?eջYk'>phG )UUUMNjLo*$Lkը}\SS>8Yo??*AW*t$^ ,!@TTggaF1k-MMKSFх׸-->+A$6U{6035 b?XDmU䧫jBv !7C-]KΦЯ2n5:S10l6H(ND=݋,$Gr g*p!zR]lɩQŎ9[0)sGf pFۥP@O0\j>Z. ],5ْ=ʘ&diUuJl2 ՙ ~A@ryInLo+`9j_h eKCH zZP5y%+U?*Anҽ%~/ťQ֌XVTxOO3d1}rFZG0uYJ^^ IDATB.QO ex}ZCݔϫsOm˹_מʿ\,eQ9+ꉏj1 p2}-o|ohÜ;J HlqfHS>/z>D_!G]#Aij6*ޓTGm XrOI[=E<i&Ȁ`(3$rcdKt(1r IaaAѢv.;]$PĮŽ9}I `)X*ҋo2oP ~]K-0*sT 65*}c.XCʼnOoiD"@FB]¯Oſ?'3;Sl!!S.Qw@BaGUR_8BW+.=.y)ԀDRV|PMG61[ɜKcYvKlY!H,])?P0*uB=KAia4jG]{AstUʙr6R^l~u(J~<-[QRRyQYӌ8Sn;ʘu1߷5+G|̵ $L xŲ}^ɯۊEnq\_cDT,GC04ʝm8 P-(j|,)1A3&U?TՇ$ߨtj˹_iSl&N5Q $UIC|=]x*djHQጳl3_Qpj;EiB$h8޽i"gIV4c&bFI(;'/;ܯQKg[}$-^UB&Q5uד+%-fT;i;X`ZuGܯ* `ݣz.@$MDRϖJO%˕ 4V~\8IkqR-Z1ieJ'C?Q䵜(ئη U%3R6Vu"ZBBW,?/vȯ@HRQ+OA*"@ɿ!>. 8pY&jT  T\ UH!2vw(FOR5?_q*,|-lX-6-:Lf֔i2 ܢg#h#lm)/Nx:" wvlI!W>#oP2ԣ3Lӳ }NJ[A>B뒂< C">N;M'S%hC)B>R -Vgj~DB& 7lBjTt YV'_7׬+in|6!-G|6 [x!bل[-[Uoocf€1`\~%-O@3d~- f0 oI[+ y~lY} ލ[q_&W(bX O0 `0$ `0  `0̏8$ `0 +1 `0\c0 `0;bw]I`0 ߡ߉KGWDΛa-~ `0 bWz*.g2Ol:t4Z6]Ia?6ƅJdT>>ص*2P 3NJŠQf<8i,o ߟZ|Y7R\ )ut+2?xy^ۅ> _$M;P \vkrJ_OʼϾs9bo&a~{NJ4y锡=;Y1 ƛ'ظybɖ?:# fmjɁ~[.ںg 6?ʁ[LTuK@N]67s,JʘfpiD92/74 ,{'IimW¶K:ٚNI9j&T衮>˼gJ1+[sRnF ݳg;"ZIw^ﶭ:oJry7=n~[׬XHRsQJ̒idȆDz@>JP+8oZn]`_𦣷^f"=R?2wmkͺf')* Ylƽ6.Я9lwǥ*@bݡg3^ębU* {MӨp~#d4m y'  t3`NL͛8m1皽BW$k7:rt:E:Kט;lꁉU_GIN-)eۈn1Vƒ+}\M.˾Tkw]}84jn{[BT t4c̞͍[]E|~JJxA3t :ܕPǬ!Z垞c`%-ڂjSrc6O[K6 1AZ˥u\`a=RmU xQ+_β=mpܼ݊]gJKI l>5J6y؟Uk']uաuSxuag%]4{jO2*]΢t֐%t,~?u?G[޽ ǟw,5hi3RpQ{ \=v> lu!-/tmVrV*G WR'("7/C Xjҏ.RF &mxćzqkAԓd~uBA[K#;n.hnch/eF AC.R4wd>5+UBs7fQ]Vuˣ2Πumv2hҵ9ֆb΋aD gK ndӫ;ՍLy1yr$|YZ,RV[ ςJZU8SrJoYq.l߲7՟}k濊v9_|kOhϋ@B?4:s5COs錨窮BP?9S\N|YyER>d4\qsR1б˼v- ̦fOeSw~S O9Eez_x(cPq?%֔l?' !ێ Fd*[?}yIۑ&Ux:2*թҜ%tԭ.?k9%iأ[}Ş乨lne|ap#5U=&u2eQ23=oaGnN]{"t89_sc0FZe_L(*̢7-*w.>|BvLuq'oZ6[eBUKӞ>I[xkа6l0S-픮]xlgok;8 CP:CmkB]Nj%EHo;<(lV#f5m٨ e|gtCO@ξ-${>(N@]/Yo^=|kat֞7ԁGgFF^N(nNM'rTFE( 4WҌP 0sl_h\&^Ԛ[v0Cϑh! IUFkPA4r}wzk*ri_'zte_RQ]) P99`SUPCkg`Z$@jWCw BTb;y7W>wǞ A7p⟾H[ ~/Ȍ|#6@Oz؇XWn"c1iW~daDu x:X֔i 2i.Kۛ\~)ڸM]ڋP9r6 {S޾۵)RD~Qd}rUsv.썕Ugqlzkw#0ta$T˜)K[g<ٙ9`bnZs #x́Um:Ň/~J*BUfJc~ t#a=Vu;y VmzًXa2QNք~tB%vnOmPps2A+Yw{?p׼ӆ7\ [.j88$txP]1n9ʮ9ml a[n76ɠzTi2aV`H Lml`fj@Ĥ%E-ψbx"xBam_N#llPno]0 cVũt 4Us+s$QH3KSplbL\feז+r2C#Af&w[[kƿyoyB矖,;՛4jQ\sN c=Vu5ASߵپILSg-&}VUjH`HBnޟ,tCK%[0?-9>kS=o9[f&1e{1Ɍ~&y[1ZE5hTc{M]=էh ;7~~\)݂}J~MnR-H?? 9`ΨG6nk}Uc2$Net,3m禸5 {79}߂{1R\1 xw;|˕ WlwRjI&6ok bX&6R=(sW%h=k J upEBPPR$8y::%SnS hvi1xvb::~֭l&j.`vYr6AAbng-ćrz4ʩvQlQWSƬ'IbߨKᵅhFl6̳RIgՏ:yiRPWi"?--I-?V`JwXCl-RDqdq8Ág2y-fÂ~9Ig2a  ƗіTchi$uCV\1[Vc{,YW IDAT.BB"]濾?ôAֵ.#F-[KNmLgwuIlDN̉YKL=:w\6SZFRMȀwqQS7}2;_S7sYm=C3CkFlfwSUHI6آ:F߽٠,dV}AQ}ILki(/ ^^Qy7\\Tć [mRoyP.|p"26p#;SVnF5&GñN %2@kZݎF̂nH:l?Me!psNpeO:L,xw2mnHSEύY(]bk؜Z#5Ǹ Rc><ˑ*4" mѹ4Pz*BƴZ K1LIډ'NkAr1j+g;J&4>Me*HNXyǿXzUMy[XV*E?00.=)t_(pDn2'O²Ow9O^Ombj- cV.-w")njkH#I[ަ礑7 >lm4jjoL)Xv!yj./&A˩3V$И\y5v]fs涨$K^_?O͝lnǃ,0umoHƃkg]ht~c_&-͚"?wI՚> 7~<om+[dX˰C$uDw7i%P܃*bH#ܖY&-yܵly{ |# :d QMsRo@"~wx{st|U1=hO@ zm@ @@ @7@ @7@ o@ q7^{it*@ D+~`?N%hbL]g C0@ oM ]819KY`LAX|ڶ/%=,xȫ3dӓE_D+ ~x?*J/%TA3֜/w%Jdשּׁ,I𜬷,U iێ^<8y⫂BdIֳ{iŭ Z:dcϿ#'Y/GE)u)#~Ќ5q1#|6q][+Q"#o;wnϞ=4߯Wx$ dr*[HwvhR+{nH KhikJg9.M{{y'rr}|d˂ICtkie_T:.쥨2kM>t{ݺ93B刟 %kgHrθ7l;f@n=ԛ Ub2Nb&h k+{zyztuYxmAuܹKM&zFCPdQQQA5`ϹW?\0 +efR,LCSa:ƜL 绛@ ZE7dmȐiNR8|3 >1t3#۲ _ظJÐ@ G[SEc&]d'MVWTc+D{۸'xvx9OB՝ԃcK\VTJ?;|j=[㒌qd %Y{XK7"(hH9fEQ]G<׈H"QkO l9:'AY| ۦ3*s??p 7o5 1it&$@Y\NIcDȠ+2 *J.sw裌_vVr.(8 5V ՝&f~.() ;3t/sÈy~-eX7$/1!zb7}앲?ws9+}TK#c $8]k2Nvc 頎WW_}!rjGq|[ *p[*^{[ZmI~^PuALŇ6d2JJ"y/T,7[tXe"v|i+u\ U!˃-r`翼v2_KaCpGӖyAڹE wa(zqתƌvnm4+`*7/!r{غh}>V 'a~ی~Jݘm;Y(%1h7QVVKL@'=MgYL4z2_cfyÿ} <5b(w! J?viZ\^q_[[qorȦ ϳ 0R: ʼn3K?$r+S|4?׆Vw 9 'o/FYbklDՒSl'i%*O^QM~ҢTJShJ[{Ast韟y߭G513RE,q$*DۭtuOk+qqAbl{G_tiYDa^!/\Te~mPkOe4Y4,irD denl}#-N߿K"KЧfMb?ILFqX^HSZ/=fiYD K1 :̕ Wuj!g??DR' `n^kH$#&SXP@]~eƾ" ~ߌ=ƛdη:J&kɄ`W|k%`<;'۪8'D.tl4KҦ<0r4ղ6k t]v`ã <$tN~5U0;=*_G +3"ן,me;YуW_>}M`C>&kdoB:`SܙC1L踙>D=^Y:+R ?)?4a0ȼ :͵ 80C{ڨdݝq>.#gpUQ:Uxn5ש䴷 TaV3@$2v6flSFXs{}ZcM<5pI>Ϋ8mUK1cC!&:5nɆbۡDe|~- )tyeJvQ5 ǩnVE痺QJ5zjSFN 2l3!4dI4\ծh7§Za)cͮ\FmYP\KrA^Ike]N Ipnצdx鮩]- %CWtϸjx;p1M|Rȑȑz]\nyT!WU@Ibl٭?MSm^fJ1 'g kzAiї{NUT]6P6mq3$J\b]2MR% I9\IU +/`U1 2SJK?n}CUM 1VN1 o[XtsO]Snu䝺҂߯LʣeC1ȯ5iF1"g4Q.RܚE?kKЩ&%_.Shː\m\ˬچĺnUr FWe|)g2JD4 qqL^Q7̿4io"5f)Vϛ :$7(#Punڿj55$%X ǶyeJ 5%R}6CvQ@o_ܟ{KN <5 Ms݅_wjS฾k17DPLKfqGJ &߇e`ѽ ehb:~apU4U=-?t~ڑYCe_XT)tQY1} 0t4֪>>>#FE_Z(T[ RYrkp*J RJ_ 4AgYNHA` #H\-㌫*~ ; IUGϽ_'09 o46pTjj6c,^m:^un_U@ѰZF ?Mqbp^V"5v8|9 X)$$r*,SOK'0x8;wС@8-A۱$jS^H !kHAN7QKXΕPZ\(lenhyKZN҂5<0{uUIkY0=Vt VQTUw))[79Zmu%2p usDa%Z%]"K!(()`Ip,m*u#d9iPmXPo.N˭)3KeDi)~g\.zݕq,! .04R/Hq#o{g&B]ɸ^&uC^Taɲ;Ϳcz-=Ǐ>t񦏦ml{(0@ѓ,c-Z+x LjK~OhۦXX|][OB> %lǁ]ePE 'rj"NUX=˹F&ď'=&Lkmj\$:Ͷ Y@q"G*R_ i/!)CQZwr 5i"(J9GHf Iq4q :gڵ0^kx~\bpMU]Q;d#1CH,a kՀ ?aKS'O=M** @䧥54.l6̳R%[W"tZMSvPTG3@{I">Jc8Sj_F[rRԡYSײ NYF*.,s8Lf;l`sXP§xS$(ᗓt&kSJ21Xz \"BmE /}lik/l-92U޵j$"iP91+7s`߂+V&Pc}J+\ءi0.;jOfwf.Ә~hc&_wbN|T/FŤv)Svx\Tդq?BgnˢLt2/asQ4)xOWΓ}ΪdGwT32LN^>>r罦frJfTN<$xjla÷E +'Hq11s)O3$BVZc! PO'I@stP&?x~*D_K;&ywTǁpuQ[Y8Wʍ<5qhz444(SG=wŀLIډ'Nk٠Fkwtэڿ{AEoYJJ'qT̈́a6\mS{(?rz@cYp} IVͱR"p0i= 8E/V3ZQd`p2-eKKʀSn| Ӟ:(◒PM{ CXV)?G˂߃ RRRdI, rt6o_^:a`zù36ȅ9?.e]Gr<7Eq|ƚwPܟgv,,iU}W.s}.,bu!WӤ,tAlo2.(qovۊ9UO1DلRa伉GOBI1Ns7G1 O{< ߽yo[RStפYRĠgItbM9mc?q@ )J6 ? I^]Gt7k(zVϏqN="+']=Tn8w!j@ Zo :d QMsRoϯ_BrlX4ɜ@ {iO@ Z\@ @ @ @ #@ ߨK#W!@ Z-C&q*YE޳d{ XyL5FsEiK{;[uE"- & ӭ[|ǧ}}-~ֹctc[N\d%Ƭ5gGl<_G6Q嵣uᇾ۩dF#sOR븰Zʯ:|:Jգ۬#?kݭK]?l53Zl$JZpJϡu7rf$QQQA5`ϹW?\0 +efR,LCSa:ƜL 绛@ DkGz0`yl׊Jv/Y-g`u\1ǁ#"(mbLA9}ȶ—g"607/ܖdb-߈E"ENN#oC}Ms{6΅<`Hdp KKi-TԢպv(th&s鯃/ |@X7m=8|6oiaπMrz33X1o"DG 4Ђf}!& X1ΤA2ˉGEeދw{}-Alp79Bja˂&ڱ>}*+v3o4Fފ ,-2w>8]a'n%炒`Yclp >_ݹ~obj2Ұ?3K?WHi;7RՏ{C?HB(NgcoOvH2 173 imML>\FMZpw'm h1εsvg:paF42W]uNnejYR>goj%oٹ}ߵe yN7.뫎q"`Î 8 _q>M E$C\}"BZ˶lm*Fł_JFjMZ:T7/J>:bAȘQmq"ϸX͇|m=s!$Dcv3Yc|5` 1N,̎[*'ݞ7׮g׶%LAc鯮L4CԮÜ(:dC"^?nCŋ8~XK)^DF#|>XJ/ql rőږUX`A&c𪤤,žעNyKgqznk0?#idɋ}?_ |yĝ ٣-d.>/T,7[tXe"v|i+u\ U!˃-r`翼v2_KaCpGӖyAڹE wa(zqתƌvnm4+`*7/!r{غh}>V 'a~ی~Jݘm;Y(%1h7QVVKL@'=MgYL4z2_cfyÿ} <5b(w! J?viZ\^q_[[qorȦ ϳ 0R:LǏxSV[-WM"pDv:*|ʛ1`1k(ei˃ 1 pƨ[{Ast韟y5 9 'o/FYbklPEٮkFw=q7Tr\FcK0][gxIH* EH)ٰ&fFh}5+ޘ?d.D'yעqvfIsU1Bn6\s#q\(^ƿ0Ӓ4;2 d$gjIœ\!r 5v}o{Q4xE$18yt񵰃>bK+5m*E僌!ۃ33dR/{yNjF nl箁Lħ5˨Lh*Nwu/5ZG\IĶlH53J]P\ o Z۪VSt3cCьo$f*Cnb~^[4P1% w^N>+)|-P,%eYxGjcD۬f j/u_wk\]S''ZJ XkXq:(Ub#[ UQh帬tRȔa =!3NrT Y#-NG;l#+Jwj8 CpmU.$ ؼ[[^ 65/sS+.]] }||4ͫӬW 2FBlA[_.(-v/éuuF VPP(D鯒U]z)iZ[Dz!r58+*a <DFrJi Co"!)&Am˝tɹ?w]sʭ0S7[ZпIyx<1 ;(>x^̣f3jXJ[G?qI:դDe*ummӓO+(($gR]ל[jZƶk}werH>z8& M f;ޙh=jp']G-cʖMV2~vM|W2 %ݐDg0Udi`l{X-^@q"3fi0?$̴q3XVW+h1xrձן|6E5K0َ,9 1]^O g9L=} g(h<:Uc,$fRLCG?,0 !s:42DjI׺T㖠t-8C|OsQR_ i/!)I7Rwr 5i B$똻fݖ!x#! (H u!pzO峭$% $ IuM{ KId^kڿj5H:!׸Q+Cv Щ1mf67f %81JKi1*Tc0 P4|CK#C =W_o.aD%k^tٰb9%nJI9X{&Bk69,(S)I:Ztqfe˷d]urMN2On+`qu0p> R,,/05 d2r@oԲft~Vzת=K:sbVnx#Sυ{;·s>`߂+V&Pc}J+\ءi0.;jOfwf.Ә~hc&_wbN|T/FŤv ?!ع9i9KjIPRn"Eə誃e&^NmNs-}$jijN<$xjla÷E +'C GOF+w>g5q;gJ2JQ4oyP.|p"26p#(t 쨐FIקqqF>2)7#,||x{MGm+aDkL&ykV&ƿ$1#iE7j d!+{h& KF碷nӜC ֳȂnH:lb ODKDUn6utirvSSrtu㎳2f8fټ/߹8O08& L=l ??`ʪhZw֩!'kmxc"!MV;kh?BM# 3t KY9gLJ4斓'%!*$b]dִ5J+V6=%߉Y`[޵"M1B^,sR';HU=d > pԍxސqЕ> i H}񺼨(x5͘({+.n!Sm;雦 ׫)8YZZ ,2F-q/ɏb0ZK1gEɕWmeV87koTNG^зtض `a߹ï9ݛ:y(5OwMZ5)zm/E *?z]{3i]̴)mw6*۶V5?H5h-Vq}eWH :YkEY֛(}~sRA]_9(g ^v4s ζLM@ >t2Fխ/^3ވK'%_;t1-;( Xh9ٶ@ w?A @ Zkq@ #@ F @ F @ P@ @ ~;{;Ks/\@ h =ǩd-C )Sd@ iS6=g)IS4Ovk>F g"@4P[ɫ>)9YoK@3XҶQoxQڃ{>B hyV.-#_>Dl0:HUґf#.#b@ oGTFsG[cܦ!J 9}ͧrZ;3L1 r9,=4:ǫLJ$ k^eǛt|mweN2-Ut֎VwQ9k/+L  ߜ|ӏe5S1>3J1"GS h*\F̜9TV;6z9TtUIc:k[}P{ϹW?\0 +efR,LCSa:ƜL 绛@ DkGz0`yl׊Jv/Y-g`u\1DJw9|Ȉhس1n>wd[v˳QWxT{- ,x!ʌߺJvL\iC%ť4Tc*j}k;;E}$kkOF-),r}g[$cE>Ic w|=dCrl[S!S1+Dt9mہ3OqTȒ7ܾڋ2fUlSp}ݷz[r@~ݕ Alp79Bja˂&3)!roEE_yYPTr{EerosAi׬1=I<(O,bZQG l ydղug\C61"J#6)O>Jm9>Wc MaNdApNXaKۍkW9ƨmie`(T3QgbNz|>XJu,^ T!}ݘiC:`;ՕWfj,o/y5 p'/fFFX`A&c𪤤,žʓ]#T`\ QE%%m 3_ty@TyWв{NM ޝ\p 9`6I_6cfRx7fێmb9J= wSg]ėG&'20A^G)K_#|mAl4v8p[e;t2@9)̜fktPOSAQꪄ谰Ed95A俼v2_KaCpGӖyAڹE w!f>/?|34e15AٙU IDATT7ULzǵho\@ŵ3OzC|[]#6~ns:'׻&Q+dTՂ(phK3-kE{ [ o¼B:^󹐩,ˬ! 5v}o{QTAZ[u[Ch2_|35ӬCAJV,l}#-Nڭ@LZK֟4-s),(|E.Ok "a퓳nS)Yx&aٷGE^y`&`R6N&4hߡ6H˝I:8H&ǙDf2v6fl'BA:Ϛc2*{47!r((Lgd[N8xȅ:8fIڔFt?/־=(N[EWt 6*@"Sh*o(54⻌J _2,#A1" _Ov_F)I߫ ^A+B:M;TI!Sm&d̘;Q |{d!}!qs㥻NNt $ ]б9Mܔ{ʱ}ufWd~.#EAݪ}U$HcoЗ{WY;,eF6;(*Hق^}ITө 9"ҏtP5@$X9BuciF1"g# FWe|)g2JD4 [ z z r:< ` ]fθ8a,{]pỗT]~΂;A#-$uIQrUoh֖*^f\M NliAW&2!v(jH !kImoO tYm$Q}Tݡ#^{8bz.U\6g5>??-d?3tx ~<փ@lۀm2}Xzk<\b28Z -ũ amվ݌?gu`,>:^u7'-vsV, .3~oլ 5ahjm>j|( O+i Hp3$8u0H+s+xޤѥ#"y;co!X!Q!bPbFbCTQb{ٙٙg+U-_;䡽{&I6|=D`VSG`Bۿ{rr}ov[LA{/NfJz8޺m7oCh!jZLvzcs;(AjjCIq @T@[WP"ĶD}l|@݆(7 ]yCOYdOϝiu#͒7z-RRH3K_软&˘1}B͢VԛcN= ==-~j?o<0eq%G*1mN?y;T; ,.M;W#a괃'Ng՚=VO\pYlEB%5Ǥ.oM\AſX;$X (3쒴آ>Tv;8m)xA U{{TiKL]7T֝v}$;Cefݖ=Av֜tݔW\k;3z _3Y]0F%QKG r ߞە]PGcvo?Yc%)ɩrcvoF T=xcu> YKR~~FW'zo'G#4=֐oVCWEMmO&<[|a#Ch1֭}OzN4)W1,?gͻQ=HE_k?HfR%ҧGuϭ=19/4vگoH?^JِS2Sdܻt=@֙tow-pD-U+G+CYgeA6ȈzFcx0[+rθKz㪾~ώ[K_iu'oO#'z,㗬Mٖ8e3ˡ}kDxUybAq@eMk{Yk@~Q8M-(a d{rۺI_:]6/2s@OUyTQkAbB .y.X*-J>}jtȈfQ#l޺$νD,Ͼux* $Ir&jHuwwћ&=#bP7Bx)H{rȁ3߆Mn|f˭SRزJ˴tPOg}\oÉf/܅\&˵Mա߽ U5i˚>Q㦇i{brXuڵ'j\TX8ѝȅ?sü1i;E努YFv>3 @H,}o7ٰb 3bct;-|f#낷T̻V!^)6֞Fq0;%u+F9P UgY-_oGY\@}2kFjthbAA2PXZۖ5KVgL?xAiUYYkurLt$C˧m~)Ut̝|Mz>Ϧo'%Ϯ%$l8&0L/vߜxgV_O7B! lקOF}jt7󖍱ec BB!{w!BaB!!B!B!!B! I9z:B>B!_Ӫ3cif6/w B!ǜJ_g%U*hc913O_]x;ak4^B!_ BwTɢg(k`tfġG:OڷB.B!|ϟ2{di)1M>}*}vT]\oqj5qssĭ);1"]\=mݹ|D,._ڵ]T>!n*wK8a}d|';HU ˪oG=5.ͣtչ^`;$BdC6u ݬcUۺLe}OGZr5DEϸUK['PwvE&;3 Ll/ )ӝ?zRQD#T4j"}!m[2D`'H4cm)fUU2n|m=]H30|7V ֝O9CsM[5jg)cg勫ۣ^Hk o'pBC!uCLV{ˊ0z՚ݥTL;OYh}ņo; 3OXiWzߏ8()>>߉ >SX+{|ѳ%\NFvSh[^O{qqq[n}7}Q̍jB;K7 n^[ϫH$\:WգؠL _ms;r3wc7˻i~^\ڳR`a1nMfccni6|@37\z6C:hɴi>.J 3&t珟V4<'iU~n?L\c=ΖwN&3d<;-]"yr`\FpGPB)TK?}etѢZ_'yn}1+VtթٱeAy~" 铧C19ta6v\st\DԢ`N1UlhbQR#zXԷN{Ld˩bQYݙlWO]aс^Mc@nWiC>J,}Iędq+_|Q-)f\Y0s~[o)3 =mW7pHU] BP$dջOڻ7l➄kS חbOՆ׏ W@[WP"Ķ*P`p~! >dvd_HxOϝiucmL^z@}5\Dzxomo1)B.%X#*R% PU~ 7j]a\]$UyX\^8f`)plڹ Sߊ{: e-,6G_"P! 5KH0n>pnܱΚpnhN; @uv|8yoіK(y3RШNSǩ!B ZIO3 p\7B!!B?˅B!!BaB!!B!B!B#B!'$x>1 Y!BM;ϴ_@H~6x B!ֻs*}UCV9̈C[zFrxS wvE&;3 Ll/ )ӝ?z(JWʔFLbWOܵ+dvɚsxkf;F ?zSw_H[Q;pa14XpʫYe3749~izo|E2ڕ] vAf7ktȑ'fi{6g|G} eyʪk5壎|)a a#_]Z] 4L4e& @g7Z>Tg}}l Q;kNnOayӯϯtWGm;u;ֶߞOt~!Iocڰ&$/`5{gK_VpmrNܬQ>3Łj>۾ĕwb}5}sҖR\=Gw[i`b0vQPeʖo%T IDAT/'z 3-uX3y_4DHC`lzzeq\JQ:`)&3gי,Bё ճ/MMͧFyџWq7|E17 U:4RRyM2mfOQl}͝h!-*S|p4!v7up=>Sx{[GY g2E\nᆎzLqؠ~S6~\(|\ow^YN\8ێSwiomؠ|ZI-YߍU|({v^`RHG{eWtm~Vl 9f+~݌X M܎w;!kl N>,QunoWީx:RRw呩6#MDFҫa<7@c3\jҢ*z%ipw˧L;"38krPP Tlrs9~qT(-**M7Mv-}~tYArȚ~lσRq)2î.Fiƞ1k{zE%ˀ] O$=/i=d*F.8iρL-#wGu+_W&x\JKJAFAs ;(WS>yfˁ:Xs}"_U -]>abx1 i'o'ڍh5Wn(pϿ9էm]{i6 =2w#Be'VR~qu4yQ +]/Kqmj?2"5Qv8mָݺ_esW_6S;CwsꢼW\*m/.Jo{j76&dU̚MQC֏wntҞ] Cq=|Ȟ_2܆CԿegn@sm,tiҪI*)+LЩ?4s3in]޶iمUl vrsQ/E0ɗ Fr6mP΀tpsqזj|yv3A':kPu忛߈ Eʳ%+v_YFetBe'VyR =,_bVdE/C_ sZ̉4l۷+ӗ 2=xa{/'Txմ'\زG)cKfGͧL4]}v*a]WD5f`)plڹ So|3XQǔٰK~۱dwH0B\Ű8l?2~ /o5#UQS۷Gt" } dr"KKJ^ ar?77O츅˙o{9F_>'~ݖ]E{Z`e"+ 445G{M33qFL+(Po#x jȖ߽Q~ǰz M- xqӎ~CqPjΆʗ"޽pGfb=s?˸XWրNktY!4qmllOn[a:KݜcQfᥕVv詪  [BcV(+p\8N1"νD,Ͼux* $Pv_mw ::v[j}EzVދG76lr{ON 1P˄ކԼB x1o?,BsܸlomkΔ>–U^cEz:c׽F.d\mc3=u27_ ],##MkC-=;UݦԌzd]*y>ߔȅ?sü1i;E努YFv>3 j0岅TX8ѝDv֮Ռrh}p\7ub*)._mzhQ_N4=~Ql9 MpI@f'fK#b/?[FsuyP/+m` F, mKIw+f3&`Vm<*/N=W(hwzC\SK v=V'w~Uc+"V|iCQyƣUee3Սz1q _=Uq<֤-kvDfi៍33(}יG-ܣԄrZ;N[gG?EL43&N:q:B!j֬lWZ* !Bԧ]vɮdJ[ߎ$5Y}h7B!V~?N.{VPփi@A!B#B!ԪM!BaB!!B!B!1 I9z:B>B!_Ӫ?3cif6/w B!ǜJ_g%U*hc913V{!%Ӆ6VLr .mZx6#!BōsCfbwLbZ*9YL"bs lΌ8UGy"w}{/[2%/_JɗB!)˼U%F)uZcJ j]-\[d;@!Wcã&H-}?kle ~_ށWdN_ ګJ]vy3 ']?rƑ䇥2o)>2{dimb̦m)mfDWO[w._(1v?nd3 \~N{r|p|TZZ)vSǁ YCӌU]V8o?sSO헶[W|{OCW. / ׮Zl2]Y{$d~YNא)IWL[8E]VF@h;h)-ˣt3"}pCG=8KlP?Xt?C \icJY;,'.mǩʻsx[4qd6lPP>olZ~ZפEWO?fOFVUP>=wD0)$Ȏ#ɽ+6?Oz+S6i3?nG_&~nG޻BHe'Vԇ%j;UOGT"l.Lmi:$b0^ kwcsV$t8ugM}?Y*l?-*ȪW"Pvw3J]r&9T\Db̰fY#v%|0 c\N\LO4VkU-ܼ;PᮟsکOe*U/#+u$lf\{>evGF:!P!`c N%E: i #Wb`IEa٩?_0,=ې {t~g\Mx~8g^ʾ: AQ*R5~Zmfh@5c8,/zSTnҞ] Cq>-{^po;bj.\=bv!tdZJZK%ea:6㧕~n&\Ҽ6 SNr?>߀A}h[ƴ !&.ǦΞۏs侶T˳ӟ 8}Р7!%gK$/V쾲vnQ9~!>L N(')zXӿŬXɊ^U[\XTAՍ?˅_ov\st\DԢ`N1%."2mf^[po:so3;A^Ys?1>vQEz@_#:_77hSY%s/8,q%k^yuU-)f\Y0sWo{/I iGW,l]'6qOĵconK ؋( i|`9j忕b6UzH֎;iHU] qG&'h"A&زBd*Hm]m().(BhjJ䡔o(7ػ8%fX$Gd ~{^ycSR\J%h>'kN% & ,.M;W#a괃'Nۮ\/}~=0U.cM =ݧ[ =VO\pYlEB%5Ǥ.̺-彻M_>BFOZ:ZPg,+8ٶ11vl]qӚO*7vlK*Ķ-v)G5r< ~?&(,a޺N׏+f+Kvˑ)(JZ!bX6sj誨Ӊ$`^% _d:,5.QR**}z1xTa}g-\|Q%ί49#,pD-U+G+CYgḛ_^oڽdO7fz'>\AHK`|?WC~+V춻Z_APw&dyWN5U?mf}e;k[lS~J [V)zv7|W%,mlᥰjFpz w+edrmSu'w'۴Q[ R2:_wn < scu@V~q\Q5KgT7F\09~jus'(nڵ[+9n],A%+^MqÒ<5czxo'/-U]{. !l=raDghQ;epm,em 9)QnŬ~$0LӪQ1OO'RL;ߌbҟ+`j)׮GЪ-KJ]KH؞+q4M;MY=yH&/U?|U5i˚>QYmǧehiufnA̼d50]'-rɳ"o&] ipq'޸} ~Q!BeekV6+W-u ÄMbhwyB!wKٮOgdW2%~_}oG߬>4ϛC !BA+?'=+(As4nkJ` B!B!jURB!0F!BoB!!Baݘg=fq! {!BiD4}3[|B!zcNJxճ*4ұޜqq[҅6VL#mkhB!71iSdQ3X5r:3У}{/[z\ڂ7VB!'?4tWT X,Vj bN'4=B!Fu49Gn3Y#\e(^Sd:Dt1ǯ<*M0W[͕L=}LTa˻竺Ԟkx5&sĭ);1"]\=mݹ|D,._ڵ]T>=xmŘM&S7-o=$t] rYR%y:ڠcѫ'dB!Ԁ,cwȢ=ݦ.ulӖj[7"ɣ̶_/)h6HXj`JQ[! z΍r}NWnyQZX$Nu}*ڬ# vc#xˋs'2d9^#(P6#~CcF)LW[I߻/-yKFf 8UݬJ}zoݲ:cVpYsv^jG ObuCL9܄cflwleGl-SV-Ω::HyjGiswԯXmnv~# Յ +_{%5cota;y69UFh\҅;7n>r-t;:s. oӷ`G>30B]G_ņo; 3OXiWzߏ8()>>߉ >SX+y'G]_:'m/ͦ|ѳ)BδE7#/l?#ٽ{%Sγc&۾LR-柷9peT=4SB-T g&q$WvEG.41[`g(XG-|p4:?/as{uYӑ:v0 #Sm~G7$WÔJkeynfJoz ~#*M RZT"$&4߿tǑL DŽ>47,Rq)2î.ƟICJD,蕈!Mo[or JrTx"yHuu V1Gf僉&ઞvM7>mv:==mTj+%&#U87nޣfoM]p}xP5sts ]~u`8RRhW CϭoAxVd߽ʰ%w{ ǿFVoiY:PM7-Ƿegn@sm,ti*i}\.f&MTg?tq2l~&ΎiSTK?}etѢ@z#|?E pXPquҼ6 SN NKH^}e<,ܢ7B*6 $g~no^DmLPB% 0@|pemj>?k_̊]kS(miPGŢ2P5P 'ov\st\DԢ`N1Jaz3pVivKF_R3q&YJz. ZR&̸`{7A0@+51 IAP$dswy'vDKz]+=mWwCjƓZ,`4@,fjQr&( "GV=B> %%..6DJm[i/{C3/HX~d|+0sst~rqPi?xĄzGŪv!@cvo?Y%)ɩrcvyXJlx%Taok{uiV.]^&f<@3ػ쉇T* >)VvVo7- Sţz:̋~2 \%JJEO/0[we%0![r?[pߘgwoܮVʻ}$vO@Yܴƺg:ʑ;PEVpYhhjy5QB` nK.Т^-ߐ>;~ܽ8!eȸw/'5%Gz,㗬Mٖ8e3ˡ}8"?: Re ۓENR7X*}(Fxi夕C7z*TX*-J>}H8 {ѣ,~McyIE%TVױ|1#<.K͔>–U^cEz:?;b [ 8h蛺uyHEΐdq;S$e=raDghQ;JV~q\Q5Kg֔Ց6#P 4c`\s\czxo'/-U]{Ӯa*w.K,뎣Wr4BZG>r!@Jb F, mKIw+f3&`Qz ˧m~)Ut̝|MoF*L)lٴ^FߍH$Tjncsl0A Sa^$XmǧehiufnKhIk s2})'iK+7`Ȏmяb7.4u@{ZB!V'Y8!BoB!Poj#B!7B!B#B!0F!BoB!!BSZ/=믋lǷsSStB!wzϜť`lӣ# j**t'4ӵ+<$!BDU>_^VvN1vֻɤ;vxM>xuqB!ֲ- >}沛ckגTUUKL"=aI^Hⶕ?9bwqM$v7Л 5;z{NySSAT@Xrz˩DJH$! z_g}3̀;vI!7Mh!@oӴrSnK"DߣS.s{ ˂Ӵ Cs s#.ڿG  oG#ִ!:y)Y_uNxzXTљܖUg ,GlI@Lo:J@o[҉IY'O q%Ϣ.fhIV=ev@ /|@,gjo}H#Pj0t8eJ֧yQJ'+i3qrRY蹷i<09AŭCņ@ ħ!ܻpI9eK5kG ^^Lޱ#jR#(C~gN4$6ޞSvfhA:c|lO>uT3YZT,Sz0sFiQXJR`rAA~争>S{,_s{Vه(aƪ(aMsw,axroӊOIJ%q'1W?RH$erS}n?u?id( //&kϋl#GЁ,{S/J@ߦmISz@^ܸ|gjf^@lC[3;s1J}qRax͍w]z\ 똵j~woSw&Եׁ%/<T2roa۶@1OEg8劣 UMPZ? lӋAI1[d~r}V)yaˢn/G?50 fؼǞNcFO_y'7^7d֋eKOJ$-FR.k Ji3->F=(a.@JJ(+!1;op[V$@u0m ggg&x$##}7 ɇ+#{0lgEd Zxl^]{B,c+ni5X/ hZ *+!yseg4_0͊V~2oQ1Qdť\S@h칇&̟d Y)H7lwdJK/m^۳5fAŮ(_`&/`8!WK53UFdT7%f/]w(72 ޿^?%nV5vks0okG< oEN}&ucj IHTl$V/MoO/g[]I+it6`; fy^Pl=u1I q5NQU@ xyEnahb>FQQ*JzfĎԴn1}*l"J >~dLwm1]g ncfK{S=/ A*KK-") c–.NC>8PB)d2Jݾq響˥rSGNӇ>ZH.sB+1[N39Y/_ɍڻOI=Z j7O_H=ZV'< ?V;?03!=0!=#'$W{[@XvehՁW!ǘGb~uWn {te]%u 0&_AA o ͵ /S+p6(D9ig.غePn}جW` "ap8λ?=|0;ew ;b6tPHJsO%/[|Gp1 Xݗa, v% }[&@.q0 0 y8Zfqtdw ɕ Z @,QSe+4a+7tSZt~{;WwpܚEykaPDw\H-m{1U9V>MPY?@ m^uF% uu_¯9.\YR$]}]L<ekČ /_Ƴĕ[}W67,1 aZ.uq6\uYJ8lJ$*=iYxL['wAF}4l;yӡJ$ -c]x^ }״'lrX"j$r՟oDU9J-h6BڐGX0ݹZ5Khaoxv?ZW+r?(d؛en`l35k<>| VtԲsCĴ0NI9}M=+o'ԏ@ &UutMn% I"*I ~p;CaTOCSl3C*E|6+"y_;_dybnѳ/G!EETԏ6&T @[VTvтLgCw KI\l9cH='(Wf[7͛"*қUq^}AdiR /Ͼs$.< WN|6+ɂSw7.y퉖 YLL'h䄇€8ͦe"1U;Tr݋,%zM:o1jń5jo._u^-MCaәt:N'h4-ϡw$Ye6ZV-a:Yu_% -C3UBR;vѵIi:ASm S|г2r#3 & +i&S!@kr '7,/QIA]@EeH{/%(oF 惰;+#&N^zט 7ץ5, zSyͩť<3W ghth;  fUϤee1S:V#&L]'PblVaUGY[Q9M۸\Ҭ@08:VASxp1)珋SY-aHWV8Pu8}QPk9-8( @ Ӵ[^\#.g c_o%@ @ W=@ @ @ @ @ @ F @ F @ H#@  Zs^''OJb D}@ ߡ}ϟb@$*KLJpw h@ ?Bs?!IrDA`¸ 9q|ěWw7م .oYD6wYt`ܞ%'}UL' /mZz8D@ W)..ݲ%,T*PEdݼQ(,mqr|qC;TEYƍ5|=i/}G_Ew;} RuBIRO,нcpǮV^}_@ )wJJ I2dd9wzȠᆆB@.T ' _$ڴ3ؾc{='{{1(Z^h[qѣM;ng9n:],8__ Yx#>:qͣNBȯsb#GLʟB[ )xhdD/SɜGf^IJNvIڡI'=|SJjt9G's(5S@:2%IcYeu,:ɊWN{(#֞@crLm܃ޜ =kn˪KXؒ8P٧[M~ Jg:^T\@GH |~BA4es 3˱c÷ocpe(5Ս6[А7ؾKޅ UOZ4E-~^}M_\D3VEdocy%Ke[zT?>%\P/n$'Ԟ= gW>wE` =s>UƬ߯ rռrRK3AH++B@XэQQQ ۂ@`rO6ugl/H]}hW \P5cx5WTXqSN}BoZiTJh 3U%=/ϏmQub<݈/ !23aܸݢM@KL)S?F`;O B6Bpa6FبQw -bFo: {O/Lh)зvԯ1ŭޫe3 =|wտ=w/{%ۺs';1hᱳy݆IQWBkcv( H^-W3|҇]4H$cW;[n]uO Rӿ_Gw4 tst: (9ڻ8F pǿ~ Ƀ ϶[I6")׃q<#<u;[sa?L?RE͑nbj^7# p1GGTU^*-p=C{m֘1|t]LZ0؀KǶe6s1Jtseg4_0͊V~2kZGP굼ctӔz G)H^.`~T@f)IR{؜Fԫϩ\GOvmoࣚJe0>`>uw[Lz-^>oHώJ%+.c>5͝q^ZH!TiF({$DÂKyTjė݌G|kkLxTL:lUGi짃 X<e+I'[`o^ 5vr6#@E=hYj4-]"so:D6 Q9hhiVOVvp%oR`§ZXhVHTɹq+%)<:y8{iH!_HåŅBkOWW ...JEvu纙R")ί:Ndn^n@ BN-+it6`; fz{^%IҮWk)׭FgxUdݻڠ\g[jVdp÷#^"N>{;H34 f^+ ç Eg拓mWQ֫zQL~)hz{z9۲쪛U$ː#z9m+_WXώۮQ֘nᆱ\L!)`tSkvAheF[=lj@ FiTۙ:`GM(@˿E޿$˵I#3ŋ~y]7i-[?7yȕ}l?yހ%}`Wu )LjCykӣ\ cHiHXV{м#6OmC4'TRHXu{5g QNڙu 1n#TJȁT.+DZZ^>w|\˩.n_k20̯7Bji{݋ω0x j; #p>jV @$y ຖoE->6o.}lkک#%Ʃp]{|oq[=I)ITR% 5v` >ܹ>>L)>0}+_wvs:}3@ )OBUȯ ~qʒ"!bj!(ѕU)veCH['GvA@oR<;!E\g7r;ט`spseXq¸~KܰMƖ+0fIw'3E1`b9`&k.;X MD1 #+ `n"Ȉ8rO+^3Z>gܿ_A|4,@P+,H^>|~qퟗGXVtԲsC.iw`;r¯{. ]gs?(d>pJUiY\GO V~m,ʔX4Z[݊$t ۭg`խ2WTT: cF_;PSXً[J8fDCmo-g(?ޅKDWK6wis '߻Nݽƪ}9⽨P1S( E`WSg'݊Ϫ, SgzOCSlwY"MsُmfQ^/hW7n(aؽT_O լ!Dp}N> Xl&TT|S$I)~5M ٧'_ҞmT|@yE |~$IkO{-%Fp5fHe Mwu8>=;LK܏f!aӒfw2Sze5p?0m-x{3?3 @[VTvтLUl:Ҋ*(iѩ% TtK:xʠO(̯lf~Vv[ c?RrWp;{$1K^pUhik@*IH߼[ɒ=/vbya:qxC8 ߕ'=d:27$\&x=%zM:o1jń)q,&4rCMa@Ϫ-/:M#Db v7>wYXW0܋/,Zjw$^څ\E_uEO>f+6 rHHH_Y\Zdg^^Who?aA|9pZO 0\{lu$^ֽW|Wbvzz6~WFsd-:tuͱc>]l.EneHviXpY1XSYC(cƹE$ghZ厢_^ڛ+iO;؆D 5<^S2u =)ԎXr q伱wo[?v KڱۏMJӱocaX}bZ}`!?oQ? ))J㧪 y+C u$z)b +1˧1Ł1NoFWcv9X*cYy-aȓMI-; ѻggNND,\ kqq*˴_== ?)X L6J0Έ#,ꭨmm܂{.ix c+C<8#ť<3W ghth;  BEʕ( Yv唈Hp$,l$x&E$Y}(P($A#^f=0;6|o?]?ަ=xk  g]`_EES߲5ɣNO$^^Lޱ#jR#(C~g^-/-ygs#g1163lW*qw+7N!sexL^}(ARTJ,-*) Nl=9W#&s},%KJ)0 _d?rDzeyIN={9ˇQXjy;v6 u|}Հ\ZBZY) ƦΎn uV;cO}YD@ba۶@1OEg޽)%oӶ朗C?kbPڎO3]@0fpPLͪC^¸g|7Hr;S3 `ߙ,/&kϋl#GGVm;bX?Ï+%b \2Oϭ`80(z/G\N0+OPeQ7+*R2w_D}@seY*?nG.RXnĂjzL7o}=R@45f O7uqcnMpNypS \o;pi)<6jtwrCu~KfXtD"۸rU$ymbT^-ޯ"o+y΍b̻XCH7n Nmcħ&^LVu5*)*C3;, d5oYQՙ1m ggg&x$##n~l?[zZ:]i@ 1$e36>l?.a(n/1-\}=g/3z-34e^Z|5KWY~&4wƹ{i#y8PoF 2+yźT17P%oDFUzZUn8">UfzNٌh*|Ł%f@K:._@&SAn*Kߙf1^k|}}]\\\;ݺsBR)W'I27/7mB!'P4:XYpcp3}=hk$i+\Ƶ]V#*m`3̭y5 Xzv$0VgroX^uƝƂkeF<زN3|Gu{B|_ç Eg拓5JZ0.ϻ#D5fsZxD6*iC6Z3bsE_YS>I9Ote)@|C X/MoO/g[:nXC|ť[jZOQyj,㟒^)ŵc&5ۆFLgDtw!!-~cǯD6+A0h`[D֑!3'i`W% 멮J@L24D[ǒol~e< HЬҒ.AKHX# _wddR dxL.Mh;+’w- Mk/^oWvZYrY\~uWn {te]%u 0 <}!5 Qτa'ي`/nW-L0@(=0!ֶx&1 hY?$n}avEP.^W>xHE)EWr.JW]_@V_OV'nLmG/"=k.Aq"o͵֗cf|C^mu5+-y)h83 bcl2ZTT\[`͌wvJQVd3Yxf>Qxt'.@˿E޿$˵I E2q#!w-zc^av =  jwm蠐椟J_ +Nw~ŋ~y]6v###r%+DZZ^>w|\˩.n_ۓ8G_ 0N u/J<'-0A.+[Z-0FEta+7tS'>.Nf[ kڼiXKUrUe0 H%ƪu95ۚFRUބ}0}+_wvs:}y@ U3=SڿŸ}ǭ@_ ~qʒ"!bj!(|\3П&f\_xj0>Q"6,Cc-.`d3%~Fݓ&z:G-,*`®Y pu.=[.uq6\uYJ8lJ$*=iYxL['wAF}1xvBNOw E H"{yŵ^mfIbFCӄy+k9im\z:%EoF.`ao8v?t@sA!ޜ^QUӁ7`Yk bL@Ӳt6CisgTf>$~ۭf{ZP:Uv޹Z5|9f UB+i.D7bZ;hϩ7V͑F ͤT|B#}njv^'Nw>9ng(L9{˂<4563dےgBOϨ YY|QsٌiwJp2+_\4@eJ IDATQ2D:UVm4 H-/QL6-zݳdä9,`P!RMB$h {o>mmiKw+HVW|_#DRP맽#{3$ﲄݻh`tiw[@ݐ0iIWûXS)v8ӟ wfU-m*hA~v6gwr iETǒ*Wkt43a2jTWg(_bҡ% KS׎#yY{@K[ W=U!7~]n!av)kיA?x%rʌvKysT\Ez܋/,Zjw$^څ@wth4;'ay;-L6\#iX!֦aL]Ss*[-==vg? ;.UX(%tFNx) YFgidHLA7U:\"|.6 J PJ8 0ĖW*|ӧ~ M+($)E8?WڛOnX_\V =[uU;r VL_OAoaLEу9s,gſع\7q#43 .9f;8S*+W GDJG&XMaܨ^7ݓѡFK@ ͣ32ғv' 7S($S~Oڴ7tO>jɞ(}/q Cs s#.2W1d.E ! olyTΝ/ޓtzQG_uqj,*9:c`-(Ȓk~֭c.}G\*KMm'5@Qp~#ʟv^:kȏk?pMziqkoPݓ~8@> @ /֧kǠ:vԴ_w\ΖhCR}2?G6(P($A#^f=0;6|8{{@_Z. E@ yޅ UOZ4E-~^}M_\<@ˋ;v$_͖^jSbvos;`1 !ҜMԒ%|OŽUK4ym h?!UV8珻 e%)sexL^}(ART[u' ūT?>%\P/n$'Ԟ= gW }M+˹\[nWTd2Qyy^~g) |9;߼s][KG&)6uI{u)+<Q I]ѧ؄jOީdwرۀ Kv-V]~]B'O}WVjy38(000s 3vm**' /1c:w>`ү2DWMԣcpǮ!#O6\*#ɒG ֱCn@;ukpdC }0 UY=;uйgQS|U Х\4uL۱r4 o *) J,;O Bf&xӺ08TVu~j;!:Y?hbj%R {1x4d ~%Q_I~29~[ysnTWeBQ-CȄ6GLiQ]H ͌""vKm&w‰̢MӈT9?tst: (9ڻ8F pǿ~ Ƀ ϶[I6")׃q<#<u;[sa?L?RE͑nP@vȪy݌0ImSUy٫4>o q=[cXqyVuco3Jވz:UQ굼ctӔz8HώJ%+.pUJIiκ󱿟yT@M إy/jbMsgVǵ=8nGŤX9n6`] P+H!_HåŅB幷zf[~%T }wBLQ$(M-M7煆Gi;9-ZO8dѬ<sIӵVK <:y8s4+~nCQTp`[w[H*%|H hP %c>37lgL_/=u1I q5EW9,q/w{_8L=sk^ޮXzv$0VgroX^}V/MoO/g[zuz9Vn}x#lI47ZXRU5u,!q(~n2và*\Zvk7KCza'O1牮,4 S* 檂G%n chb>FQQ+JzfĎԴn1}Q(;K߮)iyMd',u`~~-{JR̜˦cR]ɻ*–,'b*1]g ncfK{S=/ AKK-") c–5|͡%R1iwY\VNтwV(%Z֦+_߮ :):xLrK`@yBjQ#37O_l`f&@ ތF_řO֫pw'$F-w~+=znI'FFޖyLbcEWm͵ TLmG/"=k.<@ K:U=zw}lo E H"{yŵ^mfIb5oeM?"4KO^S,m8(r?(d؛kp=(x[ ,ʔX TLòn '4ҧ[piO<P*0sk OT[$2󣪔L-2N >l`]Q;hϩ7V/$!@:/U!=nuIg2?g: i7'}\<4563=0 \V{t !*SȬ}rzz%Щmf?7_@iybnѳe'&`̈́ I)_J\-_}K]^QF*Hg'bgg/I$ kO{-%Fp5fHe Mwu8>=;LK܏f!aӒfw2Sze5p?0m-x{3?3 @[VTvтq s;9 JuutcIs^;z2f *-m-:qF*Af&_Fl@KL:ب[CGE)!'=*K=R^j4\GY͵@@|ZOyVUOƯ -$.%q:?=#۞W_ni4ooGAIXùN[ 8OfrNbE)1jh^ooy{lI/`EͿ^:#H׿ZFv ZNX>GbKfБ[W{Z)\bVYjuvjh%"e)Tw㢁i;xOk !O`V|㵵~:*,*X~͔'njz$`1޵wVzoC6og_D!ЧrYYyDFgDŽK:>1ե.nߝdaktE擤?qЈ6B! oF gRV~ 88jH+:2dq~L!!BB!BuB!oB!0#B!0#B!!B!Tտϒ.\8'ZhecmB!0׉+K}V֎~`vAw h[cf}O B!.:ܨӗg/LMK4pض;ofIUmݶc|}' B}@zy.j9Q3{8b77}B'xܥMrSNLz6)~t]xR)4m7#zZ+iy)v׽_mf]!B%ݺH_|7r>>ɉC'B.,'=j6~˼Zv5]Qye熘#מPj{=fl7O)!+kQouz~3U25YhNŧ30*\($6%wn9r~J>kӠM;jSHS"vEt5ݜArL՟Gz0o=/yevuqwgRxn3 ,R#+ߐ!al>w#ر=M:lڴW*$0-'3e74卼^}n-=EZgFoy&c@-<9"Bu}c%Gkrh%]25YiLenjTÒW\ƉKΘ6ŪЉ} ۴q\]߆2|Q؍c/*:hPRR,g\-քJddT]eY?ly,mhg +S>hׁܴ{'o=)-J>ִO7ͲϿ]2Iu?SJ6.LM#u<$Rk~i)g/nXxU,ktyٽvKJhmc+G{kg33#4}c&䂱Kƅq;Dl"*"7GɄM9q@g̈́B'kMti$Փë~z.>K!4i,i`_[ټ{p]={5:bI"k|a}#n+'64N_{2o/Ruߕ$iږho45 m<`bέHHRGWF]5 ]s"d20wqs:Vvw7 ZZwg"GƬZN@y{{ISԮs2@Eְ٩%m'pnt\"cIt zZ:ϯ;9g)`x&;vh=^,C(T ې9s#$߰~5O *UGOeCZ},/MO}(ld^ߪ;n,Qw񲠀[ *-X+.}X=SEPlʮI" yI٥{E׾ҕ]ܱ?yPP{ צ$i]P~My2o?swR@I7QVTy9``lX`&zGe$m38Ou࢜Θ4]TII㢆ul}!eoS5nׯ^ϫ.D/3uvڨgr IDATW9չB!yR_ľ3Nw3;Ҝ ©T}}{.SUV8F,,L-FOX7Wo.%4(h6cYu3(AigglF_}ʵ|ƒ*((T[.5k֪3T#zO=VH@Z @Џ#3g$ē#BovУϻtѩ&$wl@α8PP]&5Imq ?0je4a>/n\8~` 5x2p;'75Cn@' DSB;'o޼쎡yqhByؚ-~&$h,nH5?xV *yTqcm謸YEeQtB;wы;3ʿ[vK|WVɪ7: %w~:4!Tϲd!E/m}0Ύ¼4ʾj92,wq8۫2&Ov=0@EkJM1[|X!OK.b&@=6j4 $;Eؘu"W{gتgnqdpk{*D(>b&m9 nm"e*,۴tiѯ$97l}{R:n˰P [g.BTgޟpX'e7!Aֳ vشmO.] i/wr6b~Vzz4P:m~ǜy̠/}EIV7f]†z߼|͈ύETΐG,k1oa%VMImƣkb=ʹ”oc,O?Z.N3Ja-m4oqu"boFomzPp~QExv}3a /vuϞ-HڣKGr..P6f|ī%cI)RP%z1 ?"7n\40"msqi]Os&sfV,gZ~f[Qz5woʲ 5^Rr}&-ȰBRB3p^MWI9HʭcxB!Biuk"]#fII̛݊K:>1ե.n_//G7B!0:Rpe͌?KѿQCZ`F!BB!B5wJB!B7B!BB!BB!B!n&{Ւ1cZbzO B!-} %ZP @U,<YcyD!#=|JB!P=VR JHĴHHr-QrrVb,dY%R+u~&u)>|}g !Bm+)H#HEB]mF"fBJ(i("R?J^<7S^ .bwMagE!x2%䜻Z(|>B!TZtDir]Lk@մLM֭}L1f`T\ﻉBoSrgƘ#6 ?}s5=B.{tIiav)+ћMFY̽ W;T.<eN\6}Si1l ޶% OgYFV.!CZjN];>ak;vY!B`=kgIQsZy:-jIפLM֭YQ KW)3%gLxbUJw>Zmڸdo\ML4_UL;-;9 %ݸ1RP[')q~cfGI_\13g稸#tT6IΩ_w+y|de:PXZv'@ yѰ,!&_$,[rm/=*:3KU \y@Sנ-ϾmWrإyQi_VZEʯcV;OHxYc״5+^c_[ټ{p]=vFI+193bH&6QP*з q;Dl"*"=P9>jt32 JE'#лQZ>1}i>3v?zrx[g)6-^2%܎'}RICS}Q=qEdi:i4vi'k@xeo[Wǥo*nr82i>=WGM,ipwљK{T4,S}[.vZPrMjk]W*Ly{{ISԮs2@z͕[zujj*EQM6޽{~~͛ttt:vXV|=e|w*OZmHZzA.Es1{H~yYv[6V>0y^3G9B NQ\3SPΝ]Fk"%ٷva~٭_ *h8O1k彣1is/]ΰj椆lmDZ'.Zq䫙YYtnr6~F܃jl/} h^+bд"MU1֖W3w/Ŀ|UPힻ@R 'HCA'_"O {*Yփ'! ǿyyy>wɓ'=z`={9sQFE3-kom3H^z,u:Nޯi#OM3Ǖl;';jOڔ$ ݱrҲUl}y2cvv.} zHk} uRֵgN /e-soӠWbR&-MaG$s+7+Py/=GLW7{7GI7z#`~^>6vpɹOȵy9``lX&zGe[ vaTEL]pQNVmghgAۛ? fk-) $ы;@o"mmҘ;WJksgI+(-( L9y_=6?=qխm/ny5!Q.g_W9_2X!Q `?SUk K8Akɩh:gYz7B)}ot>A>ҭGVL޻LM֭U\±ڮh_y:A֮Bƅ Mѫv,oafڱe? |;'/fw ɇ|,,2.xz؍N>YV$$^VXfڌY~mf &R¢W5S;=k<,Z7!PZo/oBȱcn߾=l0a?޽{w/ ü)FX͎V P(x hӖ p;g,Ж>V;;M1ݐJ=p5~Qp( j9B|)t7ߵk{/܎>mhlyyӅKs ؐAv~|LE4#ɣ$ע=gwv,jAj* ("+ @\R j]Zrd:Эguc!Ee%-@Qn_mpYng&4-!2YqpJI kY7zc[wǮ@8۷_tK.<+4Hgee|Yɲ+{:+~_0v.wng8ݗbw:; x+ RFQ7s)})߰/y89zVyQe{ ɪ7~s!>-R|HIl_A#U|nGXy{ܻ=Q~FgeLנ.>Lx,*k %N$^\Iٞ'% lj43x$ӵ3(+,qmSYOl㋋dD,P]ǞMN}`-O ҒD"ULI"a77Ϟ=>z('&&|e2l37J2=qt"t&zO I2#yz|g'UT}wi;c}c.RH*оA[YR}:L4s>D TXind{n>a2;Qz3lh\ uuF8 k.K-!giڟ\JۻA_>7lfho،Kذ[㛗qڡJqRp~q-歟X[C5,+0>.ZibOg3m0. KZi*4[_{3zm|4ֻٖl")?\}oJٝK P!F-l/ p{w YEዄwαG7!#FsU?H鷘t826:@L@QtuBZ×.Ҋ\y`l=ﲧ:c"鯉>rVt1H͜[ iUn%~#Gv` J]Amf~˶UxDJڢ><2pLkװemؿrƦ"^gj^JЮ6B0.a Vl2T/5 p5bؼs;b KAua4q`+vPq5KP+tġB! ○]V@!B_߅ !B;!BaF!B7B!B7B!BB!BU X 7o((Jr ; B!Ч=*ʼLFyyB09(i)JFFbS8B!Ч5kToBHbSYX[")aC.j8#BJ򜜜t] #8B!P5@߄ǏiӦ"'ժh,eϞ=f!B5 主14MO/yWinn95B!5 r!)fI#bdl,ɧz)B!Tf6@fYaR_oth8!B )@ >'ahe9lBzLSaYy̙(k 矨T*ajuG#PBJOB!j2 3f})PmyƿƷo_x)]!B3{+YPP>wnrr9sΝkdhX>4]1s|iQU*ȸXU~žj EW~r^)@KſU>!4McD![MZzzzs OIIYh%Kj S+*[bja+.*z fK 2}뼿X2OoB!>jzzzsÿ:411k 2 @ұtusӪ\Ͼ)jﭔ"%h944dn:2/=\d *!6 @ҵrsuOF'NTw=W(T [m!} (vum`ϿhY-#gtޘ'NMY"g6ojbRg8l7/B!2pG\Q R>{TeAqj||}طnZ1_Φ+/8܆ɉ? N"R0,>GzpŴ>Ov-\| ?qI9cťJv/ZtkgLTWm!Po_qɬi#e|_x˨F|~z!YB!Z/_Dﱮ]qʁ_u~)[@6c׾4ʳ3^/L?w)k{\׾sF}a Sٙof^"*KpfW;w-Bұrf^G-)ib3څ.ɒ&j拮>7^M`?c/^^vb5_f᫝@!BC޳'L}duO1 ;_\V@jBB _Zҟ>S74%uTHH@ ӻӧWXf>@V;]JmlmهJ0@x ᪬N@Mx5_"Ԓꋀ7-[WU*S)3{8:}1me^3бgts16jVm B!TkjޱsgIIIǎ/] Ҋbjk]MŀPN{wTUWNJj`ocaMs*P-e ʉ+x0WdAV9[bVX,]el^L_LscvfvO8qhXXi7q!BDm .{D(nݶm_oٲ7kwhRW10Li99T. i yVBz|a"PMd11[ǎS>S R-X|J(²,oBMS5sL253%0,"_A*nα,5u1a#B!/{lB!0#B!!B!!Bml IENDB`fastapi-0.110.3/docs/en/docs/img/deployment/concepts/process-ram.drawio000066400000000000000000000237331461403617600260210ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/deployment/concepts/process-ram.svg000066400000000000000000000404001461403617600253210ustar00rootroot00000000000000
Server
Server
RAM
RAM
CPU
CPU
Process Manager
Process Manager
Worker Process
Worker Process
Worker Process
Worker Process
Another Process
Another Process
1 GB
1 GB
1 GB
1 GB
Viewer does not support full SVG 1.1
fastapi-0.110.3/docs/en/docs/img/deployment/deta/000077500000000000000000000000001461403617600214465ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/deployment/deta/image01.png000066400000000000000000001160741461403617600234100ustar00rootroot00000000000000PNG  IHDR*@sBIT|dtEXtSoftwareShutterc IDATxy\T3 ۀ -VP)K4oZ}[kuﭾ--[״4o%Vn%&J": @|<,笟9gys>DžjƎ[QVVHseYh˱.? 2gb/DDDDDDYl88VZb!7/d222p:)iF#... h ȑ#+[aTC""""""  Cii)P͈HP^^~<XDDDDDDZ$*BDDDDDDZpQ9L݀+nnFL&.,rTTTp8p:RVVJSC(LZSqq1EEqWd__?Zf__?U(؞ ɤiL&Q=Ԋ$1JDDDDlqssW@z-&Q&j[}9iV?Jȅ)Uϩi *ADDDOhïk\sVo♉y((,}=ZQQAEEIuP>1V/sС<3iRqWTTTV `qsU+_<1!!ٓS` u YYG(1?@ Sy,IcHLܣwH{%|C!""""')(,GOW[*>ȣ|NmYYII W]G#Gc- t3u\wmIӿL}_g\7^-3ؚf]56{4N^x[܂b,6o璒GU=y'TΝ;㹢G<<9t[n7ߢ~c|L_1}7a#9|׭4LhiP,Ԟ`{ rZWuG׏V|9|`|RN]jt_>=NÙG :WWW|||X6mT :g=3f~hǟKvCͷy^?kL{^zr;UI""""bTS)W:Ņ"( ;`+-=23ЦOaa![m?i!ȄK3p8|<tОB9sZ>/#{ }{R(,(drmٲ 6q|2ci.iݺ5o6k׮;iK/\ӇQ5m7嗟cO)ni `-yi߾=ddߟFN wq;w}$ˇ~֭xq xmڴd4g?͚sUoeW_W"""""(Xc=-+r~^5Zk[f***mPuqq9$!!ޞJAA!]t\+.;NYOw}'&>͗pswWF.Bk}{wMξv~(zrs:_F233SVC6tFu9_Gqmc9 %U`0oo.J::ѳUĮ_ScZxD?m۶>y ~F ~eǎn7;'jVXE~~>lٲ`{,pԑ``M--Y,fsªV\^zҋ/E,_o[U~ۄw0~Gz"?K.鎇j`NYOF o?*ӱuz-cXx6c;wba@$_/\qo8Yhis/T==ݿk@)sdZ̤IUg&Mﯽּ|}𤼼pc{woViN>}ҵkc箪ubb2u۬Z3_/\Tgc\jƍ{j ګS%;;vWٲe)1|X[ '+x5ذv6aCo/>g> ?? ~>}ocȐbXzgTmTԡCV+YSqssg⩧d6 lOS~AyԳNT=SkPIZ~j.,*`mjKǠ9r0%%5rsso>51ݷX|%>|{zQw٧3{1r\\\OOwC;˚()-!''zϜ9_^׶ngV[oaM6v:c0DDoS^o+6BV+Rzgwc-5\}&~5jɱ{jz8r{Ro~Ҵc-OmZ:[cO5[o_\R]{l(VÇ2 ـOYr!233iժr6)n3ãNOfQRRBQaIh4r!|<-_Qc11bwnpSSHMM돶v"֮VO=رx[8lOpгUlP{,s =Rv7|{uo^o+rrrG%# E'sܒMtUx!>[~<<<hS>\΢Fkk<<<$%%t:y$j)v???G>0א@hP ݵk77x#`p:X,|Yw'ϥ7ѳUjݻ2QFdeaۆp8ÙmC-tW,36~TTT^ĽGCB.2<==Qev;>zo6a2С/ϛ#G0)**"~AAwR=)؊p1bJJ)8,[vy5®՛k{RS۔Wyq 2 rrr1رeee$'^N'3i& Yͷt &!!~Dnn.#;p`yG=IL\~WcٲUVsM7rO'?ѣZޝᠼZ,gc=5. HLӠ`{ay ya~I,f3))N/7hG6Uwi\n ={B@@Fʪ|<'ΘL&fÃV-~\vȹyɷ /+""""rwtnGE6LtҍړSy X,nj勇GevA7`@ .:ՋQwEIi)64h(ЊvNzxxV+6?:d0~~~#>ˈ4sYDίYDDDD| CCV0 5La 6daU5&҂i`6Q՗bl㔈 1LaS[OOOݟ'^[WWW=T["\]%YDDDDDÓV|US"Vxx*04`d2a4qss׀Q" <=X,t:q8rDDDD[֪?//uK%3p JDDDDDDZ4[Q9_42ԟ@YYv2rg9TTh ŀ``4j2a6[cFф࢓H8'Ίr\*BVZ)w:U""""rZ88PfS\\h77xxzRQ^Q SV2 Ff3̮`+͓ p@DDDD!~'p믦>EDDzIϞ=x}AIiIw:WR[[+m\\*DGG+wrjmB99x{QKlxݷ  9='vРsLܕ;_|ΠAyg4h`UQQAqQkb3O|x!yU =o UE\v06>/q,xitϘ{"̻^o6l!~Wf ى+ &:!"""MhĈa >Q().wA{l}D-YI1ysD-YʻLu{=ⅼj?L\%to}dget cêV01-7VI<;v]snV+xdt@nq W`Z$6h݇~P{I{IBCC4ssR$eZFyS:Yt ߟ֭[QWય_rl*//r4^=k $$${:=w̙[9ۻw/iTt63'۱cjBmaayIG'[[\5?)9zm۶5ݱxݡCoAzF?߿_.ݱwWLvpI$PDDDNkIMM%55k owqqqZnذu4jiۨk7_l9$;&&Ι3[Tmn\YR|Zyg+lEzFF ϼ02`=޴ 0{H- x=}{/; .eXk8V~6ՋٕQSr?Na` 5;XhwӾccůgы}.KsXv&2 4BseK5;bi{3j-zty3uU, d&3\9h4?<gwɇngx扇;<֚~tc ~m.oޘɂ_4h`')83xg2sޙDl>XG0^;'ɥyv"O9:ʋعb ?L2]eNF&$dW`F`W2ٜx} d%< ֓>Bzȑ Z?ěkL, Gll]\xȶ}@Xa4%"",'#脰Ȗ-[=ѣG՘ʴis$+(/?=V>O}3:vg8ӧդgdƘM_1?׍ѪU+Ԙ'3ٺm7p{>4k0v_xzx~YCddf1fz9sw߫bᙧdΜ/YKl9-ߌY3((( 11ڃl\!!!g>GˣmbZgu]vy777ML̚FSsvnբjMJJ+?>2\"/?k5 ڵO𼼼xMۨl0(w:i6XKi;dcX) $<sSm5y|'> "sΛ<,ͧd&2H,eiTBBxeʫ?a'<DV5^ٲZ#\@Uyg}z9jue:ٌ4s̭j=ۚtB\e ;]u2BmS_ UG1>#\wm۠] IDATq'`lukKJ"ّzW%O7;6t%$J s)׫,A펰3~?w]^)e_z6oH,HZNHF΀XdW:ᙕDB G2.%:Cvt~բw^6@v&ucr~_7 锔EqI CCJqI YYYӇ)QN?s,.&3c fΘE\\qqq,bƬ5-_,1K@W|~͜Lp^i"?&}O=N_7+F>#&OH~~۶m"ߏ Fs~lv//Fm{|+,-ܞP{츧 =,=,W\у|[-+`4xP9ybq7WgϞ:ڳg$ޯ/Le,Ḷsc 4>f,xc_{קd^zg_0"-?d`Lb˙C&8(2=g-`'3-9ML g%Te69S}<~^ҒD 2wb&]vtoXVIx!2:޿cpTOZ ˮ5?X lk \^(+&;7VŦ""""͛;AAAQRR’%H|MW-So.s9 j+2{o HH]1gަ2ܼ<z<8 3a< Z~w :n,>ܹVv1ݷ(,,d޼XztnQ.rKY=Ii{yyո綩F?nc%P[ݵF XEA'Ņ&ߔ,rn/c?&gKqo̍%[!"""u*1lW_-zOkg={^ozodr׷^Y9r$΄ 3~KD1Zn0޽+ڴ)W_y$$a >jݙ3f2cƬs<==+/2~Yl6К&ު睛nlǞff{p׳|[\= Pٝc_r#6]),,$99m۶͢Mz]QQy32н7 """rJ|l޲#YYLcz mó~]j+**(*)ߟ V>frG զw07f]ތ@FFތs%%%iAl?E1rb+FsmU9zƎ_>S!"""N}[kg-wb\V+QK;0l u=M4#o?lnVmEEEӌ|.b`{p84I_xӅV0Ӊܼ|l6V3?jD&هږ o+v FC(֠xa0MXު9뼭 FRQPP0szԂfΘPġֿukKJ[LZl/0v<܊HӇ}0͍ڎ͍2rr*NJZDOddW&$$NttL M׷fWWJJJ1L-'t:ԓEEDDDi&>ޘMN'.<=nٌ?%TԞQ0MQZZJQq|FyF<< C"ֵqs;t=X 6$jZg9k]^VƢ<4N ...d?Oj4b(`^ 1')nU'G$uB5[Y@NQfxQze4lJԤ+\'S_.㊶&8/#RemCIz @ZΨSUVt+XwKty:;?gLt<6J6ḑEy+p.ު[EI9`wZ*}/E+Dɂ,:/vG[n^att dOYf@6 EDϝ̍GCD/wiX=naM_æGCmùߘ+ #½㢠Zu w! [Lx{C͐]ϊu9 ۨj6P&9A אF{ >@q&s@q6{vnhm$;Lҋo!ćvPMFŭzPnGuz?L[͎bIw 8ٗx~\sjOp܎D( r`f\x}CV!ӷ'd4yTfvp;+%vnH;f^3a}1S[]֮59]{I8xyҾCGB. #曈 ku~8~>N⮽0]ӉboBYN2άmOlt':)N Ed@"GJmXCp=I9Rd#pg`vLV 6E#'Ntn ze_q6i7lPnx;Lg{}Cy:)ى.9axcA|-ڱ"%)X wLzORoCڱI!eW<+Σ C:WD5ѿ@~?]}8lgv[®jCdrδ PfV gd9#,VG~c8N؍tT* HIr]o%:9U˶yw۴{εO@?zu؟7]u kaO' bfwhO(`ϡ4ݹO?VvDv`k.񲀳Ml99i)@ K㭔v%tvQXR*^#Q?""""`{^_/ݷp/9er[Z)Idv,,bwԍyqDzzzп/Qˎ l\Cla8^gƽj9HgYk6r׈AL:Ifd2˱^q})v7M܏_ck45̮u.34%ej=Jl2 bluX=e-_-XzewY""""`{>C-aK`)I#nwDX4k{рx\ʂi'ZEaD)3edn q/g5e{TۇɓeǼ' ԗoї5KuݏȚ UǷ_ϊEDy<+4Eoצ5Dê4 nng _Yi>OOLQ=r^fhc^{4+Kt` KGe]l͡2û=^Ҹ10xMGO# at'tn׃;G Gʑkl0_u=1L,yv{Y,zs?z^ @ 暠Q¾LON0 #Cֿ# Чڲ2\zR ekC_hߔǗˊ}Vi\Kw5cOW8)g1߉} ӹIԧWuod|Q1okz gָ|jՍ_VK(6*&&uazls뱞I 3PoVO.媻x媳W?Y1k}㄁j\ϊ"nXwd{I.2{YZc taW5H̾y;8CJj:)zܼsvx[tQ{:uE?G0ٝC{#w3 `schՍ[@Q""""`T b>ޘɰ7> ߗ\?'Odf⪥8ޝ0"=Biuk'>nݑl975h₟ΟXLc[!ƳW}iK. ޔ JDDDDۦSDJl Q?o .! g_"Gcfܪ:o`QUd;'~o?^:M7~rwd{g0Y'x&""""" g,3_{dsyw!&Z3qb#YY/ fc 'sǥM׭a Z, aH߳S~=A!7|]Cʮxc~`o4oK7ys$Ĭ!UL`u!FRwaQm~>dB\(DT*7"T)+,h[˖bTVK_-+ł-H ^]Ak`4"!dL?&@Р($<33g9;sIĈw!XNJW?9 wKStzjaq`%FN! $I$MJ9SOyO0k77Ncşk(gc3XAgerk7gFr1֯ZU33l8.Y}no}bx:~pG^U|zsy/Pi TDv㷸$I :-w?z9\{/J}x:^9_=zsLЉ|r^5Κ띈n~/2e~bw I$YJ;ѿ`A/KXV ň´=3/#{:+9ŬS9{aNiC}wJa: dec{[pg=UQpfvs-K833o1{v6O<[(C8BtG ;@|-KWU|*IKzq"yӫ+YytwwdI$IL`lؐ:Uƒ .I$IR9]t,I$I:$I$V$I$V$I$V$IdJ$IdJ$IdJ$IdJ$I [I$I [I$I [I$I [I$Ia{׏M|qKQ>.I$I5W|w7 65or&:%I$I'G~X;m3>]S`+ӺeG۸|yg$)ܶ}_|s:P׷Tؚ.kC`%?xcZ aS5[w'Җ_Ϣ5 ~{ݵ@L~0=#y[[0"Y͚hޞm,])K/V?bzjxy;mMBZ֚r~8ɆwqUlK-y`{uܰ%7$xmOL7FS\$I>O($oV{F&-xh.ZyR׵u]{=^W$IFⵚ ʒTh}0CtȀuEQ`6ZvU'iOΛ璵T;z]z{M5/q'PЪ@ k:vyOVsw|3ןan;|uu}$Eg ѵ[{fwo˹e [Sq`D2%I$X4I^/s^nf* ۶},,IEݼWt;QSuK6ۺ1Fa\-(ݰv9?x3?yW<-S8$G5I k%C j(\f\75k$I萛yc,8 $y}\F(I$IǢqGlx<F%?5 迺<7f{V-hA9Wq?[kҸۘ&@%w\:[ٵ #_Cҫ /`-x2ZN+plɴB כ8 W+9psNq/R

J$I2lOv1vGU:,I$ɣ>S{ጦ;($IfgϞlڴ wӦMٓZfp6~c W t:78AsCuG2X?mlW 2t֛ˆK9k~6[_8e ~H@;Ss/fgE<qGhwf>-vm]8k.c@7wIv-cΡ0s|g|D!ӯ۶[f oy/I$Xh={=\pQﭷ/笳n3lrԮyNnXj 1sm143%[Ye/\Ɋo7 Vt*w/-?3b+u(ȣ\EGw$ItڴiÊ+˸ˏ*nG+hӦadl=U܍k'J>ޏR;t?7xu%UA|V^CǬϟsF l0L슱.Β$Iqk6ǰw9O?aJ>}[H/<;<]•Z:qT<ЫG8W$IxFm DT32>yT<~wMTsѽtӂ;?];63JS#C߹J%I$fj+a/f9R pw'U\c:G}xnY\9ͧ7k;H$I2n0jeSQJ5펼- {Z`GHT8tW# ]z1>(TP 7\~ݦ%I$}뭷\l6sʡ{Ceeg 4ӺCY]?X̻Й?KޝÃe,x+kO ^/8,t J,Ʊ$ID3 t\2]9u;F,jz*yfo~s*hwa*70]wSxuoer0r~hjxl[gv[y*R7򻵽xf6AO#8w3`xbmXj_@FV+Wћ]"n$INX4|_}u˘}4n }?o:vWOyv@є'F)GswzeyNqc2XQ՝&pY'+2[}uc>4%<3u f/wqYbk>x Oz+I$Im8هYQ7 ;p|TWo4~ytl&"u&sr?S3Y_l^~2/V7/=h4<|v͸ iϣѺȞ;qY(p0it"cOQNLs4uW8B3,rI$I'k'jٰ=6lpH$Iy]rv6b+I$I [I$Ia+I$Ia+I$Ia+I$I2l%I$I2l%I$I2l%I$I2l%I$I$I$I$I$I$I$I$I$ɰ$I$ɰ$I$إ5 ] $IԌ]Om I$IjY$IԬ5mmmm%I$IM_ hIBZے$I@`0xvmmmmxM&$Iޗ$I$5]``0HZZiii7V6m"mUI~5LA9lH$IRSvVd;i$==mchVdzq{ܬ[$I$5a5 WL N]ۭ!/!I$I@nVR 0ʍhvq.U$I$CW9x2a9K$IR3`s$[I$I:cյ<^v$8jڄႶAv p]$I_V>80 $I$7v$];͌L$Ia[Ol+qI$I2l%I$I2l%I$I$I$I$I$IN6O0quL|e!I$騤QzA]B\Z-djSU%x$kR/Wa 4>fg_4܋ICܶ$I$pQ:c `* 0ҫ~P? سݵO6AY5 6`32hKuelO$X~b/MKX c` wL"db~^(wG^q k#L8ҁGrd+Q$Ia{l6]Y^Ҫ6#]֖tm +o'P Pt^{m7iŁnTL'x<gͳ/R-C-ԋɿY&YA񳳸gBܷ?4\Y_0ӳuc1M(gJ$I1 .DI^{R\! ևh04Qw#AjQOYE~L xͥ=1ۡ_TGLq ¡6~\G.ϲd_t#;PQ?,h. /0+Yi J'01ᑗ6 76O UW)f? 5@%y1l?[s;mGf}$I2l]_6lHg},@]7Z]_oK0Cw;7W=|R{>a؛/J'8 _(љ1 +(Z2vcT6P3^&ݟQ(_ɳ!WSFxjf:ft̝CAq̚>h| /;XʣMxL|1vPOg{= b>=#P=ȣ9bԓjI$IRl/2mWlda2f-!Y  ۆ g8yeŬg36ZŤ'ꎱc(p(;E/_=zO"xR^ ay*:tLkV#J<ƶi|l]=ĉ!z#YUƈ%c%ZoY2};G%I$+ e׮}Oe`VGA{z[3=)UfK[8p7FԋF!*B$gf$߾Ngjc $8ԝ֪cjGwqxvοc&*ݱC/JĨAuH"+Hp0nw&*$I,bsk["!~xiy%<7(Ҡ?vcN:S\}U0pDfkd!@VϾؾeU /~EP2!Sj(5Uquk l*9 p%ź_ ,`{]̪]ӿG}QEu}%oB = V韠$ITce[xn+FfrN $QߗXմ%To)*DVR-[NXUX*"4~/L9ugyW)0H'h&!t%߼j^!Hƌ33'L; їF3I<MLv8AS&]*&}+ 5-/Ea Lݘ?v&y,3\u$I] 5×5 kSDdZB[̈<[rrj%r:bEIZTA5.ⅻp ~/ $IRs4|Y/K˖-IOO'w .gwrH#نyYl-vE3OXEkdDV$Iҗgتq10%!I$y(I$Ia+I$Ia+I$I҉mv\g$I zzu0qI$Ij Mvm9!BAxkG㮨M.hdl C$Ia{@4#mo$I$鳹$I$ɰ2`"PZY뚐$If"  'oȆ׶&"$I$ymkKOҰ=iii|CI$ȭ$I$5wII'--QBLj~5klH$IRSvV.͆i$ 5mm  ;ѹqn8#I2nɒ$IԔ{6hmm ?@jkkuwdI$Ij;p'M֏ 1^$I庮'M6 I$Ij.I$Ia+I$Ia+I$Ia+I$I2l%I$I2l%I$I2l%I$I2l%I$I'oK$I@ &llmm-$T4- IDATɃ%I$IM;h`FF L&I&߿/I$Ij `4omD"AMM ۪nkrs#$I Ȇw>3Izza*0O q{ YI$IjJ+kymkLͯ&;  |"[SQ{C^ȭC$Iܬ7da'--Fmr?ve9\I$IRssq sdvs w?$If(7+I$I$iMu*kyoHqՔ m"$I&;b;w}qXa. I$IoHvי$I$ö~WNs:$IdJ$IdJ$I [I$I [8[ 7#QPu/ʕ;:;fi_Ecd۶$I [@`/;,`޼ʖuNe^* w׭ rCXBŗ]X:)[Bf]ZCc0Ƕ/I=6n;R_$II)Ep ӂtm #P˞Z(%Y_zY sni$$9G!k0c<2^LOͧ*yd–U _'<0Q4ͯYEAױ /R_Sn ;ٹ݈|E(%=!#|0%t&eհ!Ƞ- ֕U=dcu<7-abd_3̤n_bn"S)05>7d"n2n  %7ҭ_*l{3돠„#1p$pSrMEC~ɝW|b•˸`]WeQA$IqwN7 J V$貶؟kKX_oȲJ&8|BtB-ye0sDjxYP "2 x5ϾHI N/yVn_op/&?u3'1SYTVoj3ZPSX0p|}sBrb6v͠G3G%eHFSM}1^J8$SI~gWYܧ_fMI91"D=*6P_3Ɉ T3&+2/b̨lV=}{GPg^?z9cfņ 8 E{_ضCRY_0ӳuce1oU$Ia.DI^{R\! ևh04Qw#AjQOYE~L xSvϏ@l ť&; V@l;ImCUtSfAaNle澳`yu/,]IS4a"Ni^X3Kði%0]{ѣu e%PK9RnT&>tC9 , ­r#/cL4 r>wʓUA]yʷ ϻŒQy秨 J_љ} K#y>RFڍD)o$`u̻w/Pp5s QV~-!BsBs/oM(@dK%"y ?3GSx=[L,3J>/zy *%LG-Z#s_8Pz\?[#(a]q%BJʩͤKŵ} rľD\$J5g[ekޝF4;*rs>8qs3y'9)^EΌ7Yx6{?3c"J1Ðq {eQEޠ}wN#s[xqJFSscN}&?+ck)p+CeZJ@P]q*opv /.XM,{04ʙ(<kFlΙ#SgEY4tEvP&>E g0h􃣴)1 kEU8YSRSʃL+?gz׽:zw1d-Sn]@I`ٝ' RQpw̘NjW0YZІSf2X5s2 pjٗRi/ fH{d$y1=:=W-za jt]ghʗ/3䅩\8"d k壙3/T,/Ox(/cYB V0cHq??iɪX~M ?$ɰKСچtڡWUN1;jOUQʉ\tt ?gZ-/x;V=3x(MtZJ gEDH' Tj2c٬tܶ{ѻOoz58"V׼P&P?9XVQ((#-D1Eo~"oZ;UeEy 6++B8+ ͊Edc@-/:`%QAWJ^D|qoEc>#~1(c&͆D kVmǘe>7ȕ޺ʫcύLvnnD-g'᝵tͤ:y%_拞붰 $x]ɿWj%U: ~,jCnd/;w$I2l@m@4Z_q8;ed-p(l:6E(]%&|bUPAe F;k)b u>c4ǖ3s慒ռ0N{ؗ)?PIW50NSm3d}"r_flZ6T&|p'߯0ڛ&z`$](|z7!%/*gŬ)2n_1/Mf3u?TTPQo3vCTX_E|E>o$wNIvǞA̝%3&Ju~7=~ќc^0fFn&L75ב! 85rEZE ckN$I:iYX_ \ږH^fJb?΋@(F)zeJ+3YMqbkgםj K_ZKeU~>9Z Aױ sپ3{_ǼSy!d`ҔG#Zo>m]FvfpqL ½ucw^x-/߷!; ?&Ƞ3/ץ˘}ijs؁V-ϯwN%,z3NsknW8D'!K PH|\W1|*SNؐ]]gGx{9/iC8Ð).BG_ 2n WSQtJQ*/~.殉q*v._>)E=y :¢̛z+E[?{‰ԲKD 'УK7m0yc09t¯S?XE2aQ9ga„,1dXlܩ Ȟ9oX;YQr/Pvٗ΄ x$Ia/Q[b*Yj j LoA0=+?W4 t\'OimN%81_l:bK{zP (ݍce,z}7R e1 JRg Gy>G:fPJ;[%D8~`༮Zpw&8c>(%(.r,]?pΨI#2SR\8}.:i3:0XlCy؏+J(.>|$:} S×k]sкl81SYɬ9?㚮\sLIʯ1O}']SpM|=Nލ1kLnK%̛x;K# WLE"I4|Y/K˖-IOO'x.gwrV$ԍ'ƌþtPfǻۗh;*tw(hlUXl!kYZ :p$I:)R7|c< EY:ePcӟsx3cdTqX PDHvg r~$I [IuwFx&F/Գ> ruy fn/$I2l%N Idc1י$I$ö^mfu&I$141I>?MZ0\6.!$I$hFsVI$IgsQI$Iae gE5!I$ILie-gE  Nް mMEH$IR3$fa{ jz8E;wI‘[I$IjJ+kE;\!NZZZm) hGvk&s#$I\ ?ʏ>3H(jF@ @vp?spFdݒ%I$) mF @ @mm/`R[Ȓ$IԔ-wOBcֽ$I$u]COmJ A$I|]$I$V$I$V$I$V$IdJ$IdJ$IdJ$IdJ$I [I$I [I$I [I$I [I$Ia+I$Ia+I$Ia+I$I2l%I$I2l%I$I2l%I$I2l%I$I$I$I$I$I$I$I$I$ɰ$I$ɰ$I$ɰ$I$ɰ$I$$I$$I$$I$V$I$V$I$V$I$V$IdJ$IdJ$IdJ$IdJ$I [I$I [I$I [I$IHk 3ᣏ}NVsH$IR2ڞiu nkj7O'[ZffH$IRwo?_5z6z~Vr;ΙguH$IR323`}FF?vkw[$I$53ڝ;}>=lVscI$IjZff6$yVdI$IRfJ$I [I$I [I$I [I$Ia+I$Ia+I$Ia+I$Ia+I$I:5YyB`{AzִW\::>OA&>Qg^}\KGI$I2lZ5l^8otZم]G;+y=vMo$I$ö JT~[1m7vo*ce\wNL[I$I2l^b{i:rgqmq)mhߺ^7ޣZFϢqe~zpMuְ3w?EMz{ux%gL=zD}.溚0oٻմˀ1yocNoO!7s: <:k5-ivqYm.|]*Rޚ]qcK$I'ロ{ ҩS/M61b w}B.u9t>q1e -cW nx&xi}- }|6z̘5[S3?&GݺZ(=ۻ(_ o3KNՑ(k.ojnTvYb=zR{ݢ=bn) [XIL&--?ҡlfc4c1DE _!}o}_VPsB%whJ>y&}gFߝ~?s߮00{a M/t=9*Q{*Fs_on"{z ]ϝtK$Icݵ^1c۷o?m߾3fpA1{|N{lc_r9@j Cצ{!bS\0oG ¿?}Pǧ|sP7|Q2o{Q5^vwI0+La}pf^2l}_16<]sr ŭP_e/sm*zg-lݗ9&;9s.ZCz;]:a|&t&*!$IƺH$#<…^E]ď~#O."#D w༅ܰb&O=EOzI Q6O gP_w}[ïuxsb?.~ 6H@M\ޟfaʑ $4u&Uc/!'_ / ;!D7aBeәCxu4m9S"Oٽ$8=t (▟~;mv=]l{̐?k }[ Onf!bs^@$IdܞQ{҅mao_ǹx^M)XS.S^'WI z-tKUTYF>83g2sf  to1!j3UTUR1 `(Mצ ܷ)1jf]%_3r{dK$Ihq."o~F-d#\nIn"]ߍ=#_Yb ~#T3.6<=_ީ!v'Ȏ.OC%ۺK1.^0Go"ꈍL;OmU N&]ewrJgsg{j3HR7%z;sPjI$C#)']R }zIΒA ` ̻ӣ oHmLT[Mſc[؄/<_wl L.?~S«/'v3/vP z-Wƺ!IDAT@sIw/຿P}=$I$U [I$Ia+I$Ia+I$Ia+I$I2l%I$I2l%I$I2l%I$I2l%I$I$I$I$I$I$I$I$I$ɰ$I$]ba'晐$I$aY I$I: *,I$I:$I$V$I$V$I$V$IdJ$IdJ$IdJ$IdJ$I [I$I [I$I [I$I [I$Ia+I$Ia+I$Ia+I$I2l%I$I2l%I$I2l%I$I:^{fddij,I$VVVFyy9Ǐ#B$I~ a{ʕ$ISd8p+V$INVr(I$Ia+I$Ia+I$Ia+I$I2l%I$I2l%I$I2l%I$I2l%I$I$I$I$I$I$I$I$I$ɰ$I$ɰ$I$ɰ$I$$I$$I$$I$c0ÚkWОϭunŨfXel|◯`YzU'7z*.i7&-mB"f%|bnNVc ,$ǧhyٲ8_]΢ozѕ,# fV,_Dleٴ' Ѳ<1kVv8e+P[v=y5|"O7񍥬z3$hv 2?$Ia{*!:)Z as9`B奰PQ I2y @ JߎFFEUP%rzu_ʑK'rGs:fՅx"O_2%t2IY$b'*~=#oq۳+i~HX[|FW+Z$I2lO9ӖMBN^Orť/:XIB$>3F=hW|dx$KǷofuG7sͮ'DIi8܃Nh\+oavm#5UBf~ڕ$I [ʢ4\4M-~p[vҲ ,Ng2.y~-w==Ȝ[YR[<i/A(zEyLNaΌ0ԑ$=S<6;y5na?Mr7}xO/<+YRC1|hcX|lxj.I;,nd Q/h~0Mꭴ)>*(=yUwo{w{ F$Ic#)yRn,[8ՕP5v$ld Ā/ħ'qj)ëY9ͼz ~M)ھv3ֽ®mt Wzţ DY\sVF<ì)bw5sٌ0j%I49b;F6*M=ى_SgXL:i:K,Ԇ򻶓}l7.ma%DIV_Ϯdم7~=qYijz2+!y5|"O?o-IѼ|:w4Jޑx3+/"fo<"̼e֫K$Ia6P?`G|6zԏ.۝ A5 #'x-B7GҴ--r %VF^0xeI$I2l߾$Ɂ;~ڑuoĺZE;I:aiʹN{ܤyXLuא$I$U QdwdwL+MILfDL_OL+W˜-aѦ"gncW tVˮ<~zjc(X&+o]+7g}f5[r ƒME&YerBDϩqa3K^ϲl$j=w,PKkGg0XUX%ϯ宧z+^\A=3fٴNn^Kc1yu$W7x믿{wH$gE$Izx1 PKdI#oI%ԒNܲM*jհ;ɦ+iKvgS 4%3sl~-aVbHI=;"Sh*M6TK%LN?D24L0fV?_|PPNcszxB.M]ؘ>ZNP*܏۸DAP~[X>ʼnV@U7NR(4P?yt&V}Vvu{yX`~T$Iw#ǚus$$=cNz&HT0%A>DfH>fqUv2`e\"beпuwF=@Q KX<; -[wD3#&8*c;Wmp(i[w7g.L#YrnZ>.[Ζz~r޻UQfn\@@Wr'2|i[dixpr Th#6~F֧Ckaџf׿N.cݺu,X|Б[I$ɰ}cNM@4Ϣt)NCNP0T?`8D$R 1n(KbFkꉕOLP}O=!9Ñ2(08L8M7̙y(ʩNݜ!;E_?fǩ>;`ʿuG f_kE0Gٷhq$Jwi&>D$fXJKPKuV[I$ɰ}zg:I?r:SPOP8 i_Ƨ 'RQk*Vr#k?LQ/q5 1*$Zi1qPeVc{~A(C9gp#a$Ia{jm,Ct$w A0cNq2зak|xe@j vOT2?8jAGE- QuR?4Wd}B@'? •@-<@B](WDxWa>xI$mQW̙>lN'vv])I86:cfR}Q}CQbxc7IlWE^HPv.mvj5B?a ^ҪTO }l~ha~$ pV-ՕS)M3NoP#:)\!5\úu8h$I6rʖٵ$ PϜCc!gaglGkj{;T vwo ߼s>^d{sY(2X,Q@-K/iX#EnٺSص401AjV$I:8b{i[7͝AdS9Mʧx$.4M A'{3ˤWF&BnW_EYԞPP&_̧j L:V.L H T& GzG_mʉ>7=NA"Y|,v/<Q]{- e| i P/$I;촦/Vwm݁;Yok xffٲe[Ψ$IIͽhdԬ:\"K:z!$Ir*$I$ɰ$I$ɰ$I$ɰ$I$$I$$I$$I$$I$V$I$V$I$V$I$V$IdJ$IdJ$IdJ$I [I$I [I$I [I$I [I$Ia{ҿq$I$*4&UyyW$I$"4~, 8fddīW$I)rƏ 86`cI$IfTI$Ia+I$Ia+I$Ia+I$I2l%I$I2l%I$I2l%I$I2l%I$I$I$I$I$I$I$I$I$ɰ$I$ɰ$I$ɰ$I$$I$', LH$II&?L0l'w"{$I޽މggv/:r+I$I'<<͙g;?(f}_g)J$I$], LzDf} 0l9gs~W$I$鸸*$I$ɰ$I$ɰ$I$ɰ$I$$I$$I$$I$$I$V$I$V$I$V$I$V$IdJ$IdJ$IdJ$I [I$I [I$I [I$I [I$Ia+I$Ia+I$Ia+I$Ia+I$I2l%I$I2l%I$I2l%I$I2l%I$I$I$I$I$Im @H$INҰ=$Ix_joL@GE$It8 `?<ʣ!I$I:iDe?>m@w*FQ$I$4QJ4b{ȼy\FJ$Ie˖='V(y~,IENDB`fastapi-0.110.3/docs/en/docs/img/deployment/deta/image02.png000066400000000000000000001362511461403617600234100ustar00rootroot00000000000000PNG  IHDRisBITOtEXtSoftwareShutterc IDATxwTlaU@ ({5bc4&b1=1M;{ MQPTP H˶gy>s;{gX޹ "iFh4Zjy 'ð,r+He2T*m‰8$IXyުNiC @>@>@>@>@>@>@>@>@>@>x$OUsQyld1)LF0 Dzؑ!1<=%YS[Tj""b$KywS7E'ix61+Y07qJ9C<3U;[&%N0 x Z j|-KLF%N /1XZ\`)YiVq^O0a8 i5|\~v/ү(guJ*e /kߣdu&OMRxxl ğ cx:qpbTN%{fdƄur#%"Pi?ljF=qKḜ%H q[_$rv{PN<4)h?f#s%8ǝy%UT'.3d@5,~:8')Ly$V}ަ̬]]\\\.^\o>,KT +I(7ܥt٤gT΂BA2bG Ɇ뚇[DDFcssGM#"pqޭMvtylJxUWg2J1W$7'c,dL3ekX_ٔr\{[9yOiD1~>>Æ ,Ȩ_ˏ}WwM[|u0xpE,_ȡ6(4cАmr 6o70grsӃٵO۽tʍsߘfaf|>5?B}K\;G UhiI"1eD&шU3ũCȼ؄xnvq9!bDpztSpkg7oFFƸW-_>yxR O[X߶20kb;u {t'bbLl|qi\&k8w3S' ,.2{[Z|I3 fM;>`D@ѷ  &VțͰy3) !9K0[8G|۫nil|#: ?}>3DxD>l #mlx~ʲ2_+Voq8$$7#LDĪ~`Aii)>j%%Dԥs+Do˃_TTpdVNQ>=t̽uDdn^2Ύմ J塰)iZ~`@fcT'"`sqIM(/pXdDm`@\\LH:r"r[3Âz{z>wh"וD4_N|}l[U߹U$wqf?UcN223k22 ß̟pU{GDܭD~!!CBknnoBNHLćoy!.ء5OUVV6n]; پla;w'Ǝh b8|c;"dmRRR\FMjuQLΝ>Y#rVd}8P\c95/(NͨPԯgpLD q c7&z22&5vbц U5u^eJ9eCz}lY_|U|q:6&ށo_[{CnIt_{rٴG ~:Ll˶=y}[3'e{B6mw(h3551޸mo(+x{֔wfMjuljXYSa^cc_zyujʄQD>7c- ]1s_~J#23=t捎lnn.l8<]xfqȋϖ3IjƑMe"yyzdee>+>knL},--ƍqбc7,66,˚Bcsޘ כB!ʘvkEg5ִ jucMkw?6ΆyW+c#C"tqrHrk$©zuoMD#8[Td#9a>57kVXTBD#T~FZ fUՆ "*)+WԮ.$=bmm6#QW5>*<*(tv1jBG ?4ZJWko/1(7b##C}c9˲m t<2 rD_X`|+Ks##Â'+O0z]y o=QMބ,)UDd(ƂDl8 gxp!̝B \k6{6#y>pJXaȠ_9zK~jSQYtgbbݲFUU]Fd"B8GZ)I%c`+rj?z[;u+p1f&e;ާuȋ鞐#Ύ͛6Vk6Z9==]]Sӯ\K ֩ M6̑@sfYl8=~7j4Z?;+@>mhfbDV֨8Io';ip{h'^vP8#ፇn*P=&Kph#N;TQC+*eE׮|o*u㗺wʍ":{*P>ޭe24F'֬l %"GGsqiiOcDF8Gc;3qQ1q9yi;jLNY7|v*l v _xDTN-ɲ߇-()+?~:,ۣK'S #N&^Mځa7soe8ch "TzTxZ]YUf` W\WT:9طpvᬛ vh|$N7~yoxo^kS\*Cogfwe gE%\M8[KZs3SangUU+#b?#hY r5Xq AzQi'"w2Y؝Ċ[Gڜ9Wՙ%0 @- zWM,%uo oJ\@.[_Pࣹ?/ia-,F 4uF /-=s92\g8g7_~߽̟W A}ټ+"ϝYoc y ϱ cf_r5%KnY=v*ZYScfm|ud1ٸ=.>ۇ;5v\&3|`zv$#', ؜ iFq!jno;uH=amazw술CawjNSƏd1qB*f\;`"Vm&HZS,PȠ'_JwW462|O# {G10AAAZBDWm+kTp-^0KSr"*a\mg %Ҙj4e$  ڦN1 F۽2m}+VEkL1+.Υeemۺ wUYu~:<|=6,* WSͣ5̀> V:k&/ڱl-}+rnZ+X"%&,'ޥ Ξ rFf1c4w͑pl"pb8&"xlqK =W-_.N17;i„{1_tIaC蛥_=EĎb˱~Cj˰DTģ֔[ '4a1^:; A*JyRb#} g]mJ~Duj̻\tn#=bQb aπSZ|}|9@_sii~̲l@{lпɇODzJ} 嬭,:iӊyc-W<CYE;駞67sx X??  14O/o~ډgLyS01c,H֛N˱v+1܍i9PvD&"#*JXMV-(Cuep{-:V$Ćc|\Zo%b.37UHp0|,qK!F B@>~lA9 g@>@>@>@>@>@>@>@>@>@>@>_}'jk 'Ǟ&XqW܁| | | | | | | | | | | | | | | | /8sbzʪ*em,t𫛞u:.&$ Dfv* _*,*dn._njb<|\ kKWoܮXt9y9y*S;q]ILJ&"L*ɽU?4gN!GN;rRbRfvΜW'dcFQ&:J6|6'%:e)G:;QةӱΊXRWC,{sRĀu%aƍVYUq[1qu5oko݇CѷҾGu7pvrӱUʚ0֖EE9y:7-$"jFDF8z295#[Xq=y.%pD$Bl|ťe:P!nąC_ܾy{13^\T\BDWu_AvxxNDR^S^=:QةgbʢFιUfoΜtF+׮8s22W/toͥ^Fs\&<WPTyW"d"rk4uHqRKppS5pʉVnvllneoݪjeR)g=?xFU^Q v011[y+*Tj5UD{yy붮X%-#$NT*5xэ̄ɂ T+^z3;_#"Lֽs=y]:elqqIQݍm-=\S3omldjjTDAԼGQ1w wPxW{v <|DZS`׎VJ_ sm@X{d"'_*NaokֳS;m;Lb#CC. "'Ǟ#zWo܈9׽[7WW<; hsxAXf퐑c 1v|QQSq|ɒ+}7{a.wڃ cGn}k7l*(,Is;rp[׬۰}Gt+z%ԴYaͺ UUո6=م|yb~$JbÛF-ܪ~[unš5K7\4'+*wcM 1@@>daa>fԈ" Z8w͕:o"".FFF׮'s]Zz/?ݵwߏ?FDrfNMW^u̕IF'6^⎋~U̠lxyg 9{– -V[~PU]MD*#grގZ~kW/'$<~Os>"222*/=r4*ە$!A N^~;q/֭ "Oǜ]j;%K~ՕL֜ycGDnPE_y$skiia.ܪ` WuF4e煵GGt%93&@2GIF^}2^v1I47 켱KUz6?gJ,Cm'2鿨V#y&%d"Y+’:zf0D}EuзG*T{8NҠN/P[{X] 43gfI{qD4 eZ3#fDC6-gYjۂ}{޲~OHWmuP KkuZu>-51dV۾}HS;?9t,]wINN),*n5wj?m'g8n3^JD1b~oѰ3Osqv&ѡ5+SRhAzzz~~Af63^*•IffbEa'Nqס?Ȳlii٨o>:rPf Heү?ýe%+Voζp ;uY.:*=Ѻ}%D4%լ;7m ӌ%{DZ'/櫓]3#NZ#Tp98)2N 7[j#rR99Tjdömc:指CUW2FI Ĝ=mGrJJEEԷ++YYgΞ/=dPWV-9=#s  ܺ͜%빻闻vbA2}KwJh&U;dfeW^~~bm'Np,koojHQjxtnuAњ/w#:ZMfƙ܅pC5/r}9_WNӉ=͝N @WW_Gi2%p{s&Ð5_*Qj.oiB#-;^%g ::.eVwO]nF[äúqm;lK 7nF\""eVk +WOǼ2e&jZDcccq0 "*)--++Iۭ[ WiS#pYkk?zIVoD]s-su&9M3EkRxDj.x2Y.2έksgF>vs)x{]Z+GDKxu8XjܛSmƭ;ٳB^ ogQVc ^\XN&ޜ:Td~\OٳwbcK "Ryyf?m{N>sm 7YZZQIIiee%edd 6nn4 ;~=9eMEDݻ K |㕫I""?z HD1b?!BYYٜw7i?}cffqRl;)\*ϘVlv![tk ’}{5#f;Z+ħrAV⚸ږ+w5\95~~MME{u>vbS p/gS+)ZK p:X ,٧Iū4¦0Mz:y]9mYĐ]LZQ+GF҅<=xc%aFHӉM] Kk2 xvcsPG."Aw.ӝ:-ekh~٭qbyߞdBoQ_׸1-'ʖ0P)}sY{x%"K%54b掐~wM-ٯJQOawۿ%gn̨ԩΐ ^1ޅiuBrr ]Ï.<9x#~A/~`~UtuVsߚ/'|g9cמiiUU=u\>>/Ѳ^n^9L-1L28 '}>Fcrc VP9c23?͐h?ܟOO_zp wq(             ^#*H&d5<;3:s_sZ;P@]_?f**.&&]sƱ* KJjFt̅v>m!웹8335..G+sE* >z5JFq:F^w1qh=gdݣs{_"QNEzFyy\.wuqٽ]3k}ɹ b2sFF.NX4?Ry1*jS; k"c∨}wh >WRZ+O s4FjFsӎKJt<_T&&%ٸ=#+G>/`헯\266V^JLZZ)yuW>62T 8"_(ֵq&6;'a{~ubߞ݈t}iuٱ9:_X2ϙ>cX+KV?4LISu:>}»oLW5#lG=[zDDgܟ׭S Iٹٹ.\&"gG{1ń$"nݣK"bYFYbI;?LLJ&"?n/ߺ$/֦43Sc|ִ8'X\1"<f~{[DtDd:\+vBV-[اM;W"{[qZ޹=0NExͶ=%6"XZy@u3Wf^ZuX hofϾ ü'ק jiavZʖ]!4?p,GD7{zޯaFqgeiND7+ض`l|?efhqp "ӯȪ-D,4VDyΌI3$ inZb?zaDPWce;#"TwlMDF/x\k) ֫]t%bbYyerjFȑDdme!v9pTBa Tj&h8ѹF?s{?r;kCխJZFZFSNE+--=wNI͸UP?4LR* '4wtFJjƢWTTTx# 4{nc|p^M;s3qY7sMLvhok  "'Ǟ#z1t.Oaᛶ?y <2Y6 AB611пoָIdfj2呂 W^HXqK#vwm—hҞ|&&ݻv9V7 ;ޣ[Wc"8%\x| Xœ--Zps螐#sx@.#[Eg̑d0_\KIxѬW^nfmYV^z,<3;GZ[Z (E%kUcneifV^ ]ZdDV#>C٩3fg㈈U =|Ķ͸1ǎ)nVVVQUjOwޜM|*hǝ Lzuɯס?dcx$t-9կgJ=:=Ų{CMMM:?jp‹KfMojb|vxgTC_[Ncbdt-;2iݺ阳(L ֵBmݾEy{y&]ؾ}7e勾ho-ھٳ>v [x܌ fED*kc#C{N}/_v LMiڝeܼJ6730e];{kT,a,^hqѰ{e VznP(9ϗ\=w~ᗟpwyr|_A]tz?7WWccc\/*(L;Q@dcmyGNFK$[+N[KcރWmmڧMkk+gOJ%EFywn6|ȠF^e---j{p׶WjZ~DV[[`߶#^ lޱۯMɤū6n{k)rln7v@Y8"4 q{F7S(?}03+S?;-'G{fcW~P{YvCiYِA-90n>{*">I8Tx E©x^<3|\VVϿ4fTOh؉Cʻ_SSs3'?4|TYYycXx~|wK='-M0{.N8Xq_.O{rrrZs!bYyࠁӧN8JUkNGZ[Y :x ü9sqh֜/?зJ^ϓn]l333":ֻ̜>| /5qK ѡ#Ǿ\ݔ/y58#\}3ǽ[z"LLMK05|شB?NG9ܻÃ|}ֿ¢ys1mx}`k 7ggct4fje!>mߗܳqAee!5lݪ[fVVn^޻o͙86^ +laog;u{[ؿ =|eMk9Q0 Ӿ?H=ӹc"v=yKJZ:!g݈(6y P*BYYZzyiuZ.Apq8BRJ+eSaݻueڔIry蘳&< hȠcF?vt܅x{;;"j҂<=[pyeʤ;;9,}:6N6xFFFiS_1xq/* xǍ/>v57,r:nȱ;5bX%R 0zC]Ʋl gu7o ʲΚ1=9%_~rp[QZy9eFcgk[RZR+++}}ȵEOǜֻ^9)7hD0L^=I״ZmаQ5j !5-˅}+K+WJ֭f݆v~'*zSb1QyyyQQɔ/ѽk]NHV2k#}Uxyю{H=VYo/Ϫ*Vv:tv@7 him ŝ?r,L.dygӏ?y=%}Di"£eCtlŪ51gc۷ѭ{˖)7n;{soKB "")UHkJi_*5jobKE {ݬ;~n _8sO`oں=D3S'?LxM[^~"'7ԏNEKxz%$Ϙ6dmm_pguǏ5ovmǺ::?nXknj1#ȧ~#ߏ?xXMmͤ ̟L3jπ=XPXHD߭[cKٻѶtHHJVWI%{v𭝭mJjnS;;ww45N)*.dS?pNCnݾVRRڒ]G,QBt[Lǃ}W|N;,|0^{'Qr}w8yP 7.ZqN~uMmJF_7Bni{xT* 7ӳᘈD| 6))-=rѲ^Q׮=Hg @ A=yRҲc'N%rlG|UUUIwB.]ZRZ=g@ozoCe'O'%H***Dt#O4__a?t7,J45[XxYÑGDZ4G wf}}}TtQÙ;wOUSS[jEot%ֆ6Ξ Z;an4gsg\ѤY̰p S5249|ipÌdeݺׇbQaQѱSil];ۑ~MEX,>t1<"t}fǾyĤ䵫VTU Vг۸#| -r*51IƮfz61Gv`}uK'"ڹgO*?qX'QRrʁCGG0߾sϒ7ڵgT*DrL%ZZ3MoDt1>;x 1㈮.F3r`zzYq2c{'D*uuܿy8RS6VDtnXxDOgW w@'G"1 ~8 szFȭ?ܾ|"5> wj;9_PxQ>׳عG(,Z0O,8td#3?^t>}oB M[-[򹲲rk{ѱEEǸpgfj/:cxp<ï ӭ~} ~lBRKꚚ551!"_d2`oνgwf555i>l& JL.chxs|>O<"RPPPRV|E(/kgc'^aW|DGGl^,5 LErÌSgy* mmkkkbHT ݴy|jeUUKv/4,Wf]%d2|}}$o 551εenei0ۧ[M[Gjii.]~mwvHC]HDUUUnmEEUUQ +ܳ }GLMb^t3=:r4@OW׮|s Iɳ?!#Jjl --͑Ç5j\uCn***ppXҶ;\%u0b00#ٜݝ0 sXܡ}srkkkss1M&uuJOr\JcWSd@˭u| -rqij#$pܼ}D kjlm\ZVVZZVQQ•EDR̝*_0o֭VRRl~߲g4K"DF:dPÑ@hO\.Swfԅ†3X,PADddhc5>fkk VVVoftm.Z[Y68owA/mݾs/j&?q֝P"}L6mpd2@D"qV]]M';LD9y |8a;|B&99: paC;9wg6x9Ԅ]rM_;;w 8yګÌ | +%WTl۱W-_lbfK%&%o3Lg+(H*?yP8.>SYU%U/^Q,$dDp¥U516662əi ŵ3S3?*8~,Sa7fݏ yUJfY,T*UQQ4qFWWqkgmkV={`Sg[bkyohI6ֲdcDwc 07=ڵw?[ft>袱Qg-\*4,C{G枵jP ?ӿO|jtQ|BRVvvl\BK̓Ξ-+**1 znhjj2'%ѣW,qGZq ~099:%&=%+;'9%u̙4~)/Ԛ]ճDՏgmڲɓ^#-| /gv n4fHJNٱk{7A%3}TUUU1V܏URRbJ~AٟQe,h|ZzzEE !ӪDuk<>W% b9aKgg5kdݰs33]]܋cN(lOk_/.cu v*JLQOZdD$o[__O񣮮.aRl6a(*(9гk:vxy7PkCC~e"TQ/c;`;<{vuu//..!"ee+K'N?HIM;s>Bn x97/]Hí=H?xN D+Wނ 6{wB"*(,ɭjآP(/s33.Wcg݋f͆k+V}TT* ڥq?LLJ|x#ZZ&&mbanf?}Nhx'G"=r, ? ;;'vּ;qj^tjۄxᒨw7+?x"PkcXxbs3Ӆ' 8y6h?|fv6njtj3:O7:Ev#𣨨xw??2J84,KgN~zAn'"GzoL&cy3?rٟۤҵdzрJPSFbRJԹS&"#;q}fL#|>Sg~w>7WwDpfNzĩ۵ 6!KWN? o X"KII%9B9@_Q;s>DI8GKI 6oo읟 062|quMMLlܳݽ+=2dϐ>o^(+:7ޕ|_xnD~AN /

1fRZ$l޾ڴ0lBE;A`jT2zHÈA|x?,D764FUJҦӲֲ~F{їٟ&(ͮ/>!drB lWMޮviE/-5KN0^rm}<!=+{K_zWjJB'>ܫ_ݡ|5b-/yz0~_zښUKO?kQB~HDA~7܉O-QPkÆ}=mٗ-sX;, P(!.b<ՑH}nahQ2+23fZc5;V'SzG3kN)5tajRTFʓCz3!@8Uۼ%۴%ur@ɹ"˲ b1c&1 cArfdt/oܢCɢƝKW޸oM{ܚ8p44鄦X<8.JOVUȊRQYp{!U!A IV)eF;/ⲃ編t:|B_geˆ>~g#o?{YO>cqOOC`@aU64|~hl jR3\Aq.d \EHY5 qDQs˥* (2(eYz縝jL%EqǦu}M95qbfĤ23ˆOGƋeAӌ40;w; Xݝ{e'"IVMQrXD_# H.pmusnBK{+#7c Ylv۱M9/8Y'evc7MbW|Ǟ̞7~ԦC.Kn|=q .{-#G~)۶oJ~Xn)3**TS(50bh/_x,<}/pӭ׬[Yޣ'HԣG̟ixE \`9?>An V~}d* 睻?g<߫?(39pI;cMT\"JΓ £DH<^[ՒW, AICNt96YRdI3Vy/Jz؝-wQ6"^2RrW7aebX$.vI%A, $ʒhuTNM=jo[w5\'ba'-]k ? +gM8m~u]cr1„ƺy]W=Ǘ= b-|3.D:v{os\j6_ٷ`MSåz𶢢;J/y}=7sL|?WǬ[inf2g=w=/Lssb}△ϼ TT{`|W߯aC_߿!`nE Ճt]ө]v]}y^^򓝩TBtiXksllG(,qBBb=ǻؗ0q*fa}ݗEMCi{6Yθ Pa{"[5 (`6E ]ΞM5;$d#lCPa}KF܆(qnr^|DW̘Q\+1r}KWO;o] (O M!^!W%2>+b0`mPF vgͻ9mg"PYyEƆ:Ji$v{y_oѻ ]weUx #$,K=;'cnwF[{Uvꚽ֯7fʾ}{)zm;7U56׎1b֖fy$Ƹw~M**$J8cf;@: Jb< c˳?[TVV0ڳ{;B߾DQܳga6c`$}FũL\744LbjR cD,%gw1' ƶΔN"š{G>b?jwgj?قm%YO@ٽ{뷍-/-;BME3zr@!)Ů>cG^ܖΦ Dw`e;uz n׿xz5x/O5,@.$'cGB:@c,% Vd22|~gGIu`tּ o7x_@qQBi6QMvʒzkzVo>s̿&͛wIMEQ(9d: WQ 1Jnwgg @I$<>#h3*jn+nQI9ˆRՒ'%!ˊu@)IEf5X|T*ƭ^@DS!OHeSD'JFH.>\T6yiw)Oӄv;JB v큚 4V/j6UO-?Jsvo" r, biO(PQlDOrkHb{G$ҰE0x|N6EWͥOn069Q28ͩ p~BqΓPY,B I-~y:orKkdYUUΘ$I6{&c,|a14J}^L@ z}>BILݑfUհ e $Ja8N0ɄxJ&4Mb,Dܪl|qfS5^Psg9Q j0FJ98|Ci_?TrD#AB:2 N(E$-_]}կ֪dq3lFqnr9b '$(Y ,%QqS;{.=S[_׷m^'j~T(& pI3am(g&9=f@SJ=oSsdz'ZҚXp@N9h0R9f@{_DUUÏ^3[njh :7X[ᄏ_\8q/t:QXj6p:#,]yB3O wzb-mC#G#`nc cGOdYˢV|~8Td'q6ޚCs:,f A317Մ5]JHWVQl~Qt$A'h 2h󶚩߈TV$zMl20g 0¢%YLSu6l̝p-gVU0SuҼ[oē2T6~{jWwV \8E%'wdBI0V91 Q8L4IqAX :ɁP[ga7q@c=WKlgY[Ŧ=;jH*1X$*;qtMW ;}tͽrK~c6\=ʃk7z Pȭ*$yM^4,4:F?VfkזOW}|/~;d{ٳ}ʔл_Vͮ]ĉ`1tv ^pw]:;niϺ+.Yp]EE/5YvŲ;;5?85`^0z͛Ǵ5\e+ۼxŢQ"8z p,'L_3 #(ݡfGY+ ^!#7zS_j"`)C7ӻ8H;US:Ӱ1ŔR)CL -]K1LD0:jk-6'::m{n$K"H&m/J.\u*q2"t;,{mjoWEi#@9=gǣd"Cq؝nwU3枿WcȤmvڵ+ s~_`uCU{^xq /.|5OKOnhݑKYQ#gR\A,5sO[nΚwm:M<$1KC5J,\NqQy2Otu[E8Det- Hj0SJq(*Ǚi[sֲl5vA6͈DM(ep K途 & $Tm.6}X-Ăskp S<G,q;ygOΟfutv`ǎ _mښ'/z+ !XWWsڜ%/ m6{R,[|ҌSop_:AB'z :П_2jq_mZ/2xIgdgރBt? [$?3fӁ p]Ȓ"K$,`$`0FFPB "œk׵l5lM&b)+m1v76ҺLCȹtU'{ue3( , eK",XE0 t=WTiI' Æez-'O:> ~ry}vlի2Ғʛo^} uj*+{W_Y[Zy٬Dx,֣cO\sY0siV<Ҳ >{׷x, f 76 뺦f5#F s?^k0Qsv;MD[ʡ~_HQ쪖1L2x')!hW-M~?'SDBsp*,(Y~WdLKiMX$TaP˜L ,O&/e@ץuBhI!MSOv(,S&TWW:lT*nO9td2o߮` mO;G@}$,œQv)_{dZ.-0޵{Ԕ@ RWVs$Y޸q͎]_ 8P}mi;sO=G(T(g@u>MSwϱ '};iIFsF=Ʃ)r]yuPA_+*reKKK(5,1~I=d}g]M]4& 4T:1 5#RFk+֓_iH< K|ݍn?!!90-va !D:$jg61 a#-@PQ2lVk1 __Iir]n7kP\Tf3UO9 ;wѢ`G z,ܧ$Tr1B& S#PFB-"NyGDE!U*^5pcPAbv=1#F3x6R6ihPF)4k|0H$R0>%9'q@ddYfYt3 ) %4w0,`I1ƌQ0 ԶB;,[D6b\$Q$I@iS$˝EBsLӴ I D/>f4;8afU#[(y~lc>utʘYx"< 0RJ4^{Jd'"-K@{|2ݒHa52ΚhZ50LäB)Z~0F, EY>6>_4ĺF\Y-iWe`` j1g.D ?'Y[bc90Gq`9sKy7F(W  ;.ѽg<EY9-;D7pE~MB|ykFrX?-tąt rQ.wҔN.Sn?!(Etpt+KDg~k--]8*d#0[yow  ༠{@͇۸fG:]зvm|kְC'n(p|wY)*照;K|1~c^y~6rVZ$0Bg?GSM:r8]saIENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/cryptapi-banner.svg000066400000000000000000004050721461403617600240660ustar00rootroot00000000000000 image/svg+xml fastapi-0.110.3/docs/en/docs/img/sponsors/cryptapi.svg000066400000000000000000003310461461403617600226220ustar00rootroot00000000000000 image/svg+xml fastapi-0.110.3/docs/en/docs/img/sponsors/databento.svg000066400000000000000000003566331461403617600227410ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/deta-banner.svg000066400000000000000000001124221461403617600231420ustar00rootroot00000000000000 image/svg+xml fastapi-0.110.3/docs/en/docs/img/sponsors/deta.svg000066400000000000000000001563061461403617600217100ustar00rootroot00000000000000 image/svg+xml fastapi-0.110.3/docs/en/docs/img/sponsors/docarray-top-banner.svg000066400000000000000000003266601461403617600246440ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/docarray.svg000066400000000000000000003751351461403617600226020ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/doist-banner.svg000066400000000000000000001502511461403617600233510ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/doist.svg000066400000000000000000002657561461403617600221270ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/dropbase-banner.svg000066400000000000000000000513331461403617600240270ustar00rootroot00000000000000 image/svg+xml fastapi-0.110.3/docs/en/docs/img/sponsors/dropbase.svg000066400000000000000000000165401461403617600225650ustar00rootroot00000000000000 image/svg+xml fastapi-0.110.3/docs/en/docs/img/sponsors/exoflare.png000066400000000000000000000244741461403617600225650ustar00rootroot00000000000000PNG  IHDRd pHYs&&:#tEXtSoftwarewww.inkscape.org< IDATx{\MY?J7'I%TB2Ca#3fF3chi3fc0.*#.Hs|;{ںEf_zߵ{k@ut888Z'`N '`N;'`>b`KɽswdKYY6aee yyyX,Fd): XNNff9***ddCv Ϟ=kqp-Z}hjvkҖpA(JJJڡumONO;8WVVV".oG Z~t*c[{};ǃӜBkPPPhպ#423Z^TU2^Bz(A(^[+`CC#;8A[LA*AX(JKK:Ǡ{wmH$x ['`>_ 0W2 uIv#ѵLUT0ŠZvpp7oUTT0|]VPD! AZړ&m1dL!2Rdho:\ amѥKʔvTF0|]Fsssz 99G[ӡ6?G;@CCS&{0: ^z}kiuh{UOMI@—oo֢C{'dߖ;XV]]8DF&񦴫a7r4LMd.[((hu<Ma(6UVV(݃D"iqp4FXII6؞BM!  6nH>.־ҦSuOػQUU #l7=i3Zݻd_UUػ2@ZhiivLɾ$mAnX7RTTTkY3@;QUUvݯ2TTTPRR"ov:t(mh::=1 Ϝ-x)8v0oxn+pi|y<LMͰhRڎluR!T^^|ʊe6iۀCL>CERRŋoM!":u ))) &tuu&NNNƩS& %+:ciO!cy -#42[=bgݹs{żyq/_6"HV'¢}%\t-Bx<2Çbh[^^`8~S6UUUs'9ػ2M!􄫫OݚRu߶mcذa44ؽb߾} C@@6oތn]GG=p lܸ,yyyxxxŋػw/lv)Y6mڄ_?TUUw!$$ݻwc >8p~~~PPPY־z z|>>>>X`,,,_GGG^[O?!$$};k֬iԮ>Z$`CC#̛Oi޴wqAދy'Mr+Y7#>}p8uyT^V|>֬Y :uɟ?> ell P+W"33/_ĦM\KCCCDEEa BRR֮]/2#::˗/GBB?~oPRRbN< "''s΅P(dD4l0xxxА9{l,Y}qFXXX07e˖aڴijf>|~PV;<<}֬4h<<<*"""`DDD@(bҥnz# SLa]7Yivzʔg_&["BrCGG X+W.WCGQ{999XX \vGy!55cǎe}v@~w|iӦASS'OFDD@(b…غu+aiij=q9,]{ԩS1{lٳ}&&&ڵkIУGx/^Ν;{˗/gށ### bâEp}7 & .]jp<FFF?>N<  իѻwo<|ek׮AMM NNNHKKkhn}Pi_\yg[t|>PUUq}SSSamm~Eǽ}1fäIcƌA>}7Z@ ŋ?nj3Wbuī cHLLjH/^@[n%" 233 o\j^*,,\"///ڴi;vI"cgϞMDD4m4;w.Ryy9?ÇSee%ݛɓI"Э[hĉ4~x|2I$2e ݻSVVВ%Kё9BDDh޼yLG7oFDD֭#ݽ{5x#`H$t=z4 :>LDDG&o?GWF׌?H.5/Rm))).\@'Ndپ.`dd?xƎ˲ꫯ(;;`ЬY(99y)͛7e3p@ fl hʕ,y1H$w^ڼy Ғu_W9@ .G?g'`JII,VF?H.#}}}ѣGvݻw'}}FR::: v$###RPPhFOOZ8_JÇz&WSSzEm}-;%.G0`R`` _me88B.b˖--zs:<*%G>aщщщщщQS= --&,,,4eW_5j?dž ϟ?c󢨨bxyy_~DrqGצn24gjj*{,a9E7Bb9sԖ⭏p\pڵ q)B$!.._|˦o߾ENN'2y<KC$!55;w(((ǏcV|'yyy_DHNNƶmXB˗\zÆ c{xx@('N@^^b /oX`B!?TlݺOOOB899GRR_3ߢ޷oΜ9ꫯ  8[cGҬϞ=c<-;w.0iذa~c򥾑HYY>#:s S@@dffƪˋӘOg}糶޽{ʕ+$ߟ=Jk֬a;rH[nΝ;oQ`` ӧ>kII]]rrr(++>3Z`ݺu,YR>VARSS)##VXA ,pAOh4gڼy3UVV}-].^H/m۶QEE]xYnI$_hΜ9?D"~g/^P||<-Y)11D"7yf""ˣ'OADDH{n%""wwwfVb/^L;vJ믿;v0?vx?}ϟO'N`ˋ,,,_crgddڵk$ӧ;wHNNgϞKQUUE}QꫯhرL_6&5kԻ/)flCBB|/)х mذ$Imݺ2211Wݨ(!!*++LJOcǎe% ֦ zݼy:@t )i$''GHIImFyyyL.ODD$uRUU;wϙv3m0aEEE,nu҅4rHIIIm\jU.((IcpSҤL/^` |>c^ZwFL !4:DvFU-,9/ؿ/""7nBDlK&M2U <֮]KȺ?L풗'kkkڰa|5&ruueΥTP-iӈzCM1wxxg.())+VP7\hϞ=:7VٳgȐMzzzd"߼y{;w vDx?~r t#/XR.s@LL 7|p yf\|AAA(--%/&cժUG||#b̘1oP3}pU={x ^_5FѣG3kM5j#^"¬YPXXUV5Yڵkٳ';,̘1vvvCnn.? Z5}ݣf Ν;={6O߿&&&1c۸1112dcc֬YjG~zhhh Xp!Q^^Ӧo{qi`ժUDD"AFF###̜9AAAh߿_PZZ wwwTWWxM?.\><==w6>il777눉Afff4- u֍Ҙ<ӧ}йsdO~~~G%%%t=f u^z5ݿJJJ(;;>\'FٳI Paa!eggY az!PfffЪ#F+WH$" B5jP(d±J](j (**(33$PHCey&={֭[)..h֬YcWL+p}k2޽{0Ɣlc귱˗/H$b~>$OOOfF*=mzZt)cW;ŋY*))ak'''|XfS{nڽ{73v&&&̷v={87(&&)FgfڒP(dl***ɓ[YY۷Bڸq#siiiuB5kHEEïe+oŴgO޽{DD p}'ty""V۷D"79M6I,S׮] 2(77-[FǏYԤLJKK3gФIܜ8"u"x#JII!233={ `}%DB؊yޟ9[P'XZ}y{{c@D@DdmmMҒbe""&߻Я݃6={r(""HMInn l ;ҥwȮ*][lשּׁ,H!g|||`bbOOOA]]8F:@uu5ܹ}2yү[ؘ/**!C*VQ\\ VH$ ''6lIqFBMM <=I0IDATBܾ}˗/1.^7n`L… n:H$,ZwޅP(wZ=Nn|L< Csz 99Mz0?G;@CCi6uWm۶aݺuy&RRR```jBYPP_:p6}t&.00***(!2 3g+(,,֭[с/RSSQXX777VI&oY{n5QϟX u!L<%%%066Ǝ;d;yf 8;+L\gErCGѫѣV(//Mjjj1sL&SLaȀ- PI)rrr1eTVVkxb 0ƍc~'X,EaXv-֭[? www'Nf_|ΞFAAxh:-s _9kLH$HHñ ++Ix%ץKL0e'^zxx0y=zqXvd|ۆ .@II NKK ?FFF H+WyՋ+--űc0uTϏ9#F &MuZԅHɿa P{:#//Kˡ8pnߎD|=V3#0xsiO#$4/ٖ}||駟K.8pooo8pW^msϐW^AWO>л1ҲRDQPPС6?K.A,ҥ eee/8x z 燜b>>\v޶WVVرc())wwwܻwDcȐ! UUU!((D____~FFFV^+WvrJ1]k拕 s]Bꨩa;G  gф6㡟I;B]]C2EX;:ŋ?:KG'``ЫicԌ>JMAXX [)F;5<6#ĝ;uR8ڇk׮rrrv&OND,zTUU!6.QxU[4hiivLɞAX(JK['%G˰233|Y]MRv#G7uػvTUUdd#,LEURRͰᰲnrKH$@'۸u!C0l__E kvrpHi׸9f2i'tZ)1)Ҟ»0%yzwp~2\j_Obhh{'hk6@U]]8DFޚwu.eD\ܽV06۴ /6h:* ڬΒb܎ljKsso?.`)-Y(= ,iiOP aǸ5EQQ"#x@&{>_ 0#{6##!zHlFkW**qG{bCwNR;T" CC#88A2!HA"#(++kq98ڋV@ "cW^!^ `P}=~ /^[\vEEEX[p((ng ̌V=#l5ňݲlN%`)xt.9vda]88: RR 1l{=mdxH =<8-:(++چ$ώQnX Q;;'`o2rppp2 #GIENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/fastapi-course-bundle-banner.png000066400000000000000000000375531461403617600264210ustar00rootroot00000000000000PNG  IHDR(.?ybKGD pHYs%%IR$tIME)0 IDATxw|TUiIf&  ދ ڻkY]]׵eu׺kovDQ*HBw=?d! $a75sy>O?V!D /08~@&sO:!V2xr-LeSYθjzATVJMeӖݻW`&KM0Ati+L'.%"/xL CpmO.xXe&J. WoѢ_䷢2"Kr\:K)T `AAqkhr҅u>ң(/YF+6RP$hTas4Bѵ=,NQ#?/ oGP z?YmҗZC0\eQgz˒d5zKhqG_s$CyAKǸw^3DH[!?2B!`2?ݺ(i&(!WcDs{T\n.N(r)ts \EFx^Blx{ո~zNSٵt { z Y:v&uׯ}N{&%vY <@00GfRirjހ%?v*V.N(t(::C4\%̓R&J3)мABWr$J' ]?`-vQXyVKLќ&׹K0uMmuy.UA& ٳ:Lmi{ 7$VL8#ަw鬰k^H"H^mu1L|[,)1-8 PT(ptpW3`PF<rsPliroATK8AA<*g;0-1ԩܘE>1KQX? %4F-1S"%y{c124@Lَ4TiwfAt6=73b'?n|X5f5^ms:d0V68&χl'͡)QTASeS\ ] TMj ̼,% ; UTj-7:M!_cy{\&3]M(HDBC 5h)Db{b[v%WC8Lx900kv;(s)%ZU5AՆ[UƲ VЕ``D&JAv-ϡe5uj73/r5񉵰%x(ڧjɜo Fҭ 1`@ՖM fcݏ&RB 'oYѨL3=CFj*lixELGI>g %}N_t:sEvIUy2iqxoV_M GN,5wK2o7]q yۤl0]"k]BH'-X80%qi:~Iptt"R'bDcFM:1RmfQ" 8L4; uaR;t0i(jQ؁'z1hRUYM%eUeݲ˲0-#zSߡ->s 1`m S:+RIUM{opoOPi pŕuTYnn#lvmYϼ͛XkGGRkPm)88q3}hOhG[0i1IfVH -Im]1|*-׺cww>qfA߸R!F r!rW\D$E@i%UVRJw,%-_ ʾ'zMYw9}oVsCXV`]m(qu~4!X]C8{(EtƪRC9E~?7vaTf: _$cjY$#,G1A|isl5ln&5KX~^jwTR*ٱbN.:'_Tsan>4ol  رâx}-׹_DhxAW巣t`ϿCgsm3#|܌m\tz\ sgl<'0b0pZI5TTvt@s}wI9 uG1[CFh7EG H~ d8. W! NqD{o 78:DSoLZk|5Ս̭B*Kg`l/Ca0:ɡ'ղa?E (F{N+u\˂xj  Vs?<8O-{JU8̖qÒ gǡEWPCܺN^FFOȂO5PU J#FVI55x(/e^x=j3u[M'A,Pu7]b8 _FUa>6#+r9Ts6j% q n;"AV%: zuWx(f3+SPQ%))V7CFbO0Bsgyyퟙ8tXdڍ6]|9o{,'1..VR+C<.wqn(zqX Ra߲+{,Zb0odɫYz?ݯmb87?xJ-B77ZmpvTnf!go| lS'2g P۞z}ɸQŇ/gѳH5&;D`lݻ/b# 7L;_ΏC۽@goӘefD7MHYYĹ*u.҅ t! H2_׹o_ۗJl&6Hіiq9OtDKh>=iN.sY=:$m6 ^^۶3H:=j Fi(jHSUvTf1}6zSs CY*#&4fз Bӯrs-A{>%9!f_xjK5/2z]>1xTH>,>.gղbC6] ?+4P2tEIsQ“ ;QݪJ+!E-zCid*QZ:M= RΟ~=Olߎ> &f[IP7~<32]^N j֚Q$ly0 Kahn5ݺ|_[k+oO$.%kxuL'J#nk狈fAY8F\J`M]HýՅ9smPf>qg2q43I1cOEEl F7~ ztS2I?gNkڌgwό`II8"1lԔ@ވ r@Z ẜE˄;,٧̒#Xx`K*)2@eMb'6X’dIlfR8lA pL>ίkbkW':xNغ av@3T;˒R;m2+9 KJݺ۶pI֝ɚ ]3\d;;6-v"DL U@U,: tEAa>-fCm@>L{jvVCi?\G&b7#df ^<,'(!/giC(z|rĻʔjFLe5v3(laz-PE$H^}NJ z9̰g_̌fU #Œ(9X'YxV>Mp‰uQ_YL:x" rENT`caڀǘj-R_ >: 9LՋ{lc( k2",`k]VSo_nrv63nMRrjN؉š{C!%BP­(IͰ1M1|xL)\]gi;s^.|w/nb|YQZߟòp: U0lI~`V NU#R)B6b>H^]韼*4EaW0º uTkmb{ ¦QBKURE)Y{]hyucoow g[ŧ^]dXSǺ |;3OuR=eV'׾S|aЧBl)_lnMMd,ه/vu@ɯ_pd;Gyx8}Glb(*fj غdWݯcAJ\ &1T-֡o$ <a8Ig^uUʴ+(Lqӵ.ncЩl3~zEVm×%&zvI`ZFiOEJBeY~A6{ƌ>:Z΢SH'ƍXU~ӃqaɷzӞ K=- n@wl=4O,xr5G奀o{H¹/Lirk>ׯ!R]8srNX-b7w<VU5*XAyxb `B#,pڭ[rūVqҥL;4v)%e+J|ژK6?mv0ۖb.(؋k:L9D%F-,)rޕuL>^d|8`}zo]afeK ,9ݐdxW]BQ,vxy*&@~* seXz)ovurϣ!5\9=r^o'9~7oܵ~ye\Y_ O8;溛CTsڅNKn.Ͻ27!?; b%}ݣkvX֓ӫuɾ&30[}!~yQ#  K(sNWOr-!??=f㖟0p‚AU~.}H ೹qP傝+)[ŎC򫮘8nY֍..WR0y`fY7l_{޽MKF=ϐD`¦;kkK}8kפֵ7={@T{n>--囊 VP b0("l)Є@F&ͨeyy9Z¤^iir(Xt48{pX^c~Bą q+ }< Zï%1.z^Hc0mhNO>իR'8Y_rVTQ|E rhy{Vmm7^[ÒХ_svHLzuW 'pyuCex˜ +?2w?\p|{\'f4@ӄbܴl) Ǒ4AuE^+vwDv`J?ݻ*TU[yxLt=uceDB0Oi˧:!7暩.^ԋQiNON1{Ů !G73qAP\'fl`KI_\S+t-ĩ*ňdl/ݻ*( |`LTIJ}w{R Ͻ"DcNq@S.H*Stg&"iԱc=7.Xiu6['Jg5\rmFtiIɝ:5N{p cm2kȄ1EƨQI"o((}^}څ3zF`qNa!/;c0k8497lk^n4q#2 L)9}rJQ+,|vGv>7[\̔AIDAT=ՇF8KtKnx2',ݵky,ܽA}GaZ׳&@^0-y=:33jڄu)t ;_i[,LzPf -c? >6m6 J\NA^e&s_2*[j&RС×dLu`mK}b?l[wt~t VXڜQl`w~6o3 ! }{vFM_͛U;=cx%9_غݢVPI!hRO+ ʟ9 ?gͽ{={~={d ONGn$rGq<9;sg4[FYXYKӚ肦IY,)%q)1-x3ke^®-%޴WF`JNNX+*RFTU–WQp*.E(`[8ܢRkGgX36l;JǃrҾ^ٵ+=ܻ7^McG$eVPdE]0@AY~X /2?#%6-IqmWfю~q,3EV"q6ofx,4E dEu5!gXs;xyej'|q֥/):o`0ZV1=@cBg3$ZͦKF۪*BɷUU|[U͛|Qɜ|E(*J[4-gB9&/LT yu2`]]5=TUFPc<)?y MPsf(Ҍҩ(sHХi  wH),[bHٲ,kGXv}LUR:8{W(}ܣk|J$JbCeS#TyoY?u㖊)uYoOh M[a )R=ݻ;XSW+W"q)5 Vv~]ǩ(<>dXatȑ)M5VPWqOVc/fZQ#b㏼kWB+.fw47UUIP-X~?\.vF",= d{Mknc˔2E\JvbļW*n鑇[UX]ݧ"ۇvj)&˓ECXYmZva֕U*J|$zLwn/.gCL8Ngj~2}Ųಳy{J5n!}E[$c !n7XR89Y Gctݝz\sܷm-mڜ Z9.t57(}9 z,M t҂3.zٮ1ԫ/y([T_]}ݐ3 P `|3~0 .ڰ%%S֬Iٹܳi9b8 .%QTTjA&J(Q"hYqBEi4*1~K4 6Xnʃ6tb5XD(G/-J_ӥ%jFbB.wɈ)D\J25Yn%bGrU\+'~L#:{;%VV8 -L[жI[X8$ |4Mror|b]{4 yu1>0ړ/x,>}y;uӍIc `Z~N&ٰ7SRXh$כP)ݫ1xp.(j;vt-SU % .E~ɮ]:u"֌-YbĠ(&I֮w2hڶJ+]pUMŸ,* ۿȫ:,dB.>^M"*'THK} wƫiг'yT:YSWūV6,4 YRDӄò2~ xe q͟L)S@^KztVݺ5$LX gm ~M4]'[2Ł J-G=N0)§|(\ !RwKZ{/VfXL.CI$Ɣ'y=;12%NUp!^НpmdrۢRSG'^J_O +ټYFY[Ol3es2rl)c8Z)@VhvyW{n'e 9>kܜub-\Wn{J5NQC#8uPU>܆C!cGXŕVqUL<zb1C kW߱[ شAq^ۮ$c*R]1R18ʽCcF'/?~F :>_eRݻ\sI?ᥤLSn׺6nqp:*Ĵ3xe>.ȉ`P(9+÷vhv?J+ȹ\U_UAd.L;EYg3 Y>rrDףXsuB_oFN'haH 3/O޳> 9+٦Dh~6=f "[Ȏt4,f SKrV HDc]m@Nl߭*nϋՙ'_?2{^o^F^M wvf/ BHG;m~etMvJtlp5lۥsݝ B[p9%=+HS)Qtk3w)MN=YIx3,\ (֩H %(-8dx$capT(O4:!*?܅{Z  )+Tzw%\zM[ F()"QK"!鿟ӯf~<.?Meʧ2YʃHBUpcyu^VDŽO 9?{Bi쇯d5!#ioGdqxYS>q#

72C9/!y]ZCB$S&tHw?ҷ]BQ`gF~N1Un PXg\\s[wM˜ Kxǜ?ÏbL+ #x.cfMޓO"`t3``u g'\]#$v{㬫aYpQAf\UJ^{lSw!Rk p.ztiTTtE"8N>.&R x\`DZv{6-=erY=ו\&LQgD$WBiUgK8V qJn{( KB,>!66ZVsq"4ְ~Wg#Dž*, N9:WtwUծ!%H4Ea'3wDBu78ލmi'DJr >%gr)5̃KfzI]Z/{.~}3YOPڛzWMNnX|]VT2$N?rb? >Ѱ͖+! A! _0B$[!ľ)tvq*o v$FݛdI &Rʗ3lO-]ʻ!͙F;;;̢ 3W!^7K*'wa[Gh"i΃a ""i4 qr$'R Ȩ"-n Cׯ?%4eeXџsq8ƈHF2&HPݎ{&QХmMD]Ï@u7#mD$Ro%q jt[SвL&^. aa_[b:"0ۯ-_gɵFo.; f!:~S`t): 9Z35%C6Ty$~i@Jo֟-fypC1p - \J 01bQj1,+@!B oA̎21>FbE6F⸖S6G h6uxx#Ა-hMiQXyUKec?:,)t{ܙ =rs .'tfr~Q(?o2-FLlD:fzA4~MH_OQN;Rc7>k=:Ri7+'qht $-OۛhW *O j!2kx|zL5W VC TDHM|Gm;e2-{ʟb[ƞz[,8+) +[ُm%%-_|5x<2[,pTgGtP{G%$㤒;cRZk\55S+0{| FKaefdlH }E|O FP"d*@06]X%C T[X )kga2 ZxX'TgRlTڂeG-[aB4*Ş4&)IJ sU@0*tPԂ98Pk-}JV[0c+Vrd%?~XIٙUj~I0wP/ {%="Ƹl`~:ڜmSB[Vzݧ ;WqIª4Q{j kHSJ5oTDzW"XP11 h*w&G5CqK}u%)*qVߛ"}IvG-JcPҘIIJb$db%z05mH((t2%GmͳGVUk5Z@J9_ *(:VQ^>lZs'ۧ[S'XdQt} n+6?V-$},IJgL)4V]թ]#fm*3a{bgG-v%; {{ n^ؔfPr ;HtjyɧfUDff7WJr2rAMV~xMZAWlBarxMANQw `I^VWo6WQHP-;`T *ioJ"J#J"N@N%B->ϏDIttu%K]27ab qIh1K& +dU &LҔ.r+C@AԘ'԰l&[3xDcaTצ_C=rV \x ힺi_'$1Sq@gn}|jGzڤ@'8UA&G#"7Fa[eXees3002003001001001000s 7 eQ520|i/#hUzbdd`ob愜mIJ'f?8d~?6Ol 2![P? /100bܴsQWReG^|~IENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/fastapi-course-bundle-banner.svg000066400000000000000000001042511461403617600264220ustar00rootroot00000000000000 image/svg+xml fastapi-0.110.3/docs/en/docs/img/sponsors/fern-banner.png000066400000000000000000000211411461403617600231410ustar00rootroot00000000000000PNG  IHDR,(D pHYs+;tEXtCommentxr:d:DAFofpqkcX0:5,j:5549957484056552388,t:23071721ns iTXtXML:com.adobe.xmp SDKs and documentation for your API - 1 2023-07-17 1a2b0994-e228-4e35-831c-c26c74b6b37b 525265914179580 2 Danny Sheridan Canva 譝IDATx{XT?{f wD@wABL@^IjyJ˓Lǎ[yͼRy5&2 wf8[G@Aw>3k֞^~QE,X`!@E&Z`)P4gQ "m\Q#Bs^҂ 0&X"" r~Ngn?n>QXɕ +KEeD=VrJ"~PJJJ++fcnaTr~9U .f+-Q[CBJo""Um'((`c%WfMߧid?ݻwk. pss#::={J׬YÕ+WYY "$$ _57o$&&6m!/2_Xfa\ԝJ_ %$.fc 6IaC* .Y-(ι{0e=BE^{+V>}:Fb…,Zoooرcc۶mc̙L8Q?3fлwo&L| >vѧOg̘;5j%%%7k$&&ǚ5kP(̟oee%^`0}͆(TUUy!QYKDDW~AvƓFo{ҿ]U]i_QD Ve6WKUةQ+"33{9&MDhh(mڴԩS7N*gHٱc?=W<<$''ӻwoٷo;w""""ԩ :ݏGfarbk5 h%-p۾E:w̜9s:u*VbժUQȾkuvvvvlْk׮q5s֭ **X|O`Ȑ!7@~~Ӻuk^}U/^̨QzO:{ȥK?hHNNˋ7nЮ];km[}̝;*̙û ɓ3g9-b͚5dff3ϰyfA`ddd s?5%2-x/ ɱؙ٭tf3|2m<;'ih)"jg\֬dbҤIdffl2+ۗ7o3(ROtJ?ի=s( ƏV%..NqrrLJӳgOƌPæ)Li6fdd`0 -[Zg'55~IL;v Gпɛo  ftoec5'FahLEUUf)+.ReC@"}_Fce,շP7EEExxx0l0[Ν;+7nܐ~huqiP*n\xx8`ȑ ,,_ÇceeE||<ٳ5f͚EDD_~|gEVYOrwOt:((( wGFFE,XxHh pˠo2(-/ 'M Sg8[jU*QJ.?NcD͎ i櫶wK*ǂ FFL&ϵ5JҊb~"]IMeY)׼8m =ȭN(2W)e%[׹PhZݻөO1{lquu%00ٳgcNJPPoǕ+W5k]t7DDDFn駟ׂ =,_N\.:q(g6d\/+ŲŹO,+E۵;7;X-A3 *+j=AdÑovi(y2P*rJKK0`{ [[[Ο?ԩSٴij˗/sIDQ$>>:w;999:u B/H^^UUUǁ,XhayصMT*,-abΓC`Pױp{V2 \ ;kpp.8Yz@|rBBB^;v`0?-6mgΝ899w^v! DQԩSİk.VX! N8СC9rCn޼yϐ*,X,̊PW;cZ`㈋rQξ>%kz9#.ąJVwd +++ZGA78{٫իW#"!!!T*?` $$֭[ruu嫯W^5zM|G2fڷo 5X`4㨭ґh!F2W/g-;Sr A.bi};Rq$XDIQ8F{/tmF8=옿? py %7 5FkM8::J2 H1AgZdKsr5nB_9t0"L5<ۻ3:t&˿PRY"e |Z7ZTHZiY>}nwrw؎G<}tfΜ)E?~Qe˖h4*}'Odqg</ȅ P /`mmMrr2{.:to߾u_`eee3rёPڷo/-D%@K*96 R2U[vXM9۸ѷyëWbX[٢.)x؈Hdd$'N… agg(,]|wHLOZfڴiһw?ZJ^^&M\\\} p:әo޼J!tLHbUW`oU`JrA **,E]>?=D/~ zCI  8xxq9?#9w5 w'-|B*{29/hJFIOO',,!CB 11=(HPPSL5Muu5rp`gXI믿ΪU0a٢0Mfwy2Nʋ/Ncɒ%Bll,]t`,Z~wyww:뗐G $$$'5jӧOgfQ\V,_d~QZn]tAVcccC~Ȑϟ?V˗_~?3k֬1Ƙ1cjRRrE؛ݻ7h4x m&߰aZV1Vz>, ,ݽָ&r9SO=kҹejӦ (oFWcD^Xr%W6:WMtt4ڵL:w\kDQ$!!LW_}kFtt4`|UU^Nrb0޽bJBQ |\ JyU2@-[nEYg@"##IKK#99 [7eFu&N/Ju{WAXd hѢuJ㏓J'16lAh4׏ׯyfRRRHKKNGVV3f̠ '''<==ͮѷo_,Xˉ߿=zjx"zB-۷o_~޽pJKKʒe5bt:vލ(Ajj*6665잹f,BATT ㏓L>}2dݻwfÇpKZZObh<NDc(ՙ77{*-eFov@4 TWWS]UsmG[٭ ݻwWZAprrHcwҦM:7ݙ?((sh߾=-BҪU+):C1|._{OJkggٳgkTIII\t ooo,. :ѣG`v\ٳgޠvtzmbz ; DZje_~1Q طtRbbb8~ёɓ'>0tbcc^x>>#%%%Ґȑ#h{0d&DU#_3"o'ZϞhqAsL_|g}V:ޯ_?III1K߿:ê( 3sLxIHHښAH?;cs ٙST 8NǶmϯ!V[;Cr9vERR?3ǎc2x_KΝ;Npp0`N>;[VVܹsO< ,hPx2M+*5ִI;rH,Y–-[HիWjئb6)ТE i Gf(hIyxam+yxx4 *+ 1|!nC>{^zq &O Ē)̯|@]2kLRz> :AX~=S]]=zن<&.5j26d2^4Q쳧o'B`cs~X VXsgzDKt-?#F+K/qu֭[C=a$%%qZ-ҹQFl2Ν˥Kf~mR`˖-iӦ&hVKn8|0۶mcҹ԰1tP<ȶmظq#=z={ dkF-2ݻ֮]˜9s[A}e`7{drF݋|*e(dJThƧ%b_aÆQ\\'|"ƒYp رc),,dСfn;v䧟~bܸq҆^^^|[BPPƍc,];駟n >|kך i;qttח_{;w~ziw׮]Tc'44VZŁ(舣(ph?ڶ#}ޝ~Ϯh^Ovv6jѻ pqkQשݽV_KUTTR/U&_7>qDu{'қzXҮƍ~:"%%*V`=޳<'' T*ZϮ#IK{_@pB|栝:u/kdaCBDR]Jk[VV`, piqttgϞ(?J2F,X`)Hi,mxIENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/fern-banner.svg000066400000000000000000001202151461403617600231560ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/fern.png000066400000000000000000000252541461403617600217070ustar00rootroot00000000000000PNG  IHDRd pHYs+;tEXtCommentxr:d:DAFofq93Ytc:6,j:6611681096017727665,t:23071721ƵԇiTXtXML:com.adobe.xmp SDKs and documentation for your REST API - 1 2023-07-17 c80e135c-031f-4f4a-83a7-0bfb8f101737 525265914179580 2 Danny Sheridan Canva %IDATxw|TUwJ&ɤI R D$(E]qU*(Y(bhkxB T!!Bz/i$ 0y1v'sS$(((4KT "`f"`f"`f"`f"`f"@@mS&doDj5~Uhu~X~9{*8qC.HH -IYV,XV@A|'691BV&K-rq J HHh(\EpTԖ̗&@[C^J6CHqK~/RJ FT*>yDppoC%!+"Pn:E{1 9@D, yNnKANyR/lQ$I;ٖa1 #XPz -Vd$@7?;dlѺku6Хl>܊,V˥3?~(X(DJ]$墋HM(v)(r9ifC]& CCӫVuCZNզJvXup>;+>oOW/"ZEҩu,A>unUj4>?1~#(FT$4j zg7q\L 4+.7.lZG+:u&" Oܐ t@-iC*VP0Ӕ' `lsǮFcg#a.h5ZB¹/!ahZ$I>y[MOe|-ގoH %'[(3~Gugsѥ{# rk@+ Cn'zg7 VP@QUu5[I넿g ~} I*@{Уxd_$I89x}lcUkOOy5MYzUN1\,;/,I.U.[5̻!|'/րUσO?»F%nɯȥS 1Z $5z'!yGYi;@B"PAΜ/9bu{STQ@![}+'V/l43_si3oڭVPh"&$A)5S\+_UGR۶l9%!0;4gE 2|tjn3 6@ֿ:ZR:#!TiP_plŠg`/wH{$ UZbRkd1]'3p@_4*.Z س cJ;$GM~We_x㉥ُjBqWHǀt }i)('#o;9Aay9EeY+C'4gާۚL&oijN./EpEm N},+ .Ԑ-oա+K%g0fs eEټLrJ5V8G_$>T;Jm4hM?~<+VPњ -nԐ@_8Aqe(}0D mtF< $lV~AaMA<86ZOj* -@RJ|+a\unwT, 7BlxCJ G%EIBUZzG vl%VT8R+BwV%HiU|bh]ʕlL d?=]N~T]yТ Բ+,I~1YTTD,IXVR3W_}Ԕw)ɹh;I͹8r3{KH' κ*,ey'{*sL6^{...MX[ixMzqxiQ$ WyT6Q9IZ^l0Uv[va~Hq*JK.ۏd.߭V ٿ JͨS~cjJHHMAdbΝlڴGb4  :___*++ywdkޱcGx -[Ʒ~b='O,[L?sLINNfƍJBBÇG)Bn@0K jIEaOdbd}/d6⤱mRll.glk%I"s7+Vłll2c1[0,XA%$6_FDvtk{! //'cf<./$((G]SSLmm-$1rHvŋeQw !N⣏>5jSNeӦMvy-]#Gb tƛFZ*-nXq!'ζZ6Q$,s55&AȎ/>#ѻj''-:'\\pr ?[:VC*J^bZXs>C8TTT0|p0Lv999;FTBBM۴AzДQk gSY[V}~CAAn{x 'Nĉ$%Iߟ_TUUj*Y#F`նS9G;Æ l6o>?N.]VYx1cǎmt׵у!0a:u"//sa0\hUv~p@?۔R 77gw4* ٿj|_s/uvs "ڮ$_ĵAO%!Oŋrݻo>Þ={ػw/V^/ٵk<9r$jZΫM2E$ y9hJ5-#!ѿ7^:k!~\>a66KDq im>H2̡Xpg` ]%k;ƣ_~^3gC_ufϞma' ++Q${SO$n[$\]],Jp=TƕQmYj+*ai&-Hg{ory$QkYCxX:=xWFtK/zF:Nv#-^p_UW- Z]<8 Iu^GG(ƽ}쾐 X&9]IRh nOփh*']_uAR1w\ vxz^]F.GlplLHH8itĆ!6Urj !⇳WZcbbpuu !gϞ%((U`0p1 w9B ezVE޺kO[3?.S^]UXi%IMIW[voGl@ZՇ{wߣDC45 :۷o`0P[[ˈ#u=z3gȋ3bbb4hЯQ!928{ S1xPTǗip~,Vl)Gԉ'Ad@f]|A/^Lbb"& ٿ?puJhh(˖-obZd}|i0˴R^SPݱjtaKظg|Ư$zbbb00JرcСsa۶m\t ٌ3$$$/(Vر#f&pww'ãQLΝ5Npӷ;,JVY[:9K?X'.vƯ///ynQz _/ϛ)ߵaT7 hI(M`"sK3W??~v]t*$d)Iu*XX-Gfa ]wAo[b#zw,kwwy"5ΈمNָBf f !+:{"_-)/Ԏ-vtz7ȓgU]uojpѻA`Xst#ph !i7Jrzy(Nz:xɶ7FsXf=e bXZ%Hm^1"J~nA`&j[QiJAT$+( 0m $+b032" /1]f墼Wb }p/H;|o-}ٚ\v6MhǵEW#;HpZuKDg[ǽs;ȥҳ lK[NxIS w)`!(EUQeϠ\<22ډpD' 2͢ph.9B6RB7-8\]2j`acIAn"GPx4 &ED)ShVX \]Zha_(] ͊iW^&X6xB)("-v7OD>b-Vڶ)Uh~>0`[qˠ3h}`111111111111o@ee%7R***ps;`'+}~~ବ,.]ٳgqqqO>3Nj_j4۷/:uK')) ./ҥK9y$OLVVUUUݻr~MM nÇ8qT>l(++Μ9cѣ9sȾ}(**rFFFb0eʕfϟo}:uĺudʔ)TVVRUUŢExWpqq!99"PTnZ<پ};W\K.;b JJJ:t(_a\]] NC$|||xӧ}*>>>0p@֬YV>kT1b$vZ:u(ϐ!CO?mTxLjsF>hΜ9@yy9}w <._wp4hϔLhh(dРA$ͥO>t҅x:t1cX,|DDD#0x`ذa]6lwW_k׮$%%a6>=zйsgYeՋ͛7JĠAӧ5n `Сj***HHHCK߾}enݺXN4X9^z1n8 @Ϟ=ZHC=$C4 ^^^vZMMM l u:O=3gl/-[}a9+.\_u 8' Mm BRHTTO>$+Vl6_7^hh(۷8ƏOvv6/.X6nHff&3gdذa>}4w۶mGم|2l۶SR\\ŋ3gwfرD233|3go;puu+&9i$Yf )))sɖ#?#_ٹs'&M"##\j8C6m}+ã>wsFŬY i̙3>}:ǎUѱW$ 鉫+III?&$$}̱cUSSΝ;i׮g]vYFJUU*#GoSLaݺumۖu-[=z`4qwwȂ ^k4$Wz/oO>!,,~fvŕ+Wd͒%KgO>a<#\5k֬A3o3*++~'8;;{Q\\̖-[{ӟ$Idgg~zދZj\q56-t:Ν;'ͧOd2aBCm7tO< @DDqY_PPy󨭭E׳h"HNN`04Y7 !8}4jNz(3P^^ /@~~>O?|/,,+W hܹsr߱X,dgg7CV7v-$J2e q#.]Ą z-[w7CUU6l^`@A`` W\av5k3f`7on fϞݻٲe ?0-́B>f?Ν;tnbb"|$&&~zf̘Ajj* fŕ$ mŋ9x ˖-cĉ7|m۶1aNJZZYYY:99Ϻux'8p _|]x?>zggg}<<<=z4j~3f ŋٳg=z`/R]]ju܎xgHMMe„ L>{1c 7bK,Zƍ'{~;Əw}Gaa!/2$Ehժ[n]FoͪU:u|ɓ:u… qww-JYY ,]&~9z()))[1tł {7ygy޽;IIIqx"=q9^^^5e˖1rH;f֬Y`qvv fastapi-0.110.3/docs/en/docs/img/sponsors/flint.png000066400000000000000000000242511461403617600220650ustar00rootroot00000000000000PNG  IHDRd pHYs+;tEXtCommentxr:d:DAFl_Cbr78o:2,j:6347091386788795290,t:23061612LVD:iTXtXML:com.adobe.xmphttp://ns.adobe.com/xap/1.0/ Untitled design - 1 2023-06-16 0dd48bed-8528-4ec2-b54e-99cfeb3e0701 525265914179580 2 Pierre VANNIER Canva CF#IDATxy|\uŲV`yŖw۵Y KBI ! i i ,&3JڤYH77)H1؄6ز*ylK%=H#{$KxΝs߳s%e6q¸vqIa\0]\RW..)+`K %q¸vqIa\0]\R)3g G%`mx2.X; ȝJS\DL-COܲY55m˘cXsw%S.]vЁ#i.dN+6T&eINLh9mSX E[׬=7&^~/|0DV*`eOĞb(zhS{og|dmsE<ޤDڷb&9Si"EUb EUT4UUWà@f Ng(ت$34Z,>܄R&;.hY~mpƙ1&Dbhwtr5q=_^:uk$RŪ5R{^4Rb@Gw]8ӝ-N8/6I 05}^^/VC>׾,ZTT.j$2&5pV04JXQ%F,7hKFF[ce5Z#r8uu` rr8#).D=NpQ]{~ %~qě5oL !VDkuggk'rբzp05vmxHV^uˆ0&:,-jeB("oy{;t4jQ/`~,(7 9ة+c: ii)uTIOOW2c(*dgԼn o -||<5T$clHmZjjB v  sF܆@J++$aD9Zӕ>k9*vI& - DĎ&i[*S8-pܬ׬7p 4qB}{%6+r=F*"QOw ݪjFn dĩ" oBsh氝HI9Z|*FV1f}J,6 |DMY-;f@JqD~GVN{tvvvb=.)9;׼W]<`%]ܪY7Q` OD=x2 >$9͏?֘aLd4<'GH~NU͙s1(;D\j:f'y=,6ܠVzҲsw,b忞>0,Gs/y1ķc.0mM&o,Fyڎ-Ug*zOg9gsf9Fe۷G#@kYMl(𒑞~6󟷛w~4+9yҫ˗n+=vb\;Q605rro`đ7++)%aLN(.tmwm+b wJO#{*+): i-N..øW=>}\r)&8?|Q?5Z$Tq_ٱjԩPX__B'ގHҜXΤFĶi1=ji?ؓnӑ4ifz bS]oee_M+Qv<W ^=y,>.tvũU:lsmRy;>uS چ.QSpu߼hU@Ga\qN&臁w$w uU_p$;9Drޔ)?a=^*x:-Z[ ~}tbixN ;t 0s~9wbÒ>RW6D9NHByG>x3o!@nmm/aT6jo {e /~ўeM]D JxwPLNw)]@cӅ 4бhZiQ% 7V4<G7_]GN[tE'k`Bsb˷;Ccӧ20tIwKNn Źv(*6B8`sJ |XzXpm :>/@}L07G4&XAGmc 1}+W||%ܲhU|V1 ``|}7ZQ᣺|6o3־sT\E=^8ɘݻdcQ)wμ|3ߏ M!T7(r|/G GyYk%W/!LV w% ԣJGCMm׍6OiSum,sw igx=xnހ:"͜39zt=3I{ NpTv__M   D D<HC ;Ѳ '% =~P}{mް^<煊׮3pRv!aß)hvm;w%:MҨU]C狜F?F98/,m`۬>%n"ŇSMG."͙6yǎ#g=y{(-mGs) ~z_5d[e(N?`ĉ~m gK~s{~_tv\ip-: V'-b]JIKK|'_ +qR܎Xϗ?ڕuE4ʪXS .8S HWVnHWd@ɔgm8?, {i4jdbK,ݡNFPZjQ:%+ 4;-s*= r@$ آޓöMkQ29gHR#6՝ïf(B_NK.-}pV0Ǔxr]MHɹia͵80=`tQlTN؞7o?N@*6!8cE)61zlnYN&hM"^G/mϨ۳NJ$w6m:}o@o-m{9ִ @&D@~1iJA3eHHdHV^ѲU5񿽡ɞ#_81mʪUf' G ?CpCC̮{~NO=%>xRttXg\Ԩc;I%50>SRbYd.B=9AG^.rށ4'>ٓ8n1(w(ѤvZ/N7ɢ"l`4#>E# cnAʦdDG1$.^}ܜkt^"!U88NAT,g/ LSJ>lz+[ڎ#Gwa&y:ޫCwݭ_܎pɹ C_Ų1)'C?hLx*'m]/h|Nˆhf4EU4O^ /㖇~(/7#ҤL4ؤg gZڶq;ӏdhɖ̖¼򹙑 (UACNq:TB)Keux{S9=TI~2[֬1[VLnϣ;^ho?ӎ oYl}YKO#V&ѿȵO,L6:T֐9)Keg-R&M%~j< d^4'g W RQ۽ꂣGP\IAh6#iw%''aOG+#*xb!e/T7T]!?BO}T1yr tM s@SNꢃ؍`{Dp>wЯv>̀ $eCC-/Fg0C֐֩}hG౤9G$Cb…x Mxp¯V9Ǐ)x_E@M 7P!@} xn @ڵ:߰6)$ yqi 9x@@+?6B'2dddT8R`uR' NS&g|zJ99~hFcf66޳w _+/'0ijw)&71(*aI۹\Gu$tb ;h1=GOAGGAq p(}fv}'0%…b^؃Ms+ڼ8oՙk_Sw9M3p䈳*|PzuJKl֯^^03dnSY4{V[?G^'~g"4MᳺoKwq1YGp\juᒚz$xLƙ Uo L͝F[g"KE&S)\[-J1'%"_ zlpѬ ?&N}#G妛 3CIBmmN }? 3oCL>4E83󢫮Kyyȩ.,wO%sïIF}i~ @قz{M Q}:Ҳ2|sš,ՙ'1C8m^gKJoI^B 袅 <{*a16I2ũ`D#8Q7<}tmm wKuknX{^ͽ=84EO5-> :b~)cvI8|cӓO c֯jU[!^d*I3ͥ2y2dg[j"Hkc/]/ 3CO3D%b(gqDo $?|fÆk7`6&I<)9sR ehTW[dO9 h RՎP|aCcH-N$?Ne td|ń D;p^PM(cEu\FC,:;EWĆK=%"bĶa831׬N1lǨ eiVAD V ?P0h v8 xUhahhr[2J<['ru!X.ཕ<;}Zܜ;= Z}kY|D02+](?fws=]޶TW!+ Mת;ߊ HHSCL#x`]I;JJg̸CZN9+B<];Wk.2Wմ5io $ov&#n A}G0/r2c?QT{h1H++ hw2ŲeY̕/mBDc~9~zs^`5TVcjZg}%yW'XXQ"o,:hXXΔ2| ɦiz0%C_v )[l~Hv;?ƺKU5PDn?aA>^i8g3MUU4 Wsꭜ~Qh|N3Yxּ N88i3m^ C'E$p]kVKC9qv킅8v)d9z_::{j>w/6u'b"VQ%%A;TU%ܶ_*q2T3ϸ6'g s?j>og@`朢9p"r5Q3on)I2777\aG*2p~Oj}.yg 55"ұu7+޿ZUد '=gڔl-IV89x}YRbi+p41D9e\"AQDi8k"֐γ' ̱E4F=+rZ[v\2^Vi-1ԳD`P.p3h Y9S-i Z FJ|^/pJ|ݛ/`ttOϾڜnWZ[e>rsW/ivcU|s*(eAHb;7M[1qɒ{^dc&m@0g8 p5&>E'yNN#7&Uiz~s'v3k)K3Ϡg~kX'R]v޽@qeH&488f(odN򖕪(uӧ;L55m˘25Nοr~TϮI+ 2}dqbuiT**0筜Fw+|q uGl,׮·Z[T1e|rb h睂.C15EFL2'0KքH^D g5tFo@RlؓNV5o@l v 2ƤL~[{CǤUV!% X4F^˂^F-OZUېḱnhjR&W..)+`K %q¸vqIa\0]\RW..)+`K %q¸vqIaddIENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/haystack-fastapi.svg000066400000000000000000000763611461403617600242310ustar00rootroot00000000000000 image/svg+xml fastapi-0.110.3/docs/en/docs/img/sponsors/imgwhale-banner.svg000066400000000000000000003225651461403617600240350ustar00rootroot00000000000000 ImgWhale The ultimate solution to unlimited and forevercloud storage. fastapi-0.110.3/docs/en/docs/img/sponsors/imgwhale.svg000066400000000000000000003247031461403617600225660ustar00rootroot00000000000000 ImgWhale The ultimate solution to unlimited and forever cloud storage. The ultimate solution to unlimited and forever cloud storage. fastapi-0.110.3/docs/en/docs/img/sponsors/ines-course.jpg000066400000000000000000000267171461403617600232120ustar00rootroot00000000000000JFIFHHC     C   d  HZB!Hи('+ eM{NwSh:_/^eU,YS~_֮J<;]lTV1}@ZBrlt8\~Xy8k5BtuQr,{w¶\kwyN6y'L[>:b6c'W.ڶ X>:xvo6zWs13OcY0Y-(ĕd]*u뼭ZB{U}ZO!ƽo n*(GZǽ%rBzN^mv;Te+ˉv,v)%x8 Tl3y>7_ly^d,|K>Q̣,HQDy Y׆xLN Ł洙nA'ds˹e!ZYSx(?sUfNd$C a?<=sy[)c_C/ǺG_Rmpt.Zoln1n4Jy>,Zp H+FzgqCU,+xo: !1AQa "2q#0@Bb3RCr?z֖TxdDB(>AI$Ȑ&i9GG*J ғrҝ,)[Yl̎sWkOe1G9qZ{?t 'C;͚R)1mK0r7N)[2i˧*+xD%ZgzH=/c`>t")qIan)nSJSiv)}qjطIR >Aim#JJV0H9rM8`eY4HhmM(Mr>Ў 1;<$ye-, 7ӗaKddjV[꫎~#?,Iņs3uqphlDv[7X57'u.Ձk´";\xzW[!:=NI9R Q&FlAPHV*tKz*SBݾәxmb*q %cFslfѸ[4y|9pnrœ:巈V(A7<]tNLgVJ e_dHJ_$lO62Qql:`ؒ"xBC 9Wh5'K)t%HmMGH== 1E) Dsz8' 4ͼ%+f+426B2֙Q>(aԟ/]]ۀ8cd}p\ ϸtK3 zH}1'?y䭕)Y9vS7n\)QI2`y6Q'x}<i)ZKN[uj>9eM(-@e"$O^+JBNuxTa/l S̥k,җCQ*g)r-8rrQ|ψ6<( EHQL>Ht="e*LՋѷQW(K( A{wPJ9R&JyDR* h'9S[nŕaHO^*U4IgqmIGMi]j':B+J|+!1 "A02@Qa3B?Gjpk]d(6tR /R VT5| !\6%&/mP VeOm˂'vgQI=ٓ3}-fr3b;ض nIxrNڿ//ʨޅ7ovQOw`ҼojKZl}&^8N2v,};CvMc[4bHRbSvp|IcW>nV8 B}Nӻ_BՎ)m}1͊-SQotcNN{e'Hz?+'ڤz#f9?cg j_EQE7y8qyCFElDSU&x۫&T8* ؓ| 5jJtDszH٥qX1W~GW%*b{?&O%v)b'9C&Ns3mFl7nm--m9ʣؑ_Y)^&|oF{{t㖼zqphzRԊ<4'InVKaGǧQ{xY< !1Q"Aa #2Rq$B03@SDbrc?Dɥ@ {#._+%Žf@yCzN`؛FL^t2tlAPZ@x˷ty+S?m[RƵѴҬjQȱ޴z֙0dZؚyV5HDrkM!̈́_ cTږ9Q?wj5予iu,r>~9~/ A,tEV2hZs}KHHC}_2&yBviv#Z؎֛\*07f ;s#[2=ꃪ6bPӖu!Qu4_w'fzp;dq[r%%=mI!n{S4B~Uwmj-7*O˕ ^_nt[.nT1ğ**y`UAqǞnrqXq[r +{O|,}į4vP߸r $H;+ܾ&yZWm&>w&h4g#/V31/0lvӦvi8Wb_0~*&vּGC5j$= YQ,YRb/cj\gx]<1qf+bTo-֩MQזrO0a} QX804-O†b[;~Wf1&WHiR{!sSj7y/ 8yh)*M)NGS+qa lqo2Fy%J4avG.o3P) Vp$6_i c􈲺AwfZY(0*cBS2jBŦht߿yTA.Žh-WPyI~ (NsU6}KXy:Ȭ{%R8T_cH糄/@ 1rkQ8ӕ!1kH5uz+َ3JΖȉ.x6 |oH^E=Ƴ+[p.uQl?(#Q)zڢi(u "7\r":WK i=I?ZkBLm}wZaKw tdV$\T 7_sj_3cw\KqV: PwVJtNwbN'fC4ywF2Xƚт҅1qKdž5|K>-"` 1j}B[|BhhJWYʘ-Q(\j\^u< j-lGM ֍{@K-nkQѝ EA]@ظjzU Cɿ WtM`(-Zӷ.*ָbq8X.eI@G KpF_0&5Kx;}%q>9&μS]/׬Q:Ε9`O 0']X@4Ð74fԬ&qUruc@#Nc$(+=wׅK9CCt`(ҫI@ztz!~b^{Nxq Da=l?BLp6bkel5I=GAL'jZh>{[]0EXV5w֘.u?X,,,<y`C5M-v3>0Z>* ui!Ckיvf\Fn1!qVdPir8{HK{"+UDŽC 4,[}W=Jr/6֖I8xK\xKsʹQ3 ȎrSIU-m*!x*Aw+n20$|Tu7bsS6]BBplQb'){ᄀd8j|5zP{y]˅]tr)N6Ms4u 5)WfQNw.ܹUʾ+?QA8*x Y‰t67_` n+~ |)OY˙߬4}"] o R+^xxƫ8uZjN8"F|3׈Mߓ$񷓻ÕWB 7ߜoǵ!mӿ _} /v9}>5)@ #EgqjoIpk4yxʎ]."S8]wֹ_d&b òqӴ?[Y7W\K\z⦲W] 輦0v[|fd&J8#6sn&5('h@,艳WFQ($j@t.9@{ BB4Nudm$  Ư"k T1R 2Pc1<4(86D4U9yՑ qp΀jj-)  uj^mxz/{Q~rc{]srm955;| n8/Z̬?Q^.qxAU˾U±Pԥ@ċX~V'Dh׻Aڍ##š>X/4EyKn6|t'jx=~PW`}YU(g¯1jʭv^![e:bJ|S]\ ٍriBo_Ht>|U -|L #5lŠ,C ka0a\jT2~O5jNj~=`Jh/3ˮj6 or.ha="dzlaU)h --%:Wp,0[O5ԵWme[^5qjRүXu?1ģ S夡c8uɛ+ !00M-'!1AQaq @0?U˥iH:>ĪaBADryҬ.%Y<#8XW@{<ഠl/9K@{6 Q";NuY˿Wu&D #}ep4[sn=?KupxӂĒ4 1: _2F0BKvwnU_AHH޾d`̬QBٯBu!̈@d4b :t.<in̋~;),tuud`:p<_s>"6FC?ː`v/ou6cfG*D pBA\a+ [;zg >na&⠒u ,h iBT$Jˋ_)HZۏ;]a9cvҠ ?(Mqƥ`g0 IpcA.$jлm8) 5HRǂ}]>HNzUuڲ(Qtr8oBZ/dT}2 x(2𩟲.aͲ~i.ի@@G2iXEXӾObB5UW4kK~+PO(wEE,ahA JuZ D~Hsrhpci'K^,)b{"5(6&^;k)Ëh7Ne pE*6]D;򳑪).o&<4cG-g!^\*}ъ]f&ɾf)> 'LB';.I0%L$J; lUͳu+អډVvuw *rmM;R$+o1Pk}V-Cv^qC2G Cnvf4A!y!C]bVrNA4|?Ff7PĥL8ʵ#kxW\ۚ9Bhws#xsk:X“pL <$%nIۯL)b}'/g6[5#fastapi-0.110.3/docs/en/docs/img/sponsors/investsuite.svg000066400000000000000000000215301461403617600233430ustar00rootroot00000000000000 image/svg+xml Wealthtech jobs with FastAPI fastapi-0.110.3/docs/en/docs/img/sponsors/jina-ai-banner.png000066400000000000000000000335111461403617600235230ustar00rootroot00000000000000PNG  IHDR(Q` pHYsodtEXtSoftwarewww.inkscape.org< IDATx]wE~IJ$"bBTTLwtz|zNO;N=bF ywbz?:LtwuUuuU= &3r c0TTTi9f%4M0)e@D,2|>{= ( (rn-EaߟW"tTvS9:@kB6 #|b16Mc?dȲ Ivi}[]׹I\PPkP(Ī|>R...vl3sF\!5wOUU躞4 3Cif6y$I)/H$~?麾K0 $E9~tH~2%g :?@afyz9.%Ittqí[$DQ""(JՑ`#DD fd|DUUD"kCsRgDZ\Ɯ13!g$i$%I5rƮw%y8 SBpTfnȶ]af .IoWK<3#p<oik[D"DD)HGQ]]r&"hBnGx磊 )GDԄ4r%lhR1M% !D>m ak)0:HH4vg-Į@vIeUQI ;ݮq]A"Z !Y6}v JuuuuPUv(jFuuu\ZZqAB)HnAVX rKA%Ng'כ㌦ hf=!؜0M3_pe%[i̬+v$!H!!ud`!Fu^U:$ґ۵`766=l4m6ĽX,X,@ RGHUUn%Z4v>z2'?DLq(LJ+l "+Ѵgoπhr bDG8*3GbQu9"<*3BRU$I!A,,Fց1ZgfB4MW#IR{O" 9eU\`=ΐi766R{߶_&H$H$kmOTWW 8b4 c=3$kW?6'7[j&HyI [ٱ qZ^&2!&u" 9倸 +Iv(9{)`,9NmMțu;ƙ{p [tg˗DDU%G(ٓޛ9k~BP>vHā@gEA0kof @]z(`R}XŁ5&v{4֚0tK!)T[{d?+X,,{TXvOQB%Nc'qox"IF!Y"q̀Shh(zxm#5lȃr& bX{NDC:l]Na%,f$ G{b;b 9tfF8D"/WN0 466Be\-M|8lX+Rh0K޿ baW6e0D )W"lQV$ Is)` dH"&6 s  3eɑT*< amG$j/2BPND~.#J2#y$OD船"BFhhh`0=$q(P#˳m6@ϥA+3vJ&LJv $9Huj+Y H2$ xD"f$YKߓ'YF"M !HX5)WFwYʮn&U:dYP(m!@ hpH0ru|pܬs-TZh}ȅDc_!Tܽw~q5ke 0 nhhhKe (/EOHG؛[qmRvo \"i[ dLd4AL='HE )#QQ>B3B Y¢7n-nHEC Icv~xz U} t IR69wN/yH(fUvD+K|mS$ P(clfʲZ@j*ʦ#}n__KBKZ,YuBUqglz1~EQ9$ 2fsh@k]=չsìh-&9 gz } Z̬K}1#S6G>FOp5<@h4ʡPYcw3BDRi3I`l9=aiZ]pmыFF l<;s ~QWVk|PHFfnV5g謾z3' eKv!:DWz9ub&1sѱQZA^A=6feyڀlw%V_&zJtdO`N;iiUUs2@tBaƆ`vANmLB2/B%P 2E)`F:m0^2AIe; ӱ´Iz-dIA&d&=+8|ੴ`-ϝseHO=q /ܳ?&ZhޒH&" KcKn@t h"59ЪqLO!(dÑ̃B$y1r[C}1nb z=Z2̧Tzs%&Wxcfѿ7@U؂w!ؘ{z9l*gϿ1yV]!2 ~679~0`uCMlI\ "TwAִ$"uQ1hK!+) $"%*AF@C]((Qah I=!'QZ̄ l*]1 < l1-T_1FtE[oy;^@ Ly(ol~-k:$ly~ޫx+c8[w+iÐ$J' doe4Lۖ`*1$3xSIP%G.o4`btD"l Bѭo=ç& AFDmE]׶X`νB0tx5kc}bO !-EHD p\3-UL`NF<m}?[-c5&<1ڰ%sN1v?'&}ØuO9j{ #_z:\q4s]H0O/ ט=zFƯd:^T)[aߋxq)/ ?PNfE>^ NJ@AwX<^oZ&Jt+C)20y ^ٌ ʉ |r͸xq4&(`S.{㪮2׀{sNo<Xsp`A6>+\U\5ጻgtD8_\{gxIyo1y1ͣ?f λt(dx7t>_w?펼{r{WTf}̓OP9q42qYtsD\&ĺ'jڙpB"~p%}JXe b`ޅ>=r0JDh֣ؖ3Ջi3peҡ=;D>܎gp-/J,^=>= YXdLyczx! "cȍa􉋤+;ˀ!Cp__J}'SDeȦ"K"qKӟ#H2ݲ:ټ&ƹ݄<ߏɣsNq9}J_emc _I_bBFb l|*wr6^9ό Qbu@[gc?1xx"Qėv[W_g>3<>MJ$B^}P)FCfQ.?hGsգkJ2("c 0heSxo3WE![~CR5{⎂d*aGQ;$IG'e@B{`1k?W ST⁢daৗS ]qKDkQS .Q'-?_9 {@TE+ %rڶTXx"y΄WA3M(Q4x .>Δ9DJ pOf@#&#j]ף&cֹ3F*> `:`h"cJKBI)>0v#)q/^1H$ : 8 ';M7}i 7(-oǏ.@ *e݁#?r dYǏw]]-؁;Ë8CpeM-WgG{ ` !ZX\k<m{ߞb2 sUWk*PIϤl[n3i䑎.oONJcfJFeN7(5(Z;<ѫOo?NĀfB叡؆ `1 Egoh OiU>'ZL 1QDZ57, PFDAI7?A'[mF3Sϒ@2\cekƪXM-X" FрKς>@BQ&æG azԀ1, aya2R3QPUA}-eMkW |Aûw`1݊'wOw[Oѧ~_T%u8iY<[Ѵy)ז CCL6؀u-ğ)Ճ@77f,>ž'>2o+`Zt̾r*\_pq;'$ܶmjg Ǐ='~/ł0}t{Í'5_h9l>cѽ^R\vum_Bdv `@&L!1@K;z[bn"rC Fh>h3[mQ<Ѐ{`ov 0& !:f |n:WƖv[>8+ PGSyEg|؁41*kW|OxiҔFphk #vșl|){)C&5 '{Mo|εI"ofy HHl BkW%yMg4naF t=쓼-Ϫ 6,[j'/ %teuגL(ꇿ@FYߤWX0*a&9>Lof0͔Ɍ3;jjPy/g$qxݧU{{EY\M9Rxg Ν瞋9( '(\ *Ciix-[={H5&XpP9 `> JC>ٴ' У(e e*: 2d 9$xk#ܲc1-z2,2LXeUTJgǁ*X5+Ś`F߈q(S SҌǀX6CGfi&iSJt]wpq[ -@hpis^7q3%yV&OtU_#Ynx*B]e)ԡ -u2 eT `i씓#&a iq`:2v?LзfQ! ?}ŲdI9̅ѣX@{2&\uАn:MԽPtFŜx3zLhIDAT# h~7#7X@3xa L ј \EՆb  6+Caxo4P5f!(w `B lS#'`DnM8G& $Skufyn8,טkG#7?"bǟ'mkw]ko_L=r,o7#Ơo(RBCSϗ_1 %3J~?`e2afQ'Tm/8:χ#qb9ʱ8mYT K6}S=x/y( nWWAD,M%vy֜B@,>< NtKx+^s$gu9~˛;~i]?5S`gTW &yַrӶ]26x4k۶kO>A>*[AZb#>X~YEr8:)SO}ԙm'Nͪ5xty X غudX!)G}2eq3V: ،N"c!%E<dgW&#,I $l&$Ì[d:Ɲ m`0dSCMC ZɢiX6`&L!!VcI(i4QĴTHLHdt;2]K뾽x564PbɟB[>5p;x6eӷlެk,_>?>vtwUL+NJNwk}>vzY2%hccyap)ވk{L <\{.jcЏzq`ޖOcM?`pɁ>f?+ya~ 8qy|PA^5K_تlA&0sö$w{>?FE{_ s,p=D7:,bX r^]|mP,+u ծ睊+uΜ84Kn?C?."PXǛ6X^t.|t!ñuKxޟ1n6 ,|U}v>4ӌ3WFlumDѶ#aVT0e[e%#iH- e>" #nŒ qSca$h PX$KLÄ́Ь#ZTtc[4 VÌ iK"`mxN'tBXib{cm3O{9ϏSc;STQ*?wJ;47^k<;PōFWz%XoRF+tр2 gۗ_W:sM8\wС!\xogw1ꚅH'8x ͖YKW 'aſ=Ӧ)%˗ FW R KÂnܫ̉Y#}wuxSG3fSF~ݱ˳?^ xWiPKTH^ }0WV0ew?^tHר^ rM =m?X7ttީ43{a6E]S0D0aj+V'qN?izS0z/Nxez8x}L R@ x㑻OO-CF^މl'gJ4]O`|p':PRzu=Ko=@o۶ y pЭk' BF͎ E}Ǿ]Ž`k bfƗXK~ㅔӲeK3FBƍazf.;}7͟, w_>kUn"بl9gOH˒觞n㇍N!uWUw?*^˙zE3 , o O +MƎE)| K5lw#gfT2+8?c^hڟjE?W5`l[YJ;7G5 _{ '~)x˽8~T^VfI޾.,>~%=` @qE|7VIffbUWʭ*[\ʷ JRW Z;o\ps2R)ʨ][e/~zrsЪ@ P a.e)˘- 84%[,HOva d oOvCZԀ[ˬHQ$b/@2AQrB]6YU HvtTl!R!hHXҏ0%3!,4&Ycm_-lp\Q[~]mj|7J8fBi ]Z (*ͭYwmg`͠'U˹ 2UqtV6^E* u;gX Fk?쓬I~ u0 kwb ,dU ]}ӰFh̸t L! lkG"!$hF UU۔G!DK%88繭˵|>JW%Y(J^%l6ttTmʵ'ZE \M](eIWٍ 14$t) /+9%A·a$`i;{=kiuJ:ۮib(ǰBw3cFD*uQFbz5dL!{f`km=c-VtN 9 E!fn$Ijm%'6n`BUU7ڣꉗP4Ͳ#ɲ̹_k&u闲oJ'hV8o\ B/>KZTnTQ7YU%CٻzF!t䪛X U98]! RO`ΈAz4l IX[J k){DH qUQ;" pU(Lֱ,Z9agWnZAX `Ri]lCmPU=p@DD"ԁ0M%hzoRqw'ZvPӑH'y3iϢfABע>cgTF5TF54 y2\$rs+i!WN>t: 1B9ذz =a?lmVlW7LT56ub]z] 0`H$]8lPhN=TW$TUc!«2K(nlɱX6%Iوýߒa/jx keMs.2-J nԶdBTK$'A%>+*$Ž-1Duģ&i4["0b@CìE-6G嘱"n~)eCPBDboyٷַ`vS]eB<-[vlu;҉(uuuugߟ1$cƖAFk4RBC5^>8$U8J$nGd9);?9 > _,K0MH$ẗ́aHx׳12 >0׾DeM6[a4O}_^1Mg=3sAjopОL>ѐFy4{"~2WpB ^LjkD=pTI {lH?,[+ck!!.# FkbH$Ҭ%P&q&9D%gzRk4 =V'|YMt-_]gωבJBS"ACTDMPcDPjres%_ZJhĻ%DmƓHT=)}Ow'_9h92Qܥ7JXh5R5O$iur/cZGl퓻S5Kr{UG.R n[>;1]S9bDUT0bJ&74 F_I/'Ra_}~ X_J]ybh96!4 )>5"6}&0bƧ<"D4RO3;zB6UR#*)C漬#dU{'{2'^Yx'@SFk[h7t>iBBܚpĿWb$N]1FZqT+Y8ivhWqD ։& &I-+#lJD8 6.īӧM_!F"V>dv[E;v aR%'ա䁪VmyZĤj۠itF,) tjX H!@H;դMXqԈI|MU4wL?1Ʀ1ZAM+rY֮ari/`cQK"Dm! [/WJUF! јI&+s7Tcelܣv6]).!F$F4vD^bA7cc⪴sD"ERU4I1*sZWa2(R#4!sUj\6Elh֛31z'z3M[}S މJ-*R;0u4/SMT_Eo2v6P!49:WBjC蜳( &3 $Xy`VH'#@R.]5ni=ΈαhT,6i !1֐#^VkI$fϻT#%c!b~Eގ^~ޥ[?ӽv8`2U4,1d!6΅ 3Y14ĬsJ$Nٲ^w/Qj1!Ϲ,}Z *-1rr4A`:J%e QdŁ:a5WQU t΃\[N11!?!AHh%I5YLe"ԥ[ſr9C 1ɦ6̈.T RXs%ТtB$&^%&U訙&F$-IN$blJ|jA%!s*mAIH!F7-ғ L:@KvVL0 j\؋ؤZ_QLev=;-}K;4v? Ŵk3{Z" QzL-֤:1:MFx OyۢNS]w{ՈEu.KPp0&6y+G6dk2"U[CBRㄾ eTyJ0֜(= LåXńD՘\ **'tW3󱱄dh0' AdfxVf$K{jV(g'ʓ8Vuumc1 oH>!ߦ5~i6ۘ)UPh;Z'\1)\+ dt%(kt:#ŝ%Fʞ DkE'CDŹ٪2k-LAhC8vm$,YIlQ&"o٢-3qW&T9ļj,Z8AqP21TCf!1<6N%fm3VI}$XP7jeB̡K,*IXLk@@r+~2|$zJiWzB8{FO"ii` &F0պ&ښ@%6 UIěK &F]⎒"16ܑĥ]gPf}V\D`Y7|&gUSΕj;BVm!qJ*dɴŬ\4IlE{C:(COml?qu$fb&uڇTFTBZ cj.j]#m ?ל4gnCjG{UD=%bP'~ӫskbQw¸J_s|2<8}wb-j̫ьC7"$3HbmZ0`G=q)3TC$x*$)W摄g.s:rO??U| [_iUaB'鎞L*' 1csz6 %9alBnrI,Qb@ivuNHdDQ13ryC9$xM^sw&" V|Z?u}tƹ_:t?zӰ*2JE|IMcQzUBcєO/Ϥ@wГZ͇ NμSbM9<)Nx7ń`\QngFL 4E̋)vbr8W^dqiRV z bUM" H,DP`6!$i3jgqu:I=}4VH 2\ͩydz/rTmb2j+7g $׫gHQ8xSRZ_ƞN@=)-T6'B$nҺʬSz?Vkm-" dTUA+?#Ht~RWI2*:wf!/wRLK6&MЍҦ9 ĈIˀ7G;duu&=2k^\SjgcS9moR.-nM][ W"cT-!:p ;0Zu)X\5ǒt&U4#.jѸ{Gv%T*i17pf !TRQmS^46gWw.tǎr͆ __@uE?}ߊ`[% &fLB=FhERФ9q#AhڴIU/i{p.|KV\_v&3xn͵t -gi{2D442C򪘾4Oj< :g7R<9!7^*%XI z\LEZ3v(0x⩄1e+ݙ3߶f0o5ܵ-|r6HR]iWob\!N:$}]M p%R1˟G9]=cj5Lފ$U昌cDL%s{;;EiQ7f"ff}\]N69dbf^Oe4=x G"-O2'#$vyХM F*#u6ۿ+X}G!t'>+EAqΎ !ivn\^W9ƅV4VfO@c[*J{hYC~tmUx?xWY•ś/J`@v FQSO-_'brN#_򠐷5k9ho_@*jfMv@,=T]1yeVIMS3CD#@Юҩҍ3u$SqXr) ,Mx/xd_3;xWCblfSLǮ17v5i'KYz5O~L,$ϙ@ؙ]nb!e"/o"f^+:(.`ˏLpfvVV;wm =eLUx(5?I^(S0L$k&Xa>]_Rz*?#LNU4N|ad/ꮓZ:5,)Ekm2P4R6ml?++ugzq6~N= a2s2n[ɱk;s6w_Y=z'Z MZNR, {O&G<:-9@'}k߾BL`}ZeO4jDHzvY%eaI&Q%:AN g;fYfKs_3^q#az>w<65P(D,[*+^is*&y Y KqV9ذ)xtW@A)XTeESTל*>48ytEwN[5T^,eP5iJDh+N[%"Ϝ-> T %vE(+DY|>+Y~"1-3Ox/W-OJk[//q~w &׏Ofٶх6w47gu_k/jd{}>~._"g qSV֣a ~dSʠeǟ?z l x=@{Uy_;y6'quכ^71~Sxg|ܙo|!ݻ7y3W}Ow}eI~Soȓ{_:fKٵ lHe+z+aޭ[ۇϘ]|/O" 9xDZn=ʻ^Vd>~)]s/Η#}Ce3_vr-yg g/*;X xKsYϼ'+qU|zew3/g5TgF2Ѡzm2ԋ3=Lur⭟;])w ݍ[!YxZOHr~r޻M}ݵ掽;8$IZzH!ЈE !{If}BIK}@w_4alTNr`q ]lUb oћxq]6rt;.i!`hrLi7+m-Y_bD=c)wvK[ |]*;ɪWs~#nU>d{FivAVDo9*2{LpvFC#+os{;woGP쾥huDEXR!*\Zhi;8N –6*d!Z<>f);)U< rJ+%3ú>n,'\~_o]__W䒤_Իs?^<p7]X8z {5Gri+s>޿H`ghOU̟ &:OLj?sԷvJ%<9\l"q0ҕM;?.)YA\>_ray'N3oݱAܳziw?G ]&EzJqKg2߼FԤk$:w6_pV4Pp=rG`I_+NS3`Ϯ[+pջ0<6ܮXsϣׁ;G~^=LRNް#L=E}wz]PR&VTu@F={yak)ɞ??{8!>;v1x?+og_yŸ@;ɱ'\*ĝױ227>IG ȁ5ߐ쾵4N=jiԝ8anπꂒV@oeR^;;pНuIzw,|hdw?xt2@yݪsCNE<'Yr4QI{e3lBn^:vo~꓁pш;_F/c$+~yEKTj )~ oqtڷ/׿?/w]|g%ȁ#G`l򄅙ÅKc/x.bO3a\|1XSni6G$lHw عꇾ?*queAZ?\r,.qۯ6;f/[G?k&_e!{<]vs_M^M/ů/<6r<]ꇋ\Yv较k/ۀ=[Wf?:5so\* O<[Ȱ嚗}B>a݉e$I/x+o ^K?[N;`{Ea-O>X|rsyC>s[ކvp9Kvٰۗl^ٶ,m` k£xaܾmUcG`FZuN/X,Qʱq[!Uk Y !,,+̱p-l~9{a?u/4pO?vvlݻkzLU_&qCma`f^9rNn{氜ZJؾv{-|94X3 Ұ'3>?wZU/8tI3u|Q!Z5km:bOyCQk\o2Ҭ|wn?c3u~c]q)gu޻]ߗ~p`>9p}B{tn>mڒ3D/x &pսW42m}W*h[A6 } ϞU6߻s'\*.;5_A>p6Q45"n3gu֊0R "ӽ~[pg#;'n ; ;_ض F-wz>d2ˏƁpiyh߼(KBlzH),ݼ`SHS{>s|yd^#g>7w>?o} zag#I;`&ǎҌ"9>>c!v0[?o}#[`4~'{YŎ{s[kg'v 4KDg7/Qhye~i~) Ŷ q_@a8w;^.6=_+v:n /}e E-.yT9<3ʡy;pJR{'4׫JaS_]X,pO dR*Z}y㲪 vE6ebhZ]#DOR-AiO&.eO*GBf ./IK)ZA'0q|@%4uEvNSi;=83+oa_pJ!fJizB|a9 Z~L1z> 뎢(]nƤ3ZDz0&A5ۥd"m%ty4kl?҆@HCu9h6caEcqPBF/)ejhRtyfOi%{w$Bڝ[8|hэ+*HF*[׬+*!?AKw3W C즌WM[*.Z-]ȹDZb&3^H<}cLhrAcH?#VXo}#־@qzפ\ 1sVpĚF  f]4l|sgWz4O3H 1[$}w%l'ąx`Ֆ)߭PP#L›UsT"}9FB7ғ5 %7*h֭Rta:>'sd m5 WCB[$v@.y=5)tX;~f^__-OKPwݔk;D=ꎊ05}{Uݡh:O'cL]vj$lie-I|Ijjsio|`™1g92}TAw,>bFg&,z|ѧxpC=-$ ĥ5t'Nҭ\> &G%lcTd2rA+"C9B3,,z+A.ͱcwFﵞ,V߽˅+;v1 ,sW1(}\(cN?!V;rCCm$mu*(׆_ϐn -[;L+zG_OV`Me[`3WVYJx{nuh=rs t}NfϮUUc\S-*ibJ/+Sytlh SS `I5 <93h ę&jS qֲy;ꕺpƗ NSf]I2]YP,a$|U$8$OmW/*hO="M&xP 4AmZ=4I"yWk4M i xƒy&=uUJ-T*m14d&D@_f1Zvj5 NTr^$Z$r(xU7}MJGA}S!O88s8BLĕ4f1IlUL]F)R3-GИ-6d4 b 6Qh`|1)*v@Zi ֌^"̵ֽJ$*K0(噧ќT2+^poK\v։$B7.Y)Gѿ‰uoU0y΍3#@ރ,$NGC3ǀlNꀒ#p S/U}GJUE}Ք(ޯG`k>A{" lj{u(J#ZZJ6[HRBe58{EdNС0MJpQ0pl@{rj9`gƃpiDQ1D:+]~Rt3 X9S`mӢU3_3`toȏ蟦\ JҰIK^QQ TDg<М#'G$Kyh~&Kh&aq{ԡI932GV|\E!A:4[DZd+AMMb꓉F `U~T]ٚ 6 х6/$@ڞjJ]CupzW @qjE%T:!s%ݩ]I ?g:N&bcMy핆(]Bp&^i沆%ҥar!X7qD!V(j#ZZIsV mD%0 h4 >CsCh Z@rm\$.ȌC 4!b[QOҬBm^x#;jp/ZZw35%C_.9NxhOCB@,?y=mg DA z=qio|4MCU^{TPI38\Ťǿ/>A1)ǁ(IBoTd/Bw,eqaJh!UF4ɱƧ?6U`g49ʂ:Qey\JtIuBd2!juL1]qWcTǀaE IDATZ#vG!A0Ar;-ACM,ʼnJP<X_J~63EjRz MF^"Jh2[h爗-ZO+4A3bi.HذH= 7_͇g8v0wS*[~v:XVM6Kɩ'6[;%P`,K)j3='NsőD|xfVìus tRvZkJIp(<̢(t- *rԔ!4%MJ.06{1$m"! s4 idH#1֖`,2P]3,̔Z4&JI\*AdiU,A6ˉqp=\M4bm{ =l}ȿBIAFR -KKc h`*$#Tyˮfn]<><>l9ߺG|=&<6ُe+5UI2 Wr^Q/X$h& 3犑RSC;Wν'ɓV]ceԥ9R`~-QecHYv 󿑤B3ٽڡ@IǨL4DFD$5Ik?VmPV:B7Fwkm]f,24l^^i)lD{*1hs՟@'A4sd:2KPIm#,:&*M/}:sݡpZ*H'D\U¢Zw#a a@ӆE{h¡;yF{b#z>_v׀Ѳ]Oh B҄HSU(ܫ+Ѣ6,6ULV$O+ðb:ۦ UU8/g1b)(ƶLtIҶӎD8&L##@LK D˻HkgR}V$n5Mp+FIx7HҪ4)XA  3$Ő&`&T]qјwWCzjd0|IF{m\S"EU*eC%$IkKPP{VK Xkr]ڹ5;#l8'*}Y-ZJZ"]A,[h8Sc)_D4CZv2hI"]Ԣ5{Hn.n髛[j!wV^ٶtLH(2@ ɄjS|ґfUQdSH*R i7bD  PZQ4o%mDJ@hӵ-F9^/7_5uG*!Wd\&ĉ W*u6:ȄD\͵ jlt|'kAU'N \,^˞9F RUX 8wʈv^׾rv(lҾq-놄I%`#YE^սg0=qjdPlۨGťhrk^-3ť)%=PIas˰XTQ6I>bV#rڸ9yXfNEEit MIc5AnP .ۛ7%߉Y'Kz`"BxmhbI1U2QI*NgSD ̷!v01h a1CA3πA60mZ0iih4Є In׏Lpb;k|iP $KT^b]ϲazOuW83?x(DZE'K~prz,s':v㌲q$zKOYr`InŽ's- yغi֪J싨+S $*@E轪{cOr ni#/&eJK>{Mj}n)MҤjL5w%ŎI7&݄.Oƌ1I>Fdĸ3/3F#Fq,F,.9snLɦ JYXESqAi҄H#miRV8 )T$I PeФBf!-:rU%j҄tˮ>3K 0(۹4C(Nʛ@3TƣԶ;TT#R3gIN Kø_9/Lai]@8sГФdR  Rtc{3M*JRY9- Hh[)y%cvhsƔMq< zpz]a0e(a" ayɉm$U5Fs8Mb!n묌vĘ*x1D&qBE&]d#]h>r=v*r#Ðlڦ HЎ6mpa0HGM#  6>ae64B;! SLBٻ*$ 7+W$N GTHW sAA;PFdFD8A'#pH\ShʃyեMpup*6ٓ92!IY O9s2onG-(7(O+'R&&DE6mLzTdiɉ76aC,.F-vL.117fe656 Ql%;-nm٭2k2C$_W7- @&YDvyݢ x@+e xuL2 Ç5T cK:!e??xMtsn椛7Kʻ/Z7xGzGF'3c .bJOC+|Wڇ4:af$V JNCls{GNv1_ áB+z\$Yf9U76%MS2)BAJ2(&c<Ɛ1JF ,"Kbt#'6JX+MiDR5 $,M12T$ ZvN/w *P4{J+uNI[aPtCv$˄m]g ~@YNc%CR,eB5 C8j'-76t9*_vX]&Y)'0ذ^=| k _ܬY/6rG)Y2fq-ǢZ@2:_V*4zZ+$8~c_tNE={R<1|M{SL%tT"9'la*[{Ɨ>y ^7d@?O?Gӛe B ht ]C<~u .uk+N>mRf+KMR@ wWKԳ셴uV"*UolKΞ6-&- gҠzBV6&l% !3u6"f[ H:C4OH, K;ЋhCYfV"@ɀ S C$dg0sR24: tMrM1e!HjޣB&[ b[5:- "1)5"o&%Ů/snI˷ |4Ͼ8ev;g5FcPZ׏E*2F,+uLrח߾w*X N(-]SqݭwJY΂Vk|L#O)$3FY(7q`9V~_/-8!ՌG'+{oDqbc528"Dɧc% ,VMf=_memf&!O$qdd<_XFd2R2ݒYolȐsjEI\5H!Kr y!:ꥱ2pڪ@ X_ha$IY//KVAZ#d=-c̫G?mti`ֵ m춘NHvqᩨC$e~;-H\If+G'\zm]ᯂ" 0<;&KRf2=-  Ğ& Ѹ~o_gϮ;oBk&Ś{_.5^+~ s^b 7ί7/KS2|W|񭫛_)۶Ԛuno mz}RJN?f|9"TsFဠQc|9r-0w2dX)ZהOIJJV%qC|,󡕄Npd1bLp8g&C)hCFGDXAl! oeiJkc2D7xea](VR<1d(l>#fu$f~J-*e}LnXDxШ;YjB 6Po7pw~MP!2\'5YŽH N<ҔȅK-|x՗\tJҚh9?BHӨ`?dPy^ThPnKPQ:c&>{ 1&YǕ;8X C)z)V" h4h z('|J0+,.J4mhd~;bʼn 9BAX$KS5$ Ye9@" -VXq/y j\=H-ě4J%,RZ;Yi*6;8#T8($^XOdK.lb\)ԥfKج39*8I 4]˛|Z0{i+?lhZ WqޛL./ݗԨVD uQUxۻS)э%ӬU:>B Xޖq.M8S,a}7v/,'蜞 I/Ul7Ўw"/tNIdZLgKWUl)il#A,N6.u4N+3`r:y9՘$6P44&KWkn)s4H ̀(O^SIENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/jina-banner.svg000066400000000000000000001223771461403617600231600ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/jina-top-banner.svg000066400000000000000000004760711461403617600237630ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/jina.svg000066400000000000000000006564231461403617600217210ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/jina2.svg000066400000000000000000003244451461403617600217770ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/mongodb-banner.png000077500000000000000000000077141461403617600236510ustar00rootroot00000000000000PNG  IHDR4(p pHYs  sRGBgAMA aaIDATx]]l>NllH'X"?1cJMHT&1ƑV$H+D J<$T6qpdQBkcrswֻ]~ޝ;3w69g,j"4:QN0:A$wdMAhXUO}K"UP61SΌ51z/,1&&'钒?ȣZ\S9(ˢށJe5K#{tϨ葘׋ߗ,\D'm KI"kfD]g Sj;+/"uBm%n"75TëKObsLG2"a㾵w7%(ݛܹ?&l~B!ᘘ{S5hҥԠ,"8?E޹j9ST qE2-*ՄM}Ztk=sGh܈;{D-ټQ"öz fH&l1"(omBFP5K~&H` Y1V*hiΗWBdi\{Z?$*+4G؀e .enz9Tt96ET V%HZ}+ߓx\Kb ϕ'y\q:1-pMSI2>%mXF}=BZ]_WH w hBrO]i.Ʉ504$~0 ӃԶmhd@޳r l,@-T&o8y:F.GlVX5(s,k;q1#kX_,rmd\$ZT\onb^Gje)^<9V}wbey'6n ;S.$j{6lowv&=_,c+vC0QJC0RRëc5c WۤWid-Ņ뮥UWx,6.au(B[lxbFV, +XOO8bx3J֯ zؤ& Q.rØ1K? $<9!*+3'Mfbk%z -iij (ȶn/B0?a&Tp oHFxpجX-m4_3ҁLg_UPE1 rC[}AzR9e2:tNB6&:ռYaxBT my>& WvX RkRa p1#_q& !Il:cXuYݜf"Nc<#FWŚrD.HsY +bsIS)l q#n8VI5WkDpl"ı}M28>ɄC]]2~?'cȐ G(<(4N}^^V+yć rX %Eh]_VM ST,*Y$7H}` l!"a\t%,e}q6{ Nc /߆.M\ cǶG#HX#mwY(PXoPezP𳫘`}h}ײz.<Ha(RNi@P~E{@ˠk-* 7"nl9/BuOTI^am VK^g'k))ů V+cɂPQ@T](݄M8]ҕNxNO<+B8 @BVq†W<=VUIwA+. 'Iu< eqK"xaUۡ^ ~sf3R} ?$3EZ}=l))fR9\çXٱ" y@ y\_`cyzzubԧ^d+S/9U^Pr(a7NQc1/5ԶEȨ#p#m*Hk;+֨eM6r0@P(,T񫫯OfXd5 Tdz !L{0fЬaPFuC[ڨ=L3D1/hmUf#;!z3oRC mG Del*n dv󸌊#~˨Y(AB!d%[w[]N^VUs0g:h:ضF{AvFF !؆`r2H xl"hzؾ?r i^L[P wQ q.>YAY]+(-/Ci ;BEpv#Srz!BsK LPj%J+ʑ8btK^X;X!KPȊczN!y=qh˅CgNɱaCm5.V#+%.# ʵk % {E"U2h'ai;ziEw;CuDS\C~J䵀*t)z`ÒԠcјs-Z ONTWg$Gk}}[ )n>ǡ"` F#V@#a!A?w Ld 8&Dq Te*W5naCBiE[":#$Gv/؁&$PFqhٌhBOMB$|K(F@u8(L=Շι5t8;3ssz_T<^&6#WDb/[0Ltrssݎ-++þby6`;֭ɤ9{dmfhEvX)p>D~߯ᔔN8j>d(233tg~QZVǏmB^eޟ3v۾UkeK61=Zjw 땃Ham"QʟMъ)bq$tMwbu⼳ǪaO/>f1!Xa(NZἜVĝ#xm_xa q7~oZ{s;v>uX_k{O̥>`­­IhHHD8픞!iKx/.dV~i`$+C:GPF^ <v 薏 VVɅ/~W\$/ܲ /T_DB8y;^~ -ˉZ썐$Y?%~.buc{-o-/V0F`HUm%e J+pwbgK%&oR:>xͷқB:GQFf:bI|юXƝPqҺj\sAAØ:)}ri\8!\3~ԆN$\q`E p{$C6GGDOdy_ŋ2QiZ{^ӦHM]ςkILX)c3}WO^5x|[8{%"LfKhje*p,C{v/"Zdc6C5EM;v4zl  qO )RIJuˀ6@>7JȫtJ$0%y$FU¸lݲuuzx~$8P501@NQHzڮ*/o TߙqV䜃 $^N3,M0;OFb`9JF.glȳuU'2Q$paؕVT^ãsMp*W\ cF^(~,C< Ea8~Y}7Thn*sOg򖖻db֠Dhی,-ZO^<=>W%#Rx24x3f^{M[3d7EkaYD* k{L.qw8:؇~~7Zq]5Zs)} wG Ou~qB݅2sP\ǢrpH^ hd!n>maTNl4ԣF M&)}o_ߥ =U ɉ?<ѱÞ}}8,i4HS^.b 91UZ_7uqE H^j!ocNL0G9~Ř6"́M }&XҊqt8oѯVcbڞ{ 5GP zwq!s<|KNl}ľ.7E4!r\\(jUΔ;y;1OLMM<*4۸QzsG3;X\h=1g&̸:;f eY?N6J ~8눢׿xs>M& Q)ʚ(u땊Ib&6;#eD %3+ NGޜqƞxoQpI k>}bZ`N CvQ9;}Y6>%l 5/~QWWy- Ky g KJ_8Mb9|D*[^!gy?`*5ƂWJ{1+|>ߞޏlB@ WsD.yՈ9F(d{Qფ#R)= kߵc)IoOfEΊzr,zk 3KC#Í0[KH\\淚&׈VVE-'TJt8g_zCJZiZЊݵT h>k>auu4e(k6?J8]K0Σ00cϖ-{eim -Ntsii)&~0eNnc=a//mR+'=<낂oJd{i7sO6*UbI# i;I OդK9DX3>,~{ O;ce8GeUT"!g1R;797@&ejҲqY}&Wpx&cqkJ7u~'VؿybQL B"zRaM̾(**e_>[*aySOÊ0PtuA,iP_ qk kpUu Wв[BIu"T%wTgRN0gSZ]fq ט pyӱh(M(7 %G +E63>-!M%uH@m퓺)ͮ}ʒxMoj vrg=,0,8JLqԟ{&abL wX%;%js9^iKzB OTw<ݎ{ |#u&8<21.Le겙ErBST0XzpX +1aЙX{="q^jz3H"[F9ȴNnD!8e*rsT/HϞ :U^uPqާ=Ob GcԦS}֚ #-/$⒚\ 3۳ &ZnbPuCw*r[Pa+jׂoW-H̸>^⊾ZwZB=gkf7keƦ}fIg{ /T|VkLuu5SB$hu6u#۶g ~V+pAC lxn^]oK2p ^->[5ܙZ8G EK!-qrYtn4<ސQbDk0-"YpՀT:G̋"O`gbWwϰ W4 'X0`8V;JLle}|:ꛍg_g}u|ΙՊ)8&#]\tb1QJ_%#U͠#GuHky~ [d? ^UUp4i1Ģ(:/BC+Bk =-־n;ü6X=";+(/l,"E`Khߥn^qE%½=n 0# :<Rvˁatki7PU;82FW'D;x_X< 莚}Ċ&.gP[ٴttAYY܀Vc-ba}D+ESdPemLkOBÕnl(&sTăŨa*'OCX}X%wTVfL#5ˆ2DJ% 43WǺQRgߏ`QsN`=RzxtW`*)B7狘eW_xMuN.gW 4 &NM5!^oʳQa1&SVGY0..K{q3{,yvޣAcC\uڣL0IL9 d&WXk5x -uNE$*CKV?K4jOb僁>0 qD׺ z$hK+uP}6*RK;- Poڨ[%$.Ká2HfO{b㜡bY5t$`L,yfJcUz PН~{s\% dɅq5å  6,7ը1s|RM9۴d-Љ "шqܪKQ9"+| 7r PkUYSP1&L(|h!ިr%{*lw6sVz^5]J&4Iuixlh=8A{Z~Խ3~uS4Fa1*!Z=B]xϤ { Ա+S "h\uhA.v$g=Aq9IX7eۊD:d{ s?]OIp2[&"'Ų"2Dr&02!>ZNT}i1\`=EۯPs8ǑV l'7w8^ɰ3R\YW 4gŽItCE \ˌl-8fXYgX8>u 3r\۩Џl L? FWԉx+$pNCtMNE^S*u8Ʊj%;GDu%j27f kya>RRe/vkw?#7#FuTD lGƩ=jo)uO⠕ ƌ PS(镶AC(,,Q&dB|[ܱ9hBGQ`U*Z#'y3$4og|*]AJzwg6tSWe9BRÂeN:ᖙ7)UcM1%؆ 8H}=Jd/aAס7!V/9lFC2!g@PJ5зo6@mmw~^,}-*];{o0-(`*e^^B/| G}HJ]="ўƝҡXUT@}pTW a6TqB /R4uDwJncŘ98cX /:h/llӛZ;H7|8rrԶg~μ* q~rιشc97߂"9DyD ճ[7l]ex+N0~R˴<'kclai M`_9'aa. ,_ Qy)OG`kB$Dl җAӠ'۱>; oABU_nނ͇Qi7]ݻ1C`bTEyj2쯾XѣH'Xmܛf(RSXVQI Jy fݣI+z# [z6` Gn;Q~ ~,/^Z Zu XAޫ$o=,F?L $58=5 GV4@֠t_!ƔjXQe!+"tId_#hwc]Ʈ<dץ9eE4Μ/B0kNmb4-[02_o:]hց+5 CϪwt!@{BM\ųĄ 8Iյu>;a2W T~.M_oi*y $^R1ZiPjw[Xy VD&)-GJW7.&uec cTzm>#l$$vk5šiΤh`M;%k3A%X1{kEenؕ;wx5~c7@E"`ObA/l(\m%ecRUmAf<֔!miUY >~Oŗʙf$b*֬)ôr:u R-7".<򬫐xO/ɽ%y\"~Xp<3?#7XX ꏞE턱Y#FH("Lirfʪ>/:Z3Vzb(5c͊<ޑ8j(_כ-\ǚ3v.3LMw%p/\ gY,BO !̞Xc#~e=hJI6pNZVklP$qӲrT:%C恘b8&PO8Nw45Q=R{~CV*-Onf5urᒦ TqnE D,}`600:sC\88mECs t O2/UXzx&hem{A?%-{"&{Y ȷ糙)-lqsDAªҪ0#͊j6I@i]0欫- ܎wNDB)fe"?ĒPdo0ԟ-)]ʶC;w~j%/+_iӒWl@k@͵ng..aXjQi]Y▂3f-ʳi}T=bgZ8ƒJ+'CMڪְFĝ/?Arz:=zOBQ$;3=Sşmlgvu#0MeOwSd'3 ՞91 քpJݵUdj*+G*Zٲ;ad'p["n- vF}3q`Nɑ!0IiFTCwmvo~Ĩ+: h>[{z}6Z_ #kց*4F 8p\L* dX.)-gqEG٦nhS%9ʬuR =׿e.r͕'p7F*i>S @Y͘Gt{" D^"Fjp aUP0S$I`cq P 0ف$hk=qPUO1IENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/platform-sh-banner.png000066400000000000000000000142511461403617600244470ustar00rootroot00000000000000PNG  IHDR,(DpIDATxwXfE1`-h(-6M$^hj-+*X&* DAPcqF>3sfg_{̙@@(Jܝߨ7ں[[7G0X{"%,돝LFӧoT`f\=+7[yIZ{p):5v47ں?e>Ctj<\J?}JBrrG"3گp};v|c یy kf8|~$z;`5Iݾ->n]baY` ޸ԭڻk 5d=+ *m ,jOyWٙDd Jr,RRhJ6mi^|u Hbl*ea e3lU2yr9QQ,ڱȈڶ,ȄQQ|>hp)8]v?FRu}=gǺ  O.A:P( ڵĴӇ`yͭޱyd_32~a/!yvd.^~-K4ZlEO] d(ܼ?}S~ОvՕ˝d ʕ~FaݾR/2X~>?Ju_'y&:z!I fݱ{} ZP.XY9'm_ibS-IaCg xpo˗2c2mmko_jl c!O^(dde2ttn޽ׯܫ;ΜzeӖ,¹Wwԕx7vlJ F>}ߨNܫ;o)gK4m'6SǺ4RaR5,oLqO.y= $0`Ӭ,HNX[QU\EVZ>6V8N|R"IXs#!& dlKi;&ddfRɕ瓕KCrLMI׷}56k 4t*я?uO0JeӈOJEc7-,w ošjۯ?s?n=8{$9z,ٹl Nr2-De+*{=^C$$ЦiR:[ItDv=³l[G:Ȓς <q:82·7pB7){̴Z-g9{$f[C';KTMF}m؆Jfƨ1չ)f oZրUd,u)=+H!&@“BjCAtC rpCM;V M8t*<Hĩu;Pv022Ddy|V@~5fސv6o$PKfñ5Xu QIM `=X[ZI)<~L[AQ#0'/_B-ܼ{Ƒ}X[X0q|>8]_ kX뉊ÿW/?HĢ[ ~jL _K'&RNmÑ]ω_/)[$ǎC O:$.߮YMnУ$P&`*?Ju^3YK~"#+H8LKr?ob11ҹfRbd=F.DžkQUz GWw9qAӧa?NOӿ"9R?s6l;-;roz!Uޞ{8g>)gѲɻ$ g%酑DB`ѱ8P\Ec~!Ys XeKZ{4/DwN "e&Dlfow<`ާ GSݻ[aً߲It}K~r2uô4FK굜ڰc##V0-U{v)_  x mȫ\_-C+VhPdTN"7?]god2vEղ {V;y0hLf&@Ttsg[YfXYJk$WT;mT)i8֬ Ԕ|*fDЩU+j>;Qqqx{O&%OzEyN6mi۴zEb\/Qg\U2d*$?z]-o΃GL;.D54ɃKoxҒ{)x`Vr3u~; ={ ={6bsAw ..Thc5em}:w 6-YaZ+uАWXV4m;}{iٹy*CCCuaT7JGbΓ#%RcVkY99I$e\~}'O`ceM?HOO}zz! QKej5CfASnU 10sM^\ iO3‚KĎYs;g7n+6_i{ _EOJnUʼjIQYFV& %J|oku-]=%꼼4;߀*z]e#k!`.c]]@Ya( l hy3 )wF03+SWBQ"}~s#GиA<ݹ|x5H$‚pkr9t@¼Tw'GYJGV8}7~]' JQp)P("s֬"*.~3x>:#;=aGpkАu8||9v>63/[+g7m#bӗ-?(>Dzۙgb0c%UO,q+{,Di%! ̜k8223/iKsF4J%[yUXfm[Uzy?+0e?ff?'߬Z;2w K=[>{rϚCZ;JOJ?וõ^}Z OcʻkOm[;Cz} nߚRX<ԙB ~}ٱ<2S šfMBtGc'e ])c8[c>Ȉsy<֓q^'c~K5z8:»{=EV}9㢇T% II֯E"t6rpq݃?~`X^URj##4s&O_712b|ҩ jg %f~rzhGvM%^@kbYBY@g&jlX1c&g#tt=x’& Ԫ5A?,FB<<[P(Ex{$-_( "ӆԷ׮Ys u'u޾C@?f7miGb&bhhH֭i׬9AtRɅ-;hꊹm4*O,eLuL 7h͐#:z3ܷ75lUТK#tʮqzj2a@B`ea9VR.V̜E:uxN q>k&^uw?ҿsUB v[Ctkq[[oቍ5k#`vƻNZ/wL WLF́ '`.b.[2#|(,8<ݚ 'Ǻ$Oe&tk>1ѯO9u2_U`i M܎ᡘ QtG})h^ZM&a[V5Lo^bi.)FD#šnc(]{ߋ20;yFrrzzgo2>G97th:˼7}>dHk&Zr ~\ehzVlZV.'0"ĩшCJ\+^<,rٜbظ $zWX֡NK4P7GeyXqmnLI\̕+mT?% P.=l*?-DѸ&ѻQ4Aٸ*ƈbQ4+%k%V`"#+ 0u07o^a KmcnRE2hTۧИY,*@Y̑D"v2+>!. P r ~uPjW?r|Waq j@+!#2rcfJ*Nc(F#amW0J4f/Y7Vyr9'/_v_K@@Rz^w$,SNavq19t9hThT݀xZRruk*3<% P)s2me쑌] gF6ۻJm AwJ,$BTTAjTEjRâXU>8K@@DfL HE:e. vyd&fIENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/platform-sh.png000066400000000000000000000132231461403617600232020ustar00rootroot00000000000000PNG  IHDRdZIDATxy\2#;@"n⒊度Sou]ov([nfiZvRå$5$LD@@aq`F~ >22:~|999{uS&@ h=B #,0B #,0B #,0B #,0B #,0B #,0B #,0B #,0B #,0B #,0B #,0B #,0B #,YTwiDBA 9WJ] !`[vΌn.]tBm,]mb(.?[~}?AynnKJM{PK!a/ҵ.Fѫ-,\hE{AA2{U#( .<ƿQzm8Ν]s!`E&覩p1Y}r9k~3#zs~;XYjjȍ^@`j wl=Ù@ S0k8qv\n| '@o!~}Wg0kqsK5bE)^n$'qrp`ɼlj  E'1& ^" +=b(݃-,Dp:^jc" B%6xAzbRϡ!.v)__LFͳ>uFX hj5ՁI3K R5g6cÏ;9.QTO]!Uj%h4SEW~L&caan6Ks0Tm*#mF(+A~]qA8ҹS'8쉓$fP[/jn@YK,Wׂ*Zaרz"{- 6fPr3zUE ,4D F;5D]]}N5YZk=@x m@,SJ[X@v~GAq1ras/`kmBACdr|U*mK\w m:dE!%=9;MU~s`=_O|{ow2ŕO>L)\^3>>m*KQeΜΎQ"6RMۗSNR]SC/NN:0 [VڐɤzV '^!xj鉗޲mO׊tWfˊW’ȞL~@Jϑxtmkee2\dט1z%`ceVM;݅7GN myOžm0RdޟQUWK m[QUWKST =Naݥ4EE$92*2PUvY\Rm tI)}b̭2m( ]f} NRZtܥ /OJWlJMx F7@pAIԕ -3 _+*"3Nyze*+ٗUVHD fPx/J̼\j !~~zZ]M$ǧR$-3/o;9q,.x4+*"!Y6q9f܆+-c^|ffLo>"BBٰk'J%֒hϧ2󏹤_ٙOfj(:x0K>_/IG%)54zNf/YLg7wfu_Q]Sc'l ~i|miR<8?MR%ys,x f/Y,\9|J5\ʛL?<LN8bww.3d2?}| %fP_Ǿ{U*}k ݃)?d@Eq|6Ήsgput".mCYkMӡ{1nPL.f;1ۀ,d2sZӧ 4J6/u1n0&&j0vNgg͢e 8֮_(λTb̠(T55$5o̙c֨d?;Cz?ٛt53q @.} щޡ8۵+mk u 2ٗtū>L;Ηlpqt$f`)="lXS's%O#ɘtpE_ߵv/ؔ??EeUkmeSO_l/"_'Pxo-X&f۱mKt7#{Kvj9R ŕb܂BTV)9X= w{,|b6nâ۞~h4YIG‡bC<+7}˂ǞбU5,32Z[֨@4vX))%ח cx ůdסl~oWs>۴'KϷ07XF<]\QUW)')oEL^Q!cc@xK>}ϓx˕)'ue{0fPyEE bb[orGZnb=5Ki׮/կ/F&͎:t}ؾFþPVQk5kСTUtA=~0f!nGsbp RXS}=~~xypTޣK*ե!t&}vuN5ǵ|=L=M{>3EǑ驳5rг'oHBUqjf2GZWwG: 8n*-N@3(O6ķeZǖӬaױRy=`}'y MNrds"qۑ fxM5olbn#"Z68ucxhx81TV)tqǟd=i%Y[lT&SP?݇%ǝd25 8ӧtN=#Jl}N5c1j@$SGLqOK:ʦ:ZP+(Xz-3(J>1a"]Ä{1/y[KՅT԰xէh:L!}Ƌ~FXYq\O"{>waG\bk xc<*U<[yz1>&('Ξe>25 hc`-ͱjmȼߤmxEy-u;W6>!BAoz>3 PUktlj5~ΖF()S>utmce2=K+8Q\щ%(ϟ) YW\W'',Z=y]_^JSVkx瘾eCeҬGo~6{_}I X7G׀d2r T*7>1Fg7Hy2ٴ'nBƅ ̝2{?}є3w4)qh"BB/KB:{0w4Ξ&aiǚ׵ESTbokǫ^cCH23Pk4 쉓q1 EXW]73n qwl,-,5cYm+ɧh4yy35zp2w4*+tlXNCEjs l{xrcXrPk4tIHD`ƫ/qX2X3}d\@DhFySkRr'{4-t L2*֬՛σS9~VJهz z@$1x046ln vۛ| --,pqrÃWa7byߒ O8]hgNӴ pwA>/0n0F<,_5 .v{,Dlk1#yVbaiɢ igިjj<0H>bJ 6~ZfOĻbGA{Πۭ|33V~{^h-.UWʖ{&3Gǰdg ݷ !`Q;6}[X`tB\'jƪM-GF,_8vģ6 )֤@ЎZf,OjFF6 -0 r~t͍7ހYGc->M;uf<퉅ὐwg֯4 Re8;tk#,0 ra[d v~ާ!meil,wȲΤTv:?',h_!ʭ_vfXnÏP6Xyر#F7D"iYaRIZCv~y_4RPTT`anN Zl./ #"$P"{3w,-=?g<> C2n047g'ܜݝ:Q\Zj\!`p;sqt?ǎ}NyBC?vl'V9L'޿y; d )ׇ(Xsw`o7nKf a%3ʶakmMŕ+F!(0I8/~;J[`%#ãKXZqE2/,#Z֎r[U@p*̬v+.]t |r=:sN#C.S8ZX`~JM6&+>/r oWs'[ê~_sjx%(D&(0ͧ)VG/"Xs+Y.<9jjk  yǎ7n+8::g,* _OV_]S\`pb HVVV=,:  ,pP]S#?'SSؾc)kkmLopdRr2KK2kkb'N!`QJmm޼++\QShږ=[@VQVYF{Xnw5(RR D >X h' ?SHŊR:ݥ1 D oS%eeMFq.(5ul+âK\TTŋ׆aEiy9O6B`90~\v>ua=08O(\4),0 "l 27z 1ٻw6EaF ,0ldոcFlSY 5\ '@`d˥BydhoA!`lٶ+6{oхXk-:tjnam˫I!`QZBsVr:j@ҥK=e9>}y/ Wxrm*'%J Ҥ_("a{OMRpo&턀#O'LlsY'Ν̌O@YYqa5xRNefҵV8„-GDkP^^31Jy縷kұ'IENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/porter-banner.png000077500000000000000000000415541461403617600235370ustar00rootroot00000000000000PNG  IHDR^('r pHYs  sRGBgAMA aCIDATx}EUNL(AzF@ @Ϝ΀ 'NO1{81 QPHErWU}vsַ{U1KAKlҡ VpɃT%^atɷMKVԣ2_{"8B\WsCȫ|\,slJ $0* VAQ^^B99gVBo WZu@ՠjjoӦcvlر=E}U4"6QMY(P]ƺLOq"pyˮd@ilf!įgw,}`%t4K S!"Ɓ &BF`вxbfR2 dF 66@!(-D^GJ@a<]ѤK+sRx(=|O1y`J ]-Z=͞Tm&$$^p)JbԿD\TLp(sRwlx8s*,Iձ&*`30pvI PSqToJ3bl^T2^3pxPpeg7v `إKd_ĥtt`ʤ݉bh^Bc/b0 F9.,I ' NqlHHfK.]ɲ@ͬc鯱6[9p(Ĩ"FB;0P`U HN1.^ӷJ%L+ , 2c>x>CܪS@i{ @1\ydƊorp-x%ƲT2sЎE*,iPR%;N}ifi2/)1!J3HE:D xwda$-dח)SΨEFj?1dz0:\.b˺b"Nxrd[%݂6t\P1!T//yr0KS/+* <6]P]6 aLJQqU2JDa.)ey ym.ҸV*L St""iHr𜑒*+aCHW^@@d McŎʫb[ו 8rj3Z58&ވFa9)|D0r9$BuqJal{4b1d3r"!צI+KϱAei cZR $m#LxH y ql?wU"W7|dNz*KH4. ҨH6FcP)V}Q \.WR-?rOEo#ThJ h =ި] ҋXbk.GHRZ2/*lw;ˠ;s#IC}e`=P4[pWI@/ /X7dͲЁfՂ{_KYu@ȥ܅] $d8/Kl إT:yDzUq#5T iPUy Nq_3nx.6$U|UOdJ D7xUjw%R;3z/ AEiBp,3,ʌw`[+TY`euC9pzl,'ZADYLȬ 9`b/hYfvC8=Ε)WDI 6YBW*Y k8U6U LSaS,VYե6.%wAm *:+&\̭RUTi/lwDyLENCTou%uj]V~|,wZmTX,D)9dVh[U"t~ Y`tì0J%%ܕ7űPXdA@( =n4k]JNe i\ZA)'l#ְ;O ކ cFj"uW4/EaI?6lq6s d`)PqW~'zӦ-h4s0p0[>3T)jժBz{ªUk`ip'A2˕|$",D&7ҥqφÂKI3@UAUhE6 +q8gæN$IZJ=|u@DJtA.{Wpw:m&7[{o?avÕRPVOT9-Dڡ` 6HYqir`:V*]Z RBέU1gFJ >J*nu`ͨdеtrE@װws n'*ɴ$zCj`G}`/¥ti֥wۭ.{NG^|՗BnLJf`lj{+u"7.b7> ᪿ^W^&MSG%3ўEUu B~^5l0&n<; ẆMռ #{+4 ?z5Zg6=rJG0a3>]8`?o_Ǡlvv`v|rȁraV_v* f.9_tݱ ǧ8nhQKnjx0ӧσ ۶mB>QQ Y1jR6r#[!!F).P]=t޽Gq !ʹ%^}e xҪaɧ\u)b6+\20 fvs9 hy U"kׇs[-"5?@y8N`T^Z8 ,S}Чϫkς__ ‹/daX) &!j?3dݡOdI>Hf>ޚm\M"Q(D23[n0%vZ?Uv,R,Ǚw>S֏;矩j nd-Csx٩4].sX._F0k7@X\*2*e6t*Z]y@4"mҌDVϑ-kA0gT즳+D0h"ק\s>_=~a"f?XvNn )D_9ytxpO?$sdhA x9.|)â>6H +1N :5BF')ğ@5H;̙=hW'!c `OEP%Syi† Qu~oCƍgutgq'Q"z/>'X -\}%Ф!0~$5J.\ t@}֌ϛ)Ӄ|wl8SGxȪWA#ZUW^kD4\:+fy;lݺ=`eЬYcKpzk}য়&NOxz{8ϱ~}΂O> Seճ %`('~pm7!aMZ S\q_6WWF?#0_g9u_o￯IJs:zW!_~ 1nmLylժtBav0{/лtf6Ti&ܡ36l_x6 t̝dz\YAq<@5 }s62Łx0Tp1b4|cCNFTMV+WEuf ذ~%xБuUOA"pv^J6;͝8{-#{Lb#G~\h~aDYád1a uJnIfqW`+ZY:?S uhu w;nY!P 녨7 WWao8?!n!iּ ?6вahtq\~р>8w`^p[xxpхjK/<={<ŀGϲl`kՓHEEQp,~0QSNru;/3f̓~eg ĽPWzȾΆ}O le0{Hأ^#k&AxD8ĻQQo3 ٬V#hyA5kbϤNYf%K±]ύ;mH>z2s&v9Ɍ Ey2hqߌ@y_oסA l0sd_Yg6mbjvmYT hi fNEb+A5ۻ^ ݏ^.[o Ə km`|⠞w8u[Ek5W]|/۽ S`2ԕ+p~M(φ/XSj;KjCY L" == ]eg#u嗟&v:Ooə38崋x%] p_a!lL^v6ط w 5)=sS&cZ~a//u qPA|\]@oxXp lݺ>%|;. ޸qk.3}~ z/t <#0opvVrn]I[ uwF$(80! 0iJY­\ >Ĕl~6awp0Jy_úW0XMH&b)s+zP_cƍ뮽 D oZA+f 6jnTTɺ/DiJa^Dw}U߮ĩX9<,{i Ѡ/3a`lMpjУ/o+V;NFx1NCsH0mZ3OxE[cawN@ {֫* >Y9"ݪJknuuer2c6o7;NxƳqVTa `u@'REM̙sQeeAYݸSO8W GG>g?Zġx ! ՗r~ؔYcd8Yh)%2 ڠ}pp&tŸmT|ժYzk]-^O=2t^S7oqm0omUsqy=mWMvy74MaajÑm:uֲqŨ2?ww{pT||GPUxuAϋ7TKS `lG@-a{@^4e.6wA l<9QY^CѭgϾ8$364e <hժ9 6kucی!OtiЩ{o~|ӥw$< ,,X 'V-癨0q`EM/ 9zwBo{qfԹ~3|1Rٖ.[uBb+_tG SWr<\Or\ Vx&}6џ&LwC8NN T&jB3s L+> gmP=&OnP Ixgt@nܰ1c<+V?7VSb58\Nѝ1TW/^lu[&Oۢ:9B~xtnժׂ: FL kUTC Aw*_1^=n >˾qow*n{aЯQxwʮ<6([3`떓Sjw+A/7 "$}zoZ6m53%-`zYߕ˧d+:xJkA9'@LLG1M^u`S]YIAhp QX"OzHP VTx`CcUߤI3!"Zf=|HJ7۽/ yMŃK~}2J6͚ y?uWcy&Œܬhg_ ;Ѐ'5|J.(0(1h{;C2iAclٺzzbx(CV5[r= D`L2,()cQhl >Yӫ]cFNЌ좯9ȧqcm:u&  NfZ!͝7N<t:/,TSΨ\:QڣpI>zAcao7fN :gW!C3apu‘GGCm_Q_]ӦM⛮5jbhGq$:Z$኿^}}) _4TƳ<|NJז-XO4;I;B[Q7GӿЈ$lOX*, w7+/[_g G$Qّ߮Jio TzJt|*{B{vǢup?-CUn֣Xͨc^)J/0%ү!ᖛ@CZxzN/{M_Y\/ cpAbT|8 %ĎwG`׿_f v<(bQsO/=\%K~ϿUZH%VW0-,2oz&>ɋܹg3 xɧNC;5hxt%7'z']7גRx?)}#e]hC1ϺhP5p9d㛬RWx$R-Y]DN 5)jڣq~SkDvq׮]u,TLPj&s:C'U{"c3q`޸QA폅 O:fm5Ȟ+߯"M9AE~ӍWj<"o}׫1c'1Y-'D&| ۠>0$]hV')$BX_P!b, h t;I9Z1QFL[qdƺ8gR?YsIi?!n-΀E 'r9qVN-ס:a?3f/I`ʔ1Ю͚AR\^@%0 BȺ(޽_x=Pe׌J0Vm UD]0! ϴi3q:;`ٙ~| x$AU%P*cf5fば.j.Cȱ8ݜ-V' ,ruBj]_lduaRRՐoI}ZKBy69a*N;Bfeufz"ک&l@/[hĢ2{.#0C{xfA>oV3:୽pܣd ۷3>ú(N 8ԨY]EMw=fz3B`~h+/?{wpp}d7(ș Ѷ1@t{e4 V=XDdּ__0,m DAnS_)zlFnjs=!zN!%W ` 7:?v[oڅ}^4mv iTmC ~}os䄸Ǚ3~g\*GV/pg?/$/F1~|nTJu%X (JߓnĠ(mH7xU?M7]ɛ>lWj4i1֝:)3y?.ȝ>ϕl#6zSfdJwpuqʴ-"?,ζF:g`&si:?!IPNBo̮VאΧr>Fɭ%0kKbnrͦXkZv%X# ?OGcQy"%kviQ0\п9 FHdH:-7n Q‚_zjZEic𥗜˫w{oș1NՁ Ƥ<PL`}o综xO4j7ikulizyffΜDᬳFb6!#$YSmOGs6aO8D.Im)gEYa:FqUƖDeŗ,G6|zO;wy#v*NЀw=b/>i,hpe)th{W3cy[.0ӯ`E ur;,& %Q(섅Zn%k|Ssat ={eN^6At+ ,鲒ׅK_\V=jB8l#{KhrL}LD܈!@\fN Z*7vs/뛄Bqʵ\rRq nzL;'VKپ1| ŧLO}8NOG}1I'VZ":LwXZkIr עy[n޼,`ZO1]FY8F<˙>ۖ)+j>W?uPvLS;E$8$~'!g I3/CON͛bAM4sff'ݶ z2ΔN~}R8댶ˆ2U*c*riS֙F@z_?a؉@w߽;(xp-qDſ@} XK׉Ƿ~X g{5Y : V3l~'oapB{#(t#1G[Eڏw]|Ulۡ:g&ڞV iM4a1c4瞻Q;Gaz;} mU,)s&:vڹ^$2G= Tܝv S,zdtBҰ#tA|3u82%J&,X2Ea#H?Iy8,e(ƌ=oSLXp;Plل{w5!h#ϠxD͚ltFƍQ8 U4V@@Mj:&2{ ^^rk%j_W庡6;n<+<+pSY-Y}tKK%iAQiL2 H˛?1ٵV۶_ Ly3G=h=YiŃ@Y!k4":eZfWvT|lA3?N v:Z;Շysu!&֬Y+6lX7\lݲ- ?Oϐ<׮z;v(WڑOD3 IBn'DN2 k/^= 5k`#@CHUbPa)pjsU*^ ġ SqKtܛ?&;z 6$'NXGy ~OE\\~,nD9\y@6-' \95Ui ;ʷeM;н`舐/qT*`.6aI6d]!뽌VT*ᄿ"Y%ƫŧb@>Њ?ŀ;˰A @t!JMA%J@ !P7x6P H0T KɰfɁ %Ӗm)_bae*kԨV w 4mAPO5s?K69l;Þe) ~$BGW13㌡NYcP]C h"W7([3eHei ^]26vpПdHU2XAR ]֛'Y1}vf ~\rvjW ړѶ!4 nvmowL{uTil۪8y:m /OT݅蟲;r(WauZF87upڨ(Dz#YNX#ǠczX^nt ȃˇDzh?YddwAKpM_4<-k fi)]m.eP~o<[Nɧ!Vo$HU= qԉOG \OgG $Yf K^>])Vf' m<]~*%"17%3T rV2#5`P*ዬ<;w T֧ԣL]ioG-a':u|7ö ZXw~86^$`9CV->I@j3:MZnTЉ=3U F֯eqJ(.R7PE٩Eg\M̦5+wX%Z5Rܠ?~ =p[.tS.|,tTą%9 L#!P#M?bU@73+u,؍b}}Ǿ5>HY:9Ny`ay:pCp 0~w:DlHwe, 00Y춲ޟh|M|ZkpLԓecf .j ]g7V,fU…BiK U "Aj5jv]%7WpYG[zM |nܸޥo73H(jCme gM#/Cd_Rv4usP}]#]0s j+]&>dz){ P,: o)qeUx(2;ra(VԨYaUsjUUJ5K82VC}5ITR۷s4m=ۍe4py*~Fr#goQGf .FdX`) T&oQl̓kn6ѯ0{N'w2 i/.K9" PiOJˤ!b /< b =g_kHG 1@@JUxU(SSR@QLǡحd^I@,TzH;A|dz "'`60 e|@/((~6=$)}]wg1abpycq.1쎪j ^F-fNzcR#hmjv~34ۭaҦ֮]@JAPnYN 1Em&:A}@ϖC [.,iubGo٦ |w rn@bϋ'_[0+jpBgBFVd !,Fv8_R37MAI F0qVXpd[^%K`e-h" r29HTs]"v9zZj&q:جzN l:7D$.%W+T6Lτ٠z"> \ӹd2dEA0uܐEIENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/porter.png000077500000000000000000000566701461403617600223010ustar00rootroot00000000000000PNG  IHDRd pHYs  sRGBgAMA a]MIDATx}]EZTzK( 7+MA/**]@@ X]/)iRP@B!μY3֬=E^ _9{O]Md=ænHR pZ򪲏KAņau5$/~VW_%ʴzR@b"Mt1~Mh/ Ecw㸼7ܫoH%(0D)=]/x1a6,itr%O>]ns]_"yօ8R ⺖68y>{b?TŴ[aDNj\T yJBKu!jIXBlָCׅy0{ڧV):$+^,wKk̋i5]t, G4o|ډ(+xo.,VԜLǦCn87_SZ9$^<75QDuTWcjZlUv?ϓ;gr 4kF~]]ŠOy!2ߏÃXDCXc*6žT٠yur ~vyѓ{E@ԗz^beIjI&Cf?ڭA= A>M,ǝƼgԴ2<) ܇4A֧4xSgO]VL.1uL?H Kb W3D0k>poÖ]F*qf†{l%8un-k .Xc"ԂV&0l>tRڗhi-DUA,{:>UZvȽmbmv_=Ɛs5ijTE2!c$H(q-0ox3oPMЕC ,X)z0գ0W s}i$5E ERƈP.&vvڏueehʱ 5+HoȭX;~tB˛A )Fo%x ɢI*R0DqhG?/vEQb / ^YR9 `6Y9D B[Z1.HMRQKi+ýei/mYpU/}_X)VI:~To,s?6o@ .9%d )˗*i0+`7Krn'. adJ~\NQUd2]9@`Bg=wnWΘ1ÆC#E K!JLCH5zJ߱ݴe+@b~hWUiUPZlôX[41oeBóZ %W fk!\FOcDp$z(J3GtHuzۊ󳒖R:Z-"N\|^=\y1cAPY;~y.ecn ç{W6nY\a,Wb@Al  þ{ZryRKPY7F2.jBj-e!YM,5LMN"2 (V4ẝf2 5#v/7Ha^'k9 w_7YDY<0*ftGn)e= ie9 *&l bw s6JIY3c6 ~0dDpW?T hip DB6́&;2_?Ou3bU^ U UʂѮPhM }xNȜ$ :c]72"CPzK?,̀(1#eX& ^b:ìnTRd;ua«uѕc U!b`_:*0UHk(fP~[;f~fCd!Y>+ rOJ{0fmg8tvb 44ÔKmzifo5ov.3]3?k@:7) Qc1E=ߕhrOKi>:t߽R}|%# QPڗTr^.Z7wk\_&m2єlۓy8-hiߣm?atm;r3Qz@򺑗 BEdf]vJ=AⱐRPadCH `z dNaכ6+g:/I,r^gXx (Pa]|cYP$bf WQz4+(tP)BR=Ǟ7sD;؅t{ȡԙVWMntJթqV."xZ7K+D ɤvAŊ,b$ j}_cL;ҋi H4i52 / FVf'lx0O7-}ndW}&LFˁ]ҫ | 5QޟTc~|\e8&biVJ#sQRI} +K[1뵞cQQ1`v"#~NW9R2y?z H^cO؜diBetL]J4ԧ4%y "IϦ _aڦ^iEv=jҵ5Dj%@AZ\yŢ1n{oQ٧)!1-XMyĠMJi8"J1*90]){ 74`$bVL/&);kD둏LuF} -@iʼn^n%Yr+oR7;/C0 e&XToF^(5%cxB,ۭWSM⤌ʮ}_S;XdNO&J$_oHZ/'j ~§3qazbmq ʃ R)V? @ߌ=VAܯ0"^.i|Uy'řYnJV ^Vq)e Дnp!!}I#A vמu@QT*JXS[|\zm\ɫ%oIҘh:r o@!'.%D»a #$`v ?feT& r- 7`ܸo͛aγ/ԫ5t_0`B#6дRoM㗘]eodA-@ Q .zj.+>Մ7xMEoCIK?'!F9sT U,aTf`_4e-  OeIL_ӫR1'NV<2uL}q7 ^y58;?w ZUf 5[E&z%pQ`i)Օ9s͟}Ŷp/ +NKVgMGeV+#(c ciOkYRoWL B롕2:n\Yg>>;rѧ+~ehQ\ b dReԅ6dmvYuT[cˣM7X ;K⤩.!=*u)I(2Vݒr *g&u}޽\醷JÆŋË/4_ BN G/?,K`eF4#G_aѢEp"i Gmyy0w[IGᆕQWX6+RFF2*-O I&iC(GLU`~pc( wdmk$P*e6侽2EL^"PEs|c{N%&@,QdJ{\)Y%K+!fE`&X3^=?}$㶰+9^spy^pe1ݯWO}<x.+ F 5W[u8⣇) #C>^X{Z0h|9po..Z}Yg<ﷷ:oG)/wU9M'.O1bo%(@ALv\w\DZIr __M =꿜*XOP Q9ߓ&M=f~œ`SF-v,<39,׵ZsᘣsW^S>@6p7å]@:oQLJ8-Qw{׎pY;׿#Vx~vU&,Z~sa&6l!K/y39*xֻjnxWavB@L@$K|%Ikdtji r~FZIc tΣq col]mmDGDfcIe:S  pO1!ԧ Y)\=s%'dtwn䣩W58'³Ͼƛ0ɧ\&λL6>{v x:/a0sذ6LXwmx͹NEA[[4`,13goV6aF$L F@"F0i .fA]ݠ|uzE_=kK٨@qU0&vX#;.f5 ad-IFM=,J:VVKʩݮFƪa gO΄/`Kֲˎ7Os#2sQ5I\ J}i: O‰@b]vft`6}\{MMC 9P~QB-jSE5%D4B=| ۃd\rez2WЪ:jSKTqe(NUJy$P҅%l|lU}eeZiՍZՓ-j6aV)6" N+U>aMl&3+S{VZ3ݵ"h滦'o榬 6 ./ᔓOUFRWUV4IJaUE]TKS[hD^⁜WjH"VQ4KY@ $_WyB]DJ39Ҽe, %s o3Yc2PK RHLr |VPh{bSnӾ%`uc&q}~;<2 P'ƍ jܹ୹ 3]}͍vnyE8ySsk^{˯6iw>^0%@4A`k3B$WC]PH g ye( htiX ώdw:l2c cj4P=,&AH~ˁll3!3ZQ pς/^S8& {ssZb(&os8#p)'gsϽ]~ |;géVH";Mvso! c~P%^O"CM,`r|LӵLLSclm r3)dL]es*bqw0na/RK gPˑw,Oc+bV*3fxltxxc@v@C\FdzI0z(k̳΅_a6 c֞ O?3iN3]tM$1ynAE~16I)v[{ vv/2iVqA[o;CL7lV_ ( ]vYr]C{16]j=A(hL권]c34]hGh'q5wMцW?SnHzk+w^`$0ǞzTI||Gʮ j!,s5uтgY -;Ztlݴ X`/Y$k5~'EíP&I e+Z~Bm1nv;b1vB(F44 ^B0ThruvGܗ5ЈJ1Z_@EJؽ};P<=K0?cGzJ&ZtIX2n5NZ_+1s;년I`f/ 03Ʋ &xEFtQ`41[,,Zt>T1ҨJ y"cD7t*ո*Uk5tpdgSZO_nڬEHy0j>I:s) Lg lrN- 有t)h52bMc}ugWv PiEIݠSJ3k"аޅfw4Ed<:~ :qg*ӭ^k!cXO[ } YO޸  ~O7ǂm>ˬc j_fz>a. >qs[$<`?O %xn&e4}覕'(:IO F":`$fBȹ*yfКJ"X^5hE#/JЛzy FHC5nb?C'_;ڝ"|j +QἔN\e^_y5"DuL(&뜉nM`y!gȬ&3\m\r2Ռ(ff BT-*F 1AʻMCE9nV^_E_-+iLOԭeWyAܷXqQR}B)ʉf_֥ R?o+Mi:@Z-y!$npb itNjZGu%f*)rjiJOS<T+@ 7\*Y᧪*`6Z3Js:3|4s'IYjD4YxN+Q[ݘF vǺ4Kqu 휸qIֲ옲ZB5nw 4ѝQ Zƺ+1@Ԋ cTzy 'WjRǛXR0 :LP^ᴯ/`8wYY e&NOhv#p*jw^Vb- 1F1yjL ?@.[KK!&ufSz`ɍIQƨBZBh|`˭!w|9VtG"Rc5Mr_/7jvSxJIӆ)"T1@)XoZjc\X\[$oƣO2Yz8 {s3;tQxߚ#^7ѵ 4Wej߁ D=^ϪnD(11nț~.)(ڗ\7 z9@[;>&-o|#%LAHTR02{p) vaiUyߊbYIѤĊWK&sN6'B.]u̒.Ha A{Uaܖ&N:&bRAB%H[gzIfS#Th Ѯ\Y}l滥@ix~.m}IO \ XngLGWPZ!Y@# h>f%P֐WB5i֢]Yd0FZ6+ 25L6KL >Ye& Hj&0òi$a'.qAR &.-[)@kpJ#׺R~1`P;L.-/ E b_\{J /qey.bRZjSW Ҹa"5XMڗGBd Bd4O[hOO:C oQXv ^0a)z3fp@;qT0)} UCG%/bwdл.ί,}f:*'4=RJM`Pգ5Qq#*##v_2ƆB}m.++N#XGJ{3qNe Larx|#'zQݙ\ajat@PŜ@QժX,:} R]3YnwyvKRo\ae>pjzffEߛll>A^y5=yX`#cܖ4m!`%$;m0`*]n 4a&AV[6hB(Nۗ_~ B-hXϛ<M~n۩|{yKbO}~nVm[}ٍHK8_xf<9+ĉcVn`O PkXMLAi\WKǮ)`B7w'|̚y(ͤIEBkҤ,?ͅĕ6 [o}|FσG}ĝk;gU 9q%0ZdlͶkd"%  Yb{W8 䜎^AgK?\ }xlW@9$8?J@|#h;?fxڟب'>& Ga9=T ) 8/N[n9OBBx۩|ޝ|9'闙r~o:s1ߍ7/,w~0iMছLh!k@BJ%o u_8l#/ {[ chI}a57su|Uׂ:V1_{>j}O.OZ/_—a*Jp ' xb (P;܋Ag|:ȁ>ju_ga]wϟx㩙Vm H=d5ּj)OY$cQsA%"8%M"1}z;?D av‚~dMJpwϡn&*+\rqk{xW`5:!COσ?^x0wO >rVP-^0ݬ9 ,!'ށK$M9/<&+Yk`蕭76dIlٳq ^~`ȸlȑz&“3jMVZfwV7q:;y׬_xpIw-G~pZ _&vFyAr@>0Q]k؄ *$c= _įn%c%T&2)Yj@}̠ zbd iZKC+-32䬮 r+(:3 d{3\}5V:{]`K7B N=~Mw2[%2>); b==Z8a;T_5 6yԿzV`eWsL Zn'<5qi|?3j0&l? /:n\?Ã={{?86p}m]@#4ق@V%.Q@иjUn+ik aȘ3G뮿ǿ| /s%nm]vV]y%x՚72nNY0jH8%/^{ް5 x:.y,Vjg0z(xg;!j`ܸ5 .A|A['#CohM?Ff}w{ƎYk_^/2MaW۞ߘ 5WXFm=l?FQvW6W~zfZ36p˭S d}zl Ö&7߭YGcWe$Dnފ8>h.ֽb}wu9׍55f==}׆UVn xY6[ z=/4]g2<𯫁im]bR7j[cSjQw}hɓ'?ysF\dIh @=u |rd@Fcu@}7;?_ұؚk'xXaeZvh8m`'Ͻ -į%DscG?<.pzW܋~~Oڱ F#auljԬrok0 ,6dΖ>wOA:|>e}J޶KGڜ/~bw=X̳m`嗅 덷m²Y{M׀qk./hﮖSOͶ0s8}"?$/-h?&-ч$!D 8 fP|PݺV?aV`puӿ qAJwy/ӳAliW 9Lƞ@Xk܆5QK{m ˯dA7_wmb%Vj9yÎ_|HRte+BZij;Sf)V'ƒvC)ce'BF4_zU č⋯>>iǭs_8o+oq.u.f>y}OwopП-J+'~>{~lKG?lG{=]4n `γ/ZMx3|~iUvKo j&PE`@Bz>18g?@FY=p_+jaG+&o)|ݫB)? 7gdke};_$+V9omu{clǭn ?)i+  ʫe!EGc:vUZ^S/ZevmG?>snVql/z◾|kx<+L{=|6v&e.zziV>83kUW_̉KSm,]^tU[17ysXf&P/Qj*>pN:IT69w\k,ƯZSտ c?1}\zp쑣F)?岰t:|.lo睶/bwp?ufvUK.qՍVS|1~W8`=9hSb/\}M6fsaZpa#@F);w m hXL!,pri(>C>7KD+ޮ$뮿ywRgH(]KU9~O@m [Yȴ'{mk|}~EfxuO~>cqeZN Z5tx[V*7nGk /gnmYM l!cÖ).o=Pxk<o2Yvmmқ =א\:kZ7 \K_ A VJqɎp6ĪGlf׊3bTŸqk&0.4cSylW_{ݕsx $݋(2{Fٿ6gsv eZ_]qrǭK`Dqɬ_A-k{(E/Z>a[C2/E X_v2O7x׿WO6n`md@ AGwVnrfSU+@9=OAMvEh-&:_'gg񂯻u{w%Z;켍 LW_}=2|2'bG [}$>F/ayXiтu^}e̸>ХJ[?,g~;@׍j`')W91dc6 +^SkZ/=X;C6?C-ĽJrW a'=`ǫ تs #lt>JVl(O3N;AMIf 8|-O7/Dvw)HkǕLiB3]=}S{t_<{gOR4 &P0_ ScƬ*fo_gΚ /+NXk1OS+!*<}7@T@MN(2yM)'yx)|7;!_&V|1CfQy7^ґ^|r/+ZidRz1[{Kr*OXnq*adz*? iud;v~Jiƌ{`mm鳾`Iӧ?~nZZaŠ+ {H!‹/{UV#>lsO&ZѐXɔ1]еZ ubm6AeO{9NיgVMkV03H/3zKK-x#Ao[b5=-SY^a˅*tIǮњyg|:m[nْ?@Z_T{b]'D&&>'`q}6x svu{+TSN=*d@fD]vv?XGs@bM\rE"=[SkB}) Hoj@Aj;o[[a23awXoݭV$wdX6ĕe7 vI[}v¤I[Z'>n1i+.~P ^~¾e]wME CSz<"ND`@Z8TcUwT=~Қ[ XcM(`G.ML[=کB tM7MlQtti;UQ,=ށ;zQvf"|g =K 6jW4E& hD8}۬/z߮S-;0z;{kV2m5͟.gn&*L,P|m~{f32%j ̓Z0oAϫ$:`-9)#xBvN8 o옕=]V(x/XMq(ks] ͗Z|^L̢:&Hdhak\$z=vt &Lcn1E'wL _";*Xy ;+oe/=ֲBE2jezWn=RN]x"Hgs]=>;MOvms_PNXonw5:|쇬A" ॕr7r\YcƬf :}onȗ~icO/~Gy|Ju^ Ƭ-{g|ł{Y7"ہyj[ "ҴL1dԤwXzϽv=@v {hot…oͬ=ED vx l.䍭@nZO>mܧ{~g\"P䵦 zf@/>í q;lF~g#Z#Dc%y7Sګ :ܝ3 e+'uѯ飗_~:!>͜8,V@n*y{wlc(ʶk{}/%2lT碍'VanC?@]~MGoZ)O/~>.'9z^us/z̯}W;M/ڏv_0~_MnegFiJs}0{=/  @{hv]~ hqO8-aw9N^uM``"o%TUJ_zBO 0 /z3pM{~Fy,K "26&ƻm&>wYONm䫣X:CV$_Lڕ`& c{_Qε^3h [owwM.Ԕ?o5+?Mëgv ;6r-->23bЩ\e}$x|ڍU܏ZySyml{+~izuvQl:qzqw65 1*,+ &n{TO8{GmI7feKķ]w-X}X\1;"hϭLOI3SU ~aGK\`i|m}Ƹo7LOoݢB ~3`ρSN;˷90/*Rzmwuǻ>O<9Za6 Z>L+QgzH0i3.t o wS4BD”/Zu -0F$8)M+h=(Z."@vQ&`xqZxq[.뮳-ŦtrG3&Fv   oYz @~% n5z%Kۅfm{ `5jׯyެo i)7~<ъ.@ :hTacɊ*b.B}?98M7ߣ{| Eտ Si-f nt0ӁW $]b|ʩ?&^ 1&gj {b"Prd*5WeQBibG/ Ȇ>DH߽Bbѣu(k,Y&%7# 6V'Ƃ8:b!JxIб/ct@gdql^Vͼ<&jieb!l=6u(_)K]r>A5Iͭ[`( ]Uߥ0Zf ec=$ҠftL 3mX|V`p@̯ԄkNEXyK"WJ3H,6ŤVffi) 4b`]_:AcsZfU8DU !vؗL:0n7*@L(OW Xa[["zPjv#n20X`qHzAhZڪCLa6o :58tnm,l.&obviR@ve4鳜9%-6"pfH3; KTX#Fk61ty b@7T4X 6X%$ 3 TTϢ>W1mnZZLkJ߫BlqAzl`p N:k `Yk!s{RT6Qɸ̒>;֍3ҡT̈́e&3s1?1D16!ᥬ\oҖ6 K5oפ^C5 4Ebi1."mװb*Nj80M:QLv Q@|xyܼBdFkW!wS a Fя63_JD:N!xI;^OZ>h͋w. "s/S, .t&.t ^=<ã,Ĭ&I X~CF)FA.FZ+]4>x"~JՏt¤i0D/39yQG$bQSE6dJ~ ̡m>s?/n|o,*Ƈa`0{BɰP-7XisDfh*}O/#洟rLk<2O% G?7^>}˛X*)00I-alca1DzMWcxA &QzJwE,j98XYTn2F W\+f_3IN!,m=TƷ긩blTo hm;l&5 1n6fNb}`VQ3?<0U#؀8: jqB}`n13+QG˦$SQn9*x3UN.$灊ua $= A=S*ڕS;B% tlZ$:͆[ Qh@P"ڪp'jbT_`QQ`3f_3LN">HUeV!IZF}y 4P(/(P4jvS?nO7p%]U+Ֆԙv\ȐGC,(4wo1jj :k`lE]1br,%]ΣIˈROEe41aBs $5.aMR(aܔ4b2J;ɛa/k_[&ML-kJTl&:罸ܽ[cdn(ۥMPa⤟ʐ>r@raxMzuE+r~*9 }ʩI\oZ:DZ\'.cljG5<E_é[1&*ץ+Y: 1T`P 7)A |J, #'R`.[E+fs rĬȴ MEx\ 6{"8|`O3˰#16 K/&ԛ. &lYbIxeghԚU_whvj*۰A;]Fvk! fMi>h[|ܘJ[ܻIw JFNJH5ڥ:HiQZ!`wlOWxYc1m]3:}@bܢ>T> *]]Չ'?KA*cp'+2P"}b[NW-9E\HK J@ *hZ!X|v`&ԿV+M_9<|jgjWфK'/A¯Riij l_ïsgP5 CQ;(o՜,-BZL_4r(4Lfz(ChԮPn[ܡŌ<y N=&Lh`$ZσZ[^^ ldri,9VuPOڞQXc$R~0pqRŴ `TBlE-*[؎G t *+aOGFYKrltMD׵@־߅Kk }];_Ey\],cܧv2~FFhWiI<-OjK ugƯQhN@)cˋ%ӽkp1l%\w*eNkT@}ʒӾg!s.nof3%mK[`; |V[&jȱSXZ ڪ8*1r5#N8tLG2)1tu+Sju]jeLfx? QYR`jk,eH($AɅnPTPT2\a>5ږS6CyrqhsA/%- 4pX")Ab5 hV#!Z K]mÇ"nAG+74D{L@k`#A,-ZnˁzcblA` >,-d}asnF CrO:o:8-܉L,)Sl4!m2 M[^kd?W\3qdNَ:7'`QP2sB;!9&B 5MddOmB QZ1q hn#[Lxp L% y_9Fe1QU}JNbL@' 2h"?Vz0sbB;*:nng\ X.(:=QQ>0\ p9=4\` , o"xYwKb֜S!E*,iK* Lр2@$B66945Xv<&EdHP=; ,k1H*1$# iYpG#Gi%|p\T_  ?"3a 68-퇠A/꘠57@_$O}&"u |;l[Pp7?" "FrdA.O)9<Mg%ܨxC|)݁b%y6̸^~q X),|sH39EgmYMPא%Bke>K`\zy ʌeDNLx^p<ؗW=0H U %pO1u:ɅSs?F|(y+p=r35pao4݋ - T>لht+]i.nb 1K#nL14@D6#\^  @ djrYF@&,1*On)?et.f \iUR'MR0|@k[O``_8P89GXs#hAKG=85|P40"X/*Czu RƖ~]r;EH]0:aRkéNkK-$QAz]E0D< -tIOzz Jjj3dzW!lRg#T(ޒ\$Z_MҚdee 6rZ/T3&C`Xn ($Ğ(z#ˀ/jd%80evUj߼Xd>bdNjzamޜG UJ* \ΌK>ij "VAAOnx؃-L Op;X@exkQ;DsWGVW)h< TA˻6w$ QAmP-ڸhD-{ |4#II,YP+`q/_tpIENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/powens.png000066400000000000000000000357171461403617600222750ustar00rootroot00000000000000PNG  IHDRd|MPLTE YmL^EYc{\rSfVjPbfk9Ph3LΫ,G)E@U0JH[`v6N;R>TAV>CS䋝_drh츺Ł{䒞ѕ[pywm}{!'8籸E\΍*fxMRb &7n PbKGDH pHYs!8!8E1`tIME= IDATxu P[" ",A1H ;(ƒG 6`I13L`cvvaHSƘ^7$ЛnINi~$Mٝٹ}w+霣?WC!+3`.sf iF6:@h8ɓnl3 Z<쯓_ `agq꟭/Yl 6~±p<'^٧W-5`޹s  !SEj'NĽy\Յ mK;; o^Kν٢^E#^7x!ޫD~:Uܝ-"+i\+̬jȾ͛`n;;:۝*?X[-D œ׃1p!&wݛۛ[CʼnsvꖖXbAκ7Uiwƭ"àLNR]<.?x3<vrod+i3쯖hdX~o43W2gNwo4L5pd0C\Y]6 KwݼykMZqt"K)07Ҽ74_n0 {!nۡm?\G"#6 &<5Y#,DRϬt*ZCf'kk!.ha I|[+-U߼;:A,ݻtn7ΡݢJHM,ҵf%2[mt5ZfeԸZ5"ZT]=YBAMMv,ۚ_`[Ef“*L?7󴒶bh7X/ݵkbp;E.vcV|=g^r:6Ts3*V'v*mneesɓX)Aq?|eVTG޲ahXx%W aG^17?8ѕy0Ʉ;u~I#eyXz|eʩwedZu!-[dDV-MBU§ۄ̢NF)$}V6G%F%_-SQhH`vWxBbs,=?**x;Y+w^矝f};K@wwyv,PuZY ,L*f}͍CIUV(mVRW--]}R4n8ޏ}!ܹ! G "> G15ik973sI:ׯݻ0v,H {4(dյ:w-#g֑ҧo0wqt]drb#j@YP HݰðWΨTaY %J(y.E8]Wgn˘:صމ. 4cCxv1l?r$94o߾0;- Eq1c^5SrbN`~ٿg73@rJTf>_]S4VAVRNmeP&:w,_<ٹAGpHC˯:;ždU$g'SѨ:u2ԅW"}6R[p 7PzqIr Qujش>qSaCBS 4 {?ɉl),Bm4v@. WETRrPNT>90லeދ,Go~$qKF0;@OrjbqCR7n#Qx\_~J>uJ_r#'Z2jsq:mmH:)ȡW1Jy:VcuRY=ql & R4 I{m!o+U'gO.Nf>;3s$^ٕ"8;!;yk\*PpZHfz9 M ^!FY ܩ96goXC Qo#džەمT n 7. q%/(++g#S邔|%v ߒ+?X*<`L[:RTJtNB^>8vD46zYx'8sz%82D:V SGgoPa x u쮰9Iũ?rwAaYQMTcY.w4tw%e]UIo+RJQVԅa]*Mh[-i:Yrߤ&Q\v3/0hggm yvf}y'Y]9Krȕ_-T_T" =-Mylq+TS\Rc^R W &xcBȉ cGJ_oln˃ N.-'?g ;` 4-Dp5> YjgG{嗟{Oimato yM?M١& ] S7 0ǺDN6˒0#mϯw'.., q Z71~@Nzy?=;0&l/x1~l '#9;nCY+͍p9'aQSI!W L {7zI ^I* ~,c\ ES3u@ [&K/uHֲX,_X]ѺJȤlRuP>L!腸i' 0n(76.MJWU!x*B)wW<͎S ,}y*+ s/k%ہf[ EO{;J40(ieКy#zSU)+  a{<̤"F'E`}?h1o|I/ H-/+S?[/XSӣLTr<.5ekaCh= \~kycJ ڐV+FE$ v}.n .]Z~wn̼O<+_- B<}?^ï_~ToA/tq X?mB;rȾRY0ifuv ƤNV11,=/އ0ZV]׽)(vv/?Fmu ~npfq Op{,)H[Y.q# b?qQ,NX,Jy6RN5^;L='cIk&nC XxovWU0`A!3h$'{v|v3s!kfFs x]&_fg oԆW0uDqJcs2mQjg =Ta)谠.l=) q:=v͓6*F?y¥ .Y~ G0ϣ??Μ_"Lޗ ,K 3fh<4n|kX!o88޸tcUP`V7d<+nfʚnk||?܅~B//K?a:Qxwnzk,[-g08h47;0hSbµÍ=Vk>'n-AQPh7 AK7ƺRv4S1,?{+$H Ӧ.-^xcpN 7 ;Lgҽ!:tqnáG{] JJae+,em1;EŁDOq(ZN/je%1/,;x7m$s̶G18^6ۿ@)8=Mb]XD^[sg"𵥥nHY>Ok 8'v`(43R|.$ EM1%=%ޒo9`ÞpXֽp dx.SJ8;{ Y+e\yaXP΍//~ ehsKs7n\c~\NXsoWBIYDU%[k ,L2GLf4,6.8~Wh V]/ɜ1.`,4HKEbF#' Kwn\}ڠP3|y=V́U [;9iKlN.)ZU^^*wy]Vp80a2t]1v߱CQ= b5)欘X]pJڤX_@ݹs;ϟ[Rgpux?1<0mP1ЀUNS-eW_VXMx-i ^&0ēV/x: 00B~pf M/lǷ.RM\E ToVCPY"͕,Z*~n؊G[\@ji|j) Q˽6y]O# g2|*̱Yt^I 1r1#sW~"ƿ|lA\s#-WA{^!'sk+?~(`~6!Go[ee8-7Fe'0<<2^8h73Gq6>31 : BϿͭOW_c_\# _@sa΍K_(CQC> ٿ!1h7i'iq8Vh4]^ `y!*j߳gS54mMVtʝV^뮒]ඵ 'v}$-+MPh$/{J]NNnoL/Lïkkp!BW&/QE*S쐏L}xy'+{ē?5|'??d?%$z"OOf.+Mu 2WAK93 Q'5lFW,%9N .&nU84nR ҏo߾f(Z}H寒n=so!y߾..M$G7/ۡ$vh_RWU:q9`[cς,m #߸#{oA[à.SU q+xۜ~gؙ{; x LED`֌(r2ŖHcAYl.i4{]==3?})΁{|<:"VY4 `$kT8|i+!k8y Gvx`Yg:gs5_u-HU!blhd񵚫F;+0@ *7iFTa Op9}(WӾ _M}=t$.LHDqGv6!u^%G'uXO[N~^ 7zL SOӆЬf+rp z1z^ lѯ : X;`Km] 'p;AdSSف*wb/T}t#uUhqp=ֿ?7#Y+?\X#A=q"n51yPtu&'6"tZ\Q{P343˯,ALS>t'@QtmAZnz.׉F#Un(>%t_ANX? [G[SH$ hq pg8s7v׹ivv"M#TgnNp$՛pD+|龙-?a5Нq4dKԆBNtF>&F.`Q1-.GO@IFJ׍`bc} "t_4` Fig;;5=anWnEyV.P EA*"S)q@f2h#MZv+HY.F_+%Y\C%.zj.xׇ`F>poܩhA*r{))G ZsrܑȽGNy:^{x7JT|W|YPM鰳ȩ+ܢtoiW7(hlF VzVTL:1.oyIA{xl.ĿĨotQFw÷r[@AւHw$/; ڮ*^qA{ o[G"@./ܢ(2鐡﷒fY L!K3q~ƙ@n\` -Qr=w%(^c Fv^H,c1})OԄꬑ9bANkTE0paw8 ް]rO=Eq!6yG*F't&.h h7U\Wg3[pVP"9{DrkˡPH [c`6c&~/`Pj)*hjmjj27ěΰS[AUSE"kTH{w;Ú֪D`bSTG[y I2KdUu\[. ~ 2AARԓ&:fMmVFc-jGB!s GF 64 ,,9NH[W } (#.=焓:&m-`@ E`>V>j=꥖iyEFHE$Byqv=zʊ[U$GsM&Z_S=i`T#a**J:Y /sEp%qcv`paQ~髍KGl3ߦJ'=d2$Þ{sCS S`hhpANSviI9ix Й8%=t7h9ĔVViP^ad{`@V~(ĥ$%e=ߋ5WB-aqe#!pHa 'Z[(v bZ: 9ijĸ[G{<􄙥HGZ <ttFba(lʒk*5Um_.v0|>ޱcGnK*+^궒>,^'P? |FBjE=^}ҝsD\s!q!tq 9xtmW=J2|gF+aĭV^Oy|sGrwtIp2U@`=VVBab$R_pV U<2HD ?~:M6:q`27p2y=pY`ûJveXvpzPtq>/óg.[Y 9sR2C޿z{VN=Ni?jNccJZlX ZN7:ܓf XNT:\N#y sU\EtF˗A#/߳@Qw@TfV\VL[MVuunjjhXPjL{42k'&yE褰޸*'xiM:S_8h>f)],Õ^re2#AH!۷Dvx<Oۧ•e;v(I<Ϝ n03 y˫ݘOtZLNfS^QRSjVg+W^<#* +ó2\6i\킸*_DfUd*@"J̻#H]YYؤW]W1K$UTc_xjr0{!^yM< HkiR IxJKc^K:ݾ70M10|x+w(+p„ҥn2Nk0P&LMMwH}ݨvDAmBh2}t@XV/B\ʾ/~&GW.=$Wy[ZÁ6S',۾QX˃a Ly"IdU.{kNjqk!g^͘%INu_459O# N~UFdN_ёW_%$LrY`2) "Qr xr$}۞yƐgy̓On+"0?ԥUVy#57/jDl I/Sm9?&$R_˫h_̏{+D?AjN,%iOL1*'ZTf2@ |6l"`ڮ]R<3?O>'q_F)TX(%>eVAPj=tsY.P{l'._߿N\3*,qRN<+ud#X*}2G@oLm>pU%l<3B_0yƟC ՟a t&i!%B.(k,wdz/oUvVjwhUեϐjUVF^NF%x 7y <䣐O>9W@\"*S4"`%ri8u%Xff7ZF1Z~|F \>qHR d=YD-+b9Օ^cFu@+OfXLM} e)T]:*W,qx8Wq͑W.^UP^6 L"Bdm4,e>]HJg&x:e򹸪 LB̩‘g |QmlAcRCmaKa~ ݨǘ/Xj=(bxuի$EeJ Ȝ}ieXA}WIL\]Z9.HW壇++Ho!! n#r^!)Z鴊وa_jsʳH.x*>IYKG$ZZ~f>ًԂT7W-9ooCنlޮm!oIE:Y~E\dCU%K[(jcmˤEaBe2)6I&]^QZ So&f4e;z8gpvpn4d0 mm۴R!O! %((m2(DUeFeͷZ{֞|:ZD0#Lj_alf=p JP2L[e ?Y[ՋU=QE3 )+IENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/propelauth-banner.png000066400000000000000000000310061461403617600243730ustar00rootroot00000000000000PNG  IHDR(Q` pHYsodtEXtSoftwarewww.inkscape.org< IDATxw|lMoz"* Hj/^^;{A\bWEQQJH!cvgg[A׼2<9yNyfM%`rݷ*<@zh+BgHC;a0)%( O;O?jfP?bB(JŬm&0̸DVjml&qf̩1X㢠AͶTm>H p{sZ.甽4A B HA]ÈpmB40T"b6Ed Ԍń0 EAҬQ&X3&1Q˪v-ͫo}1ǰi iBE=mX B`p|BrAÌhKF4oP:!e /w; ُ6Ge(qCM&ٌ%!$<8#EI%E1!MUJ(ڠ_[W(f~$(N lF PMj,E[T ( J[j ք((0Eʫ@ָ 3shkԬ]glUayxt~pj)c1Za!3F4⯈ ~"phD pao wE6޳< fDA4w>!0.x< O+)5#" мoś` I~2~Ima BNN1ibR؛ ͕2 fX$"ڄ5)kv ja5(:p!`0" 9sKY}wԹiIX/H6iȀ!o$~Db#ԬA0$Ót&^h@%_Ƀ{pdZ{Ţ"4eV&idaF d)ڌ%Ɏ-9b6;q.B-vsqEȑ"Ј~kde=]GudO{̹ ѫi |m@CC~ auߕKvGZlv)!,Ap(M ѫ (E L&].)$LҀ4~ q-D7i6Қr(ژf"ޒPՄ%΂i hN=TRd T·ԥ"?߈{JIBz 'ǻ?iD#Rz.BTL{Mo:Esjտ'nK Bu  ST%_C(,Qt}p _Eˉ)%?d,@ f0pHO4;=VnyOep*n(x+l63J9*H 8]ZW =潐!\70#7%AQB$PZz7z'R {{ FO׋Ђxq2xF`8b,ZB;p봠Ut:h,^ŗ8 gG$jI9B jMfMʐsݘyaXb1Bv~i.,cߧ%&{cFIّ"WgSbӰdN҇aߊ5ܵq,f_) .U {J.>!0!{Ч 9CtA_' x m;b9ܵ{Q'$7g ~AVh?4&q$⇟3'YBJ"lB. }B)$;=+܁sO(ܿ N8*,D"VrkmH]Hܒ[**$AH Jҧ a q既$>B A>zM +p1@Ѱ yi4 k u?h,4l*&*V O H]w-“L whgf>MvĔMǓpF{2}SYPj1cN"S+;$KdmDn)|1Q8bzG+E~"q:jkn m8CyJ!{ʽ!S4lh؈3I0¨wahɆȅ7`ml=hS $iۀYlK.95o )]ɡ@mh; U6a{}E;IۏOcӍob&g v^2 5i/xeausF0d2.@B'g$=6uƎNt "::&Nqq1[X9DEE4 'AqB'^q;lsoNu {1.ܲjv vPOjfU*1`$ A) jX[㙛sȠ|o>.èܖMa>;&cXIL6C,1fjaxrWePd==ySGY)qK.Fq]cQ\BFA] Bd >E:!vu*={YXR8nnv3::/cYH;.:fxч9 }˯OQP3m3ҙ7! fOt2nWN& ~| ؿ/}̂oiS NJhrݳּ·\z5 OD bcIm 7?Z`xtwz%jIUZԎ"na~#/Q`^*eHTvզq|w9Iu M ~X(¹(ڿz-[xηGyYƮ_YK&,p F\6쟿S^AO[$_宝:rm7c20(BC|Z/>ll2c2)TUU,x]u~Vkg`ԹCIm҄CWKY{n(;/=Yﳸo]g_.MUUq8<6MeCسw_؇)ݹ1M߰'yIxlڼs$ﻓݻnwx{^˜x eg[HNJd2Գ/~ƀ_D3L?o( ƏWhcL>}^yˋqFcѢOض=Fǎر==OΘqu$%_~D(**&11.]:׸b,|SIINS{aKN"Di&е s`e*0U>a=D+ʌ1 I (c4cEDYV,6 hn5G b쏨>*VӅ). 7OA:͹s&TWaUV Wt=M[BTTuk-s)pU3oΣ<|̊.fzNc֕Wp9( ngпØ6y"cΟNm(.hާ!W^~ |)̘Mcv[JG3SUU5;$W_Ʌ'0vHTUULJ=g 66 /ԕQ#8_bc̺zFеbokY{L<(;[n H\\,L%_€-:LR=Fp`8yʀ4QQQ;HOg6ee!bccy,TUUE.l=UUOٌIQp8uu)%-7g#0x@MS{fz.7obK_hӺ_~[֛d@o̩{ILL`+"6 LMMM11TV݆ۭR[[[gE0BDB<EEeePj.C(ҿ=?"nIي߉1C(v &œi7iߤ*H)cD JZVqZcO%lR0+wgIpVaP@KzkeZ`r0٬Ku*ʁX3 _T$l!uh/vh\}㭜=f7([ILA_z^g ᾇ![\͕ ŕDN[`كY^< 6>!Lɵa&#\K4&FUU+3zY|X,>G/7<?ʲv3 p.qiehX;L4 ?m ?3`WN&r2IH}vd ?-_/,n]o8{woe_~oN|K}iT^zYξ=ݗ+/G#m%[ؕɲ?]+'ٛuvYٿw;vгg]V-/`3 <ϮL>x!3g^=ط7vچ6^RRRʶY~rʏ?wO4Xj٪EOR ,_Ą Zkػ{y|bz:E):Yg dL*?ypd 5YnǏۮlJKcDsك(:M :4۸ҋ)ͦ(76u~}z⏩)<@ٛcOTW?O>ӯY5~. WQJø*J1%Eaj} q0DcK,[RVQcm>տrAj ^/"udOVo'G;  m"(('_Qb@ ~G|d"y@kuA<nmj=RJvwG[esrڹf/%|wüoe>[a\~[UUB0yiX,V.GfӾ._c+~$11~ЪUK}1#ILL ;g'd2ᢷhBqq "8|3 hߧmZwxĐ@Nyv{"v)S ? >i44"nn?ݴ5k:kזAO>K=iS'q=w`񔋟zj/l-Z4fO?96mZ!dٲ<#[jɨaŢ5ȂN*L2 !?~ Çeh όzXTs[}Vg Ͻwνwu %yI_\=}>D/={uv&?c7ʃFfg 1v֬]On}=|JK˴>'6'N^ַv˹#5nzZj\N.2~4n7͚;n 2|y_{бO>B9{0-Z4kqЮ3O`#ѡSO6l6}U۴E1xH.lf~a-L:<|N3wM1hЙH)y9 WeZxw@kIТUG_ˇr3h+8kh6]tډnҢ}FrJ;Rv`ݺ!xyDE1Lsv:)=ۊ>䤺c66-{ĥep홞0n4Nάn;|x9{ֹx.Qm `v- #5y!Q3NѢ "G/̂ܧ6+ ϤJCH%1B=PK*T OKm w7'TUUmPu͌9XvDtt¿1MHD3aAyǴZ-$SmH7MiB]7a2R՚ܰsC6ƍ E$f AJw߮d\.1l_|ԟģEdB[u.G<^YnOwk<ꋊyO<j='Ъn$BH)).*Y4Fo {pϽȏ9N'rӍQTTěoW,_.^? +̙Wކw5U~ӷǍ놇~EEy8>4m ˯,`mss5kv-̅ /w&~Z?.۲3/đGAy(싎:0L&2Q})c1xWڪᕙgfRiLdY)t{l cU+AyVEem-E_j 5_ݱպ޻{C?NIIߍk߾-e /|22ZpՊQ)PUU_''_Z|o5~4uk>㜳c>lV3GT !h,Gdxnhyc_reI!KKx5iOQm|~=Z_c{B2i6ؘ0-1LD+U%Q11!H2 0dR6Nvtzg6ə24Ӌ&zQ_#~݃2(۰~)p'ǹonƎƬkoW9ZPog0l`ڶMի0vFryXGmr/:cN+eѢB*)%K EMll 1DGGi ڜ{evlNvN@Ssٻ޽@R)#ޱ#'˨(, oppwsmw_|hϼ3Gێ%۴f!T4n #'Y'h4IxCQPX`㨮fo}}͚1df`lV+'j|rh~?njjfrEӏI0|9'5f?ɕW^/̜Gjeڴv}quܿ_`bzZ/ue^]/UUYzYYٞzzL">>ΏG!BbBN#or=.6I9ܡڲ]ӻ' QYC fMujt"ض7V7^jOv.<˫fo"5SQ*sxݺe*X6vOe۾G_{>D&@*B($] ۮ,p=51KZ<^F:ZATJM HOETs?Xw{Sr,mΊt1RJ.x*QQv~y5S]Ann۷ 'ӢE3rrv1l۶#,?ũ_lnɄfj`Z`ÆM믿vvÏ>gdoߞy:oɻ~Qc2شi _rhٲ9#Gy4rs22rZ~}crү~De6}ǣ( rFu,_QP?Ċ6[Ž76mdk),*"-)O)..aUՒhtKٵk7111L?];p8xd,|n}F~Jr2A5SFEi!|˝|6_&! 7.W]VE?f6RLxAPh9o;waDGGp8ͤɗr*Eaܸ 2cƛiA,ѼŒ6 t:7Gyp81&=ּYvy!ŽΥvm?vQQve`Kʟ%ӺUK.1UdzcNP|>I!e8*+pWW#u ýMw"moMjWTK(. fQ & MmA9]̭4kFt{&_(U$ᅱmf֠f24MMի`$$ērrvE<e_ҧOoJJJڽ_ EQӧ7m(++cC*ب(zlf ]t`=W6#xjjj l"d~Pھ)=Сu!G<O>GϞ=Hm† }+%9Vg:h|'|k]֭3Ng-7nf߾ܐ}ٝdfncFQQ{QfקUլY8ڷ`˶$INJHg}]?.٣ZBo gݓ~lAne|yH$$Џv6_*| .' %L Td!ķOlB.\e#uEP c<_EΓcc]W%D[I:g *T>9ʲf8PCjr6)NQsGiV-H=iC:{x)HIO[D|$r ߈Ynj4#uܩ4x*Au~!mg fMo8"|A 18ΐ^# H#N.ob| zń1da w]] Aυ)1Ƒ#GKpT* 4 F! a4Mlz2}شxjjpy&%u+DiɅ1*B 4ңiXݭrPUR#ي,]V,9;mR?:'AQh2\ϯǁd2s9־ `ԇF҈ !KXb8.ChK꥿/v|Q*URZ^e -,-y2~(GP+5U5PZwC)ŋsB`죮kT#ш(xܘ@~ۇϠ(vCOYYAv kr[#i:589Qa 6` "0VH6pW֍ª/]5w6IF4YtCۉ^H'@}JQ@ď>CU*5N'U信KH9N&n4ӈF4⯇@=#dDŽ>{(2Pˊ5H nӅq$z`hD*8cN!su㼏F4tV}$eһD %JҸ(-; e5mˍRV]?Dj:Q$q=?W 'x"^yF4⯅P:+{N>r"6Eh7!bQ .Tg-*\lIENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/propelauth.png000066400000000000000000000667541461403617600231520ustar00rootroot00000000000000PNG  IHDRd pHYsodtEXtSoftwarewww.inkscape.org< IDATxuEw,㓌ݍ$@`Kp]mXA]wb !B\'{|U;3vy=I:uԱVE `* I` DPFHA s bXJ9LA˺5v߽)V(}6BDu#EU6r9v]2/s5RYH׀TDuhΦ!ȿ$PkQH4ha$Q>f?"zbW6Kq5akhneMlfD]ɘR3VOQ`VT#+ڵڷGśHY|\of\eT/>yH)KY~{ Vo&P4nHH =UC zϊ*IhܥW^5,5I wVv8Aǖth&*IuRMfKՕ7LQ~&^Ah#Ƴ ۶XĊ~gbv_F#c!u̎LRvNM?D; 6T]gR޹wxl_O X!QW $+?-DT23ƢT+6bqk?I`]_u UWn54OGBC } X@bTJܨ=? ?m@[/K}ʾ'cGmר'b& HҳGSͣRc@sUM,NJ܁f[!ZpS!b?|RiQ#J fC032GBR LkLxr*yb s $ L6egIs#^QE2<6_H->: ^j*5,ՐJnj>Q)O,h<"E"_*=aYx6:eiRr3ӑ_\(rS5AEu+YekHl-ͲytBU|!8AnG>ʂ$x9iL5$+Ң1P0fdޅO۸}EAHz=s6lj7Jϯc;AJ-GL5VfWl"b)j\-$:RNBqѬL=s9b(2bfeoZQH$BF6dDfQfq1Fe ۶R3o+ "~tv4i4ڵ0`Os: [o _s4 ? D0w'>o+b{ ?t}:<o 9pNJY}rjkkXWQr7,-ŇQ|xTzU[HCQK "6%H"KDoCE#v0;YYG#$z#MTBYj #8@RNL+ݓHێ`d$z݋}b=9ZamӢO)RWFӗi]C@™B.׽FQ4̆8FV:nJf"yFZhMZqmXW\JZǒI#%h9P)]_fIx`KJ "$RYoF9k:|q5Y{@cғ"ƺʟ_:x=p:ٽJX| B x6: ez#rhwhJ4/Xu=[ɺ?'uFeGX| T-Z(Eߧn6Vn6~Mhcq{mk8M#RUtI$INsI GP~S'gmv {v[` ͯNa#7O;}F22Yw},ۇQ{;kĘlxv,_^_Bz81 < ^\ݚ $Wcp'7 m+RQV-(ܚtVnT4@ {if)qsMUvԢwGZЙUwRIL?r_~h}ukʿW1r3m&Zl4\]'o`tcԱ !y)_ hΚb6V+gdziQE*fݟ$uUə#߸7cR||?Q|z=s 5)={DRUkC$7S#gis l~o7%S1 ͦށ_Kmoh<%?6k>GCM:$? {G+tj)߁ z6bw7b>IHkIuZQj3ٌũXHm$=?|k"=7{&,zBC9QzڝҳGwaDb5kdh2 LduTTTi۶ HMM-ӦOzIC)E޽0luuub%NxYY)-ZpUP^ Y@[l^ѫgDKX :u5kҾm;֭_awڵD"ANذq#۷KNd2b1(7G#6OXXKxzOkL'&e//29^g ~k;%Sa99OZa6%tg9WXR1_ٴմHii}"JF `+)>i%,prڶiü3;GfeK`LJKQ}̜?2{4m^x{Yj9|>MWsa#Q@Vf&5܋a<χi"{o/!#F}sgȼ938 w_-3O==k:_|!O=[rއs9Y3qۭrK̞#={65ߐԛց?G5I;`ʄ9es^M}E@)t tO_Ⱦcn&8=g;S(aJ 1[Z)bm Kgna+W7ʕ8yݻwצSSϤuZ7˖3hpddd;o⮬CGOѮ][{i@[/j< 寷ν=RtxYgo:*EZZN"‹/Ÿo+&O/[oX,jAcj&Ma*7ɥL44 uKBmnۚŔvdxU o2pka6Ho;>eW1(eyT\kiۑYV@GE nu=PyhVdnKM~K'Pry(K1G;7n> Սx4VUWٳ38}ôl۶˖3x>tԉ /< .bEr'0?X,?LcEwWҿ_? ^"sϽ B |t ot~c2Ma 599<~|znڡxQz]2erȼ6Msz޽ 5ٷD=4h걆ʟQйxKWYz|oOJ:4A"T]{>_.DGUՅp߹lv{o%߮uO󻴤C0c=mVĞZPE1[s#ܷ{gfEm|ޞxhZhA>ٱc',[,XZe 'z ju)E߾}QJc[)/?OUUirѣ'0tƏ@"arE3bL4%mImհY/yrEsPXXGN@n'@T!uj'.94SL, sB }2*nF'aIDܼJ>(ҋs)}]%dK4p7`D0Mo6GDs :'Rq{dEkזxm۶ZaAI: 8~AzF_t>gL&NhaA]Yv-"€@i9u _mv P5FUAQ:CXT:ϏD{[ƔBq왶Ĭe4ĉdX^2?{OO|:e~.iLcF^ Ulxú;NR ;v˯2B2z2.G5gdݺӛ=3"Сc{VZvl{>dojN: Λ?"W+!7'G 'lo` ?@wVan}@tEZFi5 ȍADy_f"8v s6a!$)1P/e݉4oYr-YOJZtmIlvR@)<G S]а OٱwBNRjVoX`^Z+us7|{gay{oҋy8#1y7tҙ=Z>t[uUU5_pzG>"Vy(x7lcddd0vWSN{n 2%K!C X]*_Rل/Aнxu+PJ m&sAN#D95!EXLlG,XzK/lX] 7R@|,~Dx*#Pjn^ %B#fYg?Al&Ytw, Klwqک'7bqr dzyRb1vEVVf([=Xz>z>D-[ұK9e^e^ sϿHv&V\ ;x{8쳸/瞻dn]osͷ=7|^&/l, IE+J!vSY߀ޮnyjo&KK~/Q-y!tK RP^=^|dgg{5Qvgs1/0&yC fDzif8;\vռk4EI$qL4h938gUָei6lȚkx1y(22vw̚5n/2S~Ǽ \|ŗyo,<6or*Vߦ \]IRE0+eIJim g`ɾoY${LWqŧb[)vdH1A*O-BZQ.?Y'Olg5C?mxv$)g@uƄ*qXBXxڞilUtqޤR왷],ߓ-̱rK ZC.cۜUTN[fokݵǑ Aaf~Rz$X067 m r]*FJkm>)OI0#::N0]vEGŔ[i{ea-" =!#yS/ +INԕsr]>iM-C$3IFRH.GIB1TqS{SC:yzTu zmviA5 AKF2[dΥvN_@=Z_x}Q?RZ5RtcSK61 E/p[R_j4tPcP]} y`d^Evf"N>IC%LOQBv~1W Zl"A$Mjy_pGԭH m!޸?C-t 6><#'OꝬ1P! i-sюE7E:^+&2𥋙}34,<geP2PhHPiM8}en} 7 jaQ"*04>ujεNl 1n])T4w(*# JpLy~]Jk<8-XԘ:M~2vN\L4?kWP,r@GѱM; M0іNNn\*u;PuDʲ]: @?`6]^3U*ڹHD%Kk, ev0_SLshH.)M_hl'6~J>TB?gACQ"TB$nm6Bt-9Uc {o܍FvvGǼ!I"N\| nPx@v$L2(<;fCԕ!R#Fz\rad}JʟOA1= IDATq8VmYpĴ%I71{ /^*J*-Ap67 ɟ 5#1ykH: }IF'!˩$.Q+HW2w;GU4eqD9eJn=Z9uwR\ۻ!}!tvVOZ%WGZ hO~Q.ERbgR|=ReOG:8̄Iպ]KcI H!a3!ΠQlv-3a!Hh=J9!Nl*ξpI]Ax  hQ4e DWPuC%]iS;(LJ)AG([0 xo&̥isaE0mq=Ѱ|hw4ս;\u Z_yaVN}ndSt~ӇmIT2׈o/ďGHQ_l*Wna 9_" q \fX$]76rR.p̈&[^HiqFBwrMzSV__[MA,̪?ZXdv(p4Ih&CJDeO} )55jcu fBFƨx۔8t{rKѱ2(_pO@uƒic%߆FMC3i;^ͺ`Vz+S^!OmeUX^ 8?*_JItupSs˹ڃuW?#`s4Q߀Ym}ȪOP7};1C|eAǣK*kȠ=w [*E"hYC B3P*tbs˽p߾{&wݯP$:m2jS,+^S!i {"lS`-5N4,;F*nBI,a`l#~h2I,@5xBHY 0j[Dk7UTZ:yތ@k0xE \b{M!|.{ݨWU6%;<8hPcmVar&ՍA dI R-I d3Q+8z|70]eU8iW/{(0;E9㉀M;/,}I8 bOOBCȻi^TECKk(f=!WI'y IM(~U~5Gu 歂sqO 88Mذ%H3l/PaPX<ҹmS(.^шT*b%^i/)+)B,*p5KBꖤzs ФHv@cZ_Yh=HGsz/_L0^ Mq'WT&DWHam%*jH;sˉ%"V75Pڙw=/^"j&+}OA=xa)Nz`Hѱ!ۜ_:}%k6R{ڧ+xh)0zG:'zƓɛL"nMB:؞T`Q& IN!*  7!n%"AvOǶCqabYyA-C>ӡ c\+u.>pf LeM  %.;k/I꘯)'b4 dfNKkqU0NCĥ{%؃!KR6aO92) (h݅J"w*YLqhN?!] DUzyWп_mЪsǻ: 7{eДQ ?k&Qay,*D"KDM!#J|S|x>1p=R M<'UatC=tO9hӘtEVVk| Y7S?_}9=u'ߐw'sצVEE7:FX߇c9c1cmu2^6m.]6\vEލj|򹋣{.\zt؁5k/rjnwޕ^y ?4u!?ǟEV|ooe|xx]+u4l.^+ɦh[;s5WkoÄS\G1O>l-Yʫņ@Y_o~,\?_}k֮xݺ+.޽ze6^x5_(.8,o> ;~}zq;\u%~ ,qeS|o~أFӫgwy+W恇c=\amﮤM2^}MG"gqv(J9xQ.;qM1B/Xe^H]]=O<[>VY~cIJn%:@Bփ禝ѻd #CKցHC$$wH)h)${)hOzh>W"=ѭ]ѥѩut%F^b)Fbeҷ?N&}}~D ;H\ußED^#D)SEDNg_|MDDZ>lDrd=""2oBKHFD2Sn{ݴ ȀHiis)s̓[DD("rRQQ)x\-_!XL***ebdo,ZJDD>31CeIEE444e?I";vȏ3g""O9Krյ7y.^"""6Kݥl."[e ;(1ZʥW^'""5n-[Iibd_zMDDLӔjYx8sY-SρRe)?X%u ~sY--"".帯}/YRXI.IDDVY+Ub\pUbd]+""6n+5{(%""/zEEC<{*YtK'FFعs*3pd;-@Tf|1L0M4i?VJ@,1'!yRorp"=B2}__[fui1# 'g_pFCd?G֗VN>Bzwnٞl|I'<02d_Z2m ;Gd==wN<z ܏#;v->LK-]׾\~ua3HKKuEE|42xuء S1p&Nea|i&x8t8q()nu2.#KAYg.Z5D_t%?sPv("?n UК}>8^X։3ϵ6?Cﯾ=qCѵ zŽ;οD\ǖ0MJvg#ihhQZR̉pYs7b4\G{ҫ6lAyŭ;1orss8#kɧVmDO|'NR- *Snk Ky0Z&K`6đx*UO%dn] ДRV|ў!:X"gΥl8fHr|> [*J(8M,\K;neżއv~\+7C|ˍ 473/yvڝY_~5ʪ*ͳ>M20&™ (zCfΚ_Ä/?fAir?C}]=@qV>f9\Ňv|v6}{0 .Zg!ҫod* gv |c߇i 'Ms3n ?L`9TU0r8wȃ7C^(JiӦ͟}%;vbμ7/.nz ,i%>x/S'm6Os܌ -a֬ڵ Kܩ99l۾O?<+Z]D>i0=޷f FA&bꩄuHšV &R ٱo!=L*6+0 ZҰ9%~N3uiGܒxܼÚLkgS֬3nڌi4Z =fimh7dff0?v~a2qTm;h 3ȨE-XCϿi?Ҿ][.\V^j#驂3kEmڔ1x@=)??[^a_˖Ka&1},.5>"zt7;}DA^_{%[4h? ! qap{qӸS[[$r+77UH>.+r琑Q0wzz(-)CF0yʷq)6tmڵyhwnPSb+LWL\ixDU by^öRR|O>o}2N=8d8- tӳ;VG)Xz-=wu%Kpk\{6hղO<9o/'v~ڶX,Άܩ#AuM z"|GN/PJq]o3}LCIq+:n o;ޭ  [k?ɪ+Ŏزu:w_#';[3/rU2ˏ0MRc{(^} .mw[|7[EE%yyl*ŠUkX|@^nkm?MSQqٶ}Xߞ'lٲг{7~Z?X,Nvv%%9s.&K=x{b8KvgVn۶1X_}Mlڴ.cΝ&3~oDn]Xh  nт`ƌ9Lf*ŭZQVZ7Sz7^q&`VY[~|͛y7زu+~ٔ~FSk$K:$; mī&CI򹑐|)o^:@[rzUU!JA 64NIT᭗5$JpT=Ѥ_+-2>d~ʢl15|v*ڮ1 j)wQT;e`#2"ꔽrċvN֒RهgaJ+vyIxA05gćKfg ]_k(k ؛1BAvS)trJxm1 q?핱1zzwr!'QWiLмLM$4=5I[YB *2lEJeȮEZ`*uc-7\Uڏ2)rtC$pB@'8YZNY4-}@}aP zȧ]vu~x8cm]mIi&*mO5l!qs t<| K7\rVGm0#by6#iZYҿ$3a=6cqj h! [!;n EaI IDATӝ۵@M){VNrK뻮-4|M`xtVq/'ACspc'{{TČ)_pᇺXJKW)_9sm: z궯fܩ\qyZ]$pDX|yx.:}RxѤo43M" r{c ;(D5X) ڑ#gZNfa)p~.\Wq +at 5!3C ,nj +FRc /s,b~|oQ#0;Qm5W\č\̙_yqs<uH?c4(kJVhF]7|a|N3fhKeb yQ %,pVY#ӚwJH@" TDiAmڍdȣL̳ bhSMJ =v cւE۰O=[ѹ#W30w"cNQpdef0k|}5*lzenJ/Y}08u!F'N7Y\zyq!ѝs<;}gJˢB-YƳ/Ɩ-nJu EE,ڛ: w.lVZ= (U 8ȑz±dg3w"yuvοBپc':_u88y8ChۦtUI=krJ)fN}Я;vfYϼX,ΌYݗ9<3jw0<\t0t0_}=We͠}op2t}3o!|ޭ 72.^m9x2ZqեӯOoTT1qTWJ+h]V'cLŻ︕‚׻ص{];ufuMY)]|}z`ݼ{|t՗_@^=yϷSQU\ёQW32H3 .R?q9[hR"Hc[vi/;JF.ѿd*W ه ÆH#I)HGH+#w(eO#CJСwD>Jd`$F}9PFs` "2ݵa]Ҳ@1Zv{yRDDjkd%ymܴ+W]="ȶ;dry.#TR+z۷gH$L.ZI$d&[s!m#|7MDD~}$F"ym]E"y$^J THbwyJDDc) qKm""ҪSvk։H}FH""ybv^xͦg[($Fag1 :QYG9K$RYz 9Ll.{**MbtHA't;W,""/D :ON=Sz=5vqvUֽ:lBȾB~AQPG GQq3qFq_(Aa1I }_ IzI'NKUݪ:u:uS\Có7}/n#I.8ijd|֛" 4l[ $^]kkςgSild炂/y1cF[I:]i친 דi9D,N,l{z8ws f.j_c hf| mmcf~'t?!H?ujٷmd[YxamN{2S8g/i'UǞtm2s4=GO=s/,|ÇkbcYq3GwSN:aü4;j,zƎ{c̱'qkQJq_O0s"mM)g'a5Ž(W>bYˈ)pi2:23{+oXkC^27c<4!i :+a+~)n{|:zz}anln;9$IX2v<ϙG!o}- Lq2g29)}C6̛ i'Le#ؾc'Ͽ p;p{xso EQ$;,w%L?NƚXa3gyrdhp0ײqwg򥛾~ ~n;GBa|e+ e=vq fhl$@LHR5]w9I͚ͣ,[,#e*A5_@%L2Kk0M~)Syun\xs$W //_Y#gæ-tvvgOK_C-h`Ӗmtuwsc9SG?|%,_Y(f l$7UC=yNvOG7\<9ә8(P anr5Za$S*M."\7V+ګ$eĉ\d5 <;mn\+8n$:4j֮gÖ-&XψͼKQ=.ߥ4ګgDXicSOvh+_4r<C,ބA>_'iP[Mev7  ߘ`,]ˎ@^EdA:dC{GM^Y|,]3>7|X̢y%\ztV-[ĒW|sױCwp>~ߢ⹧e7Py 1Ddu\N祗WݐO=_MK[;P>=q.(`C[=~5Njm[طe=T~LP;*Օ?mֶ^oH}X-_n8g/v|5UXK\.^{< #^ϲEs+@k[;>4ֶv8e]:(ZƜp/Lw\|2tuwsӍ_bÊ%{-^PZ``Ɠ s~ʸ#G|:<Ə^;C݂N>f"mYi+7me̙rW|"6oyo k6lⱹ ?v Z-J_܋˿Gf͓ Ǯ '8qbO*M c+V<<GCC=#F4=<1o>GAo_wi&s\@sKؼe+K^\JQV3m?b̘Ѽ|,ZBkkGRaXS 7Of 7nRq{6}HwOzv"HR3Ia0MM􎺔LR_F5֡F~aPKSHǭAL[zz9붋S}vAhn_'BI{r\TKpit~Y]qeS&駞w,8w;?J.Q&63 pCF)~;ȕWpg# `fY'j)-uBd mpӋrUS 52`^Tvf)'"ݷg^2-9yn3MpT:\gU3hBP[4DQ\IT*iSne|#1 24 n+]^I5XC LŠQӋh!d;rʁܨ ICX"KK2tBsRKX%TZ"-QT+*:Dv_aeCe*Dɳ@ю$a~(|oK' {s5?=g>idZ,_83?6z"Ct+*$k v@ٔ{[}S\To1=ױLqaP8Kb<,fAZ)XD?Y ZH!HIG7rcMz3>*y9QSrtOA k@Pۺo/WmizBI+6ġjr2~3ijx  ͦ{Kiy"sCK  vp(QT{\Qg5te3߇F%HlT( -栤RYA["HHfZm8ksF!G TI')܄Wvѿr?. `t|Gŝm qt}ŤOAU3Ԓ%%IEW[٪WͲlDCIYQ&G mshYO{v*gF+pXR&$4LJu {8*檒)ۓࡻzPZ7Ćz%OJEG¥ͥ9.$hs/;2I|V;+qO\nnNĹH|,% W!"ĀD+Ǭ8 %$IuK4{89MjFK&5@o|˽IATJyp~3ˀşD2L&Aww3u+6|wh?8v6I*EuՋ9-ut_A+e\+$Kj3̈́D[!8R*"bk^Zx[k ڵ!G4Pr^]T[J0B o"c!^ 2˱괏C oQ'5U:+4@ԝ?=n4l{A !m)L4&N,o5bJ,zO8-˅5K(̙|h+?LyDvB456Dk*c.JFzvm#P]6]J)e4NTe2f3@Hn}0BI`|AR:RG5PA9s]Su#%#Q1|ʩ$^]WSE]+ѶH2B9fӐ 晐D q.At_ $RO?<5ZX*Y!ҙ!H'1R"~qy-7+Y({\zk5֭a`b*O5ג}{-^1Usaې&Fކ# ҷ3жu`?ϡs徕Rhз.$!/;cAjRBe-d'?eH]G+A)Dy؈6c9, [$\sTUAH"dDw3R1a"u*uEIGR{ 0 UIDAT $1δ0"4c"~ydqd)i&H\r U+YV yFujD]Bxz% U*LiyrSs}Ç.ʧd{qdJ LXKpFH"o@'[r)z,vXP@tIYSl{tycBJv<1wڶD H6xM2K 0pzٳ79 >0s'ѽb'L֙ %[ F]H:Pi6DqbC Ha)tS~++Q$J )_p!]s2qqmvv3:Љ1@  _ 5H}Զi4>uO)ӨC]1U(0HMVQA8B8n9K.,tpjb )w<] pj@+딖EA1WD^DLv`?$g8"A0mi^|TQלMybcl84uӪ}Zdx "%:5Tނ'OZ|&qqa+0{]z W2eZҊ4^uS'T AT>'#P"|zAy V]6䜔S2K}4W:vw[}?e%ӎAq?~YrWUZv%icxY!LS.+MY8@'A4jTvNZV&r khL=Nr7fhÖA"P^%{@u*w:{U$*C`d ]~qU|?Ts-i- RWf(:,SotϵfԕR&8S3͞{aϔ.cUˆ [1e2CYn꠬Rw  Mc-'s)EJEOm%/ UDSk'_|TK?7ocا. '*O?f$ wM`ҥpi4k>/XWĔhD,J2Gs#^okQ*KɶEJ)e/:-8 }*HW7 J dG6ph>h:aN%ӓHE3,GH"9PFĉQ3D4=m?!{ϛhוY=q:% 3}TPe"JcO."?IjODA'h5gP{rgښ6>#e`h귵ZqUdc0jȮG]<E#_q.wV^SR+BޘUJS:OD;N,wQn}G(r F)4Jm{G3 )Olm2%t etjޙH㘗A*YTV@b_ODm-h Xp%DDŽ5|~?^d\ͣ8-ϓH3~'&ɡ?`w#Q¹aD9d;nF4te[^s*z.ʛ[HQtUl4FldžQϽj%H#_ܵ"&T!Un&JEpt])T22+EDk$gt2zys nCg (Aɮ%GkvW^Gd #O$]Uզ)ݜ ?-28NJDc2 ,{:E5GGd9?_j+ÍkP"ZbJ|c0iZ)A[5: ^mvix1t%R.!g0y X<6iW2i-,&Czy^H 9 oyoD, rLpϕ pGZkG wxO$˟ZAIv I(p9:韷o]DZҞ6}dzjTz6jwX OvyotȢ@I (p *, S_f9buE %YFP Cˊ /3-,њ^1w0жe#|jJ.ma֮Ji__xN\K-\88 DXV ٘LE*=e*LsD,%tygaQ|~GH {9?sZ_ciF0Uc "T G_%b"yB Wv<#_tSSɹ"={9՗"fT-ԍdeev͡ݨ~#+Ӄ:^e+`Ҥ&N +葑T& W.zR&荷 QWFZ!eOd|Eq#'6Ep>h'5 #T 6@8 9"VisF$򮳆tZP_JRU!51cXG5-\.XʣصC!'t9҃]= w\sG|cpyQH#=H)wDIM>j?0,WRb1Au-~m? 3&ٮD"-*䐗\Q%JQb8' Ql`0MHOkޞA.T?L  㤩 FY׈c>rH* {5 +gQ;έh+dOGtCo֍:<*äIteF[;}۳uƛӛUjj{ĹREcX%,@StBFL!jT"T6smn_vd]TK,]HѺ )r?Oao_MKk2o={_Yg_P7'y~Ϧ5ݩt?κк9ll_¥.ڳJ2V}}YSKSPѳP}}\!/kTbU^vSss4Q5IznaZc rcxBUtjkY_#gx8`_ g_br=! %HTwJO>BVwC?}:{}%KDaV-;l[/~;~O^\FRR?ʱw#>96o++_Hp96)xji];h>Zkya0A1Śj{Bw޶[@[& TŖK^zW(ٖQ*(iq8 i;zQ43O 'C:HbOdŝTleX]'/k$}-й?s79H_܉#9,rxJpq?H="#ۀw~y.lrW~: 7gEji`bz߶FΌxÿ dՎ p  >wtRiݽ4AS |u :JeQzk8m?O}vx# *\F i$]U ~/rhlG.pL l(^~مtd %KP|\T?=mGF4{a(JE3?Ntܵ}-&O"{*10xB›9sc~㝸5廏{hþBE%vc̩nÈ{V=D+~;ovIT­_-,zWnx9\k"uąm{]ݻymh̜ EQzJ**CADPUmh) ,m>E׳ض)5RKkm*䫔D6{P=!70~nç5ёm.Aa@y߭wr^E~֣!N0{xZzB}ݷV׮3 ] h]83u h3yOqo*$hL:)rѦ^7w<͏3P;DKh{~Υߤ߼Isş /{+Ϯ=sL7zm|QsݯyL&Wԑ?4 p1*+,-n[o~^g)ʯf, ?ZcXscrMca͏bʼZ߃C'1ޭ_tr0~jޝ|iˀj6.G0g,PpА#7l·$g"KIѹ'^1@)> E??%k7G@o^{uN8V2@sſ~SN.~ٴy7fػ{uЎ#f1'^1@+ &w O>eFJL -?U}5d日'-Z0g{ֻشu0H@\xF x右sMm٬SZI@ [eo3@- (0zcP#@k .p<8b lWh<5}hSznm?}ز䤅nYkWP+g0}qfEe̝;1wQy_ⴕ )AuMټ/Gyc,_M8tBgh1IAыY*h.~Q%]RV"(64)3P638⹍@€-?u;]{g_r3N)b΁ h_R5M/w{0O:eQ~;D*lkwB~2bh+[*o7 0-YmQ ~] Z‹? R UP$04)XSv3,^.!܅:W޶jLEE9<׀xRYUnnt,U ʖ4BnYycVxg6iBKr! 'O]~a`x7 7 ϿD?<ͫd?W ouF9L{LެV xex,~x.8c4.ѕ[ ! G!ʾ.PB`sJԭ=xc+hܜ[h : [cjEG\)Хlɗ[ )FUA읎J[cPtLȝS#^TOGҾBjQonJS&Yor,77א0mEغ@%-|6zivFmlA[\/9^Q:Bw~ӥdVw' u[1`I4Pl^F  LoZzǘw-|%1,<IZxӟr%WޘIxગP/ W65P.,Bb;e $Vy.ݻ9/1gA}@?^ (>v=$rd"i;&(P> Ig˖У?#''?I*#׎K0Y8~>4e9i_lihG /tq |অBM!XL 5!0DWm#<߸nh 2m+@ o"$^tЎElwBDWDG \+oz0kkQmvW|6ZZ*VDIt^`恗U#)rSO߭VH=alefl5o] PsccŵP߹fHyx3x!=C4}fk j|~nA1RLx/DŽ3+rR||]I yUXs5o}D *IYj0۳k@zʆ8é(qp ɞ{"LL8k#= pt&^fcg2zUKɧ&0DYzao4/mwK 9AaPWc8aP'.O-wZ ];ipYm}ṯRt ]|:$d&D# P'CzWz4 c0?_Vٷ[Qr?:TH%k"ŽǺ^FyUTH |ِz EP)sKK͞R)@yttvn湇w ;5r"'|w_K¬|H"׼}XuJ{ʑ*%W 4 0_I}%R"AVc>xd?ak󥄤I}Opo<.^+ ƕPZxI&DU^slڇҜ8h.p%Gs|3ʐC.Mo%Q @`J;*ņCbZ7^a}OHz~AM- K3DE$5ʋD,^*[I0W,"yR&?$^o$YQ筟lw^[%eԎw O9P8៿T:ArKghw:~=tPrj۶#9:'RѤ֟pqδJ'/`Ve +]!QA?vݲȕ8GX/frKWGt2*O&\]lg4#Re1feʀ\: 6௜l;LZG%1}MY v?˒sn3}!1G8[}@n'MOnxƓΌEOLh sv8nKbƿiĴU7׶q2͗De?t~u˟߼g>7_n]*c9-4NLջ )'A5̑ s{bG_\d"9]qK9O2$_*Jqn3bҙ8_kzt p[fteշF,u1/6[qõ~\vaD:0hFTTQeROrXB_nmUB\i?'y?JyD ԧ]_n7whaa7qe:WZʫ:3ns5}!ǢgYa5Ц9-n1Gv09Wg1jR6 K9^v'?߲-=Nz$'UP[:NԹs8w׵V1"[9.I%NKv:}'),]m$._l =FZ#:=2pLe;>&ɰUF؉ܴl,~U\OzԍC|T"uDx;g麍3miڅ(Lj/]&\luZQ1uL=E~y2uҶ f{ܺꗶ-dqx]q\;ݎx7q= S禿Pi'mTQoC/՗=8l ݝ6u=_ku:M_2_eK@94fO 0!9$NWnQ7IENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/reflex.png000066400000000000000000000260351461403617600222400ustar00rootroot00000000000000PNG  IHDRd pHYs  @iCCPsP3Cxc``|[̢WRAA617-ˋKrPk nFb^\[&s-cRR VI.(*a``AvE3S [@ $a 5 vQH3}VHGb'!ssJn'5/4Hs C1C135l`5@h /p(N36qb``gU '{g10Ao`Bý!a p (, Li 30F20_9\.gAMA a*sIDATx}{U>gNH0&'$|w|$a#O@q88$8ΌpW$AP\$3"ID`$>]{o >]XkZ{v[3T-O,&%"4Gٞ45:9K㛜f_=В_\=T3ʤd*[ $X޻Y*SZݪ-^yyN~>U'8rW< kx 2^z| . M SMz3[X;ЬdZxX%a NG}L)WߞokoP`б6`8Q֌MP&U')$iՀ؊Ѳ-P>QݩCmԭ)p*Hzk=Baז/L+f+i\K@^w%SҫZӎ瞤˖꩟ۅTk_#2埽n}(2́/S9X ecz5ִtgGt["Ӡ 2/IߤjiN6IQ E{jF402!)uJIsM62I\hfVI͆fdO|nӮF#&eO lcf6R}@ _&CDSOjM}}t)Roo/%no=K#F(VhSޑmF̍X~Ct_F;Xr9#bLkdG,mH5 9ҖF!b5Ck>P!?8&fY+*ѩfeƤ0FJ<-b*:R'H H%p3 ܜD4QOCu*qǢ̼v+5ݹZu%`tD 2zsU2g \4\&?Vm9^2n7MɛUReuVV7)/ epH=&%lFT/]S[>׭xg 0o [ @;3?~1NK_?^OR򿸆ҭ_"sض!zWjwKkY,AW^T<[oLsgUtB ~Z-yip8LҿICJ,:0=CصT$`t`8T 6nn0 f48aTC~!r %5DiRD MJJ,D&IjOsu6A99H Or̂6{lt Ѭ=&kj h$jt j\5q6.x Po9p):RQx X(c͊j'X4"iV2Czw?}kXegz[=n@ %q7n mR9?֝wl;vNKRzNXV]*yRbXY R:E*s#s SPlGUej+pg0o !9f9xV*scP6rA[kHr‰%`,#eEE'J9u9fHNmnh)E ?ϋf:Yͱ%m 6Y|UЯ]))ss^tsu)U ,.&(ATf1{tR>pIބT.y3X*jf.uܹdV/(:rD΃ vᏟFFhdz eO~mo>LRs^2 +WN[v?}7z)Goe)11eJʞ;GȞd | iG]w|2utk?~;uEюg~#Y@IR5x:AwRA 4 9K~۶mwtWU!i-}VtH$ .>vˇG=PD&[6 i7ʮNOe)P[ N_l  Skk[T$--;n(. -[0i:JDp8ɂfJrZr`<պ1:/C elKL4cLdIE@WwW[oOisym)|㟾8sM8>BH vV9'N?Q=rr2G.1.Y޽Yr9mYHj"q[_Oy{c֟25ef\SȤ:a<*R~O*lP"}Y ڵRj/[o&l׮= }Rd{bM~J+dE{>u .$85U¢'~{||K9*ڱ7 P۟x6uUaPk,n}k B'EАƭmBӆsy/L+Ң$c9^{B% [מ%_[Xo Vvw |Z=K1eh$ VYL<61ʚzsf- jHɉ"]) Z`,IH9PC(d^c' %URcᙀ'qtA<0k̖%c lfV0)ALMyUv\Veă%u1gfMN4 )y#B-zZ$q0T)S$RF^#=1viNi@6<ݹ*(Jaq$²LT,!meڂ[i iS.p: W"QvPe2 /pqAeni9pq+@BBXzn,L2!:єNZ|TY0xPw, 5ZTZbR =5i+ĠVy{G2ۂIo 2e}h?V{e+bCzNϼX/ӳQ)?j9ɵ~ #֭U6hTc9?q'&0-,\|nC^g "/KTdu .P2sZVar2Qʜz P8AmR 9ŀjlCq1`rCjРr2_k% ԭt[+'xQQ!-m[/|ΤuΧVmrʀĝWs^M3`JVBR`?DcҒƾXKCZ@~S.>ӕ:Bv5'g8V:yxNo T~88(T6h8NCRzҁ@`vͳ7=-ZԠgrPr"4o/NN!Ot-<[ w.0X#Gj.nYU:DIU6NZBaC 5ZٸK埻F[VS]/ꋘ OfR  t Lsq!(Mr \f-39fVYuFx%o[xdeiWVkVfk 2IwPoo[p] w/R^ 'وF 4bUDXZ)^5奟:NPS3 M!TLxW1p-%;LGaڂ럑ذ!0/d̳MXgwC;4HS yʫQXN ZyxAұ͖(Ugպj35wy,[MIiƲڳz~(?2CS%c7J޴ySK^?;:; ,S9˗S7#1 ^{,Vvշv U Xjz-ȝ(ϱTYR1 ~rJ?Rh97yx kOwt 6D],5e,Eut$ƈdY6 C_frz XJJB,k ^# |9\ZM#Tz ^Uvď^N]v$+*7 MQH6 o{6un?b"+԰r._^ڬűW[pEJphƇP*r bEYVVI@kJ#|r:>3reڢ^On7yPfˬ;@p3EZ{Z*|wם ܉3M\^ X5N ^8{ kٞ,8⪋(.xAX:7-Т1%,L%@FrYƮx^E‘{:y`c rp5L5PYYaSM~,F#q&Z|jd- h5-Z{6]eb#;rT ^ D\K%Ҹm䒔_"0.y%XBJd)2 4X(t^#aZ,I'nģQd9]m1cl6JDb' .%TkTZcnkϩ\Jrdڻ*#7敥Wacg]˙Z$+. ^D'ujriiV^ͲXڼUn\FjS A>p+4W]}0?&V< W/2 r|1BsjkS?o]L.Ko1ԍT.Y&:飏<`v3τ%(=𜂗n0A#Xo Ƈ:߽s]C}agm**y ,@0LY`ZdgspZK,eB ̖˚[Gg_4^I(ʴqT]\ۈ]O/K8ÚgV븙TVX.9\[p)ERi1 F\#G؍G~$=96'&x=&?d:t뮹`x?i)?ZptXr;QLB#КЂ|;߄<&zgp[ݛw e\J%u >Kq{|,gIgdH,$uP@'͛);hNu.?p?/종u[OZDDepB[j Nh  >"l*$ 8N橫pZ5*q/J)yx݃Thsh5Fخ@O]uG"D!p`Aܨ3 4߼>0 |uXMҫ1}V  gQ]RO}Uj " 3G_4K_/gWx~F}ksSJK.+^YUп~7+t/"C#7AgKohXۼݎcjY]c`AU×!g[h{x@`r2FcxeO]f>)'cF/uu$`yt;ĞkoN!c J`D>WX^rMD $2 ُ@8c2`$)7LμBtMP^-ş^ٔ72d]]HxrU,PR6Lz8H nhPP [B8*8$igؚK-$6zNo99^χ[m((!)yrxW] ٕ2)a1Z.R%n@6Jj##֓DzCUU4,+ -zE=t\7$o~ONxK7E`q_?#K餕4S$2'ϧ=_& ԕTu믏S[QrETd0s_,oKʠ(`n :"|Sj" 1x%# tpˌgzDm,`e@}!ՂUu~,rւsV#)e[Z KTCj9o>_gU|!* Yp]ypaׅ2ryfn|ۼдaV8ݿw]RaOpZ" U:Te'wM>v]w]s2-vťpߜ#P~?(nPs^I؁ۯJ Ti?y⃂֒׆ !Y.%-Ͱ2/J1 -<^aQriIj j"Wږ] sRx'͗ixd.^98wd lj Ґi [U9;kpػw0O\8d!Jm5A u&.oQ2}oK FX2j m}V@KWZԮ7p!̀juK3ۥ]+JJwB9K툩UY[[GQ,WJs* ~wKXT2qev( 4ʲgtC)M3yf+4v/TrBbRIIxV[J_u;a$%Q%x*y7N)T["nW󬺪!m VjqIzRHU:؊auvА\\bcR 11OTGεҘC۰BssrP=t.R*]pq 7R2".W]8Li ٪SԖ#G3rq:[+ls?5e;;';V|ظ̕gw,BxUAZK\^TMS%0(›/9fw\>̈́{"<9NL#Qc7CCco5s|oֱ~1y d6Y[q͔:^n5gШΣ1%ӷkER٨TNe9iQu)&';z ˅E|zu8vz:v@ZCTyR[v zEWۙsÏ~N'E>Ő6v?y΋T\ir\~mqw[h~>Uoފ|}9n, & :<0:.kq}/?gG[l1)SO52. +E> a5T#ڭ.lq4b22Q"/ Ҡ?ON#yNNA\gʖɺ$(U z7i/eҨ:=e2툫]單)Bnt\Ä04\vF٥p?qp5؛{oڲsfi[ś_[nXkwn~vW;/}Zz^݆N__G+\x*i<}Bl*)!9cYVE=&%%+^uEF̱O=IENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/scalar-banner.svg000066400000000000000000000145641461403617600235020ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/scalar.svg000066400000000000000000001075261461403617600222400ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/speakeasy.png000066400000000000000000000112661461403617600227400ustar00rootroot00000000000000PNG  IHDRd pHYs  sRGBgAMA aKIDATxOpTE*LUrVX%a05dj^t`jjc"* *"ۿ7ӓgUM1fޟ_w%G O΅ f. kT"2ߠ{jGߏ_Pxcߥ/Z>bA׃Qrr@kAY8g/),G5BpQ\ڹ@QyÙsܬ I /#_Ӆڱ<;v4Vw;"B?2UUK[})0n \S \]Q!%7[YP"gȏ-_*#l~xH]r-a $S^:@W UE6=vo-~U ?wpյ rFfDiִ޻5rLk 1eunXzX» +S-Q˒ fs}*Y#?euN%-2g4CmrbjpVNe0L!j2(9dP?"UZFa|ovgr6Ʃ(Kj /qʷQtX5W s xvA\XJ ɰ.)t⼻k}~ccL? >_H9oZ^GM щwZƁӶQN4 1+<6ֳ1vl5]8P[*r|4Y8dy_{S0y s$9;k oo /K9ޘYd57o,o(]{= lz_#ldz4soιbSZltwc0εbB!4IwDR}VY`uXx`{GvBhEk /.2M)2Uͱ0pP{YyU. keJanZy֛)Ub{_&z4۷.KË܁X ,Qpe/S{̵ԴAǚ*^F k9pʛXu졠\ƚ̢A5̓h%;2n.Yp0 vXU//g:aC·v9^Y \= Ng{n(oSfJaJ)̗XrHz{w ޛܳS]6 9#l. m\y:4i$ ȋtG:̴YSز(li^xrumG$O)AOj_ڶQq>C&E(DG"Q^sms#܄h>LQ7?pmb)KR6%L_ a&*uRƀqm84OTA76#"+E6'O_QՂ]ҕBaAPN1Lq";Nܗ3BZVTA p-I-դ6^Cr8|Zl_@&_|쐘?lmTJ8"Id]L&9ykr5k*L+@p1H$OT񐇝pP?<tȊia=}-9׮\I 3•^{ NN[Q2^Py):54xiQҌۯ'*W`SHy/ 36l >Ҋkɬkv8YŸ~Yln$B,CңK79_* Sdœ079F3-ǭ Yq2QYAtPe'ŀ6Yoŕu_8a(jNfm;uQOEFBpp[ͽBN%_TI g`L:h~ tx4qUKN^a.(k֍ؿ7{$0^&Nb3\mVNfNcdA!*m4*X^h7h\O6R>iL>iIKy:hS=`l#pU-O>yyyzoFlY*J>Re̜_[.e7C] 2ՎSMأv7ݠڀvZQEqrǕJRK31wF!2s嵣vtʋ»ܖvWnGtmc.7' ޽~e# 67x{|e(Ky%(05]) !%1Ns`e4bŮ3Yyh ̡. A""fs: *E uAmBL a}~28s۸rLW*Ht'@kI*"4=oQ NOýnǾ۴N<0oERsTˢ?ߨ(7FZz7vDpve1+aaZm݄U{׭eDE,ɔ;*M{~cu8MFL:~d0MxluBT<{Q/ܩ::2?_,6n{/6HWcNԿk;xщO@)@9r%Fd* Ӏs>j2YT5PF%&S6Li=in?!v%3FUd.gtDH*2&TE gS Fî !sǖ5f;Zi 0:\UqU}rҠR?B Oz]!imDl <!ĹRuב`D%J`L`l޸X{¯Z2ÍQʃoߺ,Ћ5q;e7W%kf 5y\k}17w [4 AhL8%FQsy^>\^3]MB<9 ͪ+QJkZuC=eT&ԝYuSaڻiDiFaPX>iiOsow42EaF^a`tZ,!( 4vBBf=¸~x8v"W+=ѧNz4|fha_'sV1 " SGǿk|\8iu#4nML7-va]D'c`<'BMj/cÞd!ߋ;z#9>zpHZM.Fda_f]-=5s681/{Vqcwy(4micP}/2R~ ;٫$& shڗ<ƒSzY˗'{ ya߆ƫD̚1$S>֖V6J22Ӑ$ &^1@}]#%,u zEr,&Q(MFv [+wYLwzAײVZ[{{c`c0QUp9Xo!!DDj`@x@೎DQDס7Ed[ۯFkф]W[C>kFTE'b5?ާXBٽk/oL}5uHdA`Mz^z N?k]x&+EG!;'~1'zo!MF>|j}clVRL&#aᡨvĺk7E '݇p5Mg6Hvn&Ɣ "$Rs}ɼoD|X2RSS;blT1]*Qyػ{?z;J W0rL ]z:,$ Σ(DI <}ʄ.Nqp:E0atvکk$99Qفqs餉Hkk;mmmT3.lYhknCQT,3e 3d0 R_^G}m# p /wWNaPb&~nRR3lfeܥ zNWh`?NɖM۹o$(8Y`y=o_')eռ>=j7/RTǜ yc4&N@~a.]>O͡tw; fޜ}$nG=o: =_}1s/<"ӏGӦ3(gd}#t1 v0bt Sz8mʻ`V౧-=U|ޗP_C>Ea4lI9Mw!08 WV (fzFe xpKOg3wG:Lכ z_Fos}s'gXP{^]ZP0&]~wDbÙBfg;.a Qpܹo2ŖMYґwuN2R8PUs5x"gvrc˼2M# Ʀ Xv3?֬/Kzf*gf:}H:?^s';xx+9O)KN"$,ֶV,5i)$O7g>`0-HHgcU'qeCaIXk'\G#l6n 7D$""ٱikm#w`x(Ac}52Cy|3k>GaZ9\S1qt9x79T}{ƍ`gyL%1)-;q9e6ۂM ew8PUMvn&ra´?fʓ݇,{ho` dbT wy?_ddޜTaKƫطg?.DQ<6'#xrxgŷkH%t:%.>o@U5]$$p73 Mr}7?<&eK0tZG#JkW#spz]ӑ@b|Νp*`d6!vM#/?~dxBBٱ}>9PQ, /ui\۳wtRS]ۯ}ș. )5y4l$%g( To$u@26~ݼq;Fa\N$lkUuhHrM DDoRROE)ydR"C$<"{JZZ {vcժ o&X/8'''~X-&Ow;^eeepߣ&*& VrMrÔ?сl$U*`_ڭddp餋HJǣxwhI9Ӊce\.*wj'S:ή.[dekikmGD$2:sn֯jNWFjz2mvGphyl۲UfuW_QغiH: 4P\9q=y9XAfoLFxD/8I hFH}?g 3d8k Nˈ%\x9DF!e;zN27ߞ'_̐l*waXf;ȆHDkktMW\DPP`_GDDgw=Amm= eν^QU LaP֕o`}F4McH^6$iV|uo>[Q0[LX >`:_ϘGEi[X @4(YD\|,m\.\N?s4cIsS [6@v+Wv9qs >a.A'(ULo:vl$sp:a!iNShN#00[rBQieSBqi>NbCfBxxɗq:L4y.2MTd$ٽ_~˥$xd@B zvlw>咑Ddxow5[^ym} xU*a HMh*BdL8ECYz={vW!Λp$i%Cz%ÎX2|/YC&^~nLu|F M@XD(F EPp !A8NZ[EU b< YxLI:^|uN #5A]ŷ<|L\9HwױTHF,`&TU;ɰhXsql[SH-|cBB4Hv؍餣ЂS#IِtCQ<-^ddxd2a2xUxטΧypt:dxZZ0 "jGnCƠtC1 '$MӰX-./ W`1 IJūk2P[ioYv(rʪeY`~$IK韘++{c /A{A8qv1KbC&TU7CUUL=VlLl|ф>\HH)iI|=s7mE҉!lp1jL) `|d#J^tttX,&:]ycX i=IpN'ƕRS]u[yi\+gh0{~~sf-4ljGitxOiN2`4qx\s$ni11x!g3#7Z^{o̍e,Iz~q)DG{#3+Ȩpv甆DjZ2I)KaجV$QlT1\IAiJl\ O= W\u /?&+';Ȩ>GiZpepvb60uŢ(K>Xғde'LJ$IGpBFfz:.|Uui6"‰3[Yv;( \rN~8^~ Wه3|mc Ek5DDpP 3gfʵ),#8$ bJHHȓf}cWtq@5`x{QUUZ[ZzZny,ˌ7ظ(V.[CjK󉉍3Chmmc޷AxxBcC$LTt$kVm (82aYE,6+kY0w ͬȲW ?FN'q4!!A-^&@\'awaGp:IMLbMTU$&6efj5ObK4ƆfS by>=n܊h4"IAVRӒhnnaJr\a%yT9Ȯ=%{D/(=b~Waxx=r;⩯oBQfY9H;ܾCk)_QIMKd1jطAyv-YC,#QnA%V0"YK8BN]Lag];lڰPTDb4t*U5w18'&jꉎ䆛Ip:\455,sWmyjFpX0f(l6 6lj ȲV֯J< HFz:;wd bbce;2IsxC'w~>`y= 7OABBGmM=C3/W~Ҏ5Xr=_Iy^yn̅CwOLfx}#TU?z RIMK"19y,f#fa]d$$$ȗE[Gr- ?L}P''{<şos?wgM0ޫc%I(r01g!aAX-ryygy|CVn&q2b|m$v.:NxHAlٴ`lV9feԘ̵__L)xE˗y6qEgʡr! Kng?k, r>pHoil^ɊE8^'2ӰXTURpFVEM&C>DNi`YȐl,V3Ghh0|,AYE-+DEGqEw(lV6HNMsƒhj2pλ`0 EQ0L20+ ţЏk4(/qҟ|#eA 4Dl6+ё3atPVJZ2EC FU4BBMQI>=VXG,DQh(ƖRIDAT ތd.|w{#g 27`2e;s$ P:Pl6 7e41|twwC~V? m|)Eyp456Pm;׏~Q;Hʎm\zo BQTXz-cƍFvܹ믾B-\Mw{Qc"^͞7<% $18QUoVRIփqkz jr>=#$Z>!cM>ӖX*IoW}4mr\멷}AMB~4^U29r\37c,Q~sUs]Z#};Gm} ̑ۉ'CӎqEQ;&#{͑p>_Y#﷡Obh?v~if?^ɍ]C`p ֝ xX(hH\S'ay]HNw30} AWabzd^x'!:WU='南AEQN4wAӴ=-q dWOǝi?u:^_r~CاN#ʼn9QN4dcc'dOVe=ڛi=OY{dB+EfewޠgJ.>*tz/w$j(.,bsKÏ#6~q1x=ǵcp7Cpogowh Ȋ/( w L >uJǭzl ?~pjژk,_< = g6 2:9~  'kM,E4/ESӼ}8jSWۀ ?j=VgXx(,lV\N6ǯMJW˺h H©q<B$44Z~R͊-\.$As4ZBqہ#~6 }<~ǩ q͊ʻp/MUg/n^jaYW;\m~ʒ~ 4tfuw%M?y^qM'N?y(LfW+:krQu&~{Zh~aVv5Ь_OROލfIENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/striveworks.png000066400000000000000000000541571461403617600233630ustar00rootroot00000000000000PNG  IHDRdbKGD pHYs  tIME 2& sz IDATxw]WyYkϔ3wɲlr+n؀Jp ZH.)GBro*ri\bqllるlIdYmTfFS4~v[?331brgg>}~Ź+S۔wcBT~SO^>k#żkiśG8EGq~h Ex,QY4!@hאT-f@͠1 +@!@}BR>8?l0|l1RK'GIgm|O|)CБRӞlCݏ>i6860jVϤ`g1 r'p9"-1Q 4n\C v} bS{ [+@R Y;3Au t~,0!r ԭhj|O-RJ8Uq~\hLg8'_؃[77%7<E3]!*jqF$<ߺ;q͍X8Cm4Bs1/_ϕNT#!yQKM4ei5XBDj1cѹa@Ӛ^v z&|ף -=dU#4 w)+##ޙSdfyH)+ʯʐR+wR3fh=BT>z^!5|Ej$T[F{EB\*9|{. Wm+w*RkQ+}0I̚/t,pZ8D;e.X<#Z)t]'RP(,kp%irXтx+[LMӠ/zBPep]wA "hq/<>sq򓘉:aP%T]E3 ,^ũ4;p EČGH\F$F86IgtJQ?ߟA86]̈́j^_ (yƷ\Ok{Яxd2Yoy#o&LˤwK?_c6RFG?K/u]"xV۶q]41 b) @d׎=˿6oDWw7WN.ct|kQ*, !q\\E4t]CJQhii& ? |4m CqUwJF-\SIH]C3qiJnB]+6XLV2N(axXG kWCjӍ:^yZ8;@Rtguh,F<C;^vXl >]ŋ۸[ߡ Wbpp )~E븮Ã?z/~>q@'wV__ 3L7%[^w}pӭ7p9v8;vX(K~6_W\|VZzn! ?>EVt.hH#i4L /gEu<]Sq5uZ̛BrW2MQ(¡0UUկѩ}Em{y?\C_d P+yŽoQ4McG9}ArZZZxe߾w+P8R xn/cApLNLnj<7F&'ɣ?o]>{yginj[.tcɒ%H)?[oK&w>')Z[YE(wh(v+NyD6rgS!繇-LvRf㇏swdxMՒ6jV. q-[yī ,Z=_\gJ'|HQyܑ\eV=\wo_\{6^w=qu#QQJa;HWH@%BEKvjxFd2i>Czz9</}s72xx"N"Au2dhmkh,JhL&B^mR[oD`,[WBf&}eWl*~G=fuWT/iGzeȏҲe#z8̖MhbsmSfHMC\9* 0#vesRY8OOGD GE+iii}O۶yo#Gǟ|<hR"4 V,_O?ϛ| J)&32yط> $է^~w?ퟳ|r\jȇ>~%?yItMC4FaWnq\L~MS}5]g @4u\"eWօV {:^I:L )u  Ŀ %vT#/&TSE!xJQYRŪU^dV>HX8F{[[qP!8~8A]~1o{ۛ8'zO<|?RȗA c454F74CQ? /|9SG{~cO?aœO>[/ﺇH$ġQ^0C"e|?Ư%fB+!wxcWDOEYhȝY~ҧLr=6pom$ژbH7$+1G5E&Ho;K>+$^Bgd4tw'Tjqk#{EFC15-+uFGǨ!/L&8q: `ޗƦF ڱ0x:8?}9d%!V\N<}=׭'U[S)~)[n \e}$ :ڌ,i$q ä֭[M&好/d~[ڷ>Ǯ/qD"iC4-]AwOѾ'I,)'q3%4H?%_/75QѱjhѺJ6~|j/.gh|;3:b,ӋE(bUf߁gg?VJ #hߧEQ ɚrt1McS2+wtU&6yyXWl)>U+V,qq]kWfݪ@bi&xUUm\^9R Mj\|ɦ {ŕacm|J.8B)E2Lja/=_CaƢDR5xSYjZu\J1T%& >uXT]5Xd&Nx;SmyOysN]f.9''h{%wZT*RgqD"eYPRu) <jF9pE V"Pt=}(ok0z薉[,s 4.$VըyЮiܴPĈE(Nx #uxS=niLLMtt,Tc5 ?hwyǸs \qUlpcqFGX|%TS ϸ3#?M֮'3ǹ= Jy晧o {1v$m ۃYn=) ]H'wy8ȟ|Ox8s+_ʢbhF-x%3HQQ%sXY̢S([Y$a4 Rd`BJ!"كe!KM]t\}錻B^i.xlR:G6(N8m@U\B3W&}E= B>s:pXnaB!A SضBDYT¶kB?- '<'60 RP2z( .+E8cd36aYy`Ţ{ (!uY9`aYzefmGd!Xt:%xxǹKK7A[[+Ãsr5 CCCtu|l\qX-}vGH %a>B|Wس,V"|^jW,9عdiZvP-@L EVhior9 A8F,Rho-OѦDD݋ab| uqmE4"in1) )+5>pC]rr]%U`1QAkIKI$,r8xHM΢Eɤ=ږ {i15juxL3Y CT>w*kdr75,e:|_;Iw$55a-E׃ ˛޸jGr\X̤eKkihc'xJ^%4IcckhiN`{8ztٸ MMA .A4j!&͡T*JcceKk e<?;y g׮]xmGTWՐfy䑇I Yru099I:f|l7f q]:3(::(_TllDewU^Ѥ&}tIf34mZS(NW MqyFf ԬZ !B#,vk9,_#l0h@8y3G&h ^!#`b'2?V"҉$#;v$Xaׅ|cxMf9 }E%qEgÞy>ɦM</frE t,X2t#O:6EmPQ8a5@@ܳ TU,fssnH]Ba4XB2d߰84 {O"MH}iv2?T"? om< b 5Ɖ^0Іa"e ]( D5i"G][b*4=֖%*d8,(Gb jUDcA]*?S-dEuF_G]ekR2(ي=6v?Z IDAT!4W3A:S$˱zu=p(mmIƶ].z]+AjqMX^}^O_CCrؠ RuQb1X05`O/N"%A{{5rŢ˲)B!bɭl4uXrrI\r"G:ӌim-T*:GqFF7u'-/jhr0JKۃ2y'b'N֊ܵW+СC8知h4F[[;-- 9<ϧdpÍjR 玁i6Pԙџdaw9͜F[Z_j勐Iv`6bai)Ьf," Z-jHͪ< i'dGH^>T AJSBIlUOH 5Tk&:2?-Bw!N{OWW]]] /BBKIGElY"W^';7pHre1wy,,yǣDcK,γsGdURj IMc8Q`p/D1 SI~QlcӅ-khjɔ nm-nSsb46q'f/Oq٥vobM%L.s]b1?z >wn]DO7l-l瞡/;wyO)kjhim1FFG9fzHs#N./aU%Y}MH,]ͧq|L!1",uBBCfR <|woVkjHgs|߿7ٳ-H|%tR`>$Lx"S /Sxu 6D&bCS,D Yhj68ti ֭J'ϑN4 QUUMX@/b4)u,Fi|힯rӍ7Bm֭Fv>DeoD QLNzX Ԙ.S>٬AC K%ȈSR TWk`rX!Mq,K+bb1> ybY:I}}|>e+X̡O4FCj> )8փ˟+bMMMڵz8+#frRF!'8ʺY>JKK 9>aˤ MO-lL ٕhT?QḙꗅF};mY"uM4JA")I$ik-KvM\Y2iLܜAZFZ_WsmqD"$2ˆ8 94'`QGuZHFO[~j?EKN{?[&T`yDXRtᨍW"$#:զiw~z!rD__~5G:A"kWh>{ ꗱ:R!$1`uoCrO06RrIi`:ǎ1DD>I&]{&Er*3:!u_4WgԟǨ36 `UJfw??t61L3UUԥI̷BگN>:'&5 ;iR >|#GP,ٲe ׯgǎt6nH,; 'q=Pzw;6B2S"z\^_$`Uе :YNV9^B31 &3GHcs&4[_G>X*rVi8M~P~U1@͔Rj*:;;+i!pH$B;v/fʕ>|?~+/fgu?^^#wF1bЅprl"m.Gq{BE7<\'gXJ)&'''> NuNyG%?㨩aٲe7j6,;1MgMI玿k O/^]lgT/θU۶?syo2I;S,ݏ+ikk')tz3d9!*~3b(Kx'dY]B5Om \.9204+e{st7RέogLL`kӟ>rǯbH$Kw}=~G~#47#4|$\{U44ӋBG?Issi?UK cԘh1Ɓ0LKar'ߛixykŋSUUtvvVy/XSSCss/ff] Xnt:Xb!V>8g7U.L0MJl#\vw:)ZJRx0O%Opɥ!>O_ Lbק*~BaVYA*fT4\} ØglAJ^.w;-RTap5M`V~O$_wfݺR ZKu]4- ÜcSsO~ooS]|'c(e+< vwwbŊ9g妛n.cbb]v.[c[N/)ev H!OLmS)<8Cs+n:GUО3}N1n5S\&t".DCɥucq,]ǺBۇlxĢ1|>ǢEٳQ6^ף:syyRl|!urU<)9v1湧wb2\gĉ^Z[[ҋ0 ~p߃\6yqr` y _\i>|_Qwւm? s7coP(p`';wH4u]eO`aq^xa'm崵">,MGG;Wn,vッƭ^zQ~Pä0GZ}oλ.p]R)m[[>wU<ɇvR(o'c)賶zKåI<Ρ0xʹÈ[\8 -Lp.|)$S|K붱ν46obdx>{z[o>xxu %o|_eo?wֻ$3o%tnEJ/;H1ZZO~B֭[?46ɏ%ܾqذq)%Cü%~Lv~aWsy,S4\<?r[ıᏽ[naVX`O3\y8oݯP[[71DSPKd nyÍ=M. {OòKŻo^nt#|^t,_~_~9t@4OpR4dz?ɞxo]'p\/a땛|O5ϒHٱs7=='_>'zxG~wݧ?}y[nJο]puƛa 7O$yÛnȻ)sXW׬|~|a?HHIB$I-[Foo/>/.ƈ4,jKӣ.IPA&ry_)&y% ˋB#+y,{l6cU` uSTt2cQ;FA-睿vJlXU+lRȕG-֬YÑlry B_'xN] Bo!!?59ѡIVZ]t1M&?8! -MرEzgM:{gdU9׻zoŶ$;+` 1$U,@ŒbL2TR3d*E*& ,0EdcYjI{o3OEݍl~URIO|wn-fNJV `GhL-W%RL<_X~JE:g%L3#m pOk\ќ|3h D,dϞ=1n!4w^wKl!f1Q*gP\|cf))*(c Xt:mxO.[Q:& 12^b&&I$bsfB/|V)'ynCIvscd&VL"D?_[,KIOfpJ‘ض6no孥cm8%/=u{v_RE" MvAJWʜ,['k]nKkˌq}dG4F0O|.HdyrNxyx0ZcYP+m,!).)YF|ـJ,0s7@+1Ǿs۝7a^}  p<Գsݞݜ8qtoAR|&G?'Kk˿0ƀu)"Xt҈ \;Ǝ[ykn:2 }v"Bt$ Xq/?{ ]xgijjo9q|}<c_hd:V}V`P,9s uuu444TURpnt/8F+xhCmFhqaᄘJ%]ҢK 4fw\.ޠuWkMg:"5J*݉R q릾۶r[\z'cص*P_Noོ+|̔o̡P.Sfy!rq~MۺVZRމe+fJm739B˶H5ׁ8|w1b(|<=kw}'ٿ*|zWwI}]<؇?};$ FFo|_ڣ4m4IDAT |[;zbdwr !Ñ#Gd2xۉkSn~_,;')΍OUBKmʑlwl$09گ8H Mm#VNśWBB066d29mh&&&BA&il&Hs.1¡ 44JIma;6<}p$Lfb9*_& ~c/`RDr/>B&=Eccv8ysgpw\K.&p~?l#&Wx|oqM! >|ye^'4؏Ļ6PxO[׉ץо7{]*7sk|4x^5nKZ3tzl#7 P~.;Vo9/±-ԓ\x}IGV0`{#Oޱclڼ?̿G@~,DY̕R 3eG BEDxsM=M=è@$4@3lmZ0[nmOx ZU[IlaV RGAR zzz*g1pC߆ʹ w~i*=Ǟ1ߥR UgN jϷmIiq͵;x&7SX3+yor9W״]/}-Vnfh?G3-U3'<ъ:x8Add 2G$X+G"⟚"ّq2vJ Ƨ d,KINĒ(!864kMkJpGwO|%R6kM'bKŽE2etK [{heצ^\GCH =_mS(@Y|?8YmUBфtdh4.o[Jm,H6t}U,p<-WzBqz:ȋ禹eFvk1Ve7:'Ú J-*1%acUoeQJƐPmF<0d+If@Irᾮ֪-\kxa>Rin}WrL n |;Fq92RYKCӘYֶ x5& )a捫p(" 1=_ ]~&gIKi\!ƒi+5(;T68Ê i9_m54] u~3Jw矇6T:58FӼz81:3S:rxmJ1193b\r2U[tEEQ0=SI{1fF* w:e ħo&'Ov^ 0[9i|&ðp,ũ4T7flr&$jK4;5K !+*/ˋE3$yɤ|F+ _RNgP G=o802Eo|'$JQjm?e`C`UBJ2H vE!,-Y-ªڒ~p8 fA0HQ7I^B4+ +#"?~4-;KC2YN?2kKFIe5YM[+(Ҷ(d"ΆVE FڒzPG,Ř p ߓWPMHŠ ^畺.z~P7GbpmCKgK`!ȎO26׶ %oE]]hRh]4H!4.JˆsŜJ.sOXD74HnHĈhop~c9^kSDK))Q6FDeR234Jv&K ]eLU[S 2P۸E9]M8-lqjPT5{J)ǹ3DR.!$g~<[ -x=':1JĘ !SHY%<U0ϲg[ϕ AbiSjrxFvvc6ڈ%Fkm͜! VhNtaNLҘJ1UF\4#gObTzRk * 4/-, b޺ oP>%cic p}0}4%*_\s/V`X\\MqI:BacL5ڢfi_`hԮ~|Hkk~S/Mԯ&M>켯KwC{mJX?ʖ, MU*%6HK`C6w>*m.uvZ+6ni3֛@\k]p[T{`n dX׶Ҍ_p;ityǘ)W)^35 īگҺ`{~ahH.&≠@يY`_0Lq^7ԇ=IŖ: Y*51KżGAX}z;~$}'{x0O'niNjzt X )mZ`ꅫΜSf:x={H(UYA,%&itAq ECQ ,#ق#HmQEMHaK} rg! n|_(<X,8җ YRH\e v\|1|gu{YԪ=pP\bhU[$jTJX,]+[61)I貎oe/+0 +4Pt57ӆx<9 d5ohhh`=YPi&PW[*o_Xjap>'˓oj  B=G!.9 p Pc |~A]8@0\$B3Y[Z9{Z6ZL6UmZS[NIENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/striveworks2.png000066400000000000000000001037341461403617600234410ustar00rootroot00000000000000PNG  IHDRdzTXtRaw profile type exifxU 0CF @ sGVQ߇,w L Y@\XZʷLBptqOmdǤ 2m/ڝ?tE`!.FilF\;J,U$% iTXtXML:com.adobe.xmp \csBIT|d IDATxڼwTgYzMQckbXS4F11Q{"Ɔ  JU:,ma;qg:;ywfn9moS۶"+;WOR>7Q(g\9AyXP&?IKyϗmO덕b?b.r q!#^4njzͲS sЖoEt5]tD@z{wUJ,.veq}j2w&'%(BEG{>1s8$I[? Ms5 LM896s;;iZWߍ<&G 9ۊtfT'&Rޮ5of*} Ap{|K-mgruV%}a|HZLoSkSzma8Jz\b3NPlĪ!c.%w?.>:JR2r6|,\7v&?,c!$ y+J=/=ϰ7xHrI`^iiΎxHW] HQg$z.{_4ӝ%NMK<ؙM(qeomoTz/Kڃ)'R!rR5m&#.cݓ$qqVbSJ%(?qcVix~ŪWzkVP-2oaze ဧA43IBјǫYTZsU+yz{{ 'F5lKГ:I^[IARoZ'= f/!W)p'ͥkݵ\Ɂ]47vpǟ.DSr7s@(;塓85rڤvpv>=qK^zZ?bd3~Jҋl!CARģzD\PIfm {@ى؂bJM$oJ>|+vy{W1zb!+ Gy>9Sv ~QAaՉTZA|f|,P$n/z'e.qK짮҆J6I (u80$l"֠mJY$gʸs$(J>J Sr,[xSg##31e45SSga]ă] `ݠ ʥħVIJsu-^>-p} %-pC8k|2> %EfRgNp4⁐LׇS/V7ɐL$oK\yXdVnw䯟Pu@@1mpN9" '+'̻/n⑻eG{ <䤗j|\۲AR?mbz{M6%8̄_U2$&4<3ޔfI:&3.L$ucZ(D<5-CЭzJZEٵeŖ ㏃xlp`(s'pusX^ľFZj4S6G9ZXawFӧG]sK[ZX&C~N4VC[?!>}/.G,~vBy}գ_VRjGb$$qk1_KXK,0\86o Bi|-cj֯ù bNthPʎ͕4TP'Qw`/Ѵ6up@/Pg>ЧڣM([rn^J1lL?2D"1n;r<{ku1յop1J̓n;B46ͦTIX;#T쬊_ҝ//8!q9r C~QOubG{w,Ljq T$Ãh>fc9z wP/s3,#))+l@/wPTG^.5Tndח4vfRFODFV(TF|k*ygoKc# ,⻿35zQűZ8 :y$W潝 ՇΎy!gKfo9>܅g~\>/-s-/r_;~ s?|c Nks38\)*ul\'߿Qes@=r#gQ{'9PqIgImi~sïD~a/bR >945+شfv0Q Q=Q `ixFdsO{هonw; ]*hma O/74%?3.'r3`4Ź4vqn_Yvm=̍<υ;+R2*s45~.}MARNUb?J ӗ{<Շ+ѷiF0 [H4q`w %/}寯ݜTō仑DQ[/ǿ_9h:^:®qݸnC# 6|jZMz9eQ&~O_|$ޱSr 6JA͑f6ǛK> 3pSW:Q X|deg&s7.o4?"{?*GWL/SG{k% %מYc}}37?GKK 5:ENYoVp- Q_—g #v[6urm7G)e9 \z"ya={5jA%I"qY@}68rfkBeYy * V.5}Xhoc˺'/AEŹ8WfЫ$^qily=0ag{ eJ zopmɃ]\9Vr8,}j5[?8Փ(k6 އY'%@@1hxoFfI~a6A4V]nt۷hVOXf Κ"XT{]f!^;_?3Zg}{'N%?ۙdnn>6xaEb13ޜYe'22}(*eal\S:o0b|ˢ}j9,Z<!iEZJナUԃ6{' l:HL^m[3nHk*npFyO >zs3E9\t|Gwk^ q\z$=N{k hy-X*:ԜuUͬYHwefMa6]41~9.GĥV;j6m>pfENXm+_~uC}V&;}̙$׉뉿h45SX#@tt+,[O]]R吙о:W=鵎*i+]yi̻ǒP1*߯v}#uh;ac Ρoʋ9rWW0=Z햣")bg ILYI(*͵x-u;.m߱?,$ ˽"^x|~ôs=Xgg~k9aݷj|&UL;M3^yYH$FFfȼp[|Ss&c-L>a Rh'['acȍ68A&"=[o>]=1o{Uo}3'?^B8Q{Yx${iLYN(q5cDa!dvJܴ)DT|olFbկ́L]Αx,}j'_3*{.?_tX+O'cP/7.)lD"'^[V[nÇ@A}i^OvlYWU ϼ6^ο|,+B '9 0由<8ҰG1b\>~Kn|:u|~EQiܷ4Ua"!5[%k6u \[YNV} ԫ~sg||,ÝqՓe2rN̄L=̜L。RrkwUZ%1u_4" *&;/lV`]4uR+;|1{VnÍT;/nߜG%MJ!n͇ٹo} >(Jq/?r#lxOOA%i9Te's?ײ9e:͇8 )<~|~Tusγz~9 Jcz7o39\S)-+Hh E;f!iwvn&~26`[l]-*LWᲛOq x:=@2Zx4mhtg fQ VHWUoofx۠i}q=qfZvmd#l^[a{ye{qM =VEMɹ3y@ i^t]P^@Y"w]QǩL߽MKSv&ټlutucL^yټbHUfVwO5>]-FYl "z|dmV)s 4z[gwwNHƆtPF’:έ^Ȑe B,c*J2œJȸg,?o{_^ L=qDzRL;`f ښ;ٻMk|FGZɽ\GJHШ.飕 El/,e s ~x2',2\I+^(a f1g_:Ϭ!߹tnh$M3 Ιm_ď?{?˷8r_\]QS9 s ?gG[7-|&8kX F`DɌ˰7윌dOm~Z:^$>ğ|RFNlEtꪛض3揦(a{P?oh:J"#`ҬL5)ssɫim'KK~e.aP^~a?bl\kylxe#䀭PbAzs(?/ÿ՟QWbCrHf~< ʙoONO`'1armSžU xJ@e!B5ps X8VזVgz%d1UILg>sλr.PTz;q|[⸓+LGW#U%'5"?d *'%Hf}B%$5UcYl^kؾ|iT6֒ƌFqW %|OÖ:mEٜz4쪶 UP\DzN} 9i䟎`-C}`_ܟdJ!9}3cB{e'u_4rൣl>ܺG: LSNqCY_tw58y#:!Qu..)wMEJ^3Ghkpk=l@Ϝ`"}zhԤ-2 P`4#q{_@.&+t*³'bͬ|s3a~c|J5a ݗ_VroVǻشf0s*zaٳ{I b ;Qg w^KN~"oi4?:.ǼLRcU]= 0&hAԈňĈku(;@0s&uZpFߊ[r/>W_E9є*#0({:ʒWDZ0~(ūi3kJGMȉKk~|zL$!A, Jkћ[L4Nt,8$@tv@$ie1dD(=[ l@/M+~CJ=y +^HG[NHn^FwϏ 2u{7[ w^@0pDZI FߞūO}kOe69ru/^#fFc}+?iL?Ҿ©P#P|WTiGxWAh;Iæq.F)Y:⓽9e**vՠb:k`3e 0-{Vc=C8iX t>]]>W̡,^?m' dJȤ99)^vusyKCy蕛'.q_xl%]_1PNѻZ'\C}Q: FSTGsc;Wa{_"M8-WÍcyI^}r ^6^9i+(k,=%7$M#:t_],CFaQ ZJvn&]~uLG[7 z+4MReQ.L8a-zTG(eT<`ū[=#(Dϟ_L +;&7?o~w>={u<8_-V߀$/ldҷG #sQ5:$CZp$Jث7t<>MYR P^jfO^(eD^4t֬_9_ IDATS/r׍/^w2j@X].IJF =&򬒌6m zp5shv!%8X?iOQ#nKSWˏ/xU-\n䆓HaxyˇG_xUL=_bVw+[6{h2N26 xӫ43NhHǪ9Dg{pfz1b|?!0V:F,j Zj$hIS}ѫ4ώZ\3U5ǥeh \LFF^q÷4(AIYyaF5_K8!fҺ|ߴn o1_G(b˴Z ۹!AkÚF8J{ky ϝxIH뫛ikl@A#_tKRDci"op:ڻj&(R$:uPbuj]Cue#ݝr24GhnЂ50b#`/3new;G:8MgM7]Ec-`V:~[s'WWz*mAR˵v*ngY R9v|kk҄}*qTTdSEKyC+Y~eXHHY-IIX;+*Ug>Rr7V6针#L e1r(QաѺu$ f  l20 G|V_5;۫Sgs Pl8UY7N$PD- TYƤ|keVYGtdBuQݒ#q>{ɭX YܛE-|.WR\9Zi (b*˂w};jyh+ *B!{g7(9 ϥ`h* SOKkٻ^q+wiͺm{F3U{IXysvgqVo;{VI>HǟxF]\=KwJER&ݪb,##XmOiWHE_@i|{QTCA$;7`($8*DJ~{;T23CY;tqd~\Sأ ^B~L]nNᤳCvwg FWC4{ωZt]Qncܴdfx%קՉ,}z5f e2VSIY-7U}nqiC5/gQ9,f|x1..mm8μud@0 ]KvuXyEY,οf TVSu#״XFSCK"twl*w:Gks'Wac}d_] / &S]/loץ7QUyc ޛLl{Kop/ K<T̘/";S[_B]U3RPh`]1Zݯckcؘwimk"ﬦO"JaQ'V13xDr2m vWK&(!Q|d|In 2O,X-pEJ)~hDоZCF?ʊ: d:o{<\J L{jtE:/0((}lDi (ݣ-v ،2/N JVV6.cm8U6Wh" MWD!Sj@-WFV> ("D#mMvMgGF4t4-h3  A!>xvAA\t\tMXގ$WD#1֮E0 -f悑rcvɵ,}r->}/> wqpw>~u&/C&ᄌ@0RLιt6}{ՙ<5?<V¿3dT@PqXF Ytd:#%|jwiL5_|2vl>įOu7W?EkYXsܞ,aؠu61/?~._9kO{GN^&Z0w_Zϟn,3y0nq˅k#w#wܼ,qvy@@QT=O\ØɃyOxU\z)<~;YKX[⟝ ~R4 EJ)ZmFy4|޵΂u"Ȣ3 :!l-nK.Gw"#3DqY>e'~. :xWKQZz|}hof铟𝟝id8D8AAg%qK'8P}l"e끜FZ8+Pި. Q $RG5"1B[% kv̱ gt5;2D  #3DWg+Yx2[?;gf'hj蠵v2+R> (/1GQi8ÍD#Zк1_"ݼw%K9FOq9zTDlۺk+ߺ$2338oe~3=qѵ'jrC{ݯ`ٿʅN>מY7>ߜ7oXTUE+(]F  =KlS҉ 1fUs9 a@~E 6G('\XTgjR_/f9S,! iimmQ\,qo%=t{[۽x] ty5:!%@V@K;J(tHB,c x~rл@#{{؟_=-~zӼ.e!h `@y1pCsd(~pr!ţz_C!%L7ҲXch_xVu5M'gFf`,ųX22Cb&-c+6%ϧ;\<K\on#?nPq-g/Y|;yg3lL?^|l֭_^2$E#12B Zb0С;vmn8X&kOp0a!W8D$-#TlmF5\bGt:-]tKȉ &͊okN$TQWqI& H}2Y˜(Օhi1Þ1>ǰe,8kG# LVokDtQ`k[K' QFNϻ/nl`_7ȁkK 81[k:|9÷ G;M0mLYv7+-+O\x\ shofڟ{P=u^f+j/ZfdӗmHkar 2WR_ EvTN`߿avn$mim@uaԤ]ygĢ:MNlfM _B6cb++*;mW|б^.`t#aZ] YW$ wwPBHD(>LzHW-bOPZ>):i%u 1. 77Wb݊]ǯM^eK>gȨ>mAō:o{^yU5soɯd2JC4 5_ͤYC" 5qMYaf/M~a6M p >o8k–uh ;'̄C?vmd7{Lgsdd:793+x(ES};#c6ښ'{2OWmbӚtuFP^” atMg14Դy]M 픔3Qeo=Fn~>~C[Mڙ x]4ct1cH4Mh3SPE-6#L7(p'¾Gٺ~?Ź=uYumo!SOIAa6pho-fWtIVNb?%X#lK=bEEڀ؄F* J,gu[)PsPҌߵXX M:"%b D-V$A͞- `%&A_l6` R1>v;שWX}xqNVEʿJKmQwK9+%fFuߜsL8{Y Szѓ+^ %߼Fs g?"$Pԁed$1Wz\1Zyʎ"47%p D#" iϠ]}[bw(f6Vn"4>3+ǃPl0i S5Kj v8]VO),ZSźٲa -twu2ys NFFfssh;FFFژBvmNVVL Z"  C(t2fhZwvBzǐog2xt #t(s!lU4.FZS6ˆpQ&gN׆G9U uڕ/TCwe2~bq1$2Xl'o,ţWXGjךY3C#̠x^Cy [fǁ&M#d ڣL2>ZDb.&Θ1j8mÇR{PοݻQ\\ȸơ*CH)B)Eкu6꠻6;: 6sh-~4v P?wb&f@(ٔ5`_ϝ b p@r,dU N\¹iE)iV6涑 ,  (l2+$d̰e=$?٥Kd";W'WͬA 6⋫v tE(;N7Q*g#(Htʦm> IDAT twA%DI]ևAi(Շqa2AJFcSǡ@p(Hf(4b(EYeh9RA}K Fv^h7hHg'MS[WK呣 _F وHЁ$uMIjU}T]fqD!.$a誀%AiY*Iw(R^UBTV |Ii[ [^\]N}̢x/"xXVckPP\@ַpـ\Ʈ ]r̺$r8iGE&]'"k I!ddYZ'%h*Duxe)K./&Mlg"h P33 io8zjE.P0@fv.M-4֦F:JAn.Mݔ @H l w!EOf9OKVْ#@/-0KyW;G?'vP6ӋA?TOb[P@X/'(#VFc%ֈ2bͨx#G1{ fݽn r܉-F2]VC/[ 7##Z,ΰtEmMFcS?}0m JMFoC>bt]{n4Iζ6TU@g -uFVfE˨"3'X* BDb:mQ} .DXYaL_$R'^+GpF/%"D𩕛|!3zt`S @|f?ò PN `\v MdIs wrJwcAYj02r=NGS@,/ѧvXxT`e[QGH/%d-f# #HzuCj:%_ FnJaQ!3fА,]O4bjpr0 vC#5֓'ɽ8a uY"YAVm;}E9k9yk!T_͇|Yo֥q*jyDZ"|ߟ7&]Ѣ`3ΰl'+[&{*nJB*hZP8dʼnXt~k 1rhJs“(,goŧk9Э4AňFCQ>m[9g'GVYE#Cۛh,F{W= d*$;/lB/Qm&Te;vLvSz$ v>[X-*?JG]W)ʢRPk oOiъP~-'? |ǡ,Pcw7?,3^9Ӑs114lm+q{3g{5d9婙V\{cMnL=*J&_JZGuja?7X`C70zG?lV980zTТBɤ"&2]hF'v,e moXmq`(͛J7DBu2t]Cu>BVV&fMR͙iʤbO{v`4hkm&e1j:1M+MsK :Rɑ[ T_ό6T`~*5[!`N>de吕EH5$KJym6x? cHR#P9|"_4z,Pj#@E%q{+_R, F_&|l"$!h"sk7JOf@F G+&A"Q;nR0,@_KxWx^}aujQeՆ2utTw{!<8[WrOՋB~!b[o$hs85Qr]}U]4I\$RfK#Rl(8&vE&gqlKcDZ2%M$92eI-MJ7Dn,km*఻Z](OM,`m:Sf;h$|ۂ蠼$\tqzH)qSN, FF҅K8~q7IRHFZRIՖr͙c|?$s׮4υܘO3CP@Y+d3~D{"]k$-# *J"ڊ28RS3E,8,!2蓅6ہJPH0dǓ?b`Y-9SAVk\|dPV* D e"RjE*oS[GVXC_ʶ%ce?N NQ5}G/6eA|;W>u7gh#")eW6EzwܥG>?h;cd[ L! ;ۖfHg\/?%<Tb_yv C#CuU45߇h˶qi;yG2{ wn1[ R,VX® e s_Y2=i_r[% )"9 G]GrL9,KS_N2^2}.:Zɹ6TFTWkW{6 Ng^I%TF{!d[ED8* #s,AY7YReF(kwr6_~uys? fffyG59l5(rQ?-|=tr\F;ԉslmlEPbJ7|l6C:qDV:uA c"VW vVE_+{MVA.{ TR^${8y |@~,W8B~p8L] %%oe#k/m1xPL8G6F\(EۥrH7'cS9S$?gQk/o3H"[WwAs9S"7!()m(2)d,?tٿgcܼp7--(N)dJsDa$JVcs7~ m2&?$ 2qt2cߜp"L*ygeƸ2~u$CKi-!PRa + 8AN:142S_dR6CG'XY^e~~L.kWoGc[dL\>Ϟ@:_L`#(+_G(d2\7JaY: '@hleQsTU%N6P$xw r!w aQwigr2J[v·+W( q:_?/]eui2>CF#yꯞbkc׮j48׎(K -5i,ێs}ED~phteiq~^f쳵C_KI\NPgaf;ssvwX[ѣ#ݪs}vSid±mܴ8Cʱq,ת>HZ}o|9T21FD 1:b&.}sM[52ʷǥto~y$J=Ou{iT-爙-v<]{p $)wͫ\stMdjvp7.{g?N UCBw…=:#Zuɷ^U2Nn|GMȋ|3y[خEnN1tMM~1 1ojHc(#a6RYl5:` aE%vvvSi&nָ{nwMY>yl\&C].[5Er8𪛸K:!INIil'eY:̾cUı* {X! mzx"")0hkmr*Dہe>߹Mf0őZMB84qK6NމeӟjH* + ImIN@Zi! ).7HuHhǫTכ(Ga p?P:LVJkr@'m+umJy kH3$^Cb^SR]iHcV,\Xa, S4 V`p5kͽF@ɌOo5ԯOPl0-?o< S-ע#27n+`>JhE,1?ehp|e l$p#\JO 1"zˣp[|.E٤_BooT&M*8%6]l²4LtuS.c(x-N|(0Y J+`hZѶƊ2%WhkGƞ6Vd\ G3Hx}+7Sv[pvx'^f9an3]DV.?9üy͛<ⳛ\4= ~{8&?Wؙc:Od*g?vds\dMbg,Na&;Rc,?H *Dy2>A}Zl ]t1/yt1{}]laeSL8y7H p|s 8WAn|aL1 vy_^Z qN 1J:Z6n땕 K-j&Ã%.r~e3n05>?x[㵋^]dQc ,Ǧ%%ǥhۄ1ZNJgH]R4F~Z f GEQDקBϮq@RFp#&ıwOPJ[kORv*+fW \w~G7of&a2.wyO~Wct?6 }o1 { Էݠx437'w}HmmGxupwo(q#eX?OqWƸ?Zb.n2x7G3k|QDS+eƕ?9eLwtZbu/&ݨN il4{tw*SX񩝯E{ZY7[g?{dkKxwk<R@aTĊuQ ﳕ `@JI.eowٙYZsS=geeE&qm^!Ɔ륯Zuj6pljH,KoZk/G:MqM`Ϙ81;>IHtvN=Kz]u<11cB:cBqIDAT*] ` .,1lly46<=S0X-psxU+=]|7 7ZL|`lIRp{T [Oϻb 7Qg㒟 4?)mؤ .72Cx5?I}Cٮ)#kHzY|nLo&x+%i-6>=|NAZNtl/ӛ*/S>Y~W(? 0Ñ0QcY']+07ӦAEUU } *@l<¶:9Eww}<+E~fgk~<| sazela{gVFA|W(?2g{KضJ7`[$0_s"wck/k ?$`n-(unF:)t^M7C(a1)pBXoM*ͲG O|KtK?w .*Ah=>SYʧ<\y\[??^W!hՂ@??Hv0lgZE` GytK>)2APA+U=IlM/CFW+wgz {sъG|r GQj`lqCӟɵ8ܗxFvvgB>(u`RƏ ᣥB&F=L304Bn*9l]܏K ϧ+'~{_?$‚F87\'},UPPOx2[-a\{aϦxyKѵc~Jz$ltS37UY7X^(hq '{ |6G3DsŕO[zkF`)ɰu.*o*3D ?ٺC\6co>TF^^8cȌ,=![J)Jf Q+s/P(@Xȹܼ*_ӌ U( d2ik*RIu-WPJf)8B\ Cof0^m Y@ Td4%8"XM!R}b?~}СB؂4;DqinRTFGCF~Zӗ6sU _P]ce,ʧd㕗G?H6m$T2f>ߛe3w|&U i;}5R|߻<\1,qmߏ)G9ѣ<{3\ TC?3Oڧoj}o\~jhݹr I;rc5f2h]8B+Ñ VI[[,/23s";CVg{{; ԫ^s= 9T%:],= [{,,3ǡ1vwIYfJuNe8, ;[ɕث{mYjS.AZ4ngs *#XC~(huk0ޏR%Ji@Gӧ*?Ʌ0Ziqe;ۨPə=v9cœ9@NqGC2B# 1wKKcmvg]G7c>nI1ޠxJ2PپgD`9g>:jt$RUl3~N}y+e1pd46 7*:A:u#Ro4R#䀹[ $JpC( \pbFxupgOcjbKWNXk5VV(EJss3 kxV$D 8dRrmRmYēc 0̔41@.&mV&'Er sݱLNoMFD@DyY[~v ['xh.Z Ư  L+F)'e'~?x/x$gW nb  df:.t:a<籱7Ġg9FN' 'I 12(=᝕VaY =Rt#?O6Y[]e$-Lgr-6o5(eQo5ۣ A6vM,jvX^jϤ.u S6F[ p \i[6 /ԀYDr#H 9yivrw/[vŠaZ߬)pz3@TY{ V쉔9.LPRFڽ<'ύ&oauC %MD* [ Rh_mLab5`E[dd2&=Q~:Y11|ր*J`fXePJ_dsy| zscq]=K=g[_awm]ZJPmx,l?uP+c1N%Pwwd^ Wj `N"idkxG3SY`~I7[~+xV%_bJ J)FIlu]Tz+,-S*uJʼnS˥ȷǦ?DW@z[7>sQkI2)Up2Y ,ӗ-vs,mtSfi&~?CeP(eb5Mp1 hZF҈R).[,^]^6n/0<^b2Ge O+,'|,՝fUoo&^EJE^k"\YM:m/s|Kr y$ kܠҗgpx%|/^cG9Jy-w8q{fS.^nF|˯챶M;7<p]$֧7"Jt DUiOqR(4 y@IOl%T jQvv,}fr)R|!ϱ{E= <(HEkQ-GV^„T6 œB#Peea.onr)V2^[clM֗9~vvsOOS(fxG׮Խ tx3Jt'LY"PlfMxPEɸKZNĽ: I3gB}ӂSiiؖ":(o&3X2 jyB|sJ!>JQMQS1VASd!IYh&fL.--E0)TBҜFJLV@BBX1iv`G5g g"qM"0Kp]$n1UJ^K!6WOfI.RU~oͳr9*Nepl# ") jN@ci)MV(;mRF̪HN'(Xmt6ő{zI?HVt6+5u1D"#&{\](+ݱAR>HЪ\u>MەYͤThђ.H_?qK+&_UFpciI, د*Ocܠ|jQg]_ny#DB12 or]aotk6JL~JIESI%YH1J(D,$"aߥ ݨ!׬.P w"TB8B+seJʄr"B%mHHf|]~B`c;VEoe$" T11EW %VWQKKH9S B"|;qg _\)Rdm'9*5uɔ~%nʻ)̛4&ߺjg0JR_œ;n#hu0&"‡ZhA41uUD{R*)0ǐnifϭWIB%f'B76/]Ҝshd^e%j%W%QeARR Erv&=nZF\Qk>ɀ(r6K|_[0At[p>H2Tz[;mmV.ZvPJRZDFYeޡ*q Biy; 3R0{b\=4Pիj:w8"V&ecER`ڧ蒯$H)f6on6`qWk]} l.GO1CStXE+(%xARjZ-V_{>TkyH<[+TXֻ $/;k+X9aΊ:)Nϯ "NHt8̨;.cS!DWa$YZkoD4 c.5K@ *db "--?FWكvEd9*&JpdpɃAH ڽ>hkCݿHi4м]XDQI|ttڄ_ƾ*gDY8>r_:VĻM34la9xKPA  ZSM_$ VOOҷmcY1tNi(~ȴA1>mB,MٔhXEk!%z{Jg/c<$ ̳NVtM6.E$(B _Yni"DZDHFWDA9+cڞ0-[4 T!nGU'E\Bdb>RF>S T<$'B|!lE|p- L$nfte!xRŢy@g`k::5bJmrk('OBC]:U % h7,*10D荡]PZ0Ӗ*:"m0? ̈́wÎi͑#Boɿ&Zf RvFPȊX&e>޳$ZICL[E.![X_[mcKʲTDI,+\),ؖxmhyjb5?ݢղOxXx~OeE퀔ET*:$_锴/"e?Ihޭ uJ⯓HVW*7 '=>+GSDma #b(IˠVt #(ݝ6 $QXr5*dOFċ4{H2~_%\L gcR;!|lcrXvJ%8 W:bmeU; I+K,_W(ODYymO,GaeujhMe#Ʋ=,xR )C7?ېSIENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/svix.svg000066400000000000000000000536361461403617600217660ustar00rootroot00000000000000 image/svg+xml fastapi-0.110.3/docs/en/docs/img/sponsors/talkpython-v2.jpg000066400000000000000000000230621461403617600234660ustar00rootroot00000000000000JFIFHHExifMM*JR(iZHHd8Photoshop 3.08BIM8BIM%ُ B~d" s!1"AQ2aq# BR3$b0rC4S@%c5sPD&T6dt`҄p'E7eUuÅFvGVf ()*89:HIJWXYZghijwxyz ! 1A0"2Q@3#aBqR4P$Cb5S%`Drc6p&ET' ()*789:FGHIJUVWXYZdefghijstuvwxyzC       &$&22CC       &$&22C Sm[=Wijjjjjjjjjjj hoo8^[%÷VE;Ӽϲ>TCC<_ +qm}sqɿ;_l޿v.Vz7/S'FOƜZ-yɻ>tϦzz0&>w}EeB2ۭqj{sR>W[*·mn>{m}U5pzbڶڶڶڶڶڶڶڶڶڶڴپ侕VWȞ%/Uնննննննննն|]Kkm+Q\VGK v\xs}x7PtEkg1"7K ie=Ò+ܮVnnۺ{u1._3go컸JR)Wk{L0T6" y5&is/|/#7ovU$SZ[Zk;=E!I]8,nb Qnc_cK@Yf XrKǖ[g\cctS47¥ϩ3 &@pώ9#byuP18dm|Nc8ԡ(Ub.\r+ C6<2o"_7+wGl81١b7L C.qw_g |e@qz{Fe.\@M=v0r8Y7Jg^ÞRÜ{xg^j?#nHd+noY,b2[@^Ô{c,wBz|}_Guc F;;!O?CHbm^"+~&J#,0#~ h>CQc9BHd/YGCN[6u0RheO$2Ysg 6]w?w$1>b>/ 4G8-$q@y?D/597|j>"$+*#Ms{=.`1ݜ^o10ts݌%ROk$2U5Y,r2 $yrI? cN|UPZ@1 Gs>~G3LV[Tj8{GW_S8l_>KudOI?|Ե)H%/u*ߟ5+w*>Zf>h4:h݋h~ c4zVF?fFU4l`*'٩~.^^Ξk/" i@£GeZD#EBh;{_bhAhj[ouAS)Ɗ|8Ҡp5{C{ O!'uvtMInsqJ FdR^nq۽erT<|?/.c,tX,'U59LݹIBv\X+Kr\,r]tЋTK/D(NsTěkEJCVUEBJPpWF٦|uZ(%*A? KIW2qPrג N&.2|Rsj((NygQ֜#E}2Pn~dȚF*< kd(P}mQb5koC -[q=w~ZGZ"y@{Q %2Ң߆&Q*Jӡ5.mM+Ng U~zҎf wvwG\'/3Wu\[uQǡH{(Rj*Rv,W,dEʔV0h5ꦁZLrkR4R{fsr''_v޾AO+$prfHΒj_%MH@ JU3*Yj+)'HBR#CH1B.` )Y8ܢYZF<&EķDPFy0IY\XQ:j(9>.8l4\S_Qd3Ӑ{{dCˏ%|' (kAܠDgD&i3\s+ |R )j *3 !1AQaq 0@P`p?!l: ?qmK9C{o$1 D99x <'|'-㷟6bG!/~NdrJ}Y6`>ό8>,ȼ쿣qt >ocUQe n5۟]Q@;ER ͌r.8.z 3 Qr^oc*j{gdpRHn0m H}H`webمRMkXH L"_ID)O,͌T l@qi;A~rݝ.i ȩ5 EmJ]KUuȝE `9Da<ùLgπLz!C$>#ݓℨTLy: H|cd,Y93&BmEg1MsUgM1a :?n,8Aw($%o"t$M6UE/$A> HWj)MTOtX^*lGtGeYie19˲JwvA,j?CYwFE +G9@ >@K,x/ 0($FXLAyŅΘv06ZP(96xp'qj9fԠ5BpIO&L^cCweRXbsY.>ǒ`un<E,28 ;2tiӶ [<V|8o-./asv O-\"{n]{8ޒQuyGы_Agk]rla߃$/"蝎B12 CS䕇-8 ǜBpyvug2tHha9NC@E;sQ<9WÂ=EMC!NgL;CC QŧÇԐ3y w7x1DƒQe/$3$48S|%h*r/E: ;2^ $=ycAZ`Yӎ῜ wj_a@x8cSxpBבKC?ܬ|PXS9z 8d"8Ez>d< *eD4BA#Hn};dDZ| 3M 3(o E`0& DSsQX b!T\gi'&s8_\4j\C$@"W`&a,G.0Ïe\ѐt2Hu e42 WEB@Ț$R@M$/;EP@O)A'UI[\?GC+ ^'9)- )`)?"sM8L191۩Q$BtЅ@ FyG]8(.,WCo?ẇGPQWeFop uE]f3_E)a+_yƋ`3D:#[_tz#,JZtTpb`2ǒ* 6xH$S,l^Xނ+AR=[ ",3^k@ ?,Xtp\>?z3fLŲt0$HyJ]'ɬP"@/iSfastapi-0.110.3/docs/en/docs/img/sponsors/talkpython.png000066400000000000000000000347271461403617600231570ustar00rootroot00000000000000PNG  IHDRd7*sRGBeXIfMM*V^(1fi|HHPixelmator Pro 2.0.3d2021:01:19 06:19:00 pHYs  iTXtXML:com.adobe.xmp 100 240 Pixelmator Pro 2.0.3 2021-01-19T06:19:00Z 2021-01-19T06:47:28Z 720000/10000 2 720000/10000 1 44IDATx]@_i4 *{޻FӰ1-+X+6`,T:۝eo884jn=3oޔ7oU(*g> xiiiik㣭C44#5755_/GMs4#P#P @g=nnƍFW>y VT"f̘1!''oV~[9iU|,^igG@U@pڢ{w27TWfٳ'?}ASpqq/4 fG@%@~iӞT̚5 k;}TI)ҭ[[gg _hzUjx4#P h*;ݻV嗣+VԣE]ԩиqy@/X"%% ֖1?nh,]AOOK@wa# Mml8Z +!Q<`>)6:uj%olcӲ֭= DWdaA֛79_}5$Θ1ťnڂtʔ-Z4!|6?.EHȭ"V\|^=珼b:..޽GXz~ Sn7nx`&d?~ +--{m60|rZyWl#ƈ.^ 攎B@cs&nn.pQD{z6sŋZͪ>|!;Ѱ+TSxp𵠠K$s6T JuڥKۑ#($H &tVڂXH{zz4jvvСP-ݺoCY/懳g/_|ѣ뀭c!8S߽ Z:۷&Ƶk၁g 4$س0w1k޼q6%+,q@#io߼DIOHMO[пQ osWǎy>}wdǵ߈R ZŐn݆BJK&D@ÞRX\ˣ0˟O`vΟ`) ;u ?=nx-!nBc;mڏ[!S E7}Xܢ9LyHO'N߿ʻ(EJ*}*퍧WݍJ.(bce% ,9qicXPWG[$ή |&Ip7 Mַ8,;;$"m߹s)CWov>:u~YfiDL:\ 6F {!xjD{Tƍ3 $˗۵:(l4 HNN%#_1o&P>3 L1$0o h?hltOy>(aGK? ̀8aI>p5 v8S-s -f ܹܿ!.fBBؕ+m! /_2T޵0NСwҥP*Erc^Νۼ{!8f nnuočI"7n*ݧMv*;Ir9s"vff~"(}rl!<|ˇ/a۶@=뻨18 s@ l>4t";'TI9>29-QɜFfin*l6 =t*:/CIiBB KS ؈?0}u"0+WBhX?V8:wM !7,q?%&&OIaAs*0%(;Y.;;N&Gժ6$|K ͔a4% >?ɦw9}8zӦ]o]E%{@&G0̝+YP{wA]002ӝFZ]LT~aQW2 h1}<&tsD VdK )3pEb4& {]NŊ`CX1GnUd:t$v+gw0a&i쥙3B;1bz: ڎUZKsmGh!KD @-X:+R^fMl,uP 0ɃV\,@~k3a)˱WS+dhl5o`HpzI ᾨhө^^v*[,\h{ D""](`+nOHTSb)% 0|e Vأ4 {[7vZIHP$7 0]Fu 9!EWot ;W| ?ֈZ\CX n6m!*tv ֦zNlR4sE2G"?7V:'ժ̬nvԬɓ}^Q9H@@``)G35e(B\HhLpSR1Mo/F;`mh@<԰Ј9K)ZpwE=ju+Iʑ* >7XL)_s,è|߳`(?4ixM(ǰh V@^SSPPS|"?YYQ)ܟXe :]j@K4{Ldoe>UtG E^c{sӦ ֤}2Yy/_>.n a:%YQՉ֭w  sapId#\`芅EʜТr'FQbj0]*Kf/uP Øun' c~ iO_[jJV!}֭;p2@BqlQ1=?}wtjy 6RRtDTSq%*'%};H$ӴjJOSwؼ fXYr嘋NCIO-UQ)0xv$n0yd tADs"J)lhYԳgmS]ٌ#ؽncZzR6LW *Xa,̛J”cAnVX8j%#Rxy 3ұDsTń5( Xc"$EM7qc+f q\aNR5 2J&`vCD Hc,͡[V wVMvW,UDM #jfV4^n;D@kԨF X~C cX .^ &ڵ+$m$HA%@0v4Ο 3tږzO*,tZPno [zϭC&!]۷5q,X\3E974RNN9: =VM&h#(+(\"$f39QL>8N8"syƬ5- #a+-偭[N"tر jW` {& 3f#đLDü>IѬ]LK-i| }df* &h.ө0 '1oExА-&NM R ذX.I YdJII$$0XQs @^~arF^U8>ChC=7s~,x#[Zh\-d`3*8FŲd8FQfg=ָW2_G3;QR%C d^xgzmn˾@1 i\8ˤg- DE fzkVӱAiKN f<`BLz׹hnyq%Ul gymgQ1:)($ltZ q/L&,(Y7%$ ,RFFې5d/iSn*VS4_MRfcn5 3ÀVIR(825y`נ){s]ر è@-ί dd1Uqw2ܽIխ Gvt*x}y繘Wo:4Q.2K5bv|dp2ׂ'bF)Rrl2AwOJHKpACsz }= cv^vֆߎU*Mݩ&>eNStH2/CAK+1ݧް\!e("u%{ ؗ8G3𧫃8 a)bATbEhfH9y2tTEtz7e9sN>%!Hu|Njm_#,mɧ\'+Bk4WG25#i'WmaFk^do SL8%z5+Åx,{;,46ӧV1miEy@v [u!BJ̘-F I߈u|ƓO$˸tm9ra%fRr[uxVŃ.J&p"cPYѷc0zG3zR4{SL <ǤSo =X>"N-B^}_=U8}+aHfXb`j۩4|7pBf#M6u`ې2 {{UEyKy$M`;!/@39\cڈb*&+^v`.z)o$r䢎Rs#[_tσ4({:Bk3}8ܝ̍ Ƥ/wW.U.v}0 lг]M[̜=c@sqW"_iO6kҳ.?Myk=Soz: Td$f+_-s6X[($ ˝`Դ%uvX8zVLyF۷LO?[7ߌp~WLnܠz״4e>&ibڴ03`d\dDsU$- V}I@oc=/0pШB]15ERs]cTf2~Ѭep?75(y)Arߖۻܡx S\ˀi):)!:ØwfN凖~20˗x<4z9ɻE3}ZTlD"頱")M=E3cm4W5Z*E3njO%Tb"<խxκz[r`S=*h }Ĕ+0\tGBΞSc`s *fyԔSP?KCS0{_,1ߢI,WTZi}GEAmd~Ȥv1slηEwA-4`ʁQEhFz ,Yr4xYh/q` Xj _LbJyF|z0km.hiCO>)M͏Ɓēѝ2hi[8nIʭZT9%m%p +RؾPsPt\>@cd2;yGGC++rVRiq%JйqwΆ'MD" sWh/Q~d})%%r fh&@ҹTw!IJ.ky-y+f|9%~ .a:ɝzMV7IR?MGhObj.>avk$kO9s1AU(Eu3I1vzlT '޹|j3IUA>JA&E];yT 8V9+?rbhgYɴ.@\'Zh; }xxʤ.,"WpBl1ppv]Kb~&"Ivuunq(.O8v- hQKO!7Q09ٶ=6 \reM @NQ;M8+%I.b.ބ*s>!aH܌ð^v@5$Os~BcYKHe"G/L:\3b<*)B3t6qvƪ30W,3 _4w12:8?g&"L*"?.rbge_E*?nnnMas.据Px4Q(Ua2@C)6hPȑ3x_rP!CzRnY;&,Sq*Z16jG ? ='8~@aWrYU954&&E[=SQ8$}Bs}ͱGpݠw{/>լ*}ݷ.bDsSkﴼp!TJ]Ue*fN~Dxq}amF"cZU- V;tsHHЌСfl[‘'j\l?Dxm&y;MtN=(hT ۻ`I -kքM:짬Gjjz@xv 5nYVIrbla^Q}4zBw\e64 KzQf |z?8yP8K,aGz>т1xO |{$g3{b64_|1733FH̙&nxj-Zڏ?~ѧOg^ܟr5E{bH !ʔ> >.hiy|atx|lc hڼ::xQ?x~f)n۠JgIٹrxÈC )-Z.ܤ0}F))6>t۷oѷoʫAo;vo?~;ȍuAVX Kw8T1ķ6D jkV hlshhġN%Uh;~:{Æ='O^LII;gϞ16T< PhC=p K& ޽}ȹqlï fL5hVv4y@ NN2~(#1GO@"۵kwZk5\(aJ4`v}!<OOw//ڵD ǜ2&&8%-{w=z6j5#hH4ccΟ9|8NcmmigWd҅ dž_n۴䤤W4BR?.Gv:uj(̫ fd#*I X/^:udbz8`gځiD\!'lxF.oƧ $Ft]b̙+pSY,ګUk !.JͻI@UL fp"<֭[XӶfl] QHMzjB^cT _><3@3Ro[O <k)SFib${d̀R=z:ujWv-Z훑#Chx;k׮!CEgЩ..5yo/({ۣi@?Inخڻ~:n~gg'TįE@cc{B#=};? PBaĵYpʵ D|.v0r: t[3N=;o2'ffu=<:{ΜEH'h v?y)Ng̘on߾0/ݷo7xqd#>rͭWc9SI.p ;յU}аzt2ԓػsznnݨQ_DBm;Y v4ŒΞҭiSMv{N֎ͬt> իɓgUƦ""do,!%^;̏ZC*J>|g"ea1d`EJasWǎa&&66VpÖ>;V*j˖=-Zj<_a9M$+hhn:vD=DSAwZaÒcS hqd{ *0.EX]|PmjnoA,YLƺukܹ+m `5jT ~_^mX 8ŤafVjh߾Xj_xNZ}khieb_lL=rm#"o%&F]@{ؑ:o܈ h--Ç^; BDGǂ5'?YRR)2gW8%MD|;Q_?VIo/D \[Hi߾,[6t4q - en@;p pD~ aoߪ2s,ƪc˖qq7cc7oN;KktxrTWܼy.  B4gMNy^=g@WYko4ReŊOZU.'w͛}3ipb6z.\!uؓO2w7۵ktv^[K\~cǂ081?I1 O8OR"2QDZ׮̪B+f=^xd0E@#Κ5w5jGm1huKpxUFE>'\;"|&F[u\Hy$cD&|c5(YѲ,1M,Hj =: q (O_[%\ɳOBa BN+WXN/=,X,0ӕ  bWcSI@3VX?r.y6Mff<^kQio ALccGøܺu7*MDϞ޹%ac~D:@ZP@@:ľ Gkgg @–(џXnV"A` 90H# ӺjKh=Gaѹf6|0]:>?HFӳ!CK{>j@c,Nۀ20jɅ /%f\cǶ>4uv@Psg9=q>,B㾚>} 3ƽ{f}}}-AUNUl"QiVE 4JSZ@pSg֬يu n*,-{ KL-[ uڕ1 JNJo<3c ÙvvAH26%~k,am\/zenNAo hج ncگu\Ɲ $2| 5{ Jx!E~7GwƍFM6?X)Pn?$vܦMX*8&NCc1gӤ1VVS*)3 YL VI &ݚ(D9w^CNd d eHpDJOkĂȑMNlv(Uƚ7٫6ix6,,rɒؿ?Z\΀|C3Gcp96dH)CBºbӧϠ:6(h7D8@-=cKHŎxRW-Pٝ:uvqEЋƍ\0n~EP@*<YcÇۄ w20u 6u9.BcO rxT~nMڅ.h]lTlJ +\t-55C}#Pnn3fLQu ÇO1@b! }O1v`ϋh\E56[En::툶U N itFT*)3@kʒ#CT)4~daWw_|6^k/B@-_)( cAp(i:,E`Pq;NӼh?>^߁IENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/testdriven.svg000066400000000000000000000634711461403617600231620ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/vimso.png000066400000000000000000000355361461403617600221160ustar00rootroot00000000000000PNG  IHDRdsRGB pHYs+ IDATxy|T;[IBX" ,b*T+KkQ[ZUҪjmҊW\i][A * dY=ǙLBQ˷y3w99>;q"(b (":Q^Q^Q^Q^Q^wS&Od9̟3cG?w0w2ccϾ8qd/`ۋq)dzlݶsy,x{E \!ck7}.ָojsEBfhe ziLȟ~{'s^eW^G*9(1cc4D"{d"^XP0K;,(# e䌵'0c=6^{? myʉ̟4p;/ZΛ~ťrG J8\ *q<f?6sĊ%9cSs֬vS族 M# >HMVMk>ihP ( p+|ϟw[o6cG{[qo ˚q?T"F ¬> `Qs뱇mohh4\S/0O5D"{yr=W\(6\|ۂE(&v3gqiѯoo})'8f3;TC ts3y ^!8}ڥz~"{n̬瘣&1ǘ<Mg"x1AAVY[r0W\J$?;Y_,uE nScK/57N>hD<>rG9p8Ǻ'\9|(]ugg|g?B޽2y"Oy6_3 w6Wp[Nxq83bP"Fξ`Z]z%㡙&3eDF Jy8LƺW   1"MgQ/+WǎfJX駜Űa{r댰rs Ʌ9#=~:!\|^fgОt xq1<_>}M_~naQ\eS+Hkd[ou:\S/Zm/fSMn]<;︙p4'9`#q,>)T d}/xk71i{[qCCByeW_[QpQ<fryg4./E$T U_6)E4R''l(*E.E.E.E.,t;_7!3ϙ|s*x}sϝ7~{e3t쁲eбpX+Vy#׷7s^ճ;c:,}o9j6~n*4h_lW nyBZw'ٖ|Hi/Rx݋VpwO|_ -(8ǑH&|TlyOE#f~󫟢[~A>8zDr5V5ec={2qᭅﲡv`!dou ߺ 558.]Tr?ضͥӮOkQjw$ !ZӻzvC5{Z֚"(Wf!; }y, !XU]Xl?XVsu\h=FWFUF Yk(Aktzƛ9ҟXH)d#o_-bvΌ~pOٸiʴ <̀}gnt֕-xQ wZkl7׊]h9ܳOۗeIN:"VYۊ؝ؙs4Ek!l!uA۸~glZk֮kU~?ǎ ZӭkF'1gp])yxE(WH& 2LkY[L- b`FV(H)EJkRJPRt\~?'Ӌp"$&\5 U Q6gH*}TȚSf̚b uTeu](RmLb_0`QWO8&jCGF qs@ !q{#LfR !={BnZ#\ɼJ%%Rȴ,V $,8H)qM棏7pWm+ٕRonz<eyennBHr],"8YjK3lΪ51|(C̜qco. -㠁?<8W@ rJ)XMK ֪P1${S3Zvhzy.Z$b~r,Jf}RZTF)$Je}(WPU#̓";9oORy,WG78\LcZi.:y=ˬazcgXkoII(k0b`jj6'mBƍ=GBj?^˲+|;Cu} 4'iM-s_}Ukyq#d~Cx|䉌9lE*h'O),ڍ<ԳZ@X~?u0\pY<+7D?YrQYwϺ?Y̱cb߁`6O9N:x&M8~o0û.aޭ+ߝv zyy9xhdC YlEZb|e;pT L:R7ɆZ}6'{K"JV uE;KZdDH)WZsD*a @xKB aFCqHR8xN 49.DTvUbŇ1JUDi)' xW Leak-)W(|Y( 55Hi116ۋc}<+x_1e$|] 8\tOg.<_y 2moqb>~~ضm\ p|w%>|6p=;ߏz^3ytrq]~iލXLe- U;N9xSi]_1[n5k{I,gv"gz"J+x(G9q8ItQqhllBiFIi e1e;HƏm7e[≴fh-) \j-J~C~Zr4h@1iHR8}6@S2d2I[AnPQ1Gk\ip^>n8e\yE|SdيUuIb[6k֮7I&. /߾~E}1={t]Enj1bPNu]ϝeI ȀRww/]!krM?dWq^+X cWoZc&C{2R)/_M-TI Gk:d6o≮W(Ւ127\؟G*f}0nh=5R$|&wƂo0yYnnZ#۶Xf IdܘxoJuojRJH[T*˯eY>= &R8K"M}="jj7r9g0񔔄p6„?n:iB;#Ķm{H&ќA{r m{T7?hCza~?R~?xܬ^ `ViOB AJc>̈́'>6ӯp Ɇ4ٸi3Zk~?mSS' p֬]O޽s/g^$ ¿_7Y$c(0h/馵B` v+ezZvEyyK! !كMÆRYYm}>Ŷ-TÏ>aǎ]r5W1,XwkrofanNڭlSJ1jHKK%W]~1*}SZicg3)Yr t$N6nڜG 6`xٸD"KE9rʨ)Ͻgc[/.;?]Ji?2Ec1ZO9C)aCq\E4g[dB 㦦1%,K@!M3b:p{ 6LJBA\u~!RY:y8m9JQd-DIfH[ v+B"`=C Ͻ%dMeePȋ]gߧ5IRV@(d4R>&\O*tD d2;kTTx5kSy @nw?dxXp Ukdq|>ۋm&cw 0[:հu9fek "m[6J%KD6yx( }f"L2j0{oלWyw2Əa|BתJw]ʍI(ibq9m?>آĶ$Um`% l**ʽ peE9RӉ~LO$B 4#`{Zu.L$6>ӗu0\Nn5H)-eY^PQͱ]x:a\aOA-`TڝyVHФR)ٶm٧_\IMlg^񧟡4b惿FqWFFvg(<öm֭Ȼk|$t2ʢk.4Db`p?YUNm=0´>:Yb$s$Ju>Ry662x߁d& 9e,Af25Ru8# %!"(%)HO 葃!bӺc ߲KabIc,ʊ0Z)%sus9-#YPi@릵FH.i/UP4[$K)L+|[[nuY:>0OУ[7.9o*)N%%?Xe[L8l׀QݳG:kq!9}6!,Z3j0Uu9p(^|Zky퍅hٱs[K?ѣF?uH9c\Ά~ǜۢIg[lI2N&iڲx4_J2-WJcI$J!1|TdҤć@ ̀H+l{q>,!$Id5,\ ל^0s3tnF~9pT\Ƿ/9ݺ7G es.Q**)Kw< se0יvTWCrġcB̋s7H$gME8MMkDkJ_ Y !H>d.:,jgq|L\x78+Bf=͒h>Bw>~/|9pB[;wNpK- l޲ͳ>% 5as7&U?B ͉|+Кt9WqqQ鮥Lƥ<; Cei)uN9a wDim6mcckc5?Zp&I 8 ˲x?mI݌;b| L=DKuqÎ;VF(ů~q/;ѩ0#<ǰx f#d>}PŖ]( Ю /'"K.vABeV>۲rX*դR)l+~ ^E^BAZ.7nh4uu`]_{&FnUDlP{ǟz_a-[qƹܩ1bPJRGxmK_ 5߽" .M(oO~Ӏ+׬|f>6GQe3`M&['Pxo$|ZÒe+&NbJ~iA^R:l94ztYls;Jid]L`bV\C4Dz,-_E,2J,^>@EeGclvgCFMuHKn DVH$Zװ6XǼdXW)׮GHko,`9`pJml;f@CV"kd( |xd4>:$hj2لB!=kH[vPy+MeDt&HpI2E~K**3j$Z)2+>Lu,[-IВH9^u[B׻r+8-o0+554cq\W\;?Kխ=&-n(y+mAf1bulcק7 6mƲ,\/׿6_屻-k-PMIDAT"%{2i6m;'mN#@hoZAMв 4=JvZy#3n~ Fos6*#/Ʃՠ[\ >NAzk=Σ70v 6 {s>濉3{^&Ycwj>\?Szge1HfFRjM۽dSq[Yyțc֬ TnFQ3-MIp\ωeA#Lw{3pϲ^Ҕ(#ch̼FF7&Tν13i)dh>!`!>tҁ~Ck"VӥmR$ HR? ̼f_?[jgФ\^qc|Y;eZ{Y;X8l_JM%>w! rIC]KMϗ\SnFVatqEtJ9t/@+EŵGc[@eI?Iͮeʥܱ6JqIȟD; Y˯O u[i\f>]8КKk%v#ñz4MCrqM[R~͑wGE42?< g P[qe{AVP~a3hUPCtX}*ܭ4\Df&v\BG*R|vr$BlIs +% (PqDh|MR+7~s5CPrځX=iZ5j[#, |wdYos5F"fD̫<%iˤVnMb }(nbvkw8YU!'; ~pdeh;;ozi>XϢq`I2PdCo%:墶GQ[ Am' Ji7QPqQGwK߰ȲN<򦍵U!}R~["|Qv8k Ry2$4@`IT$de zA9`?aR붂-tc Rާ9.( JzDUF@( MMxX ??ߛ}+XA$ҴVRvF+9aߝ= Qm/O1h!*CG8b*|)Ёv&E_=+YW̺Vx|#{=:>؃]3|%WIږTzC9p튬Vȇ,#ʐ{jyqRq*Qj0o갇tӰw:dEK T0(~&Y3n'w_9Q@k}\EgVh}}ʿ; W9=I,7a[|/6(9n H( >ˏ tpdU)H؄oXOB_vɷ79(J>Kܝ~$'JE85@iA  <DЇ8"ʂT4n]8{SBe9Z 6F v"%%|l DЦ!JdEՔ)jJ'QۛA;YcY[Rz8cŶFqlT}t$dwAX!ٸAv 8d ~#݈ў)PeGRhW?9ݧ!(`;m^T@&n/߈ju 2D_Yգo"O.%(MkCQ$^*`@ЁTL?e=:)P5 wS=VJ>>Ja-/*ó vũ 8nG)9iuy&^Xf,me hw$IC(9g r)ٳ\MI)B ?~m wSC;{Z@i&sC67?4L%V0:"0~:ᠣI"i4kEؿVL$mbƂm殁 a6/J W5po;OM@SK $bFOw^[؃clIC? o}%gY76A?J#po#άˁ}At __f3xaߐ3YĞ_$%b&lm2ԦK9c(p<ohdy%RRl1C}ƿz>" BcIt4*І)P#= ^ڛ^AOv\VToo=U#سIݒ(t4L'f`'O|T3>S۳z脃n#p@O.Ք\E|jR,P},4 ᷰz-ѺM&c-9wUu^XZC՞\sG:j#k2 K<7GG\G&Q(+K7Vd\W4ɱL9`7\ytAmtҡ̃(9˴ۈR,=@) xg+wYZUoD/Tx !AjFϭ rSuZ4VJ/.;`Jypκ""Gv 5f&t: 4?ڹPѮ&8e8W!N<&MO.5dr Ke, 8?]<Kޤn90ᳲ >۟xYUbS Ԏqy5W2gzaZWT=#Q5Tz㈔izL?ȡ5Sr$dq"wď$w^^-y7id]?}l]x P8g[DvەNgzuDg8UGm':vx|I>)Ha\ ;h|obWrٞOzy!jz&5jKut k $X)P[MvU CHaMI%0n@s]֔?r6zuN)_IЪ&tH$՛ӖKRrWM s\Aߨjt٣ z Z+N:&=:ծ(hm56TDBZdnv =*m\Ow2SQbo{J=ݫLJn|H:)L?uYЎ,tVAv$LbzCMGu-teYЦQ[I݂]a&L"E' x[x{n} Y1FwDMgYYB}NI!H[ަnL0|Ss\ZJ#@C{NíمN\=¨mM^Zu|y˺8?30L9B) i ӎٕNfZ-?%0~1PuߙL2[[)y눿6m 9=m7V.rq7GH} ݘ2@3Zgp  *D|H(N0J^X+IUp*?seЇ=gTO2*Ctso{CKu842&BOpp>܆n2sEN).%!($&Dy뚤)ÃJAiH} =*hFG5\Y]]pq>܎N89[/lf|8{O;?WY%QY#\lX9^?rW. qs("߀!E5 mEgӧds-+Өн.WޫD> < (1 |hwt Қ7V:>*amm/Vmm@N-;GvRn*ձ[U?e9B!?c [cwmmoGk> ?^[緅ݬkC"؋Q"؋Q"؋Q"؋Q"؋BdK\EeIMEQėLB6 X .-xO QD-(&(b/FQ(b/FQ(b/F1UD{1I"؋Qt(b/FQ(b/FN{(* n EQނ ]D{1\D{1\D{1\D{1\D{1#'ePDEt`=FgeiTXtXML:com.adobe.xmp 2021-01-18 3509a322-0fc0-4d45-b2c9-a9215d0633cc 525265914179580 2 Kenneth Cassel Canva QIENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/wetransfer.svg000066400000000000000000000154401461403617600231440ustar00rootroot00000000000000 image/svg+xml We deal in big ideas. You in? fastapi-0.110.3/docs/en/docs/img/tutorial/000077500000000000000000000000001461403617600202145ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/additional-responses/000077500000000000000000000000001461403617600243435ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/additional-responses/image01.png000066400000000000000000002153501461403617600263020ustar00rootroot00000000000000PNG  IHDR!sBIT|dtEXtSoftwareShutterc IDATxy|Se_ҴiӍ(БPEYPDPGquTu{+:"08(2" eJH[ڴMQ(-tZx3M<}{ 2j(oQQ""""""" dܹ 'oxxntENՔ4hWŊ+ &Psl$%%cZqݪ)i|||0 4 СC5fD>hӦ%B~ժ9EE,""""""5#K (\L]/`20?zq\. )**RE " Z' %T1"""""Ԣ tXX¯H=gX WE4a2T{" d"00P!"""" ]E-" V""""\Tk" P@>""""\-&jMQ (G%uJDDDD.mNzίHd4U """"R?\s }9>x}r8~nqƘ||iL|%_f-Ç P_4h fGߌ""""rQ99n@{Dh[N^Lop,8,BAA>׃-'Z`0mv;'Kll;}iX|<2kǕ_fs8~<n#""GƍϹ x<#VN'ڟgM!4nܘ4BCCiݺUx Y {fsՌly3+nݪ$Veᅬ'r %ﺓ|w5 z,&L>>>__A 4AKjս_DDDD'{= %z1DE5 $$!Q:oeSkٰ~Mz"97`ǎ\]w:wGxx8>>>l3ffe,_=+ll6mν}F>nFh4f3~~~%JZɳ ˲e3orn޼M׮]X;v͖WbOnHH؆8k=0ч7o}IIN. Ti#?{V|7gs8x6m7 %ow{oi_yW %"""R 9-G]{vr*}Oc7ިtaaX,x<F#n'#rֹwo"oNn7ݻwOGѦM뒠=%ˬ^ ƳbŏznA-s]np{sJxxYÇ_ym۶u/\ցC8f:6nnA՗3?sxlܹ=cɒ޽ |ҥ3ok|2qRVO͛7'88oUeg̟|j`*???,JpmЁ*;&L({r`gǎmA/:Ϟ_vШQ-/4 xPm{˼̈́aٲq\:f'Co`0SϘvm>w((, ++*_|ɷ.o9ʕYr5v+_lٲkױjzp4>>>]+AF!`׋b!2qy^|MdffPXXX7"2,j=Çϛ8ApPw1Ŗu?'[ ͆?c6qCxg{U'"q~%eUڅKDDDD!3z^IUZ 2q[dddt>DDDVL&zbÊo以5Gί:_縗H}Ӧd2Ѫu[4mFvvV0i( lm>Kӧ7Fc bؽPPXȆ5\||EDDD8sl-[t'66 <<-_{ TUGDDDDDB9]E:]EDDDD6-1VgѨZiKpuf6|Uc" `xD.bp 1LaQ@?(?F#AQ/ՖEb뫮""""\Ώ@5 SM\DBCa袖\Zh4b2?@_\ Af qݸ\.<*GDDDD.qjER0""""rqJOO+ZZ%AXDDDDDDEDDDDDD.PTTxz5ؑԌ`h4b1k2g>Y11ch4Ԓvvq{=U|F--n)*iSTT[wkA???|}}b0ݞGX'@aa!y\"vk ?K`qzk׆h0p:q<ө>n7GDD]nj}LN: ͵5SDDDD&En _*"((BG̠AѥkgڵyfKdժլ^\Zr:XVaPp4`u8rT""""rAy^rr g:n7!OOp̈qpBBBΘyf4oތ>}`٘9c3gRYY٘f"7&'; ɷFH\nl6U6ny,e陸'2G ac@t, k%7GݞEDDDYhY׋VFGI]hcc,\@!,*`4'3餉|:iɛᦛAAA5O'MdYr>4ƽBUPXU+kAAoRr2/wNkqc%!xڟ(**:gde˙?w>IM5wR(dQ'gkގl:`I;ie ~uN!37sNjUtnt mƝ]o&nP?L?]QqIb!k)78FDD71Fq=8gF-}888#HLWΘ6|pf̨ڠX'O$b?o/y3?_{l׋h}Q#Kϧ9'-߼ vv:rl9%8((we;_dƿ.;v쨻}sV=sϰ~x%dh#V+5}d?V.Ɍś5ɠb0hQq\·?r@u/ p~*Fm9- 9ap!(.SH䜫È#}vXv^\lZ0QyT""v =HMM%55nQ1 % </Z\:*B|1L ƺ_|1_py==˖;Jpp0˖-gٲ3kl{?|09rt eaL+xr`g$m{oҔ0Wyxpgb!=euf7x%wWNf:?MODiK|}VZRH<&cbBؑkz7޻v>N{b>BiCʊuvg,#"ܘԒk+P(a;}ml7Eҏ["t9*^HTK)q}~ES}dڕ8{jzL]قp_gbŜpv3\{9;ʦEv lSedcT2>]Fe }xiJ2-&&Q=ٞ6v̙fp{H}a;?r_b4'ύ/[GdMs)l*(kU Q=?gV{rU~t'bǚ(:Ķ #=~`of},OjBzM/4:R龇sCoڷ <\dZwbV<}F+ HhN xK\\}6 aCUZ1kL&'xt\|~.;W8"Ypq/H>DD)7~qemv8FV05?n`Ng`v2wkMj\8bLW%+?H^8N7?oLFHL_fڧNf&k=<$pG^~Ll?K@mSpR̘1f,=^2U$Ouߝ06Ń>ŴiÂoULRR2yNS>Vy!WO{nϥ]<8ڶm˪Ug{Ax߾ݫfkq#6fW1x<|x#aWS-b'`@߇J3Ytu!$Hg^ȳ#I;?b}IAu7[͂IK^&L~0Z't^bqKu@K zSH$:~"GApi I?|˚_@V[<_1tno!e*ˁ&FX+ri?,{XSRfNտ=MTp 4+iy`Ab IDATvb5{+k,c!q2+DR8pᶧ^$NHLD^Xkr"p祓~2b,7X2(K`G.WTJꦶرJuH@Rl݆ ّXl2-1EcףTx֥zTu}p3B9|6wՁ}F+ Hr<#wy_|hf -*3;>d0C &55wyT3d24N5kV6yd [V{n.&R:СC~vuͼy??_|ɻ_f9̳<_|?>իҬY/{ka2x晧9s6 ZHFFV*t:1L%-1ꁑ~q[Mv@_Uߙc;'K۔$XO6d3DU-B ߁ U|:Mjj`BMbv<5;:/}%+>p,$jaڒ-C9<ݛg,3^HB6eM 7f#T`bI0p{9Ow#}7;IؾT䘅7Z|FH^:ڔ5p۟Cق 7ޡ'}:qN|>|qפe֭ݍO8|̘*_!{i` xЃ\vY{Zyzp4qqq_M;4e۷.]xh׮9}QzqrrrhҸQ11m. iӚ3~_'*)!!!Rvl Xu_;8))?]aer7ڈ[k׬'%'ӦMW |RPP/<%Vl1qW>Ӯ]*]߿ܜYgnڟ/٥I獉T}nr6,<s7K'NfeX onp_${>v" N4"-P@T,--YN*jJaP崲~4vKձ#;ao< hdx`4a%= wr|&edcvd (&=7,NCOLu1VCRWRǪfݺ2%ry\񩻡<+U]:=WY;m/%vM# 71k^K@qqql۶FhrGAAGXh1c&3g̤wLt2#8x-\Ehۮ:>(O{|Sy#GTQ2YR[ޣ Uhp :1U9U2Un.0sNGㅱ㊃`L}o| u9kh>c4iRhOUлw/UއfQQݫ.gC;v&݆חղ]$NƖtbzi׆bVn֍ɤNe*+Yoޞh;ÌٺԇDk'=2dYI/ !uDl;{Lڶ$0#ē?> #cy9CR)(((w߰]_=g$ 9p En]ly4 kT2U%[uH/>}%!|_ 0o|9;wp$ 5W9L&\U܍Yf3b0y-d$&//YfWml631=|*S2eCL|ʪ bl`?}ۖ/Yφi!!0i=V'cnCωFӷS}+)TBv;#J:DpCgEKfzG G :rMndNXm;I<)lmn}+؊ԆW[xgg-hB毥ٺ38[LIJw@.''vCfnD&D3n&%˅O $҂bEq;.s-&vl@9Cd9Lɋ5)k0[L[IKyZ~pdڰX\)8!(I|:wmI6-NSDֱD%ojO'ݸ*;{@ûI/?kY+ju[w<'s!CuR-݇qsۈ3n%HQNP_gSg>=6LD*͡C/<>%/?K/ƓcA/7y_ɇ^eX؎nmsX}^߆ga#p2ά vr4Qfpa* f =x}|ዃsXZzCg /\ErW8<7?KXחoBg %,rrZNoC,v/=⟃?gqAoC WQ>IdrKk }dɷ6`uOO~K{~\c O"38 3哙';xp"me-)K I^_*jSn`@t]יȁ=;[ӹ@q*'H:vO{nZwֻYuߍ!!owT޾^V:*w?Wn.r6}<_/˖`'ҙ|ҳ]Pr)h!`z@tt4pa`Xrs#,U{NveMܷSY?k' oO%q_[rssYr9N&;'>8-MϦa3f#<㤤d̘'XY*7F#=Pvލu+HӦM;1c,֭Je,c9r}Wp뭷z]n/EٸVTN}.oi7Ǹ_ɠ\Q q@ffFm c>KPPV.9mߛNe؛XuLU:` ?q8yd…%-y]ڲ%_{fQQ$cȐ%N4I4@ [~楿̂ U:YߊN墛ccJiQQ%B|/wQyPn#MHNNfǎ̛;Zý^/ l9U^fKXz Ç#>ALʬY+1mBLL!!R4.J'Ԩ%]Fam# " 'lݶ32йӵDDDTkuz GD`Z1c㉍m`*O׮]X3fz F#VFᠽu%""<{>:z뜶QV`iȨa4K֧Ծv䮇.΂D彈Sr_.Vs!hFل k6VMS_"RuUm-`0BVV6,ZMkA[xgz"""l |!^3,^o݌$}>|p]dgeI|njfB#B$xK<5)\ !\ c2Uamn396LiIKpU%&c̣PLaAY"p8rT""""R/WǡnBBB8~8s}q߈J[sss9c&3fRqerr0/rN-G-""""r BBBz\nU&CC0MPr,222p:5b#<"|i ݞM:abϷDDDDD*cbPǿmۉ,J9Z?+W__ߒ{^>>&8S".#N" ۃ3,DDDDf #F#&oIp:Ca5/0 :(xq].n/N[~/" WpDDDDD:q{=Hr*cԑK((4 g kTWՊ 6^sm2ZDDDDDD. """""","""""","""""","""""",""""""Rk .TK#V'+H V.V'T}""""""P 2˪XDDDDDD. """""","""""",""""""Ҁh,o^yrW \EDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDIU 8|(Gshy@5$icZD5}V^gb`6Е{^L\ިMK'(Y9|h9[/Xr$&ILJ-{p?BX9K+[9&Ame&""""ui|O&aw[}ʶ,_ ]=E5pzn"kfvً[~[=>̀|{.OӠV <&(-Kc%+ DpU.4}6-8#U/0@0-Z˯X></l & FDO")9Ԙ͛\ U-H`!Y!(p8Kײa^Jx'~ҽo;ťeYHG-Y_ ͚ݕ]fcXv2f~&Lap)' /O͛*nݴ 9 G\ә;F37|#;gulhv#)}{~!]j d vX;rKnE%6~.Ҷ7wc|W=DvI&*nI k¡~:rh՗L^JžLvoɀre~(u7 ֚魩JZD+t>:0# ]Mq/4M ׻ wqiը1U@v8Z5yq ?|hz588||5DzzqEGS .2 F∀7 Qq]1ԠR˛4Kҵ\[[[[uVfGwyS+d¶bZQGa&dpǠbiGfuss]:qW ) hGD`$M(mGu8̓s@g[IBҵy$?Ƿ{r(9L'٫ c7}DV+DDDDDAsMu3vdgo_rKifʃ"gs~_O#v?'$[[KH&`˵qtw "֕ek}ᖿԖ8AږIRL&3 ˌx%'׾Oa5uG>_!yENx#[7^їkˌxR1EDDDD!+IYƼïLԈa#<Ҷg5Bƚ~ȭL rVۼChƠDDDDDD ;);$ / X(o(R;9_g#i3keQTsR '_W蜤dBg (7^\r?JuuAv7J&G065~T2f?l.SK㤼LaL{k_lGC+j}Is}?ϟQZr7"A\ZKI#%+yocb. mQt7ɿҦR'eM2IGΛy;iw^ݧIw3ny_GfpNvmKƔÉbQkvmc 3MtZ1p:U@|Evn>_`ZZb?AۉHfw;v !FջV:EӊZ!zR29A'nQnFm+kuQu*k"әpp.;,Ǝ+c/eVpzV2v?%)));;["acyM'dmU$MC^AtGtrj0Nヿ࡮!DDDDD}]]yw1hB̉Q}EQY8_6QL79u eGu{{jM+i53yݰy$m """""׵&w`Mv&ЉdЦ3c0n8U a<m 9sDtβAؽ=,2 '%V\L:Gh~,Z̲e[H#L@`0:12ؖb r((k} y|i+f~>>1-9肦(cM!MmiYOrҵ#f=S=K>=P--Vzǿ,kʴ@&8e.6ފR>/q{Ɨ1""""""WKHX-#M8y=Mg>; YV\US)Īqr[>V&߉]crIf|yj.>/POӯ\ 8Jx11wv`פPҺw;9]U+g98i^Lw/-X7&lsCnс]t`] ^G\ aݡie)"""""r}rP)c|hМ.>?ZlєaFkftݎ >?xx0&).Mi Ь Ln OzYQ n+C͞*Nz<_>MAev#|dfLKonfzyqY&rAP\V<}kSepU՗G黯j^E%eMMWxkS#{WV-S/NVn9e@Z4yq8M;fՀ뉕t kK1--&*)(;{hޞL->RJn_o|pi7eТiU-wn/zoxsSvmx="~ćUcӀɧgV N'UpʧFx$Y}[x}?o ]rϧ\nhfjx{\P~η ٧!)]kV9iYŤ9koܓ򭧵נ* (ԏ;Y{~'~lE("""""Cq[+N?*w3~ό|VB& bhє#6n Mwp =ּRTȌ9Uf<53:t֒1)Z6塾-Τ]MyZ!# ):)f̽9M9S.֦[,D'wޜ2]OWk2|x!t+:=J7@ס55lذ3JfI  /s]deO\}gϰr:^$""""""Gqg{{޽{?MڥzU44xHCX.6cL{UHCդє4(NavաO({꽴ѝkIDDDDDAS(((((((((((((((((((((((((((((((((((H#:f𳩸 6}ߍ߾J&A5/W?@.b/_eixO[wWB%Iڶ*iIO? ^YK̸R) 7~jQ'E' AlYSgeZDDDDD"4%j}5|nQiHsꔉ4"=}!''ɡO>BifΜɺuӧ?ݻwۻw/C cǎ̜9Sy}`'~WehȂLrFz>*v7aiOKf=OhZ/׻%p[Ύ$ ]0"[ɩ=7 "}"Gy#{a*Syn pCQi#cV Z +#ÉTu~o##1Ρa\}2H;rK0=)sIO-䗂+kiᴳ\H=+c6|6RrI \AjQ 7Zom;qm;a}3G8zkfÚK#@xJzVM&%3]R<,"""""r (pfa\Dg{,u;8q~$TYLѸt$D>ҵsߢx,ъ|rг^ۣ\uE.m`_ZIe & $/i׾Q+ E粀qĶW, pz{|-5v쯛!ʂ>]ͺEDDDDݘ sKY\ik3P^kDۧ0<ߴ?~G_Zv.6ȳ19䢔eEόbpW+ 0.2s,तa39.L@p";Xt^Æ wɩ,-_[<ȯS<5.F5Kv|g{0ig$""""DU=x6tkꅯW%%9o*_Y, U6**xuWw lB$QQ],>y=W5keȰ g`rauo!/%I.0`AyaW8s]f6H7ZUg?V """" ?M <ζRPA@3n55e:]{C^>T4e_n*g㿊I(0Ӻk6m 硑Ԍ=54})bXZ|F&U-;C6v"~DF;?jFdWeD9X#bsGDվXSvgpbj "8Ftgv]qXWg9Ң3Okt6̨$2q+dwԙ/`|Uve'*k۞ 9_pm\>%g7>6y:GgFV\Di2&.$F  'nw&8`}gRŷi2cmQ]_aɔ8ry7g c':\q """" ?"//6KA4i^5?m=J/fڡBK)dY fViº'Nlڳ̭;ag:PpX8-En1"v-=]u@m{c` LOYU'”Me!6WAfMO`D܀i.n}_-?f#0s= ], WKD8Irب60Z+‰e#;$. :c5Sg8Y #!˱aӢ}e;W=Y}p~[ Yx>et:Z/Vv va?t[]XB6UaMe/nk\R{<\`Hzk1ws~9s"NWҭٞ(ax12.7,58!>a=}O;5o\)N0L-5v*fz 4rmGLdƠn&X\DDDpmgUi:7&PB7Twy7UrQ_V\*\\dJ3r1Qˆ9̿yI.>n2X|v{ -o>Sؼ:1W>S$=I7`. ;^b-BpdfBG2gĪ@ž<6' mlPg8Y03 k -g3 7WM{g;$H/kl"g1Of=)w>FT!0DM ;d,dgt4BMlt!_g %U?*!-'`Q+RYA@&tkJ68Zv &fPQ Tພ`q2{v=6˕;7ܯ2=ig>@Pg֞=}&2k`NeSv*k5n3h+d d%F"5 iG ? :_hNy鷞`g[[[…Jp(F$e:m؝oeW/{ؾu. &Ȫ4.|IKqd$wxzcw{*s:`V_&3\qv;qٶ~fR~5Ύɧuׯ?{ɭүk#ޖv0:3%!9RY5TD\}YXL`')K1l{TB3bh'捩~cwJ\w7JF10lW0 ^սVLf2ci ; UD.[}-_3χR';~'1n3ѫɌ8KWIaX~Mf pr(E)q+dna2xڝ'""""$KB7MoA>/aMmmb6nZ}Ď cTVl1RrDYlKH/|[0k#&ў i;VPcA;Ik>fz> (ȫk+axlAMu<ͻl6-zunDDDDZ/(`{ o|q;ِUJ*jr&[Jn ,Mc,6.Z'hϳΪgC]Y,3M& 8k A/c#}&3p0?!]od%&%Vp?'+ṉ,zS\! *?NLDc@goaݗ.BEeSkUV.yibU!w0{'3ʭb66kˆӉmm&z8"W[nmea/ڍ~3W>.۵mBf{3bL3v. =-`\r63pd~k>W֔-SgR/eNlYdWYR``͆@S$g{δEW1w~W'el6 ATl4Adfnv#-ŀ}O>s =1#̅+Hryu}{t3ѳ}ng#-t3KF՞;yS,[s氺b㙵qBUǜEX1gʒMEDDƎpÆ Xc?tfmM  >""""r " LܗMٶ& Xo8wKL_yMoƇ^;IZ@:DF\Qi<#7ZMeNˍXm&j׸0nEDDDDEaIt'Ճ4| =fEFGLDDDDD:;Ι4d nJw&o[TIAki@o&u52DDDDDDJY}yԊա>"""""","""""",""""""҈4l+++u&DDDDDD PYɘme:"""""" Wn[++qg3]H"""""" 6hWVVzp*i*+粜w ]E"""""""7FX""""""$+((((\&~mxyyYEDDDDᷲLBT1 /x3ݺwW>@H,Sm8GUؿܹeUTT f`U1 Laa!;vI9]vd2bXDDDDD ~@bDQ`h].׹% ; ((((4_,ft^LQ]`Jdqטf2L_p7cqgdo;%Sg/ѥ,i~iߗ&!U\yafŪVWV<_[j3Y8&p9؟Ŧ=QY8&qÑ4RtdO{8p @￟<`t}=v\}>ՙV&"yLj6U]p[r+iٞ1h{"?L۩ـS.xY, ؗX/ KpFL` zwr"r{H1;kvN1'&GĽ `,bp4sgJ}h%{~3/Ql>2V}!X;3`/y1u._?A,v>zb Du׈K&`t9i κR䣫=ogvXڻb1#v6̜{2ܖȯ\/=+dS 1ZsDM[Je+i)$Uܵw 371lM:?!47||Iit Id ۧE߸z54Jcc#Y?/ pgjYce<=]w=|8?>H zf?p}1fƘٷr>O΅a<Ѫ8f?KGċ벱 ӏ=O/&qr[6LdcӾĿkIN""""xPyv&>Co'{vfx/)ޞ%{&ʶ&xB.f=C-y`8;I]=FI=1~2cA߱yAHKsٶ1nt \C&3;&^%|p83q/U8f>>NQ1 -~ž,w10LtS__q4h8o<C,'7Y%N=fԒϲvۧ?Vnˣyh G2iaL}0LבAT68TW]l˷J1G[EۛuHHf.NPL*;,t@|m,xgY*XÈ=gKp̜;;ZC(o>\OҴV CߐŬCۨ8{<*_md-4H~5!_\XL$\;q]܀gY"Yieq x1 s ZD`ѶSq C.pq(=捘ǡ8!Pwn5aEmwH_Z}ڧ?n}mcuH# ]#W/+65t"}-6N#(ڇ>S#: )ieL"%+[#/Nd@+kcY>❗X0q=9O*`׾goN憯OUـ:I~׷Ɯftx8؞*Ȼ@'{dmK#5#})[jg2{]DDDD%5CIݙ΀,0⇄0V` ?$pc X5 Dȣew8X"#>N&{ʿ]K 3Vz \HmBhS@ّ,*!rpM e_/WgϿ(\+,4:1uXZ":#k0cUKBc>g(!r'gDGL ~[]Cptoc%K0m-#I&`3V lHMd_䕏=>-u s[V;0n{~g}!?61V?N?E?5س&<柸7DQDCQF&Enh)DWDDDD?Sw ヿA1ݐy8w_w !yuo<6?{e} N&3L&@,J%J"J(kuK(Jןl)n-eŊ"v[%hD4` 2I&z./d|grsvqB1ZM^Ry(J) Bi!~u`(WdI|ƾύfU̯>yN(?A9uSѷm=Png2#rV]G3 9y'6@ saBonW+73&f -XΖփƝծ z4 iBgnymI$q(}@ "?a|R& f޿ }^?n5kyQFf2_4ElLaBQ6XŦK / bU<O>XhdWV/x~} /46fG;g3hI$I-yMlZ 7䌎_}0X$Imf~jf2Fo<%X$IRK{+~{㠏H$I `I$I `I$IgTv`oK$Ig9EwQK$I҇JJJsߏ IDAT"))ܼFUe/>GxX$IGCr2={2r{.ZrPNA[LF=IN6$I P(yzѭ{w466:8G{``0h$I>nX 44480d@$I>A'%%`[k$I +gsԿ8,o$INoV$I$$I$$I$4rZ^<[N$IG{$I$N~NJNf~$I$ٛDJJ IɧU)LJJ")9@U`$IS4IJNi9d2)))Q$Itʗ}ZIIIp@$Iά>-CX$Itb9$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I,I$I,I$I| *{ɣ̨PTs8w}Q"o#;vSg.`EiCb3L2fxݸU7Le=R嶔$I>#)-nbr ه;/PkX4s On(|Ȧp  Oxbɘ2 c ;%I$rR͈|;^E XV\Nu"LcִdJ?.L=<+[Arɬqل?>_p/2tq:U\Ƙ0qfN_LsxRxb  ߺi8٩P!?DzTnմͣ-e/VQ`~\yT ]q31G0`.+&xpXqM5Q]4e4m"Yz;*&:h)\c] 5%,*bvd^8o8]MC^`|'GxK$Ig} p?]E~`3)!U?"kl~gӧKP3ID.]63a2ߦtRs.cuw(cS~ujFTSp-/f]AzB}l`OXfͽ Bl\UfM0%?\H^ 5dg$ci:f/ XRډƒœ;m&QŲ9?bYYiԭ_쟬-~zy7NeL:ʞ\ 7$It0|Ix)OU/䡥?1)BTV6޲ƌȥd'}x(gB|5P]xGf@\hD"i@-n!Ljr4CTi ' F;jɸr6,͈.ݸaOAP&̘ͬNvRοr:F %}9ݳ)OoSVHNvdk)3?y_Ϙ!b7PrrL0o.C(7nrI$} 0AG`\{d}b|DM@}Y!i?N0A$It0v%xjR"-N>9q!6.ѳ a n 9wp:%U46DEzB};r.K'S[YNIR~#,yv7 ۈ!%=%adJDS4-5D7j!==#!A(BU$I:^gg]1H5N MĉǁD{vSt-!FoFrB1JKby=t -[ÊGl}̘D#& '0xњrV>VNǙ1Zf,@ aB A2.BN(K)޸el 85SbeA @lk ˪fP CT?Kظg(JT$Id7˸+}R «/#M4,Q֣yp*smw,Lޘ 0JNWhR{%C)I$HqHǻ3Y$I$I蛷bG/>EsbMMaxu: g΢ |^/]c޾.6=ч:ȹhvCcP$_Ѫ.>ӯvRw{ B98Ϥ;/IrI _Nd;IΥ~Wywp{6$?<{n$ItBSa&/o0=~0yu6*٦f7>Db>g 4tc[H#*I4Z~_~_#?;Z= vЪWhnCrU=ǿW5@u{ޝ%JWT.D`oIٿЊ?s u)w$IIᴙ6f?!L5S&!Ҧ>Brz[w/]^DrFC$Wד{!g:8kt~dΥ. ;Q>nՐBbP>T v|iu+wI$Id<=:pܱkc2}`o9++2~N̄2UӖSO(ں``&|{UrJvu97θǹ{ t% x`w?|6}3M5Z8_} /L=͛==AáXFZotˬ3@Ry~ub-IA0H( p[SU$>dRx6cP&ӳo;WY5NeˉSZe?dRCbz^9dD ⾹>dE9,1OOGʉd_KZ/ JS'BvI:xX,3C#XԢ}(F' кߜ̸3}n9mY_S0i:n"xO=Z@./.snɜI rj6fdu 7SI1NTPt9q ㊙Tn}7@C'Kbu"W2K$v$m/Hˡsm?Kowhr %^YOCԦӦ?D/I}|; hݍ޿|_b{71~%cBD"ic{IRrFYl[i]hdJ(K %H( /d6QI6"Dga3ձS?UT3 ϡkn*!ܖeD [=Ooݚ17Ӽ{  }ϳRIBl How}uAk ОL+.as^mwt;\>p8L]n{!I2[ء ,[ʴKfm?">e0@և$>b鄛CJ棎C=SyW>P($IpKNb=' &|w N Ç"XC}O~T3J I$I38<1DwQ.y9b1Ba'bj&1J7:c7_I$I҇;s!lbQ? 2"{*p7L X'kly#=K{b6\bH'ӣ%I$Ięs82R"8eyBL3I!f+ZKL.s&qiU3yd2B()ճ./"{$X$I>Ç7'ٺUl= mhh3i͊Vz@Hҧm6w@H:Γ_OZZ`Lu߾ =``?DE1e49$I$ af qNW͏z޿1mةuϲ#ChAяPu$I>@C3^6GxO[HF~!n)I$SDz6;bNvĠ)v{ $I$XY~vߥ(g߿=y^e;nۅ>u yk5:І#_КOԇ:q|% Z=k'6P) lodI$>#: a\ц ur?ߚ!&2{kj_=Y2_Lgs/}G!ax71rPWG:W2rP?<ǎ;^ tx]8H}%f@*]!Ұ՟l@ܗQyDhI$>Y߆5Ct=>ڦc'|U(H*бcBRG}'[huP':7@tif$I>@8br8Zhx ?.yH;J~Tg6;?R},I$' z2&7sd8-\05]%[M.bz $ISOƨrsti)'5xV%ұ#)]=l$I$'BTG[P*Al/{ߡ.| jCe={b#`FUK=N={wba/P&I$}{ ttR?1g}DniU̜Cw-W' 'eU-UfLAWoL1z0]6M;n_0ud^:oB^{XG=((Dӛɹq/(/cܘaVUQ]MB<.UL^ͽO$I O)П15+*¬iC9vÝ8,;5Lkvuul_8!"9E]Ƌ;V :^$I2 &3`2mfǢ=BшLu!H N"NtW5A]} fcG<-5$I `ӻ?=;'>7mlRbHO~6^Y(תї6PK~.w0R7q<է,`R#Iu $I$S yj_™䍛̘fQzhm39ȸ*^:X{#~v1?40g:ۇb#X$INÇ7'ٺUl= mhh3i:h€άK'׷ңGB>m۶Ѿk/BtĘq~$''e۷^xḧ8p  =y=kO-QƳr>Fӛ0 $I>)BD:@'X0bTH$Iܢɛ|/ycqB!I@<'%%I-KC(ֆX,@H'q $Itp- ˒t8h u@$I-@EJNI!.c{ݵ:E`PZBr&H `鴉mϦu۳ I$I-I$I2%I$I2O'{J,hOD}_b}w?k?tϓ$I$3Vor+sw hc/~MpVsH{LfDnw>I$I:ZMz5Ha[ox-|j^j_ C܎p?/ 7I;7czZvi}I$IԂƋ/?;{>hM $Cި/3c=m^_Oo&P_O?rɡ?gfq~ 2uZHLwJ=DrX$Id ;qK5Цg7!%V`:=]$_۪:&}9sT7i{ִ?2ᡥG߆vƝO$IN{ ӌ{C{׾Dt=9 ~ ҭpvg"TA7zMvAZs8 ؽDr:fo6D8$I*ſ@{\CY;g{<޹8u!ًΟ]H;)j`wRCӻKkޭnV99r:t|:߄Ȑt%I$jYm݃\q[VSvy^3M?|9!c {w U,{1V= }Fǣ3ҟS_O?77I$CFk{iTyjZ吗=O$IN{83ӚvIUC"i:S܇7_{g? >'g{ .-w;$I$Llm߭#9t=oBJڟm }=Gre` IDAT:I$ITbK~q#džh[Ц#I\ f$I$>9!ob]$I8ދX$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$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$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%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$$I$$I$$I$$I$$I$$I$$I$`)$I$T7pO=K$I$I$$I$$I$$I$$I$$I$D8%>-!I$Ij$I$N~nl}jI$IN~^5rؐp'$IӡGZD^$I$IEv %I$4I`X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I8)-U]ʹq ؔx}nWO>/֗$I$D{a:j(cS*͢[(h I$IpKڟ?'*yxʷxMoK7KX!VP"p8ӿTS\k }i2l-:1- Q6= Wuw~}>CM} IWO{z,XJ*C>/0Ҵ5H$I 8LT Q%tw}2ռg5ܹoNe6??BMQyf9S` Nb8bײ|a,ذl.whGxkb~#s _Pɯǯ7ȿv*3MPwç@^Ʀ!2b6H/ SF!D.uw>7սC99 tӇaDCGC^ƴ^]?+2.Ư"ϴ9S3a.yrC a~8(ᖢ*^kzb{uR;1 C)<7Da~.y $Idռl1u+wz=1:O˒އ 2blZ5{vk6}ݹK锳zQ}}zlzw/b#^b[@C3Xx5MC15H$I|:K=6]Y\`3;wi]2z6{$]@6~EYlk9+ʵ ~EK8  Mi>uv/f6esZʆƏeħ} $I$Θk;{@,(pv,Z>\:j$ +t.nrO77Qy_)giREHDs Y{=-@j&&T;_02^_ЇP^$I$t)g+ dICY]S8]Wsð/Who^ʴXMpqymlt?8{r=a {bUȠH/_eQ{i;8kkۘQ =a[‚o\fCq^.Eݳ"i_$I$-O|#wsKVsa 0~O.d.a ͝S_zNWV{(Snf͗ZσKV(aOgJӘ}+Ocg3tT_;m?[_Mgkx Mhn~=S. k$I.iFn}m[OBb1FX{es1ڂ^{$ImcodAp8L("9_Uo߾O<s|}^gK$I4$I$錐| Ne꩎$I$<,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$I$I$I$I$I$I$I-1 $ItZ8->|T죾F'I$I:ղ7)OSDRrP),I$Ih'''8r'dRRRܣ$I$/ߵ<4$I$Y|z[ʩ1$I$c$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$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$S:F|9$IRKW[efr_fą&SIJK~qgɣkظut7a497q+{3Л7ڎ\ Ǎg̀4<0vVfMf|RWQ̘2LR̻&)IfSEf-N^op㈑;xeƼ D!"z_ƧY9Gp(B 6a-T~?颓 M HG'wKX̦¤dBNnDI$}lA0q0OUJXhD;#2 $Y?]Kވ -gKyr*c҇Lkg7MCʧruT.O{OcWQh!ˊ˩<$#{0c9B-jXs.cUL83/h㌹ha OA^ 'u_9 aHlo7r`T>˞]EY."Wu"$'+ 5dZ+d\q= D](903f"y!V-T?1$I`ɹ9)Gĩ\1%'\Φ^OAa j Z*H>GC9YUTWUR]@==!`롣V1sc_UY dыQ]YDΊS[&_U$:u< 'x ]ȸnhƀt"m桌>at=BCrVp_=QjinAHD9:iS8L$I:VVCM:#^<8%q \Hfe#.+ڑӟKqe/һda3ъ *Cn~'l"g uP˸yڰc^"-Õ)*C QP?vdoCDt2s/Lme9%EK飏a6 l#'WP|{jh?{ hB{S?I$}_[ɾ6ԢUMVΜecfֱt/`!;'L˼8ggXyj[WI}COWS2 @FN@׶zFe/7;)/F[rr}Aڲ5xt9nj)Kd0bp3 x9닷)gwqc_{ceƢ T &n$!_kY6]8- ,Y(  Ķ( ;D3+Ɗ8$I,uʄ[g0!?Ll9K~tcs羽%ThmtއP.H绷1: `0'$F!|)s@BD%kІzwDZLm:V4? OWm&%|à,);\I7d[d_FORlԚ0){3YrS-j)wDHi)Y<.cډIOZoLw2/a̕XIyt<]M-GEqcFIJ˱2&$O{ =EFTh ~ """";{z6c\_B|p ϡ8w [{窂Lͫ0+/H{X.+TV~.WE?hCC:t;6"i)XM^ 9z &9e0Q>/_ aگ%Iɕ?9O}+OsM+OjA"oCTJILMr&ιXI]&qv6E>DDDD<\ʹPvWSg!fթ >-xY5I)udGq`fe&,܃30Өn؎aKC#kî~޺Zl6ӬT\[[{^w}ti` pF6Ũ>DDDDD=7%1&Π Q """""gO-"""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """""""?W^'IN]Y]J.N]EDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDk^ʤSXk2};R&ݕN~Uvzb~:r-eUy5>SCH7k7Y&U #gP'Fpk+z,$OrEw%Iߗ'&pw^p"qX:oޡRc;x7`Fay?i4gSr3kj<ĶfUGwȥڅYwwkp7}k.wClLJ55cgZ|j;< Ogxrg1it#1-g[?v'V\R.Ώke&F~{~ôuxwn{iӫE^hJfgM٥#;]TYUODd';'qFq#""""rsaUaG'yz{foYC`՟2S4PN78:p p=]%T8F3;+G_Jvn78"fOÉ_s/V5e!K,;?_&o_dQ!F Ćom=!V7B-}^K^B\*wdֺ;}ps L{WM`4SLM0,P~3*ކtp`O8\kgO=AØĝ8[>/> BѡSETnJ0퉕X硸oJDDDDD.C>U^N'`8kɊ`kwg'+WhwzG5 & P,Q Ɏws_+6Tr"g r{xZao TpTbSCIiLz*-ըWϻs&{RuSnZVBb _}}j%Dȥ#8r$FXnјkz[ӁVzwW [nV;pvb[RUM}'vRסQ)*oZl9I{YLڦ M9@ z:~#A}e'pavF4D8쬨8y#\TT#""""rI;}a8Ï/kHwIQe5>Gg&04J_Bu9[ˍFpZniSq)nN7ޣ=iԇwLJLkX[Ž)O쎁AA06,aj^ePXד>KDDDD䒲Ӆڙ&]=Cz!޴jlN'!#6G}/eR=R銼|#Cq:$kiS]#xY}[Cr_ꇃHȢM`{(gئڕYU÷a4YnC93HC<,Ze0LgTLse1ÌgOR9eTisWUw i4u%!!=DE4>J9G?7 ZG$% dg9qtH~JNqpΚV8".),^$RV4NRҶhÌS= )2+TV~.WE?hCC:t;6"F-KZ筛ѪU+f3͚]Nŵu8N4H""""""" """""","""""","""""",WDV1SM޸_kSԯ:m yȸWLʫ>yfhNucX]DDDDW hl2HP50 ;FѪGgkѵ`0 &B Qpg?H$bTͧ-"""" #RI5xѿ"$<#ak9F IDAT3︟QC{ &o&ёV-O(LJ,|C^]&}BoA:ٙϯw vo;>PW)>mWVo8!gRxSk_H:]}35,.`S Θ~:ޚ{UYo]k( Qqwzm]IH͢ǽ2͸X{<~<^ /ɚ5(z>9wwA=+iRX0M.""""=,.f4bLWx~)z~:̬g>NY<[ ng2 eU^1ᵿ 1^V-xit3.\o27VI|7h*f޴Xj??+xzZ[[bܿ5{-""""=3raP+ 2o fv|:0|*0r肯=μ#,8zCc=bi^lI+1uU'žM4n%ʆƁ`qkaIՀk~_c4ӞA.MZ-XZ1ik-p&~/-k}q ڰ`FnwO}BZ4ȁ;WRERd1[-{j(onj` Jς$Fp|GGոw_?k?>ZEo&)ިɅ`|$iN'Sju J#qaO[sXDC""""b_ |Ie'rU^644P__ϡCcc+cT7n"3 jfBoUWe~޺Zl6ӬT\[[{^w}`A}YCY`f+ȥIX2Y=9F `ʴMQI^w/ `0 """"r("""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" ryW0m诘W}o2u诘V=}^Gƈl ;/i˪~[fݺ""""",S[MpN.rmv޻t$g0kٴ[BDDDDDϕ9+kk]ʑ8-b|xWnz˶7#axuKx:Y:o/vNai2F*U^0MN2^MuRڅ:c=qRJSo =eJǏ᪄0<^<{IJJ{5~:m"""""Yҫ5Tcku,!32dxfyz35cE4o/w#mVaJBשD QH%]QbG|G;)Әf(gn/6DnR/EuW( V[_b;_ULq Yf """"H Ywx퉔߿~E'_(qxVTA1DDDDΑZp}}=oy_ui}~FrDcɬ ܖE aj9jo N+y-9V_``>|! *DDDDDX.#?>"""" """"""" """"""" """"""" "F5[SS x9ޅ/{_si`4tЩw2:qщ~Òoم.`=0wс {""""",b/>>~h|#RMUBvС=Q@];,\X:W u6DK&K$:}&rR=G>ۘ=Xwo${. #Q$G[=Nx뙘q#d屺G29T7#qsQr,aDNb샷2Mckk)>#m~ lq&3grG W2MpCVUUŁ/ڴiCxx*KDDD{g;\YjEQeb UEL_oF0y}^kZEl=ϙKv0 &obS0֎Ußþ)=,Ca)$_o| L>u@U<|qOH$p9yϾ@i&._<^y +rn& TQ""""˅3u 1<Xn.;*ǵ@LLpRͮdݦL#Fqf>4em$YU RxJ'D󳐷) `_B0qLt[i*A?I}o&"+ €dFT$k<W 򱹔AUfC읹 g_ 720 !Vo`_€qSn*D)]Kdc!цS~Kr ͖yP#5m43f w߉;fRRR0a*JDDDDX.!m0ϛ~z~MFP6Ou\N';;nUXض-u{Wń|ָ=Z%y߆hzOr|Lr<ƶ!i> D60u^$YYY'B)))'`D|"#:ô|*1RZ$O i]*~g/f'eO4uS~!XWDDDDX.QU;v"{N6K3̝w*p#r"P^NM>. {t^|lu!e|͐[n{.jgGشOv`誊O7}Q{hCNm{t4bCFKyflrJm5Wz 6!Muӟ QK~8@Yn`ͭroC͠ލ<7€N"׿ pľ沰6m#FY3LطS"13{nCHۉ kE{ Hg`׊A lYKym؜K>$ŝ_ҷy/dqB;pۿ(pSG 2!Ȅ{3 /Ȏ\mjC}x=,OH=1"X[廠+"""âQk{ c0*aa^9)Sh T}ӸKBKy=oU H&Ma ˾5oW}L"OΦncƌ\rK29n*#{BtY3af_'z/mkwxfɶ7ScH6Ss!5!)` @ێMsq<~G[3seqI̘H{ y$=,&ᷦ0g]Dty,%Uy@}}=⎍h;F_ }=*:3tL*| ֋c4c> '?+ՑGDDD;Iu!ZjlYߦZ[[{^w}."?u_NpUh+UE."?_Tl`yB76ZUE`ōaioX I_#2frn I-"""""","""""",POxNUggRDDDD++:#6W1\ei?=]])Su[ˤz{CѭWDDDDDXΎ-/5Ka8=65[F3 f.re'-7S}f@_1iН$""""} Xs6ݟ;O^m |$ZZ_y-7\I/Nn8>#.>Z5?\p"Yܮ9qSE`ٓL, 8ZCwBks%~F&7< w`&v;{k4",`[G㽿 Lvr\9cyu+w{s+`l\9eخ{p}E $q,x C<{GVpdcf0f<5e_QQorB;Mx3t_CͿ9H4 c``nJ Nc؝.χIw~\K;T;Üѥ$_NHc7qvkootn%7&y፛}N7-5P{-ӷdG85|z` n)hζBvG|PS͎dkj5' hmiѭO34oV˶P~&6spC0𔳵Oǂ!xb """",B-ۖb>N_#)fݱqq);+ 8pfC6|৛lKLV^r7Ky` 7Sẅ́vcVqJ61ZW;֝u^~7Uu7tŧ~;Jڡ?}x]~5Բx= ?; ԲRZ=kH-u+ vqC,X]Z9VG> ]C͞>aq/[w}]ٛʿy$G΂Hs h21-ӥt4kGء. )3x\nkȗաt/(?߾F 4عwݴ8xG:n{\1x/v*/AСCܱ ] 5a,I=ChKHj?o|VZa6iw*=mljDtRh< ˞TUZEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDE~a*ADDDDDXDDDDDDw@UˌZ'px)=Dz(m:l[G(nJּ;_^I5x7N'uČlN_EYl?JBxRz~0)؅26Qf==Ú,1;~'҃[(~CĶ9$vNש6Av xg1y2gV\5a_ צ0C? ` ,67լZI^v< 3qҝ8,p;}_๥[pՂٗ)I8=7GLx'Y`R&M\B}rٿ{5,cS]Ixhi=^T{ihw4"|X~f1?9ءL7S,4mld.X1a@P>Cv!$AZcjCH8ɑxKȝC?f"䮄"""""?PzXΞsg?6p/_u{I,ZY#eGuŻ!=ad Q)[ʌۈJMB-.x 8dVJWJ0+EIF zyO !$9}u~ą){:u/8{Q&s}3^âW;[=U115?I|yFhy2wn0vb+%!#?{F3/;VԽ-v&df˘, z>2c@ݲy '2ĭunlɋMen_ˬޫpXΚglFl tO'pvWCc[&a7G{w!wW\ωum}&1m|H(o|Ƶ$3/%͸R8>۲;{X(*-p?%%;1B,jK(PnuPIw}y6r5o#g-/p6 %a+wmV]Hɀ*ŵ$*ok6l!*$M]^Vg`"z- IL\m6+ u@?0W֕(k/AQ9kT\`\Ɉ@Bd bnp"lֹV0?s9%8%̶`rU,-@=NSnd%Pl>O]2_3 S5=tDza%[wApzuȟCay @YPuz 71|`B{6bFX aX,ǿR8kC=uz\y4o EVNf<Ϻ,]΃s""""" r 05Dխ_B^G({j]%%={2X,v6F'v{ج=ojbq-&d"zl >vbAҬH7a"GPpX Zo`Z[ 1AȐGxtD5Bm^SB8{N8SI,ZCG%_:]}׏Of&$LԽs5>27MFaޭV'|VWeo KXz<1c$1Gֳ@nh:{v:xnZJnQ E9oRrNl!׵X).څwv <Ŝ7s݈ۖ~o%% #Gy)+|M5հsiC\k (ںe'=l.YGddQTs_[4--/`+QQVq\O/ENgo*n=.Zpc]o+w!:gz[DDDDJ-r|+.?um5X}U]I{p y9,{uzϬGh&2s򗒽v :w7|wc$;pRքLٛ lQH릯 &&Eq7ʖP4o;2!Zϯoyہ$Ȝ̟_MRʖ,,vz a9מ$O^֕ĪjO{#flaNطkw? 33> Hb28^ㅸ!&C~ze=]0s-IZ%sdffrǾS]xܞv$I$}1%I$I_h\ X$I.zZ,$IdVοnds8DFL=8_<%SgI$,sJyEfz ^xnI,fmi )I$u0Fr&ʹ$I ꠂB=5ck[b@$n:n{j|0D;1I6mNrW%[gM'ޙK Lj ^R@SFm\#] #yҮ,[0hh]rml$IdVǐ\s Li5,7MgqÈ;Jn*-:Vrn<27`{a6 1[-[)ݎcM׳|%nHd`!VI *&-iⴳs\EŲ$:|[KnV34U8a}$Id5z?[MEݾ4fH'ٰ /Nds%N`Gߐ9,bü| :e4\!BGF5olvmct@.,s GG hll$ cO5?;M0gx.%Ic`8?FpV69S4n]DzlKqd@Q6~0n09Wrc;!ZCH56 I;X!rc%I$m:.ק.sNV?? $jNKss3wfK, <DZoE8qƣ[I%XX%sdffr~T]xٹ=,uQ}Օ="AWdJE?[I]u|H㉹}3aihbok3rw^00ߦ #9gGyxb7RLMԮ!x0=2y?c]]VΣOVQpΕtM_ٲ=OHֺ1)_Ͷ$I%[u|մh; ]ϫa瞗O Dnk <Ϸt"3lXy-qAEC;WϟfC[eڳں$UuǪr~v9]O q0EߕГU!H2ov5>1X9})\nqذ?4ALjO̠8 <V,e_orѾu.t0g$|lO_sɠ(Z7QWż'+!g OS!|;/K i*dͼi۴z&"Q":^XJRCiI$:־~=ɧ_nNֵtq0bx38m4|(eSr;]PqngT.ש𕰥8Ȁ[HSc/'J׌vl3jے)ȈJ@s7ZJ9Q68;i̤[4D(w>m5EWZd˱o6~\T\NR]or !L|:w?Y $I`%YJfN-]Y 'KYL~%!ILd-]V;eDc#^#UnmN㢳"l> c\~4+(??vO;6ѕ5cQH7vzy'_Fn-䨛9!ĊL_?-nQs?$yqd^<%#hQ /%IK¶׳\F|3jrlHs|o%i$Szu1ŃNQtHn͘ذkk#9W.B 9mOR|,l_C/x`.=zrFrSQvRF)wn5R?ox xQ|[U<]P:n,-_]R:w>ᓄxtR63bHz?ŹnJ|F^p5,Wa$IqÇ־D1޽{innf݌z3Eg8Q߲$Ig,qxEȒwӹsg2339cߦk׮#^~4}vnO[%I$I_ `I$IX$I$t`0w.\ Kࡱ\ŒH$I2# ܵ$I#Uon&I$u5mF"2-$I$:?d,I$OјpX$IXW=֋52 $:^eVXOv_|w2r@W$IQ5$Hx%oVӒ'I֕`bw}wscR&귽CG I)2&52u,s3y!5!f1uZz~&ZI2)4K4m~ 2sr9Is]}OzmrͿ$IRո5XEO>MCl]"E,7&gVebӿl,,*x x/b@}}08f̝S_Z֫xn6 ,ǔ7]Fbeyf͂!ǩXz8,= WN쀮!]DNб989̦GԔϧJeyH$IXC[=u_kZrA:A>ܜlؾ0q >#kT~T]O{$ijIR_븾0FDΈ%94x/JI{\M]"Д-%8c(cl~p_Qo*m r/^?׈$Iԁ5Q-E<'y϶ƦߕMNOh~0$Mdz ijp u;:t_z'u'!A}:e̩̤ۋ[-L-cx\m_0"n:Diܕ:biDQ"*gH:w$I:tD}xa=/cd˟k ܚnlO.@};3r gno>ؾ?Z[%5|Fn!hR ꚺ3ǾQ_>CUFMɀTLf4ruZ'3>-5jh}RG$CVb@M]=C1c ''x@vHџacS31sVR3?f/jx#cH{ #Ha,Ȟ .L"6/d^՗]76zo]wxbI$Iku ^hQb!D xuC_%i!/L2ɇh K-&_@v$[howLl E]nbr}y7.reY[;~H Lw 41܌DmI(1~j9gqۢdҋ[:GN9pyLHXbI$II@ }6;"/.;nnob.ȊK{(-F[o;>)d}GIPNgQHolY{{\Fɥg)-JǾƜk AgcRkÇ־D1޽{innf݌z3E޵L$Iw+B\Ν;ɉ'Jڵ=M۳c?X$I} $I$$I$I`I$I>Gd IV.ӫo~x3 72gl^ [ ,'K\0J<ԳL37S.H$ɝ FX\Vǯ厫ݑxȦp8{Fq M ϧaX,D?L;ٟm$I :"=s_hʢ:h/ ?pcuQ 2.O=uDq/CNԒI$, {^c_PRG^uLy(}OmrdIGGɀIXm@=Øϓj]EEYpPtuOΧ|FRdz1du\EVF挽+d (a I4:`sYN҉L_eVc RvEtr=OGdu\zTt3 nkNݾysPTŐq}qC͸'3ijf/fն$Y\r ܍ϱ6IY1bu˂ ]6I+Szŝ""ﭧb-{ ݇!q7 IQ'a|I3$bvZ2 .$I f+ȿΜ4;%wY({ʨHcxp%de'xT1T&;f*WgSX?]l]1 ɟȬ~Ŭѝ%2u3p4/|3YTxO暆!SMotf# 'K~We)a*~X\=u$3dALsϔWj:O @zʟL2xxr Տeօុ+#}`2#N~9w`yxk3}; YD$|ySBψ0+HUo! +JANX,p׌R7c_f`uCIo5KK~p1b=3r5 Nodo]ǃYD K2e,eQM4C57sefJ$Ocňȡ?2I$u|"//Mh"ask{gskޘM^߿#k$d۶P߶{l@޹y_csmn) 3bE@3!x@ހ>P5i 5??y5$k=~a] n).W+F^$-!:#G^ UhLz!gۣ듲M)Iه6CАH| mobnMP83$^dgx-I$886״/z'7JCpΞFtSb_MɭvA뼠ݻ$YjA~FJ;D15Լw&C@1gsNEbD2Zf'ͤlB> W'`Ə'hAAݚថ^F8)BS&1\+lp8NYމZ$I`}>dE:CdZwY=}NCnIh>*>)j(yQ*6ՐHxg#5surƃ>wqX 3#3Hn/6t?._)l)}`` 4BVɣUp;.g4D#埒$I]7CtOTF6NDNY0ч E)mO$8&??J]LN^-s7RU + 9@:1` ׍ Hr_.Bq?H51FQPrz:ݻYmk;7IMEN4gn?D># 귴nxkI$V0`8#{3RU$^ǹo­Llg!;T).YAW%H~ L?]qX7fjs`2v߷u^rY ߧeHyPmO]üs~De*l니߯?}^d]6%u )9w_j6?C <͌?5M?| 2gNc]M<6o9M頥ŷ3vd2-_Ĵ[~NG`&MCa{ Pzs0os$C8w҂hm&40W_f=qWs/0Zo2 d2\BɍW9|%IEv?sCjk`Kt޽477{nFԙ"J$IxEȒwӹsg2339cߩx׮]Gyhܞv$I$}1%I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$thgzULh8pg|UL]jd5. S&ְ!I$cMVHU_)#dd:eWg?kVmTH$I:2_js)貞< jmM$[IzF@ΰoaXN@7w=%e_{q}$ffƃt'Af/OAfI0m޴˷Q狨bCLa n|S:;䏝L,@W˜U$IXeb~#!@J֝:'Jf*ňi)>ʹϒe^$>n:eӦ2>/$mܟeә1s&$(_8p~2?^ZȰ[XQzJdžR#?ÀqL2Tz,dNci̸2vΟOUgU$I"X˼ Œlߢ&cĺa^NCٽ(eQX՛Z k^zSխ]7R1wiϨ$IEb O_ 2oN0s$VEHw2^=sɋD{gHsu.cdoFb]{Q8[,`Ϊ~X<S6&]MkE }d8TbwH0눑ț%p!!ʛgx:%I/R[[|{ݻw3T U)(@z ӯ]LfV$I:W,x7;w&33OXz O+I$ a̘1`}e3·yALyj$I:2R5]>Ï{-oN}$I `+ݻ5V+ᭆس{:u̙g򭫮⫃.O4K$C1cyZïٳ{7o^װw^{cH$Ca_XYiv wm gmq7lKkxf".(HK$[W🛛y+}:+][;vf[%I :4ӟ>. w&N[I ؈Ci{gI}J$}0MVB$IԡPTTa}ÎJ$IќۓzEVD$Izj7~NrW8nVE$Io,***$IcŊ~ =IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/async-sql-databases/000077500000000000000000000000001461403617600240535ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/async-sql-databases/image01.png000066400000000000000000002120371461403617600260110ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxw|UϹ77;A#%{Aq"ZE֭u[[Cm֍"T*{MHB{y~a&w_9<9^ """"""9. s)-.bѢE Y^,GvN^W-%""""""cf]IJN&33K-$"""""" b`zY-X***&;'G-#""""""kr_,[ÞEDDDDDfQHa=x^WobcǢk\"""""u.'n[(rzqZmljatyE¯vQ(WCmv;4^}<~ٱEDDDDmzid\.9ߣl5?Hȟ/30EDDD`ǥVi!sv#laiYz uZuH5U]X`X"?fm65%~EDDD܍1FۭX^ҥKރU[__]ve޽8g?A[4+9"`#*ȩv$4$>{k~ChH(;S l`T(/ӉaKpH(~:"ّ 3Xw""""rN[@ӧwnۊaлg/~~Haq{L;HNvNgyվ4#*>V [ jבveؑYO)L807oCDDDDΚbm zbkS^Vp푼 =.7$}8boN^n6:uX|j::Nڟk7qgU_тSƷ37nF:6+_1ձݭsw&b.* >?98`!/Zܰiiޏk'[(T擳o5_TRn{I~?'?ZDZw 误zmsT۞-ZUӫ7#JKٶc9߆ >g/Np(5jyNvv[6lLlpf h0x,z0$lͯӃCL‡ShX kK1CmiX{vsS_?Tb֒)[4z>k{\5'Ү][uqU(X`Q^FNv^Uf8Ֆdge֬vSzqh⋻,?zLJȠeL7:.#k 8Mz7!ŕix3~~8aP8*f~z#En|Zg•05+L4f4]᭝xU+d헼2:Oޣ4|z;m$~i#Tnlg}|dӡZ$&e{]3 \mi!ђpں5QCLu_a-[gyTt`Mi: jM_P?1 41<;;vUZ>#ࢌŋѷ%U-[`:/l`ڐeȅfU먨`: ]{y}'"2 ;MA~Gp󪪿f3>kv6)=zPL'?@\œxH%sH?MA|ͦR/ekn;nLv#S֝ش1Bᮺ՞gFckV?|_1XwD׶,ݾ\Ew +t["❕r6+̍CZ\| ؼ"H k͵35pOE߮,\Uƽyٵ/ `ܹ\rI `˖Uڙ?O8~СN""""՝ֶuSX(/gm8)`붭U!SN޵k4 ?La1z^96s=UCx}wz>,@͎-Ɋ Д5߅z'ncլOΫU*e욿uf!kcʤ ’"o |93+)OQMOD j-6w-&% ܟkM[-4/SSͺy- kBwQ9,tmVي~$J9e;dvlDN~&W_ r xE0 l4dc""""Rs ʞ{p& m[ҵ+;2$~OY)BTL r)?:DkUQCjƌ[}GN-L2 }3r W=8qkgovPPr C[m+[7pP4Kҋ\nKr/IvC\}xYAnp}`Nݍqoom+dLl#ўKL+ )3VٯzbV%h>MXnysm *H1Շ@ș9n\.f=\Q!Vn!=[T92zn=\z'w_2v&8uH wv*I5߾"~7tedSm;2 %/ƄLiE5l:ܣ|6O'56 CkM@ARH{kR2 qwB5l*=+D-)'Ѹ]^~ܷ%8+u~&Y<ODdD9N>6 ),(8h?VA:{V:YFg_9uyDpbWΌh';#RkXs(wa搘VƄ^co $yn˦9W}v=xGuX!pAJ~27q4 u8dM>j Mkb߽>nRQfE;Y2 ~U=+Ri3X&Xw ½ڕK͏ȦCzN+{"7wQ+Xa'd=ܭ ȿw֥&sq8FŴ ';2t9)-)ge*YDQ[V{ L[r˘˹?(,&uG.LDV086՛ jfЗuq'C\պpkoZ5L<);)LBڪ=5>UN%naMIAvY?y$X"""""qUWaѤן0cZcљiDhKgSYo#/?܉''?9W~VagТu[#"))*p`v__BB;>K 5f%%pڎ~df)6rqM91Hp4dN`nMp?vg\Vyk\ zU﯈ߺ 9ZDί >R`+HCXj4j"XM?F=*RjHcv6ẸeEDDDDG6Eu>ϰyxHن_bH`pj1F]a5bY |d{TKvGgiF4rkO |EDDD`׃["ۅs3 |EDDDQ`Eá8g5ZDDDD14Mqz5Ybr(fb,܊,WUD~&LӋTCE)?-j9P`UMpx>:ba)#]:w4MOG\|<7n^tǮ|0M/NSTH#.E_Rh}tuC a!޳_;W[b& BDDDD׎~֯w9zBIjxIu»o]TmP=aa({?/9jH|m6V\EA ѹsg:oj%>!xzEqT>s*ߐ`&OLN !!85Zka33zի"rL#~7Ф/ڬP{ظ?zc:0M$U?0"""Rwi^~~rGSۄl֜91zHL˲+)**o~ _pQC QAڬV1|~ Pi6VOxx8 ߟ‡ӧ1d Nn:2ϨW dz˭1k,f͞EiySokaҗa{x|#:y[qI?!-Ǘڊ~HvՕH=z4cƌ9}\]/Ƿ+Nyώ@ta b%ne*K/N8w/w>-Vm_o < zZZ'x̨<ܳɭkT7V5j9nƛoIbrRAv<ЃO/ʲe~_i[Xs(C16`JMȒ7<'OZ^z9;E.#}O,^H 績*D'[&[K_bib;q8uؑ}ݎߴ>e??'DR222I,Ɓ˵?ǘEeCB,0xb>T}޽P|xt*@AA!۶O^U3OSOK{\w5^{ ~I}GFDV ~ rVSQ^^=AA<7U '7wMguVfmffkڄ<橧 ?,\ SO?͓O4O)W]Ø,V [KVH݉w~'r};R=~jfDBWEDDDĈ8p >|9y[~|}\VNҥ gOɓYt)s;6>0CϬV'j]1iҵX,^|goӧMcuUc}9ϋt^~*:Ŭ9']]wr̈́ uzL^caع27MHg :,p PW"v6W׀{o%e&.~;;Huڈ0?;7<ΓVAnpOnxd&q!gǼmgSt[Sf)L0?Sd!c[ p̬Pђ{9G';FIYH9i羴y'r؞X%FTNar -` [{m4t 7ss巬*6x6ȭÚS<~JhDj\BCBy𡇉\pPZ\̾}ؼe3> fab7KAaA=e&ݺ.{>/ &t8_2zS\&7"aGsS%6B{WbBBMgN 1[ OyӑקS܇B8ůvLaNG8';>ӿ6"2{%QQQU˺u9sN ͌/w$%'УF$440d,YR'7Rؿ?Mi?lRөZlƍNX~dA8>a]U|d)0m w MSpx}e<߾/Z} _I|$W%qG_X͏mY##%YmNAɁd=zǢw⪪u:_=7w&T.{ Af eGCQVJCqۑ+ Ȑ6ϲIJ ?%ajW`,:kWۆ0jxx_}&pG@ R&Y\ 9((,W}xzP#yd|;ʾ?V\wyk-6W;Qݟy5.!@ZuK#)>^5ӎ3|Iٗ_2wzNp8>iu73ϭa0rju/ں]|ӶW7!\ף5@čC<KbKYp5Gy`ڇt]4gc͡ đA8[5Ӥ%Z_ 4ӽM[S7O1;2O~ aDɲli2rh 9y¦MH-q#"""2x?{;n,A|$~g IDATق- 7x!>.iwV٠"ԤUtS #]0|}:0sX1ם }Oz{ՎZݻ{|=j&uQ9OC!'#xߝ!˖/?LjիVYt؁vm۰{nO>%KYg]0j|,=#xڷ'=#*{%Y~ɝ7aI9!#y_J _zJvdMrmkµ,z ~r#]8`Go.[֚ &s\P݉N'Tn{nl𵛓Z'3'1? erK=K~H-ׯ;]wC=kVխ6_®]>}ZJj.;w[~z4䯧} ?1͛XbGi)о=:ꥎSd:ǟ$;+h^_]0o]OrMe23n;_0p@z8a5Xz={$:*FGEӳGOV{>Zg z>:cqAtW4uq`g ^}ZEvxo!{gYə g) ᏿?Ihr/ &¯삣y[7N%Otˣ(oCPa6%s^ֵ=Ms{~` =Mi&u>E]QpG@N6itQ%At=^DD񐛛KFV& ZlE˖pTMNNN/h$> ?qPFŚJ|DR\n_08&AAә_TSyG3{.O<.^\n'oz9/})c/{f>_+U!B +?aC[7[nr##GO9tnݸrTTT0Ïb@ ϝ;)7L׏>zʞc0xgz̙]0g)ž9~g1c9Z>aaY#nxly.ME6AlIJX?G_u-C}Ռ2 "v0Zd'6^V&r:1m'&r(-#-d7U G yСٙY\ >4Yr%o~cp@O^ǰIO1o67ٲi_Ofgcn^64|6Mz?>e",oy-)1f!D:0wt&O4m<#t ˯ʞM[63wX,'0mܐB  6?z +<ܳ>V/8{E}|,"[^A|e~sK7HLN6Uxҹ ~׬xt!sςt7<<"eǷ46M oxy'"Ƞ,m+w-p1}?br`Qr-9մփyDRKʦop~z{:˟Gy9}OZI#-sp - Prs|/+mȤZ綾,:!%;_111sM OE %i9LIO3fXF^V7)vrҽsU>* uI^pRE+@DDgkEhŋ0z(|V^/v_;V9WF{o-fR0_$P9ko1wwsu<|K֧ԠNfzRu6Һe mIlشjsdfz 7nҐ`W]uMʛl>)`*wAlz=ސx mK׿ò+`Ufkg 8$b~J;?> r,JJYbF ~{^NxV0 ].'~~vJKJYn3f䟯亻xZ/ rftڕ",]o.fE1i5'YDDD>teݺu̟?ZYYY7nСCr(5٬'Lt!9;؄3!7=YBJJ4pݻuŋ :*'{ _ʙcGΪ5kزu+W\>k&N7dC=Ջ/mtGK `, ҸE [:,ADDDQj|tyE҂`%d%lbdw_+.zm_RR›o?4=  ׋PCHg0,jތg zdSOCիvm6o]HKK(_"c⋁lo.h)EDDDgcidHKKc19%.`aiSk&]DDD1e_LW`+z/B/Sy>< 4.fC3 l6+> `ՆjzzzmEDDD~bGOEXǂ6@DDDDDDEDDDDDDEDDDDDDEDDDDDD.('LUQ\VF/?xǎj% kjhYP````s6g`yڄ``iTW.&[|""""""X\;ڳ~zEDDDDDgAXDDDDDDEDDDDDDEDDDDDDM%""""""[x>}tzEDDDDDgAXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDYs'>Դ gMIiY@Lt$1kϸ,Mr2JҨpXVbh9*DDDDDXB_WrPyCIIߗ @L4Mj2Jr˱T$\!:='{&""""4 چ-;ﻟ{2ew?c֝zėygC-LFI/ '"""" "úMۘO8] ~NYdݦm5 /4iK.mDDDDDX!+E]a%&x;K^Dz032 (""""$,i셸N۬W]9KZ4!Rl`mz+'ex H\_SljZ#5qWvnA( Ƴl;y}\.7_YĽwLb'f?̿(ƶB΄X$p뒾`{ bL`_\}##;O=ijO!EIH~ٹ#%H*2=e2JrVoD\0={z,>d {S>7[Ҏl]vL&M#lՆ1ኡt2jϳ驾O[oku2+ѣ]`z ikB^O)=9ݼ^k+vk ,dumː|:m[l~̒˸N7f)$+>JJ썶ӡُAc/9 ;J: J}LR=O{xPYnмo<Љjؑ಍`޵Oρ .;lpWsȫY z/;ƻS=wN,pB|3tz=N0;k+{-da)gٌ #( Tr& ?#az[ ,K;Rξ>5sA{-^7it] F}duSNyd.fMNe(6(btX:^AYJ~/R)>n'_4=2ͣ"ؗrj8%*J=T23,GA}AI.^-1)_G앎ygcٱe44}ܣ_sp&{|D6Y"fi؄1?軹,{fUp-ku.ڋh*v0sQE~'q?jq\g3mv0ezuu0nu1sUyN}&4& EsWN0?,3KpBGfPIF~JMDD`pl:*^On~75h,YD3̓YDDDDD<(`ۯz1*C,;s9s >a1]n뼻%zm I+$=n+gko^]`]?XpGaa= .gMQɍn -."8~NVvɋ6 YMmi*"m f.=ĉ)ڹ':3iKk E~]q#L/y?~ǧqe(4Eo>LڹIu,=z<άwxߵQm%3-RHϜ˪o]5$o6OѱPz-{9_my$6SHi*vYXb݂RAi*%̷G{$Q>_o_%5fl-=Ȳ?ϼ z||=n N>~&zS.?Ff]_8yޮƥT:믾AMNt~}}m4i |%6)YPekY|U9_s{x^8fp n:Uo7l3 fcx\rUL#mBIz y,zsLߪ dž=ٿ[aIy6^ͦa.p z ?\<Զkf>TQ}ڞUM;s;/eaϘK_%{G7sUr2(VJtT+.Èlvm{15,M{aKD7(7V~Z4~se"g< kxL`:oLJkx}ѡGI ѽyD/Y"@EX/}~CCa[n`K6شކjQg ʂVt]xFrۻfˎl4ʠ[UDDDD G 4 =T׏iS};{,SYU ؽ/{_f!Y [6xύ6a-hު)Mbh}>!g@lưc{'oXOc\àd~9=Ն0bh:-iP^vhsrykm݂Znd1ٻ=ST`8_Q>fqI陵ITecOi|j'Z_,~6N2L$cUlw?s&:qtc |yd]O9ɬ7~gᆪ*>dB Pb`{kE]˪kッ]uQWA((-@f? Ds8'sgn{Ӫsdz|*-dμEYiҠ4Ǯ ꑕYΪp9+DZxb KZp:uإz[jW$I2R?Ǚw 0D{_剽v"| IDAT8h@]oʦtWMs٧m՜=hA:慒×tu3&CۡIC[O~"z3ػm˿ėy#i^Hld$IR|bܴ,Yu%?~|5nEVMç;e7^{sH{7Y4~3 n<t)CPN~$/mkmI$I2oxykdsr S-S`*>KQG.bN-?_~ɤks[?\4-5+hN+zsOͻ,I$IKW3xxki"ddlr'.yk'[yky굏8}YV:kz&oG;eq_U(aր,qo2*u<!)#zr@nuԌ~%I$8M/^}-64ۯ[ͻ>>}eJݸn\v!ˈQ2u6B+Ћ|:LߜWMZ/pi.C$I$tYSq";? @~^v-TGC^f'4Vl8n,}Gt0~Ϧ߰\ثI$I 'i['M5L>G}7vsAOr-_hC (aG\Ţ S^ ?oEx~P:~g$I$+nk,+`qaі} 㫙Y6k/cf3hw #rK785*.G[liWϾaV͟nKzRP{bQ8>~$ITiuklQlP#_rpT Y@aƞt˜ɗ36ս֝n:gW!i[83jCdmWrj٧.ԫJ"ŔXĬ2p-F.Jm[u[5HGfe1wfԌbc.xE6:7Mdu."D/On}!Z$I IˡlQPB1|<|1ߵb|9czgCdҳx!r(ylT%|Y:9#@ƾͫŔ-GWb˦0*N:;w aϯՊwr/=T]uޚu64$I'>]殫O҄t Yx@:Ę5!峪{b7 ጒb旰||^oQZD7;M˛2^VVT;am7c1PjrrfcqLN2t] J\rd-zeC%I$7R\|?z XRKWRW U_,獵1@tz4AI|JSWp؅g⢵\<> kZa],cy yz1BH@btk4:en{?`)Nv&O5\7Ck@wV!l-,Zz<{JCS̽;%I$(NzQXYx"ծFjңZ1_l\‘HN]~1ז2~F1:̚y, AMIH~22xBiMhD.9zjm}88xzmޜ:K1F N>Oox䕃`DyvtI$*((`ڵԬYCjj*IIIvd5Ly6{#FYͺtPzğ\&Nz:S@IMk_ɉόejθ}S@qI+Ġ'o~\3I$IpӮ];&ONi.}:6"8cqWp^T,?aQȷ04+{`YJ(fq]k囝2FX_+7զs90:F%Z{DP@i4mvcOoI$BQk׮va|gmgaF͚5ϨQ Ōeއr}gr|Ƽw]cBn),4UYkZˢX*F1,(n4G NGO;QVOXjjo$IRf-BG}Do:|_w\aXڍغw5Ƨ7.7wn\!V29G.Z%1hޮZ>c^`# UPB$I ;w#?SN[|fذa{dee~0*mFS~h**bv&٥o7ćZMfV׫K$'$I!8++://:+UdQ`LϬvMkj"U@,I/>_w<#x C^{v,hqրe?KOgom$ISNys^zЫWԩcABhtTtKfP'LY&i@ A| swL,(h,M^{m6o>zMs\۪֮yΦڒ$Ivܿ233իz"33SL5O6 xcļm[ww- (`cwn)xcӷx7/bm~˄n"sc3`V\dů |Vǽ%IJ*;;AIff& 2* XQ?u}¢׍㉫%i[5! ܐOjǿBpk[jK`ZС{9 ek {Cߏ>o]XT7~7Ԣ.>3Ĵ1JX;cj<Ԉ," n,/? ӚyK$I034Bh:lzQ:+e]AƦQY-hJ{cZeĭ|ozs .˞k[%,%nQֻ\$I ;m&673DIN~wruAqFC5^{7oy.Ƕ݅I DKHzdڧ,Hcn}Fm9ڣh-+j(cCo>fX${yKCRˏ!uٔ9m_ ["ITטS%I$ 8x̛?!X*$I aMn.Ǐuڴi=/_V%T`I$I~$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$Id$I$,I$IX$I?V>/}U$IJN ;cI$I*@K$Iv j p<ߒ$I%mmށljb%I$I'A@(*;W!7())Ҳג$I! D"D"BPR?bbi/¬`I$I* vM>1+b,BUd}5<$I$ULթ%|[,ϗxuj!I$F-yu*$I$/ԋSx$I$%I$I2K$Id$I$,I$IXRoһqq/~_^z=^oK$I;E&@faqbh8N^~Ic^ S6C<3CG/ypM/\ }gn{ ~geZ ѽQodI$ 02zPF"4*#?3)͑z=߮rܠ4΢R/,aU DUAY׳,O/LKgtxsL.{rDFSK>df$k+_x5Om#~~ήeCnWmsOMMه^rOsi3a6]h[^b|71ssXW!1!M!}%|6t-oā0)iD֋0-КuA| ϟv sj߯Iqp^~m|Dh/۹1a\s |Y&[عXߵ|约^;Ϟˇ3M*Yui1sNgo"gZHȢfC8#}+KndžfsmOP=Hӯu踃]\1kokxb&dFY׼Sk'gQ8,Id֎73L"qM̧_BMeJ yKXJ$HI"#)H(HEAjҲ$ ew:#jn;7(h RV3{XM:n_ۇ qb$'gy 7L"PMPL>,bU $f5 ;f*]u+o-)4&p>zɎCtN?/3K#Tߥ%T+%g|3yLhzdZ6߯CJ@Q7EoIKO9^dgKG%䕳o1vwrߋ YV IDAT݅) rxm!,)U s߿ɝ25Aބ#k1ٕ끶d.ېJkOpN/F?Ҡ>A׾ȿykvK!v0J$ MgsPM59c$.޴޶,ԗ"ap^rRo]] ҁH,k'8Nk^I QnGʼn)~<${3mlH\7(aE'J#V]jÂOb:߁}۷n*\8O?7>(I \pytL _okM:KGv®d_p%8jMإΪ 4љ 9zDLxUġ$son"/aIS9S7:?M*{j[9OZ,iQ^SI}e7z5@ibz>tgt$IX$[*ae!?8h.&ۿ*A8Jĝ,}ЏK3z?هsc3x4-Fa8q"$edl75!yE[Wv}~zAS%X~?ߏep_4?o?q&9 gew2x!8.'h.?OϽ3ޫ1nMY[Ȫ`?"ҲSOI!u;BzApjg}jY}6%%yI."y1jSy1X :w=/dmtBiqDSҩn19EqH(ΞcEEbyX[.:%Id֎fȂZ<(Zzm沦y5KNF`e VXV2@,!QRSrWt&)7qy,n2 ㏿a޴wx`qt_\.Ħv^|KIr1': 6~?n㱳,zzN.;(yy\͊l}!g$ni9%#*r)/mXWDj$7o̟@j}TЃ:Y\`_vw^(ڽ CյlB(b$Iک,_(3s-o@J+JN <{`PRĨE-֬#"?w^`,U1t}U:}>w( ٻiU} .ư.ujE(nE\jBmvHCo k[櫲,Y+GSצ#ϻۗa/^WMrq<(%[spB>y }Gs|ImTtxb) Q]I3o@>+lgq2ۭͷ&aYiXޝX$|'V''؆鲲yW&/Κ~rc_}v:*9nnw,((&w7|pӋ Z]3)2%yyImI$U> )hI4IS2|qO.``:U6+唴00Ocl 'OauS8}8ڜq*'a‚|PR@^ &ԦYo'7d[XK7szF7r]42Q%x犳(iykXVPLiЈ$D>瑚uEZrfXC,"5$}^{$5:ޗ{Is#\-Gwc._Ż(/<^O^yFs\.RZйunKO>s=`}IS/.sgᴗʾS h{etƽ~5yzsqe2=/<M8.`Idڊ9SO  ITՐq9-l/c/`5+P5!sg礕$I*A|RRIHH -ku8~^M6eU"XN8ɇtsU$I2&Să&껜*I$ X$I$$I$I`I$I ^j؋Sx$I$3lf$I* ; Y-"DƬ UUO5BA%I$wXz.ii$I$6l*I$I2K$Id$I$lWB$I x qz(JH$IRAY3QI$ITu(R85}zI$IRe+ݔ bD$IT T$I$Ri$I$I;$I$,I$IX$I$$I$IK"$I=65l.V[`I$I~8ӧOcaPXXhT0deeҸqCVl-I$iiSyY`᷂*,,dL6ک5$I~Vi,hnt|0YYL<'/b) 1&M - $Ib˗-A] TfV+bX$I،5- l)(( X$Id$I$,I$IX$I$$I$U}8^4K c'8%Wc6q"TِzŵZ%9 >ξ;6;V$IYe}%?ryB7iaASǎS3_Wy} nmIYۦdFJ-fY|H|wW)!4g#zJ$//N2՞}sb/bŤIL/Ѽ=-@ىz?u "x>yyN_gR)6R[p-ɽ(&}>=QηK3{rHF8ڋ8!;p\wc|Ho>O9&{b]J&peܴ_]"ە<61׉ɏ͈e1w:{/loWk﹂3ʪ ~ȃ}>bU$֦gsy7E t3՛/bš8Bƭ89C04ĩR!{<+Qm$I,}=/ۦDhxuܻ4< :#/eĚm&Ny>~f}[JzWb7}8Lt%3/-SbLjx ?IV|:ˋWbΧpyh (^ybrυ\4d: ş/`?O~W2pZv}U֭&7G-Z $M=F!! mWI^]#NKuH'Z%gɐ| lv0G6Bx 嚛^+S5=vN$MBx>" n8Z-œ7>Πgu9N\gW-$IR0=_Q]H0IlF&n?]ڂSڇqȯՁO|slHGϰ4<.d#XєagpmLZޚ]b-(-w+cMh$Z?t75.{Y.u;O}!9j%ΥUco9LѝJi5eA;JIɔwEW& OI'Ԝpq%h/w2kq[]İyDv9x,R:g%I@$I+B'NׄPa:' 1t)|>}=k̉MmѡS 6՛raphD~:\vϕ"cOO/ޛ~昫?}熨ڡ+G7>8lYqJs:}?PJz|6C~>OQT\LQAP͟4cP&3>~|STRVE=E 2ٵ~U׬,VeMkԥF"EyRIJye rÞش…()r07\8Z uQZwoKa BJAÖ98i@$IN^l-8,}>~SJ9h&ĩխ ~_ܙL/נ W/KlȞ|6+)c^/FuZvlFfBAU]Fp#2:mO.L:W[nxwWnhU6<|+1}tݘ˾ ) 锍P} \2iwNpWknp>XHv5/6܇`n ^z.W+ɀ`$IF6z硝7FȸXλڬbb/R6;-ksy3Vkĉ;~Ph<(Jۍ.L]kn($3ܣǼYBⶾHuK8`Z^4lN˔%1~YZ?6"^ys01G\Չ&WS)8I~$ITZH:xfԇ~[Bڡl-?X'ް ͒f.-.*#Dx\.,4Z!D0oU"f| c,2) Ir3oJju{Cȝ3rSH/g/r>]B~/0ǹ9;>su|vM RDf՝kE2awM("TT$M& )oH]9SB;뉗:kjIi{}ƷO^w$-0r[qe]i /BKQ7;~wIu| WJȟ[x!O$I$i'Ke9k,I$I}9$I$,I$IX$I$$I$I`I$I \0LMB" z @+;XP@ޱbW, "HP')Grxo̡!Ĭǟũ Y&:6m/+#a\p|\ȗwO0C }[ɌNgShiOq:ɸV@r˹jFϲMuA ?Ǔgd[>Aڴ:RFr{iDp6bZXaԅl)"2NKTd}*]ސ?eŹvt ŤN)*k\N I/I$i_Kf>/ǒ89"o1/| 7`;#n}36cRckċ:fڥͽ/ w0c3<>)|?G X4|O9LKlu$I$gO/_|UnEh(*]3zҏSyU9kSJסqUɞ=%:^zNRڱGQZP\2qT!tz(M8h K\4Dkʉ Y0maб6@DæTjǴ!5 EiZ9[vv, ;llj9"w4M 2r2g3B RC7@btYYaBxB)ϡ; _G$IQne5/eeHFBej$w +WXjDj~889b*!uzykQ|x DZk Rknl6#ޝƼ%aȦ?wqt ;_qhlR̮GG›X1‘q_>5 -kؐ7w[ PT1ae8)|z ΛU5Ehפn#I$I?.Pr(+L/hl=ròrcw4)=ڷ~q蟧Y4{Jշ|j+~u&{'r9(Chؓ\O_}hOՑ2yF;Խ$Izً”i8i8CrvWen;G]r;Eeod͖]XeBx vPSC,) ]Nw IDATMqL{Qdnr.Ɋ~q-y TLna˖}lrcP9ﺻy03$I${Siz+u%ܼhW67_|ܾ7_͇MoW]D >ym*!j ޘIT*?1<=n>r؜1T\ןgŽn͓p2POzg5g,]v#  (ܰY6X(oA~A="sW=M% l/S $I${)_L<^WȮk__q!gw/FuƫNŚOR.sRXt=\z=5^sSR@ZS.7IQԽfn7_i{qtJN/iŷǸڹ?TןMð/$I$I{SNXr%?hqq1dg8t'+8~xm/_͑F$ILsTqB!""}234͚5]wH{%I$I2X$It@r6Av]X$Ip$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$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$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$IkE O"&$I$Io$I/K:#8)6 I$Iۧ?7p;I$IҾ3..v#$I}ox~W$I zy$I$I$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I=.j\ 8qf[Tp]~]krK$IHCP.: g%qސA˷)$Idkx"[ *;r h_2M1<YAfHƭhŜT1IOiD2:Έ j)#Ҡ[_ш2le+/2,ޔOdT?'7_tU"'=IAr yY$RU+k^Oq%8<} VJD}9֤pYGP%o3^z!Kk3p0hrn۝32/$I$ =%yLcR)$V.IĴ`mGuS[C BY_0n \u-k DUjǷvBZLjWjM}nꭙ/cğ[̨ɉG#)S~>4/o;69}!-]#W} 57xc 86tK-e$I$x|%v12i ؾn H:OtkZѶ8Ҿ|5jsrjϺ~ :blI`Qn쪵ia(FH>Y+w#f] mjѩMe|?aRIkN|2H$IKh|8ct[ (n{?s[bYuv2Djj\4  e¥L|'>_1a 5LԮ 'Dx\ IYb~ LO&ĭ+~{[z| bաnKәg?uW c{B|ú= $I:P4TWjvF1ߡ>űQtoW,;B}&xrgNa\:ga֒$Ұju$I$Dٓ Sx`TZ]֘￁G/p$p1­㱾E<7<ؗl\rt-^3?ޱ3R6VspW8j]y%?ǰq/LJiKwpʵ;#ꙏa."Jm75#L= $I :uN._+W0igOVV]&Fe2E~ gs;ں5I$IگV=wm4k :wu[lT%I$IX$It@r{E.cg9$Ip$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$ׂ$I$~@͙ݢ$I$i/QQAQADR $IpDDDr3ܢ$I$i}{e?;x@$I.8,I$I{y$I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$$I$$I$>,}2N;;}-t0$IY~d㟺i<|FW:\OyᲾ} d)U<5kG ϠilbDznJ$nSڝs.=< 3/O|=3ޏlL敉NG#IFw $iO|Ϝ̭=Ėƍͥ[)[&u£ xl*[(ơ#ش:^ڹi |rm`#G+r1sL[㝏r_ĿA5:c5Lyi$6+SX9o@^jeס$IC NW3A: 8"F [Dj:V'ĜAw0p,^j-mO:Q7}+r$Ԧi^\վ6ɬ)E6=ZPoÞ㕩 I/"FN%jƺi\O gwXrxoj<5G KQ3Sh)#yl,ؔCaR* u}G_N)Wr33_ΤS*utķuZ>YX;^T -$VaQx=5=#W=H$ ǓLό"wiޒ$>-K#38<+4:Lx_OFR-+Ӌ\￟kY69}K7P_Gv' xkjqbLma: SCĈG1줃 k;yjBENe|ĝ41Fsϐ,)KgpBD^ۣ0oR ۞Wv-3~LSpJRį^-_NI\DY|}ݙV,y}c6Z;Go`NY›=a!"kF_r.gD8:D[}<]X?nXSnB0ы@n/ 1եѴ0/mAipէ+hگg\VJ$/eK/i~T*7Oۂ f0P \S^_r./}[cg9px/ggl$#j[cP6fg(7`Kn<6;н\p|+w'j Vrֈ_֗!+K^Gn1Ӂfah}_??ggҶAneH.@@?z=p7KL55V-aj41lMfNQ)jw;ZQZF+wۣ=; i DQS945nG2jև,2SHCar RKCno'ي.1:b*awI-ʜȻaن<j$/GGJǛy;#zNB2F?˳Qyd*|W5mNhA' (<Gl]uԨ+ j5$5#VJc)PfFDQ~͝Qz2 r]:+ m}]&wX `q9ݚE8L٤B cĹ=Y\rlzq<0Q:;wօ2SI%AY.W*}pń%Ǘ#ge+ہ B>L4؞u[F|׸$I{JJ# 2 ,yQi#iNsV)Mcؒ <ޏv0  +Go2xr;I'`38ӿ㣹غsd<G䖵l;MqrJ7d \'$-7o Qe]r?ۣ]joXU>K͞Ǣ2a޷|ϧ0)'.˔C/2oUă- d"(*ERݫ7=\)eܲz|׏sP6}Vkb+sԘ"+Q˹8  CO( nNI:EDZ4+C`^fivӢ"N/Vń| d~ AY%5$0mEѕij9sTn4~8_~Gλq*߃#n& r)U/>d;2TW_oe*SĎՉfaӽwޜ.æIH1%rMq񍱬mwW}o 8]5㕩0q5>_%-LɎC*Coc~{5ϼg^H:n?_-wnwpkosiG_=/siyP>yfrΠ'877+x+$Ila-,=T>/Gi~\|̇\;a Os2o d?Ǩo2tBqe)ةݿ3~XSNXr%?hqq1dg8tPaiqevplH$@:Ϙr# ۖYrOOӬY3NumQ$I$I~$Ip$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$+DžZxkV$IndI$IҿhI$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I:E9m}g4+W"77$VTJ<|WkrDe~w 0geL?En}n/=]2~УY[99$IWݵC96y/~Vt1iQ3!wOِRZa84O<݆V1$d }+ҫOdSh. ȚG^-D#._8}2m3{4s6Y'/ᝯָH$b1ѳ{֌`Mc[: C&sewM3V-_O|*d3WHG{Ы7=;9le6PJu|)w;/] FZ͖#/k_h&W't^t#O^L;O%xω̜ɳæwv/:e˖e?#rm`ݔ cN?B(jLzGy^輦ݦ[$IQ%IOF.s:'ać锯Y4Y㑷VQ.49b'*m;/_\(odTWʒY$իN !jיKsϠiky9m%*&ըHP1a^O|{aPsFI  ׍"(_na@Gz>.}GK6Y9g6MzO4H޼ /qd˓H>7rc:$/!-qq>VyVQ0>*M`z&]OOf-^[wYl5@Jxڜ|~}0=xvܟ3TOwpKgDx% FPfE~y9fv#,Kjd" vNr~1\, ːgn GSQ[]2t)\+V`-..:ǘѮ 7u!*_0/tNa)|lUن)˾vړ: /nL_˒ZWLU㸼vGyx䕴cgmm94)%I::`t<1GG(""?x[f&}ݟYfֹbst)ʉz:E% ({-ܖgp֝wb өۢ) [}1&pH.劓QRi"7/gЇ jѩ%ӅrIv =6yſYB@U|1V>g=ؠ20w܋,65ߎgYQ#1  nД#њͣo(7v ɞ< LA\ӧ'7Lb8m3v|YD$@HYaHi7OK­5kr[I_jOi, S]N)$q·0qԸn 3bUC;(*xdOWԶݐ!Rz_ÍǖcիpC#xkJdin #H*w;'?_̚lt& ywBx_ΐOEWFH_Ƣ"8J*ϊi?Fz4&/{jddepx$Iӓ3vᖶ'r[lkV-A^r5j&EPr҂0v:. VjGp,]wѧI '=}#ek<5u)Bl)|5]U@"CҙLj"iT 4!oܣ٠$ sW(֯5-CnR&/A*@4Mn`Ǣ)<{ \D=91e<͐/7PXkڕMk̅ QVɸ0h0o(d'qX$*VhNSf"\8_\Tu#a~j_cc8hU>$rlr &Oe]'e%IiZ:nz֗"tIQtUդo-&FMVO&MjrPx_}W'VB˾tx}*Q7G2停U1ɧb ϼ<ϝ׌FOK?eRS1LO2W]zŸ3\UuK R#5odꢒѴV%ؾ9O4MMLd*K&G~a #ԼaF9J ?(,H 1f>W "1:ٜTCrLeVQ'W!&?(25+E5,,xY۔ 7s}rbH$=~l-O# 4 zrB(),}0)(j7Ad3ozbB!෣:>r270} hO,e3a"~x.9z)~{>+ e+6erKNt)- R]j{!U*hY5-fa!@at-F²,*scWPU#`$^|-38GL(yX~(~w9ߏKFPr܊ӾA$,wd/I}jmj$|3E y|٩5Pb1k0Pᒏ&uOTN|$/X'$I}ZqPcn}EK`[cѶu9X3/RGb(MصOR,eۜ7\MP =ȠD-\Ē8~Vn[SS>%?,cm,:U7wbI L"R%!YSGpmm(29 X}95RH/X=8jמ ˟񡀜w!TAJצiIK'VNP@4a6Mgơ3s6?- sDl]Ee|,R:r͹>xQ0,_Yy'q\󸾨GNj>}+6XX0UR X|B}.`lZP@dQ?X'$I2@>+f"uSڴkLtx+|gF1(L&4i `iA6f֒4πcqZCٚ6JN5_fh}"{q]y5_ ^N>0i$r Gq!GS9߾͢0eNkos1yYl\2 LahjsG%ܴ|sCuҮy+7출,K?jm΂l vEr|169K&qIыY |i|~7ЭYKGNg328bm{*}vsCz˹f g;ծocΫOčIJGGrZ ix視< JS3)d}AԒ+KKImzb6y ^\$K{?`]BTq^$Ǽ$u= $aT ~>A$Iy$aEJμ{$I;`IӿX~y$I^=$I$X$I$X$I$X$I$X$I$XJ9$^-8$^-gt H{$Xٺ7z uգTxD@RԭWn#[r@}HC ZlI-I$/r$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$oE9+_?IdK[\\̘g!c ;0ZtRxuN}F$I(==֧?%֧{u^0bƐ$i`i/ . m6qHz?6oB0_-Ӟv/$I K{i@Z9WR(((p$I= h\"vK^$g~gI>%I,I$I,I$I,I$I2%D=Q< L~44x{ߎ%9Lh z>?OEŢ[" ~%N"%kkDYKV+szGƐlPЯu=Mm.X^#?>OSs8 ܜCo,44shؠm_n(Q%""`N9̷æ,ܑ =_'ܹi6$lzަqnkue4Q3d;٧(rOިU |4n ${ʵ}gK;r6x*=m#8[-?@d ߂J=3m,aO6ӦoCf|w_Jxŏ|s{s̛-i_܍[FblD&ŗ>< v{Ӷp2ؓAOBT}} ?[ĺxox9W"j|;=i6_\èרض)Orq,>ZqAoԇ`ҥtԉYfYfѡ}{-[B<,Xݨѵ;ŽӤZA*r469I,@O-K J\8Sӏn l`Ɋ܍N8s`,9 ךSt);RlX:`x [.d],)^[=M8ΰt /"04pV̐r_M)62wYtY'tᗽ8ě<0qxi(~qWEqՀ\iд,MjP%}hemDNT;7]VYjT^Pr.5ڑtYRQjٳ>}G޽&7nٚ7C`ggҥ  "55>Cڴi1IDDDXDrSx{~J6WR(~+#_FJ+-zᭆSFLeU*rqO7oyVzΰ^->d~tJ}/܀1 ۚ l{!;Yyd'Kg^wN'Ϝ9Ν;oЦMfΜ $""",Dj{*-iϓؐ^:XBس,wbmWn' 9OZ+~NWl[ްoFPcu)AvŁ{ L×Eo/.GӰ3W|q?G2I/O1< _B- Ȭ$HתNZ#y,۞ KDDDD-"9W.  |=g^yˑ7,$*{*p9sq=^ヒ7c3ѕ&LHPnLZ/tSr8 ~IO{*2D2[Q9eӥߍ]HSG}q⋥GH.UFN~H3ٮz.|u}/ưF8ϗc'2&8֪-6|V+:^faW,^u).q$"""2Zli%<" J333Z$&&a3AM,z%Dn yS|ruu@{k-U t8~ǸIh1|#wYNފVc4j'ld26.oJv|o>{C]Ez$"\*H."XK>ߎ^þ@E^oW^,I ΜÝ_DǨ&gyg7DDDDj``yYgH?uL u`y 0 p_p$:DMcnx|ȿN%21L:!"Y9Lvv*<(a`6i[i|+$FCF#fg^|RolV <l1qsEDzhV1dfd8"g&;;pqq=``yd2舝.ndfd`Thglb6c2EDDEa`~Z;Agf=XƁlr1ױr9 e~sdy{⹭]i vT"M+գO[K?P ^|x|u;y|fX""" "򐘈` z[Rңgn/8.JIfGѧpk0k1`coo'mdAt9(mYwދTވ"i<˴L?l6&{uQ?pS__ Rm>w°]f7hqrjμvilIc)XN\ṯK/&0,;USqJ4[ĐxaLxF\0o/ { VNԫSͷk<v}㱫>ᕍ `6 e˖th{\oL_YnÇ-&0'al/ <1'lżCihbVZx/޹'ع?"Ns(юV-~"G-`Ìc ڣYU(qx,?f㒒JbY [(3  Pњ=n=@˙>m>׼5yfyϏZEDDDESqςo{ 3t,/Uf{AYmy'ـ,sC}ڵȧ IDAT0:U%tc4Uht-AAN;Xo.WZưb>T; %%;-cQ@H5h2y:aJ#43+{'djAZLX/.eV.','SnK D{j8n!+[QkKc4JinK/aA$JCOR$~˦p.g|ķE~rW+bg'JO/Ҋ_?3ouM togtZfDH p?OS@"E`A ?Zw%tթh;hWl/+װ?f.֒Q1^Mviqѕ^-cumF̡ɯ&N ڮLB\!=TxaQ?jVE2y b 4̕DU)x hn<@j*1Yw"V=KǞq6]}pMqOd}J P;m`3 ̗LXxճqjG`5~EDDDE'oa̺`j\7\~Spp̞\fؚ AZrv#N"p<~5-o麛~vA:|gb1W)<a2ɷS}!鲀-jҹY\Ym zuomƎb: ߘTGWƸ奥8> ޡ$ @&YlP(PϻEۇt4OΒĬ6ǧ6O#fJnC$~B)\黙+6ݮ ^\5$ ]M:Y9֥fN #€t&_kx\_a]JbYz ԸksE8g04g#ODf,i3V 1ĤZ0Kj&}NB 0YO•"~ Ӯf=/#|/ڛպơdEDDD"=)^F^ %t|d+/6i1>cse#EDDDe˖6Oo_#"ꡯ433Jbb8ĢWBDCd{?-""""_iNٌ;{R:߸Phy< k+p ݨXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDED٭"(*ȣt}s!oÉȸ*Gذ?`RikmpcYT9fHyNVqOY5,?MO0oGCW캐0r#VsYN̦Ѽ2?Ulz(Ƚ h+Oro_\iZƍ wj{˝Ƿɗzu=RkNٜ~}k\G\36Ju>6j*[یϯd42V.2KTv߭!d:DXy;1dpkJo}3cF0D|t(1&h;bm8 h?azeTkbΩd[zr6b.F~z;$<އUq!=Q"`)yoː)ii.|x/0)ӤX*tbH3[N/hߩ=9kvDD9QQL"SH5,n*㻕ź}vX Z͋ xwNܓ^ D̚DX y|>` e1ˇB$|?hG?xCzTw`캘O`ʜXg6^F҅R=e5Q+vٟLdq|tCJǰn,v}3rA ,n8șY!G|a c]ϧϣx%f1-:16ƸiS/;fa@F|ǛiJBfσ9aN<7&~ E<}g0{A=s1{TM'r>(""""B-"/|vkmޞ;ˠzs!>SizLkfW\(1i7ΜHJV(W 3-#jK*Dž# Y lj |N+܊2aS Lpa9S(Rqf -3ñ+b֧݄|iӨ~~ NHjɆK9o@{%t7[/f־JXp-_A:V/]IMNy1oogB"&`XnLf,s$&ZI}^{}ۭdx5 θ>%{Y},ƍȪEUL1d-Tc"""",,GZ?;uL1c̩3X9֦TeԡX;]'/?|LVLZ޸ҪkÂ$ϏG<ըO Ǎ޺ )P685g P{w].1.·D^q7 \ov;Hj١ԃ _ |q:WWc͎֦(NYsQK4ۂ{ϙfe=lvٟ/d7->%D?[J%y9[ ſݷ8_Eq;;q XIHJ6&pcaʷu|vYߝRp|rxfcIb/෱pQRoL4ٖGB'fp\;DZsYmœEhDO/@!{[vmYI~,D5ywG.]>aݕ\ %YBR^UFSXq.aǘwy{IgBĭY1++cؚUI$; -@j$"""g,opb|Rim Q,{MțDV9'>k85` v]z2u#eUsjV.[FZyjW8ޢI˿6SL5ܾşaAؠ3ytv~9'^䭁.黩] x8O'ME`ɉ\ $TMG]EtRUQ}*P#_㊡zHΤ."9XtḪIK9""""3X1K towlFMM"""","9ZǶ-bdȗ|""""" "SXIM`-7:"""","9r(N<EDDDDrw̫–="i*(HNMh"U ɁZD"3yPjQ,I^y 36ω-,W.bՐ:w,"""" "(2SfL-vZjLgrx|ߕa)F3{BV̛EDDDDXD8įfhR}o;~͋Jӷ^$`f\odߵU{4{aעe(_,i*H˪wo߬#K&ZDDD1@_dLtDXz: 0Hܼo,-6-s[Jg`*yq<8ORȸn/ B0GߜɌK1 3?fot$)[9-po>,K>(]5̿~i߾nT_J>&67GBYv- زTߑiqlՉNhxh 6Xp ^L`pEq<>NHeht4%j9z}zʀ4~EDDD,"WRYs{~p-Z+`;kg.fB"4"YDDD1`yହѠf)< ȸzM;R&%6D7E^nsYcG`Sfӽ}U^: Sv?OMG_&<. R2B0j.η/ k̀~B}R3yR'I=sЇɹ|5O '×, `UXDDD$R +>Y7VC,XHn،؞&ݡ#ʥ+UBDDDDXDYךo$ͭ T]y?lmoVp8œ*2lh9WPr0L\?wbUv eAʟoW9J1 C/=:Q7kDɻWs[wAW3FKkQ1/b^n,Ֆˬ%eնzV oi&ΕA%XL[BIÌ[Ӿ][$+v'ӤAODϠ3zcJ "+2aק3*L8Hiw-cWR*'4|i>d=*qh|v;Tc|p.eSX9?4}y DU(֍iZ5GhسUc0kNE'v.PcB3yw6lviX?{.F~c:]_mE|V*D^)$u6d΄*T1|+?ykoWbn̗S6T]%ud`ʤDyJ5|[q:o&8r"6i]XDDDEDT5̿~i=aB`7Zppog%Djt {2u1 O֧w{q_LAכ0,ɸYvDVTc圸%i{MȚܘa [Lj0^9O\;Fkۏ6ټJ6T)M>AjT539vK)yz7A8-""","rPe~R<ȓ=uۺ=I;hv>DZټlvv3bRVߠU4n!#Vv\ #^{ kB"VҏҸ 3H[NDDDDXD>Ösd%b{xwᑛ.-f v{vIKK zWBm{{2y(Y =Uj"%+R>^) |cj;i2 61T,x_4@`ӛSשue.O{tER/sbŏ|:eg3zVC/+ɪȖu`U!rʚc88> :g-N+tErb 4߬`FOË>ٿzZ!6`a=-{3k"VMW.`Ù"Og*ʜ=iCyqLKp]3sg,ҎoWQ&)\:ޮ5+8PMqtw{/}ɒa#f ٟCȴZ _f+Q'2eD,"""9ZE/ryT&XOXz錬ϛhV,\#(CwУznZsv}j0w( ]I9ɶd=b>_ƣqo>~hvL ^c-\1l\ޝѯ5dn~]i@:x[-פ-m۠t`!L iLl+Ԙ~c?cWf+WMcĥ z? _.dOwW -d Y{.d&ϋo2uY⧥-фzN]EDD$GQ e0[JѾV~ʨِ,@o:T=3t2.i4o$WZ,+U,ZDf}sdnԊL\B]i)Oْ~ۙX*8ÞeneF“)>n\îB<ݱ2aYxGvk)h)SYAlVq`~p|tqlw{z7A8wڊal\K^37&Ѫiq+CnzaWUq!;NeDDDDE䱓ixՀ㡜HҀyq/F (_/nInx4Pub]#pum}p2?y)~0=FM-yfqr*wu89ך;ՈХ厛.5xct `qQ°%`]|jΑ)-$EDDDXD,ӭ1tX᷃IT h4wr~fi-^c0\,  LmD^ qd\lͲ/Plm=K)@-w&k1׸ܘҵ {\:P P? }C <%;3vP})PcڅrgZ8|̷!+W3!5t̡($,y-Ѭ]SJԫ+ bJk|u!q%d&K%Toi!t,yDNwW!PuڵiLDbآY1f ?&_oxɽǬkwQ*%l?y2?k%dO, OqGGײy0.xhLƷy'zlOҹt܍v_ۙQyӥ/=]/)1~!*к+ԺaMbFReT.KnXbIj>Ԇ-Ms;5_Lz]sXz* xt_P. F˖-m޾GD!xC_iff&V$:lq&Em<ծpVu`U~ _UADD뢅*<6:N#v..ΘfLߦuE<*Um7s7,""""""`y,$X"c-SDDDDQ c ^&Y*(HΔj/ީ.6CE`ɁbGD&X\pQ˖NJ"""","9+W0ur """","9#s=ɟ~"xdk\UaQD3:%#_O}!$("""","9 3|=c6EDDDDru'JjT.)ii""""3 ~xsҸ/E|!T4XDDDDDD j!UÊ- p^+x^,CLCDDDD6,CDp&.M"""""Y%``````F!Uâ-(z(P1l@0)1+T`dhBDDDDN3"""""","""""","""""","""""","""""",""""""2H"0'ggTGZD?*U`GXT}W,k߱ ""jQk=w!dI\TG %K2w "/1"5jPF BDDDDoR ((((((((ȿ*ۻ(l6 !-@E jԶjj֫ZOVxpz*wAn&$B $<\ݙwF>gߙـH$¡i8$IjluqC F0m,I$I qN IH0;~#h3{sKcK$IR58Kc9%h4ZcgjU3 4HsuL\_YZ&I$IšipBN*h!!!H-+,N<,$I$UH3xk p<: C0$Ij"]ݶ XSA$I%>P$IT3DI$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I^E0cI$IRa!x|cI$IR D"aX##ȍqbXʪ?K$IH$BBBh4J4%DjdJ***P^̸%+\΄Ea$ITMNd@V HoCtw4<7s)h̭D:Ya$ITMV\n w4EH]jd@71x =23"HW$Iu{$mحbdGWVWS$IjW!^xy x<΄EJ$IR5ײN$I$/E+yk:VnsOUcpj\ڤYD$I?Z3 WjXX0Ɩ'9 $Ij{ K[׸wj$I$XYީag$I `I$I `I$I `I$I `I$I `Hu=/N?!-Pܗccx{i.I$$>J>O;D/=cM8+7~'^یۛɐ&&JX[q>E[x{$Z3:9+׬݆lTNoaR{n*˒3bСފ9$-I$%^IUg0yqHJ̤]\Nlq:O26ALnw2,+̣,1uryݖem9AE]GaB&G{ t(^;yqxb6"g  CC4Ҿ^NXL+PF1 plAЖ.N䖢&ͩn^@LmVdM[/dSN B$BzRmXf?&%ܳ;Hp3oby>5^Q :pU?cX/foÕx/3u^պ }r紫Ǥpgn}rg+>Hغ13(NN.s:^tX@G0s&BfV69zqoa?f񻑌\ߚK~}n߈(-FT*&=:z9-aߟO]ls v7ydѿExH$HM621(# [&ej)}h$xkn~%QҁUi*Nja?ΧxxN]x)W^I->}[^ΙO{9{/QaVs^pL`&]$W~e56)~zӳ"T|Wz/?[~eݑ7smb`:(W|f]N&s(s%8:&&_;~5_V)?mHd:޹Y&/_L$I Jjí/#~as3ᕟ_TO vq~GtN`Ԛ,LSV'>{Llڌ6ɐ&nSSv Ѱ{2l2CU7kqwOnL3By)ٷ" (eG+ xz$eFrBoqO_Ĵ$u8dz{ͯCӰpL!>1 $CB9әQRvy<18+$64)gW,gc$~rV:òt没ɜc9k/XŔ_) lVOBޜ]O_l8Ws9{6t(@4w| YN}wl 1\KmmJ$,o%ٸ xU< X9,!&ܿ}xR8&=dKjцJh2#h1W$MeB3Dm^Ȅ?o{9nh}:w֔eטSپ/̤8;~e66JkK m 1˾8e7a|X/W%L[09]KɎڰ*oa{s]'XŖϙy+kc|Zcꛒҏ^{>bSѨ M"1yuk +re+Ž{!>3-;:蓷xcXϜ{[[sZ/md~7T6v4K۟99woYZSa?ڭ+k&4nLzKg$IR ;6[[ *.ɕŬȟͫK?X\M~|9WA25ʁXV+zTDqFqgۨ5_xÔE(U]K:m KٞBFfvxdc`ul,(8%#˥%IQFZZ*D"IE[|3>Qݎ|x<7mBM=$I$IKCڎ^[>F8/? =$I$k0 /)|7=>Җgrh I$IV `3wpè7tE!ACh۶b?Wn-^$I$}M͚W+ JvRnv#=]ҍ$$I[ޟGzz:)))fRJB JJf'5gภ.9o*= cg-a֐f=u#NWO-̃aƚG|uS4e! 6=>EphjT0+knY~eedM,Sڡ-Y< sKwEzѬyX!yh{m#h^uK)fݮ;}^=%IZnftq;o<_ 7`~E::1%Xi;L_P7;nw.%GuoG{.f!/vlyd%TR~b!67&~j@ټV8$77XפҢY:,z^Zzq|6Nnn>??ʴXT?qOYԆzqYl7n{eG$IT\~deeѷo_fΜ9s&}%''gԬ}a_gqF4߆0Zv31SYx~6*1wWӯnf>5Ma{o3p^O#k6,zkn}[qěc?HtWoI4z7gVe!qPlkʏn. +xʛyp+s ۛ.C|1\uoe&] M?얽ٝH*_Eŝe ;u2:WQxf$ITkdgg3azM~?~<]vۯ_?rrr?~<d`͟Ϗù X*nFgg`oos]J)EGz1u8?<|עvΝ;:6yj 2Y$IrrrƍG{|0`|k *-ҡwU4؇5%l|5f)ERSI7e65%}KK _˯x&711 MM5܉;NU}<g3u:Jc/y)tc8odٌ,1ԡODZ$ITk#N3`̘1Ky4h 64~k[1{VV6ɇD?X~[9 l!ZZJ1UQR3HܗHj [} 706Fb3ԏͻdFn:vcɒ,3I|F޴ǹңG$IT#w 0^zO>I&1drss}TnY>{1O>½v#2|B V7h@N |>[vpn/2a_o֊r"@I֭ݺuhr ?9 |57Tu88}MN8(_Ŭ/ W1~2_t- زУX$I7n̄ 嬳bҤIL4:kW6n؁5p[yhik~t}$RYϦm1.t9AM>fڥ_ )~OĞG'$I$im@fDobࡻ׉5.В$It:[[DI$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I>CL}{B$ITĞG'$I$铗-I$I:($I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$Ifںal߾xK__`I$I\;$~3Ww:\󿸈ZHqn}$ 0?sҲoeF͔)S,K4jfYrsU-p!U[zg,uQ:?>&IzԩS;f5l0dZpRRN n~cLh^ҥ_e6woPSToN2PczlKBGkAp^^c^ӧO)??_OٜR{f͚=M_k\oUTM&VRfsl6SLVwYyyyJIIQ̎Ӆ:r䏒jOTlڵӣ]U'OԮ]5io_OթSɚ vMSNոnQ=;S ,oPfFzI7肂Y3:udzFF%+ڶ6}>qq4c}sou-7 7o\=gA[҈4(!!Fg,}G:sZl)??&~/5+W,Վ;ʫM/[kuTcC8Q rڮA-Z˜[nOɿyKUs233{Ə{X~~~ڵ_jJzU?4F[RFF/B |V##$E GԽZ lY.KRfF~-*Νmv}*{>q}v4ڲrtאi-O;+I?T=6A8o=IR;И1UVTR gpe [;D:x{$i̘65o\F>do޼EÇ+I%!jɒ&xnϒ n]ϞUAA]o3_l6M*rre0TPg Cn6M6}222IO=9AIIZtZꕗ_Ғ%wl -]\ttJ=童KEO+ (??_5$Y,y튉Q?mYw5P͛7שS-*77W앤?'Iޡ|bmgꕗ_TJmU=C>rDCܭ3SwIii52JNNfoyzz%﫯V=>6QI{&!ApnnNɿ ࠀ֒$//o]u5:u=, nڮnZhX/>~rssW~~dt*DqD6=VSߜf7f{ѣԡCwuh֬ڸq\ \Z6uC5z%Ӿ\L|}}Vi0?vڹsן~3Roӵ{ޠ^ݯʕԷ 譺n9%zjݺ<==cJ[eڶB...zꩿ?70dR@@K~Dϫ 8TY+ޙ5ˮx`&NlArqq;3+Cf|& >}J99v^V3oM Ԭ74eZԓg躐nw=d\-^~ݢ(^qt^y…Ӕ3:{lgگKh=ŢᅬG_;ҋ_~١-[~Pdf=4fFnԋ/f>ԳG233Xzrww+Te5x̷cNyU>֙YY*cGU]L%X aoVQjB}^쟟Yiͻ J[<{a+I% /oZnPP{L&xN<)IJNNwfvCУG}eef ZFQg-o75h~eOH8cU^>k黍ߟШQUwLyVVU;wҩkWOG&jkj۶CTe㉉U|Cii3%BoTR ey&1%t*33)M^wTPP 'G'(77׮2W5H?(ͦVY+"___ي^* @7ޠrppPp`eee<[#ffl6+W kZ}ܦkz.εѹsF ~ڮ))]w j/1;$Ic~oZl6mM뮁6}f)++KrF3ii;*l*X,}B=Y,/rttT֭xUEi)++K QF*~ދ \L8 B99(z`bVzYP+֭czИ(--M}$WGmڴV^^LÆݣ V>uƏB?' gIGW_}Ck~դ_eUڅ h wygV⫴ZR\Pv/o'GGGEMm\W_}C_[_eаO6'Oy^RmvhGGGkQ-Zҙ3i$gg5k#7wr08Sа{QNnnVe|X4h.~{Iحh>~}3oi2p4hhV}tmP5; Kz: ;::Qc@#s s \"X `+54b|@wwwATqrr4nnnrr+4\,Y3j hB͍ZA2rqqe+ 2 rwrssedZO ~~Q+$CiJN>e7Z. `.yyyXʳZoW~~ 5c08AF99:drn,dt4htRK٬YmP ј(;;[6:SP/-_6g(;;[FRO&7ww6ɒ<ٸޭ Q&INNNdpet0qq2 UvvV~0m6ed+';[nAvmAYF'G)t, ]l6rrrS2d2O9ٲYm2L>`ԩ\s22 j*##]A&v۲]fN8!ITr]7u֭[IOT\\"#YZX,JJJO39*lntJO?KE*((ٳg-gsa2Ԉ5bpyyy[uVjݺnfk%Zx A73irttj(MjSzF:FFzl6k˷.~4C?[ƍ~(OOOD0:,7WF5d3ꜛ\]knAAӫHc0$AfsI]f:W;k:+K^ {h͘9]4~ܣd'of@[L {zSPPIR|AW-\233%I}Fӧͨgjޝ5O >L7SN8EEmђ%_(|h|WPAmKkk?pk$]VrrsRmY'NV5k*""\+$$n9///}4C(ݡ@Z(;;Kyzm.AA |ۻnGhg( ACޭ}o>oS*((PvVM~}r2=CJJ:??z䑇r2חowc^+\&HNTAhFNvV{+)5ȑ+m9c֬^I'kZzfΘUᲝ5rKx\TR]tHMI{moԃhwjԃsC$زԫgIϖ`+I|V,[ pmFI5} uoyO=:phmKKbRA8p@ zmGܮ']>?MWug\3J*oD-oVm.P1[/nֺ7'R3ΣWVfy>꯷Uw$mYXnWzK-W?&ȫk_[rv NΧOPzUBBԣGh`0,7`@JZfmۨl"nolg5w$c&N.XS_llϖ໇ [}ͷ.3gt5gVgTÇS<0Nx^ۮZ[m:~*)Y[v끿!^Im/^Jsm#maW_][j?1@AmMJGa˰_|J'ݡ(}v|,J=O[ߪ+6uh[t⬀oSWU2g5̅M偁r-*88Xaaa1cF? ð$hBBկ[0fQU ֭yךk]/MyV7!??_#9m}{?VZ(55USߜ^/I:n=:~ZlÇi3evu@=xiZJLL{?(c/g^%&Lx\&<.IzϼVLL&'l>|[~%_ᷡBpX“nيJom-CR\7[61)IQQ~SYѯߩVI]ֽ-a.6٬#UzIZ}U7]vJrc~ٯW[)`͖>Xo"R3uU۶rY h+[nK s?^cI2wmVR[-ր rI֎չݺ9 Y;6V]UR]`!K;֖/SrԲ[d-߿YnV[HfZ$tJ6$]f޺@qx1MΝ;#OHHtJy?#?;X ԩQg]Ad[hݯWbR^~U9GR[KW~45oլY3Gs_u-h衇ǕQܧ^xN>fxK;ܪ"-^S&'WLV.uR+COA:h]'>`}˭7˻M"tҊEץjp;vTddgz? qqޫꅩrct’>ӘzٯFf,y+C驥srJ7wk!cVWg?+c9>jc eVVNMge+WrwE8cw(>]g]V+mpys [g7R?ç{ iUkK}ĮnrRґ#J:#$ 4%SR4m =3 ԪUkzeM/4pM6C99Un?cKZ_bvT{bv\JѣGcVIҞ={Q+d2ߟЂi̷svvSONЂΖ$EEmQVzv$mxV*/͖j2)));P2bcI}mzK]G5W5^㕹z+Ͽi|e3ZaaaּO7h|԰]7}yqrrM7w3M?-Ϗ?xPA:%<<<̳tZdm*-{uԱԩ8Pۓ5' "b^F>^VԂ|.[|\e] IDAT*3@'͇Ү{=٫|le_Rq3\dVV$v`uKӾx]³ɒ/+ .TCZRahZ}2_n#LK|Qꪰ0ܹF*Z2LQbbRVEk ܏j}#!IZz֮Y:_/cj@7U4rtM%Z,-P7gUad2j ׷::33SL\:h%bPQA,J8Ve_>NYJ9sKz"Yf]$%)9Kuo J̪:{Jb-p:Y> woպ^ 0+T|d|Nuh)/]եEЅԇl(;'G98X99JIIQNNv [l6kI+pfj=3y|,C5@:7\/|*Ycs~֑4J?SA imթY:̩٢4MS``MИV^1ZG&M65kHmUҺ[,LoN}223ԩ5DFFK}Y,}Of?Iz5iJOЯ-D("ƍ{$C-\AjԵ5puv٣wޡ~Y\Ym6Ï-Sp~;b ~>ggWwъ+KC_sӧn9mNhB.ʭ5鳅)1)nV6m:vg:fnW)_}KM?}uDm|4Yz}xat|VW6{HeVjboY%ɪ诵tne+iZK|"HҴ@ݾ޴BksGW:ʚJ+rϋPhf)n}UIk}uq(xR=tÕYVjڸ5AqsuU``ի W$Vys׭]Pt.0Nʰ{7622MK:=n4M1)Ͻ+W_Te3LL9uߝEZMN>Um74~ $ﻇ VX0uLiȸh>eppPRR4uutmw;~/eȡިS- Qj FM5 /LTUm-_)-<==f(##Cï$=|@)==];K~*O3H DYmVIK>@]0 jW{QfΜMlqKpchmL\\\\eip4:ӋEӫWFrr2224nx͝3Ja6##Cs%q2e6[ZŢ… A^^2UXmV(//Oiicxzz*pED+ UIpllU844I992::6`Y~6]Va9%Gc%&AnnJIIb$_??ed _26–߲ؑUnn_w`4M.u|m[؅:+;K~ _+b](g$'' eefhtMc? M\X,fYʷ+??_Tj`pF9::z hFeT`LNNruu( dYeYU`+bQAAAamB;8@cWPlY%Q)VM@. `0HA2S@(xkMh% @ Z[z5pi`0Q&\Nvk.-K@ @# Xޮ]l׮]+N 0@ @ 0`0` @ 0 0` @ @ 0`  @ 0`0` @ 0 0` @ @ 0`  @ 0`0` @ @ ` @ 0 0` @ @ 0`  @ 0`0` @ 0 @HjuJ)5qzN<5ʏ]5ޯ1hO4k=Բ 19|J)dBFj^S<;ƾGpeC>BKy[mvC%:#u \,,Ko|"\iÓѪ]-p,?SuoR -l'4uktE'R7G [ViI2-ri7Q*w6F-piRC>zHћi yq o!g kv$Xtd*}sk4;ˣt . vEDIf., =<2Tmi4ުJ[l5*F ܒG_hưR"&j2NրޡmQ1$v]WK>;jPeًl៝* z b4Ho3zS M[tV훵53T}4dd)f4zWB}%IА)hRײu䮰G_Q+l>߼k"v nS3^TChin7T$b'&(`Wܚ>k%5dLM u*7ݒXm]Nk |kҐ{_RaeOFS[7Ŕo0]nVFH6٨H'+Hgho칀i2ztmKLci)suY6E!={Oh}MQ}. u+˦mX袈j{ދ=vٵMio}GacG*"mE攚l;YR)KqVj?LL>jEjh^9_6lԆ15K((X=jo?az~S%h݃5Z4*U hu1J/Wiy9|R)<.!0t\S45(qkojU[RoӚ [(6۩KP}w %'1ju[s`$ӔG߮XO_nW}Yok'ˇHK*p"W}ZS ӋMYu$EC>~H֩ϓ/%%],Y1WSo֑̊Q:XTs؉c5J&Qκ>?/o٭2# {v Uz.Zz`EmMӀ~x )r}>*ϣX-e_4ٵYGvmCwhB8WrXzRO*nf-FMxi j.F'y}UfVaw䭚;ZvRǴ7FmԷS3F_ߪf}e5[룒O*.f-QGP2]8P%~7qW.ʱ)f4/V 1ԋz[|Yk7k]+ti7ˆ'4{":MӧhCexxfN?5ry-L.=ŤPkl2[-~O[Yhb~{dkJm95-4wCU)K!l+)f[}J&Lo!M1_Lߞ[8˥W_-*ufަx;5g{3udwZPAR,[:W{Ԉ?Tym-;jacFK!eIUUZ&qٵ]U0ImCnThpsrNim9qLTnӄe_lF}FߦkSPE|]@Z+,<=V)vǴͷ78S9Pǿ)h]){QKnB~q\mL[>d*lQ)_}bʇo{+<1~LۿbTEz=ulQHAN1x%o2sBܧNENԄ I^N1ô"Fީ.ŭ3lO[,z_b ee>UALӷ W!CGkB>-7 )Q@US_o__dtWې\#%MQQ㟱kFR R_#)LkgGkN zf}!pH#j_3o_ehi7H3E Q4w%O"Ҟ[ +/{A>_[66Ak^yISNڃZhȰɶ[aQQ4cѡ2e0g5Qn5xsb5F)}\vZ]^ݮmh7MW;>ZOׄ[*.8spWؓS5߹{"qlVbѲë5wC_͸p[҈²/\iwͫ ZX-[a#X#&>-,|"Fs_[=<\ե u:|rF ŁRmrIS֐ we,|K̷rGHg/L}h \w8K}W_ -vˍԑKf\3{ʷHk[ժ㛵6bȨ۞=ѤeB)P&V<>b)HDg[s/YX㍱u}~^<߼}Y^+[ިm\ zR^Ea]!͊:QD{x_gh=?MQkbL =ѯ{|-^~깊'L&9Irn /THg`m7"֛śviрϖ Ea5)t1}: 4pA 4F,>~RٻRز Z-lꬰJd^yB|)1xBb[XRH7>* $+lmA;5 x_z;=M#4ry,m*U.? 7ѧG4u5ٓJ m'ĖŤR+ 7uk@O~ 0PY5lݦ=ejnՈLQPmhw*%fBti0:Nm]Vi;rդ۲ɩș6bSgl]:{RuIRK]`c:\v=c{52ti/W1\{"V.Z(~.qdVH~z1*r3+K6w Qۥ΅9!}#=5z=QF_]#)C+qE!G<-]_<%8Y*>ݔxi@ )4jۮ~,9yxXP_.ܭ 6mTtҁur}  2j͊SL˅/T%mIݬ\pvRm*솛Բh!?ܺ.S̅yTn+-ׯusI'N*S\嬓"9[7+:>h\,[ґR/.j A|<PzmRJjVfblV4))w _%Ht!vܵrksƵ%~nؖ?.2Wi HjA' IDATGIN@)$Jħ#gM+wvs֖SlѩZgq}mf`(?j8'7PB 0A9 y^{溯u- @=7jN[-Ug{OV5/~>5'N4'}u}[٥Qzˆwi=;J MCvȺ*ra;I|稾/IM{;}t8[_@-^Y|ȅR ڼ'ٯ~kA֟vG7L|iQ`wӍ-6 #]npدύ25'~^(8d۹ Rkoe7 FYn%&ޣEko')KQGi+3{\xұûd+mToj~s  yxNv򬚝6ٛ}u- S8Z8!NՊO̓@mJHY`nMګ7+UZذU97qnjzZV뷵< o]Q[¤1\5.bP|4q]8KeE&4EQƆ[h˦ c5_(?KcMa27m֦ Jy+M}eݺWE'u:qҮh~@m:|}h!K\[o>IS?e-L 5p` Զ|!{ʖNQQvkܤfCw>~[.VɾlR?VXwhKka(rlP-iZt{pl~*cںѭߣ[Ta_v5;Ys/Nv6]QϮ8>/?MPDDP>0B77y6eٯpE4=-ɗBEµGYmeG6YEMtfJS-MKSkyo|qyn}v9'ha[w)>4ufWSM I9I&Z4ޠnjvݧZ׆?`נ K<>ku!E(׊C Rt[U[Kc(:{]#fSA=_K6E Ǐ۱Y&G&5pWؕu 'p!ٶ*CFAr-=Ҹ.ͥ}LKwkIc UtŢY"ꂿ=YuЃ[=zTrlT޴nww3Fu]PϮ8>//݁agio1L0D$]MȨ=ksk5wXk#,P\YmGp O*j: >f\Iox7fŌ)UڕxN׭}<LbW9A҉d[M#+rLt<2"e.88}v#37t4y6lrM]YNF[%ElUޖ zF[DIGRb. =k%Io7|o7\i%>|^͙&+'|rȶY+m  R, ?VeZ%\K8Ha!7JCMl.$ m\uGB2 m~%q"=%tz=L`fCw=Z& SDnYL[ebnoujnx^K4 AG˺^4m-(.8\5,A/'ל6Цe {qs}&=oSua6fE;0BIWy =wo7]߶YbߴCO@b4p-2i luwSʌ ysY.ÙO^f j|=nGɩWܰzyE^][o>J|ҥnӡl P3)J}"`84=WyAq7uzvv27jVUMMi+N}Z6_#Mq\K虻؞[)z ZTX2GG,]ͮATK;P7\O-ТºnzG0pr">T[;*kxC{} :{9DSNzwwP dİA][с7k߬۔c߯JRIht Y1X`*k2zP`EwNW $5fq!Q;=pHeu9c2etbn_^|V)lm*}o9Ȣay=LXoWSFyxޠ7+ltb'5H{֞Ѿ}u)ؿVǏ$ܹ $,$ܲ \0` @ @ 0` @ @ 0`׬hh`WRGR~TYE{|<ܥ4ctG8`8k6?H;w~\~UuGs~/eo= gʺwKH|~8$-]%m&BC%_ 'zc$(= N)!X**i @ @ @uM:sLz0̙3s`N=i(u{HfB0` *s~ۡСu+(8׎`pӧ%I7(18iEѣ~]WB@D0hTeir*g]s{JS͆vW;Jx'Wuu& ޮŻ=Iҡ\؅٪ -ӡRm[ByoubeXUp ٢ 0О@twG'^CeVvlF=W%$/"%9TY$KN?ZR~ 2G'12V4KUQ-z/K/MJr]}~V$O(T/Ԃ+d_-Sdqa/_uES'DZ)mFr/u)9ब}W$t  &.{S  O=tX-ӾR[)rIE5[e%0@EFʃ`W`#"*mIu+זx4?}F rԯSZz2ac.O=55ywYF7Vgtfi N՜r] ?dgR7TyQEZO(1)11O< Rc`HkQ0kZצwu~.j%GC '[>˓$bf&)&T{d۳_y{v)gUJoGU ]>^ʋUP| R`J!K5%$X@\} QW)NE)0 _[{MS%Ǥ>et$7ĮSB>7:@+s ,;ewtZRM՚D!F֮_s&i*`]*޷K9.MgXƑ孌ˤ\-^2nس1N iGy35UiP/T꿜שjg݄\.؟=eE^ԯrrmhwxSӒ_UaҶe)e5ĢYLݨBZLceL_w/уVr_ky= R5ZS4q<ܤ Wud=hf}, )Ihٲ`Ate|8]y:W~1W13hg }0o3?߾% U /_6VQ )rfvVL>2 W1Jdh0\{~W9}D-^>F=%kTe};]m\x2a,؟ԛ& @WңGiv:Vg@W$I֯짟hv_gbh IիznEG~> -syO zV!o5Ar5i6quՍ|u4ջ7WS `Ce6 VmmΜ93g8-8"u`0 0'I...ݻ N>Mô޽{ 0BBp^Իwoz~;nManE*0` @ @ 0`plL{T/74\G@WPJ's&.ܮQӕ9/J4.z"?y9o4 6nBZ~|Z~A[V;5瑉\/iržQgW޵T^*ɠ QڲZc/VYAC5%rkJU7p7sy{+Z$ڮy3*f%Wm;*E'"}8_ eC9E黊U 4 *Vև˕U Nd2[4_)nPzrRx*iG?TH%b8@s\ =@;4OUdP(EUZ $k&OSq!2JWb'ܩ c{6x~m*[ԯ.랲/ViʍhXV.˔ِӮvIኍ(š&XWiފSqJWn~ pSJy4} eZo+v|"}$ `6X2[SjNS[nQӠY(7IZ9?I6*#%Y&1͌WnRF$$-~~^i=\zl׼ǗZZ*ԳyE%JriRź^sdjG-zrWܿ4z'՟s4[}$koa$|3*T\ m]PP,+In24Yͤ>t<%UJ|GiWkEr>]p~`QdЭ!X_CET@& \5V 4(hs p/r;WO}Z/xɛf2=\cSwjl U3Qd N9c-Tc~Q?BE|ݺ`l׷vm=U7zg*%n4q'@+"&)snl^T|n]*/)_{JwK񖗋Tg.ݠ)5K1]GjV]vÅrDU WmY-W/' j)kjL h =krGy<ÈߩYd-{mֳ3#R56yT*gw("лyI<\%OQ,[~h'47ye;yRs5+z[۫\G^P0[)) ]=[a*c W>\G@7-vun.'Ya~>+ysu:L/)ls=r>۠)ҁO9%Q::@mC4K.&pt% @wsSO T~xyFL9K[VORQufjӫmmݺj$+ݹUaf 9U`]6KrSkNx}/Z'Gq')o>HܣSʩ'2Y)^2bf+1|`+Wl\2M8^Pݣw?[]X-{r-޼Gy%1z+0Nyd,mU7).LŪ"KPr$U(DS.\lڠύG}[ZS6A=Z_=KŚܺ61^#$jrtx[%NiRP-a1󫉲w[\-NDYU&i S-mBe,H Up)~ wF˥nd,Lb;}*Wj#@q 30~j^;:%[SjNpGb=;_ 2{ )`~3{"8זʺ|gQ)La>#^C RFMR txEި<] Zyæ(JEe*ymxq`:IDATi>xY<]aoM}}|rw0fGwV^CzM-X9;m*0WHis6T;[GZ~ov^J[(~_ _~Sqҵd*(UiZޛ0}^;WO_9.Мm;e_%{@G]fP{:}]em-UzZy,X )VZsۮn]z4|bZ29QgPAgc 6.6mWIJ nok1N%$#CXA?VF]ƔjMF<'+ڽrOEOd}{AБ{{A]bjot,W+ըguT"GֳA6_V[,am=Cy2 vf+X({2ܩ(Ydc׍{kU}Fjꌉ/̣&jzߨ=#cΕahe|ݍ3Vd(S^}xEzșe2=M !~2(.an=Mk}Q㭘{d#bn6(oA>c4t7~/lָɍ*.)|F6>i6I"JfNGk]<5Eaj8MGT)mu*jTQqw~\4luRzQ?"'z+}lTy6 Չalw]$dTͮbK2uY4^i!ME1!&}߄nK}VY{E 6W9@@Tx  zKEk0ܴXI8t3n0PQkGw|(rgЫtPe*"g㧸_l g WRbU6i7BTߖ+z_(Uf,^1tj%knn3_>&X Fy۾m5=go^jFU|X]UPTlRBT J$??^ey:x5eI+)yWhcNlp"P.|0#mYJu5c*C&jQ(۾Ts8[o/lsҖe+TyZMQWBY&MBƑbUu,XvTPyKUyکBx;uhThd-(UQv*W5F۷6vr JUtPdՂχն'#[uEVieK,X$=pcǯ?V%S}*?V۔Sjٿ>ܺh*X\+w$_iks}&[!+Cw?jQR1#Jt'&qk7Ἰ 5$^&˫P|S>y|Fs*)ݻSC٨M#7!TMv)\1}(٥4+ܝK4qaYW䇒ѫTTFkCg_,њʐE7WGhs(-PGR_*=ʖR,x*0>rׇ*iL-[ɫT^&`EMi4$>77D)vo-:x=DBf*>-V eIרʜQ:)kUTY-W'u?'Xũ/( 0%=Hw>J{9go*M?-z4`;2I+E]E/(0-µP[gzjNQwॾsqB@'Y<ԁO*c+u IǏ ڹsgRwzvnMfzWcrğwD^JJwoTu۔'=lMWEN?Rq\#z)UT(8:^ў4 b5m>n}]uu5<8-ch0` @ @ 0`  @ 0`0` @ ]ӣh =ϣO0tau .]\G@_My[3 ƅKo~z)魗i@<.v  @ 0`` @ 0`0` @ @ 0` @ @ 0`` @ 0`0` @ @ 0` @ @ 0`` @ 0L У\GzK.`5 @ 0`` @ 0`0` @ @ 0` @ @ 0``N+/ҥK[}.=+ƅBn[ Cp{/pE_0`0Wcv::s\Xh U:I*/?zn#hU$6z̙rZp;-I{NjV\uzI=gu]Lj|r3^IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/behind-a-proxy/image02.png000066400000000000000000001711121461403617600247770ustar00rootroot00000000000000PNG  IHDR!sBIT|dtEXtSoftwareShutterc IDATxy\u %(**fZ%befvhmmeǶ_o,k6SֲMT5QHef~}xX0|3|?_7t`É 'ohhnO)L+jJDDDDDDZ4Áĉbʕ@PP0y$'VMH` " G. }HOOW yh4xÿ&##C5#""""""s2 8KJYDDDDDDkFA!"""""","""""",""""""r05vd "gMii). Eqq1%%%YT"wBv*FDDDDFt U9Y,BBBU""""" L&՞H `2WEp}bQ˯HKb뢕(w__?՚H (׋Zi,"""" -x%""""mNzίHd4U """"R~N]~eͲxIzM l:Ow3Y6x<F%0 Rwa]is= ïl6SRRBVV[sHM??&=h֡C~!zѣGپ}'5<yx 239=lݠKKK U23^POz/\ݱR_i=֬6bp ꫆ەGDDˡCL2Hvms;niii ڮ/~-l6;yiӆ>,^9[nWZ/݋FߪJNűrfB;YY*`0&vj$< ۱llׇ߱I ,, βe_\.jڵƼ/x _棏e#s]̛)QQ瞻N ;k۶& n~M٠:ر\p} ֭?mG.?7tKkMy9&?Gy-[k'_DŽ Ҷm[l6GϬV*Cm nfnIg~]o :"""0yyuy! #F gO(""""^ T'EtˣSUH(~~~ BQQ!Ry nn$^2bcq8#?_Hdd^~U߭&00JX`/XcY_qEaa|BZGDp%= x0 Ç3p:\0V7m榛FAff&tء|=z^Lqq1;wnV&?8ϝǦ7/=Oǎm]瞻XygSS[op-wAWԩ ? `Ĉ寍1/QEDDDDȤ*|FpqqQϥF"#Ly @ieWKٸam "%gRR~`ǎ\~Yz?_Hhh(^^^Ï޽f/_mŠ+'??m۶sOs???sqFVr[lǧwVJ˟Oϱ,_- -./[pۇ}z_@n]X,ҿ_?t:j'///&> .-/Ӊe:c6y λ,Z{e_sՐx>|:ĦM pK/<|W寝i_/@hh9__b۶5n駟Q#~(N@]~+7Gɧ"??;w1`e|ߏŋ`ӧ76lo޼;mzjv6V[޺}!<NLCdd}ՠm-Q88zkJ'zb$__JٽVBhu!ǎeR\TTi+__zm~W鵨(˗;y9wf0o'濎G7b0YM̙q`kK^^^?e_^rNիװznz^xزe+֭'aZ0///.^UH+^f#00뾯S=[:u(k ~7ٺu[iu>6/`o%'˲DKc S^;qin=׷_`Uۺ[Ӵs.`HO+,eG3-HPppf̜ѣGZjUi-[ْ'{3)**nap>h.,_Qiڸp㨑paa!?Wﲧ^7oyw[V~xqϏ;ws=b۶dz:t( E^Uw<>Lqq1:vd >?̨GҊ\NFݒM~[ñlXDDDD\ X,#*=o7YWj ſ^AJrr n%Kt: }QAm##|eHlXv{}{㚫fk6nLhhqZ@]W z z]Zk51w?nXVt(\.[iu_~lᦛFڔ7\OvO?[]c 7'.8N>`<0-[0Lk׎y>ϝ GȴwfÒ+;ޠ:-yA """""R>`G]HQQ!ǟl0p:U ADE]XiنJKK^ >:JKKaժrѾ};JJJHIy{ ""W^yƂCR*[g7oBnn.7٬rcDHH6)LLnA}tժ\sU|:ia43ٷ/ ˅B31;(((` L(&=?LJ_x啿tٗ⣬*:[`d믿.:-Ѩv YYYݡOe#aaaD&IGgXX^yo|7 G,5s?XDDDD\)̎m2б3۴%77^`;jR]] 2ѣpQT\~ F՚H gf[5&҂i9Q֗gHE,Q`O5&҂=,"""" uEZh?@!"""" Ϣ9X,ZDDDDOV!)Hpp+,]ߖF2L&W"!fbn7. ǣN @"[0y""""r~Z3+QDDDDDD7AXDDDDDDEDDDDDD7A˅PZDDDDa #Fo ̢ш //FAEX˂pii N/o~~et:UvSTTDQQQk>>>QXTǧTXTbHr((`0ӸuJȑ#2b ۛ.]bi׮-zHHXÚ`4$##V-~;-5X|:AT""""rVKPp0fsv Պ 001cd]wtڵ] 2|͝ϼy@NN.frs0[h& _!""""猂|nW=X|+fLc⤇ b⤇xo4u ՊϯEs||۳49?-[ZZJ~~i  ;wtƲdb&R\\PvO{ӧigm'zW]Ff`츱7}+W`7}?iBcѿKhY+Y-k0]o :O("" ׫W/z].EEuvKnn^yoUK$$$/Dbbi% b4ebb:Y@܊+⌄aÆ2ޱe~\LL'nf|Æ gfذVii)v{qp/^OFfΜ̙8ƒ qp[ S}#uDs턉7y_Ds%1{oYu?xnшth "D_2za Qyr]w&EK/Tq)ݺummdgea4ݕqewl;79%'?sNuks堁!xݺ)))i{Uw,Z䔔ܩo]ir8x>CN2?s|ĜzF6Bq|xj<:AL.DgA1 f &}ݘLM?&nׅh67Dsw1Ws˰H? VN؛2?9y3uOcμ5KYMt8ޭn*2fܹM(F ]*iUF7ŰKXXXۃ\3=er瘪CkR~WzllӦ9Nέ۠X3fLb{mq&_׿O?租56N'x<Ʒ7~0YYZ 6%%%[fm `Ly ”^gǎMoκ|q8[~Ot8ˁKC|ʲGuja<:OL'qˣwg107a2u Oq|9Om'7xዪ u} 'ơt7%y,XHF>3+0g&ܘ]V6-ok#۸kxwBMR $*(_eej=#*1H{#5T2#ޜ=ED1biiiq6|#GT;ղ˪]Guӂ2?fz3sF24qT~+:!9[oe4,_WT93>%\d۬O;#@Ǝ_</;`f%y0f<_8%3v UtI\NlaOcG[e] Q /|$`o/ykۇt@,27+!옷d+u1ҭ [7ݺ#@D۸o8?¾ X?kP,fL%d`ͤc$CƏ&b|B aӉa"#72ӝ[Mtװ%jz_o ĩ\^|¹d5 ǟB2+w5!I=[' LE {.V~N3K/$#lZ!70ix ƣyoY5ߩ A>NSzV2eue6x/O ggӶeaġ7ey|1ki|G{' =Wӻc8fpdiglʭ5[ujs:~^ H>G$cjaMbUˮçSHv3iu Zv$+׵=~**$;c'+J@D~bccg0ax~, q(-[0fxO_ӧwjU'>~0K,wg2$P8x07w߭nÓmHyWp7hӦ ^gݺQ<$ڷoGAÇ;o.X3vϿTc=3u.SM4{os5wE\I`QᷱARXfiݞ_wڼ32Xf-_Y`_ $W5B ' -u06G᫧poQ{o[2Y%|ۉ[gwz ) .ѫ߄&%lA {5,ӷ^EXӖa!<*L?/Ǎ7e_RlJE峓}β q>Im:fDZٺv i; Gs]';[7|ź b. 7X0o#:;رqr DX~ŷLq+g%^#^>: 9뒥$jhY52ظz=Ȉl<|KXn칀?c] J٪wc$cH˽9_{=jžv*ܗaq\utqxKx5N;f~Lm_^e?*;l\p]HyVy "R xGzR~mv8ƌߞ4y]eeպ {^^8eW t~oޠl٠ ^z̾.ϩ |u; f7mUV$%4f}*fg:?0?aа^f>*.B xV386omP;ٷ6ѿ5*{Sk'js fVW=#2< _vКT;JQB oQ IDAT?Ws*K*VC?:7g9=uRy;qI4$?9At}cBXl}:ndٯǧ{N)_T2r'/r Dc =9jhYc IK [<80(S*=e[ɴV(ku+!.6+VWn<~.M/ߓ!5Uù[Kԡ܎T!-(Ie.CDwrS9^ź3lK4]z!djl{5|һ,|NγZ^g&**/XʒK+ڔ7ɨQ#IKK^n#<{<2LSmVȖĭ޷ĭnȣN8to]~p"|||xoVZl65h6gyuc2xǘ7^gQ,?P2tb2[cܽc[MgvB_rs3ǀ6M6O~M%>eezenj^ZUbG&v`,֚3&BdHh",te"qSI#:< ??d􎎄ӈx!YI$ֱN]_h8A|39:!ԘÎFȰ ,+_;aŕc!jN%-D "ieWIM!٬'[TpBMn| wu'`=WCv4Z[ԋݍף\^fFӸ:2o<5ilR7{?doq*_i¢"^|0ogW ㉋cÆ z-(((`ӧH.]GV1h=%00`e2ىDyȡWAyB<ll6ɝ{ҧnٓK?cw<^  hD4w= wʊ )'˾bG):x=`jq%ٗzVSv]im. 7o=h9^i]@梁LƎ=5I[Dޟ+cO[x-~~űm_. 8|8Vs1o<̌f01t2-]J.]xx衇y㛪9uβڪdC[g]nwQ6>>>\M男7&fgʂ`L'^cJ<T~r ߗu%}Z}I Znݸh΄ l\S-=[SAO,Etd[>ox\pEw{')+75g%/!$?&f/D>Sun:eykYٓTwO[1+ٞ~W3OoۮB` "2Avfd[ծ=26 {h8OK+u|̜tE%c-v[f[ ;;?{j<^;"ABv 2e68ַ5iB>vjy/:]inyVy "R_EEdeeQXTDXRXTDVVEE Z{r]anӻΘ>˖3O1}tfLIbb",[33Otf̘qJʑSR~nwy )..T\.mhҪeKr~0kzFj'BS3|6/ܱڑ Z>֜F^0pq71c^ZF2l6δxxXwJ:{q=Ҏ3}z^DP Om?O`ĔY$*/Yg2FGgge:7xm5CQ7[1 'U(m;vEmpOƝfnsNvkudceRq0`ӧ( #p/ Vq宊}&'m5ٓغ77^9kMI:uxYWӓsQ b3zY?6$S3b(xo&5DžWdЧcv\H",&مvM۬摇_?7ه>ԆxYŵ$g%[Ӫ5/ 3!HwatDb&; c.b~Af8X ~^{$5n θ4?Q"1)Syp>JDUTT1\q|Cio߾a_R<'$)o=!ތ]bz roU> kN'ӦMx͏6f7橧$?;vrUĉg9s>f}޽?q饗 ;wb㏛qrYZTiqvt:B'{ڻ̳O̳Oӳg-\\Kz2t nXY|u9ڨm;qSgጌJ_^sGf:5~Ot7Wy/p;ϟi{9oj$AvH` ch51t aρ el u5\f\++.>p8~n$99/HU?^ɻS2:IuUh0q}τ#dz!ߔ3`pz{>/6:^ox_6K &IeqeJ NʍeJ %?77esu"+)~awum5/id_< /B2[neϦ=D㲎{XΞ?5zBa[CZ@uI寱M9~S{5{WXHkvUs(H}ETTEEE,YR6ֵ^S$_:*݁`TA{yk5{ H_VViz rx0a<g&f??Lj/L+7h fϞ=\FhӦ Sx ܹY:t:]_gr,__rr@xM򀀀J7hubt ]qE~06_?֬EMW$>,Ps~jgx}Tj_~[j{/VKoVN ã3wKa۶̟I#. ;WK2 %%y&7!!!g01+䡉O_d)Sx%ѷo`X[$ҋ/62ԓ5|g0}s-$n/^rNLJ (,l+WE\ݴZ3ݼCfTl >ۣ= eCv=oMqtf#%%;vp&k /--@~^nYWY;#Aɚ9st- _)줤 5M.oK[n=(ewajM¯A~~wٺm{׏eeοߥwK :-u[ZZNhX̝;v`G0Uo>,]VuPLJܹz6Z F#1n= m*aaa:grf3f1顇ͱ~0k6Sh2իfcf1?)҄w%:(얱.oKھ㉪~$3#u1_ 6pe/֧ș 5N?58Lޘ}|<`V2I,]EkTPPć&QPpnrQ}(gu8ϭ%!!(**j ZEnNNiF3aAUv},Us>DD3l jTn|p8 d[*)i-/A;1z[Dhh9sL^&Seȹ jUiFAA^^^;رc學wu'cSkkpAAc M~.mlؕFhtk+Y,w;KJX[{+FyiCx!^*H62ݶSwć T6n%pq.]@}!!3`51Mс͞ȶԩ$;\@'XjGjNMWsegmx i_啞ȽU{q0FĔFү^ؓ7'wѡ ~=|ikOUċB`rBz~r}F_6>+av2Fӵŕx1+#]m;7 8t|\"B#p  nqU`uNDiΙ-S'/sOAGs n}k65czz4!,4uGvoa7=]ӳ ~Ȝ7c![wNgr iD|v=nN`+O`pKHqŽp}.iei.Oϐx˟sbYk-mz0x%HEB1CNB[0ڧ&s|~qth_!Ë p2_8eIK-m>VD@RH""""BQw%g3q{ N p5kwN{ZM{wN9;r7&j C33V2چ:C-+֥!9V8b omnPO Lqt?1!%̹+\\$"3mTv3zcY`ǢhRrK7}WvgeiIt9Nœt`sc)rHN8"έbPVΥ$2t::9'-/dwAmrk܋tWVyj.HKsAFlw6jؐ] Z??IUz;Օjۥ߰t[FR=PLt'ۛcсl; Ndt2"Y/q-[M$HVŗ!D6zţ}4~c|!~M!q,\N)e\F6"[_U;A `6a\F3~Aqabl_߲`f3ࢨ^k&3n+(=B{#'0dS¸8mƟT\s=B|H>vr';=:c/ACI{:1c_R+YDDDDDDݮy~rذ&FߢDVlŽ^lɠ׈*EwpF~&Nr/Ŋ9Ҩj:\|J'6ӱE Z91 |m 2.!`' GʅzW 5(I/\!9)'^:݅9fp` t[ĴX_WwEYХc,\/`fy:lLYDDDDDpɊoֱq>͉|Bh?770?>bƆ4fӷ45  %i{HhX[ښ@BR+v`BXYz2=CĘ؝HntZ#8X ^ /ҏhnitkݖ9Lj,""""|qaɮ*F%v;JꮣtZv2{ʻx[', IDAT<'y9Ŋ}սp4ݮݎ0@Bfivyq Ќ[7rH% kĚtuxGYUf͒]7>Q8Ek:d"SO.VVQ\7 ؿܤ%|"-7)[Y65_qA(];wz:s!٬2d?7nA>Čyl<8}N-]{`GN_>J>t dy|F|-[ $,Hq1t Km ;NNrBH!a Cd5 " ?b}:T7Jm[[ U8TQH!jE x@B$pN~$@AA _k<{gk_Q_$I$q/^/:aƥ|^ĸVn)c򸇘P-(71e5t;ϭ;Esd0w2\rJxz<1 W~vX" _pOoz:+̮VrgDC@ uW!\nZ:)m&onY>T[ϒcImaG籴v&o~Au׎ \nbJ$|<+əʄo0Kp)ĕ%WxZ!2\?ąU$)xߤ NV dZr. wݾBN7/aжV5i37UF^ڃ&5ot9,dQS 9 o~2~ZozPDoҒs=ϽKj׼['uYPz_.Z'u/$I ǯbZP7\w3yľɜ.|:cbz-"wuykaݡ#xr5;SmԍCzx|/x}6F&#-2/ax&*[:a]rÅgvǛg2}Q3>m>0\J'htyܢ>n!^gÛ Uwg]Fq\:?gf|됖f6_'v-%Id>Y9jU;\4`ݹ|@{?N+޵ acUt? Q&Z4OedZJܿ9n5E>d.p f=ULVGzAsXfqsuЎk&I7|@\^]P{Į\n+$I2#tklRTd3O3k: kTSl- PkWC;qg\}gْ72ઞax; />aСmXTelY9`\~Ƒy:Yna(o)p=kQPmKsi$:uhKvtЎV-Z'ucedXݥȾ$:+W$I2JgDᬑg|`g)N.A^˭:2i̍L?,AFNģ;E b\|a\2w wHe8z=ѲE2-[$E٣Uy$I%9edڼ%ebJB_d^ݟ)sW~f.[8M~:5?vhK?M-[py dNJ$Id>621Ӳ#\R-L]ĸL-eTgG3#/\77PogsGߛg0'2_W$I$QW}fo01[͇RS۹k) |LNJ'0ߑ5,;-W_rXà[$5OcͺuE L$I~^_y?o FSFe 䢇r9ԑI^¸ 0n{!Ks'|i/xѩde_wUKЧ x{% oI$I2,o(dx`(- n nFAiteb >]79'-ݾW_o(tAV@x'9LY$I.`&ӭK}CXad:egTff߳{ ~M%~y+{m~r}ɶ{1c g/`uK$IPJiy=˭zi9N Uy_Y.9ykYf-Xx&Ini/d}93MwXQ{gKx{5 I$an{HږxN%>X3ԒEuw!{*=:)3v2>7) p䰬NA:uoq+jU!ƲyK(/wʤ!uJ.J$I5 p=OMUuyg Hɺ|X3sLZ]*^HAZvϤۥCȜ{"^{`,y:=-&$Dh& >] 4ÅY4VCyL.EP+wi󘿰hߞY+iڌ:!zE F|N/I$IRsδ!|\[AZ^pLd> 42/ag̣*2VeEΗlL 2}AA_ zko jy6:FtEVԮ0Y[˘.^$IwᾟGߞwd:]|>w2 v2 d P\\vtgX:oI j'+nS tg`aג=/߫A$IRwL>̜1SP H֝ݟ.!U3~B)IS^eE$jOFFN[oK%;7ee2JʫZjO=eI:HH;Lԩ^!&ТU*:ӷw 1'$Y5N.Xe70hI$I TԐ!CvXzjU+I$I sz׽ҩ$I$X$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id>,Lu Jk-䬹{߯\A+ثt9+?_$I$b3oG[~)<%eLVAuiIlyD>-¼),A}[`XI$I'L ӈ]<h#;η}6r#5[};°>'WWˮ|2̄ IdʚQ qlV]?6}9?/jXvW%"FXn³I㝡-<[ lw+84SCܳ`FQQlZ"_{^&Gb]@EmavbsىnB[Cv'Ss`Gvb l_]¼sf7iY|}KzW(xi Icvf}5^+$I _W%6DqNZ,Ј;Ʀmen`#U5],-?)KxqNl*c^tcN>h߷~ҥ =1 Ϯ |cވF l_[')M$znɢHi̐4a s1o`Mđ4rEG7",Rri!R Q ޸\1]5⪎5,0#^,$INl~tY9*㸳)@y[">[6.@=5:f*Wn,ĢhzeTNN_Z󠑿ljMʪ@M4){i,TTFTa׺lqwUTDrN]@u;xUl*KyH1{۹{ 12%wE(Wo͎5)7oH$I$])LIhxw, qw3&9mk\aлK|Li9*˦56fEZ! 97Ѥ]JUS"l ٘0+ ..h5cM6}Fvؼll˛ Bd'&*u&!1%0k73rVzޘHj\M4aGy&8K$IRuOŅ!NKvD5!dH=nZUFnFSkvQ_1~yx.YWF|> Py4jW}$̼me9OR^\oϳw|qQtH"y;<U\UaE ȬAC )T jWżs:{EH$Ijm8EE9f3Z6at4MeHdn۰_}&hͦ؊LTEna: q)I[M7?@9;bv5k/Z8VLVKٲ+(6eJc9'?g.yf+F6h#}+aWlQ6%T3yt֜_Zw8뜘/j; D\{xcVVH8_ pNKʐDѥ{K&`$I)jȐ!UU\W[i3ͅ׷x^ϟ-449{MnaG$II{_w9Q#H$IRm?YGqu$IN!В$I$@K$INJ`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$s+TUUk$Ic.**=,I$I:nêabbbiI$I1{n!/HVVVÒ$IBeeaR>I$I$Ú{%I$INjͨ>I$ItR0K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$Id$I$sS׹,Xxݭ:8I$I:! pd$Ši/s}ƶt<_p4ڗ$I$֔CN~b:*nz!%sť4| vBcI$I:Ĝ*(`u8s;:%pqWm;{3#H$I$N uک>[m~;'\qp !c&'5 /#W\:a7߽{\| 9p '<ɾtp (\N1svaW?~իW{I$I2eY 1('7?~ ~{`u*ݚ=_m?3g=+/IlュHsALRlN{/{ëU$I$|TױwC%sq׏sjyt +PJ@n>jn+W|imziX~R @s]vG{9F 7رc$I$N{Kױsh~zG$6#=^yo>Bp̡6 @04K$IYu!8p~$m$I$|T@Z$IcJ6J$INd>I$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$Iǿ7 .!oX?o|ak) Ij՟Oox_|~O$$I/S٬ %(k$I$ܐY/6dOg|"㏿m-/=VCxoeuX$I -[k F;֜yˬLK$Ip y;~74e2I$$q}qgRPPppgr}T}vVXKLek) $L8~iݒ;. ӵ^t+1_*{"Go׋묽~]2+ Wtd4H!fS!V{&:%{xrp(S\w2ryJƩTj ZA٬/P^B/ߤn/V7AڴJG)^F jI$I:2!{"`ٰy߻6RN6R=ֲaO"f mֿ g- 'zPB_p_$I$ ~O.v6HT?z(ОONfםtS~^|O,s#&ƼZ%a7TV>H$Ia`{B`inX ^nOl b 6smgYh+2k=﷌ _/[M1ہZ5kK$IW ~fKQB%%P\ffdNsn./{t 7*keƇm/(ײ8N ~5RuQj$I:N p̋vll_¤eX:/Zct]?[gŌОizg2Pԡ=m%xWȺ,[)3X4\^v:ҶdƊ!r ƀְr4. "XVaKus L$.]<%I$O;ԽK2㡩\T?:32V:ex)~qԽ7)c0WF w򖜩ƨ{130OdJ~8:Jn 2޿~\g$I.C}6Fgٖt˺1SH;8DEyu L0Ym$zS03m5d$޶fDٖdotwdO$uuJ'CrMɿ]I fgoP{nC%凸9M3W#9z Н$ID 2jw+?`UJ{E$Itu.t:*$I$}5`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I߬c sGA$IN}rc$IC%I$I'cZ$I$ሊIު*D"{_K$IF"::z몪cIr#Hݻw{%I$I'h!&&fci8SYYoo ]=!I$I HZb'Vg77nZcV>fA9)>I$IsRy+<.aϒ$IԀ%F$$I$}b +|%¶x,gfdqV%I$ +`=l ^3$I$["L$I+(9x$I$%I$I2K$Id$I$,I$IX'Sp$I#*.b%tmE\T%U1̳EXQYX HZTmD"<8e}cE$0}q%okȝYFQH0u2cNz4K'R0' hCoaa;T8''diQH={8~ԟPBX[g:Oʤ8{.f/Gi]xT& 9}hM53yG(b} 7o8ؓʀT/I$+mݬ(K$'3;pY <п->c,,ό>cb7(ܙKfPl?GL|yI_B'ՙ&>ĉk+~EP&N-7V._wW[ˠ[Z<Eϧrb/,q;O=4>>ԥO2 ҧ'p~c~b/,?LOVQMLn%YjO]'Og;3),$ku?[nh_wr2I$e=IF}кE- \> xqn g%:tfV2V6Yi-ofΠpG>kWrZH%og$Pa>k8r:^8CHAp~ľ5S3gyfq>7H@B?4͠WJfCW{}/3`@wy hq}.9-=$aԳ \=2ܳܣ_M5'MI$|r~'8BPPkW1+q2M$wve4UCxi&Xo  %y]I鮺&'$TPyA'u{ fpKУfGv*7ͭ~-r eB$PJYi,3I AR'mrEIxikw(_ʋWQJ,]0r,F&%Id>Ip4w1e#zu4ĶOfڃ|R*]¬7<qR~ n߯=]7Ѿ0ny~Iia[h~4|:S;3ܳH~/u(=oW-ߴduHnM~$IRpC bXh$;wrƼ|窹'HIj7UJ *"@,ѱK;;t"*w}Qj"Ԇi֜焪X~?u;?p޳<9}ˋʠIg2g̞Fvk$w3/O??3SE/u5iǀkoe̥'lܒ$IsƍKt9]NdB Q͈l|߰-ǬJ} inAx0ջ|=C;3x$$IN`?ɞ$I q,I$II o}Wosv$ItR,I$I2K ֦O83I$IO43I$IdzfwShpKm!Yh.;C$Ip%Eqi$I$Y$I$%I$I2K$It9.nHH$In{>!ۆAHb Y#aX\*  :bNoX@ 2P)V7ĶD@D$@/S4zŪU &g-ɹ>|%&$I$5k~e0H$IR+=|7I$IV;𡅰O$I$>w`I$IRH`X$I$X$I$X$I$X$I$X$ItpH$I:vgX$I>a8p*^Xo{9tIq\5zsN`w$Itj~j]{zxիc/ZG%I$SboW783]0'7|_? >P(Ԫ`I$I<ܵ =y~y-$It܍6HY:#`߾}rhX$I&$I$X$I$X$I$X$IZ0,8wwY|-ell:P@{7&]_yih-m~7'V$Iȿ>!n\¼!6nΨӠgZ 6LP7ӏ4Ǯ˹|W|40瞟!Hj:ϼ/tpws m8[/VR ܗoBNCLCg,X/^aOS ]{i#Pk~֑%L"nf^HrRjyd,ї?fゟStǭ)o.?}G.S($h}p;$7h7% +[:y˯_S-%ȯٹ/.|'oOoYgdkE $I>RLq]B71}~.>+vfae:lb&f4~V{x{GN RQZg=OXor[+RT\7 :u7G3e\]x癙 mL~[;pJQzkЦ>4N睦8,.cP! ,eM@@=gϥO'\ZU;g`ڔ!ٷ]/hV)[In`kRna^u ĞK&Zݺҷ3r&L_U TмkEG0<X_wsךR9[ wy.`}Gf5fڔ ﶥEh IDATҟܲI$ A@Z}@ 94J> K(B2B՗o5̟r}ؒͤF3S'no|pH⤃?7UE!ʝ\Վf5~h'XZv2NJjyOx:G\Hu~|n).^) NfVNII%7uly7a[$IPr@\<71`_5(LǿkD𧕜~$X{o{ [d2<;Iuc^o6Vg㝿tۨ?3ANv'ATxjU S;2\R[{C"GIJ$IԦdZ'y) %ۧף&k(a-ZvkxHNn|lԲN:3!x7{2{̣M%N—;?z(9xkso5AiƯ$IڶPo_ч* ߰O~C w|gP68YKy=t6SᤳUܻ49@_J|)?ۗڷ9P&_ޗ.j"dظ]\>H$\ AyO3s4Rj(Y]K{?7YRJ^ ;f:g euĩXg eҷSgk"%% >[zF{ٽz]%I$?g6C9MokgK$Ij//eOrOھx$I(:u.6@$IdK$IdK$I' o8\?ח,I$IRO׿f.4~#WkI$I$3ڵ]vdg^p_w#$ImtoOW/.:ݺqI'PN@_җ薖Ɛa3J/$It8ݛ=zā8p qp7 DRR,I$I6B۷'))`NP۷}qk$IvѾ}{G~?$IdX>nmq5GDN/M$IU#I$I2%I$I2%I$IB<5'I$ITN`'I$Io>ܮ}{v_W&I$I-{۵Ck_;υЮ];ڵCR,I$I0۷oOMw` CK=:tS!I$Iq-vq@$I ~N`K$I-,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$I$I$I1TÐ1sYU-esvm~%I$K@J ,Y_`v $I$IZ%VǘQ-E+8ebdz>7яp%ś YC%3hh!˪m f2c.u&~-_.V%e-ֲ4/\?i dZ)yejkP!|Y958WF0C < HMH&0&/e72:ƈ/ajWKy ->K 6-{Of_͢+uURH?71& I$I҉u6'=.ωj߹M]2ﱟztѰYYvB@9Jgf=t3ٯdj | f?ēO<ݗB"7ymHX4mg6k Wk2_S<{=2e?&<,9sB\cǸe F ?'a5il?U[!:>nVM +`S,ԅ?cz^Kfi_˴([#<ČA-^ȆX> \qc"q9nG$I -̑c0E>|wU9e36fH2`ޏz͞ K*@jэ؆Jj(Z0@Ա^ǡd^°s#5?̱} M?uݶ Af_CyQ.pjl(HDS|.?Wطp2@(L#p_e[h޿пk AzBR$Gȹ~Vm^$It05kheN#ﰻc1NI#[Qv&3_g!'([-74&pvNY Tkϐu&%H%|W hEk j~w#C/Ҏ1^Glߟ);`bqSF lm{1K;$I$6pXƔed_g G>;D4Pp&rۜ;GUr'Pҡ_jVsϼNEyi@c{P@ğ2sH(w~T`IJc=:l97R߾XdMK$I:ᵑG(8]= X1:#^avA8B:mm+m_ QmrK/W cEi-Qgο2EΤGvg[;~`!좶##'@"p c&{{~UJU$I$đ>/Kde9{ޖy yj,$VjUOG ij(yX]]D#=t°mfMP"5TO|/љx jgӪ"w=q>}_ЏD V.$oZ=7;yA%^ 0+W>jPv,z\Uݼ1ۑ$I/mgV#'PmP?DâL'4a斉>zޔ~dքyԽDLټql3 #e J9??k`|lLU)R̚iw0[2 - KȈx#Ig1?Ǘ3NX̄j>PHε?b"x5N :s5F^&3 =F !I$I:8p6`W^Ot466ro:& rff,+$$IOlXi.;v$))=^=.В$I6$I$ \…X}A$I$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$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$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$I''›8pkB$Izp,I$I ~~:%0H$IR[8nh H$IRkMw` C aI$Ij|8 J$IRH`X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `I$I `I$I:ʹ[ ۓt0o%I$n%Ba=?C@S#Vr_s;$I$Ar_} 9ߛjydҍ,޶͐wF%E R:rЧ%z}hk?rm8eߚA9j;oљW|Gep2q6\JQq%[l$ԙ>͔q9t _#rN|eͼN~WLփz,XA:$:w{Wn~e$I$hpR2TCѭ3yrMq}I_{Ky `O)޵dpLMy-hݨj5Ƀy$I֮CP+R|k9KV>gYp8f5,D(.2(8,^|,^4MaRݘ|Nfw|r?@)JB\Ɏͷ|'X@}S@n 2I3$Iڵ8p6`W^Ot$ ,DӾK RQzk&I$IOHII!ڷ?G~{h$I$5$I$M" /dMiA$I$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I\ $IpA~8pτ$I$m׎:Юp<Bvh>DpRII$I$n߾=7߁m.-tO$I$>ǵ<۵kI$I?${u81,I$I: $I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$Id=g+B$IGYv#CO}-bS֡5\wkYlغ>H w+/a䘡d]XR&L{X$F$3ZMY46'l@>n (kǰ "c5o\gި4ק$I>{K~B6%+?ᇄ.a$ DIqyN엳6xS@{Ow؎lxf61BH9w W\6=˒/QR0iY=䮣l2AJ$I?T9`K*YxiLbw;*xjmp .6k.6?1gs5t$7lIʪKh?]_AZ0(cee,[˰ FNM+ɗKG97 $ 2g5@'9rÐa^ǦIڇ y^[$Q*WDIp#KL L75`m K ,a#+Y>%hFC~P2Oto%j5_wB64 IOfٍL^UG֤98LcSMN X. 41jL5wcY95ɍn^k&?N<xK@tc/@(BΤlţ(6TCƏ̦jƜ}kVsgKgrF?ϲjM fS5e CƟc Pߊ?9dPWͦ8Y_"0o R+Uf̞Լ Q:d5LfL %SD^ )W)y6NգI4TF1χ5 X3' 3)N`|"?U3ª &ͦq2r94ݲgvb!z7R2kB$I]47ĦK<_܍fV[g{Y#91܀ 29b]/I&4=YK6p~V9\{q HO#w&mYǚ- 懷 ȄiX_,4$Y_j͜'IX˴W1mIuI"|F A(/%9AkVPU+>;JePUĉu^BаU#K^4 ,)dCٔ K_O I4䤐Z_6#QUDQe,[# ΀*u_'^¦{eât_9#`ώjj pQH |,ٲ9sW=O>Kr xO/`N%DvS%l' 5Nc}IKc{6Y=,`c H!5a5 ~fH%>Ԯ SOc SV  e,zY )iBw8ѿeQv׬˅E,{=񰧄9$/xݬ E̛Iߖ7A$I־YulJwgtL/BޘW!NOfڪ]D F18+ +zi# 8_u+lz'~yw7YlFJJYj뷼Jl_K| d䘁dj^ʚۉpZǘ/TfsH#ocp9k3./TTĪ[.ԽO`y^8X؅ <$It-eU tPO?0#/"Ae4Fι1i= d dlZoL:Ft}4_jj iY_g?^\JE8-Jic>A3 >*F W| ʉ5_|g `-9Mq83n!)Al=jKԱmg#zgrh4} \$Iw԰'@bRPnF@{~a0sd2mc[-HvGI=15TO`v~З5)ZH:J r#$/#s~g;DZ_m$X,z] F!AFRO s))$5ĩ'NRN9xNofE$In۫=҈ڏAYqEs34PSDhVRT8~i>YTUu-u;ĨĨ}H8ɋ] 1쫣fwhw`3sP@CR[:'Ԣ%paЦW߭`gH#&'jr$Ii4P3Nz4 d pxo6RsJ?.<,6C@S;n;4Ӏvޑh#Y=4Z-/u& ڦ$dQmSO;yq+介(~D\c:cs*ɼRrk@8ܑGh<%L*a©v'^O)aR%I$A(o-\q {PL5ԶykqFSVGmSgһ~e;wNk}D:kHgg]Pc;D}lHٖË'B l)REp op?Sp,_p9{ӸmIPSUCR4hFh۪}jH̨$Ia[Cg&gP?\K:{ ARr$GfJGlmM-IQ"4_֨rH\(A͎]h~lݶZ.Ʌ&|O>A׾cOY9U[K) w[k sYX^ImL󧏡S|$pע."qs̟zIOBŠWYZ=*+coZ(פ3iJ.#>%fN썵pfonrfb?GZr0ez_ %o+im7T[yO9X0s?9yzb*pd{kw YÉܝpp5s];b_x/L"5[b@.O縹f$?!.KzDDDDG`GKɝ7yg,4ԑ!/\fh|$I\lsg?י1!8"N'κmB(>**=b{%/0>a}L[Os*?m}jKvjeJh9:^_ҏz&m3p~*V0-!m|©k8/;vMwtl FDjcA0M>|~5:kX->;%E4CO#t,_ K3`DbO 8Y;~g|`Qȁζ$cS ej̓C5rϿ¬ѝ93k1ptC7$땅L՜9Sw}=ц=Ȉ_$dxo &/$cyWk؆g)LHnmle;1ÉI+Bdb9׆il1>z k[8`lz&N$HpBט7B_bhcAG ݙ;aogLDDDD.=M%m& y)K\gʃ{a;[Fɡ *='SNlBim<3qkXwfBCOcX4)w2q9S+?klnĵ7;=(ȜO fZ<1 ;vdSSmB\N5]z+ӜP;4vrMTRws[)8ps 6?lmIy >Dֹf!6 hEDDDDX~$rWT&~M[(-JdM̼&t;'N?܀x],XIESECdFzMe.J/fvJ܎h;'ƷٳޣƒgM3~d%s25K*qsSQU؉֟ ,!8Tl\MAtBlUo`ڙq K p{p(d?3fxRygxך7Y^QOT9QۃgG!Y+8B|mZ-=%+`#fTR}o)ĵۍ{M9+(yu%)Nq,ֻpPQyWS&""""? z11BZn|G9)I=1t+2{, 3$3u2.|e.cL F3uhP[ߦ/ML7v{L;gW|L;&-Կ#6h&PƤ%׵ ]QKոUo M!Ͽkd] a.WHX#Y!.7Zij5f/يi&qޢ<;Zٱ;/Ț C+ws{01-N~?a f]nTw"ϜH|3Q"/_<xܻ:X+f YI4#""""""zӭ•[0VUW:7]}p5sC)Ә:mSS r濇J2:|SLbd̲=쯎fiL1 .N$j wXLD$~Qd5^ćpb3!mSY>=S>m ӟL򽺪"""""&zusjtX^Т,7|+mxN#oi}E2 o;ẅr!1JBYXں7䴁jyoYݱMRgN"xr'3^]VO+~E~:״ gR?:QsO """" rԝYD|((((ӑuL{ Y@2g?.g~yADDDDWN, m'9k{qgWs`׀dw*E{;@Xm """"" K 7:䦋VMSbB ,m^msVz6m/9e0wRVZqo7:(E?#~;` #)f+c)[{Ll[ypnsnz?!Bf,euYLTd=p+ak2a H?ȄMĊl|5Ț3#~b-`XGƂXQ~+#!ev5d_ϸi7lV9{'ϡܵ ҊvYGI~J>X̨n%q`=E(up3u2 (Y2f(yg|7wID)!qCXT# bGHRoϤHvq5w2j\;dWNӿ7[#//X;˫q[=qcO[5zQewxڒ0((_Mڤ,J@;`#6).veYWxӧYuڕ\5OD=rv M;Х-+?̢d[{0h} LpuUfz6ņ'|tJ>fI ˗ a)#y".Ey+AXD+Kq6J$6)3h{+c#g.kA;0mx w1vqfo/FsquhP2*m(L(\}S~ "&;bD-{e "g-{Vzȸp3-xh9R=DsN#)mtg}J;0Q'5i$1bw;bRSS;vJDDDDX~1l1vYo³&@Yge#wl[F%$Ҋڤks(˿ fg nW;Ҏ~cH[ت|QWcA5JtpMKÜ=\{`"k+۲-,Y| ;q; vQEٓӜ(rG5XDmNEU 'pD0ouKd'CSSSO`<&g̔I=Z2)sFjL8G'04^ȘD?G}*XEَв-a]1!#܌yaIF\2S&&us$Ӻd&TfLC3]ַooKr]P]]Çs]r4~ /GK.Ng g⃼Pږ/+^{y>L.}hS97 W11k^Co?UQշȫ RY0#֍w f⽗ڇWEXSf@_oѝ$""""S$Xr~Yd|s;;ѕyvp75i eGO1m!]~c4/_ߤYt+zs^yћL.1i t1 4|N-;4s0)uԩwy'QuxY=civFX&ǝt՛/+'Um{G׬A(Kgk=Ŵ/9jFM0x9,GWͶjP&LctXS~NtpU 4eidζE4jν}gVc|R_F$ݞΦ:>xm4:v̳ׅ7n:oQ>KbiT%oƫ4kjϹtn;€۟^!X45T[1i$4-/"""" +uнw{>nidkE#^~I'ifz"oH*5y=7P\\{{NB8z]CJS(˯1s ݹm!@CC:P ‰i07y4PmocmW@Bbpv:Ih׍Q{:nE={fҳf2&5ܱU$JXn|UצmԮwX{x;;}%y@nz7FFqhcUD\Fnp-=5 hdm=4hH7ڊc/Ұ!Tjع .M"v.9lJUMń(p ļƩG.78^TӖ}{Wö֔ ikU_tY½MNHݷgUgPScs埵F#""""+IBR}&6D屷d1X';?6~\jQD6?@YXbjEC:a 1R–oN/mhz+lu#r hb{koVP zcnu>MG=^6㛷vүCl+/{XeZǞ5!\$X_ˍvY˶C>W@ծǿdmE_fKk:;ɟ|7{+1""""~P xFf2*cNa8IMi<[ h ǚ[:[bD l[y&Iy^ 'O 2qeK,~4аުN5E=F\(ŠT^ţwACK$X6h3yۇ Y0eh_Sy9PcpanX1S*<8fY:6;m{ &veyW܈F5 y2ylXʠhʘ)Ė7EDDDD$n8t-E9Ycy:ЙHnSydoi ߅(dv3 aU"2ahs̤`O&dõ1c7<cȄx(^μϨ8g{7/Ӷ#HJŦB7 $Õ2/,ވ؝=I03~mqyv,fTz+7g <`D b?RA']B0j?xppV;IŇUl=?F%pLJMe.ܦ[FObdw;aSf: >taZbر &O#?l vfɍW}6'>AJBfd_QIIcx86=*""""3w|US?|s<,x7Ya"!ҙ)LsfJJ#0wbBdp[8{!]-9iv[K\ߩte}#zXlq\`f6g^͌5b`Vd++՗+a 6Q1U706=BK`r+S0xby?\.?f{u$=Cm"7;%b@9:+;i6n9"m}oHƒB܃޹s\8,Nbgp1N\G'"=@=+"""",]0*qj|rr%#7+1ɰu< ~8-56bXڢ9A@5f ')Xickx=Чx&}a6K%n{܀u Kx6}al!gF&KKMmzPmz8 3H o|ALpbӃ`1s_|N?j=߃=PW+;!+՘v>"jο-{Y~Tw~='"""",FH4ݾg(d_ !5$oB $-!g{/`vb>>a?}S:9SYc"κﱿ9+@W.䩯24Cqd=Kjá Z@ٱYr2MRJB8㇐.6 !^juSqOi`jwB|E}Jw5oϘz$gۧ,/B3vONL5}e^ijJTP ?gb |#>cHna5R}[Y:f6&>JG(4ӽG `GTRMWb3]`B p%j tv@EjJ(dƴW?T?6)e6;v7ܾ ƌe(.Tu6.s6+^MozLXW%/s WX~CH&`bv& #4w sp3rj JrәeCg'at,%M]gfb?\ٍn1IDAT/$T¨?ژdo!\_g lfF{̞]I~D/mN ›̛!t8 K 2=Őy N}HRI:{7 {6|oݑΌ1C1`E M`MJ݁+e,HCϋ\ַooKr]P]]Çs]r ] ~_/Ġ5(y\onk-""""X+L޹0M4!(( .Έwo!"""""","""""" zX~ dV_)jȥ`QQQQQQQQ``````r5Gǟx ;w """"Z^}5 r^xS) _|~ߩ|aD?DDDDDUVVDDDDDְg߬,"""""","""""","""""","""""","""""","?a*;6Cm!"""" "u, uD14~>I!Yt]{zI{\f&ӺŅ\IƙW߸i,KNCٺlhaXJ xWal+LQl9<K)Οƀi F瑼lRf79X}N,?%YXJ6B=j$n { XYqj=ǟL!Kԛz"#nv>[qrQ1'8yLLuse&MH:{-ydR*ZY(-5tj4w9{ǐ})ݱ_ϜyNn)?[ظX);ګ%]ڱNпAɒ6{tMSWK()&ƶlVuHy2P:fl^gp_+q1e~崸>0͟c<͝dgȞ>'3rx"aϨ;+ǘxg$l#+3<QwsE{:48̆ L{CRA$Zr`X$qp=sfL=p"""",?jw{9`ME=v{hUk%aߜg2BPy ^y6 ME<Æ,gcz`hAqīSv{4Z Šm7OyO5.ڃll?UW#猛t?1(˛?>OA'(=)ƕ-<; [ W[+=W^d`5 LunPZ ` zX.2R[DE[뷋Ŋu1ug)Iik{W|6) L "RFq5P4/}%H]_'uy+); ˔??ϷxN==`$yt*)nVo31's8aùG&\S cϗ_^QNO)}FC<ú&<]Y+WwGJr]BO\LJr'[wʎwg87[7veC9?[a6.MNgM~`+?O4=E-Cjqk3dZnȆu齵GζY˟M^Kx2n_xPu<+߳? '$Yۿ>?+\ö]9kҽv}6zO/fwZF^e~Oݞ_4,ˆٸ3r?ȣ;^Mn˺3Wh9R]MϪΔ/Xzu3 $9vtxh^T&''sϾ(ٗ?M~;z汰 ból]~D_Fv{~<4XP-;WM-K4Knef7`fs[UsFBzcOܕ,Οf26:j \Xofd۱9ap,0` @  0` @  0` @@ 0` @ @ 0`\Hm!L[x!L/Y4lzds:/Oŭ%\$*J:/ϦG6@8V#\Z]+ dY@ 0`  @ 0\R\EJR:*D_IN4QIJR|;YwD4}'빳ztj94VϳGX h"<{LjimmnAEϯηrLFr4Jrg5y pQWo+SJzw(4/?=FFm͠(ޞ#xzsy}4_ @ 0`0` @ 00` @  0` @  0` @@ 0~OMM0]is= ïl6SRRBVV[sHM??&=h֡C~!zѣGپ}'5<yx 239=lݠKKK U23^POz/\ݱR_i=֬6bp ꫆ەGDDˡCL2Hvms;niii ڮ/~-l6;yiӆ>,^9[nWZ/݋FߪJNűrfB;YY*`0&vj$< ۱llׇ߱I ,, βe_\.jڵƼ/x _棏e#s]̛)QQ瞻N ;k۶& n~M٠:ر\p} ֭?mG.?7tKkMy9&?Gy-[k'_DŽ Ҷm[l6GϬV*Cm nfnIg~]o :"""0yyuy! #F gO(""""^ T'EtˣSUH(~~~ BQQ!Ry nn$^2bcq8#?_Hdd^~U߭&00JX`/XcY_qEaa|BZGDp%= x0 Ç3p:\0V7m榛FAff&tء|=z^Lqq1;wnV&?8ϝǦ7/=Oǎm]瞻XygSS[op-wAWԩ ? `Ĉ寍1/QEDDDDȤ*|FpqqQϥF"#Ly @ieWKٸam "%gRR~`ǎ\~Yz?_Hhh(^^^Ï޽f/_mŠ+'??m۶sOs???sqFVr[lǧwVJ˟Oϱ,_- -./[pۇ}z_@n]X,ҿ_?t:j'///&> .-/Ӊe:c6y λ,Z{e_sՐx>|:ĦM pK/<|W寝i_/@hh9__b۶5n駟Q#~(N@]~+7Gɧ"??;w1`e|ߏŋ`ӧ76lo޼;mzjv6V[޺}!<NLCdd}ՠm-Q88zkJ'zb$__JٽVBhu!ǎeR\TTi+__zm~W鵨(˗;y9wf0o'濎G7b0YM̙q`kK^^^?e_^rNիװznz^xزe+֭'aZ0///.^UH+^f#00뾯S=[:u(k ~7ٺu[iu>6/`o%'˲DKc S^;qin=׷_`Uۺ[Ӵs.`HO+,eG3-HPppf̜ѣGZjUi-[ْ'{3)**nap>h.,_Qiڸp㨑paa!?Wﲧ^7oyw[V~xqϏ;ws=b۶dz:t( E^Uw<>Lqq1:vd >?̨GҊ\NFݒM~[ñlXDDDD\ X,#*=o7YWj ſ^AJrr n%Kt: }QAm##|eHlXv{}{㚫fk6nLhhqZ@]W z z]Zk51w?nXVt(\.[iu_~lᦛFڔ7\OvO?[]c 7'.8N>`<0-[0Lk׎y>ϝ GȴwfÒ+;ޠ:-yA """""R>`G]HQQ!ǟl0p:U ADE]XiنJKK^ >:JKKaժrѾ};JJJHIy{ ""W^yƂCR*[g7oBnn.7٬rcDHH6)LLnA}tժ\sU|:ia43ٷ/ ˅B31;(((` L(&=?LJ_x啿tٗ⣬*:[`d믿.:-Ѩv YYYݡOe#aaaD&IGgXX^yo|7 G,5s?XDDDD\)̎m2б3۴%77^`;jR]] 2ѣpQT\~ F՚H gf[5&҂i9Q֗gHE,Q`O5&҂=,"""" uEZh?@!"""" Ϣ9X,ZDDDDOV!)Hpp+,]ߖF2L&W"!fbn7. ǣN @"[0y""""r~Z3+QDDDDDD7AXDDDDDDEDDDDDD7A˅PZDDDDa #Fo ̢ш //FAEX˂pii N/o~~et:UvSTTDQQQk>>>QXTǧTXTbHr((`0ӸuJȑ#2b ۛ.]bi׮-zHHXÚ`4$##V-~;-5X|:AT""""rVKPp0fsv Պ 001cd]wtڵ] 2|͝ϼy@NN.frs0[h& _!""""猂|nW=X|+fLc⤇ b⤇xo4u ՊϯEs||۳49?-[ZZJ~~i  ;wtƲdb&R\\PvO{ӧigm'zW]Ff`츱7}+W`7}?iBcѿKhY+Y-k0]o :O("" ׫W/z].EEuvKnn^yoUK$$$/Dbbi% b4ebb:Y@܊+⌄aÆ2ޱe~\LL'nf|Æ gfذVii)v{qp/^OFfΜ̙8ƒ qp[ S}#uDs턉7y_Ds%1{oYu?xnшth "D_2za Qyr]w&EK/Tq)ݺummdgea4ݕqewl;79%'?sNuks堁!xݺ)))i{Uw,Z䔔ܩo]ir8x>CN2?s|ĜzF6Bq|xj<:AL.DgA1 f &}ݘLM?&nׅh67Dsw1Ws˰H? VN؛2?9y3uOcμ5KYMt8ޭn*2fܹM(F ]*iUF7ŰKXXXۃ\3=er瘪CkR~WzllӦ9Nέ۠X3fLb{mq&_׿O?租56N'x<Ʒ7~0YYZ 6%%%[fm `Ly ”^gǎMoκ|q8[~Ot8ˁKC|ʲGuja<:OL'qˣwg107a2u Oq|9Om'7xዪ u} 'ơt7%y,XHF>3+0g&ܘ]V6-ok#۸kxwBMR $*(_eej=#*1H{#5T2#ޜ=ED1biiiq6|#GT;ղ˪]Guӂ2?fz3sF24qT~+:!9[oe4,_WT93>%\d۬O;#@Ǝ_</;`f%y0f<_8%3v UtI\NlaOcG[e] Q /|$`o/ykۇt@,27+!옷d+u1ҭ [7ݺ#@D۸o8?¾ X?kP,fL%d`ͤc$CƏ&b|B aӉa"#72ӝ[Mtװ%jz_o ĩ\^|¹d5 ǟB2+w5!I=[' LE {.V~N3K/$#lZ!70ix ƣyoY5ߩ A>NSzV2eue6x/O ggӶeaġ7ey|1ki|G{' =Wӻc8fpdiglʭ5[ujs:~^ H>G$cjaMbUˮçSHv3iu Zv$+׵=~**$;c'+J@D~bccg0ax~, q(-[0fxO_ӧwjU'>~0K,wg2$P8x07w߭nÓmHyWp7hӦ ^gݺQ<$ڷoGAÇ;o.X3vϿTc=3u.SM4{os5wE\I`QᷱARXfiݞ_wڼ32Xf-_Y`_ $W5B ' -u06G᫧poQ{o[2Y%|ۉ[gwz ) .ѫ߄&%lA {5,ӷ^EXӖa!<*L?/Ǎ7e_RlJE峓}β q>Im:fDZٺv i; Gs]';[7|ź b. 7X0o#:;رqr DX~ŷLq+g%^#^>: 9뒥$jhY52ظz=Ȉl<|KXn칀?c] J٪wc$cH˽9_{=jžv*ܗaq\utqxKx5N;f~Lm_^e?*;l\p]HyVy "R xGzR~mv8ƌߞ4y]eeպ {^^8eW t~oޠl٠ ^z̾.ϩ |u; f7mUV$%4f}*fg:?0?aа^f>*.B xV386omP;ٷ6ѿ5*{Sk'js fVW=#2< _vКT;JQB oQ IDAT?Ws*K*VC?:7g9=uRy;qI4$?9At}cBXl}:ndٯǧ{N)_T2r'/r Dc =9jhYc IK [<80(S*=e[ɴV(ku+!.6+VWn<~.M/ߓ!5Uù[Kԡ܎T!-(Ie.CDwrS9^ź3lK4]z!djl{5|һ,|NγZ^g&**/XʒK+ڔ7ɨQ#IKK^n#<{<2LSmVȖĭ޷ĭnȣN8to]~p"|||xoVZl65h6gyuc2xǘ7^gQ,?P2tb2[cܽc[MgvB_rs3ǀ6M6O~M%>eezenj^ZUbG&v`,֚3&BdHh",te"qSI#:< ??d􎎄ӈx!YI$ֱN]_h8A|39:!ԘÎFȰ ,+_;aŕc!jN%-D "ieWIM!٬'[TpBMn| wu'`=WCv4Z[ԋݍף\^fFӸ:2o<5ilR7{?doq*_i¢"^|0ogW ㉋cÆ z-(((`ӧH.]GV1h=%00`e2ىDyȡWAyB<ll6ɝ{ҧnٓK?cw<^  hD4w= wʊ )'˾bG):x=`jq%ٗzVSv]im. 7o=h9^i]@梁LƎ=5I[Dޟ+cO[x-~~űm_. 8|8Vs1o<̌f01t2-]J.]xx衇y㛪9uβڪdC[g]nwQ6>>>\M男7&fgʂ`L'^cJ<T~r ߗu%}Z}I Znݸh΄ l\S-=[SAO,Etd[>ox\pEw{')+75g%/!$?&f/D>Sun:eykYٓTwO[1+ٞ~W3OoۮB` "2Avfd[ծ=26 {h8OK+u|̜tE%c-v[f[ ;;?{j<^;"ABv 2e68ַ5iB>vjy/:]inyVy "R_EEdeeQXTDXRXTDVVEE Z{r]anӻΘ>˖3O1}tfLIbb",[33Otf̘qJʑSR~nwy )..T\.mhҪeKr~0kzFj'BS3|6/ܱڑ Z>֜F^0pq71c^ZF2l6δxxXwJ:{q=Ҏ3}z^DP Om?O`ĔY$*/Yg2FGgge:7xm5CQ7[1 'U(m;vEmpOƝfnsNvkudceRq0`ӧ( #p/ Vq宊}&'m5ٓغ77^9kMI:uxYWӓsQ b3zY?6$S3b(xo&5DžWdЧcv\H",&مvM۬摇_?7ه>ԆxYŵ$g%[Ӫ5/ 3!HwatDb&; c.b~Af8X ~^{$5n θ4?Q"1)Syp>JDUTT1\q|Cio߾a_R<'$)o=!ތ]bz roU> kN'ӦMx͏6f7橧$?;vrUĉg9s>f}޽?q饗 ;wb㏛qrYZTiqvt:B'{ڻ̳O̳Oӳg-\\Kz2t nXY|u9ڨm;qSgጌJ_^sGf:5~Ot7Wy/p;ϟi{9oj$AvH` ch51t aρ el u5\f\++.>p8~n$99/HU?^ɻS2:IuUh0q}τ#dz!ߔ3`pz{>/6:^ox_6K &IeqeJ NʍeJ %?77esu"+)~awum5/id_< /B2[neϦ=D㲎{XΞ?5zBa[CZ@uI寱M9~S{5{WXHkvUs(H}ETTEEE,YR6ֵ^S$_:*݁`TA{yk5{ H_VViz rx0a<g&f??Lj/L+7h fϞ=\FhӦ Sx ܹY:t:]_gr,__rr@xM򀀀J7hubt ]qE~06_?֬EMW$>,Ps~jgx}Tj_~[j{/VKoVN ã3wKa۶̟I#. ;WK2 %%y&7!!!g01+䡉O_d)Sx%ѷo`X[$ҋ/62ԓ5|g0}s-$n/^rNLJ (,l+WE\ݴZ3ݼCfTl >ۣ= eCv=oMqtf#%%;vp&k /--@~^nYWY;#Aɚ9st- _)줤 5M.oK[n=(ewajM¯A~~wٺm{׏eeοߥwK :-u[ZZNhX̝;v`G0Uo>,]VuPLJܹz6Z F#1n= m*aaa:grf3f1顇ͱ~0k6Sh2իfcf1?)҄w%:(얱.oKھ㉪~$3#u1_ 6pe/֧ș 5N?58Lޘ}|<`V2I,]EkTPPć&QPpnrQ}(gu8ϭ%!!(**j ZEnNNiF3aAUv},Us>DD3l jTn|p8 d[*)i-/A;1z[Dhh9sL^&Seȹ jUiFAA^^^;رc學wu'cSkkpAAc M~.mlؕFhtk+Y,w;KJX[{+FyiCx!^*H62ݶSwć T6n%pq.]@}!!3`51Mс͞ȶԩ$;\@'XjGjNMWsegmx i_啞ȽU{q0FĔFү^ؓ7'wѡ ~=|ikOUċB`rBz~r}F_6>+av2Fӵŕx1+#]m;7 8t|\"B#p  nqU`uNDiΙ-S'/sOAGs n}k65czz4!,4uGvoa7=]ӳ ~Ȝ7c![wNgr iD|v=nN`+O`pKHqŽp}.iei.Oϐx˟sbYk-mz0x%HEB1CNB[0ڧ&s|~qth_!Ë p2_8eIK-m>VD@RH""""BQw%g3q{ N p5kwN{ZM{wN9;r7&j C33V2چ:C-+֥!9V8b omnPO Lqt?1!%̹+\\$"3mTv3zcY`ǢhRrK7}WvgeiIt9Nœt`sc)rHN8"έbPVΥ$2t::9'-/dwAmrk܋tWVyj.HKsAFlw6jؐ] Z??IUz;Օjۥ߰t[FR=PLt'ۛcсl; Ndt2"Y/q-[M$HVŗ!D6zţ}4~c|!~M!q,\N)e\F6"[_U;A `6a\F3~Aqabl_߲`f3ࢨ^k&3n+(=B{#'0dS¸8mƟT\s=B|H>vr';=:c/ACI{:1c_R+YDDDDDDݮy~rذ&FߢDVlŽ^lɠ׈*EwpF~&Nr/Ŋ9Ҩj:\|J'6ӱE Z91 |m 2.!`' GʅzW 5(I/\!9)'^:݅9fp` t[ĴX_WwEYХc,\/`fy:lLYDDDDDpɊoֱq>͉|Bh?770?>bƆ4fӷ45  %i{HhX[ښ@BR+v`BXYz2=CĘ؝HntZ#8X ^ /ҏhnitkݖ9Lj,""""|qaɮ*F%v;JꮣtZv2{ʻx[', IDAT<'y9Ŋ}սp4ݮݎ0@Bfivyq Ќ[7rH% kĚtuxGYUf͒]7>Q8Ek:d"SO.VVQ\7 ؿܤ%|"-7)[Y65_qA(];wz:s!٬2d?7nA>Čyl<8}N-]{`GN_>J>t dy|F|-[ $,Hq1t Km LbF"( "Zh?Y 4ot-tBwSf-M1k>~5˛;$ܔ6DD@DgrkX1gkιμuf[H-DDDDDZxycrźgd3eCol%8 &g*iB܎ ?͢yѢ_/F+hgЮ1=ԓ/\oi<0zݺws+a#\pG%ZK7g|3[JxڱM:v}u2p󿘱p9Q+fLJpv.uAElX[68`tOZ™җl2ʥ|ʘgP)"""" YfRF O{}s-_B5}NOFVwCӤ=ZP\2SoQ7Vud6 {sB+-6UGF lEݼI2?G@[xҩK^ve򳎲P6=z޲:OpP+Ux`Nlڶ{Dey7ӂnO'_z[>O:-SDDDDtvS4\bYq+%#iZxٓ|h^|Bq,:E?\'6n1W ob]Tcd"q^;5kHzۊtEfnԹUnM **Wu Flٱ%ujd`nBwo4@ }o)"""" ՚$'R]_ܜh٧g мt]N`/.mI=Oܾ l=Z5+# 7%tCnu 'n|v󞄅6w }7} N'VCY?{A֩\͞wW6zkK ܂jZ~EDDDDWɯY)%&Wl юK3y5l"iҁarZ1ٍkYcOͿtަW%t9ֈl\7hKNg%B6i'9%h֛VӞuyzPΧpӉ%$q1W;F!I#hG}S:-?!9+8kYʶԬFC z^^-s<2KL {F gܜց_FJ7|v kۊ6-[ѺMKIfW|=m=PQ3wã;* L o/OP"""""wK:E:~t2-7S'=tcQԶ[-=zGj֒vѥazVmt.H7vÁ p[Y﮴ ʄPW}DDDDDDKbkUR\gtOxIکl=uRe7'3ު gXO2[*X8[w[S0إ>e"""""|g7Kgw=WY)ĥVYؠ㯱&}QgȴD=̛|0KU> ˰ptwiCTtbPM[)/C0Q/g7.amކ/2] zul|=s& #?r=@lI˷EzїOdO~-?a o["} o YYn`w}G9p]7.A:M>+t=VAYsw2W7eQ}Y;WIOZ9GNVxЮuch;/Z8{:h^κI}s4~[Hx>{gjO,"""""kOdS|62A,"ә?Eq gO!.1n0JNv0pM9\-;s:ңQH:ңJN>A~Ma;2'^7\ḱo",xuR3S(iR^}{)lckQXɢ}饮BZDGkФXwcn+Tԍ!7+PJGXb?d}DDDDDw^O8U4'OC@72$H(ѣQv [CM [[1Qd|m"C1X\L!l=tHƽ#}Ê]o3E[-Y_9޽^l,<ٵ/XoL\S$Dؽ'G`BDDDDDoK7+ZH k("1lvPZ`k2.<b&?}Ǹ [9嬌??nŞwkC{ v)}8[ѣ.~]sv D' 0>קF0.PskʺKcNŴ0O=R- ʂ>@Jh؎9sֽݜ6-"""""w(ۯY:>u2V"""""""f̓ ]ZDDDDDD$((((((((pن>eL~#іf8?;Ol*|5P|{^DDDDDnVZ%j2xϗ6SAޟhs26j&/mȠAxWEEDDDDDkI9xЩ\<ݙ ܀5ssak$\q3tO{ ^fVMFf'z1lD>;C Fuyv$y{faӾ:uNNr^^%v&61,x~Wܱqy&L j^ 0q::'Rk-Vdb?{ ;su`su*݅~>d \& W5чفdg `'ǂNuIINOq YЫSCf:""""""jLhXU\>} ݨvoge[ӋWHmêG3;^+b]hZ>{+lJpW`-0jڣM/X)?Z,Z3ZegP>e@E&Jx [)@-''R-wi̪y(n9*j/]r^fZub|iy6׭QM9735pүo}Vk.Y_*INtwj1&,jhmtEk$= rYEtLUP gz&.s % 1Ư/opA $ 0ՠWZpM/k>glb|2 S.j[Ԧ\lLtώup[vnVln ksQVjx;Ml9HrWڎ3\DTr5k1iy'JM]s؟[Vbbl6~ռ>oM3䄇ū ?D6PCoC9M2#sI -Pӄ{1S wgk#媍+,=5;W霓 &Ghͭ]bL&;)Y0]qL_FBZ f&Z.&.]Kf(W+9$l3r€?4f 2xduјsm\}NՉBoyӮ `+'@^"˛ jjavb#Œ2V.^5ML{p``][Jikh׈-`/2+qd*v\hPFʕBm\ʱQ;oxlH6.jjrds՚@s縦7T6QkѹOP+3 v\P(E7ӾI-~Ǯx^Yq" g:70ؕ)Y_#8_"""""rm[mW؟lsK9͙=7 [;t<ѣ>M d'*Bp!' }iq=D7a=?H-m!PǛR"8Q;:Y`rs៝' (wčYd+C-ڌj{ͧQL`zޫLܛ;(g.%\o'ݬp<") 98қ͐ܙofNV5MI6XDr5{/-K'p?V>PDDDDDD&͚t/ sRsl`)LK"ԏN """""">]EDDDDDD*A]EDDDDD䮤,"""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""",""""""r۪QvjMDDDDDD~sNNN&_ݮ,""""""&V4WjRF մ]l8777W5,""""""Bnnnz)Wx,ݎjU H`Z+unFֵ""""""R]T66H""""""rWP````````QQQQQQQQQ`````````QQQjTH;9n'T2V&m;Y&vi=$""""""UoNƜVr 'ȫ2+^A""""""R5~ēρ>O2z?a6gi6.Y[ʜE8z.:-12D|za~gF}q@N/?&}/<@fi7{!/.eοq\6kNǟcڐ1#"""""r[[X&S/'ajGp ^} N=Skg gt?$H#z QYQ`_1y3+Uލio>{̙WXY+=1+=.VRF+yvc:F3M*QN8G'VY0#"""""rr߿NlO:{Lv˗SjMDDDDDD~sԮ]Ʉ 7kTw("""""""`+KjBDDDnlqrrbӦM̟?\tI{EDD[.s/">`CDDD2~.׌1H_)ѥK'`֭E#""""z;ԒݻiHwa^G"""Rii 111 ""Rݻ1p ,"""OΗUFDD +{yDDDD,"""""","""""",""""""r`K4?>~saŅe~pz [Q(߬8N@?_\3A3rh_=oD?Ak"":DDDDDDJ[∷ҵi*(͕~|̙K{MǓHu[ǟLbOP}6+v+s'?Ϡ!Fbf>ne0f>c@_/?Փk,I_$r!qCCܽSWEpes:>\hȉf%l:Ync&0+3s1#^ؽ.2iBj%w;,S])DKd}8>tڇ`@Bu4]O?_~|%ֱcG6lؠ & X<0*)A<'Afp"E Lۙ]0iP'-7f&b4{cr:DDf̘C=Dxxx駟ȑ#8q*JDDD~3`~㓙g?4ݎHXkb+{e F,RRȴa/~Krbb.u0b@ӎ 4ٱ__8G9v\"rYhǍȑ#YhQK ;7Wљ8N[i\~Gxuzc߾ ",bGx.V>5,~b~ #]t􈈔ǍP~9AXDDDnh%W.Βğ=H ,I+6D' IDATdg׿aXbۈtmGD?oVysH R|q'πɏ&n z=ؽ_Օ '0<34t+~sw@*ן]a_vt_{/ߑӥrbdNB ?[N`ž3`=K5;`۲UĘ= }:DRKSVoB,"""& ~:h>#VDoe<F'}KaC|±s@s%Hs׈?~{ ;ԧsX cGM {Ym?l_{{õ.):[TV~nIy-e}(kh͆f+2*jp*NuVku`mkxnqG0g""Չ ?L"F.<}LƛoF'_I6N~z8yNn6$V`ag'L8Ӂ$"k*\E"""R*%}a/*&'z5Hz2Th׉{2찔O֠EljEp-j8y+e.RD6v$9&61qAθ؟1^Zj3c N4ӫ= rțW#I)6қ [rQ`W>""" xswV旭}-"rׄcWDDDJbRݠFuX$ 3gDDD䦨XDDDDDDL< &듾a{V)R*~o":_!SX|RODDDD~]5&zzu&(ijYL[ӥIO_''˗z_,X̮617[Nw[Яn1o3MͷQ0iv3 ;aW[uKk)e|Wp 2] "׮fY|wl"?[ў<2 V g0>8([pK U~—ك*rg ٝ]m'10vs n-3G38ק˰i̼"<:~2}Tk܀ W]D3e\O@i& GdqDXy6NEYM 1#bռ-gpQm4k"1`WsntEaKy\G1rFQG}|C2]3wW, '$'oIҗ;l*inGQcu?~Tr<0j8z6KFl ɒWj3wFeN=gZl+<>}":)\}5IB5C3-} /yGY-49YC^N%-SQsVHR)E> ?XͶ̮4m $|A0ش!]8!nܗ:Tga p:۶ᅹlX9 bX|?Y.5g M`&} s):= YCۿd񇬙˗0hsƠl:|-^]MOނV%LǮclz>c.d[X~u]aj(\cز0](7f5o,O$lX5n;Y/p.n,D& ͖5sy9 g/%:h>)Y7[!kj'efYә9+g1o- &=҃f\Ŵ9G~aKedC|c꺘 1mm.g˖ut ay,%ȏ!26'^]v D~'3ecܗK̩6Tه&WD&NB$Y0*#hKad@9um$TVyfzu sI߱}e3l,p|>*},U`srzcfY:҃눴еSI8ވOfz0rއ ܆`úa@vy YQ[n5 e?+XcC9XcF3Gv>`򯉷:kED7f˿Wb{yufg}Z05F~X¾ EDDDD~x]\1x ,&TAt⑼#[es ^& ݚ>a`܂2rPY11Rte2qƭ^Y>A%֌!Fwۺ2 {8a x-yrinÇ =:n9HA08+~!䙑tup !.~tA!/`鉯p"1Թ]=!/8ȇTʫ"28M4^1+`P0 Na޸1mt:`OF!2]!'Mt:{mCx0` vg?fX Rr#D0xX u3,Ĺu0yp`^WB+|TX~qƫ]_4r n7AIG؛7kB$schB`!th䊛۸c8z=LJؽȿaӹ?`tZ ˷}_z;~n !ylڪniq'ӂ92zaȂ Cz. A=DDDDnCahO|_zU|>> .bqw2I<:Cڽ3\K,'+Eضo23|ܖ!~ pn`!:΀^Hbsl+Dd}p{)$9#̸ii?]= :s˶UK6[W_.n\܂K+fM\bky}U+q-1<́8gOF:N~zZM ߆yg:mXlwcgqDGs 6pI(/͞@7.RVgO!n W?Y9*_(A.XFӵ*JaGoՓn> sBsx5S9gDyz0aޭ^u^h~َ:9BRf>:S$ϟ/bݪlPfGdd49L/cg~ .-{.a⚭L7uo |a*+yYsSgcغUދrRyPv `oIܖ -}pkóN""""wJuvrr7rL$SȺ t7I ~}cw1D_ $ik6YY[{f͛H|/0z"$϶ ?Sr>5:\zRzקB|Bv'pC|,n/` s9O%]0 dY43Ej[=hb ؝,r,O?{T |1zhxz0}4] ,g6hH0,$%%SSD'XL%r Ҁ`6d 1kױbV̳X. qoˀ.Ll5{[w.cgZ"ݳd cXڡF>la1ӇTbbR߃,rIZJ"<' VKcƆy}.N}I!c~J=`ufD !,S֯-9u8D~u;3>w[ ?nsȞ4Tb}C^ht6 =xSB1/a8B`9M׺cRo~6_eķK7ϊg.]Z;By[YMhV>kՓ޾;㝄ГD&GsRޭ˺HNNl6c20'''L&SG9,q'L^f͚T^;˲ae`^$]8*߁ޭvxDłE}= #|G }!00lp f=Ho0y9-߇'ҹE, 3s1ѡs<-ݏm˦11,>?u_|>tI̜fa{Ov!d aq6ǰ})HA3SNz8a3YW0pc: ¤nF:ا)[J!L:o2"Wzw^EΜ%,[06ły3Ob`ٕ}[6rF(~r7? RLzeDdS¤7_޲,3spŷy0_z!z 3ǟ`7ʮs o| ~EADo9*_CNXq]'V^Ro-ɠp>ȧ93&`h5\D4 \ߧѯM&S \8*9l6|9ofNܾv ߊjpBf͚TR?19m$wߎFgiy{V7m]WGV s KXvK"͜9~ `;7K;7k~V< \K O ]ŘT&u -z_x2n`f}*sF-y?+Ii:RR-,""rgʨqޠR!<&M빸5ۘvջCxyr}m/ӱ$wf """w6H?dmA&`nvf-rK"""""UŤ*``[#k?ӆ<oew؞UqC^a軸C>7zcbn%;llWgX <-w[dͲY190Eͪn+A94 vpKDzĐOH=[dl;(cpo9=@a1/>\Mc楇ѩ{Z\8"~Aa2'M] ~4}̂# 28c,<X[}㌺5 IDATԫ_QO 1ud؜Mg1cQ{ݟ~!Ѻߣ<͒KV^ä2g1p^h,Ή'맲dlNu!R\ I!NF2dtojǒ#Om~g>OWgo80i aC%"""r\`th#q^ZĪE̅bi˸ ]hdD؇s=t? 3ط~n~yse鄻p~6[Le ]cժY5}-}Ĥ/@}7o.)lMd `?+ a,xOe0u:r/[Yg#!{ܻ]>YH wc͌wHE[\UTk/sǽGjyo}):9c; JŞ%^z;\Ϋh4UV-_1pt[Y`߾v#7m&^&xEe+H,7\@ڭ\7U>Z0Y},$35s)s%fgKOergX;9 [7÷sZ&t7^]Åb60%7Cw9ZSӂyx~6l;m0Ygև X4f.y}:_cΧ?`[)A۹/"5Zk?ŝՌ}oYMҹiwx53_I1fY{0@<(f?]gn #g<Ιh|0CsWY-guN|Ej`|U_~ĒڐFah &"#nf˴{`/ݟ3˧V1_&T#""" gqRry1R{*.̂Lǘ08Y96a3Aʶ=a`F8yӺ[*}#"MݛiidE§ioZӅ&>~3Sb+o@^mid`uWћM,Am{Ɩ4 E#nSzw;Iw#$$ѽw[N;`m2o9W,d<ֳE9c` EN Y{iMr6 L֤)7pemOPwi:Ђ4<2WiqѤ|̐-!n=7B;@ƭ/ >7g[>-WE&׃ -g*ww/w64uDӾ%p$ נ^z2מ}%pSp+Aǥw[1Rrd0:,n-iJpy)R7u_uoEq}ϗzM -,ŴIlW%q&0@D{zGk9ж FiuYZVwѮ>` 2 [C(1Gq峭39ߘK<(HEd2QTTtN˟?+A ʢak`q>ƼDҦU ŵudCPd@\qzDTz|ђ;tuq0-w!GP}#yp8I~4l@ f;eK*[~+# <ί…^R " |dʶs>LX-U,<`J09aZo4}?3}p:/a|JrSl3YMe!t~b4޻  AVp]e/ϛ2_%3@vat[kfK=G]f+""""}9f{t>Fa' 0qXh}O{U&mSA=F0Z4b |#i d5{p^;I[5_<с;oY?c,_.g = %3sV@VC86q:}:d8}Em"+̮9Q$+Q12V 8SY-Yݹ3V xcNǞ<ᓅupVyl?ķ'Gw.g찱L=x ~&"ku{\>Qi7|oB )jp "5wFl`I3i=OhY #Xis(CZ@y8SgKIt=p EҺKSKP⮗NM v_V<0cr6'Gvb2S_x #Hw Kw1FHz."wtԿ!w9=s};~4jўgGEk?Kfq4}烽Y3#fndTt#M,j*,,$??V_-"""j*W_zrDWAdT銣L{뵈\NR[PşkU\\ս9]K^{ْT+ ""Wf[f<pEDD/؅MIp /pߒ&S`rpVӍ+"""<WuaSٴg. %ṪBȕ~+B'"""Z8g.vJZK^{Z~EDjN>pUրX"""rA^TT1Kg`%WDDD.iLT|5蕈HʂqUaZDDDF8tUQBgڵT?{*;~u7]}__)^|EV\ ;ݻ=zЭ[7^|E }SU>S=5D;RȮm0[ %IGq{˯ɑYFv'c%YKRxo=klw`3[xz.oV/Sc6N0,Կm:}t{f=G],g`/+ͼ_^ =fZNk^"r߳+""5Yb-Zoo>}tЁF1|Ug ;s òm_dLF+[P<|vmX[gVn#cz2o$g:9WMd3[[Z`yv ewҰ4n2˺&* |Si.,":+HMdž h߾=:t8~7l؀qsNR, gɠm2ekŎNe)<'&?'3l8X@ƒuTn!ˆot:cS:1af6%c䮡f+'7g,`Fr a,V^rM!D=3~^#~|_X\кy45c`Q8QV.ZNw7qDu[Ci_=y[0d 2Yd''yxaD.{ZllXĠ;08`+{='np=N9 QtO4G6AIȸMN;᎘T ~n64jFF]`K\ vekO=Wґ ͸C8Zyb@n1NN͢g-4=syz7zU6 $r'ݵZDDxEDD{^qPdP@pq԰Q%{_{`?9%-騿iUu' Su/)dlNwtU ׭߹{=렬 t5i"""""RB0{ԁgaD[ǗP~@*c[tuXiXςal!K+2-FYu:퀵"'vNV^!s͚FY{2}X~.}Ѯ2x aStT""""""+2c%<(EDDDDDʹZ /8ps87Hti\E'My|u!p rÕ%Oa{KS7C0vՒiܜs3^] _/b.^9q=fih_hn3]DDDDDj<+o;OX:}"=ig+Ys }^ ʍPճyfX{e~i:/c>]ۑqe <|c!?ѾAL. Q˳܌.+=eoO1u1^gے,9[߮DDDDDD n{bS`hˆ13%ե݋| Nú7ϣX4D[Y^ۆn }49!w#Zw6u8f h 0*a'!,NXFЗ2,_׌|uN:*"#G~Pqx7\v1 """""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """""""Z6[GADDDDD=斚/uH͠.""""""R#\ࢢJ_Ha2*}]cpI-**""""""R=d˫uQQ% $B KEDDDDD兗jբVZӗ*_`EAA * ):IDDDDDDF 4)ۻ%RP~!vD33*ʋP_j`o 6c"Nl6׼.%]s߿uvT#&zk VZ=$'B=IDDDDDj\J?T.yrn""""""X,G """""""Zkl'Xr̩u93f/`Z["""""ryl[q!GJp r ǥsHFLDDDDD:8W3QQQQQ+ .T]UKUpM`^4DmS'qł S^,j|]!VU}%QX0XuLIֳhɰ:DDDDDDr Z{.?- ]EKy|=P{!`|vRT~=E.m2\\8a@!? oqعq˿+0hv:~g~Hྴ7-ͱ2vz͞3$S3xzγv#=GiJgq ˰VxxhL翶. RTۛgwM{{3W1oVm&M[Sm'xƫvZwm25 3h~kRؙ-߉GHD ]#>ܽyn1}_csY Їab 5Yc,̂*g˷Q` &Pu /ݳaDcnf㙬~g_{Py'ymmExY^<Ś}kp,mTJ-P_b1%aYV4o@:}N3ʣUәi {Z.L5@ج\l7&4țY?4klv_:kjLѧ4@=Ĺ`dƏĩÉ8洊jLĩL6v:ݝ0v&NH8Fҗ۱Ogŗi3w%2mzޯ`'SXƺs1 `z?f&d$]Ӈ) 2eB_wzFx,1^[X8&2IX@SSv2`\f"slV>llKqL1z),YDDDDʥ?$ s{k_[ԁ_+~f [2KsNSgF-is3a,t]fsm uǷl)~$;Zy,K@ 15fnZ:}db0Ct>.N2v@,=5u1NȁķX2NqoE`"hl׌yKNSsw1 hcz6<`w2m9%r1"j 6{#n/nBh P&"""" 5KQ!~ԢNنXضe{M޾kܪ\m@=S[ FNt>)K쿕oY|iWhҧKfwDD8~qq= e%s?Nn>`GK$_r^c 0.l>;P egYO~%7e* f}EDDDD`/FWZk&|bxA 3f\#SX6 zD:۶q;,nלAcXQY(>qly\߫* pw 7s%qݡrKH7OEhS}zcZY'qϯڝPAn;F YՏ%'$%%cI &. LJ\},y(""""5f&+r fެᵠ$kUlb-Nͬ/W?YHvGq4%&._U0{#+6˺& 76d>'ض0B 8VNhu`)ֹ[x}[dl+*?bE. !avj[JBA̍ovoJV5_b:Fo"v_KLJ-A%P+:éOTj>&s6Ӎ;ԇxQBV瓂?fZ31T\S'k`ogɪthҏ*,ED} ֤||?Yg )Z ә6oL+]Ώ @uې /[GcȐǘ9wf.oBc2,q33?!zЯ%Wo(;'#}>^`c۵ĺ3v6ZuymNi`ZS'ٿC-"""";uԩwW?SfEhaa!mVt<5tOB~7;.I ]썗Uxն]k.UL\|~(*jtP˪VeЌLbvU=~ɾ0dv:D`$-")?>X˞ܪO7Ogޒb%"Æ >&C%-""""rtOtY_Sxy]ɍÛ0W0Q Ĩs+էzכ++v EN];1Aݯ#+]BDLy*nLď),""""RS(˥anٟ2P5!""""" %""""""5ZZh>t.izު.I-""""""|)Y6}1?4:f"""""r9l65cr̩u93f/`Ve61aveɓfdSzEUXXHmߞ b.3"yv?l[fsGE~/c 4 }{9BaaaG`hJ:Ґ%wϯ]EDDDDDFP```jhtwAǗ7.@9{:;\3^ۘxg3RŕAcHn;3VDDDD|sՋ|l.SZo;-K?hR ';蟻xJ7/Z~zq!Oݪí\[o==Y xMeJ+co'eSgi-4  ~;!640hlvcx1'vpֿwdk ?8!HGZJ>Q<b'cvv|BNnL,5Odt\ߋۥ3l^ˈ\ޟ͜]dkeP`cW1RBCԨ{ j3.OȜ\:QD& {\a]ϜNZvzw[d;'n])_Χ*d]4&yN=NN/"fmZ3aѱw}Aʗ/f;,9Йt)$tҜIˇ8 GFX[Ϟʔu\}} ƅ=BN gG"Ҿ) d45+o&n-H(OJH\VH!NwumL+ %m8s槀5{bN8;,C9 If%IEZWXZLgo;pe1Ɖ91cˉ~M'~=_'i.e]NNǨ{4,\B]d89}y>l*pYN r~έ-;??uiՒѣ>""""RB Q)">϶<I\,a dhZd4m#kbͨgEwK0?I_#/M\8+~:]ڕΜWg` G7cTpʦk|X;Ta%<زǜ:4:=y~TGuVz=>!4 㠷ùW4y 3':!y%Y,?ĝ]ɛ| tY2{ְf D~:ؚw$r|VL:w$/9+1~`Y~MX+_08reKI>ԘGfTÌ=tۍ@8k7G\+""""59{Ag!V%;v5O4B];v%vhԽ+u 41uϷfb  ؼl>ʏG\7vcx(X<{%YQ2eT'"}m,]G6y`hG"H?ՎXz}]3ٴ5n/6ֽ?hzP<@[;qY0_w8/ ?2})?\Ւ_~]WFGyIqpSp} DDDD K01zolCCueni"??%Dp?_bb64:̜YJlsLy;^׍a#eߍGvߦX2Pdnl`pt,OESN~w#?ef\t:q8ܗd&H5TXXHAA^ g_{YXw~;`e !vS """"""QC!C *``CTSrEDDDDDQ=7lê4&oPxU7KDDDDD.Ʉd"-fGs[K]u`ˋniLڵU)vAXp_\T \l74iB0\.EEEr.%foooEDDDDD5XfPs˫4W. """""`ɄZ~cU(_\þs˦o,bDDDDDʦT#"""""" """"""" """""""W+i:r""""""rN.`'"""""R]w[M^^d]ndVZ.}kKY & Z """"""0{yyarjËZjI7x^i2 """"""JٯQ """"""rq9"""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" +CBׄ|¼t[ls/l:EDDDDDz1la]8uz+RT"""""R#ժM]2%wM"QR}̛1lݙyJ8Xɺջͻ1nD\6Ϟ¤t9Ұ] 'fɰQn ֯p^řYW-Ï2N[ޢ_ggݚ=쳝C'.H&3׆t7 cd lF|A$ą1F/Xzmf+ٳY)oXAćp<sZm&ޚάiaw.,Fƒ b$"""""}pH7v3W.t4A_,+v"u6@FsYSDi`[=ɛ,t>+)lwr z&16]|4c5tPX Û[7|OFl /c̞9~6n[t-+ ,]3sDd@xI kex8Ds_anv#gK2E6sfg~]$mޓξ$͙~X)M"!pS$cHDDDDD/5 qm%:{w2I= Nm0RSvu6&G>mXÉBx\-:6;!NGk9Sg|(ٙݶÉQ!X@fDBnn`cۺXK|0K<6o..+ֆuv',\ݶ_9As]eSmo|-[a.ǾN2SE6BҖMn1vy "ZJ>]I8["VI\ Q8 FpvWw;] ix:1v8wD^꿪|5{Md.)[,B03?:N٠wZ̊Cy9S^%آ/t"s[ mMa+XY^V`Ր?MshOAYklyĚM.T*G7rg㣪D$lä,bP$]$@!VȮ-baX5bIEiY)TrP066-׈O@V Ad2&NxH` ŋ0g̜sf3fvjW_@*ݿrK-/$Bɕ9Qd?2E=ɍ@|_ir0g! op$ΧHn%Ôw /6є$I$í_̤z-oETW5LwnVb4CאfFڟm%n!f\L0ޱdZֳ&3ZHz 1=zJh q]9[Z¡$>!Uu/$7YBr N%E*BaY˖D ҭ6Y+{S VY}]bh GH$I'ϢD'RBjNeFwͤuC̼ỴaWLfތ{4tͯgb*s&CΌfA$Iw1c>ή]/'cǎƑ#G/R=rg0aeZ # IDATe}$ItmJ_k׮dffҥCrh?_hhI$Iy$I$.t #~A$I>$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$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$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$I[~^$Is7?Ǐ$ItG?|ݳ2|3H$I9X7$I${,}ϻ>N$Is>?%I$.<'&fO\ܞig$I$爌0g6Z^i,y9ɧ+NE$I$>d +ߺŒxmi (b$%GYK:~Wlvr(qz%YQ.~}}tG(3ړHhRG5OlSo?rᔌ}]I$I2?ɲGGۏ~ܸb;gOgnWdbNddD)]n΋w'5l>ƲU0Icd<v~t!s)?_nMl}r-[7mR^!$Iys %cqC_HZV&?˥;jK|.h!E&Ap4ޗ\R|u[}iYov;x1dpٜ*ʫ/7g)|~XUn@2H$IҹfI3|yHjYO}ZQє&~oaᱟlbן\U޾c<>uO+d ϟ'P='Dq< ΃,ҵ9ԯʅruW8-{XFe7ʍ'HRR $Id{>]8neI&V͐[PsၵW $It`̘1Lg׮?cHRź ꯿~qlf&I$IF>O BA@.}O~}K$I7$I$p=MeI$IpX$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `I$I `I$I `I$I `I$I `I$I `I$I I$I缏.WA.4|7|Ǐ$Is){/ / |~+ ..$I$ܥK.>ف]Z] }WH$I9]GZ\p|H$I>z0%I$I,/$I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%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$$I$$I$$I$$I$[e?$I*oclɗ_<g_brӮۅ%_xG7mG!g F1qugaJn  .&7≓!vVO_HMn)pgMnH]zE`zf߶&=I9nOI$?ob+i̺ko w b"D. NKl+t@w_ Cb=Uɶf||caXn3_$~5C0gD)9쾜99;sOO7$I>T1e mb+μ9%9[}u[y De'5vop7?YZ4ͭ]M譻"(g]NodaܭeΩ՚7qL)yWR[8M&$`ѕhp۬1D ,fK2fm_ֲ|FrQaZb( Hr`15' #QMɮD-c05M|V4|66Ӛq19W\ǭ3#"N=﬑$֭`f|KN$Izb1{]33Ģ0M'Z(3VWh `L)xqIŜTz)-f6bB(BވLy4,Jc^˔ p?P',(ܳյ;!,ӧ^C^z'5cz[=)xlfݖ#me1BES3:ɧY} м$$U/N-r>[}&`bl[WI~`F~w=bւ^r_vs¯L{.gNlc63T5d2 4%Gt3}uM!g7nJۖJA=-z޺P0qhz,$IA{C4V=LCQ\d&nZSos:ɖeߡz_W gesiFq̙Tt1Z\gtN<@rs}Ĭ𩑼ޑd1o6JndKfh}z+4^[ƜI{JŮni.=0e(2 e;[V?GZ)\?D8hg^5CfsY&FI9_7Lo_w 4 Q4~2Et:vΔS_|q,}[Ⱥg6xd9`o쫧."r4 $y۶pt$w7₀뛨"WR !I&#FPtQѴOޤW/#D͜ W['ڿdg4+Vrw3 |ـS@nDsx>};!b1 |pt#'l% N! $ڕ'^S(D&1YH$ۿˌDz6RmciTHeDdF$4+Gs} ^9N2#Nض+ o8{3Ӵ^3{iA>p|)=bs3 %WICZV=UόfE!`C) o$#F}r0A2 gq&;Z d 0=1$I>,!㝺$$Γ)^r@R[[϶45=Muˊv^1yi>/|:AEܳ6^#/ܽx]RS@N h޻4ig9z+A RLBs[T?u3wn%M%SƐK vnɃ;Yy/KIj̝p#s+F&!LB$rp[Ru˗8WJjJպ$?8223uW[ {$Eр/m5Rݘ"\8A4@$I=F2sR"մ#J6Ϥ`R)?@wQ/4u:E}ٶ6>98w'd(n쀒رK_ 6buή]/'cǎƑ#G/R=)miĺuٲG;p !5fToC(s.iL)9yX2ym]~a%#,NR0,:h Ry9鸔R!L/e`/AI,d8%K*1!IM̿q%4ї髖_{ezY$HR;Xޘĥ0%œUqd DzIA%XI<"ȎSfL{u۔≿8B׮]̤K~'L>v<w}H$Iwf$I$.t(\r7J\$IΞ#$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IIqṸP/햕$I3n(I$I'@K$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I,I$I,I$I,I$I]RY=,~:u3yt KZʹf\LtL9pq;.p|F MrJ`!ZI$I4S=6*^ł)zKϧ(LDu2\;nhpv˼ss8{V%k Kn᳿Yg$ ʸ?s\ZB9<M)|+56F$IRhf!x`H틑%7X3m};pO"L[nn'_OBm ai{i'4$LEc>i(0æ1 ijh!ES[IM榫r#O,Nj%|H$I\ĺ a;OڽzG#6`[fO22So]Dն5J|½s0{= Y= RW٥ә4a:+"(aڟvW:w=M-)bO`~LL_QO"my(MɃIѓHwȌv;D/1SFy hL/5$ItR"Q F!?"vw,I_4=%?fc?fѵP7iq@|o3}xTRWP~ ;xr@EU5,{y7CY~'Y\^IRYœF!E6}-Dfk$[ }w˦5͊$I$AWh%WB]fHLj3́זR+rM>;i|靪:ND{ڣ"#qSQKm)h3aܻugтfIZ 蜠HW0kDp^ms>[^XO~3 ~I~x%I$%ɍFQ6&C4>OFu ҼxF9@j_JnŻ?lЩqIN9F(fR{c;|`z|b=&6>rx*h`viDkWZ!JkySsD(+n$'I]|vTF=>sϥmW'mIk#/Sot]mˋ!$I1v$ a BSܾD3 3+Rb3{ dF~Y!\(ElB}ۼ;NR.c͜F3A$I$$I$$I$$I$}\*Jn[Oգl ْ"ȾC)4sli[iZ$2G3">ٛ_Twn`{}-g"})(g^$I `}dZ[{&T4['(ovRWc.]9GxP4e~j(+P8G},}4@&ܭ#(^I %~sGjX[ .pf-!c޸4U~϶$R;ÙWS6>yV/:KkBe_#V,Osz8'# ld2ߩ)W˫ Yuz'R|%xeloqOuNϊp|Mk1I$}(Y͂Wz-Y>J8r IՃ]vc5h b@(3HRxdiSh2y: "L=JjL&LXFi]\ǬEy4~싂pCay?T:E*ͩ|SIbZϪNffm]Ӵ,eOƩ;)]8ףGRm=zW% zSqukJOl&vdK$I>OOM/RɅLx-7-ɢïc3qNw8~J~Rq< _L{5 eh~_LNhuC.ě00fȹ*ݐe3INp4ʆ7ZhK9CKvU -J~4Lt`#vaw*ˆlj]G; )$Iy#Ɛ7b )̈c8sôvq㳛ήLIi.m%De6z}!r]njǵiU•37!ھ|˨7̛=qG2m}-g~S8g)XOY^]I*+BS1u8#Yӏ 23 jT+i[.cʀ{d1\IcSʸ8h ty_mΡ0`K$A*So9{]$۶ĈWô: q,Hm!glPޚdAVώDFL`ֈ ?ֲxŬ{43N?KA8'.%t[v8;9+PkfN_Mv㶌0JW \dbώn=)NDo#C!,~ťs).ì^~/?dzV6AFwŸ>o}`&^~$I$X:3W;*I#>ߴt4'OVؽNI|s>Lc,@^9ӓJz,NWM঒C"}9m}ϫ7i< [izt-Ͼ~\#8Dme՚3]h0-,}x"Ibo5Kl΃liښ]y/,DD3]7g6Qr#M$6PUd9NGY^D2Ib&Vyk(9ۃ׳ﲴ1Uo1ݓφᔌXgc$&DO$I> ﱤZ}Uu ZB!L{2uw8SfaeL2ĽR6x/еkW233!oɟ?ӯ@K$I$I$19+讟R䊐$IG%I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$vH$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$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2Knd/1{]ch='϶4cgV$I `}zDh}XM${DYN\̢9g߿OuSH$I\*Y ]NE DtB䷒KهYNR=)h@ k$L8xqjK3ng٤6,cUm(7)s[XϪ=$‹zsRtIŭ}~}f%$s28D*+7';E$ItqXg)L6o'm2:&gՏ\{b-^̢I̓O[EwgF^ı;ɡAL_%K2gpw8CMϔ/QZOܑC]'IS%c@:1vA<_of~EIZWPp0VՓ(CO&vȈ\A/4C4W,)} *I$[e (o-u['hjvuKF1gN۱8UOMI|u)? a!3P+OߞfdDn/r3J$I+wֻPp ֲ;o$Y&@`ɳ4vmbCTF=_)@K~.Я-B" ̳J9d=BQqgWgwh NTI5$+JnV_qlee;7OE%I#zw$?ή]/'cǎƑ#G/R=:pK]ky~i& |~\ [I$ceܦOvJff&]|;$?gqXDܻ' bʼ$I30 C]P֛33g]=$I `a?~ωKp]p'>G$I=v5Mm?CT+F}:u-\shtbK$K^Ig7~ZhͿ3mCj9v{cH$Kp[[?xA4/l~C냻Y?;[~'G%IG{Ͷ6v&/eJ+@^lksX$)Nsͣ'.飍`é"NB$I `_:YOI$X$I$X$I$X$I$XOkx! l{ %f>{^_w^I$}۷^{?;Nw.bzʒ$Ix G_`kx2֕7}ۮ k^$ס؜WWx~*^HwQ _R )` Fh#QeQvf.66 (cQ  "!,P"XapHXTdqQ|csꜯN DA$Pב1/nBh{<{l8m(چf~vyͼ&t2(䅫9 lx'HIM2 dGK/D^x饗x_2e%It8^8̺-~~%_3L Y$rN$M7p~ύ)qUF+%c4fzG,Ң E38 fP)ȩ LoIBJ'Oy3X<#0i]:rx 4Nnm][ /ʨAU|~`N*wIԨzhz-#:CސL)D2((.hza#ޣ%Hp|*ff|6TD;cDy4g6KINI?I?BuWx'}pZ#i1" 5\7~LFFÆ s$I `7'Xof̓ WCP&mƍR捛WucdCK7ЈSbMϗA8\5JMUkٌ>>{,W8~O#͢ g}i'+(IJ<g'T:<#$I)4`[Lf|j_1o:-]logF\paK`ue=θ)rbv1|;ߕR@<):{Ԩ!,mzKcg| YIΤz.Sʼc7p )\ & MyaYI{.os|CV$5iI$_ڙs?`i<[N w\84 _I\ i׈@{#!/dOH-iusx-k>EQM6$wpd#Maì7)qTt%?8?nq_3L2sI37w~ \DrRefvYg8?ņov~^%(6Ǜm~K܉?=8(3yrr$]GBNnBL']y %%ڥq4SI/p g0ߑq(I$}W޽{U|QXpԟrmƥ kڵ7ߐl3Yf}M& xQ2J|_p\$8/ 'R'H_avF:u""Ǟ͛y s{yu8 $IQ)7+3=k1ಳI$(pXzyI=*i!i!I$MK$I `I$I `jԍ:Ͼ\`HО$I `DjԨA5hl i$IAEFFrm?"cϼHB$OFԌgnw~EekVł5IniNQ3*`I$X?eGEE[K ٹs'/IZ[(X$OԮ]HA***ؽ{#cdd$5"""$I2u4"8`K轸^K$Q_%I$g$I$I$I$I~]v?ph+cW.37x^[t$lek1o1P//]ln~r(o^eYP+I$:<<|D/ 7|]ƖŃӭ?.>}76%t9aӎe-圅Tz$I$Iǒҡd70 I>bj7:uM>FJ;YSrnkkݐ-[Yiگqoާ)ʟk_@*=z—Q-:v S2WmjAw3K ;VfI~wc ڕ6ĺj Ԃ0l{/޷AwLjWyz$ԍi%pJ>ŝ?eGv%quV^~u bZ!7~8k{K$֯ԖU49ZjRرr,= $!b'ϼ;.@x=Ƙ.魴˙+rCs4[B&-mkr~׼Daˊt/^?dZ,\)%P/A9 {ZjM)J3ާ5^hX vST?` IDAT}ee ^h+ ]|w]xq1`c99`{-tN;iQW޿8zߖFoǘ~fk,~h ԋn%qg;9l*nUϹM@IKB9| OWo?lz$I2%6'vB>K`;Z{To~+=Պ {+ "h! E.܎5s%__ݍ[g7\JU_ɏ8ǩF2>u[oͼS&-r!w{z+nVMmO I_/C`@w)z~&oIdv/"*>^)MO={Le?YDAhE>ŵhyZOv~y,۫8uy%awel-C>Pم/o~p1E=kWYS/7o2~Un%(-{i'y+s8eo.wl#V39*fT_-lB9ʭlٱ1Uc]>YM`㺜6ZŞCof3zU;gryP1$Iqyx}ڳgħk5'n=.sK u3˅-?ƤsȟqwԹq߯᭚ N#]2:, P@ӆDQХwޛj]H-1󫁴lK6r˙;@`^x{#"@^_.]˝iP 6q(^#fgpq쌹1{nbz2ٛJt^P0֦ve-Z 9)2^hDl &cern`rҴnsZ78*wB<}7u3QݯwfsnoneI$I:ݻ])(X GI+++)//g۶m\Z;NJ-I$ avF:u""蟐|Zbޟ[4o)В$I_O↳ I$9,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$IeKI$$I$CCZ"BIw=/qp*3~LĤ9eBs5p g˜ˉs{XEGxEKKI5v3\6'LaIQ0hp:=%q+ۋY[OTe# +&sO7B0pϨsqiӖs9?OzIz"36$Iϗ3:l%<̠wn7J@"7^ƒ;aHs/^ze|V2iԞԶ7[FoCJR;NaLHɗ}ll+Hmi9y)a2rYmKb5gΨQ?{9tl͜~KRH yrhki %X=[!>rzJ]x)|SF׋pcG>i<ߞ*g Ke9(nލ1k]#P>Uw$I@ 5~Qy"S!7Ev2}+,څoo3V\R %l.bc}`gqh9R.]seq{#4P7Y:WCbΙŴ2AʶC%ᇯOEnbŇM5MBWf1PQHG(m"I1Z1o~ye)/<7pJ*Ǹl^9s^KqKpˑ?釯9g)s&퐘;$GӦYD?g/(s= ߞК)Oc @YZrƇȪɻSYSd. ĶsYQ5 '1zlu){q&..ٻySCV1ĤCy)CE)sw Zߚ9(^L੃.󽣁AbOzJ>ŒP-I$L9V6}[lļ3΀?t'T6;&BGI}7 m ]"_g_PJؚ)cyscZJm;cc2ĶFڞgQ؁+ sƌdU O=13o񓻓YoSkI߇VP"O'c ʞ|΃8JbM0H)Et'2ZfX<5b ;= n*]1lXF@^@mqaldkR5b,%«賂?̌;E$I??5z{Wn VEaQJٶm.Cv~X'seqXߜZ$IǭavF:u""蟐|Zbޟ[4o)В$I_X$Iw׬c;wӟ%I`I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$Itt8~1ٯOxI$s7mJZ=\D Exdg$I(++cgG9 2w$I2u[v I$g6O{$I$I$$I$$I$$I$$I$#14>%`$I,`a2m,ן*c`ƔC~Kry奇x+ǧۗh|kLa|7{9c?#pu2m7%Id 2_ӕ3gWfĸLI9o 3(bϏHG?nә*>H&I$XXtk 3 }}6s+%mu $Ț~fS.ӳ:㖯(fB8i$Iґ觖tnW3+0'p}]9ba  6:voE@yfL&7gsu?-bQ etEQ iC mŇROo.!E۞KkMcѽl2FVېxQq!?-lH#87$I3E KX@H3R-S}تhVHkCsȞ_B錸-;ߕGdpAf5`m~Q4lY3f6gsMzG?sLSZ$X!Y&Mm,K 7@o_Klbiqo~m'h$zs7Ӹui@9Er 9 OCQ.j]g"!2IJs b?k9v"YAgo#J҆, _ː1Z)wqǥ`t2s 7O去Itb6T@}I$8Xx64~Z,}Ra,hwjN`ˇ<}S ŲX?]N#kA}W׃̉[ɓ\g$}Ws-yi'DQpJڧœ4,! hCr`)J$}d?sټ)+HiJG2l{~g<8* gyTZ s $x? ' rAL VU?"Dh;NƓ%Id IEo"l^˚AN 2fr~wCL93g*72s@!0 E-Ԫ`*UVQUվ\R̈́@h;6`c :u22ǖ ThY1}[߆g ˢ͇۳HX† _[5c V:ZczRoSAVU/ 2¾$Id)h})]XW|Tl&)'@A(h(C\L-UT=jxKa t =h=L~WU l?kL#yOM Mb l3&k_֯J U@xy#W֊ 47r9#@͜xn!):Р>L]fC!/p&\U[qxlC`Cl, P(7Xwy.VQ|_O|$I;[͑$>E* `za49;@蓅tECl $uJ$8=Ik L!\se>3HsޯBkt-HO۸0]osXŧK܆ي2HJXagv%msNk9SrelXn ߧ MٕVQw>}h,i>r~]?$?w>$D犽a] !:2>+귣O6<9gH5]9enEBd)9$I2ui]NO]=HW 9fڡҦ<2*\+R֬ hMSsɞ4I!x>+ ظp}sk*mG%,4!3Es}(&ϣ\Ytfh6:Lfy̕~^LsYR'`r}3@rkiA;^KڙN9-1rI Cv}0Es^`}QK e}Z LćZ :iBgLu,tjE9L_jJ$ݻ])(X GI+++)//g۶m\ݽ^~ynekĤ?hc 4Z6~Jgil($Iґ3u\\0*(0H$%6glA$I"X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$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$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2S H$Ye H$Yewys$I2u;}{: =D$I?Ѵ: ׾Cp=\ڞw!I$`I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$IEp5 !C}%$I$8UMB4DDDPF_o_ 6VzDH$IqjJJxO֬YnV8,I$IǑn_a+(L͚5i2z >$l@l4 ȑ,n7Gda9k&:u ^{y7uu~KNf3~Ni媶AEYY999$nG&5ʺ0T:㸼[7|}}8|0[nLv_ogN'++7_ #++V&K54J,|lszگجà E U.Z IO#:V6}&{$ջó4 <OOOveZ2e*Fv2rpf?=:7~-l"{ iӦ !!!|Y 6o«[/ كۇݥF NչrF"rrT`MX;쥥'Tvv[l6n~Ana Kp:t P%% ) M\.#_qy!n7^^^gݞ8ne OO6rCiժYYYұcj]~l3i {bSO霹li#>>ʋtء2֦}˘G?5w9}||onjh4۪0͕m6[e/y~~>zϱ|ͷ,X7nrѫW ˖}MZڵ +IL܂8m;yxx0~܃,XwyNǶjUˋ˻E_s.V~5/lذQG*/W_-\v=ܟNyf}\q_41Hֵ ɉk5ON_^}ih4r>t,">wNLrѻ~h:uX~޹rL:+/2Wվ};}%c |+~s|m پ}}\Ųe_ӻ,Z%LLLO֮]G^=yi;];kkם)q1<OLe6 kOӨzCUAOڱ[5uj^cc=9qb wǶ"+;FA#G(-)6ᕷOQ\\/쮶,<ZqM9~!~H[o̦MYz x`<<<_zA-Xl65U;VשԦ^oyj k\ۊ 8 `v5_}Uz8|X”ez~3Z""""=MV픽[p@`{ׯ8pfeي1L1ÇM`mJ̦͌?<>AII E6IAÃ[ O֍u R-u{ZZ:ii.hkz5|{c}>>>l߾{ɖ-[:z}4N'=ztgCԦ JKKԱ# ,:u} mAA-˯\j23Qt5ħ U=<ͦEDDDDR.//חVnwT^^ɓJKKׯNAIJ^\.>{/Y 88[ >WgO2F.U^knn6'nnr"88<).jH8Ĺ>tf`ۇt:ٔl7o~˿rnOxyLF۩}>{G'?/=\v٥U6e}4`ML&ڵkܹanaQTTD\~s5/7h~}O ׯHS l)))z^NaaAPo a\ѫ=7UDDD=zڵg餤څhˉ/711%K LLLLr|0}&{Xá@^^>aaaal7j -kO>GU_Ny#3>url:ECy3f2cL23Ch|:HNL+ &+" lu&ۆ0tz֣}}}ͭ{GקdR&M|Ia⥼v{G&E W^FwvҠׯ7Qn_GEMٻ'>s^WẾV >lf /$eފܩVL}vnw/dFCFffm˜2⟱l'c;?^t,w1iL1B^ k?O6@<\KF#g.aؠNH\O7^=NršQLVf~XcMt>ѡIϷ?RsE}+.Cl8]ĎVf;~/Mc܍4Hmu&$$IIgˍavݔW>lX1К=\uҺ#G0gN&Ś>}|}}7l߾}g?⋯T.{GyG?uNfO\.w_w4{~%7{Bp5/ O~{I$uחU' {}UIe323IHXE~2Y[==5WI򲓖z{G`$>UCԾ'fæc'nEK=9&ZM\WR vk+{;n (PBRN޽ m ӷְNDzg9ˀ;UIڹqøS.cuIW]˭?w5Ί;ٶnN}B^o3Za/gJ;s =p[]$y%d/^B"*Z]EDD)ic=BxxxII{زeѿc9rxiii{913_l<*Գ>O}&mvV}%_f}ҷ +(3̜_~ڰ-Z\mLgmp4xp|e=wp?_^tYpkS̙3O̭N]:)[x7H>4>u *&}ԉE_.86)){lvoO`@`  ?vU=WulXtCr׹sgO=׷ugt8005 bcPAb0JtΦKm{gWL`ɢi;+&=2 ",I,_T|NQI]SJ(~ hWfR K'b/?/."* Eҳ/ jG?b"+鸎s~yB/"2SSѠ"GQV&Y"ϝǶgHr$'ɓ_g&<S#;S*̦ې`b(;ÏLku{pUחmXqY߻^w9ǘuĘ6.d;71ۊ^ph'ϾlYDN7}lzydax"a#I!)h#亃d;m*[o'7+r)tۻd%mX">[\g:?sᰓܭɧYHVRRLNN%%tKt4%%PRR|[\.ge۳ӧ`<$͘i3HLL$11K0m4~fK.f'm(u@%%%5Δw>>}&99ROtr啽nVA-\d+YGd"},>uJe>=#,;mO9*'Ú]_9L&cLa&)Sfc޼v = =Gع#h߬1_B@ OxV=)+)>5^ɞ:߁L֊?n99Tz[*J.犾WS*`FW4NeBbK6iDndbgG=K/U%ywOnn(76m֡xOm/_@$p:D ;Iso09,Hb9:R+V&8Ee]@xH'؏5UDDDpHcpщ^q-Ѿ}:Xې\8>>wF3FEGCVﭩ'>>Qptӆxzzb ο4) l۶믏#__Ə2C͞)c? ݻ__}r3?{i)N5k~OFffɯچ1yktܙg}kC=gEhK|:OMoG޾tRN;>^e+/&Y.r|8q=>xa'7#n$ $s2Vo]He,tlvzoI,6W /ڃ)Zˆbr6r]f!AxV~L_!iU/"""TNxx8%%%,^\1M7Xy$_ZO~u{~w*$kky$c_y0^|k|V`:<;v V3C~i3?EQQ1?c>Ljꯌ?T oL} nj& ;wt:oӦM1Ɯ9XZLp8컮$X[n*'99V sj7luulv U]sM,<) ʧ!h0SoĉOO||Bs߹s$qql_OX4MýI|<{4=裏eVG-CB1b8=ztgʔ7؝T}L껭Gdcw8?!ƍW~%L}ʞƏWɰ6mJ䕗_mXI{8)Riә6mFy|I=-nRu3̈́AYGvh\5Lw0pNoa^KdNl6˶mY0a vqߟ#חΝ+>@_ży5\ϯ4^H&6b6ozʀˏkz-2kUr|}b0mDGG뜒0~Vkmn`4I@@GG^=ƛO{!,, tG>XK3:F6[uUۺ]n Fbdg}[#ʐ5 SO0PXX?[o/T=ZP^03I (I~^^i-1vF˅ n=͉7JK=͢'` Ä&#P AIPZ7Ӧ*ZVO7eKKJMz/0 ky8]N|)++#/bB\~#,mepR233OAZIII)&S@\N qtM[&L \.__rrrp8jsl&8$b {~O &=ART\9x4wۊ!EE eeeG+l6g0(0Džq 0oooq89]nn7n5hÈY5=(-c `FAOJ=\N.'rpݸnLh },"""""","""""" """"""" """""""I`Y s*""""""r_~E"""""""MBaaYo{Ej5ZDDDDDD~EDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDD/^,""""""[,""""""2\p.!ؤbСgzEDDDDD7AXDDDDDDEDDDDDDEDDDDDDM%""""""M֭[k]{5.W&((((((((((((((((4 @I8Dơl2ea+*>gǶѶM(amZ>5]:w>WqȖ̯[8lKi='mڿ3ADՋKDDDDEܼXV[I)E$pQ02:uwör.N+o./\4ZM[w95@z&ΜC⶝u.aLflsoMےi g'"""" "Æ;X;&Y?_}dž;j~W6ݐ*u&?}(K9y,nM֐2{t=fEʿ8dݣ4kX wy9|=hnjh,f;SAq\ ׹)=mjuEa1=ٞ㪱KQwa4j,xNZb$qb=Yá6:m'.Tm'ove-2{J^vK|V*N7#5 [Q"[R$Z]]^""""lXNͯ1o(Leoٿ}]6GHLG-A- SaIK\|9nMiE39quWtoV/3+{#F2;OV,݂CeiK˪2.;׵³d[2s~>wZ#/{+àx9x[bs\s|Wm^4[MxԱ᫼z|S|J_~5k2NZњo}0 nEEs5oCT`r+,x)I;x/vryk\O7} &HtK!]6mR,y1]OX5-ii;]IOGyXIOݗXmleo3M7t*?Ip^C#2{&}t>tJpG2;p,} 4i m"0?38չn$""""͔z뮕̚)f}ʬy6%!&!!qO P:?oX'3fWu 7+<7PMfD۠K8"1@^6%Ed* muV>v# (^LJb3yG$;Kc+,tiorH͚+Ცe9szⵒO|em. K/o{$2Hsk"g`a#&!7w[/c߮9umƚ6=M/stJìcReڋ7Ҷqlpڝ8K޾@t>|6RJb{_o>lK; Yt ˒8T-a>t } sHLU[” Kuvc+CZZvg,g1+ezx-?|%Hs w [څ=q=ksOS {}q6rO5ȾXO>O]N)O! u47e܏lxɳrd6S]ێgX284$eaҧýDk[gI[=ʴaF>AߜuTl 1a9U!D< wXLYߣL]9rp/ _ ! u 3CNa[)[&O&ip)-Xl] pRR\tzפg~R$i3+v!\*o66UK 3)Gw|Qw[gf="adH-!juQnfVDk}?yMH^$rG:k8|x>. q]Dd4 b2~ad+1dhPZM jF1l0l~tlŹ;\|ymL2 (A̒@;L][ $`n'~:Y?^qt Ws^EmlxۿΈb 5fZQtrĖ6k2E oK~+REDDDDXu[w@Gl1ː[O?{qU9VDw#PѶ]{.!;ieS\8!78h{a6 XWPuI}\N7|0["ڸcR{v탡1w)d]l˼]ɨa$kN9JF sJ^l_KLX*zR:q`(5)=8 צ+^#a\R@0(KIbջħ,!\H/(B)s9R-Bn#%{Z yGҡ<7ŹFnxc'H3IskqW]m l Rs""""" M+v0+GaRw&uz֑;'>ˤ~y.ά)1kzn8 䑺k+Co+b;;_7bfInղia⭉vWهB.h윚 sIX >7_KLxg7p!'=t9WwE8W B=q'iXy"kfV.Bi/n2.;|>}i߹lٯ1l^4> #?-]BaJ4!$.!~> Ѝ~XxOu*x-_I_ٓo eܽ,ae93UwKןua`Å+fvǃcx~5+ NLHz}_,4E v=0L,~ GY{y{{qM}ѭk@ "&ͱ=~V~'dlfH̝^-\&%A*e]yd%2 OGF>p˳ nE BBiې痻;F]A'b]A_6xps<>;4zF`?pɼ:\ԎoHncuxױxߪ]|>./WDDDDI~ezpZB[c99II.Mk̤WMe/3Peqκ߅;;\KwrkTϿAvW5 .uE nà%d:\Ê"rc_p` 3OHNi8HjA 5`!⢶D#vXwG^a[2o-vNO\ܢ&s͚oM~ y]c5LTt5m]g\Oر72$1ݏqXo?DDDDDDe'Ϋo2wWQ!wI3kpe$gVfa˸q% 3֬_^8XǐaAģ<~mkDDDDDDѕ$kg?~ ͵e]na3Q_eNeL5+ӱN5ioLJb 8Xp#a9iŌ%Gv!ύ >`"""""\+!’_'¯h IDATn{)T%RۑіK1AL*HcSf]I8@8̒);ħԿ}V F97χpcݚ&L̨/.  %yA|2}|$ 2byHHJP-EZJRPZ[tili*tAmrX"l9XEC ʃ{@m  b#!c$3sH<$y^}ur?]};u_7tz~_1>;JV5q(QJU)K$I2\ v؅w=M#t.Ϙ^ jv^g;Q cQydB|WӸ늏ۻr= ofWrnO,I$Iv>vA55'n _w$YxQxk#v띝x7ʮALa>C{I"WtkbԞl[)ye]2Kgҗ]泵w˜+2H$I/3 Ehܳ1.[ǁ&KjYC.{G轒9<9v9tqtou~Hـ'bĻc}6ne߽=?xg8cl]1 cgR06~_T@y %>|y7w=Fڇi;yi׸_I$I}v]COzm\n&G>ENb4^eoO'+98Vo2Vc}~:= 1ð;)YYA$I-B?NS]¥TΎ=10/Bgs[)qK3yZ55faΜdWu™,]/eٺsqqn{iңWVS| -I$2dH>b۶oU$I$IBUU6m:}z{^hI$I%I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$IRKlUϕ?%Nq$I$Hkװ*:}s\B\$Idnlߚ~iϕ_7k rtdj n^`I6`!7\?vIXv-Nm elh{]m;j]$k{_H{T6䝍 ݊Z6T'C+~d+X*MnW2g^ܝ$|6µ$װ' nŷ\Ƙ!y;d k$`:rW$It4䍊ZhM\V]گ_!m(}esk {oG^Yr%l/;:Nl<~55Y<9<܎V_xC !VUϵsyy̸ qؿ}?׵eά}߽ /D╬,T_d*`qn_NQzлS$I.\ܐ5kňtZ[Y^㳵V kn׆kֲ:ɚގZtFb1 -W@4 %s_= SUձ d64QUu (g Q!;έ7~Iy!v[[3tɵjXSu!Y ukb>O,I$IaM]Ԧhw8U3ɺ`PIƓ{~q]2EmUɆZ7T6_:j@mڶ9d3;GzvuI鴺>|-/蚟OgQn &dɨgƾkm[<>]3 O'>ꓖOOpmiזY_[ 4$ӛ׏[˘_5:H>I4ބ$Ip@'Y[皼 A}nI?ȢpNNְtGúcllӊХ۪x#o~d h&/TnC]sc,J ֔zTkձ]|u݇ ae! Zs>HIHkn&$I<ȚhoF ?Ԏ%>ii Б(_zvץq˸6#0&Hav蓹[6#OV;U2zm+涆Sܼ0Њ&uh,2,]jjݮ%53nS ^ |p=qp_wPg2J߭@[@sݗ߬gl&:H$I0L0ŋsu?^z~6mo檫b„ 6ʻęsxu%;\V_Jf2goW]eyl#_7So}Z9YqlϏjv$2Ϻ>$I.٬Zr7Rn~WZEvv i>:9fQ|{h>.=[X6>Ͻ3m~߰;2C7Q1~hYə<МdJ^rv}\ړNV,#I$_KXP.|u=}dM\M.P dggyapf1(b̏ǰ`U5xq1%|.rރя#fe}$I$]!k>56\HC_a>[Wb^nS?; +ЂօUR6\v7gZI$Im6OCB2M2mӳ@]zPXXH\QΑxA8~?77XN[;׸߁?>˔u)&:RN7#"Y&3Bm}W%I.8{1pVW/,{{Nw876>ctL~68PoSV. xa:f$I.i&jQC_9ңR64o䙕;OyߞdڃS6 p >r)u$z 5MKl&3|{NDΤ>$IҢz/),s:~AƘ-DK;]5@3/!+QX7n{e36]6720ٛO>%yr]q84N#I$Ih0Wʷg 1OrǴ'V&kٗd:V}m7 NR-2|(&I$[$I<A iii%H$cOMSc`$I\\ s\:Izz=5Im Sxi e$I$Nfwi[2\PKN0A(2N=4 w$I$53yYjk/8iii-P^:6&I$Ijn('0n{~;Þ%I$ v,I$IR\+VYb[ 6KA ՜eW d؛/I$yj=&X% K2{kƐ$Id>]KzuZ$I${qZ$I$$I$I`I$I $I$%I$I2e2}_Ч}f2#e%I$g)=!naC$Ieqק3:;߯ . 3 WlMB> 8UJ6b@0D'AٮZ&lMsR#pOrBͤ[;}'3nV, ɽnw3>m]gS EǞO;]ݑ{Ԛ32-m#$IdPtTU++YV2OЭ l>Ϯj&8@tBmY@Z@ϽZZ6/Aq6<3L9uL7Lx}&XAe081mXWD}-Sjr>=%'=$Id$h$"Иivi@Cػ'w yּu:n{=;R-^ds w^D֙-ǁaL~tTcSe'C!)^yQI&}Hc/nOs1=q":1l%bDFG靼p=!q.x/cK} !:) b= 煩\;Iӟ$''u59ߟ39=0eOch2<,/=a9w5&F_wR7N|>3rfL_Aw7E ic^_2[:P%%["L5NO8qO$I CIV#=1#[cֻG&:3R\͂Q2YrɡhBLI~)SDς#R6W6|<0F=eT$i^C IOc((uxY:cLyYLDڶ!g?073_I2%NI˨bׇ\Zб1A3x<э<5afЃ$36yL؉$Ǚ><$INI쌅x{O2C0nHyvpA]-kG?)7vlKϲ*?{ًjƢ/Wl+?6ZƆm$g_7zݰUe,[ýq/eYS(17_%Ƴ۵泹beQr$jŁN|2RκVlsI-ܟ+sydgCzM cAyn5=q*^0[u}w5/lh5pwUKx᧌C698d1wNOL,~=Nޗnc@@;w-e9(3o'˼C9}Yq$_y)cDь01<׾3=~?w-"Q+ IDATM ,'׍c3{OX+r {(w(bט1^29{?sw<1~F?$+?8$Id!C)m{ &IҚ6,t_BDNՓ:XM"^K* E@(`z+gN}`d% tSJ"-RsCZL2rowZ͌s()ތ΢/]7o)UDHN 7hlq{-~Q*!K~]c?t(R1Mi'0H$gEԀ$I!hH$I $I$%I$I2K$Id$I$,I$IX$I$$I$I'v> OR',I$Ij^ ?O#R)RdgI$IR @`0xs*j!C!7LL&ߒ$I!  IKK#---1D"A]]{j~w($ILI4=I2mKKC_$/+&I$IDEu5LےZr Bt/nw懼$I$ pgVC^{qwIKKk5HB(ѷ1I$IRsvC /G939t,36/I$%&8Kw qA Hq&kN0$[6+t'>F2&b4'd1 1cH$~tiW]߿`kRI ā5lJ}T]{! Ƞ= vղ7d{mݞ;9ƀȅ{+lo&Dȶ97q M2бf5綼 `#<8s WU.29StTQ4CtdNc-GsonO O$I"ֽK;PU?dYMHHGӳ>A6>*F Ig͚*Ri<:"ut:w,dOSӭ7=UWJN¡eәkT&ׅn7`e? XZ咟߃Xt;WN̦_ye9Q@XZrLDټqt%U y~0 n ~OW8B7q%T,|}!O^C}|!0Xίf<Æh-$2ȹ.&~?9!r#]D:2:8'ndcsY cgT󙑌P -2o/1UD^Mɮ! ?tmYAIBz6OO^$I pNV@,K_l4ݓ`Gq$}Yf?h {q2&VNV֑6*Oj>ӟe33j.9o3>Uۙ7q,uT&  b@QVfKrO$ 6r-Idp]ӡ}z~W Չp~" 3G<|Q^Ϣw9a]Cl Ϥ5G#I$vB]~'!~xSy7č<;8Ӡ5ѣI;_oqbgYẀ=ɳdj ʏ錖a[%3ٗ'簣n 1WRHlý'R=_~?2D2ֳxV\DA(s7R d]ח{W†)`8TǨNd۹+_õC]dA:[^YlM9/'*',{5Ζ T*3srԑn%dRpm|"ROlr"Pbqc>JKYz/ƀ96O4taMxe8Ϥ1SH'ۃ'n0x 6|qO; Og{g^}w?" >8~BsW$I -/lՖf٦} R "qZ3/'Nv B|С%|~$H˾`lʕK(ٛI?L|;l~%廩x7#eܗgmԩva[o$Acƀ#ny,y_fsyh™9\w- R1-\JE#z}<=6N<$-y$^73F(-R|ߣtYsܗ{=M#}ҟ'[?9IeԾ'ܷ6>o? ;}JH$D!C)m{ &IҚ6,t|qN tkyB2f;š<6sĽPT<ˤ%zˏ5$IZ?Nz7I$IR3fwr g~|8O {%I$N 6 㤥|f B!.kG;# ގyI$IRsqU&ܔ?*sY P 3*/ΝW$I&-I$IE0<<%HRPcR)R)AK$IRsC-7f>Ԁ-I$IX>/$I$ A@$Id$I$,I$IX$I$$I$I`I$I $I$%I$I:Yx*:gI$IRN|7JJH&?K$IO ßST % dd2I}}=$I$5``0HZZiiin!' SÔD7$I$5WeB|8N~'9xOMi[^ yY0I$Ij&*Sٝdږ &ԒL ~ }~iwC3?%I$IL^V;ڋ|-/NZZZ>oA:WGᆎI$I:y9 [ߎgI$Ij3K$I5׊U֦VM|B5ga>!"K$Ijm Vgm >êޚ1$I$Ok^k&I$|b^k&I$,I$IX$I$$I$I`I$I ja_澹iFȡcȼɰ_fK8ce>QE$"f Z8P?'Vu :y#k|_OD2kܘ1JYAE7_YS%em4 `Y!  dM;crnYͲͥ,\?!F$ Ogtv _G5A:]fAzg&ؚT}q` RG'`W-lx7`+2hO]M$^~a玥,z5Fέ1 rfʅ,ۛIw8{rs؛Ct,6W$Z ;cm}PtY( m_s F:ƒ3ǐL`]es"銗3Sg/Id>Ww qgvǕ, IRh`{z'VgWE5H}@:6YSE -GGdpC^ba-@`t8yPV~zκx&~&^>2TS_2l(#H#y b!MCڅ^2ߎ e׭wbx&YhЛ/'ѳb!;r0tl!ϯ`:" cFPج.Ri {? B[F2""!O+;2,6,/#|]}])Au7wxC;7o|^x*p=oO^c/3x,nPo&wQwǟ3! ,jUBAZ1BeAZYXfWX,n*)iX6@`7')m":@'F'8c䆙| (, pܙ{|^|Z Pv) -ǽ2L~EDDD/7 ڈ'nbuqWŖENhcu=5Z9;O6g|Ahgi .W@{7Q1\w&ky|` Y4pIZf ^_?w</KWPF[)WE338#z%BPQ7d- B Ql*AD2a|{vSr{>WQDR쏼wL9’0 3NiϰD\U’TVΎ]P'q'smEOw rm멨Lm7Ub>7.;Ր3;(ŇLpIb'PʵK>dt8gkEg|"DnH-rv~EDDDDNNȉ%iӇqy0ors|>yoE.8\&6S9Z $M`ipil f E{ cU+gkl,qN7W\͋p.lUƒ݄r>a?~?#<ӆs1 sb[OaW[HE Mgi(\@p ~v'kSycd^E eLDi6 ] 21Ov/Oj3o>"%g_ ڝ7!pmSMۘ3k)/@m03Pș(K^O@B"Y>,С:bv%&xbU]' ;a؀Xe`0 l'uD2_GyiIƨ`HlQExo@}= >@Ѽwn>qևvP\h'Z q:ۿ{'op}=>GsA硇ݶC""",l3f Eƍq|=p-X10Zf|E fzYL|m;3e+sCjk~k_ۍoj ;tAf\LJ7P$y?Y< Wf3*ZJqOO{JXl]Y:KKɺ12l cڰ]@$ Q!~iӘ?wFGL6(}$d}g Xe Nnf+Y`+bc^; xy?$G߫ROt]S'^Mmm 36 4'6el'ݘ/B-U&e+)ٰuێ_}Pꫡpηۅ) f=SpkHv⸨*r=s"eP[͟ey,/ qI["MɳsUuXfΚwq W$(o6 ~ƣS=1#qm>L}G1gIW?9a;}I2'z` GC κ"""" ycՇm RZ"aZbٱ{a*}ny{X]u-6{O^ry6_`*;θN9ΣT} o##45uvrJop:YTWO(lr0:geHw,uPTjote3+J8m,لHeΤsˉC,dM%T wC&ux}uT{MHGm͇&~6E(Z?Џ[ >>W̍7\ \"fV.I)X7 0HJݼef*Qf'kFup^;lf)t3ɹ^*e(_[#\d+7nwc!#ɞ91:!(%7)O,aZ0)R;n$"""""" CGLDDDDD*N4:f"""""ҝưۚlجtGnXɻQ3 p-̽E}jEDDDDDPUQ2Y,V+C Htc` C`ZX, Ǻƈ&nc ~ ~ ,"""""-h{|fX,l6NC ~h|MC!`""""""q=&W'Xl=|bm=ɴ$;HwaZz% km̖ZZ ZDDDDDX,mq ] S \)A WPH`U(((((((((H'zVw> a,ϯ6DbgUoǜy`["ןVߘn>z1N\>]{ؾ'#*"""""=Ə~#Fك2b~!Qϟ=,"^ vxGW7_]+~tG#{S=  )9a2Spa5=~R}:זmC7; 8?~TϑS2{3q1i&֔U!L :ԑ|ur._ѡSDDDD27w\JKK1b>|9}殻bȐ!̝;W yY gOįvxgٳ|eM"#h+H8ZuMV+y/hy_xWz;O>C/*v.Gwu\۹;뮻)w ۷o_~js@<-~ZQ[,//}Ν#_h /.}.`tU~NP+%2~[KrT 9ګ!)R=mߛe^vRy~DTp} >}3Ggfr0m[8`zT4\y:Z:*Ӥ̶nש\k,79"M"""""WRJ2a {o}&f7'L)|%!Ԭ˞`'%ImݣJI}UuM[;t_8mp:hla5WWR'KcqNP+-wV V81A]M֞zR C O@ٿ%kvڇY'tSHO]wgrS"""""WjX ~/+l~p8ONǧ o;18N 0\!{\ :^זw_^ƌnw˼c_C 5;&2l͋n,BCw $r8p0˫&M_=@%?{v)k5!0btX ᷥ"Hc>b`Z|IpkȍD"D"N<ɓ'۞H`ZZ'KZ477QS5TPH'Hw1cA&W'Dm",5HoT+IN0nlk9f)w%v}mc4>lә%"""""$9-<͍d#6H!xn1tgO=%B۳H7p(,""""""u haջa>ᘩ՝3`+y7pū/"""""Sf =1CDDDDDjNc&""""" !tR1````TԜo0a"*""""",=Y̞ f};K(*ZMn5k39g&˪t/85[ȾXBOZaUFx9̿3x.:"~+Gq.ID"cscX19\ɸP_YBq̔1k6P呛aoHDDDDDgYgpG bepw~3;h9l|q[N]OKP6<30u '8pnσXf}ruVց5GqLx/z a3ծ Q2js=7ܛK """"|iYx-@y ow da`g|A1|,vlqZY2)-ͼqJNذcl;T݈זRX>s;ti6F2obu>2҆k(`BEYjێW ;>'dGҰtN#7a/Ec{~1R^>pcΓHsBe+ 0$:9D#""""W DNNȉ%iӇq@4l(ۻ<ܜ7Oof[Ljm:<0E  wBT@l*֑ɭ/m,)ދ߻2nʊu˴8SopƜq ưc/匏m$t@ Uun ^x؁Oa  g>NPwxPEfRZ{D37bðq$Y?Xv=e/gɑxc^d'MЂ9 i1WnmH$ϗ- 0sbr;ˡa/}jڻ;LYv۷ߎ (g<ȸ) +֓U07>qV>rfs\2xdɋd ,֪^N j&@a B {.Ud=Fv=|s,ۘBA[;""""eJb!'08lxK?ulD>pe<ޏ{.JIQ^ &6QTQ?Qheac7Xs&6L#ˣsG:fF*oװūB͎D\!m6| No]^*c4R^|`vw:x)h/ls}׾Z - 2&߮9o_-W7r>LIJ>Vp$o ֡c#kjD؀M{(P8KlB.fESfc?~7$'cP*>{=C IDATw1bΔzg}?.>FGL 1ܷeOmt'4xN?׆tڻҷLHV/bM]*>Ff zgX0067 gr/.[D GK3uc3s՟>$b99K?˖X^4@;n9] L˲ŏǝ6Gꯈ(_lګ#D´`bc5cUܺ3|aZlŭVЋ~Z. l@a``Q{JӅp<0mq;tWCyJwRpFg%ÙuNvV#U} )ΙCY},لHeΤ n3wbJr;y=g!krZ9H: ˩L_Sw|-d>~ uX8ܳgO)i[o:%-EyMFٶ?Y,ʚ8n-'-.F"Oޔ;:; Q|JmY|Ż'nw[OW VIGs7HO?wv/Tx3Çv ׫,-+ e%i"&xtKDDDDDDEDDDDDDEDDDDDD/C{3Q>#8蘉Hwmkv3oaG"~ `%FCDDDDDoa-S+""""""b`Z_EGBDDDDD[ՊbQ>< o4Ft6tco4FV>TKoX`nl0G#;$..džK6˔bfquBzNFk .8`~1:fK- nI%jF ? .8`6v\QSŵmȄo0a&糑(/ZMQ&j?[X0Lb}mƒL͛ &@v 7x+zYIS {? 4Gߖw%Y:_G$OvE8n:%H5Y~rnk3F2gB{=5+K(012&{~ͦJ7% wR}O֏adOFn ^yb(r(w<1[Xu4,@$p&33(zz)e )I K"/3i,kcaSr`HCsQ 7{(<SwR^\[K(E%Wʿ@z-[ aGxd=4{1Fmp xj(\`Zpm/ rwBN,L>4بY~{甛xSWL|+y2gRn3L iK9QCtvvəAW#(hnҢp<㎆z6`X賥2e,33TF `m ^H%b$P[i% 3lUӰ? TM%@k)͡e6E^_V Qh( |vz*ػ]w=JAN /8'qS}$9j#v omYKwT.⊳`È!zl.-!'w(P[T XY1+p ^Z8Wjl h+~^ZOi$7d`zAj%_i3w^Ocy(l邭81ƸRt*},-<^aIEp6`֯4 `Hk{״D3+o1#-Wxms/q;jWĂG}[g/Gh0p`9875}%,[#IH'͓i-XkʼY^ Q^ZI7N3R&,K腘WO[v:NGt`8!B&pvﭏ^h lu^-y22i/LIJ>Vp$o ֡c#kjD؀M{(P8Kh9ec?CfESfc?vCr25ob[p'#fhz Lʮjm|cLpd?{}[XVLw"I4smpJ9(}$djbMZ'Slr*c䯉<0\P{Oω0l&k̩TptbH25OQXe&XkWGgBf;)m8@S}=W+Gp\5n[˛\4Ly9u–Cά0H< 3kr9%L,{Pt4|BK$L V,6;V{/W:?Vϭ;V²`Zl; `l TvqgW[&~)4m\C+)Un/s`ҝT{3.7_atV28/08F'6pSٻ㟙L3!QL$%ʃ24I>a_q{5խaGDZu{z?$[M׾kˏPPpn˶VFsՀ'?zԥC_Sd) 'd\.2d `z ?- -ua[[!.}܉G͟S~;)gjPG0w͈sB8~㙕>}OaoﶈnԨQ&CpȡS˅ᠾY;~.}Q[uv;o,֚w&]❸ܱ8>EN|c,aķk|x,!sόT$""""OA=fTmuy{^:qqq|?.eڝ1jԓ,]OyCjCW; qwH[z@;kqU;a!3] 7:</ӭ>""""r "LOL6;_BP~؎uo+!v; yk#|*a!H=w`##/.rdV7X@k^Q""""" "c%!F """"_}py:?̨`Tg"""""Ҟ60a2JFvŒ<~I!""""" W*QZ6gUDDDDDD'h$:պU""""""رZ7`41 WwϾvji>]:t}']|pĩ`vX8w?jǧÆ6ʔ`d2qٽNJtpW-~FL&Sm`0Ĥ;PuLWH;WT" 1qc6[Z;u6w]Lu/1$p[|gЭLo(655W~) """"""MힼՎ8~ { Rs6DDDDDDڳ0v.Z~EDDDDDڻ1TSi|5+|8Sj:mV~U""""".= *O]BDDDDDXv:ՙ(_GjQ\v/%) SpE.f 6,\|_Çw@YbYQ5h", YՁep4"i6 L|,˳Ah,IN_L8b XS!X۟] ,6 qؒ^&5Z?M""""|8$c8]`|[ospŰnֹhjrc>ę"h|##0) %\`.gfV|^O䨑 mc~̚=ßf 3_'悹**`*H&{wR!񱟒m6KXpb94ee6ˁ Ud92 ^_&kw1'OĮ^`~ۘx}ގ\6YM.p8A.kc4=a79z;  0 .Xw#{Xf$Ʒ՜琚ժKʼ?a5W1Ik IDATwߕ76rڨpbgi:X{LJoAm߽䗶O/fֽ'HZjR2=A))3.2_ONqLI"hܼ7 & 1w;%H8[!!i35$a-b&ec7bqrWAb/Mm{!q-9upVQK !ϷNcr3͵a1xz:  &V~VEgd乳ã*_VF'26>P[QDq5NO0<?yLX(z8mF͟{ a 9me-#?Ayy)yPpzq57L7_TH8={R䐭g^-aHvDv0Eɻ`FfE^X#ࠢ,EƄۚOfjvM"u3q6Z/V3>N'KK)ok03{aC-_mq g?-o]AL~y#nя(%ttY^c*o fQLIKys#|Ү6B_)>`ӘՁ%2j+S?[zv/+ɤ{gMH}{ٹ:uH~ AM(F㼁AeAmVz5]:m0Fk4 t}|);m܌ >B"V_zro l_ʤw?{#[nXF/.$r'Ę.-zo<@"4 OH9s.73{6jb}n ?/'uLCLZ!r w'soӘn7{ya]D>2iI%qv86uB6f?藙8 i ^ϗ2߰z\Bwf =r5"""" 7iKN;uyߥNOr=0*) ;Y˘ۼO:Nf=Af1c  60 &XIK|(}MzHU[ĺ`ˀP+Cױ0y_xϻdl$peࠀ|=mXLv멵~*TxnrDǤA!`cۼO +A{)ZW|u ,gCf55NzP|3u^]㗏x)+#{>v8^39C7 '{@J.+NBI$_Dzp6PsJ +9~= ˢlxho7pš[C +2a$o-e>;>aGyb\yZPp_:K=g9 8;/؟*ȲRj0T1w栶AeoHk5uz_of[.0lM2`140Y(KAƗhr0XLi;Ec^:0td+y+v+6V`NbR뼯@?LPI,ӗ\dd^g)[>c ;^kH@gnVpcJpIdN5Nad}w_0 I|n! _eh,]4PKwaپ*,wfc7J[ l h('gx`y>]wj 0LM]M-yO0㍗083]|৬1(؟nI/jm&nMɨ"6|}F,-%{WV\`3`b,p\-!$=t݆8f??g(,`ߛESۉdƷ#OK_[+Oo9PSYEF<ԤΗǶ6]#'n#V3ʽb$12L/_Al<({ԎJc)/<~Q 6_ [S$ yt }װx3a4QD$~}׼?X@n~CLq`}t&3&b++Jɘ=(,]zM޲ c7]EF)Ȟ8[Lc$|2ʫ!?(jdf|78I' ϖ1=`}.i,ǜgO%sˌ/',3 4IL|^1IOi&f8fu7).\UTF.!/J˨orqh4k1k-% -Nn 9l3_kt9zllzQPy’&3d9+s(.)tjY3g]z2"嗀N  T] DZ3*(9OLح$~[z1kuizʋ_q^9yZM0Цޤh*2m`r}ѤN +lXB;!D\Kmٶ*o˔6}-(<ыEkk~0W]zP+ӟ["H~~.ɭ%~W^cjyC^ch虬{쬰'H ~/\/|8ouId=/"""=QFn: #N].zBWO/\hdNGV]HJh2jl#SɢbӬze  էǣ/99B7^K,yj>9m ~,ɊǢT"""rsZ9SٌxQ:Rw\;)vDDDDD͛G~(..uׯSA^&y'?1 %_ a}Li<*,#[ͯ! J2#|)?My?5;vSaw'~`RƏųhg0>9'$.Ċ%inYˊM{ [%ۻ0q=f\|ףٔoeuҍ{L)@cV2gsJg1LJ,EDDDDځg]~yf.k{2l0~Lfک,=HNAri?'kGX9k.{Νh>9G=/Hljmg݆O/xYvZ-Iesk2vy :fŖkQgf7.EDDDDnΝ;eʰa.+[ls*d> / Awbʸx"(UY;X'X z,I-3p xï%j0Se0}n }Oc?G? ῱x<1n%{U1g(g̎p2Yz[}MV!zUFЀQܿl3r Nb=9.;WN2#S`!X& V2m $ƅRR ~IX|\|ਧS*zߍ (PpoXC`G 5{kn e1oH{5V27g;.^E*e JbB#$OQRzn\B \oX8G n|/.}gw|[nЕ/""""AB0{t [Zwɸd_Om~y>"H~l.fuQ[} hi='jaokS& _}=f_tͰa~ol`iW '4^.J؀,X[VQNdHpy"l$u.mPwNHKDDDDDn{t.ЖnD|ZQZF#][uS#x9 ]jdNQ[zv 7ɳH2dҿēCG^+L]|*Ao[Zz`s jo_+.<&S(Ӟ$ ]<_OZfD)X_ edCq{#R*V?]""""""7_MaɒxV3 (FF#>>>|!;N:%1|꘮0vrDb l6w47<l| ?! i' U_b*Iη,Π[1L2ߐQmjj¯x'ZS~EDDDDDڛ=y=Oql,QuQgQa,]`C1w!c:,""""""#k8 {WWpJ5՞u ۬7:AbLzT׶(MC&PT}K!s{E>i MAnDž3Ocɼ9$?:'HʫIu떯aMWwz>Ab NmL;gQ <6uEP0} N5/hpmY8= ? r֓z;+.% jLDX.s׳lhREl+]x+XgXzqǝ%>cqУBcY($ !ñBݷ?C@Xm" Fx7%k=Lj~DDDDDsqfI qv?a?`s[ӍT}3E. ~FF`8SBK0].ϒͬQ#Ù5{x?XggOsTTTTf=zoMBc?%l/ɱ,rh>lW~%s¹eX;MbO6>]/hM6r- k1 *ݼ IDATW`l/8%\vqy1D /\& 2i,r{ns)Sv>n`0]`G& MHo9!5Ufyx "ҧ"ջ%8(]]ب1sW_y,%ԟ;:f,Cm9d|fk b4V+wo mQ?a= tbmnf94z[ۘ{/mk%ڟ_ͬ{[O(JdL{ SS%gN]d6*ы㘒EиyIo`MDcvJ3pC~C8If2kHWs.fh)[g'Lˊmo,5+^|&?½C"Zrzz#""",Cog1CfVkbt6}M`y6.SSnQp(ܷ/c?x,"rZF~x[OvHPik(J|R>+h4kod}ċdopzUE![ϼZ#YOF*옉E3`$w|!G#AEY>ً 8X= Q-Ǔ5ԔbDv[Vogmd_,}g,}NR`f"2/%{CR7 Z8V7\~[x$mT ጙ$}y#z,XGj.p*(J#mk5yI-D;)\p3D25w_ /N_*ȯ_c)y.) Lyĉz">Σ|4FܢwQKϳp;U$A9җF>$]mR})71{K#de7V.ϧa^2WIxϚz34s!1u.3^6 Qh7yʂ l {ji5u(?`&ȯsh,^Rv۸3eH}j D0Y-,@^ )' پIbFyagɃL}f݆^dO]HvE9N1]fU[z3xFE iܻ8r\ -og֋mԌ)ro\/~^NꢙLʍ x==B,+N@1ntE|exC~G}d!q:g4sn>AN*C36Vf]V%Hel7(WrzjEپ n5>֙WdHZʲ}6v|Î'^E|gt z8spv^?-Ue`8c\AmߐjrXؿ̌'*\`db2cia`QQcƍ/`4 6g)vuaVzVDVlbĤ^y_~X/ȼR~Su|:V=TOqAy{w~֐3}9<1$X;kÎKNea#`7B k;X5-X~i4`&<][65ۗ`/32acqfOY55[cP?AݒH_3ڶMQEpmCg}XZJ84g>qo0YL.DZ?I|/O o5d+?u-{'@I[-ŹyR=wxU_O'ϲXi@ vg-%(gGooCɭćC{gg^]Oc@1y뷱堶(YlA_wn"{|鯯n5o'(?d^G d/^Cz(CDDDn^j;?&'7|?{ČIbd71'6^53xpUQbƔS$_x;ã m6@~,H?8#a Lf"i> ǕshgOs`*:Wo1%MfFrVQ\RJ%`ZղfdEQ_% >q682f rUPr [cIO o9-ٛ)bzkr,+v`XQMIT~;ye6  ]I-6Wذsw, C≸^My)۲mU 5%)/>NmZ6Qx?5֐f+72a&BV?3OD\[OKЛ3YYaO|x? ?:w;ͫF_^p?ēh#;z4'^DDD{ Fr79:tG]\._ɪl3>-d.}JFEEDDr2^?f?U[]y^o޽N\\ߏovglZ12=7}tK"#; V0-pc&i^DQuotoXȇ[7:>>6߰A & W@8ïx1T&"""""NC@0c2:l &ø\.]a""""""hlۑ[oX6 k.Lۍ&"""""N ywDDDDDDn gEDDDDDc0DDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDD >7} T} %eowwOLtw]doã*?g& a E,*mڪwZO_~ԭn-jm`i,P %@eF (%!uq]sf9sx>B$I $I$Aߖy.$I$A3px{A$I-I$Iرcѣ{mqq1=z`رv3_WP UD!AwGЗZhNkX9 i_M_ܳ(?yټ2q܀ғV>AQ9k_3 ֗o,£SdWy?Ņ^$IR=7zh^|Ez?w߳y.\'Lǎ=zyp2 }c_+%ZJ" N#F^ƃ\jqܵE;+p8=LUQe]Xs?V xk~aܘ{)P#Mgܘ27G[>QtYh6߰3 `I$ʢr'Q~ ʲ#Py棌~C9~mLoyѭȺ~DٵQEN~ss?3 ӫ_Jݵq>&f֬F9qL-8a_:q.ۣM}8{8o;ȱR{z%^$IA;v'… I$ڞC@K1w6c߈ N slt3WwOF~} ^+_a]Ϥ_ 0{7`=@t3_q^[ v/Ó˓/tIuOmXƧqC~mE,I$,!*o^U w9窾5eCZycU/Zkt>_~\2wF= v|dhRГ]7;|Q 'ÍeMNC37F[ce,I$l!JQ&*ya6s'',U7ª5mduHj;\nNf@Era]v8yPZ՜ʽ?p;{r8QG%I1׬߆'e/Mn !nXAIE-AFH ÄJz&i!?0m۾wsZl( `%Io y]7ygՏ,;ݱcOV,6n$I:[,t6L8{ լW$I$am։6['G˭J$IR׭Qm/7K$ITץՆaVE kwlLaR1 3Gt;D$Ixo]5){ꁵ;1|u8$IT'!ؼ³Sx$I$xgI$I2K$Id$I$,I$IXߖ?SF!I$o͇}o_ 7cYm8*K$I%)v w筣7Pʣ똹+WꪷudLc~VtNIo]ضs`K~ۛ+pAu,+URL:v6U~șK'Gl!+ݹ|X:ѢƝӻ_9%mt4e)tYݒ$IKH ] ~̍چss9-wt\1R~oM5LsfV$IRJ%&ŁDmDf]8t r{3$V}!x7xg3C9|*V䔌 f&q$dOmXUq^dn>YYٶ>|@02SXO[gYd-[+ g^1BN=tMz^ZmY~>|! F_QwOD*dE^\xA+4okEnY@9߯Q#xlkٿ%|9rf>kt>u$\ދPmR^z1zu"N85o>yΤ| $yoqϔ$I ߒ d6^Z/c ځsA|5,_Ļ2!HVFC,2kJ.sv*,XW⬁hdwJ^ "Ŭ(+;qt,ּ{93KRAtퟮLK ;qAn ~VNٺ(mϽku"LSgIϢ]~1 y!O7J|9M/|5']΍o[zSx{lI$5gԮgWTʕbzU@-?-vDR-CZqJv5kG|N>L+)o}-{u-N_YP8>YIYE%Xd,+@'Btiq,A8##Y 5AF:i (Ch[v%/7sZ’J*+$I {/>zIn(%+b_!9]w^^Џhٗ@'L*F&}hz$p9̬FV@1O|RBؑuė?.3-~C8gqQdŷ1ug(gVE(9{ә~%/F}OF,X]šC法в+Y;ߋD@T2Bd`kV~+WJm iEF+g=x#~mE9|@5},HN.k$I$}x_,14M&8uW//q>/w9 e'qJ _Zfӧ,3`qUCӻ{`[2@RR#Tn|9m#GYΜɅ3~=eD﭅a n^='҂J h֋U'&s'PK%}7N.9VȚ3?T|g '#wgdѾ w}J4k~+ͳh{0.Qwzb:={v\q\ '< kv^Ȋ#D~;\4k$I$&< _}*4*O&sLJ; @RSqZ2BFd\BNVkVo.-{}s5hU+1VzůOq,sj+n<#)YGp9Fc:晏2ng pUW0{6? 3Xs'yJk\tUCa-g--:{K$IK66字gSsFf}aܕ l\Pq)]xf/ozE+w.dۣ5-sttJBt*m/{xm9U86^ $Id -SƪК/|HքY{W`1<7{<5Ad%g*ya6s''j[+%K$Iׇ`p,B͢m8mZzf`E{|X6٪œoᲇk<{7=Cݰ /0I$I,Cûm4Zd ׶mz&|P>r?Py]7ygՏ[v6 ӏW>ԸM; +xu:Ys>E;+v ZPyVԾ]8B-I$! ߢ`iiy%3UsrEZQm)h+V31G鹻f: f0yaug ʱUT[ 5unRMlPa$Iԣ p3N"ld>tds'?7#[x]~փ\}O#sr6i.On{FAqHGX)>=?Iӕd4ˡd]^īz2Cm$Rg8ҙ(Lp$߽YyL|`dn[@2%I$5xشggT/o^<︝sp$ @n328Jn= Ɂ7^+1:6ڜƨA^?w"F:­b^X\xmL>{ז;G[4ˡ`~f:QM2r[u!CvUoòiշc)ȬnC[9Nb-#9;y\ Zt#CW$I$'v,]1˗-W$I$Iu¦MycT>N,I$IҾ1K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$IJ9 xc|ς$I$'en'I$I?-I$Ijh8HZ$ITZ_"& x$I$@ @0~H$e> xgȍqv;%I$IuC0$ BJJJr} Ũd8 3>xI$IR]1Nʁﴎ*=Njjju%9x8> 3$I$Iu^J]mXO~c8QOT]-<,Dv|I$IuS~IU< ~Iΐ$Id[ =;L$IxDvxrϙ$I$$I$I`I$I $I$%I$I2~h"W=+\f_H$IVPjA8Mlޚ`O~gIerdž}}VKW$[*㛵l}͠~%I$pӭs ofm qi8ѵ1,صMwlR 5N77HIc9i䥷71y;@`T(<7e<.Ox_vɘof@]sqU;?sX$I27@}ZH#Λnef5)M>oׯ"H#l$%Lz#9X:@q6) ?Kdx%r}9|HT>_}3I>b2hW_O&yɼS}PtY6_<2~c Kȿ$I84;X$Pi :f)@r1\ksޑqڼaƉ6Ό Xg~p^n׋Iv#wsK (HӿOu!+[cb̐T:/I$$LЮn!ٵVJ[kXhاl6QJF [.7J'񿷌t;o8z< n~a)yEyK$I,d 8YQ CsqBc']{nW.:w9}I߬.β2SȦdf]crf4""D7!̦> 7& Ғ$I8Ȭml'qL\-ssHZ3m0Rn?VWV>f(-7\ԓ$ʒoe4̀Meaæd4&4 ʨTiʨ6J$I.ħ61axB*;1)ҸK Tnm^)_sQًMY 8T}g],JVq1ex_ f3]8<)_zeY|EW0kbr/HNxH^$IRo J5,?)>nMg}6QạܤiMW4Z_.#9~]<N꟭ǮJ~/Q0Ўʋf1_^]>{q.d9c\I$I7 <8#`ҏXl~xo{lׇ 7 !@z)a9NIN?-^\Dpg$Iu`؞$I_$X$I$$I$I`I$I \w';3I$I}гs&I$.5a8QOT]-<,dgH$I2rL$I$UI$Ix A:f τ$I$aW$`@ `ޗ|R&$I$Iu؛k1sMII;kC?/Y $I:^_:JJJJ l@ @(Uzׄ{QO#^`$ITWt̀9pQZ B|p  '\6N fastapi-0.110.3/docs/en/docs/img/tutorial/bigger-applications/package.svg000066400000000000000000000340401461403617600262540ustar00rootroot00000000000000
Package app
app/__init__.py
Package app...
Module app.main
app/main.py
Module app.main...
Module app.dependencies
app/dependencies.py
Module app.dependencies...
Subpackage app.internal
app/internal/__init__.py
Subpackage app.internal...
Module app.internal.admin
app/internal/admin.py
Module app.internal.admin...
Subpackage app.routers
app/routers/__init__.py
Subpackage app.routers...
Module app.routers.items
app/routers/items.py
Module app.routers.items...
Module app.routers.users
app/routers/users.py
Module app.routers.users...
Viewer does not support full SVG 1.1
fastapi-0.110.3/docs/en/docs/img/tutorial/body-fields/000077500000000000000000000000001461403617600224155ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/body-fields/image01.png000066400000000000000000002316321461403617600243550ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwxTUI#I: M:Ҕ"^ײJ\q] (M %HBHBz2G $$@*|?s[s9L8t:N'f2<6!!=^N&,""""""UnrvYda &--Cxۭ*l6aPfѣ!5kM||jHDDDDD v{x\mɂl1 a~Lx<7j%77xOjy<.# wfJϱ9~,GFFiiiX,䯷8\Nu{ˆ#!!BJ/~8~,3 tT-/jժz=.<˙LfT}l5c1. 3j-{TXDDDDDDvqw3f̨ ={SNt^߲p:{=3CGX%?.Z4ٳ0ylf[YlZ{ ì^"rpx\.UT{ 0f(&ORάif)3E3`)o\?]"WÜ7j='lUT|cŮ?->ty:tgѢ<:tDS`_+Ϗ`UTc|m9_0.kZïj-U2aalGnNNl,Jw)Jb-f 6T%6NW9^$,/""""v_C,}^|r Nu) }`3竫K =(e=SKa""±ڋ^)w%w^h>nd22w+8'DH%|׳ / tYLgϹ Wgd*ߗ?ͽޓ~ xuf`{gɓ]- "\ըm`j6]nfS^tmS::r 3JgKEV^E"T;*˲Bv e3ۊfKGrL$"W{b" $ۺsI2E.6}_3SWȕ[h ,"""Rǎ'<,W6ϕN+}?|.y8dhP|AWXnN4Út x2kTw""""dpX,ǏVʶ {=v|.[.fBL7EO%g:e8&97")݆#3N~x꾷 ӭsYxd$plf~N?0 <~znDmoߙn;רϘOͳ'>z̞g1D@ --dXDDDfK2յ+*'Ɠ][7-Y$ƄalYz}+!T;c[7cFܻ3(!}yO3(m s?Sv|Er],R\ UݓOӷvChΌ™knOq׌Ei]#9蟼D%c)|X5/am2]ZӶ\7uʒ3z ^DDDDDR.Zn4N/h)^̭y1wKrQ|TlsϿ'; 3 SK祹>S~S{(husqg]xYYc-98F#fvx uvz7Sm3\diA&gw=G /MŬ]p:+;Ji9jѶi=^2ʩI#_ԣOUlu"t_9i ?-]Fk:/tMGnOKTc@DDDD|d;<瘳o K,ܵoW5jMy)mupרŨa]16d7A)zՇ$ U},>Ԋh5'ߒp^ xXX|IVvV]+DcJ?e8j;6mՂ2wAVH:8aKf-9^0{:K }#"^ /~Li3ѱD~ezpb#\(g}yaܕoAsO^sMG `m.q'ߧ1/<0¶(yßIn\3[{Z`o96?|`à+~ܰy ֣ [)M3U:l$0q]Ǟo!ݝ_yIO|K0gbڝ3#L'm'K?ҲbOx񽟈9%ݼسKңs3~_HA|)}Z98]uٴmٳf'9⒔jҒfV"..':>dY3y륪 e(ኈp0e$B'7t35WMc'Hrp#/f? g̨~Տt*v-Ըix+7_͕wi&ވݴ#q-t|S޽A;؁W\6bՓ>.M#C/e-S$2gy5 wap#MM%-3}1{|> f۬U.QsrlqOgaLDϛşOҁ.Ud{ߑ"+g ,'t'!<;zfafg21~#>`oGk52+b~dWi˲o`ĠnnXil?) 0왜8LӣP8/ -[iz2mޔkïq%3?Ȅ&Ң{VJVɌxm漩NFH8)ϽǻsIꑽ.W&}X5HUf :t{9\>5kyg?ȴGe)#W{>3]P2RҒ+|O?XDDDDJѸQK\y~Ph[8Iv`9QLrTe U|u\4ejOP=5g/)JRFXF%T_\_u/ehJZXDDDD25Tl2Dϴ+UTlDR+:+HU Y5&RpigBpyWWDDDDZ6 6_՘HSA[/""""RU/&ox _=(j |EDDD`ՂjK*`Rs\lHU 6_?US"W l~]) d2 Ɍ͆٪E:&,>>8vn7 ǫOZ|X-X#\Ғ =֨V"""""","""""" """"""" """""""UF׃W#\na```20̘jT2z=nN(\ٽx{c5s/>;z4mBTt4={9q_M׋#שYDDDD dy-et*k7k1 ݻS-,T.OJB|e;Ił?yIBp.yg ^Νҹ3# wޥM֌r`]{~UcDyDGG?j?ϙCzz>=hϦɅ{liu]}7s8W\tv2=szb;nfZ\:)))<9q'L`aJ]0HH?>}.֓}m~}z?^#(833` -o}G`@ wzK==R\uL2 NVN6s~Ü搕̈́ngꔩtMTUAV@nPc:oEmƋ\.}_~چ[ӛ6o֌j3w!!!mϨ#idRZԮ9~iSR.5kgJm s<>a'%'ŗShA+dnTӇ"vl瓏?PBiԘG} V\Y#b 5z^;uz?a#?cZc'}:mgg :~,R}y@F%Ō#ӌ>sS7|3 ʽ 3Z4&0q;ѹDDDDҫw{=C|Jr|5rzY~/U٣g/s{f{Rx|ML&^?Ŕ/Q71uڴlJ OdX4~m#p\L^o_%&chV'cwd3k1̸&iͭ֕ԿƢooԆF}lryTbdm{K>WIlm1k][U'i׬ <XZqXжxluiJ'&`>@"zaԶI;_ο?k^mՐIò~J70cj8R4[REDDD oQ-0jA m۶|0:FFF:dddY:$$;nODD K!]wңG`'IÍ@l;) AA|T玅粵{_̊)z_fhW-jkI#ѮMq29x-5>$hެ?CkME9éo!!`b)Gl[z&ʷ>.+uϪׂ6$vJw(Mas9!uzo1q.W,db g cFq]&ËMKV븽g=2gY\.F<TKDDD`y19v;Y8p-[`6ڭ{$88՚4HMK qc3j46_[ с3{|3degWZ]A*4;R?-H9d ӥ^R3hΦM,/վkB9muc_()jRݛEƩ9$%T-B\f^5}?K>ߟۖoɰL59hÏ 8mz>,r^FL,ftoh"<BFMNМ-qllVFCI5N׈/XUxp,:ʉ,$?9RRywyGi_W3ٞn`Ҥ1& X>cK.3Vff&~_]quWp* U.ZK{ONv6k׬'$$дYS7jȞ}.X6$$yW/I8R~ɄY {D>/>{}qNw M2/£[g%(Mْ2&Ȟ@ԞXqW}`G^kԣMCR$ ȩQ v(KNH(ͧ{lfq4Frē ߥfHsA~+zqc.Zvm㹮Kgڵm]6>!M|&MOFu<.gO츜"eB1 ;o#cHF2F@^ i)!5=E\jn˖?ABI^>U;~tlH#o ,2 3N[Y-hJTt^6Nw(ZӟZ۾̴Q` r""""p8|g޽nݺc9Cnٽ{7YoE^ W?x#oЯOu7`|{֫wI_3`АJo|%`?J /Ğkw^1ڶn͍˔i %]vmZ7okێ*?{{m*f+- IDAT\YTj*oO<}j ?vmأֿl7Tj˖~yxx.a x<P1pvϱ<|H>NuK< 'o>6l)~e@{=ŏK~%pz>s}qÐ1wsr[١i;;H]?u`ŝIf!R^eI{{X|IK_}(}Æc9F^"&=DDDDaFXXnKb6۷fǃdža/wsmŪ_{XjzSRYlÇ_~ƍ/˖_`C:^b fŦ3sedÏ\ OX~ dQDFFҴIcP>wdaJRT""""W-[Cw~?nڵ7v-㏈*?T.߾Փ11̚5으;v7UYb%ʜ)-lQF *?Ks\8J=j-"iޢQQs搞By\{mt-S7īBDDDD0ݺw'+3;w]aojl, br8==i_}ʫrj5EP*U""""W.ld~+j*abU'kT"""">6*TW i2cCDDDDjz`m Rbs)ߑteݽ͆b,fl6_L5/ """"rf_i&Ll6Lfߊ{B&n ]i\y }(T&kX&3o Rbbq{p{xx번0 L&3& YtLf& 4F@DDDDDDEDDDDDDEDDDDDD"fVDDDDDD;wT!-=ҥk-"""""" """""","""""","""""","""""",""""""Rns,""""""[,""""""U2\u4!آ⦛o*s,"""""" """""","""""",""""""Rh,m۶e;vXr((((((((((((((((((\,ټ}7{p\Rk!46[4mvWeU$dƑrUY,'vo:ֿ%X(\-c%eT~ж;9r#Y6ƌDF}^̩Y{|.1GI s%ո^ \w׳/I=WjZ͡c ӷ<_f1}ĜZ EDDDD~W}xW,vz>ƎOm-YHQx~hikPFmD4$KOA@Ttڙ=I܁ 7Ho3[95Gߛ笿[G]G@̽2cnNJcޞ ,1G_=؄`ԝ!7u]I~qnFm]Gg%;}˚t!O0p| 3y?{nyWݡEDDDwC-WܝS49'{o,~.V,[i\'zz|YV>ooΒy+oÈ^ X l-㮣Foqp7w?F۪ZsKjZ.vݶZ~ZpGۨ5Kw>OI4|;7܏fVv4U#?86yIly _n{CФ|8'_eoHq?B_nf'"""" r)e||>+kW}_t v9cəLԔW?qg@}x7e PY7Mx|м][ؽcӬmRP.ɱO\U F=Ǧl'&T$MM&^lVO:'2O;Vew+_9y\O.vGCDDDDDX*[Fʹ4ڼKٗN+dS '5v;!Þ T+.0p8z|7ɵ0pf@_RKBV|GAym?fԳjѪf#)K%7<f>7rS9؋ ;,6_"Sm3Hs YG-dee_X]n`w eBP'ֳ̄h%$9=jЏ:CFj!(~ͨe)<2_T^Qh 2/eOqj6/6.sY3U_/c(%nX֤{eEF%.(mj~^ubNMZu jT乇z;$S{Լ0f/NeZ߀rsJmiD~iHèof۞Z ϶@ؿ03׫[NjfrxlC־5F֞$6b6X6-a1 khZu o ǢGs趝hs=zuk<1i9p{RamөG-GyӵfK813 +~/s[`ZXvm!ìX=CDT&Rh"L\N&Ǐ:z)("""" WT|>Q#/t9+#6?z\|D?{YL&ȿV`]9Yxgnǹ!<]#3tatUyɍ\!Z <#䕿 n Wfza-aٷ Gvrow.?q3iϼmWnTn,:'Nob؜3vh<݁ÏQr`'ȏDqGCU _ H6Sf%+s-CLvQ ә0sCDDDDDͶsKؒʿ̟_u)f~T{4<*3%gEڊ)q"B[e YzNgot@K][۴eY3,7zѻG{m6miLd=ƊSXQpۘ6lVVm>yƵcl8:T^ubɟυ){>ӏp,,f?)>`=6:OAQZ8No_&- vش`. 3φ$RX2i&fmLcXڤ$f J5Yq|}m1_Ͼ-ll`F+ӷ<َodbSPDDDDBҋ_` О^`fl`MXѹs*a޺B{nf~v+-wO>χs󗝚>A Az-py;I.:nu+V-UGܐP=snVl!o*%{ؼ)⠈ _F;a /)%2WcA4i~rj\NdW W6F+j\O@Qj؏#F#mװp9[su`朘E9p:3s n֢HfCpع0!aԋA4Q{ҳ`붭h7h, djP7r/AѴҤQ8O;fCğ8Yf^ڴlµڜ巸`7ό/0:tBzDM+"""" WoF"OKl@:NU<5} Oy5S4Dj Ȓ~`zlk&FMڛy_٫ְuh7i=tmN{*q',ϛ8(20@zD/&vؑ}}mډ];]׹LѵCD_0qm)3~tWL\Ӳt6Fm˼9g˩]|qDfEv[6\>mZqYG|.X)'Yd?sAرd=' )Uwqˊ:zǚf`nҕz[]O]dW%bВ=8Ȭ5I^R^#O>wYDDDDDDb*O~oϙLg1eh$߶Y֢}h>MtS?oĜvkhQ_ ӷsxEfo,;FDDDDDبO!P8ZV|-$mq2 h *lks&DڌJ繟t5ƿ=mv[FbÉ+9;v˖B#D;;1ܹnբŀ!#y>Ի@w[CWxKm ~6giWᕽu273pun8-*,S:طΰIlhkC _,V,9wTIW X!dZ̝9%;sd6v iѥ/oN5NP;Ͽ~fD2\ԧeq{cϋYn'T6A?'is:qqۍIy'5Bjޤ]+ 1osrNz*u5w  ӧ.gÑt{GDDDDDcС^KiU!-=m۶9;vK7jpw9MXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDJb񬣼«3qEDDDDDJa2_2- }7Hwc͖.bYS۟WYqim)v8LtQWZA\2#ے\͂^RCbD^?`'lP^ASs.ONr؃v28`r`ppI^ښ)78mqx(ëH8OZdK^ee[8<1OZBǐZ!vI1xeq u-qt;f8au]ì+TDDDDD\M^+)SwpD5b'M,KLZ{\c9y*/w4b]) yn)"""""ru`' ~4uR3՝,?}oǗaV#d[m9jLWз?i8 3}caj|zo8w0&4;EO/0lK\ll6RsX|(. =0+irϰjf 82v6dx8PˏNa +'ܺ:EDDDDD*igwQU Ɵ$@w&""(^{T\{ޱ" JtK$$!mG Q  Qc mg* IDATC3`4Ӵ01k3TΌ9mJI$˛'1cYlpf.$ϟB| b”޶߹P4gnIky(kN%):cc(f1ἐm%I$IY.KgzDesn1!  Ew%%7D0n]O$ >nVrj5 \swL_K&(k#aa/Bp pw2ܝw?YɕӊNVme3\ihؕ$I¿:`LJ yYMc23lI޴M0&)Bb14Y) (~X -QҒ"T AVޛrYlQUi MLAj첆fM`wMYiRRQ#9U8km:kgna|xZ%I$/g2vuⶽ.BߣKq7+9zl@46#;lbT_Sf2+;@eŶ"5klH$Ix27d#.7͓Rn Ud ;'3[8Yy&I$i @͙1c^vƌ4k֌߂/q'`S_#r!bSشq'I An\U.ˑÄa~LUϽSXIsx{x"}*B-.^xDmE'lweÙ^忕Y<Пg6oI$(Y$;wfԩ{ԩSܹ3ʕK/ R!JGYLd4C;Bmxak:F2%?'ywU+Euj\)+B)2%mzŚ4X5Ia ojph]!JbGn4s9g8nF &G% P~y)"d 7R*M$IT.];ҵkW>s5kk׮+W?ҥK[]V2yΆ-pεڼ_.bWB8A1U^|Ɗh@փ{j\#iJJ4R7naPM$Inʕ+KOhժ0a=z_;l.6rS4UZe6r wηdI|l`էWP;fjݸ+k9Dk$I~'y{|ᇴmvyƌCϞ=)[O*<gS-H/$y,Rr3!2X1ثyWu'gNkk$re+Rr%*&@^I$I<-[=z0ri#GG߿'[gڴ_γ%m-E) yq.'eOC}.5y85sgnk$ItXb~w^zЫWi+VB4 tq*ر%c9^.TFm`33V s,~[i4TyXeEv<7e;kK$I:0C_|A2eիzL2**ҢVdXN1tV:Z|Cd0c]b|7$9y{?Y;غsh] oLse)|9qN nƳ/t6eݒ$IR!UjUFA2e(S #F0 XhG1"[2?ԍd[0Cx)}ޣI Ax3wf.\oʼVpCٝթ sLeMg0XiJo\Z:fsTq0-ʄ>JVПۣ}8|,( s`M""[#R+6?u=%IB'M @d…jo=:ꑻp4{WxwViQz{Wgܩ4?6 x۹t7z<ܷ=r{uIopyWpݯEn=./7.m./]q% Y :yzMoǤQs'Q6V [|?zK$ITdIMy#hX&HũҢ+K[Vض9C9 %hvMu.=ՠBBqɔߘ.BˍwkKij߇^uq5=hQ&W%rhUM=Q=S3~9q,6?5/ ֻe8kCb#xr )w܅y=VNcw܅ٗ.g O$I~CELp5dBO0u"8!BE;WBJo T~6iJ w2?>zҵir թ b٨NV{=Kr:=tX_xn"^I$pauя"77 RTքjn?E0Jȩ֗'i4O^! B$Džo|ͬH5jHd)^ScH}{=㶵hKxxsC4_/y/9l)=SV'%TJ'pVRsă8ɠF9q]y4[ۖ_[d)dRTߖ+D=` >*Gra{dm;I \~-:EhuC_.DV{N__gC@@a}>fHrp{JZ9-yi.S9Ӿ) $\ 21m+!m ٴ&..wYDž  I<@hMH8nֲ+ѠN 5Z^ JEX%%iX8ϟssSXxJx, 7_ʑlexqJ'hKcnn e7i\V-_ƏgN)|3Oևhrm!W,O5(ʲ%ICReiZYX$P eWL\ T*ۻB/̤܀e˚esj-3zqd/Ï\dbe{cВkRfuټx9+tKxx<|JjYkm=@_5y6sN){>רz~BlR;;-6]n|{b=L;&zǯg{5_܀ g.KNR%z=kh? FcF@$TʝkY9 v'gKY<O_x^kr֥gVgphl&F!_Υ慉ycG|pGXR8"dg-W<X6/_CvMiߢAxgz].w3etZKVɆh"X¸[Bݢoo%dnYEL$@Ѥd f*RC^QhuRj|?{L͎jH9֓\!lܒ:ŔCLt֊ز0)L^ȖgrXRv66:ob{ "*i36PnOֵ8U1'mGth_9?LaT馼xX^R'.|zD6^2BֺTʗBϬ#?Լ4Idޯ.K.ExlN3#{m}%喠[I`ɗJ*b++~ϊ&2G$sK8k[mڃwd|dEuۺ6<%snYGdz4q4G؇6gm%ui|?ԨP^meYlt_a1P%ȆJS&W0lӉF.9(,=-YXҎ.M$>`Mzi$WM1-)s2yvb6G h0ec1qܤʉR.-'dtbV3&lRn 8_O,qEI>_\r g㼨\^W_7ؗ$:gy`b$Ņ!&ѕn Iաn}X?sVD+%L*Yu]t}F~̾@1`M*>{G据Y͎s%+es2u8t a;//J3sGT=O}ܖ?dk/PQo |)B[cy}Wղ_U(oJ|feؒNo\˼:gOU<(]<¦kɢN/Ek(ը̎wvjܒPu#K#%-mǴ) A] geq%B9z=|%)Hl3L$jGyth֝Qokח)Yf$I̿JBB EcO%.>Sn"vȼCcbC rVl=`mӗ5Qom]L6mfA4.&&a9;ml"F/Ҕ^-vNxw,6䢮U~,t.T-0Yl_,.[Y[ᆪsx"eØKg2,\vx _,kzhm^7]? UT}n)K<2g]#ŦZ3js+Ta5FܔO f6E9yeo hyj ,[~fsrOI˻? ):~$;) ζmҜ&Ҕ!s9>//7Ũ7_rV.s䤥6$Iҿ,}/ R>\InDq/ IDATJ5"\2#:2ƍ")s`L'Rk%b~  BN[Cjbi\-N-\U%ff|RbCz1߀s0߼0/爢T,&mS [r kcyY,ʕDfB*BFw7<=u~$#Iq@YYk쮗 %J(+e9V>?$|M0TB0ӷloJʼnϓ@sw>o5%ٴ9V^;&l9o^W=Jnmr$=J +y[]=zCY1%%kz2硷c TC8ک@U须yee C8:w|{/8{3L CW;ϜNũqI\uKqt:6+eN/޼O=7\+!*ISN;hz޸=^^dP㹣VX?סrsf[~!%ՠKrK}Ûwɳ~s`/I$pAe89~ƖPRhl@|s0) S$CRҧHp 9aJ(|%BctRYbW!V-Y: -.~M87͠I Xb) ;q1ߟ%XbKRa]Uȓd6W1~*ϛ͜JN'r]~ &-kѯw` },Y9۟w-7XB 尬`DŽPmλ+k^ÔY4#P&(:xr@I)T{,#y>@dj uy 2w\ S3(&Qswϥxݼ:Ʒ=E^WgԲ%Iҁil&E&K8ݜ׀2mڴ^iӦlcњ5I:4=jl<^?@,5*?׸#>jik1R׳todKɪeQ3śz>VqhY5$IoږTTӇKWY+곥n\j- kI$It@0K$I $I$%I$I*Db-I$I{+).F( $IJ5𻽞 `I$I0Ay3vk׮#33)`)[ 9uj†<,I$iB,[[@efflr<9sZ[%I$fF74GRl Yv#F~ì9s;n!&&Vml$I!8fZ:[@)[G` DQ[ $IhlH~222 `I$I&z3K$Id$I$,I$IX$IqѳԽceq?2~2ixKrhy\߫! ˱Kyx-|sn=XI$xu ZI=/B]9'@:UŜ{5(o wַoPzR6"gJXwg~^p23U$Iڂ6ks!f(Y9qԨ7SPNН|>cѥ?sm6yωMǯ& T[7[SJn\IU@h=uxytb,4'fds@rskJ ew_~|ƮRil ?"DjهkCHIlo=}9&j ׏7m.YĪ)oD z<1q5%_]gBœ1u`HąH^9ǿHq6Q2귟ONOnXZlǰ{Q HbyIT܆&[Y5 n%;p [}N_59˸]q yum׼^r4=4\H'd$ F };YHd,gH$0}[_H2͌f[H4TnkgR[7TŲgWG3'g^p"]+e28cDuѫz<y<Ⱥ83W߳"ԪK] i\ױ4MB>>e !JHكv:ܪ-Jg+/ ~b 5sF9]qBm0k4|8O-peDv {nå};"6esT=wn$ m2i׌H@$I+k+U0!2)Ԋv)srVR)ub WE{{C34l)8d >1]ܒ~g7jCJޒ0Zu&loȝ]NΝN5gN<7yt A(whӇLb63~ ?C*dcf֎ePijV)@%唯]9q 6+LX4ꁗiu$d`^V%, H0뺏;,\Zi#4;)e˘rLbi7>=zҧnO$I ZMhlt?  ·rhfѵ٘w0R2&/aCzq5 ԅl,ۅ*VfLiPBP词EϮűkCo?byl^y/I$j|]*婉 oЇG{|J:O1%K!u)Hj1. k V-֋(Y2@y#>aAk?=e"eM^J:iݨrtGS>M;s<\uWH|"6}Ae;sTF:4#GM㉻_!Ly=J̹O{z$Zʀi{ZO:٬6J$i?Ɖk1%m^KXs9^j\XCtʑC5 :ueķT[1OR"@, H!1뭗yuQܶaw9i뎡qfc!iyE-L{^z?p!=*œ>}^fWt*ϾCQ xy >S 6$^u34<;L,֐_՞ePo.¼_OشЗN@$IC(Fjqb{`ҡ*%;Ùj]v3l+'$| ],/F~t=PqHuHZf$ݺu s/ZF(٤PO I$ [o.;;y0-/Py7_{5HP(D(7 ̱=u#mSR6m^/ӴiSZl^pmI$I≼1{&eRsatկ3K$I*䝏eu retPe"$IP˳-E I$I2K$Id$It IHȻv횵F~ח $IP(DR(֭]g@֮c7(]`I$Iګܪա,`9a֜9Jתա,I$wo8vZ<U*W&>>ނ)R2=A횵Æ,I$7oa"թK5FDQ Äa∋Q`I$I{cbbŇ% ` `=mo,I$O CVE:`I$I@=p`i?X=sTlj9H$PB; $I$$I$I`I$I yXs$I?ozI$I* y~W[CB]FNNhJ$I p8Lll,P H1A%I$IL("C/@bcc $ITC.Ѕ5-@mI$I*A>L:%I$I=9$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$I>}N{7E;̐/I7=uUtӋ2c?;b2{&uⷼ6euދ%_qr{?[~6'ߚG,Izm잜ܾ6 'sԔfJB9 e k1]&uC캋u9+QbR8G|۽qkA<7n)Bp5]98v(6#|CnЕ) a0Nz"l.w<볈ۜK9Y.I$~; E=Fa,xTf*~4E9En;a]9%*3D->ΗaL\>5*E{zUϦgSgyf/ݙ>Lfl;~Lѧܻ1J'8hQOF̛V*٫H lh&{%H)cR”?t^$uR+ӵËxih4un9g^Π@ŦfdӞ\ݢg 㲇rYr\  ai,͏ j]yࡾ?b-Iz+z7(BŌ%}\3x&ǜk7Mr sO=t2Dfo12`;n>x(-8B>ɕwG|C"~75硯f2'_s $޾v۞Ņs )pl[o(X_.e3oՀCEֹ$paTSB}v.b>z^:!uJ-Z?=|cքB 8Vxh%YY)`Ӥ[ÏDڍ8K=MQ,I[ )H R39l{7VA :9,^9k( |ZN/&cL̍q^t9%]ۏGuN[\֚CJbbh֣VJ-laRd (YUL8]N:E:;x>Z4(Ff2I9n_=oMZfǿdr~y) d)gᆪ6g i$@BcD`CEDlPWOTT tK(I v3  { LTY P̴]byg^^3CODDDDD.%kЩA)&8m!4iׂ />fʽ$徎u){b/?9ouke0YDYH~1|1ڜ[s7zr(+%TvypW8QQzC 9Ihؚ @ ; [`OQhO? ƺ_LH=얟DuLG(ceTjt|mRdž|{8|ڼnO6X~3nrY uz/_7`7eիk]1f3'Z ef@T*u߅{Á !a +Ce/(UZ_d, \ӗٙP[a0# և?]!97OG\17c&À̰҄fs '„}[h4Mg Pn)V#[ratN^j2\WZ2n*} uu;sޝ9 wr;Ýy0rygVыg.*_'yqg~RDDDDD,W ;Gw eez[Sd0m6lY?PC^i<._/| *zxhQ>H##Y5 Ox[ *扻p搑uVaNd֔;CG\,7̖ K~ypYFi|MǿVM4Iʁgkv[ rٴn?j  qZ}{׬oўm:ҽ6ȫ/ҡ;6&1O1f-JVe< y G/2ؔWWKvmL߶e :Iͦ|p{|rÜE(I3>՗woB5ب]D6eHѩS'is+-,,pE{}""""""uSDxcZX|jZz:QQQ=O:uhذien`]1)z1"ASצ{ADDDDD?Ģ*`````AVj)EDDDDDcy;eZ}|}"""""" ;sy~4fBDDDDD:aνo=(_Ò9 h <;X[† 8ۃ黎W"c¸cN0p\HܕEw$tO\|êҵC=Y[^q#[_^yz>O "NjYDDDDDDȈgR4ͼE` u D 6/eJ"X?*4 |bYMe;-)sT]֍,:a)aL%7hLs(\Oun}oЛ(_5|b66ކM;^xq-n Ch`bx}$}вNՇ\ko܇ט,?AHX:hJN:NCo+BYμzM*ֹ+nj/~DDDDD7ANt7V?X(-N:4lȈ2|dOY\:lE4-+WDDDDD@2Ve`q+634>ԛ[T5"""""" OU""""""Ej````+&+qדNZZ?y??++f&?%\ptVVH {%&55?ߎxws,3YVJ{^{E=iN?y*Cy=)ECrjZ&slDpḝ-W.vZ k҂6='YvjO"Yy< R[Vp-K@LgA| lMT 8naɜqҨ}3xi’w#Y&U """""" (~!M#|rnK^$'g7F~(<Ί9D;هY_n4:=q'n9N:Hڿ‚tfđV*-YHn ((cN75۫;kzbO.wswI5Y٤;ңI'2Hwq4 ETa;t~=Ouu6/1wi5,_uN2S&[WDDDDDDr0Su$ G`u*D&ZN`:q8Lt!n<&o?N.nXܡ0ω?0oL 8{SM ˖|jVAr+d.qև8# '""""""W},G&dzMA==0&Ń=\HXqFdsF` pBaܢ%"KF(.Eՠ9)B+TdNN7sb*'%(<]p)֒$22%L`قm$n _wg*k af_vglOs?b@i37;0 ?*$0J{Z9cg!*3}8S߀8 M $`l\M`#6֥ nEzOM,iy{ -xr@}Ҳ,g穦X\z+啁mz?u ֑TO֞'"""""|9yRyP`Ӣ^O/sQs" qxdQ,5-;m%ЛRUnA«1\;UVvaEDDDDDn4U(((((((((((((((((ȍLS߄5l^`*gqnS;(w'6wy6M +"""""rM({X]EDDDDD ?@C""""""F AXDDDDDDEDDDDDDEDDDDDD!VU\.!a*AXDDDDT5b^JC """"r¯du|ē<==)ƽI pss4M",""""dռޯ+/ao~+Wt:U)gQ \S] 6cM7=)S&\$raĩ]?̦iX<\jV Cw8GW_RL8w (((P,""""$??U!"S`NN@+;>T/–Kh>S(""""rMU.DDDC$cSXn#8 BkPL z[ܓQ;Մ]Ǜ`ƙ#`FÓ_oAx;S h I Q;U"4BDDDDF.׺u.]͓\D_r]J>BD2L @ϰ$6͇=Vx– 9zՃM3a>z`P+i;yXmx=K.I{u5rAzv}wK* !z6ŌcC]YHk(ʕM#עBQ =CM50QHM3BQWxzCR^ȍQ.]yоyL5i/_a=i٥AU7/_hq9&C |0R݊ |N>KyT& 5 mI̻v~poA]3//0_m?}-#ٛtș\wٖq۝PQ͗8dxR><G˺ " ׉|*>vzLm:5AVF${Pͽ yiNûB k/W~^7|;o[Zl_f6X.lG7MwuPcg}7 `QQK>$-ӛƠ_إ;FP<5(Y×_~ϯ;I“51Z@.F?;OPXp:vn烻0A/oWWl7?t$6/ó4(R&MC,U:> r>9a 8q‘% 'Zox3 * CT"PVGD%YM&%m<+:_ɶ𺱎dRG_޺D>2LJ&Lڤ<^<֎!)v blV&c|ЏfAaZF}Kv%'5_zW0ɗ"O /kB&r!vOׁ vC;e#GhӺy_t)éX*2A{b1\au0#O΃oNq w5eFL \ՅֱfGbhsxq^hL¢Q* gv<յVo<ن2=} _ΤY4 )<51(ܮ#+;=^ʨNW&l=FAVRiwӽ25/6òrҹEt'7ý,x3ȫU|6WX~ u/>gݠ>xfu(ÎYrru䋈NDsw0ͱ̏V lOʩ<3z뚸ueY9i^0; 1Sߞ SC}ج4νykB. UST]gUbkHɛ?m%|^|#u僯xI=;&Vw~;W|;zu9qc'`jVx\NtKռ;jif%.I<}7jc٦$.˳ sf4#=O ׾eS vv_yf*JS<[ ^ͣGL2M2;ve+ne`]CNr`s7ѯ]D'ͻr&GmM};eɅp P/9zϏB\`w%b_զҡPQp tC`>BafΒ_0&mO5hDьf˖t yGmpOx6]/# Sf2e[Hk-٘cRض%-l ?_+ڈhشL`>5G5^ :*p;~""" 4݇ Ahנ4uryٷ8Ԧ`2K4n"r,]F$vY=B&Xyu{ݱuyXkb(CzW0kQYpK0&%*ϴdf u%Vb\oҌ&eV-P]/Ykbtϧ3{xm볼ܶ[CђQvV W|H' ַ҄Vǿ]#?D(f~XCI'^&`D3djmI:E +pq7&l!K([/gyM6㏓N~y饗ܹ3<*Jo^Uם`Y[>gQnHޫGr[gwG q&)"(S^eϋ'"pu<֨ &b㴷4ӗRUQ-n⒒H7\6Fu}0݃(b8¡OdL-(Cm'L/'~Ƞ:>׊8=L{(t#hTL_@:`8JLOݲIVA }? l_JVJݛ`U 3 yehTjOb{9E8?4J'K ^nnn?^zϒGnn.sΌ?EQ|2tk pC1bB IDATr+q'9YNwm+&ç-)ŸbNv^O1g3,|>c{^u~Օ<{w0z(Cv^'.ٚլ|9]0B E~ݿ e3Vg]gBp!-/FYFO'Qw+<]ɏca촟;v߲ aRJc|Dk>4 ~]owgz~޹y;b,ɓ'ӣG^~e:wɓqssS]!7epo)7NeIx %Ȅl^+n!6R<z 1Rq0pphkB~vIZGAJ<;QfM?:Zplcu8v-tCd(KYDT ݇N>)T,gPn^ؑ*{hb~S[wItд LD"""rihV!p3|.]qO!! p3eı+B{/tkLx0b-+9oAWƲH,ɅT[*Dv m9c4|XWR&`p) lPgz#~?N[6(APw,1)Ji7JrOD֞zGahx򚴡R Jz3HY of kVz{|${&.?۸X`$iU͏(H;*q B$˝?$PMh; qT(CyQGSB,aۗIb3`ʞrww} ֑\Yvyo%W ձ. n'Fykqb8[Gj[>mxd]ill.OZϺR5$4cs'{?bP@~>pu?Z y ;\Aq{zUv-B0,Ղ<} 픽aLpzIWr'lj jy Z8=+ܶ$ӰjY N4iyku&5CDDD.]ЭxVqB.i[{x uAXORyOjip<4iӳ f je2iW*-&3zke;)D9InH)vfJo'}ɇ?~Gڙ2ɣ|m8΢1!zn@8ѩS'is=vW|Nk>z 6?Sa|5?Swg i8ҹ?{eY{e DqqcWt?;Պa\ _F]f]uuԩ㺻[ÆOO(:EXVo`X,ob>LyBD&`(iQK0De؏6.#"""r^͂]Xk5U!" WX,n5?`EDDm҇i nl@uRCȥӕEDDDDDDXDDDDb\눈M`xzz{X!/:u :&EXDDDD.00 Cn4⎨bDqqGnQdCO⢛`?F֮uT)"N榊Pb`h޸!r''< ]i޸!6 EEDDD;յfGhP68NLT%\ ݎ7~6uV O9~En>m66M]EDDDrt vw¯ȿnU\q) """"nv`"""""","""""","""""",""""""|.'ADDDDDp.ІaatAaav(łj +_J6V7=,]DDDDD?0 , X/=`Z~EDDDDD!Tk5-S/tk"_R """"""_Ov$!(((((((((((((ˍh(U(X˭9{^&#m>mH;B̋'} o<53K ?5Od^Nfr5gCV*nU 5Zz>O\z€Q)""""" RO4 =3R*lU}YsKS@16\$#n**wgs ǎ:e܂{S{j*uGumD}O'̯_5ǃ:T^#P+6R?4Bh'۽<<]{9?'fYCNߗ&S']rx֨#o>{ lgƓzm+y36g@0XDVxK'nޜ}Dԣ=wAoLh3Ӊ)jA6c19,=#,7dPzb/[䋊xN孉[IpXֵ888 >_K|xwl;ŐgQo?ђr6^{ɕn%6Ryw3'p(ٝv>CHHŨsB>y%P/<%c'>ZFɞ'yyoe<~>øޕ]#.LlحWNW^Hڎ<ELł,l@}Y2y8ʘt줠| N8+ ̳v5G7nJ}uyJyk .wCF8<38朼~P8eҊJ( ĉ}o8sƿJ_yaaEԃoG{|o1tn.Wyd:X\3S~D 9I=w;tbVO?g<˳{4`~m8{1&|Ҧ|DqPؔt\_n;,z3LW]Z߭dO p29ۖu ?"-?{Us =u: oz^IG~ɩ;s =<%@iO%%$/,tDˆ^?@B[rY&4XKD~_]ʛpiۓǭC1zӟ~Nd6ɧ oߗJ~AOİ쐝Vn@f#U[fEFV:駢uF DnoD뗙!w!(X~8CA`&0Dw wf-:ߏ{S!c7!wgF{Ws-_N,Y*$~3;(;ca-{g;DZ 3l8^Z4 p|Zz.aS3QrxƮpؓ:lX3Hgt,1 c"km"K --h/m(ܕ B}Ilqgw:c̘1Tc㘹sx_q/r;~caiT* =S?;N~III337&. H$Igl=n>CC0>$nb!j?.V}xRxr g~Ua<5|u:Rop_MqA Vh@+ʤPjE_:ӟP\) ~ :wGy"~DHz"TF*exW/=+B +Cnwӻb O_<{i֎ם[VzG36$X6<H?(ϵӫ\[ %[]A֛;lh&I$) o>d;[p㮇^U=x]啥eY{֩O$It6ۅPBB|'LZY%&-S$I$Ig$I$j f,I$L$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$B-n9cMf$&%z%I$e{")[8ujO5-/d,rFï$IFbR"+m%lc陕$ItV3%xνYI$Ig5sY<$Ij梳$K$Id$I$%I$I2K$Id$I$,I$It̜&eQ$I$) pT=բ acE$I OJDbN "I$IِS C$I SH4:pP=B$Iz tjDQ. xޛw!I$IY=F?$OIx6tn!I$I'@"-g%l'7ŋ%I$p F,$I$$ rH$I8ʳm6&A&L}rYI$IfB-H'wԒ%( ~1"I$I*#;BH$IRhI$IX$I$Ypky})HRvv۟#1s`Ι9s>fNSSοҭ¨fՓ:Y9|D$Ik[62IԠE$Id>~p;*ԧV81G&'9w?S`Beˬ<7t>Ęډ|M+V3XS<2g'NJ喞7qM ƱuއV&e~EWfC\):N|'aiߕGnZĭȨq}wi<̷F }$I$O/Q{#O$lO ôɸuS^ᛌT+WyZu+y PnLD4j s_E-{n:-zk3SGԠS'I$.a#Lx?:ޝ:\FjE( n&yS $9mEKf.td&"eUCE^EQ/C#^=bª熦-6bKObqnZgvVE6u_[GUTmӐRXKɕ4/Iڑ|ђB<&}Ƅ~ӠMeW/e3ǕgmK$I:kժU|:KM8J*$gכUm1)Ӎbó,ON B%@ݛyÛzñ>aSe 6: ]lۑ {I,&*"7gc,7(N#I$oc;_ߤ_0`"{OVX.P,q@?ڔl9QURp68w%y)]2V'Rd"8ʁGI8J2D+ H-Vb@RBD$I8q|t7qjVLK·/fҚQjݑ.Wơcr55N*+6桇H\Ha&/K$",O+zLUo9]zꓺ ֱB-ya=44[{րw$I|X ]6ywCtʈd==L|FH"ݕtցU;N;'].bm*t,"[ÙA<[8zI6f Չ' a J$II o>dQukW --w=\)]N]=0fr?wMaA$I_1sS±]8i QQ %$S48.[#:ӄQf%SvZI$I'kuIh5JH$Ic>"W"t9rhD,Y$I$Y/)Rp?ӕeNYƾwV>=@$I2g[_S'0MAe܏S?f@t)3:g_ -:?}%ȗ&3N`R1p(cNȬ&c]}t,W_˨Qq<E!j4O%;BT IDATKK\[ovhf?u×mx9L^xoEw/VqoxRr6OzrLN+Mj+LJEə|5 'FORl1ۯA||0o.QF=5po#0nŻiߕG;ftI[V2m Y-z 88c *6~霄,ŵ_dx3Y: Yȱv),ӏe>cv(_oHD[g3|u" ~o݃;眰Tb.^eҮt-=o⚚cy)LEm^Y@;^Yl3~+2|GYګwV'Q?};Om. m cRd^ b7)ش.%w~Ia$I+'EY{CG0v}"aY!LeڵqF%lOFb3c>ݑHMw\B5 ^pSsx&<ڢ+/ђ|3q3vPrXު*{#i#2p:xkWļѭo >~e# u[:t(#n!ȹm>2Q+ ƱUL|4y,]s(4s_lAtt.yLym̍K)hşۚ^zWzu89Rv3g ,sh:T bJzULO0s(S:%r^ryarݕΡxvT_{c(\=t,śաxf'|7ݛAڍ#ҍi^*i˾a8 ~qUfD0JxmRhiũZ$@4zkL>NĒuw\=7WfܺfFXŎm`\X5l P> ͟MI$K77/OmjDwۇ2_Mג sی|'_QnXWjEؒ8"S"@HiD.> mL;zL Ċ)ә>V-~i<:T%rl|ڤdB̜bsS🅩mR*ԁyiu"55i_;Kmt[ \@r%)T H%tb>tYE 3&[^9cx*LjRj9aioHlj[4v$lEb!́PbZȷ5}tOZ7,gXKҌ<8la0>[Wu\,QjeI8=ƾTe1+B ~QK | nI#^=bª熦-6bھ/\Z0+gG2~u>_OfR\ Զ5 ~6%Id) "OTpm; `u18OPg, ,@y9T ܝoһtDR$*as@~vp#y(XBTnOO/.\ Ŷv^)KzSaͿm/KLB~YErtOo.;6yJDGU"̟(T(Bi;-f=s*/e%ӠEmڜWW2ciIQ*K1r K)ЦPf:omL$I@0# @$CG'^ߓpd`ycO2n#TR iÈT]z낫 XȾ(Bk##Dx0e) x"ɣ%y)]2V'Rd"8ʁGfRsd?8p|=`$_&fjIw3ȵnkvEڂ?!P&r~cWS%T̤/&S6ץj$Id>rե7\_9`6oÅM/l U)d( VWSt@*))HeֻK%lR+Rn;|ooQyZ12ʗ"'V9+plr>1V/ƎsP,Z{"':J2T::J| E궢99)R*s&xnVbor<K޶"_eZs[ssQm7 EרD3g f8Jrt_1U;g$hL-%A sۢ:]99ZJ_O t6nPhSVa]\sIsz!ē\Y ϯX̤57Pjݑ.WơcfB xz)_Iౖyގ$$C8o@xv-ł[>F{1/>-I$IrB^ĬqZ΃T~2w7ӖoYGIMg{J>]~#EEzd/+?y7fN 3@&"7Ք?!5;лG_G4Hφ8>ofY\ƞ45 F.͵.g?͌UG(٩+Ex_o)x[yރx&t,.o ymi\yW$oaQޓA˪c ~ףK?T^x +/?TsɃSysc.)ɇٹj!%Ծ-?t(KL^U_<ڃ;pEq[ a/PM\J{&)дesHfT82~γ$I`W4?9S{#tZ?6gYK!I$R!)ɘ."rH$It>u$)KtQ|>sѽ >_~>G]pLKir*Gb0@&&'=K;Ġ)׼w~Œa]vG|Oq7̩c{i_"I3M mL:Zzx9.o~.򫟰8 Ƞh}nmY D:͚ϖhV)jO[ M9U߲w UaLKz=϶Cן\.O0z[w$I$O`C$QQOXN!GHDC>6l@>D w}]?+a~w&=CI#cyW˩35n?Dxp4E9aOJ+ϚBron/Vb$Id>+RXQ"=?6,Ⱦ(Be8LHB1|tv9Ⱦ_LYJ!}8,,@jm&|s߶(5.nCX"U$I$)wLέnZ [Xo?@9.lP) P /~p^鋉wK FWܖwF/ʍjqE^OTRz1$N+_wfF >Iml{$.Хr`?C%xYuۏR* c9|+h߶Y_Z}vux`t.tcZ¨{hi|1Z$I f-&A;*c7xw"G72MyW<ֱp˟$WS N "H= dz; GHdƽ4JyH>̮o?c+9@cP-k= {c NAX FxXR$I$|i߾}05=Ȗ͛3CF322HKK#!(]׽{JߪS?>ispSl{d3& $Iү9n].4܄?X(.>O/Dl>Ig0׬D]yN!I$9ZgTVí$I$?>RH$Iq $I$_w>u$)KGu9n<3_Ss#1s`Ι+y>#fNSO.F:}|S>S5]J$IX` ؼp,bkD݃.?Xyy~DŽO?9غ;\p*I$45\}7Z vW1c|Eջ)Q0!Geh qχo_T5Cpפ-fD2Kb-Ng%/ջV0y8T>{/]RSHGQwRT YJA$I8{ڳ!d}"ajC*Ui-gq0e?K҂OrHX8QUg;][?uӡ 7]$sH]:_lZ>׆d]\JvƉ}J/}suMu %Kꡐ^m\jO Q @-$=$I$Q6čNjS ~\>nGɬ dƆI}TB"I/GG[Qx-*mw9s_6tb>$bǴbT>1̵|qR˧kȻy:}ǬsH$I2 ҢJ;-sSo/ɶ {ٗIu{N'uT<{@@4ˊoYjx/5syi$It4Kȑ?ꣅnu;Ҧ7zNq'Fww$[\ tk|scѼTnАKZ֠̑u|y6&HJ)R![6u\\H$I:ڷoLMef֭]o4##4Rppݻt:uJ$I:7ԮplvCTTnBCC T11 N˖)$I$`$I$%I$I2gu9n<3'惗0H$I8 M^Ø^9y'y]DڑI$I2g?9y l"pGH$I8;T C$I 8KP*CD$I S6m /F^ ,I$Iٍs~bs 55,$I$b%)`̉^ׂH$IR6h H)C$I WE)J `I$Iʶ)Щux`t$IdΆ1z3xb#!-h$I$p 7p~ I$IٞK$I $I$%I$I2K$Id$I$,I$I$EFJ$I:Β\bYI$Ig5sYpgV$IY\t঍TX\eI$Ig\TX~iB5_Fkz%I$Iw$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I|@0虐$I f h$IV y3{<܅؟$I$E;ApW$Ig>;Y$I A_,}H$IΌ|fマA$I$ $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I$$I$I`I$I $I$r+>#,ѕq7sU\}I$I2gAPvpxFVg6:D仏>w I$I3_JTe m?&|ܭiowr'y(Y?xu2o'[_tay(Vw+튅ܡ?mno1oڹ;^[|8Vū_.er/y-:m)Ci.eHW wصfʝO %lu:vFz3$I$%GUiTnKM}L禳`wB*ZɌ9kbwFbDE}'KːyNd1\w|s֦37Q/B?p,_s;}ɤF~&/ƃ+rJA$I ǖ IDATgaA6d^]pOHܽ=8\6φTڻY2N;jӪXD+BsS)W{7ƒ餇N']e.w֪J{N1H$IRvzi4]z4'̊uZrYY3EsX\ o Jrϓ38x~ :1ggQ5< pU}L ҪMeș[f[b/},HK.?0_ޯ0%W)UX.yVc$I$pj'Wϧ{iܣ=׋A4b5/b}R7,n`B"r$I$) o>d[ohFFSǤ3z Flrljo$I~ ~yFH?4.>O/Dl8V$ItV0K$I /ht;n$I$ $I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$Id$I$,I$IX$I$$I$I0< $ItF8[?Z@ -- ;$I$fBBB %2q?C`0hϒ$IL  $$B > 44+I$Iyq g$It3^ʡ|2$I$tOg$I$IY,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$YbvY I$vvGݹv[ {ԃzSټݲIAr+HzEO+ѹTvaaQXKM o!7в_nWQ3zҗ/,$To7wmӄB])Ά|h2h19W$ ػcm+]i3CHٸ(vlf7w=+KS=_z^-3GנÅH)]ԓ(IPrgM 8y CZ@5zϠv%  = |Epd FclI Db>_&=SgB$EP\W#F3b6Rtf/S"RS:w(@rc/83GX<7arrNyT _3o'ug&sX;Ω@;njIeZOʲՔyf zp'/XZ6qS">bmoծEpk?9A8sƫ,Vz(oãwV^qWS7!k{C-I~f~\vџfӐ'20zEG3b>8ʃuˬ E?P?#7&`$2r|T :sdk/aq|u {?Ȅveܼ $Vo=77N6f:d.K5ksM;.MKl,_}>3x8AO͜]sseDC$̓cWzqWۖs|}n /ߎ<ĀF|_0O={ WFlϽτA #eڑků0B8Č37hu9]Ζiw %yauįaXh]/nĭg[a#h^S, D # ,C~e-˝IeYscRR ufĖN{#'M\Ȣj]ىuޑL,[9[e>nd/ Hj_֚zrudYҢ 6IZ= @e +P6t&[w`{ 9(]7R|p{w9=HC x'6o`ˮÉdptS MYf0HM#g^6Et澞- { oyO;&$ d .KמKDKUErHEs?9q0ZyAĦCMp/6ˎvB/:GxT=k^VaroerF˕p{N:یӇ 3` eer^К|=0Hdpnj?Tis# /a H+F:y:>_7y,;6o*t"""; >kZm=̊i=jm^~3wEk.VŊX5*?ŵypD:V ӿI<뼄 6^xA^*&udQ A Ǣ9i=3\ \ 0BkNJyO]@.,X >Ϟ_HNudzf]~c^b+/qy J8+Ŭ/wpy*披uQi \%}C(ڰẻ*ڢ7EDD8hRoy]dۙdy>^]rmvvɸ{۲yz- >d&q8Ҁf<9xgh -ON0V?@E7b""o?1Gm`b)w]㇍xկ(l^Kfmvf<(/#/sJֈ{Z=Oy9^bW%6\@obOoe1.s϶r/>rl-8Oqi&^iƺ>fop6-X0#[So,`[%-|Wmf?E>ߝsk D0]wڎCý6w ?K>➕Tԏa|c_A)%5CM! Wz!a$&;p :q44M~ t7wp-z -:rÔi<^-a5O~{x)n_/?1}IjxvFX&r /*O?Nc=O5bZAMͽl{F8}>-7F >oY=kzfֲϴAnn~K"ߦ8Ny#jad 'V/eeg6oaի\T?弮"""""(((SXŕ:-+"""""׽,""""""."""""","""""","""""","""""","""""","""""","""""","""""",""""""9@i/YElB j+݃ E7ADATmܴ_~b~EDD8/M; " "r9[ADDDy+|v޼~Fm)8]]7s9+mxڸMK_䕙1%=pAN60zׄyn $f<j_xZ~!Wk\Š xa+ziRVs_ŋ|?S0]ؕB|5g2+eKPh,?@ ""wFP~>ِq8be&Fr2:5MwB# NDL-|fS\5?؅f>TyaPFTj̈́፩[*2'G.Eb<*?JD6aq۠j\KmFZ?sVMJ$78Z&@;gay8z;3`ŦSzeS_#I4`4{z?~HA1wtCB/u vى_z΃i= mBQ|*6.'3(*({j/Z˺CF#>:E{\q$hqSg:nbnt \) 7!_cݢ7ӣ_=4@\l*!- kk Y|R2V|ͲS`\BAP3j7Qzuʓ^`ݢwYڭToج^n9#S 1g)}&x㙟Mٜ3)y$=<(.KDDDD9#,ڕw8K2)[ys}nnhYrb/sU5 c V' .)vy]e\[`0pPdww(ݓS|LG $+|߭-AMxW]Q ˹wj GcJcomq+ .jW׎Z;tVc3[O0 %{|])wfTWXlB<1. @Q2NR?iMѤeęRj nQJ҇tZ]^Ё7م- YCnOYe;ҫ`;?E\f)Rm+VZjNȆ弰9t~EѮ+yP! !xY/Yjpk̑X}m7vW:xj33w8[La=<^9%] D^9QKrs}ddEzӋ1]ݩ\3w!v+]W^fqI\l,3---pߒ0dtpz}~`f:aIjiaoIc/ߒ>}i?25:ش7Pz~cwy pݳ^Ntd`F ?7N-}!3w\%CkR#c02Պw*ӼyUzVEK6A5>{ 䆷瑾 qٸnU=uo( 6*m7@ /T?]jbhP  ?4E3Yj.ߑX6_Mcz;] үD͗?eKz͆Qb1IE RPXDDD_\CJacy`:mp֤y;fG[΁cmքq|:R.0Uz*N'bc};8|+u{u"_}u&fPz Nޑ1*ŜI Ox|[w7ǻ̺ѾfGə&<9Dk8ý!;O8_p mDH>%nɉe \(Ec6һw=v"vؓdK0p=^4wklw66\4wouՆitXlǪ+_p?`_5 No~9+?xUql&'~EDD: ȵr0{pcp`G̹S䓓WLA]gմ wڴ9S5-5P'<HOjB9CJDA5Q3\8Ȋb3?7Фcwܘη &̝{Ҭi[nҍ&},)tN'N}"mndqW@VxsZUɆ>2^{i7ՉUV#vb'io&izhИ6c&% nS?mD0*ǁnKkOmq poH%8:"vrܝ7j?nAn}yKU'_tB^"""rSXPjW捇ѻˍt;!^4u,59jj'滺в]G']oYvfCzӡe;U  )!#NWuZ4#3)^ùs81ޑȉbcI& z2n`[j'9c'&$ǝ`#Y*i؞pz=KlUX7ocv=]!fܥ##C㹯$9LŞT0Ҹ7@<ʑ/"L6Լ@tP<؝|t/yE';uo[*$ԈƁJ~MJfu`&?8Q#}?rvh*Eq`"a\TAρ4 `'}itvK{!D6rMḽ4Vq2g|EMG04a so_x/SY¢2^j'g^zcgL"#u+ɍlspJ}u-e˟G9i6I1YDDDD[|FdRjT!&D bHXX> >E'9~"̓J!س8~3A'ʾn\`. ݞEBR%w5mRL u% %76zo=/ 8M<%3uq6*imk6m""",XD)fApLK&b8ج?ZLNb<9bs26Vp*S(IMhEBSvH-· IͺLE菶LXD/sgrdCCDDDDXDU>اv*"""""","""""","""""","""""","""""","gxxDDDY-" "׾@5>EDX7O5>EDX׶uS^|"k x{Y;ADAj[7к j*"""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """""""W@*gja DDDE/ y֟ݙ8 ,"","Q--)aAw<33Xm#w dfy*`TiI f誗H?+r2;JKJ&"""P\mLLbl uz DVHvn);f)XU`UEB;;umUB"+v).vPZZQQR # "Wcnw""","Y ZDTWdQQ?T&""","""""",")­vn>&6m7_]7rԟ xDDDDQ1{xyS:#GF&6JBз~b^{ZSq$N,]u`pPlr٦} J^ci$!XÝA/: !>qoɧ(pZN1_3OyU5-̝#\j=҃v$$&ҹS _PV-5uL\Kt~f>7غ'7|ɃR`9_a) <:CifMc7/ ,f"_~C&xo9v `K ePPG#nl~cY@ߟZ %""rSXZR\GQbM6 |BV8GH|W 7 iO- jOCpuXBFd` XxgKؿ2{~EH^-&1̆T}m)]H$f{x=ز!-G UZa1 ^:У cΝw_qo nϾb!eP{yvnDCQ6:L@R!Լy'0n+:uBDv?# ,~\dÝc'X+O0(/F';ӢQل B{ }qB9Ճ>Ȏ;{f̘1|L4>}DDDEZQW6> ˳p8V{Eg./8_@̃;ql#9"C0*R߂pشRv%s,!+j;7eƒt){Q¯̏ȡb^|I dgaVQ /ѱd!e#"<%~XdTLWЬ-MFs,+O4nߙa0x$QjTE_ N!.`o(-`g?[];_ŅO?!CSTTDaa!>,}O?bQ'`f;'^L_R_4RSxҊ.rza0klVey7G?~);5ws-cWYpaRnc|NL/owJTVVbbŋ.͛ǠAxӧE $""":XZO:MB/r=u㣒(6?oA597cTJkE[+UC*a hRٴgKb=_\?jeN\FX`FƀyxyybZLfeg6oaի \ߊ%5C """"r Sho~|5P\TłF5nQ zUo\T`.#cSDDDE6NT[\AcRDDDE21 y{O?&l|j+@z47|Dt PŬp7>N~y  \lV\,7X ,.X6{""","͹uuVY;ZUHgÚIu:h:?3(W2NKQ׷²;Ca}qh_fGhuOMg8,gFe{o mf-&XyxacO V#nyN.;?.gE ?Ow{B}!a:ƪR6ksG',_4'ULφo0-of ٸIK8| C{|)9Q/`6\ MBZ?Ú!g#cWs Ev̆ע̣|YʶѦB:fDMM9U ğOa|>7+T!Dy[DDDDES +W@y;CiVC#P,b7h%f0JR8^s_x'1Awjtm[IIȌGüo(#F~}Qn:}$VmKTW>:j?@3{6-ie v/ }ݡ  wOCt(FO 8NŐ!Xi7ttȳrw_¯kf}|תTst'msb7_P#b*{@75ޫól<~F= ;8.KxcǹOTp1{!hA9"""" "׳Lȝ@pojn4^JI;_Ev/T`҈&p|k|&7w?/ M⹢5cH}ocv;W7'ډRd0gdor^6#ჴN ,'ò1|CUd:Oz[zk֝$7| 3 0g \?(Qw'X^vBlOJNVez?+<]M U*(o`U3ߗgUKNl;ԹX< []4lߟ5v!:~Z?d利>̷ A}CTƔpwWȾP;ZCxLp=W"V,3զ`6 6~M5ޅa.V.,"""򷱨 Db!Cx>|%Uܱ%J)Fp^6BH/Pt闳eΑ 7K`sڜuuR uuc\ILı1ܙm<yr_ߎp'P.F_狋)m;O%d蟳G2CT~{ĩ||"ahnr[< sIwf/աo:+}iSyMXdw,, vr]JFY6_fg8\%Cv쥈mDj r53s˫}>,UaX7cQY ՝MB?dDX8|?6=y^|9Vn~ۨBTϞow~ IViGS2?c4 }oe]$n[sS\/L#1=ǰxMԚQ4w|PcWͥQ94?ZG U\1 oAϥSj}qy, #0{~/"""W}իY\b LKKKq8d( -!"^tu94Gn02Պw*mHªWUh> sN+""""@`QQQQQQQQ`kUM ru۴u"6!|5AXhCu " \6n/́C1 """W|fj`-F ""O>;U f oq?\xS(_Izַb[ NIDAT}o >YH4~Z%i,]GO㹵ص,!ADDD3X6n-F䇳Fu~ $F<_x& Wց弸)߽)L.'ӘHs~S_ /N!d37zzL+#5>gOcIAEdCƹb '4 ';JFH0KUھW37ؽ5N?]|}{K#BLy?F4 F;T7=VN秨L^I{\Ybե6#ڊҗoRT"edsBq?q&kip&6D M|xN5YF_*.zvy >%S&}Gְx :)Pv ^mvwf,ެbLsc8ͮ pڿdOWTm-1ulNf +PkH^vflNQ%S{\q$hqSg:nbnt \) 7!_cݢ7ӣ_:WLc_J aaAŦRB b >*'5 c,;U f%TEi<ysJYǨ<-zJ& WL_Zv!?4s~<ָvjvgܥ """";#,ڕw `&/ FlEt{Ve1~@9N\V2-Z < vqlTA9ޡtO"O 3v=ۃz6 7lTu,AMxWR߫E2a+7Q![-ye2{$X4&E7V"""""rwjVkG?:lj-q={W.};3b,kB<1. @Q2NR?iMѤe657_} Ha%wy:./O@Ė,;SpG.,+ cbe6ⅾ5.w51k] +q,|5^oLVd&{P=ZK =΂a/՘S"/8г=Q/(ĤHWRS9ZO` K$ėag:JFp\ JpZ9Q,3 Xbyt̆s[~@{\<{M८Uf̧ԨLgۻs=0C@( DDKAĚD41zb{jmc$\m&ͩis6MDA}n Nk:|3{yfor~%Mg`yN+8a_2=34IW{ҽtʶ,[b{}́K{Ʀzs8[{ʢ kUlkL! FZ#(Xg#Wqfr~ů^̬^G ciTA!,<퐬0)nvc\//<O}g{>g-ǂsG fK $FV-6g(/XVu7B a>_rTQ7mIk ¨x8)Yy2gr. e/ue¬s<-ʎ9z;siKpڞi_)ZkvN7|wS'BA|w^Z O\I&Ӡ[ƛo=){ΟƇ`!uZP͘JY˦3tDUY8Pzt9kK[QT+\0 T#%ŭ,c@coSxQx f,Mc9KeT( 8Vы7ygNf&>cf#Gc.dbU+u5GaUo1b{y-fAT}Oj |ڛ|lllnECR`(*Q̇H2Nt~|yCD,^Œ1h;8WƊ:&yfZs]p1rkNšb43g6FCoFyK !B|C*{`!wJBOTc=hWrMvzXw{}Uu4z6v=Ug -;?8,FJhD g?b U%|75utcy@~ }*q_6v`fVSuR1)1ܬg:-1OT? `"C{_L+z7oT:JaM .9uy LTzDRO"|tΐ8}5>cـ#kbьt*XݢȾw.i-즵UƮwXzܙ(d~޲f܉DWͦv7=fB!|%WÒ.Hay3^!O?OXtnG ~~h:i龍;`%;^])'>"m9H/gYJiAe+l*w~V Sz({駬Moo|py< zv4ҹYYO }G11|$sI7x)o~NZڿjޓ#䈜ɆșHam_ќ4jSO!yUuQ(<n6_0qlx ELd~]Hv*Iީ2Z<]% !B\i+XaƮ?UI޴MɎw2G 3iU8׶NT(7# )wQ-Q#huQLg=KyeE$Mx; +wgy cچE3}^>/`Vl2Tz+O9((lI,<ʢ\b^N|6̧nF>-)f'I}`*|SĪt5Qpކ5-IZ'J9Ő0qZwza6o˅]cxg3t~Qp488 !BCTUE q>s F&Νﺆgedp v/< f{_o a}ox0z.m׾B!n X|}Ɛ}{{{bk2rBg] ߰TgzL5pGz8_/cB!n233zטR !B!RPǪ[RRՖVB!BaߏcGhFz'UB!B1¯HO߮;JyB!B wu'-kœIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/body-fields/image02.png000066400000000000000000002672041461403617600243620ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxw|e϶l)PBGb@B w v;=N=ySςE $l6lYH~3>yf1Pn殸ŋJJoll^ Ū)i\.w1^UVQQ-ͳsARSSz)iL&֭Z`ߩ0 Pvg9 UY\X,V+fфѤL-r>>/"<*EDDDD>pxx86[jQ0MF, aa6 8 T1"""""h_&.Ntt*BDDDD8fl Q4~Vϗy""""M3 e6GDpLfS(N(wZK}`4p l5f(,4?4\?"""䂯3 5d6Tk"͐T1ek3~՞2y/Uk"^So^Gàm!"""~՞`A[[92)>y?9GDDDï35ݦM՚K/m{|j&n}Џs竚."!|EDDDg3nxDFD2Əٳv>;rDG"MA C!"""jTְ9j4}s.9r۶j _l{>Kѣ'~e~3ѓD cG rfў4JLΝйs5E qze#w8Y+ =wϪύn7ǑobH\\+23|dfrѽyLտ^gb+N{~ѢxպO>>YlXdɇWSC|qbvfm<9(-,g[sNf͚E^Ɖl߱'s֟F֛sIO?%1ODzzF׳ի?J3Ӟ4JJwޅYmԞ9!(cGpA~bbb!==-|~cGܠӦSOwgdd4M0B-1b8_~*hz69rs|ӧܻ͛6yFnijz|Ӎ,\>+\Ŵ 9ڵ;v}l;ushٲ%/o-[yչO%^p|ݺuez3f4w!l\y7rs/yS_2¢EW+Yv52_v=Ǐ呿%(?k├ """ҸmF>ʄsj4JO{NJJ ]v`jSyyXl\.l6CaaI}rl5 ?l^}3iՓ-)))|cgѢXDFDP >Ï Py<%bƌ-[QXX4}Lt ["==QQ{98ˬE]HQQv~xel=aa<9sXac6&ne/2_?õl3V{ {tMofSS% h~H۶j_L4zMuۇoYW СC:t]vs饗Я__>\1L&n?c _zV==wpï?-P:uȭNh4n]wVkKHౣFO,[1+VdGK-x^ g}Asy KdmnJd21sƝ|^|@9Wg5_z%K?z >4pȑ|}_?<N}?Wx[o zw2"""N:=;y=w]3}ޚ?{v^&ٳyǛv8lp|>FKzFZ(5o~9Ay^B׮? fv.ϾK.aǟ0voeʫUVO۵#22|[qTcΝ;T!!!kVՕhk GWDDDΝ0q@IO xJoqu6HANcб35CCjN{=ױc{)V_z]`~pïx͹,\>=Ba1 {Ӧ? ?),,$7'f&NN'qٓ|vҙ6jjݽL~3aa6vȨ(xZRz!&M@tt4篸2RSӂunf@-{cq8Ј(HCߊ3۷m+;pqIfQndhժu~?,zZb6HI:p˝wƲq{~ms嗑`WϞz*ȑ#غm;. ׋j%66>^rZ@trFI>Wys]كNM"22ɓ&z=lݶ;︍?_o¤I0g3ծ'_nq*9ߟȅ\4^uqݼ|vf3:g .yY :4/ǟ߳0tiC` , %""">Wr FMۭ:/WP{FJl),t^bv{^P(cAm;ne1~rrrXA;~+:thC?;^yu.[O<`޽;';[ek4{<BBB7 AA' П/V U⪑#YYU/`ƩSd߾}x<@H'^Wgj,ɢqǝwUkIo1W>1c=^?IIVZ);YYYӡOe#qqqttfY[ +xWzi\՘fG2z@{LmAdʍ7\7Vq3M]wh9vM|;rssJ6Jtt 6[u=Y߰ NH'22~+M5Gij|{!"""g=qzoUGӷ_uGam|bE=j4KKobny~z2nbgϞ̜A34CÎЬџEDD gN>YqHjBv<ZDά]Xh~0DDD=#?ӭk5JFjMg`(@BDDDF֢D 0g8_RBDDD==#ufE5&K e4u5H$ BC1f,,4?SI:R*"""g4=#5 6 I@4g& [xx88QzԲO"4 pUs-'.JA(~(DDDagc 9&,̦_Ӻ&Lhh(9F"""X)*.zถT+" SFFzcDDDDDDD~ EDDDDDDXDDDDDDlS\|"""""e0MF,f3!!VBBBK۲Fقll4iԑxJ3ϾR೔裡,""""R?M|>/>Maa!p[8~C- vSXXjԑdbb2}*KqQt6l_7 irԏ`1[i~#B'BzYnq @xD8Yx<mzz f3-[h R*žooRi 3Vz0F !.FMZ "##?~GoSHLϚ5kYf-񐖖F-Z-X-4Ϧ[TD=NOPi!L=Bk~DFFMqq1L:7N!**۷oG6lv pBz5$ظ8v;!!f.,xϚsEDDDovV,{<BAչ2ߟb3xuDFFjcWq1ل5~|]!""""-,֯ߏ?nw .] z{ٓ>Qrv/*GDDkk6|(Æln3#""6} Vdꕼ+̚u7|:WQQ!^o͎DFDpםwټ6ow]wAdIвG?u;y '͠V\9^֥v_"s}o>~}J՞` -w֭->Sthth2QBѣ;r˴u?[\wFŃ=ѣ^>g^3~X,Y]wAjj&&iu,Y\v\p)m Ρυ=ii6ue5Z1dM̺wLUrE*JGj.uU5>s ۪Asv)M{mkĉ uZY2pU~?6[Yx {~y-]f?f?xgʝWϞx_Z<y$_D;kQ{w־fϿ0xS<:!~LzS[{lN:/Q?mY ՟uEc?*?\%Qjwz2u<I\w .u~*K~rghkCۨ\&; 5*hLJ{~8JjQ2yJӨfiɇNUyT"" t9ǎرc tyڭ9eh7a tٲ QѴ(zo?AFc3o7zOM-<_9dp _^G0Ɂ+V;σ=_\oQ)Sn 22inr|%K3e ƛX+f>ʭ]܃;aAS>᎑S\\\pA}鹄,K8R3u=%`cij<`7\+S̀7wWyZ'nJ dR>Jx3Wn$)d^з-H$ԑ{wXہ}ϧ5u^Mm9-G( 8mQ@F :L7x${#"+y?kVnh0Ec0.ݑ8r~dŢu0`$#v!&@.1;os dfe{֪ќ0]i-&vZ.?`&lC4Ogy$umY~kW`FS5,sԅv__Ij!Lױ3, zNw *Yv \4jv#*܊U@][z. *,ۯ%j>^Gpјۡd}M'n'υ=:n(k>[Ł_,}}gFt4:bekdZAi8:v$W={dР+xpqhI(,,ɿnTn5L@ ;~^ W d[q>N{"W?:kz~K]r͛ڵHHͪGƳ u?坼P~L7 ;O_yDw =XhwmK=-]:`0D=7\svš0;C`mOSsNݷ 6#9u~Ҷ;Yl:qkͶ>+63L6ZZĶ9ˆ0z3tozعak~zX/axRWΊ",12 IDAT6 ~٫ysND>X"k7t)K-AZNfXL6~\:b(mm_={1{% KHGȆl8 {w𺴨"pߡ-u,ݓ%=]6C`z2Uؓ+_r6ֹ*_p۶{ks> l?Ƶ_wP`_oMNj+2.{g;="۷=u Aӏ;K/LfVVQEMf%d=*9瞩zƷm[]r%cjry2d992}?o6m&::Ġi;vdĈq]9mM/ͷƍ3Oϡ{[r yedddTLUP+O~OѭkɠOݺve'UrYÆ%Et/ _^޿t˞\Vi~ì{YKOyNLL"VW0jGOGUw1A^{%>1G$S՝h*ʄښ[e];F0S!`F12=ngŴ!*܀99YbOv&9\HYX2C=^-9`;~="8) 2Lz -_v99] N#GI #pXKhT8't:Gxg&e5ٺӷ}KV#H:1-L?gwi?ҽ`ڴ2Zԏ=ӯW*.H;̑#yQz벙թy9Mޕ1NPKMQ1$Ar:-z%؝x/uvd'hZIp_?MN,su HbΜyر#|?;xS%؉ה u1ygaqc1=ՙwdK9}5|O4/8yb.8NSKnbI4|'4*0W:1ui!vi=Tm%Bb4cZEsl{ZsIL>uXg?N361]Oɸa7D=;ٺ}힓判E >KL  Z5-)6hs8 n1M=2*\.Lf3Y T@`rU^5]]|n^VJ'.PWr&[WFD ga!>v+'NeX;A~ۭ t7~[yQ믕ILLO޺u+=zheffG%t֍H6lyuJDDi6n?aV+m۶%**5kթU2\F۶ejVz8hSӓk6@~݆z{ҭkגTDD<O>8TpQ Ķ}EE'xҪ%dsg=5FnЄv$.뎸` ,6DHl 'b~|m:9myl;ToSS^=f_ 02bv,+uL7f3{`6cnB1֪9l]YuV1nT7o`Ybnk7F\z{~ʫXvEuQzG\͖_rSkx}}mr! ֩W_Ioml6 bѢ=0 w* UX,^/))/X 0eMS:t(˖~ʧ˖ѽGwc̘1 ׌z}E#DFE%ܥ6T~SrebKI͛nh: n]y( [`}s&W9{fAiӦnPf˚5HHBj\Юm[{tmsyW~[-(wˮ|~d w38TK#<9ܵFŨxdO-#'-bSrEȅc tv;c9ȁ fovyht.3W:CS7S2Fi{ܡϬXw.^H8_.[̖b2/yY Z5Il2Tt,2U,TߘHrF&]^|e.eܹ>55Aѣ2hРӦ#Gjki~٧!{Dh\{dFŮ* zQ(l^[}N9s*F~pht'wJx|UԞ>}ڗ4r\Yݛ|r pjKW9Y4f>ƣ鯲9j-_-ž:]PfDEK@wp`PO{9n;1\^4sW_AKFpmzid:ՐיĶMH&20j\vMǕlpA ~V,MbK0Me&w!r¶>2 Z:܂+F3 ;v°IN!^Y۲8x)gy Ilф97l;En , ,O&;8! mmpLڝ6q™ʼn 7^4(FNGiRKj[>FhLdA^ouQzW5 Z/c`_oFP\gM>7Ӿ":uѣ~-PqFMcVTx͚R={zܣgO||=fb_y~[<^6m&b(`ͼKkHHݟu6ߍ.Qyl;I+?⋂a\6`[ K=L9c q7yJOHV~!a(X|Gx;t>mCS@Vvp k4q6I٧Զ $m<^i߰bs@ x\83v/?o‡w8= <:%]lO~C11r غ,֥e c z>[K_e]T^sS b |\y,ejbTW);HóѱcG:vd9_mVp2X%ݟH~~~)g>di*b!6.b^j\4rD66##=w]v=gz P2zΛsubtٹs-^{ñ۫tg])Sn`!  oh+ ѰWdes*/i]DDD*^al߱#̬,^Ӈ-cxRk0(p:iٲ%iii,XCykNނ<g٧Y`aQh0FTd$ӧO7((bs?appYgt}~kޙ(r[VL&sz^M^M}73V˾,UR#&[o1+gSyjWt+uͽN[k{VPZ2 I-c挙,tiok3o~~L<-kx4srT9[Pt[-7A-)=TDbZjAz\dE61?94e1X5wxS>\5V&""""rբZr۶ńv+iFFF2tPMmv^IMMa͚%#H+֛f ]**Bx<<ކ=EDDDd gdZDTTzFOxxx`thi8 C9lf=fbbb)**Yk1¯HSt¯h$f#44 C=&3~All ;~~ L&%Ǒl6=YIl3FXXp{<>|>4UEDDDٶ61LF,f k!;5`0`v{J=k6Z1͘&m:x<|/^ׇhNyVBBBݹ"""""1^O1.UK=2`<(EDDDDD@XDDDDDDEDDDDDDEDDDDDDʷgVDDDDDD{UH`kڋzSEDDDDDAXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDlҥ """"""5 """""",oEEDDDDD 5 fU4\sM_`EP``fD`HcǎjۧOrW"((((((((((((((((#@I?q<%tR2p8#"loMVoOy2?##r78J(b*/utk9V;(49y| O;cep8$8LtlϵGӢJw}$q⌬K܃=@ˈ?iqv69+hiW^_pFoyOmO[X-Ono?NDDDDE΄fM|n7|fw6B&ODDDDESvN+Voe]j=9yΓw5uY{`.]EDDDY5l~>dnyB1f zoA(N%vWs""""lX)'*@'_p'p$HaTr}w9 ,xwFf0":_IѺWKNxJ\~5ѭĔ0zH&ִo9 }^򨰟}x;;Hm+~H[4"3 \mcg_4 sn䘽deА2'8\;4[MxӜys}|7{[LӂaK*w650X,ƶ&Sg.81W_ƹ-è>&Χw|㛘&r=vh}>c{/ne#=,9bc8{FE%;N!r{]bo)>_I N;_,QN>%x^Xp$w!+ŁreaWQqPoNiDYXkb|ZɆ/5hn7Y'߰9z `'9S+&p '3 ;weC?սc}O5>(m 5D($DI6*A-hbW |=G|~, t(=c{Hs4}I\ W9FϏ!$zm6~zwo39V|L[?>Ԁ#J,""""Ҝ&w`.꫻ը_gT8Ưavo.(kwgG9w/>1ӄ[Z1Lj5ޠ=^on uRt2@{<%mU3 = D8r~OS7L'tHP 8\#:_$e^Oqkc|xg|!6\;wf_8(,19l]~x<24'n|[zN(-[r|Nla펢F_oܤzYViln**_+w״3>/KIM{c~76_c/{_o!#ZFYbGWsqCp{B,Hפ{[ 郥1hvo^.w]E1Vl"ms1}͖1( _]}ֺ~Z sw>=voW,gƣMuwY}[-m۴(rf3fkI-< q&P[Pe:#:)Rlo\`NK9F XJk>ޱX#0?y`ù/qmKid.=3z}5wqER=Tf` oMg&eӊnVllŚŖɁҾbܩCӺtIOq{ IDAT3fΆ0sYتN5_Ev$D'#䆷M##~ qt ȉ*/, m =7?ZMHڷH;᪲sIP.7s^I8 85Vnhe_>g1!;ʱ݁ !53]{ǤNC>Ȣ=K.ix3V"Z~(l[/9$2(7i{X+6ρ'.pƂ5m;CAØxMV{~@ ߩ==zd yk?7[Z(]op7N>0o ˑy[ ҂K_%zqr zr6jG!.5Xw,ī{Fz7vzȮ2}O~x:c^?a2mr8O.6 o{ ]jL m.Ô8Bm [dr%{)K{ؖU[G/ ѾʹwMNPĆl֓ic4~?|u*&KmD:q(k\E/rkF'0;:z V\C眨?1tuTg%932(75lx_sᎠp*L% ;sopi>^=O+֍ٻ(ōd7e$IE @zG@)~ ^ kŋ+x (J7 % !4yٙ3gf;9ߛ{Xo.-\ &E,Kr@(JQ7BΞW2| ס78NMGhOp8ikÍs8~j q(e!:KۈLj(Cm_oplZv%ڄ`$flZb^gUzmIDDDD˶,V9(U7c83_|Do81ả/RN-I|0?5W63w!;RjD]:Ē#޼miwF Po?]BۻO.y/Q~,J]k ^o_j?L+?b+̀;{b\)--L_Β,lֆ%]m׹u,ٵe=V\r/(eiǸ¯Rf=n[<l- : _mڣDX}BXcڴ0?,89 kֲȳg`|p_:?BN—w7U3!SF^|5+Rdu[;4 aɦ Zvp<59e^~b*ѭK[,^U毽n]T% kDˈp2},"#ȯ~1EDDDDJgՌUu{?Dvn1'Yu!Zx Y LjSpP?ڇi#ӽ~JLEwc@4ٻI0ZRtNg½G@4 .EYbݠ-Nf]:/bx+V-dђ82wy{YyKG-#F!1bBRDDDD2Tot5YsKb뙬iW9ӏ g8|0ZDY3]o+D֡qMn;F``UX\m,.,yn*jm z93JOЬ)|W|!h޶S7Y39s4=ju{wʗ:b$z0b*ڂYM!ǞB\Reu-׈}Z?C+cH ̲ZJ㧸~a7e[t^zf-..7-YnG:I)%ht00X:pk?8αKX/9sOF+#"DWR?W_#6ϡS?Mdt9 A~a ȯ?ɵqw9#Z\aY% T0#Ypd\W.zii݀&hP?8TS^ݟ ݠl[\֨)+e+J1.jpb?>艬t[^ ,nZ W#64쿫Q͟g=W䗽w3sfXV&-ZХS[ׯxŧr%maKw.%t>wR%|݇VFQܩn{<n/aN@|*>,=Z?k73f_+l۴&6i%npbuⶲ}+Xԓ>!?|(_l\0j##.~c&jtFL^yAבα=Z#%F]-ߔAБYu= bu}W7ADDDDDUJ,>g ԪXYrdFtjDOye=$P lp; %ו>+w/\CJ """"" S(ya˩+n)36`QM̡l>OcK_EnN-rRZδ_5uh5ks-ٚxֆcTs.|Αu~6u| ;Yl6.Hf%Yq+yiԗ/!MM!+'|^%9u2$Yb۵y^[,} I8oYM-UT8Ί&u:nJ!.+䕴,ٸlڙ7G@#n9feûMhzJY؝j N݋fZ4AH?|b#D{ؚ9qM~hMn!}m' 185\ԵRc M?R,D]^-"""""\46~v^뮓{73woYAConX8Q.<7b3Cm,2p66,J#@Ҽwf[J;Ȓye @UK.>gpc:D!#239Qd;-,9 " ZDDDDD_<{ҨY.>RʈvZ.]%=b[i+TF>yb؟[M omE _6mAb"7W).8o\׮A:㿑3cv!>NBŐnjщAil YMP>* _Z0m?-[ҵ=tLμ~V/CQ=-;u{Z]wޤ*|6y.kcI;1Y| Ltlǂ' h6䦎MP,L^ODR"""""r]2uSyz0's9i.y0 eS|?*xzɩof!ᰃ3ggTpsxi>ޜE L^ק2{914ur83 lS-Epyr!|k{6daˋۻWkeO'Fv.3r9k :z B@9UƒWk¤fi*5?q+yb$vr˛Ga):RCm[apXrT>9 _eC:`aH['J[6/5)]""""""WgϞFC=rL}2r2|`~轊'zn-_OX<'DDDDDD`ǎLtt4c E֊@ov;X<4xHY9iV"ߝ]""""""Rx^+5Wd?g_UT&]­s%+U"""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """""""`k&U8K3\7c[%~ >q؝*f'ig >KSLEDDDDDn|5w|1H)Xlr v PQ^l z4b~Dو+{SLW{rpdj/xUݶa-ƅ8 hKr{ehMgtDDDDD!/2M4رccǎѤI^~eUd)]-Y[0Of$6.,*Q {!:8Hٱ#64;f?#vl[k >}ѴŹcg8l_C ڝ,T Mا>E|n҈1_]Up&s,Xv;Wwg_}{t\kYy D4~.O:K_'/>Yrx''dݚ!|0tyYb;vSN E+WE^87[ :=l=ml҂ ¯RFCȎ[Go~d'{Ȥwն|{`[9 @6=X𥺟ek=?d 94H2OJţok3ak3E JEDDDD{`D+[39p.ޖ-jb<s]|83gl-hmpu{x+/JVM_FPH B9T{op ^MusS 3C40]˿ځl:JKQO B^Z(hh&+@ +5~doHLgI{ّMT^`r\yD6GRn2obwf{/^gx_IX ;3N&\FjQ. 7X R z U`eX3`S|Խ|u$"KWM?el'[."""""r (pa0 ^Z V<Q|K0jjC^ld@HV+K+LDDDDDP~olaigZ;P*9f HLTergni; o[^Ly}`MF\P^ÑEK (p!ۤ'qQ'Jjl 'q$)}Pi\bٛ_Uܯi~HJ̼H]`?sEkȍwءJAMTqdק6/bcf3]^s Gtد-lԕqz'4rڎb; ń m<]鬚?XWnG]""""""E]C-Vbz%hM`0p\8Y[9aFF4ˇ@hkrûj-hV.%Mnn.Sxnysx$aDDDDDDwFw+X>,/Un^e $3*235Ɖ nRlFFZ~EDDDDDzx,tMci_: ҥpwJ,F]g 3y0ALصWj{MT]ϧɺK9n~);5ό+xm㵯Gjʿ q eN`՟~'{ ‹? L8E^w{w4 <Y#(EvZ%/eʆdƘWn#*)[l>r,| HDT[L L%29{ 3Z+rqV\XK[sKI/XgDLᵑcnȧN4V3{V>I:P1]#2WL7wҨKk27')O@Otes.Qgˎ{gHha 3ky,kX+`$'>-8\4l^S&*,xx0De;W:Zh\U^=} Y%|ڇ5kP/لc$ ̶@B+}>BK0t6bh(T珐2_<0?&b=`ӬDe?2gkFgӃ*5$/ l߰d:SZw)1 /Dd:2;z { xT&:9T=O & ۯ+~%>%^As86kg۪`LVCpMau}Z/5kGHq%c|d~̿aM{Şc.NUY[6u^^!]Ca@riLO+"  g3fz3 -3wxk)QigŒ'&[5:;ꖻd^hRv/f'g7Rǰx$dȰ]t<7'1>rc=36 .AAO|\"ZaiO~ܪde6wn;5o>/![A5zw Uv*4j8C_`̭!@6>3?%2oFf$Q>QLE|i 3ri` NNK*̭8Zrk 7=jvww%4ybp/!p`u޳,6NQ Oek9ku}eȐym4ˇfaB)@hiHA?p?3K si{_ vSi'tܙ?q=5F1-.*K_3/OkI^.AQ}m3FJ#ta8gάd)G۾= 9ϥp P~!U+Zz^7w`[MbHj-ҫQޝʆؑ@P ԛlX&jw` -O9dڪc7_3'~_nVxN7Y@RlZYɱc8my,Z=V VH8Cx`dj`2'vMaP>Ml ]zʈwPy?}2&"s~7$ k|?=O>O pxR팬wDDDD巸 Hy.0V'7HsZx[Z/<Hz<,fi.aU݆4:,@ֿl%U/6Lp dƆC$$$p*v&'6IRHuku`mHvlڟ}{;=ARХ8Vhdt=jhol9"N8iAzvMDЈ[I ڟ )oͮNLIJ9RQ҂Waߌ ݟ^lYNz {~B`F0䕿5qr$whÎqsjm՗7Zf@=&k0GE3j3t -^W\pa" !>kk oT[|;4wm6rp>C밮|uWȋuԳgO#ep!9xwjNݎ{ ɚ}5sY5q&<4qvWJC6I)r`3{C7{k ^Șw_ogZʸ\3ﲛ#Y(\w>ȐwA<v~ɏFV߾#&>ocS0Ú2n_,~l|k8/?KU:>WrqTj)#{+_ii,@+C5N[>U#pbs|^VEDDDCh/;wrnP^3j խx/!1B:Tl>JpoܙkywV/ǤϏx48wfP>8ޏap*$2bHy5k&~Ö$7a+xTQ{HK&RE߷6Ʒ4z9ݶ>R{Xjs_k'V ಧc ƽÔu=я4ƹwo5G`G*`i6`Iv+g{S۱c>d~`ps/l-mkfig-9yx5MM[ȳ}Κ̚ $:wxuq.Y%܂†<1vl@v~r'ر( GX€ x[? -<3c??}z!etlvme%lKOEl#c;~_|;R5u)SJXGhC`le^#{բ{2,W%Y6c+xpt/u{I;JiR[9DW+""""jx#tzP'NC: (ܹl߾JM񐓓#y Ա/zN׆wo' Zrg`c0;뿝ᆏ 9=#G _ݺ~^zԭPqjNDDDDDD?DDDDDD. z~[-{z'L[XDDDDDgjb1 | aX,vl6X XDDDDDHB 7-; """"""rqX.ʋ"yzXDDDDDDfz (((((((((((((((((?›) M,Mͳ$c/sǎVE|6e]m0wikӵR0`~Q>3k+|Z%HqXV2a _{䂬۠"7!a9Sg2k36`_vPIWіXqBZkoy7e! mCЯv8so ²[i:fWbatfmOAIjv .;L$OcR/2񹙔4GG[|M{qQ&ypHGCނdmv5;EDDDD$uRڹI| ~YL>ڠx2Vy ]̶7po2m^\5n}U}Ɗ?E~q>{Ch_OX_ѭNd6ed,mLLsudLfޞ]xҏ>aA_RF?;;iLg?dql6L2f^Q'o͆Iׅ0hcܟ`c$7=҅jir5&[|N2fH=rV )^n?K!>φyO.""""r: şMa =|6cz֤VaxV]Хg"ޠ =6GӊddYmz^l-nRmkY|q t#''uo%v{סZ6P']֐mr$-.bBH ׭dA7.yA=ґ*ki.wiL|ةN/+M{nt4]z'QOraԈ9iJMΧRU M5d]Z}.>,2_DDDD˚^G?s NZʸ ߲&0nOᴈs8N Y P;9\@sWx1)Ar "Gz V0/\mNjϖ~{hɋZJtyɎg0",V#и6(dGD$h^+[> (,ai! ոRcg>- :d2OYS޻,gm8e: :x БuMyآjbgӆVR|J&éɬ7 s0uqSd/J^oʦJӦ'@#&G@P&٘D:?8 }V09|x%dl =c]B=xx8w-%fY/bY`3)Yѻ<5a!:.Yۖ`t~cDLyv2w1c«y8ՀceXB "ʓw{;]VһwJE7b9=FNKf4֌z#٫x~{':lO4L7D0qi;y /MBns/}9e-o Q5sΦg}+5MǃP5!yd"C*p:l6 o;rׯ?yի@z ӪUF#5\`JDDDD䟡,""""""W@u*ZEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDD. qwV͊/j%U""""""[-"""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""",י[t4?5I< RDDDDD6V#c꞊(_0&yα4k/`xxG \BSQx`毇|-)*3^ZoEK&X">)5S2ᰉ`,u"0Ws.ڧc\dxTo O|;HsFApWB$/\ҝyz,1U{Ds MÚƶ'oa5 VO}Wm!D6݃Gb| σ;*`x&%`aOn~51paD^C]Q8v9W."rlJRiqDDDcM&I|b/^[-Sv({F{ބYjU|cbplA1yݔ" Iiy핷ޓE@*DdBڶ;Xgs;<6k+j*W1n i*?e>cLg| 2uu(4KʸgZfȊ&3ٍk>F0%7)t̔|3߶ĔSy]/ÿ1~t$"" ݮ]D,n\.{Pک,""W6v2 C{^ثp4Ckqr><>N<7#ؓב`aLA 8{}kc7maן|dݎyo>y'OɽuxN;̍1:ƍ);12zuğ1Q`cL@d=,-#-wAGQ`-d*/]Rkp"/pDaV_~s!; S9v0vU ""rY_{S*.M0](*b JS} e(I4K+UF?s2ٙ$Dq8M.cc88<.n JMxo= wמb:@9/* ?n;:'<""tIŇ.Pa+msm:BVyRQ8 G6l%c`l8mR_ O.nt g BWD/x?ADD/%!UZ& Ӏ '\\hIxS:[DDDDDvla3;wQZ;'Pv-$Ԧq0ܮ<< vnA\d;wK'`9+p ӳ&u߾3]gfJ(!ݴ5inoծpa\׮2MAI ϮE.6fX?inĀΕ yٛ+2 omYGV[6w: KCjO.[HxwI,Δ?cRJ䩁$}_+6D>YӾaovֿ. V~; 9H9¶YG|tSTnp=]k;رxɣ}Gۚa#A}")iARJQ{=9אA랭Z65Գ 9`ȿo`bkDc`J'%ʖQaʖ+[a !/^ۖ,2 =zlU/T;N}d \d=8c0jtoj{efZEs_\pT/w"/Ig3~rf)U o@Ӗ7tHp\s8u)%,M>D@hEewBYC7-޶/7ew6fw - :&U6gk;W+~Yx9JQFGnڐRpk)q5]˧_-Zx4U剈\y8>7X|N '>b&~1K8FmIʦ[ɲC~ 7,] +!JF=ڍ((/A8`;z8$ IVr?~=={k:T`""""" av B ;TKFE)^fʱ/`qaذruﻹ#x t+|X(T)_) [,7 }3|+""""|fN+V&۽t¼&(Z4 ;s8 'u?0kJUMBnw e|ϗQU%l.ZFЫvVGrvE%/T4t̪YH3 IDATO(nd#8,`sYɟ1͟Hĝ'Li+9tZpsgo Sydc}/>ҎyoǼJ*f` kC#ZQ=|3o;r}G3yeꏬpR#ک#PDDDDD1:wlz}&۷>o_ix<\./o&ׇ]f-x>6Ӫ l{ZUTQA\b?N'6 0:rׯ?yի@z ӪU3Zk N|Dk?-j(76# }]&%"ba@:GhDDDDDD/'A8-$.6knݮn76n⊈Ţ"Q g .K!"'\.J|"",r+l'/Evv6n[""rn7(T/ \v v 2("+j(Z^RUkJzeR@a^2bJh]4y #,rz3u$y9B1H-y`/.'fIR@ n.HY}>jx5'L?8UU Tuj&&Yl|vnUΣl_MrܚZe-@)jiKh_/)&oA&$?i;KK-""""""e%yCyS5fᴹ#MJ I9 L kY xe,0`8#U+=+AÆDs(陹@ {E^+g[IO_`νXc(8q{l(Wٟe+fݺq{T4$Z`+3+P ؗP*FNQ! BZ֍fPn-Eqo~-wEw_ 2~JZ8gr_4]D^wbwȽZ Q'"""""X`,":7E#&|z߽h"c>WA"[DH`%Mӏc սQI&/( >xf~nboȤ`򻘉yXƟ[L q,OXY)!g]XZ wנ`GWN&~0U1*U9"""""W(5]<ҹ/mf__BkߗvwL#OoXw~%1~(f7x܇wטvG`CgÀf'Y6Ͽo3$̟TG:bgU<::-xּG.7g ͌s+}F oeY'7t [I*lmCUǥGT^q66ŔAU/TLǛ>}+YO@|Vvm+tR:EDDT'[lsݙ#qOMbhC+=6wjXImy{uʻR|OR7#k/ڏLzcnHTZ~↚% bV|Mp=8~ݛY~p_ӟXr-/ODM SWOXq \l}'K?a'l|}Ss(ۄ!S){R걎SC.LeutaqCPZp5G6f㵗Zv>'-sh7Z7?~`[}yE ݻ9tuwÆ RR%yv>I*o ^Z~W=rVg'0݉L_kӋ뺘 \a?5i9[.ג½mʲeی~c#wm T47va9[|vەg+|!o^ X?˷tBjc1lE]-tn['eDl֐Vuܝ [n35 M`Ļq: B ⨆uy|;ׅu݀77Fu0ڣm~u>FH/Й/""r0ݛywXڻp_R\<66l/my\mǩ< kw iC?̳_R}j 4?=kasیg<]f~nX`aA Z3܍wǗ~f'gnt/m?KpKj~,DEZеL q7Za)=x^D 쇅::dr]):$S#:fb)W@^S?׌뚟`Oyn~b=Y/IZAUv.]~bjЙg_$}Q>VGI.1<rӠCs"XONְa-]~_ۚZ+X #NPAO"p Yt`;uY$p(/t3'3`|#z7W'E]V(, $݂;i! %s/q;wש蒶wҵiĪ 6,ˢM+XՑ!߄䯿dˤzAY~$wfvmwߟaÆ"ؼIӪ^{O oK =}N.$9C@d\e"_2s횖y6E%Tj\ہ[jV>} D\ӘDcp0J ظeVZ'o^dktE~B[~͖\7.gs2\ש֥|Rb`0ipū(\dY(jPjQŸe`&`O nR6*-+.K7^~z>  7ц}6{!5q`#1W2zKW kd;< "q:+EDD߽˘OR+όiCi2{36zpgnN$<.?dq/aܿ瞢~`{e"ZziITQ׼h]ek!1qlZҍcagI9!Xw<6nrd &/<@ nTYkV#ž+!%˕ Iñn߸뤻n6Cz?PY;H~ugekjo^~9]Ku4(9q#!"%u%o-.) JFPՃlޚSx-¶T #tb':,!uޢeQY|7=mVt耒p,&ЕjDv:,^Cdr!LjkM4uA}07cy!|4@QZ}4N|h# ]])FS4lUPȳ B!#s|]Q63+l?/q]H$DºTОNz.n׭\qȉhS?2#6> p0>T\'u)CO7L4DZmmqQeLx\E]ųQ&MDY'1J6m,tBUUd2a0`k8Y0iRmGhHgn9G \HA_12 B!ft^_-uܮː̌+ΠY_r޴oGoAz[o}|jymۣPKttbŊKe !egv+2pH3JX:c= D9\xרb,ˮu~7j'̎n-DodqtRԦǘLިſCM\HcǂE,7x Z+U^f;-)~v&cĞo2fQ*Нbi,7el6P{WFߙvY4B_u|5j;M*6eJh'rK}:{-dk4@ˢ)9fTdG}ƌ q諴d`` Obg|b2Bk %f$elſnp*r> ^TL&<ɳ# K&d]ۭrQXc^wާ襌+%`H/^0\amr Eu{˾VӄZ.m&x$mci,YɟwH xohW*S2 ?䵏d2/מx|<#i{:z& 5E.\H֭Ypaխ[UVIE !z[-6MntPJ'FnJ|3x7cmzupGUW 5uI>vV<[02E qpL=jDa>u t*y/R<ǎSq,_FW>4^.czI:j9|7j&Ӟ6u+>B)wv7GD~(Uvl8hXύNuQ$Jv+kn֯w'Fņ$njfuYR,TXϲ*ׅ1et7F#<.Cq7a=d~t9f(s.Qѧ T)%9h\"yHSYp$6s$-]Y6!L: x 50]ؑҔy7p7S3eTqWye"U:Ak3RJ縜pdM`0#빛ɠ~IŒb.TR lg!?Sêw~6^G^*ȧocٗͣ,>θj HM󢌪rpӭrΩeYyn֩4nN8",8s04*lMX!dGM5[w\J9Uѱw99OY3_ފ<38^s>T̙b@ZIOׁNN dyٺd2\]J` bQ&9 &ͼqsmK+}Zb\`{bO@s";6 "P.-7E7@Q ~6뵩Tܳ %O؍XL*:7/J r:Ղ·<ǘ tv/EQe|^Ep]' =H̼YfNAaw{:)6) z@W !BxʯN/巻nѽ@!-w1nȰ@oof\#)X$bvrP nuqb%gh`we[/BS@F7(ETI|csWb׮fMBOLJUN1yѹ{=|5$F&f_O\Q{R {kƥ>| E~Nʼh6EoݠUTPUTnZ5ii_a3sbBK7qAuuFTU.SƝek1ܚ]UT+NI[8f8ΊHmѪ9kUmĬ`,&gX>o \[{ӼN3esRƗeoӭƸ݄EKkռv`~.ڕcNz/WCYƶҼ sDc_ǾNC+_.dI0CNTI?QqӀԜǯ7.DרjͻvA 20rbXBh`EyIBB!$?ʿ97{P@+!VE؊^0,XWX,`΢|۷qcϯNa!D~Uw2~ʗ/ٜbAѐ}^x$!X!0W+pΖHPP{&>xTy0(_J3JB!`g; h޼9s%$$'N`0 "/ TP 4i)3 &1N.HB!,{*,ƎFvԮ][*SXDEE}v>6Uu }Z`!BH wFAղx,!cWH4 *wߦMZBpg/ w~-GE*MP-nr~X.B!,{w_"|ÆkkexB:6u+P!3o@rI声TX_۠*Bǫ[j' !BH~OsHrVr>YZHsW1>B!x XpVkʝ.Џ~ :kS3 5l=`s-4+aBrZS*ceq PЩn T~ܒůI*[WDZfՒˆ~l`3j)c̔?-ivTqAe,NAZiiYJ W1-~Es-j(nsd{[umDZ'#QxOb,{^aXc-5ʂg,)#UP o}F%B]GBf;f\uz\Ҡ(ǫ9u|B+H<[Aa~ӣ(3D [OZR9 =9S1;e 4\ޞ\,_; .ONBBцWzn57/L9dfj3N56GjjkyuB % Ij|SN): 3x߭.wwB! އu+-ժh(cvog?@P]Ƃof=bh!(@xgfKWY`_ON j8:*h3P˜6432[ E[go`PxpD2h4kl]lw0bQ).gNW qs)*KIB |VJW 9]%([258x*0yԲ eoW J߄G-uGUr-UxtwB!CqAP$]TL*N[xY#:iA--B*݄5-y{-րA CC )]NZSKKm'UaV7*(zDK. T=d&=\Oc!%BR]5VYa˟jYqJBB!ty\> eJZp0~ˇ[H뤡M _MffoP &E:_ Z~%錅I̼u9B .XLM5400?n 5 meV3ߝ13^fcfF3^ێ6{\m?e奴oDlbkZuBJ6m,񯜴L&222Я~W[ϊn%gnl0>ܯrI='٣ )?!pdN W-uYǛq1{{:4]>;tu_łb4[0ͷsx<߰ʰf T}~V1ih4h5Z4M(N B!=1 ;;;t:ݿ5==_[{}[y7W29׷އUؽZ&7G⸊ 4z_6 !/)qKB!]Ouvn@_: )C}ul2 6]/zDۖ?jI9}_*_wRpi˧KDh= ]ʡﮢxnak-| ^v$caeĐfxsf3DEm#*Ilߟν)79r1#JrQoZx(Of;1JHe:cZ縑i߮a44E=hF7WrO w u+7ɸB!S=92S.ޞ20>zѱ\kfʁk ջI- kØ13)1}m `^ёUĠ%H<_w`Ϣ2X@Gh j3>^N߳)%2{\kW̷.v:$go u(qȪҍoDLCO'QIyō#ߡoE["_Ct"B{[lk?ލCZwZ>mB_wq@V4B x}{%TZR?l[]ͦMv%RTȾs~)Esx初xܹ*tqrN;g$Aˠ(EEG*ÉKMjn`9}IYm݌/x`,\_"׳;6CFJB!BH~ҕٙ6.9B3Cg={gZJ6~Lw\Ř=K2Nء ]7/naty\쬿ׁ%#܃#gab:θ^XC) .\yuiX‘y8w\ <4XŬ@:Ŕy'_1 [;UTՄh1"!c7fԁB!$=:rZԯ .z,ZBTԵH_cgsP(Z@#.RIPѸXs귳ӡѕgȴkn?^{/^}T IDAT _ߵ7^w.%o/ rǰ0oLj&ib+قlF[ؑE"B!{+7Ŧa1g(5_e]q3ĥӬ_D$ o=;#cX7{-L*|rH }(br9O3ϗ$ב DиnikiX͖TK%N&NRxb_Ǧ~q4+W%9žr=]~Y ;a(ȁe>0yr-pN愵vɺ ?' !BH5Egؔ7kmvck־2Oz}ҾMNxڻgr`NN@ϲy}k !B'<]m|^aW08 ׋Gz2Q[uh[{o\l`ݜ`w!mk;HAm=r=h r=hE7 րuUK΃UC,K=, Bu`Rm-ӣ1'b/vu}Dob%kyٿ_ewϜވ:OoZ GX?YɊŨ;9B!$gp:O|u(~L^dqG|6ƧpTGS]H[cRRηm-3ЅQ ksQ'x=d<[vq*5S): >f}ĴǢ2(i~4|ڧ v$CǜGpv%q]WWuVl5qu͠4=69a-Q4u֠2dNaUH -~{,7x8]\&ʄ{yA!K7PĽ W^g$8L?GW IPf<@A-r@C,N$!͈Wތ\s>㍙MeKy/cS[/FXK onn.dIeD[b#$4#]ї7͜ro&fcGW:vxzaR&Α45"~~\_鰛B>G[b^ 2TܽDZ B&9. hFObD. yg2+;Cs0n*g=;pХ X=gF4 Iq_:*gYАuj_{VF,`ިz kx0Os +&N`Ә?6gaǭGY_JA ôl {/5=k2_dD f%fñQMeD[G6r'I.xLW}bٯQ(AICijgGsY4nl?AXd=]O1{ގ<覬Vye\|F|5.&,Jq!Dϱ97Wi, a5Sq-ubXA4UR>H3Bf06eu>|6%H:1a4j +gf`9ڐڿ X H2}Z5)kPc9L ,8}՗>+ׅy+'CKJڥGB2i{ r=B!৔ßC @2" pkԀrYk&JlESWkd 0^$)ޠ`S'b{4@ 4ux7,;B)<4bkV? 7~УOCzILL][ZUuR;J$PLJ\$)zٚfvk܌J`O܍1DfҸx;+@Qto6VN-"gcObۜ#lA4:*sWWړ:/MFrwQJ7|^yîʎ G)ټ+=n~y'-'nPĥ!NHJ֧5N;rv=͖ToQ ۇ֋0߉gDn4^7Zyj:;ןb#*FG4^ұ;#+f?G /б sQt+qg/?zf-ե1?R6bB!O-vY[ؔPZÑs ,d嚣x=y}ʺp|ұ]9RTa8B){6R9r.aQ'HͰiשxβEέס>z=z0o-SG)ϒ9W; &gB;[Γq#zK񈞊~e$W(KTА )8Fd<BwJ[/SD|lًA%3NRI h7q(ѣM(<_ m=DFA znkY& łRε…KKȳYkcDŽH-9,!BHO###vh7}zͭ``2A&P]_R ;5`Rۼrq4 6L3 3lCA㾤 O81/GKW}h)>UpI:@XqzW\0j?3>wZACSۙ d<^,|a\@{1'cP 8 y d!x2K0!SkaA! !]b8ʚLM`n׷9i}e:{RʵW}:ٲ'"iLC$l&ɨγ>x,N*VKoZ`^g,Bvs*lj3 ;r呷5 8D*GYV/֯Qa?;uވ4`; GcDASyzF+$&0R@uD.aq%ȅ501{cb8mPr1[5xQq\]Cx?lu'8i88W] Nw4B!$E6GTfT~zԣHvvp@ ?]jv?ed𖸐pi<aۗOeH7y}Q+Ҹaŀ(>}!5"x+[S0Zc_"kD^2Ҫk Fk7?%|P0' kLwjy~ ?ƚ!B)mڴQ*q UUDFFկcNuŢbXji61oNcJef_Gy^*3V1ijh44SAQP~")B<=1 ;;;t:ݿ?5==_[{`!B! B!B! r$!BJ5!B%-B!B!$ !B!O {XbN>!#Cl9G~iF*Nh#N>-2Bg^͞hX%<-[d:rLS`{t'&1*ל#Ywn?bC ;xEϴ޽5/ sYՃJy}IlBDf=fct$0N6E vE-zb7B7}";%zI(V ѠRɋ}}iBA!dhӡ̆k9¦1,} W5\asw|1(G֩U|rXyq.b|kV*&ÃY4񬍾~6$/3{i.L@2|ߗ~F %4i(Mh3r.FE묒Ɛs}KIp=ɔn+ƙZA0-a"zd'Y X0K?cw֪euB.`Ohz9a={, g j16eu>|6%0lq2+`nlíƇؒʯ>J˫\O5H;Njv:K:GnXC0ϝÖV_T®\歜+]Om̀a-XyZ1{".WE[bH?&"ޗq!_$jmdΚ<ԭsvN{fcOp0KNt@܆}T:#Tiٻ󸨪ƏAdQAQT\2ܗR+ҞJ[Em1l-bOdKl ̨D4M~xyg]=3s0׻K%{ޞ0~p Ǎ^(WH5ѥ#5< #aO"YvA߿5h^fӯ%ma) njvp7W ^ҕ*ĭ\N|pi]PZs[+ vOFn/\#5&'RKt]phs<s*u̗ڪэGTlv~TXP~57lw8mxrt\ɌT[s-#5EL4U?DZ& uK<ʅM0EGNXw͜ڥ{)ZFը^tfՊX5c"""r+p.;m='ʴG06:G[%];W\ͅTjIcB,l^y}&z imxW;NΘ.ymI[?l`NX D+Uـ#"utbSs2/*:*xVz^|*T2SLFqlT2%"""| 1֯4~ q- {}Zmj/T a4!oDZP4qewM9vCNa}W<8m z3ln7E[1_Q6Uf` XZOS" PUSEc/ ,*Ӥ3!ОT˧ZǫϮ& n/oa/Cj(_NF ^tMaf_eq<1cX#okQ)Ov!nŞ8؜fEݕv|EA ,Gٟ{ U{qN?ċC8z䦥Y4 5+(R#vr-Vj^c+wj|4zUϜNBbsN*iI&1Q"gi)|=-h,napoՓcG9Vb,2m xe$DwaGF23Eql>mMVy>b4_Y9dxsOēW`'K:ْqy>%C~)WA)Q39\0pY!%!i<?EQD=Q~n%(,-8Xynt%* 9bqp&5o݇d(ȕH'zqƱ-SF9ɢٜGƱ$6Uosm7?isYڟJ/Jsu~bc FO Z)5w 9fs$dh|gi@PTK&.fdXN6`6a$l6jݒL5+p&5 |iUsYp%Urt]$.fal%ꇖ_p"$:l"d22,خxR.({r,_Xgfy5f]qr+q|<^::}˨gp`#q4fVcBR+F]xKzzN$on'>ǝ?{ 6B_ "H[1z+ߠUeÇ&O(Ol6EG!8s><0~Nv;~2]{?K}`-6뿯۫=શhӯƼsK˗^U4rDyAa| :x S~;Ou IDAT@uxY" xw_:{^y~SJ+NxQZt6b֔av:{^}~KһGzc3-j{!rO։N/&j&-4`B[#<3'ӴEFym|m4aAt ī/C +~G×q[OG_ \`O2;3B3 ~EDDZ:wws#17|ݎj<{~]ߴU>dn˧? 13v A"Wg_N:1zh}Z 2V0ߊ,OopU ͫ^坚[ia2g EO׮TZm7x(c%P1OEN/u)T6cFy*똊DDD*c]ٽ3֑; RjR\"n-""""eW ݖ 05 >V>!̟r[;{MDDDbdsPA |_:< T0"rSWV&[mt/}:NJ)S!?ԩS5 ggg}bDoSPPӧ(*H׎)5jP2_J ڵk}+I\wѥ_˳®(_1P`|D "raZ*ؖ&&^ly""KuA,Q/|K^lȍ ×{,"""R)h)$la|O:7-"e++ """r1j `쩣h@ рh$}~3dٯ`4bt2b4Ο HW b?M%m*LƎ7GˠazR̾_X[Ō1,G5c6ҦMsGБCY72ط[ƌ}ݗRH= dmPz%O2\)c87O,^v8N~$o#هX۟ {TjrŞ-g({rd+}^DDDDlɫjlIKɔ)30 KhؼK_}8A{5/?yqKH JeݝEmi4oGl?r=/YS1r'j̊1'OO.φYXwl.$dcDw͊ 4lN 1e׼3uMw!gBN"$ǣiM_J^T6촓_ZbZ'" 5R*eᴽEJNrm'̓EPňvba6F]1T^ƌtAe|N/ܺƮcG)JO61)zQv:?x+ ̹>iH!xh.wx7ds}H(,FPS v!p䴈ِ{5+_(7'vlg=gtMF'* s'gfsxʎŅpǀ{f.R<#oJsgcֈ̺|I.{KKvv'9ye8+!pul, 'ւ` ?!\78 5Z_Q T ܆uϼ9u Aymh~^F2oSJ+DPDž7^r `CI*iwdPFE/3b@Kjp: ƾ+1Ph0ա$sdWS>Y4= [آ'–){R4# +dI w3VQR:31k("S~v~|/o9{Ir3ċ:Q@ځw$NL\67"&-\IX1F"\=ڍXI>Hگ8H G' (Ǟy~iٟVNR2pG ]ptx$*&NcE[G ~.F 3֯=YSNIӿhN'rumюA5˞2 zIpQ=8K+?ir{ZW\X|r GWnd;8iİ_x O[ \ٵ;Oq;~,=W,Zr&;G  +So]S6= }HitlɫjX~tn/0M-ْހ::͏*'X0y2+nhFumt 9ÒooٜKacw!͘˚8'j=28'㋹;8(sbxEcZ->M=7c~E˞91vgA%~)_1l=Ux^̙ܠx$w; A5p,q؟]HU'N+CO%_~5ad%xY5"GIM2PEu.ޚsPUk8a0R+yq8[;J#<- Ts-LhKҺy6lfb⭜޶|*DlT#AF,`)]دRSvbs0pRIh> 0 ( hfvhӭ ^0>:,w/_:ӓ%fLhȿXH=NŴ jӌX4mƏc0mѹ93#K5Ӵ[kIǷGl"G6,/+2&NFEt pL;X4G*~Tr!=3<կy?iںOܪ;%(}b̃»IN\ʦyx${2Zk΁wfC6dr LLZxcgXJ);}f6uc*Gi6l;͑Y{HMnΛ`'Ԝs,ǩY2i6bPu[߆'G.SFOt|""$4GdOFA:k]zPrBjD;fZ 2ZDDDDD:r$..N>E3P,x]vܰ2DUL˾/ѼK<0Ffm^ 7O]r[ '|-' @F28_e)z mMKFm||xb 7r;>{;J֐*`77[>G  rr`Rә3V2<c8qA+'(يg:wr(>EN?@s_˂%'pC7>_̱`bfŷεw~3]x4L8JfpLHHy]jyT2kܢ*Cp xTNdSf,g_ufd8Vb1:51x96X05 pc[oo(в~yTƐv5 `e8s..Ğ}kFxxò!ݟS8p ei8ndqݧӤخ6C3棯Q9ؽe76͹gdl s#%Ve͈lݛV9I!o} t)m㸻`eݜdގ׊}8Uog<3aŐ;[HM@ňNɭKM,+wΡ}y*dş\֯]|ssBY0kQ+<gjCOqdol1֟YXƼ܍s:T'cjH,읷}lhPm*GUit;2jQ .GtƄ=T3K¿/)gٟط8+|).ujQ!^ψaTWfPPx#Ypݭ_FQyMǫN ]qÉP6R0QNtin#9<n+iuzuȧӎ %""",WO{ lӛ'fKtw#|xyX_;mg$K>Ӳ'\ `Û6p7%+ \5J#޸q3vH^4S \+ C9G΅?1}k0fxϳtIyow+yiN.+F/gĜx}^t7={^zXk|3-3#)=Av R yɗipLb'~jYP?S#T[4w/S1({ThFaAŏ}gspAb>"s{ZצIcٓXXl/n;qTq:٧u;-on9~b~\OlHkwkMn6v?[53faHfܹ#/AL!:v;V>u]~Vtd/mNQ vqO:a^9|uѣ ?2o  """Rvl^.ԌغM Ʉ`}*6,]+H-"?wjWZPyq בo5%s+"""R)͌J{rm$\ĺ U(ב|_(DDDDU7ܰsC%( L l*LѼ F̬C""""""7*WIfmx)/;QܼxtX5`BHjؐQ׹pл\GU&hfJ0֡_0^DDDDDu 8H~&N60iTOr Dv7˱[O]Awn """""|SqDfjEs!.l&oLنisƴ#a,NMrXMg|=9x+MnDyZRׅIX0>^\n_aPT6qRƿ5Kw%':4 D KwY8>,ky_*WyO`Jb XW^uJDDDDD6U|56 kt֤s%E2u4,}jЋ0{iA0ǕZ>YY?ƤҶxN/1fx\OaٌԣfL٠ٳ~廸Jݳo~k;ʯƱ1}7钱4|59ɋFqEn5{` ˒7DZ4Yp’.ߜk0{ѷ;Uzn""""")eᴽEJNshx>:FLј@B)?12s=rAvM6xq^ahK8XDŽ1a+ .:6]i󗜾fyvgP;ܽh[!V tINN <Oc$*U5Sy0/5Q' p?Ioi/r.xw0z9 Jn>>.@e?̺}tزh6Pn~g-[>{{R%K溜wWt&+j+|HIJ'OóߢJh LR9 3l9ud99dʄgQ`V,9Pc~%($:lV-;hə=|08q!y] !fgy F*W%xF3}+*)TU+QT boSؽ;O7PݢQps5r {X1{1֟* ػOU"Lwqݧ0ԗlfp3MǑfe۲50idWaɽ%M˿{3ջ}-[qwJn7G-~9LIL`^_68f05.#|\\qU%]lɫjlIFO'{"4g!#7^/eux=__0z>x6ǞP IDATA'ydm1nlyv8MZt޹_/!I[ԓ:,#qzba6F;I[)̉{,yX^FW3`bJN_ސrWqJ8EQw\y/'!͢!""""" Fzk$}q98|bVV6YO==+RJcmսxL?tUjzsw*/ߖk0WZ5YŤC """"""{>SXջ=à6a oWol 0kg=ۖ!CJuEBnԌlATT>iG>v 8;x q5-gOD=C6=py:"""""\8 #݁S@K CE5GnI;d J4xe wbL\w݆dG9ǿH[5=ma ɀx/qb;tM^ cXPod 8uWՃ穋`pYR`ˌɋ8Gj8d"=OVdxf)hX.>x6wޮ-{;ooƝ7@W````````QV((_-#UaL]B^Tw{#J#"""""|+Te;vE_w Ǵǃzx]B+a*JhZS8/s'e|47aW6^®=vڏ^ѿ.O(MyiZyt v<6bi~- wvT&-EI;r{<#w`7yrvJm?TBx쥁4L'o&Ajz%ޓD^[8e3KMݓt=)pA=1Ez޻ҼSYx 2hW?6Aإ30};8UJyh[TOʔ1$RяVȢVd;g3nv&fat#}0( s{f6o=U>v11$<_^<|{2fcer!<?͔ۄ<cOGMv,>Iо<֪*0Z7eyɲ[&#w'_Jc2q D~$x w7rt71}+-CDhҗLzp!fg =a_S:y?D)S_=sû38%_lLM7ۃ!#_Eca9]fi+O4"pd s<Ęy'x4 MS7k[pȮ|~ 7xm2-bŏO`;~&V|ffthFE.ly6a6 ~ڽ楾1&gōG:Yшo:>1'h9eRU7ے*X>Y}=} G `Mcٿ0;!_"""""[]:j^벟g͑k?G00NQx9UãhoqVN9d \ ym&㩟KsӘ~{ 7dk`xs="q' Gv$֮:̠a;%)Myhn67W0w!z -uyצkٓN-߶qԗ8"l\.HNL\ oHvۅ$F@6gl$ gz!Kd4hxmձx{ 4G3fk*ؠDDDDD.6ؙgh#ܻ~=9=/ ) ]H|9{a+vZ|+vGT7x{罧JhgGV$N.RP@4=yIB(WQ2&8 sלIęQqZ~:'zP'[W=_^`C/.^Ρ\~/̀'Ղ+-Qdf*؉9 @ CU6q8Ϣ]͕c`?\03SI^-:?3X`{O  &3?,QsQ<s83|tWj^+ YgW6=/=NWd6Iu G Gml>p߶ ~I/xz%RqK:o܂l~:>m֊>&~La9| v|9s28]]GEC [/|0+SikR/`|WI[amo'jWsiΘVza0Yf„*m@ƌ}y>AQ$$Z v#?ੑms\ap8DQcol.hrM )l9l}|`51.""""RcѿYxm:5# v#pIr 77y!vM|nkOٱ\=^:87=6 H]DDDDD֕Þm;єKc̘3n2(w7eͤ<+Y7;0|Lv FoUMv viLYznUg vȜ&>1i~ӯ&=Ӫp mT?>}n`֤`^*%ҺWkrf $lhۻ9'E8סs+W {lV,-R90G>cΝ;;^Hl _ncZ1Cߗ?4]K< Ʉށd3}vVܤN菭40L 7~avvUas-gk1""""""RV(H^c93^*,"""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""",L4◄?Z`Đ^crl-Ƿ>]ΎJwaSQ.-k=?\&„=c9'b i-D͡Qv6.؎[xl[KA8UljM' |k,D1cd WeҪE7yv~&_JȪnk*j3Ho8fNɌ H: I^T %~?6z˔Q7y{9fey>4Tkыw^@ @:˿ƤU{I<ӯ&ݞQM +s\L طNd+cxϮ3yh4[Y+̬}|5.fs37d#KZ7D"JӉnrrr-*ԡSP  lfbvǖHx|z~>&m{eeFBpyf#1[8\b=;e {7 j ënuY1QFO_F0j7^}[s⾥|IYV%1I[n!CFfw 0Qsnx!sp'{3'0;Ozуd#w ^7s=Ea#St+3ㅔLo1I$=E ЖSrZ>E! OnB{LJJ,e"Fs߼O~м;;nkx tl{PPʊ^y:w?l`ɌpjnԉV]]z[^|#gT' ^~bS& zϧ&ÃTEI6?(i͚zI+f1uVzK >bEIE~GZ^]qu,[䨌Νs<Ԝ]BșoZ n8lja͏1?DܗsZž8NaG- FfѨϟy;kUf+.7̢~A~AfJp?cݷm})O<2<]ǟWzۙa }l,q&YX4?gzNMNo0I$ xyǴx,IH<Ԃeڢ #wrzBvm) ]9odta䰞0ae ^:r!CA"ʼzàn- j~P?n܅.#&5d~dW[,(NGQ' }ʒ,=<|(! EK3ېHC9: mHH+ʁ;mYCװ"ܔ,zqvj$]Wzm*bU[i Ԉ Q]8_Y;(%H\lu꧝G7>瘷x1…P#T.qI^[̺ckO>OoȊ;]W_1=#]KXRYG,%7-SN$I>!лrJA.Lht:)[}vMW88 ) ƼRR*)Cf$_eSAj_}VHr|I|\FzԉIGŒ9/RNUUnk&֗f3GoFWFjW9\7$D +qL^K$K#sp:ْ̜͊z$Bdz{l]mKMއ1-;iKWuޑKhZKoۆZ?HtBB]ZgV.,Dz:lSD}{y+9﮷'68KKh o/XCvCI$IfQ ʥN"kdWcR 鯗GF>ΫE8cеiQeSť?I>{%<~̞q(1w++?>IYOiҶqX/v0wӌ7qq:I9<:ymC FrrǼ=^$M _OĨo}@/qw<~ Ԍ'⦹1$Ir eyI/dy_x[bڄsxg$(|xGJI)4=R\rbqhr-? j&եfi!ő=V643JoIr*e&zTYz<.yws9*>i 6V NB~W &{6;U<%[+`[IөWF=g.H)YTH7̗y+|=_nщIZцZ+ڂwM=v$I ŋx'FMhXo!sNXޞsUNG̛͈;ģ7(zcXCblҕ̘6ώ6W'NVd7V(`[Q!Kؕ֞?cEE1wsmsruMis hٺ1MRض5ʱQ@M?%K%@:CrGn[L%3V~E.Bbb}MiۖFyx6|Ngk|պEs.bʫIpm;~ $Veٷ]w;:%2qǤw8x*sqT^o2I$71or;}0i}Ʊ͂]/ܑ\5P%FOϚP3r>:KDۘ?i^.QqzRUiRm_vWres^NN(=aCNI|Fw$%pdZE_nTa=(W#1bFeCjVL!-W}n7q%c.& NƸyV?}@f_̬-!di7rRQTI>ۆht>^7%[n{]+vcfЛaf.uI!@No_s",I$w9sW++f]4)--%T?qkB{Hv=,I$H۟ 66`0H O̺uQGgY& )NAֳ}#9Z~%I("~6[gA Nw%I$_~X$IҏhI$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$w IDATIX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$#pHĚ$I$ceX];1]?yeY>[I6]nH*q/0/lm1۩INA}i 7'u|jw>,-És}Q&ՅeTǑKے P>/_f59 ǮK_V@q8HGqޥr^?$I$7b! CGx hJ}Σصyn~wJRWpå²( Ο\77B{,q Xך? 8ɛώcPRncL]ۈ{OM,|AfExr}<,/לKl&<95H$IoA\^I7M<!̶U,I\ӓzx;}WwR9 hͮeK\?3K>c}8Bsҩw*ǷQA Wd4Z><|ci/|®`׌u(}cE큭ɬGY5F\H vpmb/'p1oF:?5H$IW.Fƽ5;r:4RC֯-Yeri MgsSkڌۜٽQW~:6aAo`ͬ.-':MTtBiٸ odťF@ k|.#@*Om0‹ؘ#:n=N?$I$|ۖ3+^}$_kGFnǒuW!@2W>07ÇWғyeHc2>@cyut;SڼKpJ^yɕI?CN&I$7 p/{r4[=jepHѲ9 j\H|S{3xb?; dm}~ħ0PA}j6nF(v_e] Ik| ſOW4&&M^[ k$I]oB$s'6a*]\ENS<^ NCbOc> ಧj+jEcHm޹9Gsz"{f qlHqdr_EVi9ٌn4N"5惷>%LM7'^$I$>ۜ˥G=ؒ+F]O`T^yaޣ:M:[E(m.kd=xqjӍq1U|j^å-c8a0]̃ͣZ|cNݟs% q' ( ܌鏺I$It9sW+Wg?h$!SRRϝG?U^I vuk{[$IvOG0$;նn=ݿ7kJ$I~ $I߄h sY$I+`$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$Id$I$,I$IX$I$$I$I_I$I5yضq;w$Q6.I$I@  ::@]&j`,I$I\ݢ2*@Uq'A$IuwT"g%I$I?3g$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IؿyFf0$IGSn%~8{}>R>7tiN?D,_⊲3q|@q)Ԩ]VoGjgγ~EkrHZKN:/aw^x7{䨎,d鑑Ȯ\2ij\|3z%Y$Iڭ>={L''i)$[nR2ǥ4?yy7{-w qv(> x{ی1yĵ5chD81E̝4/]FDӹzTIo%J${KH?-/Tl9'jk%xαm<. IUF)=e@&ۄɝ$#&gQPCZf7N-+ ye4,Xɺh䢁}93AUuZHnW_=ٓ^܌^$?-ڞɍO#5 kwLZT݈S\]REKfrǤ,+\4bKY9oVzKi7bJ<Y9ob!].>9 )FzɭL/y)&*{(/<+ٟRJMRvځH >NdYR\/G7xK$є[|Z_qwt˿' trL%OK$η5f֣cZf>X]:=+Dj(`.НlK9USNO]UY:<}ҀE<7o%S)4/gƎ掹wMcW)}8xt{momsٓ>CޛɒTI>!\GvqPs&8ҧ}rW)J½Xޜ6*|[F6KC#gAI9D(99_w:&UA"l&kin3{֣LɮI!]hNzm{sߠIˇ"A2bє,~͢d~ ymΧ:bN-g٬巅$I+r;݄D<>Y"[yx DǴj.ya؜xIդNe"ޕOjJWF;$hE_a̷(xu@`X@ksCy $' \DUǜ;f/-!#Atb 젤d;K-gG0zÓؕo/8sO.l4ak2z{_֎*?wL^CyeAj$IPEڢ #C|=EjwLU3'21s:;6`SAE^iX:tlN\ִ{tۘ"QJ\%WTP:`K& CWnUfMkC^qֆ#ܲ= ;X@;R< (Nv׳!ԋ-p]Kh[ͭ:EQ)bVDX_I\嶁xb PZuy6J ||D()^V;bU"a,$I&+k<@Q=q%CwF>q7gάi9L ?@Djyyq,){(FJ xgEGdFsP=0:x:TXV-Apv ;&$-.Dvl`3!CQW]2{3)7x<ڱD0͎x%v*a+MdKDH|wA,tw/%` c}B$I?̷?yۦlX^˽#UO3--ᣜ%< m863UZ}B u{ĿƎÇ3hb.Rlˣ\;VLJ0.OrV">Z]{$DJS-)#ҚE8$6຃y"Ϝc'qS8O׾DuZFLx es{?XŎ7jUT Abc4jA.ޘ,c'1vO:ѐ@(H(9XSė{6]J5>Y0 >O;hжp@$I? vŶydf(.dyA{aԨ<صtEe|{:9/*jeO⃑o`-Մ&&xiB8zXC+f3(`Q3{'uOjEkY9QFƟBy򅸑p4~Yy&jiuSju/>\KIO0B?\ԮԳno^2wp۬ l' MiLY0K#Kiɀ-i=b|&'d˘۷JjדzAXy4΍* mۓ\θVθ%S^ q |y`yb)$Ir6{- Ј=QU%=N1On*Ɣ5/L:48kv"G%;waUW$B8ЋSǭ }/<8w]\mH$I?s!eg=All,`@[nutߛ5mrp>,I$I7u_oU$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Ik}0^TΪOYI$Iyil%K$I!В$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$IvϥoS\NUq@Ff8ncNq>X/lG0Wr>c;5hqW ‘Ko)}..);IʨԒrnz [$ItPWs# Ftu6+:!%YIY#))#gc\y5t>ϻgQ7ӹfcωNL>vZuGYzC汎BaM+CCVcmgI$ `% )ЁEٵ;Į+ w&ǭ>w?wwʬ|HE,š $3bH)^L|;U3_baq9XUC[4$RVȬcx$u&/k2=Ȭϣg[ߴ=u(>'N6WswZ=*[)a+K"Vkueʻ2$I|FDƥq!^>%@u|6 U^-Ǡ iX1tְ4[pI!ŵIM6X[P¡=<3P3 SV!RR8$&E)EU946Q~ۦ+/ZdžP(/ȣ*?iCN"_>KG> K> 4%d>IKԍd^e[v$ԉ PZ}}m*Nؚf$IFE/o,Iɵ|=u]ú٘m!܈=,_OuHMwy)Il@J ד_@( -'-(YzHJ!)T18/ZWW9. 3]IpM7V]1I)$`G>|06PQRFͶ7\9g8 jY|$X\^͸ҼO/NMşWRo{ mae-ܬgF9ukEU8v.CYT&O#o$I"r߈=^sTݩ|$4hN܅< 9r״u Ry]VTNU:`>8WE(fmʪiј9Nez BʀH&YHb[,l+ޖNy^7>g:ǧsݰ??(ZB^Ecӻs/cm[VQ q^JK$I$w=F'QPvnS֐V1stYX¨1XfbsNx-ʬ>#|G__WeX^XƩhܳbQ-ߠ׽+=vUF T&mei$ܹsd+W /w~H$B8ЋSǭ I$I̅A?|oݺo{oִ viJ$I~ $I$$I$I`I$I~E-%0q"@qN֤qjKz\|.g8Ȯv&[g~ĦqԟhvEWNQwreZr1--ϰFB;mI$I`/Q礳f$Ɔ0f<]C~_Z堹HYf~DLpS7hۓzA6g_τ-$I$¼=>O:ULM` IDATez}:r>Ԥ'n$MG,9'wL|Ioײc2&)[ۮf^5|7oN9xl AÙJ:OM, 2}[Һr$mSF@w&_fWէ1Oz;fOL$I/Iҗ;Ιu8,9ǷmG׎=쮘 c羁' @jc o%l!X!}鴉sѐsx璩<;1|RPr&B0T2 Rg}qф[qD~ Smeٌ 3PļPރ[11Vw5yy隸U_ܳ=ǥa'-5!Pw|E8yיV3ݎMl˵Vg|fiH<]R*?ӚN5Y[@GӠh 58CZ&G9dvB%īIs3dV o؛A//ץ)8[$I`"ԤM+g.wylbM;G\ǐf+n$r){ތ̬X?@֧Fz׽&쵐يV'5#j3 MzS$P[sʛs,AZ慌x4q@3If~8)d-PN̨-]+ڤ!{;BjeD2__ױ`M25 9a$CZŲ) :)/Jα b])ܞ2xK k )gFVfS!%,I$~AjIv\ly[Ih?#{R/(+J3yY_ʀ䎗3)v>g-wp m;q.?m/bx& )̋c' #Dbe/hl;ea`-dNw5u9mPj|s_e ֡]^ AW7.=zW }Al%azB.1i>}L)an™}2c#e;(c3O]?- DO$I2lKo uv:<Z:"_u~N»N5Bqܾ}a|q5ĤdGư٪qu* Ԯu"R,0|L q2Y=_iڸ_\60su+eub| 7vojb|v>B=ϸ3*c{UD:LYbcb ,_&gƴ7~bnP !eUnr$Is,׮70lZ޷L~%TO6 b'Bwf)(e_?Y[q.ne5hJnN|wɩYҬ?^ ^I"@TbRcKX2}HI/MO]OYY6zwrג/-  w}8m5>ޜ>K.9_aKf< #`~Χ/Ț̘Ola4}E @U]EvI9zOj Ҳ Z=[s n[4C6^(Y%DŸ:f!7p=+^;iuP}S糼p ? )I8[T!@zîgG/u9=]-zf ទ}2Vn|ޚēGT\+9oO~ְs,殡p3$I@ډ2.y͙ 6Ruhڜ=bHn Ԋ&svGBңA^|2w0z+ n;CuHϼUL'm"<0i6]$hꥴkSZ5]NxL&a!mWn׎8YAMNpދV.mϥܞ!#WYedr4L!ggMҏfh[3nxcV}˸K]-cuϐ%BqyΞٗ1e0~D.TJTlv~Hf8;VaǸl焉^Js;f8sv(\lWQS Np.."Ӂ n/D"(qUZ!LL'Wrl٬]s<\fs0OKlhz*ћ$ɻ=iUU)2$^ܹGse^޺{3yzt:Z{'x9zlxue+}`hvoϺA@+`P+P~sZ6vů:wG &pY*$[[ZEQT?|t:5 iue9$9vd"4Nׯ6Z3I0nwTh\..'ɏ9,c8nwwHȇu IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/body-nested-models/000077500000000000000000000000001461403617600237125ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/body-nested-models/image01.png000066400000000000000000001200401461403617600256400ustar00rootroot00000000000000PNG  IHDRm\sBITOtEXtSoftwareShutterc IDATx\Sg79GR1A{ lf$6Pxw`fn>v4+yG}SN30c:585&S%+hR$( 9ĪhT_!?u9s\Aw(    ~5}on|u:D^X*n#?zy68_IV8Xf޸/l_m|鎶Ƣ^.O ȩr2~«|` W._KSFo>%KRRR~hIKHÇGį v5uEt'WR.̉޺٧ONKKdQg.Ax'Go+siĠ}O1S`UInzzyycϮQ*}΃ N={_9t+ {{mQԕjάN-/m4*MnI~D:j {,ƺf䳤k3z[654WsVSPUVpwj;<9_*((m %撪YBcVVDD#{S>>M){Z򌱾h/>88O"i3v+?1'7jWHMn\hh_똷z풌C?→%\P~L}l,JAج7eED$ zm,B~owqKɩ4oɍݕO7)pG'CL&Z#ͲFLM1?zgEIjAvj/=bTH0|}KGc2ZU N%R+}몵^T=زC˶6 ėW[ Z'0+XvxFl$869[%VW<Wno(^QNF YʲlmM}yim5L* evcek7.(OfW,ľ&/ DҸf k?o[^iG>x{ؤL/l}u}5t)Q c[\LS?IV["uhu)߲]w/[..P:KLmdUW\PGͿ]*n[HO}c?.RcZ٘m~|?}.J#q:==<8>p{H\jZ5rnNNVre^s>A"gi YZ쵘mDC'"rtY0nnl Bu4}_HL7'C?'y~regth {?x&Є8vʎ9'(;|6w>;&_Դ񁾡0xg06u:DH$MD̵"ؽ '"eX;dža 2)B)9!GnbY CD2w"= JDa " bb&{/MjDJG'">CC7{lnTP2xI'pp ,VLS2{-p!Hj?z=H ╴2MAIuZl7^G;0r^&k ؽ~e#=d6:5c%)7c.N%,\eKSit`pG&(?sڛvdIY# MJjzʣW׵n$YF1s%6SW˺, gtaJ.gf/nIjAKB>zEK]#UfzBläzJ貄KJ+NQ=/cWHx97|5/8R}{kr/-CDqy͝;7%%ܹs÷@+7F>ܶgω`٤,3g/v+tXVX.ζ.XkiHo-eQ۠F`cζNPrV6y{{CGDoϾ0&xw'N}č$:sWj11lݺ}*>#"Jέh=glSr)%k˓)kL3zc& ܉?lٲ?Ϟ=kYՕo*V\ O_k.Whqcg.xxm {p یQt%Y%E*^qNܜ{GSvkM(6畗Yanir *n5sQ@@@@@I]wݥVϟĉO>3JҘ/^DQ}?w} |(7~G}p8re2իm6EvR4???x<(4 CJJJAAAwww0LII!"AFGGQq E͛bŊ+VLvڅM4'##U;\Kfۿo|͍nR0_yR_Y,LyTEi0s_ |/>o ]XUsm3!QuIY.Y+KZ} ٔj/kd撪رaB_cޏ)YWW_՛Y<^Sn5%u]%" 8ɰwօafn2|"19-v6ݠ r뮻}єeGGG].Çi1fC;xX^qbLZ?ш2W8v;Ut߽G\_UM&QehaUUOcuG };wpG}̙3_mDoݳol|(ws^}z}氲8WL To8V䦧'H7:,Ŭ/KKOq<ԳCfi^aK{.P.QsnyĘf|D>O-ZOH# n|!wddQͲFLM1?zgE W?|9D}>?;_:Ԫt'^|p(_[W]bǖ2\@{EA;Ik%\32Lp6AV[*hhoR[xEVHW]qA%'? Օ-D|gMںj+LD&RLuPpj4_,!g}ɪ|7wnݟToY?(v$K1 aUx[&{Mkն1-]8Nc.K±>V/H* [ }C$"D]_Y L5O QZU`V-X_Qs헾X ͝;7==C݌#=ͯ x?%=6ۏDlߧ~UG>h舷pxp|!ԴꙸXhnpLeVcm*iDU\mMmjsU ר#L_u\Z_v8<@oaaT*=wܾ}ndԴP$"{cW''"'EH'kEBNd≂DΔx+p*)3h3ɑm vCB<I滱5,H$DH1 "e::FD65Ux:;1}_1ˊr2ɑ{5`atX6ϕJ *Ш%E[;[">PΟ??==;(JDZt+K8[mEIe0,F*CVj P1r*]Pɩn(ǨlTkyQp&&FKU 9S]''L=j(ӷ,0m_8M.*21 Zj Ov !?Fξ:,.\ Lʲ n˹ i粵77l1픩ɒܿ;#_*h3;a""Yt,'WD^rNx_SLKY(1 sW\=2/]Pz1鲶6UTy9X.GÇIw8)3WC@dR5y_ՖhRRSݸRE=uz$RsDHeřc_V'Ur;x7@&G.aȼ |v>LجCR.Wg컿/%+K4)OZ<Ǟ먰8:4H]\B>oSjx$RVv~gE"J.|NA'x=ŀ|鹜Lt=InUiԳDJc*J^* $ZJzoU}GB#{wn۳čn#`ߑYYLݝd*dsmyr<{ciԦ y&YE@wuf ^{Wm/xcW.Xʋ6--O/[/FW̉Ժ7sL?;8{?{l= ZS(f״m_x=>_9_U]R!Vi5`fuکb $+,u ?c,֪g~&<&[b-v^65ho/n5s222%Kdee%''Č7ѨsTLPfawOPFFP_E  ///W)]7W7)nKw5ɣyV݈M1Gg-sC0궖TnmeɠBgZUsm3o{;$awB7q#7?_|pUg~˔ub[,ȕbr6l((((it qb݀D")**5¤%$ãc" Fm{6w֘=rrPQ-zF nB$N t@%"UV '&&F)j ^&rol|(ws7Ź4fbоz{ũ~$7==FQga(fexAXZz{O/:6KFcA-Ue!jowQW9#y^i1UorIk+*J 6i _QVe4uLƦ1Js5g5UjG~#) ,z"E56Bdz7"W$2}&S nksC#8[ǒhܱuOtSJ>be'0hށ+kWcK2bJQ@DD9uoeN|EWPgr^DĩK7{ƚfWxiNAR$Ӱim.r9\GS._nNrmA͔h1wx"{+Z#AD;!QUU)YmQ?_pEwCVVV8>zhZm?ܾa[OXo_4^0aAvjs Ͻm?*- Y-I^=:vooTo`C-2575vڐ#!`fVy(V7Ir TYf*-q2Pm(-hڪS,M`Ks%DDnzMeٗbʺkܾnl(4:_(m7&& R6>` {cW''"'EH'+jJ} x|ؽ:Qi8O[HK٠l PZR#N&(8H0@,+af~ueIx9vzniqB$q&H',04:yH=Hjzs?p"PHx-0N ݈;?W]W{*+[EjS8[]T`kfnZ6}n+Z3l,DJZFC#"ਘ-i,I22:t*Mе JVcME%PDDn/e@ IDATTY,jp` 3eS4r9'=~"L>n 2KzL0,>n?7[o[o>u[oo~G޷h%G7TQ{O]O*1+re~YqfȾ15Y\eOlLtX!Ua!1|a:~j3^OYj8*O$YF1 sTTUR\STHS@W&o!"!X 3f=XKiUlD2\q%y^$zljK('5:yDDVk8LKJhserֆwۼCZ.JBvC$"pDNyzN%yvL}aǟR$^њ g N:wȭ偷J #Ͻ;s:6'xB^qSuk3HۭPaq;0֘+*(w;~>2Ȭ,R&N_"Ý&MeIYN/|&նVdElD4l|""_{MP//gi6Yg5߫aj~uUCnǒG~clgW?y_xCo2cwFjf;dUW,ʘKDBuhZa1ʋkxVu] .cem >e%D5+4k1}FZkkeU;Z B4S4oK4z-|ʧ\s222Ɗ+o/nyQQ(o\a"ouGM0{2+|Eb6vSfm H~ϦV2T} e++SVYYk+ݡxy*ع^ǜ鳾dU>J;YDxEiՆuϿ {{Nw5coZiqsC71K*tcYyQIiS} Tf"aVZm ON٪ZzgX«0>ݹO>diiiaaBIi~o`lBؾEy$.x{z?6s&B6;Lv:5yjHty]dSre^CD:Ol1v}>wljZY6G.F|m͎@X ܶ.>߳gvuu9sdff緷3`RCQ3x`DDѸ(D1"sU$X Gn[eud }ְfEBNd#B0)e%:ӓ\!D/G"":^d )CyMήiϛ # PnqMNov}'&H$DH1 "q|HȦsSb:;Z}?eTҢT4UEk* vw 'o p܄K8q EYbffn,VOaNipɯ$Y3t+K8[mEIe0-~\D 2,;Յ^S٦KFTYZ‚M͞ݿK^/ހ{)%xIZwWG+TST[`+ZBѡ؅K"IY6>?zd9"39!05i J Ԭb9=ɦZ*ȫxbE"r¯@Ww gfԖpRT\*1;t> ~jTF~o@$u{IfsƚKPVKrpԡOKY(a|0,4Opkn~_$k<%"%%ett6Dƕ*dJ J\_VvL mV$8uYS9GtX!Ua!1|az LW^KR띜lʪ˴JTTk6WM.&,ՖQ9Nkt*.F'%'g-cu`lF"uA̕Kt9{YuqVʜ"V6^rNK9DE*maa~ϵwhM~P*VW([8vk[E? XwdVh)Aw/]MfάgWj[+"Odl"T>mtZ(W֗4wZW͝ K]D$8vIƆ55D6T^RVS ~29B ,{:c_3dNd3q6ޑ[ς.5m+^)qwr.]yW𙧹5 5{[1[ ݕO7u%%xVv;4<.qJ9%KoNNx޿~O^h9*/3R[opݾ>29*x.ik_|whe$B/6m}>/\ aG]^Anњp /////MucccW\<˲### *gKJJ gϞEiiir׿ɓ'p$&&Fcw_|D"8w*ay>===&&f옘Tn(0o޼={ Pn=3gAɓ3 ,7gBBB8F>ottTr'xn9QtRRc=&JO>GMLLp{_[\F͹?(|Ţѡ˚J75j[ BmI]ŇS]56.պ0uM&O$׶nʚjfF>17Bsf6{/O]K{)999+VyO0lii][kGÁ`4QnJ^ִH"W뫪_䦰foĠfK֝]ʡ/4"ΘK;zߋ9#GLgE!.lsWp$=cS'L49(ym& ~#19*"djy lZ-"A&*֪&Sh2$նVDky[ ͑56Kyik{`fGԲYUj Onwؐp~Bƚ1ucO^]r]wuwwG! ;Z]> *0l5uMvZXWj&HDffqORmu}E3cEmuk½ûnpV+J5 +TUN~k2p5qfAe+[Z晴{R=$:9xl/_?:::MS͖B5Ow$[;|"QaxtEMny;ͶlfkINǷ6{.ׂQaha. ^qFKn0#8;@(𹮢rZ:p%9\Eas-UL\J@ Q1x]l3('SN T BL.!@D35I2/D8\숙sŠO}E`atXI%Uk~+@D{w@tXolihrWy9.7;HXGt@{ٳQKWr<2+ $\2 g/ueXf >RsgpWC]Vg5EYeFliryVy~YЪ%V[x:|״HxU =K?x. e./ 陘ֹL.X:?sK0AOem0jxr-^ o1u DD$WlTx<_jz3O.'.=B>oSjx%RVFŒ5%@G)[eLW^4Z|\^ZgM88xh5 :* ! 8۬N^{Qj6)Pf{* N/mnk},>|;,$+x:-u ?c,֪g~&<&AG\t]~RD[ayU y_#[Nsοp'Nܛ)-_os222ie~鮮C݄) :yK!09*XTcCyɝ|4̺G-?;\GA/~$_r9 _B.3#Dof.J7IU(7Ax<훘@&ILLv֬Y{||>Tnh8p@P(zSSSQn5wppp|||ҥD$HGpsEd'xb޼y111|ɟ'nhM~?~nn9r$!!A՞:urpEk?w} =z?0 g7oޜ9s;wJ"o}[(?}{WXx̙G۷OTn p/////// M{=PBB؁>rUVݻرcR4777;v 0fdd &'O*L_57&&fbbbTn;00*ˉ(55{C䇾^zܹpȑ#? g%?O}Q\\ܩSju8FΝ#KpsEq gϞ7!H_40'%7c)K4|~lWc,Oį|!C )yp讖PdtⅥْ$Bp/{yDVݘDR̐40g&'6-?':g{tѽrlSrK~{| M],G*pzY~ҽ:yݾScDD8CKV&&i8i%>p6/8)s.7l6w8%Rd,}׍=!KxN*p0@'G|ル/Z())i׮]PhhhH.?QܥO;Nsxr^WS?՝(|n&+V8SҢGaE F:<,.e,Z6u,P)8g\(v;LD$~#ɧǖDl)dg"fq|:a-%g>⌗=$:9<%+np{HP( &_Q=XLrb`' תi "W̋q 3f+ϋgq9"'t={;i ?{o t$ ~: p!ֿe˗iӹ'?;•19"~J_bwwFFmilLs.yOxCgrZ'MKãD:5}D^؇G^gxJNXpxEH%b_?vW*z-=Dg׃CZ޲#=tIR?wN[/>B Q1x@O>=?qqqQhYHAi;9%^3OY87ޏC4A=7ѣ=J̎ޓCs׾Y Dx(;(! IDl?e"Yljp5|6 E 3+Vv !朹wm>|/^G˵>AtfcO<ߖ?u3.["h5oƦ M6xȾIϥG?{wĕ a$ B VAPEl)ZVڧmýWwkEⶬVt"VT^J"$AI!| *d&3s$f\kaך -UBukj5? FgglpY~ִ7oI{oٔ}7_軚~Qlu7w#_׋5vJ;G3;kKV֦b4Lxpi1ݿ;j}3Xxm׻t)\C&D iwzkk.SkIN-Lw>ĝOb¢Ie/$9{D BGUkkI._<ޭ-qoiv9Pņ3p.7lJ-`}_ip.`ɤbr +d479G0 Tl+Y}kr`3f.eݿDս' _7ceN˜oQkQ} 9Ɏ3K&?7}LZ0m3h֦@U0l3C:0~+ݎz5)W~m8R81ڕ3mG=)EGs+wrэ?|h{ ŏB=F󃍍 F#`R\QQr80&{?& N tY9hwWP}'=\́跢ZP}w%j? m.rEs[>5h-+nA>wgmX`~|v_m/m𷽠~N95i<_vrK@[* FK_iw7|ɏ~uj>y^Eמf[r|^^} eFޜ|8[\NyqkTk`_BN,/x⺺Qyz#uqӦZ;>6̭:` ܘu醊]7/6crnS\w?_:!z6/JccJQݺX`a|V^B,ˋ ՍnƂ:=(Jt!L_Yz1Jӗ>d<@?//eSSr%/Nb=iB=pFaR%5f[㪩ں^)*.J_U_H< B!`t#KG O&HC(wzG##L:#{ZxB!&+@!Ha.Tl0$ɛF%srsSE!SqX?N=U2$ӔM„~n[@dJ| ]!ԠRAcAaG!hh4  -EQb Ǎgkk{uFd֒X@a|N^VYW$Fw Rs7#vo u[36 )YS7nѠcQnv0)-'Ikre`$!˖'l4[N]c_J|R`BǘbŊJeaa!̟?u`zoomF@&gB!C_B!tOp,h=]=@%ҿKd B!zTo,h7[OLBG [ws>GcФ;]-]]-]pSB!У}B!3;? B!!BaE!B/z,wJ+y1B! :F;wIb4իOJX!BɎfffs8V^^띝 \."+K;^$D;27xaI ~|. t qi^R8s©Zx3E{(;5X NIJ\ucNzƘ$ zVoc,xixM_^|+԰O?_έmZhJuůTֱAVuޮiB!0h4N:u􆆆*yOj{oHMr#36 )M/IȊIdZϑӄuITR!=jDoFꋲ2=&R&ސKYuEi-㲦7~]+ x'.q{/lOFtW_!zV[274]S44rA,7G;(㹏Bgv~r .,--U(Oc,Eq^Lk҇YB%SR[_;b9:O: #!B=p/^\VV&ɞS)UϋG&֏5ў"?Z^IAaW!7wc{cd ;mUQt 3f9!B0*lllh4A ֖[[pXjmmm4=}qv{ZƼXJWK^-#Mc),Ш2pH`KL047mm8hn͇'O!B=̜p+VxT* ok>Oo2B!z,#!BeB!B!_B!hOv_B! "B!!BaE!B/B!BO1F;wIb4zΜ9t:ܹsX!BɎfff7ŋ555aҤIs;!BG6a„Yʕ+MMM]]]---z^R9;;h4\5B!1;n8Gdkk+V7B!zt˖-p8ׯ_?yD"F!BOs=r䈅Ì3._|EqB!m燎֚TՍB!;9V7B!zF!h4  -EQӧO777|hwssF!BbŊJeaaɓl6FH$555X!B艏!B=)a B!!BaE!B/B!BB!B!_B!0"B!4j4mܹvvv$I[d2{zz[nB!h=h믙Yooomm+Wyi4hB!4_XZZ*H(}^ojjŠF!BOCIӧO/++ZF!BOyhϯc0B!BOUokkpV1B!z|zlǓFZ/^JG!BO[=|yݧNo߾qB!d_F(C :O'GV:kZ2y7&(N|u^2fa_DyZAQִȸ)gț2 zH|nʜʦN7g>K`Ў_LQO!.{f/ycw:}ښCW`%Y&(v_h_q,5sߚ 3[۰3ݹOxkψDT48֑Bs UB=k4M-SN}n[[V#R@}_SM}=R]objPy.Sa_GUkS34 GMnZiҋ0-<++.ʺ.Ý!}3Ը Ƥ]@FDˍ,'y}3agQz}QTJ-~EYS}W}Ugc:b eE[I#M~woҏv~}v`2ig+*nWw[x5Kt!T$n6`Mb. {!Sz30(?3=aG&7Izޡʭ&¿s'_j{SȾG' \Va/[Wtap _8^8L}qgێ/7̡6yj lb+Ĥ鑓Wyբ|Z;hk(M3^kPmY` !z`cwɒ%qqq˖-c~WvC+3<䅩W`lJBVye mKUΪ ]g$;/?g9'$;3)ң6X8Ӵ6 VJ+ھ_>oӤ['O*A ˘=BU?Fe .^(/6_Y4ﵗδWJK.0lgn~RtBӿ&;(~ԮnRR\s d*\/i|ҡnmCߔT3gzd>̗Hromz}86aS(`+҅v:78TO6U-W>X'~[;\yC+4y_!B|[QQR/^\PPRFw+lv|Y,gf7'fDpqoYZCMZnF4ύ-%Cᎋ\Hh77Q6HDңK#\]PsvAjD-̺34 )>~mD6{c0@H#iٓ&}'Kg38LJ#зtjOikUxcՠ d'Zd߯ W`c2tA+kkU_ohӭ䔰=]eM3O5K)3 |B!k0jjjL_t$ӧz78 M}Ʌ WZd5T>:h ?t*AQ"}[O93mL9quJMH"8WW6oEn}MvZ/0|𑱫e'osM1aY/vYEBĹ G۝{;zO{e5tvB4ٕ+WX,֨Vod5 IDAT3:Ev, pqV֪7ՠB88lZyK_9N}߬[:YQ-ږA L.%-nMwZE{gBBe 5G+}u]>e0=cuKR0Cbnh+yd9q*䩆3z$W6o2WFJ~+:Ø4{h0ͦoɤRiNsЭI^_+13joWXS1ojm]ɶw<6u?$Ap7^o+BɉJk'2t WTK6s17Eqne7T䴈1'E͟ u5ajp[?O-M\dpҴEpHӢy,z-p÷ JP>?D> __r{φ특n)X1w%sj[% #(gͱx5Lс޽ :RڙU6|R"ڪ UjbxNkЩ}o+p](͂Ζ3Y¢s7Qя3Vo,~g`Wh翙0uh-++"s J{?%pQX_I)_oѣl+QpCx诶K%X5*>tҷ4}`a_g;o GO͎K_=-[O>+?9୷`?cgIus?羯/P}4^=}FMsNj7@SAYi~5E;rYdXp-߭BQaXbCRYXX8y3g:WGd t x{3~䋒/6FX[;4t -1m%9?Jgoa^GޥcyԂr$ x<'&3lFagE,~n_-ř_9Xʏpo~ ԟ_xB衽pd(3rφǤTdƃ\7oXn9sM|~p?N -%bHjPZa95z'$4 &H'~@‚trpù'uȋT{ T v䯠Hrܮ_~Zv cwdb}ïK;[~&BVt<'كKΝkggGX,.--jsٳg :VRRjƇ6 xMnLU^eBdEsjw^p|8)U?VZJP'n ׾5-i7 OK mV>_YokZ[e!l_33ZOO[f-XƦʪwLE˞R,UAAs\>e2=4-6P/k6urٓ*bvU3l;BRrXscCS/gT5t>0łsXff<ۛiC,VR!Qpyy<X%t7ov|tHdO7jM}T.2&磅?qr&JrwbS-򃛿[pHugMsuIQ$*ٵ|7@ŔobK78u҄N{_SN^m[R[p4?Yvļw'wfD}>5K^-~.bk2g:#ȽiQrߧu ua -235s“W:YF]}0?stk8wá7gh%W5VQ’Ur*2(A_J}~wܣLGC ".Q1h8u8*ōuG1aV_[^$HR ̤Ey;?fgXWjVk#c2>uzLf~R=ķ]=\lX\hEG.tj8\Vϛ?Kc$*d"-7r/l3|ZD2hLdV}/Ui7g`/.9!̛F%+ȭ'zSn&(vSlځ!O#Z&SR@d`{Y:7W['E/s+:%>̍e) g㞺#+.5%ܛ>l3/6)XF뵴vtt<|0 D!3,'y|z߮h:-bZOSֶE).*7|іY }:k3sSK 5:OPÆ mξReʮ#łŲ 3nyKS`YIi+V3cVG8ُk6g J¡;9o+ 4CPF @|Rk(ۉ 5w-0gТAZH6*2) ( `t?11ta]Ns''r+ LWG{s/% XstuldhA21oMӭ~ɩA8zkZ[[mmmN:)vM7P7#7>ׯsZo=ٛ9/vdh.'Jcyh;+qFե+Jأ:oٗ_-I/|MҪ$ɧZYL{y֯t᣷a '3Qs 2VVը ؘ5;}gLY3݂"^{5jz꼣׏릌v7_M?HՊ~)W@}?vI޴е yX}`1(eEnqhqvԫE5o uqF|p|)ksec-L LJ@`cb3+=[zAgDzƍUn]fzd=Lw&K)۫&0nɭ |l!m\ZkL\?_ڇoU.xoڈC^J6qx^"Y<콶Aa9xr-<>ZrrߚM7|G PCz>{6E~-k1ڷ{'Kz̛֥>'{H:x;N쪨Q\`t{˙MDY}ߋ[b.'[ĝx5>)i1kǭ{!{ZRq`OvFJFǹDcM!Sy"ߔR{?A/iYނw;+c\!X˗/M+++~ ]$k Cn4×<ɵpYBPݪ_YwE?q^#`wc=׸XN2l^Zn=tyэM}QI3$}s'SLG ]\gzԺfȥZprE9wDi[t=湐9?Gux&g r!| ?(~>'y\t1uG4Fnt7ׇoEK֢W9| 0Y%2r r~еA1ϵ"UJ4>ɟ2/OcFi:+ N8YپssIЁ;\OP{普.}{Dž$Iw@gEy{i#RsswMQZmfL wV.S.A؆c'Ic6/ p}" `.ǃIlbpY:x5"09~Egrnar'8.!2GA`S*n4SjG1dr77I:& x`P*Ut;ℰK}mEq-' 8kdZfxJJx,N&2WoۮBQ6664 akkKQTGGR>uɜ>}X,~.sTO/h`8bNV 5zL|ۊ֑uB_1=K7̗Ww}n6%ry[#e;>7qIdNWV]|]-Tbd0%C/ ݾ%UzeܶjP~7wf$R'WߜU W1lF/%o^†NMCW悠%;_ȥԢݜ$J483jϒ19o8433a{+tʬ 'n㶬7w.%@^:H `OL\4s5joKO bں?n^6R1*$2 ԠӴVWVarΥF]Rn4-#\]!w:7T4\^ݏ7<"k3 ńeQK}ws-J:Cڶ.z6gauF]kˉ\&ͪ8&\vWᲒLUWiMkRAli8vj7ڇmfFڸomywPU-qKڑwfQ8 cfyk2,:2u+0KG0fCzR6+vStځ!:6ত zZ}Y{DqV/9%){]Um74HHXq t*x$}BH_!2srz֬+VXZZhQ* MxܹK*VVV<6;.px+[ϊiQٲUT7W_OZ[>{06%w$۾sd\}Jbgҋ6T= L.gƅ9b"OOǗu71<'(\wֶƌT)Ѝ s#\'6_|U_ZM@ ^~G}'U46(Zvte ,^ -O߼qQ|s #:Eg}fZgh:h-/B6 OZԏFCP3Zs8,еO1Ps?-ۈ֠S6,~=2>{ $X!ZEc^锺l2-#B!0"B!{K/"Bg%"B!!B!̒$-Ǯw? Fxћn=v;trTawI^xB!B;ĐqIDAT~om`6Vw+Duod"]3QkJ%* !zt6w\;;;$bqiiiz@@gjݻwnLn]*cd_!B fff֞?~ .\֒ڷ :o [}Q[*VCZ^饾ZzN[7Tݵ4υ :JV#3Ld^ś BOk4KKK% EQ_vJ?Ol-m[1_oqU_6b6e_ y];= u[bЂ _c:c %<<'ꩿlsp] koŻ#+f$% k'*LoHJHQ"7#laR\R^}`0N_-)(/vtt0IxA]vZ1Mف#ș kZgԋ#@#3Nm y#EUQj|???oe˼S .B=SƼôizzzڻa@Np .`)eZCHJs|cR7T0Nj+vԩ ]4(*:E0P3@%SR:t=9)i{_L|S@!0?;;;;;'GoC3]sxy$o߸UgΪ*#[SKc3 n</8:95`R#0⃹sEb28>!yE'ܘa)Ra^<O$L0\A@7I)d[6OB(t~hA0 [[[~jtMmCUC^PD@j^zH_u)Z@θ{7}qv{ZƼXJWKwR&S2rb)iRLc-S7&dF#>adnwʔnI;wfQ8nM;p QnԤ y^[\+Ͽ6Ӓr)hOq{xht>!>VJ!Q( 8$EmQfV1{!zG!BCo)o Nbo}HnXlW˾WX]V!VPd`\@U/B!JE!:f> !N"F-V9Niг^Z mGJ#]&۪Z =Ԗ9JPwX- Z};ܗe.HI̮_@&o.rdl*EDx !PۦKIOv"8!-9Vr-2R+ 驋[SSˢ6lXݖGĭNK]ɻ&x/n{BV)冪#P^cWJBڂ9Ej f(E S !DhLd0#_o2eϯkqlWIƦl6-"+dC&a10juuӧOWZ~}||[AAAaa! pvaw8ʤB29iNtB*TlskvZ ^pߐB}笆#҃[̙3$"BMuFjzmWWq[C1,ۘƍtR77;v466{>{Dh5rcqnBH>`dQk1 UhR(Jo\C t6 !*1kӾ>777=ZL-v.T-B(tIq:%Wj J U+ "_`+/%%F`]d ߬R)'gKvV,ReHDRZ!˃fsee8p7&&رc2 6侼x *\-|cl)؊32 [r6> t`QmvzbC|zV3}K36 kݓ^XyT|^p:?T>[6#%I___UUUHHnmɒ%ljjR*/lMMMP~pz7ܣWNsu<ǟB^wپޢgUUT?=?K!D›O&!:>SBڮ?>!v=i!ikW+zOZ?Ϭ}ֻvgs};&13cUBTmK-rvJu7hL&Vm+/ 7T;T<%qUF5U.ڍUYn' ^ Yk qgMB!UG&%Ej䢽Dۇ[]>[ Y=Xee^h K B,_hl:~S*sњ;4%jZEu[,gDBmՍg{מ&4@%9J*¢(eZ2bwj4jY6pՐ+M;WIーR9x$F]$v!D S9|QI^^~.]bml6[ccSVVW_}fsNaks͚J'p7yy;)ˍ ...6nXދGXJzT~CtSJdstZ|pzv.39s=/1sf_!40.̝;79EEl߾].yY\B]v;GA_!Ç?I&uuut:6\g)eg.] :v!\ϷyyJMFV}dBZ-}Z!FX0ZJ]Е'b`˾D2L >[pr3 ũS}Es̱X,YYYΧC-x-eee񏆇;wɓ%K~_!DggD"1cƩS&\:+{iA/nw.nh3uu^C! -My'-wh0 ]NQTj*#WkeLִ z6.6Lv~t8_2%9-VmDThK֢le؉nm洵߭cB!]W{An]ʽs95eʔ#G\𪲲ロ/hk;-O^^6 \sl޵kR*k֬y뭷_oooWWWTc۝Ú7ol 򪬬xsٸs=qގ֎#G߹vgQ?zun>m'r7^[{Ѻ#[^QS<[ɼ+̅[23w&mڒ8!ҳSR6$Yk JqXJ7ĸ- SP]qqÎu2"io2gaCȯ6>sͲjɿSXjwvUnʊ /SZ`/~EE8p`pf0JQk֬B+WX)h4&i޽Xf6Pwn1^b\o fUC,.ZK J;k+N)nGqyy/EݵSg|3V[T|aTriU9qndUm%%_O^~|dcJ___ff].]n+W8M7+vwwvj2Z}w"DT -B*.BVQpmIQ?Or/#'x%ˇ򮮮ylޱcGQQі->理A'UE%&D{>?}K;w]NW`<8ydhhD"q&י3grxSZEsX;::ov!Dgˋ x OMʿ4_c7w_|1tdC=_VT ?٣=GpppXX; ! C=Q[[K1,V^|94] Kŀ񫾾?ţ>?>yͿ ;v'}gϞ]h׿@o?f͚O;g# @FL0ӧj. _ {sI$֏?xSLYhJ:vg}Fps]ooPPP{{ydDlٲEj z{<8=>>߿{޽VMVu]&&ɱBޕJjZE---~~~7HmfɓBnأGvwwO4r6}zE@0w\Z{~gKOOjRZ-L #3!$$$,,lϞ=]===vswwww3g19ydiӦ ^ ;(//wqqq=ydGGGddϜ9s?NpsI˖- LÇ;vL1eʔHRUQQq qą /@ _ / _ /@  /@ _ / _ /@  /@ _ /@ _ /@ _/@ _ /@ _ /@ _/@ _ /@ _ /@ _ /@ _F,LrT<IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/body/000077500000000000000000000000001461403617600211515ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/body/image01.png000066400000000000000000001543221461403617600231110ustar00rootroot00000000000000PNG  IHDRQ%;sBIT|dtEXtSoftwareShutterc IDATxwxTUI#I:.  *{]Z߮RW\DRIIB Hi?BBB$0<<0{νgϼ93yd@DDDDDDDDRp8̚5(|m@AhU/$éP%""""""""nrdLzz&&).K=%""""""""5l6aР~=!CBBzHDDDDDDD \nngm2Y0Mu;a0LEgvӲE3,yyy$'tB&*v; <,J`߾>α9~,ډ'33t,6E-N T0ILLBCCiڴicq@FFfX&}|DDDDDDDD_U=rmN:xڧ?sX0Nb_;dܠub?ԭPϧъoHLst0"ʼAbW&\0݃GhV^]biٖ>B$""""""WWºk^2kRj|︊!829qᄈ'l<}k/L8O7YtKxf+ն˧w$u?x3)>:/gKsȒm n+.ug a[a a3q+&\ܦ6mE;> ';yys 0iq<>ڇמMjBۦ/wр.w=ÃE/},'>miqSX b4h e`ׇؐUVLDDDDDDjK^Zid8?3y0w#ń5cmS}?rF4ό/.} Dlq~1La+{ޑ}fgn1h?b0/`O^6%{@K74!INv\Dݜ4l75M򢙵;.g`[B;7$]J~tn뎗L_ᭁjڻ|oyH}IKd+hr1N'G+Vk_>EÚ5XjU7z""""""e,BɔEw6w1gZnC;ljz&Ϳew*grpCрq_=&JF츁#ɔ}c` AD'K }c"Y /~,a3ћ8}H~9}{ ?3t` Hs&ngƭЪ,( ֬YW4 {+(r5ye*]<3[Z`O66?|`à'|qmG+M2X3uYgm)GW?2o?ds!L79;oLO9j0}BQo5 R8q2A^ V7<9?*}D/Ao͓m<4wmof߇0OuB?q?gYr?ޒA)+|Bq|> FQn@ d:.vWk֬j7R G\*V6(""""""`wUkZ3yKtVT/C|~1}~7SWMf>|am}8 ^1(VN~W7zz:[-1ЬY# +9n'e_Jfsv QkkD39hۭ>w+q|ejtvHJz} o1BL 0(*VQ)@IDDDDDDL8jd\). 8=';/\adD)3l#l?]oDc>z\8KfђC|6//_ÍWuK]czI;6HZF\1zX`-_aVɆ<7u6fN} GNj3uL[Ĕe,ܝu\p&(ocO#!ϧ.\l Pn1;SoDk4F&'_\aL]Xf-˖//Ÿ.vRᕈUOBxvD^VAvJ R!q$W|C yn -YǨqT,z-Xf Gq H6fyεދ͛'HQ\KX Þʼn#t>=Cx}G6/@ٛ}!~%}9|4Q^Dz2^TKO<?X_{6'$v^H{&p㽹 >|.?2/Y%˖LDDDDDDj=cԨQCK _["U2]uʷxtiEꗞ\u6[2}udegf: ào  k{QUap84ĄKvV?[#VϞ=xg [=٣c7~N;2[*^ܮ qTǏ']$m۶ &&(3 }S]F;Klwۚo<""""""գgO<֭. jwN HOK n]RRRjݟ1pEOeO${:O'y M=IfY沵`ЖԵɿxU7JEEʞΪ׿)]gPMͬy+ zu 2AB r搰g9K/֎vl;]DDDDDD@hذmڴWwR5KxX۶(s_pvSc}4g<&OĜ󪽭*5lMF "*T7bbRU'xʂ+<{y状/[a#s(0>xYvnIjzjhܙUixU\4 o1cc) 88ݧ7+V4.Rx21u_LVoSOڽ%6bx ޳>}3rp{k{'ex- }വ㑻̊-Sjnt=EmͩmxE5x,1 \0ѶM |E?MCIM ij%1)Gܐ&&b*?>}nҎNS<qnes9CPǞ/zCnf|0"""""ry  GQv;ٙ8p۶b6W/zKpp0V$>#Ӫw L7Gtc!̞=/99w5`{W>庴#7򑕅aa2={ټySŧ sqV9{\= IZSJ?Vnk7BfǧԩO]O6gbdҌ4 YUBQ,,=HG0H6M`,?O!&Lcdk4%Ǩ…B۶!0i'ws?.`ա/h#-}٬.2GoXN9:ˣK>m#r" ONDDDDD.ii;<4`/kl*0f 6#qq|)g0T۳2KLUxW^}26_닟?99[OLLuִlќlHH=4+Vdɲe5?BadpT9xD>O>Ȼ}~ִw^ b^i "eԐ {"{ȏn8]s8:FOфNIvt ^C3ui!44ΚCu_nv6π'-[p,ˉ.''?|ÆmQd2nWDGEŔ_2 -pܼ|mҘ#Ut۫tP$3L:IP>|ꇄxપl_  ,;鶉\ݳ]:wX0*!1֭Z|VHHLui;o&>2sK+-Y{B2I3 FNRT.lE8#?sYs~ԍ H[՞M_0JITz?@vh;S1^l"9mPV$er`wS">SC^cWٳ>UU m҄cF3x}7^g|6iR#}W_3tjuU^X~\̟{3v̘sܱ#׍N^^SU6 [.87FPtºU72-}|4[#W\M/~m>`v* IDAT+lGؕJC\Nv"\?A~~'o#4>''qyɧxx;k{S-3y[_ RxxGhP>tܙ}7f oibV[_8ok/n?T?ќ'n,uҾ}{ڷoOV9gKٙ^r-&#yef}lI ֗7=#qlvz.8#q#qE(~)G9Ӏ+U kH\3Ҩ{$}[7Ia\ۈ7~ј.Iˎamt&n`xv4 eX}lst=#[ڪ3CG%s}s tufpr*|\i然CPQO'm>W`lW^YH{|RC4h,]-Nҏe$ ZR_QtX6;р0ZJ_ g6G7d!&"""""FXXaaaN.]dfР-n76|{+}n+W_0?RSX|9Gd8y鯚\5j{06k԰6陙<#8p|j ㈌u]nvŦM[Xz5*\ݞgУ7{ųt 4*TΈlsgg%es3kH~~]9ea?nW؎1ylus+uմ 4 3Dm͞�)vg:VlAp]i9%I-;ss;-u(xl-%)嬏z? ?w0okVl*\|RXzN''ٺ{{gn+3X[v9爫}38(%V߉1a-ؖ[nzy2\1mSݏuˎJ3ٲcO,1hwtF_tct*rgfE ;x0m]hѠ^ᑄzAر2l1U/lW3hO̽ߐV~9l'""""""^MWaSssym~2)~?uyVPLdʄ#UTިCe0i=lڻ5G3 kFLfwcƾ2p6mcIgvv[iܪQ<+3m'$g. wI;زM%XZLAC)4j؍f Nd$>y=s7v&۾Vp8y<9ݹ5֖ups_Vȩ>X7DUIU'ʞ1yv;&Ӟ)vR85ܾ]ٝn@_ KbvBWA4 t7.F M&<t{R~>+:h 븡/ H`hNgp˄܄󜇈xey]Ǹmu/r6fFuI.Nn qe Kv횋>=Jm7IM8¯cd;'ebeys9%^SfYF[6/!$ OM_Wѹ`ZC%>ݾ$<y3y"""""""ƫ+N#Z6i\߂46,OQMb֒}HeE<ײq5ìEo-Gy\1`7-x{[W"HG1k)&nT˴|\fL|!+w6ge2b69﹔l* 2I6m ̄k%ril0ka% :K64vűTvJPyi"YǗ7[~q_lѷx/Wg~U;9DJaLX;.wa KLI aDSZuC&Ա|;$Yoit4t %`9Gb5iܰMM;Łߓr\9:;!H>4nR?f恕`/en A;nA?2?p`.o!Gꛂi4np0$No1U7ε_oFX6X/'an7O4 gk2_gprJ?﹔%bSڜ%3iy3v=Çc #2NHqGBC=7_ONe#;k!6'Yk{nj i_1ag7 W9lۋ<"\S,qoϞ cW`/UNWNY|-t^+cKϚ29Vh36dyv? [z53k~~뽪['RLyX9c*+mƯ|گez 8|\u*sM'S='Nie|&1e%){>ӯp,,c3eC]?W4oAj>_9+r[~(n= 0&h|0>H¦SU\»0Gg"O#lZ-1Wւ8 X]%Qoܝ;nR4^kJsJֺJN;U>\1JXRt>Y)խ&%)20B Mc3ٗwӘ}56K0c;>ol?c[PDDDDDDZ-X/%!O~),6lhW{mj}QD 9OoY- ||x0h[l zAW ֫?ErcCqch\z^^HWv+6)> ZVb[I4j*l>4iܐ[s:[zxwlITj= lI`" 5JDDDDDD.^^y28pB7"t"bS_MrWYC|<%F'%H+r ?U\G&G1yKߏ9ײyS{驃(fMgrӈO8QjMjB,kX< #?U}}m;}s%k=57Y: X9ו?K>Q˲frhU-}/h-u73YխWvsD\' ^u)JMtsN Y)+?▕(tV ẇoI)۸ma[1S*kf?_^Rb-'Q[1j ?~WVPxɰ۱~73/&L)ʘ:Xg*gb=S?"驩l"""""""RRN?ͷ:>}'x% dcY ̭A5~iWw?|Ǜ2k)&nT-g'Mu7H)|>yuMp` (ZO˔urTC[o;-k7uh#NzVǜt\:+INcGc|:2¦ieA~Cx"e+OKӸ+ZW`_i03#·֚:("""""""5TX^{z Mѹ +׳!F`?gί4̤^ݾ [M*˃ٿעE KE10ВO"+]#"""""""5/2IܙY0GO`Zjܜv=1^tנ7Ͽ~$25}\QG2fv.[̒s89d9 xZnܔm1xc2>h”cUqs-~ iHx\ӻI/ؾy[KlD*w_I%u+p$=uH 0Fq<> @t>\" i٢Y-6(""""""""5W""""""""^Rx%""""ޝGWQܛ !aDTԺTPDQD)ZUVKݪuߪ\u7Q@EqA4 ( ;!@~s#!f99ܹ333>;H$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IX {+XVeܨy3;K$I$闈b/L(_cߎl$I$I%,`J4 (_R寯@;҆+z’bX>a8_oh%S8￱kVSѲ kjEpܷH~QZjfM_( V) IDATBMZ gI}"Ê86K0镅<ګ=w_ߣ_Y+RzhkYE\~9KxJ ' +?\EɜͲ8_F9mX[F {J$IZJ[PM-HWqP?taLNZcu*w߿SOi! Ė[q4))Idܗ#:'SBdoNky i^V,/$I$Il"* QN";j&'%DIu}S]o^$p:W4}] ZYϫcʔbY* IյݸT~JƩpmb5 9Mu, gQeuGiAu~ZE^X-Ri-P9I7Z3복̨H|E.wJ?LIKVp,AvT-`Li-hVJa'+I$IĕWռ<%7L}Zח " ii!(:/XaoXpíWpZ!-XْSf`eE978f\1Gقg!#?ʊKHnf1MzT8[ @j Q71.}+jS8ohC8[$I$I~헨M0<|i0tE1ڣ濼.aϢt>'{#רeܨxW{$I$IznU]:mZNI$I_i/VK,x i;$I$I~Efy9xfS۷㣍^:^K$I$I:+$I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`E6yf_Ģd̥ ō(~1n~M>\xhfXz/eGz $I$I]#=i׏aICN"N"JI$I:ë1}[UuޜtAlAuFyf- 'd7O$I$Ij ~PVW4N:v}}wLJC5I$IpTJ49v~S&I$I6)ͰcQo5 eQЫ/;É׹^IJ5ԥgӮ y(G֎Ԇ%g_GNzk'?w}-9k8"=Txṗ|bVUԐHN%c mo& ?u#qd? r?p\bUUsIa?ݻ${K$I/**"##ͦϚYUz9'2w篡,I5kY>Mn_~f )?%v]* xE _|~!k~aer,!x%f2_Ʋ{S$I$_=o=O^?_~p U5gf\b Jnq_/Kȑ[x[蹔6#.'ǯ?A9Iv< 8SFv9[y r*˧,#:Z̿qキrY{ѳa$ԃcGnUuF?t+d[5$I$)(8 ZjŐ!C(,, 2dyyy~U5d#o1ݛ2qg3ᑻԍЉﮚXO~lgܳ[D1, '`й+ Z"= o& WزT ?"D{.VNJM ~_4nӋ[M@,l:lM$I$)Prrr0afС;~: :<ƎKNNfg'J,٫'+v؛=+*e ҝu|Kj!BVTǾ=g__fI]_ϔtNu:I&5Λ4iÇ+hNW)iD@Ud,Ve7\ᔑB&P ԅ9qf/۟p3J9o1/o](DbP МOѺP>Gh %6^4c(ҲoUyGI$I+((`ܸq2rHFInnU^ -q2R^vՆm5WZ>`M\% MaOωUN^Y?ӆuXW|]axU&/I$IR3ѱcG&NHnn.L8A3=vwݔ1, AJY!s uKy[}wPg;t{ i]pC ҉c_Z_Nޘܙv(~ʿG1ɝ7zO2sY]LqZ5?ف!ҡM:BYr\^w(Mb+s'O잌tR-oC$eY^$I$\ǎdgu8 :u-ν~^ҊGuzO}MW_x?\v~UVpi;rc@N)qnڣ?sU3'g^s{dworggq!ԃc߸LMy 4>=Riݗ ćppG^$I$5YYWҼ+⫹߲MnDҲ(gJNߡ Kjx;!yW3_S&.9[a3sFEWsA;ѣq_rj\wܢǟ7nّZ_ٽs+2"PIՖ;q5rh܇ ֖mY;sG3]㊤پ;:fxK$If+~%jj̟79}jH$I$Ir]tjnW$I$Iڜ^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Ii<=ς$I$IR@NM$I$I .$I$IR`5yU"gI$I$5P(M«uAU"Ο$I$IF(7&J$F%I$IuT(" D"&jj]Umm-X2FeyL.j$I$Ij"S޲+3z6A4%MS}դ q8oY]ѹE+I$I&j5㼥opc@ HJJj&{ʫes17$I$Ijb[9/~Nmmm$պZFǞ-zeH$I$.)8FySXMZyH$P]bŕ$I$IRtnъ %M\AW$I$Iҏ4([%Sv)k6lbN39$I$IW+jk<;͌L$I$]$I$Iex%I$I2$I$IR`^H{0$I$I6W ?YA_K 砌<'b1˙%_Ԋtڙ2-%u%f}It͟fNM)Do=9/Sݿ36v\ڤ`ǽlKN9Vv]:8sx9t;vHqH$IzW!c(gvR Mi_9^Q-^{00"V/QY=9#3]Vu87ʤb1o.*bM8{Py˖ZQ)@]riيX1SKVS $ŗm]OM[KxE=Q?ьWF14mHq/y'U8kjMoM{q)-͘9PbO'{!XIߧmK;U_wjRZk ʼng϶?F&[ `HT %I$꧊-Fq]"hlղ(W00b8ԅعFmݓ:5%/pQ<2 ؚ$lW&whڔǐe5m=۵"b.Ϝ+$ )2J2q|ҙ#߇,bW5ѭ2,>%1|q]2&A`_wn7_f╔2۲7{y(!Xȓ\-z6K0%Tm?_;6l1k_I)d!@pP@0JggQa/KO"k??-Fp g𛎙T.srĎ^Y=},7m^}[<4mc*[]q;W i KoKw&g:os<7$I$5ë,iS+V܁X#_~̨ UQ Y5{JzpIv[HUȅ' %{lZ|gB4 -Nh %QjtdZLGOoVwae+|E]޺EYT65=GZ6.YYٮkV1wx/Xx한ߧa?bJ"D) [}r3Gȴ9pO06B.[SZV.^>bCz{0WW&9~̊| npjR;aϣ%[6RȃqGwq!8Ĉ&GHp眱;LnU_їq'!N:{ gl{dN gVq'Updmgugr:-ZɊ[sŸ0 [Yᴫܨ.ӝ#|Ȍ LT0s۸yuɭ8g\"+??=ĔX u k핬2}49}?$I?dxz5gAGgY\ '8_Z1| d&E6K˾}vv0UʥLZ9{JV3w_<1º~ߩ:n8mb25?g3q)\N9Kƨjz9qV2˸~za\LZ?umijvc=5s[g~;EbL+f)ri\s11\ώ{K$CO~Ip̾ιvR<O£7 %Aݎ<9'F;6%I$IRbD\;~#{Y̽ >ԯ+2BIߍօYU2ד=ZoiՇⰥcs"J^>LZFN'ppo; >棵uWZ @ꗟU]r2)Gi)Ǣ$',@z~`x9u9g}n.DyE*DSo|'ITR^E^U{3l\H@ҏU.\чl.fte<K&+P.}#A%kgcÏv{vL or鐗%I/xB_>{&Ⱦ cE dycf%{g>~ oߚ]vr)wzB$IdxъTũ([s>^͢[awVW~J7@%Y<#*.8;E^~dno[LmŠCvcmPi e@JV̙ÊoY[KR}vE#9\tϟg5CLy}˅{H%==kG=I"I*+"ѧuM'+%+CaT5f?eylcdMI@v4ax+NІh;ĕg'kbocNQVZAOKu {ǻzG9y+C@L I][=0ǁ;'\5 ~o72?RKqR+t2֬[j:f$‰͏Q\8{^iI򒹼*)^')kǖ/,Z)᭧&U__t|y{|ɣLbĨ\0_PXMAo贌WM ɕ~EJUֆl yI!c\Fr3H;?&X/jb>`<3e *1޿R.~u)@]Jݺe~cݲ $I$ Xy AbvۅvkF)e/_͟c7&VqR,G0e.))(EsWVZtp,{v%6Xr*^9$,|F2H]8뢡tkXk$쏞'6=s[Q  o=oW3kDPן㰍F,yܚזydV1wN P*[z9xjF%#ϬZ'՛︘w>3?KlGA ߅'H*}KBI ?ﺘ΢E]8UrA۳eqq_r='}o;?f=zLU3?xW˿:Q@mz[v m ۓu'F Pq;:s7{Dﻜ>=uJ$I62mo5 ϛ>ox2mg<Aq$EuzoвPQ 8Տޞ i)pR]o TAr h"Ԇu3N ;ox8{q oL~~o.*kXi|~YW:Iie/v8߶'GJO_Hy;n](7Fq /S8g)+VPׁ^#Ȧh/w,v$I$5mg<@q#H'm-jܵK'+66 %1`^çMMtwC|ǟuRD$I$IH+THrrl҃Ǻ C<$I$L>$I$I2$I$IR`^I$I$)^兓=;͌L$I$^޳x$I$Iү-osHv)kò4jʫp8L-]C $I$Ijb VBY3 7iU ^_ym4 b\.:KJ$I$IlewƂfD6ja(IYܗ?d&H4+I$Iuyͺ0HHSwJ8&))D"'I$I.Z)5clp%I$I64!I$IJ $I$ITW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IX Du,ƲeESQQY$I$Ij"ii!? )hOWձ0۱U*$I$Ij"U,*fCM`5yxlY۷s^$I$IM,= 9ͲeEM4WEʐ$I$I 697~4yxUQQ飂$I$I"cAI$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$Vr%Kxg^ًVRpj&-;moG{R@n|$I$IU^հq|8 .ٕ2?{o;J$I$m"WUb>"{%ʯ>QWgqJ$IfR~EEEdddIO j*LRӾ>ڑ].,׋ޓ,-M@Ͻ⸽{ 㟿=fNn6L [v^tO 5L:VG\ʟ*_?|x{wfw;)NnMstk J?ϼͧˋ)ݷc#) Ċc<3}6KWUdkq( R%I$IjƮz^ƎK޽Һ1C夓N.$y=6m@}57=Sg/fU [~3J,7?ei3; En>~V.y|6z١LZkY/ weڊ a\We֫ vfӶihZPEmr/y J97X֫-٭e$y%7ˁ9OqbUu]ɸ>` 1OeND%ǣy|#$7tx.r%68lTkcRGf HF$I$a„ WA()YSB0Yb16{֑Ё-ðh~ udaƗQQQ38[>P6}bK9 iidHsI&=9 ԐJs_9[-] |^ERDzJN1"iNnx0^{ԭ>yK':SzL|_?/ߟ k#$I$[F 4aÆ1j(vuo,3eFA6m6 YxUW%3>˂6 S2]v2t- ҀD**(kXSA,!-;hZɄ |4}6]%3$Nr9m޴,bm~z˵چC/,e|T&E=mo5;fyK$I Xk<L4:&f6`{Ҽ{z>o]dsYijrȏhߧ;i@WL]np8ctޕ-JVG;пߖ81 <[Ĭ@ ;lՃqjjB}BQYrw$I$I&L@~~>#GdҤIL4#G6WM4wΑg/Vٝr꣭iLmI1+@ :?l#M%_E gPDcpjhj>{>tJ,pW?xi5U{>/H JX>!eF(d-I*_Μ$By޻Z$IMLAAƍc=dȑnv4÷ r;|-S3ݲ'; =i[l#C.:<͋2t⸽{L]OP+~]>}2s#n[>H$ B]9ԃY~h/.l{Yf7$[s ym &'iA۳#8c;Z$IMPǎ8q"{''N+~헨M0<|t&Oyw+R$I$iJ֮ ;?uS6=ܪs.%I$I6MZI$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$)"A؉SLH$I$;^N I$I B J$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I Ȧz`TWWSWWG"LK$IMN("))&ydU<Z+I$IJ$RQQA<$q bW$I$Iڬly&^yJ$Iʦlᕏ J$IͦAI$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$);?d$- /VW,_gmV_bݪhp dI$dߗI2 *0q̙{\眼|>WᕈX q7rϺzu)2d/%.z 9 ^}׎kamz{f_\ՍwoSj5Ȃa}ݳM ~;ŎfJ҅ٶ]IzK 9K^M-~5<0o$q9EDDDDDDS"tF ghlII\^;n̢9z4"~7!o X]de!}׉,מ'xcvЖ_IS?-hns0&C/"""""""«;y3 g\1ﰪQ\{ϭdmn8=]+0Zfɽ?HlQ\@w A1\Szz://&==ppkEDDDDDD{*]D Gzh yH˸ׇPCj~߲d.\xĶ d~ۍnJvSfX  Fk^@-yV`CJL[06Y *a;s\z,[ 'x -[ȑ#yڎ?m&g\ʢ35"""""""QxuM+x6?zzrʪU jժUĂןO>ᅝ,~hw,ӊgPqqF~>|8#iqn'^ҁkȑ,[츃+ _B23(jXFWߑ7&Իw1~6s!3Mk XSbNuZ_puӷ뭈 n[DDDDDDD7 #OY\>i#l(nO6Yg`p="yon{0KCqk;`جMh,Sv""""""""2fϞmz:M }J/ u&&3Ԥ>f1u?45"ܝ`QLj`Nw2r9!>NWL# zɵԴXh"""""""r)oM`ADDDDDDD*Kᕈ|7W}S}!""""""'+NT ADDDDDDNW?rwΠ9v3~Z?_2""""""#).9ikKq~ЬΑc>b$O-j'dLN.kd`""""""TyՃ+i.5mVP#1\5o>?ЇUkQϸzR7rl`uv7|BsW=,^Qŧ#'-/P9XӅYǪyl X=o@8ʍ# )4w87uxdqqWaXqN U4S FCŦl>*S_($ӟC(̨QPUR0yOٱ ҄w=,t<^+,!UpfǮޥ$4J}"tu\Op inmdX>I밎xUi3.@qZZS4j vMo C'^.G2iP\4͹-G}[cr:Qq#%&fk9;!lH8/Ϲ}eIDDDDDD«4[(^ƃu*,]?tqS[߂ʺw7>bxw8-O ?A8~,/f YAaf^QD/1AqkXmWc; "z W""""""^pyrf2 [g⷗H_B|N&Ff ?>gдqui*dp7xc;mfZ{]K &퀝 Q) QpFIJ#:ic^[㱻kپ= x$Yq{|8tr@$5]Af|[VnO f܀]J>LII<[L窺Sxykw7p筟7?}w ǚ#/wzeiur&C u쏂P?M^~$L؃WpV® -jߝ3U|Fsx&8[ë8n[ïn]CmGoc̞=t^@ML:g mI#+uneD4WNw2r9!>NW"rlzlBf m7 IDATP߈7Rx%"Aa>ʡsa 7Sx%"a#I+}is5m7\؞}%l/oCIrLXDDDDD4+әJQl)%g5;V`GX $b6z ;LNcZyv2,Dv] 5q~Ԯ­|)fC2}$*L4tX &vZ pbBV A[ i;[׈ÊsXMI"¬&FP]D8wnfo E5lZ%yU.:9s*CB틈L4fPOQn)%pTSlw5ť/3w\YHYy!%`uhu8ћ䄀'5=T}\Azk=xټ_Xƫڰg/Xe'{s3͏,+ k[y|>{y `ml<'$"""""(9FnZU1 g ۸^@ο8֛؃c,4z[=<vv=S"~6 *tC!dJ>} ?m.soa>UeeT9۱H+e#8;! ks9{r)7INpy93% hֵ'R&0 sq|!D?so~VlU%y6(r3/ygDWTU1į-e_D pĴ@Km! ^wU1m9oh(!s'{g-t]c;A W[EZn) yk_ghlztDDDDDDzW"9ܚN:ugu&Wg2tq\J I߰Vl$h, cx%Jv-03d_V׏T\? ^^}s3M9Y*vff233XNaf=7JiY=9/T{\L`[f&u?z-8V:+iqY<Լ|z?oXvZ-Bu7"xKo ы7m1`P8E9t&3`_%a$'aqXvK]X|MgGDDDDDPi3l lc[&^[9"%Ε/{y)-ዒ ?bR #grv:G17 PF~;a'~bCH:◮!"%[ r)AǸޕ2<H 4Z7iy5>xz'e\ҧ}n"GKzjCcC39;6γi`b/e&܈ٳMOIaA9ٻOĤsƝ64"'CS]nk #:k΃=yL N <흌h'&wNS啈 gX)<aa߽\/([LZJDDDDDDDDz,W f"""""""rQxu(y~vs&'^b,x3~z5sbݤ?0okħ#'-/P9X [E3gbj4Tlc|tqk (GjcscKMbSŧAjqW$1+C+_Tco)q z}5H""""""TyՃ4&^ON1.ѻ0@ ޠ8ΞGye(:nk"ǖ k4?N :ƞ/&O&;a ӊg\5/L s7RRmB>"g cd;{?C4_\֋־_pkln fr8םp_J`ˆ*C?q0~sukDDDDDD[(A|B D 8yCzsS,aW51\76 S1; 'dm@ymVk:i1w06ʋsp{>vPqw4vLrFk`DDDDDD(A+$[?Cwΰ^94wX +a.b 9Uk`~肍5$xc7Mf|o'lx gVnZ=0%ݻ;f>qm|=>E䍹8ى`-ϊ(H>ZOu!4~YDFX~QZ۩ȩdĩEDDDDD)A:f+{wP\RjR]׿c2 fUY{WDDDDDDNU^VR?`Ky-y8ٱb;R5%k j K).g_m,Vh)p-CqN1n7 OjzJ}%`D?k}ǝ{K՞ \ϰc*eoI}D``+g_lܖnG a5Um`))&rjq̪~MLtpUDDDDDTPx%r3(&ܴA v!WFY{9~w #%޽1bS}Xtê *tB!dJ>s=w]=W"WQOB0Q7>ǸTK~زc#-T;J~~E !I,XԟOxȺ(j'jΝ,/r7^*q|΍ M&:| DNwf=%ut8#pG=,岯"8bZ/ƈ׻*٘Aly74+P 3ޙqa3Ć_ If2nH۽8J>1KyE ^|wwe%lڼWf}Xdm~ >-yYsRh^ȩJ4gq[IgҠ5EpFq0"]lboy8f\>"㡭ޡp|]]{ˌ#vw#\{r)7UNIπ(/Tt@Kb5`B^*ZE4g,KؙɮZJr$c}:%dffߴf+etvdR9Vf:Wv23ɮkYSnXIFN3Юǝʇ'%slнUl}K7n7[IfvR3S.;2VpnĻm Vl@K]m~ !ȉ+\g@ƶMls~EJ+_`eig~iRZ%3 ~ĤVGtbok~I#wx5N$t9/]C&0DNKāR krNnqeWz~)pz&2e@ >c˫K;Sr\8$w?Zuøt*SȘ={4),( '{)tθfSSFVdzhm OO{ W5mPlWUy\u68 Sp%"""""=yb.u2r9!>NW"r6a?56(5""""""y%""""""""=+f:OJnS}~>d1\Ɗ?2~~Eyٺ8#pcؚ˼UJo1#/_Ne 2H+o=Fx4%lfn0E.fmz L Nj ˕`1|+X.oZ#)x_yݐ< LawM{~}Lۿ(#a*w U5˗i5N$x֍{ۍ\JGKW8dex*i̙Lx_f\.ඛ.Av+7Md7ŗsX0=kV㜹? fss|pza`1̺e>w+Z3yqmϟ™޽|?x>}쵟M#iǿm:V-csg(-ŭ0 x¹xPnLHᦹùC$KLrsD ̌Fpr(oz+?sSbS6{/f(QhIns#gYMVu Pvj~\8$ј?<9-Ixs3)'LW:e-J=m[?:=_ ܔ>Y~|ܺfw0-)J724F3I$FTT&d֌$Np=<~.gfl`]I{WњlA\tӹ\TߥzS4j vMo C'^.G2iP\4͹-G}3ӗkg&й)61[asFry4F~+4L""""""^--.FtD("ʧZ¶_>foʀ3'ᶴ^Xw@^|7 R[M-`p5Bcz5wDkF#c\@a%)+݇>&lk+#cң^\pU? ͬ x0~3/oyKLqܧڬV[v؎DcCᕈ|;W=@@?ࡦ`+y҄M` +S-{~u3Wn"^94 ߺj ZLZɫO 0$Ayer"CνVVolM٬âXa4ϰ߆ vNUKEDDDDD^~Ig0 k˼K=@Wh>YI~d\NePYCjXIg͋&9#ҧC; v :3Jr7- ݝLz`So|ؼZO.e&u;ck`,ucs}|>i293cpL1QeS_B`\C>,&8Ϋd,R)dDYwa6YT$FfɁ>vۛqom[Zɺ=-؊qFv):|D07g$&Rl]0eJDDDDDDNU7ʿ^b?Y vXqDĐxY_B~eh2p<^w&47S|/NzأTHYvt+kFd鸳h͕ePeTp(Dcfܒ-Tb{OrIs[_)md1"1s;"P?M^~$L؃WpV® -jߝ3U|~sx&8[ë8n[ïn]CmGoc̞=t^@ML:g mI#{sgοJxuneD4WNw2r9!>NW"rlzlBf mP߈7Rx%"Aa>ʡsa 7Sx%43瘯eHn]c3-|Vu\}gel|z /B |񎉈HW"?yil#~پоaOT1(rO IDATm[h=t_˨:;~u)'yOgEV `74c&3qp/|羵%9>c""""""c+̷O3i}.SW1j:^s5y״6LI ][s)._sObA޽D.&npJDDDDDDDW"3R^K^E'>jvXfMI"l kvuMu :C(ky+*ۍ˰)oT5~gG۱Kt'bQ*ʧ2)o6;)G}P_ZJChmGg|W}ȥt| Hf+RIQBC8t `zDjF5m^1|FF&m/vw8& $K., QU|IZa FD.fVl)Ùw_oS|ge~Foκ|10um\ւ Zl}H1v*%$A^voͦ)hE DDDDDKi̠RJ50.+w()(.}-b>BKZ`­˄L9Ÿ$'<*_5frvbW[0]:w6-YV{ 7s=Î^̼\J ;#ԉ8l`֓i^oo|,l|=_sKkJ LN&!=x#]gբe&3-X/ BڒVlԗQ^^NMqu}}Mͥۋ>Fjr? cӒǛO?ة)cG_ k9>/mEWUBE{%Oc-ADDDDD~^L# 7-bxxkC]ȕQ } ҏܗ3aڻ9]y꯯RxsXuA5Y.:BRH\c=M;ȳdx{9dkO.冝Xr)ѓg`Է Gxc<.8;mttV;AwF.%q 1UJs0 ZPDDDDD~^,Brk:LtI (j|r"\F8c8[5/&cS{-2~>hX ?9]u麇k1g3ڧ՝ŎcCB6+θ@0 ]K!7=5r2uΘBW9% ^<Ȓ\M9o=emZ+.Ѱ @l ;gcb,#Ҙֽt F_)]Ӊ7/"""""C%/rTS%dWi -%9dff>z233oVAҲzCs^:;2 653ؖIv];`jŧv J2rqvJ>lV>0>.c]7f%mԆ ZWEv^z_ j~ƚp28/AVpDDiuoGf۞MΎMVϖ#k=;2v]b6QTPA'[:m,} 11l@K6vdoa Ԭ&ą'"@3b.r`""""""?d9u d@ml+k6>WDyعVvvW:/1|Q2GLJ\CK@;qG )]^0DӘĜɬ!鼼s/? 3").()AƠ,b.)!H1{liRXP@NSz71q'ͦ&TW3T&jq;3s&شVv*h8,-o'pxlrl)3]ZwjT;Hm3$fE{xK<|}-4ĵW`|IDDDDDD*z$c* "e$fλ%v;n:ٚkE40ࠑIC)s/S[kL_@@>>*nڄG?.|D *yƴv~ٽ9i}תٖFiup;+ᾔܛ Uaa>LȷPxә-~GN~k?ǜXnY8krJ `Yw0@>ҫOWHGAǍZ9 w?6ӎsW(""""""rl^ >ɥ3[nE^sk`MWفZɛϭ?]HquNP S_J ϊ/6׹1޽7 5L򈈈1ҚW=K`?>>c> y0rp${r8x{snW!+5g -Wj@F&:(;m)`}AEŕld7otEDDD{w]}sMKf&Hi$$Ћ(,jvb{Un˃쪨+*mU04PWLB ^Ho3I]$I:'pup~/^@F޿&K.7-hOˀSr{ɰ%k}FKoY߽+3+?1,Or6V1y9Yԣ{p-Se^[׌|>i~rt-DfA&e%/[ni+gIٳf yi'mnڴɝ^uEy1Æ >+K+ K$mS|ǹs-_jޔknӔf}%Wsյ< .=<9eZ|wzJĹprx/5I^'擗-Sw'P^?en,?t(Z&tBF^Ay}rЙ>Μx5/o̽۟z_z9eJRѴ:K6Sjݜ5dъiItK^%2 :,L\6sjKELL=2nDz7d[;F3Տ~}lPU+i4*sj2srA]sВɚRevhj ӳbs9u:6==ܒ˖eCkUztPzTx|j?2o#S\;q[wڱOGuZ#N_7"ʭYR;M92s)R+|WЉ>,˒tZ+bseRJE_,fLΣ]v|vYbA-ْTuMMOei>tܒųt`<~N-Y?5SVuˊ/sYk~,sj;?+-˛RmH|֤T]GgzV:Lx0 :ri@N'2w&g{?w ع6T{!y?ʜ_{~~coΪo'.8JY sd2mzɽ 򹷏LösY3T-[յ]S3Q''T!\je6ojIKԒ2Y[+mGx+ϼ%0* eoSyX6O%?urjK*tIi۶ >#ƕk!i9I=|(& :ʦ-m#X?_1?6s~b֢4d\9YRJxMYb]ںg|a%[׭ˆt;W`ʵ3YrY}Lw.Ko]{+gxώlzk~>eudEِ/ X :ʕ5۸$O'5&I3)YRJzg陷i dIZyL [;y&i55OϬuےT*[gtZ֍+3u4H\ͳr۷+kٳsy*W.֤a\!~{k؞ҡ2(merǾ;#Νy0^!+zkSxBn?>w.iNme~$G~_]Y=Pjsecff.SՎ8&GUe;r_OI6#tZwٔ\{so vtZ4'ےCzWmȐtׯ=+%beŠsqc2rt/ogzSp=rK[9 O̞5c}LkN;insӦM,-ٴn]{ݾ__%k׵K=444nb ?r|5}TզwZ2m(,wC\}7sgkt~Fnrih.r9?'\@p>yHz-ͮ ~ ^rM)ī=P>dY W{e)_~%|k_KmpO.)dQo/|mFKX$+Zr=]}С=Pj.g[^SbXdEt1^ `avC\}7sruQj7KC}-oK%/īQI+_Y (, (, (, (, (, (, (, (NJ; t)UEeKg!jjj<Jg!2^UUU.VTJeeeRUU)ϱ޼o\+ K+ K+ K+ K+ K+ K+ K+ K+ K:뉵e۶miooO\vNT*"]tIeee?8y?W\y3_+/tu>Ii\y28zɶ/|IӐcpU>3m)ӏLIiHk>9'=sǷV38o%aЌڶ%v_^?rI$ɨQܯoǫOBnθqn:+yj>5*'g'62kNRmĉ9'פ1]3,os31W}6?2&.H[uYZN㠿˗12j?M YGFsLj_\4oL++ɚX˙9wfrkr;ּjUnz47vvZR/Rrzߤܜ%?}kU J'sJY2O|*9/3ӞUq'NOߔR\!\񕼹GGOmױRsӌ152 _TT^_8#czt$F6lؐn!ƍmfEnj62Zf.C3k2c$UrtO)͇;>SjM%IDAT5IZԴ{;*$F=1~1-ӟ8U18cv薞}ӫmiMcS95<9m ޾qY|~fl(gӇX:0tH!u`ܳ)V7>k˭ٴfs^#^3{I'ۏg@wp/O˂ޱ׳?/\{I"`> ^R}FqTg>fi3ǑҶEynȯͪ--/m7iɺ-k{x.U}{'ߙL]>-;7ǚҜiulORʖ}Ԧo ,դfm\ vZzˮḾiK3)nZx}bh79S6dN[9Fӷ7^|xy ?~vɒݲ(:j;eΑLMYZޱJYݒ[>t`Vޗ,ÀUSױ֖45SѸ:IګkӳG)ٸm{b}]mikژISո}d[k]gDC\{@[9shC*wNcrG{JIyC>*I7朣Geʬ؜$in͠Q{&I6ϜۇAH*rKjF ͛$-Ͷl<1 =&C+Kl^xܜyORuQYW*=8fxz&_Hؾ8{<',L4 ctEnȱoݨ+K ?t6!lJ[͈at֦oipSҌDzTgqZ6?[>+,{~9db~8wanuPʋdִ7|?;F^OȮ!gۈr.k?|ҽqAiY9.ȹwKՆy`ڲN6.|5POdڞ9Sʨ$inIZ<#z)Խ"kߟ,6zWՖ-ԝr~T:s-m,??I2{֌z=0!9M6SLɥ^믿^eаW/͋6?l G}t(, (, (, (, (, (, (, (, (, T*Jg!2^UTPt)Ϫ t)UUUURYYi !iJTVV.UUU:{eq( K+ K+ K+ K+ K+ K+ K:뉵e۶miooO\vNT*"]tIeeek/*lL ȕg{̼9;Ty׿n&qroa_ו2k㪟s]'(/Y|elJ/ϾSڤ i}3#M-7g.UӚ^Ԍ~ټ\K/j/k랾}9IҚ-65)W7o$I#u}O?%4%IeYK闚]]Y;=kK;۸<˜-02&mISק.hYYJ=!x)js2Cz{+'_京%I ͨm[~h}zv7j4īl rŷ/ [Sy?;};Y'ںfǾgQ_ՙ'>OKfNΣMg欺xU*/ϔ˒$t\PҀ}tN|$KI]^p'sy50/pix9WT9IdYFc>uIʵs֔+$Y7WWeƊi,զ/oT+?i qs}3kF7dߘk^;:;9]Z$!aHsͥim277ر~Ï[zP$?\?-Mc>9㯻+S6%}yX gz?m>ܽ|GJ+;~Y7GS7e羓όJڙ_ًzc{80}CfH}3.>)S.u]^złd;X˰>Id΄9;޶i#Y7߾ui{<5[̺??Op5x[wOͲ-U{QuB~zS&wZ̶2slCc>rK~Y]8%#:gAU3::syul땑'czg?_*wgۗYvw_aPJ7eR*U*)7e-7/{dTWwg[k!PWJɹoƿ!9ؾ*sYۿ씓R ~~o?9ƍ˺ubZQڶ*ab'ipHQJR'S3'ezrSfN$}O?)SʪsбǤгٿMf#Ym9y?=;zLrcǿ䛓vycyCnQ׼?.J{fLn93g9}ybS{|tWɿ^3(ż}@eJ_3;M1rMsGԦz]y`q[;|vk&, 97]qP{RJ%󺞓m;^+jmC.+yyp]{\ 3_a{w~1yM7aÆp 7n\n6#x^A|֎hҶaMַ&4dϰ14p_<=cGlI{iP:$I}$~nKɺlnٽQIWd$vܰtMR}Ɯ<$Փ}U18cv얞}ӫmiMcS9Y|+$cri@wp/O˂o;2;c*a3[Y_0Xjٔ5ŏ?;#>]3ļSyuf<p&+x;MOb^rin_ٶִ6kv޺rcxO{ay޹wL$rvđ&ݒf/KS{xRjޒrzu]]4w';S9%̌[ߴ%IRY=~`}]T5]^oS}*⳧5n;l֯K=';^RdƎأo.>uIZҸ?XW gϫTMUt\J)yյkT~[Q]4wuytK6Uڞ9eC3Uݒ[>t`Vޗ,ÀU_Wd}ښ6fsvjl8ֺψZSWнKjԑz}" lJN *R=Si/ ۧ -͜%͡真Gˑmٰ#f4>ڻ>Idٚ$L|xfvlWtv^:8S3joޜ$iɶgm9pLR<}qRyy&NX$i>y7G/Inڄپ@|ډwakڌ=xE]n!{lnvxE0*W ˩=YEOS]Lɺ-Yx5nz,{t^ZHϪ˝ߙs^lyi 2gmusj^{9 rU ]k_6Mѽ&IK6\䨜wg!ù sgŨR^4%|/zЂImOw崿GXvOS9ʬx洖S>r\\~}&+^ꤎ<}fS֏'XҢ)_WWgdCMZ=Vlۭ}y'rG怪Y=}z:#ҫZZ\JZ<#z)Խ"kߟ,6zWՖ-u5lz*f/Ϧ@U/4=gl\)>v!'˧/t<-/>6yCkՌ<д,9 G|3oܯ#> Wb=rK[9 O̞5c}LkN;insӦM,l7eʔ\z饹+Nano_t3l;~CM裏wBd %^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX2^J%wxU=Sƫ WC:YxbWC:eJ]]]*++M!:RեScUgyO8^,@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aWjӸe;P [e?=^'WDUkүO8^xտ,^, -5 eָek.ZK~/TХ&'=:+VʌԴS2M>}rأӥe?"\.55ttvmx@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aWx@aU RElJP8UIn/ ~@!SN-Y靇zT$Oޮ />}z{C$G^=o|c?aGoK,ї}IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/body/image02.png000066400000000000000000002364701461403617600231170ustar00rootroot00000000000000PNG  IHDR8gsBIT|dtEXtSoftwareShutterc IDATxwxTUI#I轋.  PZvײvu}Օ.TH*$!L ѹs=3wx}9נɓ'{"""""""""`FkB:!!N:,v;.g..K`RS9|'q\)vf zuC0Ə [hC""""""""rv;nɂl1 a*?=n͚`!>.ē4T2IXxaaZoZZlv8UN\\餦bXζ.ou:4UPDDDDDDDGBBBJƍ0Nvҋ0#"""""""R*+X]k;jqgGGDDDDDDDrܸ\Nn˙LfTfrrZiܸ1NJթJDDDDDDDs}L0̙˴i0]۪<{&cԨ1X̖j̙3)Sb3JUg+Ղ-/30̚(rx\nn7N\өNs= &Lǔ)S+ԖjfʔL0ŋX)S1[ͥBᕟ>~x ÜhQՂ{v69YY&6x""WiFa,^|QNx1&J VGDZJ;_UZ0ppeZ\A9G^aj,ˁjϏʩlUBꗳ2'PF\\Nl:rq;]$|Q""""""s.5vrr;w^Bթ@5TA>]"![9]?QK*""{ĿJijԨ1%L!\x. ++ɬw[2d6ޭS,);‹/Tie2̙3 ϙ3b?\{P|qELZWe6hQx%ry~)ޭ̰ɨ:EDDDDD.s&ZMƔ)S/|> V+SLeʔEV~*)r92Le%\`T ۲m%-e~ c+0.:EDDDDD.RWMkRo}W3,}EAU2+9~aa4nܸR6 䒙[YVpgfoaѡv=ӡ28G>~{.{]{{L?<{cuq(~{s|ONoo1"*YW""""";b60W5|^^%:U 9>Ӆ wBtfdTmB?ԭPgъoö 0BGaF9ʜAϧyf;rUL .w>pXfMM|$Ѽ"*](WxeJ?mۋe>JHOȦټBQ#=c?3<{|[d-y|S5c]>k|[,'o?7^Os)zX4!_< uGR[vʀ,:oH?V8omjvZ0*-Ã|pb_d\#f7㣯]h-|활e7.1xx4 eqtxO<ڧ5?x`j $ATd4 b| 2~z}Hwë*/ّFA.`?33>ZHrs<2~^?]3j>/' l@"șeҼCd)ݔ>3/?lfUÕzo7tΞ<_kf&X};'@c!{݅:Xyӽ N[:ȳ߶-i=Yp>+J鼱5ZWpS7ѩe?Q2iIc_̣OelmFSKǿp?)w\\_/)֯_֮]ի+A/c)N,ɽoxֱ,H<=_~N֩C0Do{p*g D?4wcY?g I+O":r r V,>#AfVf[+G棙j|?Ivma!:v wAg{.M=t={gl Yr`OӖů'6䖢VN Qn: C˙yA3a6m݅Vt @AvQXλϿT#^]AB |.t,N pOڟu dm6 ;O/3<~~LAIr>S78-cOdX%|*({n:}~6#<-XiTw]Lqf$OltC[ d<8&-;Xzŋ}l}z"sZzu m-̡~=;J;g-;1 }vq3.Mhe!OXp}!!Kwg!;gC锈T^ܽȚWIngo|N;ꑗy~sA< [za¸<ܱ}xgJ~'e9{oՆo %fr&2J9HU oÓʼnӮ8ED-\<_?OqQ^j?Avf_`ᆸ}v3_* LqZsIw`0rb q׸Zv=V`֥}Y3mq?_+[ezڠ&_ܑ-im=> X1xx(p,6, K~tXL]s=~+ 7x؂ cXi+=뮦^̏,;,mYÊk3[6W5Or*F=p a6 {'g+ OKnvزt#OlIeᗸRdq譿dҨGyvGI{A-+s?d<<6xC-|활p]8_{!YK|eKܾtr._o0QFy.1GJ7/-nr7 9eĻk o{貄rTu4qPzX"""""""ѼYy\mhbY 9eGSe*#^^+Z""""""RJ^iDUMOP;ug)/$Wʈ2pIgjuNK^hެ `L5XWMQ(٢KC+ŬzX Wp%""""""P0|c"1)tH9:d֚W" o6_(9\`B+o2[-Dj_gw"""""""pG`PzJ  많Wl00,&3>6f0(R |ȵrpxxbT jZDDDDDDHjRRZ]DDDDDDDD+Z DDDDDDDDk)$vǣ'ʉa&&3&U5W5vp8AaHt bl`: (N.7*mxp`SDDDDDD.=LTgp8q9XfE-Mcj˅Ñ[Uޗ+j7.KoD%SxU.rjVPp%""""""^Vq`U&W5&ב"""""""a8rsqteuCBw$9p|V~Y{NȍѶm[Zhb!*:Ȩ(̙KZz:wNė_ͬP[>"""""""cFR#׎VLF_{-]0ۻ7j`^Tix\5 %!>]bߟVKճgYk.GzͷߡcL W.k\ժiۦ-[ ::ȨH;4}S]FZ;-lwnʑ""""""գgO<ׯ+nۅ\;nnz\6^9y'Mb2UVM,\LH?<}>p7l$'; VY[FPp0f}-og >[&η}G`@ 7&zK}AYySNcm2dfg1ۙ6uz7em+ia+>.'9ݻMIEDDDDDbРA /XPd$>b*M""ݻwr 7 /cN>)fyGxo?իxFVC=k3n'l<}s51v-M@ltmyzɽG<윢#\f }yڜ3Xo^{o5'}QsoL,Zdtx +F|n^sm‡ gPPY]ɯ儵$g_JЦuo@V8x`*nX*'~  c%kΞ}{ΟI;o~UU ݷߠWW#?l6VZU,UZpv~`gw`>\K0lp<ˮ8zt 4{Q9ɞ_׊Sx/EMkhztg$6}y[27;CLJ_X?zƝdsRe){k(ʟQcl9-#ѷ1=a \If|aBs';'ʧԯzi|fiN`Ns܈H0Gc00o@+ԅW^22_~5 VW\(U`s畸{fѕ{QenzL&-_| g饨JIOdX4ymcWd vZr8Ѣ׻$칧u|Зy-""R9!9: +:{-NO^m4=_}C QvKv቎MDrkszLVGb~tƻUx0mi@f~$m!={wӧORWN}襤#\Nss6n'3=m6&WE>} j'DJjJn?W`` 4 c∮ <9sYߒUe}W Wjx[c\K;r2Y&S㡴W$<-[6^x`aQ7KǨUÐE<AŒQWp4 HTJ@v6d`CBo>v8eB|cvx>lݺNDDDDDD.wYYY|w 6@d2qͷЫWo"#b5x àY$ğ$;'>?_?B5$&h>BsJ"x*' O04{!!^<7n niENm"WAN*!OHe.߲E *{ҫWol>MЫWogZ2f|6jć1y|]B5> >G]A%WW ,žcg@3:u#_UMׯs΄6 0Ν:~CLK?fŔ-a;ٝLae_( IDATmw ].[9To#RN&m'q~ޘSg+ } $EqW~ rաi9XoΙdO⌫MuNZzV~=ItܬW*"""""r\.HH>''qyɧxx;k{S%3y[_ ΤocpwQn]ܩ=0o럘x-ΤTlYYך?!n^|ɯa nP9FS~Jvh׮[4<;?X:ĮԢk7+2nohx3yX_,ol)wًqe}pGPq,E km@l3MS{$}[6QaTmۉ3~ѐMI9pˌf]T:gx64 yX]lt6#E'Kx~6bc)P{fyGi׶I=S)bՒhm<|[k_t Q ×x9y0žP| ZYʖGX`) 7ßRq/$.r.`p9.4N\ȼ+ִJ!Hɕ,ه2 #0v˙~P KcXr {|!7%MǏp, ?ÙI-,]XHaFXX.e˖a64h fۍdž=^ ۪5p}旵 ߏ3gRXbGd8ssyj\5jsu+7kP6<#8p|* h۶--[4rkn6oʪ5kpTB{٫W/}YjvZy ?4z-6nܨo//exO&Y!"""""Raڵ硇&::SIyկM7D۶㏈*o7ÄV)7d ˑfϞKVvr<~x87o/kֲbժj;'ObI̘JR~ѼY깜Nr1~8ڶiK6m"2*%--MT"W5bfT oxP%""""""m„fdVpUٴU d2r9q8]U:{ })S?T Ղd0+*(7a`XX]n\nn<'""""""Rۆa`21L͚V^&Lfh=w(JDDDDDDDD+ZּIOUW(^޽["""""""""喚Vc{kMJDDDDDDDD+Z DDDDDDDDk)JDDDDDDDDͼ敩+UY,W""""""""R J`)*u4E'""""""""U/y%""""""""^Kᕈx-W""""""""^҂""""""""R%vQݺu+qF^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^ˢ.,'֝{uSs_ЦWv툯ڝSkHȈ#X lLVl`}8DDDDDD䲠Jj1Ǚ`))UV='9z`˜h~bάeHɬs:I9FLL6elhV>$""""""4mPj1Ǚ2sNWJIMg99~r1gն<*v~9|ybάEDDDDDD׌:թ ד1vu~zoon"⌢݄0O{;Kou )m{e>t 4Tֈlcg΂%s3⦡kHn|Y"ea?nlǙ|9g:*Zdr,X^B3^+ 8.4OmL(be=;sS;,{uÓ{l%?SYi+r qGI3iٗ`xo5PDDDDDDF^y+|L)*k)+7 > ɬZJp:I=O,m𧼶{WgpPK"ڿ#c7Zh35tur%16iߟڕu툛UdĕQx 2glct:rg& ;x0iVNxAٹ2m2E/lW1hOʬ}_R~v~9숛ODDDDDD+ź/UUS,ps֯:'IDM} G+}Ka"#{ټo?kքǙĆnj)%Vm@&lcLҰE"Xi%2qMWfZ7OH<[wMP㱴4F [iP+Zi8E\z oZC}߭~Hqr9s/p"""""""G78e{Y>nmۙU}~*MNBh9o\8V4Ѿn3k x8='}syʿ26!uNZm?ㅫ^&̋?s>^>0+eU5lvzrٱdInЉ!}l8jn^]~ӱv#73Gu"~tBa35oLSL5Ǟ{}iy,y9*x.9NgyX8ޖFde,!˴ `]|*t7uЪtzOw,'G_bFu iGƇظ󞇈ʨՀ KkTCS9YD߫n!ΰaቂm-X縊aV[%kںƅoq{iHf; *t6B#ÕMR&l _/dd.}LR]fBlfUda/en Aui|ɢ# K%>2a ̿ԡXbEtfpOЏ,Hϟ:͆%[ѿ`k8)939@Euhۢ HZ + qb/ȵu%]+,V[3ۛgˏ|voϬpZz3eǒtׇۯ58{^\JҶbR[ڜ%3i~t=#Gcc m? ؏$C:nf3@׎e!3c="&&+ٌknl)_眇7WY<2TS,o أWo/UNRWM厓|-t^+m'Ι29Vh+`omYŊ~\PuXjf {e׎urjTVn3kS___K/qb7hE#8WvXn'\RS=&Lcf´>˙=WXNrϡ͟n'[PDDDDDDZr_ ֺ>:gcy,(o"⦩㜰ԔW щ%Q6_ӿ19Wּ8fX1s7w.}Tof\E * +OfoNAIN( (%qL9~n3_ߒf flǿն/l`} WU kH0B/0ۆ B}/0+U- a#_= u(7i!Vڜ\wO>χr ͷ>AO z%pI*tlRhWni +,S$ خ&^ه>AˋLܱj)P%'[mZ4 I`i#Rpp-n3/XY~LO}W؎Y~W+1vب\& nZ57`ܘMi;x z^(sMתM*Φ|^C0EԡNHc\~8Q9E6=ҷ2[񩃶+Y9>u0~xWߧeҢY8O;[we_aO*)fQthۂ+v<s5ӏ{}ǎYD&!>#S+6mtke9:hɍdT/X(=Ŷaa"Egr}¡WwݽsnsuCF9WW?gҗG~=~YbLs6M/glLfvۮڑ+SvD\' SYy)MtkFNY)>U)tN ڇoI),oe{qΤQ̬Mwk꾼:ZNDnȭ]޺ZAң'oz]Kl0:s +a`Yqf8똪=kOMej~xuz'm9Q);_,`f$?f`nq5?0OYNK;ޜ{N3qt*9?{~q^XwSl擧_x{ NL8(E>42>j?o/vӹ\73?xo~O˖PN-c+: kٚ}a̐41t'H:[-B)sg0'^d:#-wZh%3_ u!7ܴ @4{NXɑĺ۟.š-,9,t ?NjyDDDDDDDDW)l\uHB}(\YFaat6&=ؽ{Xd߮$Z>ۘ9ծ8*"+!'3{3]<#"""""""ժWx"E7DV!%b#Ӯ61{?& ;^^IIP(72"8uhh?Ӌ_GTT#b I/i#˙=f{n5`,bM`yqyׂޓUĹ=e:OLr*zQkX*2e0EoFDu^z0L"c6Vf5"""""""RmL5҂i|Rd)cV_UDNz ^yw:_ŊY5;u3\]߂+Z<'19' O'?J9S69h̠E6=_wTwT;hLv!P4\[0E `ӉkdMocf0)—Wq(z7[R&קʞ܌@l8p&qh^~SIݹgpUz βfch64dz^Ѭ9Ȓ E6PԪUz;)%.]Iԭ-JT=mmEFU8ɊȂ sYUPD2?{?D﷿.xf ֱ&vb)~7!}O jOﶾܟ]dO!~Y|^-˅o]ͪ"g5¸eצ}&&`oCwrKMaW|,==F\PYgWg3OhWytb[n%͵MAXk"l}ҹ,qeh'UKjSl$fެ,uc[-5lJ|۵ts6ëכzaMd"N ~ Ӯ}o|ht#Lp/a=|3Yd8xZnؘ1xc<>hĔgu -~ Oxf\ݻQ/~[lDw-_A%qE3WԽ#"""""""5jsQ+""""""""Rniiرt =.ּY>mPDDDDDDDD.k DDDDٻ($@h& EPQl\^_b\OŮXQD( H' @Iv~l:Cvg晙ss$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IRJuK1t%I$IG$'QdJB$zЈI[$I$IH[2V:',Q+*n4XASg:\$(9j IDAT˸iV1IerӾi!yT.&gU%-UJSrR!+ʠ$=e@9-dd+-R],w\<& mxe7Yƃʫfrce3ڧ6Ge%"NX1cV2,ʙ0zW$I$I[KR9iФE<1b9]1Ħ ? ?UqH5m1L㏖3 (6\z\SFؐ3b8crc|T5kRk*FBX]y&Sǭ 9`a -4飛`28|ٯ(Dž%<}J3=V1|I)q֘'6嵝#n.-QmA1͎Plo-/[9k5c3tDViNgzYY0eM9V)Ȉ )5jʈ]zIo*LYĪZiQ LϔG.r1nj_U~aj M3HTm م _UdO[ͧSfx%I$IqU1#eJ .DžēէJd^G8ԡ@ܻtW<9"`MJ\٧Y;Toq_U;d@Q}CW4w $F-Θ\VN;Tl~<ZW:Db zJ2Ro-Zy$I$IcA~’s0s7yr9hd 7[]|3j[E#smtW$I$I[/xi[Mǎunkִq"r>3mw~]K5,I$Icv g:EksRegH$I$ ~assFeUW[d]|',ً{$I$I ~Q!WUNݣC#*p$I$I QGR){Sx|L$I$mW*`U!sၡczJL1z:1ţȤode!o3=q{'moNS^=_Ҡ5g~BO /_”42À#8󠝨q#搫F@It'.~:n| bǜ=L@H&|w 5җ>IfkS%I$IJXjk]gggSre-P* k8a|:w%K!Rҩcx࿗rg˻KN~qI&ѷo_j׮ͻK͚5-Tq«p1_||]cJm}Z337vtXT NmR0{dOzEJ?gl45>">jsKԯjjVռ$I$I.Ԯ]Gְaڵf8o{@Wy,^_nZtZڍk gpyXcg[̬%qhEG3-zC>|f2R$I$Iڮ zE:t(=z:cǎCVZWSř󪸐F36]' c1VmnYnѺK_=I哵fRV=6OK$IܺVZx|G}GxWPũJM'֔ 6]gu+*RA]|~iǎ'<<7e ggt%kD?аaFnR=v#ď:Lɐ[r@ wrDu`^$I$5j/jǷH:.GsY e7qᭃyyQu5H⍪2 W_-{ κu*:+նXnY_'>O9nxe;pMg;{S fĹq̐cwY;8۸cl;{~ǰ@'t*rI$IBU33 ^N+nNYDCHNJ]rs֮v͠GO'jtF\2tjJݴ!S2Ѻ={}wd[~,mucI۞Gr#0U'N@vɊwtFti^AWTNxr[wԛnM _evkgj畜F-ҨW$I$I~%e!s`oI$I$nyLo ;E6 6XZZưsػZ3*I$Igզ ϛ~`mʫ0 8ϊ+I$I?AJ8W +I$I$$o˝Rⷢ}|[ƑJ`m*_f=άߕiv$I$I V]6~ɽ 'ʹ^]ekvJkC$I$IV jS8f$I$ikKjYYS8f$I$iksvI$I$%,+I$I$%,+I$I$%,+U8%"I$I߀Jpq~K?y{O\LM,t%I$IvJ݉/ӏ,e՚&- mm ;sX4HI%(-`QB-sVmHP ϐdpvZk1L[CE#2ִ7J.t8<>氊4VI6=9츙`*m/W^7p_Vpmg[*͛Ǐ?,J׌fO~MëJYڸ_Tv]]KxGtՋ3&3X@rl.CϽ)wy_ݶYF^Iկ^}Lt8NnKYN}N{d*߾ޫBjVQP ˿o=b)}ȽРv̚Gc vHΪuJ3qڃWy '/$ZZٟM̥uwi,k0]I%ؕېx:1+8L*؝>oxKW{{uf׫紓GOv~MI]+=2&^uv^rǸ  ea+Mᨽ8@QG;g2I]VD9/g$I-L[̝33w)--ej~.`䖕s(8*)&ෙ4s1V䱺4*c86Ths8q n$I$Ugʓ6'+gL$6/Uz[MǎӶy5mlxkKë 3_Sir>|DEg?͗e]H$I$*zxm& >v=)}in$I$w&I$I$%,+I$I$%,+I$I$% j'8:c&I$I ѩ`3I$I%mЍ `db-[H%6I/gjgH$I*aëi\Ѹ'W8F$I$I[N.I$Iex%I$Iex%I$I C0t$$I$I EEEW?ax%I$Ivq^I$I$)a^I$I$)a^I$I$)a^I$I2p^7]Tx/_lͅ$Svcvx܉ r.pOg{^{$I$%֋yjIϮS>.4hx.-[zbJ·w`ʮ]]m`Lv܊(Z_؇;y qIs^$IN.= RrE![wMҤa?]i]ֿu.˟0eClUrbYɢr=3uHp`^r٤Q.9Q%p{ުX}ϥ-rKLQ5B*nɞg=yg~ ιew%/SDZ|zs&zOxn}9_47t ui5xWW}nK,\n!gE||<>fsJbg;,"g y<3asB*nL'0UI$IOԢ9XɨsoirܸR)eا(ƅor,8'Cۛ. CF~qp1?1;A@9bcFI?&`%Ӟ}rb$UˢY_0~+738} ] =3[ˏm=jΫF TZp%z~jN;'t|@McyswzTXj$:K@53xxfiH&IDٝSְd 1>m՛;TO))s+aؚ .ۣ* Cs^]sYCX;nf{ˠdϹUq~N5x#9"k%)$I$){rk]ٿa?J1Aqw\Y6nNWN?X# Ƃ炧mfg=_?ws⽟]c8I*!ɴ84>c mn֌/bk(@+ \Oؙ&}s~X0tHhAQ%:y3(OosZCn{бz_bL]uRPB匞X3c/dJ|rԜ g 3Yt"Z:QHZ|3jɤNc]kq۸[΀=Z?,^?% ?Q}sاۦcѨG޵=:ǒbYw%I$IEe6\T܈^iyqL 3ޛU {sD$xj}hC&FK}9"k;?Pښn>#GHД#noΙ]ǯsf^Q^J׽9SWƍ}ƍ+hw'23yb%%k6Z?ђn}h2ʘ>%(!VZލkJ6l5iְ 5TRyj֧fɱg}wCi .nrOm斅/͕Gox;k)tCtؿ#cgp`zM܁?$IDAR;4چ~{7\)SKC7-?ȼY, )h܂kD xjc5HL *N YTiفEwv~q7/h2릕yGy+/Ĺ3U\y&]Gj)S7{$K}FKiRA\{4 7T bHs7&0ft'>χ $H$It%躟ɄDi49O?ʤ3Yiqm;F`rKo,7^ѱX◣ݤy̎laHx63:RQy,N;5#gEtR7A 5iRhҚ2f2ei& Q8o!ߕ{p(L}.3(ЀT? $IXY=So}/%Q_7 nNq&ědYK˧jW=BҪraeztjDtA \F>P5\wsV;0 o{fPY@xݐiDs;+Eox9,dwѴᄡq&uWWۏ|#fE{QM2iDC OޏۙCb]}yQ F$P9N@6߼ϭٛhXz;Ӹxo>:;}*4OWoi)KݙޛS :gFY3Cb//,) ;g3g|4SRRB~~>g>Gls I$I0 ÐX,ƝW_(l$Ɉ./%F Ze;Cff&)))D"~-S^~>'Om:vv[^$I$/2s)Ĝo\^I$I^T^}s4K+ץ9pY4Dex%I$Ir%]NN#"v$I$I$I$I$I$I۱r-3غY7^J$ITTYQFm$lF @5NوK$I .]י7;%u'$I$i;H͛3iРvLJMMA 8`7oN$1ڈW$I$mg C"hV;ievPD$EHII!%%H$~ex%I$Iv+d0$ C;&i]UW2$I$i;j]G=fJ$IԺd]3fڠBWx!8zO[D I$I DTY3(I$Iex%I$Iex%I$IU!zmP$I$I J$I$I J$I$I J$I$I J$I$I J$I$I J$I$I J$I$I J$I$I J$I$I J$I$I J$I$I J$I$I k p>CN>ᏖUzq7>$I$Iv\yLx`W;?vi]+7˜+)*Qxtش4+?3 7 re9LQ2E!grV,p Oć{#bãy]Oi#yaLhvg\?mS>rexc Jd.봄Ŝuц8p7g'|oPvT>yes[TĞp8W~a3rt $.S.Q/GDg>řXv<E#a'v oߐKP~]͑xDDDDDDDDn/[8zm4=D0bb 3"|ًB,iFtҎCAkٓojO_ә만j\acq#yV|2>Go`5~m57/U+#2Hۦ =xex6r\P4u(K`r[|4Q=W~9MRd7OHaMq_H겞8,Au Co12B('yb 7|ۢ;4+9lǒ0aX| 3&oR~ds@ l[v;8O\\2 >%iz(&Laɩ7~ë1}Ywm:e7)fjж4CɪHDDDDDDD[9TkK2=qi;;x"=Z %DΊѧ[?T``DԒ.i0⥇_2OFѷϻ uJn]1ota~`E[W"|T^П ^FűmĤ`dCvx?ETi/]BW{Ơ1LڅN_@8:<_Jա.6x$I e`xOu;,~]g>SwұbV}ƏG Kvx wΆoaȧ~"""""""wuYaǨf0+o3ыyVTl?^7G.B 􋸆t->m\k_.7e?'+b0 p  gb1#a2(;!.YGOQ72L||KfORe{;i=rA^vOŮGwќǞ+xvyPBBǼ}l"L4)P,|D2{۠I&V(BV)Nb"s~(cƚ$dMtg+s?' _>?~#pyj֫y]ΕOpa-P򳣑ퟢmo6('o1d$txX?{zi> 3i_epfou(Ž'8kd"OF|1_Χ'?L2[]7_Yl=VP1 dKk)ߞ.Ll˟n SF2hFMJGj}ʭH+I1PZ2oЊE‘]цwlB){qGV1|d8Y-T]:\LB.FqӅII[5i_>և<%yiroZ^m&g@e?=p,9,j3E~?*at?֫9/$þx$(fwy'жGUL͚ Vӛi~]-->Zj/w.3Yq4DGGzvf4k}7vc⓭ Љ^Usn8﷥t՗FփXDi9#xI#@iujOb0(v}O˧5z2 Oa+x?r9AJقٛ; vG)Gsܹ&3x2H#|tׇb¼cq1VB(0tfԭS熟/^yPH6ˠRX̣ztQ|ж,uS/ɻRQ. kd~mXVzvr4t EJ&MKR_nbԌx<ܘjWK]6z5}};i@kz= 3~i%ЮE>N+{ֹ}ӤF6l){Y!&vl_"I!h^`F<Ns$UWfPG9uBS(TO!# ;c 1Ywȭ>D&`X̍Lμ^-s+~ۨmmO}Xd:t(lg1n'v<?sy="/`"obQ'mJ?$mJrdh: \M pj0zBK)_>ϸѰ -}0Qy;h~,|`N"G'ڬ绷?eq7`f`g%j6e ˉ09v8W@ ]mY;YɁx[G^EyeVQL\F6OҾr(gNwư1 Bt5Zp2~ ts̡գ2iҤ>4ilܹsU;nye;w?a1"6t\:b]9QnxכWÇJطl׆:]V,c5|R7=yWxD&Q5J7•3TFUCM? _nϼ\gVPe o۞¡_)/Ay>1ʒpqaBM`P$j+͒0KFh`,ٺfX˲ (>~r&8ZuࣶE12rk 0 +\!GʇXȽukWf$A՜ci!R-Ck\V$:3S);S0~uȓv |7e^Ç=ǰnlb$bs :, T*u"jxWX.|N]IÏ2]ͪ` |wmjVZouV~QۏP.|uVݺucƍҩS'oA֭ pks ݼZ{J .>9WE;ŮcOO޴OEJ1ëFkRq.6NC?e"gT]|ֱ&g D `/L~_&wFr|?W|uRr$M@L-A~s ҾᆵsUt֡ʭ5B>|td['04>ēC|"%5@s7gk>xP  %<9H)DFS7©Z7}wk46K8qRS7sN92L+s #<'5m7RBb38,Nq$$|>o”=lڗGfh ׬˳%|1̣<biIL1FqYH RdX`@X63E`Z;v,O< $%%ӼysƎŢQ{:Jy3#ZBE'AAe cE)K|VțݒKJ\߷ Ǘ߆3a'wa5 syq/UwI?w#?X˂{8 9x 5G'h3 ݕ"""""^,a(zBJF|ع..wgO$z'AFͼ)-^.C濾xɗqܠ˿; dθ$*iG: m #kdVn"؞8 Ոyc^" :i}t fF+/:ϺRw.E#1Ax8zDں"=:5UǏ?CJ`1_y}p^;As>C9r!΀B]9?sINAϝ冟Νd ڴ~:M,7odF\>XӬۛ1D,C6SвeKZlĉl*̝yF9P^YZVGnO3c%lՀt$gjʴy373kk^.?g9W pWd'ƕb):9lӕBqĎ( 8~8LY5qPU+]3W E0l]&7X8sþm3&2jk"c/֦t8 Ux4CLڗHіM)AeLXq߿ܕ D>DΚĀ9;I,A=i-9HR qǼvwlƗ=8+6泷ثv˷R ~;oZ >Bi ]M41n#Sۻot:% D=ۗ~I+9u/.zdܟ$""""r2MElL O=3'ߖu-bgN 6/_#!<:?]d] ?Z?дEk&|?Ll6 㟇U_qSdʔ , -[nzrRDPr+ G2ĭˤUY(IY{\*MH޹?m'΀LUIܔ-(FXqEjHܽ.`S-SAD&W,j;ܝο<WhjջkkCVYTV DDDDDD21޼^d`~~9zL]/ߓr+ 0 BXl0* 28'L {Eр""""""faúk֮g*QzXmV"W""""""bnSjeN'gINNQqDe>>gƃkSjev;:]JDDDDD$n)5kDPBYRRRpݘ"jp@PL: DDDDDD2,Պ/V@.7Qx%/@5pWyuk~KLưЍ-""""""rGW&ȝnlyΝK|fV^hF,ǰonYSVAgD+YH}{jdM/u㉈͹ëiHGM+.PݟÛkhvG0q#Gt{lL*} _J4XVE[}_>^}?b?B]Yz2y)İw(LI˗_m>dO%ɼaK71Vm>C\z,ɩrzƘL^x(mmS[`=#y"i<Oc͑!RzVzK7U1ԯ9uulY"qgg9 Ф 0~dy-ZW='>QgD#ݪ=g툟ؾy&,H';L+1F8ڽ\3E6vtBټo=KxO¢x&=[ct>r}L\8wش+{7%熉79T8`cj5(g}ce⳾(#7je(f_Ozѣ%~6ƾU*R-(N|ofuMhRF-/U,Rզg[p-^ub^֟ObHU")ȃU Kw9в2wP1cúEDDDDDDAtAl=R /Rt$w㚔LþƳ18]\Ňd%؁]B@1)W &nC5)D;ӅOǁlAZeY[Oc[}R'tEr` HW,b3?\0p4~&|Kwv YuVDu^ IDATrظ?>O >$(X!$\eyyƅY9Fw=Z"7̵'2ȝXX;Op&n4tݧGE h.&$N (“-52/3TolX3~{M88Wߌǥxb`H'.ޗ: +M8VLdJޟңczh{=mбg)3w`Е8~Ub72hbqr SY9~dOz,aY2]$ J,N#,01s/p^n>OĥKYEjyHO yG{ D[pGs05˻snsXn'ES)WEά}e?; S/K~|T<m\XᥩKrqz|DRVA `l2{u7܃W]θrC㙗':!{.+/4[Ι?T 6 ]ɄwOSʧs0hasV-?L`ye85iǛG2bޚj\,֏+ݵ_Ջ9X2uZOIПy|)ClZKV8 tSr֧iRVay=~ߺoEiPޟ9.L_D2,,Ey⭦43t17\@Pb1d*6gA_8ZDDDDDD^c4itMNzw|E\\<&rsTQ}̧{DwO^8[6n\ DDDDDDD\8WIlX,w#^Ll lr˔+Wʕ\W mPDDDDDDDDn DDDDDDDDkT/9co|O ȿA-DDDDDDDDk)JDDDDDDDD+Z DDDDDDDDk)JDDDDDDDD+Z DDDDDDDDk۸v3~ɉ$&$LW'wxnZ>ւU* sOZr_{+=[N{25mάui\ N?3+"""""""we׻'+u2m""""""""^Rx%""""""""^Kᕈx-W""""""""^Rxxk?̞#y""""""""l*Si^I*Pxd8kPADDDDDDDD >88S">2'd'sbtEx mS^zncW\!"""""""E2t+[v&xKO(]U2":2H jV1JDDDDDDDěhvB`*QxXN\""""""""^C:3 B~*`M9.s\7=xWW8t({UngFXfJ!"""""")=Ǐb 4H],܆o~!$h M7}sM>x,EM?=_.t~~tj%""""""4x%KKxBDDDDDD$Sxu\" >je r1lޏ'Dz#0B\:͑d*dbYrP6Ӥz$Uxp21]1_/`g+`I $́?>NW`!LʅɆ  p %Z0`bHw)CTlU phbY=z KsHZ=84Rkp/peKXXs%76gEu|3+)E3~%,G_N/k ~4s-ds*.̔.J_{AZDNtXB!Pc^l@ڥ XkѡL gMcOi؉NİM7?vŸI;^]z馎o ˾tөZ=3G3jeJhN2wnǦTʤq>%.Qs f0g_e S1hE)tKO>|Ϩ рgkdn2/Eq^+Ħ.bMb騑ޏ;ue:EWSxu;Yӊxu:dܬ=Tٜ n`Ib=f'9zգH< ]:/3wyI+'M[)c}yڔM7?t60n`' Kl3w|ΧS1{%mJKGY>k '.C^"Yȡ 7(J>᳙T,+E&KxvzerBz\{ehaFw<\rIrdNvq;龟4!/sv*>wdaW'we2#*vmGx#}7[cnz珝&t  8wD[r'{H-ܭ^˒?ūՋ`lg3s:_ o_O|p 3cΔhonہKR,A̡me+DžL~3rR<%/wockֹüu$ߦfBjH~ͬXkNDDDDDDn_fMk-'P^3yҥ減U=d-T:^|&:U9՟q)zS|L IrZpe1c8w*D3l;E8`˙u'ħ0BKC&X۹?\Βɢma4Px//jYP5<1Đ/3SsB_nKF$!8fBBEкFs29[Lj5 ,#|#5] YOëw[D'uf388/\ylrU7F;;dZ ^H(""""""Is&ms$00͆bj˖-7Lr\ʕy;.Vj'sqRrV0 e;L#Z>ɑ(KDDDDDD[({G·֦Q$qbFڍf4to/WQxgόoJ /jylzBC,*IzG1""""""")E ᛟg2~馽>:0߮%ݴğaĴ),5ѯ7!""""""" z!KKxϔJүd=%gCxyw mIB=VuȑE X9a OEU'{(XV+h>/lI\pğ<-;ҫue :!|}4GN*u+KUb O&>;B@珲 qnTJd7s|t>ۋFSt>.mZ!#?{I3Yrwkœ5*e $p|0 ]l3v\f+g-dq C;Yyw/"֓5 )Q,5N7~(xWD[>OLYhNV6N@\W$*"""""""b[-\AV:Vī]0ⱖ`ɋQXDyQ>t5!kr(M.u)n?5W#yW>s; P|Do`lpТ UYޅ pe0c7ޝX1 3c2ceV$iEҢE6wIZP*%^HRRPcgakS^ã{9uG]u +ѹ">&:y%I$I9ëh nB_69ڼj/?T|4dm`ɲ_Np|sLj{=Eb12O/h߯-D.Y9abӰ蘕H灧Bv6N$I$ITz'l&Libu\K*4dCF6ĔzkU(ɶ0g&{SDv&Tߓ]ǔ/L^}Z*Ncͺ-P$ի$/UF5,e/I$I*vj(V y 7sNiu9cK"fLѡO.!lM-/eԴ\ԩg/Slijg?Y_^ {C2'<ڇa9 *npZą{-E0CSﺂgl$I$Iu 5 '˶›y-ږl˦,bU,sjvoryW߆ !g[*˾8 ׸<ܡ!^75$I$o3:v]r'xùXBdL|~uÚLoI$IEX(95h^-y..I$I:G^选6Nb!$I$Ifxu)xC8*b qDdldK U (%BdnN##V$I$8mØ8iwM./ɕo(dwK$I`x7m~2A튳cQT;<"oۙ1q\S^,ˍUo~'wK^$I$IA'Sᬓϭ̵}ܺK$I`xuEWմ<,ĸ/op:}:VKP`2f ? `˹4,[m[XHzbk &NWpGfT-CeLؗ'o$?Ts^E4hަ.k<\;߸Svoˀ]#Ȇ JiɆT6͓GpS} } }MD`:{66};^'7ݯT˹64*"mw $r8a,VĊ1l<޻GvĂũd>/57g5YuǕcs95GLĩ}/$I$?iS 87g6@DKEe˴ZڠmumL樫n h੷&4 w9ۏ~=Nfx-_R"X/OH=VgC^Oby(LdR>2,"w'Z6oI/6(i<5^ dbP8\N6PpT?5as~^zn<qNgC\yZ떫Tgm{&]R s˴콶n҉\<ի5á}kҋ g5u*r pbj&G'<ۗH$It8q-\Rtwކ(5MLx }%X5pTlfh"WjJڠit|#f]9,.oȀvP:ヌKwe-f}ysSޞB` |^N}?^qؕ; pyRl>QS3e>/L\\գho_I{nC˄wl4^x#V$Y) <wy"Ʊm0Q[+QeЬZ!*}ba̟GH$I _P! [Y:& ëR ň/|.k $d}+C'QҖt:\/_XKheYYY6ܲ@8oO+aeʮs]*,PX/JF2v%:zFQ[&=O~sgQY?nW߬o`g;֭aaRRH=$I$I%WY(mY@,eEN-JɄ=ϯN:?/|+ OO[!w^u_L6ddCL)Wywo)1 22W[2"TLNL lںk~TIjկ@mx5NWAo! (T 112jI$I ^@1M8Dž,[kGu}i4˜Jrף́L[QntYMIɨCvv!r1aG>}5U(jSN? Փ(6jM\27P:.CJ$͂ W[E4NJ+Z2L&miZ C( -OJ;X3s&LU:[ɜIki@NGrIJqjsut'Ο}LK/WqD1zmҨPE:5 x]$I$I.ë Wߠ׶@ϲ|~Iw=WpW/dٺ|_l#"'UE9ECζT;1i0w.-9圚d]|"vs\4dNxFz,ќV6u`k>~XXClu?ij.w=;sw 9~÷^wQK<}׷ 0x0_ȇꯈ?`O7>?/?B;%,ؔbp~&FI$IMۇs,_ E 瓛KFvJ$$%ocԙЏM1p?}UXxM}b?L$I$Lo_+3U6U=8"##8אYyFЬQ{R# *yٽ^zu}2kZS)b{xQL|RjK^HvOGKu_ "m׎Mi[|z>ZErbXR$I$\o_78?oC?}'~ WtIlx;6godfn08Z 2aɛ(ܶ ]ϸ˿3qM٩&MrF߱+ f⹁Yvsʋ}sd^VmNL"uUU:HQJ ;Z$I$ n26@/p6j\܁&V0y8D3s%+mhK:0c!^~כHWD^T41jtڜ_, v$I$I^diqs7N蟧@RޞՆyS6o;3  IDAT{w;& (v}b-;Β$I$I:׼:vZ֠܏x{I\4YnRl8376o K#ȚUtJ +bI)LjUP[Β$I$I:ëUp6Ct=g|"C|[A\$'?T6k-օ+UTt)n&ym<ޡ&gsy%I$I}WH|^㮼koDQ_`Dkn=#_AlCgM?U%7\тu1@_GcrӨQ#5;jcU*Wt$I$IJ$I$Iex%I$IOW91QL37 I$I$:Z^~jqg!I$I *D&-aڴd҈p\w$I$IR8OC&bH$I$ڒJԬ"CD$I$) Ur"[_cpk׾$I$I ;Åm*3w, wXI$I0r$b1|1/ՂH$I$0QdX I$I1%4d^I$I$z`NLcn~:Ņ`,&!I$I *2k#{#YjaI$IOW!2ٴl $I$I5$I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I:,ëB$I$I:ia^O,kJ$ICƯUdz;ڳ$I$ckexռeszݛk8N$I$ZX׮A{Ӽes D49=,I$It%I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$V%$I$IҁШQ܆#$I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXÄa{B$I$@8svk%I$IB! PW{ª0%㼛$I$I]̡:p_]*C~7$I$IҁHx @xtAI$I&?lx%I$I$W$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXEOᦳfPvν2ΪVޗ$I$I fPvi+0/x-SB$I$IvXW9[is(gWٹ"5xa+|ա"T>n#j 0sW17*x\Ѭ?I$I DŇeؼ\t/nHwos#8xOwV末{p%MH w*KB@tԮ"~#cO^]hʏCٙ&ex.frk `QG-.5~Qb eO8u.,e; hBz-ars'zO.W{Ծ1F4 3g[0y* eZD9wP$I$fͫNѵ\~@ Cv(U"1*DZ+k++n}1^={P&vX;Z1?Ĕ.MJթY(D\R~ڼyEȊCdx{ّAz^ń95H$I$QBCc{$~|u&5ryu5(Υ/Q$<fMN`s㹮}edrJ9 [6Rw[?YU60v ) '&`Ȥ yApbE}>I;ЉS|S<߫?G ZQ7*֒*B5H$I$Xbuu_k8\- c(d;B䷸1oxI*Dj͸⚫W\VpG$>,Mu %^d$ $$˹#iͩpǽx>}yˍHbu}17%j$I$I(Ծ}pN^˖h~|rrrHOOd,^t涺n$I$I=׼"EEDām=U*Wyc$I$I ,+I$I$V%rZ\;$I$I#$I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$)"̓B!u9#$I$IADDQڕ^EMHw$I$I~ ë[@"BD\I$I$wg/SC9$I$I e0TJ$I$@9smP$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXWnr79C$Id wqv ;nz Y?)"ç:3_-a +A&sޥ_N: }e7Q)V\Ѕ8(^K=KUccRs>˹czΕPI6}*;4wn_Syk:D:L:\~ K}P$hT%ƔU,]]]C8cu_Q8.> i+2g7uB=6-z%Q$OPxSKfe)׈n}J]}(IPqGGZprXW1*LkoBz167'Uؖ̄o2%&B|=OF lx8}_)uٜx?"k- z_-aeN$ U+9j!07d>g \S!ET pK |o+s R}2uBlO82M@ O]߼S/~ƏkBM_w% G8tN? Klg*#J*-5%c$Őpjw4M^Տ;^(^{hȫJDn'3q p\si4 97fLjQLO+@©y&I$[]\;z% XVz~:0|z ]uMKjd^n*M,{w/Ų 1~ ԉr@t0sb9iaTmէUBA8T#o~:'^w=}ϱBd2o@pSw DNtKdoggp-@#g d>fNӸ{E,KG`tj>k&,r=yᡌHBT#~yQD)?qCwӳAǼL9Eh[Ga06$+ c]Oƒh|w]ݘ''P8ǧP+8bG2<9N$I: R^}Oʵs N]̸o&leCOh_דk"bzy*CӣU 6|*w0,+ȫ-TQ~LQJNb}KwZ'w6UPt=vgLV }wRP( -UTvoWQgټ;#VyI L,Ŋb۷oggS4R\gW3a%ɁU,IM1]FMeV^!ۅcO*MUY?K8E|sfS8b,4cČOX0s=.G\r^RaX>1ʝDt%DULGrݯ+y<6Sj/ItoFG єzl>ۼ=*Di>t +֔l A\hyrܜZ''l=%$XO[u!Z}OȕSr*CPt&DRήřáT*U y 1eO!`U0PLRn'? l&*{>ú^0 K,/xx"_'f&&gq=0( @D4^c\_3Lv/Am{wĦ42evKBh"r_jVqڍ#& 9Ȕ$I7{VN8I Ҳ~<|y,}b dW9(89Hg,IĦul wE6nF&[fU} IdѿΔ GUc |:?ՑaȮt<IO',^0/N瓹PrJaUv(A) bnΦPq6@8:gTʤjऊ sF;},]S$鐳xSν&.mZcw0oU^mqRپrU^LM]{59yi6'^-Ak~'T$|ܿ?_tu4E;%IeIs`tYJn8ZtDYð5Tw w^CgsNf~f>Փ~Ʋ#Ծ}pN^˖h~|rssN䑤6'k1oeBPvwI4۽d& ;߮ uG 5i|h]qlּ<1u)qy\c6Pr\Ykf+j v\n KxI5/],Agv$I s`fP'kG$ԡ^?Hc7wa>ۗ[eBV;Jgnl-a|3^n r-N9LStH(3U6U=8"##8nZz޷YlW\$/j3J$IP%I$IX3Vd$I$)y%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXE-^lJ$ICRU-^"dI$I$%I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IX@4hV\͎L "It)K ؂H:(y%`?,Xlp%Itڑɒ`?; "0tЌyoE$I] ,g[[/bh0-s医ykK7t+e٢l \N4MؕeA~ȴ5ŗWЧC5bv=ˆX1 uiwUtkP;F֤$IGBu|z hبОb=w>.[LJr\X*U&ukP!0 fp%򢶥S8.u2SFc.X2??/JMT<2GwG8E:`[$P^̹ŗdGH$Iҿ)jE2 ԡyX7z2{K$=: odސ2tnWd4e#+Q]^t=dd*tg'bJa^k\`Wl+k ,y/ẅSxk ÌLJp*WRZyV/]Gvb%(e| lZ˪ԯY?0H=N"r~8UdVDVR)MR҄Xς5;ޞ֦:U\P$cTٽNVVSb'k1WeJa^M|ͤD>kWq+KFF/ؒAF\Q S֖--$I$;vbRٕ[pVT>,-D_mIT+ZN%kX]uCD]4L j ~IM^æĪT r%[r1&1z= JG t) vL]/rCЫi_~]{贵dY9-e*pyәI|Ϗ煪Ј>AϾmf*ȑg] 7>΢1*8~텒P\uᩴVBY[IS^8kߓA=Z,l7B"}1̃ĦWNuƕ}Vro8H&^bvLWCw"DQ?:tJL`\9hEEN".pI:"㆏CGgr06k8"?+Ww77Vy,#϶P@CZ6gؽ2;*DZ;]'MXƱ3gߦpA p\r"YՊr;e;uRsx啈l= >yAf';))7)ŭ#[l&r5\(^xcÿ. %I;NiuѕzѦΜ46~ 2DYȋK|AG1W4!Nrشh>Jpo֋{熣I_-eΖ*0z];[۠evAK'1< _[pl^?$Ñ$6jŵvwv%.?-"|wQ/bLHb6bފp,C9e3par?˜9 lͰ=3闖^'jУdkK1c]]At5CIn>{+bJ*zNDDDDDgQ D&2 wyQ>'18;r ;qcw'V5c2uCxq,>xh2#֣Y~/ŤrunAj.tح!.ƓS: x_~3|ҏiюYz/>{B*Ԏ!p.:aa'Qav;N(.7͂)pq c&VXU k4N–bުM-12w4nvGk={9餬a;M}i#.<\fDwť7^7wkg:̓7\:f /ȤDSF4'yvBg| 8bwyVԵyNDDDDDW"R#f>-Ћhu3us*Y1 iO1amPz&:M䁋\^MrpA4N[3_f]~6omE_W|3&rܻr_#㖿Ǣ9ر|`/ebGVlʱ܎n[l7-JڴCmc;H7tq'h:73Gglti 7uOudo"/:z;GNdžHF_qF]:Gb*&53zw0m6r豿zN1@DDDDDwjy%"5Vm L{;6.Ƶp6S;g[[4N9!;2^q,L* om>Y.GV ;>^`͠<3r` GPf<ǟtc5WwJ ;SI:ʙ6fU-SO3(q},FÆ5Ǎڴ1/W,acCNn 3WMHسva8¡vh!ejՀ#8yUQՐH?c]nb-"p)4?dpQ `;9Qp%""""򯠖W"R3oN6, b{=2U1EJ*[+$$p{_Z+U4 74:7L)8.ƇRH2LJ?{ ;[ӱCOH#F>-\OaW.Qywى' ƮZǻr]sONjopgt vawaC[ ke,bvbVhi3(IN"0)oՃ>BVD)"&6n=V uErMdHr=+k%Bp;'Țn:pu„Y1'D΋;啈8= /2a{0?r};l_ʌr! *e9*<>F'na.=ݥʹyKIJ:GȔ׮Kh'.٧LYu,~qs]_RIIN |p>| z6k9 TsɉgmV+˹ԩKJDj s<dU DD~l؎cj1(2䯹f)Pmo-#Eiu7dKL›ciX/=+83nbw94?+wy w"C jIᕈhKYMEpazp{Z~CZDZĻ?&e}9>fp'ϧpm]9s6fa;0<ӵ6èǾ%M칷;e1[XM]Gsۍij`lz<zv*ww "]6;]o"v+]_\3OiP\w{ :03XrL^Mk O"E|^53SAQj&`\^gⳋ)]y 7؟r6,╅kّ~W?˕7^D/? .?pϸXx s/-װ'ЭijBǓJ}8'4$&MX""""rӘW"RsoP{xwY\SnofoRy/{w6L壏rJyZ~K>26}h9r+P؝ M2vrX_e8t5wރ=X;pBl*5q)ٚ疲%Lb؝v~\Ϧl:Xʕ]5=&[؛mPz&yij zgq>bW_rJp} wv7z$&4>8ZGS8j@i10`jyY;oɝ]kyX܏>mΕ.gm#/5}tmu]G~~>SN7`̙1ӧP""""JDj O5?e8'<۳eQ|Ӛ;2k{yW멯zɓHv4jpƵ١|Z~ؾ}q*f3+wuOLlgY=,X%\w #X`...*k϶"RcKawtoBY@JK&P9pÀZQ% ( *ozM՟ߺR'Iӎ+=wˏIgW`lƘQ4 uÑG2Q8ٿ/ǽD6hXu g{0tËF |8ݙή4 mN᧟cɼeml5i<渒|2G&L( IDAT:K¨O3q w WÖ ÈćKw4/dtu,WBI5s[啈X1uʢ;xntK*dҗ~WfѢ8HknfU1 ?LKY:-3}pYW1 _;Kh8jޘV\u]Z)d2 >1aAnl\%4=vu\)۷2Vn5эH^WP՝g%}9ħ^g:fmsy}8: {Fغ^ w _#~gl2k -1t!:t(79sъ N'E\6t&DSit:)'ܵ/Yw0ov{~x~B8!#"?Y9ԯj0Vw%'b6bU Q{!""""5+9 èlY?GLv #7Ɏ7H EZX]ReJ("ZOBHJD9łfcDӁ8Nܷ BSn.VKh ͆Ţ""""Rs)sDw$͆g/.j> {p8(//4MIߏ...l6j׮g/l6HJD njaqqó6JH9RX]ll6\\mPDDDDj6W"R-̦iV(oC`Dz(<ĺ]3fۅ}ݞ  e.s|/[O3iRwЮ' 4ݾ}\ R;>ޏ';񚈈HMJDLa 7 LSdF2& ӆj;g~#=-UJs߶LZvC34XsppZᕋaU6ηHM6n3D-`/O^uYl>F& B~:y=lw,#44˘S9NFpftBn͛ğe<=Ŵz-Nlkg˼i']w5|4W1hnUӎ}k#5FÝ qLܑ@,+}\ Ôo>rz0y V,?Ao:X|o15/GR w/-cf[`nR"1VüGs XR pkmsZm"{W<,]iL[|+vtgn28ZaO1^ޟB恉s)jw8  r #3[a41xNv/885VՆ][2^ͣAqi۷yÙH ѩh_9>=eSqmmҘhj>'nww0SzNR ;USBt < ~F]Mp͙Ϩw0||$c+b`Oi`-+evzM{!.7{[z 1x\Fgy&&?D_* šr?eo"l󷔆wcs!{=?ope^>pp\_s9|С Sfss@MBo^YKs;,b73ꯚIX{S.""""""gJDM hOINhb:!F& kPԪi%!hm5c+|:&xv߳Kx9$Ӟ޸/c:잋}#3j3yH}uqy?`q= ֲLܯ 0"/i AAoSk,?IKʷ}},`Bۈ&VRiGבּICl;s#Irp!<ħvng1dOk1J.5I> !L#42vMa,̿YTvRp%""""")W"Rm6ױ|CNj}<#߹#Kժ~vb~Y2{|:m `};X<9eiY?wA>g4&t<; &3թ]W,Sr#<5bndϞc.ZUPDDDDDZ@DKYDK]^|8,ObBáeAi끈bp ԆA[YYX@^ ]Nw36aq% F[rx5eWdof.╜6`G /ߥi k*oM&papJnO: A ab X?B:V2ݼ,'ZK<:!{W@V 8YsTyٕu-OIw Υ ]"""""S+6ƿgp[/j>s폅Y8o\A k11^Y>4ʳ~uM#V"KOz1'cYn51B5JB̜y[qxHjr-v>K-UB0$5g@k+X60ɋ/"/{jK7gU 1Gr , 7moǟ/$ /|Fxh۪m;`2&yuk5>m_;\3&6-Vœ6|/x SoOEM?3wp{=_pF\X>ċ6s'chou#am&n~erxx]"""""1j:M%&?.oIaap$ ׫4 l;N;1OXV,s//?O/۩S۠\6("RC6ju%"""""RE-DDDDDDDDRx%""""""""5+^HJDDDDDDDDj,W""""""""Rc)KᕈX DDDDDDDDRx%""""""""5U%mv~4JUw5`Х ""B-Dla3>, \/g}?lVADZ(j*>Hn`ƨY[ϻOfOſk;FϢ ]"ȿ s8+fի;d^2;l$4b-y{]͘aܤGxzu2e^D/驙*>_ 3S'1Y3gU[|T Y0?xwvp]˥xOmCDΕenhAWyuF~[x$28 |G_ǣW;R iH=*'x;>2SZs۴^ϡ"-{Ca@Щ7ø{ZA4wXd.y-EP`m]1""""""d#h=h=2ֳ8y $4wo1,ZscSoٙƦ2Ad0i24$H=E{̚*ӖeenyiEc)`O7=5NҜC ǢpbID6rM_ÜOKy@B~U3p,iy~}> ?H%f,Tb] ]iѵnuH%͟p?kA +s-'`^)7qo|KLO:/+Ev3/L1вntq4ӎw@(&8ݢ:qmz-hQl~~42z?x1M҈ut)c_;͆dHG+O#séYDDDDD4W"R)tx i?ދpOXcl#n"81zIƴ \=v\8Wm.uBw%L^/rk(+. '+v/9xcP߷6~N"=Ls;EgĪYdwEu͈_51Z^9rg):^8SYYx}ށœcY5Vh֗ۛ|q[\a? r׽ʹgאÆܤi;:60ĝ٘Wih5y<||[֖ϨMi5(zFCAzVW""""")ͱX_ݷIQunZp_5U{`'aKiÉpN\Udu|h9Xi3Ҩiif:4(M@,k .NHf_%8(yA*.ɑե.qu]} lawٿ)jZzY,x 1U]&O8-2~(,jݧ7||}MOBC;_׭e^H 犫ϼa,fv,~^H7CUAamFuiQ׮7.偻{]-l{K7}[24 nlJؽ+,)Y Ʒ ۉ! Dڌx """v""+6{tf3hDEDDD=%tïoN$I"ᕤPHUTTļlB^nőJY|B 7H>pz_Ȫ](J,9oHؒ_?ScŖ}ƦPI.7O":k ^+e),Ό&Myԍ xVZM8COFz,$I~JR>=Ùϩږc8+Me:0hЅWE !*__CSb*>c[?Ф\0'f l{9%[[Χi*>sG'w^qNyGo?f)-qsT\;W 7AbDog?%Ծ+&r&}i6E(djWc=jkψҖ^ǭmObù/ g˧+KU*;0 Pnd~k/Lrll ~ 8?~<}.1c|kޘ1cML0BI$W"Wa2uԲ:Mp[FN< dWn׷mF.i+ 7E,AҮ ۔#y7_<{ϣVw–㙓&ϵ<п>?Ӣ3Hu8e;DQ̙9kM;T;Q$ӛ\QnYξs W(a+YEYx֟Y`7pYYY 0^x;=z0p@ %I_+I8?.S҉os/B C%ւsl\e֩5OM]jVBV vShX+H UPH3$5AQR4&sr4k.W6'-9$/PzXvBuU0$VH2,,B=9r$[o%??<УGFIT%I`x%)b`| }7K3]0;)| {9k6t8٠;]}~~~GyIU{C?欘5d8QVP<[I2,_1e[x߹'aG}/::ѣGӧO @==z4H$IVRڸ|(wyFZx?uKYM(0+Rd_۟ǦRzƒvBlX2xܴU)HjNf8 ,HS >E@j5wٻv [ԬVC(^r >(o#](Z4GTx;sW,dɺ}Ia ^'PLL cǍwݛѣGߝ$I %*Wb $f`ev`4$;eɇ*ЫN&NȠu}`9 jEV&AkTdV.4} iz*#o&͹ԯef`۟cݟHlx7gMca.$&`*fGjn?:9ӅsW 1W]`[(im{ zo eRn% Mҧ-U}ǷښiYKn "?HW\lQn$I~)ly%)bvNDSyjB<ڻ ޛsyKcg&2- ^O8¹N֤w~6?GU;ptWG3\jw5/q6q Фl6^'[]G*q~1+s߻ƒ|*o?b.Ikz׍#1<6~ cQݬڴUt>կ=MYy{9-? ƹ;ߗGLRϺ^@^$IN@׮]ÅEa֯[ˎF Bdg琺v4O3!LaB30ݱ?ɺgL>fI[XvGx& Og妴_8AE 3 .z낮3xA> +޷?LL<Jι=6}cz‚\{\8bտ]6MUwt<q%Os XL( uPlwc, xH$Ib,Rנ=WUTLҋ6Sd-ZȌ[V\Juvpl2V`Za :KҤU|$Icx%r.[GíRxee!iOJ'?uq2A40o4Οb(R//Koqà ~”-5weܗ=g\BF(mz2.4 ~|(LwjD .O w]#kWyy P}8iGl+a.O~~]th\|7o ܣo2{}&)5iyM ny1>LI˗L|. ԧ^V3Iju\X;Li^ߐOJ9fuG_ĿUلc){K$I6(b_[dTs Ta΋ohw?9uΩ9l=s„c!X?gU +O!;n1wn7=ݨ24wb[A˄"L vbl-r۳hC~y&OA,{S2@uw%gC/2io1>Lgc_܏L^BNWp^LㅑOLb|M Wy:|~:_e{p=+yt1O0髨 <</I$G1T“k~]{H8: Jmy/YQ;w@ٞ2l^Ȝ0sg2|\ _-Ob߂,ޱ3^_?$4;sv~İ~Z6|d{?΂&J֯}|61Yp ߶̛L ga\/xI$I?-$xuő {Q{kL̫NT5ʒw__b3uv^ޟyrr -~櫴9|Z^ӁUG|& /Nx;SA;^|tGq5uZѡz4a^t {Mrǭeߧ̈i{KNjK~t6\ۉFK1Z\~U-Fy?Ew5t~@}:7+4 `Aͳ 6>nCt+\ɕгEԠ7r߇3آkz/yI$I.еkpaQJ]bqhqq1PR׎fiWy&$wq'1d\_Tgy_,-{%I$VW]R!*w:/jժjmP$I$IJ$I$I1$b<'>F J$I$I$I"$I$I"%I$It\J$I$Iտ SpW$I$I*?>^I$I$ opW$I$I*E?$+I$I$E0+I$I$EK 4-9]6gl& "I_$LWEhѺT*BUT*Θ#? $I 8xG;cT*rs%RޛYI$o'I?Hs[SPo5$I$I1jL'Цm{$I$I"Bjj g DMN"55ŪH$I$KMMlr@I˫C:w<$I$I:>Ùr=XCIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/body/image03.png000066400000000000000000002007331461403617600231110ustar00rootroot00000000000000PNG  IHDR" ksBITOtEXtSoftwareShutterc IDATx\S?79 ?($A ځB{wB Jl޲ [[kۚB5%BD$Is| (ڪT}=!|>OIsލA `n snJ 5~m˳<Hz۽+~F_ׯ73q+'ZO?J7w;;T >`(z_,麷(ި_ oUVZG,k]JkvU,)wGaC_c!"Q:?jKZ3 ebώ4f~aV$r4UMV/*pM%RV73]RZ6TZN1R,+_d˿'\XBK;]̏ߠ˛]TUOD>KW]wC O/U]>4jXnOb|3j[N',i[YAJcrb\TE'KVoKy JQq,2^:;*uhࣣDDh[UM</VF9"o7wZlsâ0o꘸Xܥθ5UX$"rf1]-Gcl^5rFJY#*55-JqgPvωt;{eADDDΣ 0;qlXU{x"5Mejg/)K۩,tԤtF"F"U7\D0 JIwMof%ŋ?_2'S)&| ^)dF0)]'}>w Dn'D<sj"e:;5N&SO0B"QۖWZf24hu8>W+ 5 qr8-s[ÉDNT* 9IՅ\4P-Um.bj g,eZ~(4so(~rS7Uj 6~jb"Wܜ:RP&d䧧+ r5Km(!Ib rJu6<YZm.DWkpgIT'1s܋8}m""Ċg.eER"TLkȒӕ ]"宮 }ƊuAmyS4,R&gDa"=?#Me);PlM&ɂ :7ZB8}wb6HP'fƞE\,cTIrb1jWzQ|R,L)Ʀ66.Ayɍ%V(j;yX(-X 44trrn_{}}1̇=7}æ-[:s9 &ktq Y;JB4b55.yoVN8TUV!/&V;~n}%i 9X"nC۫ۉڂ_==񞠵/DnhKIhWgų;WKww7U[.J\[KE8],ĉ9iKwf\TSSWzncU&Ēp͜JR02.dg $w%8Bp"##o˗/?3g݋!inJט8-K~̯}}w}]T;y`N`__u-ϾKe =3|$E4M1{S3'ĢKSEie)8 _oK*?óU>'_6_(Dvm=J1k:kV)١L3Zm3*/ҌZʹQw|_ӁJ2<<|…qggƄuxQ֨){fǭ %U&bERU:7hsgEzIU"o73boo簾&˵tRJ|ww?sm~tоwO w=~+&3IL5Wr(}ά`rv{Z9" 9aዜ7? p8finMM&V*%a)+3QTr wk 9F"ALZ~~RƎ53vE'nniД7ۈQTttLDV}EiI'QWJQN6F{42"Yg7c &%7'3!VrvsrWq?o[lz`[6  V"G*}O<a?3:p/U6 {[uK~ϝqX_{ޝ;?sUŗ%e]a5Y,DSV/q H#WЈji+ .;9>[RBnnѕ-gl6ȓE"7[=(MS$JXjWkM' s"N2sd!,gm);]0񵣣cj]tiTTxkAϿxآGU}'KĄgw?5.~q΢8{ذ̍W>6FY4JtU"5Ƣ;%*QZ0[.ҕGXٚ1qBbW~dI; jϯ\KC2=Ql%zM_crZ !`3RHQkkmTu~&KM^%Ei.%q+M8ڝʲӧ:;*ujtOL6j}akΓ>nߢ^hD_[et55-„d%C7Y媤Ju:1aKh5U3Nkjtzf3k#سyS[h㉷L$_qAb.mIIdY rMJz͆c\oG^.(<7ƈBLD̚U{|x[c:gU59K Xg$}Vjk={P"aG,z氙 5WARJР*I_Ss&'wߠk$d$pM5KNYJf1j&*"TюƊf\Gg=iff1ijM_Oek-0̧~u, s{F> "7n"oU8ie8(N.F MTJ^SiINj,DDu-Nb^XPg$BvFO\9Kɥܜ#OD<&nx~既qtWx0CE̠ԠgAӕ&ZDmpsa}Uf5+h3E[ FSQyJcelMK0Mrչ&se`T*,ma8bC&y \"ίI*# z/^qw}r}W/qWΔjJU5=#~DYƒBSXh/ C'71G칯&WH0؋Wئ+iQ*'LO>;y^ss {t-D3nls}8Wڂd'K$ᄏl6_';}D{<;| "LIra fMo~GQn*W~ߌ'w=M_P==sٙ<4v(OVExjVVu||Q@OG]'算KZ.-!ǘ}MFo÷6~O3ΞLeeץ}O՛Y/u:g$~G,)OI`2G^7G`Z+xr@l?X׫; M=y(ǻv ^bupÓXnOcy2:i Վ{Gâd,oGI%05Ldla3Ez>v'WܔopalZvhRgEXᮟUzN]e+5] }=Dd*ķFEpY:@x]RUIeZzvN-OόH]'b&m]U>O؇Fonb㺅[FnR}a% o~aԳeIZȁ&fnDHo`2wﴞٙ<{t?0H@N>Iigci ._YFి[ub\|ϓ;>~m}Oڬ$F#zL?]"on IDATt23t_Edސ-5xGi?uqˠsȸ29983-rf.}]\*PxF|i-f= ɣ=fZ r7{~.VG{+"!u~Kyyh"Dzv&]mOOV?W1^yύw(|my7{a ؇~CGDDQqw:k8AD3x#{gbç ,xvHQ=ʓ<-`זUD~v~i@ض`mZ -\=`'nij+^Tw'i[j_YO.zOs1l.$m௿sc $"*XHnts_6,ϼ{~sq<{|^h~s7q NFwZ'/ 6gaAADDW^wvhWwyG $%%MLLV@\!1it\"dB"88⹩IJ Iat~6\#VTcDDʼnT/SAv[>sro,#n| [nxuQܠ),n09xf$\tev::Z9\ϟ<])\R%I;Wg`ݓxco3>>qԿCCC+,V.4t&ODT&a/ ‰b⋯!bow36~죁ʪ Z131 nϲԿ.+b$8)CD"e^RxWYQC'Kqi\匰*(,ˍU߻?*'X,ܼΗlc=3Y96"/ƇpWa2<}?.rd拏N7T. _w u57F]Q["W}@|9ZMzȬgj /ZYMml7>~sع~L7(sז-;:3MǯYpTWWW֨)xCM%=ð<=46J|kKKK{{O8qVJt6ٙBBvs|W~jPS\QidyY ֶ2Mm5lܥQJXPѤˈZvg֟4f֤tmbR":H*WL.\Ϋ4L]z""`fF=z&837j(@$py&?'f54vsG8"͏m[55 5%Q'6>۾50kS@3iky=NlRn#pI `O~j!""etϙc-70UpÓK7(6ϚV|\uttttttqhhh```[[ ^crY+r\r8uqR+LVua(&'?KVVPlpXΉ%Ƙ*4 &NJ\&d7)[Y2TZN1R酛JubKJּfKW#&F͕d6̕|Ʃ|^C"UAQD)(m;\gJIq⑘RuNSӌ6%Lf192{)L"\EDD^n9@aE.W?zeW]IYRR]qZu^v7E}o`óC3Z4k3-v/O֩oĶpDslmM0֋ pיVZ;<<|)65Qҩ+1X,{wN-$e %uzl5:UYrHD"FavRUJky"*4Ѡ4[ejn춍k."2Դ'+F(^ }YY+*r*qm Fs*VFͦ+dec'9'no+݃U;D4~R9ѨQ?˻lu0ű!˹- LןN[xl+W-S:y"o+h2bd]D4ݳ%Vn|-@* yxSWi Y_\sr?-#Y鲘WvM}}ϕO⻈-&gԛZ&8yOL9aHP( HNknbŊ3g'7^c|jޕST*ʄtEAf:s}Sܬdb/UOɿ׮])JΒƝ+Jpjޜ'^|huʕ7n\+DDRh:%Z̔4Ԭ35j{4I r2xKKS1f~Ie2H$8:3},J29Cy Ym@$0.m{lG>ZwV3~`O&"?[6<;:ERZx""`Ro"TB=8`.}_n6Mi6ZYq"F/9ljt.EnQnbT,Q&f(Ȉ!"(3qRH,OU83Bk)A]/reZnJWE:%F*I͌iگ?"ya.w3UGYXut:_SQRYY;]$Q!>bud9Jg؈B⻿,&L5?rL壶.S*|_:oTfAek &Swʢ|\y}]jU__]'XQTT05:}%ޠ)(-N a9blqs 2D!B[:K )O. !钽ϼ mny%i 9X:BSM66O]YSx91](զxbQ~nviy۴%e5{u`t9_띱@;+dOqsg]FGy|ָev=S= §qwҤ4!X]O]r{MWinJWm~G_9ӟ*UZp9ρXe,qk11IBbq|BB򺻇Ϝi;ob/QQB/\'DE g}6ܠU&vmǙLÇOL|2+=`a0hcxES@]we0yP|̙NL|AUI&EXQi\(*1)sR2+ mⴲʼX" &3ļܬxLHvk[sE6:+1V&${gSFSg<7pD"lY2+#0D@DD\K<|yJf'- $uZS۾#Xu>MDODo'"q5[O_ ns1FFFfEnZ QIF8,j^c0#UYWl$ '"[]~jԹ$J,,)1UhL(V*QH_+5z 65O]+nNɮju^ķvg?MK#^xܯ×߿u?{:(jtFKkmD̜>xӷF~[0O{Z+h"/>y ],sCUlU:L\+t&ϻ,FRHUJj4l6rWHUo,Ɗ&Rho@^82k;Fρ!|h|.(|vW??wuצM?cᆾ-g5YJ!d\dhg#p\.eem';E"~]{lTMox6K24ΓWA+$ ;p4,u…III?n˞},?yZ0"e꾒{]t?Ɖ')56W\`Ç'O~'֭kӅm[̜Tw&o2Y ?bќL&vy/Yǻ$7*y`_`>7QT{Ay" _}}}IooXU^v\,Uf$:u:c)A]/reZnJ m*`Ge%ؗCVx3DDK{}'"sEDKY.H\0Ey10̗yfy͚5JC(uwwȵZtMr ;Ҧ++\rm&jgprm&LFq3Oh,)wd32w8&J} #+kmDD|kϋ>w'֡}GFEwx복D4ōs`xEFF_+VXfMPPɓ'>qv!M&Ӽ׉/*d5ō<4loooooG*-@ 7k4yR}WW@|^7UeTB:OJđP"YaK`j ♯G '"௞<?W}? ӷ{.Hs7~^SѠrwuŊzk@@cZ[[Q0sα|Gd6(-o'qHz/;:-\.WwwX&&_1xg]ZWi""JI4bnkiDg49lFD=Һ@)#9.?rʬrm.g%_RH` IDAT}a% o~atIUH|4~琍(ODD[j1׵ƻ~`*+]%c=QW=2NDL6.0ns߾gNS Jgkḣ쮶uP ~IvhhhH&ޠե+LXTJJgF1iTMN/αVK~:?PXJW+-U3+PPQmwVarُw҈}c,69$KO4,_'ZuMD:`w-Q9S4\_,Gfvٻ&|o&B cI( *bUm^*ծ?UVS|^߭ttjrjݭJ⍭ET  !d2$3yόgf6:Zp]aRGT}!=hHV%,߃Ic(r_z3p[#,kX)R / iBU gzH$3Jރ%46=2cRR8D99k2YM,a"} ;.щI!'lD>bw{<Ҝ Pwí||Y W=;wd/.2?Ήi=;!:h"%yA9h剈Z.Y*Dt~ &6R^u<; WŘ!#6W[r#FzXPc# or4Q`(Gˈ(HtkhHuD?mxf*fQ/^`CAzJ;'U3 O {v@]fY6!xԲR8Q#X֖#F0 s̙]-- +ҷX ''ai[ L#4WOq~CDs7g.=G?4IGvƷ=]n>״HDܸ9yͳ|WoYUEcwguoC|ә_Nj 3ȩ|WMqGLQԬb^Fb4=/**j>uԨ(TjZ;V__0 f;6F r_=· ~@|LW\Uf{?* #n:T緼}&mC~CMl_paD2iҤ0FS^^^XX1KVO4e毿ܹs8A?l?䓭v:s̤Iz=*}(z\Nt!!!yyyNҥKz~E[5׾;N{q\XX*} E+J˥T*.\r{aQN 1}* +>.]BאV+ VE֚ɓ'kDNwYT/**vX,yyyDV'O|鲲2TX|P0  +++  t'EH$I&i4ŽYG:tVy/ }~~~---%%%6p,VTTfp|Eh4 pլSN={ ;___~YJHHD"d B ۰JR(ZE[uKy;Z,<"z'bcc;l޼E;_}WW@|@|@|WɄ|PvJki'jJDq&y'Y3BN1mYjrrta}چcgŧoِޒjzkK s7m)xwJmY]3qa_UX>\+SG *H&Mh }Ӄ#""JM&V_\oJ⧌,[:B~fbf̰(kh|u ĞݦkˮZG{D#A&70㫟_KKKIIɈ#NH$EEETUU6h/_bԄlk|v\s75{d3rײEBdF[ )H}h4DȅkK %gg>eC1;1X_n"+-א1brfevb!˓vMN1Ll)\u~&+-\-?}e&.a|EuzEEEEE5qCh䖂wZ8IZ&t žEyL5YT33o2z IZ'gn\əlr掵)6|._lM|cFV]OH6/XZpɬ9Zr+R5^We7m[X;)/^@uW˄Z=3_|%\rbɖ9_lO2?@ƶYcCd/7O_XJDDGr Dd--H8}aV)~MvYثoڶE9ߜ8o]Xb'[-z}Jr'kq)6ef5UlQ|DzvGRl)p_d27|3 Xp|Bdh[hCuGG`5G1' *VP@DgnapF*xܧ]}-)>xľ6%탊o(<9%+)ܙ- W={S V[IQ窟C 9)8uދC yǿ `2ǛlX_j3{}nZʯZ.˩`׻Dz/ەpIsJ{j&eA+LNf B㬼Wլ]l fʲY d]QC ++7zAFVzU# "cW;b!}-73 #EAc8yJJJxq] C?%̖V|YZJXa 752JNr>>+{Igp!!!D&) V+BSSVMMM-//Z|y <[?H_*vk%ɝsB&mHTvX'Vʝz0}w  ,c&TE % ܆ɼcK~Š;ֶ=8KNI !ӧ$ɎxP33yMΪX=fu]>0f%[fp]gn)?|```[Œcŧo٠߾lշ╍]+YU(v ƝrXn׺W?vbIIIII J\*^tI!Cǟ:u ><󁁁o-K^^СCBCC%ISSh6KX9OgbM:IWW>3='m]>h+SZpܷA$I&i4BtBtҮܺum4{1{gsz*fIfچMK2y:馰=[Cg>V;=! 㤖G=#= 2@|??#F\;/_zIoo&""/f$E͘`tĐj9}(?OFd!_ cCeΪӛv戈"<׾L3vlJh:/vV=5)cԱ`=o׆S34-juֲYKD~5-~a߻?x=sǴ|IRϴmL?~ӳ 9z=ӎ'ȉ(%"ٿ҈GǾ:*k4\55VSzXr۟?>p2}[;["NZtr1fϞk.硟 u"EƏU7&L8[ॹ1QC|bTEd'"ԙu"%HDB-juUM4Z36\+ ՕW CEeOegٳ:V"?fD{_^3=# ?~4 #yD/y^HD^(IuL3ONΝh=[QyueĹVOs{H!''.k?x|xvDbG]cl撠CY\}ШW~!7/rLrgYyҶӗk56FL|iSS?{iͱׅw bX{ كs{l{+ѹo.^5U7/Wk}}$6G F>YɎ`ǣЭ`]O݃sl6J64 RROHTXQyٗ" ,eQ1m/cmT<4<1AQABKgX :]+u&; my:k]Gg^>K#Fw}R InD[-bU{=yI*6^[t9aPĨ$&'-jMMM'F0T9+9m1#U?VCDRvS!O{qBKC+Nx8]RVw~-{Z:_u4/3,R3ᩕOU?[Iܧ^iب'F]n\WD#&F*e2iەǪ[ЧyHЉࢰid2ڽZ|Y2gõ`!~I/ y1ʉ;4D O .&>B[Wp+pYT  H$2LPhZAJe}}}kkk\\V=zhoӋSWN8SN?m3칕eʊ|dH<}gcW!Rg٩ ;nNR6P%XO|5͟JzOeeeL(ֲݟlV)]ɕ*j8Va IDAT؂6zsHL{#T奔j:~W¿>Ekx?ŸJ;ɂ׽cOxgEΆ)xϫrm7q-v m>s ;9 p򋊊<󁁁o-K^^СC{1߀ᆆSN 6h[S3}*;k)Ɇjsum՛gW.7z}JܿxUE7{xLpen{[YtooV?>{9C<~?/\p…`'wze.T;aΣ< oX#*H{˓{JDUyч&uǺ;}KTz1_ ?YևYzp%WW@|@|4vy&V&"=Yf}xeԀG?ɷ3aqq:_DPWǣf%yxxÂsJ3~_2&O~e;=1iO?8“}9C#{/Ұg4oh[?f(E i5nV_ED 3.%"b /J1r3n)xH6T%$^[_8?ʷ[sӑ3y/U{V 0((׸z~ze"8nA7y6ROy5&m/%<\x%ijyoy^W7<QPl[CƄuvc9E3%_#Mq{rҠ ')j-B,)ɫ(msH) y#?^4r /zY?}iH欷 !A]%̩w^lr"6Qf-hڝnV't✌̥LD 6U5ɣFXi#}˧&ۦU[& N65"aVFÒu`=N;M̘;gvo?dSYZ{KqesmYa46ߞ cZMȻ1Z=N162ջ'ԏ2V?]eQdN$F`V gYQ~?nzS2Svڽ}p9aQ,67m. ~ 'kcIZ&=kرcdu3oW99Qn"ϩ/y M8[s)k2jH<*Yr!֞ Z\j{F&L\xx抬\UQ3CE.qƎ<^knYv%2l?lڂͻrw3SU>0rsU֓,~в͟|p?sΊ"<8dU5g7<щQ7}jDgц7NWf46e"ӯ{tT:i.3U9"Q%Cn KXw|ʕ+Z6..nkBTڪ!{HsxG_ OsXY!"ɻV8#DvbZN1aXˍ|xLz:K<1~bDmc}=Ͼ]dzؔY{M[fL]f xFNrUx||!/=\ )L^{K5k% #^>w=2Exn߽<"Hd2Bj 455Y,ɓ'8qaÇx/H'x]\S:D=HR=BNAnokg?]+'8g'枿~~'cKEmG=2qEuITx˩K}FӾ3]ařkVʩδ` ~KKnꈈygs+?Z)47*zɐw̗^9oVr 憺{=J/y*zt"ӟ-Xsmǘܼ;f_|p΍|SΘ\˪b¦ײfupӹˍ>ܿ9efsg~sd=&>lR|WԲSJ^yakϓ,ٱJެ|+TK ެ1t䏁_?bbI].d:yk[WJqܣZb=z|K?>iŒF-O0bU,jKL(Q9M1r~ )q?/g,8_9k ֣>jGQ;ނvOh3۷;rw!_(Y(f\r{z_oM|֠p$C\\bbbbZr/oRcE7|gEg"">4"..c/).*8lXo/ԣ>!&".ΠUt Qqq!2,JcYYYË=9HQ]3:*1n awk5Z? d/BllN;|M|ӟ{]?YSSꫯzY s6ਹ+aYuc[dXV)Lw($:nW^Q@|}֬Y]/;ޮ^ĉȐ$"*y;mǗƧoNeh٦eD$_U!"~ *j0eIzKb$ԴdyVRύ!Hl!xˆ{"""Y9 ss/x ߘl/|{){59x"KӗMO ꒂM[XNò'˪DG-J*R]NMVGhݕfMD= uU)R).7YBkaDDOdYcl[}ҔD.x/1q:9=0q:oy2%(ZGGYX,]gb{ږcUʫQ-q"U)$:u(:V)%esr{NEsۚEtDFt̶Ph jZRJcZCZtRI.MT*1s<1Qq,HΡ`Jrqmp)rt45hvbcZt:"mCKiUҮGd퐒9D-, m[\Q$aX(t a$y0xvo޼Gsss鍍툈eÇJ7HMM] &soL[eWbƯY}tyƦR6-s!*9wbkrJSSe7Y<)%(k+Ni[gY4=s>yMֲ/Y 1{r֬/OOMaH62=kO~Kdȧgde 5:?%jN+k*JΥdR,zyd4jn:nm39ee%hV*MFS%'2hVA]Tv_B$ǿ%Zm&T9x3Vi2+kx)1VDDQSi4*9ѬUm*51?oDSw>Z+k*M v@ư:1}oLDN*JDRJ;#CŘC\bbbUAT3e;~htzkL5NRksJ%ղs)(_&{mՇ]O"|2M5eJ#&2qN&Gd܌V՛@%hVqH΃ZjE[AGI۸J};!qH'ko̘1oZOeS{K-Vp˖"Jé\\b..{y\Rbk4-Д[hRpL+{cFj)ݛ{$$eQ\rt-ťY"f̑VxǦ{ŒA_qNRGGJW K) ѪDG ǻ^sR8v{^/oT+$Z5k9TU$ eHTHE&O*uNyL֪D[M÷sJ˴UQcM6?%QiUjns5Q (:.R*oJ_uJ\"]>WQi|ͪ:Z aCԗ۽v9DNR2JkE{N(n/I*m;nC]E ϰZ撪Usmջ[%:ڎp}Q*?~x?Vf0 9&PM!AH!7v=b[tگ\LD4tTxH5Ĩoa7:ow1xxGx>y 攪u,HL"K ]3mt||LDo}K$LVykK6TP+$DnE*.^T]FHވBjD"Hj\^I*]oQk#".6rNRQYjisթ.GcS^E HlתH-[Dh)NRj#msƭ7O6.BjfM_~VDj?A_fl4VH$Q]{MFKf IW{_{xNj^rue{q7l6n><1XfUn*rJ3-)ir;c/\V,OK߸, 4ߟO$]17MyKQ~)r;)X\<+5T.4pc{Z^GMTꢵR]N[S]\#*::N-.t]:R^vy5#Q]JoUjctR]9;TEERt4܈$ahmf5aZS cuѬI!N[UގY'8ۦWUr:]t|lޛo4Jǒr.3G)l4JE*op*Vr:6:%sXF>6oWձ1 ]! IDAT:rbS7JԵ~{fsSF'ogSؘD9nR<"]N8:6&NJr[:ɿk\Cı$.pM)!qHEEER{p|7!w}?.((wQ?'~gwˁX}_lDk׺*DE+jWa {^'?+W,YUAH]6IRtnDfN!Cײ,'K++ZZ-tTw`?jVG;m 8$_@ˁ0Wl>,o:glmEeiTgx#8$_| [eVx<o‹Qϭgy+vGш"= psG23%CD.TCQW wX| *Z[-M-GICZZ[Pv@|dMGS=0%EUS5%iטVnf?y͎i-MYˤ}cdm]½`ڸ7ϯǓm-g;}H$&M h4充"##{챐Afǽ^/]l%^Ѷ6a }ty}vK{4miSx~>up YCw:>{c_hw}/N;13g8p@R͘1رcV>ɵ*f&Ԕ?YNDD.zqaЕs%.ul?Ѳ?d5~۟~YN$å" zڬՏmDD$E_񋦄ɼE3߻Gb1kVMMFO5,?g~$Qik}SuY %ev-O^69!RE 99 fO|[ko'_'F,:{||⿾g6z[+> ^ *5..tV+JO>-鬮~yazWQBDkg=y2GS_UvTOаI\r k 3fV,d䋩?^fZ2͛Vn-]ZwJA,d,z_}f-Y9vg>$2EAQp: Nܻ:[+P Re( ""Kd0rjWr=wsysώu ^{^8Rı+/虗z(#]HW|Du}߾dH#] O"bE"B(Kw'2QZ]߄*AٯJv~ "׺4ӐbV\}e09}9BuS=Tt& !D%ֺΰ=Hg QQk/c!#F @M>*} ?3}!)))eee&_ٵB~[{a2!ɱ#'Hf2YyMzfɍΖT MuO^Hn#aeBa)R0;].{p|2a3V,ϯ90Y)Eq6g*T2-HD藕TpaOg?'0lqFsO0%Zv.snR"\75sh]B2Ry%k[(>:j%-u/g{n=csڹ9X.O'5U-u:y z5#."zDUV… wyq#hZ?|ӟ7i$t ?f!|?%*++?NZZ /߈#tEggg*:}tc!#Fb}u_9۷N:~xArdcCpiZi~IfEe/ny}HON085Kbb'8CU "ӊlLu"3sRUr( yo!<>B}c+jz5f,ԪFP֩*}X{B֋7b;~Akx_|!D"~^YI!-ũcM_]߄>"φZ K ("+˳.>!!g%K}׎9z5kCQQass'`xcRrpÚ366UnQu{*331(<_Ыte˨T  R222&Mjoo#XS^I-߶/;wn]]u+e_{ZtӦ'Go 8}S\Ů8Od3NMQB&!71^/!a+B?jE"?6,~'vC9orY1L?S,II>աFE&322>Shʍyɂn鱱q[lruT IRBB |\ x|JJ B>++o0Nl껌ISBI*҈UB$aB}s&)3--jU.v[N\|S_8KW9םo g1&U%v^ٷNg:mx|6qle' H M=uwddd+^ }(!{f̰|Q@@26gϟ?Y||ooosGD\GݾyYЬY&ORRRO>={\kkkW駟؅u~?!x?xL81--5$uլH*t Յ% 8!!%եGJ'+LnVUbg];Zu>;PPBON`Icџ̯ʪ&2I`+~6$uC%!2B{L+@Q$5u}îWY]J!51*g= :a K d qD"Ytttmv͓'TԩS_]F(,,tݺu,:uaÆ\JBBbޟgϞzܹ̆o޼)z<,%%uR))%Kxyy9r  ]pv"gsō;f!2{7PTOe /_,3ֶdG h ^ƘC+ #8l{N*B3U?U$2d_8l+͎s9t: 43h4yyyDPeddB,k#FUSS311)-O+~{Qu9I4ݑ6jth:1bx-c;/3N/|˒9uNyAyM[ U]G&FR8YYcE vT/Kd&/+uJ^CkF'e}!dee%Μ9S^^^XXbee%IL&hbɲV3^[_VoGQ Ɨ:VYm( TTȊXRlkssshU6_iZ_gΜ)))RTT)++,//6l)e2XGVͰ7{P˺zT W|.,% LqK b9b^{lexك;|"GG&lH+,`WmGB[5oBe=F|@KʾY37_+iBF^e3~A=z'"t_['/+]PZM>ەKo2rh -=zEee.I<r;[ĕ  `=*^8gw.w{ %QYې o Z4?ɖ{h=ūgH(|JMMT*;ssbvTx+"*++D"} 6YCCCJJ !ay#$7lXÄTUU~=n4lCC#BL&!x<^&Q -8/uԱBtMg웁R[E\3/ ?!^&…`(@HHHPߞbs;&:lu2ɩTlӸAv/+[ZUhO<ggVwvJ+m x#ih^u鰿et'ҝ7~>p{8_]d溱/\ 7^  }2$ep̨aeǂ%cg'0LPxѮ#P>-jnnae˖DguMLO BneQXpi g\H +ZZZS͢ c(o1`@A2 SAFerײ\L>bmdNϴrZGzZb 嵦Y&=e4@s5 :޵!d2EEEBB())uݪzkC]ZM|>"---Mפ-KGG{gii1v؃H7.FDMM禎Қ .mW 6CK $^?q`0 i?ʍɔg K/.-=_W`|xPzÑ )ec0k_6pj2?5_@@58RvHYYaPnYH츼::Y#лM=i$Æ >lP77WuuuOeXzyy!@ -ֻ;==]{{w9{eeLo+++D>MիW&&ƺrr4UUUT*Jr}.~A,--fH2$R)5CR;!ĭ/kx5s32MYFL{fER򕴦.I#ީee?='7=8𲖖4bs\.B蓧ҏFtH-v|nX+pg Kv@!*̲R^4[^,;G׭IR&v{$%.󾊊2kִ֬t,=88{ř3gx^׳Ν;W^^N!QJNk/QRZWrS #JNZ.ԘH5׶w 7[⾴ނ dŹ:aBAAɄ`0@?$(1t>B`U.\Z"ޭ-d<ĉぁm˃r|`h"x;ͶWP|{l(ץK-,,GFFA k"y ?^6 kD"@ Ks:|>B"('TXX8w<(W>6peii@%I&  _buttV Nԓ^!6˫TTTNZfW0qDEEE99/_>x@iРAÇikkͅfD"SfO K/I _… ݊KvQ("޽{]'''Yuvv>{ظkգGJKKt)--B:!F.bvt#kc'+C謐'\nuʏ%755A}+B U`?!ܬa``-Qϩ{~Mb9?M\:n=󪪪,Znbb,rssjkk ML^ى6l(D*++?|N32uuuoGFEEadddB+Vb!qa++bJ[HR+V0jԨ[nB}!]{l (oIk?f5qjDm٢^ e,k׮\.wQrrr8N(UWUUU׮]x]w-PVVڱcg{{.ؼyAjjjVljjJJJB-ZvZllzzz>>ΝȘ8q† WZUQQ=~?!V\ 7VVV)((hkkH$(oIzq vl&D%ؘ8(Ef甥s ښJ}L< _bkk lňЫcǎ2eʅ }lllΝ;KPxxʕ>P|kkIIIVV-p8P}i)&NfLʏ:+&իB,vnit:Léujii榧g<{И2e_RI S,GFR ZzIjjD{{#87SEd;…nGXd mzÇns7oaBBB_xp8轖!' k-}Hֆխc2Kuuu(Jtܗ! [ɜ9zΝQFPL##:{eeVUUmGGFƦve쭲2 _wJI$B&}E >\MMMEEFJJ*++ J[M3zzMxꪩ͜9CWW!T^^ɐEM0"L...#FuuuMĽMMM444gϞ={/8&&^UUyzL;0`„rr4 H$RT*uΜP[>M3gJJJ"uttʰqh4СCD";uVss3StQ J= 6\Ɨ IDATUn`QAtϞ\.w׮]?#B(77791B޽{:::ǎyyy111${EEE`L&8Ϝ9FDe9::zxcǎu.[QQdvvٳgB.]Z⇀ƆP+p JC__tG'@ H&: ״r jxgkq.&)b?QHۧ$](((466L:Wge C3a(E7TI&R>SxPz|h4BO7ktA9ID(DN>[Py慵@)z&ab~@@ B@(<  |>:  |_&@ |?άY3ho]#oH$Q(4EJpS"ޚESS{z8}L!H..ΣFwgbb |&0|dJ$#,- $W9aB@ N| ]]]utt:;;+**^ / zVVVVH$|y,Xp֭j..Ωvq ,|)"HFNMxʩzNL3w'冥$tnܸ5Ǔپ}{QQ'p8f[['?Ç?8oxx9x6&&f|'/_Bo,C2or,p-f`<}w> ***B#G(,,vnll33O:uT"aٲcǎP(,V٦M]!xbyyEIKKǟ>+;95qϯcWL1;'0G]ǭg^UUEMLE"QnnREEe?~}k 5l0MMMu1c￟RVVFyxhyx#%%%!DP<<<ƍK rssϜ d̆oݺu444lيcTWW ɓ'_|Y(ϢE mll._RVV AXX]#//鹌f_vMBBbذaΝctuu%%%/^G"Ϟ=d``(///77˸qƽ{Bzzz>>>dɒݽWllLk+vvvq΄A7={,pw_t֮LfmMMMMM B˗'N00+|mhhlhhR7o}!Bh|7oݽ{!tTӿX>{kͻxIIIu{{ &=zgNHHX4F ǩzG|>ɓTx_,8CU "ӊlLu"3sRbmmur![YY 3gΈD"PHH^Z\*55/[YWW t颮n~~K+LGKN~ܺر`}Bpʕ_ɓm.B`?cIHHt+!!1+U]]֭۰eee͘aollu*666m+4qj2ӲLIOسgOăʰ/o {P(?z~R&VT Bcckܻw?++ z _ Baeeśqr[UMV^^#؏M--|D+F8,˻0p)rrr o zx];*?~99?Sijoou cc8<<[d3Bt LqcTvDqI Bz bhhhiiٳVϟ#wYʉ{ ji)KQQ1))bM8իW͊ ]CY .6HNNn9Lf)DzIss3qWYYѣGuDjg7]QQ!))ISryUUU}}7deeHd P^^С&]O9qW_K 'HujD"!T\\PWW;wLCCCDDDjSPPЅ+}6m O`0@?KJd!j\Vr/Y86uK+XX`eȬ =}UUUqw06=}_p1///}} p&11!4n+V-MMM[[[BΡR ;NZZ633 lvPlGG'YTt5kt_tOӰaĉ׬Y V?0WO@M6ti6+&N]L>R~qL7jԨu֮ZZ < >H$D 4 ƾ |_h:BЁJL~& O:D )h]'LSNIEVwQ H$gnn~%& >,C2oFNMxʩbvt#kc'+C謐'\n;WqK-vsj_ǮbvN`n׻[=|Aϼ*D\ZРA.]zݫWD"Pp3qƮXm!BnÇmmm ­[BWq!TRRv:5 |Qϯ9PTĩFf:x7R(ݻwX]vsѣGRԭ[?~BKKǧ... PVV-[idd㏻SRRX, 'Yzץ'`=`h`RAdZQQdFpNY>ОYT\.BbacƘSC 6+Ͽ~P(ήG 8q׎8Pi^9e}x]RRR(++ B{.-- 5SB(2W#p8lkO]x:_R]] -REEJboG./' _@t6QRx}uuufΜJN~r.]6~8++ ի99;^[UU%D277RD"W)ۄ vfzFtyTݳ?0ݵkWg觟~L})bh4PnЏŋOr4ss@+lmmnj1̚5Jr>uuuPotN$'c71k_6pj2C7sB>T*uQ=c*X[[ĆǛ+))5˄ BĉSN dbbY{՟|RPyuu`55e0 XB@(<  |>: ڼyȑ# Bsssee_ܻwue˖-/󗯡[>zǎǏx4PdXUUE$~i׮][YY{I$+((/266Rl6 lvu~~>_WJs O^^ɓ'7oޢRC^Aӯ\MlzzFzzg?|RRR'Nv뻎F477(wtp?S-W]]˗/BX[OWtҡCEG߹qㆸUܹsr;wdOG:f&r {%%%"qFEFFuk3gٳ$%%+**.\v sРAҥ111f6vڴ D"˗g#&Oh8]ZxqCCMMLLx|^^@UUU߸q#**СCzz 7n諸 LIIJvbgժU ;wnܸ;+Htqq Oϝ;.--BWWWNNb5ӧO3gr`2KWZIR<"ӦRԀVBni4JzI?|dxy-ӭ #99 _BB󝱝 ݻ[-.]DKK*$$XVV#!!kii1p#Gb-?KT*uޟ++$,--#TTtlkkkkk:rhbb"Bh֬nn8ɓ'mmm^k >  J۷okjj>t蠊eK!cΖf~}05Gx\EE,k TT'%=%'',66־-o;p`vCĚv_Y=FP8g%jWWAA233B-ظ(w׭9rB!#MfaaWq޽+99988N;99v;TzzD8ܹ!ww#Μ9#v.[̙@II1cƜ?TXXHP45+++v&$$yΝ6mDzzmmmgTƍV^5#FۿFF/40_w߾iii~PfǍrK^^ܽ{7$1clڴi ᆭ#21CMMŋ/))xXdɡCp8ܪU+;;;O8277 PVV6ӆ ֭JbbRX5 i4Ywww77j ߅#Q,h| jJN4ӧ#Gm߾#;kyyYCC[[S^tLfgφ 19rTU<t:}ÆX@ hnn޶mx7pHL(ފoL~oXX)aL,ΞȔ)S͛{?:d__U\B<-̞=ܹcƘcGC8p}ĮΝGϛ7k0ç^gE MVE[B0%%%%%yٲ?a/ ##k}DxJ_Y*))l)Bt!ؓWّ:!F.bvt#kc'+C謐'\.LSWʕEfddTTT"M}㗔wg0ZZZWCYk]Eߚ-`att/<bG=&5q)f6qu;s {{{b_~d믿~zYrrriii'O>E[[iScVVV;)((TUUŔ,]MM[OO;+QWWwvdTT&}3s׮Onٲ9,,QEEӴZ6t=eew捻L2xggXD")==!22vӦqqqP `l6bN9x)lv5&bM4i„ ȑ#>} NtwwbX Psss_uiln{Jmnn~%322---111 Q(d&TVVŋ2뗖JIIh7(wPKKKQQqF;EVvv׬Yo`oaaq~R+WLOO={Vccciiɓ'nݖ3ԉ'###o߾mk;uM11|>_]][p?ճx/r.222>ΝȘ8q† WZ]и~D 7ot|PffڪU+*P( <>33;v.[tٲex<*77SN/27]VV4gܹs綴x[}1̀9s8;xeee---]w`knݶtR___}⥾wLbVUUkn +WlڴbݹsG]]}%mmm^b/_Yli%aF_oG={jhhشieK}}}Ba]]]9Bט1cbbb)g[ZZ̙#--]WWwr/+ќ333]mhB2.uQ__u˽mZWWw豔'OP::ڝq8|?S\.WBB!.ml6{-֭[JKQB,1̫W>~8)) -Xbg7nݻ 4hŊ\./44k {}.^߳w*W)D v%D%ؘ8(Ef甥s %Ν;$*gOׯG`7o^J !6n@P;w.:t eWZ9d16uvq㭳{--M;u],,&/YF҂tTW Z_G 8qמݟbiɤћ[Zdeehk׮Y/y݄>p@쵦&6yI7J]y3%***!>/^e9dPSL>sX+_SEdif{݈D]X_3aD[t["$$2]m~i?65544W.&id4gzeeRXYYIR)++y(#k?= @ >#mz ׮]?ZYY`ɒ%Æ ,aaÆ ussUWW\۫8;PEΛ7ǫL4LMM444gϞ={lG y|NGG&lH+,`WmG=;FG sjnn9g7EEE{uqq5kVkkkZZ:f;&z1UUU%$<077ҙL?uqq9s+,,j< ޢיDIdCONaS olm4n#E<!/jakny"B)~(((46FHwb?+k( c@)H2r@5k&*.:1{쬬,xlI%%%\.ky \\ I:̩ P>|1ﺐK.ZYYY[[$iٻ~羣ll7o.J효},^\|>B…߿\رcBק+°y@G? J<\T,mza=jk֣**jGQ"((ȥ r[!nc䡀h}fg73δ|pQxZUUU݃xUUUL~=z!--p8B&?;;;::^p !RgK?J ?SE|~=ʕ+l6g޼y˗/_ ;99...ݻT*m{W .6СC4-_xC455GqojjjꄢӧO?|ܸ_/Y),,L(իג%Bahhhqq9-]ߎϚW_[vk vMr;f֭RSS5449RTT<`ٳgkjjkPNNnzcBxI0sLаcǎVff>aFz5i$&PXPPпlBHe8$!U]n!DSSׯG讴&Oeִ4Bv+S۽Lv-&zz\.c 4hSBHbbгgC !L@2kŋ׮]#V8~QQѫ4L&cVMJJܹ֭s#KT-bS fYYY fL566:zhǽ  |d:M]UnNdLFMSEAҥK"\.̙6l|mϟw07 #V\amm}RDNNn卌 322;XGLzĈnnMMb};Xnnn;|Xf{CCC6yp8..ɪ--…X4]VVFILL:ujݥRŋY,̙3kK)K.aXSR-200`Xt6M&hōMMMϞ=W woi6}߾} !}eٙO:-ĚƷgy~ g333!)VV?o++ =gΜݻ677geelu5ʩ }&ﻑ\KEu՜hqF}}.tu|v4.w̙3vqшK̆eT:T*cل}}}ݻ}햟8q~-,,/Biu~(WQ!ld##f̘ۇɓ>(J322vΝ;wv"(ZU!\.dm뙦Lhk=]ۦyQmqRRRKH$jyvM}JdBh&"ϸV6M'ZEZU6))G]]SÇ0OIIib |x=\eL/`OX`h1=D׽{ӧOwxzΛ6mZD%ݑRBHqqG}f_\.?}LLL!ݺi1%4M[ZZVTTBtW4M|Ee7n2˙،[n3nbD__vjjjz졡jyV 1-..i7鲲RKumtZxEVыRecc -I^Ph9!D963KK&&733w!$5!Mnnb<%%ufffL\#NUƮ|aFP1ZmܶNɔ)S|~QQqp𱴴t9z葔D"!oʕ(((` +3f,>}466&&&嵨FY`Ϟ ,llld֊$>]EEE͟辶-,|]]]ͬƌyNoe~tt];)os>>jjj>LUU媩1RJJ EQ_~C4Օ455ΝdǏo7ww[̋111"B>]ۦi mK.9;aoTuLňWM.]Z`k``ضL^^ѣ({; [>Zmm> <<׷ɓ,G |>ҥ˄Tz~Œ3\$$$$OQ]n<2zZX4O],myڴiZ\\lk;tӦMW 5l0<w8880 W[++W<իի JLL|`E)++8p@B766Bfte}myW/BvvUx5w nn466ߒ%7lBaEYY)sH& hР+VH$3gtC;<))911i ޽g޼O6nܤ|Mqw!WVVfe=mnn~O200@-@LMM [ek~l5e IyNV&:S3lsM-OdX,Yd*7 )𢥛 _+>:r}/022$.e„ }w[z`͚5/]ݯ6!F$(:-41D+ߩ^AB-ݣ5k׮Qf|!\XܳgOBL&cbW櫶%}޽?feeݺuY)+ Sfd)::fQQQ~ƒ?@! --lMʰ{F.'{ia_ [Q(-~bB Eyh~eWijjz:}~ ={422z駣?-v @ W[__[[knn𵭲2uuu>_WWGij%M/_ >fbb8''GSS1%%Ӛ:LV\\ϒd~# i/ gtE? :X`Cj76 5QWWwȐ!^^^|DnnnnnJ߾zcǎU}:-**W>_TTd\b3ԭ[29qqq666~<9`axvW&fsi' 5,5lG+Q\Nݙ'LJ%(P]Vx0ڨ@޽+r9G6O F ?rm+-()jv]V1 av4޺ EIr9BBMQgb2hd0 _kRd _௧6ydOhӦo\?lݻX,NJJ H$l6{E#GTSS+**gΜ98΃GŨR@ o߂󝜜BBNK*R&VkɒB044?1bD`/{f^w_paiŋ==:*u8j+KSSׯG+3ryll4hА!>ؘDQsHKKkI[lMKK#hkw?>W@ ]+pf`榮y7'2&#)~tԩNkllk΅ ?{97eolli.++#ܸqq߾.]nnn644dٛ7ǿ,rR)b9*։*ֈ*.FfXrA,MS.棱I IDAT奫﷣qKEEPoOK,122ڿ?nƌ}!_:99N뻁*U |a"pp 3~2;Zz7s|x<4A"----+**&&&7n|!2+!D,GD\y3_>?iArr jBWZ4ns2:=T2A1[<Ǭ7jݷs۞;u'SLEE !㼼֬Y[]]M^ٷo͛74rҥK#FѣGnn}!}uVRRz;w2|ʕ+ֆEEEvV~5cʔ)***.\Tʕ+!.]>|0!v>|HaaѣGҺsίd&Ivmɒ%=z4##} gE:::EEEc<\G7SvjUU~?󆆆=Ըϴ?~۷o_XX˗Q1v*3Ջ*Lc]MvŶC7mڴzPxf/޲eG}4bĈu|hf7n7|[[[z+Wlٲlll֭[WT9eر[lݸq缝;wB(((?ߓ3ڝ<ͿqfvS1c~lr}Duukxx.J7sY#>rR^i{ٳ$BHdQFۏ>w@FGG3#oǻ1':ݽ{7..rPЯx3޸qC>qĉ'O%vuueWO^^SSh>yәV.^x1N:2Q_b+$(:-41D+ߩ^AB-ݣ5k׮Qf0={o+w`1rBP(TWW7S;;={lB*&!7iii1i==?QP(\]]݅  2D[[bB44)Ϟ'Q544bqTTԺuk233S=z~zQeؽ@[qO{tL&366RWWonnV*I}jcc_XXHݻESr\fNBBhrpwuYYoUU,ʋ 3޻woeC:ospppA*x]*E8pܹsnLg vȐ!7oˣiZMMO>/2]]]&ZdΟfddtER.뷺)Cژ;w]zuhzw2n~hhYNNC 򲶶&]."""==ۏ9Ry ,X#֒R3336f,r_zQQQGWOEEC9* nMLLra^DRUUeeeńZ]p9>}dΙ3gذa΀,- U&Cg劓wvyTp#Qx]nv+dG2i[ž9uҥϟ?`bŋ555>} #9|lf+W̟逸o~R+W8tT*}m'$>Ѹ8?8gΝK,$l۶ҒrĉsS]rаh׮ƳfyL2EEE…hIu[Wq=-^P|fSvj՗**={>cm{ɟ`6p\xB`Fsl:=c ww ӥR ! !@dddzw[[[ݻw]]}|B.5:Ȟ<\me%EtY|>LS(2$,ucGse_5rȖ9à Zظڵkgφ*L?KII4ǍsPU\rظal^oaayo1iӦM0O>E%&&>|/-?he222B=;y1v*3ՋJ5O],mJ?BVREgϞMgdd]UU,իWUUU K~~~Z#ooǮnLBBN?{ZtΝ!˗ < ic%ڛr}9)/DrJpFsμFSWW :\RRbaa1is𵬬̙LIDMݻ}B&?$$DybDDIJeX_MBBnN?镽$uӧnyyyss3c~~1cZhwT*JL&8ͦizΜxR:TzQeؽ@Bc] !,Kk^u^zmܸ!))yٲ3gX,%驫3F g* 8|w F_/:֥޽'H-ׯѣƏw8)!er666|>媨W+r;|8Z}_%ɟ`6p\xB ӳDUWKG \DkDSmLw#3, )j5'gI:::Wnj޽ .{0X~ \L[? -=ƛG>>CBEQʔ 665::gn@  aFBBnN?镽$uӧnyyyss3c~~1cZhwT*JL&8ͦizΜxLd/J 555搋ɓ%**--c===oHUo^Tv/r9X'bWBRڮW]W^7nHJJ^l̙~~,->,s5;;=/\̙.]VQo+t ezzzQyyE.eddbÙx d2M{!Ov4޺ EIr9"LxIUfidքa[ۡCڶon K.i_ͩ&66u_j,\?\ &ĭ掖#(MHmO/,, D5aTQa-]Œ-uFcZO!8ZM6448ԩ>>ԘC۾}ٳgvky͏?xeSÆ c~tpp8~>b_]2eĻaWZtx,ѣGBJJJ9r mmm@g"j; c%ڛr}9)/DrJpFs^{qs577777?|p׮]8pO?,--{왭P K{\\ܵk!W'LO:fŊwܹw +I(QtZhb͉VS?7rujLB,ٓ'JK˘Bejhhؿ'*O/))Q+J~; +!ԋ*|MP["( Y-ӄǏ;wK맯!={6xW|>nBssv\vMhhիW׭[rQ_X`Cj[\WWW}Ǝ<nccٿccӧO>9lϟ2ٓ'0Q;=.c?dx`0tB!$e+;{ R o~z$r_ i31a4Md2L5)d2Lz 6o&Ûcq865W@ ]4pf`榮y7'2&#):bmmnذa֬o>> !7nػw}_%^+rՆLt_Srʱ Ì}lnl,aX/>USS>xMnݻgΜS('^ }wF_3\ DL[? -=ƛG>}(JLL<|HcccǷ|ʕ+ֆEEEv L){_qi۶"hȐ!9999lKIDAT99SLs/@Ct0Unmrm2X`=O])gte"V֬Y]RRz7&$sKӴ|˖ֽz޺uĉ{&:0 (eIyNV&:S3ls浮&Ξ  e~HH2lWZtt43zvK?~8??ѣGٍNMM Z&޾1+lIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/body/image04.png000066400000000000000000001163271461403617600231170ustar00rootroot00000000000000PNG  IHDR gsBITOtEXtSoftwareShutterc IDATx\[?7s($ kS- Y ~l ΦwKmRgmஸ+)*qBk- HSh ?PZZ 󟆓9}<^O>񉎎&9Qx"χx,AUZ=t, "ug^~y2w/Nޱ:V̋v+M}g,_g-,Uq9*(RHW]ksvR".sm֑/^GFw+_82+wR6sKWeZ\\JZϸ(KY*k;簴6UWT6Yybw& gS }};V~7?ޱzO"Ф&k3{V"U)d4&(#nn41pg#G3MYznoCo8qw5,Lh*≖;9Oо?HDB/-N7%[xuwo/H'AZiux.Ì`&*-NVȩ.(M]Luejd@Zʲ>s+9&+P:wb.+Q YF)-+VZDdO8uetƃi=Ztq w=A7>=H#Zw ?GOl~` ObY?]3.>"2!C_Ν\k5Xm@Y~Zm-D[-m//,18YiRN [WܹdĤ[~RT2L@&6uuV|h#DdhӛSM]$8vU-dD2h/*0_r$>^lc%wZteEu2I>#_$Hs:oʎ=df$rd" /8lIK"odCwpl;$U(EDĈg-yZ^^R.qi|NDa6x b/UdҸ憫—DFby_;D>%̕[mj%"&@LNEbybBYLyʓK/JL'Sc:&$)/s\' qqqr4׶;! -Z>99p8>rG\=7yî-_&s;f[t4q ;JÄ4b35.\]WY,ngb3UWJ +kg+YvK9Zk'O#qrnahj5*}t2qs,;c88;;p-[un~N\0N _=ϼȟȋêmiΞݙj>N]YW&٣xG}Lrq]Mq_-) +Tgx_O'Q~Xl7#s ?v5cwï.vZ]͞*\_$1OiuOZʹY_g|V*/㏻7&"(\mmã< &M\5K.5TIUbޒ1qcDJ;IJ]?[Z&žn{*9Owm~dvO ?^;.+EL5[ysGvJdd(̖6wCQnV`hDcAIWrR,ܭIJD9 F71bQun~q95) # nKAARƎ7,3EV aimT؉QVt΄ LD6}eY~Oܕ.!" m.qͥ%M<h2dDDA\Z^nVRv]ծ*R%|{JD3?*^vo&)<^0=jzZ~?۞hD|[F߼d#E灝7z|yd9kkiw^Lb^aHWZPlJj$K](,\kc2#Yl%zMܛr ueZ )p2HY\k tuAK^䙥[ZMq-J-(* Wp\,˞9s櫈SGGx Fd`u@(a:ii:nv,FuF7X[*LJU2D&WL8UĢәQ& [k4VqzTQ^_V7ZvZ?"O?BMvxD$.#C֖Mvՠ^i[\p~r˅Dy1"oo$s{xx{֣U:Wc/hr'ѱf˩+>JI.VVM{J/]aDŽXzi7j{)*AfX&}m$>|U50!5Yfj&PUdHR:*+ZLvSK\VfnWTv^Sg%xzts 70 '|q Z1AK"d.z$2G6$P{ǾLSdҸ`I*HJa 1r^Տ$dd"FN7c1IP'e29N(D "7Z[rX ,zIhw6mED{pc|d2Ւ#ϢQXn%L͸D.q[ jp^䜼-qRH,OR%F'VV%I8er̸KvdsR4a:[1ҬDdLDSͣZ,x*A*m4*\,{8w"<<<==tqQz_#~S@ϼh47rŚB΢.Ѵ"nFgkJ $ͨB|O|aޞ<46jmْnL*.eϭ&P(^NnZ_Rf䰵*tl=ZoKT5~AFFX,@zľַZZZ8Czׯw\'N@Z=OMw}aaaDxۋuBwn7@1=66699rPqwz7s'21212121217$$zlrml,r:}Ϥt=C~,^)xrə&%Yi?~YaO73\1-zUF>R{fl~ޓ?B7|^5tIggZ=oǣVU316׉%"kϏ~KDAaO=w8虻^:yYigc79c9993TUU_/;tmꨧmx}Kz߷^Xݽ$g> {2{a~/<㹀\fa_S~7_|S##Ǹ{n%.nx"Zpw֝W3⍓⛟MY/ei|=l#12FMiq3# "ucػ}WEut?""\JKCc6X+F) UkF(!O7 2ֱC zMPfx&z{ާUo a3mY`xl85;{c4'5dE08skϳ5î{3WIԇݨMl\x ޾CW/b G{$nU, hbF<(9\ov/~q#/b"v'7:|r9CSGψ7/$T&fNmb\|;?~a[v 1#rO {}#𗮿>]GN&Ȟ 8N *<'[[34?@ϪB̉oBLޢ+yNDʜ9x 3F~[0OD˗n'<&XCCOy[y'c7B IDATb>6T 9cʥ}|W=D~W|nɑd2po^ufl~>Y& 0IEwgw_i&\.^X,хڬ0:`|fpl/ ﻽7mZmQ a2?@g븛m1A/d= &A<{gj/#"r6=)(0ND=!sYh(v$2h*OĆM~' 6;<)W,٤pΆwmohxwz3Z6ncDi_mz*bsaZSSO\!kDtRv{HWPH*:Zsgh`oC {{YY~]}DD-YS}uZ|I21ZgϞmiil>>>iii6ۜϩedtnh))K 9ȗhw{'[0ꞎ#-?ei렵kep#^W:c8$OMrIh}Q\g>#O.dz|bnI Y%aY:3Њ64EDn;D_tߧ2o?7x3qT9g6sH"WP[:}Oߘ(l ]~8C4figFfb;6uԩS"h͚5󐉿N6Т ۹sYRo}7*l)q""?6LJTǥȲ]Ls!+_.sqn> >$6 O<~hCVM~ q\Zvuȭ<_"n3X@OŐ'D x9qvKn}} 0XxFn+u~c``@(GRe!c/8Υ HT &_"}d4X&=7Kv籚53 nkmf;E2_-`'icQ4 th>QL{ gsO>w'8("1>8pM=<8;cCccİX/9n*TX= s' c>,OKy?X,1xÇ5( +D"aB!{'Nw 5rF .˸_lT@D>7ĞtTƊMp #ݼl%}3_/11"O2h0AlLT@L/X*?tF;@iw.sI!*(&\.G7@qٙDrDМ4h`䨃xk.g;~ꈇU!7Bo=$""- !a7&?вܡCr cW&ZM?"nSEfl<}'A۾6޺iُBϵhw6 #B.\tOY}bN@ҎBosy;x⾾n!<<>܍]/S][c}?r[;gk{U[^Pw'i[J;_^OnvБ|nش]L\_}ڻ~wd*$?j| +~;w0 o;G˿Ûdί2t?U{zFn UF7μ + !"p`o3 ;<nzF)Bq+ $m-0͊|(n[ 9{dO ߵԼ`ρ_b7oq~v8~r?^ Є&,SXH>"Z\73\1yj:&&[o/p89Ӄ}yxEDDH^{mhhl6H/-+sJ4ԹH `L=F(s JrmF"bE\sQA]a+-(/,ْ"IYZŭܢ܂b`{iyf&KPu;9:g)B"\CDD^j=@!Eᗇ?ٕK3zîY **j``@.Y8qȑ# xK[d牬FSnvt"22z`_ݘQPHDU7E&''7[֑dȩ"iʭjq^SRWUdB%,p=ɹ\G~eQ L:јkGc @=w r&LL8Wn4ti s5ƹ?y'XZv(5[p'/*{& y]m||ѩ?׮xТ֙<1R3l&+'S?X,~ TUw>`uȪaWY 3((v h82AH^VkeP%HRyBuqrFgVUϪS߽-0&/T,ܼΟc=3qlTȭa>ab1s'VprrÇ5kۿvt4l6ku]=T؝])f1kmWèwM;`]Wθ|UnqZl0Otto|C,9s?.rd‰+6߱s\PeWL L L L L L %J+T'\~ԕui9iK*{+8db2fud֏gj ?W9yƇU ?Cs];gH֚XWb#11o 9555(7i-P[f@I/x3isܟ'NXbi;b#]Fv]uJ! #UWJ?5*H,ۢ RYieyى rM}9­UKXXdȈZwg?7+ܭIJD9 F7@UZ[z""K:DDLE뉈­_p <$HdW}F"NK?茄1CO>{#H¶"U%QOCzҭKx})(<Gܞ.UL) gXlJ =j{繓XH[s{EKE:r_ LU@ A({3 5i&޾`q\n[eq^[ uz.)RZ+w4[HЦ.o'-Ȗ4^)sSDEEqJMAūe"j92IM{s6Vc8"2UWPLzPeҲb-I.Use-3*ߴ3i*|_АHUX-k Zyy֎b'RRRd$.LO<5riXϳ4x5+}??~J+.jSW.cPs]7>34cVoQ=`ozl喟b )出F$]qfǫ D7&~w߿waV~;'3x㍽ Nɒ.]qJdS3~AJJXRZ^[S&HD6hw9yQTRciIm ODv{:5+M--ݷ}]MD֌T%C%//y" LVMH][wQdP˨tE u$"r9g5CDG/MIpќdm\ 6o /BIO'<љ;K-֩8y"'o)aWA2zn"Y5^ 7u&[r{キp$JFޡ>n弙X/c֗ԧxM""FgzԪL%y1[fof6Y P8VBF?}]6Rɤ Mmv Όvc~d'fwGGcYu3G&㕝gS!KT/ayt[" ""wy__". k3K=Zٳ z21q3n_fʼOG]yJRL,Pi0{ɮ8eO -S?wµEْ?yypV39pn(exYڸc;NxիWwvvNLL,2V&92t[(9A!}ֲfԢ3j9{4)Ir2xkۢL`t-+dtH.qvmfeYd{er<1X CH,`NlяƏ~4Pg^CV36K.xs' 8fVH"X"]<5zF$J3y_8"""""bnJ&ON1ҴDɹXs+bi29sGaf@LNEbybBYLޱdVOIDX,+}PVIqiyY# sɔl<)I,`r:[t.PIFR춚3Y ȡ|B0KٺBozlRۀR L{Y);WܬX"]);[4bs[DGG_,nݺԅ\.7oK3wkT*,jpw?O2\-IU]"h"W;q5..#E(|B,ηXnnXX~wٳ80~ ML%&Fgs|D1a-ʂ'οc_21%gݚdz{+FՊm*8p7%0D4qx!d sum?gWO%DGR'OdOdzkhh(q&СC[prT|e-k u y gϞmiiYub $Z.>Y.b֦RM}杂R27]!c9d]*?&49?/;Q!RYiOoWg'˄jh燘H$ 9QgfuMI/yN\I7HsRCV6|u˫mWɭߖe f̆{_s=Dxi@""ښPwN+<<ѣǍX,%K,Z Qi&8f^kqgf,IJOD$J.*-3Uj M(^.QHXP+K4z >=_]\/i%u~ۺsQ?PTg/t]O?ZdzYeuv" exvや[zg>}}}'66ҥKO=[B+!_Q;I &>c9@,d.,0D\H SLBHd`AcXnfR) rV]ܶ:;oNτ6Ho^@oˢY Ottjժo9$$d||ɓ8nn&i$V̒&/TeP܉*͝/212121 ?<ܨZM%.B~V&5ր\Lrq]Ma"U`i?x" ꉣ'/> SopK#7q^[ѐ3+5īV[FGG=ֆ ACi@["[Ai}S?S _Lt;b8%%vwww/2 T;S,5*IU-xDH#j͞&+O$N{ZVۉHX@Z_TPke"vx{& "_#ΝBW/b GG(r4G|O@=fWk=Dxi@""ښPwι%7nn?o[񋪬Kwg݉q"b¿7qYX=}hzOHJ[cd~pלLp8АL&_ح+J\\JZfQ1iTMNN-((ɵVɾfnuCQ;@VDLRaeEoyG=X@S ó?$au?rbka |Rkw{b=U9 IDAT|:h٢RࣿX)~"[&x,5{4sg%z>m$;fly_C}O!ݲ=~W[޿'׌nzsDIl?yx8ވT P&8O<ϲe˾%42zoW7f+b2ډMP-q&&*֫W0y͠[j!n =<"hvL؆7. YF/G{Np20;m)?* 5IRޟ.4DDg'D4FwJ mV%"YY8P N&>uM7$JV%KVX0_/S ⶨ3r`DDMySEYHi~MWQQ,3{49vs@$(pyxk c,^dr^3'*,|{O{q A(T&y$׏QEKV+v;.FH45\3l6;v쮻ZhXz׮L8Wn4ɽsr/srrЈ4B>KӦ=VјXLÒ*5•յJHdjZ""\rQ;vׇf[~yLugUhΓɪ[%2k8y%H,>Ӎdl7??!e"",".˻jo 9w ,Uۿ.l  p]NaZ[2+=Wu݊?Z7Wv!N3ЕJ-ט f%oncI-܄KE~~n 6~Q,+Y'+%"j宜=IxlMxW.ÿ#ٝ4۽P8{7J~ƚvυT!Pc:U%9xxlSUddhqM3qvv9;;3L\VQQpss ֹIIIhbL FþjeuW={Z}(Ų45}=ۜz⛚LL_WTDU 2t}c/w`dênݺD/^v -]Mt_yCeee;::~bVݻrkk[n9::O*KBNT&ڢؙ566͘1?lll477G@WӹNjں:Zmj9.NbV{7np88@R֭[hqx>3@ `XG spIIIuuu@@@ ۷˗՘8;;̝;T*QnBaCCCffիW|fbgdbdbdbdbdbdbdb`dê RO? ~bN]YY2q3yyyhhx3VMNNU-V_| s&@&@&@&@&x&1;d/ bq8@VsMx<cnnnjj*Х8;;̝;T*/nX颣fbg212121212121)lqlŅjqyDtU?1^"9>y{j}ꍳ#4-Wy/|aGWWg'nߙ,qoܷhku'3v*W=I{3߻S24>G2 -INN/ѣ۷/^(H^ܸ1AvF)WtA<2Nf/rN~OJ\3.XdK2924r-uF!3NٚSU_W[DÎ=88U)>m)u-tl///B`*J1ch4ؒUܜ6m~4_I>IPxjYFlT| kXXQj3VJwnܜ,U+m-0KmJ3bsc6[}gwá@"Хٯ/?766yp!R)4#{_?7',W5ü4f;cң}|껄 QFTCȈM3cKDDT|:6YNDS#njq]ض:4uhŏ- 3>IᔦD|>22rJ"\z wu?$y%abwL_^UFFcw'vj2S0@èk%bd'ֻwouʕ9m%3y:ɭ*6tw]LtIMDjYݾbDNBkuղ츨n&MTⰉC¥OnR{,X:,gĒKr qom=flj5-R`eZԒ|}}}f~5%/V4_^g:{*YiHᇤJMZBiY=|ΊKLdD"QppprrrqqqWuto4,͍Er yURQMHvZJfl؉'.0iiNKms]ʽw9[]j䆝9j""oh@_Vrn"IhF̢_#1$ \6LBϞ= I~n| cVf/ sL67'H%NZvxs}g,pN͑ybj2OPF! |靎aej΂~V>Wg9;zxF!˗I7HYy7̷^Ucmm`0X,jV L0!''GP"/h2%,tcR!T[S;$·͊SnK7nrNE2=$ X6oã섈SF߷3siwܙMI;/)^:&Л1܀՛޳c욨-١zFNc$t6a{Z7&}/sε0> gggLL L L L L L ]^K?5/:"CFV\/@&~4hD'>ٱk70 W "qέ6lk^hqq܅dp{xͅ/-e5s92ESWz7'T!\O>/d Gby-z߻׬ NIl [[[>_pϟoNRux&͏EǶDG筟R;+y{MͶ9xwH0mH]6N79?gߡLWR ;4TW-tLlbb鲳\{ĉcZ5 [5M{H!:3$j؀- cRؔz٘SUIfbBreDс9vgS}۰2$Ɉf8v?d O]秈E7 q*yC1w,?h囋G;\~5JhG͉#oQձ~7T.UwK[ZO"gԦZH~7Z?NdU^&j޽{?ZPt^&9g&i@Ȫq#|mn&R[9{"ղ_T<7-\J}&DE_U)|&'؝?*\v  SADIF#EZ8λџ"No9N< ]T ztuդ!=WF4s_'1S7Xe.{W}/*t|+^ Pxtw1~n''xHkLr؎ /sF[n6N%5Ta[O'N8^{ɩ3&DC=O[#Ý""|tBQL!|0޶(DI˝ﮨ=TIvbO`N~&~(wWDb$c}b# 2Br!=HQ֖͐YRYq:ӛunͨrfWlYO#"rz&:B!"KggKrŎEwgLEfl.W}"~,M% sq;]̧ry!*YIi1,L}O~1 * [B@a.%>ُɸoR!U{?lsW~{gY "a${'K|ǐ3p3Ammm6}AOC^FMT$Q>1EAg/ٽ2e[Ǣl.7L[5Ϥɳ6=c\B5Z2?d 1/lP'xW,_D0bX] ~]Tg}&a!vYQ"T__Wr75]Zp%<}qFxSv vgh;m~҅n&d#zk;{sݼpꓦ!s^aLz7)j1sںy_^v'[MwmHQ|Y7nlc5f8;;̝;T*ǻsHYW9*? tf8Gc+g}V,Όِaټ6LYvswY,܅LڶZOnjxv :?i~m|ذgK{ɉ<"\f -INNw&sСnnnl6:11QP'bBQQ=uH|7U;m<{UHbKRs\ڶ&48aM5 i'tF/={&[ @fbNbرcSSSkkk---uNKgpMjUy4 ٝ@psk6v6X*O-8鶒>8Q-EU.+>[|圌54jPYeOY]]'2hAϗZu1r~?|y,*/ItN\\zsٺ[9߾,Ε,jNDD!ǜH#cGc=&L5َ**<C}vlmGBd3kztOgؖ "b6ev6TU\NDD|1H5}FNBVWȣIQQgX63}uyHDTZ`NRK]+:xuڐynwq mv_9|6/QAf.lDDE;6q$wg[$>洒8e TG*͚d]u@gq|.)䊶+r"?5乹w1,,vC KXNDU'D]""⺍_:MVSc#7jɾ:Hq*6qksÚCϰ`MU:;$@&nI{mq޽555D$u֝yC.˽fp̚W(#"2qy ?Uڦ{sܺ d3{O/3dF5f#>,(vR*#mdu?dlťm=z;r7- dgiT.+Z5KR1Ľij ^{8jkxfİ!Q1"sD_-e; ^yɒN"=Vkq_XtGIx=&V5oÕR&sL<0Px=6(=,UaUQ sY4ZGN͒Jυ# 6Jw>g%Z׃6MM슌Z]!D|1tdx~a; 4{5I9!!\;{Q_q{%/ 7.iMXƒxڞkh|vj";ϪNOPYY6{7xcȐ!rƬMu2vNouf}㌈#$BS>S4s> ""/ n545s}D `[n2,U~xgM2˭;]x;vⶊjCu*9qin궴.cSɶ[;+g c\(*'|u%GʔZ()X\!&XVu<DDܘϓ_(*)$vopyZ#R#>O*V_}vJISt!WrMW)[|URTgdwwCƴ/r^7K2BcUΓ4.,>!)"Sp=^)ݸ=T.=96;ldg\2s3|Tɘ$Ɛb#۵É'\n```SSSFFFD0uLNmd_YcJtߜ:iv;c*45yy '& Sh?샔ΊL+(uޮU*Z?r'JN!".ܗ5Yjmy;>=wWds}f|N<m-F%݉`Ew$|cd*E KԖ}<[ݧ ,-\$"f^<=tej".D(>Un1QRRD>1// 6""fQ+xnٽQͺZܙ@&6u67ϣ@Je''6f}1mְo Ӷ0yx8 =<<܄erre}/q WOu d}h@>rHOkR33vښ`X,#jummT* 8<ׯ_NNNנ)^S>njU;YhX t~c&ǣnf }Z.}ےGE04~yy//;ƴQVC~܎~@+8zDVjuZ`)].u =Gu24Vǽ*ߪ2k6UKmIm}I0GSUUQ=DD?m3'dWxjꑳ.љ/:0uo.6ŕU{CBƭ2цK3|kL?d"?}uڝ7Fr&8dպ#?Vگ\I"VG?mN F>wҒ\}Kv?g.AS5X+fox31#w؇6[?˒$@&vF+@Grljyʮ# y U}O6 "<ۙ`0mmm|~NNNrr~a|||_P(ebNe<;;ƍcǎy&ZLj}ý{6^^_____,rrr<}---EL;:ĽztL ])O>yyyMMM+Wxxxx9ĶOCxθ bq8@V ?۷oEEEee%L ?ү_?d$::ziJ)ԩSSN|r_cƌ1<;ag.|{ڵ?~'ϙ3w߾}]`=z5j/|W?n*.{bRxzt=xg"Zx1\pќ9sN:uZNsx͚7xBaySSϟ}&//OTj4N:J>}ݟhǧg=jxZNMMhEJJB ]mx'uu>}?e䠠K.755߿?!(I믿ںuɓmll36oެVrɒ,dΝW^# Ə?~=|W'O_c5o˓lڴI/GՑzr_hQϞ=kkk?g(ܹsb?Hy׭^#$d[q믿;̟?o k111r\3fDSSCeF͜9{ee山?;wb_{^}uEJZVɫ:qD>ߺx׮ ,+.n_|9jԨT*7|ɓFi4;vZ̙L#G?ߕCH2ww7 ._Z<۷]pc+[DDDRVZ̙3E"Qmmmzz֭[[/؄ /^l\}8%G?m…={jZ$}@ ֿ/0g\}j|)юKg~{ fCCC-[βew?Jnݖ.]:`Oss o'"H`޽{[ZZ9زT쀀ܽ7t?8""ZwK2$%%kccs&...:^%7Xw.?5jԉ'o%mbIG \v]uu OZ#YvmFF7lrqq uVbbao.. }^Tz{{і-ٲ? -_??S~>pi!3fi悂sZ[[?;vx1sȑx.777??2e?ѸqLJҁ_Zn4DF"3g L&\~.Zpɒ%77/^ү_?GZ9TJDキZP..˖-3Q\UYYYF6l_cxClVXޭj]BфGo[hay;NЭ[7Dby}***1Noʕ9_5:uSd2Fnll4>yZgw=00pڴO'?(jjjTFy?۷ԩSm)pHHu70C-Z7e~+WIV.y"R(uuMMMMMkGax~21999;99 矆of<|?ǍhZ٤c8sccccccVVv^L, <ѩSݺu?WQBPC8l0RJJJ+lڴI?F0rŋWVVѶmQ,v~Ƙ1cSSS'bbb2L38x˗(..npc~?ZVG|wTVANwҥ[nbT޳g_jO,YjC h4醵ֱL& *??ݥSlm@%%&&ѧxH$ܷ/N@D{\x-;yҳhԨX"rw޽{J [N!!6[pFލwO81qoGVl۶]@_*++(#"{{;}Vxhe*JſRԸC...&&&111 B7풒~/mή𴰰𴴴nmmmL_zի /k7pvv[b544x<}cj4Cwuaa_/"|}}ϝ;ly:I~NN_{̙vxSbŊmMMMhʔ)Dt~fpbŊoGTX!?Ydgg_\\lxMQQhggGDE`D3gC|}_Mц- NעDvn8p7lXkG!FOVQu41!V]_#U*՛ozpyssVi)13TE®_ƺ6~wD_ڿrZ꿈 vڀ>aa{[GpSSӺuk 6eŊw7JO_~|Mȑ_豣M xonˁ$aÆΘuZ9 }z?T;"fFkt94=?wW͙3{})22ߖvr$t8DEEVsr쌿삒Μ9knacggrc7yRuuuj"b2L&[)ĤȣG 2XPT7.cYY`1ms,} 9CE{ZWVVf.su5֭[ZFP۷rrrlCͻujT;K/11q c+-_W\ٻwoXؚݻDm)ʢ"Fy@9::XſG׏&7nyIRu;sDQn|tUJHJ͛MMMl6EuE"'>+_uРA-3gN~~Kr[>}Z,v4hn`,YaرO<(hԉ'ۘX,#$%%ew( _z>@O<9|p{{{3^71?ɓ'?q{{3g:99~hb'N4YqqfΜ/D"OOυ n L&S?eO-H$LLL#2CIDAT4[47d2ٌ?xv=XVZw^ӦMsuu/}0 [osuxO:q 33ׯ߸q2 +⪪lPbZ¢۷oߟ766ر8>j'3weǏ0kn BRy~//))T~Kl1j6!!᭷_zuӦMQR}Ʒ~jkk6tDDlr6o2gΜCy<^EEŋ^ .9rpl'b~[fx}޼yr<22ʸۺukΞ=kñc iӦ.]ի*--mV4558|ܹs[ȨАY^^~C~=og:>?edS\\qcD[cݧD+lϓnrĉӧ6":Ϸ~ݺuܻws_m۶M4db(8n߾{…-~+;o߾~nnnqcelϒ%Kw?IOψ3Bw/[NtvJ|LÏbggזY5ggפIn߾mwb?tgܵkWu'M;QP!_ SETTdJJaP"2er`իW}O]c_" ܽl.\?ulk׮ F-_Z]]{SӉc'8mNC45,X/ 蘔Aqq{===u&d/aaa}x:xׯ_vxFt:bj:fܹsbRǽz֭J*,,Zdb''ʵkUUUQDƋ/r@&yȑ={~"Q3g޽{YYylΝb/GտJo22D ?S~>pΝMLLΝu֢>}hZÆG ]b1]=44tǎ/f9_ݲ2&sݑB[gbokksrr z5p@KKk׮uVppp9rŋwi޶m=?nׯ߹ሩ޽{o#LmKK|r|| 7vްə3gRSSwx.2N2^ngg @RYTT[$&&xP(4db"z-F\nggWPP`xZXXhoo&lgbVݻrgg窪˗/QMMgDR|s֣655TjhCBsss+Ǫout 0Ww5[ḻw\\\ O]\\q{DԽ{={wV())IIIY݁D—^z>hwiO<ٿ'Ϝ9ԩS8N +++88TT޸qO>]!6o2gΜCy<^EEŋ}~[fx}޼yr<22.\077ohhU*]!cbbZNŋ>[yk4ܬ577X,.-- unnYXX}뭷;Iky 4uL?5`XG Z"8p\.t^^^\.7+++9-܌3;y͛xV3I,,,M*볲7ɔGAwIIIhbLL L c kzwMw?I0d#-h[V -vX:Ȏ%*L")NA+RMIwmt%h mƥMJM`'$y40Z~e$_cly&)K,D`6KGg7ķ&V_lbt\_hbX3]{VmW nN8ulLEQ~ϟSO-_|```߾}@^Wdoo{NVǷ![Ds@rpy"""M"vԗ5Y +B{Q=>߾[mѨnMunӠU/|n_k 4'&([i϶e(bO3٥٥=*YcJ|S""e9tv71r}(|sM|[YjL7QMt;ZˍC\K2YK6إy{>KVZ\)K4bTQyݢWc;`WtZ. q;/w;~|{n}MDwe飼(-ʲ5e0=Uee޺<ZPZ;EnADto]}gUYY΀|%:o{*C1Iط}O^6h\s ROU]GlзՖ/ӑTx"b]_[Wjk*j5 7Z0|Mw_5guIY zaĚ5k~755eff.^XDӧ7o/_p8k[rGo"h~-ͮjO\b`}TVxsd(S8/+5~JE;=َG *=u9z5vw'Kj(CHWg{@ɨ@U嫴ζ辺ZR/Xg)=]02-Ztm69/w^?͛-[vٶ͎G6%_9S=ztddcP\jffĿկӧOر),^/5źZ3gdpZp /'? ϼ#˧d1>u~duЎ>t/L&j6%G.}tႈ̞V2M߱6nꫯr"p2hb&ĕmn/61ny[Ͻ]A3]sT\u'.\7o޼#Go׿dɒT*K/1xMxD"{i㏷Ȕ)S>裁rj?L]~ɢyi%"sKZΖ>? 2_E<.]M~ÚLtgɽ?3""f?S9ktz;X[6W˚%9_ok_\[߆l]Qsɮ""}:kaSh6Jםsks-5٭րqꖰģ~+_' 9-r]}F^mws|rz6pcgF{;5pP_dݥT`h<lng+IwB u*PLMvuv+qd&q;vxԩSt\@_OUG/7g/۱68oHm?_S~v:O=8_5Og痦٬l}Ø=ѧQUMTUUD4UQǻ+//j]tiKOު-4hڅ+AlRru8mC=4'2/>K& 5U7{?|ժt(1:.oʕ+?87x~jղsd9\[K'Y΂]M_t U0]D>j?~j<6dqt+ˊZC֖gQYb+o0 G+Vp\`0333++KDӿfg4N:}M.]J$lg-;oZq]9v}}ݯ~jʕkIɓ7 912շV~߾E$^/^tPuY߭Zl`}TVxsd(S$o0 d,Z[ =z"~wٲeW_x^qW_} wM ;@410;k… ͛{ȑ>9s\`i?Us߬Y!p8f?|IMӲ̙O8o|w```5q$FCCCH̙3D"H(L&SԩSl6NO:Ry?ԩSEܹs{^?<ox<~ԩkXBӝ8q`"7q^^j}/]4<#T`6C=-ڵk`$aMr=n6z-EQ5+Vp\`0333++KDϝ;vd m6۔)S\9rǏ/\pԩyyyyyyh^cJXhSd@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@41@d[_^$IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/body/image05.png000066400000000000000000001473271461403617600231240ustar00rootroot00000000000000PNG  IHDR:tsBITOtEXtSoftwareShutterc IDATxy|?f! $$!&Tv\R,km?RZگm׊ Vm]Ze,d߷/3(Hٍ̙59_:ԒA'==zp potSu?̔"غ'fۏ>q] 󲬬G>.O{_JMŕ8@>KdҶ #CzAoWn˒KMدTϹtr{"R.fxpӦ3Iu<ԡ>5kf%ZLz+.B2SO5''?ot,D7qԩ}=HZ<6k%wU5~)'eݱ٣m[[ތu?fL4eg;D!Wg/a6lm˦EmiaR6?oeu9c}+kkbҚYE%)n=7j`%/>PtOә@{ b0W(I]BoeT_ja")UK=WTױ IM-ݎ3\Hxȹi%:ϱ|K>tHVigK/<9?i _ww[E̍m)ETi,()7>$Ivzk@>ɉC!V<5I\crEϘJ\ A .YW.nc bDذ:~Μy+۴/m*l`u"zbf}:L_xEGHSy9—^\ÉԀk-}TJgū.y+* 3H{a7 |x|bf󗒴l'I QQ^xCB2yj3W ^.չxۙ.*w׎8x|8i}NjD1*j=! ǃ|>[=|9dty*s2߫1ɝ5\W^ID]wg !>_JJJO}Tՙ(,cNQd:\`5ݞ)!35Π(2;j+[vјzRug7*O`<;;ߖeߊ+[Z=9ipwU[/`Z ~5%Nďu/xpA,sq<2oM!"Rw#T~wv}$-|KO&/T^~_iľ"Jph[mYk{teuf{Wν"7a 4cyc 88$!pǟM3fw+.}wL E- ě~ՃX8 1dȐBDzq` SPAد/Ǝm f8$=Xcxj☁,eqYyMJew ͛#o39GIxlOG`>8|1AD]]]]&mn$^VIU5kgU!UiFo}R>zA"%wBB!g}6}V<ٿ^_nuoOZ?;|{}llm˦EmiaR6?/͸禙CM/?̬f.ɛk7qoKGQ=L&~,ڻ'ADd؝W(I]BoeT_ja")KWTױ;D!Wg/aEHʝ;cecƵ ۉH-j:>Elm.vDى)W/!']yikS3rNfktmT0 )t:g15bĈR!ĆB3-~~v*Bca挓Svr]IHwW(o#t+xqJʼn]ϭ:[&<44]MEQ9tjM[>}ϻ\Cf{!\ADLV\4|%mpE'~АܬϖԿ=CAb(۪7#xɾ?p]ӕ+;z)ݱ'2\dcg( kƒ*Y%Vz!>eD$%^̆5_>쏛_D+˚fL4Ȝ`''/]b/[u쥷,g3fzzwsgLn^6r:,9q4Hkר!"NV{uk;l| Q'^:#EMxsiSJFfCY:"y؄,^TҠJm s_ ۳Մ.UG]}_^ӪFGY` #>kUwY ؅8=DuIcGN-'OYb;W8'CtRlv%L̵nZ響̊9Íïk)/)ɴnp]s4}m~E8 }"3Ĥ 5vx.^g^NNΉF*n[t̅X%WYEO'MIR:p̨>ߊuGBcë5b&t5\c}κ fI*D1_ l3\h&Ig45 Z./o:v߱&ґh[6?6k{䟅ުذ:~Μy+۴/m*lU{N^ۍ=[Uwc%v##2||Zy~,w$)Jv~he11I$1vtNfKZ%f2j\b i\ VP;LL$[b3'~좫ґ>azQ#̍ z٦ljE=kԩòlDDpsokqc'F0ԝAҝѺ.e/up1w}Uܥ|mGa-V^TZlsÂWj-X_הV>ڤ""~7BU7<~`,K&m-x]QMҒʷd20yN./!L+ !^JW%YߖUYA,U?IJ9ipwU[/jD+ n7zs6{]?e7r ^S6Z>r\uZx1_:i6+#=?$g̾V՟?G$tZzӉO\TՃX+kO 5L^b.ؽՁy`MΚ{˕watр rc ` ӸyYd KDhjlik?Zw- 54]dgI z~`=P5DdOO3똯݇j ^U.SRm p3΀%ƦC8XLD6 CKz(qӆ+1 {78pZ:tR%K1cңe ld *pZ؇:[]* pZ2ggɞhqtP,(_ b0Ҳ$$2Se]QuTt嬨P7`k@9j5:Q2Scfz+cxa;Gae,eqYLe5Oc+~? s奄ٿ^_nuoOZ? V}{}l1vr|YFe08q~R:璒f9owԍ/DJl kV|7kwod?_xu=K ^WʼnY$:{5kƒQn[rmGМsK=>}EU|:dOx{•ess&DJvudNIɓ.z:][3O.אbWqD;)34I/BlO`F &yٞ3*gT〸ݑ*5UkyH9;yϗ{H%jTl&"D&b$N3ׅʄ#;>8حP}UqYьDu;v;F1C+OYb;NWg[ë ]*`fD9b# p׶k}읈B_7R^YtNp{u-#GKҍa#;E}E!|`09kwT4RӇ~qQwj:qp(iFR8]J1Y #PbUkj %fg|_n$ .$`r}"HzB ~_&ym7~A1 VH1F d" VlX?gμmZcƗ6Q{'""zwYs1ը=E '-F}._OS|.{q7x05pOߢ;G$kM1"2_fm6{*9C, E?<3˷_rƤ[:v_'KT~1FmQAD_ ڳjO~){垶feCb$j~h/:pƥYÕko^£o6xY]A̩=N2b` b x ,M#:6I|!cZU|`;$C.Bϗғ?O)))GA$tyQds'Z *f/iDi'HbD Q'YQY"dȟ'ck'F/*o+(vqEU&-c+VΜ9,ꤹ$I;:'3%FvqS3#{Fckj(,`ґ>azQ#̍ CUQ#D-+Htue yXjH?,v3w?LNZ`[|[vјzRu=/lT+K'oW,<5fW+[nkg( Oυ]$Xy|=5yЇ㗯Z􃿮)7:MaK ,j}϶cES.3W}'Z{˾W>4ֵ8{Z)Szѝ wWRFD}]?e7r O_ϿR}yD-~8U׫%WL74Elܼ 88$!pǟM]tgjӯUueʮ??' z^]]`}1MĄ:׋w% ~"BNA z6࿅ X Xi [/^6 `;1Lo24)e IDAT$w֗z|j3 ;,>R$^ZJlY11>^%ÐwNeU#S?̴t;KG%DACXN;RcecՇkh=Vؙ7q?l* 6uҔL_zB7{ƴVOVoں>;t; cfj{q$z[ݧ-77 -VeW嗛;웯_ZbR`N[pK6,sxӚq83۷> HD'0c4$Y۶Mժ.>> "﬷>xww H=l~99"R`k3dNL4"nol Nkn<|$HD5ژH}z):ՒPހ v=zn9G|Эo/v\F4k8*Do ["M>G+_n- }co@&FlUZ+>boAE {4IDD1 &OkQ_, .$`̬6.{y^͌lܿ6vΔk[xcִ݀x}a}IZêqyT" =Xq"9 /?A#gܻϗz\>^kN(ݙKx,>L:eW}ڤϷr0q 4q =jlօD3ԣG}$s}fde"5bИcet<.Ƥc5:~"BAΖhfx h1Dxdg3"3A.Z1wuGgoͻyу:s5/|o߱?Șxa?K&MӬ#[UAss5WK ֯ ` b/4ZRRro?q|_- /uA:Muߏd2|쫻<%)#5M$Y5Uui}-v~m3JDrfZvAdXO M̘:s"-RTߙ+7Tت,>;D!Wg/aEu%ys&m)h?Jaعt$*?s̡VDDrV(vŤ5mY~o 6eӢ60e\[f:0E7$Z?/m-u )ʟSv@e58=Wؙ7q?l*dʶ\?f"UփZܼ3EmFb~r}օ ݡ+aHk6S?6n{#ʹSY1Hbv[4KΕh)LMU᧫EH6IsYLKW;|b,AYKاyk{o1+HJl kV|7kwo;uY%Vz!>eDD,r&6?v՚66^bDEտC >%2.2$7ov$Nި ĮVFXr-kUޚG=So;N]]JtlՓO鲗޲fǟ9%bщëy#4;07k%=iWD'0cc+ cŶzgSbHt;m^e~ݥ'u%a>~T! QX/nL#?3NNiWvqJ'!"Ɔ+j0R~h2>Gc'(co "2evwxwZkw~?)tcG{[Üvnoq#;VVZ﫺vjVg| #:D}/ٱ'®}HouQ_96-$3bWGi6Edk WWm9da"rW<D5ژHDoITBD" OR,XK֘( ?z*t-x[A{+vl%6=ֹS?$;5qaA$ g]v3u4bmęcJv^!+1B*q1URntWFU YV\6lIΦ.?4NOWhf%3{?]Lz{;THzYiҾrSLbCgkinmWPwH1~^`-b"C]\ T#l""͟N~>gIԫ^tgUEoTpeiĽ+꣘#V>ڤ""~7BU7Pf6sI\{[ >ZRrg-΄XXq֞ұؙ7q?l*ه,ytޏFFze i2O;xgiʤ7 p_eeKEMNAwNʴ[UUN7{ƴVOVoں>!X1YbD$IL Zʼn]ϭ:[&<'ŲQ7DEmՎuB"'޾honWic%FҐ˖ߙٰfˇq~ɖfه-͞;/6s5ÒGM[ݴuJҼ7wLu@E K:ڎ>xg=,/ќ͍~[їE[=~9.* M)ٱ'®03[քonR5;9Kk?ッ*nWE?O_1$GTUkR94AOkjw5Qw<r=֒9&N,n0sɶ9WAD$7Y̌ Owwmv9O"lV}vG.U/ r@PDܖ`BΘhBrL5kfANDnadAkͬVLXR(:`xt)QVFN2ǵg՞ NL9 JÌ #M0y(`֙M޼mGBOh-|:>LUU1Ŭ:FLcc*+\g./,XxH #bWdZe"9)=XYf(Yjw7"#plk[JN3ٔ|e=DQG]>A)yj$-BAΖhF8Zۛڇ%ȉTOKA;?ZיQŽ>nG歼}I1DDJ7noxnWY}kMZ"͟N~>g߈92&^2 '~8e)Zɞ<]h*eXjjyhtuzss5WK ֯ 13犍tobFzjIIߍ1[kT2.q, ``PPc͏ek=_}̨ffb# Ӯ1Ao5:G|fXGFDQttũF|/r("J;:R7|СQp?݇I2- /uΨlSp#LD.lpr:=ֲ9~8D:e>:IbFCCCn7L---B \2Q7 /(>YάP0!yv~ĩ*)C=m ,N'111==1 ^?lm˦EmiaR6?oHٓ3㬊*Z֒N1~{_Ú Gs^㖺 ؙ7q?l* Ghd٨W&*t*ۦL| UVTd}ĬLQѼUUo줸ygLیl0ie6;#ʹSY &B^6FxR.8cfڹ-%*t&i~2+|wjPKNLJ;kiU)"1:}16fh;}㧎TsTmiƦx׽%GϹ+\2JW&r1-iCdŮ2ҡfOZ4N6NSFtМ7 vtwﵳv^'N584i V}GgX4KJ@a#2z{8/-w:IIIu4v, Pu?̖XѾq%'9-5&|mǚk)(x5bg{[G=o([b=/`&iUlͽ΀n| l%{#8ٍ$Iyn<- hl1$ \ds_ oB#=T M}{ 6X Pp`$rD"Eo튼ksPNQq_%}PHk jϡ /_뫵`]SҖeߊ+[ZtïMXlY8?_) VMJ@S7- "|U;VUxC˿ -ZZ~M]|̓nϪ" HM#`Blڧ/Q~;It8{w جԾu "==zp}yeu!a8 %@@@kK0=-9bkc!f{JJQ"|'ruhi-GJ04ވEgN7gLs9==oujۆX+ u8>yQs7WWP pPXx!Ung)vkQ .2rC(ɾ<ݞ)!35Π(2;j+[HI54o{#/|GQ,ɋ` ` 0|yk=-9bk^B—{GSumG@_Z}n_H_ ` ` ` _2S "Sh[/z]Nc!|CAzb]n1=tH*p)(Y-릿,ĎMLg\f{{[ Ke5ó7/liD$\_" 5MmoWg˓cyC_tCgα=]1vr8ٞk1鵎f "R"Rb:DGD#ѽ Q9){m<6Sxt:&͹}Y5؜wڠj r&_u{+KxK#N 8Qi)',っ~ҲRVlCwΞgUTgUWtr9c}+kkbҚYEuyij$">%g'(j?Іͻmٴ(";;Lj'ז䌑ƚ-䎈xx<ewa 7IITiªEKR}{'?GkN؂\`->wmDeǐϧ}ɒtk;望o]I8UQ3sĚ'vu_&Y%Vz!>eD5 CAX%GN63˺}%kVvwәuH3!Zg{g$Zx\`/m#g=z~t ͨHxȹi%-J3-o|"ȺHS~uwGoMdNljṿFƶy"SF4 $׿I?#d)" JQ]_fƮ@ oB#=XAD$7Y̬ݧ$L޵(@—^\ÉԀѤ`ņs[ئ5o|iSa{ymR:+^u [Q4fc1;3j^z=>!B7 Bf,u'!BaF!B5B!BcXkb3Z(۫* SM"G<Ɔ6B!`[fHY[C2# cjn}ŏ!B!E]AX侹Yw/!]B!&!̌Zϵq5B!B_*X3[SF[ #B!Po;;ZAՆB!аBUD !B]q91JA!c!h?W51ii!jC!Bh`}쵧XS!B g^D!B5B!BB!`B!`B!kB!FDZf$jQWU4yYMe֟bB!'a=o=m|"gXc!B]:X ɬ_W8Z\VB!BC֑&:;!B/:6AjvB!p5ZR̘)8NU)!Ba됽jޔor$A=й]8X5p,뿂b"}I&-f)5z!7 ?#f'Dc]T*ewMd%(u-dSgKN+SoT]lGoL.4x7&)a)&rĞ2QWYf̘S Qo>H9eGÔ(@s_X!%VlRNq1 ٲ(﹗V`P}y*,+ 28]N h'9@ZQ59#˷_)d2(YPS;xTh(g6v'hݕa>&Fc[wt4DPo( a:J #B!0XC ;|F5~:b5l;FH@Y4VbP}pha`{~tJ N ^/0Iv;1MfߺMS K-!o~pkK׿^` ~ŠgU^fXG'G֥~|Q!Bh233kjjƹ l^+bKx[ϓv}oa`aU M-9_U97 BhFk4&/C15NB!4ή !BhLK]A8!Ba}XQZ陊M4NPyn'p}J\a4 b(xg&%BVկcص7{]ֲ^#v_l ڣ)sVz_{*β_1WqB".iwvS"tl/;3uO|Bq&6#ɬUhONVŽU";3~uad-mTMX֧1_}iӞ?=O1Ο|?vK:R=T{dZ⧟5`F!c3RzC95E9]9Qo􅄝x($${һLt#:BdV[+;%+ș$~H?>V-TĵQ!K@cux} LL.IuD:4@֚ǦJj)B3Q F&rl"d-\=w|9[ j6Nd^h6+Dg{s.0fI| @F_OHҊf.d RcG.Pu=ܾ_Z)Cާb֔*|]iW; |tߙO> YE/J ~eQcr=11 ҩyq»)4^H _uhmD}ɮ/0󂻿zg}tjgɒDd aIW ן-©H! }0zƱ FB#Oy *^iBga˧K wʇe 3Xm7#ʎR &_|!%R'ٛB=`0qI1jOֲ  PZ$L~UJ=Z[[uh|3l#qsPom11\ύ͒B`Ŋ^]giIkJxgNƂd鉭gϮs]6]E<4cK?~/ύ@'k_*y0)'{zu=zyO~xaQ݇/]%zxmNK^=YxjM)_Ͽ\UobCܓk8W ;D{B-B!FK)(0hRrr'LL2#"Ox@h%`j5WXIfN6S/abU@%s5~0N=|h^MzbPuVQ.1mv NZ0j7͎QY@۪/]z೺2mPb>ho 3_S[ &)9&m1v勀&\/ E' |FWMjQ FApAn{NZɍ&vNGJ:yֶmÏir=: Ru)lB!4 ˋF'جd]&ݵvILRZ%|FVH ̌$&=@'5ϱ_I~vɞ.D0( 3'Dϓ扫· C7C=mq#`0JeJ1FxjJ%  gB! ݹ.,IG6!h.fhWͭLpu짛1  )R%L 狃R6`c"9jBٚ'0 <ѐ}}Tʰ.uڝeeI.&u2@zm{_7~i/O7h{ZM4_.߽~U:eܣXSGso3!0^AGQh4P0t1Ƽ>_JJJWSRR<c𠤬 2!v~88.] @bdݡfV' %{&gu@\SnzB⦛lk| ȭ bIashYpLPnjF1F"(f[F Te 1SzHm,7ü>OD&'x2׫M: Zz=u9:ךsfdkļriq < A::}*RB!4*]<ܞ:.'=F)g׬e_SoԬ*5j zmndZgm9&p_["l>@ӈk _=7Ll:av9U9vעؒ] ׭Qz_gIR֧7'?|o/-"u6yV7Yr%_w~<7g=>3ǽoc#vB!4:3Fl*U|fY, K>pߺ+>2{צ&8fϰu)~/7B!4̚ ׂFNLzq&_m52B! WHOՄ{&~xS8mج`_4s`!B 9xb)}Tյ9:Ø:/O~#l!ɒƹpx9B!`}~vC25B!0X_n>Q]gh݊9XS!Bh}yKaS-ѷ_DKZ@*e+;ja@!BӪ +o0mem4xfUp)kOI5_6@boe 2J=t{{C@ty-L0qGظ5+ib^dƺOדRY]sO̊1(K^pʤY<5ˬ7{|.&D9B?uc`1B!Ш |¤3XI z 3;++{{SBu[}( y]^/]'- B!D2)W:]"X qU:|e8N4-N?X5(u{R!w;8mL퀝;hSɳgfiy^cJ+J3vOLP`F!.n/nֽ+ JZ?)i.d˚z)[5^%]U9,yf,{wc}wI^ A͠#4sW`շi|胷} ->9_&*DqB!tR1QJJ ,cF ]`!ԈrB5tC=QE+W* 9ƗZc/u)1B Eɐhb3Z(۫*]qScu<=m %8.R)cccjussGcicq4bSX^ң^MgeiM<p IDATyhI8Y ECpsu~Xy4<̳T }ӹﵽ~~< ubgD0WB! 6cFJ"쬬@w30 E\UWW3<OBBBfffCCUNod]2.; D+3?[$OPD]Co88[ܑYƊ*ڨ%i: >*1tLVЪ_Z}*۳+x{GTO@Fk%Q Bh}08s8Haj?&$555uvv?d555Ƭܚȟ΄%Bn-vJ*-Y­Nןʉ9ҏʩt!q@H@?#L &=U]j7}{S1ELS=asThf"UM/eN i-ae4oTO@J vo~:^9˩ s} dB4UQe;^\@w{I8ן/<bi^I;ZMڹ&HrIOKAl}p}ˌ+$ZIz0&Oo*mM^I*ƥMK*__9OPj4ߧA:A= k=W|!U_ٙx{g3!qz()[iZ6pKg@0vzj)Ī}~0%(8zyYWsgp,w(/WEhx 坏w!yoׇkz}a|n{C|Dk~VAAo l7IйM=Q̾AܹzS8 L@{Jo}h[]psO:D)oQ5Ы'$Bu#vVl MBVZ)_j^C2pzyr"+y8›,]?G  "ǙԬ}ёIjL( z]+2O9DzbxtcSтG8:zn>|!)pk;pЙ:CbgdaEB,T5h-j]B$IZ j5B7;d| X5US@3I/7* &`N懅µ3+W {Z?'^ݹ¡-_ڨ̉O>u?8+vh5xMլO €ͺJ4t_G#umvtHEw8e@T2uR>w$uXtq`0Q9p'PfP.^|9B**T8 *k ={NSh&d0RuՊPOKVUBu(>c+;3}.C%Ji8.**zKZٵD/ nԨoLSEp:v?ws72|3!Ib'o>`e*@Wcį߭_$Z e ':>CQko/&pv#44#{nj#w7ӹ N|D^hk[=]=#L7u>uk=2}1 yCsXK J ]_^{//*ϔO_>oDxt >=0vJ<)!ȑ# 0#Ƹ̚ .d0=xA''|@/D YVmt4ѓg}t`FQ/ʭ0u@ۯ´#Uٱ}<Baٺ*ݤgS4̢ḏrL~B!0Xds|es῾ގuB!tB!BW>z !B`M4IfZUMݳKjr}m v?B!Р[fHY$DzNIJIxδׇZ QF:wGY{_rB!FTfa;L4^Qz}H^w@Spk/`*N,jE-4'lor:UA 3{^8o|qGC/zsJmvYnv?/トCnּQ]MUr0bYړl+BQ֒y7M3=6$b᨝l;'ce e 9iQaO5IY UMԂZd u:۝W1=]J 3)q<B]aCޘ1QX9wȹ qZz-ӤZdfE|m;TYQ\îcn쌋1Sn_`EIޖ[SY Rj'wnv],7>xLRV|;Klk3e PɖϪ5Uʜ;N׆Zʫ/ӆOJtl:REa\TzAsSig2\F('_i;̖@ruDj?Ջ5B!(ȡ0Xր_2/r*Cvܬ k^.(%]J|s&ѕ[ֿw/_X3/7)@bfߵ"iwEw?lv߿hƙkʮHK,sXW3(o}dEoG B3WբtWYbTG{.z"cd#*]iӞ+ȳwO~^o҆BhqϊQIy9j&6+o JWmCk͠TeWZM[_R[i5m4[ɮ ]jn NTMRcR@C )溽 َ5d#E!ƌsӑC&J]{p,,P_zo$Q4}v9 BR.V5AIg3p%BC ohhpڀu5"~64"=QZ}+LZdvNU`)>Y8kvb疏N8@)Җ}殝)m#4*c~NV#V<ޮg~oH ( _VEDQdt)r󼺺:eD`j=KR==pyqBllS.ֽf5{A0ݶzܬSVy=u߶_r8@4Z Ϗd(#뽦Bz,T}:3(48h>dx{ML16;hBԿVJ_u% >!4;(P<ޫx+OμiY$k&d (DQr~ D=%Grst*˔I0j?u“`N}.XgMU{Rь$ᢲeJNtoH۪iyi*b811ZuJjOώc 2Et)aWs9& >BOGBsB kf,Zff,,\,YTVJf;k6Z]]9M KAr7mrNMŏ?eTРm l?aXjlu7ݼO|+my稯~GX >VOa͋Kw 0=R;->eR ]&,R#:X:͡_$EBH#ٙVu\Ji8.**jjTv\f^m=ym3μF8ˑ#G =FBc]fffMM8|b=:T9*/ҼKHW soP~-rlO!`=γuUhό6*׸;[~!B52$km;"B!B!BB!`B!И}G B!F&>!1iml0( noiN {3ӢZUZ})#p#t';l_nӢ}V$̼{KoqhJLHbZA~{sV}oxCI@Ex8He#]T2X-]rj y䆀.$tf !X-::cl v&?5<<57`2[_NY'/~~vkUGby#/op&PdOkR'C;B+k-K7̈́1*5B5IYP#b<ɊvvIQ:lw^9\Tgt=`=2-4BȰ(PhOBs\!5/eQ1_[Ŏ?:ZTh=s˶2wĔhѶ%4qUFNdR/m %-y|\]05QO~|bVz`tL}% {[o}cO}m@ˍ;ӬԪR.%l.[ᄡ|a߹U=4+V?o>}dUʜ;N׆ZʫeEM,L~aAW? 7dmZy8ju'wE,ĉ?_&2,1Σ+_X3/7)m_ԶgY*8-jJںJpQ̡_}HYb9x>ZЈuW%k1&kpxF4 .=D,'|s&ѕ[ֿw~ z#찻b+/Bs `JC!4৺A-9&M.͛87:ji]ATM'#)溽 َ5d  75.r7~  (UJ ~(1(;:K 55:, ^sǓ_]ljqHϻ9KVca/=p*;fkp(gv Dud1\xCsAh 8R1n^z"VBqX2;B` ȉp>*? fᬕkhۉ[>:v{%3r h?ѦE-ƝQU+s= ]'w o#\)LZdvNU`iO#^P"" Md\m _!0X Xs]zR+5V`^c}>`]+E~cZ) "VBq5t^ [y.vM"^4!H O΂9):W33Ɉ昨mdȍյԞb|vnN @e2)fuvLɚ!Y1ymųTjntΘ;[sNv5i[uu8-/M@ '&i:R[GޝB%@tSr.ىHWW O(PZhNd͌] <ÌqUm͒%=LE}m;ޯjۿ# t6޳bzN,tc/|x20Bg[o^]8M KAr7mrNwKjg?X)l;G}D SYf&ՅMSSO[v$/4ܝ̖亝w~GX >VX'+RDB-t#ևW\Ookiv]b|!eR:n^ykėK! g"fg[sI(pgɮ bz6UV9# /Ыk( |uw?~+#HG[pG^\t%Y9P(F@}233kjjƹ[Ptl z7dyĦj`nbe*FPELw^TB lu3J5t54"ͻ^xB! h!BhD !BaF!B5B!BcMԂ_^D!`.KT5MLZkQk Gp{_rjuޜh>{NíHyRyx;(6Ynvd][ym ÇBaWQN<<57`62[GIK5K{YnZgVEx.f͝>іk5㵖ԥ͛f"8ZB! ֨(N$,3OVt+_Q:lwKjN$!v qU<_h;ĵ&u%3,*kV'bܶlA~>Yq ~o7Pӗ}/}wĔhѶ%4qUFNdR/m'fzr53 &Z$m9=aNp-EF!zrm'w|wYU +]MCN |'u!˻; quĔ9+Rb|pmqQ<\YZ.SB'/u%*eΝgkC-r'BT*Koz^GB#>ex]?UHq(rz? &*Jyo`>Sgp(ܵ5.u  9Q·Pg,rbm;sG'iK>~sWඋWuNn*>pMp8 Ҟ*aDnZx>{<}ΐȂ#~quD! 3^,^WHk_UF~@K'vwl z'~RwI; ֽj\E4BWʝ9m=7ԿvmaݚF:He;k6Z]-<rm;> {z )ro!|q.BN1‹nZ%ᢢV[O%LSsz6U^̋g,]w;__#ڂ{H=fyJK9rDP\ !4effԌsѡ\W#|u*$#!UsopuS5-W._W+0U#B]+h֍^W9>3*ڨT@g_(koKg,ڼ\Lyrp~2,PFй#BH◤} }WDW<ڭ{X!& B!kB!0X#B!4f`D-ˋ!B#>5 b-jgQkg&-6uiUOmDD_pcřp!W};}?yxzQ$̼?8y$5_ ~LJm=_[ė'B!z4婹]/^D婹![R^+_qJ1/Joey{F^_nqDDBƀgE-bpVؖҨ-o']GF6LJ5L5|]3Ama͉OJ< kFق_Ь^޴Hq-㕥Ǎ&hަ|&61%[օsϡVYVUUjr_x"1CWbmT{69~a/JH?=qg;>6!Ȟko~#^9GrSBͣ~͞-;} $H^kd׎찆FnZ%Ǐz ""r\.%H$NWl޹.XW]tlu'<|\m;=| F=/ Qw/?xk\^ rᜎ9rZ{?q` SInP}a =i3U^^/zmؠzw%94\ 'b9D;g+rR@g, Lbmx5oYҭ5ADoU[H\] DʀDh/nϐ>^ǴL>k-1fLޮǼ?7:nU\ITP_+lòyZ'gH~*!5EJ L^PLx%<{v7TqC3;ɩ)C Gۃeab<&{Cxh!q8r[{Gy:)#̈L^ro5վ#;n#$ +=o|~m>/*G@aOeۊ֍cSH̟5?$Cnjގ7}d[kTq)NVk{8""i[Ցi\Zg=w ;>\h19qh9]"jnkj`m~\"Qa횞Ω8‚2^|1ڡs\%AVUm+~39pفӉn(++d, 0%&&Q|dN\Z'OTMDMDlX|MKL`tBFB$>u_5U}qSA)[7٬ʹgZBwg^ئfyG󅥝v_nk~{EsehSA ̱'*?^$QSА%( k{`` !j\0Q1 mx&b8lӦ?5~72Kow_Ii+3Yoe|ŏl#}ۿa3k?<,2/^:GPaNۓci94|3mxg|` Ԩ[ZZ$ 0 0vuuM1r$?. /e-\ cX=g-Icrr7ל^d^8i-WI/y}KCM6ľٌ%˟s}< sJ*ˍNCʞ\-7>%ay‚4ͮ R*PCݖI۶8#7 n4QϝO'3b2urrD 5*oMV\vԙj F}sT# _9yIHdkYjgk܍+gZz5G BIbQor”j2}'"6jŎm!*vu_Tht0ko7gƫy~gQI ?KRk0n![Pozˏ ~g7^YZyǮ*Xx/eU_SW|&"4@x/pnYLhD*tsM҇{.or L.M4-^IϞs?#S#5RD%9[q5K/4km"q\Luظ^ 0J.6&&` YP!wqrT_QDD3Dg)'d4bgsgOV͛"mœ[^۵RxM@¼@9{OQwS([U7rD;(%rMnб~"9Y{Y[j\.-gbY)^yn}Q?JX {*sV|nNoGY|u߾jgP'd}\#=O YG*'yi?mƲ>;b>{ԁGD$b:*~|-m@IrFH QntJ*!OXݸ%N.U-=Tf]믬xG=w~XL]kM$S>|k6(iUޚFѩ3^Զ+NhҞ:-f>T/pXaXCR +G >)r5e.RVޤO")@9UTNy#7Uebj2aֹ]_Vt WSt:B!wܵ׮6p"كWe4A!"\c,~]=Qog G}-Ŷ7c˜NCP(Z8%<@B$Q=Zt9]-A`YJiys}}E>naxU! 'r6\,ܫ.:usp˥D8GnL>VRӑkObGe"brp"=zڋ/ajq *+lI[__$yt'LeFQK"&sv ύ-oܽ]Rx.ʕJɃ%c.3>RDBpMH$Z'$ Ij޲['o\]g, Fl\D$ "L75RӑgKY?}qzHu@{yǁ3soc RV.H$*]Bzb(C! IDAT$X1Y|ٓAk_rQ&gee"*s^Ľ6nk{''I9Bg2DL1CZ8N1_]("3GߩI2$ ]aLuظ^6Q}""˪ yL_ՓTӇ΁#`~U^b8ɂ|ΈFL}営L]gaVzܑ=`J"r|mXmr<7w׻!237e˷d}\#=O Kgw?ep"Tq͹;Xg[[W.ؒڮUMInx}߿Dp֞;pF}]vֱ?(Dl@¼@9{OzԸz]ZhɕN^?p&Pz?y|o_Tžʜ'_J̟5?$Cn̎Ttixe>)b:*(|Ç{܎""&s)^YFqt .+++}qDkz:UxF6Mc2^|1ڡs\yAVU RgWmuf_ܰ♵IZXԉFrs/nG8$:ڍw78uKKD"a[hhhWW  b<7_|\"ɏKMzyRulߝ(,owMN,bǶFny;M?*4K rbjXy̅;V׫T4  ^^>9g#;nDhLï݌t6|x XT:`J;t ؜P/JH?=q{ vsMEM?3l,Mhlk$AZkuwH:\~{?z2'>f|W\i΂RKL^7~:4Z ho^`|P(9|("H 'b isukzܢ.$%1h܎h 'woL譳'y5kDZ$>^1h]3 s⎼?7{q;oE""9o;\wr1)d't8 ÙL?ϙcG"kPniEzٱh$"'ϗ[~aG;(%rMn1-'+佶kåx:kKץ\؀؅yrr6>u'+ssw"=-?_:ss 7>62mWF;9vWn[]m'vwEo۽Zv\td0@8_V$"[?^,^q͹;Xg[[/OB7A"b:'""&s)^YFqt .+++m~)߮||&(#:g̵$ ylU}XuVhf^qe |jQᆲ2LƲ0\bbluG,t9Uh:rS5e+|sc; )H0a*?e&5SPQ3v[Z9\@h)r V4-P +׃E{CuUB4u ` Ov_nk vU^_ P߻^qjUW$mڽ߿Jxزç Oվn#HR/e-OZ\Uv;'51;^ ,su199_֎wkx|Q2{/'Tf,_|m폝XOo<hcTRYnt3y$T@ u[z\',Hn +܍;#b2ugxOI.|hkְt :Z%-xkw[~fAapXͩ 5"w+W2EiT͡7)冠ʛlZfTգ^lbcf wbǶFny;M?*4B4Hs7毜mP0.[k.5ؠUykBET[_QUWFwtւgs>#ݢ ۷2G $`C7OJ9$iZ:pz,F$k{ZKW.ޙ o0'%h ͆~ӽWBwa۞lY^=ZeZAn_T4{?5p JgtSؿ:Xnёw-΀m^׺Xu/|3ߌ3^]1lʆ4h 'woxȫb_G=See`:`544$mëy˒n}p 2D}2Z,@ ,(#%;s4 mmsť9L Y0ihA]:aZǀ1u`fT?`|=|3\cZdA 5L.w[;9M 38NM|N74C2$ ].[})+j$D.!=1(pU0! 㕿#T{Gy:)#̈,8ٳ PFr4Y=_k_h&Lb9d 9`k?PniEzٱh$"'ϗ[~aGbobTQxo+9w\{kuGq}~>gY"8k8ycҹԸz]Zhl@¼@9{OQg幹 /y?8+=o|~m>/*G@aOeۊ<lLESɉFA\.WVVVs[P#A Do3Fد8I٪z߱޵N?+'q,:΋ *PVV&X`KLL4ӣ.5=N9y~ʦj"UGOn&bloNXe4"{u yI*HSA)[7٬ʹgф=3M; KG}r 0s/5&h);~ 〩 XT/ X#IF'ynaP *u.\r{-S3=G?qWJxeޅ=SϿ[v@Ǔ} F.ǥz_Zl_/wNjRd wX] ژ/kǻ66g<(j(lƒxcTRYnt3y$T@ u[z- Ҹ7&0>نr7Ώኵԅ=mJ$%Y/djyBo~M+UBoc7.DFߕ^ʘQP7j\l*oiQ}W~z]RWK\g.ܱRԊ2BT5d7ϱS`cr,ՇBS%QI ?ZrD?wc㲵R JZ&+.DjoQtLE 5֐?!6<-j5)e} o_mhAkjC,^)xg.5x6 BO^ ޱ3⇽'n{B%cXe]x?j%k|QuٲIj>*uNubG\j`EGNߵ8Rsy]c͗>|{X b5zz߇w_ޑ$A6eCbmT{69/~ p&.4빗7-n굡c"*wvXC#RpaO!^0ڀMD<+&%}Ӝ5myiץԙn6k.dޚUָԸ#kW8mq.iUU,O|oMɡ5oc"g69"gc[x,NJt_EIU15=n^YZLNLDD*2)f},<&We4A!"ziQ(6bcU*'[{XOD"QA Q%Z8%<@B$Qy^6};UϳR}~U낅{EVwZů߹kQF^P)D""F.'eh~5L9=Am ٥jQ?8np7QLHf~ndgm6~ 5W}Qi"H ``ľ{NRlj.>i.&iHچW%:Yc3) 2̤~S3J 4DׁP6ՌZݣ _~ ~5{fރu(Zɰ 2jsT&흜@&ynf0Xu_1|Q&gee"*s^ĽC?LuظH!r$tܪKY$V#!t 鉡@#tY11c8 do]J 1dA*b G0ኵ(e"= XV-m#ʉo7m{gRm(7Q>Ӆmow_Ye/_u13VF 'uolJTU|ΏK|!r$?.{j\<[Icrr7Վwyix|r]l_/m7&d _S,ɓycc3/ee` OJ*ˍN%0DI*lܬxV',Hn1@ u[zph;?90maԅ{V@H2uC>)d<~a-ODF}sT# _9yIHdkYjgklPҪ5Yq!R{ۍSg-m;VaI ||{L n ClN|RlX;J칦_b"妿WV+IDAT7 1?K-bW;D?[\K˛|gw歺աU8AAk?sɩ5sR~ӽWBwax}aBB[ث_lnI ~^$4_bw@-Y[t]3 5w׵=VyWٲIj{'׎p찆FwػK80kY?P皔MsԴ_^Rguoinჵ5$%)jK+-.p'"b isukzܢ.$%1!LN ^}i᳢JtFIUdytߛr5e.RVޤOd(5Y8ޚjCk|k]mD"S74NU(d(zrSX ˄iw;} kaxUɘ>"IsV_ !(ՎC'04rpO(zb0=Am+v.9L\+""g<H 9o,[OCSg, ̺bmx5oYҭ5vKD 2~2AYRWX"HVI&nf{){ LHf~ndgm6~ ÛIfr>1ѣu9.w`&T?`|=|qD{&+>-^IϞ#!":nU\ITPHdcĹ'+5dS G$Fj T_.E5=Ox0ebC̓ $!<͌«39pفݱ 7d2Ņqf >CMOgam'SN Dkذ([囓ہfHmU_@ SA)[7٬ʹgZBwMiaJX H,*j[xk|}q]`Ɇc%# OZFzhپ/45bZםԥۗNe6$v0&SK]7D{/T:0]MDDD䬬F+p`mnt61ڠRg"5/W=hoa-? {>-!~ףJqj6 co0%17eT$`::~RAr$?.59Xeb_͕Ֆ3{k&篽4&'G}ZsJ%OZ\Uv6zk3/e0|`#aʛ%yѢqarQ!CF{ͪSmby‚4ͮ , PSwz rz\&?L``j 2~ SA@.ªD 5~79aJ5?8D1lqZKOvE%Yzem<Kl7jM5ذPy㟗ȵonF$6GWßev!&w_hD%Ͳ78,{+AIdŅHm7Nxn![Pozˏ, mwIt&+|Ԋ2BT5d7h'bW\Re̋(_m TJD4J#?]@ XJ ||{L n ClN|RlX;J칦_a;uڨlr*Bc $,wg@j6k{"妿WV7k'c/nO)1¨b-Hm. zM[>- ?{%${Έ@;;z)ua0~^F| wXޙ͞-;} $H}`m]<-V(sMJ9 jKM/3y+Q$E^(#GW}cODd(5Y8ޚjCkeToqDj|OqwwY=]6ݫ P /R!8QK/Eg{ei]HJb'KNU(dCx{]{j'=8xg3ˢ(ctdRa[f LE,VTT,o0 */ X [O5kXc Z0`X5k0c 5`Xc k0`X5k0c Y$)IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/custom-response/000077500000000000000000000000001461403617600233625ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/custom-response/image01.png000066400000000000000000001531221461403617600253170ustar00rootroot00000000000000PNG  IHDR`K sBIT|dtEXtSoftwareShutterc IDATxwxTUI#I:.  *{]Z߮RW\DRIIB Hi?BBB$0<<0{νgϼ93yd@DDDDDDDDRp8̚5(|m@AhU/$éP%""""""""nrdLzz&&).K=%""""""""5l6aР~=!CBBzHDDDDDDD \nngm2Y0Mu;a0LEgvӲE3,yyy$'tB&*v; <,J`߾>α9~,ډ'33t,6E-N T0ILLBCCiڴicq@FFfX&}|DDDDDDDD_U=rmN:xڧ?sX0Nb_;dܠub?ԭPϧъoHLst0"ʼAbW&\0݃GhV^]biٖ>B$""""""WWºk^2kRj|︊!829qᄈ'l<}k/L8O7YtKxf+ն˧w$u?x3)>:/gKsȒm n+.ug a[a a3q+&\ܦ6mE;> ';yys 0iq<>ڇמMjBۦ/wр.w=ÃE/},'>miqSX b4h e`ׇؐUVLDDDDDDjK^Zid8?3y0w#ń5cmS}?rF4ό/.} Dlq~1La+{ޑ}fgn1h?b0/`O^6%{@K74!INv\Dݜ4l75M򢙵;.g`[B;7$]J~tn뎗L_ᭁjڻ|oyH}IKd+hr1N'G+Vk_>EÚ5XjU7z""""""e,BɔEw6w1gZnC;ljz&Ϳew*grpCрq_=&JF츁#ɔ}c` AD'K }c"Y /~,a3ћ8}H~9}{ ?3t` Hs&ngƭЪ,( ֬YW4 {+(r5ye*]<3[Z`O66?|`à'|qmG+M2X3uYgm)GW?2o?ds!L79;oLO9j0}BQo5 R8q2A^ V7<9?*}D/Ao͓m<4wmof߇0OuB?q?gYr?ޒA)+|Bq|> FQn@ d:.vWk֬j7R G\*V6(""""""`wUkZ3yKtVT/C|~1}~7SWMf>|am}8 ^1(VN~W7zz:[-1ЬY# +9n'e_Jfsv QkkD39hۭ>w+q|ejtvHJz} o1BL 0(*VQ)@IDDDDDDL8jd\). 8=';/\adD)3l#l?]oDc>z\8KfђC|6//_ÍWuK]czI;6HZF\1zX`-_aVɆ<7u6fN} GNj3uL[Ĕe,ܝu\p&(ocO#!ϧ.\l Pn1;SoDk4F&'_\aL]Xf-˖//Ÿ.vRᕈUOBxvD^VAvJ R!q$W|C yn -YǨqT,z-Xf Gq H6fyεދ͛'HQ\KX Þʼn#t>=Cx}G6/@ٛ}!~%}9|4Q^Dz2^TKO<?X_{6'$v^H{&p㽹 >|.?2/Y%˖LDDDDDDj=cԨQCK _["U2]uʷxtiEꗞ\u6[2}udegf: ào  k{QUap84ĄKv4 ީg<ܳ׭[r{у1_ϛoCx-\nW׸ S.mCTtϙCFF.#~m%mMpuS7mpRѳ'u^nۅ\;n~\.)))5^9y'MbaW3j6X<:}yOL:Y` {`f[&#:|$L~_x-nsѳL:INvns~Ü搝ängiKT %軼tځ6M'A1xJp8xn A6mߠPZ sN5?Ǝ-Vj԰FQpUʒt2'~ vs<}¼K?_LYD{6].TF8p ~E'¡%Ӣ%<^XjUȊy3OW{x@yׇ+Z4|(;_'~6~:ȳ^hrO2+2C~'=KkQ/*RpVM:x=[Rlmf[I/cK jJ3=YUvv`ۡ,""""""RڵmGÆhӦ <-_ض}GE{91y$̝WmUyxըa#>xm6jUƏ+W =cU\.X7.xY˳=W}% 1Cy3ϲsNRS@Όq՞z.+~/_36%^$!F|OIn[]<dobWF}᝿<?;*RP?2r%[JoSz AY|$<ÄNv,GO ͮSP4hג?` Gb`Я߀Jn_j+*<Ȥz|ו^4PuX}`Μe;zt^Tod_p6}z9j`<ÿ_럼޾|G>.7Ƕ&{Iv,*5e^e3:kT^kxpHCL /:JTN4~4=gsQe/t NHm(6ϗ}؇c?Bt8]xS3BUixU\4 o1cc)~m۴)wơuU~C Hn';3uV&E>} j'DZzZn?[`` < cn *x+6L5ù hˏ8lzr99M 1*pжmLɁl7AmD Xu *'+-ZhKvu8t6 BC ћk"SmNOfvC_Zz>(#"X/83|}C H\cr Uf,L)Ӿ+`e^=/ye~ OLLuִlќlHH=4+Vdɲe5?(SL&.Jc%qD}^nL_)[^栆G~D]\u,i5~z&tjOڶRלɮye 9}vxBBucx>mlٲcYNDDDDDD.w999|w 6@oB'~w z&:*/TahќĄGhҧOM.^C ה:thM!!^<;pmu| tDك.;V @HV]uV$$&VYx4{7O~db,]=!ɤ#NK O]O*iy]" J򊹬޹ bt j&/%Uxy{* ;ӈ)ˌӃ/66(+2N)L_MFXOİp?/'"""""B~~>}){W|LЫWogZ"H%I>|]Ǝ[o 8xcFڤIٗ_}#}Tqx`5jبZ+bϳ3Ǝsr;vc*զAouҥsB^hJ]Xw: #࣑زWjznpXveӵSuXpe;?$.}a IDATEPr2ȴ)Z 3;yxAE7%0$ YJЊz?_J"']h>޻uM,mVS3HMKͷΆAХsg{a?0-[UnYEך7on^|ɯa nP5Fs~kJi߾=Z5L],dgzɵ2E yfn'i|3iX_,olġd}phNЃVR/-C{nz"qYnL86Knmݜ&]1sn#ޠ=Fc4$m! {/;љ],,a!| lAh ݗ}lǚ5rtCYX3oM#GtlMơ4hւ+v{>8("""""I֭9y" ng駟a8@V-/w{jR @Z>>Dc.P{-yGiٞW7RS_uZӪ͟gwUUxhlj=U>|;#w^n?Ul~k|S?#->B"o| ڑU mK4\O}(+,b.2hXZIp?`ޣ il6 n7WVﻇտa@~|rFqs75_5`1j(!aWmBW8)=3~|?#kt@n?HZjf]lڴW…y =zW^<̳ b58@Vi[lذA^^4. ?̗YECDDDDDڷC=LLL4}-' 4hؐo|GDDak2hpl,f!'`9?ni-[kXreם'1y$f|*ғ h٢YWR\N' Â?n"iۮ1DEG9dddchUwF2mc:DDDDDD ݛlvY.] ]Պ٢Ղ+J=X -LNWF_edd0/ymh$uHٰԹBs1&WUDXKX}vuoɵ|ZuY UĤ.%oɄU7ȥx`\z1[,X}jTwĿU}m6އ*1[lj5 DDDDDD;x`\Ml ּL&_\.'Rga\/xja`Z0~%WW5 ,+ˍrGDDDDDDD.aLfL&f&U7W& Z]DDDDDDD.3EDDDDDDDk)JDDDDDDDDV52+""""""""JWvR%.Cך6(""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^ˢ.,/Ζ{}ē_ خWu넯ڝlI̊'X lJd\Vl`}8DDDDDD`5py=|}c%ghu0apZ`5iy5w~-ӇDDDDDDDNEn٢ Jt(S]@Zz&S͡c->_@Z^6_m}5i ο Om-ZHQr})kocP^CE4'g_FC@Bx-v?1yyvf_R>W`8#nJƁ'gٕ)Q֑qߝV7g[]M@}0cNKx˜Bhw3okŶŘM\?¾37纾3ڲ_?OւA_⚺XwXOHk90JO{|ƃWSEDDDDDīi䕗۵??)?Ő[m-oŦRU!wڨt~2X<w2ßeǞsjз?2X2o%1ӿbm櫩g/x#z6uM^\߾4-=-;o{#pGh5Kw=Oi.wlV0jх IhWxn/svC["v5#ێ& igxXf{L|""""""^y~97o7ז'gSܝn59H&zL8REu:T#Va pæXs4f4.~>d?fK+ o#66{+{vngGƭs.QI2ӶxBrp؜-\4i<؜K(lֺDI3kycjn> Þ{> M,ݝ[3mmYǺ 9wleuSyhJTTxiAgn2y@bw)/^E݉A>v$f'{DS_?Aw{xj4jcj@-,S36 xᩫ 9D~ WLxMH=yx7\vЕ*pV[*gj69=`TwKl_b6^֟*M 2Xdݮ~өv#?Ԅ#x!?l9]^KqJKYuA}>euate9Yk2BXt>u u>i]^HCq=Ca{(.!""""""m:24eƵ-HcÒ5T.l-9!yT/8^ͳy-kW3j\֢yDmFpӂu%4K~֞bFL{%9|m6IqnsV6.3!6 h`K(4NknLXv`_)ӈ`躘VҠA kCcWLeב'< -Bۑu|){׈W-~qEk} WMruY#cI8jA۾O+.}-$$+F4U 1mJ{͇sIRMN6/NcJ_c*!ރ* ?^$l _mEwr_y?NvJWM7$;v䈩IJ'!jk~&'/w(V=rذxWzy!]=#3 ~r{)FCcKlNIPv#[^ɫ~ay\;?θ(noerv{{tNMNP~=l_.pu'wdсKY" 6?E)_2c7sm;0c8|1>J^0"tG$):s?t4^<ֱ1bsɈŸƐyyx@xs+55ϒǪ6\=O{ rQe$}T8WoBg% 2v)n5 >WY\oJg;W3WޫubIO,ϔw3x9ۙvlZFyG.xu[2]t"!^8Cz4NVgrS^V2ӟ?j+ 72I9>S_9ԵsEӉVëu_񗳂+>퇏.ټ`. cHa3y8+l:9_U ! zt&2<=¦urL;}5n-`xm%a+_Urݹ.Et?8WdڟY%EᓵYҹ~Pj{oRJ *@Y|}m4f8S}I?{7oWc3ӟjv36KEDDDDDī*5R"`rkˢmÆv%*vGźsyJwVڝwO>χ󊶥Y['tpn 8lӼ]$;697- ,gkͽ#9'hA{,J'!GӵiW**9wZK0Dԣ^HS]~8y%6=ҷ2[驃M+X=U>u0i S/=ѿO*kUpvިC$8YSC يu:爫׏{}D%&!+S6!h:Q#DDDDDD'3 '*4,~#}N'"Fk^9YC\!}#ūëu3y]{?,Om&Yf\җyr6Rw=ٍ^:qeH:wjO%}`N9%Q2XA';l#nYyBgu{&b,؆_~E#15ff]0oK[S%%2pwjk ܟw.=~3brT|Ϟ2Xubyp&3U)z#?𗞚&"""""""%>|{ Jsw'Q"*I=?anT㗟z5ʝ|Kw9 ֞bFr~z~q^TwRlᓧ_{ ^LY'9(G>4R>j>?o+v\63yoÚ~O]7ظvo Yɑڷ?r}@ 5Y|Y5?̓M5򾉈#ذr Ƀ~_:r\P'n6lLk{q{vfB:bkkdmeƦtTFz+9ļ <8>LwԨ^yJrDۄQ8ݛWMDt0Cxy$' O@MW#[Wbˈ`yZO/|^ GJs3"""""""R,5%u/cR%ʍƚq$%:.Cx!\ ʧ{O"+w{*t~YUbW2Ub`Zތ+ZZ`D;3l̍'"̺kDDDDDDDƘj ruzҊmsǮat )I(:t>^_{gz-;]g+Z>+19+ O'ܕC?JYSv9hʠ%6=q[{DwԨ;hJ!X2\[V3U Gd`יk`u̙1OMw寳BKp+4v=ͧ))lSvUOzuiAXH 689s?o-$3yi@FgY1?rO;yrHthQk`F(jS*ǖ V DDDDDDDD@6 DmaAT܄yr۬.*k"]_fa&~oEXe5q[V>b>{o' uw/+v_7W+r[VD92uAM>3α-|{.^n"""""""R3LZ嵧<{=h =~q?OLzu۰uѴ<(-Z$O_T # -a$r5"""""""Rcj!ßdz̝9%;sdvisoNgx z[٬J"iQSwu9M})nf,Y=C`wŏMhݖ0_|.&LZU(KKyfZ#.g2X+9OcҔ7vKx^j]رM^)U)I$Iz)^}`YnQ^ՔV2=2b\XX%z4L Qe~//"MU: .;dB6YdTNQZ%!T£5գ@dMA+לԺY[T"{y1ddD?WFA:+R,zTU[W>O0=7nkפz: ޝ$I$i .ad2G$UQjf,)rEȉ$iPڝWb9+_V.Θ1Ky8Q$ jZu3TF/]_iVKy<<4IU~TOtiQr!?)jlkY$I$I)^%2VdDJ$Y! T()H,ɪD@U2"Xwދx[2Κ0l Y+S-_X$y9ms^@/+j( %X VYDݲ $I$I~&62aN ;4,jg5(qΊ6(آ%%;|يc*Qv&߮D$bsF.IRA4b^RLxN~H2iZ2i=U|Uӹp'3i%0 BY͸t4$I$IE򪄱+}Js` dž$ҭGdJddgAsb{uNFWl\79|y)2*qo2H2ezTVU04CZ@f% bpq}}\ֽ-b-I$I$TpY3g0mP߼v:=hFO%I$IW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYi[Ռ|L=Or׎r]uȍ .+>Z6$$o|LN$I$)OڵyyyT\̭6ʫBnJ$I$_~.LOݟVk6K~>F$hIwcT|TRu+￉kvtZ3I$IRO֭'NM8nݺQvm;M6d#Ηo̬O܎hkޱ9⥅ 7 g VIr~͗.+0?XŸAk8;ﳴnSv~ۊYu(וz\>DOb$.Y~[̫A,xXU܆ I$IRJY&~!]v{kW8q"ݻwvڼԬYsj' 0eo w;֟+*cւNp2~~"Rԥ$n2Hh}ɐJ3>gLA/d5>2;fcKbԯ |5+j~G%I$Iծ]'oM6g}F^*sem6ʫ,XxWy-~>5YƵ*V=k>qph|&E7ՒO73ɼ()I$IXFu҅=z[oѩS3f;0jժW9yURzRb80E,Yu|'];&O^ˡvz4lPzDI$IXjբW^1bو#իV\TyE, 6\gu+*gPX $C\(g']gqſr։Z%I$IV^zC{o@޽+իWoniUWm.!1wʼۣ^c) •L^CӾ&tkEp_z+^*Wkֺ!$I$iW^=Jnn.{w\WA=7\6aW^+^dƷWZ1XQ}m\s󉗮{)^?p9)xxǚ]}d W0q,U4^Ȋo$I$IF1|prsseWklFع^3dȃGMrc_~WF䆛M8]x 2?ݹs5 ~E-(Ɗ+-Ӥ `i|1Oggw w<VIKY@9_ѭq6ݎ.MP'oZ'¬^of,-S9 VOPyD>-s%I$IJq5o"z,W.uL1~{WWSs@┬W}ln=j8UQ{NsiЙv̭x.9BNe Cs7y 2¾?h-9V#>t7\s'w)Յ`?-;Įk&(cuw$I$I99W?yWdշ{}nҲҰ}w.zfۭ>U֬PvʠOvMN,dz5Ze}v_rg8|4w8,M̚9iS*$I$I$ZnSYƛ[$I$I&W$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYW$I$IJYi> I$Iq?mkoI$I$. J$I$)emʫ0 7Z$I$IF})ljmP$I$IiA)lʫ0 I$?PK$I$I?ֆSA%F4ݤW$Z[aH$,)J2bQ3E$I$iSi @:qr3b1(i62%{J;VcC^$I$iS:ɧ K۔P;RF$ (ƎL$I$IVаe`FsdӲM:&)sZ;l,EбV$I$ICsokFk/zF$I$IJ1 +GQ& `W$I$II'ne^ZIQF:iT$I$mI6epճߕBR`ag+1$I$I_*eëϗ$͌}&I$Ij)^N9L$I$՜]$I$I)J$I$I)J$I$I)Jqq|>:. mI$IWJ)=p ǼqS:Wv}z&$I$4IÁQ7BhHAaȤINK0|E/5wȣJٿsm~H!|T]+䊣BF2s!DƶjVFZ Fb7y,mI7IɫL7ű>k!I$I^ t8g4DO@"Ž#\>I!P`E1߬Nd?A"d~Q/畱<Тa%jdƂb&Bo_^Asp`%no6pkv.U]lj~/qz5uNf۟9D{a ~|Xq_7K?l6lOM7iK3qE!a,vʑsp $I޳ -#U>l)KDIRT)6eVupҟ'LgԨU$d${`h祲!,059'[K8kukƶoWzyPy攫xcٺPGqG0gx^Y+}/yI굨zNm$ zk4zFδl4Bzm4#UkxəjQȼ7f)Uik ?~۞م!aC広?q`lԞ}+% ׏]_Eufny _PL,-FGp]h·w]Yt_[̢Jm9慡x>7Bķe!5:W-~9^֍=]j6~dYxۜToplm$IT`xAF*WT4pXl_ = U5ۮ~jMp2J,eClF՟-zH_9i2E}p;]/o9?-`ޮ'NEUH^8eA& νG ~\2|43nk@YКw\vu4ܽ~Kf:6xWHrǿO]jʏU|}S݇Kj{X8ڄn{CVG9GiW4?83}79y}?/:3'm'v ;9rٝ2.}<'N3U_}g;ſ^m#Ao81{)C9g9;m>Ͻ'~xMf}7OuEdC{sOVT缍TSc=+m5AI$IJWP@b͈X$_jF\w]F^q؜WE­+җQ )x.G7]gW@b#\5b͗`*f~WazU*ǨBdǨO'=҂auS7q~vn| O_9yxŰ?A=lК&->{م>ca9aNM?)A]vbo3ۧ}+Bm~Cu @Yl[¯cma'Ɍtކ~N#C:dRAe";.BjѨV˗թQ-ʏF0>m]zŰՅ!9+W|W^"ߗw}.s;jtϚ$I$$ë?(HYB(ͫP!qX2{U!H&u76Ui22޶`>MTlPuW^I>PĢ藺ㅬ`t+Okhc͜ș9Zŵ7=` _pM:V>bΫج\tpZ}J)X'9_jA2yn "Bv"KRyvճ*휿_p:k*ucc!T[mr97ޫe{gvzA",[Vo??;q ;8iEM$I$)^A!QF-,o7 J}#г~@62Ut+n/4l6+۞?[G֧&+gQX4'qF4 ټ?n֭,{5O)`<~$sŋ4X߉rQ=0 y?t7tjTLrx_6^y< WcU lyU~g;W%+ւ#J_k3~ǾU崋r$|SIB5vܥ!%G0Vkҩ\|γdv@y*m8I$IR*rF?*7=Aye)I2y |>?j7Li;FU6a]\NG<%/+c,_AϚNɉ WXoy)KF]J[8q3ƲisGk-fт -_|%#Ӡ\tEOZٶHKMH~HݬE;#'@2cGN8fG<%ǩPj@ъAWpv:g -poz4U~%amW1}}]D3)9rѭ8|t${8׀ Vǝ q V*y?{/t='ӝُ^ѯfRڡ.o0'яNWOM~u%3v^rMpb=mPe;NF xWz{WȮI;}}J.n$I$K!f`)A$eee^]cxۆ<0YūIKH&$@4Hlkj QPPS5sD") *VfT%Ńo'䚇gJ_$Bs=ufS"%c4~,*j>1Ƀ,6IX^4iR$I$R6msH$I$m%I$Iex%I$Iex%I$I' C0'$I$IRM d6i>0$I$IJAT7& V[a$I$IR̾olQstΫ0 !N$I$IJE&iWa2 I$Idr'k$I$IJIDI$I$*+I$I$,+I$I$,+I$I$4@$I$m6 "J$I$m`+APO[Zex%I$I~bm!ӦM哱cˣI1ԪUއ-ZVX[RW$I$ia2uw ΝkpJJJ;w./"S~EVYy%I$I* ?$c? mڰoȭUJ1K1r8MOrVE[TW$I$'0$Ldbt*E֪E|RW}ex%I$I6!xZk )lmm $I$I| * $I$I $I$I $I$I $I$I-IЛ7~dclҶțrGs?׋BҨT ~2ށjɵlr%wOm+I$Ib潔g&~qZiMsԲL|N\|߇E|HߓYofA[t˅Ъ6V/3>>^`Ȭ;U$InϢͮ#/ a&1(zl[-h(O'Q7N8cA8&/{}>ˤlgW)[tx-Gna@9ϙ8fCox2q&ydRŮwY(誏 ٦#4w<ɝ;,gܿ^RvK><ٳ>A8WٗlwtbdqN3Exe$]AKJ&]fܼeepih0^1t>=/Oc<5z*3KӨbG\x'\;NeVQHMv3B$I$maZ~ F=+}MRtԃt=`$grⷸn3W6=AY[|C7Ymr'9aLԗ؇:K_rq~NnM%qjѴ˱\uZ'ʆ~MLf7c忎}z>UyӨ!UJW*\RxNd~7n| ܉,zA{{"Z抾إx*.JN,^9uĎ,5k~qGJ0|I.^o7%}S5 HNHoߓk۟Va!﹍k \wqv\9] _<G 1\~?8*w9_ )љF0`U/|n7vqYAH&:~"S{ZXLV~ $I$I)-,_]DHIcdc"@S`Z1 㨖Qy_Ɍt-UG~mدy)ͦ05֗cGlJѷx8sbU:tڢ[.cgz@n]\|žT"AFz/-%@Rtls| ~a)%^Vތ%uۄA.VFjM@$I Ğar޵ OTR۾ әVRи%(mh ?#)?&G[txm;"7= *-vfKљC"gκ$T[Wlt*yyxgi5v:ǯ/ 78vؚ_cOBl􏫸mzKhRAʃh['Z |j; ~˷3O~ΣN3xaAǃ8fT]5 v\M@)CA|'z%glX5Z~E]%{&V~ $I$I];6 X S-#: ~zhq{lSYf v!H4ΥAU|=]EXDhPvɉQ<7j%v|ai"d̙L:o?h2UVgT:#zW'$I$IJa!%8wy^wCjw0fv.Co֜.|Sy]zdbA@ ^\JNND"Tm*^7k(I$I6+Y1q|1jsxX2$I$Ix}HUKrU,d fx%I$I6+lD&$I$IR2$I$IR2$I$I @6F [?kkKcx%I$I65j`,˳QRВ$I$I-:uXP? fF FJbxs˼]kyY?\t1Kdإ{Na-3axy\뎹l<)͏?Ơ:P?,~Oݷ(N=o>sh3;1!2=,e#ovK濹iץ<{|ZZ~ \Г^={Aq^HV=$I$I-:JMN%C,#G҉1HTiaAIchu}qNTU)~1>XndɆ"J'\~xΙI&?X9삭̻|[Ӳs9Pv=޽)۵ѿC]#I$I(d8틸ytP1 ߋ!gڭx ~-SFO~E=x<үUweߜicfA5b]QC梟]EFrSX1 ~)^}Op)d+I$IK̴R͔GoE kQg[w"̘I7|sl`{z 3b;u1 ʗ.fIiUt1:0bF;z/ma-A ׌e5?vż9?m婵kvYZy?{| ѨwunO q˖0UNԜ 7n9RnH$4{-)ԁC`3O1){;Tx猹7}ç/ec1.f[}$I$I 1FH?W*"o0hĈ7+sv?xQ;+ҞfsI#8Ի0nղwi=>8XN{&MNS&ca81=ӳO s[87Xɸcɼ|:XFq/v-0>˹Y6ύ=Æt9]yBNr-'9Ï!cۂu(ڄ$I$I#9sK!qu24O@j 8FIӲ^IAB+Ǝ;1Ҙ7֔WxncYpu'-,9:f/M7xC%5ڧ/kWb@Ό\: $I$Ijb̒/6deU9{=vm2@gr]֔S޹'Ɗ#Jt/lɮӽ4h3^&UBX>9,* o؜6i1ByB#ڥ _]syM[. xNR\\B4cpߺ,8~jH8tAA$I$)UQrw{bΫc_rK UإQa+'rjf $I$I(R0h1g卫'3硧?'fOb8r^!3 N9؜cu hSQܑuH4ۯOehlxm失֔WcxL~c!]soȺ^gpPb7~Ãʻ2rT_DJY<- 6 S)A$I$) c$c|?ᦧr%oL1S {gq =Rͺqg2d)aTi~IXnr?FKb.sq]RCA#8BZ4UfxERҺ]8Z5kJ$%u0hGW1E071̺j~Em1<~U!xh=9(!G马*L#9ߎx?[ʒ8Rt0i%0?؞1#eʣ/I49,LGrO&p0c h3j W jA% gw&059kPUd.G7gޓPڳsm;{^pGMȢϱ={}V"mЙxjm>8"\N^;;yՠ qg3y)}c^I?ϼq :qu$IXY\ m̃?&+C<9{=98`ӥO<.fثyaS-F.hlۯN.}7e:Ht& kG@oŽ+OQO^!t6O 3s׷W%V-vҷ$⬣8i/fLdW0@ٚ%,nDW*^ʬ4v,uKAmڭN.G~޿*A8iv!q>P:5HҰ<՛̟jCI4-v ]npOU YZ0ϸ~L-ٗ;^WsI-ɼt,eAD]$)l8Nߛa;6̹rV2{}9vt (%gmTOb봤kWOW"j' )$ض<I@n~/u-l*Jڱ$jĖle[^sY'%BL-.I75hP3 ܒ{GTxm6!7:q4?b̹,Z oGyUԶ}ǐC}kqv8|F?jҩBE,|YtKCP~-JZba&V|[V  "#5-Sc(.&+/Odq%1,D3i߷Պ1u[۷]/΃oqِc9OY^Z*DIRi>1~=1~yg4{s6itҀ0>H@LY])nя +NSb܂BwJ$iOT7#S%⎳t欉ӹ▻yɫ8J /孡=28̾}V!ǾڌU]e[K(Շ G(1&%n)yxzݟ!$ _]i>o*oBb)Mdzx'(·/m~o -<2M3jIl@Agp{y{xbHՖ}ut/*i垗KICCl}n lj̐UOﻋUhxԙ߮2efnb$nzN3 1KȽq޼sio4wW?kN)I{Eʵ7.hsGGLq-^K_[CG0S "f0fǒ%e!+/x\8?hyy93D^P*| >_jui F^IRżxr C[eIhǘN{;籾0$I5 $I$)«A$I$I** f=H$IR4$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$IVܞXEز$I$/e{\l(I$I$E+ J$I$)j^I$I$)j^I$I$)j^I$I$)j^I$I$)j^I$I$)j^I$I$)j^I$I$)j^I$I$)jYv_~+/Nd5[!$I{ʕhа>Gu$ݺwB$.[Lsna.4$IChBna> ^I-^y%+A$?q+x& ϣFrry&܋BaxxZ)<Myor}/Yfeui3j W jA%J~n{sn*&ށcft$sZ+A$?\f5 W>v DWY|O]!Ioo%RbF9Yܮ!#b ~=ULbJEw??o>Yp ~]<DzngpcNʭ~\"RθGk)e R,KaA I0[4gnYQM߼5 ֒ނf!@"3ZS??o`-қKB=P۶PlN;`:7H#EwN>e~y?1ft7Rw3i|V43 {4"z-Z8iKxLI$I[Eq9<>d.9՚+ZMCȷǎ!uƟkk'I}/^>^G'1rhLVJX&*Ss1?,yfۉq ~;Ձm(Uinrթ إ-L'X`M[tTM;ԧE,'E4mjBz4kkb$I$O` Vn^o$_X.!U}*Q;ᒯ"rL|i\/qO L-aYišeTZ>ZMK; SNf$V )ZW_m%p]n}x9iėg'hS<8 _cEoq+o4Kؼj;)$򷰍$%'`iIIoّK$I ,X&S#C{񫟳• hٴ)<:>AZuK2./>ce*:-&+hЪ>YfA_=*uQ=,bi"sCɈ@LF򈐚\^<7h#/og=˥׽ʶӮo]p]$I: X< H͜r6eP MiA+2L{[1uhU?+1MYJ};;Kĭ[ڄ4I [And\vG@E*^W0,O3V=<]wT?8Ҫ%y9'U UIM 6T^3$IPѻ*F(n܏gk+)[) iCrӛ`mVeeP?6oYn-+K1= nrU}Yl-[4>` rJAk~ë w..z˥,,=8*.^%]j`]zte)JX>gMڐA=2Wbٷ w~HJfNMb$I$O"nJ&Uc;3&-_ÚdO\q3fz4ck)߂!^’*uiCR}ty6A&a-X's2g<'| ceߓ/' ۥ=3͝C|F V9;~$ĀOmtVla'r9+ D<7M9t\IͦM wmKexbFŷ {[' ͏kª5vL^HmMoAdCzxen`4lU’yjL7~K^9~ǎiYl ̘n3J퉅J93weA+p=Rr֕#hbAFts絫\xn8n{2NTNl. |{uN?vUrzG{oK?I3P?>t8l,޹ &x!+Ujp\ٹ*PBqI1[O^X$ijZ6H.XaМg:m1#Cjثo3&\6MŜZIjR0}M6U7bJ4hF.b~Vc;(яiOۆrIrpńIh׏.>(KBV,_SZZJ^^>C>MsGd c\>fAqeы͕.۲˳)j5m6|iX!z/3EK[sʣ7r\zk IDAT,Y:MhWe3$IE/ y{D\\11 2vޤq=畤=MGD۸,&^}5*"TDaYH^~Xb?ȃ7Sx-p'B~@G&b`X 2gxeI.J8.4MaxX\H}gD 'i-_ y^Ȭ\)H '0?]v\7^%d޹~ 3jS>-C~aP@'k׭Xi9墡kϽIE{qᄿqx4}5Z-|?z# (݅ûVobca$BP1gۤ:YJ$IJҟBٌ'8YR!h^tkVV,櫭! Z҂bΘK1 IpKf/0ݚ@fnxQi|3dT%LPm6ۖYCl^|w)AC> $yy jQLΪlpϖ89nby\"$Y٬4jǰWwkTGۮHW ɯ҈fi,˜ ,_Z̸>]z@d$IDz畤JPZPBLqs_y{pCPغRdJA=Z5EKXÞ-3@V`MyPi;zAE0P֥( q9jߑtb=yլ B|@.}8d@:v(<=W'U;F_3t d f)dknإ2wՔy)rۍs}C\ڪ-=2'ub`{\¬0r~վ"V;1l2 S|_}f,Mh)R s37Qڧ.OK7O1Puۛ3Mt^$IsJRT+iÝ{3`ٺ2̛̜YeOP܀ܮvT̶bR}eRѷFב޽piWU (..*5iR9Ŕ%7{4rSk 36/ְ$`ZsdXL䅐bgvmE03V,gYkWDһ3҃lG]֧6!e\O]zbí^tjBLq1@Zdl\-=k0rfq4؊Z@=9Qp΁*Z |C~^DƾQ}FfNW_w/:Վl,,MT 3vz {x,GK#oLZ"Y5 %M$I$y%)GD:8M5V!kֲ.4OYFͫ:>xMP}6(fdkA ^z׻rU(;#x8ّt?rma wBsrסL~>x3mzsIg~ˋw=Ƿ Y ӡu]6,glFυڍ|`f$滂ĥ^l?\[^O1Us|2\]ے8yO>7.ubbPi9EA ?W Zׁ|Vؙ / o㹬R\QNl>7Ssˉ΢.ZWMŊRJA2l;?oO6϶IVAI$iO <8,) Y|9F)--%//!&'J9#~cRҨZ3YWAbAzsY!?s"U_?͙"T_jEX!H"5עZV֯B^!Iju@O36k%Sx+!ma$S)\] ST:rUu^ ޡV2kٵC^؜?j_j%;:Q\H«X ҟ̐ywIk*cM7畤?,0;տmLV2o%l[m?&()`lu[XXs./m/Osێ6|=u%P,%ld/ϵ$I=$7I߶sXR+C$IJyX$I7AI$I$E-+I$I$E-+I$I$E-+I$I$E-+I$I$E-+IED+A$?I $ӭI$$?2[1t I$GWvzrɕWвU+*WNB$I@+'ѲU+. ziH]IKֽ!I$IY$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IRԊ $.aZ RJ$IRT2?]h~$oAge$IR41?]HUVVoã*SCHtPQĂD@PVԵ+6ĵb_ 説] .XQADt- If*|~]\LNy333yy.%3@JH$,cP6OB$!J`I$)P敤Qp7ڥWRY)Lڥ\u25$IǑW  .jM-}a:) >CvP%r$I‘Wbl^ }1!՚2?e-Db #I@1A2 @-TJ_%MI$)` $WςOI$iO^I$I$) $w|mJ$I?$I$IJv}S̟'Dn}9I$I4K "9a+&~MrC~\Iek|{MC|/ې$I$t $L2-n99E^Vb1KB4S}ې$I$t $,ߏo!V8G8t]cѳ/'˟: u={Jҥ܉{?0&vfv~e_$?TC+;e+9 1-i#}_׾j$9K=\pw_|1G{&/h"&M&OfѢEJ$IXW~4HQ1C*_67EקUqѕX5ab -XMb9 3[pU'ѽ^)4v5T.+l QF5y{xxl=7'*}7E[P3w-{+JN'rD6O}SxbƎK^>|>|8={`ܸqJ$IXW~o!c9[_M"E}L[:\;:U,fwKQgsq(HnImKeЭrJ-݁Q Ff9U W泵vcJJ^Ԉo돨H8foTo^FQ‰l6p1Wu5%D VzbHVV `Ȑ!ˇ €֭P$IŊZI?O,zfM| p!]g_n#_*m K<>vY۰B@zuORP/^X@W JUjf4mX+KAnyD" 6>AQPP@~~>vݺucذa-J$I\W~R"J_5-wYSS,+ v9+ SԈ qb'SoV[8;ʈcK~b_ڝH$‹/H޽֭/"HI$?JSn5B$ٜW͛вYm*$H˓RuK9pDn6ݴU UAʖWFyGу_|hԿAI$JDx,Dp c/ҨsGZF`qoC2;^c_~\}eέWןO'v/|XEq6om#}(-g >J$IW~RztՆY6i,Ca.嶾_5O 7P딋x6T[5UI H;Ѱx| S4ѕ+)? +7_@ei}Եx$I$'J%R,] NI&LHTd2֭[il, #VX"hPkI$ zN(dt<233F? jҴy 9J$I$Iex%I$I2$I$IR`^I$I$) $w^Z)I$XWF~Pk0+I`2_Bf}|ap{Qק$I QK i G"}H_n|0SΤ>E*cw8p$b!$I8Wp8L,[,~2nőH2f}ָ+XpAْ$I +IHX̊8YwNwJ,_HxMK?1.Н5G6 x=z۹L$I +Ie9G]UćgqpGqKh6 Mq_{ NwDR1"!ED?nhFmF9ܲ>L:e3R%}7~VGD)"(џ8C+$IoD|S\-#vɎ'VX^:>pȦU4ɜS} B'<-[pzwˑoW<.<: ns&vʃ\U=!HBĶM1XQBt+ ?FhE_[zN4:KeϿ L=XM7U[xhB6DCy2#~w# Mjr婏r{*-qpbJ9L1aKӆͥj>xK*D hʕ<+FzW*$׏b[ØLr)5"u"Wgd{m82Rxq\-*D!T.=`6[¬+eNȍ繺Bou;ckN=%z c0hKXKƎU??z qO?<ѭ9?xgTn66kDp<0;K>]R/*7˦;-Dj T{kY^F?Vt;fJ$INWvݯ_|!>Siְ!P=R:teTo`O#945әz@; A *iGaV7UY7z5DwH{<&?'ӯz[ẄarObasT上ṔQ;MD[+xkteA~$:+ }*Ԁ;UJՠɹL^ݱJ4ښRfMfJY1*Dsy7?慰tjݏ)H6k>eBLx;qDX@ $I$^I*5k4i\t]w}X?imh{Vwr;!'QlF_łS2 Ms!knɥo3`%<ׁ) o3̛8L]0迂 %Sq>7=k&~cl<©⑻wVgώ?0$I~aK , ÙcVr(KVQ^X6!-Y y"}AVᜒ3sKv޶l lѻf>Whڠ8n {ylOSl=6^w&0;;d<5;kwp+( J~.ؼ!H̩^;zfqgᙵy&/ ۖJHlP8֒箅JJ BA1 jփ3Xpb!WoQv.ٮh3'%v=-ۖ1'gOzI$I{ſK*P=J|t|ђuq07Jt Ehs*S5mivOcvY,ߓ{OsksCPM*5YF7RzbV0©:6+'V3YZuZ#P7lQw=hug1r݃AjphI^Tݲ *d)G|*gqGW8穓.ؾ;šz!|?U?Q/z{DMHշzrj5Bן/ݐT!'U=I{TYm!;#O W1$$IX(+++(Jt.;-..&LK3s3!IH[v+0R(I$IJ nGffhpxOkҴy 9mP$I$IAI aㅔN[$I_+G^I$I$) $I$IXW$I$I ,FIDAT+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$B}L I$gJ$I$Iex%L9.9ݻ}vzsIL-S}ϤMcYqD~=gQeOpi>lnswɟƽ=zkM ׭HQ[GJfm>.ʼI$I?%TȅeAu~~ztiQ̝\p.õ8Ɓ;T"ux)tI(A$I`0TwG&|Ջ4}0w2nzEs f=_M޸iZyw*-|?qEbmě {4Y0Q=etjŵWFخ۔eVtd}OD(>]˶ڧгa+_X%Ezv}UNP6fI/W cwMH-{<.Lrcjo]mj ե]e>m+]:T*Y|z`3lٱUuo>gHVhLA9Q9yav*VoAߌl[ʗ[I3ҽ?t?>%I$! J*S9X:.w>|j8sg)reNͯ)IE glϺGnNrLL;xL/bִOĖ5Elw"-oLeo/;Φ lكZR_1f[CιvmɃa^>E5eďwGP#HKl__8|fCN-fC/e6OLu]:w)y;YC / ه.G"$Iᕤ2vC=t_3g67!0ߞSt6sjmܣ5΢18m="ڔ"EH3լuʑ!͙o`s'eSZSzنud]o9ᰊT;YfdQ'T&'жMڕ܃yE3`MIf84oݺ%I$1+Ie*nK9KL}aKBԩfBR~5o=[ssj$n:1&eW* lKvu*2 /ExSyrJ>z'жf~0/yn[J◟k(7axpo99@%ٹdXS\*y\ý듶#eTԊ-#2>le %X tfdR!7"o5Da.\^$Iqڠ2Unۼ:z̷nȶ }|*+[w[gpcﳅ9N$زv=?eqH[9{~G>'^az2EZ˟ӪCK()d˚q_m< t9"['M:ܮ>ܒQVf3iCXzjS? 䏦yƒЦjML٬{o1Ư+?aq8\ۀ}mCd>w(mѰeVOΊDYRobǏ $Iy%l-3߹yiI4q`]'0w̿[\Df<}5}1fqy`bUZauяsϲ|2[ß7krকp+)*5@3D-;ʴ |yt4ӛc cw o" IV읨vOGVuѩ2% :o|oZ4u7NA*Ԝ.5NKXؠמ7\;@Jsλ; ҭ~מ;5Z㈃I1^z7k}dћk$IL(+++(JtI7 NI&LHگKpXv`^?x&nɖ$IzN(dt<233F~_K7lPi$I$I .+I$I$׼Tt{/1:eP$I/#$I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXQK |4c|˿f\ "I AzuѻGmkA$G^I*>{ \I$Bmߞ λD^1T&^5"H$O~ᕤ2jJ I?IAW< I?IAW$I$I ,+I$I$$I$IJ$I$Iex%I$I2RT.$I@W~6ٟg{Nn`1$I$) $odZ I$IZIf>x3N~BH$IR@^I r綋Z oĪ/rXX+O?y1-wll~Ϝ'ڞ؂UuõU+n~#d\j%G^CǕGzidOƵN`5Q*t.iO*ޜ'`x$I%Z2_ڕ_䁗eqR3F<0_ l<<HC8&$x{KC)ykB vyT8+":'}GɫՁHf훓i$I}ƑW-E$o ;;@y*MYD^ )XsKJgoN`\rr| ye*PrG:P~=ާ'J$IG^I Xy]3 SHVo. 7XN8xdx%)‰h4q5a+I$I 5RD2 tU$ĚN1jqX$I$IebF-N2kcD"2y-KF^E^u- &ƃ8'$I$IRYijEja/#x$g6HҳNT _I$I${;󚝗zDDґWe`E˺(Hp8L**I$I$l v26W$I$Ier$I$I %$I$IRP^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$Iex%I$I2$I$IR`^I$I$) $I$IXW$I$I ,+I$I$$I$IJ$I$IN&VA$I$Iؾ=JH$I$)p7.hҴU$I$IR }Ljl!I$I@Z > X!UXI$I$UPB&cN]tIYI$I$~4 <9^LIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/dataclasses/000077500000000000000000000000001461403617600225035ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/dataclasses/image01.png000066400000000000000000002155761461403617600244540ustar00rootroot00000000000000PNG  IHDR!sBIT|dtEXtSoftwareShutterc IDATxw|u׶$NB %t&(EOł b9y^UE(z*HWA@BM lvGB$=!$~>hvgv32|32ydDDDDDDD+**bɒ%dž%-5"gjJDDDDDD5ÁYbݺu3@hh9:tSNvUS""""""ҨL& ͛50aod8p'NDDDDDDa4xH//i׾CnӕWJ7mX,1||պRӛh̜9 H֭46>߻=>Oh#?̞Cvv-[Fk/2˗-&6v'/ROO^PŋHcOe[k OKrOd!ŻMϞ=|w}oֲisݿƍ;v J߱cǰqSWA[DDDQ\ 5J3dnqgUS:7'S7IVk k` x8zrs Ve`s8̙G׮1?Mnn{W_rՕWlrƌM>wۇs-zjݪ!!!l k׎|<3SѪeK}WW|]q^zpEDDkۮ=O?ᜐ,GjVޒ1q) <~ڷ&nGzz*Rjfgxګ/fWl\.O>[t3>G>޻sYc^{a0{L;v T*lrrs=|0U>=9g Ya#7_Goelظ܇db_ I8\3|BBټyK)(8 W<%zңUy_zM_LJ] { 8g`:Tts+i}Mjz=IL8~Nqv.5u9onOXhe21|rmi'Ÿq7 6V'NĉU]vl޲u>wag>BBCrs.ҫTO nzP2ɓIv:vg-~=|Hxx8پ SK]xq_=رcϯ뀽zEWDDDG-xf׎e. xQ ҬYR;zX233Z##T %!n7;&q\~e5^Uq:||x` EEEvf3mڴf .bq5 .BWK>C>'=d0F=ju`]kj(W]ImݎByl0(*rS*ݮkkzx{ah^/YYYzm6mZt:9|O=;<ߜҼys_gɒtܙlX7].~~~<4iN~~>ēOtr×k躯#X{=+'ٳh0rǤ \._Hi?X#<`ۻc^K|*Y n Gu>DFFfLgZ555GWZZjޙg{(ZHT|1A~ǝvfVY3Mwh%:"Y?&wmg{Æ`4JHH0v;}ZH8G~/DDD|e3bcn(z.818v5k*oLT-A[t߆'k 7rLHA24Y?H8XlH:5 \XU]uZ{l~0DDD77w zRtSuwa uN'>mH{`^2M~A6rصCؼiKf 8N:pav3>3_պBmW}O1j @J)daw oDbzs8ێdzЂ˯C,G *ky?`_;٘PXmk q?ȯG^=w5s Z4"88_oY\CaFnq,})5_hh(s;t!**F9(ym. :u{{憇3h5QF2瞻}S|DFgfԨZ㡠V\ޣ'ӟxAC ؼa99 :O<=zH-;*:Z kO˻dhɕG˓>oָ\^Bh߱C[!mK]k*urnaSG/n ;>33`o͛]/!$؆fZ:G2bH:5kR'zƻGOƎ@Nv6_%/dlٸ%/d믑S 3ٰ#^vLƼu[$װ4?=xﳬ>_;1S |spmNμm/ZqMs6ylZ9Éu3>0M[\B'/j9UW:ȅ;1Dک̮8*[YM4:i|S,[˦~5W-!{*/($33L˨K (#G9you#F:\O~uJn~-O9<;qR@G^fD'zucV~7æf?b_̝ڻ0[y+ۆ˵rɘ68Hm1:p: o.1f5Kǿh&ny3AN=L CHGS쀉6(LJ"a{CgtewbVg<""ILL$11Yqhwcjʕ.i 6gO= sy_k=/S`C _ u}Mě'Z~׬Y[<<4=zuq֥ E +wɢ<ē?[6 +ϷϿm/][jz<:KplɦːxU'L8Şm|o=\_˫7xv>gGyfFV 1W=tp⋭H|+'hE7K4u_gYٚGz_F]k=:qsy[+ێQx̑Č-FjZ!g}ʽ`nhf*";n]W5f0u 3E8o7lO E9)r)뚌Pr76?@&dW{~5(N!Cܡ%Nrd$y3f3ay_0Mqg(('CױHns{FOCɡy=~vCnSy0xSާ9 v5'"4= ?ekAh,+Ur?`:# e#;q|#OzuwGGDk"'%,:Tq}9L0wN*kR`3^2J=Ħױ?Sɉ/?;?{~,)S!ֹ M lڕ$*l"razz{)P I8w[]ZL&_ӷOl>ѼUݱ \rtؖCqbuH0=-9uǒhNk) IDATM?i/>oՙ~>+oȍͲrY ޛ!|?⺉ TL3? O[ۻطy <9@~~70u_(ŎI <Y_-Xű`dtb=_o)yV#3e[^F}al^sX?\nlnܦlH)"a$ }-,cg S6-a]AY륷)mGrr֦{/p']EM'iٲ%~Y/ wX[qòϚ8\ԫV_:#`2)ۘ IDYMֳjΈ 0ѥ?x0;w4Rbb"o9&)Tfh;[lY]y$%%^$ߟuFfVL{w}m~ <ʪ B)"1 ($ cc/>ҁ}yp_€h#ǾoVFKWpw&e|s8Xg?WEi9_}WJV?OH@ڙ6AjQL;r}X:;3#!68Œmmy3;'%r'rikh^AZڹ+-ŹEc?Q\KM?⁢rʺ=⺩©>r$ǂG|HzēO7[96i׍nKx_笮IM(RFUa_;S{"M];0!uGDywqаʓPg1Ggp'w&KկJ:{̙O+Y3_.>wSX̜ ªASknժtX4V{bwl][)HHL#aٻonb谡|R,1͛+^+:???x̛7M6mLVxgؼe+&'- .bYy(V9ʓI|||Tl6qj|L|7`y5(䯊A}xW r)`esRQW:VN='($ OX4=ۅq@v=es.kg%ga[D ٝRfAD+rę^$qyTsh1;in~3 yӟ;YE$lYݲ"ZDȭY6&_Ø>ih6st~F/2[ꦺ r)'TryɋYkNr \nns4Y7U>;e?;׬+h /1{7F6?(5ϔel-z- @^^qqqxccҥyozz:9994o^<>KN aoϙSǎ3moye˖aZR&QoAU~f3tؑCS*-f:;'͛sǎtرV6W&?Ͻ}SVkx]on-͚ěIBzagp &cՇOt]|wD:Kag J̵Pв+1.NnUF]l_?\N~Ws=|t ώL ãk6c&=z9ugMy5(,9?*頰[扑WquqtbgwuW^WrSz +cZo=`nΌrq5YTP:E{2p@-h2pvUk4T~VbvIJ:uN+ Y`!C f[st$ Xr%tySrMcKkpg) [{}kpi(S TRgΛ7|(<3S2ė[`}w ʄ'T:bhѢv;PkzVnaakJ­axGy++`>o,`ӟ~`G^{-LcK#V&iJNl%4H@FiȅMGBo4aٟ_|B;Kڕ+z&ȇ!ZD,3SrѾup9N૏:=K{'G+~-a}ryh|>\|_Mʚ !2IVVYl.,)~zĴtҒJzcpw iҤ=[r ۄ_nK_AY+ڨJelD2>n\wUKLIC\˨Ѿ[O)cjDњA&DQy#"f.1tVXXVVcvawsߞU+xy\bcceʕ<Ӭ\sSK}%$$PXXϙva l 0_M||<cGrׯ_-//jjnn4>^ª 5|/gKϨQ#+kylansW:ͷOnn\.2u(Ն={гgzukCɝ!KiHb3K0{w,g\MP7})Z="/O5&qpԩ;#$"9/݉Db+8;uk=8i=hL΁#nx6bXFH6Ժ9fYm:kU\?j#v,l>ZHckӖv"vDG5EvDYp8 I2VNRZ.9^3>W\ϖCq#G^ǨGŃb%'jUk; Ǝid"rrK ~ͷN(/ZQ7m0tmm%?p٧>c|wjRWNR^|'Bɟ&IwL{g93ou\'Xko+NbߑlpSs gqp瑶 >]Ҳ]-;qiH.g5i0Ʉ .GIp{1$c2ʵCoMvOf+'=ůO^%C2x(3'oq,5vgpPĝ|8͢ ʚOR晖W~Ùd]-'wdpw,Ę>r .)7|Η t7pH;LLma}>9P@܆o}5C&tǘkrՀºU૰\NB|? `<=u;w2x/,sTs_Y+4h⫑C3zPHJtsu;"RVfmFN``o~uqke{jFkyő{$z;&///q;-Ko5x` Oܼ<λl{} xhT}a;iKWfh!4,kNT+тlٺJe,usT}e=z_<ifl ўdt~6pyr[Kry kЪ=qh8xmEL׮vV-[JHdv7O97j[D꙽D˒K."^={s.-w~mՓ3gq.14t>K@?\.MiS}WXɫ^?8m*}O/xX^ jْqqxj7tsߞom<'"{y/_ѠfXᬓL.1novv :?CS ţs2o@ܱ#>|ݻJו rss<ݻ?pWK׮ĜQJr27l(*Э**!+;SYM"R=&c.+UqŞ""@+o9vz>=#73^={ҴiO*0j]y 6M6%99 2dPbNwo-ҷoV*;(<ǂ tyFSɄ0yyWH -u뼶Kn+4^-0uRGN_ +ږKt('~sV>*cY6" 7."m b*jo ׋`0CHH+WmqM5zzǙ0aMÞxc+3<< Nj8e E*}SD.^^,4 Z4AFVnG&"r:05b^Xr\ޞ%ci >6p81;U+z ?f#;NBCpwLb*m cႅ,XPoDDrskfNJwՊj"N ۃ㡸VDDDDFGFL&#~5`0`tx=k6l6c6Kjqrܸn:O`, Ry{467(\?˲Ͽl+r:Yz?[ؒ[-Ĺz㉈H}ዯ77~f2r*'5oo%2 ͉jzlBq4t"&5f  jz9sjS0 wY\؆=g/o9%dW^G?S7 RKBoDiL L㾯k?Pr/5026e9-|b!"۶[k{\dmc̮zU&+Ӻ;ZA6Ikzdݻ_F[:І hZ<֊)7_FE6{ D_ƶ zwiى-dgnu)2DsH=[;D!^0rGnqE!b i>ǚOѴ;vitL㿎m,3B`# s.6*tvr]d[Rֶr[:d5 ((cX̾|l0r,:b ^E4k?]eZ8?=gN `5sdk[Ϧ24&jncYv-[r㖈3#o8+p:JT2& IDAT4| `C,x?]k۶m./j'{|OY/}lN79|v˯q zSĊ :u֬fɷ ?ڝoiբGʝgwPf,^(2x.<{ wx6a\8+-wYZXq㢂xrРig⻎c@@xOmsto~MqYZ[`z6ˁ̂3'~>0iF[ہf|I biu'~FXɥ,""""|B>E ٶf?C-Ko6IDv' mڔV Ch"Tr}DRؔw/F] uIt5YQߟVp'w͸RCT ̝_ྶ{CqEF^ .?vYݳ7L^ZIDDDDKL6"O;TnnWxxi1+:v1|{Q1g0[o!8ms"OeG 6Zm~Qxo'qeg~v}oƸ~*~/}~sycl^2=S&8}"/M/)lV{wnqdB#E^JYƟ),.l,=[)cN_3<82f]ƌMF7(f9S¯Dӫay<qDNH/ 1gn!X4/f ԼAep22'6g~߼.}T% u|3htff<л! {^\%E?wX;FNM7`LL{ߋVG>)[sLʅѭs[f[RnxmB6c>,k>jKH)"""" W ~\R3n_=-K><:.l|~6-TE/_ͧ}yʑxF~yjw\(D}fOkg0s X},AwX$g6Ɔ&.jҚst\(،c_q^uܬ̚윜Rwy۹4nXD۷:ԆjKJ뷥(jlLq'P\{8v\t;iSojʖ]ii>|JN y-c}T 4̟ _K\E6ZMVkӻA{^Ȃݠs*:)/ZWGjѤ5Uf=[jn*r)[>׮j][_*2&T+T˯(x?ӗ{}JJ!{ǧ˪>.wMɍO?sW2ݠmmL^Jkxَǟz:X6b<w!)9bw ݣeP5"+R5"Ax_!ePٙ'Gme_r$qp8VnwP T hF24ᕈ(玥;as?-􉛬dѴ'Sd䑼qu:>Mզ~ڄ]IN6|Z ^4~jvN2>f#kč檋X~,eܝZiWUDDDDD|dz9Sg/eݶ%᭘H;¬S璴m ӷajT-ک-m^e,*ݟO(,L~$W4Q6K -v|<O_J.Sne,u"n5Z1`sN+e"Nɮ3Gyf /|v4'R펀mbfT^ PPw^j ܂ qݷjBpSD,\2ᷭ'2~@> vl?Id'_ڎwtAq 6bE_~M8gM:ݒYe{.N[(ǫ[̂WfWs\m';d ρ5?/WS7h|Y.볫r#LYbJ_cl Bz5g^!ua w̨3Go>aՅ&Ѯ5WK'̝z׏8Kyu9^)""""""RZt7zi+DK[ _b2XV̸T/>lкU#jzB\27,tнD%7Ӡc^ wr\22KլY* v&1Ivun.lL$ ˝g{GY Ik9ad|W'ok ՝1;Z=˕eTZ!fk/$ր\wwt o3Γ9e!@JAɾ*{WshgY,Jc.pg3 % 8#1/Y+X1ِlgy^0&@ȶ4f{\wS%fG9<*`\jt™s;w10ǛxL38!9gs]po ,X*0_8چLݝ""""""We!.p8s]vT ~?ך괻sCżW0ogfuETtu|ha77:\ѽ`KMO$f]qU?+`~;2jO VUO= hsfFR,&zӣ0Ui ^t?^q.ݝ"""""":8LY EՂJ Ց]s3@IEmkiNMܽìQhyaŊ$&& V|} wSPKB٤B@&NfvR/û:m8߬\j e,1Y.o4 Vpm7(^I j[)nvhy޳ =5 D]?Hϯ `ddl^_FIZEDDDDD|ݻw7s&ѻػ't4!BEzo ?dYIDDDDDDGZZ^aTTT?@ը^4}9pq,ܭ,"""""RZ)fLU:DDDDDDJ)KL9TP l-6]DDDDDDJ5(((((((((((((((((((((((((((((\.Y4.CWK9pÈ%ua'h'"""""\2$%g o6 KmY4LK`Uv<[ԴM̉L%Lиqc7nLJJ*[3?s o1%b`hʗ,yI񢒗Aܯx9?q'xa k7j{qĨFwGqx`e܈[f[YüEDDDD.h""""Xh;vTrp-ew~umу mټC?jয়" Z~uC@^{0۟NʲrUOCP?ԏxo Ϝ4W`<̪ؕa=uw-dj&"Ջ!j r~5C}"""""|PmI?ky- uAkk6n1N6WG ,5ag_,ϼ,sTg}[qبPțA:59TWcU0i% ~ \0a !!O=a>b_3HdSwLcaTTg X 9sq"""""W!J d}6v'Ρ ep,і?N VTn7p&"6&"""""$*_IƉd;2NXf-e 安DʓO[_~-=ېK}owy䬻0r-ٙ})""""rE;v,i8^ƎUUƇ Or'T- :vb Z&$`)l<0+N2M0Bu^M ɡg'䵘3x km8FDD,%cdJjҬzقˬßolh]du~y/)蒔Pl)jo ?l,Vh- .&SX 3[3HQk.` olGؒO@ftbŤj\ńpkWfe8{[MW IDAT7T&0iӾy-=pIS  7֒/f@sG'?'D mZ)hlak go0ՏY$m`7H=)srGz$_IVhWȕrII?^ZG|2uzK&pkV7|d]u}MͼVó!/3/ ¯|8yɖ+ЎOe o w?yWc'}~0ӿr;ذx{Iu?@pYGв+u.g}ϨiEDDDDD.^x@oMyREd$7OFNŸ#bL 4FE/&lm΍3hm, ZQ;,nA\F*jDpЛilϫhʴƇ0~x/:W L'Z1Q|б2e!>c%Ӓg^.q7[&-*]."""""ݻw7s&ѻػ'Z"""""""BZZ^sČڍ"VzKXDDDDDDQ````````QQQQQwXb%] Wb剈ȥC]EDDDDDVZ bH)e. 4 H 'Y,K:rt:tt: |OjbZqssjb\il&Nl,:bca|EDDDDDJZe :t,C ^"\B.\NC ,Tּ\""""""ElՇ]γu bXZܹ'iX_ɢ#6+"""""RTл,?b/z)[0ޠey_ҬE9%Ii6ՇR^֭=u H63$וn)JmIj蚉?0u5````x{[W""""",23Gon.}Ȋߙw|@>__,J/-z\6,RBu$3daDؐR*ʻagnKsN3d\F^k#dl|vz4` ׄ3.W_}TKu* (_eE{;Um'dteZ9l~:[kp- #_ -9ǽONnF~7 礓.| `o!lyMq?.&`/`r?HK^]ۆX,[c3N7ËkQ;ȅ`42MA <:uh}$ÍaHd|i'~m}0fE|TN ToY=[x ;sֈ~$U9Hs13J{?C@>3["AGwq`c_{b˳7dֶsgxK0[:LlJ 2%&c;磿eޡmv6@E,?lNaRkm 뽷?]ksc43nUlK{Ɔi|L6e]|Πh:u[p]BӑD-~$^BQ=g;>sJø3wWwI\KT<c,v%ƧO8 DDDD䟄x:RSS^WdV[8ٝQE5 7Zָ.ފ;V1NzFr Kvk\)>O~ϼYoӂV(_}7hq҂iulg5$Tz]wA&eX~q)Q'/ZpۯRõwxh_ރТ Yؙۢ )=x{kKҊ=8fNYI\<._J`t`c3bޱ"U?6mz/f˻Ix`S^xAf|3(G̫3qF8g/Om^0Y3 /yc[^ͽsK ,c!׃{!W5`Э/nFA.h}B9Q(78+vEנ[*]pfh{m61la^k[r ^ll-cL&.zζc7!'3ѻ|E*4^xVZҺic"Vb1ׯLgP^]O2*мvÓrx^Z{8 Cfӎ}/ElA48Nzfd`7˰x_G4]뉽 aŌeM0 Ad'̀C;Hj$ͼ LlԸ3u?kqy3Un)ñqZQ 0!|+n7K@͚{A^㣗v3cn|^ߝ;[DHX,'A[IsQ dCJ6.L\6_گܺopv^kJ`E܎ĝ5;p1X/񈾼0oLZCHdDս#na,a%1AM%tG ]Ħ]Yd6>KIWd`.&Xx9?VYKͫok!22 >ۋ2%2<>n1Lə;,#vyLBzs-~/J+ƹse\{%`08xQے]L0qz^zS %|+[4kG#Z֋:oO=NlE~w&79r1}&6tnF4~he\?Ut_tEXċfEֺW 5HzRߚ#M|LHi=7 oo;)N&TrبX[ݷ; Mb[=4۾5y|QvGNEDD_Wjd191-tiv{^J=B)9#'!,X]L}7c¬]t,hVIe"a )h"6&d%eSק)u\o?0?[GKocomN;:;9xO k> 9S!]+0y>i,#3ÙVV HX-;ljjxG."2 37d-ۀGn~aG7lM%.>,4?=A&;?G`HEivdg]cgdf͹G^n3))m|w+g y/W򠺏HIwH&ӷ0[dho MNj[^ v S;zV5 exOs~:ūz=q;GS1yi>~!ԺjXW]yj ^d_:G?ǝ&l}Cyzm7fMNVtxw̚Wg^b|yK͐EDDD.i%З^,޽4k=ڻ'4Mrrr^Lze_2hN%#\ym96wEI8bĽ?cUa_+""""\|VhO/ uuv] """"")M%"""""" """"""" """"""" չ蚉?2PaRk&"""""Y:nYrYdsK A@;kiRqQ>g>6xIDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDt)`0סd."""""R a\KbIOOU""""""\?. ibDDDDDD.ˉi <t\ o DDDDDD.|i75%""""""W`QQQ)]T"""""r.Kg*AXDDDDD'ܹ+VP2ЦM[jԬ | u;2gbb*R$wTk),"""""rrr֭G VŔ2 ,^m۶b2רjUS i\.9@{R+(8:R+k XT;q}~EDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDD@﮽2U\ؚFRT=UE{xW}.s1|}sL;VDDDD.[y>͗gܦ #T)_fǨ챽)w&N&.੻7m |aRY-m9ؽ!%ㆳpIeV:tz[. da2M6iبR㼏 m6+lLX{v`CU l]]L̙oqլjV~%"oxXw?;[<-^ks?;_NV2obo 5@^la◇ y-IJx'GhޔJk$O`2}ӽ9kKpCi2 8DZ |xsmrG53ݚ߬ƞLrUi^ZEDDDfAx9Z¢-nT9o1.N]QBN&M>=n|ʇFN ,ac -_}aSJ–&2nf$;XC=КJ6ܙoi"1\Ld<4kJvCJ[]5lx>gz*if zVcq,fIl2w;b>3y᷵ՇfYcG|`u/P[["܎shD^|sVu=صqo Ԭj2i^j呟Bn<Ӿ271.4˽xV"V3Yaܻ>{WGrÞy;BY= ^Xo\:vs&$U˵-سfkmx~XZJϮu[fBf͸gs5ء綪<'7ѵ\1-C,Q[ &RUWNu EѣxZZykmц*ϲѬsCp [h{_b7oZ kNt_X{'Fc,優?0ZmK|6g.Q}k XgкU|8YdX✪یs_{n[,H$WMd7yu&JRQmy,TZ ֦2?-Eڹ٫rɉ+CQĮ%.[6(!u7|p 8)oxdD9s4?G֭H݅t4yo>S,6Ҧɭ9ܣpR >;~` f xa*;ngw"x*o(S+IC^TC#_CE'P@71B!\8QMShυsALy{>C%<">{Ov$݁3נN8]_½t׼-":+ P(6 }y^} 7cQGoǭRu|&<;ٍڑRp;?6Ӓ׀}N'vf͘͹^S.o/Q x;Jgѩ)s5zݱеV!g"(H yQ$> ~o[7j/du/W36*ߛ]kS IBSZ95,&On*Q4sS}KKqԚ/h_H o돦[57_ݜm|λ|X7*@ƞ<=MbdnM6aNnHj".I뿝 Cٹs'g~$IA|!A΅7¦3/B{6"A߹ ^\wo9s5)))4Li*㵷%I$ҢK}ͬO?ceL$IthoeIۇjt$Itmt??*$I$$I$$I$ [qFWAK$IP6s6o 9mڸiS?o{W^K$I ciU?s49rC#$I0~ZӁe9(PrӾTR(#xK$ICQQQRzu*VD^^a+ /+"DE9iK$I*::8"{o(G `I$I6U<4 `I$Iƕ C_eM\ mn1$Ithj$I$I$I$I$I$ICGuI$I#W$ICáo1 b3mX$I~{@YkA@M\\4y~lJ$IAѿA@TTAT!= ELL{$I$Cy$I]$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdZ;r$#oZy/qiL bgov$Id^bH WyuI$IGw"t:/3*~Yኯ9E, Ǵ媾sLo9fƓ6:o;xْBs_{F `?5_gyFHl|e_kTF҃at˘qOKy0dț|4mITnޑvgbkzqg51EȪw>ў`#yoY5t Nz%ZTdfRI ݋3 >1$Tk^YU c:C^X4}]$ogÔTtjN.$I~ult6=[2I,QEs0Wo㝗d6cC_%c61yeZ:{^ YZ{31u=aG|27?75`/w !oQ}ip,MZ= lgrxd$=?.Hg}i45`gq㸝Y&N|.2di./;RHĥmeP3s ˤ+ٞYMĽP\ 6 Yo1/5+?Lwl%>W=//1BlOrѸ_#>g^&o${ g^c[ְ>}+?HZҠ:AeJ%DKoӤA=mu:6(wy$I$E܍޿_i'-vee;xzI<=4(c:\4n 7+AaD(~`ƴ.;Sg!+Ƀ }vv8ҙ/Y2/pGoFqLqX$IAzQH2'_ۙSF0dٮW,IkX떳2(Njb7:o]R"\ü%)۶ 89 3xC.Xzodbق]:}K^;h Jlb٪61ޙή"Th֊nN3ǟ#I$I#ҩ=S_=AUTN/W^lޱ_cO焄߿STr+dCdw6} *E(S4)+b(洬ߝWX ,g֪lck#dWG~i7΍k@Pumߓ%ӻ_gx$IC@ЦM0'7$5uK1dggY3tZ!x3}$I0g;3HHH =Qo9~eJJ S}zG$I$fK$I1qB_>8$I$:$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$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$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$I$I$ICa薐$I$G8%I$頗wH<0$u'$IC@{Ha{$I$ :'WJ$Iҡvy$I$`K$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$I,I$I]Pۧӷϋ$Qޱt2ΫZЭ/I$I!$:ԤD$ "c}*|#70H$I$>eCqjA7͠?O94B1hA;hO6zV5HLJsӃKF=iθS/15A uQ <,l$hI҅z4B$ zӜ|xCyX$QK3赳2E&91B˯j$I$HqDPHĀ \[c]ٗ.K!v\Ǭ zt?vU^reR1@llJ/Ƿ↛4f-sF]ӥ*Q;9t8e$I$PS։q,ٚE8rt+#MT!iG|\OW1<3'{ {=p!A&DO2Ϙw̛?zY}\f$Itd8b.z%\T."_ީ(T%B)Q֢|dA$ᬭX"v喇fù/%?>{> @WAĵO~^KN\?՟E+Tg^~wh@| >qm$I$ps,hTKϖLc ?5)G>f7}h֨O\zgi=(^;*t4J! r^ 3q !ɴ:6yq\Ъ2SޞϐC OȺ]!Igw??2솁[wkAH_awDE I$I'Igw<^jWէ÷7E}{)}t[ӃƑi7]ˠ׿䙁; 55W~x|9,]Շ{kuwT %#bh|Uh Er73}>|fĐT&[R $It ڴi䆤.`ԿM0$;;;wr|>\y_?9w~Ȝ7ܛ$I$NZ撘H$!Jo9s5)))4Li*$I$`K$I1ܦW1\$ItpX$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `I$I `I$I `I$I `I$I `I$I `I$I I$ICb-;! }&sI$I.>o &//_I$I:( "=G`q$I]TxH<=X$I@$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$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$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2GKvgvor\$Ianiw\z~tL={A WqՀM1wi)=ݛHӸl[i{xcc`Y73l@*-/91Oqqo<7S .܂zӾB^g5|RFalML>sxS" D: қ]Θޭ(lLaƤ۳ guOMe{4Z:Wc4$I 6vb |XdHu0h,fSfm2nmj]w }k$9eN r %XPC[69Q4/by%ukv橻:Q-N5C.ODoX@v=͈߱_ԓV١wĻ֒Qz\y* Ch}.ӆbpBaSh"Qa<'զߐY3[ we**Ҡ]yM;ޙƬ܂ԕ %*blN}$_wvz$|<:Ϙoa $/K"S,'}IGvu WXjt 5'qڞ畺;m*?>2r1$I_zR0>W,cΆ<&?- -Y(|!@*UO>s?K>K&ͽ779,Ϊs<-HZ1.{}&f>ݛn#SIV!^{glPj@ %V/Xgkt)]11UIڵY4 z-0o2&gsOLKΠjOP,sS?]̶||X!sT(D %F(޼ sL5q?{aw3 6ӨAg{#xu.丈'\H$'x3}+W6Iм7:C[Vhw+/ ̤(Y2:,GsjsɵX6/A"l[ʢYnV'3>5>aMŖԫ.oHX;p$3%I$8M(I$I:ĸ t(;N; I$9,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$IqR-vJ$I:ը^͕pY$I<Z$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `I$I `I$I `I$I[.}:[C_uagz~q`kߏWD+~siR KuʚOApE}EdPnލsW? swH$IL^<ٿ~RY^,uAE?;?Dբcљ{`I:[ɸzr 0t*1z]à1w#rG>Ȁ:s/0s~_J`{4꒕(\2a{θ'nzӳXPލ/NW٩vqWNuOHۺRe)g'ΨC*P`q*Xջ^&q{|CPJ/X#I$f2V-cy:?aܽxk@A ĉ/1]~=R4\*W)%+] BXd=Ӛ1ph^1'{i!kY: /GN硇:r즏ytR,&c˨聾DoY2U%s凤YpkX ;ߘX]壈\ Pj)pWǑҴuXY *EYʲ Cdw:U7Y,kW2q̶Ϟf|ObybE>4[o UYEf'F )wղnq% *Uli~C^ϵ§UT麴fӔ`q3;{ ]Jۤ]mI/-ͮi<:fX<=#iD>}2[6p:n'&H$ITL}nsiֆ3cĤZ!k\Sx~&OVRDbk#.̿?$aQk#`WXjmFE̎ z-\KfQY 6ߨDž3cp?xNTm.iLϻ0dPAP M> BaJ7f$ ev,]\U%I$V.]Ɗ)cyA5l[.r)5:q5ykWM;NLp%WvHʑf>8\ TAQTZ*_'O>:xzh?:?E^l^qF$Id/ 9}5[SqV 뗆[G0o*R gPcV>7v3rՠQ{1MyW7iԥU$I ` )Ԁ+DQePn?" ^F4=/k 6,d*J+Njh # ֳ=HBt2N.Z{Tk3a,ev9\e+F=9 p5m{i^;et_}D?C"TnPXBl*^ȋ+K~]ȺY 2~ZɖCp ןS0Y_J {|}k_X:Ǫ0ͯyUɔ?t.< aD{\=S~dYv IuN-=h^$?#g  Rb=N~7*}61w+fBݦ$IYˇ0^|2ȭC6;=֎|Bea<ӻ-f ȟp&2|ؕ4#T9ƏC]d=I/^3qӣ<:bhKoʧf=z7wM'2j'0H lEP en"lv/cqKsh%9Kus8"ϪUY_5mT],ՖN۠l翙!1!&%1!zt@6{ʊ/dG>bN&x}:R.a%/U-7u_o3鞼Evۥ%U-@3{rO,V 7:g_тȍTKO㍛>`oǒ&3I\w/|=,VYW9*Q9ŏӈr)wjCԥjG,]\+j>KBBvl# ȮؘOേ6ЬѤT+FID~^Ă48>TZGբI S%Id L[QVOb]cxbZ>x&pd -@ܟ^i0 - ->/=7zr Ru>8jq!DeobcO0<ЧfNVvHh7f )A4u&|2!ư;6f3 $eFl,t ҳC '&Gl, ;>V 6_/S\m.}!*1}/dAؽ}ND|f:&fHާ2L$IAl-Ttsltv*8&k?$䥧 <=!!`unXbHb "f峦2fȋ<89O/s%eXuV*ToS)%hg#3b$Q waWxW,W.?\_?sY{7'tSUhrנhq5Z?ػ8331a1c_ǾdR ,IE,BeORT$w3cܙ9?fj~י{Yuys5{&c}_0ʻC^wCV< 9n"""""7AoY#W0ٗxyn2#lILW+6Nu9cͫX|˾>K>X,QH/~ܭaLf5urB8o[jt] Hzn9d+L٢ΜM"_ՖOWsxcVzL '~%]KP9xP'9q8̰ÜpT1!30wz~_}cGO&b,K8"r]-!G@K$~A=3]R}#MH/P.]K8&fݔ场)DVTOG/bljnYSW7Rֿx;md9|2qQ80w }_zqǯq9o}05y"l`њS$.G,e=I&ɜ\0q2qKhxe7L &o=UMxg./p>|8&a^d{^ .*-?t:S(?MZΡ 1ğ̙/Pv%1塧jSlǏXȘl`DVjs%sTK|9|$,E \:žCndWF87&m#2&sG60~<*.Zrs|9_@b:8zS0Fucgfت\DOsm?= jt}"G24E759dWKkؼ)ڠ'S{d w 4&SK`O0Ewįnj"8zX#7/߬5ăگDQU8GvQAʿ!z>]ӧ2W..u{2_~9~CՃG]ib`wy~2y>#{Absu mU4_LnY#lX,cz}D7t-ޓw2kted/Gs~CkrT4׋8bHWcԌLl0bp+H:{S-Z&!!<ribIJJf4H;;JBkmVn2X, w勏f޽9^&((JAUW<@ȃAXDDDDDDX>ebڰCDDDD䁧`QQQQQQQQ`````````QQQQQQQQQ````````,kq?u j8ϭu9ngTl4 zt[z:Bw>"SDDDDDD1w~f uzu|rXXDDDDD!'UDz4p?)H؛+fԏIB݋uQg{2ȃ{QOb?y[tۓEOg[q|/\}RƯ ܾV۩8i-] 0z~ ֡m su i I?sҰ`x?ޛA|u`EDDDD j1AZ}T7ڷ6]N!|u?Gӎ?qSc#7Aq)<]Fdq 'KnDJm˝cޯ4-⌑rK1w׭ۧ .~b_|q#gs+""""Q cԙie)j?y +x ҐA,0pp 2 .BQgTwk _KbK%EPmm'o"l8@MCaږC` JGnTivx={v(eBQCVDDDDDXFv,ʷ IDAT _oMP?mkﺆUNZO/dD:L|z.KGɿ^&D3ĪT/plg9#FȃJ]XҸ"I簽lj\6etikfRO %KaHd]uI"ڽ iغ1dغ pLJ&4hsV1YוY2 Xp_euvJ8) SyXnIjTKFh خkMw+17x i^[ δ^ݟy]̏ҖtR_gGxm,#'"4Ў'};2Vy+UF6 a OM\/pE_pyg(;Ev vЛ't hѢa !w|ibIJJf4H->{x *U^"j?Y3tsJ;MVP;&4 ~~Q7 """"",8t՗a\},8;>g!-M"_ZkB-pttT"=I6.Z>M'ۻm`!FRnADDDDA}!#2?LnυqiwV>OR 02S&K|[ """"" rL*߶%ogoIM>M=8Pƙ0Œ\^m-( 5t&.b )T5onE4p=1͞cۘQaFF)̋jqlS`=z"|sy [žzpYpd&g%ލf4;q*6[@ԓj'sEvLÞOy0~K6 )?@\xVK]R27ɂ4X%&/2 &MʐL肯d7.$U>Q֒:v͋s<- 0%mD}qxy7#bDN>Mll,*U}'OTY""""wRw={3IX>n!s]OQ)}3?a+f8 BT0G1d Yof;SY|Fvx\.Nl#ZCLQ_L 4{'8Nx;Z/G;ڧ|{0G;ѯMngڛX:cMZKzGi_ҝ䣛6WH̉ |)ox{گ_zDFYh1~,de|~uLDmoi`=?Ԯu=R9a={6͛7g7WV-,YK,N=(Hp J5Y HǀQ܄e!Vn<`L,t}v5pE)ixS-kE8& كNEe˟_ÐuK:-bcǞu9 ƙ%*>yxixQhV2=8ى"9kZnr_OzT0;O+]* ѥ <͡T2",UF<(^Hag.AvN,L|`k~r{N;dԩWCoӝ:u:ODDDD>tMjٖ|ث [1h2In<Ւyiç4:/U_{WJ3_<=_gmZ ו N-w24dd~Y_wȑm,;E^a^9M,:)rV7`=Ey4v1?D.saG;7hiʗB `FX"g8t6 7&` >@:NDd3,/ֈӄ\$ս4O4.M@!9&VK;zg$RĄEpMBynϳ?J2lX36ص])g<)Ye$C'.cDBp>}ӧ¯=B-r\XͶ5pMAXaP&M8pC_(Ҫ95Lf© Ր2똶,uQ_[Q_SYռ٭W)nV .r|ڀ't"ߦxx~k~N-hyVmPAC8t~,tseO,{8Da S(4t&u ]7\=Wqwۘ1cT """"mi^ O]:W@ jkptGjwn"V/{%nixQ)c4'`mӢ`3g3yδ񲕣KG'=3f3;A?ɛ2'$#kvW |ԋ%9F/9G_Vy31+H[;cD81'0jҫbG)dFW>ܚQ2ySY&8L"""""ޢE 3=$$$'BFMnD.,ilՑeddO\ymY͞{II^È^t<v>fqOE רr؉{8::RDDD?fuK&b0;ݻ7P)Qh{AuL\x nP΃'Mwɇݼq%`ĭ ^YJ"""""we 뉵t ӎϻa'yml4eqnł6}i䰞'|Ab8|!Mft>9~+KRaJ7]€cv m \w&eВ|i7=iP5(gXɊX㹀GoWA獫jT7  ٲe% pkOM慵sY ҷ -p]^ypHO`> ڼACE/K N˯J<=֍|&#l xqq!}Vda9ķX֔*SZ-WRRH45kʷ_w3=jOݺAdFA^k $0/e̳cxªDDDDDXPNBǩ\2mn`eTwG 3ziJd x=*aVqG.D9?FvMŴ\xN] HV|MNn7L>zup +v,y>~(9>x)֦ۛ ֘i:ǟ]OysNHFVKdyp{q.NWu:ty^J#hXZ$Yi_ْ[!aGp[]>63AtCORH哹t' `_sˢg/.U_xrxfҖ]_<d]ɋy(=4+׊iٹ#qluy]kKO`y]?OFGS7F"`~b4x7WV`v )\JjPmlSqWؗՏo6}6n[uޝ|5[k|oVss&d8XrCB!nx]ŪSZi\4 s, y(w>W*Z$¨_igDѬZHM!~5QX?w 'Ǚqˏ-g)_S) "P7LğZ.ݬIϚymx;{Iu P¯(W a}F;Z\wxMVMr:u]jԛob˞B_OOGjӿsNu]w3N`QS/ÑP^yf{~ϒ)Rue3HeُoQD(Gdϵf54i֛<N0S}yxqJS,oZ2tmre \]2`:k͏NG)Gǥ癟#[eR,=ޟ`3W6ډ^ c>fTۅUCc k`8<= N֫`jἰ5^g@Ŭ x#fe;N!ljCe ]W{Ntx{e>n!u{ """""Nɱҍ +>~Cp@rY?1txl.:Cu0j=. ٴyFcˣ+"""",UJ&}??wfGSf|Tىc^<;q$Dq$fm<9#՟䍁Q ڿ*ogP=úpщ|3}q<ϣ{yz򇗳:"[==A.7AN8iw@'jKJ[}ąrM+7xkwt#gH[Ѯh*Oef+.K~Sx_135I&l;+Cߥ< xeݗ;{WZa>7cfkʕN=`92ӐǗѴ  [hhu0 ,H(FV8V[Oex\8jt.oa@ƺ G)ә9s4]z2X2uʙgF ai0tX>n7KplT9.dB{Z%̕c^J}[aߖo,`ȻvbKvEo2xJN; t+YrzKZ*G_tju$DZH+j}a?̡Ul+MU p~`MfX2eL[V`KkHPN:ҮQaRGlD#ihkh0eD;Z*͹>qk7e Yp?!շ ^JZIݹ {j則|E"JE҈^ǖPă-0=mx^_#*ϗcIPq,[^8<9kQwջ0iox6EqI_ )a4~1ۢb> >xX\^o7!5W>׬@hbG k%STH BՆU޲ "qJt4*㥃,5"ILX J:G<`0`ڱ`$&qe`:ˮ\3t95{]Y}m`4RfW9li'b*tRQZ2# 86g&@HVN)ݬmex^Էd;BϬրڹֱc2lS(\ M81o*J詼U.1&f{bm\̼Z `\k֛GCpFݪp>S+3d"n$$o@n/ržRqٻV IDAT(f5q 쓃ܑ?}y@8vLDDDD{%ǜb7)S&l6nc[NRClf 'ycI~/m|q7[tZn5BL e0BX>vxL[iU vJ6gӲVVLOjr9˾gEkB&ް|zq?/dCff|yiūQہ˻q(* [f/­n~51#IG+Jy^: C6 `kRNW=k+1lyD g_޼i,wXrj/Labbc| 8r_87}mwSSwl-×ص^T]ѩ+mdى|S^gtC:=Y#X(פ&ޛWpdrJwxb>k{x *]]<@ȃAXDDDDDDXy2G2ȝ`QQQQQQQQ``````IU 9}&S'HJJTmFbt<5S`[[6n9t`¯VII:wg Qk7_DDDDD;EXgODDDDD;EXI,"""") """"""" """"""" r4dHJPU(˽Cok8n^řQ5= H1<#3u93ܼykt\ر'$WܫjGu 3ݏ@R&盶 Ex2+bmF2 - ̞Մ|. KcV)OE{QmhT>7#yI6\@NKQgO,s}-"E 9xRPRU(i#rSt; Qs` v)ۯ LJW7twx9"""""G$b"pR͓Yt(*ތEm=?]2IT5T0塬[cNJ HIMӉ*""""$EfzIHH('On'))֛]Xت#qkZ*iOileYeD/cSؙ1a """ϬܴSpk:uquub`f||֣IݛeT{XD\]y{(R/脹,4Ҡk2+4-GTExb*бΩ$z2mQ,}>KAWDDDDEK.^C w7>*DDDD>Q従ipb|. )""""" rEɷn2צEv_mZxԏ#e}iJ/S^ҩ!""""rǨ w3ܱ&?^{v%Mv%btEDDDDDVPȽ&LYk2Srg?#6d`>M[: oY5chz]hW}Y+ֲ)x bX=_2l9 m"xz~>yjժ(;˔A^Ϊ0Ɲ gy=(dQ癍L;$`={mzŪ"5)?Uz]amva„9 kg3bL֞6[ -)y_/eEE*ȵo13 t~2LpJ=  M_?VrWiI\8է,K2"#<>Ks!6gX t+E-$_ᬡEDDDD偒[ c qTze R? w'5=?gӲ-DlBn8ݯ%B?/͆С[_dX|)]6pJ^LX_r2}0&iR30 NqjR`\~z̓__mKMq:)DDDDD~tt2>FHv:9#}ڻ͸ IF@6 EGQ\uUVEX[-?' (L#JA!i% yx8qs]ۭ s7V¼9wTo8kE4fN̽|gy0t8riNG:5*cӞ @ }#H$I/qO~6Ǥt{dbÿf}JX_/p+ ғ۟ PʪM.- $Ҧqm|cf$I_$UPEޤկbAK$I`7Mv $I$XUw;X$I@K?))Ϩ̒$IGzjJ c.I$őC`Ь%V=ǮOBGeW/I$RUL ٙPH$I$yTq8Z^8%Z@g<,c'`nJ fLqY3fȸ̟7¿SRH~Q@Q?zsSRH7I/bo֞:"$ITy, [gS!2p/oÏoN09.ɢ!h\oBZ5~Kn7ͫï 0y;: K;qU=(In H'f8Q$]͓%I$X"sV1U9 5o.ͦ-W)3+7޺?s jy/YS܊1hRȟt G]?©yz. ˱=$I `zznܜĨ#WJFS+@-d zfҁ$ @s$S `G^ZW.b.$I*-OfTuoԳ'-Gﺓ<}䀘~ AI}cy>Fx=}'ӵkW$I*)gU!2,sӍ;HfUtmHݼSnL 3ҶӍIhß~QœOwQu✲rnсs9$IR @QD*ƾ8yu}] t [1r]3aey1sgm/8KYw:wpr | s_fu$IttC*?r;mbW3kX2^2-{QR ~]\=nͱYOL#ep+d{%I$X:u~7ivm)b5|<4-Ư$IdK.o{\؇˻Guo6m Iڧ;9$I,}5o0TIiN>Ź![$IdTNۻw I$~hnߏG/Epq'iڅ^qe_X$Ih|4:Oq $I$X:6h:BoZ˒[?`e38獾$|\!s7O $*a+fSdZ5gU?pDGƘ*jB۩W}FצuRYәrrm$=u9Zz410ŝ%I$7)%j Tfw! n;vMJDGSk-ƒ7~d>ڑgפ`lRZ k/oDu,!ٍc|غ5%}Vo\z#=|~w|}5WR>4o\ƾ)hߔG='f{i>1;,K$I2%BW^NYT蓃0u+'P EƄT2.\źi_ZwxR{;Kp +Xy2=%n-|'-4Z?MN糹C vY{Hcρe,K$Iax,U!>?5èuu_ǩ˽@~}RQ!@|nH 0!XdG&@Md$I$X>D<^`k֚G}mrD%OQQ@n긋$ICUe[زr#{dF7"" MkZy߸$'Pi@xf4-Chf֬߼JHؙ6.$I `Pk:jD?sƧG)̺0m:ХcqH[ЙO;rCtSaͪ}^ SY5lZ߆liܔ&I$Uo_xvvy~E\$9׿f}=ӃX^:}˗6@RXT=h-I$*ݷ]ϛ--m9v/H$ITȥ4$"'}&3sR#I$R 4~!I$U~ P >/-$%%Y QA$Id 2\" I$IMiiJ$I2%I$I2%I$I2%I$I2%I$I$I$IC`I$I`A$Ipt< \R_,HƵi]I$I2U9B,~ٻ[ߊMJY=b JB$I$XW֦d}}&@$IK ƒP>z#_6Ճ+=HtX"I$҂>|*)K #lѽ9q"_{j xޖqko}?<$I'ox5%1$r_sjo msAYT}&˯oʸjnXt{#?iz-aY$IUKx#"v>:>~MSI$zJp_P熄Lfb,ԟ^GϦuHcɫOdEAwpqDkt2e唟c7ZєmKc_ǹ;( 4q0槼;:wLF_ۉ{}녓99 5cv4Rcl|)ILյ-S )ևy9N KH#}:>/>l?'ڎO!"' d4n9o%j @ظq~"P&U ;X1B>6ŴU'9U >7<i; oȂڴN"4k:^N.Pк =Л!n"_+Zϟ?$I:yyᩧ:GJ=O'n{*3pG_w_o73Fz =!b~ jR¿>Ob2^\jO iV9&2eKŷ&|a gL|/<* ؆G1fU}P=cI1{+PĦw橧ii?Ψ?? K|-ݝAѶ`#>9/樏l$L~QeaذcZVQ˥G!:>?{~'/,9|a|@gY1]fHͬ:J(8g_XI|#Z&a̚=@xa:;F~m»q-}7<;g$Iм1@F&rsbz>4 ˒$Iq:̑eҡCC[] ^Sͯŀ&ðX?IDAT ؍쟾1iA7fL;XAj׏pdBz׋zL6 +XͿzUrϦ}gZ~#_aE|fw w>~=a5֞7fݨKyJ굼ZY")IğRsyן]yo_eIpMrkEDëk~Z>6}kDeQըYLԅQ @xnRɈoJkRp}y vz;,YMX̓/JukY4>oA禉 )4oMtl?<Hx C{,sdY$IU3PB8G{ٸP:vwmT)|)S0{@"j%P3Gɔ-h>q pđX= wv7d[f @"u PVcp`[oNqԪuŚ D}MPDA*ENQ]neųl $pWpۿS[#P=e/B  0!XdG&@Mdђ$I r)biNhIԭu$%WR,9|{ @RHx0RRx$C{ ("˻дV:uH[-NN"}&oFӢ:mfͪ^lTBrΜPuiMo{u޻,9.e}~,%I `~we,zk26eoBػfn:); 8 2\}ȚIqIsVoKc]u{JκH`= oCl;z`$`'x_t:ןqww w>d/~6;~\hCdg>\0oOePb@Q!{iE/NIY^_?G)̺0m:ХcqH[ЙO;rCtSaQ8x*M\-[LQDI*(зoPIilܐh(<.û͊qkZOzO><뫊#i9Y+7y$~w\DI>A.VI _3;Q~Nvhۮۚ`IUۮMؖGI׶B l/s[ѽI)G2~%IXR#ҋZҴ[lIznq,ke?9Eu3 H:$- y$IT*) ~ Bbxܠ{;G'A$I] T`L+bb|bcc$/ @jjjӮ];ڶp&7vX$Itb0%I$I$I$INxEz0hRbҿN$I `UA2ꖛۛo{)twP$I$zkJ^KAE9($I `U7QD:$I `U];uBȀ"I$VTs<5i=}<ڮ"I$‰ptrsO'zٛa۬XH$I2U5HQ0g_O8 $I*$1+#x  I$IZI'HEE$I CU ʸd,f'9$I$XUO&ƳvSrP$I$zkJv9$I*$I$$I$:a9$Iߝ2U5: I$)XUO H$wV׭ ~b8ڴ%6R$IU ~b8z \:wAn=I$I3$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$Itp pH$IR%R;`I$I p  4.2$I$U`h8r pz h,I$I=BxxmPJ,fYf J $I f[^6>E2Fpq+0"""H.㾖EH2|-&I$IDӸ=}-HAXX弜q C3`a%\qJ5(% ]$It|v '""Rq<_<,,@ @XXP/I$IR C5\eQ3<<$I •])I$I:9$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `I$I `I$I `I$I*@$ITѵk $I$`K$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$I,I$I,I$I,I$I,I$I:ET(,*"=}7d߽"I$IDlL5jJ 16Q| 5OfM;L$I*ޝI'+ؾMiԠ>4:w$I$U01բZzJn{2];w$I$U`k'{Of{gI$IbEWk6yhI$I $I$$I$$I$$I$$I$$I$$I$$I$}ʷ9]Ja@xxNJjEˮf'{M/FB^e<ȥA$IJ6\LOM&ecҬi {=>6W%I$I_RfC`& =ށۋ>Gc¶]̞_r&A$I$pq>! j5blE+թSc_㝥il ݈f\M"?V]~6Ͽ8şߊ~u3WwN,`, #ױ/U ,>Iܶ]FMZթE#O^=Z4}#}߲ |VMըѤ\w#}E =|:5ZETv享Y/w$Itʢw̜95k:(B::2@SM'evCxZ_P:?fb{Tc:ur7?m( ՟omf=,?-COZّKgRq\ъ`^srɢT>Z[JސA괾7i4sgLb~i]|#K$I'BnܸKe]F޽  |<ٖՋ`j6¶^k2ggعؾb=ƭp < Wuhf;.iw&h5]dA&K Ӡ^}ԯW=\ kYgh\/lr\/)jQMг)f-!ԮC`[6?imЦ43%I)~g͚Ev5kz2t֣9Wј9/ȇ$R5q(!FIld 1/b @kĀxnΎ9|noddPDDLᎌ x^ˬ /9z͇NF۟ 1lQ:-ҟ~ݝz%I*~ڵkgW.5jy0Z#Kĵ׮g_?$3{%!'^)"j5b,Wlx\~ \xiӑ4?P(OIJl W,aUd,:aHxɒ$I FwS.i&Ϗz/Kҏ~,$6"tbjRI>tq<2`wwfQ1IN '~Ҿ}{ڷoi%150mY DsjtNV@FvPBq1P9˧QM;ₛnw],I$qF/_TC;2ɚgqk|ucCb F]HKKxy[ gͪ"һZ|H:2_| Ik)edz$sV4< l0WWE5c1|׃9S%-F5 ɺE{Үɾ%I4~3 fktEOZ4Mt~&;w$jnމ}`C]'181]gB3gtssJ޾};/YDzA&{f֮]khhخEdMމwg}c;tȐ!==YwK jK̖[n&; k{%Ďlmmnݪ3Ԍ3A{\{l ggNї_~w۷v;ړy;ޒvqѭWmixҊ܆P -,,BCC;ηwJuYu_xU۲eÇ###>}Z[[(qϞ=tRk31 ӧ;>>>l6nϟ?odu׭[ĐMMǏqww377 w몕^Z"pܒ؜+̔)SF!7ҥKϞ={E F]pA:%,,/_8yt9ѣG9r@ I&޽{߾}UUU8:ӦlsLfyyy֌۷?`0N:E&|~]~W=O77cx7oޜnWw.\ɓl },Z޽{޽{?F͙3NGEE!zx[ˠ˙}Al6޽{fOOϴnkkkmmO1444t;ڵw4227oKMMMP{"~Yv-ź|rmm-Fֆ#F-ݭɓ1hi#?8JHV1s7jv}r&>={ׯ_N 411zjYYYW}BhСcƌQUUN\xqYYkڮ3Iee%I^5J[[;??_̘1‚={!QQQ#HǏTQQʺqjl2333 .۱CDbffSQQ0a@HIIu떞c:k׮Hݻw>|uKR] D/Z+~ p8,kƌiiiuuu- (ˆ  Wt͚5qqqI&h4N={xpфB!gXJJ;w BNIIY`B)++200믿ew bqZZk֬155W^ŕZp)'33p&=2qD|Ozvv6vww|盛 V\2F.uuu:~>£-[>}>>ƍR,kqFPnn#G݃(Jmmk BK,PWWg0ׁv?"P(999'Nh`gg7}tVUU%kV===?pDz~ rZZZӦMׯH$֞6m{$Ik=Ns횹e'DEE%,,lxleҤIzzz\.ѣx+V@UWWڵkԩ>>>D"ŋEP?޲;r)6|F&+++ܹWowr(})z}ŅѣuuuKKK]VSS#ƍ  !_[kQ [;Nx cNFFq4̈́d5^wwDH[[{ɒ%KII1bwU]( .;;;ڶ'##G{;j0;;/00ѣG[K4mڴ'NTUUL2󚚚+W;{j}}5"H̙3MMM3f̘3gΩSnxxxAAA޽͛WXX({?c%''?=<]__?mڴS Q)ss󬬬h#lŋ8ZKYZZfggGGG͘1c֬Yxhjii2cǎ!BCCb?f;{W^޷aii?(mۆ4J/^pvvh;;l5sLCCZmmm#GO0g|br'Nly"/aaajjjAAAJD O/^ S… E"/X@䉂| $I9άYΜ9KѸ\..}q|>?$$޽{_z5??W^3gDߌ;͛7'[wwӧOt|U]t [U"seee988cVVB?K9_|>?66\fV ilgg7o޼+W͚5K#GbbbTTT> &\p&뎶\JCC꧟~K.ݷo_eeeW<^JJJx<^hh۷edKJ":vq0s̋/-_|ΝW}MHH=)iQvOoϏ>~HcNFQ[BXmSjA*TӧO֢o>>>L&ѣGݻ8|㓘`0.%AtACCov…4-%KLLc<#l;w FeeoMcw)..#\]]lv}}}ZZZyy€[X\۷\ؑH$:HNNEqpp(//ǯsss;N-wD"O3WX@x5y&hmm</22`tyBMl6fK&LHHPQQ),,d0 -rlvQQQZZTTTp81e PR8*** €>k tWYYYYY>8cccRR111iwjkk|~oˣϝ) >YYFv Pӯ_PWWMNNNMMeXT' sss33˗/ԔJp ͬsKoo֪ŋUUUL&S DeD"@`jj*dGt Bif3ǏF1Lŋ___6o< dG$͛wH&WׯY,6ݽ6**`HkVD"~Cff&rO-+Ĥw޸n 055tRmmm~~~tt!CZyvk :4555))bE`qp(D|x4ᛥZvG[.2輼A)ܰ[gkM^`,kʕk׮}юܕ!C$''7H$ܞ֖MUآ6vOj~G@k5V<0?H{f<O<&&&aaakA8ܱwvB3fZ꧟~zktuu]s"B )_K*455;VOܸqˋdFP>3|c @YYY!!!O> .$NNNxHZ{566jii)ǏS@$TjCCCk%L&JŻceܺ&d~.+}=SSSS2sCC[ .К/1|w[*\|,,,E"|>_ɹLhPWWYYYI$I-B/^o~ipww𡫫+ѣG+W(//hwv-+Hf~끝`+9477 liYBѣ~~~qqq &xxx=oGd ~͛7[>Q,?~ '.Bhiiɦ8km26.gzz:2~Z"8::x&tuu~m'R˾1h>= K؈)r޲%d2,"Ɂl6[l133{kLfNN->}eۚ\N%Zֳ4nYYY<s- MMM=yyyD"ݝB:¾kic;`!''3rTewc7/6!%d[t]]ݝ;wx.fPT,===ߏLƒOpppnncb~5(?hDMMM!11qT*oXZZJ4iJOsqqח&$$L0W^&&&ӧO_Yb8>>~ܸq4MaF[[[ A$xbڴi/^L:5//OpktzLLٳnfff`` ͳхWWWѱ0a´i޽ P(T*hMMM_PPecc#333O[[ U6.Gd2,555h.O> qSJӌ>,c Hlo/633Sr4HNN2dH644dffΟ??77ǂͩT*HTWW'Ϟ=R E 0$$ '?JT*uĈkkkwww]]]i͛7ӧORr.?DP(GCCC,3 777*jiiI$R***rɉF{ԨQkҌ!={6qD{{{*jeeZZZZ4MOOOFTX}mjjĚ兟<ѲBʂ̨TIEEEQQѬY G_TxkJ:!#G466R҂? ?BIK ÄT)BH$jjjrQKannnzzz^^^kocPlGZ})h -#(jT;ZSNZs]O;66688>|! oo *.Y˖-SUU}+WtڵkӦM:tX,f-Qfccӿ*<℄wwwhٷsssßBCUUU/^H$׮]5jٳ; ɓSLYlzCCãGB޲?pfv.[VVn:TUUu1\%%%7oޜrSk3{#i$V$l2N ϟOD"ћ7oN8gT*u<Çr!4i${{{DoܸѭtK]]G6++9syyyW^rmݒ42{ظ: jTDt @-PD-݇@ (y >Vdn&FA%O7@Uw  i}!Z#II}I4'9X,CwN,K$bA| !?ɿg @,#D$%2A|`4L:e' ? 8 I>A%êk@  7bH$H$D2! G ]ba$B:T"{5q>)HHQBįM Anj KA=ƫ;VNRXv !vtiĠNqH$4 #' UZep)hP'"GIuC>gA*7eqRnnw!}6wDy,;%1SB稨Z(tO @󟫫+8---33Ӽ$ ?Ծikk[WWb̞899mܸ!{Slu" @#5c;ޛB8BIjS!'dCs8yԮ*IMϬN6w3k>!}U1hMc֑7el]K#'#_kswGaάaJwIW5EtOA Ym~|TreT>+ǁSF )۶m~uĉ̬߇"cNNNg5donznׂNܸqSJJʹsmۚܭ;奥YZZ)999qqѷ/!&=qk{,;&N%񹂶E__ dfehOӱFYS{ZG@Sݭhcc㠠 * Ν1F 444VB"Λ7WGG'&&!TTT$qP(ZZZ+VD}YYY 5%+V,/((ܺu˵nov^Oǵ=L_tYAA̙3=2kl^{ݻ\>A&Y,V|2=zƍ5S>~FN| Bh͚***{!.{QYK,>|#ҷ˖-oGpf2|- w*  Y 6s5 3{kCE^Wq\vJWñ!i!$ "_ Xenh^2 @I!4}tccwX6DRPPp ƓH$3H$>a^^^d2ʕ+G,++Fџ8wqio_544B JNNJNN;v ڵkbcDGGZHww;wѣ'N'6,<҃1 g`222=z ׯ(,,˿pYloիWrrn!۷ẍ́˗/#BB]$&&ښL&/]֭QQl٢255=s;rܸOoYFFp???vߑ-鹺FGGMWX?تU+&h4rb.^0ܹ> :zȣGcbwکǎ{K QQQYf111֭mY3555555<^Ss3p8 Bn vb?~믿,^8"[+VDEmP(|Pd=s\{NNNZZZ9C,b`flflGѷ "Qw "Z=~]SSs-a5k<==>}aOO5kY|qgםoJ1f!G] iG4T!}N;=w/#_"!dd`L|:>GA?@EEt߫Wݻw!|>NھG<͛JrZ[[~Z'vS(Kǡ5{lDRPݻpr LLL\vBH wW\wᆳ=ss󢢢\]]wڹs箴c! Fܺu/ -^;v}fnno_Xaaall...,͛ ѣGϞ=բEZGKKر>ܹsD"9~BV]]}Μ`˯ COrQ"<{DDw}7z]vN[b& `kBnƏO$f̘}qnٲdmذ믿^re[jΝ;ׯ_G}76_X=33cժU/RSS D,--i4~{(И1cBBB4m̘1v;::͙3gϞ=eH"&61PSĉ/_ޫW/wYooooo着kjǻuʔ) .̼rJttcb… {]9DQ`mm파ݼy3<<ܹs[ kGqtt<|0B1//o;=A\z&)x؅DM#K<qY'nqnjŷU[]]]_ۚX7mܸI}F}7lÐ!CRe "n];7D:FMOk'N{ȑ#~ak^^~JJjSSСCB>>>8yX,Ckkk(Ӄrˠ}BDB@{5Il`0׭[#qqq˗/G-YDGGg`ٹ, f233e1? 80##篿y&ΆQ]]mdd2d@PKvww@d=z0/#|춑X{]K9 ~9!T_ (q}__߸U}1c*ի !SZZ~"H666sܽ{?+++GGDŽ/G]\\"egD?aʔwknn&;c{)8ʥΟp &hjj>y!$UUU[[XotJvxճgOfhqq;vlϗf7HQss3 ?JlbT^zveeOD&Oã-Qo.[?|@Ip^l f2˗/\UU]RR:sLetMo  kwܹ!_~=`rf==zvl3{KKqhjj3FCCC޽{#;lѢEw~)8̨md8X"a֋GYSS7!kkb<ֶ!4y'O7?Wxyyedd>}H755xO_z¿ 0!`cǎ;9>#p.+V h'}e_wܹΝkeets͝;Ǡ{,-H8NX^@P[[{_?߿NNNv-߿O$ߺu g!++;!Px3gڵijgؼFI;񚚚۷ooڴ8$TZZ6w\''FHx؈&&&3ή~ڧhjjSNfሊ$;~UK=-Z_~ŗJ¸sW. 5k?l^hhݳgʕ+[Ֆ=zoܸĄd߿_IeTɓvڵ֭z8SYYzjGVVV~zذamY3mcx%&i&ũ_|敕H$0O>e( è[yeW5uTlrЩS5MLL?іʫ h g޼y3R:Z6)) ض%mllT]]#71|Զ oIGG@ ^*Ee1,X0{Fݛ`H$77m۶Ξ=GISiɓ(ޱ/_!<Nt?;>>}T\}Dss[G:/Whj5_oiIII[l{vFFȑ#<==ϟ?߯_?P8hР{޼yѣ>tuu.wމ'._|I6zKnܸQ$GFF>|XnuVyyey;P>VD"bH$ l#SphhhDDDt}T+]CGU U>&{TEELV!HD"@ ۇ(|pN>%g;*nZOfffşJ!u33?N矻AAӃ.Yζm[-,,B%%%=DTTT֮];}n#\ryiiicƌ Fݻw?**CCC3q\V~!cSKS~`cc_JG?},z[!4n8b…;v`dժUd2yÆ EtFFFFwm?J;?k8CU{zn`!PG$m[ IDATڴu lܹbo׻4,} ~nB& B %$D"?NRQQQߟ5kV}=Ey)ehr8@FA=ϲrrr>ct.~G,Ov rqq| P/my!|P]* `3`@4łx4Ecz"GFFFff&5;G "P  E"X,H$jtg#"H"d2>󋍍Zx"(AAL#Q B| `O#D"*! zI$"H/ )h_^WWwݽY4>***[ssTXD"bX$"p A"mbH$/"B$Ծ'O R_wK__ލ5DAϴCi d?C#־tff&~`, Ap#FQ@G>YU!|/UH$j骫j2D"!4ƒeHBd;D}4|(F:C?fl{\SqLsʟ=Ύ67@|ƠZ;i/ у4|In7\tH$Hd?)C&=f!wd_\qv$W/ȾwgÄ利jfYݖ-[- |(x| >ΝONNNQQQ!WWWPZZB!4|piF'OX[[5B mH$uu<~!B[;w477#)ŋuuuy<4D@u@1BTZUct7..7BHI ZOӈP_ 1!i ahcP,뚓(n$*zy匣ZZZ >k,wwwvssxC655zEGGfE8Ν;wBvrpp[!H11ҒFFFfff"\]])Jmmmdddaa!BhǎN*((7nH$zEddn…jjj ٳgzzz7o޳gC_r͕f6֞ 0aɈ7_Uve3J![r3ϝ;W^񇖖V``]SSSbbÇl#FR&ԩSN*7l GB\.7++!dii/455]\\ t=DRzАCR### 'L`kk,Ç>!T__K%qFb۶m555}駟={v=. mC$bM ZW^W\)((8pĉ/\p%//3fzJ(|>̘1g޹s1114mܹqqq3޸qVVVAAA"ٳgeeeNNNx޽{_rE>|xŊcB쫩EG9kЗQaW!Z_Ϛ:3g>ooo?}𲲲aÆ۷#"##={ Pam[Xbb"BSˋL&|čر#44!""Bnm999迻_5""B[[;88X&9sѣGeX~ g2FZf H|Q&M/69߿*p8|Guu5|䉺Bfq8X=== "8mhh(..~⅍M3L#q$ccc555%3lczZЃJfcXd\|Ç 'L&;99ebP(Y>m>#^|b|||BUUNj/Z[[ LΝTQQ!*uu}l۶ Oz@9r$pݚu%XyXSwB $BY S5TPRq:NaFعع[:҅u"u1U US(J $9#NAxϙp"2Ø1cRi~~>999K&M2z~o~~S=\.ȑ#{ĉSN0aBmm-==ݙ3gٳg(88455IҵkzÃeٞnN7ƯYnttv:$N7Zl_|q%GG!?MMMƯEEESN;vlO[=}ncu.c'T_jպ;VmlldV9׷9w؜?{le9'MDD}i/X,޿!'O 1cFF&M2 ~MF:uj@@}|||ƏԔs*>a\.++3.p"bY6((TReff4 /X2!̬Ɵ?YADvCgcSGEu=p܁ 51~_gdd6D"ZmggzY>'Nx7X5~չs>-9of+sv 瀹Vj;u𨫫|饗xӧs+V\vMP +WQ}}T*r7@&.㓠)~͂Ac|/e~{wn痢UVVQRR֭[+++Onkk0FIII=GwS(ǎ# &|got{OT:::,{…Çwtt~וJĄ1 ?s+˳MZWzIwJD|>Ǐokk+,,왈=iҤӧUWW8pZ{{Hgg禦$ܫ}HG J,syWmۃb~h^ؗx<^gg1c-[r gq#3~>:W<ήV5ihT‹ժR'L+ڵk3utt4w}d`hpa4n(3kFv\3"b;4,X/01ǶS]})J#4G\|6F4?TZ[ffjfmn-iӤR`3f\.2 555mV<6ahhwuK;v̸oIIIaa!zS677gχÅ/A4<*Obbb" v$x͚5˫WwY]$ۦ&":sի;Ϛ5̙3666(m1 ڟ=MbC~Zy_r۩嶷s8vO?\h'z@c9>_daZ7})d'_I=>>cǎuvv C3%a2v_˰yt82*r" 1oݗ Œ uqabIR-5JZȇ'<߯Li{MEY$F&rbғYۍ4ʋ2,q36{]a8:+;wVvOX:5}=k.^HDGAub3^BG} T#8w-i\ina[u2IaUy)I; ㉉9ʮNAD~\b mwd$zxRF 16>-c ahP' =<NZtiSSSNNnxLqxL}怩#7 7$|ݍk"ݙoDu hI(z*[鑡..v7W"Δ +XմrqԔh3w ];9.;߲3Ǹ3׭L+#ب~B{>5ʋS Kא!>B>i)q26gήYKD'KǮ  yL\z mKTGDpUnX,fҬ-[NϨԔnDDşDn8܏`q- * )4ێk9>i^o%Z1ˎ^Yމ*+l<ꭳ~z .,,K$ H-)(TD*BvsRU1bOnĘj%3tDTU v[7}HZ/T_gK55ܱVDMDDE'j DiuHqg*ܩ­7smy ,ȿ¥-IYsY"ᔴu;sC=IRF HT:"JџNd$Redh- 4Ir(qг|%"Ym6~?-,,ΝkLssszo9s̙3U*΃6666;yժyyy}嗗/QxYfٝ>}_J?jwst~aYY9n&aӮk86+e]7bC@DYm'DNjǬsy\>HSS\*ɕ;FDw)ĨuJ<aX5ı*K{}Uw\]xtN ۫Kͪ* ZfUFq?VV*+՞I,HVP [>F(w'IX9C yPHDǏ?w\mmmΝkjjz饗Q;뺇>Oo[[[8p[~}ll o.GRutt=zeY__߈%0F^^^۷07)q' +5 "d*[)K QXIOJCIv`JX,V&~ݞ8~CnRJG k7Lp .WR{Т15Gޤ+LZy@,.X"۵B=yn>7Y3!bܼZy<1ဂR!|xw/cW_YZZj!999;;ٳ|>oW&MzBgP(&&&S655NQlsy]Wlu7yG*t, \]7E:41)oHgHT:""S<[OW4s(gfhp]G.}kbҳjYanVZRr8ǻ9yj DK-&PqOϨ2L@ xv}㍅Ӓ?i97)W^V7_kq8W u >vww7.}ϞxcW< 9Nٳgm۾}"25ڄrrr>#ss ~_NYIH/뾛z IDAT}`n~qʔ%r"?˲Y(}0ᄃP(477'D T "R|c;o/w5`CDWFz^777g^0>#قOl\|r MMM{ >g655_zxxxxxl-..ޱc?⺭78{ŤO# H}k_*\???;;;"jkk*// `[j dpW^tY;E#:XRTha/;ƗRQVGݘɓ'Xq ͪ g4`>pyEUy)IѶB/'_:eZmZ5u JGD X KDj]όcbB5f"qC`@Ihgx \ 535+a툨]AG绾;YkC)9X78X׽r绹iڕG];L4|ybgAsGΏOX)'x5u~|nx?26&>N1FrYD3):A[ys6D%+!,(X Xge~^~6©vnT* ÓO>ڪ4uR.wPX3eZuc'=ӥs<oeXӳu:Dd;θDKD-LYgtzu;@ī^eډ11~fv,;.i]M'_ m{ T_Q?+9.XhPtwG<]bY\WQtgeJ|7W12i-eke0/{/^HDG!M ̞e_\j5]dܹA"tGcǎ͚5Kdgg?~ ڑLdY~vqN&;'>|yNwO3- kr$ﰧƚk[>mYcf 9͞jWyrpfc ŖS@*.T\)X0o-JRZ)Ke+0f 7+Սr&CGgSKۏah/_ ZqLGM&rSs {2L F<6BF~(3E (}כG {655 d$M-?O5T??Bbk5O9M-j>sXaQW^ynm}~؋%|}\l's~ri?NTBNv VV*f NaKB7m0@A.ۿ:<6vUxE+"7* S<5nIxD3Z4穙\k{2yZ/-^ dIΛs:; *~E DD󼗒:vXDTYN݄))ngG!"ļW=!\]s㛿PFKe1qKݎRO;J)Ž6\64_kuXbV׋9ks▧HHq !Z$nK4ŹiDDJH[%OrIFBaH3#G?cY>zesZ~~ 9)'mdʄuq4<*0 ǟ(rMj8t!1i>h43ɒgi1FDbg,m{Xؼ;>Pvvg~ҼV݂k6mho*0Ah6wQ/[4igq+D`-qx87E׼Guu/L}I'uD-8j=f@@ #40"@@ # %켧Ots2'}s\z&_bPЛE.=sA̐ԩas[QЋlQfĹ( z@mq~^ 53^HDz兜W hCSrkSkT10h}1ZMCCme+ES| h+EAA o^pl\xYK*PpYo%[ZES#=z eA 7h+ r* PmmmgΜnaaQ^^T*<@ڮZ+{FFF|?co`̙3-,,vaLBU}=Q^^3YTVWWtx ,677u^>X]\\- /B{UU@z@DUVeÉuk;sy}ߋeS2ik֬0ٱcG[[@x(}0ӾkT<7$>+IL*dnŤ' 1kie)X"9Yk{?M)xwqBzD0WzD8i{lBNl455~yd?C?!CuĜGSGbQWr/()|[y݄,Y-^!ie#p=$,HLQjeH\v;әe[:eS[3na7ݏLV#5 0j]d`wJa81XT $#yaK ,a|B<<"/=1%O5"ƨee^0بb/{6*eI)jK̊횳@(|wLήzeSf9eP]%S(Dq'Henwu>YB^FRq–YBJ 5;wnvvv~~~,n4 y#ZSfIJql̻1I^ؕ|qLb|JYTZKD$-S9oWzu7$>kC˓%z[jؓDD wl"r$*P$8|Y ǽ絍яJn1@έMpc7СCe"Al%bTqkߖU&()i˹;sC=IRf\XuX%9>ieR""S*/#7rKXgNٝF`%17Ƿ,ܖ,~q~].+H)tDjBڏw$vJtH÷$\'%b~D" jxs]NŽ `hTJD͠oMo /i㚿WJv#93,:jq}FydeF%SJ%Z!"F)+W(I%{!t*lP=:zf JRoIM ++Krs[sܑ8MY,UT$>}ЍQNN`s^'1wlgɜGDzp m3說*yOE$Z(KOʑX{Mm'x[qy1зf3#E`jtXyʎbXԅH3=<%KDB7W~L36yzuBSo1 &V-+̕fHM $iW3bxSpA``RZ* Vd]].zq­^|N!=O3ISr |Y/ziN:# 8Z\+yrdh!16"CTeAQ󽔅)a+Sr!ܻ洃n1 /^1;6wDT|H.'Z-)Gs :$6emׯܐ 6dG Phx LwS|ߎsMt>,roMFY:kJ\QOz궇qK[kӛGh{ZIJWp?-bŧk3Nk_ƋW\8f]2||)^nǾ&Ǿ2a{f(̯40׽fw'r""RWlOΟ8ӊs7DSѷ9,SWwq\muѶ'DDnKmP)Llg2J[X&''XWۜb /ٟNޚYB,_c-2nU\"+.k^Ik|meDԌ$ܒ9z^{Q>QZ^jF D62~[w IDAT5êfk=]w^GP v.N7|oW품`/;;ڹ \^KX[Mܺ/8>-GU˕s'>?:9=vBIDsvWmktD+2,sn6$˫&Λ /+mDG /7軺aǿ%\LfIyֳ߭'.KS\TxD iX, vqqqqq!rbicef' h-9j=uZX8|_;}8[M4_+XH>6""yv#G[{DDl]EwϋjU GQE;1jָ& F8k4:QUȎ&"q^N]$ $gwuDD66d Q58ѤݸgnMWtDd3݆SNg-3JuOWhuE͘%5KDN\c}BEE翻dx+pE֋K9y(Yw踊XڟqT".?tvXhXjLˣ7mڔ)H$Iff|oK$"DvH~FϱziceI bQΩ=5UoK~=s=ze+., "3yK}oj<nM'_;w{u"-m=}WLucM4u]B5=sG=KOK@@uwkƽ-/>pB? }~xAzFGf@g"jDLD9{9M.½w}d0WZnݏ1 H"ݚA:uJKKKKK59!<ŅcXٳI޼yܹsɓƆѽO6{555QQQQQQ}nڴgi>;{qD"npXp5uM%KpC._?ymIYƩ?)/H$ݲhӦM޽Ik׮SNڵ|/`hf/K\Yȟߚp^4 L_{πuvvvqq9tPOW gggc "ڴiӡCnݳyE!e }mnZ.޳a@%.uYȅl>{*"q1 ~@ڞ N6>D'>tq qC|ΞN+;a.I9>Nֻs3kr{E-&/.wfF?b "W_G"bfDj!X_^h^{+YAdhҧƍ6c꪿է',Y?fqOPȁej"NO|qMt<"E[12 8Sgxq u|fWg W$ ZcqctyyX,?~|666}vmmk.3 ݟ1eh4vpv/2nj.L~ݸN/ $B{wH;YXBw<.JZuӝytKq3u"gK`ŭHmɼNQ3N pKux|mWx?R[;= '!ֽ{@nD"eۆ666Aή6m'i(s|?)?]qGKڎW6(SL;ІK^Ե'Nd69)~ѷI{+9X4#‹Mϓ_+NHg1BQn^iv ^h H%ƲezV}pM6Aoڴ)##tZÆ رP}^aRR'_9,'/LߚTGuoD[ݧ;+mJNLZ6ivZw?t222.\pŒ5vo( i#""WޚW]SZ|6XY}WtU*餫[mKJ," й۩)tr|~CD{m9}Ӆ'dDشO{GXO_5#?YsW+"bٵ`o~tKNws,hcГ_ON~&Nމd舚sʚu%LEMس%\SGqjۗVS=O-7(Y?A| O>V1-//-"ݫGݴiѣGE#""n;{˝L~4#*"&~K1a&Dt7L@;vƌ _Hx?io$ n$ h`ڵk׮  o۶{NtnnnEEEnnnRR{N4uι .$s!lĉր4EA+:eW{KN}~DqJ2"|Z {ؽEےSsr,W'sw}z=) ꐀ4(=iAABh $-4EPpoo@/=$A@`4QSSCME)̀ܠ<>OTNyҝA}f$ӿGMS }g5"a⋵=QrN30)ϱ_p]Q5 -sx*7=5p+K?kkIY*:PڇHA'rO\d0M-qAvmDNhkؚTT\lNN5J.疐'|uEDD:bZ|4%Oj3O9P o yzYǮp5_h\]} _郞85N>24\_.jӜsEbV%G-ϵۖ}8+6~&"2wqB;Z<M%hhvi<[GSN!9!pU_Blh@=OOOhn' 5KW[Q>=o1"h45B 1UlV.oEZ#K6$7軖);ǻ7<A""e}u ^9Z_AEL_}XctV&[8&&򗿜=\_nKmyfƪO(zjng'M,I.?X5{33w웹p"ߝ6݈ˏ=>ί_9l I/k[ SŻO3UR裆 k۪]-xz6l~am6m:X"\WW{HB$uvG!q! EZ%Jkt9c.;RV8:2zX?8qvw!G?N=j| C".' VL|oV(ľ=FDD_"b=gR(~j٘'ٟjܩ&"otl86+kQ="kyhm<\o5H}p伾5?59u(o:p0%}0ڣ)eSS.l?:^{oPWX*'—u}~l~zlL*R4z8JNȀ(c3~@Oa{⛋k02oD ! øwQ+*cT{"MqpdUA:},P*g*Q{iTK.mwywSw}zLgz_mrR(9!/)Tw>/8a_PŮiSzzoOw쉽􇷿>C^Tg-^=h8`n-˘*;*CN*gM⏞΂fXר'(,vHޢy4yn wSʛDD͏H@<_y5muUҽ0zDu zT:."ՆE"= de9Ebݲ#nkx..()ݽlpo6>βॎT5oog{u;DD_[RxfǎԌ'Ex>Xms*:Nٸ3SD~H>~Twg%[ziYj5=c/N1_ܢrMD;ں|eqJcvݺ`UoO oiu~%?^xz@""I_r{["k]14a2NeEJ{p>msLbW0{dCT*ou\Qvpfft*m/hV Zۑ9uE!NQ(58'2)Σ6twոDFDD Ҩz醶2/X/e|^7+ŖS5Z %v]H]{o+﨓|)/?8KRqœ۸O=O8 h\q9*\ZQrM : ~~H8_*t<BV9c|6qEV[W~]7v{w6]{q4bQ<]X .!ԫw[U~̭TUpTnQb.Cgnp:Dy׶FC7⼢6S.xpFsƹ.N[.Ve§k]ˌɱ-V1/6vJs#s/VVnVFG:McCCά qwvV}  8h[^S;ikKhھwkUɳֶ]QO=Vz\bh 婌T4һ_"튎*:CpkPP\i]N﷙-f~xVm8fɷfoO{mD֗ȼq[nIuxΎbkފf_KC!ᾚaMᕿ??:ZnTҷn>NEK>)}L1$T5~-3V&"dB(KVx(D]J8+bBԐ^m.}L`GArUSM~)JtYK]NgT|]Sb=gRU6w%q()]}87Vb vdEݣ<IJ/S2˾廇S!'$;_Vs}{{#;֦..>y[qvڔ\UkccԔvzys .[S;vH³:З{; )[4'Tì5C""7.䦘k&YS}Zq\w G,K:X-І',T/صif1qį{!.rS/6XƵMY̫/8nŻhhMcZӒ:oMnZ~Ҿe}_õV?4y}g\cLϽMq{>K-4E\mV4EA"<F }԰>zm[?OP;,0][uE7_l7+T̀VIR,=; wxsweW$p øwQ+*bH3vTL- %"̀A"H@Z h@hl!pSxi /(:}@^QZO@[h=D pɩ hOO[oW^z]&iΝ hVōv/,rt˲բxolWowMjn(p1pٚt.Æe'FRܫ&d2gHHH.]ӢwEUرc'>&%%;977WDGR:wvZ e$o5LvBM&~:TR;֣M#EEEv>*++6mO<x^}l訨("D~~~ ^VVVSSsM7iɓ'_oYYYRRQFth :ud#Fg:'%%剈nѣgdddTTT```aaammm6 S("g>nTw2fpԩSMMMcZ^zFfffVVVvwgVzm[?k۫KUa.س-`p& hw~9''{SSSW;w Qujҡ5zt°io: @-"b(t/N@1BDFrʳzzzzjW@7}qEnYtP ݲ, 8@\:]VVrV(V^gfffeeqh%<tڵ"AO6-33355՝w>77vΝ;W333e^vd1bDGGGGG悂#GvQ]tuwq8}r;<8::ZDz^۷y7% hU<Чlڵ!!!g5(,,% e`ɿw9OYӗ}8h&qC߽^N,eee"~ӠnwKrVePZ]Pe/8|rVwj~5_ /qItNvn7n<($:G ׶U[n6|^mb(-ږen4a6ow;?)w!9w xh*bؓm{5pXsNO=nVDj36,0In.-/%8=^gٯWðhQ3_006Dwf ;VؾK}$ϸ'>ӾrQ׋/ c[?Y&[xŖn.5"}]]z>?sWN\fqUTkϸ'N$"emmO4͕J:j\[e.\4b3[l$FZ%q&WTę haS抶]&H<3|}Ǝ?(mǼ}+_wf>i/p`stm?VX"!΃џ,7:=cTƒŇrN .M7iV~Ͼ:yyIXAwEh?[I8/uT_i U[+_l~ߐQ8hH:lu@k(mKDj}4]:Wm||#赣 m .0ל/=#l_͜4H@KP[c!Wt7d1D~׆~y .9mػPi8|pO>;zk4Iore˻34gi3Iy3+tZLF'fIB&{8={q]O9G/{J.uCkD$7ᾲrW~x|EpmND=Vސ=QR7IVZ.y[ rS&"bu8׊:DTjQ ybOO48vO]a3%/:)"Zr8\.Q.dڈ~tuqU݈j~:TR2ޜ2M>pUŚeګmpT^]Z^ƃ]Ч;N/l}ۅ[[]-vU-SٹDE;J2~ꤨ^|u" 8ZZi--5۵˸U[ݮgG[ζ ԯIqQzL4XʷeJp$vCЍVj:@pQ Zu$VQ[c; T˥j}`ΚVwo9Gϒ.q@j*Nuu-]_E:)ZoBj>e(tD R-8nr(vm.(mwwVf?LD 漼 Jٷ]wc>M(NڱxWK$yQ}׳ό)<}8VpݱKc\6{_w uQvc}5CDj;\|$tSLL5xYa,@i>i -p8.»[%Tt0$kCU֣9vTr@}Zi hh7}s7l__fцZ3/v=ǎtyvGIΧ~s_Y:I{~@L9ώ ώmϳQ-}].uӨKnRmǶU|4ZA hX h&j| hJpP@k@"H@Z h4<tRx ڸus畑<|~v2<gel:d6yhM7"/[ٍ+ge`Rݽ}vˎm?ȴ^hB}m W8OόK?)H2-~{N_f8y S?qŻ67&dGO,3;,=֧iK +Owyz~E;~X~T /En NF~@c4J }]{i3f!rC9yݰAgi:ƲG0ewE<6T6ƍc%z{@܍~E]o{|~ڤ'LwEnGEDaO=/?_ӏN8n[V禅M`1jV'8 f@@P)\Þ|mԐ.٭3JUQ!1sj&Kqr3mOO,^5u)>\4 c֌<я_tFwWӟ[jy\qlė4<>::X0e,;.~5f?[:i^SWLw^!G86',xshgDMxlDPq(kM¢YSmN9 8,Y+-Zc;uM; թl-K^I kxgevj{>3'wk/' ǯxC݄bs#Dzw9}"G~DD_m7! >߲jUrU&N5[Kxn]myɘ/_;INȴi͠:Xb])#Fuy?AqWuem uM1ꘇv蠮=gGo.#쎄=gCEjUc>ϸIrYw߄>?U{SjED26|]E5u0WGҥ}mmU7ƿ"/x.H9w+S|zgxy[J+m/VϠA=:Xr6ܢr!_[j‚Tܺ'riºɾ w9uJc;PҨ473(YCuDtάu[.'(vRl~}4 IDAT4KƺђhQJSaBtL|ll芥g\hiYDl9gWf|c,:iLGƒE)yN1fl1_a-EvS([${jټdu1ʔ gv_pΊLS9qYD[S&/:kE--`1}o!b0fnyU|Nz6KWA]S`pL{\g|8kW3a8[3&@2^;DQ.xjv¡_cv|]ݥԈ\pҴS-~f?H}r짷rLvÁO7gXOnqC=nfH~q7|['umi.=tSD`ş=_JVjMDhje|TjzTi=~x̑oYMxj/֥nQ"a"$FЀBwXE{3kse;ӈ2{d3%U(yu۝y)СsR8lSWh|lG^!gG鰘%)*UUO9yH`,avCNf2Z$*4PEDS"I5 uS+kEQED^; wSJx8)mWž#+ l漼&T=iٜv(ZRe;=)1]l6%_i H*bh߮2;y ǎ}:e{/1K^{+ߧVq&{eYy[urVѯZm5"g.Eq]~S4?zu畆d@ !?`nMFlLpU5t\l*9pSФ/V|)le+^:c˪ETyooYۿ[ߡoyׂ1_SV!9&^ǹEV[vᾲ\DwKѩ]gcx{iaQcTuwc(/f49]\r_p;efSDKjxtixHHvb.b<~L|B"5.֡)g=xF/\CK% s(5"c mr _D!]تZ1Aធ_#"lG"Ry.;"~ ͯMshĈSL2e^'p}f'Yo]EW:Nޡ" :D<|Μ[;shpіF׍)+2d̹ИdJYA3 ))yWt-]ƴ5e+cbC"I;K|hRe=c蠊<󞈠{?нr<0kҥsG$+ d]s&1oݾǒWDD"|5~ |k U(fyy9g˻΢Ce؈:[{}c>cm=6;{7KiS'< Βp&a괃Oq vm}TL ՚'7s};~DDw~G_Oް "凓6zf}C#ÞwG7KaV_T)NyMĚ/_'N|k{Cb9q`O'i?GcSr~jHQ>G:n=u9w9oQZ'VQBTG?pQQZymNp'[Y39bټras q%@ı}iN˖_3'\(:]DD,) t?/EֿhU.XyE+b-E932N7;quވugռEKgYlCSvutsG͎s}Qݴ#3e{UR-8c*Fb1ZW  >m/ƂofyתbMQrl[_AC´UxЂ6ڛrvWU[UwzYX_[w('&IKD_t<\⼅5Fdi퇿OkNZ5RcMxY9?~^mx"{7!bQ/|1f?rV zo`aG=?qNcOo|V7Yfxzy;OMs`wTj#.7ni5o {q{T8pa`ڦݲ,`\}F~٦f}C˿y՞EMz،Y3}ϔ$zw҂-M*I~񻉘͘9̺d_eUox#hD G仇h>}Xƴl >(_[+{`a8냐70-) #Gn^-++k8$$oРA)))Dqs7iL^sr&}=.0B_^!"ߘ+"eeeg%7/Qk2$jBZH@׿Zj;V߬^1LDZF%LoohrYjnoذ h??W"55ȑ#Ө7K'允eeeZF(++! }԰>zm[?{r!ۙ,[}xhTȑ#M>Gfffnn.kBpY {QC"gSrսb Mc7&)%%@aܻiރsVYKOt+Tm2vٷo=zaaʕ+kjj4\?F=P8*gli hFۺukΝT^<5gGjZշol&#Ӡ@S46]SS8vK6LMM-++#pq[^,B;9&:x@4GԬ\2$$$::s~~~ L_~ӓux#J4hPXXXXX^_mpiյd@x\I粲2lIz+|P.{EiC{^jSZ%1} H@ *ōv/,rt˲=R7?{wUu I؅R,"Rܰb*₎XۯS?u .h2(qAQBE {I_ s{=w;'9,4鋙Ny3_^rã* hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! ؒmzp:BvMo"kUpt2@ 4@ 4@Goѳ:paút2z ֧nܸ10tnݺ}/o֠A1cƔsݻnm*/7ޘ2eJ-m۶{]zs'gȐ!'>n͛q$=ێ3ʷV^Bh޼Y.f͚6meKB999;!s˗Ν+S.]֤Iӟ>?LMM-..vQ:Jׯ_Q-[k.p'oܸI&- !$$ի'|;{!.8͛jժu]jVѠAZfff!))1P/>xBӪUM6lpڵzʕ+:OOO)YYk#BvvvQQQo]z饗^ziapl>֬YӺ:tXv9sN<ēNjBX駟^ZZjCi,|}U5cƌ'x'X~cJGS]9|gɒ%K,IJJ:眳wرfgꥴo>997ȑu떘XEOuh(MZzMnnnnn;CU:[5dȐ̹|kذŋ7oޜ_вe >a_ΝM{-k׮zqꩧ,^xƛz7ߔ{֭[?ܪ;wn߾}ժ¢E!e˖ugϞߞle˖Μ93н{p|Ɋ'nܸN޽={RS;bj({G`ڵkUp8ӊj2g-@B @,B @,ĢY͛7G5=XXXXXXXXXXXXXXXXXEmU@ͭ]vڵ5Shb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hb! hbQ[N8QjWt+WT B @,B @,B @,Ģ*uǫo>L% hbaQiii{-.. uV[lر[^YfԨQ 8V$''V{}S;7l5w]wu%{}} 5s_q][XH!V_k1bDhk֬iݺ^Z^^^^^^PP0cƌm۶Zlٻwݻw\.++]M7ݴwBqqN IDATᄏlٲW_o^:Zщ'x%T4?OzsF3f,_<%%_~-[ܷoߧ~ꫯ~-iii_ӹsm۾k7tST}ݻwڵy`Eo͋>~7O4SN]vMHHHLL,//!%y={,///))ϟ={ۣ>B(,,|{գGhʚ5k^]vUYȍ7:vسg]v-^x̙+MLLرcݺu^>,--siٲebbb~~3 ,Ydm |':u:3֭[\\s8pt={ٳgҥ?~h1c̜9ر]&M}jO>͙/>C3fɹ+[oe˖wy}§{#GsРAѻ)))og|9jպ/?O|Au qƥXb˗/r;׿Kb*~.())dڵ)S*ڥ_ās9M6ݵk׊+Ə_8~*_hk0|e˖͚5bJ޽O94p(|muֽ۶mK.dIIIׯ 0KOOKz뭥K^p?ժU+%%{ ! Zre *'!=z,X`!Ν;7hРnݺ!}{%%%[o[oeff4hܸq_}թSgfͪ[nϞ=⊉'ڵ+m׭[>={vRRE]Գgʙ~W^ԩ^s9'33/,,lԨݻ^'طo_Ϟ=?QFܻwׯYb }}ꩧ6mڔshwܤIo~I' 8gݴiS%}!cFBNNG}tuUAwu[n=~kΟ?qƃ4iҎ;B hҤI [gq5<MOII9 {.;z_r%F+Lrk׮~w^qo{M7U&&&&$$W 4h}嗟uYwuW1jԨSO=g]tibbbΝ.G{;vXŋ}ݎχ {ݻwBA{ѻ5\XjժƍWLٳgG}ԣGBNNΒ%K/^Bضm+rM7effV,!!oVTn7lذK.>h޼ys!j/Θ1#ڿfjݺu.]n&3gOGAs!999!!!ZlQ:##SN>h.[,++묳Κ? .ͽ袋Qqqq0 SLg 6s+۱c۷oO-P^^xᗿeԔ:ujaڴiB^{wQZZ:}gy&uםtI[lTgϞ_~yfV^=q跭mUW]u禤r-!6niiW_]yRl8 xpM,[,J+^":jB pLHLLFشiS+&o>ФI2B%%%7nl֬Y@xѓ1f͚UVVV*7oKJKKǏ4{/|޼yڵ۴iSAAA͛7.|?ӯu!U7֬YӤIE]}̙垧vZǎSSSMVB֭gUW]uhڴi~~~.|g͚5^[n{)-6lXnn|cǎ(}o߾BuW**))+ݩS)SԮ]N:=أ>ϟuY~ŋ+Α ۶m=f̘+<˗/[;(:֯__PP5355u[zuaa/h:,[SN?OBQԩS/V\9{f7n\vvmVRR2gΜ&MԪUoNNNOzwx)yqq̙3{cկ_̘1ӦM~}oԨQÆ +** !l߾۵kG} 7dǎƍ۷oرc*гgO?"}pꩧ5jܸq/>묳ƌs7nذ-ܹû{ݺu˿뮻j׮_N:-|ŋ/:D׮{*^j*zq 'T>f̘#BW.?JHQ^|2s:WD+qpho[o|ӦM/bԃyzkrru^z*?UiCްaCڵk+Qnݻwoݺ/wӭ[wy'--iӦ!׏?OݻwΝ'O\5~U_EX[J^Q_~yA*,X0{^z]r%O?t:Gn TسgO?+n|An݆ ׿P;,Y!Kf޼y5ڱc_|dɒ^z㳲#GM6mȑy4m۶w\nn޽{{セ}E}=vڐ!C~DyouFߟժUk׮]=z3gN.]~ ~[lٲeˇ~ءCٳg䔕={]n'ܿ9sDz/7n\Æ +l@7n;w}i2eE]ԥKhTO>$?^رcunNNΞ={&LƁ݃222G_~s}7qwTE%%%IIIM6]rU]v?mzNLKKr1"}{' :rHs@ z衊V$ /׷jժIkܸ~gff֤r:uV݂ .ݻw'xb4G>Zbň#֯_7—$&&V<:--bTTIIIjjj: kxxbϞ=K,93+dyy֭[[hZjUڜR6֭[ףGUVK,a߾}ӦM+jӦMΝ;{1cƌWtnٲu뎨sᗿ|0nܸ!iii>4iѣmۖSeBxꩧ?5i$~F©SNVgq뭷;rӴJw_^^֭[+{Κ5Λ3gNϞ=z֭[W J~B_̨sF233+FKLLݟsqqqa̘1=jOǬ?s !̝;C:tHLLlР^'MfggQYrrrJKK$y)))!ZjUTÚ5jԩS+W|VСCVVVbbbNNΦMyLիw9dddDEnݺuݻwJJ~%),,vjݺu7oXv .^x鉉rJnfϞ}{=zO~m֫W/({~~~T@w}ݻw wy7x~G h޼y۶m]XO>n;vlMFl۸qƍf/wNII7o^vbr߾}[7nlڴil͛7?kEuqeUoܸ_6hРaÆׯ߻wΝ;L7o޼ߘy۵k}`T7pÄ Ν;oܸ1!!b*=CJ*Fܾ}{9r`B(..3f̚5k* RyJdš/AhcڬYf͚}/g}疖.[,vmݶw;v;ѨR!.,j]v-Zۢ,Y|[E=۵kױc:uر7ߌVY+ҷo[ne׮] .}~g}vĈ,|ak8GBԋHmv@d]*v;+799k/O?=lذΝ;1bzƍ~#FT&lr7xc3/֭[w}?BÇoРA̶ik=餓l/G]. pFO_oР??|]y]tQrr]w}^жmkNUʕ+? ܹsѢEO>-[SO=u޽EEE/R[nW_}u׮]W~${!11K/=233n.O<ʕ+{5xMYfĉQ]5i[omذ;̙cٳ'--mذavZYYUW]ug\E{XyMg;ԵjBUmڴ90}z=^+}g͚U% th[o_~BB5\|޾G֭[۷}#G馛|Bjj3×-[Vs޽O9唚Gȕ R1p6mG5U~#GF9GE|Ī2>Hd|ayсAYj8Fo#W};vl֭f͚QF#!߱2D-U@vzz@ 48nʷjJB~?ؼysT!6mZO| % /sM6! 6⋻v:3{f 3ꫯnڴiuI&]t~7,x |ke?MC!{7YfZZ:u,_qvƏw;:yK'|ʁ3TJBغuc=RnHMMuPGyy{`eWXIoW祥5(,2eʔݻoٲBHHH6ݻ!Ծ}/>>o{ыk'|j?6[nm߾}aUY#˖-_'Ǘ]vُ~)%-P[UO>uСUEEE[ڴnԨћolhKu9+I~^?G/;Ŕ)S:!־}{;u꜒Ro֭ҥK[AVt`*wfrɧ}…:4]Bݏb%%%7kתhTK4@ 4@ 4}dk- QMh8)_-TķGz793]9Qؿ_?,g O2!='|$uJ2szԯzhx>01ϬtN=7TU-<<9Lp_3c+x?Og!cjy}0:gX=G뼮~SöޯTΚ̟uz>]+߿/_u?~] U.}NԼ̹z1WSIYYI! 1<˙e+r:J*ېpG^_ř|ENvz(ʛ s %)cFs-Tڻ 1oIeM7~pUCsw?oV OzԢj S9')у8^9P:vǏ]XR27xW>-}>~-ڮeF(٪_4̻k,3vkp|S=pݿu_~|3]NԂ6*. I-1PlZpsssCaɷa?<_}~tي eO_gРG_lsn2 IDATgtI; jt|SݿY_y?NïN:uݺuk W^BBΝ;3PS-μzH߮-23RK󧏽ʍv9R ?}9㇆z⤜yI3{\=|HNɥŅE+&zԻ2W ߣ]NGF=[BJï#;#~V[\|~,9muCn#/NOMKfa꿚uzgt=|_&Ui*3|’CkMuFH!g:O5ׁX[]W}={HAYu˹z ѫ=&n ʪV=ӝ+㶑P%yfC؏kZ{Ru/{?`{GCޮ#mTdG=%]W¢CuTsAߏ\oˏ{J6@Wnݺ=%K:zʕ׿QǼ˳gϱ0Qn oI-N?&N|.8$w_U0g_p~^ۧ>wg!BޤE!9|DyƎۙ"u?~fWxise!>3͊ɏ(tp{n/1Q3NzdbA4($̑^1i%Y} qWq-ϭ_0g{<8t䐏F=WAYonQaQ# 4PaA֛ѮwRWL|pz~8}С#1aIYuPO_C\~u_MoqaرwqM?H$ (PhEV[邶҅vZk}W]\*E\"A A KBBHnAD 7lO2=s̙N/LO, &{ nLL$H7ϓ)s=&ZfFY,(UC9 ,OJEgO,/gWlQSpy* Hr4sʯ2X[l*@,p!`0v8>0CԊNqwퟢ7#}h`tO(ٞ#h(2 ~^梥KYwE44}|okWv4؟n_θssrЌk']w 9o_O7znr5z|N\47AYAOpn{;hׇ7۴Mh~ޔwԟz ߴ3ZYؕlY[`Eee&p@p.\Z>-?_Y.y_2͝K,{N/1Loll OuNĖY!-D@fzB??0+N1"֓bqM演HL)J'k?fbq$KJ @z>/Rk՚+4p\1P"W rc k7l/J))DUnDįOLd4WِAֲe|CBg@i6A.,efX\"(Ĉ' @"O_ wSv42i0#ŊD>\!I65(Ev3$rC@r2D1O %Rx!l/7J7EBܶ^>CiY-%OF s$T+Ԑm)rz(-H l@rgE'~cٟ({"PuDz%n?ۇ[!FX$UR6H"1ٟӶK?bZ?2D3~ ݝwފZU: ̓γ׹^n:?=rIu]kp1/83qYΪ uI^SޔDVqvgKq+6-4~[7bA?en/ شfz0/WFIsFЈ͑#}Aǜュzq^uuO@b֬YV :00088xyyyАS]b۷mNWK ""bʗ-[n6V s]iiǍgX CaaX|ܑavyT1xGY\zX,H*&NJR/GHXp!uikg͚HQTkkkYYفl6{Jae&}^Aϩ^K^M3 $J 2FQHH;rH$DA/)#7ls9 n̯)ؘqy |SE˹\mNp\؁Vs;tw.ڑGPᥭ^X_lZ/A5) 3D1 b8 qyWSNзˀӅ=IUk3 ׯ%yꥅTr)ٸk[lfTqtk1P5"`xfkoIsٟ* 33E10kԐn%3~Un:I?u5:ܨo*Um޼}hoۥs\@l8g|~L75,Tlt9:|*`8/Hs=ގ4CwS˽I>[+;T*H 2z 5Bi~/~(wާ`>hbΜ{L&{Ϝ9d2V }oo3g{WQq&111=uܹ?ߤRT*C2N2{p͛gy:<};Ru^0{u (׸4 9I1xX,{.rnu'=WoX]rie P*ݨW %`ML}7nz?1S L>㱧}Fd\bFC fd-Ot)K3Ѿn[A~nOBu 1V}o~U۱/Fѕnko]}v|ݸF&Ȥ)sFRr홿T*T^7EmڢhIޤvx U;Mc]xެ[wĠȑ#MMMSN~ "gϞ]zs='J~n+^^rGu]\YYي/[H$뮩f=嗏9 /J$?%%WU(|;f%c""RR4cƔ P^ \˗YIࢴ%t)Y  QF"]P4+ŐfUŘg]J1S,C\ڛvt)Oێ ~jѻ=^M\JJJJJJJsIclOAM@H'O8=ۓY2S(]_%  R7Ȥ٥4J& 5=SSGgnOO\vs|x>ǣ3K?qpsL&h.<4_wپkN9юn/w[:ׇftݯchzgٟnRK߼~\ Q}{w=Ia_yv/~<徟YMhAW9D (v5 Pq7zcQ뺾?i֍7e}rks N,Goݹs磏>fŵVϯEV;r]wtߟz*uqJecѣGcccwݑy=inV޽~嗴كd tǏشcP(:r]a0APy`SWWW\\2v=N/ijRH˗//,,m]eeePZZx==}9R~O|GbbƍD"zG07qӫ+HL8YPh |+ujf.?qy M(i5̌iYS,A-/=V 5j >x|*+=k};'}1fd.Eɶ.Imkv\^rbOyM;NO'8,5]Jٲtv9%}w#Ef\a܎QR~y~`Sxc)\TdPHھG>4r㢿 y9/It~?>4vpOdˆM%2W梴Ҝ 9tZ>m_75׀~_N{g8.ۗFg`:]r>u[O'\:rfs25/'$HsXfE鱜7s:@3w1_j}[=z/Swެvn~TZ#eJb cVg_doXtR ہ"t]ʏunn8'رcZ:]:g 6w5UUUK***yg=|'7o>{_d'N4hІ %@V8`6\d^Gp    \g4 g4l X,N    _4 gp1    uw@#      @#      @#      @#      @#      @#      @#      @#     ׅu: fJP(     -߹?տ[oرСk"mڴiׯaXfooo?d)n0ejummmh AAAAzJy~n/h8nܸgy˫E,뮫 6}'<^pׂ_|5W;>>fe=o YYOũTr6' ܴ)[Tȼ`fA,? @#   @GGGGw=u{>% h4$6 /"AK<*6ljdn޼ȑ#&u٤L j$df.a2+V<~|Ҳe/>R zx,[СC}ᇟy7X#}NK=n8b0 Ls/^{Տ?Uwq]&NJR/GHXp!EQKxcN IDAT?[:tYx`Fo߾ӧ`Qrrg}fZ`Μ9*UC .nxzzLܹs;v4>lppEQ---… cƈ)6dȐ~wSՎn|ްk.6 {cnoo?qdA~y)ڹWGq/?p'%%Ab1LovW#   ŸЎ賯o9Zmg^R:N:eÛ7o1x͵ٳ|A}1~w?m߾ݩbGz|> ۜƌk ů2eJJJn;$=njٶlӍuuu88o^^^w~ر@nVVVS600円zyy^?mڴ>X|Gӎ`ukڴi|͚ן{?/9r^H*y `޽/bU߿W\YTtxŊnRH BCC'^P OJJ䓍ovhhHV֓_}IŪU/B_=hX7EDD+[X֭[w߽+׃%]4bDEQz}SeF]QqIhH2do, MBBBl2|^jf߾?ϟ:w3&=?cD?zAAAʭw5>wE=ӹ\nx`o_v?A ̟4i#x8^#00jڵoLVDZ>>>Dx<uicǎ9>8>:T8wӧO;Nr O7:Jٳ缽}}}Jž;w@kkkHHpĠlVVrft:79sfΜV}ŋC4Vmmեrju=t:I&IIu'N=jĈIZI;{}K~>}'z B?6#ft<ËCKKUexF3Ty {cYlӢDAAA @WVV~`BsJ&k]Ǎw]w_oO2eR5# vju;M7 4 Jes#BB)NڭJAde={'NQj)j1>7˖dN|}} p`0,k۶VwOC9ICCmX,R8+۶mzqD^qRLj/-J x~ʉxzK^!|dxqAAA9r@ |>s|L `2,KΣ~~~ IZy cbb"""23?~\9r$ `…|>;'3F#q\f{;9v8m4//o/oE~~~2Ym]]]VVVDDx```LLڂ98{lJJJLLL@@oGMM OODFԩS= Ǜ3g_aaӜ'OX .^hٳg G?wֿ-[5 Χbx7e0Ϟ=u_ 444|3gh4;vfKUUUgΜ77eXveeeG ݔ1b5J*=~e… >`COP}N6ĉlxo7[{m(1!ft"# a55,hb!X5SPr(scc _5Yo3_y<=rD[nc1<ͶĄDn]#CK '&mF-jq"   ȍO>˙L&4* aĄ2)ik2?8c++#b4JqRhUv+dv*h8—r؀hS@Ly9`gJS.d̸ F!l{aN&R Ӧd{m&Ft^WfTa"K )n${"sB"02Wq[Ε(K##nyFAAA @#7VF@ >^jaFB=cW@ga+ @j% ieN&J [`Q =zQy _@=~[H]hf zL2 /   rhA2Ϩ@)՟Y5@?{g7rqkgDDw*ǀz[+2;<Z/sQ.lJFDC^[HX`sĽg o `og1|y= H ~f۹olJVص+b=〢 ]$0Jۥ`    3,,le2mAXk$GBD.bHO]N79yL>C(Ԃo7oةok|gzD<Dh2[n: vߩI[:-m&%y4¯v23#I`z1|pZ}vnb3Bx@ ].rL49XF 1%uK nI_͋1d*F#!d_Mz>|4sX"htr鄏/mw 6Fl" &cP4hkτFAAAcرP-6 #8H}7U\ze:(sh_jXl3Ę'Bhlu?YOIM !F=2X,Yaor (3"^e͜6A}Ky)=!fxjXK>i{yD 栰u;-{;vFĸ'aB qq<XvCXP{{ޒw%Әc% nؕ-Gv3F1$25->D3gMXe`RƽSٻnB|#i!փAAAo`Ads{=f̶ê/YXGoTΛB4s-9AAAkAJ8UbUQr!ɌvW.   4 "BM;IF4&O`]nR[AAA x @纝 fp(AQKihAAA|uh[q)?$&&644|/2pĆPgۮY~ϠX\U# 1!3lP3WkV5`܌EnnAAA=f{3O̜9/ ?/cy P%e~ϐy7y̞uQ~y^6>Q)f ۏXj ]2Džsٲ僌\U~ҌQ$lsdtAAA?>q̘++l- 2x|}}l6[aႂ9'&>mvӎΝ@llc=fy (-=?mpDJaŅ\^#Bō*U&4sW`d0=eW+ӏMLOGbmp@v7dܬP楯ڊA'~hO7z`}}NPSyDW^2~RߋUXU^^C.r:ǓbIeMMD9?RB%\ާtAAAC 5kg}R//ϧ~⧟qSmmmݼy\.zbbolhhظq?zhlG7VV57]UՄ^'/~(RȪ+Fq2edpppy3eZ:X0$Ze%m;tJLӋ .62=qqD~_kcT؜ `3|>k,*ٸjYȥ_RLtAAA 8Ll6:tj=y4mi#**ΊD#+ %;Whccc椥JLק<^mv/Z+~G3n?$ϟ޼{抣WgϞ4Wח[{i{@Jʄo/?Ν;n:O4>|nht#bDõͺDظY",pwxc3_D\\TߋRF 2rd fli,+z 92K،vs->a\LjyyqYc[165Ǘ**ʪT&9}Ϲ &O6?{ 3l(r'Ihשu+iLz`S`.uUU„hU <Zhvj5u:N[$x@wBr4^&=20#?Ǭ=sRJpY`PHm#l`>w^)H̚FZ%;HNR]6WrXfuMyR#L_)rZ?ɫs;䩌p.lPk[|sXԵ_qpY>>   <P[{kNBOk풮E"u"""? 28+_A+jjdϿju#F?pDrFj<88d2ֻ< =}~vW]!MO_8G::zXyVWW/^bccjkkk=F:u|# hQ4hq DPh0h5[zRO1I#N3l8VVUZ5HOOJ._D4 IDAToϰɣ'7:aTXjzx;>8sD({&Tgʎ)&һikK+6ߨR׺xiaQ\ueiQFJPfSO]ԛ\j#)hC@Yҭ%f~jzҕs2$r9/7infE5K%bq +#)dBR l-v"AvSKgeHoY^ή7)=3s٢%@   -^-Q]~3VV%ב uh4ŋrZܬjnVG(R_GgvXXh4LfF \[[[5F+Vu/'OROOOMU =}tLLbaXL&sΜ9BoY&E}˨P>Qh"HDhIͤVtmtHhfA H  r.pR .T#_"̕K%DHdbqM演HL)J'k:eRZ.*)iׇXfMDPB$/D&p   ȭ i+qq={qI{Ou? WhdH綶6//O7ވbb2ttDž&kk/7dVUUQ|p֭:nhhp<Ě8qM5[[C}XAѨ Tg#ƋLXW+L#׏4*OY |>Vw$ p}|ؠv?0}/"zt/?\iU:@%>n@wQ\6 VJ2AGrҬPCן6Ҽ&NK򽎷lO&\W:!Y[k/W%9G@x D o7?Zr粩\ԔQRAB*=Ap%:\ssPm9'O;}I5)з*:#`Gn6 [~\mNtx yaaM)(%S ٚyɫڸiFqa~^^DDC\aN B:}AAAny0Ml޴髅 ΙsjݵP[{ee=FD[[ۦM_ۻN,~67byѢϜ9g_l_rhw;Wy)ǹ}!((gC vkkDCIUycGҢ>S_Nj2X8||TlcqkZrKŁ.[)#.!z>n fu#;>q0u\\l}h帏I^VuB) `~lOST"AG]0dՊjtdzW{ƍ_ aZ Xn*ܶUt2mP8:BYXP""!Uđn) FI+YS18{/.wCAAA[ @(Nj=kk/Zbv}C" X,\#ڵ[.(ahhn?gCugϜ4i~JgϞoϟbȑ#]ѴkUL>4˻n镵e홠S㢪%jZOE~gtWlzs: .z z{5^ڴzWu ym Zk0Q&&tBDoAh/S5YC\$/E 7uۇmV H t[MmJxxYƾwl6,`•`%37L$@Qpy3EQ8ܙj0#gȕJiƢ3@o*uF8kqg7>/ 8yJZ 8NE   24 6?…sfZ Cx{{ @?l)Vn#f+,<rtu-XXcLK lkXZ#98*6jSpY:t\70PPVWLA0\ >¸dszu+sxT\D{Mիb6LnLWK(8dEEۛ&˷UǓdLzEh<2dx/gkpxLgPչFsr)ɗuj Qg,J#_ 5v,uҵ"t{̥r¼E22Xv$/Ɉ˕F%9`0 Y]C) VZGHy~r   24 ?y*+ϯ[o+ط…:oZZ+V\>t>>>o}Q144&L0a„b2NהUVuzXy$J*/8 y1J zLaca"JmE#GƊ&DE^ZTVo0՟,*NH+$VʨU)Sc!QQ ^L+e^(mnjm(?aB(JrA}F\%9AkE吣:.%D@ڌz q)92zg8Ł?3.rEᢀr1HT4!ؤxV6GSVhӘST_lRs`D TT"\f,,5|?Cfg;}w"iJgq0vd "w̜U4oܱ17Ƃ+3W` %yŎ[mZ92/TrIhs1pV,f&ziP,^Qǚs=uy_^1qB!w` -_,?V_zw]]]:tx(̜lYNd}h+?9r98Rãm'sޞϿ7K_4G^8R]=!B!{ZV.rH 2kc'hݺۻPLmU.ʝz`dWyF!B!Bw1^c(ۚJ*jq;u"k[#B!]@;nB!B)CB$u‚_fP3UBj$px/@{@j 9?xDWBj +4V2/++q@!P?wM86!4S3ӣvn;f. Z1~]2'+NyQWeN(|&4 ?TQ0 5ҞZiw_V~B󟤗:)kv0N/'$!QMVf`G3pgM$d9i%iΧC?e*T.A sFb g~Iq(2 G/V8;75S(O6Y9VWQd϶?<@\mL{APJ#4nR!uK:5J+xZw_G?oqCW61_@l?ՍB!B4B$bPwnQ|8$ۥϚo]F{|"T6X ~zЇ,`tO7 ",|xPz~ҹfkXTK3i1 bf rh` VӦק]-VuC kLRx-;Dxg蔏B!L@#-(66nVh,;6cY X;?93`}%q=3~T%D1TvŖJZ|AJ,U%;n팥ٙaZZ(9PW[ t_C B)HU=ڻN%{L`3gŷOKVS!D45J"j˄OH,KρK M_:#7ߒS4 Zo? F/ T%I'HT[!zZzxP,Ȏ/3Od A@ .Lor3QA-q\2{Eȵq#.~G8dSr5Կ%K{z761U Tx8vB 0</NN(%Ӓڬ]aŠ+ٞ K ժ5J%pXm:Ҭh5Kwl|@gsR:!{X7}SVIg. 7\{f,^ur6oIWIkR[#cmDxK%ו|\|B!MBng2?1#cغo)rV-u|jDpuJ]:K֬Z,ś׬Zjժ uksbbs֮p!֦I7nXvmT7VݱG Գ1/|jҨצ HԶB@ dL@>"_^F`?xO꽑£TXE3j!$SɁFAH 4t^rq Yx> WU2@#=K%֍O^8Ȍ|2qm HEL $.F\h 5pM9 v^;nlLƋ3XreO|c& +XSgtꄟHf6BN򯋠v:ck/P6=~ 72)'r> ȿ4J:.UKP0729`ZN!qp#x|$KƗbӷ#S!Դ އh:'|msv9꼵S/py+|W@{&*g8:pÕkvyZ+ D3\Շ6Y@qejJF"]r┌X+-xmǶbEVFEi,:ddg)P~ݖ~J筈cK?o恷ڜ8X ĥ1d)N0>LB!0= $I8 4HQΙ3̙3QϞ=ߎljF+BPG3 `>euɎ ߼$wæ~l25@FiAav3OE0VWE&rexYksv2YKSCxtBʺҁe\l&/z|d ?;/@jj]<:bU;C@."Lq|(|tQ1*(Ȗ W׆ @0/H굇R{Q4CA#)48‰o?'!.]{ܸ;O@sb_"܇_AGe~KFVІi z-k+ :׻b--sqѱQ4Dp(pG;Z +scc &#P'O.!BٳgN_tF9};oϖ, %>}ܹsjjj##;v޽{ cРH|gveXnAuA<ǘ IDATES1\O$`.; {9)%W{@ Pc_ e:XdX$t麕z+H.t~ҹil} 7g>S/VR; eDgndQHE&rj.'5J!p "֏|n#ۯ\߅ a];o*{BE.\Jpv X+d80uzǩ@$ !F;^L:l(rqsUy*,995ê`+vlXu|ÈsAP]|ttTTTn/u@ < OQOO+//rh2_Wg´jz#dt}an^-w|-!#.@ =R[_Mu-A/L{j)*ڀ%{)!LGO GO Zr^^yRuwǡQ&1qdLLD/Hsj_48-_2qK8wuqH2JM~_Ђ.gp#\rxIg~ğu5>2yHwax@tX㢷HH=eI'C2Z`j۝ϪnZ`lh`B]!D"Yl86ܸJAk8 m1qڟM/5,1ZR)o3rJߴ[PWZTlF ==oaBіA<0nM|oX_y$',0/Ioƪ9PmæB3O1B!t4@GG׎;L& [[[$I͕+FG?Z 踸Xǫĉ 0 3{lFMtYҀFcX?ӧOH$L&ӑ#GX3fT*~C^^^s(b:u!**29y8穧*.>Y[;) .ܰA8vXWW O8188gC~EWLV`BjE:'5(XrE`ygId4)2gXK6]$w|+11:NO44V<4gNp*;PzJ^/q;\eTG{Eu!4 9踜Mt VXZyoT|Ɏa+-2XWVlɔo+.(NL[qseǺtq\Zp[ fEeeۜn2Y8P2ʊܕ-xAq9,hLW;`^H[__Ȕn XL|ԉAyyV@!=c皚!o(IA`]vo/,:;vؿ cbb}ܸ={ؾ*wwyoʕ+sul$}?|ǎ4M''Oayᚚ>S7>fo~~Ν.]h/3jowwwa}Q*7AQ\\җ}&xl6}[פg\aUc܍yβcֽU`XfݺU+D_xY^rͪyZLJZֆ͕L5k3׾U8Op2rI~|=I30>#>%e⋟K |Czm;{sREU<]/]ΧωA*`BN ]|-n7/N8p^ :/OuY/\-@5ˉεJFځw.y2`ߥȖ#3{Iݗ¹V`|zS(9GWχvY!tQ:xR'I+\dyd(مi-4҇`q ~d ,fq^L!!3BGd`%p#F.WN45(5o1TMܵGX``b^nuU,P?ÚVgJrTx&(,-&"EɶܲfCAAA u۷03`tߛ-Ez 047/[_`J*_&>N`--,6q!нHNNq+ d <=w}wٲwvvo)S&w}Q’%ڵؘ]vEGG9'xJloo?qļyZ[[O:5iİ{:ń c0\`ԩcǎulq%Tٳt7lqe'tq~L/춿y q s[߸zo縛_SgGoۍp_Pc> }7oqܡ+ZB{n!em]]]ϟ0aBBhuuu;.jz%?% <<[[䤈ƌqɸݕjV~r鐐K\H8R**55EĚwwj3gn[[[S"gHGX/?n?[*aHE 44~Ykfa [};fB!t/,I>p`0;~Q%IYLϲlssݻ ϷZv r"OO/^S###>j:__ߚqlqҪRy75po)p"ھX<.a|n/jY%=A%8;P_F~~ 5Uؼ)ﻇB{&z雏p@BnwwwyHkkkjjj$Irsskii!4mZDQT(zV^aafss```pp +/?6hl ttt*ǭZ||VW MM==΁[tVx쬀q^Ƌ rq\/*jV B!&Bɓ'&Mh27,oɓ% =Z__ՎR*i@WW׾}RSStv, >>>c 4)w,ڊRRtCۘi`ohhKzh$: `ҤIՅ0~\t]8ŒۉB!B"7܄ATJ4qĈ]vI {7N8kjjrr&ꨔ(Еn}6,TlXMwKH룊Vfq]6uVly2[Qw|C!BpSc=mԩ? :xgZ-7iQv[;v%;Oukzk/}nV36wX{F={OB!н@+?Ǐ?>B둃2go(SCekVQcB!B hq)jQvl_+˜yDeX %L[7߂1jk%CrX4oqvVJTFɱ5[`o?\ ;@EnBM_rpo-~?X{2~jAbQr}-NIks>6mZ @k3r/H g+pK1#?ߜy+pcڼ_2'36MFQm&0pRNun #WktmeY%7팥ٙaZZ(9PW[+]tlaj՗VaQ$MF,!B!F5~;Y== B9}OVM/zT k`V5WDoy[x ' 9[%vOpiKȬ'0Pp2`?h?_>]}XSh[tJYͯlh_AAAl/8|ФǗ2N&=\(xQg.g{<'J?>9 &jaFkP62G!Bч+Bw.Z[!mVV"WqL:MWRΤM͌ cE L_Y l:0sF]]ݵXuV ;kg5ʬQcSPY'ʁk3V,oYzD`;RgnLIVW7BKK9 c%<Љ鱴>|f΋foYSVA6nJ͛u:3,>2個tu 2q덄бxk̨g02c)+şq}#B!Ш4BxkC.L/(uCô`,M**JQv[Z;#'gQbF c ,J˘*}mqsi&KaU1`ڬU+Ag:4J ۴ku7}nHhaz"]R鱌~gim?;}qжkVn,-*/4N3p94Z;]ǁy+3 }ͣGnB!AF{7l4 w߮Ng *[im)(nI%̮ܰFJkZo+kG=#~sQ~ѢD2݇ɗVw SX6sa閵)'F<>.bB!BhĐ7,U):qq<_ *v*+ޤAggD 9^T2<<0p=N P\8V}ú M5Yt_{Xc?=#09qPZPdJ?,1;NAf3o}} Eha W9q(rqsZps_/Kd5oyQxD!B\B [I~̕ט|feCin FI3huZ &G; ]8Pﯬ;TXGl5ML (e zұ7ME3\mS+xcs֬4Tb5(XrE`yn3R.^brfg j*7a ~) i|.vg\l|<u,|caWf+%B!Bha!Ŏ 勖Y}浛 Ξ[҅9kcZ :Z[ݶ9(9b,V|51W= mΜk,B-ۑ2s PW\Wiʕ+7ZmZ92/TrIhs1X{F*EL oqƵ dkҗ,\hP,^QǚsGW9q(rqwtԄIB!#fw5!4is=sن  Bi&Fxwbw1*Rvjrn-!B!>=G AwT9W$k9sL4i?~ppVkF0 BƹB!Bn10Ruk޳>wpÆ{=yx,裏+**'ߙ={VBBo~Bcccb~_8oogy&44T3g_A_Fn?WXX#$I>3vX,QFPB!B!Jqfyܸqmmmjn?eCdd%r1..nժzjooe~_{(Pffff\\܆ t l;~(5k~9o߾Bf͚UWW (BkAP6juttOeK.)trTJeϞ=|*iW\)B!B&eFG'(+W<ԏKKK\i { T*< RRRz7tuuRLJJZ7(rWGO:μ9ڏ~>:::..jkkO8)0gh4M--- HMMh4c-0}$Id29rem8cFJX7T5g///"-˩S"~ǎsz⓵755ٳ%#'OaYĉKxĉw_!B!BH&e q===ˤ˗ (ھju(\099Kf3˲#* ^|w@DOOBĆ+3Bw]v[,1F3=|AZYY>n\'|j}޼y~U||ܹs?3Q/\xl9EQ9raGyF5k Ugk׮K3fFc0`0;3l}||ZZ33.++kll43p B!B hY!9992227'O|2X,>>>}y{{[־?k܀ ~EG`~<ݭAplwvv5mm`ʔ6i̙3'k4םNWaaaeee=`O,+;s :~ocF򎈈l坝lGGǸqfYAtsSJ\pj;r B!BಌFcPVP1#䂎 IDATe$&&)STΝs^tvvf͚5eyԩS=I$I>sŘ{YWW=jҥK.]XÝ S-Z3ӓiozV  K. ]G 4N<6iDɼo߾jQJH5n@ B!B讄+BN+B!B!=EbB!B!BL@#B!B!F!B!B!4*0B!B!BhT`!B!B!Ш4B!B!BQ hB#T\]&9B!B!&BԿӳ~0%&'L"n}ΡOF&jEVm#o(f1nD@4? 1B!Bu B%$IaY(T*QJbۭVKWm29 ^D%{n?4r&n\'|ڗx;wnGGa6n'%%͚5_NļywܩPiii7PTt1 #cvccSKKKbbbddCSLY?~! ƌtQ.\`679ƍ;zhpssy␐0`0?3<܄kB!B вX| &L0c ƌq80A<ԏ  <<)aA<%t(f6uq@Z9}|&`.Wͧ#B!BC hY$}ᶟ|YKK`(//pa&Bw=](k g;;;DQ??77_}^R=I40, q0f{yy XV[[;qCEQh|챬/vww$Ha766y{{NR*$I\xNLt\N@eBk#:E̋ zP'CxRach|Hq R> &Q 3{EC/Bnwl^l:e%Z@N4 &֖QOSU5r5id/;,ɖJb“${\H*~oԡ$#&!D4"B!L@466>7/,,,,,`qqIeg/[GG z{KKPjXKKK9ljj"(os֦YfS||:MM==ܝ7K/mK"ԄJeBa&ɞwgg㚺W.H#J*ځJjVY+F:+U ? ml+kZՠMt%A8%!zN.?%'$^>~^yvs 1PԃW;<Þ/XFpͱBO۞L'Q X,-37D`=CZXCDzpMQΐ]r=?d\zp߷4~ǟ}!3gȽ;2:@2/p>pxbǸ~@O|` ;qPS# (P@ (PT 3siiO> Ԕ裏 2Q=_ ̳wۥWY4Z!/Kq5vj쯈"C8?y)P@ (P@B[d ~tn˗UI'qccIJ/Em|=bbb7pz}^C$Άn[ e4C63$KK7O#C|M (P@ ( h (ܖX|U٬.]>Œn޼d2}`4#PWEN4|3LA*{Gʈc3 (P@ (P0_v@S@­M­N_4z.r[(P@ (P@:e (P0W`%X:YG( hhQǫJB 3q/>5[yk3IQI;RwI 6Py_|T (B"|d.۳c\ddmlG~p}|,ɰ£¯(΍=ly]7.{IG;7ܛo'ڢM@.87D|o$/_"+g )iR\ ;)sk=nMLlWd7.755sķd:6= ö&&(P?w*OD^;{}n :^|@* p)NE" (Pp+ X,cvtXM'9OV8A,:@GbCٮ+UmHr cc/"nK]2~}0j ϏSHk49[c-WC` >2TvPN04G~I$xp/,(W,S#[%Qga'p8=q66E_Lr4 yqmޑr ! o{p,[;?>ks 3a/ ``N }aGr_gwEM}+b 8w9O@4ę9ot#[=#<ā@/ͯn82˷?! (N:|mӑ_FyQ$Loд R։!=x?kwO4;0f /9j:?~r{ |sI^p UX_ETf~d:|+Hwۤd^}مy$DzGm{}d3gT&Ay{E@jyEg wQy M  G캎KAMg:fSgVTzi v*;VL߮# ^;_$޵:+I0@'6T,a t~0lt*1VqEie+WJ]棪Lql?"TDyAߩD2)khH%BAq@u!+S9i y6VD/pOC{krJdg)NM!x9E^dW81ugZw0Rg.x"陃&-Z 7c-8I{2$̹G惮0`ЏTܜ_ˆiпqv<00Ph (P]7Q FLYF\:xvm;oX/n _19! `V*.{m><zǧdtB]R aa5`Gws?eeOɗū LeL~ad0&oq;&Mu4V6]4'I^vS\蕝&o;\.d2\&LwVR6:6bsߌggL}}'@3~o03Q@e(´og`(* >[Q,ᢼPe HRth*B$s  ´dFuKMUu+F] ٿ_SP9%|& I|▞ƲoH{9`*)KOZzAA=-A۶2 4y7iSK o2}[ΠBEBB+jۍ~-(ؑ!Mpp`(܏ٕ@[%U*g(K`Q8$ʧ}&)eEΞf+$!En;\]դ%9Z-o l$(+ނRx3bw IDAT:} ]l_ }[ϓW#Pac9% ܩi3Bq坋B_ai]C4tpA߄ cP1>/$hkCd;O :<L_@W ,3]-JhG_iP}ϖtuO9c'b1Ti(8C7}wx*ɱbяg:m*h;T-7}r- |;B|qg (gv1MI4Fgb+RwRJē n.d6P(΄3TOv7WKO .8cF'cL q)A#Y-͞/sN ]Ay_6$m0'|opZ Hֻ?`$qCڅ'w_DKL t3 K#,1"'Q4,?Mdq,N/I%9F8뛯NI_,I䨫4?%3/(WSXEFw~H)P@X]Q;&1F@չ)_An0hiztbkg'/LʍMq]B~ 0h "ސq t`ƎyqD;M`0G,|06{B2c:{"8n:-`r>0ra6'40);o_2M\ ٚ{洙@.ЙLotz_%ݝ$"^Z!/n%]p_9%݆KK$ƙxN~H16+ek-ul[^B0 &JBzw cE702U*ii1Fh'ɥI8PiRVN AEqFVݎi,[8jU;&g$ 8 L˒ZRIeɲZ_@lW+U~@=E?}\/?*/%THEҷ%ZZo'1,Y<+䚼,iHeIR&-'B/շb+lKkaZjV0Jq~q,Z;nZ.O*%"hU'h:[0U JiU6bzEk%3st} ̷_uꑋ&/7>JM#ݙsE;{Һ|AѮf m O}#x"EL*vO(u }VIܥDkSκfKl w9?=>ZP>pGFzh /PNM./ 32fGpQfFͫJo9^/f25{F?_{;-S&(C^\h)wfn??Mv~U|tH %w$qYOũ,>3gy8_;<Lj)@Q,-KJJlTxT (;"QICP.b6v3vt˶e.m'6=rGzl) t. N{X7A4K KSJG𹌰B9 tFp 4˥#Jsas +$ݏ}3 tqd )xY bs1b.9A&=42N"qTߝR^-50~=HihM,qmiѮ?~rg-| )y*ud~5׸ Aj8` @΀xwy5n<ÙEF_Tx'Tz.?V=>w꫿]믾} ltzhhb'([AАߗNhQe[_ĥAdP-B: Zb-[>>Qh=kSC?kplaMvQ O\w vh}Hvu؛汒Hjp6 1#_mSq^.F2{avW,`tj\.l6M+9>6)i@4,ng;ph25u1b pNu(ů5O ,z/)+-ҲKҳU%3B@{ -͚lQB[;r&NBp%4Voazd4 6hGӵc[mZWL'Wgf+fzW䏏u u { w2=:*o}4x9'2Idna{:ޥ}6eN*LJp]5v؁~vWL^[@S wQZ/82tsз_G{*Cy-$ t0.wv-a4|՜ןN0b|,ϙ#59`6ovn` S0 4fLj@rC\65Pk~|`f(GhfթkLOyive {ʒriVP"a{%`LRUU[.'&_"``$- N[+&o8TRf=jE M#Kh5R//@KoIOsz-ôY?=F&O^h nnWk*ƈQ.8( R,^sm A>Q3@2@pBCgg*6H7/;'7:T hQR2\z:%aĉ:fD :δ1h=볝ѳn''T4.g}T&['bah#,w²]df : 6w4Jw _ C] yU$Q΄d~5Ǡ@'޶c61Wtb I)NM?$18. 2d=g'AoTxW>ʚddlp8'kkkn7<=d"vwT*}^w222 ow<^D~~@ M[omX,֫㕔\^=~p׮]r_t:ַ{衇t`U`<x<EzN?jYf;7lC[._LHX鈟t:7 0h͛LIYаcO|g1%L.1(` b=A I92PT4`bv-շ( A]ߪ%竕Yiy=,a %od,L*o*9$#cj2}A^XPϩo(gA[K<$wfJF %37e/I?5مEXM3 eR,#' oŬOCA>7qd9i K8c*R: 3 2q}LGsӌ pcj/D%^z,:Ckey \7 vn(ߊX彷\)gJl}5x_ SL(O'%2FE2.\ ]$ԝ uq֎ID'5o#[Km;=s9Y %z:r3=Y'̤r_z ׵#~J03Oiسт{3W:1w0;xp h ' \ 8pw 엙Ua,QA%O?GppI<27< $֧ϮN |~c"]yBьx`q$Sdrٹ/X/p+ mt{`H60\Հ)N*|pA~6DzC\vРҗrTn⶚ ."֬O@.p  ;{ųkߐcJ]AFMƭYǦGOp`]tC,1;5TR&J7C'uNLAa! 1b;{J9z4ԥ! y`3د6Y@=6sm~p@8쬥[,pVZ,f;(mMB=N=6;Zy~fЬf3ժ2AQH6cR ?;8 yeIe[{ '/;-_Xec+XTs3󊷠[*H-^fd1/g[F>[ Ym/-J Z_jŘnilP?!w AH9)(nk*K|Q[_vWQX!fzTUs#+1[,>ޛ?m),~ 7ȫۚJFaz^!zT*&5VYzm3-<,~ $c5VFx<پu9A-_rJSGE7ܢf/xɑKk$ԧBv2 ]QWx_=k-a8c;kO'/p4򰟩H _؉?Sa9h}[a:8s ʫ,vJIK//.%8>֯8mhнIJ1B:Ku[-w&!WW'_zӻ{{e;0˷?0Bz*OV@86Tt-^2Y|'o| "Y9>;?kYIPy`0[&M{/V8ӟf_|Av[_^~ǥR;с_R.,|nIGZVذawݟk|9Xmccv IDAT'=BTw"V~._To*2 7TO].6\DW욼m`sJKd*(Pc@k_<)3`0x322`FxENÇG?aLLӧ?/ݞ˗/O{p83Q0 ht?#""ǿoxW^J5]x qX̟~zd6l8r(=1 --xxX9|:m6T__d"7n}ѢE--:nѢEiiuR4!!رfɴf͚ } RSen… K,cbb>%CCC9dj7Fy<,uPfOLAz7u:#E Yv e+Eʭ:4c3cχί("T*7RQ]m2QG-`ugX,?k؛QוWSg (1[TC\SC?lV- CJޓɮvQ23_f۰awOܱosȼo*2477}pn#x#*****nj޲ Rݼ`O><880X,sыW\- [wX,NMXXʕ+.\/RT|>baq|ѢE*4A8N Li`>C}Ex… F0 #B@؇re'agwl\]M%WsTD(e[f> Gx믿݊=>S@'ܪ>wy ز%}',,L*]? mmu:ݚ5k¿k?fEE L&NgtAA~kɯzddUxl6{L,<ph4~Nw׮]FxG {6 AQ4$!ILg?""bٲe;nԩVIn?(lի.Un ]o%TGEʌ hlx)[ꪂ'戔S@*^SB9}ǟ>WZl{/BQыޣ'/^p8$۹s'lTmVk#GDD۷/$500P[Wʋ 8.lj6OX,VZO?==fAc{ 8s8q-+X,+VDGG;w6p# ?~v{Ƿހ1 a(<ƣ0YK \?3ϟo +W񋝔Y!BJ냌qZYG?s#)-uNUs ?O_znk |^zԔ|siiO> Ԕ裏 2)fW :,<BSU?wn.єœd2}?~s-X,ǎB _rnOvD._Ư755N^LW_}yԩMzUVю7nkO,2LXhт N81N{ }dg](JR9 Lyab{/n':y%R#8?[兪 ͆= ܀@{CLmm$)]5y2(e~ .-;LgEW5n0[uYx5rmxwԜy2N´삢lZDcwh9ivnnKCj37/K=Evp/a29%|& I|▞Ʋ̃=M^ObT"d[-7'#Y vP;Av` c/g7ŒeH] 3~SiUjI%7|ʧZߒهLt&vc?DZ(AkE2û09WdeHk D[iܯ.L,MBV4 ~REvZEqis2yny')w?GR ,l x$?Y6~]<>wРׄ~w}cw@p'sZ6g __37By`$IO] j\چς9"!A}'VL QRZN Y4 b={s~L7Fh4650-CͣZQWF%e>؈:2\לU-ndeI--{[xiJԇ+*AX^^.Kais iib4SkO`uf6z#}e/$r{Wn }X,ueY e|دPIH7gqmBQ]\ԘVG,S`яemCG ?%;/(WSP"όru8_@$B{PVٻ[9E{E꺪2.H+ms9ZPVUƊ𢄜~z}D%E-p8FLN\$ZHRĠS偸ҽ<ͱ8F稌|E]E5"YvhI/H*j(kV#_2"8 oI~Dcv y<0VJ8F OvZNM A% cq8X,cq_Y8"t! wd|ЯAG2|K6|lܑ؟d'Ư AƯN؟l_s?̸ 2ο^A?$q$IJ9{ޘH%w֘9Nn?soFXpԪvLHp@%4k@6 ʒeq4wѯVZ5|}\/?*/+䚼,iHeIRirrsŒ,Lq`4<<RkȒfFU[( 9 3s;(w %;TAN:?}ۇηq$,@ϐ;'Iwz @q/r{||ͅgvKW<09}?$|I/>5]7f%grQu`h8_gQ[2QEU}rSn"ظL)P@B(&?>MjVJSSSeK|FfDwVn)(+.Ccsmsbͮ'֨ VdQ~w_V<8='(pqTУh!IsH6e3ɜ q`M.MZ'srel1= r3󝘶r- %ާ _wmH-.LW4644>Xjidgɤ\RYGSO.B^:uuDf7DoI n~++vʂ>NN̯H@J?X~t|{cODxoiUdTihw᮪]8 j\Gci{8Vͣhy`q}dE٨L;5qz?y/:u+'}HrH}F;~b}|TT7 iY^[_g4moK)7i}:*@S@al*Ѱ 'F&Bo0@\_{XYcD&K )Rv ga Dhjãp܂i1-`ZmF8t^!؏@?,cwxAsks=ycZm?3G, +1 wvk^< k?y/߯k~ <l;}w|p@jVRʼjyo~x*L O)7k}q2Щ  ( ժv4F pD,n8\Y_ܮjU*z"VP"aHDi/Pte,y^!'t ["]Op8g3G!5M^ʶdqMN(OpWUU[.܏KDQl |*,m쬤/[mǎmboIq^i@ZcHSH`v# DR)ۗ|aOqm8 ?=ہdo?K׼w__y۞x8uEk?$i)IE1$a7ҲeMs:`lO$vf%?8Mi>7Mohj>5~ r|L[8tϣ^H $|% ~)ξ_B28#/LZ.qՙ0,4x2sM\LikC#'N$D$Er9ku{qbL*4JYQ4!#Nas__x!u s=|@"2pBz=LH_3ׯ瑏TO!Wwx? _pKu y^u!qJ *p@IRuY|'+T?)!W$:l}%{ L@# 4ef,$VGՊWK;זUPK3 )2ql+K,*tId撊S@+qVIIUad--&MzS~&\~_/Rn(lx}"u IDAT^ y\-2s:k_a^OA"Pl}%|򰉺[Fa^C!tx7!qr$MEr[^;znyƞW\~q_.\ AAx@ aW !d555Wꡙxgc ~ff~frI!{y] {ffмt|.ռ~qQF{J]o]Bh?)Q hAWW>o9-z:yyy[㏭8 h7.#8Iݣqb&~5'X5R|!W-~Q}yejkuT(.u33#K5/_|y7P3+jJ=uٕWhq"L>g4 +^r_JtTTToo/^E||7N6mƍ#QZZZttͶYnJ%<)Ss1> a*!B!LHMM(qKUUU0w/\3z+,LN/ο6o "$H]FWWرc_{D"QAAɓ';;;_xaYyٳg?okk_r]w}7FEE/Hx7ߏp޽ mm>苓}B)tY*eM#3lE3)Luœ !B!az_Ͽ/ٳg۶mcO:x-%%%7gyC|Æk;-Zںb+1cƌǏwZ[\\|?oĦME-Z˲G'yR7/mٲeG뮻M}l"};x<g!!!fō;w<|0L2EPD;vlǎ2111ѹ}ۙ;wޮ]~J&iTFn S:NcԥH uŵPUr)9cyq&YWWz܊|qmvDG!B!FL@ɓ>hV(fn۶Mp<--->OPlݺU\c8RP(Gr1$7n}z*;}衇~g#G;x;v ' ͼy͛c6G;6/}ܹsH$&&n۴3Ϛ5KPqjvۉ'onk.IBJE6fə $b BЄH&(R""B}0P+(Wm;B#B!B&:;;'N"Q"!MS.&8Ȕ)Sv ݷo9z^o |LOc ֭_ݻoqܱMz{{괹s~gqqL%^c6lH$=z?:q7<u몣,XQ[[;f 1o޼{4i6i$ζÇ+hhvtttMW_->YSL޲eO?4i$-MӻgPRRR0=eʔ͛mرcy` owwW6ӧOx'N @~wjuB%I)y7ZCg ZI1&B!BB@\\\0WL|G &,\HOOχ~Ƭ)X4}^zkܹzىɓ}?vw--;cX,?v݇yi!y9!!aď?8ÇC qq5kɓ>>~ٳeN311qر? #t:oYv'N:uf}wqO?4u-+L&s^{:tgC.ՕL ˠSɓc4qr])C%K߷5:8?نVDH8!M*472P)QVhou֙˫YӻSH j083$T c]UV/lm^* 3 k}wψ'N Ǝ%I26vl0;G߿[o0aµ^0?ϪG,yĉRiR[[{ool 1b))={<ӔQ\%r5VVdbb@+0&5E-h,r,uur32^/;uo(-$+KFoY1OW#@SWQ6K{K 5ydW!e:1EV/0ir ՞tgO55,"E1+'67!.-;G+n,Y"zo8?L;r  CJYʼn|NXVRi, \06AJd2\X'5kRR<^e+l?Q2eua4fr*ic{,RN4?H!B!hkk_d6ˍ8/K0+T_}ռys_@/xw6={Z[[x x./ ƍs _~x~|꩜w,STggǴi\.׸q><>|cjǏooo:-&&&***Xȑ#WMc|`0]\oV=zĉW_}UP,Ϟ}SC5xki8?Y~mΝ;|'Ot{crooɓ=&L8tPpuOccǎK??>>8 SOMxU0|5״?4'K){YdSTdo}%R2IVVLYs4̀Z&%zD\ HR4h+"6TY+[buz!s4f֒ӔV-a@y8~x_@EQɣUɁSB!B hx'/àvq i*yMJJ\q))2`<.Je\}Y7nZzUw Lp֝ɼBFXBeI'pݲnVGs_2HyUgv?cYF=ګxA!B!40,ܹk]a*o:r\w} YaΔH8j~ZZLdLV&SfV"}lcY!zII8ѴK4䧒j( L2$k][R&1r)p0І"εeLcB pJYH*+':zEyԘ0kj֘+!VgMIFLFpvsS0A,U>R_tK+'9{MGV?#B!Qr(VGG' B?ލARõj z}~E6yu !BH@Kӧ)|܋m.66ȑ#v?dʕ+~Z?_z[PlLG IDAT6iii S9!!߻woUxZ2 @ # ̂L~mN>MsqJ4{e*Ϻ_5Ta{ͻjkr}zp__"H`3u לsZcohTSl%%Uv%:Zv7sj2\]Z78iV(Qgt3)=:`O'\"FĞ )TІ$w}EݻI4r)) ^}vOzzzyasΝ; )Ix^<3Xn]WWwn#GB1o^曕/y_!>v,Ynioo?yFqTJ}~HIMZj%J!vHF|d.1@gm LucpT?.mYyW߲sf"Y&-- d!_/,Ig8~F[Bf4DEkm'֕Tf?6u5zͥT+ j媵/!I]7e*mgWh:t8E`| KeU]p|B!,wy>vÇ~l[kW_.)))66>ذf `HJJbl6%K̟Gttw}WY:̙7,]T"0 3a„^zzzc|}iѢ`̘1/Vر몪`~vKd]s5wCdJ],{ƌK/mf_~Cll+{nlꪫ}tBܰaCp?ʼ뮻bccwhf[}}=<Ó&I^{^mmmȁ͞}o~DUZZwH$`4I=܍'$8Hܳg;+6v죏>6gΜ-[ U3g޵k9-deVɓ'W^ǎ]lq IR+gU WIc|\$%g2>7l+jif)>'KkNg_gRe2N')ѸL_e7Kx?+#7,SsuR%ZSjsf,pK6KW+()z0HIwVhh4m`;qX+`#Gɤ)jTJ)Ay.z,oiB!D̏׮]?//W*w}$$$p iSH4^غgy?!::>{~ٲq׿'.[qϿP]nooL6~ŋJMU\Y?4ed`;_O}ĉ:nڴi8p`f[TT4=oc2L=9wܿuenn{G}G4'}=wpntPGoΞ={lD_wݻSN SKHH_v,gϒH$r|~ɞ}L ;Ñb2iDZLY@JZ9|K(wxݴFjM:9-zj":iY3VJUBW/Xtl3|/PW=yJV1v˚y96Hg*0y9\h PyPj݆x M`~C^H5Xn_a8su8yhBB!34g~^Ç>|1cƍڂ~˅޸q#lذA{kq V/+̙8sW_kƌf뮻54MټWV$$$̝;e`^(JFf͚stcKdO:xm~ƍ{.oܸq/\wu_vttl۶m߾}J}kּ{n3xH}_Bf`]]]z̙/|CM\\̙o~٦\ƧgM:#gN8 yӢ|u"E4sjcNޕ7W[r1Z"b S?di")!@"'|b>ʦ7-9<\D™ZSBμ*&q1CcP:XP D V__RӤ)ʕZ|@I@62T @#'D2 g\RҰPL{;UN0uaYYZ No@:@?`< LTm"r퇈'.À %T+mA8Z* džru(4_3rWߪv4H+CS n7H܌')Sb^eFOqk홝#Cd!ERj$Y}׽1E(Α_#Hד~!B_&&'/OLLLJ??N0!::znǏט8qC^T㝝?7nۃbD"+kv~ohjj >&`f[FF7|ܝ#111**jժovܸqm[p _Z@ggSbcc9踸GY\fhP(qqq[nݺpyxgt7pĉMBvqγN<۬,CSSM7{|>v'ͩ@r.WԑvZ[Wc(g$79+!B[fJ(*)5=AU Sa&/<)lڷ̏?fǏw!H(*CU΋!B!tEcۺuT*]hD" &&$~5JHH0 &M&|pӦMriӌƥ۶m;z֭[E"ѯ~+Drof ~_"?>ܸq"фs=o?%Y nd2M4qD\|^kBqUW]wuw^Z-E"Q|.=cǎUTbxԩB²_# &$$l6\Nhih4a„oL>55U$7;n?#Gܹꫯ>?8zH9x`FƢXBhhD ѨMX0B!p 9r嗗?ÿž}իm~77;e?%/EGG>|Сp;,_>=cƌ믃w=z嗗ge^,^K,YdI?|xOnB!B.kܹsr 80!ay>phBOBY42 B!Yr1g-ǏcXEuwrH%g,/$ kH$WɁ5IҬga%QѤ56/!B!t`]t;blZH8KW3@-[Jth)7Z幙2El*_c87vJӖJ4QH5N-,H j0s@(JE&7_IʆsW|rL2hƜet#ɈsaԔKI z·0m:.Ґo*W8fdj^m!:uB!B!$[IIhyIyN'V Mm)`hfJ N7q[n{n1ݿ?m\"Ƌtfcoh6{x3WTT;lv2tpʼ`9T+tL%W N*JTjY7̸tv63vN%VG0~:.c:h@( eiF$klEe<@3#S,0/9B!B L@#,Sr]K *Y2Ka|E U VgXZ&iF^)OA P$Q~{*lkw8\`:ֿHK$YY3e[tVgxĺ,֚jgJrڼB*c +tDyB!B!Y0AwVhh4m`+$aY3Z],!՚T ~2p׿&߭œy~d* \q~oJ4J^{*k\2; @:!xx/ zڬ!KMpT 9 Ryj3¶ F!Bw@#c89|eA3QnpbqyH6K:@B1 V<(mA8Z* חJdC3 ppD6X,xHΠ 42~B$ׯSL]㩽  Medj&$hP2HyUoMJU ƀ\WS-:w8 ׿YӤ)ʕZ|@I@6 ,\dWpxcvm¶b^v^#B!H:uhVL Buvv^e`ǞS%Nߵsu.V ϒMm(CܠN_U{m_uNs: V~Nۇ6&5]Z;k̞ܻwü{T7{l߻%r _VN=/ne8MGou×ny$kޔQC{}pn9EsIjt MW+;p~VԤޞ^u'ժd'Y~w8hfw骛:Z6gpVˎç%ܠJoas~"x%wkgxjZ<}N-珧۽|k~-l!EZ!B!4ҢnQ8, pnB(h$E%zy*䶼)=!B!Ш!@!t)tF6cjb4B!BKF!t!$RUSW"B!Bh!4!B!L]w@d]'$$GEE,}7,\; Iرc裏^9s Cs].wiNj;㏃%EEE<'<$IRiҒ%YcǎjkkOw A}f͚0aB{{_~aΜ9/A]v^3flذԳ^wu-Hǎq[nB8.K峬i B!Br2⢐3ꪫn0}{뭷 ƍ`ݽ{M7ݔm۶־_[,;6vΜTP1''0!7̇7.vر۶mZ&LxqԩRosϱcǚBl>k֬￯G>x1cb|~g{µ$g,_ U*ҵhRS(\1c5,(94C|gu[@B!H Z IDAT.;LJs۷?~|11g#66VTN0!XocǎKT*Ull-[͛{MG_ >Xr[}G~7_2Yrtttjjӹ_䓺‚\cǎsy{o4uẺO{,L"I'x\}?_ Ҍ,&*7HBc˫e@a(J5S貍*Y"\ pLd"%"`\cF, <.gMey;8,zinSl aAZPVPE3'#ǨS괚˫" )\59yUd'i99ɶOi楒l%2;^KJ!7Jp B!B嗀Lϟ?|8z+OHHꫯ@ ,~[ys=oY֗4iҤIoֿiӦ)_rr2=ロ5kVBB92%K֯p<Ͼ}fΜ?US}}ߏ_guqn=4顺ٶ!I[O֕:]ZY/7HZ̭\e({s|sy~z4|7]5"D2?$xY/Dib :1?ד]XAi(- <B<[eT'QگYGUabH9&%pW"gY?!B!4]f Af`ǎ6[cRRRFƢի/@w  ?}@k+SL6mڦM cǎݻYnD,@wwwLLܹv{[[[_w/-[ٳ?x5=…{W,;wZvw)3_~yyoo`Ѐx%<x\L*mVh\Y ,Nd%ř:yo%鄭$t[z#_ZTMfWzU|*V`!مNgnۨy$AjҮ Lr٨PjY%tk"(2`Fؔ(Kk/E إ(t-hdJĂݢ[BE~@^FI4 qlb8 9s9|̃2in}6]QIb{:eRʭ[wXzF!U8d@kYXc,4J$=y_fh њc+RvW56դ a/ )8]5&=E6 ^p;2B9T{ 578̆\Pn?_?9+KKnЩ5*yv;8\4N&wP`;z*MΊrwP I2)v#u r ʳˌ^kI&菦B!:N g y}+/^a> X_yeX`^d3?+ b[oK.YG≱v o)MY,hi-h]'I0uB"T9* Y **iHv%clOHyMkK: g$F#q2-M^g9oNItFBWY]I  AB@CW,%`{d45Ngc]=mjݡcvAOcn6X D>Wa jCf]Y(jlqٮ(^+rkB)zlD?ȁlUXiU۪6&Z#ӹJgVzَ2 M9\SЪ ^G4N" g0I{Z&'zdl:$ȱl<{:ZѕyЎRk#=)`XAgX/c-=2 7̅Ҕrbش 2i?OUl;H" 20̐4JםW'JTR܊t=6s*ɀ795iiU@ZŒZh6ɞXBzp&}9ܔ6幌d"O,PO ]i75HD IArZ*ӷw1&RO.bwl/4;X$2i@O}ogJD:xIqQ./H)@@M[*c 5e NO>I:BhgB! L@}ݓCP(ʽ~'|W^yeBիW}$y0Ȳ 1 3ḷ~4H:_+Bhl8o!B!t!@o龞l.+X'Jz4gKЕ4ɏ{Z)~9]z r*%Vkctʲ $9ClRUvT]EK+*%S'cHSYU*n\_& l*0Ia*Iȩ$ezȍ#ȹrXZiexs}5ZrHu"LAWO*/cWƉr?'8SGZBѼrIf@=6~6t"cnB!: ЙЖ4*JOK.ux8&W[ajͅ"ImN 9 %ĴVW =TL3|bb!B!tzu饗n!r>C :CѮ:44^Q57SA]wdB!BF!|VASQ&U@+{B!̆ hBCEU{jI!Zu!!BkngϧxmB(g}B!BfcB!B!B F!4Sܻys>M&Z} ηPm'歙y9yrmqs_\NY;!B!t2!t[zSsfL_˪iݍkB)KJk`{й.,l ^d'fSBHRE Mhk3%քی񦦱b57pqVbϗXl_B҈|x}cP-7NU)k!B!N*L@#jmU-vj%jnNN_ G|K  Zzi}ܚ<4cS4I`܊\8R8}?KL;?) \JB'̠B!Bg3<}߽+-Zt o͙3>/tJ6k,F{nJNRiB'dSGmpCl#3!'|eI.Ӷ 1m32Fv@}j"k ikM]Oúf!/opB7.D=-Q)a3e$f>sP(m ܊αٺzըiR%ߚNՍ52JCL2[=$P T K"]soc^M@fBθs?QvsS vW(/RPo3.HIDWƨۜ;.6(6nFݠSkT @w0Л +Pg?E_)>O^ZS}lR`Z[{9dp]?bB!B O@ߧ( /;S]]} 蒒aNdYٷ-SJ%IҴB%ƺڵ.|T)MY+*hi-]'I0\vDOU nv ۘjLƃb<Kv+2!B!4}ٳ/Ç} .عs–_\pywl>i>~ih?`0YvNމ N rk cU@w]u&]`Z2,?o>V"Iwt"t֚+ l 4(l@Tkc7JlF)2 +S~ͦn,|$p 0(F&{greQ& kf%@s˲x~kŭ$T Ғ"ǦRGC_`|YlFB,F/hHܔ/1  3$Mc+EBQ?y4f6-qKx.(*&!B!4}޽{_„Zym^^hR;gϞɟ=|pwwϴ{sNFXbYN N{k͑1Ñ0Ze*9,9bl$q0 d'Vh#i=#yb(뀋 g80 ঴e$I*_EBg6i2QI LVBWtڍF *H'(u }>~θM$ԕ)y\0]E9>dB_(\iwXH8et9#B!P,˅вWlv?|UK.}W/nq}ѣGܰa[o}W\}ug{?s9o0 ~-[nJsTUUɲsf +4w=gRRRaÆ~jآEno|?ټG\rwݳZgϞ/]]Or .|zgDΝrJ P(f`:Ϲ瞻`>H$Uβ{nЛo3 >Ɇ6+?.ITj|^XHѨ ]PSȤ3՛F:Mf#1#nA*{ @ &v ڱ,FmѤ@謮&IFh`&% (2uzbZkhzZYxBOk+!B!T_, 9srۿ^o5kX,))喛Coֶ>l֬Y߾F;W?u_|~_t@f[dhǎwd^wݺ+_666m׾[n9짟~z7xMnʫ++M>+_uk|ҥ͛C7xCyy9tӍ vۿ{d Bt_OBm6LG ,˓t%="J=^^_.= QUT9?FZHmheYa6)R*zB;r*Ɂbz'TIyQ55LebCY \_& l*0IdJ%YRyb~zat];mq;NKJWONZf;\zy\exs}5ZCL-SWP'_B!6s1tӍuu9s$z 2х~=??ϟ?lJdI;Ͽ mϞ=7qG}~#;oyO>z}M70~>=ܝw6͟?%K.nwA\py###vڵk? v>2`eY;7lXhѢ$ݻwo۶fץKRl6/ q 4crFE@r)å D U;\n.ImsZȡP=jX i:l*PSo pP Q\W٭u!El'lݽdHR,'n',l3$vrEAfu_7+g%ǫ6E粄ZV_"QF }Q&[~G#Imr*H=3Jgp1hL#2*h.rdץO۸RW;\bKgAkHE@ ayw3B!Bh`:~W/K.s0Vݻw̝{4t,|k_w˖nF3k֬ g_ϟ?;w͟yf@ݻs/nԼ曹9(ڷoXqBxbCϟ?|I V;a 쑑 @ u]z6oAh2ؽ2}-6[ G[ E~:ngMcqq IDAT2D>z;ءa61.iۃV$;aG6*b$LX[EF@l,8mjJ3\"4eBhp]Z$ގp1d@L1V44uzV*Ia6%?0]gujg-X?T]vR9Ntc[8Ƞ:)BfǏrT8hx(x]tŇesגOqtWy|!B!ˬK/tvkϞO_ַ TxW|p˖-/9s~{??-X<^{mmOǶN}Ͽ뮟>d׎[nuCyX.r䎼G_8{f޷}Ov_W?oݢU}#uOlKmذ_ʗӟ;Ǫ#< sOA\dɆ n>{͚5tɰ> ϰzWvIϸѮ:4i%R9:!B!N3|3g[ ;v;EQgϞ5k(_ϟdٳ`J\.ג%eg}6Mӹ/5ؿjFruYpUW<<n[hQ*J&.Wy/}iɒ2#M_dIYYYY]]P&~޼y&I? \C,Ytֿ5_tE .<ɂ$N':iԆ6`0LN3i B!B ߂\w}O -޾}oG=;;sY$>8pX:o(x?Cw7pw]RRGyxoyg-o97p 7ܐ{fo'+W^}:t_뭷ڇ~?͛7_{Dh4g޼yoVn]v=37߼jΜ9H䩧;3<{ܹs_PZ>JشiN':i52 0i!B!NgVW\pCMxkΜ9|_y3O.!t:-8B!B!t:W@+۶m;|X!:㨗8*P_X&UV'B!t:85ks 86܇˟B{7onsL_˪iݍkB)KJk`{й.,l ^d'fSBHRE GͰzWӰ.[^QõȜ&"57pqVZ`6ɞ8*:^ Br`@?wΰfk 3DРPb ]nima4b R eXW04NRa3)B擉H(ؓ4*&Tp4'^ӠQ@32#8.#ȼ8U2fܭQ\B!4a!pLWkchCWs(!e>Zg }8xX.xP=8L:#56=M{|O 6I.<.XNkf9=F{{n,ٙV_miص/ri{v-/aS΄CѯV#Z{Di^U s*ay*&=!eJ-)A6oLiT3 e!1ܓ"ԴhBNv{O:b.B!4a!pr:J:$:k4i81-#|eIѶ 1m32FDCSM|Mc)e7yƖmmf!/opB7.D=-Q)a3e$f>sP(m ܊αٺzըiR%ߚNՍ52JCL2[gfN*Ps(r?Ki[C͸"%)#$]*eMq*U樬PZ=vNQȳ@ѹTp  ⺛@#ij+S[&wP`;z*MΊrw)Ь,5[M*=1q)IDz)(CBFi^:UcS$lls 8bZkop +]\rhsZ5l5`?WNiB;z>rIR,h5;VorW+bS]J"a|W(O 'Օ8`G!0BXWvXօzLMӔ&Gdv4\+$ +Ԏ'UJCioJ] 2:[>R^RNBIH jKYv[bmsM*+`0D HRHh芥$l lK]y?v(P+R;Mv[Jos9+h H@+ŧ8 MJXl0 'ƈl;w|54T:sM]CF>m6R\,>iX[('#YnrX@ R8S[YqJqzZ' D?Go1嬬 !Bh4B==^ktSr3֒aeHCmRŻ2'\0 D2  tDV?ig:(|P\detPOHIrmL:`RwN+ߎbm T_ga ų 풾`_ ŧ8HB2? ʴ`,&t*iIcS>T1  3$MWCWX;NZMBFȨ!("g.tS[?F͜J}2 Sl2JG|"8 5mqX"ەT:KQxag2R)æevlxrNO@P{%'}\_~@[k? -JUx?)0HDN=oB!0Bd!g֚#cʇ#-Hf` eNfJbl$q0 d'V(ou$Oz\.24Z/'`j㹌d"3Lb;V(u M5^2?ܲDKqWD,5rt=e/H)@@M[*cMJ)\a <߄jۻk$~-P֩+)5 U5Q&(@飢nkA_;,kh6ylsw51]{":HF_Ȯ AF!0Bd6nYdK:/Eh薯jJt@ùzHǢIl$b$ͱ T'Ykg.So8~Ǝ} x_)7qA  N@Z"_Z``@< ӽtZbͽ[^ 2|G=̉"ϧ/n踌eB\QSr&trxrT9]mOfJf͍h6v"'u=LT!B 1!-דPei$]I&&q),/K~BDUN@jV@";&$2 I2VڑSIt,LpeRAPQ#+T Ou9W^zXA?~1%YRMR<<@g68 -ؔ0F7TPbLOZBi&NN/SeIoHwsn"70,worƠ^kO%IլdcSl#l' pT*$GK򠫨 俟z=%s#Bhg +W^hѢNxkΜ9xg_|y敔E}~\QQPz\pcWeh^Qxc6v\(洐CXMku5C44gZvx(ө巅X8Qp?$[,B(닲xO$Rm!{ JEY.NX.OY0fH܉hrXbfsPa&#μu)^U?Hjw7rJg6R*` G848,2R2*^8v39 XI&͑\NFؕV7Hϴ\WX\62;,eb"hp(΂\FO< Ʌ,MF}Ol($?w΂D r [27ݝS5";fvgU?wAiȆRf8Nqbc*6<<aAg<J3-CBB O@ߧ( /;S]]=з߾o{o˖-U*$Ic;PRRru0  `6Wu>_]ecvk]Td:ngMc2D>ءa6k4$]5NO $O&ر ;Pi#r`mu{,p<8e26 NrZ  D٬mk%\v2xs?յO$<R3(p]7|jz|j2ωpI0]gujg-T.ly>Й̺Lbe6OszoC /mZD>)l,wxjX94 2ת$OuD! (S-.˕o viJف~tj5{P㳎=w4GG'^* A7/v>{}euyl2e'J5iB!f]z3[{|:-Wַ&J=÷zkyy+r}΍zr?^q\xyw hfjPY>Ǘ7ٺ569c;0k֬Kv‰I> :Vou=chWG k:fsaښ{}PR9:q݀ϳ1[1<:G[mnnwk/;B! 7=+͛koo9w/fmmmt޽{OKEsg͚~ݵkst=8BMڰL I^RoI+>OX[iLϤ5JsHF] hcQ}F!: LC$}ν.))ٷo,֓eyBO>Zh,kʺus=w}?H$W~לs9;wz ,PՂ <쳽֖[cpu-^L=`ɒ%V:۷?ٸqG} W^Y=ضmcmm|p'oxꩧ{zIٳG=w{W0ҥ(++8. ^֮$I?>|xr}sÆ oܹsW\i6W񗿼 ٬R?Ueee{ݸ7|!B52 0iC=/V*GowB$H{8kB!N '^xW_u\ꐢR׿|;[l%|Ol6e?l߾FۿҥKyoE]zoߞJ***\[߾_>>%Iް>Aoz-y\`As^o~3gΜ۰`B7xg4w?|O?] 8恁Wرc… ?nмy2jYwuז-n;ht0qkC;C[BE ŋ_%%%+VXtoq%`2JJJ.Oa:w K,?2ݻw޶mK.MRWnݺ5nȒ$}/^{}ɒ2tUU(ouz]v+,]45}FFFF=ܝw6͟?/\>عss=[lsMRsgzΝ;wjW]uU.ԁ+2dY /ZhϞ=y#fY&qizrD!BScvXreIII5M+W%L(,))Yr)<Ҳ2eKKKKKK&ޟm@csÇOY~ᇓ `͸[OdYr%IhRa3)2I&&ϯ:`i 5LGsa0d@S#LFu͵Wji :vgڛ>(Gc R eXW04q`Ҹ*f*9; ͋/!B)):o.]tªX=O˭>#9s9h40gΜ F|uצ=-8D__t;o… ?Jg 8_׫<_k{mwم ?o<ɔL& ǿh"Yv@ūg?D"m۶+YdY~Õ?mva$so?㲝;ws9+V; /\swڕW_Q:.8I,\'!B'ث2:ZJH2k%Vm IDAT/'7mx뮻k>Çx(߮]y晛o^5gΜH$SO?u\V?t믿[o_{?=|U|m/яW:t(5]\]]-Rxgf͚ukΝ믇BW4}TjǦMp"tT*MdlhJENamd&Y$O1 -V[!FaF`Nr6O554 s #@i7& ͌Am4V|Ju.Ө$1=2@)mkpVdotU;FN֐*It2n1QR%e <RդbyP(Iv35Xȁ66vi8ÐBcѯ6dh"aUS\wSs$C -II,6lGOYQN ƍ(it!w2Օ8`t?O >#Gn9r`M4E>isE']q GeS,#Pv0R a8+Ҽb B!B%KJJ(7x#>D|;w~K}{箸L&sС o͙3/8q{Ç?=Mn>pÆ^%Ǭ]O(5k?/fϞ}esΗ> vwtwLh$N_wݏ&[n{֖{;_e %9O<[o=pBr'x'JR:XWvXօgQ4%#i(`E+Mk!F =Im)'B"T9* Y **iHv%clOHyMkK: g$F#q2-M^g9oNIm@*+`0D HRHh芥$l lK]D6țLƺǬД q(+F `"Xxs]E9)$ɲvCuZ4?^'o4jdB.%xy>Lhޠdxt냼 č6b@q9++* }vH@њz9ዤO,FŹSr E8ʼ8)y4/B!*B 覦yM(}[4=r}myWmV!gϞl/̢En7EQLRmmmyxB'aZCr.]{xW  |h Ej*}4X:O:k͹4 a4d.%''zYO?lF)2 +S~ͦ+̱$p 0(F&{'o)EdY`:b6c6*IZMBFȨ!("gVO_)|')UIց8<0F͜J}2 WQnw.OoepdddFPRRşެYf͚3c?22r]kg`Ư\Fd!g֚#cʇ#-aTrIY!X,i5xf&i3w$ :"C١!Lr0H&,BM,hBP| f묖 q%62pa;4Ys2\5e NOnH5EJxZjRY d㦵:ܔ\d H h@rgV1V׉~E/EUFj8KMno Ϥj=cjۻk$~-0b?̚/!ۻ︦='$d@XbPAj:ꮭUպG_VVuZ>Eu`["XA%";Ez\! ! >I9sݓsPUR!$!A$JO6j$:R c$6ɥrƶs}CQ2iRr) Il!GF1y'P4 "[W,trݛ4:tHB<`S(4(.!T@~}Ҽc $%~@Oϝ+ڹ`u-B'_m֬!fˍt=21.Bhűo,=ޥӽܻFB6B@I$$ŒH&r |IRo5%X"MѨ$Ҷ5D8Jkܴf^ oj0\_tz!BL5]w?XGck,cU,Q癉T(wxbH/e''ɞ6RD0I% tsh3gQh<}ZDJ1b8{_Ʉt*E%^BJK(4.iqqH\R}]ӏD,1,_pYM LQJ5P8T$n) HP?2E FiTM{==SBxQzzis+AQM#MDq0qCf˔ ~(!L}uɴidEƚ 5%Q"]|)C~\qk6ҏzD<RH;bzŎrw9`&Ь$vFWS!i9ҏL&B!I^Y*"Z򤡼s~BB5XaB!0J2DcM$8nͱ\0i\h好۾@85m[mcG%J4vRIy!qH2d4L %O7=jܴGSId2IJ,4>7=ͮs6.=q.WBɏG&"kBUA//[t5^_=tmʹڅx<[Cח8N|իWxxxyyX,1Ѭ-vҚC`׫/m|}W^MD Gq 4dKݙh (RC\An;H3v֊ddHJrE;Od*FhΥ8xOX0b!e&5k 5g٨s_iiHsLb\|mż#Z9紵mHWhPy7Of^[=t\k]xl/ǃKLLl>Ǐw]y!5صy]4JsA fk+ܬB$؍KTb礮I])ƀ%M-<ݡgϞn*Hz]ۇ"0^' &uLdX3vYF%/=gpښCș;wftI"M&H Gl> |\_Q ".j!9R\߶fQ$1\x㛎*>4KD綥\sIOGO<1?iuoUT&E&7|?٬Pu\5\T}۰OmmݻJ$-$ߐ×^zu:t}||nxϞ Vl?"SOK$LV)?^7 dskw$dm:Ue耪l#h[S%%%~IIItt4|B0 .]*p96??]6E k^lI^k?耪,bm1D Ɔ7vtV&J7mڴaN%`َ? Abb!DHtɓfĮ͓6]ۺ }fd2LNm۶"d2M&Gp:.222#ZC_]~!4`3SC{.BС/lr݉'$'?d2VkVV_c4|{NK$/;vl_dIuu BhPA4_z)OTYf=@X}ĐX}TȪcEdSC^wjKV{BPBBѣn,\033sʔ).\XK.͙3{֬YpBH4o<͛9-NMܧOsw.Y~0aa$Iqqq|| zB3 V(V͛ݻw2@oc L^-gA0Z{|Ϟ_j[nrƍ/\ 9s]JBLO?Kӧh@\.H$ ̙T*iwAPD옘I겳_^^^WW9sLo?l6cu:jb3ft@@NG2P(HQY) !'OطiJg̘H$R2@Glݳ6Pƻ݀+;ֆ3B(LPYBYYY3g{6 9woqƍm<y߿^dWd |LL̩Sjdeegee#x"(tz?YG'Tsj?r^urM N1" X &$$8n@ Z <I${EGG=zΝ޽d\.7%eԥK6'O?07n@Sh=Ά@G2kn̈:."P2I!RTTƠVAR}W_pXQQa6[ߟۭ[ J=zt:tdrɓ'mbH$& &ϒ%x{v`evdT:TI b0V-`6[Ξ={տ3w}e˖;w_P(!P8+WdP5=,160mNǍ͋s}5++:%5A}yyv3B!g2YسL2*<S@p8D%iƌNdggÂtJ:^C9:ǏC!׀u4?E#&> c? f@! CMh՗@LGdp-GewI%xYD_6@l]ZH$00a@xOy /R-_;Hw\: p"{6_j Љh? aSKIp^ް)Z=M3'c ;.8=I2>J3^ϐ<7k#"gm v%;X {] 28-ݏ g|6ag&0_e+4Go[NgK>pIv¥Sڵ#x DSۡM\ 93q5!}*$k-v8vQlef1mB(rFQn2#:"!BWw{=jzTu {ݖd' G,;#[) r# 0o&.e 4`&.[0.sDFһi'`K9&§0Nk xe%]ìQJp2#-ƪ@$ٝ帙蓷7GɈ/z"9~Rg4\nfY* ˿WynA#^SI!n";66qɃϖjE6+4etvϵ=OpU;h Ka10B(aEvOF{Z_SZj& QrmVA?G* Km8+ѵOsP]cOZt i$,-c+?!ُ濼YM_]Ryb >ΰ,l3w3u7V@u]SuZgyo/;mRƯ67S"vY-3{'9N"xmꙺ+'}-q@b>O G>އ^qc7Iv&bjHT;乗oc3:WSv}FƼE kJwdLR=m1)MX_Mls9Nό!ZnV:'8X_ӊ.B2/R#VV0hFᡳ2o0!-LȎ`ϻ}/;Qo~tgdGN NNfv/L_7Ԩ IDAT-m>w` 5, $ @[2 'v%֢(r/:p$>xJܠ츏1_[yaѵK Fo|~ޢkk! ab!qOD$ߤ{r!$#8'(.Y]WT'?a\::n@ܽ- wj+ Uw \t{?ω͵5n,ZAdp٬m,.s?i|U/o(󳰱5{? Fu~ÁSQOyP'.>?8jve#lf'':2ѦpV{!B[=l`z짽U|4vA|ɂM\8|KsM:]%|`5!}=|xըǓ}_j4B(xQ+SB #_dR՗2 B M'.*?!§`DeT2Uݹ#mVYQ]Fku7 1Ç['3/B +s\.3<$ ^ zTQoxk%_nXh{(TC# $${է0PCcw J{N0}?j2*T|fѪY=l]B. Ie_oL^M5,FhwW]0c}΢˼ e۫^r#8^xwQV%԰]E#3 aIt{$tP[iF„%{+~fdY4J"n}I ?NhSWɲ˿ی/PW)*> ;C- dl(qDR̒)qM-X7ޞGf5걐%B42 yLao˩тP#jhSÉ ڙ7V1A/ mfS_i8uvf "e9;~0זW\q7PrH~$6~hupk"ﲱN]=ysUw}}kXއfR^:׻Ɛq¬e8")< =䵮^ za:.z]f6b_&Eqok8H *'A[șt6eFَ,l7 &; AB""x'sC̓e,|NH}m VG2H+MZP9`4BHۏW7H'Dޝ^Qdw]OAg^5‘-ؼ>].L|bY-o{jzd-6k:oԛo5g38.wHꮜ,0Ivlx ݜyI9g+`}uIYۥBc5tj/~d؃}cAy[zLяdNͳ'v "^yO$o?WIu%G!@o}`$ATw^=֨MZ*O+8bFX|M:{ͯ^yz$_Qaҝ^ OrʦS{E;ꪊrlA}%jIoQ4Qu[ $&O)X?Gө!]xC&)og#cz lyq7i)ƨJ\8 HъT_lAǽ6}`:ϫӣz1rye5߮ OK!TkjJç9k~9tWqѻc~ڗ lKCmW fɜ U~O3H+1}k~:m% hJW)޷"88N(6UУz'7iݝnyH<ݦm+vʾk+vʚ/n4tAl/n|(/ie?,0p.6Xp۫FeUc;}^\V)1}Bgt C{# 6։uM/?=47xBUEq>} xv?] w@ w(']:-jh7ף`8W2&߹yI5r-"l4Ϫ^Rb#zd\͹׾,85#*kpN\DQh{NW]џHf2=W֕\ciC~`U/z;a(Bnsb3L N\$:EiUb,&임%d3=- ܁)SW$:͆M+!do5d&gl#6 M'<:Aj6tJ܁)%{5D 5?\S_$*.grcb_Šu .2^8B{Auj_ cX'=R-ʩ84їmRHv J,hRHzB\%hU&e5u៏M;G}ҽ/o̳+9}W_Q4ʪg6I ?xJtZc][qyx{lz`VM:?> EyI{!Trpmw{Pߐ9A#݉ ?'8-CbqqDRՇNdptI!q 9ADϮ+7$`GQ]yb&W~;7P[9'> ɵpͦ$6OjzT/ɀyQ hX ncv&gZt7:ש s*27D0}SWbo!<=:7+A5J{8Cs[mX;Xs\qޯۙ{{XBbɜ 降稙[&fMZ07*IKϽ-> [zdN_P9b{^nmܦmmjU>G6Ev2|"FpTՊpxJl/a՝6Xރ3Bէ࿼0nO7W|F䵎%s_i(%o:@6,wͥRݹJb1' TwBIO#㺾K[zǤs<&Ul"sCt"% X_cRl3%2j)X?q!$x2')m&eI!kſ qCp!B:cRFx*MXrJQHllylꪋ -t<ֲfKq1 ;G 2wM !V3<={Ã[ Ey؏Vp"}WW)bХ_mFYUW4v;wG$QxazwQgWזQxըt17(7tMKX!LQnr&VoD ?ҕVñXt Ll [c%uվ۠s^̈,_<ݦm1kw8UC6dkt;6Xuge`y]}YNwt /^CTwZ:ՠ-?Z}@۟ U-Ib5DiL<k(0׌r.~x/{GUڤ#2 յYujcu{kBIpg.nj/}ڢ=#oթ}͌ qȻ\rq];x'4a;GL:B,gvWl&պ`}㺠Ԑ.-L)Ө҇[{#ꯝ 1.u:/mmZ-F0#Mc6\b CGr;(u9rQQ QkLdptJo۫^86KXnP|ܠ[@ 9 O]){dn_s~})!8ՀB7sAF}[9rF=]IrDb@6kܧr͙ӷh"MIFH憐9Apxc37(-gKWy͏-? fn\&FFĢUa z4/lVٵ3aS#ؽq]=lVSޣ<Y~bؤw}H~Ҝ|Z>==PgBF#s)| qBGFJa5h~șdNٯq`ŭؽe=Mb=X;MB!<7^ϒ_#ҙ]?~{$*GdrDJ?l՝N1Vw+7ME/4)뼏`@u>l卞NgiOw:ddnpt"`N?;F]WW*EXNG[âk(jC?bբk];;/+:1;~0 0{{"!fWW;"G]I^3v =?_$?ɋ{_IZ ^$c' <ͣFۃ]>/怎6mkŎYiRmY5$vVnN-N_SJ.NÞG !2V "P}F]؄ŔOpƬ:4zT/Zx^u !Tu*hkZ_^ObӻFy߫7w=jxp {J0u|D&q=k/)N ' p@t?3~m4mGbN##H~Ru(!6qiDӇBOf $$$~+7:7tOp%Tń͐u PG\ <هPud<4.Y܁/qDw ; n[jk}@eO >1K$^I:&:E0-ZXsRr4ek+Eރ웵J(Ol4:V^v,g])V?eUw>x]^1mU#:q [|&:mc˿~.j|v!w]nUԢ'F+h6m5<س,l)s.T,fMmpxӅV44O&,HwKxp "snI80x4gO"[ :͋+6[E>|rc}MI§}ŗfc[&,.ڍLZc}-Ba,O(ngXe|'b5Gl6ըYw"pdT}RIYg3c7h5UYB_m&qhV|-bJ1ᓗ$w/ }پDqh6y?D}?3-*!)7WMbhVyCl($e6BH0}:Ţk>i37mI_Sj_ÑMr]rpmOPg~NtCpo.?_UFw`yinī [$N'N_|xa&*{ʂNlcyZbyKMّ԰ K&/ n!nkJ~;@vL˔Q3v@!ŭ§.将fIDATWsF v+,. ǚmgK믝! uW#t !T ї$6Ϭ9!$8ї9soVMa5]GolVAZi5X{OY }mE񦈜Tʾ٣qI%ca?·KoVeT xO鵹뺦$_`D^[-:1q7f'>~/$z-zZ|bWgH"sz>yFobC&|ǭϵ;cL[PaRmuQqN {!LVb=]Ãϖ:!\13o?բJЏfhpx|%&U}'k?T|֪{`+~Q#/?׊96Y#>AZx»^}75߼?Љj~9z=Z~$ djO`!L.݋hղS#&; [Z6 %G$vWA8ݳUa4׳37h﹝ ՜ÒKG۰~=;/ЬQ*r/I2ߞ߀uŭ>#Ԣ+S&. |R!er @;FBNh/dy!w(ŭߪN.y@C+濼\'hs.0?] ̦<-hn abyKuxeE0`ްaSoeե?f!1mg2B 0 Un)j }8"]&lò'Op {d3%oRֵH $px=!)"EeYMmtBb>7դK.~Yށ4" C@@/+RIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/debugging/image02.png000066400000000000000000003021631461403617600241060ustar00rootroot00000000000000PNG  IHDRsBITOtEXtSoftwareShutterc IDATxwxTǹ9m]IPEEb0 .{8oK|vnMرWl04.@ {S *{>jw;33g,z`۝@ @ F1&V @ &@ &@ &@ &@ F/=^ODqBRp{e~&`eZT2[,z_5= 2TMv <$I݁p"Jjh63##&&ZRnii)+vѠiUq*t}-=Miі6naZqOEQ+'M=ɢGRG&&klAL`+38A'f:갹A &UrYd2 v]bƁcWgGiL&2t1cluʴƘơk -&e qdžń鯉t }ȰL2>mӳ0%Ie(i%/^7X贶mYۦ)%d(ҦwJiM=P);]yܣ*flsxZPTڦ{Մf&NTFİZI W@ѼZmԲt{E 7`des2P4Ҫ*п$GGQ ʨS@v:=1Dt xvLuqN-%E4R۟aljN0hamRne(Q4 6:&BU71 )`$} wGZ^fdX0['+)Nl:W1iY鶹|~ (Qju/(b!qxf}]1o# آAGrN$XC|c͒DFS u יfH9;oNA}_o[WG$O[*^p<݁p3#")'txZ_`YfhCLziHޒs7Q{ܗW@z?Ī0[NVܧYMʣ\l.ߟLjXsbQ/N~_'zomśJZp荏 ,UgݹmmNjb^E C<&#.*L]ՅZ-GӅOyuohoq}D. ͐L1RSv8o]"2Sr+i)+{MռXpyywx>RO;,Tگ<2'դRWNJHQ!@ڼ9@<}{hKy7|{xst6};/tׇ^y@,}ϟTB [nӗr} o:@F =6wqm8os>m&nOM g=Ug|D:L1_gV@G%qCZyA{V,V}%R{]NSGXӨ^{[֑gw!mOotuk.^~@9Pk9}w5ZDޔ1vY9݁L79n/!!A$QGuİL66(]H0mQjomΏ(͞NO@S@|d7fJ6pe“g`֍=U"F84Yb(,U^rʲiY:+ղKS4]PG|RV/'t 3|;"n4kռ aJm ఩F)*Lyܸ Y%x%1ijls. ={|efJrhm}V_<{ߢ d1{~'r.se1zQѽ.tcReE"KccJΚe|`Eggkssks])@K]06?I+v65v 0nF[[@Ql &cn~Z6 ɒlm3{cffT! rϋ',X3~F/$<:$Pqr"9;+m>"`̘mTA=-g3 vssZ]TsI@0p5s/+ӫ$OsqQOa2LӛAŒ$q 3B`Z`isHr;eӳ~UV]Ub6}IngvCp}A;J>siwvx Ebִw2Shj@uC_{w[("=J-?YsZ oFU|r3>nČqF;v{:?gk99… )lպ\ =W/Kr)E7dXF|/|(E~g[=g㮞ŝ}ش/<ty;-aSl2-t'l [|OU5-N!/~#Fa(ow}v=ˏڀp&).*}DrY{+ƒû?{ΑGG_y+f/Q")9W nі1,6xW{ۿz$;m㆙\v}qJyz$Hq8Wkvyzh;ڇ Y%uxΪʸ،FXL;iV N/6ʼn4YYZ@^bbcrKEJӽ1PR',"S͌$,ˈ89*2˱,wyhAEHӆ_y\g-c'0-!:ew G/mY&0GT:5I&TZx|Kִ̘@re);ک0cY](^a꒳cz $Keg<׿ʠ҂vW[$-#^`kuu֪)Ici\Z#o2NJMBiKuS8Ǝ.,sUT$lW?2`㓓J*zV:PKj..h]7߽,^ ڠ03jŶ>5 04oO2NH2PSQ[#u+{ݾa{|>:q+3橒ӣ@?_ȝ$zs eZ qAw@dJ{[} v~ǯʨ#'F9[EY5h$2Fc3;8 eMwﵞd>tGr_TILDYA `LwN~_?. DQu@Z͡ieQXal6DQAlo~ZQ 'B(b( hΚi3R_֘*QtLY(u:B΃OnuUO⺇eqh -h€z3D4à'P47[wwYRP׿83'vaYaYpNTXz3R)v 6l\13s静so!ԣ8/Xl5Mc[jOkEٷ޹~un,tJOyYyYOnQCۿC/hJ{4 { m8$8B!1VP^ˡ"'F@= ƢяbjzK ^GWcV'@9ӨCƑti>*4 @ELdvL4E!ۣѨo^rE6(PWmQi/{5Z}|B8ub9k; wD@nh36vs7cq$ ;ݩP0ia6g:iZnĠT#kN:K9_uz)%_+X!:>_b^[\P]`Gvd2/_j:@D֓[y׫9ܘר|?+ս?"noڨ(VLeʰݔУ0ڧ/}}0X AAZ*#>|WD$P=mv {.yj4ՏwօU7 <@*1мʨֲ> 3XƀT~\Wr7~wCd{ُ g_o_̫ _(D obp]f7@ngZ ouɲn\0rqȼ IZq>t6VX#UUk}{u0``rvڔ|v}_Vc}{q6Mpw@41ё(Q *X(s ]~_o}ĥT+C~dNxے:WR'J2V(*TG \(/T*i-_RUyxN Ƃdi9Z ZJ:BgHꦡ<1ꈐ6[ۄˢ#I{eYe hMw 2vܱq^WeZjEJvn,Sy@r[/[ \=@) X9oѩBU"ǩkYV۷yiM [pe[yW ^4V]!b V94O@,` fp~ES Rdf?'2}Vo c@Z=\ViUonxц@l|g];efQ ls9s1` 7*_BI~aPz{rI}ZMH5j}8XH(3EjTv @⛛=oDDG=n6[jQ53-f:?lѺx@)9C1v.e,#8r6ڵs^E Zj0t?5sjc)zg?MLhWJ$jI0q<}Nwrb2;|$o8IJęR3۴DT 1f^@<(JfZVVR4t?p:GF8J~:lNK%>OX Yxp=\v#^xU|XRP_;tyE,#DӴB*tø)~8R%v !ZU(&M %qCz{d%6#L||L ~.ɢ$-Xbh--Zh@ as @ Q h!@ 0 MV @ " @ k"%+@ #"& @ &@ &@ nV4n}i8lMn_8gL@@ nMŬx{OoLYS&D'.CRSa,g'zɄ5nx憣n7; ]zEGp=`;g^A&|TZ *j][V摇+ko卿jO1D.p{7νZO\y;rEy AyeƆYw4U;Xꟼ2o-˂an-?q"hy7fO}&nœniȘ[t _˓; 7?oG^r~V|NsK;BR'|+:I2lb˾F)@ |4rO=42`dW03S5%SUWYׅ IDATITg;dE6qyؘ%۶VEJctb,OONj%ݞcԆi m}8n׫قbNH U9vFo#uy[m<@Y{A&OzÇ!"My}eKO< CTZMt_* MΦ7v]r%nps hY" [i,\"79J;k9p1yxhAІ̥kVLPf-`5etH_z%鯽X暞5#>kz<4d "w'O;( ӲU>m{Vfֿ5H25l=k;_[ 9[xĞC;E6}ӷ#M2vwYy-8v<=:Jmi9YQQ0=" }TJlk !M*N$%Hzӊ0‰-" a({r,dm6G(8.3{ڻ3.,KZٸ=[|EK'}y3;C EfMOW^) 8fO[TT ̌OУF u|RbtAg6 ?a{=۝mz,Zlٞ"GgY[uŒ)aP1SҪ楣߭IML

# ҽcM2JAMDGRuC;@6o/cLӻո@8-X("֓mS9+ݵg,c^Q;6dWERu~M7Gu%er4ScIoĆu4hMЦO|K.`c#JA4Q ߈FFa-$&6{ђ-+.2)¸4|wlow^ :H_4/mTl32 G4(Hv |\cW>8!@]&3{eDcDj**i('SSR@ӣ} 3Q%9AybD?*)Ϸz1`v<ۗY@!Q}:ToKaO}5mVLE@ϥ.^<ƻ5@SYĄ?z̑#L*@pFD5͂kwJ+{v|T']8Xs`C m".uۙYU-C F+Z@lʚZ M)3*cSC7wUFښV@[ӈJ 7CD8|_ja₂lL bb#&:=?O)L_+.#S\4h nU{֏}<~GksCEuP]Uؐ{D&"@ C@Kͧwgk2ۣ¢86lݷd0EQvt|V'3q6'v?&*)_.gBət7kʛʔ*>%Sr*mAjW\H7q" u iV/J)Wi0~OեjΌ4]9)#`|y=q*<6U5z,Ht%B7 Dxl 箭iښ6HQ@gpώ'uu=1Y~|ǁm2,CM$*ܵoF2r<.7$T\cB|gQ3U~-K q}3xȖTMsy=bf[pV|5SYٱvwpe3x0f~F!:Dlc}pvFa06AdCF]@ vA]!B4o@Z[tW~-,wnz|}3x saFͰ:[jk,lb9R+%-aٳӭBmBǓ> 0&X4uί.^ZR#ݸEvw4t|'δ>έj2F=~u-?]/Rcqpӎt\ܕ߻dmoaە.@-d6/ɕj]~u6塅n%uutܼ6Ȅ)u s!bwy~uha_73Y ި\|am\i"HC"u|u{uVѪu-h{Ǻ7!֊˗ݞMNQpL]f^qPm6?RGAGXנ}3h}Z~N8֏ d䶲  g{,sKŵ/mG+Gw4xa4d [>ڔB;p!@ |4v\:qjꆹ..Up7+WZyO .sٖ:z=ﷺW;/ b˱wjZlUC{vӪEwm[&8\cn [ϖm:s*!hrQ+ז6:4?q`fUf+iI['E"J JU}·⚼=NIqlXottUEL[z"}.K[ZI-w_zކ\_ћG.u/gRm%؆5yj֍,&g٫5r}Poؐ3\jm*Zՙc!|~BUadւykT 9k}pl [1u95{er̕ʾβUiSmWGyKB'!/ߠdnaB5_΁+y@ FZ|%Ŵ{緊=aP@ +?ɳĖkQVQ3$Rf#)sg5ץ9`7]'_˄nŰ=F5F02EV((RVnY?ä67쳳Md@  4@ M @ L1@ @4@ @4@ @4@ @4@ @4@ !& pAaZ/O%Ir8]cDbh@ Q`45ju[GKr + f0_C-@ ?goGgF!psA4@ ^Kp04 ,\ "&>j#r/nr_7w1#@ z!:(T@318nWH\D#.[ FgNOK |---uu KUQzjr[KLyk *,KNiϗ7d hv$9cZvdJ D F\67h >7ͺ5m3[> dJSvJ5M1U:aVi)5-QdBQ 8e^D,7`4LKXULIIIII),,<|xUx䵏_zϖ\SvQELRs7o]`vע1kٚe3#4`o=[kFR[7:q{{;5]-Jh]Nǰy\uq@HU,y L<|ƻr'DgN-:R5{]2Ƥ:ln[[[jMFFƢ f͚ew8Ν;7a9sOO`HX~ #(=́18VLwL'_!mBzFA)34Ǜ,[::".GNo1@ 90 (=WA3eRANuoLHd(|g]b<9Qj_{D>d>6q˲A17gΜn[oJ >.M-^M&\s4{fsMQ|aERR4xc_{=n`> Iݹq#q@'*=ψS"]Pߩj?Tgٴ<#ҨSqHp_ :#=>\+>wMdtߊ0 K')XJ]uEG)]߭ RҊvtnzHTtM*&ɲx}7NOKϏ}ޭ((onn2%|4ei휸84W<_됕95kan~Djٞ"GgY[xHVF6)uœ|3A}joݠ䕃x=q8h1)ȆxBxm$`mG-za_`ŧ%H;]"O:19ﮬh3RxZ1;*$&fև)DˇTzs8I*mԼ;W_;݅AZ=+:-Zm0&fBeX)J$^yզ'H"[4$䬽G|qoi}aƚ0wjMXQY C|{M#- 3xVgO#ys(S>p{>exTxGQi5K ٽrR7޽,=67Rɰ["vAmSOEpFyǟ;۫%5w90r٩}jz%qi%NW.oSR4Sc昔DaWeyZ(NzD>E;q鉭3StglXn䠒=G1l)qY'sq m8{fTKKKgG0+;{=m5tW~hdp˩w8!E!{/V'O5h$)N@km/4Dz {_x"ӱ7UU*&O*t}Y.!પj@  Rs)^pE"PTΖ%#Pļ^\<`]RN]uueҚO!%Qpi+KU[>=[N_|6#2AQ?whb\![.h>cN3I-s33b3ܖk{+FC(OQk5VUV܏4o$[j+1p)%޻M3>D 8_vM1QTcEUv @9dPNXkjJeku}1ևX(_@[8EnHw؝Έs=Mwn(8.ns8≢Yfmt[sssKKFNLHTTbcZZ[F4Mʤ)*)#s1w\K%hmr٤Y? gE?x8 UG w/SeS*La̎,?.MIU oSMn(AG۬ X&<2- IDATgvaU`hwm䮶9;M9TUx4RJ Y|c9<1MKWz"T&'(J*B` FJ h;ϯ`w*(LB8>!1;ua3ܑn f@Rbs= s=%hgF肅yٝmn WS0/_V!;cG)]#D)9%$p<n7 XEtZ-6V;.YkmmS:n˖~ }-4Rfoy:)pZ5NPw=wiρ~Bvąy krWxW_:\cgk'b>xJ1^.+87_o11mdq|mޞڰ]ewygQ2TWܳWCj.(hhJ_n@ELϠG|n0V*Ny|\["Mӣ`fUf+iI71D1v=z*E$Ъ]eV2񐟊8+ݜ;w$9)f|--mmz=z=Glۚ*8pWlʭnLg K=_ú|̔XZ),?r#Xٻ{ cMS"eckomii/oͧoa[,7%֨Qcjjm:eKs*2tyj+ :< 'q55s[ml[8;դF^;6MO1BTvw|1R}˧>=݁J}VI6)P<VA=d#tz֌YD/tmV秬nӨjcBȖE.~޺ |e; }麐e]~&0@u:8B T2aӡuFi]XxxXn>'>ZZho}Cf~fr??0=EI' )f7?bK!V x'Y.3o ݍzz}kh_:ޛ{ Ӡ#Bc~-77}q> vYRO=9:߿{qR:V#kC|9𞏟beN;4z||y?_XS㕓@R$UԅIxN ^):w% &E)Q1_ȶ_;(=U $ub!NUbeY.p f똓k4{l9u__"$ĨT՞8Q[ٻ8{پ+ʪn[  @n}~&poB c\H{_mSɶlK"Kz<^̞93g."QyD s+]þ>~:cg{]Y!~ aopju~" `L!4fYab֔f* }=\,ĵ3~0i LF{ߔ^ެq_T,ڭ@!PZ4M9{=F?Yv賧d%P[^zvɄdsǭ33&_G-n(EĹ'©K:9|?oJ6oNjdZ;^e̛[v07fx2doqb1s<z̙.+Cw=UES 88kJ{{;t:D5qJZڅ ,꭯Tx!_Suk|M]Z"v_!4y`哒EPЋY-0"PXkƮ5vlFiϔUUǥ{5bەW2k#uRA/|h듯3 tg*kZoBgέ9ౙޖ11 &ҔvƆƘз6:woOMKKiv[VV ˖ r?&G2 k.1q98;s9.QR{lX߷dcQbwKNgZ9G͝QD􍥹YٵDsYX6@䧳_-6:B3RF!PQD%AJZk?\@@Z~R\w+-9O&~ʴ96~m[r"DM~ ӦΚomߖ [עOzhyɓulu:JNoЊ 8XhofCB6`tA:p)CSzL!d_%ӿ|wWC[:WeБZ_FI5㯣 bOH>ڢShb|k4M;۱zKxrv YzFCn6M<nK9^4,m M-ު>7EM]BB.LMK@] -fw`]D,ܟ_;׌+8,H81n긘 R nf6!f 2 U 7t?\  ¨2(P%Jվ~&PghBAw"$4ږ'&;}=uWDڳɹ+C%RlF!)aDL϶?JW[Nm7ҽx1.C}Y),pl׎s}pfs-F6߼9oy+enY\Rvl߹>,|nWq(' 9t8<|ٲU+WvHS]7R ޵{`+oFf[snx∈pj?xҍTۮ&IhYP`nMzF]c&7u:yF+X1-'qPI-N25jH/9o/*ҧ&bku^rxB]7@g僧QbE1`wo5p]u=3pz[hYgX$Vkv ڌ]n*e9+**v޽x>hccSU+W,!knЄ^V+@T[Vzj %\i[,˘ҳ!7R N*gK[6JJ i먲z֫r80y8W{ҙ$10QPB!tc1)czã.;+V=U;?h.1 /u_ )VI M\$*Ǎhh2VUU9!.0qHMtL TWUMC:zj5=ǁvN鉍pN;8~|{ | zǶ[vW !z8*%1PvV^Po8!rx!k2ݳQN3gnn)wd`+ޫh4MDOFLi84B!t[4<}0U-%,ˏk>PqQVZ8ɾZLB!tDߌu+#+ޜG?.n6.w@p`BwGuy<2,7)JC5"3B!Рio9tYRq,}'яQ|qVBJ-\IvqWS2j].B!]h?9o|_IYxx~~[ jƪDBwƁ!SurV_q0vx!D@B1ÿёŸB;hyYc-ʘq1>63 :"ʪ65B!0@ϛv>򣠟+ER=߿|zC+!B;ot?=Z[fz`i⹒fO}ߙ|ۇU|F!Bw^."d1o(8Y7ChWMcY->O= ^E?ڡ))44^]~(j _gC!*@_Oy_1*@j+I_dvQ8͇7r7&O[}煳δWש{g{ nb:S> )e^q~(~k&ȩ?ppUĭ{}t؜_H" :΅z9/. m В?vl58aW?bϭ.ҕk/=v9%E5UC[R?oWMnqh[%o)ke 7ZCK}(l_\+KbCPbJ9+Qߙ$gf~8|ҽߊ] NLVc-=-m?&-~|k>>ԜgΈS~<8?B-|W_G *Ѷ?7s}?bydDD/dzHd eh誁 je̙98^Z75S|~(H4k1~*fh :S" T2kCӴmIon&8"L4Dۋu4;4QaCFG^zT/ltB|&?/qJ{]5"N)盎nsokgʽ^ GPhJ)sY]8d~d(H$*KD* \SKRoVSL`Ŕ%zK ӹsty،',_8!O뭐P\XVU W,(Ʈ~~Y,c⽃u,(uI~J۲Y6jųRb\8ydIQKS^Rw[ɓ1u IDATwJ4gĘ_/9;e6eJ̟U+4g悔P,֖ZJ%c.1:T+&VyőQ>q܉q! ki;y( x!\Vf:U  %]D@Ñ|i$2bYcC Fp-݇J̔L.ıKۥ|nۚ=mɜsڌ ߑm>ӟxe:` Bu`'͟*sJ~lWCY ݽE^aZo)#N}]ye@PT_NJ#zƀ-z4bJ! C)%Ł@@`'Ebq,d^l{?_xs|cѾsA@.WW\. W*(0dgV^,(%}rM}dƚqsY:JfBx{E6%\]W/ ]J #o9uF$Hm狛rΞ1mjןYQf$Jq#}}EDʪ9IxT"&^4ccCjthyW@6dtZٌNFц'/\ɘY?:ZN e2򊉋 Qd*]n' rMXU?jYPw}cT\\N-9 fM M_''[/8,QC_>:߶}YuLcH*>g jxKcMK 6X󗪌N`sg]750=]g! cBR b q]G%6A KBaY' #@PSkUޅ#A ,qд@=\kPtEDէ`{^Y5`*:m)JI^1.v WC_R(REj< ^|#PK/R 8>j|2XFU(FŅKtѯ6(G+8f !\fFwg ܼ1-Kn^m^GwKb5)3eT.oࢣUQqAtusPt"FN4gju'|E\B[JkzEygvx䣿adJL>ɪ@{[E" cuO<6CG3~pkܟlWdm=%IEkwYϬ*j"~拍Xi_0.5: 2Vg ?6 S3Q-Ҕ/{ejrrookZj֯;8iJJĜ}޶iMg,UFф)-E =mhRTdl)!FCdf0o+#J*Rk:!pNႝE b3UNndp@yS@Vḋc.MB߳%IW~4klHSwWLpokB"ZK}{@Oi) CZu0DZT)iNR$S}aF@QX$xǦi_׽o8@ƧP[ΜwSg jT̎IBŤn^T:>>eC%@f X/ZTP`UNJ/K$RL7D'$\[SK%rOOaˬ0  E[4)@wv"GmI=GM l]AGM5:+:B>UYg2J R$q1:9[[6Z.zykߌoȳkf&K@.q1_]'evy@GlK- n!¦\;4UKgK?inWV379`Ϲ*$xsǁջSqhEmu&NjI28C*҂1$JK[yq{5\W/5Ib>0=Fi?t5zDs<EQt)\y0 Kc#:2K;.wk#2@W7\󱯾OI<6>8~ʲؤX`jKoKW^ֲ2?,,z\x{S[0V.U!VKEw Ut:/U=vv.> `g[KoGEGGgfg7lغǷ _vWۓojR45rrR_ #l=zso+zΛ/X {s{ i:/N!.@seT_{NtyuG,M9~jHVb@G$F+( v=bkmb YOGK%93JᣑQ t*ߩnBGK+%0^W~6>%QH]gR7c6pE6|S)"7ۭN*UHSy{uu∱cjoukJUV=4;>!t8F)&iZ ׫޷T{!ZMR)ù<7o.xSr6_AvVP&s[6;Z1RAG!,$($$D&UWW7B!4,4PEXRBWMn~e緧 I@h/:1>?)l6f/v~Z۬$L4';"sQzx)Oʟ6'jc/Nw8y\4hC!*F(SNTRf0Q2&9 XthRh:~_Yr1UrM頴(XnJ+o6Q]JI3|Gٽۣf*̹6괥qb>|[wltVkYcJ9o7Z=L?su'-Xr3 UssfFkUJⱛ F\U8kfjlRx솖NWW_ Kce}`[yc5]0zRV$ahpjS[%Z[z_kJ3.C#OS졌P5wB‹rYZF]R7p M+"XJ8RoˊQwZ+K]?ƲB64<(,!X8?n\uV_;$g$¦8ZB"cR^;Q=MZcs$G\R߁31+_*sm~!(E-ډ-PK7[MR&.ol-t -uc;"dtj8t_8fB1kFG^5B!^o-дG?CU7?{(eZ)I4)]{tݾ{/]D@0V6LJ+g B!޺21IWo9z'>NCuT GdK_qٝwoQJ[mDyM%}jgb~F![ 4Rح6X8K|N'o`vK:s3q"Bh8h.^`CDZVflCh2P*vO+|دԳc44^]&F!4^[-YBધt=y0/^GhӳLomm mhhp8#n{$/˹/2sv71BQ8玍-2Q8D^a> 1 cmkl;L ",, =$nKF!0@#JBY<%W^( EdddII !$(Zb4¹.q(|B6MҐYN\QHTTUr b֥0)%(⶷(zW2Q2 ܛ31E# ӹsloť#h$J>\]Gޜώ|vPU+pPYkH{K᯿)1Q%V R 6+1`S 3 o;Oy&<^+8Ѷz!n9VB ӉDT[%]kzK5r |د, +||+R{%~.e`6]pʙfjq*ν|FDI5`ϸc _ ()]x@u9Gw67 MH5n' Ͼq=UiRΩiѕĉd#J(mRۏhp= (m.{ğ؅;.B[*@hV &}xq#K:ܤPJB Y~-ǪNΟqQ|.`ꁫ.)č 1L>P p֚j@iGjrOUZz%8[s`}' `P$״ZoC!t-}O"sWSz9Iҕk/=v9%E5Uø%A)i鲣m8FI}BeƺmQF  x0NRR՞L⡔BV~ιƂɊTc,;9Kb-&[3JqVkv-Sf6_ٕxXkni3B۠ËxO~ugcķf S('LM=S,B]ӹeK/}zsynyT)"u5ʎegD'KTš4B زPp>?yl-M)cΝ?8.,~ T+sjbi(k0M;t]8hz d ȥ3N2F>))SOϓR$=b?+[ %\}GCD[p$490fK5]_z8PP 6vL‚-Iop\޷vY-ٟoS>o- #_Дyfӿ$-X!70U懱{\qXN(+/}G 8n/ׄ^&@Ȕ7EH Hx)뇯ϴЉsMJHx{g-RM;R|q.:z{F0s~ lW@I PKTAQaRcIP~Wܛek= zLe#[뭠PC8m6긴y<6|Wl# fxRrr, qK;E!<<=P'4~‡V>:Ӏj!B#1@sK[?8TUO ` sVpcԧ&Bb-P r5Էښ^-6%Ȝq뉖u hڸt 5ͬS+jNNvt]sINi4&^aB!441ǫ~?vC<vH@;c SqqMyy*|Nn^Q}%}$ښK5m$ONm0\1 }EдKEht{aQ!}l ~h (,t?ΫKJ1 >{ˇ'L)svl_(jCQBQ8K}ur]fB!493g㟷Mzr7G >_d JN2JӜ_~9ò#[?hO%6VZ3QG^( CkCkGtقLvwGBv?EдX*B9YeO=~Oj%Κ:&PTsron+ @ib'&i?"!)VmA1Iq֒3e™)G=Jq\?! gVс !D#7x{ꪮB{~n~%%IJ4eB;mRr]tBL9jBaŢ-\soR^UNKaj݀F!:8 B'M&G-ƪ@!0@#$V(e %V+`%B.#mBrFN ?_s?>1U(F!( X{g}EJA!0@BQ/L:}Qj( BOQ hQQ6 !Bh@W7$ϗv02|LBgyL IDATzc!@@x,WR`"nu F%x+%bg C XK`ypJ_'Є/i{s B g?ŁSBI>5ZYlE_EQt:5-?AhEWnV=bT?;>&YSE~a])4A5B@[N-3m2@%t*E2-_7&,Ve 1:#,=aztHkph{1$1k^3A~Q8 u^#ĭ{}t؜_H" :΅z93;~nqjܗYӗ8d.R!0@_"JfWJ =j6J4Lplcf{0.{V7P%M^=]V|֍ [k5:ݲdRw'n%GZn(6?J DoE:eh7qX;[~LZg||9_ϜOx/J$5>V=sGSmBESƏ9r{m8E ZNV~]МoUO,49óv&ހ{$Y훾8{1iȚts l90@rp/Ji'D*ϗNJ 'kkD:R7ݰ\ [R8VHnڽkK z͇*叭Q$%N:$6AVs#9KAXGKfnɊGhxxY\&lL"t|Cmjvb B! b"B}~]G H.o+bƝ;GcϽx_cMc.s2]{~墀o?~({1K8NB\F6 ?? ,Z// |Qw+F=kAV9\O&-D0DErH zV{a =]]8хͼP=ii\*'AiU|b\w)U`ܐ~MW n A "?>)OF.sɈ(rqZ?-LJ;CuYǻZK3\k{u~JVm| zLI\}G"{_w@?3RmwSIHmɮyUY&%Ȳ] Z,g{v觧5%Uqi\LM!}F aoκV}Mᆏ;qo(.Hii k~X0+%@%ɼ]ɗ8].@\. W*'I1ϋzvO!ĚqsY>˟[mܟp::)P ~mJ4f_vX%RoAIRBHpUO[[[~FR)Jh1M"ݱP>/[p+뻃/R(REjMN. w:3Z,fp" SĚu\sz#pŅQq]JiY=bkkvN fjGclip?F!tZE8fGt7諊a,jTQwG$|gGCZ8-Λ*~ǭAƆ4|gmb/guƌ>x DVḋiKーb Msoj9J$E2^O(aD ňE"uE UihB @ߒ1XhrXGdI[ќ'=4Zb*tx_tg:`zkv[[^$Z9ɪ'ox b+8=n]»Ksϖ~8m*gnrs<@ݩ=ǁvp~.xۥ,g=m^hBf̞{ì# t0FI`ltdqqu^.zQaЮ׉?5UODfwʣυeߞ2!-}B?6|f??\zA!tX!B ܏ Gܨ1ŅKW9q϶op?.!~$-qďJg1Y762~ު5ӂB! #"=!11[<8!)GvC[P/#BaH{`/lF!KQ8* + qC"B! rU|N[!/ޏRM;R|q.:zSysR#&*@zY7 w{ W+|S>c]pz^f;s}2hވNÜO] ;NУ=yW[O.,KbLy[m[QSQW.ʌE>43zd_Yڌ+[z!eo{KzYLDw*(siu`Ĭ87EKVX;{ϧ0y9:׆0F%}VQN^k{;r=[+%uvi&_C 񿾇SácKg:SY89Ŏw򙅴`=4p^gLYb[8+m}9E" v+>x: }x!"p]: K-I< Q. @ʐqyY"jlh hvi{56w]\HҺk[z;{_wU3Mg{SK"hOKcyM[&UI7'}wvu]Āf yѳhlnK;cSnN}ф96?>C&hbzU&dvUG"gRxi!QC(ekO7cho|! Q802=䓈x"3R-8U:{7FIt4u$M!=ϺJRUd 6jSRd8ʉ74Xd2 |tz:d=M*LKӐ5g1sJZe^:W""!=]hnJW#^O zFnN",Ye=(EFnk%rq&fQ xK$+ϟƜ= 1P0@|;LLK%6'xt礚$Njhrc0']"N@@_.˽(Tw6t_YY\PiGh1 l~mG(!ܲ #:$K$瞑%3F2:*^#8BhQidI-2KDTKG-?aOeT>;o<{ Zr'»DDUyXAJ&-G^Yv()9Y(gb'+KZXcV3e;*C#jZEvna_7:z@2LkQ۝i}wAۧL@l0P 9Ij[}{tʈmVGOXzbApu7)l쥍A e+0^FD_Âa""66 r>=qmg1<.byvo0Sقm0nȢ:s ߻TۏWP[u%:竮=o3vA$qSOּ>Gz'&տ?[_6nnܪ3{۫-+wPG1I}ʗg' ^T}5L8j|SvnROv6pX6V У?e*+MɉjL_Y4M|Zb|ڬ;oxwՄp"@_~;].o~÷c=ZHYW'sO靛/GLxڎmݸ΃1W)@\@+ `ȏjj%WjnWo0_:2Ӽ }4_sSxnm @({yq sr[326t.*]6{3EE4 sBAt4DoXuڼl4_ZC#7>>-}vLW(κӝDD0&c s?.++};xfLC-m(t=**_"cwɤbO/"ﮌnt =E~RfW61NIgyKMT5}2,iWaP'eNIt՟Yrun)5h:KXtSK}|KMG @bh TFٽ͘6D3O1Q! VHbC< jÏ59O-ph"aI%%9v\NZjTu/jg}ߨ+?S卾[!?WoLO#Pqb gAeYK#b*s w$ysāq,9f.œlvvu8VнjՂLg߁3p®6ſ⻞/>i ?}wܑWԾ893/[2-7Ť4U|wW&}5K&e$*+{E+Z\W31`o9nM%fnvg?~@=ѿZiֈ۾  Kw\;F-)Q93N(!M(4Uw (,iA;X_vRfK7+}a!Ypt9tS-Uqѧٹ}}%,~eޏ~{qԔ]\!0A@ɹ9jm:kT%텞=z|ߩtpIfFl ;K|}B/~ЩM+,LxK4JSfĬx׾"!kE=A''S6em+X| #Bm?>[x8l@ņ Kx0k"7)c#968P(33s s|1Ꟗp:WRNRtqPr]W&}J%_MDُ5_dGCYgsݪ#]>%bGC{[w[P5'q ."[2@{ 12߼{zF~N¹MJPT`J%՛D j$uP;;i(Y)+=fwdeeddht/{OxwZ屚7{,]]AFKrtP<1dQfk;Z/tI!L#QbcD8ʕ}#JW>je@AgR`v\܉3gϾ9+?xuK=9X{2{rAnں6o3x_^غ;տ5BDbT$Vs!;,&%Q:vQWh_*R5x8Iw!3vC9 ?ztGGP;NDu5|GxV#H@8!P(?saJ%Oun-};F_zU4Mu*{sqOe3,⣍:6;O?% *  ܐSZd/6ԙsswG]m64g!1iޢpl|d?և|]™y0Cfp\}y\rߞWҏ"¿3ۜ3TUiz)bcgٱ]hQy&wێ7_,]2}sBh?u9?s6o: `Wkp&ܼ+\E4VihJqE#ab#$ :6!{9>f]m0M|uk>tU遃b0wáh D$hcJ5`ȟkֻҠK&c3m]2S;K218S`\jg,A|r[zFLrus '&pƢ=- 08@Kއޚ O;x߾~xyy!"poMwQf荌|%GAtv]8:WsfWZ ZGK4 zsUb Sm¡J~Ţ))F%R<<ٲ<{ãjܔ -#b*y.SҊғ jcBr}0uB1 fo Dt-so4֮̋ix_nˊ5?|lX+ėY@^;4 m4;vԟK\0˸ ?erYv^GH"mY&uqޜ鴙疈v iS' gkh Tn+DQT j ڠWF7WV-mLt^Q,·p{BH#qbxxp7ĒHaL)̏ 6{J(-OWuD:z/:rp9AV2KpV}δۦu75;]27n>qnYLV57'j""m,do9̘Wlɴ:T ^TSY0!3N-\O'7>w-.Nի!E\K&e_w/_*߹${>oosgZ|vqIi9gjHotrU@ _X:IV='T sK٥O/;_v˝\~vXLE -44N&9K+,LxK4JS&:k1OP֦N]uΗ88l?J'|RI=ݢ.s%=A''Rf,z#>f,_yߺ W1!rp󟫝.>68#QIʉw۸-"f.YtaCe>0WikWHR:w)Yӧ$F>|z\ -6Ψ|GL|l%CZz̜U'S!"V4wu}_MyGe"R̛>;.R`DDLS¨wHM_0ά4G`1΍V¨TmDlQ|n=֡7ťVu`"6/bSK|&"҅M2g滏nzOBz&lT R]>oBVb kW*^W'dA#@z=#?3UѪskOwPgSW9z+^F}{ %+mk#"⃌ ԁhnPaZ!7*#\p-}~JBlAGBY .Oͯhl[o>wٳo|^RI}hqfũjrl16F3p/#\e "tr]reljs;,>;'I1 Ii)B:m6K{>҉Q4ZͅUl/IIԺs9QWmvyڬH3̆-}NAjĶmIydGwwD{~t9y)vbU|-ssP0V.7,7Ŕ pR:f]z6@V|[!<3R ?g뻚;{|ReCNr?l{ |Oe+1DZNߊd٩|=',Q`7.kd~ZEIj?T7^;P7{*amw g 6; 3pރO.AywE3,ħi򳣹.~G;\!2&g+>[u냻*ˋ3CtC#qExUn)-MU.enZcIdՅsk4 3`65yrkkvS}4K L}By0)|fA͢Www*Q7.[:crX?p6o: ??UwͷR}Gpw$MNQD%K(]ߩip>\/OJ pFPk> [Wl!fRk('E8g@}qK~tw6;.p )½RV`40@sgCۋm]EiWD*R QIP*4# t' u!1;eyIL ZTi?`={HSd%g 0֍z #D `d?1Q{QtWoF*'bDJ!AȻeQD*y(/qH` g@3 C6s}֜Y]Gw/^9NcGD"j6EaA|3Cr-w6J{E[O k:SU}my%1-PG8`>/)]^xg[kFtP7]F*D#>=kX̉CC\AxhQOI~vۄ˸dPlxq;vd\Y4/(cRth4y/B&S"H>cyR 0$Cpg@ϏpI0r "LqCS>Y/hQ@@6ٹyWh$hєpFɤN1h4zk'Ǟ|x̘CA'f; %+3`rj~di JKn][z_\~7mWE-]QjY"R7 M0L^?~*^)X\,O\0[{ӥ2n↜$:sUiQ(bv|Xs#_p̌jW ռ~[yB='_h0}r^FAz;g䬬D@RjRS@(}|!ZvN4ݢF!1F/umqyY}CuRvyrJ2|ukciͽ9VWW |d\5KLE]ٯ\TQ`ZqHRd"Y~sxHd,V)OD ')#y[Qz**+ =u4Dȇ9 K#cUjy &:RU>&gNZZZ£:L)IJwU7wD`(3]uIEL ^.R:Ty;u ʤZ/5R'?R38!~<9=jsKsG(ӛ. ML#˗hޔܷJb4냑 ,تʩ.eA9U&mRz:'d GN"b,G)dU<7W95Z!Uwk)yX Jbt|9SGN|ZML0)&j2f%ۏ~ee<#n=͜nl:yP>enFAΛǩJ6 :;zuF1h j3W rURpzwibT3/US󦪸c}'"!.)i/Ĝ˫;5^LD$Č`w{M0(RĨl)+2JQQV޴}utX!"r#̋=2Ҏ65+[g8?%Do)yKwӋ48}!.;\RQ F5.>lu/j. ^WVW2NOH1!Aߐ%9n98(^>ֹ) "6.o[3RULxZVG}ݹBDQ =G ]JQnFTPDS;֞ $mRmpu|K*%?>y6zTƗbEʧ~;5rU+ס=3P+d)pVek{sKn=K$_ݡA Cm:5srLP`{%8Ԇ"^) >OTTHڀW$#~UwV8SH@ BkNKbϻMdM/UXgzƄk{y*M,^zxn\~c9n瘝O?y…w:Tz~0`87sjna?|o׀t)_Fh@(F'e$tjχ.[ z:{—.hр7 +Lc0(K)M( ʛh 4wh+h V[FR @@@@@hhhw"'e$tjω1)YfJ Z{2 (umqyY}䐽9(1Mb^qV;`x4 D$޷L=Aɑ@@T*  0ƛs44\Ә2ΖnF@ @%ҳڔk7[06y~VtTؾL z-('/͝4A2ڮ31]]GH4B&(_ӾE=ϷDv0`P<"X-aFRu&4]jղ1m͞G~^޶+NgY|G߾p fŚb-S/`1E臿z3ov^'O9=]d|W/Yc6g#MS;ZM9ZFBgYuh4qnzxbccC*ou;ՓTW C\RJ-@*7*4[so3ANdmꖦ d T<\́Ixa=.#t\TR69NE= kگE}bEOx7=ܿ߾~xȱ\x.?PT!eTdp7{ w: c->2$䗙+jNv 쁮X8f GSǛud<6W"Bh1"DRpOs}wHOQ2(귷{F~nWmjibzL;qsϬs<`wKk;uGIj9j?+ܺz;InGscvu3p 5Ij*x6Դ\J($E8%,X W1&4%ܸ^7g_ܪ*_.] 5ϝʖNԒofo?oi& >0Rr7i =Mu6p`p @ @ @ @;~g:3G5cYѨ^bR%fn֊U*>jdDƤ&>==UZƤ-&E *umqyYC )P:w=|ǟ7K({_>Ã߼7/H[wքzxQ.UOj=bd:T2e+K3Ȟ#ʼnH{Oi\nS_^|6Ϛk+4ϿUw[TdM U\HO*/J4*EWñO!+ W}&erA'ulC]⠅liVz4AX[񎗉DJ|Y.SsYdG]AƉ*\⌳n/n&'y $~Kˈ-\i OHTc/LJr[[rg|ufJ70j(>ٞTIt9])xa{ j.r:Nyu1E<E9|KnjS>rF\!Im-ť);ڻ8|nX<FD.ɩ*G'VyRY|4}cgLBǙVNr_޴n\,;񇧬1ojHH/o[T}GlI/;u[ "0Հ1bb'd2$drs9̽gIf2}q8NlHl'^c0f7`kV]]U B $@~T]]z<*]-"JjL˿-)#)f%,O^<^7ß\{?M%!'4W45X㗿lz}ꙧl矖EE k4r_5ޮ>`9/d ZndmѤ3ifKvԐF^MJL b1)9)VH ӭD[IY_(&jG5/}fF-j36m5$٬H\x4_^0QLOo3,ZPb8{RRJd {Šܞ6&& :h`tQ=YF=!Z0ȮbQIbZ"DZ[jB&jSaK(IMR%r0}s2cя+ UsELUQ ?r{ߘKgCOFEĊwUu}|jeRM!7y^sհ1c{nG{o0D.mX(%سP V-t-#x8H2NSfvi Zz6LCQH?u,%fyk3|a<#UQoq޾t)^{O+}qk> Jbu t hczNg ծIlUG|ioޓF3 ST&O<)?$(b+z-Q^3wzKI^w[M9i4""J;&hjS鹿x j"l72^E˫JTD4]m]")㳩愐vGRSW\v ?݇>~hJ$*axgn嚃/"gJ[}* K[;K9J<ɪeCΐ Ҳ: Q&zDk?vER:Tu;:6˚q3'ζ<8gIɭU+g]Rҗ=ŕ|?*Ϛ)JC%"p9)jE=ힰ`qܥ_kaSŪZ&Jj+[srbw%6ewTD$m*1K6aE1;gGvZ4NMj8MHN^x W9Sg݂57j91̈~9ˡw(V\ d<#dVƄJHpHb[k+5qImڽ&C^c 4r MqgO*plMOVm YmgcK`Feof|#2 H[;5wpg1⡶ eWEDTgJG0;S8>)INMʳa{RnQG̨) hݬp˗EZ*[pLhhh4@@4@@4@@      hhh@@4@@4@@4      hhh4@@4@@4@@      hhh@@4@@4@@4      hhh4@@4@@4@@      hhh@@4@@4@@4      hhh4@@4@@4@@      hhh@@4@@4@@4      hhh4@@4@@4@@      hhh@@4@@4@@4     $6y?ںTv4pEQ S8  BZd\t͑Z0er,2<͑=m'M0PDD]OO髖xH[oK.+ }RRf/f:n蕻f̛?D| 0jx'zt٩^OכwܢM+H[~Z(&Qs?'"F՛:zol!")+WID@pE=,>o7n8FRUU "' o_Kͫ$u%WT|P'UeEAS4 %RSJ@@¢܄쎔F):=Ecx /u _Y^g\xﲅmv7[݅% ,W<&1Pq|G(螲dNBm:gc궽Yweɲ7$pvSUUÖX]w1?w6v׿8~܁8C ` if-~`l.p:h]šy~+{ Wo:IDdK#1 1dS80聊 %F4&;sSu`_r]\QnkE%W5Mib82!fKdաS{q M^|#Mal:skyWreMo҇g]ïUcgݳ_DѬ榖v #N0-_xw"Ɩ'VԉEY*"i>Z7}ͽ VfHMMRݕRK˂Hm_zD UQZgHUS4O5%`U7nEDSy7E^寇'^ңzqMw:?-ם\u! =Ϝ=~ƒ9xw7&>i_M靍g &[Y2i{_ghss˅hV3.4bYރc4u׳<[q]ӳ2,o:ou@_BMvV=^ҕQ%|њveUVV4e3nf6®v@ $i nE,X +N"KMת{&M:%kRoĮ=,"bC"͍3 mD+;,QD'彺/aFx(WE^-Mk>i>@+"sB|bViKv Ӑx+ /IESgl} Hg`>XiܑŞ3qQ=w-;fKDgζXwkt6|yw8>8mLzo 97}ZTckM(&sgM[xܜOm1qXlԾ^G:Qwg^;&-`YdjegRVKE1N 5ʅ/nC'-(NK:xj+Juщ?Gz-;2E)v`toF[0]-z,jw82;#7d4ƼgQOe $6Ћo>q9n9?r `tPa54W$}fh`d0hhh`$9EmhPm / /g>J/[TvipKյ8!z h;;3Yň(~;V_XV3zK }篕hg+QIJc0s;2 hxi|0 h7o'eg} m=vglVz%/ miv蹞z9E$YǮA6t<&񨕔/|wC[D}[(+ 09 'lIGXyXnhmƒN'oUuvɥ_J~9SZCesY.6K|nO^mKJ/sH.tC+Ѡ}iOY 7wwJٕVs=<{dW@W~3sz}u}D z<3Y[<6ëړ{l)'܌pm^Em7>mfF9 Y;{ϫбU_E;"myvD>\.rOt"fOOv79s47ō?4oX'LKMCİ]OCes :+{ge{`Ov?Tt:ii}iwDc^?}|,_AM]ϜiF$hJfg{bgEDLkpcP("_~p/i[26m>7DD\V=L>N"O}cAh2EIY'o%pڕ&dzxRO,}L5gOMtٌP˹[^[VS^jf~MWڬ~~~vʀ[&L}փ׳mW"w @61=3-UU?,\z׿uMS~?ۯ~ ӼXCo}/Gp9ݥ.~&o ߛ'KO䤢ŏ?\΋?>o,}j{X]N\ zw4/ ~We4H}=bR~aJû=w6p9ͻ`|˵m/c=s)&vxԬŏ?:kǦ'LYȣ>TYޚ-Re&Y\Zm%L n}e-9Ae5Fs6f$,_sVmuIƣ݃kl3[;.6i-NHD_O~b 3ߔȁLހ"- Ze` $7cvF˚"j;ZD$x\}!7rw697S͙9'iOY"~F аЖuZ8.}-.Psgά`jHL׉@WoN?2dZ~4tGFvDG{[5.WƶhH4`+}벱%{Wľqqf,wfHK{G,v'@)c\˖)CU4_`0 o@nUD̮EvwHԄDCa%!k+zk]" ^S)þ'! jRrb5` tqy֭eeeO<{¡x\A51)!PXBRb–a7*weUҝwLϸΒ3tcھ_ >Dیb흖XC=L 6U&iNo0\R@I:kqOEC3ǣ&\rZ#PD ]^rS"!5qXq+//>rU% vU]: _Dĝ4-~ P$Xţ;3gyr#v}ѝdyȷ9o:6bds;tI\ބݓ7iŅaev?5wvm(dg%("qwn9M67"Vcus˺NI""fSKV4o?pKyU{e?ciON{O[;?VSݩ9FcGZw-N&߷( W@'s;V9뱸;3'^׮9Dq.}=q;oml~5שk}vp` 6 ȩ;+/ P#apڌGm]D7Z{Ђ_Sg?k{[L|y'eO}yÊ|MeW->uZop<.">ITMS?#W,Y؜:h:VټO.˫Ѷ_۸rJ֭/،p[{kLQǗ=4Z/Fp eɲ7!ϓo_~h mqD75YqՓ5j/֚/8Pݗo_Ǝ =\7z7/~z=O">0c>Jo9a};4.~Pw.w7,7 Y@81ɎZzpŘTFw Jn4@@㶞M'( } =w)Xw_0"p1?rS(hF<͕_؞bx ;g'Շ&: kW,Gf`Dg)G֙^xJ6|e?7.,R|̮Ϸ06H-PE?W#ߘ0 BgW@$oYiӧgw|~`Zq,% W3~2jbۯ^:ve[xD)j'ߓueUirpuR&/_{otg䮷:SS^jf~MW,ZC3&yKEDi'l2E>aϦΥ__*>VqMX73=η;f~Hз=%)0;s8LGX˚'/>ɨl;^+/É3xj3Ų?pq;/Y^\<05Eϗn69#%JZL{aC},"b+vjc;q7?pYBHϦwm†4-k8]ηo[Oܕнu@Gg ut#mI=SH0 j>:VcXN:-3;MUfΨ^Ys0zjϡSE鎔 W=(1=EQfLK;VS<rÛ֦N{  fVgurdo@? 𗞳P_ Ԕ+,Vkމv{bѨeD$zmE|뺟" .rK[Zon({ZbG=hiܻJvϞ9g Q$u< ߠ&p @@U\D-V­ꡮHW>2#?>sy}d C3ǣVl,ѝ3ā1HIHKu% ́hr.R^h7Kͦ g6.]s׸D7)3/ӫ;.+i-~rr:~cC'>_ׁʚ;1)9qCsJLcqwfN]@`To"9-~OENRgvC⑐>oz]]sƫrJ֭/،p[{k8k8BD8>>>;`s}h/}ө-|C+ CYl n"y/]ǍZ fpK6vF[9#^ X\ 5X=ګp4M@1e4z}E :F.!v;?G y>na@0qnfg]nEa 1˒p$Ԭ\[`tNViZ+87䔔䤜̚FB= @3ЊĩaaF͛xuBGЮóm緹jURb_pU O9_l;~_,m~=ݱ^+o3b @@R1wX53A5o}[/b3'Q9[8W3jܻ >߼_]=dd_qM1k<1)r'4rE9f;v y)Z}ƊZ82"+#MQ]?ĴŖ3ٞ?Ì2h򐊨"%H<(Uu dGf~*31N}S}[JוUVM IDAT+"e,߽9OZ[fxgU;OvCMr:ZMV03|/kx}y5>O+ }~f#?3cB6fwu\˿{X?=qI{kNDntXɉ aj*"a&'%mWNztɰNe#"3ԣ׼Kg+H՟0ԋwS"YͼKG#_oi*u5e]k G/˘19`eӶm."c="K3Ԛ3fuX-P=8uۡ{[}7oty_["J􇿸.·&Q5WyCe :>|:c j=y-Nv!99t:@4TZycG%HmΟ}v_dm{?QDxзaRtn}[1bmWB|e5 Uy=5y7Izq ;3_`Bw[~>Y<О%§Ui+P7G2v gYfv?a^ g s26& %%99312%7;k|8Ea 1˒p$Pxum={ 40,n)!=zꃚ1* {Ok|́hn`n}#] h`l#ߢ3Vjeh;k1֬ 0`Ͻʭu f^ZiKނqʄ30tbܬCAqKf7Ѿu" 47}ݴS xmqW%gOuU#o8 kLs_gIks+:Hw[NEP3WԺZ; g3]Sj\ڛ \o;d3.T<\^ִК1Fri;TV*\G︪-Oa+(7<,)Ӥh d9^$0D9aöXjM ~iu7풒[7?* /(WIDZz^8"jpYf5#~rO'UI~2Gf:ttĝ~2j^CjMܷ 3AKmQ*]87Z ~ C9d-(XO.]Za$[jb*CZDDb~&[Ϲ[|q:Z\Dldq,٠Qѧ]3.vfj !f͛{/+pLAv5%#Dt=fjwRK bL&qSmW!@ӫ6{|vJ_NM0wu2zY7:=1He"JGf5o @MNn7t'S&wBv,mDzvjzǢDtq1,4kى@TU$]2PL+:'"uXb!XH%i.T;E7o׉ѱiE=Wj39M'Evsu޵9,$p2ՕMf҉*kh9Hrdp2)sv\똜#±%[vމGD$=>-ęO\s 7cҒveqm} ou5T? ZiZ 145H]2u;tڜH7=]1LM s1IDD.FSpX8HRUDR,,'ϢlSDe ¢8Vy}]HMޑeݫKm#Wo6mejb47:fU>=#CGAI"r.u?=#Cvᜈ1vQ[r"b_.[zz&rlYk\\.FuϘ}՚Mo,SV[xo7Lk*@x2 3M9 vh9N6Jp@@w}cV b/TitXXoR9D}HDк[9!!V:,Zm'b^ w]T N ˢp("TrtkN/lѠ7f:ln$p!"h`f侴}bLiz^}YZ{KSxFKObK<&5Z[dL9]>UƲGh5}PSpF &Frhؾgb+U͵^Kd&҂-ts?F3il r4TzEčv̏ fZSS1[mHHH+$oY΋[Eq<5"2t @]rO[kʣtڷlgo$zd-d|WF1˥ˌ绶^7+3H&]NK{i}1O"wzLq-'[=2ATcT~m=R\)iq~leSs䙭BB~{G.sz/N<7 W/<|vLfD;U9# S0cDԑ+iN37'^{`hFS%qX*ҟzOuߌ p}}/-g?DDUy9p]86\oz.ʕm~r wey󹻟qiJ-?ѭ{߳e$aW',djHdao l 4'VqNlifmԑC1z&qSm]yP"pzf@8Ot59,}9X8Yj7o~b 9D#aEhjH$cXHbUf<4`c5 ٭jTD& SY8o`|pld-X20\Z&Nj$ s~K-ӧHmX0=y@ȉr>Ih6̳:bmr"") DUEb5+3 u`bloV.-t"Pl7W]joV7o׉ѱiEȳ:Յj_j?:ɉB.H,]\]YkWX:S%r ͕yS Nf!EynWkc$T]8dp""1q!z|58;;1Xhx8'75u7G8ث]%UY~P}OTq LM$FCAa(~s"Lf^e~h>[+ӡb!& -Jm$暜NÔ-Y]]="٩Z9Q(ˎNǎ4!~08XD*q]_ ¤{݆j3jbdy[Dbhpj8I\p@2E5RJڎlXH"\=\wE9iInPX$"4nL_R uM|]`ghaW-|&"$RnO^[԰]! ĕ'#/>0̄Z۰qe>U;EVWӺ'/[ Rxpj(bv6؁d*h\mDdXLmqwM4Nh탭N͉tSMG"R^3}Y.FSpX8HRUDR,٠TjZO?;EKkHT[`(,:jOp8,zQo.S)6{bv /MgZf"c#B?hBJkI-7ān[3( v0Z^4m- 3c15\];]NO)dVİvON8”p@C/#W1RxQP7>%ETPUDr}HSB3tʅUFhP,!V9^)"hՎfDRqhxlqN7ҍ}IИ67=nu=9y6'eNsNDl~GWGX.k.Ef IWk6TLYm]?'s yv8$JyZqi$ʊ]U{_ ehgw~}KZe[ơg26OtF.K^]CP*I1(wm""nL? ?P8D֪[mܮĞ1{qvۺUtgwոؘ>EGgHV+CDLq9gN9ږݓk5É|Ҷ1/;sv ˢp("Tr w=`.z -s Mehgo?P.xZe4wj/ԋscvrٌ:k۝N^y3׬W IDAT!oer47nkuaA-7=hc^li$UF_`zr_>qt~&sr4PJ/,sGn2{>S$vkkZntMTTgq HDLIѰ})ĨWOx%2i9FMG3N멩јЭ6uN$!UQPb ru\HpssN GOD~qcnmI%4(Ȃgu:G-v\MsnGB&YJKwl}IrisMy4YNY쭜fTsBR"|6ksfefɤ iqu4M_; *r-TgZ抖uʭg]?Ʋ9Vmaaq"Nɱ^xѴ/i{G>oY_ֹ@mm/m񚈩q^E@j׾yx.am7TEO i.aE&[Uj:4zu  jb4%֊ Z pXT?ݺ~;?1IyJ{ '{cM=_4ql܅]#IhمI?t0܄6H%YMoͿu-퉌ч?Fz;q1]T⣷ݾk}MSxyŕ0HIPi}g~>..\ڛ_>u X/|!cc<R ڲ#>(!la[Qi}zJ= שMScKL WJe7}K/D8f ʼn|ӷZ=t{Ͼb$MϿ; sw?/ ̷~q}ϻlÿ;pHd>ת-ʟHcԬ6{pPx3~qoЃ__RJF{òdg"Zp/w@,ȡk=Ԡ"L %fں D>pfr:n*hʍZ^2=e@G[9 O``daOyx޼eXΘFr遘"rlVkڙ.L4VVȬbdttlPj/Ѧ;>@ TD㪠ҙZԭSkEJY-LD/֌Mni툢PT1ˍ۰9&wBv,mDzWBhPH>%\/Z?}BD4X[^[X>=?₠|uj8ۛoi2-Hfef&do5WtND,1|nņC$G'ӱ,K=^]vMX o:GD(=_'"&F&Ep^I=pz47ՅzDrbK(=hWWj%`j4;NT\CseFRvKGg!SL*T$滎w+'*sC,1\ݮ.:&'!2rHplie[=[nz,Vc1Z)GC!a{,4SCѽҡRѻ R  P+ǂgn˶)I5I FT7 Hs 7cҒveY 12o[ph"| y]⑟95pw?zp₴z[Rou5{Ds[Ӵ'bhj, gev}9n u{8$b2 +W6b0'S57۝]|8,L_H$VPs" )l,d:-v}"b =nfNҚ+UE, NZySXG^iXX8\٨m=TѹOŎ|9z DDbnサ3?;9ypw.%BqozLۣ$@=X{`J8 ЁS雑+ˌ,):ͤ"3F NOy΂]m=힦S.2vGb ѐ'HYFÒR‰DS6"hՎfDͪݥce~wKeW4@AX?շpsNDK>vKVDPN| _ ;c?*팱g|:.z}Z3t(jAlŀ*:‘V*=r׶~>ZҚk|0 2mKHpյDk7y9S92V3Zhz~KaDUwz;46 zcVFj"fLOK'.$FnJeݗeTS^0ғ#,Ikc2{>SNkkZntMTmwlBfw_jʆ$vtāS#i11K'EH>^jZ^"3CߵtUa!m-Go}>r4MWn)X zˆi;.Hŏ"ȁ@Mbؙ'IG\{\]ep(ǁ Ɂ,wl:Ծ̂z}u~S&@\}>QPgDo^o > q~zLjk;$jh5Ne&{+]}r%h6B 4\-N|Kzͥ{^n|< 3 lf}纮 @D@X]PEp]tp4ok}RMћW*hou~򣟻uBw#7TL#^mL~2;nM桧ۡ]mhifr(0mKr)3l;pfr:n缓eR(17;xn(@ }v|/: =8O+frp'<ɑL<#5rcnxeX k_^1Z?}BD4B[^[/HvqƛoZ`oT6-5,"Lf^e~h>[+ӡbt]?Vlw,R-v,.ogm@4R\yFV:l~"ok5c]*;>SCѽҡҩozN\L& ¤{݆7[EB0;5[+'*cIؑ#_捜uZ`9SN Αؙ%s{cTVEщ]k '&v=vz5=mhs"Һ|`( 4M6̄Zqe>U;EkUkOi'JdY"Wu#?͈=t5{F|1Hh* 5_$vW:xL)ZUbhj, gU@24V6m"2`tO,6}ʼAlis"BSq>dߣ ;&@~K }"׎}jnewy>RNEY[866/jЏ=b!Fk;8=M|8 l:z7TJg_CL**">c fvO)VY[}Lۣ$9bJ8 ЁS+ˌur6*FG?yw2GTU!ƶ-^-/x.;@_Ԉ(0Jǐb.,K? >J٬(k ;J#N' :/ͅZ8H&ƱRTGX.k.YK9۵0F7^h-3'lSoR SnhXUKj@ E! bvd\}Q'"b?p߻k?)_\v]7߼A ="~'"zM׽A=tJ8"lqvpikM CdZf|g([U*j+wWn0ZiV*=r꿹\;kInb@]5.6_d/kOJrN2?'C*;M ~8DbC8E_zh0RV3{lT|嗷42FʔH${T8׬!oer4効*2MK 2v0aaL d{O۬w^ZELnkeb$NK|&FRռr]fa'GxYT~-}i笋8K8CF4o5Ww<_= DIpY 3\X\uNfVflj , չ<,L}۬j~(*2#5۵Ůgnqr(2DmL'׆+T֕&X=2PZbc+FM :g8٭^&؃?r >7"w|ӯ>;v(kͻp/J߁8n hua8/ؾ,ۡh||eg~F0vୃOXJh-͗![=|ksёM;k-=﹇Ax}gD#XbJ4zeY[ٵ㸯aNGg۶׆{嗯Rzs;r|pf(ڟ#-85Kga (zz{[ k|%T҉zqa |:w9^qdIy",;-,Ѯ[NBD/Jo4VQ۝] ssnV]T:f8Ǎ=ljh~qZdyw8?#.b:;scȷ4ZNmP9T6~NVh\ZD]cvv>'>^̳=gq=r47|kj}kQ4}zNDKb<AD†kđ=xC?}K oo4[-"z{>sHϰ]ͦ鬢--//-9k^olͿ^*rg,w*Ќ n ɲ6X@4FDn01X&"EV%l_2?ϼq~_ ÿOloLss㣣=‚( wr]w*wEqn~5YjOWw0WK{i;ڝwqDdZkoiY6߿v"2LW^t1ؾMD:z{OR7f D>ՖqS]`2kՖq/HcԬ6{WX? g.r\*BAFlUB͕;/r{}?1RTfꉝSmhifr(0m)3I`\1'^#LNǍٹbeiGjmk)ڪμݙNrѡ'v 츾,, 5ϛ.ͮf߱ q9ypcS+3opN 7ZUw-͛L žɠ*r׭-TS `j4NeYve6W@ntQ~{fL*ܳZos6sى@TU$]2PIB.H,]\]Y>ɑL<#5rcnڬ{DĴHYBcq""bp&ӣD<n.Ի6'X:S%r ͕9'Kڵ/i=^lsXH%gaz T"Hw[VNT:Dr2=h2ce\jڴN27 KL~Z⇖ dFR2dr4-PlȮ+6 N;pW;U?:Y15MnTj{$1DQ@&|$&lJŎϔPzttlȳE*q]_ ¤{݆͉ICfF~kDŢ@r,;:;ҰyNR2W1\1LfVcS,>Bt֪7'Ţfs1 "QlSU|-_}YU Vj6'"R@sdLة.5kWYS6YED}״̓o%,ں͈uO'llwT>jODĹմ'u;0wֆ}tڜH7x$"5NN~v1d24V6m"2`tO,6jfD*UuND!ҙ JmYbhjdd:-v}"beR1QUem\vnYjpu5z:B*#KWSi:leU'0izM:f]Le3. vO)VY!Է) CNoF,3~cJ( 8=}x} LDWjE|T.-k1'{K.m4jt"=ȧJMͳb\m9 9_;һ38slYas2 @o+6>*[3|(bZrBY*"ߘ3S IDAT(gwzJݕVZ-fg@$zJ!"o.׎a6 nb@FwX*'Z׿#: ;2FʔH${T8׬!oer4効*2MK 2v0aaL d{O?[dLغa&Frhؾgb+UMNĂ}izڌl4/4cZlTehE^2.B.є&FyŶw㜯%Zj5Ryn+t /`:zˆi;.H宋 7ie9suO4;:=>\/\Y7佅G? Ɂ,wl:F~ᢺpln~ =Sgm$YUw H%tk 9%L&}w Oz;q1]DB{LD"`k@W`w#??ZeW:>ǒX8>gZ7>.|W%OʧdOXo4/%nrxfw5p,..~YyK/}3t^"Ykwh6qr5Z>"rq\"ZTzt_"D>2Fv> >+}L+D0ZX\5Mwލs=#ïO"'g^\\\YYAYvMLy>#3笲mUg=o|o* j/0o~󛖅f\a쐞5@ HBe1Ia?GzF}O q_?fq ȏIg?|Uat~<FBBpݷ{_<Ա 6 }꽒OBl ftJ>kvb1s?0J>* n^hN ۳óuu}W[|ԁ{&~ߗFh@fW_8f'Ia@BJT^ҠeHDLM{`PFƣp??}_s8߼Ct_~φrQ*ŦAKC$U92s|i_/Q8ʍ"3nbpTD㪠ҙPM:V07 @M?}BD4B[^[T}Sa:;sιh|s=\[2s^R 8q?9vwg'=Tf|s#t $ٺu}n;o{ɮnᆱwn6x}L}4@bBTBo u64xk;xV'?[/KSj`UpMudGkr0&cow17 @]5?{ņ-'~g~]?I]<}[XrfU{b_y4BjqeE6ޙfOLYU0 @H7L"[;o-%Bz޼ˆı`)l@D"{a VGDD~{B3:N+r~hウHv}w=8@ @ @-q{>x`~Iu}#?'}*Aoy' %mƛɯlU|r1&Iw+5?ozP7-Ёb; H{~w7~-,ucKOWs=0 &o>:O}[@uͮ_ 4{F0^[5~?2gCas_m߽wovpsS-νͯy>Km$ *nN`}nG5\T#|P8pֽ$~m) hؾo'"h5])1 h$ $DH$}4s,wxT׵9Ӌ4꽃*BB!QDvlǹɍ:7y/ݒNSL5꽏4fF3}PPhN{Zg} @ (A~=ύ7J7@ O&NJ':!]`= T@ @ zsohl"F"C @|=zt޳#@ @ @؄47ZBAB@ $4w ! @L 4@ @ 4@ h@ %@ J@ @#@ @#@ i_-T@ xRRR@ ']x38@ w4@ @ 4@ h@ %@ ij|/c@a/c4OE&דHO7p>Wͳak_)N$3\}hJ,6]քĎ@ ӃCE1>TC!Vˠfds]qqΞ;g蘘L:a+\7/}d"OMҖ{hw*-b٠+oxw{oŽl#;()O~teLlܐ`04uuMmEE,Rb%Fʷ>kkĎ@ NơE3})p`1(vL&zʶCCC\kWdmcg$TJ~7qҢWN~d]vEJ[}xnB xյ[}V$v`RVfJL'7*jJ K;V}Wxh?Yw7>(TXad<ńS@3W^uF󡍟|R(~#j%Cp[4cel,OGG r]232߿O Q+vוvlg/ݙ}cĬ!^Y-k)qYU!qF4 ^:pWx`'էtkFɀ={W''t@mظ\.͕Hemmk4?9'0l2uT϶w,EYÉ?~&-wx‡)`g%Z%J7ٮHS(_ZI$+b{ 5w)UX9qkz:% T&\vLS_ u='g:`{†>tPh`PܒS*e#&晜N1p8֦Zzꬬ)vH ҧ\Noll?O 0 'Id8h0yY~@8)Kp >Wfxs}'zL4W`e;Ňf/{͡|ӤGli)m.w*əH^x n߾}{h\R!2FxGǁtJ\%Kꪅ&༅YS=FYwu{*%Q|} WL*pE6YJ5~yRF9|Bؽ-VrߺU{m@&?zDJ \g¦c/]<ҫwt 7|èc@Ƨ7zn۶8O`>xD,۱g -s1)9Ɇ~R)Fq<==f=p*/>1*:%Iɽ$abҳym:z@[V}{Gg>~DBؖ0Yj?n137hoKb S^F#9MHtYӥk2o Z'c@i#8,@}WB؉e X>UmR+}4}O-%.`hI3 w-v*\Oy ? !ޛ:pZuH*;hr]&}LS`FzW[s? ޸!ΎPbi9P;!wÄyЇU$o߲Kjo~}t`!16Z1RͶR§{PZq$F7oM_n]Y'CcL64heTjPjg{yHg Xfją!a~N) VJR+DžI8sݳqg< >ɫvàV'm--p:R:0h5:RP]/AZ)ixzLP aШ4jF ttr\k0zP==]Nwڵ{b>#D_CX59Sl;|_/]Q~8=,*>@8phDnv|)8W\|K(v7OS8Yf cBpB5_jGNx/ 0tL1nLb]Tҭ!:p: V_Grl=@Ssx24L1Xy_Ƶf+5)mI!1a\]h:|!'Mݘ2Vgj/l~ ClVlxͯV#11s\ Yh2LZg{i*ru IDAT.M$1 aԨ5t76F׈Ԥ]y*9ӭΌ]\c7u6扺B7o7 -tp۪G 9J-x}i{&Ð 0F:u7T X/k\!,5N+a|JWLu @Mcbcb$9!a*s)-}"6]NA(˲-= . Gʟf}8n&ˋpKz?}4 \*wv ?.VES 0-cN @6W7r^}5Q^׃-^Ŷx?, $!!a8Q8]W#?gmFZJlc˹~+wڍ4W&ӄfM̞;wV_l.GP.FcDfe /#8Ot>xBT;FcfHuSYY47H0,8Aե%[`G)EF`eS4 {|F6Ubn0# 4-(h ]1݀']SC*>tFCgm[R#t:ޟc4Hjj8vbYs s]`A_מdy Cƭ_uZCR+,Wׇܾ(؝xݓ ON2Ƈ\HZiM[UMeWo)|'~ʟJ :E'V oݐڀ4T?~.6!mm_j}=woh%j*-KXfV O9sJJjNNjE/'VM@swx̌O5&-r;ŞwkЍՅm[6/_6Y<8w梸/LL8A{|ګ`tMq?SgkOܐsƞޞft@ YH0/dBO(wŤ3ZpO]sGn/R繯UUUU8|R,/15]4m־7HGQݓo?Cn!͎LcIjy)_0 0r~OČ~ч4@ s oE1>TCyV;ŮݓcH|ޥ¾[t+ BX*ŕ~fAh@ 6'{yG=#@ O?8@ h@ bN@ $:I@ p4@ @ 4@ 17PBŸV1Wyk{uSӤ4/-Pƍ\!k]x6{g$2eJ4&T$YB|:'eBr_%Q$a1#ݗjՊῤ$Z%9vׁ~{^/h/@X0a&-Muߩ<5;,yyn1Ibpo?nx؆c;y璭Stk˿*vw$wّo@< C\;'eD),k$y'] uz #g`3OI+q^ _"cQ\,465[3Yl6k7l6kuVvkkLhY] .4 Hl zZ+K*v~]sOxݱn~qL۬&zH$謯|P߯%mSd&َq4:;iRdR~64ha_.R~}'0Vt?aG ꧺ60#ka9KwO}uVukGr1N~QA6m!1ѱv/'*+l!_S01ïhùf˨[I?K*˿8&LHZz&wVukki찜Cԟ53{4vpʕɑ^I%쬺}N͗diBL'W;gęنaEKɖur`W SF\0Oؿƭ<+1g?-賌ߋ$#;=֛95dN631mq;_ DWd,\`{jzu{w?9Q64 kfعc~ i%V D2#*3'g/b$;yli}Mō2Z9Ɍ1'8^p(ڋ,y'R`u:F@\ܢƼ7$E@2(ldO8 `Iu\~!ueϾcon\]oW/̨ףnl 멹sM921v5iQ9Q.P}e7J, fp%}Uywž%QZ[Wz3v-h60.V]ޭU#0*$Htmp͟#mX*Ld^e]׮`1%7Śʯ},]M*br;c}S9]U6n쥤soG9>,뗒x0C9DVpjJO0׮ݴ]9ptZ<: DMuP7ycuk7jZ])U6l8R,!gv&9iGnnHU t0a &:c%B1QTVs% Y.aM5s]4stER9 "J`zYENgnoxA86, uW\.0܀{w?B֑Id;/u<u\^Y%%`qr8U!1VdO2n.T\Pw/njߙSDԂ.&6)`=4gjII\^?`5(v v'%dCcCq9 lن31[p,Gh 8#fСĄM6q38+#AoW,SWh0S#'qGyo?.k`r?e犅V0=#ɻhp|+@ܑx,<<]v=2=ͣ7j$@X;>ʭ@Uqo>;$=I]b @c?&6Xd=ݽ6 ?Uk~U"tm׽gfl0hxࣣlj躶0%0C}q-&[.4kV N۬0ۻ-[ \h5K_闰,< TO xTL9k^!-l.MI_̎.hgpl8VŸ-)NHRPύ2@,viRFdpXQL~wǦsƍKw5KᓯD2hT j6**ٷ6uc{)w(#ejnɳFp ڻV^G2Z%}X,GĎy00xfC %r{31RǿeqeR <h)+)>k6Oӛgb[|[->Y 1,)\4]RR =Rnl'lFaנWH$C?fq`cmƱljg ,uXlœ|#96mSz=kiFHl 8#f05 Mk\H _8\pq\,oͽ$hJz0{*yol4UWi;;ĸ` |H!l6Z3w:~3`pfQ^חN}c48rb0u񦁃t6LzrFw_Pqqq>szYqN^V[ђsgXւk<ʬq5Eg2ItЅbꭿUA` NO,H|I!cH,(8uB:9{W:7k :Q#N\4޹6\5 ϳrsn:Fj0;ohYtR%Z G^wN$oCK8s^,[Bk:[gMs|Q"$nts}bxXIDAT`SIzVGZ3+*a!S\2ܦMKo71XSՓ\C_ݰ"@ b5t*QzbAKc6-ٸ-i1G:rdž::lvxV1Qŭf[)V s7tN.QBV>/TJ+.|[.39cBM|h_ʎ/ iũ/MYK.bS-ZʕLK);/k3VI%L~Lhq0` =(-w'âh;}cxU&as+}NvJΞ &}ez56MTuduj(3\}cRWEu[e`[:f)uiK:}}c6mE-- )8=,{벲Ӳv/PV990,yvӶOd_;lv}a:MJ ۰4pF1,23333-sή.gNefeO< 5cZ>DZ<gyOc⩃͌8YJ \#[@hE&43;?BgS){:p ;N|GX'Cl?{^}$ɓBq*sV{|$/ym:|`Q!АZo/Ɋ"/wڄx5-afllm*R9ʞ(8LQEWpr_a3p֍IHޟf!ѥ_qĭ|HU3ðy\&n 8un$r CH_<-x [ eOɕ:d,JfLs.;) ۛd8F]6p @ 7H@ C6:vvIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/dependencies/000077500000000000000000000000001461403617600226425ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/dependencies/image01.png000066400000000000000000002334521461403617600246040ustar00rootroot00000000000000PNG  IHDR8$PDsBIT|dtEXtSoftwareShutterc IDATxwxTUI#I:. *{]ZZv׵UWŠHU4;I(@ d >*/44MH;aa8Wgi`GDDDDDDDzTUs.vԩ.O#DDDDDDDDjˍ&ld6U-jb-nrZ%iڴ)qqJԩJDDDDDDDq}L0̙˴i0]"{&`1[ êŋ0g\Ll+S V >>d0kfȥqq8]NvN:EDDDDDhX0a8LZV3SLe„q,^0*Lj.s;/% sc@V 6__99fgcDDDDDD|Y6 ^w/^ x 1% ^LF+r6??""""""B\qlRdUlj*VYrUPV~~ZJr`Z#7'j*"EDDDDDT5L l毑U"?yk|$gŸÛnOsι?M,~/;?c*wi;se@6|O6d K +-_6}m^+}Aq/[2/gLW>,$ı}[u2 r<< Zϲx`:>Gۖgo<0ek :*aXYgF}YzDDDDDDֻ$UikZUՂ" /$%Ճ(|?/&In3Ϟmd6yF|@̲yi!OƖnj6J?Ogά 5+4||fߓlj !tڱ9"{߼-D'ٍѽٝiQÃodkF3{O6\Jݻ_[B77&U ~tnOL_Az{|oy8|W^ij N'GOU+WK} ߗk׳roP#DDDDDDX.z'SYG7>XVqO^Wd?'#G~取sp6'ro@dh}=Y9 ;bΫ˟_4+W8z$7uHgd'y ^ Iv=7Ts>Çπ|4}a*S˿.a83 &-:\F1rd}ʋD,=~=\=ې~}-;ݶ h׿h%x];u<LV,;yٝDJDDDDDDeX2ڽVmngn|N;ꑗy~sA< [ e¸<ܱxgʶ'e9{o)UAM$N,C8  O6'NJ^g[u|#gMf hDӝ-kCw/7 ǵ-6溩e k3rr_8z6DXgں$,/;fhOnreo)GY|8C|(>u mb5)ShwKz%Y~~72?F`tڵXbE.vѵKDDDDDDDL BW> yqxlY))DoLƑ\uLߗvt庁l~Of?=Xu`F]5 bdQgPoVd_Ø ܲڮ1~3Wqhðgr~:>ijdv^hߑ-K7 d`Ζ4F_q~/sA63< {n7s<R2>OfK/gZhۮEׯ_ᣮt.:xgh<,e%'Wy7OHelѬfFX-iz2dxX9Iv`#z9|Tʈ*:V VQV9U} 7 ~@|Y$la_07U2 7PRX%""""""ZSE*@V""""""Zhb I=%r+=\0ʪ)r/Y٢^JaTE+Ŭ^{V WX%""""""p0|K"1m)rH\0dV"Mn6_ B'9\`*o0[-DjʬGgw"""""""Pj`e#0(X#RaSG׳ bl2caɀ"7<;. ˉQ߈W QOV """"""EҒ֊""""""""UXWQ`%""""""""^Ex\K?΍ƃGO0000MMfLfn jǃp**Ɖ Ōl0 uP5P`UK8.\'nڎ6@7\z<@iSRj@n?HZjb!:&h̙KzFwNW_ϬT[\>"""""""UcGLU#ώVKF_{-YY]0קu`Z^Ty`UV5 %1!]X?CCwk$ի'?,u޳'zd;ҩcG&zK+U5aDm۶s璞oˈ_۾trGPrn[S:\Ք[9t_DDDDDzau:r6n|oЀT%%%;'ObI̘o=Z۪)Eê|jiU'0y? :9/JS%m\.(LJРAٱk'~)cM<#ʫzrg` 0O/[4||+S7 t?>D9O4w'[|ւaO?ϓZR~KQ/SpNM:d0ZR,oaH˯cK nJ3+X0UvܰvdL""""""RڵmGÆhӦ XEKD.aal߱}"ٳoo~>xYvř3ekqgF8_מz)+~o_36%^&!&|fHn[]>dmfw9F2WX?zǟdsR){k(Ο2r]FoSz|4\ÄNv.OO  iP4hג0pGb`пVP\XR=zf8*JVVЪ_~̝;s7cGڋ*od2񷿽qѲ?8M^ڭ44O0'ג-VͱMƞw] g{#bq, [jڐբ?MϹTŮ іj/p_NXOtjF'Pf:  #x4ݵxnK#:#yA1mc@Q_II <@"0Z/o1Ҥ0whNC $cw?smNkݽ Rٲ`6R0 D@Q/$Ν;7drD FjZdfdAfVf٦U}".{LdJ>]ާJVa@Ps$6ʞ٧ӶM2o;o]=P%7i?\Сår4:J4A߾ؽg7'/?|eسw7}+c`;p-NJZV8j#!4>oik#w?[r]3mѥN&f{4ǶK#3[*{kXc628nm"ǓrԖCboק'sC =I;:YOpOk1q ;pA{1 -sٹjkuh{O0g*V ߵtg"exHv{jrkBƊŨ;S-8(G}FdedpAm߆d޽ӷX`()O?Դ*~@nyƍk+:d(s~7CVvv]M.^*//Ǹ\vaTZa2=ʺvpl\b{)EEdܸU~!W=vC7Q)uSדEƙߢdR4 *{1(~;Vn#tk$Gr&0 pd[cdgc4%ǨB۶!0iOs?.d/h#-96GXO9:+?%#q2 MDDDDD.i<4`/kYYS.?`6|G]02gff2eWL]E׽>z_)=E˜§CH6i٢9`ِ{iV\kQřL&\GǨKnL絽O_Fo-+sPCD#/.tm̑y?=F:5'u!Ҁz k`R焄|'~ ˶-<w` }2Qٺu/3\6|?M&zCtT_NWTahќĄGhҧ^HM.^aAkDJ:UFTVUuvznyENm"WI+#JHLuVe.ߺU++wXU#ڤ }cnj7`ȠA o1mҤF쫯g2lĨj]UXV6ְ `Es 0cƜ\vrss:JiPҹ C/~34K.?UQO(XcVlC'vr';tTpV^ю';UJCN6-d 9 N'GhxPM L;EBB:C` IDAT^r4ήg嗒)W=7, Q1IH)θ<,|_Ǭg73XH.-Ѣ""""""^rLbIrGA=ӧ8}4.WG`){モ>Ǟ|nCCO'??޻uM-mU 38[=}wEK<üc6[xͷ9ZcY/kn^z &aҋ/vC sy[2W(۷}th՘r0Ҋmd.^Ȭ㛱Wqӳ3_e/XvI ֖a}Q7-L7&gR(nN.ݹI۶oP1]z0iú BhF˰Eg>zE UgGx~6a:ل],۷^KEiP4kA=M ڤu֜:Ą 730~MLLU^#D|&ч}0f(x:9!k<]tDAhU֛y}oغZ+W!n繧ĉ2q%dfd{ozJg6(k›͟_xzO>ñG-ުEK}QG絿3ig_uZӪ͟am9xp-O{5$}/<7F9oJ8+Or+,W3Kj|4?.$E5&ՙΩ Ѣ۟ږAD):q2e;0\5V\d&8b6cjqvlV!\GG_Ke# Հ pfvl Kֿf"""""Rk|ldٲeMfbvcaϳwj/=e-̙TVXF1dyy|MbeWM.nm\jMi<#C٧XrqDFFҺUK.7f歬ZG.fnϵ1{gnPk׭%AZjIMOwfƍRAwdjR""""""־}zabbo9?`AÆ|DFO>&:& 6_[0Gbc={.9KsMhٲ%YˊUj<ɓ&1c濫def{Rw6mP:}V[^V˔btkUzz:ӿJwiІvAIRgT.D/:aRXUE42v/k0L 8wz2f2Z"""""""꣰ '/sfOMޅt.͆bPXfS AxKԶ 6 YaUUJ`dtU[1KE """"""r.OMP5 V fЯ6ݤbbvq]]nW֔@* DDDDDDDDī(JDDDDDDDD+* DDDDDDDDZa^+jSV'R`%""""""""ܐ+r ZY}""""""""Rn V""""""""UXWQ`%""""""""^Ex-.""""""""Ufǎe.۽{RkxV""""""""UXWQ`%""""""""^ExV""""""""UXWQ`%""""""""^ExV""""""""UXWQ`%""""""""^ExV""""""""UXWQ`%""""""""^ExV""""""""UXWQ`%""""""""^ExV""""""""UXWQ`%""""""""^ExV""""""""UXWQ`%""""""""^ExV""""""""UXWQ`%""""""""^ExV""""""""UXWQ`%""""""""^ExV""""""""U,mrslݹ}чIL("""""".}Wt=c_L?-"(M?TX[!"٫GSQGg{\;s,-u+07@+cqn;Μ9qW6 s/̘5gRRڝiz-w1x"bG LAߙsm\eïGfk/quHLd`CԻK#$ ƵMd&}f_ ^""""""4ݽ_|'_|Ŕbȩؿrs*ª%: S l=T֝{;A JgUwb̀fXw喛^=F0G홽|c4p}Դ [񳊍2<nQL~N=l٬0Iv -+8V284;w—;^ZM*FMטRψ/7t󉈈WS`ud)|y|yՔ 6>+ɉb&G2S_c*s_w k^6c5qq&2cjU}Ѷ=ػk;Ӭ4nըXUsJZS䕙=E{˖l=%t,M&I㡄5FAdew:'3Oy^Û֐ewGɁ_8y\w. Q`u̲=95Oww_6̮>X?DUIU'K1v;&Þ )7p$kJ}7ȵ;1#>Ĭ"h9.xo\8 64С~ ) x8='}~syʿ06#!!tN:U/~M%yx{J`VqV[*{6;=`TwKyX"4P>6J Yt79ݮp?f}Tbřd?l:NF0pr U.;͵w<_VKqJKYu~}>ut ٙKk2BXtu5 ui!]^ICї~=Ca{8.!""""""m.24eƵSٸyF 4ۊO6F (ٲun5*hQm}HnZ6XxfɋbLݨRi`/%(2\9$gBf)m"e&f l}s)uقU A=hmH K9pӠ ]JA% : K64vűTvJP/x"'/[~q_Fl7xZ`hb'nX֪m 榋<=kYd#t̬hєVz2t0F *qΥIs7]3 ڼ8*}YH.AҕVyݩDax䛲v0! C1pT2jҸ!Nо:ֺY؂:aٲ-ԭ@`,4Q<2a<eI7;>t !PyG\5iܰMM;cߓrŽ\9:; H>UlDF~HNdO3cso}絏b# K#!*a?AXfŦtfpoЏ,(Æ%[9W [8-9+%@eulUz`$Fp8v1cٺ־ +k؅[CG=p;6gV@8mB=cZڽ.x.l4ش6|ŌcZ5]lȑX|É Gbp{P̽"iMdegS7fg=q-M!#k=f4f__乕 evgɊc_^{ .YçƬ{֜2pj*wwnV;Yvt@O@{F\Y~[ o*Vd;%W'U+ubݯ;HK(ϔ{U3h;lZJGxǻ/zu[Ruo:Mj/N!-q3\ԟ琉ϾƢwvRzumto:Q|""""""je`krNX֧븱K(~x,Ǣ&RX,n = NMg~XU4< F9ǎyz-| O͹揸i0tgGP}_<|20{s[mMJRfa`@/ƌ`9wӘ~56K0c;=ol?cODDDDDDZ- RY/ O~),6|XW{Ymz}Y[ZP$1_udrD)׮f>9 hɋb4Ə(ߘ'=%yYIeab G `r}2~W=ƳYC\!} _0y}{߿ÞOm&9f\җs 7{&3;u⊮tԞKDr5K.<@iNv-5=1xܲ"7!\Mt}("""""""EXjes|/|d-ۣx&f]]4cK[P2pr&j+?Fm oCמ>d:6R]z䀩;@)_͊3#XTm_ziW;;*Χ=|xIrgЪ('0sCP_~5>'k]F,-C^wUE2y_S݁"""""""RB-\t=O~o%/?z 2eX NZLrħdˋ~ k=,[vRU89t#'Gz,5$u[1C;'"""""""*{Kl}eΝx{~H|֠x%o0_t!]ᙷᙌܴ @ {NZɑ̺>-,9,T ?NƦyDDDDDDDD ԲVl\uXxB}/VYyeFat>&={XdYEr|21cs[#=pUDUA6ffDDDDDDDDjT < D%o"mBJ)͞G][]"zgbLwC'&+Qo+eD0q<|C'~ ,oA~9dLߞVb=V9Y{0CD%q0x(8k;EynO/3^lV%MLmՇ~vWl6߆=yq7DYwS`VA.@jmU7v!+%E^'bW}N ֬c뷰ʃVω| |ɳIwO{t]Y62gxMfO]""""""""5v2ҥ}$,>▄5 mHαuYئ;&E :ɖ!6)n ,$ڵ{`^`n\<4ŀ",y9ڷ<$wF({dCBMn#k)s ]Ec^IKW}k^""""""""UM ltezSN0pnB<D5/yp^~l3wurۺkJ@M:'җsmI=/kYu]]׺o&6ҫ|{.^ni"""""""R3LZQʠ{ p{Fׯa){riWePZ{[~t)O5FF^ZId҃SDDDDDDDECFsR8 'f]Ȉ!symo%ބn IDAT[-o!KxtIyou3gMvor|iiգ6ftIx1W2,y֡oO$I$IKJݛB~]L&H+-䙡)޽COm{2wR^K@ V1yO՘7V˙~s:)COmȹ<ΝTqFV~xZdǰxg\1ޘh5Kfl)Kh٣ׄGqǹVqyIϟьhU⼷1qט6]"<2f,z<~\W_DJ$IX邐`y!imQ{)VzU/aĚb8a*٭IyeL9)t9U3GAnIBKCRhi5@M~)\մmZT"cE?lݤE3 )MKz\ U yn:VTsn1%!2=֜ITDJ$I3$pu1#)[#sD#TkVFҤI6y+5kxk%p{P%$I$IڜL[~}m>WVQ!I$I$ծ'nSeV7yTzٌ^>?$I$I=$I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$IT $I$ITR;yoxX}:zY7x4 4X=K84#z։[߽>$I$i;b 6Aw{,XMR$UVF$I$Og`"*3g]ԏ2pK%#[?aqn<8"$I$I6j,_QPϮI{N&/$I$II7ɧXj^jW|8!&$I$IەmU#ofʼk+}:-?'hejo ]Iԧ-lS߸}߀Ҡ 93sM`,/(!LLfh;l'9a, $xf?0c._F $}w nbQ\c$!)t x#gfdu)DJrYp3d$I$mN^x!5jԠGL8q8q"=zv\pr%yg;0kt.5ܜkxiQنyy0+䋹jsU eQrM5cz5XʏYR)Զs'hquˇ59>'/LnIuINm3&ŪѰ3-I$IfWV->#wNϞ=Сï3qDzIڵUDX {֊#{A7w_PPvKq|ֻ݄.> !f|4߯k|Ĩ_3 ojV}$I$I.Ԯ]';CN6N޽+s_U%yU,\Ty6?vC+̞͂5",g'r/%_"IWwy|FrR}$I$Iڮ uơ[oE.]~͘1c8#6{E,6O (dp]͜|35|X&ѰA}U|$I$Iέ ݻ7#FX7bzmX%wtb1c<67ޓJUe@"1O?Ezr?+rЕvE9w)Ö!ҊY'^`o,I$I!իطo_x [^zwJV^uhf?bG_i*W1efׅMuw XhVYoY/J$ImCz:t(YYYۗ}eX$w`ԣc*ӿƐžܯx9߷t_ޣ*)gkpp׋c)/YshǑMA2&kmÅ bz;dXh%O$I$I[PF>|8YYYdee1|pê ']Ѿ> H[=.cUb!c_~VEĆM8x/ 2f gܵ{4ֲټ [X*r}S.I<ۉفj-jXƲj݃аt̊0mYRz..OOcʿ)vޕLPʒẛί|%I$IڂefVmFXNcgNYBHIFÎ=[`T]ePR Bu:\qo9#:4nTb!$R3٦\x=o'$I$KەY7BhH~A M/cJiv{trO_*qcJ8kVxw?.UsϢF2i;qaVf[c5"-h `#X4M,9˚sM.#Sy卩lqgtL}H$IrVQY*W WBYsG@Zi".5"cl C$@"YqeL_ʊ BE XV28uglyi|.C[ =?l!O /wo׮/nj&:t NaXȅXzf?r!GN)qH*ʩKHDR4<^* (eĶہ%L{LKkΉGJ,|2y{ֺ-c;q7;< WuA``~0}*γWx|=? :w 'r\,p6/z9OUnQYm;3_,m:?{/}9Qj5@μPvH?0Yn޳ ڜsњ}yv;oU–_ypGVGsc*.aq׳{9y4A$I ,oWV4B&~]۩/,+QI#Ȩ)L ZzTM# DADv\ԅeK)r:T.N#ZL!i 7w: eg00,mA[r<%˃oLR~f4/{fv\] |֣j˜_09S`ЄtNl\z ~(KfvYyDp(;nJKÖEhsrZGYզ>pg}Gf0'xYF*Usrš^F<ǀ?fvAHdVTw6Ӄjԑ+AƯ?%\o[Oɼ[ѫ\x*2 οz p(Av|Lr̓=w1tnFԯQ &()!w\Vm.pm><Ѽyɬh}<;{&/:?wY2(/ܝ'Or1w:Px>Cq ׼ڄAG6#,=7sR2w L{nܔ}<5/gēo1tl" Fؗ~[j%_O^D.HJ:5=Ra7J$IR0 ֌ E"ە]+J׺zf%H[naU8K?uXsL?WK*7 {GyW̤< SSZ%FՌR5#Fx*!̨S$7_tb~(u^P}*U <}hnT|9:^ VftA'oetmw.@X|۳S'\R=5GfE2y!YwHk@;pG{TmvD,j7Bv':BH6#,[0AV}”#yϙ3h^,Nؿ'~O@ըi f^N9'c^Lf{qx N՞v'~ 㯻+?e' I=JBޟqqR)H;5#w͞yW~VPQmvwqcz.m$I$%UiS% JKKY:>cydž&|6(ՔŋI$(#T"JD2鷖_: H_3N$,$\ 5mC6֖[8i4٫R_:gW.R<?+OgnadSso ,a'k<;IE6;9~|^:r_|;.^N7W<%zfkR~3~d*VP5 ;~ Ӛ tsB]x6K#I$Iڢ|.TAJJ ȟ?nUn &Mo=\YV65 Wl!<:i{5K?ŗ_ɻw$I$i +j ܫHxCClpI$I~'']$I$IRR1$I$IRR1$I$IRRIof$I$isKj,;|mkl3I$I%[OiBJPe 8ɬf*t6hR$I$m^I6Ty @$I$I%I$Ib`%I$Ib`%I$Iu& C0$I$ImU(ɑ$I$I$ʶ阶J`&>8$I$I00'\$I$IlK&$I$IR21$I$IRR1$I$IRR1$I$IRRI$I$mB_x"$I$Iۑ*CAE;\c`%I$Ivbm!ӧOӱcɡ$4ghѢeEpehU9$I$Iڎaȴi+7oaU*..f޼yҋL~V$I$mec? @v`nmҜFwS2ӱl՚h^VkJ$ID$ .Y@V%lu˖H$e+I$I#aȮ]ۂ$SXXhX3V$I$mG >l큁$I$I$I$I$I$I$I$IJJOc<Ĺӿ_/ IR&3շ{ yfOWmMCdW[X)I$IJ{GI@gL/ Ѧ#m@ ߃ڣs)ȯ_gc\;[vXū;GLp{y732GrLspTDs?~^Cyp<,Zwqȣ0{UH- v^{ۂ”5g7;oh'Cjw+w|qWPVVʍgt~'`t|!]0_iXB8/_=1g4fT݄uPo3I$IR «67NM)WrIQz6/yM~կ`O2czރgM|rN&@aSK#@e/ptϏ8ɇQg)ydžLqճi8> c΁}Mp6ZA_1rKtѴٻ?n6¶925*PiJr|x<":NٕߍfM/ubN]OůŸphJ͍L>_<5eKusτVӿK#R; uX{pݰ$?/.K>ᖑ3H,4Z5cWK$I\ic_e }ڍ̰I#&SJ&~:DP=~?SX-ǟ'C(ӉsX)d8s̥wqYGspbu>9m^$Zq6a?a)Ϩ7?eAhM+RzݳhwȮ4Me{_0g|V#B#;jfrJTbP%ߵ:}ÉZəݩ5.|3$؍C2h|9~Dd1yaL<=%Ѳ uiC4Sš]9t ΝȁxU輱3fJB*Ө>{6]:Ϣ"Uɗ$I$b\%tO 7[屼2~ _j*N/"2 /+րN]Rql=`H 26\0?ֈՔcnQo1=8\saU;uo:ְU=mvP?n[oYIF.=qo*QFp&󉗔 J(ZoxF :TdyGȣxiy ,5 @ՁiѰ|] !%O1q)Z9|h1*xمU|$5bq̚:oczpMZ4i+ѭ|I$I|WN-Hket])KC؟?W07nɎ5˿'Қs(a܄ 5i׹5YTmўzn5"D|—;s΀V}9w]gLjRi~ϓ7=λ˪eӿM&3,bk~H+ELH5QF]͕*&F&ه:Fm+6n*=.&{ѻ2zڷ|;n8|)/綑 %I$I۶X*.4&F~XiIݚn늬 %N dJK劊Iiע+Gڒ*|ůGes ޑ|<16M0~+ n@>s&dE 6S MIeD(]0IKRS޺'vo?wjO8;r.EF,Xƾʿ~g,Fc=1W(!ZSN8u"|*ˀ:-VI$I0hB-x)|J ;/M65A~_JϞz'*13i<~#н1FȢC3#Bвm1}7?N >U1 N$RK' /?͠٥ߣ_fvѸxo?v;_y(*ͫo2ncYipi7ϣW4 Ǿ h7ndZg?Pгtq'AC8U-AC3;HesA;SsPxt0_f̉]Ys >^);VW;ቹ4s!Oj/I$IjjuJZoM>ՑchL\>yu<=qg< ]g/ڍ@Y\~^4KgXv/.9>7B~[fo?Q )ɶUiS% JJJͥߨTFn%I$IL0$ Cq9a|֝rBpmt?"-#,m7Vz233IMM%,`ҤIOc˚5mf$I$I[Dt zw_ż&vgXI$I-cd^{$ԥ݅ztk2$I$I[DY3x}BSH$I$)XI$I$)XI$I\29KX$}ֶ1$I$i;5k`,ɱ(IhiN#GfZA`Q$I$mG `N<:N(InN ~V$I$m' Ьys;4hHZZIBiii4hА?f͛D c+I$IA!HX,ZӤiSe J2HH4BjjTHE;J$IJDMI! C00INk{E]+I$Ik{Y ˆ3m m $I$Iڎ =WvLl3.[ʃ{ҮI$I$m A-3$I$IRR1$I$IRR1$I$IRRf氺{%I$IUzXN&I$Iֳ-*Hy(+-%HI$I$mHhJ A$M)rVDbQ))a$I$IA@$Ho)Z#VI$I$mvAaۢ*^J$I$ϰ6lVI$I$Y%b J$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)l7Uoqv~r "\/n8g>η-I>{g^/M^Ů!G5 |/_@l\ګ^Ɣ$I/}Cm+Ii?~5uo0^dz=G>}N܋C>J<\n?=r^Z s5޾0gtʿ/ W<~Ig*yߌ]Chbc49{ս)7zx*m/ҋY|V&vX~Lm9_=z˦gS%I)5KqߟR:fdO^%l?!sڍWwHbۯ2zc51ezC81n)9Q&C0l1ޯleҜ$N5 3޴qrFX4sIC(9]2Ml|ZPF 8"j@)|Q;jt%ק?ԑfo,K$!u̳郼ܵoy0}v*C7 $ 5n@RX0%JPʂߜ˩@p}mCJ)vn{14(.$bw qkɏv,_ϟ0$r&)n(&L jC&5{H?LOmYngkI" Rc,dGqvYFR~c C;.ITDŋߛF˷ݖ5|P֋^aUŅ0wR$$qS MbXXJatOckr 9k9<6P/G_Ni-/<`nDlV$Rr6Lぃ!' OJv6i6mgm+Ia%IuRxfpmX)W@ KxVB܆|ֆ)%gPu~l |$/G>GneTqhK"]Bjro罅#y0R3!99Ab;o2qڗzQ~K6Wx7l ѳW&Xbc.Ƥ9Y}8du49ťI$IzaUs)s9M_#˹%m3Gǧk?[jwl5|c48cg$N\NA뾜s%ݵ>îk⹏ֿI9sNH|FW'G?ɝVLjBTq-yx4 0#)O?΂zdv57vIѧ1~3hH+wym= c tGo8دJ$]'?Puu5PFNIdX[_:pƋǗ/i$IWA;INN"::`dWXTٳ{=zЧOe[e)$b$I#mI$I$Eh@$ş+>8v$IV$I$I(V$I$I(V$I$I(V$I$I(V$I$I(V$I$I(V$I$I(V$I$I(V$I$I(V$I$I(V$I$I(uBrz7%I$I)'ho$I$I"S%I$IQ $I$IQ $I$IQ $I$IQ $I$IQ $I$IQ $I$IQ $I$IQ $I$IQ $I$IQ $I$IQ $I$IQ $I$IQ $I$IQl돾˜)M˹t< ,@x-\{n)L|kM8'%{!Oq/H :9 `.,WQM~@gԻ9^==O$I$ԙ)R~|4_Vu[nmNʀzkj@D+k{#x>(H.E4T2z41?v8,N y{^UMIx懚пOy.2`$I$IWJ* Y]@ׁgp q<9ee_ׅ<{\˟sJ=TL<^h1-ms!o˗L- [5_ϵI$I$ ufU8Б.;˙zDV*,UH0޶d[ hg6I?8BK$I$Iթ}9skzP<-j5J?$'%}o@I$IPg+s߻,ރ.qW!: 'fӶ/G^9K^b 8w*ՃtMxrsk>^ho$I$IuU ĭy%>^IUrO[GծR}I?a e'gb·ٻ|&O} E~Ue#g $&|=b +I$I%!dO~jB%衱UCW}3Em/a)@ټel&6VzkƽqxQ{4]r$U먎ΠM澁Scɘqlmwս,`qc=R$I$W0{gqe(aY,,,:m oaCE`6-_-'ȠMD h*@<B(Fo S% :y)1%8*Q&cqtK{%SY#AI$I$d.`ѱLhX&nI T7_UNzb [3qJ CJkN6/s|IqTM_С}'J2P0wI&MZDi9uQ$I$:Xn̢lQKølJx1UPӆL ) ReK(^J8>5lzqM99'afN}$I$IP'DÎ搥1T:'~UoI^Iobɒ(qpDSkXUՎ88kWI$I$St]VҊª=dӫ_#fT%w].euszQВZ%I$I#`shq4u(M_$I$IM I$IHb`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$IrV"^:tN}/?]HaK&=!HzBVZgY\d,ֹui396'O{~o|2榓Ӕ6M=B,I;MP#hʑ^=P9V9g~w%pą>296|$[.} _}1^b#/)'uM ?IH@jL[^tmogg5djt~vfI$YuWqS9qy\ڌ?~嬗ny\3v>S޻c~IS}W\i'_~#I0Qy_V] dRF QL{JN՚Mh.zszYWw'aȽ߾ǒ~;O|A&i7mBWLnI~$=g<1MkYN ^kCv߬UupY{=EiO3_46MCa\c-!8o;,yf]#U}W \kCH?\gR^*'l_OGI$Uu&.gŢg'5mm6vgqlq kg?0?SUIRd=s Ez ʄ%S&ȄKri}盌fiE-2⯫ȧwv'{magY.8wf49u_ @!K@t31m> 9AtIh=Ȅ-si Wf0'C<>Cn%)pI?xg2CLr^U-ɂ$@^h^{{mm{`@?x 歂YL5Vc]Y$\H'gtɌq]V'Rc23\ u!Đuy gp'epYG1Bsf0 |dS?;V2y.~ڝKGOd˩0 Epz6 (| /MFTVԌj;q˯=yL[Ft }cY?%@zW-ZR뗲2)u$5^Kɂ,a>Tч~e -iZϾ$:|/s!3ܩyloޕ.M,G^q],_s) z/GSyNHiLw72!aV$Iu&lٛ>id@C66SkVJ%__S7JQhJ_)q(_V?;g 7lzɊ/?cix=jF23o`kU/ݧSU|󌙕"+w@Si jsy*[=\k]7%uNGK23-D൵"hK P?@؇xzY&|.@ֹ|Ɠx66RTQN|B8)#_= Uf( O=F4y JQz~'IS3Uu\G.}wzg4} 9Hmˀ !jYgy&"bEj1ԋaPQQA9XI"D!K6#=<:]I<\=)M{EpB iaY[[ n~̭v1O/?>N~ϳ*S#Ne6}h$C?䨜(<-(+{]֔vt 3&yUiF0iF$(@wo/,%I$u+vv_?嗻>T8~{u >y/OP;*8&*)8$)Bû f]cyUpHZK 6;kڄtvB8f֢_b,Շ87fZ[Vgv'3 ,cYb[=+&:kkkdAl[E ܼuЮ/~$ Ρ}VRO?@"kG`:]gaWq!0gWo|q׳m zMjs$I \<1.]ɗ&変L)dw-nC5;` e\_u -hy| ڀ+!t\~VK/k)5u, ,dujgfEd(qamsuЮϿFߧwϩ:mNSYyx=(+>kVor4_Gb}> =K6KLam ͣiME;a\t+w֜fwrMbJa+£?Ą (Տ]L3dst$I$I:EL$Q/6P/dbRb-۶R[BE 4iܔpM`u[!|f{qFAعmPXU6!$I$IRhĐGu A7_3(2<+p6YasMʩ'E%7#e#TlfI$I=ԙ*j Y u}&^K h/NkDZB3?on >-{g=t ;LmH(̒YI^tMxrsk>^X>G7~:x}i]DG$I$I~H OOβy8/l8ӏ'ecs'̞pM<֧y He#g $&|=R3%0T?J^+_H -#G6OI$I$@vNpE? B0rJ"ֹƬ g<3^R]$I$b FIrrEE̞={ѣ}]ֺU5otnTSۚ׳i$I$ICV'eYXfkԆ.26$I$I$<ċ$I$I-$I$IRD1$I$IRD1$I$IRD1$I$IRD1$I$IRDUⲐ(I$ItӁU`8}U&n9M^xi ˫쐒$I$Iu6ڑ˸S)~e&F6h֐,Pm$I$IyY7DKbe)L϶]d3VŐyaOϦ߰{f\-oQٶ`2*N8k3i'֔Q9i7/S^Pڵz OF,QI$SĆ,^)I$Iju2YrKHr$> IDATv//=?}41gQӁ&CD73fPԷ b/B,}ƬՂ,8-;@x-`ayHLI&TmY2v@|9SfCcwXU@:V$I$Iu0 nl6E7iKLKqzoNxڭ-Z& WXnF UkuUJiɲ2:\1GMe@c/c0Ս{2ɊB!*X !6SHC#H*)(Ғ푒$I$W@x#yT6C沤"HjCk¢!^$PΊuTG7M6moa|fDHKIlJKCj*hb&=%v)kt*2c: 2h8)I$Izu/ ug`VC|HQF= yyS֙V`źJ*$3>@ټel&6VzkƽqxQ{4]r$U먎ΠM澁Scɘqlmwս,`qc=R$I$W0{gqe(aY,,,:m oaCE`6-_-'ȠMD h*@<B(Fo S% :y)1%8*Q&cqtK{%SY#AI$I$d.`ѱLhX&nI T7_UNzb [3qJ CJkN6/s|IqTM_С}'J2P0wI&MZDi9uQ$I$:Xn̢lQKølJx1UPӆL ) ReK(^J8>5lzqM99'afN}$I$IP'DÎ搥1T:'~UoI^Iobɒ(qpDSkXUՎ88kWI$I$St]VҊª=dӫ_#fT%w].euszQВZ%I$I#`shq4u(M_$I$IM I$IHb`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$IRg@x/s:@0q?c$aK&=!HzBVZgY\d,ֹui3;6'O{~oxJm`i.cn:9Mi4/䑹{Ū29dC#H:Ύ~<7^u"(7o5TNlzӗA55rN xznxg28Cmo22QL7Ndv_6~o}]Cп{:ȽNgK'xmGyqn20szχ It@#W3]ll}\1,N< q*۷,w Gȳc(>> lg-s緅}'t-W{$I#4ʠ˾LaP=5vM i]ɩZӱIEoN:8$ 2X/}Oq=$M5 -=ۏ$LcO8Iv9 ԉ!kxmh>9ּpY{=EiO3_46MCa\c-!8o;,yf]#U}W \kCH?Bϧ1hE.JÉ=ד 19v:MvUt̡M+7~CHARt=bBl|z'^(-<~-_,zU>ڶwär=rYf;_ko=u=Kn(dзW&,ǜ0F&\z,=K;d73uM+o9]@G>彳;Aߛn K>r㝎7̤̙K_]p YuМ̈i59AtIh=Ȅ-si Wf|'C<>Cn%)pI?xg2CLr^UdA\G fUýyжFs ٽ0SWM4 歂Yh5V#/;!%{su 8X?Y&I)s]C#su);%ӁDru:ٷ`ildbT&D}GABsf0 #r[\j2)c+҇<| :jM _Ά"|8S :_KS&о5-:;4frTNTȯ%peҁؚҎ.Yc#*91m?(텥\T*㢠pw(()i$mHt`7fwU}U#iA.;p|tvOlj= ✚[ WܔfQ;0oYٝ0l\em.g(Z<m[TuЮ/~$` Ρ}VRO?@"k)wUTssSHBBҋRT k?Wݵ7,("vl *J BHH?"뢗~=q=3sΜ\g>sn 4ilߟBTN+'e.Y*-8Z¦P6*|8WG3nC-YW~/?*Ƿ*PJגjAԠty?͆+)AZz$F=4nsTmV|J2NKE3v9lRU[̸3i%' h OgՆU,E|w1|N޷֌5_2zZmbɫrTIvjiS- 9mۑq+KmH![KE rabf/^O_IИm4sV 'Ubōgr;=%c=Rx*Em9X}Hf?xPd ,r/#OLe)ۦ,ȍB츠M)9wpS|ӈmqm Q juBZRK׳*.ׁNnEW.~]w*LaUP)sM *|aM+Ѫu{eT#2jDvl$>j忽V 8I+gَ匿7؋gjPz]zէ0hौݙ{_ֽ8#7};11ͼ9*It 5nYx?PII EEEfb$I$I€O {x.IaB?figv6geڴi@ǎmW#$I$I] $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU``UH,xu%I$IBe.3^qNaW$I$◼ʥǝDߧ$I$IpYPqa\\㵕$I$I:(*)7^0&v /f w0gZ ͵wCռ|5VN|67o B6MxG_mĦϰK2)#I, jst&LOO0o~£W;(AӇq1Hٓ(. N/\;$I$I*CSivyhoլ?sT`ɇ|+ ]\R1-cCypD *!sSqʹѦdqofE:ϼֱ*K^@aXy'dW58,NϼG;y,:Poo&I$IUVjs$}c樉?zQ\Ǯۓb, u?U63f,6H>-YUC8e3gfsJ ɋPktk/ 6/vFtᅜ}T‡őy(&LXȞH޻ rhϐU$I$.Gl$H|\?(dBO?Sw˗U!-E3?͏7ֈ:ԦQ.Ԝ3ߙH)ųVPiѺm_ڬpw ?-'Jp6.`IKO$I$);նoyYӏLagcyXrgN9v2?|&ed=;,&3Bz.\1Da =1 rXF~Q:%(3~Wʑь#ғu$I$I?!hԸid@%%%_$2w\k̒qp㳨pSj$I$I0\ÄB~̝̞=giӦ ;vڷ^ڮad|R%EN'/5)oH$I$ ~8ҪX8fERnC2jȦ$I$I/X*2<=Ԗ$I$I_q($I$I$I$I$I$I$I$I$I$IJ䐳s$I$I:H*X -Q}_SgER$I$V1of$FVY,Tb$I$IxY|2?yoCM9Gb{%w|3{%Y[ҩV%[7$naѧ߰r+zMhLZ*eZ5 n`wqbNV 4a̹l-IaCf:saI|t@LR2di{LWJ$I?2XnIKvS4nٯ⇋)HJM2v bRw@xL1C[З"Μܥte?H]KX2v&\ɍ " X67dvEg1|tnL|̊k);EEc%I$IT"6L͖p 7K۷5)S{, }/Zu9kI5$lf=5nj@wh঩VWa@5>7BI;Xj'EEYڔî"cݕL?~AZ!{$I$I+sU9VH˿eqA EEףZpM׌%fG&sJ߀m̟bJփrEAULbCmlHm]x$@-Vn@NSU{USJ v $I$Id|͚gcb:AIJ+Q)1`ӶyL"EPNԀH}:viDKL4di]\ӺT|B* Ս~-*}L&stD{$I$Ie0UW%[ɂ}JÐ]QHŭ{ׯzwHL-G쾝6Qaq~ܑG$!}Ƒ#z<о2gf9kM}Q$I$ (DnGnY,{CRr9_g[jk$RS^#$R*'s(bǣhfv펣J߳u)nQAx׮$I$IpYTLNªUoDNUhP@-ULP ; v I/wCc%I$IEXCzyxjJ $I$I/ $I$IM $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$I IDATU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU $I$IU¿Q#"/I$It KoZI$I$A|~U$RBń{$I$I,,%I$IV;$I$I))1׮$I$I:`%%$I$IR41$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT $I$I_iӦͯއ#$I$IU $I$IU $I$IU $I$IU̢1ٓ/\Il ՛vK$I$IQ}K`mD帀k16n_$I$IY r_w$ /sybu~6O>,eKBpյ>LԱ. j-pӷZI}.dDSrT`^zftk1PӸé3az37uA u]ƽ{~<"ekQ8ἋC_UI$IhJ/M"._PDsg&nk 玗xO=Nn<| 7fIŕ6ܤ7x97W\5Cc61wm.P'(g\p*Gg[s߰}t;yty1Ad=coyW4?:xy~Sɯ$I$IR+s#bsw3 R˙ݸi xoC1y5w!Ξ 3>M}dEWoFףz07ڛAe2"LjvUCqEg3ELr0| "t\]rb%9c>6$;ΡcKrWh-&WCn@8}{9W 'u$I$IVe. e_og~R{\ȣM؀]׳-/ݯ-]gyUsy'Fz ?1/ٞh_SzG`ff$/ iסEz .5%S1-"Gj Я[ du:#֦q.?/Mwu$I$IFe.O>;,]*k 9O`Ey0FB"A{!Z~!㿜E7y1>3?rE)\#H^IN`줙,\o?}Y`CsCXJ$IUװJ6Ո!uΫNBCԊ#5\=z[ZintT X7\U%N# HڴK+)Aیٸt [o屿[B5|Y$I$IQ,W.Ow[?c/1lwᦑ!N7GO`z><5"j|+n͎d1Ir(Ln!(ͽH6yUQRfP|b1Y=R@ߤXl'iwylKn ?Hy튔:H$I$EpY`a1ܾp ؛3Ze!6 LZ̃œOdOl9*5\€¦'pntF p,Ӟb;_AS/5+w[$8>~r$c¤jW Dh?$I$IR4 5nYx?PII dggsҤX&pP6XWO֏w,=H$I$E#K(tvi6$I$I*V$I$I*a)|1c>؆$I$I:@a%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$Ib`%I$IV %I$I={  b]QRRb/$I$IBĄAZ.b( D"&I$I B*6%VwX*I$I ȾF~ZV$I$I?3Qwj1*I$I ]B^AI$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$E+I$I$Ei_/1"C$IȆObȇ[~cLoOُ05h.kʙ>_陛ʍPBiuE?Z9ظ/Bƭ38eB-yjHli~i2sQi\X/[Ǘ#/YbV7ϜZ?^%=@c?a7\>I`YsiW㑱s,*GN+Y,dMyG}­U̠øF$~o7Ioq.eHq 'M! Y·TR?x߾V)o H;s5l/!e͝t^'޹4̳#ʨGxY>Y]A ;i;nG|&Kq1($IoWq;HVa>aͯ9Ȫ؀^î+RF׷U娻&Vy'ߝ'Ua's>4BY*~֗a{ WF*ʋ[ OoG&-&ќ7hZYK;/=:h9?}?-y͈)~&y lƨbnJnk^uf{ yK^xI7==3xwp7.nIJWF3vs ׻0|W2ڈ'xowH\,AEb Is#e,ɽs+pܵiNCxޤ+D3qz-|aGM}+odÆqRF }W{%I~Cqqyy9>q$ϠE|]/Y7lkI9b>?gYn R䚧f~ef-d;=E+P)=lox*2ξ};54s ڂIZ1GהN' g/6փ!M5/3-՞%D*$ݻ7~YMzJ&a`1L1g.c:| Z˼*.GSȎgTŚ=wJ\E=S " /g!LmF" Ƌ3gMTNriQVwt2Clh4b_r/\xʩҷc"xY؜$IH\[3u\[YTBs/Io^5Z[|ش OgHatS#6 Xk/*lМ^@M[F{l+Ӡn fc&"$n?۷XbXIA.vMR"rr -33 ( rfyޯ\ARaSQbiS1_Y-ĐB޲%IIwɳm. j-TGLNvDmT߸$#*K$['ɨCUHvw#Oѹ{}aTiyVx;jѲќ<T#&L`T&#ٹb 4C$f*.ѸCmlPP?"'Pڕ9{Sbث n$[κiX =.T! G]_Ջd"Sgg⯙0kͿ׮C̬aHV v~j߼‭Lww~CF-BtG },Y5Ev7PVUذhE>"Y껇u&фf͚ҸbXUҏHX1oØq08<$Ҳ[ *`eܸqɭo,~\,BFybXctxg1/1qzūvb $I6yi|>o觥wE2wm -O0/p G ~efUI|3ړ9|ǯ⌷pHj떱bg!EUriOLf`lX&pR)ғhCWrHnKCd[*((5vĔg_wbC,GZH?d"@IC崖)$s17{'>xkDHm܍OBB=\x|7[H(: K0r ]GG}cw'6x)*?k!)tlS/{}%\Ѣ4Gj|=u./W6$I:pbsw3emq5y4U{N!|(fFo>uﬥQܶ20u$\AM#K/<*)) "HՒul+$P&!hT$ZGOoV)/BrzSڟ~.ú;gucf{͐` #mʵy["u|9)^r1"$k\ĐURq+hs(hcH$Epdn:!f Go_"m[ O_|qܳ=zjLqjK9,RȲ (wcp_|/fBBҢ g ?ÀO {x.IaB?ngv]cN~Wv $?g`QJ$IRsV!/$I$II&Gpͼs I$IV$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*R%Ky5%I$IAq6~^XI$I$EJ$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)mIڴo7ưfZv $IrȨ]'DCA$&a%通W,YذJ$ %׻F0˯lI +I[oi#H$yoVoBF~C;t)/yWd:v)Tow ;ϣɗs(NAӇq1H>}~mĦϰK2^" ׭$IUz>v9gGlﵸU0z6K ~~,cM"CߛooğY6B_HBa_ <)}_. oq㟱gCʊs3O0rx[G3KzZBwsp{"uof#y6$IvyoS#/OJ/eU:O~~.ZF4$RYSjrcKz=%{_f*k +]F)Zd S&T:aC:R7"5:ͰΉLp;)`[SYt:+U 7>_o/$IQxR[pڠfg˦.ZZW8c0' 3v&"~z]kz0FCC,vPȊ)_.UsʭC9ט;>I1`Ѕ\g /Uf9 Y;ȭN:n*7~귪E%d SE!ԤAx,^k/$IQUֈ6ۆ񼶸|eiMj@.Kkgr1fK+vA$ v$FM.ӳjK>}h_+Ϙ]Y] ʚUd4EVVEl^ z*E )(,-|k2oo4KŊɥ5pspWD/ `+\wFnn$Ite,2bi>Mg|Y%gunuZ ?{:RZҷi}%#p5XNZ!B{2Y5 "X![ޘɺԫ^ O͈ͭi[CN`X<><.;==^@Rw@{ƒV!;aI(O*v޾g&TT$I$.JGQ%QVusJN&˖46Bl^Evz=2+\GfPf?|ݱ|֤Y\@udUuz@8s%K+Ѳwe6XǶFԏ ]lhJoy{q޾ELk॑WsZ&:xz_(SU0z]nkWk-IZ<*dUkN3jҬn+-AD2-K$I$wޖҼ t:o1~Z֦7Y|/:}:+k}-ZG~FԊ@e,+_i!׬bMώWn&ȨWբul?<2u?1K)1Eץ_V1yr$>~ؾ=kL, IDATIC)7zgq0"sUO_P7=}7_;pf ~P:R9t!GN eϨ{Q\Su7gVʲ UGxvu;ǔ$I^-A: 璜D8&:vfge;vzukVʂXZ! V_]ĒZ59 s 2'mAPwywoK0Wk'e袘qi] G&hqđT"I)p\{#Wąw7as&SZraEf 7m|WKY7tz$Hq Ҁ\}Ͽ7mt=c}7d=^UY:9tZq=R+Hw#-bR^P%(AVRDֆiJ~H$I*B6h ʑVq9(8 ٹy@2o(Vu( B"/o; ҈Beb\Cs )G]Q/ڠ[yaĹtCn|:r)\p(q@yiRiKLJU†YhKZPXmէ]S@va kW"((()NC&5U}ܷbsEe;QiȨ-i6ףb1{jp%G0RD~{\ۥd=cv@Y MӬSwNt:G:7$99'=zS]p>9,Ҍfm}GGUmL:- k t.UQQQA, \VpZ *v) XBA Hz$^@F}>kedNݿ9sy{PzFM?$uFAG~4iEMω󩇕x gN!LbcHTcp(Kbb Ҭ$8Mrca(k_bӫtXWF=ӿϳ.ߍV`[>Ep~Im&/?ʀjM ow[>791|)cߝ{i.qg剞R%m! wN2 +;Fcf#dYZGcfﬞέBn~/n+;*X{??ξh |›QNu<ʆG}ʇW';yF}6_eڸ) $eSYօ.y yQЎ!~%e6ˤ_|N1DDDDDDJDˇZy/='M}f|xlY#cP>uwǓQisXU!bjNp $dǃFv%PILdU8ޑtoV 2)VM!!o*/o3hPs||b1@mO9afb;͈=ygg>6|̣$eu,}D]mxPx#1X&* 2 1.kaB ]Vr/{_}NrV+x ߆؁ŞIܲx[,ZSP$WRɁ]d~ts$Q*Pv?ѴY>s8%n#faAdQ8;YևpU6 nG+T ҥ0nWk:v1!zwKJSՒ6}AiT-)f&cw y1ĞS Njmʹv9sM^aFT b{Z K^bc/s[v$iZurn!5T}ivN-;9 U!c+۳\8Ж8 ̝0ot"!\әqb^Ư>'8^DDDDA=D#-yFh?-+3]CC܁aVnX^Iv o3_ׇ=.bqZ~s؁t3^ڛ۶vRF];nؐN8^D㹺w$s[Yt2 V4;m'Є lE5(q[S+'/ ɌSD-jR0fp"7n*NDxyfQ`$'Npc.?qE$z6da/>'[MF *èۍ餰IhP݇#.>}Q>f>YgتZ R1UBS,#Y -3m Mu{GR9^5|pe^5S;?{p5Ohh JR38<!+&a*>gkgYɡg_f W88 K%Sp%CIeYIn&rϾGWQ6p G1释{m~|΂We㰣*Iy1)>ٓ&kD'&θ )5i{f"ŋ 1W@y&MC ^^9kٙKw Z^Id+; yoٓEp(? ]Xbb"ii.o I&*i+R^~ V[K5rȔf+_o2_({O.l`Ƈ7rw0\kyI`'ΡeW1/I_ }Opyh.2"/c-KgQufh&V"\!QgߚǦGJ O[x'y#xX<=2qJ6k0H=3.uμ[6o~ǁz]iʍѥ&_plz;\72*&c&&xT;eҥZ7|ßgB+V`ȑ|g,>l+WTDDDD_A=Dij8i7o0-odݡ҆7PX+nI df]fFx`#[ K{vi말bKMGcb u^ybRqOnr1u;v]]ټ*ellWbɲ {ѿ J/W ~Y\l?z % }c䇄$1^J~H$2/ֱ,P5:/mAh:5vd~u:3bAwXF>NmO쨤*3pem؝DezNM2m۶q7ĉxW>}:C aʔ)*+(N`}=q:`S+ mBAM:4EѨ|?F0B0} eHQ743!6>'0]]1o8p8ovi=Z7x4<eo8nUT &)$]rl_<˫Pi35|1d2pt:hҨ:F|&IiYp"y PUî xyy`ƌwAYY< 2 `c;(Rܳl'///}FŌ32d>^^^*kjEģOa@^8P쳬W^`哏; Ua!FWt7n`۞751pS}C3?o1-l7(Fa$]' ~n$ iPц_s 2*4 qΜ ~Lv~z*\;ըC>X#_RGܡ\Lh֨. j6lÆ j/ȿ}J "NX- #k?sl4[u>(ZX^CѢU0fߢy"hw_:Kgg/sY2G@&m fRg6&%s'=a;b7DRzPq<ٕ` %#7k$[xKp[Ԋ_ wP3%I|dw f9S7(FGw"e|cU[a;Qb5 i/eBv.u'ndP=J6-ツDޔ_{돜6fg5a}H">k*jmb搘KizD}b5Plge8: {bo QV_-y FC\PFfBJ?tRXXY[2MI~~>M_@v}nǾ"d,o㩤 FΝíy|7ccH~OϦpVj0P _mgibZ |11+~o0\CED%)4juDDDDDD4$PDodF>{kHmߞzXJi+ո_T`(]"""""ϡV""""""""QXHd"zm Drʿtw>Bx """"XH0 G@MC\v #re3u7)""""4麈TO{tLREou#//BDDDD<+Ɛȁ8f_Er8"盗jH͆ŢN""""X9wrF`*J>v.iH"h@VfӰ@h Dxyy닗a+d0efm!""""XH}H6M///xǹ#)|o>ȫ͛'m\" 4zw,zΊAcLnϛ7= ū`+,Ҷ9rt9z(1SN>&""""XH~H6Sxcd' 8pˢD ;*w޷`F}a2bmX]HܟeaH]8B>48K4/^ՊVV+V.EDDDD<>HNyiXt |lG5yJM,Q6heuۯ?Nk-둗G,]^1!'Hu^/P:6k~[δܙݼ 8w20|=aJ3I-" IDATՕ~ZuG&h9ی֭bٱ}rݺo`!qo- wM d[ Ǣ3Ň1E|4m^⡰ |gr;U,+[WNo,V}:R {60uLj>vRbwۍpf-a e&=×XOJ@iEm$sWD_|' |h[-6;(sl߸< Gus^޽UG(!""""")J4 #uPR8Gڱ;hbsp|ם`q V[ 9W̬1ͻċ#G,c7 -Ϣ9 (mܻY Atrzw`e24y8k'2t lp﷘}/wFoqM^.5:HNt^U~y- 2t;'B;,x)?0LA/0pU@>&:)"""""r6 DR~yyrJ\A9fc o@U(+lxBbhcfW@LK/ְs`U+r = xEy #; =qy7@nPG`?&3稛E,c#~ 89Ӧ>:缫G XV=/^I'R<KܦQSF~ѐG#jPZM(+#׹o/GzX7X3t*"--dBL0pbzxXP9qyjxAxgU"""""rN)JUvC߸F0^V|ӑnS[iM/|O _?G1,4u;yg l3±pݟNnkާ|e>l0-1'NV珝LJxIDDDDD"R70vYNrf-%21M!y= 26J6Zg uѿpo\mu唠,cϳ-.,E/"""""_\D*isÕzT_z-`_T0"i _I+k1`U:/ӹd8\\rO O]N:6` R ,Vqhۊml}xYBkYyI*-`l?O` >)΄{et= Ia—.ua)lئjHC,6ȣ!skzƤms oQ3AB;&tTy=r;7|:~Wo#U4ֈ>@ﻑQKMQ_up\dL>EDDDD/146Un7N"Ҿު$$ 6]EDDDDD~,VL``Vmcb:Wިagѐ@ #\GŐDѤ""""""""aXGQ`%""""""""ExV""""""""QXGQ`%""""""""ExV""""""""QXG"RٶLjJ%%E*߈_a 5NT9/JD*զIWX%"""7TRRDB| "2>7G\73י{g7׼7ϞEԞ,x!XE{,,u٧-sL$N"?ߴ iB OhhB{ iD. {d|Z 舛>zE jPUnO(2}i1&6^PmG\AcU""""""rYSId̕kMO"/ &dshFn~e^I;tFTj@M1z I vҎR%!NsÃ2rBv\v#_+o=ed^_} 9q[a?R*zrf_Aӈ0lky}wLھ^JO;T/^4"lR 㹫g}| 6EH6k~ن24(BlԨX^Wzk>:s r8o!5֬b?~aCXtϺ;}hl"pI;tF/%z*Vwc .Y(۹=U[?گbK q^H%*Ԃ4>E03ٗC.=d}jҨ5Ɇy4XDDDDDB*E@ {ryh?Iu Īw4"m$4 9otkקtuib`M>D+V~O4!۠8%<¢#K*3Iݗ1~!랞v(!=k˘+29Ûc'0m}PLy09}jtKY2]̦CDDDDDB$XrjTCcY҄f&XkxcO n%>5蛾?&J=*JM"JyvCG1o?cxۙśo9cRu-h l !C+-~㥗_ॗ_ř E1z3\ ˎxj.#,cǎsqr 7=ics(w[>!!?aϺ;1=wg`OW>'ٟ}'5ѓ$"""G?H$9~f>2ZTB:O_o,ܻx.Py!M4dBybM"P)Q@. lDN2w yjdfmʤ0ʲغ)ڍ (Y17w~ulDUڸ,G˧S pp!| _As|sk;])"Ii<7}>quˏ.f!;ѳg3Ny\;!+WL3BW.%+7>|lƻNo#2%g|tf<9^?g[xih|Nyb?{cm[Nv襧}i4fP|A5̛ dFԉG3i1Sٗi!<sd!Q(p%(UBR,e)%,"L`_qb;p5=r[qh~/ΛO1ٲ'tʷՋe4im&nN'E Ο}U}ˇCW9>VoユG,x|;#ӨJ}/jٓ9j4 a J7wïQs\^_NSKXќ6 R\yVLi#l;s O\NwJ"""-ZLEn`ZX*]^~6&sszX? L;"7QWv<ӨIqipBqdiB=asxO"CjAcl5iwS]?/3jX$FCv6%`ьAz%"řq|w]5ף^ǚ@6uG4{\ʦS0$VLx쀫eLY޵;-lk]Z=O$= k"]TFy/Ko@L.VG0W$AxOIgH-eUNk]чA[X v2[;v7/{ )e?Ex?IAqmя:MqLޖi=OfWI0LޑtoV 2)p^v5'q=Zr`Ug>]Fuw# ű$p\Frq4hNcۦҰ 7aa_`"ZGJTxUJVnaΉ!n.f䑮ۛ=m;5o;Md`WDb'n 77'] nK8 Sض!LJ"/bܐucT Nh^ӏ6/.c؂hh8^~p$Mw܏C[өzW=%52trI>;JOuEDDDDOS`%"N &;# O-l N0.ۘvu,8ao?zDZQxI҉qGq[Z} ϲFdK&^+^➸/Id{^]4$gy顊Y8'Q$X11&Zy1ii+iQgjmzFVmq?t0'7VUQ35Ѻk{fK&&VNIYvt00sٔƴe4F<#>2u mܔ^_rMf~PplZXȟJD<8cr9kbCwpmtM۱?&Tdm՞&9%dc'"<ѺW >]T J4zO3u}OowbT3gğm")Kfu׷->("xEҮ|Efa`f'د֭Xf?`=Jd"89^A* ,*x_:?x]ر6fweF?։z9qoS*#!˻m-HBg@Ɛu{Jnٔ&؉GQ`Idsү'@?_m#>!DfC7󃌽rZmZG)9)Y("e_]% mN DUDք""""""zX1ӯ72DžۨEȺ`Zc&WGGHP0 /ECd]P:v ػ>]*mzrQQ:~p Ti@>0;\ذ~ p_Kg{o嶮!c'ryףQҴEEl͸Q,Rn/J|qAe= &DiG.EH| vSCnׯ_U%u}Mt3o*IYĉP{*CtFeQX^TΰS-[[xJЕĎnEDDDDQ`%"o3a,fv,:~OAϤx2L 3"<2|~niѝhqZ奱[Ys93I}e􌶰5.lMalX#zL)%ѻu'y-GLY1?=2ֺg2ts*FLA?7`i9wun>p]'gӡ ^x+qzG_Y.[fphKQde-4ڇz'ֳ0hQ}'d_;W Y>%Jd{A_a4im&nN'E Ο}U}ˇ;g]Zf>Y mT OLRg,Z c.>,5ȿ?ğ!:~ """?/SD[1XV,ʟ*/Ϗ\{a%"G3H={uPL/,Oˠ2grߣdFGQ`%""""""""ExV""""""""QXGQ`%""""""""ExV"RUCXH"轝JD*հ#TCXHڅKӨ(T?FE1{EªHeԉNT]JDDDDDDDD<+( DDDDDDDDģ(JDDDDDDDD<+( DDDDDDDDģ(JDDDDDDDD<+( DDDDDDDDģ(JDDDDDDDD9 ;Iihw<<>xelԍ<|ys|z bIzS6ea72#}7gc_e2{ @YWr'gSDd0ԇ3o^RL|jE[g0lv=87CWϫ'4p'oW #QKOf&'MdOR^\ȚB8֊6$OMm0H\/~b\m4-{ylX egF.%A4hy1c' gwKϲYIDATjy|Lיd%Xb5vj[T/]ܶ诖n*uK)%"XJbe#Lr~$[ݴaھ<|99{k&3&ER {n9r(-[/W",4J*X""""9DĽJIL6%ӏ8#OA6VϘ݂qc`X̣|Aja%1 vk^-<{Э'WN1INΛ9^#hO,=fΣTnt w`A؇[{k1wO6u{j&>xMl8< Gd*\M&15Y9tO)ʇQn!Oh> lT+2d<VeӨ[ę il5nap F|zZchɯxQŋ҅KHHs\K,QDDDD/A=DĽ8ha*UMt~WXsGE1d4fУMA:}ìK,uپ %m`vDz)_ &GxWYQƚLB*6-(ݘ:n_ˆ]6=6ai|j7j /_l]?>Vy|l/=Zx VŰ5q46~͓:Mz TX珞U":mP)\!e47! mfJ?^K^[ѠvaCiLzuwma;Swlٲ}c=ĉ2d_V"V}{d3?\\.X#7k DAM`|=9CYЎDP_LG#8t:"~ rI=r"ʗ-ՠ*cy|0}2ptz aT >!6gn"`Z>}:ݻwg䐝K/Dll,ӧObQhkP`%"nyoɭ܎W$"c_?'95 n>T _Ũ3)K Үe_曭ٛ'X48'vRV+g&>>CٳZ*eW"VMi@@v4Jlwh70ǝx_<䌂]F*o"=섇Ew JeTMa|r}+so* sk1aU`b_dPlk);qÏrepqvPü0K]LBV$ O@?Cx&Gְ"ttM?J?+r%|}}%'-=_Ϋ#˅kH]ήt'VADDDDDOCED.YDz([;ݡzXJvÇ jR,?JD&sgSDDDDf("#*mt3bS`%"E0 D0ΚCjQF6HM=ʇv)""""4麈J61u6a"rŴojU!DDDDĭ)"aXlDodU;wGs8(LӖͩP6 EEDDD})ݕFv _?5ZkK~^iH"hZx{fӰ@qk DXV<=Zx\ X:W)ՊfnaՐ@qs D~H6MՊłnWX%r?׾,qW DHH{qϥR`%"YDDDDDD܊DV""""""""VX[Q`%""""""""nEV""""""""VX[Q`%""""""""nEV""""""""VX[Q`%""""""""nEV""""""""VX[Q`%"mfADDDDDTX[Q`%"Esׇ5~ʑk:t}?oW Òn5Zy;.&oo 5N]^dUm"nm>~m3 """""J "DT [5 l2s-b:i3kѣx5]9K)5vl k $H=,$ЦDIDDDDD܏+%9ˏ~'SyH`ƾE|λ\ (U 73=v򟿿̬Z=xXÄ'1tŇCX6b*ߜRdz"`G<׮U3W:{6INxqwd. zڮƛؖ |50m;EFvtؼI4Ȇt2 缶Ncj*Z`?'oWfWgGOx?CꕸڛF SXNLֱt3 rr9g;_: {bIa+fVe:q֌,5y1>vz;Uny 4$PDn Ӝs=^w?͸;QvCQ+oRd! [PmBޜԚݩ5oO^AگaWdz0#ƠY5rK/7U{;՚V-$iNBZ,~x#g[2m"0)10|$&с\*l'yX&ƬI|0Q}yEDDDD7Q`%"r4=H4 Asr^^ lH:eZDTfwQɄÇ]m33;D&MMMA8V9_01)Femؕ.U©ء NLu'xI\pTshU8ÔY LȷN7RV"ȉf0kH[j]eNدyg߿u'kԙUдkfeYR?7YV^0f`ZYКKӢ9ѩ{x>䝇(ްa&;*Ӡ4ހajN6!ϯٲnxM4$PDn3m_ۃÐ՚ذE>d־% w.d8] b,^ycCSd40(,Sp\G6GE rtbŴݘN^ծ;zMk;N2̂Ǚ,1%O*d qly>K\ ^0p4y rTeygY:fsf[tY\mt$++,?ն|%0H#b;_W8qE_."""""+%jиq 9f!v̞ʊ&C>ߝŗ2u^Yqǿx D%e f__N{e8Md346[@6!=Pфs&ўl>gkdofV&| iގQ|ov;5ZAkYmO\Ǿ8{!#+4 "1#',/||E\:uf/LKciuӋMӐ@%<, {-{kv&MX˱z0lx/odoHIf.XNN%̕qə~.'z ޛI5n sÛ;ԠXwYyX65^d797h/QZm+7UY}JDDDDDDDD~w?J\X DDDDDDDDo8K*P`%""""""""EJHK*P`%""""""""EׄUJDDDDDDDD܌+q+ DDDDDDDDĭ(JDDDDDDDD܊Q)2;,JDDDDDDDDn@ׯ34$PDDDDDDDDn@| zX]V""""""""r-_jNAIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/dependencies/image02.png000066400000000000000000002024011461403617600245730ustar00rootroot00000000000000PNG  IHDRRursBITOtEXtSoftwareShutterc IDATx}\Te?  "@Ø&hin+V&нQ`Z؊vʹ3RaLFaAf@a}ޯ^pf\\s͙aCp.Szt?W}Ucn%k6}0'!ΩJHb߼$7DK|欥~sV}eZ O[!1yAjp{V6i ר-Rjr&0#RQd%RUҘxc*ʸ)?l}G0JOf#ƭ &%j4JO/4vXD!-U*WDF kifJN% !1 +Wʚ3T<ޜbRR"Rـdp{˝=yH2u(Șzȶo <{겥 %yQoP}껺VrQvN\dw~ H0=%~k]QGG>24U{ډ3}+C;(KDƭk5'%,Rȥ"jҗdeu_"#C"[m1y:{CW&]OnP I!2'5۲3 6SQD 9 3s3e6g-#"*cp2Ite/g6F׵{:T„=6=c6$YѠS'΍  - ww~sƉE/tK‰_|UlVKZJKbG+uV,aϓ匕E3jRYhGYΨېr@(4B.e94/3wEƼRqtdTdnHVuOZ$VnӰ=V{8A^uDz%.Uʥ,YZU^fFH^uۢ+s;+iw#saը5 ZmV2CJ*5LZ(#jh48}@e90Ņˊq u:u^޿?x(!gC/~ZdpȝN=X@iɳOU]mI1H8?=/ΘgRNU!Rof֤ D$I[3 $ tmHYҘ^b4/C5ZYĤduE*{j(dyzFjqeF+c)$1'C6Jo".!+{Q^eaϊD4fGκ +gpg ztj뿊R[x jռ;͍ ˹Tm\ eT@0Q7um&Db1K(cJ+sr4A-k/"Z¦҂Ȭ+Ԋ#cB(dPC^zv`2hT0R;+ڥ6r1QhL(@m0h7Z{\ҬK^fnb5Uɠ)QPlwPZe [ৌr, r*-=밝"Q_t+U NF$j$"DksRHߐ,2BnIUn\ʮfD\SeazV'Lo"[ܭ-U&9N\2xR$ɻekīJRψڔobSSm[3ST&1)=e7Z{N7єA˕Xu%x!ӗ-ntk$xuBeRI\0"}uZl*ugx"."BRkR4lʭEB]~=/MZ-[A!+\MTd+=]mTƿ‰:TshQU\t_A:gjV*տ˃y`”Mɚ#VsvhR6w]-!>.5+IDMFVUpi?WYT,Kcե6wNcڑB K3Wv޿krҲ9ęeKc޿$ ̷Gq°DOYř[{~C[S21 Vy(XFu.cJyOZ!= pW2 Hp{L6)@1U`o1~WRш_p(ϔUNqo<>>z~&y[4`{j &6h=?W[.sܳ'jkiŰEcu?M5OļEV`Ȇ{gڂy-%_ֵC5ܳi1BZ}M5:n^5)&F!}˙ʡC,ܻIh|c+ pa]`8JpppC ý~ݦ=m8fx8ris={>R|uf#wdjA"Q_THbNFXҹ&}yq^vN'O/Xcjش3 zвtXEvdËQ„={gML-zUָ+=f2;b!!Q F\!)մ e+SRɸ2[CD/M[-/MO/4fc>꯼N\#1[О8b~qz--V̘iɶA_8?qen|J&/0kn`MZȠMg RrhfjLZ9+\-ջ]k}P:#_ZT8ed@ϋN}9B1k(\69aXlR⫉ Ugg4mJ_g)SS  '?YlDf&=F\L-H`ziWT!Iq4*يRb;,Gj U&Ը2B)޶O8#e]7vo+{ޮgOpa5 /,_&A^#nؑwQnaL"T^ZUyؘl{MDd*+ˌj^9)12Y-*\C }0#ɨRiL6"ɠ"~"L*1.*\tHK&J#̂ޯsxAb_c=&-y|("j7Xe0 ~]}MKITF#'ʄ戈3j{#I$ i-fjojN1¼jsJњJm{uI~r֘pGK X![E1?'gq½O.#&͚QuaпRH(TxOϋCQf>cm}+l+ېMT)#b- KNRj(9z.R),*]Hf j4l`~^t'/ HpOh46=xtC#{/ ;{AR.ger9C&~2Q`TDIȸGa97ěeEڲ図"teGȭr*9""21#.JݗZ֮ ~b>H$ pB3 {AoD,RDq+#MZaD cYVe˳ HquAQ rJ' sKMF#!Q9yHJRVZdTJ21#Ċe!!ěZSHC.?%|Y]ީ ^ Aj>k [b8T\yYXZK7mt^T2=[Z+2 }0Ǒ$2>9V)&}yaƆ_L-HQJqfU~etTSvBȤaU?besgY7s+\xp}{x/wa>SQ@D2Չ[-uվ:ܬĜ Y~|շa“Rجشb^8˛?=9>u<搞{PW9ڑ^$<(Ce{+22P!1,n(= =  Oً-xbȺ <PQ--2f+ZUQe!^~=u6`{d%C:# <=&-y|+hhJXS"ŃYrbm䈙rV w-vs-Vp(B-]!rC== =  = pr\]-Z)oc[+Pm!E{${؈  p4r kR;Pm$pwwgq?UU4FN:~R׌x0½zff1՜xqní0g۝\F(6"sG[ b8CP1n$ghi%W4ikv== c_OwvVs;k?p = == ̜Jϗ2[ ҅[?NTܩ5k$nNߎZ?y3?7zM z1_-~Y͌ 8ZsI_~]?7N<]{?.0?)aB.Q8'+tBebzr);%@D$ _IM *s?ˏ|u[GMOfu%|&<9o]V&]On|ZMJXd9ce2dafv WN024.FnSe%H\&!:ϓMFmQVZ70F>?iM\DZ]M^821P//(P~f =0b"8FSM7/vnWD"2_y;eڊ)>]mD#n<†-&o'mU/o?c%S̚o͈&8k}cҽ&Jdn.LVHsYx#nc=UI_n)1ng JU'TX"$|뗮5g/0Jd7 ) y!zd ;~xcI޳9, ~xh"lz-d3@""'""2η;[$W͒+q!JB8IQc#VOoc钵戏̲S$.lpkN"BĘ@zVkpB̷|L[kDTt)z$\(Y?nIgG_Zv,PHfW55Gଇ7Ls'"җ.ϿF=V=PN F}ւ7/Q/ Fm!wEb OKش)SlȩԛY5))Ĥ>!=Yy93Ĵ!gCR$'Sv\~bF-hYҘ R8M;<6=u0+5CkG'rIsDĊҔTubF"czRjhr(IQ OH^$.JOJXEPvH|j1'5&_&)5k/oED6%fRh\Rbj1>Q@ވU*|y6 Kؔ6ז2w@g,ķ̂^p1N X~W*M3zV<G "3~>,]BdB[ g0dmcME%4vdyO%O9՚=pew)”ڕ쉄Q=iT< 3FHvl3 ' ؅2emʉf[8JՈfN*5T H$JYAҚx2M#^hL(@m 2l΋\YCc#2dE%EGYZUUyI%O3Wv}EU7~7DDt0Qw ,ViQ5OD/C <ݠQcStu}̍pO؈Ƞ=fD(9|]y3Ljf>lh>̍n>lۘ`0~z55It;;]ؿs~"7rb3/I|G{%Ƣ3'D͇?8.{mbp5 뫭X6ϸKk}l9tJer1"6D|dr qMu&ט&ZBO 9;٧fI;DtͼА)c]Aڮ׆-eּCDD%$^9٪ ûvyEd7}Tdt={~~uձv"ft }ցQˮ3į転WcDd=ki7:\O:5r8}GDtRc1f7_ot6lēj?^|i:ΏAz?Cb@D$yao.`ۣhOeGԶ#ŅF1;:Z?-^M\𓊺Qi [2jPOY95m0JDr((0)(fJDG<bY\ZMLTh~ʤVCeצJ#sfmf0I)]fjoG͏IMA 2!HGzl9a'"n;w?E^;o'S-{$AW͐x;Сv>a牸;?(Ǎa>!҂+cr8= D&rM֮ 6AY)#&|T1lّks֞8on8x=M i+nc=Yq`tAozsv;O$tI J&#_1W1]j{mmÖjÓ1\s0~ٜY+vk@4b}e}|ٮ]5N؂**^ҫϥv\?*/evyE&q'Vx𰰳I\::"O$跃3qİ]m uupo[mI16c^R5[jL;C^:{V<2I\Uu~1'mo{ތnW'ڈx<$DRR_J&9N\2xR${o̴ҨĤxUbIX]`rqv(-C2ӣgΣʗo`O>ܺj!Z۩Z,VbYxrBVl<e2qfNTSU*IZ1TIJdC$7<'lGAVZRZO{zheRQwbYܯ&oBLJFm=5WKL+a9GOI7uPJl''lfCKcocxK|;z Qa^(H7%6o6n'"7l"Icos:jmc<Œ~Sn 3BD"o: QLO}kىtB?ڰdx;; z?8\mf{u6̈%7Rၶb!%fl諣'o|Q@${/[LvHtu!krZ”b"b$ KC{9I˲Jl{ la !2,D&96V7<"\&dʫ ~k2L\ϯnI"', yDBl5險,,6cB"F6?6HqCdĸ0煂Vs5|Kc/ظAZu|Wr2,ǮW:GaW8C1EtT949as~g3kz[Yֆ]YikKWgY֕q i1,d4hJYĜ 1] (!Mq);:÷(g2)>`5{VuԬ$5ZUXYʴx嚪UyYedk^%NN'ά-SW_1^_675kӗed< 쀂pS u^CWt\e@e:]fWӞ!lzgM %n/<08۹/U+c[\^V ?whƃܷeD,lt̆03s굖<5ۧ>U . 7|ymŬ)"b:LMc8vӇ_U\|LuOv{p/m皏.`3}"7+9KCוO]ﺍ f!ZbD0ܵD֯?4/)QMDZ$0m;?+h咅W ۹f~ۺ ߎ6e,#6C};:C G:>0Gz+Lf` Κ55kŨ;TRr/-'k3s߈Y{.PwFԴ3~:5+)o ׭]6%va6?r|cGzJ\eK+P&+8n3'/ȄXe/ͥyek^Wf` in/bۿV.a2^nMH\w[P #`o|YəZ =w(= = r+Lɬ'?/mDVo<ȲMVg@x՚2 SVahb\$EsmӟT?^.M_ udzz{)fĵAQS,YͶPpwKZο֝NgJ|{ٚ9]y-KB6`rj%~g*-Vkc:AKF%OU|3YgQm~=.+|뱠]ѼwMFnXwsP߫ө~/&st->옙fƉ~h #]pӯh+Unhw3͍~#?~53ӽPW7|p5e%rT';gYeOLuXV_q9ަ2_|ZpΦXt-,f =tM{{s'rFDxϭW*_bzqEn7_W?͉0W4o6EM¥`#Naof9`g]G]궜z'Fbz.#,aSnnz@-vC8OZI3s{ M?i[ۍeʮfl76skPs?o8O.#nkzM5Cͧ#&VQ:?<h;uŸ?R~kͺf]+UXk=xdӆZKKjߵ\C&Z p&"ƕ^d4?MkSkFsok%n淋MvCn9AG:FVDoiL+P[Q˹}UmuMNacǹ^;}jѵ\ڏ[-D|"ˑ MG~:2>b̬;w|x2Y7 <<Dxhkh;}pOK8dXN=hdYURLs%u s׏~|#uY9&*mSw޹b] ?=O]ecZmCsfͮՆ7?bh0OFDyO9"@4/]:.a,Cz3 WPVD**;wx'E {:]gLzc7K(USo;<@m$'ka?5ՙ7v~޷7vM9W~E'gjdHѢ}H\^yվ58 #"g2Mk} Uـ _.=z쇗'hի|BNF%s/yC]jRh-ga }gFhzNDG]Gp[H_cE^m MM+Q/`Z/|+o#h$+\c+n;.\1Ɖ$t7BwGNվ/Z8Kw^=iyk%iŋW/̎ ukz3S{dа^v('4ckOۼpWqЏXYu%徟98qmVOR]odI{*Lq39^mO2}~b#A謱>r銑2*Ƕ?ɠDM3U=5~\m= V:wO oAK9l~!!K\͎ legouKMI~-CDMʏO,/YZY{Ī3·wyBjrtȧ5qاC㙋&wdrȧُ/}cD=_Q{8hyҽS{G]r'Z>+tji+pԣBouӉXtQPߠk].zpc7e\[ǩ|[ Ja>/FbW2[~w  wD_Op%{K^DmP;3FʳR@+[725Ԣz-'${O^߾yxۻ]HwC;^kU'-3%ќ^#n$p{9hXnQ#˵Z-v!P$ݎ 8E/ z~(6բ\VH85yq Ľ3G/}s9D=ݺt-[T9{-~ ͺt벟uG{7k׏=(S^agLX_;uݷW!7Pagrv{zm}Z u6N3 q3;_T3^Z g>;j.WKe-S<Ͷ,|/(*?٣zO( ~gtl6la#A@x H%V7O-7oMTĊjJ(*%?@6 lT|9}C2%ZI3w7۱`)}M@ nHG&p)·frxw+-QKk-[:qM5SmJz/V>fӠG kTEgI%'eIˆȶ?Z1mjxlGFYyTG^o[ޜoz6Tq`,v3ދR*-*B3&x,}dRUzJU-0zo+!r: 3_~Uپ`sx˥tJO޽S7۪=Z@HҷKIhtV1=L W:q`o0ݽS.=]\!hf"6̜yzF7TɃN| Nlc3wG#*\r {_Zg*bZSb2X"@顒\0H~h֖)UuO:C6JYR do.!>Yy? QL NAZZ~a W oGcjnW⣾t=? X4q·htR̶l+ފ̩I9z!kɥ wm0o` .in\u8ۍ]IN-ÿΉy-`AX !k?}Sgb7kμfw #0iKR#0p)Yw 3 %*eNsmh7t`b.i.N\ou+ԧXo%ڷ [i/ r /߻V><" 7mGGٖq67ׇq9@ @^9!Ԙn(7ln9t+4&/'w{(wPgq1Sc>4sWnYE^´|>} J׼tQ<:|))JWE'f$n]w2?h,<ᖖ:ȼ?Xyo6F& 06p1&#=i=6Y d Y|57vgb\J昗6o ^>=ل]nuT/YյW֩vo&v`~y.)1ٿ7PZ[:0)%{J6wfܮ_6lTΚa_P͡a;GMИ[ `Ϳ_xCh1?K dq[<>)=O .}eښU7:.vRx NY1qʺ>`V1=fCѺD3!!+!ԏ~Ҧ;퍈y'^9[~fG`j#Ӈ?w.h]Vע^ hry+|~uޛdsjchiVjxd8kU"11kτ=HUI} !~Y[nK;YR n~kh"ºC=5ޓ)> @S=(ueډ3R-@}5!젠iJkN{>Ss&r^@!_>Y³!JvONByt: X-2^(Ԁ0>􂵋q27B@[?gnŖhhK!{"S?H'ߨ[-k9[%.pX^V(Yc6ǁX~ K3tK'!_ 5h;oM>0n2V:1ԐPQR(V[n *=$/ eJѐwZ.=rSJw#cDʓc#2>^Ȍ-ZAYo]I!@STW^6) sRUU߄ }wfhuxhV"r=!&ՒiĀeVi{e70 id#kI &F-QPB#'AieN\la, 4!9wO1赉d-ݎpoKmqw鲴CȆAH3vKMO]/Zwlif-vi~F]S:S |B_ٱ;%^q,X_7teA.↜Jmߪ֖>-DK'oWv)Υ3;7ajZE36H AOpg2S=lX¬>~-/SyiY-hk,Q'ݱh:yU Cr;ϩ. TDOnmT(:}jFI -@1d'垲wK y(='q"VZ>&E3k[C=UB@-:LueJ4g)͗eP!L+ɼa{MК VuP`|l%..N9Ubzھ2n9je~͒e]ýrˁ `e7*aK-ioU$KYUk!v|jkJg.>kF5++[b0b?$U yVPZT뉶PZӵb3w{@ч{8d x̵N `طCn9u7j['؎?n9yȚ[7e^VlyVҊCjYݓ\6=B) KkC6UO4V>\w|,g tbuœZ{o1:Ǖ征^ uf2JJہyܺgY1I}W͟d`ng>5k(Lӥe 6Nc, FQ2H8'v`zK>>ƙhq%ie nޱSp'xc*?99ƿouV 2÷=ꤷ{]]_2k7ǴYncmer.a;zE JP-sn,;}ihmNy٧Eg{ڵ. -ŸZ>þxjK56G=&襤/k혫4.o.e2jaf &D;+V'>\KwmxC.Eŏ˴k'x:/aJyi J!˕ZCpChj*ŕ<=YՇe:,4uODeE}c;'d Oj3xVw "y[VnfzDtC2i E??i ٱ,Vҩ:%VdU@ݏIFki[:׈> P_9;Jj*?97S9fLqceDqpWύoa ;y~BB]?Ț#v?(j9c~K&ax͵j7 ٞ[̏1 n V7]&Ԟ.z+d✹n| Kx8#sT'l7&{3 =V}13Xrd]g$1t3m߰sRGB5n9ҟ[kּYG 7m=G]lseXOˀ mE !B}=SV8ytG#(nv9+ou9>vRS ShkVllu\>]R.ի-LXtc@\WG;s@Q}VIa$*jSU}LˍX,SB!42=!)̑8՗W>qbTovԳbcbɛ)U*&{?mͮޒ@c'̸R&CDgFF/1<â֚Ҋ{_)=c=ƃʫWQV4q.wBPpL Z 3\sZڈ%_앫4?mXQ$p,_glM<'"%N^5ʓc#2nHR!TTWWf*/ύ,<!BtB}N*IB7!*j.Oms>hbUe\e<PQd's##"v̧)3ΞmX: ϺqB֪ʳ#B QփX}vP{@/XkA[|zHߓD"pWˈ?{xƹzgǹG!JlޜGL O|#E!B)>!BI [γrB! [B!q>nL"+!B{B!0#B!0ܣA{fzf%Frx(*,Iش3r+0B!>)RqxqPYAǤXsUu;Bbe# IDATܾV\^sW`B)ln9l#2=TFMlfpRtͲ꫗_밲*ڊ 4p_ }pOOv ;of‰ϡۯ*&6z䘯ffv~[kw,C>fjqUoFx\bL 'F΢='|;nCMIcwM9ѓcjɘU Y`B?kEZ[0¡3A#,hiT(lF,b\ IlZw&9W1puNnA n_ȗ@C~ZgsOI,)q=B;pC}ռf%[OST*WuyF!K{ڸ~T㣴}A\4Wn=r]P?ӘCm>:ph}?TE%2EMj%$2/,d nTw:cYV˭'e_8+.VX ;^z reB!Fz=ϾBlk<LT =Z[=Gc^YǢ?-7`3|<`Q*LrrRg8m0iQ|Ʀ.Ɛ# ]n±3k1i+czD=D^3-0B!Ј5Ȗ{!ŀI 6ki*bDfftM\E`u? LoAt&TbeUEHS>Eo[ZXU.ҬLh oT G 3kcugw}KL ~a Ȣ/wRu??Km}U: B!T澾ް˄sߥ]`Үm'^-67tw|J,ֳE& B!t v{s\!Bj4VB!B87REbB! lG!BO[(>B!HrB!{B!{4hTVqLLW<ĨA4#6#vY/e-ّn#w}h峏tˬ]-?t֗Z|ѝ$w]/!BP m ({9~ ^Dm[cQ;-RV{Xџ*dGw.[VGlxܡłܒru?6IHy劇nxb B!p\]W|J1d9.VfFt4%Η짊eF=п5dGb(wUr$'B=SV8ytk\l&iL_͡Xݽ EKM-LAS[=Sxqt=BS[sK&tW~s&,: qCu7M:^#ɟ(3Cq!؟$Fexa{Z [g}&euy9iU0{Ɏa;nDya{w*i<(?\RdJSP6А*33|rn1oስ8B!pOH s$NýRxf#`W+3!~<n*FkI=+ s:|6+7STL~ۚ];U%upB!8OXq1LLHA*GtFZ941$">ttkTCtov'}no*CzuGp1pWM 9|opԱX1.ߙHhxIt\oFtV߸@? ߭). T#<^B9Q\'V^ĺ8t&h-jB^ܙZڈ%_앫4?mXQ|扒 HArDȆncqID1G"䊊 r%1,r!!B0q \>4ҫYUX׽H K9$ғ (|$ކL^eQd Hhh4*u H4$H  i,B!0w,:$Y9p3h텺1㭫7cgf/xf{|[m[C [3<B>RUJ\1ymc[{E\4Wn=r]P?ӘCm>EGp,*ڒ*us-}[vrCiB!ƹXٽՏk<LT =Z[=Gc^YzPdM17ϡ2XJvINND]!:,1Lǩ(iϢROB*$D>vIy/qX,0!eR)fPB!AS LL )L P,YN,WfNs(w-ɝo(cem"dJ,ZZ,zr<}*Ūtj;ZyDá.JI<̋HLAU %;Bce@8auHX8=SBi8\RgtX\Rsn L=]uhZKO=P= B!!BFc B!!B!!B!4Ԟ>!B!B! !B! !B! !BG\]W|Js椀W,uǿϹB!p\=F)WG6qDknZF!Bhć{BR[xZN<*ڻuj\jB!(f3^rlɿ$l:F!B9v1#B!\{!B=zðM#KKX2vVYHB!z½,Pu熙N g.X!BpO10110)@f:M\E*su#*죃B!Hl wi1#B!􍲶Z@!BO`4VB!BB!BB!BB!BB!pB!pB!pB!v661*ӓOI:LZ/΃;E!Bh${E^2q1K\UlAӌ!B Iap\.F!Bm1`B4߮\,T갲B!z½NYYlZ:͘@ʑX!B=oី}vPL].IB!>Oa(LFB!s,B!VC10110)@f:M\ELBVK-`hf:"LcG!BhX澾ް˄sߥ]ۘ@ۢ]yjB!H!Bb4VB!BB!BB!BB!BB!pB!pJlvoiŇlMþSotB!^3kަ4?p"+m:QVg{4Wf=Z_N,a$l ^FjsB!,=SV8yt0Y+8Q 4=0b¯Hp%K],-L V錄*@q* )UUS/.jeEfk S&\x5'@[MxjOjǑ̈́ g_Wp%\d.>[ LܝACKɥ7]d9f>\\%G@ȧ»@5;uVUά*#oƷMJڋ.芴}:Nc@[ҽXvs$_x1D^$?!B  }pϞ6NyЉnGѭ< 3Iz5\I ,h(?^VLv ^q=DS]"7mZPvfaowzŵ0?!audݶz)oUܫv,M3/I60-[ 9,}j"{nAcI{ֲI :MLFqF 3 ꬧;g*RԪO,4k~~|U#פ&ߗg*7~[AX!^o59V:}EsO|s+nvG!(ب[kṌKFgComSֆ:-X`U*$Apbl=}e}B=&vBZ d5u5²?v,ԥv i -ϦYOwڧ7MOBbT*u `1`3gL3ariwLF::C@'=]ڰoSe7nK/yk>Ȋ-)1J4T"Bp=3Ve6+oK0B,1!F㾌\&a{h4xхG`B&Qu?תWnc5>3'@-DB=1v-d~vzXѸMwZ?qʡ_H:؊tyn9Xwat}~*B!hX-47vجTf8=s ,A|PeМ zŞ3vS-ie]W`dmm%S`J3e[wt16"u]uI,&Yvt1e[vR(k{!@[u*pH~G4N,_M}߷<&3xu'ZYr[3"LJB2bhd񣑡DPSxEf7k je詭 $P#T q-^-/[,\,s[k\L+d ;g!nXtlU%4O)0cQҸC "w-2ֆ´MȊ cּc(LP\Ro?Xc^M%=34vsg绮<7x2;tyS~ͅIqP%N& ׊}YڞGϴgi<ԶW없D!QփX}vP{ﰚfcfD5K Ο!Y52+j?N]EK=ӳ }~3+ eSj ʠke&]'Ǐǔ=~d0u:ww~}2zȻWCB!4PlޜGo1ܥW\I]'&L= >9@9=T];%F=B!3 ).:gsߒpS&lv &ud_ZWFP߮~ "K7"B 6J[B!BhUB!{B!{B!{B!g :gwuGlAgS`y>=irZi[Ϯv-_BOspG_F;3GVs|xn~#*A(3ɬפw9(=_K:- LH ﹣jъ`eJ#%ǒ)!}K"MA\,P<}VM J\{4)7g:N?7B% 2&R?%LxON0rDD'C#H<'.N}k\owH_7O" \]W|J>=eFݿ:+CZDj7_:3;L#լ/v6h/; "Xyk"ۋ݅OZwSY9ꕕ'N}T%P,2E~zM1IyjQ f;&='!xa{w*i<(?\RdJ8DI$,:H6?ؕ!:\BiyTؒ᩾G'MK8'RWZބc@Ŏ)c"ktJ #iyl6 TMG"[HP_gw&8X~@⌸Gv$-DŽ&t2 ORC+ 57Xf߁ KRz5Y·Ogj^\ \!<}SKOԈ}|VLu>>]#TWcyߧ3SǸiWn B[:&qL5ք.f+ 0NXr[dJ۽\E+юz50)pXK֬;UF71O_EB^fW՝+V:v1/i/n6j g¾9 sq;=L_":c&֟co2aJ{~olM7+g _wDzFONeӉ*9+P?q:WѸg+*&ԞYÊl-ȗLښKd0iwg֨+X1\IrtꨤҘ;br26 Z T4󎅬(뵗5)"n7zuTB67:ev׋H]<,&XLW玣bwAv $A@Ѩ`${"VGĤnpv3=ҎƄ._qoXܔ6&<83,(I[杍NڷG,Ab఍)΢S9ɫڈrKLW*_jU?#:QW+Oh?% ];6y=Y/GDyի#6&uu1u0%%[F5u1$%NT,"Ly(G5LsX9vijn.묦>U&LJ_kr߇u3T*emE;W~*3eXhP8t&h-jB^yQ +'zSJ3t@5J/ sV^nT3,*XcgySwV>Fxnҟ::[v: )w>]Ju";rU(O -1sVvrRW,hyP;g-pQ DJ0K HPdr84D H)d'؈ j(O i?8eR0Y,oi$%,S %[Bzl<$ Bb_pe!Ȃ\ [%B s'-|pvLw. r%&Ȁ83_j|뿌˺5ja\1zj &݄ ?bye)"oQSp=T8HdOdA}trtgQCi)F*~(qyvZÃnBޢҝɄhştWm|ŏM&:k+S04=])bކ ء@Ĩ`p^.Y.2%I;P~6"3UY0 Kd}er)NQA5:Z(EHnI. Ua*W߇; 'up͸:7nq)95Nj wl'Svlj?1gOc>;[>M&vd>:MdKE{m9]ϒ47N5[}zee_-w??^+i ?y;?kg>}m>˯{צU68eg?\ug~|8rn%Fd,vJxܽZ\h YWM)Ļ\{z͏f+P $4٭xTYedwXy{bL뮤Z]HR宖B٥jvJ 6W9A_}`wq^7yvrUKEUCliYL/1oDnqs̺|>dX,Q|`Q4/*#" Sd2JG߇Ź[VʀKQu 89@ Vuvp|$J{:*J;}\y^>K։"3z;}/1LkH݄̑Ŝ๥:Yla(MMcJ~4_Uew~|o8|^vk^'XU{׼þ͙I=ީ<{7?|黊>Ge@Y͜>n: 23p~S!]Iʤʼn/’%͜XRgG^W_8qΊPZ_ݩ2UY}etS&Z8\p2QN*$#0b(-P`CQ<(;>t4|.!ü^]Sed٣Z:FQ]7qvxa2Ki*B}=$_#̚%cz>/[,žn㿊QHࢡg_k{Õ2T\q_|﷚ wnW:ͽNC) Y;,5Unn"IV !tWtZ3. :-Y`p!`_H0vWH`w[h &iee}M8@o7.A,ƦZ 15Pp*pPWo[rl-4;J\vr:;[Ҡq-ipN,"KQ9PTr爘RG9o  V:JwSZ(+tkzr! u%%%Tqb.s>It7]s/O9!f&=xNW5݀j˗vU*#E@;gsy{TW6p_,O?2'GqA3;#نjp O>yyV?l~.6>"7~wMC>Q?_-U^˾U7_x]g5V⑗}꣭nĄsO~q)9/*xڽ~3wgZ.ڂˍP Νyͷ3l^]}տq@" ݣljz䟝0_jYB 粷V=ZI_7`K3ԻuR~?c6oNJ_ [}UY \"hi륗Vk} x.ґPTOKS t0б ka0@/]1nq< ämuh_fbxLW'T0Wem!ٿ3-ؓ|rnjkoFB.Ѐߣ?YP--DsC~0mWƖRp 55k2Z|5[fٙMC~>{ǿ[*X3fstE>B9^@|Xe˖k~_~԰( 6Ǘy(ѻjr3Dw yM<'-=,2G浱=^o謁HfjWd݌j!OCSȦqOfk9dA_sgdUel>~ƛ_凿}j/yh<7#5O=" G^#/]ZCHd @ _ukÉU*j 6JKoXʿo ߺy6Y_GA @7~c&՚5.>@ ?+&D @ E&@ @ G @ H#>.vLgtɿ׾b5|@ {C _;J>Iޣ֖mOO~* @ q#XIvl#%̛U[~֠9:ޡCGSH}ŽN #f0_5' Z@ f$Cɶ8?=7˯%6֩Vj푶>en+I`B"k]o7x"l_ʩ4z\})p 5f@)C*Ex*oQT2KSvK9L2rǽBp,ik FWJr˝*C :,_ C@ M$hu&,q/l.& b$|Hɦup >+I 5[vPʫ\MM@PqmMHb;LdUښ醽A7yDݍw{zZ3[-MV5U il0%;|a<).oK=ڢ\q?75ugܦ=RwpC 2+Rdp`@ 7_He]_?:[vBrv$wk% &@YUkWZC"${;Vq`BX`tdy}=!@PaÃ,^i7C-Nn'{ /z"&u8 EhMұjvWgAe7wDB )h^w@6{]YfIeYgPY*N\rcMmq`֠ @ &E^>/=e,;knrC l43c;|;HlRP08Hg@1A`.Z=@!D*΀\'*_42`R Dq_F`0(I ݁z^l(j!W>A[K%oXM۾E#@ܴ~{b_MT[?k} •3B˵7yE:?X,fSScn 0ȋs [$.]XBbs3`Z,]Smmdn:0rug7}t/M<,nWJ=@ -5r(u[McaMd{M{,5H>nSHBIHBHiH2EzTPwWKW ybUV3)-Sݯ8,gM|hyDD\֓#H#@[/$Dq3?t\^rlB7JKm= EiAepq!A!t[!1; ׻;u]v</TaH{ Lo~KXa:{@N}?/tL#\vr e@ q3{ɺu* HVs19 {>{ꝑ Ȝɏ>b58]>G)&3tlh@@koKU0Zg& m a>k,. K ..Ur$֠IDÁJ6X`0=ı/ IDATV=B @0lٲ5/J89kG/ު fΟMD99u?+TVjq2'#=Ǟf6=/~gu/9 E @q[?xkt!uȼ{$|ّ='~m@ n&qC<6TRomy@ ; @ a-2@ =@ @@ @ q@ @ &n{?{Auw9A9$;T&xe6NIN"]@ =&ɱPbm-Nmf_)q^B.q&QZZ pfr*}i{o;&\Js ƙpW8 4z\})' @:,l# * yÂzUӚ 6!ڵ-u.ζ2s.&B%$:}|fJj?.aRr `Vo>0Iq%IG@  b?z<5[k?UlGOMp\*λ%[onZď 3:9y}sTp}}eIe~O|M:Ogzku|Aan avUގ(p{zhnU{5xSjuNo*_e'w6]_)'=NTtyZ{ [(=.OېZ:}ͮ}-$@ nqe r\NZB czd vJB=m;:n+c!‡)t(BG ǨPH('n7rΎA*Iǂm=!0;lS^B, &0X2ǁ bI6IGKiJB]A*IG}QԶ@ SqJ2%wܭ[twzX ktrCq&AE*Q @' B32\7%d/$fwGGUm#K^VO $'n 9@  dUvom|e;@B" !k,?s(?㯼 j&wOh{@ k?;ޚ'}؛/CE @ n k @ Rdĵ + @A3@  Hm@ @@ @ q@ @ G|\15ero||nN|j?Fpc`/qcg~ۑ@PZ܆Eo!{%,3']vi3{pr:}o@fS?ݟd}У#ᑯl!RV%d&@ 䚶\랻mlX/ɝO%"*VR5$zh*r.}Wp#gi"f9+qfg@x82@ Qk>Ur軑ဗ"Dه[/|pg6_z̽J{KOv# @}%m% L`6q﶐KzZ4*z`8Ӄ]-$LeqO+:E ]mHEXIpo7/t6f$T1hop.U0c_mu[gM3SE]{zV5fhp`2rUc"R'ƒ]$hkup9KUXŽK=/?@MnS7?Ʌvקwnl2%+MV58RL`f~%]m6FXkmCW`bNq*BьOb+=Z]^AZp}>wuloa*<WZm5~tktq@)DYiq>!^0nol!~6[K'Po]Wib|d@p8ex噻Ux|aGd x>I'U~kJfrd乴s 2kSWww_0#^wc@%؀5(m!oGp8ɁM=4Yc7no:utwkSmX@kP宯,b8utgSiJl q{I9 [;OϑI`#Pi @ DAlج_H2\:yrB٬A^Zb?LR1 5tOK`Nұ'eǒPftl@ ]t@`=An'@fqXUC@0N`{";t0"IYADRC!:P@a^m"t vu nu?_q . Eӑ~L n bt2Iz{Bi2.$pyLgbǭ sS??=߹_96u7}Ny*J"drt]~+)T w:ct2I w%WHa㨡($cٙh8F"@GBT,D8A!Ij3m?[4bXp0q`BXMґ"8,~Mǂ1X-;_Ѷ wYWE}@ s^`[?wWّ[/LjÏݳ3`z _%I;Px8? }k$FLPSB5A3@ke@ZSbIn7!2(,LRRTx $E+75EJF[a]91C $`)qKa*'Te*c@e59r,~e\(8un")3sŋ{kk+^` @bx1 2 @' 8r ),D gCfwG=¡`pZiѼ&w\:k k3B9ンw[x΂]{+"#-bԘ\x-o<{w2ssiΜ^=@ spr q8pBoXw_~'c дS2ɅBNx:lmtU&t=`T 'I$EI N75Lq&.] :2ݾլYL ȔZ VД2Nj ຩq4=i"hkEuYdYIKT8 ˯8p=2zisҍ%OOm\VkZ|ycqM+ }#g(;L,RVOs_XE]bv:3Pp+=.U8 ^Rrx?uyd*^K M$:B^a㩶Z-i @M:b" D*IRWo b(NwIY=3 /^>e!85ثHK'xd7Vjuq̊K0ں[j9TeRHGE5*ØvN4_Jl@vgB!p*cdSzy ĥw̧^/,s5mo%}0&6v.{A-;;]M.AՒ]Zl`0XA%+\6Y]k3鴸tq!A_b(⌻] :v$ \FsZϭ{( 5/SroNBF01q1;dyxNkQ.m2|rnjkoF.Um! -Em>Զwv6`C y;x%lli(UPC|]) .>a$Zb8}=6"7`{S/t$/L&m&W~,~ӑh80 c~^|uǖ7GwYBFNU >68]51TM\a.>k,. Kdj ԅ}]O}kg $/0zxg; @ b.klٲҼ6G#^ lzb\XX=㯼j$In&U64cZߠ*|5ORݶghu>x9N_e6~˻ty#tu>2yw[O_>sh{@ Zfcc M{[Q_órZ)>p'_$ =S*O̕5?{G z{cřudȱ|2ύ}У =o&@ G @ ŬE&@ @ >a9ׯ_"N>}JA >Rlڼu8{83@ H#Xh ,"C!qԊ%N/_\1f[v8l6o C!/eqq/@eX_4ZcJ{K/ܦi]-}]ikuOҍ͏ד 7 cK/yZv)v_߾:t<}' G H46R#A5k֜"˗oW*-x7rm05epw;skzZj}"tf,Wx| 4v54uPos8-J@i-Rj?|iۺ[;kq՘HT`s8yev[S 5 ]b{yxIP[z={ qmen./D8bA[@t7jt:H>o:]o3*DϿ?_'jRXOYNze0JW\87պ&Ǧz DX؋T6 H#D gm0w{$0v;id/bM5rPWkJ/n I`T5H_MOwP VxE7MEameeT*'QiaejVfM7o;2;\B!ML ǟM5R,T LegB*]ame٢ B*! ylK\bd!QjZJi.Ŝ(2BBc&f,YMNΫeB\-;XsLi*ˏ2Y^_S),dUo1&UH ORO(3r󶊒+۾ l&d2<AQ|D\QI$39(L)' J*,nj5LrDEɦ&jB ;1uw-byKP /רRȦE~4bl! +ES=]Ve29ܔupE 9j%lz^0l'\bZik^W cp3C/WGpCu68#J{BwQW L]jNVGSaT޶VF[< ls<=C -Z']]GJڪ]8}aa`p8;'Po]Wibڹle5./{Gm[x`n1%2d&J {75?P'I}oTWi]n Zuuf?%,) =&rmvcʭUAI-t^_kԹ.s׹ @L{X ͸ l IDATa2V%,X>:60ml5\k=P.=B^Mw3ciL-Q"͌M[rsH3/Ք{l{&J%r \Vd%g+if4U643X,>6 S4}D-MOry)#Th<2|v*KIft42YQ1+-QX<˨5j5ej⣩bYrm۷oFn^7̃J%bf-4ґ#w2/Q@8>R+6D]x(/A9ybddddfS񑑑XLscOYnlddddd=|q|Z:u YAH'|)*4Sk <3F;vltRZ[*i)xbfTRSȢ& 6"TVǨcciAL;DY_ɱX<> @dV.-Q0Z\BCSsWz(7˔h<߃k 3HIgL,ߌ]BLwIP6^xY(/ɀ?3bmAm僞@b٭Ba*3 (6Ĭ 8L(Kl^:s)-W6/CS'T3eXۊ9eU]9k vZ:b8 iΦ#8H&a#Aoo;zƢBtہ@{l=%/PSc)d3ߐx `L;:͖VN, ^#f`S %z= [ :a$CPѡ!&C4j5h)&Vifl*sI&VL TQBɓKVWe[Ě%XF|d#/QJ i/\~mVʲǫoeMgAjR)7FUpnImGD!0L RRTx $uI(h(-{ځi, 'u8 Ss `E*΀\'".5t!ЁsE\Wh-g٩#™ء@Ĩ`p^F}w~{O>λg\\mjL&kJl"U4s4i䗖.¨Xu*ai3 { ?b2\ۀ&݄H,[(E0 @z5F#`l^Ÿr̤FNKR9,E5e"8؜-Z;/B!olvZFJL*b9 &jdr2TzH+Kg ,9v4(QIVȥl:3cF\MOW8dJn8o^|ybbbm3G795Zsl4Jd&9(EKVOzB!**@V l6i,R!WHUeeEYBfs3Y䋛k!LTB.|7&9d$%EvrZ/B*T,Hr Wx%EKRbqs-Xٍr]ĽG_xֆۜsxe]lzjjM.dak::w_qh769OsE0|dQp o6hkwΉTbX,VG>we$ O V\V2,5=KDa\n>'~}?;6ӈw҉^[3rԲ:d27v\7oz1ҹX-ᮩ x0dעٕd0_aRf`'O2mD C-x LaYF:9VAd|F}VnlͤcrJVk rLfF㓙l[]kyflBQBz9LIV(ckœka{aeTJTQ$Wj9]$6vul'VHaZ fөх!e' ktQ{*Mi PKu(.cIU5ʵ+s'ᓇ`"Eb@g1]ęRVOs_X4f}ƹۂ+ Ģabe pH[WTl#et 0 Hh-ӑnfe8l*:@W>1,/dWt0XfUF39.8DT$+I4b:̹L,c <[nhgĸV:;IOohkfxW:~l^ |*{y&HJ-SjOf+T:㔂u:\`=EetSIq&.#CfOGXe ĵZJ x U/'YzO!i\vR"7S"Y^x>sj~s4H%_ʧw*N1S3 y1ɬBIQ778'S'OP OʥQHgRB>c*3L/rIرcN0˞M/(Iejno*~$*43(J?ɂT:sUo ׊RMOS(WҢ;b!әTWZ,hEK_lYr~SԚMji:5qCwJiXVU*}a$ 4ҽ245{YŮo/!=0ɜgiՀd/t2[[Ij:^ԸkW(-ZIŵdÌ *@bs$$dZkq䁶0QӔ_Ak\Bz2 FZZ! ovy]6N3XlMKurZU%dHӤvVΌN.Nkf.Z±T[HVg :-Y`pt0U] 6R3=N .5չ+ :גV Dqt[$;q6b-wgTjIW~^_7ڻ6zGuݷ˹Tm jP_ Q^uM:VgVу ᮳:SiuVb(NwIY=3 /TH-,*8$mns],'ڤq\J6tr\* *bR.ȕDZsYP(7iWƛÖ,q|f\"ȕynIK~&P)Z͋ DY3[_&RiPe'; R.H$Z4^BKdA*/8P+IՄF)H(n.31jGԄFjl-ku/_,[QJT2˗@RBz*d&BY"_TZ&y(eʦrۻ&_I$ 0XA[ъj-t--v[v[eBvUZj*`x%rl!?NL23<3>gl8NOmg &Sd9(8N"׾mNvLgGv56im,1ӎ$p \\]îKSi+pYd7|,io76i!-kϽi$[oJ#R]Z4S5W~Rɶ22  "rptqbMb06T7ɛmG7 TNW SS@1ёQҗ^Ope0R-Du~jo|thNSQ_ fǦɯ~ J)4phQENfoLlVNBߨ|yZ|6&2:)ԙoV)+wi؁:$rsr3*E{I#hLJg$FQ"羶@<1mW_[Z84e^R>:*">5MͪRiH#MIEoHp&mmy~r?LʥZYvRޑ-IqJYvJH 3Ir''j !7~7`TO@=[U}Kl2LD zdqf$n5wHxTzV8gxl[Õό/CeC]'-nמZT]srvnbc. wk*Aϭ;ku.H ".iu7:qyT-k]E5k[ߥR͊qɣUultD"H-nNsוQZWŞ;MucK\O_[Nۈ kgqc-Xx.3f ppGmu٫0WXC>Jtq7-zWo ||fXCQWVf0"FU  6cy/m6"{X9TrS,n/q&(U?~J(Y|mWOlfxgT^ͭ]Kws+XnkѤM67*OnY7ωc7ijwm=Eי͞sU%6m8@-$ِ^jm.cE+uoOʽ_g,]HB9LIy~պfUUؠ|up oꦻx~Lrm?TV,SjoL _3O>yzGF2f-}M? AS{?5I#d ?gX+4;ܴoHENm{?S}z=&"frir?N;/I%LIޫt~aIVFHDljҺ,ɪXKQU4r2T<5Q&·H X,ᓪ4GFD Zy^Fj\GD>[CEDDEDBÈ^1y\r[Ҟ~t;~omt%"Pn9gj=Om,`FO-#G:͏2ٻ-Dޟ;g7a* ;~vH1&= d'&.]p}5u(sH֌_$:=-̝Ⱦn9W_ì7rZH#͖|˝-?W~;HYY5٢EiQ:$@#"_lRB2sk\q-/Mث&򉊋'5lo:aikR7+cH5DH,-> ˱.?79>:E#ZaQacI%*J{pUbr[Z&Ũ 'Srظ6[kSd - Klj"-*4$SrV1|gI1䐅c48tHҦ׮ܹgg{,}3^}>k-k&絑_jv|Y yhF.}(xSG\${7Fi0Ca:XA sGa(2bB3,}O&"z콅`RQ ](\e=) ^0@, Ƣg6*n;/E/_+Ԛ'^wSՍL9[ھ*8[0M)Let߭[2ɑۙxni =]7=ӖM]!-]jrY2ΠSW IDAT(8C8iy2ZdH5˃D*R^WlȠ)?/ğd٩ ZQ!Hz.TȠ(Hgr\Q++JZӜOX2;9PT++i2μ=T%!!ޚ̌ZQ.USS(W(jEIf ~#̼U$Z>^S>cȾ_=F5oe$Y $coxMw3-ZmsZXQLBqDDVWQTYpq߉~W3!hAVհB!JLQ!Sh"kcY[uϿ|*k$2!65gocضqvb<',Vr?aYj:(͵iTtO> fW?Ӓ穳'Ѧ"1J|r4;Q{ LMgL>{a42oqY3r~.mdZ?Mf3K$pG  ogM'>ϑ<{MC OlzcbV-?_ڎGL6٭B_vxhicO^x|j^w^ruCl}{ <fzS쌹ۼ(nkJ|ɝz=˖iccCD\+[I]$x%j Gzп|'.İ1o|ڗ[2f_8t싏sFΩ !Ạ"Re5oqFO9Ɖd޻+V=|>٨+_ k,;Sc ug;IJ'RdhbC*2P@*5Mjwi"RXېAQw1UkYaʥIQiAryTZ!"H$"oLV~Lr_U`]Dܞ2 Em_p^tld3kx?#ێt_Y\'7kS!9 &3&d қLdK@eӹsz̚pKXM;vaȠ7 Dz=MDDDU懪do;&'Rކ]vm/=(nq7}Z,Zbp>F1"~ƕ-6-P1 )Cӹ>3;{#1O]L}pI.SO(. ٛᐠ:UNDo~k_ګA~S-(Wȏ?mvL'.(M&s\E |"zxټg2vKC.|ˊ+9q2kii;4[;|܆ߺVfﱔ0GZ<żY{çGD۽gI4?w#X/<\#?Q~bK{,]v g*kXn͏wY~o/9=!v]jH0gryUݩsU|n.AC=_ nn%I-ڙLa޳t%K8qp;{`fbצGEIA+>;M/olWfFoʹEW5:*/ ? (<.,? M,kXei/A)2? ( (46lMPB ^[rR.ѕ ܿB*OL&:bKIEW`F85wX$z Z(~f{Ӆ|bc%oM}xɮVu;CC0k>cX?4iuAN8I 1eK{yhȑ3 FeGV·c FK-֛|oNp%+ _g߼ŷS6w6(kU$&5K算%g,NDB Wzbl̲Zxw r` Tߞ\!7ɖXެNDmiwBru2)k5{6婙P(.'㯾!W8&rݹk(t_ʮ~K8vSUߜhE=rߺQ]/GIiMsyʽf+͓Xcl= ZF1%ֶ8sT%n!]lv8q sS#gg ݣK[_R YiN\Vir]%ʚ+H9hUy3U-E'%LGO٬jnָ?3t̹o~9iɜ{4Uvv_bш=Eyܵd=Öm|c[GDh wqqp8y1{vED{tT>L޴t*?_>pKpnJ_SHuщ>b' 8|s|' <6e4 QBeTI666}oV&qwyPxlg$nQLT}͡'~Uz /MqQ5!$"H,^[oU^^ֿE* / /ܙfrϛr|^}сz DDK&`fh&;I OODF':*eEN5^Op3kKS5뛋ʠ^U::FďސLԜґNu撶05g"ޤOVU[^/ ̌ԜMmELo+X,JI(KJ[٩̝өs}^eeGdGj]9{ 瘿(t-jyӨ=kAC@+| 7XVG,ySلɶ ӠUsҊk]>bҊfJ܄Χ%Y?>0`^DԠiS5?+coܻ˭} mvV xg<{ïC' 5*e˜1)#qꋍht+͘3[V>Bܣ2c\M}7̞&)l&y= LFDrsgϞ%~GDF {p-MYfÓ;vm-!k{/d1;G)lfuIVRI?g˦+6;heIYguyN3d)}x})q{{&:􋚼м6pFQ`uIZ\IZoi=3*b-?o`_E`m]ZDzb/9V"0lު*4BבDDtr("":!k.ckKw7 =jjwyqayDD61pSoW<;(Ⱦ /s~|qө>wfrb0mfJQq>lfս/,$"Ye{%16?0ejD"!*,bg*GqYrLc|bMwBzMۑ3]]# x_asS {4tY*<&S)hH&y[㹪/9L@-nA%)*n 1ZuڵkL*9;RV9 |#:۾ L|Q̫3Op:s*ϷKwAw; j[0>>>o|ow7O]˛'ôȴqkmlaԝyC뷤if+~#ٔ/4Cxk}?&*䁅/™~ DTU5>K.ݰL~;v[vҥPi `ӃD"Ѹߥޡꞝ˧jT/MWT'C\)yOTY?s[:iq3vmXuu :rW:;oD֞:ED۽P(_n{\v^>ĉ..{qU'../bώFeΟ?_^f \3>p0PpcŴ't [F'9TWT+?R$'"M]pڛj凋j=* ^ƳG-]v r-:jOoА.ZI[Åi+{D4=NN[5'p(̛꣧OC"ȕw!{G4e|" ]XWyoZd){$b#$"6i5 YvjHzdUt*EqvjTi pKý(We`/wZ*}+2]@c.>OfQX1X +|eE_sĤҧ+i MptXÜ9+xF.SU{Vܲ~~`qQ,- ZUH$:"''%(tD}ܦ,DES7@B}e;3$=&ӊ$oVlj!"YZ|JA9.1Qcl hMRj̆E[:"mS'ŖH(gB*19-MKJ-pbbTir{t3m>L[`loUմo)yq"CМ{9Yյ_R:gbQ&k:@54ahrSdjA(,Q+ |<+)BVrA!""'LV֨¼}""*͖i bh0BI*PRoeYDDمjIb>[].+5jeEޜB՞OX2;9PT++i2μNN7h9lƲpϛ#Ku2Y(}kce)y/oZ WbU_bEb8+D'Dɏ뛦UYDMBlzzHET&*tiVq J 4Bo mȠTQE ˪5*:=\ZX$///H""D"bd+q>M0=S03tkSM}[7wcZn"^_E`aQWGU\^]証0n1l6%giQa"Bc%oJ*ɑ)%0UTT~A-) 3:׶45]:]QOtVukiKAQؠ'bLspJ=_xQHs2RrkA]l\ڌKDzuԕ*K’xHU92i^FJB\z)/ȇED:B/i+CT~4vwZu:b`  '7yH9<Փ[ U9hB@[Y^,'=}#x,SKCK}]t+vuޡ0,Kg6Fn[^sy/[Y`E֖D]tTdbZU Y@Dד08*>̥RMLb2(.-FWlkyE#MIEoHp&mmy~rjH!Xg.ik SSzZRMJ.iUR<xxx\쩡QKLҜܱh +(8`7:Z+dV;j׭[k.›*9;RV9w=-szA[U_U;-L7!l/`@=znZ`h58 Z"Ewp~8Tէ/np/l<{De:kPڑ+[no'3Eʞ-{g:djg>zn\{-:MsM8r`L{WL^c))xJ"D{]mBxxx\o IM>9=8a໌>=Dܦɛru ԞdODz߻õ-K&T8r]\=W_txImD&}{}t`>=IDATnpNvw)K3IsrΣ-V[m*@{@{{@{@@{@{@@{@{{@{@@{@{@@{@{{@{@@{@{@@{@{{@{@{{@{@@{@{{@{@{{@{@@{@{{@{@{{@{@@{@{@@{@{{@{@@{@{@@{@{{@{@@{@{@@{@{{@{@{{@{@@{@{{@{@{{@{@@{@{_BEIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/extending-openapi/000077500000000000000000000000001461403617600236325ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/extending-openapi/image01.png000066400000000000000000001764221461403617600255770ustar00rootroot00000000000000PNG  IHDR!sBIT|dtEXtSoftwareShutterc IDATxu|uurN ARV@@@`b(H5֬Yv11X|ea+%B! Rꎼ:`!n3y/B!D5 (UHєGeJB!)m߱DճRSYoɛAZZjy޼;oT}hDU5_Y !01Wm !B[/ҡ}/Xw;otБ秿P}TݳT8/7tLf3 zW7wBx]C B!7jxKZC\V,nݺ[5'N@2ԮGĹf8`Efq>6B Gjx[ڛm:$4SS n Ӧ@UU~B!(T&M/a|9o>:ߚ58&^=b%\I^7)ɉl~h%li|Ю?|2Y3e\wfNl'?M-[5xObݲYQp)?1_SJm',6ao}*Le(26k޼l![jB!UB&y4lPMZ[5Bq$%&b0L-\݈,@z 5Cf. * nNn]652oǾg/\pz|I[jL~QeUV 7g+,jFg}qGAL/fwȒc6YϱfBG NF |RHB!B4XQ0搔R|!FM?LBQcwɌ#EjN7Am/,[#تN:wx"W}Δ}3Kѥgfhc̩sǎX >6IkTF ků U̅}xe,[ԠͣO3_9`8æ%؂oYoSywĔ1wˈ= ~^vAqḧrϝ4s@ѯm+gN;t }cj*&'@ϔl[)c54S^Ei>,-^g;p9,Nxφprb9kL|x~[4m[G%>ճ&I.7m`c:vhϑ#G{Ja%e.B!n ςqL |'Bp`˅Z^5 צn$'&-fl2jymỿ)xQ/2p.NlpwϡWZSb *)`;Q}Ʀdn)kf$_@U^Lzץuw k #-ddl4vԁrR$ ?n7ˈ)/JU.OVIB!>h;7$--`zrr2'N>\7:zM@\]dRS/5 FcLS'7y_%̝$3]&3k!lxqc 9SgCƤlh?ZhJ]1wЦ,Ől!-5Y%x.blWasI`˶oEq(~ !@X)Fb#G4^sj?".Nz2z!B_{?11NdMR}TIvuu`p,xozZNI ˚f G\]]˽pc5쎷zTg\ q=XomL3&s؎z`*zj?oBǟ9l/>DV)_@` N {rB č?O `g)}8bM1мYq_&vc1*seD 8 ^cLXBB!Uc)#ٌN'#-KӁ>^JEҙ ,zx*`ɟ]LA=o4Qdeh8ɣgqgut# .yİivNDZ _ƝCU:bweꓼ8/?ls,~qyj8b;.ݵvbwK_>F6ff0 e'sp7US6ǔ,FQ3,C5u5GSW Z4+~/*g ,!B!$х[&SI a`l1`ȯ%4o-+3xk3wbT-d7*y2n˟~8|8?@ZWdo2ڔʹ>g* v'5"ֳ霵HlA]q9xؼɠy#t=1{xiO34S6AZs6 2 wLvJ<ѧT|_L:wԐȞ^ens84 ~FL%r>'5¥/:F %B!Du :TUKwwfڈ"919E#>^ծVwFJ~a$4m~B!B,5_@kuZoOM21L`GYQ\+}B! PARrptv2_¯7RU¯B!-_!B!DSH Q3|IB!.XI Q3\!X¯B!NX'3 Qpi?Cpy*W!BT(RbBTc|^^B!%;::J`!^ɩl++q|B!Du Z#WwB!BTltp]JJ[FG)!Bq[)R QFhDh X&l6vծJ!B'zyIq|u&B!E''z-Z !B!-HB!B!X!B!UH@Gvv;*** !Bʣ( FF+nBDb۰X W!BToQՎ+( zV(R@B8V Ŋ{GQU (ȗB!D hTP2*ŎNE"n ip_ \7S¯B!DupڱcXYmFBnBlVfꚕH!Bjo8لA1j彸4 ]:w" Mhެr6(q!v-wojl1K !BQ lFct@߯U -[4/2{nt gy;knbγHA!B*e41e^b6JY͂+lќowReP5^^|'ܐӻ7;wgʫ}0vh5kFcFt:9￯$#3G?X}Rusue̘14kڌ9t?V$##C!ǀ`hre7֦Eژ"?]`g!2kͬ*+֬%)9V7cFd{y*c9}fr1ϛOXDxAFL /)I|p쯰}fd6w^zaO3 ټa#axENfYm͐Wd9]P;l~^~Y @U|8y &=ˤI!88 5=T}3qk_ْ/{s(̉CG5ݿ-eڽ$fDߦ_YZzFZ7a65._,Wi#\ λFB!ͫW>;Asٻio`?wȬ}5kڔ͛EV/2\۶mCM+WYk*+OM~1>5}n{e̚1cFat0YvU6Y]YBbԨh4{.hBF%KJu=5OgZ`}$#^Y8.&owb dLDO,X>k[/O+Ʉ>[?>+ن{=tZAZewVf {`5'hk zL@"N4ejxg$mgSǤ}|S^v]MZ7t$yoٸP`5#8XξtW@Ƶ0I;Tۍ@/섄<´u^lZشuVm&fKa!V( .θₛ^^nݚ ˀHKO'33,233*Y h*50ek@m/Wz 9qlf>wVUqѸzO9KohPi>n"SA#/#j[Rn8HȒxwwLîg<8sqCf?zs<4dt -ZA2hRq-8T?XqnHYoU{߹X|1FsO]-y_=8qW e~AEtޣBǏs7# `qOo&.(jlʤǺCVDךڤm\9~*`ۏ4 mjj9k-Ӳ;Ug)L244iCYp7jIRKmc.K9KVkjhv+=VSZ8Pa}\cצD,0i<5Jtӏ}nY8QkhMՄ L?18촸Ҩk/ݫ_%ήdz8kd?ٕbt,W!e3iԬ9d";39Vή]ֽz?K*7m'[Q:ޞw<͆W_&~4~z<&Ѿهz!" >=>Kxd:n=kPG}Ez{~ٮqn KzW3f/%&LLzؽc'k] A6`~H5sQQ|`999%}X`YOg>L`-Nw?~ڍ7%w`konD_o0sa}+ 8\knY2+aPnxNGaͣ.mV%離ԢU'Ҏ^2^~йz<{uअ\O<8W>T\Qό%2H^ڋB!ĭ'''y_|ΓO<ŀIJeF h4wڵAgϲo˔ *Cj *<(r9SBoN+)jcy̟7 ;9ӻNQR%9kwswcO1u3rUUg0Wohm۷_3:Ыgax7iL 8xexl/7o.>5R;fq4/_OG&_Mcs,Օ!tѡZvEkpSPSM+aujư^~$=ϙw3}lzjkU'gUf}9. IDATd5SAnU Y_'V,*|_քBq3|W .ˏ# wivа0Ԫs{Ar+׬d LHL`/_| ^^7͇[у`ܓǍˎt܉6׌@_wM6]wY?_?ڴn=w }T^_"\.t`j 9ƉLwڶxzzwhJN$ʼlq%1R yruN9*8&Fkrį[|ﺵqIO$.^^-L"0VZ]rzٿLǔxm4hr/̯S|/LƥH͓u\WBql$''pؑ[l݃Ǣ%?â@ Yqc1kkL6ؚcEQ55v;WU]Ҁvq7lѼy~ U̩Фb8=}Ze§=Ko}|%yWRdGoI8hU˱k@/9IdNGDpRut@h(Iu!MS[ h囯*iBڑb?2Bօ{dn}p9\ }/7xc^]̮nfg=,\ƒaSdvYIcnz^Mˏ;::s^38췺Qt5LRx|ܴ4oOM l~#Y7h4pbR4B={tѱ/@jZs>Y3_c곓YÛUk֒3ѧO/ V'5|EZ %ɖ?fќ9rao؈NyZ!ecrm-G<ǼL|裂u0'q>ί+1O<Yn gڍNy~y;ײ0C5cX}"r [gÓs9$m\гF8gpn{̤m2zlyYdņbR3[wmuV#O_PZ:9-}B[`N:ԩSʦMjNnh0b2J]'mT"x3bxi+"W}GMbɼ@|*s7E5e/,ILsY12Tvʌf]; oߟzG޽{[&(OHB!Di޼<3 +7k0n85ky_\gj Fc-koj>Ioclؠ>_͛ޠ+wl۾PiMgׇ݃qcb1[xz$"*VXYw\n;ߨa}_Ta;f]Փ\ yիjWIcX088f},_BXDDlv{)/7j׏={ҢE 232V>CBC[ұ_ϴhwk#xuvN$jZϟ7{?kXw. sȽm%B!D9`YLܱ6-U0 ]ZF6lrs'vE˕PIssd?y6+norXNUKsl?6]. !B!n t}ײ-.~kdުܽ~G7ڕv>m|pK6EE`)&X<ɭ:UoFM* ZTE`SdYf-R#=2{ ,B!XUU&\1ak/Cy=v`?80j< <*圾7V5䊫6Ƕ/4MBs{lCW.7~UQܸ͌'a\js4 Bˀ_Ѳ je_ByB!BT +aSR.;S-eti4AXFV+s&54sԮGcіIOI|n{r<%]7kŨL3~%n6{e\?6,#Fk49N.Dgg̛c#<|C.0+nE[H!B1Gge,lqt_rC7v(1n2G\j>^щCW?1AFRd_Qa||p-{JǮ%k̯3Qm n]?>k)S΢komkj0q٣JB܎R͠M˚eFNCvy 9TgqGZ89n.;ԒY!}xL)+8.nQz]J9qBnV,~0q.̎,:[ɖmoHYdZ|uha[GP_|VKec2g O!5-A#^ Z)jb3HLy6eNL|&} 0m<:\ iBrj& O٩'撘tGvcLNoOGZ6 OchG.j!/Z\iUqT3-fVG3UUo\G=u-i}ݹW(h569VKAxnHYI<_赛 SЈsm;7TگhoI 6ڍ'N`ѽs]~CjEQ!Z})\4I9Lu'ͥA),X|{#+<0VpWF8|]JſcǮܔ';̣KЈT|{# Mwr1vx <lէh\B!$DdrY_ΒRwٛwS`VK]gW8ss)SwaBњ.Xmvb26l cX~?Klo;<܌.ש}qL~oʹiY]HTLn'8tnEJqpg C$íс#>R]p01TS^kg \un_2q*KNk+\[j+Rhx*'"#LNuxuZCxxVb`FtT3 %ǶQ=۶1 |]-{ݴg7[3L..|z:/?gG;X>w>wS|3tե]b2_X6ޟՏC N}3|U2hA4?֟eÿaLjt|a !|2%a2쾫λAcbL,2}_+p^a,nюZ+>C %{f3.kpǚ.6 ^޷H-·{3n3L1q&5U3ncޭEU_*Hv37i܄.^c[?~j4NW6n `@K/_lS9u1` &]%89*$.LVfMY$^t>']c M{HG4 (2gY5aqA\i-TOGDd:z7d;KnW4=q&~<]}qϠk# Ld.`vbsDFg`2pw3ߋnҡyV^}g &0?UCzzu9l]4=hܰ&K~9ѓy8r<ͦR+su EFvC0j1fb$`<7sce,Ӌ5s%&6YOItj_J?`Do!2:FZV_ʵN ]?:u4mőIJ)QNLʦs|"ٺ{pȖ.(l7vb/NJ`^Ýwaˎr B!msR-F/:#7O*vUEs]7c.(/a_Bm%~oU:~|{#Κ{iaZN*g0,F^LcۧgX :7fe lNkyx+5/銉udf0 Zz?`:+vOP+/LJ D}w/ߌ.4xcF/ lU#'ykv*$6㩇:Р^́|AXֳv y}Y4tXͤ }F4\N&&4"Ƕ;\Ky&+:rS|% \*V&eGfгRWso͊>t4|w-:d`"  08^]% !䇢QRm Th[>뗉fc ;Sߔ:*q]~%Ͳt>NlzMvGi.?QŭPsWm/S*Iye:cW @g[tlwÏbqk5yof"MfreS˼-;#a 7d邑Eg>̟}7o0=1Wy#i`l?z p<I] ;!+X O<ؾZ^Cs!4"Wv+3`qVl#S[ HAF>n3e8C1<1m(`4hqv2PmZԤGz%~%QD=)wd ezLB:{K,ٶ^>O((ӎ:}PkI5wݯgaٮZ|v J)p/k8]HR3BmV,HO:8]'KN:f^80oИ/.|, IDAT>ٴdyT`X? XE%ЮsQG7jW89_Z.= {[۪(ʴl2W9ywBrޞҔOf,J cj3L3V}BwZqm<wQ>k[|jqV%Z'-#gYN&*y&+6ۥoNO^ҝ=K7rI)Epp^,!|sˮ?#*%Ӑuꎟ3u]}_u>}Ov*QHHة4oMok4hgPtwc-v]Sl3gã7z `@D+"b" "Qi&%$@$!f," y̜93;;x([/95oy;KII)ރVC^8/le и-_}U6e2w[~ g֧(,|heCf[uP^'B!?:REd6l9 h$x{';{Pou gz:--Bz*6&-Yx0yѻDʝ/BO`V٦6v{_wH41R:Gds?[/pڷvm+gzб}\1;o\Bٜ(z7r*\RKN5allPC7-tE4oBR5|%NҸ-V=]ձ1nty!0e.>ރUޜs 0pVvYc-U)͓X!49YܑvPNnԅKG nӤ%nV:R-[2ޟ9Xњ\\嗨j5l4gONפjkBqe?a+{<0I?VֻU3Gl|BX B w{U2َj*~T5{QSjQR^yEٷ+ӽS=׳V jyhuriȎuFT8֟խc]sghN3wJ-{LLl~|oU,7ܵ':JKu [!x`  Mi) `el- u:%qtwWqP`TO؄to0ť둔j16zpS&Eegr׮*^]`meBx]Ϭrܚ{%%.t1Gaqy\ OigkM%6--յӕucm{--UYy\s[5Gռe3G&5ztql=T ٲ*Zj\!S=7%FF mNo1S/ :Cvoc[%{61Rݵ=`b؝p[LYLM|ٳc֧(.sY%Td5\Q ˫}2vXo"jul d UXΞesR>fuA| -:~/ʮV{5H#(PWݛLp7h`rc$ByZ[ޜm1,Mi)AcT2}GB&mi\:S:t!$Hzs93 ߱ E!wrv𤋮Wy.:QLjNSS&K{>MZbcl]çT*X>0Ms8c&oa b-+X:g glP{}G0N$IK/`;KEJ4lnm\ }X]A>П;}U>]z]paLU,nkp5-XL)c4l kЅDN7)]ܷ+V`U'~%,:«3RvI)^RyrH3q™0Ɇ۷vɂ7bu]-q :c7W>)}7pߑAZB!2ܤ,:|eިv-lDGBhؔ ׿BDl)7;mG55fAfwsqmȥ43wߔ9aї'ض ,gJS! h:l9+wVܢyWGŀ ,>{ޗ/fr")Zwv9`YʼnvjSh4|x8KpuRҠ1Z])߄ζwcgbl¼;7s3ؑwX1 BmZ:3Ocp^K c~Z=u.']oD:fṁn`e.s<0Q`##-9ꋝ;Lvf~5_x`,c13UWsJJuuqofǞly}0j+`˜${ֽS=Wkΰm} *ϼXEQ*ty>vMxqeϲiG;E7Blmxeb ǶVEV͝ K@c:1IDy1^6Acf[S^2S[8qhxqeyCN\LK׵f>|y~ɡZ5wd˜v ;_MU !(uR1eH] }$,Qwp:%ؘpsk8L1R(1d7oo Ϗ~6N> B@S{6mIc+[aTh(hAhz ?G]6(xʌʟ}+Bb2fdf4 PQrf19fi]uY]ѻ8aHƘ)tZ8T|ѣa˵?`3L˟F K <*;^||Kn֞g'?{vgH6/r9dbj v/ J/(mK4dQZeJ/((@]EMKKuddyBF _JԸKJ.ku'^--y|r9_.bu _|:ܷ:+{ܬ@@!3KjEՑ_PuI ((`gV9yG<ۺo__B!j%;'oӡC .]?sol. fM6d$cƩZLe4Z*MGAQܿ]d?]~FQYr|M Dj4C74|65Iz>_d&6v%ߘ"x9. )uS1bcmR0 cQccQHhν&~2|acT( SYCbu W/09R{ȉhxwBѣ|pvf6|j8GnDո|g3 za -.MX){wl+im:[1}DբM;-WRLzܽOz4M[SAq_5kC;gOOk$*^ !/zBeOkWx!rK*Ը皴dE؛=njc|Xq5Ь5C5b Dp=7m̔*<]tpѬ֨CF-&#LK1[Uw^w=\.T2TV 1`q#\PGBcIj4j؛\6w50_sKyR 77_6{l c꿞G{ؕTNcHB/BܫGv pEJ{.EG6dvnSﱸYE\!2+,pcnAckT&Tk]捼\.g.Kcmh]-]\ĵ,s)ДdfN{GYZ5V1B<*LJbr` q7m־p7vI!qprEZ ^pM~FWuV[iABH,CWRRJI33Uْ7j FF`f@!_-52Uxu^k9$Az#%ֶtsu#vr!KalOjBTƎ&6vr5B!BTJ\ !B!X!B!X!B!X!B!X!B!X!B!X!B!X!B!J@!^#'*  !BǛ<BGtB!B!B!B!B!B!B!B!B!B!B!B!B!B!B.]Ė-[X6lʕ+ծN ri4=ҥKٿ.%a[+/rjTBH,_׏3b>cx 7nիW+\ b|嗔SN套^ݝ02h ,-- y֭-Z 99Fw^ڴiC:uعs]Bnݺ7nիW_~5zqRRRhҤ ȈdBCCСGAЯ_?}_04he/_Ә3`\]]uZOTT;11LLL, 33hѢ}APg_ZϏz`]F@@{iӦhZvE߾}9u kN"HVs Ju65ܬl㊩O>?ƾ#-C;*C:Zfq-im_#ظ^kx4wTIЅDzwk 5 ݘ[dtGNF4o`x/ C7߃ 5G0w#y !cD@ !;>>>$$$FDDsq)rrr7oK.s%??gϲh"eܹɢEx׉̙3L87oVx .ddggs=GLL EEELS}]9p'Nڵk.]ʢEe֭+.6l7 %%˗/3n8ʺԞ>}5k_撕EDD$%%h" -+&&cDQQ˖-c6++\"""(--57]4iqqqܸq_|}Ekq bccywسg.Y{nTks|,h/ld/?~뻧a'/(3o1Μ/[OR\jT:/9ʤi;$\<'o!6.ؾ*cl#6>cFm۶qyz͑#GpqqرctޝLfHJJsNc̘1?~Ù3gسg6mA|Ǭ\UV;sĄ_|svʆ aݺu˨Q*<ߴ4*lsuu%-=]RIvv6>>>޽VX3fÃUV1dj[8r^^^V%44{2iҤjkHHlذRȑ#7o@YzyWRx ֭[… alٲZ->,{O>?aٲe /k_ɓΎ3g_V̬+W0f^}U:uĻˌ36mdee˾]^^9g[cŊ[aԨQqæM6m8r~%qi/3wc>?|0_9m\3jXruzuϹ :[Ң IhYaڶrFq8pICn^1 W̾^փ,{5B2"7o e3Gƿ~]ߦPlMٴcc#rrzv}uAAA+U֯`!Z]>5 999(JN ]v 8ںFLzz:ZVܖKIIѱm"??NGTTAWٍ܋ؿ?nnn`/==/D:u066f۶mUGUqsscl۶իWDŽ 2eJVRXXȩS kРEEEXZZԿ++<qq*{1x.kXǚy !cJ@ ! Ik~f͚o){gXv-t:6l@zz~l%۷g޽L `ǎxzzSKСCIJJbt:RRR駟JEFF?vdk)itP2 >{ ڹs_$6`H?w~2¸נDݳgO~ZcueM23f`;v]\\wV(|̙3h۶-y-**?7M3C0!k<۸:}rgRR fffUܼ— ,G[* kr~m_Wk2);9T~03g$BǓBPviԨ\d!BH,&N؞[NX~\d!BTI@ !B!X!B!X!B!X!B!X!B!X!B!x4Hqqqlٲx6mJiժ\!Ӧ!߫`fϞM~~>NfĈL>SSN%:&s6CL6nL;C_FB<&^JB!JHH>ёٳgөS'ٴi;w$%%+VԢbbȻ4:1?jSpiVr# !B!?>),,dŸ`mmG}DZZO&66 ֬ԓ!ʃ' Y6r2؏][0\B!BѰaC}{rYk禒 [оI]БZ@Iir91 ftSBB~IҠk@cx|1M "֓xIk&Y3cԘ~4Y7)4si/wB!B<xh+++233jw-KMMZkAW;??eR=7ݚXC6~Gp ]inIEP[I4oБ=qpfF3,bITao"o-[Q5J-Pqf:Ӿ;fy'Dn*!B!x=]r%|}}2e x6mڄ۷y y)8ލh8'wsr͇c\h.$zbT?gHp941Ob[=5*3Dfr3:*ެfkye6.yi ɤRx 0OLSf*Ș`!B!'ƍcϞ=;vΝ;ɓ'h4hZ"""hӦM 5oH1md&ѡ'w?<'o&WM DވLYfc533+ s-)kӘ@]ըUB![XXf.\ٳg]vjҥKܹsG3q{r/uIpdMS6p9qnZmfG֙/O^DoYwf֘LԀ=j._&ę*sB!B9::rJbbbɡaÆۓϿo^ʌ3Xd =z, 0w?%# TDHpvǾaGfnJ$MƼF7u A}3 AGfӾY4G`$x6KbÖPM`= 5%9rag̤~4B!BP=̝鉽}YdKKKk<==j̚5ǏW]HݧxiR_[ϳyq4^LwTB;LkwZ)z60#-ԏM~hB23s+ؑ9&]E Э#uvaM^"ifTRITJZj"y_Z!B!NS#&krإЇ~̜9 Zl_JԹjTYWw$7B3kNƼ%\ 1\k?B!⯕@HHHС]t޸!`VVX5k|B+Whժ~FA믿P\\L`` }/_~hZ tr ! !JUigr֭СCQ*@0 }Zrr2;Ҿ} KMMܜzj;(--k׮xxxܵNdd$7odBCCQt h;0155%88]ĠAebbbBǎwӥKZn @bb"ϟ[n@@NNNzq%\]]ׯ׮]# ޽{ӴiS]۷/O&..mҽ{w"""8~8 :[[ۻ!//s[R;w:u*/Q\\%O֖Aaii/+##P\\LnhѢ\ϟ?O=),,o߾޽{iӦ uaΝ0B0o7nիWSUj5 %%&MпR|@DD...xyyaffVFUѣGiԨɄdh4zM&MeeffOVV-ZO>%]!C'I۷Kzz:+Wde˗/'<<\t>s\ztOO?Ta+{۷o'O&11T^}U}9+))aΜ9dgg?[l׮]ӗ/Bpp0/7n̛7yq3g?͛w7$${Px뭷ؼy3,_`ǏWYDDDP\\Lrr2ڵI&Ǎ7xٷoEEE,Z7xsә?> , ==;v0i$: ZA鉳3O՜9sXd +ˌ'$$D^{58?E͙3g8q]sN7{ʪSAA/"{{(>k, سg&L ''Fߍ1___ynJRR_|ӦM#66 &L@ttرc e˖K!xXXk޼99 ۳l2̙SapڦM>}TT6]vٳg[XXuV f^֭WG駟&!!(P,]yѿϟϺu`nn177Gbooϑ#G… [Fo|r||| @׮];w.Gz8q"3g̙3 4cǒٳ-ʞX޽{[Lb͛G@@~~~XXXÐ!C|2Oqpp@K/ĉnٳ'3gm۶|g|wk &p!4i•+W3f~BNxw1cB!B/m۶TnnnS\\|6mڰi&[À>>;vݻcccc<"## {ٳ?S.\@0tPgO>$K,!22RU~4n lll$33@2 `<ۯ-=z <<"hժ322HIIѷT*}vBA:u gΝkkkΝ; z?nsssyjϟϰax'􉶂С[re/I\\\_>|yye߾}V%//O`! !ăVQBݻwj۷oef[vZ|IԩR+2l0;Vؼx*1OQQMR!==/D:udm۶mĤVYX~=۶mc1aLBQQc櫫{ǪpMƀhڴ}f-BH,… GeY?LS;y}˧N3hU3i۶-+QQQCW"-[QF] s:OTXXȉ'۷/* Fs_~dggRRR(((/':zA"ܹsҢE S'U]:[ULڈzz`^uCݺur(J} {e8p ~!P6)BA` !-7of…e-sffffv*K.jaUvח>}[ZhA-lٲڮÇg۶m۷–gB_NN||T*6lHQQ@YWָILL[fʕSTTʕ+iٲeYk֖{e˖HQQ| '&&'N=b֬Yo a޼y5hΝ <Fݻ˴Fϟg뼼 µkؿ?qqq̘1CU{2*k׮GVV>B!iB[f̘ܹs }Ÿ|ټy3NNNݛ={PRRRŃ bIJ%K,a 4SSS֭t4dB!âiJuD*"0 'ɡZSZZ-YYYUC|􉎪r5^}U[-**"//c,((@ܕD&Rk]Ry_VVݕ쫯"::lT*]f,QUff&w)~S񥧧ceeuO jsU'##[[GB<<ױ N gH1L]B$g@|bK&Lf9ɫX`)mJӺUYHhڒ#9_0I[Și[KV?RܤJiDbtl9}ǏnӦԍrؒ43Ie?}= &%7m@Q ՏD7M;'d=V$f̝-0}D4ca$I^ِMI*oexg‚SY#:q[XuoKKC;w+)@z`[Uc[aObЫ3ra!\zUs{kL^MNaKgu+){´WJ`ܱzu&]5y8# 1\3Ռ1fOYWoucYwӜUcLLJ!#e3'?@pr2_Kݾ7? GM'%%\2lesA$IGd8NR(=TPP8%:W+0">տU0YϪ1ԍr3hh7ƴ!>)#:R‡3ӞMc,3{6s,j CB_㾀x&z5ùN(-estgƎL~gg;FUO34}q^у)BOz6B;yv0w.L߇13/䡎,<=Cs~X.|ֳ]zB Ig@K$I:f0Y,[ ~5}ӇI7Wfnc;_gMLeflGFdh)g%sgc -)d$>Uf™~K3;엜fNBӞL1;iN]QK3KSӖ1L^:FW70nOZ6L(1d-?i&䪱u=9;Ǭ:&e:M=LQhO_5'' ~Ti"/,O|;)v"dڪΐ-̙ª 9J$I#+:vj\Q璟e25qcxxf{'ˠXDzn=C檨X!nGZӸcD.όBgr [{pO2%EMrc K'cs"])DAnLSzhw=r3x}̀pre;`x:>4c QQEBn,7tS edd[o6]UVQfMbbb8pZ;lƌCi޼1yARF -Z+!CMAAm۶CdffkgO$I/XPPX:3i$)W^z)*Tɓ'fС'|2i߾= /2`fΜɆ صk4oޜ|(,,.VZٳ &Ldd$ݺurʌ;ewߑƅ^H*U7nʖ-KϞ=Yt)ӦM#77~m2~xnFxwXt)l20:CѨQ#V\IAAzr_dd$'x"=͛7端O?%88Zjqq\@55koߞ{K9Cbb"3gdڵlܸΝ;S^j׮]7tzw!//? 裏ruQ\9VXy~}x≌7l"""x?VLv93 =`Xv-o6TP/2e[A$I:FOV[ncҥK Df͘0a_|{ax|dddEAAP}$IcX7o&,,Zjp'o˚5khѢAAA*Uy`D2erdffl2)**bÆ ʕ+~ctڕo]v}vʗ/sZlr DFFr'b ?xTBRR~#DDD5E̘1 nݚ7|>zj8s;w.ؾ};5j?'((iӦcjժjwqEPF}_P۷oiӦ|ᇴmۖ+VЩSyٳg`/_~:5lؐ(UiFVV$I$kӦMTRBCKBQQyyyX2WR%.),,䩧C4h_sssCBBt!!!%w~իǂ صkW]u˗/gԮ]A8PZ8|?xRSSYhqqqr5\Cff&#F 777H;==ʗ/: ט$I?} eXt)'|2+V$33[ţu˗L2ԪUKѣIMMt޽ ѨU4jԈ vouzz:4nܘRRR!888]6-Gs/^%j׮`…?kFR8W^iii4jԈFxԪf͚m۶7o ]HIIrѤIy6mz>)SSO=>;++_֭[z:UTtRRR}#H$Iǰex4ނ*W5\x=Nn;v,J"++/6m0~xFEnn.[\rnݚ3s̟ /W_}瓙I6m_AGGG?M7Dbb"Æ #44J׬Yw}7xO?=}֭ٴi?8ԭ[FVVVZ1rH"##)U={,RjUN8y7M6L8G}UI;<^z%fϞMٲe!?Nzz:;w&""f͚_i׮<7n:S} ܹJ*&֬Yy(**"((('r !!!xzKghInj˗w}K/Dff&;vdZ|ԨQ//wL4Ms뭷h"HKK#++ӧssmqeYoIBt !4_k$$$ЫW/.RڵkG߾}9묳X;}\qԯ_I&QN###9383x7\E$,Iǖ2epsy;pWflܸ *ЪU+tr{E O1c7nN:tmS-blذҥKӼys.ʔ)9w\^y֭[ȑ#y7]6zk{̚5;vPjU:uD۶m|*Up5װa&Lʕ+ I&tޝ@3fe9Ӹ:x֬YL> 6gA-.rʕ+{GK/=#ޒ$)В25kUJ,OMM墋.y?[2{H JϨWgucǎeÆ |_A<3<~ZZݺuI&<YsӠA̙k.,YXnK,aɒ%YD˗ӨQ#.">oɓi׮g}6;woƍgNgɒ%L<>}ŋٹs'gu۷gҤI,[W^ynݺѪU+K733s9v1vX6nŋ>|8-[G ذa{ap4$I{K(1BYXX_7|û˹Xa 8 .\HBB} 4`ҤItI7o[nx㍜vi4lp̜9#Gҷo_ؽ{7wuw>s9s9L<.O?}v۶mOr$%%Q~Yfqeq2k֬FΝ?~<]tQ`)Sٳ'ݻwrlٲ Ҹqcx殻_~%~裏0aݺu+QI&{ؾO:zwÑ[$18,/?O ,{WO3fLPfMLB2eQQQ{B|Uҷo߃n{";; &pWPVi۶-۷_o]Jڵ;8;.]Z"\nذMΦ|G~ĈMIhInjٳgwg۶m|駼k[ogK.%..~]v-Y&pqvv6}IIISXXh_TTnzꩇ|lBB5j~z233پ}!ϲek֬ @ }mX IDATˆ O6m8묳h׮͛7e˖Gj+VxT.X 0+^$,I^zt2d*T(<33f͚u}{d:wΝ;i۶-UT)l >33)33(~`O{jsaaa ~<}Hխ[$^z%Oȑ#ٹs'!!!tЁ{i޼9fbҥ%> I 9sf)]O?ݻw~x4zG|k֮]{V}-Q~O\֯_O||oZ}#ݺuo|bbb[[N[tؑիWݻc1b^xᅟ]$IҟK:fQz8ڴis=ɓ /O?-1uP7o]t9`%++k;wfΜ9RĉOާbŊiӆW^y?f͚ 0m۶7}޽;cƌ^YWV +WpСCYl}!//o[n;,1Mquge˖=~}Yٳ'>A~rrGz8zK?@K:ƍӫW/>Cy7iذ!{EtR^|E6mDNh׮ w\}T\ 6 /_X͚5?~<ݺuQF\{4i҄G}A1{l*ׯONNs^ 66RR_OcnӦ *U"--3fOsgӤI+**3fлwoNF_N%999soͿH-I ^:>,^z)#F`РAu۷g…<ü 6 rqrwS^@{5j0l0^~e K./8;k;uy5j@{|IzM۶moruBNI$$UYg27YFj'}¬9sϧy&\t^gѧ1g|2S.Brem&5Zr2'͛GK/Fj%%—擝MNk (W6:f7pռGj>eJѮM)l94it"ۉА6mķ&a&T u/fL<BoۆZzIcC"Y!{G}CCa^^}o̭w Mؼe+w?W8v5Wkn|n \ҍkL~o*#~.=z7 ؼe+/@XrUzMzPZ͎Ɍ_փ߭7<3ez>Oʮ|gc-Gvi\*=Ivfwytu {f~9]gϞ,c.y"fese6-dey\f~/ItLrX1iӖ4jVFxyefgmO`ztI˘4^߇{rZ.ы'F?~(p))~|ZΝ5 asO/0w o(wWʾtPRKO?AhHS8;u?l&6֯giָޜЇͤuewj*o(0$3s=xO}PF~H>4({zvtbI$$<+T(W(;c=Laa!MzS[_ ;weӣ%NK(1%ŧ$S->>~Zr2;S?Fʮ]-['OᔦM u2xy'-Qb} Le._,OLdђԽï.vj\ի>4n/"#(S4+w ҬIBpPHyPPoΡbl$I2KѢKM Rr%nNr._bܼ\6m@'Ӭq#zOg΢i׺͛598)!S?7CjZ:M%׮YXreuEDEֻھ~)qp{}ޜX39(~@X'qUg?cKxiڲZcIcK:&<9ޝ*NxMzF ]X @AA!vsb@G?#eңW\ۇ[<ܲ+]9Gժq {SSװGpEqAPPi%BSPBylLEufђ$v翯M$I$G%s~c'' -Nn=/Ɛ.܉ ;w?﹟{Ƴ#GrۭwFFD#͛RQ|\{e{̘yW8V-1*PTTE 6 ǖm۸Gxp4mԨȴ$Iұ`IǜȈߴW_@XW}BZzzV$+;EHٵ :ݑzug %ۓ'0 ţ<ʕ*RR%*/ω ddfFUߺ]u-.uҥX~} LxsJmYtP<UN{䓁UУ%%%Id?K.8 <‹{ۀ~ڽ`銕w.}Ͻ gсtv_̝+yWXb%\)q|Bf! ^'xシ GF?1 r|n7QQGկ:g%#,\phռ8uz{5>'}O?˷IKr|7nԴt*Шa}^ym"/{+Vy<BCS%I%NtL !<3enЏڴFrہԿ_v) f䰇yQ\o PD.8F|*T_P@hHWv. iѬ)<6?J(_؟{t?~]{eO yix&U<[|ye@UI!!!<;r ;Ǽ@bz+[|OcēOFWFjU$I1'sEE[%ZIwںm;yyW|~n߹ܜ\TLXh ;vܳ;vRbEʔ)}cW2!!! غm;TTf"Ba+M$Iȅ 6My^YYVMG%5U|6+V<})] 5cU?lRԪYm"#"HQ݋B$X$I$ [4'==BH$%k-$IҟS%I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I?PK * L ,$Iцʆ!2$/gG%i~%I~2R}6KSҖ$I?e$I$,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I #UM^a!gd?YE~a1QԵܻFwض;rv1b8 s$Ij $Y{%w|;WL*&7R?:MY;G@˘lv35JW9?5~>:yssPȕs泌OY;S. g}O>$7BDp8fIrn$I5qt&qmuty~nMZȰ&"Z|| lcsNsX{%j|;-INbuFDU/qv|)19;%'Νq+6P'olNq( 5lN*S;`KNq-1^Ɍ )IT-U).97)gSi[VA6S6dKNMS\+}ZG[4m#cz;ʄ⫔|(b9%>JDKWzʌjv3vrAvL2\Z&rJL)iې7I>-~#3v,j /~nRNܔ6~NVagǵnTc!;0w7=8|:T>`I~&G%lܳ;IJ]{uܼp$loI'a/x2+?ʆaM&!+[Vϔ3Y>p[d7+7Σ'7:cc`A ;Y;]ƭ˿9Ykr#_, 0.3ou틞ţ!$grX_Nҕyɀ@~%FԼLk2 0c#|xtyQ. <$,&"8yDrO]YKrMra#3jT歶 u/GװpJjK_wFZKÈyPotv5%cZ;&/eC6>=IBQoz;svS&4ɛfVi^!E/^ڑٻW>GkG.vUoP*4{t~scd[h0oKQQ!]gxۘc!6~gg&FN[Xѡe؝bJė "0A ?kiS6fĊ$ɓoe]gۿlסR3CK,IX~~yH#N(^ks*]<::sc`٪' փsgJLB9<5۳F Y: J,t4([FFMY;XvP&$ΡS|:c#ܙxwrspwpVĕeYws1}\:}v ce}~>5f:{Kv7=!=!!%D R,NYOOώ,PzЋ@ eG`%x=2ߝ|f;ߙeRVjTo|_nKrݖ9xĄ!zrSQ59ղu㪧%y8o.^2KI|UXm*pkvrI``_-0LVƷ~׵lVOQ}VfIҽ`ӴjfWVY$Vf ~uۯ/hOe4e6wp|b}'-_VyuG`8{'8UMgDWKl҃JR5DC{.Ohڮ%Iٮ7y_W_jw| f]Q:t.(A{Cͫk۾TO:P#" IDATBtn\?eѨbWz7zޣV>6MGz ~u[M6 &=I]l6gjdU۩:^q'oЍ`PBc{kb|`k>zz|T=:᤿UOӌKd3YoiJ[14sbݳe8J48l~WSԝ/걍qꂦuwK`=-N3>(QK42l.]o&9N]b"|p F8elϐ$_ǧQoaiWqZk?R@>~79t;(u[[|EZCbLA5܇p;u+vW+*\r dwۇ?(,VǩkڷL__m]*s٫~xm('qαg(j{ƪHu%I))<1`8j KG~8胳l4 c1ѧu._9 &ßU~X)_pk0j?(ڤVwjp:}2 B@+%ǫ{n2 mV9R?3w|,9q0 ŚjWԏ~i6dE.Kt+5U#ժ&QP`$)I}o("2BW^~bB%I!!!z57uE*>>^s{ =r:uTj@~L0^M}W-[4Wbf{t_T!ءCw'{6H1H JPaevjM|?rn_W^ƶ^~E=SRٿZ?CWz㭷ˮj=p߽;Ҭz9}6 IS>_~AbIҜޣ_͓$]}v/g6 ŧk'kIQC`Ο0Z0 jl542apeV__@mFWl:>>>6t~'DG{> o$өy jWΟ͛`0HZuN$?_Nl0;Lm8FWoddS^9ۻlFZ>9B dm7tD?$"I;TEEEՖ\.ynY,v]|źվ};mݶMm13! D%Y%GBZkSoTǞ{#u)Sr革Sԩ ׿|0HҹFb6cl~Cr\ `ϿVs/Ǣ}z鼳Gjham=w.I=k )w~vC("f蛙?jEItڳOY Q``[?&N]41UAa~~;nUP`>6]}{*{w(|e~mP6pF0ڭ?u7Zp]v$oZNK6nԏ?U~AAIƌV  /jjuس/[s, '*2VyE'wј֜yuu%=ݺtVJжM'MCwO]4j< 9v{)Od2iov;uԐ40~|CI< i"&*JڷSפNkնu+IҼE%I'WrR'ꢫհv"#'K.p$ƻՠ1cسSr4y҄je6Oj_W;((0Pv >l_IҤ){jڲmFODJc6k`ߴSv{#!sM5i Mg97\ٗp <@[P]UV^V Ys$I]4ڶ,>>z5hX},IU38?|8}wްGӿ^N&C{ ۧ>7؍d{D_-˥>=ժEsA@q''yvz˂˅  I=w^6;g%'uRjPZV^@M8ov>[MxURZOJ)/1eZԩ}[fnS^Tݮi_~sGP]?\W߶mWrR'EGF4?V߶oUfjuզe x/k>LǏ%4hj|f%7U*,49>.mM;~QCR;[q眭&2Lxڭ̬ݚx޹ԡu/< 9voz-[J{~2vk_Nu7iʫ{c$Iƌָ1$$TyPzk@Zo9N͙@>rrj|2Ih"#/IU˯%)swzt͚պ!6 >nB?N텆{nw}zͷ#뮺\MBCk4軫e?e٣N):*g^zMm[RV-̣I׮{A8,@p:4O'zYuAz{G++ h.\\mCAuѲrx L룴R5t@ 4@q1Ѻ+k|_ EEޑN?j HeC}ڹ+KS?>2?peNK7jߦ뫁i}ԩC;=z߿??_E[xtke`hz5 =7T``$: VClweCҐIo4EϽ@& p2-5]t˵.uM(`X}L}8s}2KLF} iRS_}QS{T3g=WR>>>mY-ELy`ZdNv65Q)J!jT!ҟCۊ_URZYs(M}EiR/.JvvNRm|}3Wz<%7$E[դc'I4Er'\$%_M۴Hbihʫ^V֭tΈafz4d@?HlY_N21QaM7~XDE헦h寫շY[~nbo۶+C{IU2ܜ 4o^y ݰQZ$O{e7;2w۟geNT7zE)1!^KWҥpv3v벋&c۶жL&:k+IZnw4<{y9].oZw#O>&_8QMkX_Cؽ*,*ֈfEb3L&Uڲu@#NC+~]KInU2LږC^׭WHpRwSP`nd*++uu7i銕J隬kLڵќyuwW~Yy,YɝeZvFǼ>[EAAZ|&_sJKv tCcWjke45Yj٪_ȓָݏ>^xYC^8QL@z艧4g|]Ǟ}^J]۵{Dzow?RRvj;EED/հa۫=+ F8et5T$)πrܼK@6{ΈzU\RA'?Z'ȲZ- WaQKJp6Uaa*(,TIii4c&š('7O=*2BsRt%i Ei_Nw?{,"«?6m鬪[Nrr$)%%ջyb@8:TҲ:C^={tҟ vkovvNK9'88Nٗ}\]eevIj%3#@+~MMw+I1AAanj&{( @c7;ˆQ7R?B @ @ 0`0` @ @ S8չڬ*8_eee$ShX2QpP/?Z$6WddE9 rrr-c:0(.CZr98"##uVcřF{lf^% {k  SRX)_U˖*)* 'Jyy6QQL> @ e =nQ Mål>?r]Tv+Tw JBgϽU;J깮74}$孟땭51axf][~}6QYSU>~tSzil}ZzYv͑㮳 `hT 뤭gM4?w$[h[IҮlEZCe6$IM"ew;"6RW=r]cCq6QU(ǣ>$jTHl&Km @cא_nP~e~:%(^ %I]+[Xm8vfJ_B~Q[wi| -[yk$I7hZݼY ¼5:/LSm @|'4x@brǝr Իo!3^ ]}ezGl I߯R\t{!nJ_~$)}Z=z;OAAAz׎ضZMyE͚$ihQg/JTYY~i}4矽1l~iVرb^'ۭ?nM!!WV8*++ؓOf霳G  k8 -I*..֊+զuפCr+IeI_|k:gL&ݧN;l6i/s~=[jѢwMQpp`uNꤹvНݪݻە_Pp\ 'wܮ[nAA*.)ee 8vIX-*++B6[齷Prr:*)-ml6yC$\.vԺ`Zdi2KRNNF./txh8i\﯋&_Htw۷s$egg+(8H~ސqZq睧 i /JPIO{U`PTXX$I~~ڷ/A>t^xZeXֻwSNzǴd #pС`0GnޭL&5mZRBB:wN8k巭ܥ/,(?__zӍ7_.%xhDI\7 ]2Hߺm6oޢkwb蚫m֤֭]۶2MZn}IQ>$IGUv~`8h_v~v6i-Z~7IUvMj4N6>mڼ5qzumiJX7|KGܯ~J{IRtT4o|=bs]|Gl'=wޡ/>Dqf=ȣ ɈaCuf?ybxeUTTckoݻOQFyn2gH֯[CUH h+طlbj򫯼B͚P``\NgbkoIRi XVlVe5 :bjc23O^~%]ɺλ!00Pϼ?89BuΚ!IJOOo:ɒT UVV51U~AAmv]vm׵~M\.#GFFm?>o`hOO=.Ӝ iOSW^NI ph8he4z]z` j%0` @ @ 0`pj'ΝdXzf+Il꜔$tÈ(xx9ajӺ5'Ib8:'uRmeXp:mvJO:Gnjݪwffj%E]ʣdeeeڽg|}}%)Il9a*$$D)=!-_R99'"DXZj-Ƈݺyb/X_4&-YɤhՖ;N1Cc-X(áj*..H `Zվm;[0_{$h_տ__XC'Iڽ{ $?ED+''W Me4++K%2 j٢egMjΝ'$\.Wqܵ;ߴNۧMUPX5 mBʪ(EFFҡ]*++ *2R{Q2ڝ"!!!o rѨxT;vKFL;vR-[ܻlJW-*=]RեdZ=v^,>^&I9G5&:Z*--юrݵ~4KHfՁڽF{p\EGEIiWV_ݫYxn٢F@iJlL>gA+$8Dt Q-վ];ﶚ'&K礓>*[QQ֭Z[r$)<<\UՏN4t mFӻJ]?5%E}zdVdDƌ@o z!Ch=r$IQQQ:{EFD(,[k?M&Fmh4MV9|1Ϗhee/\=TcFYԔmv^IRhHƌ>[M4WvReM69|X5 ҹVtTL&R{謞=phqeTQa㩶v{QϔZt7gޑ2Ѥ9Uyyݰ!ԩ/\IW$7UƎ'lBCCտoZe,Ѣ%Ktڶ}R{hӖ}0khgF :㑹+K?͞V-Z_Z .[ݻcl6)66+I 4Hv)@>8`bbg^h 0@|eZdZaW>ftnP=[m$d3 uVvdT͵-cZ(???*(0P_xG$cCJa#ĵi Ѡs~.K/WNnbcfj\\NC]綏W*++K%U=ʫO^dg*))n kgf,<=$8X;uá`,Wڶ=C={x/gP.عCCRwhhTnu 7Й&5KHߺU+ؙ}2LU?AV?oKa&>WyG$%ri_vG##"$I11а_3vTR`P6mj}fS``F:o/Rm QΝe6e0ԶMKK巭9;Rܾ];lznHM:ڵmg%jr{GwT``w5ɤԔEEF[!!!˯:y#qd2C#.۶}V> oZM0^Ϋ*gѦ͛UӞgFGEk¸qՖާWK$͛@NKk֭Sbb3%wUV=thȑX-x^Z/˩[3v(i;=nܹS%% 88TTTs~Y=Ա$X̝} 5k竱+%ݮΫvnMRӺΫ+V*OoM`\.,L?ϝ^=ܥs9woޯ^Vפri-U?H&5 F8el}o5T$)πFݿ}fv~qq߷>M&# }Ӕ_6nl?j k^Yy,&Ifڶ["}U 5l7tTӆWEF Vnw>|v{~cרt IRgD7DGz5OL`'wīYq.Xf):*J111Z|)QZr;qֱl&O7dkMk:ZN"ƌύ\?5Y1ZdI%s@O `ѷϨ}%~̝y W81 4 0` @̔g_aj}UyG0n$駛>v8\ z55EOPoMZOP?IRWsoOVόDctp`8nZ~J53k:9\.I}{JQp){re$`84, @Kq]evZGJGED8E$8 /1Z9EEڱ?W2d[mCF)UI&NwV?0j(Q Iuk IRRvsFݿfHNrr$)%%ջyb@ `0` va8[i#(Q=@QOf?x/ѪK(߯364wB  0` @  0`  :>95 @ 0`` @ 0`0` @ 00` @  0 \aӝWo͟  @ 0`0` `@ 0tUU.  0` @ @ 0`  @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0` @ @ 0`` @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0` `0;._dtEw+H>į #X@@4M!<#"wK""e*dgqyuݮVkk("b:GYά@v;#bwT׵ar N@K#,IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/extending-openapi/image02.png000066400000000000000000000260341461403617600255710ustar00rootroot00000000000000PNG  IHDROsBITOtEXtSoftwareShutterc IDATxy\Ta`XP M RqWBs喚Rvn],-JʹR\qMPdrCE@\Xeg9?P{̨px=>}Ι9=x9jZM&ӠH{T#,݊ VUO@MP|@ _ |/?E_{7s:Փ FO>Zo̊Q[|Ef䍗m|*760`Sgw-؇njxdȧf->}J&=7a1k 2PYޓkpujկ?kqQ5ru=dg>O{9ȕ_?s ]e򕴵>*Ŝu Hٻ8:MZ [}/˱7HbXـGOo\o9_3qOXǓ.>~erګ_RťU{k>R0\8x$ͩ/Xl͹IӞ\|GMg{zS~x镉懏W/_p\WϽ45붂oQjJOzUT6an"皊Z3xéeC^ܿ"+l26/̘[+,}Tuj9}h1lX1.f[CR2BfDc'毈H--g or`?hu9efd\k2+Ro#~$Kzyfl=;7L F~9k[Nxw |'L{p'1VQ׫vTUhE}a֢qʱ536[Y6sAS9Ai_Ơk߽sE)'S}h>})mX|Q[˯uo-PxϸoMosy'ZjuyM5Q^mwWw}ӯzwbަWO[}ʯD}Y=+gk?Ɋ>[0'hJvzteoҭSGg~cE$~YyoG2m\V|fq-69TpԔᵙּ o$x u3 ޔtYMD }:z]'8ԡέ2Nn\\UED>H(VEgpu@E)mЪK_""ekW_q>.;/+3c̒ͷ=<Q,WrLjqZțZ7WU *""ƍwqs8j>cr>lW̡ Ooe wnZ)4D<rM`p1 pՐz[먎ى5F=c"WД[*Vf7PS_/^jsPϭmCI7s:MlNv,dK{sC>*ɢ:X _:xmu#Ye~[y_IU\y}.?#qs^6rM߼_[;72UDJr.ټnW3e&^*}Y%g}ȕ EDҴ}Go͌rd֑;fwߥZ7tСGmJɏ~o.lo]Pנ{XEkOܝ淪Y]|ȝyEf ]av&b/-仒{O];Nlbnu=l̤iWw{uwi5o.-(/5p*V}:yGn?еg}QsR=Ew۽ׂ}N]4/XĦ4;EO{ܵng )KG̚l[rco(>lƪ:{L\oպ~|w?a%N`ڰi Enudl͚Z /4ZpPTNTUZ&iPuԱ X 7>Ԩ#?n)48ޭ`0hZEj j_ep@P_h_ |/ _ |/@ _nH FQ֮<9j`O F49N]CF&j_r*8c2=+SnWSx!"w||ퟩ/@w=Ҡܰ͑1Ƙf7w V9C'iR3擧H>g _drtI?q T2,:T9E -U ݛKvvD:T!f?H""T"V|]I__C) Ƭ6Ƙjƹj-SUZ\QwGE-:r޻ 7|hq]wB|i>TT z|q,s_nw.m܃h_Rosa]+ r93w-C[,]$+:.0;_ ы?8cyc>ZS#"W:>ڵЪޭ0@ED$ɐ3o' A /n5ED+W"v킜ԋg4LNn*"r[^ʅ{]Rɮ\USu5n׆5z>Z'32|7O#TA_Զ}{Wnpʧ#~2nJD/*ErjRi*"I˶?qmS/OU2֡՗tZ]%^˞hL@EfC=OZfڸ¢Rof}x+gglq5ѻ;~=-"y;m6O`pi 8[/=SlҤg?3-TE_{6n2|⸶nf),]5!nVxdlRQPkϪ:d訇ڠǃv_CGі^8n=>;z~mZ~ϴ""d%h {mϏrԳ_/O^c9fU߯WUjLA.Q;7E)`o'kDM2icpWq "܁nA*J%1+rԌ^pU6P9,yɧ(Tr#6Aa#c1?nJA@uCCu8tB&5c>yzɎs& O&wOgbN%S P P]DQ l|aT1woVG,9TTO:?swvSǿ^EA@ĊӕDv^з~pl7_'ELbmJW__/ gfYDu/b-mN-vņsvlт'j:T3]zzը~~6@=$QP-/ bvFTh4_ 6@1cLz.Zmix,RÉԸ3,3KDhܰKXS$$9/>~hj-kTZo0Fa n k׬VO]pë.4^ږW:~7.ر 4,=S5upצ-wd޲G:`2.W0vz[ޘB}ȱvv0*d~;m"}|Qr\,"Q)nSdUS}ۿ:/nSca9֙Gxܸa$J Loקa 5?eʈu[m~|*]DM[|[jAw^ݻ+|"U v&l#|QyKwx傃R1޷NJ/D͋-t󺧡V#rv޶K]߽Fic%jwg(so?jhiK 1#u#/~کok|jȖ|Vp@<2Z䔗]~}_%EU"6s 5c硽iVem<pC"~94+ߝH9o=S7dsI^u{Nuܽ4f߆7̌JighSo܆ʥ1_Eų?=~kRRmb.q/w0{ "ei9E"nYYT|WsG=a햃]^}uɯqb^g-JnVT&NS.]0ktHyY]jG2ԄGM7( n`&9}-RRwŠ@o(s)Mܴ܂V|>uBun8_x9:N_vU4ۿ;smKK}tR.4 [UU`7UUVd}ou}C:PRn>{7/K5U͎1 w+6 ZVQ?>!+]yvˉ.Jٕ|a\Ҋ s,,_mϖjaۖ ۨ 70;|#*h4c py/씮$\J "̄DB3v_|/@UMi:fMGfvMB/ٹ{#-M8EnQbJn,p]I'F(RRsMo߹zq'[  (bL8?75]hu@utNB) ,7=?lhJHO1aS\hƴ˻?a`=hCzGO쵀?\{DO:K*_Twmv]lR;>f#{xߥ /_U^1CSWSVZg&ѹ=8c^l*׷ƌ̯MA`:zSƉKV[q@@i=z%1Oo=[v"6n^3nwR}ć=biXCO2tV "%Jr};ꖚtW yH40(}ՂɅ[FE|<w+ë.4^tn>qr }D|_Af}c|V7E,ߥz8bZ)wd޲G:`̲_?r} XT<ۧM:)+mج;Ԣk7hpt鎂FE4挴[wqC? Է[۵q z5od~>+8z KjbBb.!K.W0=߬zՑ#-:qҘ}6pr203*ͼ쌰l6f\XD"R7܏mɘ`H-77'$HT٥ؾ[.r=gRF1_l죹 <`1YED;= ",>5#7w ?UXX*:ƾ"qZ w%Nnt2?dS}KꊊM"zF8܅huiʧ[]:q֤1"a<k sk7')w19GBm./ъ8]]Dt\z>"S[=}<E4,Ԅ3oSRwŠ@ۈ>a珓r /b+={^)seX᳽Li"?J,:F3Kr^ˆm[6eq;3! IDAT&ܚ4/RO1aS\h+^mzqk=^-Zm4\w0qkv mz_-S'>*':;A! (sj⷟q rHGƮu,6̲scc^1ݾ?|9yέ;>ٽl[ajq_}atjNҞޙVvo'˱.w5s@hgRVr%3ivءn~kǏ("aK5v\K6&+|ļ$,lUscu"fܳrgʧG7K.׹sr%ԛ?gwλegҾh :jBC\^AƜ~`ܴ>Fvy%gˮ"gv*gԻO{b؎Ӣ,"A?[x՘Õ!otk_r0b / \pOW uW׎BԢܧ=ڀnu74ϟ9e_ȕ=Fw߽1G[6k;2+xt5;,kP3BEl[Kn|;giuSI=;o;/t08buUqu Ero߸7˒"7mg:}ʀVmYog.:[t ?<%E@%!Ch]=Q07_+"n޾5Dslު"kwNNvtңk]_IEA-)L+mf1&Vu:w7E_Pjmuw9_(j֝w:uLc\؎l}}rq\IkTl`d-ɯ?zнYp+O}^|:fg?|[^r\_Mdjj0*2^c ⮗!~S^9}͞&-q;6d[z=ߋK\ mR٦Sh뱔i6f!E EoӱUGn= eq7wˊi]85_;-9'lJqok1e&':7W= )EDk4Yiy" uUnHo Ƿ)MMx*NY5)維z,:T96щl_{WX D:T!琙[ wU$#k*ܶArӒ -* ڧ'eR?= _AWWA 6_7rkv`Q1\[`QTvfN]C:u V|@ _ |/ _ EWQ*?IMV|P-yUEQWFP.ly}Ph4V L3ڢh[5M:9lm<_~,֫"VVUTU=UU-++X,9 ݾLI(R9U#\ҫItV^^^VVV^^^^^^1VEh+h4nƠfS {;3R*+N2+`/@ _ |@]AHIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/extending-openapi/image03.png000066400000000000000000000256501461403617600255750ustar00rootroot00000000000000PNG  IHDROsBITOtEXtSoftwareShutterc IDATxyTTufHLEM4SrMSS2MK[2-5--sI{RRs] Ld2w }ZOOZ:_s5̽s{̇߹WQUU9UU-hVb)5(Cj /@ჿP@3K^kރ=t/i3Mziס[gdSĐឍ5tph=_ko޹gV9`!92PVAO{+ڲ_E굫qİ'KҊw4+*d',;>%5zvb$\@} ܥ>r^_|i;1u}}f}ޯ=3g/]|>3]3cIRnw'ە ={5+"/ź'_vpt",=ڡ֏TqL23zvK?ҵ)a)>VPj@ȷ:=:4jn^kōo Yx=/jq#SJ٤aE*h T-TEQ-;L[t !N(bKsiMI?`sZo~8hEngc]Nk=hS.&~4v7, qĜz,[4+gk"Gb򽚷=6i ^Ygzn'3dVyi'|wL%dS:WWOjSMhJ{ѩ9uS/]2u`ں6ċHAʉ5KB=E^U$r.)/"%ʼn|Q./ŴvKŽȩV;c鷫usY'ք߇L+o'Qq+*{k|dID#S5Nz}FF]*$"7SȢ :6xlu7""b׼G޶B-;ȱJR;jӽuVEV};|%ȁ 'mh*_~4Nz{Z`u!*!jVՍ\XF@i횵W}j*bc [N,g.f5itLO{*.U*ULN]Gl;|Z_Ծğ~ҽx7{]<ϲ^wCw(W&1CjChyVq"MP(./nu+kj+UTiôj h3OLa>ӵht"nʈCHnEEDT9ZGb,ttދ(f"ϝF-e?Ys 67M^x Z?c/@_ |(Vl5nPˑ%xWжjعCfm?g _dtv-%rHTxp?huxEQ2 (jޢoLVGT"&w*K'SĊ#J൷FNAI㕣WwQ(ךL&ՙ@j%Gͫ3 Z1{vwvtmPt\>='nS&,wn Z3s3iꀢ8zy;iJxtha]ZMqm ߏuUq a<Ż`I'% h ;yke* k0uf[)כ۰nSvۃ07g\"E`>[㉿ouJ6xzASVd+}`j몵"2::bȎg|-e0߲|fh3g*} ^o(m2%`0x?P'y-ѱ]TVDn4}ouaW}<4j_-Z{ejH~U^YVcҢSLA7'_jl̲Ϧ 9$#~7f:cmz5G\vZ;ܔ(s ?~{\3'@ED$j;ӠQ9{<h@DۨQ={ڏO8YⲟV!QZ}#G9kS 呷.v7zfeZɶcVFniqO6%ZDD_#Uqtv҉^بJ5o77{yͿm1lj94#B (jVFID_VM(SV3m\fVH_,|$tED${H—v%멫fi߼9WDtem@Ya2׎l n/GsF gƨ,էeຕ5 >'L""+Z=^. o_-լq^ͻt|gQ[v~[+ډ&R7ڮ_M]ޝ9?zU-KXZA=/xCq# bNppg|z="W,ZǻJʡCϺ=gr*ɬh T_ICИ{/ڨg΍ k^^{rסg<:U-wUUX,FcÆ6ZXSUx짡mEyPeRcg{T,E(N氀l^hJ̊/i6jrTD,is j⏧QprRwc 'r $ա$J4m2sHAZJT:DzDJZ諷!7S(9hu(YLZ1V1^ <ߒE൷FNAI㕣WwQ( šL&ՙj%Gͫ3_X1{vwvtmJP"zŽۄTpI;˝̜vLe% d*zܾX`06D9fMaҀ/s +Fw=hrl6iCź"HqPwWq=]ˆ5ks>8KRL@ſF}mQþ%[|]e޵iɄneJU6lԨfBA@+Oǥ7zT WcVg4Gȶ+?b'>ZF^k.gm_|΋G8w٩? B(z}Qe/mҵ}5zUȏ_#@Dtl_ufժ[Ϯ*5=A`3j`߹}>luCv$\?C{h+}hmıt]ȸn=aӕ_x ;.U5{WC&o:i׽[@{g#@|u7ʨ]˦zaQTU-fZ,1aC-u,g)BQi=KE}seۣb)Bt 7dzF( IGą#_^c9Zj™c ϸZ#z_XOX6sMJx,Mm?r{_Os }_.,1t!vňN%=xUx' /Ptx4ǣ"H@DTEk/"2:ˉ ?!eXs֦t!AIa#ܸ|w~Ŋd֬OΟ/-+Ӯguw7 M f fYg)ߧ.;(rm΁Y齉7n6{@)(kJ4Nd1&\JVD3׏׮u>ݟ֪' YܯH?JnejV<(y Oy2XL&sRR2sE[ǫ=圊ZwKy5ѰB~*:R.s*fE0RI|)뼥LH!]-׎-z (""+T ]%u-s|~a>ﻁbx%]Ko +w*L%Nzؗ_Ws1&_;A+h:9,f=w˾=U{׭3&9}Ţc3j?v[떳7e%][ j=mDDL"ggl^: {ioy-C]^<{ɍ[0|w"Y5k{2EʴY>Bӧ;ȁYGYٽ|DDDy"r ȭx6s%,WNZ{(rI߬ܶun߆:NNbNpQD9;4;Sĸ.ɋ6G,o1]O{7fgDDU2\K.%+bb"/JEM#%GD*}v ZP RjpH5DDL5;9v|=u=w?ǒu""XNIIiipo'8vj>ݣaZUt"]P'T̊;<9`|?~\ks9Ǎ]\<,*1]~jS=o{|euz#m[_N涨-bypǐ}-loʺdƚӷrEk[t}7P~8N yMBGӰpl@1nN׶ n >Ъ3?zڧyV$STU-fZ,1aC>ԋ@f^u>zb}oa`-Fn[GEiѪoush{T,E(N氀l^hEEU".S Uij͢=ىHRI! }/04fuDt |5d|eXCԶUz=I\aFjeZ|xSt!:zE5p[瓍؍?h[kE0} [T#SXelEܠu[|2qM!b3v sG++OǥۚG͜t^9~Vټ'n;Ӱuˊ߭Ҧmc'DLDtUn'_b)]>tޔ+MrgJ\ ӚCcBnMGG+"] ꫯ[7ruT gӠ[6|ƻZVf]]ȆwTWnufɎUW'+v4~ؙ.Ϝ|,d.X|MS{@JڧW kG8כ|uŐ:.raf#""?}4{:NA? ṟgn¼4%J[o-7s'DD#"{:ضU[-FݚZR77nʹx1k'46%=WiZ*'i5h؏GE 1@-+\Zqj^fj"7pr,UZDjۛZ4.?_i:u$qܰiRj5+z=Z5fvj.:9;*rڕ,Uk{RJ0/ 1g5egMzeO܊/yyVPj>"sZOwg̼;2w˩])1s;l>]wĮL[ٍw6zQ)_<Ɯ/ZʧC@軁5-2m=?˷_*mI[mTuŇn_z[gɾrՅ}ۇ鬳;k挻?KʇnuV ~`91$|q};O90Sx(Z?쪪jXFch mԱ 7-ɏ[u$}D] Ͼ?}1o[?9OeGR"n FQ"8kӪQP6rM-R"/_8"rcxE:NQB>;p\jWcfM_y޴ALY}MYW +gOߘaVpg:M:p\*pԮXC FpShr~]]tܳ3_X'EI9&Z'G_XY7DD4|alx4Q jgGI' J[e~MUë^wx_X'syorn-/Q PBPVD&_X37'A~̓ZL2N=?`mz:&L<xDp⇩i_|/@ _ /@ QU )޴Ɋ/J_EQE\5PGƂy}+ڶ*\'8HTʉֶp|>WkYa. ŕ}UUyyyf9%WLNY* TN=̮V{WD wu?;@Up lmmlmmmlb }TUU 8a[Ʀx/gKZ%xo X |/@ _|/` . .IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/extending-openapi/image04.png000066400000000000000000000256541461403617600256020ustar00rootroot00000000000000PNG  IHDROsBITOtEXtSoftwareShutterc IDATxwxldS!!Pқ E TRԫrU?W`)"UAA"Az Ҥ %=!mwE5lޯ'I؝ɳ=9sF4M8M\.f*@cX,FQQ?A5@e@ _ |/@ _௷O||xo?qǃ{ǮQ0CюI4}?vľy;)=n3{q^=9d>>p(?q7*m+jx QآwuvoλEDm;zg2-7&==5W^'/Lxoo !5in˟ˆMޜNkI<-eC O6DUxs`  `?ϚYgs(X|(a18JWSC_>+q?TU{͆ߍaߌ[O}1MT(r|{BMy˱ߞ宋7~e>~_s|~4ܻ-Tx4ON]&ƾSNy)xm 괤_mQ&ߦk&L[UqؤG%o|dSyM!&M'4/L)"=wxS!S?d ק*ɸhNb[o1>?~`܄w'.=(")_|>[KiB Q]L}+90Z4 3f~oh6sYrHUowmm>0oklrthtɲ ?49/EZsȁm_?7v֠ɅP5:8ήv:ѯ{mGT;_i Q_HKinod|:~e$V,vosh!OvصkwoViZp̫ۘTIl:IpEx@[--&]nkgFH4qWԩuCDT -:f+TuUM7 .VnhIS۞r_2L_T%ޣzW=w1ỹ= wj|͎|'8C/ygޏtvة,BwtO_-bYWmة{Mh{nNw<KOLycZ^a7 y`Gڗ&MM;?rW(pΘ< [O'W)K7nw'~-OToiwiݟ|raK\ƀy_ $e>]mț'0|%ZN^Q/Xjvk&.߻pP4,Z\.'yO:V@KPp/]댍[,Ѩ(尐?Yu|/Np#1|/@ _ |/@  |km4O"/ {u?hn#?ȃz=Vk{z ?S d >J_ |u^%݋3,_*n\o_D]0fޖ3)v @j>k3T0ա RTb(w) : לyyy1աqc^[҅[QrĈo:.nxc( (͞~dgKDD@ev!(NHhDT jwl=Y}9s@9aU G8d}kkՊ(ܹ g (@aC%z@#_TZgq3Q^a} ,")!._2nʸ*+{3cW[7otS |+f7wXхF6k⪕$͚h̏~8U -^m 2f<{ƹ9J{O۳V%OqZϜձwᘗؒfjvC) Gi#{>X""P@/-@ _t:DB# ‡U;cbŝ@êq|Ɉ֪iQ s § $PP)1#!"ً_4w?WF(I!?_\"yq3G0_h 5NPAnlQ˞bOpE+V~Q!Ǖ|*ySPS}[P%Ӧ/J,~>s;SVy~sdzIi.J ܷdG~' Y3Z 5YQ|-1~Eb}c_UrbG챂zU3HfjtKZ0s=|71&\tIz :f6}Ɍn!`taȍoۛ5Qf`(zl>鐺UJHUO<~®""rٸ9j᪨.q*z'YyVMBjfBMb;Wsm'"A*[жMH#5-F|qU2N:N1O?NE׊mQ2cX,FQQ?A:Z푫T)Ƥ&u*M9q ISB!:EO4W9wJAw㰒!SeE.k!i[#KTQQ_1T16PZ'ͽ-gҩs= N )"""IDtZCiYEie:$" 5o~ޥέ('1n4ڟحkxkȿ+ȿNSB,#Pƚ""? .nC21UMz7@\W7?]i*;w3_xҺuM/ _M{}[WG5]^ދ= }rH%T_)S^׼b?sx1}h_WSby_h"uKv%'"1ͲgGƧ8j(LƄ{R%HD SZϱ 7)Wz5ѕjU2(/7W9XFm֯(THE5-Ѣ- Ιsq^5fkrT'c-BM~0lnCGuy}MՋ?ߒnX8ï Ǣ8'Z^h'&y<"R#*TSƗ;L*01ŖhE9 7R<9?_a:{xQWDya[?kVKh{Tz]rcP0Kv.MHM?l΍pwkq""ٴií;t!duDFAץ-=au4w OՔk ur[6(MDD.6'o@W2/8~ge_R~n4* n+(n}smo͜Yҽ8 g/~gFN_\swH(ش}Ct+0*/ Y/4"HDk蜅RJ3G ]KOnzG)>٧g| %*IRE!^"z_\tiQ_7H-e٦l-#"59]󺚢8Be߷.O(Mmb*L[9n:WjE73?X8d5Uq]bF~Sդ7=/{./KV;,37q#E"7o~cR\hp׋/WKӹR_ n I޽1йsnܰ`ں:M[6~|'{P˞y6)_wáӪa$4:ʏOwHzA_M{ẉ&mtV_$8tRڶ{E(k1vb4E)BMQ6M:wn"uinQ*cUrp _6_a{^PA|Qƞz}z2(6UUp: EfOzF?%KzB TTLuTP6>ՁوinWwGtW(OuZ4Q+SrW Q=;)q펓 §ϴr*"b _eDmI_fM1t~nj aʢz.uL٪#m|T%eӲu iTTBLu,QD\N'_tQ P919YjΐwA+_wn[d,b|4{vRb6us|@E)!._2no^kHAIwM9x 6Ǚ-y @ _ |/W2Pk}J4S# 25/P$mH/ׇ0sm~7otS ([Uܥ?[u8we ({D(UIٴl]B(/LupQD\N' tQ rT in̂WXtܽ[Z)7sJ Lf_ٳ_9 _I A}~";>KLmq}@ lq}Sv֝jT,gOt͝n:  _ |/@ _ |/p _EQ "6@P(( T:ڼ rSWw <ԺT^[wp?-=a^ͻg_G|-hVgjvNm})K FK5bVTU5 |xnx<7g6J|=?@ ^ӕb ʟ̩y^Nd=OӕrfJU"/76ɬ  _ |/@ > @ rl`pIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/generate-clients/000077500000000000000000000000001461403617600234455ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/generate-clients/image01.png000066400000000000000000002303061461403617600254020ustar00rootroot00000000000000PNG  IHDR!sBIT|dtEXtSoftwareShutterc IDATxwxl&$:RA& ]˵Uz-( EB$4B v7-#ɒHR!y|$;ggΙ3 ܹx<>TUE!B!hEAӠhHH83]tU RkB!B!@cP wT>iB!Bqi59ht*W!B!%ѥKWԊB!BKRIU:vV!B!,c㕚B!BqIx}| ])^`@ӣhh5RB\$>ϋtHo!B!=wV}T7(( 9!VFAc2b/S`K!B+*BC% &!B!D9hz}^RU=^S1jB!h|Gp VG`YjJF$((N[A((ȁA!01J- ZB!] hhZ] ~krLB!D rGv3d^'$DcrW Jєx郂"B! (ʷlM!#MuzoxB!ErS]?o^^}u|l'7jUyZ?t!T?|B!;IƎ;b6 ;OVkֿYUUqA\.'`0  Q !B9ߩ7V|u:uHN;Nb9|87_a`EQx<$'++U~I""Ӫ :]ø.rxH?jN|yTUKN!h6=89?>juv9r6k?k4""#33IN]j~믿y}ɒ/xָz ^Kq:]xӭ|eCرc0pdeek'e4xp#*[۶m1c:W\~9&ٽg׬K瑞^;%ƍHzzFv\ !,d΅@o'SN`AJXX8a_Z9rmڕ6}>yZǏELoּ'O0kl -Z`ʔ[vݤ ylvޙ.yDEE.P_b^ݼ?ʼ_BϞW2aqDB!ĥV,{j<+BA2SȨs NfVsl6{;1cngoxg{x^FCXm6/ ?{>[/MeωiôۧlV ={v~1cF3w5ҤIYmr3W_݇ oxBo@Yf<([OG{"::ƙ3|2e<78[nMt(o5={pw2rԵ4o Vˇ?Oa7q7C  ƍaɒ//@Fy =:vp}&Nf͚AHp0ڵԺ]q8N8nF|1>l1wdFvm*Lvw9ޞ'L|3Y 2f~VKz=7t_, ƍ6n֬Y[.Q*B((`QﻟursC(sOpuCp`l@SUFCTT C֭;i$'+A2琢+ʼ֯`=ѣGطWW]u%K-'<<V˶o.7''nF}=V޽[n\̍F#Zp]whش)1Jmļ<{gYr9}DzV/;zՓo"jKΘL&}z&>~nzjL>jo=_B2[oaŊ?a _h8q"_~)b/wXfz8"T:uWx/(w%!$αdg0hp\~lBoݟ\Vu',w?䓼7^XXA|>4 ^RWI/!2y^z=wIAmoٸ17^˥* ¥hт͝w/#,, ɓ /oE~I&\?Ob?E}o|+J}oOV,1cFӫUlٺ^z2˫ZDGcXزu[uRyZnhc:;0U@@QQ[\Z$ !胢KB0%ąU7_L+oX?dx h,n{ eLk23q:eNFS>ʼӒ7^u筷xx?|>f>,={^-x* 'M@Q|2iƍa?8rsrϯ|BVwn^9n~ڰ6ldoΝm†jߗ^xаPfb1Jd*ੰU5o̴|kf'$$/%%Yֿ UGQʮZI}wQT/B!-!᷎wefui<L?dV3ERо=̝@!e拏E|.s͘λtb .Z-cǎOߕv3a2C.ɓ8yT/iymݦ5q~yg925Gg+Ba2l &&uT/q߽w1vhTU%''?T#hٲn<wߛGf+/bXl9;vСr[g%\&L^! G~Pl6$O|Փo}kGRl:_=̙3a[X,$$$x!|8crs2n&V+3xQ8~/OV^sI}!'L/ XB!R{C*aif n)w>5DDDӪ-:NDg2u?Xv]VFFzޕʙ>p]}B!Dݺ"rktmב `$44,ްCP4 iiX,fn&N'۶m<;T/@!$<%00v˛.1Nʁ>2PUe(J,? !BwDC Zm˖jP9 !"h*QëVGFB!h |G/TB4j`N)G# BBHY/5$D#EZ B!h!Xw$/ 5$D#f2jpPPQ JB!t V+]h̴Z-AA5?0P|`(YJiKr B!Dc r#Xו"!DT{;0(JQ?_B!{?f $,4\jFKHXX8&STB!CiNVh4WB\f3B^׃SbB!'G4i* >@>@.r !B?&TB!B B!B!`!B!^|>B\B|/^Ջ듊B!BѠhthMH| 8 !Bqx}>>n\d2hF|>@EQhuZtlZx<ⶴKᢆKn@QEUB!* pr: 2[0u:*^S EQpݸn'n+ۼZ-zp8ju(4Hرlt'+Bш(E9*y>:Yfa F!DffGo=zx^NѤIv;>J@@`qᨪ͚W`$ !B4|q>Vfy 2.$d&55 ¸qc٫':ҢE4N&16ldㆍXVj񐚚JHHӅ^o\_})'GA6M*B!B4 s[n7KYYbX2e SJpppg%,^Xp1A~~> ~m}B!Uh /?~ߝ]bc1%U6X,\tsMH8| B! 44j^EQGU* *n?\u/@XV"\.n7Vk^L-b^f7~W(+5욡mۆ)'Ef[nO<wNĐ@aa!3y[yUe4;p#ƍgatܙ T< tW|w$S|MWb⪐BN}؜t~ƒbD"BQӛHRRN(FTQC9,o-Ι/>>y|'X,g0?jSCpxx8?~N[f3~ڣ^АP xAGO?;ѡC{:'O5j$3yQFjyx  J^nq6ayy :?{Tk^C ˛osOP4WLVY.Nm.Ç3cs,^gn`c\t k)F:l/>?wKEɭji2ţٰGRzȮZwhB',wQU)Wu(8\஗74$RB(S,M>xFQUn^bp[˝СDJNLuʭ,ZTA} nF͒SzMb)yAQ|^/MXc >YXQ'-_Nx۴ܼzm 6<8c:zWgGxukݻ>F׍. s%r?]RS7qFQ5&ڎ5 ,]'_o#y&눱8 Mmu[ò-'0\5-[~66szw'(v<9-1-8}z*O ms~a3L&BèZ{uRΕ!BJJ ZUc ǏpիVU3tK~=LAFM ]u*lh!>['0 ºu߱nw3޽{XUիo?F#,>˖,ǟW~lSfe_/cM挷h0xjU($毓guV.[/y{J?^@?m=M$6~3_lyS¹3{j?b-E#w礢~cD{D^jĩChs%3%Rɵ[HHu|''&BM$YC.!dlYs,hW]F=?z28v vkN0g80fZ3m`Phj MI`w[8ZT1K M>K6{{IBa^Zr.=?wj|/^n6buij׍W!m2֧P<.KRqJ -`9e1Ӧ#ڊ xS*_q]˫zW|7DEEp'Vލa0*/L!0jx:`o`I`߮)KN7 IDAT@"[FsP-o/&N2dIʿ }R!Sy!bbbʼ~P"w{ʔ[LOII琙U'ZhN*7fh=GE}}Ӽ nv;ߛ <c> ~8wJbbbi7={2|5|{9mm_eVL&_Eǎ*(ggEdU.hiǪZW_}ؾ=+9r$Ϩf(!U$:^s)]XmH_A8-5NkvCV?"}//0?1دѱ=0D8^NJʢe/_Z?=B.f]ާrfj~?O:B~(Kײr,T8'a{"kM:̞=gb͜{[4@O;i7nwNqGX4' "BK)vDtE>S;9l6~ÏGBުh1WcBQ>%~m%m?y0y D2Vdl27>HO#Ōś3yͫNY W?]aV<;35IQK;='POs;&aO tׂHuIJ*Orv-/my@2R}=WYE}TP]Bԧ̬,fzgyz+וx֫E/+%%Y^Q'%TV[ˆOgg||-~Nk())lݺ }gM 6ZN^c=ʂ yme  Mqgfy Z/aVyx`bWN>ʣa|vQ5呐Wv?WksaJIg璏I^r9R 3:b;yd: 0^;֠ 9vQ{ ͯk;ǚY،v{=^N.UTj\Ыlηծ:Pmz@9{R.SѾEx|B4?@ %_[xM& {j~5Xz9}9-f 2ycmS:t(VfUtԑ<W]SN}@QK/\[@AEdzܺYaG٭ ,׵Zm٘L'%ѡC{^*f|Y u9ֶ+$ntyg<  y`J՛LH/Wug߳?Jc3=GH਻5Wmu"ڷ#&7%e玃9$>j9O9\ƕő/coĦ:ՅP!+458I?ܔCg"8H14g D<;:a6sʡz:@ N⠭(f mw%cZĘ =C`v9ڴ0W:-bMf]lC,\Li|)|R Ư $Ԛ5c!&''Ti83)dfG`s鰄%x{pz kKeVut=-Wꪢ`Y˧}.;C"1y9*'B+(( ++Nv(z=缶 z=G%%ȥysjJ4sߟ˼󈏏'>>իV1<=iV^ɼyy3륾q8 0iIII ߿ø\.;wu^6JhhhT쭓2.d!#j6R_}U: |1/W˖3yrs~WHУFW1t:-OF6z U: NtmUZ֕On~mFb%YҼ {s^=N5?qw7y3c9e֯Wp<$)cٛ!.(8r*/WyʑmoGӱ2 Q+!upәvf-͚KVX;(1ۏ_XBHURv0 gp/$gP7 q9S>[}!0a΁L'͚a)F؁}iwG};v5 ǵ$'%% }#U2͉ t:8 $Ğ|4F=yǚ56h;9iJ=ʏ9|NK,J0F-E:,NX}0 AEKK>S,R2\ٽ73XФ☳iRQ)֭Ps˥v]UyILL-S;GW%8oذߺ["SveOltݳjÆR_n7s}(wcپc{m~ ݻk c!uKWw_":*C<ԓ\x{ܹ͝υ@v>_lPeGSrp67^-\ў/TvoDؾ=6$W˖akHZwշ:w&QGimΟUW\p %SYH"B`qN}*YO*޼?Liϩؐ啲ʺTܕAr~5$~wM {锧fL由Q+I体X!@ U Z}>/ba5~jeZ x1&M@D&9xa S7{%7rTʙCEi~=.rxI9rǢoH 8`<C|\X,Λo C~ brI&!B!sSYv b0uLr`EYh: ah<YUZ!Bh4bjLFn7yyEX,СC :ș3ٰac|Lhh:ը¯KDAA6vVUB!E:SUłX's{=(JPPthqaz"""h=j٬|f`,UQP$ !B4*PV!l`02ZbCQ42y2:CV^/󟪪ج6tz}H%`0`0p:8zJ~B! ~Z&FVGA={Vb0t4Zyx<<^^/>EAȺBnۋ& !Bzt:-ZNO@ʏ8 ?R[%tAA%JaLRB!Bh B!BHB!B!$ !B![R B!B!.yTB!B ??.B!B!$ !B!,B!BHB!B!$ !B!B!B:wwJB!B` B!B!.[B!B\rᷲUUU2!B!A~~~+-B!B!$ !B!,B!BHB!B!$ !B! N@46#t*Ϥs:5[AlsP -"ٔHb;23%sIq_u1DMXOѩus !BK<I49y,zɧSLZEGrQT_Yy𯜱7u j]^rلB!DU I=(t\zƎB]cp|Ymn`PۧdB!\{Ecׯ~ nYώ]6 2~I';B!H ZvNkke]C9yΓnAt믲 !BKt OU/+7=cFGt( V夯G&8?@M1~:E~&vx*,NL(F4J `s5gxۛ`Euۏ>wKu)6wj[y. i?B/#Lg_V.xuxPQ3* b;qQ`c.+ǿfgB!A.ttZW%!+3!L}9uݮ{'\_O|u5c)vbls'e%RNr%f=76{•>©d+͈lvucutgxsp+lRa[Ӝ!W|&cm`ߙ%MCgUfs]UӒ=;5:V秢 OclݜVvD!BqɸhA:CG==O$m?֋3WqR}0l9X]mU'<)ZK/]j-` yJd=Zt sԉEnS!Gs Qٸ>] ;u WDo禨/Rݕ;E9C]gFtL&cb#8PAH0UtSJx"W^-b4%#4v& bϻ$>@Ct6ȍ[ #SY_"a ي+z}KWZ]̝_J!BqI>{s_$ MNisfq p=}RN<7#ghUJ&ߵd[μu zڌ239]tФF>ߞ1+P'/Éo\n.i5NrRi0WZ gc$N0 ot,ʹɾYGgCVT`<8i/B!B4f:m; H*q#;Tە-Nvm`ˣ1B]Iqgr0_I:XfyZ-FƭP6y*6@ ǁ8@{2Nʲo'c'ynt~ =?#9nK8n&VbB!h|T }Ѓ|![}#=*(5]}~&W0һ _q㼼O>AV Vh' v[òYYK?/rKhD7ocN:]: J!Z^(Й(Ek0\Mݾ- +5[,wZt4y^+|%[n[F'{2ɢ QDpHCeAp#+~^@D3Zqq27SvVMкL.O^e6g-Sx#~GGjI:+@v9 jo ]ܚvwy[ $ 9?(!˚c@$uWxgd+>%LY!B m` IDAT~\#"19LCJVmbPn߯ыKm+?ƶ9xy jI>Fc=mk\QZ d él?s[ddA%_9w^LKx_ >z樢vqm?{/&mbq3+Q&[`m3 mgWT|G":thd9]胺4]%}Kb@+8Y^}aeg}tTMK„̟9J:žmA֠ZNB!܀{2-EŃǞɩ: ???GU8A|̉O-r[<=8y76.7ūrv[۱#;:kכ!kX_ AwpXĕ&yٞN:Pܹc[5 =3&ݢ5m}Z#mSZ`TĆz>"4"ٻ*Ə:ȱA1xTৈ؊"-@cml &dy].9}͚ԯpYAOJ˜iɆ 􎹎Mǵ=ͅN;b'=)돌 X%.a]iO\"&ѿM4 nO_fS?gA,F 3l|'QRDAJ6&̬#H""""|f+`J53eO˯b f-;1!}vd.)L|JZOrykKo t2Z :%aX@ر8ٝ_ާV<-;_3e?斾=;g|c3dfOg~JbapΥ-僵{0g~Lo\ۏ.+bs\rYOVY̬\ϥ-oHQ>~' ^{-]65+Jf-L&Hgqgl0nCNi/. ųzϬN;=S:pxqm`~soB)bJ邚yXkT5Z%,soܫwӒ^;m'r;r73imz2~Yj> LH:2/l`J&le˚{" #_KF?bv@)(;oz |H% glrᾰZ[.iSf8?d^fk#WNI6Y:C뜴ufeŸq\gSiצYQ4/ltުߨ""""r9p>6f^I'+Ĕ_ϧwa#V ٴt(36jrL-g W2 M0«&d^_:fl-?ѥ;Z wbfIo"u|T~P(tkpRԹ}k7aʌٷy׭Õ $8(Q4M#.` 7ϪWDDDDO37j:I$} ro% [swԬcs8#au*_%6纨 )۟)XG5ٻQ\ ^I+: ,"9%S+cz1y:,4YٻٛDvNi{FC]:ԏCDA4āg%9?"کPzB^|<,?^N2cn=nE~L-ߌy;Ŷ}ۦlєS8TŦi\77"u9t\/V2'\r0Z¢JP:ƶ<+>M"$r=9OZ̔XeY:U9D>2~nnYÌ-k1C6!sg9ͫicڶB9?VA3MKY5ᡖS#xC>Y"""""|ʗONX{כxg\>g}YǨGqMvYY˗wTv}gWF;w0iE:/~J(97o>ev2i!/榱'2sک{|bMμzL o߷O>E2Y0w?܉mVzNF6v#ۨ =`HTwDpe ~YS'rM͹MDD~-קx|[灗@nW㗵ؼy;eV+%/}O_?Ġ?8a-sݕh}|,ej`nn9-CDDDDDDbGQ1wl զMڴ7$ag;oo!L_cܵ|6AYش9K|*WNH֡u䋈pe퀧[ҼQx+ys\G(Q3]wzk]HbiXuleƊroyh%n\{\nryǼ;tɝXDDDDDDߖON^o/ӵ[,?j8Vǁ]lߛʎ~H?Cko߉E$z:KS c9{5>ظ|z䘎\XoTKW۱WpWUOS,gϥP稾2W˼_ƳMJj W>)v~͋y^8YF j_a8*ůeN}+j\s;WHZ\b{䋈96jѪE5HN-}[\ (ܻ_6|( #hۑ׺1nJ8Eڸ-/Sג]t~y^ԅmS;,_ܸ3ykw!PPGxTHD (SKls;ǐн/.H*רŠ^ +],};pr!:yv _-"""""|izb|zTkpPz{Ƣm[dhY+#WZ{WskJ6($a, ItM̏{ۑ3:riuKY- mp͗w{$va޻owj-"""""Yu5.هuXqԢ3Of~^9ьd O`mdPz *3V1hu"eb4d`Zô􋈈9+|Ѹ+&`Nhz4қ#.]XI֕o܉߻Y9n~5Тew.:݀ZGI}<ʦ$e.4a#fu5S>\ҽ!p}&|4%[i#,:1弚PkmfBnNLiOt% sab ''Jo mMEDDDDDD((((((((q?ea=""""""r;\C" h+.KpY,3VlZzXv^Ar/.bPmKww<Y,gwo5 i`-Ob`n'9 `{c:/ N\AIon~+pp,3Y:g_6bBS{ ys_jqm_ ^Ns+$nN57è f#}}C*bi^w PHS_5O(n/>B>IQZOCػ$o`G!4ƇWD3/dږ݉\uÙmKda?bTߒ| /_5"A~7fˆh>桟CrW7cQ<bdd '^1Lmm፹/"Om>[\<@Odү21l\faJqmuk^T$.K܎B"a6z#sOү>6&&ލuO2ڇ-rJjw-zA~ebW%cYȼ=mtYѵm$2V-AH@buH/:FrWO)t@biP $zɷZ% D8 ק2AҊ<)Tzn8SB0k_b.V<ZZ䁐ҵ|,ENr+ BjL\ T0Br3JkX-!EDDDDD, fb!#hc!%c<;MB|eMrJ]3Q{/d nN62.ͭ|"/EPJ~Ac0`f_`%dJ'6WMy@c'$PT?8ΰUMBw[*'R#]¸uAٗ)TN$.t;[. ѦL-n&tΐ^~.Na/ 42""""""rig䙥ep|/]S8B!i{+IDDDDDDN*ŸJo +@ U͙EDDDDD b֔eDmCDDDDD8s@EMEDDDDDD(((((((((((((((((((((((((((((((((((V~">xjc ;u`"2qpƘcP/^_W^=zfEDDDDD|*Q 4)8JQ>l4 oÝ]N@ϼZ[FrD?ޛtuDDDDDD+Gf˸{3\W@jEDDDDD*E`,a?sO5w-9GdeeѮ];ڵkGVV o5$̞;?.d!i5y.r/)Xy/IxCjK+s}Z۸qaj$p[q H^0/f川0~D7%WqǐT/_>Gf˧5Lвi,K_W pJ\WЧO/^Lhh l})nh!严uv(:ζMqggRlX+QcǚeI I۵yol`QL|~ zDDDDD$={~zϺi ϕ FoDO$[q(z4z 3Qmjb&/}‚47bL۷^Q7RY|)IUpO]Oy$DM5M3xylqw<+ 95eb4`+/p/yuqWnn"""""gc]d ,Y޽{+=ņUp:ۥS,} Ic75kKk~o{/~>Ja o!DתGZX}jоEҢSWX?c-n_nyǠ_W?EOM>&vն-< 66V! f2m9X2)w֧.h̄Ϸm&zR\SۡE G4nKu&^YQpѕUWUN@x|=_"""""rïB!9[*AdUUH_A:?w-}ٙJUYLalGzc\/YDDDDD䟇_-;qtÿA.*?AP>ifLF~iB$zDDDDD䴄_);p9gQT\ HF-eg瓳w\_~-2ut):k:p].8ttCzEDDDDx71M| 7oSO0T&Z(*qw_-*lLꘐfaf@Dq&šze- )%O9y-f6y&o7۞zꩿ^cccK Y33jѱaPU)LfEBjNǒ_B6\GvIxxyەimzcAK{IdiNb2fluRk9kQfhOo[Ico+'~Ǭl+ }\9<"K*> 8Ԃ_4/jY\ 2c84z[^ۣ:Un=-ȹ7͵O}LOSxN#o uWON!#Gv*=O[^2w}7nCX6v2c~5^ؘZDDDDD`is|t[/T{@1лrgi\nJC1kZN\rSL*>6cΣiɹ"h^I619Q\a1tnVG3F LZǨ^1%!>J6e=}c3nc: S-"""""R4Mu*!' uxDmODDDDDD """""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """""W IDAT"" """"""" """""""'tp5*uDnφ@9o4MHepe4:bRA`׋vxx<XAXDDDDDkZZl6V+K]{ix<N'L8<_IA&kp8JkKx^n7L^M- 8\""""""U|/R͝DXX,V%}xXrN0a m """"""UL hnaGi֪Э%xqA """"""UYR)7pl<qu,lϫZ(9Ntor\v7k;52teD8 :U3`CDDDDDN4L9/;M~J6q{ڦ93 Uى8ǭ9j8If(KU+H,aL4C5N) gty 64+S&x47˧5Lzls_g ,9'8xgjVVxo/~gpyS1qUePuK`W3MXy1ۚ?u6i};/0D"*ꡥf}{ZAFPT Mٹq)~NKHeY`3=㍰8o/$g`Fxt u/Mgi^uLgA+-n€WRoBcno C>yմ g~1vݸ1nami } GV/+n~o5VnLI׮MZ>z} ;t%ً:&lye/b@o?@onîI C7gKǑ 2B7NQ/>DDDD1{=c*gEj R7:Qw{֔9GX$f9B;J LUZ-< -#8 {-Ůog͈;|)׆}Ed}Ԣ<2O%Y25~ԽA;ý3\jiƥ/=I7#k2eױg_*tG8!+z0skٚHNיɿ\Sy1Nh/?y'R^@q[ߝ}X?< a&3J,EI}p,}חؿ)㺀̻x?_}Qdf1V k|q">)Vo#:ADDDld`.oBp;}bBBC"u} î  ,\b#zcY:aHCU v7ã,}ⲽ`g{]\܄ږ8v;Ax pt0UP\]Puw:Oޝy=ЭC;bקNZ j> ) ?$809yk}/s/$!4?+Y?ۘٞ 5h\[M:joP YW+.6``A@,5;\kёV331TOgtԁQ]tWUQ>'90F5+=ki2>U,ǩTc==M`PH$'8z+Pt8`)i~(v8LṉkH޵ֲs7q㮠MQN׿сqj+' #5 (Avcr|N0sw;ns(rD2%7|g?u3JqN 8e9(n`r9`9|4}9bh;!l\6_`&?{I";!a8Q6W= Gx2co&S:@0j4^dd}_-^&~B6ވ|2[7iRM-y~Qw{7ov|Uo'9t F48Xx, wy;A#>|aG_ O3ݑFw2 w<|-F׳"""""n>/\QAF*)QCk9𩰔 stLw85!Y\mhjjdJذt_i=fl+FwpnHيL7vJBbۀ=|ȆtRvրmu}ps%at{.ꭉ$mv9oGŵ&eOsnI)7OP#z=*ZXR^GmW[sGk1opu1ykّ^ lL+٣26ǒSlyws.""""fΉ `y4M\.\Ÿm?|ip3|xu/.r8υa58X(›E!>zL+b1wA>ߚ*Iwȯ2NVDDDDd nc)?fNNqqq&6\Qsg`Gȟ2a5N{=Q^!Oᬮ+_XBWDDDDD8``` *;?w9uΘĭfAt歩Aj60DDDDDDΤ|Ip{K랈Tyg %"""""" 0 EDDDDD^YOlZSdUHUI`Zp.6dCrJ\Aj8KpUm,łf#˃͋Xxk *@&6w[,1i k7WƸ4kWDDDDDDoh}=5""""""UXzLˉ/7pl&T+"""""R(Jcmsix d^f&sHwZ}T;ju"Ӯ*Mik;SNͤU⭬8M/{@DDDDDDiMnNDDDDD^NDDDDD""""""" """"""" r^KgTT]L➁q;VO_y[W.""""r XRvޘ.mi@TX4)+IHǵ]ȫ`w[j|%7u:DDDDDDjrb}Ė{M^ARrwjquxN{.]@r~fX]9px=#ەkQOgelR+"aFsrnM yL*|*%1(8fyQ^TVYc6%Ț>-\d7JV<_^ӽ,~K@Bӵ8+W?a_9F05W1u8w?‡~m̜ v%C_S8xf(m{_=]i~GPyon;fE0ɓ~'=z Ow > oGwƼ&CջHM,3| /NM-orxR?|%R5""""RFvV `ل*)|i*/4[5o@F\Gd-↸uL.50yc  0S;㲀 gyPܾ)E 5$7w?71߰!rqggű!1v$|w?{I """"7l`؀D>w Cf6i@B=K}L=VͿtUYK0!WgPPc3 1[XnH.7Wc ||%W(- 30{ZoW^ێ_r\R< O,!Q㞤7x|E>ffioOבnQާywP-]o>sJn~) 2fk{Ӽ.W}%CgזZ[Ȯ* s[Cr3oSV&[ \Pd7ۼO=wax0X~5aE)q×WDs<}+7AV}ǿhG 72au^Qh98aw, /֊娄QҘ~uhVhڌ)9" U$'0_< NϒC`PH֭]|rz,h_ H޵ŻֳS'6edWH~52dǯAva ߙbv\D\͏g}fY3S~cS #- &:c`GDDDDξ{XmqO ?謮 >G@{z ٸqz<}["E$zM9"8{E2r~@&9? fy}8zԱ o" 2&ҍqs"y~vo9~ϥ|n4v0qTzlI-?qqʶ ˏ `X6(:|n sS2 Z݌yonw-t jTf͛ z^L() ,_]+%-C-X=̘Wf|8{}kջ31j۞~;0=z+&-%>-7/rȕ\e3)EM|eގfر%wVJ50q<,yMϹ3aˌ=&}OZ"EHRJ)Y(B)%ƾ0Y=?FB~es9sιyyN _=9?j'>80R|DDDDׇrrb _~OPϷ"Ӌ=»I$(p 1 dCj8=0hV^?O2dFaA}fއ]]w#y7Å/q^D |1'K'3|Y=e*ҫ_+[8ȼu: /;>͈ rgam8 |ɞ E.BLWf|" IDAT\?-rF;f"W|ϲoLÃCLؿl֐r4"t&yG A֐T 6l4ߙO'z -K^AKyd^Gh%^ތ VoM9M~BPS>}}ȃ~bOM`9B-3<-swhݝ0< fR))\J:˚tl?<{%‹UJ컪c rۖ{SfǢ"F=?I3W` O˟i]+/p럚;UNiqw` (^z쏻0cز4Tӏ7[/לPp'<{ubDk_{ڗ+'|ݵƌUW||[#檿7m!"""> 4o9^{tV> 4ͻ4q:ǓtN?/d1.,8ăa>)Rla3{n6pxwٿ7o#Li6=2j33q3xl ?R DDDDD;&s.xyya19lll[nτza#NMw˿L#m~M2|SM}#U((((߈M[Cu'""""">95Tw""""""w}9fX)ӒenA~; }r5*CDDDDD$6woh]ADDDDDDDXDDDDDDDXDDDDDDDXDDDDDD u$ռHFg +ͅtW(""""""} h4ej/y| #g$> """"""SXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDoT"""""oz}0 Uo>֮^MLL ɪ 00+a]-"""""g3g{JNN&**`}}ozEDDDD䶹\.֬^@…Z*̙-]ƞVZMPVC[b&.ӧNPEHjU8w,.V+;N~klćh`QQQQo֌YfJoؕj,=[6>O/01]_&W{ hVzU&H4zrNu'zؙ%li&Y)61py`w rd0t;k'k'Eʔ᱘4 3[`_4E2yz9Axcw$m?åw|qװ-դ6#٧0O CˏJcZ~-#'s& 8mxVuY;ؕks >ʑ|>0>b0b,#è%W 0BO> Ǖ VNv|b^6b@_N.?ɗXyGc@2X9 G_k0lKTNf刱[ApZ|yt?.pEC'2yMLܳxx+C}(E̛ly.ږzŤ5~Oe@Z;M&>˗699>=z|]h)c֧[iqoC˼ͺ0q!m{Hf5D@h귥_]82oG"K?s&^EPJgsbV.ϚIjǁ,-zb?NyQl ˺/]f>bp.X4ۺ#+aT$b[u![[uV@8Z `[ǗˢIN׮5)eBX4b#S7R܍ɚs+Uz<+>JSxj8i)#zPn`I*_&,Ub۞Dbsפe~+7tB~ԨS/[w2e9eZf`i惘x ?oъT9 |V^ |nf{k)ޅymy3izd I5ӇQ+]f0$95ڒ~e/,3Qȗ3R,A`ON b"Opj<(SM<.yЁSPFmDdݼ};+|T{ C """"V Qղ2{vI{mV#˲KyB)&rQ,1ti(}&T@` -A lv>gR59^;K( gPwYЗcYuvC:o1$~po@U?8 _.ǒױl.v1V{AU)nn_NzlV.s{`sr{2Nm(;''{]p|[ -J+.sQvWu :þ)b Ȟ++;̹x?$0|< džB^K;^i~J֛lpx8SQWEi4pE0crb8"W.e#n{=B&l;wQ FΏtYػ,^n8L8{֡zGxj /A_\|o0C:gE ~سM¥ur˩+""""<͓u˜0i;+޶2n5z{cB}˙0ݗuS\b¢|{4=įQz6W[t Htv|<18ͮ铘Tf~YkH&%ȗ#gTgFpXvL`#t6L{<ԨB RhQ%iU;Xl˕vva+P}>)t_v. _dˏY!jpK9ycw&.;yDrwiw{!it:t{j^DDDD$}?dG[g<,`_n,zzzCjuv;qgǵBm;lݺ?˄8`]ҭ?y/Zm[&jU0vΨ/.R1zץ<֍hnM],A' ;ƣ'zR@rF}! 7olstcYGJ=#NnD/Y В< c[?#}wet9MA"xW{gӕ"""""gkep~%/N3~K1QkH\E|qVƂir{b8D^o.l4wp Z2T29}lp; ,μǹL'|tv2 L89afgׅ`wkgz0<n9J&e|v{Byz6Sj;_WFS L×ޗ_B,xcڮK)]5g<"""""" mj{ߵ#pԦ#;U^7mʇMX2~/ƽzEDDDD$y G32jfY5'^y3WVrEsҟ;NEqPW9cgHD6zKuS͛W⁃ (F.r(WF# Y85^ǟpQn;ѨKWs7]R|m]z1У|xk K )rSauSduCI]ӳ7Ȕ./2 ^hPgxwݺ:b=&] shIkFSd>,svroljm nXO#p̀bz*OjעئMUG KVhY &,0IӶ@@g uSHVmgЧF3wāg##CGRCyPERGXǶy>DWp*K0 HzZĶi6l6h 0#a2W}R;\aMZS11}Wl4?XsOwڄyk ~].ȃƮWXw]wY4>O|,yI2ڻ,n_ m|eH͛k&Nϰ-)? I-,uۛGVqe2> ` zdz~./,%s:"""rci!Ҵ; BHն3k'pZ'_\wGLB ~G AQL`8I8[QxMO]a֣Ys<9nLWNH s׿UN2Fg0ݯڎHK܄ZDDDn3yjpj\r1hfГϏngTVcθ'Ӷ(N~.׀>}pl[AYy:*R+!Ör[lw;ee2E?I IDATR=2d]fGLXF?ldxҼܜ=kQb0\A|ӏҿ`̗t/K'q&m9o%ּէ>Ep]Q߲p[ iҵ ųxo;30چ]֤|l3bZy>ymI2)dmX b6J?Aa~lGÉmApya1aalnp8ac^ pn1$Klކ`0l>H(K9bK&%{Crn; +qhN l^?$ܼЧU9`4]FrZ%7x{Mnr#v#\BT ~O 2_aP3,~žWͤj l0{7T 4rAs6_Crbt0MŗogQ*qf4L؞~nOn|Y&~;;1L?#:ӯrn"gu ܣJ<نgzp~$Yɀ+Ho%y4N eks޲n*ǯ`_P%ҙޕ8xKG1~F6mT.SgJIlq;AyŸO%dM_n2e cʔ)7||̛7Ou0e m %fFHF`P}'Bv`ÓXh (*ӧc_T,NHyG=ٶfwe<ĪDGlYsXf%ҀlUJuJWDf 9-e҃=D婐c<1)]: m>KM]ֱ4g +\ [,E"5[ܹȲ+2<(kVJd~w"V2qS i$Q_wZZHs?/6a¡z79z(:um۶WoNhӦ /*J/Mΰw^Z/aZĝ:A+FpşI vEH>CFZ$/Q\ueX ed7ow~,R5jӮ}$g p6 `τb8F ~Q%^>(|ͽl?x)H5II~oL&O+usլvV𪭜6]u܈]zLNN'XpH!\z-[ >&!<F%szOlV,GrwF99ȓ/yzz{&C,NMꤔ[i8`#<' sbf]HrCc"jbňՠĒ |l^5lRnw{j~ܶ~^MMZRn5_WbyN'Eˆ~KAiYzp0PR?DGLYI.Ҁ $n5tp^nx_>C}01x63z{_OȀ nfvUlQ8j`!łߗb.""2Z/ + w{pmiJ,}0\9 4!9$H)@=d [|MH(ennn@*`={]~Q2Rϝ`G;a]ZH]MW-9%Tr9d@\Pq#w` W?͕/@r NaW|iҮy\-KZ&Xs< U)e#rR \$y37`.[9NY{(,YM~z)]Qi??l'W@ #_8ȚG"٧j"$؁ܭm7r wϑ+G8LC?x(×nF3O5 ZH۴MlbFn_RzȮC0HLܭ[7u{ԂFnZwƼ7e4A5is!7ϢZfEY_ { [ŝx4Zf78iW{&'p ! psa3%՚r5g.l'W `D6rW+K 5~Sӵs]OGeޞUjj@I`݆dA:bDDDɖ++Cҟ=swbluryv}'CbLUWߞʒi|+GLkx#yGycX8ƣ0~]ɕj@#n3ߙ녛y5Vnİk'WuO' 8ggOcO >N(?w ' d'< Eڭhh'#3,7#[M?y`)Sw'֜Jz^igȐ!^%݋yyv&G^}){Vsd}>%.#t{9ZZ<2pWPm_%?v Zv6 Ir {a">qo4NLA2Wp2NR&9ҳߦ#[IykhwZrm$C_yV c}L,[3%lUy~T[ gê2UG5YkZC݆+g4c;ӿY~Gvt;eSu9.4[b+^!}x ʀQ?G;'Na̖D>ޑUQgդD8|5)IQ'tO@'(FR&8_7?Ja*Abaos0ϰ?G"H-8ChH q?ł1_1vE=ØRTW0Mit:t{ଐqF0-Wp[l~9A~$SkSG4bcciy~q{MÖ,ލj̧tpw_7&"P̜1___;s| lx{{c1mݺ?lF.oWm`oI/9T)""""%82yBD-10FPa:֙j^*EDDD>{?<=k\L"VE=r|/"""Q+מ?&~b :k& iUU((ܘaxz?(Uc㞌Ҭ,""""]Κ5)fy\")f5kC5kZWGOduZN#kРV """"rnbE9Crr*Gsww5k Ԡ|v`;m6TR'%%4LTcj憏>>>l6`;jfJUl۱lXևNEDDD䮅`łnW>ܓ@A```` k@Cw1H 1^<8caXm6(,uDW7=Y,dg}`ͦFDDDDD$fa$j>`4 ((((((((((((((f-QBq¸uB?%b~&zQu X6Øܒ# LcdsO˜BoyCh10>;Ŭ1ꋹDF|TґnoxqܑpS(ߺP%xi>E]̗۶|CZeJOV"ƒUWkG2;{1rɅSyパ̙M2:DDDDDDNJ.RFOg4z^|ƒR6|Wzx64+˔e8axT1kH[_6%[1XŨ'X#fyv;,9L64}- ^DDDD@q,N\>O2iZijrlvmQ.َiO_٢HE"8W}_1adٰe%[ѵ?ΥM 96eML7ppnz cl:&-;Hl2#kHuS?_s+SrlY.6H#be cWr6|2%b\2#|~COൢXk| PIfe8z>9=gτX'NRL>.[shЯG2]6N]Ni:My>g^rĝV`{qW~yg >9;e23rdϙ>~~ü."""""p:zUw#V>WΛN.5cX`=TW\a#6/?SS$d7SW2ybaNϜ}<+Rʉ%o=M{8n3tvqFʓd:vwU(LR~߶*oK6Er|0vo/ST ɒ7 -֕ہ-䍛VY-/ {E8l$ :ދ (`.^vT,\{ao v"HQ@ J@ lȼz}I9witPT9'v !$7OdeÄtndAǶXqr-vهj ꒶cu[& @QFJL/I${`\{T"2>;2hڍ~Ѕ!i36 M0um"~Oov( 8ky*wg<#\DϿ YMujmnR.LJ#Oq}sB%I2&/%!h|R"j%x{'+ʬogҾþH$Iکlh؇D"A[(f4۷J!В$I$X$IT&Ĺ Gr'GegI$I{;K$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I,I$I,I$IRWZdWSxŗ\|GV$IRHF 9tڥ̯Rx/k\W$Ivgwsk2K4,#_v˖$I$eݚ%IRڭ IDAT$n*,I$IvS`I$I `I$IJit5>j:3I$I$1qea!75=SeS\,VI$IdBR(n-u%I$ *@'@;$IdN!4ޜ$I2T]PPw/~gǮs%I$*{N/2IhwUu%I$.}Y1k^{g2HVTG\$I k[A@X)$I$F ֪G%\$I *u|p osC$G^$Iʘ2pޫ_cYK$I\Zl!9$I$I^JDʧ$$I$*B(yGW$I$ﲶ2c#{ OKYzԋ؞FWsUP^y$I$(UC@Ns I$IV|= ;د>cy鐘̇-Hwp-]Yɓt;VܶKI|6/C`뻷OYS .RېJLxy{*5@Ӥ-Kf2C^ITXPu}Kƴlc zUykN;Ao{9Ŭ>X.ܖO!yK5'iz4f_ԗlxdDKv!/?7VWvGu, 5so/mSp|2M& ,%I$_M7ǻ,^xߙ9୹L؞Bț,\GQ+/AOwqdjށJd&?ex۟p-aTyZ$?쵬4'Ub|ߚSAXւhj2IE H$IOqpZ Hޓ\m.PA:ٛkOܗm{tܒsyd(W,˺zrҶg#Av~R]LAF߁'6Ro}T< NkM㓨sb{Z؄cڠ037RT]8Eos݌1Ϯ>7UI$q,x[u.>:t &~ ^z_w)'ߟKlYo,mݙy6ߗ=:Q.a;E/dswSͲsY5u/>p%~9[82.:RcK~: 8:MY¬_r;ĤDzmwN**iϗ'J< B7TI$ 0" Ðh4J~~>)KF?uGwH1 5hj?i2[q<Sxw?0%IT|4e:sFaD"A/Cnnɭ`f͚Ӵop"Ls3o-k5M8W&AFXTGTK$I*] `5m%'u_nNf`9{t \{gt=0~%I$XKRkR|7mm*Ν͔g3U!I$UA=˘o{#%I$mu̘^5oEeN{&vV?րZct˶ J]7 I$I{)Ąwg>sV5RHںIaSҸ|6.w%I$}-*rN}3f'2=:vwǥ\X ;vdzx6UF,3d2U H$I2K_С03+~zFQ|_\w{v.N{Gy27_]>j/If Vv} 9=gsoMcS^zׅ!`cyaoϥhǻ^\kˡ'sC[^I1%M(O%I$}<WD63~Tzc~z1rYlkAاuuX{0g,o^9O IzP3\ۗ_ĝv>WT}z6\dyL֊1M♗9ʜb?H"TMAT D_I$Ipْr5 $ KV-$jTL5|Öݞ*R@AǻTߜ}/fO1k~ ?U0$t%I$eIIjQ_'Y6 jGdǴ=($A|@XOH["$`I$IpR׵

lXw"DBBȮ@Wh[ 8IM#G弬)"RWy^B*~ m8DFFql&Nwcͼ;wo5߈zdeWwoKLA~> ^oD[DDDD.c0vl[Pf+< a ПƍZD֭[_8o l6_¯@_\.YY6 A EDDDje eZDhh(j vaz -5bInn.`3ݞd6W/A=sA """"E@b2z!"Y߅nL&,K^K~5+飾T XVV+t=x< oEDDDD*uhd2b1[gp]c N޳f f3fIIY 8UzyN_.[ͣoh(EYӬt nGـ;?TjݹYHp(dǶGYSrCo3k¯9<6sw-V‹!C%:=|?TV*QG[ QDDDD,Kq"1z"g1ڌ4? n{WēurFCo掫yZ]=i-Y 'Nr"1y_uͯ{31 Ӹ9,;KshV\wnN6DjM L>Pb\f,xq9  m`b!" [}q \dۇw9G=UYsg񎧙u`/kh~xn9,""""RZΏ}v!m+֊S˜q5FFg>xQ'_Т^3<-!yNlG(\nwO +*?<Ȫp%[[ 1oPn,8DKf[ *:Cr8j9\x1ķG6ҠU_ZI۷r[v9`}fpɀ׾ ˦|9,""""R6Had9;0}Kk| ?`¬jyYהUno ~ۆd zzxWp?&z.ƽm,WӶˌ1Gy=O9ҫD[L,HW[s>Ǻ_x-򂡲dH-kTpc{qt1=tA S'uJOVpS>W &w$َ| ٌ ?oܪgOnv&L̜4p4qAnY\GhPGZ6[$dڝ?W7SX^؟f?#z<_Dƣ{peބC db~1ir Ux=,fcdqq4lv`Pϣefk6N}pWy`aܒ/6q-U,]iӊQQDrQ4 7@N:lA_dCZȷ%s<3^ZԯO@ y!l dq2%.M%pMzŷ|t87ퟣ8yN<=nw{}׌{ChKZGEc؁<آ~}[ ..ҳq1E=3n#: ӯhUf:uW_=w 6>\'3pk එ=9zqq_~U?㾣HJ&YhԢm72MY=21!}c>Tf9?gcޙd/aؑ+ `q_-qayxOo\kG]}$-'etnwohkrceqnp}[˫_!Sz7n\ؒޚ1%㺃z Ꭱ$wQT ^ $$^BWz6EXPl(vl(("{khI)l}ܹ3';~RiE֋~T@pT.W !4kDpo]^ۧdx\1v\^|5kYyx.+wjpX̮$LK4MArRHrEQ. ̽I9XJEDDDD˰4֌֖h,-NY)KHa_ &ˠye7g䪃%[n NbB: w ԏ~d|ݎsBҳh8_3ua6iu7hW(8+5$\"pꕉ %)p&|U[ERəɁUyAl%f]W/>8Q(٦"u`L"uZf9!ԪQjw'>>xY^G|v-cof@ *x{I,19y5#b#-$>-Q/؇ٌ?JwR515|Nvb6=~y_K*Ydg-f7q|<>IDDDD˶l־,F݌=a/ozRful~>Ȭ}01@]y2} #hOc|>2'0^7Alyy]Mve?r>G.f|a/mVzǸQ6͘uSAk`hxR=dtvի> {UO^Z0Βݟ۵YkaƄϜZ}{FƮ̠[Ώ:yP(?߳TEѵck̜_毽[zu"ӾuK>+#¿1EDDDDJcKv{ƃ;MǻvP;IbUdaҢ%]7?'G-ǧ7Je2+oz@@.e0eZR!7] 1ں>'!W7(6pQ㖴^ʹIoׁ$XIbZ6Y /sW+QZg~ʏ|E~4x-EDDDDLse]'!źצ m|3>\SLb:N0}yo3\H<%ZSNZn eKͭѥtSn|5/5'{"֜mz' pur7h#%H&20Ƕo?tpPwvSعg$s~32k4ߏ1QDQ9&࿽7$ٕYqVnOH T iJ9:JDDDDM >gٛ~?,䁛'dDӤ77d-J]oڍhW kRNMA 6'|R ^48Y3}I]ըAYq9 {QА BChW)kwFx7T%ϟl-[i Xid8:i}K[O=b'V0)aTk`5oNiU;O;t`mKRAǜ.d2:<CNu||t]v'?C9! {72oF5.R+Vڂğ] 3y5=a"o !!~E[3ٙv&sڨx Tg&#{Oz8m ?/ƻq9m9nI#6>!TVУCm"0Q>_ Fi}]jsˏq_+xÖxtu7;X~-_͒ٸq )u%|+y]Ow<&$u˿r>DDDDDDi,0A콏~yg~K@NhЩGaN#qMsH.WJ^AvLlԹl<VsޞQDDDDDDed!WEQZH)+gqŎ_{эZqSVj!}EbQXu!8laҢ%n \i{% ;?-,5/W<=RrjI^f=/I>uܞxYjUʕ\n`?!Z$w9u)O\y#Ik^bE{t'Em6"W'$XlO*ʒ84{fo>Zqo ­UoHE %=ZЪae*g~ůg%FoʍMO /pZ=郃ݪf6^Kv-_n#nqwlNձ;JgEDDDDD˞ n':ڸ e0 <7o:IaGo@ZwGeEs{\v[J?O0jҲ736dXlOƜISt%.ݬqrݗ7UXoaسw*-"""""/E}t╧:}G4+_8 Jm| v9z˟"[u9{:obDf,4n&|4ՠY\ݪ*M|ayl"s/;MpH*)%>fHκN*whL}%tꂹMuOE֭tlZv玭)222?0IѲjU+]]EDDDDDD )(((('3C2^].fpe#1#ӃaeAJ+*qEDDDDDD,Dx @:CaMXhyyC{ÁT[OggA< 8Y9?W;ȲgXXsa<ٳ# yUuٱ.gd<O^Od+w:vװg2o^75mu|yUOK惤lr Bm+$nL3IAʚHpyN<=AV]""""""Ihr5ٵA/<9|9=37GrY%Oab[/=B<92o徵YcVof!D$d0#τ,^k*2>牥8sRsèH'O-,xn`@/QiwD_>S 5qu1˄OKe`>*0w El]""""""WvdI(;euxrUY ZS]vO*hyYvGo!VAzٙ>t'1Vl|yGY uc1?38A!A˶y90Gˌ\u;܇΅ @[Wywei $ɲZoZ ; ۳{HvrIXD۵6jSfb+x@>fvYMrB& .po]vG.ډM;\_@3݀[sIj-8Iؒɺl}kgтi#ߊ5=9)G݀IL{[XDDDDD8ɠcc#*{ryfA,6q{xЩs| ȂO*>LyNGy9^ *FlN7so`vz1HksˋD0WxӠX+nTZLKW)xf;o{J:1rCQ>3N:0^]ٲ. LJ`V^W^v[-jƟL_S&""""rHKKQF4jԈ4Uypg{8>u9BHT8Nn'c\>?H6n@e$^kn~>TӶr,8-kc9ѓWj[")YvocjyG"od(yv*{g,>V]Z$#>9.s=oxf"óx,mEDDDD.ۡCСs!((Hsl6?'lQ-s ~ Bb x| [w6tvεp`~߈3,Y1Y<@~2}Zf,Ϙ׺kMDDDDD"ܹ5k֐Ƶ^|yXVkǣmKacnZZ~Quc:?ܽQo|d'cP@xϮMb;o.WF͇7VÎ} 3ke'{Ip{h^w_ gĨB߷qokMxjԳ1o 1Ν;8ΝK/ډ ^pMxGmѬ ?jW{W.xҝ:Ȧ'&h칼1D(f~d,,#n4+ s:Lݝc΅xrY9,]'kՋuj/O8AD7E]]"""""|SyU ^m?:vֳWotg$2&u;>zC⬿6޺EWsU ޽wlT FNO"&"""""g~/LRE XuLDL{ >t8U8XϨT)&/Y X?s"""""W!R yYi=yO`se|<5~zVuvn:}٦09/W!R v_6=K#ufg'HF$~E[ϭ<5E&<޼hʣoN #rOl1&Wץ%aĈyܯ_?F!CTU& r#\*/ao]%ʄd 3usnٺlPݭgbf`)9y-f:GM(EݵEDDDD6dȐ^ 3c`JjDҴKe#X?a?Y-9}5?wso~[?.f뙔Xl/jk>߯.zi+6L[Ri,y1yYHqP W!z$ \ŻGvTwg񘟘nܥznwaeHx+]b =cʾӖML[(Hv 5ߌ+3  ݵ) \1:4 1 8 urv1!gY=~ǟ\#wy FdC@DDDDDReJ۸7vPҵm2cpC /l4#X+ϕyx~γ?O׾( 7~fg6]Q6o~,˾;gh~wS`Aڏ&Cs`TofE8i#g^Yx|玄h IDATiGNN_|a2t\p~kG_ "W7noR(&mn0ikqY<*x95 F/ҳZwy08 Ixi&c﵏( Yd=î-x~t ,f`4觫\DDDDD0uf:]&[n`玭)22 z̀_FnפhY.`GXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDD_`: """"""6-)_'""""""uKGY)i:""""""ea #nL,ODDDDDDN=bn7. Ӊr`a6jjjb0i\.H5{Ɯ$;[*5 :D/O^"|n7N\46XB)+eYv[ vGʼnbj^pc\. ؠWU_2&B4 0됽 ,q s ZW)˚3D"ɖZ~EDDDDDʸ(_ [^س(y%?td[8l˲0AP>5<>DDDDD.fe`79qȭgɀ)le{9!é0u9````,kEDDDDDX.d^c@^\ֿC믾e{qf"=krtEDDDD%mkXv 6IvnFou68+oEM>YO6vrO&8~΍l±UW\\vQ-UPJ#9?,vvm-bqZT]K=Q.sw@K+7[fo ӼAn\$mb RNVZ.JX7k99RI(nvtpe֋>gt,W{Q?{'MvYG//rmD4mUq^zhz;2f'gJ0Ha=DwiLH5Wt෩ R3W^Va،L&,wM^nB=I o:my'Q̷_ɷ˜ڕI\ŸqCƄADDD̆?p/|ZY$~C6axmrK ?lRgblpvp6c%nEXJCԬizte\oQUkP3̍cVve|è@L:}ڻ<2GRѶu-zm-XwJQ;;ٵv\ɻ};2-NB4e佻Xt {NR9w"S[R x]lf3xR NXxh g76z;MLA^&%L7&`ӌ^n/U5)ߗLϗ_Vj>{fnzQ&$՟7|%eq?ЈOe}$ᱡ Dh MMB[)ڎ]ݽk'&==[oyI`ɴ@EOp=˟cy ZP2yZ,Us]w{֥A>z܄M@yG( MH:Ƴv(l=ĸWbxSk 6bo?,WkUK-yE +wuf$h^x8!-;o}؏fdlJ$Y4__>EU|8|.gG],OunɏƱеKymD^v;ă7*G=H#S283#{=0aek0WGyeg:”N4j#?|i/qX466dеEdAyC/㪺=z>qІWS:t-4 !=`{ `r@Z Cc3fR>~|:'-UD&-CLڐ4{`Q},489Ƹ/:_6pzj]jR2X#6|6ȶ}ncdNF達2>Q' _Q92U \8lڜixWrz[2fM6~]Kwףӿ wR~_˞Kx݌rpjz/+}VDwP }e~|n;F↟ ڊk/׼3^Ngx󎁬xm=3}b`U[:.g}z^>΂72 'ig~O {|{[neukA[񝚦I~~>YYY\ȇO~yL%w^AKEWu2N=sNp9u4}$R/1}ˣuyxjs3ih:W`]ձ\_OdDIӃy;_S3Շ2zA"""""g1U6l6 6#`3L\\AoפhY s;o(|I6'nY{* a#""""`uۨmm|_s^WPOi,QQQ>w-Bs&""""" CP ΙeevkyaqIJ-B Р"""""|lp]9@`HR&jC\DDDDD ra\Sf~o]U""""""e\s. ib]DDDDDD.ۅi ?u\oe DDDDDD.|a75%""""""`QQQ)[ eڱ󓓓,"""""" """"""" """"""" """"""" """"""eu(zuI2.1<֌ .,%ի\e_w;OKr,=^bnbEDDDUc|uu #mGM7WVX pSRWEhdkl \fDcp$Mkn3[?r[TPYs$ k.j^V{Nj9oMcG?ٙƫ|u?0g/0=jeߪÿdvdxLn 5\DDDD.nF󇞢9i}^A~OZaut<53^[94)?q2K-9KGqsSo8cM)ҫLnP46|5#dskpU;3w9u: _VbݳSyqxw2OYm t 槝;ЭV>ϼ22s/Ư6n/\;X0;>~|W\VRtӄ80G>pT#]6©@H` jQ]C" 3A{ A~߯#my&'^u`7;&g1omqZVn; hBĚQa#]ݓ DDDDsZ-mFaI6hsh k&kO0{+MVNM{ LޚƽnI [$vѱkk[koMfi`ї9\rnc6>c~K SCX3Y';^X{MiZF{iY]mYmynDTnNee} 6m`|x! d@0cKknTMYb>_/%D){E`{AU|3I=r,%Mn`n_m*H9Nr|فԫSfcƣYSz[XA)G}lwVX%7۽^DDDDۖQxpnseflujl>#nYDNHG[idҀ`s?[g( FH8@|:ݍ߬%)ѹwN̍8~黦2>O3_Y#k~FB@7.=&'f<JO,7a]Ы=ۅ3s*>xu4X=f,+rר׹/c53 Da$բ~EDDDg1R/Fc!ښ3 ~e_ [׎\Vl ,g=nRY%cvߘcxuO`TNms9K/2lR~OyXv X?+-oR=pW<}mC&nr=Ӄ8 +KN[ܞ `g_2:O Dy`m=rTWKx&GyD^}?c4#0ZtOM1{Euk@؆)V֧냸ڏ}qqw=o)C_҉>S]w\B:' Nٻ8̜f}7%%^*ERJiTY6]*J$"b쌝0Ǹ_z=9<ԦC?yrS.n]+:#fXj_ْ#|ɐD]r|$EgpˇerkdK <)?NbԵvmڴ CliڟLΝ;9hh䖐$IR{<8?Xf;۷o`T6XxmI$I{_3OY$$Ith<Iy w+:,I$*N*$I$$I$$IN- w7?rC#$I~7~y絧bJŹbBERʴkw>5j$**އ#$I~WTTԪEj((( C0t$ eE$!66(< `I$Iq\EGGG$1|m,I$Fƶ,I$ɸ|-"4(|$ImV$I$$I$$I$rHn9I$I/ r$Ith8-_QoA~^7Ӷ%I$tL AphEpQES$I$KDEEDң9QQĸWI$I.*~_犐$Is.ZN'x3Zo>+\Cʔ[S樳j ޟ[BhrjGl0 RMMKwƔSR |:` 0oe-6.[΢^g = Y5ݹF4{mGdP-q^Kum0vqAoDzαkz`͹1$4E9v~ x,9yJ^;) ׳#(J|\#%I$rV\ˤ'7F3|\3}njmIldžKFn>GFazhzGv3{gF80{^<=}9 ;Bf 4ޒ?1<&L˻zl(|{.J_=i:-`ק/sK]UUa|_$Ɠ}|8;-\^z5?%;z3ķ{v5L"^Ɛ3JuLt/o?ͥxilw]$I* ]9:h|;jrIcjwiK*̞δ7T P.m,}A2jąMB"?#(Ss1U~so>;~=jIHdoμR$It[\($oH)C|㫖5,pu+X~^51H[Wo`w 0n*՞% _.XƢ t.Xodjbz%7_ c6|Ο,222ݙɮTiٚn͈^ԏ$I$STzSLe ip*^ds.DXۯOgѧs\o_)*zkr!;| ͎&%P2e)+bbsFo+R [V0sn!LUČ 6ǑDӳܧo9g"O]w'O+H$ w]:[2sȊk̹$tc+Hx?=^c90֗m%R#I$I#$BpNӣT7stbve/-Cz7jӥ#m:ycmB99q \sޥ\ڋkg÷oQUz ^v/C#gq-hW?1ë+=:tD=h\o:1]{qWD}q4fb׻]Y䖏 h͜7ΏkL;Qg~ծOGgI$IM6a^~HZb-Mc4 %33s3Cbe'xh-cI$I9wr"!!H$BDݾ};gɗ4ImZ)>#$I7X$I*8pY{`I$Iҡ`I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%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$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IW9>Dn I$Ias Z$IzK3 C‚|w"I$I:kI$Iҡ#pz$I$|h'J$I `I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I9*zlߗHMₚE$IdBTD֧1sd=QrfB I$I/X}:>ًS 5Va [\ͣ ;u )V~|^z& 7d],)t- '? /g<VItg#zL{I?bc^ j븦Y2ZI$I[PHĀ \ɰa<^ۓǮJ%vƛ\Ǭ z̬Z{oL._!,^[Yzmꗌت4{i`V+:J$I `I$IB_~;:W$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I/ p+H$I!P﷘~Feyyaw.I$I˅CAT4qqD"+I$IEQQQQ(_>LT111U$It PK$I~wH$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$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$IhM+C$I:̭zm>+>x@ϏΞ^ɗȌw09.sxCf,]OFVHђeI95^q.K'"_Dzf*$Q~*/JO>CTC:GW2I󳾝ĻэдG: rmSoZ {ѡiyr+4eȩRm(IXB`2bȗl {CH8:{e6;\|̃w?mEIn۝.oeV@)ǥ'04G^ڞ6yʌm{+ ?N? wƛf0|uSN8Q<MFȮO9:nOø4g1fվ>íXo( v'XIoc֌e$I_J'鄪_qFm/7g+?އkP;Y(Q SYTDz#7Wu d{޹eY)hЂ?䍴]lӑ@J\~;|=SO@oX@x$~q7_g1w%)tT|< Y9r dD,233q\գDžͨ߄ )3S@46TqsC;ޙp)'Uhu6fzr)ID?o ۝Mjxt8߼üYHjWD TEVN|96&8 ?!)t 9sO=+wqhO̶LlȆŐ$IRa^ȈkhA#6ι7,gZ$>- -cem?:uF6PXoݐZP䕫wNݶ% H:{C97be,obTƞK&f)Xp[ʼSn~_lź;)t\v!=!:2rr/β.\,6 Ĉb?ێw $, riVp@H%/A׆ eH;*cہe|qDlc7 M'XH$iW'.0HJhؒܟ 6~ Gvq'>foql5Iө~*|%Jغ$A+E\Q9 qv{B v3˟Pq*UqbWL㝹YdlB82cɍqBdqA@]y^9AwOoDV)#'\9~L'"|+[gCx2ְ(?_SP2 {C~KF6I$'A$I?p Pzd}5HgړBNSyL)_͚ǂ_/86ъF<8EIp61xtFRJ%*{"yNYJmRrUy/\gkl+_11TCzuS2 z-2Ǐe}y~OgR3щ),a4>xQV|]]CdYnU!bJjI_ ٵOE?Ig1!9-O☈'\H$'tK:=p6O1s-&Fk9;)pvz\qck#%ckӸD,VxkyOKjE'&m ?EuvI8SBRc2A`cD_1m/ϾcS{Lq'۫r'pEOJiA+c[ 9z[=y[Gw]Ԃ"evs1.脊nߝ''<;Z /O'JoM8!IhZmũvqwz6*JAXZxdd2#5h]lnyd|5z~ӖIL籂 z ՕsĬxuhуcr۸Ui})&v&?f[)n?UЦM0/?$-m1˖o!dffrx&猔,Odլ%(YǞͥ]=aZxbe$Vi@K U)}l{s)wzcxt6 IDAT6H+BSR9Ҩ{؟$G9õ]!$Is3؂*G ww_)`oGJUa&O^ԇK“"eq[1)O1~+L#ZqōӪ=viEBBH ?=SSShlcR?3$I&$I$ĸ t(;>; I$9,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$Iq/qJ$I۫]+ŕpY$IK-I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$ŭx[˛[CŸvIG}u`k׋7D+^79ݕ\?.(gޕ.zrG ٥3݁Wpo$ICktCNV>YyNcE/U9wdx5j 8^̨NҙPF?Ӎc֎ցS@̎<,9M8gm/=.$>E=)I<8$I(^ˏc;F}q]ƒթhլR@H<եb_ajWN>ڹڧqC6YjU4!Yd~6ʜƍWE%)wtgnlf\f%\m-RTtKJ/bkc$ILde?Eez,٧uZ=?-v}xC0ko3 KדXC9I r=0ccr]IW=(<u \=?ԍ2sHh wLvs^kT({pnft+'dlJfT޳gR*Yrֲ }7!nπoHRjatI$0z9+*&ٜ>ыF쒥[H["ao#o$ǿƀE~H \ˏ^2bwT a]2O\Eyfl6eeIzUV&*g _<OO\ћ>(}K?WyiFfZw:a.9O(7pbI`;ؒ,J%$v]$I+fwʔO< ZɄ GcÕ,XE!fsҭqr8B"k}:G/f_5Vz5 eVXzI] ąP:a.!Q;֒+ofJiG s#;JJP=GnDP췸^?[\$I^*ojDh ~>eDoYÊ Q#ݳeNR)a,9o̪,@QDe EVAqhw@.zrVIF(bVwt6VMXZ͹lZca]?7ɤo K+dwql#]_a8'iU:2gvzrY>wY) K(yHQdβ]i\=F$I:Do^d'28QD}6OfEbJC>4[nqU?&Jm*Sx[{nz~8 eU Ni5[Z]À7sc8&ɯ.rU'\u/҂`gv38fwwv%_F&$lC]xzLVddWyazה8"yq|:~[6hFIc$IHdIJW>9lٹ1d2֬A*5kD) yUԽ=qh6VArJąCו7,X[\n%$}V'5;E:o1;fy|Z̯V\F;x8.T5{yqŨǸD3߉s5h~ӽҨ(v^\*-I$зjY:A}+R8ʼ=j Nɮ݁n3H̐i~C{|22U,H R*>8^ EVAƂ(,W/q+r3r\^؋OPO#NO6T4i&IK[ iaHnn.3=ź%$I$ wiEBBH  o~wjj*MR}VJm$I$I{$I$$I$$I$*ЁvLaddDŔTN*.SZր,V {G&aixp-;W+6{|HCyaGxyow_ø5hxv'n+J$I2enyO/OX 6,ѯ1ed}kD6=~`=|Ac'ϩ{lcݗ\޺!qF$Id/ }:ƝHWԠ^p/Z 5>3*{4)uo?"Tmp՜7q{vEZxiI$_ .b{.25:1rO(V2LZ~9 >` |t⒩~ҥDjF8ً0dXAUWqrڣr0u`ޚ+Hʱq󵭩}?Q@8=m bjx뜊{wW%L>߁?C"To\XB\&ޘ3(H^Ⱥ 0ObK^Gk@R{[%:b/s&r4zą5c#4+~\A~b2:f%Ÿ!1t,ύ!t+Jz有0}f(6.qy{g`Ȕ9ܚCPwGw[$I^Kg4:du؝M gpٔ?]~?~K|8WY]6=} w?ͰxYT>nC黚_A8rˌu 'ɏMtʚ>۟ u!tYTe}~:ۃ |H?7aß +nQx0Pj:^yA{rnۍ~ cxKiOneHQb3wDr߫3 f ^z 7^+/<ȍ)[y~t*\/?ӗTg$I?HRۛ~OM|zH2UhDӖ'#9y;i%NO45kpS&rld#Ӕ;{G(w]+_xV^gЦqrgqS8+X8oDHL%.%ILKv|r1(S/H@n⋷?gqLeᅱʞ]2_q,]ױxnb;15PnVsʷ#eh[̊]ũ8TRǽYC+ӯ9\1cمK$ $Z]eXM,{};}>纇{Hm,Xu)P7atrWz AOpz`ҵhPsJѨHnd%mO;ץB:437\D({ h)wE wD25i,wF=N-gsfuDSꐼϼUM}U^jTwCzQ V`u>NaA,eKu%֬gIHHȎmUqLq<Z6;ԔRԨ@,/M#OE{D]JOY쌐%S)ehSg$j  INk5D\Io+ӫdE޸RaY?rDoO|«`+r啮 a|7j}g䑸"A2Mk*A,IK$Iŋ`wŮ.Jů~2KU$b sٶOFoYʭ`Y,f> z6orzJͲ$_Î*_*(@Rqd(|ςTiy7[%i]Qll@}}-wvq`&gLqUiP˷fRYظJ޹%}6Oѩv 4d\%YDʥ(Jjh-b>۶`|F%SfZuҽGr 8K8)z?-InJGoc]fѽRJe#d-I$Xs|qz>7ϾO?-dWzxzA,\x )!䕯El z >ʭ};3o.cxf$~Jߟ^mOymr47]w'}𭗸뱡LYu[6fTOYNV~zߊԠ+űϘŲ3y .]xlLqZH+7dq<~WB0coWo`tV~9+8YY̻/~2ؾj#FLbeh_' Xj~3G'a]FL!Yפ Wԉ>eA<c lX9>dfTI$XS?,kFKXSy\$6y$I<Zh za@ t; :!) ب^qMYlWןbjKI3]Ly^Hߞ+.'^ϐk /{sʟ=O <eg^ )?;:raI6  EQ,`AbA bWTTĆJ+JSTzw@M2"**,ΉgefYO&w>@G{og3vq!:1 /M)@wold@']KtbTjߕn2cd!dhzZHht5E慷D:'r]h"p2=LŁy|p Uѯ ^um%늼3lNc\B:9S԰3vm3$^^ ?m/l#+CbZxg/nM@4Un~KO͵۲_J ;|~vr-I$P j* Xh1˖.:AD"i;1ZJHM$Ik7.эvH8&:杓fuP{R@K$I $I$gT@zaF/$I`I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%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$A:ÖqgsM̩_`;rظ\_I$IEIK~nݗP `P|_c,I$@dI0FJ|M>'N dN:V'2z?-% Qb֗W3Ҭ)l#ALQ98O>?w4/b팇՘mr̳w:!DT.{bxjI7le,^u=k$X<1BaBY)t%}a%I#3: I4mR"3sb\ɓh oC~}y {Sֲ^pχ^ ք~lή%}؀y<#f[.Dwsu&Uk-C @܌tZV'͍{+*1OYf|ziW}m zw$I`h8lfդؙ:> d.s-bs;dU\+Tj$VZ 6l;1سN"~79L2&̢`Ha AT9NU~2˳V ,{77YFlbV$I28U)?Pjqiξ L-igb5:s*~+F4:>sBd~1UOÌ]R9ڤ8} L >s$I(VZ9-`E|ADHOO>h+?-g3\6z$%)Ǿw-[I$k7.эvH8&:U0}~LݺuSU\`X͝ոH1v%I$X:%i~4 $Id # H$!`jrPZl,)àӶJ+I?ɯAy[`RWde\1F-D$OrX)ghX$l|+S;8_l?L딧iS <Z$OpXH0~Q<ּ_v#|I$X3srr ;{ +X$A`@)IdH?%ߛ$I$I$I$I$I}]DK29S_R?7`p3C$I#BNc9xZW)sp'ps@=6ز4;-ES`ׯd*K]>>I$ICr6G=q i p=j KB^6Hr9H$I2\r?~+=g]'mü<;0ov%Sa{nޜ` ߽0羙Lӫ%X\=v?LF׳z7 5e8)`T^z=ZæP>+CpI ~+VUgxm>[Fr}㚽a5dR[1~?a{=7f88K1ҹY\8IiFU[x}MJyөd+V`ԩSgϘ1B Q|yK$oguw9<ˌZDZWwIlM4Lp8~GN©pԏWٻ0A y{ G_qw6.Gμ&瞗":;qq|,2=1T`5GVU={ )_ĹݕVm>7=[3(yf'z;bxuM&6sW1/nv&`oפUK7_J~Vw5 K6)2=^ȷI-NNV? ƻ^H@&.1}u۷QR&&}wG= g!C{[ (I3:BYץUTːn~>ϗ,fUI@dcnv2Un:^ØP aw:6b)Lv:mXчLױ+^RPp ɄTVxp)<$/,z 8˼Y@+KE7p[$cegq)g LO[xQ l&R@J.&Sx4Q+dc{i61TTzϲrq }7!d3I%B$;퐑uObztחTB.[K*y %Sbs-Br8DTVT zzo(xBysEOh̉o廡nxAJרq͚sI8B $7T#ITTм5,YpfrU, H,^@8zK{#;u6I$:Lt ̚ϵ)s}M@iP|[ sMwq},K>{~bCbV/eyv@7㱁etaMYS9z>%awʿ9_I?ndp38RiJilc󮜿+7C laʂ4V1gu9)T.GSlQ KU}*׬`Ѧ\2 5(_&X( d`ׯ!^{-YPA*)޲kӱ =ư7](rStQ:.{`ҭfBѣ=z0~%I!AWl1`S2j6!gܔUTӯ [2_aڗGLwvxrg= }_]ٱQ` Găq2uɻ2~|hsJ$I;UVAvNEXt!_iD"i;1ZJ35/;{Sd:|kJG?EN=1.@~X; ,Htt"I2e1. ÄBCԼ/>}?nݺԩ{T!?A<3l;CT($I2N[ =;ϪH$I3c~oDs{$Iҡ $I$$I$! A8,ݳ7/p@`8/9$I#!1z~ӟ[9&=KbyMI$)KӾ!{%1?LZ0H.'::Y`I$X30m";ׂ7 }d;8_0$i]_$I@S,ZkNVVANA8@_^ EGK_111$I)::xbbbH̟X=IH$:E86|9#I$XoI$Ik$I$I$I$I(ѻgI~愼q.f4^>51Vё\DGm\85-u$I `NAú#2f[zLcٗ%YZbӡ](bu_GMicX$I$< Pʗ9$]؊{y%h{! !ld[iz GD߆yԗ\6jbێݸcN»y"X~1F=ǃ+plZ5oKpDB,)g3dzEbv~A01dy]ON*L(|Omq!3;y Rs797֓I$*u2(qc}"3.q=N 1KOLlOnFYYBSd֝׍%_1o2J47Dǥt2n !2H^u{׻eΫ<|/[hHY gCd2aLv7Q$uN7s. #:c%r/c2tHhXF f'td< ;}Ն5 =LNorC Ǵɧqv(g{Ko V1+liVWRj2*4OpH :s߼*9yTHL֧}k{YreU _O>*~sHm\ߞ0,\5_{z߼Ǜ]}Y#3W y`V7ND zIOQ(fo%q W#i"޿ dKDL=FTM9O I#'*w%Nì=i݆%wS\ X53Cyq6u(}?z_Atu;?iWii+'0DcD{%f+Ry!9H `}՛Y$j瓣yn=O;z8cۣ z-Vr{-Htu[쌉{Zrە\>-ə9@,T[AR1iO-P<Y &qƳ7j\ @Rrz@@"T{[F.[`g*7ߌfىi۠f`ͬyӼ1 eІoMg٬ w{B.挝ָp<pn|D]Yiܸivlg~ˌfԝJҾy92Kw$\ `Kײ8ЃcO㛵98=W%. dzSi8ύ;)4QR>c,y/B;UmFbQA{baT ܓK*Pf&6Ŗ/g!I DVGYݡ4eKJ%R2TǥPXav.H'5Unx0dBTnI$;>O[KSiW]P){c3c80)W,R$pq@r$2Hg5_ļ M"8D|2~;Ӳg⥋.% !!~ ~aov)g¬DO^̖*gѼLћg3 F-XOZv]{/EmA*3nڏA!m@ҟG'鑞NTb"q{<{9o٤g{tgp,SZc,+.!LYdƱpWA2D$IekqI ʞ,rEX櫌;VNKXϘ`L =VNݝq[l EJ)?HQ\Ե4 PBY^pBSN7o'}D J]Z,oɤ#/qGtF_ۓۢ8ܙ$-9p6x?i??=er{be]ceiOLdg6RCP0M, Q~ > "|w,᝾ﳨk?nB+yD$I`~X,~XFn!f,^|KV׻}/)}nDH ʊcB&9Kc!~rM|/ crv@Hg1A(MHb&|c}y_sjpIl7ei /0f{wo]M!b7hu]b`#0m"5{n˪rRxlIHx1[~z24}ڼO":ՋPih >z7~w &ȕ(kg/Qn" (7cuXnO#33`I$`xS|Y甧Ҷ_ق%fç>ʔ=ީ+{?xǾH?2'Kxxn ԻU_9Ɵ~5V?s䦡j4y {f0NOϘ_!DA5:Gٯ1>htnπ~cxl4OLZum1^, Uא:-^NrZkiW)jʨڑoW %R^-HМ[;/ۮdX$L:UaSg3<յ 5^Puw(ErU;b#E5I$Zjd,ZwFeKA@$!==E~^h3 s9x_lI$FHLL$ :SST3}~LݺuST!В$I#,I$I:"`e??>~,I$zK$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$I,I$IA̓j IDAT@L yKH$HLOJeo! Ф&pm72g W$IUzzsfndW{k$ISV.w$Iߝ2uKOgI$w `I$I `Љ&d"x"sI$IcPkutyxI$Ih_GgR:=zGƴz?l?.K$I:|x;̬ߗ$I$X]ժfT]^E(\R*o ڞ%m!a}6{7Ǻ 5Fd|f(Cl"|: @iyTr*{..cr$$ Ȩ}4M9%R.g癵=i8K$I2ߓC/@*#^h~u|IDdžJ>a|{A5g`[߇SI GO`R(;s,x3&}Y 7Gl ɔxv ߷lB8y|5/J l)ƾ^']ļ3?]$IdK_a2hrBė 3b'9d{f+L Qx]gLxY$F',\!?C_8,Y≟Ċ)\)-l%2?]$It$X:Dr|i:۝mO(KȽS$I B(>q7T&];$o%I$I,P Ș~nQ;J/6R[4!vo}o8[#Q<LZ]q~er"XX:{؁ ~SvNEA~6(YnŢΜʽgcT<=;9+&so3v*6R.g_s5(H(X]{誣q@sV>1OV$jC}=E:%I$HqPZ1w}fײk_cC|!rChڳ=.HOn^M \5t!BfKaSY9 ;0)ko0L=ˉcnk0[1k7κڟ@x󃼼:%6sWSc4?jd ß^$I$S9ܿu9*\n?.)KnrŴ;x\[l 注J4F8IzsNX1p,s]a!B'0ob/^3YQ86;fe9?l]kY.YF4rԫwC)!>ɸՓg @|9w}<+!!VlQ&$P&"m?7C87i6s-bsԝYE6kb0qВ$I GYL ߲T.jB/%ٺ+5SfY"M emg :bnۗ^I$UwrG7kXFjjHA_$I$ฝy޾|ϺVhM]j Mfj>{ Ɔ\Gײ9mO?#2m[ V|ųcc;{SoCS6jmP &IVcU3%[Mwa')LN]#(? z)I$IP,~ӖJ\Y~*NsI'ӳX}+zlı7 N⳧a#Y[Cg@ΟBv5'R{yxw>2|Tϵ\ىQ$7zRaLx5T~s_a$I#DUVAvNEXt!_iD"he4ߜ+!I$IpGf9ϟp8L(t*MM;uuP{RNJ$I$I$$I$$Ikâ03 +nBR-fdiZ}Sf䮥vkZiOeeiKjV(*G뺼{}@ o&~k:ؽBLImRe"@~.='{s4A*w걭T-v: c'kh](SGχg(2z~>[M2R"۩x8]m-U1ф~сL i΃^U'W6[OV 4!?yZ<_Qky*2kpW? ' g)6үS iW,s~mp?>@*x< ZueL/Juכl=TU.3Z?+IJ޾Y,~zI-yF-׸t4/YsW)N{[zn[vN?O+9E `IEt1!9_fvSջjVo٨˵&oٯTK:wi{'[@!D(FZO]J3i'e+ꐗyRէN(o?E?Pѧڪe*j|Ԣ/@ uӰG|_QË́P_^͟imVKth};MM&N-[Ӯ$)'KSg/vq?Jr+3gO l޺i-к5u.6J+'UwUn5yg҅/_jBU~5 L]:\zHҝYG{h7hiCvg}zhW,Ӻ-5J:hQֵiYZg&z% o&sT2U2]{پ#պҚoY[vb'Pe!j~_nyy@ӾtP>i^}p:X/< 'VkJnJM+kݝ|YOyלAC4#46- u4Mn9N=[_5Jm*7Lfa7>$I۶mm"""$I|/4"Gw@@@@@@@@````n#pǫ E\S00000000Fbȭ-#:+|7:c6^QKիeWܝQ'mH5o7Fl+9zpfY}ש~v$_s3\yE-Uns?z  l>6yڼl`RQprCJe(5n7d4`7dy<@!`-OwcA;W+|WЉ(hp^E'*'Pe<>=Z:ehWw҇jg[t 1S!utW> NJ\N&(ӳ*5}B*$O35Rt6ӌ=l\)닐5<`*MU<߱ܦCZn6tax;͝B35ޮDݢ|kJ~Kt8N)VQחԫ~<߮۝t3PU?=(Д,Z9[K6DerkaҌ#C2^Wg ?hWWGar|"}N)WU~Q}+b-k-ؓSԿbPf/R5c<ȋ=wSުР:TDy@+=Oqw4q3%[:y悹y/sv`T?Uyȃ%,y<nT<\;,E_\FN+tQ jx۝Y4N#; ה"9iUc^Ei٧%6C{>cu5%Zt{Z&ucONqiHEknTRzf\,ڻ;kњHRJ?-ҜomwOK݇inf*gu`(_2/ Ӭjb5F=wGjsD ywDNРt{̵d_iݩN>UIYj2d͏Ԍ-1R={3/@+_}ou݇dHi48MNO ݔt31Q/U*kh!cۇ9eN7YgGjᤁj&^'U=wOLy3/CK+5yZoV?o3"hRNݠgztg^wwϦ Ǩ_*_ʄ7Se}Z.#=Tmz4QYSAm6Sș|W OlЁg5K,2-˔d&Wv_5*S[>vɔ]>*jg|Nq5UƵR__d y5RҼ>]_|(Z[gGj \J%+UxQmؙ!N7zNo\hs\&{ pIj=95Tl\82lG}>!wQh9Y s4k=~Vt6A-9Jq)bhy:dI2hhһՕ;7WQ5!etzpU4kGL,aǴpJu'=k+¯=}:rUij)VХժMծj[bW7lr[9i۱8ڧ]yUR7 BQM5V]պY#խUMeu*ɕ=M>Ki|JVRq^Խ{+3TYrwW*%ߣtPRUo:B]UQqN9(4; pIb]\RE2֎b7.CpNWd \tR ՜&5` Jnpmrg[F^9GIp*Pkk1֡}Ahu)OSJFL~$gt YvkI*yutNP9skN:9GN%prqȴ;c3 ;<Ǔo_4=Q Yw\ĺߴ^ z*XJْx{`]k +IDATyJq).?e!. j,DݲN /Ҁi~ddsm޹Nî.=DWw;]J2lIvl)N%Mj0rN[ݧSݴ٥Rs> pu͹p O{֕iͧ =K53RÜYxV- ^D]rIyv\3W_t;MygՑr9ez 䥥N,2Sqw=Zy}.Oӭs#wHjy|(g_z)u nKGXOQ h<KwW cX1@ʴSp'rڸ"J\!U{œ-aߟ1jReUEA5*8G*zd/gHe*Cx=r. ڣ'XTϙSHzB3wt+!6EE==w E,iZ<}7ꢾwVzGwe Ux9_~KЙ5w2jWg EOх;-}=cv%(v-XKQ۪2FOߧ/*:.AmԵLJ"QڱR^:TUo:cH)GvJ(z=TR'LьMu*!A'z_P^MnђL[Qet1CI+{m㧅Ow tkVO:KfjZNş։#J^S1T:^VMHP4se6x@:md|?7C6]=M:UTJcu.6J&M7ekrfvUȞe^>QQsg>ܮ[Vhx=K&goa|R1fz}lW~zsIC}\+N%1UFu5RpU5KB;EKm t*Ƈբ)kH]>³/"%Mr3'2A~*^W}ƽf>\zhL-<5RtG]TT{>F^b˦饝t3P!hc%dR7Ex*Ju^3;݉ϋ{u:553T?DE/҇}_tS5ͷn댏njMY1!3Vz5fyY*m |vا)ӆj}ưgMI3*s2*mjO+snwH yKaЁp- SQQ$IE;5MSn[NSoWc/[zG*!g1iγuw쩊 phʥ Sp8dd79IIYPڶm[ou{sRQm AΨ= DFuuSuc(C8        000000000`aP0`Uwl PUC1L9hq]83Uikei<<<`ISNe5mXSMJJ4[1oj١ 8 a83På\9\#mXdZa.ݝҟ)lapcIIi`K^V,[`vZTy ʐi;4[vj-Ч@[o[,!"4s~nbTa0=<<_C2;?|@@PX@AѥKk… {[ kE_/ (%:0G0  (ve $: @fgsQrFPT^}鳌)Q"@dX$ϷJ`T.~|J>|Qf͸XjUN?XwӃrIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/path-operation-configuration/000077500000000000000000000000001461403617600260135ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/path-operation-configuration/image01.png000066400000000000000000001216771461403617600277620ustar00rootroot00000000000000PNG  IHDRG+ksBIT|dtEXtSoftwareShutterc IDATxwxTUI#I:.  *{]Z߮RW\DRIIB Hi?BBB$0<<0{νgϼ93yd@DDDDDDDDRp8̚5(|m@AhU/$éP%""""""""nrdLzz&&).K=%""""""""5l6aР~=!CBBzHDDDDDDD \nngm2Y0Mu;a0LEgvӲE3,yyy$'tB&*v; <,J`߾>α9~,ډ'33t,6E-N T0ILLBCCiڴicq@FFfX&}|DDDDDDDD_U=rmN:xڧ?sX0Nb_;dܠub?ԭPϧъoHLst0"ʼAbW&\0݃GhV^]biٖ>B$""""""WWºk^2kRj|︊!829qᄈ'l<}k/L8O7YtKxf+ն˧w$u?x3)>:/gKsȒm n+.ug a[a a3q+&\ܦ6mE;> ';yys 0iq<>ڇמMjBۦ/wр.w=ÃE/},'>miqSX b4h e`ׇؐUVLDDDDDDjK^Zid8?3y0w#ń5cmS}?rF4ό/.} Dlq~1La+{ޑ}fgn1h?b0/`O^6%{@K74!INv\Dݜ4l75M򢙵;.g`[B;7$]J~tn뎗L_ᭁjڻ|oyH}IKd+hr1N'G+Vk_>EÚ5XjU7z""""""e,BɔEw6w1gZnC;ljz&Ϳew*grpCрq_=&JF츁#ɔ}c` AD'K }c"Y /~,a3ћ8}H~9}{ ?3t` Hs&ngƭЪ,( ֬YW4 {+(r5ye*]<3[Z`O66?|`à'|qmG+M2X3uYgm)GW?2o?ds!L79;oLO9j0}BQo5 R8q2A^ V7<9?*}D/Ao͓m<4wmof߇0OuB?q?gYr?ޒA)+|Bq|> FQn@ d:.vWk֬j7R G\*V6(""""""`wUkZ3yKtVT/C|~1}~7SWMf>|am}8 ^1(VN~W7zz:[-1ЬY# +9n'e_Jfsv QkkD39hۭ>w+q|ejtvHJz} o1BL 0(*VQ)@IDDDDDDL8jd\). 8=';/\adD)3l#l?]oDc>z\8KfђC|6//_ÍWuK]czI;6HZF\1zX`-_aVɆ<7u6fN} GNj3uL[Ĕe,ܝu\p&(ocO#!ϧ.\l Pn1;SoDk4F&'_\aL]Xf-˖//Ÿ.vRᕈUOBxvD^VAvJ R!q$W|C yn -YǨqT,z-Xf Gq H6fyεދ͛'HQ\KX Þʼn#t>=Cx}G6/@ٛ}!~%}9|4Q^Dz2^TKO<?X_{6'$v^H{&p㽹 >|.?2/Y%˖LDDDDDDj=cԨQCK _["U2]uʷxtiEꗞ\u6[2}udegf: ào  k{QUap84ĄKvV?[#VϞ=xg [=٣c7~N;2[*^ܮ qTǏ']$m۶ &&(3 }S]F;Klwۚo<""""""գgO<֭. jwN HOK n]RRRjݟ1pEOeO${:O'y M=IfY沵`ЖԵɿxU7JEEʞΪ׿)]gPMͬy+ zu 2AB r搰g9K/֎vl;]DDDDDD@hذmڴWwR5KxX۶(s_pvSc}4g<&OĜ󪽭*5lMF "*T7bbRU'xʂ+<{y状/[a#s(0>xYvnIjzjhܙUixU\4 o1cc) 88ݧ7+V4.Rx21u_LVoSOڽ%6bx ޳>}3rp{k{'ex- }വ㑻̊-Sjnt=EmͩmxE5x,1 \0ѶM |E?MCIM ij%1)Gܐ&&b*?>}nҎNS<qnes9CPǞ/zCnf|0"""""ry  GQv;ٙ8p۶b6W/zKpp0V$>#Ӫw L7Gtc!̞=/99w5`{W>庴#7򑕅aa2={ټySŧ sqV9{\= IZSJ?Vnk7BfǧԩO]O6gbdҌ4 YUBQ,,=HG0H6M`,?O!&Lcdk4%Ǩ…B۶!0i'ws?.`ա/h#-}٬.2GoXN9:ˣK>m#r" ONDDDDD.ii;<4`/kl*0f 6#qq|)g0T۳2KLUxW^}26_닟?99[OLLuִlќlHH=4+Vdɲe5?BadpT9xD>O>Ȼ}~ִw^ b^i "eԐ {"{ȏn8]s8:FOфNIvt ^C3ui!44ΚCu_nv6π'-[p,ˉ.''?|ÆmQd2nWDGEŔ_2 -pܼ|mҘ#Ut۫tP$3L:IP>|ꇄxપl_  ,;鶉\ݳ]:wX0*!1֭Z|VHHLui;o&>2sK+-Y{B2I3 FNRT.lE8#?sYs~ԍ H[՞M_0JITz?@vh;S1^l"9mPV$er`wS">SC^cWٳ>UU m҄cF3x}7^g|6iR#}W_3tjuU^X~\̟{3v̘sܱ#׍N^^SU6 [.87FPtºU72-}|4[#W\M/~m>`v* IDAT+lGؕJC\Nv"\?A~~'o#4>''qyɧxx;k{S-3y[_ RxxGhP>tܙ}7f oibV[_8ok/n?T?ќ'n,uҾ}{ڷoOV9gKٙ^r-&#yef}lI ֗7=#qlvz.8#q#qE(~)G9Ӏ+U kH\3Ҩ{$}[7Ia\ۈ7~ј.Iˎamt&n`xv4 eX}lst=#[ڪ3CG%s}s tufpr*|\i然CPQO'm>W`lW^YH{|RC4h,]-Nҏe$ ZR_QtX6;р0ZJ_ g6G7d!&"""""FXXaaaN.]dfР-n76|{+}n+W_0?RSX|9Gd8y鯚\5j{06k԰6陙<#8p|j ㈌u]nvŦM[Xz5*\ݞgУ7{ųt 4*TΈlsgg%es3kH~~]9ea?nW؎1ylus+uմ 4 3Dm͞�)vg:VlAp]i9%I-;ss;-u(xl-%)嬏z? ?w0okVl*\|RXzN''ٺ{{gn+3X[v9爫}38(%V߉1a-ؖ[nzy2\1mSݏuˎJ3ٲcO,1hwtF_tct*rgfE ;x0m]hѠ^ᑄzAر2l1U/lW3hO̽ߐV~9l'""""""^MWaSssym~2)~?uyVPLdʄ#UTިCe0i=lڻ5G3 kFLfwcƾ2p6mcIgvv[iܪQ<+3m'$g. wI;زM%XZLAC)4j؍f Nd$>y=s7v&۾Vp8y<9ݹ5֖ups_Vȩ>X7DUIU'ʞ1yv;&Ӟ)vR85ܾ]ٝn@_ KbvBWA4 t7.F M&<t{R~>+:h 븡/ H`hNgp˄܄󜇈xey]Ǹmu/r6fFuI.Nn qe Kv횋>=Jm7IM8¯cd;'ebeys9%^SfYF[6/!$ OM_Wѹ`ZC%>ݾ$<y3y"""""""ƫ+N#Z6i\߂46,OQMb֒}HeE<ײq5ìEo-Gy\1`7-x{[W"HG1k)&nT˴|\fL|!+w6ge2b69﹔l* 2I6m ̄k%ril0ka% :K64vűTvJPyi"YǗ7[~q_lѷx/Wg~U;9DJaLX;.wa KLI aDSZuC&Ա|;$Yoit4t %`9Gb5iܰMM;Łߓr\9:;!H>4nR?f恕`/en A;nA?2?p`.o!Gꛂi4np0$No1U7ε_oFX6X/'an7O4 gk2_gprJ?﹔%bSڜ%3iy3v=Çc #2NHqGBC=7_ONe#;k!6'Yk{nj i_1ag7 W9lۋ<"\S,qoϞ cW`/UNWNY|-t^+cKϚ29Vh36dyv? [z53k~~뽪['RLyX9c*+mƯ|گez 8|\u*sM'S='Nie|&1e%){>ӯp,,c3eC]?W4oAj>_9+r[~(n= 0&h|0>H¦SU\»0Gg"O#lZ-1Wւ8 X]%Qoܝ;nR4^kJsJֺJN;U>\1JXRt>Y)խ&%)20B Mc3ٗwӘ}56K0c;>ol?c[PDDDDDDZ-X/%!O~),6lhW{mj}QD 9OoY- ||x0h[l zAW ֫?ErcCqch\z^^HWv+6)> ZVb[I4j*l>4iܐ[s:[zxwlITj= lI`" 5JDDDDDD.^^y28pB7"t"bS_MrWYC|<%F'%H+r ?U\G&G1yKߏ9ײyS{驃(fMgrӈO8QjMjB,kX< #?U}}m;}s%k=57Y: X9ו?K>Q˲frhU-}/h-u73YխWvsD\' ^u)JMtsN Y)+?▕(tV ẇoI)۸ma[1S*kf?_^Rb-'Q[1j ?~WVPxɰ۱~73/&L)ʘ:Xg*gb=S?"驩l"""""""RRN?ͷ:>}'x% dcY ̭A5~iWw?|Ǜ2k)&nT-g'Mu7H)|>yuMp` (ZO˔urTC[o;-k7uh#NzVǜt\:+INcGc|:2¦ieA~Cx"e+OKӸ+ZW`_i03#·֚:("""""""5TX^{z Mѹ +׳!F`?gί4̤^ݾ [M*˃ٿעE KE10ВO"+]#"""""""5/2IܙY0GO`Zjܜv=1^tנ7Ͽ~$25}\QG2fv.[̒s89d9 xZnܔm1xc2>h”cUqs-~ iHx\ӻI/ؾy[KlD*w_I%u+p$=uH 0Fq<> @t>\" i٢Y-6(""""""""5W""""""""^Rx%""""}GIQ}:LCHEQXsy׀q95Y,"*( `D%$3ac$9sUu{~$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IRJ*ưpxwWagrҷ_$I$IpJE%a4JB{ג>\$I$IDj-sQ&7.( * dǝq} XFVos4ƜRm\:WN+$I$IMWquY\Z$ uѝjDYۂ&l/KMcNQʊ3y,^w>G=<kmꔬ`{smRH(`8q-ky/Oϲc,<;~o&;zrb&­'Z7Z$Imoϔ)S~SLG~[TmU'zeG=8玛xrҷCSxZK^~/8/v} p\Qњ#_f#~N^{tX3Vڨ'lncid~M߽CWgY-ޛy+i`2> &VK$I9Wc„ z &Я_?9s> oI;x~}"I ɣv]jl^zy3O7ծME}PVˣA^"+u xݨ D{>QWgYBUs}'z&Nn_htE<0oN4bӾgVq,.=hCmݍYi4 Y@/I$IA1ޛңGf„ ߟ|}]4hEٖ1lp|:HJP]P؝mB!Q*& 8fgּl֪*yG5@kdY\:z(bq/r 1iN1խpepOjI$I631|ϸq~rqƭVm og9{6 jr 'V E 0C|KkJVkIy4 @D񭺴[g&mVUYc,KZȸbSl@[o>l]J$Iժ0o߾ <]veu>#95jWT^EUpsMK[{ߚDYGo?ミ֚ T'əCTcI$IѪQFx5jQFqnl)W˨wZ;P࡝9s>7 _McYL_ZTO>۹=o$I$IMcРAva5mt-#jڊfIX@)*eBmwn}TYx{4 }ɒ$I$mƚ6mʰak8hذU2 EXQUug PΔdEVO΂G#vr.tS˻`Q.c٦7Rv`I$I-[dȑ^9^egDHxg(}6ZsSGpEӯ g_`xA%?Ӿk#w;?۶!#pTdC%I$IBlْ/\;^uNU$@=UA{\8YEf 'uHt9{^SEhw@^SI-V0syޡ$I$mA ַW}I&_AEZyѫev uqMpyc$~;eUTDriخ5PA =-fyY0uѬsx8GnJ$I$I '5s&Ӿ^$I$IRةm۴"hH$I$)U^I$I$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)ek|WA$I$)Eˎ$I$IJ]$I$IRʪʫd2ג$I$I@`kCWd2ޟ$I$IjG XokCV^%I8X:$I$I pP(D8& jUW*8h F-0fQ3JY$I$IjK,أ1maFH$B(jV b1'tmvyI$I2$g 󚋺T a*>Xaz$I$Ie-$0#ȅi&V;JӪaXы`&V[I$I$ލ]X=GymX:8TP$I$)Ŵ2Z +I$I$DS?ErYU^TV? z6r|0yC$IImV]A W^=m\m W{ ˳N\~\>̋.I$IL< &Aڧ%\iqĪۡG;[Tw'yxtaSTqG\qTWF2#}kz=ߙv((؞l+z2gY;NکuJe^ +=37x$I$O}x*(&@>ȶ\q@UL-IN dAyc&oQ$QP8@iiuFfϋ_$ߡ Xoye~M7pS65-NgMx+_8-=sOf 8!v"zf?xG8ϯ؍KrlZۓFtm˦Sę]QF2K8S/n I$I߯C `e _ƛ!B$(=M4AKOxɜR.RN;`4F^IHud:}B1[̋$"KdY]z;N8;uZRr֛֬ٚ_Ӫ@r:Or9 [/`ŻOᇯKcj4؝?ciH 9O3Ȇu:͓/\}K?#/˗PLyizt@HN׿bi~w:g:5ۆg1Λ yj%x |k/}{ҨP$Vouu =g[6o?_͊;oB)}$I]i"$*ʹ|"՟+T d8%Yr~:&' Dk>ȮG(^F6L+xXJ.1 ݄.qK:t*-ໂ lIP?A-Ol@fh_wE~@fh]̩cyuӝ[zY3&ٔJ(۔i1LsǎDfɅ@#ʘ?1H#ӊsT} 7?;eI\ZwWuqo2-A=ٳN~~_pe2eyYg.97=L'.a/I\z/%09^oco/1?xn/.:{>O=u|}{UKſ^msG%S91kG28;7Ϲ?=*e`wލVg8q*|5y!9@0z믹~o>6(I$I)w   jW!hbcIE5mhΫE-R-gG/ls8şW6{V& q/AJ2g~TWɴ09r"@4ҒPUZ=3q3$'¼\^;ڛ>=g.֫ u^ CW;={yQh@3L3=Ճ/vG\ϻ}/#$#naEp{.nAk؇2,ȹwmwDzsm#&0ȶtMI<`~ozAFldYrzԯh(F7ߝ:7E]LQR$7;{gYpٕ/}U( 9M$I$)%^ND9%I]$%$#FfH:4d®9q`0 yUɦNۗsx׫ژ%EY7,h+* VU'NW\vBnye?u-iԯMbsyn`֏+)g@/G)<"2KP&+,,7sNC2#98的xN~!}OD$6zgu-; ujK#~gթ &I$I@%ӋyyI c4K࿤s{Ģ| \V-Ҹwxn,&c+r刽6S"<6pK~ԥU%7H(oZ˫X6q8oWx4>d$Ⱦ_=k -^kyuszp~m6rē٧ n| [ySO34Ifʘ3t_WU2 U-g#l7) PUJq4IIwj9M/õm?N_6}^d6>$_TUvc9x>b߬}$IaO}rvƿfhԈRd n۴[^wyr>6~HGwg佝.N'qǒǸҿPhH Y<>-'n<y*w゙g×qmۇ{7aȯs[ĞqiUwqe 5S>ؿo:Dz< IDATgu@N0U5_rrɗxAܽxVtε=V3}sc9I$IJ$If͜ wH$brGojCߋnAE h%D8A!E-tjXnS2k &IRCn}"PQֆOxNwAqó]E{J8sS悕Gye4WON5g ɃU~ O6ɳP`fZwʎGqJyx gt]9 ƖuOsG}rr ڑy!|9mWQ Ө5]>޺f2&t.WoaH$I6]" :vu6 q*ӧ\S#67YpŞ?zS[D$I Ia@N~UNzd~:x?/$I$IK$I$)e^I$I$)e^I$I$)elxS79^3I$IlxCC65^3I$IO&˫P~lN>R$I$m\6\H$I$զo?8K$I$I)«@ @ }+Ix%$I$IRȼd8V«U'ؽ1|J$I$)[`$pVZ B8ʤI͈Y%I$IT$4#eIjRE(ʫZ*LÌwd4*RoI$I> vOrq*f [^xCH`#8Ed2 _I$I$V5z „ՕW`kSB`d2O$I$IcUP_ma?~mp%I$IT6Ԗ!I$IT $I$I $I$I $I$I $I$I $I$I $I$I $I$I $I$Iµ}dr%I$IT;_׆Z VUdr?I$I$Վ@ ڟ׆ZJ&qbXͿuB-I$I$XNPp8L(Z VUXq(% )ΐ3QY"I$ITKNm90#D"BP;W:l0(ZӔ[uz%$I$IdvE!#Wts V}UkO\Uy5d:srj $I$IjY:8m'N^6b&{m!I$IBkТY(V+$#*$I$IJ1cDeQWP$I$IKµK c<`Wm+:ܦ l֛z ;D$IHmV]A-W?Y!o|[8dk[C$I$IF_/x$I$IƖxWg5$I$IK$I$)e^I$I$)e^I$I$)e^i8y9萛ZC$I$I^)ԙ2w"?~чo/ߏyzGU_y%I$IaWJߚ:(Xʄşs9|zb{ΧyZ:X) 3dѧxzUNiFtWWWΟFl)-LCIR2>|y ?wCگ<ޠzde-#y/o~Rʼm8~)yi4Ω;dn<$I$IR5ë_+JvYKIˣs&j?c]/:]Z+Pր9/5D%ˁ4Nl{ wˡl>c-aE(۲{mTN˘:>BI$Ifx[EW5dM`^tہ}йNb՗ }ٮ\?k_2!'UH&a.iQªt}FUߏE#l:N;$!ّͥc0KoGnCZK>zoU.VF3ykycYb:-S8_LEC^O 3aR ^;)O SL^}}*Z;.r s#:n?ZP>{2cx.,Y/ͬ.b^XZD^߃FjA^?me3wq y>VgĠ^^I$IR-0D!9i-8$'x) ]S#yW5f@vZ^¬XЧ{ơSvHD &SSQz5` [F|طCMZ~L+(``Ѣm[OP9oʓ3ӱyuT<5~@f-h_S>`-7p65%,fO`4O1w?d>.%oӕY:.~O ilP[d 7nC^獌qt 2ZoC.'!=7O=>O"Du;-`\F(/OKk'_~|3O86] =g,./l[/஬sDur90\ܝx*5hAG{3)Ї=ez??l&%@">]Nȅ}^:'o}D DHCoΏk8y^ J$I#ë?{yZKx-T,ej(m|`\ ȫO:y\)mӇ{sR+/`'mR}[F};/z5$X۷<;Sa]ϕZGu9}L%I$I)~ ~HnՁ[^ cMEF ~* $@*>Iߑ=7{lSoz1Ck-"J[9ϏZHsDПSje d3iidgdg(YM$g/=ӫ;umJdМ:`$YNii:YߍwhIH+¨9 mM{$՚g^ë4r 4d͈~/k/v{zgHҐل{Z$i )l{m# ;woK*zB$I7+bT&beмy&=* HUz#xr@;eg1._|:yvW_/֐/`xlMv( ՓMg't`Ǵñc(ѓOmn@f =~5h߁\4cwN݊<`-/3] ^fuEȪlY^$;'$Y=x.9x.z/_{$ITvoU3a{nf Ph̺bLv*@>|6nEEUpF7h>Џfj} P[F7,6+=~IO^%?ZVպ]򂄒yk-lH{&i ٌ$ӳhڣ'm g[4wZwL299rҀV~t2%o_7Hya1X?8s_?F,mXsHoLF3}Z@]Y3y2CgךּZ%ۍ3kW^ĽEI26fJ03().=: ߁cقD ȁ'`#Wpsi3w(?:ݞy3NsOKځ従/狫o[8!xVcvLׯYOFI-J.!'o(A$I$W- HVœ̚9i}4H())/)xөS(,+`g$ J =- 2!-P#]kVT@Z['eo ]˟R9vN~l:lxȂg'^5O`ec{W?μ*>V?y0J3uR c̬ONᨣ8v2^>J/ę^N.1t!n]G\͐3"m~m&L+`qa%09-| <3yTWMWOȬg?|a/ҽE$I$IT6Z ج'MCy%I$I$I$Iex%I$Iex%I$IU~(ͫI$I-eës{u61^3I$I|G,xW*u/Mج!I$I6Z O.V{pH$I$\~ %I$Ij- NcvEWB$I$)̮(dNmjI!ۖ+fzGH$I$E? pVZ B݁qd֚ ӟ$I$I֭[G^^N=>??5kQmƬ̼Z2#׿2S, Y3'?n+_dby <}b P,aռy9Wcj%HT7R$p W=2k$I$I;ߟiӦN6ۏ;SZY5WżvC: |_ys| 1c|v{>A3sHwp#I$Iv yyy[7x:h0a}]+kWV=UdzFYJ?= nd7iÞvӧs3JWtJO`0gj&^p`x$I$Incc֭wzV?~<'tׯ тu~'+-bodݢ/sUpe3juQ.έԬ$I$Iڭl Xקo߾=zFM߾}}]xU|;7}Wlʤ/bxN/ŬJV\{ / Tnf?D S:Ӓ$I$v5jSN9p)lYFR*}6Q *,HZуVG,fWȪDg|iوFu#jN/T{x&VA?9)kSn3̰"PԤ ֍ w{++̓5zM_Q;u<$I$iwִiS&N@lʮU˞\}8Y @l(فЎo̺pοVEŠӠmV~۴y\~XWlT-o:~@$I$  IDATI5շb g/rxO_LeV:3/9ޱ1 Dˋ)+6<2.\IJk(LBZ$I$I //$I$IRh|U^$I$ID}*,^m UA|K$I$IDTH̫  LV[UԒ$I$I8Dcb18X,R6ΰ%^`4yH$I$J,8tkPFnF%DX,fUJ/L&,[7ҤkK$I$ʢJ>^\W)y$h]6q՘ 6qI$IkR3J6Q"sZ-)])%Ӝ6^6LV0v9V$I$IarP(רּlZ3k~k_SϵK$ISǴqZ(ӣ$bE/d %7bdGrzrZƣY{F1'}.:n,34x.>$I$iGW?BE\5N1UYG9:ʾu\A9@y%E^Xv"KJ*8 J&5ȡ9K׳ `Vin=0pZ}Nغya|yp3ӷ~eߑs۲//yIr|uo0y6c:,%a%S`i|_@)4iCw=P{lcQ,ܝYI$IR~6mZ;k}*ƈQIIKDzJdFhs_XʷNM#رk*q9=$[dĨ&^YΔbfz+>Ӧ &qɷ^E Z4'9Gs[9*0} Ƥ#u׾'86gx|EiЮ=:3;n:ӟkbQ=ԕeb҂|J#Vf+^|3V6͇ީYWڟ3BӪgݷry_gr0?s[nφdpk*kёCTh>3&Lf!DZw ?<gDZ8 dӬ%Ч-50+AN.tQY;le_G2ʒǕui_'1( M~⚞mbٱS񛇸ngKɯ繜_uuhzyXkUsctv2뭼l Ͽ^_v$IBƫD*iZ#$[RsSڿUd/5K+g[]T*8arj;[LligΤ3269?tAU*g팯YSuh ^)D2h|ɝU3p꾫㨥=p,{KTv^JY{sK` o1GF/n6}v+GrKmpb((MJ&Ѓc~t&2}_O^re0̿\=.v"F?*θ'{'Z9sAw\qKұrkF"ýz6% de_0k Ym<7 5F^g:7˯$Ijƫoh)ωqd毯$}moͫA~)V~cQ|% 4 |At?jivNڂL][ ׎z^ @/CoJ-fdҰ?~WF#/9E~ҋUg_Hm?{ݍqX2NlˬC{퉛yG?A"{wf-WuMupC]9~l^ "ԫe͸ьm|lL+w?d|!5(o3 ׍m7LalpDZA"Jjo +^ Y~sjx7=x|$I$)LW;)R01Z 87`M\&VHe2yUI; _uqZ%ɟZ>eO3S xsM?sVhJX>{˷Fmn6;XsJ{#۟zƫּJE{W22|_~+]T_<;~.k#q"A ɀ@tJE2Usf|F~;h0# ~oQu1iFqYo2*q2n^qiM[3%G~A qǔA/r?)w$I$)LW;) E 7}8 `p$kAZ#B:nmgͫX5ډ8bk:ǯǾc Q,[?ϤSX4MÛoN`AapBc*kfR XiiFɯu9'\E.>b$?:9AԤ ÷|^Z<ȱu#OsIŬ+ nU[]Dq9zuYzZn ~,XQH֖Ղn^A rTږu3Y_n|ob[{vc?LqS5/f]5j&$#M$I]vV$FWx1? YQ.?2M#xtld,j-&i{P[_֫jz[_CO;j +mq˖sSpŗ9Y4|0\xaE+(oމĂD7mUSF?ؿ>7(`KYPk?'4Z\z.}[[ ]ʥ槙P\]ĺ=hQ/|Q^2(o7j-V=n,o(~?PZ}-` )gxjQ3~ѧ n⹹jPQcZPktaKc lFK0{6w_R߱mߧ/v)fЍ3eUU orcXմ-_{N$IBW?BEZOٝj .,僥E9wc(ge蒽*UӎvKxn ZɅ]2+#9m ^nY23s[Fro^#ԯOvJf^CɠCV/gb_s wɫ` EIy  }0^O>RVdggb!Ws+<콛N:Km6$I$IxeJ ҆sysaZEZ_pI$Iv K$I$)W$I$I -$I$IB+fgWk&I$I~jW:)lWk&I$I~js$o}¬^tɉrV{?R$I$RZ"V;w4H$I$w$I$IRh,^E""`Qa$I$IR,*u憓*)Wt<2$I$IRLX^yx,+3b1s$I$IJE dʪR:*e+oy'7.eԲ49E$$I$I:  jrr36>X,F" /INnRA$I$I^qX,N<4*U+AbDQ %I$IJ^6+I$I^I!I$I:$I$I +$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I xe__I$IȠ~n '=H<^1aT5كjGVF I$I)*YUL8xlY>͚Af=;$I$IR,+YUfٲ7yrs<3$I$IB$~+W8RKJTP$I$)d2jbmr?mP$I$Ie$I$IRh$I$IZ+I$I$J$I$Ie$I$IRh$I$IZ+I$I _W|+I$IP O?c9ٳgWz\ұI|h%IeԢN}89qzd <3'r_OI$IbhCҽ{wzɘ1chٲe]pY1.n|z8/ ҨڵAPȪw$I$iȑ#ٓڎŮ `;o,."poz"~ު xCf,_CiZ=ߛ uf(gʽ%w= ᩡ_8YG55gxJGÕZHL̀?`UQڭ;sYѫi;_)_bNwG6J,I$InUV1nݺqQG1n85jT`ךy֐ bz=q+w\7u 3x,M4$h>ujvVZTA|EX>cȃ1%~|0&HU2F1|SDZq &\Oq&͚Ԥd>+*7

y ^֝9专8c 3Hۓ~7\E(L~G9jiVq~90kW>kgJ:\'Q<xl3xn .i iUCz}c.7t+n孂u| |{Wf`D&3jiDN$ 'RG3}Y|Ì+Zsu@ =yy*2|#K$I;ԩC ㏧GU}`|| %׳jG5s 3jP oց&w.w?wӦ6Y*/'엳?m;.}%|S@h4?.yY ٻiyo^bK>idEŔ6-\YֲJKe3;ãr^?qRrO :kz? ^OF1QN >k{ }J$ITmDQ,#KūL *ӳ>U)-_|{Fͺ| /.h/HY}ffFI~q [ _~˝BrF=0Ö$Ix"@"?8O _}8wrZRK~6$gxp}l߹$I$>CN94i°aêŬ+lE OЄe[,^OHf0qd '3a_=wC}:jIۼ(PDtB.: 1-b -Á{uF)*$@LϾ4:h@w\p w]YW$IԩS9hРAZ vY#Ĝ|Z~|=gQf+'49x| '1śogNOJ>qjv,=2"osbAwq4 3yVe;';|h\+ʔ{Is6 ְ| u%%L3M-Zά "ytw$I$I/>}PNj`]W{!`U,_ Zoǝ lo)|55{!Sb⇐iNO;`IC// x#f|2m8<,zDagU%'4?Sʸ{ﹺtE/OoW^F$נN9~4X$Iܹs9cbԨQ4jԨڍAc +ϛ30nq$I$I[Xp!ݻw`̘14m~ 6-6(I$I={$L,\EA$I$)< wޔ;вej=+I$I .]0|pڶm[%I$IB$O8!$I$IRX$I$IZ+I$I$J$I$Ie$I$IRh$I$IZ+I$I$VUfFE%}%$I$IBd=)?ǫ9_!I$I"+WQ?7'Ǒxհa}.ZKuBIDAT%I$IbE%Yp1 -a)?x =:lY>3Eqqg$I$IRdffP?'Dz"㉇aP 7kLf=C$I$I6(I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)W$I$I -$I$IBx%I$I2^I$I$)dQ$I$IR(EJJ I$I$N`7nh~/GE$I$I8ςUq4$I$I 99"QZ5ɩH$I$)rr]&P5j>:px$I$IJ#FԬ =tIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/path-operation-configuration/image02.png000066400000000000000000002516771461403617600277670ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwxU{B([QPtum"m-k]{W!boT(RF?J $$yz\TX@m6 7xX=K9j@""""uXE-m!KӦMLt7fޞIF9K/TOat8II#=-lOOo޸:qzѶh7k2u_Gv믪DDDDڲw$zmZh;3fb <,C1rdΩiwMzZZiAH23(,,$1!NVm0+;䢗> Nޔ7cFyv\ _2O6xsm/L:et畁X1m#?3?Yuva|Ƅ ɨBWq0sKB=g&m 3^ǟKh53? {2Q҈'@#>fVnj2ۡclH9!xʽyg Zh 3g'v}NI'=- OOϒh(4cNOOKjQfeM{?~\q%GU+Veq%xq?˾~xw`5cx4s㪷ޢa3sYLfsQ{<[!8ޛ6xdu~aM,V PrfqQ̙_Wra1]䟲QJ'KǑ}1kgݦiEP3GsA]i@ƫCE8MA=#Z0$ߓMkXPeB{Wo{&Z}q\zc2^4ȿTXb9V/+z8:Wl۶++tEDDD jpĤd&O_rOp z{{_HK#;+O[qqQ>񖣿\x{CۻG&ڇw^?Ҡ؈;[vkCnto$WfiII3iRyAxR3ZE2a(ኈHx˛|쬣3223ldgWm'"\@B L4"KO_rmL_Ȓ1ϵQls[q|^ K$hu4Ix>VW!2փ[6e y0 cDṆ~>ޙf5mho `μgܼ_e=6-˙os"""""%[ TMG|zy"DDDD/f a`X,MfQάԧ1M[8XVY+>ji6|-šCg-"""fݺnWYSkەGiSL`~~ 2opa?__~A ?.Yz^C x[FzX,x0x@B9zOf⦉7ҧEH.b 70g,'Ѻܥ#U|}=LF 7#7f~U-[ѿk> c+,CпI8,5BZ[O PЊ^;j5λ:}7^wnPcyV49{ߤ5MLږsrU3t$nZk8T>Dn6lÇ?V`g'n2]pqD#L|'}}aaVtO<n/ Q20$gs~ʿ{;`挙D:X hي{'y?_~ɼث7M{O}0z|27$J>9`X$ +D$tI{{-:ՙhc.x'_n$Vj&xH%ŸIv!'XczK'>eEW\UldffkueCT"RoמPԶm[_s~wZKUdx |AQBa'99\q㰶'g)*<Wٮ{%3+ ީ9c'=.~t>xZqW]UW1瓹Zr8,4Lot223VPX(*,Ֆ`??zzg&7hHY}5% #{n|衣eirb<4lTćb*뾙EHUUмVfZuJh;ǂ`K=HTѹӄJ)4nFabb[euAhM掵K -!n{!p{W,=2H 2C0hА3Nj6cFrky]ڷc'Mk.Ɯ|о}q…%.XXu_-aa։{b͖b_YhQ?u KGVU8W{5&{>̞5sThNkKOKN얥L~M/y˳1LKL^aN$F×y˭O_A;- yY:m9F|'m!^7Vz<=kN>n7\Bx=_b e;3KshFNAe>I+x~bi/a%-ذ|e ŗ0uItjjcmِ j߄PK19Yb{nf? aZjŒD<2њ_[v2}o FЕL1c{.a=8U md?o*mae|mL a~3UMqÅ[v2ѿ-C9,-h}.}<+dK)׵aјL w2>-rzoFH7$65sOm`hBqrNu1!^G͟ά3XGf`ӆz'uf#޾ }-8R"Yd9{s\uL[3{Ïf@{+7w1W1Y~y6>)"R Ap0]v?d\㒋/!;'摛K^~^7@hѐ Z8`o9֪jjL"'gyx08aVV܇֯+x}yd&űm+g]B2swgKy7zKx}N㖹{+WSԩSG\v#.JuܩS'EF>'H${BK\[P;nFsNOґ#NZ6)9]d >xwy7 B+V*޴y ^Ǐ>).B8)papwx#ٵi__[Ѿ_`N2qʧ{r,v#_Ԏͽ{rƞZx}ϞOZ7KWg8sI?l]ۖxEGNEMil-$9؀b1u 3XE7Q{x#:e24x[ǯ?O~ }+I.\~#"OC !00{@V\Y#o^rR8p fYWMe6j޴)7o:i'Ȩ׽Zit)w c+ؒ i3k {p v ϖ/IU,).&1_F>|H3Ks1+vr|lР(7GR!,}S/0(&/{þ;Z+7L[6!|"n]@T/FA>Fc=3$=Dk_绰 ,蒑 ޲5vv lO-$XGԟMzs%H>KJ QX$חdrsoO=ȔץeD%l,j΃7,22KH=)c+ZQC3;Ҫԉ+'-z+()؄mSl[ˍTQNNW_UZVuLI %ۚo2pA 1~ѯ)DuLqgbؗf lsZ*(HM7^IiѬVac! ֛j.bxT 59#y77n)LY1[Qߟ;Gp<2-C:?>J7%;^*.[/cSy|zrDҬ 娰왉=';[ AMQZX8]r l2 ])kCLaǬ;3ߤii0#/lCX/F \\qUk\Uߎӿow?,V,mE,XhNhsAj<""QPP䎿%^_}ul`u]O~ܷY}XlPӼw,Gat-M{O>\غ#mOgmsZ.[;t߹Jig%tםLGK팡|6-xGiV:gbxPXPjlɴiۆV-[{S.CLg_YO^0*},)96[W۴nMRrr y%6>blS+0^*WbJ#osï։7ڕWzçW cǬ) 3l(/d{q>yF2n_x|&2$p3;ݥnzmr돈nw.=ٽ+[0mT,3(=9^7LQ`>XV 6s.87Ē 1pX V&[Msŭ,OFD䬳l{~ןÓ~2{'TAM6Jȥv9q6D?@HHHi.4i_߲;IHJM֘Nh؋2['N<+`hSejZ*SiiGD\goMf}I0.;O̺TdnZuFDxi[n[_ nJh71&t؈N̮X@p4Ȉdoޙɤ9Т_e>2Ic4)&+)4 hį?}Z8ÏZxh5-A=us_2F޶|t)kVYdggKEG X$!#T K,$B`h%tR4c:rzڶj;**Wuꫪ^e:y?ɫvp8J<1YayNIFFɩ)Ѵi36mFQqiW9ӃMݗ.;<dXvX,pa&K Zh66l67~~U.?PTq;e* /dlŊXf;e*qe޿@|.)U뭿P @ o\a~-M!s՘1ݵsg.9"f *ٍ|LvO<-džarX0rWaL|rs=i6d(ɫxcD4eYA(o˙* O:fOy~/c#M&!9̵HjGՠl<|rYm/.fRК!^,>ȖB7SWa ?=: =ǐH Y zoOP^\86ɦkQ ,XGO;t'u6 09l[ ?E}ԐG~k#paތ|CCJߟ]Pc=~7{ ^DaWszg0=(&%HfmH3l8C@~Yu@vvIKkuyxIY%`˿n ǻ#`&ax[FIw 2go}8z Fn6i >N{8rzK).m۩.\qը 糰*1:Ke7hU~8?]r- 7M U^d1wc*cDDhӦ i)\s͵ 4͚5kHINuVN[-ee:.5o3,ضYs}7SU븧/.uY{>SOY0 FoŰ-6[wŠӗth1t;}%-[me`2ŬUlNu-x0hk-deg1uʽ5 aEgdK֭:t0Wl'+5MT"[fv&/ zq^yef3C ~պe+&OLs%+'rpE˸tDpw.Mb 3ә6)}un SgPJyjnO7zc*%=!yΓֳq鮦e4̐;0)SQ[fꁛ,iY|p%?6 pJN "Bfn'5F>y$2^WQ\eI̪C쮠_zcd( ;67$o"z^€aWOZ\yÝ~x7D}`ΘؙoKERm޶SoGA+z}Ul:Y&)3j11VeAެY3.Y d)b^^Vٰq#_-/чU rU|,]Nxx SN>_W‹/r@p5A~c}%GVY-r~4хL-R}H׶];6nŋ((<6oDBB$W==<,' T52m A.nފC^~}KfŊgixz;d ֮_϶5R3gdS-X\н;_}-Q( kX-rTX귂Ё~C{~ªLʪm9%oc$o.bLL)0pU ?,"RCǩx&]Gj|G]vS&O»yyy|=c'+'\.Ū)'~!Vi`#;0euc(w\""u0"΢А<#tmݶ_|}ӗyp`U""""RnV*iܸ1ݻt{\B;v?ILLL^8g8yj_ gKaal2c(K͟c ,,\NNӅ7nZmEDDDvdd2a6(Yb20M;L_% DDDDDDDXDDDDDDDXDDDDDDDXDDDDDDN9iՊxΝrk{[wu`QQQQ9c /PFJVz~+]XDDDDDDλ[lQH}qثZ_((#KDDDDDD۷Wz=z;]-"""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""",""""""R,M|b2 I$%_pC0GҴqڷ>ܗ#)y9D-^ ~i٠'~6Z;(Y|3q yyD?DC4k# iTJO~NPv,cD}՝!ܿv6Zk>;$Yv8Q96n?[3Q2\Pg׃ v<Q92YӚzQ%?!#+ˤ׃ ,EDDDN=rq|3S6lѳI>䓺g.g_>5)`Q%cry&RLN\$˗b{f|`9w2âO4ͻP.i58Ԝl<%;l',mиWQlts.cgH{ޠ ,^pfͲ ە1" eG,)Sֻӎ(""""uZ|{~F0Cƍ`` ?l1De 6[.mG9{u)w\Iӯ06rx&ݪ׎OS,.> ʼ/{^ .j"!g'F8dlϗo-\"F;:F4*sm e k/;\…^fTnSc.9>A-0`N Яc {tQDDDD:wsig>g[q? F {=Rkb!A(aZС@5.~F޿`lyWa2!ep5BpO'o$ѻ\N׮]"6E x`cnЍS4c@`cy^Kno,wNlzl!5z*.i6yӦv!};cH #r:x'|;2>䀫t`Z{ nШÌaxmfӿf dM>K߅f~P(SaWX:E-uDΕ|c>ZUa3gcM'ߒ!_4rҒں]߿FJ #4#>à ҒLE$d+!'nK{IvOnGP8VH,p${U܇2]Gia@BV< |=n `|\0ӾSIǶ3ǵ kԎP pE>ueb]żәwY'y<),""""R:A0WjW;{YG[ɚ1,mɞAs޻Q<#x쀁l'`XWtU~{|8 JۅQ2j r\-Vo%U6Xওos,oёAAP5;s 8h KwG"tIEbr_Ɏc]?] ۾Y[8eEDDDDXk:8ygneAi?枏[ MEvWY5BlP.9tcmx mLGNn=[7o-m]i1^ׄWTb`n :x+YfsN鉵 qYVdcd°\Plp_ծw]Nb|b}Oq0p|1]i c<,<Zw1E3Z+?OI&V+8;.w_#ȡ/]iaZ>^GK%x%bPIt<76 gؗq⋫(=q߲'[LHy_NJ W[v=4wDeKZ""""" U`ѪQyda^lYXUNo=\fWC'޼>\aTsk٢YZH!#v+ƺ2abǷk+h3#N)iӒFC_8M ` _m0g5(`Iw"4>q4rHJ):m2glZ>V?3`l:@֏l-tG8cɑ89%m"C'B^$#7;sTu@wUV?7vzl,i@bb7b"N 6]w7~  l4^ IDATyܽss2ŤG4[n^Mm[L".ܫ%cMY6 jiR~%f7jMe ؿ5䓘Cv@'ME1 eYDDDDD"Hg0vR-B=7;S8s AO1}տ>\L>lI(r[| dV͞{1F.(8?)ٚvg7<.D^;!V@L9$ݿAݚU&1)S2m|v($nJf8ׄ6uKtMptgSr9I] Xqm;IٷE7qԫYz cK9~pQx9>8s \^jdqSRۿM<ٖ[KkE=owpdXr4#Ilu李w{j^Ͷ7qu;ī@<؜˯co21-\ nM7oE X|JgW뎴t3ު2sK̷qrׅ+wvq-7nЃ>VWsz aq;΅şQg8ﳲ=gܙ1|5 x-7f@LZeyiXWwg{lcK,)Ăp<(XǼ wm4""""|1|ŘS¯ӭ2b@*xı矘/xT7SkoބkS/+6fÚ5lJ>#?\AE|rF]{L;~r`j۝DE"a欍-uZ71A=Cό'3=DkUwX0g%;TiƠr!zR?4_[RݠLz\c;okߦ%fKVb+xS#[-ށ55GTܣTWUEDDDD(8t+~'KuX#Sdum~)^d efxJuO Enj䦻nbǼ?*.F=$ob#Ӿdn YӉ19Q _nW뼞MԩssXy4W z}N]Ss$z0{ B*3X?JP|9uD6呯r_-+T+iJBȒ*!"jZ]z̍^v?79eӻAMK&[XN\C>êO 3j5;#OTa7ơG9t1G7իQZ5OSr6{瑐;1[ώr[MfBCЂJDDDD50l9fvK/V9?Eo)ld{9vhf'rDDDDDDsIg݊ݥ¨ 3aw>zzrslѬkͺ-\N쮝Z8{H)%{3_oȠwJJ $_MY= ϞSuKeM? yhy[^w" :̜9  U1qWc )E+9Ȃ? sJ-[_ 1*"+9#"""""˷P&xj^>7Gӹ7yG~1 Pߘnw궟xqfC#ӂFzD6FR0ni՚+T',+S8}K7ǔ!ݒN'@Jm⁧8ܮ.\Rg\v~/iB}.WP}VLh9{,_QԿ7MVN)պkNMxNh7AM-H*;&ɓxiW`P<=o]{a ѪJu[#"""""~3n[~6Eq$)73!mݑa\KK7cDI$n#*ڈ?+m_s#ۗ,d:xidۋr3{RZuԙ~W>7su14{DxiZ .͜M)8\ݾ9]N-0TN[ գ;"""""r1ew8th{PH ֭[˽OhݺMի]]EDDDDDDNP````````Q,y,}am\.""""""bfTMt6&s9pId@N\cV`M -+GlMs$H+`gï_@@P_w)'cne%@Y k~$Fo%VS>>FG[lεs ˉu.Ϗa|UR'v2g~"%f{T44A$ېC<`Z[0$o Xmˆ! 7 9O*@C tj㋅DՙׇLr, c۝#: },ۚ{6yL2AgXW@XpG$, rR[_ P3֝E (;j1R2xjWc3pp@11ip$oʶ\=""""""W.dmNaHcZET;,w3“lru_ hc1f:6$`GqD:XD$ۇw3iieWSœ= zJg9j5ƒ$ʹ0721'}Lz޴,,'=v|n$8tG tv+f7B\?J2  RbوER'6%quI&|WիS$F +ުD' [ IpȚ~՟JY44=Ѭa2e,;#ȓV#' ~֢wa N2YXjf=q]g`j44p:Ό='/pPEIň/#Ky syd;8 BAHkO]Eb( t10@tB,~N#( pѺ٬D:Dqwh xY3 'ω,d<<]vvd[ң6+Ս&L6~ܖ˼,"iW6QW\$tۉ+ƅlc n4@6X<̠56mfw @ʼȨ)1g*n%ݝH)YZJ-LaJwfzw .;oŊT2k=iV"Ć㊅I< o^ w~8—@=ȅcիtq!b41~ yeh]S%os{s g)cz$'22^Dݺuki޼9[)^Vz0 Av I)"""""RQ)c<#fRuTPK39U`˪l/n},Thj````````QQQQQQQQQ`````````QQQQQQQQQ`````````QQQQQQQQQ`````````O1_VW- l}Am,[WXYv3+y|ң2\^K??M7=""""""|!lw"DjFDDDDDDru[ߘ^ބۭP-ywC\'"""""\> pU*lY-AAwMDDDDD,l>Y-nX9SLDDDDD/\-̛·Wh:_B7㺻`Y/F|2>\^~TՔo֫qb/]+J6vC=q71_#BJd x~)(4cX;uf4^—o~Mp]E今yn+paы2t (//,IIIx{{,K8?oe]L:v0fc%>4vd`=㾣^db3=7#;VՋpͤSyY:ax^!6H9e?Ǎ.ఞ3)Ä hٲ%;w<}wI-xTevT*zY^Ա-ldAgϘ6v:V6bNڬxzu?wbp5Ƀ瓷868 Cg#]{b7熯"Չ6^}I/*netS-""""RQ=ӭ[7lRlBnPE%llɐ['⽲MM w>˴wu雋ñ簇׹fч>{"G!up~D֠q?^F蘅Uը~a:ת)]xoΑw2|Z٘<6@IH ?›7o r,].]гgO,X@-~{Ipp0 ,rʪ.ٴ;cnt.7tŴolsE*Npeی&_sp?9},4GAeP5  +-t79EpppEYy2ۊ+6v#Oyt{mQörJ\Gw8p f`BCCUQ%4 N$NLh5h52ؙp"ٞWtP ]F7eg99'IV)1'k3/\@ TO`C(jzܰ9%c6=RUҪjQ{1Λb$f4&͐b? Kf&=~CqMm_="""""`޸i~xI6j0t:*&2'&L8vuFAVP>rZX\E'&qE+ m?:7~wR#zDDDDDD*i,K?_y=F_L&%/(kۙ+|B^¯H*-i[aۋpR>p8~Εj:Ug^F `҂ Tp,-ȸd[/j7+jy|EvNU`Mt eD+7{BDDDDDD\{7&]v;ٝvB1U!"""""R!U.?dݹ螉ߐ(ݹ螉xۮ~3Х `t#V̗M5:{ํ"""""ܤ#-J-̖ .0rX}=Hk5'.4DHÏ)m£?8z~{myVgSװX2Y5ӐԬ2W,Ӈf{c g|B@ELސH~>z:8wyL-1dၟew@H 9ț3w2YVg WFwxџOac.8`>`7Oی/3=ML[$"""" |,ḃBsc.lIXc߱a&zCTr|,ݿm(=iXFIK8Hg8~ل/ҢX]m5Ǭ[2?Jc[i,aq3ՏpX'1}WQ07cGxxS宜Ƅ)9/CdtZbꎷ 9L{]n|^zr CLM>13"rS$)S>6Lɬ~NnAL MÏO=qJ}522U8(? ;)"7,DƧGN$G eM?P嗹#܄qdFHe7N/xxOyNgjz:?{e))^? a?qN}N¼\}0k -S8[TW@o[/џ*9QUpN Y_OKQ0~b\xViox8&~ۻq c M=qYUKkgW5KR_i *ߛv7t8KfXNO'uig:7Xo#e2>9-n?He"E+5{ڰbJ<1 U]_pgFKT wxs}X 8=\6S̟ [>C% @u/J׸T{u^k[ۿ%0GQ+qO 79W tlBJ[ mFfH=[n->͛7ucԨ^MX.N61|ѕw?o͉{),f_~,J0E -P_PUs醋T)"""""" """"""" """"""" \Mw{&""""" >a;3*(``Qf<SX};}CQ U(+u`KDDDDDDEDDDDDDEDDDDDDEDDDDDD* 1Vȶ)""""""rfӝ.Ku`QQQQQQQQ`````````QQQQQQQQQ``` r]9/–+C! \)ц_o=Uc% ~qۗ߭t}u-|9_oLb>+w!1J!ToՕAû$d|I֕/j (* +ri֣~+>anhe*YO.'K92%_l<û2 [DQ-|Usa U@O#`6NumyfݴˏgGj?fj6纇ӷGeZGet2->D\ُA7k?'.Ÿvr4)Gk!\e8gj2lvxz|2w%e d ;DJ&ͻ6ÞL̯{4z mX֘eO1amOhv'e`kЗQwt(4 yAzG͇s()uS75 z yi A=Cي_zI-Yt8Boݪa 5=3w(E lqɊx Wd=ۘ[?'@B|.^%noA՜|ʍѳ nt;/Vw+k&LfI*fwsƾg̘:/Nq_[-F^;-͟b#ho&/>r2`ly|Li%_>r[[so*w;^.KSe8&M}ֽL~z+}7:XY3y>Oy4g{o{B<Ķ6l?Fp8H7'5^%O 2}K8?iA2LNؙ>1oub˧XYѓXQ&&&?Š%SlEҡ9p4 Љ:ta&O_2LEDDDD0?N!Ƶ.`'Vb_ӅB6 ALFϧo.3ˉ*3{ٕR^]Xy2rwAR!;"Iiց-.]v=7ɌjLg/twǰ|]cƖ1řʕ cG2Q &hbX>o 6lvsx\ %rbZm$B=Bm;Xܗ4iqwPJ`m| m%fEw_j5d:8תNHCgRѿ Ɵ/O Mۯs}/eeh[n=&A:S*Zt#j<<ՠə_iW7bq,u!7̠~l 4j"1qiz_;pƣěqd*E= 5pu͙F1uТ`( >|4K̷30gY+HѳP1B!Bg]̓[O\f9QdP4OŒTM W+lwDrmYAi -'۞Isc?lBwn?=]j3ޮjut'gSˉʗ]z4dϳDV8{sdvȵ^F4.9f)/xu)B!E[M|xw9'*Pث4g# =z7ߪp\RHJmV$>zWֵ+2q(9TwThL9"2_M!BIˇw|3b%ۏh.A3dW./睂m\:7"ɀiBFfȚ#G$q@ƕ,r -ɂFIH$MWVu܈Z c3PHږ 黈GT[Ud̹+ٕ.1gV6)Oܮ'' bܪRr**Vrl(]ӽ IDATV f:Z#`]\6X lzLнOPR `qK..N:)uU~j772co?6#1 6B!?JL2u*} X;3#7c6e.}[K9^ SU@Ui-#u> }?;M9gZ]*Ϥ␡|R!oǽzo } yC}c3Aɩc4>Ɯ>_0iT-ϝɔ`零$5]x8Y)CWJ|J~D.`{I]ާЕiѝQjS }7_y .6,)B!S,?+5͘L& 4ܢrf !B!JuEG`eTĉ.cy߽-S_,B!BG`!B! !B! !B! !B! !B! !B! !B! !B! !B!X!B!X!B!X!B!X!B!X!B!X!B!X!B!X!B!XO'zeGZc`qXuӌBw?;sdM !B!$άTW(:yXr(C-B!}x9l/$z[`: rţ"~}3rw{~K^|Z |V Gg3 ɜ[̂p5z4^Sew(Pn\E`H7Tjt֋V(j<<,0ւZ.&pL6CQ:E@La$p˄q>+5ea@/ i09ĢYq8]E>|97U39}WJa@bIxubP ?Pςߢt$Eb̔ۍ~7É=g#x<\ROĺ+(FP4eh=n\1˦ q$9Tā&>SWO# b|v {-̚GOnF,gU8?p177}8~U|QCX1sxNal:|kq:Ǎg9;Syr6]HE{n[% !B$+U ZI~]5.Vf츁uO/1|`tQ5Mr׶S^+fAeM͖ͨ{Xᤷ@(Z-@C^A bA!|9svXHOÒh-%1l Ldź9ł9(-^Gp#; j11+4ގA"azۏ`eH #*=m5;rkc.qi?>;.U%|9=rg4?tGg!&9Yoptw\: rif_ebH Ajw,tΒg,A0em> UxG d7pf-oR^Q"F̆@ȗr4_'ӿb9|Z2W9_n3ՓNfnxk7TN2| tX6fLbjso6_e.=CfB!(@C?Cz J߆~֢ATPG"݂q~o|E1s#Q[[xP[kЊmߊO$*ҶK՜qD(TћoEŞUdI$ڏ|qLJTuv0'L*֙HzE\{#ƯVʾ%Hǝ<ږXf~5Y}b%Kz5-Zԝ"EeXEOU(dfoI/f\8űԢكp̯̚;da0cU8΀zF!;шtj.iO<`$~|>Z;)Oj5iKW"YRkp)͉a(:6NgH;Etd(]tRMx'9wu(~g֝t|{ 4]R\`rw^h༃`zxJI‘IƲ*}|֞M/!Bgߠo{~+-?gܹ0/W{\ xז%VŹtXgԪLzO6oƐ^ 1 %xeܱǹcsNVGaD bg|:5syF>|05 sXֳhnDI5U2ótпRٵ _Lj"8f[dq`p(7dL@)u]+f.Ηō¯ugKL?-ӆѶt-go`[;z܆G‰Q,)e֔2t6^)왶mIft[}C!B V,]KB\lƿA3PEkIuE"!T {d: YJ&ћ m_vGz[up=&,c-3?6rOwtNbء gs4/?4m%c &k,[S[ֲ)҄J hk$Y>c1)84hmg^/a'ػ{fM|wSsCBg~ DV>ю>x^~i9Z:~ަҕr<{##1[wyWHwEݳeMxWfx98nhi<Pɿٿ"Ҥbs'! J*V1;H Z :cC+O!B! d7Smˬ:C޽*0f]P/3q=H=!&b^Q{z kfxHY^҃.V6ɧYkC*M5 Jr@m]ُ61#%}khV:M;&е8K]K3|mngdRټ0I֧qI?:bSVI{CsA,r+ejyL#{ٟ e'T˨VS-[3ap(P??<{L2ZG6l_cz7cH2p8Ա|A4;çUl.[W]E:so{|W4yHH67/D+gI7J!B! 5ˬr92EJf3& ! ܬCFob'$vfԖ]Eާ-0MӒªkD{Fry>4T؃m $_ܥ{8oĪGu+t8ݵR#X[4Mm 'A*5co78+fō K XٓR_ͶlZ5a{_8>97Wܮ)>sa*C¸ؠzT˰^4*3m_gLTIl8B!Bg"rU Z p$dZ*(61 B;kh_*j ߌ_Ė>jk*]sOo0!L?Ɯi?r *{v5EkX3V0e=G2$kMYc]8Cm9.4i)w}.P2$E*櫯2am NʩB!BH={vӿ-mJR)ĝZi~y/i]8Blle_]+mOԬM+aw.C7͘uŨQ,hG43 t~͊ iŞl#.q|Xj8j,fٺ4y ̰cy5]9K<\4029w*̺r45!B!x:X6ٌ:OTCY^KMƨXK(J<~*!Q%YMLC!/{ PJu$" ֡bGaKJj'Y#缯L8R1LXnvlj'G*$ѝ]6}ߨRJ^vw9!B!$HcnʌvJF w˘ݜq޴NJsܩXQyXW[ͺmRܰu{-)mN3 SL! `Ȧ[W!{}~\IuNijLΗ,F!BLd 3ٻ+K{V؍>qymf9N袭eeVÿ5{7 B1k&lp󫃗u:vjR+NZ(p Ώ`!B!3gߠo{_z|Yљ8vdxR|˨'?Y˄Y|Rk|2܈D%}M B&=it{gMbL _gW= yPY5J乚W=1C)IS(&,kÏH7cH2p7|#nDZHeZ.C9!B!S,?+5͘L& 4ܢrfTuau( =ʇI!B;+I(FՋT|'N(p}lRZ!B!$B!B!AfLߏJXB!BYB!B! xq w͑rn |g Xgguia2̹K=9enLO?U7(qq/&.zW? d>\cp{\ ;4O#|^g*3{|LYRHШ>g !BHߡZ7_3Ō]J8r69%f*BF EאCD):hj4>>I!{%C")b9̬g/B!=7 Dz!cLFu`fX}œp)YŮFM$ ke4VѬKV4bƂ(_c~J6|~Y9Wn i__3I2}lo˸lGCUNH+pEpFA}-5ea@/ i09gysn,-fr À:~țWĔ~ W1aaN`I)m[I0١LLVM lBYBuL[yج,2"۟N5*#\O\ \R\b8%3n6p8cQx.dyX"`796A#XƦj˧2v>v 쎭gsHz>%b}B/\%k>FW3~:F,_7&GKB6Foưu1GL!(d>!cQj8vLL E[?d:3c_}ǡ[d9U97oӼ gkkV{Os!|oj#_yAXԨj P zdglr3r&pkJtezH Kz f&?39bX0ycִv~?곔볹 321$uvtB!a p }L聰RT1*d#`ńjJ%F{?0!ݫ`c#7*;Tћp4287q, Փ>?:)#uh:fI4bWPvK%jE9f2.j) ?ɨbd9]ߙl0uxO3Oy 0)8>[qjƇ17ޟ1ƿ,2`_Qܗ$cP1I*2<ܱx:&-cyvfNm?χC!5$bnJݶ1(]=i]%PZ'U`G Gihh6CM^'lpkՇOTՇ3+P}818SW0 2&| !B`J@@eVu"_xfɄ[Zn!#!֙g\Bȥ2'o%B! 'WP+z=+8'N~~uVL)-*w@ͼv~!gUw B!G-BLk(/f N3ܬ*B!$BKU85%B!M@ !B!X8ûH쿪O i\ukOX.y|v:|.m84}^x5O#ZOI dNNͻ3.4#sdM }B!B`" 5C|濬_r'E}zNbCߚ{af=ă?餿փQ<z^]8/_ht?B!/{Ib eCǘ4Ͱ69R]Y?:K(j,&t5IV— kdh6pݽEocӼ'>r9r1+ go'*v3d4arF6qf}tփ0ʁA싻C3H86V;c Mu7`QDN^,umtJewIEHⒹV7'GG&ae6T8+fō K XٓR_ͶljI:%g,gӅTT.oUp/>v3h9 lz$OH\Do2rX jW0}NpnFp똶09Ro>U<w ξY=bZm7GG ᇊ)|nW)ǽAUMzNbr)I׋qzJ=0sdd{}n_5]cz;ӑ%Wal Pȿ zM+lʬϜi)xyؠ3qct!$t}`&kR뮤AҔǼF5OLcyw[>:q8==Ңj&JZ : C7;O|NLГB!Ŀ#[Bzn,Ҙ 3}!bjvcڤ|5Kv dlYżЛXwdhrZЅoeΦdSf ,L|xRLc1o+?%(d>qDjkj2/a3`4Ndן|61[ך6 ghԻp(@_e.=CfK~QoMo`F'VaQ4QH#t:̩o'j0u1GL!(d>!cQh5 Wp?UKdq삙)c<~f0szPP8] dUPo^r#Nɽ/T&ӧ3׆3XS+CY?V0#4Р9Dž#x_W ݹKк9/ueif_ebH AayZw18״͝R*>?eT93nJ!B`qa p }L聰n*U YŨHF7q1!Rɧ6ŭO;z -F&oҫ~{IHZwYWu>*Ei5o.[ޱZTN81Nts^|ٶ+ά@WYؐQ? Ms4 *Ԭ*NqPM\-%= K\9FfpNE=&^jGa ۱2jqt|e5=(uu$))EƑh;j5*mNbyL.v3P9C5͕D%|Zxu ⊇m#X|AbO컔HceZ?3<3 Bh %޻T Al)> *TM UEQj轄I %!u7~$4AEy$;휙u9gtYckRӒ.4Ǯ2{~UAk1&ڻ5wX=~~}iVrY9 טx?$:x]Hu.c~6oO|\gx̞9裸#.Mld|+6ۯZ """" rW;R>Jb0&ؼl9Hl/] 8QD͚簰YIB|4>yvy`?ng ɷjq0'ڳdszQ!g⁗$ W$ld7[F$q-:In%=)Tp'>sz`vY d@!xm.q«3cU??C2egfa\xpXzR7cX3/e[IOt^- qf&Ndn ZF¸#xo^$b^=r  1C?w@tDDDDP7<խy@[t݆5gIJb)N[~`Opt*+%y㗳a&褔eӥ^yxw_eynKivo:J̯+<<c%r:IK1{巾ďar:q-IC,H=zok͌r$`d W+Hڏpı8+T?g8`bĞU *VÛ 86.bKj4 V6/C@m3OE<ċ HLL ?)Um?S2HHvwR?82?S""""P Pfٕ0*gg -o.?ɉ2'䳩ۨr SeT Kߑ'2{G L6qϞU6 c;>QS էS|޵?_gm9Io/&߇PgKԦcbRa:C Q쭵*95o3{+YRMW)}-8SƬo3ENJVƹ I˼fs|hރ&B0ph_kQm[c\b_3*ZU w/"iOsd֍GE6ņөSEDDD?ēb+P-64ŁdlES4ɛ'^3WE:=W߆͏{Γxq=ӡZnpxث^mLeA@X: z!YƯ6XZ)j`c6a.qDƮ8, PV#y0 ΞQY΅μ|| 3\ZClMέ >~ N^$ٞB͟`ȳɽc]Nk3r j x6gKۃ!VvSO`%͞c`" M|7=&'%V(yrlhُC8>?V qaK5q˶r0ց[@yWNk<>S#,Ԛ7|J$߿3Ϻ+vQ|1e Sږ™Ul(Tftd-C&$|؇WkqrGw 7_<if69}/?nghC͌ym +\Gø>ʠC%ktn k>Iݬf2;~MjfX~L~wv>Edr\wI6˯¯k[ϵQ.'Gm"6V;gi+aEU%)(PBqg^H&*±%:q}\ Frʌ|2CU&eYȽm%p2O۰$[S$;[="S[>9t؍N5bD7|9;>GJA|~W4Ykzƭ9C-zA[_6p} BjԠ^ Ģw("g6;$a= Y8lFq rdn7?þtUυ?&jaŧ`5ElG[BlXpyح\bf,9ӷ/G'[nZJ avuHJӯr)$41oڄgoZo/29oV,Ț}[3S6>Ø<8+ژ)٨:ˆ_v.YBR'_/(.Hw^zCD債P6 s\@ o16*N>W Nm8(Q"?IDo?EOoq 9CfyPu;Ϻ7B'9F5h gԋ߲e}$scADDDDcAŌۼ)-ڑF9,VR nƕ = ͸]d6 nv2t{Nʅa?anBs~iMP( }+ϋ8%<~Ef7).@ry"*.gAf,'׮dGjz=5~R&}hڐG2Hb/enB\WސzmK@VwZՏbE|nsAXNJaGέil!a>~EDDD20z|&!~}6!&qzTn ,WRZK ()әR#y.wÿfvDʟ^g& } u8~2%s[9*MXl; /  Ko9|6->%AS;viʖ- @JU?_({[DDDDDkcx[VO>VEDDDDwJëz """""@1wPXDDDDDD.-"""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""",""""""|wf4~fO e3:|jlm,|^{(XOgSwz BDDDDDHiW93ia^,qO7y9pT# Ɂusug4 [Xh/M(ݘ60cD=Dt=w~jvI>?u1]crƎY㗈Rz lD1Ih|t~X8'Mrg1q%Gcpk7Sf`ĉ3OOңv('NoiN{)0v*SӊW- x`ߑWQN\AEh~45bAE+؀g"""""rO'MOq]-G5fB2l1;qv sb3xL:z2tJ) 2>㣆05p-xKU<籣ܳ\8&xۨ˴5 ! gҔٻ Hi ͿL7G0o<#Gّtrtx%N}}̈3E9s/Λ.2)ltft7̳^gď C| ~gkq$""""" .$N49 gE|(힪BnAO(-;U"x&+\Fnt(SCHں#diҋI"O֭JԳ:LiKbx{2 ehFu/C-$ Kr"n.K4 0J$ !HO\n9Aۗ"UvuxxpKu|J[0@Vԋ HÿA+מFB H绷kHDDDDD%Y?u6U@K<E6 3 !k/κ $a9,Ge$8L HLuտ\ܸ_mf%GF0Mǭuw| v{fӶy18So\^@p%S6f;{ 93f՟n#yjK^ʕ,FW&u#"""""ndt_MF`7l7p60Hd#P>~RhqjXQ0Cq?DK:͂n? +.[05>o?vosplVo`טѰ/{Q+ыL#:}ZSdLMgh9.HµDv:NXN_p];.:l9ne5ƴCG8i;a: #'b5 rDFN<`zfA/$" $Z>āU1VNC(3jB3o§s!3M݀hX#|5g3*ԥ׭Sv6qabμgP/Y-A r|#ۚ ~-[ Ass qwC>~kZU_2ayAⶥxn$fSOH%ɽ8*pd|~99xwDz[얺ϾH:̌q8T;JCYi!txcb$}YS7:|!>:D+^[n炘A~d*abL a/QWrUmA߳'yS3b!/OL|5:90}XB PxIi=iE^=4Sft7;ݽOn1cyq%.AeJ;:DDDDDg4mLs=rw}. IbbGp̓Eay9'"""""8_^^l6,ߩ8.>unǎ=Mٲ# WtmHB.""""""`SUEpkbA->XDDDDDDj````````QQQQQQ*ו-[oC-""""""@'ZMTM7 LSXDDDDD~`9N/rؽ#\wvyN$"""""r_`׵,W PݟEDDDDD``````_DDDDNl+_*r?3 +DXDDDDpu\[ZHtIU0"0BBrӱc[TbQ@ k֬Fr!_Irr2?`͚u\.ƸZEDDDo`ɗ_.jJtܑ<*XT 73TZݮVLj;OG~E%y>}ө``q8]9IOOW(ȝb&K-L"2,+z]ɲ1_ EDDDD@K+鞥``ҳ0DDDDDDX}y;# Wu8pl=p?u$؟Kþ--̓ii,Az.o*sӰtҿiP; U!W)3gc-;}gl{UY@R6vT8uwpds[ϼp;*<3CeF.3HCI/$X.H+0?qIW X| ;}4:X( Zz >FDD:W;-F&Y6L(94Y;iOp,wyD-5o3./9VCϧiq\03k̪?>Spȉ[f8 g>S{g YY9=0'=p3CxnGOE# KIȃ*-o9ZB;&kJtIQކ=ڏ4?(y;:a=ETI"rGAD?ė h$.{wȗ.9u{v; SJȖ?ܡ8y]}ߙvG ?:w^+ """pD'ygLLquS;Ts×<3`P{] Ǒ1/X.5S/?[ùF~`9v };(TUfbق<;<0HIv+cpyz[o@uP:0uX^-z$^ .P#ܔ03an߸{\.rC'Q%߭ G(ߎh!f͇OC`Xyыpr絬E\;oȜW\ {ޫd3`vEC`i |{Dʁl췬9eÇ\UѿWs{[ȲfXͥ]lldJQb [틓=Yj<~:@e6#2ܼ f"Ƨs06tmի>%cU8ud?yK֥se0}3>_ɞ87cHQﰃ}ֽ? !yPP!6yb67bϼ[]`4^-C :m\"7pـtm,>W'PtЃ59DzAjFѵV0~Vm|m"UZ7Z3oƁicNbo 9uOȔart:Ih$3wY.O/~$2.ݽ(M -qەɤE?Nnx 8-nFAjqҊyV9I f,4x}(cF*V>eqЦ*]1; ɩ:EDDє=2QY(ݭ/U/kⶌ.˚oY}Rz=3F$6'Ô|/U!=ro}=Qky'sJ>҉Ųpld=q1dNN=M(z3\:9ue;&VZ<͈7߮fȻ0?"W̴׆1D:`j:Wc!VSZ!@8MZMHXҼrP wƙo:s}ѯZ WLߤ B~DxR1fS0nn5;~s24_*gOkG ,YBm;wM͝;֭ZtR]n%bL#%OVnp[=KN\-/;ʫ[~b^êX 6g 1\JYzᏖ> -VK׸%&-g,4ć'pN}&C` "i<:`)8l[^%x3Gg`?~㴗[he1wmNFɽ[vF|zd۶&Pvs85^sՂ2/m櫁kK)ǎ|ev]n\B; ]t>T  Ҡb>eSaTV=D4e ؁ |0(tz'G%c8#ϓOӶ>ld,acݳ۵0YБ߲-hL >uQ:-޹kH VjΩ|ebmA|)kRL=ս5=bx|!f~͓ xb{ȝݦ~dasQ_8|Vn5LFgI E3_A鞃x̋δm\6sFɾ~q mec<,[>}uVy޽;&L`РAhт>}UE.ph]_n|ڷ!mϞҲ;þhgc8oZx>Kn?2+עœ}l7G%g┯Ӏ%Զf X `+H>^% ~'1Rl$&ɹsS,#O/ r.p9RlNb 6*# \Y̬ -- ,`u$r}<!#ی *&x#eP.7{A=;DEbb%o؇0=ٷke82NJD?B\:WC ][ ,'řxK-bM϶f9 \zE#(Iޕy{A=q ѱ;'#]TI&/tCduKrbq\7CkN|<9e?-{w7xW?^?\Z^1o\u20͊9e^q?$N{u lqt9}']GvBb#'3Ţ!o)8X"iP|!8/m#hǮmc$;m=Cn~S:ilgxÑ|5UXH߾-F0%rc1ϲ)293Ʊ%L<(?vjejՊVZ1gV n.#/?K\XY*ԧyL >(L-2q|7rVFmG,iwE.0в!|^/8e7fp^ NG\1mIrV8/ q_1#{C궫t; 3|h В4S&ؚΗ1 6_/>ӫ="7%}Xk/ޜ[9?n5IkC XFrw Kcڣ.Džu d#gD>\Z2nbF޳ZS-EL:ڗ~]l/Oˑ,v=ϊ\NâoaU>UFЭ҄;˶4pH3Ii2~u'O3c>xcxovY _5?e[0JWzhl~fҊX*hO)y;$+5,݄jѡf_1^(Uߧ^bddwcכv|3f޼v³}yȵG0?:V&o2%3dupC ggm4&]CIvϘ*r[Hpf󵓺לϚH iUНEsh^Vǧ<O\"%('o_;䉾 __ȱXg&|Z B[gfr'Og8Șm(q$iӦf葌"#B]."g~pf[1BԷÜ7 NHέ#HDDDHKKre4Kλ#3{o`Ʊ |p̟cG3σqq>ˆ4yw5\Df-`)ܱ錷7v+.>/O[R:mIXY8)*ӷa.?,u ||z@D$`-q;~c婗ˈӒ#nEy0e)ӟ;w|C/"""0o3Ïg* JOW``d* ѕc1) """"ra1 `yDEP N0svƣȲbX C^ADDDDosssazL8 7afȿQ EDDDN1 Fq:qbcIMupDavxZTZͦ``ϏڵjR|YRSSIOOWpww_??``b%K!==epDbffaXEDDDn`ݎf4Ec+DXDDDD‰NE^ ?b}i4=+NDDDDDdV,άf vww6=- X,3`ժ=JDDDDDwtTއgBfI)P* "`A_b,Xk*QJ (MQz5I2 རki}w>>|@ =$IJ 7H $Iw$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IXXI$I`I$I4_Î.a%O0% },礓v䙫_fx ys)|b5Uqٌ!='>7 }y6+빭~Cےϸ$zN)I$s՛secz!HAh]+?;ΦCǰdBŔ٩ DW2OYq=k]8.=Ӈ?x I$ hyzp{;c<^?§oG&H>J;?Z OD`*ǝ3C˺U(3ns2ϺZ bT;nωIft>k2Rs[ O5)4kgD2-ӊwxә,Ob:tsٶ~1v}~"nq`A~79B_=<)Y\@B.?UW8u ^x;6Eb;Lֆ6w^H":w̼ڄdO8Ob(m);VO"+T`u[h\S)I;LZ&#K(I$騐Ғؼqsu\P.oƏ I;)|\Q6I ]{/^W7䨍@,`B'2餋AR=P+9h(U.̕59~qxb83҅B&9K=QLG {Td{Xdēi+(WC. fê8:< <چ!v y'xu`;iy^h0C7gW@$I:J踾2{Oޏoy\9.ږF#+ νgA01])Tco VD.9.5]icX[5g7ɦy#1lwdq{Wq!q tq W:ԥBBk߰ P]W'`̏C9'ΜҘݺ{ʖLL ot|̔MY9`wLߘEb=*qsagZ=PS}G07B2UitҤ30JS-C4}YBd6q^BU*P*-@NH Vُ9ŁR(1_% 8dr"+s\,ܑ %-I$.뙥`Qj*6]/"1g563Nߋ5H&3FV@( PpP$!9|`%$! .5n!-5L0e d/n#뀚?rz@3yfbfg6,ح ;|$1%3sP[1ےI>I H[BqŨ~s!d$}9I|v'>ahBۡPsh~ ̢صsuŅ ?IxD^kӢ@ *# I$s5h93pL+Ǹw:~3^{Ni5.WkwHbgz= IH  Uҗؽ-J¿ph45!=>whAM=ǧ3K.7$ٞkт$imo' ?-gҊM R%ߗSyqe HMI2PȓT?7A ( 3+]GOcYxj1ѵ|p ,o$Its?C&2Q?7r6bwc@ߩlw1=ՑFfoED"ڴ&&kX>W'~~Ù5أ(j^BULr%ɛ3xeUH7oк"pپÆ0!)PZפ΃=D%ݸ)'0lb rثݤFR_O`VraG%IF~ ɼ_C|Ri F)GLn8{~@e͘w*=*_EOxzz+B߹'@go _L健?Lr??}`&t!LVz+7e<:G3YפKN[sh|AXc8MLޛhө550DIy3JR8R]=.;3\XӬdEԅk9]X͋wH,'W?D= ^:};u&]t/ dh{a{n)\g\5m+/2u$IRh۶m43;+Xx_l"ii]1uUEBk}.+Ogzu $I"%ͶJO0$&HJ޵밗mРvc㰗$I$`$I$b-/سY,I$`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I:|ʜfkPDرm%AtZoy]@ٞl6wݛ}hUkBy>{LsoNٯs#Hb5IBԠ4q+'+\\}\1vJ3xgi)I$-I4A}RYN0@`*gȾ=u/=z_djv!jW.Jcby7iP4+s &f38Em&eѢ[7:a2+.hs#nc99؟ |^Ե51%GǙo^铗%{sLki }3)}Bm$[ƾų q 疣 Y\tk5uYLۜMh;[-dO l". #d 1dmφ2x~L3Xyp)\jP$ %sdm_ԯrЩMTsX$I2Nz>ѩu7i&L\.İ'h8PX2t?Ԣ;RɨڒΡ@(Bw2r4&4 <>fjU ukmJ[QCׇx%䒓[r9| }%I(жmhfv+".Y/hvv6Ht:WxQ.3T=/OoJ5Q$IzܷVR ǐka/۠AǖwX%p 8d $뷯G ҰFQ2'ƇkpX$Iʍ =Rh μd2RY?0%IZEI$S% 7^S U-$I_c <O -$I$I;\«cҷuv>eύ|ΘsP;%r>@O?byw[<9$I$}Km&%=;4؆yLZ&_Ãsՠv$I$`wv{=VΓQ+ llѕ7g,ք3} WBu9o%{T*GƕLӓgg&*Mo59&ai xn6dh#+PDl_rrۨ ZקDt cz>灁9AS%'$I#SS⦙ ӟ<}cfC^+R!Z~_fZNo.iˆMP $I#Qp Ö+Hasn:ZՋ-=nwgAoƱ"o9Niֺ1%Z{{Yʜ{jf˟0+FSO yX&F%`2"7<]pPP48,I$|ؾi+w H,n!9 S<1[YӚɟtA)Z(d|V#s~l2ɈD!.ȶrnFY.sÄ,I$|t)YB_n\~~mmYY4a+Nqpp NJjvϤK_nkL85-P%+ӸL~6/5h26ŨR1/Y+JST lL5K$IP講y,jNU_W?)\jP$ %sdm_ƴ0Ylߜv>Hp2"Qyt!WsE9LX <$I$s=^o'>OۉE6~yeΊ!mHy;&9/w]u:k|+E9\5 !I$c$Va,}1s1$I#ĥLXI$Ipx N &5ވlM=LGzK$I} R鑁ݛ+K7lkЉ wc+vݓγR5]$Io%:f(}[aA\;<1LĿe{)?ѽTރ˃̸s3bj$I(RlK\?y6t+^o%I$Yڽ+]뗁%gepx>T)Jm+[<\RvkONĤ`÷y/H(m=;4R86dr<;3@y.|\аeMG70n.E8o3+Q9|'۾-bԨ^Xt3?U%{U=5ѮѼd+YR{z_1_0I$090%nɠ>yi:1&ǒa>s /QV%3q|.?nCM wjэL6qb(_w@-ZU D /gL>COꔙ/CӯΖɷ>~?¬&/ÀIyLcЋCoW+y39aF crã7sjN PtgXRΧC;W|̤Ap:>/vmOht'^逸dïjGK5ۯyl6hI}$I$2Gp˙:l"hCZujOŠӗ[*}7iLݷ?|=_'So'Nlq" Q&aOxbk* J_@4F6@!Wk 5]TCX\'HϪ$Id #b5볈nc=//\8O-X037'R횦nfėxb2leơw #;h`fNRwUaO/.V8u{udP|(Sn%hnepG~JX0C}u -:̺R *LA` l#Jp:6,I$|DDwSP )V8nR6y=kRۛ%zZ\y]_DϿ晅lM C\qTCPV<@j~Kڑ |8XN#m;fQc(¥IkrtMsxv+UH*[jI$I#OsѸmneqiX~S L.-O9X(1UjQ~v_D3o@p8BŖi-#RWMAu2+%ɮR@执>*{僟Rnx衒ДrY4s# BT?#틭&c,XZQ/tί ?|ŗ_~{HmAtF}ǣ sSrw؟y9=T}B;Qí_nfQE?g{>X$I2EG '&LZL{˻} ={"9ҫiC3i] 1,ֆ rWpNbd. fb?(IM9jo\~sb괧M9|2,Zɜ]*Mޣׄ ?8mO/%ѹnCe܂^ЉnEQ0?< N|nqES?g]_׏I!_1_j0~vfG+ef1SwS\F;dK$IEm۶(+W}<˒ M$!--+;}=C?=/>19y(#3{+ͧ'L$Iҿ#+9mUx 11w:e4h]KGb>S`6a\/(R?70)_I$ `{S>sCߠA5o2j  S$IdV(EnrA< ou^O I$I` Ua>!ϣ!!(@=3џ[NB4@qW!O}?f0}-Gt_"cs6꼻T}Z?ޑK@MNoWJ$IU aJ4A}RYN0@"l.i׷^\`IΌ+%۱ \:4c{Gcp\Q-!2g =G;WeIrv} +x{-7#\,偝kSxdoB2)UL!:$I .u9S-Wm]'1|^ UjGL6%(1ld](=Bl0]iսU+ 퍗y\wk>4]1W??"+"L I rX$IX@fbytTx4- y\wm ?/7f3ËxywOH o;[te:N$I$*^72jZFÏ9${/::T'C㋸~%RPj98nkBʐ+ ilZΒ$IdV Mfl(S6 Ox2}* uQp2فb*Zo䋇^d4ZN͗n ==ԍQ0g4vCx{y]5صq)z\G:I$I8^&0o[jOIgjbZw^pAv`V(ӔۯoB_71>|,s *_:ps(ABXI$IZ^Jۛ/g䃷311ڎyĮB[UNy,0m $I$` UTĆi;z$I~CnU?+!I$`I$IQ`-2{w:?mx-$IG*꘡m]Kφ0k7<: fKqË $I "DveTK!I$_) Uk- y{DЧ|HۺХIOLfV}O@,ϸ'olJFM5Y\J"sWh{\12RٺzǤ9ڳJ5`څ,Kζ$I$0i&4`ҁ6D2-]PӮoG乼 %J!jW.Jcby7i,knoI=zFj֘}ۋOkoJ;rodF$ݿ?y+W ?j- 9vb;D%I$}Dٶ=ԧ[1u+`Ѿ92}*-GA` EQyjJvE =D{5$I֜f y$ s] 8=\MLn.N?oW;2֢*[_o tм9LS.{Hs^m%I$) mc{W3yeFQ{a&&DXѓtp]%ٯs#i$I :l@1NaZo]<IE0otJHÈb6~%I$Gp:IۣTlv ܶ_xk2ʓĪ%I$I$ҙtx/x N &5Q .I$M"tAX!I$Z=3ԍ=';<1LHvVW o">-I$IG"@EM{ ڼd!$I${j'T*@L6|;%S{?そCc9 {qkE [֤xtc+sfQɕ ~ҕϨ^>/H=5ѮѼd+YR{z_1Β$Id֯eL? 3x w@F IDATQȷ>~?4lGY=]MƲU^}Z5m* D /gL>P hSw1#N ZO&Š\~՜^>UgSh~"f2O 1K &hK$IX$}3Ov qB EX<ؚ M[ף,ؘNMuxL'f,eP`[_ծPxt^t$ 7e)Z8R'Рr>6:|\t.gNmI$I:y#H0Gzs" c*yݷ3 |%Ilܙ7Ij{ǓC{  {%n&I$I`qR涎qYi~jsq(m@ROHٲ$I$K9_D3o@p83; Ds:Ҿj2}sNdW)G^ SiU=2lšKXIk]",k?Y$I :l1tֆ rWpNbd.i#xzy.ݎu(lgϯN{tN>'C2_Y.{=w5cŌy,-_v$I@۶mQVX%&N\?uϾԞ r tƤ8)?$I##+9mUx 11Uɻv 4߮xlyG]O+RoВڄY4sW$IҿXj4h} 6#&e3KA ,$I$rQq( I$ h{1C?f0`Q$I$.\2,$I$s$I$,I$IX$I$$I$I`I$I $I$%I$I`I$IrXKpxYI$I2N.f~[@uE$I Sʺe, $I5$I$pnKφ0~{|$I$ f,bpnt=#$I$HgeLdBOyFH$I87@{I$I8WI58ұ "I$I)qd]E쩷sK$IRn_`w\޲qFXtE$I$pY,VƄ-$I$BNG"C$I W%(A $I$ZGH\]0=L$I$p.*5n4lЂz`ե^$I$ .В$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I`I$I $I$%I$I2K$Id$I$/{$D4'$I$I7G%I$ ݛ );JP'$I$݃5џF~=$I$_d9ϒ$IK$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IR+j7+g PF=.Z.ޗ$I$pVXk1 <= I$I2kp3*@t#^/𹙜$Hp-&]﹈Cy|~(yBc:(Cp+}b";Z_Ci w<~I- v2݁5Ia*FSʆ'B'&q]D/~d}^r;[Gp,^5֓Kb9 \ߠ8:I$I:Z (`bjgruy:f|ĭOe LwQTǿnB$H#H@@M "TDTP* EBt )&E߽x~ ٝ{Ι;gΜWq<=婧g6kE#nZ2<:n 3yr;s_[8՜Ov7wGE.x;.7hC`IGߟìef:_<3-D l4Kɒ""""""W*=l͏c3,8%}iw('eMzEocMp%{xjzVg\ȜtJMحai:NU*ۀyD }c4,g74d+cmzx7Qt|~-M; 8ɱ%8<|iձ#r]yoADDDDDD2g q?!UlFYx8osv'9RNYt v'xFвegn>.Y\W ON()E&4 .\9\v\e:~5\vNk̸nAvt[/.^DDDDDD/c%y9_9Iqiy^4K'ʍΞAC9OXf,|ο&J{-v..FWYz_lG̑c~96o#i /ުEDDDDpw8u`9/pϠ|Mp@ iܸ!BU.!9.wkh\&7ZA6&+x4*sdRL*v\jצZH g;Mf2lu&O߷A!R8ڙQeŰTɋVJh]#e͔/,yym #e۞NE@o:(W=vhȫ\GWq)o,ewu/^~dͭaCe'濱bk5|[;/f4S.<碪aaca;]oo;ϓ_:j)wB̔ڛDDDDDJm{ ͆_Uo۪Us? FAXDDDDDDjp>]7\ !"""""r(((((((()٧(ubzDDDDDDcVg i 6V`K4[,X~r (KFsa쁈0*rӆ """"""]EDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDD<_}[{?9""""r99":T7 憻˹*W`w,ZdTK]4QK _DVOj4w f`1/nzjn4b@+\ae$}CEDD.|6&N<#t2֝딅OLJbܴ1ա)~9OJbQtt-L4Ľ|[~bSD?r'^v"SI4Ó&B\d|1}t6us?fՎ8RL<B] vNHr+:m OYJi,G U&= }o:&=[&=.{+I.uům_>ދ(Ax9]HwQw=>vO1^ =A7ӗcQ C >7~$}0^QObyV9)ߟc|bpPΙXNw5F^ǘ-]ɮ\'o #Zi ?V%tSO0v}QO d)}m(F-%|0e>˪IצhIgz? )s!]_FUJr\12Ȃi'O3O] $zYߴ;CuiI?|U̗p=ȱBo=˶ᮼsePH鼺..y쑛htf/ S{\tz :SNyi!۝K5EeFnQPP@]3b`sBh5[D̐&8PO\F M;ٕ_Vڍ4J)ϋ<У(;~iz vu`+#{NQ:PSAxމc.KA0+{wщϫ9.zv9o++ 1""" @V,W1??ˊ3)(} f1{wuuI=EQm+ZӰ)JlQƥqsAѐ@H>BOeaLݨFMB!%O\jvf ݼ\"3($#rk K)ȷcǰxPj.$GzFgZ7QI5|mXDТ,n5{嶦/ق?|ߖ\W?sA޻ #%jt( XT^iT 8ȵݼÇCυ[hq,?}!+=0&2Q=5(m$/>F;wt6G "Z[iW)k={O0謉?Uty!WF >w=FemK}0EqSf9om>nm1~f,juD9UXNrtw ~wrx|vr>;$""f# ڄS# F_LtAn3;p.~8o'Q])*9޸5kZL5I%f&;SǨQJ㈯<.%$/00jĠ2Np(DsA!!D6Oo]" FVg3~}HpqHjټ.ܓi-ܣ #k]AiV) Ӧ Pw/5.*9\ҀuH={ :(k#(q_&ҏ-kPU?nxҶg׮M ZLBnGo, `dS՘|qA>xem<9*Yq2nfq,;W;ﻛ;Uk{(RaW x3 3p@kfX,n~ܰӃǟ8͜w62XmK705l5ù>M(ZfͼȗQ_1XrX7ӧCP:-A7'jxq͟#_kNal6OJV۸7֓),4"W{6KM8hyy9B|㗑l:%[xZ~MT ]C{Ҵr e$2L<92Hi㵏sw0Xë_擳XeRL5W{T9%+2hA"Mųj1mL0q-g- _g.XߗE2ec25֛kߞ{y۬ޑ)KiI<>Yz?ywq"ׁ͇MZsAtS ~v'nXV,sm[jszU;~-&7UQ|N׈A7" >vˏFEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDD.URǎƫgEDDDDWA`u;]-"""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""rsV\OWq"EjX577fZihXǝL{aqG)\" ;ri/Lc; " "r1^Z ""oxX]</m7gX]B.iUh3iK^5<ӼCwEGǜd{Z>e~DR(YviЈ^c*-ADDDտb'nē̿'ZqA}x>-{ܲxR=p )O+_.3|,`jKWijtzuoxHIoo!pۓWzSMgf-΋s+߻5rsL噮lxa_茖g}W$1]/9G3/ qI .75&SarIDAT`FF y9c8D¯(:#Cy^s_Ƹ%ƀ ?oGkA7~m1;OvηX }kpн I5)NQ !'Wm&z"&M0Ld {xY3LBN$dZO_+HJ>}^>dǂi<~h;1 R1|dxj&!Ԣ5|f[Rygg`X{{3BQxJk^}K.Σ?&I8,3TMbK' bNPiD`=FDDDDqɜ i^tH'1Bl|B>uqSyj3||qak ~F3׭Ob !H=~C.^Z<`mv9eԉ$_a3Ͼv+27Dj<:W$d',خDsto~kL vrrxxT?plxr< M<΃xs\w jRJΞ$>ӝl6LyYMDY ,⌏GEۆvnDQ;8~SqLjY]=.""""5BRrhhtkW8eRX&#ګ1~i30,_OuN'RA,Tb2mGl4nSz*'\| 1pN'p&st^h̓Ou'rpIپueJԅ~>MۃIL.6jp#??_~v> o7 .ɭ""""`347kϭ|2c "©ٜ "༬kMJ#!21 7.e3pNO'6͂,X+I/dħFՠ09lY2m3oO!;4GYʒKM1""""''9r:z/S :PU$qX\y诙qCnѿ]mKjj>>uqb9N$]đaD|1 bK|j>5ႍ} qŴAtJKI&{r/@-$TVEbOn!ٿ̈`Ї0jFYHܰEeY/> 'Ng샳8TߘՆd̀Њf|^w"Wǯ✠lܜͤohƧKM#GUŹ-Lό7``_=c'8f!0ֿ-dgyKXJRt!0Ì'& 0QGv+F-ZO ?9se+vL T7?ݻYZnؘEq8fC"aЍwgZ3u޻%c|1' yk+˰9wAԏQt2;.^-:>CՌ>G?žx}ڟ=t5yl?hG?њejbXDV؝aZXsm[jszUsXJSf W\Nl`Y-}Ve۟DGge],k){U89|TixAs58e%yT^1Rpzb;k;`D_Aaz*gL}Kk| g[:Ǿ8YkyqtV^qѰ+6iYiFwY Dw=']eqH4mQX"9;W3^BX3 Kxh nC4^+! yw|O|V+SyÔ^4aa>y[yg|N+҆V< 'uQݣ($މdž[Trv1w[+>Y"?l xtYƒNI)(dDҳL[Y& 7<`F3}ص;_>ՂrßS&3k] 6'tl+CcB.dzS瓘TҢvCxeX.gֺc`ʓ4>?^).}Y3l![ )eP=0II1;o_)kʭ-!0?Qӆ/=^.\s< u<8z [\F&LŊ(n܍qoy_ʶnaoN]iQݠfиQ ܯؚqĦFEow u;Of0dR0?0ӈN('0o H4L `Dd5rV>Ǩ{//\ߝQ=-yos[`xnˋwQj@Mb s9}+[ܶe~-ףlBI2떮`XD&43ʭD4 X|_l=+QaOVOy/9^ޥϛìNQ ͛NDPJHxEyi$r4o_ .iyaL~,"'b&7 $8t6Wѿ[_*@toƆo>}K3@ĵ'6Ndwxz4=e}u2fAurڄQ8+MQ<ŗfYWq _`bPѼA~ZV{R[0 @fX(@Z\"%/A>p6eig//[QfA^Pr?$߭>2b1 /D΄x#ίpn=,A4i|fݠh6`SlcJdd .)ɠք0 [ eGi1#C_г }E^ߕ'}""""R57d>E "Uoh=J#Y3pQYp$XLDT \Vۡ65V0Os{:]v3rKw-a-F/;we&.gd0>Ljq<ݮ717 ݠx4ÅR{7u[Km4 r-km!2X8rg_#z\{p7WrID߭n[TZ# bapE$5`{4eh%8PLAP(eH7LAx9sO]b> _7C_`*WZǶTr\CԾ&}E8P75=ֆp ^S޻ރpLYI+WOҭ{-F=OeahA@FL#]{0t& PJtۛL}?X:4Eq&~&__i.r$> Ѧ]r *CNn߯#-j܁Bv}D\ON0mS.)pB Lcc'æ rODDDDr+WXJkIqm&yK[fr3ߴ=[saB T9L #]kIĊ[׈[oz3ahWBA HxlZ䆮ف;w4+rȤ3q)tF~s1 6="`Gn9(Jy/,])Ϋ㛶pM\ە11BG.LPw.)\de;oWK\?%?3[{+"""r bjBDDDDDDz(**TKHf<^*)^p촶ڛYYg"""""""Rm__TI{aHwߝ˽h" (IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/path-operation-configuration/image03.png000066400000000000000000002126121461403617600277520ustar00rootroot00000000000000PNG  IHDR8$PDsBIT|dtEXtSoftwareShutterc IDATxwtgoIO ^m4 H""b( bC(VDA"(CItܲ)҄tnsN}5tA?`dnH@KKK˙.˥E6Iڼy\."gZ%Pِ`IQn} -Y(۶XlZ-źð0,Ϩ"ۭի%Pn*UQX݄ڵSVWsQ=Yh;vLfˬÝ Ucǎ)**@J*I=a+BGi%I.QPU\ i/XF+rr!&Ւ$jf'nrr92^g/RJ<|6 J˩[dٳhdUCÇߣ{^$ՖV-X0Ogԩm6XY6yyyg$p +# +tvt9&Im^6jijji߿,ZeU4u4Yo3ׁ|80mQڙ3JMIaz㋙r\'(Pe?ѣ \Y*U*m/!!A*U*zx"$n}ɯ ts.a*4VSwꏈX,w2H0hLh;ŦG"uHdl?ڵЎ'JG?w|CRB+1K]u?}rz-LPEOn#=nMYG}K]gOXo)'o(ٱA󿝥 1J}F.&Z7rvcttB}p%7J?S=:߂s.i縊}CCϧ*իzYZ-%,W,:qdB+I^襏~שwTDª6lKVLٖҩ6.>rù] <{>SqP25yuo܏жiXO-%+I P=pڳ;\W<۫n:h$@v6<Vģڶqg|z=#v:mz5}gb槫H jL 7ꉡoj˔R[?}Owl}1Y|.|.=>2m&(C=W@%Hm^^s4eL _#:^>rܥ3&5ǔnRШuT=sȟ^S7Y DCZwIҍ:mZb%ZV*63{%]3'Wl)kn9>M8WfRLXuT)U-9œ}7-?iߤs mߒ|''+ސy>f#LWh|8>kCkީv5tm9F9RjQƪh!ÔOZHi3ɮw?)C1wp\ɁGq i) zb;r̢jCO=ӣҪj?^`N OUl xmٟmZWѲ+ Bz<8|jӻ4u]ٿ[~-p[u].SFiӒO9c@%QV}{\/c$-q)(vMm- s{YymylFfPuiٚr\"(d$#ݡ)un2b&_Z~1Ju;T&e(%6m&iJVOYt([͛ՖYxƔ ɼD4׽)e 0O%Irx[rԭJzʤ]٣zu~F )ܭ3U3j ζpoZ^&UQ0hȿY5gp ::PϽDSt4ժRi7^hJ:+^򖡲[~Ռ-uk/sù Gbkuխ zJd4w&~n MƸ˞No>-*==MS۔8.sffFe Zt(ioM]tCՐS4_u0zsiBkxZ7%?iU˛ղqXKZ2*UݝfIvMI9)\j۽Te-q3ȳ8bʒxB{8gڃ}rޛ]j19=ܚW@[uR]tw+gsU{G5 UwyKtoϚ*+TIOQ>p̡/^2f7='d—|O{7~M[YJK7wx_;TV/o赅iUiszS7];k6fN+uP-'9-Щ aVժ%E)erm;D$^}-F7+e{jqd\|#):WՔ rZfîkj/;., 0=:FkQˠK+˪gjڠ8W;kVPmZNシ!Ô*,2R:-)]MRf*mt6=T %1RIɦ釴pp*sB.pZݨjvܮ<]>k;^ekNK˿:PqZ>cnȿݾ(76խ+r̳ީҡrmF8}s/xYYrQc#T?n8T -V@B}S*CVUiGC)ßeI&Z-Y4~R&M >Ô*t׷z~J7Hn Prl*MR+S7khhƲC[TmCԽ7-xW:1/QJz\j!Zrzui1Ji~M-#-Iчvi 3Q[ ~IOo*IWf^Oͤ{Y=}^lQ|!%Ki[Y?1kD;x@%dBER9;~_iqVhw(.~?wߟE?_d-Y·3ԭٱjBB\_n]%-^f*M_G _|LLos!.>Qzբav1W]?ӡIJ (эgƓ*yT1W =TIৠ۩O0'-Y'"kshN+e nDXcja pexH Ԩ^U2,Z (r|g*hU\쓬jb,WpAVU0o#ȍ[hڴr`%IќhOs|&ECӦe˖|;n[]:]jP ]۴y3TrCرcp8dyN )[VRFPQ&88X6*ۻwo]uXW\yMz찪(]̉';ojO7N)y޼s'MS*UԪUrI۷og[hSsϪ^C#GKϿ_yY+Ves){ouբO%5I;$E{*|RNmY½j}%~fm;%{y֭[ nh^!Cm۶{`%Vв\w,)e8ʩ|VVe)ЪM69s^tܭ={AY,k-ꫯkgO[4}ƌlݮCjL}v~1KJwKT;~m5yQZIz2|RRys^O@r:4ڂҞkj6g;<18U~|Tґ~"MInTUW J_jŞӒrU4kTi|/?mոbU$wY7uDY5@UuUۺUΖ;jLk* M:SK]v6I=CqQZ?m%$P|!)0 @AA*ƍk֬d1 }:wꬸx%&&()1IJJNp;R*U/{DGi:sD|VYa$U w̺:,~4eԮBCiؽH+dtܷoE6m>6@Oy`кum۾MQNc.=u\wlSmrX9t{t:wb#X*IrQ=]O-8jݭ2}k뎨Wn ש޵դU9Tr`$jRs%TEujW=J*<]t\*yQT?:T1-?qޓ+U#)m/Oo꫞by\ORP!{ ^*iHՖh#P5ZޠmrwUVé\qJBTTyZz,UF@V*F3Ϥ)91Q{MeXt}˖jպJ*%ݞ 8)LV\|\>/ @W㝃5R4{ΏJNI)+IXz0k>+45,"i*iW _CW}6-}6rj1u:Yy}moj֬UJ!*m&+?QWplƪTG:cOأE8ǒ6/[=jtLY8w+U_f"R ud1*YY֩[7٭jU͢ k/`5^S6uudl2rg+]_e?U;s - ?-i~s$kÊNvK1ӤIQV֬Zy5{JzEoC0(?'%%i5uvgOcO8re˜±/Tv-ը^M;wd`7V˖-ע%K} #oX,r9QZƾ;?9oH^nn)c~a>7esTNAiQ **UK@x\OӨFi%)SNzgCUzZp ˳>Yv*l&mذCG.%%E~:Y~o&Ţn-[)|}6m>\P&9]cӎk'=2yZR\67~P,[7i/_hںxU^u,iJ22zCe|4ŧ^.IɡuU/NY1ɳ pjƲp%Tn~C0_fP"O>Ҏ;Բe+y{3-[iǎrVȿ XQz꩷xM۷^ֱ}{kݫVX$m_sn޻J*JЪ|VIҼy(-5MnA{r6](55Uf|: _5iDB/3TUM&3+ng^䡫[{֬7ٻEKi㰫5uU^L' IDATm;sH-r>gt2hqѱ:cS!ߓGt,WaAC*) '\TpΜ76J']eTZE9ky,wVPU4>+S'uUF*W"h٬M̫E\.(DRRVEaaUNԩSrri)}&MzO7Y<;҃ݫW1&IiwsS`/yZh $t\|mIãG޻lH$)_M7Q#j7 |Y?<_n[Lx azfrݚStscBU~}կ__ jV?uVO[ϝ,b7`j$KO]mtnZ4\r~ޑPᔲ]3լPNe*QVuU:>JInYZ+N[uSZTɍ8P'6n1C^nԤZvW|V%GDvE]UʕUrg/OQXj_Bk6VmK˞[(-ԴVjk!G^-UU]iibP VZ:}Bߪqرԯ߭:5kzX c%ẻ}o= TLI[5t~_ *YUVP47t{[oټZVTjZƏ}TݮAnLRb&V^VrꍷҳOO[o&3z54j(կW_/Nǟ.vI }_}Ͻӈ;ʞ*,4X1GusN9tgSzW5-J罢 օrS6v@K-]Rw,\  C\J]=Osnԙ[kWoyJh5ӞgLW]ZgulUr&)~Ŧuz]gu[MmNީ_qwS2m] }ZwWVd^Ek[+WVʕr:xbY-Vu^VMn[^JKOs5|*w=ZjVOiҥݻcǎrk[eE^E9Qn}TH&qYWhd$__իWOj֐|J9 p2Դ\&e˖zlc*V޽5k ~Kk׮CYӘ9 op}7:alrpիW_S>?yxuA7F?Qʙv|t}UF ZZK//k 2D3:gԨ^p+>ө\`AAA׷խ:uJ"õ'|~3G 42 nj78 eVJNJֶm[/I׺x^v6fͭ+Zl8]eNCgVݠ88Ac@Y祃 ŰVzXcn[iii4[a!Vb1fXe\AiEXUhbjUw!,WY[VPJ*ooYtLZ<)S"eV4f+!,C^>^rr8].qž8!CfQ?v @`UnRÐff)S&CaXX,ZVJ(""1';(fQQQlOK#$i۶m^TRRBRUh}BPa ԼClX ]|BBms~gH < < < < <  Æ< MVXЊ * ܿS9 l4 3.=QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQlWVӔi>@a(湋˝_B+f2Hm*˟+032Y2MSrp ]G]mX                Vb$a6A nyx8[I; SA{mtՎm9A :+qUz@}lfn5G횷ũn۬'MGuRXn]f%9WoNMGO+R4R"rne>[_'5}^$ӎ/?ׇ 6(T˪FAz 2d_>Y_^je&-ܦF܆z?i~~T6hޯ|'~ٓN5*yFH'$Ok/|Eu#TfozkHg4܊ٚw7P-l6m%Eu5Ut?@]+kOhػ)Ad[?^I=o^ai1 >Ed5IzE ?'Fݦf;4I1xʞW>JTj^m:TZU?.i_{ɾyZD?Gߤqui@m;uR̀j&0BT%זжzrTG67}Y5saxWme,^ӂ?k>j LWmg쎑Q"Nm۪[Z2F*qEڻ6V{T4yL5J>C cn93-u-ծ<2K}լY{fJպO hJNЙCq ?c*j-5 HƕuIwjPE|$VSr$KSFfOQ2J*y5͘*H[;{ہv("39 ɻ|yViglFykam<˫j~JQtDNh=g}97=RF1x"[I>8QMA\>R˛?NuVϊkƖ5aEЏӖi}.Tq÷z۠FwoiHM0"Egl/f&XFjɭ`uR_nvMnlqo# V .Ey\iF+l%jtuz~z틛jDcx&|UznNMҤ㷗+Zu笰t^g>jNxЇ|_jyVC>ՇsҴZ^=y59CQ>U>H6VғV9Odԩ[ ߳+rr8JHHPb`5k{GmZN vY,?*>!!6o~}kT*ƇXhq~@/~($G!G!G!G!G!G!G!G!G!G!G!G!G!G!G!GuaHCGNpvs bn,FFSL]"6Lj(abH UnMd1d#(pY۲\ ]V+I'`#j1*RsB`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`C^{T߭:h QOPw_N樼5oM5T7Dk Dv@ɛiWK)N1[:Dկ&s@Q*]:ۯ )}Y5Ur#KCYZXæJUtu CDj4aH'>zt xZoڣ/*M#L>:AU.VfLZ5ۚQj }ҫVx(kkh$)15m>/= أ%)m~5=}$k~-]WgLTkLZ$™z?t8GWǹ1%NVaMej6RW\UEH,3}UT-3^{f}fa*1uUӫֻ.)r3=2Ք?Oh4r]u}^_3ZvUx~N|?Uj3,׮xoy^~~q+0-?@K=Tv|{~qLFʴY#Fv7>^gI[Uz. >Qs̨G9EN|\cĩt隹NWW#5Y ַ#^1e>yL?XZ;N@Q(1c7N{V $(kV~&$Ìҧ^JjYÆwVӴCZ;u=8cO|rEQ;zk;!.C)1i^[|P5^jQӞXM*2ۨG#?ݯc:d^]gzҤ롊gi{eM۬/Y{꩷ӄ~WױztF}_߿Qag҆'z'4kwz핊ܮaF_Էy4sP쒡3:2KV-]!N_zW?Fy1z,~сVphKf鏷*DatNRJX%7mRGn/۲ 4$21}[vhh n쨫ME.d~XKse`OK%''kǒ]:]GVgްV5!"kotfθZ._պmڷJy5LSY#tߍe1õ}nn|6W 'TE3U w-:*KAzCCҫin,WOiNjqߛ^vIRL[Ɉf1ԶHmvuf'+C0YOP`z#'tڐ\6]t儜;G(\=(CY;;rԮ0">TDLTA˦QV5k"2-*RbW[VeoېD`\E%m/2eJNJ=}>t>d8>>wGnԩϖk֛e&is=U&:Y|RKdX[e"zbtT35B/)19mW$ S^8vmJ=/&o`U)gbOgOzMTkdQ!-ڨ7{W4@W_MuiT?ʘ[vCkaPUs/,Ӟ.|RƏJg?W.~5U^:%Wped4eWSnj*ۜ֕,x&cύ+646OK>=3b NU we$MC 5J`% $?I>-{ EEV<N:Dk}J6a1A\Ÿyo{W⤽~q5,Oc^[w,ls:LB[ͺt~'Cqp'2cԟ6#*fm"Jn?͈%=*srƓnɆGfA{g"c൛[kyv482).a-ll9̉b,nT9LW=[pjbu6k!5JDX5|mJDDDDD>JѰ8u-E_ADDDD*A" IDATDQ8V""""""""PXCQ`%""""""""E8V""""""""PXCQ`%""""""""E8V""""""""PXCQ`%""""""""zH8="""""""Q+TEXq$(""""""""E8V""""""""PXCQ`%""""""""E8V""""""""PXCQ`%""""""""ŪHy۾y?[‰ """""nn>4iXzXHڲ~ :*X^uߢB""""zo\`LXQ<́w3rc%7,(I!RN!|";LIkd_rEѫWlLʡß[T0\%uLiE _QgȟxRE{?0Ox3!u6}.VШ0qnI|ոׂizI%x p1XY7-f~M;Y[yEm~gMf̜̋21gRD^x/)("""v^IbR]ZλQøvc8J &nTADj`a DuHv&amktR11wKC1 Z݄>mٺ|Ymk7GZWڃrQX!""""""$89E1pPmN.YKܯ21dfaޛ|{ɐa/iljixT l\D"PKt {1C0rʺ;q$1 TlG'2~pw֒P]5R#?z&#*U 4!@%!|4sӨJhHbtr9J.]h1v,t;zT oLm61Kg0 ^}#gbN #') A x$ qL.=ѐ%_2LȉEVROϼ̛Ej?[ӏk,X ޾[F:\W뇾/Ns-3g:H8㑛I6Ydxxׄ+%ygΦ""""""OHI :U=з3o%0Db C%m`Bn99絕7DDDDDDefkxJc8R1N ;0_eSID^7p'T#L ,؎p/ׄNJ\遡 (&-YqQ^f úWeȌ DUX寛ɓgݴyԯ97UGSI$DT؞.$c\SCg?)=> sċ}b]GOJ ξ.X Ҷ_]Z9]nd 0$>Þըk$>ϲώqqg:q 3-o1ù ?Zsꑴ?cO4<\&f)qV{Qv;C!qm':ost} \ۧ.8ӨGKjHOsY\XA+,q7, UR8_vH v88}}NteW ,k}[s3$E7" |#$$J 1I :]yq֮A&q9xGgBܓ5k+),ilߘiPM="zsVg3eҹw2-yphn3X|Imd7](}y+F[R"""KK"=yCL#]cG}_Ayޘ(sM\kx8kwa'<$ !14>xIԠeMc؟KR#-Ŏ?]'/m>aз]"p-=&`÷v ZFY#VNc4ƘaXY1cwr"uFP9AmFe>YJX;mM%+AѫYVNb,֦+JD9fa!iR ="0"ѫ+5hh=g {az3& Fyuw>ŧs=D<$[Zmf#]"> ]m\{}.OKML=D'jtV D%^K߆H3kҤFAPDQ0/v6>jSXK0njBClˍ}MpOO$=gk֤`sXO35+%ꚲ9*Y/~W&~u;u %߾ƈ77ڒG-8/q{cN|Ǔ#޽|UF\Cw΂)p޿cF:֢|c|7f* 'xHYVq #G^8Biη'(n1O eNT0ɉfr DԮEEMev0چUX/ uGw"ӿ%x͛-` 8IVpGn}b> 3gBEt2&!7jә;-K'RI3h4ztE3ʡ3emӨbBm4:lTZK6RbsH{]S`8'\mJj μzQxiJq#Lp@r Dh4 3轧-ͭV]-Ri$^fkڏpAƷ3x{sq(" ILznFaPx{3ǠP8îWL#lk~ ;m2ԼSrc4 ns-5 hg{@ɌFAg8w7Z%_uxrh / ~8OPx؎-akJ\?T {Մ"""""'XTq$v0 I/2Uۢ)4,c|̎Sq[,9dӂVTLpm_ל6݆H8vHrH+ZnT 7#oj7- j%Zc|=BÂӱCU`GQQxV&ĻExԤy}_2stwÛTʐW݃iض=;+d٠-[aNm6w)/ZEr&&ZfaZ;PDDDDDga%"%'!Qkv]d$v̢зt-1ڶ)D&v("}<,"y^xDt;b$c,#f/1.W#35o,GX?8 p7H6\s/<@f <Ujxx[ҐAys,߆N:H}{?ŞU}ޚLakKgޓ:EDDDDO1"jEƔJKK7w"{mS2RI9StYTA-S)/u8 T69_^%$Ƞ2ôQ) E9o,>fs^>N<A_,CoՊR2xfZ9fzXգ4#Wn]Zd''"q$(#1)JDDDDDDDD+q( DDDDDDDDġ(JDDDDDDDD+q( DDDDDDDDġ(r"轝eQ`%"z`UADDDDDD.+)WVDDDDND(rռMs<=u!rus#<21Oy*-*&-ӤEcBDDDDDD.zXCQ`%""""""""E8V""""""""PXCQ`%""""""""E8V""""""""PXCQ`%""""""""E8V""""""""PXC"RLTDa*8<V"Rn~L<&"/0~LDDDDQ)rs0URR+LHbGljf8#:i DDDDai+)7%%%,޿xU"bHgOюy&""""JDr?+..fĦ\W)oKJU YtA^mcV7vMX,eR/+qDa%"墴{q1d`uVCVͤFp88bJKKUqX DܔKnQ*?k )""""XH7)""""rXCQ`%"F=8D DDDDDDDDġ(-V ä¦Ml/՛nބ XDDDDDDNV@D5ѷ_5Ռ1%L6J]h׻;~_w?O|IHXjTKADDDDD䟤JD3Y{Y64[iwIV^_z """"""$V"p YwdgT{xj|c$gRČ2~[ iPz|9?O" W|Cs ]LZ9UB.삉^wzoM̋caaLUfDφTʬ'^afb `jTS޶;}=)8_K&K4U Rn1O}ZqaU%MP~e ?fWՠ[gV1 L+BN4V&D-_5g7|nۗe˖P""""V"X=i>n4φ|#=L ֌-D$1fx]o酥W6&+! I_Zf}'-fS& 塑SikZؽ뎲9ZeXoi;ַA_u&Fykx]uMx'1: -kyd~yN'rڀ-s]:5nթ`f$QƵt:|n`֎A4ox{l$Uq5MSs1 zWֿȑ#پ};wYYY >3f裏ҫW/FB+q(x$l哏25RFDYPSտ2f d!e~4 t##!JA iXPL1#p[ /bִɦb{崨RIe=<48aM"<]_B<(񭄯RTL`>ɱLF5V4  [IZQ4j{C*`ljN*yED7d%':0ݿ2H'j9prrb <RPP>K^={6:F+q(y+?Ż(ݕ￁xlu)p2+U gz&<f7F=C* Lؑ',*q>Ͽ;.k&5".ZQy}j+[9pp Do}XEļy0`ƍW^̛7'''HDDDD3Zq( SlW$&"<Ø@T\e0l9]vˎgRJG=g+a`x܉mųt3L6$'6"I 3.'Y;#ǀd%dxR3ӓsBAwI|>q{Z(ٹm?u`1Sr0l3g0q%*G'?j`BK߾}7oV$""""*8@)kbK%6}Aۘ@m,q;^OT/_w=RYٶ&9[B-G/{K>y׶D^GNPjU񣪛sA~ǾgI;f:'6eg.x:bFgs[؞~=˷Ybc]h_˗)v`xp p R* B/mF-M]Db& o hE`ԉܚ#k ~ m5|EDDDD+JD_ana ~y=i1SoUtK9o-{<=a8}]_:_GٚQF3_-f:g(\P_ 2j}oL_I7^}=Xnpo?͇[3nLG= """""2"jEƔJKK7w"W)4dgf53KڮC=ѭdߓ/LVzW$oSatߪJl1WUՊa(Ez-xxcZ/ʺu5kq琚("oW=|*z """""!""r1X?k@FF=wߞCPM<:7DDDDDV""""""""PXHd"zm\ V"Rl6ƨ"s *8<V"R. (Q &vPDdIqPt]DʍՉ uno6ÞNV'BDDDD+)FZ<{s9 %vGd_@`ٰXZDDDD+z]Aɫܥ#}/mHa9 _$b邛?>?NLO|x8N%beٴ~nЪA2CtB__~^&""""XH~H6}LBNF]v1>ၐri0ôa1Z^dּ|K~>eg?#%Om?IqiNN8NV+ֿ8r2 8aOqt""%~f7bm]8ت;Zg%,f*yԵڑc-L[d$TLS< øif!LV<9!Q\@I*U60(Yb^fJ {##.9Urߊ}kֲZG|ȸ* 2ٰi:L,a;}Ȱ<}2RE;ߊX9hk~9Kȴw@*DyY_P5cu(yVvP?짖2j<`ŵY5k5,~v+A8ں%a-|QYN")/pO{9StIx*`$ y. CDDDDDS`%"*38TA;>Y ,dWi]kڂ~cS:綛o.3|ǒҳͻI4K?X&-MpNKUyg|%?ؒc+1khdPqT ×ŐϘsL~mzn9N}FyY8bm]OJFt;>I^z%woLe wIG =!X,2}¾nزb:23n::!8֩I ʨl6 3V"+Z{!w.y.K;n~;G""""""JDU>'YO? 7aP?i#(A*{BAyk$ M&o'a AMiG uŵ~M{vϩhsݹ[U+]L>UPՁtU/+ ҈ȋUO-/+Ϗn8P_<ԙCG׳.Cڬ&WCGgqa2ʇg sOw?x6+ŋթclL DJ:XM|7~Yo, _ˢHy* kc-)K;짖')p8=@![ o +{tƲRm`GU4w ۈ==IQ~9?$ں74}V*N".X=^H*fɹXLtvơ<7 :EDDDDOА@[䦑|-t@`%L_s[q{Kg8(oI񦅼<bxo_͚F73/9{♉;krIsMLgpmڨq:$cϗ<GLx=FT6gf^8mhZ c{r ΡoʫP;~#˨aesUvM8DeXQzE7.S>ED}~}Ohdf~)=JY4yqd.ûf{^&ڕ=mДi|փAL;` /"""""+[M偻Gsl6PĠixr/>a=yt` *,|W^C- 3!Hҹ6s2Wc:ؐj٦5=ZTNrF) U_F֫ M] RƜ7AŐA߁Ѩ7qMTR*o'{MҶ R;QP'/~6ُuV&d2'.c.'؝lL.ewGEpVD͞+7oR p,k^6ٟIA.xZ5%(u c \<4ی@gmz4re:EDDDDOѐ@[Mnftת~7m~y^[q&R5L{c9S3)sAĞ[ OpvxU- Y:(ufIy!R19E؊b=.fFWd:mٙ&qkw`x3!]> kj _2ȵ`G~g,yNSտ%uN3eC:=׳= :[y|=EUm5!M 59,_HWkXvcUt2<oRʶrۃ̷!T'e6k>y|&soU.G&`i2yu‹{wq}& ID$]ڊZK7VUuAƷ֮*Z;!EL2?jhYu3g9Nܞ[JDG_y@wlү-F<Ж=Ӷ3xj==+V0y}y]?僓Yx6c-S3Y+gҷN괦}-]B.(1P_/^Ӻ/sg>Z5çÙ2eBC_N>gKoQ=tr`nɝ-41/Uo8j8;~/\z>SyjTCfAx x)/,<Ɉ.y~FgѰT\@|pn'g, z;|uobٻ&͚dH?'f<==puudRRBC[kTԐ@)\XH9DX˪ޝ׽XF F=DDDDDDDDPQ`%""""""""+)TXHJDDDDDDDD V""""""""R(BE* DDDDDDDDPqU DF>|ѧɴZU";U^4kTzX k.&=#VAV+G1 ھK+}LEw;kJDnؘ3*ۉ\V"rCiۉ\+V""""""""R(BE* DDDDDDDDPQ`%""""""""+)TXHcbdZ gbPiEDDDDDqU D0ho> *H JD 7n{8p """"""RiH*nX(NCDDDDDR`%"wI%l$& """"""%H`wkFl`;y[UJ=DPp`̦Xtor*H JD +qYj/JeV""""""%+)T6bP DPqWS)XHR&z7[gsAUF("8>ks7H0 DQBDDDDDDҐ@ f*Ur9J!""""" V""rUYenaļ9,u&+)׺k2Ky2y 'o|킍춻5eK0c N?=_ j1k^n)_[DDDDD7JDD-m#wݨBȿFkɡO~JL4HaYFY?=kW xN0qSwpI,./!!986Bf<:kHYg Q[ǫ9SYˆH۟DCx,x azZg3w5z1}m/pfjWBqFv$_MDpkZ´s.lڄO*Φ+H''ؼMUp;:-98gG m7xx{㚴IԽY~0ڏYZ["pa´.~\OdlY`YXLJ{[W;.N@nJs(tLU k="R3c'+_ o,&"?kwk̷| e J@|h.ç`G1~>Ej |3fO)6N^NN+v'|+:-4 qN\8CnDDDDDD+).tyط&Z/x)U.',)@żPv[' oϚe!%?2%W*Ͱgro߶|%8 Ӛ VH?;}PٺDDDDD`XHrW5.Cө3/_g9GA6͎|i'>Q=a5簺G!|tGr7'`u129SHL,c]D9<̲{ѱejQ B=:tm͆ <ԥ1F?IMt0*#9%oo>o%""""R(˼y>S[0HhwRH_g8ϰlT`k\ Kc; IDAT`řNVm{'e-vRw1-_|v_omhsfW R}[\z m'Vqbw^d s+=7wۡ}Ky 6EU"""""%Q;8~4(''Azz"x/RP9,!<=g:~?f__ Q4Sn$'F0-ڡ"" W,PD?'f<==puud2}^-57E+q(,[PzV6|쿞Oix"-3YDDDDDJ"V""K?KRtfܲ9 ̺4Dj gkHJDxU*G)[ 5RA;я,W!DDDDD亘T?UF̛ÂQr+XHwXi]ʓ]92Ŭy-|mܮw¬fò|v5tqH!""Wᖶ׻n,ik0' ϕuGyqwT'QDDDDDV"Rex4-94o,>L:a?nGDE`)L;2`VM /&Φ+& w7Ȏ;yw9*4<:ԣι̙0Y:fw5V%)_b 2M]Sy5坘2w4BE8S)("E̛:Ǭؗ Z&*mf^1Xv:+3 & `gۗg} ^;SZX]R.86͙ʹU?#L`,ooRN ?_o ӥB+gr"""""RQFD,8ۗxS/(9.udC)g\?tYpď,MnvӶK+*9cYL:^%ᖰ}̤M\ͅ_Q7Yv[Y``qzXH{S D$H:sdO_OR`taT@9"N\>/𢌧-=EwT(ю|oie?,$}Y;;l4PDDDDD V"R"TU˺$*W H?sPYײ1s6pHnᴒLL6+~7L*ʯ p{&PF)#Pgc9 +HJDJr݇V(niu=a[z~uvNFLLGs۷pLg&7;^ydBK?!e7j;̙|CR}[\z m'Vqbk8 J9=XNeu"`'xu0Ovܰs%Nv|ExGcU$jL- lŢ ADDDDDvp3h QNN *D. U_wGt=^g380QߔTbCKISy6^4}ٚJDDD T"IOO\]]1L7|)׽nhh˼vꁘt ED?gmZesoVH!""%[V޹c !"""""E+)J|N+ q9@EkR .""""", L7adl&w~>Ʋyvi"""""OS`%"EZ3cRu)Ofvqd|{=y 'o|92Ŭy-|mK!]ѐ@ώ)u?U;Si]DDDDDi DX˶~F4M1.{?ѝ:ԪK ~cO:P ؞ƾe1%^yq8q7Ȏ;yw9F ̞P# -:֣35/Ȇp4DҖ׃Og?Nl/y~1ߓY<,ì6SAPG7H Ţ3YT[vU@:e.#/~οc!N%Je%rX<Y^ Yn9UwoO>f ("E̛:ǬL=rxbsJ7[/|K^*'i7|SZkon ydHZዉp&KQbaJ3ֳ>D`Hl}:Hf|0' '㬙5kc~[fa|;?s+R:|89O6V}GS2gIl@psa{gaV-͹mx!/ժRa8o> o؜bιj8>ћ`QbcӜL[u|m\U[+ g9Ѕm{e^`VQ+)7l_vMRo3ebdNMS5sߵ61_~ƬږBдA4,9[=8qmVTrƲיt<uyc&UbvKXR2k۷}l>MfsxMr@:2W)V"R*0ua)W*i+ǔ#gpn?8c0ٳ9e[χ {Z<ǢLJ9=XNeu_qoF>0n7a`]>fq?W;|Y?IcܱA558MNAl\{66}ɞy }ӧ93Je[Z?I\κ*Dh8>ږ]9؜,HIaq 9983T}U:_~NGucVlcei[ Gnd2)""[b RT95遫+&3%5 m׮Q=P=DDDg4C;GvG(PLkxrbYVU"""""@Udɀ.гx-i^ώ)\+V""DxW*D!jRDDDDDM&@DDDDDDDD V"R䝯u?3,eZdk֔a/aÌ;di}a<[*_wZueOY.6,"""""%+B"C d|u]JV-"""""%D3SklY= ыka8*eiް1Y%,eT{9 2>K0Qq'pT6Y g'T G5Z^]R~KË+ál=:7uשEHyf7a:fŜp vήs=h_"ɖ^'hT2722ү`k{UXл ܱ*}s" ( O-Ex-_;'-z]bnb_~?Sٙ3gIA`GN Dҏ}7KmԽY~0ڏYZ["p`"/kW;YAt݉uaQ?/cOC̞Faq$hf n@%ZYŢV"""""RžT)>BkQriYq^cCexۮ#x3x\6R:`'fdH9DĺoS+y7>R.gR:l6hu/5//9qǷAc\9,11D(APxguDDDDDDQ`%"FL!1)յ%\ \l[8t:x]\'G!Kz@ڗ.m3HQc?n0ylgH&4^}zCaB[y{Ed՜N8@D;q =8CM3WLH4rRzXoa]?OG~&˯ <uCvaՄ|Mzg.dNX2tbEDDDD2j8Ïp8HOϠBPEJ~wWA amIrH_ )2윟>NU )JDDDDDDDD )B:`vfw6D*+a%"EZ3cRu)OfonM6HϏ2K<&U"""""R,))rؓOq\J!"""""ŒH1f83+|I3u-ʗ3n Wc!=tX3'ap{]ܲ9飦93@GY5 2OS%"""""+)5d:ZO3y_eR+3 Mi:""""""(#K?e/.Rnf4j?҃fiQlYp#w'q|y8_[J NԮOV43,2}\c6oe$l8)sJ "%3ÇXh-*Z.M~b7l$ D2Y7s\Wz{p!|#[ g;Niu).tyJ{ 22BPj=?4QܑǺW+=k֣MM۰漢{&g I9ל~sݰ#Y8t:j=qޒf(|;ۢz^_~O|yEDDDDDV""W`[9e[χ {Z<Ǣ㎼e gGWY/''|FֶD:ȱ֩bȨ ?vw == o<@)_E׺Sywz@ W,PD?'f<==puudB^-5HQ3 UOfodi##VHJD<]ngK7Li[ 7ƪ0"""""R()"2VMUnKmҤ_7"R9,eÚCE)XHg8SdY*HJD[Lkq@* DDDDDDDDPQ`%""""""""+)TXHJDDDDDDDD V""""""""R"R9t?*HJD<ÙɯI(""""""E+)b"82 JDDDDDDDD V"R(ݚ2%lX6>xK$"""""RRPD ׬#,1aNSm]E)XH``%D;wF2EDDDDDR`%",߄)XHb$Ǔ6@ DP]ϑc*H JD Ge'6,cxDDDDDDҐ@)T*H JD r,V""""""%H`wkÀ_UE)XHea$Αp(""""""%Q%JU OsXHJDDDDDDDD V""""""""R(& IDATBE* DDDDDDDDPQ`%"7TiwwADDDDDD+}U}& DywOADDDDDD+ZiFR+AݩRE*+\UњlJMU)BE* DDDDDDDDPQ`%""""""""+)TXHJDDDDDDDD V""""""""R(BU%mOXRNG&jUADDDDT J{{ѬeSDDa%"7Ԯ"SX%"""ReZD9Ƅ'k.DD DZ2ADDDD %^o(93O>3;Z^(9G RL+'gﱬ;^-?4w{ɋ3~${VN~; ߀.,]#"KlADDDDyuIlNcYfGGS uʛpt{%^lV@*@"r˿]Lٞw7wn$@ޛ?G},F/ sL^YKa2mx'352[Wߠa""""n\mg;onJ㜬@uO㚷Ypwզ寷s.,s9uM(nuym|[0/] )7Kƛx ^~ހ<׺&UCǥ), jVԕ""""""1GER}t M͋ahRÙ_Dg8qLts?>;bjJDDDDDDCa\ozncaݤ3XZ5bh3| }K*wQlc`Gt7kp&pa8IԾϷlvVM7N Dpg_KcjJkUl+vL_LDGx*Yv"L涷%0eűyLc^{[^7S/Ĝ8O: H=kYKbhd/?sl}ֽ4ib`|s$T:&L,ԨYZs}..i (oIJŒ/>/D^eƐX }svy\bX9,bjR(]FǨ5nUy?E|X:;ha r'0[%x_;{<4˦QD oJD,+U5.hG%0GE]A։%ѿ&5hi$4K2s>4~qsgl"Sfǔ1imT5V^g:'ݟN$'&Lbz,9Lɺz5&P(UɏUs ye?Ѕ*\w*V#WjP7^=$"""r".Hnm+sBjx~!DlfbW z{3H!&&!~1aפ΅Eq?$NG^)DƤSnuܰPXͧfBG`J`*9E\ML9- fJzSlq,?HƬY݉%&lidӍuK.+ȕu>az;Ɨѿئ<͑X5*b`Ar蓬.@x4R?޷>=sdP;ո71a>Uc:3>#3 5D[o?9q9|̙9qR Ӟ} W,PD?'f<==puudRRS_ N&M mZŧfr,fpڰe4|~_{*fc8 miˏ/b$ g*gΊЯImٰ;#;(=Ç=pws_?XH LluVZ,OY5+\O xUHAŲBp_RXv2|ǃ;]z V|gۣz2'\[ocՌY}e64|̾| '5}S2e(MޏpWliiS4VE9pVnD:ڿ<Ψ|??roՏZ&|:v&}EDDDD(BAݎ5;s%KZ;C4BD gܩ{KW!l, 'KؽxpJݛH`*xXR;`U_[{q>*Gb'VfwEhC)۸!A|m4;kP==ҝ( %sn>81Vr>-MZԢgtjq7vڸц!Emc_ OL hM&8o8ңٻ-Ddu;ՊV  n+vnAҙ$S F1 :MXri{5E,]KsGO7w-H:yrvwbJD !23Sa7#[{ Z[E765zo-nl± /v!+$eTF;j?``%l3N[GN>KZ=v>cU{֯ߦ>BfƟ/D-Z'&w L->@uzhELl9y@\ɶdhEj~>"iݴ6RXtomϾBpϫ|Z"X|V1y3 te{w:|2̫$I$@R8 <zNż=.%wp*cOLh+ !W,Z]@a0ր$_^Kn1+8@9kgX_A5`r~o3TJs@:L I,QH䌶 !m,&آ1cᬅjЮI%ؖտL˒X,[2.'4-)>9Uj7O92I^N'Щtu3&tepֲ_ %I$@JR 4g ;?θmвAumgDۇG.mALh͞((Ee I*W@6I& =2-rRz( &CSjs>.jFd"7&Bz/qc2i* ֠^bqda%4zՈԖN"`}v&ar&.'7َ'cɉpeBVDҼmbB)4܊h]=f-=WeWkBg7ZB-Z;n? ?-Jn+_~W@y㤽c$IJR  %1m̞&sP^JJذzOx1٬kҞDE d_;{J=nŅwٯr|5+KjAWSiVrŋؙwS9v+6/Z @A=cEm`μ t9997p_NEojћuo w~; }=3'&Qzy=y?:ߤt%1'mߠK$I@MB˖..QPP@FF&VdS˭tت5Jc햌xєII $lYل*mƬ-B vJ"A$yFi#@yoEǗ&***5ܹs:Z]{իh +IG)=['}eYںJ[ю qd=@[gyJ$I:dt]$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJR*g$INU3E$Io;I/VJTsZI$b`%DҞMل\$T*.Mq=ѾK{ "鐈JZӦB$IJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$Ia%H*iP"Ha"XI$=+I%fwP th=?{ϓ$I•;*,,dԙ=)dX-KZ59낾x"## BV$I [a%2<7yV._iX%&99\y/'LТH$)JA_~~>cGcv B,t%'c[0mL};OJDD$I‘-$" Y.K/oX%& \zq֮YGA~>EEEF$IaJR),($?/uj[0HO.$I oVJ($I$I$IŠc $It $I$IV $u"sfYeL :{_Dx;bZ<<>I$I:,]A;' ΃u zGSSn}Ϥb&$1ID؃z$It8XI:8Wж6k:?B]5zt=]vhPu9H$Id`%),!/aʚPC/v}o v˜7}7|y EX<(?˄'9h4^}\VJQ^ z_s%)K 7G»|AT\su{a͒*Ѳ~!I7xHښEasSh,nwy~d$;X:-sgӵbiq!oxo}͂H*ulQ[m>{ʙq ]WD h]Ϥ_2,#~C*@(RP:Q1}kt/7]-*aPnyu9@ۣUz:]xWĖr?1;/hQmwвit*oG ި%`رw5gF1n8 %I-$2x% +5Gڔiįͪ嬥% Q3+h<YFE=Dp۱1oƿtt&8z~RƎezNyWBǑLe-!5ʍ7uzδAyS>eWpIt11ķECΊ}qL 8<{MsN(G-ggK⪄]M~p)>1%WcƲ%$.sHՀ0.u[M:ў=7QP&T{R8;ciHՍҩ1BڷڵtM\R5R6d6?5n=n&fϞ͵^KZZ\s ;ӧ7t$IQJRX)/Oڙ5m^̣" */ܽ^Ј5իU!>-[H +NT"JX䑼v+!SVDN&NP\!/J:?NvIJq X,]BZ a~+Ҵ^ +VbT|ҀN ߺmO0烇92Toܔ]O沦BkXKQ JhT<Xn *ԦYAjU(DyH΀[%''>}0|p""l-I553cN_=:Sy1u'(׼L ^{x(㷗eY<<'yqUwnݿ(*y!4[˫۝'^g_L9Xt`Jy$!qZ%/22#GryqwЧOFIdd$IQU+)]v:&Jg/̪E,'>*U([<@h;3?ғY`%U_ Pwm+O}(S׭!ikypN&ԭC Ǣݤ& XdOj2РV=[vL!%P*m)_A O8L?fVkČ+RYj'!JѴ^o(**w{~ѯ_?FITI$IGŖ@R8V M?eBLe}6/rL8͉>gYu0~\2ETSvT5oBdӁ"(Փǽ̏__tdZOnǓi\3Gߒzzl IDAT&=),E,~M= Zďcg/q{TON*Jqn5g5g.I(P989n$j'ŭ+q. (hHSN|K87t֊o$0MY#`_$IV*6Jy(dT-Z'`ˮz;yYS6W̽N(P/lOgcxo~:e[÷Nq 5ңF?9eS+ݨs,=e3ͷx;C1ZM~h]6Hɼ=e>coT=_C1$2.$Ign~xUߏ6$J rڗ4&f<<ۜcw!xO'nׇT*x!?|-x#J$I:7 -[wTTTDAATZ9M-/ҟT(4F}Av9I,t voVW亄cܟi/sCߐku^g`S\Y (%I{m/">4QQQ |R;w^Uo|j׮Þy&%Pt '@qD$I.t^< VKu$Itij#JN+yw앿@9N{MN;jR{$I?[XI$I$)XI*1,ޔ$I 5k-t~)o1$I $@ @ rx]Y0HN^Ljfbž$It]R]yL>igZ0;S$I kVJDDDQѴІ&1[gqC,&&H*zʉ4hTh""ld-Ie`%(::eإǶjA~~>B!$cdd$є.]e[$IšILl,ŗ82TdT$QDGGi@I$7+I%!9 IDD`аJ:ǽvϓ$I•KӒ})I$++I~@$I$"H$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJpsgϱ$IT $I$IV $rrs_4>C [~:Qi3y8OXRqr_]7w`9:5НwdLs<:}ѿѷ#63}ٻ/X= I$iEYI1]Z{͈J‘mNenGoW(>eS-*'vv & =$,ޚ$IC"IuN_<6ŏ;``|+n9(E6}4ZK>ʨVp;3s34?„Gf*]|+O_АrFsQp94_%_dӴ{6=,C>\HrA,:z4fB!hޣgi?EdMMG3i <Ώl q栿pnRD_5ژvdJ?>2KQկ $IJ:$b2i=?g :JΩWFTj.M$0y=++?="::@_3\Ӯ"?~ʽ8R&FǤ S;y&-1f1G, 1)],23C)`W+A&H#kG }) .^$Ib`%MhB.~qYьXV +G'LM|{|ӊAog5<\CDVvfȩ+#A򃍸+9!8 M_P.YS'R*)j~Vzg,]w @Y@y"g}עJ2ϼ&.S_yf=SbR 􍆥K"=+T$#3ڥڬjS *qrk}b ozI$I.x}~-FT^{;R\=@<4'="I۸FL&9ћY?_!jujO8wmB|*R7`O +iDVeIkդG2XA0s++Y Q:n,gLe3=ynִ߱`N6O>:6к 'm/mMYTUk:/M1a [Юb,ɦ)XD-`ɦx0N`V~2K%I$!th,7;+ ;UkF_w|tz;޾g /ȭ?ѱcyxQ\^m}^S+sݫ2ArttW=P/YѠkGB8.F1'Y׹?ws͐astOkT{v#=A13Bz\r?9ht[1@cNk ^_^nzi2Oq+@ {/ \`w^42UoħנLJrat>  %I$@MB˖..QPP@FF&VdS˭3nHxwί<ǹЪ^lI$I{T_D||i(Nvi_5w߽NVh׮Þy&%P$I$IJ$I$Ia1$=>GJ$I$I$IŠ$I$IŠ$I$IŠ$I$IŠ$I$IŠ$I$IŠ$I$IŠ$I$IŠ$I$IJ%TfOØ?f}z,$IT\khx "鐰5<,_dX%Itb$x f|7ÂH:$ $O>"H$$+I%*eF Iv_ $(J$$/+I$I$+I$I$+I$I$+I$I$+I$I$+I$I$+Ia(Pw=;a҄WA)"I$IG(K )dn'եܜX&ǢH$IQJRX+]`YOZoA$I$(d@Ia% @ #d1$I$(e`%)lnT%m;R-$I$(),ty 0b"I$IG)[XI Q?q A-$I$ $YlX6qgԨf`%I$IG++Ia%?/ $It2V"*VI$IR&y&SVdv>4(eQ$I$(J +y+KPqXI$I:XI C[R !I$IG%JR ,]U$I? $Ep&MxjD*_| 2i?OC MUι/.Wi$Ie`%鈷ᅼjȃjגq$I$-ǰϦ~ͥէbB^"I$IaJҟZa0nw bPۚkZ>9a%"bxd<֞vsuf\h&Y;fP_4X`(>gSo2-W2zp_j63o73xqA949*XY4DӼebB)|:aZYC^KڞLֽ5W>]O4x*ZԊr|gk z'dQ䨐Y~ͱ'7u)X̤ ˩Lܯs: >Ӓ$It4}γBRv6o΁]U .y/kŊ(CmݲԻFnՒ1?-F,s*nN/$I?'+IZP6@GT~ 6fd lSۓI'kyP i Ϣ&\sh+\`y!+x*1֢|V'',I$O(Hg%˹O9}_153D $-Ч?3yzF.j~}z:Ti),ZhST)4z.rj5׍ʍEи7 9=м{9/ԛ!XI$Is?qoqs/n>/RIS|y9]NOعz!ץZ;Ô˸Lf==Ӿ ?{S/ucl Qnc5ᜫmܞchq t"B|4t]n_>~ S`$I5nZtqh,*L*ɦ[}(0E! sA$63o73xq$ImؑA:T_D||i(Nvii̝;wӪU+ڵg^ADh}|Vf[I$IaJ [R !I$$I$I +VzE괿Yt &ʝ JYI$I:(騗Y-TrsoCcݚ"I$I^^ b~z "I$I]%b 2BC$I€Z8vOUض#ՂH$IRKV~L.Έ` #($Ila%#oz`PޢH$IR0t ņe7~6k)MjV$I $B!I$IaJQ/2?\b[I$I: $$dʊlz^,$I$F~K^d >R&&Ԥf\59E$I#+I ukXj!$I$鰳K$I$IŠ-$ ʏ]80a~TFJ`[w0pm$I$>~CL,Uk:ȼ5!<>v!hMh9dX$Iae`%I 3jZ2GyS󼐒$I+J!M3vUfirõ\ץ!ټf&oyƥ-fTfl(YnI$IG$+I:!,Kk2޸tjOhܳ y W=Hj^{'L gt,M\4ø`"gaί7/ P$IHVt ϕhϧ[4{tvh3Y~qL]~k֩ q&gQ?OI$I:?sYI:t*WRH^W<ҵȥʗ(PXIJ쟺ege$ItsuI*k`pO );2$&$1dmg&lAԍ}ziݘQ/$I#-$DoZO8`Mf2\ϧG_zqY8gc="*w cpAnx$_-I#A=/, &J$IVTJm+`]s_ە= em~fݧUV?k|R^~L\HzvT:mc\ *I$b +I*X;u0_\/2/iOʹGǰ 4嬷dGt$ItXIQ/M ţmeoZgI$I$VV$ؼ-$IVtEQj* $I›$%a#^ٞu-$If`%IPA̱\GLD"?ĤX~.g?Ĥ r]ؽi.I$$%*O}sz>g!$I$=+I #ݮ+ѲzY"w2}$xs%bWb6c`Ks $rޫp}%woFP -WݣcW.hy'8y\$rjb ۿmB49]Ljr>gt/rX$IJ$ByWٸ5¼=yw^ϞūOMeG:K6~i{qU*&wjAR[>zUթGt DT &2N枍Ԣ+{%sO%7]ΩE4MO^7IJ,5o"/$I?J@h+KR {BD,O`>Kd@2vB2:qU*l91S3~$Fl+id3|֔k~-Z=pk*t T$qkP f?ai,FKG+>-I$IKRaCfqDzp;O5>:HV6moK(jXXU76"g<>n|-bBZ9ޒt$Id`%Ia""?y8!?} ?+ &~Xȅ-zqvyI[mُۮ=v1ƎLx7+Z'q]Y9cImi䥒$IT7 -[wTTTDAATZ9M-/Q`@,ŸΆ2|L~>L %IQcؑA:T_D||i(QR;w^UVkaϼzuma%IuĵN X2sa$Ie`%IU3 CD&>~_XI$I%J-,(] IDAT2?㭃$IC+Hˏmc0iL #|J$I',I:Q?2۸wN!I$I$Yl[L$IJ$I$IaJ$I$IaJ$I$IaJ$I$IaJ$I$IaJJ@Q s_ͤO9>j%I$i)JJHLg)$I$iDYI1{]^:?__z#(_Y0I$IVt :6>Y/7J?5[SȰ\$I,$Yl[m:I$Iҁp +Ia\*T X I$I0$]ŰlϺC$I> $&ݮ+ѲzY"w2}$xs%bWb6c`Ks $rޫp}%woFP -Wݣŭֿ| :yA~. 951 ?g!r.kBV}939|$Iҟ$RX5]QPOTzwOc˩}Z{}IԿ=U/VCt#~"ԝf9)|܉߳] χ9J޼o+g Cy1nk .c^ϞūOMeG:K6~i{qU*&wj|R[>zUթGt DT &2N枍Ԣ+{%sO%7]ΩE4MO^oɈ!D$eiI$IG+I:Y|Ӕ)o3Ikz$,y**),^_rv*n {\DX7b)q1{i__]S3ү?-dLtN\ե [fNbԌo<7?;{g?sLk5X-|85rN*U]85(ǰedOViI$IG]Q@qT\ώ[Hz.\y { <A\Đ),_cT^lN9}l]ۢsdЯYQ^7o ON(7 ;y;@tFq{`0@N 7ֱM$IS2C(s2β/"ffKP~}/!ޢ%mZ7FT m>}\LYTz>C.Y^2OH$Id@I:Γ~Vegw ?hsMwo_. &s _WleOդ,XCO^^d(َ3~א|-ۭߖ>-Q԰6@An+lDy|K[䵅hs>%MͻDSg٫Sq5$I”$Bl+یSr"U!/qdMx.|Rs{B#kD~kqzKC~&~0wWtnA?;^!h2 <2eo'9!Y[n,$I`ؑA:T_D||i(QR;w^UVkaϼzuma%I"̩K-Xɱ'&&̂igWǿ`tuy,Uhߠ%/oX%I$9+I ,nQēiCU|˼\`mvޘ =No"7 *w>zO$IJD,=y3MKeΟOe[I$.HMn45FqCڻp}&0G5EQAgLSzeM=Y=e`C9$ ΅# *" 8lh x^kًZ`,9GsعR/EKwl.v|.m'zC?h,u{oU|rwIKPL. pZ-AFJXkg/9'z?M2广[?vל%=9g4\~'ݣ.;?⪜橦rVtO:6۩W:eڽ/~7,㖷skum)˟IZڸ;I;tIK3gڿr_'1JUydO^dM23gf1==rq>ݛ4>Eq_>glty&vKOO #]|_q;tqetrPǑ9ΝNMؠVoAwΓ^uK*KΧOܖ2/s3geg\sˬ߀t,?39$}6zmwD=|}9S yƿVr'.x4fʕ-IS/NϜ_Q~rBquS!'|1GgA}ZvIŊ7AKݲ s+3TT^zAνo>k=V[fE%?|f2Yv,GߛQ򁞕UT6ݗ\sJsCӚPH[9\7_8GܑQsǎi7>&q_sx9`{rǴ欩3#?L޶m<v׾i6GM6jxN?Χ~o]4:.o_׹FMu6QܛOZE?NLiߜ]^/XS޾Kst-0.Y<*RkJ'ޤTw#5_;}Z8<{v=:U[ϓ/YyԴta fgvڦu$e>$]ȍu:JW^;}2/fœs~sn'e1kś?x>K˩xI+״MvdޜX^N>%lh+:ʋs=e.;{[y_GԕK$Kb,Jr,\YIz:09Kf-M\ue吺MiͫS{=mWz!FMLճ͹e§ү^Y-vٳjdNZ| 5\wRwQjM֕|6>[ƍ. ui<)VGxT}Ϸ:-ϏE33"3Kgg~搏V+fsE#Y@1 Vo,9&1EL)9&w #6VvI>wxU{΀V z)9ӡ9rP`lJϼ'dQjҾm`lJi$e( ʢ$=w+`9 `[7G#Zn( 5u"=Ky3|,x$S$ihl4 &[tK4d`P. 6Zv7~h[JɈ +`rB|Jn~vN6 _3`cUJ}==)P B ^!y ֡.m `&XRyq7s̥fql+]i + EP+ EP+ EP+  ]!ހ$ `'XRyq9{Rm)Ic=Wo(0 xWXܤL4wP+[휓~}\g6~=l(2Sr?CsZCH V@!RyOOLɢԤ}CH V@ҘI>`%XRZ0+u`JBi순Treq P(˻OeZ=qs~;2BiEzV7fYrI P(T'I `#%X- Y)Xl\Bcͫ#ږc2zCH V@1~'[8MeCXh@RyOO<蹇"XP("XP("XP(^5mVz= )^ )^ kHN)ٶOoK6@mjkm9{d^C x[T m mg`Xa@V`@V`@V`@V`@V`@V`@VJgr By[UTJT:fڊM[ 긦l޶`*s&[箅O;ֱ{M͡JUUV9ݶdF5J+u`ڊb<|}TVVn+΃ZaU5rIԻsE*:Ў[u{MTUU V LMMM*:s;R.dv^h./܊2UUUkVXmѪbeee***R.[Bz?W~-V^6DU@TE"XP("XP("XP("XP("XP("XP("XP("XP("XP("XP("XP("XP("XP("XP("XP("XP("XP("XP("XP("XP(RNxeCCfΜ9楾~wP[&];wN]Ӫf~-HZАQM7}K6UeWdy:x :Z#j9fٲ&umi̜9g.=̛.];;ֱ.];gμykxGU}rm۴S( B( B( B( B( i.ό{n_~$Mlҫo9|Ϧkݿ N<"[: eXa՘W$'s`-%i̘_~-><^vO2ӯ0W<0576G~!5Qmјʿ+g˲NmC<.l c&d4TO>c>Z9svgK.ɰaү_7O7_=! /ʱfB}:U6qc7ʘrd٭̜ޝQS]J4c~p9=ztLMӂ̺\ssڢ]ZΓW_lYޔoI!gs/I3s˻͌m~e2ryٙ ﰓN:):uAѣGvGAnݺ+_A⯰*uρ~$#umZ>;n*nOUe#rxV.)N[>9!*їɌnCGoWzT|ɓԟ3?=Ӓ[ͭ7;-}>','ztμ˲yߝyfY3rc19S&i}1oI;nҾ!Ղܹsp9C2lذ 4 =zt9t-Æ KΝ 5l!9ϔ+2o⃹e'>Ɋ^2c.9vͮ^X԰ɀ>hIѻ_k5,sV.r<5%)upᢔRRz~~M>5;Vl=*ͩfLmiK%֍i鐎Jɂ,mlLJҥsmwz8w^P}{s衇^{9#ҵkWj->X̙'eZ9p#Sum5$IygřTN$SU_ꛬ7~a}JU6ksT]shuʳr׹eM|is7WfҗM=OΟI&o.sF͜TmJkwRÃs%#ڟGOO~xrn>i~kfl޾"c]ƵѓSѳcܢ̺~, 9L=7IŲYyr伔KݲS͝P@uuu[/GuTK.b՛A|JNîύ癙2kqR٦}l]v;޿A=58fR~ epś'\N+uʕ7׭}J UF@V`@V`@V`@V`@V`@V`@TSqCcj߽v3}`C_(@ EP+ EP+ EP+ EP+ EP+ EP+ EP+ EP+ EP+ brʴ\.{wB*JHVRYYi YaԔ477U@477>MMM `68ƫkUKKwh V.6Dƫ@ EP+ EP+ EP+ EP+ EP+ EP+ EP+ EPue>z'ǯc=6߹oM7ܐ矜ct^(`=̰V>{3=RG/ ޗeI32~fd.:O%s͍c'grm$r nHz.w<0uiRcrЊrѥeT;g2duǎO?=W\qE:uM ufNR-o)d,>8!K7s.n$I65Il4qc䗗ޑNת<:Gܜ_;{}sU᩺:IR*ϊӿqjANRz,>[W3$XZ1G}T K/L%YQ+/] dyמټLqR<$iet*7Mt{~^(ZVe.k7_A)_ _zi_u֮*QꎩNRJU RN/$.<#su׹Pmm$ GK~VNtoSJeo"P(. |3V/h\ƆU_ڡW&\ܘ6; N;AeYY]5{'xbA믷 (+ބ]ҩ,lwy|+{}(n>67L(pyں]Nx$cgL'(kMhb|d߭IUSM sRn+ΩmisLhKz*JS~r#(:%Kرcsi+@ڷoN>hⷼ\ުK7&;Snf %`@V`@V`@V`@V`@V`@V`@V`@V`@kUTnM5b1`ãiL-/ƻ lp4W{֦R:JR*++S[[*ywD^xpHB( B( B( B( B( B( B( B( B( Bz7\2---)]JR***ҪUTVV+kVX555>bPhr9ͩOSS»&X544x7 j`68ƫk j>%B( B( B( B( B( B( B( B( B2P^?vΛ;$YziԸIwJdaSUmG&'{% G^ 74n@k<ϫsc3m~}Zj7M~} }V7 .mN]N{ޫ/ ,7d=5?I3fYM6c9c9z@$I͔3ovCrɋʈs[;|c^/\?*7d/_?^M9%xu.~lIz|_ W=9oy"G}/eJ+d߮ Ưy]sU`mرcs+HNah6*qWj{IueO<'SNT=7.cg5f\2: OcTw_淓p5S֌2U=dPe3ͻܜ2[x`_#O.;sSNgV]إwoW;ͼ᜜[3vVs#)_(?ztn\]$USsݹelͳmӲhz_\LkMW=ө-zCgߕK61u[GmuR~uV~q#);knڒy?umYm :4sO<,Xx/DUVof=ӷrtFwђ*3y3${זR9e^5/0ەg9'I#Sm]cMv7lgZsAEc6~:'Vr9gބ2q8<0ui77ǝV_~%rO1mqg{wI yrg_ɝ?+PoO@UݴycU\4gqձc8-5[UT[83WM?D9n@~];쳳hѢ :4Gyd:+ XVoݎyo63az0?G%ʶ NofRCtP1kwL0IҮO5nl J3دeK6]It*'=i2d]f挧3~Q9}_xk-$-Hs,{nʒy^uE^=}_ȯq&faedϺϧ.w[?"ϾhUST+S~=fY6٤c)Yf[.׶Mi_I^X;l ./ Yr #n41nOfY;CJIyQM$iyN}}^ܐ$ihZˈQ꒺$INx"SW/w<U9Lo*y;j;=fv)Iml\y{`zWR0-#L.%+eR!ރ&I>32z<#<4-I~>k.|;x:th 믿*XGOJm>;疤O~ۤKMis59r۔Əsm7KuMc7{00$GfO9?yeMҐU ZLR6M]qK4zFlӿ6I:)cs+n|2rs֨eٴ<)6^"t=IjR~zozAc>&Mg}7Ky4n2 =t`)ޮk(j h;sM*Ν7M>Ve7):mwmTVIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/path-operation-configuration/image04.png000066400000000000000000001134371461403617600277600ustar00rootroot00000000000000PNG  IHDR7]xsBIT|dtEXtSoftwareShutterc IDATxwxTUI#I:.  *{]Z߮RW\DRIIB Hi?BBB$0<<0{νgϼ93yd@DDDDDDDDRp8̚5(|m@AhU/$éP%""""""""nrdLzz&&).K=%""""""""5l6aР~=!CBBzHDDDDDDD \nngm2Y0Mu;a0LEgvӲE3,yyy$'tB&*v; <,J`߾>α9~,ډ'33t,6E-N T0ILLBCCiڴicq@FFfX&}|DDDDDDDD_U=rmN:xڧ?sX0Nb_;dܠub?ԭPϧъoHLst0"ʼAbW&\0݃GhV^]biٖ>B$""""""WWºk^2kRj|︊!829qᄈ'l<}k/L8O7YtKxf+ն˧w$u?x3)>:/gKsȒm n+.ug a[a a3q+&\ܦ6mE;> ';yys 0iq<>ڇמMjBۦ/wр.w=ÃE/},'>miqSX b4h e`ׇؐUVLDDDDDDjK^Zid8?3y0w#ń5cmS}?rF4ό/.} Dlq~1La+{ޑ}fgn1h?b0/`O^6%{@K74!INv\Dݜ4l75M򢙵;.g`[B;7$]J~tn뎗L_ᭁjڻ|oyH}IKd+hr1N'G+Vk_>EÚ5XjU7z""""""e,BɔEw6w1gZnC;ljz&Ϳew*grpCрq_=&JF츁#ɔ}c` AD'K }c"Y /~,a3ћ8}H~9}{ ?3t` Hs&ngƭЪ,( ֬YW4 {+(r5ye*]<3[Z`O66?|`à'|qmG+M2X3uYgm)GW?2o?ds!L79;oLO9j0}BQo5 R8q2A^ V7<9?*}D/Ao͓m<4wmof߇0OuB?q?gYr?ޒA)+|Bq|> FQn@ d:.vWk֬j7R G\*V6(""""""`wUkZ3yKtVT/C|~1}~7SWMf>|am}8 ^1(VN~W7zz:[-1ЬY# +9n'e_Jfsv QkkD39hۭ>w+q|ejtvHJz} o1BL 0(*VQ)@IDDDDDDL8jd\). 8=';/\adD)3l#l?]oDc>z\8KfђC|6//_ÍWuK]czI;6HZF\1zX`-_aVɆ<7u6fN} GNj3uL[Ĕe,ܝu\p&(ocO#!ϧ.\l Pn1;SoDk4F&'_\aL]Xf-˖//Ÿ.vRᕈUOBxvD^VAvJ R!q$W|C yn -YǨqT,z-Xf Gq H6fyεދ͛'HQ\KX Þʼn#t>=Cx}G6/@ٛ}!~%}9|4Q^Dz2^TKO<?X_{6'$v^H{&p㽹 >|.?2/Y%˖LDDDDDDj=cԨQCK _["U2]uʷxtiEꗞ\u6[2}udegf: ào  k{QUap84ĄKv4 ީg<ܳ׭[r{у1_ϛoCx-\nW׸ S.mCTtϙCFF.#~m%mMpuS7mpRѳ'u^nۅ\;n~\.)))5^9y'MbaW3j6X<:}yOL:Y` {`f[&#:|$L~_x-nsѳL:INvns~Ü搝ängiKT %軼tځ6M'A1xJp8xn A6mߠPZ sN5?Ǝ-Vj԰FQpUʒt2'~ vs<}¼K?_LYD{6].TF8p ~E'¡%Ӣ%<^XjUȊy3OW{x@yׇ+Z4|(;_'~6~:ȳ^hrO2+2C~'=KkQ/*RpVM:x=[Rlmf[I/cK jJ3=YUvv`ۡ,""""""RڵmGÆhӦ <-_ض}GE{91y$̝WmUyxըa#>xm6jUƏ+W =cU\.X7.xY˳=W}% 1Cy3ϲsNRS@Όq՞z.+~/_36%^$!F|OIn[]<dobWF}᝿<?;*RP?2r%[JoSz AY|$<ÄNv,GO ͮSP4hג?` Gb`Я߀Jn_j+*<Ȥz|ו^4PuX}`Μe;zt^Tod_p6}z9j`<ÿ_럼޾|G>.7Ƕ&{Iv,*5e^e3:kT^kxpHCL /:JTN4~4=gsQe/t NHm(6ϗ}؇c?Bt8]xS3BUixU\4 o1cc)~m۴)wơuU~C Hn';3uV&E>} j'DZzZn?[`` < cn *x+6L5ù hˏ8lzr99M 1*pжmLɁl7AmD Xu *'+-ZhKvu8t6 BC ћk"SmNOfvC_Zz>(#"X/83|}C H\cr Uf,L)Ӿ+`e^=/ye~ OLLuִlќlHH=4+Vdɲe5?(SL&.Jc%qD}^nL_)[^栆G~D]\u,i5~z&tjOڶRלɮye 9}vxBBucx>mlٲcYNDDDDDD.w999|w 6@oB'~w z&:*/TahќĄGhҧOM.^C ה:thM!!^<;pmu| tDك.;V @HV]uV$$&VYx4{7O~db,]=!ɤ#NK O]O*iy]" J򊹬޹ bt j&/%Uxy{* ;ӈ)ˌӃ/66(+2N)L_MFXOİp?/'"""""B~~>}){W|LЫWogZ"H%I>|]Ǝ[o 8xcFڤIٗ_}#}Tqx`5jبZ+bϳ3Ǝsr;vc*զAouҥsB^hJ]Xw: #࣑زWjznpXveӵSuXpe;?$.}a IDATEPr2ȴ)Z 3;yxAE7%0$ YJЊz?_J"']h>޻uM,mVS3HMKͷΆAХsg{a?0-[UnYEך7on^|ɯa nP5Fs~kJi߾=Z5L],dgzɵ2E yfn'i|3iX_,olġd}phNЃVR/-C{nz"qYnL86Knmݜ&]1sn#ޠ=Fc4$m! {/;љ],,a!| lAh ݗ}lǚ5rtCYX3oM#GtlMơ4hւ+v{>8("""""I֭9y" ng駟a8@V-/w{jR @Z>>Dc.P{-yGiٞW7RS_uZӪ͟gwUUxhlj=U>|;#w^n?Ul~k|S?#->B"o| ڑU mK4\O}(+,b.2hXZIp?`ޣ il6 n7WVﻇտa@~|rFqs75_5`1j(!aWmBW8)=3~|?#kt@n?HZjf]lڴW…y =zW^<̳ b58@Vi[lذA^^4. ?̗YECDDDDDڷC=LLL4}-' 4hؐo|GDDak2hpl,f!'`9?ni-[kXreם'1y$f|*ғ h٢YWR\N' Â?n"iۮ1DEG9dddchUwF2mc:DDDDDD ݛlvY.] ]Պ٢Ղ+J=X -LNWF_edd0/ymh$uHٰԹBs1&WUDXKX}vuoɵ|ZuY UĤ.%oɄU7ȥx`\z1[,X}jTwĿU}m6އ*1[lj5 DDDDDD;x`\Ml ּL&_\.'Rga\/xja`Z0~%WW5 ,+ˍrGDDDDDDD.aLfL&f&U7W& Z]DDDDDDD.3EDDDDDDDk)JDDDDDDDDV52+""""""""JWvR%.Cך6(""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^ˢ.,/Ζ{}ē_ خWu넯ڝlI̊'X lJd\Vl`}8DDDDDD`5py=|}c%ghu0apZ`5iy5w~-ӇDDDDDDDNEn٢ Jt(S]@Zz&S͡c->_@Z^6_m}5i ο Om-ZHQr})kocP^CE4'g_FC@Bx-v?1yyvf_R>W`8#nJƁ'gٕ)Q֑qߝV7g[]M@}0cNKx˜Bhw3okŶŘM\?¾37纾3ڲ_?OւA_⚺XwXOHk90JO{|ƃWSEDDDDDīi䕗۵??)?Ő[m-oŦRU!wڨt~2X<w2ßeǞsjз?2X2o%1ӿbm櫩g/x#z6uM^\߾4-=-;o{#pGh5Kw=Oi.wlV0jх IhWxn/svC["v5#ێ& igxXf{L|""""""^y~97o7ז'gSܝn59H&zL8REu:T#Va pæXs4f4.~>d?fK+ o#66{+{vngGƭs.QI2ӶxBrp؜-\4i<؜K(lֺDI3kycjn> Þ{> M,ݝ[3mmYǺ 9wleuSyhJTTxiAgn2y@bw)/^E݉A>v$f'{DS_?Aw{xj4jcj@-,S36 xᩫ 9D~ WLxMH=yx7\vЕ*pV[*gj69=`TwKl_b6^֟*M 2Xdݮ~өv#?Ԅ#x!?l9]^KqJKYuA}>euate9Yk2BXt>u u>i]^HCq=Ca{(.!""""""m:24eƵ-HcÒ5T.l-9!yT/8^ͳy-kW3j\֢yDmFpӂu%4K~֞bFL{%9|m6IqnsV6.3!6 h`K(4NknLXv`_)ӈ`躘VҠA kCcWLeב'< -Bۑu|){׈W-~qEk} WMruY#cI8jA۾O+.}-$$+F4U 1mJ{͇sIRMN6/NcJ_c*!ރ* ?^$l _mEwr_y?NvJWM7$;v䈩IJ'!jk~&'/w(V=rذxWzy!]=#3 ~r{)FCcKlNIPv#[^ɫ~ay\;?θ(noerv{{tNMNP~=l_.pu'wdсKY" 6?E)_2c7sm;0c8|1>J^0"tG$):s?t4^<ֱ1bsɈŸƐyyx@xs+55ϒǪ6\=O{ rQe$}T8WoBg% 2v)n5 >WY\oJg;W3WޫubIO,ϔw3x9ۙvlZFyG.xu[2]t"!^8Cz4NVgrS^V2ӟ?j+ 72I9>S_9ԵsEӉVëu_񗳂+>퇏.ټ`. cHa3y8+l:9_U ! zt&2<=¦urL;}5n-`xm%a+_Urݹ.Et?8WdڟY%EᓵYҹ~Pj{oRJ *@Y|}m4f8S}I?{7oWc3ӟjv36KEDDDDDī*5R"`rkˢmÆv%*vGźsyJwVڝwO>χ󊶥Y['tpn 8lӼ]$;697- ,gkͽ#9'hA{,J'!GӵiW**9wZK0Dԣ^HS]~8y%6=ҷ2[驃M+X=U>u0i S/=ѿO*kUpvިC$8YSC يu:爫׏{}D%&!+S6!h:Q#DDDDDD'3 '*4,~#}N'"Fk^9YC\!}#ūëu3y]{?,Om&Yf\җyr6Rw=ٍ^:qeH:wjO%}`N9%Q2XA';l#nYyBgu{&b,؆_~E#15ff]0oK[S%%2pwjk ܟw.=~3brT|Ϟ2Xubyp&3U)z#?𗞚&"""""""%>|{ Jsw'Q"*I=?anT㗟z5ʝ|Kw9 ֞bFr~z~q^TwRlᓧ_{ ^LY'9(G>4R>j>?o+v\63yoÚ~O]7ظvo Yɑڷ?r}@ 5Y|Y5?̓M5򾉈#ذr Ƀ~_:r\P'n6lLk{q{vfB:bkkdmeƦtTFz+9ļ <8>LwԨ^yJrDۄQ8ݛWMDt0Cxy$' O@MW#[Wbˈ`yZO/|^ GJs3"""""""R,5%u/cR%ʍƚq$%:.Cx!\ ʧ{O"+w{*t~YUbW2Ub`Zތ+ZZ`D;3l̍'"̺kDDDDDDDƘj ruzҊmsǮat )I(:t>^_{gz-;]g+Z>+19+ O'ܕC?JYSv9hʠ%6=q[{DwԨ;hJ!X2\[V3U Gd`יk`u̙1OMw寳BKp+4v=ͧ))lSvUOzuiAXH 689s?o-$3yi@FgY1?rO;yrHthQk`F(jS*ǖ V DDDDDDDD@6 DmaAT܄yr۬.*k"]_fa&~oEXe5q[V>b>{o' uw/+v_7W+r[VD92uAM>3α-|{.^n"""""""R3LZ嵧<{=h =~q?OLzu۰uѴ<(-Z$O_T # -a$r5"""""""Rcj!ßdz̝9%;sdvisoNgx z[٬J"iQSwu9M})nf,Y=C`wŏMhݖ0_|.&L݁13uf39[W[W[W[a^4mBys5sৰYܚYjp/35hD?Ex-˵ 5JjGl}nl)+%PZSVtޠzKOmn ¬ԣoݥݙnm7΋W\W/y\t]kSҽg>VWe2b IDATfO٭6Իm]-4%W/VUEIjoJʔ-rCtu]+itCyܚ_Sߩ/1&w(8Aj$B._ޜv@5Ʀ<*VgÒdEC\XMC}_n*Pr)N:˦)zmvWjWٺkU>5sRU+oS(*c AK+<*$JíI/D_95aUffWղmZTXS]ZE`C6-IY?=QʢjhRoT/O69e/)[*TZ]ntϊl]jˡqLF!\K,/Dz^S+ZР}Xa -v + TƺdW^QǮCꩫ$Mֿ/oT?4B:)Mv✺OO+и-Ť;;k.+j+B\') T8"J WiyF$)25F C}T}5Op }6ԻmU'uv͚6 *-2iNS' {G_64iS~ڜiZ&*[9f{ 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 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 a a a a a a a a a a a~Zg41$> XT^ l^W7[RPXF?'Կ>ӿ+jE] ˵xZt*6XZ3VӣgvkTiW:0G:Gʹ%/W(\x5hI珹Jo! z~$i4Q xGϼ?O+ɗX_]1P;>ҷ*OJoWW}fDq!/'<aWdZkYC\ZqwpPIINj<(22ihrmޗ%[u\CTzwiK+TtvCL,Hf<1@QM~A>ToxZ߫dU(w,='Eao:C>Ufi弯Aw73?nݺiݺu?zu֩k׮z'Ϊ6;+2]#wLW#zuⲲ?|M%wdhǟIm2Su߂r_F˯,`]sɹjyhr-oh9BJ<ҕznC.WK UءEGu^rSXR43pHNN̙35d >\SNU׮]ʕ+5|piԩJNN>6o JRvr{W zaWzi4Ѱer[XoGZUwНH}m|8äi̙JKKõtct`pU~V\]W3t@ ֶ¬Q_&mH7n׼d1鉒V= KY 29ZZJV۶ԩg? W8SՄQE]/R΂ t饗*55 Q jBu5e88|ߡ%)騵o?<{9l^,I2 ub}ո[uW[&JMMըQ4{ٳgkԨQg}p%-W1.J*PxA0Cv:fsu֝h \E3wj[~ =hŷ3Ts`3F'N$3&~guUj`IdXn[}(մ4!cޗ\W~Vwe-)u>o2gkڴi_P 5aM).4CZ}("ߡ2nPi-_OXϣȀNLӔ꫐|ʯ詍.uJ4tW'0<@) hINU^sO;l>lo`M՜NuJ4tyK;w@5QKLf8teS_Hw ISͰAϯT[^lk(UԨ3PA0(Ʀ24B^?$M/;>xp䐺't]❴gPV]Ia\y&f\x9GcS*lëez4CS-lëR?sƄ[W[W[W8mD-~A]|F^Z4g+΋/w9 [ow ,. yE9qi6uEM-\69MKefSܖ^;G<}2uWj^ESz_߬ڡE岜qJlY~qlۇ5MpZxS*.c 4mT@s<2uZl";XI]O_R_ӧKϒd';ӫUOfWs"[I;>F9ڦo&8 6F{V5ncq T|<_kĈS֝5q.}t=z=L٣*k4z7zsY*^J]sIJ%_另j<(RJksn"#1m5o4B?uz1ʨ,٩O={2E?vqH{2M$SW =fjjz?{ hwPSOͰ1F)\rM&9tU}worTisɈ8YhǨuɔd 12Uiy#[}}nȴ ]T liYeulFZeR@]a6 %I k:`۠Zxc|}SUE]yV}Z;9|Z7Q9I=mەI+oNm\RYH8S߬jzMmƏ3:ئuAGeJJU~5q /.N]W]}T;zyUn2;VY_IbD*9E,^0{ojxzixIY棹$I>.[ 2~*|ZWJvz7SKō:4xn* k|=N]mYUUakΒl՟>+G_F*%KjƟ4b\}Nu=WEumv}q?/ң^??|}Ouw[Zߥ?U}D]L.^O= 4Qzt}&Gxz.׾ЎCResմӜt}*"Y#t(^ҡ{8ms5tc «d_=ːfSdSȫ ȕ}h漪o]_w樼WصZ!?ϮKvlvUWîb,F;qaI޲a(Z%홬VԷ{7ui I.\gJea'#f'O>FZw@KZ7orߩэ_F=k:[e9U۷ﴽȒݿUJihtI/.n/JjڝxIWC N\W6Zc/6d)Ei cdK륮R2Rm*(< HTRM܆ԥmC 羣VJ-?sP[UQ:^m@X":IFRV%EjhI$K3gW`+#th`]s^y1pm$-'jȕ:lU"PoݨG.設R&*q25= ߱BsvМ${?ƪK~7.־nHtm y9Iw;K-G>WeEEmz^/;ހ$Y[zwvvV|:JĈRl̡\rO&Mj߫DIt贤0$ϟ_:Q3;hy귷TV(E't`T=[}T?5mw IdjJݔmL)4L6&]KRɑ1yY>KϹQjcO D)VR\WncN#ڥ~`?f݊Rk./Ӟ n}RemTO/ixh+W*Ʊ}i:B_?=FCI 1 \w{ǣFO)/F&2+\北*WI%%Vae*(g ]#k/lS x^7x\ҪVJ ԭgk嵭I,m*<~h1kd<mw~2//tNѲ}ZsY5r^nN2f,>I+c)yNgU#ۤdZgܫU?X-ZY ]zkͿmݫjDzf}6[b#t7/yV(~dMɭ^|[K, T@M IʚͱK^6oLy=Jrz :i՝U*nxCEU.W w9K/?WMI}}ɼW{oIFZ_K6=rB jp/tgGM7>\^OW}f}5W:0Ӫ׳7ݭ}Z{Ua\uԼ& IDATG]WIZ]$vŝs:m^7=5{c}z+t۴>w_͑&?r#GZ^;vHl4󩴴L-ClhO,V _6t挐-Q_ecEsfU*,T![BQQV]}y,Ҹ6ӽʑ=Eum8FֻP/qk)s6^y}tvWTMN5n >yЫ>՛k<$[TiWӵэvdt UrcvKk9ͷ-{[tP>bStwk#_VјD_i}ѯ\11Ѳ~A|۴ nִ1N k޾z+j^|`tqt]/EpN#^1l!a-u;-i:BrIbv-+-+ bxJi>Z؆W=S( ;gT ۧ .xp䐺't]^ N asYSP:^~8/Wa0  04ч2P IxUsv%9WdKd! BZyehK3}T`؞Ҁ&ftL iUfD+%2?wkVCϭ ( TZDKYc{R"mg_xUsit*ӕM}_eIR_j򚚩L. Ueu)&˲P #_\^]Mi +MpExExExExExExExe,10\B^Ve^0VWe);|7l6[PX! j+//0dY~?w @)˲d$4 iUMx%U{.K6sJ  Ҽ&dGiIpb59i2 C@ ;$-f+ΝFL f7|^K~?WafF[!wr3˲x!|!.GgS/ԹLV^ny^&zr486 i>3a a a aN d&onп mz{stNӖrݣ)+4wb]u%jڤ7@xu 8N9l6Y%˲zx\.9cT111=NYYDEKG.'0԰a$PsrhrƜkJp8^DQQQ2MSeȲ,9N\. I=j?@@+g>_68c۲@eTq7ݮqW$}2avÍy7\Cj _~;vf;48:*RڶҀ}N=9{BUTTjG-{߯S'1!^ŵZn֬Bm㦭j$C?j@ %Vj-***iڔn];CV'rdLpZ# LӔS~~'''˲,lZR8,𪤤De9-^BaS#KWhM:X\SM7Ԁ(!.GgZlrs d6S=Ѩ$7ߗPrreT^TTXM[IFC]vp)I+мkl~%%&{N|N^x-UoڽW99yJII҈ ^Z$ionÖ6%%z%I1WV^֩`l8oZ}z],-~պUꛞ;kЀs%Ie)&w"##NrťyƧ==o˯)?P IoҴsթcu OP`(""Ri lUb7MEGG׹>:Ka6oRqM>[km4RmܴM{cT֚5eLIRJJ|>=tj԰$)//[T1r:ܾKwu??(׫hE*/@SVYyݽֱ~J y:}nw$)1)A \EEŲWQQ}۸E3'iqs=;v3ڸi 5b`SԔd5mn WzzZU#Ks/4Իgwusr5ely^%'%**>_s[۳$Iɺ6kJNJTNN5삁ڸykSGP)ǽ6kJINRvNԽK'I_LbMb 5yL<(YRrR#Y)s{n?VI۶i ka{h֜tezZiڰaoߥr~~~aTajȪ+z"%'%jEGɪ&ܾc:uhSwfVZUؘCnM:P[5WaA&oܾK۷UNpZ#:h7 Ð?ɫ~)W$.S^OUʪ[+>J~/8(I  u,+8x]a+ԬiZl \?s.hȠ~J|Z^:UJJH$n\Ξ={դqCtV}/25a*,,PAA:k-IJ!w?QglW^]>I#mԪʪd%%+%KJJЎY?xmK߯ң5.6V[ж̝jܸ1CWۣ#xcWϟ_\?V( MLWfq` Mp|>LӔiB|>EDD(%%%8_U0c+.uV]|NۺuGKs"cm|Z-_߽{QUVkg_󯂯-YEKP~{z?yZ{us^ X!{9{A}Ϟ5x@] yjF-Y\ݺt C,++׮=uXy}>Un歙e+ K*** )ss|󪴴T.?s:s Ӥp𧁚6S~vQ2eWkjڴ.tbk?e4**Rsj}vݟiέGTRZ|~ڴj33 OPvr)""B aW_jyu6K<^z=+GޒWjEm싯}{v ,''O|$W7_Ą:ʛ﫨Xך>sV٠RyEfzAճ/&ǫa T G N۪@^#IҭWkaGN~$ۣ{5s֮$I*z_:wlիi5IRLLڷk}TKm;hr %&+_$EDT몬\OiQ>=ԦO swm7nQֹu(ǣiլ tjӢY-XLsY= Cbocg4Mpnl6H(""B@@#*Hj®#~ʐيUTYV^ujҨ$TIUUoko>+-7/$EDV-_d|rҮ=Zf: %IVSat4oj{uhSYQQq\.ZlRllUZRRZkEKt{sNii*(,$kRfEŤx*TTdbh 6CW1JHU\BsJγuZz0ql޽p}ڸi^{C9Cڵ7f+Fi6c\Duhp\翾e\}zu۽Ho,RTd O;޵fS-ɄI׷zviӢ%f)!>N.X#Uk5R(,0]:9ҋ4k};gdI[7WZM=ok e9-ܱCeƟeUW%s:M#VVV*0N+8{EEqZC<(I?nXV^e N:]eiUZ~ fF ԻgZ,K-\6TzRt㸱unۡe+Vk<EGE*--EݻfM3NxؠT4ilUVĄxuhZ];Wa?fؠTŕשL;wk5+PyERկoO5h;t-0UI*--ir\lNYƄW8N4 X^{ Sx?[ko}NiЁ4अCxŰA0tMhAbBtm4[W[W[a^ljDS [aA%0dY= Ðn1)0.s\r\@/_`V+4 0df#$a2 C6M6M>; `vSB*j+˲z@ |^Mx*!f4M~|>~1M3XռW5W5 Ð^uJeq^]uxpuVW^>eYVa9B\I!o0@i+MpExExExL8Ri 54(,HQUxYQ X"+( JDAPD$i#P"΅|?2s<3s=},,x"^W,,x"^W,,x"^W,,x"^W,,x"^W,,x"^W,,xrI':u#Ih>X^V+au}+ jGUʷъw ;cj9B=𞭕2:w&-@ 7PzNJȤdOjVݐTTT<%$$TiL+$$ڌYyr]{2HJ۾A4A@=a寘[Ms)ˁB{%HY&{jkm"\rxe~3[c^]r>SO֭[Oyۭ[m۶z駫՘UxU/KCP?ު>JcCL=L{|50ZϚ^-b$Iը[UTSAhPdzj\7^Qοp>6rHEGG{ڸqIoqFu] 1bD3Gx~mݝ'ItmשWc{ٍMRY䋩6I [?J&=sۥ֊ T?Klfm>/#+Ϟ*8/T׮]ճgO-^Xm۶=67nTϞ=ŋ+66ZYW U4,tzuK4.]Sag7ᛘ|KVk]T5n uhm֊mEAQGzxBBBak…袋yu֩o߾Tu3YWFuM*!l^g7/d9sZѥ].S6p*9CMyyݫHeKG+Swas>Q:w+RWǎϚ5kt5(>>چ+-^4j`?3C^>{_ύK=Flnޓ_,=?;? UxL9pV)X۷/_^qշoj3xsOB1/Gݠo~ؤ?/,o]~^'ќ}UaH}&}Nbʡu>Np֩]v%׼y$IvzΨxTMg鰨wjԩuT1+ːl۾֚>Z[ )!P9O| ~8 ծ][K,W\KWeΨ* X!oC7Aw o҇MGUTj2:!T6%)F:`{<^;3 U֗h]ӾB)$Cy vKrnAnBoRnOUzvȤjzag ]X[*(մ^wk_fJE֬vC{S_P{6=>S{v$ؾQ@@4mּ Ŕ`Y+X Ee`Y+X Ee`Y+X Ee`Y+X  Zg:u8wTuq ,+3L< 0} ,^*4@`qWB@g^)'[ﰨq0 9vv9ξ H*avuȯ.pjW/@i&]^S\ӭ\.v̾ e^W-H M!(~M/56/Q+V.,y"åVцMvpm2vy ]) Ӝ/z}Z!]\VVrQMVaTQjTwK,&1ܦ] h$ M庥w{!˯?=3rч46z9BJro|2m>UaՊ>UޣW`īC]A2qs8 *yDOb[Â=8G.n-Ft}0N8Bڳ@'/>bT>eѶuOWEr?_Y? "Scq{xL[_K?]Zj Yř{JǬ̛fnj[Uhӫwkxy%㮑,RTL=*-4e7.D?~'YFbکKO 7הkGr{M\Ry%C^;Ћw) %J1+3lZe{;şѳԼ[t۷u߇ٺWuub &NU銢 zŕf,9u}) U;=q=1j /y~-c0Yovw-yiVL"s>S'N89V1/z/&N\yJv⻎t_vEjڎMPdkDc0}=}՘0Ew$hī*2+ؐfS_v]^~Xk^epZoLWwi@cAX:enRi4]|E|iިbvs_2$W_샒?izrVt+ U'C wSۿ|Yk>({yUb*k4Ίu:K/ ]ߘ[| 4i2][ѹk)o~KTkIqԧyWZWhä-x+!^U7/ߔjmJ$S_BF$LXk^y\ cZV;h?P Nפ9+cZ{%9ݠoP0C\I2T۔q>lB3wuNH:i Xʵg?EW,;G9nn=~EH2g_up05u$[?]XtB)P?Ӳ)\]6HΊ.3=EUi;FH)ɡGD0Q!śi$뺧Rt*[JWUdʮs?ԼQGNԧ IyGnw5x냥{~=QDܦtmT]UWPEH:`4uӟ-Z[7];|rOŊu:ҝW?Qg+t*FFh֝u)zB‹m^Ao~MLW\fM),e0XGSLKgX +}_-KזE4PyOAo{Jc?oYѡRzG⢹o?X^Fɟ]f9ã#)8%+Sy+aA2%Odz0F]ԻzS{F.weԔG} jtVGuWS\ s^$_(rзdTgy\iH<[yMvW}zeVãMK5t'sR9Zrh[{58#T[zLIRNm"}G5}[ZW`ʛ]:jcH*ԾEKǣnS΋H՗ʶ[O+gU{+(Ԏ/hFj=+Yί5^Gtij^_zɦdM~⾇I`?G*>F+ԜG'iQںO +Da$If2 MyaEvҍI!J+Q~e}H_c\i"jyLvuiGg%[f3orv|~.l%[tzhM8zfsO=LSj+1>^ڹ3WZ6*WP+ ּIҰ/#e('W^)G?9$X6)k'GJ_>͜eS7#IF]C uV7~I|5T[u%)4{£zgO| ;jiدKzzt^{\JHhznxf]`_ԯZ=;Nd8:UWg]`^~> yٔu*q?8Aj5yz祇5wJ!MLֹьޭoJOsk{3s'dw -(Lm΂ y#k+lY$3;[EFl5b:&e<iUW_ʙ{|V˓n+ y|L[3 =Q׆r}o-Ԇ#'W^"C5s+QWs4ڲ7S^Zh`8IR34EJtdYMGkim8c[ &!_f+oؠ +EoKNg3מ5_ӵtEֆla:C % zx"le`Y+XeU'LsN7ƫ v9e?mp99 6d'bRX7+`qorIw$҉e,^!08LJLXHj_5@ H*]jJkӉWV.ïL9μRӭ45oX׼]^m2uE-v{@g^lEҙWŅ5ERҝz~_ xJ0ScZxb~v\.%ؼW}2MS*_y)_nwpT̼ TrzPvl6LӬ@`_px6`0`U6VEe`Y+X Ee`Y+X Ee`Y+X Ee`Y+X Ee`Y+X Ee`Y+X Ee`Y+X Ee`Y+X Ee`Y+X Ee`Y+X Ee`Y+X Ee`Y+X Ee`Y+X Ee`Y+X Ee`Y+X Eeټ^/KIRQQ!#qHR9?hڬ9K0$}K̬? XBllk&IኍaTp1T6\=LtҊf+IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/path-operation-configuration/image05.png000066400000000000000000002212671461403617600277620ustar00rootroot00000000000000PNG  IHDRʑsBIT|dtEXtSoftwareShutterc IDATxwtߜ@!ޥ H*((MD{ z+E˕xmW@A (EB( H IH Y+=g9dBDDDDDDDDRp\FdVeCCxM=,x<ΝkCHJJa׮9rǣjaP.,O>fhXybbsPzHDDDDDDDy<^^wbaZJu;a0,ynςZ2339{#Gn)b^JQDUTMNNf˖Xbm<ډ%%%$l6[N޼rTAbU"""(DUSF`Xt zηNPP=̦[GDDDDDDDxxx9Y,V rAm\.v+6qqegا+˘{o7ut&M%gmp\w߽ۛ=z`ٳg2ut&L'_jpd's U3E.qfeu)""""""W8ut, qy{3g]e„}Ui6W"Cݢ bاH)gZ.T@ƤI0a⹏C2΄ 0a)Vn*)R.i~ DDDDDD.c9kj+k^(%)%""".ʾ.vl"eY_"%Aq2+8xJ,}.99bob\ =N{/[7`Sa3jfnfQPAw""""""ga8x`?/}-.䲕ި@!,##gJGYcr_؜^_4k='/OIZB6aw_3g{ry5KQEveؽ}iS*.8n&yپM#Èfru{OUd]8}{)ĈU ގF_j`( _^*ՑG/,'q`PUawliėkŠΕX;I_c[wQnSL)dXڑNl8o:,F[@iЃmk ,9N:PN->su\JDxuZXwP% ֮;cT/ٝW+%ݫ~wgmTokE`\)q}MY;gF1{@B09>q_:-P诼R\Qŋ]6yk׆eVpoP#DDDDDD].'.&̾+ow#4ӷ.g^ah;j-KN5p*wAvshb}52/CpLҝ;9un\U4<ζD؊-`8]OȾyh|>/_Ă8z8R5a*uhlao-ıkf`y>Kl=>U^;Bę:YAmx($ox?%t_eiXjZl_eVºk\ S޷gqWP&""""""pلWsx^L+!fmR'"3 ?[`P_5|j3~_+PPPzKf?I 3fǺs]د|ɫ{z9ƌaܟD>? mfw cJ\F>ERCw։afм/9swzxm3ͣMnU`_[vB}Z!WyRS'z]jD?2ZZzwvc6NHl+KmtʚW5gn!ldƍ1W-9V~}!VL}xn9}[?NvZ-=jIkdlt|e.|gffo<9]G?LJ_>/9 pAjյ僙 'r7 ~[y}V\|Ԡʒ|l$ 0Nf E۹k\-[͖7R7_Zwz`;EDDDDD$l^Z| VĹ;qON_|(~'.'YNܿ˧1GyAi؉2vN6gl{kw緶ckVhC@ : JꀿzC5(mKy8~WWDZzY÷Ӵf0tf|5U4~N9nj^5lO{cyaUvmp]g<)Pgтb4,k@hƎde%e?i&V^ڗCa; Y[Ǿ'Ne2o6;u٫xkik9&5{=˲ef& hMd쵤;]g(Vfz Z%9/aa-#x?oL8xΗ35{t!"_?,aw;_$rrDA-x+=fc6jȲe˙`AksQÆE^0ux;^ʈ>y |Li ĬL uhGd%]ϴw>L/ΚO>swq~^Pnu^‚֊9doKz<ؕJ>Y޻^'9O;4X~gܕԿ:ǥ3HgxeC 1}/)NKYOyG:3ᛕј9q ;y޾05.naٸ`RGg}}̝?_`""""""r3za<&{vo^ZHXXlHɒԁW}ȱ2t^\HK/}88zX"""""""Z_fK#ӢϽ\øG TGJ{UJkkH>]J#.7i- 7+#W3Ϙ)@) 7\Rp%""""""z1 ȥi DDDDDDV2l`X,5R,WEMP(զ) .KB+ͪ)Ŭ}XbnJDDDDDD !a`Ub¼ ? @Hp9p nԴ4Xamݚ f^W"";wN2ߟ |0݋`hќAH2޼9-772j̻\U>op)WAAӇ:PV-oζmL>d}R"~pwwƟ'z-#qݙJEDDDDDyɊ 4x=جE ʕ#)12eHHH]1x |_&9X*i'Wx{g9zh^ZlmuОx[ .ݺӥ[w @^63sjP-ZdI 2ҙt8t~&NUV*%hu>g FF(""""""ѱcG:utAp\f $U&a١UPԿO^WU,#ˇ3vȼbN;#GؓO11:+(0z qg̙'R9:֭[I FС/=gמݧ]CW^7`<";.Og{y}GZTomCyezU iO/xfC#<>U29R2Y:c^ƙ}Q>INiQ5 ҈ߵ3{ QѱvtmZeۅʬTìە]DDDDDD@Z)_>5kcǎnMUeظyE3f0x 4**|8C%"u1>}nׇ\zG,z?]LHyjnfO>׹\w}7v͈fcyk=Ǔ篁 ~0KY0O*JkŐ;Y%o|<}3'So3t9yק m<π?ِarje'|6}%yy+0崃*HséыN"]},, ŗ_]2HUUI rwնM[O{nhO[n›o}޺o?[z̤ɓw; JtSJp&S{hVed9mѼ]^=Ly6B*3\g`[իM4nPuwn:x{WO㋍ԫuvFCqظimڴgxؘ{_.657p%P1Nnۧ6CiÞ3q:^1 X).%b8֫& íuifyR8lVͪF&DFaH壈 . {cImP_XylZuOXX+ bT!.-6ovOjgZnkc78Ssnf㲟Yb!kV%wHʂ,(7U H}>#+vukZ,\Ӫ۴%$$#Gч$&%2_O>hLN:}_iws" Ngx. (5sTbh5Mw(VO6x;ݻQi<1;KI9 Aa1H9~" M'h@d_M-T'oc۲1UTzV9S |4ٞ~"10" q\UDYώ4/baϜY,ޕJpԢm ̛Pl1;[sM wfNdĜ,]ilݵi^r"""""R%&%2v=o.ua|G3SSS0 &L jĿyO?SdQf U[Y744…;E˅asU`e3>j{~vڴnhꏙ{((H'8+qFS&FCxQiT*$IQ4 %{fy2{c}h`c͚MHu#"""""Rڥs}.wN[o@Vٶ'Pw.aTZC8׏سgo>\.E:D(wMG)ZbnӃזҲEs6aaԡ8jT5WP\\iwO>2Sc3ΨڊMml? M'9#!42qb3 ] uvm buK&JRԲسH5GI垿~fIN"jS?a3ipH9_O`+A\DDDDDt:OشiZqbUlڴO?UA&F|N:uЁ#ߦWϛX_~En݋}qx%7 /^̙?EkWϞXAp}72338 j o+ӰAC"*DQ! "'+ I0ۤ͞%[YpXvlH Ua}ڔ; G<[!3&* IDATh≑iȰgwY~DD畇EEtC .W1lY/!Txc-TD+8~(cG9)KJqN,z ߰j?TDDDDDx<w0YDEEMfV&Gرcx<i).Ǝ>ǟ;sy'x܇7vsewmeq`>8+㉉3M0hؠ}Q%jcO)fY_kƌYx^^|s&a zǢ5m[>y֭KݺuW'`i'N] -bw^=oio*>]p w=ų׵YήiX6 ]|u!$}K/Gͩ^)CT^pۋ`U0u8ٹFTc (}uA6|gUl'rQ#/mßd83ꤦ{XlgZo𛐘1y=j}>eU1ѡԭS|INj_jPU.'^w#w[**"gAs*G>xg8|ʙ R3BkԯdÜK9bx\6ڽ/{?m}\酕GԢ^p"v}Zkѻ2uHV«& YR ]T3m0oM 32ͼj x"Ll\=IE|6} .1o@5ѡlI͹gFq8\wL]"cЎԲx`o G#^k?/;,Æ_x$6SDDDDDD %%BmQSg`{:[ ?a_R:NI۰/_y[?^KI[v9oj"{w26 Cln+ScnA`qgpdF?6ǽgǀ&rn2cݒS ]SDDDDDDzwh֬7n,7niӦ9RO?2j27O2t|2U^l=,m<5s)xt|5sy^:Y0ps|8]tb>_RɧbiޙPZ_ ,T7pc'vӶ9sGvpMa#xo|:2lpU]* a#&h[˷߭[ֹz7ڈ xgbdV~m{QVI~yZΫ?֗oյ7n'`MgڕLt zf*7*_<={d…ye .gϞ .Е1*Ї &|cKv86<9 e6Îc@Ǎ_wH Vbż5ôiӧO^YŊQteW+iBY}C! R]n;}|{LۛV, .)*VȯJΝӧʕSpU.L'eB4\ieC 6ZCbk_'v1/'10M.#KgϿˆ]:ɳ#‰U[ru6acNmPR":: йsg,X\>U`>pe{?:KƴY4c?I1Ю ˌ/f,,ݚ`1v}~-E/=;s:9w5S ?;TDDDDDDf5C^5hLsy,41psdD^|@olI`į;q7;uz2vH# af_]Ug2x#ۄ)eZ' n͈~0L!"iS M~ X .2^&z3W*qgqqod#$2l)Odztٗ-+SDDDDDDDpF=Ldlۢ^BKJN.-Z\{;EDDDDDDDRx%""""""""%+)^HJDDDDDDDDJ,W""""""""Rb)KᕈX DDDDDDDDRx%""""""""%+)^HJDDDDDDDDJ,W""""""""Rb)v`U """"""""Ũ}kJy""""""""RRiڠX|ig]DDDDDDDD 0^\*72M)<0N9撎2MǃsJ%""""""""NfjbٰZv% rGXy<N'2,<`a;;t\СtजÁjJK:mvs,->4*kD# QZC^DDDDDDDBH*.;sQ/pŢi;jaiӝ%"""""""R-Dմ`t NRD%;m0\V""""""""Ee Ky댗뒥F3 M)QvQj+ᕈ\҅Ε%9ܬ҅*Bpu;q?DDDDDDDJ: Jȫ/4Hp8/_lu3DDDDDDDHc^]RFLDDDDDDDZ R=85-.""""""""%+)^HJJ pM}efLu@ᕔ(0즾EL[>I˕{Ky&2}{skuEDDDDDD.0;\_J 5|,8&i&ya;^VFGSw|uǖLf-q1*rq*ufOxBҢE*ITrp[8W/:[U)giӶXc ]l .CZ۸= 3IBjXhT3+\l0L6zOُ1A7M 5| C{Lbu:5XnMYĿfQ_<ޅ<^/6&ִvg 0d-(0%ʟ/\1KWS][| s&}v?1Lڍ{_'ۗs|S^͚X!93#ˊ/V^TN/5 6&|t_7Nُicxq2^k1n~Y7n qNtW?ͧ:7Cyg9Qq| =Aa`1-D(Xy{ܼ=uOkۥ?x# A lX7ws&/w35cg382W4'GL[#| k%?Bʖ'u?Kb;nzEB ¥Թ/!:g[k~Gc[7]vO~n''fn[טgB l{cxD5uA.guәaz'ȴ`8A0:&+`59/ezeܗCn1\mG hjִaM;ĶCigڟj5%NgxèYJej&͓&Yc޴_Ξ7F|zײĬH̾aD8)k{{f0)ڐVe<=-c7R,G^s-Vax|7;spg?m=qUaܑ3(}F0o7pnG #,j:z [W3/٘`eCGYgMaL6WcİDyCN}}#M_u$ؠv<ݴ 0pw?v8&ܞK/ӕ/W[X >S9{ s9 ג""""""%«B2 /ѾfWF`^@լ[?鐗1NVߗŧ>57;=u=oxoNh"y~r쩫8ўnl5e;~ڷS/yǹKDMxkpb˔16MaK1w.9؎ΛLzs nΈG:?nF|(W{cć,lJ٬yy_6W3 _ OygkJ#6fz9tbyqؼ/ \G5CU|]{d/; '{3L@A$(AӎWZπ Dyu!iגW7Ig p}ΛvX۾[˹daԼ}#!%w0nʞ|ж+*lСYsL#{Mʶ]&6v6DZsS`~,J, טSo߿Zv-i``RJX[&.o!xQ2,dq4[#=hnc}k/Djǘ99>DDDDDDJ$WdxMkzYM{鄤X.NL<ۚW.G >Wn_>UtQWEɒD `[8|z33Cޘɚs2 ;x޽Eײh KJK^Ilh3^yAZg@ޚW=3x_ ys\%::;<}4dI||Ɇ ۤ`I9FOP.`?#ݹ3](8|NEtP&'Llehܿyi{&Y| Ru92{sƮ>ߗSַ ~7/-@BT.uKv`l^>#,Bn,$I$):y%3Ṷ[RR0CaKWlewP|{rzF3~qie}Kobcs~^v}E@l 1{î1tS8*=F%M!tl4Ғ^|Txatp_<;-wR8k;waJ:^/ev8S2/H.> GGD/0M IDAT5xKxy1= v\Y_zuLB)svgl={ëI+[͜34BqFR;œGs|ʃ;n7weygF߲\hsڗUҊpfFl)y}|[bYj?l99Ւc3es |3/^Æ\BZuvGΫW/ԤkwSOox3gj$/ˤ9KYq[r)P5gc]ۘzWn\O:$ITy6O'11Xl۔?o۠QT\7 yp- Jk/>ln!D$I$I=rؠ0BCh슭xV6$I$I#'l$I$IRd^I$I$) $I$IY m&I$Il S؁6$I$IȾmSD\&>dž"IPhV啒$I$ٴ`2\Y0D$I$q^$I$I,+I$I$E$I$I"kO*ahKH$I$ x.@QY$I$Iҟ+ ́hW? 8$I$I6v~* CyI$I$+zʦ^$I$I>WDd$I$ÍlBI$I$E$I$I"J$I$Iex%I$IJ $I$I:, W$I$ /d+I$IB? a2gl&5k֐eDLJJ ŋ瘦Rr!Ny%I$IA* CfoҥK "*++Kګ0{{^I$It1ȋ?a<5jNXVPĬ]O|f1~xTFbBv$I$I0 ]opQŊfa:񸽯`x%I$IA* C(^a? ~J$I!v00$I$IRd^I$I$) $I$IYW$I$)&Im~8+o&񠼠3ѭcL# I$_ ٦7M,AKbEսb%I$I|n+~sg)mTZU)kA6z^Obc(ʗv4.H޽y~ ԵAëR,9 w |7ϟ)}x㔲Db1qEW$I$)i<>!fRz}j DʗK+Ӏ6 \G߭ck}[/3=jA^eA{" ^/:<5?Sq@ޘ5Rw].qhU=.x&>ٟ?śBB.]qp9C/c?T3au"MΧ̓}xqzҪήaY2q)r );7x~tv5v,g̓gYHʇkXjK{ C͢!JTvN~B$I$EPPȧ.YTԃ^z*%}'!˹a;y}3{g7_7zH$IdRƿsr\4;2Lt:Ȕ h?s NGS&m%rE;$u/~G\&Y'< nّ6RIL_e}{r5|nl^:R1^E}͒>ᩐB=ǬAZ$I}.XɿvyR@,<ǥI_MА69;| o+RMjPʼnl.RZ6՜W2dbTknt(#vjEӋǾ. 8sи38Fi]9S|'=W纎G|ﻕv~vze}Kc)6Cvji0(FC PD!`%+sx^2 !1{+YdzkOԬe=vb兤íٽ8_G{ z9B{Z;W $I$I֥qxJ Z7-e<ܐ-ZǏ,ǜ![WV .0뇸 r8ë8EsT5%$Qr=Nhy,G=z7Wh=!>幻aĺBqtgoowLJO9M:B:{|F eG12el6qq!%*b*'μ)\2ٹr3׭B غ%Y';&NEZG.dJ/A0i?d6O'eo7R TLu+TNg3uu"%ٺx)ss+&"^ߌ%{A$I9wxu:8K 6a*TK j@y1呗\H!lXFp 0.N1`묏yOh*5ki8wJX8e7ǒhoge2NyTy]fR)Q]ׅ%}*I$I:uȬxW§Og^ Ʋ}?yxg𝜵}n}xk~ z"/; |P{;ǝh9;'NLG$ +RoxQ7Cj8!z]yal7}cĿw½>\=*Oes8|<5qMC䎧KعK<ē (}8,ortÜ{Zt}U$˜|y.@iF'O>kyzz $I$I>rPWq9NZ\Sf-haI9F>q[½3()gե W*m/_1/Ԗ7q!4*ׄ;V0mu|Ɖق󪗢@d &ӗNdH(VkeE:c8UZu)5\yU[:Vi;w=ZcԢm/A+XKX+FߘŔI$I$eWkbEJPBl仗od&Pq*w.\܄ ccj{cxlWn IDATtT:^ڞd1\Wld>ROwyYN=(Zǜyr޾ uQz\yGf~ǐ{3xUA$I$)WI[ fLYKV\Z#đX&gqiIIS'qˤ$l\ܐR59 `uPrc$K5+Z՗Ó3={b m)ڳ LjZm0K:NJ|rυ4s6w:NXɴk&8򘦴.yS)U8S I$IUuxc=\ϼ=lvO^{26\κ3N{rV0si8pM{۽NJU88j9rUwAEK@ Wf |jA .0}l9Ht&sʴnZw?B Σ_T;1iI? $I$IQtPWYr[;=o*7P {:ި3ήǖI@T'0zw̚=1Cgĸ<|W!ds I&$7< ?\5ُ?Xc;(I$Io3U3;qn N{{?] @e)B6(G INI;y+)ܼ#7? y; m4,T3+Z!-htE.uy aI*%붤gK82) lt>㱡xHJh\ڥ m6y:~guRٱwL5wһȳ%2n5T^Fr$ɨg1,7Cp~!U2H$I$EQкu0'/d…̙=k4Cff&&iBd%Lϙw&ݘ}^M$I$)rk#Ú向ARRؾ̲)3Smի@G^Vbyz#I$I2$I$IRd%ZFW0lV$I$I>b+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IY= V$I$IG%q<X7K<$I$Ib1 b18'&W$I$Iҟ b 3F$I$Iҟ. h?Q}%I$I/#P{W$I$IlAI$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^?tvW~keH$IRxz8?XO1<21(J< e{ zCY BR 93[o%鯖o:xnĤ WKv:sY<;_#{J?QPKh8]f0J6$I_9[}/3rk=8n/hpg&hVtk6~(zg}H28b1듗ED7M7jd0)+g}~0ݮjF\r>a0ԾK[>YJۆ$I)tg=H2e}ˠ'>ȠʕwҳUEkr1q~c[!a\>xfjK/[guV^ǒmhz.gqe,/D W:S^CCyI{I٦>[ `7wET 72էtRvTj&{ZuUѪ*_£+ԫsbdy^̤u*|[J}5{twϫwpӱ[F~|iՅ^ oq2~F sWϫrH\;}̥l2(|tz&҃= le(_e&RUz^f$I߭xz"WgP,ӕl֍'Ul(\5yr.u%8W/`س<$F^zQ*}u=IַW8(J2iBWnɕ+cRoA_2r>.͖:'sq瓩c_<~79>:e0}r4sN39)o /~Ѷ9z>Ǟύ״f]3nO]J%};V8({^mݰ l-[*ȏ”BM{xmWiO;ΡJTN=w?!q, Uj_&/'901s}E |dNئʤ("[ؐR+>h[s&}#'c po\f<|SRҾ#7H#\Ij"{qy,& Bqi^.|fȤ5yڔ%ER\XAs1j֝Ym*>}`\qص^ѲAcx),XlvIH xH kf- ݰi4* I(p9cWqlrPNOKf3m+}uk# Xʺ Y@Sylܜ:2Y* ~끌t`on/R?\ذ1 $I,eK8a55IGR% 'ҳ_yF})'`/dƗѝo<+HA9U?sLK?侻y U.KaޮglU*%)A@.+_srf.6T'$nJX:5k֠ZI'{I{o(y{=u7=ό"|~+*F)qiF>zw9m:r_0;B $?E4VB.xOzᩗ>c<\_OW'.(&' $I4ۋE;oO~uK4:^οz!/bbIU<&^ٜi|Ē+d.ǂM98ϭJVZ~V͊on"Ƞ)BJz"]Oq|.IJͨ)gS d7໡o2n!\` |ʠ9OLp"έ@VWeO8,`wvcegnRT> =N#'lEV䀏y$=օ5fH S3#BکQf Jb'tHZ ɩ\Kn: YpgٳA8lٲ6_v}C)k槼&Y9JSV۹5wJ 3xl wW[a {^ObEn*Śws0#WSA<4X2{fJqӹN10)v -ޣZ"IaǙ1DyA9Л}#W _D3eqVKᕈ,W""""""""^Rx%"""""""">Kᕈ,W""""""""^Rx%"""""""">˦v KUH@@1QuﮂiW"rڬZ\Kٕȿ<Ū? "rZ(f*$G5!>:0w0Kuuq.w9EnfJ}'eRlҠn|Tn_feV l2h?.rO~bO{d{Nkۅ23US 3'%]xo7j9Rֿg1:8zwҐ,fcQr1L BT8'[^Y*xWX:{_~K)lE?cL}{o όyb}Q"'yWx%S2D"FyY """v>Ѱr#-;bwO)ilz3vfقX VD9~F6%Vȩ{ݟU\+v 7=aΤ ܵ,0n4 CW3g '"eܓИ:xf,]1""""""g--]\zIJDN_c] yy\:hŁJjׄS J (e&AAG",(oiAu.""""""gBL*F z:X>' Le>͢˜f4:.,Kj,Ҋi,euryiy FtwtSn| ^Mpc"rzq#N@eak6Ʒ[oCÀƱE$`5z}C<ܹrRgcWf5>FsF k'WJPr"XnRVtQ[W봘g!YUcj'ip6#&ԫޞ2yD7 0wcQ~sݯH:kʫg ǔFm<‘#G.IJr2wz^n7%%19C:"wB/&hܒzWq_etF nC8xڴ=oMk]/_5{pe] ^1 rRYߎXpڕ7hN 4{ajF(-gBXedY[Yj5tyH]mίZoD{F]<^Qa:T;<1]Z>L u4ьiM-ܷ93f[DDDDDD}@D|iF]Λt #ZEaNNvQLދb܎XLʈq`HcQiXu;^\ӻ9!u;SN%S7J_cz^t;P뒇x1tu$M'Ve_A ;%: ߌ1J˘p _+_:q(vu(vikŔ];ZkQd9l1 GCz?o2榛Ɲu߹Wm8qډ0Çp]s~\3{;/J^} ٜH3AqL/.0^5؅74gx)%@n4ȹO-D'f+>tJý ønٻBR,!t)ZFILG#,xobۤU<2>1_6ԮEa=a4\̲"/^{-E_׵ó9&FDRhƠ!+Of|qڏB~_f|nv{T~Vݩ {ưwNT:%Ƞ`& ]gf1vڵoŶ-zvzY9k^"K^]i9'G]UѿqQÊc;VuM M;E+yYRّ{f[ m[_?͕R.Z;3YWicxLJ'9 `j}%""""rS+Yun7cNXqLlќnBɶupbȞD),;U-($oa rXVTՅ*`V3>>[0f';䓘~Bp G/p-\Itw*/_ߍP/ kM $mbaZM)7KP͆ܪ'YY9,SOkQkNf}"#QZG}Eg 37OX+l]iGXn^u]9 (!mMX~HiHcb H$7>o>FV~sJDDDD/A-D7oNve.,}l3z'0]ť.[UV*߽,#^~i5ٝaQFvzsF8aPO_ZN*1pSg;.ue:a\5/+I5L*<ӵKF_:珡]QdH ]L#-v#dpU?l;?c[<׆FV4&6,cqA \߮mi3L /ufȵwsKذ<8"tVZJN<D1+Zu+t9tt{b57rEZt:!Mk{8pЉ' ۇq0#æL2g g dR@6]em]zqzh@"せւu3zy lc=Uw$}sf!dCP,N'N'^xRmYr73˰ѼC6=<21I|6gJK* O}%Qڰ#",xo"muV2غs?Q\aĒTRJڎ \sNDDDDDA-DxAF F\@N6,Aa$.DCbU,d 1vIϸEOmIG`QPY^ Juڟy?+q{3vL8Y['l=e}PMkc"hI#\Gw{~= v@Y-իcÖlͦR8*6]t}.Wvtb̷/|FJoƀV 2坹ZPĢN}n*f֐qᐛxf yYVnFC Nqvq./%u ^\ayN2(""""Wa9tyLRؕ0zqݔ2@ wF\4v =R!kQ?#;e[rQQu"; jD|̴R7>_@$vCsuZQ?g!Ki$*Yp@TXK~UgeH_&_~09^}@Gz0WԪ_ \o9>7WE9 _dN2lX,#^aQ7mttnzLk$F-Dwy#9YcYߘ8#1\e'yH.8=yd%122N{mߣgqxW*_AX\dQx9s+]I, Q1DDDDDRx%""rWEuO6("""""""">Kᕈ,W""""""""^Rx%"""""""">Kᕈ6*ۉW"r4TDDDDND(f܄ *ۉW"r$?D˸8TL@@-HS¦ԭ{wuBqQ+Y DDDDDDDDg)JDDDDDDDD|+Y DDDDDDDDg)JDDDDDDDD|+Y DDDDDDDDg)JDDDDDDDD|+Y6@DN'4Ua """">OᕈB+4xeFi"""""JᕈrB*ܴM8 .#r=octaXVLT%"""">Kc^ix nA؟JLq` ۛ&""""JDNC.@ߖ]y}f{s,ߵ;peKT-KDDDD啈r^W"gHqL{Iɸ\.^ #"""">Kᕈ^nՋWADΠ`EykSDDDDć)SN,(קJDDDDDDDD|+9-ԲCDM?Bᕈ,W"fX?^N﫧0_6SV흴yVrNYdS DD~n܉qurnK<2;E"4N<;rq4? """""r&)9ag.I[_Ѻl@FCM~'y={H6az """"""g+i<5b#F=Fqt|#]F+wV&k <~QkjwfW-dUn%f]=W'ml}ۖ[XG#؄qm ; 3oʹI+4׌>7ă I|n.͏^Mۄq.yE{74Y@XӶiWDžb5~^lɭ#O6[5ǐ3 #} f)I/7W'&ODGU?)rGfZ#] O݋JxoRZ ONs $KJJ"=#uwOtT-ZPDDDD䜧1DwoP[ywXOnᾞ_ wL yirKkK`;X >dmzEI_\Dq} YmϿ,y_B 7xlfbFб2o9 ?LlĎj dx;~67YH5bJzkf)y,׷u?aOnY}K᮷6SVMg}q=zNI]9?j@""""?ۊJߙˀZӫyQf1yGy^HvvcU WЪI$W؞i߻:ԽJᖿʌT80Mp{+NGQ2?|نq79 p঱́߭S,F:4;z=e"ry0ٛVQުwN -b擔Q@E4 >zA-[9/L}e>4p=/}sXL^[Hx߉2em1t!e9tyLRؕov)))eЙ9GoNʺW'ml}Q6^7wγ)a\Tnkj#\FoExj$]7 44͆a(9_dN2l ش?uX[5Ӛ6QAsI%2{ %TADDDDD䬧n""+jAlgl;DDDDDDzjy%"gI|:o?Зc_&/ /Ե!"""""JDN -צJDN{7nݡZA5ACDDDD|+9 èjT{Oe[^ #rlKSקҀ"rZXVnsMᕈVV+A5+PHeZ8v6("""">Nᕈ̦ibZ {?]))U3#(iݚ?n|?quۓaುyBMyq㋌*uLSЎ<|w\w}\u1qX7buA*W"r>0i36 ;?MI +sgsg7o>yq'ޝ&Qijaa2eΫK/˜3RQ7]A4>J5׊lNrxe`aƹu""#m:wFѲ:׿׮ó!u9\|fKpfw\;-mRXXȮ\Sk/]ɵx,u]J+'-ނGbf~y#xtYL^~1=66]{g| 1{;\{V#ġY0fa 9\]*,NWo s!|{rˮb&B77޾Fn]W~LF^yPĊI+9m<=?5mD^L M¦9``QnP(TVRv=`-{5k'\&F%o%;~=@/v0t[_X+ ;G4whV!BqkoMg:ԮU*+)polf"fE&#[C7 x'6f IDAT4bHhXN[Fnc'cyznX!+9^iQ Z :+w9KKtDSw5>_ʜ#ILYƲHX>'úSaNe&ߗ@YlBԾU?kkC_%04~m?r+OΉY'Xo9,*.Θy>dW-ܹyCܴ1-!u9 JV%'AdŽXhAA'ҪS>7= Ͳv⚌,YQvV] ' oػexJcOZͯ}e+ RI75;@ ٙC,ˀBO kZ]4,"C--ryjWVUVO *] @\C.ߗ_]FˌUʵZ~ZSRR^DDDDD4\DNӈKcN{jb@4dG\81?Nv2L`6u5oӣ|_68犏g`јG_MW󜈰C8i-dS"t۱f{F|OAkX08k?J8_l24_Ϥ}ɵ9jlƤ1qWxCljҡjQ:5/Tg$˧#<l-^#Gu_]Oz;1n;z?]Du _Ϫ \4]|7ҼVS7 ܁#yyJ.=6F~ Rk8y#?9r$'+q)ߨvSRR3ġ3!"y~].""""""kb'szfb9 شiq/ӱcUÁnzLk$FEDDDDDDDw۠lRmQDDDDDD4`0W""""""""^Rx%"""""""">Kᕈ,W""""""""^Rx%"""""""">Kᕈ,W""""""""^Rx%"""""""">Kᕈ,W""""""""^:a:""""""""ٜ啈3^aAFWgBDDDDDDD$(Ks6:#աlVElW""""""""'ۚ^7٬gmuF[^YVD8|dZ`%^fq)d`Vmye;SjyenZW]Tȟ}E 6MՉ8T,ՊᠾEM܌`&@Ϳ""""""""r|e.kZmlWgce;ZX,LӬyw(:q:gW""""""""'ѲM_eQ DDDDDDDDW)JDDDDDDDD|+Y DDDDDDDDg)JDDDDDDDD|+Y6_4uFDDDDDDDDN0Ή8ա4MW""""""""'a5d4M^版;Kᕈ,J d_v}8=:ӯOq-tx巎֥s;{vv.ANWWqɅӤq.69+(: vłit<())!88)--=5mt񸗱 ?HEEY{9j=!!'5r{<3 Sp%""""""gWR`` V4q:Jyy9nÁrj=# 1`1s{O :%/b+&NY_ lٶ2 =7NxxvI!{g 3i/#pV+9,[}=ԦKth_W͠ ]HK$;;u1toٺ}W2%<;uBBƫjmؼRPX0U+-IvZ^dͺաeftҁz`&y=+OzsQ4ksV\~\MuO8;k2tP?5`4^m[:6oA DDDDD䬧O8`j X,2ftmz9XRXTiݪ9BCٲu'zu(..addfsUP+%բ%ԭ&--O2DE6 7/\zMV`;{go*-[4#7|<EHH!)-+W.Gl{ͺMD6jVQPPjauP;veXVb&fxcn 1bp0 zui$零`x^|^4_$tOTV:X ztBo_v_}=.:kÊػ7 z:?lٞȶ퉄!;;Ҳ2 >IU]O+3zuÏyl['}G"uؗKiY)]:kbE̚~{ɂEK8XX&ak<-=={Ӹ S3U\, 2nTTVbZѭ3m[Ӛl߾{S?xA-"""""g-W¡nTaWZcTn]*EEE_kmнsr+.uxw!sql6zJ]v^v}KKM|nu^}9yܫn 444gϞz sׁ'" "E1)Ke[Nk{}}}kٖm9Ȓ,TdL"98L")Q)6流}FהȱSjjjw\Nv9]fجukVjúᾃzoЮJO.Iͭm|N t*TKZZڧr=ȾwbߧWkkutv7ޑ5]i:1+2򣩎C׍4$Qc/ThhhXYɞԔ_U}UZHs:szE Ŋ+ə(IRnL{@ ͚?i)2 C}٭9Om˪KyVqZ˖.ky\\4_/g6&2R UqT\RMmݧM"##z?p]FJT*##G߿BCo}UWvFGEjfV.V\ ivv^$[ R\\\`@Ps5n}v9]%p!s9'S# ,ϨoiͫH ls9k $8zmv[r&w_-*+g]LC>2)۾5󩭵C;v#/ƽ˙g 02:*ۭ ^;jJšW_^x_VBBwi_0r_{UWia\=~ZZ?&ISQ7,~Gtk%:s;%zp /Ƈ t# o޸N櫳[~/)ON"7:Q]}*jt$o}uHf7jR,^|n|9SGNhbIRXXf^TyFNxFQ|EIRP?QZWCr:0,^/|R_Le-sxc~HOfPqu3xbru UtTf >1Gl Upp |>~ld_dJ׽TYFFF|鍧PHK$ lbښv|u&Fw\7->>FAKh9ij]N==#=UTv\׌Rɡ=hԢ>.dgi*<LٷI\N-*w[0 {p<IRA^**3=zsipxD!!SS2l<1***Bήn5ܖ͙Sg31Mv;}j[ٌ߀v .K2}u$%k|}]glLWjc@9#]*I齝{2f0=0 pVpHBp8w7ĩJNNP挴l]tE;vr\3e)Hׅjllѯ^BCB-nkbܵ_/REBÂ?(Wk9|/Qm]Z[_P STtV\$1LW"",9~J1ъWo_t98넒֡:-]Zt;(7;KkO?d=X>l]˖tjv,]tY/g9N,^9zo}Ge:ص_'OS\l\^޽)itT{U`'l6f믯oKd]ң'dᱛ7ɲs:p{d3 ha\Λ=ǥgت=i)TB>˝%֡y?YƖ-[1ښI劋wiNJUXXu 38221|>XvbĀ*$$tT^IRdd=uCݨ/oԙr]'XtF|'T~Bݽm VzZ-Y8ewic:B})%&اJ:v{} VBBSVf-Ox522 EGEjNA.aeڠg?(;e aMmN>N t*!.V+/QFzJmTeU~4U nvf/z'f1%K> AxV+iŗ$a/{zKڴa- {=b aG{"?'4`Z`vX, ef#Wn& fWeYn LӤ,0 9\.V ÐSe^`YW,+X, Ex"e^`YW,+X, Ex"e^`YW,+Xc:V~GIҏ$صO)Iz٧$Ice7QRRm9wvJrҦ?{˩D,^Mgwjkhv\W~_xV\Ɠ }bZJINTOOG$IM-v|>IRsK\.oLi~>G6~)uHO՚5{v[׶+<Δ<pKȫ]X6eefU)ɉjjnU[[֮D CϞב44<ĄxmݴNQzcjii9y:~N(+3]AAA*P=aFĩWm˯jT{AMͭH<,áfch*jvןz]zd)ȹaUHx|joIffe36{Z2 |"I7JMITF뱭}vh55*44X̬֭ IպF-9ήnDGiúAc[r9x/YvѹK#ߴgPqsyZMˑWiɒ6yխ9sd 5G##JKKQ{GvޯԔD=k_I$nkhhX--mZf6UU_Uxx֭]N*=~58vIZT8OJUΞ$ϧww|mٸN`쾥D+sF:::5<<%mٸNXGU:e3OnUggv9pmoTwwǔglLCC۶pce3 ӇIO>Q32TmZ|bbolӫ]{J-שдy [.gjFFԬ Kh\Nvbc(jՊ l LGTgWMefVrsf*))^٭>th";3zxtA;^_lwyp M`YW,+X&`zi~c1WLSVnb} iથEUUUטCXRDx?,?+;v1GҥKD\ ifrԕSUU$)55U ,f``@.]Rcc X_$)//ʢ”'IA> i4W4Mgt? Ex"e^~s>㘎^Ԋ:*?ϯ~'ҚUܱK~o?FEs9#xb>عW]ֳO߱ _=21+grr$I##7ꃝ{e4Ng*kg* Rz̙J$54jhpX) $EGENg}ё ꨪSDD+5t]6+ӡx_v>رG.Th| hR5G‹JJJP~^מzTI:xΝа#vUfʔ$Sڱ{z{;K׮vYzM ?u[rXmr]?@kVrU`8d鑓:s'ߓuR%%kÃ())םZCÊ_8ࡵ^m:ؠ%E5s$J?ג 7ZN:b},)׫teHȈ$I7M=1uuvpHbOO7?5LSjmumB ",Lv]CCJHTWwvnzn>SM,@Ԫ?u]RMx+RR:&GEF|2̛|TooQ{pN@3 Z{-*xY]TttztL..ӡ`FGudzzI.WU+5O[`?rG]T9ڴaܒ*iZ`N<73t }VnE+/RTD$I <f|+)$mxh-v/I.SdGE*9xT'iŲJLJaRUG1@XPP$3fxc_+4M{PYںi(821\Zah ׁCxמT\\\Q[[g=VD1UUjڰΚ9CiT IVha\vh# מyG>,: (**BM-mZWOƖ-[1ښI劋wijddDe{!w}W[Z5/nSnL=߶m&Iںuk`a{0pr n-e~޾>IRYY-SXdɲ̌w {:upY2%E4 nF/[ߠN>'Iz5JIIQpC_i1 O+X, ivKi G$IA,h``@S av)0N566FLAC\WLc***RLL. bANK111***R||< 1`1 Cifp(11Qqqq|2M`l6vvlv^0M!v&G&G_I"j ij2aսg=^ k||np"q,+X,\*88W/;^^w a|>~61 C6-ܫzxep8n32FxyOl!Nxp!DsX+5&p-KWW~Ex"e^`YW,+X, Ex"e^`Y6z?_)ۛ[;TS[]zSɡ/K4yZ1+WH9JJ>}ڽ;kWv]o*-9sU֌4mڰVC>Oх QLL֭Yi^~U9:W~I11z-jjn՞)áY2rRU8Y iႹʜo`Pizllĩ3:~GF+i*9tTGatF?z{A]|E2x_bx/Z7}|"Ҏ]*4*2"' zULT-]{Kn84M O~-}[_QOo~ 3 CC~jni㒤T~̣}Ѷwwn\E=mݸ^iꭷ?PZj's>F8u965<2<Jz٧ի *I#N6Z|:z2̚9%I:p;o]+91Q|>_ xBS*\0G{K+4$X~iϾC<,L$gL%I^x`^GEEN)EGV$iddD]DX$Iv]nk|OOTzs^a׶]Yo_R$I+m﫦N3ҕ p'8JRٹڷ Mlrz$ |iPiӳ_{B!u5$uvuwvjㆵ[#ͦ/khZ׬Ņ&E6CQQ7,FIIRo_C%!Λ[АmxMM-m 9ys1&:R]Sp\N}l?04$ݮܜڲq; btqM,.I)ɉJӾRy?GN(/gV`v8|LG]==:rgJT(ϧ.?U&ݮawtiG4>>UDž bUgohKPo_Gdё'-׫/v|>~Wu)k||\-MSeW/҅K5:Q8 a`͚9C48ӡdwhllL9YizkXvo-T鑓z]z-ו5##UO!˥syZzc*73oZX;vА"#µn*&Ko~~ok華qc̓[r'l6=fwHGNf3GwHMW||>PTIBuj+Lԛ?PMmV*UŪR$y8MCk$]tYI *=rRa+O?`-Z8O/%:]5ebHOkZ䀪9Yk^OHSeuTv.\/\qTt9:utR(6?JjxdDIƦɔNFG=joT~,ΕוZuvuniii2 C풤ȈpEFrOCC G]=r8슍'^U{{bc;Kt)+)U|:˺o+a+jʝd%$ĩYPHH9};Ϫ][JOO9SAAnEEFP4護w(>>V'N$-ȓa*^ZGڛ(?/[+5eS^mr\ZHNCյuX&}:X~lLeHS,=WSo=t mXZ6PFz6m\'˴kwvzUq%)kFBCCti\N]\ɔ3.jRGi%Z|-]Wت}K@LOQQzd%Km[l1Ǽjkj$I+.񓚦)׫*66lznn)ۭ /e޾>IRYY-SXX(IZdY`[Vflt! ŢG_@Vfa, Ex"e^`YW,+X, ϼFtQXIEuYD,N͛dkMbNJ["[eU; Ht`131)HpD}?ץK9g37~s,+,+,+,+,+[^Y^, 1y<y^(0 L&Yu+$Bppq«Oxd2 f+0 &3je .G `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^ `^}owu{OwuZO}Wx@'|U5Ą"#•;CWXHWfzd-Y8Oiv+!>NۨML!Oq\tib2|5iZ|$B44<Շ-_COBU̚BEGGҸ4-ëKrݓoBuKNN$MaS^ =Ęgl z H1+|O{q=2L26ݱZ;v[0*,]jn$Jbc=eq.{#ã4NDxnZdo~dp>qY铚9*2RCr9sK; I˙_677K{@u9d*=-Fm^]cR}5pk~M;YF:eJK oFTTܹ~&#¸ÀcŖ6&+8(H2L~K\laA s?Ψ*""\42 l}jТ\&q;2<"I >}%Ȣ+ /* =ngܽO_~>}wbKZ[;tBzzq*ex @M-u7rzgn9۠ŋn]cU/UMtwHe=##ee)11^AAШ}T f\Mggшݮee$Iy:}A'NUvV8x͝]yͩ,UQA"}Qpp22ҴݼG=kcUiquӡu P$)7;KfI2|][ZYT>sN驲]%WtW@ Ֆ;y8]" G7Usd<9N?fiL240o^~Cֱ߫%_##v%$kJYʞ zں_df8#u'eZUY^õ+o*7g9axaNvA-mҦ $'j'j:zSZjͭPLT/c9|\aZxr}!lҎ뗶*..FsNkͪSֹڶ==M&Uj\`=˯}k}m/_Zޞj豓ڻFeeHȈefr!ib]O,7'K_=Z[;tqCQ7\KΗ꫊{ڱk54Iq1ZbgdHf=pH5TRR":q$iEx:[ߨ-JNJЦ;V_1y~Uj.׼W]/;;Sg+J5tʴo}+W,v}nZJֿ_~G-z<o~^G;љ WL_|v|\*KT{E511gtTBBUTU+p!iblڴ;ITMߩVet:r޶K_z^e3fYVLidphHTWWwTV>~ZNvL\B* Mj +,+,+,+,+,+,+,+,+,+,+,+,xR\Y𙔚D#\E@ &07Pzlr:4gjUbBϛl 0m5˯n!>NZ֮ڤ\MGA4Ro_w5pHl}G70o?] MrV^ jǻ{.٬ YLa!!ֶm߹G=}  U9S9˿ua ە*3#;h>}j?71f޾~??֓X>ݞ>3nsR>z^*2<In+׫^|]З_޻Y=}ڶ}$il̡߼UYYzwKݽjj(IjЪwE(/w~566| qgOfdSSuv+IQbb4z^%$qC7mYyeSBB6[PIҜڷFtAaaZ|$)6&Z[uIdgSUZ"I%U:Ф5oNw "}2LVQ,+QrZhZ;~ZcbzRee^GMO 񒤃tLC9|T 盕3g4:eZhzJJhddTwU}VCCòxfV/_,||D-$vEF8;z8e$uuH{AnG}M9N=]鍷vjúo=/?|7B+>qoWWѲU$áА)˄nu s(CCC4:JA{ *#GO?֫D X\ q2͚7\ utv_M˥a%uؔ0OY'Ik|\V|\~2 CܳYENSzn{"m^]ت_|Mk,W I10G\=JJUWͩ& G5jSbR7*,4TW?11qŴnLI 1zӫyeuwjjut]d6f'''D?ɯ+o|E. ՉzշyUQǔecc  Ϸjl̡˺!_O)Ia`bNǦ0EihhHqq1SVll۴+..FfIrJJN\qBI0 uz%QZZh֯Yokj. ܶUCcݵO?xre&'kʴNs)[:Ȱ}T+I[YN?=88X.kʺM͊VB|)qݾ,,$D== Uxxٞ^=^鎵+TYQ/7vKbb|iXB'N"m^\.λZX5G!xT\/éj`hH'Nĩ;LTYQSgtdfw O0 )**RqfIQQf3 >zmRppZ^ &;' d֯fy<uZ-_۵*Hƾz~%VsՂVV\.fy^tfObKQm߱Gw2[BBཛΎ:|䄢"uǺЙiZvа]IqzͲZciE (%9In[m{r{<)**5bҿ3\> O[{H##ׂs=Cz5vWkrscϤ%$L L&*Kj%OI ڼavާ^}K1Zjh\I@*9p**/ۣ%&MSռْ0kϾ#iڕڹ{^4#3]7"i&۫&IR7}^WGNSn[\ s鏵|LLC|bg~7M{BCڶcNzNxx"""t=wr?uǾ0+99IڳwWf7ğ7i3`ddDfYVU&#{CC^R4~ZNvYy0B!!!zgEK4wv7bKfTBB{o*+55Y%ŊWojjj5=!""\++#蘎+IJJJPiI"եCO)1#KE jdĮõG?0 7`hy,DEipEdqb,,s 7Y*<7Tʐ$y=%&%]tr,͝[ o IDAT[L$]li˺Nk PQ~<K6ޱV7ݡ %%&jH,*ܹZvSUR\ H?أ*-ȨH-YTU+I򅅋.ª*Y\]X˗h|b\.׸f=9鵮 Wց‚< m$)+3CGTtTKb>]o#׫0l66ippXկt:eXd2ֺ+Uwv%au$>[}Ied2g2::*IUxxv=ETkڢ2͚SY9e W))zG400m;voG^W7mк5N8xXkfk(5%YMtw˜vjiSY[&]=P$edkttT_ЬYr.ۖ322r4JKMVk[::|ed)!!N;w'k\a(l}<.i'O(=; +3#]ީ׶!U̺5p#,c'l9].%&+,$D:$D=_,'rJ q)}˾v;-\0O WNU[krj-YC*=-Ef].׫L А3vƻ:yx{bbP9pz<ϴY,uNS"TWwEIu R}C$)#3M6[Qfd2?2TZR♅*))5yM @@z{|bjJ͘s e*nr,Ȉp0J5.٬E(';K˗-j競7wfL/uiqY,EFEr*,$ĪU#QTXV)cCMys3 EFFrp^1?<+Ӧ ?W޽Yi|YVe޻7 ?0-,4锗lp]@"@"@"@"@i)*++?6@"@"@"@"@"@"@aGx`Z\Zy^B,2 Ca_XdWnK_=wk2ҭ L0K2#tOzU$d2` `1ixT~TO\$n \Էk~w/QШpS]^uZvIRU,_Q)40چ;soviyfWhT^<&&&b$W E#St_IRp&&&@@#0-<n$)#2nK&yxOB'UV業*(ՖMkonv+'gKgsDxԂJJ!~٤+tC`Hn%&s[ .eܰ?a&nW{n%+ۦPwwfrszY/f͔a:S(04n͖$m]j_a *)1^wnX+wnzw~uud0WW)("׫}ՇuY9QnNܣNI7`OP[{<^Rt|eJůӧ/~صW6[Ra*EGE'IJH99vRGNhhhD!!Vh҅ 2%I Mz{dXK*:*RcN?QrRֻTA~֭^&6ptuu_3gμ3g(66V4n{  `nʛUS{FdSgb1k2LڳFݒ$6VUIQ:;{ݽu cc[myHU]Ixw$T*1!^kW-^vWJJ$i2U\}ӥ_u]ئYE;L]=ohxxd|ж{Tdu})88f]6عWZjrgHI[-Ijk˯U-:wI<- fW*44D'Oĩܨ7ѣOW;x~i;~WҒEщg9eZX484jtAI IRٚYohRssy NZpn?4x}{/JO\٘&:|V(%%QcF^ȤkJxnt˥aɐ"2>;4?׫߾{eTppKg*!>NCÓMݎ/U]:WIk*:xxDZ`pf_VDD'x)|:;{&s#BfY_UQQ = *KT}yP""51'fpl57hǮ}O]JOO8]-}k_!EU>Xyٲ@a-_Rs+$TS{Կ܌ Gp1kՊEJJJE ut*##U&G( JL:5_hUEy֭]!0~rEFFhCr}/fSYLEGG[-mWl?٤49zRGPzZwBC{lWdPA 9epUooߥ#'TXWJSu tE%u܄n9cӦMqWM1ZϞ;zxgdY?Wm2Nϩp۠   7[%I4p ]z _>+&%4^76I@p^<$);<@cvd2i]5yA՝'TyFnM+e2w,6+7db2}ubBSs@cn'LPU)XI[1X,XhWn*0ze2b*/륑i|=L&fY! +0h $+d2)((hKs<㥊+tW_9N%<%%H!f6yhd6JLu@F]:5\ԿeEϺk_!^<_woY g_S9X[sC&+@ #0m_%GU5Roe5s[߮BB4/co`Q͈JWftڔ^yec8' .*1,N M*/%mh[{!w53L2~ͮ%Ljj׿;YLde0, WV%DOW+:=jhգl2kWKO+ CU׈M_(,^m&*ǣ+TjxK}bTO~Vn[#Z^RYt甊UCTPw~u5<2y }c4#:CFh$EG/~CEɗpd1ج&}ȳʏ!S&äoyT/u~EAH~r&äxOZÚQ~|גǣ1Sh^JCi=1S+2뎜x=z/9ңyUvT бza &R8آ^|jWMpr%(Is:yBsٟl r]ʋ-tVoߥ?]J4/\sS:ܮn%,ۥ??hUwяlSJx+{HGo7빢j*JTj~ߙ$ѯ>[-eD>>*vGv/#-WtO D 멚$66]E qmzh(X.}KC(=2Uwܡ-z]͌RuT8ScZ@7[DǻϨkĦz7RvT&_sYBu猿]͆YEcɟpaL τ WiB̓5'轋 r$IQp\u2& u(>4F1!ђ҄B}WSXW뻵Ϫz})^'ɐo??L仵*%"QnW^=_] PbxVX<ɍT}wk~ND9'Cc=gT}m24bzzTzm۪8Ɓ */ЗK$ ,SyTw]7Fߚu$'.I&s Hf'jŃJ=L('&K!>-Iȣz:jlX1CdQm%Z㿒W^ 8:YvVqMxʌJS}o []#S5RP$Lojz :'r<_~Yd2+<(L_,٢)eߑlQ\H笸J ӯi31ez%D_xXR#Y-VIMY&3"U}Nfì (}C,sh/N(Ppzzo}r] 2,/).$F R+;ڧW(o(''_bNߞ{K-CJH]yk ´ 0UߚV|AQKhԦ2dμUɗ~N)Ҍ9^׋@;_wB!Uߜ X5Wb;.S__-blڴ;ITMߩVDDW^C_~xAcaFFFd6eZe2dM'^w*9Yt@"C|- d +[^fy< xd6?pK+0dL&L&&&&n0_.15RbIDATxzv嶉(2\GfX<. B $_K߷y4u4_W< ,#X%8fRmu]yβ,)<{}Zzj^%MӤR7 OW+'1:`)E8:p8^4xp$FV x@+%^P- jWTKZx@z>]_?x?u P_J+^ߡ1*x%kzlJ+^SU"^P1 jWT TM:}|wV MY* &߾~i$0l &WIZmbNi/ MIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/path-params/000077500000000000000000000000001461403617600224315ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/path-params/image01.png000066400000000000000000002324051461403617600243700ustar00rootroot00000000000000PNG  IHDR8gsBIT|dtEXtSoftwareShutterc IDATxwxTUI#I轋.  PZvײvu}Օ.TH*$!L ѹs=3wx}9נɓ'{"""""""""`FkB:!!N:,v;.g..K`RS9|'q\)vf zuC0Ə [hC""""""""rv;nɂl1 a*?=n͚`!>.ē4T2IXxaaZoZZlv8UN\\餦bXζ.ou:4UPDDDDDDDGBBBJƍ0Nvҋ0#"""""""R*+X]k;jqgGGDDDDDDDrܸ\Nn˙LfTfrrZiܸ1NJթJDDDDDDDs}L0̙˴i0]۪<{&cԨ1X̖j̙3)Sb3JUg+Ղ-/30̚(rx\nn7N\өNs= &Lǔ)S+ԖjfʔL0ŋX)S1[ͥBᕟ>~x ÜhQՂ{v69YY&6x""WiFa,^|QNx1&J VGDZJ;_UZ0ppeZ\A9G^aj,ˁjϏʩlUBꗳ2'PF\\Nl:rq;]$|Q""""""s.5vrr;w^Bթ@5TA>]"![9]?QK*""{ĿJijԨ1%L!\x. ++ɬw[2d6ޭS,);‹/Tie2̙3 ϙ3b?\{P|qELZWe6hQx%ry~)ޭ̰ɨ:EDDDDD.s&ZMƔ)S/|> V+SLeʔEV~*)r92Le%\`T ۲m%-e~ c+0.:EDDDDD.RWMkRo}W3,}EAU2+9~aa4nܸR6 䒙[YVpgfoaѡv=ӡ28G>~{.{]{{L?<{cuq(~{s|ONoo1"*YW""""";b60W5|^^%:U 9>Ӆ wBtfdTmB?ԭPgъoö 0BGaF9ʜAϧyf;rUL .w>pXfMM|$Ѽ"*](WxeJ?mۋe>JHOȦټBQ#=c?3<{|[d-y|S5c]>k|[,'o?7^Os)zX4!_< uGR[vʀ,:oH?V8omjvZ0*-Ã|pb_d\#f7㣯]h-|활e7.1xx4 eqtxO<ڧ5?x`j $ATd4 b| 2~z}Hwë*/ّFA.`?33>ZHrs<2~^?]3j>/' l@"șeҼCd)ݔ>3/?lfUÕzo7tΞ<_kf&X};'@c!{݅:Xyӽ N[:ȳ߶-i=Yp>+J鼱5ZWpS7ѩe?Q2iIc_̣OelmFSKǿp?)w\\_/)֯_֮]ի+A/c)N,ɽoxֱ,H<=_~N֩C0Do{p*g D?4wcY?g I+O":r r V,>#AfVf[+G棙j|?Ivma!:v wAg{.M=t={gl Yr`OӖů'6䖢VN Qn: C˙yA3a6m݅Vt @AvQXλϿT#^]AB |.t,N pOڟu dm6 ;O/3<~~LAIr>S78-cOdX%|*({n:}~6#<-XiTw]Lqf$OltC[ d<8&-;Xzŋ}l}z"sZzu m-̡~=;J;g-;1 }vq3.Mhe!OXp}!!Kwg!;gC锈T^ܽȚWIngo|N;ꑗy~sA< [za¸<ܱ}xgJ~'e9{oՆo %fr&2J9HU oÓʼnӮ8ED-\<_?OqQ^j?Avf_`ᆸ}v3_* LqZsIw`0rb q׸Zv=V`֥}Y3mq?_+[ezڠ&_ܑ-im=> X1xx(p,6, K~tXL]s=~+ 7x؂ cXi+=뮦^̏,;,mYÊk3[6W5Or*F=p a6 {'g+ OKnvزt#OlIeᗸRdq譿dҨGyvGI{A-+s?d<<6xC-|활p]8_{!YK|eKܾtr._o0QFy.1GJ7/-nr7 9eĻk o{貄rTu4qPzX"""""""ѼYy\mhbY 9eGSe*#^^+Z""""""RJ^iDUMOP;ug)/$Wʈ2pIgjuNK^hެ `L5XWMQ(٢KC+ŬzX Wp%""""""P0|c"1)tH9:d֚W" o6_(9\`B+o2[-Dj_gw"""""""pG`PzJ  많Wl00,&3>6f0(R |ȵrpxxbT jZDDDDDDHjRRZ]DDDDDDDD+Z DDDDDDDDk)$vǣ'ʉa&&3&U5W5vp8AaHt bl`: (N.7*mxp`SDDDDDD.=LTgp8q9XfE-Mcj˅Ñ[Uޗ+j7.KoD%SxU.rjVPp%""""""^Vq`U&W5&ב"""""""a8rsqteuCBw$9p|V~Y{NȍѶm[Zhb!*:Ȩ(̙KZz:wNė_ͬP[>"""""""cFR#׎VLF_{-]0ۻ7j`^Tix\5 %!>]bߟVKճgYk.GzͷߡcL W.k\ժiۦ-[ ::ȨH;4}S]FZ;-lwnʑ""""""գgO<ׯ+nۅ\;nnz\6^9y'Mb2UVM,\LH?<}>p7l$'; VY[FPp0f}-og >[&η}G`@ 7&zK}AYySNcm2dfg1ۙ6uz7em+ia+>.'9ݻMIEDDDDDbРA /XPd$>b*M""ݻwr 7 /cN>)fyGxo?իxFVC=k3n'l<}s51v-M@ltmyzɽG<윢#\f }yڜ3Xo^{o5'}QsoL,Zdtx +F|n^sm‡ gPPY]ɯ儵$g_JЦuo@V8x`*nX*'~  c%kΞ}{ΟI;o~UU ݷߠWW#?l6VZU,UZpv~`gw`>\K0lp<ˮ8zt 4{Q9ɞ_׊Sx/EMkhztg$6}y[27;CLJ_X?zƝdsRe){k(ʟQcl9-#ѷ1=a \If|aBs';'ʧԯzi|fiN`Ns܈H0Gc00o@+ԅW^22_~5 VW\(U`s畸{fѕ{QenzL&-_| g饨JIOdX4ymcWd vZr8Ѣ׻$칧u|Зy-""R9!9: +:{-NO^m4=_}C QvKv቎MDrkszLVGb~tƻUx0mi@f~$m!={wӧORWN}襤#\Nss6n'3=m6&WE>} j'DJjJn?W`` 4 c∮ <9sYߒUe}W Wjx[c\K;r2Y&S㡴W$<-[6^x`aQ7KǨUÐE<AŒQWp4 HTJ@v6d`CBo>v8eB|cvx>lݺNDDDDDD.wYYY|w 6@d2qͷЫWo"#b5x àY$ğ$;'>?_?B5$&h>BsJ"x*' O04{!!^<7n niENm"WAN*!OHe.߲E *{ҫWol>MЫWogZ2f|6jć1y|]B5> >G]A%WW ,žcg@3:u#_UMׯs΄6 0Ν:~CLK?fŔ-a;ٝLae_( IDATmw ].[9To#RN&m'q~ޘSg+ } $EqW~ rաi9XoΙdO⌫MuNZzV~=ItܬW*"""""r\.HH>''qyɧxx;k{S%3y[_ ΤocpwQn]ܩ=0o럘x-ΤTlYYך?!n^|ɯa nP9FS~Jvh׮[4<;?X:ĮԢk7+2nohx3yX_,ol)wًqe}pGPq,E km@l3MS{$}[6QaTmۉ3~ѐMI9pˌf]T:gx64 yX]lt6#E'Kx~6bc)P{fyGi׶I=S)bՒhm<|[k_t Q ×x9y0žP| ZYʖGX`) 7ßRq/$.r.`p9.4N\ȼ+ִJ!Hɕ,ه2 #0v˙~P KcXr {|!7%MǏp, ?ÙI-,]XHaFXX.e˖a64h fۍdž=^ ۪5p}旵 ߏ3gRXbGd8ssyj\5jsu+7kP6<#8p|* h۶--[4rkn6oʪ5kpTB{٫W/}YjvZy ?4z-6nܨo//exO&Y!"""""Raڵ硇&::SIyկM7D۶㏈*o7ÄV)7d ˑfϞKVvr<~x87o/kֲbժj;'ObI̘JR~ѼY깜Nr1~8ڶiK6m"2*%--MT"W5bfT oxP%""""""m„fdVpUٴU d2r9q8]U:{ })S?T Ղd0+*(7a`XX]n\nn<'""""""Rۆa`21L͚V^&Lfh=w(JDDDDDDDD+ZּIOUW(^޽["""""""""喚Vc{kMJDDDDDDDD+Z DDDDDDDDk)JDDDDDDDDͼ敩+UY,W""""""""R J`)*u4E'""""""""U/y%""""""""^Kᕈx-W""""""""^҂""""""""R%vQݺu+qF^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^ˢ.,'֝{uSs_ЦWv툯ڝSkHȈ#X lLVl`}8DDDDDD䲠Jj1Ǚ`))UV='9z`˜h~bάeHɬs:I9FLL6elhV>$""""""4mPj1Ǚ2sNWJIMg99~r1gն<*v~9|ybάEDDDDDD׌:թ ד1vu~zoon"⌢݄0O{;Kou )m{e>t 4Tֈlcg΂%s3⦡kHn|Y"ea?nlǙ|9g:*Zdr,X^B3^+ 8.4OmL(be=;sS;,{uÓ{l%?SYi+r qGI3iٗ`xo5PDDDDDDF^y+|L)*k)+7 > ɬZJp:I=O,m𧼶{WgpPK"ڿ#c7Zh35tur%16iߟڕu툛UdĕQx 2glct:rg& ;x0iVNxAٹ2m2E/lW1hOʬ}_R~v~9숛ODDDDDD+ź/UUS,ps֯:'IDM} G+}Ka"#{ټo?kքǙĆnj)%Vm@&lcLҰE"Xi%2qMWfZ7OH<[wMP㱴4F [iP+Zi8E\z oZC}߭~Hqr9s/p"""""""G78e{Y>nmۙU}~*MNBh9o\8V4Ѿn3k x8='}syʿ26!uNZm?ㅫ^&̋?s>^>0+eU5lvzrٱdInЉ!}l8jn^]~ӱv#73Gu"~tBa35oLSL5Ǟ{}iy,y9*x.9NgyX8ޖFde,!˴ `]|*t7uЪtzOw,'G_bFu iGƇظ󞇈ʨՀ KkTCS9YD߫n!ΰaቂm-X縊aV[%kںƅoq{iHf; *t6B#ÕMR&l _/dd.}LR]fBlfUda/en Aui|ɢ# K%>2a ̿ԡXbEtfpOЏ,Hϟ:͆%[ѿ`k8)939@Euhۢ HZ + qb/ȵu%]+,V[3ۛgˏ|voϬpZz3eǒtׇۯ58{^\JҶbR[ڜ%3i~t=#Gcc m? ؏$C:nf3@׎e!3c="&&+ٌknl)_眇7WY<2TS,o أWo/UNRWM厓|-t^+m'Ι29Vh+`omYŊ~\PuXjf {e׎urjTVn3kS___K/qb7hE#8WvXn'\RS=&Lcf´>˙=WXNrϡ͟n'[PDDDDDDZr_ ֺ>:gcy,(o"⦩㜰ԔW щ%Q6_ӿ19Wּ8fX1s7w.}Tof\E * +OfoNAIN( (%qL9~n3_ߒf flǿն/l`} WU kH0B/0ۆ B}/0+U- a#_= u(7i!Vڜ\wO>χr ͷ>AO z%pI*tlRhWni +,S$ خ&^ه>AˋLܱj)P%'[mZ4 I`i#Rpp-n3/XY~LO}W؎Y~W+1vب\& nZ57`ܘMi;x z^(sMתM*Φ|^C0EԡNHc\~8Q9E6=ҷ2[񩃶+Y9>u0~xWߧeҢY8O;[we_aO*)fQthۂ+v<s5ӏ{}ǎYD&!>#S+6mtke9:hɍdT/X(=Ŷaa"Egr}¡WwݽsnsuCF9WW?gҗG~=~YbLs6M/glLfvۮڑ+SvD\' SYy)MtkFNY)>U)tN ڇoI),oe{qΤQ̬Mwk꾼:ZNDnȭ]޺ZAң'oz]Kl0:s +a`Yqf8똪=kOMej~xuz'm9Q);_,`f$?f`nq5?0OYNK;ޜ{N3qt*9?{~q^XwSl擧_x{ NL8(E>42>j?o/vӹ\73?xo~O˖PN-c+: kٚ}a̐41t'H:[-B)sg0'^d:#-wZh%3_ u!7ܴ @4{NXɑĺ۟.š-,9,t ?NjyDDDDDDDDW)l\uHB}(\YFaat6&=ؽ{Xd߮$Z>ۘ9ծ8*"+!'3{3]<#"""""""ժWx"E7DV!%b#Ӯ61{?& ;^^IIP(72"8uhh?Ӌ_GTT#b I/i#˙=f{n5`,bM`yqyׂޓUĹ=e:OLr*zQkX*2e0EoFDu^z0L"c6Vf5"""""""RmL5҂i|Rd)cV_UDNz ^yw:_ŊY5;u3\]߂+Z<'19' O'?J9S69h̠E6=_wTwT;hLv!P4\[0E `ӉkdMocf0)—Wq(z7[R&קʞ܌@l8p&qh^~SIݹgpUz βfch64dz^Ѭ9Ȓ E6PԪUz;)%.]Iԭ-JT=mmEFU8ɊȂ sYUPD2?{?D﷿.xf ֱ&vb)~7!}O jOﶾܟ]dO!~Y|^-˅o]ͪ"g5¸eצ}&&`oCwrKMaW|,==F\PYgWg3OhWytb[n%͵MAXk"l}ҹ,qeh'UKjSl$fެ,uc[-5lJ|۵ts6ëכzaMd"N ~ Ӯ}o|ht#Lp/a=|3Yd8xZnؘ1xc<>hĔgu -~ Oxf\ݻQ/~[lDw-_A%qE3WԽ#"""""""5jsQ+""""""""Rniiرt =.ּY>mPDDDDDDDD.k DDDDٻ* Ϝ$'znAE, `^{r-bE?DEׄHBN3>Xi{Iּk=$I J$I$I J$I$I J$I$I J$I$I J$I$I J$I$I J$I$I J$I$I +A«=&xu2isl#$I$IҦHNRيdf'zG$8>{%%o$I$I*`Dv:']-CC By]C8.-af>{@Mnh 5}˩ IDAT*+qAUi%}*&Uy~T&salKJ8=K#~3Cr91%!jYⵖuyet(]}8|'"KU;NI0n6y@Ij*tY䎙K΋1|E SK[MzVMJ$I2mFuV -h :Wd繼<]鍳x_|@ϋdV54b8/} ӸW}8:?-gp,?{4`Y yZ1}"94RWNhȓKዼep2(v`Y"3ƀ%hWqp :wELRX8'FusBC]L l$I$/«bF 9nYJ&egrxb>_5Vi^?vŌ[^ʸ_ ڱ2L]Yk> !HStR2'7?̊*U$BfU?)R*$I$I .`|v:;FH/4(eQQHԲZJHP15B5uo^{sܕ?.ܹ}OhNI7iEAYT''lD~,hE+yy\2oULbRAYURJNi $I$I~V62ff4N+ j9(% (-ؒxFٲSV0"#JIiƢ4~!׎9VψR7)3q%5bV-o1?qO.dyvMC ?NpogI# ?LMQ$b!qZN!9?`TT:^I$I$󪈯Oʪ!ոf<*$L. (JUydztI[ydBi:ʪK)ֳWܟԨ=rE<og@f( %,HW"Z{(XrX: 5r|.iٙQ}73T<4&P>ϖ$I$It5,. >m'ML̒.\}r-v‡3s2E)ޛk-J˨J$I$-+xiܸqM6m}ШA"mp{Pʊ$S$I$is2md|,uI$I(y)i|pPYFG%I$IΞW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJXW$I$IJX }w|I,X-7 >}g̜%,/I&ZsO.s)2w~{pG6,I$IcV*gsWT%.a5#I$I^q~Y\U݅s.EL{]m/YP}|$I$igx XSq#9g [QƳXs\{'_=͑7 fQѝm\{b\zÌ@H%z9+V_/ʵ]ηFSl$I$m&,_5jsrr$--Xϫ&>r g=!/eE DX0~8O\~ _Fn{_4= PRʭpScXʳonS?Ng~a1K Y4mswnpWDʲXpT*xP'mZyFkߗϣ9j޾CٜWi.Y#V`/-I$I!k.BسgO@Ϟ=˗ծ]ۊ Vv5ŝkYc9GYՙ*1af&e;s ;ņy,_^^ q$I$Iۆڵk3h ٳ'={$++j3v«6gLv0}#gnx:;ѾNYOB&|K^>wp7>SX+  ?=ޱz6Y+?osp)ŢM b,-mݒ$I$կ_!CEVVC 1 ۣuF `n+eQp~47b_Ӡ!׎wDF/>e٥5$>==?,K$I?TR%h HwsV:+S\\{*Z3(.YPWIȶB4xJ%hŁDG}FeNՁeΎ}ngyewgE*J}vk\/{_êd&C<9-:p]yd9^\q)_Jy%Qnvi+$I$I۬k׮aqii`mhuMǡ$I$I[@Sf+؊$I$IgDS-kJnQ^DV-WpRd*GI$IͶ ?|mbt~.2$I$Ifշq6k&I$I6 Vzq5^3I$I9a$I$I$I$I$I$Iᕶ{ѵM|X"9o$wy4Gt?kl{oy eEѣ{/z<-I$I]WJ(~|  ʨ }yoDgp혂%~k_iO 1Ͽ /~̸m;K{ssrٛRr?n8qw%\Xy I$Iv'*4)pH$IjhRH~Ayq^\ʄUbvo~CVAGiG b[=8*`x!LMݙX&JdW,҄6P?gƜgÄ/]ɏ+'( [Xʸ9%, "4Wę:o%J'l]Îk].e ` \J;t(f%8+aȑ7ȑl-TabMC<Ռs%o,e8o;;&'̦Gs靨|g/ROG_"$ćdp^[6 7^9g)EQ^SZ8jJǼCX怄 J%I$m 6AӦzUNz^EI$BEX33&0B$-aH2^I% 7JB ҌJDN%Ō&6cZ<9k֌yoJ K_KkB_[8Z77_G;rewrCZ-ex[:!g0X~s'+I$I&++TBP)5 JdT^'p 3H;vSIA̪$zOڎ2ewt.Ϥkui4yLөCSVS4g* CJӫӢNU֨RO'F8Hb42~/L~[(ckS1c;}xJm꥔0sB^ӝ҉Nzʔd5jŞUJə=ߌe&i%->Ehqj [zWCfM.^9,@SJV68iӗ ֨Փ! jSoU ^J!Rҋɝ=\ϏKo畣W8a G)gLzJ$MϐC8u6Ѓl 2u5Y#o lT#EM1`U` /?ʿsۄkbZZýu^4@zF>~?0%x=9٧j0鍇xjTrѪP̜ι?QVѴ+-m+g4)%89\q4?? !Ѡ2 O<jFZ8՛]"Y掹x.\N !7}>89|VsGTj| EPR!'1;yg2"7]Ĭ3}+GB$IqW~-,5pd ,,ykzS&X9#ƖlrmW1Sw}eo<ꎡ,YZԡ- Tn:9G彭V"y1,Ҩ{z0填|<>~cܵcY|7gsӘu//ynjY =SK!!¨b&A89Z'$5?[:休r|Sé? ^frP b?ƕB~UeFG9a]^qy|7'iW؁ ^' *{oy57*FF`zH1w_.70}A{.vL)`7p#yCh~O=OϪ%~'?6>sG_Mi ,=|K+!%g7"e0h74TzF-nj/[N}ˣ='מ6ٛ[@z&WAШW%{דW/;Wqg oRwL$IU"(]DXė]=kypY'uޚ64U})Rra)p>mޔ}^($~&X@*LIbfQ bFX )! ̨YZ8=.G}`hccoSM̀:|jI~_0~h/Z["N۟9j`e)3av{d^n>] @I3oBz+؛ѱ K9p'.H$I2 2sEh\5l >Yݧ"AXĽ9THw?Ҫt>f?@Ȋe, YDvymšU \s|zÂic:m C_rǮ3O@._js m G+ѢQt YQx<Q`՜W+?Τۑm! }NfX:!I)|UM_NQ<kE~+3״ Z=_R@!>58F^ť@Ͳk]皕ieyC 2.%' )GsĠ/}3diojq*GA$Icx7$1lJJgI\?J*!% Hv yǤĒ_+x맹iaj)&Sgx' b6/e%S Xd ϋ)hq8?ݪnr[J;TJz`^:9iTjt8vH_oI=z$*'ޑ@fF 5C\Р;7?y\݆|'qޏ)UTȌ%DV%A6ȕ]$Ie81$3e9}sJ #Z{ro(vn|jK=wV۹ ++כDF؊Kzakv!)bӟ򗎕<2."fPM92k_͛p5[3b[81zнA23c֊M05T ]nƃ&ެ%x?z#fqoSRٸ.!Tu$CfKFj9R+L8[QOdi8}O?9w$Ӂy 9+\v Cae}{4n)_W_Q+=JaSx]ʈgƱb=Y%jT(\9j;F?eSQzT/4viո|C!=?Kd%Ys[eq"˘[sAmbnXRM*EibxԩJ|tv?v&NOU2(]˒XQ`;n~ͧq+S@@1y&kQ.W۪7smC9_< >y7$Y|<kzNó/G3SWkN6QO:gBMvi9a^=NלUj$14Venq닜q/\*N~<$(IڞsE ߔ3Bw^㿏];sRFzMykkCy*<#W 'Sd?&8$$I$mW`I!H+bRJ@R h"YTXշmk],RmW K) *Rv)` YJ;?ju/e/SPȒSXXޘ#C}df͝`f53YU:֏9B$:;ډlڃLIt8&fRLMأi\X> ̯-87joӦ0eq|uE?w*S ήa0ؑ.>W?95eA-C@/_07Jl֌K-N)뾋1\:)K!$OmƩOCe\~iAwb}1&ClKwA}N0 xj]..w妗ݓ/sªmuZ{a7NP7'P֬Hy20h Ͼ5à)U9>PUh|赡_vknK'I$IYеkװ4diL4q4SRRŠ5"wD[Oc^mІ^8NɧdYt'\vs>j>x*|{1 GOvQi[\ 4%ng&/I$Ik;v, 33d"-?ԲNƍ۴iwPJ[GY8 ђFq{-RWN=+wVݥF_[GdyӗɜKAknַIF~ׅ2x$v5O$I7WRwY9yO2Uu9)4yn.`S'_6_|&CH2j4`gӣ$I$mo SZq'z=2{r&W IV,gum0$I3I I$IҖcl28$I$I6=˹k5^3I$I%Z&ݢ8PZ B$I$IW¦ V!$I$Id$I$IR2$I$IR2$I$IRJ!az%$I$Im~bȑ4m֜${_b+I$ICaYpdp_'-%j-W$I$m0$]V_B0$I$i;eu^I$I$)a^I$I$)a^I$I$)a^I$I4izܓ~ae$o : .0߭ͅ$SFCv;4 Us p5w[XI$IR>^Kw싞nÆ94k`1&u!,<E-t~Iqɩ/Pz<> l׵Rm (Y1_'L>KCVw85Ȗ*I$IJgtvܭ={!hx&TmўU S78uvsv/3t"kl+ƗN^fb-9|OG1^4~~cC՛ƉW1H{=̀fxdY]뎥ޗ0c9*կGEŠKxT9zZk~]BJ@y_Ġ|v޿#T XQnp,sKn$~ I!IL|[jԑ]SV2ثxsj~ ݚW8 is y%\۱ sy}fpI?.8acO%~)tY/vǮ!>sЩ8.=c0Oojw$I$iˊFIm]TNwgQ),d)`)cGJ<š]SX%''uB(^rry5bz6.{K~Ԏ9C19oؘڇQ S Iɑ#5ckF0ݑ &iF@pe,Z֚FL-3gOqڦA40 Mۅ˺P>jTFZi5SPL^rUGN0—gw|}|7u2 v?ƗBʼnT!1#oO3s9x,j9c FV۟sӅay^.6T#f.%$ݲ؞}$veI$IFv.sJ@Ҿw#AetJ;c&Ae-(WkƁޜW?'3(Hmw]U#DoDqx{|r'e>]gDGgvΫaps3Zp{SR*2kbbA1+Z?фM#7MVz)?}ԗ{+)Ƣؚm UZ*j6W6ҊK,\LL/ I_<ZuL:lQZҖF{zuj~{ql@$I?߸5{=S[ul>>X F2$fhnS\ߠ);U+{>6dI Yq/6bTUdPIza׬T!drdvgdi^z$C.%I$I۶h k|rpG~QC`I,N劬!%F*lUqfS Μ¤Xdmݔ̼,^ndL&ĉUڑ^Dx.?/ٔFVMgiAeZg_YAn i0)?UF03fKI^֑^_cW?Sح.i $IxR=Xܖ'pHܐ 6yZeZ5BSJi6mGΊ aUù2m&ckU' VO#ˈAӥwJX1:0ݼ R\htA9~7V>=Ӄ~&xEu2DCX[}ڕb谱x?ǮFֻZxꮜ~AgZUZ/īE{s}:~6cyǩ;AGS[MW$I$闷f FaEv\r׷tLW$I$W3b Ͼ$I$I6Q<g$I$IQv J$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)*eJ,E3n_ᖥe||Gx%IYO8nzԇ^7SVb!gWYG./N\@\ѣ9ߓ)Iڡ*̫Ԣ<1t<ϒ$IѧphK|/p=7L,Ev8+7~R{z~{ЩPC+끅ĩWFoZ_=V1 }0edP}/'{ƧЩ|33ß,'lՓfOjy=܂t!;XSJEg\{)jy7$I~MĞ-#?ۡ/õ>ڿW]ރ։]q ;@G/poq%iS3tӜ|N[.{y99/ !8wgFt]jιW14?IΗqI' a0A'3'y{b9v:N]VmG 8/Ą8y.b}o4$RWNl %Wv;! Fr=#Ш'77MOw̗ޖ(I!#%sdGJx?yMʦ y&7ɍ;)LX6'U8.m. b2F6zsb8&YA\&sϔj$3 IDATaC><.:R祲ed+ah{jd+CE']*u*ޑjDXkyjv8@va%^/ݞ3@S7,gCpد!)ekXZ^'Opѭɜ!HzeI$G$Z6(..fꨩ)hXNjAAYYL38V㳊 ڛ:mW)WpA.B:8iЄ#Oݟa!3>]A<>{5uRECCs9Yiϸ*WSrLI WO${+$38;‡~J_'RVeZTD&@^\rSMi<^@@90kC%I-"LQ=2x<ed-e~z_]z4ų|DH}O?DEdP=7 :-Pg7? 6z{̪APX\:@z-K2ɭJJ:ۖڼԬ,Bz%I/^"{6CRͳp)oyFoj5O^Cp_yvVn!vhmyfnW$Ig kܖYig'(KmY/Kj[j!ޏE <߹ܓEb$N}!%"e9YYo]'W*[# ֖RJl!Iiv'> R[%QT 2֭{ύba*Ϭ:GFfȢL}v07~,I(}[<|+yiy}v7IZ5ug3۸a\׳7>KTkPD ;;A;GJ9S~o^~ܿYO@9_z7>C?dM>H1cg.3eKwQ xqFSo%I?M|W8Ȋ*m}RkF?= +ys7/c3qUP6GUnin\wb}f8]SJ~+w^X$IfS! ~٧/g ۅܰ!yARy2bYuhvE\&ea7j%=u{s =7rw ɡc L+BÓ/2tGGq35hvW?JA=zz ?k1:N.} ?h$}{aYEȂ79ki2bz𮩞 I$Wi9/hwGaHReR,8؎o]a!&Mk;m[֤q]AI$I?R$E%@$I$IQw$I$##w$I+I$I$EJ$I$Ie$I$IRd$I$IY+I$I$EJ$I$Ie$I$IRd$I$IY+I$I$EJ$I$Ie$I$IRd+A͞33+I$IvJ-vo l'I$I$IRTy۠$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"xE)JLQgyAJ$I;9TdMq0$I$IϦRƫ ^ϰvON)== gj3dL~J fS~y;$NG _oPuH9[N 7 VԤ$&ؤ8wˆv#1e"2^ MObu~5J$IR)g^A=\u#][+Dktmv2G? F@.<8pQo^)w/iBcX G-U_N|"&oJiݠ+? Q!"PkzM,u!QEiN R$I$}.qm E>x;7E9߄,]K mK̮r 7ՉY=[ߛӮ6b3aU M?6o\˜⁷<}qcoʨ.$h /n~J X}Ha̯^>;XՇCJnz^l= vI$IMvfP^=Gt؍D:s٦:|<4v+Oca4޺6|\IH-ǰ_d^^dTPS|'w~MS7QogOx#?c85iGMqEߠ*)_I8 `0h?#qyO*6PQ!KI]:fn<Հ&߼NXָ!cF2>A# 6T H4Ԃ'-Q$I$]"^6:ߛl,^ڟ_ xq&J;9^mtjr^!0-AYzx@",=m ]?{z%BϘ# ymLvov'Z'(m#6oAl⛾aP3ɹ(ݓ 2)]~_2hAE0dzh ߳O&)N} fP>T tb'/M~MJ$Iw_|(ߘג$4!f|N- rȾuhV|ACٷ:՚է:(.Z~R/e$!+6Oʤ}$>\kV%O&<8 _JHaKt!.Yiu(!a9@mk?pl̫̯aþaSZp_$I$vxU\\ @Ys #?JyAajU@eY"g8ABX_AJ"vĭϘ ӽ%I$IRKǫ,`Mg@^ ɠnVLb#EE_"~ՑJ#~H$I_.K´4 VaM!u]C}*b6eQ%}UѬF|>~nMg^I$I$UN̫dV DOL:'ދ ?/+7px*OJI=)yrΞg+KH5]paT_>~) h}5U̫ȽI\0Ҳ_.FI$I_]н{"d̞5c4LR^^NQQ1=dxTτ$I$IR,8؎˴I&uڵk@ǎ-kҸ%czl,K9Uɠݮ> K$I$v9$I$IOs$I$IU+I$I$EJ$I$Ie$I$IRd$I$IY+I$I$EV%We3-I$I*eDۏ&ϵ$I$INAG/yl!I$I+W惫Hߟ_'W{%I$IvJ4^mOS6ż{A倐-\st\ @ڈ8aly$e4=3kJIߛ.>mr(xa|d,3.NʀGxꘚyȇ Rۀ=μkNU ^8[x{E6}%9q3shE*I$Iv]LZz^p8;%.b~a=& jr@ } b ?7ށ!^d}o0%g_Nۃvɩcн $z,=0uؿc-|4`˾ ?7?ksy%L X7ucr:qoqn&[b$I$IҮ6Xa*O_/OmɱtؗYIE͕ ˛vQ{m[gk4VG)sV i!NdƐsSXz2㱼.s5>3Ծ[$4o nκ$I$IzaEHPkXG۽ bJ8N$*`e=v%۲R 6PUEf$I$I&P 򪥑 rӽWw\5Gg]6I8U{]fzTna$I$INW)ɇ/ɲɼVHJFع̫I^埾οZAzޡ!w=z^䠦dfg_P[ثm?,ycu+<8^zߔP897FY! t:k6>xm9-a|8FA^Z?+P$I$;ݻw*B̟Y3vN$LwMty'3]7?W$I$IU|n ;;xV)b$I$Iҏddgy#!I$IsqZ$I$I"x%I$I2^I$I$)W$I$I,$I$I"kW囊(TS~-m[^/)*x$I$I;]&^_K?ŻJ-rx>'\ʄ!?F*s02kI$I$*el>um?67~oɘ__v $7^MkfQV6,Ţ /@I$IX·_X+=sFM\HVVd,9 jp 50w" )gSm9u-RV0 ,[%IH_?F8u-c5)ϱ4YJaeV&V!-sBI$IoQUb]L#eW?ɓVY@ Vc^~* qr)G}j`S-\MWϻh7сuH-0%w]X[#jn ܶ]9Ү__F=:Λ=umakﲦ1١W$I$I܇Eg߹  yWU6!8TxU$rIv$I$ISwl~ h٩*[eH N$I$8A[2"I$I$b$I$Ix%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$);C0LH$I$;ywcK$I$Ujjk $)^M$I$I;@ls8u/dW$I$IҎةxULzI$I$ a2i)u%I$I%)$I$IRT$I$IY+I$I$EJ$I$Ie$I$IRd$I$IY+I$I$EJ$I$Ie$I$IRd$I$IY+I$I$EJ$I$Ie$I$IRd$I$IY+I$I$EJ$I$IR8z fd"::pEqr Ͼ$I$IR+bݩ˹L2{) =ˉg$I$IQVUiv+NZAοM+9FI<:IFN[̪ wkN}u OOgK ( rλS;F?1tͱxXNSs{Q L}I)sVR&=;)c+a), rh|g6R~̃eԴŬ.to?.P'$I$IR"Dv@.ogrZ[~ӖԏŃd9z,womj\ t w\q?y!+_y`SpR|Vx=fK~rtf|ykټ4 \Ztb5~<4 \3tz}/ѡp*rCV$1H$I$EXy(oa)㳥4;~Rɫ*x\}ёĤ\?F8.ciyHNk:Hgwe2Ap>Ru"K?'1jLb-<;r!Z2`e#֣1NǾȋ:{6[ϥcXF9S݇˙|oz^Ƭx5I$I9_kvH999$ b?e]a!&Mk;m[֤qCz#I$I2^I$I$)WBu!I$I8J$I$Ie$I$IRd$I$IY+I$I$EJ$I$Ie$I$IRd$I$IY+I$I$EJ$I$Ie$I$IRd$I$IY+I$I$EJ$I$Ie$I$IRd$I$IYz I$I%k<X(/'LzEI$I$ b)8A,F_=^K!55dJ$I$iG`vFJ$I$iGɻK3(I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^I$I$)W$I$I,$I$I"x%I$I2^;;$I!E7VO4?x2]y'EQ2\Ѥx7dJ 6dTI}sOm+Iirε/|˗_ُ^C{*Ĕ5ToQ*~e=> ?]4zf~+.`/KKU8>ե9|{p4|/]A#Jvi*Cxt8}]붧 (iPs(IQ펥O;AL*e|SO|H~C71[cҁ|vM ?^Fcꑲ~o<,7a66doNۓ#@+x;Ǣ : N.Kf,Nn1RNm&}MĞ-#?ۡ/õ>ڿW]ރ (xo=3Vo<{y1N:P |~+z\| }ԠL!4g3SK3m3r^CqP|u;sbh~/og18O2A'3'y{b9v:N]VmG 8/Ą8y.b}o4$Iҏ+p.~ɢ0`Z~g& G^|9 ?O7ҚZ~\2aW&2o*x9QN8/R>*.$1ޘ )\u;O }G.̃cgQhs4m7}u66{|hs6T'rTpm``Шyw9/==?`\?Jߧ!#%sdGJx?yMʦ y&7ɍ;)LX6'U8.m. b2F6zsb&YA\&sϔj$aC>Og\١ty5O13_?㋕%$.I SSXպO\Љp/VM 2yEL (`ؽ<3qUN;@?_f:ڋGuQ)]ﵑ~][ҚʚA,Zy@SU-?֠Y< YT?A'ٶX 0^Ic&[NQQi"$NƾqNڊ"B29fiA: ˤ^o̪APX\:@z-K2ɭJJ:ۖڼԬ,Bz%I~ 4%4BPPFaWytl[ѱ m1Cih# FETxU$}1A_()0~V ?9zr7mT_KkuWwmE)y¤`,NȺmiF~vԖ5bB}GGQmf7 @ $Bh{Q@ Eł<`΃QA" EWIR n2AWD,`sN΁Εn^v7E]17WgZ dN%aL:tEA.'O@}O\Nq~u2?_*?\ʶSjLUo}HEvީ6ԧhAּ%7LL]쵯wBflu譬;/<: "9UItVşlɖW繧掙1RÄ~,;z$IN`=8I;||f*~-Q38ԯbn+L<}%XT?~xҤsc|X9crsL^xV Ͱmÿc{8|}oo' >[f ? tufe3s\}_g0]M[+" 8w;z1o)4Jf_ MboчUɂkO䲸"[^Er}je4Jn8pVĸ(fpZҎ. g5>t;&umFȲx|*β&U 9Bq/qZ`R̷̎2UB0;>3VcL*̈;^{n>K/Xj^&aa£5s o?[`SnQUDć<9[pcJi@lݲ?JoQAό'w|ytic;EDDD.[>ϚVZn#Oًw@ý3Ǭo7z1ay2U cX؎PQ:r["r(QjWL}o I~~~dIKB|2ocRH/r`$mE3P%/ߝm8Qd؀#dLڧ8;HY/IӃocNKI y7EXdڔ^w&UuTp˟lLT`<9uQЙײ<13ݻi;jnaM<30֥1>Ŧw$8xSqn6:UQcgΒx{{aZX.}G\s4k ֭۞Z'DD~OUfTcW"""""rWB*___:TTjy%""""""""+^HJDDDDDDDD*,W""""""""Ra) KᕈTX DDDDDDDDRx%""""""""+^HJDDDDDDDD*,xP1GtfEDDDDDD~*Y:""""""""RQ۠TX DDDDDDDDRx%""""""""+^HJDDDDDDDD*,W""""""""Ra) KᕈTXV@D.۶t")**PADDDDA<< b!nFB-Dٲi3/OyhW""""@EEDGٲi ""+l.^"]'2Ty#s‹\1*E!r\̈́My3VǦgPEs=\[o/fSj>5i8b _6s4ˎ-)=<M|tň ))*>)cj~K56;ȟQTX"ݟ|K@5Kv3o}9ʎP0ow7p 7< l@o/~8PuI\yPy8»q}iO6Ϙ2 51w_j1=Nrk⺎`\TNİ 7Yc6f._Ǒr#L|oƐA72bdؙ+k-$9^ATrNڇd@Itb6g>;d;3w7988N:T;͍cȣ[PBW0dЍ z; C U[sפqV3ѓ)H r8Ր*iq1đơGBQ:n$E'&œPf=9m-KѸSEN!ӞbN7EK>(wy{f*SJ  X2%Au6!X:q{8>Ђ Xy LHj)XJR0yS 7:k^}/'fђ,zvj[Aw 7l:8]p lT9 t."""""")QU nʆe 3CiÂ}v:M={ҲJNTsA&I%GaIbrFxK-7Q`&k~mxDRI>6T.فGbJ[OD?e3Ȼg"mEDDDDD I;EpD(`᠞4عʰfXX&J`Oz78ÁZIG "Ȃ8n08FM4~O ŭ*U IGH0lϧ_ ui_ףF2ٷY#b@?׽m)L6|/>Ƒ/_*Q*,^T5#"""""(o]E ?up}P*˖'Pz$X,;En`(g-kMH!'2GSH^HW)$8kpU5!R̉c)d#ՠ01S22GEyIU?6yYn~,? 7O߲9}cgr/ІDR:}b M(n0]1""""""kVEgIK&9&Xb 2w ڿ)r8zPt#jBiRŀW>(ۉ?y2h6ZDu$yLݒtbffQU\UWi͓kXo?*S-#"""^#$&DNQvfQlՈ2gG \ƫ'S4x$&< G  %+ 3bB"lS%ne]|}EXs73eKŀQ-IdVKNffv?qtMscDV0z{.ǨVc&2qy2:q*%%7=©nmsW# gI8jVJ9؛Uހ;0~nS :cR^]#@kMZGTɩ,5.xNDDDDDgQ D"2 *QGNz~ '=;۪/zw Ԗ5{ҧimx6z =5~\ѭM'\(tMŻ Tq"LO [.'M|5u5^}Ae?fsZ}Q&#hvr>ǰq5=Q<z2wWBmgjam҂z9=[Lٛ4Ξ)vInj{QtRR9}x|i# ݃[;l IDATuaD-5j_o@ZɋczA^HܓCoD6kI4izKena&TyNDDDDDʧW"R!f./cw ϣzq9<*-h*JٺfDX(]Iv[4(o3դ9M,]J_[{uSo>2[emDw6t+ym+Yxq F q=f3`vll4م9l_9=I|l*[yz=CSt R +Zf;:t%l4iʁ}'/z66 _%3{7~,c'?K'Hz!mB_9NӨJ5Lg㳏ԡ]}sm]a&~U֖4c2n}j|Cr2}Ku R@PВ|!z%}0%6FIA_='W"""""W: tLJא.!ҟ5O0Ck8} 2_t SdeH=–ҋۙeؼ-"Wp)9¯kзoCjBv=ׇ9afqڽ#iWў\0li7u-;]Wn䧓ҨU8nf;cJB 5(oTtd/:Z̨EDp%(9‘بO?gNOd`+9l#Nra*Z\݋[5ۍxc IgeoSZD=iq]~ɏhL#A3i 3ٽִ;5v~xW1}t|]&D4]-&,c) ٤9mE &M:ru o'#V*SCD{/{8]>]8;"n]L9ڷ]к-D5dŌ  :/""""W"RYʛ6VvH;;Vb $( P+߳Z+ɳ;m;_oO.a|i5/]vpsbۡR5B}K9yNw4TJգnnx<ʞd8L SH3La̐N5ٹ|RP`Q*ؑt8KmhvO[wag ;]*ATMj5 ͱǻ73GB,v;v;_H3h_"W3հRs#`/IJ`^D^ݕ׎ѝRP,CJV l L*mo?ǎSBq9 ixҤk%Oo9 kr I$MY>6ۉ. D8x """v""+luh''R?"/DDDDËr":WAD䲰"r9nӆmڨ""""""rQJDDDDDDDD*,W""""""""Ra) KᕈTX DDDDDDDDRx%""""""""+^HJDDDDDDDD*,W""""""""Ra) KᕈTX DDDDDDDD²"r9"Ta""""R)4s~D2 DDDDD**W"rR4z 'SPqD.7 ~텋 i* Kc^eQZZCp"^\(|Hiij"""""Z^%S@[gй~+uyFU#T @f4 1;}h%4oYj}%""""Z^%WVV4vJoҨjS; 6+AYY #""""+,JKIHDot=X\T^%oSDDDDRx%""""""""+,ԲCDM?BᕈTX D_ͥx`ae7A).y~^&OلdU DD~ݜd3cQ:iQLo@iu7$FR/=+8k`-ʾRhxQ.#o_ߥIG3<fDDDDDDN DB+Yӗ!!<1hm} _c+l##r<}}C|4oK G? d` Ȩ wӯ/{Noŀr%ؐIȘu50L3cV-Nv5 `h~ԍog^pL-BL%BoHn0X8f4+Wfqz)5z c@&Vɫ#~~kV{M>?TLӯՎmg f5p)Kfoqvb`Jlד`ӫa[~f۾*ik?`{)[f6퇍`dk2.bi7Նՠ5W]דK8S*M%b §~y~)dʕ*+啈T\Jm$uңU0wYw$p:=]A\?߮l+6n!*cim/|7ޅ+Zl:.>ٔKYC&uPUYܻzu],Mݪ+ڠf%MFtOїPLͶ]im@J1=8Z'38iOv\ӳ{Q8jnͤ4o<yٙM56Nȇ?](Hc;ٽ/j᮫/sNFMnn.Fweߟ|PW"Ray❴?vN'Xj/#ЦF@5C$fdky7?!,IYĥA 큝ĤLL ,_+LRZĜw'g#tt8eV:g`I_?8جgOyyUzJ?Yģ$:Mj7pj)ad[t^M//)eZnUI±JdSؔ@lfvh@`7~OPf#A- œo@x`3p!jTN`wfcfFSY8 *Y(ݽFja1O-|3q٘xZEj28p d޼yX>"RQW29|V-_k͚IDɎR`DkS &O^cZnkX2b|_ڷ-Ve3yƣ GgJu~ujxGįeYf)׳Q/*z`ɡIٗK/1k/.eD^5.uJ:JQ_-O%PnjB8ڞZϭ/3-G"s[K߬\Zn]DDDDB-D9VZ97>w<ԁ^E8ݥT涏7s-w=Ĥ31 ? kCK<|wgc~u L5oAku<^,?`Z1 """"WA,XV|ONn.{\_fQ[n{fZhuX˛o """"""x6("r):/x4QADDDDDO-DH/0*/j r啈TX D@"zo D辌C{C Oᕈ\ra S9ˆ dF3nT"|4`\^h4'~x 1;hs"7O""""R)Kb``P NGrsWUip#k6fa!T\ D;͆O%7@vJK1MSEG xzzS WM]EDDDBSx%" u&Rx%rRY\\ll۠Tp D<0 ^%_>=kM潆 붥d{VnOy9̂n_""-Ǩ̾5=-T\v0h=u%|xGct[낾ޏg4MDDDDRx%"LlE=pf,s[Af^s]C]\e6\ 0\Xp=3dXTq-OФuwjK .Պ/,VVڸޗ"""""BDqMɣymX0/O?CxNT*3M_IXr;fkAdϹw1 pyF2.S2͞[tp,ɽ_j`u<|*KvI;Z5|]ckq;yYX-l Y~aaΌ<\ņ{IM0kyhTZ*.dvˌe‡?ύfa*-uNmKUӏoSb3|yW`DDDDDDlFђ4lX|+W68|3_\D=6*Y 8H;ğH`!YNݬ.8ą$B*+lׁ-kt0}j}ZV48RnguNS+w5pQ}8KDgnB>&QguwsÒ3@a6<]B^ϖ"( [TfzvWŠϟjO}o.뷊,*\.x.n]){Orf,f≌J+vH}H^-qx~ y\|AFszoዂֳ3# RO$usOg CLH֘dVn?1,*:9zz{5omIKH2ԃ>yx8-p8a/Y?m0{ O9|ۜiueVK l1%+k_}Əd]:Z'%e m`qmZ麶Of,]ilnپU٧%/}EEDDDDOE1=\WOی'z3\Ec0mX Wi0z7㿺ΈfmfNArNn:Y ym.6 IDATg^@Ǔ Cb`qr14;-Q1\w;+M=^_`yxFL̀Q? Ŀ ?Ȟ:Wor5)2[|LUx6p7셿G_ kʌz_ޅN!N:Xj iKU"ff.bn[ݻ[95goQ4b`r-nɊ _DDDDD#**t}o I~~~dIW sK:?] EDDDDD.֠vt, Պr;gϞ^Y[=3-N Hťn""DIgȺ3EDDDDDDHJDDDDDDDD*,W""""""""Ra) KᕈTX DDDDDDDDRx%""""""""+^HJDDDDDDDD*,J "mXpI """" ^1pZieW"rlٴM%S)Nos|t{- t#n?"r*},fLI𙖤ٜʶ;6d,Hyٜ,Fu/]1""""""¤xѬG_:e~O=d 9w )$vSihǼζWd_v)4T @dJlBtm;yq|4TʑR#a$:nu׼^~O͢%Y37uņWEݝs5yf9|]w0#[z%N84bp{W6,L=o Ɩ=34v4ݫ6jIc?p0.y$S?LK <ηHZ5jo:;ʗ;ML<Ӄ |lT]]̙Ŕz*M3sd]tC,$e<2/>O=JTsoZJR0I&o3O FDDDDDSHr)#B U5KU 3c5t(:!Wz.~ ;emk>*ܳ 1n^kt6ZP$I$iۚä:bXW"W%D\QAі3YZ`ïK)LnFrJ֮`E:C5P}}sM7*kI:ۺKO0 {l6ynүw]ymP dsqRnZ-x-xD3&cHi\16RQ23c&*$7xK97J ;ph.xCV{"gGΙw zq]~^۷o$\a,[xobrrrM"{<䁃~/~wU.r">AR$P:mr_y_CK'l|* ڰ hsڇƱɥWp׸5*ؼtiy{KD4w !u#]OqX$I~Ǝ E>,;efeeڷo@·zQÔ?g+IAJCAQ[J$P>f H:m㸃S"w`m"YlX5 Xs>\{lY4>|bv`NT ,oY,*7h5JP m)J9:TBڢ ~n4S3cw(aPH^8ky,-&"˚Kp3tKOV$ GLϸG][X(kv}1qY۳ Uf18qbt~hd31>Hw1tOJ$us2Zr%v;KM`٤u׊!y /iI$Iᕤ(&;&e>8MoaBV)ypXǦm:7W$'YPj*A,n3ӪҴVglWn#WbG:r7HY ]!i)[ԴloQ}:rH:?4I4aR0'r"&4iL䏛;)jWd.ZKQJGwiJ¥WJhvIH^Ҳvg~ͧ cvtbX9iz[HߋV˶ ETYP[/9>rٶaUib-'Ѽ0h>`T.;?a 8a}:qǐm;+X,I$W3 W),[{kE@Š__2;$r~tC,(ٳ܆7dx!}˚]vtk;. νNiŋJ内]< UiҮ.@<?t#gy nA+pջ&>|;]Ԃ+0սKG/Ի4o\5Ѥ"d+#nbٺVA-Hhq״8YOqrpOGoi.$Bat, zw]S3K 4Oudnr$ s d`4 q-9UdVdA $I$zWVijG0s%v˄RĹ^-CQE@(Cer;QĊ 0P;|tW7f+qTL ;X8w-s CQmQĒūw-߸cc*E6 ?^DڶkL|a*g_6{'>k6o~" |eBr봧CJ&L⋬X: ,u۵>SY6Ul%RMp9o?%w+ [E{U籩q úeV)`&+oڹ7ar̮$IwX1QR*E$p<Ks)"H.Y 2]JAUnL|d $ ]Wt)$ ՁLYQWI*[x97Q6УIغ9?+ƠX-ePIRb`rG( ЧSSZė mN3X8s!:tnY .gښN &^eYl9+7eov9 Vo՘J䒶x[f|Kj 3ee?J$Iүa+I-Дއ1m-4PvMjCd+m yV[#H zU+@ @#{ku6f28NS-T- ; zpdn:s*41x2C뗍w5=6SAf:K.^2ejzxZ%:4J̊4y$TfN[EVr+lTjV%KI9;V0E@ 8bK8s7PKNMd0giU;ӡv \]]. ZLa--e;?߿)Ȟt\AN/x`B5̙u+I$wcx%)ʅE[(b"[5w%-[{ijX~ͮ )b7Xײ mμ6xtL>|27ЃJݞӮoi4oלO[(/bGN>,胻p+ٴh-˿5Vlzf]a”8m-uN[%8mO'|p>o> t?oF~P2f2{s ŇM0 5Uݶж zl_k!5GZHT;]7*"{z*-Z=C/I$I-}K"Y]6𲥋FKKK)..&''$2W3!N8w[WubqTHKeൊ5Hܶ yo*uhXQ.B"5U&v_I1A<ч呔T8bb(RYGF·n0ŖW 6ew_kudײe7:ĕn_csz$I}%I$I $I$I $I$I $I$I $I$I $I$I $I$I $3 A$v^Ig֫g$Il'Iᕤ}fЉ'ZI$?I/bx%iڽq#[ !$IIH(O-ڽOYIR.]ܥ$I$,$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IR2$I$IRԊH$b(,$Iᕤ}*o]ݟ$IᕤiS ?HXKfАԹ3D",I$E-ǼO0<0r$+W,7|VXν BIIE$IRT啤E0@C;3li$[ iKK[ /i37<(Ŕ_$Ily%i+--%é'A;&n7}򙴽c21{$I$i_tb9z7I}n_yHЗZ ~7 iGhԢ.1 I$I$!~!fNc~ w$PIyK֮du &5(w=I$Iڟ $Eecc*u ف =W_z$Ps8,ƳW9PVC經[S9/ғy}n.$a\xP=M}OdaX.#O-䇪Ҥ v14 D0m3<>yik4 .䆮uXz\2]/c5qz|TyBGN'El!r…2EE}pIo%A#oiFqp:%ѮqC$>#aȈy@Y믯s],m|D؇}h; NkU5 lxgKF\{Y.{M%}SG0?n4na\\@OSc ?< to?9=2i MΧ$ [(._Ƶ~x[7= +t+nY?Yzj.@x\|]ny; s*@(H(.@ 2p*׸^{|N^k bܸqJ$I[^I^ tv.M5WTh__<ǗWvTB@N\{Ab>r$s8k%bIdx4&m?F ? |!q"rd-j5WENP5zsbW]ӵsI!SO?8+\' By63_[K.wC> c*<"%?eKXIU Mdm6-[vPWHqdS$p%ùkyA y~itisE+Z3L}ts毡`@]y f͚E]DVV^x!O<Ç\qJ$I+IQ42IkgKXnqE6_nr3SԮUb6o&+Шl=jtHN _1neRhS{PD-DAzeR8+8fG=E6ae֢90kd:gS7 )3 $nUZ5@IT S& I#[pys ߾VvVtq4iU@$RbgDF ,]ϚuagxUT>k@תA .B bccy8ӹꪫ(,,[n /ciI$ $E1Rxu4Ȟ̝̟X&LBnKO ;et\޼"7wG^||wR\JҊ#4hYGV(F>V?7dt>^8\U=i} 2믿ꫯk$Itm%EKR R4H6[~d P6py8jԠbS"ۘ4즗ƢRJChTC$W'@1w+n IDAT,ץ|K)EI-8WK֏'eA귬Kb-Yq_CNk~Ud*а^}xkchڹ6^~Vd,fjѦn<1L__@$w!Vx!Gqqq 4Aꫯ;I$\l $EZk[8}> qR>d'q  lf4Jʑ6L_y:Sex,PzWlQ2)f}%ՊI<73®GӼf5j',_f"cl%}ʗiӛ la[/Jᑜa=G~I⺸YoƅNkdPM?mx!|/ZGU ny7M 3uoyݩK^[O~1H{W|(K$I [^IZՎ;Ix9Tu;-5K;ټKC1,~>o1xޕ"qz"}Z>Ûxj}=1^ur<=7ǟ{R- ]t$m+0ŗyP|Չ'^[OAP1DI=(~(B5'׸Εw\Ðu;(QI?DZ_c?1F^Bc?)@y~]nygfdRxiK Q$I~۷o$\a,[xobrrrM"{<ҟT$,.:\ƍ}wYw0,v G6'W^krcrI1NP/Y" >CŊ#0$I3<ч呔T}?YYzΝ5ݨa%ϤpD~w>9X9тH$Ió۠$/̇W <ȂH$Ió啤?89I!d I$I$I$IR2O8{S$I5 $3XbHw *X I$E=+I{]  Pz ^z Yi?HK[K@rޟ$IRrvIDLl,G:}f0u "g9X !Ifx%i! ҩs0&~֭[(,,8>O5q4iڌ`0HL %I $UuG $U@Ѯ};(-)!X$icbc B$&&T`Ю$IjWXʕ#66Ĥ++i.%  ۠$Iᕤ}9KC!+i?w|$I $/?6-):ޗ$IR2eI$IR$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 $I$I $I$I $OdάA$Iҟ$I$Iᕤ}—ǀCjv~ݷ@d1Oq2ńL\F<îz-0 >$.[޿ܺdclT4#FY9"t3#hYo̱Ny◽?ɢI$I\%5?Aj$8u&-WqFcX2e[cjӳGH"|.,Kb 0UK$Iᕤ}q gw.m-nɝX4jVSk狇KYO;߮L ߖC| Ô_co3T=Î/ӈ?9p<52ut{<O)_eEv DzqO2~d-XC, O]<Oe%^$I~+I\d\xŻg_$SP߀ӯ@ smcYDn8\s==Ӽa4֙S#DA)&c_v?JʚWv=Zд_?:'4{` &.`{| ܉qb6;#W|eLcP$|E^ޛpXXIBg2yC  _˖8Ze/YHz~b {Mϲ&ҷf?:NiKWSkG4uC"0vFJ*Df} ^$IobAI!gr}ﺻ, ࠝ ͏u} ʣ;=JM*`"!j* G`ghTfW") >wJ ,ZsCO9 .&!>4[ұG{NW67u1m{#aM5k lm@r8PL8q~U[qtxhV="ˌjKw=_arss΍P|uR @&;29sIN;%I$&Wm޽U^X z>˄#s\z>~>+gӧ3n~w*1[؞!^ * /B P |Rzn^ˑt)%3'#~EviV4/.;䆶9wUvny{?V׮"YM`Ji268Uu,M>C0w3f|qJ=Gx浩|7tzQNtٟp66}7si߃7㩍 tОW<Gt6}93Rѥj<&i @l\v+y@$ЀZG6~@-u,$IJҾsc h@O1!g׋ub"9z$8O[657'V/|C;z#R Hx&X<\č'w/= UN`En]?"!'k߯(σNfrA/ރO7?灇3{N,za2 ~ &JjK87HǵOd,G.5n$Il'Iᕤ}&?/"H$N~+I$I$E-+I$I$E-+I$I$E-+I$I$E-+I$I$E-+I$I$E-+IQ4P.7/I$IᕤTƷď/u{'x4++Hac#O&* -GO1U$Iex%OeGx<֫*MvA?*"|m=1 Z*Cv[yzy$IWׅХОϥO i{qgX:mH$IR2t( kS]XKlTzpnp07Fz9|w.kt9Wk]']sbnڅVU1g"S3Kjw.@}&>JF,]4X-jRp+KoS,I$OJҟJ҆h61n~ ؽ!5sق>Uv M1+(NosU\F>:L{r3 X֪1Riljv$gugQ)6@cNeAHlYKHjq1K#\z]=+/|$I'dx%uSY7y~iגHVUcqIW:Q{9|?¯3iy?=YNH 2:OyD砣qtT`E3jޗa~ѱl)|Ӓ$It }ϳ@M3Q2@;ygn VBlH.~h 8B{*x+{^Gs,I$J!';Hv"+Qaӆ\ cߏIU-l";Q/lҗNB9O9s#~=Z&ܪ-?&=;uy ߋC~ -]G^F4 ~@x }G Pz[lݲecֳjC)4eNއѦϻ5g58Flz%I$ɖW羃qi~\Y{-Τ~˲mVt=lzSĎ5 .{a~IᲾ̼m S7ZpS7'߮dsQJ;o'ǵwCۓϥ-E̻k*21qvyo9<dYY $I$ зoH$šիXtYZJqq199 &ѽB pA! jsqIXl㫯d< #I~Ǝ E>,;efee;w>tt)MLd+9 L֪|"I$)j^I'L,$I]$I$IQJvSM0񣧸IE$In8ȆT W? R ,$I$GWU6-ɼD$I3 Jn QD,$I$E+I)B" 5&ElݞiA$I$) mPp (Z0nQ$I$) J[tBm{qꡕ-$I$E+I~\ƍZS$I$E+IM $I $i70@ZuI$I^In*૕$& E$I#mPv[/9R71@VjE$IJ~ LTZI$I6(I$Ie+IKr;7'X˅? :H+~{y8^ $IǖWe=%6GlQ*<(|}Mdo]}|o'X$I~ex%I{&4 p{_ĦUey"%I$Wv&H}˦ƃOƊ,JB)vE\rXSlJw≠mސ|,]$Idx%IQ1[ SYk'oVn[0~NqK39Sd=|$rMbܼ͒P W$Ily%I{Y†x9؆/EX8E}3kf:O1jVa2|X&neB *I$b+I%̖rtآ4w#S7:U5}/_ϰ ^$Icx%IMF߸ΒH$Iگ $I{ڔMA$IRtp+I:ETY*$Ifx%I㹗 -$Ifx%IIqA\h>bv僧ďIXďvg$Iot>!N$I $)Jyӓv+i{&,>u>mwWsMA !O=0n t955"||ܱ n|/_6UWѫ(*w} GMgۗ/p=XOs5gңV ?GOONy>~ɒ$I^I~[/~ [SRTk..GjŅ-Z6'Gj$jUB>M`4b KU3Ӓ$I[9`$E`|{ 4e1xh na_h9攵 TB% C[\&I$I$E0ٟ˿e@yrRHOgPT WE~z;ѿm-J֧Pܾ'JQb.DW1im m;MW%Q J$Idx%IQ(&ڢJ?,'·4IDAT_⍕ŻI/imq!vQSm7k/:h]syWțp=˕ݑq #X5}S:S%I$i/ 7.fuO/[xobrrrM"{<䁃,ŸĎ£rH;N8^D,EMs 5Kp s!-gLmLM h6F\RK2ńɭ,A A8a\/\9?{yWIv1.Bs6PQ19w9m+WPEluB(>]y+q5}J?D{Kzjhg6T>'#%Ugz`qj" cĕIm6T)9CN*-W_zrV.X-e6\Ѻst =6oר/fyKFIo%6ݓӀF]zoEֲ9y2ʜqv 桼ʞHheǪSOƶ(Eۜ*T԰E%ǖm6* )[l(ziY?EKROW[^;/GOڶ'}zjBp#U;r[M{K+it`}^:S~}5US5oQ'-]积R\B}1}'>r1 9UtzsCAد4;Z^K43,|d]Y?JNv[ja%tr0{-~kOiƇAj2*[ҲK.~l9:.Щz#x29%Eh Сꎑ4n|ϮW)(M5hHtϹm)κK50.u(ol=:.>ܓ}Gite?q9oʳy 96Uc)mPMr[j6:;VIEoKoاuIz'Y!m.jŖxzEyu~NK;(RNlHrnwL­c57Y=Ǭ ڮ=JZ7S-IiDu:V_VHb4J?Tׇ2X1f54Kˇ׎&=jbVf}"+%_kvz`٢-&:Ijy&G~(t=*G^~L9~w8T7^ҩ M[Dz=C*˕$;Է%~꺋b jcȐ!.GKGJM~8PoDNS >/jӤ::A=!@Gv1Z:gm_9){W9z6=5a?ӈUaZ\(oo/yxxdYrrsAA-[p#'~ԡ«ԱY]?釸\9wKzIM̓gPeW-$}*VO)7GyU,Z oI|-I6/ְVoJвּz[ !5!Cnc=,$|꩖=Gg*Q\LDpg:5y"-zӡJ {UkgaZg/loКIu9Oz毋܁ TTn\y!; qZ;+njʍytm֬yMIQ^@)fƧ/r:U_ VwR-,V͓پBwv9cf_v ~iJNN5ITוO4:XTR}m4T!%Tz_qWV[N$м | 52WKH;7p*q4MXu\=\;UwO]|>߬wR$mcQ&&m?%rz]/>*6>chMFJ*3ˍKdr/{랑]z-rTY TnQvէGLW~J[H.$KzqpvhR)ɮW=N9A='㻵lNL2geVkVO1^OlΫ~nRص'يqQ&6KSp]᧠Zv6MԢDH)5ޔZ|E{^tomL5V6uҭͮrKʞ͋xFβCpKWPiLPmݨ'뎑]TGQ[VضnnT1U+ݢ*kjEё^5gZ]/g:yJ{mRG7+p~?>ɟW~"ۖ-\%{28@雳]XX]W^/q[_u*â[:5rwkiY^pe(nc$R~"֬=H)Gz7)%r"əO$HS\5T ,G-U_ }4Q\2( kYm:-z9'+e{\W%cWT/K=;K&"aQ_RꏴbD@-V'OQx1 .n $*TfRvLT,SPP^@9Ir1% +(8I͂nP@Q^@9?oG}fnWP/)jSw45z/"FWPqS53J^M  @9.%Iv0 P^@9Ov(-p HrXoԓ^~_H((@-V'OQr't 5"P2IV n eUٟ+z]-+]j0+WÕ]o>;'q@GycOIl;A n n˃Pxɒ .˕WR+~(poQUJerhq%Q^2JbvWQW! <%pW(+W{g= I `W8y) #"N')-$jFJѫ?Ҋգ6ϖ?+cРAcmѲE Iѳ+33D6l];w&I[[ 6 T noI*Aie#s IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/path-params/image02.png000066400000000000000000002033311461403617600243650ustar00rootroot00000000000000PNG  IHDR8gsBIT|dtEXtSoftwareShutterc IDATxwtߜ@h޻(*_DTEzŎڿ뵣b/QPDAtPIBhIH9i!|4g=ϙ5/{18رc=sp?Z ,9rrrp9sq\,^ذNdrS""""""""Rf3k`1\DDDDDDDDD*vVJ&t^c& TP^{&n7M4bۉ!.>M""""""""v֐ 7--ݻwa6*#GrJk'::tRSSX,pl:*("""""""RIBC&66B AUNXh(Gv 0#"""""""R**9[]k;x<",興\.7.sr&ld6-jb>=9]N\VH; 4CETx%"""""""rsq9̙ԩS1_۪,wu'#Ggk-Ղ3g.'OU:^l6dd0k&ȹqq8]Nrsrp;8s `L<\mf&OȑY`^A\L<\:^`է@0y5[-xy{=+K#""""""w>|m giC^ÂX`wAC^Sd:ٔy`+j up9]UZ0j*2lrY"Ղ슩.""""""ŪʅgN,f ^q%r>%ב*{%ߥ Rs+tns>_ԫɋ2S>tl^ev= JD_DDDDDDΩ ȱӰaXqjp5t5DL!\`. ++ɬw[2L%\`T 2{bIP5D8O9OTI]Z;|ק}=3էX:Q}%"""""8G%,4 ThJKKANUTqx0hB/mW P,_u]HU& F?|NDDDDD&GsJ߽{WCUO>Kux{)}kP넙ѹd_Fe8&WK}9/"ZGW2g-ѻfE|iv:xa'̤XY3YVp0o1J3L/GX4{~[>PFD5lҤh&U0Nj^Ǘ/lʧpR㎍_7p%3 Ktn??F+Zg5<9xe +;aGiAfVTu{T)}1| }T{YjUK-/I""""""rAka>2Wl߼Ȉ%^[/A7Xw''| z?oF@}΍oƼ?2QnH.[[nњVأLZ:,Kc\- 0]՞>(W{zfǷr&̚Q$wnL{OE|o5+~zOoxϋ A5F\B`/QY9 &8),4h2rڄxcNO_GtՕBbe4` z`U 5f`=> p8r瓔ns1}n[ G{5s(Yui]hVxd*ݔ2'i?m`E]4[3xLR ٬ޯ>eyVN}M4zyx<2e__ KJ}Uy*/H#z᱕G+Cy6%Y]q|JիGkz`͚u,_4>f,ʉ;nrd,q^<^ƛm[nլIDlM;F:ʙt᧝~1j31ֿǒDI{O K I+ՂG2v,,),_B /uyRa{:N#,ZwE|q[ݴ`ӷX76nF}<ESs_n$MJLZ:M=dO~Qeŋ 5kªjF9Wyywe""""""RLxe;?XJB}qGfz:AL|A1mŏr:~g~rTaKR+mkl 0<< >Gpߛu<ܕU2qާoݯ Y' JE_j͚uX-Xb(ZRA)˅|r5(~ b#ÿO.EEL-~a},gfz.9N[ë37 دxcበcXi0E7`fwl%q`')=#1Z޺gNsX",.2h1 MeMd~{ŗ@#Z`YMx+\Fʤ_>aU^=p:EBXn DDDDDDëÇ9d\cA8 +k۞ٰ'w^da߁DF 6)0̹P:zg rv3CuDGY2w9 qz~rMU{>]yj6:^tW=[~t!u]*+tv ZsI~ hñpI^r^$ӮzW3g0gGGq6=;]|1}Q$={Y ٶ:dl-1JcY˖p"\n:vJDDDDDDëݳx`1qDI^5!yRn7?Wbӧ3w3cxN2`1˩%EFl\ŲqnoPn_1kF{>ޘZJ伾&}}˶s~93JDDDDDD{/[BfzKュ<ur8kx`zJ:BDDDDDD"/La`6yya "/ Gn. ˉQ߈HR$ VS, EDDDDDIML,V`jKᕈT[ DDDDDDDDRx%""""""""ՖVj{ۍ('""""""Ra```20̘T^]<. DDDDDDD*~ۃӍ'VقaJtp9qWj;ǃ]""""""ry`*C$Éb5c(jhvq\8\})(\=r&t鍨` . .ܜ*VPp%""""""9WRU^] <7\ͯ9 ۭ+JOĬM$n{}NNo>جVVY=^%msnݚ͚bX`ox8s%-=Ǝ᫯g-CݡOHyy#‘˫\}ddff: àg0o{QU~pU/$ؘsvV__zY%֥v' F¯wʥ]rUW;i߮o*W1֭ZӲeK"""%--MT=hՀ5 w&/"""""Kx<[lV. bBڵIMI F )l?CS^hro+{e.&  lJd,W[Qh_z}Щ?.mB$FndͫcA؀kB3X&ʻ==.""""""UVԩS-Zo߾UɻoX*&~ e[֨a;v>/3?RmUxxUN]&u֩UF/o/XQ$VXpv|`<ڳ'|0DF'dOm$&zrC<4 5=qrƸ[;Z5~$6'|`=$W z{37=CLJ݇^፞4%V?S4e|6t-Xu{cƻ5ld_o6u&3'@3SUSaw#""""""׻O_W>eBn_r%K=Ȥr|r/TR^U @g̝s]}uŞT)뮻kqֲ&S_iJPcHh_aO*7q/ݲ\G.i4.C/nךDrrٻ-|ya\}ppyc>/6io#=ltzTlmU7j7m8p5q9@<刵!Aܛ Dc -)aRM|Hs 7K L1la6Shg 7W.[Xbnz0F3;'t-1L\ޭ{$((՚GRQ#9|^^%أ3`,2*r rssKun:U#+Tdw{< q"SǨeɀ_yt"E1sjҋ?)5<'I1:Р7DgXy14 Ԛٵi9{/?=YDdqLٌro_*e 㶱/}|j{A͛kuLDGŻOjE#S8{[нYL&͎ߒ8d+Zv>X'T%%5ޛ}?@ Yz 柘M&Mzkra>#J g &OSv}wUx9WZu2^__Xv]Kiڤ19c`||<˗`ҥU?TadpT1x&u??e^ۮO%OQL7JP%eC`N,۰atjā*y?=F}7%e~ROS&;8F>ȃ'nxkuaNg1icNf!5=CY^t &]t$++>xﺇˬYN&nnݺw/_NLw0 4iLl1مxRQQ+gR W8~qMVpp@\Uk Fyֲcnevcv{KFҼYoެ1?O䋞|:EDg)܍!],\'b卜:.)5;wҭ[wl'٬6uΝ;OK\UČwvռ= [߾= ]s5.!WI} R飮+oWJ=>{3kN[Cv\y`v;S}]6 J~[:R/F:vȺ?*ndZꐇp6/n=x'ܷAtjVtiE*sҰP;#R%m%'9>lxb2ܶ5ٓy>$;t|O:v')xWM7/~CCOlwԣo1I&ēIP"11ظcs섅5$,!;q $$$r>d?zxI?C|Qne4n}rh|Qޟ!7{o*eq`I8UtY: m 7&aNF!lޘqu6o!ڠ=F=:6'eOi &2^2S+"5ֆ2s,]EMiցW$,e7rfaMdae@4 mD6ͩk394oޜcqy=??Έs,6f͚F^ o -olS\J궱c}o>JoRYX}z!!L|ku9oJ -_ {NOѣob蛊HOgor͚rg6(i𛔒Ąwg?"2@ڛ5i>@mxWINM~ hN>5~]UXH0G:U>xᱧ_㊜X{f@Ҕ-E`ټr_ _Dpj 56 I'g[Ǖo{VHK@Y4?c>aܙI\.\R|윁 Yq3Ȉ$)䒼,o~$.~]w7DrA9xټ %44ɒ%K0łENnN)>VswjErr ˖-C߿?\Fߗ-ۍCz.QTbu2wHMOǝ`>}Y\ߟG u4oͶٰa+VQ sJnݺOP#05koM5_>;o۫2G7+IRw[6m'""}G|bu0Qn݆?߻&*G=9?%+;o9__~8M6e5,[J붱c;f g|SUj≁M4J*$aX`` #uִl pǹsIKKSVS~3w}1 Э{w232پ}[;v섯uڬV:N ԃł*諴4}:<]S qPt ^@XmVrrrkjeU'Ty#M&lV]"""""""fa\*zbXYmUyEEDDDDDz9^^-fHl1卩 ZKDDDDDDsԶ ^^^ *ּL6o.Ui0ٗȩ ,YYY_3g2tPƏw4eų/24Ѭo'3g*;\E;>H""""""""ë#GOO?M׮]c{F1fN: /Nt#N"OH%jڴiӼysyILLdƍDEEѤIg=#9W/:yi2[d\""""""""JvEÆ ?M6YۂRP_7 xn`+Bw] ɘð ~<~\TFPZ_1j1 §el;9f7[aC$9jՓFY'y|!2[Sm}DDDDDDDD*H?mߟd\.Wm |%t aݿ|Oks$}w ̩;Oh]iξ_;FįL(ߖ뚞4=9Xe&##C[5 Q?NửG4-j;~Lc1Ç 梋.*q}n[Cw-`pZK|luǟlF vJu޶ʾ}2< 6ߐL!2:ȓ7v& w_OQb1f;Ǘr1fNnD~N$%"""""""R*==f,X3Xf _|1ǎc8NN'{cǎ%ېKnc߂̨8%fo9ON\R7Ep{csf6 r>FvvpԢQN7N'IJnI>S""""""""+??_>3^y6mDTT۷n~}Q^u.첳֗|6k.5iu(cr﯑;GނT=oKkA0W?S=p |=v<>XB۱C`Zu'GDDDDDDD X:u~hܸ1gCo>z)^}UzyƺjnQDϟԋinN#r0]& d"7/`1DZcAGPp:6f>X-5~lO?vwx(OunqZt3wwM|g.~=sdemhaC1Uec͛7K.ǟ|Bp:<쳬\u8®[7•lQQ1gnl]<n"6 jxQW7A!%9|h?b4y7IZ\CeMvWz, Kɋ $&&p8ۃDcHs("""""""r&СC=عc[Dnn.?8[lEL6D9vVvgZ:>2ɑo G=96#(VU """"""UUߴI6x66w}?73Z[*~-/""""""""Rmb;"""""""""L^HJDDDDDDDD-W""""""""Rm)jҟ6^" 4P'+LHYiڠT[ DDDDDDDDRx%""""""""Ֆ+^HJDDDDDDDD-W""""""""Rm)j%>15s,>cYczEDDDD.{%jzu| sErظLjnmr_+5kk=k]ewҢIMֲװjm }ֶJZ?̓1Б"۬&7Yv<ݗHt3-$Ai{;o|Ի ff$.kع7>}z֗xN7O; Ema԰hR,;bYw?+}#nSd;Gw滹;V&/]"""""Px%" __bHRr*4~^|77aSfn-Uxus<̜>qO/Gy]q7+u`6Qd#yu哷ҮUB+Zȏf7m5 (r>kY,.B"#ҶleS+[ۗZ?mCd2B9l'f1oQ[kүG#o>ν ֆl0<@79Nt}ˀMlv2uMS4ix߿:|zVG%WjܛvV?&^UT.C䭼^}w-W24ŞdC w/.\+bI';AP!-ϸy|bcc$رYM u׳ 5`/+,0""xO)O7&άXw3Uh_<O?c;?%kw. .!iKN[GP^w'{WgY}~>:Yl?VG1tPBvoا.FS(?bHNc}1 2YMʁ͋;>oJ9N|-ԩM0o7j^O5ѱl =#; SlO?r0]cpf\֥ZbHw:*DlKl|&MUH#xتYpjٚ YrPK^k<èόa23aCZ 7l'"QHq 'vMӷG#j捔۝q'g^͂iOyexA)/)unQ|7tw^w^Bl\&GN>~Mzf.I3OgmG{Vh埧xW""O16oLZOmu1~VyG&Calg_. 0 6SDF5)[9~.2 ss\ϵCZW3u)o(o"q=<|ϥٸP`ף_4vN鳷cam mr` {HIWX.}0 :Hȡi s\gRKl573!1R=!13A$&e;Y5qq4&])4JD.v \a=Ug,?슖z:Vu3o*?sv FQ7Ցw>Y?'Ι`љz* oͪS%d +d~OJoǻ&19T;j>NMϡ.e6Pe+Z7 Φ^?lV3)9^1I_EpMoz\V<ۭ87 k˧6۹Nx{ܖǓ\ZfG##3??km#ڜ.WsF7Y-3/\.w/k6=&_k~*=rf1sl$$ә]e'֫^Wnnq_"5yg-׮u"<ʢ?LZFSB Ӎ^}71]3WBCܾ.ԥSNs+a$mzm -3~μE:ejɲL9ND#eeбm ;LGڊltjxx&Gk/8RSZVAP@Z~Ged(9UW_͉;ۈၻޮwYj5Oz6Oniut={sV,X G۲HMs9Nr6H{n\Wm'jlqrqgQع77?FA|1ӆ2 |::Wٰ%o&1+ȟü%Tb@&nėU5R;؇+};>*3Q]Ø$ Gӧ{3֕I4iDJ9ަkRǏHtPtǓ1 W3O?K="""""DWg}"Jw[Ԭ՜CG1o |*L 8joKb6s#L5޺ܯz}hwwek1Iv,Ң0>zĻ_ۺTh"/sQ׶꛿{'zcVܨG]?}g-P Sfn=mxeKs>_ltn%iYëY?y{7cЫ 3_vsNg9ԧOϟ6yAxM&rA%gb:axvsn'Fxqs$ Ƙw35֠Gfė}-GQ _ )y\i~|9y[yU O/>gǔ#~s5Wf68]lu&={>KT`ݍei ݞx{slA9NJ,ۨ_ϟl2r IB̜2s̱ ~[ >ug(,cˎXq:ԫVCTO;ՠ>Mi<bA,}7~6رR;3w+7=(yFun_?*kE)""""rsFϥi@ľ,]ˢ} XMDz x0’W6meCF.V?f vӢUg#t_<'leDzkb_ğQEqG~|_Īx,x9Kpx~ Qke"PYYJ\Na\V9}RY~qV2o|3b[Ko'O4Z.oJ`` tc[ W m̫{#kxbٽxkHc-fUxF9':{bwt+ĬboވBCqb,g jzw_dzc"^?]""""")`>&EΫ0id8= tVqҵn"c=9[gKa?f_1}n(Дyrm[3>bBgQ0r+߿c_Gj崷fiҘjop㴧 FCr_O,+{һW+j'?ϿCnL]Z%zQ{Ӗ1I}aZ| \̥-|H+ޞ:&I'wXamq,k_x4ńXߤ;WM/ާxlx咘p\Dbb 'lɹ1O]ʟr ҊuHe;:jow2$B/"/MAP^W6Pz*HH頀tz t!=dR&I(*:Y̩3g0{i:rmj_],:DJT(燗 ))c 8:=Q`]*c:.ѡe9zu+xPRJ?3\ IDATڔkm0AMDKxս(gO4wR|A^l{R'''N]#X,ßGr훘[|WxՆwݮ|q=NF! Üwc*P:9rr2N|~k*>5- yZH|s/>]nC& df`M P:~1Suqѱ8p4#|cW< 4`L;m/yl/,ޏeȋ ]]m |t4_M14OeՓo6?'gΤO`72+_ wKnݝ'ncq|z9m0q؅Sڑ3 '=Oe_ˌWd8z0Ӿn &GŞ!SY1~.4uffsMp%trZ`6?ݏNdAizطoz݂={c >lyXQ>˶ry?֘NmuN EGm:uw(.{yоeY>UҥOyő| Ky\%\7g1wֽ^Sݪ1|=o idWry?8cԯ]Z-^WVC {5ٸ,a}a%"i6%',ԪlLk4KsNTv>>q~^Ȁ Nq͘'VPkI5K"66ֶsTtP^%"g#[ ]kus&ޞrXqy@4/M楁۩}"jl..wJث{ģUx*jjο{&r^6m.0)Ňo6br%6J89o'w%5-_֡-]޲IW#Fc.A%HKpuFw5soPJH>Lp.:Ê#Ύ^5uCJş<>O:}^uJ9TNǧsSP>'W@SʕdH ;\wɍ"nԼg|.Q{OCr%tCz*D&ve܉='9V@q'[2`5 ߬jE~k4#_nP`}FAnw}|P`pu'w_!g=rh=]x8>"""""xë;)(6ucLN'oPv.A"a|~d346~)gw|~&JI.;DB\o/L;vX |Blm c~;>Х'3,xſ$pyv4zE$60}~50@d .&ѳsGu ]CUqgJ.Oa؏9k*vaPOᏜ-~kde\6Vqqk7|aG߬&ת |ɨU'lo3YΛ"u$9C̍7j_7g>K'gf.-o}6fBk 6n نj1S܍d\0;m#\PDl^ '#gW\Y{1Du|W*fљM]X"ӣl{j(I{텱̫=}hX>=Lz〕 x#^O/w/8mBTYym/>~#d=LW$Kw6O1d[7tl ]2K0iM%ٷ*_z̙RONdfL&&buu[hc|<֜OΟ2gp\;^i;VkP[>5K_߷0:Vbַ8CXZƦҽS{(""""och۶5b%i"#WnaVO0ӱ86xtpUqv5ocN2QgX1gXpvtdrx`3++l\2(""""rr+;$ +mB"y *]JDne4p-d2=ᜈȟE,""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vˤ.*7JDnN)\> DDDDMJDDDDDDDD+[ DDDDDDDDn)JDDDDDDDD+[ DD$,Z޼y;vۥ`ZuCDYYY~^~=~!&MbϞ=y%Sf'*:ȉk|=:YDDDoJDzMƍiҤ :t`ذa9roiˡCXx};9zhV+f͢UV4oޜM2i$233~xׯ_6lqƶ?ZblܸѶ_M3h"ziyټ;Fٿr,?NzzmYai CӨk)g}<}«'b@ᕈɤ.4{1tB\\6l`?:ukaԩ|1իŘ1cڑƍ1 ;veeeŷ~ @FF;v`ԨQ{4nܘ\=bŊ׭[G^-!!^z1w\ʔ)|`o{MVV6=NfV6ǣd.~m;oY`YYY,]FSOzj.\#HHH<{bg@N^{/2c h;SѣҥK cǒŋ8pmZܹsygr GDFFɓ'cZ9~8\rv>V*>>^ztRRRRO9rd6=޽;gΜ!>>SNMll,&LMMMM̙3TfϞ̀l}~zy^{mW\aɒ% 8V7k֬Y& -ͧl^{o3#HbM? 8u&sǓ|߱?~$5s˙{xv׮?և[mGLz9x t Q﹀]{/Ř [ykc}9s/ϏXIŤ~їL#D.\B 7 oеkWzI۶mR ۷ yfؼy3ua߾})R2ep%222xרX"VG}-[Ojî]Xz5ϧD|D>Μ9Cpp0NNNݛ-Zpj׮qwwgƌ8::LNX1~؂///Lh$!!]rJtiժX"~)-Z>|3gмys\]]qqqaӦMl2v[,<իӧ9};Uo!33o'''f3O>$ͧO7×/ݝ(ʗ/sJdD ?>ϊX>;%{0 vLlGGJx1WSx9,bS__G*cx Pjc&nc̈GFf6x''#iY 2W J.y~@-j,CV1gd13 Z{rl""""JDOuuC ž={xGr7 ILLs;vPZ5[pбcG^x, ˗7`ǎ={ٌd:x M4M]twwM/*`A___F-zG8z(ݻ+b gWLLt= 4=g*YVsW4hB ѹsgzq{GuԨQӧFpppe˖̙3۷/Eɉ'z?!))?o{%<<>>>|xxx̘1c8t-"99ׯ8.T-l]\\hٲ%vWJ@@fZm;Qj-Ҿ< JGJ΄$$ٰ5Jmghլ NѰZ@Ծ\$#Òk: ]hj[^H}jСU9R2XIbpj*l+)>@ZMoAn")Ε+W l jnfT^=NJDD4lؐI&qQˀ o|ϙERRFRHj׮gmSSSm!ĝb&7\z5Wrss#!!TV+'N˶}ckOOO~ ((Ç95:˗mmodtvvGٳYd _|ϟmt777`fVW/Nzz:… Sp{쥧 o\;䌾;~8-[Nލ<WWWyD_Þ,=sWg,$& pt7;\dhzvL V׻PҮe:qZW+ oB>x9ٶKIɠ GGUU'=1CD?___uxbX"F… MҥmGGGSfMԩow}g+ޤI{U=Xb߿?ײSNꊧ'K.b'W .չjԨ͛i֬mǹ|mYʕ+mԍbƍ888йs\˓Xre) wӧHc޽<Ӷ\yslQbwͳ]dd$ ؂EAAAyO?Dhh(iii]+VF:N/Ι3gr-UƺMxypN,r?qv#'\jHIm:š#Wyv ,L܆Oa=RwdqOZO_ =-fМ 8Ǘ3sjs|sꢈ؇^iIHHʕ+[y{F!uܙSRjU;w.׮]rrssjժ^ٳgдiSH͚5VZ1uT.\c=ƕ+W1c&8Μ9CPP .$116UV\ׯ'&&&syyy3~x\]] #::ѣGӨQ#;ӧ aٳgy:0yd*VH`` gɒ%[w˗ӢEݻ)S0uT/nt ㏄sy;u@͙C_>ݻwrF7{6­N:/_{[oEfͰZԫW_|زeKΟ?O߾}1L8;;FG 8_BJ ruuiӦ+< 2$ױׯO߾}y1 y5jtWm2e >>>QY4h?G@چ?jb2L-̄[[˝ddfӱM9^t3Y-wW'5 - o\CGVkR${?ĀWb20 8yV=CWS \p)";)/ZKpwsi`ΜOжm[kJDFT='HII!-- ??x5@vv6W^6VIIILGw%%%P`"..///[a>N<'|BBB&)fff=1$&&k{m>|8۶m#--k}ߨunwcccCٜoMbcco[+##8}dA, wWn[π+twP22,\O߷-Pq,hȧ]߷mNDDDߪ\ .W"v!П5<<u:""^^^+'(TJMyi䕈ȿSO=^C=Ĝ9stEDDDD@y%""""""""vKᕈ-W""""""""b^RxuX͵ر#ϲÇ!m)).XV-J۶m)R?2228~8UTvLll,ӦMcذaZ888V֭[U-ZuZe7n=СC,\… E)QD,[}dN:4jHOWb0bV+|W˸}%''w1:u'N 88???^y?f3SNe:vHRغu+YYY4i҄˿HF#mڴjժlٲ(Ν;G)W|}ǜ9sHNNdɒw׮]|dffҡC*W̸q4h9r;wҧOQZ5Νl9v͕nݺ1n8Zd2ONNND_-r uؕUň|lfϞMN:t(jb޼ylݺ >{5k֐BZZ @Z yWغu >> >p6le(S Æ #<<ׯc4yy' w޸s9Q߾}yWqss_~f͚S\9tLvv6@N=kb>|8/"wɓ$&&Rl(C !,:?m-99J(NLL ֭瞷MO\~>>>@LL W^%""GΝ;>?x ;;PٷoAAAN+Y$$%%q>$##pv'%%ẃ&DDDDDDDO$22ڵkOjj*.]xzzJpp0_| yM~BBBX,QreoAiIIIPF HHbF<.]9'Lsc„ T\Ʉ9K,Y`!͚5_^=Ν;DŽ "4,aaaO/#<ĉqqqŅsSM&-Jr\ /\򶾝7oƍhb`nCL>|G?w'Dvl#~!ov784iҘcrܹ۶{ڹ@͚ѢEmɉ]2eݱZK"""""""vжm[kJDF[zW׼aTFFNNNeL[{fL&S˭1SP!۾NNNֻYGm"##;cA}e6off[b۶mw]ݶn)%%Uo,F&ʕ9&$yꫯdzuVmF=1rH|||tDDDDDDD݌u͊++#DnUR%u5u+W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%""""""""vKᕈ-W""""""""b^Rx%"bG֭[֭[""""""2 Dn޽ڵ+rGGG||| tky 'OLhh(͚5/yfN:EFF~~~TVzBDDDDJDVZ믿~mj֬iڴu< ?xl6?ĵFEEK/rJV+777eذah4YV.\zDDDDD&6("GiFtt4_53o޼E_Y%J??׳xbjԨ͛yW8piii$%%iҤ C{9)Q'N%""""7+y`FL_k&RJѻwo}Q6liѢ~~~={RB/^Lhhh...4k֌f͚h")Ny(WWWyڷoO߾}l{n/_nݺt):Jlذ-[pyBCC֭[p8ҥK9{, VZtWW?|;wo|,Z^y\[,V\ɶm۸z*EM64h ;ٳgY`ǏёիӣGmoٲիWs%iԨ]ti}}X|y hѢL:l.\kݜ9sX~='N^W^^^|goߞ/FIZZ˗/\4hЀ gLgW_ :vȑ#d\\ANMQFѶm[[cǎQT\㽊f̘1 :4WN֭y҃"""""bg^ȿy(_|믿B y|}}4h˖-B jNzE2x=z4lfٓ|iР7f̙yc_hٲ%K.pbwZN&LO|@{)2222DFFjMQ<׿mRJQDOgΜ!55+W8rH*T(0d+Y$+V,7IJJc[꺝}F| #GhӦ&;JD{.pݐ!C1b޹Ƕmn{vقڶmKll, 4 W(eX쟚zWotss smvo:nlcZZjm6>ؽ^b{\H=H"""""vFᕈ<0nݚkdԩS4iV|J,IYb]FN:oq5kYVD &0mڴ}Kb2=ռF`` ŋ ^z;L2K٧cǎlܸ1td׮]t)*##<۶mˎ;w… m#nxojբGL>ctؑرc ܮ]p6l?ݻ/d׮]yxx^`_C'DY wAAA,Z.]PR%Gڵ1L>|3fpڴiCÆ xyׯ}H"={iӦg۴[,Yyѭ[7Vʀ^:lٲ3gһwo:\sժU 7ɉEj*^xBCCiٲ%'NW_姟~O>TPtvɴi}GQ-n@ @ !MAEx-^(\PE. ,ҥC$!=lX *:<>&sΙ9sfX3g(::Z#FPڵ hȐ!z4qD 8PM4Qttxb}z窵7LOԧOuY]w."kΝ>}ϟcǪ}^~裏ϪCZjEBBB|M 0@/x_Ynݴj*=ZӦMرc%I߿x ?SWƎiӦ(44TW]u~w}۷/_QFiĉ*))$5o\'O֐!CԥKSr~~~/4tP~x={hsV,[Zz**.VHpАUrηx ׾<8^8uNI$ݡϿJ+׮SۖJ7fvt6flW۵vZҸaCױ$h5E_oIͪM[}ۑew}1{)@xriVEGF*c:yuEkW6nZ#~}4l(IZjw}yU^,j۷sOcj~}|3k֩CVa+g%%WGJK˴{oz讝wk6qJ#mTvmm;v}8*mKVCԶJTM|lvsr|<7mR kbXT~=yT+?c{ԎPCLzw_1LOȈp%kc_vNvfg?Y{*1Svh}&5kDn[}cٓOǟ7jȈpIRaQ^ ~UClںnZf7OUmZiM@xQ2JKmfe䨨X%Z~*n)g^Şо_D|ێq R|\"AIڲmhЃYmZkߨabj+{5oWqSyVIU6mݪ:vVqv:qqڸy({OzvM=t5պeUHӂԬi BCN:c{mݾ]PfcQƍ$%Yu|332S @EŊU!Ωy/)JLH$i˶mx@ T;*Z׭zu}V2%UU2U+*^lVdeGڰq֧gQ֘_^ݺsY|*].IҼkonE) iJvfP3NlۦU\lo{vN|?WwxķgdꜴ4%YY|ՍVl6C6巅j}y;Yw mؤ&)7HLj:]ڧ?z-huZfڵn%ۭEKw Pݮ5_@ WH[)00Zp%Iu[ik=yAjl65JJRzFfJrZ-_ZjԠAJRS*.)l6+-5U[mSw߫{կW:kjڵն]{5L&ulFsEiMRգk-XX}l6N4l6Í w~y+^em&IZn @dk!'vnWP` /8ϗ9%5HdaXr"p$n ExbvAN^`X<6"a^`XW0,+ Ex"a^`XW0,+ Ex"a^`XW0,+ Ex"a^0~mf8M4Ivu[oqq0NS^WrhѢ?^Wu~[nQÆ %I7n?ڟ= 8Xg>Un8?8p5n8ݻWC Q@@^}UIҲe{難H:tRRR$IՠA}lSN;5|}g*++SjjnEGGOzL}̙={NRRRteq0{P5i$|zw|^}U=JHH͛OjѪW̙kFVv=ZÆ S||ƍ`zg4a„iΝL7jرҚ5k4n8Y|t:t:rZr\aaa\<cp}]=JHH$%''kС>}NDDhСJOO#9;ol3I =::ZQQQ m3 Sii"""NyyyUmOMMrW_nPڵYwΝSV>JKKSUZZw}W#FPDD۶mܹsu}|*,,THHz>LC8+]T\111;|:ƶCî*22Ryyyr\N2EIIIJOOWAAuh֬YS|| r͚5KYYY]BBBUVZjq^>$V 8P7tBBB裏 /n]w%ͦRiF{iȑS 8P;wfΜtj֭ݻzQ;wTZZdX\\qN?g>ӂ t%xΞ=[GÇWii>թSWxg}'V[nM7${߿oռysKٳg8֌3$IӦMkׯ__?Pm_#GUee$I>\׮]}kիWOZX,2Loj۶%ImڴŋյkW[N;vTLL$cǎ{ժUjРUYY:h„ r:Xu}+**:N?DVZ&Mhݺu'&{,111nO5Ţd-X@^Wڼys:U)y)wOFi޼y=zFN:P&LVJIRk.7NVU}ߗfPϞ=O7ŋխ[/X}^x+..Z-[p~y+^em&IZn @X1n9NRB5֒rݾoСꔕ)00g"\.M8Q -wx"v}7{nZ}=bjǗ$ө'jȐ!f8DԦ$2 5F(c6kB_չsgy<޽{ldZկ_?͙3FпUN=c'KҼyԦM+{C oϿ *| ݷ10MhƍX,⋕zJݤI(33󿭠@^j")*Bf%AOUfԬYʾ۵kwZEddMpx »7 ?RݳO9Gn/WޝU %j{iTRZ}%Sd9aUAYT\*\>Hy*?ep`>QYZ#FKp9yF(ymܭQIk[X,#,SD<;e Ҿtlozݟo3s{EY,g. ,ׂErX]e9l(ח5kidn.^$r~,-˛Gd.3^!sj+Iryq/9$XsAr/\*vIo_p%I~7]#u\<gw4aHo͹жe&Inw̨ߏ&v=l j L~6be>x,I-e-Ͽ[qZZv'5!*ҕ27IILeVU򁯮g]?lFr*)ϊ't\K^FѾc{e['Vw`awGצp8:oskS nޡr~Ye nT۶TCe ),=?jEr< oe,-ҶS[~Pe B~W^OgrqLVڶM~F$f1yU3GrULk'Y:^Y)Kص[1t\}>Keة]<ױ=7`*3RgT:5'+{r/ѐ'uÏj-*(*QѦ-[|ufV/qX={4Ou g;t۽#4O(#sko钁7jKV޲?Vt=#4魷UPX~E_WDWt3q 5k6WTh.͚**5j-}u֦πkɌY*۵p2z=n+gaT7>^ip^i.Yh/uWi͆t}3wFy2Xi]y͚My/K%Wh=5jK$Iߞا%}{K335xǟO8M}eV wzgO/Igous$IRO0F3ZEz'uNZxyTVVީǟ)ժoLQ@@BCBzO<鳾 \Ucޚ"%I{ssE2zl6t^J.G/~en*KR7jt PY7>\IRջGw}3w(,4LJZW4%EV|[k6EZS_aӹ͛i/:[*f<뾻)0 @F>7JkoPs[HVEfS 5ɤ.]ַjGGsS0+g@snlɇ-Iڳw k\=Գ:ڕ#IЮZh'_SΝԥsGkѢY;Owe+:LE%jѼYzm!IژZxe1W__v9 IDAT5__ ]SԭsjbK(IptL%Iw͹-4t Qbzv::Xc Iy0y 釚釺[TRZkKJ%U-^XTTsҚYzW4'7}OW0X6Ls$ۭ $)<,FΓ:zujiİ*,,sc_TK#όRee$L&If:+*2Rtafx:%zP W8V~:C/.vl6"Gje}v?롧c鍗}$Iu/IޝSޮbk>ӭ7ݠ[oAez}45}%'5Э7ݠpy^q}5__[gze{9f?W8!ڙ?!I]+ZIIǟT\RR~MW͒DuH,Fں}{vNRլoZS[:iS}7gUk_fS'unr:{pPr$׹}{IU tIR^~u3a<>.V7 J !^8#]ujX^/zp*(,ԠawjCFd2ToM{_ԫGwއ%˴!#CoM{_26c6Վ__w#Zr\|TY;w궛olL7uHVփO>E˖ۆ(4$Ϋ]j:=^N׮SJ:ms5ͷ57z-\\sn׽**.V(5Kk?w?D22p2٬Vߚ\OAg$Ţ5L<^g~vG/!IU3nfoR'i=%Uy/=^wP|lbu]rjhkt|uڵn7^ƽ;z\12<\G\Imnѻ~鳪fVEFDG>|qxzw%I͚4єI/+<,L4~35n^|5 $8ի[!t{m$i5 IU͙j}rV:{ܗ'ө٬ճo|͝˵//O1ѵtcnbn'ժڵd2Xn\j?} SdD87>T?Mj+gؘ։]SreXP'Ԡ^c W k^yAmU\R@ Aa^`XW0,+ Ex"a^`XW0,+ Ex"a^`XW0,+ 8]W0pVYa`XO~3 i NQqeio+/Ex"a^`XW0,+ Ex"a^opUݻ%-_/I W*?;~Ki#_VEŵs S\@i9~+ruoJ ME.Fm=+^ԳU~VRX9S/W-"R$y;Þr} kt7VZNzL&nN.?ޡ^;p#pV:(Ց<ܧ;jbgj\WO4UU{5^ݙr>^8__~"l!-w,&.m@UXY*۩k"ֈչ97ێ C֠jTiUv(C׿ *|g>1O^hqzw1OJwH~ܻL.%ǥs#RROߓQB#WMUk>]Sc?n{Ռu%y(onXvWc6s T-~\?]&I2 ydXL=&M:Yu*wWH ~:8}.MznU[gK*Ǟ7}:䭋GY#WNԄOzd6d5[dsZWt}k{gf^ε9Gd*,ʾ$x;$Pϸw=|>;^QZXo=WxzM,y*sUqIX}MkQŧ߮+-i UF*sU1mg<;߷:<{sW҅m9IMyC`K&F&ɤƒ,u.Yd[[ǶGxI&I..swpXp.s^͜#y4]wxQͿA?|Kdw9ȚTXY ֤K\H!=j^HJKᦃGɬ7=VN{YuixaIRNzYUz\-~y+^em&IZn  f;-1Y({xx=(P-H.K%Gݗ^Gb#}ŽVR#{*p(?Rٻ(ʽlO#Mzދ&UDł(v_,NJǮ * (E)u? $$|?ו33g23i Af(#}c<1YG/G>3dw~u`r#u(/XP&۽t9OjNt bIS 猑 J$KװQujb݊ :Nh6æ88J,ism-SvîOw ViQ|ptDSb0e:?N(!pa+JPt!k~it!e^`YW,+X, Ex"e^[0蟣ܪ"2r6UrF9u+-MG@ƐX, ŜW/W< }a2#%W;W / I'}@x:&s#ݡܳ.P@_gg(oc~|Nt9/*zm#̴ :If~TpJy}X[fFfR*V ޮU^XfMdT9]p%kly&ZXor?pl }g}2Փ,6< ))2ՖA Mr٫ǔLy_z]ۥ`02yrG H!Sy\2ɿRۍ*IE_7^%]ϝ5;H=;wɿt Ӕu /p{jUXt8vl'3;Gz^ [,sn |@dKH~ж ._)Iwj'[ZODPy_ѥ?}7m${ۖ%/w*Gf.dz!WtqۏyqPpՏwXX㒥Rdb~^ξ=eJ*noFݏ_d${F237m}vU3٪K ._)(m̜l^̭ۤPwsrt(] |^W7ko{x9z!ws͜#G 9K ޿ [dgȈu$٪V-/_7%Il(G ]Te8i5<,.DxcT,>1M{Lutp8**}'וH*:+#.6L);G}eDE)(9:WoUou*/}7Om" E^'2b1}*qGmr5P$[5S]}r^uBy2316 r8N=%I;%; OΑ$I^So^[`cEyYrٛ7 K\cȀ¾LOO.^_y̕s9w'eDp;"Ocv$Ǚ8^:[Um Je/d_Gs\Ͽ2uտNw~=XBf~̴tm\c/I>_(۳en)3+}ڰY!bd8y9bhȮw?T`J)w}o ѻۑS:+s˶#oFM7VV(+}ѲmQGQs;v$Qvʟ-|qٻYz `otSp0,}~q+I He*e _$9r]4Jf|O>'#1AG[^v勌TpJ鲝VȜV?r%j l'#:(Q:Ɍ.s^)*QN [L8i$9y'>/_Q23(+~v /GX'Iq+IWO$ӥIYH Q=)#&ZOR[]>Yr+ZYr]}o˯$Jl?GnݶSzsf^#EΑ2JH_8?^cwedKXs]!<**Sp%9##IH_s.;_m;Q)Q| kV*UJmwtj_|{*[$Ӕۋ6 n,G.2*<):{wdC\Tiv鐶y(OF0[ 2$nBK1gWGF T+LV{nlְ^xNaRVNe^0 IDAT\a~=8U>d?Bk7yg6 ҾUD;w$IZ)fڮ+[ڲש%3.NFb|6׍Wt|ANmXXK٣Bk֩;%C6-erd;T e\r5!u(G. RG+P!]7=")dִ<8 N#.)zڴIe;ם<N.vGCP. 2 do+8w Ivr(##!ķ9$Ӱ8)#&Uo[K^6?7O. _N!I.a&Ԯ+P $)&ZF)F|) Nv%[$f*+X, Ex"e^`YW,+X, Ex2v:*(+Ied2#]Nr喑 rZ7#`YW,+X, Ex"e^`YW,+X, Ex"e^`YW,+X, Ex"e^`YW,+X, Ex"e^`YW,+X, Ex"e^`YW,+X.P& #`YW,+X, Ex"e^`YW,+X, Ex"e^`YW,+X, Ex"e^`YW,+X, Ex"e^`YW,+X, Ex"e9??_y i!G!)Od|+/@t4tS "<|nPn P?G^(B?sr)"e^`YW,+X,A}f/u/l'@+X, Ex"e^)ګǩMV eta&5nHUT)7JRTT9@jՔ$uQے'%%Y]ox܊!TJePp#@ݣ$E9"is]u刐Ͱ!oKN~ y^|x ?kz%i{r: {:IK>x@6qqכ|݊a3ԨaC-SEEEr 5t4(G)`~%I:uViE5{ٽLjr~xYӄ&ژ) )͛~Gs$IW^}]=]oYez]n73noվS7JtU~~?^k^ggꉩOgnW֮]Sf 5Ez~ m^^/ Wp"}sQyh_=㿋R4;$I-[44޽GÆVZtF׮?K CСjլ;~ӊ+xܩ^XڵUڧio?48ѹLZr_jիmV2llݪM@}z]:+::JCeu`$)99I;uiZlҋԐޢ3tVBb֬YETnmnJZ|U^MӚen;7lԦMiTըQCK+&?u;n`ئjW5gݳ|$cj))r=JLWH4.TrRe]~%hLU$IՃӌEV͚5u]wW~}{YծMl9\ψs_SݺuUں;tEXoqtrT-%EajUKI]8sGj3հA5iHs? ]֚pLuvխw|M_/:fM}1>4=|/ʕڴE ?nѢ,gW*m=2 EiάjԨ1m5ԜY3WP72EFWf9,X _xض_|Y:'~EpLW^}/6r]R\ISӦ/ЃSgС\IWiw!qU]}g\/7ߤWf_2Lr˯9jUڵk$g޷vM[oۯj75|Ĩv]}<{îW^oY˿!|רZJ 6oYFgҜY3uֹ£~ a#έ$F^Iu( ضHGj,_>ME~=HQjҨVSq84L[PUT|1 ^/? \IR0Ԣo? WeW~huԴic9Rx6dvsB=d }嗊 5pzK. W{m۾]o^}h4i|߶MٛZ$_~%<RSo>O8E`6#<T $F^IIfJdb"uK9W__Wk'}~BDEFٗ_*Uvc);;Ȳ`0MnјěnT&MyM~`lz###5_m:8mZqAV w1E*2Ŀ 0>.N?fUfVVe7mVܹH8EqS&8GNKMiSrU֤iEgee)=#CSv#" ͷћo#I:{0M{r~L:͛VJ1phoݺUf(:RcJUN.:V^=5G,ILp%q 7q.S2tdFqu2C9!!^ߞW}AUēOiO+jz#^ducKRvVrJ7 f/-l}[n|:o1 ;oUyҷlU7n#>/S{Dه]0d\lt$:+WpҶGW?s S?OQHmޡ7(գZ"rOk:x>q{W^sGݻWͷߑ̷ߔnWtt._j;V-E}$`Z&~G-=233Qu}[&(??_i걩Ov\-frriɓPS)1h 4}[WoXgt}k}f?m#2ebeʴGgo,CNS/}B`x%O+Wf-˴`K.w|[NbIzbSڲ-OLy&'> fr:k1 *yʌМUW7B&(uIVoy*~WaWՠn=M)9ɧZC!zǎZ?FmZpzjx w81 P.-- yl;w˯ W0+X, ńpͣBy"e^`YW,+X, ExrʫjtTpe^`YW,+X, Ex"e^`YW,+X, Ex"e^`Y`%6PLt߯v!) @vm8R+uVZu7Am7\NfꡩO!) @6b \b~9_Oz@Pr @09zwr9ѵ:DCӒe_APN^~޲UN4Ejռ>MZ WNK>K];wT'Bk6nzWi]QrbR_w˿$hTcF]i:>L11o(diݼFk(3+S.yw|bcյSGunNzj͚2ݻivצ.uɘQjҨmܤ{_Yo v4P=uUlL%Jݣ|o({jwtQJNJ֚ K3Ԫysyo*&*ZwNQ4w1Tz ٸA/XsY] usTFueeeWO>?1+R'I/9sϨMuڷii%c^민\@PW-5lz;Q( .0$I۷U$M}yI9Ckw%_jݲx|$>}ݺ*Rz}zt׀sF)u߾#IVc/8?}V-5t@fX~IJHgrr3vԣKg3xF\2VYzջ{7B!}V:{ -ni <%OG$ '|g6ԾU+{eoTe8wڶьiOnkO^i\{Rn]ǘ[ rFRTQ բiSpUjڰ$iɲ咤=GmZ4WzfƌRkשJʺ %I9OtݭTA]2ftrGwH;CIţG)Rbu-d^oz =[w=Pa #G]E-4|{:'á];&?n[ޗ]7Pl?٧*''i۠>xvJdCukV픛cT^?Ⱦ\.&=z =[s,Uּic={95cIҠ}?Qeխsbk.˹pHv3|F\2V`P;wRN1F^^t^tAq(s3oWg-IZheHZڴhNIrQÇՇs?psj's%IOV>Kn[M5TLt< zOuЦzt?-pΧkێ o}lӢT\zn?r鋅_sGQwyyygײVEi׳vWm(;vZիYP^>$i׋5d@|>x-IKtYÔ ^dw?]{k:gZT[6גeˎﲜ٥֮ۨ?f]sa ao)u9$'kMzWRHF ?KUdۄxIOѓ=ݻwnZh,y򕑙ĄxU(Izm:iK ΙTO԰~=h1=6/uFԯm$iמTMsIyg+/WbB|mmCR6{ڽ[-Ooʕm/˹{ըA5iX_O?2Ez:=3Zq#P^xoޚ5[۵}F3:w y ۥEnaj;{wn;h@طW.5 C1хUVNGEEFYRL##xx}o}FF1&}^խzu;C-OoG&ݭ eeei4MM>-aF -SGUVb .,nyj߶zt{Mzgefers^P_J߯*kƅ^VRos{~"ݦ_~ughEkú;$I-6 r)9)Iԭsnߡ5/9)QڶT8:kǎ׮+q֮$TUk?{~<}bok԰n]k}Z}6͛iilefe*:&/?Oլ!IJLHPօmݶuw$g+ӟVZz{fw"=5jP (yy/헟Wӆ 4o_}`uKѼfi/[UNm%'%*&&F3|GWSz陧սKY?˥yC?o٪7$}m߹S`7ۣ^| ٰQQTTvj_v̝@^0FfuU9)IuNe+V?fv^Mqrjޤ$i͆J?nɚl6uhZ딗_c(K=>W_}>@6]۶QZ5|jMybj}9zi}{xyJ}?-պO*@]:S[oKccU99Ժ -/JL׾5;_|IS֬9jʺve:Oo_]qMJKO1cРA?hjް~-@⌞*E(::R2iTHK/2jP)}:EFD8VRbst(7-n%&++;;{6%'';nW||4Ϳߓͧs$IοX۷Pbb8KΝRrb2`S 8d)v>)/5 ړO[z{ҾKl:pzRɜ;ߧ={GT 6bѪ5kuݭw'!+;GkT:@^@ۿ[P:ϫ#ne^= IDAT`YW,+X, Ex"e^`YW,+X, Ex"e^`YW,+X.PEJP~~~8%+8~Ri_ ÐRDؓ PDF 'Kӧ׭UTڻolUW^scc{B^f)b B2CAeܯD9]n.#PnfehتVUhOդUk24 : /6Mp*7#]1Ɍ*8Pn Nrۍ2%Sr+?; [Un  ӡ4O^Ű @_Pa*MJժ/(iV9J}*DJ?]"e^`YW,+`Bfض/?ᶊ!ympڲ@jvGiw:Zq*Ք]MRau#RL^6rgqtH+36In7D6LzFjqϒ;H>𠜆C7+dJmZlmf ),<&i'}NRD)$Hj+sg|/IиpA^䎖(|eYԶ)o&"7M [2 ׫fHUMClRDp z\R0Xt"vṛU9]J]K\-q{Ben!lۣfLS=JïIfx#ʹ CW*Bl~upU-E^))gZȡ{\:M@Y^a/_Kz<ֱ4F%I\ޖ C5=Ko+rPwӥh4;8pޫG&&)OXZs^ mWIԦF;-H[i$I5{iJګ]S:UݰV}h2Ï'9#_. f)5dWȭF@$5)miGL@}RV$iZkemRñZfo٦)%GmRʻyȔLPw)RSӡGleڶ?HxlA۶I6_K$8Hݣ;O 7WsaϪZS_"cNC9eC03={ڵy'cscsp0a;, Ex"e^[ݷg޽y}0 *|B!TpWʭXm ٢Je^r vs!r4u5Uwx̲0[X.#PnE'UNZJݻ[޽Z[hAq;'/QQ0PB rstB|rʳ<Cnvef+?/BWDdT`dNx{ۥJI%~LӬb.b\+PAȔ'6^ s\AO4vC (׸mEx"e^@NR\+X, Ex"e^`YW,+X, Ex"e^`YW,+X, Ex"e^`YW?ҵK'i*n^}@l'ك.=]5khwrGKZE/l6C>Ow'Aޞ={tϤJOuHVG|GۧnB!Sϛ%Kr"5k7Qn~.[׫+˩jB99Z| ~UIM [j"+I1bԵsgh˶mZj$G3Tf EFDo^jѢb]FuuhNÊڵk[zWTV-Urmy֮]_^P}t݅bc+)>>A;w&Irڹ2#pA8ʸěnV&MҿSJJUIR]uǭj5TjU]ph=Crej?ZRR&x<$iAzF Uzu%IիWK~V-[4kqWIjvb+URtt֭+f;f߽zдZJ5ը^Cӟ~Rgt,Ir\p z)Юר)'G3۪U+߿Ow$ul^!Ixzz۷Rsmpbt9{'?Q#wz$IY; z5ԫ{w[Lʼn+.LU?$I쒋uњ4c^{-EDF*R%{wywX`Ao"$IQuXnʉId˓N-ljM4u&si2N4d8qRNK7E%(x DDJze>3wwZ~ ؐg;{{O<ؿ<ē>:=[$I@{ǹ[{ŗdߝ̧iii@yy}໗WG 7!vk>ʘ1c2n1]]{344\κ˂ z\֖j:_j~ Ir}fvu>xURW͘1g|O^rIjk˹C?{o6eܹ6n|q]wf|KǵeKSqu۫,_,/n1~g'?knʡC388xNSط?I+u9n[oo_&I_xA䏾eKepp0݇oOwwhPKju(}}0~)W*F'_+I|tvv'~G/}qw7 5}|۷?Irٲ}Y3W$ٽ3ǵa4MԚ3gC+@>dd{ڱsgZǥy\s<$8qBƎ]w1ng̜J]_ΗY֯zyw73VIK.8R|ٲZ2;[ۂ̜9#I˲|ښr6l|!Ϯ_iӦ>+=kv_J^|2CC.Ok_$#&Iտ/WߟI)Sd};Wȏ{>)Jy~ÆʯY-ܜo}N?{M]m]>/dǎ5k TӾys I }~vl[[WK}Ç?̛77W>Vǭugc$IwϑСǭJ}%LKKKש5oQ_|e̿Ρi߿f_x{L>Wݿw 1 2?pǜ)@shr__O{=aTr>}IZvݷs{sxm;?c:Ǿ)>k|7E+o|ɟimx@amਧ֭5@\vU_@am(, (, (, (, (, (, (, 8jj ;6^Jݛ~33m$IC}}-4۟jjJ)ה3{{'Ng!|X\֖J>yygSe2BG֬{œg.K/N{GGsΙ#ٹsWd⼴iS\[Ze2yR2;p ?Dtv|ϷcRkk.l$^p.[4sMWggW\G=^ڛG֭;n@466ߘ< mEߺ'w$NKT+-?Pvڝ$9p@z\wjjʬ{lґ$ٳgO._btJM #fKvl޲%-O=$5sqƏWfx8yGsۭ7gs{{V\/x,v2jhM7ܐ^ܘT*us$1'Iʥr=h۟$s9}F^|,[$ln s|Ozr~hxh4\%Iwww*)։1u-'[hM榔kJ}}6Jg>ʵL<9OvtۡCӹgONzxU>㘞ӵ7eEپ}{mۖW_%6ctԩSFח ǧ=ǫٳ2f̘ilL&uuT|@# sߗJ9nU455;r?< VА70ПJh4;2gtۛCٿɦW6rsҥټsבLn$\u媌?![::ח3AUJ)ڔjj[*usHOvܕ[zpjJ::3o8͎mO/ rSS*Ǟ;RӦ>pff„c9@|0GdOWWJdꔩٹJSL _spw+T+!uu9ܝDt3hs{{._"cӾ]{Rr嫲#/w[5Ә457eyLӦk f`?cfYDٳf&趥K+㵻33Oso8n׬Ξ<3Hsss83V몵ubzc܊p%+9}8}}yx3Nj/n˖y'|1E|8'l9MG-I1cdҥi߲%ٿfeRSSJ-}FcLMM9fL;& ?6;v\3ӱշ=J5WndG[[[Dzᅍ+[};:gᢅVs茠IIiS9wd…ihvтNء46ԧiljjJik[J}Jw>lܸ1'ϢE S- 3aℼ>27eţm46gkltUۂrŪU)זGWnݚ榴r&+V,ɓNrÙҒںT+Yt#ѻ@w"38g?x/_[oytۦW6c֥zhڬ|>Jӹ'<̠̚9#._J%۶K/|\ x5&Nܺu>M:5w]m۹kW,[8>׭&`u06rvttd֬5J֎س|С{˪/ G> ̴Zsill]3աjzs1kULOtO>22Xf`` }$IrHo\jU.]R;wts=믻.Sf/%Iƌ#Gz}@Қ5kiJM6-]:IrmNWeϞx4ͭ7ߔ[А5rmf'SWP'YSP_jO6X?dczU].RMzOzSv)0}Fϯo`38qI}:X=!gʔI>mZX*TCg\dvwlLWݿw q %^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PXx0}Ag%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PX%^PXUkSȃwTŗg3(, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (, (A@!$ɑ#=F©M}{nXxQJIrի ub>P&I57uQ]:1㚛y[oun{FU_q<9&IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/path-params/image03.png000066400000000000000000003474141461403617600244010ustar00rootroot00000000000000PNG  IHDR8܅ Screenshot 1920 1080 1 {΄Ԯ+4      XKlHHHHH@@$@$@$@$@&@`lHHHH(y @ Pd(#    l$@$@$@$@$`HHHHH W%aaa.!!!6$@"+Y-钕 @A$˖)+e =% \䆇GWTTJjnM Cpqf8ʨ`|Vi$@$@$@EK+]Fy&B#(YgF$@$@$Pt*1 @!,MHHH@";*:hzƭ @Ѧ  |EvX(aEshU(z ƏIHH ټ\KEF "c @"`$!I 4$ߏw1HHJ . ,d^TIJ:)NddVPӌq֒u$@$@$@$@(TG=۷[?.9N9xTXQj֬ͩƜV;$'(~,rDEG`̿2 s.%۷ocǎ*nvPJU բy;v#99cKlK,8L9^~=~ĬʩS,E'a/_rmhq}|≧dץgϞ cɓvQg˖>-fJdY־ܼmkMFbb](;w/[-ߎ4qi3 ,'@}GX>,7=Ʃ0ZjƑcS j̄%yb?_<ȣJӱǦ?bW%/1chtSzAɺ:K/lxGoنի </HE8 ٧TLA0aj&i̲}|xua:cUVfQݰa緷/o^ᆛ*kXhҤӺ fA̙c>"ƣmY;HHd(]h$@%/KcIHJ6"s[>d*{OG :*:v{L$@$@ŀ[]F= $P -S-* ?,Evxxx@sOXH 3>4   sG rlsnH 36HHHG5Ga(z wn16)钝^Yɟ# *Ŏr'ID_D3tg ><"InHHHHJ7}|w$@$@$@$@E@"s$@$@$@$@*733S22%++Krr-{]"  (P5Ecu"#$"" ͱ l %y5==MRҔ.ɻ 9rzaĞ";@ LŖr\ge7m   LN)j )[VO\wȻN]䇠`P䔤5$@$@$@$pvN)]N"##%&]5m+$Jl\ Sei*Yxp}Һu{97 R` +rJRhrp*Q"hjQđ#3$S~Ģ.!"'O,gIHHJ^[_wԮPBT,xDTҹ ġz9""JOޝOUp9S9(9+ @aU{:u(#*{r)SS.VN?ví6BHo$=TY0wP'\rorӭӷ 2wT1°Æ_!]u MnݺUVZ-_~$''1W_y@],"૝רkNۼe\R˓ 1~:rRnɅZ $iYj߾-F&i%LtbJVb[ڱE^yc>_ 駞oZnY~=: y(h =Kbb݀5+^[Kޚ?umʗ//իWا2eRJ٘e| [fcΝ;Klle~Q&lRUfمzyySNҸyx~upW=b^uRvW9XoV}\og |H4_|!J3I:qD<$ai%d9a|]VT k%C61ډϓK_Os͘y l]Q`<`;UX͛/ݻwAhG&ӻ2m26̈l1Ãf|?5j/('O[76d`9O;q^@ԩSҲU{W_yYFLLK/;v&#F\i/ȗ_嘎(^'y1ŜnV+UV/4 dݺڋFF/}."UgΜ%;w̀eaIII/QgViZ *&.LJS1j{ɔ)S!rhoŊz9**JZn%+OBHy_Jzzț=glb`^EU5k.P*_e' Y_>O uԖvɲeuU\VRE֮])O'f͚ɪU`m߾]vޓowbb O6_zbX/Zȫ޵Ww91^BJ3l;"_XYDzA:Z;~N]Kqa2iٸLTsuQ=تi?K$') >!+m#Ѿm DBĉRm=ޭ+0#eY]p[Or~A-!7^sjeFuk믗3[{#ߟ|*M@QSݷo[J]>}R +7oJ :I#*4_x'moOԾ.YTZl!%ڋ_v٥/6 !>a4uw~nE嗫gu^GR 3f̐Z(W[qM/D Nʡu׮NݩWp̑={:a /J.]o3n<رe~ W\IxE˭1H(x(mzߦc WOy V3AZ_^d͟GӤҫ I=/ն7U ra3z% .n01B0=ڈÃ=m4iwV@<d㮑/'~&vJd׮]r刑/nC@.ZX^~]g?ery[8zKpUW_ȦMwpvJ~}e͚xPz)7p|L1w_x'\Kav3 |%\Qc4Hbv6UnP}nܸKݎ@9sJ{>{+핝5k޿&unv MB;BcВ^<8o'VgנA}%X-7m,/A=]޽{IXF_Ν'ǎ!^x| .`mi08r+p <1>jҷ:$ӦMS<2tړ/da9 nW  W^y~]lFX|[|>3oUWsaxǭ={s?L .]j~I&.Ɖ'tp *uѣ2aϦ{y.v;v쐕+WE*TT=uHU} *|c>ȇWuu:-$sضm> c'%KYÁ 6>Dq>s+W%|ñ 1 ,Q}pnN=?s]+O)Yk&mtȇHP [׬/;hF' Ćʹ:,B sWS$Ҽu;3x6+' lsFhGC*۱Op rA8~x21?'4b6E5⪑f pScj6f:  2_;cYOO ,△1\dGqt,u505.0QXb+g8pPQ$C?Qjj$NN nwɱ -ہ?rwfuĒCPąџ.b^zXNN KQvg2X!P~1]u?ziӦJ!/av4lN:ZVKu#CÀ\ ooa:=Zձ}01m"1g=z(:#""umjq~X☡/h'x.94wKŊ wj׮o=Sq񎷉b K. ޣsǝ,9A~E ]v8q.,^D_8wm9 .DfϞFj- Op1D>``xX. X]vǩ{zP?E݊t4OryE}-t@GC "!1ޞ:wcY{qϦ1O<}=G]N=j&\ W߃eWWw{Ft{y@7n+)'T6fZc*mTk]5ٳʏfi~daxۤ|[yf 㭙Б3fy[c9'+CHAgqm[k!ĴaF;K'!6QTC!v;iyM7ޠ I2c];SǪc a i +ŽLa1f# B?B8+<ѐCx )} _ҙx4lc߾}:6O00ăhB/DƸq?j4VZi"ÍGB@. ]8>8ouW>HV-^ w]NP7a.cwjѢN`ޟ1U7]͓ g :ݱcUYsKM=~o 985Hri9r}:i>ǎe]vKE7>,>p5WЂs8Яmn!_y;/aj_lRrQB*FdJXdJPΑ4IOMJt[5^-!53tk{6_Ub9=7B^]#eUV7ǟm̃Ch :=jۖc:⯧L1I#TQcDܯS%W:t8_y--fΚ%wyenqm$+wֻj٧A+*-駟y޻@Ա71WEu;h =K.T}s0E]<&K3xC^Q0˸>: ;vh|.ums7U zpMHbS;&;beD4 (~A#'11iU{GB7qG93.^1f`6|^pջw/eAYVa mulq~؎mSPy"E `@C?m(;9LwРAi8;ʸ?p;6!*l(k@8tl;8=q81Yܘ!OsNޅ80^#-127|ٯ\b^%ъwy eIʒp$9$iH9"a&'D9332+&ƌւ[)ukҗ(-7=IYb>rHѯ_?6ڝ`f̪}B~/! ^P Bt4l\Z  Gw޺m3^~ qlR{w@ۅ0jڴ_[1ܽAXf!m-[43[ X8qܱ`)L&<&k_ ~ݝ}q7ږ~ NV,c` A0 gts km=}Pnj:b.qaMWC:fgx8`|ζjXb4`sx|b!;+Seܠg3q,嘆|~{ ~|:q7p٭!۷o3X~\34ųՃJXTUSߡPOzTweti2kۂ'|Zl "q) ,c?*U]uh 5Ë戱žXsT'.R?ʀOddTܬ.Z@qy|+ϧ)ۨQCcs \{:Ͷt@ s*> ]KO)V}z1WWX<Ⳅ;a#լQ]?'±Xt\ qV}φ iGhJ 3ٹ?yhXSi'eNז}D4m/k0Ȉ(R1~VGٽY,{@<٦0m+}\0~4s۪ -w?(fְm$ NSΛD}s-'[Y >nzHC,vW \ C.\˯ ĩ;p'(Ձg?`殏k9>wϔ)wO V!H:u@HY؆vpE]ī{IQ&sMPs55_>yx11w˚e.]$6۟>7ɗ,mzay{'Ѓ˖ 6])#]:HhZ1'\56)gz%k2M~i8Sdg_:2FOF$@$@$`'5TACD ÜXqm|/ڜK]> /alZ Pdai 0{Ayy%1-HHH QWkM ,6-CJ9 @PHHHHHI";4 (< HHHHH SR3es$@$@$@$@AN $WY3 @@ 0\$8 0& =GIHHHEv    8R6H$@$@$@$( EvA    `'@gHHHH ( ;`?$@$@$@$@'@plHHHH Pd'   8#e$@$@$@$@N";? @ Pd)$   v~pIHHHN";H @3O$@$@$@$pGIHHHEv    8R6H$@$@$@$( EvA    `'@gHHHH ( ;`?$@$@$@$@'@plHHHH Pd'   8#e$@$@$@$@N";? @ Pd)$   v~pIHHHN";H @3O$@$@$@$pGIHHHEv    8R6H$@$@$@$( EvA    `'@gHHHH ( ;`?$@$@$@$@'@plHHHH Pd'   8#e$@$@$@$@N";? @ Pd)$   v~pIHHHN";H @vG`يu-{~9y*YrrrNJ\l9PC7i$ڷ,WY6-{NS%'7mz@hHFUҤj/i_2o BryQEH @\O1O8U}1X!V؆=94WkJ߆RlQIHJ r$K~L,Xeč/ʢ]z]\\g m$E$@$@cK!-};T6ƊF!G ?;<"R &i^B\y˝+-SDFF~֮UcBD˾    '𑣲cn{d& |rJά Y|%(jbږyV'`6ZeYEFDH %VW&FV`G+[k~vx= r,SV6XBBB,#IR&:ZuW g_~qSzq-7rNW3$|9Kdm}$լ#Įk]`H$Nѳ}@tcپ-x9+QɛeRbV==fY{;ENgJedxWeˑqTo}E9?HHHk# d[VMw|At&&/\\Fyr۶n!|42*qͺǞ7V2bP*"ҲϾ&qCS~pJs\4}OZ`C?RJ%y۵#ǜwV]TuJsPe%)9E^}:3滫٘ѢyUmǖʧ˯gSרRQ QVi tqeU\ɕ\)iQ<|T)YEcH*9NR&"VTB_݊TglHHH'E&}e)*|qy˳GO:_"o9Xst^DX w@IDATb}Z⢫ˀFtMeϵ&$@$@$@ Pd{ܔӲpѲ:Y8TqbHC[=gXۮTH-Vo/   ;OvIڵ|ڙx,|j2uF=۶}lg4loYwZh"Z:||ZvڣCR[Q/X"={Z/ /41EVX6?~~.Ƣm3q$lO~[a8qbFot1J{crs5# |7[ML:7}i8cw8ucf~ =L#  @ٷttċ999T<^Tq[s,?~BʔV"rq!YrWMϘ9@"{2!کC>k(ȮPã޻4j(U*Wԛb ۱k` > `Dt ו85e=hX =Q4O<)[gme q-DSB#+dގA䂄 pĠȺAHy|N\=y~ratx~5[EZrb6@e7SqkyqNg9v@DJLi} N؉lw}EudݲyvWVҺUs߯j7␳LM7)mNe)UmR.zj=, S_ C+5{ljth'Gb;֙tra.w̿o sZ&dMn=Oy˻];c0u#/6x6`S׆G* uN`ܬF?ȮV֤j/Yl_˛=0>sfRWmm.7bu.W!7׺B']\}VS;. OJtr5:Ϝ̞lܴUnQmNM{ feيg彷_(yT7Bыn*]0W?f-4Zcg~dyg],g{jF+>993,D{1ǟ|6@/v"7?I`%jާk+BiѼ t&Lɮy]w'AƼ֞ : lO}C|7b;/&<Ý2wK + OG; l ϱ{*Gz ) '{[[zcv킎g+<^b]{LڰI֬^, ~05aƍ[o%իq.\&_};ε̚}Ǎ:uzg)۷Ow~f 5#78-Ob̛8` @&9A8˒e+kN]>ܲz-I|h]mT?'u M?&O"v}_"ɇ6},p$@$@$P ;p16oOJ]3NiAmZݭEÀG ӯM~w1#_vk)o~IqapLhjϪѣ{<">/w~= 6O>-e_4n `kת1FMBMF 6BD`v"h;F=:E$@$PZ ;]{ t5:&Ǎ[3$)٘& hNd?}ҹ^A)kY?_}/+<_1q[8[h 3|~.<=Vڪ/iSiYO541T-XTthxPl@o @I!PDv|*^:o~|T|6x=' ^7s/]6+YN=w?qW2}˼4ׯWGk O[8a54QS $@$@$@$$.wI[umē5=OPgfeʘdξ]AbAd2u,>k־~z@L'iD깦͛5u/"{C79"  R%-Xby؞x>|Q_呎)![e^zXF.ȶMOyo’ã R#`+tͣKI߶mG4kK͕'YYYNZjgG|+~^۞=wSYlڼ%O/ VS֭Jeg̚'7\;"r,@$@$@$@$R#8h9F qy3ӕٓa_&7_o xmr<$,d+9ۺn dxp')) @!(5"ݔyx,+.KJN~ xe}HveNT&+EQNJf͢V9AǺS{Obf)}ߴf J.W.F?1w4̑}U>vSgv,}VdwhWdkcߗO?V06\ܮ5mpkcH}3 iٲuimɎu)υMW1d> G ԿjųV-;7ߍ_'M(QyC6G !s/r+1I^]WUSgGϘ9ϲ蠁}ĝXw[=&M>ܪL#   JT;o^IX=Om=&<%^=$86B9'*!le]U֥}p4    (2^bN{M \䒋4SS9WW/'|bС!y*$ DesnWSⱽ;wYzudUTQڶnaY|t8z{™pns]vMЙ<@$@$@$@%@̤u%t̛l]JVfT^Ui69/OV#i-Z|UxZE w}o 菟8tjQQRVu)[7M @1$PjEv1d.  "  M    $@L$@$@$@$P( /['   BAxй$@$@$@$@K"pu    $@L$@$@$@$P( /['   BAxй$@$@$@$@K"pu    $@L$@$@$@$P( /['   BE&_|Pa_G~mOfO1Xt& @xQ!X)EX6vԬCIJyҙ@$@$@$@$@E"ϔlޤ۝*Ot@NdILT/kOOJY+MʆkHZ}:稌_zBrrsy꒙+WC n֡٧*͟Tj$V箨.u+Gkʫ#[Y >R޼TPz1ۼ$s:[[x\Jă2d=3UUz W֔jM?,v*;dHauz\ @ IoOIQJ^ %kH:Jfʑ,{_ej"/z@+OjۿeyyxY%E^(MON}*%]t\R3r$] f+WPB;[ޚzX;gc\ FS")۩ˎl陲`sL_$O_ZMnVIfoHY.4-/ <%6%+!,壙8n$@$@$@$@%@Ng*!z0O_J2s[H\0]P3*A y;%%=G JB`vP^zFncdțCRMySYF\PQ(X|l<0rX 'A&;6<3red"!Z"?}z{T-]^;-;g1a򜺰ٕ^?    Olx0J#Ldd#tʃ!ri9lkۋ[tQ:C ppazg|xG𔳎|>WcYZ -دO9 0ṃ yf]. .Bd[!m][: އW.&_US?'}a{$@$@$@$@%@)$@$@$@$@$p۳uD$@$@$@$@$E8"    PdCuHHHHHlpE$@$@$@$@ 0HHHH!@5!    (=a C"jC$@$@$@$@Pd{,    E?XHHHH<Y$@$@$@$@$l x @HHHHHPc    @"f ?(:$@$@$@$@$E8"    PdCuHHHHHlpE$@$@$@$@ 0HHHH!@5!    (=a C"jC$@$@$@$@Pd{,    E?XHHHH<Y$@$@$@$@$l x @HHHHHPc    @"f ?(:$@$@$@$@$E8"    PdCuHHHHHlpE$@$@$@$@ 0HHHH!@5!    (=a C"jC$@$@$@$@Pd{,    E?XHHHH<Y$@$@$@$@$l x @HHHHHPc    @"f ?(:$@$@$@$@$E8"    PdCuHHHHHlpE$@$@$@$@ 0HHHH!@5!    (=a C"jC$@$@$@$@Pd{,    E?XHHHH<Y$@$@$@$@$l x @HHHHHPc    @"f ?(:$@$@$@$@$@bs>c 5.lٺ]-X,iݪ\u6wUɒ+o*sHHHHx("{ϾmҤQEy emb!44Llsf~PyyCJ+׹@$@$@$@$PtJ. lh6mngv;vhKm   (Zv+۶ﲧW\n^pHHHg}Vڶm+;vshZ-lj9yOTR^̝H%999Ҝ.F ;cTٴ7\Nvٗ %55w4;[ͱIHHH <իB`.(VETX?Lp:]:wz::tD^|-Ydk |<nCpȮ{aL*P_yZ?pH{qX֩,VI!66e y̪|ҶMK5G_RJػÇʰhX/[ Ҷu ,. @ TPA̙#={^zٳM6uuFib-'eيWG -M[xO,!ǎ#\QO&; #Ӳ R{MIKO"i";U'E}BzfF#   Ehb.򇚞J`wf 7#F5T"i=w^=8תYC&<3fwjcqmǟ&:ȕ2ң[<4HFm Cmx᥶  6 d֓ ONχ2RWrZƍ4}So4Z(?1~)_ ㆛xa.}~.̒.=Uf?fٗ5=O~HvmطiiPB}9{KyNiҸ} $@$@$@$pm:܋>zݷ~n3hr';?Q}fdZ`'%'˺ui##3PDi$@$@$@$PX m/Xb]EtkN;cVqٻ]0qϣNu]c=nW 'i3eifwN$@$@$@@Uhcaձ-"N sN<3 1` 9ݝs{jvfY`a)ꪺU_o߮xtl=~%=TX衟7oA~n }v ڵ9s盷mC`O6+o[ q#O,"Iqwi΁:ul bƎ۶|ʗK3wG t`2 ֓"\}_nPѽסP{9 A /9kBFHO<םS`ʒ×U0wFBl4'pdԗ2\'   HB-Wݺ@sCO|fMibq+?bhiXn\uIv{eJg|XC_p{X;Xy]=.zu:7n3ĸbl+Nm_6 uA$@$@$@$P8" GWv݋7L} 0Ex֬Y' .VhjZ DꞤ`0(xoS49 _K[a…eNXWXB^ %x &<ժU\0 ?EFd?DL$@$@$@$@#PE7&    A"pHHHH.FC!   (( q`/HHHHbt09    A"pHHHH.FC!   (( q`/HHHHbt09    A"pHHHH.FC!   (( q`/HHHHbt09    A"pHHHHHIX&L1&iHHHHO_DSҬ  )C$   H.`xy2 >φwRE6DzK;$@$@$@$@%5>~ߖn;&B K| HHHHH`_III%l$ë/333tNX!8 DZ9LiT%,iiiII]"k9C4* %=)2 @I#=(° {ʔ&]HAHFɥi'6)˶IHHH<Y+CrS IOOtHR 7!"`3 @2@{B&s⍤XȈ`3D$m @) OR Dv2$Md'c0A$@$@$@$@@R;7{WiȔOXTx ND~>D$@$@$@EFRE:<Ι+Fe.ܱ.,G   (L MgQ|k[/wjc\/fy|ЛV~9esFP?7!K&, |BS<++K>9%--kO:2m4|ҺM=:@ 33S[;{ڬY3iwh[Z^[TY0mF6\?d_sUq{v d#SNJ*†ouRog (vJ-ܗCV' PD&*cgo`8b[NkH$du,\gŦ`,oX7leo,1Fyfe9r˿o }wh7vG=IXxd?$T߾}+#.s/Z_qᲧi͚5r 7ϼ 7m+WSO<-=e8/>GZd;4>.# [ȺvYtڵf##c.q' %kW[~X@8_rI>d̬}2hJykfXoƒ^>__޼f4?ʧ_1 I]J*;ٓrʙWŋ穉ժJ5dnݮ۱~z9S|?{ʫZj%ۛ xbիk^ڵcH1.'YaO{sb_y~{7jK x*8`<mwRJ]ù[nRor)+rJ.+q' @!@C]_㬑-.U$ŭA9"HDRV@*ķS}rۉQBZJI娛Z^,U^Zz>˼K eҤi=kyrnse-2h ~$ f5,\jȶAeRNx}72bHY|4[W_slʵlBʖ)c";g?.plٲe 6 {w@U -{³/)3gΔ-˂ ><Ӄ ի˙ga!EYt |mYGL!7lC;T=eٲ2kj\'$ /\]zťr Y=Æ[_qYgU=?ѣF .`f݅6B3mtбs]uiȭh]vrfʕ+1ȭ'&HJ{?"J[I?JD;s|dL@_p;"SLӻ ʑGa'}?I֭c\o oN223#:KkQ?_XqGiɒ%oq/:)IH 1b'-8ڥT0#-ި_Qɩ9eue䊎eJ?6'|ʔeD/D2T:1 KsXż /n{oo7lxP?n}ݒaBi mnF kzTQMnv XtK 7楆O?BUV%V\.8kBp{DI'w5/˘/XPߍ z!j|BE3peȯ*rYQQx ޮfT׮][-rxU8 6zcq&Gev-[&ykqąM~Ӣ[ƪ">zm.^zeiqy_b7\w^ #, @R PdCKiR$i*^i .h{gl!))~"͗ .^| Թp &&xԻ{yfk FKҫ/ C^ДSgXc}ܼԪ^,yHCbMA<=vQRٶ][ֽeë^ZZ,W/ @W<? AP=s̕/!O>ܥY !dyOqԩ[D.&^KUD͚75x+V '$&x!6\F<tLMINAfP(<.+[VMy"(>A !$$5-<ǘEr]G(KjUH6StiCǞx4~(Ҹܙ aJ)Vu  򖹇_53 >ts;))@hRX/@ײ<\4'cСad{$AXnR A{m'_` :=f $.A#!F|̓5m]wz}mK.1  .٢K=ְJ@.oPQJK:=O|NlĖ"v‹/L_4ӭi?yeO5 |mpG駣CxDLNWBi9,}x.4F|"O0=w.jkڔ:`ЛxgowyGBLKkT5jbr {YF5>/MmcRt''EԸ^Wgn‚p?Xy7 @ @Ov>sKt< g6 HXȝ7RN=\\#~6z.^{>8į>a8Y2║&MA{^}n|&pk瘇 t%xy-oLbivCy}%F,8B%fn|Zln"bB {DŽ;_h7o&?M>Dt7߄ KJjޛu <_3O>ky= |]ßEf/}m/-S|RF#>z~v0]%ČCH/޺D~G_}m<.J㎐PO0Qڀ0G! ƍl5Y]-1d!F lڴI&SUktPC`(’y9 [׋5oұ#s pwc AGupL;i,;<#A}qeB[>` %:8z]Y.IH 'zu _xҮ]Nc5#`~6u3Krx3yre,yۈrQv׮3çe{3+E~.LPR>OmALxk+x(}}D_j38/^%gs~βx{(v~Ҳ^0l Rut"Cm ܼVRJАP-FDjʱfzVv "$6 C^~Dvao!`d΋ŋ˟CmAA")'ny@l#LժWۡxVTa?3HHN ""y?6Vҧ1ie+h"2iyP`R2ٳOJ|f|ݼaM7u\=Hr}e+{h W~]%U## Uĵ{)Nr) BIHH==f_<{:Lsx$>1aI7uba_Æ/$@$@$r`XHHHHH" c(#    B#^F"wa   $(4"sBӕ$/fx̊1HHH @_{e{`V x!17   (> R6 srq$$@$@$@$PR 0Fi3@IDATyHHHHPdZ6L$@$@$@$PR Pd#q CˆIHHHJ*cD)HHHH O?_A[Il?";K{-    (@^tRE"_C;9$@$@$@$@$PAE*mPpF;$@$@$@$@$HM6O6cy $,ޞ$9    H6z=8#    A"{PM    bM"X^HHHH`iHHHHXHh5MHHH!V pdI~=c0.lHHHtoy%Ef**#HKiJB-F 5E[hSd操}#  / }ϓ#}(upo KFEZhSd'ġ   "B "pXJ}';FB_, Hf7}7IwEƎeq惏E3+ PGFʕLBVPAP=n$+ÏZ1 |=#keR&uLp[U…lgi9]w?Ͷ~2M ~:KyꙗY|5;/_^:ulm    IHuIIsO{eX~c[+Ϝ&"_}Y|*} >i^;/%r>>38W>$<B3$p]|A;S p} O?|2xpr֙eӦͲji/>{_F:,k(CwICHڵ䕗:CcO;`]2|[re}~3e{nA*emy# 1_\Z;ʺ~e_}%ۯm Gy+]&   AdI#mreԩ/ ۰A[o,c% xS"M|_2P[F:Ro%.۶&=3[I;+'I?'@駝$ʕ>-_|<*=/1 ##>{؃}[f|: yWV4g;Zjժ)mڴ2ǨݺukP&3[=fϔ{ճP$x,^Z نGWz#MW8BG\w; }.Ƹ\ gn̆&'_I<΢wSao LXlw5|\!O S/*3&JN&8y]\ 9RZm= 6JxkԨq՝dMb6~&]t>3Er˔ŧS'30 [nIEOP3)P"NvhHba!:^Bb)NOU;{QVEjgX{\-b'[l{1~66B?/ lAZսn/u,y#b]D_#ZWt4oI/~%7.>ń#F"{jSd: ? DT,_'{6/DYÈ9kBFRz+; 46滎ԭ+~ 9@" Hcm~Pl/drԯǕ(v"{gCG(BD?+3C 7o"3gζ!&%CeU6 :c%52u=h{@$In~cLWr)ew0PuOfCYN4h w   _+BzB;Rhh(<1o~5`c^ڱE!?oNz&ҾDڴ}Κyʵa-be G.93H5mbsgc"w6Ur&$o/9;!‘\Xϗ4g=;bؘ2;ovK o;i,yYyG5bf' #oGC^7@l֬\ryf_$@$@$@@{7 4# l}p1}^|G7?P3C=LU=X3CW\&F =o6f ~g&*8Ň#o]D,vZkP1 x7˖٦׎/R)^b&6|SN_|l^?LVujT{vm/m.HTIcC[yx49(]z}:|0-`~0 rz'ڄ/YTig{_DkBrE؆fy     Pd$@$@$@$@$w(k (w@     ;{ǏIHH7oZ̧t1%@u}nS''{o"{   bFmFx]b640kK~_MX_iHHH[N.e׷"/0%zǠ(L}'  (-nP6qH".|Pt 5=)#'(5HHH LᭀY5]+a}y_]c*MUQ{c_ _GCl\#   #x >,SRR$ZPd^c 7'   CڞPdP-A'ۑHHHv ˎ 0r!P$Dcd֪H.gVAxk4^ $   "y2$@$@$@$@$Ţ$@$@$@$@$y2$@$@$@$@$E"&1L$@$@$@$@$PT$Փp $$|O/l`'uOE[$@$@$@$P ɛQA*͓HZIWNXiHHHHP7x&kIO ؔ:̴C$@$@$@%*#dٟTI* 6C1    K 3)%r$@$@$@$@%Ev :* @rPd'3 %`s$@$@$@$@!@δB$@$@$@$PPd͡ $Evr8 @ "@]6J$@$@$@$L+$@$@$@$@%Ev :* @rPd'3 %`s$@$@$@$@!@δB$@$@$@$PPd͡ $Evr8 @ "@]6J$@$@$@$L+$@$@$@$@%Ev :* @rPd'3 %`s$@$@$@$@!@δB$@$@$@$PPd͡ $Evr8 @ "@]6J$@$@$@$L+$@$@$@$@%Ev :* @rPd'3 %`s$@$@$@$@!@δB$@$@$@$PPd͡#!n3H8" \IHH$("]NcDZZ^,+$ ,[,vs /G~$H$) BrF֛o߭=>H&}?. @I&P,D1֠: F*U3:CN:Z~o%~_>,9cvk/++K^}|> +[J۬ye  (R;93iC}vyǟ%HmK/e>(n,[6oiSIN)k׬K/TN<7~zjiٺ\IժUlqvGI&rÍb8.:>l\tɅRT);|9w>u?gɧ_'*hOwr ?P/Z,:&'rsQ1Hd_*lٶuOec.'ȷ|+7m/<|̘>C9P=[^]_fb_)R*}+_}-,O0L9M{ʩݬ.HHH8(V"ȣ?< O??DDʔ)->L2u7\z}]\~|'V駞xZwYxUӋP$ڗ[ZٖZj;a{dAaFl߶MnYrU췅(/ȑG!*TvE$@$@ŕ@R+UKY劫.nc%Kbe r}tY^7uQjJ˯mo;üF.2E kPW!C1^kT~WRm ݲKmǞZ4w\@ ^zv\X*W]My,K.rG4ž< `}DSO.5);{Vy >a;AHԮC>OCDҤeZ*Vյ[Z5C7 wNdjLhO g^0ۃ< UWo$Hyy2Ӡթŧ  2 hѲd  /JO&\r%,k (ܴqdYlq1ey+s#}Yf{*UD&!-^ `}Xh8Hy[ L$@$@$P;xzweʔ{Q'mڶ_}ghȰmK8ٳfȆ_3x0>x/>R!f@L+7ǃ9ѣ>=E,udȠw-5 {oӺxvMVg >mzlhf!xظz׬]k^x001 d#& 8.u=DI.YzyТa^B$Yd$^, #> lBxT o 1f:Axr!<>|6ܼx;nJ7N(   (^|I hlgF-[dib$[5j0@AnzYFxz1_|{kգ)zn2r}> ʗ@x#{03.ъ+.(s6 @a kd}Mߌ=3\_@mA琉 UL3!f̶r >{vV%\׮S{gO$@$@%@%s$xq T݃iIHHPd* Dڷ|HHHHHHHH` Pd5B6@$@$@$@$@(ypHHHHE^#d$@$@$@$@$H";HHHHH` Pd5B6@$@$@$@$@(ypHHHHE^#d$o 5H}9^e>Hֱt~H(X/g;e`\X8h;~߯qHH`h1`)'HqU"> 0>öX<y`PRRRbׯyHا m,},}?ɕw>HH)}T54E>HaO hT:A6@B<ˮGUQ{ξV6\9'8W ~ 콡Ǻ%@L焮϶&eMEYJY> i\w"قە`B=|оXv]Y,E*̕CQs2peHH _Ȟ3{N$7 jFr5~| :.ډ%vb0ij'V:퓿;2y^a=>\\ @*CBdPmlaـE F)W>H?OLCb kG'ڵaum# B $F [R}\$~8'ܹa:.v\ N _3H@ BA+n bV e_'pvʩA,{xp8d,/|!N=$[Fm-g*Ц+x%>ߴ_C.{‹63փy]<|GBL$@$@'@{F,Q @M 8m 6Q!F]e,!RCHnjD5D D/R8Ճ}x25k7C]yl ?>l~c;V^]CШ+/  (";w^0 ᬂĮ ׶ +N8 G"k}(MVa(VCkE7ZI@ˆ7M!#TQXiG_f1iY/qX%wq +a;<&iu)Z(vѩe tHH8\@N`CX`K**.pA5/9Y6HPCLPŵ8m܊}* ҥzS"쫠k@(zh,c{ C8.멠gw8opAgquDql]!J8pz۹s/^f& ~ ГC&AdFU6"q,x$V ay=6uzјW$mʌ~G=A#ܺG &C9[z%|D [ǂK/q^R?֠!ݹLwnJL}HRyj gm;8R"e?~H"/=mQHZ<Z'ݣ =.]Y/  l$G ChB&0TL}nۯe-tCE DDp%axUczO [<6o"dڇ(FYx ^v8yx@ʨ`_tľ80/q2vEHy.Avq_k<7.qڹA?ܨNmQUHH(y*@ͺzMhq y23-lAFGx7S Ѻ*x]4 hT5A4z_q ϳ腡hߵzQQ h/P!δugOƧ˷cq$e8N(seR b8{;Ǜy? p%(i(EʟI~] WBh9x&LVRH 8K5f nS'ɼʦ= unWb}lRbh8GBMs)+~#'qȃ?udB;ZkG^Ѻ][bmR̾m藫~PCQ?q^tsZR+#RH"ek>8v3]ҩ"]V{έ/T E58ݽz1 @I'@]πd?KP.lo1d'Rdd@kHF? >ejqƟ:P܈?f_mg#~vl8yXDrsjmpʛQ;)0}2y|1eLxm mV& P{q  y][v<n<@j: Or~oK;u+H r/)z%eB~F7X"$}kvΩ^އ%նN%R*Mҿ+o Y=dt9FMJx,NC?jPW]|>_zG_j* ĻB!Bһhd/?O&l۲Ul#3Òy̕_'Y" ]/EҴ,W&!A!Vıܐ RzI?` X7(8[AIG,ˈm$kQ1 ef_B͜CjQ#R$vn R拊sg_e:ZW:~0 dtaG%*k?Ki9n?.0TVXuX˦,_9G~cQ1~|@ڞLwq)c'_G _ű_K(]L?h="g\l_/2־,SR|jᐮfb)A84l–\BMn Cːk;CHu/ (\aC[Z") 3u)K;r@˧/ $nB3 ()s{ũ3HʜyZ~7oQA2O}6co}6mʤ+W@2=„vwW .  rzq੃/oAC]>},7OT=@fdHm6_ŠJ3rGY[6*`O Qgz-UAЩYmSI ۀ L6ڇ .xTwzz+jb[mT˪s Uf?J1ABkڤWkMzCj?KS\H{U#bՒyVQІvu;C/,DE^x»6a :~;}- ՆRLO8 xP?] a,~X%Dg_!`CzDkpƯ4n_> 9Ͽ pl [Kd2c B2|o¨V>U\T_d̴u@Goö́f" N";?L@H(~)zy')v.%%%\*gI k-/M]Vvƞtkա4v{U.-ݻȶϔamS! B5‹}!e{XoT=jHXz&!<zY5ըfbbXŖu)pBcSm«W 9m%!f_ۄ(Wa*P=ǰP}ڇ~y!*"S^@sWY m ޾ڎSNADwWO.]}Pه-;(Ɵm?VKذ6!f1FwUr@|E򔖶~PQggގ!%YvU#Cna;QzS}m'۾Ưq1m܅9is4i^;ьqW.em棌僧 @&}~ڦçxrʩ,NUHq`2=lip`^RNg5G4XfϚ-ׯZig*ǟp\ ՈGʄezD; DW6hhHN* ԼEs93EKsÄ~)ۯS~1-ǝp-2oߒ_nZڴm#'t9Κ?}5=ܳd'ʥ_"3gΒ>L,^"v})Sl`IrJi|ArI'w92/:[69@w04rs,CjOؚ^p^hGjVBܥ?7z)Tu$XF/nr}|+Pʪ^E=*޴]TThysȖwmHf/ =rBwеmoTR4ʺLAC(XV>VOW>a c1lǷe} 풽va3byHLϵ%ڋ3}nG]8()~2AbDF}ڗnkߖ׊./us`ڍyFRke۱oMa :rvf1?HHEwԙ* U(N VBiٲ9d;coS} >+/ /в_xE/]>lDlݭlV/hיPwyǎ|m.CU$op^{5@'kFڋ^( {(㵙:sgybn&ꡢfXU?'ڂ};_Fv<׺f_1hK:ƊAe˦Mblw+LzikMG-7a780 @I%.6Cw}y6&e&[=g\_xUTI6yGuv&7ͷeղp˜v S1F0}a7m_MOmz]zwޒ [/ы K~ӕnC\;}e˯(w9ޚßk9ހoR<N_v$%7#|a[/>[R^ |@ 쬖M%usIT.50\/%Xcv$LאT.LACy/l"‰:n&Sh^/X EʹN<zib.>ۏuύm,;>k9AY$1}0&<\뇳)Pŋp"%-!rD<ج!ل3q:KhrXG>#a:KD[΂k =]>p+sE,9S>2cqB;HNƯ6c2tjώp#x1zmyM$@%@)&ˉ'!*׷g-\ ^uVyn!tbiӦvΥׄ3l!SLsbn,ʕz?o,\r /ڷڿ|^gۇ^^lٲHN~-3]w}o ٶm< N@Qy_~ѻٮ"Uo޶nJ;YCtrr[ }[m'K]P\ȀԪ蓇GZA]Ϋ}l~ڞh?;-T m۬[Fƃ}밇mdEgmlξk(Gǭv?mkubىn;5B;bӅ8S|[" D؉)✗DzBvH6g]bElYfͲx%tw^h;g{XlQ_NVZ&X]F9Ͼ`!.oWKx{ҰK;q{t%Q $FnyƏrZB Ucz>\x#*DīˑRc86"SRSтfMygOe*|Eykµ-kCh"6ʫ}jaĂ'uƃO A }eD?&E^+!ҰV&}FL`kgфזum A۴El|V@hl.]G]6~n]g3v6n]w]ゆ5~A"}>ul}qa=XB}nB6? vA<:G6获+g)qϳo (Y+_EKJ-bTXQu7;*iY@|_x_~<&i' ַ_L`iݦaۼjyv*(|zT~ͤox^ N ȫqXC[8A݆#K6C@0y@t R7U`F &1D  [b )r2WB꡼KHN9m]N[?M]LtE#i*[mF~pjXZy`":Fy'HL`붽 ,1&1a۸Ew>QvQhP>cc1V\29c KkO}Y':a|׾}$棣SEy`]{ׄNp& (JȮץoF:v e4`glAY (F}2sC%f3wbҺM+ #!*>>_Lk3AH~1 (4h^V=ڷ0w |쏴?n6!!XlklO?x!Pk޶' X JU6bW,ьjzR"t:o(PC]1/|˪~]>d7Yi1+WuKۺ~Y)"oCҺ_:5 S.BK`9_$(ڣ2~nD;'JYacH#A۾2G/ K>EIS䆍9 oF 0!v.IVFf^ ԁ0O)ܨr61 og@IDAT /Qm0Amڷb4o"eKD@]mzy<{Ew^etmCyt*r`U'9Z\Exuk{AXhkڻh埰 fh\8&l}nk=@ p% /x]_ !a}+6ڱu  u;7V}E=|ntعvyh}m?j }D`U[.HsӍfqn.p0 @ "Ӌ|7t?g˳^qyrWTll:xoC&]jիg6m A f*PÎH]O:QZ[OxŽoV՗c$]|HBUl:F mzb*W9}0O=&͚7,'Mx:}Ə~B `"yYYث{c{:ci<@9O''5Ŀ2D|49MKBrРiPe6ua7 m۠t >faB͓5U `_V?{5-VE= ЪG3ϼh@w@BL}k}o뭣>AGMo 샸XwC]mZ-Y[u4ouev$ Ah̳0w|P lE> T>G1Ok!pXckF<,eddj\R[_TAr&,DYݺu3Xucu\nm%ط[/CգsM1vLkj*y@MZUXMkOq]x Dou1(7ѭe0{g*,hh]VL5oc_x6U5Ljީ|b/ߔ ĞgWZ>9_WkHCXSfɋ=R>,wqtL[ 96uˈ/eɚ. FzxtH>=yiǀ% ˡED0UInmr4ᓗO;> 7qGr^ġm#8ks$met LFV Yز6 3d˶oל-kun ~hs}ne>(Bve }?U_/*G\HB,ۜZjWKcd="e\v#gK ؟z̒7o oTbEr-%7l0gv6D5^] ;k_~#;_Nۣ2 ^~:ܵ%~`qc<:F/΋}yl~ꑱj8 7 I,Ӄb/3? @'@1˯ޏ-V!  vBj Tņ }K /$ jDU L_4WKUOqd pSjK 'Ph[s훮?8*(4)9396/%'_D(k@䊈  r ,A *\eK؜X6}{sN.t}PUOOyޯQȷ2]I<&z{??*g\wg{_ qw\y52^k5퍯vus~/B+WQwa&E[WqfhC iXah6Ķ糩rbP\* ZiVF.k4ۓ^|]ᎺlB6S 9¬oqgkB{5>j^+ yQ$ygo&eJd`=2PGuπbGm<޹&FDBl:{eG9+.›" ER-x)~!~#ĹF i)HRt5ucw|ak8b5Eܫ/oAyw!yj""TcK֤-CO"'u?_}H²o_d3V{BdXe=W6E*=b)>+W^mkI~Lyڵvyi-?'ZSzj=S\5S!|㋐ur| 152{-l=]{[?e(ӹ-bk-5d,)t; 7nI<{}6Ld`=10z;m] ( u{YkXA{k 5?zDApnO*^COz߰yr &_q-Sj'jdO O2Nby>Vqwtu/]2.~ծ3F,CwҀWnIlEٺ 9úƮ_=Q9Q_x4Ejj~mH5{wR/u8\ںzo>۽/ʵk-Omvl:'T$X_!ob^$  ,vڭ4YN]߃nl4m j4H~&@2Qg+P (BhG1l>ыBU*Փ]ŹK"nrա1i%s!r=RSSꕖpϳ-MhK_kV;`Ϛw+15!|C7\a(I<:ֵZ"@;0WH~X\D{+l`}YyvH ]h,޳[v+>[OyLl>[RF{koD^X_~IBx_:= l~ŋ1Q=.9߳B<_@2 4/>ֿ;NvM@9D^H1䚛иb5OxC8q,gMzBzQ}+Zo`Ϣ∳*~9+k a+5R4Tpܟ+Yė"}24a/5i/( -f:gP{u`uZYŎ,en]^I\d>\|L+c&=2ܷmkr^WV-]y?YƷ}w>7Fqku[8H>=&`p8AP:"#cG|6B{00Y" g]PЪBE /+F)kMvM](EZ-f|,U5m #6hUUm6**Nݷ6Tg&yɼg߲z+ۮ7e[[ϭg;^q6h0yc%ˈle;\jZ[-$2;gL;wNH5\G{TlVG%?d X7 ;S2ꑫOO]S-^ۜ}ILJXM*~8L6䕪{ڪUw6a )! ^7XZgێUtZ |k~dzZGk[Ь%mwǪ?bLs &Vf=|^-q{N_>m;7Iz[{ےC$7+= qsgw;xr9ۊL ζ[h[Ie1˺cs{OcYkpዢ=^: uCjwn3u)ԡx0I-)Sck\xè+i\sn&<|YKvmk~u?M0w׼nq?#u:-Kn=jy;^vtlB@&EFN4&|y=v,eJd`=2d^OC 6-TrX07 h\ңKim 5Gl2oeʱIA:[$&zGxj-`kq>7FQu$Vˀ(ˮx2lr90vD,eb?Z4WߒvV|E,~o;m[OiQ/?{ Jcq(ͺ1g_Zo mY.H]w(uT?:,g~ {oi9xr6ʖbɋ&s9J-ݴ]aP{L@2^ߥL7bLk&4HA๟(3t;.)`r0' @\"sVԉT-{<@<2#v ZqV`* k J]^|!.Q :繙ͻ!ŧ.QZ2eFYŭx=+GXV|_/~llь ~ꙋ 9 [\ͱ!-jS|[_en;ƪuR/>XOsMO^?o_f?X?~c| /\ť{Sc4w+܃nZM~7bjQ7ܼo+/q='4sW\Rxz?Zd X_ TŰl>QGUeMo|_\^?vf]ŀ¡ @T( TcNAj.-Nʘeq 9`z5d)"V7q18NoA,,Y٥s4dS1˾x $\1!B~l7.[NkO؏G]1lW"scW# !X"D{ IH~J=>Pd2a3_yA{%h¹ XAIb{&NC=LTY^?~uG/ ڇ1>}wR,2nIamܵ^x\z=Wy?T*/6A"oyp8CB Q~3ˊ!Fx]p}C}k, ^JʏaQ|K5` (27u#= |aHxw9?~6=׍wb(\÷E!8Dž:Ňy:kU-a_a=Ǿ497e=|pUcOKw 5W[>aDpJg~Sjj >dƟҟ gc'(沑>~~}ʽݣܴXEt|W[ 6Yh:&X|2%@2X3ˇCgye /rז|o?FL>]㏈k܇=NG9^'S(?rqǖ}+ϽE\XN 9Iysh^l?w PZ(ޅ[9cxuݰ 7&)(.[S7$aHP,O<s_Cy2(&!glȍ7T0Cb;%^s ~o|' nCcT(̖(c߰s">n>/.wk4 @/|9Gy_1z2Xs'ߘj~=)"\5 'sp<m4-|56S?S hO/o?9+QÓ?៾uێ?G(39#lexxMh i?N~k^K/xsxtx<ʛr/\;8o?reǏ.gq&b#qK/x$&V+;Ec[ӎw=x&j ,UaG~k// [ח .wKrוfb ewuw}Pqd H!{vrS6U(WyP+?ǖ>)??*'__ڈ۞O~R馛??}[Dr%>N]<9夓N,6m,{Cia@ϛ@[xQ!=V).21jCQ$V"Bc;banE`զ#" @ )=2ڂgQ~ώutr~?G',^~c}\g<1;TN-gy~NrОQwk{}PN./{L<.iɷa]=iNxfLHpދ $:a`Mx8>+?؟,a<ʿ_XqܶomszŅ} bӞib}`pzO=!C0Ⱶ: 2֣x)"˭JXƷr-<؈C_3N:sl89C}D`"vgf>'9ؗ\u]=xЁW l/7>;Q[iρo[0 >y6V|o/'?jw?v,c(8B ?f"~LgƟO=b2)&mx_n t|+}/vr(nd H_믿<]~R^ה)rהC9lt'e=,_:K _}eb|q‹>Z9+Dy!?3ϊk_9//]tq__pgo}Gy~/3L_ @KbqTX5 Ck[#Omx$Y9] vFkwa.~s)уty9Sf͕:n9,?,[˖g>|v˞|_X9l[˝;>w3<=z`=t.=/]>yOq?cІ|f9=ʑw:ok^ǯ~ b `mN! Hsfu,8ff/ *.x:"]s9Kc؍S@ Oy }Q 9kʻ/p^[:`~!|G<pcCP^V]N&38~LB6`+G/liRK(a!I2VQCeM$aë8jp E(DDHJ?&J?7(,G3:|_ q4 '"YOD}2~د@_k©a? Iy#g)>}]|rdj?F-=V I҉,:UߎUO/8NBGw=~.S2 $늁5!ou^j"x@0ۓO-W+Wn'<{/~bŹG=v\G_ˈѝ5%M:^xZ_Z3@_U|$n>ckfx"%6&=w&U,>f2AwX?PQ6DGyC]󆯸]"0cJLc[6yN9̓)Hv}wȡ"bnoy[Óݪ{S<]ϝ 9!z7AJ3 ! ﷢n>+Kqs!X  "t5q>ZBJ-ϕ< \ur9p~y;{^(^u9~{S/R~z9#HAx |ڸDY^\sG˳tVIwfk_:& Āyx9ēWTE1Fn,^r >Ei_l *~B |=o,vŅm?jX!f6n"v ?Ǔ K?G?J¿+e/ro MƏaO1~ E7.fR[Ə7|:hşOnl5L$דm4<5yM~Mkiޚ/'@2X3"{WkO/ч-[Dhgڵ/&C`#І(%. _6) ]gR/ >8d*Y O+g 6c]!Wb BF+*.KN-O~#˯ϔ3νcxCgC#_DglU>d=|ʫIw_=\s _?{;-ԋTDs({x=xYϕS"ˑcxT1ݗ/!Oyq?<1˜o8QꡇV|>o_ԆLRfpEqv^#]YH5F Kmǚ۱I*>`jw +;݈]/Iq7 V!U0o~F~PY}Q5TW~?=WxͣnlnȔ $:c?|{TF5wF_gvoGU$z[[ )M456(5=z:]!B?yPjZ3oY5"KiDD_8ۧO'D`p?y!{/7.&^ZE2[>Br J-2Z^i"?P.༰>}f?UA1]'fҟ;D.`$tW$61~U>WLJDfd8 C?jB79 |tOc/>KG~X]N >E*<ںW|OFjDR`,s~<[d=){n+ ~LJX6_?b?$}O2z4~ 7 pn#WS[G-}na?#O~/#^.t"V&p1?wb4? l;u%S w|C2:L`g'9K3Aپ Nֹo!>Ui??OXPuG sn0#T~fJd`g3K3,oc9/) (P<֮˥yHׂ& /d{QϷv#ש°j~ULvАle#\$\/!eA0W4׈gu+,mFܰe#l9WCB>K b %lo\̌ lk e ߰ x =wvzK~%Gi!xwK99~0q|6Wc?ʿK>~t h ~?iC)a?RNf?nusC;4WKZLn˜>ƷWW߉h{qI|Ǽ)Hu@uivĨ0Pn=Nb"Ct y|P`U[)eu.t@̭x_cd<>G ^y WW+ Av(F#" >V/mW0_anx s =Nm uSЈ?RG>+!]SN|c?ws1&;I_&7E7^|7Ѝ*~?͕IGm{~&x{ Ɣ5~O>6u t(ɕOMc#О*}{51œgJd`=2P*Gu@I¬N=F )AyʼnbC!n囀A ,#G6CH#.!&̧9VIƊ8eG j*!h /AzRw6l|a d i#deB4_Q?Ck5RWQU)WXx ҫ2cLTlH]6e_7vegڏ]D>y[aB|&_3?JiK4&-OFNj˩;N(n8ZV7~Kdfkd;=Ph>4W2 $EȔ ;_a` _ 1hAK]zFk 9eϭzŎlMf@>rX Nj wgB(sHli; 9D'ठ ^;l}Kӊy|ogC!ő"P|ņqbFج/> pf?VDz\(wj=<0of(;_A&L9d?+j+/~ o_[DĽ>#2tOwmė)~\8KM\;q)i>'&eJd`=2"{=zڌ !BԇN8(jL± QPL~wW j#>ND[c;)kkS~'T~pY>͒EW>NqO8w;Ǒ7}?{*1 Gm7uPP^k/B $:d E:42K-Uv=S3Lw VԆmd Aǎ{s@YV.m"j;)Pwq8=_kzծ@{ z9CTx 7 Fx Fz.y:0^Yj[C4U@]>+> >q +Ph#f  >8xΫt_tz[ߐfgKv^7^d>şOW6|cɃ?D݁?cc n@w5E?YrUC8l;0^8 r"ƀja$ xi:q ivUG2 $놁+~.X< ə.(׽%ٛbl;Nd <*.U!0VEw׽wH)#$G-ըBoA+&#_%x)0D*wb}Wذ%x$sP$|R&Jےž|_PX&7+EE*mn㧜ST  + #$y2J_j}T|_ŤB3R2X~];x3q0N CRzpD V%+n|۪'ۻ_ |_A؝A@OUk^2lL;ApB cxOۊvW?*V;cI6!16{ Gʎ܇0'ct2fJd`2_l .O]|n~E}#rM7Fl/_7lV^ %lmW5^Sv>*WPe0!z)di[Sñ XX0EϻF+Q( kDYjs?z h  ]V*i^[hWEiCi/M_mG͑c/ߍ %>=|>(ŰN^],#×GNL0yFw_kD Pm ]g)~,7ԇb/Ugbm"_! ip+ĺڿ ~m[ůB~[|'1_ɿOQa/?F?ckVHώQ=q*o"Y2%@2.k-[67 +L;3G>^6XlϾ'<T.St !7nT~){gS?\8QbۍJÏ({w9ȣng.6S~='[C/g~Z9^\σ@\GqC(+ &*ڋU>f'ݽ^z%92-Z"LX% HﰛO=<>'x +U3ƙ$#b)6Z]rxn9fxw'6݆d̀ wW5Q:i/5E;o&jj/<3>mQ#M5.M*<0?w3ӗ]OVS|7g ͤI1n8s~}192(>ݙd X zmS?􁲸uk?iG O􆍛ʞ{]Z׿+A<{R=.eo^VO{5g|/[xZ.&\?DwBpoݲ|?گÎ82/K 0P"P]DǝPPT{.IyYƋ7غ]e;e,>` [q f|bHB*V"mrX_r/D/; rno)8--UҶ>Jy6Q\+VK[Ċ_—R{"$U [hfh]w\|>|m P߆>jfgIC9;$" /tg4G;lܛNdS'K֙-FxR3 |??_G}Ҿ;}A/ƿy_wL{ldJd`=2_絓D~g=ܳy @IDAT}?8ޟm-W^7:<8CVtbl) 7.?ȟ$OWl{{Ig]@?mCTpSwx,mGE|^CRr!79ki|ˌ˻A˫VOj#G<Uiβl2F=VN<и=&&gkomG>o_gۿuo)^vUy_4\vM5zpa\x^Gx."~bэl1^[ EIB_ѫ#J+mvo /g신2|?K4f0x6T&p_T~lbrc :N^C[C-hݺ2%@2I׈G .<qބ7vNaT{ea>?c"υGtqZ/^Gݭ߼88CV\ϓˀAK/k$˽`v?;=&EEx|1 : 3qkX|pw.T"~>Y:R!4-/*/͕yʓ&H-wɄB!IG<[ V l?O/{3_>i/V^,xr%b"ei2"2b;!{4gaX?} k=c)=!3G N+FtI埠_O_!SfJ}L>Gdy'z'b~*XƏG"+lʿф2+?BWV?Cn86ݰ閘|kP`7/ )2%@2OI]sMsA0N ϗk qՑy?~|=w=2EFӍg^o}3Oʗ8\t~l?>3x3dd6 yߪ>!jPt{OѠ0tO]kZ!\DG +eAЊք6\U5b1 pRuJӂw;&%(7m]sWe\\9rZNܧơqۧ8_K&^}Uq ?U|Q2Ӯ@ U,4[v஡"W(C!x1 8Gc<D$bA@ŸWND_d?!*!g QTG畅M0o ;II1˯6(KgX~)xh9~'ۯtr93\Q,땍 <9x`FC~~=ڿ(] Lbް_ٿp<0A0Ph+.+>)>ChW|l&!nN2 S[fo&_g"f`;Z9 qI—ŻsZGûyN> ig?_z5HWz^ #J8˵"%귂e!" L>- Y |+>[o5#v~ _*>;CnKGx{1q?@ѸiƄ/\d |cU|lsT)Lv=ISFz_.+a*|pA)Ϥ%Lu`->(0Ǿ0`BkbqPtT@>{= q},)HƀAL}ok0._]yӫ s57e9/|6n`i?v 国O嚫,Ogċx30 O3:LO j=Mx+"^[^" ћgRb;" drh4#8WOCwt,x0b9?]29=6y-E/%KD0B_NYeU~c#Yg++}9t qO6oEAV!CBf5Qݱ sx A0]+T쇬Pf폕5&cà "?Ƹ/an,rJЈ>EE;}?!/Jj;0aV b]s?x1t [==:=|wl jq+͍Ow󔀧*÷[ǟ3X㟱*Gw&?fzOgJd`2DЇGCT(+twį#>s^P6nZ9N`'ƭ3hhkq)>n+b>˘<rl$^ԃ/"MVE=XJ/[ԤTu(~ !/r9畓v\1WS,ɤb"WXu/Goys\yͷݏ?[LPꨘ>ħ(Wpz.g(S> _eMw0xcbbKKkkdkf$Y޶c)Ht3`K?[!N}G߯?+<6T!]MKtwI&(s:ejaw/ooy#E BQo;;Q.7˳QbH8f&[ /R_Jb&o@FH$b?8?hD`S_,{Yz~'i=<@2"Y0wŨBΕ?p+C.i?MV"RㅶBFƒ'qS|7#'g_A+>jtb#JK>X %}uxo|{OyrOyW+kۀav?mߕ_,/_|sZ^qx&4@H-##*?Usd H'8qx'Ȑn"~Trfs!" \^9E~5܀CuF4"xkT+O_-WU8xq>N.)H<ЏulgΆq˺Bq3;BD*kS|PߢaxynHFR]?% Ypf2h/|X熲LH̖evDMvb\&# K  g{ gc-<~_t pUġro+>~gi?~۪ Yۿ6eg聞$jߕM(ވ}j}1Xѧ^an|*>/B_"_y'ռ'<|AOxlƷvih_OCl`Ef<ץW[9ǁ2_+H]ٻ`d3 zcDEnṣviG!Cuk${u@ue* }Veހr#^QVopGgq5a`n0 C m!Y-BW5XWGޠ!,"DJ|*ߚ7cwejf4&xa5P|oz_!ڽWw58;p뎎1x5S|i'tcGO*|fE[ӯ?ֈo?9ߍ7Z{fj[ʿef%J|o ~, ᓑcLbڸl[!m+ŶX;OYPF3N|uzl&-ߙL@2 GRd^Oۋ^h8ha$CxAg^go+>SOqc'lEgVυ7wVp5??o`>jgS6t+ ';b>Ms&#O2LhNxߦD :3a+7YILܨG@|? j%Ź1q'dJd`2"{|Y1cm׽n!MH(\s)){K1yBK/2BEQC+ƄDdx8#o0ldz*.8zZ٣N3bMWDW;)<=Y{\k?\'e~cĸ(wtoy7 ?)>o3O/{b쇐c߇:cwOSz ]^˔ $zd Ez9)xp!9V8$*!€e~;mBB諸#VY@L{#<\ʞl>i,#X\Vbb{GAxzh0φwp`+VT#blG12N/ntLK)F eŊ;'|MWb=}Ϣ 0 CX\IdaQpfD \mԅƻ өzO?o)'wI gIxgm!յǗ "i>KL忎1/mj×#&ppC>`>*"7U.ṟǕ*_wC rǘpDu\!Sֳ $b2%GM,(M XOЀkRW`r;c=ϕ/|s^LĔq;E`xH堡* W2 yyj Bڂ ,C;^,D#ZPOFvu}D†^{O<}1p.n 94u\:v9VsEFZ~&zf Ez2:)jjRRlWǮƙ{4mW|wqwFW?UT3⊝$G1Ѻ. kM*Rbɤ6NR{nmkZn%o Vcco)ǃ?M{Q˽K|'Wwx4p:~<ȱeJd`2"{| B@a> m';³y!ajc_^C*fFc㣫\۱XmĦ6(Zv:5BpGpF;ڸ8 4n眷ب.XsuʞGHW^n|ng2 _Rd߾Oa@DV8(Cwlţv^XC]H՛lv=o 1zzÛ !c浞M |Zg.De3vq+p?ŏS߰ohX|o9DŽ w/ hiap:Xv9fu='Y;'1f׺wOƐר ֦Ld`1"{xڻEE & ]-Bppv*\kQVA̺Ћ[Ct̂![WI&ŋฦ8$yo>d C틐!OCQ66/H![@܌x_8r} _][c2dz*]H7as|X] +n8-1mL@2 gRdOۃ 6D),Рe4ǃ<kXe~K,Q ]9` N=Mx#B~q'dB I&mjqۼ@^vXWKo C]!.N{=Fuu$~3)oOvcM ~&շ[xeYw!'e-uWgi_@2 [RdۮO' .Bhs U!TZg,6s#6ֈ/FZm7/MwP/]B=kW18֨[Uq 'FvFDtq(##D1]H'k?f<)]y'[,Xn}荱HOWAMӟӝV|fL\{{3b|E #b5*ɔ)Hu@uiũ@P>+$Vx<#h64PCOy-z!Ԣ~qR@ vZ_>^kvq>G|E&Qa3bZr+zə] j~X0^yQ!18eXǺcqTE ]gJd l $]XD4"'!&fC j8J7HuX̕^Ǩ[CPqɁ)jRſXw_jt=!l,)<N_DaRCTzxܛ7r~>3+U$`;;ZL[xa"_ƣk#Dq䘊8f축j'T܊L@2 $)s $y޽Nh+ 0ԓQXDlv^*45I[}]GuEIC"^1>>E'bMul^꽬8)b=X컊o{ij1'-|8 j@:1T.m{uu4^].r;w$S2 $띁dOP&?U@p #ui4qhi˘|=@WFLvⲫ'~Ѯɉv*-p0|R'Lxj;>ދIu9rxprd H=)HV3B!;AGc h˥ޤ09Vܺğ5#wBm=:2nǖ[G<<`-Q#[mgؼԥjuH&SWtԵ%G]#vԐŏlTF!c9&sT z"1F?ǂ-ߨ@Jœ3:̯n#SJd Rd@H@-" J]LQe[Xꏺ#zX+FPQ(j",CJ+V9 Z/d krײMf¾8F>+*z)*מ_II| b]$ө1&CxOIyb0ӞC|6O=/zv:|z]Hd X@|Y2\Q0Q+41↼MXfA$W/.g!Q'psQ^O`Y;~wſDw¾(BwuED-*JNqn:1Nݒ`7c#DO>7ټN%HKÌ*ݘGL@2 $g Eyɫ@0HM !Os DV(CpDzhG %4uVO/?";QjGaF[SϽh&$|l_kǓcȴM;c SanE urw)?d Hv@Y ^-~zޫ䛷/k! i BԡcpkM?wY)ļ|汼1 z<|zz?bbƜc2^)-d HnٷQH&C*!Eb o{oVhiZ୞CeaxyӝL=.1uϲ 5ۮo 1Xl$1ڄci;>,ciGӍd HnٷJQfH (T&g.79*8Sz׼O ^lĻ}b=o/Mu"JY >xN?75abuqX51W2 $2n̐ d@:5A&`=V6⹩OǧbF86YWë΋?g?{cڹq į/~~s (~4;FLw  v~=mJ6Ecߍkc8?d Hk 񖥒 4.6=+[C˫^NdcN0^u&v O_ƍǙd Hn}}ԛ$ (^'/5y#Oܭӭջ= {rD\oGvKoBFNh8Q{Z[mg2 $@zo_>d@GQHߖlϦeҮ<&nLd y L%ymHd Hd Hd`M1"{Mug $@2 $@2+0"{WlC2 $@2 $b E4&Hd Hd`W` E نd Hd H5@5՝iL2 $@2 $@] @2 $@2 $kk;Әd Hd H]ٻB/dd Hd H)Tw1@2 $@2 $)w^6$@2 $@2 )RdLcd Hd HvRd mHd Hd XS ^Sݙ$@2 $@2 vF.m˸Uqd Hd H݈hlwo5!Lj]Sה/RRdoy!Hd H]\an.w{׻' $@2 $-1nwxỷ޽c`Fr'N}K6%@2 $@20V۩n[lB/]e76d Hd H[c@m۝wkm[몼 $@2 $@20Siٻgw:d Hd H8f֍@womج:Hd Hݚ5^d]Od Hd HnWvoOJEV $@2 $@2 > Ⱦ}xZd Hd H kHdgpW Hd Hd`2DN1d Hd H K0d 3p(?7oO|p.Hd`g2vf;HݐsW~H<_U#qSזѸ{G=z.OyGm*/ʁ{ίL@2 <v-֐N $P~ч3/囈<{1w3_1eMIoyQg|AS6׿ud1=>gvL>h#iƇ󙒁d y oN)w'nĀԳچg(O{\,j*V$1μyE[uψv- 9ywqSU`wQ[OB]{q{}-w.][pBB pMHBd7{3sU˷kLZ7~PuxN5T!>*x@M&uAvAb3XoJspPO08ITP2ٱqʓtփڔI(2wj.w?*]%G{e,%[yP9QPԔŤ.`~ @$l Y4Ȗ:j  @>85i--&·  @P-8 @йI[unA @@d@ (@Š @d;@ (@Š @d;@ (@Š @d;@ (@Š @d;@ (@Š @d;@ (@Š @d;@ (msW^wtt)s @) ]^: ׇjת|̀ @@T &P*U,KI&p ]r~3rJ3e+ @M@wAv(OըT_ُӌ T~⺺REcV w6m߱vK%" Pu(IDw!Za+.UxIĉR6d9@``-_vK׮ZՊԼYC'вk`%H&%UV*W*'+ݴs>z=)RjTDrfR @U@wAc'2%OO/jզ+y{O>'o߹Gg^|- Ώӧٓɓtiyhw>s̛B9gӒٲf'ىxGo,̟;?2O+WZ/`_O:w3++/jZvJPv@IDATB&]v^z-6O4Gڼa)կWS'h:hǁW@ ]K6K $U֭;2덇'5!b.]E 4Fz-%[jPŎ˰|*(gl?&ͤ۷}Qf5b^Ҹ SeYn5JB)u1j~Ǔ?w#q_r9wWJ"q0[  @@%{?huԱ}+A`1D[oypWWJ4 U-ͅ8fZ,)ezSZqrr';N'ğ+?ōjxo=3z-SBsrjи 0`9@ Dh17m r`[JyA<}ҤI%ӧKKS'GFuNҩc!M$Udİ~eucט@ EK1vquq1|VJJD8|8Pi#  kx*\ӭj4iSU3N]~Z0]zeJ. -RP:FnMZ<*h"2 m[ƯbB%[L>y_[ @U@-٬) Z9v WsǏN..j]ʪL7%J@4VnՔʔN<'I?aC~I*7F^9-D+6ZV?뛇9O YVu*YhA7^!@^&Hl-z~#i7&>"/2eri|;}Su+Hk!d9ԨaO7鬘@<\osՐ(@7^&}J=(a(Q"UC666EAAKvvv|hX `bkWQP'-999}w˗/)EE_^4 ,Z*}%N:2gd<ޯZ6HmoM[6u-qǏSVB:;6jܐ5+ogz5[V:cr{7Sdɨdt%ԴYjL@ R'NrIU֮^GlN:M}2?GQ݈_|Q ׯ`TLqť;gϩ{|RJ0`SeU'h֌ Cn[[߰%Q+~~~4sl*Z &usU1 kBE Qܸq)[gL.lOOO3knۊZj.M%޳{/5l܀it)zA3fbŋŋh_pBAqy=-k1{qkܹ4qb}dU{v|5iAVf-Xbъe+i2jAn߱tUڤZ٘QvM yAs_*R0UQM[6oUE[uڪ{~:~'߸a۳*VH{v!/O/j]\M,ss_TN]*ą/ OAOX¡CvRwE%J/R[fuYO KxR^SiYejYΜ>+^pΟ=Oy%n=GOʍ3ͤ@RB9y8~; pYf/ߚ-|.NnZ=}T Ԝ8K-se2p 1DZAݽG??mb!#ӆɏӹhrh7:u*rP]Hb09W]waKW, ~\"f#gvک[~\=yF|.%00@gwOm>a c,ph|!Γ[y]u^ӥKKo$[#={Lܤ?&S2%u{. O `ޗ`R; z`A_ƯԿ ۷nS"tR%nҩm۷VQt1k%c[yN7ؓM֪Ԫ9uApϚ7~=R>kO/]6-Z@k78-WvZeFЈQÈ/b6oB=ׯ_`7soCz֛/tҁ&MHzt?'Ot~*^-\͗0M^<$=/í5oj8]|EhҿXaYd΂O WY2ƭs/j;zؼ!S'K-M~C+v(!td۩k.ESō7d9Dxn5d7[!CzIiNjΝ=~W oU)V[Vo{EwV:\\Ōǩ?N ]]]H KuhԘ_% f-7Jzt%:j˿|SlȶK ZC(o߶C MZǭ*".ګ"8uϟ 9,sဏ;D gΑߵ&%7nH\L{r@Vrm3@J\פ-k\oNpNZ|ܵjƧ"y< p($C yZodn-St<>ԏĉ#FQPꊚl|/^Z̵:E>I+W-"JË9#!@1ZOr-gYh_m]ӂI͛jbܯ/ygZ}rмѲý{SBQ\`}59WCN1~;/-p$<0ACGm62|u0Alr!N֪ wtx5%S):Z2Nͭy=SkBd ȩ?Pcg' ǟxºD/ Audve @1PͫQfGA6 ѨICi^{PM5d- I"/tjEF6-/}׼ qV8V6rJM\7/ 8^] A2xԎ$eVQ9)[hld/( OuW…nP3ߑgSٺH1洱8wx>exF/MR6'pi<G}::FޱU@;k%|Ws,Y@@ ` 'q @# z5j @ `"&n @GAk @DM@ Xl9ר) @d @sQS@  64v@ `=\ @*Pkf@.!@- [ @0廼qFo @0@Y̷(س.lK? Qp @ $tt2p( @@Z@  1dP @! [ @Ac@ CA>#j@ dǠC @Їl}G @  ȎA'@ 8 @@ @N @@qQ @X{tO|||į_Z޽{'P``g7V:_@7A;5mL#Ǐ k4q2o`AtQ<~o~-k%/+  @@wlי:Bq'.Gp!Y;|v՝wR|v9/ ~އn\AmoM]{t cS׷?!(w4l:~ѿ/zMϟ=G @p[7oju6{~s5?>%M4|(sN4Y26s eɚ^r **?~NI3*`ĸdoo3P])sK.Se 6HHY?J<3L]Tn-YsԢUsy)3(vԫOO2v:B*&kиթ[[ۓ.ZĉC?EiҦ1G{{{z!ɛҥU-2TέZqqq&8Nt[4@br ]^mz;(O/\5ˢiʤiTY=A=T`⌀EΖ=r*d_TF5ȴѸh)(FRhmkkծI={U8w֌ _ rrIt2 9vuuUk)@|"NӧOɭV ԥzzJ/(WqvOG @1U[y-[?\R3Gɜ9ƦV E1T_.Zjazí~)ٳ2+ oݼ)5kXŋ"Er|zp }ҽW7C&A dZ\Td Щ:{Eڳ=fo>}i%ND8uo޼Q_L7^\Du4.^R'= @Qr ͥloٴ8kWڬ>WTllm E &Jh΋soi'OF{]se\|E^#FUW%qHN9s=s,']0x5oJ٣5q5wʙgUFl I>l  <řcpni]jx}+O.ssyK'檃O Q.9sȴn66tugԏ3$[pJ,}KΒ1^pPN߀b2ʠ:^t]ٗ.^j>qNj*Vsgϧ'Ohͪ52Hzb֨Y8ńxiMKG @lnqΑ#Gjp`ͱ ќqIiHIL!gggZCg͖Uf?wA.o 7h%,j=NEYMVȝ%՛sytz?ȆtlǑ˜Ys?95SO/3eTڸ~,ӡS{È"uQ9Fd?? 9Td 1 QܹԠaGKΞj.U|[m!_i妊p !ZL.<'}(&r.g}d(UB>&H);/мѽ0wD;!qQX>Y{̾Tҧm'@B[gCJ: r5aMժͭ379ƏyI >`΢q` kx$?P @"Y}l6u85n7M M] @1@Av 8 8@ } XUNijKO>C `-E `z*V(# {/\B}GKӤz|KXsM-[#;.STݭaRw!.gϛb|SÂx@ ȶSd&qG\)Q8LƍOG&MGAp=doժWQ=Ho66XÆ z` QQ| Xl+=v/Y-W0@\.ۧ.{ uܞ2f(84`0.Sj yJ& )WjR%>70_B:{ܹPBԢes}3z&C@\"Ϸs_5]Q4r(\UR-Z?w{zMW[iٳg ׂk׮SdITT_d@˓swCU]|۷1ܕq;meڳ{ʧJ%KۓXV*:u**_<5mքG !彧ƕ?L߫:*\:uhc/vC{SysN A|~xm[=eϑר*7 `V/0f*wvcD UŅ9puԚ[O:M^^^򙟂'=|$ܾC];u@Zq*&Fj>:w͛PJfϙ֮^G?Mt |mguy4ZK+ ^D3ͤL3S墥gHk? >eBW\9hmԿ޹sc붭(ʳ_nn>VX%-'ՅԏGAe˗qO~P2w^~mټհ @*loWWuWӾ+Z5J=,k,;forKU0jh: X?{Nԭ9eKbEiİ_jթIk׬ ~@m6Եc7:'-^4Uf-[nyzn9MWAjtbJ(чih Լe3J<mXQZ*>} Kݚv(Uk@~̭&WҎ̬ij? 34;6%ITݺE[7'azt.;<~o31c8;Ν=OZd=sA60~y9s9 V^seckZhi[O6L5q+9_ ҅KRv|aRDquLbͲ`gTQU*%aDs`2˖ owٕ*Us@=Gv:ux$PTZyE Zɓ7ԓP2dHM+ @@wuwJBȭcڴq ht{RKx"Q~ƅ[GKCY7!ߨ.]԰*) -:|O)R|Y!Oi؊qIIԎ2*R"M?م'A79߾!WZ ܵ$K\r9\r~h)yd8 o[33dHOViSl۠.թ[ E/|0zt@d~e87Os_ [`CK wӊ\¹O>U7I|u_oBǎ[^zQ{yiNw܉qҒO68I1g' vp5/_$'zTT5o6x@.syj{wѹ片Z4\|}|U{Ά|J-?ׄ k- BYMjPUZO_<i!EG3.]TQBBz5N8  @@uK2؜k\8W8дNԋ/ qچV|^G0 Ν8h"SLXu@N1:?@ԽKOZdܕ TH .bǎ%UxVb0+hv-Ց_>}&stVx^zU^83_hkj)sɑ3a?gUqz|T<0boo/7Jp3 @, ۂO^t:8s"pJVx\a=ĭ;Q%N&ck7nHnNbW؟=yF˖.vy.9|+w}d>̙3 [8[ 7|-^y-W,[)΂GC},٧ ܼihݜ|a h)I&U/*\J]i|={x YFTvbm֚^٩V08O7 wMEN?z􈸃!VLJfKNOxR8o;޿/'cn.ϩ W-6*!}Um|5uz?8ՄG4kne󫗯`8^/>&N $IH+v M6#QϿ6JvRuSЅ|<4z}~^&IνvᠭW?~LDn'SB ZNkhB>[A b} -1p(  #FGs @@fJJS/T X1 |E@/t @d섢: @@ms# @ЙlPT @p @:@@ _A @@guvBQ@  69@ LAN(@ `~?8@  Eu @/ G@ 3:; @d @t& [g'Ձ @0l @d섢: @@ms# @ЙlPT @p @:@@ _A @@guvBQ@  69@ LAN(@ `~?8@  Eu @/ G@ 3:; @d @t& [g'Ձ @0l @dFEu|}}Gbs2Gp= $7͛- @d[) ܺyoݞfLbgϜ˗1=\wlי|iM-b3! @ٖptw!;`x "/>>!>m׆|0-(0uy.[w G;Lj@L)`oʝa_#?~|J:%<~J)E~~~*UǏFw(]4h J6 ]xF I_"E _p ʼn6nD )%LHRHnXv϶I3I4k ʐ1zkԌ&LG2fHW\L2Q](sLC9l oS'g*Yax@S-ѩk +оל*&MxZqIS%x]i-(T@a9w\S6߼dbP'ǒKi߉-77UU5Q箝[5 >*;zrI $@R劲%ӊ,˗ 4|Ȉp[C @@ ȎDnd)"Rͯ*W0Tsi)^f܂+r*ժSFu7vvv4e$}ԙoO:YjjHQ+\;HTfQ}JIwꕫ̿wa @) ;:u-|ۉ%|JAkIT4R#W\o/FNJ(DGiݢ-=} .HU} ?YÄEЋ/UGȳti*]aQx687S[ ecccK"a @) ;:uumNQF2\Ij7TRQ [kWtΛ޳k/q}{rOnޔcTPpxxWpᠽB4fXI7L秳gʾ}*F-M4yU-( @h e ۇM D4*%au:sSjR:>QQʇmr'onָ*S4Rr9/sECHۨZeʹ%$5oJ3RSx@ 6[oc%Os~.4CW3wbtwwVn5F'KLZ:>NVgyرck=xPZr,ѭ۰={FI&d_|llY @8ƏyIL1m&t%ۊ`QU9e$tsqIxjӷlJnPdSY%yO{@ Sێ2 S}e lm'h @bs*p  ̕Y @d >FV%.*]_R?m?Fs,L@u ֨# @, ۂO^t:Q3It!z>:vDDlXT&]ilo*tl `J٦ԎR-`w,ib\#@S|X|Q.@\b%N[E[7Յ `^Q{Ղ=QVӨ)q18q0HKc4-:JˋlmU0V zc֢YSE|}н#' G_w ;-} eo( @ laXTDV6ho>*+i8 K@mIgrQ ~N'j@d[ɊCU-(Е|9Ee XlK8K8F@ @mQ  @ ` Ђ7nܒdϖxIwާ5K( v ,^\\)CL\'@#lK]ԥ/ԩRg.Џ?y DIGLM_|Jris mǴF.=@,l3ҥMM֧͛4iR~BuEڲm7eʘ%˼{eU SB >B `- Ɛz?imJ0ȟשAɓ'۩d"+8qBjբi E~~ԨAmYTX!}srrI-=TKJc{h%t ʐ>-+RW@.䧶x:|zAse SitYkRd6c1/t,3GVک MJ>:zyIn5*Ptq_%MXy58tcs=xT+}ؿ([LT@jؠ9|;ǏO;N7a:%P{9iӖH+bݻwÃ?ŋGҥ s>&Bb~,8qg^ݧNy~'OщSUGtE3c#=vRfrZe=rѿ&^_^N={Z}03tFP6?-YN.xI lܸ3/z؝||}B/oyn;?V-Cɒ&*Pa,Yn޺CFIO.n+܇WL; .[o0˰M ͚@>} ޶}/"EP`5kZOdŋӴihܸqԪUdzh"ܹѣGy@tr8N D~WSJP|)ڼnMuQ[h >]̭ƥv*~Ծm3A,YEte4f@A]S&?F҆5QBݸI{v L#tYzLNTCp|7_XM:o8޼u.s)WM}k){n^O!CԗM㴙[wR))Wά܊;j-[8ڶj"yGG)tsmQ4\R|'w.-趰*p!@%LRurMZjm#0TKu^e\x;^s˘!=W#*Tw*7r9H$Iʭ.ti"yǏ+#{~kI2SEԯ&={ʷm4xwU\Nu|*r9jވf[D:q5ןG62~xK=t7 @ Ldɂ_"PE s<}֟7ONC `񍧧!K,foJ*j9x2JyxռydiӳŊ(sEKW>A,gRlI9fU#z=t)OԿo%`ϗK[L^uώ2r2!5йc+'עpH(?(oҨ65nX[VΔ|$I"0f S2ޜq? &@ ;ړU7ijAՅ5 n5h0v7{rc^.K!.@^N oYL @<nU{[nv u18ʘwjRWbʱ8 @vn-|FGDocM^gMUF]!@V%VuQY@ S 6Eӑ*,8h+>VlC,sD5-;GQbR /w:I@wYF6h6 @CAv(|j~䵸}EBc {ӽl@`|!8'ܥnS[kA eR_:\~u'wU:Օ|zu_ց/ZgԞ4Lz֋ʅE&_x |팩gX (@Ezڌ{j.Ԋ|NpwO.nc5T 3{s}t|:0(-޽ғӦ+[B?ZL!OO|_u;%gceyTRJ {"]yrWH墦K/&jr1)KwTK,W_/-0_{Fʙ,튴YhXZZKc[#[uWS6siUPj乨A4ݽ6B R?Ѱ*Cc4M_~]=SsΤ9kۂ*E>TynuJl2a^ͯI>\xtӫpQSzD.(צZ3*؂&+]7I]P,dlum ;'G}ob!ʘ([@V-Q멋]{v&Jv!S!Sy*0s]7:òE!Az4|RUSOeP:-_fQmia MT68ᠻqt|6Û(oC:zyz˜gұKgh(Lg{yT}jfwng7A;:l5FѰ# 䋈>{эWQR0ZyH[r`#GNU:} :6Wf>*gHܢQGPu=%[gIY?OM.U@=.K_X{wf(MVv4Ύdx@@ Ȏ2JlUs oXsqV-j̩k"A|R%@[䖽yzI'&GԗXVZ;mNZoVTkAZzmX@y:n--s١P.RFi⧖dk?poOEe~ |(+  o@7oʹ<Rx W}8T.A:to\+c[Mx%QD2i'\8Xr4҆KT:oj.+[mI2i'*qt7 aTrV\G*%K2ô7vT<~6&]2E UpY(E2SB[N/s)SOsc۵-T?I'ʇd= .o8|"ܺ/e^ H+;9D:-;UN<82,CTNnpPS ?Εe]>Ƥ.IGgQiޛ~-:kW'9;JN7w( P||NCiGfXZQ @:zu {K秆k{:luy ^Sc5GgL٩ԑഇ<i.|Gu˨Z8tᎏ*uC*Ge>[S& xynun7'sMj8[4!dW^/ vW/-=IQU9-RnETy>sqq>;r7  @Z:n^Ldk F;*z"-Ɲy%8` Μ{^\c-9 <v0t@yLJ< *@Rܹhan61c  Q }t?Nnti*[,լFLϟS.)uԴ`ޟtqSYC)s-;{+J*ys/eTj%x-8z*ݺyʖ/K۶m?Xvn)K*A;#{_RKT}pRHN2e7-ӓCu֢rp\~*4u4X"ժS<vmݺխ۽gk͛|韻Uꀾ/H -f 1MFBl5bۏ?nW>׭vܹsy70tsW]P?mڧM7K*ׯ緭AVŮܕVlgk_n܎@@Av{uAeL0UQxA^wߝttguqsO^Oƍݷ>9=j^(#?x֫Yۺeևp{n^0L0-zgwޣ)e VUWe钥Xz9|ge>GƙQϯzK_ʞ=cƴOǩyVmZ_ֶfs]^oQ_x7.dj\R:vyԃǞ|.R_7+͐M;np[oŭoy mwj$4o*ԶG{.ʡ~ 7;ѳw*ͯkn#z\V^?{[PQﶂȂ^ʹ%usGqRtQEx>4zU:y?vn {yˮ{7s\oq2m_ۼ_mxGOkmS IN̰DO!I'؁\~[}@" ~\[^g-TǕ2~xfvF3l޼]Qdчc\>xsϱ^@d'V=k,kzmwlMÓ<&7[^T{U:z_bm  Ai (^"`iV7ti ]ЍL o.[ju;0hXHE~I9/-mmr}x=\θV*A~ڐPS 0o&WT*jU+Wjgbܨ"3;ej:*CWZk 5˔BQ]4nTt^wogUUqyٗ_^׍u鹢A}JZْ_Xruv}:ǖ]L6GVf 6~Ҹ@NSou?5kDuۆ: b@`߾}g/:vzGRt=7șgNl:mݐs2eJZސun{:QN(ZYZ*̇OeqԮECE$Mz@S-?xLhP= w}7P]! {І5"α/Ds>dGE$ c;'rJʃ`k:a V*_jPDsWDwhn z7slS@@ @]~RT@wʗ E@@';9NțF˜REAi $Cd)   d'2@@!@ <6E@@ !TX  @2Ǧ  $$@ @@2@}1Avf@@HAvr@@8q@E@@ d{@@da@@ d'W@@#@Y@@+@\AG@@ Avf@@H@3eK7ڼ3IrV $C [lVZvG{\ fDxUyN ;ӎ:l  ͬC7Fhgّ.5Y@=^g"Կ5vJ  @3VKMJGqbGEU@< Av\@@HAv2@@qEG@@  LuܹsW_mW^y͘1Ǝ{ZPt.BwK.^{-ݟwƍ뮳]ږ-[\{K.m?p}+WO61x`[dI#G/b'OdM` ^t_M:mX"52[c]tU+Wε7.#_|Vn]˕+WՉשSO}[U{  A';W]=3R7pC{?OASS~ϵzsRf~k}}Yʕ]P/Omz-ҥ˶sN3gNr S܃xVdI/V`\`7|?T̝; `v튈:ص^k_ ڵ5kڐ!Cܱ .z׿{1bۯ*7o^SR< T &`G믿*Vh:nݺtywu[d MHΝkq۽6mڴmZM6VD VPzhy^lٲe}Q^z) +TfJ>ޠycƌqit}uZ P=uWUR#"3؎;\緦MCmS7OJ:t;>6l`5R{ujڬ6.X}Oڵ];/_rw}g7n &A7"!|}b(5}tMu=t@(@īv ۬SrbEA>$7.Wu$=ڥ-(-7tzOVZn-?;??nz'y*W6(-BQ^7oN` :Sg#ÿ%%h ?M6DTabŊs!~)'2=q7K &7{L@H+ڧbEArR\AzTmHrѬY3[eʔ1ڏZkn@O7PzpLZl'ˬ:S^ˬsRکX~"ENzXh;jSO=z7zw\ʊz앾 AѺ&jRd+j~*2:&=S~}LR@Av)lRjhs=C}iVn/ ۗ*G+Ѽ^*Y>莡.nmheJqPovRK?f<#nڠsU/^x;[+e*]V Ӵ&B.Æ bN&>V$T=ȑ㟣KirudJA@ 1G ?rnjժhSTV?kJj?F"ުXkY%Ԟq?Q[t4nԳ_@,0sNu{І7,YXLL}dk ׾}{7zz5EF) BjTJ _yx7i3V[u9Nd,#W3%Kd y@S  da0R6Lߵ>51" meo  B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW" B ;F" I ;HW+ښ-[4:A@ cogƸ)y)AUZL8 @F;9HG!J^<9  @o .@(WS m~'@HD@Կ@@=^  =Q`Q@@d'E:  D!@U@@HAvR  @Q`Q@@d'E:  D!@U@@HAvR  @Q`Q@@d'E:  D!@U@@HAvR cuk5kpzjwe޽nÇۑ#Gݻ#f׮ݮnĊB ~îo2֥[0=ny[4ٻgo΄'ZXFM잻&ѣGC@@ң軽jٿvkyRffm{5nz 7lgģOE+d ۹ٸ1 u}!{GM\qc?vwʤ)V_5/A^9_@.jLIhZ˖j… Z_jV(oYdEl27]tUZzBt[l^={[:l7sCŸ,G^}k{KvjԸf|6&OjUV @@ X5U쓩n9reK~Yj+UpGSz?ƍK2eeU^m; .el[XBȯvc7imͯk.\r[[7}vq={vP'[륵Lt}M-u]݌az/ԫKּE3t2uuef1bՍ'KveН@H˼g]%ٮŋ[y7Zw޳ڕ^0ީKG۱}=ij_~>/pCLA-u5nؔ=p ?r1q?N.Uӏ?c:i)];wm3G;nO?:]TRh^7G_+~9^*`  Y`_nXWۚB+Wζmn#e/f5/N'k֬bqF;K /~ CvO7k~uz$SL6n۶ٓ?esXM cժU1^wF,"V:{AC~a+,^b_z|5o;tí!Q@@*JPov%˼xh#eʔmx=ǗxϝOSKV/Rm.v-\Э*٫Vt׷}?bŊˏt}W@nYvXVZុLAzF,>7]7?78HE8oj,Ogٛ#(GIw`׮Up@@t+oǂ^*zLuPyr{ϙM4Yd bJ]^YhK["TW}%Kݷ='9X^T>F{sd ѓt /dvwu.h 7t|.DfgvqnF@ҵ\xqN=`ؤ5n5_r5lrUq߾}!H=xg;^ Jk+~]q,urRr] i%~!kxeC6K]Q!jիqt|-,Md ;|=5߇l}c0Zw]s H4rk_m =Z  N|lVt~g׷{\rYCw;ni.wA9Y׺^u7ma7]I׈%:fYo;\ۼWo|=,Y~˺`]C,w\h_m"Cّ.equbz0@P@@(Nn4=Xje/?[9o{׺>ZjKyس{(_-!WGcwW[.gлIݢ7iT ajnފRW# xYoX z :PصS~NJW[:/͏aAt_4EOvG@@ X9st j{OU;bt8  $E ;)JA@@ (6W@AvP\*{ěo[FMl_%x7[3\zb7D!|+z]kkZ'w4"gq^GCIR@@G<>Y[25|x`4_- 5kxi}kN ߓ{APJONsZȑ'{)yxM㈖){M[q+ @8Ok5^ê73iPy1/zG뵭s';[l6dIJ*VHm@7ޟ@0l~ 62oޏvy:s7D-^:/o3 ,_zUk >_y^wV:{ݪʊ+cl Q׿-';G޶SAUw}ZimQmA5=1%⊆WxueYfu_8g 8Šڽޒ*%co >BF˻I po^ m3Oخl7Ɩכl.4ސƐ6yͱ/>F}?cS@Hi W g}5;VkTdu~_*;|M4|8P9|<[`}Z_OEt ^Ŋ3}6wk{ٗz^{{lwiz:ץKyyau4ew)}/n(>5ڝoyg~~[ҽEM֥ヶaFkq} SˌϿNw^a׮6tR偂 K ;}]tӚ:e?Lk׬u_3/xUPߠ!Y]ׯ_z;Z^KQs?.Vh(Vr˹ {w^J#Ir[]hxnj} W[ w.q(\UV.-MAA@  dË^T˝8`͞ g~9˥fTk{l!R<|VȱX`Ζ52l&>*#q&CT.zv^_z  @Ȕ>E҃@쒚5yW1P=jC-wv6~8ԥc-[vW?U͚5s H9*݌ fU <XĜbb\SG\9Ͽ YzÒ~  @_y]Mxөr_hfL9;eet bk$ Hˢ;9]Op3Dzdq~Z},Y≠ƻ5*JJ,&<"+ NttwIWjվ5HJcš^ٳ^Y_S\^Xyn:6MZ/uifXՓrܹsm}:ݮh9E:ukFƏo/nÙ NPNji~}siַO}nؿF6_7&u7C@S,@}/@z?[:Vs[Vxz-W94kȼ^꾏E˚hFҘ4aKIN4BȰ3)pc0xC2G;y#s۩=jqF?~{moEM? Ô UW`{[tؓK}Pç*~B+@@t'Vp4[<^ajn*KjFQH…QuOpa@dÇ[6oH-wm=nѯF =^wq}ٺ\5  ?0 o4n,Yu~='%= 4 |PB ~IDAT2&pxI-y{&14nZC'%{n 6" @|%   Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$!#  Av`TG@@ Av$pgvuvwlkyukّ#GlǎT  @ SV\mw^88.-ѱlFwkF}`O:YXf|6_k3  @pNQg|߿?tY3gGڮ]X5;_7ZvH۪?-իքlbϞ= VoHA@R sZcG VmuWNڡg^w^+Y\{3v%K/풚5B{g̙rM0o[n]^/ZbECuO>dmӯO?2u+u~)۶m|c{Kbv~mҥVti㿭LҶqF{k/H_m9rǞxjש?  @j ГA6xREJ(Yw\:~8vq5k尡ìmqV\ِ¡CLy(ۿi^ >qP=M\*Ic{I.\W۹ZJ@.oteCZ/ѣ|0r 'N`tnuO=ցA@R@ ;3.j׭eJQO] t]nl Ճmt2k֢ȑÚ\{Mh3ΰA _|!K@ /}EevUW슆tF lWmΝ6{׶w^&~ڵm@@RS ;5uB Y]vX򰕆qvOJ퉧7?7:[3e:#FveFu9^ jԼ/Aȅ6V^P3ccJmэgkڨ+V,   @j dnطRF4^.t…Cg[xvE pǍإ(oϿ4=8󋙮^Ǫ+]~f^/mEEA{WX]H޼yr},\KX:vA/ǻV9ֿS@@ǴP14TjչKɸ"L3g>|w;t)mw||Èߧߋ*_t[uy7\_fM >+^TS^տO5nru&3gl>[צmk]?y.e?5 pu?=q o΄"X ;/5Z._{{(yOv8TI| YZUu۶V|y`n  i)@X^KsOʥx=5tyn7,ds/,tU|@S*@}J"r!=r x_:}]&ZA@o}ctwn]-SL^Qv:V#@ eW/T^/ESߜ#^:].w=[ @ds @C.(QoH e  ;M@RUG.I7IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/query-params-str-validations/000077500000000000000000000000001461403617600257635ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/query-params-str-validations/image01.png000066400000000000000000002505111461403617600277200ustar00rootroot00000000000000PNG  IHDR8gsBIT|dtEXtSoftwareShutterc IDATxwxTUI#I轋.  PZvײvu}Օ.TH*$!L ѹs=3wx}9נɓ'{"""""""""`FkB:!!N:,v;.g..K`RS9|'q\)vf zuC0Ə [hC""""""""rv;nɂl1 a*?=n͚`!>.ē4T2IXxaaZoZZlv8UN\\餦bXζ.ou:4UPDDDDDDDGBBBJƍ0Nvҋ0#"""""""R*+X]k;jqgGGDDDDDDDrܸ\Nn˙LfTfrrZiܸ1NJթJDDDDDDDs}L0̙˴i0]۪<{&cԨ1X̖j̙3)Sb3JUg+Ղ-/30̚(rx\nn7N\өNs= &Lǔ)S+ԖjfʔL0ŋX)S1[ͥBᕟ>~x ÜhQՂ{v69YY&6x""WiFa,^|QNx1&J VGDZJ;_UZ0ppeZ\A9G^aj,ˁjϏʩlUBꗳ2'PF\\Nl:rq;]$|Q""""""s.5vrr;w^Bթ@5TA>]"![9]?QK*""{ĿJijԨ1%L!\x. ++ɬw[2d6ޭS,);‹/Tie2̙3 ϙ3b?\{P|qELZWe6hQx%ry~)ޭ̰ɨ:EDDDDD.s&ZMƔ)S/|> V+SLeʔEV~*)r92Le%\`T ۲m%-e~ c+0.:EDDDDD.RWMkRo}W3,}EAU2+9~aa4nܸR6 䒙[YVpgfoaѡv=ӡ28G>~{.{]{{L?<{cuq(~{s|ONoo1"*YW""""";b60W5|^^%:U 9>Ӆ wBtfdTmB?ԭPgъoö 0BGaF9ʜAϧyf;rUL .w>pXfMM|$Ѽ"*](WxeJ?mۋe>JHOȦټBQ#=c?3<{|[d-y|S5c]>k|[,'o?7^Os)zX4!_< uGR[vʀ,:oH?V8omjvZ0*-Ã|pb_d\#f7㣯]h-|활e7.1xx4 eqtxO<ڧ5?x`j $ATd4 b| 2~z}Hwë*/ّFA.`?33>ZHrs<2~^?]3j>/' l@"șeҼCd)ݔ>3/?lfUÕzo7tΞ<_kf&X};'@c!{݅:Xyӽ N[:ȳ߶-i=Yp>+J鼱5ZWpS7ѩe?Q2iIc_̣OelmFSKǿp?)w\\_/)֯_֮]ի+A/c)N,ɽoxֱ,H<=_~N֩C0Do{p*g D?4wcY?g I+O":r r V,>#AfVf[+G棙j|?Ivma!:v wAg{.M=t={gl Yr`OӖů'6䖢VN Qn: C˙yA3a6m݅Vt @AvQXλϿT#^]AB |.t,N pOڟu dm6 ;O/3<~~LAIr>S78-cOdX%|*({n:}~6#<-XiTw]Lqf$OltC[ d<8&-;Xzŋ}l}z"sZzu m-̡~=;J;g-;1 }vq3.Mhe!OXp}!!Kwg!;gC锈T^ܽȚWIngo|N;ꑗy~sA< [za¸<ܱ}xgJ~'e9{oՆo %fr&2J9HU oÓʼnӮ8ED-\<_?OqQ^j?Avf_`ᆸ}v3_* LqZsIw`0rb q׸Zv=V`֥}Y3mq?_+[ezڠ&_ܑ-im=> X1xx(p,6, K~tXL]s=~+ 7x؂ cXi+=뮦^̏,;,mYÊk3[6W5Or*F=p a6 {'g+ OKnvزt#OlIeᗸRdq譿dҨGyvGI{A-+s?d<<6xC-|활p]8_{!YK|eKܾtr._o0QFy.1GJ7/-nr7 9eĻk o{貄rTu4qPzX"""""""ѼYy\mhbY 9eGSe*#^^+Z""""""RJ^iDUMOP;ug)/$Wʈ2pIgjuNK^hެ `L5XWMQ(٢KC+ŬzX Wp%""""""P0|c"1)tH9:d֚W" o6_(9\`B+o2[-Dj_gw"""""""pG`PzJ  많Wl00,&3>6f0(R |ȵrpxxbT jZDDDDDDHjRRZ]DDDDDDDD+Z DDDDDDDDk)$vǣ'ʉa&&3&U5W5vp8AaHt bl`: (N.7*mxp`SDDDDDD.=LTgp8q9XfE-Mcj˅Ñ[Uޗ+j7.KoD%SxU.rjVPp%""""""^Vq`U&W5&ב"""""""a8rsqteuCBw$9p|V~Y{NȍѶm[Zhb!*:Ȩ(̙KZz:wNė_ͬP[>"""""""cFR#׎VLF_{-]0ۻ7j`^Tix\5 %!>]bߟVKճgYk.GzͷߡcL W.k\ժiۦ-[ ::ȨH;4}S]FZ;-lwnʑ""""""գgO<ׯ+nۅ\;nnz\6^9y'Mb2UVM,\LH?<}>p7l$'; VY[FPp0f}-og >[&η}G`@ 7&zK}AYySNcm2dfg1ۙ6uz7em+ia+>.'9ݻMIEDDDDDbРA /XPd$>b*M""ݻwr 7 /cN>)fyGxo?իxFVC=k3n'l<}s51v-M@ltmyzɽG<윢#\f }yڜ3Xo^{o5'}QsoL,Zdtx +F|n^sm‡ gPPY]ɯ儵$g_JЦuo@V8x`*nX*'~  c%kΞ}{ΟI;o~UU ݷߠWW#?l6VZU,UZpv~`gw`>\K0lp<ˮ8zt 4{Q9ɞ_׊Sx/EMkhztg$6}y[27;CLJ_X?zƝdsRe){k(ʟQcl9-#ѷ1=a \If|aBs';'ʧԯzi|fiN`Ns܈H0Gc00o@+ԅW^22_~5 VW\(U`s畸{fѕ{QenzL&-_| g饨JIOdX4ymcWd vZr8Ѣ׻$칧u|Зy-""R9!9: +:{-NO^m4=_}C QvKv቎MDrkszLVGb~tƻUx0mi@f~$m!={wӧORWN}襤#\Nss6n'3=m6&WE>} j'DJjJn?W`` 4 c∮ <9sYߒUe}W Wjx[c\K;r2Y&S㡴W$<-[6^x`aQ7KǨUÐE<AŒQWp4 HTJ@v6d`CBo>v8eB|cvx>lݺNDDDDDD.wYYY|w 6@d2qͷЫWo"#b5x àY$ğ$;'>?_?B5$&h>BsJ"x*' O04{!!^<7n niENm"WAN*!OHe.߲E *{ҫWol>MЫWogZ2f|6jć1y|]B5> >G]A%WW ,žcg@3:u#_UMׯs΄6 0Ν:~CLK?fŔ-a;ٝLae_( IDATmw ].[9To#RN&m'q~ޘSg+ } $EqW~ rաi9XoΙdO⌫MuNZzV~=ItܬW*"""""r\.HH>''qyɧxx;k{S%3y[_ ΤocpwQn]ܩ=0o럘x-ΤTlYYך?!n^|ɯa nP9FS~Jvh׮[4<;?X:ĮԢk7+2nohx3yX_,ol)wًqe}pGPq,E km@l3MS{$}[6QaTmۉ3~ѐMI9pˌf]T:gx64 yX]lt6#E'Kx~6bc)P{fyGi׶I=S)bՒhm<|[k_t Q ×x9y0žP| ZYʖGX`) 7ßRq/$.r.`p9.4N\ȼ+ִJ!Hɕ,ه2 #0v˙~P KcXr {|!7%MǏp, ?ÙI-,]XHaFXX.e˖a64h fۍdž=^ ۪5p}旵 ߏ3gRXbGd8ssyj\5jsu+7kP6<#8p|* h۶--[4rkn6oʪ5kpTB{٫W/}YjvZy ?4z-6nܨo//exO&Y!"""""Raڵ硇&::SIyկM7D۶㏈*o7ÄV)7d ˑfϞKVvr<~x87o/kֲbժj;'ObI̘JR~ѼY깜Nr1~8ڶiK6m"2*%--MT"W5bfT oxP%""""""m„fdVpUٴU d2r9q8]U:{ })S?T Ղd0+*(7a`XX]n\nn<'""""""Rۆa`21L͚V^&Lfh=w(JDDDDDDDD+ZּIOUW(^޽["""""""""喚Vc{kMJDDDDDDDD+Z DDDDDDDDk)JDDDDDDDDͼ敩+UY,W""""""""R J`)*u4E'""""""""U/y%""""""""^Kᕈx-W""""""""^҂""""""""R%vQݺu+qF^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^Kᕈx-W""""""""^Rx%""""""""^ˢ.,'֝{uSs_ЦWv툯ڝSkHȈ#X lLVl`}8DDDDDD䲠Jj1Ǚ`))UV='9z`˜h~bάeHɬs:I9FLL6elhV>$""""""4mPj1Ǚ2sNWJIMg99~r1gն<*v~9|ybάEDDDDDD׌:թ ד1vu~zoon"⌢݄0O{;Kou )m{e>t 4Tֈlcg΂%s3⦡kHn|Y"ea?nlǙ|9g:*Zdr,X^B3^+ 8.4OmL(be=;sS;,{uÓ{l%?SYi+r qGI3iٗ`xo5PDDDDDDF^y+|L)*k)+7 > ɬZJp:I=O,m𧼶{WgpPK"ڿ#c7Zh35tur%16iߟڕu툛UdĕQx 2glct:rg& ;x0iVNxAٹ2m2E/lW1hOʬ}_R~v~9숛ODDDDDD+ź/UUS,ps֯:'IDM} G+}Ka"#{ټo?kքǙĆnj)%Vm@&lcLҰE"Xi%2qMWfZ7OH<[wMP㱴4F [iP+Zi8E\z oZC}߭~Hqr9s/p"""""""G78e{Y>nmۙU}~*MNBh9o\8V4Ѿn3k x8='}syʿ26!uNZm?ㅫ^&̋?s>^>0+eU5lvzrٱdInЉ!}l8jn^]~ӱv#73Gu"~tBa35oLSL5Ǟ{}iy,y9*x.9NgyX8ޖFde,!˴ `]|*t7uЪtzOw,'G_bFu iGƇظ󞇈ʨՀ KkTCS9YD߫n!ΰaቂm-X縊aV[%kںƅoq{iHf; *t6B#ÕMR&l _/dd.}LR]fBlfUda/en Aui|ɢ# K%>2a ̿ԡXbEtfpOЏ,Hϟ:͆%[ѿ`k8)939@Euhۢ HZ + qb/ȵu%]+,V[3ۛgˏ|voϬpZz3eǒtׇۯ58{^\JҶbR[ڜ%3i~t=#Gcc m? ؏$C:nf3@׎e!3c="&&+ٌknl)_眇7WY<2TS,o أWo/UNRWM厓|-t^+m'Ι29Vh+`omYŊ~\PuXjf {e׎urjTVn3kS___K/qb7hE#8WvXn'\RS=&Lcf´>˙=WXNrϡ͟n'[PDDDDDDZr_ ֺ>:gcy,(o"⦩㜰ԔW щ%Q6_ӿ19Wּ8fX1s7w.}Tof\E * +OfoNAIN( (%qL9~n3_ߒf flǿն/l`} WU kH0B/0ۆ B}/0+U- a#_= u(7i!Vڜ\wO>χr ͷ>AO z%pI*tlRhWni +,S$ خ&^ه>AˋLܱj)P%'[mZ4 I`i#Rpp-n3/XY~LO}W؎Y~W+1vب\& nZ57`ܘMi;x z^(sMתM*Φ|^C0EԡNHc\~8Q9E6=ҷ2[񩃶+Y9>u0~xWߧeҢY8O;[we_aO*)fQthۂ+v<s5ӏ{}ǎYD&!>#S+6mtke9:hɍdT/X(=Ŷaa"Egr}¡WwݽsnsuCF9WW?gҗG~=~YbLs6M/glLfvۮڑ+SvD\' SYy)MtkFNY)>U)tN ڇoI),oe{qΤQ̬Mwk꾼:ZNDnȭ]޺ZAң'oz]Kl0:s +a`Yqf8똪=kOMej~xuz'm9Q);_,`f$?f`nq5?0OYNK;ޜ{N3qt*9?{~q^XwSl擧_x{ NL8(E>42>j?o/vӹ\73?xo~O˖PN-c+: kٚ}a̐41t'H:[-B)sg0'^d:#-wZh%3_ u!7ܴ @4{NXɑĺ۟.š-,9,t ?NjyDDDDDDDDW)l\uHB}(\YFaat6&=ؽ{Xd߮$Z>ۘ9ծ8*"+!'3{3]<#"""""""ժWx"E7DV!%b#Ӯ61{?& ;^^IIP(72"8uhh?Ӌ_GTT#b I/i#˙=f{n5`,bM`yqyׂޓUĹ=e:OLr*zQkX*2e0EoFDu^z0L"c6Vf5"""""""RmL5҂i|Rd)cV_UDNz ^yw:_ŊY5;u3\]߂+Z<'19' O'?J9S69h̠E6=_wTwT;hLv!P4\[0E `ӉkdMocf0)—Wq(z7[R&קʞ܌@l8p&qh^~SIݹgpUz βfch64dz^Ѭ9Ȓ E6PԪUz;)%.]Iԭ-JT=mmEFU8ɊȂ sYUPD2?{?D﷿.xf ֱ&vb)~7!}O jOﶾܟ]dO!~Y|^-˅o]ͪ"g5¸eצ}&&`oCwrKMaW|,==F\PYgWg3OhWytb[n%͵MAXk"l}ҹ,qeh'UKjSl$fެ,uc[-5lJ|۵ts6ëכzaMd"N ~ Ӯ}o|ht#Lp/a=|3Yd8xZnؘ1xc<>hĔgu -~ Oxf\ݻQ/~[lDw-_A%qE3WԽ#"""""""5jsQ+""""""""Rniiرt =.ּY>mPDDDDDDDD.k DDDDٻ訪ϙI&@h `CATTPDQA^b/{vk+EPAPIfG egddG$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)e^I$I$)eHxUƠfqD7WAoM$I$I8>^Ɓ^e[4m#ߗ$I$Ii"FfrS4p o:ˍm¼%<e*=22[X IDAT,(PA6[VUb:f0{j {֠I~X .U^#,b.q|Y)cʘKl慭ֱu. I`,*"Z?[zf(6k,d>P=rTN㐼tΊ0beS1>}kEC%I$IZ :LYBfU(+AK)ٹNj{3{b^,HBĖbF<)ov'C2(~ g\q|sԘ5h -auVr;)ڌkrըJ ҺG#?4Hp'WpIiϟڂOm%⼷ qהA'5"<,fF<~t3mPm_ywJ$IJl^ލb *jJS^5Kz.D 5N I&;2 ٦cF3Y19DU&hdqaժ詍9V] -,c곚\?=3 m*d-[ŏq5,/fд"ҵ6JgŜb^Aգ@@_I~̩JkV+ NI$I ,aX2jE`vh`(u2V9:"dGCJ4*IØtf!d@@vʗ3rgU"% ȮQV(r㥫"-💥gʒ$Y1E(YVQ7 zy[LRLAnUZde|;9Ÿ;g||aF:ͳD!5Wļ"+H!y߮dt :^I$I$\yU¨{u޿6W Biita4FřOuX{ZUG)s͎qڮ8aQײẒϲRfT^d\ge|0b dumjiP<ո[&]\,J2g.b-I$I$Tpӧ0e9TN fNa-$I$IYy%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$IE]Ͱ{~:p{4Β^ށ#;weiŏ_AY滾N$I$I[4jgVTe/c-#I$I3ƿiEpURk{N?;eU_]uJ!7:x`aI$IJWtYQū.r;칎4^$I$I['lUʈGc2I$IEWExo 5sd`s?/'Na<}?ˋHfՠaHߣ!UW-gplum9[9&+UB힧k_:^VtWFH.I$I&R\\LAAu]QZ5VjcnJVyUĤa,Hi> 'ዯ +m>¬E(+Z #xXY]w`Aq)JˊY2}Cïg$I$m1vi'&N8q":t;!7R y[Bh=838v8=|*|.~G H7ە7xSV'B@x+F?G)Wstڝ~2+Owf ~G. @tgfi֠7ŢPy+v;kiw`U\ٻ}fqqW m?]2ԛ[X4n {K$IթS?ݻӳgO>C:tی7={Rn]>CԩcCn^ҊE>hK3/ ԧ$v2Hi}yɐ*Sddaoe5=R;jCKb4Pl%ˁo$I$m֭wޡSN\/w޹*Q /OV2OkVi]bᔊafd",e%DZ/%Ϗ *Qgwy!|22J$I$Iڢ uA[oE.]~ȑ#9C5*ϜW%ES,E,: OS (fp]p35|Ul6q4xwI$I[`һwoZlСy$ԋ0プx;K~cT"cy[ " vd$I$4iWcP#BRGskĴOy[gyu^-+u $N:GY[ ˫} ]v=lEp=57\us*^&zOoDοl.o)'*$I$IV0~ަ}KZ4oZ*$I$Iwbx%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$Iex%I$IO $I$ItfI$I$)U9lP$I$I)kW^a%I$IA+^ 0\G$I$I_?YfV^aH"lOB-I$I$m5TEFF+mf TX% 8 ]㓅L-F$I$I#ZeAzЭ^Ibh|Wu`YY=)j!Bj!/I$IGY%۔P7RF$qoj; :;K$I$ih\-Be Y*MiͰBV[I$I$mjE(g2X-5Z`S q$I$IҟqS lJ$I$I_6DS $R;*Nu"61C$ITSY +\UKKIƐ$I$ITʆW_.N;}&I$I6 V&>$I$IK$I$)e^I$I$)e^I$I$)e^ǁ$I$oJ)ʷ8W?yn~7yy~̔׮_rl.I$IүH D:&a#ʈLdۥCRs<:}'ܵbK8*b+C~K$jo.dEbl) }>/d֒kH$^yc[ͩ37x$I$HwKQH$dԫ"P+eJI ەɟ'H+N0~nBWI_Œ@Ȕ-=c3KcЇk-/iӃ(QAaA/Nx]}qz6u:tsOd 8x{A|<[~_sO3fLߑ7iKә0M6;ɧpx}*\$I$il߯ujD!/(QWr9'i0p7Y\4' #D3|x>I I3-ZƇ# x,$m=Kђߑ*,Ŝkƶ㬗owzyP?䍥kC!.dܥ{Tg٧#fnA6Hcv9L^:ڞs0U4|pGauX[<҇GUQ+m+b  A#_ō]k A6U|1ӿUۗ5w, 3W4N/c707:g66inގ]k&ț3I_cδl1xI'`{$7Sә Rw7a Uo~DZ>}[E!aMc TN]%Y~hWL\ey:NH0d*bi1ub?ZR_ӧ]4ї>Tӳ9N (I$Iw $M@ӊUT;ph,|_1?=Vض jqem[/ǘd;zjlisOs0 ~mt|}^ܝO݊jrI:`,K4:N(.!y~6m9Ӹvl&ÑOgй&}7ޟuФIY y,j{?ƇX !2y.{uG4Bѧr-اx zp8g@lop5Of;8&w/:ӏlHϸ(Od%gu'˸s阜ǻŐ6םU2.^mƀZAo9>k >䎻o⬴y}Υ<5/)do2Ȼy{. zhæ?Z7P}s7S^ͺװ%I$)e^N#bk։ҵڊUI2nCs^/ ]x_@Qs8W>kOBpedNiWazիŨBgŨO'=aYR?syNq'or _YuѧbQm@:pWFIP{ʽF `'_yҸ|eVt{F>N;s#ʷ߶=ۥ}ʴ!i1=:,g7zm[ʂ2.\#5dF#z܆;>[}':ePQ5"u;!BriaɲA-j׌ⓡ onDKX($Zb3>_XsN_m[$Idx;ɐY+CeB !3y'+Z0nv*UJ߷-g6'j֫ڔ"+WPI,x**j+h8v22lX Gp G>km,fċW{']ʶGVy6^>և\}R Ar&QXxY9 ,&,d{ R nU+̲)Op]y@ v,b,ô5m\&^ygO_phjaIVK.ճUśeJ(xvNXm5I$IJEWSHsVqJN&۵wyPV!0 (v*7nhW <NmS2,ZrSwp4 ™?v֭LZOWȜ&2q0} fM~;?ރnvIGW֦{"`G4 ө]}eۯ~و{"N~A]5Ox" Q2ZeU\=X+ZCޜn^DS!9k`-dS2b(i-jXT><59Oo( )[VHAVC"f7JKɏCimپ>1vywRF6|@PZHA/ai\xy/Z޶-Hd<5' ?>~fȉۓ؁ځOgwpԭP|eճF!mib3>Oޗ-"I$IUa, 5'>*'=Z2n;\$I %I$I $I$I $I$IR6S+L$I$mj)^cQXecI$IM-e6xieYdijC:m+%I$IҦiC0D$I$q^$I$IJYW$I$IJYW$I$IJYR0$ C{B$I$PsvI . $I$I6 *2hWk0ޙK$I$I)#6WaB2]$I$IgI&*M= Io"I$I?IL^K$I$i*{ %I$I $I$I $I$I $I$IlI$IlK4 ~J$I-ԺV 2$I$i & Ð)S&٨QRRb㤘 rsscϽhժuEeU9$I$IBa+3gU*))aΜ9ҋLUr?c$I$I[5G"dgzmػ>@)fq^C I(ZoՆhլ$I$i !dŋЭW)*'7n]`ْ%$Iax%I$I* C8u )lM\$I$I[(CmK`x%I$Iex%I$Iex%I$Iex%I$IR^__7EпY' IJfD.=5+ɵL9 z>>w$I$)^s NAi:к7L<_ߏEL!qs1 VɦMȉϴS!>^9QȌ=;U$I߽3f얗0Β RRmGi4m񇏓h ǝK GPXϽG1!՛^ūmw\N08/hfG˼oygxetJV;s̥grxD?~Vy)~!Ufϳxv+ο gr<ђ]J鮜wP4d[;luI\j' |J<^Iqu7~rgquإ??SJfL-y#z~O>yM?;L3.r5{ 'HGp /Mb=STv]G̀<ȵcn\޿7;̇=s Kh8zvaU,>kAmP4m?3b :}.yYՂ.5;n8 ڟ]ޱW/m"s+ Jr~K ) xnn6Gqم'sD2z6O$I$05\҈nwk?t,ggH[s̉0z8q"kř؍\|ǝ~7,a[r҃_1߆<>2Iաgpߡ_m 3@6lE@Z㹴{ؑɭޗ̚#-Mҡ*BݷsuvQ94;ՊhPF iŜX/w!tɜ%r{s|zZwL^ɘSXAeB٣&.9LZh0:vQI]GG,vW<À'2챱 zty9k9!Uie9.c*2S I$IŀEm )iJxeH :m$>pD(dF#:uٚϏVs漊̤(-ڟjEjNё]8s`;ujsآ[=cܲ_?nYҬ\tT!Ap#c/-%@jY:RLݻy)xYy3n9h\uksתq: BZ,U^~|p>x3\:Vv̘:ocrɨA:4k#{[~ $I$I–;{zdg.o oOJugL( coڄXRRش5.~h|85IvH%EWIjӮsrҩު=܋jEN[O[ͥߕwҟ#N57~O8.N_KL{nhc׈#Cs̠IMNU]gI&M9X*7\qMµD4wz\vw?cn3'U%I$I[i,|cl_ ~þa,4nSԎJ1[txUZ5tiń g2(hՕ#vlMXףȒYLKކ~oKb_Gn%3E5h]KY㧱Z 5hFhBh֖vYMf4U7)9ZqE]0yN-=5I$I_,n/z4xG|V-aGȯܐ MՀOCт k@&bcB,@p?L_iǤ`͠V.9@ć!YCfZD3r8hOJX=x̛Yd;r(ϣ\Scv) .K$ŠQ٧3adU>ỏ8H︚fdcG+^W$I" ѧ{+{a"I gQ-?ӳΤ*;pd {w2_0toʂ0lUHA}!hmÑ%n|j}+b@H<S-I@^~sX~Eء7nGӒɼGGlX=̜qX* NOϞ q0$U_!V.%_4y:\),0s>"{iLرѻkڀ끍l)ښn% ;!}gjre|6G/goV?)#è?iQޕkh"|Tze2!s`9?pN?;,YvۄҔǗ=gT\ftZӲN 7,9kӠl2׃ݷvkP"9ҢF>b-z<=n.xHXX6#Ș%C|v hzph%N1< uM3`p AH0 sh fH%C1[Chh4QǙݺCt v\HkpwFރ+5r+3vM ǭfO 96p!-@HXsKmxmzGqu2:;m,"""""" :_N/\qw_Y;W6EgଁԊg~bKn3v}%%/|3gFFMK!#~2n+g׻<ΐ,Cڵѱf.]w}ߩd"&&0vڳZB_MϘ ˭)""""""o;Q,+GGxCB8tPoDzy{EIZH]DDDDDDׯ VV ȻŶ,8TK+ITK+ITK+ITK+ITK+ITmԙԲ""""""";WN! +5V6(""""""""W""""""""j)y%""""""""W""""""""j)y%""""""""W""""""""j)y%""""""""W""""""""j)y%""""""""W""""""""j)y%""""""""[2O2US/T"3[FO7 (GAvxE37c#Q*:mW|כȕ׼➳yf/H6ʉ{ӟZ)O:;bSMw'Ce}ܑO IDATX_U6ݝB+S}Ycg5ݫs#j8GocOk!Y& VuF.s8Y3Y|٦(^m=_fw_xVϨazCM~~dҡTylnUwxL*wǯ>91N1\VlFl$/c¼W+:\'EDD^õY-r֨IGysQS{)}ldѐM2Nk~{$GEW1nն/EP8F7'O|yG"S"m=|}:ȿtxCm`}(g"ȯCqRDD䵜kJ:m4>:q?_wk96s`肉ׅ$vxf=v`: QfNw\Oy=Π[ m=I_0^MtTp2|y :K>7r)NA80 ~RYR݃Rg{ގЧ1t|n{zPjs~60!p4&n[ά^6z>xcm.g qlt#g{/q ۝޹u:p ]Q0g;V= "3bh~Q`FrxPY}Gm!St,lRYj2>$-[tw.gnp/|J⽥h],sB=$mߎz߷ g?w:٣is c~Qz;%[dvWHvOrmospÄ81gXٷs{)dzV"A>p;+kwaڑ8#S> Ƅ, Hlg@f}XJ~-V'k\_-R!=_M׫{g9( }ѶGnNقҒӋBS~O0z8s;7znO{zl|mp ÂKh %3)70YiƏ'5HScW@Frػ)OA*wΞT=Z}˚`sm֕۝d/TG6|P6/=dL}&,a*Zc6ָ>7kђcb1&Iƾ⵻0kd{|<=wjF?g ?0>ŕ;oϪALy >9X\Ug?:k%R:2O% Y/ Dsv|: f1lGN:t/&.ǬY|^̽_2g,Wu٬ z$s:m{1qu͑ɿq<ƌ&uyc mvَ?#>f5r~ +NRU܂شHۥ(N: nZ5.b[ˏr9`GOu_֦Yg?kv%T8#0RMF~DظpSsV߳&}*8>Yo3 `~QE2}'~F;ߌBVmmѿ7s>}lFlV.pnq9G;*Ye ˶~߭SbVu8;O+3/sGew0v`jjOOƀ);_WS;b-j1TjۻӜ1p>]Xt6m25ۀSϒir68 =v62<5 R7?`\=VEx*]j9r֏:sKOp_؟v#Tnj2G寷?Q6!Sf{| mbnLz}}g$j,6 X{.ϲIt]Nc8lKOjǀh3o/webh۔gcJ܌2v~m^ Q #lkšb'~H.s$7*]U&5~h4} fHPΪYS4: ;qc_2ٝxj32w-EzO~C9;[6_lb _ w/<5KW~s,^n& g#Ww͢x\>u |N;޺ #`լɿwׁ/.˼l>eC| !(>s(Υ&u)Gk+vƪu%[iùmy'sǗ7EFJ$Mn=A׀\W^Tǧ~ͭ#gˉ /ˇ|ל/n޵8ˏ'^<vӧr4V{^gE8YR"5a*wubVZpogӹדqkwq|{чI4'iR_[V1d4HM5%qg8ـU.m'|Z1?Q3+:r50$U=1b{(` j&tؓzQEȵg]<*rd͐>uЗ!f.ɅB-C9roҸeD6`r=R*ovʯN+6)w^*JlϿpvvasm%S~ OMa|ߪ,b>n~LW>pm<1\\)<~SиH~ri.a%LmRoOo we="/Y&ʩ ?NG<Ȝ}>-ʻ16gd vES7=wVcDpE  w>XoOoUɏ+Wklrô('#iUǞ;qέ͛#_VO2AϹY91`X5\6':Az"T3~.3kFnß#SzQ%O6Nw?KL"q`/O8dsgx,G'%LՆ2yVzT '݂iKXfoBJ܆ +vlj]"y}(u0r$o<)y}% ޣ[m̷uHK3%}1BZ;+9uIw3&$،ِZvptŏ|P*?^yiޏ`îև^WPlwf}߸9Sٵ:gU@,`9.>֮.>g/)kT g>|͟l6:_}zaR5.=Jlxmôoc} ǎuKŁS ӖrŐ1ؔǥ3:4M>{nLvY׸;fdz)G >`UںC+}ӑ:w>ĵ _yKbȇ:Ŋ#JDDzgX;X7 J[8q(0)sf`cm } 3F; A( %j(w2"G]xD"2GbIW钼϶y"b}U!Y 1 ?!qw^zj̩# U|W[c߉PtK%O)~K{vI ٛ7ʝ|!nJ꾢բjl.& 3'gdzWpT-d/DIJ:;f$"،E9\> w$ ^sƓٓ=bn҆gO”"k(X\K$1vIR9J%|1|0os5(PZΉKr+!ƶm %Oz:]TGĕN VKv|'qVbY]S^!y*'Y-ƵSOMdTrV_{뚇Ec94Mҧ̆\*_ ?8k壨-v8ej²(D$L+ ƵU eLx,ޗ0ZQT!)I5ڿ6C:W(l/7'8k_$ɐ 6e}+<ߴznOrYng]/@S8?iï;>b}c?}/D,p5x}qZ$Ml0ngO\3Ɨ7:c>(e f_~>FBpϥ%,([rމ9z+Ũ2I;yQPz8Qnp 6A_$S˒3͋: 9dKܷ4iQ-wb]lmIKs()N[(q" %Ęq_3k!$։7~T?]|ߺ[u˶uA1ccm0;:lx2m&fNde'YDXX+/1Ӗn~8z?q8{Ejez$c4/_zmFAR2LpD8|Sn Ǧ'q-i2*S#:V!`2痯@tIr ۴iuq{@:"Kʴyl' ih|QMl}f#4_ܷ0%fk;s$f^m]<%k=rt+!- 8$VdmfXGo=vSf}f?KqkLV~R[Ji-Q&prylmbY&j" tcњi ȪoR@&ܫcl6y'c_CpWha;K cީ 7~6s6䴵KFO#3eF~BkM))o=#gHx M\wIֈ9|/`CJ7\.kC δCŬɽp!/)ِjJ%4O ~d1*u 4?NdIHp4bk< NIcLģm%F#w3?y:ǩk&/Ȼ]+; sN 68gT#q&Wrb-+Q !4;~IQL2;`eFHk>HʞҵJ>~ &f5Vߌ6-[Õs=5ͫBE 2.CTg[;贐U-3?J9%rnx|/Eus8qy4n|q >z%>1jg7;:ovlbz,IDD< &gҸE|ْj%}śW_HZYoqb\~yq׶)3Y'_J2JoBMA$A_Ỗ}:02 [.{΅tf8n ӾϴM(XEDozarqIPDr?8G^%X Y 9{CHSɏuCDd1jkWR+-D>:̷Y w}0E ]"^phH큃=V`exմo#W>Iܱ1bsTw+Ҫ Lj Yⷖ>jgK6cd4q[;y@:y++H|p',y'_FvL4ϚSYq<;sq;pᘭ"MBnl]M33omNO rG`ы?8w] PS2S>gkk0!gHOj%mغU=kd[]V& N?gSZB_ :ʾ Pj.gu\6cW(t=&*Hܴȝ,ٝp=y?lqKrƅ~@)mF }LWjMH1rsego$QH\'Uk " .N70K@$FÕ$C#gkB^""x,lg!>:"8Im3Rh\ښ+װm:-r`DzY%"""X**gU/5nkIӫm'z]ȉ0qT-_v(㶉ޟtdMBD hٟԯ5F!gf2`_a_zq}ؙ{Ȃ1 n'*<g*SrڏXM@>,Zϓ,  IDAT"@.J=/ \UI,[3{Ǜr:11,BcͪNVU{ǁp|Pʛ|ej}E8e,gtoDK ܬ{}?]hLbdO {1o^1Mɽ3 ٭:ep,ơ/5]#־<۔k'TmS2P)>7l>=a/XSN}2Ƒ[_?OT|ejus7_WE?~nS⹊R0v aئϸie߾1,U21M O~zT˖r:1*,Om=\^gަ$soPq;&IgSLuz* ֶ(^ Px,MhP_JG9Fo޼-KT\x,Eya6xqY*۠?Ɉ|J12$']y|TezMZ>#Z=ƈ) HkntFcV e[boY:@TV|CSʮNݢEi2(ú6Y4l3{C}uA/m̩Kݙ&|F_'.M w,ւniy kW9fs0}ֵp"C9ǨsLsjKEy܇ GbȲ&~_2*} sdEy>1TK揭иtMܿo%n{ck{f:C};-"tv.fp# ;=$""bY8::`eeś)8$C=>>>Jx,^49GDVTnͲ„t#v/lOJ9>`P*N\A5Q6}Vi5Zt?߳\Jm"N_ʩݬPr*@"""\V |_ eer)(sT;Q3SfC,,o>~L,~+K9=QB8YX6_gvkyXDJ0=à,.UDDDOEDDDDDDDb6(""""""""(y%""""""""W""""""""j)y%""""""""W""""""""j)yJ "$Jyzvgҳm'`Al*bWԯךb DDDDDDDDR)+兗/wU DDDDDDDDް6ygcf0bP-)O;Op4"`mYۣ7Ѩ-ǹn uI͆6 C , ~6%8Öԕ'vLaԭ2xQǖMTfL^(""""""" oA \ߛ~m*!@l4;]x` ѳWwWL cFNn12[ɐݻѷV^O߷yK*2:v*یu`1EDD6 ƶl{2 16yOh4BU)lw٫N*m.p S~qm?M2q0mQy+!M:O6Ovmi9~3W^nhtdt{ۣlq2M{ˆ2X% %y/Gnt;N| őuˇyS"%? 3֜PIs+\2-u WNtfStߎͤ WQW0f}{3iɫ贕 Mʦu)]4;效ȋj׮m5sEΜ>wj2!44 ,nNݴz$~:QYPDDDDDDDQ,+GGxHpС_R ez[m0e{! Ԋ}dn4 s(y-׶@cTН-P_aO]yGDDDDDDDDR-%DDDDDDDD$RJDDDDDDDDR-%DDDDDDDD$RJDDDDDDDDRw,y͍XEM;9 H3Gq5 -ȻJ^n9Blm=~[6k4u;Ƌ@Y|, ǟ ?ᡷGq(ZиAc 泸 ٪bN½!?$wfzar݈۸Yy |‡6# n9;>n\a661!ut K w#E\Y_-N^ֺqr{An@T*K-8D,b`l?K P_ q|o -0X k0E p H&/؞p79Pntf'@ $'x^>}awpp$\ˈ9צaCSw꺇ύHjN9 -tx|ZacIP3'd!1±X݇+WCkW q2m?r?|'wth(ǧ@0œ86} dǴk"~ 2{U=̵j7ɃU}h9A,B-p5VU.GĂF@EDDDDDD?୽v +j%j"( 37yel _ޮAр7@$|D~YS[ͶO]θNRY6A^?a$qj lظ*LWX{OY,&eyvhύ[2`[Pgaea>898Ox_KnP,N 2JG >XNmw(K{k\TRXXO'zr1v}RͱjNx͖@zb+eLx2,b͉f- /wώ[:m0B)ƵKw֓ g‰u"<?w㮍q8煋HK #9BɄ#pˌ7bvm@,L͸-/^;Ke~L,z.^`r_ޅ`+Xbd,}A DDDDDDDDِ :n@O!Țk=t m`jlʵ;hCzWNP:0b&A ֻE۫3tnC> y0|u<h>\b6&y*qqKmmC߾k_Fڭo@DDDDDDDPvmstK/p7SDLL agYu70e%-#DyxbZ*GX,LA7uRw*Ebxlt}"Qhޞɞq l=v}ۢ _ybY8::`eeś)8$C=>>>Jx,ۻ`;@ N*%LW#ټSϔyvDfs~fV A"4eWLej%(yDt @Rec"B QEDDDDDDD#ޙzO;Qw+)"""""""N$,aO,b [ZuKDDDDDDDX*Wr"/u*e:3d]N^&K 䱿é {0Uzaqi[OdM H`q_2b@ wp'9rYrQY$6{q9MnJ΍4ŪKG V`8dtPw[[τR=X&>qh֜&)=ioaفQ݀#޿I WlYg|sn,V^+3pr9m$:vDwv$&!A`} Lj$GܸD}:iuĂŚѺW""""""""oy*cI|n ZaǦ3i:伶 p7sV[Bcg̷r=x;_dh؝yxȀ\hƔ([!* ,n G}P$Iذ`"VSDDDDDDDyou`ـP#ŷ|\(6 Mlɥ70Ye${Fk,_& Ԅu7b㙐EKܜ|{ؐLXzgk7VdepCzfQw۝ & &y@i=K(Nd˒K\Mtڬd5q'z_4k6y0=wxe{NrHB =Ф+ VŲݵm]*+`CE{) Wuq)g3<}:#Jɪ#!o|Ҡ6 $'BBz6PnsU p5 זPR3i RV%b6:~3?cJ4[a$I$Iҟ.R[=y֤ɯ~TAyjP#%`iQ.5K4#&Uftقa-d֦a{Ws|W[7vUFߠ{%K7n&f)$I$IUԦi8rבz3sz, wf;{cTL|*Uu5M +UjڶOPRoot؛"|>u2*e2)ֆF$I$ITهl *RtJժ?01?sJY(ޜI:pXr5ges]I$I$}-qWo`Bٯ WZ]vEV5WAlwmGFvͬOWnn{6J$I$?{K;r қzk$I$IXH$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I}0 =$I$I;½Obbբ^C^4J Hw^7p[0^A:M>#ay;}JIkցCN93Um$I$I?izB<- e،RO+WI?dn7^$omig'v7Q "{Rq鞰F _,.xCfwӎbEs 'XG2cܹ"ܝE=5 \ #o?3ڜ|}4]sշ_I$Iۥ{^n=-3yE)EY}8u 2 {E$nħ|e_Ksƕ( IM}yZ?wǚ& Êm$ҳeVLGYZ)Hn9ןǐ1b5xm^?m]J]8뚓rW*Z1wm%i5ڻT_2uI$I$Ijbl`ާkU<ݟvͫV>ЃnXVNymS*Mӵ^<%O^аŶ FZT a5,aNaH~ɈAɍi2siu5kI0W: }ۓcv#ZvUoI$I(ڥë\|ŜW9/\Na]x-Z 1u;xw?,^?>=g!p_CIaZv裸}?wxa$fΚ˗-:Wl$I$Ig qbߙeSn.SLtnvZ&$I$I"J$I$Ih we=d[gZI$IĞW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$)~* $I$IG^ύA@lfJK)//$I$I b1 b1?pWHJJ<10 =$I$I~A Vfxq+I$I\ADsϫvt+I$I (13$I$IQK#(I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,ë!ٟZ I$IЃgkL_AdB`(Jܕ7UF=&! rZ4/CO:ݪ{UvJӟKưj/1N1}͝A8}MNV-^Nhϐ.HZOG4J$\1v>MΥO_^s/W>-X0iW ͜wlIߘNMb[=ɈiyyM5~-fXz.?˧U7s}0h~獠Ez p>!]QZ '_^<$I@uҮd bE_2O+~@*|ݕ`%}O湼qe6g#q~ͩ@ kxϒ3#Jk{x,.Izt_9Y%0{laZp!sy1dX\Z{΅Dvr>|[z (ސ6 gT?}~/WfaX=7exK^vWώV63r+1,n8t!PNkX^K"\Uæ$c>39Hp915ضCSYn"ӻdh&IGpK~Œ[6<>u59ճoKy˨sUȂp_0]e5h~N[v9'M!M:B I c+x犫sl)g- ݊sFenA 9ecy|bv[+`7p){<u0m7|CW|PRdOjSlC95#sdN|+C–/x|uʼ5W?o*>N3+!aRXw\Kӎo_¤8160nj*~=総{jt`ڄP0<}p/'DFӻQy“\pX6}p%݆z1[PA$Iډ Y裼YooՐ*kfOi= 01zU2Ͼ ZU&a\3I={dͻsbyby33i_Q\NO/†GqȣiѭK^etI9KHpWՎ^.8V 9L̝ʫ0cOя!t<ijrۧgRȨF@L{w9ɭ8Ȯ4IьCf߁([6k~H/32͏:Pְn!c8ط*A8 !>`:5LQ{2sj $-ҌL5 ;l!x"ghw>I1d/m\Nn)$&`M4MK$$aRk3vr؎_]Ƴ9[;_3fbU7Weϗ){ҧ;AvUı6ΑgnY@rӖB64L|%1z-!klCnMdV-fIiHʆ\?xuJ ܘGϠFRJOgqC%TN^J's_g#MHGsLyTF0+nK֭X{OR_'ohH'm5Irtc6T;u+)TDB&6^ZޤTC{%I~Q 4@SBn7*m.(ȠG߬mTn}f0+9ț}9M28F)v*N}Sش`3޴yfhٵ߳lP\%w5*+{sE5(!glj&!-NIR+m8}mj!T4i.WמrST>H|^:=؇\6.)$lX =5˔gT v!W9)Wf B$)ʒ8 u`Px?o>&MgOyo>|7vWv]rΫ=]#FE!cMs39TʤnE 0of,- ٔق,Nrւu+ڲiXOذ٭iY=Fqq$0{Tc^{o悋fzY?,RhߧՊ0ylZ5o+_Aq8NUqՃ6 |O-rgO@)˞}7>A4$LJ")4sZEvKF?ƭ`B=b$IMa RNN띊jY퇞'Ub>c}NK*O椳eobm&| 6PZ7#(%Yrxc-; y4 !yώ4zq _>Ċ)Mߍ{&?{:Ӟ}p{`H5}F́ToڝcTp&/^FTmهcI[8\r Ժd|BI8K.\]׼K<G]V~$!tXUhtY߮2efnut»xMtv=5hwW7'$Iqys |keIUkNװh3!&=$8%/->Cҩ&UYXNIV_-I?W0p,d…ϔgSZZJ^^>>J~;RьSɜ),!VV`谁tL6Gg X]ٚ.ǜ𾍷q.a۸/XYZȰ`4׿Z>)ĊdzYRҴv "nK懸e$I\1v|!GglS jד9?AoBRILL$60eʔLǎmm5mh$|^u!jgx%I$iGbBI$I$EU%gV鐿!A$IʞW$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$I,+I$I$E$I$I"J$I$I+6jyYI$IԲEsD$I$Ia$I$I,+I$I$E$I$I"J$I$Iex%I$I2$I$IRd^I$I$) $I$IYW$I$IDK igh.YFaa$I\9pӭ{w "i畤fǟgW$I@̙=^w=>ĂH) $4c"H$yoII^TN9A8ٟ.⩜rO ie ?ѻSN~$ݪx~WQV6 gT5o3FV,_n$IUpo?pg<^Ң8/8(5E-[:UqBF0lR~rBvɞW<>N^Kυw<ȿqW{Ʋ Hۯzs:Q6"bɏpsH?Z|N޳wsIFaAE$IW>ddM^,Әfi/^YYق ٭i˭Mv~l捔dH)u e4f7ޫ7ÇuIFu~"{0/D1L`0bTQVCNy< I$I%.˜v =:/ǼreA i჎3/Z Xp5MP}n$ K(zn$^6OAd6P‚ekҠ n+ aj~޸t<:AGιwei1~]2*ٍSGFnHAL2Qج%ͶHլC*-BV2sEڵ: >YMY:{g$I$ .bitw }V3˾~ shՀJ0֫8(_xV#jp3ѨYC-XFQ&4 aق5TZ8[̍K:ҳSN`ފ22[5$V%q GmB2./]]I&N災h:)nk(F1}jzHx UkקAfm<^Z'#ѻI7N({ NfԫլU̮mi]XfM'wkȒeN^HmlAVkf-fmfS~2ײtjld>J~I OCE/CBz-٣l?6>)_\ef,mVm\̅k(j7m6x_v~FKZsC7p|ưXݦ4Hf㘫zߦ$Ic,0b^U@ZZ*b;~ ަ\Lر#ݺM=$ t8&dWrϒR NکeC:h|Yʠ&yΗ;qjFS(sh_v[˙S ĩe?߯ 2bl1O]PoC7i_ΧW̦PU_9/ɔl^7pK)Ұ{hz B#O x7XcwN?+>{;>Zk3R{N)L]atOcUo2wL  bp,j,5{+,j/#d*cGoGKu zb\a+Zp+_'գˡqpT¨7^XD$IҮ/f $EQT&3 5딓"$Jشf#@2䀞4o4)~3CcIٙUpXVZgڧT\:{nz5JR5;fϦ8uǯ?>u(HnL#u' z{LoO `ɍ=I0lIGkoᾳyXJQNKg5vƩ`Џ;CZ5#{y1tN(pΡ0)nYbV|4)Ua<&-Yu۶|J hϽ9ܠ؆dRp=sLv)&gp8-nY 0m A$`u!ub,{ŭu@֗&Ҷk"^{g6U|U@O3~cJ$IS畤h^R+^12\׾%T8o*+Mo>Vy[aO IUKNyP;gnYAE0Pʦ3( x_9ntkN8݃'?\ d ptқ!x~KzZm<`̹B0HA.bWl 7wU:En+zv?j*1uc0-~veb,2 _Dx@Ŭ Bb16'P|\)OԬtX1Ik(]QO'Hʛ= gl`;l+c$Iҟ=$ENyCu'wۋ~֕aX^]YFqLi |ٜ۵v\ Ta{|Km*)u{Ot:uJ@PM!&tA|j]TJiR#:p0G =rQZ0c2pȠ$Ig 80,) Yp!sf唖ϠRx3J38~cѸZ2WۃĂitm_gUiР:Vd0SA}gڼo ? )lPjśXz#y߄$գndʾg 5S;śXn0۰6`vG'=n:_]׵!f^77WxYp_3/xy0|i02/-!ql(~%#Av0W(v?=+x󽅬IʤKDhم:d3n/&nᴿsA+}&;J6yS7ƷUG4(K{doX#zH FʹzBߜn؈s;D}[F&>c0#{7ff>淪vlֲTM]Cu)[s&`k ;Ayc4m+q9=ZW"ʼ?'q:`[ XDp]B(m2cH +ߎG`/L7?B-)Y$)Zu$dbbVxPF(]MK]3~\J(q?ZK/eVڧOlB:9F Rj ,%$fx5EyRE{lMBo5YLbOzeF("O&yFeU=Dbj pYL7`/)օzXVf͚;v,EEEOҧOf͚Ţ""""ߠJD\Vyd#{ݝXXJgL3Ko d>}B1so=xI晗'_zap,[&wkŵ;1yj,_m{{6h(~7~³Z̞=2~xٳZ*g߶"R%Qb@=hW'`3,睰@%S> <ʦ^n2{(sVBa$`m%SYD|f^Z!n3A51p/ޕHANo9v0tÛAU;ߙOi/MaެGP}+[tb̦؂l$ăaUu!^D6}Ftt4̞=Mwb@D\U@?ϫ[jlz*GbY>H<<^JZ,YL\}M=N`U^iI-KX]fٚU-zuyt@`KEm:SX>#ى+X[ Eloo|!]~njmux/NR]FnRSf$a/_gWtM|2uB 5iKrAV3g_wk$qށEDDDD+JD\_۸:xcv|n{)э^W_l"dcWb.]ÄH1 _:jE7 \|uaC=f'45l,Vyg\G.g]W']~'E;UÍ W@^4qPoZĤDq#9o c̤X3 }CnS] ^2QҼ'/>ڇPf8<܋GX6c36gw ޘԟFEDDDD2̒RĄbc.Np:坠ZOwu7!r2MINNk@;moA߉+vkwgݘ{y1їSpOc 9q5Vl6RDDDRoY1˫6B>';';M_lڡ6("r))ڳ7E>U6DDDDDҡW""""""""^H@"7EDDDD W"Rq,+#FN߃*A\I޽2<¶{OnO33?睿eQ|nfp^oFd^wJOib'ִ#A_=}+[c]֗U/̯SDDDDD\+7f29}f(Z%w>pEdF;jf ӎjfcWef5"vx>`l[vyYˬX͆l,6l6ٸKWw!"Ray0؋z'{uK{^<ºe;(ۜۦQ ;Ankaq!fnSIhWvY}!;qYS=^e={j SKmrTgq#҃Y8 &f#FȕyVG{G-@6k׎qd |4ޞoT/nIZN8XaoǼqtvd< %?D ,f{r]'!Kg;E&Wwñ`WSYjRa'>IJvT2=>FѴrMJjyK13tN,) 2?9Ĝ*gTᙛ&3M} DIhKneSs36 K]em{3z$v݃oI.&~€&3@JL=?wU2(;ॳfTȊLI5VME":,\Jژ`?:^˷,RD|Yy`S c] c90|ys|]ŤBlY^UiCgcnV6n"hN4jlxUTEEwf| \. 9&p2n;xNCa !C4L#65ʷi;e'Ӿꃙ?2լ;6kѰ7:3;GW 1б_/Dpsp͟NeZ<:KpxTZ7beϟΟ;~3O*""""""RQC3{,Γ-_rח2P>BAvElH&VcYf'WMZր+i{Fh^LYw|-1mͧuϏd̾]2vљz?գԒd_ηXYTs$R pwgBK>zrKI֩_?٬ AN2}/!OZeFt๸ȫ~OxQ DB>)*v@(m"KI+ekz.烣˕&͛;גĮ]""""""RaL#7c$:O{|Gg,JMܖ.,J6##~.WgLwzN[2Z vxPM$H;8Y-|ZHMOcJԱW{t4M|oe5)y72`{%fU8M !Q'aEWX"FvTw>U1S( wϣ92#;g7j'iʗK-:㷴7T-Glc~Xw/mYBat8=x:~Ec4#'{܀ku`X.EVT]"""""QQQfIIbBq1|eee8NNo':< x}ˆKoY1˫6 w`ǎxMlڡ6(""""""""KED\DQgȺEDDDDDD Sx%"""""""".Kᕈ,W""""""""^ҧ Ѵiӿ JDDDDDDDD\+qY DDDDDDDDeivP7mb/HIN """"/Q`eV*T az^q DDDD NKcú*TW"Ra| IDAT """v.ɑc?cef o=z1X. ?^QD %'6;1 Ƀ%857_! \wcO3 &Dk/fB ?_Ek&{2ܨQ٫3ϚWv ĀZ{z8T vzGF. w_'gI|*|{texu׷oUjA=uB =ߝC6u[Q#"""""rْ㉳5b H{SK$;.&d{K7dw=[3e&L`*9&p͘P4o]'26FN6%L=wpmO'asyoĭ73 NƼ=~D䏺ë#_`Fhtt{hՍ-Isx1!2g_{V+FDDDDD"OI$%.MC+{L>;Ŀ|1c^rgosf:{J  `*E 1!v|4 r0t(5ON`J5L|Zf,e >_̟J-1mz#Ylxe?(~s73z>=zg&KgXsO]1""""""Q4  nB,\O6=ob ~hW~]t ֍Y}`$Q/ LR \r3K(.)_@ 2YSfajU75qLj"%^gݴ-u}΢SU4Lz ccxIM8FHd`~ݨu aJ'9?,nQ%%%nՖDK ,It#$<L/$+yx[7:ΞW 2!g͵Ƴ`ܓnnU%uL[WUV/ŵ;p]p: Jt<>w1r9c][RI }|@ika`=F3&AJFVP]ɉ+&#>s~balLW\3/g{``xUN^3C0! o6 %`0\ ?9L'g`)Jb/2'V>ћv](""""""-+3ä*{ XJjP]`V\|VPe ~ir}i%؄ҔA}_ )xboH8V>־4ad[?Z~΀\=l< ~j!]ᕝx7x7xsBHMy +c>Dy-E9zG#+T^)nɃ/Úu7(o^&AA_!^]/C]_ExTʎr"z+/|%w{IE_^Gù'Ne EC.;[?]0oB&J윷uIN=9{y TK"#(Kf) FٟGڸa'~t53v`YϋCF1i! (-RȬ^ E4%@?;r`ǎG/>vHXt>x' X.;3Á ߝ㬼 R)AZw_|ʌ@:>1AmD p$gv6[9M(m~-:$q>kOC!L߬^[Wrl+=#2[u'-w8'lWbӃ:Cƚ%\ѫlV̘ʒ$'f@cz]߅vIEl.ov0 n.,:>BWt]"""""(a8-)!~Onmɑ,=ٯ)S9rԓ3:g8oPҷ!젧Ff %N *',aa `W-&K*s<)U^Vغm&^}綶v[:le{}M.'@jW@n a<2ÏDDCL9MՄ <Ӯ {S(mNVu9W@jI~HlIͤY;]sCҬX z Q3/?ƑIAܧ+!Emi[|\= NDҝw:GRgy+J#6U"n|;2 la]8qݪ,"""""+qqxk}bcWL|f+!AUpcoV`T':4 \ݥgw;s v3scOv;b ĪW ##f/YX#{Z _'Mj |,{i]NaV+Mۻ")[F<Οi1r~e7S/gJu:D@V^szuwVHB";@d[ڸν&6O;Rzh^LX㧲! ը,gO̊<0 ֩G-wէ}'?Gs;^6W""""")UfpwC[V,) {j,֯Oqr]~u)f= bbOIvwlNs$ >^v8{vRX?2'A1bN<VtxҨI8nEIlܕ]~~F ݻ6-g}b X'j4Ye!J!`;oD}=.yYG@Q<>X͡%`>͆|ƵR?^2p0 JDDDDDJ "pA>l' .nÁo~,EgUv.oɞ=j*r؛Jk@Nj8Ψ)! © cR(l۞ R7 0O^'س%_W"ڌ:teXUJO@0X.s77L:$A`Կ#]rIi ;h&{@ tixע]+1_ǐ6YC7ؖVJ{]HJ5 @:^q"-܀mU zM;g-T]u="J983Zi"739YaWoR |ם\if }Ȓ$'E'[Hs)[/JJ4#-T!zx{* پ+G׭c^s0V֝(IާCb,&p(td9v+[4,[CuLxOo)7qƥܒ̐0z6eRx^kcܸ|Ҕ#{Sp8=v 4Jߍ)?'{r:zHޤ~Uel߈v{f#z^ۨ|>-?S-o['}ɼ3^ZLe< V甝zų-KDDDDD0̒RĄbc.Np:坠ZOwu7!p]l[ko搒T=Drv9|<Sj < II;L<T"""*ȿ@e̿2/Jl6, ?Tv_Ѳe߇U+w* wS8ٝwCm+SFOB|5 ى1cvK;bht<.U<$cgOCkodPwWWד mZkypTOH)7 }ngrso೘B{ fdG_RZʼ+qv"7qxd'HIY)s떍k_-wmqh}o'@ɆBVvЍ kG/l-6aa3|x9/}y&vm"8= Xh `Μ9̛3gYx %"""" jy%"ěVCQǯ][ݴ?|Є* hǃwv.uY1\( vom*c“Yua}1p80:e٤`PD`v4s $`!CڴMXlEGz4Cၳb= hMs7}xs(#z,T~Mq7:<̞Br"sqfpmԭ!aqyI7A˝KM`?^f a1hG#%#eP뷎LLl *_˃rr ӳK`K %Gkq9Rj\ZxMH'>__yP[ _{lf=^hcۼI_M`4Й[cII/U$ϨLݰ*HL̀Uq. %źP/ʬY@ӤVnv'&O Xm/b7t&摘\xVٳg3p@Ə@>}={6VU VD\Vʾ$J ܱly(w|'aG[MfoZe?ª#Ahp5 $L;dzjw?>R,+]S;čc&(R&N%r޻3 "s-nxS;y;)BAx)̛QJoe@ÚnX̟[P͞x .ċf1ψ&::ٳgcN""""{] 2y|V _^H,קi';G7ڋU[+%)×ǩL+9-e L"[ӽ]X\=6/3hlIMgU#g$;q s+0H[ ?䓢ۯ٭WU߼C\]ɔTˈu߭Sʾtʌ@?;*/;ؓ_N(TԜ=?M}W#j+ ?C{nrs8;pZ^6{W?voݎm1%Mdw^ uܹ9@cyz;KAfO.Lz13ҵF?q;눟 jÏ5=jQas ݋f>5?5VZk4:n$5-CAv#bfzB{c-cxK=ܶ~+S2y>JG 畇{fblC\TFTTYRj@\liYYN[&D.Qit:ۇxdfw ڵd IDATg|7^^Le)'}4zN\ME?l6RDDDRoY1˫6B>';'/۲e߇UAKIў. ⩂ȿ \B bc؂@US+*l3Fe!C52 Ե!"""""JD*ѽ)""""W( @bR!rU qy D3 0G%99US蓹?EDDDD\l aZԵ 6nf*E֭g,V !"""".Mᕈ\pN())aՊdeeRTTT0777UC竉SݎŢ""""^u;nǛI&SVZi*HޏÁ^>8vuJD*jՊW+s*Xvv;VuJD* iXV-W"~<4WJD* ׸/EDDDD\+ћeqYx!qY DDDDDDDDe)JDDDDDDDD\+qY DDDDDDDDe)JDDDDDDDD\+qY DDDDDDDDe)JDDDDDDDD\+qY DDDDDDDDe)JD}ADDDDD.) DDDDDDDDe) #F@>g]gc9/f o."crur엤ǶwΊu zkSK+x9z W³pॻ0K?͜yM[Gy5tȟgS DmCϘ`?ߗ;}2oVšXM%"\M!~`uI+$KQ ėkW$"""""GᕈT݈W9G|j25xh7"uƒ|?vOIyX[cDŽa|ʹRGxm`=*}ʝNiA\8gqb_{]Uo!$TQQ(MP(cq: PGqF;PpD "EA#"(EEB=HI70b'9g{a"ۚuĕHWyQY&scX &]_H'8%._Kf~U#{x^~9/7~zw6mC@^zt.pRIry}}e*7}}=Jd^bt"x*tCO$ICAIG\mlMeg&53,F|J޷q](R{>]O c荧` (8Oμ[W$k<8 p3+f(+A|w>̐kN#;+9/חӥ/?ܝʃ?1 0(W$͂TmݎF+&g??z`|yiQ@d1uk!3uWW>BFmOek=fi7T,bÅ !o__⥋ x{ @{H6Ot%}:'iPFGЛ" ^$I!1tE>@AlmzӍ3d࣓XV2 @n3͗x? D`M{יY6CfTݬ 9KZ֢DxwEPؽD^\ޠ'wJR}M`6K+TzjN3rYR\4G6< (C_U8 YU.Mn4߼޿ %IĦ\[)}vO6h@^0c9,M7p~$Pb>X]gzkfkO*"]@bg.I߬|Ԍ@A)tlY8 Ifwaw?/݈Kψcѧ%I$ J:κ;ۂ`eHߞKk3k#ԼByʏ6t2 O%ǏU( Db |Mz8{BU .(&&-@ Gͬ= dD_î.šQD )+WحD,O`O_&dyS @D6Fxt†sW ~ef=OB|L2"ݻ JM̵?K5Oz$ItH $qk6sko0fmzfןq[>u>݌yOTDngWv+S(AbOgom0Y'FEZ^@˒pbW5-99zqvfH4dlořY@Yvfs+Qܗ'M.&A0HMH{{6bOFVic,2JQ3>ADvʮ=5+Kriȳ[b H$I9lPWrهL0yD׌1Mͮe9; i AT8LZJs^K$9)kIϋPUc<GS.OWu<?؆tlZg0Z /]Yx{1Y߳rC~:Ѱ \09NҜصx&ߦdۜ1}Anκ~'^$I~@.]"~Xo<23Y:=qo+.E 9YsO$Iz1M6 DGGu⥥LhjonZ$I$IRex%I$Ib9$7Bu~AI$I7$I$IRex%I$IbJ$I$IŖ$I$I-+I$I$[W$I$I* $I$ITl^I$I$2$I$IRm $I gdYIcHRԬUW\N--#žWs1AHJ2$I:d")byDax%鈙A$ɿ$^I:b6od$INᕤ#&';"H$$+I$I$[W$I$I* $I$ITl^I$I$2$I$IRex%I$IbJRUFCDz,$I$g-*fseν|E$I3WP|ybm-dMD$ICTl$ȌX I$I:N^I*"Q쓨B,$I$6( Ƕb\ t"cg($It畤b':^# dU9"I$I)+INl)SxW5$Iᕤb+ $,$I$ $[%ar UO rH$IqJRUzf!}L6{ꕲ($Itiռs۵Lq'HOmQ$I$8cx% 1$ !I$I% JP",U#!%I$`^I:Np#cH6GmUioIn;pޮH m'q¯!Q#lqw ;my9H$I* $|/N)>t11h<Ӟ%ymHsçgh$r'gEi 3x/yye$Ib9$ \?4#֖̥nٰv3;O$IbJq#?Xo`'L-ؿS-=9䊔رEfл_m]w,>gI24P`$_`f~ZMoݨ {fx b**)<Œ$I~ $$l]aD&f6@Tx:Ĭ)irq@nV<4&.*X7>&v\y_{kه n)|>r sټ"bÓ(Y϶S.N=K=b1%e3[9+Im^ax\ yy~h{GzToݷd=$I$^I}2W{npiM{50l8Tjv i`k&rQoxθ bF.ʒ0!) /,"1q?ˡɅpa:KB8mUw&:?bmK$I9H:D( ~S>Q,۶W˗#q _Sd )M?2ԽNڔz ^F:[P.<=|6}Cָ݇ƽn1!<17gYτWNuuΊlۿ۴O$I$.]D֭] edAyyydff8&tz&@=,B1PFaù^ lcw3xY$II-t 9#Ą6$$MTmѢv:y%IǛ>ԟq L"I$2NH$IN.I$IbJ(T倡{o"FqRE$I" JRY5su(u}36&($It^IR۾[Ȓ,$I$e"b RdF,$I$WG8}UcW$Ibac[1`. Z:wYI$I*y%I@t7G&;perE$I+IdeL S$I$WTD8b7IX I$I* $0@'`9$I$3"J_9uIFpORE$I"6(IEۮez8!.@zn"I$IG$H$YI$I:6(I$Ib˞Wtc[1`.)|rĶ5ɬO y"%I$U&]m[֢6'sbLm x癲99B'ԯC'cK^rK$I:&^I!*D^Vi"\zxΜKMNmQl$rJp_N5ؽs&&S^MN˔sZtqzUYÿϘ(I$I$+I:隅LX/yjY6r?4˙q$.KsNsIfSCڦ$I$,$'YpF )R)RBdEξ!:Uth9/^ד-$IcKц {{Nlߕ VX(O,YH"*TCqTkܔfg֧zt I$e+I:bRֲ!s/IZϢlЍ(&yL2L?t=O`tJ֫ o_gmkѣ@缒$It̳$ff_i\vǟ)e7~LRF}K3U/KFt=vT$IqŞWtf+r+JSrԡ?\z?7C*Ј'E/I$1$&e`nV8;WNFK"I$2$o[2I,$I9$8lʔI$I7+I:hчc_fh:C$IRfx%IGI^ln7GTv1?I8ǒ1 j%.I$BC>e$I=+I*J߇Gn<͟O`E2fy_G^'H(G,fwWz.gk?^BiyǿτDggδĔ=>m*D&rW2vӌۑod >No-?^K㧐\-իAArNz`ѫ<4x"IMywp7jdB&q[$IKR1 _eQz} ym4o?Бڑ$w;[REP*, ]{E.PZeJ \U=I$I JR1luʯXq7b@P(=%ȩGdrW-vzOjΥRprMJygOSؽk&P1kC>{jrZC%I$p2b(*͆PY:wKb g;cyku$}1kqUyVԉNvz_>uOl 3d\2&@ cKYY9x$I$f.]D֭-|Te}呙E!虐'_Řai0kS%IqI-t 9#Ą6$$MTE*-=W/ۢEujJt`*OŢ5ĵhGcB,_J$Iaex%I: 9[ùtkKTF +'37[I$I$dMS$I#+Hҡ ǶI>i(o$I[$o}g?j1$I$7fx%I(@6;&>˩%I$fx%I$IbJ$I$IŖ$I$I-+I$I$[W$I$I* $0+8 .+mW$I$ 0!K!I$I%Hҡ Ƕ79>?~=6uE7w&.`$It $PoJ~L l*?hr&lfkɴ\$Itp,$X?zqe7$I$Is^IHLeT|\bH$Iڏ$ѢǾNu,$I^I!ӆr[E6ch4 _KYlIDATXo+#q󜄣~NROObx iK$I:8$騫49.$I#WtnǓoL`gpn3jl}E;kS%ڱU?_b(6҆L[Cv= ӽ$I+I:D J"-T]P@ݟ1+=Kg'ٱ%mFb;}lIGƴ#V;ՎF73-4lbd{kUe ?cv6ǥGv>6[2g!ˮ2i~bIJGԎ%HJ6I搻j/s՝ÄQ.1ѡL9%:rw?[Owy5\vQO|w&O5w@ZK3ϥmE.` Vf}_[$IұJFf!MϙʔgrIJ&MNX>HAV1 (9c?bJva[,&Ʒ$ޕm?biG) ς8!&wxL@tzL[OLٳӦ2/Hd͸"AZL «xi˷z5X>HNiQ,zO$i6Fꓹ&n_[$Iұ %#gϜ)ߒQ 7qF{z6"';7l`]Cy\Թe10OXUwǐF Jr%7J%31˕,u3;q#)^h$I$%v=zE>L-%eeK 5+pI6DZ4;>գކp(wKO-LB^\٨wAy0Tʔ&@F zII$IK$^g>,gmNaK4܊fTkW֝ErΫluʯXq7b@P(= S/MJZԜKW䚔8{Lcֆ|7C v{ ,ot-oo %IbJ`f*;4ϣr㘕!n ހA7 j} g!Tݮ҄X)|XZoϘqW<+@GIn'iM{/M~ۺ'wO2_X` M拥՜S$It t%ΏnmW$-;-(( //,z~DŽ~RNׇyW f %37 f AO Tø,#Q_I-t 9#Ą6$$MTE*-=W/ۢEujJH{Dz4Lb#Ynqt#jőx $Mƻ&S{ ί5s4ɁhjΫa+IhӜX@LJ'G3ɞ_UFɤi?]ˬAlQصpwsCJ;/+O_I$ItL1CT뉼0$+BED󗇱\{ٙ]!#g#*vu|Gn&׺:㦤)Y!x&3O7Û{p}?qW (:GC|3y< cOṊ ;,l'Z=ijgǰC:qVzev^iNB D"VBS>m,3թU@ wF0titBNMxya'zNG;oNIMO ,:kEJˣغ}%퐗$IT,^IҡH,dšӏX}mpٙ$/d$aMgqN3(f.jX|&5~'sΰޜ4yz,O>Bb=5^@_8s5M^&}s` ɝ5Qv:ŒQO0tXS:?^S+)_ %A.::/`ӂt޳H `o[$IR1e $ݹ_pN㖴iGqg(#)/3 "ܵm) ,_nշnطt@[?rot7v Un^{L|=VbKx$p"iX$O-9sigE$It1,3tfZBnjR%p`ћt*T^.2ٽ+4 <8۽ qj ik&s^\>'nUyg;nx2]5دoSH6!be e+DAע$It,2-u)@3sݥHٵs '7Y\$fJr~Xڝ*k&!/H"zC>S_Cp|P^}Ή|vpΫ9/ѝһ` $?B GV {2U*6};Wٜ?\Th=KsmN*ф{缒$Itl1,n|M9Z4%WXԯ|N96.Be\R-γ370yГTzw[aldŤGm{^J1-jLv{žک3g fcL{u;:RѪע$It, t%Ώnm֯HZv7ZPP@^^Y,  8Ы{#1T,:1O}<RO1zp.2'`x z}}7E$7A:bBl≎&**o3-}hѢv:y%IGKܩgs魸݉I~+o?Ve UoAQZ +I$cx%IGE u)%#G| V~3Y:_њL6}>/ؒ$IT<^IQ&u=\4_-jwwg~rcYI$w Hcw'8u=u3Ky{$IOgD.獾s&4H3,$I$WfƯ4)$IT^IR$IbJJ! G,$I$ev-"6|;Lym/{7e[I$I:ᆟ}m"r5j};+s,$I$ WpW5`mdf~-y"I$I$+IOBŐ$IՁW`x%I)W Ukx%I$IW@8,'i$IJѷSHgۆt+I$I*,$Alv]K!I$IJT^^U$I$IR.~"2:HhoQ$I$رcdB\!I$IbnZZ}NdǎVD$I$IBŊ?on L*V`U$I$ItUX2 {^cǎ>^$I$IGՇ~7|ߍIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/query-params-str-validations/image02.png000066400000000000000000002161021461403617600277170ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwxnv k]z,`CŊϫ"~ڻ +E*EwH B{@ @$x?ϓGv3sΜ18ȑ#=Nt2uTkp!%9`v;B.y 23GRA\.jJDDDDDD4 A`aÆyCB$!!^5$"""""" Ʉq HO )jFDDDDDD.(nHp:YDDDDDD.h&PEEEDDDDDDEDDDDDD.݀˂jl`20"vS*a.,TGZ9Off 7| T1"""""Eh _ Uș`o^՞H`S~w"""""U5[ljJl, 1;]AXDDDDzVTAV~w e ,""""U=Lf՚Hd6wsT=S19GNF^EX ' T_"Ua:Z,"""r^ZtY׷O?4/2/%慄/_#99axtTbb" O>EΝ:O>*YFOqqA~9Y x٬ {BkV`؉ZxB|ymc_Q-f>l35lcV͚>DVVf.g!Q$' VL^^T!-5|pҠqSL26O?nd%3(o-^xamd)“߾My0ӭ^{bܴD⶯g/?gdV/ßBq][^#H֍rȁ2ilw]]=Fn OGW(qĎ'j]0ߙ Zf[lyf![""""RJ~|85l޽{yt̘u}>GJr2V(0: ?(q1Sټ]~nӧbݷ7;1fZ#.ˆqG?}*޵Z\$""""r`GJrZq5ð JLHNJ&F l>>eލ)[7l4u)OfR <3=V_ &?yzcѢkGZ&qKI6M/_aѹSi;udM5^\IWDDDD΍jժC`_\!RP+^Bk?恤&'3a> ŷUgCbڮ?XwYaPc_Lܝg^τ+9gm9t7bĵ'7𘫸"d.N])tm:A'yn"^|=|^ᕗ^&##xzjj*K}xVe.://=wH:uHK%#=Hij>LI޺=ǧdFӏn{(c;s'yo6&-@kk?c9uᐞ##=9eNRxgY<L&bd"7>O>ȣ6x Ww[,f >qW$uVl|d5 ;rߏ? d;=7n(=M;a})3y<#gJ X>Ƿ85%Hq8Z}8kҔpLa&+ /t㤮+2_oB~v`wx;q|uu98]38z /|.?b!,rmgþʔ4zѠAM 2tȡߚ:MC^MO$8u%Gx&Xm)5u=N/:5 /S`dx2v0Ν;s\ui9e=*}ʁnϝ;uQ`/JEDDDV)AZ3Ydfd {ZA*MXb y={ Ej̭ߛ{:Zس/`ʎ%'׃ͦl{+@jw2kMLz^j?m [cJ65c5c^ΐN~lX_q՛a u;Wn; ]ï{╛=V X%RSՙO [ķC%ٖ\w8uqٵ3GS`FXM.a_es; m9; =]}b&\*Zjq\=ZT@X""""" gPU.v{)IEajtj-jt8JJ{v«yrm<E6ܴ4"VaCAt~5#ÊeFow1 /\ ',\St_Uv?]x\Yd[[ad?Hw7J09Ɍ&Q O2A?RADDDDD2k=*[۠3ޙEb|,iݡZ} &N}Lb~~:CxxF+O>dQX/`EF *whL INV&a`Z Ƿh,vaCM+#tCi-#Ӽ5sr)H-e̗ҳ!!xsI\Ƿ/}ʹG>e9oP~EDDD\ԭ."rn \`7jҲɤZ> +""""JfE5&RwC¯Tl"U;wp> Q /jL w[=G/""""RU7&_x o_3[8*I+HU f/ V_Ֆl7;tm>D. ~ؼ}T""""rQ9d f͆K#?\pL~XV;. ۣ'VD..r*35kj%""""""`QP濋@Gnn7iPZhA&X,DDF;"~FVv6w?xVr]}o`@Æ E>mYYY=ѐ><@҃Vcrɭk/|*>{73[Zucz0"""R~taŊgГK,fuLh]s Sbڴ3~x~kc>gobח}z] ڵ ?L#[.D.]qL8=s=#j_C#^1qwr6}ӦO#7?wGmtٙV{DZqYkkutX{A~[5NnK}:&{6sVԽHDDDW0`Ymt^t.k+ /az'0?3oooO?|xp Yaq=/yg}?:LLdc؊ӻWqȖ0eL9Ԣ!! z7 7^{|<.i=K/gӖ͌7J~ 5W_7ŋ/ʓݻ3ws;+}~@6 #\Rֱ $8\z 0 HE{Y/u rbÛz(5k֌={ن" :,"""R)DGӧOM{q<1v5͛ӲeҶMRbb[}vh޼B8m̢ΘYu_-5CkGZ3džl 6l6o -bY.蘇yhdrq!Cnd2orٷz&0d |7iekD߇fi$f_|x=mCg xo,7S?y,={RJôQayrY?OScT}O4;/>FWg`[㛌\{\;oU-+q.%"$3wksƴi@g7q^ު)dt`?ΝeYϏ?ԣmIF>C."ۤU:)?`1S 4KNf_V|OޗӿUCB-~(]于M3pd$nT6)t\ ߏ@ zp0m۶姟0۸$;;)[r1jgxCC`r%_GZU 1uE7D6~,#GȰKhló'~O9sHKeycŁ2m4 _wbz˻qKѿ&ɻVhժU^y%UV쎈(?x"| {.r1mF==ezf붭$3lBb۶oWg} |5響y=񾍱~B>1vo⫃nBIjkq/j {ymk2Q v3ЎF[W}rjw?NgL|‚q&owykexrINvϡlRL7kwn NXmZ:| (ONPj vsx%*CV a%uWoJˆ3qa3=r~/͍ ٶl˳=|]=k,/;Gj\x𡇩YsNnv6{a M&A^ $Ə̌rM{/MZql^k5Z >CCCڨW?3)VQol1׷e{8<6u=c8"^e-O 7#7Nۦ(]yaFTQ=_2\6%pJr 0Z&s7j*ֺuKϘQ?_ZaaO\g6:T}|}٫' .,׮UtRػ7&~DŽߕsP֡ԫǺuk~A8"rC?re־d_1Etp$ًQ}'yTy˿e ":?2eW)W%qo\Xߍ:s`/3BV.]|zh``''z?v˹y_..ꦅir Fڂ}5h濟?E#2HH4r7d5z›៴=n?g8*ON05NE:* Ξt4;4D 뇯3]Q1uC~\ 2235!֯ϊ˘5Hr~ ˯Xbyyye 8VaV^XiG.bbAɟO}D =c5&x~B<]d}_OE_> ܜ?^+6=Q=-}*KN:3gp8N]۷tR<ڶn]!F`L~p2U1\s}0od[t~>^t5Lg|ii=?\EJXڶKy^)ہjĤO@nL}&jT~:#J=8WU/"ܑ IDATRǨMdlK&_=jl,=jNg#eyegC`?MMF;FRoF֯N\N!"""rcgp+.ߗ_~92ZdoGD̈́o9lP޼~Xu &-i>ߤ%͎gxRX.5!<&hǎ[OcQVe)l/2}}g-3reUg=]/Yr͛}zK~^+('&&ҴYS7jȎ]Nlpp0O=8 .bނgOaYBb"M4)6iBBbz%'ps^^~< s%)S9r1遑,p wy/<ο7?c }[pm0R%vز5]@K 3M\r%Zk=~xd:odžkʢ0=|\vѭkڵ=ne?YXvmV+ˆ ]vXyz<QouiȈaZI{_m84n~f.kvbǶHRs**0W aTAÊ5'0BI8Jq0|/>>q}w!LBjBv'-dWu6/̇׭{d3 |'ᛒL: }dE`OOvcEDD..TR`/^ԫW{I)ɤv0ӃEӏ6][}v?p, qD乱F#Cr Ԇǁt*{|<gO3wys'f<bK'g 9.#[F>?|> K^=+,̚5[L}~ݶuk4&N,&̙~p^x9y ?f]19rζRߥ\W%.#4yy/m1vI*\ jL|^ da 'I@ oiN͠:yOQfH 7c lBorbrq>:dcy͊G3tׅ5HTkTElyVN$-H³1jѮ?<~r#Yэo`e5Rs`3='#_˥Jv; ћz;m/.Eu7pJ:0ȏ_#4V^ؓťiӦ$LoOx<-[4i|fi+DL[C= 3~XCW2aV}p3tulsyI[w2a۲0u~gW~#1VFm5ԴdSThZh_"bwQטL&vGD2aw+S4ޜo!Ǘ>{Sa =#>1?H!L9T}hܤ1^ڗk oEz+j6(E4}^|y=}>J ~դQcz!Zho?1#xW{~=؇_/'1[XW =c=̣w=Uy񛘸}7M!pX>SA6):n?jZIAo0C|0wb|9%OɘwbI} Yl?A d(X6ց\yՍ/"ylfl=< U`=W 6pE8Hg*̘YwyE}եI(%3fVDWEfQn]֭c6R nՆa?=ey&>F `N#f1^f>!޸D^.V,Ώ+^?yQ8LFd eSk}4kbP[f 14hTԫ ݻ;hw{YG~gƲfݺ 9*9q5x E:8Hqq{/ЖcѝjJ͇}eei ߣG|Il2"uhܤ ##+?xUV,3]z7]LCDDD*A˖xDFF?ZtaFh(oN-?s""XamubS'xp~yYF qxYԩѯo/YF޽}k 7݄[!>W3 5E-޾嶳ܼ\,]Υ}9s_>R/@\N'voo9Z_ʻ|HwpݧQ8B'jѻOZjEvV -waު߽B1jy@7^RFlYz5g"/#Xn- 0(qqeަgu c` QI?p/7D3囙e$'7ݺҦukr?ajرXE#Ӈ+Wq&x gƳZl6:o/ʦ[E!ǪW `< ,U[^ho9`IK""""URk7yg]BBaW]y%?426z0/;A|pvUT6 äD!5xgh߾I۰qo.iiUfc`r0LXp8 9y<lVs!95Ǟ|:uоMڷo%/[6e6lN||/ f+\PIC֋ȅ;fTi#?Ki㉏篣|1% .ټ1U¡5UHUʾx8Wׄ ¯CjLVo+.W!BW8yjZ <#0`61ԃP1nۅƃG""""RE d2c20T&Lfx.DDDDD"FQQQ97VAvjEDDDDDD.uVՊ2xݮ]x.""""""rQP````6c `8``DEDDDDD ->*nr`((HADDDDDD伷iӦ2/۱cRXDDDDDD. """""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""",""""""r BVP`g숈"11BmJMCme^^ɦٝĜx ˿| auhڏunf ҇CDDDDE.Qm<22+>h>XIz\o2fx܊-_a!3b؟#cq}hT>$""""rQQh`?V)X|oD;eaó~+_A.?lxAy?oQYo'ly2|tlOlݷ9%' g_򟖖 ;njCY!-溫z8 zOv>:v~5y.z ~9}jHŬak2溭6?mqL69f~'nڍpK i,BߧQXHfrV1ה3~ݗY̛H6 snT/ :Axv~3V}e[22Yy{6O)kԸ;NaJ GոAU*wy`Q9kOa[%lWsyٺqUu'Δ?Q> ;R\6OїODDDD2o33xc.*jW]Zr b!1L%b_D6w:AImg펝,Ưnj]TV?&(un2m۷lbs,RIKze&0f0gXfFj>uԮuYO6j`N2+Jݲ\j~]AɶG} Li?=no?|. 8ȴi%17WUu>6.GLxL5h{|NY; Z,sz57K^z 65=纽Dw~r\Qs{otvmժyFEI=j?5r{+SAm%C3^=mn8rIOf9L_GQ0($2Un~veN#^Q"[<ۮyVofb/%x|RsfLxۼ!'4wٷm%e&f5lwҲ:l:>ˀ45b [9tSjhC`j,՛QlH`׌ӗz~{iّ֜3kАp|b1$4Q oYxsqI9|ۤs)F%>Ze,LNZMZuA3YqFwK*u6MW~WF߿sbViiHiHȬa;m=n.v,i4(d}pvP8~')в ][{Si;bHoĠ`Y7qo5e\sqͰiAM8apZOC\NڶY$n| 5n_qLٳ<eϸk%"'UX4O=z5|>&HEgJmEDDDD’/?浩[J8b¼Tm=+z7{9vƃ%[nILvd)|$^(gmf1ݟ=]Z2f]u'U\ywq۽CDf)B2ıhDϼML|c6kJ>?[[OY.Цyidw?&~Wgr^P˿?jsɜR }Rj|X6EDDDDBX~^!x Cڅcg̉9HcާS>q] ~Q~#ѯK[Zdžh֮X#ao篌 n-jq0j%a?Zr`Zvŭ՛zu=.YrWϽǔDב6K.GU'+cK!LV;_}OK6+x@ng̭njXn>ZXKm+q =w8%D7M62*${Y.Ɂ4ǿFYJm HAA4x M;rad緘Z+^5/׷yF (""""  { [2lT:2V4,-=3eIY]3c n[͆|lu]:Ճ\CzfEdtM[mw]?Vݠe%Jt#H^Mm/Mc}w~vv"`rCJZnфK:9aoi!xT_?IKHI8jtr,BmڴُunS˯(oK'{U$yl7Տ9]K~:F2Uq`բ]%¨ u} :~KK+EnƲsenRؚk3J? VWQ>x}3{=ҲYp) mٯl0~n!H D޻^+6, PA&{/GbEł&xᐝ3O IDAT䞧n{sn{ӧctpЀZGcЗ 6 rܳpv𯮚h0g&yQ},g$I$+r67֜Oxa⺟M.,ڴOp|>sgeƂ8s/֞,~&m?fHF,nym=0߫xwm2l6K(.n$IT)CˠO0vȗhZlnUDYU綇^A#6;x{F=9 7NM$.G"? 1xYOc5۷=)~7dR8AyH$IvK7 #%#9Ig2EPX%]f2 uUV!crhvߓ+ !V-r|Ѫ1kD1%3kT>0wvȟjY lTKP4.y{5V3Fmw刦r+-P]ux^u*75$I'Mr坩+1?XηkRa_ׇM @'oZ-9=j|VOe-xGI{uLЌnlzė2bLI$I6?V.{c9_OabѼ~|V9@֞\\|ӗS@rzӞgv=g=ɟ a3u"'tЬĄd2jףa}8tfϭ˳gXB2kԤAtܳp jN:tw]RoM/y-h#I$ z/ř35@3OT$I$Iºl&Mi;O۾vxhI$I%I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$\0ܶ4Z+ʐwpE[8]$ITQ$T[ȧ Y+pC 'ltI$Ixc ]3yqˈ5L.q<atV0?ٿ674JJ5p@u`us׳+IhĂỶRܴ:A1f}&& )I\ֳ=X9vV$pRI1KXDl^-Ҏ az>ZKksgSWpy,J8k-J`" [¬hMaPI$IT*8sRQJ xnj wːSA,Wsb$tNfL _ť =1CNmyE97)lE /Hovd&5ahQr;ێg4\E yiֵ>/׈'FadvP0sW3\VKK`:]A}cȩkbHEETRkău|NI$Iڶp1_..x֮&dѳZ1G#U8A") S-I9Q&P@Nt@La< ~;@Ä+V'hi@]%15ue{5N @@UH][p4II!-`|V$Щs]ȺV'Cit.䫜3Z}',/)I$I tn!#b W= bCda2Xdy !qVƨ_oҏJ ot^"F^3 XPa3ʗS8D͢3yp5O[Cb4jVZNtm& YPV0* e,I$Ipla>Sj3@Rhu8 ʪ8I}aFJbdGZ$iڼ:'[/_SWsmԥ1}Q 4X [C41;v.T7Y::( %QVDCO1J$IngBZ6I. R2pVJpa!+vf.S#ɬ.q osݔ_C[#/5Bpy{zjEEF-~N1eF95iJ:=oL]8a '|Sڔ:)aEq2$sʊ|>ȉqVLeL$:%I$oŲN,\KEXBuɑ)Bq$[ɱ_(úԦ-^>)e:8 r+-R@&{~Hb_k^8;yN rw÷qîv$I*.իӵkW&NM8]RV-.B r UtTĤ>gn!wѱ WqɗpMJ?W.k?`q͘1ӡ4=-Vgyj(fqˎ囝:Fvnզs39/n\=g+K wّڋjCQH DKoI$BO?K.tޝӶm ݻwVZ tyb5c<[EK4M[W+|ƘK*Ln(kM$IoۏC9w}N:mѣ9éY<} ٨ҖH$DR6?VQ9[5\ߢe~'N,k}$Z5Ҡ~=&B^I$I?׬Y^z1|yÇW^?'̴y?_&7o5iITV<7 __qkx몎<}2t([[,I$Kխ[9t޽8p {.Wn] D@gPچ]:{?YbEmLWV bu{⥹_/᝼A<ܟ6\[$Iҿ32,zM޽2pPvM?|=6 7niW7o~F{WG3cKx"oZթ7nY ?_hŵz{ d島8-I$UR 6dذadeeŰa J4V6X@RD!ٗbK7.6q1_@hSq:.1WV8t%Ө`Ut`}u k8jU$s*VPc8>=]M;.+U1JXNnaC52`U,T" ;=3m;ҽ%IJǍ@FBjow?#:s.y\\'AM)pZԞqgD⥵?~ }R$I$U벳4iӦMڷX>mU`I$I$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$Id$I$,I$IX$IW?#GY$IJbN “$I$U6$I$+5x|?K$I* 6wx7^q$IdVUej.ه^_:%^3Bg[7ѧi\7!ߓ.I$M,?'ݚ9NI!"8yq,Fo^۾m ~aT&L*an?VE1Ly\m&ۉ %'gĀX(Jbp GZIMM'6Z/f0= '՚*Y+8w KFvoWbi 3yzÃF>a#`1˿go룘h9A: 'r\,<^;J%ᨬ n==s_/`#ch[,"wyɨ^Z-kä́ >oOfem?sZaٺ᜹ {ߟwG[’yk,֎.;5\MiZȴ/ru7$\A$I mϬ0Ię89A$NOr߇KYJ"H$R WZIpPc\"HN8ZhpY&.VRtz4nHf 0}IfNhV#FY,(MɤEԯU|uDZ:HjhZ9SG~`}er&02^l4W. K@OEێ)D33@ƭأZ 2mDs;ofOKB8fژ^~s$E=#'DJnA\ e]/d^~xv_M@hAl؎D!7g8%]f9+u͜3gؒD";+/ڏqs?;]VMEYVg׆ a,7v*R&˃O~PTF˷寿պGkBfZw5Cr͗ug $I` F*P살[WK԰nIl~*|d~aC'P-bfc 9ddnơ@q\ԣ-wtUv?k}K f }<ٽ̇aK8뮝JjЂC>&$-XgoݸN/ ^dO[e_̇oŲ:r]c8šdzSBc^7p]OpX*$$  ~F욇.`jοiw/לk͜HX%w]~#Εup./?5- s$drRW1{;%,fWoLo:Ücl 1'mRSRu 7P!kl~l6>l-IdFahYՀH(ďmYkf\gCъ1lXos} է"qR;^1 ^[o&;D>un5ٔxbU"TMqFH+J$1yMSkףN|,.ZBǽ;ghSP6ouMeW_ A&9ޏ ۑcY"kPڐ]v3͏V>-2#U~({]V~lkM$_8sP%Lq IDATq>6`],&] 64y\HUe9A|NY_) e?LcOKSkvמߘ91g#CB֣ild%^qCz8r[S82w]3fu/bF_##/3yilx+JB9+ RaꩤrYI~|]|&g?nXd瓓eazMUg9W"%Ҕ>?=8ۊVm~g\~g@l7<{ӽ-TcP8j8o^VHZ>Ԁ'^6$IҶQ^ ̊9 XQ!.+yzD=(D6[A"vHٿ3jb\3tWӑ%G"tYˊiq"͇oh~1& 婏~]ߕtcf"I~t;rkWZd\73j[N;_\49\w|mCƘhyiSؒ/w ͋S&z4`]ōveՅ|:jIz-,88%uZs@E|Բy!ndT8/g/}XR>M3"]v93n Xz8g߿ }]Dkfl| $I6Y'DSye:c&,#Lb-%ymkPeRNMg$R<})q.eK]%P4/ >\vM6q{GNڔ\zIP$8%]9]$r韦S+#`:J`Łp^[=;>ZuiP&E+uădZjR\Ҍ \@a3Mߝ3i/>{\M=N5g>Ȣgqbj@}8yc}UˠQq^s׃m7sݙf2նߓ:-E;I1 Y3\qbYxm''uo++Gn;J VGr^Uwoe^bi3[-比OaI$mc=zKbq̞Ӷb1):G|\T9 0VsEp"HBI󖑷>K[$.)e}CkPT!TJT9sK;F7<77qG\yV?2ȭ}={N迡Exi;u7Ŕy+XSLؙG-x+y)w'{Vv~<..k rfs|s/ Yv% Tو;ۥ?s>Lw:$Iw:哚Bbb"oT.tI&m:mڴ}ӶoXL3yx>`x인MdG\~i? _ҁ*^"$I2c&Găf⛜tsϻ{%I A$I$I`I$I $I$4@Rx$I$YVNW63I$IYHJ*bOTEV#e8K$I2n8J$Iװͪ$I$,I$IX$IJBt I$IҶ13!I$I\9C^)^I$IT^~p</mzI$IRenr?c1/"I$I*{~pX$IT)Tk$I$I `I$IX$I$$I$I`I$I*@$IֲbofX$IV x h)X0[SJ2ԯGU+COZ$I 'COs Ҳ1O(?*e $I"QGWςي‹Û؉mې[0e$IUb1XÑ~zK?,YVzd$I7]_X׷PcY,I$I2K$Id$I$,I$IX$Ip$|s?d|p8{$y8 TՈݏ8zZ%9 >N;§$I~)LVB~ dԂ?;Ҷ7t݁H@If;ϟC*0졹0fIW$Ik' ^}hy0m,b)`6(mGK/Gfc׳MVLՇ㍉sXA2Mw娆ɄGrM`Cxd<\ӏZa=e޺8Uj5c.䆽ٗ\|O'}d_.QI}N/M]Ml=K8ziuwh IuSA9E0::|~/f=ͳ38̦璋9/w sj:s TՈG6\$IڜP7"g\IE=u?|5`r865PRv>h$¹_9xe4 CÉg`WՃCO$ڭyw.%Կ? pD%y*µo: T]Kv| {?O|j=SZ(U&@$K>!yҹ{W XƣD55b|c,FD"羦5q=K?ύǘpH*-M+oxoO+.NX4/ ;tN Hlד.<|&>p7El>k# ˋ~t_n1reqt=}7ֻ@$IZ0u"ġ $vuj0~x0~tP|eǾό) K'0ly$\Lʏ{*ˁ ;_86gU]hupkvd_3L[m2D$Ӻ=4 s]qov|,.ډD(z˸s5ʉ,n|~f2立a,vcO9FSӾ?cݳĚuN-gɓRP3ߕv񀽲eSxe:v~1zZ$Ӱ{MR;cI] Im5٬x$?K{U>;[ ,Mx]xe s NYLCZV|DwBx0`$Ƭ퉞Թ40NL%SeފrrA}siũ-ĽBlF xˣ-_ڔBP&+%w'bJJh,bUQM65άGf(sm$.⇢8;cn4N0w2踹к[[jN9^)4j՚}{!IJ.R7mo- 𿁄eoX>ɊYX6¨ APʚ4Gkڗ9nsׄOzm\`:6'+1 Mp@}٭zޒs:ǛH"?> ?[U튛E:[3~|ʔTz3&&n>S:BuӮVIa/Ӽ{s0apf#` }KFM 㹯db%L$Iڬ:l2+7`f /vk.pߓoDZmnLWk\f~U`mrΟiڙ[7#-KVvU"FQN3c+~MuE0~.k3hK f&-ɇ~aۈyyШRC,Τ NE[%Mqy'LySxq_|O!I^$IR%o'AsC:V:NP'`Z=攮DwnD8wg}ua^!Z/aP8ai+&^)Y2N<5^1Ady>qR bvf2+=0Zz)igd;٩$Whp&wGnjP?&7ftcԐYq5 2H 8M^ٍd1ⳉ_=O8C䎝*v_I$UjHsguKdx+Zќ`7+Ixd Fjɰr9LoL=E0f,͈U%Gu[ 6 } ♞Zz]{qUVlW8A dng5*9oØo]9.J_^\yDo~l߃;8r~< jr/@5 x0FƲh<^qԒӆޒ6F7\);WarOlqOܻ@$I' `"6]%VhЭ)΂B `^gi > ^~Մ//e:W-`pxH.h'z/ř39ӶX"rss="}$I-bz~(|™=8DB&?p-+!--H$m׬`ҤI[N6#o߱|$I$I$,I$IX$I$$I$I`I$Ii)-,&e]V2K$I;ԩ][^wbxM^,I$I h.gaD&ڭKyP)k%I$m ۺ%%CJ$CƔ:[ 6f $I" $߶ -w&Z%-pBD`$IaBb1 o Jb@%I$M!8C!k~r2K$I2\q]eWʴ$IT#I$I2K$Id$I$}3♓$I$.x pܑ$I$RB!&ZR{$I$ pBArM' 0IJ KL4K$IR PB YG 2DbBW$I$U \+- A%~z I$I\  $IK$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$IdxL9=pq73pMlj1_|]|Ogz4μa^oۇ >~׿ϊ-K=9LI$%-Ͼ6g|N;xۯUgΫ_8+xݩ_xZ @Iv~U\߱P$_(a[=8 ԫW;Gq~ 1y,!:p5GK[yqKx7Q{+dٜ*_~0mU{r5sp-[k۶~8yG\wi?>3w?fLq{g JG';%nţzCv>n:xy_fBwqZ, ߺ>/ef|dzu~Gw$͛8%}~1eWqY+ymuwtQ"N 'a7s|Brtw< /<6At&cqyuv ޒ$I餖qQtQyk{GG'y](28 DOmO3v ;E\2ʼn{bl#k~,. lbƝs2f2vuOW&S ٻ8)ٽw\9@P鈽H55%䗨QƮKlh4],HQ@Ezvwpqu)113wnopZOz{t6yp~r@:s+#W&-M7<Ǥ/<Wp^[EN⧭cD(ݩq\#ƊOqG-~zE&6/Nߋg!'w(b2{m1>GIGyt~.IdTg%'yzWZ>u?7I=s ,]xES{(} ֕P:xx7kaq7;+i3fE=Kۑ4rePEee%FMcurg?zw<#R!uuаd.sVV~ܕ<<ډܐJcNb>{+Kw%3t=rc+$.Ç[wLv˙ iMF&+CN=wAr\T?/r1sP|XWb毬%Imq!1vȯ^SKC, c$ImWkj1x\E_L]"uuŘ'F(+0bnE1kԇ,.];^bƥxG>s%>ħ @=N5ye.?$Xh&X###Fޠt3Omsj#O@=K0N|OIncYyw\ v!PB8QnC>saX$i[=4!sWN:+o=)xO؛ W/cOqK#}T7r pc#ZbYs6nu6$RiߗN;{d5o^o '=՜}ҧ9+^#ޒiԅsٯWkFk 66f!YػL :@ӂō/? _s)?Kw\[ACN >M$i :4O,v֌EuuuTVVq4F'$}//\1̧rM'O?$I1F-#UF,#'0eʔ^gϞo 񆵒 ^J$IH$II@RSry0 I`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$i-6j$I^;Zm=ɒ$Is $I$K{f IDAT,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$Id$I$,I$IX$I+imXTa^u<|gT=ů>mNΗzj*˨\K}]9.IN$9=hR$P7̣r bpjo3w{ߊ"2(h݊d"IV`IB)I&:Z}6Gv)EN t$qU5߂ï$}Nm "IM-(ȦN뗅A+vmbK?(%++BHIuU$UQ(H 6X#9fK?@}]#$''{I2oZa,䰎UU^骎$I$m+0ԷmKm/NIf!V$i n Ɵ%}ثV?cprf>$$I7 CϝGښ&ٖx<|BN zh98>o bN]<_p8mK-~͙|EKlayR^x)͙}foBWCNml$iJ$|8:t!$۲qbެ|8wD4;I[%$I|0xd/@N^> @Yi) ,,i;59m'r"m=$~?"\Wx+܂&ߦ/P])ВzISc;^|,ms+w猞m,$I MP՛C$I[S%(RH{>WR3X7A{W5!e!;lf53aӲYmBoW&I$qM{BKxxUgui/?e[\8nYCyꞳأK+ ic'qc@8'GKOᮛNԿpՄ: +I$\>Y?s{wTx&0~:أ?ykwԔeQ$IߛQQZAM<TΚd7#+˳HI@I ! 5f^g%i#U~<`@Ơ9wEsx3Z~/>H;^XY^3Z!~2M'/_ߎzoWm,%7u%|t˾tו}s0$Wk'77dR "Iͯ>1w}Zm:ɳ/=U_qNSwW0g"ck6yJ?auз' φׅfX ]vZ?\t dX-w$/#,אҟ<,އMDf;7;咳9x$/y X5]y&{>fg 9RMu{_%c+eqso"J${Fbڃ;lM -iST>?'Fg ׏]މ"^;"n_ݕ#L|Ss]|^~9} +օ$שsŐ?y9? K#V.W9׺?o8o eY/olɺ_!WLߋ3$cE R)˒~Ӫzw|G8ax4Doo PćŹYuօa䕔׆sv9GFNǡ\w!u;eJyor=J,c~8Fcy龷X ]̂9}5U}PT@уr+HmUO E]'?u<߲V μϼJ$A+]셼~̚6ˏG;s.䈜/*3KF !9t_<1/,c: ƴiPםѳwq:JVLޜ|`v>t*Xs#'|>@l/t;w_Wܛуo;s9C9dA)zy.YM1qj2rc'4t "I$,b-#xhV0*+f_Fg2 h|%ǖMgT_l6Zgd>1oMfRcs}cz]0>7i;ȯ?!wpdӪy x4WX2VTThGx@ȧMA%I$fmQo=ŝfcʫd|Cm} Q1yiZ2;]w5+kOG˙L\'{'{#݋K~?AƼ׸oT^i+6$-5+I$Kږoގn;e1Gl]ө2"怎Lp|{㟩>: x|rCe Rrwf ѵ 4~3YVR:7_feЀ>-; 2'yxY0/$I$ר}Zңk&r*~`3ٿa޽關ټ ӌv'6s"+{99E2&Eqɾ}hGG|'ңO!me`6Z1( cx`v<rfm<6M^찊QHR]U-(hm)]j}$ik :4O,ٳf/H$Ǧ1r6S#81^F %ZDHgƓwp.zcC-O^iOΡ.ߤĪEٛI9O3}V-C 9yM=K7-͚AV~ψbD";[FF-#UFl30eʔ^gϞo )Л5,dOxJ2{qj1ڶ|8>wkOּy$Ans_q۱/IF ѫ/+F2o m͡G'I[+&_xUm3?'5 K؁Sbr}֟s,0>$L<%4x29yt߭;uWx9ԕ0gyw*wGLZAse4^1£{R;Azo5OD?eܫɲbri10ӖT ֈGHk=w9vy\wr$ޝ{^\M߳b`V$۪9E,- ie $IMi,x{\7٥{yKpU zW>kLd J+C8ޕ>_ǝiY@ʊY@l_TEltSR "tϔ$IMlgMj;}i0N.c^~kZPUJ* KYVRG}V>;3Ur:}dfѬHҊtt'@ 9b+R\_M՘IJځ;7P^)I$I+YXTM]~ eMZ>>ܖ>m'/aeyHؾ5_4P}ꗯ ڕ+!N;7/Al2V˒yU$:^_\R0&?ϒ$Id\_AYUjƦ@F+Fw ?;C$j!H~e S[,ZMCV$}<9&R#u/h .;X$I$Q"ѤhV@ֲ(-hISYAC ?ϊSOdvhMty/ y*JVPhPƲj;2?lE>͘EIeѾkWNZ=O767 ڊ5SSYFMZj-$mW,Nrz&D,$70)촀:Xk 0|^kб>Yx0'=vdƸ,SbA yGt>}3޴(IY-hn%+CڴېߚfٯFY6~E)٧ Jmᷢ4 Z"99٢HF34!X 8i*d)lqAXĸ'aكNA_n HmM#Ρ7^"֕C.CYCE"$uo]U| ڊ*oAŐ 9956˷(l÷AJG,ea7)TPZ6Ik2yYх!ZE]eXz,4ɶw whՋXI~͙|EKlayR^x)͙}rX$i3J$|8:t!4oqbެ|8wD4%m$Iڌ0xd/@N^> @Yi) ,,i;˅>o^ٗ+Ϡ3+7(_, S%ʪjɴkyuMî#>Jn4(jG;ߢH2[I?:я/tO˪6 6_w5 zX=I!Z?o$iCNj) -_Q׏OnEL[y/?c[âJ$iqXҏ&Ჹr.XTNc-h}w>OF}s/̾ gf1I$,ikE9|7?I2{ ||<)I~j $I$I`I$I $I$%I$I2K$mRRR(]ɷ6|&I2K$i\Əy%MK?IfI$i3 ѫ/+F2o ͚MG'I[+G%I6s.l߁}NVǓl[dZjž }-%m8555$''[ Ijjj'ӮC'0 ð HFbc1"`I`IۊL)((=TTTI4%%!ѐH46E#"@hI`IۄXz6EA1KFaڵTTTj}PD"Dmx Ѥ$2 ZQWQҥEZIژX [MJRdDH#9;bH$iZI$IX$I$$I$IMKhޣ2lW-mʼ$IXҏ~0dY|XJ0Y}p`I)В6:Λ3 ˋ~-gbޜF$I#6J"`tҕ~{C^^JJཷ;s'}NDQ #IQ JV [H^^>  "Id|1Ͷ܂}QuN$I2K$Id$I$%ixc>H?:[[µ64%~6^,$IX6ь]ь ({ [eWG"<(K$m Ң7&0+wʒk?Э}~ƽPݢ?n5X|\>R_^nw|9w ӬMk2BmM6OTz ?];qv%mxƬ-~z,΁I-=wL l JIS%mu1:iЕV֑g@9׭$$dPu|z  &ph $hg&I5>_$I`IpMXNUI"/y}{2cDj˨* !'`5H'`9%k4(#='T\G.霺~yZNfO$IMS%mUf\I=aP^ާIOѹw'Ry<|4v$-Z~v 1'x{{؈ qⱀ;s9}-Y>dq =~W3$IX6L(Ғ^=Z~Ng;C^@O^y=;qꨩ t -wH}6ta>-Ȝ?ǼvCeH:Q$I`Сa}"d̞5GD"A]]U>6 i+H$/_eQng_|9XH3%Iҏ7j94b)Sl:={O~뗵oW$I$i`$I$%I$I2K$Id-JIinUc _$I 6f?mJJ-PRRcn쏼\ "I$YIKA@^}Y^43g0w u߭$ID(l߁}NVǓ-'ӢU+=d8;$I`I6< IDAT%ӮC'0 l&_&EDc1$I`IUFD"$b1 D#"@hI$!A@$!,I$$$IE$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$IMF%$I$mz$I$i`$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$IB0 gI6 ,$[ $ C/S0sM=u I C g%OZ I&'O߁C(ܩ!ޮ .xs%V~%I/ $,$iayR^x)͙>nGOM]-@I6Ub˯ duI1FżY3qЉh4ja"X OW$IV+'/3X e^I$IMCnAm$I$,I$I2K$Id$I$,I$mC߳$K 5m 33__5u9W->s|V5qͩbދOk1k**hՖYd40{a5_[Zn_ v$mw͗r˨ RisWvUh<>v#? Z(I`IDu OG{Prٱd-=W߁mx`' (kM{Od h`>5nU7 ɡO) ]X-CiLjQƽ5PsI;rBf&n;kX{-(KkhV#gSG $)I9|wU;qrN)yLJyC֭<#|ְ.%:+NCAL>7B :_;EpEܷ#_։wʜcn๣!+nZ5eS᪝ԯ,IՔFaxKma+vB%q9&`aN&w /`f0<{,:ןI),nB~ZMWI~z~{ί.͹yT;L㦰<'8ywpNX/V\x!fųp?ٻ,pbGqIp/?8^8lL;CҷrXVqy+ kK,Vd֜Ы9eZ|39$3BbA)W}TRc7fp@jg?jj [Ait-hN5ڢ ^!Ksg WsEfM)ᦙ5ϩGV9'G%Xb2roɌh}50ȀfOzGC{sѢj[L|oTs|$Uv$sW$SkkkrX.]BOXō hϨs7X?Af]rb@ȢX jy<5mVO;2mo9 aJRSi:,i2D?瘻|$f)jC3۽PIu_>7$^=Z v[B۬ͩf-!ki\jA)M^Ǻ ֩Zzັ}g|[6lfJRҢEPiw7R6x,h пCjN V&i^^/mF N,~Jnkrd;AF`i;03f]Vh1k:4~62 -9`~Q510AYMȌz m2hkkGX@u}8miZni|0kEd`T:FP!>$5%CRF?ɽ/O*C/5W|=Ŏ guU6]vkBjci,b~qڌ ߿m S[]k% KۊdNڒ8R^8q<U)߱9(e4IF:wM%^gQbI֭ӑ\8|2\yLٹbU,d.㿺^K+wr}Y1_?/EZ@b#GE a1ǿ?h%}gKی(ڥ3koBa<~6Fgkzڭ^˕SQŃ2PZKٱS h-|a%#!9Fql$M/1Jn~5)-uupfRHOʘZ M&vӲ_-彵{b,U%2+IMLg]ݗ2`TB3#ۛohmw0g쑿|{Sp9^_2ws[Z?/n8wH.; 'BoY3~M$QYYc|6:HP[WǠǗH6H l5˯(M_N<#ټcQAUL_V^ӧ۷+tX$I}0K$I $I$%I$I2K$Idj$IUHIICfI#aH $IJK?mss-=6: .i|0n- CIҏ{6J)w}xD#MOa?fV1omzC$IOZOIJhew9 jK$IxEv&?R\>-nt5iC$I$66 2}#‹70t@ha^t ,v}0z7SHn~L^ =rEgrPwbasud7U<sםfas+1hujk1IgÁjmzиd GQԚCǎ5%~< ,b䕷nexo$I$m'X\ Rdguyu7LbS>peՇ$}c?+|ڄֶ܃ۛN!t.OQ$),*3"ˉ9U>+Ϸ,7^s*}:: /gة9jg{0E  6I$I$E(e`Yg {,`"Jg-c^Ng4;{1Nlx 6;y- aT-Zu!m:ʫV1mTԉa١EPFmmaЁ{oLOte ?MI;&7 IHW#jҢVEƷh~(["j["d^G"ե~>y<ɽs>sQKteGƫӎr92\2_:J#E,1ITX='9}<~9g}??dfRHrm5cH,K)3p ?naN9?qdnN@?u-"""""9Cy8oۮt,`Ic?0ry"yQO"g#tFoɘ1[>O+1]7z)e˧d)I)[78u;-\pp*Tq,7)?,dyr&]e>S׷b[~h_d~~rtT %ѐN}Q~jt__yz 5TAN\%Ԝ/рfg&_2}VW߾^#[ ~>3/V H,""""""9ҍ}T""""""````````QQQQQQy`P-տ ފ&5%٬%"""""1 XZYaoO"7 `0%֖ """"""h{YNi Z3ۃVnYHK9Nϔ5H"""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""",""""""9s9B98R(Z%j_yeňj9""""""|V$u v@-i^’|0ʟUHN\[bhp1$q_P41f~HU: [7; o} :ShbLj,"""""" Ϙ3A\6XQE݌ ``!|[ٽ -{bgWqXDDDDDD111Oz3v~O^HPO{.vpHSS 6j#"""""" Ϫ<KRœ¹u;|U23?>Klo`%,9}tHs9:hk}3qϏq\"u*)9:Nfxs9$; P 6/[ɪ 4(ac[-?;0f%|_dj""""""!C˖-)if.^@JHNN&66voyֵ۔80XXcQOZꙿ+OXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDVؿKr5cU"""""ܳݣ0m_~ __<#e/ <{VWDDDDDrXϞe/ٷg $'˖fEDDDD$GS.!8$8X5+"""""9rQ qqYєrHQ```ю<.8T"9<.w4Q?|R3ޤlXU{ \VI6uz9_'l3p̺^ԣNǾ 0UWC-Y0I͊2HqŸiJoO_F}0?ԏs>NU f㠦8<}PsKDDX2s<M㛩8ownXҾT'f-#a4jL_7Vºs~T4ݽ83]1"|!~FSO)?"Ozl1в"!Wu-[M\rALqX5Iƭ}Y snPvlUsFO{Ľ.LڌeUʗ,Iir/v2/N}(3Ly%%+`ʉt)`D[˥k,Ck{ɞxwlq{w? xۏ^ bqx5LaYkQf3e`-Z>Fʎj?fCnvXf?cߞg?x>O"LnXwcݮX6?{ "La]M0`$-^"6\6Ee"2y}Gt)YJUJ9f@vn-ټe3{Q-G77~A.<5hE-7Xق^"|7h_XY%mH,^ei~[H3r;/aI\]0G*~e_D>*e҃wƾKsl=[n XꡡAz^ǚw 훵g%V|y9~3R(Ҹ}KDu1WndgHz^-xUal={$ 2|l}g+6kC!R+"\^é۔{ՄbV*@Ƀv2&v GOfUh!ޘ9kVUώHZ8%3'N3 ba{i9sاEU:x V^zkoew[N LS更mene9)̯dS +9_8 [''ӆ;1p&==w'z rH^\SiXڴ15ع!b R :5c'0ح{R@E==xٯ/`o/tOk|=s*5œ8(:۶&$M2 _͋CȑML0}QiOT1cx5&QL;ߓS-7w"G>N:N;L#KOK]+$vj7!\]M#/[8OXC|1z,ڱa+-y@a},-פ _>N&޸0v_\yiSR 4ܫztNd^g IDAT]Luu,LsMsx@Wגe"#=1$F]yQ\޹߮U}-˹8;pay֩Fu `.rQ[>򫄧[a0ל{l˳q]jYS{x#3>ν}6<,c'*4i{[ !]D8WҪ3rˠ 㣻ۤU|aQD.RC/o m " Hr@xaY{ Ō)6d3VXd}A"A]6:U`^CHAiCn > pSFT3[|,o]В9|&/McOJΘ/f۵x ;fCnk`\Xܹ-?0z[~lZgqsBƥСQm/C֤^dǔ;ȶ77ȅs~CX]As}dO7éf C֍FyjtP/ۆpu+ɐnN@86>kE4(PV%ڶŽ,>~Aft 30vC#67Ք ~>oòx n48>y~)sظ7^'iF'7./Zن cg0}{ v^jlzMqoȈwrq`}i_–#r7M3.wdϞϘaxUSf0aO07Μ: N# C~b~ȼ)3XlC6c8׭eM->B؁-,v'AC^p¯t"ToEj *:¡ \G7 P?b?U)~ +K9ty׃W2VDŽ mT>)U12"Ёom ƛc1剕I?ڔL)]D^bc4bg:Fr|\fc9>s4cݾmfd =Mjإo;YWzxe {}$g$lHMd.|%nd;«>=g?jcFay7k 0cU0ړ/Tt04cۏ1o2֙R3^)[2 ?n95C>dv$F{hp#J) yGSS/J톔/QIM\!ߧL< Qm2;6sf^i_Y]xJ5GbQig:*+&eLE?:ƊϏg y&ãy̗ZvĢ,?Q/do "" 4#8s{eb8i6%:8Qƒdf"97_;7o4,MY 8`,ݚexePL$ ^&_0ɭD p7)@2Ft#^z۫{Eݯ<b]MpiTN)>,'&/m^H+y7؛N|ڄN^j<# |*+yQ4e3쭁HbaEpXdഈ`uI|&f, m<;2{}|rg7B; yå'E2k SeIbhɶ Ǖ::oO/5P/YF;}N&#߉V(³Xpև}S,01~ \}ŵ7 q}{hvd`s1f,VR?ޤ̦?1ϊLLƶd=߈(?,̑ǘ@QZ l2b±~q'Qv:=N|T˅RڏoA]FD-F|(0b#08R5s {tQ ;|Li[gyQ$2ݵ_ƣ5ër+26۶ْ~rYSr*ދׇ3;m$sg$m]JХuU]ϴgWf(P$89>;0a yMXav+{ArqC,·a Abq!d"zvD1R/8!yڗJg[ D{ L-Jl/ iyX{ZSsioM_7i ;1fWVpK]}{eqm .8=X1 {bH_@|LFn.@ ZHn8` M*Sv}#,IBn~cf-K#2s@ٙBy p'(k/ᇯc(;'OgC%~ ?$LɨV;n_ QFu/D>~X'0;q,~MtDfu>]ՌY~E0G2G۞7|lfLXP5dN1=bov޽WLdG;G#yz?SDO<=!WA,z&bg9IHD"Y_?d0I\jүM޸}{-F nܽ 9\-/ ANelO{ְjmިٓo'E<&Gf>e>&&"Bi|Ġ;u;ew/RE;b_t ؚFMZwA7o+i:D򖱙Teeqfjy^ p9 Mڤ5M "P=mrN^#Y J OGZOv{RL^trZFLRRIɃF_ļi᧯ն~r" J I6 gZ>V* OavУm5@|>ض$$sbA^hAaO{7wΜW-/hOI+ R>mSKtn{L" P{[Frp {d͙7(_6]Keύ4=KQj?ݿ_=3k)b|ƥ|@]K/[;=q,eyvZ5yT*l*R+m~i,oرx:œ*Csd"cҼ@&Ts8yϐX}yi9HDSmyDxɂ'9brzDK\rmNGc-${c䜩 50hZlgy?ʘa5҆R7ܻ==ҠN+B%qh {/gM%:gJqH9xJOd֡-8"Ql'<?||Ԣ {׺D|eiL ঃyo0{Hv+祹]|w3>z[1]^tFD[w%2>hE6_2v)y@O|=ơG3dBP>]ۇ6% D]71عx-G H7_Ds,W🽆QT5OSN/[~5R|y'l.00kX;ѢLjcd̬jvسy=x\>SIzIJͧN|)̛|'Y9'|~ӟ=(~,7dƲxB~ |;ö$|Nr`Dڴ{1SO1bȶ't-..0LV繙d=jl!Iyh޺3/:X|-Y,##qL>-mûM+EY:kBOW&!'Y1J.xסFbGO.=8*Ѽ@<7Og&`pE?olMa>բR[p/hGi[N dN۲ Zrp^~s_#_iMą^#p5ɛm2Dr+wYUąc˜؞.k{fb+EJ{80{\{Ѫ/Uvbcަ4͸vx/⸳+l,n&X d˘L<8EwMO o)f&ۢ  \(EJV%ٲx.**4نqW^˨ yek'|I;OJPOSޜ5Or\Tv׷0 mtV&3+,=;Ѣz3^3Grğ#IݎޤID^!~_ tg̯ƑQDr=t{,?|T7>x޳Ekpq-wmCS4qٱVIm{vӚZiC~pvw]ծG>`='&?7c^DвeKsJϞWFrr2qm;iq_qy0?gXWyY0k> d/G:}}FZJl8&'?ۚ]Cct'}N:V̚X]g=e=O?O}ַG>cOC3yeDr_V,K߯ݦ$kaoohԯ{`$W{0u˃Cӌ:I[b?.cg|퉈< 3vx$c[~>aU)P+JXr<3,cBHu|='a sH"n-9oj ISm&!""""""9(((((((((((((((((((((((((((((((((((mT""""")\P!լhE9$m^5+"""""9rQ 5jd!*][[{ղ*]ACPVMX=;닏jXDDDDDD} ((((((((@DDDDDDEDDDDDDVN/sZ&/ГV7#&D->?'Pcw -e^i;q}apgf̙1c]2zVs,KmGg)zQ~j@:@2w"`ƏCo^̠ey *)+ѩi>Was\H2SES)x,b̤YKJ.y|{f TZO[-HX9̼@ѳQޒ]0k3o%aQ&>~X9džYx"ի 5!oI+{(J4{ vZZit2<ƄqFOȯ}=xׂ7Yw IDAT~8N|L e@ M\ބb4~-Ggϭ4 Fl>ӥuj%_B˄{&L /jxʇdƏ(ֹ/,ucߦӥUcr$opF7g[ Pү<#怯eg U:QǁDXL2KqhrV-;з~,8k4gr*ՖmZSaɬіX$Gq׫F 0C(b4bCnO=\{w|E'' QCy:7+z]~x ILL2Ƥߘk )Z #iypr|Q؈X `  snNGy>Wfª٤ػSaZ%ǹүG}'aU)ޘMY\DDDDD U?SF#hdH4O|z&CfqEmdp3,(¢P(/ X’ӓe;cFais$T6#&61KlLVZJ/fy1p K6:e8`pcJRv p>zS[2`=[\DDDDD=fCZtC;';( Qny.# 끬×"HE*G=?q40SXosu;{פey9/Š/d/kR瞼KAb]~ UW5,KY,';磑hJx[}y}0z|&;עs侶oݼ p+sf0:DDDDD$0lҜf⅋}iii$''Gv71=db\+FEԊHnS㰷h4baFEG?k}|}R9gXDDDDDDr6`T3Ju/t}FEDDDDDDXDDDDDDDXDDDDDDDXDDDDDD~ցYd)W\#>>V5-"""""=[[{= Us9o^Ǝg~EDDDD$Lj%YƎ}{@rB^ljVDDDDDr4CU""""")M(``QQQQG2Յ&'ɦ.CW/'ݏd \ +ذE=â +sieHU f㠦82HqŸiJoO_F}0? j"""" '_z0Ĕ +Xnu\l!_7q}`LqX5Iƭ\,u>Id* }oL_X5gpΔ٬X^|RM4>V-goW)3ýPf,QKJ>" EWRoϿ%{ݱӪ_2 7U W3ye$wuQZJ(?ˬHC"=[+CĚs|&B?pu%^bP߆ ?8k[6w4-C<Υh=/Ml,#zgppWEr~].=(zwa쫾>3q5ưr"7 :քf|ڬ &n{_~hNߌ4Ffu989$.l]/ڋ=R&-3~I6C4,`Yyp{<Dg^?D.+GyWtΟqo+gZ=VRf"ԥ1~pS!'٩U 9`y2GC>&O:MŻ)~b Ox4Ҳ'tn@xtEg˃v2&v GOfMH*eɛ9#2a>Ҟh4yQ)ɚs$i_dXv)Ћ7q[H"}]iYn^ôAXuqaH-X(x^"4%R\] S{ؾR%Wwx7oy¡|⻏aիei\Վ \iY3cemA&eqJ4ƆZLsڔH^Ÿףw"f̆7/+df&#h~& ݻ7PBdnaWXs yVڱ4e -Ay `HJZuF.@CcHr  GwmIr@xaY{ L k4JRBپ|?&iyB hG,ER4JrSg$>)ۘ2;6՜1FnS2QG- NEFNenc8)7 ߍ_FJlQD֨zZa{8|=Y$.)S)7u/;Bxr#`ϻ%TV'΅zZ]8K>TӧhxkX.ݼ8z<~d+Rƽל X7歑}o>YnjjV|!GYq/5`$_亼3f0i[5#a V.N\1PӋT4: N# C~FT& eҌObo3> \8;C)_"ҳ ^5p` ˇސ6&fm >Ҿ-G~H!of2ߡ?{?c^*U9VM=\<;s L!Y}͒r>ۻ(IP"%t&TQA)D*"H|#MW)"IM2?EQG9ag{w~;nx>>Q}rKw_֨3#Q ÑA4j Osj$Ú+Ri{ϵm^Oe?>]С<{pٚ' dB-Njq|(O>릉4.NELr+'2+"""?`3ۘ[-V\,kE%c rՃ|Tڕ"aՊm9YVYuoHw&~|@  17 tYSoӱF8$mmł0:x|U]ܵjYc5I""""  pdDX>I O^JN&, `5?x]̦߰.4׵[iky֍< oRӀ'ev ֭wyuGӓSp\wu׆+v.. g =]`/Zv;ߙ?_b?':37ϧN|SVܹ2[ eᰓ17=U{&NLr&X3*v?c`sG6W ^C]tv*\O;bǕ>oi-7>Յ{ Y]qmbTgDQX21TN_JZ#} ^Oh8?{\3I׽ Di,]dLnnjvLgYeuOL*Pdq0H' bSHL-l/eɏ (1N7,,P<A\M%յO>ݎP < ";m`͸DDDDoaa=T9.0$\mR)$m9lͪycB}27~Dq;Ǭcܰ7(KNql˶Z.äIG[s1|crUZy0ZU==K Vv-ș-'p _˰)\'"2̇Rbc&ߤN]ofkr(u|w# `رP7{O$Wx<{$ZN#^,(ƛp<.MrdrU q{sp>Ӡ~7}&u@;SyNPy[m|_[ZZmWv69I':F_uUwD @@ Zv0K:Q$byfŞsT-s@TgGnڗ*a|*?1^Az[ _V;f4mҘϣ=4)l?}3L{wQ:66q[vrvB2yN)C{02lOu& 1/(W;ANi^m [uz| hDOG5SpɈ'r6 =J """" !߰eYl RVæ5xMʵ P\O;yk5lCe2?̘?=^@{PSXV_Qs] ֶ\8W&y2wS:?\pӧ'~ƇбA}̹υL*o -4W&>7 I8?ߙ{;%1dLB%;:waP/\s҉߻6v6Uxum:?luG6mY8qR1yGY9m 'qdhϏ3g2ᧂnU﷫MRYn&c,iv p;o~}"d/k7AMZ"9˳'A :}+ {cF`G'ZAlɬC!Ȏ´Oec5z5ON@稣H2!P""""#,,79} E ##λju;Pv9ũ\=:U-ΙV xwOT1}_{N,NׅiDŸ(]߅= ZLWq>ȘcXyw?֎|bMgdMke#v0ebKWAC_ H)Lz&Ah5h(}kyd8,@n#in7~hÝ)ƃ}7⦃f\}^f½u*Iۼ4WOaL>D ֜hg\۶h,iT:aG'`Gp7bM{X*O:>}: GcWpjɼ WqlHpb,g~:k,~okH^–qYlvl8A~ǡ|8u g%D|vFF3K3Hm[Qߝ_XX ܒED%q9DzwW59L̚zj#3?$"""""yF1v+3}ϖ`T/zi/2~rF۱UEih_k%WHߔk/s3Q>oį;-ՓU+z'_ {ae-d\B԰WְZDDDDn;Er)'CM#ݶLx*ym Vo|pٶ\`51h-z SjfͮdﳭcBc_F{}_ⁿ'dddptQ]2[ХRI3m(g15}P$f?VV(qw lH >pHh.6S1D """" q\45ʵX2.k=iL\(UBAd/#&#i+l% 1ї@X5\HIǴKz^=\[o5*DiI"hF;_=H'4(ְgRNtLF`3^-A˿zkgMDkSJ*&ոof9Oq|H0'<-~Kgid"^>,8xYDDDDQ$G]9Fb JZ)S6chxxҥ&.^t΁UqI)ck:]y33ҧ5"1 0qM&qccK~.!Ox?yQ_p(=>EZԭs ŒyuO{٭ 8Qe`'_Rrl7~{yXG}ʦn?Au\g~ 3xpወ[037Lϑ ##λpVڴ.i{4r1!1~ K޼1{0Qx?7Y'N\6?eɦz-tRWSpT|CQ?ޕCy=xD[cs By?J5à]Tb/gZdhrR{??Œ1"""""" b!<3lƵ璒S,Dw,YP ܅ۙ(p9TYp:4Fi*w|dz-,j-H-)c:HJ{-Xm6l)\%LWH!U}FDDDDDRO~K{aL 8"""""" EKI wC'~g-zB6\NO >ydg>gDDDDDDvRd@g. jaIvVyt_UZVvl}^[hśyd3 ,z׺Wǣ7f6#k:15nL{EDDDo'oyHюSV ma!r{r?}\=}M[70}*DDDDDXDԹ -ؓDM*YRr*\;ʐT@|<;'dW=1me|kӝ7%*j]xGc3pI8̂ sU<ul9Kua?@_/?f 'gOa֣O5 FAC[Hr7n%?JqV8B_)j<؇!}C }{Vq,͋r5Qpu9a٘67!qP\FOfJ:mIU Rt_⥂ˮyd k '†2yxGQ8gdԙ?zmr/,@z~8#aĒf<ˇVB_Cp/OJ*`Z-8ر!ڃѵL>W/`Atnǖъwʇc_籀xV^BwyB .\\?fbIџթ.O݉Z:uqN\`:,ݳ"9Z\umo"w}AĒYa~EDDDnw)BMxvuoz |'Lo:JkUvk@y[T_;}Şr> t-Yuk8oGQۘl> lQLv3]lwG2)ڄxe}9bbA nNhnV~Ui&.,mB2^X uuLv3}] k]9˺an_m9Slt -7>GAvT/~VL3wcKsY/_}DßBݲ|&ٙFS60=2c1?8;~IUZ7Ž|?Kæ,"""RDhX4{Kg,ZmcXf̫KM|KnMp ̦ǘ|2ovd+IŇZ#8SR |:ceYw 4M˚lPy_&  &ex7Ne1 2q-^f/nPN߆_|izN47>2!5qЂaɸY͜wvWO°Oqz؞fR0+uhq954`KEuu&" 3sMD|Ӎ<4??AFF&wyU-!r ] 88>||016&yV#"""":oi&6'~RqjZڐ/`륝ǡkX W)BED| lot ͯDDDDEN`/߁pGs_"Ew```[n%RD߷Kr>& UFw鑮B~C#"E{h"#~EDDD`YYDEF2ݽG,RXL """",RũDDDDDELU;(((((BQ7&x 6kU)""""R乨 D<e9C"\*EDDDDEp.G৓q#h +nn2DDDDDXD&7@ vSU!""""rh;õ!o,},ڑJ;FE .9Gf+kJ;@aɅD=uT _@""""rm7}FE@l4T""""r[gWXp(CDDDDnW¯+f?;NgUVKU)""""r[~AkEH,؛ wAڹlUܶ!XXDTEBSEDDDDDDXDVu?nXɦ +[v]EDDD&877TEͥTΌ +ʟ9 5F~Sa5sT<}sTMm˞@U""""rF֭͸K9 )˗hԸ"' {vN^VDDDDDDȅ_o/O~u֭[2""""""Rd|r5hO=7IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/response-model/000077500000000000000000000000001461403617600231505ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/response-model/image01.png000066400000000000000000002246371461403617600251170ustar00rootroot00000000000000PNG  IHDR8$PDsBIT|dtEXtSoftwareShutterc IDATxwxTUI#I:. *{]ZZֵuA*ET$@ :#$$ !!~sϹ9\bƍADDDDDDDD9f̘a6nwpwDDDDDDDDv\|\.-2,[nrwDDDDDDDDڙf0 hݦT"ˍM& fn0LLn7kE!v; <,R`Ϟݘ>UΑG9z$ډ'33t,6EXT0ILLBCCiܸq#qU@FFfV&}|DDDDDDDDFe;RmVZx<3iH vq^d20-̦ p80[X̧&ˉQ?zF;7&.u*a\.'wucǎ>g3g1eL'ת{cGs#-EaՂs9s&Mf V >>d0kfqq8]NvN:EDDDDD9oX0vh&M\V3&Mf,X0(* &Mj.s;/% sc@V 6__칹cDDDDDDx#/>pSv$ e w='/|*,_x\T6Nv$ E,*CmLf" %U2I猶]>sL$ O2Svv.%q= ǹ|Y]zˎ\Ö'"J1f:mֹV^f}_?JN`fƗDRs,vz]h pTvn>ZI7z{q6[+]l5vݯ9]Y$A.kbvNGyqْFyؙ3RPbfOM d׺?=y[e.SWx?>ƛh:.{ERyj2_țq# `ي|ӧWѶ>}zjXQ jDx˥|y`҂;^;gw5 7Jl׆@pN'flڙ 㧜)G9}ccuWa.R<3?uB2%GYX-X|с'L`%ek8GP`c s'|^0z?V,I&}#;ҡS=HL$s7:nI 2mt ߱9xg)ݹwd$9 ^Oג8l&z{}aPoۯLv}SZ9g GRZv,3{}|8C.dWQC5׉Lܐ FYZL]<zcLK, kG<{ΰyь_)/+Ƕhzw%pbzukE5ď[ҿqr~ϲZvC@W ,g\2-CC䡒rCjCbN%wΆ)t`eL"jǮkX%oruWNe;9ʇ_Xl9C}q8;rykOٟ}Vlo|d8eʊ'2OF>Qb4% K,\jժ5X-Vc{ƶ‘UUHXjlђ֣Lfk#ÃK吼v_]{?e|=C``Ywغpk07~+ <^A^6\VP,bvpbFb^4iH$grOY4;yڒzQ2/n?qZwine-aVA2e2 O:;%z9=~b~dcDOl"&uIWV8IDDDDDDL 8ltg؄Q_ Nu 89&;7w_fadD)3lCl=ɝ}oDCqCX(gdCy6.X/] yS]cz?{6PZ\6fX`m?q!ͺ<76dNLC'C_Nb [L8r7 0'xOS.X2&mnw^q}ֹrh,pLF0ïzPoJ\ȡ=ܸʮ1~T+ aس8vh_'RhxY8o ϷmE|2sc:#.?ϿǗ {>«H9Df>؋j)['2硁jkx/]iXy'7[ê/Ѽg?)u%KXdDDDDDD3Zi{޹ju^pK~]Vx{4~Yxe''Wz7HE4o֤zFX-uzרzZ9EN`!L|\eKs VQV9UtY?nNݺڳIȤdVekTmJDDDDDD3U) DDDDDD 4o &zJV{pUeSX%""""""t_fE$r +=\١* ,zIf.=\ZU$*<^a\sV^\=lpᣭ<Ŏ |1%}M_?c*oٳ0[-DjGg|EDDDDDD*G`PzG  많g0łdflՓEjo?v\.nۣb_, EDDDDDċ''xEDDDDDDDī(JDDDDDDDD+*Zy*xۍ'""""""r! d6a615)A<. DDDDDDD*n'N0 3f0AU@U tp9qWi;ǃݐ""""""ry`:#Éb5c(^lV8].* V00Xsܸw8p9]z#*K"noU""""""e.oU{KUeR`u x;5_VDDDDDD"2 G~>n֓,U2ɲnH}9yy{뇏Vgϫ6qh"##i٢99s1a<_mx<9 $6P0bB8l>d5אͪ5k0 ={R+sͯEVaUP/څY-ۧwVݻwg!vۻu{n:~=:oϸ[np`rʽfUPZ36ni,222t k݋(6O.mkL+aUxS,fyyWxbŊr.gCwھ O5a'%>>Ӟ:hroaO0#2z'7=>Vp8/SpZ>vmmU2Dm?^T>kK˴uHZWXfuFʞ\w`lwҮG~$;p;x&x8bv9[VDT?^N+?d4c3?#pz`(GT1o}ڄQb'n~_h}+9F3]S[ 7y7Kn+]͈ZP7 ?-sg9E!\ 0ZA $VuBBر#}LͷcAVfdegm_%L 咎%2e4'QS° ah(?~y9O߯e.O^=YlYߨapSjJ}ܞzf$+aC(];իw+'޽kwP ° PPk> '8y N[ dF2BZlߕX-ќՊN lw^P]K͕ɉ [5@y8.[?ƶ\O-^r(ih"&b Fm`=?͈)l]2>Nߢ|3&4crԢy\7Ip[3&UY"!ѕֻK4>N,-."""""`~Q4(=kɾ}ؼe3fzgcZ $>c*w= GtaA̜M윜*\tU~~~q.|dahjLvn^Ap6npSѝ+=F}|n%%qgnmwNf)ǧԪKmO6dҌ4 YT|Q,"=.[O1H֣U`,K!&Tcdk4&Ǩ…B["0i;gScŁ/:7k#5♬.0{{OXO:*KK>%#s, MDDDDD.}ii|{<#4`齃;Ԭ)0qq= P\_| 9e *zVV|ͤ)_{]_tgEbҷOoa5~bb"-[y޻eCBBxXl9,q8 L&.Rc&7K"?iS qM|7~Ɯs?0(M_eeO=qGU;M9V-hDmO:[>͙8VܐPSsTHg͌p.!_vV6C&Mvq$ˉȥ.''O>{﹏C?|_4L&ѣ'QQ|54` àY$&#7/>?_?B5$6P>\s  J:~IiGGݐVU_74e:+wS{@%$&ҲE2o٢ ?6Mz^bf|eCz0r = dҌR'ԥ' .[NH %ylVnº0y}:ad`ge*~X}ѣ'v/?/wXU3B5g ߿hy75r}>UK}ͷ :GWA%VཡUsǞg_߾9:o5ÆTM׬YMmza(:vb>q>L-}ˮ{/k6ɄumcGf0;^~}Hr]p o.N@K;Bş ?GTnx? IDATcӏ~v-ޓY$rUMK=aa;j5ԄO'Uag '#f ˾Ƽ@wjV9.dg#<<y$8Ή'p;dT:G6#EGMxc˪9A[$ M۶NsDqP5iF=M e˖?ر7SO3f̍KLEFX `M,_ z̆Q4 Dr2BVK_1a<-;'^mU`j04~;|zꉯ_UXIγOqnaܸ[({͊U*ܞloJZ oym>,zfyGhٖW_'驕/Z-iȏOS})Z*<4Ğs)IK翽0{"{ ?g)[~dE*HEd[5>CzX:;38mw>ZbsB[.('N擶h+1*+/=@>KgS 0'w3JO,*ߧ絴X90ZL_ g67ho&"""""5FXXaaaN/^df-n76|{9+|nW}WѯoRSXt)#qsM7e_չѺM[OpMo%=3z|뇏ZaUq8f4l;ذaWQzLf=xgĪիٷ-Z0o?22xwXn<~uHmێ|h~{' W>7xm.o7ÄV)7hXf̘ENnR;~xh7o+Wtj;&gL?X'ѼY 깜N1fh"DҺMbYPz)ѐ+.guH%ѳ'Yر:u? ֖NE違zeX09]eԯV]r뵢MPc""""""dsQg dVUnv:BDDDDDD 0 :>Jx 3LXcQXUԓ8łէ:Bux[fl1}D jŌ择NJDDDDDDEjۄ ͆ɬi%d2rp,]E"9VɌaWrUP`UnRbbXqܸ..7$""""""uD+wfM4%PjGj3L9gU|j fsĦEDDDDDDEp'l ~I%7 aG϶*{< ԧADS"f^t4UΰL׳ggEs3iH~^~9ea3zَ09lvs˹e4;fX)m͜vg:svVlAp蝌l>ژ%};I-;sS=+-;c(xlE)z?#i?w0gk{m8#*|aN 5Nҏ'yxt?LRjs6mu֑Uze`P,'ƿ#6Zl357t%u1lXZ_kחږgiۮRm^bdQ~np+ eGD!MMdw@ZY 0:Ѭ^# m Om|%خapخdx黿#} =u~ylODDDDDD&_O%{ɨ{YwYFuN39*cWUREX=\waV$ 3?i{Jۀ M$̮[ٖna%BKTb̴n2_6&mc޿0;9ƣhi2"$g6Ҡ~ #+638ujھlz~\1O#v/$f'{Dc_?Z~w{hj4ZjcGͰ,56 hO{+ 9jE~WDx[NH=yxPvqV[*gJ68=`TuKl]b6 n֞(J 2Xh]~u??F~6 c|~^ba$o>eթXvg?>Y]VKq KYuA}>u!eb9Y kBXTc e^j>NA%$!ЋL˸Am˜]|6^XмQi[|%'^yyGy6fJX ~ߚ5(u_m0nwDxfɏbѠBi`/%(2\$gBV6)m&e&flss)uقUeA]iiZG 8pS@ ra%:KV4tűdvLP/yq_, YG;{u[_Fl7x.eŶhb$nX֢{ÓŁ'm%e-w&)ÆwqX]7@ X<ԫGT<1~< b17c:v>%nYG\5jX큍M;ž?r=\1ZAuH>0nR?a`/%n FNsu2k~~뽢KV3|do3g+_ ??J /qtxy#8WtPcY zHO·SJL.aoKJSO|O'_mfۙ_J;)G>dґK=6.k\6r.[Tt>Y{!Ԯ&%)a`@/Geҷ3/gƑC-jl`Fu;l~ߨf 7xXKA,ԝ-0c?|ŔWi۫eҢY8wbw/違fQl]:ud=~dktVP違x~f ٠5U""""""rʓc"P>'S[gf2O:M-1 )Xڙ?}bُ&="Jw zǜ<逝N[Pi(fNgyrӈO8vv#?ԄXV)<@FD_&t'}UWz_ko<% u"cԻ@9C \t=Ozg^0ue:tG*-7sm˙k1u`=>/W{Yx0p:U)O-X,թOX}5#ODDDDDDDJuUΰ̅/6k3%9"yK(ӹv߾3mfnɞ1—֗aԵtOP&R'Ԍ@l8p&dz.~[ ]{pUz²`P64z^֬µ %6PЪU|%~-z%-ZF--zT7%%FO8ɉļ ׳ĞwY]TD ;xDwCx ֥%nJ6<=nB=g>!0=#}Y'f`?AZ ߴ'%iؙ-1M7z՛Al^lwRKM aqW|=՟F\P>^^@s?VΈChWytd;o~5Me@]GBlzө<vEh'NjS#]Sd,~s[-5lJp5ts2דyf2*Liۮ'Dy>4a&Kh^v8JbjY΂Eڭ?6&ek Ĩ>8s;㉍9:Jbŏ:! oьz6*2gSrMۻ]i0DfF6m=Q{""""""""rQ<5y&5pJ\XWQ`%""""""""^ExV""""""""UXWQ`%""""""""^ExV"}GGU& dB:!!: "Vꮺ꺖u]]{ "HPD@BF&G0 H$I@1XI$I$)P0X1/ri"C`y?3K$I$mw( $h./I$IFՖUmUKʸbJ>iז\- rk Se%1uLn1ή*ya65\{r}SY8 j=rȡ9SKlr+Pʹ[38+ٯ$quLc1%y絅<޽-t_ߵ^+_ Zgs-3J|B%E@# IDAT]j**('-ᐒN~Es18Cs#$I$iDӛ[PCێH恑+W;ʐ,'! Uk%/OwV0YʟN<9}Jy:oϓɣOBE%7aC:)E-|PN @4DZj#Gw_ .{ouc?zvf)y略uPZ_<ö sRQ8NmRXuS<#%I$IfU-.I2m VTv2[4^e2y-]*kARHoUL)O0j{S,D٫W:es+YDB2T(,LBfwҎr#@;2{ytH!ڢ+0{>MjjUՌ[EI]rAUdtʊ!rd5|T^4}),LxFJ$I^\XQ(aa=U09#䥆(i7uɎ$)mM=_L\^Sh5Y @5< رܻ0Κk֩oE´׮ w㱚q wcO.f4B~$µӶG Qm>K$I$U*L'@jD=e$DB@Қ$9 k9yՉ[J NxyomkfKB<}tzFB$g,Ͽ~|iMhH5dD0su|Ys/)x6+ ʠ!Z%(I!8%I$I}$W0TP +.gĪmhi^]ت͈;+B-(t5&@=s^ʌm#!Y󟭡 V2<3mV5--1LJ~E8K SS!O.Jx<$)QTv2XI$I$}&aUB =ef_ .]~$FkPK~ JAxC@\ 7'x%uQbv{堌P}zE $I$IC?7’m*D%92$I$IsXUۋS>32ikϮoᐫǰ,o/nlvI$I;XVnrv_ǍFyȣ&I$I6.oJwWWOI=d$I$ḭb+OshCvߎN=c~#Y=q403tU9b[=voCgμ:N7u8kPŒ7+4w1+jIݾ+ >3ޚVns_ߠ4+八n0$fMJ~M$J_1&I8-I$IRTWWS^^NAAz}II m6c̰ۯ[_fUTAv5˦]] H^Q7/~4/˪/#G=U?iV1os xu|VAm]51%GI$Ip lL>'vӇoqOڗg_;!)ewξne/M5*Gy/Ϧ<uU<}:뻯])$ 0OĿ^P=m;ʒ$L`l:fu8n=j}h"|e^J$I+((Fzq3dȐܵ6faUFѪ[ˋt( x` X0+w=1{i=l٠Z~af6,_O QG$I$i^{Amݾcr衇Ҳe6VAװbIQb}N,}oۄf=wSWr0|rÂkb,]6$I$IhղeK ;;Ð!C6XAaN,iW~9ɔJP ԇZswrv??ǧ6/ꆍևZ3phXU,YZR %WS^\|Q$I$m 9r$ :CoZ+*TH.7'kĞSy/6=ۦaFUjȪu_.7_v-]7>1Y?گNYnd7'fT5LYZƼ5"ޘ|Q_HUI%I$IHoߞQFO~~>F2VEc;mƾ’VL?JՑ{e}<,4ԑܞo@yc)7q.GYW}qچNǎBia!w$<4+ŗ;0C+uI0%]GrH0_{{>( I.?`cq#7d_紝o8r'\(#830)9☧C+۷q? yΛ9yl%9i?Pڎ~kzQGpr'ْ$I$m$rU`E:/[KB4=v};;!k3CuVAhN N>hB, )ٴj> (f6|_.߉GGr=W0t>|y{u cyCسc.QNzu1#P /{ο8iid݂~3=%I$IF+eYHH$I$It۪Gϝ;ufXI$I$isb$I$IR$I$I(+I$I$J$I$Ib$I$IR$I$I(+I$I$J$I$Ib$I$IR$I$I(+I$I$J$I$Ib$I$IR$I$I(Ѧx~K$I$ԞԤ?$I$IK%I$I(M2*LgI$I$5P(ޟ¯Sd;$I$I4B7{SgX%IuuukFȒ$I$Iү  F#D"(HIgYj꫙TDx<βx/WUx3D$I$ LaH JX&XH$4,_:+]v*N{ѱYg$I$IRYf%Vアw?lpͲU%V/WfǬBNjJ$I$ulIg6XDInՂW%xyo/\9ܟ]` 4z"jp3o'Q2[u'r.M2$I-Ն/Os}2 $aQ-Ѽ+WнX-Nd"@}]nO-{K7=xrPd{Z6e1himIJ޹TiI@flSX>:S;ro!uTn>I4U}M|c.pW ]ƽ=O)'< KgYL[P[b1Grvy{lcrHr%;QH&_NM(]?jOP.Me OU1Wq.+G+"EL{!ZV7Nv(wx+wcیFuTt-rlqJ~nD6$IMjY鍷ׯh ҎC Ngx̵|bu岜V%+*_1^^Fony;rky\LG:#)'I.S)K~C|-i\Eu3[=#wԕ3%"޺)Fݍ5$I`ĺr]\޲|iPc '0Gwr|A7hv۲M6QEEEJY>YJN 2Z: ,zkO_F}٥v٩qdu= \6Ȋ9}hNpﱻ7n#I:[&2 o:šs,D(/ө#%Dt8|oz> ixX, h]WڼXo?ƚN[XޝЂ]L;ˁ%oΗw6 <75EGt|cUQ/RikGJ(,gС[ $C <7=39iynlۣ/^GfW~(²SyTҫmFPy@jg͢[ۈ+YdGMxk<=f`wFF:YJ(VQs3N)YUY˒;.䤻~F<ւI"sSWA-wcaUMɌgY8s87 ҆dV:PG>p%ǯoz;`1~ҬӠ?{:փ.~K%iq?0#Y}Y4oNSo]٬[~:B4_|=mr!YgJQIHCCC!\Swc?^,ݱcUu]<өHBn+˨#Hdu`SdS~4vZW?m$ITa`C]t=;鱆XoZMſ>1]vC>Qb&o'6\9ƬdE)d4)Z Es[#el>dj}ϩg~ -,c/z䄉$ڳ(i|uɣwĜ_ϪI= q5Sfē'I~ֹyM2Ԟ}Z0wo(GU;DZ8+Զj IDATCXpMo0xkKnd=S=;Ȓ$!(~Inzc=ٕ1˹"jHa!]-kC$I,ΰ 9?zo93DKҜ8'^:)m;үy>QQU&p×_0&=IVfOa) '  q 86 9K,>%qs&I$IA-[v랜g7J>NsZM}(XS*ǠE:&uoX=%S!%#fnk`Hi͛$Z߱>5o{gq_*eGqce)m{r Cr3 ,CYE,.JVA;z g}|Ezf_:V#8j<MS.uR9?S]$I$icjCv?233F mգΝ:8crg<#=BUfpxۇkuնىssp̥}8G9F=~ZXzH>O1X%I$IJd3>0F|t_~/z(%I$IruI$I$J$I$Ib$I$IR*XDR<"$I$I*X#I$I_Z%; "f&xt{frF I$IՃU(ri\ڡ?z\$I$I_K$I$)P~` B La$I$IR,X9 jFҼ3V,$I$I wsPN'HF_}U$aHfWƗȲδ$I$Ijb ֬epڒH$Ҥ3~EfXEiT>2 I$I&205r:qSaZ2FGCF"bl~'f"L4W$I$I{_qD"DVMM1Hp8L2l'I$IUZ_S/ *I$InTH$I$)X$I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I%To\ti %TUU{$$I$IHzz-hݺ%XOxMC6tݢii$I$IM+`DvݹoG& VKС]:o!I$I2h0h:vhۤ$kX I$I y6~4I2@I$IHK Z~K$I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I%qfE&TA$-=uPobT޿cSn?/?$I$Ḭ۸7`rNJV|x^#)I$I Pr#}I-Q +Wp|/^s/[q}y<%I$IFr ~KJJ$=-mxI JZvzvx)MAש*\q=+̥ZKyrxfQ҂ރ8ȽjjrW#o|LZuڞ%O-4]>? VMS/|R*iFNm9ػ}]ʴO>g*,AGfK$Ix1b[oOz3$0+KAXüo䶧G1abV&4F %2o:wȯO+:ۍNٻgV(HڥxZ`͇qͽo2${",i=V|hGx`RVrխǸВtڷ͠/yK t׫L,U 2ճ0. Բ۹cdƶ`=`Y3c4r?fK$I;3`ʔ))SpвeK8Mv|?*j>;gvu1 h3ZvٖAZBS_cؗ5$R⨋ePvG1}6vc׵MYyxKnI|ޝJxk$VCN;JN+̢C;5m8;r=*g>\t1l͓+:k%GΧdi%mznK^q֤UL{P61'رg)[dS9[3/GDKIH -I$IF*//_ߟ3bz2e #FɎF--e?sZĒ5kX>k<gьyTkovq5n~kbp7lrU|2k mпBf~L}+W6IAz:HUvZVUA>=B@&;[}W(ᖝ~ %]FQ)pھ=h][z+~^"'Z[UĜ97c7 >{l%I$I;駟f`y䑴nzU,]zY^zauNb-h֝INeꆋB_ /K \>#] @5bm~~mMPgB%,N>ޕEL}ct۟N8SwjԱz*%I$IڄӺuk8Fѣ9#cUasUgX;#GM9+u_9LK!QV5u@3>IHn7!xh.^wsf|'%{k*OZy |65K:i.[0^lEg}dY!ZRY2uv97gd.%֎AfOO0#ur>[EL]NPs10'E~8ȣ;/ ?7X:1(y5.Ƙ:L3n9>]:ԧ^bg3d;!G2]bI$I6A۷gȑ~9rU-uO_M츽g$I$Iz'n;m?wa@I$IES { H$I$)H V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)PMc>K$I$L$i}h`5`]=$I$I潱5>xI$I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P V$I$I $I$I`%I$I@1XI$I$)P҇I$P__O2J$IMN("J$$?&3ê*J$I$m$D*6ϸx<+I$I6+jdU}}g$I$Iڬl=d V^(I$I67j[%I$I(+I$I$J$I$Ib$I$IR$I$I(+I$I$J$I$Ib$I$IR$I$I(+I$I$J$I$Ib$I$IR$I$I(+I$I$J$I$Ib$I$IR$I$I(+I$I$J$I$Ib$I$IR$I$I(+I$I$J$I$Iu/R>Ϲ)f8\:CdUpלZ+hoɻ3;::;IoB*F MbÆUt-u{]wm׫]Pl tR{$3HJq㜜̷>rN^?/u-L`}:b.H0:ODDDDDDDHomʡŁhv6V?T`~v[~+[,"""""""*]:a#/K&sj"Wx4ʟ̬?ζ9 gY0Hluc=aK˺?}Nδ]3c8a~>lÄYxvImCo.`| or}OD?"MhfLy&6fQ 7X222x7yǾu<^ˈ#40DDDDDDD;S`um}]˟ 6QAf%{FD#4/TʦeVLT:2.~ڵkinn^8dۂ Xx1YYY|'tΜia(: v rՍwӄ3ʂhS>Yoet3 !n:zױI~5p~`BCM}U :"رԖRcF0q}N픺_9sxb7aըQxOY<.{w]=TODDDDDDDXLW,]Uw/Ccn}74Q\L7leOj{o#n'πFpLA qP vm`ud.8 uh%1/cpwu8\rv.]zHh.]n? Ol_ {$ >9-~џ ~[0jxM6zxg°(0ٻq9o! ȴkƃ75e3h@O'epFp 'f>Y1˙;,bCmg4QK<^X5d l,k8wv'>߄VFb=/!LgAym%z"""""""?z:#W_ɐWݜͻ?>pp4]6ؽW &_NyH sXu oSNDDDDDDDX+v*?|̚Զ`ڂ蓒svLlZR7ݭl[FPx#o[fHS+o/^ƶͬq[ M!ǽۨkxɬX5Kkq9 pUZF#nK;_fe^ ym 63>uX\.:_c\9oo.C;77S +]S^`oCODDDDDDGHJN5r׋ݐΔIN9[[[՛L'/>¯4DfE]DDDDDDDN@PPI=ߩm'9%m qÛ;klreW) [PqAj;%PDDDDDDDD~PXȉ3]8:isj 9eX ߬zɁ: {y? sN/72e!K!""""""?HZt]N%cZK;q}9^SJiղgߜE˿g'm.يr ;.?a,L6l&em6.+g1y>]}Aa EM<>i>BVtz΍LNuyS9 #= AUO5ˁnXpªS=c/W7?_GMqD6o25zyv9ی|u$mռƅJrv1ZU {o* ' m[FsObhu<\:7 b&#C#/G=++|8窡̟A_+@]?S؎ri[uM㒘 |QXΫ(g̰2qDDDDDD8Tae8]kLgL⦙A=,_]D},FZ 󫍛XWs!" IDAT{Lv/gBzjhLMN%Ƚߏ.60t_[$ lN>byfں}?r[yո?X+/={Ɖ*X0'b269J^ pT,SqUwNjHgњorGLH@w9_PVgbvT .i\ϗ4DDDDDDXތq3ҿLoŃog:%¨h2!'":[O'y.U¦p{1 o>kc>&VLo 'Ǿ?FJDǧlᢹ{5Mq8Styl|K{lV'4-]0 " DDDDDDXF>NuD)K$~$~Q_慯f1`‚-tΣ#lDDKtz19Q2%+E;<'v?sq.VB' C鬬g;y%=%pg!Ggx{ aä ޡ)""""""r\ NO`v܍Aɦ*{O0F%q+6oqyl_EIv<ե,pI׆E281/*i3?@K)Yq,<lm+F11\QJpFnk}`gFUey1uS`urn$;ex }`W>Kty=2~9oܯh*^b!۴˸kK5V=mHY}V~{XO4v3 ,Ǣ==o <^`Օ]wcapcV8n_oV~1iv4=ȱIɩf^nzѵҙ2iI=gkkzSν6sytDDDDDD$ :;$>1!NV"r ]?a$dj9*V"r YPN>abkJ+9u iO""""""rT #֝/e!t/N59laG co3h؛a$f8+ٽa5 te?sM8sH8u`7XHқ%ƍoxW]ǴHe""""""g"'r2ZVen]_meBaUzSyډD`%}**,&cW ݁mEqIPTa%r1;(YmU Twc c+l0j6jvw Zɒ 8*q^joM>D'K /b>ҎJϢĿ0;o*LM4FGb;~d-g_7ؓ,&OBl`8)z#pDqW~:7iv3 #Rڹ=Mι˓ d3Z=0t:Ly^O6mMqc 1-ei >1cڽl\rh"0>""""""rA5șŠ ji0נ 018WZAE]^Ĥ]ض"*+[Tn-2]4HK 8pQEE<>1IěUdaOgřg/f`nxpOY*sKi1I lc?^B+%bwS~6dk][ j kCkma-ʾ8Jh,0xg6bKk㶏J ("ԤSj%U%8pq(V+6B[dB>.:ivY p!n%\WwcfD.WݛǮͧ[Ktaq什pUq\Ӡ2 ̌.29ʂs킫SGOH !A8l_Rr6;>-Mn9(r) -ebOE;eydee!2&(l}AEeࢭ ]YEԹmkl 8r3ّEnc`jDiV-5dd,\<4O |БUk?|J~w0%l#{j.m':a X!:6cvPEZϡ[ASAV%USD<$x5li`%3f)ɫ;6uvCJ 6}w4w~ٯ%XRѽ-Ɩ`Fܙ #fpa}.Fsoӻ_Hn0c!Hz$^[M{0D;o>ػXzwl҉_G2>j_Ϡ7!W^X(H_/V`}eǼw*g Z,ʧ"69owZFXNePVZ> &.ʂ% ө'}k)w9+ 4cH'8#""""""2Sͼk73e҄zVdhmli $(tV|9Mmt t',脦5NNEns<)iOLS$ȓ~N߰0e_~ ᴏJkX3餭8\8:isp:hnnǩ9-X|;nWTGy|n(̒'#מ5,mY~MՑ|>g㡇 ԛv> n~v5ҕ[+4PDDDDDDտ?g2=nxv|Ej3TǗ2O>f\E7.4W;Hu5_9TIesx4DDDDDDZt 9䧇|fx|9^.׬}thFGsZrJ̡0@ji+fl_3.ҹ[(=]i~9\^}С8+=K6H\[k8gj_ Ө3+%l(iڟaƒ5xr7MJ09M/7 x>Jw$ટ09Z6EC=RT[{otQu)}F'd^}5&٩{1bYOIp| Xhp};,- '{9̽|x~C|I`pKn{wA "3ƩQ14 EDDDDD xxG_eEk5\$ŧylG ЖÇ}K-0Lɱ3y?,KK+)4b}jvD#/o26jjӿ巌掟03Υq f`n? >tl:YY9W eZB8,jvK۪hhN*r^]TDa?cPYZ˫i6 8Jp?Aq$lycei\4gC<,y1ZzƫE|-`4c[J +p]v-׍/^X\{C'H Fu1""""""4UX.6$tZ86.xlbƈgz6'U1F3-Nq/pv ]|b!eF9ѕ,B({XG>[ 5!@o WU./RG'`zOdz2lr ]AX 9 %^ GO=4~;bsD:]]v(>NK:~{)_B=f>dӪ:<~=óѸB|quԿ͍g߻Y5Loo NO&&OeجV[.҅ ("qh`xX+~u?6~eyTm;iim0]xw8ΖߛF#pǪ7yu\ppppx|+):Mذ6N{C\Ds/ }8qYnc|279yd/Sg1?,#o/O_)&"""""rxS +9.ҟ0LWUe dC+gqiq Wd ?-=3+)SBp-%dtz f#8r/p" F-> g+ _gh[?g}SEDDDDD{ +3XKv0f(ޠg؛a$v=Ym4G 㕽CwG,\W<t)m⵿ 5/>5C.HV"g*elUo%zv\&Xe?J!1H F\2ѧ8&PWVKۍ˯ᶓs$1&cELr**D4f%kn,Auv fTBfr>]Na3J=XC̠ CjJlYXUSOrdL_w`ٮG qUsv[؜cAO֑S:A%"""""=Ӕ@3icw2w` & nwu^7}1mQ KYDY+|.~~Uxnヷf2MJڢ'rͬ$|`\6!H10]ΝWC<"py^ E5{i""""""rUX& q aH#sS"ƓrU|<)9e3)3mo{Lxo%."}UL 9%8@Kjb(*IʶŅio\ (2CW. D@^"NM:6{y a۫rKpጉ >8OQ>eD䘭W5yWL?mȄ}\t66e'~'?>*Qlc`R8%_U{1 X cToBqmo<{4 ڠ2$k0(r) -ebOE;eydee!2&(l}AEeࢭ ]YEԹ̥kkl 8r3ّEnc`jDiV-5dd,\<4O |@Y˶ee|l=8Sо;L={ V9!nf2neO %86hhl(ڝ*:L **D@aw;Jygq:\^%kol fĝi  ?b'V]@ާ;h476>dJ 3?Ln~O"w @%ؤ~i/_o LjeIﭤ٤3X kM%KSB{ cqě<606]-m\e%"""""=2Sͼk73e҄zVdhmli $(dll+NMAقNNEns<)iOLS$" IDAT^5DDDDDDDDE8Ӆ6!SGSO3eT2IGߓsf'0>,g屼װU M'#/7wOSBV[r3j9swHoW<`7r߂ Rʷr#o_"""""" Ba%q,fO8F)S0"?}>#a'Wq9^SJir>(ӝ\@ϔ’{3gq#q?h)FsU%]s#O=H 6Οoeo]3FG cyT'cRq+c1tQ-w&D;n!H{^|5n<~Hl,d;C4l3&Ց`VZs#*ß͉tfe9xJYwmaMHfy5Md/|IVp?xɣApJV#K_+`ko?aՅsa820<[ඳ ᜫ2Z}!wHLc;ʥmm4Kbz4TEKc9.*۟1(ʬǥ^P;o`VRMs=7 8/`kLMN%ȽƄyL'V-Z ;Bκ s2y:cgn| Hq=` g˳|G WL88{*X0g\ށ HGW%t8*)C}8f;rIy&đSϢ5z厘\73r(mbW]6Ϸ/iT71)C lYlWxÝ1pͲݾVWD n\Nڱntf@Igᢹ{5Mq;Evy,Y GK. "dž+96V?`F)g{ϔ6Fw7XGϰU׶w81~ż;|~# c10@>EB' C鬬g;y%=%pg졯4678y aä ޡ)""""""r\ ~LwY>>[C{>X~س#A},}Bı k$/#Z;2exבxv>zv~'4_rN %̊`߄HekX&06q<{۱ 6bG?H"ի˶rcT]%""""""ǧE&^{)Z|SxغVAcwbrXWx|Z { L0Ѿl[»lr;;Irja]̑sýԐ[Km;PC|JxaukK,Lcn昁\Ow>-oZ{֮42X(sl=0lczBB{Wjf]!)&s7E~kӹ}q n=GADDDDDDNzSOrJ4%PDN!6>40Ut=Wm#""""""GGdf]S=qcd 9,YRBF`^15%PDDDDDDN ŏiqS߶ +Q^j$9 iO""""""rXXc3?bb/ ZV\?Z;p "͛ \t8P(9laG co;,1]0n3V@s0&9$p"Ayጻn.>{R^&ncD3Ww19Zf?/^}bvm*{wLZ7ڂ1FN\""""""'9SMd-eh}.ӯ[2!*{=})_UzόyuDL0⒉W%UJ;ݸ=_N[fҹ,JFCcH9( `L#Ālf좬 `YeCms""""""'*D4f%kn,Auv fTBfr>]Ξpf07xVedClxڛ~gsv>Q.zË#:*=6Øv(TQAJht4!Z Zq a=0cL>aC}4g_2VEgf588W!MC5;6\GYbPMNYWWJ= G%77x1n9֓l3 0f A=K.MoZA 9v8!3A%+__*ڼc_i;u&nǶQYUDaYX}mztQW$E횗yȨ3"{ͻ<l|_yUx]ݍ m3عs'۳h,f-l(kplb)><΢|ʎy5QNbֲ|-ħ%XG2$1ܱeq 1[9~*57~nXdU#gG&.p} EƗcj@ȏ*D0яɷIһO]XP3 n'?0?ᗲ`N^ԦϝԑS:$[WYc+ԕۏκJ@(֊J|NHc Ξ3)k3Yv&3x"j 2 #tS -\u0h QiQ14\f=ٸ˹3&+e5TTx'r өx&_ogg(fgsomc_̛eTfȏ+3DaY#! wd!e6Έ$r7D$pmf}{vPWhGS`ds.UF8g%cm?fW ꃟEE߸HwWl6ĠD3%5=lon{(}Vȏ+3nSOu}4{N@öW0|q| <*ln8λb!o#E&㢳f(;|9>J*0Hxc!كAkUYZz5DAeܡGYGU>i ̧v:Iha볟3rm\EO[Y `x/)afh9_WDMd-ß9W2-@ԿQDDDDDJkXjJqKS@{YYYYdnȠ̀0, [{hvPQh+`WVu(5" gbl __+2Zg.K|'^B >CUqGnM׻L*ËAWC-&YY,i>p6:2wf[Fq֋f8l?BWK\ ]V9!nwUǿ;'@HB$$AdIPъbVzmmUb H)jEQ CB$<@dP2Zӻw}KY#| lJLan)޸TzQ 51 KpR[ڌ%0WY: w+ћ^]+[ f-cV@m;`)G#ؾ Dԓm澿CMK JL`+XVU`2y  WD~}7._+SMBQuc~OX;eY`o<(B[ |?}.GbԞ!@6L,D?> !Xȼe#>(dJASNՎX#|$.6^ߘX܉AzEDDDDHJN1ss׋ݰKG ?lhhh\H\Pag^ 5-Ep5 8:پy{ZkX4PDDDDDΜn?;$I=sbBְİa: qʐJV= 2N{~&9PQDD,٬[M_b ;"ȹJDҸ4uH;$ n^ <cBZ֨9הi$1Wܽy{@DtΠ0R N70r3DDDDDDDDVaDلTc Nm$wM#`kLa9DDDDDDDD%%tTϊq_1~ݕ񉈈K NïrI܄+\""""""""r\4 +>:CDDDDDDDijtEDDDDDD1 ???X,;L㡹׫JDDDDDDD:,4z477x:=vrt)tJEDDDDDD仦!zK+ DDDDDDDD]Q`%""""""""+iWXHJDDDDDDDDV""""""""Ү(vE+ DDDDDDDD]Q`%""""""""+iWXHJDDDDDDDDV""""""""Ү(vE+ DDDDDDDD]Q`%""""""""+iWXHJDDDDDDDDV""""""""Ү(: KVy3fwyNh6]̘1iod.3fpCK+VuM,^ >c6#MC#"""""""gLb(]˶WUGkƬ];oV"{;1.&L;}Lĭq{B@Cs.grS,o`7Xy>5;;Fj \GWU""""""" iJYI?RGMd^bsk=5 5C{Yǜ?-M>0sݿxeo XMcXfeܒ`஦lZSoOf ~~ p/Ȑ3NmbkɮB~Tt1c<{ߍTYeddpB~裏r-0hР3 VHȷ,ң8? 8fyjpE⭩m}RykMN~g4qÇz6_]:׿m,X,>ӶpfL84PDDDDDDDV'aڎ.l>hIw0o۴MemӅk]w ,8Z}V1Ӟ'`"n{|eW DDDDDDDQ`u4PUv," [xۇF.q^KA^623ٲa+{w0hVƒ 2kTW֙ghK,9!UK,p˩vI9AaZ=NWމh?spsJb#푑TL1O?/Xo*0NNpP~?3oYG+{)p[JqY{˝\re*ulU<3yޏ~YY$| tf2^ͣoH4IoYCO &IaUFټsl1shOu`/n1 Ρ=y'݇<<OTM!O>AѶ_0Mk7E߬bn]KcK F0~6Uf)2uM k,[[P!b@3~s ) flJӫuϏ `Rj.}3t]WsEg?,t}O8xea7լTA)7[ǐ?-K8CćA=E*4 fvƹung_z6f^Q.O lC:; A|OSѳSÒyl:~~XzY敩a IDAT_Hg>C}k ybpdibEicnqtt3{I.mh$@Ŗ>-WS !gV(iª2\n w 5LB'I">YOc([ z7VeeĀ{~CwKڱ=x`ݻ17jVV_$A'z6'_MfSg@69 XU ڌR\g9q;)w[Hmʀѡ8˘д8.3lnw(ׄ?>z'5ykj-ݹuR"!>-l)g"qdQ giLZ%'s  y G`布"(5!7ӰwclƱK: j>&VLnOx?4QPjk M@s7DvƆ+95VP`hp8Qʯ(~a?*`{wKW՗30"h ă?G+ܫ̴xdb y;i=gWϩhχx|xZ˪%ŗro3,g-!6lV;W5kJ  GAM9n݀ ӈayý{y$W%9U3Ϗ˞Ism([T}CFψ;oȬ㣿dS'>V\n?ET6aE3">\z6R5=O~MKZM'֩JDDDDDDNOՅqӭ1/ gPaun#ߖGa]_P0}&25XyQ/n\ǒ܃VνyVv<=\mG-z߃b=]a ~VРi<++pB3P}#""""""'JD!?"(M/$G@DCo՝5%PDDDDDDNN;.""""""rT |9ye3p5P]]}f\B9Ta%ҁ祳2fts c*"Hrp{[u3~2kp9qבqnl`Ϣ7Yќĵ3'AE,2.JHGo{"YKY2&35/V{{X];.[FmL̹ ?W )`6mU&Cc,"""""AJ1[(\ ʫɫgd׻+/WK!ܬ#{*v @#<h.Ka!|J]OWpIL݉)*Blr<_tsvVnɢ$ML#.Mmi)u+11t>pc* ܋/!60\5 iX J&;U{Zn`:3=>"\Ila=h-d:?ݯ|wSPSONJ0&K!Ҭ$kf©)$䢋^\3e9}P] ұRThPYV*9XTJie9%MbSw *oޗ>Mɳ歏C?ݙ͢'p$kiA'v&7@Cxпk,K6faƏb╗~SAN|q\2{&Gھb.5Xn Fg1!ܸɮ(>J)}uG5 +kN?""""""r+Ȭeq {?uRud7F/_+G"{}eʟ::ׯ*ޜIl{n;q4q%N'-Ho_ |fg:+n)\v󭌊;m{(h21-0l[2b=+~͙7$o;% M (VFSK_.;(Ȭ/>˦9FHdig_oJN^~:=94(.+۪_lo`<0ڢ㦵:h!gXK(BXLXs^HI%&\z ][ֲ.{7˶1{mO$&ǟpMJqGh {T8l ̾%XmI %{ mg2)+ LIzGDDDDDDNt@CE@p}1S@Sq.YYYdnȠ؀,7yBiY-1/]YTͣmi4d#+'`%jů"@+Cd6bwZ~?<!gxn%g+~?__>oicb6w*>/j" & aX &.1[ Mjbv?,-O r("Iԑ0UOA^I)-J<$FDDDDDDD逼u;ւ-t0}ٽxKGM7to*Dl"*]6Ct9P`zm*c, aq2y sW?LkQ,K:w gvG n↸@mYO`c S8~+7NrذyȴABN[i}?>F|nޖ޿20%..AS$GpI)fnzѵpg M tPS=,t֚jv9M7- ԷF8d3C{Zqa?i=""""""n?;$I=sbB*D,1l#9#"zmAag{j?#"""""Ai +iWXș34׶xB"""""""g+9 7ﺓ1njt4YXu4vO>i~BV=*n/ +Dz1f$Zl"oNM:E|=a&oO:ڎ7\aF:yi11"}, KF>GF6d>G1I;WK{}6^gO/<jÜw}ȃ/(΃؝D#me ۄvS,*E4;Pn3g㙙X+lf.S#3y:6x:3gB *nc4X""""""\h{r8;S9jOv~2Ι4/oo $>}<ܖ6V?JAϫgq r1hzQRZl.CԄD VTpѕW㙃{k†0ۙ9; 7AE[XU;2@Cv.~xn5,Vg GߏՍ t180ݗ'G*V0LIW+@'.m0:ҶFj/Nb| Tlr~5%1/`.B~fn*.>Wk'eU?]<=w>`4}moRGol 75͸e1tlƠm˰2m1Q2Zg>ɯ9{7BIY?ቫcğ_Ƨryⱚīx)z^@fz6Q;>"=g]˴ <\O^ˡk  r!I1 J; M_9{rMcxRk۝['%-Ӣz+M̖rv9!bJMvP,0)); #DѲi}գqK*mx?n|Wxon~!J?\[3W g7?/goN!Aͣp{Dw kN 3»{$jKAZn6iJ >{W;20%͆3q-/+FڃofV`i@~qg<ݎSf|KlVBhw 2:P`%"""""" yCX*)B -[ǜ[ Le?_Me` W?ozDaщA3E/3wwseD- >daѽ+g90nlb]";a7=: NhK7`lTWE`8n|?Wϩ4,!>Cc~W~5;P%Eglna9km aämU͚("""""" K~L 17S`XIM Զmԕ(,k>%s"ΨtmjC5f:=V{.&0o{ol$ f^H90?6b۫7OwoX~wb6,[ĘOSmc3; >po]̰.|@,8]d|3)qNJ)͋zq:dޞ.rշ* `̰SV^GGNLWC-/mb}x&{WVഅ2gFDDDDDDNJC~EQ^HF00;kJ s,L!a#Ky6u99|y3g_^eY7\ TWW34TWSע^2UXt`y "'n4Ł'n3\eޖG]F ?y_Z\au$`{pnW75@$Ə?;o_ۈx|lVJ2kZ>KWfd]bݳ2jzyo|'|e4~|M0Ⓣ9af 2vQT\jRSž;97ˆgUDDDDDKTa%ј-mUxWwї+ƥn֑l[}$xgxCe{i6,_ɿ+6 . ;1şQeXMKn-Y7wi|Qe--c%<&NӇ]d;qƌg=ߔ+܀|wSPSONJ0&K!L7UY[XKU@{U kta 'zD&'AUMÔ~]R+a0!^66Joq#&29{,!b2BݔzCx7Qi-k0]LϢCxпȗ雒HcPKRQm@`AeY91sUrҽ;y&y6ʧ<-` $z\#%Z"\F4!.j95.&-]6/xW7^3k> LBz={izY e͘Av ivjp`{G~+[*GKu1$;}++O\Wкxu]UmNV>{} [>Kg[2{+k**0[0n"p EK^|ݒHAuHb}׽$,oav_@o#oܱ*pWZ>w *oޗ>ǭ{e+^[:~3EOg2jI82*OH4MRa-#^~ʲZpi"~~;#pm[ h LˮfRL -|;0zrpV1 QkƵ?]8.ۗZ¯GZ !~4` fߧw.7y! x澸W?|V#9EDDDDDV"Y<~Bʶv͸"KW Q^_g'·17gRlێp~d?W${|7,${ XRNb4z4nWA,N'nHi ڱ9˪^w;- I}ןy0''J7|o,ɝHkV5rِ@2ȥ1Su`lF]V8(LL!V&ZJDDDDDdXt@|Uy$])6x94(.+Ql@W  Ɵ6B[T‘}ܴP8ׯNhn~waeM (gjK} ihA.2Y)~ dLN9@L6MdNLbLs -2QЧ doٍsTFW܇;6n6eRA}`9٢t\f- x',c A)ZJDDDDD$mI*ٝŞ&s"sCDdeeJj7yʧ}m|5xLvdeSYRhSF쎶XϕgOs>dWxxH%އL f#H۝0+F [V߼Fz&'hqt Zi4Q]`gȨl6lV?͎2GDOPq4`sE UknZ<& 2eEi*S}'Tt<ވ꺃E[xk:Oy^<ťޣզÛa 7^v"oy.{!Ex_^P`zm*c, aq2y sW?LkQqIhr#䘯_T ;m!=T~9B,倉QqU2@m.v.Ǧ/2\9u -o.!㡵uä7byZ0o`4}zh6[8ScX=,w6_%"""""r FRr^t-\:jY=gCCFSB24ಆb bG IDATWgz-T׸ mnn_A'p5P،i TZfǵd KB*9vY=߹mN'OџUa%"gauDDDI7ۂ8o'"A7D)9#ZJDDDDDDDDV颱z\imݱ+L]]. O~4ܳg=dž,f2x<טś=)53o9yxy?0f3;??3_\E 'sfzPDDDDDDG^oa|ɇ6|:jl#YﳜM>f*W_5xqF7qFċZu>=h""""""Ztjvo.rE\>{5_:^67\;+BաspvV0_IZ0կprc8/]Gy>0lHg({o8q1#.&qo=Ę]|K .}KPX';ncW$:}.7<^&U]fɳA 6eWaUAgo7/L{[@:|Wǜ-nh5Ƭ_NGiTX)csg!@:cwUSȓdc'LlFMQ`67[|RC̄gfb5~{;ߠ7%qcf*Goںn#ƅ-*7ĵI*={-5( K<67H<0 I%54#i SgLxϨL#Y-gn̽ԌƁRDDDDD[Д Rp73%EƜyzG=֞}٘{E]<% 0L,ۦmWVPir=3IؾU~0r35FS5,Vg Gߏm:/3N!A5}w ;lbEicnqtt3{I.mh$@Ŗ>-WS !gVq %DGyK} `%,,[ pW&m<>ys\u8o{^܄O `BpQh=Y[rqM :qSn֡~k:n+ÿ]NlFEEzEDDDDD5UX](6$jt0fg}8GD0h"?_K17߬Aa.g?Xݥg@,3R൏q+Q54<;o:O4,yC4^1Fp;)w[Hmʀѡ8˘д8.3lnw(ׄg[9<Ԁ*歩+vIxKJ]N}G'O<- $K3b.cJ|A?хE5t1_O3 '6Oe٬V[:'\čAdt0qb`e *R镻~p76.[:73v8c Z_g860Z|4_;c#Iu_mT@"WSyXEVlmEnIƖ -_f >~FF_eX+qz=[/_Nh 5ZMq7|8ODg5Z'_$2RqW*Պ>u*)!yѬ#&_HS7UajכazմnVm(MbfXVE/SӜ=UH!:U.ئ;x#HϼZߞ=%I |ɺ=rVj(74|ujf0w=F(yI.T_2ʢKi[䶅)&eΎ>tH䉛 .3Kk_V_FbvIڹM-k۽O_64'D25/U*0b5iH rv&ƍ֪1H?Tal;']rfN|Twj]Z W':wny8)f}_mtלe.wK\|GnV]]]ܽt MﳶDc +k*Z 5!J?BAhkVQ>o3ܕڴH}Gj=xLd7Hѓt)EFރ/]=vy}ЉWQìԲ'ѧu~Ig%ӗ !*lPwxiZ$ uͯhr>U ҿ籧\.d$)êom#$V}G(zeʪiɄUpQa6fʖ/Ѻ:^7TNLf(Q|M$)t)<٪"*2*^7v:0e%)o%ZAdUU)g:ԱJ B^yQv*%wD]x6ig mSQat&58]OUUNm^=TO?Al8QTb4jؠPcV@/cAe*٥:C 6TSY%c2dqh UTiGUd-%*QMydUpNU6Gh{v rLv->&ۀT 4,_#uyC$I}ԥ_QGp/֪m*kծYj UFzs֧kwoJU*@o.S+I?O kqNE+Si9/c95/qhIK^445gHLȋ 7ܠ&$P3˴UfR}G8E}mRG.I*9 r_~{es5biWYdTMHi.sm-T!YӛiѢEZU$JV%q~uF }EZdS?8CSG Wd1Pc Iֺ4ͲG~z#AsK&)}UBJqiC[;wS*[冤u/u{wDG+k;u㝧{tk<׸+X"fv^s`9K?Ӯ:;ZUNO|^~=4ydڂbvͰ_rPB`BVW k}eva﫶eܐ9fJ Ni8yS񨽾^F+TߥpMJuZ+Ѯ!}TE|I?ՐEzZ}e5ktaU/=g7;5tpAeA<$' ~, z!kvU{%gS6jsE$@^rC1殷mlQKQrrKTٳE^I-ڐ-l diom6U+EѝŽEo=}{%{-^w]w/z\[ UHԈ~íjݲ]uU*!JzbEGG4u-ZT)K9Eh3Tp QaBo6l_WVٷ*3Mo[5y]/iH$#D2SHMtTl!c4JgEAJJQƙӕ*z*dBee|I߹aj$o$iIUR ӔQ[/JIx.YO{RBu^{bD#HN@Q` O/yM/駷CFjZY%t՚9}Q=fss3O!5m Sxdz^߬hE nGx=NZLİ+<&>`%8&F<Q #gzjhW&ÒQ{\/WkӐ?zYoCZ /Ko٪߬{ :_V5B}t,,GIPV{|B朤O`@= Zϩy!4Rt΍Wf SؾE.F2/\ 28Ͼe.s; @@oRaӠSЬɡT35:L~'>_ǎ>A~sG]ǘzɱ GX@/3${~%Nk[7ߡyS_׿_\u[Cn8Re:rPuZӨf#\ǜ3ݗ>i hU!j pӣe_+֭L9j]5"ICZ6K+HNW&+Lwݖ-]+DDI2E^/-/5֯ Ue8uOUjͫ(+@JݰFuQ+wx3anrP7z2Y:1#H+*⢓Љ,)K .ђcgϒLUXoKr:|L$CfdF뚩{GVW> e'ũM"uct݉Ѳ-j*,;?2T%ٵAkiߐzhN?A&uE? ԕ瞨pz}[VR뱠 tEzLM ;"6ZVSK֨s/O,DjͿ MQ̃9<X1.Uם9LGFS[G^R$h=϶jd eiWG[gWL:TC] u$pXVTE:(/pFRpmIIJ*]OQ 05M2$#FCc-޶\O鑑J2A,4짱i.DE#3IJ\ֽMKQVK?*#g}'O>|4_;c#Iu_mT@"WSyXEVlmEnIƖ -_f >~FF_eX+qz=[/M)~m}Z'蒋F+#_~N=\]L.=CnKzioIQZyyF܇g|RW1@)QϹGXVΒz橍ZTfQ4'iϏ9~pWMg鯛{Ԏ"=b_V/=3?KOf__tl-ZVQâppFjZY%t՚9}Q=fss3Opuj%\}d@(?p҇dAfV?VD(-Tҝ갇i`pPV ß_4Яp}#連͢*֔)ݯMhKGBq0at񁾓MξV Gaװgꁋ #:^E'/Cww̗J:J|p7`8ԛ3\&Oׯpڿ}3Gm-jvVZC‹ PXXSm Qh'1=ښ;cwRHM7# $w$xyJQ=ɏ G/)_Z[zFN4>Mh?U!㎬Ia7וNeݠ^Y#uA*h [ ]/U$|M'[@_T}VnSly$϶OӇEC?ճ/}2KTXi$h+% IDATP:?h~r@O=S̤=Osuݐz+L]ɄC5/qWU a|.-TxGU V **U,G0 9sfIvHrEْStˈ.Radř^viCwi ׺*:mYcL[UhğTͦjUIrm-TcκdU}}e2 =0< SuI Z.ŭozo <e1 5?@O": K]N9[SD1 =r0ܦ:dag0è+R j b04QQ<=A84RusN` :áf$)zX X X X X X X X X X X X X X X X 0 &8<V b[^sWY +55fjey Ðjfثۇ/? X X X X X X X X X X X X X z|>utt4M.u ÐbQPPVk^Sazr@e|>\.^o^Xnf,8<V~Y +55!%                ٨5wߦG?Wi}mi7߯V=8#W};nbP]:iQr\yku͏j?Ng]`޷|z~Z:O)2ꐵ|]w!U~Fzp FF&{zyh{8CX )> W`n": 4 Z4[eP|5H /I8Fzv\cWZ[瓒}8uDϏ[G WhC`uQyYW(e YvS$XѢL ^B44w|A% k^/f tޅHF~^$Ku.174]|O4<Ԣ;> ə|yt%[;W>Y!J Q$Io?IßgZ^RvgΟߝr2z8ǥnѥ[^J!]_]#רt\~?z2:v)덗ڼ>F?s%v^At)++Kwyϟh~X8h~0FȐ]Rk:Ȕ$7)kO>P0.F z Y3NS^Y_A{ħsl}S|r:dKZ*{mW<ݻk546U;ּZ^S9{621RnjQK5w|r ͽF:m:"O_ȓ8SW\ʷeYw Q_guFdU]~#XûR ìS˴g}ZwJɉk}~=Z߮XrtM]u䞿'\F9nGw< I~@;OeUY%ru$x{Ucc.\ٳg뭷ޢ |a:)5Dw:]ϡl:y"d=4vcC:5*j$eRr-2"55ۮmQ6:W.S:žZ*9q1]whȔ /ݮmk45K4j$ O]ji^5wǢ=D'j~2.bARk$MKt]OƏjZݲk{OyEҺMcQQ}] sF:K[٦ ^s9/l.<7MڢOMwMWlkr7W4b4SWt8zs|Ls93t**wݥ2˲+O(c>-9TXi o:2kb^NR)D,Qt-a5heNUQQ)sh9ԬM[|C~vlZUج)}]mZtv6|_2b5;Y5Zƺ 4[w:5Nn de[I\'c6774qLdee;Ћ/HXDns8iv}PJ2KjzzKPPPPPPPPPPPPPPPPPPzM`eOWzkk+b1p|yH+,Ǖޚftj<Zajtf{UwPPPPPPPPPPPPPPlf|>:::e&O:ab(((HVWczr\|U2MS>O.K^Wc n73Wzkk+,Ǖޚex[B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`B`bc7C_4x_ց sn_o('t8 ^BQu˼k4^y7o=6-<>Tӭ ܬs\H]tiC(;#ۧܒ$J=\IiD'H}|Wj]HF(t􉓣۱Eۺ}>w杞iZQt)U!'jZ) Qrz7[54٫>ӟoKyg$J‡jxGa=̺?|H9/٨/{=Wg_K7zGk( O{kZU֝q&0RWȗAk]'Tgg`eʭ$OQd r-CVn )g gߨ[gnAn9 ĈYOTXFS3jLJl/v:)IjLK7@TuʫQt댁!>u%f^~F w6Uz,ֹwƨ߈t?N-;+IjXp.]8T>v>zgmcť\i׵ rk=9E :;Lg_}fnCݵ$XMr.zNKv 5Oߤ;\t.nV-6YIAj 쫤WsNP^ђ;SWtt4?;nOGԦՅ7k^mݗnY?XSujjڶ||NG^Rz`I*l1Bi+]!}g]}iުk^?B5F0U/dxx  ̬K)̉5&Ư K룚ΰ^QD &)5ܐ2[wDz)&M2fmehTRRdy旯詼6E' PӐn^MBj´JR|G2%q jٲe={Pau*Y?_ѱK?^IiHr(cEB;+W4t)]fBf^cch66xNi?9_3֭fRWw*kA^} RKg-(K+FZVK"t/kkcVni=u{^1̛3vn#CRg;oʂ]u䞿']*C_՞xn0dJ6-KO]#8GӽޫF-\Pg[oEG*\ΠXd*\督Ȝ1yf,kT|o ԩJN~wҞ#aHxRZKS$5ekTYum߶XERǫV) -jԚWgC7oCoWz>Wj]{WhR&̾Lݽ?(M'e)AM鱝mZ^P!<01mxM:|nw:*۶>г/QvyÞUc[MduF{C`sը^gTw-3wbǔ#uoB"B;C;ITEƆvP:Y;S[r/}Leמew$ 5xKS/%|mjvhKjМ3Q{Or9Ǟ9C驢R}](,K*DүN^uR*zoWڈ:JVbAb0h( #(7\ٮ|pЈhpyԍLL VB!x}]w~g{?>>Zs:xvZYcG5=PׄX2vU-}q[i5pV5G 5 1~?1q[m_;T ZSuql>J͝j\^7/\[nyΞQ~f[w֧FjuΎRL>Q/絫y|?qkTc~\B:T^YOT;Qoι%|G/syj7;k5wX:[;jN]vU<˖>qC?k^}׼r劷 ݻk޽b@?ͿYbgYH ڷoH Q+VD"XE `@ (Q+VD"XE `@ (Q+Lj4&X3j Kyvm^!=ZVu:j6=hT٬NSV'凟"XE `@ (Q+VD"XE `@ (Q+VDJ)Tu~] V% ʼnK58ѕ`h`:S'OieW'?u-1vV ׹su؉69ietInw~Zxf]K,K[_"XE `@ (Q+VD"XE `@ (Q+VD"XE `@ (Q+VD"XE `@ (Q+VD"XE `@ (Q+VD"XE `@ (Q+VD"XE `@ (Q+VD"XE `@ (Q+VD"XE `@ (Q+VD"XE `@ (Q+VD"XE `@ (Q+VD"XE `@ (Q+VD"XUU|Ő BjӦnW?>p$W;XnVs`^DDDDDDDDDʐ䧟~2^7u:)s999]n7s1,k׮vwDDDDDDDD̙f0 B0oa""""""""%Je&Tc& Ôx<ԪYn!Ctj%Tg3fTWj#--,˱}x+)ժG|||l/""2OtjؿvRIH(p\۪ LV""""""""ۃ9&ld6k_NՌ|N zM\ၳgtr!aL&Hd6[UR'V9w^!Ee2LvcAFR<7'˶i| þQI^;ӶqM*[d$s`/yo* 5ġ1t~iI`<,ɷ CE"T>ԬYJDDDDDCf2\OX>rx`5>O"UEwō\e 15Vc'8Jߏ ؿ7Oߌ1dvhg8=RV3p4\V9${bX.^|]:u~z|$Ĺn|k+S6^sZ/3-]+g~5#pųwڇ ױ+47>5~ 8:MFD?ʨ믣ɜxʱ|+&/'ۊw)up&ky1{w s +ȄƫyzVxLueg)e{6^\~>`jp7Cdp>LpԌNɧp4il[7 wAmt ʼнk7ڷoˢE%""""""XiNY-XUN' gLh&I^̍{yvnumO 3 5N D;? Ekg)sR'LFZ\R̊xUsqu!M`ŧA"cic&JȐM;$#7>zMnSy+ L=胏G~1K8b ,Z݇׾}[.]΂EJ~rR>m}[kg#<-˘ƭx[]ۍ?T`l['o< Sk1Vdn|OOۉuUV6͟h1x0]-,XY ;`8ddfOYa o?}ݟ.)ә-~qQp'YK8ȨрKLIӪe]l': xgIw2gA:ഛh[Q69mh}o zh<u˗_g,\?T9VK.ϯ*k7 sV=^ݽ+Ёm/8z 39m&<~sD m ;~eºyŏbr~5_-T8TJoq8\C{o|o{jNǨ/{8ƶ{^ޝLm(-:I;~GN=GˠZp|K;-1oKZ_E&A՟dž*Z xYz\eH#.H ks̻eY!'NDJDDDDDDJ@LiٺaIsX%O!lF}?="[nvl'eUۏ{s?w~`s[iЫ m4p*=NYڧW}?aΫP-ёI:^pIWԌ o&ܧ&;;g+YN} m>92 ;Hu'@,8IsVfޜUK.jWZ**mLO \h'vYW?<X1z/V$1 wLJswڛsKjo/?|V+]{rɤ->6ԙBHߵջ I߫fz*@?ƶjҢnfm:M ÛC.iA)JupiYslKvW{sǎaՉUmq=="H9sVhŕeXVV2XMFL;]d!Ô /fM7szX j?soStKN]̆'򬚽_>-YwcJA|л̞tUʛhIfܹ;n^8W-f#/0Xv>MZe ^t~ͬ)_ťStF8#m!DTq*Phd̚JB&|r^=gy_A-0[-|C"/Gg\+/A Pv_u{a`X,Mflv;f (r1ap:rpx.FDDDDDD @`hzBZ(r$%1ךQ]DDDDDDDDV""""""""R(rE+y8/^^= NDDDDDD( d6a61USX]@^/n DDDDDDDJ/.0 3f0A@rv)^/ ϋey8.NEJIS vt:J="PX%""""""凁crB0VƑS DDDDDD9ϿUs9 J p:4^VDDDDDD<2 ÁǣKJ e{;/'֩cGlV+K.#;'LҠAԮb!v62yTRm bv)!vȭ* #^%\u,]0hצ A̘9낽%XUU#"?NjG$jժ%>!!'߲%ZW3qc|S+]9ׯ 7^zl۶[2u*v@|"VVH<}=FEove+)ZzY|Yx=n,撍[:pR !))bAL&|5TUCO cl+|>.:̷~MҭGOM?k̀o*ǞFPZ]Ƹqt@22:m*SM%#+A dnZN%/*Z\Ҭ**"""""R;wK.چ-zuUy24i|QOkuזJ,R #{'?$&%,3+˖Ӿ]R a0$8=-y'ߟ_كwēO2Ñ<5 ֯]єA&c(C{5O}d2oo͸/O?aBn%|}^u40xM, ֥i3\Ej{sZk6~HH5QnM|vn%?"HYg|=q7LdmA[{3"s5;S?"5UX;o:;6ClTzjen,:պW0ۅXnbY,KbsyE61*I$"""""RQJ2ؾ};׬l2qyִiێ`Vkn0t0~n?c/ڥ+NaҷߓYj}W;r8^>%xɼ0=^/=ѬZi8$D۶ӷo?fQg}-fnIvfvxHфK/Rsneg[s1vJj_}%nnp[vl<dQیb/ϛ*^]g{GP]0,ڙJpף]@ϝ̢ lgAحmzgE݇GVf&˗-/Snjլ-[644'=΂ 3o^,T@g2p;%z ^#͘| ]~UY ?ǝiF?i[Py!4̮2^#jf)@VʄpC\B#l>?tִ8fiJyBv寄~t8kMOw!"""""Reff2fut ?d2q7Ѻubn勱W2 5kYY'-%"*w)ѧMYN^철Gc8rU#"=}BCMxjXUғ/#7l;\֪%M4.E+Du0>:k}ڵ9_b5B_4>}E&e=[X4- MK$ϭ:&)4Q⒳ܶ0\~ !Y~ +f}Ÿ)T܉z&kN_n5T!-rK&v[n@f+V,j= p>2aA,o Gl"""""rAp8|lڴ֭`~ghݺ 6m?-tXU#""#\}-tꔿKN[\Feg_~5z,*( ohWaΡc\ۻkҸ1W]كlMX4(|26iJDՈsFдISQrh)=棞03N2Z{|տ?ulH EyacΆ"-*dq$xZ$,~O\/AâH9tO6Mv] IDATX7)#JԨpc[^T$p]+mY0i"3hܴfV~y&?wք0 ?Jcm]66lHÆ iT*s0iSN,-'̞ɷC.'m%?BۆLv\r׳ ;d[kw=G\ܱ%VRztkSx{0dB]D65M9z q^5ҴF[v{XFDѬ>իUV0gj:5ID&trk$utmVժSa jѼAF^&1~VrrhP\HԩÑCz {F~s( k*  @A wN,;ݱaLHL$<4L}ί>RWKV>x?nrõk_R ,X|1 n>MzZ0EK{fII޻;bc>ݻNlvZ<Ѓ4lАWx)GK_rP;2mgpe#:甓ã<\ϖo[80m 9?ct.׷Ǐlben`WO3W*GdGoyfD=%u׉'$r+ߊ;;$xGĔZY\̬9]0'wy6hݬܿըݡ}0\]Ŝ;3`mvUFjp\̝;LΝ0[,x<6;9Bn7.^w%Kء=G&3|Փ.]r8}2鯲tݨW78d*0HIK8/7]YV( Aԩ] 믿Yx1<';Plݺ5O { .[ʶU6;t$95w{+V2uGw7HRw[Æٶ-#+s7РAC>b 0auܙڱkn~i*YSq}UK/e…e_ A7%X$/ΨUzVR.B`AAAۗP~}Ʋ5v+SN%55U[Ny\z-4WTmڐ ϸifrަjl쿅uj` &PUVLKu^^AvX!"""""RBVq ߂c2L J**0CNN:BDDDDDDc&uDZa^L&6U!""""""ry^lVª 6,?t)_oUŬPX]3v2E^i&LvLfU%M3] L& ۅ.tk@DDDDDDT޲jX&3_ɥAՅ!5 ,+ۃŋWCDDDDDDD{0 L&3& YJ ld6d F+ DDDDDDDD\Q`%"""""""" ;-E=!""""""""`Æ )"۪'֐@)WXHJDDDDDDDDV""""""""R(rE!^ DDDDDDDDU XH85*hhJDDDDDDDDJܿS ,>)i'L(?Z>^[g@boAIV8J˂jk}WgB\Tau&&۳;M:|HS`ukg,r*5se]]U΅skK9֙|"""""""R):M&IG3_9mi\88NzeYcT]2T Lv1Ӗq2F ;xSpB>:5[?:&nmﱖ[^9ima  @&qsլyL'^/A1ui~͍/gd n>C`|7pKq!K~//NcyK KO ~u>(<8u> Ûij24tP*UW\5k ޚ5k+R =:y`팥{b_@ c\}l8]kcƻO_ջ_f ~W}z >qEʊݵԈEJ7tFԤE 77CKٍg{_;] YϮ U6@/~T!Ub-DH [nٓ_-Zu5kгgOT¯JXX:w`=[_fA~+׍qn0VBhAijMNjώXћ~^䃛ϴFT?@tc"""""""*UZ͘1.mOzNQ*V)L俊]S&R 6ol|{w=Ixbe/fA{@GL:[r'\w!2pKDDDDDD䂒@uܙiӦѮ],[>}PreUET䄢(l6='†UPƁȹXzgK8Od;[WkhGP$D]F%:DDDDDDDUpJ>Iޭ;f]8^^Y""""""""%\ v@W5VnHk&"""""""%MHJDDDDDDDDV""""""""R(rEw>ѫnm9۸ٯ)""""""RluY/buδ8Mi 9my'TՎ .3ᔴ㫛*1z ݎ=o{GW1T o~L-^]lވ!}TsHySNDS#""""""Rl &7`KAxf aH_Di†]d1p8ٙ|,k34Lő$ʭzn@X`ZUEȞ|;xaݑȟ)GLƅŶ݋aU*WWgɏ?r* $6|?-G2 iЄCѷQP9Ԣ wyԷ|}'ť:ߒkP>-Dҥ q|~oyy=סQH]O 繤tv`MK6&8ܐ` )cG w׫g"vj᫫׿cBh\&>\~zXcxrj Qq&k|*O6;oML{{;n[UjժE=qcO8Tw)tu|>WFaT]L!W_J{SY9sƮ=fӊ!Ю LNg$pD}eZ|*fyuֿnH_& W,;p8ĴgӮ kƾ- ج[^C; ly!F3璻Ps9Tzx6Qdɬ:Ƚ7䁡W0z#e NԦÆ6f)R}Չ c;1r V7[͓|g+<t[ 0A Z.Z*Z!hZ)-+5想z`"& ɺN/bXIw=eKiӲ97?uF֧zܱ _9)ߝ[at ǨBAŏS7?őGx?##,C;ucywOY QW.OFK7l6`ZDM?H©w9ӫs:D?g mZԸ~^qX7+_iJ0G;oo@Zv,pXAǖaXgi|8WtU?ZB+H[%h(O=l}W -AR 93_s/ic7$u@".#Xb 7_5tڕ/zUrC~^=oltWT]}I?oCױd:| }x~470RH 8Savdz{^=G`cZ ow~5\n-ڄ~?8GheR@-ENF=ŐOpBiO]8ÑJi[fƺ&駢0ޚus^(@Ό(iL8?K1yg.,Ll뉽ξ6lJ5|&$qr7 ]|mjQx īK (R? F 8f"9MKoAq,Tz wS2eS3Lݟ 5Os\ ϢV];ԢSp~ S/~δ'[CAy#/HL:Eu|>,]-kv}"x{7Rܛ[87^[xT5`ۿ0qNw <۷X'9x^| )~UyrNFn}~<3o/ׁ-E6/Îx!lժ/\PzX%Ba'|nrTd24|vNo뵲\]5:xLEZe9st˥R"Ţn7<' ҵSYU"""""""+mL0&OdʉM|(9S)EDDDDDDn)M.""""""""ExV""""""""Q<*eE2lXuϧdf"""""""ryS嫎0Xp])jVҚy蝷!"""""""7GV9m޼VW.""""""""w-M.""""""""ExV""""""""QViȭsܛ&d≈xrR*Z@""""""""/M6e+TpoViۭ3GDDDDDDDVq3tLw(P@[m*YXGQ`%""""""""ExV""""""""Ql*H֓w1 CEV"""""""YȕAB+gƥvRpu+,ba&v:2S8ˋ\)ʠ9DDDDDDD43fpaU*553opV"""""""YvJѠA}BBT s*6_]FΝDFhbXV@=DDDDDDD4qĝ< @VyׯSpeuV"""""""Yi8NsRAYÒm8_lMj;&VNt` .< 2ytt[%U{ O3MP<8):Ȇ-a/΂b2a>vbgX;b4#WlPI\ӫ7΋aiLQ_mgx"S&m;;:ϼחf936a9rdGnz7Feh*0Uj,ǰpOQ~1+8T}zp?(qg(&dFD DDDDDDDF`pezNdȅIeӨ2[>ɀع Lnz+FV ~vo[co,a[gɳ]FѹR:}} XYOȗ 7'Ή5G0?KO"_wg(d^\Տ^KN.,;ߨFͲVdKϲ~*^gZ;^u\7J 0VR6EmҼi\]I|:yMH SuEΫc 'W+ݞDNvGN?<-Ү&6}OڔT[Yz %(XQ(Rby7^hL(.>ݔ Fr6{Wfqӷ#VCX/C8pc?zѸt[pX٣!AQ)}z6Qfk:uur`o0~b6vyUC00ZS[j\qӘ*A,QkIdYL)P6 SuGDDDDDDs'-%ygi`7jfldQz;Y;s9 K%񟸖s4l^9,)[($<^_:`mUp\F瀈;Y֐4՝;Ctd|K5"~V|;Qr40\7W\(7}9\82Jp~CsG-/c]P^L9ϓj:9 @4~yީG4#k`rׁ{O@kAfI䫽hDr۪:EDDDDD8_<n{Osle4_4Ц 7,;|XQJZW/jL"Vn)[86 iؼ.rZX{~d}@OrfKCqqj8S94`Jp`뼵.mgw\+/u {z_7·歗[P5 pi[/""""""xfȷx6k~ӻ9k)Cn~YvRCy,Xi;xIׯdKT K EM83ZObwg@):4+M!w,QÉl8] c!ΞN21H"f~uF!APe| Gw\7 $:žۿ6c}~6WG*^:EDDDDD6K/{Mus&q%,/^O5q SD`=GIwba;bΞ$ncρD5b!w,e&e7Si MZ^{ucHɌI8Y xqYMek(Լ1eex#GSjXɨm? 3) ;=,[/ߙ@jl> <r,}CS[;ZH\S@hU""""""rgk\S]PUwcмyCj\1;[YoƲQ|Hh_,$e[Z(aFt@08?vSSұNo3tiZB버F1w,6Uz/KYsl15^!^x䙆 HdLNŀU^/#gΔ-C4Nd|2ЖO2_9K1?9dR~ nA| ېyO4Bh7Yf y$#6&P]F=T\g1AR 鎢t+qpưrb8}}"q>;FL⧣T<*nƀ5(lK`˂E,is |a=%:G);~a㤪n;X|CnEBBvOY/""""""ri8N}!Geh|y1! e?䭷@a`ai8Y+v,[g)>!M6TPU_zp0lF-1y/F ͺռ*1V"""""""r{m9ᗛ}r)oDK*ݒT[@DDDDDDDD<+( DDDDDDDoNT1<^r+,0 rlrNƪ(Tl,˖- gP a(WФ"""""""YaTVgs'Q;w(Jj D=DDDDDDD0X,)RVmڐ/_>TE|hզ Eb(zXda`&A(Tt7nw a,+ݎnb\jGQ`%""""""j0 l6ib tGzW]KHqb6w;V"""""""Ybp%LX=5bɚQ/ !"""""I)L}EDDDDDDDģ(JDDDDDDDDo^^myf} 8s֝ҙ."""""""Fae#0u _Bg'T4lYpJtOҴ|qoq/}ݥCkztV>KJyd@;^}ZYX~#:1B S#ƙ^،YS'nE/ KaNbxt6U|as&1slo[/mqjsSOֿ ٟC37I$lP'raGqХT(~~^<43,OAӈks;waxq}B14bSqcq@^dR;_z:Ɯ'@q'w_Nǚx0]_Ҥ! xDDDDDDDDn.[=F]u>/k_iba!>w,Y)ym8v}8Rr&y]SmيuϾcI{q0  L@X9u"?uOIL &41.$ΜN&\INXFt*W6xDDDDDDDҏzs3- Kjz4sXgu܀ھOa O#N[FIIv*[ՖS,'-:qS$ye OS.ߗ>dA| Ӻ5ZӫpF"@}//䙷}ߍ]n^K#W~"ˀr>kZCD(zOMgLӛ.eh9'pӽؠ1秜,R/uGDDDDDDDn X|Cn4'?) 4 ^և iDDDDDDD$zl< P,LOE?H /GmXQ6xfL"E6 i/X~2fiis0m9mpNmR(" lkry[wnSAD rA$+2=l +xp6)s]2{?FޙX,!w)^g%2_cHIx2 :C` \N٨49 ,S؞18cB{b~.""""HhV4͹g]FI}U*@%0$͛vBZB7D&Y.ritGa1"z6ѼM|xm;B@*?/YQxoY}2:m'_dWY="[x|w<_V]5'y<0Hbό1 =I}(\}kBUh*0Uj,ǰP:=T Hy όg«/K{q#jtn;B,-G=yT@F`̇_0ki\%h-u[SI. 9)^bRqW|\/%"7b)Y P1 `?plMyg;Oé 羰$83%O1i,u)ዑYq(s?y>g!ۊQ76zAZE Tթ49c"Okpp<Ħb+R/Uk9ۚyg)k>ͶWk})ÊCq$;)Z-iD0XXFE :+u5I_%ot'oc{:'L5=_v%o GЪt/acf|~8߯Kh""bKphR v1>=qIfC>(ȸ;r:#YΦgIvR0nk*^y gBD&}mVjt0td{!a6hpW ObT.bc4J= ou/yw1'kN>s<ˏ ߁nefnEmX"[{\`/#7Z.jܒמnL Jgz qs<;iwgV3'|=-ѷM%Be A}<ɛN*݀ȷKU{ Ǖ廓I D ?4Bkk8:kZR>n%`P8hM+*XaGp<(#tiU:@  ?Zpaоl1lT]"""""c6|s QG/^S+[2ٞqdY1> ׯUl'6i8nM`yoG#=xVң֧?~l%/C}ҥT6.&8p3Gǀ[P!ubtr7B0/Llmv[Z0;S@uLx}Nx +ium?)#ywo9Gon^{mY;Ưbo<ٷ q<;f3)k<~=B.x b~WdziÎf|הS9N[`tЁoڵm˂ T[ 'eL#%f/Z=JYIӁZċ*7m?3DzŬ`y᭘b' P1//8)$ (UF#޼&-'?@/V økѪ΍2s⵾t `/3r{(AEXbBg'{|bn&IϮ\2}m} K `8hV|gy$kH?ֳ!$Q}jٯ Lz}Uօ!dk½=XXw):[\,#]AO|hˋr`Nj]=]1Q<#)$+Ju:}8Aeޤe -4/x\QÛrb _0!y'* tZ +JK}J1|[r_^lˆ xꩧHHHgϞ|W 8֭[ӷo_J߳pkNײRnpQNj$mZs&D, H! \Tt!y`wVvaCyJR&t/55gr[P8L8p&hdy _Z>oтٱO99n/~`)^B쿰|z{hg6GՀR6kҠYYt툈5~9YǔSyIZZX<ϕc/F2ܡ!;%ȸ/qATDX#Nf'1q(X$_0 K K>X=9\2nyr.bvUХWÊKԁ$/l7R3 X.˹7Xl%W:T?fr/Eź yT6 ۏ6¨VBzgdXQ8x8.VΜ(q/?`w9uV'ϒJJJ o[fĉX,EVrU_5ޞ1Uw&Ϻe.Jc;9 Z1\XWym׈OƆ_X~;;wa5,_߿8eqSŕ_qn e”(~\[O!KٮQ J`I?~˳7,ќ{5H4y"5?TIC s_9%)G<+qw\-zi&Kڜ,y9i4^=1_gV+ӦMcǎnݚiӦaZU[$Kǀ9>yl_c3X #y)S2eJߞD ~v1n:1 $48qǶx/F#lPkO3f};V6c۱wיhvخ{ H -HJ ;\Zئ3xBjs3ҧmRнbMfXs,5Sԅ#""""r7u5Vx~爻rv¿nuBBPu.~\4;q;(nM C\XW4s|^/#!Ĺq}*̿ (7jǽ W13rP}?QP0fN|{-oz#2y'=*9f<ěRsDl6g̠m۶mۖiӦaT[Y|pn ]o,c),, +7UL)?y2zTTI$1~U(cY,~pfgr7nUpmInҊ8px0!>r&r5AǪ'^ɰg;n{/a#_ꄛ`oњ}/G0ւ|?.j_Dlv&1kEK]\>lc ;-4mFDDDD.Z y̚y۱09ϫc(adܰ^rҦ`, D&s@O$*9/7Ib4i(ܲaݜyۻ..g#hH\A1p$F1cJ.e9_)e Mbjj}:WzyY|ї`kF}f-[ms[]Gq)_>ܣ6H׊؏ob{0<k_2C>9V|~]$mO[#N.Fhiy?O*ޟd(OUq;~ g*4w ݫϼҎGe<ک+#{څ{.3֒ر 0ptoQ nZu3g WV }mF0U]V&/x3 gIb{x^?XOq^lu)+&}Ž84k Cl%tE:Z0AݗzsxN-0fi{ur]4=M#ppH]:&c4REBsr}pmC$O"'Ml_ GWY?UDN<^Z"ylٝL- ur8#\ACz6܋$E!o-)>KJH]bfxmOYpUn& xO^jIl'Y2v"ctOF iONDŊ4wGrݸ\.ȵ{*Zg}Oh4d[*u'ɑ/mrƬvtՈdBiFB|<]`7e֌;K^iZ:gqg` Fw³Ew~cύ"ls?S! {vl6JGg,ޕvm>>!M6T4U_zp04Rn(q\DzHY~M(""""""@a+QAD%VrC~a;#Y ߦ "/)\uǝ0~Rq i$E5q ;YT$ DDDDDD"7c2gѵy)dCx ^&2V""""""w 00 Bۿ[d)fuE~z6qçzt2.g}l>փ'f㾩Kѩ9]s&Iz g?Jj>~&}?fsܠYDDDDDDA]QlT8Fri*\ɛ-G=-]d\é'rG&&o lg&ƌ94kNY5ey+K@ST}7ܘ1_ȉ]<ә aSf;ޖJ.',| ۙ'*卾yYwta|ֹ O /-X'*f\+c \ 2&͍u҈T0fA˦}ti~"0nNR)\i.-8;%2?8v,}y >^lY\Yۘ"v][Z^dx-vCajȊq7pn,Gx;_1#D6ޏ'Jz_GWGJ9+bi3v;y:bTt*oȁ|9<ݟGgW0g}W.|mbs|ҽ{_"D;v K2gËy38u`Q d6;gLuP=#;B/,Qj}K՞fORN&LH=`?䗄t;a4v:Ƥ_cBD?t<,[wUqܸ?3a9&Eqq)͟c[p"795y*_{峔]6'mzEDDDDDD@\`e_7 sE:5׶;+ )ݖ]3vBfu)mKg31 ]ՠy@ m$ mSgka1;.:СBJkI-w׏m *I[wײtRՃXѝ}SkEWυډܳNh\rmyǯZs֤^!g¸rk9>ΰ4궦u4R Ӭ>?P(tbqN=Ϊ3Ei^3sY#(ӄ3=GRb{S9|jQHw-E:q +l:nF iiSݝ} y=pS 5;3U[?ۍ~Twƴ)+)Xc*F}LbXIJl&0_~߹6`_mS^E?v<8=OܵBʟZ\$ĮB+%1#IIJ%lt”ً o+Vb.b9w`wyjw"vvF{>}kVEPMafXQVsmw`ucĬʾb udBoe%(DLb*žG HLzEDDDDDD@+B07T]:׾5Mv&*wΖYQgCnL0e>ɳSj6z궗koIh7~`솒<$|3s^{4܇t x 4 Kg)фa=.2a0K<} s볒%=xSEDDDDDDDM8 gxq>@_?A#DDDDDDDDġ(JDDDDDDDD+q( DDDDDDDDġ(JDDDDDDDD+q( DDDDDDDDġ DDDDDDDġ%'%qi>yvo߭X-[LwSDDDDDDDsiX]|MwSDDDDDDDsiXi)#}K8V""""""""PXCQ`%""""""""E8V""""""""P*Pڣ&/KXjv """""""\ O,Z :k;CS486x8çIq@WL]Oy(+;W|XS """""""@)V:Z4nj,G0okЍrI=wa+*ӥV;u+q O W`%"""""""HE׭ )ˠ@DDDDDDDā&BDDDDDDA(ZwCϛj}ĖW2%ؗ,mHY?k05\ \߬^!uI\Ŭ~NY%""""""}.*<\6vˍ*Q`C.>:rYBˉxAvz5ivܚMV N 1\m>o_KvҫiXi6|3ג_ ,L UBxE3umgX)YL=+Cb{Ho5Iv*@@a6hΡ ymR\qn]ȧ_XrzjU"%= $_:][k ܋qM5s=tSGNeCZIo l:B{lB .1oZjP 6}5KQwl>r7__i2q<&&>~s*[ӱy/lmsfLױ׫ """""")^0orN0Ff͵ v^fLAL*솷.}h~7[]k/ꎘN*7і,\rzk|t͓]1oj"] P$p;՞|&nhyv iebѦܜF#[‘eZN-3|nSgF|7C7%dV"VbG864AX*_Lb͛x):͜LDTG0}ҢegvoGPXVFCAJ$c'sLZ/>B?;-┈{[2l-+){0"V8U屢%M3gp-4iۭEH)bϲ}l;F\L>2Y \7j=B3O_-S4ӎ$:{kN,#9)OvAn !jnlsĮA4iSJ]33Yzv1n_<S :V}?w3Xiؔ_ܵE7ھdķ[* ` [ֱzq:wNz^V.O¡DqoʮuN֝3, T)gU B c9huc=u+  p-"""""""٧`L=Y(\ z6,DoW3,;q7jQCX1HhRVޜFwwc1yfY;sv9o=MSH9~ȴubO$,<nOl㔥Nv'^NX0DQ4 rђjLF85JšI Z3h7~.1ҜH*dgNKHY*L:V tWU=c"_Ke^% ̇JU|nqVn'W󫘐4;捎2;!1X9r $R-_^ 8` V93&hִrq}QCS;}S7+ѧq|(\Mf{VID?Y2'ޑ^V|ʕr;/].yl3c q8 fhҌAŜ%!(Z=sB0ߥWk4kUE{;igؾ-9Y.p$=w rc[kXeGXw6uַV9 fi7.Q4o6'k,iվ\&sy,P&}ywȅSB Wk ܋qM5s=tSGNe]1lg]F<%tC</IӺ/hFSY8i d|dX՘u8S>sύ^ADޖq8X R)a ĥީJg'c` ރgjp)|,?WZTq]rgaIspC~[ÜsQx7Bw^F)Emv8 mj@R1lb[mq"V2]qMGc<" Qw^!ZOfԊW$ʵl@ww<3Cjj VQ'tSyґ@xN?IZúҲ]#zzFԛQY+f1#P vعs RDThHN}t 7_ - Q{f|Ջeyl4Db:{2ʤh#r-No%?JFKٲ"½ӯZ!leSU+ 9 Ζ06͜ӤYl>"""""""٦^e>ego.Us,t l| t1$+.FRK|TsV(1cɇB&+!~fȺ|Ɉo2cU49.҈Py!v Rp]#X=nH=y";Wuu60:yL^ۭ@%LW;:n5aMvT[ g]Xt@<'ctTн\۟C6E]8F;VgX>S,ͫ=L= sF.{$!VB-S`â] <&T6/o@25e&Q&##̞r5͠Wh3B`-$vΛú|ORNmd_!:1.+SjE0 P=bDr*y\ @ȥpR)'XE_-1xĆ_]B7Y9>;s\-iĞHXxʽܞj)K&O ud;.a\NzEDDDDDDr%0/SP4>\53)O3AYr]طa&$ĠnOn{|7Oѥ;n'W=hc#%\32װkkX5ߝjpKl @-Ο3leYY|]ː"-I>mQwr#\^s4Z*;šgؗK(a6%N+#88ms/0Fz 8Gyp&qɒV{kB8~³6p ;vb`{o\S\ݵBtBφCp>.8sE NCs1ɋ=б]ƷN:H=´SvpK 8PRbM\ v۠[Oa6ܹyf蓙kWh Jo[t X92]6ձ /@_` H(ӿ˖ 9qflN|«=wk_-dr1&?z[[\6Sf~S OF|Ld6Δ6QDDDDDDX|~7Dꎗ'...89l3G9d m4^LS1EDDDDDD+{e گ)k+3suɚFU#V9}%I&j_BDDDDDD>qR _ ?眱յ#/aꥬ_}*Pν[k1u'""""""g=-ӕV/eJ/YgK(kLj6*~1_oSMdlք'7_5 eikP?~/vb>;Jӫm6v<(ں:֧Z7lX;K>pIlރGsV9H}ե) 8|kfN=2ՓTl: CF* ưe(SB86|Gj{t)q:6)N^8GrowQ^ZNƫ%2I֤/nBpJoycZ°^oH2~8GgOCd" n`aZ+r_|9t:s`.QNw'a$V㞠 hN~:W\ WF?S fX sٜބ t8yzqnY|֤ȕ_ys7lo;uVoD%c,Ǿ;)k^tV\8B./Wq,Gdo2~y1x._ь@_qvp4Isڦ+zEDDDDD_)M΂Ib0V˼kVBG%$a9(n/b jZO|\ok3y:?]qbl`=N#si PrihOJn=*呢%E V":mmY2-['3Zj.S\/TRy_q$EǪ>n#q+~3 RyeT[GiWY|$ܓ's5ZW]Ko e=K[DDDDDDg0*gLj7\h9n-l-CMV;xp,FT&í&}?och⟩1gms h3 y#>XK\"|Ȣg/2!3)?~Dȷ IDATd?owqklRq凵v6,-~rQ`^iS^;\FeW)ucbH xwy| )>Em} xI\RłS\ko$tkuM9y%ǓxNԼZ/Shχ+`vR H ńݿ7ˬ% i7O*I+Ċf Sh^8xyDƘ\+ '(WIԋ+""""""KkX+7'ZSHaWMh+{n$0Ia'8vŌgt?-خ9 Zz[өeʺdA\iϷkCGP0Ccj=͸߽53&pִz3:f3xW+ɃذXxȎD;q@TLv]ZX 'LXKq3Ye*$w:v?-GKcrQ`ogy%r<2IJRxoÍ|Y`mOh0th(Jyi/+N&Ct@Ѵ-C[W$Fh_>Ržy>);73H#;7}o!#G2hH>X"@߾b<1g/NnDDDDDDDrFX3yea]Ӷ_C\Scr7ƥu?\ϟ#8'#oF `*H/90l?ܽ{9L.:VӠ77%,ퟯQ7n]JhƥdM%7+քp4gmq}Hߑݟ%b/c儻|oߛ. c׹q$郳9w۝SQˇ3upjH<ʗ fLڄ+rb$fǩ {IӊN܋[,nщ-z2>^< $]9jF7STKb'ס .[Md;sFCrS!'ӱl͉Oxgsnmn>t:x˯vI½KHqS6ocHMC7E?OnĘicO|Hۂs!Tw+YFX3܏Q0{x4LڴSi*}P:Uӯۭ DDDDDD$G)4=?|?L!WF~ݬ)jӥ """"""9O< $p9'/H"&61[!14_!""""""w諽r#1~$z{&g"W/t m) z7[U=UP ?lPADDDDDDD! Al|z)S}IdPn(ť_3{uR}'g&<6*~1_oSo}֯ċܲ78Z?/aW)gC'#GgpV&""""""rM a<΅+9NS$6of9U')LϠ<*?~/vbJ!""""""R`Cb^`23=p79/RkZހ,ꐇM{8ekǡixmiR 4hꗡ7N \M¾Z(; !N4nP7u;ߟV3;L]MyYFa/C9xͫ4 @2JLy֏Vʌ73u`?osJ:aMs`Tc׭L.9<7zqKdLױlN3`":3 B,~Hna\XWUY3pcd{um&'t: cdfff~v=T*?<#i;gެYg;P{;j>T.59w.t{?}we`w͋NhN[KÆԜ#=^1Z+ǫג8B,al9kIn.VnߋCjvW.VD׹hVtmOZ@{2WEC2t܃0oa녌*\8qJt)t䋇Xv}>7F%3%7,gY3yE4Cq.rYqNgif=au7|Qoq̈́XI㈊NBdGٷ~7;Yv?WG>y Zɑ~#5ṃ/Lb z]ȽpR ?c~sUs/^oX Y8Smщҫ;~dPR*?BxC%`+'̝8Nqdoc$hw扦x 1fR6ˠxņ佰n5r_~̉D{C;Pp>LiE LNZA83s<1kNY69v(Q\""""""":CrS!'ӱl͉Oxgsnmn1R静|^/Eg5J"""""""j9_CU;^^t,g&;x`  (έJ()"9Z׾hۡsD ѰVn]TlR`dgxu(盏̡^t\r$"tjU\&+vͤ9Oӽ.VIVb}Ƌ|%+HU zy_`J!""""""}]յMD7fWrB"B ,"""""""[]RO2BʏұV:; oO^+]x87 '(HAV^0e\ YAkY8v>\rz<Ӭ8Guq:f]Oy+ID?CCrR DDDDDDDDđ(JDDDDDDDD+q( DDDDDDDDġ(V"""""""LP"""""""Lu7EDDDDDD?G=0UP:qh (ˈFPAmw\Y5]ӷCQ`%""""""""E8V""""""""PXCQ`%""""""""E8V""""""""PXCQ`%""""""""E8V""""""""PXCQ`%""""""""E?I&$ H' H EĂWTݵa^Xˊ]( J( !z|<0{={gysI$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)XI$I$)){ C0$I$In*_C+I$I- fwVI^A$I$IByEװ ˽p$I$Ivzf۟X9P$I$i) $I$IJ$I$IQJ$I$IQJ$I$IQJ$I$IQJ$I$IQJ$I$IQJ$I$IQJ$I$IQJ$I$IQJ$I$IQJ$I$IQJ$I$IQJ$I$IQJ$I$IQJ$I$IQJ$I$IQ%nH$.<?\y*u[usOئ=$I$IQ.nOPHUZtlNxK\o>K6Ux%I$IX']ʁaA+g^}sxcV)ɞã9+YT%󡌼t Y_玱o UӮC/ubLoȆ~<6i kd0NhCU `#s}VIs=ILoH12:F +uܹHt YIniɍrgqfZ$I$I/^$I R2N݇/[g ,o݋3+OD'Y} 'ą#5n5ߌ[gPLփ7rS_#'5Ckws=_OE @ħ/>Gߍu|_\FkF2eÏKٺb_gRԴ7gfŻSƖqɑ=H3_qx}u?m!4$n8&ҵk?5H6j+T7ߟf!cˇӲgɤ0%z>ǧ{^o:ەS#ybZ| #Xͬpm%5һ7֩D9q}%;$I$Ij bXϢ)Ym#u$`l>bۭuNFol =Ti܌ΝrIء†-?5ԢJK׬a|%dsæNwX]o3˶is!$zuyM9|z1a&wr2nH=8Ch I$I(+OVyAcf*UatQax|`zXʃFݴ}=>y2q|d{'>8/P$I$E=z 0^,UgƏP%5B( ڴME J|WE\OƓ}Ryl&foo,ܖ,Eq kSQ3ZTHZoW<>vS&3VQ_ c Ypkk?CPxfi}$I$IFq{rʃFtξyDyY&v:>Yr՘Zʫc?fzy38.n3Q(O (InG1uSuc 6^˛/T8bt`C&5dGo2qkH8,G7⡑xrԛ֑2~CQPi)>H$I$E=8Tn9=ݏ.l3Xn2u- c$)^O&5RMpg3`iC#9t|n kyܐQh2Fx&N3:5JjN&wyx4iSK"4)}$I$IFA;*//|j=- 00^A$I$)O5-NjժD"bbv|fΜi߾=]t~[0I$I$E+I$I$E8K)y6/M8BH$I$"$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRT1$I$IRTwdm\KiI)I$I &&HnO bG^M$I$I;A@LR4b $I$Ivgm}7'^9$I$Ifg0?bU$I$In-$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V$I$I*V.?X I$Ib?3Zua'?”I nO>`Ʋ\6T^: ?sҮTi8^&O>.R-fq>5c n'0èkS?⭘ߥ. aİ<&^*Ib'seN\ *]rT:R3->}x?# o9˹sd\.r-pu\ISwع.uqEy_ pǾcm.u)מ!Wפaϡ$In IDAT,:H=&-S~ ͆_ƍa.3oŋsݿ>0?u+$7hObMI6qʩN,+#"<}ӶV鍈˝3w=ÇsT!a{K טKaCNI$iZU IQ<ֿ+F]ʈ6qH}\ÆԽ8s9s͟lSj߿V!K_~_ҵ%ҨQ =2"69r 3dv^Ȇ&rO5p5<}p]q+O\HA9m聴+ZΔ +}&7;)}b.goW@!sG (o]p$`5+SA^&K-{"wu{0䂡 ]<ɕϦJ3ª`C.(LO'Tƶ+a{V64G*nj8>>k&Qy<"9͟;fKjoN=gڇ5ݷWMH"ի'͛73ylHh9:(cZg_Maim))KX:'^U 5E*uXTIJ6mkT#]y[lXLy*ɮS Iw4֔S#xQ4 ~H:)Sx4ޛs.^ރjS5tgdM7oGL.nJxx!՚էnEKdgE * OkBj$y˷K7mWitm.Q3ZnN8*ϟ믾k<%#۲T< D>^O',%ob޻Nꨳ8),+Zz BrR<5zu##'_Nfܝcd (%kstx~TԀ0>BB$ ~ &[M9TQܰ埼f7o a}š$I{-9 {$ޯxY.+bh3\vt.zGz_ֲ'J:[9s<x~:49t.H1qkDS" Z39,%7-rR*m^2ʈvӂ>]krǓ5hrnmuzwF >'qTה$IE 2|υu`vC9t3g=ϥpljxBd,S,'k(K9-Z-wT^^Nii)yVs.OIܻLYÚ-%ТG?N8`%m[4}&< /M]-! Zַ9dza&J+Q8-x^K>I0e<"Vl Iܫ wSëJ"EGnԽ\*΂H$'s2g  8f-5 IQ<ֿG1 }A w;ԟcB\YtYg{aSPz9"+>c{/ (KCIgru$Twa _4H iWիDVYI$rAϹ ߗ1kx O v2U'izҬonEtKBV1EKxGx\=9{h'P`Jb3ɧβԨEr|R^#$IM"˗]lNhɪdLiLӛ4 e#d : 9Vmri.ɍS v+dE/!=GS㔣P\5 f\?lwm)YBW1UiS9h!7䳥v]BȚM(nܮ>K[Y^maP&+=/۫D$ILViBCW$=,HjTEw#~ƽ0'0_Lp5VҠi}V.^EqZ#Ҁkd<'lϦ j,^ٵ2/X~=-w0'w4o™ үs]n}OKlXLrr@|RɛD> C~DJRe 7nK%I$I {^6[ԧn M#,e4k܀HdN,EJ@AKVV1}saz$IuөI)EiKrh#qG  ֱ8RS+>ƈ==ү#/suo霑\ݹgY$Id-HxZ?-ϻʉ]Êڴm֙_3ja0> ()!䧋Me.ayLmZSżx&` iӽ9YLAԀ%dq>4V+uʰ[py 1^"OqUއsѝ_Qcٯ[^=8l( UJJb@AaC!1$IP1*)Փc2)_UiÚؔNl2TZpޢlV֮GF|@\N'=,*KmY$uiMh (dC&r[1.m0>SϠL:<aO~zLV9щ:1\=ﺔAC괠qyߟJ•ώ!q- Y4F1ӳrֈZSy 5M!0/; qŽ%5{p~oqlQ 9cc!'RmO<үVlޢU݂y|G唖RPKg>Y}i3fcw@ڹ|<{At[拲/*ҍCL'jZ-]C/mTm괦UgqHG\r }/o)sYx=1u$5g>%Iv|"HQά'YD#&fO޶KnoW=gMvM\\wc2Kj',i.<Cri: k%ƶ@'B1}he.mҝ>uPn%S^}t:SDN>dᖐD=d\u+:9^-p>d&Pi {KHZĵHsY4moUܶ-́}3H0lGFаhRԨq9u?cǐ ਖMև#Ncl@iS?ѣ tPnޏljؓi=3h߉}<aPƝt%eZWu,H$Ikr?Eٸ|~ OfYL:wnE˘:ɨCل|W=%<'SS)(J%B{4H5jDٜq27ޖ w0|TU%/䰆 H p`$g‹O0u! B,>i'>^8"O sc|ڲO:%l7 ΝfFhۮ a6sY[$ Ll>LcΉ̾.5M0SR83 jҵU]ٍpzkT'5g\|,'sÈ;=#Qd݂ڗnqe yVN&`KNݹ:,x>"H,ds GYI$IE)4 9<#;U4]Ve */$e Ss)&B{.g?"gۂXGHyC?<ϧcJPG}hz^"eֲu,Xᴻ󣹪Wm#JXxyTwҫp]ZC_S[ӧa ,We?ܞڪlfѬߔ.MB"fxPi|SzgTELY[}MKCl|^~o1ACoMIx 23n:!s A_YA0ġ BB(Xú8tnJB?X*h¹|SWBܳS?9YgX%I$e9Jҟ(Om ٴ-*F%mY42={0*k%+DzߓBۊQI1gb#i3B1fĥy!%zEtGv?kCy~ ,c¸8 mdKwS{2ɟ3;L1Pu/ޖc?9|ϋ~:bPvn~Ɩ2u>ًÇq IDATάUs>XܓKgk7ܬ_޶\f| (e%OM6$N/~MS:p59(]~* [?ToU2yKGF^R 6-ŜR&.o~l1[{Oˉ)EA=>cRJ#9~mǿo?='9%IyVw 唖RPKg>Y}i3ǤԣQfU'bmϿDBl2UShhjYIfZmzF JF*WGݔ~ؤԩLH$Iҟ-H+)mԁV␦i;EtDF e>ĝ#'Iъ0y/֫2Ҹe}bUک}$Ihc`%/^Gq?}*ߔAmA= =>;V,fiPi(N$I$E+I}c^c\6U߭??1TS6x S;y)kT2v&7 lM07νQ+8,{ -"I/ξLYϕ<7}1窞ϤlOi\4@a.S|&Kf^HB&>l^wy0Sٻyrg3 (_>Gy&ʤ6ޛ#ʩ-9o|Bʒ*0|q'ȖT?'?>1Εf~l"sbo\4Pw "+gIOKyK$IIa%{:[hw0.Qu^f xܤ?#FG5yn@b,^|q1{v&Ll'0]21Dr>mǰQ'rBF%}83FAYd7=;E yxvMu9&G#O#[ܩt}{V:G֒igQu\У&9Gg(67բ '2K N}KzCPm9`zT+bg/pû9^oߎ;^x' 3`o$I_#$yJԡ4ь~өwQTߓn:-wA:JPD) "  *(wH衄@HH/HDysnfv~fvN?߷3 tYyg$ Ϫ hY olI01ZgRuƳO1g z-q o6ZυdW N f^ xpIeެ:e[ˇƟvppKofM0Fn}]^1mGh0lr;{ ᪻5S 4{/E~6mom۶eРA*g)& ~\&p8 ,I$fx\l˅yk׈2 ROL_r9a\٫)P^gD0L,,?u{#& I#LdZwS&;vG[g~ '.*_(}i@x<{(@q}(] dX DNW8iY w8Ju~M^)QJӣ+yI1^2-3S7F`.^*)?e\xV{n3f駟W^!11}ڶmˬYprR'hR`%"Lܚ _r-ٿ1ѻKsmI<2,3J=g2-½4xKd72z_|iW^7d\e >Mä`w[RF|:ş7m1Nb]82LLwl?ٙyѹsg|Mڶm˼ypvvVDDDD?M‰ ޠ%Mu0EEf8SԢ9v)/s[91pp̥}l{-/dX I%Ԭ]Gp̊|8:q>|/%e.^ʟ/sჱipZy9/{ ?s eW`|f$Gč҅sF|, .CtЁyaI"""""XD?\@%';m~5;.PHMsw3iLƪCæ%S ܉|U{V9$d Zp"u+ܺW~3Vҧ61s%k6Dn_bYx+64yK;6l lnqMlSn歩s64L9=ӯ}1 teRXh\ bśkoԯ2Bjf柈'h'zVq?f"""""ea%"oX>77łd{uw(Gs,[ki"*a,i?{%c>4ZKXx(l0侏sk=i71`<[f uy/6\5xiׅKOFMz[5xwt?:s!x|&8J| =ι-ɼɋ7Hȕ"wc0#e">?O^qƼՖZ/ kMc׫,o|10t#Hc/Q <(%%ALL,gZ/0MAtd5 ~؁Lٷoh?jGk ۵pH Șs><1eeȹ`0MpKo1\)¾m!ɥ)|oHa^ex1Ks(-xa,-LO}|s*fN6o,jAL>Ǡu]i1 3~\&""""0Q`%"Gy~z7|^e8-cpYȕҾzǏ|K)]'L}N6m0 ݫN0=R\+ސw3l`0E?ץHHq ѕXЭk|ޫ&{ɼε.8;GݚK466wLy#W(+~,_Y~@EfIJϫvWɹy20HYb[K>gBAGxN>uy۳w-.lvKn7s;a-),x6a3 7<~1M0rR d_~>pr ;JC[W/@v!+|v>ٽ5;qZYE|q\]5؄Fta,Qsf9,qvM.yG<0DDDDDD D$D89.qdVx!@H|8%,^qyh*.ϧyaptWͥe ;2i>ڦyu>^JdP5jkiԢ simb_w9C`A4IA\3 ,qkr 5znB?cqN݉՝M+Ѳwˮje/Ih_ ` bx{s.?fZitĻxB9iN9Uj/p 㛳7/0mz q*=[.f{Y5ѝK;EDDDDD+4O~!HqE Äu N T =l'_ʫV`hs}2X#:UmMwzI;A`֘L\NDDP. M=m{Q59[7."; H~*G5y; {H% gM 2hj}!!cv5 kzQ3#M=rk4icsB,LC@LßrP9㬟ۅiO g(XMaXHWofSr{qu;TrMoy޶<.Z7og8$?lNml9 u6/fia($|{ez!;π`TKÞǫ Kd傑 Oh28;4ӛSo,?I%̒Ѓq^''xi@18C@"Μ1w y+"f+cR>}yjP#C d[)^}[Ngs{HA%:pW:6Sr (qe_\Odk( fSbI\ i0$!o0b#B0dSq(P5wEф("dl-C|s&#Dr#;iW.Nl|=hYauMC]st0GcuӋ?B=D$Ә?=ֵh:ԅi+Nʼn,;ͦ=KYKGڰUiHv}(Z鳰#~XnMiZyKbߥDZ铮poya3%{ҎKĚn䎌,lU1v_`)=w$ktuǟmkv[pXQoMj Z wRӊohڵ?Nݩ(Ms-bO-De ܼ ܱv̳;8B4ԍ/"""""(^x?PJJ X|#B/U_DS\Ϗ&/} ~"bdVFzp ECED% &/U""""""V""""""""(,Ed) DDDDDDDD$KQ`%""""""""Y+RXHJDDDDDDDDV""""""""(,Ed) DDDDDDDD$KQ`%""""""""Y+RXHJDDDDDDDDV""""""""(,Ed) DDDDDDDD$KQ`%"9w """""<V""""""""(Lzd/?ޝ'Zթ xovfvIavXv3SX Τybɻnd,ZCvN̈́=ho[O^]Xi7>- 39f5 """""âH+YgX`%W/OVfe|x?"%Gs~NנH;gEmlW55ArN<ɺ ;>Vݚ"""""pP`%".TCw*?C9QUmA/?gl8yNye[m(k9'>a~'mlcP oŚO= gS3/^N=+/R-בA$f0yQlZPz;e{6KSo _%&:IOlnNGFhWcɳuLm˹ ?OǢcy.O!xUsڛF~r{$x.ܷyKP<*9L0ó0EpJ_D.ABv>êq߲d ͍{2C)\uˋH&Ӑ@t.a\M !߹c}޿6 3ӽ3˾M~¾s! ,X{7SC7vE{o,-dCip&cz8s_?se&hM=x}F%sxA"# IƯV=e7۹PYƌLLVy`yt!ΐl3)&VJ7( #׬<.Ii&̹D6k"[h"l6_ pDӒCħ'hTqo͇'2^_6'EDDDD$)LgK}}qOסxe _E`6ѥ ڽŒ1ckT&\8}9}~ڶ2M:V$ j3ԩMp_'$"pRJhTu3vmsPqtq"\ӡKe VjF2nػaJv)CJ>Cv8锛FI(цQ?~ŬaM(Q 9c¥?1"B" IDATIƳf+Z.N.(s{;_#RpN<ƚS4rYԁl/ր~?<ץJp <LZU)i ?ücv*wF. ٫$+wY"""""4$PD2Q)̓i͹קuj&1x}ʤ-O -6хN(Lz=gf d??Շ6ӟby%wVuh5 CTC3!l%xzXkܮ;Lg$3:%^Oq3I4J[qsEDDDD$sK2JIIpyVHr9{?|v)+Ar 1@o {:G~eAr)ZVȇgv>1]/|Ƣ98*>F,5pxt(@NOݗZwAW)]Ny(u:JѪT '`K$Uṁ=yBHoY/p4>jY /Td߮h}^ؓVsõۙT~M.L/nX\J39oXm 5+NY*}j}\渙|Xڏ_~lcR'LesT R<`zIѭـfw16 """"S`%"+39qXn1zoM=|=a; R5+^&;#$kʍo^y7GIۼגt6WxS;+ҭku:wǜk sG)YBݨй3 l z̶uy o4yrxlJkѷ|-bKy:Ș+<=u}J@wXʡ{ke{(d0qzt,/&EjyS5~1ҽS%YMH?uü{#7j`9fPl ş2iKYZԘw:-{Z0vsz[敡=*#jv;qgJ9)3JI$|DDDDD Dzӊ9Ͷen7lv7k1`@\40L/DHNKņm;9G}Ca²Erxw,9\2m_ NѠu>wI On1ۖm3;6jt,{2~oD{M )7}?b H,MM6+>yl$nkI 8y=NH9U~C8ˡ?fۖ^ڹ3^T[`xӖ3dNq6l4)v3eVZaN˴M 3 HoCJ "v#%Cz@᛾ѿ` PG,a#xay\k(&E0a" N/7dҋor׳sl34ɤıc,~O'c>a3Є?p3S:6< ~xKbSH-< X#ÚjlVL a'z${ 4"C?I[y#&D t5.9t,U_1kgYLJ$o1o/9z$q>!"e(FC25|&.JNyc#N׀ȣB<2<"npۊ7;V=I8r1VdsolSFuP?n;g o+K>w*NrZ>z[ va+O. [LOmn̆CatoV_c4HJDV2c{ުݐm8x!\q\HNvi=:?ailaoRu3hA7eſ8,VFƳz;niWX8|}'grXDގx.1\޹kΧwV֦`j<=:.Ж b3*OmU0:pvg.{}sϙlDˣ8n|LÆ+JDDDD$+2(e &&3Ky<Au[)'_/Z?E,za(S*0<A$ ;׋<''QQyjj  P+yܨڇ$F;?'dFvűy 5񕈈HVJDD>1W mH5qI̘sfdaܕuHJD>y"qD܈$ \yD9"",Cݏ1rNIRV,aڥlX}ʩPY[kґqҏAHCF|v)S 8'gݗ(wXpy~?,f[pж=B5x$nO'd]hCqGa$^㚡""""o""ɼ//uК+l^mgkc X y\q˔/|wH;ה Il4ϮZDDDD$R`%"+ZexTD1w7h"*ű)WG)ZJ)0v1xʹ_͜7L{eyȮctFw?9 R9'9p9o/p _ϪZLƛ0(%6P!O6#< !o;:R/ϲ|AbxuʂRϰ|3v{/wy7(2ý\.;嚄[;ߏ}bgcf-^^yl3[uJ`3c&Oͦߗ\'Cəm[VΫ߱lTssR=ZoptD_|'eOs{T߲_hȲT}7kVsv_ވ>AX0i N^""""!"P񼲛93d mj}7%%0g/v-Mw1g[ѻ`K=lj 7:fMO\)޾}~flȜB8k:Irv {2qG|L*x܋1zoM̞0l/}j>4 gYtыn\]Eex(8 V3_˔*?F :q\uĒS h<`ŷtbLxy=N)VONFN5ʼnm0JT~[)T!/e{\.*>׏MFj9f37^Żi?Fk1#Bd^҃! =7%jn qp;/'ȦȤ #O=Dzӊ9ͶenJ57vƷ,9L5_VL9}uKݶ m X^n!,cU&ÛPt6-a~fbM>?1Z W1< .~?/5SRaEl#NήQd B̈́|r4NDRAcY.פfN 7_}y#Dϗs0;fXL;m<ָ8 ¶beJqd8Jho[ҵ5,c-WZXt,{2~oD{M )7}?ѫεVcjy9G [|6+e`X-~"+@J}A̙=,>v3EDDDDTyXB":<޷н)n#CӧZ1rٌWmVFv#%Cz@᛾ѿ` PG,ꖱx9¸5|y.ܸ_y 1A?-ܯʈx_3kOPN.]A"&I^mS?%pԩl7˄kbL'""""K2JIIpyV IDATZW=S׵; )4 _S%jS=xnJ"{ayF`d1lJ6?Erp`)rU|< 'YKǽ„w2WιLOYKNcx\55UybZz䕇GqrQ]^LXDvǣ9!rT+⒖a?/=f3􊫸#fϾ6MSxJ>|syE `:E¨:rF BZaݐW\G_+nhnlu2ۊK$IҾ4k2li>PQQdddRm6;Kaΰ*c"i}<}w-On,$$X 5e6>DDD,etVQv $\qc)7ѹaƖB#I$ $we>yh|7:|B*Fc,^~d4 ,$I$.x!.r#YeVrKyRH$IzK ϖݑkL,fdxodZn$I]%"r0ڑ\z*9:ZI$IR +I,^H# ,$I$& \ ddI$IOXIoHND`A$I$I(ndl ڄgʱ$I$I%P~];g݀/X<ۢH$I $?I X|h$I$v  /?bH$IJXIo*פ&yXI$I~.tfM .@L^eQ$I$I% $'%v$Ig-d,$I$FK +j)$I$I{V$I$I*S $I$ITXI$I$L1$I$IRb`%I$I2J$I$IeRk$I'IRS7E$I$aVJ͠SYI$If`%t=+#oIӖl.Itifq$]jA$@Riԭ#u$IV$I$I*S $I$ITXI$I$L1$I$IRb`%I$I2J$I$Ie$I$I+I$I$)V$I$I*S",4w<k<֓eA$I21ԫ_Hn-}VJͬYda$IA*;+Ks3k, "i0Tj>x IVy⭌^DXh/ӳ~r8Fm/JAXQ |C%fx_p=NuO y״,ּv>'λ>O"cDR7ZI$sAh#_r|)?ݡ]|[ uhQ5P 7_ub~r*$РmBrP~Tu]_<>? S5.WOz cCĪB7$I ټ$nv&ui+VV yɉ)loL!ْͨ–<&r 1o"?1XD\lHG;&qk=.qyqu9$$n51h ^ )3Dtt"\גd~u*qR ֝ Ԓ?oŠ9FޚMۋ2Rn?-cer*Pm~{<ك6S^HܑGQTEz5W,._t-R~u<֟<yԫYhᩗMJߙƶrԩUޣD$Iʐ̤$jL>}8|L,uŪ;ڲ.bCqÜH=$>xG3gyoocM6zM~F$BU ř9q^g{vO6r}!uZ%,wt7{OKW<*ߌ%=z fɳ *Ja+M1w| OojClZ@ zϛ o]b=J$I$ IIL!q]jW8G1٤A(Ĕ2k(j=kvHJBB[CVu B$'gkUh|S@nȪ򴪷n#ridle'TW|^W8u:S5M`ƴcIrv|/̗E2g r7svx %J%I$Ie/;ע!'M9"·n`]VMmF߱bkqPT@OX/"V6&-K&15F5 ̒(Z֚]oHf}t5U HZERArϦ\ñ45UnG_to}f^otVĶ.:/X=4?lwÑwD8nLbxvOA@[39Z'|NUa$I$5[ױ" m QnLWדߘV!MD^Py,֚ ?dy M¤UPU(LZǺ !Uj 8Ly ͷ/O"?/붤EWU&w^nJ h5^^xA}^}^xE6eC{q_rv}vo֌Whn~FK"vM+n@,*W.?ju Go_!bQ.+E~79{^I$i\iﻈ#{ӧ`?\GF Ғ+&1zN*>7Rhr@˼43ڲ.@rb i-k@]m_C|*9ʭM+>HFr a̶̝ZueIqМ*TOQDS #N-ګ}Y1o-QɫX~#v)>PH]gSYuU>n{0 ?gj)Y0~5og.ҊﱕkGsx㎾W>793;fOrMϦǵ=4f~/4<$IA)yU [ڣ_(hDkߪ.9O.F143Dttqu,I #Q X:FuDsS߀o#15&UBHL oT<5zw:j"k9&SpybqhnO%wA-C˖& QPP@FF&VaSt6iʗ=;?.2R> Q(HT9o<޿!K7l* 8aY%7/'w|6|]-Kt"ַBFK1#-~2E9N~?R`8 Y,-^DPize͜%Tq#7/Ej/V0 G_e3'UP %e>ӯWՇ>`AA M3ez>wId_$- T-K']Zqø[ &- 9VI£SS<%I$+IMLdymc|^DV ?=9+ټ-VGaD|<˲ DAThU R2c˞NVHhZMPiGⰪMp_JXL߮ȸpy9!NߺG6i;rtNt,JGPݡ496 |b7aNQTq&4iOɞ8vuA, jGe#~'wmJ< 8~=bjׂ.-kwoW'LhO*a9ڽPoM쁽INLṃRBPݒ~|8:mY* CPl'q{ OlKʹqgC98m]fI$IJ~GF~9f[bV|%^ek١%ѳk7C0 &-da6y;qOJY{܎ΧredNz bFlI\VBOxգvT-IY$>O>Z>'_7d{ald=7Iwɥ-Xs[_ oEC[Ҽq դg>GG##:uǯVҡ-hmqtscȷҶ s߰mށNB'quO2#Pd,AS.dIƭWϗvش9 ?ccDKh;Wt +I$IJ~S P@V#9K%vLEU9 nZV<򀨨0 ~XV26SġiF+f/`;ciIxI^HoJ",LNˁ}Y]n6"%Koܩ1BƟm/D,m5&:w-36}z':}o~< |du{.uӡVOp:JP nźl+On|ҊG*ؾmylګ +fc_3VɯgrzDGl-$ʞVOy$IRf $/( 'Щ(ޜO$})絬ɉOϋK#жh/ã:tm\ vg 3:+sֈ3Ye+:Q<>֮u٤l]w{;`ɘR)˙ZF5]0ذe!3ya6Qmӌ<YDnP.-\ ЏZtr.[-@q#Z@}٣6mOj[BT"drAɳgmtehβ$ITZla%i (v|>[ ) jЮImmc ;t w݆ڒ(PjZՋޫwӹScEեGؙIv=9*s=gTh@c'4J(jVx}_3o}!5]Ε=*CX_<>VaT4uAZ\Ez|+jTj^% Qo\+vaБ,9r4)doyN8;7!:wKɭڅ`"JƯʮ1^gWhmwZ;n? giuT/T R7<<~O5| V$I>e`%i?"*o% melA^皥 kJ£ Sܲ+A9jX%'sCشq3YI$P $‚Bh H`Nv6v $IҁJ%$IRi2$I$IRb`%TT>IDATC)I$+I$I$)Vj939ܧ(786wNSWj'뜅{ڙsa=H$Ia $4ѧI|D|õJMOsH5U$>zcI!KXr$I$1RP#XjK3pȮ:Lz~[ &5(ӰT߃$I$5Ve_ē3em*; ֟@Ǹ0MyNfDZgsc0fKPV^ĭB>:\Ϲƚ12cK..b@͟z.7NKu@/yLYJvTU6kKӨ ̧^iIJ ]1G\| 7VR9 I#+#Pv=6_-N!6jÀK. Bx{(_ߜI"%]K% ѮqP&}?Y/~ÇKV^[cc'}Ҡќ5$zV #<}*5=OaaZ8;[~MR|r%'sGuW_MB|<͚5X$IKr +InyIh{e{%Ny@@dd|Sg\\u)tWY@$DBX(7XI.=(\:[߰]fުk| N񝧸4+>w9i^\H>sbhBDd?:;F>ƛ9>aƪټ{x1$:" (ܴ9˦qsIenu*kӸOa3_^ʊ:ݹxE\ݽ:|O?y~xY]e;K AT$Q6~}nݠ^)ߎO6x&LSNaر?6vXN<'Z(I$eJ_^@jM9 szhGe ȨՃ6щ|=y6 *1Å3.L̜Q^6'39]4 T= 3f z*]wd̘1[ I$[Iͺ%kR4NR2_ՋYA(|^zC-$I-$Y9] J+ISoS=6$I$la%I$I2JRp0g$ITZ $rf:!G$IҁJAPfu^}}IIFyqTQ)I$Ht]R=y1̘93g[i?;^G[I$p $aaaaDDFҹ[' n%77H(ըFcsNDDFfjI$X $!EFFWލC۷!??BBEcxx8/_[$I8VJExx8Nl\y *+ϳ; '"2H(IRHBFTTa?}~M$I:XI*=T6$IҁJȒ$I2I$I$L1$I$IRb`%I$I2J$I$Ie$I$I+I$I$)V$I$I*S $I$ITXI$I$L1$I$IRb`%I$I2J$I$Ie$I$I+I$I$)V$I$I*S $yA$IAJ$I$IeRSn8=S8\;`Bxqce"gpcą}攗es߿]m?y;8?eX$IT:",Rע'Y'/DR# +w L^S`hlZ"[jrdenCQt*;;8A ]g)I$``%<On7~ W#I_\7<>~+䇟el ڝ2hSqg0gfoVׅ5יF3!M].= L_MJѭ2ht<" QA\5"l&"ֽ9|37U&cwɨw,+ưrMf~SÌ5iWmH+.WCA=Ob4z\Y|W93vBlU|cۀFbNiCX:>qXKŚ9aaɺw{3EPsapKyK$I*ev T3Sٴascö rz^ |]|7'qv|8iu(%3䮏6DFT : .UX!77&2I&_fEAff"u{iI{抟c/q ?oO9cşp:`|Ҁ Zݏer XLTZ$Mg&UZ͛>χ;r7pM|s|w>D$z5cwGXDm_]OD"yV+<:W2I$EA$dOO}ȬOْykj6綷F7wfեwx2mH}N #*3I;X~G@ L5_sus0v̝;< >\>sԖx~C1BX1O7oc'S[ ]ѡu4e@DB&|ls~h!i@J'`̒lxI$IVJɼtϗOW('aMͺ\oԢCt-&(ZD_INv"/ PF]ˣ'^G?.]P;7#saoY& 4⬛c2),_fC.`b9C,#hOr$u _A ?C>l.Yם j`P&,Aq޿_a/@Nq9X!/I$t͚ -[7TTTDAAT[5MγJU1$o|ϝGN%I$Z_fk3+ODDaa]ZyT.J7jX.$I$I*[ $I$IT8Fnþq߃=P$I_-$I$ITXI$I$L1$I$IRb`%I$I2J$I$Ie$I$I+I$I$)V$I$I*S $I$ITDXIiyx'';+˂H$dbbcWO;N:ZI-$YSgqbr*ITvV+,gYD>a`%|A$XI*5)-$I$3Tj(I?I* V$I$I*S $I$ITXI$I$L1$I$IRb`%I$I2J$I$Ie(MO&1E$ID%d&ṭRiũ$ͱ($I$+IO^*D-$I$ K((AFbH$IJXI/BҰ{cjiD$IT.tݸ}^ݢH$IJJҟ."w_s3|6ڭE$I$xh $ذl>K?G Nʀ$I$`^z_\VV b+fp|t|ßf9wsj I$b`%進-p +I$I$wժUb8=oYuJ$I$I>$WZYIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/response-status-code/000077500000000000000000000000001461403617600243035ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/response-status-code/image01.png000066400000000000000000002210431461403617600262360ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwxTUI#I: M:Ҕ"^ײJ\q] (M %HBHBz2G $$@*|?s[s9L8t:N'f2<6!!=^N&,""""""UnrvYda &--Cxۭ*l6aPfѣ!5kM||jHDDDDD v{x\mɂl1 a~Lx<7j%77xOjy<.# wfJϱ9~,GFFiiiX,䯷8\Nu{ˆ#!!BJ/~8~,3 tT-/jժz=.<˙LfT}l5c1. 3j-{TXDDDDDDvqw3f̨ ={SNt^߲p:{=3CGX%?.Z4ٳ0ylf[YlZ{ ì^"rpx\.UT{ 0f(&ORάif)3E3`)o\?]"WÜ7j='lUT|cŮ?->ty:tgѢ<:tDS`_+Ϗ`UTc|m9_0.kZïj-U2aalGnNNl,Jw)Jb-f 6T%6NW9^$,/""""v_C,}^|r Nu) }`3竫K =(e=SKa""±ڋ^)w%w^h>nd22w+8'DH%|׳ / tYLgϹ Wgd*ߗ?ͽޓ~ xuf`{gɓ]- "\ըm`j6]nfS^tmS::r 3JgKEV^E"T;*˲Bv e3ۊfKGrL$"W{b" $ۺsI2E.6}_3SWȕ[h ,"""Rǎ'<,W6ϕN+}?|.y8dhP|AWXnN4Út x2kTw""""dpX,ǏVʶ {=v|.[.fBL7EO%g:e8&97")݆#3N~x꾷 ӭsYxd$plf~N?0 <~znDmoߙn;רϘOͳ'>z̞g1D@ --dXDDDfK2յ+*'Ɠ][7-Y$ƄalYz}+!T;c[7cFܻ3(!}yO3(m s?Sv|Er],R\ UݓOӷvChΌ™knOq׌Ei]#9蟼D%c)|X5/am2]ZӶ\7uʒ3z ^DDDDDR.Zn4N/h)^̭y1wKrQ|TlsϿ'; 3 SK祹>S~S{(husqg]xYYc-98F#fvx uvz7Sm3\diA&gw=G /MŬ]p:+;Ji9jѶi=^2ʩI#_ԣOUlu"t_9i ?-]Fk:/tMGnOKTc@DDDD|d;<瘳o K,ܵoW5jMy)mupרŨa]16d7A)zՇ$ U},>Ԋh5'ߒp^ xXX|IVvV]+DcJ?e8j;6mՂ2wAVH:8aKf-9^0{:K }#"^ /~Li3ѱD~ezpb#\(g}yaܕoAsO^sMG `m.q'ߧ1/<0¶(yßIn\3[{Z`o96?|`à+~ܰy ֣ [)M3U:l$0q]Ǟo!ݝ_yIO|K0gbڝ3#L'm'K?ҲbOx񽟈9%ݼسKңs3~_HA|)}Z98]uٴmٳf'9⒔jҒfV"..':>dY3y륪 e(ኈp0e$B'7t35WMc'Hrp#/f? g̨~Տt*v-Ըix+7_͕wi&ވݴ#q-t|S޽A;؁W\6bՓ>.M#C/e-S$2gy5 wap#MM%-3}1{|> f۬U.QsrlqOgaLDϛşOҁ.Ud{ߑ"+g ,'t'!<;zfafg21~#>`oGk52+b~dWi˲o`ĠnnXil?) 0왜8LӣP8/ -[iz2mޔkïq%3?Ȅ&Ң{VJVɌxm漩NFH8)ϽǻsIꑽ.W&}X5HUf :t{9\>5kyg?ȴGe)#W{>3]P2RҒ+|O?XDDDDJѸQK\y~Ph[8Iv`9QLrTe U|u\4ejOP=5g/)JRFXF%T_\_u/ehJZXDDDD25Tl2Dϴ+UTlDR+:+HU Y5&RpigBpyWWDDDDZ6 6_՘HSA[/""""RU/&ox _=(j |EDDD`ՂjK*`Rs\lHU 6_?US"W l~]) d2 Ɍ͆٪E:&,>>8vn7 ǫOZ|X-X#\Ғ =֨V"""""","""""" """"""" """""""UF׃W#\na```20̘jT2z=nN(\ٽx{c5s/>;z4mBTt4={9q_M׋#שYDDDD dy-et*k7k1 ݻS-,T.OJB|e;Ił?yIBp.yg ^Νҹ3# wޥM֌r`]{~UcDyDGG?j?ϙCzz>=hϦɅ{liu]}7s8W\tv2=szb;nfZ\:)))<9q'L`aJ]0HH?>}.֓}m~}z?^#(833` -o}G`@ wzK==R\uL2 NVN6s~Ü搕̈́ngꔩtMTUAV@nPc:oEmƋ\.}_~چ[ӛ6o֌j3w!!!mϨ#idRZԮ9~iSR.5kgJm s<>a'%'ŗShA+dnTӇ"vl瓏?PBiԘG} V\Y#b 5z^;uz?a#?cZc'}:mgg :~,R}y@F%Ō#ӌ>sS7|3 ʽ 3Z4&0q;ѹDDDDҫw{=C|Jr|5rzY~/U٣g/s{f{Rx|ML&^?Ŕ/Q71uڴlJ OdX4~m#p\L^o_%&chV'cwd3k1̸&iͭ֕ԿƢooԆF}lryTbdm{K>WIlm1k][U'i׬ <XZqXжxluiJ'&`>@"zaԶI;_ο?k^mՐIò~J70cj8R4[REDDD oQ-0jA m۶|0:FFF:dddY:$$;nODD K!]wңG`'IÍ@l;) AA|T玅粵{_̊)z_fhW-jkI#ѮMq29x-5>$hެ?CkME9éo!!`b)Gl[z&ʷ>.+uϪׂ6$vJw(Mas9!uzo1q.W,db g cFq]&ËMKV븽g=2gY\.F<TKDDD`y19v;Y8p-[`6ڭ{$88՚4HMK qc3j46_[ с3{|3degWZ]A*4;R?-H9d ӥ^R3hΦM,/վkB9muc_()jRݛEƩ9$%T-B\f^5}?K>ߟۖoɰL59hÏ 8mz>,r^FL,ftoh"<BFMNМ-qllVFCI5N׈/XUxp,:ʉ,$?9RRywyGi_W3ٞn`Ҥ1& X>cK.3Vff&~_]quWp* U.ZK{ONv6k׬'$$дYS7jȞ}.X6$$yW/I8R~ɄY {D>/>{}qNw M2/£[g%(Mْ2&Ȟ@ԞXqW}`G^kԣMCR$ ȩQ v(KNH(ͧ{lfq4Frē ߥfHsA~+zqc.Zvm㹮Kgڵm]6>!M|&MOFu<.gO츜"eB1 ;o#cHF2F@^ i)!5=E\jn˖?ABI^>U;~tlH#o ,2 3N[Y-hJTt^6Nw(ZӟZ۾̴Q` r""""p8|g޽nݺc9Cnٽ{7YoE^ W?x#oЯOu7`|{֫wI_3`АJo|%`?J /Ğkw^1ڶn͍˔i %]vmZ7okێ*?{{m*f+- IDAT\YTj*oO<}j ?vmأֿl7Tj˖~yxx.a x<P1pvϱ<|H>NuK< 'o>6l)~e@{=ŏK~%pz>s}qÐ1wsr[١i;;H]?u`ŝIf!R^eI{{X|IK_}(}Æc9F^"&=DDDDaFXXnKb6۷fǃdža/wsmŪ_{XjzSRYlÇ_~ƍ/˖_`C:^b fŦ3sedÏ\ OX~ dQDFFҴIcP>wdaJRT""""W-[Cw~?nڵ7v-㏈*?T.߾Փ11̚5으;v7UYb%ʜ)-lQF *?Ks\8J=j-"iޢQQs搞By\{mt-S7īBDDDD0ݺw'+3;w]aojl, br8==i_}ʫrj5EP*U""""W.ld~+j*abU'kT"""">6*TW i2cCDDDDjz`m Rbs)ߑteݽ͆b,fl6_L5/ """"rf_i&Ll6Lfߊ{B&n ]i\y }(T&kX&3o Rbbq{p{xx번0 L&3& YtLf& 4F@DDDDDDEDDDDDDEDDDDDD"fVDDDDDD;wT!-=ҥk-"""""" """""","""""","""""","""""",""""""Rns,""""""[,""""""U2\u4!آ⦛o*s,"""""" """""","""""",""""""Rh,m۶e;vXr((((((((((((((((((\,ټ}7{p\Rk!46[4mvWeU$dƑrUY,'vo:ֿ%X(\-c%eT~ж;9r#Y6ƌDF}^̩Y{|.1GI s%ո^ \w׳/I=WjZ͡c ӷ<_f1}ĜZ EDDDD~W}xW,vz>ƎOm-YHQx~hikPFmD4$KOA@Ttڙ=I܁ 7Ho3[95Gߛ笿[G]G@̽2cnNJcޞ ,1G_=؄`ԝ!7u]I~qnFm]Gg%;}˚t!O0p| 3y?{nyWݡEDDDwC-WܝS49'{o,~.V,[i\'zz|YV>ooΒy+oÈ^ X l-㮣Foqp7w?F۪ZsKjZ.vݶZ~ZpGۨ5Kw>OI4|;7܏fVv4U#?86yIly _n{CФ|8'_eoHq?B_nf'"""" r)e||>+kW}_t v9cəLԔW?qg@}x7e PY7Mx|м][ؽcӬmRP.ɱO\U F=Ǧl'&T$MM&^lVO:'2O;Vew+_9y\O.vGCDDDDDX*[Fʹ4ڼKٗN+dS '5v;!Þ T+.0p8z|7ɵ0pf@_RKBV|GAym?fԳjѪf#)K%7<f>7rS9؋ ;,6_"Sm3Hs YG-dee_X]n`w eBP'ֳ̄h%$9=jЏ:CFj!(~ͨe)<2_T^Qh 2/eOqj6/6.sY3U_/c(%nX֤{eEF%.(mj~^ubNMZu jT乇z;$S{Լ0f/NeZ߀rsJmiD~iHèof۞Z ϶@ؿ03׫[NjfrxlC־5F֞$6b6X6-a1 khZu o ǢGs趝hs=zuk<1i9p{RamөG-GyӵfK813 +~/s[`ZXvm!ìX=CDT&Rh"L\N&Ǐ:z)("""" WT|>Q#/t9+#6?z\|D?{YL&ȿV`]9Yxgnǹ!<]#3tatUyɍ\!Z <#䕿 n Wfza-aٷ Gvrow.?q3iϼmWnTn,:'Nob؜3vh<݁ÏQr`'ȏDqGCU _ H6Sf%+s-CLvQ ә0sCDDDDDͶsKؒʿ̟_u)f~T{4<*3%gEڊ)q"B[e YzNgot@K][۴eY3,7zѻG{m6miLd=ƊSXQpۘ6lVVm>yƵcl8:T^ubɟυ){>ӏp,,f?)>`=6:OAQZ8No_&- vش`. 3φ$RX2i&fmLcXڤ$f J5Yq|}m1_Ͼ-ll`F+ӷ<َodbSPDDDDBҋ_` О^`fl`MXѹs*a޺B{nf~v+-wO>χs󗝚>A Az-py;I.:nu+V-UGܐP=snVl!o*%{ؼ)⠈ _F;a /)%2WcA4i~rj\NdW W6F+j\O@Qj؏#F#mװp9[su`朘E9p:3s n֢HfCpع0!aԋA4Q{ҳ`붭h7h, djP7r/AѴҤQ8O;fCğ8Yf^ڴlµڜ巸`7ό/0:tBzDM+"""" WoF"OKl@:NU<5} Oy5S4Dj Ȓ~`zlk&FMڛy_٫ְuh7i=tmN{*q',ϛ8(20@zD/&vؑ}}mډ];]׹LѵCD_0qm)3~tWL\Ӳt6Fm˼9g˩]|qDfEv[6\>mZqYG|.X)'Yd?sAرd=' )Uwqˊ:zǚf`nҕz[]O]dW%bВ=8Ȭ5I^R^#O>wYDDDDDDb*O~oϙLg1eh$߶Y֢}h>MtS?oĜvkhQ_ ӷsxEfo,;FDDDDDبO!P8ZV|-$mq2 h *lks&DڌJ繟t5ƿ=mv[FbÉ+9;v˖B#D;;1ܹnբŀ!#y>Ի@w[CWxKm ~6giWᕽu273pun8-*,S:طΰIlhkC _,V,9wTIW X!dZ̝9%;sd6v iѥ/oN5NP;Ͽ~fD2\ԧeq{cϋYn'T6A?'is:qqۍIy'5Bjޤ]+ 1osrNz*u5w  ӧ.gÑt{GDDDDDcС^KiU!-=m۶9;vK7jpw9MXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDJb񬣼«3qEDDDDDJa2_2- }7Hwc͖.bYS۟WYqim)v8LtQWZA\2#ے\͂^RCbD^?`'lP^ASs.ONr؃v28`r`ppI^ښ)78mqx(ëH8OZdK^ee[8<1OZBǐZ!vI1xeq u-qt;f8au]ì+TDDDDD\M^+)SwpD5b'M,KLZ{\c9y*/w4b]) yn)"""""ru`' ~4uR3՝,?}oǗaV#d[m9jLWз?i8 3}caj|zo8w0&4;EO/0lK\ll6RsX|(. =0+irϰjf 82v6dx8PˏNa +'ܺ:EDDDDD*igwQT $@ $& HbO}Wػ** E,@AQ@:NI&PTuqݝ93slϞsK 9qapz IDATƅGzb0lZ|Ըy1tcK%V$ر<88Bj*'Q(.Lh~鼔&cԪSIˌ##.`nqᢐe%I$IY-ajdH \#0PHf^@Ģ{aCm^+0D0emW͒~Rz.~ae!PBW0tWE4/HT؉F hyy}r.\ıbm!YP Y]MaW$I %.ʣIY1.<ޜW4P>BjE9=./~&ƦDh^&ȜcɔU\7ݔ#;%Bm捙-ljݍ@srX!zەPlosҗ.NL`8e'qFl,VOD%I$/1neOw+ϵm\@,>]+pLr6A~Dj-\,sDJh#+Wq 6ƮWhPsg7R15K39yL)^Oҕ#tGgeb)J"c2Y#fۄ *E$rU ԅ%I$IPϞ=€0g]sOWer|:2͛Z2^w|8lG$I$YnD6=$I$if$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I%~:Q/ i#q؟.4JGyp]D*O]Fпw|mk9,I$I{`;L`ٖUɲf$I$;<ք.>)OQr_23 m>I$I2֮0;Y7euS$I$iGWE{Iuwu>vM&I$I`6iKֳ!JF8397'ʆoF[2iV!RuS8e$mYrVs8kNxfx B ;91%7yaķ|R$$ZzҶ{#oIf#p>粣fbRi3ܷW~+lJ^;뺎" }n}:$xK$I\6nHŊWt$%%Y;0[8_Mʩcxkgj͓=ar 'ES⭗w]nSy/`En>9*>֏cg$Iv{e˖L6w;m4ZhkE7s\[:L^}Q}g/#\1|.CPPΫC{Πsz{Q[4s3epB͸t8:)! F>-cW A&ylY- n䀘P=N?Oi\T^\p_|6nۼ%I]E]DZZ]veҤI;ޤIڵ++V /"wR JGQ&!Ż_:s=(B^mq8N>n?Nуʕw60~hv]6FVJ;yε_|u ıSS$SiFTZZHFRycx~K$It>tBhѢoݻSbE>ӭ.f9mmM1]ʠ9?_w YVᢞ+:UA3ƽDzX@y_360j4G5+Oظnro$I~bŊۅÇӶm.W_qaG6X>Vr 65+ _"]l|ìe's/l%.+bP7nj͗[2~VXyI$IܹsgzŰaرvˌ;#< *~sp^t|HFٸ ˚uN-8s T4H*+TzTIrB^I$I?WP;>>;'d"`6lqOkD@,T}k%}oЧOתTbEA%hT)uwWܟ,d^LTҩ /sf]nQPei|9,[iE 6qOzl\[$IҞ?C222ӧ}!##GPZ)]0둼Mx0_.UUբL{]6o~{eO4Aۆ<=a¶nW 35۬1o'OhnI$Q~)ddd駟~%h۟cG,&s܁ԏ-gܫAV 5gԪEx,,Xkymɘ?OaFte&ތ6tY{M03c(`3%vGT WxjCfﬞ)$Q [>4ҌzK$I%0Oʦ.Q{;h?|Swɕ ei9i?ԙ(y> zW}7_} 38tE:qv⇱/sřpy>UoBlRNB8VOof9(4Kf2VV}n{{Y.I$PeSS {l&7g`d"'z\\ئ*e,/nh(G338^TNJ @,! rE7*%r}=%ƝnOqaʈUt%_ZiX|i q֝wA(]9lش2[NSrEDjui]g$I$={ `֊$I$ia'Ou7o@6튟W͒,I$Ic$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$IϊwlI$I*!'V$I$hI$I_`?K$Iv Ph?g g$I$IN_IjpRPP킱$I$ ?G\\ŕ^%[XXH4eet7e|&I$I.e9\m+]JD" ni[ wՙZ<$I$ip:>]?*N%^m{oK2U8rKï$I$bjJ-iZ7~Oaaae_ ?^]PP9\m*I$Iڅu*#TCe+I$IZ$/D%I$I{}_ '} ˙Uٖڅ5+šU8j[⓬I$i7VUw쑥~gW 0p3'?Vg+D$I.iKm6$IdV:%m&I$,I$IX$I$$I$I`Y8Ï"I$Դ!\Z3Żqn|?<~sltI$o}igZld7aҪ|")^:Voѥ+R-!PA6r2|x.ڸupWlϙeR'1[7.dL>EgqOxb7 C>Ɯ~dݟ^^m7!\jW|.|͒5{qRqUhNo$Id lfe.gu " eiT2 dUTcF5:N!ajr; obZ SjieYʘ%YW6ks`<{oZǫc$t+Fb4֑ <v*,Љu6=~~qB^փИ0FnLdK;QGh 4U)L)OV^Nk/_3sR;L+yn?~'@(Xä֭z 3p݌ܼRsqoMocTkMw$Ix] 1,ٻ.գ۪M4C_1 @,DjG2l4~ wf\2i0 `EG>^uTȚ@[-ߕӨ3[~Nґݥb2Cf'c++ ^T8?Ҙs^^ -ak>N2cT x>m_uc㘺t Ceذ t7K',fȩ72TOopIJ z;ٖmS?f҂5l$iTlԉ;{; ydV?:A>~4!>${(C©|~rnYMɛwJX>7^Eo{;ZjϜw>@3x_{R7[75K$4!(\hMlq!$T2I1\-_qcJ,k7 tk磅;B$"%ҳ Sjd *Ž'ӭɕkP~qV1gyCOڵ[>Fޒ, (L.OjEqZrKf8W=-kCZk?K\?wMlsw *S&7xJTK(`4;'}*s )޴+WȚ5;Нw5a_[V :sui%'jJ[T C]'4[:g|ϖE$ēp.@|rS ^teAB6vݩ2(g9u2.{_-CdgƱ?N*̺2HAk&ݒ5*7g^Д/}+XqN~L ^z[)a}k/2vuP4ؖz]?n 뿻3fsנ$IxO\V5ռʝl^m.MA_e\,~sӣi{ZUJ]xtf.5Sy:ks2ՑLU㨓[.sQs TηBg`rۗ,o}<Ê{}&6D n´"/8kh%M=kħxj316V?;%F8cY;]Mde9|/Piw:h׭ri Qv$&3V]O3<|3ᕷqZ<߷?k1é涁-x\wTN^כmbMmاi[{r9 s'8'~%#/{r;]wAD_Az%.qz_y}y֔#_ʼnK 9+y[;)I$p]qvm), I[{BǗq(a<֣pjTUiZSZ5#8x="'>[An39z߷nC BPѳ8jK0^f3KHtDRR"@@DR r*yJZwjEh^;͟o. QŗP.A.*zs&j$,g2v[S*tр?’~ͼM 5 AVU~oے)!2X4q[,!D@yW n]a4>so>Vg"Meec˽ґؿ(FOeI9_C:<&$Idcdݪd ȋi1o. %hb@6݀$+](`Y-I R yqw9 (S`iՖr%ܵ0};{4wFhc3U?y=.͆E{/[SVrϫY` cLa Hnv.5}kouTDJJuo %JƖs')S@jr A9_֯Z~VooSOzbe# ?~2㶳8ǰIrV$%{}BD6zy=gٷg\t+[O$.ø;G7.!bZA+rt}yo^-ӼL?\(זI{K\Ξ5Eod-kb09&ڇٰ =2ɔքj8GLl@ǫ3ޓ$IMk XE'G/@(|рrJS&795Ql&! {&Ԅ'9/uzG0!];O w\\tKIL(),~=Z~&4.&.X}Q2'}蕰l.%HLJVrۺ{ۜ1Y|1sٗS{SW9`2[KQrNeDyί҄jȢh元pGˊ8Jש@Y a$FYAB4-dfx@8hwhJoFãF:toqGbԩSfu7eO$|zN]u:plFujN%p 2μq\-(9XY^eI9% eHr2kY=_$Gvڊ˛7UhNo^Ą5_#X@@ܦUl A|t. r.{| az~7+9R=1p0lz ˅]Evdr ]}#+Qbѵ̝EJb[J Ctd/z) Rp7P{~<TES-By,p לPk+ 9L~J7UysK-p`fB}ot0=zB|k' IDAT@^0%Es(h_kXWl؈6}r¾9 9F^ؐs^F\UgmOp'9 dyϩO²IjvH$Ip,I$IX$I$$I$I%ȿp-!I$IݺPy%"%I$i Ahk3%m/d$I]\Ƿs%̿zpyI$IRI[Xwϒ$IT2p`$I$,I$IX$I$$I$I`I$I~x@$I*#iB`$Ig!d l$I;o̙=/Ǎ#sj]Lbb"*pP^ l.=$Iv*?{6o ʲ%K <-YW^ٳ {%I$jb% 7栃:^\>37K֯O\\[,I$7Cp,cͪUtJPΝ;.3X,f/X$I h]؏퓛k5K$I#XX$I$$I$I`I$I $IwHv=Ʒ~aeavy7>6> RkҪi\gRKȱ ]c\'KOHyu nkҠe}2"Pq9?LOىjj%|y$I$Ӹu+گ)cNn@ZÖ4J jU/_5'ݺq(XG2gw0K6-݈\M-#玸#'wj+dYMu[qrtRoõ}aD(Ԉn x_%\;@H؈{8䑯quԾe׌>Z돧qKy6?l8F56gC﹟'ZAgs5#iy` $@BcyMөB_n>zrl>qD .XīMR웰_0AjPg$+o{ʋn, Y qiEoVChd37rN}wy7׏] I#@"7xfM:wiC^-H rT~ DCjqeqj9re'#-eɀ۹1JmgKQf {{+6nWqGJ$ GCG4-{̅e~sP8qr;V`73pH&6ׁ7$~× r:qtF 'fѥ;DqD9M;dy$WW$I%,rPBtNߌcbfќl~}AeҶc#ʼ0qp?8y*_DNbC.b9}m979IG:T}7)`7`_,qWz y.?!ڞD )WD y)h͛&#Ç2l$hAQ5nߺNJv2TXJ:Պ.5NJzl(`#e$-hB0 yhn5z+; Bnͩ0en8Òөo3}}|H$ɮی -!=;M坙tZ1=zVx\d׬@,&MXTh}1tdć Oz84O ?=z&6;OSZ޹>^[2"x}8S<ͻhye?.io֯s~Sx w O3嚦IۼL_ٕ:ru=l]&.g rՎOO`S%^|7{W I%?6t@T&p N\߯ptQm(?(]#oxm 26;뒲akCq :F41GwۛbOԡkdegڄaXW&*5+.lՐ}RBĖa8*B%gR/K+:r_>_&w5}/H$+lz] goL4:nÿz:Zhbʢ%۸oRBqD$ `Ul~&k@= w!=L~]{+AM3h6[RH ְQLnw^;2Gܡ7 p6J'%D$qbC9}9 F̀;'oL:li ;H'wEeiQtfӄd~%ITB8ꐺ4$&'O eR(@1<;8fmŠjq]j2P7T]i$1wȳ G]4] IBziH] %Tr|1t$߮> DsI?<{/{м @An\y~Ԏw#gd^\vpUriaOyq l\gϞA~a3{L,F~~>6l✗vؖ$IvAAhniħ9k{>?=y\M$!  p#eUHMM%!!pSP4ɓwz͛ЦMjUޖ$IT%,A3q, qOX$IRɶf*o3+⋹qu"$IO~3x3U I$I2K$Id$I'IJ*vͪUV.d$I;B!0jh2WRvAW3jh%SNK$INmΒ=s&gδRvq۶5=$I~3aԩC#Zj$&&Z1DUF#N:aC6$I70H Wƈ ]L8G8.LBB vX$INḸ8BA@V.N?k$IBU!^Em $I U)bȦ?d|iY!I$CJ4]$I$%I$I2K$IT{5!^=ws:% Nõz'Ϟ)C^@)BS ^${&/<3{ڝ?p%OmͦF13+g܊|r ɌQfñqI/1Eg5jf'ӗ1TzpŽ7%TC.D:+gr~3xKɁ:?z9;z)33?~(w'!!DoF1E_iSMSsӽRS94=%Iv@dG{L՛=JE^O2)K1r?HAuҋ*sss˛Kwzs7qCd2oY678U^eO(XgrDw !0k3)#%&gyTz^s8$\vՃs#27B˯s[Rˡ\dm)7dKhzYU3` F$p-8[ GkKbۇ/噡qϑMw~ `eůgWj񇵤Qͩۺ+;vWg|]̯bfa͏Azҷ{fŸ1,Iɔ+L\L%ZREW;ߌg&`Mx DJa6~5ɅI{v+{6584->׆*Ff}r5@A*Sv$~?6tvnB'r\$"N{ڶ#eJo#~>PO8.>З&p6/}?7/W3(dR>l&+ ksˌ8 D 3ˠ%IʑV@( љp HJ\΂RpƥQ o"$ 7&me6IEWG*[>?D%eݠt:)_pfRR|Z lcN"#HJ  ǒ==9|Q2Pʨ͹⅋V8~'?ç$A<$I$,ˈlՄf)֕ω-2ʝ]N%w\xGG uQ `T>. Hӝ X*\ZLJ2RX28ȯ[%JN_!I=aGspz,GgÊy4EHXYv6miOaѺ5L4;LNI;oð+1<]>6\t4 ?'dz O)$(!c;0}F5!?/۩i~d|DPyFI 1!Dd淌m>/5K wo@?XH_%~O8Ȃ&xt>{nP tVRӸ(pիyp$TۛcCNMP-J0#459KM&FN0f7!%A(EPOz{9)z]w+"M1Ԅ^CBB I6?!,<i0}xr d? k?Q]EGS1 :RVް_"0FoOsJx~IT@hWJE O;s1/}IbDUHXuH,]㊔$IQrFC7H #a}D5߉{"BU7_EW*B CVG*e$)nzǮD.,W꿗%q1SM]<|n%ߦ_۱-׋>ڑQ^I5)&K$I[84mE?z;:R;u[Y/s;io}9|י> jkKi|zk*Žಿۤ))Ӊ ])v κfr&5֑pt3~%I$ 6,^[gnaefݟ4F)/ ` ztMH$IF.gì;T0O ɓ' }[w[=$I-,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2H5T,&PH$IJ N?4N~s!I$Iƭk9`uԭ@$Ia׫4y!I$IF_<-|oWPEpYiQSBs/=.տu$/.N?&|)Cn;5ۯnf^mӛ hn5C溳X5Anf-u`:i恽J$I`<:-I+wg5JN{(C0ɉ]m0Ċ|ޘ׈q{ub@4ۭO$I@XЉߙcs{h.81 4j<OMb @b]a?9'܃,I$I2F;ŵO>\4yn{ZBj -[!В$I</+^Vl48e={-IЛvyg-H55IRg6 ,ys[$I$dSyxU-u9t8(F%Gla~!L}{&B~-kLz[fmBpz9?r)S>z#>I$IÆ ř[Xb1(daYϑ[Ԡ޸JpߐFn$I6 9Sfea ~jK/i8TSx&}DR$e儱L)nBN ,:XC _Nf^z @:[;݌ރ6'>SIc5+VVATPI$I2Ȓ |<1}ͤyTg4ɲx5D:lw,_v#?给4eyz oFjӂULu. N`NIeL7! &J]V%2W~`2jk25qk-q|Q$I$o) 7c`u&TP޸'ڍK>G(mV]B)4kC/b5D;&#Ě4h֐P<4kJVAK粸2N,g+8bWr(: 3BK+X,Gzk5$S$I _&1g~9=i`w̬ o;Z!ZL5  Юe" % Y:F];R#Ɗ%5ibi:p 3&LVF*JLO7N`[F4hL[$I$0):n/Z()I,ZH9iۄP-%݊ܤ5SRDZXqjrz ^Eˈ:G󓖓A0m3_Ǫv ݭj1%%I$鷴YWVRW'!iί[%)P+5XV&NPWB/yDƴm H CBE %A -ˌ xsnC8[JFCaui&?OlD˒.I$I2VA )Iu~TnhPт:B˩?7EVJ@(Phv3dEڰ<VgScxyy8`ɹhSA*m={tL:ezw#`}$IM#$I$I$I$I$I$I$I$I$I$I$I$I$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$m›Bn},Ґf]zsIp@d׾$I$8 mG'BPSKLCn>.f-@$I M_MZě.bEА>{py8.ekLZTBYАu(v {'îKɮGsE3W NC `{YE5$4jLrM Kgrk#n} i{iܴvxEEäۚ}=6A$I[hI ȴ(]GʕIg8wXD>5m 'rdN~ /zďgL.y̓7sݔJjXx՜87ܖ#?[K0Q?$ u$iiV.&4!=˗S5o3TnO!ԚZ&֜|7n4*wd8IyN#ZA{МWߝ-G=M[istLA$I MXuZ?zΈ'3U-rHuP QbA~m[ay SK5WkuAOOZoz)t9z/~4鳘L3f~0 qВ$I [9Ï 44WV-ɎCm4ޙ;d Wbed|8p=|lH򲩌[79Ә#/&MInӁN]qVg:M:,perǘGyqTwkԥ2H$I.,h,h'k{gl3ة}&Lh{Ϳ~3/C9eXUԦ[,v/}u&[k#F;օXFܚ]Z&Ný/ Sh =scK-7u$I$Dn_re\?q+\n}7_{kI&\{(/汬$ݾ/ǝ7%}'5Qqed@2:xc, u\p6#{/G4s}S7YI$IÆ ř[Xb1jkk)++'pڦԟAg &I$Ingyiذ!HP? ɓ' }[w[XI$I$I$m_퀿s $I$i`I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$IOZA6J,sH$IF& !w Da[$I$md  A(d 6~%I$i`B=g M]I$IrBx(F0zƯ$I$mIϾ-I$I"$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I,I$I ̹Lv4~Q`H$i9pؑ_t5_1z"p o W1~=&-2Nrl!Gc,_>ͨs_c_DH::oŎ<3ykx!|4o?w_~nܷIs0Am\$/>㲃a|ޜ >oJ9`Җ7}Iq&E+z (Z?y;ObPooiy0!s: pӮdOrSذ |>6y/15s\$Rٍn8H[D'TO8Hs^mHx~=W~>.a^-HX]<_fAU9}$PÊ7G?e~e >k7|-T/~'>0y90/-L.C$KN}qBA#i/eƘȉ6 g}9 ($s,WTlIÏ㒽/7Ke'rܫA|)\xwEy9jgzT[owϗh05},*3갽حlsT2\\CGpЭx"^zTm;cT<-U{̭WE c$TO[dj˸x@ sxH\Q"2]4Nnbj*Iqz$$If[=:2ȢU(7(Rdv6@z<5^ȗiڹ [ޑ:2l͚JYl m 3~z@hSq?x_ԋnٞsݍj\d>6[35Dj;re8$||Ug+r/pG;pcV YYRɠl"U˫Kʥ)@|L,;4hYź/YUC,Ґ4$鏖ӯ4h]{|9nٗ8Դw>˯5+>+$?6951qyKE|y\{E{,2:Y fSwl F 8i,eFSY+ZtKt T. IDAT!~AM+/KwŹg?wuYe}xqp*+$tߎ>4̀J֮g;ɳײ\~)~:e%12 ,,"= MO.+pU{5qxrr \2g"pY]ZЀJfr#N0얻yWn\2EiپE}HYJMnrsVР[>|8y#0:Ztaqgp >I~Ԏ Nl2KR?ak(YYRj mЮRk|SYA$ +¦rb%+KXYnKx$-mٔƌE2hҲ- Vy*`~Vkw{yuڐۅ.? I*ZL/kJY.-HrHek/"8 ,*XCnRF]ےD"yGoJe_qӡpKBE|BseV*qW|]ZI]Wp]^t/eDf/N@ai.ۜz6?[9?8X=[6jA{2}6իX8-ni";ODnbe_q,K'ן#_\jtWkL*aI6  mGs^xb.NsɉryX{ mO; %⋘8Dn&?R ֻ@zEI$8 ]wk爡s1wul>wsG]WC<1&[wH^+6,^[gna!3gOňFW]0e=G&pއWv=q]WLé+ tb&3[n cXn]ZA~rj~AM={]|6Ӫb?N$Id!@<ădZfCИFg,t*jF}=.hb{v=`7ц⤐w5ߟǖRL iR}'V`|Xw̴7 nʡ\5p$&n P;1ccKGXW`d.٘wCje3UtSd%j@WaL  'Fcƿ>>{:UȖy(v|ۼrs[j-vFt @.v8{/ Ůi ̬x5.ސL矪[kyk:ŮRzE"cFQf3`E|I>afvڽi<0l9Ҳ-6\ (8NJ6GX]g@| {&ւL@<',~ vl|O~EDD2`K`(*bO'f;|й_XFqTEiqn :uմahu(M !?ѡQDтӦDA^ ^^"\8=2Ngtއ[rudQ hӺ GAtd3_Ţa Rb㫂iԨh6br#ᔖl8Zu1_Ǻ%<^:4lL`%VTb/"uOivhڒ&6$ gtpr62M!1#%tBj)vq-#j@vvf:qtE ׂ1a k;CAl۞7bܴs'\,r (3Wy ٙ^ۢ<`ZV;!( hsJ|;6Fzը8=ڌ@5nhAvע9v^WЮ9ǘ"vvYfRJaRܴSw!v*Ămm'fѪtڂ t'uv[{Ғ]Y n3UC׊OC`Ѳa ,v;v;@GvGtUJRۙfXlސqGz4!4/Ftnz4ﴵ$  ܿ8Fm6wQo`h? RHrl e𞈈\,r)`[5LÓӴ+x$&)5pGØsE d5NIY&ed|9ZOePxm5 V2 b8G;ғE,5h*&ƄI޾5<&@` )~]},z󪱊 EANv,N,˃+??O|w#z0eVN.~1)^f;fv9Li|/%#lHw/~AQ:=jCi<[qސϪǟtkbQ;kOs Oq.Fm!{#[8pѢ Fr IZ/m0}O u8":7>nK#F@0!fG3 ~'D{Dɹ3Bb`|J9YpZWZI͐|;voA'ھn82Oj5 ÞԜ?=״yK4N8PV/\ Ψٶ<6.1EqqN'u|p::7fT5DDD?,,"ts~'8OsY.i3$2(+";gV|2ē( HKhX{̯7sW eEz:ٖ2r{{""""r9Sdz6R1DDDDED.]{᭽Dw````` ""jQVDDDY-" """"`K_L"꫋EӓȨ|p&:SADXU[hݾ !""""_R ((((((((EĪ\LTD.a""" "ri?OAXDDDXD.Pu:,9 '^\m;'ѿո`B ],rr:,޿Kd_ %3XNS5`̯]ʘ}6l WΤq͆*,&+;?džۙ=RZEDDX"T^^ r2N_H yʻ*QVFyy #"","UP1hW""",",SDDDEDDDDDDE.%jaѱ)""" """"""" "ral!c`WVxMGR26UQ/˗3bpϟ40 IDATsСXB̩XRRVv&I6ToQ·k?`}bGi vb-]A\;/lR׊KK+Ovo}e./<ν i˗u<1ٌ%FvenӉ~ l9\ :!'[jӍlPr^m<1]<23?9M7TnC1Co瞞>خtzF7ښĤW'ȳ\W|"%Ԉ@ލՎ} eI3}:;v[o%//I&[o1k, U(`T{ut|)oq8`SWRP*_Zx$gfgԫO/L7jY0fxk $J:79s:=+az:ٿK>|)Qq*i-ͮz4,.^fqi!#^u~5Xe xKYЦ ` [R i*FcIĤRnѮa7`ĥs$%*7F0Z`-2v Ņy1j(nvJKK)))fРA̛7EDDDEQ][ {þDänT+z0Pn?ρ|ns'g1{Ag=D)23؞JihOmOׂ8~#߳$f6?}A_|ħ_ºonkdʪgҐH OPFQg_Œi^51-e"Gd4#O7N9)ƸX#\]z3,\B{bZjŭP_w&a[ɬ잜j`r 3xg|LÏoG7Y'Mz2u( c+_>wwSM5nMwkw(`Gii{xj"(޼i0t-kRz`n8vڵyp$Ft>/,83fň?>YlSNRR+p;Gz6mǗeln{pqּ7:{MG""""+fHb"b/Bq835wBi8s~7:/>ۘ/<3?QT_ &+Ndq׆+9 EF#xWY6qש("ٍFbuQ!DDDE|X,Xm65C#p8"7+xh5fbQ*`ڵfU: Ot:1MSEGl6ժUëFul6A(ₛ;W""" "rtGpLfƩ822u -$#/7v'Lכa7LL럼'~i6 1C[KݕwfQVoM~~,4Ic*6`k Y7~XwVl[GW_= [&@_ާuS(p0B7#躡ǮnIߡ2$m.>K3X2:Υ, }c=)9SR# }HNO-o}o ycb_͘7qL{Ž1q"Qzl2?-`W~J#|6Uĉ_EDDDDXQ ^MNko,.F& SܫU643>x7?[MU6sojLWWq //ga- quLXr0"*_` 4Iʰۀ:ZVq|pĬmcZׇBKBdMHDE?pұUiEB\jmM]VE/)$$XH`t8ɦ滂X:fW?v ) m+""","¦s)%Qg}{N{w>vΰ ``Olyf{J]G,.M@I9 3Vsp}:[øwgqZRV,xgÞXFXLiί Ko,P=],*ū4l,U4+R&(7 G~bQζ> !M3?T.Yð#9} #Y=O,m䬺-]כC0kyM~rl]1mV6||ܶտME_=6^.o\]6K}2ajxRv27Upl`w""""ѿir$1q|8 ?ǚ;!"{lxq-"""">/jXV, ߩ87/]v״hQ(Ҷm].""""""ryPhUR WDDDD(\*mǖ,b ɩ """0OOaChݾ "?D-"?mesH8+""r(.*"@,r ""꿍ۑo9Qc1usџzCdANv Qg9,}efգE܄\F1{n&rAGnbX1jc<&R/7KKPDDDY}`ͤ N[}_30)Ճhg4BOhP}MQƾy,\0Is| l皷oI+iL7o|, "ŗyS{YDDDgo 6Ӎڥ{60p#\eĦq<$z&xܨ>u\x>idaj%},<ʊW7ׯ e:WQWa6!iOC(r)c=ᵴ׈?ʖt.\w])spWdB!b;{H.4q l@Iڦߝ)"51 zx_f(ym8xx,"/~:±r|75;RRZT,sCOJa'xl ~>[=i݆ܵs紮Eft p֢?{~0: r9iN@M܀+F"ˉ"wi\ar24ӇX O;E$,m7X-^g]k#6A }({H]BCǏ 0{k|p |ͪr REc)MgCO<3Y?# ~WFSwBYDrM[ܯJ<7!ʏ{>78cA.{5򯶞cDDDDFIx07bhgW~Z\0SM3W[&_[J;oGmw~Wʙg`ts}^hb f))XnAjRvppV5O>>hQM>V|*Gp{f|ujQ>o r$\3C\"OrT^Ki:G3}suHIL%,b\ qҸCc~ )S|dJxXc'*.mܗ:fT<.KՍeE|s_'2뚈s/>ͬoݸ3&۹f'yݼCjBl'aدİc,[LyaըC9䇄R甬kKJ##*Fj@Ѯt4`KJ"Gӈ^sp!Գ%'SOVhZŰ$mԤ=O1ot .`3 |؉YܣI8e5{םĠמzi2}(FC})%( ž4hM-0֯TRB‰6 촰m'qzf/ɔC#cV kP93 qdLSs^9:uUËV}yqFkE_E|q%z3 33Ho"cWYc~$'; *Ni+-ctiZ.]ԩS/YpbOݽ\&ԪLyYgxj@}I"""-0~aD2̑^qe޲׫76u^1LRAJ^Y̖,'FqS =fflu!8F6t5gZPFw Voփ5#ө m鬜!e9Y=[WFy@<ktxV޷mnVӿ[~y;ťux9tꤲ2Z hC-{If ٓN!~I[Ѣq{pp^,=z%Bҏx4""""%p_VFQT?7Ŭ+(SiAIB OxݥCʉ6 k]!m3OA- #,2ĕ,)Q6=ͳ9BJ/!#WGI9sGִ*OWRyS" _ V+ 'Y!4 Am<_ܨMN>?=5-E1e:/ӿ'ElU-Ic燶PxlL#s^vvBq5E}k+KBNd&8țAi*94Ҍv>~r5Yxp`ru8I7<<ڙEDDDE)(NWS?o/|;'Ah\jakE뭪kG2Ђc>9OIu.Tv>f:բpKZ&ȌO6&._羘:P1~a+scXs_WR?}[NZ =}?^nmH둍XZ})_g(Wq45 oLW[S}ݴ!a {pWx۬@w6g-X=m8& ZҺy͹6O\Hn~b69|_ڂ=ȐuYM5.> y /S AkKXWݷ)Q5nZp9Xumi+c'a[7- ډ 6ukMƲJ /p)D 2— IDATnkme⊝Uoy{2X'MVĖgԦOd7 jPHvN)A-hhfk\h fNnU2wX[q#'l̊"4E'5QTvJ8\ٵ(+x 畃 7W'AUp.^ *צ_3z]â2\: WN.哅c#[UCϐA8JO 66 ",aa4v#a lyPo6κ'+/D׈ NܴxvfUJk]Y =&FDB~+ƵIc'f{ Fm!;-GΝ([V!`> ikyiI)~+""","+f<؁}Ҩy}#ҏTQcO;HjG1i\owm]5\O n'sCh=k"[(bsbsY;񻪮/vsw:5{o0dQMd 5H'!f/ ?NZ1YWgx +ML'.Mhl3HCT&ܤA3w>X_[j\pW,u'#zM^vwWc}^)9yg04E쯎|.28YpF`|Iε1FH-EDXR[Eg(\"ZDE.}:c3.V""" OO"3NbU D.n۷uV*I-"""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """""""J rq3MSEH"(ȅ iOD?a`@tu6V~ԔtJU;u2r0ڵ4EDD`d-?+)).pa^|%l܂TQDDDGX"kW粲21vu@"}9lcٗiվKjߢ`Pyy92RaH_HXX7cqQ^^ˆ(t8\Q7Tz t 7㳈OQQIDǦ((ȅRLJl2L7uGdeyWgCٛ\mnKsOɚ&~ie-nEy\f$\lRa0uDDDDDXD.ԊQ7:o۾NhTiuv=DADH-AWm`X̆,S˂{f='{ȃߔHGWGd'm杷4^N50tMk tW_[wiX1Uېt ßgnYHWڲ_*YbLIc׊V xu:vՏMzpÔkg%':+#|ZaїHWC;yєGBCB_%""r5"]7y4xww&{Lw%6[6,fgfNq}2-l`)g:}iblyr }n~gr/䑕I̩hQq'\ϐ07LD 91k* cKwSm|xӼlY \SXƏ8ghduJnw֓ `r41 Gڄyl AeDnXwvSm~;^xh&'s˗zvMpj5gʡt.%c|]X|9#ggL?> ʊ+T(˜ZE.%ei7njJ%|'&p@A`'fҕO͵bqA&pd֧Xo rRܫ|9[JL\G`{~w5_Iɔ !F޻6E՞ŭE?m:iCj5Bڣf#3G̻(--~>9\ss%^zDN`T4@Tk !_3Q>u Ne~ߚiU ǮKؐabz}+YuL ېWǗxin =8T>1?ARᒔyrruiҢ"kSe,Bxi 1U ᵺ>`6$Wx?l3vuv 3J#^:n'?NFBxz[ 0;wsϑD߾}2d۷g*Y=fd|pwbu)Bv+_ QgϒdϞ@`_LBY0Nq& h Dĝ% gOot^xɁs6a8qEM%|N!Rң!%k%,"$#rRx.2pXOs<ķzQB5t^eS #O*Y|NިwӧO{Kv222xwh߾=ӧObѠ'`1ҖOfpmŻ?L||v0R:>W/G71bWi\\{1\&Ev/քQ㋰l:6:mؿ^dѫ7\5τPtk@ M,8ƭ_*`3k.W}OC'q/~Šzma("@vȰao9:#qY8|ҹy9yV¶" a㗷PpKp#c1rQpk>aI պf4}(mrYܽF y`1c~!&?"/ϣ7ݝ;ұcGBCCqww"""ro@$*#v"{u~ τj v~Ge(Cp'4yv,e}IJ:c!jZWmKX2 &W#]'}2(m`K yI<>xNnY-e ?~LCgݲ ޒ0oIN}|_Đejks?gb=Ӳp $)إG>YI/ٙ5Frgyl׼zEr_%?{UFwD,'-==~p#}vYK1<ܭ6Id*5eī,ԄwGyv=m _iLGez>Ri>KۂoϬؖ~61sCU.ֈt,AYYr8b]!bs$:|){EȰe9OGgԼC8kXa3f:lO$a7љJG""""w+M63xDfeerHII% <ت'D.Or de׺g Ox^3~4&=~Eszu>qӾ KОiėx__L&&%ikժs]X@;5_r{ """"9@}-f8{ z """"X>Q7/}[ZG5-v{CDDD~`Q.#Ϧ(7<<8yB] zzz""" "r;aw?ˆ 13Vd.}>EDDޣ`ܥhܼ}ʖزu"/{EcT`], V+5raFqd8T|4jڐujnbhmVZV|rQA]T$334U$j_\XV Q OO,nnx "l6 7w7ܭVV+nn-"","n4qssb`~E|ezEDDE6}KQ-""""rWe,EDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDnvRDDDDEDDDDDDrw@{zՏxQ}-a&wXQk'i;EݗΩV syn<\;S/I|{݉jI$,t2'IP ܒ&Tl^;vvg]0OyR 7c b~OlXWZtڗnW-buLh|(. 0z['[/c zl-QU3ln؃J88zci;[1ppKNb&~w#9b^/DMk"۬XgP)ns/c6M8\6MY*O=n3>u' wrwͰ㯏 BG3:(ܥ7Ĺ{_K d 库؞§,=c޹uoG3O" Xjb O;?:ʈHo kK=可i@ML~߼D2 א W0͜B٨-[aF,J.FJd~? sP7=1sрk >@_2qpz%,ciL=|9%fd57a~¾9Y1sT;eAl>(""""B="sxso]^y۠6qX#:`')vX @jP5 y'j6] ޷ 9u> >PHhIA)w9tU9Q>@Q'*,dέ0JS`3=*Ш+~^g#mK~5/BFp!%V_<+#N%o˂#r*ߎmhS4^(v+&Ѻq[ȃÇh1 ~Â18JS_])ՀALi'԰N\CܥR 58u}*>&4jSO~C(T*W@S"5OZX*@W'a8 ς })""",r3j<ƠV.3k/ҍh&[76G1ӥ<{ $ ؼáO^A4A>dx$\NRSXӅ) W-FUȻ7}K$ [ҤgoYv8TK&*~eO$\] 3@[}G ebHڸGυ`l6+9$5Չ}}$]xÚ=/[6 &k4uRMIb}NDDDDEr{p95Ց]2#ܠp>3Y@{DzXQA2so/q 'Xq$d/ki+_Afb%5li@-ύؼ#=U&Dةg ƒk;#;$K/F'Ń]|XnA"°?M񟕛4"/RH䳄;({o2x&q&bG 9g60O01TZ]zտ%qO񛈩o}؝:I;VpIcl(Xc8rmWkwe"L ׫pmLبY2X1zF5QH^Yh^/HΌs8p>k,R8|u)H;$.Y̺m2s),(]vnbߙla[?G=~>ǘ_x,e*EzQlr~zG72:D~>o^8:Rr$^A 88l:בֿJ'IPPvokؑC=""""J r[Ϸ|$ 3XQ}n fdwDCv̷b)գ'G3vU^j ֭)>nǷc 5^mIL\2d_>]}+ۨؼy±hR L(1ߕ!/y'k7u\ѳNcOӲOs*0xɣ2DzӮ-=Lgo>wAyWx;ʓ|@8Ҟ{߯m$oOb|8&YEjmh0ຩu2tRw_x[/?eǃxD\ѦMәir<"aBp\Jl^"wz}f?Z4Gno;wQ""""7!h4K<X,wĤJz("""""*"9?{(m(TN# S!DDDDD!"rWr'^"""","(+%ޙcy_V`'+}ihVXoTg τ,?7{'1"""" "rI(ՍV,`|_Ѿ!sXCrs3t͚W:˫0,Sm#VsØ|$]o{_W?vr*"op܃ED裄""""4]KDDDDDDEDLQC2{|V/k%T+i-EjC5l":2CE`y>y#'Uki-S`əL)Vq>Q@_9Cim5pό UXDw|=Rsɭ<i:%Kwr )`N 5T Q *!"""" "SΆcx7'RI/EDDDDJ -ncIVARd""""" "S9I$L@}A="rpza蜡f_Qo}wZ[ mn=g/\DDDn`%wzүmw8>Yhy_~Fh(<+5 =΄GЎKiCkӇ>لjy o_$2m!4x95(Ea3/Xs6PbZӉ ;)r(=^{8O':hgtIUbVEiiـntOXF^cD`2$Kb>Ĥ23m!<ηO az|v<`^7fb1ϰbHFL+3?V6սY8͌ ҳío-SDDDDEDy|;!Mp8=#qW*H`w`rlzpΧ~{P.8L .ń(v4@Ԩ^vH`Xc#84x6 QeWnD42iTnYⶰtwCcm37J³dq}{t:sEDDDr0]&M_E:ܻ9oϷ  aԾo.$櫏yc~ͨvTDDDD] Ss>$nX^\:ӹ9:u ÿ{Q|#߽F–H$vH->[9=6Z%QɡDvFe``Zϟ<޺BH_SgLflb*ȝLXzC,Wm79^#׷%^>~O̯Jeʤgtu5ߙj apOEBI!lM*όak^g O'zElX YOg'+9IFV 2e/֍e<Q>7)N#d:\G|-w0iffaOr?m KcaD:q\4-y'_8VqDZB ,s+ZsYܬv5 /Hhۈ k|D,d`08V-% 0RĊ-7lNĈ)`{jGaG8}57q#6񙗗I:{䗤^>,!2O#: & UU vN͑ ܑ(rylȝ`H`)k9h)J_ewS5oE8N%^XG)XSm6yO5:X&`Icyw$ѣtuiRc #`DDDDU-"9V~G~c_tVpp8/&|*vlmߝ؏`فs7oDV"xjY{Xxa>Xw"J5͗gQ,4N8iIzLeO3k|7/fzUjK gsdhU;2ʗ~ۉu!m',e3wT*}F7$|>ԤvȿhӦ49}[aBp\Jl^"н*BPuܺQ`W{ڬš*7L#rϪMLJ֪URx)ϼÇγ3<ZMC~EDDD% ""wHTh x`IȂo&FQYR٥BAӣg^,:@ߙ0ooNP1DDDDDXDr.4#"JDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDED9YF? ?S"""","9 0FI""""r"OszYCicyx kXܣL4VHd!7rudŰ \"""","*4#7N^:XDdZϟ<ކ!""","s۲!""","wNzX~.Jaҟܯh\^#IBn|b%HNsEDA?sU`s5Y}w$O̯Jeʤgtu5ߙj apOEBI!lM*όak^-_Sِ? ᓿBέOVr r> e^SixZ[7( ^{8O':hg;dY} ĺfkĒG)Ң6}juM]8Dol@B7 2bظ,L[9GCy[)%¸Gez>ߖ;4f3R'LˏNdkiȥ߱0"8_Eȼ/Za8Ɗ[[j-LĹ,nփM;uƄǀ^4 mVFWL{z;3%c95r[DDDDXDxw0/mreq)KU Qe3J~)6XŒZ{:԰D?wf8E]2s+&nM!?1l QXѧA>n_׸3aa WKRy^/sKFz**;UMcXclZx/mDtbsr񻺼1v~5[#:{;Us'b8qr!zM[ gꔵ틯2껩z p"{n}R d'l!kt4z08<ֹ'=_x$bF"(T"UC7*UF2tuX^m(]+x]z?9ؖW|LR"""rhg$le8C=b5hRi axlxG7Egh5'kRg10,;p-Q*UOU13Kqt o0'NdRƣR0\|s жyƳ#UoHQSl) U5$ NᗩYi}F/C6v׿g'$}=p&Dz|n^f!tԖ$ȸ|vds/QBOX gTnH} I[ͦ7ӌ6mژLٷ8v/4++ EJJ*V=!r ="Emf̀՗~+ϩ #T7Nuh>}QV53ve*r3냻;˝?61)/O[VKB,"9ii~ܨpu<(%8>;dk5m -M풙¯ܳE$$4Ιo0|=pGqWLr6NҡX,kbnjZ n(""" ""64HѪXϟOG" wS٥ܿt$ƞA͘L"""" "I>_+ڗʹ X<uJu |оsyxvب^ k O['H$4ƻ>fޚ""","xϗ<9踢y_'LysuukvxST<W.*,7q퇌Ԫ3XcXjNO"m=LkGQ%~-y~ jKb)Lj!vo` ;H9Nv$N!v,""" ""r ? 8~Ɋ҅^ Z7Xɥk)}c|?;jUC*ްF\Ckx!*MͮclZxArNm%6+y ذpD .KeUܺ\Լ^e׋U6G&OH~ M6%ZӇb6[0Km`;I~4{zy,D/+zF]) $cy gҾ>x F/} 3rxSKvr`4MaƖY =<}kx˼͸i8M,W$jC._r*~.c\gpa&n^5񧋐<=ʃZ4 ₋FX"c#77}KT`C_JNMz!g߰Waޞzi@@> z6 kLEDDDXDJ8O,Pz3jH}1-YZVBDff˽#VEP~"%zPbEg96eヘvG e<*Y{z p7Uq)I:Qh$Q6mtGd%*Ǹt}z+ԧhZt6-`ä&,ݓH޾H^P֍.Xv\^5`1M~ {H$T4DkrJuPSg^ { 1[1ayML*P/w|oD,%bNg73=KtۄVw[lx("""9ѦMәir<"p;Ь,\.))[5toV ]LzߞrPuQAW(\r8Cu«~ɮLSEYCUoF|rǗׇժURxȽûl=RvM oYyJ'. 5{0GZtZ """(=Šᮼֱ8Y18aP8mRp.!Zu=3ys,""","rG8IM'\Gg3l/}hC{.R!DDD$G"; g2{DDDDDE$r"t`/=_t<iGe˖pǦ (HcIԪFAwC`ə|Ogqo-Ȑ:XDDDDN("KzP=z4)Ǿż?e("""","9+("V Y?V@bbt"""","9Wǁ]XDDDDr-"^6} ("""","9a?D,!3'Β2UQ ī""""r9"""""","9ihVXWGE`y 3®rd']RIDATH'8TQQ6H""""""rxW>7uڴN`g\/YU{>LU{:lU{>,]K>g~45oURUɱEsαo$F("""","9SrQT,.KU5Q^xszLf~^2Zhaᰫ""""""#/P^}3>*"""""""9N@@^nlXrWU~rd_ԢE S{\ 0=IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/response-status-code/image02.png000066400000000000000000000733671461403617600262550ustar00rootroot00000000000000PNG  IHDR1<\YsBITOtEXtSoftwareShutterc IDATxy\?/ K2(5MhA\Bj]-BkUZk^GQi+jE[-܊ nT EPD$aI%2Dĭ~Gd9I>srrb!B1&@!гmҤIgϞvxZzʎe~P```SSZikk355xQ.]ԭj^׬m~(Hj\8򊭭a jZן9sjȰ !B0ThlillmdZjuZR`ooVJeUUQY)5JBMiTJÃ+++ZnaaR+++lD"jii|B=&OG˱ݸ?ǶU߾>>4[X}1hF!Bh@ fY1e_hBfdpJ0 9uT(**eXRzr(s 9y~=\stKKV*t0*.8>:$ޏ&JV:d$%gh Sb.kl|DOg+WA!C~~~p'?>,,L"455F6;;;_vOi&mƍJ0`:rjDyž~Evbp|?A~2..Cn(T7_OBtS(tL'Ħʀ Z I%t}/*J(OBd|!B!&E 0p~ÇrJuAi4J 2@>~߯0^?Vhh`N~/L-с䞎,=ߞ;xԗIx 11*$Ȫa߮Z>{0[TG6Zn1CJ͎سA)-NNL^\wriĘ;2%s*5c(OF.J(`yFLsr왔RZ)P ܜ,v8,JUiSz!B'w(ur76(ˋ,ؾ};ͥծҥ3GUAo*jʷc5e}}6lm3Ҏzyp &wgOnxPڻ=oDc!,9@%J:OR.KOSkZ\j1}aw ȒKBtE @&czF <(h@HV<}N 'pwA--NIܞ-UikRC5"yG$ܵtB虗yf^QQQQQaXkx/qӾ]ص;zƍ{vGZEٌ͞~p0e>iʭqeoD1,{]48j+E)w/^q)E ]R&$KULg(UXD a>p >,C lgwG:IܔxDfEDGd #eEے0< H%[Xr<-Y{  b=(ܐϏ& ҸOL˼LQv1)*Ϗ'|NL†?w\̨`O[4[XrC8:I,s{jLN#ք)B -$"[)2P x@h22:#H2D G\( {( G>+b)%DDĆCJU:B!P&"CRh$5`~tDZ4_,/ˋ+kl/埮 zN|n-ruߑ]G@|CT9(1#KdIW2| x * 8$ rDP)d(+8K2EP ;4( "PNoєD7Bg!@4*ZcȤJkf:u xN7Rәfl$;oy|{ADRYWu qw7neuE2L<dm B4ael]8TK3fBZ3@ʋ&wM-A- vw76R4^՜REm>XR ̖kx@,/(T$X'fj`_BQ -/uwR@7Bg!@M ÕJN &"D2 aɱ| &zBeʹƣ,D*QK@V>AL'LD޾<*WqT>BonvhLsgjin3fKS 38]'{{Y& 2К]}p?mjƎsxU@Z-I7!(,%!>>V 0'-Ql7?/Jn$˙BQ26=M4!BǗX<IpI&0َnnnJ&Q~iV_ P0erO= Ѥ`y ]/z[K ɼl )!zIŴQobF\9qeZefǬ{8AԴ$RSvL9uPwSaimKٙÊjǀ5oӌjiq?S^j;%7BӧuM#C 4\y0#iXlP%ctL> IL]N)4EKo?fQӣW)(%61O}2X @(_#?6ؗ=0~7N1}燐4*`nFs8yy10-\w{S6}oiz] "R(JQp X8D32 aRSBw$N*Qt4_/"Ot׆\C*U ž?bT U.d&&GlJ 4YnFٳ{YxF% KDyAJG!]m:ZOTcmfv=K@eZSSS Ld?z^V\,urg24M[MP/) Z͊:mkX0L\\\yz0͉D3|;wPzʺ[/ִ0frhD:v"d999O /sHfl -R[+ [+ -nPR몫g͚ejjjkkڪRQ+S|bsTYBT)(%57mmRLQ@SSRYmS3o7kϗ ʵEڦT+3|bs΋f@!U U VH H$7BK. !!zhB!0@#B!!B! !BaF!B4B!B4B!BB!B!hB!0@#B!!B!!B! !BaF!B4B!BB!B!B!hB!0@#B!!B! !BaFZr2_7y` B=̞;ݾqU>ѩaT\p|.x?R*U[RZ-XRWyuY]e\E=f/+4 /xB!0@?6qqr?FzzBcj|.?&6U,gh/O*M0 IbWr2dJ5ohŇ(fd1~{Cϲ1B!Th;4$Cq˅2hEIܳnZ52Fom'ME!zhbR]~<SnnQ dH'4+%[MӦRwIV-?iZ%gݜ3:i^L&G I\$*QhT Ya?+8K2EP ;4( "䞛;-Tޯ%hFY@QB!h7myhX),0)6˂B (U*ّ }"4 xtMdtE'TQa۷O+)23;vܕ@,/(T$X'fj`_Bg͙@ݭDK9x"B=-$:[Q5;.%݆-0{$L3Z>@QaM^BhH@ # M,jЗtvMXٚ.J-+4tZFcn6TbzF!z4Nzy|nery<4plD1 @`:x%U@#`>0*I^$/35cD_! K:1=œB:wSLr1 l#K$sh>Wlb YB9@eR5&%$ćT>}0t_Xqg%2/ćf3xU% ɳreϋ]Jr9S(:rU4 @zdSDfr Dv^,G$l&0I*D1 zgW[nG,B!SiѮaq)~F(8Y}/U KrfŹctK 3<.Tgnc G S8DlPJ 22|!PtYBYo7B!SJ?|}覩9W`F!BʤQŐ٬9pA1mF!BO?Ƿi-8x!B=_4]YUq]8>B!0@ڻ$61B!zb B!!B! !BaF!B)P_"zhɒ%.ߵk=y3p𰿡g'B{BSy ωd;KY“!ꡟZZZýFNx!R!3?2 &sD60I=B'0@q&MYc9i^|6l~fןTt;cBWG 䭯F^[:~dLk*U9}o{v_yYt?o|}Kǎ|lis?|?cꮒЅsHl?9=,E*B ٱ3{Ư`CϜv:X9u޼\tk\?c1Lv􄪰wzw.!47qw,VG *΄3Go_FveE%r F|)'jOwĦ8/ :VDN`ϦV>Vaz%r 6TKY2DNY.NlPW+FU/ccZۇN cW"c.f6oNuxLU~\路x$nK<{#UO3w&S>:J#N`! Z)?}{Ἑz98pX5QpEjJsx, ׾6s@'36 xWo'X ű^Nk17m3{_7cƽJeV9o5E'~D`>jŜﻻ:R\v,>} ω\=զ4lQ-&EYJq5GvfiuaZ.->^@xG`Uj*P\PwhxL%KL:*%'q $)#ܸlAdJ4+)0&gMj&.8>7;",H0AR6g\wƺ9YAcjꮽ Ĩ jɼ]w~WKYyA][_NMqZAsUCrINwyZ#>/GߐO)O)Y?^gr  n1ժr[AQzmBJ=v* IDATQ_;o*dž_ex::⯼|e>Ӝ`7Ft cnA6^IY11|mp웨-xg 7o$)zD.H-ݖr-4s9ȵ@.z5ctϋZZ'Z]W̋a4^h1F,9b˂ox':5JQd9;,ćeHc@Ńgϱਣ] ɔenO-)W`Dؚ0EH.I KޒaRe;/Tl ˓#ӋyUlƮ}4}:QΆ/<n˱S7ue??ztms. ť,- i/n74rvQD#Iq\V#zVN]FॱF&\n=t%OJ(>璡{ԉrP}i3w$mwnؓJLwl>w%z[=Y8J/ݠ0s<Ockr%qtLFg®ϑ^06DČAo lJN$@t}LwjZU75ʊ*Jʵhd:EeU+ \绎憺:ꐲ82b@#fd'ſ-%RS:z퍎 nؙglRAH5ベ YS`|[ROlpũUii' ?~l3XG#miH *QHP(d~TXv41v ?J"$S-*T Y?62 ڶe(k~D_wdlWj~ Tk<$u_cgG\8'npSyTAԀ4Bg&@dJg [i'2/ Xwq4vj囱Ttcs_w~J;ݛL rwT:R9U>wU=ZLt8c\9+xz[L}y(gz|a 3F-=iʚ?4xljh"1zD?im;`cHңBD@ n:g[Ht$9>4PAkv\J7]*8C BqbU:lpMם7{EܿvoH:/k55z ֨!z<,*kkjY '\G fqFCu@ouUyibŚVUwyeqH38JXNC];]$T+;Fut;%\NFLZ S :xE#J O߷`N4*m}OmG7ם^]uW[rnO?Hsb="F|g׿=xeM1É;DF vù=⬖Q6Q`4n`ֿ{!ֹx p4.7Cmɵc9wVX\Qvh{DXxa1)fJ KwW ݮ7HwwR/Ssݓ2̞Eih`Ǒ2ӓ"=nDgޱ3)<Q+mnws-r3rdM4q pi.ev]/!](}۝;b33i䨖R%MU63Δ =5:͚tmwv1 w&]ђsKr{{&^VQ\ő;IsWβ.=~Pn|5q5e0[:G \GNv n57ϕIԅ*B &05qذ^r7c1XY8:p:[j]x_$ g{]yzSgp8\{ Z%Je 9S_.gzy8Y=|+ahiӹ @ѭrpoK3&5f̉1ps/"9|Τ9l@k0NvRMC#pgp 74 DAovhlϑ$ݦ*KR\At VˤjM#$ćVЍX <_GMspyaKyI+D :w8},~!Ly8%4+tA8./fʪ:z[~V=W;V %BBPC8N_9 nhؕT(PN;]s]n'3uѥӝS0vlJqaUTb#W%{jCM.Ҟ -ե3ntٚXv|>t|1? L'FJEjz,g:z?[=nfhV\{+nOcwbwSf1A).]i޵e2uꛥ2&^S4<,&([6.^;n4֗fGw!9u3w\Nu?cY]X#~DVuNc5׷ĻŮ^<+Y*wiZy[V9ZUJZ4wv'醙@ߣXDoAhU _|8gqd\3=>UkXlP%c~O|@1-ڕp 2,.ŏҨ2 x>]8kW028>%9h CRUbjZ)W`_=MxyFx'oglJr@=(mƖ *iё:.'WyU=Iϵ阙f[}N  ( M(Į#7`oN;>|j'Bi999Qy/_>,˦F6/ůL;yfԙ=~i_;sГ,T*8ڝa]@!h;cw>UsT ŢYO*(O U Ncf俺A!#_&!meeu?XUϹ.ҷ~{Ueidw{xy%6P }sO^6c,q,D<B_C3v˗/c;`~"4Ba# za RF@H@Y-l dMB!27| Ӄ1Ǽz6{X6|^wzů&7|G5Ju1sOS;«v֬˥yS'~AmreC[SkZ:'|}05-)׌7~ oz(?J;uް7qELO~{o;B{OMj-@rtTk*a\-Iz񮞯0f~_I{ls\kv_L~v'}g䶶zu󕒛NJE |_f;Lչ#ȍ1$9U-Kܠƈ̡רGy +eˉ c&˯sF[՗6okmڛ%O]1U/eA[OipYŲc(-pZaY\@}f _9od'NY~؎w^4ԋ\iWNԕܵdb€.fTu-n= G =23%iWe\qBCG 1Ñ 9;/<_wLǚPv1姖 [$~O.?x`10÷ 6[Ɣ(0ko!-: ׾6s@'36 C5vcۮe;V3jed;_\ގG$YRAY@̨:d@7$DvpgkNg+s8{6U#?^]|K`2o y-xݙ}A/B\L0׀Ť5G,V~e@`rzeu{2 v2si8Yw4kƔ j -_"6`¶R~%ʄbP{71]F\ZGӡSOiF>"2!BztXH}E3:?jj>mJuΩǁP8rK{ {Zx8s;ԋ;:vZlu@w@1tuWߺZzieQ._L]mM`=~a2'}.CwڵϞ GܵM@Q:EE: ٵw>Y!aNx°*jZuQ ܕ?9f枲]]jo`83?{=<#u0_e?JuASq 0HE~ EI{]߿ű2}@,D 47]K_/;kV}ކߧR6INmg6hzKR"ЭoaiC#x[%c]i8g.kM?2==0q䋗Sw7C;7ڲ3BݱXi5,ٹsɓ|̜0aM+>1cƊ^_WWw_~ 5|`0JK?XlVWK/аډ' ˹\;K/ `deegOǍ4tKKKKaa͉E>|8ۗ?=Ivaa**{?5ז-[#""^yer۶}wĉ>x_okkkjj**w[v֛&uYOp6&%x]~sDEwi2^EzqKo>b8R[HN]t;ݥxPqK1ɫv/$0E*@)a3ߊ^l}* 5F<޵5 N{{n钲MvV;@?WD=yݷgÆ ["S0c ^*!+7w{K[[6ju MͭV̇nv'7 YSy;n4~1z˭@nK_`=NcoURvÎ$꿪Xׯ_~Yhll:t ˖-j 4mX^SSs>ş~ĉ>Çؑdaad2)s __ț7gF̓o?رc&L4>˰2) IDAT?n_+++׭1cz\ܺȨy.,w[<{@mqfu((-ϭ֝?28t-[tШ K_}Ru- {1Ο_a8ciDŽZC7l.*vR goorc4 7z& QE;h]\KS`֣TnKgd{`zݗ{ϊpp>@ AM߫hKl_F*#I!@sgk\ieuj,V{8whHgKǫ噚tCL?l}ر=Wݹw0dȐ }4AKKkt2L&lAA6lGmmm ǁoNwxs: J뿿BrskM̔ԥ zP;#s{?Vd|o2N~A.Xv˥X뵓s\\5Jjf-wke10#ѥNj^Fᶈ96W/8/eƼ0–k1/ƙS8o=728`C4eL>_`JT,\L3zɇ*pq@g܅ݫDՖS$aFt#?v 2Or]SoyVT3OL:K{8qzi :z0ϜՏ^|qry15h^+ҳdZU͇QAJKM 4m[UwO2pB@wܾ6I#G蛘PEuZ1 LMbWJYrdc)[T|E'ңOغzS(c% KmA͔VݿwhB7n-;d"d%C4?󏭱kʡOoHDDou ٷ"D!/}{&&Є%:+f |~$/'I/mpn3ӏ_Qǫ֞[ZtfI]7v/W_~UlM?ӡ.<+q~ثѝ%kBdIx?z)L8t_gQS51j%u|"nҺ{Gy&o+-:@Ewo \zfieGDe7S2r}7isέ|ۻ|86e~ojѤM+;f‰?PoMw/)Ќ6sXs8ay&auk[L+^n#^ꌑ}8{#}1JbSs+sa]Z6Z#aZstt۷σ322̬I&?RF"ٳ租~pH(FFFjg3f̘1<1c2{{{_z|}}._}pjsՖz]e\.OHP~Ԛe^!.?5@r~MۤSK~痧3򏆼 _fFѺ2}t@ފ^W}_)>v/և~ O eљQJE >_[e^ ~nΦ곆yò "mIk-yf=;vfh[ﺆ\tb6 ;>NDDNDTf*%'n"Tļ<^gșyɥE漸Є_yՋ`GDHDy!8Ocs->՞嬘6J;e۱N]V3]4iȾeK{O1}QskU3ߧ3}df%r.Hc ZVq2qY[[/vM""6[c\vjԸ_lpq}&_\ADY[3G"5aV  ۻw/[p8ǏcXl6;%%e\qР ,ޮp7آwh;֨}<]ގ?1];ETTZog?\ -xwn^H[RUo-*j9j7twK,lHRSSyFb"zareeEnnnnn.[`̙G5,KܹSl͆e5к,--d2v?S/pG{9~.sZwo`ޫ.0~{3gqgPn?Ç_tPXWmmm/ܞyh$X_е۷X,6fPPP@@Xʕ'N~:~8ooWҽ,--[԰l_hյḿ+-:~=(w[nqϾ˭[,GG"*--Jbxԩwuujr-ZneeV?wҲ7n0=۷E 6L9%F~~o~Æ o߾pn744}*DZVVƼ{{{ ޽5kq&ݵ֭[+H &ݽlERk+=mm >]Z+%Rٟ?wW?W=v<[r7)aaaǎWT+W6m5%ΝLvDdkka ffaÆW.'&&j922r1z }G;wF'%vbbbiڵk-"6mhNl`zzzSiӦy/GnݺU; 8xoM*::j=Τ<=='Lokk+v MMMeM6MTzɆ|% 8pǎ_%{>}aÆɓ;wVwUUUED?m۶D$sss=v]"3g?|u"4h"""v e5nܸNqڕd%~|l`os0yQuuDwk(ʒ٭gyQ]e%>qQNOemJTcg{Gc$/UDDtihc'UaĥEj" ָ(d(~ vB"xu sY֘Lx|1UUzY_6tH5iP'>%[X}<gϞeiij\.'$$dڴTfhhЭ[ ̛7ѣGDTTThOB?8 oKHi#y{ ,߮]oqq=zto̙t~AqrrjԶQo%ܪ'n2~3u>bj ŸYw*VUDij 8.gܧ_XAKF_z#/?~W3Rl8?sэxN>)뷽UVVH*D Iy3Ak"kD }2C8n%sDoT^Xmоԡޅ7煮ïY|pꈎ;Yr׾ԡJaZ٪U  5zqw޼WS6ju־$4dbg1_OxcӗO/排K8`%mұB>KVOԻeņ2c᳧R%YjUPEeqޱ|E6D=Ǝ ""HԿX|PmUa۷ =z߼]vjggסCg%3xg̘pjA +sLNIIqww711133y斖ǎ۽{׆ }Dhaq*5J`癙aa(33+ {lllv?\pjvcV<|YzAQr~{BrJY%ό{Ld8sYqNRgVoBO"ػ;qJ)-{6e-V$kd֘}>oLw:w˩*_?S]/đy-LϺww'=N),,/Jo٢0G*aXތuhwD^JoYmޏ~:WBgN]l<!T^LVh0b7K{et ;wғywbiw|{["A# y=YX(Lc~ xBR|]iGՋ߉buk'\`mmS\\\]]]YYaeeռy .^zCSSMszCFCD*J 8sII7=+7V.^ػwo݉D$v!`َϔ(p\RQ{uorrryyyF+iND, ҺsFF]߅ukg"""ww7K%Z!-|ۻf.|=KfmN_T`ӲڧT(3~_I? ѓ<್>5O k[XՊ~[~٫O&gΨHR)kHd̆k1_<]c6+򝟂'[T(Xvm¢vBi5J"BAJ/lN{ns x́}ߞ;8٢,\5^tVљq]~~-Hlccr6mzu'''###XLDW<==7m(SپQyy˥CQ&MD"YvvNǎ̙lٿr >Jyy ?!JL .l۶lݔd2fÞ=?BaddvŨѣG?I +WQRRϥKmϴ)dΑ4Q&99&#GΜѣG$LHhبҎc*V[%"[tg;Tq4Iz.V}cx?}UiRz[-Wn^W2ɵܷ7qCYR&}L$gqy4׉Kf&\r>4OPV]se_97qWdW˖v D"ygyyyjjjDP(V\eooѩSAo۶]7_6""SXX(˙r***Jvp8r*+ܾ};0cڼ(...<ٙ'/!!a/m4owkW?:uԾ}EGx=L,‘xmBT5J_;J~2Ңmh__! "iF ΤtSY1ǝ05|.6FeaĠY{k+zݍmD2me7Nfҩ4YYe&]ܝx7_m`gîS*5+n{ Mܺ] 9?~V}||222ݻwWP( gϞ3fQ#,@KR"255ݼy i'KMMMY̔.JMMMv >\͝;1wm6v7&ʜܜ\`3gih4۷oW(||Y,S ׹s73 '"ex+ԵěJuiʕ+W\vڗ;:rp>&OJQ z$ª؄*s||M,;t0yFEb27qxO#2 gːuyej"]NuޜGD敫3 {33_ߘoػwp a^ߵ]'L;OM2;{@O'}L[%'V5"?QsY18]{ UkB5gB__ߌ }sWCC7۱욚7Ï>r`ZLWj0"d2|>S'dƎ[Z^^S{KSpqqV̝n޼kDoIDATfsz Нx^DsYf3?n~b(ͪQ(Gő hxq KAA1K&00{'200*\οW~sv?J]I2o߮+(N?ba;jN˱rpOT6w^OUeuyʝf̷O\ϡ|i@ȿkO坽??}ʲ¤Sjˆ (8x SL /-%Y5ښ{ȵbWFFt;v(( ͛EM61bdc?hٲ%100411vttUUUׯ_9rd~~8p vK.  Wh]FDbSյʕ+(Ν2% '''O4IPpXm F87t˗_nddԾ} ~b: ۷i+O,-toOϗ/{6). ?[Reϩ.7M=evaDRVVv=fݻ[[[3-[8qˑBdĈBM2W^:oʼ&\Zć&Җp4I<$.1clW);;]D@GL;!.濫}x3a$kvv1~k1Xvmn[[V:0ag7n3zРAFV#F wuu555H$n ;\YB={vt2"2002%GV_gϞϗ^^^ǏkڴP( fݴiS]]]%ɓ'͟\hNCCC@*;uhTBVh]#'Ouk-ٳg?lmmwؾt鲴#GҊ+^ccҦMNDԣG#GZYY{hh@ 4@8WI~G%);t(Al#7n5jB:|8Ç lTOOoʔ6m4oHݑ 'Ԩv MD&D;w2}S۷WǏܹ… V\L ^QQasrrhݺuέg:$$ƚ:|ɝ;wRUUUDڶmKDr<77cw%={vO)..&ŋyzz[.&&ڵk.\(djב#7nzZϬgT"s\elͭ,Dž6I>FDk֬=Z=zt1bu~~/;vrm.]b;z޽Ν; ^HDVqeF7KUVYSc nJh`Lc?JόM(u\.W,jjENڹ3}66 hUSSsԩ~՛5yWVxgϮmbb註u>ߢEHooom~,xVyKo"V)M2ڵo?ߣGovΜ999op~ksI&̧̭^_Q*\C sQsY1j8/zE6Dr1}}}kk+"D^^^bСG;v,:FÛ޾}ˑ®Qn8r޽cǎzY\\wޜ;vnݺޣ- '?8**Z(vYwVqqH$JKKd߹sG uaϞ=%Fэi񷼽}V:tf+-F9ңӌ yfffXݻ$78&͏M?U׽N偡><]ybinI.;88X[WWWWVVXYY5ow妧׶n>|ԤiӦD✞ɚ*J 8kW\t١C׮]S/ + /```IYYYii)3%/OգGwŜH 032l6Qw.o``T*)999zzzvvv]v񭏏OBBBJJJv 3U4A~2 "^uk @ hڙ2Xj2+L&3!,K0Z"Ɩ6mڵNNNFFFb"#xzznڴQ $'DE]}}cnWX.:t4i"̲s:v8ge-[XHT>>AJKݻ]@( ³gώ3zԨoR)n޼ܴ˥`֬DdffL\=zdgb͛7o<8x_h22pBR.\ػwo\L)/vωHHEEeNNnNN.[`̙۶mKNNy6{[XX=z,f͵7J_Y)JyTT*-o>_n;:rp>&OjǓgjq1;hEe0?vm[FkFbcsss{L G=oc555nnm}VQQt!d&0兝TjPXXV|}}B̙f͚=kÇ?ST*kxgg>ߜyT?3DV6tݼy;ҥuܹSh.ffΜ%JD$'MP(\NPPPLLPk4sC| 7nЮse桥چgG[z V,M#2\E]pq3:>>{̦8%|bri``R| ޞ'yM<J4Nh=:hxEeqصnU5r-Hږ{h׮]QQ Ν;}4SSSDr֭ï|e˖|"rvn뛔ČKkʔ[V_:|.^f+ W\6d1bFY?iii l;;;k˦g.**p"MBDBp͚YYY!""B ~ w 5 3 yeر/1osrrtwbbbppZ&AAcsWXq?h4vCJڙڇ'OvM69r "ݵkWPP!˖ގ'.\UDDlsga?e˖8 \]]kOc汙n7tcU:xo98JOOۼz: @fW&f^;+B5H {b4{b48 V8 (*I@?           o"IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/security/000077500000000000000000000000001461403617600220635ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/security/image01.png000066400000000000000000001513071461403617600240230ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwxTUI#!!&H4׵evRW\DJ;I(@BR'~BB$@<̽w̝a9cPĉ=p0k,cl t2 `v;.g..%K@9t0'p\)f35k`=\QQǩDDDDDDR.Y!6,ͦ*]a0 S3vi԰>ILga)̶leK&YEˍrkv:U)""""Rnn%/1>dgrp98UUVk1[W*,|ߞK[ۋHqi߮E۱s'/rL@'Lwxlc2̞Cað؋V!w%w^h>. d2xG+q^ g_.qe2̞=璃\͞=l_\wo~-8ف^&ORVw(.pyV)""""炩T)ݚf SNGe VɓOut6 g+q-Y}{ S)x. """" %,fd͖R eID\E)""";R)ʩԹ~yQ˧M7U,r5Z ^z>}zUx9u>Z$4hU}ӶMs6:E2(e07~<̚՝H3,?c޷ooCe ߺloy}S^7|8&7M)Ggc)[ӳ6 䒙=[Xo)ty|`q$(M-n{УUCjYd$p|O|g[w='.no.e6a j)5لRʹpɓe _x_I*n ї~/&K&51([+eߊ0zx׉<^;j>,3.ྼg_b);u#V&)N'#̛?#FШQ>*IDDDD*= ںHW#=g{ vz_B>3u}H!O٩k6nOs}EvyZO{Ico͒O}ޱ>ƍ,ٖDWOr˰|Ye]Z6\ŶgfəLk?O| .nSS$nZ~xZAľxlθDF =û"LNDzmco1jy_Gxi8r@Z=gьg<8yKq5E]C#Աo'HU |gZ< \~Wf|TVCxtg#(>9_MBxyAN[njʹ7r~З[:Lc̋534}'Gh}{:Xi/ѩ Nj7C}ճP׳#&͉b,DOo !z4Ofqi뎗xZO;}`4D /s걧::]:bjN~&G/K`ѩce:v`۶tI""""|iwݕG<ϜkYzvH<]_->NH.ћcS߾L9 /QQúbl.R;!<75vDyzY-Xޚ'ߒuq\$xXXF̬ (Om3Ki^+]}Ӭ}g >g[ng3u>H/;> -vMqRs9 n?ajmc Qn۶ ;+ Yv~^DDDDD7nB3qfNǺ'`8a[e~__̴?|=׃߅㛭= ·x01ԛ Bo}^pCeҖD=_6@5>2h{w%o; 5#bU KיOAb~4k; %JǦ_6%F''qvHXxuk2sI[NuUkxȍonϝ:v 7^+pQ '(VpU03'vpp29FuKFsM^N };үqYŮ7/ȓt喎~lRq~bIWo; ĵm6丩y+wqrhj 嗪3uL][7,ܝM\w.5t鋏S-GNHmgpB/fG;y7{-f{„.D}6 .Ot-#߳hQ1a(W=!? yi`5l))DmH:\?&&K; s@[>Y/QSY!;w_Ȑa]K8,ͫXu##u ;@ Ny_o$߆ađ}}uıx6^lъK6xelg4w<ďJ\gwߟx C;LE!={)6G? O?#nOMut2'b\awxTw 7=ѝ[Rcͤh* 8b_ADDDDD2cСC Q EE=mbևW{z-kKY7s"""""U%ۼ}TM\Cy"DDDDwH300,&3^6fF~ |xyȵrpxՍ~p`ՊjDDDD\F`QQB4@nn7x+r}zjes*LƎEDDM7bMdTgtz:wMӿ)c,""""ryـȵe{cn"#35a=wZ@5/X\['$+vV__zгRBp.y^Νҹ3# wߣuV2`U{~UcD4YfDGGspi}RU!>zɅmhy}=r7mp~9:waݺ|^,o#5k @`ꤤTzk&Noô3* ]0HH?>s.u7mVV>y̙q;0h wϟ_;oyΌW~=SLewŜ09dfg1;:e*ݺu'Uᶄөu4ЈNZR˦""""WJ߾}ׯ_p8͚6F͚l]pp0mZ5rd7*v|[!9%]pYYYzЖj<LS͟_h}Rr2_~5t޽\t\O>ŗؾs~)bZmF<أWyrRg_:{y@径xgЃ kbN:)I~O QM;)fnv2xj@#OgJE4^ۯo=K!T#CYVs1W' 6!Ee,]s{+ڜl;]DDDD2͛5V4mڔ\ގ?=;TکP C}' sF7=egx~&5ɴ=3mNG_MP8[3;|{/ϸL߾"a^ %lHYKIG7DF0#ʫ)}zovWyYfj6os܈եW>9 7 :+Y^Ʈo|[ WkܳGϼ_0-vJ喛1LƛS[FiJw+5'$o8@&աYj*\0 =Rb'^V/]Oݞ۲,e!jodx3MM`YlMQ@5L6m`2 nm< 5-dgNFfFɺ7C`cQ=F-^'._b?xm^'o]Mz1OVLO)ɤmW2.kKdy1}F̄"8]14{?9懿's!$ۨGQgoiĝtД L>2iװѳy5-ʨ`}(ɠƝ%5=~ˢ nבCG9d''"""RPjZ*|= Yz &Mof>!,`edd0yLUWwR?pE@\xۼuCO||}buV~BBM6Qݿϰ| Kԏ(U7L;ǨN3 uA[M.>uQl[RZKnxu\hW?QzznK궃AnNg׉gP|}υ~kzGl &]tYc)i4HX6lñ '""""rNVV|!ߗj2n[DEF_V#bYAÆ H?AvNvu>>ԭCL̑rub*srmL<ȓ|'GGfe&3C:ZسtӓI5ZpH Au)Rs.{pF0Wj66,ΔiC3՞IZ{}Iy=@fHs3).W-ϙObuOf(N` r""""/?gϞ=t׹^V/uΞ={K~ˣjHݺ|1wz~}ק&#G 'nJÀAC*}}|+4̟{޽z1rĈ nצU+n<L^_o(`ݺmӖ:!~c m[_~-iC!̘yp=Y#O@ڵ>{VzwlNؕmK#'0ZٜL=Bz"l/>>'g!$, }z$>]-3$pD;աS)&+8t:;j۰bQ\.$$ ǞCXX8aasHL:IRRRt oF}LISOsyy<|8c`s5|/ IDATTͪW[/T~]|Qnj֨m۴[oéԲu--vK/^#0xq|!ѐm0'a5s?kefkJ4hф^FhB:!Ԭߐp_+v{.-"""R&MpD"cƌgge豜HqFݿZkx\.4UㆍxhтG{&4_d^ȝ Lnqb.zϮď^_`=SA4ۖY6 J7KqQd5554'w,`ne[ҌD.Q<ԥ{]?~V\9d"r9l?@߾#igqvt/ "ޝ>iI7ưaҸW;zyc83I;%6bؼldҥMfbvcaϵ򻿹Ƕbj^V^C^7pT*˖-`!gn.ƍe+*s,cСC(ߔvntz+r/oA=4nf]lڴV(9R ޭ[7{9fLݨqcMӼ;lذA^W)Sy*0_g%)J-yG˟KfZ;|DEGa*Eֿo_zf͚CVv퉾>;FzXQ)U %k0j԰~`x.RꀀFED5o@tTQ0gOV^-,y,բvx"d7J/N|NNq?2vey mcmQ}`;y;rۨioo53D1e͞'vg^`A`݌h4pQ&9u Os#u5oZ=SY>=֞%8IF5Nd$ao y{_确UwhP U"grk>k&Mv˾囊߼!+ tv2XŻ<obڲc[~kE,h֌UkNf:zrx#)֢[RٲcO,k|;[NoXq~NJ%ը~T~4`a͠U'c׭|nb@nٮgH|{%5;LԛODDDD2e||~NWTQ_t n91H&jk9RNy۟ơ5qæXs4)x͉%go7Ud7|53}Q+-Xw}>)[#`Y.J8Q|lه?ȱ7Zw)'q'퇯E݉A.iv-$dx@=oASQ`kJ] &-k4Ğ_~]m l8u7a65;E|׿Bة"!""""rmA q۪W6bFEI.PNv6we}R^28͊%n1ǃpo"ˍLN q1 S?|g|P~TG <9x,Ou?bu&.Ym -X;i_65ѤF6DۀW|/$!8==|wQBjiT5a~rJ(*g \}-<)/8~.m^Z 5l^ZС`.x{?XW([r#6k4m6/OÕMr&xl o7dd.,x 23.z,.7[ΆeB@'6vfB} I756n1? ߈%)u\:2]GK׋04 iNfTfcn3k*pQ&9eEDR V@B7YϾĨ^/7~ щ'rk~ɤSJ+F*8'4 =~b~n٬_ν*;QڇB3S9ݿUD0r5jѽpdڢ)ȭՖ[N3yzmL0x1a5Ճ;n28k^XQ71ilN{ F4ǍmlYt(9~w'Oq'CeoV}t3吙YjGց?ry!""""|b?^%flɌe^o˿3?=Oݳk$md=6_:OAQV䮛 nk Z -mCDZy\Fg IdLMy֓? HX[zwnCD?6r>zMֱ%\=OϾ_nk45o*<0UNysVР&euܳo3-^tב˗W~fmJcXڤ$f J5Yqm1̾.ll@F+ӷpŎodbSPDDDD nupB/2FhG/23u.&l`ܹ@y0o}lFJ`NSs'\7ۮKj%M>Z4HxۊtS^c֪t?s* :oZ4F*]ÞJ\"a p:ۗ6zvDϮf kZa}"^ߺ/:k&u.iYj:n>5f޾snw""ӭ}k:M_ VIV-x~~7h';lĠ!cn]qΫ7X=)"""""\~8a5?,^öc$J#yPVTun5^YRb'"S~>>〰܅zѳU͊NR63/:Lih7jV *.Co]-WDDDDD/_>|w \v^&'QxNa cY{l?kqWxhP駟jˮKŠ%%{9 &1~x 9>{PßzW.6ﲈU4>&ߝ7m7sS2Nr4QLZ/u[{Y:O=*=q,]zL0prpN Y.R{,|jڤzȈe("""""5eZ>Ld־30J |1Y|Y?CuL򺉈p٤aBaԃX4Y%T P؞JݬY$^[)a}WJ i吵͞C[CC૎'@lM˧\[u;N70Gr΄P'O@e`歏-e3~e[\{Gj-;]¯  ǁLg߈9s.i^_ ѷsXEfO,;FDDDDDkبGP8ZV|ĭ؟mq ƚX}ގ}V0½ l֑#ygl>jMoOsu]ֶ!pL=5ѹ{\jRb@VbK!];x74Q7hzL5EbB]jQ{Aß?OɇWnÄw޼չ4/LſuGOږf7FS_Rb$bkDDDDDJ Ӛwg,y'[-i@.}xMt :;@|6U;-ԮGݹ)o^ԽQ&_d~:N©,2yfY->֩Gxftן74>Ǔ2XylnAkܐ%p'^=[HquH]*:ts8o}Gkl԰5ZDDDDDD `QQQQQQQQુųj*.<%\.""""""W ՑaahALnp(Zf6ȌKo+N3Dx%3r=Lկ/7N6Lv sxcrl$ɽ 'yy[\! f" >iNYNuf?LoU\7u3D>Mk Cie='L7涚qI+YˋGatYWH9 \=>b'76g6S`\w7dj.Ot7X+55ê)l't_lx$7Gg}.˳}xgL83֠tz #w6ts}~;xq]:vAqMo e|Z˫N筻iuy>Jڱlf20i;ÍgkdDKWH9]3p[x$n&ƙfj yaU`DwQ Ɵ;LBB WQDQ,X]{u{,vյ`_**EEPz%g~((w$3sg7yo_^qG̥w+R22+W~[ YȓK(B8P IDATYhܒO?ŋ7|>~Q,n7jy5%'2}ŴrhvyqƸ"jYy!Vsy//$3*4_c e0~ktٜ04|WdgFdկ) x?/a9òSlK$I_b ܀%>sgW!$zȴCiF .دJ]ġ=k`<4w T qڪ8yw53c%?^ȉSy=֎1Y)p&)$/di[-b̢9Tɭ= t)7PsiK$I6 K!S&O`q[+Crlji3?Ղg~:Gi<$I$iKi٪uM7-lOku;0x DR$IvK hZ&r[/4@$Ivۘ,I$IN$Ig$IJh|n2E3:g@jMpX$I*iKx%.3̌J\C͛$Imxjp\݄mgr㹨zSsF:@$I$mhMl ;@$IJmg(/6xuc#cr>ˬYXߔ,w[YO%I$is*/~KBHnН{%6j 'mF)m(lc7NjT:$W w=wnt$I-`^* !@t^^^JF,K@X/x)Tswvr$I&.HZ-iΏ<`wg4%eE~39:/+጖df <6U+v{8$fr8ɼ^fsg0 H}x^C(`Դܵh&J 9w;,|D0e"s{@f@X88Gwɼo@Y:iѾy^:} j¥A1$I6p.] pPJ`xv|mHۙG +噩?K@XϋsూPƸü5V>I,DiLY5fquAӵ;LVHnr P7KEIޝFI߼oh9߹=$I6ey4T33l://-NE*jffW: niq$fB!>-Hm^mٛk?(xB+">w>;cǵ͠C]9n8Pmni<4smػ.PNE{X$INf0Nј`ؓR\0|JoHNJ88I+69y-^mJ f ~I;w&@"&@>#=s6ǂeK$Itx{Y>/-Ϡ] Q@6f4eǑh2m1 0Oү()7ޅU+ $IM׿KnYɹ\ZX($fE@)(.C*Qd!?\VTciplAd#=GuZ@iIi9Yd73$I62F,"\]EIxmDVoClXs>E3!RAȌexjp9m9>gV΃pOxFu.ÃqہE?p@*D[:9ѐcy`4.+ rh*qjWݚ9,I$i([EU׸)ՊX>e!r^sfwOeB9R {p mInt(#k6ᰒI1k-I2Qy5%Kw6w f:59O%` G#ux!Zx`X2y2Ə[Na),,$##Q$I*0 Ð}gTx[qmߍ6:_ ۜF,# //*UF-[IK$IRe_j~̡i9j `I$I^o}uڠ/O wVI$I$Ȉ8nYg7rX$IdK$IdK$IdK$IښtLN`b"Cmi4fK$I:A@\5;(S&-Y_1_z?ó@K$IAQ.C&ТI6rVvX$I7<:ߛjR/OM昴|Po7 TvX$Iچ7 C"X2{j=DDWlW$''D*9X$I h4J$%%!a:0Sʽ *,I$maE6 `I$I[4RV"$IdH[$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$I8GL$IUFMژGQ.\HII Dі$I$"X त$HII! CG]$I[9Ax(H$I$m^& #%I$I[So͵`I$I&^I$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$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$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I䒶w3~z%%sO/3rbʒe.`˽Nr$I07/p]3kEQ8o>KI$I2%߽eEg CzUճtz̭у_H7W$I$E Vf8[x ykM$Iœ`5K%o/u|2rL$I֣0<`X² :;3N};%,1'Q?`ΒYm3{=եʊ{tY1pN~|ʂV\M{$#'dQA)ar24Gs!;Qk|]?vWoS/Kd枝}琛x(Qڢ\k !ItӋ#-]$IG͚5ϟOժURv3flqi˰)KX^e3G/,%7{-^zӖP@YR7]яdF%|stכ|R@iY! 'G|T7%I$mbwu:t`ررcҾ}{j*W~ѦݸpugqB{gz!.{'75JySQ#B@|߹WWq\誅wxv|L( 7CI yx}iao_ƁK6ߘ9׷uŏ{noڝ=[$I]pdggӫW/F5jzf͚՘U:*wdJ*nյxtnJp?xyN|퇆SyȊ8N;"n٧i7r3+XưiB:K,ݘ]wڡb%hqg>tPO@!Ç{nqIN;Pkfub!eQִI$iUF >SzI޽裏h߾o޽Y&}5j0JlFۂcՏMi ~1+kS\WhYԉ2$62G ]-1VO[%@5G%I$mB5k\#}]:u~7ӧ1a/Kn˯ծٰ&pB.NoE D]ϳDKf˜4nЫZ0={3T~uts@nJ$IڌܣG: ~mv} aFnnv=XYڤ-X$X%%m`qA͜|ݳ=XELj֡~ԩy%I$K>}+nӧvPfS҈ŀM}{j B g?z 88U~EKMlN0cK$Ihuԩo߾۷:ulcTEj^I)=f]Ӑ+&up)cnĜ# jӳﮫ]ﷀYsqU e-lUkK$IFLNN}o߾.:tlZ۴oaj{^:mݏ#2k^w vQ~i6:,hh<~(6y}k䒳r vj\7Op%$IvA|g䐓g}fPNc>ݨ;}f|_tEb6_-us#=o<-yDoF,,ɳp卜׿*7h?ӆ]^9촋88ޒ o?3ˇ79<^t1'AsN>cLʟΧ˅ͽCiyٻX-mڱo1gkt[$I4~+u.Oߓr҈E[8dgPZYaSJ2əToՖ}.7>GtykA뽎~7ҷE{Nsb]6^uҽQ6U TV9;xxFTx ,[2g7^u*dkƮ K$Ixai7s"I$IۂfW-Q* bhtHxe0R9;#ԯy$I$i[0cy7孋)#l@87G4Or$ImH7L,9ոlE[W]Vg\\Y_I$IVuaO[*Xy|qgI$Iچկab>[?$I$i/>KKeX`Q+jkV=:ֈpB$b$IoV;Oe|2 'szG.9o' 1`* HZ7I 'MfX&-۱OV=H$UN9}BȊ²wDIP喽sh[yZU?-Kǖ0LJ2-#$"IwT Ghp/@xz&mvROiʉG#u[f?ug3e=c;q+7'<kxsѪ~~Ӻ_¨+UyA&Z 'r\p*/r G`E=8~;"~'^SGsj_N v\GD/c4 ]P:KMa{rx㎃H%O;h g(SΚOo|>]D,)FՎGr=hw=ip$ϜԶq.L7Yݸ)=d\ %e!;_{y^֋;b\jԧqW>yTgcsr kjzIm̜>m vjێ:w1waAj1jEvhj鬬7{dS2*QeoYWgDGY5됋@~@.; |wu>3w=*f}E #YTywx@x:׏,ws8:}.tnBѸe;uExlt],>xk7c4gh [O"ÞsqhT |n{\>#A^I {ݓ.ϝw?뒴`(_>~'3ws˧ʸtL⽋Z^ݞ|x?kx&0yfNJ_-Oq׽pN,9 ֗So1{yg.| ''1cu|Lv꫶Cw$I۠ ߊg!cGg +^ E"ܗ5Fj9_ eh¹v*|P:. gwnʜlzMY@"zOG1&iӉN!9ԬWHNO\FXxaMj~9ugB B2W;Clʇ\}KrY˻_Ȼuͱ?k$I<p"dR4 B>l*9Avy^1lc9w:Mϣ5)E/%(dK Xv6C|yFWq sՑ̝RVW ڊ _987( < AiWhbXqnI}.yoKJ~lwM$:D4SsةUKḂ$G)O c8F ,m7lݬgwNTM#X4ȧo83,gQi493~yo6U/RorGW&鞾\ >_zחa2իU%pn_6~?0fDFp(X!ddl8gkQO~!L܈e3Kq$f3uXcl;wOu|T^~ x"=$IҶγQA~Ghd^Lɼ_ w7AY Jqlo)i?Ua\<e}6ًct2/aQ;ZgF^ć?os%͙ cۥ3v)t,Þ=cj\}Ԍƛxiz);-n|Zt߅a]7!eKKP?R@ii1O^A7p> ('$v;i0_aűL~nߔǩx4&3Ò:h[}k9qӭ<ҼL5c{$IҶ?!γ8AgEOˋjv>-huRW(׺$iH|rJ}q?Kh84;:'- ?$LKf`ٓK:zMwhBQm \|NQI5F>}}oq=c~/r_ޚs^8K/g=";$g.#&`ޒ,/K"#= i|wsdmN{6f#I-_O=3$'%յUIJJ";$lպ&:g$HF$| hiz-bq=ճ1TUHݖ?y YPn:p{JXmR;'.vzñϽƱ+psee\=/[IIbSʷK)l4~%I-֖ h)Ͻ) mMI\$IⲲYxF=FN,I$I\:p~a,'!Mf-a6$I$rIh׾wn I$I -W t\g$I ?`'+י$IV{ );$1baEYdX# <\$IѲbpn[J$IiϪ$I$$I$$I$ن!a&$I$i[t_Җ} P $Im ^9 > I$I۰-X-z p%H$IҶ.⇿n 7I$Iƅ'$Im~^I$I]0%I$I$I$I$I$IHC I$zJ#X$IL#~Wm- `I$I=~0d„ jϧʤK=ӬYޖ"c%I$m?'^{?3f0~R̘1W^~&g$I H0lPvqGz7Vf 9?#Æy$E,3$I6k' ͛ @=߭Tnn.=`$mn$I#>kɳP7GU Wq_Ijr9 7I-ȉ-ͤTRȔ6-U$Iz׎>?a njaBaHvP-h O?Onxnk'c]T݁ﺊ^a@wpC2aL=|WGMf>UlWljP/yA}\^Exfx&&Qqхlޖ3pxlDOJ4.I$WK K⳸q\N;V̘F=L?,.6IֿxcZ_a@7mx'8z1W=ʈZ"Gz D0?#yA j4qל֕`߇]~gZL_!p'GjCw]٠>@%, ]طsvYtJ;4ozAr@/y|vګ+ݪ}aw3媋Сh<ML,4^y[jە3 kL``n|; y }/kVcf{9$h?wm@rǃ}i0۹nD{ >gz_喁I},W^wY~w[ IC,F Wz{܁̰>CX5t6{|kǟ҅!X1ɵJ ӟK2;pGbƽ}?{6uzRIagaQ zk(YKZ$C8Si3~E WXAa{'6+g^˽^܍MdؤBNL Rƌ?p3|yzOj/ b :1& 9U#5qC_ `Աg߮9tͻrHVD s(gۋa28|):u0dBРk756:YH$ii``^5xz&DңW:bÃNX:O&WnpJԣSx~y[O=:8R4>JAJ+οb͎91svytcxsjN=9됲nn[g魸=H%NV8_G))-$ (hkқѹybI{#G)%eX\'AAMgPf5`&/ոF]jTO1%̛V+ϦëQx&?k?{*S!iσV8L cۿ=?ϢOZ mG>GptI$mWc`E{'yg\eLYH^{2L ! c'RѦ^&g+4Tm$$lݝ?dxfξdzT[jdRWn^M -ǫbٔ,p3|Ψ{lh}iFeO)_?1҈wsg[Mq,{5>]VSs$R>ZVO8^",f Z$IڮA#ٌ^Phs4Hj9|3/eлډ;sLφ |o˗c{|y{b#U>v҇A(;ƿ7 ֗I?23smpNcWfXGyhv]5] I^Ң pb犿|Ŷ <6V+2k?s .{OH_`M"\KP(wWӉz|λ|XFQ`יɉ&9&ܔ-A߾}˗h?I'##DW$IJ0 Ðܼ<nuӟ|!~ȅ[W]C|\Asm'99h4J$6nzuk%I$bV|3c҃<Nϕ\$I0q2듪\$IT= @ "$I$$I$$Iߧtnܰq `I$IA@  ^X$It@0%I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$$I$$I$$I$އ0@䣬p;[qiMn$I UTȝ~N3iē9$IH%yњIKcx\^/*LƓgIiӇsGLğO|v/G=0hْ 8Wu61xfBVhHsGrIۊ&O;gMG{yYiȈKv>R0!z*`Xޟ8^͸1Xq+yMs'5 귞 3Y=JC: 9a˹ݸt޹i=%?8yWS񌷨za3+xLYrN BzTvOzI$I~%\2E=щ,]#ynC|Rz%w#'m!@ y~a<6Zz­@ǸqV^>ķ`x>ݰ8u|M++R:[gy ^sLy4y ^فWKs#S#h=<2='=UdeԣLxyZT;nYn1gѣsf E&0̸µ|y>4Ǐ*Ǵx^a ?:$I$V? lz[;31.Ԍ2u9ap'~?/?fPOjEYL#^Y_$G]Ƴ^5 9>E IDAT MweΆ;1CTLRaOs[S1b*fɬZbnEZӐR@Y+jBCQ+䆴mzo6;;$2S3mҟ-GxlZr@9?x PTI"9.̐h4hh}}||}$I$i?[L+.8{w{,kF&U^RzZm} EP/gWX)ݷ/_m4]Wȇ| 㝃X֨Dݏϖ_akә-8L.+OҮWT&8P>~⊧pK6R0 k^woYÆ̻v2l Uv}]i3Ӧy3<-<$Idۅqwwwew<~hέLh~ i$ס Δa2J#(Zn>d,ٷZ}X1+~o8g{^͘a$Iw@("H)cxdE'ԮLkYαkW&RrbجR[7\u*kb'ߵK1-]̒W_W,OiɠCEƒe *ҰR +u-[,E+S-v3i{|7-[293ȉ/G.GreF$Idiɥ}spsG7lʃy/ܦ'"1+yiAox5$iMS\gc9ixtO¶mxV6}ZSi <& opWs9DV93R-9}E0IvR|dh~Ǔ_eS^q/]*Q$I$$Jϡo\2w u6KsNb􈮿Ko^ 3{>Wpǐų GS9Y;*i[侅?{I _\|&'<ۗ/=k΅Mbq!O;Grұ2ik4ՙ3rưGKKxio(TD._s OKȱsÂ\t$I$} CV,/΢'-**,}J^ύ'I$I[xK6II󱍛^ $I$@fK$I2kK$IK$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$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%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$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I?} 0 ]$IT /v.Ѯ$ITRAWpcaKŸEH$IR {ٷBQ[$I$tE|}aQ$I$paQсJ$IRgh?/$I$I: $I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$I_[*&c*#NEd6mǀ ]$Id !4n݈qA^W-apU[Ixz&:.I$Ip Ԕw^M0 y#xh]!};EY-O MgcLͶ}M,O3o3{V2d#*bzGS쁷7x1֖j˅I0Ƌ/1gfsOH[aȖT-WA$I \-,j K^CKy4`Ǻ5l i{o-ҋ(jӉu&b8ė)S!Ʊ)k5VLo ;m+rBj7YJB(C1t#W~i@ժO4ojl;}UM㖝9Q4-$I$ܤZ1[_}Kڶ|$gN9RN aP~Ϥi?0R&.s/v>f?dK Ӓ+:VT5&at8%ʧ헃pe o$I$I׶1|FD"\&W6NJ$I$I$ ;]/p $I$i? $I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$ I$I%ܟbA@eUH$IR D%Dq&C\\ Ea!I$I%HD"A+I$I%: ܫ1~ $I4T0~%I$> ^I$It@0%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$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X{Yzw@.$IR9u '댇8~?Ėƾ365;tJkӃg@K)5w|ig̈́B%I_}Ϙ\ ˴?b6SqLf'0il bI^u#lZCOZAi*w<+FCj~>{|ME!է^绵5r̰ڢ"2;!7_L=(Nv"󽏘Q>rU+xqKɫnӲSxq,ό5\0gh^:;drÇ=r^x3bIs!O[$>u9L\Aʰ{T%V7lٕ'xnzo@a#m_ o͕9۹IȲ O[3Y) x Mj>jŒP1g{ȖGqQߺ!i}m}q<U \CSHz$v.nI>/_ t '܌=-ѓR4?m17=,?돗WPiVKzK9疿}GNyhԘ,׏[DΙ{-4 QYX^PDt$}3teبG?Y!a\HIlŹrBD”9hF~c}9?B>d(O]ڋ{%p -ÈQp^{JO7\gհaXuocܲBW$Iqq9zY>v8Ԣ̆xʬeºx^t5)Meg,֍3/:Wdä'txଭ@V4 Q!~W({dK;j Cθf z$v7 υ49]H\v*}:6c|Cz~/Î|,^AneK \deeä߄NnGă:3?gi-χ%,PF ;&Nevai8'PX W$egpeߣ,A8 Bbiz@?ZO~5H k{R]<W${hĠq/vݮҀ8}y,ې \$¸86B9W1g}wMu=<7s;e;zV`kzg򄦝ֻ9e{w":$eۖf]ͨ.+W(~#!TkZ4.! [&3ݏ+Xln$P|D2AJǯay8#$!n3?gR 勃8jcU-~"z_I2I[XD #+7_ud6v*'Ύp*'?n\b"!D\$/hQR@TVd4Tjt[A 7w19d4NE#,QRObeE l7X̎L_q}?K}'rW^xƤq .nޞhϖ(qM8at v˅PssY9oC}S{pwDټ5H([aU:x lY ٲ-@rb"WSR2 YC~< e $I3F١19_c=iB^~6~)ge¯dW7w$/_/csL ?wW> `ͭ7dEkP!._Ē]cUAhTY.XVC}a:Ԏ "ՄԦ4.!//Jbb[O`cpUO30#OChѭ91u[{ʍ΃wߩ,ϋRVA(tYLy>3^>y36P@+7y/кm-¸8q aʂuqF]q7e&szv3/;>b壗s 8ll{>rF&$ѿ$.};8Q&3&~ 'VL7WǸloΛG#@H$/Vݹ6gzʫLQd鏰S.Ҕׁ!CbpK s׭~}+'m܍!'wT坜w\z!}+HbU{!WwL ?Wl1-hɀ.ow"$G`nFjt!#ھ _MU?wUd ?O >F'ǐ$/7n^a\5z GN43Y=Ԏ#h}\=1G bPD`~N %}!+//\pEEE/x3S;S|h5r U!} WW;͇e/]L0%ORD=$g,$}{> TjޙӇAN}]IJJ$66H!q_׫[d]} 757%I A$It u$'Jws$I $I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$/bKB-Z5+I$Iƍ(I$I]%I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$Ho7^d9 $JNV횜p҉gi_rmYp+I~$''E rm>KD2%3o ITVLdDxakA81CsWٿ~W"7 ϔ]ôiLf IDAT{C.vZ!,ܚuB Z>OcamȘ l-"װdM!5"n==w?ka/333c'|l%)KL$1k;ĤĽ"%1mJ$Iڿ/Xz5Z;ٛ_4 h\ѵS35#.GR@{ӶpS1cvaeFO"`VRIM62}A3{uJ UP!'/~K7%qPM||M<=oOj"Y$JIR3=4J~oy] m=$ID٤/J&(wygkװ2*-Ev?$ਦw3 ? j +"UiR3Bdg6S~Up-ӢSݓNX_zbW-!-]}$ ŷ=8u<3 mFF}=nrIdfm더5r,2ꖭYDQmF$IYDL nwN7'Qd1kS?%†e[ɨQZ{Fnj҂ y:l[Օn5iUiU# 6m9 +ТOYl5k4~\@lZMio.)H+Ǯ`pLu5>5[?kǮwpUۊ{F$.˲݇kF*I[e?,& 4an1$InNcqΞAZCoCdLZNzF[>ؼbsӌ,В~&f#jŗ5ZRMS"Z2Q7ԪW||lx6]v):1y?;ULՃ8yd$X2YL xl Cҷ\[l_&;.}9[qtiPҹH!cy ZGI{)^ؕqd|X_w$ \3/uju׷) 䓗f"7,I~elٛ{ }du&|WBnA:o7B4[=f$\jׯޗC=.q]MU? \A~u{=ӟ3S#Kbv ]/|6۷o_br-?iQQdff^皐~?_}v uw 4c>~,~9]Q&snF/@oݩrҌ?#?sfX3vN+%KZ)l{f?6뷟S7ptQw&))X"?~MRw]n9, JصLF]YD)[9y\Kb>l Яj>y]B> يI9i5S#CNe(ؼ鯽K2(e䴞maiI, Iڡ3{*5 ڼ^iTIwНԔxwl 7xU~ޱՄr4?p*}:oIgrLęp iG'+aCK ~gTmH*U.v9aLѿs*٬]ƽ=mڃ囯0zV*dgy|ǭҒs´f.9 ӄcU$7c8e-RֵSD$@q) JS# 93(8پay@vG3ԋ O:@ ncMgsBqhrH(+# yk8KCQuWW|*ogѭJ utqn′뎥M45[BjM]ie]붒W5mk]~jNOēGF~2kW ˣ )=&ّa :PE3wEl64"%,3y-ZX\29T |BvU˭G0, Nk\~s9T9?#&I=;'_:61-OGoN IJAa@ڝ9ozt:gvN%t;x:AExwց;6!4ڷb^O׉$Iҁ` >MfGrE#9k\q뻬]ڐ~&VPѷ,*tFkBG8X[)W M9+/9'sU25hY*D3J=jAGe_tG|rԮA>=z5#>c4m&(qQNø|3t)[ bFՍLG嚢9oC*M/1aPMBr%7ͯVur5+,c7_z7rq7p|ԉil|..zi1Yrv`;8ڔKduR8 ,IK%XOX% jXoPV,f&iDsg%(]vVN0Um; )t$'` L(:ٱ4=;w^WO4pF@Ay3\ߥڮ|6.]v{x'y$,y)^;efOOiژZdd"rоA2Y¬7*k@Բf 7q}AL^`)Am>$GyWuk*֕MyIo?|o3 ֽ8JO5QXj׀p~2uh|_wByW=:lJ3RI}s'D)'o<.E6;iZ¶)߰1tʒԕN| `B o eѳ1S:>ᴾx5N<$I:8,@E C?tх^CGra0k2-$f jEIh3".mWnYyl7; $.}5hKCOad2Bp^iu|;|tŌ&^!{%j;c;ʨPk; ,䣗'kǚH2ͻsvqbGiUuZ׿^}*. *вi51o^ΘM,XUɎ_Μp]u8޸:7Ĭ|2]Drdjr)޴*.fZN.,Xۻ0ʂٙR4B I/!4 ! DE H54E_X^Ey-J t$:BHH/'[dž D23{gJ3ϙ3aF]ztR~rPM?{~+2bQC}k¦}vɼ2jR]ꪺec?rfWP.6Q39~pƛ{&Y>kzf.{KyQY(]l陲]تfiS=/,yǮiߥc,̬Y jflqԯfөc4Yx߻+K|̯𢮾Et2%s5VJqoܓ-|}iۤw^2u쐶- +ohM fCsT325^\0'.\ùY,^9e7qR fd5ҹ>qe6qه>Xm̬]L{:,s'Rg{њn t^lIιbsX,\.``_ܖ8?5IºR[̚!cnO}}13_]kjksꓗ%I{~ٮ}osk#~G?SF.oyhV4l&oH|_XGk;{V7f6 0">K|6֡U&  a}b <6 `W<q\>XAG5!='9Y'1\R&]'mӥ>s4sJ,/GRѽZ0>/֖Qy>v¦oqo-wW3,=tHݦm@o/5NŅVl.-+KsOGdF'&fNm|bmӦ<#wz^~1KzLS{N.#?|0:=/}oznˣfyU3(_?lYUH<7~wE.}LYXN[do4~94?47Iw}NϘJg/7?-0yd37Ҷ9!9w3ri7zԟ)1L_{N] NˊBEwoCyi& :L,-vU1H ˫ڦsVosGO-ɵ-/-,]g˪;Z6a„L};՞k.j l@^4's(!C/GV$Iee576? gqtv+K_eI*ʤznlsN߮Hw=>֡rcu14ͤ = ݻ_٧'侟]fgCݚRzr~>_;*?<٤9ᵧr?ɕ'LR!ņs%neD~Y$奙:qnZl-:ib+ =1g>32gᅬHR;|'1͐eΨo]gjIUeJl47'^Ugc{f~ > 6] 6,G@ 0j[edv[ݺN+r߮ʈdjvL$UIt꛳_J![x!fL1>{1c_}6J.“?/#oOf 3VS5^)wHn͈LM9/_z@6٭ovn[/9A{dCffiZ^L/4H̯=vZ孳7so6##L{qRV|r4uo]gy&'|r-ZN:)Ires3tPX_4lSuS.YZ"),M.VۤS,ɔ9sУq9vٹK$IItPy8!^kP)S禜Roѹ rCsK,NmjjjWg3;lݶ螖W2n,*tYymMVIӶTHEMm%X<3r鶚k>cZe^d 4M<9W-{^j@alգM fds\ql۩")'-:uH$5bk&{lb߰:vrj FO-Kyqr&WNKm!iڡCZ yr'S4TK)*ݺO!uڴ˚ۿ{ANƕyə0!5-{稃]'+uRH]Əv8)K IWm{y^h;oM?Udc{{QnЪ"= fMRQ'-_Y 3zₔ,q*JΠA2hР\) _vH27#4iwNeB>5 u|Sn#wMIC7gRdΟ./힍;#Y{qEf=;$0!5%-IGldx`z d-V3*g>= q;M3zYC얞iM~Pq3#2l,yTߵٿ#>XMV{0,`cc>6_ݡc:{$9h0)Y{㛼o{^m)pF.|rʅwY[,N̅O_x|tI\t\vic9gKO{k?>1m$Gޚa㗧נòsT}$zt;޻$u\xRm$Sn_9:˷3.<+;맸Lx}AVt4[\]pF{`4y/E緌ML$}N/qX5&W<0=&lqߢ0`rm}9&NL7҆eɒ9*A\N]]]-Z^'Iϯe3{y s_O'ї\Sll:q$~xt'>֭[T*GQIDATPɑ䖽e)J){fw 4U~0bm]f'חH9눏`؀3$79d(lumހƤ݃7GfM@Æ/c,`Z) P(42h$9_dqցsG/je=b1?|2bSmg c?T0ⷢ"傱7&K&u>lRҢ}g2TVVU ooZYUY[娭Hn& ) >cE4o2-[JUeݠ@kSXLMS,ӼeU+ 7#2U)0v.)iQ=:>9iRM;}omˮqWnjzhmv,g>ݓ;;? s͇礹䪯\Cf\鼺k 2{|a-m~t^O"f@k\9iU13u~>Vˋ#K7… 3~ls5 Z2R!uɖ;ol:䶜|n kR  T.~(߼\R_JL߿o9_{ nrth{[>1fT ]^u1?ȗF<ǒSߡ"<3THZ9/ɲfC7徺rR蔯|k4|AZlhQ*ʾyйW5'w14ߞ3%YXïy) s֠_օwL&OjZ^\Za^k{Mݜz5y8iZ]N"E/XQ;}'S MFcmMq1OM*2SNq$î;.t˄9m~M ԢٓM?M6i)M4L(9#O83[]Gɂ}ݥyi=s&;^*f֬djeץ[^ɧ|{NnQL{ɀz玾:V ;sy{ju6ҧ䶻2wWmmbLhh}3#w|Y,&5 evҲs˞3Z7K˲f.ʡI?]֪q"C?yCsfg o.dznvEkϝOݓ|.gm\f;dGNx1[seW.IJߟ{k[>+$5m_uޱGdԓZ5]ʅ-6N٨}R]u/3s}dRXTF-;+Ӫ4[$$fH:IrR.tKMY\_::pDrS]Bn{_ ty2<\T{,pG`ݲjɪS-+t剪_|pmcsi2n҈xyqȯ3mM/TOKo~_NlAdhV?&yuPAudޞۥxNo sCYSaࣣ yg;兕3usҽ[dyg#'NH:p&;ci//<"t;{-tjezo>0_9v+yl;lԘg]/ϼS˼#J^?/=rOHSǒ~^09S I]r)W^ŒBy U%Y'tcoilQ(0n>8dܐdAT&6O,s[Tݐ$ټSdړPH*jVk\5rSzqv7yqrwz\| rg~/LKf]3hk2wr~44.?:+-ˋKgqwd\~in{7?2?;|n's[ ÏOUԶSu`ڥy%ymE28+Og+;.e̍fǶ_]/tpڥ`(?͐͜Rժ`um> 8%Cv+Besh|+بCwt-|#iAIfu5p[2y'3VW{,gS/=2l&O= w\C>}f~3sr9ݦɊk> : > ;2I3iO3Ư:39= P/gĉI|WА,Y4G><T5|AZ>6#wu5eeiٲEJR**>{fw 4@ϼ/e.vf @ 0`0` @+ [` 0uB!B!=[$/ipK^_Ґ- *R:%f `ՓorJ:u:\,s@0֙ X!_Im:..Ji߬!l[fV4ե$냞-};sζi߬"Ri 77X,*+rd$Y/-o6ߛo}-K)JfUTTT\.`Z.|ZT7 C 0` @ @ 0`  @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0` @ @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0` @ @ 0`  @ 0`` @ 0`0` @  0` @  0` @@ 0` @ @ 0`  @ 0`` @ 0`0` @ 00` @ IE]]Q`$Y|`VJ7/X^1*w Igy ;ڵȿ?QH֭Z]F.~[jd >`}q}Y|jIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/security/image02.png000066400000000000000000002601441461403617600240240ustar00rootroot00000000000000PNG  IHDR!sBIT|dtEXtSoftwareShutterc IDATxy|T[2 e - nQUQ+hݷkj^QV\UQ₀֝M 5 L6rfGHx?93ss2|{L42qT<GDDDDDDb+M7;;D2EyY9xL-%""""""Z4ňH$ {=͠GqzJKKI$j), &=0{="6oެl&L2?̑H-?lT-#""""""d2= q {dRCEDDDDDDEDDDDDDξftaXZ4ZdIRA"aDjiii\n>d2aNLB!FDDDDN Vǹn""""" OVU' XV<BDDDDۭ͆_褕( NK& \vZ-j5nbQ(KuJDDDDlNϯHd6""""Ң?McwҸ[yGm^֮{ASTEDDDDDdtmqرc㤧5 8g-֩m̩T8 R]]E48N23pu޶wԣS0h@ *SoSgР֭[ˣStl20 MF*l|AO3k/~N4eu-i_""""a@ǟ{uwj x"~_C 6m[dmʈF# vM3edF7bg7S׿7ϝbym6H .D"d]wM1gp8TTT|J{n:7~PojWmr_ .~Gb5}A~̴(++?SO9{ֹum} V#n @=>o.0 :JMffee[}l.dtk֮]C5/+߶[m1l62228Ѽ{Mٓ7mb)f Cu:G <TTӫW/rrr{ˬX?MfذsH""""i<7TWd" RQI&^y}F";Tyy={vۼ@ V1gpݵWC0d7y|)UW^A>̜?B ‹3u/%̜or饗Z >S|us:O3}o 0_|n-/_j;9t2zM t+&5dWDžOnn.qbW\q9z2={j3s_ŋpE4{nƎìY'W' 4&[ ԐJ%fferFnHA8d2J%T+LM' xp~?߲_~^߽̚o`B&++m[E7l^~Uٓ_|#?X8&Lp8:ܞ[8X|N5gs8zIYYz!Ma?'˯vN^+nf^1O? án۲Υ^MǦaF~uyߣs㩨` SUYŔ)bرc;v ofhrMpgC HT L^^ 9i<-=eK7ylX;֯UVca#xWbǟWk}ʪ7v;|\^p}0w\7Ol6v@ K^]]/+ڜ:?sGu$o:r>t0nP(1G+bl'µ\ūmZppUWcڜXk{?8/6駟}OCx7&7o41H;𶷎vm5;Uko6|vQVVnd2l&HPV>"w5>`s4|"ԾZus-Z”)y+-ñ__%;;ʪ?_ʕ_rwq+g;3ƌb{qq9k왼s<|^%Dzoc99s^g̘9a,]Slx]S>}HOO磥Z-w0N[nv;yy /{>66ѣS4孟nAr:M~jY?mʈM&r:]F(omX~~>S~~106 ȓƅ/iO1sKŦM/7~nyX `"< +XC.Z̕W\baĈ_rϽFHOO%<wC{-Ģ=+Vlddxw>@ fۗ_C}Oc N^uD}jt׷Zղ}.{30m.ioWnOm/pُ lƛp(vƏ?@yy9M| >_/_O9 \<*֮?ixx\ub1>sV+}a̗ڼ3fĹY& R8jÇ?//Q'~>j """""R}&᯻d"4 i^n܎*)=ǕW\Θ1J /o>q֯;&0'g\?x9 0~TWWsvk6 ΍7^GVV@uIMϙ:Gu$oNC}|mn'Sl2qIOOo0 d!mYg3R]Sg ]]뮻뮻o- 濱_6Uc{k,tgDuܞ n%6PQQ0z{P6COjǹn-:gukN@+ggZr@՛kMp8.١FdHKOcDXZG? """"]\[v[)((1onl2 U[[hٻvh`@~٬V;,""""lb"ݘ&`}y9@NbpL&.K-&ҍwXDDDDA o6!DDDDD%6 ˭nl6 f,{RKG222quRKDDDD,;je6ZX,N&L&<4HD"a$I588'ZE@HKph?5YZAXDDDDDDEDDDDDDljŢ d"I2$dG""""1&ٌbfb;m-f3ŊlқIdD a$HRR$  H&j 2TD"I"XP(bt:wS@KxH%S<8`x_BDDDDT*EMM5ތ vG^#H`[y9ht."."^Nӛ>}z3zh|>3gbY ]AnϞTWaںha$}jg}> K&]&ru4~wzkx⩩hm]n}͵Ѱgrn աR)|uҘL&0D w9 .(h0w.D̦Ixgiii\~X+.~-7]9D:4{x0y d<Km8kTvco.uV>Hwtg1nNF8lhEMee%\rQ=?4yssmI̛;캃 䒋kk/s}6:q?.FeEnwםx{&^6axzm^;,O,x^P0he]|3fmRח^޳?2|mm#JH&͝S8qBnnm\ { ,Y!5u_ b5_CZ- ƭ̺u5![JKn:p'%pLz)KdO4'QF7yGa׹ۃ`CpS7'9L#[Iښ,L՜E^?gRJK6RGi|:g6~]9wpJJJ())w;ykL&Szg5 ϛkR8z~v&߽cޝ=.;;ͮ3;8ûl{EIOOg„[]wҤ3.h!\e/aAi[e᏿omS yyl\42ce,l|CY ?#\LGKg/`#|6/t~y}ǿ5씯g؞Ou`(F/6V}{! 9刃vA4Oʪ3nL+~ E5'rL^x1*[qX䍼[FX5Yco+.}kk:מM^>%-|D;n9 H,5 . 1b<,W\q9_0JJ sXbu`Als _G߾}lٲ?xvRk˯{kx췿F'ijsMWvD"BFtb5;}csa ,Zxa;buhbF:?2_>_s>sciO灓y?fdt^$`ȯ~Mz55ޡLo:O#s>}z~{^d3`̖ڱ*V뇣(ze(_Me#c{7==PןrVzYx.%QrLX&K^;3ϱ%j;,'Je ;ӇRM-bQ!C^_tpQ>w˷i箽>lklIqdHV76fmR @r% ʣz|$ǟ2|_fd5?9C(]_Wa kj 6nrƷ>Ǐ5E,[6e /?YɅ唼` \g?Xf;,22Ӈ5CYmpǘ#'n&eʕuo]Rc=ζVL~ b!=1:hP˓Lyg=cfKi)gN'.NuRʗ]6~?i'~Fff&EE,{≧b*N:DIچ9q¯?0g裥].z8p@CmK͙1c/ΘY}5\.g=KCS&3Og믶\w]OM7ׇ>X%ۯÞݕ8…;_[?y v:F:c cz˸3o}`KGXLe빝|8/t%?]Rb./x{hF8VX%#g YZԨS5kX7< >#L,֫E=7MzhCDu8+jO~P,v6Ty|Hn6./kqٰJGs˘CYfZ]n 7RZ ye= IDATIV`aP4mo# ȷndC ,QÀv@6H)+u}1׮q=swUjnm:Զъl( BICs|x=j[{Ӽ -kl?F)YD(ܶG2YֆΩ޽kϗh-_Y;r+z6m⣥/EW_nsn_ࡇi<-7c,Z޽s,Y!Vo-3găB4kW-`u5X c/P{'غu! 祏ۍF鏷 ]~i!?PJxw2t2#/Rc6E ,X}ٸ[)fAF?`Ú=t]vnf5(.maz"\ŪFWBi`$r Zf&uڼU8K__|Mhxϲ3-Jj._ΠAvm˷QSSA=ko9`@icJZZN>Z?8NzzY hwRS$c힜KMj..^!ul6jX.~ ߿v[wwԛlI&mZwݺu 4ͯ=h@֭[{],w G=8^m'P7 UuֹWre7[&rWayl}Yg+ 䄑 XAr񸀺NdǍ(@gysWi Pk4AGTxayp?0V͛[!W Wr ي~\rPctd%ɪBN;h8cO@%/$s۾_Iv\ -Komζ5&Iupl,>z@Թˁ8iִgrsq#5륆^ň#X_ nٲt^3f2sLFSO<ſB͝y8h>MQhabX[=V7-Ѭݎat矟u,Ё@;nT硇'7oWNڡn^u<8:νE^p1F@6\;/QNhvm5k(Ig/7#YnyN/ԟe_ɊSh~;i(@s.9WxѨ箆{sɲhtʭD-n2@U)q/y}Fn<l vr o`?<VNe2p_4|ҢTUAe9d}Zx~2JYgg,y~C^zk*,yExO4b.3^xkr|I/iQ*++ R\q/a'ESVZI>$VYm;;4V,O/6 Gڶ|lX:‡$wLySO-6m*!7;S 1M>[WL$aÆG22]S[UtN>=2VMtOW{իV8i0NZ-m܍Y^Vf<fԶO90,F3W2>c }9y6yKyx pR,_2i\xSOtv]V4,šۈf!|}D_({=7/&+G/VEYWmdk0?h*?وϚx|) ɍ|GĈ J 79<sSMa"V|;)(.A?#q!eG 0Xƞ0ѶXe`I[WLYcP-ȣJ2 zR^C n[6SYr#j9nXWP\w@_4> ;cc%QlbagZ_Q2B0bߡ_AimC Plf_fڦ]hRv Xgc"l:O8D=4k}Z"rgӦW7G-eӦ۱m i"j .jݭWhAX`A;\\…vK{b1N}&FO> F O>~+>UVs≅:k!CM"W2*++o8IK_~ɘ3NO>#`$|GԶvn=~{O0;tv/x9 á?0N=N;ڐClڹYX'6N<2Qg?Wx2p@.m}ό{½SsE5(߼UlgVkoq5p{/=MԀz_ʿgV cywBF J"z۟`PM޳'cXG7y:Vf]l5G1SbCS[Uފ21 $ܴ7.Ԩ]^5c=}Lc?4CT|{jRvkW6%/` yRp9~W-.㭥F=Bpsk':唓nv<ﭭx1}wj&]߿k/ۿmz)gEݦ>55\uos3|ɧL{Y^{57x=7~ϵF)b6z3Xf atGF^f̘Ň~ԦZXXa''2q)#bݺڹHss{vً5&f{n١wgmF0;Z][!nh2QYYѮcmBZZ .jx@a(,lEgt7fpfΜTmvB.yߞN>ko[^^)8ٞT!~=?Ǎ`@֯_ϪUy׺7|q ?4 #\I,p 1}LkkoDIOOg;|[#Yc߷1֛9qXW~"eɨ@t t+UN^nS*I<"xl&Z)L6<4ҝ6̦X/@hSU5>zdgXout,l^f;f2'c;n˄ٟ, mC6Isd8L@D2L$V?#,^;fR$!B&pA(""""ݖzۈ\k#=Ӌn!MNcjfm+/n [7HaJĉƒ.23=vX,N<|#5V[9\\&b جYdIP) ;N龚\zfubJ k$ fgҭ&0:p[l [EZOx"J@nk}OI14Lwk7 \n|?Lf+6ǃ7݃Ҿ׷fϖw]eA**f98.T@kI}Td:w}6d@*FMe56n{Xjul;䝆Iwx$h]oɆ˙OE3Hh[Cɚx5qkN)LHPqGoIRXĜ PHHsJʼnldju{$QNHFTQmid{ )B 5vlRI #aTn%/ۅ6ڌ&30$8VěW_ME*-ذ H'fj5p,ǽs%BM뷤a7IXة8h.k/4mf4L$DM8\a).D{p<$AThJB ?-nlfds +"""" bBum%ko_pLZ!r.+1ړrpp|l6aRvMxj/mZb;f6M=ĩd]0MQt -_9bDdmHwө$86f$R`Ji1CvXs"eMauc2{M'ӑ"Kī'miAYDDDD;5D8ٹ ՄFh6l㇊Xdh/1ul0A2$'5ib%KV6$MNdik|,N<$C#>!DDDDd?OzrpW-DOi&6: 0=9'8|#%䯡*ۡ/4I^dtr,f%m9L'z~M`̵("\N%k{~-&s0^eH&'Q#ԨI\-N즚H+.[{iWzupYLDNJBޙ،ї ͋?^Y;d<&L3NdٲHUi6S""""[ŊݶND;A 5y2!Fz[#$r1u7?pNM?T_ AF'juI`ba!aaIX0pL4[q7[m,&Fx_Ŋ 6 [y-6TO4˔$XNGp0ᴘ81#ɁbaKl1mwCb+a_m%LԞ,ٖGsp%F*EnKݟ5(w)#&@0!30IR1Y,423v={q D D뙱l8ҽ9vG.M-\*x]y} #W?zZDӷq2Vl P!毡ڔNӆڈBLVg L;i,&NķRfic 'nD+$S $}2@$ōj&* ݑi5IxX Q6rd㴸]_a6U@}X`Po0d-Ч/I(囷RKy197D]CvIepRђ8Nv~*DV򊪖'JDUF5WAewml{tTd23 4N2,E,*㯴OgZ IDATz*^Zh=* zucʉXrz8%:3̞ +ֲ%sٗm='/oNV&=+2uW!J[g!б cm X+~&+21EDDDD& 陙dٱM:h 'Zȸ<7$'N VÍia!A,jDg3G[<$5ٌ' O˴CnfZWk9DDMZ;-{ӱwO?==w 8lzhk_^׃>x?|^,"""" >2aŕsrN L&##z{ڍh u۪I{w^3'gӷknn&MG8mmrldfatz{[:r㶵 tz3"tsS0Fm~m=Zdz=\1c\!8#m,nGΖ""""|AKZ{F/'>Zdz {%(Hwz-'OAΘ,̶(vݎn3AcQHtD]gmv;]ZɿrS^h-'tG@Yid/ŕesW>1P^i= :1*|pvfE44#I،>j0 N0mg~Unu2&hh< $uZ8litV x%"""" 7Np(08BƝvJ[G@ r:]]ip8t>?O ޷tXwD298[odeq.6vav9%JDDDDG1Jc;#DQgt o}+ h Hkn8Iwz $´cdfls3v,y2Q>aǣyQpW;Mmwsk8sq% IJ2lbqvgub-\x2Go3.ޱ/?_nhkZ2ȏE#I(IȌ?DMx\c9 l@h=DDDDDDω@g0j%= 9ۂ{3IfRe 3hhavxϮ+0:n"""""|3 GNK9k~gZlr=dOP'c>3 C= 81z.1O 1IJEZ^9ơcADDDDD/bӃnpi<}x"f0ag{hYDFڴ?-G6ӵ4\sj7n7˯ hf""""""TJd9p`~XQCtqZ;{̱y䄏?81ɚp9`g csmHO:I{j!Y@ÎtӍBsmi0ƩBDDDDD.]Kzl.XAeadfE|&9GYnL62d }n#˭N x̌q&2ȵA3_Q{0NIN d{x4lH$$,yǯ HuQ[Zⴆh ǩ=^Ԍaూi<5pVr#('%9ݦp="s4Nk`8+ѝp>;p(Ou5W4Nk*8!+"""""r~|-q wwa?Bm 9sd2ZG&[Osvv&Fn6ݙmV.H=i#3161 `[0,V&dZtQNBAztHGߔf1cm&'I˸ N PDDDDD䜳,X %_ya.i1HsR2C;joomi3}<|1ۺ=+He(V"""""",QM%d;T""""""*ųv真Y.3O[2վ$"""""rAS ((((((((((((((((((((((((((DB%&""""""fT`QT((((((_v\j ADDDdX,((Ԋ, " """")Bȗ0, ( (B( (\BDaQ_l/ ¢, """"|n4Ck"P`_^wV!X gf*0/Ç{a+EX.{]wo} łR| B!o6l, rхyxbƌKOO`\DUT'*^l .qt2mEVm:9`ѢEdddDDDĎL}VOESet%bhrXKtDDDD1|-=oQw Cg"FC$HK4̱HE `9oT"""":% bc/'(NH$H#V&2+9"""""c&"""":(NJ"""""(Т\puIY}F xHNwCayAd'gw6QLo>Z7Ξ, 1/c=&;Ypl1ڢA F8 i1p3-~$m DbA'l8 7ix,dXf+Ql67Sti=cᷧN 2Tbf.XǴ /6M| Uą6SN-~"":- UUUZقf$iŠ3&LH`d(qDqt&9X  ڣZ`rZ&.\$=qtr,q:`d#9X, t&;s2.t-Vhnbf-%執Eyף}aSKlq3VN@6ҍƲ`s൝م}o|'Mo*T%u?f[IҝJ""rn]ŋ,^d{SuDj5~ '$cn<hǒuM!>D-SdxG1ݺj&bX8tдg7{CQܫ/vSw>0zx=v3q\4˝ܶsmM|h7ڿ8m]DDܚ1c uuu\{\{%kW 3f UOK9ߍq Ҟm$[{'4esE~/tBr^B -T+gSvS-w?]R y0n_-gطK͇|'&uo8A ޜ,{7R~T~!Z0vRN'LpSPt J11`@jx +vP x&n垲 'd[E|`w;|i3ȝPo.lU/Y᷶ߨeTVrw< O0>u{}MoUSs,3o sq⩽WzŻlw M̼%V/_ޫ?Oii-DzЎxVi%t$eL񫆥3NC,r[vC=5V7HD'a,\`{AѬ )f{wiS3MAh@)EݓgfuE8'ŚdSX={~jZXPtO6s7qgVV_=ͷ MԶ9YyY}Z1 HFs=z_ MϬW\'uЩn}e|%vtTmٳ;?KT5i8PCÁ,gJ' 0lW'bhIӞ>'h8V$b4DKDg6c{AsWnx71Iv nu1j늓!1VOwO$vSg5̟a@T˛s7Pe66ۼLFma{k־L|lBTT~7+^?{dnMWPq`yK;%7R5Tl^MٕR⻩ 8g6P®4wl۲O"X{Epe>9?d e3Gkx79nZ§{3V˶=nx_a7d9mx7߯K)>u_y6¯d9on{{SW vla{#PTJ0M[^r_g5Xk5*&bTk_ǷU{{m[_hme!ED.Uk׮ vQh|H$R]md 8X'-)ݎL90G 'V\a8]:'H$_,B FSC6Cp0TXP<>gd1y%sڍnהREY| %?3 OJCTF?kNkT1nȜՂ6"rߨ Cǁ#\f %CKaa2ytc' &4NkU,&nlAi6Tc<] ,Y5?v7/*0Y2&q[AzLY'&#3-I̿g{a{4ډ̴PP>~R#,HޏQj%g<|%3ƲΠ.&ruHW>Ӌik$4vu1虰n]T)9X2t$FŮˋ {us.6/GGKu/NV~][}j?d0O!%=XOx4@r,(*}uEa{ 8g`愞ȧxƤr5f*.?ySzf ?N "I63-YWXzevǀPk^]D;i2^Wg|)Ҡo""}?YrX}1cƨ H$z[iFQK]'L|`~Bž~XLW2()!wNZ?laMS!p5\{j, o>k>lRS7ۂ朕H}Ά㴥 a{Fj$g0iyƛ9E TꍃA ݬZK1G8j]1p}a?Ye*o_tS|ۏyW 8 733deesƪU:;hi"~ksesesK>wHm>h2sN2*9afN5|a -M8}lB@;K/{fSj6!̡߳&~) xRfN0 VͪEϰ=4M!ѺvBhx*%yٌx7"紥. 0NQ7Yc?:pr׊[nQM{ћ5XV~"XW7/2j>WSCMM-4A|ϰp#f""kײj*VZիwƌTUUu'a2bݥPvyv nYt |ĺG+zNRE\_ͶwZ0k|Tia M9_kkfSrS*M9Ȉ_{(9?`΂d8\ Rɧt׺e;n".-xY;cx8< Ʃ7!Fףr>ta??S)PZ58PԀM9Sf wZ< 3˖>rwVZW7/]Kp yk8M| fP0%@  0kN""3f غ;{_tVݨe LF-1ķ3Smsl,7rC>~nN}נhNj6}+ukl0at-#YFMW076{`v'l o+BS?ȿթe9;Օ6kdRɦ&<ζ'军3slklGPn^u{ߪ6kqv) S*Xi>gsߜ֘]Y#5˸l!?AWԥ.4U:{}jRk_̵#@ke(""pS.jzu ㊹vJf)Waߔ;g\ܼwy1HCc2_7ff34` x^5-9Tˆ%6hڵ8<5oñ<|{,8}F6m.3>8e qA&ۿAF"iy̿QGwC((܊/F)O @] nx۠ln1o?=|?~-TZo`ĺʽNV-; N^IJ_+K\kK&C;Ȧ9& ?XFkTLx/>)eCELl@ sksQEg}4TPܜlSOOXSѩCWEήJ[r=vUwlW1V.F!;G7fC7%[†{df̿2$fnmKn[ƒBwp f}-yn 7?  9%< eSP4'G?iy'o񽵅cnec%9T~^W}9aR׽YE=s]N>~5f}V lґyn,̻*BYDJJ&`;Y7-'nKOWkpA7ҫ;b rQ`w |!7MMQiW΃`{?Q|6M{N`io(:țO?Oym _cɕo\{+TM^])o`4.gar.+[e?|5'hhⲇy`Ƨ~]V5Y4pz,Iۿd5b@^1e+K+`xhhlŜr VHAJ[]oeC1Oěe˹${?Zc@ٿ?׽s?ʚ__BY.i\?(X c- M{-gӷO>OŁ㊘;;m޿5ʎ=º}&Gamx67B1V<7W~œcWm`ȵ~7%~%PYm,llLJϾUm-K@I;ϳ0-eC7R`z_38'\CCe@|뵿>4+g}? t^4/yXwoʞ s82rxϞaUu=M5{#-8 o1r}~%O^<1U~]黂^k 0yx]D->7X{x{}m_uM{Y8j{r=sQuIb`zC%?rNzc'/SjzdTN]Tu ruL_3ˮ/U@5ycM]eT |jTEzx >z%v6mo$ LC=:2KsA}AɜAk8 %),{f] zu>L߲~Wb)mضe]}5w}}dW}n@|޿"59rpTl~lCpulݿ0*|S.ۦ;n*z_ʜʟcyۊ8 qC^ ՟8۫fB錾]'Qe> .k;]2 j|/ǒii~6 d22*J)enˮ_@'Y&/gb@6%Sf3wPs1S.nvYI=g0fII6=Kji=/GqW՜VN,bNq2y'Lv!HndDQD/iLuMrm()ΦTQAu򿲔W^]\ߟC 3??9'fjRU%wʄ,Oۮ9%*䆒 n`-%xbalg]\#WgǑv?jm0mtu ^Wt0Rg)sc.&uYv-'bAb o)Ŀe۶a^͞^0+ߨeu[>Ke_b% :U11st-5\2<= 缞Vܼ,8#]֗禮 45̍ڄ êLbǩz L8vK?eCf7{c  ܌zltzm x0 PlugΒ3ne㊜3]a( ˫f3~J3vv)>6>+:ǂ@ MFvK>Hxz?4yqlz> "?SǻGY؆w5pv\<Ƚ൷YsK񭲻cDDXXKաt^=)JYOTHVm-!Yy.7Ӎ6r3]C="#3ê3ew>+Ey e:(*]ú}{𺂴j4 YrtR-Y^c~Pj$S]ld?cA>SW^哋)=+>6>{,Mvs8o ]eyFrT SQHd+W~pf694KV=Rre01(.)nNRw66NkzOQBngFD xG<kYth6lW}a1bZgZGܾj ]e=4q]0830a@Zq%7u]us뺯Uw_zxWQUr'f}]f1UHHݡἝ !i22$Izjoh._z</{)fCw%r\*j 2k:x<^LIɘ߉(szQaH&'i}ێ'Nu?T}鼨WTxqܮq ӷGo7rz6ڟ6} sL4Zm6U7ǹqSpm84X===v:yk"O-"Xړ|}23VhCLy#SJXY00$k c |q IDATDY[MXkI3Uy zشKITF爍K&rEI5(IA^-ϱ17g:7 6m z/)f X(|;oI,-`&wX9~PƓDK쯾ƌ/J`)>dž%ϒ_gf1WOhb;VK@wz gs &}by3\{Cׅ +%U-/oc:$qL&Oί`!Ʈ2*D} \Y2Tl 8|֋2*!z6-Ĺ]r]jƴ1!Hbhxߓ^a&k &yL Zfb gfIᾼEL_]_hCFg4 D?,d1}un}hG0i8<1T8ױᄡ!̞dG3$c*yό畷R4b_+k򞊒ɂ%{J!_չWxsF_y{,]rOoi!9L{!0^^WCkY5zj띸y ]έ`H0&ʀf0Y5 PL[}fԨQ7r:*jYO$g)2Zqkr[6m`S_%}Ϥ`B!DH2ZqK2fX|z!|Q F!BH,čR ?<]L~ɷM}Qڧ? !B'h!B! qi`G{s(M})+}\$[)s7qM&_y)QVE]s 5Kqmvșm\B!B\'-DW lZ 7`*i& <$.x%]*5gwHL{Yqr؄B!XS'?g%o<&'4s ވe| r2Sly5mGjqmӓ޺ Ӕ*Ced *$f`qQ:5Koi89P}OT?NX9.Rn-%ɒsMR]Aj¼-+ֲX3 &bI830r}VQb3XCg DRwT.;/`Dt yu3AJV.yVb]Yesԃ5%E ֕Wb,,}R_ޒw(N{in;ڎSoc9L[ĂqZ9zmǼ`JfZ"fF.#6r4er3d= F\~!/B!B()o|D'Yc>\V;7`޵J-hqYOOZlN_YaӋ>b'򔲲d_?o~eWy" @bI]_[Rƍz2y" l3cb45iV dq8=BU{9)sc-u~ɐISNA]5o2q&htKz8c}-A&/=8O{LI^A "l"&z)?SPY%{(P3B!~2Z:=k58e66;ΡO-$ 44iF# Z" Cb/wp~ K%5^ 4y1^!6´%8Y((tU [͠@?)Yljoad}U<+yDf6xQLƎ4t 4r?WHNiUO{I-G=ul[ CsPsKWZSgֲG1wt=nĠ`=ҤddP{̊_SOb2Z!S3t&1]FhvsWm-pCv#g&9m0FQ)Lߓn_kL)lRGw$uBmn_1X*,(SY3SR2fw+ʜ^ԦfC3%Aͅ%+IPHvjZwgdjfl9k~*([]]`=z^XK=5=]%:yzZ= r'f}ԏ<`l)Le3X94) fapzK .BzOj?q  ]ByT_A4%w]^gɯ~wk4 @AT߷0Y5 PL[y qzGע1EL0)\@B19L{1@3Ň?UnhƎH !B^No_ҮbcnC[i<]ˁQl&_!Э\:s3?@p[[[w]wfРAnQיmd l䬂jABƥKl}̨Qlr:*jYOi?K!н]M\\xe`x\JO9cB!73gUH3UU?ə3gn2@Z G1 :&(zӆ n.75CX80GEc osqӧ/u@ ң/R2}ʹ[A'\hyK d9.ϝwce AZ9F CRbvk^$eBVYB!nŋ$==oU8z(0x` oN5f[P/_{|Qo|vZ܂%|=:Џnq?q7wgfx.fhi9n;I9>eF)!?EדѣG9zh7==zn o6( H\] /6P:Tt#Erg|1pTj/nip;b);0܌YSrg$:ˆ Vδ mԞ ZuwI4Xç 6) >LH \fB!B` ~IjFOE( w ]x$  ~0 0b`xg, D*"xhxM?!#1|I<-B!m+ѣGijjiܰfLI9Dwgs# pÀ!=}˭}KQ$'%h?qƠg}uDwmViB!BKBsМTJUS^i|W?ܬv˗f.bݴ47C__:|7X!^bB!BApph@[2nk%ղaaWw^º >^Mp"頭EY}B!70$%`X^n[[[ h CګPt]^\Z=\~#)j:'F꠾`UzB!?H HJzDPެ6_(>1B z 1}ë0Ax+͡u[hܦ7I,%Snh1j`G;L(ϧ%L_Q])+׷cYLY!G\8Upșm|,őh;0)\g)3_{CzgkJˏxR_EᨢlOvAOﵶo!=W~ſۻ~|RpޚpȠwEOejt/]<)U39w^Ծ$'x1p}I6-T׈q ^AxK\jI 'B1_ @+/hTυ&G胞nr%.bHyR9q/1Mbn7YFM!1k?]ʬ۬t }B8G39;+B+XY(Pu7D5Ax췍veb; o:k֔r" LʛTŶ?FLe3Izub)xV)϶# V濶I;b?Xi5n}fckc8^%ϡ1,Q.@k)S9?dbï ؗYa:(vcXA.ϖǬL;qmL0~E'b8 Leg337΁~?<UŧOfr"ozmǼ`JfZ"f~ϫRr)ȳ{FΚ,^W7p>ghzb4d23 gĬg)Nb =%rƯ$KދyLH-Kb$< YispFU`V\+˳^}~+;X1^33\ϼeKW,uYʄ)znEO|}/z[lXeD3>"Ș1s20>Sv2gUQs"߲q/^+] ఱc5z~ٵNVmZlfbeֈS;?/Xr: {N )Hsx/gf' xaҔ(ſ*ZCunf֗l |͡AAh'UqnmܩM/Vϝ鳜sa‘_=L3]MC<.sxҝq*g?#W".TV#ld./ОLQBRzT%AƋŔn,b~ {=nC¡`3Pmf~ֳTkl۾T6lZOBr倫s_IzJyl.)rZXzJ7g+oԅX_Xrw~[eHF9-u'c:0xႣļW)..bŖ.KY/QbNQv]*Jm_#>tA *Jeo|J~DطEY³lܴsw(Վi(~}L,U^~-p^bS nZϛNQ+ ;_e! ݧb-6'pEBfyJYY2l,1l ~FbgNr:mQբ G+VXOYgѹ֕Cʛ>b̻RRIz7pJɆ?0>ןڨֳg?p4vާeq>tgxF9y=^w>Oy\.?Y΢>秵swh|Xc{݋yDxsϻ5&Ɠly#{.;JA%qqu8\&o\Oh~rb;+?eJzJ 3Voxڐ5GaN9RRp>r{CʹbJ7{>pwme.#y>bs :Tq @_!`]"]X8;I+A )cK"5iw# '1q Kֿ$Ř Es Cw2 >`]x$Ekȝ# >H$:Uo"~H f%KuNe$)W#8Ԥ;cdF$`=CksF8T<%2m&/>@{e3"Gϋ`{Ib`JV혛X=ԓP3"^Ί]>S~NG3hJ4 A71s@֌Lmi$3#۫s8.m<N_ 9wpJ:"N N+czO IDAT1Si虾; T27woI7?zxwf6\_Ob\`=QF8*jgI\&tLOAy x’e%kMV&z#g*N}+M[0{b.RshQ$k]>kGN>.D=7Y=}Dʏ^s89@ Y㱜v8ߟ6`5G0:rY= E N~G8d]L{تݴ=^] @w3Q~1WL1 Q}WT.Sl<cXJ6)n?g?cPw4œ_S; ĻV_/r>Jǁ;kvwQG(+&XdcmE fܞfn.`gGыiT ͇ xR9Aם*F/>} YwYYEL gogox&ڸ'gG"QHŵ bDžbSuMh.ujsȡ1ŌgɦyEM'Y>ITx3 %=]~BQ\jtɍ^܆;k}Qɔ88\󸑌FT:P} ̆fM_Ȟz~$WXچeCM^.*uP⌘ Ө/^.,z'"Ɔ?bo&_%dM1/QF̣(}eUk 7bu^nv܍ A $<oq3łosQ&e99`hܴc{2u'3K~/u؜y͙WͲo ۯLCAet>@]Sf;z&կ v?UmR47 'Ҟ˳zp7yCֺ!3`2vy;n{_2!#"%Gl@CEq|5&:U;+& #<(&Zdt|xg !)B_1kpb!r=?J{.J(u#' S4xzlIirk:lX82\Lܝv=IT9v܉z_ s;T,1;"eើ>Fzj-ګ?܎.p)ZZT2Gyr|/Pk˿K9gzvqñPOBv:y͑Ưxb{m2"(+ >?kw~XJf}ȇeXcP@:zHՋg,XR4b 2Nfd#>'^ʩl9}vq"1Do:) m.,YZ 2>eU`F=[*8}z-W&#C+5^A 4ibWzxQ ;!ě~B(+鮯(;S^sk\T|*Jk5| ɉ U?1m#7jm/=ޤLOs+ԾGv)ΌJz!Hj)+H,n?(~忞%is^RͽtKYaĚ=\DNZGc^m8w?ӵ7hxW($vҳWٻbGLeyn!…\{lYr8[^ ʹgþeMʨ`цvb2kAϡ( \.9E5 c`R7 9}f?B )2|Qf I{BS|C]va.=iOEXX T39IA^-ϱ17%XᾼEL_]_xCFg4Me*K9͡Ia5C#6S4;W\oղTGwmMS؏I{b'=K,}1ay䷼/ﺬw͠A`[I)a4w p<˳g.9GJv.L6.OVt|?M#bv?W_n~,!hA7ȥK>f(mBUUt^~SWqg5g)2Z!zsц0scX2)󸰕"sƘ2u[6mzS_%}np9,-׆AFpY2f z?e c !7-]dz%3 &ۿNRf,dy\6 '+ 7iY+o3 Wy9NV96z?K2Y! !h!B2ZܬdB!BےB!B!$B!B!$B!B!$B!B!$B!B!$B!B!$B!B!QN{YM?֧ϴAB!MtVӅܖdp{7Dw]B!B\1`{ v%h!B! !B!?7KBdG@ !Bf~T6?XNdB!?ם׎:kIyc~3TVԢݬCm rUS:u6t?#B!D@WG кnfՋB,7Fx؍oxpK+^!\G"RInۮ{B!"Ťj: #5g;nxw+Z7:R*B!BD!ZR Ąi=c7&  w3¥b!B!O)7~$U= !B!OYb'yB!BM; u6._&PA6 0[*B!BM\iK{󷁧T9XB!B r[M3!B!M*9fB!B:--\|f-8` !B!mŋ;-SUf&LӜG`!B!4]pGd$L&.{<|tًlI[B!BLs` NNk[l%B!BیN׾ʿ[Z~h!B!t[[륃:# 2 t@k+\nnfF6 Бz3<evi_\!B!$ X҆Pu"u 6o@ o@mo36|G=kn_N\!BqM.56?ۛ m҄X_;"uVj.t%bFd|kdՑ.LJ[wݩH4 K !B!I_`| 1\mjŭ 666Ӧuхz,L@yY;a/[eߝoظd,LeOelGld/N[Y0zSr gzXؖ?J,;x(mlY< ΄9=< v-o]|`$qp~܇30K5F;7BG1Lظd2EL  ۂJ\*Y-^Oov&m1ǫ Xϋ1R侲Bvdk~ : RG0$-QkH/^ɹoP U@Rw6:ڐ[p;]kٷujrRJv8;O?]Ƃ{,(Ol[S@U}H-k0{Tԝ`-{zYeR`!7J+LE39/TW)v5H!:eÂ׈p0Gt:6ͭ~<-{3UX 5*_n,p POskl8^7.QF-ؿzuz.>ụrWx:CTWtNZ6?|˿|D[󘕦թb3۪[F?ya(~O,-:Q *Ix'E*>݊SBvduĿͭZoEW[b"I7^}gu0iǻ9a*iCaM32;;SlUC*,gZsAʜyXF_(؇_a #:lJق(>̝e"|ANTPfʎ43 fϒ;RKy/icXF2}b*rSIBl10dӈsTTHU/GwldA!&=KnV||jcKgp>\ Exm c_7 @]d.qSGQ qI9]ʵO[^޷qU@yh7eg}2پig}?'])se"lYUUOȠs[TIUlsbTO!n#|m {r.<SDXV.OFktb6eDFxª-W9iȪsA0L2{wMRa!=.%{K,₵l;Ҁ[UQO7(2o*o',=^}.]#~&-P~ʁjX \ӊؽz]?q2vD2uew|gXFh=j.׿/ړv>D*T<‚Ec[Y J8d$%m޿ Q\m/{%PW;D͎Y^z4!j G6rhmaFwc07N9H UkZcfʿm_=oj*C0v2WYҬ͈FbmKO.m15@:;!UI5ӡG &1~h"@4 G(:)&_u-R7S K1<{XF$á*Y urv!EɀxRg;Nu$! _P!n s vYŗd6M^SpsuYWH}ŽŬ%Cٽ1gcV"Ulϟr1&PIZώW9wӷ~uǪa$78dwp9q3V_cZG 'ly VcB hkl;]Ŗu?x _rWSɿ.?uje:\,۷WC?k3ٓ7TC<7+˫\5~0gl͎e̶YYXc*6e_).-1g ']//,ԍ&#**bEI,\LgH^XFᴗ:׷m_!mAz+セ[ij=ܡZpTc Z:iGwC:oM@oBr5)"p i9*8POVV1$;(8O^02m*g?G]7Ey~q?(C$zu L063elqBʌ<3zv~o>A!j}C'"Ѓac۾o8^bKq񫼹@Է-õ\hrr@8M.E \qHxv ei>Z難mtӀ;PFcϐE˅Fii1/GUn6/!c:M)LhjCZV6!^G^VE|;a81w$M  X$ǔN9gys!DKnJy`9%8sʎ͡ b4jGuuD/+B]HiT0$j{p5~8bY@Fq#7b>ytR|rj6O2ZN?wM[ʚ*yv<ɳ/{ʛaihmgzvm 8&8qU#5Y*3+)wpFާ0*n:$=GKU+}iƬ;_QZ~U5USO9Vݗ~ֹ< 9:k] 05L"y|Ls4I&graᾤ@Xd@W3$zEj꾐o7PNnbj>U7Z4Ytqs4m:imdv/3'AM?`?17>\õkY2?:VW^j1Z‡̙;\9o&=M(jT`<*[:)[&l IDATMԙevgkΤ Hhd=cu10d(ʾxnps+qMdž6u}<4Zm-#k>>kqעi㱡AEd;x;@k5V`v%Wv`kg\AȱrϺ۾{^ǜ.bMʹ&_wK>,mM;Y{[-EIZL&Nm z˂;V0Uw\ǛշԤ e7.2Kϰ/s(R >jjJtLM`UMQ'o:_>[7fɼicG}*YGl*[+:?6L9Ob9O4gf+摇2 iK79gt-NZ8A3b&!Ns8fS:͐]Xqbe fl#x"*VIdOs:f9d÷Hۼu!KɦC@շy5,s-/5W'`󡿿CMxye ME\ g|}|mafO7].31 58W?s<:f"2kY\ Xͼk;Y$}Ϥ|W.G//]-U ""E 6.pǛ> ,.Z*^XKnovU+WP+"2\uv;{.LgNi-"@ͫYzf>=Px򕏳wa&Xκ*`1[_>GVQ[6-*R5U""F``ϐ>tn;1seDDDDD5NW<#b4FϕFPPEEaZDDDDd~1lO7LªK_mSHDDDDDwd?JADDDDDD&CScEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDSTȅ^l """"""WWgv6ydfrzq䐹C@LiDNQ5"jɚoϪ"CDDDNU\\|JM^nڙ˙%S)b(qK XX6֚eT?eIԷZwϝGWʽUy{Q4?jrN|}V׿_y֨M5_up˦_f?@]+wN%tJȐv%``,yXlp/X[yoy[K__xv&;nX9 N/SɆu*sl};rggLAAr:lm'h;x^W w|@_ L3ཏf>|9-b,9hQɺ!|@/= 5,X~WU?VV )s4z'yK|>@TQc|y^""""h,hɆg;a/_85?y$vXukyWf6#/\V=}Sӛa.m7ߧrBgr}uu96=k6/Ex?+dkF+WQتgV 43VauY UT?V8V3{Ƙs5pO[?y"CllZȆ `Rz-WqKA,_HA_l\/:wfZ-"""" Dcq>&'I46kdTޕ?8I4az<M̂bb{TWרbc2'ϱ`m1^*xj\]n'+eMYsi6COw[hՂҤ룣6u^@yU̩7Q7|WZBy ٤g2_I{hHdcS,h{y/G><[KkOH9+WQux צ[hӘfȎi,q`k4&`e0YpfraP6^c`Ua6 ua,"""rMGh8|dL8XyHF.`fj:>XOrR;H{\GZx}|>' }]>Cq֙zͨ;JxcwXpϛAܿ1>$vcYymmmbٰZn?;='F}yia/maaAw,;P̔h0jtg8`(A[$Χ$' I$ `#{M"߇n1 ͠O dž5OG8A죹CAq >;H-=IpQ^= %E~ :h5CL)NEl">v't}7RD舩vYDDDD&0E$Ŏ@lx<;>!.|ap%TO+M<α΁ u4B퀝bJst,?n&4{N' n QwPsA rs$Tϱd*\'8H eF~/og0=G$Ig!3 }8ďb bg0B~; [3X"3 |}$8 7 /o3'-AGׁݗ0$,DHxZ>;vw3H.V` /yg˙6>Awpdl v^'4rЖ#wȆ+OGQx18<xn"CWgL&=8C&3|e8r: };H΋[:1 #[tL4d)@W#tipݧR}ǚ樾'm\.xF.ܞ\y+d n#vy>'}}DcId>b( 9=qAt0Oltl`^;{)*+LNfN|..%er$-tNkӤ62aJ)F휱r֕ǔs iJynܤH#' X'fh`É N=] L+ctr t3Xf|0e >H:C""""2i ћIAN>' \nv0]-@z r\`KMN%p АKW>o $ g ڋt@2E?/0B 1r`#Pn`0C{"'rd#pL>cI9= "ݽbcO#>pl\BEy8,b0}ҩ ;XQlZVeEWENE87`[rI˘`죳=²R QPZLAH7mtxK(  DDDDdsV<{f~2|]' 0ȓ dF>%E> Eg>Ey=2PN \+Oo,ӥ`9oh`{?c6=EcK?Ye>&sBsEDAױ'*q]E Es. +2Zb|ic\N\KHǹTE%"""rIH%D =6$`s\K""""BfuS30i|l^G[>;Y`YC7Ro^Jqv?EN'}]; s+j$9+j> yYpY5OԮ:ZMSXY<5k7hg7~uwzDb,*??5j:o6E yWkX`ϞfG1ųMИk""""rѴ vp_w`qj~"S?G%Gx RnOC>4* *W]Wf ĵjZF+6c ӥln}Gu }k)ڿSoݵ7^~ M37Y\YdRWb y)wԌ3GDDDDE."V=[5nʉK~QkhxjTQ3՛Sǻef'u: **PEqP/ a-gem$9Ēy%ŕ&GWf֣LjZ9 fZ.r0r47C!zW0f1j=z7?fnqj3j>^WTE.JeҌj-2c{%^Ǜcx{DcMc{Gt fֳa_=(;Na}1 HOly5j f_*Ug,F128*Xs ~w~w[* *fi‡u)sW㦙XGhC^GO1R46;F48Ah%"""r1X4%v^QQX.ABc&z?%Z' lƉ&񁿲͔ϛIhjC5uDf>?F$a6B>XG~s7OǍއ)97aÍ@5>Ħ?~U~ʥb)X!yv+~T^M?K8>hO;GSC1@DDDd2szG%au ?m?ecK!VMM>z} IrQ8{!]8܄{:Ty7+}wOmaDb>5yC7~OsϷ)Z>"""2}C(t뱵=r&aٲex :2|WT>8ɐN9|ηP&{[oQXgUo< sU"""ߟIСC^f޼y5\g ZO$t,gIZgk?c;U,""""":ux/P(Z/94_pSlٌp"-9yI Cda`6l _261ɿ_A }Yg '~ IDAT?#wa>]5#/|N=ZS)XDDDD䴁,wPkSd2$ ʽ:EDDDD)_)G(_ih,QQ>ÒkqG_de9@;5XxG^>yo%K>Yx_xU_jke,zO,^ _w^:jf0SXP5V?`,W_ +YEȷƢovٷ?v2kx۷ E_% g]d3ld>"M-܀7w> ѝX E^ EU҈Shy=[V!L-> j?BCWsǦgoQcͪJ [^cS{j*`XrqX}~рKyjʛ^u?f{>/;fduol~p {KW~,`󞮉Lch?B}{L[DDDD&[uuu&ee g24cv.ϳH\2ħg2dzoQXXpС /3o<Ld5ׂD&_n?Gn\XgKc?c9ьrAXDDDDDDEDDDDDDEDDDDDD/=}ȇG;} `t2Gیt֋kLps6F{M$U"""""2)9/]#M$o91czZdcx8ƙ7ѰP C/A'@QI>9v "IOt3 v@a ^$̠gQ)>2^J9)*ðNv) Ĵ2Eyc %-|JJ1linz2؜n (H1Ƒ)3 $E86p{)(*ﶁwap?Q+Bl0IK(DK(_X|B8mݽqAzںHx^řN'3qdhˊ[[azaV_'1E.nܗuذ`ilI_)3y[[:0`8U2#ES['SMǙQ'=~V^MmÊiko'NAhf#a.+2$:N)QFb0N[[7ExHP8m9Nut3(bzy.Lp;]K}dSh4iWAygw/'—꣫?uۃ1)7!/Npb1pڮ|O9.$Gf7`c|3&C#mKC|6Qఁ͙/׎944ٶ?ύ x0l oo9R)bg^~džNݍ 9N 'ėK n_>.;v[bՀIn4.o8h4o @8VayБK(䡩;L[otL&I; \˅A)1^v5t@"W$C4$33r2'pq":Cj B7Π5 vkgs*d4C&>9ym`<2ISZ>o.zR#߁i??GzvP3丗ɌLJj'cʴlwң(el0j5q7͎pe%̩a3NN{٭Swמ[@Yy3'_̔B%S F7E (͆%qƺ<.$5k2I'~H'Ijm%Spdh0C??~Cg:=8HґK7R+l1d~\N0M󤨛NY㏂tᴥ0;JO+M,´\R0ۖef[",=MDDDϝ(FO9~!zX$7\邦I'N*RlNNL`e =#7ÖƲO6 5D@"&n!o咉 V"B{S lfߖ!c%`x24foǚh  s(I$ }+Ks #XH^R N)"Ḿ[@i shӲ( fIttPq)[+8ʦN[nB_;͍DNr()6ho`z9F`Sn8`sB%r9>Ύn>:6HɌ"S(X#prɟR$p[.ÝHiRX2&=lYDDDDD/DuSpY8CeS8zVGTI(gAOX:Y#OIKmN|%𕌞Y#3s^yOɉvrz._}ۅ 3S:;f)O&+"""""=v(\"*s+aO """""Y`QQQQQQQQ`````````QQQQx<*]""",rs8DQE p8T""",I D.~7N4M|nȧlhhX,F(R`OR(" F1MS") DDDDXӼ K(ȥ,!\M6ժ,DDDDDXDDDDDDDXdR9/c͖oz%{Xhn[:+y<~c \sEDDDDE&)3yul|ly|;{ 矪a Խ't}l}Rto,h|y }bNmbL:B} hnp} s3zbpk1ֽ~fUK6Loh8P?j\ΜŜA|n\* ʮ^-sjocw]F5wex{?_`Jv}ggCf'F+G_ź| Ga)u0w![^"#TV_;*Y/xyuNyw^^U+X{nLntTpױcoHMtnyh@?=@,iE8P4>JkbYq>&_Sv;Rls/5G__B`˃_Nk eo?{:a|9g'H(0 h)Ÿ`*TZdhv ٴOv֛`ͣvlUPoyTGyc篩mҳ;s̢ [6Ne,{I* /Ap-`F`9%y[߮e;ٟ9U&C<_ziǸz-PÈ'dmKE$3w[yZO3?Zr&`0/}lG1WOg Wa{΋l{sxYhaIFME1狕^~ Mq?Y]ueݽ/yc?sW3vˏy% n|ȋosKo:AYXwR* d5fTPYTq '_-CgL^vjzmoJ׼iV֣K%1 @X""""2ت3)+ TT>8ɐN9syMG"d&>=!s{~‹{;ۧ$~:4e͛i,Z68mM }ivv=}}y@,""""""6s5WDDDDD.A```9h4i*Oa~(|0pχV|ʢ(mmmB!B DDDDE>̙F F}E|E FU""",I,KM" ߏeY*9o.&Rg.cH$tEtM2(rgnӑ2>v^p6&馝i\wU""""""2] """"""!i,EDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDD>%WVcG:;x wtEDDDDD/ }tX8.+ """""|){;>!I ]]aL,y T9ҩ493@YEW3"љA "x< 6.f6Ȕq3On[?c?jr9+eZnُsoҎz{5h}""""rHTZY06/K-.9kC- ^i[vօxz[L? .?ֽ OԞJ8) <ü W%U mg2{ VFCDDDDXY sV$ t#s=;Ly1cwσ+aΕHmx9E[!<ĴbX~0ȕ7qy6uے˜o䶋egXyI24T)72ml>|G=ǽȇ[xFq2Oyyfj>\?AKgr}XK'[1y?x-}ow>|~f7?wm&"""UQh^&ǟ֫d;rbp3gW3g4fpyY`u ^hϣo62zҍ\2:_K>-OZB׽^7 VBnxͯ0WXSu)"~ϼCorׇT*j_^f"׏=ϡak#Tz+uXčLޙCX+CiLх 7~qr|iڎ IDATl˶M R;Pn Pb^滐1[2j?${ش")pF ^nbe#X,DƘZ`h%pw_"!&,0 t GFdlw@+-#ݲ%$r) {g ]Vy 7Pb`5LzG[TL;.dw?ui6! J\%G?rW$2jÍ:j\B؞.kiK˘:C \p+\G|ˡ&Xc@k`rjƻ/խ>^(lDZ`>6s[Z6YfДGx5\_[yu>:Wy^|&e>A:[v-d!.Hm :e<Nnb o0?d~f#6"-&^8!6[1b= ظb uظtg<ɂm@j-[O5x>}jm>X"$e#HTñfڅecK#=ɱǏYo?nWEo$9"XY"&66u^&selt.an^>kVsַdxoAzsN@eM ǚc%y!f3-IY@"u5 ]FRֳ&nva-[|}fL8ZQ9l{y`ik:\ˣ3/z_12Fp]rYrF&v}6r֍=e,{[~2 wT2"|7f9s0b y۩? >'(Ɯ^ȽO^Oyj.br6t??ʸ^˸p+zl>_:ɴ)>?[ˆ72}wArFnqo׸;2s!1qC8ҙ /c+(?s?wԻ=P GOAЉzELѲ??oOS}ho~>9L8r+fY_ٸS~Ճo'+aÃ|`#'L,r_۶iii oبQi!w """,WeY߰U9*lt +RuygɏoҟQslƲ,>ZY?SOQae_:,0 HtL&C&UENy߸L& H_ \nGEN>)ѩo܍_;_ث~G#hEn wl)""",r4{ ν'7,>o}/{cjN"&_p<A.+oO~'6"&_2:/DDDDR DI[nL3ͪ+h8w>g|6CFgLYVG,OcBDDDDEJ|a19:OqYeOH|i7eՐxXW?Osx\ȝpC<\X?uѳ^xe6%!\9. 1U^Kr̼;|rcW4YO_͠7g2Wvݧs'>#ϿϪ$USc [m]8YO_̦۾#G`rc&~}߼9uSćyU˘~8ݥ%~oj*姓O loyz*6|8upjY~ֿOǭP2.g/Z>s8}Q B<_yǕW^  b);a7O᜚ٵt/7&o167LS{ZmKl<ʡe'V^1GZǝ Wcdv /?:w6M$%V9'Tbz|k'Ysʹ_.Nal/m}KKcj&\t,;n+yUGddҹ,#^^U˙#C{~Ǻo|Of?7?o|zK(|IWΪ4?SNԑn>mA|uw˭,€VVa; 4аe+r;a aII^w3첩LZ,vp=[+=7w` 3Vڬ0<$ Wgtؼ%gV6[p?ߟxD6er@ve*voB`C0+"""r4Xlk1osY{0KF`Dkc%pc|vǽikl3@oq[o~. F5oa;2[k?IQ7ǝİ*uwqΦjm\L*ibF~m8#VӇF7sg7VkQoiy#k_.ϼo|,_˗+ O睵@Ϯf3P#~/v2ÆU3>_o-匒5WkCqOWb/UvR{3ƞm|߬z{fc,]qEc=hoyAUX_b|6v R7l{.`PF^^&l@˚v0z}e/17<3.0lw\VxЦ[{.,_rCr 4HAA-"aBo e:ffv;-Zp&"Yk7 < ?ԖEgUneUlQewϪ&%yzk Fr٭wS}-dM3w <=8ɜ1Ȥa\Ek0E1Ge_a6~ oʏ·0\~qeZ߼c91'ȢVޛ;?&OᖙS8ge/5ld o^}1#M z_[CDDD0aڬ]H8xHVl6\u '9t$CmtE ߡL&C</ ?N9*M82 pQHDD=ʕ+x?˲3 p{{._Oms8Cv-?=Z-""""""rtP```#[W*"{`pp8(-UENy_ZKt nN4Y?3 #G͟na_jөGEDDDXOr8~| ,yF:Wrċ0 C-""",WiTVc)]mtvv8rT Wο 0i*@MԷU ¯zaq\9T,"ͪ0rԜiz)((0 EDD `E?V oi5KmC#I#H>Z@e;hiLerQP8@uyk wo|Hir8N<\۶up8p:#XDDd#Nt:\Ftp{t} /Q&ȖYIˢ=JGg~K)T,("ThXt&4t.7={¯!XWDDe _\Y\J+)qOKStAXs V (B$σM:LcK+^vDs)$TRJo}tz=ضMq0FÖ-1bdjm&"m;1 p;!l5 """"Gݻ@w5mfk,d 9Co-t.[hK)"jk&A*1%%L52?ɽLҙ""=WZEj]@XCD( EV5ʹ)DIGS1 g ByYO&NsC}y;@ .:3M4 gQQ,uN]w(9tFtnNZYiJ+{f5IDJˈ RihDˤ=6qmm]90CTT G( "K2NI, RQ\^NCMޑӧa8\d9GEA/fa" twq0k%E)~zp ݺ_^e?f\7ATDDDDo= TP)/ڶ=*(y7gW@Q`i?Oe_ܿRPٔE0 veO#FJc`3dzd R6cL]ҀV/G&cÉ˰fs`wмyMviMGPR-b^}'jOttq.$Fsظ<;­0EgV60 ɮfΌyiSg}0^νǗ\;Gldd Pu&tcf?8LٵoձʡC.7ȑ'\QAo`wg#M.AaTWَ4xeߦx ѹlPrR9""p: ĉvO8\CE 1[-Xn+A{{"dKFI+ @1Bd:ʂ޵EpJ*5FӢ#a)Q`OP~8%ha*/!aK24tl D()j-ݲ줰rGI0BJa k SKWtd|mI~"T6SxocKVC/P} sDx"=73De&"""Iӕ "\fpvZڊX#k9_Ǭ~BK9oVVNYXuyEjqLхkf?iiRWgH/ &ؙڵdŶmXprLFk㓻csDfjm9LT@*eznwNwuY{G>?OAҁp2ݶw {x|$ԁ{RDDwٓ\ٙxAx_Yn-"""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""",""""""_T+[>'N7n`[|V+[>ٚO>Ww̶4eÅHi1=u#ip RM:$,$XZJWHoi>L4ߠ2 -]7>gI[ |s IDAT8<8 Y #'}3]44pPMu mlkJ&F2Ke\~fSxJT=@XC#q}""""""&NRiNg?F]"uSۃ6,'f|͂"p.R3NQDp!n $ih ٞqR-'2B.5"""""g(8CK{;`1!6>s:Zw`*oOM9,+q2m[/dbm[ٔRV-a΀'TFEċ0M 7™h-IWA?LYQf G"Bs)ɂ˅Vɟ<nT ˶Hl<v>q`uYzΨjȸM|EA8;Cl*1qmI'rL5UAhoܾ^E43vXV;AYJՠA bc[X4mDETVSic{EA@3QZQuAvEElA/:NG.K,8]K2عl Ȏpj2 !K3"v1ݐn%|n,KԞRu+c: eC-,+!pn7.ll;?_*cq5B1U|\,9S>htqħX6H [ciRF!¦mTii'nuRlKI;ܘ. AWt͖^%,7X2}>3lm젠 I.Yl\v׶L60t()Ri=SDc+ƜIgm2EZY,Ҷ;)R +XU."kgɹ:HtN<.|eXFo–Σ.ʥȁ&[i%Her8n@qqt0pX<0t}QC,lf?DIynA."Bt[\e%A@ @,S9  TQCɦ# ү<˶MO-:3`S ,֬YbTD"A$їQ""",>6`)ȀBө>ځhhpm$!DZ,K_ TVV""",_'^G4F6()SG-O""""" r4(2*M4ZiLÍGPDDDDDDXo::褳8m+)2EDDDDDX / :Jk4_@77Ψr Lln'7Dg`[׹mPDDDDDpѰi3ZS{tl:=؁\ﰜ`eUFj ;@mm4d(ypLD.'`:Lt+(ęKh`Qß**b8͉r68.ܦb^guYHqif6oe/H7""""",GF.P{Oz{Ms"Tw.]8@%8Ո(Hwq0k%E)~zp ݺ_z{5:DDDDDXR-q+SO/?Խ OZG0T+zv u """",wD=-WOf̸9̩m싶7↷7p9wy=Ǥq3%IlL0,Z>'}s&gOƽ ?!a-Ԇ1QhzM/g2}?pzDgZ<Om½5c9[]XHGku,Q92U];.s!1q}cົ|nn %c/弡[Y95g&b1U#cbX͔iw1K~r-Bd|׈08QLXC”n䒁yܳd;zum9`EO=W[kd 4tʈȑ1a;Yv]Cp8xHVl6\u '9t$CmtE ߡDcXrs`Ycƞ|cc9boIPyȎQegc5Xʇs+1'F* `B1'N.'"""""_````CNWًxxwtt0|pC+eZEDD 1"P(B x\`/C6Uka"fUQ2tvv"zO((((((W/N'ښuz:F 4IJ(KrMƱ^7$r6"""""rd@Ӌ$-I'9zڅsb)lض@$tle{S56֨rJMg{wtxE׏XK;[ PDDDDDRjf|m :s.\@""@~ 9'E*PEDDDDDXBV8La'tz2?lNnt"""""rD@¢2X?Ӄ'I?SqZ-l\4Ro΃90@d(6-&JlSZ{IT]nrd&+ǥx>*咔f\Bے%ʎ,SǦPHH3>131A`|?%LwOu~Zte9 ΓKTHsNa>Ǐ S,k;I$IvdN0Vrf/ QD+.@-qX$Iҕ.В$I$X$Ik@k{awӿ˸ $I$XWA{uV;kF}x,I$Imjz]m&qK&%I1~(xgRjX=m{b4M _š&X́$I'ҹ8,HS- uj5%I.)gu&bM `R)eiZ$V333l6 > ˬP({nB$$It`I$I,I$I,I$I,I$I,I$IeY[TC&Ie=$I+`ۡ\ɗf UE$I .(F?8"$XY0N]mپdS#T:@_gx(w7&<4o: 3 }.my?KOdv7-I `is&82G,ig,hAtTj+/t s7qǝ9K/O)w80I `SZ؇v^ypf۞y2srw>ll:}]|+<3N%ҭ_'ヿ4_yM>O1<2p| }y >~VZ+oG)\Tw A|=R>n?=C ?C w@z/~{iz97 W|?)>|CŻyi?o=M?0α=|i>i~>PO2//χ>y«k<$sXKx`Or?SpFRc*|e{ic|]Gv7o({an/)^on\8_gwړ$ځ&=֚ǩ D@̳+"pt^~/aa& ͼ#<5wͬ,&k<sܓ|KLZ 6aj˱YɜmkC3ü#L<7ky_z^؇';>#/r 칍69s/}8/xs}0twx$y0~)*Gݎ$2` f $`h؛9DUkT[C<qný 9e:c|aw3>oFvg.o|},~7Η%ƙc73~޺e9g$2`mN3U bt jKk9\}k:8V9r{ccS _(}ny ?EOTdžXwujz''0=1>pޏ)]W`R oIgSE>ZW8O-%O%޵x+CC-WY>чiݻs|O#E8ǎs?,<[m{m+}֧Ƿq~?p$awfA01M"H'R=& HN9HNkKHҍҫxO|qG#Q~ٽ{ŕ6sK޹\=+=wpoox,N6>wzSA>}Ħ{ w!S:갴/5G /IDAT|a:"$fy`s 럜q_ȳ|2%n>x$$g'o6MC>R%M3_{._׏'[ǟ3:x|K$I]pGqϿLxy*L& y(6hlDY z4j!K{WXlQ(yn),Wf0EW fggXi& Y]_8(WAaso&GKWW?| h4}`[}'`}^>qn#0 /2O{ !Yb6sQ9;npDm8!L 6;.D'$I]<93sb*{s,r&Ƙ(Vf$I$XW0Mx#e}B|~/_"",7J$IYByL$I&,IzCt&C_NáRq,%I./#']$x~ l.n|H, CS9>>9ƑqX0X.2ᶖqP~7j1rG2$ϳo>! y6dKuD&>L;g- C8XlH$(~.+$I$ oGQDA@,;F\^ݺvv_ I2%I;hc {ٹwr$$72$1$I3z$I׭ٟ}~ww{ې`]dZY$I>ۉ`A#2uy"W$I̯۰2uEC I3Dۖ2%I$I2uMs'Io6nl;J=H$i[ۈ ` {AV8I$vAIdG6g?KrP%It_vյ) f(":kg;Go;Ad+I>'^,XWNï1 Fb71#?WaD٦f%w­h@e)S'wui($bf&OuhH:"h&!D$F*zdl\5^]n,e ұQq$ѠMuN{0X|yR&O]c6x?#Nw{LF=z#Hfr$MVmƙvMX/N[kj8Eyajb^ir!5>qX޽ & *F;$,F0iWtwgu"yD v&4[gի%fkFL$I&b?m3~/tե mXpckX?G6HQ{%vקK]ܘb!xDҡ7pb38!Pk5!S`*b0ӨO"S8H{tz=ƛ*03 R2$bi +.RY C.яr${]$((kACш1gxAT ,vv/"?,^b)\I0'd `)8K%5ƌaG"@*~l.Zx@2!#A:[x?aˋޘ '$k2"I5؆ }VvXnf# NzcȧTz!B1A!ֵb,aH80[_QF!0IDtz3b<@ԥr*#Nﲀt6C던t"F=5hJΰNN&yWZ1E'=U&=Dc:kjE zoy{8bP_HsGq['ސ>uMZkzjktsdcC*IfFM^Y)yיhјOIАXBbzaΌ],Ed<ʑ*>LC)=~+d=GY Y榒[4v7\o0>Ai\BU a2v03?=X@jz]S6,bxڸ';W>&s1Ԏ2XC$?[ ֶMz-?*Qb̤j$Fav03*qNեSmЍ Iz`Va40iVZ,a|6ưݢnN9ژu:&c;nZd2dnhİSex"P=ꫫTcoHb2aLh. 4Na*# $$__ndݒ$jܳ9G5nu8 :iO4V8My@,1SlrVe-JLq٩5VuZ3'wI>Ӣ-R4Q "-1;'.>:;PmTx*O= it.KbȒo;](hWVdKgB*-.yxbzJeT@WcA2J6 22Tp73IM372l@,$Wg:S̖F.Ef)vOSߕef9Bӳ -SȧKfj:#t84Ӆ>Uڻ涜1[$]s|!1^@%{h/0S.^EɄZ!7OZDۘ;e^Ʊ5b)qecqu9$I;%t/0Z{vz|qK~˵*kWAp>e(e%6Vq5[$ ߮9߉_]f.(+WA$I;5f/j< _ `]nEg]y2iv(n__t$IWl[]5e x.ax̭'$I̱{{lUB +YiY${}?g|/'"ާ"t)IƯ `]SuEy1,I `]Q{?[ Œ$I; v/2z/6~e*#3I#3X$2m]q֎oЊX$Io6弞dkGE+\I$iw!k K$ `]u+ bIk7x_#BV$IƯ `]+,%Ilu’$I2|%X;jg K$M(2%IdJNCZe00LI$]qaL&.qtmt^$IҎ1Lz,;Fv@dUk$Ifk`0p$I6 `]Y$In$I$$I$$I$$I$$I$t10F"#8$Ivbyn\L: +yXGacw23{; #9މ3޸HKnReX"\Km. 7M 8zAvsnOI$iS)J3y)Wh G2[]eeIjoR_ řiVK$LB &챏{-j&t#:+8-VjRcԥ^_x4Cz,I .кҹ, 4OSasvl.KGWi ,3SiAĠSg^,[bl\*>Z.X ?|VfrDekY(eIcLt,ў{SXH<gk}eAq77e7D<`LZvo" ә!c*Ǐ鞯 3SIb1VXv6MO Yf߾ '8G)h.N\;a׍3Kuz ,3ߤ\18yaǐi$t$Im?8LF 4HLTcTraw0<3֐x0;ׯpZ(iUgv¸JaT.Q.mVVZHJJsH<[b!Bq\!F'HɥOT6NZ3+RJ?JvQΆU֚#Yf7~95I*iVYY%Eanb.}2ۉg$t8A ȞH@jئ3 Hfo,nZ(UdB FH$IpX<0hrШG}F=g*_$O1 4&qT1 ŠVa>VD2|bZx#Þ2ӌi-DtVrh20$F )r9aA3@zS[N>V(cyLd+-:cHIR4әtirzct&$sfTx@7T?V'QgK)Oĩ' c \RH>M LgS)"sSmdNztG12S~L1O>vǙ.ɥB $+R.KnpXTiJy2,.̲{W$nGLɖ)M3KBԣB,K!L晞)RL$c3$I2u]9 ŠvzIt>]r4jFk _*3S.K iiazZNse:.4{o\ ^M˒dDJADPbnvr6р2kTi2!f2#kk4. `Х9? gY ss3Lou*ScJ3͕ǷqI Y *OFYB s4%j=LQ)1O[ϧ MW$I&8_`\<EL&^h8W^e C|eb ǚcC$[nvv6"nOp}2O{ 2z cKh:Á+I g 1 ]Z>$IdKɨv5A$Ix,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%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$$I$$I$$I$$I$$I$$I$$I$$I$$I$OЧ$If@2t$I6 `]K$Ifk_6caqt:%$I91ir+h{%:$IZNI$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$I,I$I,I$IUc$I$]8 h|BH$Iҵ5Bb GtGվ3$It-ڇ(b*+%~$B:1. &>I$I$Z g~  OĠFI$Ilһ@w`$Ik'w"I$I9$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$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$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%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$$I$$I$]_<"B$It0@v$$I$I״8@v "I$I-?T I$I5gnn BTGE$Itoqlo<$I$/D׵2f'IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/security/image03.png000066400000000000000000002644621461403617600240340ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwxnv;;" b?zmt^墢دJUtQ'!?B ~dgf̙}9cp[op8}qwX!1!`p9\.,YbXHK :zGq\)f3!#GՐT& Mu1K|QՌT)nx;,""""""U 0T""""""r ``*ro``0-L& 2qq8]NyyNUHY`_>E 00M,ؼ!7;[#""""yt Rl>>"DDDDDJ}|0{YT{"˂Oٽz]DDDD`قW-"\681 ,""""={xD*!EDDD`ɬZRliERy-`K"{3)""""RI0TF>ʳV!XDDDBZrUӻW|~XX(=$O>)'M 'g!!!ԟa5+tT >@{~;tS3.ܳ<ܜl2ȳ1`{1[̼tjֈd˕$.1HLHn9iChX05`Ѧ#szwt0N<oRKMMaѼ;ԯWwMEDx8gܘUr89t ĄkEH!vu4d.fl#N/ɋN_ڷb/Ey&\أ_ N>{;1g.W&*]t'?՞a0c'+9o`7_pwzzi|S"(AWhY0/YqٴioWR1jr24=I(vlRo~KM)Zf5o^V`)"3wO~ݻ&w0$&$`ZN09r` lԨSnb3Ͻ 'wRxdڍQb'|?} fvޖбSut܏3AiwlMûF3eT&NǾ}7I6 朗DDDDD*L6 rILH. I^^I$'ǧc8֍Nk >2j{Ȉcߺxvz_j v]d 8y6,X>WϚv.k nٌ+'uWztR˸% 1Wvz2l6"f%r# 9O~X71LuzeefU>zCv?O ;}TkNVt 3{𦴯kZvkjx~Y#jFݶl8Gx7F{L^KV@nt=š#Ş'l3cLv~P5unOż4m% IQTXt 6o;/|clڴEK+tEDDDVz1q} 2$; Zy MIJH 5%+f=/D6>Mm3f\c/nۅs^jvpzu{lؖSwGu1Bʮdi|cSK_ I:偪V/ uZ[ܒʲ5;q%xxybb gު Gײ,a.NlY6}j qqdD<;Y1ā ;5ƺK6xY,ٿ3w kFOdncN"b̓Ѓ{Ќς ܴ86ø3n3x-hС=i.8;v}`,m\e~>|ƒzGybӒ}`}|=&MJJ} y❟I,n͑\3A}ng?{,2 O96;0k3ʃOLgƺ5q.6,QJn4Z? O slb܄!\o\g ĝkg Ag|c>Y=<̼myZNp5d x⅖cy㡲 eJ""""R| >ORzRRcGO=śo~^qA߳سk'DԬEjr))ǻHVDaʈgֿO8|ӷ˘'`پs5#Aܲ-& ʋfCI˷f3蔩#6>ғ٤s4!aAgւ͑/ D̗0q&&/a_d!82}ֳAݺ@Kc5;*{tk6wOz5"tBVĺ8w!M5ĺ~Kqxѡq G~y Oێ&؁n?cCS=̉؝'!=w{n^P*""""Uy LJwd۱HOM!-5@hX06=(љgOQ$:hS݀V:==5QaCdfy0`'nu@"v0 W;+z?c]ʯzڍaٱ~;R3q~trl}۽uW~u~+&>}D\u擼OVш<aj.;;gsykFd߭`_6.0Ǩjv89Q}zo<:5k{f-@X""""" T`#j"//Ąkbwj턆QI˖Voxzz0SG^ +9ߓCnD3\n̟v` ?4s@6?5y)-q0V#!Wv%tBp|֯  [%Ż CH-F^&G`33y`jxyK/LקqUh欌)vA6{_}˨cyfiaÖo<Č{&="QG Q 94g[=_#sc|wnrz`~w[oSk,:t/x}lBBJa.C$%$v>j!$,Țu0[2H^@_z 5߼KJ=SzT ׽@-fjխOHX8i6 }|g<ϮRjIwK 3;"'7&hJxp5>ɓ[tߊ̗}ѽ6!!xe{==! Ty29*{!@U. """"R4_SҲɤZĊ} kV*DlD*e~EDDD2`Fg|>Aأ+""""-^6o՘H%f-1lP` ˋTɬ{E*o6[B8 """"R˂W%R||)He 6oTS"U_` 6oU\RNk2łdja"UՊÞrq{T7""""r`Պȥr`E.ҒN]Z%AXDDDDDDEDDDDDD w ȍƃGH1 لddV(K9x<.'(.Ɖ /قa Qtp9qn t4&x.dxp8n,^f8_ ^7+"""R\n\N6\R. ׭DWDDDD*i yX Y"0Lt܉&MдIc7kaWTQ+*7vܺ+Wî{*DDDDoݎɤRHy!Zh~ڴݻӣ{w /HѸ TPEeڰYm^aJ.3 j٢9?RuP-!dr=]ۧV//VZMn^Ly ͚5QX,vfWT? nu~y}*=9fMѤIvͮ]0{6:CT">Mzʽ{NzmI.5}G,u޾_Y?ץU(""Щsg<k֬.߸'XZޮ:'M8sO>}x,_ty ~~-~ZJC ؼ/JzY,һWO/@9:wgQ7ӥs'BBB sN&f~<ݺrםwpQYJV.|'fr=g6&+'Q7'Bnt$ܖ:tw m l@Ƕ-U.:tV5v2ǎad?6n@Mc|jHmS֥nܖ:c47+z\}|]-"UE~߿yZ]<?r/mzҫIp|^^˯yWn↛F˯_={aV:_,[o)/K-'ߣqqLE֬^={l ߷=9擘:k溑3Or9}Ge󖿘>m:|ocxgxY|yI/7`0/wܞ}5l4oAetx-I߭fhvʨ&_6x"g䇙8Rع={s9G$}N `5iۿG@IYFb1W4@g6U{^j5Q6Eg^cc~ 4^)Ggv$S[ᳯבV.e5w0=X>fHK-pV#8Wt(~롲^ zHдIS BQƍٳgO)&HF]^7/~W'D,{4<<8mMG!ܝLYE0 Gy]wIrJ SRSkVڷk[/?O}\z83?Uu_.O 'M&)9`9٬Zܜrm )SxdfaHLJǟݗV-2;3 ϋ%D`{TU-5C~yOTetc-p|ȦXZKc3f8ƌ}?g'[s<bO^G?ٌϰG ͋ şp2_jNxoN|dkwA@5k9<ُwMha;ǃ`hcw[? Y+oYcT^[V$!Bѫ~ usaT*TV)Z>}9p`?W>j6ycudg5kڔ͛ChݪUyX4*:zTk͸Oy"+X)Z%س^uڢ?g`??aLܲds%}H}YAлa~t||.~cNjZ0KirJ=fj@@Nv~^tUg`OcX^}\ռDRI߻gB/܁TeF>ݨ&lvҢ7? Z-x[,_~.ÓdEky=5ynK}w8~T3ێrX"u0ScX'5}͆,wO^/ L9[֥`t}eus t/u=^2C ˙ElrDҶi=B,8Fjvkdw(' wVGy7ε/}_ ߏ@ zp0[/dcHMK###̌L222,^21B0AƷGl^cwiVU#̈́,Kb>x#׏fhló}_m'/Cl*ϭ9Rr\7=2^Yαn|nI6kgt-Z(A2hq-Uا}~"]\Q ={̿r1{n_uUS/I=zd붭ĝ26ol\,J=$v'5Eq,8e'6*ikʘ;z%)& -~MQ$oLp3c\ీYu+tM;zR32O6 MM[qqK>Cf0jx~c ghJ+DDx WE$DۭLwR ~Ut͕Z߈u{Q빡m~du$]g 2~ϯ1pgzHO?\IjȠ@YYxB/iY Xlt۟h.pg:.rR\hn3m2xo< dHN\Fu 8&B^j\~'>TtY9|Q7e_Ï\OnC>}~d:gG94{g?zY ՁͮU?"ՎiOFMyn~}MD" bqww#+#={qF&]u{@||<ӧKj1nS*w3 ҰeK$,iɵVٰQčg}D{!gp'^o^϶3yv[=G^gixlXsäi(EKY&͍ίYkȧ/wNDDDk-P_ IDAT[6gܹz.|,DDF_s}}!((ҽGw-[V&_#"wotg| 3>oTvm֯׏u>5G5״-ceܝ\#~>tM˕Ev I'989T55yCLf=],`W~6/[G+3ؗJc,~'懿'ǿXY5 =؍M=Yn쁍^ X?qvf0m7,ЄM8{GD[ӵظ`L~:y<_?|Y>,7췓"Ϗ822Ȫ@#dНeD܅l>l3ϻ.S{5)'RNHO=6i#-F:`GuNK$)k'K$7#Rhʺ1uSQu_# ,o֘kw89Vfqe=|=l&7i~(Vc_RRy׹wXթÚxroîW C|4t֑L&"/;wnJΜ'x'5adȟYy=6t_Úӳ<:}-fSr1싊*,Wqʴ>wht͛n?wE7+WdavӺernuŬϿ({4"Or]+݆Qv;n Sph}M&.Gَp1lKLk>< r 1/[g`rF`^QaS Wڴľ sOǨAznKS=j -GCNp$av92b8m]`rܧO?8>7J]ذog: @h@`RI:!ǸW|@[ A~yNR}沞nBNV Kd{V.v6^c#+j%"Dvv6yu7/|s|` 7Hn݉ڵT٠yp:ՁC4lNklsis6) O"qGCXٰ پzk=;S2mp+z`P ﹛]h)1/ XeS|v^bŹw>7{חl֬^SfGƍhPw<<0e2˖ƒ.g Wbh԰H6$6.Loɯߞ? 9mn `מa&8yRI-%ی+{GSVȃ-ׯ/Mcs^FZk=~xH{:YMiJm\)* \GGD7e{0U9>L o'ƶô{1.Ej 1A ;:ux(CV8u?pwY>M{mN< 縊{iv,.i:N|KWr9Uǎc/E|y]t֝9gJhҭ[wo>xFJJ,Nu"߉ȹ{^BBBNzv7:Z5jwŎ,ҨaCL4E].e=ouA*Ӧx&?""#y 0ᷬZ6?L_wMGΝhdfjڴnCdD9獌M6Y[v҆L!'jaB7N֬O9T[3hzxѧCSBakIw [S&c%'01y>D,R&i f{:@pTObg>q$Se>6V#%6R\թWLH߽e_bA?-'hJX$a̚_~˲X;ʽ8KS֔R:IMM9_g:bd($%ONA(1\9dY ,vu1{u)MVsMa=JSZtae=|F#K/e_\.III%7/ڵPvrrOL 11d\CvѪsOӧAkKaEsGv 4P;v\=Tf̸ ̝3SK -^S93n|={e| 4[<W[`ͣO 6nْ Dnn.t7on}W Gv3wN\qps|V/`+͛ӼysZ48q,eKsF!<="nCWuSymH8?,`Syیw$`v(taDk5a@TKPvRz6G6WpU7n"༧{'ugta7\ݬ j۔jѠV6ӳJ6Od 'SwnΦvmc֪K87]FԌ$n}zg&_KJ!#ՃGHM =YZ*:^ǧnܞ5}μ$SݛR+"p|,$pqyFԬU~x2rTkԔ&OSA:ݼu"ץ(*z) Q=3*ZS=էFo5jDx:LS9:Ұa}5.̹'y G3b ~];ҭ`P[Zf̏wxu =:dgx_~65\OĈ)>~RRSyxG0n !̙7Ĥ$}hа}!C0-HI=EfŽȖ˯<ʫ´wI_5߀ҼYs}yRRʤnѰ~&1m _g- \;2{]<~sC/08/_ow$%Ч+/DpJ 3:C30wk5=; -SٵĎvRoп`y$3&<`'N[q bO}(-uqЯ {73Y&dZ=2[f p٪Q7ZKW2YXg4y~tp撝Vpb>jZZH8K$4߅uwCTѿd?zwdKLlMbg֥(g/z)"Png?fYO.~t7dg_8zlVjբVZN.]d_-n76<{n92h Γ.ʁ:prm=Un]y`UV̌ ^-ZU627DCw֍SR-0UW{O~ үwRyWuL}ogb}|rUVT(9gjTf,+;+Wӷw/rrXeשS}A/Gq"yyvmdefu|wD_vW1]fE8"""٫-Z #=e-ŗ^b߽t߅jHʪuLPv4aW-{o*VLCOq&[ 擝s|Ll֯#GđÇ^^[jɠFAUzV . 8Wǎ9jZYtҙV-[ҥ?IZՋkײif wMrjyh׶-;6l/P1VZP˅SV`zrMM+]*%.V\}`ݜ, ڨxJYM9G9A3/ ATI&aןr;n=HD\*_/'kO^&7`=—~;b6zfff2YJ\EnT"U"G4Se-zc0`ZE^ۆaTPXH(< m۶9|7m?/LrrK s9UThՆbVe\$5k֤mVmۚ:^-e67111Ub=O ml`_3EDDD&Ћ=fdVbbba A fl6oL`&"""R/.V5a¦+Z mrp0PHb`_ // fC=EXc`xaxvq]]nSkd <,+ßf^%xxox/t ('' K|BB2g㭧}*N099u%Ӧ|c4C K>q pe`ƌ1 ,sOZ~ub4烑- _W7ᱶ[DDDD?~<իWglڴmڴθqTTґW8|xumq#|:}Qfca8u"^0xvQn|Gbt~f9z^Qx?tjռm&ivY[rk a;׻;VY~V׻ŗV͉8v\ joAk"""""ZHH  `Ȑ!,Z:32p-ZDHH*`O,v&yxשּׂ lWN_6f;b\`o"<LM1n{du01Guo)VjYdd T&"""""?)ϟ?.]9a ) ^"qmuñz H:pY&}(8çsC#sJvwe/"78Ӿ&"""""+dΜ9yV^͈# S-sp^6'4b>շAv219$x5ѯ?fΦrՠvyEDDDD!8,,aÆlٲi˖-cذa |Zc6y2ni$n#?z uWLM>(mIöpuNj-DըQ;ȑ#9rd5jJDjNj@)sq.ԨK͂F]Óƶe1%'MF$Fv:ye3y O:6?][DDDDD.xbBCC9r$#G$44T F .k_KXuBxL/,zٚ-f~Al8y1yxijS;'}مzw;$ceɟ','<ٞMã[DDDDS+믿*J4zQs`ۓ >4qDz(?0}rc%$>%¦A8ũWHrsctBa{@!)I$|p=?mԮߒBMJrc$f<徑#L_l $9KX=~;`'o L5ѧqtJo@PӗS*mǯzW^`Kꌼ!Ǻ:c'VPFFX=K??Ÿ>) 7.{\Q5W/,21̯^]| ~x\g,n [+sܼFښqDDDDDD*Ùn綩-70 % Ǻ>vJ6h`j؄ɯq^\Wρb55R""""""Y+ \.w`,YDDDDDoboOQ*썷ivb InPY\bf*l ;,S 4ͧ; Q.?:(BK6`̢*Yji)UNv[*jY0{ƑG^^D IDATGeBbcbUA R7_u-C}*DDDDD.i[7orQAC:̊{svTFDQL,.~nBTA1(a6`"}u]\=g;s3|Q4lܤrwc,X 9gC9)j_ 駞㹑7\5D]F$IҟS";+N]v`.%*bУE޵#4M _}kNYȰ2-N|w>+sg1_9u+QQ:<ҔS⍯ u8{L'Q]zC$I_ HO_O& gD(TTUPz2]FئjKG1>*[l yܠ"$wec畓DhZ/$>K**f]Oxi "LϪ:KZtkt<`Ӎt8zx}v/ıLw܍_s8X>9:f?t7WB@>MQ@/I8,ӬYC[>Z[%Q$X=rhWYj9E\}/FbD6l IÒ1Z x<Tel;1w܄ckOZC?qg51[s+VpϜp/B`ή0撝׼Nnb LjhOv9l^:bUa9sh*pS,`e#XDWoK0jb BVl\mp^zr}? ZͳwBF fѝ7w-+4i7:`:{lG ?$Id%1V&3+J$e"IiD3~.#( JKUVT&f\Ome]Og_Zi,h|&/Zԩk܌f̛Ώ+C*RӲNU^3䂇eiDF4-cxTft'׶ry,܊ps^{^9߿NѽC*Yoq-VDF]⹳mֳC%ZkϨhDpLjP̼׿c 13ptL?!aI>gs;IJ'ɭwŔ o)_?[9_euW1ϐ'I߮7;CxܑݖfܼE,Liǩgv` 2cQ.;s'9-tL-j;Y3I-GǼq~Q `vCg A(g5!w&N԰|~2ٸM ~Vͭ1l,c2*QGu"WC8 7%mQnnگqշRdfiPg#vϥ\4d>4Son]Tw뵴]Jn8≱q!ИU1V:Жbҏ,_Za. kŻnvhT^`<-:t`>0KG8Gr?eL 9m1nG!)Kn>];=?QŏeD. CZσwj<޿ ߻1̟w^ϱiK𬳸TnL孳/Ca">}b3' R2plB$i{aߍ5սW?eQ=nn\*AZZ9+[a (lǸ ⣇oΜ *pK"#=NFZH^#BYQeZur9aݶthd-e_ksjv.FЀ{_9%Aurw;Y}͂zӺvg'xm:uXT1Cʃ9;L* 1ǚdtߧ5 Ï5mg:Pn:ԯaIR *ղ#,Sݕ$I9!DiR5xg^<&/XE kچRsi}9k׏97CƨNb?:/gՀQycaeMR׻Iy_rMo0 ͧ0v MU[~MZ5&XS;5mI$o1Gn8ip&5V.[NQ9,2ܧswͭWyL0BvM֌<|b "s{N>'=w]ŏse**ȡES9&- mC9nrhs؉ӽ|t>~rX;r`ڼ]]#69F]}]ޗ{cV&;r> z%^_qgql9$ٮ7Wk$I 0#HfBZJ"QAƈS$琲}W qXo)$I$$I$I`I$I6!Ia%$I$Io!T▐$I\9CRݓ$I$i#śkaX9Q^$I$IDY'p"N$I$IM=8X$IIA$I$m $I$$I$I`I$I $I$m\,$I ?">X$I~0$6z [+-) ԭ OYv_ $I/ <Sg~ ++k}F^T`I$IDػVѹ#v0uXQ47RѱIѨY`I$ID"?V ?N}PVn%I$}t]URֵ(Tօv6K$I $I$%I$I2K$Id$I->||KS}bK6GW|˨}H)5s!mD%g naI-c%I>ACavCVMh ,6sͤE 3|LMW4.5KS%I~= 8uBrgg#N%j6oJ[qm=ы޽#dd^)^3TzsV q١noY4g䃏<$f3v9/WT eisM9֮|\Zc&|{=<7a)]8طjeu7ѷ9/ɵi v7np?ޝ^>V2xrdf%Q6z޹sdf Iِ՛Pk$I>q '_LŞJy;`ZD'/ø<oOEd_OB^p@,B8WPѣ\@9y8d*&6}eKZR "o\w|{0{ X@y"ޭ+;g,|~y{ ebUxvaD97ګ+V`X#[~-R(1<5@t{\|s1\t>Wtfހ;9s hރ \w/ZŌfh:= eoxRrO}Nn:Gr'rxN>>v 7bI$m҂ c`eu a:3 TY X? ^Gapc V>Bv)|*! ~,<>pD\ݿzx1'!aз'䏅)P-eE#%6Kri ϱ\-vQ9s1qiU B 5FXbν;uvؙmF;SF +9V8eT=-K&p̻WҍW95} mW@#ND0kxs}Dе%_g՝€V|GG·/,# ̞ v`[e.$IҦ-oI 3(gGz]QK%! w!aqVgPQ#B4u1<0zG[O:mRviM>S V i \T [.-Byd.JVoX_JL-oJ r(87vܯ.U|/H$iؑ s9Rѣ::AQˈϬTiHp1,K!'˗&_6%]4B´4k5&} yիY~0uR⅓xaV1On?zE1:]f}Σ/ニO%yFWvۃaVDnRWb^\ҫ J&3vxhW 10+yNۍv{wuY9U^a_=#=/~drdt~GG1;HEpm6C}xf嘛.x.6)L{InaãǶ] IM}cazlLTnGX}@P2폂*%;\)pbW`y 8WN%qEgK)< RQ'F={ !3gTv2y&Bħx'ZI$isH$(-+#+ ,?(z)=XHd=^_뻗N<`oXi57j!$I$I[$I$,I$IX$I$$I$I`I$I[TYȚZ $I kUDss~ss7~Y{d $I$mhA=_!ji1=d $I'lD"oKY'AFZŢR@Fuf $IE4!Ocڶ0 ~j&Ec1`$I?$ED"bD"HՁ.`I$IPHĖ~,$I$Ø K,eRS]u$Ii3H$I $I$%I$Iڄl߱c-'I$IC+I$I&aSoz pT{_0I$IA@4) iEo0DIN $IH$2B,)=J$I6 i7Z&ŋ&|@$I\ `I$IK$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$^A8N9_ KП㳿Qy$I W Nz{f,eBH$I"%mΫꐽ(~{'5ޱ#x OIPj˩Fufg=@^\ptA@}FLfʐxfz]A[g_Oy |= &˃XϤAC{A牀.烷&1wy=+;~8VpU:P̼F1my)Af4޵!O\9o"~#wӪyxq1eI6ٞ>3=mjن>d1w1l?æ.*l#}.bzO,Kv级~Wm@n|{V׎'xd>nA8`Tv>xgЗ^7?S_7gKGpAg^s>1=SOOlj,5ڠy̽vYVeTyɾt ˘-ܶ }{=/ٛ᫲|y9ǣd3⁇y?5yV-e#I$IW4w%*'N*gqiY8aКçv$'ќhɏg鶝g}DڴA4mPٌ[Ep!aGs@ F}8rF zDW}_޴4=0ˁPNӵV:2 Cb4bqk{?{H$I& is_ql{{)JYkXoEVP'3%qtPZdUke[$IdwW7ս+ߥyykR/'vmH 0瞾ojgXϰ_GD"V]Y1m2ۯ/xyfwvG[%I$mG#h3*^|j.̵;'͟Cn$Vqa.M;bVeסfYت!CbT\+Oefm8r[Q1m޲?AjD3y/z]4WNTVIK=pgY7_4ڃc/'/ >1o$I$IFi8gßOw-iӍng1o+hT%K݋]֟"9|BR7y.iv)Ua,`(p~eJbEXRXJq6)i/gUT^A>=^)Z7GJ༁+ XDAv j>$IdޘĨ{)L)puo0hȑW9#9;Fon>[ю#㮓SsķN qApi|ҥ}*o{&3Ko8:*Je@W8!J3v{É Km F;ۧ9VDx p\q}s.''+л9Cup_!.C7$I_гgϰ<2sFwLh"b"ADR͞z$I$maA]IKK%mWvÚǍ5ؒZ%I$I[2$I$id ~].]Xs`I$IҦ`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$I?(H$I6vcǎva,I$I"%I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I-y0\cI6 @E}w8 Ð/ee I_ C %/Z I'S-';J& ;z 9EX\j$moHTXISZZ‚yKLÚL?fmN$4.(@RI6T>zZI_$ aIj Z?hVE"GA`$IѪZ=wKRwrC$IMC5Xj] $I$%I$I`I$I $I$%I߫G9aCtp!_d M۬ F_1|t^HU3pdޛ͉+p)fW} s)TqoW4-Z&."Z/;v̪֠[6π4mYeҔKy=6a WLݯ;3Ӆ5$i3sX٥Ϛ Pӆ><ċ/˩ML>\ןW5a.Y,|N.8E-a^C8o/)̧w]ƮTufȌs;W8g5}ƀ VR*Jy⣅6{E9$%'GR`e X6%uvDR>{G&X|R8&n>bup%Fz5 ('8֭[Ѻu2Kc-͌9{6BY~Ŗ,m.Rӳ6{ȊBnw#qWvqyrNdҧNwv̠ia{_tغ:%bJ)T2X`%c4PR?Z; ZniMOT`|z'B8m?(gVbIƭšw.zs^|c7QSf*Džۥ—ahn?ƿ7gq }?ZDB}gbEJ2I#yRίlHl lr'V?^M[i,exA.rIypp yCحi:I8Zt+Ljۉ?}jE7 %I'2~ç8RևōG%e|S\;=op U}Su\qL x^\pt.dwrw@)?>z=>9?dn1N:%LznNkQ9d gy .J0噇ypzAˠk᥉mN::W|Oم$Iج[cp- KY5w:cr)i >̯`e\k'Dl( o-ܛ3'<$vkvs/ws, rVF( -Bh;?i)NnIߛȪ"7[xof'Y=)q'),1uq e9l.B*Ԯlu$I$&.R}ik=i&Hl#6|Y^CѸo;jڗ*|M^!\LYRԠmE DrC֍L1fMZ6 8[ժ ,0hJ]pq}xfZlއ $Idބw+t=G<2H`ϕ;HÚ5eQ !'?x>#g |6{ny͐rJ?!Iki_kH/:aаLa*}2c}椿;-I$i˰Ŝ\9j(Y^OѠ.C()[֭[I sK=mUƳo<5dpCz1c"SWٓR@r6lN*i 1qiтٌWAE|+:=/bYhw^}-ϗg2vV|T#EkJ>t-^ jIzm>CT&-η7`Cէ_eP7ӣ.>䕬2v.^NX)ȣкukkS8qob!==D:mcC'lN&tTDDDDDdA< Ʉߩp:gU@Zs~WuH,""""""ˬ׼yXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDD VA[ADDDDD!7z 66NfFVU5JDDDDD_`0`kgDlO` """"""lcc6)HvvQ"""""" pwZgr)C`{1H"""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""",""""""#.>t¯vkzښΆ%S1amUsDDDDDDhV5cl>{v50a&-ݪZ!"""""{TW̊w]ž4>H~Wiϗ~*FE """""" """"""" """"""" """"""" """"""" """"""" """""""#;v?w$miy9::[OQ+8XrGx[VF """"" IDATR`$q<"?c[VHA,ЖM਋eEDDDD@S.* 8%9Y[VDDDDD 4EDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDa5:Y w' Cn(԰6W [8NxF2x"¾DQbkb| C`s쭿?ͽ-/|6q󟘧7> ""/cpr$Cw3O0& O 7ތk_y\ L [i͆m?:Zט; E *i!?hmۋ`|SVz.4/ j3pi:[2xd.]D|s{A]xB%?0Ӻ׫{vc(w'|^?d&߾ۚvk:Yz |\}3[V^Lm-J9?zKg Z޷OCNުZ4gZɟ_Ee";V=d,=>Oت<[qwݻSV}^SY 8b+V/fZ2y~Xپ,"lZ'6fyl}}Y~$~԰N̊(˃4mV$l˾մǭUw-s<ɩ`M<]L{_Tnm~obu_}_eq>=aֲj.d<[.!)y{gk-M"^F(q/5q@x}R&f'so$±"Ac[K[.v3+~H;FǠz%v]+Joz*0MBg%/e#k:=ف O?4uO]mXX/N4?6eZ_M5C_kXT9DDoo4Rx~%fXz$MKO 1f?ggG`1yXcVnRb(V#6XcX1c%ώ}A2ձIK٫։KXpti+>_H,9N0m62i5|.meƘ\_2rOױi@ܯ3ygZiP9-AC _햗`}=; ed\~[M~#9ty"e ?Jdw?Ϸ nl3RKc;L Ró0.uFu9kNj.?ice2 .Ϋ<Ok4G U.r" jRJݖBԏwT@Rl4??O<@K(ߒR׋&3 pxfuxMzx 8Xھ1.z[*wNiLy"{,ӁIk:B 5k7FIlβ/*1_Yy=L"E0Yڻ _b[BnKJfM΄#zC*9X.>=!u?c:cYv67h]D gIlJ`1yԻ7o?QFmµZVl e)#y ) x'+Q4jlp7+ WYk:kp5\]#ņj4 {PPW9qgVx] )hD3qsU6OcdGTkNx53v8`ޘLrHo7a7&i3%.DzY[8]vp6#=0v0VwN jCGS]yϴԢ y)Ȏ]6c'-9KEr@y#D{Z OpuÚ2C(9$X2^6p)9SH@h+Yo:v:8]|&X>e`,/Zjrv|fl-7X `1P<5jRc["1ώx x&krTl$~9_ ؔ~뿦WpN x?Li]րܖ'+*sliWyΔ|ynAլX8ﲔ8[s3^3Ql}? c^F;3>V-g)Z1 Sjcu:nCޜbT{7=|>e&̦"Քat|,ⳉ?[t&.م\>m['0?u:2;FxȜ(FnikDolFƭיj< tp}yB땀pFŦ?&g fbe)f4DמjW̑{8ߢ>1Y=&_ B@2ik1C`zm~[24l}o~`[_5u+.ʛpzc?>,}EM؝b6`y8ɔ{2&,Iek%6^dkݩ],W0mIJӲ4s=mɞzuL&.b[ UR"p.:׹Z"2[>EcǻNmJ]g3&w 鷏ƨ^H̰6Z4nSJ%pW_#l{$fW93{"2_F&_K]a# Yɺt6R'Q dfؙ>]&tsmܛ7#{}j:K7kzI1&~Fթ,>B۲lLH͜N] HO&=9k1گ<0ӹ9_eP(zڡiq"}քT7g8w`-Q+&f Sm5XkWH|,d÷1qѯ?I>^oJn(2yֽ?*~4fb6]qSXeKߢswϧ$E9|lj܎ùL+^s=5o<^OXt܉p *P8|{b$^N̉ifވɔw9(Iibp )F=ד8b23ŐѲ7sʳzZ4 @Yb@s1J }*F/=ewlBVK}7PN"R/gfj艈O;Ƣ(nӘlp:eǏ@hy~Ǯ.IP1RŮi5H_ʡ +1YaKƈT>zO 9iO&[ %4:p]^$@squ~!;q:%;h[U&Yy-pƳ%]n8ĺmS>,ga_&ܿ_{!}ƚ@lJѵs4;lgO~}χQ@,O쩭YGe.A:{K%bʯg]Ь:x9XN~O9wͭ=4'ӏ7ٗϋ0kIw1$϶WY2r?smOMMѫз(5_ד+?wJIϖw?yEfpMZ7e rO`&b,KHH' <4yӸi{?*}?M=W.ggsUws}_]$3{ɊLg4s?mGѸ{^}u/3-i[*CҼmnf^ݠ}IڶI/?LB&֭[[3,VN<qobl6L-N,lnKKPmǘ|i.(i}B] tKnFZ Ⱥ~-ƞ45'>O, 7i߼Ͼi1xeD^/;}ʚLsEDyqm: 'hSMX}3ժUV9+{:6m(tb-_mؤpsa9P=oiR<io /\/""WR6fLiUHHA7{) dg7KV(ˣ۴G"}\}RASl^{r BDDv6*QQQQQQQQ`````````QQQQQQQQQ`````````QQQQQQQQQ`````````QQQQQQQQQ`````````Q~9:9iˊH\T@p%eEDDDD@S.* 8S'mY)Д HS.@`r8::k+HL`r uUQ]Zӓ IDAT @w````````QV#Q\)óyE\6Xruܿ<]xi'?5Һ*wM<J h壮_V_6 `:՚+v8UދofM8:սUEDDDDD؄fnMՌJٯ!Yv:UT.W{e:@lްU}MM\DDDDDZ1@c#:x]<-xuy\͠."""""H_+Y?Qװr&)%xd %l2pg`dlM-C[c-X FJ>b ;Jw1:uF.,22Sڃʗ~c;)|zِـGNC?Vx/_h#d ,+"""""x5l n[ْ5xnXvkxK~Ta>̩Ǝ습Һ }WǶ=Ga;HʑLGjthO;=Y_oePZ$1'p).7ͦ?`FQh c^x <>*m J]DDDDDѾFw{#(i!]x1 D3xYfsQ\JP +nEMҝX s4sϾFϋyɷ|[2}>V-ȼ-'{FO;ƢX=U\DDDDD>W/C]ob?0:pq1b6ؾ42r+a sIؤ%`Y:0X6g%ˤ+9svwƊ#?s~nK,}EhZun>E0pSqX,k!;&F:XkoGgҮF|Vj9VCiZum@n>RqJʸװH.gOK?N6X[waO˸Ս^{kdϖrk|GP]*ڦsqW84{,.!##{ӶpGb)䊻ɍBpɖ'Is kJC&Wcظ̟47DɇЖ~gmTx 7 Gnv8E ,XDXDDDDD-eLf]5>PV!XHhzW[mbwGMaG0A6w|Oűu6=Cp0n%ݯْ.Ӂ2)H6:S^Φ7V! %s#Y͓5}&?T‘hԼc eӈAilXX 3jUwOCvu= ݛHILb:ocԜ^;qwNm9I5)uq%CnK!_ǻmb )6'< P2^:7f*ӷ\9[MMg0_e ^h M؟{[9 O.Fzz/0vg|ҭN jCGS]yϴԢ y)Ȏ]6rly\*j^6pw}o&I/??6K!; Zުޅlf 8^+s%f'ӚdQ.EZ88zycw mE[?Å_&kr{x=>m[ Ckl? e3nT](xj5)Ʊ-igG<|9r*S6EjtO˭(?Nobt 0R݄]96Z/q\Ƣ%kXy$:G]Ͽ' Ŋ%Y9aWWd0Q\|-AuqضL/ҡ%3{GfKyz"5S#nJ֭´hk V;2bif#"&&kfM&tLR&߶I |=aے}iߧ .䔵fGzn=0`2Qc P ^x• +lu[軖5i}c_XTƇ@`5Zd1Wh,D`񊣜38Q݄Ř].n]|`?PDDDDDf OIYQdkw9+׮x@vq\1͖s[ѽ5&o *<ߢ4gfOPFf|i;^.u`vdSץcUG8>2H3[HhV.ZAz:ܗ֜N] HO:{td]Oh C]XT`mY6&ؤ'g1_bGFv1@z:70 e_O;?=J!83#>E\moR 79g7/rl%_-azųo Zx$'VDDDDDqɹ\?[<$qH|+RnBd^`+Ny}oƽq[d\ع&7 w%O?xnFMc2ք3b\݈艋$kQA98yʛǼl :3pR.USLȺqA>%(^++I8<ÊޕRҘB9&LƬ)b.5.,U_ UQ&j?p==5VHɤr!{[٤'sbq^ʭZc8<=Wiѭ=ueS5Ϻ'""""KD&ʵJY"wHTqBv\Ɇ[ukՇܠXp8{H+@fPwFY䵣x9Q:ū/>býAKЪ׏dSwAάٞ!!ԭƎocW$)gb״MZ$/Pc ,~CxcDW*^[r`ܴ'ZX-[nkķF5r`ߘuj˻;A5X];< Er)it0d| 8.} 3=OBh# Ldo[cr3&}IZXٸ|ArP:b;5Ӥvy P"!dE8XSNhYF86D\˓rx0׺|ݿ%_cNɾ7V˭(.˘˳ЯEv$t6~Z^k`X́ߎssȬݒhM¬symӞWy{_=ZӾrd`BV if"yqz_uBߐq+ 5[ǖٚ 9bܢ oS)]7s9eV|1DuɌ:≓Y{=yVkHHݛ8|3OX v4sU@ʙ}̛8M)lmy,~3o7uҢ7e c$YVmZ^xg_}WpWkכמhBFo\EDQLHȫ )fK'X?'6eLVDDDDD֭[[3,VN:"3X,fʼnMwwtU$ٔ!tBPbA}(E@@^TPiRЛ^B 'dE߫99gݹΝewf;u@6R=CgM V^3%|v_Uϙ7u?_ĐHM/jW֘;DDDD:eaLl6+')ڵש]6 /-+WFo&6r#sWJƬ^{Ƴ)̹ޱ'""""RT(D0}s=ź_n!W=`C#w8 DDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDoajϊmM6 %BCgEDDDD䶦\t:iϊmM6 4;T26e-xxبT2@&!RT7,A4@w````````QVHRT7,E=g/gh>h܆%~-~R*_lOմ>"""""""9rGL[?~ʬ=LEW 3tHũRc 킝ș7γRF=-|Fr8goghס|_y pk=?k=Fed~Շdbc}N1 B^}VӛyyhyuiLD߮C^h@ ;%l;L_Z=Mnvt㝳xafmSqj-JÊ_eq J l 0]-8\qw ) ߵYToވPNЫw9>gqZ9:~UY=b,KL/`8'рs,2_!mt`}jZ]<{įeؐ/YTgz?,|F~]|-SaK2z[5ȈAOQz&}EvN-YT~CF>Y FLM"""""ݘWaĮ˄!4z5 ߶|>ؽŬӣ~#ZPaS8e' 8n?In_*qͶ|lWW -nNմ,ۗc8MA~LwaYId' dzs ٤#VJ,F`lODRjv /smwJL& ?t,.d=ԙ~l|oJ? C`⍧[ 6 5#tL<(|tg5H8,V͆^ٳv4>]2<[).jgaCZo psELT"""""?"l| Qv3Yϰ8u& +{\~pUnNl] NT>˹/^@f۾  n ZlAA1g&{͟vx 0H%16*YqN)Y )-APa;MUWDDDDDnjEr yU2.1K9ixSfI7s"s*1}G3x,er7Whg/s=S?H܆ s9^1w1ij)X 3McyLOzjr7 ܳ E`Ĺlv^ D{~C 8|Yb3pg|ǃH;/>;Ru6MhK zV.xnZJ.x3b B李Q-jdER5 k\i/6 x|Tܓ;c J}=~(}L܂h t+ěl?^~}jx`%$2u S@_)*?ՏGMcޠsb=z~0Wk8>ޔnԙ-Kla9L;CJvL:nSxd1j!"""""2M3٬X,I)MwuԮ]+[hN9DDDDDD""""""r;pQP?(((((((((%G?J_""""""q~d+v2L mt/E<"..o*բՓ]xfo9ܝu^zb1{3#X9Odb٧Y6=A܊p~w+b-Mj49Kͺ }Z"]tYcz ؞Y0KsO Gg, IDATo0aZDDDDn9Er)gӧn&& +;`Ώ1pv?O%pNa~aNexQn: w-/q*Ӄβi$tvAޯHywa?]:ts,צv(ۙ6pu;Űb|u<҂?OkͶ%+ōr۹)&3,P@sf3m ?3k^^v/q`ފXP|0.j>ց{0kە#jl(C"ע+o҉QLc6}DDDDD|, p+WRPWF):soEL\R @Hp: '9gbM\ÐNk.ԱXPM&1-呞nǒ]c:`p;i)DO)e/\X?-x8]vC2v1p,UUPω\ 60r?g*k;*`fc]R.f4/lÂb`M:ƨ$f̤ں9S0dQ`3a/ُ(~6 vW_[DDDD&Q$GnUyg+vSJ#K܌W$I ??6\1mM[Q) /`{^')7)OWfapxWOt5 "{pv&>MƉk<}>CaT#ZtvL:n?3R͇e rv<-ڶ`Ê/cfxVբ̥A:;4C<[=M7c>C:S[SY&rwp/ҭ}\6fbXpr' Ϯ]nxڵkҲreK,"""""" `'B(((((D\F9=+"""""J E=k'oi ((((((((,rXֹ<NdD-EwEʻ#mmܭ*O$f O:UDDDR7ΑQ}xe?=O9?2n6K'3jOb`1"ۧfIJyoCh_.ލk<[V Һ<:uQC/"""2ex\ѩ6x.'#^aa,fȡm( !EQ ǐ3U$|>s#ΔT(Ֆѩ&CWyIy'r Z4 v̶ӰxqJEq\s7ҍ_S7GiS)!ũ ^j Xέ.-iY) V?lB?_^}ZԠ޼+˰Z!g2z4ñd1j<WL{NX&]ꖤB?a:N#Q !ل-!Ƹ 㔬@{0O_wr\콴@To(?{UeoOUOv$TCof""""E:͟T*g |%_y%q?~Cye\ !r&7W^kx8RY>zn}Cg 7W2Z2i_?rI,e?Q3`Hxjdᵹnmhk`D-PoڪzMȨo0yb6<dw/t?'+wxY*-xC;]C}81itd+Cb<"?]B,{5Ӟ[ }o#<ÎGq(/4nHYu{uVl^ZLyaވ/ Gu7%e}<w~urmN𵜏d¢l:}AhWڇo]pw@r >EK/iFog'cR-⹖0nbE0fo`C ߂+j˔˓/`ϛ7Tkq+n&닯WfUwcx|>H ߞ63J>lYGwX:9>6=|(S笽Kҷc_0/=h5r"}7;"y{p] ?eWǯswEg}rU zsDg(El G:c`I'8-;eb/*^q>6WYF`Y1DʂBεS)wK ק,[ T}U[ܭB֯8Io g]1Y1B8w_>N1aZj-*v~9a{yLE^Y1n_,ik5޽v94iX8v"Fx%KmI͒^"""" EOY|܈Vh_O3ɆKId1!2ҔknJ5;vy^B߫_gzc7 Pwsε`a3o ӹ+=i]ǜ6wUFddF ߫/pwdy>#xm!A/-O˂xlo^TR@tt&>:ࢷIvEʩ\R0a摑ggzgY{ 6?njfT3 9Y[D.䬫[ 4~Ìԙ(V7xNo^A޾ Si6Cy( _o.FFKzيW{C=M=| 2Ⴋ\uݷA qy:EDDWoe1cDO c70<6r8`kڎ6Y9=I\0q|>AbbIIHLL"!]Xn5pepݲn!t_S9B0gΥ;_ l'2:j9d<OA7Gq)Ws9_mKnT=OW-Yx4,}o) _OTR kP2 *QJK}<.(]YG:i=(%^mj:k/,xc?~1P^Q0/ M6@Gܼcع|q4bToQ,4J{oL-p;t|uΌGaLm_qymc,;cm˹ <~> fi!6L|ly ,۔`(ϝjRӖŌp#M<܁39pyZ7vX]՛Qr?Td\q$=l$osBDѩ gyʌ{Nrį—2~x =*睞QhSڙ-xVYNB;hہ{>ôr' Q.r>W֭}5_|s1طzsۓջd{bwX~ ;\o1?ޝƳܯ*WHIuLVn7>u87 >{~3~ur4]q4'>CRc-,'ڌ]qƫܞ1kgROkާoq6N&dm]ñ䑣+!n+(߅ ѳx^o xbUPYu`1嶟b)ِ;3c]Fەa9L+wЁRÁn'##,l=!"""""r2M3٬X,jSR ~v׮]7NڵoxiY5""""""","""""" """"""" 7LogA<;g}Ƥ; $<Sklu]lrટQ{X1a 캨BDDDDDos>ŁoqM0cI0 v񗸄 % v5B}"cH4,x"H S9sD.K 'qNדZ4gBGisj WP8T >us@yju5-e(N$≵N[:)ƹœX\O؞y|1=Ms?0+* t]B(eq2+F<@U#VE2 |šjGixʕN\ [qoM\6}=X ;-Նgk?(/Y0j]$JXtVHT$G/jxS8q"R,/dï2V#7$Dt77ةv8W,סizaݤΩXdŨqBnfRpB'&p AREŨR6LlOlj*G}ϦDDD8\ņÙ@ 9VjEu?G9`x^J*Bwt +NS)-sp" )pD})`y%p+KAjtSQUJ$\zcD۝miPśD'f`!n[424jӈr$2 pٽs`hAMO(G))c &AɄ|S9lKT"܀ïU=38Eh^8¶ly89X;Jpj8īXH#9) ً$[}r\r&s BtFHUvLT5Dwذ=T)3,kPn'R3ȃm?XF>XcÅg̽ oMPR2rNЊn[͞l$ 3>B\ ?%p4ErXla%v ߂;W&aRש:f/ݱمr;syrdeϛ9k_)3arq:Wp8dddqm\'DDDDDDnrW沰i&6ł?? ]nxڵkҲreKͻ@("}l~sMp<9ﺲ#Qwpc@&}eCQ[@֬4`'v"׬`G>TQDDDDDXDСc% Z|p,$̒¡9p/'<nԙ~}SIf锟9I_)=ы*sx./mځ>kN#Զfi>C_ݻm9yV*ck z0L58bZ6ҭ7|0{vЪn@ ;%l;L_Z=Mn1ٟE{R(v9{|ϱ`h[LHܗg+笃LDDDkE8.'6^'+] "'W{Ȋ؁mz )j<իK9d&3`_>cєyDa; -NޫOUu |=KZ 5Nuxv ޮ#yY=xDz- =:_M ٶ Q^WDDDV`"ČŋWuDE#ɭ2=OY[m:UϺzv;9BL\j>6o{w s\4e#|ٻGrT6FlYc?oYg6mz;míab'>kAAy^;DL6q/6܊5$zάbk;՞NVjvNp`D v.6îTwJ?ԓ>5<Ӓpm ϯǀVA8W3v*Gpg KmΩւOUu0FDD09~CJvL:nMbzgF0r#,2f5,"""R\6fbXpr'k׮^v7\RjVvYǠ ~EDDD`+Y8s nѝ ͯDDDDEv[>jƒ_+"""R."""""","""""","""""",""""""rsMD[Y4o>O!++C""""rQtI:<ԙ !`"`˦ hReeep!}4-6CEE DDDDDEsgϪDDDDDELu3((((((N0w""O )\"Ryβ>6rd:EDDDDEɵEocOYu4Z6+n3DDDDDXD&+e'\R!""""rhۈݭ!ov}>I""""" F\r,5hC_u(HcûqvNc#(Hf%0= u(Hl+CDDDDE:YXۼ'Zuy m9(zveEVUvΜ:BDDDDn-"4gx^Eo|m+DDDDXDnI1<Nϊ17-'r#:ŷh"W?w:4_O~7s39ejK`)c?YW<;Bl!\>Ǽ 3s&+U5^PV.dŀ8]8g_ȑP4uo΀3GʹmyehY{_m^w"==O )Yږʩۘ=g%QUy?1eB \)ު#Vp:7.`oY]{3ҪT>{-籖 }pcam~<&/3`%{:y';ˆsO1pȿI#"rcoGٸh`z*X2#>=ӳ|a@7w |9IKΒ! ?G;k3d5N[8ߨ;K&g2D9=e0gf`Zn̢TYIn"X׮3Ǖ ϡr0+^źOҾA~̭7w9q }y|a;lX~ OckŨHmJ%lasIsʖᴼKCusƩ330|{%,sަ/QʌcŔi,:O~|.Md᪇79ׂNJ8O߶3-=n{ilslZx?<2JקV-#ZM KNϴӰ7oa;#Y{3__8DDDDXDnQၗ̩8 ˆPwbE?0Hr)˼q_-*x]~zD딶{0M}.F.\v8@)O y姉KӸn1vs; ƽW~L1QW{:zǴ_1|=ÌoD/X4 NKEΤz#QہafX)Cq!= vѧ|5H+5\MMAGPN_JtV|n]j Rf(i9KWQ+vsY@zR9RB0lJ^ŀSjwyU\:[k"7~n?i4$$ig'SX(N3@П;B:JRA'ǞK PjBYrύh'M &i/""HezXqX!~vܙ$%ƫCEag4ǽ=pd_ OTq9Wٺլ=-27q%4:'*5i9`в{rrn*VZ|9!vY.ؠzNPQЦX&s{V˹|ss*5ȡ-ٟ-J-ӚC$լθG\ e*$5w4 L#^yu?NƲ-\,S #weI-ym !ԫuglEN-]CF@(&}{l^Υڪ4-Ƴ7r+7bs4~ػ(M@ `5{((REDEG)_Q ""ޛt@ BBzMv~$#ܯȖ3v9sY C%nyf֠ mͽEHVVN?Ml;ɀV-p4=hmED[N78xQNR4 iΎ3[.>~%m+St_ZF?Yl+J<6apܩU|>#yg[H D~xz7(SP;{k9q,l%.=v]Z9`Ɏҿv>c%ѕ8~xM]1ǎ=Q'cFfX \V|37i0.OW6cЪn?0~7lMrwrwrcA s0Y6-f#]އH:\~l6b Ac%>DD"Ai bOOr2cnfKn,jўGEmqtҰ)*ezwKֹa6qpT32G8p /~ME4/jhzEDDDD¯wS``ױ97f̢%l\% >DDDD"<L|;+XLّPCW+2H"_{kvVaDDDͻ>#t" 2?-6CE2S-D.1y ,xkv%1 QH,P= `xC_̆#e`[2( }ȿE^2ۿY>,x7navDȲSD[:_.rzNGVv{叮獅w {ȹ0h.jyq`\bSiFӆX9b-Ǥf\q{' $MXx$ ˅ ~)b$2:|{3k[y`K{䎺0Ee1LC~[`_0B\Љ*a6by) >&BhΨD4ՊtxupEkr֭"{w]y:=!ԛ¸hvMŷM]E8#;S_1gk("""/Džl ?/ 5SXiW'g[!ĖBt||b0m8z&` .F:Kw/ogҭ̰?a;Fh G\⏲jF.ޟwT} PRơ`K`Xis~8M;/"EŖ X#+ND("""c89I`Di>U| RpyH&uHH9_\ %^yIiT8rv8NTUVΝJGl#>5XD (hqnT,yI;ts8xd)ExzSig4Z],"""h}g<˙)ώS!v'n 7:D N8?[?PLtVaHbwB>' Sr|,050{դs.VBW*.m;7pb.>sh^Qr'0(~/ueSBZxpx~cdi~=ևpw߿]_dN}?e:Q(&hN2 X&bl|x7gpɹ&oJ{8j/ǽ8@l6(!: }ou.^7[Z!8$b!9|c̣չw&Ώt-i!tp)s3tr&'[M^;-9u~c޶vhv|TvrȕwAjNԼ6ɶ>wsfw<23Vƞ}vL@z86'Eq\]LJ | =՗:5*""","A%)ҟdg0[2gнLB\uogn pm|_GÒźTp\ t Ӭd]qmіAVQz[0mqw+5#x fً;glgP6 _<|./?R&8(xAA=) )㐝s؝Vekzv+iIF`KoFӫTDDDDXDhժ\ -Eǂ&OM;#Nyp8+>X ؙÊ~>8$\RA^?>9x)9%R"s9no[oi~CFIVOkx NՌweO&3gr3e ]hPy=[ Əsyw^.ły-:|o4Daۂavlv; ~5mI<6%.-#1~JNld[f##)m7rIOC/bνlx m~_}^"""" "3a.طx;.=;k1: IDATx}¥JF jǏgxXzn lLr&3Ϊ ,Yy$^s {y67F,;U>M'F=C=x48 N`F:w&J:Rªxg5/ |N[3Y^5p0l5;ODDDD9Hn{:Qvl699 A3x챹}m]U]oeq\0883238p@@DD۪XDDDDDDn """"""rK,"rM;xg*,"""""" """"""" """"""" """""""[4 M~b 9O^^ """"r ruurH%}͚ `;2q'~EDDDnayy9bIڱSQ,YHEFT%?"~#*rsUoD``QQQQQ{ƵK-}^Ǡa{ ٸ9DDDDELl\3{=fkXm x{%o\KF>c/_Ƶ߱yo2zgZL䉆zU˷N?mm1d6g )ȧGӯ#W]xy]] """77'@D~aF>yn+LхX~>~Hӑ#yC6g;_+ΥGX3_9WFkQ: ~aF܎l zȾcj,{äE2~L^˖=E{y2t,0s1L~uG~fѧu'Ygwl*G'0chvYf?jլKA*'a;<㙱%&2Մ3Дε\a|!o:tiz#MKETNa=5 l_ *1h,z5+z; w\E_Ə$yrU+}ih:ޞ>H`O9,:GA<7~(+XIOJ+ˍrBhFfIf7l-ݳ3u~#`,}?~?4"qvBlNƻH^(!NIn?={(cӱ_3W+3BgB!ΡYU@nNtt7?`[a #C8杇ZÊ[Rg#?n* =ZQ>ONd(΀CA ߛ¼ܔ `Lr=LdPԛŏןpM{yo| 3-kQHfSx'ʉ3X-שA#?dmQTB|z{Ȟm[p& ҹgE'FρtbqADDDE`r)\uRO&p6dTR6I[v6l1x T4^td ~gtD*K$^ h;l#-o@tJ&l;\KZ7;fOܾ\Slz]~/.};+lV ~&ƱȲ} """ "r 0rIɶ?ժ:= "DT+a=zKT,C6𫹚s(}WQZezx3ulb)M.%T޷9Stde^TpHs"}Gxg]xyrlfɆZnOдr'춊#SzLg/c-ag>g̼(a=}m u+ӥْUٔ H!}($alٹCӱM/ɛju ;bnK$u~$]aӶDGBbԯF1`@rv+O ^_Ď$;~a5h쏽f!w&C;=$9QiF k+ƛY MHU<1rGnxZsI\rE`Hɮ\ 6/ިdaM`3xiDTݑts$DqB˞./LmeO٘KbHgs6>LuKłGI`c#xr@k|4Io`E\>c 뇃ȲIo1Pb>Eұe.;ŠfopE nPS\ Y.8g%ώȪ(m[yS>f}]o"##BAXNFWj۱lwZ'DwQlo‡QbJ"""".Kwŭsqwwl6fdfp2?'<<楷U h͹9I6Ѧi9Hî"GDDD_D.6?uF+2T`ô0F?¼h\"K9z[&ŸƵK-}^q@I31t4i?NG^""","; k&s_C|RVl]LNu<)T0^ ;sugJmB`r !Lī(jFWݑ:^=y=_eM8qRל/chnCd{dy95ȳw-g\ /;@G-x~}ja"'|wNQP9ύJil;{|Sr{Rpٍ`KaL]d:>>in'tYCْdǵQ+9 iEʎμ嚂hV)_l'֫.wͰ?ҶaE#uկx7fARq=mUA؝|sr0Pp7 E ѷlM.£ """<H][RH`+2T^}vS}ZU9g s^iܚ9VmKb MzMsf.BJZYCPsus<2h1<\RbX1s9_`|B*ls Ra?Uv_iމ p(Ha{Sw8q{Y.5\ݠaWsl=dpN#oY.dviAe#?c"2R|Yxccʤ?Wl=9f7,ߩ:*Ǒ%Gˢ;f#[<%_wCP.ڻBNtqI<8SwְMd:faWh{Q7׮֙W }xOxvJ.xu t؆)ޒ9KפN0]r0٘q [̔Pe+I' X""" "?䆿 R-:YaLJʆޔܳe24h ]qGy~ F.69~95T.˓P xqj>0<ʆ}@IONjr&L\ '}g~ut^;Jzِ0+f{./%tG_&<\N2 Ú/Æ8``㽟y>(%SN 덯/[b#Uқ.y{ymkJ s\6T.G?7?d=Q\ROpE5l|t3JXE!* +jobv@ҒwԢ82ːL92}Ɠtuz2`tpvv/`71Z+ d'^+6ٌRo(-1Je8s=f om7ή.R}$r+SݯR2@<1OpyO'/qWj\X3&_;¨o/<ϿDDDDXDa&rٳ~M1P33f^Kv0ƾ6 l*̹Y` >DeĎئrwpMpO1Y7^h%ʍ`o?.Űi[=/`?½q SJ5_4lcu>C[ܡ3M#is49TBp $5)7!w[OxroA5 V{~ɽ=FY GJh iP<=~dz܈nha@ZFFk?qp|-G>˛{m?L\WҞ\Es(%|}Wϵ^VʥixJ qd}C_|4wu"[ ?^&gҌrN#H܉TK+Q#w $gbƿ WƑ WDylKV龴!F 6g^],Xy>6'0"i.dbjac G%h_CF@r%I߰5ɅwݭCȍ;eUL 7z㛖V_w^X"mӫRG~+oh {6e*Vdpd%M?F?;gV!gbf9DDDd4 '39uo_nfKn,jўGE ٣hy*ZSk.P s V^=\9܏9)-9L;e#Sģyi*|t_,nfO5#39DD4/jh@\»7Q~2gy>]_"gS}F(Xa{3V$""rSS)Q\^OsA6qK>C*ʿmj>}4nE'Y鲫.$""" ""75KV&ݾI86>:Ļ^rV{|>Oh,MU彵KYt[t ," scU$/c9pBZxjC#oq$?_(ó̈́OZ',*t nO.?cUB> hTVM7R9|s,H-j7j !'~S"7B啞 3qv7L~w5хZ<0׮F%)yQ5u Hxyyg` Td gX*x$p˙ ـէ> g@ 7g DWX-O<0=yRp _'̟r{4IVz{;} q{?QK<=/!e%sr^֕ǖ=Mg#c&8:3s8d:2t߈:,"BfU0M{9PMթnc θ句a)(lav'ف\eֈ&a8_Hs/nO^dķ_d-#ɦ6})4jf4Na^X8:S#̓ OY!0_~\Gp:ZAnv]%|cDeqr?g|ȼcyT{fv)~`;N01K,ʷcoЛGM5I{l>UhcY$d߰5$ߌEv +ŽC0zu1$u{}Z,ÿ_pr<#}d..Ԏafh`uB]|mun̸mV$[0%w|67]Mcټke2غ6yS~4S "M]gR(8G`t%rd\ Bj=9ڔ F2kLdB|}^#ZS㋓nR#xՄʗjէ?i89֦=9lHOAyD |2kc)UDS勓-q[;wyM\ +&Cn/yrz6mču W8[9c&GkfAŗ-tv! S `29dS1=mL=;eXDJV-?ޗyv6-~5oc΂H mCMusxp_8.aoAA<7~(+XIOJ+n5iS'}e5DJ: }yFtOS!-*tV%;G,KSX6 .Y8WFg~‡aɼ?U?ufs+ <+HR6c_9Nϧ2qӌNWDKS*z'W ?qkכ9s^g[i5pMJ8N$ S9|wfN$$!0N5[c!A*Ҡ/N`E>6ٝ IDATO@~@3V _(=pYj& &rx yeMF#jJ粩zGj%&;asB9V~*p61W ^Ƶ_' rS5(=cıǸ *FL,B[1q^DDDXDJ~^v~sSr8ֿs2qނBna,IlU9M;D9Z~m}4Xvlٵb adf\sz'L` SwְMd:faWh{Q7{Y}̅CU)CW8;У#&1|>cui/dq[צ+fSeZ^ j򒒠e5;rTtvΝͷ i-"ؑ}9)CLf߽-nx[%.Gr1L8MP`íY/d9ł0{6. {>W=XG[܊is]wvmX,xIrC3x|Cq@Jق3g fl:A`a6r MN.dn_t.ER\5hщqg7sn tG08w-*~ݥcONsǗ+򸭍>DDDEL޸I)X$Civk:Yo|}q* AWQOLbK8Zx~HжĽl}l41w0t,Ez"C*%̋W9bK6tCYơMðM + JNjr&L\ nJz.$iǴm,T LR`3L縣 &=dc3/r]sjr 6u| Lo, 89r8ۗrY)\r=5k3xe89rD.s 䎇YӅ> xL98HDQe[i""" "rN>S<ّ/-Zj1bhOy_`3YHOpw/71; i;wע8Jb-<)J)9`&j0gιeyV<La48cHaPaX/2n kLlּo̾~ibк\ßhS ңY}t_Fż~[ɆxX#ɑdX3pM7#CӡL{;{U3* /AM?Uut 8@rg Zol81Si^lG[ vJT /@\Z 7SrC'9yPӇJ4' "!T2Ef3wױ)37r8֫N9ѿ:AZ!tiȂ_3|]4Q6}NK21_KFSǩӃ  bXrnOjpq7KviN#RVn`( NIF4uN޴"/pa78îE=|[&؛ Nnqcٶ'px;bdT9i2ȯ؄':{ɹrƣԾpұD-aɱg9Vch&8T6ټV #,daO|he`ϊݤ`(>xJKUrMhڤ?\{ Gr͜#+~F1޼M]d ϳ_4_,sK.Ms5q\ui QٕP!lDZnCqRi4 Tp@N ]nQz@NMN::ZO-݈ۇ&N&\Ҷ2elL}1j`$9j28G8Ѡswn|0+Nl?U1E4xz*LoZ#5*؇WrƌlkYg5]s8Gw;sg6;s8k//=Cf^IDx !gF ldddy3+[[u$D;+^dئ$NAMe.pO,_yS.+gbSMIMرcw\&88u_̯FED7XVYRq{t}CDDDkEDna#y ZVO(ٻAfb y_?2MM,xKc`"`MMl\>"""" "ύvxiHo:y☓=9YXӿ?C=̟?~l?d^8Flg#U뿊V-"8S tL`Qp5NndTjͫ$4nTbnÒD?ٌTS +`H%28$i5-K'嬈)JxW MSlB'V_:>iSӦsV4 ;.\_ڎc8oOe񉔟-0|5vO$}m]obٕB@0=ߓc% 5LX}n4[NӯCUjg_@*='Igز>ҁ]zK٤*iP:~#W1 `]d|NҁKPK_^ گaLM:雈r3|.?%FOjЩjq+VGGn\KM7Փkl04qƫz%-Yp6l7(r''{Anp {z[#)7%8uS rR&IVڏ@VSst ( UF;HtS*CR/SzsRMzNc5#Yq80l=j`ip8{x[}4r]Kɑ,/aRRsī'pz[l=B-hg_{dvOQ0n܊峈;gCа7d'+it9mIher;M~ ltFӘEDDDE䯐y)]hQs҉۷룀 xAl-W&,[_JBivDN;48;Ӡ3%SlIb~|Q?u?OCf^IDx!gF ldddy3+[[u$D;DDDD'^uW)3qqqb`g/,Z8[رcw\&88u_̯A`Qƴ8STIܝ uȟ+>߰/պϲ|жݑԏEVX6-fˆOo+胼a5[~f1 BDDD ]g:]NH~>b=:6e~[,""" "fL \t}|Ia>RV6ScmvFG9.+ߞ#(^ߙ&K`5_-dI3#Ezw^~m3̩?v.+#k՗ƃ0qE-6|[׫AXtnbKT{3v)[Uoc^ߟTbrO渜W R ?EH+WCi\ƛ\6\+)OW]4Wy=a-kgHo鋛BeLSYdh{ ɭ,˯BeqOOb/[""""?GsDL"b.A o:X(Z<K:b+珏%ذx.;#펽,eq\(Q6J≟7 eK{@T$ ũPY5ɍ,Y{Jyv}~iS1~vR8wHI*m3ϱ,UprLCyi2QմGWѼUlI4yn1֯`[:ͼzf٬,?3,"""r{"__Z4 ΧͶRɉax<4oT8NAٓD\,a7%`~W6 FLiGNDIfPwf nLI䒰^Ϸe 39|%_f*gvl<~ nOfgL^/Af|`Nk?+{ҵ7p4cnۦa^MlM [#ϱ +{4=g.sgѢ-|*q]룱kȳKrVI xCypD ӚӪ=y섨$>~;B6cd[x6mDg'=g+*ԥCeV։S3o፾K}Ws_2eTO&P}Qv_?I7߷jFYQߩB QjX@3,J/j"Hra'(CS ;.\̥)KNz>U#jrVԵ8CW_ {~u+Rzc٠$d\ҽ8@^X{ౙI.]Z`Հͺ1BK4pCPM\o:&[F1RWֻ %;Bt`=OacOfqDmy<37<'X]o]*B-?V)P-{`q<A1\=J͖@R7ۥ GpaVZS/FD% #۲h٤>f a1У휟I^j\ Z]uK;2_dXXՂӵ#wܒbz9UёѤҽM;3+&xU=4-<%# (gtV| o*safnBAfOD .7npJbVROkرe9I4elzq:mяAD}Wkןt:N]6.YkN]ܖ{ț皺 !XDd~сj$̾2 *B8H!BN|C<+Gd޵es'R +f߶Mki&3 bqS8Eh۱ otyӨ5I\ߊyGT r={2L|ljEP⎚rpofAtS_@j=0/uJG#"]ATfʥv6/@?.`FKкgB /G5AaBx @s8I#K#2Ų})zlY,gRHda6Sعl=Bg\Dž/oQu]z !93 i)q'g|y1iwOfjN<96̐=Eܜwyaץc%,Cu\V{T91+Q, vݩzfǥa҅Q?AÕ,1Nǐf^QDAWcxlI*m Hu Lx%d͟ɴm'b]փӧI絈Os'pRῸ}1Redm[KOa83t"^[}a +v3 a/deBX8א1LU dW08VV ץȾO6m)i`gƳsC45 1.~8Vpޝ JıjW6})""""""?qO[M;]#zR$9Vf`:Tp K vf0%F1|9бHgt*Wx_`'lؼ:P=@kP򉾴C6v I.6Ϟ$¯Σ)""""""L'ն,\uV]y H&=݆% {ug!`(GS_{-W>'c@Zzj^֩ p8f$KMρ3ŭRHK7?Vʥ0Z]\p4.?i-XK ߎ/2 NlUNF rdX-݊2OND3q;9mY!_3-cꎖ, (|Url2v9WH4.{E $)9|K1<]_T&sfrZ:+T9e1""""""_i}&N;ɢ%ƙMS<7[HwSfW!jtsswkOQ,Wê{3{aYC'.{yҏ}6p(*L"KW%=DMw'NW5id/z<ü'0Bo0%ۿ>FA^X#0xb̊t@EDD/F|6ۂNW)XT&`_u CCk_+)OF2fP(?DiEsݵFqSPOo4jp*UkqZL^yզRx?r ~>E9{I4ܨ8p,W 0c0YاcG@(Y&xӪ"NHX? :q[˞stOQ6/򄿓0+Щs >_V/dB>Ō?WR &I͜IU{bLJ8?cʂÃЧ'9_%tSKNP!61<8&&N:&>Wϼ]xOfO6Õ,1Nǐf^QDq6[r:&<_W*~pc+I ޚLi#D{ċ=9h1q"*GL]JPcQфno9V.D=QƸdvE<ӧkMvH*͚Y&w3]1$##[NX]P%.A+qx c8P“?mx3>~!Z)u[0ϰā*~gh'̑K썫 yT) 7}lؼ:P=@k+D_u!u_O;JxB9밋 Xп>E\U'EqR 䑴b KPӪ,I1߯4ikӐ6FsE"|, p mUqXGtL$.cWk_= Ets6&tvn rei{6,Xث; ÖG8"܋m>Ƹ׻PR:&E(^RLaBvҮ!xfdvIJ\ŭRHK7?Vʥ^ &ꈋ-5qLI6Rm7F1oi9 \uQj,VQ:0ҳ#hң(\JV+V5 ^$2 sbn?o,Pߢ,""wQc_n|ͅC=5zg|d ma9Q}?=9\3[rMD8^VJjl)6J5axJ8%` w Ρ57hԵ%>&86wu$f\6TmWe] -A3 tb!40mM}[)DžsP1)6KPz#ܛ&7)3qqqb`gO*NIMe֭*XD\k|UWQ`;B7pPoyT """"<````````QQQpw*\VN/M````````sPK*I!kh3jf}sn՞u@o9kĥE՞ӾNHX?)_\,fp#bc """ ÌcàLNk FbF;LOͿƅ^UG9$g H߶%dPTpǫ~o5tfäˑUhޓ ^?G703FDDDDruNnAĭJqs$\%M0xWw܍2_5KZg j -_]o3O_ztàGIFxLEU6wc//xF1?gy3s CQk&Ą'qdT-R,ۤ 3|+`αcbkQ&ύYXӞOODyG+|L9p..d$F I&..TBAF_DDDDD:1gc+G5{I 33>X3G.Me)'B6mΎiGtj ]1…|* 1iM{3YY2)aȵ;ŕjW8>td]]ұZ>1lwA?CjҞu+$&" ~P:M*jљegGαCtA*E40l?Bve\(N_qǿ ϙxGj4q}b8\#ʰD&$dX _SQ5bC~,V"[P[?`)xpQ ]IH͗AKqR wg[\MLΥ8tΈ_pׅ<ȭЌX&ssÎ$R9Fe 1 |,d5KT^jz8DE_~7\ w%ё$RSک'Xu#p#Q6FkQ`Q2wՅh;ys5q 9EKmDI_U(KP'O\cfǣX_gFq.@Zkac["bD Vrso W"}4i =KNJ3 5 +E;/Drha ƒؠ3A l['7/Sbzkt,Q{S=8CY$&&]N6Ҹ=v1eA"k13мcPCcƔ}Q$]M tBVԤgSO1""""򗲄#ʣN ˵ʍ91?2t!KﲪVֿ| Nzx;/AA~9";y9?khʳ o\M-4cPHN'|%yU9pV&p#FA]̛ⲱ9>|hFy<~Q-Enf)Qt6٩ D t+OӲBf+\?b$u!|kyA|$Y&:Ǩé],f; g悉3~C~Mz+ֱ9Ǝl 2;Q%cZnŽY^Y c,øI 3 iVgد>G۳qQl9g9CH&Z?_; '4+G)r>y3+S\oW䔾.@idQƿD7Yq_~]9fN'gu>V>j->=^^ p%NdXh >NI|7=]H0o{L4FDDD h2{ЩYF7kS_NeC\UKǩlr]מ|/5}j,QdS x!\,w?vnnˮ{5qRHF*>bbV8\`,V)G;͎lLnV+dpս\ p Ƶ"ssB*p48yV/A|!ysSMw*˿ʈwpLDDDDD#"~ȉ$0`ř)倫e 0l$TYbdp%-6-080s/_&?O?Հn؁Ε60L&ebwx-T (#DŤ^zv~<X ۍR#~q?qƯ$>tZCI<]G3{{"x@9NGdGA~9 qud[!zGh׹ n+DDDDDXD _}s&d4k q[7^5ixo y"|Ο'ڴxXu2~O!jQAyDo\v"QE}vGa*G;=LJXΕϒ`K9W^&.r3:LHf*xX!7c~2rYpVsQ;*޵Fץ?|Ҫ@~ϤRZߥs!=<&XQzc\]*W„:δT6o~E{KBxMC|M7`(¡xR^[Z/_eJM(װo90u>#*(s[}tB %w]&6$߀#]伮7Svo|/vcު)Ws :贩]VoҔoD_OJP*j6%4|Ebh*ͪu&UY x/w>W,n?qڦ ە]Vܞq%]΄йEYkKTѪ?o< K:;^XW{v۵&Tשg9-UH]_XE$gGn˰l{Ne<* xujPhrEv-"36+Z$*1:QD\c=@4[=. >*Ngjt7LIĸwX&X =Ҡ+8۠ ?0,ikvsc ^guT-@a@ 0`IIj`;j`vTUQX+v~>9ۓ)QnOVөT* @ @t+,*RaQk;wާǎYČB/!x! K|&@0caP$T`j4r?B3?ĄXoI*.q>Mf`::wK$.IQffU..Itk6M;,i477v/BIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/security/image04.png000066400000000000000000002450011461403617600240210ustar00rootroot00000000000000PNG  IHDR!sBIT|dtEXtSoftwareShutterc IDATxy|T[2 e - nQUQ+hݷkj^QV\UQ₀֝M 5 L6rfGHx?93ss2|{L42qT<GDDDDDDb+M7;;D2EyY9xL-%""""""Z4ňH$ {=͠GqzJKKI$j), &=0{="6oެl&L2?̑H-?lT-#""""""d2= q {dRCEDDDDDDEDDDDDDξftaXZ4ZdIRA"aDjiii\n>d2aNLB!FDDDDN Vǹn""""" OVU' XV<BDDDDۭ͆_褕( NK& \vZ-j5nbQ(KuJDDDDlNϯHd6""""Ң?McwҸ[yGm^֮{ASTEDDDDDdtmqرc㤧5 8g-֩m̩T8 R]]E48N23pu޶wԣS0h@ *SoSgР֭[ˣStl20 MF*l|AO3k/~N4eu-i_""""a@ǟ{uwj x"~_C 6m[dmʈF# vM3edF7bg7S׿7ϝbym6H .D"d]wM1gp8TTT|J{n:7~PojWmr_ .~Gb5}A~̴(++?SO9{ֹum} V#n @=>o.0 :JMffee[}l.dtk֮]C5/+߶[m1l62228Ѽ{Mٓ7mb)f Cu:G <TTӫW/rrr{ˬX?MfذsH""""i<7TWd" RQI&^y}F";Tyy={vۼ@ V1gpݵWC0d7y|)UW^A>̜?B ‹3u/%̜or饗Z >S|us:O3}o 0_|n-/_j;9t2zM t+&5dWDžOnn.qbW\q9z2={j3s_ŋpE4{nƎìY'W' 4&[ ԐJ%fferFnHA8d2J%T+LM' xp~?߲_~^߽̚o`B&++m[E7l^~Uٓ_|#?X8&Lp8:ܞ[8X|N5gs8zIYYz!Ma?'˯vN^+nf^1O? án۲Υ^MǦaF~uyߣs㩨` SUYŔ)bرc;v ofhrMpgC HT L^^ 9i<-=eK7ylX;֯UVca#xWbǟWk}ʪ7v;|\^p}0w\7Ol6v@ K^]]/+ڜ:?sGu$o:r>t0nP(1G+bl'µ\ūmZppUWcڜXk{?8/6駟}OCx7&7o41H;𶷎vm5;Uko6|vQVVnd2l&HPV>"w5>`s4|"ԾZus-Z”)y+-ñ__%;;ʪ?_ʕ_rwq+g;3ƌb{qq9k왼s<|^%Dzoc99s^g̘9a,]Slx]S>}HOO磥Z-w0N[nv;yy /{>66ѣS4孟nAr:M~jY?mʈM&r:]F(omX~~>S~~106 ȓƅ/iO1sKŦM/7~nyX `"< +XC.Z̕W\baĈ_rϽFHOO%<wC{-Ģ=+Vlddxw>@ fۗ_C}Oc N^uD}jt׷Zղ}.{30m.ioWnOm/pُ lƛp(vƏ?@yy9M| >_/_O9 \<*֮?ixx\ub1>sV+}a̗ڼ3fĹY& R8jÇ?//Q'~>j """""R}&᯻d"4 i^n܎*)=ǕW\Θ1J /o>q֯;&0'g\?x9 0~TWWsvk6 ΍7^GVV@uIMϙ:Gu$oNC}|mn'Sl2qIOOo0 d!mYg3R]Sg ]]뮻뮻o- 濱_6Uc{k,tgDuܞ n%6PQQ0z{P6COjǹn-:gukN@+ggZr@՛kMp8.١FdHKOcDXZG? """"]\[v[)((1onl2 U[[hٻvh`@~٬V;,""""lb"ݘ&`}y9@NbpL&.K-&ҍwXDDDDA o6!DDDDD%6 ˭nl6 f,{RKG222quRKDDDD,;je6ZX,N&L&<4HD"a$I588'ZE@HKph?5YZAXDDDDDDEDDDDDDljŢ d"I2$dG""""1&ٌbfb;m-f3ŊlқIdD a$HRR$  H&j 2TD"I"XP(bt:wS@KxH%S<8`x_BDDDDT*EMM5ތ vG^#H`[y9ht."."^Nӛ>}z3zh|>3gbY ]AnϞTWaںha$}jg}> K&]&ru4~wzkx⩩hm]n}͵Ѱgrn աR)|uҘL&0D w9 .(h0w.D̦Ixgiii\~X+.~-7]9D:4{x0y d<Km8kTvco.uV>Hwtg1nNF8lhEMee%\rQ=?4yssmI̛;캃 䒋kk/s}6:q?.FeEnwםx{&^6axzm^;,O,x^P0he]|3fmRח^޳?2|mm#JH&͝S8qBnnm\ { ,Y!5u_ b5_CZ- ƭ̺u5![JKn:p'%pLz)KdO4'QF7yGa׹ۃ`CpS7'9L#[Iښ,L՜E^?gRJK6RGi|:g6~]9wpJJJ())w;ykL&Szg5 ϛkR8z~v&߽cޝ=.;;ͮ3;8ûl{EIOOg„[]wҤ3.h!\e/aAi[e᏿omS yyl\42ce,l|CY ?#\LGKg/`#|6/t~y}ǿ5씯g؞Ou`(F/6V}{! 9刃vA4Oʪ3nL+~ E5'rL^x1*[qX䍼[FX5Yco+.}kk:מM^>%-|D;n9 H,5 . 1b<,W\q9_0JJ sXbu`Als _G߾}lٲ?xvRk˯{kx췿F'ijsMWvD"BFtb5;}csa ,Zxa;buhbF:?2_>_s>sciO灓y?fdt^$`ȯ~Mz55ޡLo:O#s>}z~{^d3`̖ڱ*V뇣(ze(_Me#c{7==PןrVzYx.%QrLX&K^;3ϱ%j;,'Je ;ӇRM-bQ!C^_tpQ>w˷i箽>lklIqdHV76fmR @r% ʣz|$ǟ2|_fd5?9C(]_Wa kj 6nrƷ>Ǐ5E,[6e /?YɅ唼` \g?Xf;,22Ӈ5CYmpǘ#'n&eʕuo]Rc=ζVL~ b!=1:hP˓Lyg=cfKi)gN'.NuRʗ]6~?i'~Fff&EE,{≧b*N:DIچ9q¯?0g裥].z8p@CmK͙1c/ΘY}5\.g=KCS&3Og믶\w]OM7ׇ>X%ۯÞݕ8…;_[?y v:F:c cz˸3o}`KGXLe빝|8/t%?]Rb./x{hF8VX%#g YZԨS5kX7< >#L,֫E=7MzhCDu8+jO~P,v6Ty|Hn6./kqٰJGs˘CYfZ]n 7RZ ye= IDATIV`aP4mo# ȷndC ,QÀv@6H)+u}1׮q=swUjnm:Զъl( BICs|x=j[{Ӽ -kl?F)YD(ܶG2YֆΩ޽kϗh-_Y;r+z6m⣥/EW_nsn_ࡇi<-7c,Z޽s,Y!Vo-3găB4kW-`u5X c/P{'غu! 祏ۍF鏷 ]~i!?PJxw2t2#/Rc6E ,X}ٸ[)fAF?`Ú=t]vnf5(.maz"\ŪFWBi`$r Zf&uڼU8K__|Mhxϲ3-Jj._ΠAvm˷QSSA=ko9`@icJZZN>Z?8NzzY hwRS$c힜KMj..^!ul6jX.~ ߿v[wwԛlI&mZwݺu 4ͯ=h@֭[{],w G=8^m'P7 UuֹWre7[&rWayl}Yg+ 䄑 XAr񸀺NdǍ(@gysWi Pk4AGTxayp?0V͛[!W Wr ي~\rPctd%ɪBN;h8cO@%/$s۾_Iv\ -Komζ5&Iupl,>z@Թˁ8iִgrsq#5륆^ň#X_ nٲt^3f2sLFSO<ſB͝y8h>MQhabX[=V7-Ѭݎat矟u,Ё@;nT硇'7oWNڡn^u<8:νE^p1F@6\;/QNhvm5k(Ig/7#YnyN/ԟe_ɊSh~;i(@s.9WxѨ箆{sɲhtʭD-n2@U)q/y}Fn<l vr o`?<VNe2p_4|ҢTUAe9d}Zx~2JYgg,y~C^zk*,yExO4b.3^xkr|I/iQ*++ R\q/a'ESVZI>$VYm;;4V,O/6 Gڶ|lX:‡$wLySO-6m*!7;S 1M>[WL$aÆG22]S[UtN>=2VMtOW{իV8i0NZ-m܍Y^Vf<fԶO90,F3W2>c }9y6yKyx pR,_2i\xSOtv]V4,šۈf!|}D_({=7/&+G/VEYWmdk0?h*?وϚx|) ɍ|GĈ J 79<sSMa"V|;)(.A?#q!eG 0Xƞ0ѶXe`I[WLYcP-ȣJ2 zR^C n[6SYr#j9nXWP\w@_4> ;cc%QlbagZ_Q2B0bߡ_AimC Plf_fڦ]hRv Xgc"l:O8D=4k}Z"rgӦW7G-eӦ۱m i"j .jݭWhAX`A;\\…vK{b1N}&FO> F O>~+>UVs≅:k!CM"W2*++o8IK_~ɘ3NO>#`$|GԶvn=~{O0;tv/x9 á?0N=N;ڐClڹYX'6N<2Qg?Wx2p@.m}ό{½SsE5(߼UlgVkoq5p{/=MԀz_ʿgV cywBF J"z۟`PM޳'cXG7y:Vf]l5G1SbCS[Uފ21 $ܴ7.Ԩ]^5c=}Lc?4CT|{jRvkW6%/` yRp9~W-.㭥F=Bpsk':唓nv<ﭭx1}wj&]߿k/ۿmz)gEݦ>55\uos3|ɧL{Y^{57x=7~ϵF)b6z3Xf atGF^f̘Ň~ԦZXXa''2q)#bݺڹHss{vً5&f{n١wgmF0;Z][!nh2QYYѮcmBZZ .jx@a(,lEgt7fpfΜTmvB.yߞN>ko[^^)8ٞT!~=?Ǎ`@֯_ϪUy׺7|q ?4 #\I,p 1}LkkoDIOOg;|[#Yc߷1֛9qXW~"eɨ@t t+UN^nS*I<"xl&Z)L6<4ҝ6̦X/@hSU5>zdgXout,l^f;f2'c;n˄ٟ, mC6Isd8L@D2L$V?#,^;fR$!B&pA(""""ݖzۈ\k#=Ӌn!MNcjfm+/n [7HaJĉƒ.23=vX,N<|#5V[9\\&b جYdIP) ;N龚\zfubJ k$ fgҭ&0:p[l [EZOx"J@nk}OI14Lwk7 \n|?Lf+6ǃ7݃Ҿ׷fϖw]eA**f98.T@kI}Td:w}6d@*FMe56n{Xjul;䝆Iwx$h]oɆ˙OE3Hh[Cɚx5qkN)LHPqGoIRXĜ PHHsJʼnldju{$QNHFTQmid{ )B 5vlRI #aTn%/ۅ6ڌ&30$8VěW_ME*-ذ H'fj5p,ǽs%BM뷤a7IXة8h.k/4mf4L$DM8\a).D{p<$AThJB ?-nlfds +"""" bBum%ko_pLZ!r.+1ړrpp|l6aRvMxj/mZb;f6M=ĩd]0MQt -_9bDdmHwө$86f$R`Ji1CvXs"eMauc2{M'ӑ"Kī'miAYDDDD;5D8ٹ ՄFh6l㇊Xdh/1ul0A2$'5ib%KV6$MNdik|,N<$C#>!DDDDd?OzrpW-DOi&6: 0=9'8|#%䯡*ۡ/4I^dtr,f%m9L'z~M`̵("\N%k{~-&s0^eH&'Q#ԨI\-N즚H+.[{iWzupYLDNJBޙ،ї ͋?^Y;d<&L3NdٲHUi6S""""[ŊݶND;A 5y2!Fz[#$r1u7?pNM?T_ AF'juI`ba!aaIX0pL4[q7[m,&Fx_Ŋ 6 [y-6TO4˔$XNGp0ᴘ81#ɁbaKl1mwCb+a_m%LԞ,ٖGsp%F*EnKݟ5(w)#&@0!30IR1Y,423v={q D D뙱l8ҽ9vG.M-\*x]y} #W?zZDӷq2Vl P!毡ڔNӆڈBLVg L;i,&NķRfic 'nD+$S $}2@$ōj&* ݑi5IxX Q6rd㴸]_a6U@}X`Po0d-Ч/I(囷RKy197D]CvIepRђ8Nv~*DV򊪖'JDUF5WAewml{tTd23 4N2,E,*㯴OgZ IDATz*^Zh=* zucʉXrz8%:3̞ +ֲ%sٗm='/oNV&=+2uW!J[g!б cm X+~&+21EDDDD& 陙dٱM:h 'Zȸ<7$'N VÍia!A,jDg3G[<$5ٌ' O˴CnfZWk9DDMZ;-{ӱwO?==w 8lzhk_^׃>x?|^,"""" >2aŕsrN L&##z{ڍh u۪I{w^3'gӷknn&MG8mmrldfatz{[:r㶵 tz3"tsS0Fm~m=Zdz=\1c\!8#m,nGΖ""""|AKZ{F/'>Zdz {%(Hwz-'OAΘ,̶(vݎn3AcQHtD]gmv;]ZɿrS^h-'tG@Yid/ŕesW>1P^i= :1*|pvfE44#I،>j0 N0mg~Unu2&hh< $uZ8litV x%"""" 7Np(08BƝvJ[G@ r:]]ip8t>?O ޷tXwD298[odeq.6vav9%JDDDDG1Jc;#DQgt o}+ h Hkn8Iwz $´cdfls3v,y2Q>aǣyQpW;Mmwsk8sq% IJ2lbqvgub-\x2Go3.ޱ/?_nhkZ2ȏE#I(IȌ?DMx\c9 l@h=DDDDDDω@g0j%= 9ۂ{3IfRe 3hhavxϮ+0:n"""""|3 GNK9k~gZlr=dOP'c>3 C= 81z.1O 1IJEZ^9ơcADDDDD/bӃnpi<}x"f0ag{hYDFڴ?-G6ӵ4\sj7n7˯ hf""""""TJd9p`~XQCtqZ;{̱y䄏?81ɚp9`g csmHO:I{j!Y@ÎtӍBsmi0ƩBDDDDD.]Kzl.XAeadfE|&9GYnL62d }n#˭N x̌q&2ȵA3_Q{0NIN d{x4lH$$,yǯ HuQ[Zⴆh ǩ=^Ԍaూi<5pVr#('%9ݦp="s4Nk`8+ѝp>;p(Ou5W4Nk*8!+"""""r~|-q wwa?Bm 9sd2ZG&[Osvv&Fn6ݙmV.H=i#3161 `[0,V&dZtQNBAztHGߔf1cm&'I˸ N PDDDDD䜳,X %_ya.i1HsR2C;joomi3}<|1ۺ=+He(V"""""",QM%d;T""""""*ųv真Y.3O[2վ$"""""rAS ((((((((((((((((((((((((((DB%&""""""fT`QT((((((_v\j ADDDdX,((Ԋ, " """")Bȗ0, ( (B( (\BDaQ_l/ ¢, """"|n4Ck"P`_^wV!X gf*0/Ç{a+EX.{]wo} łR| B!o6l, rхyxbƌKOO`\DUT'*^l .qt2mEVm:9`ѢEdddDDDĎL}VOESet%bhrXKtDDDD1|-=oQw Cg"FC$HK4̱HE `9oT"""":% bc/'(NH$H#V&2+9"""""c&"""":(NJ"""""(Т\puIY}F xHNwCayAd'gw6QLo>Z7Ξ, 1/c=&;Ypl1ڢA F8 i1p3-~$m DbA'l8 7ix,dXf+Ql67Sti=cᷧN 2Tbf.XǴ /6M| Uą6SN-~"":- UUUZقf$iŠ3&LH`d(qDqt&9X  ڣZ`rZ&.\$=qtr,q:`d#9X, t&;s2.t-Vhnbf-%執Eyף}aSKlq3VN@6ҍƲ`s൝م}o|'Mo*T%u?f[IҝJ""rn]ŋ,^d{SuDj5~ '$cn<hǒuM!>D-SdxG1ݺj&bX8tдg7{CQܫ/vSw>0zx=v3q\4˝ܶsmM|h7ڿ8m]DDܚ1c uuu\{\{%kW 3f UOK9ߍq Ҟm$[{'4esE~/tBr^B -T+gSvS-w?]R y0n_-gطK͇|'&uo8A ޜ,{7R~T~!Z0vRN'LpSPt J11`@jx +vP x&n垲 'd[E|`w;|i3ȝPo.lU/Y᷶ߨeTVrw< O0>u{}MoUSs,3o sq⩽WzŻlw M̼%V/_ޫ?Oii-DzЎxVi%t$eL񫆥3NC,r[vC=5V7HD'a,\`{AѬ )f{wiS3MAh@)EݓgfuE8'ŚdSX={~jZXPtO6s7qgVV_=ͷ MԶ9YyY}Z1 HFs=z_ MϬW\'uЩn}e|%vtTmٳ;?KT5i8PCÁ,gJ' 0lW'bhIӞ>'h8V$b4DKDg6c{AsWnx71Iv nu1j늓!1VOwO$vSg5̟a@T˛s7Pe66ۼLFma{k־L|lBTT~7+^?{dnMWPq`yK;%7R5Tl^MٕR⻩ 8g6P®4wl۲O"X{Epe>9?d e3Gkx79nZ§{3V˶=nx_a7d9mx7߯K)>u_y6¯d9on{{SW vla{#PTJ0M[^r_g5Xk5*&bTk_ǷU{{m[_hme!ED.Uk׮ vQh|H$R]md 8X'-)ݎL90G 'V\a8]:'H$_,B FSC6Cp0TXP<>gd1y%sڍnהREY| %?3 OJCTF?kNkT1nȜՂ6"rߨ Cǁ#\f %CKaa2ytc' &4NkU,&nlAi6Tc<] ,Y5?v7/*0Y2&q[AzLY'&#3-I̿g{a{4ډ̴PP>~R#,HޏQj%g<|%3ƲΠ.&ruHW>Ӌik$4vu1虰n]T)9X2t$FŮˋ {us.6/GGKu/NV~][}j?d0O!%=XOx4@r,(*}uEa{ 8g`愞ȧxƤr5f*.?ySzf ?N "I63-YWXzevǀPk^]D;i2^Wg|)Ҡo""}?YrX}1cƨ H$z[iFQK]'L|`~Bž~XLW2()!wNZ?laMS!p5\{j, o>k>lRS7ۂ朕H}Ά㴥 a{Fj$g0iyƛ9E TꍃA ݬZK1G8j]1p}a?Ye*o_tS|ۏyW 8 733deesƪU:;hi"~ksesesK>wHm>h2sN2*9afN5|a -M8}lB@;K/{fSj6!̡߳&~) xRfN0 VͪEϰ=4M!ѺvBhx*%yٌx7"紥. 0NQ7Yc?:pr׊[nQM{ћ5XV~"XW7/2j>WSCMM-4A|ϰp#f""kײj*VZիwƌTUUu'a2bݥPvyv nYt |ĺG+zNRE\_ͶwZ0k|Tia M9_kkfSrS*M9Ȉ_{(9?`΂d8\ Rɧt׺e;n".-xY;cx8< Ʃ7!Fףr>ta??S)PZ58PԀM9Sf wZ< 3˖>rwVZW7/]Kp yk8M| fP0%@  0kN""3f غ;{_tVݨe LF-1ķ3Smsl,7rC>~nN}נhNj6}+ukl0at-#YFMW076{`v'l o+BS?ȿթe9;Օ6kdRɦ&<ζ'军3slklGPn^u{ߪ6kqv) S*Xi>gsߜ֘]Y#5˸l!?AWԥ.4U:{}jRk_̵#@ke(""pS.jzu ㊹vJf)Waߔ;g\ܼwy1HCc2_7ff34` x^5-9Tˆ%6hڵ8<5oñ<|{,8}F6m.3>8e qA&ۿAF"iy̿QGwC((܊/F)O @] nx۠ln1o?=|?~-TZo`ĺʽNV-; N^IJ_+K\kK&C;Ȧ9& ?XFkTLx/>)eCELl@ sksQEg}4TPܜlSOOXSѩCWEήJ[r=vUwlW1V.F!;G7fC7%[†{df̿2$fnmKn[ƒBwp f}-yn 7?  9%< eSP4'G?iy'o񽵅cnec%9T~^W}9aR׽YE=s]N>~5f}V lґyn,̻*BYDJJ&`;Y7-'nKOWkpA7ҫ;b rQ`w |!7MMQiW΃`{?Q|6M{N`io(:țO?Oym _cɕo\{+TM^])o`4.gar.+[e?|5'hhⲇy`Ƨ~]V5Y4pz,Iۿd5b@^1e+K+`xhhlŜr VHAJ[]oeC1Oěe˹${?Zc@ٿ?׽s?ʚ__BY.i\?(X c- M{-gӷO>OŁ㊘;;m޿5ʎ=º}&Gamx67B1V<7W~œcWm`ȵ~7%~%PYm,llLJϾUm-K@I;ϳ0-eC7R`z_38'\CCe@|뵿>4+g}? t^4/yXwoʞ s82rxϞaUu=M5{#-8 o1r}~%O^<1U~]黂^k 0yx]D->7X{x{}m_uM{Y8j{r=sQuIb`zC%?rNzc'/SjzdTN]Tu ruL_3ˮ/U@5ycM]eT |jTEzx >z%v6mo$ LC=:2KsA}AɜAk8 %),{f] zu>L߲~Wb)mضe]}5w}}dW}n@|޿"59rpTl~lCpulݿ0*|S.ۦ;n*z_ʜʟcyۊ8 qC^ ՟8۫fB錾]'Qe> .k;]2 j|/ǒii~6 d22*J)enˮ_@'Y&/gb@6%Sf3wPs1S.nvYI=g0fII6=Kji=/GqW՜VN,bNq2y'Lv!HndDQD/iLuMrm()ΦTQAu򿲔W^]\ߟC 3??9'fjRU%wʄ,Oۮ9%*䆒 n`-%xbalg]\#WgǑv?jm0mtu ^Wt0Rg)sc.&uYv-'bAb o)Ŀe۶a^͞^0+ߨeu[>Ke_b% :U11st-5\2<= 缞Vܼ,8#]֗禮 45̍ڄ êLbǩz L8vK?eCf7{c  ܌zltzm x0 PlugΒ3ne㊜3]a( ˫f3~J3vv)>6>+:ǂ@ MFvK>Hxz?4yqlz> "?SǻGY؆w5pv\<Ƚ൷YsK񭲻cDDXXKաt^=)JYOTHVm-!Yy.7Ӎ6r3]C="#3ê3ew>+Ey e:(*]ú}{𺂴j4 YrtR-Y^c~Pj$S]ld?cA>SW^哋)=+>6>{,Mvs8o ]eyFrT SQHd+W~pf694KV=Rre01(.)nNRw66NkzOQBLqBB &MXå"E((?%k\׀kp w џA仚 Y(gPyHBd2D&U%==>ӟ>O΋=ZPΙ}T~91[0BZ*-|f,OA _bv^F"l1 2Jl謾_ U@z-ä?Q^컴a>Vp4v~cX9?=Q=?UH1v@aW԰ݵl9oW]i]]XƎ‘][;lhGNjìė:~:g{t}s߲ |pW=W:׋>uu^+D^<8~̮q ׳Gw7r{=HjouGqgkXBNµBDN8yϡQa5 mylf^9 IDAT KG%uydW㎱h=,b͚|kε'c@F2fsu>Ye JJyXf< `Cn=_%z/ԹycFOy{yT/}lrMo` FU0zazn UOȪ߷vމ1#ܹ JƄQY5J tJ7[rqk!I;Y@ !nM}k>צ l5[ F!B%C$,zOW4n'`B!B,IY)pd LmW?W!?I@ !B!XNc9K>;LCdKõOe2wN5cL5EO<{i!T,aj}e#{}!B=h!:ҧ`*x}f/狣Of鐮WӥR=~W M!B Tx8+K1y0@={]˺=Xf'?;P@=ŖWvW1}[w^dRܲɵ ALd1*2çd 2 'I<|^=+g J׭~P1YXƒ?x߱PZdo|]W5VeZ6?„6y\lY]6#iX:fTJ3BuK{dE9: {An?4|m{|VH!?JkkL]y:H޸XͺJTB%?@r7j[6i1MIzG_q{Xm, gT~s`\VNc1/0-ws3b×Qkɴx9RUϙ(2.B!dqK ?aRz8)ȁ-{B76} ٘w4P, ;\_SzhbOs7Ʈ DupyPaYsh8b *>ME|m:/)ˋd3xLbNU۞A!Uq*6VngjWkfb)y)?_ +?gzYVl0@2xzGw71&a?M>V'Ie>oYȆrwY1!!%) K-a'')ߣia)THi7/۾wMz8|=,@%%6iMR̊7e>%[?a[]^O7wE]",dodߺ8]_ !BH,/m} R+<>@b*N7$dfx( fq'#0Y7L"Up&Xn=b]HZ^yDgE9)2 k u<&eU}%L+sY]$C:S2wL#^Iw<2}z6d>r1O F2'Δ #Ƿ12̃`n6;4i*ɓҩuC< &҄-N tHu^l7űi/ѩ3UG11h zD nԦPɑ]_˙H!?-DGힵװ#P q{DZhxhCTPN{ld7CR8pgP`^WhaڒyL,JAQvWP:mU5[~Ѓz֋0Ɣq,7^02_&nmuu걿4ҫyDgxQL4Mgw k2]]1~Ik$Ҫ. Z[9韶n[ ׷-4&#F/IlȬe .|3& c:#Imh-yP0+^|]_gh!BH5O g<t&&b wqރWm9ADAw%`33$uFQ(8Bћ WRťIj wy;"&\ 8Tn< ߛʁ7)5c+f9>M8rWq!? kT[i,kۡL)Jrb<3;%N/j_xx tPdsa̸vR)F bꀖz`} kܠ-GUVҎSzB@=YTVip2Fy:zx`Ͱp|Or|W1N^VʩP[ld8N~OcpZJjOHTRr \[[hávS~'Zopݎ3a8./;`硓B!7 KZ.F'GxS÷g<4GpgJ>EO rL&G?BΓٌ] ǖ yֲ_Ƅ(PZVK8 9Pi#Y3ع:XO%Z G"o\"C`31!<\_ ~(uZ>]0htKSPSYX08QރtCyOv!c,iXH8/!\fo@<%w^^gȫzwk4t@!Gay̚xys( &.bA܅8WC#kQ Ø"&W~.``:q_#sԪpgJ =c;#)B!:uj)֮bn!4݂$`f.9OnP {~߽{7Vwrl{Xe#{,?G zB6.]f8|p3j6[tJ7[rqkhw2CCWe<^-~ Sd#B!ďę3g׿~_̙3U݂C]EjDO Bˍ~DDsL,qȖ-\>'}ޝDL}KhH}c/K4 6mꀛ:M}I<3U-=q$ԣaPbL Em(6uBMC4C?>F}3 @oW6¨;1(÷Q  DSB!BA(TTT(iLnD3ƶLM9Lw-sC$`; Bce.7,E2x`l󬯎֢m4,R!Bq` ~[BC𷙓*Jf+mgj|sT%&CO_:@]oh0/ \!B!nlv84 -ijوk;uO/j+|ck.t:6W!Bq`@[2i趹ڿ``z^=B$ͥÅ7 JӒsqk ; փ[,B!!A0 oVգڄ~M΃(kbëз_6x3pݿhT7I,Sn1j,gԇ;cL5g)PYSfy W_^ev*/=]:76=:촃R'mC?6_5w]\o"磓R? 0D 1/qiL[ U}'9SÙs8_EIrڎbcsme?m3Us3ҍ=rnINA8l΂|ʁO9Ps~mgonloV70TXQl6M7 xE Idd,VerG!QUӿ8~YmH! s MO(wCPs:@?z."bchBjĹMQDT긤jߋۇ$GQASP d/6`E裈lk˥>H>#54sjKu\hٲ^^.}"E-B-g?;E)-\0)$e`'qU~՟,῎Y8?`{z>xuez8KKdj uX2Ǡ9H}.>?=(;_n¾]Qngd͚4@ar1wt,4Vmlqy!SYLڼ:bq jU䢀z-h n.b` XIn=fcc8^6ϡ{Q,1.@k}x*% :PɆ/͹@uP-ƶ L.῎Yp8[ϙa<N|q4dXfdl_m, gT~s`\,4|m{l;.bnFhDC~6ԓir3uQd F]ԓ0$ !#P}VH|T/P=SL g {}! ;lbbI{(1r=VQ3X׊⬗s_#?0Nl%zlŢaqL6$ //.?1Gqt=鏲噤L׳ݵs ވe|ӡړzeQ)}q{S1Ru,y&iJut96_ _G\{u=-N6Qv(gtOlǔ53*>{sXu F|pXj r=+H3ֽ5y/p?S@bRZ>nnܩM/&>.;g9bJ6= zf-gj,3q50y\,9wUξ@TGү=D \8\E=:(^O_(dc!\vuɆJl6SܴM/`_cc{azJ6 \JҲ1kh"ӖiT|G](OP^Jw.O;sxcsL̟GS\n^}E6 c. ocP p\q}=\pT EE,زx)-q i Gb#gNr*7T4oqT jL+(b̳[h_OkަeMsC6]k)>Lzq8W_x\uOlTeM3s82q 8CYq:3uЏ>"1(P0ȝa$B"Q3fYu~3=_&aV"C܁A9vHOF `29EpωTAL`f1L}aw2hT,&@I:Iopb!sۘ4q<^TXDžzN;7XxdR?'ĘPN^Im 9zLKQ#pu.6< &:;тެ?PwցҨ6p6BӅjI5 3@!ep?jX, GOeڜ&/=8O{NI ~8D#rEL0|IbHgJ kv{Ik.Iwyr!/eFsx)y}'nZz&'uGۛ*9 sF6Z4Q:|:N_ wvqJ:"N uN(cn IDATr1Si꙾+  7$OdE}e=+#CO$)!.|#gu3$gY:~' xĒi%+V&z󣇎gJNzVjqpHբ #Sk !POmC"]9zq$遄ʈcZFpZBg޴!˨a?mOI|jV> i?%t= #2Ȍ;UiE{oBNGő.#O }bzwvm]$DLaLܙi:SJǁ;svpQ)+0m<&Awۊ6C"~?)-Qi*FZ:+#fCoa|nC=zNNKIPVlm]Y,`!Н:$\~?}Mm&LF̍^.v}} s=Eʨ\uqTy9,S{c$z^Zڽ^x5vQOa9@I侬\z*o5+X'fyCBF^: _C5M=^LW+XF a*܊ 26E$&'H} r6)mVkz _$yD 2G :CIktb?*;l9'| }_؝IsneݞߑJvU32_~BbX5UbyR q 6s7\fo@<%wNrssn%=s V3t=r.mp^n%YYOV10b͚G 'g֑WΝz?yOwM::+6ec?] yUo|nmSYNpCl|pϖ|(gcۊeӏb_?%yLhp1Y5 PL] qzG֢1EL0)ۅTzOh@b!pӉ;9VC'0)?;>`G/1c6DR8ɹ$wLsk(-0i]Da o1-#a$9 62Btr85d}<f0wn91aT:4tr\-z,/7pQ5vL t+uu /mel6ybYsٰv6~_n'>q)ląNCu7YJ%376`HE)#@!d&g3{~a%zG*y)Lδt؝3Y W!|s xW:uj)>]H`w\wRpP˭$}aԳ pV*?:}u\~jZﬦޝ,C=Km3')=6K"#n< [)2f-_Lkӆ7VF}Vai6v_9tcG6cW{/} !Dh!Ǟ"c{d?6(X^4}7oZV;In,qY,8&KO0h} U+AG@ !B!X!B!$Dh!B!~,#,= J r"B!l{鮹g>6?6S>Js@jȏl03;w2s0B!BpW:NtHgf#BO>ht7==`3U~&}w)fuz%?7\^˂]#B!cq-kKhԶװ;,kK/b@!%ʄr㽛6 f&} ~B!'$Z'1ҀIEm?zSg|+R3B!'^> ]iHϯB!BE?=B!B!n ?ք59tO?,Gf,QH urOE!B!pT/s1#t ؤ (B!GG]nVb.5ij+AEN@# ;-WzOŚ6n:y,}SRVx3=J<l˛Ca ;_0mli9< ΄>4 3' F'Gy(=hC1L![ܗ,@%T3a[6޾LbW|%=[ѣ$륔 ]$qQ hpEGLYxD" yo f~vGFbIL)7_㉹SU@R{6&[p;]jط`%pnX<smM>yU ^]Y5RYn@uS=]Ɂ6kZ6XˆͥBNWڙOern6V"B EAo4)}Ij.~j+4r|+j>#0 QbIW鞿I|m,]sjIgs/bzJ6عU6U@kJkmڴpob| {;O\l6||eJW#ņ7_RSbl)B!n;cZ3&? f: "t܌ ܡ 5X+_sh&hAih Bf;WIj0r_!ICaM52;o;SlCdY@ȴ1mك:sj{KrzϏ }q؞Rt4̝e"xf (͔g؇!/g^S-X12G$dr3 & 1АM#fqRb9)*^*vlxA!I)&=CNf"-y'698[EY#p=/Na /B'ydk=lv=Y^e*jT)-mp *I!Gjl[~,E."_ ϰNjOT1i9ҿ7UΔ_KҎJT.5fZv?GQ"iIʵG]^zqM@yh7g=4e;z~NZE2+Yg+33"ɑmFbmQᾇ'yW ϖ͑%C?}Bq 9w"ro4pj]Q"IP`jƬid@Qh&Bod?Li#) N&,O(([  YUq;H-1LE{w]Rn!-!%{Km'Ekv֝bGSpu^[Z{\hF LZ"e7T[MQ:ȟWmWYA90h#Y';_bW˧2BQsmw>Ւî!ǏV,zʂSF#ɩ,_ޖ&2QAuzk,~#g` }]:N k8?0Zc[>rfnsr/F%ʵ`O͞yپƵTCC凎aPigoge:7-ZZW^ e]bJC"V%=u \h&Fߗ~F kt:t4s@'c;p7h&( @ n;}!qi#ma2b)b^W:)kIXtHdKI TGr_;b0L9ư ^oq ٫tcYІˁ=vjwB\Oر}tPUR+pwsB,yl|Jt ssU=_r0?c<怓}5„X9IqJ=.04z=XՌ$IQ[8\Np䘖ǴQÉ$[*+1!hpPUd˺?Ar _= 'C\}"e&EE9X Po-9nf&onPi3x4p7"'ٲp1EGU ù= {[2Ժ VmB!nPNF·z*WQhrnzNU|1駏BK%*\7C7T &c̦غ(@@"X2ǐPYxrCѩS=9j;y.z,xK@:%kf)_gKg>g9w8zjՇzB=8*6u*9K H=[/2\*#0?Ty ht.zX8OҎCC3 n+bdS N{&N j=@7VbSjO Z]VIc쬃U).}uNYwg5tpaʈw[rő{jC9{N/!==76dї-hk肻Ycۧo/ w˼q#gd$o:vl/y/C/be/SL\H㩥`F We2Yܕ9jvcpw8ÈZLwee)}[YPI-w?},i/݅˾CJC20v6C-R%0tQ>5W{+9_eO 8NWuzsN օARnX tL~Z(MT̋/k{!j(Z~d ?!3Wt0Ysmgγg0h)ۓ8ȉ&N5\s11!ŋY"",mE<0|ܾ|3Cf*?|]Z{nZ(-mo- v_tVy}A{'l] MZ$x~Q^ֆKg8Eȩ.R°,xr=_5;3IAI󼱯iw?CȭlSvM%Ybg";`|UvʎTEeK#sT;kςٓzE>8wdWa%fN>5<W,=Ŗ γ k=> k&`j$h`~+.[ v6q~қBuZ\5a IDAT7],7vSJرd-Fg'%4Kj>^2+V2h^ZSR&Q~Ϥ]ﺕ|>{5^[B́mlcz:_,d2m^fBB&WJ`qeB<+Mw۱'BIpؾNoP9aV/0hpxz,}Ww.mE>Ɉh6u}3Օm?^IJ:{z.~#ZD_="]8x]dYt} 减Su]Wࢍ{lrD{Bōe{vq&޼ҝwaccѝ85oYrg;ȻXp(h)]b/#miK6,*6|%Ԇ߳ۮ?Tz:{Sp(r\{)jKRa\ wz-ӣ ƇǶ9rxf _G(W~5Yax\PklrG[;St]#gօm]$5u:ϺgM{vt_ѝl8\J(Iֹx1碻6ea|""ZEμ3%vrsM//fgd?h%ě'tVŏnv:ܻ)eIxFi)f<<2z.f.CuO+gswocG"<9b?x*+1+ klxv>_C&̦܇?`ɓm!5T~@Yh1B-V{6H7RiAnV} n+p/z+QxWR<˼螋Zܝɦ5e72oV i8v40gwQbj%wLrm#9V>zf+Uډ+PY%5&>W8zZO>gٶ.u?Hׇ+!::3e|glá8o8yC cfz^UXbCãC'>ED_P H7R?ī\ļfX f2W3?Zww۵ cpmQj{~g]df6iqZ\,~{j=GCB-j uxowLdz4XJN:,L&U12ygg6:ko5LMÚB= |a"SF3G;iX8>TkNp6ft\M?,7sҙc/ߩLjBƍ2,tHtäߪZ8VLcӣ؃+(_ȜLzM&Xӗ?0wۚɼWcFruCo 6 f@HSg l0h92C’RjxxSF]g632ٵv+?:i5HpMe÷f-a鬍اTU,}-bW2Q;Na2 ~u[G8橣ԏg4i.P9Wkp# Ψ`m+}#.wYn` 7 {̙.hbɓؐ SFላ•w; U]^GJj✤vȠ[)}#le[/QW3^;<ԚQ]ۄ#ӽF6/"yu䮘E#.-K.#DY=9"=MFV h'WwCH˜»L *AvC۷R09"$96ՅeNV-! |QdXϚPSVg#.3![1.Np GFI:0 mXzܖͱw އ֓A:DDDD;@Mkft^ҳQ-2Ha!JJ<ήdɂ sQd tOoX9L)~X1x1` KÁsY)dųXqa7j=o[LɞEOxz#^=}n̔oF yb5!_\ɼiEpMnpf< """"""?wn.""""""Lb?}<eQzFY mAjZ%<2}Q^ !<9W(BMh 4}Aima@$i `8Ag>/(f^qL+BkPס;:Mf0DDDDzAcCCǽRs$JK[`4ZG$`hj$m  /?_Zc,dt]U-ȁfPνR `dsbl`Q^-e^G*&Sb24eYS/祿Ə~kT58^N~zװnA6ݕN˂빟P7pnc,O\q%Vlt=G`P0NFESd=~,Y{L 5.& x/5_T8IIw2_)FsmCα:YR՛yd*zCsܥ<QV +߇d p l_(\_fEN,'(t2ӏ cOуFA&/?OߚLJVx:͖_# ZcW|]7xWbިCGDDDDz-o[ \;rnp|YkREOϱV)2V'?IkYjJJ)ϼu5񖱸RRNzJL- &p W949[%]%u!8=t,]&MŬ*cd$3jWRAck ЁJY}R> *ٱC]y z1Ue=vŌ=t8&Jv2>‡rN5HR n ia@8?(9ts /^ĤDSz=M8݀1bqp{ &f c FFAnz[JPc/3 tv6rn0AfUY: e3&ik&OckxJzaJAj(Tءf eL>TIL8] CwXʠ3[==БIJpB/Q Y0[FE v ~Q` NQ8ʰ0RT($&1hގXeM!&X2p$-+ġVk|z$tl5 i5hLvCGDDDDzZ]+nof_KD.ަ&/=Q 9RkcUIWpv%KoF'F(4f<x$^MƠJ6x'4ܵ!d-Yq?qqU2c^HEX3OcoXzVk,i7dfp%K{?cpLpWȶ9dEf?D+71ss.|7osW<I!XDDDY#">:hM^6  Dp?ڨaz__+xzZ.dm$%%X_Ɗ^1*<46߻wo4Mƍә}1}7sMيiwި( 0~7!AFDDD|ouTSȫ,"""""DX#وo0@-"}5y%`Q}:7@/;6ՙa}6$E[~=OZB7P(_|6 ^YOS4(h"DDDDDDTmPbOȕGT(lXX, kUKȕuȁ >AwᮂL#x`Y"KDDDDwZ|IIFD79&Hdݫ=GY!!"3J!Os N9Szl &6;\hK:  `K}^6adJ;c-,œT}\ҵ[)n>w kRZ݆#s,ġPq&ic^J?|v1 v ASCLI7<¦xm{UX2rd%,?g3ʏO3' lxG \.b'73o+i6=|tS\@ r.{bּCXxj|Ew8Hi,[͝,yn#UJ[fdUQeǠ,M8?eE᧸wWJfu(j>.dٻǁŘ|jzyW~QRTǞ N _bQO:DzA::|a2ܐ wfb'3.kC]G0|g.gŰ=!LZ9$VEDDDDXDVF&j: Xs[eo[y8.eK)ct1̊smGr;ƲdCc3~ \+yGDDDDPt2ti-w}TlG?`M1Q$ ŰFaEzcMláRv϶j~ely}' h>HyCWsyy[DDDDEAR0EXV-LHy._+ɜ:y7pdz4ogYN;;ֱ IDATv۷`[`+dG(ֳbɞ|p eշ+䫯R?۶m#))I+"""rill`޽=^&++ 40a$DMn#NS  """""","""""","""""","""""","""""",""""""r)DDv1MS!=3 á`Kv;*رc$&&`KuLFF CUVVv,""",rFWAqqqn(\ ~_M"} DDDDXRz*""","""""","""""","""""","""""","""""","""""",r37F=^;9v%؟wfajUHw"U"ìgV2ޕQ%sleB]En@&!aLaĹchGp2 nڰ,7al6)Ma''0f s?]37C :;KiaKÄsi_5e <ԫvEDDDDXDLxs37ok+;Y}βyGXu cx1sYâXe| b J}XytYtWE.]ĝӖ ϔUv}KgcJSDDDDE{]Y,lrF%y1f/uaOi8F-Yr}4gS ߽e3#}X:9-ioi[ڇ3:-fllR>[OSo {xmd}N~mGQNٳ\C?:sixҩ6fPm$Z<@~ZboG~Ϟ/`tNv'1>//yK 7]1_~ΞSUh,Dn )8q.ݓcďnjH8]爱Cݻ-uZN#w=u-,ƪ>$fEDDDDXDn8&؈co  cg 8cF3hsFST""""reQhD2gCrO}Ξ/a^wF )Px> wq[=s+bQQdѧcIJ'^_t'`'ED466w/iL05\o?5 :M-"lf)p&;U""""" s# g17a$uQյyU"""""u~OA|>|>@P҇k {LT""""r^@|zX}KDH"#Dz47{2!Blth `(W@0磹m=eDaDEDX,Y|>"#5 6M sRDDDc|佽@PݞϰZnHvZ*+@'{("8T"}@}}=C!"""=9#Iyy9vhCbb(\J$&&v1MS"=s8 DDDDX+````e8 t@G + {\<c=_Gj`ēG!Y F417[ikPҊ?9gE5+""""""sn ߘT8»4ln!>چ"\8 at np*vDZ;E߀Vi`sÙnN6lDH\t6khO1` NFDG8$ڙB|ڂV u%[\ISWDKDF Ι\_GCs mAXF)ꋈHȱcǨꫯ0Z4M׿OJJY> X((5՜s҆?kdK'qD5JS ׵ԝ+VK@[3'h o:EF"qaSS޴f QQV,A5:y:ӊaD \WCc[xӭu?@ F@1Z<Ԝ ֺllg!n6rx ހNr9w w,/QY\ z=^.PuQ L':XUT9B`6!$% &%N%HYGdB*CSRH20,ok?` b33 m p{?`c,q$MepBDEX Cc7-lzP8J` ?& VZDEY^Ze[m M&ʞȠ A$ V"##?8~O+qmI:`[,˛ޢz] &g=O YbfNNLz`1%M~t7y?ac8ir?pr3&Mda~0)w~¸O`uwڍ,5=4^bad}w{ߺvEDDD_~/(lx%:|8Rp@FZ?78"j48*i:yJ*+r)qo%/ұBKGW`6kxG_}](6!1Xm45R_scTj§;ked}KXA0KX\;cY7^,d sE_xccLt7r?zg ?>3ɨʚR2ǤɃyrGC_*5f8OV1[3%KŌ䃼bV~Xq?c5*I3=N/d;~[loK+mA#&Z-XX4wZh B9yv{bOa,ƷDm4ȃC}4ܛM4&;0̘}+ z`'; [3LQE\^^Nyy9l~~rk6Q_[Cm@VZDZ}8Ӌ7&u)z:xTD4ၷ0` $DX(A3ܽ:@D`04Oschh5hA>cq5p_Gqpߏ;n|' ȚƂP3/RKWX:Hwa/5 dFQZ%e>kML9I \+<QQ89Lkq60injCBhHTH6PjlnbXmH ͭ^lm4(l(՗@:`8ǩNXn?Noۗp[ * Š7_ۗ3ch&O [Gyi1E+_aڍLy2ٙ;n#lp\-6RsFJ,8u4 @qjHpv8u> (Ў) cDb hkkOQ1Na#-qC`?Ms0Cbv[klCb #"A8W%3 *ٌGT`$$j!`zE?x͸q74b| .9g{:@bXDDDDDD`"U"Op4H-"""""","""""","""""",""""""ҷh,nڵA!=ooUaȥO~?S!&LU""",r)׿wuGV|ϻ˶mX`K.UwW_T "Ow6mRĉL8Q!ҋG0DDDDXR0` AD砈\aDhOSj {` BPe)""""kntX,gruYHX}99BEDDDD `;+^®Bp>ZDDDDDD`QQQQQQQUo}N}oZֲ@y[*rӓ?{U/,N+>:ݞD@:6n EbX5}n<'wa1-Ͽ3<)[bv?3!o"~笛ݭ#Ũ&DDDDDzD-"PmCg۟f{j;oP yNmğm`kۡ B~{`K,fx:P K!%2d#IOR:-lO!=҇'wiMN ݯDDDDDE.a{O 3Y|FW1tZO;X?2~%!Xyu$3Ŭ[ZG} _}uĄuϩ`gRDDDPQ}k7|SDUVL(w}7__uQo~_WQ9 Yh ,/E"r0x``mĈ1B!""""rEDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEd&O&DGfu$tqX Fe -Ky }Td9楥5]7sfXξmدeY?B.騑b U2g%g\˻ J֪7s4Umb;'V8Z3Fn}_㲟ɰ@B`(42q6m#0p AC1eCMtN7 5{Hа攁/%CGIђ2{יUR_ƨrě8O. ]ֽW?\6+ŵ??깯IŠo w5g9y?wp+<|%x(gL>+ݾul|}E?]ccWج~RVצt̥ncl_"3nI)ʵƤa`o'Tq5w ,EUb3Mń:OS”b*"""rh vX$:z2waۨw,>ìŠ 2?̼NvvV1{SY;gLcy顧`UoݣKwj66 _o"kOrdzîG_ԇ^g+n, ?I+2v(3Y]~5̼Qbxuo=Ì6qAV/]Nòj6lWg3o]Ob<&O+y,4@/=:O-Y~W1usg-UxSL4|}Ey<3eDi\~t+ɠ7TDDDh ~Nip-\'Mu#}Jbڳ[&s|p$ OY˾27XXeԀlyq24f5-5x{R| .m E#l\y0? vRryL 2a뼧粱Wp`w; IDAT`^zr)K!T ̵? ,K okq,dTUņ-VJ7*~XסPn9n z!xz)/ZCuWv e-kdظi{f{]? l*4u-Z˸T?QgY߻a뒔PvɯxBx3+ڸ[h~yeJiQ>;ЛeI&1ijl"OJ]* RPqCpTڅ׍_Do6(w ڍl}-44%S80sr)ݹ< M'la[cWI`Kcuewo&ϻfC`@%¶?݀jg_F 7`lu!4xg8mPb9 Dyy-6 r_{; KvcւulO0 n-,*&=W0Ȼ~j+ЄD6w~zg>Ҙ.wy}|EDDDD8O`gӃ7(ۉcZe hmÅÝ3G|4D#8dipi~|C"'ܐ ң HvipZh= _aj 2|g1[G/Y]L^Ro6|I^>Ac{ϞR"n$ ʷYm :, ?~ 7}gY[9]uҹxc}&=-oe̬ o&qKyˬE轝'gACC  :?d$7VF3\6/{|7'""""Mغuk\/Ņznn" (-+=B\I4MC&NRzQ\ڃaNXD hm;fw8I9ZcDbl/Aiq1%EBٶ9Ғc]ɤ+▟>/2w1yZ;;wTtSKf3u3߶ Ԯbҵۻa%g%C0ͻA NT.jX:1~}V9>E0]oM7-,«ԐmvV/*@WusyRL7>;*r1O^V?EYEZ6 e~1f HڀcSe_Xz ֲf*TӹyS,lп"""" ǑtkdTlm&Ӛx2`ܾ;i M"A7-*rw5r38bq2@",ο8dNߎu ;6rmO\|]+ׇxG&GJ8wtM̜~};{`n&. T1_r6S4j.:Kp!ُBedgCg sŮj b }7Sg?T3Pv$&S@gxpv*Fj_~eyٿP)OŕLVWUȻOΣ'.` M63xmL>%snfQX:})Ql o̼Iv?1M9$EYSqukۇmkMkIQe3&dX¼#ڀH4F;!5>p$_Qdp uDR`S [М^۹<}=ۣ@ } m'qW֓ظ-6Hf4p)ٍ-4ZTw $pףC8 ޢޔlq(UπL&C6~2ngo6 P^˂ (**ҧNDDD+駟mی1A0:}mmrÑyW3 ϦP;#e0f N &vެej_ LìPIuq;@kdAGc[OPq9;]϶20%EGSY"""""r|EV&E"""""","""""","""""","""""","]kw^ˈ`C\tc~=ZF\{>svE|\~-#~6Q9=\ˈK)o5H |6󇌾-wcwՕLtYnwnx=8J&^5!:.DDDDء Q>Zn,+E˩d=3H~YvhYȉMY[?cT ~"""",rj^Ϣ0J&s.ᣭ=$[簲5XzǸ.y2}9o]!7>q/P1O̜k9eGVV! e8ʉ:/w?aQFfeMѓS)1F?`3ˆ~_s0'O2 ]3~߽j 8۸Am Oyuk:e}U~|mh-gPhv>z<`%Z P:fn=$sygxF(•;:+>}q͜9*~aw?xSSr ^z)-9"˗,}W rђ]/?k&1..Nsg&>xU6аC~?` Mצּ.G1Yk3s{eؖ?⳸2ݪkkxv6Z٠L}|>q:7N+˚͢( [GPxK,w,,~ɋЗ1WE{;嵝[|=!CcEٰdi/A |;?>ʗמ? 1Wx&_q|k(&.gͫﱦ(+;# G3,Ylpː/wuJGo}Hct`Mk5yg/U5^BՓ =sxm V}* [6nc"ַbٺlak{sƍat&v%kz+KذCVkAE_.|Ț&=~ӋswRլ\ms?t~̃+{61a;^.]tGw`Ѭ_w}o|H(&u`e zι}!n}1KYYږ喕݄5v-T ۚO-ltرi¢,3kng)JM?vokJϕc `ѽ4bm`%T ٸ9;?d6pn ?^z~¶iq;mf}m}{w. """" "GF'KXi^K^>X};$`:vOV0^F۾LwȖ=#^c;m;7e8[b3ۙ:V[Yyp6fP;rܜ1Nn<{\skJ9^&g_ȒǤc]| _.9"e;-Zg/^RlX${ިkir{ .^rz \޴l[5/wj/6;2[-ko:}ˡms=\m/{)"NCNĐS mXCx rc7vL;uYi`:68],#N`Mgs~u`)^*seC),vÆ||]kRаzǹ^?a)+w#ǐ7'y=.7`]x'TL?|]k}̆wscrBV9Ѳ<_sbقNGӧ>""""A3"aÒqGw;_>G W9?oš%o "@sj 8yY҅\sϽ¾DgM^~q¦>k̙2ye[\pDF^0>qs]Ê2gvar)~xsgy@K{ܒ&f^|33n9u=tk9ss>{^*^cn!D>ϜM| TRGCDDDd3&dXKByGhwHLC ty PTTtLV0z͗uIie/?O0$'G DDdZZܯX~ض͈#T {v?.ס/=o_w=k}5,""""""'IWqJKDDDDDDN|׫ \. sNw(/Ud\GTɤ:ADD 0y+]KIFTG(_7utڏt 6.A~?ŒOѫg:FN 7mf_+4""",r2 4_/\ϖ,utz,c+1MS3""",r`˲(+_ʿ`m u~e=Jߠ˲EDDDXDe&@.m8:FN߲,^/N`QLrxHիE3r0MsG (!=(P`9>"""""",";տqg+u0iX& ݲ^Y}=m5L"""""{%"wЯzyܰpܵP`(\OPng*ds07wq/)q5WeT\8]G_26Z1'WpY cT9H8֯Z˪mHƘ1c2N5k TwD}cP&ݷ|@QQ:VDDD+駟mی90v *xmmhds'9tZG1e_t{6{qфkDDD޹G:q , c[g3""""ri 8!H8!¯2IEDDDDDDEDDDDDDXDDDDDDDXDDDDDD8.ٳp8m#̲,:BDDDEz x<u&  !""",rxb1 96oL8l2:Xd9""",r88&cD0qu(x\ Ϥ((((((((ȉ(G]8uvWԇ` R4nL Y=J\SDuQ^]paZ-tۉ8P/w3w}}[I ww^u:\Æx (;a6ZRcM#s( #""""" '&;8C:Ӷ  ښ&Иc1?|.vp1Zqt9=|."4xt.v,N w2L`;msFг0wPXƅ箳΢ v>gZm6hn&ޭ߇+!K H)bqϏޘ`Q A hEDDDDDX#@OC'"7׏όq8q0<ڦ[c44E)Ҹp+,$he@;Ěi 'H ܾ =oiҘQ`vL`./~ ;g$ɔA9!'ԸQ=\ E-;J8ڊUPJP^ OumݭP02)OVW&;RPo-9z4(s {|$G?U+@i݉=\]n%廷*;n+oC6r),K!I9 KtOAV D@HǑU````cU'3)""" "'>4 c@84u5Q9, c@SS`P!""",[mիWx<#,LDB """,r8B!Bp۶!"GX0L!""" "GK8t((((((((tEqX Fe -Ky o^:@DDDDEN.ݿT1Uo@؁P/[C+ze^Km^B:4DDDDDXoJTHs.v'hB;y`lO͞R!jYg<eY4fy4zP&&*+"y @/e{_`>Q˷VtPVQys|1}BCgKIEwX|1UۚXd6S=m]¥kzRL1yp?jӏevP,\U7ә: _1{Q%}OΣ2C xLLJ7@r67̬EDDDDDXT~S﹂3{O|U>`n&. T1_r6S4j.Jp!ُBe'WG|~&MU%\󛸴BoNǹΧXdeܸ f&wWKO灥oϲ\?S,|)ʆVZGu9~cƌɴ:֬2%06 4ǠC}>"u +VtyO?۶9r.u8ٯà9"džF>g^\4<%,rL(qq:BDDDD9"""""","""""","""""","""""",""""""r*"{m[!rYE0TGV__O}}=@ǣ90ՄB!B:DDDD"NkB&ݷmw,cРA:D͛75,"r|a>۶ζK׸\'+"ǀ<:BDDKIE8m9FAQG(S)x\ ϤEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDd.M3%.ct|:vS [ԋARl@/E4!VH[zr_:BZbXo;JkPO=q װ!CGDDDDD)'ߋ1ݞNĈ;gدχmgl6c}M9>'&''SѥTҕ5bĜ8onmlwx!oB|eipCNyfHjtuXr}ekX~I W} qzG+4coQ`q}>|(dX }4Ѵp B, ٸ21u:ivCv6O+&ߗ.p0L&9n O1z:E5ө + ܒ$vl':r_/H7\ lt9n;6jۯ5"Xv; y3N3_/I=z亀LX=fgHF\r͓cM$X9aLTG!FI& T:C&#ez0RIf&4J6Q-/!leCrًce7jxܐH%66.>hb{/" /L1Am\tX,n"X`fw|u(uE19a+("DH87XHiA˶4 " .`#Pd~$ɴZl$c-d<J&V=O/G^̦9ᐌ'qD RF[ģa2 ˧[.8/ mիWx<:Ed2I$! (Q> OI~{~QGn 청o.Яx@#Xk8ch S,޵2|_Rнnm*WS!JuΣGlWs,wQ(" m[Ǽ )++SGȑ."""""']KDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDx.9e2uq0 q8"",""G9f2 obet ŤEo!{u9ukײ}vɤ x<JJJ߿(O֎1z[|S'+/%5|q$aܹl۶Mw1a|>_ "" ""r HL)9\ׇ{ 1ǨSWefsp\E?뛟$jaK-̭urESGoӥݎSzCLWgvg2Ej݁f2 $!""B~<3~'6%%%6mZƎk0/@]]]w޼+Yp9 @'IĔk J o?|1?oOۻ;wL|>1x㍬^:;w<0xxF:::ёZ&In9٠Vsx9OL6α?< #ܩԀSW)-5=Ա`@4Jd ^r` y`|ySg~s} :`lضmV~핬ῃmT Ak2=!O2g=y|`q`Nh]9T_GdζMvpnӜCL]5lS?=ؒT\)3o;ng5@`ڬ:ؔ3!c!jwesGrm/|F]L[|._dzPR6̼~hkwlz3{N|a@0mܞ[܃l0678@sMMYWK{{eշfYv2o#9?GxBqؐy5[XI)& 'ڬaCNumJ+3c،,ZYW1+F} Y|]YTn|!s'ޕ(3oel{ӐsiIy,۝-R66<4*C6Ofӡd§]$-y'=ߔqS\{g>xVٔc)̜$ٙP$u%UƊɡl;^21Sq,ߵ%;FdGnέ%I%I7W[~цL#pf5;R}$We_ktsflzUrԼ,^5Idŗ$+{72( =Y{`W$vuE^6||.myIBo,dY/ؚ{_G2u-yhT_oLzsW4" eIuݎT'3wķ![7=PэǾ<ëO_-[Ԗyq}'Y|wS>W\~eȪڒBUnhgɰi$CαѐG/YP^!wuS64NR+w6nwrÉ2ȝQ~q2eLQenbZޱ-OY͓S\eHY6$Q掺,z%:$IRʢrY~xWVּG'M֡/e͐T84}WncźΒ-S\#>T\;0rpŷM/~5>"^\~q(S#]+/?n}fI__mփIIR|E6++n,0=W_d_>>`zMS>P)Ϣ+^-*_`kn캬Pںs`<4ܶK猙u1YڅyyJyZ[ީIGQsG E+;R{w6n7LΌqӲhm[{ݝ5;1Y2<6rL#~#[I*2m,kI\S)̥+UȊ5s8][X{xʓLGw|-)vE|cgWsL_?z]a…mپ$F7ppS 4}PGGGL3f.hooϱc2䍕n3_X$я-Miii:w$>A7$wYݾoKKK͛Bop?lٶsi]__s08`0`-T`ܝo3pM cqO1}O{GG.-.yO/r3)$Ysp:s޺倪 3 $IDAT`αKr鵶_%%ij:r2EÑ|߫y&<}`G~oG‰7lbv BN<ٶm],w 0`̠[ ]G`E8fIڷ%ܮxgs! Ik׮ L%,]w],XB 0 Yfk{pŽֶlVde# szvsmԧ>ɓ'wkC,k׮gDhtk0o;Qm.x o.mܞ ].Lb7\_Q\n^  YWL(蝐<.E3(;!l;,hK\SoX_0]^rg`O|ň\_D^;ۢ'z/$̀ S \p0Gw8^[.t<"7ov1|8y/t:{G{s#/s=}8@>\;h{|G~=E|1b V=f_L Ŏa.~zY3( cݽoEFEjwp>8|`d0_H зW"Q{!/Ve0*蟡#~ f@D W"W \O+|E_,n_0>g!#p/XFZ,D6`U |Aӧ81 `0b 1 ](E1U,ZX+2` @ 00` @  0` @  0` @@ 0` @ @ 0`  @ 0`` @ 0`0` @ 00` @  0` @@ 0` @ @ 0`  @ 0`` @ 0`0` @ 00` @  0>vX:: <鰑`@+IOn_Ш0􉎺Fg|P$#G ر .~GNvX /J[ZIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/security/image05.png000066400000000000000000002400521461403617600240230ustar00rootroot00000000000000PNG  IHDR!sBIT|dtEXtSoftwareShutterc IDATxy|T[2 e - nQUQ+hݷkj^QV\UQ₀֝M 5 L6rfGHx?93ss2|{L42qT<GDDDDDDb+M7;;D2EyY9xL-%""""""Z4ňH$ {=͠GqzJKKI$j), &=0{="6oެl&L2?̑H-?lT-#""""""d2= q {dRCEDDDDDDEDDDDDDξftaXZ4ZdIRA"aDjiii\n>d2aNLB!FDDDDN Vǹn""""" OVU' XV<BDDDDۭ͆_褕( NK& \vZ-j5nbQ(KuJDDDDlNϯHd6""""Ң?McwҸ[yGm^֮{ASTEDDDDDdtmqرc㤧5 8g-֩m̩T8 R]]E48N23pu޶wԣS0h@ *SoSgР֭[ˣStl20 MF*l|AO3k/~N4eu-i_""""a@ǟ{uwj x"~_C 6m[dmʈF# vM3edF7bg7S׿7ϝbym6H .D"d]wM1gp8TTT|J{n:7~PojWmr_ .~Gb5}A~̴(++?SO9{ֹum} V#n @=>o.0 :JMffee[}l.dtk֮]C5/+߶[m1l62228Ѽ{Mٓ7mb)f Cu:G <TTӫW/rrr{ˬX?MfذsH""""i<7TWd" RQI&^y}F";Tyy={vۼ@ V1gpݵWC0d7y|)UW^A>̜?B ‹3u/%̜or饗Z >S|us:O3}o 0_|n-/_j;9t2zM t+&5dWDžOnn.qbW\q9z2={j3s_ŋpE4{nƎìY'W' 4&[ ԐJ%fferFnHA8d2J%T+LM' xp~?߲_~^߽̚o`B&++m[E7l^~Uٓ_|#?X8&Lp8:ܞ[8X|N5gs8zIYYz!Ma?'˯vN^+nf^1O? án۲Υ^MǦaF~uyߣs㩨` SUYŔ)bرc;v ofhrMpgC HT L^^ 9i<-=eK7ylX;֯UVca#xWbǟWk}ʪ7v;|\^p}0w\7Ol6v@ K^]]/+ڜ:?sGu$o:r>t0nP(1G+bl'µ\ūmZppUWcڜXk{?8/6駟}OCx7&7o41H;𶷎vm5;Uko6|vQVVnd2l&HPV>"w5>`s4|"ԾZus-Z”)y+-ñ__%;;ʪ?_ʕ_rwq+g;3ƌb{qq9k왼s<|^%Dzoc99s^g̘9a,]Slx]S>}HOO磥Z-w0N[nv;yy /{>66ѣS4孟nAr:M~jY?mʈM&r:]F(omX~~>S~~106 ȓƅ/iO1sKŦM/7~nyX `"< +XC.Z̕W\baĈ_rϽFHOO%<wC{-Ģ=+Vlddxw>@ fۗ_C}Oc N^uD}jt׷Zղ}.{30m.ioWnOm/pُ lƛp(vƏ?@yy9M| >_/_O9 \<*֮?ixx\ub1>sV+}a̗ڼ3fĹY& R8jÇ?//Q'~>j """""R}&᯻d"4 i^n܎*)=ǕW\Θ1J /o>q֯;&0'g\?x9 0~TWWsvk6 ΍7^GVV@uIMϙ:Gu$oNC}|mn'Sl2qIOOo0 d!mYg3R]Sg ]]뮻뮻o- 濱_6Uc{k,tgDuܞ n%6PQQ0z{P6COjǹn-:gukN@+ggZr@՛kMp8.١FdHKOcDXZG? """"]\[v[)((1onl2 U[[hٻvh`@~٬V;,""""lb"ݘ&`}y9@NbpL&.K-&ҍwXDDDDA o6!DDDDD%6 ˭nl6 f,{RKG222quRKDDDD,;je6ZX,N&L&<4HD"a$I588'ZE@HKph?5YZAXDDDDDDEDDDDDDljŢ d"I2$dG""""1&ٌbfb;m-f3ŊlқIdD a$HRR$  H&j 2TD"I"XP(bt:wS@KxH%S<8`x_BDDDDT*EMM5ތ vG^#H`[y9ht."."^Nӛ>}z3zh|>3gbY ]AnϞTWaںha$}jg}> K&]&ru4~wzkx⩩hm]n}͵Ѱgrn աR)|uҘL&0D w9 .(h0w.D̦Ixgiii\~X+.~-7]9D:4{x0y d<Km8kTvco.uV>Hwtg1nNF8lhEMee%\rQ=?4yssmI̛;캃 䒋kk/s}6:q?.FeEnwםx{&^6axzm^;,O,x^P0he]|3fmRח^޳?2|mm#JH&͝S8qBnnm\ { ,Y!5u_ b5_CZ- ƭ̺u5![JKn:p'%pLz)KdO4'QF7yGa׹ۃ`CpS7'9L#[Iښ,L՜E^?gRJK6RGi|:g6~]9wpJJJ())w;ykL&Szg5 ϛkR8z~v&߽cޝ=.;;ͮ3;8ûl{EIOOg„[]wҤ3.h!\e/aAi[e᏿omS yyl\42ce,l|CY ?#\LGKg/`#|6/t~y}ǿ5씯g؞Ou`(F/6V}{! 9刃vA4Oʪ3nL+~ E5'rL^x1*[qX䍼[FX5Yco+.}kk:מM^>%-|D;n9 H,5 . 1b<,W\q9_0JJ sXbu`Als _G߾}lٲ?xvRk˯{kx췿F'ijsMWvD"BFtb5;}csa ,Zxa;buhbF:?2_>_s>sciO灓y?fdt^$`ȯ~Mz55ޡLo:O#s>}z~{^d3`̖ڱ*V뇣(ze(_Me#c{7==PןrVzYx.%QrLX&K^;3ϱ%j;,'Je ;ӇRM-bQ!C^_tpQ>w˷i箽>lklIqdHV76fmR @r% ʣz|$ǟ2|_fd5?9C(]_Wa kj 6nrƷ>Ǐ5E,[6e /?YɅ唼` \g?Xf;,22Ӈ5CYmpǘ#'n&eʕuo]Rc=ζVL~ b!=1:hP˓Lyg=cfKi)gN'.NuRʗ]6~?i'~Fff&EE,{≧b*N:DIچ9q¯?0g裥].z8p@CmK͙1c/ΘY}5\.g=KCS&3Og믶\w]OM7ׇ>X%ۯÞݕ8…;_[?y v:F:c cz˸3o}`KGXLe빝|8/t%?]Rb./x{hF8VX%#g YZԨS5kX7< >#L,֫E=7MzhCDu8+jO~P,v6Ty|Hn6./kqٰJGs˘CYfZ]n 7RZ ye= IDATIV`aP4mo# ȷndC ,QÀv@6H)+u}1׮q=swUjnm:Զъl( BICs|x=j[{Ӽ -kl?F)YD(ܶG2YֆΩ޽kϗh-_Y;r+z6m⣥/EW_nsn_ࡇi<-7c,Z޽s,Y!Vo-3găB4kW-`u5X c/P{'غu! 祏ۍF鏷 ]~i!?PJxw2t2#/Rc6E ,X}ٸ[)fAF?`Ú=t]vnf5(.maz"\ŪFWBi`$r Zf&uڼU8K__|Mhxϲ3-Jj._ΠAvm˷QSSA=ko9`@icJZZN>Z?8NzzY hwRS$c힜KMj..^!ul6jX.~ ߿v[wwԛlI&mZwݺu 4ͯ=h@֭[{],w G=8^m'P7 UuֹWre7[&rWayl}Yg+ 䄑 XAr񸀺NdǍ(@gysWi Pk4AGTxayp?0V͛[!W Wr ي~\rPctd%ɪBN;h8cO@%/$s۾_Iv\ -Komζ5&Iupl,>z@Թˁ8iִgrsq#5륆^ň#X_ nٲt^3f2sLFSO<ſB͝y8h>MQhabX[=V7-Ѭݎat矟u,Ё@;nT硇'7oWNڡn^u<8:νE^p1F@6\;/QNhvm5k(Ig/7#YnyN/ԟe_ɊSh~;i(@s.9WxѨ箆{sɲhtʭD-n2@U)q/y}Fn<l vr o`?<VNe2p_4|ҢTUAe9d}Zx~2JYgg,y~C^zk*,yExO4b.3^xkr|I/iQ*++ R\q/a'ESVZI>$VYm;;4V,O/6 Gڶ|lX:‡$wLySO-6m*!7;S 1M>[WL$aÆG22]S[UtN>=2VMtOW{իV8i0NZ-m܍Y^Vf<fԶO90,F3W2>c }9y6yKyx pR,_2i\xSOtv]V4,šۈf!|}D_({=7/&+G/VEYWmdk0?h*?وϚx|) ɍ|GĈ J 79<sSMa"V|;)(.A?#q!eG 0Xƞ0ѶXe`I[WLYcP-ȣJ2 zR^C n[6SYr#j9nXWP\w@_4> ;cc%QlbagZ_Q2B0bߡ_AimC Plf_fڦ]hRv Xgc"l:O8D=4k}Z"rgӦW7G-eӦ۱m i"j .jݭWhAX`A;\\…vK{b1N}&FO> F O>~+>UVs≅:k!CM"W2*++o8IK_~ɘ3NO>#`$|GԶvn=~{O0;tv/x9 á?0N=N;ڐClڹYX'6N<2Qg?Wx2p@.m}ό{½SsE5(߼UlgVkoq5p{/=MԀz_ʿgV cywBF J"z۟`PM޳'cXG7y:Vf]l5G1SbCS[Uފ21 $ܴ7.Ԩ]^5c=}Lc?4CT|{jRvkW6%/` yRp9~W-.㭥F=Bpsk':唓nv<ﭭx1}wj&]߿k/ۿmz)gEݦ>55\uos3|ɧL{Y^{57x=7~ϵF)b6z3Xf atGF^f̘Ň~ԦZXXa''2q)#bݺڹHss{vً5&f{n١wgmF0;Z][!nh2QYYѮcmBZZ .jx@a(,lEgt7fpfΜTmvB.yߞN>ko[^^)8ٞT!~=?Ǎ`@֯_ϪUy׺7|q ?4 #\I,p 1}LkkoDIOOg;|[#Yc߷1֛9qXW~"eɨ@t t+UN^nS*I<"xl&Z)L6<4ҝ6̦X/@hSU5>zdgXout,l^f;f2'c;n˄ٟ, mC6Isd8L@D2L$V?#,^;fR$!B&pA(""""ݖzۈ\k#=Ӌn!MNcjfm+/n [7HaJĉƒ.23=vX,N<|#5V[9\\&b جYdIP) ;N龚\zfubJ k$ fgҭ&0:p[l [EZOx"J@nk}OI14Lwk7 \n|?Lf+6ǃ7݃Ҿ׷fϖw]eA**f98.T@kI}Td:w}6d@*FMe56n{Xjul;䝆Iwx$h]oɆ˙OE3Hh[Cɚx5qkN)LHPqGoIRXĜ PHHsJʼnldju{$QNHFTQmid{ )B 5vlRI #aTn%/ۅ6ڌ&30$8VěW_ME*-ذ H'fj5p,ǽs%BM뷤a7IXة8h.k/4mf4L$DM8\a).D{p<$AThJB ?-nlfds +"""" bBum%ko_pLZ!r.+1ړrpp|l6aRvMxj/mZb;f6M=ĩd]0MQt -_9bDdmHwө$86f$R`Ji1CvXs"eMauc2{M'ӑ"Kī'miAYDDDD;5D8ٹ ՄFh6l㇊Xdh/1ul0A2$'5ib%KV6$MNdik|,N<$C#>!DDDDd?OzrpW-DOi&6: 0=9'8|#%䯡*ۡ/4I^dtr,f%m9L'z~M`̵("\N%k{~-&s0^eH&'Q#ԨI\-N즚H+.[{iWzupYLDNJBޙ،ї ͋?^Y;d<&L3NdٲHUi6S""""[ŊݶND;A 5y2!Fz[#$r1u7?pNM?T_ AF'juI`ba!aaIX0pL4[q7[m,&Fx_Ŋ 6 [y-6TO4˔$XNGp0ᴘ81#ɁbaKl1mwCb+a_m%LԞ,ٖGsp%F*EnKݟ5(w)#&@0!30IR1Y,423v={q D D뙱l8ҽ9vG.M-\*x]y} #W?zZDӷq2Vl P!毡ڔNӆڈBLVg L;i,&NķRfic 'nD+$S $}2@$ōj&* ݑi5IxX Q6rd㴸]_a6U@}X`Po0d-Ч/I(囷RKy197D]CvIepRђ8Nv~*DV򊪖'JDUF5WAewml}e_ڽߺ{K:L;ɚvH "*\(˨uq IDAT9p Eh1 C`0eal/N4IֻjWc[twZߪT~<<PR~OF1FZ\دP@_S6߮$rvFPW舘ZYs=:6>kjT]e\40 T$GO P*UԶd(_rfuoh8ԫ}I5וui-CSoHR5Uí?c7i"YUi4Oe,?(h0(: T &挴:۶TRYUӷyfTh2T-3Ld*VHNLPuu\Ne5PWlmc:XN5<C#a80B]bxqInSpLt d cýWjTj7b %1ݠsټT<́)?MMtTRFLN:4kCpu%"i jaQC%S=:zEU7*UMQ\А'#ce;Ji8k;Pm۲m[L޳9 ?N$jL :'Umx{!%3F?0Κ].8JV4N'bXQV- !KrҴZ[PVPT*"!wLk_*I7#8;*:҈(vdU9;eSAn iAO<UP87?8E f|ԞlT`62.,pׄs-55OP[ʽZTwπ:>3%Zi0s%*dsk5#0eZUUJ$U2 Op5uقE8׊aacc_94՞fUT/ PR-M%c t*3KJf{ u_I @gw[pDT⩚J d?8ҘasJέ+jf&R&SR:M7e9U;%*:QkB~5,9Iq$#oz<$i6k0;Q5XwzDŽB&#/Vt¥;ܩdㆊye'S U)K!++Ia!eޖ܂PL-A`^!7d(A_f"5QCkI=%TrLJ[Ҿ:[bIu%PM]Peׁ^_qSlڴKe\I!^X:EϺz'=}WWhiu%[% ,UBk[Ri[i[$ #Z`JBt[`̂j3p (+T;YZSNc*\10$Pm) V>2$4H2-w ~(ҀTvQS**NB CF)P$CɈ"R-rVgGMP`d}5E-C~ 3r&K'4אmHAd@PFjTJ6+ τc/1.CB0[%{:>(E$-A8n"FR0*8? ȍXU1&h*icK)YX"b#ͨPIUUR85sQY?.|N4jkYTR`ISͦTna$) 兆 E_Y7TSlJVڰk7T9z V^+򦡤)%ܡg:|d8dC)K+r@ebӁ\PꆩYc*V _In1P2mpa\@YP21V[:7'I呞Ӧ4e{%˕[OR$)jkin;ejQuyt8QKC%XR:rMɲ O~(0E9T$U; ѨLI=ǖmiiҐ KK:\P,Tb?θÒꭷIjfgI+ --xzd=7 N8zz}e͢(e0Z=jf+{ *'{nCٗ`V@ 0`  @ 0`0` @ 0 0` @ @ 0`  @  0t3*@`  @ 0`0` @ @ 0` 0*. ~Q] AI~R!8ka(fZhUc9sܴҐ.*{_3? =+hwLi.%Ii;ő JY }r+uϙV`Zy. C傒$~1# K#0Α^`P To @`F1 4A#^^$%͈G⊙<0n͡1EeOJ1Ky$UZ$%IܬzJC:줨 pY易ݞ9IY2d…ʜ -߭U,u u5ߧcsdJbK,ϝw<)@8iUdžzu8dTiu,v֕VjTw^j(iǵ(40r``HdU/-""J %j`_TA ^Ar;=z.ڠ$tdOGǒ}:Hn8z2ހ<e*e2Q9_xY)yʇdJq-DU%IWRSWg`ke,P:[KZhz:Tpwv.۔JQ3&'|i{_\k{| =fXI=/#U6%/*3[JG6$VR5*y %,KVk˪rn>!"'3Ѐ7vUYC$ϩ+TgE`DZR(G'0%tuTe%҉+`1\T( ;7ɶiI 0rLJ,>hiUV8i-MI%@㥒hJ ES3$/Tn G˫j‰)6ALJq-Ug %Jh:@2-vbJq-Dm?ʔ*P9a; ,[QY|tԊ@$.2mō7/6ș zsU2t)( %iHn.zr ~)Ҁ<q?}>i04"MUZt6 lGh3&%Uj՘zt.PnX7MDUZEEe|MYZQZQ* scZ`ǴQg.0` yQ> }*3ds'VK@܌Hx9B0f$r*Ú3f`Њ/TfJ``3 C1*'eT ΉmJ]TmFd̑}` 5Hd0 վ4B.b- XY{` @ 0 0` @ @ 0` .Ytl|Wf0 `Y4MtMB-˸t;B8װ>@(ΕM`^̟s<00@a /y"A`| ݅aA% aAƥ~ s\,!`̫{UWiT%zצt^Is6y?.4Ũ4KPPPz瘄`1u];C .aDBa:;;sNB0.*t-du79'@ET__/q4HQ:>/Ucc#f1M \\/r^ 0fu8!A%sR K`\܃,p 08P[|3A.sL1<&,F`KR7֫6Vm>m;Xyسr[k{jrg sV}6| v?;oL5-1[T 4;^r%8kt璞Ҏ6.D+?]w5J[.{G/~_׿֭[7~_}}}/~1+Y `K(4jZܽz.vG+†?3ORD$ui׏'~, *m~ɗdEꊭ^TG׏ 뾤=IKΫ[;S%IwyC2as]17$z^٭W 5xe9긐p ;8sv-Km|o[W/g ~rJ(jί7?V}ݞjƍ'ZqAL`է]/ɕ\qܴWVn=c啷ew/?JZxf$xB+T[ֶ}JZF}f󇵶f~S?$k|̾/7Ā+ŚԼ*mڼI_L۾[蓒K>\dڱ}vj ͗OUqQح.WRVE6gKv2ۈrک1W$R6ud?mE[cڻW;~ Ӧ\%x*\{>sz-|]_W]w.5ڶwާ'KZxі~;LXOe|GKhÇnזPHݻ]fu7ZJoߔ8zߥ鉟Q1Oƕxu1]7HoNPUQ;7oVGGկ+_6o-%]/Vo֮YL+#6^VQI<rMjnȱN7m}zo>g(X|'gJrZ0̱.yV[w7 `/V./iS;;ZE{{юîd۩=7͇UNI.N>N+$,'e=RS={__Stt'嗾]ݕǖ#G9צ#ڴ[on{P"\Sg]3zfO[_)ilbOGimj=~-J9 7&ɭ&h.Lwͩ~NEcrա4@ IDAT2Gly٩RzjWWnݪ'|RfmݺuVq:ty*Dyy~kQ&rH;C# kг*]Α {m{%5~@jO~'X*IrROr6i_ïTyzGg-^m~wPկw\?9mkӭիJ]z\ G*׶r`>Һmfx;mԋO[y}fm%j?ﯼ鐞֓@hv=]mR92{7UrO`{㕄nwkNs{Ο׿f{z]++OJMW?ǿ3]]Rp䅧[/6gpyй|6=w?XUӮv r}?hdz?-kHi}V;p\j۶mW:::m۶y}ni~g~4P\ޤs(Uw_V9 4eI-ZѨy1_JK/_6; Ηǹ*ml$GmQۭm_1 nZmI?^Yuґ*j{E;^I}ҝ7LߵIvHG^zQF oG}p٨#)驿^i%mmYNv_ͫ$I]ަV֯[G:%:Jj<8-yyy[]oMOtSؒnr:'-LKr|qÀo0w)I?#Iҿۿ ?7Sݠ';E =:tl@3']xn

_{8tVݵEQI+BNת=ݷFKUZ"cMZݒ֑״6v{2.jiR^_፴؍biq/_+#.IÝt/ֱЗ!Iuv+-yiH}bK%*+)wp=6]3"BZ\&)_6,&[6T?J0WwDոJS{\/x\e?s.Z?"=FI$t͕kUn=SKvͻXnZ}y7н+IѮ]in^[nxz$/s\~0;~(fZAKo*klevjW}V $[֢ rPnv_xQ=^yOݔծ=*Y~+f9m?{VqT(%)#u?Z);*9a $Mh[}L''DN)m1; ;5TFrv%,{J(U3"۶kOa[sn^3rqA/O~v7lԑN#'HPyΝ%ߵۥI֫yz&xiw~NovIW`8tE=Q=zT8ӻu]۪բE.}z8أ΃}okwtp BiGuP[owq[=Ҙ?աcQ #q3:vS(/s_:v2'@i:=]ZyTkbؿ+?*dZwk:Z{meہV==kѵ$-ûOۆIw{uOm`g9g{v8O=+؞JYe+J2}+~QO|nv|n[tF}XK|~ûK]#eމW`9۶muؚbs*Ƕ灖C{aڞC/TFwr`Zł;JRDvrg6='7{zG}L"WVcM_yZKn67Ӝ)y`I{ )P(e\*X p#+ %AuTv۱=WM8(T1U&PbӸ*+{찎d }yŜsh"ΏBvV}+'zSZ^G+Ц'uWictCqu׌nf-Z܋:"WݺIesLdy}@-S.ztzmyMo>)gKu߭mzұg;w6%pv>Y9r #탋oڤ,?mֆ?n~q,WwnqBQ7+I |34#O>i6eԧ]Sm|,!<ϨK׫}?v=Gsں\Z,sj}_`$e^6}crf=-zz@Y1I?ޮ]W~nmzsZ^HݮmCC7_ZhVm[Q}]ZQOGz+O/Q sHš-KWV{{۵zjb3v9իW˲KV PF_3ZtQ&<>~j.ժZA)}Օ-/*H˗.Tݨ$d-]K2 sBGoD yr-oV-zԝ9wV~R-KHiR-_X |$/.zHwqן|o^3XdzTigvI|_Z$SM?M]-喷@unW4)e*fEWo֣lmwlmkþuTj_QmLȱ9w uE&BN+h˃۷~W}{5FG(ZT7**-Bk8BuKռ,G^a}]`ai'|Oz[\㔻;m?q6Ecm8Ii]tKr/oRE?hnr'.JhYO06kEtėb joo_ᷧwG]~Y\jT* ?2)%Fo3#$z{F pOU1*p(lMZdao8J=R\3 NL9tpIHUĉ2U{1z=wWd ]y4չaz2=`Cq> G,;'phtZ<0͉ i̦47GNw [۔aHaɕG/%~d6d @ Nk}r԰bqY EZ.Q;:8P:C l-fz\ODX"\Ovv1(2}^(9+0먺6>*&k.)5f,].="ƙC`E2*yeI>S|W~0?vP*/]:z{srR1-u3/ײFeO/+3S\*\WZx&f9l(^T$SH~V]M\پ> 4xˎ:xWC2"w5۫AHu\S)(bHd{hr9ѯ!+"l1B\IVĉ+aX@GեR8ثCrQ;֨NtJqSF$D 9xK5buj7(k(QSfYr&}a+Yߤ$}DN^'a&]M6ijI @B\H|J@|m$$ *  {` @ Ygsy,^T8τRH]`b|A2 3 fL,4K&v߉ܙ'S.1@l)]dg@,0[۳egÐ`dysG0N9~/gÎz=dV&}0Nf@+I2=К)4b2-ͨ"yCEo@VD+^2[d-'[==_L⊪:FNxsc0-F1:e2sEdoOPTҊɎ~`옒VD=AzQGP}~QÞT/^q.4HCO/cQÚ=10`ւ@GKye}O^.)1L%,[ ,k*r˫// _rH 0+Lu, xcM 0`)2zwUBgÒ2zo55E3mE CRb੷SWWpÆHB Cƨuz|F8)Ҿ}3fxZ@'OaX[j#5O$3ˢIURbQ>@NVXӀW/K3vS),7R%#,) %),#aOdž+IU9JXQż@HBՆT*eV!|cHUU*T߯㡭iJ*+߫á!)]JjeĖۥr5jdEʪ I2$`pY՚YLy>[eH*[P*Gq_"5M)+jqUeW)0u{^Ou- |J7>*朹 /nζ,+~|isjnӦ;ݗ~ֳ^TOn[rI 8r]ϑ/~˧{n}oC_Or[w놏|Vι#>7i/r\a߳cw膻VT]?<ݓFz~~nڞLm_(}=jOۼ6fI= -°UqH_C%GBOy |ɲ5lr]̩*һ|iRO5|{מ5u ?l&)T!4c|9VmcKO[=]=]֢[Vs/XG;j=mzi:>14G"_Z7CkVvǵcga"S3U"+v9TOj1UŐ2HO<+G'/cĘ*R̄@"t,G{©**;[5K<_XHVV:wt/?;Dr߾_m8bn>z[1;xo1ߐjH_M(Pb@1Fk \~x5_EXCh!!J4 %ɲm\gq(0߀Abp9QGȜ D~*Kxx7]9L۶a|FtߚCp˺ulPP&0{l8jرv[mN:!\]u;y|I[10qX$y lHq4WB<Rݥ2>P]>_&/ K#=!h*+FlY!`‰H.R1(. ]wS>QXM㯘^d%.!?Yta]1ZQty,QlUӸ_.HN|gZpv\VdjJ\$}l%Ao\F*fܼgIcKɜ޵mV`N'9BȱS]$1_);N9A=)6rv؟ُ8xCS+_3cr rCnSvhbճ؟Ƌ)<"c-s)[זIESFrfhx,=S`&ؕQ쬃QHE/Ucx}A5vo.{`NJMT57!Gd: =T|Q2]$1o˺r,:dF_WE:IIt'~Qf |s`|M&\?ܣSbwl8rrh do ?>˚ӈ69X7spU_Q:{?]0@[Wex=voaVu;r,y_fQ|n8`"C\}n\pǤooMUh9 s,ny͵n^?8p2@P[ERxG<%N IDAT@J'ιryO?3PxDpQH`ZG9(C Ub'MlfyLw,ɚOꙜO7R<ՉivN(ʑsľΚ'(4q{j0Jvntq,u&`7ođFqFKpYv턌)Qg87Q`ՑFK 0e-Kvȴd$}6T(Z,ڲgŖ7 -|y7:\{WR:h2)~Km׵͗RI=LYk3Pw6 c^>%eU[/sCbR}3Gm UϜQLYRHNrY SṆӍmtv\P\0ظlle5pS민حtW1oc_Wbd=;_&! <-$U߮O?;ǎ $'`8Uu8C6}tAWʄX2-& #YF?]S L*d7AC޴?E tqIzt+.Z9]@YfʌT|&$v,r`qY7#9u ~ K"等 Țo7~dmH/Qy1+V{ jgr rt38ֻQÿ5Tn.Dg=%G g@ _.|~ʿn3i c06e?V7+TT GS$:EV$`!_xygq  ?% (I_a4XNl{=T  xNsg&EVA S#?DO8^]T #p3+&yg4 #\>$f" 'c$CX#a*.X5V"kyd,f+&S{e:IK{q=w[׎TO;)3fqCo0x FSqr#`v4VHXE'~w~6߯>{?{+RGj7H]c .%O~'Ţ҂g=ޯz6)B7{cc[^wG*XUc=$4n9'2/>{3t_ s2V b3a~\, M[" S<£*J%kx8ZF$7< + Rc2&N{VSw;HjU~*I"pQo oD;%s회y/p5; *lǴ]LeK`',9D.O*4ϕZ1el+gkK9Q8!`Ejl̀B. ?7;SOg&,h[}]R/jP1CRRE Uvh_#vi*8{sPY M47+"nvidJb h>:CQ~TFՙP|щ4h!x|/=\޴ߟ>{),'nWKweY(z?z_=ܯzKvV{kz~{. oZ39x9vhW{osʿ s~NBUDx(8 ngN[[us?54~\3nqeU3a0߽,,2}K)܄G=]hTmtىݥ"^>p&pbW>#H#XR:FbR^ 7p԰uۼa5%~ӇKpq''mVd X#+rӖ[ڗ)9spK^·tG.§{X(\s$iqBµf n:%]ζQC-aXiR8xj(˻8nWG~앛;KowL<@E_9ep8( #Ш\q7! PrWDsoZ/Kn{>H,Ȉ<]WxhSwۑ2,6bC&}t4h/2KާB9b(PvkL@r zl[nK?Dj e'vYE:Ŀ~ {܆艀;\ `ԉ;#]FbLĢ&tO.~u.޻/A9:Q xl{KOvj wq]r2';Z[1 N]w#~.vXN\7aZ>ݶpt Dğ &*搻Rqjuo:^ME'BHǠߓF tmYdySx,ZB:Ch!E1hwnD3ZO/{;+2ߺ8,sԹjx}W-: Rޠtm{Js#x< 醙ܶjY۽Cp#ܪJ+·!Iۆf47 R1hwYw`/FrO_$X¢5ϾpuxН!Nˀ\Mhu#?h'=env盰zBuVyJ >]uGbS<`4[_ֳx79 oWhC@; g|PNgO~'!C3{:]-0|z/5y;_^S 8\}w7݆Jw~،5b$GGOrz_݁VbӷG4뽶៖K~0S0ϿJ Edz_ +MAl=L xP3&aIp/{]Pq/f1}K葤˜Wαo(qI gtPV@ a\=xb+& {zB$ur(7*sRCi"2uB"2de$.uo75" b&YߧpNbfw c'/5zשuId&WSlvDq(Zp&<#l?P*:`$viH%޺31z_K JH0:<@#1cɸlxɫdn wS`U1S_#N"c'rH3Xb戁ħdbj#v_z %|[Wa~2MdhY/f2~uK?ɚ0?2yDŚI*?3H3둕#&.@?6E_!Md4 HsHL5u=3Edt׳Mc H_[缳f4 D1¯]_G|+VE&cGhl;8M>.{]1ksȨ g6 +I`= ]<벙m`ޒ'TOz_U"έ佩?/2 ffSo~] etAG!K4w_o4H~jܹ$N噯?dj Zhn)͞E2 J zcGvRp`v7C+s0V?yu UOg Ǝeh V ե^TdDدRpkk+7nQ[G] wZ~#P|I+߷DXWٵ?fQ˔17/2^"YcR -\BrJo`@tHKZ 'Hl%9j`thZ54ϐ!F,&Im.śz #@ X-H4;>K_[!1(q)*!@ {|v 1(ߍH7^@ _v Be@ @}G,yyP,[ɳK9UW5KӞf|ͿL=6 _x#OKʗr{?Ȝi,@ @,C&_(!A✮`'1ӨSS=xZ}+`glɊ¼v;. ]@ g=IV_x%7vk<)R +bԍ}m2ӓYW陂p HcSey'13ƚSOEzJW.Ob5V _]/$Nʛjغz=eZ1!+[WfUeqdž2+7d,7$c+Fa!﹝ؿ'7I诜؏8xCSVJ:'cX/Qz2Á&~dD. 'u }h^,0eƕ}"vFr^?:[זIESFrfhtr,V %ոy|S&vrz(S mė-@1YD7dcM\h !yX~~@ WG8  ?% (I_a^G8ۖt;,.=IL^f#Y}fP44xd,f+&S{:IK. $P1>EjGyl8wO}S~ $O5xJ=tCfsMB*XUc=$4n9'2SH-@hB[>] GT$O]eAoo~?A|s .K@K[=<KWr#[?*xqbp|){<2 $oQ($"uLY2  IڗR+@|A"=([?*L (@DzP`rb8Yq'8 yq-;u{0Vhn|fuetN'Z^^x@@:8*!e vWNue9A[qx0 h= 5N#&+fQhsKQL_>>EM\Px8c;T "Cx]*wZ|V6*$4+oK@ 9W=2P~Y|ԶxF> R;|iӳ0f![ț$ҕxڒw2KާB9b=YIGdv5XƑ*4Jp`|UX8$aL3kإ܄AӮpbzYN(u*Ԯ\^&\!hԪ? A.§f*4a!\kvNGyї#3 C(!Sg6h ]hN8|etp4{d|&[,ǫ{_wP~@ UBl{CB Qp͏o~?Wa56m+:.Ht$6u_=Op8Q놢gRau"xl M C9yL'찰܄ cP˗KNz?LӇ8XCY2L^֫#8:| z;Thb|r8SHGK"T AG{9gWʜcb+i<5u#O?KDU~1 8yԇFdSOUI|Ba`!tK-1xxdb1vRBVdNsdmYMcYj@Wαo(qI gt8SsFعt[[C'b oh`Vb$viH%n.rҫdn wS/S_bqkK70hlKLLO9Dn, =4 LPJ`5C2Y70A-9/xO|r%Z"C'h2e+SG)8ƋX wCûn'-P}7^MPZZZuO+?p;-wy߾}_WL-˓|8 @psRRRn z,/446;1{ aT~D+7Xk ,< 'w89UũD@ A_'D <&.`wh(" @1,@  @ @ `@ @ D,@ @ @ @ @ "~5βuޟ<ɮj=ԛ3Lg6榞NˉLmVb qV"*5Tw-TXޮ o|,2>uN(|Vd}vV@ @T5TO#k!9;y~/8X[0ʃOBN,_l ሙ*|ů($m&gFrޢ|7;7Sb8׳n IDAT,_~v(џ ՘*k{HbN]{eC@ wTU}>.kZOwH2H5̮Y_Z!aLj9fzJ=s^@pSNG9X8Nl%d@G>.n9#ie SC_roȣ8d y/$~vCYX3cr %wuA4;8f(?:L~r [1T%CQLq L1.`v_ֶ!$gcyD&uN6q1o2ol8@OY~l0̧_0Ή:§J3GB~b#㰱um ;lNT?e$g 2+7d,7VoN~o~331.kb#:|njQV88X6x}q?y&Bϲf4O1{?MT}}p+T%'S 7z X6L4C^c@+/ai'^eE(4GR+oK^W1N >c.G1d- ;%e̻2s庑\|gZpv\Vdjx,佰uP.U4e 'Etk"7>QXM㯘^#Ϯ:YÎl-Dy (PNM>Jၤ&1$o+Oܞa*T+GjY+Z%䙇f?#C.'wY-}vq![ ;o'ae*k0Jvntq,u&`7ođFqFKps%s><)K IV26(Z+tbl͈%2qey|܏7R^ZQ-+MG_4^tƏ?(":A"t baq,غ8(1qڰO )H>GPt j(7Y_wK7S\l%R;)_Dذ4OdŻޟ vQ1c|MB&>y]”(3dX *iA%#쳵:E E[63Z_d'LH)Ĵv;bCR,zmǎ{U[mjpr%׏ߎa![ȒT]~vQa,LY?\i 4=vWƒ ngo v={K #W?|}l巭As|%6 cTSqdUw2uwQqy$Y:Ƒ:;ʠIYNR{ X8[$Om}M-u'Ey?D&| aj0 U? ٻIL m@F8o9}ڀ uV1>EGGV~AG)Fx츍kjzՆ{Hʼn( F𸱜 ǐ5P tlÿXת(TW;ٽk]4r[`X%dSP H^ٖS7ezH+ k'CL`)/1yIDfOJBk:1Z[ -QB5אmǸF{뚾|# WG>*_dWZ9&cz!`ڊ-Bp x,yOhPa|9Hd`ǣ@ Z?G=|`-׏b5a*.X?A;壺I$ߦ̘-ԠKCd?}Ó0|;L69RR<F P І2X- ͽ~@:2ǎ#>`0 醲N;mEʘV_hX9Hoe@dr` 1zoC#Xwp$}|s,nZ;NbO;\':'+4$on|fu蚝NzWc.2%gh@weHpEʯQwPи\XKT؜?Gh#o:%t)%8;TķAdD]gs=C`e~R1c*ζvoFrv =܅adL 7qv[3~Dse],~#&+fQhS ÉVTlh.ٸ$cmTXҠ!'`#>SZз^s#J||2r5yQ3^&'K pNpReApuPvTh-=wr۾TP4\i#Tch{F"< gگݫ/N4mmކGctc8\LU3M"t<~p"+mp"kd[ހ7=zg; =Kuͨ=| =P>_ pg~{,9{7 !h6MϚYl!oNHW=kK>GIA!hBePtV>Pt5_` R6QG$tcq81)/8jغmBGI氾7ra!\kvNG4zC)Zy| e[XR3 4LR(1oԙM,ZkBW$+mAL&*4ʎhN7XWFmT>̄‰O"c߷rB3Hʤ[DF ̎|Mî؛7ps3N룘9GX"hqT6ZҞԝ}, a=Ϋ9spK^·tj̮fk8r€0jv}W xZ]K=zˬ/`._đg`w9Bֆƫ~Y_Єۜf}!t#۱Vq%Ib/,G2QJ ID2%Bwc GZ2z=񧪩8#99 Pى:tC[U$E{[v>A=y'f E٫zJ{=|W-j RI ObrB ] ^i—T5rO g+b^ÉG&uZCfϢH`\X?$Lyc>?''Q%;d}ry S'(?CÑ]f@^`b(lSW{HJ#I51`9zr^cP` ז09'n` I s,J\,1!(M:Pql=Ƣ0@cОI}j=K_3v++FKȵ}}0·#?#l?P*2"9y(&5 R[[C'b o!=H3_ 0 ܍Q:ψbY#qw؝Z=fTϊ-Fwnj}V/'㲑%c6e9!Y$2VOzb,[q}˧9tL>ِnt'+LN;<r?JFBxM^9U?l IA{gkxFIt,z{b4,dm­ 'ސ{ 'v/@ yOAiii=) "W)nF~/A˞[?W SxˮG6SMN67_#${^3,OVtl5Lbfr Uއ9RBGWA@r&QkĩoQCcո?p.>܀w+?]x-ؽ g_+RBj^c* hTSqj(aT~~}z2)x?xj@=*YLWp25i_%BKfp,!x~x U >sWܭ8ZD=xZ2!M3f7ѿ2)b] >VbgMbfVH JCnwØz+?&Ӓ 0c5{2hbHX,} 1{{`:f%@ K?%3@ \\X}mZ&:z0=ͶYH @ ~gȲNiWp8!I9"@ /9dPk0Ν u {,7nqf@ @ pؽ˞B@P.7n @  YvP(nO"@ AFS C 4{DSK+ nw2 |_K!r@ @ =~~ACxus+V\7n}  / ܭ}f@ 'qnٟa=&`<Dqk݌k釲`ìmK[# ~?Q*ZA/ߠ`@ @ -^TK؃6AZ Zy  sZ@ @ ^!A`AáA<bׯrInYCAhՍVN"@ ߇z` ܐ~ Ֆpc`u@ 7 Uoo]j+#^uZW @ 2=wV˞n!_`?16 @ .!fo d>lrB]BHB4|\eQD" %^ۨ5VQX_ A VIk^kcЪ^! :P7! Yr~MH1C˞={9x^ CBj8ZH@gH(`XyZuDhR(_8N:q F{2ݴ&H|qqpDLU𕛀!Ί?~-8;]g eA9pݎUHDDDDD=Bۨ*LrCLMvbLHrQT~u7-Ņl; ?aM8mN/[T̃}5G Y?kL>}vy8c潿*D[ޭ`A]/YHoϦY3w4ݼa[?a^L k|}mpdNG&^΅5'^U Wo>aM93kظ{&j:6W1~!;fG#`^lGgC#\Ɩ8۞%?t_M?}M2W p/Tu_+t&ͼE;$q 76&ݵp̺9?|hHHIAZ-kƃE^ݶg IDAT>Y?\G~r H({{7XϬ\.,hJʮٰKMc+~ 2L1O]l=>afcGbLhˡ f=^V h nbރ4` u#Z1a~Bf?1YZ}l\};iVQNE v)=I3GԆMNLvweng׾43u@cȾ.XGr}6zܸ!ʧ`]yjL#5O^hp[y*6zpO5D-"}y69nϢ1g?%]nzw&ޝiȼ3ό>l:P F8] z @@KٸibԱլz5i,Y"<ۮK,Z!է(~v4Iskpܷ?j U{Ѻ%m =փWX ujb׻G>%_"/.g(~28U>e`6f=nd(g~s[#/x`I̖(K+_pߋLɌC^DDj`먍u7o/q#aQ4l>g2&^s<7\rcC S\=|ل7R5kn {7/nk{4/`?TMF..aS1<GnXbt`da/v6S.eіrx:>'w+>Ѽ '>]^<>/d&Yt&%lxO@4V>Tڒl?uͬINo ύb}EJKp%A)ZtJU0zE@?(7(g*ʶGm/xZySp1`@e6%\ 0Xr&Zv-%.‡G(gys~-\u$q6#kZE cvyWsb&fOZ22%:kʍdxضkp:afZ8vslEJo6 ƨ/vD|̿e.bn{5|&`3n Xۗ?PQ<@K+- u4[Zc? r6"JKci`eFgp=5!8Ә>ƀB>nW !o7@E3bά|~Oثϱ_W,Ԥt;ӳ/r}|xtP]]7{U֔îR8B8q6yc5Ru#zSľ-9z݋ F&Vk</"" d#}>݌ĺYm=KM?ĺe~cbgL>S27xyxxqnt8n/5D.w3y}_#>8F9>Ng;{yk}v:N0bϼ.߷˷GCN)Sp29KX/ׅ˾@CGn mx | P>u .pG=O-c0,L֑d, a Ұo(%Lv=Lz z.p,q.V:ly `DYӆ`f86݋r/ƾx1[8ݻ@DDE)#ɱBC>zϟ|Vޞ|#q0<{l| 9~O!7S/"-֋y(xWcXP>f>k/#HH2CXt%6a3%b5_5gr*lg˶5A>Vityg4ز(`e)tcQG-α g/Jg/Ѱ5qήbWyOYs&>yV=R UYKk݋ 055+͔ Ax>:b阘;ϧyرdó?>JCsx;_dq?93A/;VvnDgi4yŹOsM5"a>'y[@޸g LJov>RGŕ >d< hfd& zv#5=rt!)lvG'7tǶY7*9 p_p?d$ Ͼ:j#=PB݋Ͱ M-"rM`~R~l cÓKXUP ||3讞 ;?K̚o'ܳ^l)k:Y=cUTta࿣?smM4US*sl5ZinuWTpg8Mg[|C&0po,]?֖{EGta E+:vmVO#}#}ywم[ng[ g>S.67ۉ+vj7twknجl72|m{8ExdSn.)oSMu`2)z1[v%evyH.^_ǴtYzb\z=yXs%5lL_g_Z}MpgQnby.qtӼك;|'<rLCа h-w7`҄c-RվԱ{||ڸG~%/;:B?/8=F|7ɖ2M!gx'Gm͇8*&;_I2) `4Nc4x) WIff s.p,%fL|~}{4> Odۨyg`;@m[YXmֽ8{Plva^DD j9⏿nNaVl'Sq-^kB?;761;bǙ5!VI60xC|T-Pf͸VKѩ;δa;Ǘ䧅S0Aj0ܿz9gKjf]{lw2uZ}zч>-K0b9,1~t,k+5rÆ SŊ\C:>|OW᷎x}9dw4tﭞv/ZٸekX.(Y%aW,r?~[n?\]h\{[N'q-LuuVxZ }/:r6x~upQ_(!""""W8#!#ή_].ueȕ#cLJM8nͬVv}#G/ä;']0/,0HC'[w,䶻gk}l#Ք. eKxC3mbVYw`Gp c 2I=ێ8U? l5J~sJx:SRZ~ʲo';ȟAsn.<ǘ7.cOe#({4߰Œ*gA>FOO*F=щlxw,b[`&?ԄPOr;6*""""1xZ,W|OZ ޝӐfy7}@ŻA&Z&odjIMLN!iLJ glL98n߰f?*~ĒAǧM_dޜ{(y(;Cɸg0V7YVW=+cGuxbNU⎝^:c-ab];_([m p:/ :"""""gQ H_vev-}%SRhS'RmómU|`X͡ l"iPvvշRm;6^Xry;{&JsKsQ NChWflyc;M@(=Os4yN'gHZν&93 5 -fHo H ՜a8yy{(*U,vrxh=άì _ǢcG 033,h :[W"ډi:""""rMD&۱L\~6l*VDDDDz?~[nE| ٯc`6(U*n@mvN]tGg%HžLCS3m` K Έav-:X]ħf=bYCSh OJjz:t8ip=7m9Èsk23vX$L l MA#-c?-%A\J6aCHo"nt_+D epB@{ CH n3D3j3l$` EDDDDd`!0k68 %4qeH;tc?s RG~;%B-|"iu|gXe;ggK~ELfx֙3CaI$/_嚮͞$"""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","4n_#+^U ң-U KYgP8\G_qyS%gY\}F_fO|~0Rș8?+"^EY\j_]Lɱ\DDDDDX¬կ3 /S‹muRgX{cï?x%ʇǓ+"""",2p&^ZN=Wk61L0ʋvjO#a՝ɑ=hh6n,.kc@ϕ32O0V'LCa.Xɟ2:::0ȿ͑lv|x.9QLFĽ'Oxd[ ŏ!r>P%Æ SŊHǏs-hk~-mȵAXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEJV[YzT""""rī DUgyv,|gXQYvV륈5Ǥ߱K ɢ`'[)c1.+|=qwuرOam o{:߈ ՛Skxo.)@i0"7D* ӄ? XHi=̮|4A 1)=W6ݸwxP.\:n;՛ߡ6Pm2i؋Ԑ w#U4M,"""LuYih/bTO[%?a`$(~|9DC{LH2`.yUW{h2pgXz矨 31? `;h eU:4}ws4 \#^U """"""X˪ZEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXD1m)>G ~χYz\*}e~ۦ/NDū DYmdaOP]|Y|Ճ(ȷSMO(zG̚kA+S}#PܐzƊQe|ȻN&{[A%[5aԢ_du$oԴq)7>ae^#o-W^cc6H)r"i X^**_{rt^c|Yl+ VȓoPǖͪ}2|)VC~zcR L]""""W1yYmY3ߠ µTag9^َ1M"a9ʶmL0=+gVY'M^ ޛpO$WQAߣxC5<̖u/|4m/GgxX`M(bu;7Sl9; \w=ɚ cQ;c[icO!$o1eR]5XԝLJ+(73%aylvvj<[蘑zaț}&d0\o7ȢQh}s7ͣfSXXCć}vh;՝\_KfGu{$FYv! hx56La')qP9vҩXdBՔ=3,9rުmb6Q51ݬb3h0 ֶV[Q {6cF)-ߍh"k߮#hҼ5mqE<8%<WQ1[TT3pXdM!ƅb8]N/vLp5nl4X@~c2NNNam>o6h=߾:%>:&MȀQc̼s2||֭ """rR @DB?܈_8 c|;~#H|Up#uZn먃#0x(%};/3 ~$y8*Դ1knpBL'US8Ϻ?3l|rx߬Oirf[n#FbQ/yb3.gȢnrr=i;ྜྷy79+h8 g^dvTC!H&ٰ[6om#,҆8+` iq$`pks `bbcvA&`&o`هgrR"(_+Iy젽Sf!nZ$  oUy}J Y9lyz!|.ByƷ)8 IBozvշbq%0`OfIXʓu֗{ttj%!+apA3"{ F:#v'3}Y팰AkĠd8N7vl9D !$'\=u8=kUz <6h 'fZL٭~5־^Ai7j7լ2s(|[Sdzn{).5 '44QcJkHd{Ҿł8W%Vw_% Fqe:[koGL w%E7<?@MX&V,đŷsC4_U8uU>YǤX2O,t{19Ψ@Zjs_K&+t ;nzҟK8H|7Wʿ\NGY9^ [d>drr_c㫿aC $&q㶹= Jz#T^HL!cocXҨe rMMniQ.,& p0c.Ѐ H8^ձD 7BRJG*ޒ&O/9gڻR~bcp{ڰ.u`dIξ8bt<S5-~ᦔX @g+u 2IsM59&R1SctOE;Grӄ#q(Vx8TJ b7up$X=BS{#x+F Vϑ:7DR[H{Ȉ->PK:Z;`gXP#{`ǧ׻n 80wYtY!"""qƝT ^oYoJd46yu_oPKgC'^_IVpa@7H#іp/5sGnq?mm^BV+v_= ˴lXݸC8wp2Fc6`V,8箣8TnJs:nU|jPMS}ctRH p.4z11b4v  C cph01r`v;-M Fv~ #$`8!!C8 FL=¶t՜h@b.C+`NHgs3j)A~6:vL&C&0¡0@G H;vK3mmy"wQv.%ڄN/8 Pxp jMֳgU""""r2 .Qo{GW60%V:~k0@-Q`0c popOJ٭ v~ig/ @;ֆ7DllBቷ`;v`}B;t Æ 08{lf` f(Z}thJdЇÄY5Z"ҏufKKy|Yypz9qCk6 fu`CIx'~?.Z–2Ț>E񋈈Ȁf uB|~bcp{ڰ۬u&g,;3k]v5n^Ȅ70i1'w=7_aю:xi h^.Oe xn\bWX=ʍ3-w1ٳLH;Ljz+,g~m<=I"񋈈wqƝT ^oYow~}~nj9 h駦 6!MeS ^{݇zQs= Q#HYƞwױIfc0^[ͺNZ)<64pn.~ P*a{fO$zO3֟.յc'അ9a3-!wTdOeϖP _`+sDVyf\2y"""",rCDŽ/7v%)UE{X`wLa#eI_>qUXW6{bF0 (&**\}#˾_M9G -Z`q=YSXm9u!MIC>yht^?.4_ڱ1|tz߫%sg?I .S<~pt 94ևF7`wUVL b'7!g-_Lɦd5 KDD#!BDDDEDd JU"""2 !A-+݅&`lD>6ٯm sO)T'/{"y2XO~Op]~>ƺ(+^JwT^?UiO06 &b5[k=a򔩌͞ʃ2jg,Ä'2&kӟ_s&2澮 *cT<-` QfE 2 Ar5}|uqpr}̮ %Iw1THKR7ߑ8:w(NOVWϵw?,ciA<(溺|7;a|?qkeLL8?/ǧXWr~~{5{o.p_xQ14V}MYE33e2Yg+/Ptޓ6;y<~f %@~|VNC#HևuhSEE|BP׬M}1z&E\&/gEH~z3EӇkobyxֳr?mYe3yyZzyrsX~x(/^E?P$9~f=˦,w<5Lfe;)~_Iv 8̖߼#rqz/byk,y <=-^z3ɲ|'%?;@ˌٟGsյe6CTB?,vU5E,[ZĎ`ԙ̟8 gSmV_Fe}QI<7wc{,+ϫ;JY3t0[V]lʚ‹?͟,W])OPAس 4HJāuŢϒ^|G&c'SDD.\w֙z{|e-QB˯909~fF.WӸ3RAlOgVbquf{`3Pu'<4Uʏ̝ɤa@,zcYwۺks V(obѫ!ٛ(s&f`?El2e +V#ۿnh6;7n/?5ʲSf3}kYfx/6QR's w`wbvax^κ׊?޼eiSXƫ,IYqTVfΛ;i5~IX⒙Q&:,Gvyٵ?Gdw;zE#*%d ̨3@)+tf=u?cb =a-N_{(LPS/6&L|;!t֭*68W~S:?u?cb!yv5PYy{da<&6ku|[ q ̱d AUfm8,#u8tvZ}oSɜU~v|J)10R7QZzɱ{pymdO%{{%Y#O<Q-HE#`dxc7v&m]ņm yW-~0;q{3!'tx[^p},6F\LW}Dm]c4SV:vwC`,Yy k?f{3Y,}QFY^'&8`?uII (Ʋ7?dousWu׽۷^#|z{áOݗ0_8[~VM/e4zkf[~GyirPv1"""" "םtFq}qCzTO0k/ a#X:1d|IO/8f7BkeՉdZǰZ{ 2o= 6Oc}s?ܜϼ7}(o{)| C}SXz?+Ɵ61f6~>4GTu"wfn;/*fw=,}YƲ6}>˻p ˡ ʛ̌J>O${Ϻ:^9er6h=g\SN֕)5'FL,k)sZӿxE.>1'#mGIVl9IھC.&eh2`ڝd=6+w9gHmf]`Seůk;t)]Ocخ dl֊?˺ӯ)~1*?[:83֫DO_XAo$ 6̦H^,끻 [Ú=ԘG}PgwI1?CkSP)Mtw fL@].6T/!jv7]kwo-h?ƲWKDžwʝd%yؽqS׭u~k51i'f5%{deNjd8qLMm5h:jjht1Sy\.vo,dkEDDDA9eH)#=`O%~G 7q{š_8k%TL#9س$@&o(zm=k~yZZ3yv5m|"({dt=ʢXv=stHqx(Sm-kp/z\KcMdYɚY~c2(ڸ9nU :I5%o~19y&}| fan)8R2xrPGYR3d~@Yd'بɽU{Xcrg0;;bŽqG%^f>zO!4^̐h]̞ncwr"O/`Lhs: g~NJHݓP2a"VY_ gg%VD%S (<+o(**U)G2!'''7l|aYנ}?xU}ݧ Fklj9 h1(,ɯ}֏)zs6~ (SDDDDEԺo'+ (SDDDDIPg 7 .6;= ͪB~/?sٹ_Ѹy!<¤cNz.L2ֹl<8'? x?,3_g[.cbgf>{5a veKS8SXr .*_sŔYbMDz23]l""" w} ӃJϷru]r!"%.f4Y&^n7Ú}^oz\(xwK u-.dG~҇5ÆVӇ7UaTl*LR{>sQHDj_ͪ4.֊M1i$'1e{tse5IX e1'O06{*d EWU,gUi]W@ɲ_Li YYf{fOd{X33SyKWގϋ;e*c2gK(ryN%>619?%mT Ld9,*"|\k7⴩{Xƒ /`, |~ "{V.汑v'/fwѰO=-q|V.F= !3ZOe8h׳cK xTeeAޣpW.pmy)ElRϽ'\N)""""צ} p0T _9QEP(/.AŻ)\\H%&PAlu_@ @֝ܖ?ts +?3r6gKɲr\ykn>zw51wL#nj^**yqfѻߧ)(Z:Z2iqQ֯q sbQcyѱ4x}9Kf2)(Od4n_XKVte1{YVLxaɺb&y>VT4Vdtڽ> ?_̄ -ӞŜPer1ٓ^H"""r;!W8pI#n7H4~F\GwX"U>MlsJaGp;6!{du<=v%[8Z]GTJ*?Q鉽__,yKi5g0yj&L,Ų2*B!H~d ywCg$u\Q0z&Qxy4ǚ#Gt< G_Z]OA|R+Ȑqqݱ)JOp5svb0y,JQ1Pe:2'c3)5mV_L fdL{47C};Ɵ~/gqo?&KCDDDDM%CrV.)fg{(zu >!#$+ ~Ef{m_g[_42TGKx0g6v)dlywu 6E%_Ž)XZBQk_gѪ\s~(8kMs/׋FDDDDEK)Ge'Kw %;mL/{9_?n 쫰D$_Nkq2 tܸ'5Άk+^HA&=7 nL^>[y)g0yrdҰc{e ǨY.|n>n{j6Tʊ*%#""""CNNN3ow} NJ Y?_{]v7nAE@_u{6+tf`kC3l;w/i(pjIDDDDR(\9yft (((((((( .BU "2B!Uw`0}v`7 06˝1FזXp w>رc|>%bȐ!1BAXDDEDn[oc۠J>ByWwnU]FbZ{mQ" smbᘛ6A˷zԻ1}Oii)DDD0j(TJjjjONNN "" rõ3L;h>q?D9SIl104D3 wr#cHIp"\0b2Gcs8u1=9;`7A5qCΔdGŹo IM1DiDk0cn$Z'Ejzwcs* Z߼^G UUU?UgJJJW;\ Ȉp˻LMG9@gg`0E#L̏~$ qL+V;H iS|ۼt"/yLDFYD@^5"׼P(D(bbnV\aur{ hjj`ԨQˤ.lQKe#(Z"CH>mUgHĠCSO] yOڙ|9ԉzwڬn^ڂ'pm^?QV"qf,Bp71Rr|N\'2RsKa}@XmXMn/vkw0Da wv5t܃A#vbbcqsCoxk;AV-8q\U0zvĶ тj&YIDATxOOo'?ڛ=v1 `lKGV+P޳hG%"""""Wz/P[÷T] w u!a&-V+V^/! ц ^o;! f'b0$ ` 顭=?wn"CHtFa H[c +F`&""""" OG&lclXZi xv@t7hlg;B&# uMկ `$::!slVgr8~ѿYzsLMW]ƺw?d?X&MƄt^"",'C [D+'|Z:;ܐ?<\1N] f&vioo'd _=c?ED:!n](s2=eUAM2U/Q2[ZM8wgDDAڎ3 [9arbﳌHlv3'tS0a [/"0@ SBm:N93Y2[y_ep&s#`Z}3?9q}/h[~&q+oep#[>! RX cYęܼo`[m?/.pb1.H6x(/)dF'qdf?s?,]\ʒ2k;JJ'{ f=0(+DD*иbѝyO  fb3 =z:1;Ib2߅sDAXKPWOpӆ٤6quRVjU0$-OEVq~qgL;  GC29M'G_l ɑɿ­9/q*fI9ya%ao^ܯ\aiğ;LIyߙ)>OCIn{GjZܹaHʙGCҰn Ħ 'aҀ![l"ˀ䛝=0Hu$r bUc3V}2Nf~-_iq?dCJFX5{O4Y8-#x*ʨ 8o5x]o>ߜ%3 =LOP#ԨED*P ,|JH% lz|)0ql}+{l}u|/g6_3Gse$""WzEDʊJ73e08%4sWX͔y}^U!Ni\Sm@ t יtvlʈj+h /s`I%=|M)?ɘ,-Xɖ $2<4㷤qk:ì,6M%""WzEDh3/߆'+s3+sl;V9 E@GUd-ca}ScPdA+_yD"Z %-~",cjvz}Hs?<`䐌ɤR~9^.=.O6 '>½1<]|Qst]9=DʤŖ7W71_Y |g+Y1^`^u6ef+sGjܦJT 2Ԯj͆Lm u- bYM܇!C3}j;Xlehvu{F 3nՍV 0t?KWaݻ%;''7/f83c&ŬRuk;g2gDcmJY='t֣$<,+݅(qQjQ d?w""" ""r7KR`gߢQSec㘿=mʊ?Ŋnndsɝɝϳy(ٳ=|1jNDDDEDDx1W$f&-(8LzDDDDXDD [&n1Vv[wah4](@stK=|wBDDDW`ڂk;:>RDDEDnP#̓* :v@ˤ.VDD'],"2@ Oņ~B𥷉>{ _퓖Fss3oꫯWe^8--_ "" ""2¯`EW17~~Uv%ο9Y}]wEuu5uuuV^&7tYYY}(a4ecwxvl43*XMDEEa4>of~*DEEt:6lXADDEDdHF#F`P( FL&Spw9窴(Pш`d2 W Ysm_C>WDDDXDDX PzADDEDDA@>""".`k(S0X>K@1N.nqg.뱈H/빬[r%DQQQQQQQQ`` U;(( CgDDDDD%EX!%""""rD ' —  ]\"""""=7xf=W-+0_qHWDDDDDۙ5`(S ,"""""","""""" """"""" """"""" "g"""",IV"""",FDDDDDaEXDDDDDDDXDDDDDDDX0 A}w`>; ~GT `.;q>O'""""|>?~Q-E媅oVnm۶]]e`Pȕ͡Pe۶m#33{ɄbQe܀^/@R6oެ{wUrrrB|ؘܞ66eg0T^Fgef{wÇ_R""""r>)--w ͗xy _חƦ?p˕;W/p(cǎ~`ejZB+ʕ,f2?*\ """"W6w"*4\Հ[/ Bw=" r]zwEDDD{XD Z{omÆ8jpKPwBMu>,Maos1 aq.P=mq&0|(ZǷ m$5y09Zk9%p I{-* \?]EV`{ސ k_{`f5]\#-X!!?M՜LD;aj""}#苺`h4]>[zaJ+y,V+Cm/v}mk"/!$^OݴuBn^IY !I`CPDDD̗{r-+mX-zm XlVL@Ms >!H q_iFΨsl6|A0Deu!MG8]'L\\CC[inu44[8l:vCqk7:dtBF39dw ?LC[hl4%0,$D{ijiH")&Pq{` 2ڂ#&kDWw=5,Ni:ގqP.KZd{EDDDz/b]wŨ*_5l @Gwl ,X&zh͏)z1hhL]} ގ(';#?vM{Ќ}P ֈNM5"lأMa1ȁ<`:GGhw|zOӥ+}44n4c2 p7s'݋m-4{CDFã3FЉmbaokOCھӵ}dWss3nwKq3l!8܀}I.ʪcYww> tBBSEYZ/[**ދ7O &p~9x9xNO2kb0ȰdL {l>e^=y&y3WMW̓ǛIe~ٝ\Uy`N{V2ioSMƙYnes1tbm=۫c1^e`&eG$M{/".P&o6j5ӧO ?qa T"Y NV'SsiǞI}҇VիyʥEkM](si/uu}Mcqi1{yd+؞U^iV.'o$W.}6VuyeZ0^ϟN 8dzIƓ":)Ü.Nׇ_for.rrsi :̫Wezl)G}}u'rMdz˴$N4e+IsqTNj] "=5 z?–m:Cp^[OsvϫA2v 6roOo-I}{/,N/k>˼NRt>ZOKNn߼|MS~+4ӌǧdz<"Izޙ>t$uWI˓0ddu`sM믿f?~?Ϟ= ܹ}uW$_8Yu'i~^4qn, {lYd1{^.2hWΖ);c5Ӽ˲xRIYߤM~5`};W50i_^Z,"):ue/Md!mFz3]3LHVw;n+xʽ3S4ǙWIk}Q"UfY].(=oO3]'N/)&ƽ^/Ϟ=" ?S|3!l2{`D_\B@_0_!+DEMzzfA pwW"#:@2W"ӓmĩ@d a/`R7!`00b ;:Qb X 1Q 0` @qXMpYZv$ ]@`0` @ l @ ."uIQuӤ, n\."rv-;vE担`;n,tٷ( ,LԵ ʲH`OQ|]A)"kN:n& 0` @  0` @@ 0` @ @ 0`  @ 0`` @ 0`0` @ 00` @  0` @  0` @ @ 0`  @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0` @ @ 0`  @ 0`0` @ 00` @  0` SbHx'x|l$IwݽS$ɿ6^ WQ&Fvv w.~G6 ;㧟~:kUIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/security/image06.png000066400000000000000000002626311461403617600240330ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxu|U׹bۀ6%$% [~vJ~%/_PAftޭcH-a؃=9^~aذaFDDDDDDs|wFFAgp(`rssz\x^̙cCHMMg|>ObaZ*v ÂaX ן= >zukca~>LIZNvطwOo'/ԧ `#"""""RUX<պ*vTiYfӥ#""""""Ez=|IY,V Rmܡjb;n?f;jbϞ """"""R2^[o!COcĉXocȐA?/Zmw|4Ə,:Kv3/[,V9SLχQHS_!C1~RfM+O`ȐA̞=0_'`[R` D*Ú7nGnv69YY)Sw}/{=h>Ros~={g-\w~}*%n Q"DDDDLٳ?' % vkۋ~-~X>,RX6.{H;SUfN6 gZ~E*g@. 6Olb2zxWiݪIf >3TSNGNxv.l@tuTBg _fQ0[Pabb=OLLt~;3xE-Ug[ZK-V\_!ZDDDD᳞gQ.%e|SNrӰXJr#'*oc En.~h92N9Lҭj1qS⨴An3~[#CpA"էWȰcCyvYVQ.⶜VVA=1Wu"##O˺ζ{>>/j׺E*n5P+H)ݷ(jժU4jժU9]s0}/j<9X%I29w3^}PLL;rfطw)uƍN|<?FYlndl}dz!cU}8qg9IޒtuW*k6+Qa vj81t+9e2?mI+<1ocfKx!tn^jv7I[3޳3Q!'|@guy %sM Zfc-YV+HYek;*իq㮝DDDDD*S>rl-n*QcUǴ]ޘrm[< 7|&I)&}o؝<+|Ć8}ʓ#+:u Xs0mdytA[4oԘ϶1=f<33I5ᰗe+3Y;b%o [=ίfeiiSBhV jKe5i@͜X[3zK|xm$[~ɬҖk aɾ"˼~8,+>==4i߆~H@b9~~;۶)|mXj5?ϝSTQrZ7m㽁Ùi1s \լ1Al@ժbX.z#4"tyec%8i_mO$놪 #h;ll)_ I-Ё0\n22 'd,^_ a_%Perֹ἖OzvuY [ؕ}8Mfe 'ѿ Y_$p;-t*b*B*h|(oaU_>G 0_͂e+Ϲ{[~۶mZ뇞pcO8;w|b,mQ.ǎx_I(lž+!n.Id8!f&N81g&Ӂ'ϖ-Y? [I .fi,7aU4z[|m"W{WO7 bO,ug{܁4j]5 E-mm`Zl"#Le݁D<緥cTfy?+-)J} Oa=m-q """"\9En=ٱ$j@~`fLnkccDrPbcICFյջӹ{ ,S#w#3]N3ts-d^Cw``@V(cLm=qvd NK/őW]w(|! ~{>vSՙ&.>O+fK2.~Odvvk5B{y"v]cB˺}:r;Ɛ$]H.!*ȉ]I|? aU<Ӵ9,%pd\v;+rA~-nE r R2{ޞ7nut('L__ю?pL w6ĵv7)6hޛ_cǽw$X"""""ѯ_?5ٹh}lCK_}mJRF**yǩ5._2RR|W_?8`^ڧ4ftű`YAi?6.ΎeC*#T1(j5el@pn Mxx~ܲʴ[>TXF9T_9SuOgh9ZXDDDD2RlD*" Z~EDDD,RDkTc"X^e~EDDD2`ͪ\ l*He %y 5<"""""%aj H~[-N򸂯TlpDNloTT'(8D5%r 篊s1@ٰZ8Nv,rֱ`s8przLs'W S+ov6}%""""gģ֬V""""""rNP``JDߜf011M+""""rjjb}RXJ4M>/nxEDDDD*gvLJvՆa `) Nj\c&> ,bb1lv+VZYS~^nW߼7_9;~>|nNŕ{~EDDDlNgn+W!XXa>\n 5riNRxo̻dp]ޭ?-&'7l3((I&4_F-l六Æ_2rܺEDDDD* 薄ە,Ʈ+.L-Yatԉ*U1spioHǟlpQ.%oߎ?AHhяkGvz]kޜ믻{op* <&ШQ#lL64SU":so3˷%Yf vC3]ɒ%K|_^lֲonRSR %)) eС|ŗ庭r}d=C>v.%.%';09m[=w^%8$k}һO_F|-AAK\ݵޞ?S\L07HfvӦOcidfg18a";v;U%p~ <@Np=oՌjNu9SzAϞ=KۍY7m԰!.,,;3hP*ժ3村G#1)]pYY,Z]:kKp ?8g8jyBb"~611tԩLzuݻ3ϲz?|l߹՗^_/ٱ~>Ֆuƫ[3 ?N}<&Uw.}rn:yw=Bs4#^;c8eO~ Zo@-ZAT!˙JkZCՇ# d<.NJ0F5g qTV u֒o+[#EGEj?]V;&u֟: :i?Xpj7UV! dDŽ?@_]CCBǟ`æ <1|x2/;xbpƍ=kV!95hт=ȃR<#?#/xo`-#;G%lt޺~ }pm߬69:۩ૼ%€nu3waxL-zٓ7\բ]^ s6R?H!ݻ]6J:[r|HrQڵ]<CN5ߙ_Ʈ_zX 5ܥso0pwv+lbooń>c+8iRn'bc<ûҍp]WQh_Dr]ؼPajNk66JU]_[\<~|mb,QS' Л˧:?p?= ◵yڄkCPL}緥֚^VuI\LA^~^9ZcDLK8j\Rwo  jvMfuf 7Tiw WOx+%3ceBH`\%aahтɓ0ݫ7)Azz:E\]¸뉉}r3qҗJL8S P#2o|عfޭ!!!E.@Ν?~lf ۶m?&L ̢ΝvZ=!ŗ9[Ν1Ix6.4/D]Msyor0ФZ""""BC^=/d撙֭[Yj%V;ҩsBBByAA>}RRSqC2h0N?gњ^={Lz YYVws2 .zl RYN%^a9}W&E=,_1H[2hP2gӨƅFx=,:nɓ 8ONIzHтZ~QbO̜O6c`eԿR^ׄ4 Oo"p; 2ؒu8$Ydq^^08QCakWpC:ձ= *+#VuЈ.w'ԉ1K_B哘{,3ٴ}72}DDDD˜1rS'&%,b=Cqcŕ7ᓏ> 4`edd0~猟y#'T'>]_e~\Ե dged2~||< 6^:lشec̟9zZv+[,i䱷u<_]|YGďq':(@q5n؃+&oh4j#6崜OӨyuHYT j5B=p.aT&qoOcwad]^ tjNLy+Vgo9,++I{)W5\KǎݼDeu!~sZOdܹLg>9 V6Uӱc'ݍv;vb|e{5fM;oҳ{e=wo27v45k:ݧoy!8?\/ɥE1kѼ9]ڇ&LtP%i٢%5"O¨I-Ygٵ}^汫ͅtmb<]u?Mya[Dڃ-Hes(p yʁ$mK\?ãkzR/kVl!oU :>,:]rIޟD@!UtsҶ,a/Du>j""""%11!::rrs8pۙ7oz3cƌcyG;;yG;}F|֝rZBp@C_ IDAT~SR;<}q-DH-x{X6F|u-xcijϜ#03|>~^6|F3g2IӦMiڴ)wbtkR^//Ϟ׷/};D穋pUONl:eOЄK️D⟴Y֎5Q5;5&45=>,=,ۘBhtiP-/U8rq^n5hY'MI--,M'Ǖi՘QQԋ i=ry=.{DoA+e;]37h{=WԎM 0pWG& U#u BEDDDA:p!Cǟg8G/n?7 vvbmjݞ ?-uu6gnvSop BP#2wG8#_Ν/[` ecrqS&#=wGEJ=BQc ±ёacv|o>ͣOΥl:~cċSy3@+Os%g ~pᒾChI?3[وf)lqdGq)sǷy  #n;I&"ywL֛=!uf_~_9y˻vGs?pdE(ÓIY]$**(sjңGw6>I+޷ ;ncvQWS7oWKϞ=\\}U6oi9 ѯ_?5ٹc!e wF.ݺ=)((I&4_ǚuk,XwN.[);v?Ahp0/bK͸կOҥKUAY;P6m=˖-|7ҍV&M% Ko_tjzࢋcNnYyAԫW?.bނ6Hխ]XʟU@AhҸ 7`Kl,c73u4Ti[nol*DDDDة][lE@` ˖Yu:v6R< Xm6,oZҘ窼J(;!Sض*CDDDZɃ퉂X oQ-%;s@|3v*BDDDpU eĢ*8KNłî4Mvئ,ǰl8Tٜ@N6΃8[q:Sk& """"rf_L3m N'oY೐bszp{͕igMADDDD<îa`۰Z>i+K1^;6͎011uYDDDDB|f7 ŊbjU]`)5Ղj͑%"""""r6RHqTՊxڵ2MKvv6UTQ&w˅y_#eX-npN}z?xw8ous((iU`[N*CDTpm)g흡9ɪ)9ɼ u3Ŧ.""""R9-7&mglvU#ZV|-0qҤ"W H%1̎ՉU1R*QV;TgvtO`X*U[(,""""RïiX,݃/ χUIY,ʎnb^s%wQZEDDDD*IZf4MLTHD-E """"" Y ZD:Uq*TRE+EDDDDTD ;!"""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """""""g02s:s8;eZILLrtDDDDDDD, m68NL)hdl+jb(H#*D>2ku>lqDDDDDDDʚn$"""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""",""""""RΪY._]-#f=GREɼ;VK&cQ#(ģDװ9/Yg]Q>0Vm Owo˕.@xNy:}"""""" EERre wvm]au/kI7tDDDDDDG`먿{մ2MLDDDDD*a p;gMno iF05fНs)Eڊ|:m6%>% _`kk-Knzn\pgۧESc4isCd7w*ZHrc iH+Qȕ,!<ۗ|dw괅<:h -`Lw>cTQ^𡀤<}Ll]WHMzz:իW/:DPP"d-Yl"ҝ)dxN?xkm*Γ>w=1?,ewj.nGScn{¸쳱|4/yqAJՉѐao'>ԖGc^fD+ |AV%\ªUUVq%PzuxUdUtbE4=|/ގc _{}o, ^W8O"Hceuj֣Eͪ ytG֥yM W;G ZS7OoݹܺO^A6SP㼦^GmB׷HoF޽۷/?3m۶=e۷/իW&<<\y`s?+6%վ;lU4/c}nVyR۶Y$\Yu6q>m8?up gu[VX @zr)@7իg̘^xܲ/|NI+WxOY]vuflaBvBK'؊յ>h`-^%9ϧc馼 \ru)Bp=˙>}:]t9ŋ8p ժUS-387#mq8-8$X.E܌A6 fe=7&qSZMjQ_7jժѿϟ_l_ᷔ*O 3)ȴǖ<~Kk*@"3"v{<c-p\ϓ|7C-s'a杇kȹ"""6Hzq.g)Ktk+]DDDD+VeR<y⭉/*oHxAWg\ xŽvif^+x^䁷&__kx v!Os_1~=מ ?SvѐaC/(O[~{m1g[_Ң5'2pp{y4oIU.""""RI+<qE0B}yWx}-4ܞfP)u0g&IKz=+ODDDDDD*uso6M󸿋H`qW.f5M8ȟh ix^<Oޣ[fjbٰZ^׋+[rSuT!Gpp8ZGd"`W΅UjF+LDDDDD̼ؕ ;jv%R)[,-32ray¯HSǯ*FOZ[i\2#eBeV¹*c>-i[nZ~EDDDDD*:~U-7R߽Ǣ(""""""3~Ida_I&oTGWBU!"""""g|Z[EݱQN]]&ow6M^C""""""R}>JFLDDDDDK׭S蜉TJ~e71d▣o|ͤ&{&:*[DDDDcSfXC釟n;q{Zw:q/y9#ja֩}rmyvTA,dlp􅚸YSgҋih5)""""" %/gf)q?|ఇ44n/K!kƂ=n3pS؞rl{8̓`p.5;7U{b }ztٗOyF<|p:VJdrg?}qvTc|< wѯ9/v we_`ٝM/?1,+zdm4mnb@_p61+6K;=EDDDD+#+>yۣZ]ⓩ,\w$lT߆KMOc$fF=1u7L_&~#i2n"9jZjtYF=~_}mLE&FkƸN!eV?YKcO5+g1rOl1ߙZ~{F?YGy'/=Җ`*R4y ow9#h5/La[OOf</V'rx֥=wqg6w}';1ChnEDDDDfE.ۦM Gdg;k0[ I`~Dd|!aD{x.v)5z3Fo$9{?ij2[ϙt9E1hh[cގJGpyշk>5&ѽx{-3WxoA~+׿;#17чyͼD燱a\2b.wra#n/=VM=xᗎψb̜{=l\(3fR|/'%>嵘1)g{LXbgv9z+Rg1 q߹݀"VOO0j3im7Z5#>k|Ӟ """"r# y]C8*]]C1CX@lL9Ki? ޘaQeՖڌϢ׾D'Wp;WEr+ǒ-yվ ZI+2񟅸cMf[7GCny͂ŖpΏ/ʏxH2L,$~AhZp]2ƊiSd*Y7K[3u0hm<ؐVK/W j>'XWnˮtͯѵHAa?Kn*kUR+9sOO}9ڮu:^ϋwQL2Ysp?\=LݻϝNMfϤ* :2|/WC^BUoq{yh%lV5](IA&&6Cp,2LRv]KZ;v[)nrwA(xL\AMvĵh'=9wf*?AAF~w@}/&~xkg#a47!$Z^w?|͛'Fs}+ZCDDDD+W_Λ&y-V;boY:CbZ1{?|ЦZWwq6?no};.ɖ-I(%6IiB$6$""fe,Y{;6 ?b_y̹ls=s!V6F{ _?A<uMԖ\W$0#Ez\"PTHu[hqq =K)UdQ\A `d1z:MC]Q#fer$U$fm_|ʵbalޒYK3aeҠKz{WtyV4qK < IDATͩ&#,2TYR<ִ08 F^LP$vW᛽9XO`w?W?-#uhǮf,4)HY*EXw-aM3Gw bg RI\jGU2Lt`0>mbVrq#:=6E%4\ű>8e뺴v.twlv)I` ;NijxXv0xaBM|hoXA餺m/H[g'J՟|S}U6]c0~:dNBR9ۈhx%ùϻ>M8Y5ٗ0r qp~x?n*=5:+5My{d*ŝ'zps}hbѰuG{߄>4zkNfj] ?mS|lsn3ngOo|ޖ%N E͝>T{i T1*M^–pR)Մ0pFƠ~|5Gn&?*{ҽ?[ysE|7|OM_SXEzzg0kݏbT6-=|4>_ u9c=RG/'лϕ}Œe_=Wv͔rA˿lToK\1tf،z?k.Eb@<Mq>F\ jrA:K FD]zW^ꯏ 'o wnkK4e23:켿3_re TL@lOQki<-<ʥc8M~=`޲_{(ȵ|#׈'T"""""H@VjW13Q4m^:k5;3b7 'owjVEx* Q΍a},M:fSi,!\la'Մ5,*#>!9YN"ïfChi%$"""""r [!٬y6_`Jr>qmPK5&*#m`Er4cZl Ul#aE2_$a""""""׈>!)Ű"M)f)_lZ8Xy^`&@ozV͖CU jb`fΏ\;A쟼v>o_k3 Z""""""rmDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDlW{Lo6 |MM.""""dͪ1*TDx޵S u?к.-చl9a.7[o[W&.ɢeSϻ&f1,ɼK3s3YKKIJ=x?z;t%#JL+Q$"#U@ ?>Yƽ!Vp9 ^Y ,<-&GnjbRμ_6NwBC +~]c|.KN 3ߘ?~;CgZP*_]Sx8=6?JWcs_˺>0Y ܵkC,A/3㲲[[L oq|LYM6[.~5n4LG0aӺCtr?"hF1zqeU!VHNc8feZ!;©P`Ko1Ry~k1-v,~v,Ix,6>C}ߖ; Xqn;g9)CϮ !})֗|Tˆ3h>1<`:gU3o~`Ŗ #B⾞5&ѫY*r+9:mb4)`>mS"ysSgl&x[ޮ&f="j5gPtIk^޾ >S>_ehd&Qc NH<\`Jx5gsl &%,zb×](W!v̟̰H!}Xq/gsEDDDí`asqx3Q2,>!gV5<_X|Vyk.F`V7IY㲴kcj ^|wCm#_ ush?;VoynZ AEKR˾mKvn΀~g3S2ʑEܱZ\~f~t8' ^ϟfd'E(nwq`LY߁u/z/:R}3*Mʾ R6ck!>oY_Z'#gu {0f0φc+f+8.*v e1YY%>4 3YÄSXt$A`.m0a1<-6o5=.ܤBVf]GF[O$rn$7H'q q3qqOڊ~ڊ^s j~̞,}s03&a4{!zCAtԞ=cZ~ܿ?G'Tx GP0<5{sBn2 눇\/KJFܹE [YD~?utQK*cnH.ޚ?9]5I~%sӧ'Xߡ٭i2/,:¯-jmjS:H1,eFU+܄87iTwRѡ O{>HcXjd\_,#3-_9`]!{|]/%(>,9N,S bCl7Bf8r"%o[ԉ|W'Ӈ%4}7h?aQgdhM23WyuzS ZTiԲT or>^: 0YO g[+ t{o,S⟿LS:[Ԥ_.=:զOl>!зGhqe(""r#9;t>1LXcapr$4-| iL#c ]|(iur%~(TF84:BFRv-jT&;=j=`{X"HHv"icMs.t<#毚ݝ*vAIP@ YYƚ/zv狓^>}zvشcDp0!H:TkFB xo< 40Yv,Ìat"K<>ŸE%ϸ$P/apW+K&`;2E ]W67 Z{"mYpCH}ڔŔjQ#,!vOy?WsSt,m#h؊>{߶iZvI4RLs9׾ewIi4ټރEDDD19b2a&EQℤrlhqZr8ύ[~*w-6R;r+eȴ۷ֳx *vQ# cwpeXi$5CByI,K]ItZ֢违ޤlⒶ߸};`KntMvJMH~tC[vj_$yz&f# o2wSl:p\8nNixg <|~bØO<үOĒ<ay #Br+?rIVbK9ܢ6JWoPv6&:c_sZgyIMނZ?٧*Zp'fN _)"""" !+KeP?7Wrwɏ *w5N=_.[or&e(>ȣpK, &Y,廵n֖( f`lS;oꆙ;ƕiDPQ"7=]ommiVs88l2C$PccJ"&L NökH}.k:r@5:Nckm|ɀMjrs{/oYķduuõޝ'N_&0|a"JeiĤ&""""^Ep&~C^r!V!!%GR5|VVj30{./}? l{)˼-$CsE{w# x;cٽ; J29!gj5a#)}C )bD bZ/`>~ct:ޕsKq?7&4n~?1mjŦ'LOL |bY_fhO?Β0/R|t`Rp?H@%4<8[]OƬwN"^Çu?G3I,>p{j͟^v}G0_XHq*M{TǛO 7Na)[bHp??+S{~5|v]:8ቃ;[휼W)7oQy<4a krN5yTnyo=e8al6,+ߩ8)qƍBZƾnZϢ``3;֚еEU@W5:7ykf8ZEDDDD䊄`ܥp- ]sG """""_`22X1OuJ¯gXT """"""" """"""" """"""" """"""j\G¸J[xob÷`tKwW!4aF1W,|XmO!*\R7O+i>zP<Wnd3i0Xy$SG?%cazo)Z " ?g`}>xcJt?L:gGa˂Dљ21IL۰_}qÚ';Ĝ rOdhV~2Kd[k bLY>:XoQSYqC32`$_mSO müMԙg2l/<@Oaʷ7bKFb20u.,df/8\n?ہZ;mh&`bay'PˆTgpt^8Ӿ/i{植}k_KFi~Y4 <1u/oͳ K`}kI3 #4AwZFŢT۽{pYYw^~7X;~.Oԫ@DDDD4cH7X `:y|Fn^H ca] nݫᣟϷ۽3[ &C&?`]t 0a1e_}x?EQP k aD,iv%0K~ZA@y lmTm[RJ쟳=CM?p`Q}V xVۈZamK"Y7^8"smʡmsM[ߙ~b].;[PGQ(X1/gCǹp.?\ClXk >]z|MyV6 $oe|6Vusn'Hď 4M ѫ@DDDD82> vT>{Dmw,Ιl#AܶA5)/|Z&:ӭ<ΑoOs?#։ɧo5chq;n00BBݥ]?%cr?PEoG-:k"fۿq&b~8LHZ>/ yjtj%/ɬiY\^c?RXk ;JU! )w*[\WDDDD4> a2-G@ч!) ފ٩ơMvO9B 8܌BD~hSƬI㰶.+'4-;0k0Xc45BH*0󫮮6ˍjxCUJfdքXQFoOUl+S<羰|`T Na_2%/{;;ⷣt;SX5~"#PcLyVBn[$f]GOUȷc* }JXB-@מWe_LedJtzqWЫ@DDDDCxv Ew<vWhBf$L/~Y0R#л!OTx>{i<+®?!<wQ*`krk+!++d:/ݺ4ML$$~Dz#| >a`'f?&2iv,+쓒ظqSwı:uL+]$: !""""""7`QQQQE?ÇU.{Q+0 (\3FGPtfz)\zbSȕ 6-|2VoX36-Ϣ`"bpZ\O>J Jrq='Ub(F-"""""rïiX-j Jeͤ;9n(V&}f4Ģ܂)|]Ax99|2GG%d{nѴ̠o',}53yB$t7v778>=INBmAg/q~ec^ԏY>_,enkǹ/?y/~2qL'#dqNG'hQP=EDDDDw]'RyŞ\<[2wՠ,Sg7+'&~Wum$8Qy˭7i53faqn؆ptj^g`ʻ_F?F8oy}3΄L}V~S9f4>{ۧ1few ?)44?}WKshP>H_睯3~35vL1Ox8&UYuX艌kc[>>:ߏ_= $DDDDDD@z6vFh)`C;TzԧbL$T'pf%I]=y/ǾLA?5R6xgV,LPӸ^&2OM` Nܹ?۶RۖTNID4mL ^ʑcǀD@Ɲqg {|SF֌"uzRH^-.ߪ "%nӧ5_o6'D#ly`$~;O{,X E(h@vu)IQf@i9sS4%aB'& Ťf)}Y`E;'g6l+oҲ_=/~\ɶD7&a~*|{afo'ȁiIlЍgc P0)\(0{j( {!]jULmhQi#"""""|uwE/"L^CVޮ̗qN'TVOSfd_G;8Nk^sI'ҫ3_ߏM\:s? {as $9gf>ҖkW犿ge&V`Ӭ=T^21r,HGwZwgۑD[©tl1D{rO8CFhQ lߟAvwgw)OnnWznF٭9xihS;1uJ|B`{ RGԡӦrudJD||X6 ^H"""""|pj3XRN 7r Z/LnqZ8 Tgos 5|,Z5)KC-Xң3vvli%d ?!3Dv~2|OLuJ5)[oH0㇉Kq[;ꄳ),|;bUnoo+hm ՓG?^O^[K:gYf.= wl̝ԉ#"C_'xbD]:z+U;Z5/w KlTxf~rg޼C7\¿ǧ N#xtԏɗ\vڙYnٵs_rJ#O4hWQOODDDDDn08al6,+ߦ ƍ/x5jPNݜiKZEDDDDDF,""""""7¥5~ٍɹj````````QQQQQQQQQ`````````QQQQQQQQQ`````````QQɳl7z@DDa* ٢_`1"""3$%}11MQ)Lݜ߉n<:"DDbz!_x86hB2rBE~Nߨ;n&+d)bsEDD.3чwD[X/ |@x<|){4q[,:DD}ޜ O3""IeܹSlVZ/ l&nIno6 _6*|SQ3q{Ǘ5 JDE_2s)vd>3N@%ku:I m|(N0ra3ӽ+P4!M¨jb$/N,;ڗbti+H7YVC{ޠ,&|q5JYyu(MXjI$d5N#q,5%f0jp{H_|>]Mx:yf2z/N$ݧ0<Ȁu(`A,kǎcL2)PzE0hf}qP  aFҪ9/],r0$ ȋb/'3hmVt,=,\uwVb-è >XqKS)[1?cZS_׿{KݒBuS=̠EYɚ}(h۷(N2bQqv H7H93yDܙMx ('OCPJav$h:'gYm5TlTNde-G5*"W8g\\Y:"~tsD:M*Tt,d~}u:O=$ZU DDXl'(;g yC:͓`Rz~iszث_* A|Cק nD`@oHHR*3-zρmw`at:2Mv$¾YVv(Ƽ΅xn2"ANnTˈ#[T <,Ngat&i>\J""yIѦu(kM|`{E\SxA \$pM馒;0E7փ3&:LDI?*wU ƟrB% Uv {E\˵|b JiJH@H@PQAZ,cNNٳg̻g>gEt+ٿuDmW4+ &Mh.JEzzYary|"I\xZ*$7ʼ̪EɊ|l4 6%R$ᥨ*Ri; aTYwDWy;}'scss}\n⢑i8K,IwK|!w?ZoeVrLblLWsorʶnEa;U׆z+1ARb1 4h"VbخX6Lǜ,xI3 #r7&j!(I<,rvY{HyB64JW.D:^gĠvenR,G`>!6ӿegtVMߖ9+'"s&۹;A2y8 vpȭ|+@zH.JޱXfL$eo|^^Yb ,_kI,Vz7<{6!rWѴ.fǛ(fZبSkKqr#n+mJD< >[lKڵ X]yK9|36H$II℞L\'=8P {,c4+4ƪMi|׈(9k:ݧϦK QMZblkoͦ@aʄ2#*ޔnmNTY7 #VU۟ vn9.}3k=zuԵ Ry\ ) ,ٜLjla4]hZ79˷xQI$I2;&޸ 5#ڰ-[5dސ3~͊OS"8seVRJdE7rW QeY*6`uH<25C Hb T] 3WE|j#Ԗ* $Id>%/36).=Sf?4~W:/N(P.oJ#;y -cg "zs;g=C 5D@ Hn<Ǡ3Xp sgѫ/s_܆&$Itr8i.:'M+E$'AUU*#Ld5XtZ^C?π}ϩy8 ~|dȕ ֐bE)[ʹ޸[3>|JfM'=Xwaj6k=N?`5ȕ1s6m$I]ɲ@Y)C>0=<f#ør?i%Ϧo)1y|4[5sN@*&M$565 3Ge*/?] mb+Ƞ -ZW%#:K[1a"< ZƱa& }'k/2*W :_ޔi,@^ n$I$O<<`~kRFz1%jٻo >2@U|k:=?Bdz72*Ʈ]t@x߁룧]+j1Tq^.ؗ_o'@j_rݻkp 7WFi-]f]CucQl$I$ڵ X|9-8oAjj*;w‰ qYxSޢ㣙n=~I$I TKdd$aa~RmΝ̚5+ϩSꝱw$I$`$I$",?/-|1 B$IK$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$I2K$ItP ^$I"7XuiidddX$I$_&,,aa` Ɉ  Y$I$_&a?~@ Hï$I$Cp :(PP^ ,I$I |K9_Pz_I$I:>q$I$II,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IҡD>y-?LIvTïrۿpsxf5G$Ixbnv~xQ1EkvΦr3XpK$I愜Zmg-j#zcZުWPX *Y`FT&~$I 5H13&:o! Rd'* Et[oOVP JrJZ!I$I'uBpjC?UOI~Ёv8;<0$It $I$I`I$I $I$%I$I2K$Id$I$,I$Iҟs~O?Ͽ`5ٳ=-I$鄗+WnĕER~} 7N੓gYhW$IIcϞ,^#~w$iSv*0~Z F=ܔ~yKfxQz4yΠۗJ뢇lCoB,B[ @ 53Ozn]hv{+xY#w PGŧz>ЎJ9lc^sg]*mݕW~᣾R$:}Q13YįLSn.óv+Wx`F~&/uPG`g. 'W{_fkS6 xchs=Gc )+F/^3;Nن }?'lxo7[d?/NXuvw;˟'#1ßgñ6tr0cߺʡoJht'_06zkc'Sa:=ؑrk~` jbY;>5Mwvs&w+L:C8y b3fo xTOXw&͸|3&EԆY9f:oƎ XvVjt> Х6N"R2aņ]?iQ2V1pz"Ok}OP?}=6fIlݚq5=.OK0⭮Ε|`S}ŬIK[oN5 %6Aمtڂ ?X:}5gqAp~7ykѮ")7* K~`BԹvn KgRtO?<9#U$gw'mA~pkѲXp>g 䖫n֏~r9x7"W: TԮ|xAD{l:>荱<6nSy顬'~u@z0Ʒ­+R*2M+^gR\vOģW3[A7.{8.z'[Ȱ)Pyu1I%0.yoO#j8zܨ=E7Ѭ'DZٕVb S TRD:Y? lF@h_!ư8=}#?!c탟a%}.=JO ;n&ʷNe^e[ƞR1^}E|)z)se{, dh\:<("]JT\,^=_9T:4N$5ZS4Q=5xd@wkL偋Y8|Dz' rXt =Lk>ޕ`v[ݸ zr1\‘{HXi#hQHaLm5rZ$v{Ӳj.===?ϐKFM-Jqs?y3zÙʂ9Ta$9|$bݙw_ֽv]M>ς*9.NWkѼvaB+'_盄OFum{[w [N]yT+X`(u3|<]UŲNE_q[zс2M}UͩS0?ɫ}dNRb,*.jppjt;DfnO;ׯ쎿Sћ;Ѥb/gꀾ0~)Ɂœճ_iANWG{ΌnY2VЭ\ҥ2 xK:I[&mG/ELxVmoky;}KK3^H&﵂.!q< [Op 4x?NHN{f /mIc^'j[#⊓7ʎ3 ޟߦO>}>ӫ#|{BJZ\sߍ\R;\ɛX<=7ߵ'_t,IK)R*;g#?l 񖔭P&o˶/q2Ⱦoc[3𛏺wkr f{l&iĹqQlvs3:|$2 vHJ ϴAufF߯Z2#~Dl[?PLx?x/wZOYτ~o%A*5n3Pe'.A-s앾~-z^lKX~ =֠]s庑](=_zN;5K>w-Ԕ#6tB`RSKWN0X5E=۰9 y#P %X]GnC(I#*^Qf?TBB0qrLq9;߯u'IژA\nF~a 3C.M}u";M 7+%=勇um|Z* Ws\Tx-'|R*-tmO |'|2e AF8m￟c/?a[S9x)!ڃKSt^ї>7*wKUBQE\1EjpnmXbMP7_MoznŮ-Z_7kˆT>x xRZIgΈ|5{=1q"z]x᮶T9?O8;TeӪPOh^ɶ W~;˶⶗:x)eZTI`ȏy`]8KXy~-1W@tF,cT^3v yV}unЉ.Ctj?K_d|?7+F2tM85.:U:S-V>:-AN=~T銴lX|fMG_l={ƬlHHb>4ef3b~xaE gƪ# ӮSCb!gr?VbrCRwR=$ rvx%/a7ˎ *2ɩ?-f@0H0HGF$;+0nZ;Vv/e4*/&"D{h߹>/$cd~\TBZ5!Cd %\,s^e9 d0E>͉etj L>ώ4"?ÕMQLe=ȨUɗIðP^ ͩd˥&6Xg%*a/9`F<ʆxU?<[?jAXh=OR!ygZvoIj M[M )ZǐCe7J [0w*,7zP&Qetvl.İ;OU3bnLz53>vϋ2nObZ1AYKRd4'f_2"u>)ۓfPsFajܦr?`u'1i7VJ(S,~\K.8QpƎ\JV7WI \{z2ڴ;-1&OXYL./)CÙK70qK9Aۙyoo| c/aۏi|9Ѻ* WeKgU)ōJQ (A@2zYV9ܮQ@XfƾڃZբU?8+дB^XN쎤u| #{U*/LLGi[0?Bf_Os~k~/y҉~nfLd,>VG"?Ív+2lR4rOdȼ]T=uwۯ/=KSc$׀mބ_.aSv=ϭBeAĿ8!R'x @ Ƽ͛ogwE{)ܓξ?}%y*yu!8ydVNR=}OZ=:P ( *@jy!a*yQ4:2kǶȶ e~:6YNF ?cp PYo?zgcW1})}PX:㒆K seLϮݻ q IDATFQ||1>/W?^}%ngKRwgx0xXh;[6% @¶D A2GrZ[U1~%-W]ɼQz0sKodc4\ҩv.319F5@ɩ!dˀ\{))d٦=5$zF_B;{ry(%jC[7RXFԗV1(oO]j @tL+`WJa)I+2o︁ 7HIa9*]ήLKw'Pƴߞ։os3c[^{\{@Gh .êxty ]3t4[]KٿS3!QaBFQ*혴A Jt򯞈ѽ]R"Eh6#!C $of5, $j٦ߝ(T("h]KiEmT͝93xϜ};&gY!k︆v 0`l];ؒ",c [CP$yQ e 0K7*\ XǪ5r$SBKNb"/v8/6nHaCVZ@oJ"15DXJr2Z*jY'rWW: صu>ISILLR\;:XfƽV=lJuxO*wϢ~4G:9=سa3{s0 PY8zP+ͻgsKyjZ:ɾ/ʾ 8l)(ŕ@Cו[W(t֤C86Cd`ED$nfMb(GmP<ٗ]6(BIH Ar 揽f`$ B{ r>H*[tn!u<Шa\tJΚY`5;:Zzxb4/}^z 2I1)Q:pʗ)l"q{-Td/s'D gtw]CY>|.]fMTId \1nגI=w˪3" SV)J`$mU S|4鿔ai]Rf%JEa%oXЗ-S-哲bGR K!}Rf޳X2!H0k9` kְ /S<̤)n,Dx*,ߐ%S..O\ $%e+7rGTG"܁O~GIL4;b.4y6(3c ;) HX\;q6⊻n;LLؕ=?1ɪ;a)Il0kƕbcy)*BQR-S>DQ*[P*Lj_O"^1u2;E) UHLgW:6pz:WvSVSHk{3O5:ZC}Gg"”,;v{a)"OVqn&z g\=dO'%f^v nlߝ6OC& +ɉ+O1`OⱽwӲןUJlgVؑM.{((Z1ܿ),T$_KDofi\ۥ=0j]8unJ˵m;JŋP`Ζ6ׇw1|ϟ7cא}:-Ӣ^M&l:l_,J!q7/gƯ{<}*v86I q%/@V[B8u/rC e q }]:֥3ѼP=ʄ61a6svjo%\+~s!?O*BҦbqɝȍYQ qM V^qX}J]ΫYeEJ]:=/ZEkHjs{m5 qROZD-/M23S=31cuZwF$j S>3)}?{EDŽmisf.TbNqNWxITnkԔk'ͬ"ҙ\ֶ0% ;sZ?g{* PuZuu)O@bilv* ՚ҾZ{Vg}M-\m\<7'}vekEcdiSy錘D|o/YSY;~!|_Ï;x~[+4 Z3a 8d_tˎX S34or.g&M@~JUA^t:cq'/c҂\Ҩ!7_BE,\Ie[H-ڸW cŏ9@(>άqƵOkArXhF;p7pzhCnOWpK\lCmI'|̇n_^N1(k#RDq9T;ơ,K>ykGp he5s~rǾu OC6Jׯ/G7 +ԾCue~qG|;:^W Iqiբ/rZSZ֑X?6ʝ\{3#Ďgsvp=9ѓB<Ӿ6mKa7}xG~x|6g6 cx9 ]4U}3Eڲ(UB3Y;mS%;ϮMY1=/CѾiC7Z : yᕬY (y㉞ڋ[ka\5^N &:%m;\yQϟ'c_?^T֯aWkx6<-yꦦ B%1evu/w灈Ys83.a0f?W~ v_o67OK$_η#3ۮ xb9%tPa*kD|{}Xsܥ]I sr{gbξkw M;&bb=߇ pbന4 V.μcr/ZbZ_ӏgӸ*v(86;}MYWsѯk5eS̫̬~x Ly3Z͵^y,l[ƐO'ƜyӍO?1#\]_F"M ^rQqe y;kg{ؾ(=e A'qs'\~-mHaf1۾cqHwei lYe k.bYŋ7 --t>AG/>{I'z >5iQm{>n灼q8UGC~.z.KN_tjc^#_y҂U3)mw"f1׼Ȋ.K$iMosK>jQ}NcR8DDDvXh)fsɼ^3|8XJ)ysܺ=Ν;ɳl*j?qɬ'D`PzXDDDDDDZDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXM """""" """""""Kf<)#hwKx[ xW\ͼ}V!럶]>I|iqHVveSL~+&1q` ݍrn3MzQt^]u?͓{ ݸჲR7jX4IQaJ)ū ˓jv8[7`xf88D=4͘4﹮\8ΩTK,s0j!:ܜ^=Qes#K?lOÛ1'm˾I(?d2J9uO8T'i5w&w|פew;mŕKtov.35ַ /јt</@_ՌK¶+i$楰 )t<_>HRpOFkL=|Fy!ؑ\:tY.GnXp{gVe*Д/F|Jp.\]>=JȰoQ&M6iۉ|8 5l^Zcr+Wq.քEfC@>_3f:uV=Lk1HA[YX[9U˝=$sr8W![$oAX;BTwj%qr)Ԭ@% X fV @ZIwVaO`玴qK""""""䥼ak()uZZa7 x;#L{ ݁%.'&t׬x?,jBtI5NGcL|=:\O˦8la_Z*vW(O [ZJ9ƒ^S\DDDDD$Z5Jn1cfQ4in-F됮Դ#w/_K)%k&xi303e՘dz0qxA|T>ΤYxHp.Ċ iTwlĩ(șQ5 ONn%xVfrCS4EDDDDDxJ4 Рeur6 v7Y`xD`HYH['`,7o5?MPM o}v; K/haQ\,_e77`tGa(>;i4iQOג]NwX#9)s\nŷryII5I-؀O繳{ NX(Yliͳ_`A|{ֻ[!'7%?eW½k9jx/˘>" }y_=GUׅ̓ 6uI?rRyJ=)?~t 4ǷL3Fk!ȩkjEDDDD)t]*%i'~N56.?>e˖ 0M {zfEDDDDD,""""""O5?mgL[W <4,"""""" """"""" """"""" """""""L{ݻvdBΟ@RRzZDDDDD2=wwɫ RI޹}C &"<\WDDDDDII D3t`vnߡyEԳ"""""TS.zJճ"""""TS.zJpRbzVDDDDDjEOIQ````T|b ÚCADDDDDDey} k۪m/сk{%D@Rދ~dD]F*7彪 !Y| kgsۯWlWcnm[6t!8qe2!|ă?gŸ]6S>HpA1SYgOe?~^u;3bTV]J/\XF[f-B#| kex2xmW3V~?h쉈(K_o[Lt(M(ę+7{mJM? 2r/.QGضfj:HTTCRŷz⎳X"봣oˀn&WW;sqAx=+};SaтgB7ӻ 7^E-g!|V5/)۩]JxKm`^Ф&f'z쉈<KMX2d2 y[G_CNzR^RlB%_ڔXLF\[>n/8 w_)Wg-1Ba*S4>["5 |gF" oL]a|:p%IRM IDATe%SރupL;Ei/x+L<P$n#__HZv6I5(%ڝW7,+ՉCPn F=#A|¶ϷIb5 w:&>l _L^&=oKpsvǦtҭyة>_|;Olgz)tÏW'51VJӼOz1ڽ P !'f{7vg9{ʍY/>܉IZBqۈ{@}DDDDD'(V/ڃܵz#LvH쪩3ɛ_ch׀ÿ0jDB~F]`ܜ9)ۮoQ-!u|:bCzbmK^v]سb#1zz~q3w*/7i.47pn¥+'/J3Ĝ+u(~]?_nfqA Fw_ތ5ʲf{YrR(\Dr~s{""""" " 'dDX3su%ɫѤ=+j7uhBƟ;\KӦ^aǣ43WYfHg{R*4-7Q5pb7BOx%Zi>$9SIR1>ߓ|@c[Mc&q"K9X\ SG<>NiaR€Tnb6rz[zZDv̚Ӣ3_Lrr7[;n\:lV3re ׭F/!%Ӿa?yK]?;IVGXDDDD *7>ȟW ʝHUf!{6R??5u:{Z|stf./g/S ^aISaTUC!-)uztaڴk71csmw-V_VppH{zl̸C={ZUR =z8!Ǵ;Ű|NGƄaYh{-|O1uofZ{ybԤaqJ r;/qJ?ϪФ7qaUs{)\H0X&oA9Vi~ǢHSM\ROdY4)K:Ql9/YaqE3mwtҭ+S q '̨~y%_q=Ǖ[Yui-—rpK,tXJ)j^c |q}V g.='QҷYK$.ou/X:o ٛ?0&Q/31+7#ѿ^mLzΠe'N`܈d^aհ1 kT!aϺ;kԩl/kRIPxmMW̍e3yd6%ăNQ N׊թr&0`C4rrÊÊ?%?G6x l>w|\x5v{Ͽ@뚮o^oKU:k ~<6ݚ~{GLjlLΜ>MOOp@m,kߢqi&588=6F=zp-M} ՓwV^gixQ~(ICK(ц9Cp9i'""""O.t]*%i'b2VJ߿)[,n?Wf'6RC1v?4x:Fnؤ {D=B1q~'&6sl b߻љ`쉈(zW@DDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDD =<Գ"""""TS.zJp|Գ"""""TS.zJpfԳ"""""TS.zJpUyݦ^by*WzbAAEDDDDD]EDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDD"""""",""""""IdKm f;\WoGy""""""OL9lC~d#?:@N(qŜtS(S; [VWŊ3E[g_9S@}ҝN,Gq'lAVpa.Z#W!g2>.D#q (|-1gc!kzWp|hB6|gړvHYЏWg\U_875A4!u=gbpdhHN>b>iabN8t|U3/7v~}H-^ߥq{۬sN@.i,Y~Hٲe22 ݿ$% R Q?fQ"(l3YͷÖ@S)ɻn`Z-8 ]{I:ț~](|v$9liަyN2,YCЫD bUۑE|{Oy=%L^@!Ml4z0=J[l%adS9: g܉X8ޫ/, ^oR;gWO!dҽ2[svC1rg>օ2sw<2evxUxߙ1np_:l{!8o=;Ks|W(_7^*G^<:{\Jąn@#D^R9e|+F+idҔŋSE Jv ^T?#SҼqx)u^L3{sszv%Qu{T|*P-н\U4ÏS!xaΩt;NX:h?}?u <ݑM*iԐYٽM"""""X˴7r-ZNC^jq 慎g`R N #_9`hIS<ț3#\+E[w72G"-ݔ:6vgST 7/h2,.WHz9úLصt~3m9\/<}\H%$;om3x_[<Ȗ Ll}=:\O˦8la_M 9a88҉z47Q-a~= |m-[vϜdž;{ bw⨏3b]]r=҉gߪLVyldW JŖ0(K&vIF!̞3Xܠ oqD]M.xlxbpXMe)J#iÙX4v+&/UY ڿ>c?&z_ye%^yv_OdOYhGEϐbJ:'sQW9<+!+9׫Iy*ճptzNZ )V/A6|Tt E+Э[cM+ /*7[z7c6i&gN "?~t 4VĿ)y׼6eOg5cKeqD<=m/*WVPA̹i䔪6y`nREMds{ vy(((((((((KN}W^~.9""""""O|rW2mZFtwN M˷PP,~+ 2n&-Kx˻J2d}gѭ ξ=E͓Ժ eF4""""ʴ31ӭTۏr% ü?ҳW<^]V4~YNmeN7X4Ir!8T}S)ZDDDD2L9riSvexߥ? 0As/s\f8<Κ X+sI&)j;>vĐ7s.-y՞]d=v| =GnyF%Gj>p2&/D1èŇ8pǷrszh9=mŕKtov.3^RF[K  ؃+^5̽vy&Do.uBDDDDOuvĚDOCMrP ͝Ÿy1KFm 'KtheOm> QVB~ 62sݳmaCOن7٨L0RK-XF%ݱ]=JȰoQ&MBDDDDr8!:$ˇ7]z+(aީd_~oŠ'+ٳ|=뼎˦ݜ3AgV jNua/vlhש.eMym~Y#F,3+sifie\b\~p68crWjVYP'/EZ(vP)I~Up똸xMprs nNPΝ JrL<%}۱aڛo0 0]/q{A,agS\Kz0)9h~Z6OaOҷru(/rOŒꔼgD@E?\b_#5Ŧ$~3 X h?zf+’-X26W<-حhҕV<ƻs2~ aFG ?^Z40&)19Ec'bBtVc.S^lUgwzF:sD6_# )#8q++ $6_Qc20/v@~.. QDq|HM`Y5/,YQ)IKmPJ(w)6 J0 G >ITι]K{ Ì䩫? l&6: bax$Yc`zn'@Nw-]jsuۓ7٬V.Touz,J'͊r"Ơyx,ˆU[& Wc@zmf]`┚ë fg}L: /7+e. U,AGj/4PV-w0C[V\6ϏO:b8qU>A6|Tt E+Э[y=[jz:n`qf4%l`GE%1PRZ -#:< ӘWL<BtY ]\{p'G32x5rƔ| ҹ$BһhWZEHt]*%i'~Qql\ܿo``ۏ XDDDDDDNBy(((((o'#S{z]ߧ]i/'TvJ9~XU^?Lb On$p8çg\rMW{27'F@&Mŗ΢hS#FDDDDDD1:1؋H )?^E9<"sԀ> tmHl>ԖU<عf/Պ ݗboN`%LJ#G {6sQ1$G>3$]{2G/PT[ˡ4R+/hĈ(?"VÒ(^hY3^ 1rB>|Xro1$w#q.Tt"܎̢'Kr0Lx[ xe_ڤS2r (Zc|҈Jo"^CrɆoZ߅owO عyr/2|PV: v"""""OW̒KԣI j{+!s*K1Z|w|+7WF@|?WHᓟүAQF̣G?V J]ˆK7o'}_fʺ 4 ݺ5 eA?ό^I3\֠3;ӌфlV܌7o?kV WR!Rszu+k/wgHB[s@N؃l2O%$;}ny>׉J0wk{Vճ2oaS 5hl($9)V ؅YT{|xzZ[:+5 n/˷/KҹpèU6o徘18 :$)_Nl> d_KUV"1YawET/%a3{2`q|@=H9:Q͆'WN/l)%k&V .A;\UŜA3""""yBFN>s?xPF)SO9W"X=| U|MޝөgbXs)?3n^_og*«hManM{9|"%aV~JвYWl:No+8T[4QB~T} dfO`0~[ݨPY 9ڱ alpUsKjZ,""" RUZ.Qf0y:6x>G3~(>^h5ZT7oaQ|܎-7E^'=tFYy*y8MƳBk>m\Ӏ_&nTV fauNjm|x GkNБf>NM=9I'^ʶ1#߫]Q;')˙V>)V/I:9iA#ZOM< L:IXJh0<`ӞfrtG񃦧p8O6׵'DGgѭ ξ=zzq5ݻ24EFM`Gt]*%i'~Qql\ܿo``ۏ  <}bߺ<;6RyJ(S ۑo|8n~%""","OԂWs.{*EWDDD䩡@E7y޵% r """"rwwɫ RfE;`D+_JJJ "<s5ȓiɢEj "ߥ""""E2D5G```QQQQFn>ɼK]3OQDDDD&ɜWlzLƅjQ'+p-l_TSOKE2)WFQɜL<(X0AKE2k%>[ ,0kKEDDDDd:.)QlT]^FQ| qryr)(dbTPc(d^v;)@\yTs(dVYf$<~5EDDDDj H&z]ڰ0;F`ɬܼpp5@?B|^s.e^bqc ȵKW QA_utcJC)rcUOyȓJ<&fBĨD5{V]*B&I|l zkQ&N7>n1IevjJu8Gfi ^tx )K|7 g~Zqɋ {k(:`ao=Aβɝ|1h"#ABEM_Β{s%)7#Q~nHr {-ˌ #IKR QNĦmk66~܅&nCNعocλk/g|E98Nʧ+V/ŋY𣎟+QgV8W|=QaUBw)ۉ3Ge~}Yoyi vWv3kDOrqmc!v7 @\Ql3 /dRϽNؽ3^&oJxG1"sk 8\RtcQ:׭?km} ԈƘ>_ zN`VήYȴӉ.[} >lزv7r8-c&&7{0Q9oc*7e@`pgYq޲?9#'eZLGE8LMy kqޔْ8i+S؁>O=̚n%hEwfw~yiXDA?ɶe'oqaL,3VoZo\`@byfpiL\~e/u(|=p  ;%Q@g&ip3r'߽x .Vv Vü<ϕm7O0_.e|~I=ϬX9go ؃ ެ<& _Y/w?8: {8Pqk*2̑Z9Ж9RSIS34ܹsRd ȼp{~Bq~ǣ#|8>qس= Ǫ +~0`R_c|=u>;Μwχ[7}/w>14%Y~+NmㅋlʛywO`פ܂Jj2;!k.l}1[5B!XbjҊcަiK.,^Kl 7Mލd Ky4eؗQ۵t6%?CqQoTN;M!_sĵLWkAtzq5iU 5\E 2);T|1:ى!l4EAjGk80.혎؁bAיZ:=$eB!$B' 5H4a[2Hιٹk߆``A$mC bȢDkP1ыmMoYq$n#Id2J'yù+0pCumAK3e2Vœ y)o +]WWI'Po'‡;f,PokW0{5V~IB! `s=dRt(GJ7dbGp8<\5 ``0b{x5C^Hus"t$5O@[^= /Pn+-P W[k'(03Ӈ2.$%j ]Ł~2Ⴤf}m{LhяI;Ppcf =ArN4ߖr\*R7K>T폝ґY+FB!x@_IeJl%PzyBR3yIaPέ[|~gؓBAC|ںe{/c>'XK4k?KZZTD6MEЙ\<=^۞wd5o=GF<_#Lz }hnTNFn9"xrx{vWܫ5ќЗ* 9K%BNѣj,PUq1<d2Ovv JMq <4c?вcܛ {2!m8FoaB!ă u akkffO5#3k~\ B%Uqv'.BVCb8|!B*)nʼn7kjЛFҺ QYY.i zXg"^qݜLEq-OU2*/>XLJ-xWmI/uKh䬐q]K8Ssrz,ŕS>eg,,ds<`Aӑ#y}*j\t/23_Oy .0 /knYˁj}يj 7mnðRy9h: N1<^9;.ek`@?9[R3u,Aq Obt9VMgENheq&Oam)BG BdxU &BD0f ZcVF\l:vnkd'$z>.dɊKXgE#g @_gBLwtBp[%%9_MA<4(j.k1oc;]sޛw"3W?TA|0}T4aRz4.ٝrLzo5U Ņ\c@bYwk ͕եWI֭1<س.2|فwc{et1m]Η:RSM5ûKa;xqz ?M@' 6aYxiGK#ۗrB!,(!dGrpSd͡ :̎el. [hLȺ΍q]nK[N:#k>tԉx8#lxnOӮ\UQS߽p@#qGveވ..iG;×|2ggiP %B3c9*y.N%r%,_WWsK'Z׶#,z+v8vq]݀:9t˝Ög)k6vBY9 |Q&47:k>Z~ 44o7}U28x>pɜv\ٜ1l{z-|)לVבB\ׁ=`w3?͊NflF4?[(]p%xk-YŚ6-qWG̉̽Iu,3;se>6nE{DC&5uPnڴp#Ycg%B!XSb]g.kϜ=QUoTN W7mB@Z?r[?և#[G,1 (JK*`) D=;PIMf0 ws}$2bKFҕ^c9Wwy1crm'uǡֽh[ h{ SXj_]cc(H6F܄:jR߯5C;is|!LFۙ (RebՐN`#nqEßߺ]:Jm ::NI>ևә/fj ]BoǸ)cG㉃d{ґOl`ϼW둄BIzeRPo52~?^m>GY/u;5d5 Z2<`"+&s2, `m gn` A;خk/&D〗id@>`F"B! B< pt ~®ɘA|TD |;8o !A#!B OG&-]Ŷٳ}.+ܰ9ٱ𿍟Ы<~g;Va '6e{쏋t !BH,펍, p&DmNXN/}9frrv&g6B z +]{,oY?crJuس}.{X(?X8!Žz̛} -%B!$Bʯ;[I#l|ƞ[---1غ7ma)9%;$ |;矾LMyB!x]Q&^cgq:V2oN_:M/Խ،~N:ycvwbk4M佭{xx:aĕ`?ˁj}يj 7mnë@ӑ#y}*j\t//y*Ӹ-iќ?f.T۵'z 罗:ȹ=k.f zXg"^qݜLEq-OU2*/>XLS(u_a+:̜χWg-3t惑nGABGV,a־KMxe<{579k_0!B<,6,aMM2uLp_#sAM2 ~\}8f'h87MTBѝXuqV;~nh$̭.^緰LʷnMs-/gbuv'+&FDMUܐ@HRnDJ/3i|:QF;oBhDIafz γm1Uiū]vzԉ?xt dO瞖װ6w{EMPܩe9MJJy_Je:;j[cR<6q"޾!8v'C t1B!,(!dGrpSd͡ `ƞHheu%sN?.иmosF,/Έ}&uFm/·lZ>wW8[m%eqf_|8R9ѹ9cR߽p t|q|\: uZPIMf̙|\<ېOYDעB3c9*y.N%r%,_WW-wj~;[v?|G.s|6~֝$53_GrMyu{-9ɉB!$BcvFKdm0i&k577`$RV눝6͘ߒMGKɿ >kwu≉-~5 =Uqq,vv: s X[":*f2c;[ HL.|hr5$#8/|Nd߯R8?snU~]ş/"!^1 se*&eQ׭h'VΘ0fj""L.ݞf~tmO9*!Mѣj,PUbx?d"??Z6'AYz6|fmi7G !e u akkffO5#3k~\ !xex6$B!k2X8jUZI-ZJ<\c`B!$BNN8`̾lɺDlO$4Շ{Օ&B! a(zn&4!l39V{ZZδE?w򖛫ZΔhaYuv}(،hlOb){ϔ3oO|M z@ZWw<5?-gگ̛f^ԱXi"[Urq)5Xu)YI?g BJAV{j2{6V!'5K0~kmc B_$Cʼn]1V-XšeC_sfҽ5up/ge}^Փf =׆iNRv~c"5BssUФa.Yoy}yw0:O#_XkG߉|m-FH#\.@A(c islW },a8w/+11ݜtL =s C/gi61B!`!D !;"nePa-,x6ٗ]`!Wev4}JMaOu|~-5\ ]\wAJUiGLc/&iQќ1]ӎtQa9K6ǡ?4jcry7?$Imo.u=353m㠕?H>RbpծMEO 488j7[umc=4w!BH,H'&35{)Q#fJVgɯ-|cAJ(%*;T:t~ nZ%DwOX:7CFC4p!B'(=zP*W6';;h&}I}!m8Fo!O_6n e [[,,,03{/̼m,W-=BߤzC_1o{C!#OX\)0ꈏzZ.I,IF"BG+@/54i@3%3 B!QUY qXw5O/޷}+mgbÞ4T=2u`ˣ|Ztسc#_w.c;^w8AKQsسc6L1BQZ qXpWowlda3%LL=آD4@e}F̎m0+Q.ᵦ=[`^̐x[سf@?gn!s~%NBq_:9ခ3ֲ~'Y!B`!fܕi+>)L佭{xx:aĕ`?ъULڎe]'菼?k7v8͙P˨`3Mh:r$oCEkehi7izֳŘ (8Ƹthz ?2juc~y{`5q$aLTŞ UIM9p<hz\&΋F2;/O )OtTL7,h l= :MgǻzW1q;VT.D$aǶaj&QSx &Ipf+ I>`S_lFmggj6'w`J|bS{|Z,B0v.kчX"BsM7ki K4J^}΢0p& lOC3rcgbK@ŚϾ'?^'`yy%]0OoKh4q!wc["mՔ\v*#/bjЛFmş3$xb+:SVH1/:!7;!O$-6,aMMrIa<1 #|\> .Ί}G2Ϛ|<'LX9{_ !hZbiˁL,}0'wW]dd`{*d*Ɵ#4× b=,c]xg?@GMb]kU1g*ef_KXzUTE~HME7rI 4iܨQ0K`3bFCIQ / ZG%~IJl,'(YkBH,x@cTuKd 0i3d// +9mz1NG΄Y}liƤJg'l-tb 0SS K΃;I2H52HIS;?5lr+ Zy4ќrx,T,rfG\,q)$UrK?fן2nTŞ>nY"(0g,lj0]ۥëV:Fwq3>dg#y؀ \FgDyU x5 0y5 * 񭏹'ttD&#7'G,Œ' rSB ާV!"u3kih5fI:YIQFO3!òCc_̎xs&x8MEx77_ˠ>Fhb{S'fM:Dpl7*:Al:ru10i\_Ǭ"~m$çc6'$A q>/ߟ&%?ϷoF{ToRہX]3}vfPPؿr)I,Po:SQrk$j,I Eil\Q<| -cȠf!c#7k7qBU-ͻ0U:wy=Lxߵ|pRȻ# >CVLx)+7zeѿ.g9|ʝrּM[9_5U\&זXu ڑnu+Qyľݬ?[;T{vWt=3,gEn0ecӰ7fkk1yn{9Q| mɆڈPRM&phgn?Muy`MH~LGϥҺ.+B3MjtexDVMdX`fq@>/cV֭bmd~n}7-FZжpۨH=y{2TN:vW+yp~r Vօ! &Y.^6;T:t~ nZ%DwOn}f\%,I^\WiU/Œ/2eF5}2g7~{CoA^ԎS\3e?bSO0dGvp@dB`FRM`m;sOW[cO'QVfqk},Пa#v>Z(1MwĽLVFЬO_f%q aJS1 Š!t@sVtz=X!}9vϫ !ăKBR6Tt՞5XQ 'Y**ƫ0TlQSljH4ӉZqјhHE˘Ut5<^xS| O,>8N J=שcϱmy.BBwm|egneW)xB~\dK>[bWJ=TcʕE5.=L&!5RB΀$ WĺB!-Zw?Vuc49}_b\2gv^s>EtEJJCB-DDU?s97ga}X<, β[IڹyGS[ B:N-R| wѲmʻ>4 }ѿ.e~j#Ə3㈎KGΐy^&WtqFH4jGr\ԫPvR[\ץ5P'uLUFs#k3B`!DQg٘k>E"Bw-t$\ ABƣF<c^Qa| &!B!Ixra#z@B!BH,_O"׈ D!BH,!d{u? w^h~زwj[KPB! [%/v-|l7"r%(B!B`!ē'4 Q{6\D!Bh!Pj FC!BIxr9z$B!xL-K@ 1Z6fg@)!Ⱡ鰳w@!NB`!`&L^#;_!o2IH,tF]"UB!Bϟӫ21h$(E Ft:c"X!B$$EB!B! B!B! B!B! B!B! B!B! ߕ !BQ`!|+JB!( O~KB!( O-y\9 B!ʕ/?-% `!!׬~͚I B! ,B!B`!B!B`!B!B`!B!B`!B!B`!B!B`!B!B`!B!B`!B! !B! !B!O sx $*?3iqm3{S]zӃZ_QXG|[e~ 7UڙB!$BGG0'{BvԘ7 !B! O]XvnjfNl *5Y࿈/{85p f&,EGS% Gkp'^ ݞNg՟w?xF6 )Y2v%KǩyƌG#xze&]t$_#j3t"aNYfVE RHy̞)tcᦖTf5[_{wUquaUvA5\pRQ,+-Lrɲr{׵Jqp_EQYeR,}S?=39\=fng\Gn^!j svThOU׫?~iaLta&y !B#X>[ o|]V!{w|i>dg]8O\<8KfnT>2b&Ђz,C>cjꘝd~-{HT35b=x0/7qk\ˇ|=#^sc_9z>B:gK;VP#BtGaP u|fASfrrEk8Sy=;cibVpb QZc ~"}kfjEgԌzO-zqt{MKc2L߾|+vyڕ-Η_Fp !/fQ{`w}嫜J6Wׁ^gR o5 ˱!o}B5,O1J`]ez(I.?g}MSr !BHB}9kȝ'FYz]j0jƌ4*wOs{,[ VȎƟyfWRoDmdd{`㐉YXVwRsהٶx g8B^BhT{D=K+UnmdWN=Fwwqo L6폙!4<@&WrwB!Ŀ&SJU*С{deMk`{};Hu-f> ɀ`_ެS_8߭pJ5(݌=-Q-aڰQ8gu0^&MkUcFzcQ<ȝljII}.%Dr`NkAY.e'Egw+-Oܨxzi5rl !BHB4M^%KXk²;|ܥ*lȱٕCp@,+ힵ71G2h;bLCe7^vdeَpzl8~tt(]KLji]&=?-D;Z#Bg4k`k#?>}s'3mLZwdXjxhĝ c7K9fN;lMOMIxq '>lXj u o3:\Vg Ie'̓9"&9ELR4{i.z;9p*^1[:7d/ANz96g+M`~;_Mr.:~.d*T6$Ҽeb|5m0*e4ޟ̠n8S+d.^N ~6\m}Wa78SÝ.oN~jf,i<%‰m[!i$=B?qnzҴdqffF#FsO_\Je\B!3MzxXӴm#\86|3d VF~fy|Z1p}ֱtE6L.kng ѩ\*ö@֋hi| 6p o¯38+8-OWtj,hR^Zcl^I|T`fHb,~Բ?3ݤ)T@&-$W řY{ :'U}Vd i>jmpE9,x/5'+Zbhڐ,eS r5ԟ;{VX![-Q4v $q=[EQҸ8:431bP”`(s"{Y@;r,FL^:rT(_?;*Z?Eu(Ciz}Y98Ca6/K6bk q9ɀQaC)Y}Jo\8/|]/(^/>bX74jG+}_!BHB<#,sr%6M#CSYܭ"s*c HBk50W-}& a7?uKGDyh=aKs1nE@PD(=w/Z뒡7tաXQ%a8SpJkR`ٹ4ˍ̖8d B썛B!XlPX1qX4Q|𺶘!"YEM-kٛQٔ3Pi/Cd:qv7b7ҲI'esUǣru^?Ʀ=Q1`ˇ@#s2_y8CZf8l4e 68\nWh{S#z3\S6ɛҀIwƔMƶ~5)EV  EU |]/jRjk9숒D!4K3O"қ˜ M|:l:GwK^t'P(o&L:elJS!7 >VXgؙD}=f.zfַr9 {1N%$H䪥lMW LΘX?q Ogeo)/%|'ʹSO ÁL g8(Y~eB!LBBg)/9ٺ/~{[ەz=mJ)Z7Ol*H'Éߡ&TI!BybMy-uGodI kQ af)L x;`vx?I|2 /ć PamF1؁!4yr4]5Pi>c>Wf1-uE?c;NW*?fKG r,<>o{u|6M( >zOnmTjU Kl 3O%\bk-fFsl_8YGnP\8}>Rm1g}|Ѫ"nNqKZ쎟>v NSkR9 >=Oq[7 U)Oz_5{LeߝQo-b{,T۪-}=qULs=QuIjmO \ںI #G~ V;ہ(\jsw!}җoFw?9@rᳫ`㫕 ސs!X^>A z3oj<`GU9PAVc0qÃp޽^v_y.љz 3u65gEu ch0> tW)]*d$tU^! IDATwӲ8p.֜$0 AGϺ؝>VuaH#F %`(s"{Y@߳ިbGuPvT.ɠ#WNpK4hQ/xA9vH {rT ((ܾ M/P6}IMqQB)Eׇ0cmluEw_N@;[7[ /&n@1W\F?}6\䂁~f;RȾD*IL1=N}}eصL|?dYD,[7hm_tDΥ|lve柸745?%d&wUFyWlёMy1 =t T*$&99T#^Ȗ,Sad߈[vn/#?!Dyk;¹9]7>JvA.e*{ K|Wt`tڻɱX)ʻ"K4O57ǒCk?/Kcu'4;6.x8Al*yů厕ߺ聵I5㓐ﰞ= B B1,#ѿǎEk,Q|-zjyԲq%97Coŝ1Dwl{#v޿.-tYV8W{<*W\De_huл3 w} _x +QOßi8c\4v-kš9{ڌ=t򠼯'_[\aC6(Hq%]*kxeAɇK; K45Eln@t Sd<ɧ-Pڕڶ iSm<©]DA1.k$#'l/O/s:,bP÷8[Ng__*1rs.)*4]V`0!WYc  B~aUԘ}.!I&y;y+A2'b2d9Ҽ[r;B7}3WЕɧBPo&]}Lq?3Չ=2{\\(Q}obs$9jcT/w a8 ~'_U6Y*V 9s+j7ݩ>>M3ϣYuX 7O+>&,ɻ1&6]2x0};u[2t4/c}mfXŸ؟`I͗JcObn˗9*Z#j|gRRJf;l:eGo޴=sv>P|Ug:wf6?^8JŽIWȶ<ʼsA!VJPPjW]0ɥ O|&>?7'3}{F>3;Gqoy$_wvJ!sukBr m =>մn@@?W)C_iܕ@M{g>osjBV\ -T{5:{CM"!%X\yi@ZĬoOgI<ŌǷ0!9Kla}HB!`!xis3~&>8Nq~\Z{#\z8]X;IC!.KXZיmG4EB!:BQWV|Fpz \DZ6eܺV6}Ǘ+>&=#OݙfsjzQJ,_6]]xBߩ^J#f61Q'52+3kw7٤8|(oxRhikN5ixiorJ*>{)g|/[Vg>*=Ka˙# nP򯀽!s?S7WQ3 ,X!ζ αw|fclƱ!|Ҫg@k$IBg}{B=5RՙC:#K[VQo.WSB! !W'fjh{maϯcx<:.y,SfV|ګ-<&'O@_֏}W.Ol?LZ"n~^p; ~0{3TJYy} /;oLJ?icD?Zǰ{fݱN*ZCX.'ǻEޓŝرk/;v`.:JRE~eD^vˮ*8NɆQdTOߑkbM!n~ްwLhKp(ó'ueKϝH <\0rs6o @T:;ټ5dB!@zxΘf򇝨f jiU`ٚòT=[8RmyšZ;0&(N\SЃ`t@][S[M_m8T"w˻%->?GKGX5s>ɵl~H9ϓ6:R-aĔWZY89ݛp)MCk'9QucKY1$2E5<4FY8u!; gNz X^8y E;=1qN!p,mqU6yckɒ1hK\s'woB|  g.'tR5>Mf '7?1h֗ Ʊst<jTVȾqGftߕwqқma 酏L;͢,KŚ>qds;y; ˛S&JA㕖jIH-I_1rOZhB]CEyLC4_``B4`!#yڪ c6W\$IC,q)7+T>}y j1ۍ7p7VYk9bplqi]&=?X; Om;3M~u͕]1Wb:͔S+<7%bcbͭ|Ui60ǭuyk~sff1,1kjއ15ivb#Tݛ 8Nձ<Oݖ1GU0)|$k;?OMbwx7XӤf9tu*U)MY767-xqL^Ŕ_`h1+ea1C5.Tr38rw8b+7{NJRs;2E?g4xˌi\=zk=iZ 28wHq|q-~Įq*t;40rZv=O%D䕫F!bg~]O~d!԰xU)M/7Pcعc#Cy B B{W "~bi Yt"]!VvWU, ^6l=΍\ :ofͶ\SoEKuXn#ۓk奜XfO°`A )&6y2Lfk\:E^`M=Jil2ˉb-\WT dcz4Q,2*xR nƂٿ >~`Νie1b &|9 痼[ ~w,T,i0߉ma բUbF\~sb=٤.ئ _G g Z-v(XSp;q %>TՆ g N-/ zՔk޹MrVqь t./O6eeӺc-QȵA8qj|, ۆ=CUqQ>՜cs:vnrf=BxdK 5!\ ?&mrk|ү9JP`(s"{Y ɨ=O~it.|#& lFH@%榢W@/j=ZO:}1%I,*"ChE מowb%JUU 5tžg~؊ց7L2e,!MX{HFE!Q%yPns;@n.Lz֊)#Z?=%WhН7&s ;!osK&wS 7 T4g‹tO #WyT8/|]Nf}#S+ʹݩXmxa{z5Ͻo kb~`B'2X3{bVo#-[ mXC,ngP[{uhCp!BHB<( d;Lv:SpY*oH}xϞ϶8s}W_-}& a7?u/,ĐQrxѨ Qu08}=P r:Er$9hҺYE֯bʩ{ Z\ա-w3m=8j(p1kyU>ʼYaYnIP*! X';}ӿ?3>n%˅*jq@g*W$;/AbG\C0D9LmA߬F0+W1[&pDE 8S@?oB5֒v{Uq{c憔#vd>XvGygxh;s=cpx#; XnUk5Ph/L(jWnAUO4tgLtNp-b!BHB<($8o &Agkn /\^pgdW.^k{Fr D89 _M:,+=y|.G/a7<YaSxyꁿE\!n}Fu<|vOfVLY27d'A#߅k'h՛1ź98:֡1E]]ʫoDq?CWrrlaRsSYq^~tit\bb8\ˎ+Ԩ_}éT16l#A86eǝI^4Jfc$@aPF!A.)*9e1osܜ) tgLtnl7.elO#,귢ӷM7|<4CZ:P^MdϞÉ!.UE[eH]{wɍ4ԏ{2H ~5)EV  EU Y˗~_ q7mR}jʱ7kղU4h5 䖴X}`quhS4iϩY9|&uj&57\ά$R~yEKhØ@灙êI3p҃ FPוFڴU _OY _ʨUNLX\1I+.쮝7[57yZa[Dgڔל/a͑9{U$0IC߄8~?3 w7nÜO{%á`8vߺR᫩o]Ƙ4nfZӱASm?{S Qu_&Q}4VՓx go 3n{ |ؗ:q?.`ޱ/̔l;-4|M_Æx}K!G(AAA1_Zt#.E^x5LgrКжZ$(F.ہC ))3xS4B!I[Kh,lmmϫ hpJ=eh!HCUp g֛B! -xI7%B!',`nSWW{l-i !B B"+N]o+i!B B!B!CB?10k0gIK!BHB<ΫÇ!AOp*x~I kQ pN]Ȏ8oYnmc|8uSI' xAw|æi~rjufTv<9.bSlvL]Ū]L=**֔&ۑ׈+yYn혽]#] `|:rnw<¦diIsSk&Dy5mg{p)S!K5k>~g#?>CK0ew@|99);H}OK"w!|fJ=N;=g<B!h!#*7 =|l5{f|XҍHn˘zJq% 1[=\4?~3h_-7 ?KcFO2)V`|pj4iqV]/1 ̘/_Yv1Gw#jP{QٿleL8˦/`?kRG9[3JZa޴.'2-L;]*d$tU^wӲr !BäXV|5\ _[W@wcypɇhSK1'1yOl\\ǿ5,aBžid5lEKX&ix}~-І&Bwyn ;O?u]9ToR9~\@{;FQ'>5{jsxYaa hVp0#vT>[v;GX7 VE{2w,d䷇!73=ptEK !B BǠEIJ%p}6EA\_fgFilϘYKb I|B}嚩1<û]*S\5}KJWqqG9= wYSyxEEwX+qĎiP kyK̾Ů:weIDAT8Psfa-(ܺF4 @y[HPf7IB!,gX^ʤ[Ջ]IHKwXϮUYdU>ʼYa<,.gu9ƄFp{ulW#L @o޽)1dP\Pxh;sD+{?;۞>Bxf{:־Q"rVs4by8W$>5Zܼ\!\L%RB!,ڐOn:͡)k իX^amuzѥM #1wsŧs/!N'7G^cui٤Ͳ¹Q:rr5zt٢ŋ !B!xj<,~% !B!xCpI¯`!"VB!B~C-i,S4B!% UA!Bߏ`! 1꓏R++i!B'VV6T¨O>a`#i?  _!B! B!B< ;;KZB!B!3NJ|W|B!BTxаQ"B!Bg#"3Rv899J!B!xo);[w/*#B!Y}zU&5IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/security/image07.png000066400000000000000000001673171461403617600240410ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwxTUI#!!&H4׵evRW\DJ;I(@BR'~BB$@<̽w̝a9cPĉ=p0k,cl t2 `v;.g..%K@9t0'p\)f35k`=\QQǩDDDDDDR.Y!6,ͦ*]a0 S3vi԰>ILga)̶leK&YEˍrkv:U)""""Rnn%/1>dgrp98UUVk1[W*,|ߞK[ۋHqi߮E۱s'/rL@'Lwxlc2̞Cað؋V!w%w^h>. d2xG+q^ g_.qe2̞=璃\͞=l_\wo~-8ف^&ORVw(.pyV)""""炩T)ݚf SNGe VɓOut6 g+q-Y}{ S)x. """" %,fd͖R eID\E)""";R)ʩԹ~yQ˧M7U,r5Z ^z>}zUx9u>Z$4hU}ӶMs6:E2(e07~<̚՝H3,?c޷ooCe ߺloy}S^7|8&7M)Ggc)[ӳ6 䒙=[Xo)ty|`q$(M-n{УUCjYd$p|O|g[w='.no.e6a j)5لRʹpɓe _x_I*n ї~/&K&51([+eߊ0zx׉<^;j>,3.ྼg_b);u#V&)N'#̛?#FШQ>*IDDDD*= ںHW#=g{ vz_B>3u}H!O٩k6nOs}EvyZO{Ico͒O}ޱ>ƍ,ٖDWOr˰|Ye]Z6\ŶgfəLk?O| .nSS$nZ~xZAľxlθDF =û"LNDzmco1jy_Gxi8r@Z=gьg<8yKq5E]C#Աo'HU |gZ< \~Wf|TVCxtg#(>9_MBxyAN[njʹ7r~З[:Lc̋534}'Gh}{:Xi/ѩ Nj7C}ճP׳#&͉b,DOo !z4Ofqi뎗xZO;}`4D /s걧::]:bjN~&G/K`ѩce:v`۶tI""""|iwݕG<ϜkYzvH<]_->NH.ћcS߾L9 /QQúbl.R;!<75vDyzY-Xޚ'ߒuq\$xXXF̬ (Om3Ki^+]}Ӭ}g >g[ng3u>H/;> -vMqRs9 n?ajmc Qn۶ ;+ Yv~^DDDDD7nB3qfNǺ'`8a[e~__̴?|=׃߅㛭= ·x01ԛ Bo}^pCeҖD=_6@5>2h{w%o; 5#bU KיOAb~4k; %JǦ_6%F''qvHXxuk2sI[NuUkxȍonϝ:v 7^+pQ '(VpU03'vpp29FuKFsM^N };үqYŮ7/ȓt喎~lRq~bIWo; ĵm6丩y+wqrhj 嗪3uL][7,ܝM\w.5t鋏S-GNHmgpB/fG;y7{-f{„.D}6 .Ot-#߳hQ1a(W=!? yi`5l))DmH:\?&&K; s@[>Y/QSY!;w_Ȑa]K8,ͫXu##u ;@ Ny_o$߆ađ}}uıx6^lъK6xelg4w<ďJ\gwߟx C;LE!={)6G? O?#nOMut2'b\awxTw 7=ѝ[Rcͤh* 8b_ADDDDD2cСC Q EE=mbևW{z-kKY7s"""""U%ۼ}TM\Cy"DDDDwH300,&3^6fF~ |xyȵrpxՍ~p`ՊjDDDD\F`QQB4@nn7x+r}zjes*LƎEDDM7bMdTgtz:wMӿ)c,""""ryـȵe{cn"#35a=wZ@5/X\['$+vV__zгRBp.y^Νҹ3# wߣuV2`U{~UcD4YfDGGspi}RU!>zɅmhy}=r7mp~9:waݺ|^,o#5k @`ꤤTzk&Noô3* ]0HH?>s.u7mVV>y̙q;0h wϟ_;oyΌW~=SLewŜ09dfg1;:e*ݺu'Uᶄөu4ЈNZR˦""""WJ߾}ׯ_p8͚6F͚l]pp0mZ5rd7*v|[!9%]pYYYzЖj<LS͟_h}Rr2_~5t޽\t\O>ŗؾs~)bZmF<أWyrRg_:{y@径xgЃ kbN:)I~O QM;)fnv2xj@#OgJE4^ۯo=K!T#CYVs1W' 6!Ee,]s{+ڜl;]DDDD2͛5V4mڔ\ގ?=;TکP C}' sF7=egx~&5ɴ=3mNG_MP8[3;|{/ϸL߾"a^ %lHYKIG7DF0#ʫ)}zovWyYfj6os܈եW>9 7 :+Y^Ʈo|[ WkܳGϼ_0-vJ喛1LƛS[FiJw+5'$o8@&աYj*\0 =Rb'^V/]Oݞ۲,e!jodx3MM`YlMQ@5L6m`2 nm< 5-dgNFfFɺ7C`cQ=F-^'._b?xm^'o]Mz1OVLO)ɤmW2.kKdy1}F̄"8]14{?9懿's!$ۨGQgoiĝtД L>2iװѳy5-ʨ`}(ɠƝ%5=~ˢ nבCG9d''"""RPjZ*|= Yz &Mof>!,`edd0yLUWwR?pE@\xۼuCO||}buV~BBM6Qݿϰ| Kԏ(U7L;ǨN3 uA[M.>uQl[RZKnxu\hW?QzznK궃AnNg׉gP|}υ~kzGl &]tYc)i4HX6lñ '""""rNVV|!ߗj2n[DEF_V#bYAÆ H?AvNvu>>ԭCL̑rub*srmL<ȓ|'GGfe&3C:ZسtӓI5ZpH Au)Rs.{pF0Wj66,ΔiC3՞IZ{}Iy=@fHs3).W-ϙObuOf(N` r""""/?gϞ=t׹^V/uΞ={K~ˣjHݺ|1wz~}ק&#G 'nJÀAC*}}|+4̟{޽z1rĈ nצU+n<L^_o(`ݺmӖ:!~c m[_~-iC!̘yp=Y#O@ڵ>{VzwlNؕmK#'0ZٜL=Bz"l/>>'g!$, }z$>]-3$pD;աS)&+8t:;j۰bQ\.$$ ǞCXX8aasHL:IRRRt oF}LISOsyy<|8c`s5|/ IDATTͪW[/T~]|Qnj֨m۴[oéԲu--vK/^#0xq|!ѐm0'a5s?kefkJ4hф^FhB:!Ԭߐp_+v{.-"""R&MpD"cƌgge豜HqFݿZkx\.4UㆍxhтG{&4_d^ȝ Lnqb.zϮď^_`=SA4ۖY6 J7KqQd5554'w,`ne[ҌD.Q<ԥ{]?~V\9d"r9l?@߾#igqvt/ "ޝ>iI7ưaҸW;zyc83I;%6bؼldҥMfbvcaϵ򻿹Ƕbj^V^C^7pT*˖-`!gn.ƍe+*s,cСC(ߔvntz+r/oA=4nf]lڴV(9R ޭ[7{9fLݨqcMӼ;lذA^W)Sy*0_g%)J-yG˟KfZ;|DEGa*Eֿo_zf͚CVv퉾>;FzXQ)U %k0j԰~`x.RꀀFED5o@tTQ0gOV^-,y,բvx"d7J/N|NNq?2vey mcmQ}`;y;rۨioo53D1e͞'vg^`A`݌h4pQ&9u Os#u5oZ=SY>=֞%8IF5Nd$ao y{_确UwhP U"grk>k&Mv˾囊߼!+ tv2XŻ<obڲc[~kE,h֌UkNf:zrx#)֢[RٲcO,k|;[NoXq~NJ%ը~T~4`a͠U'c׭|nb@nٮgH|{%5;LԛODDDD2e||~NWTQ_t n91H&jk9RNy۟ơ5qæXs4)x͉%go7Ud7|53}Q+-Xw}>)[#`Y.J8Q|lه?ȱ7Zw)'q'퇯E݉A.iv-$dx@=oASQ`kJ] &-k4Ğ_~]m l8u7a65;E|׿Bة"!""""rmA q۪W6bFEI.PNv6we}R^28͊%n1ǃpo"ˍLN q1 S?|g|P~TG <9x,Ou?bu&.Ym -X;i_65ѤF6DۀW|/$!8==|wQBjiT5a~rJ(*g \}-<)/8~.m^Z 5l^ZС`.x{?XW([r#6k4m6/OÕMr&xl o7dd.,x 23.z,.7[ΆeB@'6vfB} I756n1? ߈%)u\:2]GK׋04 iNfTfcn3k*pQ&9eEDR V@B7YϾĨ^/7~ щ'rk~ɤSJ+F*8'4 =~b~n٬_ν*;QڇB3S9ݿUD0r5jѽpdڢ)ȭՖ[N3yzmL0x1a5Ճ;n28k^XQ71ilN{ F4ǍmlYt(9~w'Oq'CeoV}t3吙YjGց?ry!""""|b?^%flɌe^o˿3?=Oݳk$md=6_:OAQV䮛 nk Z -mCDZy\Fg IdLMy֓? HX[zwnCD?6r>zMֱ%\=OϾ_nk45o*<0UNysVР&euܳo3-^tב˗W~fmJcXڤ$f J5Yqm1̾.ll@F+ӷpŎodbSPDDDD nupB/2FhG/23u.&l`ܹ@y0o}lFJ`NSs'\7ۮKj%M>Z4HxۊtS^c֪t?s* :oZ4F*]ÞJ\"a p:ۗ6zvDϮf kZa}"^ߺ/:k&u.iYj:n>5f޾snw""ӭ}k:M_ VIV-x~~7h';lĠ!cn]qΫ7X=)"""""\~8a5?,^öc$J#yPVTun5^YRb'"S~>>〰܅zѳU͊NR63/:Lih7jV *.Co]-WDDDDD/_>|w \v^&'QxNa cY{l?kqWxhP駟jˮKŠ%%{9 &1~x 9>{PßzW.6ﲈU4>&ߝ7m7sS2Nr4QLZ/u[{Y:O=*=q,]zL0prpN Y.R{,|jڤzȈe("""""5eZ>Ld־30J |1Y|Y?CuL򺉈p٤aBaԃX4Y%T P؞JݬY$^[)a}WJ i吵͞C[CC૎'@lM˧\[u;N70Gr΄P'O@e`歏-e3~e[\{Gj-;]¯  ǁLg߈9s.i^_ ѷsXEfO,;FDDDDDkبGP8ZV|ĭ؟mq ƚX}ގ}V0½ l֑#ygl>jMoOsu]ֶ!pL=5ѹ{\jRb@VbK!];x74Q7hzL5EbB]jQ{Aß?OɇWnÄw޼չ4/LſuGOږf7FS_Rb$bkDDDDDJ Ӛwg,y'[-i@.}xMt :;@|6U;-ԮGݹ)o^ԽQ&_d~:N©,2yfY->֩Gxftן74>Ǔ2XylnAkܐ%p'^=[HquH]*:ts8o}Gkl԰5ZDDDDDD `QQQQQQQQુųj*.<%\.""""""W ՑaahALnp(Zf6ȌKo+N3Dx%3r=Lկ/7N6Lv sxcrl$ɽ 'yy[\! f" >iNYNuf?LoU\7u3D>Mk Cie='L7涚qI+YˋGatYWH9 \=>b'76g6S`\w7dj.Ot7X+55ê)l't_lx$7Gg}.˳}xgL83֠tz #w6ts}~;xq]:vAqMo e|Z˫N筻iuy>Jڱlf20i;ÍgkdDKWH9]3p[x$n&ƙfj yaU`DwQԉM6!@^, łg弳Nx*ς;z({Q"CHB );?<y<~gYREe.bW-4"5Ȫ]^jT<4nM IDAT+㐕]{f)jiRUryvyr,7iuа$2"F欜Vn Du$I$ճN-gB4H OP TdԼ6Xg!N .Mޭay܊I8g~ǵfH`B^ +TBMV&X aZuιXYSOfCM,)ؕ$I?BJkߠ&4/T?\N(׊آ#Ui|e;tj@6 ~+'{hK+Gi Ae/M *Ϊ mJ@ SWPҤZBISMyw~?-9:%Y"U-prFā%J,'] `I$IC p%, +Nq 8DR{iŸBP ՙ)?Rł$߯):7E3YTruTVnՐs[L'JˊrFNz>Lthe9E)yh)$ ?,4-f7pKh$[N( U5/fP¥5ԾX$I 7̜1S&okFUs w~_g%?0{aqy$I$IR]j.kzS8 t}, %pJ$IҦbժyy\KC$I6QI͚5ݱ97v$I$I4g%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$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `I$I `I$I6[Is 1I$I&# Z$I$e UINNv%I$IuH$X,K$I6 XlPި㎰$I$i^$I$m 6Q $I$i`K$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$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I%9$IҖ!AP(dK$Io! `I$i ]< Būb-"잒y{[V#K$I[@/̾?Ư~yj/fi#yhfsd3$IR=_D"EQ{.lދv9~=3^6 DZWV["&? $IT#8Hi.h_]j4E$b$I_&VKU!$I>fK$I$I$iY%I$i34eR>V,`F#{7lଇ3$I]YDoef^ϴddK$IR1$[N;flfl.lT3¯ X$I% M͡mjoV:@$IZtsi }WlѬ5fEUzx,I$IG8*N|ڵBZŠ#H[+簍Ɖm^wLect{!w:X$IR(ʳUP=J݈[ʦm^ou$I~(7HM;og\f'ee~1u,̭N硬(K nP8*q9I _U/2*MqelNɵ:!,}hdoˑe9,xM]- ڇC$7Ʉx!ozۋ1*cZ[.n?I}U)A ;E-ws\K$Imxh9$sH.IA> 6Т+FP6ڇKRWߠl  +㙅py1y+xC-y.qt:3 ?lhԚ?>v8Ɂvf;hӭs )@%_x>˖ӛĞU9~ی] v4%I$nOaXu#}2!6犫70SԨ=B! WA>m}:AYIYen [zώ{sE(ǨXm.qKnlwfcr'M*cLh+Fz6C -Wږ}uMz&W `I$I[Cœظ-)@Fm؃jZC,쯕ފޑD~Je8Xq ژmVFmr.ݓC0rW.gsԂWnK@2@7ԯ3onM$Iۉg2 iԚ?[>YPliʪ?驏Ñe[!Cg~cA*'ُ~I?zh-׌h#&`I$I]Oax,&\ԨW8'%<]\$ ,cR&ĆVq#@U߮ZVB> Ԑ^sgşc+dc$5kf>]BّdwM3$I~#1.X`h:S(nm2sA* 05\byx"szVը,䘩opF,Z6AqhdGl`WL%KT,9ԴtZGNiܚ?gsWl. fhxeh8-ɫnʜ$Iۨ* I9k(5'$t b s䵆t-䟋~Û|x50~7u}3f0u(8+V 33Q$I6AUUU4hzlھ|:t(PP{! D[mݥvm[;,I$IRn}Ou`K$If.G36䡖G:pk$X$IȌD9+'$I$$I$$I$$I6%=bĪ}}$jK$I4B!z53Aѯ2{@ -I$m|fnWe jՑnùmK5Ƀq( BPݖ^kNq Ƅ! w<]yjEPese Hb=]%IzfŊd222hР3f p9゙g3(Az9&|}_mI^͟/W>rB+/fy_h֧/o{fpE5U!`޽ f)I$7vm;2qčĉ޽;ܢl /qiT0ߝ]q_s6wWǭ=eçQxr+r}n; {;: t9ǵ^Ȯrנy访7=Dlԣ\BB=v-}ߢl3*3C#;W_. q-,Umt!m_ECp"bClhfvm۱]~@2綝k;{Y{t"?Cmԏ>1eX'{NFm;t^#T ͦ]ο$IzqƼ;~tAtAD^^o767I~`5;҉?sOM}qvҌʪ' oՍ##HK>.G Q?_]^O4oPRXJQI$I"x_|A~jK;l!YPY&ySk5kV|,KN`c84ioMn.*YcҖh4$XUUlÄX`n86X,ӲEsxA^I$Il7i҄~{ޣ_~[|4F4 Tjڲަl3)d@"ԌcY)=M\΋R{ɣ鷟ɣ|lj^l$I_{8ty߿1ڌM~իpVs'[!䷦IPPEAbN+j5c=׸o9~ ))lՇkK$IFoInn.]>˴/Gzt|z4 ]zGo[c3uC֧zAkFyvRykݸ ?X/q">|3 ~eG)$I@Zw%77\}]w$XQv;?㞋=X'7@b܆?#/ ?~s^4.ūO>˨5zrֆN64Ox͉>~x_ugrgmfcPF0۝Ӻ)-nC0S 1>q,7 3-4NFOF:)@-AFlسc{$IEcβV oVk8g+1ߋƫu5fA+7؁hP3 Ǹ9k7u%I-LCRZߌQRqų[{ۖ l#Ge"9P3V\.nݛ3>%U+fa ڴ_:U}y~ qr>SpQ 0|nAq$Id.qj: $l:7lƞ)^fK wއBTU1h +MV\Ն=fL%ˀdNl׏dR]>.(Ny3 WmJ)@"1RUŅT$PѼ0f9C΢oΖupBԡskYc[&~[s*uu/.K7j-N_89WǍ=.#;mŵn=k=o=-1WǗ{W]bndwމ;Z$Iϐø5 s@9pq)[bEc!z8al-W*֘2 Xs,܍Z6:&şgk6âr+>u'CF ,<&SRpۓF_ /%,#;~6?斋hiI!o=t&$&Idb!Lji@HE<=}"f tٻo._}UЀ׊۴E{-2ESس UcHɦá{/30>{_b̒*R:ĹH9N৳ysL*0rãw>{&'0.`ύ[yxo~v#^K'N;q[\z O]$y6ӥ~9x!c8}N?{qS|:h#&WҁTʙ#$V4h+'_yI?nQbPU 9s{*XׅTEc۲9gqR WAԷ5t[9G!ܑ܏ۯ݋v?H?,*Na/5j(IK埽]@rӕlcDJJ2iu\g h;$IW^>h?Ztl /FhAR&E849 (+h ,皩16Sx9,X҇Z1uKzmŸD <;k7=8}w]~ Ԕ^W]oArpNb"/ggX,uBw9\s<Ğ/dgqy=Ǵ:]<';/>ӷGcp8OO84čw}H ;`!~' bs花'pК3C{Nj߲d#Ym;sw1x@n0oК[ww7_Q?_M߯bTF=;'?' fYK?fퟑģwCOIZ>!Σ{ͮ$ȉK`l!H)Ϋ՗಻cN( 2&MYֲVgVPMj,<"Uri{ة{ةq ݌.!L䣅9)@e[?6Hyov.=P3VołϾ٨H\LSh3昃Z+I7ݖ4u{YP鶦q#&޴b;qpIϭiO jӇG4z< {;9a3=i'/0%}/ǷE)zoU85,b:ݓu=ppi%L22V?hz6eYlʫ2 xv cde6diZO +(+zLr5$u= xܤb c]K?e^ӪP)9#̦G)HI'ǒP6;r|~8o{GhQ\pX!/^@Im8S9[ oK(+K%㍲V0w 6 ]btAʰ_/'豪B+7s숕cM#N;$ zoFz2%eNcзy'҂>@PH$sqk@͌n$ @89w V]9١\̸].1ŗNAh5'kw=;1 + `\uA@"9܌wY#xp%'\ԾLzFQQ:DJ{;eG޾^b hLf0rjOIY1b?ZFeU5ZvFcҢmȵ6bɤqJʪj)\VDů<'ʋW}pr4=ç(3Q Ẇ+Yxfk<<<'wsy4@@B3rly 6dͤaz*k(P:\==ϻzX'n6rLWr҉.eI.,&#aّ.ۑÀ҉/qh۸)$I&C7ʓ`e_P5|׫s۝·vYQSg@(1lǃGNÙmzCXh9*2O{l`sJ׮ Ԃ2k/ W.4BisnۏjF8X[wdz欽[hMrY+j)͘^u8Gj5{b:;iPs|4r*i=zM9yٔ]J15?WSR,B^ỚRάg`[7.~f}Ќm# ԜUuyFɱ)ӭ7GL:;voæP g8vݞcGƢ!ʙzmsX <"x[kH~>j/v')KoZ#nBu0򃕇.W1{|a'v[yf WF+~!Rw؉] o F}]N{v"eH X5[ݺMI$mJ8AϟrtnKed/ef7'\X9s3=sb|z6%|2Kn=EhE*'KS)nִ 3d__}1oMr^wDzc.),7<͹y-ﮤ+^mFVvn ~;Е;Na5gp\9'p܇gwҋ%0}306A_ʩ0ONc\s5!ђn8=7ڜuz' Lt.PZk̲U_.>v")>o:w7~Z^yf>KzQnaq>A4G#T/_{Gg$IH7̜Q3;3uAX2OENm~Ħ5R*((pqu6PxXɐߎD"Y^1+Sa&Ck[O封4Z_s;7A埽}CF3a^e_É)9SOk'pçe,}.\gn⼧, =tG愉LG_ϧ1d6mI{s{%9T{ҦrC@ͥƖS煼sEOYնÆ=$IMy!##$䭶Ry `M$IR1%.9[9С$I&³@K$I `I$I Y^$٭qI$I22[u63n3I$IM$X؅PQ]- I倬|m!I$^P(ޟ$5n#I$I~K$IEBB!KfVE[B$IY엒]ہ[TzII5lǻE3#$I$]dj~_ʕ_%I[fw^0;kWV]9+œ"Y)a <55ĕݩ{\p<0i^,凔m9NY+'˓)pH#I$JJȨުWOI%;8s *(!D)kN>fBT\#Ik_/7"ba:L1 ~XPAA&V&|.'| E(Ia coԧ8a^cI iו>M/{7$u6?z_3}>}2p0;_ۗYZBe(n⁃ocbG0/gi˃W6 f)H8:w.aqko8"Nvr CELn.'} Y*秜 [Ej_LLɢ/XfVFu:︌M3e!~leYk\,Id1zFH!`r^M#Rx%G."B(={h ҉d?)DHjs eהTe:f)ջF߼W薧OQ0Β38fwtlKTRH CtQQ,E`)ς R^ޥIHBzyHhD9'Mvw̽g3މ+*x *t3l] #YjLഏy?vNg.4j{+jRs7K1ia:Y&#=2jxż?kV'aӃkK M>qVө<e?eybFAfTs55|2z" rqtɇeocDP'o܆29sv $s֑[iщT~K:K>lwo&;.+nCzS: NH̻2)keϲ_gZ|PyeEDDO͟#G<~6v aP^4k|3 Qboɐ۸0pywjs,]2= .., X牢{&\̡|Mĺ!=zzpҷ"5L /f<0'/a@g g5pi ) uM|<#KGq*"ZdñQoDw|Έ1v#%`i{TO϶2U\ւ=i S2wyz7u櫁uqe2|icҗc>;==GFA^o197S7#lM/e{z;œԊL^/cRͱC.k+[nh64'e5 ߥk,hup5қ1t0T6oǿՃŌ\T-3XkHe("""|clݼQX]4wbLFa!VZG: Mum8'ž Kn6;.`Y<F8C5MiӘWĦt!,*7bcDйg_"ʞgUӘv nEÙcLM(*3ּ|N>;.;Z04C_XҜQ-BrWѥ<4WsÉ75M'0Y;4#WڴɈi %,\JT/9,<NHaY:b؂ rቨmT4\9r-=MC0-@LoZ8|֥y}Ϋ;fPnqӺ df6لc~~ wV3kP?\fQ7` Vm& `V>U e57pk ~x{]uyYm؁9{txޜ}Yo='4tX2 rHؽ-ÒM!s\cy>e:aIJIrLco_N IZEq{եo5|,BWVJ6km)'ݿg0f: [nB.4.\ǬlS;_㖟obo 8o{}ǔ/fLg}hDvAxs]@0@ r\˹CMiީ&f.H.ʢٳ:\|Rw9 <feAK _A'@ѩJ2|O)"""" "+K/ԗ:5ܒj2= \[^'/`e\|3i?%PƉ&g=K1,d#K IDAT3{j0 x|*t7{ <Ŕo?/dp0I|y+9n6p]x;Κڞ#WbMd{!#+ 3%bv xZ9 {tuQT "K_K~~X#Ɯ=3v<hz-?eb'A ?<>I-Qq$ygvӠ,`.a%qO$ivǭ̸΋UgQGvO2L)gY?WwowkW8'dl56Bf\q)3qF `jǩkI4N3g=:2 t"7oJ]W޲'Wè kHeL^[8ڒwF˽YDW)_܆̋s*4*Ҡ~^EQs\gNtYOVs$_JnזD~I|\N[_÷ۊfѼbJ:r@}d×ktjyɀj9Vxy'n%~ꬳw]k 62 2c'qof6ٺë .d nȝQ>T VbΚĽ_꾻ϾmIAb7cDӤ7>]]n2浟^Ȱ0ؽ; n*'CL;ⓍdF䤦kp_ Q&׮|9gכOnb_P{ l z&?LM 2hoVj%At]1:>'^mC+yl7<{(cY&ĠMoU exfd O>؆, O.\J Xι?~_5εʝ6OxwrPHb_~^tFvQ6 rL75i[/ dPJB9 7`MB=.,g1SQfqV;7/'֢>v{VYs-W@9|9))Xค:ksUzI?`ds{JF63WO6LrǭaX0RtH}xkM}t-Iq75jS=>k:2<>^bns>2kqׯP{<,:|)rd&T?ƎxR~ll6,~@rN>\ `)l{g̷W-aJ9<8ֶGIDDDDD-%4狩R=;R'ޚI .""""%.08 zOHhX`@盺cVbcwi &:5-Uu,"""""rr8hШ1 5l@AgU\jf"""""|sR65}jڰ.%{8^/+c jrQ.a|.S)-(4fUDDDDDD. % 0 p8ӣ)gzvʁU>6VeaUHi:CpZ!D{V+mXzEDDDDDJÙǺؘl.Z=%6TaPOcaw6{N""""""RD;eS `.|bV+p*4MȥD;qjf.\AZX,L<#""""""#$?V)}!ǗU/V^U(((((((W4bȥ0b_VD5M)%l&nU`,""""""f=fjbٰZ% \"DO&??,MEDDDDD4vBЦl>>V\rH0b o!Or3=/|O#b\~CO/NpP?֪6""""""HȪX VUHw!.% ,B""""""UӲ3NTR!Ē牍BÞEDDDDDJH? YZRT;gI&vZi>fٔzaMJVZ3evR{?̒-F14 ucW 33gqe+v*ɺ5o6@כi JDDD22;uw@ =vs(9 ʆxft,qCp /en iOUPfu _:^5{ |okk[rNٰQew oM #L>O[:o 3([{G|Sogs-1HbD]CX w%bg_}Jt\m5kq+а- uBDDD }{Yn_P[͛>ϊ9V^mJ|U} 63`o-8c9ŎΒ%xۼhau1wY]&` QjU޷5D\ǰnoMW>6|/'R~_֢۬U33y.$a׸OwySel>H9-5t :u,el=|3m3I<L0LI4-7&xq4Y_y,wdf'ɁN?S}`2v3ظCi&a޼+}!~jY,K/Uo$lDfuS憇1)%nj5;9V7 U^ = %|&qK}Prɼ?Jƿ?)Si++$=,#2kyfl9{YyC7t>Fflbo1 9~}̋*?K?MKmEDDDjj ë<O xFh5mN8 X†_0֢b-uio&Qpu?n=9=ne*գyپz̉9#x샵7l$m[ƤvQqt to-9#M匠^p3ؿo ?G.`lDqWw x]Nɥ2yG)n՜5ɣX_=Az@GfF3z*[[-=J0j/=㦱y;6As2[R^=~.na/'q;v-#&=N9坧'H/+0mߎO^Ϧ#Hy=v{h40QawL4ɓ!wq L ;/t;B"c0olwo&;.+nCϲ_gZ|Pye?rzgc`u5I ;m. X9 8 WqluU[EŒq{'-eDzUl<;7Czp%Oߚc]<46av/ Lf_xmG~Sbw>m%7ű-T6oǿՃŌ\,N`nCFz#3XkH(""rd1Mnި,`.IjX814,JSZNVq$uSؓV2aI<qE:˖'`Cq4)-bӰV=Kؔ?EEt|F,1"ܳiSD=2ψ1A݊3 nρ;۱PUpQge=^ wC_Lab8vCW9px9qy L%* xG?œ+UԽբ=DйU>>/pN~w*9/4 B[:hJVe^GX|:!/؉lPr ۸My?Lp4! XZ:dda`BlkQH^uN-nȖ*W2nPuˢ}җ $^ mJSI(7Lˆ rLXR kVÓOS^6&M?Wf5)[&>!F;@CMJDDD19i*&dɂiUCp? :h/^o]{Vi[/9{txޜ}Yo='4tX2 rHؽ-ÒM) $Me|vJN(L.x/̿"}ڑzR~E^~A9x=Cl2bY~9:s[l8rO_U;|_3;-z~GfA:dz 8i[!)ҏ'2oyXI.(\VfV6~aoI=`'Fb ipBKV W~+/nkLsXC}8I .yj/a ϶<VMr8؇Omg^)isf劖=y ?/ RN~k^sioqwj>P@Vj>;5} <fe?*QXYr8~ԩaTY/77~?xq[/zHwRqAIYRs5ÿme̞;0|5L?_$ ⮁,|y'7뽹s;.b2,e?~~vECXH_㼗XP*}*c3dz,i1S?{&r{ubwwStRijv;Gdx-D 'RZ"~N;lN93,OVC]] "j'ʂˬC2Xv+)h,[:vܲY87}^hqO&>}q/̩v8eгz;~e OL9 )@1""""r]u +{2&N v>negu^ W>kzθ7<Ψ~N]*umBTjKfS+׻((\? m^9XU :3LeM^ym +e daǬO1+PUC9 O(xV2n>1Mb/q۝9 3ʇV"񐒙ʸ,foa ާղ3JYyKc7/ų/yrvR{?Ʒ4ͼ-9OzgWxqtׁy'F#2,$vN4|[paW}zYl$s0- < '5,$^;:]@$<2v98̍'B|7_A '2~~'6e Cb|`*8!!/^TὟcHLIy1=~'Sì 8SۨBvh{[ž1M_W(O }{k@V,cWRMcA{\[u9׹c7Rq<;].P;/tpmzf3ZBDڴ2c.ݼ @J4pS6 l@znDDD-v mdxǒ \-q̗1QJ;da iOsrC,>ľ#_Cnawmfˆx4Mn}pӼ_f ]Ɩ$%7jsg*Wf6gW w̉==gWmƱ'LlfM{GOdc@FyVXn.%&oB45wYw+TЊ`X~WHF-xޞ'gmgʬ$Dwgؕ&o|ɼb}dǫzV- g/Q^n}o=LdZvy1 IDAT;_VP|}F<.=DW>ćcs?:m0ike9oí """"곱c.}}|:??'6 埿"zZ'WtzdFU|1>PG~W[3:2KwI%LZJ'$4TՁeMرm+4]u*ȥA4hIDDDDDDKUsQEhKLDDDDDifXx꿬bB,KEDDDDDXa@á굛"ܛV\Z=~<@6ʰ6?ČW^gc,i/VDDDDD.3999ddd~QOLLWMv =wG]zOYXdfnC\#$JҮ݋9Qk*' &mt& iPqGh_(`GxwK=_`PG\~D͐92q ~O ';T96Ng+ٞLF7^!ʫ('I|qqdzɷRJnyyS.""""" 6q1w\֭{Aݺu+;vdK~.!:#&G8^֠3ï`̲9*ʚf`wy~O_l&v[od w8^p.kyQMGZWbYnfեZ@Θwe_Ós]?eZX{CDO_bxVL#G0jzUukZ &w"9>"""""C=Dpp0:t`Æ 6СCyKm\Z=FYs+GOaw1~MhtCw-Y8)rqkŧ` _0%-U8>ï2Q7p,}7+zhX9y3ב <'n6{y:ɇZ1( EU[o !5)10nj{v3a<ʆ)!9. uR=VGZ2iYM:پ7 =so o kp}EDDDDBBBX`۷cǎ̝;Fiر#̝;yvDC~u9lޝ8K_aFV|Q8%l 4 (nԇ\ԉԨե\r8mB>vOr^a`\Dlq BO-jj jVHunT(2?CvvBH<Ļ p9 0 EfAtֿ֭Kz&zJg9Sxx!x֬Y4mڴ׮^.]|^;OrFP}wj/ 70s~>űfeO =5vv~Φ`{Oޛ 6k{vqEC]F}qdN_>4{/?wBYL h֋g}EDDDDܦM:w̌3x͊+ ,%={ٴ}mjǯRSzݹ#xF:]&ι@:l2hҫS7l:O1?*w3|d&{ԅ^WT2{o"k2O{]pxv8Sسg{7fʝ$獦H!}t҅iӦѶm[-ZĭJDDe~˲o!>̌&="lE NMgNLp C#bbmsaٖzԪJOEAs2a Qʶt7Z.ғRb+W -¢EXhr[\˦>.!Mk&Ʀg2q%z#u^2h, }~$nD"6>i1,)oz\aaX}rz}q(C Ssݧ|͋#bD4M`5,[nnaTvN4iP>"""""!x޼yk׎[n.^z(U_&x _$ǟi6nW(\Fx97a/Hnvpj?}38WY?5ZrW^t`2]N§xhK+QGGöXЕW|mXӅi&bcn'ݣDb…k ^v}صsKWʹG *WF+WZDDDDDD.XIvQQQQQQQQ````a%X[]L-!"""""R:>5ZDDDDDD. """""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""r9 sx0MS--""""" bj-X*{].ٸn_`&nl\."??_{2UG{2U,"""""LuY``QQQQQQQQQ``````5c C>יOY:>}ͪ,``MU09d2\Ǟ4 #Q^qe+8u6w%br%]M`a#%2=䮝9jOomڴ &RI=BS2g9g0bXWt"xxVeyp`yz|=HN4%KЭ[7RRRԀ"""""R*y'o˾<|[%ga7]g[In<f-/ULZq3ͮ+yWϜ6liiiL4nݺwߩ'XDDDDDυV,}yyFԭW[Ы?ǞGNI%}yGl'r'[5m1c(̴vֳ. v?8 &n/m&%-?|7]+/-_N`Q# _2rH;ʟ|Βw] n%f\yW*`ͬZbhп"A>O:iy!Ood^DDDDDJMu>aШ@J~$Ξ97/M'"ÃQfʂޕzLVpEq/;JB*a9KiРuC,deqo}ǤIhԨ3fP﯈*>wtؖ/>_t].n)g2gyo; gW2 P+u˿wdVt1*ھ>Tt#S/ $IҧL Ai߾=gܱ&1D ow. [Rw2o4R6A'mοgI$915?'jDET,S8?;>Aa)XJ|l 8Л0K[6E h﹐$I^}9"\ĪGԿ2`4jE_c*؟<#m w W 7: ΂}vS1Lz Jn,w/>iܯfu$ģHT,ΔȢՅ y' .>w/˥?~ѺGWƳi|XӋa%>g .*Қj|S蚑B,`ola'kYIq#h| //3yd6mKI/@J;!#iR xp< vgteȱhŽRP;Uzភ,Jv߾t/ͣ/v!1ԟ&@ʢټSY^JEsMH&N})(Q?oɢ}lǹ7x}v]rӅ,ȽSyjڊaeN#9yxWqV[Liǰ3OoB/^^.@]=,f(ȤS.4;zsZF3]/ҲGwZ,}&dw]ż]=:.w0FrT/{?gfz$|79qH26/{+̡4=c:1A#?&g72rnӓ@|$nz9nM gp|gN)$ JZj@cٽ $}ug!77^{ѣGsNXJ$}8qbMټn| KY;=n>iѢYxgKeIzn=* r5rYo,/k~;x2G5;ymYH]6Tk=|i@+K' yWX]1Trn桷lؙ}*f-fk2v};D0hƐ+Dօ_!<KSNBQZgrWrz[#ױ~" O@׵$zr/o̬X/ ̜=9~ѡ9`IyHy'VqL䗌{c63eimٲpoq(2lHpD H29S>oCU4 C.",c Tw<_5ffB7. sY he?]w᭥@O?F_ g9l=4go4}}df^Yι>MvkCi-x7;wT5co_Μ-IulIudXX͘6NJQr:veuUqJ+ԺrggJZ^4=@•9*xvb Kvд} ;wښ76iQ>OkCv6Qk>x IDATHKw5}ۯE.|"aa# w IiYW_w=kxg[LڵIiҶ}M\uGi?tP4 ]b2?'N0%I /W=+drYӲyl]3$o X*PEiY)AeU!aJ:}bdO+SXh6 +[`aВO.yì}J)=X־bĢPMiSxJ Rܱבv0 z앩eTajͮe۱iaRK7汢4^w_>^]e5/{FnN^&2l^&ɴ ˉ\}ͥ$uX({{hJ]ԋ@UUHPpOcS!@Hl~.?3`I$~G5$ʈTƉ@XT[.^>JZ,FP֕S{6#鱧Z8b5?[zT|MJ19u#srUC,E"=4$]TJzF\&$&5_ id3 dkW,e…̞9wW֏Lú, EHz#ƭ5㩓n6@hđ^y^#_a߯%IC>mWleAszunEY^h<ٯF<(`~AÚJR>ANG#JXחYDcOL"k/_رb=@Y8kumKJaWzu&[inGJGd)!o=Ieu3rgvIcڅ;ذyO=э Ɯcڥ<1׬ވa[ gqR,3Lϡۏd$nk1}Uv;.kDkocp-d)%2 "JA$XʈH!'_{;>CyxSL?0A<-}XodGFWLO7W$I*vl`5lFdh6'\Ct{>\ĺ=ni{@ڑh-pbV6.9!UUTG2[ÇԾs 1[K⍼[+~mc}@W%-in`ZN_)UUSЮ1arY 9Ƭ q7~b$nǞ1}ݖFa ֱge\>z%?F_#2Uf2P;Z.via]HaО3~r֓6kx{"4H į.GC 2խڟ^ZXX^{8ʂ .ӡb /^~s.:2ಟpimLŎ935%6-YŲ:Gޯ\vR{JXK*C҇_>5W1Ko9q7x+I5*JYe̘9=,))w*Z4~ sJ237/[Wa%ױN$R948<4IU^^ƍcʔ)Ư$IR<,PGv/|n# Y[\oH:1 dĕ|!_gX}< Ck`ΏN>/ ̬Gb^G}8Jsk"_nNN=?$IH})Fe X[ݐ̞N=Wf9ԯ3 A~ty{wok9XcZɹc.O1M>O" pߢ$I2uT?[9)%3p?8O$IC$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$$I$$I$$I$$I$$I$$I$$I$WV$Il))lK$IMഴ4XI$IGQbHВ$ITADbDzw$I$I-I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I@$IdK$IdK$IdK$IdK$IyH$ LWZ$I>BРA"H|rxF^,I$ICH*f4HqU +( gQ\uz̓%I$IX͈ňl8Q}tJN|Ws$I$_1k,wEð]seoeih5Ls)5 +YrϵfQiL<6EH2K0cL}Y ?RXٍ̢ !3x[|)Syt !H#55rƟBZN/s>>\^{5FΝ;$I ௢M;v&)o{?p?y·0 mKe26 JuS{ ͼlvO.o1m,'뒵[UҒ&'⾤, k; ?,I$J _~#VSMs. *?ŽO,eOЎ`:){ζ!kΝ;)m&a+n=`;ɞ9vzuVδ !SZټԉ'$I aPƶ5S3FTҲ֩ܲmFfRy!R*$J(}ڱh# }OBH >;qDfJѣyL$I$ $ nXJi X,uƭ5㩓n61bр0ш#/Z78pG~^{zH$IRp dӫs v.ʚ(cj :Jǁts& &r-/F!!F*B@EiGCNNe iܫ\3<$I/G|oqǭ[9]틗:$5K$3s9(>? #ϡh]RЗYJvdtēt5~%I$cs0I4!]i=Yo.b]ZKz4:qV>NjO@ sbIeH+ߧ3UfJ6=Frc9'?wnFW$IҗV0jԨ*fj 0cl>n+cܸqL2$I/|JNDH$IRr $I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$ ++I$I6U%I$ɦ pZZw$I$T?(XH$thI$I D"b1h|z޻p$I$O$I$$I$$I$$I$$I$$I$$I$$I$$I$S I$I2%I$I2%I$I2%I$I2%I$IE K$TTTL& +-I$I!RRRhРH^z9\]]M<'H$ITaH$TWW_޽$IdSN&ޱ$IdSvڳ$I$T_$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I!)89VQ5*|14)務x,;wD\3ɬLcT,Tt#S/}"%sXlm"%%^oOOis{¹t"8;?d2g~$I / ~#zb>KN0 o<$։S5Dڍ>e$;4:n/g8>}*lMlEAM,ޒ$Id4r4},`ArfJ0l˕ r,Ge}ksӖbnQž~筢~rؕ$Id)$gxt/aѼгP3:w6 J9d0' ֱ:JF?RC)л<^gEI%ms)ְOcmQdEI6L)^ >w/˥?0N+x|lVlEiN9z o]ӫbϲ\q<4k )WqL?\}4p,,{mo޺E_?~%\58{;杪99S>oCU5N,;p<H7sl+zE ]Dڪ "K;#)嫘[s. no0Nj>Ү{#& ^wʙY5IWtK1iAY5(SwL7DͼtL]_[vwR\\Lnn.G駟v$X$I2zsBtY7qa4t:Tv>_wutU(,d]4w >Yp,_v-[I6MC(4B?'Bi9ePeXOZ-W_C Z1|$AV 3Nqa\MɎ_qsb'$T5ϙ- (p4ǶI=6 ԎkWRj%k#_0qD#X$I2 ~#tf/dא\]N"#k+XǛoy+^VvC;j:gez2#FF4eK#{vQo[eQ{yk3كSKc0iEYJQM):h,Ó,nHSҡmiWʼnPzRJ )4 `gwnànbF,E"={c#ձvk C,$IzsbLR* ˈ@XUh84NCQdӦu,]̚آysX_F6:$Onöm= [$ Rj+/f[m ߃&@ƺ9̬}Unfdw骫"7738+I$}9qًFf~C /dnk 8FÆnM[/msqz5+ed &[e4`W=4=ۙRXQG9~@rV38atgXmLۃҵ,~w3aЌv㬮{uX3&O[uyTMU|Ư$IrcJ9 kbpﳰ[ӭKkBƎQ-^EKGv >n)׿&u70V#%бq ;28!&ؼx+Bbǜ͙ݚF bYuA>_ :{MZ^Bza?z~҇H<kAٺ}F 79YxG=_M>[o4~%I/`ԨQaU"d,\`7|afIIWV<ƍǔ)S_I$+_;=z:8Z4rrrx<$IҗS%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$L^YI$I8-I$I6W Ҽc%I$ɦFbD"CK$IRA@$!Fk׋ޅ$I$ | $I$$I$$I$$I$$I$$I$$I$$I$$I$I$I,I$I,I$I,I$I,I$I-Z__X"d2I^iI$IAB D"5j8D$I:ÐD"A<$I$p2$I$Ӟ%I$ɦJ$I$I$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$QO|L/I}D} 7 xf[1x4y.zp6UdБQG9;>r-NWw?%Ө>\1 wx},;,`\ؚT6IDATҎ3n D>r߉WۓS\p.Gy_΀NWR^`gጽJ|^p56ndeE +Ypϵܷ( Wz$Im1͛S @5eī!L$qZM{YĚ7y*c8U@$M5UѼim;kF`vK׿?eS{sl̜_ }I4/>[̶6d?=zӧ$B׬?q u˿lv?-]ѧdF5YyKK$IqŵeU~̣k}~jR6|hH+] Yϭ.isX`3ﴫ2 ts'rr&p3y7r :}Q0hð23:oEP@rY5|9^=C^$Id?+QT !G> g2|3WsrXMҎ`炿1oo C88cw谘lnHfSbH Y{ǧ屶(N2֌}OϤol+/|lk>lНse,|b% z˞׿'ooLjɜܭe^{ʺy?B6Eۗyŵӿě,Md)00s) scYs+w c a!;{^DSzu%ٲ}XXߩONtJ;t[f@<Ǚ_1u(Q?oɢ}lJjjq?Ce4mmb<8N{{32~OngIg) C?rssy=z4;w}#I,G?M_e#Ό ls dt.b7tJCD{h;pM_GF\\sv-d{ZAO[.Mðſw?ZXEH?MEW=KgDN9|F{wK48\Qs?dZGF&&Bn楛nf|bθ_DvTAtR׿ȸq8 oi&~5fq-ֱf O;-(︕3k?iߙ3Iy-]?{wV_fĄY}ӝwIqq1=~ڑ`I$b:~TMx%wB2yt Q Ȝ2s]-3wyɠ#'j@u'nyjc=UuMٳ5;@:u!@Aa]Ic(pEˮ~5ɦiEUՔC- (pyAjԵ+)_5}ٽ9Kʹv=9*aAȽgnĈ~^ @zIYiEyge_30qD#X$IZ"^ĎKѾ;CF_ʅ.lНz7cm-@fKCJn]IO2`TQUX teK#{v훵 f5fBgj /d~_5oTRkUvŰ=}oYM5ض Y 2b@e,I$eƑ#dl]kFMD[p3/77\?͢yw[Rc IGTKh,Ó,nHSҡmt`no4 lM{+Ӳq;pR@,.xkI$}z(s,G5J!u,|w+ɠ##j?YHgstJOP\VDUUuGQk:5O(_@ym{k)Ol,`cuH2hKnh]m@nUUՇ}42afp3f GOW< M-عh6k-@:=u몫"7738+IG0;hƴ76n+LEY'dlYz_ pxT 7K=kX^J*'[e4`W=4=ۙRXQG9i@#wo˰o-߿ρg3<Zg&L`K򘷩&Y=>`A:~ 6o21s4u+G}WFsɠtW$I9\O9\ߛ^~ *`]o&_^z63Ө^[*괏_׎Eh9H~pQ4 !2V#%бq ;28!&ؼx+Rsy4K#ʲ͔l 7f tl#o,)jGqrOv;<kA)d?l WO t|fui-5{>בo$I`ԨQaU"d,\`7|afIIWVǸq2e+I:·ߡtk)R}s=牐$IWS%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$L^YI$I8-I;Fm#0)`".! cHrZHrt1rHB44iyʭveTAw]ghm۔R4ߡh4J4)m*u [ @ 0` @ 0\8ak%*)e,'}ʎrI t]oN*YvqtӾ t]./r̗߲ v @JgA }p 40` @  0` @@ 0` @ @ 0`{v;SNaؘUk߼53Jw?IXQQ`A@c)AQAYܾ˝ˎVzs۹ޙ=kI&"""""""]<_65njyy$Si*+')bF"N2i>_6u~JJQVVF2TMHfX0L,鬳J7i&Ր5f3TaFl~3eee٫R0@Pyѩc'x<_v)}&2c<寸RR Ӂu/̘orEn +kŊOx8m)<<=z{g?#<3<'ڌOy0p^xY|ly0Sҋݻ7`-5)CkL&~uٜw9oWp饗pI'гgO O? <;m}/Z? ;7n,3g[""""Wi3n_WG:j&r! HD:_Wۮl26L&)..| z0?la H7Y- ;K5ymcY[֭+W#`CxWbG嗫]ouMMf=~]~?~+>~]n.If5rۘng~VZx?Μ^歷Wgg駟L&9CypءCp݄a8p-[A<a=Y,r^ye625, i_#<ʫ_`xpܘze۸O>T[}d/믿ymW|[4^xY^,zo~V#7Gٯ1v)zp,Ya ѩgַzӧ^,mm_q:x~nSXKx;lY#2I+oX7|sx l{0`+ɥoTVD xtڵp8_䵢"EDDD:ag-h}ٹ6f0S \CYf;nēO?PQQAvNN>[ϖ-璋'r5WcOD-icy󭷛L4"zo]MnjK',^ >7z&MŪU_z0 +>|ƍaGwh*feq1 ϖ-eWpe?oE2dGp9wmP(Ŀg̅L5kχx2hjҧOfx?}ƋuL}̘oBGbĈ_?ezuvQUٓpC[?HgL&~]PQTe;twu7]z cǞB:ޛ@^~;}H$X[n|{c=AϞ" +8`kmϨlv뮻\ kKq͓t=5?P|L}pq{m'Sl2qz|M1aj-<3q0\k֬mW.//ꫯꫯ~ngÆyUoƏjlw %""""ҝN=ԴLvmI((٩Vq=UUU?e3Vv޻o?7f]9?,""""п߮jrٯWojkk6$''lg>K3ff~('˛ń%5}|EDDDإ9n'vwZ.wZπa7_ c%!Obr}sίfr'1[9:t:M8j2N/sQV'|'|-\qe̞2N۾Xz2Nmcse䁾.ސǟΘl-ck؏@m/,/Ǎ_ΙD:4(??@QN?PX7~xUL8,;trT>Hwt3~N# /<Ŗ9rdΙǃLiv!sk/qw5q?.FuUnw]tD}m&]YڍVȉggu Ag󛡥L)u;V8dg(O:Hv[9$o+{Fo#B6ʹ.s,"ΐMqq֓Lc8;~Fp*"}r͇5im7 g S1oolxt:M*l|I3i;~vJ ps7  HxvjKpVVW_s@&[=ʕ+nmެ,n֮]˯/8~@l.+]ڵkcݡO2Ϟyh7րV8r,u;d,e\ 9ȡ"_5ԧP&vVY͹ک3Vn(ttzߖQ'g{ݥ""Aii)uԈN'odwZjy-i>cF[n'K25q5mCl >zۼ3[9l{zLxIN|;gO>|3&v;"Ox{ysCL..?}8 +sO3&c2;y*kC{ǩnnaRxx4aus9<6͒wIX_׿oGSQGdƓT2s͐3+㓗gI=om/ 2撳<~wTl~~I /v`M)+^7BKBo7΍e{A9[l5C#lᄆTkp+瘈n"\[Ng_7Aς8%~KaC{n.pU75Wsyկ cM%s\cٰkYnRw"UGu~pCa<N8lMeEo;9!g%u!'͘ /CiCab!/y<δŔ r,'Fu(%''M=|r%wOq.L4qxg%].x8p@&ඥ͙>}&/LQ}ej-[\. Rπ> ߟٯ2%%kd?l_vo￿K߰=7-+q 8 Ax͚ul \&ɒ{/g y/SbG2q%NgrX\^⾜reght^|c%#x1t͂cYd/`IqeOzV|Eoȱ~|ue?hIL`0"+-7b zhD)[p8*_<~P,~r@5ClX8E_qY_i%9~zZ]ne6PV cI BeB* IDATIհP+`o;(W_8z0E O$CW4*kY % ?V{0p=`_n/y?cw[91;*ZJtv?<ncUX_r<:VjUHO*ַxnstExgUq:b mp+瘈ȮTYU}=mJQQ69s6Ǟ1tƏ?R‘JޓjfznV*>[l;(7n%K/=W^y {|ro-=O&\v%9%K=֬Yá|]AUTTRWW~=9`@^o&6ֿdeem7%K~餰>vrU[Fwٱݕ`uiəVuzˮ{[fq1GCŋ>헬[ǀVYYYz-|NdL*lӼk׮eРm^AYv9v01&d*,.dzn۷aZ-)p ouW\|-O+^qo=-v=Cst![zEr<\.]̼jb9+֮}iW[)kc[ndIApn.OsqvT ZDYO= .̙/fZx.#GdŊ;~n'ysvӧ`5'{ ~}G`y̛;+m2-=Ԇm^R92nc]ӃeZw.: r͓<'h.v XK>J|9g:5^G~׹hnW 1jԱný 5fL8m[dը~80FuKN/nA^sbg+X:ʓo5#`{x"h|FX́sG]}BT5z|I b7N>?o!6`:P8\WVPʥ'--,Q^)1>ljc_|i_ ?_`.kuՍh)8zKbJ+*(/&NR!B+ܶ]I +Aۗemn ُmܰl?> ;wpnH*‘Cf#DzJ&L[fG.=̝7['O>?ɲeXl'ɷ0wx/+ۼSkR"H#e[-P##~ڵ%DQ֯߀a~a]^@ HNnNԖl@`o6?;?i ןBSτ];/+/g?wU-}'eÚɫV1s\p\H/`3_lʓu}:#~%)r2`,?f{Mpy?Xn9s/,џlFm}Z)/QV$38oK~br5Lڴb>ϛUF^-8éx~kCF_EiHm~9xFFSfψ_)xuNN72u qxN~JIE +08z<)#>y8Xe`ܱc 5,+%g >! G!=VbaxՃ'X:pt%޼ꆋ)k`kYωT'X̗ǟXmÏهLө o 3ьoPTPJSn9e + =׮#alZMi}i͎˿òV7 |GvZ87r6/f9i^NiCO 6p9jۓ%""6n,\Q[z%lXJ߾}; !M&ә`Lnf4x /$ 0h{kY`Nx<ԩ]OH'b|'[nr*;n4GUW]PӦjk9`:1|_0SOE$|aej[Nus{tB =ǘ|ۭLV:Lw>N:O9>d[tnIALy;}KBqq;]v|߲GVbqx]<}b~*6cIM3ۙZv\_qʕrKb,};z/>(#?>r.T|s7Μ=՛yOAْ7x~<7)?eFW굍GWCObˊRBubfb4#pKꍫx}Rʌ%›G#O`߱ 8gDOywiyXj7ԏ~ʣ㧴 ,k,_?=R%eKeKys1Î#`}>K?xŮ ?v,[ HROVoyjfbQtXjJۗf˿òV7~,io΍M[o>hpTԭ-c "].(**"0gN`X'xBIn̓_/݁`{KɽkZ{/?~ (^V@ wZM} jp饗SOǟ +kذ;Z7 Nyo.ϗի1 ӭ=7zŔ# 2}L>6Ǜ^r,ө6i֮g<++=]5s{53ocG5ɷbR qDuuUߏ;m,7|#YYY,X0sѣs7ˮK_1M[Jʪ}=s ^~ff;뮻+>g38ꑟO`ذCZm:dtQYYA,窫ʫL3g.S|(|UWraa}2.,xZn&Ə?=??}x,cn̞=g*npK{?VTg~пqKyW_ד8yHO0dݺu\W^~Z4nO6/37Xp?ѣeQ@ YO>3g_= xaݩҾH3QAUӏC+$GT(H7r?eϛ^YU#x!??]t{֕7Nϧg2jh`jay5L>sO:LYY>I/" *Ca]D]9Nm]#w &OɌYRS9s.MQsGyɷ>w7J~hq>qxFKÊl >DDwT2 55x^{Ï5 > =nO~~>~U_|f*gnnt׌$+l055]_D`fJƩP9i0-<:kO=d"''}K&jb1^/?X%pՕW᷻p:dDqs(.-bש2Dfu*VNn;X,"TVVʫ Zm ̘>g*va]Vkjq: &>_6vS1.D"AMM7^cF1z( {gZPV ֏ ersslD"Q,, > 41'""""bśj隠L&1M]n5®' Nt{QV轐b%7/h4J("glvq9]]ݶ u("G$̿xAXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDD YUEc1q 0HRlf͊fnt8:?FD2J<HHf_LfvʼnӚKDDDDEF2Imx"ʐJbq699>KוHFn!}I''ēalf'^,Nl""""WPhջ56'HPQYM8irX% -6SQ**u‰ GH{d4uBᶅ@`| x%xN<Qٕd -1;77/H$:EDDD[=ҭwkqe`&E"!"V'^<6Dhq&_YN( dKijkmu-۽fpZMN$±J" e<< m2{r8LNLE+1ҀblJJ &e駓PDDDD-KO$Z׊7Njn&Kz-de=}4^ Gˆ)'Haqc`Fp{~-pmuB:F<%5w^6oY 4i8.LMfpu!Ĕ NI&1YԯjTXd" O%RQFP't[{L p l^Y1w6!`Muķ`#'ta2aڰY|ߚݛ\xl.\6$BTW0Nzp:8q馁bql@:pʂ'?l-L]"rmx>,$fjb!R[rcsq WP& M8l&$t٤8F"N$FV^\XjDM6 H$0R$8mVlM+48lmxXDD E";-qClfI d/@H bk,8mjl,\ ɭK Ri"bScSY53M@:Fb.ۖYDDDDDX)E嶐s#-ƃANܻi< X /a[{f H7Zwj "f rXlaҩEtD VY:A&eⴹ'{#bq:tIēAZ"M ҩ BYDDDD;={#H ܹG!F+ۈwîU}uׄ=G-woKՇ)?elַ"HyXa#B'N[9~d[_fI7Ē 0gշHw쒁gnx ؿ}]Mnw ҹ&$d&$pXL7t ##Sܦlњj fZ-NOR԰&2Rnm0[םl;nv4RNIlv`MNlL+N>*ЫI/n.jx'[;gw[ۯ#a<<[^[xIEDDDDwA{$@th ƿM_U;|S`PPMv7jSݳs,)m80Hbba%aaq0[[͐2׸bf1N&H$Ym̐HỲA"n֙4'DSٸ9A t0I&/N b-&'N ̓`%ʨI4`Ƅ֛Sp5I4ևeQ҉~`8J,HIalbq{dgxƌh?D8'Hʬόnt:O |WBa5 on 5YO n5u?Q#?҃,k#ɫ QiRD1sᩥ NHm8LipC~S(6Wn {ՁgTP0œMLe)w\"M[=x]nuI{<; -I~dΜpNՊatA֏ٗnǒN 4PMX.**khq8d M}GIQ%lUW3$*fs0V]yuͫAE#**F@ IDATEaBwOh`H3tWUWݺUSo[b5F*K42ppkLA~.Nsw,eu "Ro+Eynjzb;\-tq&~{u ^XT@u_ky:rC|59Vv{L7~g1x٦-,"""" x%TESԅ59`[ڽvAEx|Q۵.wςZ(*eՒ%zP*@vo^ f5 ;'E(>kx}:ݠ0?(r+NbNg}0 &h$0i]`ql!8@gKQޤY1Iu 9F268)_.8jMkHv6A]EIv;v]ǴN{WFݠS~r=[+h_}zpTTLs:amkaq.sO䰹swQ˯(oNO6-}й;6uZS4LF)ǧ$CͿ&~&7 :kkHH${d"F(PsW.yv4M H&SqbDT*i3q:8\N'v0MHSaa0L6NӋԀW""""A eݷeklk Ae0+Σuqx8lt??^5A~7hp D27M \`WpPPltm+|liW TI$RQAp}ŖEabo؛&&U;,]V`DeT2QqG*XEiE@(B$XNY(*$lt:5&h|`5okv.:כҊߢ,"""""u`' 5\I*:zgG`bE<ŝb+A岅D}~|nvӆ t*I<!P1}}`:+EKIc޳[7;Zߥ* Pxa!N,""""" 'o~@yVXdH s' c־J,]N}p{Rfa+M4 jae ɩn%P̈́ւ#lEӖ[]^| b}T )q֡U@[6mN tę#y]%wedsx)ޝ..$8w`2>_+xuöℂ1 """""ҡuASYYE0#Lp),SS v?]0˪F00N<쭳 Q"8dl6v'NO߅i4I ΪUB8 Ás!Pj}>w⬬c"u۹w^?6]>:(jʹ<ȣKKx :ҩ[..!ݺjUaӷ_Fb"""""" b@DDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDD8zqYWŘZl*FLL72uEDDDDDDDig@*bq(E$ um@"ɬEIy>]]` %YHIf$F,&N H$E f%A p9  !A{8>a.U$;ݤGǀX$E|^I"A<gnF!iB)[""""""*GN fY0`{A:d^eU'EH1HsqE,,pYTV%X6֗ !vlsSTy3asYE~"L:Enn&uB']mYP"7XvE&v,BI6< I HفB;&LX8 A(gq$M_hM aYwJ ]U$״%V[k93N+Mu B4NI&/ 4Ll 8 L9(13x4kVa#gux$-bTXewiL9lnյmxҙ 6jۄTZNlt18 Vb R5YV=L eY '-&T 3;hUy}ȩlWY?RE(XdlfK.rT""""[a1XKղO9dbv{[m=YӦMcРAL6MUO'VLY2LL+E Q4E8QŜDᤳGaQ 2;'`X@"feRhwl&v>9 aUJ%>a!ѯ}97:t]yO>2?;ۆ^=e_=!4ن""y>|8 !C?0d*++%\3X`f_=Xf@+Elv5 ;Dkl3-x e8`XQfE궮)ŤL->`0S~``9~9~nK;e-|W$Hv=o*+Vˌz,""ߟ{3h  x߿z #uCVh\jwPX?,.r}*E6ɠ7dc`'K.g칌tOvG³/9r.-|ۯd}+K8/p_W7Tw?%˖Jѭ p=PLIf3ؓ/0)lu.ouVW|7c9bquQ⯧lK<<1.ve{>&L@7MO=s xκtWSx}(y9~Cts/ࢿA=س*狏O&rpwa9Su;!c^}~Uqṧӣ{W.8<.Mߞr%,Y"tlA_H\y4}:wK (**`;qiCتOOED:s9J:ݠ 9>חtpk3JPmxl@u994 G{l6tn,f?.;2a/Nw؟Z2 ~]wSI1a.^xM/XLQQH+?by#xQ6\NNr<ȓc&7r;ʪx_U ZWxn~ N]Yp O<"w=Wy8J2NIq ]|%W߭L7U1|:= p=L~:@˲([U&s72Vy۝}ɲ1aV,vgy\tō|ܩҲr>Kι콾yy\uUD_k8b3`I<IJDEj*-p=6#,L$IcmXfYe$iEX4QͼX%B},Q [k7do"೉xоl6<x<΄/NۻW9On;RT&(}9sek/<ɄƼVh7^}w>;fZ}cVW4o1ƽÉΖe< zI<0ޘɄ/.c}.;m;cΆm東On0+oːcd3+/ʆݟSƘo^V^=#NNT:ͽÞj kNywݑ'LJzzd(063#_:ѡ}q~=po]^瞞w}Nz}벭)ޟ}w_}z0s\iG"[=(ِq/+OOҥs HqITD>|x3dC>ݖNEҭick eEU|GFLפ)2W i0KqR9t0Նn<:+!uh-dm) 5ޕ~esD9jMWCsFaLr Agǀ]xqu7Bݦ/KHRvWnNnnNv={t0 v;{џ_f²,/\LQaA TR e>H4ʔ ǟ} g\L^fɲt5ehm@>rTG8Wҫg7~Wvpo~v1ju5v ok6sԙ.a7otv9frI3B~`MՃ_׹t\~+e().dFkw݉bL~Z6sX}vvDn:Wn̜=0v-NنVNcn뽾ʣ-kU/Yr]YUEm6Cwqm;lA**}bYy9+SmY|%Sw?D,׉ZǺlmSݺ٦LqA~;l 'M˯ݶ[N۳^ؽ: tPӦMswL0 `=\8 q+yDX֓ۘPɫ-Nj0M:ϾSO[}6_}B|;h4d}0P+;Ypqm=51H$kt@ʣ- ]֚:Z] >A֚:pym^AyEq7\{)%u3=u}5dǺlknvnhCo>Δo$Hˌ2c&}z`=ҹSN""L}yyy7̗ƍcTUUqm1nܸvmjtsSSL7xAETEU-)(6i2Vdb6CxY9䩙dN^{nnz? {?bK/79_00xk^xMi|am۴m-/#R]n%|99󚶶};7/aaruޟ7O~˲ۧqݺvfqs(^mmN% V?ˌ|O,^ sc'" >nnN+o0aB=4L:=t{TEq}v~ ̞3f<@Fzt:1y k]zE,\믾a=C<g nvv\B0T'iD9ggvڙ;Ǟ|Eq }ũZkkyٝ0{||򹘦IA~G>>AM_V"r_. w>溱9xi8f1θÑ.v2#={׾ќy G%;Ns577桡7.;PXOyE%|%ϚCee%E~ [,_Qʩo~nwsgqGom=`خ>n^rsx**3_wi:!fM-ɫpس66+Vf[ ȤKx@An 8 D"lջ# чvJ1\8oѵK'4.;o's8W\|y9XWwǮ+??tvG|ri'p7n;zG"эO?'ߝ)m)4^p]x.{w:eYmW\r.#NͶ[Yqمg3s]H[J8A<nTZM㡡7G]z=!9p_N;Xvi{;er9nۭ䂳(*,SXGN6ڶ:}.8lM&WTTRTَl2l.:J,f^l9jXdF?"" "I|>kxnp-X3Ϗl)NogYO4rRZƸtf_Ek5ܹ nOwoYxW7#d/*,X{} 鿰lv^έo_~-? _2r|>Sӹ:1)O̓]E [ fD~^.wz6#}P0Tͽ=ίqse (f1ðq; C+gy SFrN8prq@Ï'b{؅+.98v.lg$<_LJ:fv^4M߭zs?/cםwGfb7$7ϠCoo^**8+yp̈́B7|$UU8N.: oMn=$ir1G0շP w?}zQZVΈ䃏> JѹS1p;s-}eLV,{.uu;LG[em]iu毪 r`bҖi'˩'l}}ac7~5Pk.\g٧y ~N%|>kF=H̍^ht~2`0%-y_|t:S_amy93,Ycgp}#>6#acA}nB՜uUqB՜}5<6F>=D2IQ\T+y \gO.:&M_vTh]G=FM"ݿCNw>CyEUG>Y Nzs~}6?<`0+.``YO~L$NsSo9_]H:3gMԧ΋~/ݴsyg6ylM|Vs-싮܍n7=uR7^{5GnP(Mw}WϿSΌgSUsy`wӸ{(+/'=Frmj7SyQ/js˯JuKq\MOc,[ۋ>O/3fL(#//{B~)WpK>>8]y8t5ҳǘ<>49{4<=,я̞3RY乑Ø9|:z]y7~?D طy=!,XoRv;cyBn|ь}qn5>t8U}!**0Mv%9`НA6cFҫgw̾1m|tFzE9/'ң{Wn ,_~|^3OHiYyf1bwF>|7txŰ{n᭗G U3w\.;#^gYNs##`6lXYna쯻_GKu8Rgn?:s2TR̘gƲ,:nWG`wGSۮhjjԮM_hz*{Q[k{̿ a6 )CcFrΙpQL~:/?ϏzWx_fl9_]\:nT}j꼸]9lAv1\rY͞?[][yׄ3gՁjU]:K8SyZ<Ըz1",ҡ}aee|#O8`e}}H\N'|qGy9}ݴ5F/Ev+~}6_Lʑa&}h?K[qõ6XݓӉ`t̛\O'a0VO'RUG?+JYx)u(;l-Ņ2c&?+w݉ 9Kd2t }b=t[\t9X} ki+͟V8ޭ 3K-.nc&zvos{, Ƶ_@.ҩ+V6[_j{`}d Ao;nG.0M;o't\ߘ|qcG6)߯߃|IPR\Zh4_>Om?iC?ު7s8_~-T 0m4w\haYdT4fZs29| m'.[zy1x\.rssxGam|}mWٮ:O͞[{lC> t>Ł/3fX?{ӎnђ_1G 0 zǓ9;V[{L7Uz(,gL=d/>]wޡMZH[͍  S/raxlxPLl0l|Vnipend23/ec+/qO6X[~H:wyEU_PG0$Ng*P'\WWk-D":+&~ O ?aXmw= أ3-?G[nnYa'FcM^չPCD"Q~6eUz{s>B5u!4&ݜcWF߯}`sպj8t~ Yɀ]wPT1t>(-[]`ӻ'+K8]2.W5۵6sbkϟUkk7h~̙`-g[nHj[[ʹaY/$k? :d?P57o7MZ8M}FR*s?U0T͸Ƴ;{0I̜= / ۋ>$4>kw`/~<%Kv^dbwh4>h=g[mꇤ4Mfϙ~&6]eY$IyY~5tŅ̝t3ˌxqv;zt#mTRLn]/̷H]vڎi?͠lU9T?j'*v& -D4y2KҰ^-v+#"<'F&(0>PUL0q#1y\|//Oƍooއ>H M&ݰϾJhp0/4CGMdgK -4`{SS<^z'CGMhNmxL:y3'Z_R [T*e/0!_e dd[:=JzFF[gxɗ8.癲7-yAOWOXa+e+u7/RB!-zL>K& oBB! OZR);Z,?㞩/(sd !B!2Z!B!B[&mӬݣy xk-SqUݱwuź[YGi Zv|}fIymUY2jk6l )B!62Zܓ؆wx̝ӺM3n34Y]Ĩ`rygvߋC!B`!RRL;C.\CQhg_dԏFdD#FdD{~QIHLcl;5ٳ?j0_ zt‚+n?Mb\r7^͎~hNASLp&S |%ʕ-=zygΜ9/Ig?ѧj:iQ;~`و㝷)-IfsIzoM:5󬷠|թYY_)5BӹѦ-;X l6 yeJ*QX, 6.pƏFh&M͵d zojU?s L1<=<ۻM+0~wjsqիVA死`)fj׬;Qh >2KrX,CV-J_!$Ce_%s5]fDEa{գ/Ou<]37s"}9+ߺoFQTk,0ڛj239e,>O㙞t$-;~3xYd.=8SfǛzkavMMngY _-/z܄&_-Eՙ:S>|A|姌x5F,%Ϻ V4ǬiNn1L6բЦ9N,+`⸡,7KٷޛJ6j,ޗc`Zp0x,_4#2v SRVSqnyl߹dV,KSgOH1}(V-GZZ:˿wIfLy8{QdB!B ~^u?u>`>cЀ%<48b≍Eӆ/~w#0П/s>6^~U+wV@Dx(wGEG޴7ZFа^-=QdB!M@{R{moty/j5 8R09GEiBF!ʒJ ;w'OC\ef9q ʕuk'uz[ۤir -UծlݹUfnd߬Q}&MÕn jJ;g<=$%p1?A#9%<ΗZi:ASɗTw zg*s_%%`Xx]Y$'kRR >>>yLJT"VSqnyԨV7^}/W|ӺexwɩgQk Y~Z4.0 !BH|+b8@e$p|Tu VS"q&2,vh}/nS{Sl*ķۘa]:;{0L8j5V諱.U­n3}^xgz>z﫯u*>'btIxYzlڲ-w3mtddfyPNu&{'HNIu+}"B',*]L[wA82"vos2iԠ6O>_,c7s "++m|j2|8EQڹBC6?LƜg`SL6{h`܈Ay.*_or<΍;1tD6+a!(WFcb9|2jO>>oЬR7bged܈Axp/hߦ9'DVT^ϐ2t22ԭ]vӣY Zb ֢YE_aszB!$UN]ԩݽ[sۇ@;H|$+r D9XQ&Q27{/7n$88XZ]?z0WJ ChȨ nޘٓ !w:oٿߩYCB6mr\t2iӦ[{5jL(@dM<!ŭi&$<2 !⯈رcXnxL;, ǎ#::Z Mwh$LdZUtFf-#kid-XPk2Ok 繘LK'*=e#S;c1%AFCoA~:+T"F2=KgIW40CQA٫$Ϊ-R-]ׇj21aRB!09z(˗`0 N<'aaaRAFB4r&Rdei-"v~JbyZsF* JѸ;+\MaR,ŁŜŜ)#xh /6[ܙqZ!h4TP'NpIo h4R؜DlRN`+)I$&>l &b1{ UKj#(kC9|Bs,)ߐ s ]#.͛;$(|ӯqZvF5F"ѩ@+B!?KE+Ⱥ~HxT>} 'УfCOd9i%/z^JH ס{Qzoo B<=h #-B&ggxu:<.o!B! ӓ'O!=+295F_soB;mdX@@Q?tzt%0g\RpJDE8sun.uM!BqA]4ڎՖ3Zd/~X-t,IcbtʚLbrfXGUdT!B!ApЀ^@٪TwJ)x,ŁR쮵$Es!>3wWÙn"ݾB!B{GbkV{ZjԐ=Y'!JW'rzEP*zQfy.$<VJ.B!-{b~\u`ƪrQmV wҎ]Ӯk/mܚy Ҭݣ-;>>itβym$mI\|m_ng-םWuNpb݅.s9\yUo ﶬnpJe:wOsɲXn]{r|*9w{xvWcփn'{m$9%mL]rfJ/Ŀ<\2+W Uu&JOŔ;xtdl*Iff䝔ʚJlt ѱ ]KN^{|-$e(/ʊt{ؔ"nuxgy|uК_׬5+\͂^qgW.CpP`Ϟpۃƍngiޤߺ_G&7g[ټus>|W-Ogpe>[}^>&?~&.Z?{ s>]|G+DZ۝ e(h )X0WBzR64ZE@gk3qIH'{ɉf?_@ʍx:{m XIML;Ȁښε$4hmVg0k 5Ӏz Z0[sM\TN\Ko/yҍRSM={w?HHp`У{,^q(Kw_'>!Igs-1^Ǜ_ZdY,?e'4$U+̈!qtЊvyӯNΞgiܠ.}{bҕYJEZx`hX,V]%RxZv|o#(0 kwun3~n',4QC ,4~X,VD`y۬߼{ ,-\|xg$SxL0t3Oh4gQԴo݌ףXm臟Ì&=@˦ ۻNݟeŢ{ۑe0჏9xQԬV1qWc=~I)ԬVsV  m_!oBUH_ΉݜJի\z$AEWVJW;0$pr4^s} !\KOΒk\pщz¢{&q.q9*A|ڳHL Ɛ`|netNA\Z\.hբ1*vʺÁV{jH5XbzޛJ6j,ޗc`Zi&⯱r>x[w)ְVxv3^qgMb'$|4sޗ_f7ٺ=dAk/?O\/ X<fN/c6gNn Š1s5>G:|lƎ 3HNI-pG׮YG8tS<|:=%0cfOq%Of l+Kbb2+%s ĩ'$>q#--@Ll%_}˩3Zb&`7j,֮ԙ /?eۯ1rTRvчujUgRb9>Qvugג ᛥx']pRMWn||>Meʇ󊬯+ZsQNjt_XONIeѲo|TV.K۱{y^lؼiӲ `?|T\8 XkkjI2uH^2R%\ij gMb̺Mصb:AI) zq  Ay&bXxk6=s>]LUXxڶ`qxoBX jC(SZj?%# 1zQ BE ԨPpܬ7IKXQFt7"2|S IDAT1c 6;T?>^g~Uj<ބFFڕvwGj K.+Pncthۂ5-tk,fu^B/ҠeFT*bbt9.Pb99|Eh5|&R(_~WoӶ{ؾ%F4 ]:uAߴ1+[^u+:ARQdzĤ")LtLqq m+E% .[kVPc'yjFCz8|DRb9>h"ɩ|:> |DJUW{3* ??Z5o{cR>a;mNŇRN 8ycEnGj)~ &j,@ǥ \77ft q/ef̙uZN~}&#(^RM[wb2^_KLʹV繕=##99xh8%x]{`Se"IgqNa0L8W)E-JFF&+8:Jooiױq$jјV-cJKg VRMidf 3ٜٜE@\)~ǻR|YKyg$g}g)@B@:ՙ4ߏTWw" [U=mѠJuB1 TV+Wc)]Ql|rf|g΋filc:j"0yUQdOhZlT7mcߘ3}|ٰo,h =W[KLJj;^luoAu7%%6ӆbc<s1?ŐFtWZg6:KcQE t^\by.ɀ%#{ng͆-7oҀahMI)?LU死l$%-ף9{"|DũBz(rkڸk7l!=;Xuvfs/:*]2 5Z 鮓S0BC\A<}W {kVU?RJm*k6Һrr?x6?o(p~E_( F!A(zusqΝngҴ9۸jrq#yV*c޼u'YYYdY,lߵ*YO K38`ӖL>kفv:߭^*f(fc?y&:ש#'t9cO1}|կw?pp VŔQ`9֮YVSRyVW_Pa!K ߮^ˌ ~q'xg$,Z-JDP lۺ~X9+4mTa6gp84nX@Ν $\SRMDm$Քk7VVVnivv9.U,ǯ[ws>bbn_QdDAmMoAL>O>_ZǺbҩ-[>Ѵq}WOb{!ʔ.Izn:ԯY=wޯndH΋Gt`[輼|U*'>!G|/v:EQT13xyy2n |}/ujV5VW\O?_zJѱ]Ky Âض%_}:r4gT_j*<#]:`2U@FѮxzzΠ~ 5JXh#{jVB#DhִA9у̙Mf}C^ydG^nӤa]tu3lp9+ Ay)&N=^h40n <=iԠ6L&.>13jxwL*W`ǟ照g*2at1%KD2rk~a*>Z|P?!?tmNjtS',^[a6ҽkG:;߾/bʌxUT*5ݻv,PxX4ׅ+řsx2{@Qѫ#y0S_yƌڍ[[:j@ux3^yy-k}K2f؛&7*"%N:)6©S RY^aoܸ`ZU\˿Ysoyص(C7?Ygܱ􆌚@ж=?z0WQTvZv|^{٢0geѯϳ>7pztskF!.[7wҾ5X,ڴiVE1w߻egӦM\j9>P>-$%]CY+@@Mܓ/@WOXa+e+uv1m=]ȸ( .]sT(w4 !dǀ1xxO>Iׇj21alE&O¥_綀{Mum<\?j5[4vIѫ#}z'o'! h!Bqdh!B!$B!B!B!B!B!B!B!B!B!B!B!B!B!Bqte/EB!"=#JfS򾻟h^,Z[27{O`!Bq3F$%CB!BH,B!BWh !r!B!BEaaC#PEĿ8.B!"7 r;ϋx=_{?( 5d{f.5o)| /wB!(KrH誐Y|.nJƋ 'h X|ע9oM[A)Otj԰;Xn,?U ߻SI,B! SIƮ[c}4iX)<]絛h֤(HOj\GbR2}='Z"AԩU{@v#F!8(:53OP"2\*J:+o ϳO +SZrK綴o?Y&;~ǣVld*+{Ϸ3E///^6GѠ^-)$!߾XXK^aì62T7̪vhTiPc!ΒΈQCyvFJ-jb9txSس{絛8n(gݿ'5Մ_ך uGf~Gre{Wcd"hۉKuٶs̚DQRaIVY94?ľOvOmb ڹ+v&n˗YK@S!ӤzQBCuj@k1cW/֊;8LV3fEQW=fǁüy.l6zNfc]9_vKu\xJŸX  YaK&?Zϫټ\OLi|x=Y?v_4maڕ|:k~|/wնurU4 ?󄴳ڙDZ\I)ФQ=z?$>zΜ_s V*<yzoobDEr\CݱHOכ_V}*{ϼ•~eEQǵy/^FQJFEұ] x a;wa|L 8GF\aq0^nјhR<ժVdێ=X,*m;ilYz ͚w v>wIJF_J*!mͶB>qڷ>!9RŤX3's:33T.X͘^_ 6%C1WONk$DB]A6RQL-7>5س slߵKJtzCoQ|B"u7kH& % ?Ԫz}R4W AgտgΧIJN!===gȨ 8Ϋ-zG}\߉KFbޛ| W)~G (B:5HJIeŪѧP6lގ'ukWGdƭ0\Ur5T'N%==JEjjϞ % :)2cO!(N=Ϭy>v2do+>YgmVVo=aX mќ_2s88v4;{B|^".}MJJ*`Oycl6[ʿmq7QD8 @˦ B;yݘgpyשFycX2-mѽزY#9NR<,P!D.``1_ME Ŏz 5RHgcy@aCA ,LRwĹ \'We*U(JBQ<lu;VK& PVfcӖ@]*BxX3DT7oc{~.GP"2m;i6β3Q8F; ΞDHp[կS__oRS8v dߟ[:{8PlfTST ~?@gzUt1vah٬\s,_1Q(Ok7qj,^{n]:iv*1PgvzGDϺ۰y;8IRaղO!.>\\r@%+9v3chԭr*5P}X΀s^ I i;x#9׽ z;x)Y"ZFqz:qwElXV,V+^Lպ>qXhU*wIC^Tw˿mq7Q idDBڙ6m\Ǥ--*!}JShnRլ$f*yWs]rPFlV=+ُ?{*SS %Fo ebb2#Ouf3_XpMb˞EjLw$_wHpPNrI|B"̹ jx:q+ o#ObgKqFҳ%o,-׫p2-}ANm$.޶ÇW㉭4s/|.UlOT)ggˮ.`JbŸ8y1*"",>^}y "-vx7q}krK3~1-H n}B!~`$HjJ2O=Y㉍0rlUʺ(:{ot_\={֩{֩ضxl3c-~%Gѽm݊8de?ۺVv¬?oIMI5oք_[ʖD[KؒE&;gFzd4ᬭ9hڿ7~$ԸQ-^irÕ{թg}y{֮[ٹѵu.\,,,9/pڷm"{cb6l̂K_G7;gEo}j͟kɆ^{)sOr%,|i"當5[JK"]o22ɍ>ZU* Fk8Esq52HUmܡ]t>A.Ȍyh +tq}_~7ߝLII6D}h׎|T r]oNnc}9ZmWz[˲xtxwDtGjY<<[r |/|o~;_RXٟ?2z̮۬u./ 1!A(oߘ|f8<'ח!\}]*e&'V1I'˄,3ΧSԢk^o}OeVgvak!$%-ԔdrF O}>?OUzCּ]ב=34n{8dH} ^~>Wx9sIOO%;;+`kM+r=租hN֢[@WK73ywq(:#zdX^}l/3ӯٚCZw=0W gzR|,^c6Xa <]r^M?kW<(r?ْ7lYgc/(^:Tirב!y&ѐsf_v?ײȁC-r@cܨPq4lN^w3ۉqo?紙uvG,AFZEK`#rxnyغ5SO>B(ki԰y^>&»yxe  II ,YN2BVv.^{de3wzp}:meuGץ6kh6gmekN.۷ۮۇ80nԃdӉsmۖ/*<^eY=hnR^~vqNqNÆ,[bN8//-7ݥ~֮*Q`:Ϫ ǐr%?9ĸ}TPF:kv.?;vh鉈ȶo 4mV F_>ضm,baIz+{QF*=^UȗP 6 WrŐ;Y|G9LJߣ[4j`b~?Ϗ{Bs}#t܁%>_օ xH/@ 1+!ePUʀ]NroVy*M =(̘4Lo1cn{2{Diݪ':\:xzԋ"""""YZ[> TyQm2v-V܆0mA ƎX;but[Zx0fO :ϲh*q@{8Oֺ᷾[m&dB& ,XU>v 0r;Xg X0p\qɹ{a[Z'?roϑG'[^ExgZ'@6yӸQ=NAcz1ىn_kqѕ7GCUU\M2j0 .HvZ8CCVߐeFJއ5YFklu>2a[$$QPPȕ7y.q#0MFcM WoaP8ñ'^#;;C;ڤmjiyбC[>dEBQFŴ>euB|\$PQDDDJpl.Is߿pB-R'$ѴI#^宯}<қ:*RxbG_3dispg(7Q2\2VFMYWԔdssr,B}9.\xMv6ۇ 2WǫKH=6M":Oϟ~QBhfuU̜ .a 5mV}Bؾ 3|~ xҧGKJJ^ n]CzZ*UaZúqfaPINnDq:$&sCԋdҬiciՒ^{ ~u6YW7,lCvMa(\=zٶMs6w ߵW\q8!ə aV wr-/ngyշ#8}qO?4M9L ۦk<= r{:>sf~;~"~\tޙ rڷvGO}V˵ P0.'6APiغm  d""""ϛwgfA4 qC[lY`i8džXJm늶aa`0i ɵJӶPc/o!v|ؚÚ?r7P""""R4WR\_lDžQv-b/Cab8NlLlTNؿʐއ8""""" RˌX&87$;L ܏4&7Y]-J X0p\qɹ5nٜGG7wԡ-_Myxuoٸ9}O .۳lJ۰l*:wl羇纫._㐃[ l ?#{eY<0 o`:EvKp=(676ڎn/aYv *[tu %j߾1Sξc?*3vql#;!3DߖpXT-^J%GTZpRc5{n; :4 ښM|n];m!4/` 8zv?[ gһSx`,_Ν1E4i܈rqy`EE~,Ivv.OuW^ithך+V˯/('7K`bRi&#=ONGTLS?A$L i8,.`+\V쐪ĸݤpԔd>6i#55;3s/&>!b4H#>>n}5'dݏLOyTVko':oFzy#3ccc{c./;/;֮ڛḣ{ѡ]ktlϢ#ݺvϧҡ]L$5%으gaYVopTlR)((P~e:K5{MCl(("c8 A#FuN^>3Oܱ]:>v;.,*9s]?⇹ ( 9hLOO%=-۶o*,ݜlp(&|⥬s-mrmx"#uԎ?n];qDnmue|hxOIN 1|8:ome4~1za,"""""" aLg"""""4Rw>:^k` ;"i#~Sj U c&&?$U"xe+EDDDDD %"""""" ۄ!"""""RH~S .󬈈H]Ip)60HvZ '`%XDDDDD XVda߱jm9Mhk l.R޷*V;e]U1sQ읬SDDDDtPUn2 5 6#=wZ8M0mQ iB"ͥk ]Hm~uU-df^cgmPkmW?ۆn&>~ex {LBII ǽ ֵqis2kOض%Ig\̑=3`[ɸg'2|r'soKD{6֡WqdLޟ㞝ȰKCQqwt-wj5v}5RuH3M9CJj IDATk7.Gw~%_OaQ#c͟ķs \}L8Er:q6n9OG_pWVve1l0O~m徙1oP0^+.9eWѧ_t{7j@vq:ԙइ+!e,~]/`fӱC}g6Ԕd.lBBrr˝ptߟUǹgi]asgcHNNN)!rz+V>aһHOۮ=z}( ش9+lƍ*AFZ$xf,X0p8\Zj2qq>Ol,9dU,_{łwKJ4~ |ֳz>_;\DDDDZs+xշ8ϑ K ]t66omtl߆[o 믺b|%,ˢ߱9^AzYF<8czklظߗ  i2 d6+W =-YUړ hZӧO'##C|,\dff߿ .1cn{2{DiJ]EDDDDD,"""""" """"""" """""""H&3%""""\}1g]8 l QpUwZDDDD<˲wJ(/Zz mۄ,_kVʧDcUQncݟfFTUUԪbr5˨o[v(S:?߯)79o?|aY  ]u኏ DYۑ-6-OnȐ!K=%K裏Os]wUg˖-|L4 >ܛ [n#''_gy?iFjj*s7gƍx,Y)Sh"E]ħ~ _E~p̞=3f '@qqvH=S6ծ((u N/(͖m`:hg\k0T ;;7x~;6mڰpB&Lȑ#q#ܓ?~<ݻwsa7x`N8!¼y8sat^xmF/YlgϦw >/sꩧF_~wHII`ҤIjՊ)SpkNJC-eF]bPR$Τi nwolId£M\tq~WB}0#UVEӧlORRR+lOrr2iVڞm|/V^-DIQ Xi!`g]B`b]vY yeᳬLYnp+2bvrrrےL߾}y*+11Q;UDDDD(]{ ?haq1l7M˨M01ΊSAnp:̙39s搜\=վ}{ /N[xqn={$O?Uڞ?t^z5[Cчi4iD;UDDDD& %!L '`:ɠyM~pېV.A8*=_祥qW0j(LŸkK/-RvI{SN!11C2w\[5jgtܙ믿+WrwoqmpuXh+WdĈtԉ hEk2V@TI n dYyT0wT^M~ǓСCٲe -ZޫΔ)S۷/Zbȑ7.:믿ncѥKL@˖-9s&wuz0 =P>3z*"""" Ra:0\[PdY]zpeu9% NǪEp SnQF1jԨjYn]icƌa̘1@ITMR+t8묳*n֬=z0m4L wyQk!!t@W&ӭӧO׵""""Rg$''D{VrᎉVP'|R:4z "{WQEDDDD~("""""",""""""7LC׿ILDDDDDw]Fw """?!zNpA~&ͭβ' "Ybb"M6U!DDDMKxAbcI6 NC-߿HV$IaZ eEs"zC&l}ǮiP6U3W:EDDD@W U&P`kn3sI40 ކZmN\i.\4`~^*ފ~/r}.[ȾnƵZkmW?}LӬq4p hEDDDDh)QQQQQ]wٗsmT`p8"(=>Ig\̤wp3< | NG# x4>2@\t7\κZ>մo5vf'_0a$|.`\ ͠p9W0r̳Dsbri˹9 xw0m:;zԙig(ˁt_@Nn.ύcO>?K.8뮼}'_L_!++'s?7]9=fŲ,5oscGpl#yᕷH#))+VHOߖl*:whb14!x5W^r._|=qNngɲ< ,bȱx/($7Ю5I""""" rmK.8dЉ/`ي Џ/&ιg揵e,z2Kp8ѿȞ왩-"""",o$'i)v'z'v]A-19\v߰ wDAa!=6ϽaGSph׎\;I 2?l_ֵ#YY[h =}6iu773xwLouHAA!_OCvI4j}4ҩ=9ݗfG?+++0È\\سs())BUDDDDd,o<қa>~9$ڷkMqq`(ĺ0qqq^}/~GCoy͛5Q|3}f^4~żՎQ`mav9y[q-9}roǞQ=shִ1C~ປaһ}d\.۷! ѭ4gvD("kxzv&piznn$.ÈǟQ 6nH0:+EDDDD1 d6+W =-YU7<;VȨux'|:(DDDDjW… kLffdP@ @rܪVi3?3fc[f6[X_T4 p;p !""""rQ (((-KX3gdٲex^Cd?KNNCO`}%''h"Cuޝɓ'bch"<'t۷WQD˗_`yƌ6sL{98 D|G\~sRDDDd_ XrYf  P1DjQ9XvN(#qqq*AQQQQQQQQQ`J cSLa}ٴi[oѼys?| `޼yL:>}pP\\̫J /'))iDDDDDDXdzǹ9r$III~lܸs2n8̙1C8` <W_o0w\~: @]Evދ>||̚5+\y>hxw| `VXQ:<QZjUL˖-+Mnބ222bcciܸ.CDDDDD:ڶmP˶WSw}ugO<ׯgٲe\} 8tO~iѢ/"^{-s?c4M&M5\C `رZ:<0l*3^eϙrz Ca+W߃XAan ӁiQBoulZӧOYBD磈Ԑ`…5^&33@ @ UNS?," :Ϙ1cn=ڴnU-`˅ґ%"""""Rǘmno8zsk(tÜNP~˶YDDDDDGӬc6)yȁUQQQQQQ{ U""",u!7ߨ",;'EDDD5gdK^~GbR IG"pҬi2.~f §~J۶mUl|sRDDDD@&61pc5!,!X'pڳR{wyh"&OԢݻs"""\9GolZ3'n oFJI,IKKoeƌ,[ ϧgoߞ;NY-QeMrf$(}9x KZ`:xSIKeV< CrZɱea*#ǛOq0m8q%ی_e-Y61MIs$0EIn9†Or$!=TX@ gL<)ii$KCWPL0la\1 V]< !""""uʆ zn۽KV^Mrr2M6U1S2\ĸ"A0{#[r `8ïķe#[ńbq%nfSn vڅdRb8p6Vܭ.bcIlb 1fSV>M+PV \.ķ-[)qv [J?8MYyLRI-9Yp]-BBf, I$:yڼthԨmdɒ]kBaa!K,m5jBTbЛ͖M{Zo[[(bLӠA#f$4l1™ڌMҬa2NQ iBZF*WRKsV ҰQ\aC4.Eő Z=q%g(=ę@!ABZHoؘFi)$y0m"""""$vYbEBpaa!+VvӾ}{ Y014i֌F)$r`[n&_@q CІ'-[ѪEH,')QXbLY@   C*46.]:#CQqeE+1 0%öq,Vlia|Yش5#.ȏ"""""r`ߚs˭6]xS$DbI!ޜl|%%^ʼnإy7ўv$GYd`EáHltiÌ^k`;і`!y9XvտQħ5 `g+ R8K.&tGZEDDDD/_Ί+h׮qqq JC%$&Ŗ[GLl`;qDQ7R;.FB[MF&ǣC!¡ !4LLg!Xw[)RFAA\? IDATV6*A8jfulj'tgiac>0Z;4fϼŠ;'͝7zP84wS;wJfMua6U7oo Xs>ƺpġ5̧|=}63&`;n<%8 w| N;{ſ._ /jත9s0.4k\c7ld؈iѯR\rٜdF#+obwq`<L5493ʞօ~ϱ1AgVc@0N9s0];I/Ͽx[Yxt^/&|X<ϿW_$slףp-3lK;(?;n'Yl¢bzUq!6n]:qU% Ko2m71N՝ƂyXj5 pCrT|5k֮׼5wҋa#^CocPXTi\ΙOE&"""R;? M4N_4^zQkN1^z>'ɇfy;6%iw~=xa#^"3#ksKw?_~;QGOȂ+Q}6+:ƍxre0w_H$7]wC.>/&Laʛry xcǍ>"HpOyf8v)Lnwck{[k_m[Өa.0z)/E&;1 k#jL.WLfF:ݻu/&h7$';FVߖrYq\ףxġ1defl3?`Y; ݻu൷cҔdf؟cѝgzG,.4ˊIM@-z=5ɽ8籤R<,[_-0',zۙ1X눅׮g KDDDDXd꣠/c8ZBYQq ioॕ(atY-d`hteVKfFZrc$3iQZZFS ~C>%~2+pIyk]ZNǑSPu2As6MoMݸ izج6ؿmڮ-Ԇ3k3 ﻍGbo7йS-uЋ8Wx9݁ݷ_ǟaN6$zٽ+Y1,[Ƽrq=кes?t'OܥMfM}rqֺlϰG1 <^y WO=/ŠOg%ڹݎħ';= ''~ iNd5=jvmo[~c DDDDbF߾}Xdɒde( UK݁۱Lm6ɓVeg*?~С~$wޛBfOWmINۑedoSLs}NimZPK^O(ԓǙX U ))^Z4oG\AXDDDEk&EE~,[B"ҁmZ,""" {Zyz0CMs;ڛq^{,[A;ѬiR/j5%Kkoqӿͦ""gTQ9qvV7re z[[f{Fۏ?:1^1s<?_H$j#CF޷띗Z X,Ɔ}w bNDDD`W8H$w9w6?(((((GN=fs©_S'kzUN8|͜SDDDDX~99kj(]WE%pkΤm;]֔i94nԀ;ݎI!"""" @nV\Ųq)(,ftlv1g3ib&:N2|Cs7IzXt_QDDDDXdY\4h/1fE&LJGpɕ7jZ>oǟMֻW;V?>ggK=yݱXAsЋ΢"ත911<yc!Dκ*KkS29Ͽ~H$Jp5\~ͭXNs4n<{n}uf鲕0#^x+Wspq5e$H1[2!tcHii/+W`K2{QL w?8D"a`c~!~>FzZ_yz ^:/Y &}='ҋ?0U- WCRvmt:*ܫޕC۵eżƻ۬?@0vmYf xzsBnv#}<zv=fz?2erux3m_z^=zO>O>}aڴiq EDDDvzE_X~#'n{~ݎT2Ԇƍ%p~H]`y/=(Nh4Ɣiއɍ{lX?-O?w~v |> =(uvk#9WwV |>%K 8p:+8wwV+ k]>p ~ۙLߓ{rq]8XK6Inc&." &KaW̋o08S{\2T9#]_NaL:D'sgp?X b6:j߾=&LSNO>|Ӈ+V0aڷoRDDDDXdRqU>u֙~i۶I6m V|තئ??VI`Yk[n#_i>nnhr`ȷbb=P(ԶGm.r[ ' Š"Ͳ;TbFS^ F)..Kjy,E$f1X1V-m-xƂm_.!~EDDDEvx<,==7g5C4U46/T $2.شIiZmA5H^$ sW z> ﹉ }ߐ_:>mtA- f܆9kΔiyڮ-~=P~;|_j++B0+""" `Z|?!%6nH{%ZhF(f7$߫Y,,*&haZh y'VUbX?KrW8][:?~9Ʒ߻jG,v;%eelєC>T_ X oKpq]hۦ%@cj ;y}:'oߞs2w\_]@="\N; &Oʼn*}o̧$ fΞGz¢dhuH;n<`rpm|yu֮[ϲX78?$mm/(w> 3#w([j_Ҳ>|Ѽ|1kZh%i<R}7@0ȠO'%3zݲ;b%8-Y+oKFz?p5ɽ85\瞁iS7=뮼?×I=+Vk""""1k&KT>GwW-֖ml6= $""+++`u^CD"z$cpy홶#ȾߦL^mӺzEDDDDD~ooMuyzmlzܒ?{mӷw0Դ_I"P(zGy`EXP8J""",~"'; y~PHS}dg w W, ڵ%xҴXo}@vmXtTDDDEKa`Z9g ֬]U1R4mygjU(pۘVa>k֮' r^z=6nȑۓP`j%%%FDߤvrZQUtv, NSGzw X,Vk2XDDDE\~^ """, """"")}CDDDDDDEg_Igt>j]n[/{?Y$"""",kwiF s8mklVc'""""RWYISfЦu fMrIIns)Sgc?IGՔ\z9D1:̌tw'_L" $14nHNvV'/˩}z[%_|Y\|YjL`-3MZj莵WT\ixiep7]>V̌t^OU(~U 5HAfFޝb׸.z2X,0VnϴThy/ x""""";IKӫG7.[q_0<VvGt WȖ}5cq%KGwww^(\5 ,V;NO*)8vEz0?6TҨI&]v a׬4jiЌ2MN{֕%""")++`u^CD"zY'?{mӷwfW;[mL^ڴne9UC8h`YInC_=P 6['6-]ΌYs8qt$Hx;90eSWo̿5!r1{*y3-m۴m}]nF fCF%ʣq%ClT2ki cH͠r^R\ r`D*gmV'l~TcH8Vn r+GHziܐ K<<` *+F 3HqZID)F0nR0Qܹpۜ?>3F?w=cOR2d[W>mUB5'Z3Id/())QE a"q0\餹0RwI ) &0l.nF,HEN:DtMuPiN#+WѬs`0Բ"""""R))(+_ mX"""""R/ЖFWd-S۴+""""jvd4(((n*ADפ(V+~_!5EQم|>@II >O!"""{MU 1G"HIItRDp8Lyy9YYY """,;eee'BD0Gnn*BDDDE"""""R?`QQQQQQQQ`˸t?鬝.sYb^~?sI """"-z`i&dS2^>zv۩2 FZhK<jnsáҭK'],"""[0 ~m.SzM$HueB0Ͼ&f|C,^ݹ˱j^fƤ1cǍv᎛tr}% x己Z-rÕܶ5gEr_V#Y;'uW_je<9b$?/4nt|$|9?:q(t59Y:߉oLsYv=ίys3kxt҈cy4M,BXٚW|?KcŃ;n<6י:cϽ}Nɓ9xw'm6JJK"zFDfF:7\s9\q1 m</ S1[L`媵<th(=4`0Ĭ9sҹS{ﮛ_xgUZgK˷Yw@rmЪe3ZlFDDDDhaSCK}3i ڴnЬI.))m3el t:H2K/<h4CNnI!6 y0).)%or:Ձ>?Vdr?vȅn9oipxyz&ˌD"|?mptT7k#ݦEDDDDHXd_@Qq [5ONrtZ+*.4M 2b8.BfF:^*Gk߮RO=*m۴n|˜H.~c>E8dowPeZ,7j<#"""",1 ̌4 Ӿ5n^=nu , 8vTM#HF}0̹'OkDQRX3Ryl "+3s刈 ;ztc>Þ%omsq]H$|9i xt7m9f}6?d&^~=7km +3͆iƴnٜ9sg|&MO!""" "[aa!t:U!"{gݺudee `w m۶ ի =BK @ZZ~_!""" "C<Wo^U""",;AUIp(\h}(%kPG:Y1 'ezu_]eXڝxS3Hq`Wo"njB#b֬+%f8hܘT7Ȫ 8m%S5pg7%ۭBDDDDD7 VM8 XYjbͨc LڰVOY12orI"' RV"ȥqBEyp H—R{? {qw;ܸಪEDDDDDX\$8eWQ[JdNzF? 6OдnBNЦ3r7}Q82BYn,$%[˦ZDDDDDe57KQEDh\ *!a8" ުX B ,^23n5o8"Cl. ,%"""""{/ /KV?Z"mb`pT>lFJؐ_J o*>xOƢk//,D,a`wS6zSV 7FyYq2~ a\8pe`Gv # `<@ UR^)94Lw """"",;/T%U7#IOQ#8!! '){3n +6 0^3J$`rR DDDDDDx nfrssU""",'A0 kE """""" WC[,5`uj("" 41M%R5S#jI4َsQQx*pˢZADDDXDd/<*dy[%tmݮvU6K_";ڶ8QkۻL}`FGj/{M$H(H8\!"","RG.| h{-O2c? yݺ j FȮ34D>+W0 q#ҋsjU%/%FΧ+(GIn_t-ݺq3հPn5vxbH}6B-Ryo<d/U(H0x v usW 3&񷿂ɡL=ǑD+0~x_9Sh_a20@I,̭kf3t0miܠg3'^m֋g"f|ICG\Ưb-~/!s+?"~nX5՘@ЬY6Whſ.agq8<7; K:c>w._^z O$hwЁ\5B8}o3/ iӪWψ_ӤkNrtщ^E+e|S^)pQUU, 4h~Rۈp LLpIZ S@15J2*>;9|/o`sh1<{ 6PL49kٗ|YT-3t9W|UowowrdH'gдI_֫p- 8ԓ83%xc0\esR\Riy|3GrW ̌Yc#tщ^G=""Ĩ%V4wab* c::-Vsh`ssi5ua$L?h9#l_۪]8~gfhUu.YʚH98R]~#mZ5˼̌g)*.r՗Wq`[\9B~_Cp@n#:Ձ@ÂoKգ; 3y, '"" ""g[ gV|\sN3qgap3 Ja~ 쑞~ (GJZ^F,\n9B%)1/zO^,[vvЁXjN>;cǍWӬI.:3pc>ϮQEDDXDDB~U>h5*^2D:om4°ͨ|󘱅u,Rˈst|;o4?*U圙֒uAzMyt_-}9D"l71߰TN+8#9{ZGN`Wxcd8  PfM'""{,"R(㼍.ms1|"~ҭVD6aũ{/6&ͭP5/scʩ or,-m]iCm1F`'Qգ+a0i`7KpUԘ^uG}nٜX,Fehքn5W\}l#a3/$덝:voώ@a;޶&(p)CѢҺ-u+ M[i f㮉ω[8CSp&wn|jN 93Vڕv)KI3h|Cugw}ōw=~ ^&͓0R.Iv$ U3s{Fr3-]oׯ禞ЏmU?s'l,9#Xv|?ԏ4Sz_vB璤?Ǘ4RNkѿ$g=[oܬt9]ҷ:=R_ԧ~]4RW]}cOߣooXcz*跾{*O5AO\.~o*N3ctҬw靗/~?j뿫sggy|u} ;#~%ީ-]o^M=gg>7^P'W>  =xկ~Ge5]-]1s_7 ko3 s$IkQ|@?V8.}BV#[/lszvtq^?{S7nO|9/__%z?Oo}|3~(t=C=/,҇>>O}ٶ0RիW~UKmsC(XH81^׹~W4>>`DZz2~az0('IR\וeY\ϟg3 !zg%Ifye0ԓO>9؆|9mȣy%I׮]z+Wo]vp:8^]   qq `:qA8c=` и`js ZJ^ul0 >zjܚS=.{5[Wf1C}=>?HIDATk 7H_Z~0Sa`Fk~M/5ޒ$}$f䘝UVӋ/^{{@w+IeF 8a> e9x$R?J6.-toѿe}kUN:sL7Sy|k=o=Cܜꫯ2dffF 1Ds*l~bV̴t/,K^9 ܙ_Z#lN'3JӲ,k\(SO魷R^W HӪT*pE]5udٮ٢*R{mNB-k-RiT2J4T[[W)1R*IYNtLC+z)jl,>؏pCݮnݺ{LmC`ueY~ܽ1o5qY%qd/_HߎKVS3w}uH33%^H%܄*iIQgEKmEl "y2+Z-3%_=M5W&rwA[noҥKpFRŪrpM KZ]]|MXY{2u:$WRV-T[ⲖW IC_N@?hqcg513J.-+ՓliR3{-T-"s(s~_V)Anb{F00x~yc0;G{*Mx*k yYrVr}ݎܒ>Vzq T*}_=V>g  =O.]b K}+pKKK ,/`<}\[[S 4? xh^|Em[0 ɭve_WO1<8^z%}_gm^sӓO>YI:3Esis#zWd8QW/b\ь2Q{٘F(nnqQO$q7=pm%>Q,T8;s˲A`&1j8mØ9`td˾ 3xcq3=e t6^ `X; p#s2^+ڲ,%IB`dd"~s ұ?]8(8oX=_G^cь\0NuE8=A;`s-KƉ`b%~AE^5/ '>'3t_8lmX @}K6T 0a B/@l؈a 0^>Il#8 $QǬc$\$eY`C fz'aRaƼTkV|.LX 0#(lUo"Ų2ʗ*{< [j}Eɫ\(IK7INj+?u^C>}ŋmDbĝ-4G|I|ZҢA2R] +jlQ|JqŚX\5j״IR`j5Z-]~]QH^H[DDl@rM"ɨXS7Wx^yfNuJ򊎌{ϞQ&gϞ=(Ttu]|`'3GH5tkiUkͶzN^rQ% 6("EQ,;5X.ݞ q^pAjU3 dC0s]Lll6Y Uk ; ;W%MLVى5tyMFeY‘F$f7m9(VחJI7[ÚQ) ][-uVwem̽;1Us5lI @%%/3pc6SI2)e=GRZ!?T(iHHSXcKϓy8R'e?s j5y/!_'Ȗ+tWՍ|z[uےHq"IFҘIZ/wR+Jd2$eJeeګvV4ԕgG; [R/[ԌZC-?P?$cMg+Uʺ1e*Ӛ45jv*UT)l SZlSWUcɤUQѕT|]2v_={VQV|23vC0t+1RӍ$E?g*jbrRE$)do:q<u2[wlN%i+[ ~%%%$)(58Wv3ތ9o I`{{W#3)SGwi(տ_t3^Aݺɩ-^{{)u4Qw… TV>3cxx9OQA"YrjjZk'梖-,W+"zS~/RyoJ$X~lYcAmn>.nI3C˲ek{oF5VqXeKb& OH{9yVG#7 bdߠ46QP2 Tf#:5cWZZ^&T:2VVw΀s$Yq4qcɶ%G8fjlKRd#to?v ``U{j6g b0*xSR u3N{Izz$RS&5Kx~Mg$%ff' %))=")l ۃ Cp.'׍7TybxdrY`[o|qlIVMFq酊5[UL!/P?XBmƴ1RjշCRBj RnPBU~*Ŵk:+Z=QwOQR8XTu,INaRӥԾox%V@y^JIV'dU)=O&~Rt߀yye6Fd֫9@VG7ɪJiKfMҎUy DSXN)[MzJS(eDVKvRƖQU/S/suXWPuzFM: V~tH;*LhUJ=uZ#K\ESӓH1a^D~]4V-=j69 /577/9zv?/$ڵkC/sIW޿uwr4 6g~> yW\y`p*@@K,S."&O֊,T/=;$tV8`'aO?{. 0+r#1kFXDzh̡H8#~`gtEH: {=a`1q+ { {=hFj?+I1e=z}uQaK(d9?H1FT p41NEz=% 8,INh$ֶ.X5Hx$}?,/2gbbLoKJł&&R icxG?QN81mus̫]IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/security/image09.png000066400000000000000000003302501461403617600240270ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwtlM)@ wI .+SJQTT+E)*(*M:mGB萄 &bqMTdd.7%%͛7a6.z}{/zbccIMM%99ŒOt Tg *2Xdy/_'*2^ZL:}DDDDDDJ ZVI]O`` ^i:""""""ۅ=k9l`2k]GPdWۅۙӋj˳w`)ŽK=Zn䩌?St:ݻ'ݺu fK^5k:'Oeq|-jf{ ì^"rpdgqT)""""Rd<9/@=;vyfM3cǎw̚5=/ cǎl5{}|,)& sΐfٙdedbDDDDH=ݻӢ3^.ݺug֬̚5~4oݺu?k6 (XW"w>>9S0.lZyLJ_Z ll"%jח̢Yx_DDDD.98UIVk1[W$p:ys[EDDDȸ.~-6hpr[+/>.@'m%Rzs G{9uXDDDDJ(O'::ꂄnݺw ;Yq;ݸ-&YG[2 -V\-""""ෞW^.Ѕe2L<\M<~n{WGƺ;v\[ ڢ,rE X fEl6[?~9qtAj2v츼G LJg CV^EJ"T;.de`|n>Ț-1H"r'L+PDDEY嶞,?u'| N^gHqp[h ,"""rOTd$˗/e,%%_\.N ];w(f!؏Z&l;O\9 Lo^w; d^{A}7otb% ̠>lhBLx᩻9uz\W~ 9hscpK\~V'Jc#q۸?Nm)y1[Fn¬ՉeJ:I?51élt_ϟDžOܶBt]-$7_HVw܏}++wIQo y#+H2g'fS&הNK{'عs7N~7uN9UHI |O MYz){>7w]MPq\3?6#ۣ 9 #pƱgH|R.g{7Os7OYV{z$qֻ zQLٟm9qW0{aBz7϶j }Rs]]oPg5/r}ŝ䵎'y)#:yme9 0t "N'^LK绌=hTk3s&8`<NN{Ʈh5chޢ@^{wj܈VLDDDD$\X6knto>$/:]xr`;|j=ا~ P'9#du&ۘ0旝#ѣ6~lf->^?oOݵ3ؘ9nl"Me*mfy25hTDz.gŧfUe 8GR}":@z`cn{VU ]7-,?OcMT~/^LO1qo)j6mDCE2K/sfcsUFy]ոk֬9~1 """" _V;&>1[0mz ׮A9B0U8}ud?;cF8=ohbsη\϶ '=Pf`]ļ[p%xX~Xm$=#=o{͑Ѽ|mo?m 8u+|!.M bM 2;N&հmL/=K hk1M^tin;#e[QޝsaM:߼JǶ՘mNwŭeW\=/-7֬YvxzϮgKa[DDDD Ƕ7^O`60Ԍ#؛Nv 6>Ku/fO֑sK4ˌ5ῳZfVW0g-T#i,jޕiuU1vͶ3YZ`ӒaS&J-YmD?)>zRЧ -GKIP ÔO8Z_}a '0 vscHtc; z-:лg/~3wɓC"cRY٭=ul9'Mѭ?wѐ )1$|=rpO!b?^bS5 ov3k3z-3?t|~m\kόeuv#RgEɿ#_M']SZ, l)qBk?'Βnw͚yݡww*dQ>o;Tu?+K\##Ǘ a XDq % ސ;[ErpPmo^V7;tI[X9sHϏY3l3ZRB 9Y׳mQo;'-qkU·n0]g{cӟ `[>e;4O-`dxp0Ui4)&1^Ŷ$w>t~|UF8>`RQ.eєb8R?ĀVV d)u/i^̎ݬݓ=ouDL{OSZ\GR3u!Ըr |=zՅ=+7;) ]߇&$̹6hݼ~ucy YԫmbǨE 3#K$=5ܐaW?[?ᆧ`ʪdJQڟ3_!?-S~6DA~|+j֮yJ=k^DDDDDK?Ƨ<^.I#,?B6^[?"gZuLy43<@>_zn/ى5yɹ svN Y+27;7'`?ls Dd#;7˛V'I7x`>ğ#G}|/ X"""""%ѭ[7e  +})=*L)^R~C<>'eKNH(ezG?+U-_)ʵE K,(C^q]f V*P) xp5K`^jԆ- ';m+L{S~He\+""""-"V@+er M&՚H V`_(њ՘H VpQ`_)Ib1DJr.gh> U G5&R 6(|kEDDDDJJd="%o6WB8 """"Rj }}IHI v_US" > d2 Ɍnl" #ۍnDDDD + j\""""rJNH8F+((  3¯ǃ/^F d6a61>,zq{8.P)ٽxup};=H^Y&իW`۶mlʔSIII7U [%u=[Y_ {}Mybg\ M6tB}‹\]} '9) R8rEwG~7t] `\O>3pK-'+33/}.غڷm{oEPp0}K]ع }ˏ?Dow)`ƍO;iS:m*/Ǎy*!~<=#G. %KU g`''L?_Bt4-Z(u=m۶+]/v0}Ru?qH6}IJǺHLN ֣}Э!ރl8Ú] q?KN31yfqMWI=R|eL/'b+e{Ҙ,kC̻O /{}8Qne;o>iұ7Kcda?%VmnILZ{QfkT& _eyu޽ kmS E:ּ WƮ cߞm${Bpr`L^nƢݩ|z;wβ>=of X~y*r_]{b\L}p:pNJt" d;uݡi_]|l=6+w(ެlT{H[XWHSemm1!X_'V Ի}h.%߲`k")yƔ_7缧^XP/ ˷xeޡ#Jgo>\ϵ5")m&y&Yw@ViW"-?&Q Iq3(t@Έ@P`!ԫWId:vHRr2)JZzZ7AP{Z.`'|á×q*|4&svm۴!888}hѲ++ӵvvWոEz=-[~z8 uw>쁸lظ-[3;9}tV?~!DX9c5xޖ>?:j ̺qy^&7U~3+c]*{}Zk6|S9bzJJ~#d=cKZҔ 0-Ǧr5k=̺ɀ:ƲGX/pӔyKVzU3Y rsc%íVņ3Y&%5mUԹә'Mjc?A29 3;To51L4kޜ-[j |:skozǞ9ҡ}&O¤$=#H(Nh.ZzQFƛx]Gv˘Fpy>`1vDƎXAJT~.i ݇׶Ϗ̌ .YZd돋jTTM[lhh(ȼy~Ngd, {R>1/Nꂜ3Yƞ}tT#_)_ei/RKEѠB0;c.[я5 d9Oߥ?34D6?ɰ0*Lϩӏ*k-EںU6/ͅG?WmylWc,T#2 J*w Y'L%\Yv]NH*3r(e#"xG[ԃ`-^o9iڄ,@=G*U]j*+7{RT_J19629@ӂHh&elAjҹu ~a5,5V$ٮ-Mt ڣ珯7dGԠ_1rۙW&A4 bHlI.Wˉp0ٸq#͛n;fѼy 6nȘ/>/p-ޫF>۶͛־m[>7uG'\Rg\"9] 0}LiӺ57u~rԡb܄ ,]Q6ԯWˊ<˓|f?un]Csb} ʛUCHtUIaKG8bŀn鑑Ǧ;R/G;|Dw#uNʶ̛ 3S҅yH vIHH . YYDEEMVvqǙ4nFQSOsg;xxxiF#Fqw_vܬZB( IDAT_*$&%1xx{  ϟ2w1- I]  <_yW `+/xeZtCyoK|`;ZjQV-jW)˱kbGK>r]xs >+3e~kU<LJ]ʰc V.{..\c(#{ؓN6MR4!آ؛ˊIjхVU+RuX/k58^,+eGk/}KbRhw3ԠBd$#ðATh[UVD%mf.-,ޑATР"+PVU !iX*F^~VUZC}9|^n`T\E@=>61  #C.J]ݿ{uupQ?lD ?pINV-[{AQ,$+;A;n;n?LZj* Ƃŋ{}f^<:t~/Æ1صTO޷Σw}w/pTD(:=N?k/̋p}v[+?m-@gdЦo?Hً7d-/tқ;_{~3"S;(;( iSvG_s=7[qg#^AܟҦ#D=9o!<9Ι~mnG.VHn@k W:{V2{&"""rvH"##q\̙3Lvm1[,x<6;َ7_Ӧ$&&1w\nօr8[kR_s,[n^ˮ;+ڔɩ))OPy,""""""W`QQQQQQ)$e7?[q5fW~ u0gIuYmγcޚ"t\BX ?ܬk"3ɪovH=|7Wu[9#n~k11'VODDDDDD828q,`6,ۺ:j""""""Aq+Z|75_N!9?2z"6K"\|~swSf>2Sj]ז7䖷N:.&ÝA)L;s$ÉKPt5xT/dxm6 8muy7u|wꔅ廒Hsə싼>Y/|/+bؓWF2{/7VTI=]Oa]e:qtes=s?~[_:DDDDD4}*6lPy7l@ƍ:t* &8rLU_fثӷ9=3FF!W|} 3a"q(^\3s}/وBZGo=ח0C(W?_}5y']:1ӫv[y||>M7m"""""Հ SNY&YN:QLx Ud>t`2}tY͛Uxes:w7?:/!!ϋ35RXv*S\& gΈJ4[+o{xyuur;W|{/㥕drzhՋe֢Pl^pը6t~kaaa_tؑ.]Ӹqs.]PL~wT]`Ֆ#y/3vګsK|M̩nbUL9-kG86FCg?,IN|<~(FPJ盈L2'ӧs5לM) ^2 3V|07q8 кs>6f佴w;4G+{>n$M^Ny`#$WgH ܹs '<Wi3=:O?>/zjG]Efy/=+w |1T5}+z?]<9x(,IS޷^Ce"~8^}s8KY.""""RB)^?6=К~ؼ` &.<hZܒu¨Pƃ!ѣq%"|ؼZ>ƔQsmymnFm v>7uzUo}su-KEӤJHnO_6CKHf<λj_m %-]ZwѶ|Y&:EDDDDD[n^ˮ;ٺY"""""""BrJJmڴY޿+WPZEDDDDDD GXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDD\ XdH ѦU3+DDDDDDPh"\`{H`i\zO#""""""'$Kzqݸ\ܿ'ctٌbl6VKniLO3MDDDDDh{tFY[6 |BHVGv\t1 ,ǻQ'DgH1;+I;t`ʵ)T"[/(G[mrq¯H1S'{#EPy~I݆.^| fzN:JDDDDDk\ɻn*!{^NV˯H1W'K{L:""""""r%A:DW&lqgHc>t*c! GZ농ܿϒv*ؒ۩BDDDDDX*]')atDDDDDDNFLDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDD#Ow㷝9u c`]z;G.ZYXTdh|›.R&aU^(F]E2DZtb33rLN=6)g+T۱]^J͢]Vrmrlb ۣ'jVfN6S$믣Y礈(_7993- 85Z"hS+0:6kLbG!2a =ƇVܝBqfgѾC$iZ2muaǟ<5B;;9l:`\Ul۵V`!\Y|b~䑧fcR.;jaK)]LM|{${_[M3k8]ʷTJY{MdE|^B-b0`κNOnѹ9Xc%VSz=y7E\MDDDDq2q4z%-Sڥq}|btO]i&c"ԠQTI]at A_3x׊Q$:N^Agv`dl /`\*>B>&0y3{xHn6G{w1SXGRwh]»ǰ4ŋ {:r=f;zs_k*rRjz26g@ }3q.®Upjs柳|Sv2;'KοW:2ҘŠǀCLnc!'15z{~9(nq{c!0(Qf?Ѱ|n~W=QהAY|Q.4^$D QAݱir[g,;2/18,yH\^ѢUspn\Nn܀"jp]vj]O'nՏkFPze#ڕðV)+xB2p2x,ZHYƏ/Ǿ!C:s`iqהIOOqٸBRF}lK!םn.gܼHFs00qchڌj|^uSa =oƶ{?C쵺؀`ՇysL7'/Moz{6&@7}2f&hS~1/փLezp/ ޹A9 p1a޻vޅ>޽+Wr̭pcL>J#J2Οb9Vi/U k3ևsLFv8Ң!CD6nJy!7k){/ GM9l]ny.:j?Ckw֖g-=Ç]h-LSxIp>ιpB?dfUd,_.f c }M*tVVMH_%u g" dgs&l=k>NO,D)U.3vd|GHׇjwbht$|ka6k<טo2x4 &F«#7Zn*a3c~kmŪ^-cӛMU3f'Ɏ8T~y?^r8c&ͪ0lCӑw^ g;~V ~v*>2CF|=i)bY%So2f~xSeXRV2q~ Řݻ=\U> O8~EDDD$U&m8FwQH)p[c?؍Sj ĆǛSYis^oaN ~s#vT?|;/f]]Y ~n\7c/GǛ /e];P{\X[ 4c6n?aYeP?ڌl6KOZF;M{sCDpif5p:tV׺UW''rk ,@!l۳}ɢz܁5K3]I"l]:Y )Hz`̵wmA oJL^|ܾEХSQ/O|ǫٸ`qWC /~yu~܆سԇKhԅX rtxV1c ܑ̞Gk~h{^ AIj6D Fw-+?f Z*ی|rmnQ)|#d};k"ҥ4!jsC#+mk&/5Sqo*x6-"""r1 t.ɆlLٷv;d'㥺4-e _.bӏ&;:e_'ϭx nYm(LaxVX@ #Hvfp8 'Ck|z=0֤lN:u}NG[N߶n[mνؔʂ7u5%jpl?lc)- >?6EP`)rδ=dn&XGP>k9YǓضr.PۮD%jMAzjk'qW^Cl&mo<ܚR7e{0,m*>:L7}lJm]6`y'y Cub#VSҟ:^HMLPx&aodgޭ U"""|piwtUlKo$t&M@ vĊHDiRBA*Mz/"! =!R$>pfw;w{M-Vxyq' W.#;P)g9 0?F%Bl+Rrs%rpIIL IDATӂF;άEljЁghOPFbDFD ބ^~{Øs9kF׊yv||@_fkݖrqyC*,- kN .`ř>h|.[GrJ*I7oGM@ֺ/||Ƨd<Eҿo+X[y~xf= N~Kg0I!"""Y@_A? `2xrOLB%E<C>T+6rq֔h²mS15-d/EYKGm42vwKӅi羒~vƛXO|6 H.V (ro+W?K/TBM_7o'f{tͽ%궣G#|>y+@jr4Β`%f͂xWJYr{"hЬZzKJ){=ΰp@w_cf!X ]hܣjYv߽,XxJ+^28ӣ$M*&h>RNpG4`^ʓ{b~= -DzyX˟dּy)nՎ;)X0~@ʵ^1 R`-Xu9c?ը> XRP 佇No&/~8ߵTZ;#{FoOZx_oNaBm|J|ñycPZ<Rx88yrJ{Dg<ݷMD:<C ֞cXK˚f'X{VǴ(oaoyW`7hBGc;O,#4psѸK㫌nLG ~? dl-ʜ3 .s8´k؊AF {91Ž)v 9v zڷRrPZ9r-$ d5y|}<#ۃ'ӧ{=ƀNdhI\GjxA矦B(F*_\[%Vz,`}*v/vݓ`]j/h=7/FtLDDDD;Q#>l6,[ߩ8:&_[Zߋ),'=S3rSU .=We䇭(f2@""""|maE4m*ncgzχaL3ZAWDDDDn`%~h'4UQHQEDDDDDDXDDDDDDDevՙ(߀~U;ٌLDDDDD,;c7 ǜOgj* +cA~(g0>d_Sd: %""""""w 0 yB"i3lVZeyM""""""Y裴 (fͶ![VZ`ci>M-""""""YLhR$_ƺS+jͶ-m,w _ϼ؃=e:DDDDDDF (мf)_oZ8ZfHr SDDDDDDn_npjfeg|ۧAZX,L'""""""Y'_/]/]WDDDDD$k~WK RDDDDDD6@DDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDvw4L0LWkDDDDDD$ߋe |[[MtyI0|/٬XVl6V5۶ߖ|tBx:XuΡxh""""""YEqȝB Áj$$+_CNKK#<ŰT2xKDDDDD$8bwn}O2,iX,ut:YqA %l:DDDDDD `Jc;I˶ޖ ]Ҝ< WDDDDD$+?猌cmBGݞEDDDDDœgQmjS}ilpq>UC` OPyɲYxi,9O%g\L3M!""""" kSKͨDDDDDD9U9ٍLDDDDDEDDDDDDEDDDDDFڱVMSpC&YO*DDDDDDCpDEEe, ;wkV3eԭ@tdCLTTm=ºni(cF~Rs4^|=m3oՕ[T""""rC6mXStJ.{}*L CRVc$>di;ٝ>5nVZq|2L~Yh.V\!{ֺ{q/Q;lUo0>w1 .`B9tH| 5mt $b1A*Yxsm*L =Gn|T{./pJtd&< šID8x.Oѥ|%K2ܘ~ˍ(qïixm..*j͋hxMݞQݱe1u>҄_>nFůY=S|8U㲲҂1cd1OQ#>mG7[~Nۏp<*OP4 ^c}9g+5ܝyſMUVI`%["ʇ B(⢄ݩǴرxY2QjZuu,ߧ?;z*ۿ>btz"!d bӓbO*6 >=oeKhx\T"d<FORid':=g>',VM̜ϖ0 rȗ]6/ad을h5 .UGCN$@S e2ǩl8{<^FrI>'~4Õ`zS6-e?9n`}|>IܾE` ;aҽoa >,"""ߨbm;gυýߙ̐gHx`\ZMV|a X _s1|:IzRfl'3u)qt AES#I؉ݸclћ9oW)ٳa-uiX11g>y(VIaDm^,mO,PVWd[Yeόq|4i[[Quu>@Jl@38iAܶ|կ7q؝>K +bt6açjڀ&w0aX3ﵒX`XY]N M1姓pV}/>@A6ʎ_R/~}r\4Z/ T 3Q_xtą'&pq'I+ă=_̴؄iq؂ PÛlWn߮SV7g x]aAK<Ѷ%K~]xɲ`̿?{Yxw` Dߌ[}w:uy.Z֓%NZoK#-TMWAP*wS)|qj*1{K^fMyË=&ppě4 _I .jf/>uk%Y<ł82iɻPE~z,JI׽HbQ-W2b^oj`?ɧFүT,Ȋ{̰G2dUFf1S6 wIGlj޷C3&}NR88n n#|KC*|o۳ 3푢x8v&K. Fz4.vC=@ϗ:M| 1',5vsk׼9+>C$WoR~qb3I;AjSu6 k;L'( EDD&Ç*+;  F2l~%828yWW=|-_heeom^7f1\=ڦwg좊݆?`7Ŏ݄bMNO0> \?Ku;$X5^3LH[Ve!(UFO_:M֜=a@"_NN\yQ;$(wKW|su+hWy^h^EpoI{l-U,z& cp4VZ5}gؾA>8sp1 eVhѭWgƆry/ucyS " |}2+zj_I5aO9٨*~q"=)G<:OuO5 pl$_H)Ҙ7?A ;JRa""""2Dτxsoi+L~4|-P> er..Gkff,%|z͔@^7E;cBxN[V/9o&Cqzxd`dx2پyVyeOL?_Ǩw ryɧcɘI,ޏA>AP~#V×1ӵbTU {`8`⅏w"ɀ7qQt>I.çH )ު+}[uŒ|>1yt_]\WNzf`7ѸoX(u[ '.Tb Pɫc[R=rׁ*י"""rپ}5?RJ.c7ʰv0aicvmg\=;s`H1{{s3~qwxHëܻ?|ˊvf?E`:|_:M}竺pE`5`fŒuŌ]x]6ݢX57B*ӵy.2MDkRjfmIeɰOpF\<17ŋoˢNS1T,E n4I\È9g Y3!K")צ.(6MH\(V}y+ҰI'|?dKW__@ f3uP^%g9 k6_yRn4VG3Y{<$ 5$<:5lcؙO37{3cBDF7+ۥӳo$_|&01{bzs "##+`e!ؾe+Q/$$z([2j|. ř/ :m0ʕYjN`%!rS<p<鳸\.+IJvU UPq """""`Q((((dݰ¸My1xgl(ޛUvv&bLeϔ+""""rg)Yᐐb]' rB?*$awûf̖cv?3UDDDD10~; 8 fcy`)exlp=~ ]KP{&1s"}t|9-5f}-Y<6% IDAT8LdHH11wm♫uEZ0S /Kf;"Gbl~;vvk({צNٙ3m,ю>J>~4g]qjcMn\ $ά;&TCZ$jޛDzdIEi+x~a(ٔWj^!jL)3m~;j^kOM7Ua|O]y,$( DDDD$[3lD#s}qMan Ə-aиϽЄAݬo7GӤzfǢ0`:4/'>RLy.-؞-K)kjቓ0g|Q񤤦batS|S/؄x;L5XRIIscrEo2#ȑ+8I]l-%dR8wa?GZWINri}~Z: 3oV&Ypk՞J>i^`~:10ΜeRS13p*ܐޥٙXvq3r..]0PV\|R 0Dfdzd>/d9iH+Nj`ty}.Ibx """"ٔY&F881R"0ƍ-QX[%_P&βƅA++%-Hm`@yM Xϭ!XНS1m`=wML;{|A9 .e&>q8 KX8/AWa/' q{Jb.fNf8'mk]~iژ&헑ДG0vџ=؇_{aBYLٔ+жn+Vnˏ\#3g, 湜SY6?CRɇiBƽDPl({m~` l[  ºA;1Sf`4kӒ~L%pakvc~^y|3XuuYwVhS(y*=է%b3k\W<*ХW#DZc%עx(k??`GO $ &2bM[i/O `To%} 8i jxS|`9r]gcfٿE֫QsҶt._1pFm`T) DDDD$} *(>T3hZPl^A`o@tNxQq=:4, K g>*) 0Zha:MqwؿoﭿBrJLL WfSi$l/wpv ?d}q_}Áaƿ(fOݎr}tL ۷oTqZˊ).C]AXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDn I$^EDDDD3 v燹XOR{0Ť8h_z_奪!)|tĒi| |1GFPz!Q4`гmˉTr4~N2u2ERoo=vNՆwxs.-fv<ϗE)ňiRWv u# jSƼI~7M8rؖF=MX:~L:Ș q5"Ms|ьn.KAl^OR"lP~] /AżVN= Du6Z?Ib~iO4k8I;y]|AHv(f+swv &Q;/TLv0=rR,}!zH6`W瞪S'z?]X0"}R׀\;9rEW/'|9,=*pt)6/N ;yņ9X[*7bX+] |7A;j `X2iS{f|,P|csOܾK! S[Q\Y5nF y.:{: M]og2 AF}3/y{͇j?&+'plD/s&7˙caeC;O+9*w`ݼU~w_aJ>LYY"""""Р]9G2{E1NYB(sla:0<Gۢ]zbp:4xGrT[Q8x2ƎDN+d󑙎 E^['.ZqWFj\<ݔzWՂ5f$""""" YFJƼ_Le((3l"<:"4Ob=Ư߭D 71})|T8A pl. H ]˘ygK "290P6O'y \/*+swm.C' Ν$". ǯԹjmdCc)w+sǨg4=܉o3o>o}#].# ؅$[ ܚjfy>~2?#:uZl]r^RMjQfd:T^Kޫ v%.e] JKU^g/ёH"""""-Z0S&Gٿo-ߨ"--x͜&lQXޫpA_Be.IaN|}}lX,M5:&۷_k*U@j3-Rnjl*kP5~K""""""}XDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDD$۲`e/a0DDg ""r+?cEEDDnfEVbb&kC㘱3?OuŒ2]t> DDDn Ã!!_ 9}i;X+""7SyRR9s$~CT/t׵_8Q\.t_0M N"i7 zW"#Yj9e놵-^ ժVtWh; ¯:PrH8GX(kS-Ď"pM[]j&NgЂm,ގzB>~:ϹpX,g.`;7P.Yi'׵a|W8?2V ~w,GK? #ywg,g'7C `@a5A8ox jYh-6v!&'0wx]r Jz/ {YPPPl  "EAPP&I%Bz$?Bh!4<<@.w;;73ީT&IJ\e}y776rȿs%>cHڢx~Vt DDXqkS8bK .$>ZIV(iptyP+E|v{(8@ `I1i9&֓& y5?%jdƠH눊<('ҳ9}:cnG\pfP-fđLrJfT.竃 " ",+<$A iω?A $dzNEkvn.omgxjg9_J޼89JbJ8gz~bR}N:S*{Y ?#Lr""('(?aȶ+dyDp䈊cΉdzy@9)DN&$L0D%NLuHvA,}:/,&S D>Eng\v`Ě~Dt  I 8$x'3.)vRED$`_0@tw>:b!o=Clޒu?O4Oѧöɓ>ͺ1;Ci?kR zA|N$mT"rL͛77S KvRRR:Wf7g;ladQ3""rW 00R;}ɤkED}gv?VL&Ǵ]ncvxpttlsQiVر#ϩX"AAgHaȣAXD'DL IDATDDDDDEDDDDDDEDDDDDDEDDDDDD>y0D? C֘L&>_f`_008YT/AՂΤv#F"0288X,X-f[ 8L::bFƠEDDN𥓭K?ri%Y Zy. F2Ξܭ|u#""rۮ8:+/""<,""rB(򈈈(((((((((a:""""""<9ΞBd2]o)AIDDDDD>gIW[xSUDDDDDDz=v*I<AG((((((((]0C_H^O|KҮG pQ~8xRR1|&L6Q|">&EDDDDD6܏Ɔ ﯽw'w3W*ͫq?Ӝ7yRێ*niω8?,`D<[]Jf|K󁫹ظ3Λ)u|,^Dxm8xpR 5pjzՌ\3&O ?_!d3ߍN OqҍnhDDDDDDhrnd`rLݛBoY X7䍯rp_ןIJ"<ӭHΝK5/ysTu8)+qj;m-=+h?}s򷛈$5US.O>8.pDZ>a'#D=sFagÙz~ """""xg- V6Oa{H Iy捋YJBgxe ²c+`޹& %$ѷ4{cVmL?#=@om> (6?KۙN%<ӌ?7Ek永G/Fsz|2AF2 gٹ<ΡI$X6:ӸVe:DtWADDDDDDg&Dp8r}o5D.}hZy=m^:u ΟL<%0-'-eIoxp\'.r0 ο(sS!p`ɑ;exNJS0V Da%ch^;ogDO5hٶ%woDDDDDD`IUϴk/Dd2&4P&?[,3-xr0Q[{wς0Խ{x8fRݚ7JUW2{6?Į}:N;܇ZG#s p6/>9v/ILIʕ)IAKIXҮNȉgE<5Lx{m|~be;4܀'ǝpg}甕l߄㺑oLtL:ɚ3$W r462˜+ @2$"""""F2n2X,{? ;+xϊGS""""""HPGVάeU""""""((((((<|0tDDDDDDz~sdd6s:"Ԕvj}l6l{0TDDDDDD3& TdƢ+"""""r߇`ɸ")R3{/e~EDDDDD@oIDDDDDD """""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""",""""""r=mO:{8O/oNךSt˯8 M:JAPA5GDDDDDAˉnEgmSFO5YQ‚9eҁy<3N3mW4 gMm$rP>Mh/}xi~*終+fxYwtG ɦ'g*}&jaN)D `!6z+X#+דeGzUUYDDDDDD3I+yܜn|UHTy=_LW 7Ϊ#"""""" QH2*Ix@f1L8’HǝTmy=K SU|qEyE$|ry̛';~_̶ɬYyh=_JEZ͊?1_"uRKgQ%/NMgTmY+$ úc>o_qS!~6~V鴿mbVWsJFDDDDDAeVyhxMcN&!!NGZDDDDDz..n3OT * 2+8+"""""88_qȣ<Ҕr挎<Ҕ#+"""""4G$(܏ +9&?{OㅻI@nyr(?  'uF"xܴ?Þ"dfs͇ <)U6""%q,Rw!+SOfTY3 b.Yy\ Ό,A.# ^:˻NEo(?LFGf۱Ks7t.zT Z0Oƞ7?yYT:}jD4Ñ=5|>&y?3i ]s8 }'. zT lҟEK2m;1m᳐62C7ߓ5Lc%e55"|_7ٸߗ&,ٸkjD <_/_*G֒ta=~m;bT^A^+װb ֟V.Y΂;8;KdP V^/Ѯ?F'7o=`~GҋZT D܅0hk&⯟0b1߸ j?n6nd<8']`sز)%~WڔD܅3lq4&,g.AɃx6u's~wN|0?3߾"ߨ[g x*rj}9cOc]BLFǼ'P[|t5;Va,}L}b1yc}*2up3GM`hlε48E)4wB1l{2WV?{|ԭ-zzS'2taL>9Oc+tl5_4XR' v]S 6廩a,ĭPf^od,? }]ÞL 1ˁ ~}c#ؼ5)+uY W҇[':#Z4p]طCyzZΗl^mӚL7{(EZ3nYk02͇Jr=/~vqI 4yxɬ69ٱ0+2޸F7-aӄ֧ )_̲/ad]>Åclc _X )Cy{V23$*=|=: aYw} c`2x`β 2ehX"+&Nb7ݻ y [uk͖ɿ- OR~ƾ՛3C3B Ы;.D5;PVOEH+%R:d/۰-8raug'wc0yqYr9jMaA~ߜ@8gx#!g/?or:7 /Nr΋O8V :qL'Mr\;ֲ6}; 9Ǽؖj`+X T,EZ50p7 5Ch5N.f ,mm`ΛJq*K=ZPվiG2bj$;aK>}Kf1eu^\Jx 25J>d"&%׫{Sn,Ƿ/w,r[UtǗOy2-IT S>+y{^k]h (M?˘:f"qXnt Jʰ (nn V6_2m|o| Rٵx1sw_'L\ зQ"z g,gs)Z&m//V*AcƾD|sg]*BxA&K)SS=K~1sؒRZ=dKX=˽ U8OߗktK'a҃י!Ϊ]1 E.yX<\˃sMyK3vj1 cƮuNƞ5F? q<6 ѷ8'Y u WPH!l]dw0cDƌ#4L>]|{ N;PwmLE)f.ɅLeq ?)P( 8N i_t20eYI߀.4_~gi.׸>ekQ;j+3L] )I!|=CeMBڙ9+d3 wgye|gMr[LGim]SM 9g+{&è9J׍] ү32s٘pg3V,@zQ^a) ӊ㑓]rKt󛃙>6F1\ad~et%^jvk Vy_xj݌ϯMVKx-D$ɓ&ɑt+|qbd\>ɳ2jj܂$[./seiwN1f(|Yڡ z]S<V?Z-S[R`wqF֭HB ql:[cџf6,XY]1duxf zz]na XfZ$o' roWWcjIrj+\lK-s-/$=Vmy/:CiVf" ۓ1Q\H60ۣ0 w^n8alzq:usxb ̶9+HB~Z* ^'︫Hżf2㪤tE:ez26 n8e#s%[22N*u뙩1%C yb0p;v/ o/IɤW+Rd5?0e[н|~ wee]ܰs (Wz1('.8AIKEf6" 5 _a ;#1 $[-8B86i{^XrnOXLgyFnb-h]{w6E(U/| :go1L^+q΁"~0b.5JS"\`$-v]0'W"%_|L"g 7%]_nDxńbEًP‡EI=|vc2Sھ+[BvX~H_v޹)f$!*K3"Gze/*9=J@v&YބSTdܭ'´i]싧d8Džȸ쵩gGV|X!/{o9mSre)F$;&Leqju WB{d0 oЙL0x$/wiAUPnKC[~3ʻ™l<1C[53מּ|jA &:@!IViGTpL|"~-$ߎcNo==)vcQa?..ԈS"6=&Hf-{oňK}7׭XΕjM<(^%.[ֲ>q&P+lĚCެqS[zhӕN%<) N.Ucwۘ`gSDC;Å l I%q _$ʳ|QY않CVl?Ţ'Ҧ =w~FW!9e_ m2cWt]$ ՜f.stʞkI:},y`D|,& -S[XEʖSYΎO@qj8nЌo^*Ι9`DdpPo;œ 'ئ"E@4y(^΂^ڹCzR9HY1ϖ[ C>²0ɾ 8# qJ6t,Kn}\x k65$:[}8'vgDk>8/ 7hKjީu>?3:WQbB{4M՗JD^L-ԈN-}8w0JC 8/m@F-@Ȯ,_S[Ѹo_SiqoiJV_J}s/Uk-]d\q+U q/KbEAxByިQ|q\qq|3/<7$B.MVY,zɳySk#jӢT Х<#st5h]DM|> 3`K|(rdIfRT6BƦ_{I~RqX3ZѯYZY\hφ`Ձ'JUűdL3 0?ϗmA&"|Fl7xlqVmMT@0o/ٺQwViוT`sZ 1}ڸꄱ}_Q\y8>Jjć%imٕ */ukLVsCsɼ7*w))3{aZTmZƓ)]3#Wd fOSYE1,\[sC64ҏA>$\؉e<Vÿm%Yњ=І>/ONҫZ]sW]{/G"F,G-3|\]8yqEzv#.AAYeGTWdKogPm3ʝkҶeڝ'9̪ϟS?|8jKVqp'0r_<TZ\0Ґ2\~N͎h:yrf?2Xg}k;\pMzQ-8NGzIekބnj=0 OmGjR:Jc/clf[y,6½^uf<ƞ>ާBj-yə+uE7-Cxa֖j^)6"˚18qݓ{ Z>'_җXK} RJzm-݃av8^o6CO}yiUttϝsW_rk#fb);vs*VL)()q<+CynrFZr g8@=^;JC xРB}DDDnD!o7QLypEq.ŁWn{c*:Z ͊,^=2MN|և~$vʮt?&Mw51~z!5qWXfnbڰs߿gJa\zU1Bƛ ?'KM|`V:!+GsחؚT ]sH+<|P;]4r;m9KѶwV%)K~n{,皁d{^BE)`5}|5#ݔ#٩26'| u;ļU%UG#0Yٺ1WVlk\B-7ҺTF cybRbkipŝ^#YoypMŠ,+O}Re{zݔNĝ 81h:rLѹoxdLϞ_4,Ʉ]ǤaXzOۊo fmöy,`݉yf~ڏvOBaZe˘6gbX?C|OϺ"Y>7c)--ݟFE> E0ob0QUNc*6Q[m=*|E"z/ĒwY?s7#r9U/`NM_vh&Mzb2|;mݬ1((Ku֘ґ98Rպ/t&zYcifq:@H!Yyb܏y_ƻ!K73I{ v>uz\މl(zjqi=,:͐=%# \K^aGRKܵzl2ma-k2ĤgY?=ENs >=Vr'plǧc~u¥&uuU'#Ck[+)0}D 1}&xR|y|pЩ/Ff1הD45)/"lz:ztuG/X+MʒoWG Estj8#=ʽML oďD.bo{l%.,nqDeqg".L=gMKK$Wկ9>h/Xpkҩ|C=>†my$ĹZ݂m3Ӫ9hn]ϸgKrgI|Yy7^J x^=O}r!KBhܘBR;YkSWro> vXnk8fG^8-V-SӐ!P/em_39Sg& _s+N'f9vn܆ʊt_DhȊQlZclSZŽ% ?1cTf-%8Q@j;Qw}Kgzh|~z9 Fv2y~4*Q69 Rd}'LMI-qӐFKDJxx{'7UV,H)= ztߤOcJQCm?%Mщݷē髼ص>85 4D(|.5}{%A^+WofOE}cVVݮOcghQi5*ʖNM^G?EQyY`/\ n}Y.Z_Oط!Vl{ًGh)H; r~0!f$$A.YcGz 'pXC ^xcؓ^&s35޴ =DeyM<)$TZ f뉮iJ.dNktafl'2G˙o4=omC;;wò(>EQ IDATB!jE>Xt<Z`[/χǎbWؽ;֫S3R.nQ>ռ>(ϜnYMP=l8z |sٵ,K'9Pcݚ(u[RbG]{A?qp:5Qm%blwPHeٗ'!ǹK\[8j'FM{nedUBW;f_p)6,RE$M]Chyt8=^󢋱tέ_Ί+E#V(\Wbc*VHkq)IX!Pm%KCTpYK1n&?V1pDODUqWcɩTbȽSWQ@ĂNU4M`7Zw_sN8_^F}K& ğYx&gλ{z}նg :h/d4>>ao[.@_\5ETXJm9 )U1dhw{% 11Bⷬz:덕&?mj2F,0#5!+i8{㠥8ڙZ %*EܹjoeF#j޷o7T]NLOkl^$5nk'Dt5(jyl 3Y$V Щ34VKD_K;+RԴJ kY1i'gs!ixCƱ =ېt!"KWF}&=4E89Ya+Mu?O5sX rqTu*EbstK,p2BqW єq)MNC|f֬#8.2@QC-_XJ <%rD&8w w3maAeE 5^dg[xF&Ur0 lI:-@Q<Y9%!Os:[kvJCJww(HKhR =@W[ahG^ ia>h3}y)WI2uahH*Ǭo_z6)9e7$((85}h "|M_9W,ۙu80(ʸߊ^Gu+ngXVkNF:-].;öwOHv3`@K%xxs멓Zر!{X1uhP;M=5yd>Gq|`6hZap)ϿC)h^%EqxZ P4)mQP*rIyri3`2v};SfHgo Ӱ͙ƔnFA%>*Zy:7Z9)Ժ8Hs3u2 i5':j@'ȶAscDgewX2ąvEI7H~h epJht?,MZ=v83_}r(ofSD*R:v¦ [c $qޑ}ZOH( [9DDMSe:thr-z.][}zyRqK_^jWڒ~hɪҒK;v:'(h(.Z҉=My&Ct=rRRP g*c3*"X45ZՓpcmȤӫw \El,)Nѱ3#3H}}g|Û [CV 4nXƯ}uDJ)jUm?=66~]i#\pfCtzJ¯=!_X ([oUHT,jqL*7TƅsT,R\MM~>XT))b8U(P"UHyRKt9ѧ-,j!5DO@]#)#[v\ԛO<[+AW6jH$ 9~ QMaJt1*+K.THu,Iֺ=Nk._ژjWmuuj*+ed>qU:2"Y7|n?Cpc L eL!:?Fr'3!Nǫ܋\}oI);,s<="G*7+h-'v.`T[ @ sUVXo#Y@7#(Y4(N쳜F~i/r|ķf1Q#`MAz(| -дz<л.NHe{pYHrAQ!\@ub$;@O}nҗAП~VHĒ%*28w8N^"!G+={ܦKWJ^eٻL48zz.iXLMl2+gw8~''7쎃fW(YjL;f_H@Z͊sj>Ħ ZbMR>UTUQm>e $9DZ3i> dt ,X .]r< 3a1@Bcw dwp:ciҒėA!3wSFp%V9Q4"b.Dp6>JK"d=d75m3VMas ը7fM!:c¸-ԑG֐a -'r:Io  F;n3omc6=792ȗ2y/6d!ܨ1j/>+hq#, ա~=r H(p&^̍:A齻S(*VM}Z@K:DP#&I& 3B7](-C$_蠧+ 0BOOyE5`*rJ!&\.TTI" ⿶y$zkeoH^đT& @ca'N ߺi68hWъ}!d E72jޟR*cOd!u9zN'ѣ1Frص/bz?LrÙxcs=p<_Woʣw[ ]|bpF$g華&9 eO@euGSkCl4ϳH-V;>jCSYu4Ayoɬ W߫BdZ 7|">˩z86M "sz84uQ2rKG.#Edf˞8[cfVá$jtbX ^jܨob5, >@BO ҳAd}hr/eシ}\6T}=]@6iurs[j~'li/xD'.Y pQe倝2I~JmR#>Q})Z"]=J SguKcif TSY%'+)2$8 yVojU `afД瑔/voIZYԜ'c//U)f'+k4MGDT9GT(Ax˪٘z'k"ˆ0uϪu$:oG6H *r;-==q|,+L;Ⱥt6bA,bpMPNgwj + 5Ůkz1kɇDGOZС7UpG-㶴CDU*|RˈYc!LYi881y?Y=*Hrߠ<3FWDKs Ts&MOERʹea1d,,UI;ɤ*xS̑'k!ϲ+'V=]|]+mrĬ-R^%:6#;{9JlnzҚoaLѓx9\Q) n/E_ku,+>ً֥jdrڴh\51`e9UjrkfV({e򗮓\! R+ijjr (?b{Y׸y҆DUYU2̘; Z΃{J~2} Lۉ7y^%Ud<'~f]հU,";+ `FO,X,~2@}]1t!!(|X;w0q;ߎuX/,zw(~Ց\I;dˆtUs)*h{W ȼ4(\ >bk u 2 -yK: ;7EĶWM\Q;ͱ32ZŃ᤺AS+}iѡ Fv!7!$yIXWCo#9ͱmmqXj,ΙAKR to^⽔dRLy$iWw?gLS%%s}dPUu "k} t( K<ʣRDW33TqeDpAW@jA_g.ۨ9}6Ť_r {#G;o6Xq%NNUv/2w$ҮQ΁m5V:lf9D1daL[݋ t E2zH>][hvdYNt?ucO~vexiPNdiρ9 us#+VIJGj6 ~{ G򒸜Vg7Y;w+4)RPC7+c҇׳o_L(r:/`i.r^y[VM"&4O?̛82w2;4(ID@,ˊhz:&.zk=#֕djJю2Kғ7^-ze!g.&zAE }O4E j&=^%&ޛ>@i]6&hwⅹf8bp~ < 2hNiwm7.m]uE\#^@D9i&2DB]?WSp3BK޶m)GWLI*QڍEm+D*3 tT2"}?aǹV|&6 KJ&g|7 *ҹe9j-_XSU'2퍉fJMf4oCθIN Ѽ{W)%iN'T!ӯ+^y{í?Aej~ʸ{;:RKzyw(sehcA{oltg'ȸ羄[.:STuak/-X.9EF4LI7y>d"_U ,MEgc>9\G6wJt&=__ X8y-[SRWEO{8g&^EG"2)iL*hSDf=Tu\4Km[[DY[zrs_|*a} 8i3qz':!v(.0ԹwN /"`:;7Hz +=)\Oz!}T)xL&UGv[S恛D\]?q*Æ'PHegLLaӍGhт IDAT\Z*'{y(On 5_8 r عtL^+N?W/U_,G(:,cgozlя6\ZG=K@}tjUUQW{Q߿cݖ+Ok8 M{_aDAu^6ɿg7]NDj_ĥg%-<ϓւFF>70U9R ":JML=z13pDhv5FC"• E"uy%;2Լs?|6Mj87q}{=y=P;=à Ke ΜӅ}4*򕼷rȹ:79hκqHK.r'g7=n[e^d{P| =(Vu)Ԛo?Vkq2%`֦od^)/5zT0ħ&z"96VFYeOocX&S V!׶:*۪3P9Dž|K/?'u"c}L'> }@ȵlJ~XlIL[~Rʾy- VtD+3H@mp*9:x0?BuG~!ieglnTeAmЋ|G}:]Du^2'l@ymG fl=l7#$DѾ2{Vߞ>;s~cS 퇵h?{381kJ*K)6pf0@u^ aQ/P/n^ WTutmnI/K>xG soW:U ]yaf/f1'P=%jϢAdͨL>zlbLN"w|Z~@đ.eT]t45Z@ހDQSC⦖`ߝɆ{uѵA?[ fO`;dg^ݿ~#CS.ZZZhhjʕ)׮]k5xy4}Zye=22Oũ8do[)dFCʹCxy&OO+[23'Po p^P2E\7 "%_GBg߽v D4 3ҥ$&e#bu7΍w݇ q'y/nuR{Θ@Y%6ˎ V 2)Lsl!K~ @MaE"Y+*rr鿎N(Lxy+w/svj/JreCIkљܫlkT}N?b2N85q2Biu(bLnd_DƳJw0fAjj:ZOdkY|lXҭ,gʤM,n{?}u7-@Nu^6~c(??ݟ\P!?6}Y,z76>[uȚa#q"ts(wUE@Ndј8kP|+PF`>P=Sx2{Zml{*_%T!Lx>xs1o.&:j8F׮%G3p]C_(} <0|QwrΌȕś(cE0oBuXvMZt{Re=Ud"T5RY [aOq3uJq yzj(s̷Fܸ]7[$_!!h/ r(*s(W =ϯgVJ2뷛5=1m×2+oz/ 7X:y*n^d9G߱[)G>Np^fmhPC/Yk@q&UA9u$Q!`8/F{պS \cVesvVH  |?g: U^fMϭw:llGpXybS;O̚jj?ujfn11Os"TMxȎ5jrJv9 iz<u=P.rr.xH(2|\0JOccpbJ^aG[L{Зi ߣGkr9| x<̙/I!7s٨' Nm[ޜ> y; :iN]'>p!G+epMK_X" ={_(F@S^DNŐVGCWO[yȒv§SFũy]b1hHLi#%\Hƛwgy/JđPk`7yo:?,KϿ=4r?UUYt8~2]2+{2 ߷"{<φӵ{#YZ_ܶ}UD淓)ham%Dq]Ò&1Sgk<1!WmϤO]%y{4O'4?3#tq:,aDW&S@jja#2+"Jd*ڠkA~f8  !3CR𳄔wƼG~PBjjA/iV2 b0QUF%}Ԑ]+kb(sQVRrI5oKD:z&&} nOAGY15x;RKo7"2s|2XW%@ LgɭӢEܹjoeF#`m;*/b~$&z9Z[cȫhgpʖQ$7vun3e ع:5F_ B@ C]::v=`dfʽI~A Yܵ N8iP]݅ V!'wp$jGeե#@It05 #uCGSE 耻dvdI#FՑrD 5^dg[xF&]&9U?dF8>cIY㋐{_wG3@ QqfE*|\1r}>;Vຨsf2IcYI3ςel_9s,YHo4|~X Ȇd=]]R 5PC 5P:s//1{ >cwz sׄR2Q wK^69&,G"+%ѨrA_,Slb&LW }J>Y}0?腵l]C2wd;3 ݎ*:"=*28|"%@J9RyҀח!dsl'V%AVn;uXet,8xx^NvIb[s>QǕ;] mGRH) QPD -I@|CXwC'dR艵 ]q@Nf|rS/ bb4ErJ|mGSM1TL2hE\@jޅn. ҝCId4<=eȞ`ő:Ү7ԛsk[x1km<@Hqox#){SȤޥgm*7hjoso `9_aojUV{YYD10\7_}泪F#rr +%uG>dms%(er0g'(E.B@1 `@[ wd;ܿ\_'IRܹk^ #8Zޅ/w#[{1fO4*n9OOFjj=ױ'Xӵ7oMcƕkLM>sBHnq,$bDRP%hT\@VzrYI[ PE^}@Aj}pq!yU E`j~ PP&$Ozʸ]:=k|SI%"h12e9\<C^e!W.v3uź*Rϓhh < }uø> p6C>SYKBɠ/>c@|4I(mx*;)yW[邁K풦Ǒı'ت诀H0jUNWc~<\.Ti E@]h8z a`MF0rymRERΨw@Q2ExclAI g<C)yuއ$8HW>a*;:82A8]TOĚ 2c>'/eW'pc0#!88j8$!H UJBRTQ* *"4Eޛ4!4iRZh!FnD }!Y[&* X(\6U;i)DaCy/ #F0ȽONfwzMQY}|4tAs0a4K,ɶ!r,īI;?ג%mzsN.MTj%L|歲D{(3n݋He(A %1>0nM"yrk}G `Qy<#)EȺX#ZyHOFa2 :8]PKX &&(`*LCxtzr;GlMz,Ycc9MEJw'|ޝi[L/C;ҏ'ڴ^|ጯw`S/'9q%b-o>8(ߡIJolKvx>˩xBZ6L~"!^-ozG-ٸ*F9MD{[4b3͙=5 .y(Y"Үۏyw5:v#nՌ7.;f3ܻSa&JmY;x#YƐI9lJ`Qv2a` S_@MDxEi\}u,RP=/;[2ڢKXϦ6b"W9^yX0l<+f:̓<ū4|>=@_0h hZ֝팋ñuF>,ζ'Vfդϸۑr]>WyExs#6ҵy|ܻ1޹.g[T&8~&c̯|6zchшls&dqed&캀QY*FFO|t;s5Q/3 Y#9a'fffNbbw=~rDD7ʑ~ӕb[uz2&xnC~}0&""""oqx7YYQ;77WTf>|\2ժUZE, u#~EDDDDA "sfeJ󱅼4pC=Qf]V:%ꂺx.z-_Ϡ1^ǟ@DDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDD* IDATDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDD8GpvqQˊM ղ"""""DS.zBp6mԲ"""""DS.zBpZ5`|pvvU+_??}4jB!^X@EDDDDDSEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDU"""""",""""""C8ċr:.$kfwjbih~|wBàJӶȩoƆTjGYOOj}>̓9/}T>/Kv}}EDDDDD8}u6n=H𶍌_E>^J*?,WG^lVOܺ 9A\DDDDD$gԲi:kD}.aӜ ]2+q!mؿ9e`='pE:{~Y&ӾͧH]=f9 `O΅|9g3'oXI8y&_? *Sޠ|KlOG]uHfqb.⮕iSv;\}g$%Wv! }`!TmقJ>=_s3l)2;ݵzI;PGkv c 'Ik؎J:q$&0[O0Wl8;Fp5 7^yt̍GEMMD 'Ft-`";ÝqғWy|fE>]ȸ#'{ҷ{} b5.ِN."""""pj Ԫ勩f!{i˾ayff>ԳnWGY\]Z< zjd$q͖,ngŻ~η_w'R'*-#X>m6?YF/d{ y)ΜYe9ȏӭQkPB,czwW/ `TPq,:L*.T[C|dǏd=M%w;߲xAN z(ۮ,bπO!4 c8x"')=h}Bo+7fl<Œ`% %zwsz@  Y6}"""""0 2RD].hdyt+8Â>dw֏iN~'TMVVN1>T\jxRE`y)AU=C?B""""""1ȣ%>k}\K/ٕ"EՋm 9wƎMXh¯<1RR eݽG$˗eEDDDD䉦\+WԲ"""""DS.zBpJrZVDDDDDhEOHQ````%S]>i%ڐzH7ٖX; 6~ձ=Wu- f< P M5+ ޸v^[@{>zkov R5#PGZ2 J;<܍"u3u6ȚxRϽQ/&̞Ǻ^1ƅVo3e:gj<R46֬dio] *ugt.@Ô=J5{XW$\#o޴")ymK<πZkp9 ټ%רL Ό}9 z* 24$h`s嗣Ő^4rzPw4VEh*K. ;϶oY{5{"""""mRR8fٱ_l"h3~ 0x:G[o[9cv'znן~-+|&g ] {X •=0ZQ^56h4VEa3` 8`ZR}ΚѰ v'fsN3NVwPط8CùUt//bZnoIlTɕg^/BoL3VWMר,N! H=룝 L^؛=h2| `Y+כGGTǴD_AٞI=z36۸~f7sasD8{"}rb|6?O9-kVRn&n\7ywl^t~ 9Q2UQ)&]$dSGF*P.0b](ؠ5/rQ~09V.S=tu~3q H;3bqG)^ gbwr~*wAoHՅG3CNN hF<~ݙ{KSӠD,gf! Jdˁxm˱ .=1?C_%bY2uooy򈈈<4 p~;?EXSp";7\Ĝ&5:iNxM2/`_7,bP2˲gE克Lީlqtټ-Pn.3ݭ =>x 3, wuNFN;g"9h6A +alyق#b)E$m=E`kMlN:ægU v'ء-z!l˦<9۶-e 0?TXsU39lGa10{C V R}/'/@:ϗ+Ӱ=.bOx|wG,{.;*;ofmP}D4?mzg){b7 /kYd[""""" 8na-f*&2kdTl,i[A7 +;kb2MX& ԸዧqX6P@bZ5 "#]k \if2-;l(%a8rx5ߜџw3:_Eo܌+$&#Xħ Q\ <~V)m!Qg2\&(UIkٞaPBi)D;}{ pREȅ9`vy-8d[{̄B%(Ǟ*AQ %:և K)6r#p:1olKRThӍZ?K}27 H6qV[Y~:ihN~5ӵ4ЂO=x`߻?<""""" $ҰB{Zy^ ևdm% (R!_$* [wjuDhftdl?7}Aq;oG锂51[ thU ۖlO{t/ÿCp|^ n˾y 8}F'%u. xA]IZ_YӪ5T8{l~k4;0 𬫉v1LC[1- Α>*tH2B6O~9xz~x{فcQZx#050A( 9u[xO^"U= c}Q!Vh&8Xϲr:Lˆ1l M~NRMŗ+Oq>_},9_!""""p  x%r/߭EFh7BWq0~՛Pڸ3YA5kp=heV8zsr@>WRF˾%ZE^6 v>~Nk\/H ?̏=%;+O&7NfW?ԡFZgdѤցaf8O6s1~;UNb$x:9Jm"iD] Lb~{=̳tf]t}%1hf][ iF{-=9X""""\ Öa~|Vh =<33th˅,۵l?mfCϟc[G NJY8jwm3LT9ϒ蟹O#.l'[ijG=y|j?z֛+_,[Z.QF%V/W%ޛ<:I[+>&DsdMHNqz V%=Fl3%=`K}őoة DDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDD⢖'r {{eEDDDD䉦\VmڨeEDDDD䉦\j2V'+~~ h05jTCNjT T @( DDDDDDDXDDDDDD$pȩJ&/+ILwͻ U_""""""O9l΄1_KzzA=S ~1oc3""""""O9p g vC=-&bw.99yÊoMߏ^v-JE u!dQ ;gb` {S2Vuß'!9b:+. S&|Ǟ qW8y&_? *Sޠ/߶ܮaY5ʴ|*EJ28y7woa_:viՉ:Nd Ӷ;뜋ĔdOsD:=MO )Ao:Tf͕_$""""",ҍ1=I\ 9Ķo] FV$LpbDG&ұ39g p &W8x×7ؚ&qv1qW}L۵YDz!*20"_m~"Nіݥ ;ndz $$%kM|<\L8'^d]ț puuń Wz~X=/#ݵ5°I$ E] PM̯+Y+v++סe#/ኁ3e]??⨇=x~e+6 ;wAn7̼y$7/Ñ!Zk~Dޟ0w2!8,[Ȋx0@LT`s7LDq#6 p.-dDo/W)OFҴ>Viqii2^SW34a{AUN+"""""9ݸ-'La=/fu\0SSxԤ} >q-'?K򵨓+˷pgo';#΅|1re3ڷ#Ŝt.8 2wnRſj=GS*!d:;v:ߠzaD2!c{м( 3Wn<\,yp5J}kOEr&f%$"""""=בe9l49CvU4~h#Y1{/P 9^Vǚ__Y Z';ɇ.C7xnmۛ%qDSYWȿ&+ IDAT+j'抃vv|ijoD9s Ϊ:67 DDDDDDI*x9-T""""""`QQQQQQQQ`````````Q؞xezyL8KKnh2`w;| \ZDDDD;9r.(!OanZ'D4F cރ,*i6\̪}a\L1pҋ]yNظa6cdgE[wgP.(4㥒Na_Z1Zz|Yʙnq.ǸW cB7>%G"&ދ>q*&L_$L^e|?A捾5綿yg2h? j<*Y1'^7)ՄA=xRe(/Y&1lh8Xyw}J5i8_:V2FL tr>*ҊXtd5gI׉|~ QfOrθ^9þLRg7GI ->QS/#ɫ3ǘ7ldhtIsn˾?GT4q:S/v?j yDĚ ?n8!㭠Υ_}^.-\j2sM{1 L5p"I[=Qـ'57~-zus ya"$'я(Z6eNB_oB1t#7%} fӬjq`h"b$vx"#?,ADDDD qgiT98pyc@2%4*.`y.1fax. &qH'1цz|dK1KlM2K>ǵۭKyғWy|fETSŵ@a<ğ #Trw}o3v>Yo6̷^O=$y}SKv~ I!x%*:ff>Գn k~6b8&/#WiZD8c4gA5{PUDDDD#E|v_”u fь?]焑7 H;ƙ[y l KS (&ҹz\1BoGbu0ᐜQďeajբ&UN'fe,>wDF^ԔRPnXϱ# a?aKCH51LĞa$H\ܷ%G1q=ףF2!c{м( 3Wn<\,ypW#"Gg: 8&.NJQ>+g8o#ݫڗ&ō6zv9}fmDU;5+StU8Ogx` ;j%ݽjc/7v@w7IMOLgHzqss;Rq|BojoD9;NM(""""""O`QQQQQQQQ````GCNgԲ"""""-JX,"""""")"""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" zaƅ,N_ɝUfvT0)S;" BЇMKkf3=a4E׊1""""""9lvEC'ν17"Jޟx!aǹj=?wV!c>=y|4+ #`2O'xx1"""""" E݌V9ߌE^:͟%8'Mm3[=K(׃BջЧ {7$+P{ ^{DLj(?:=7hjZLl '/%-S8#"""""Xrh=o`&6pe矧xQ yHL#n'&A.rb")1 }X1Iعy);(j}7wEo\COpa珅Re)LN;J꭭&G.Sz>3ƥCW{'TvSds!SdReTۿe ޸F,KD1""""""91dI]zɏ G#”3,Sb;ȬҙQofxF&%yix*-(q:.$.iv˯&/^9^W4Uax8&$;eF.ӜoIr槷1`jjƫIo>o[=D/ҵNQͳ ޶rSQ`)R6Uk_Lb&^>99%SҝіS ;͜N&ݣ:ah7&PFFR yʮ&p<6\-۷]M-JE 4)Ⱦ67oqz&n;Υx7243݁,8`ĸUNp _^H~V5#ݣtj-aĤ՜HEkSԔuw>_e_g&7:_`` {u2ǘ@$pNFdTOį?+2”H %%h>Z}ANZ|(t̒ 0[Cjy1:oZ|g(Y _mŌq_6^R>-I䚅,<Ӊ|-x9_+,%_~L$w%CDnΗ1GogfWÇ3a1h}&$&.`j Z׃WRB93q%wrD8vTyiX$1'#wUz#ljuwVMe8NOcA3V ގY wF;ږ)}fT(;3i|1SPzׯͻ.v؞ѭ2M8d&HB & EADt]l] ];(A"b !H^fL9 $Qp9wN&se{A-&Aj~Hf!%iIݯ֓~|c7dSz:ف% ^y?o}լ/c=KN鎥7|a>?્߭nuM]>=-"""" ""n)3y3'1}PFU[&^^L/2`ڍ#)%o<V}o@ i3X]&ρ,r*ׇ` 0ׁ{D2zO/-6cop;w"& ;Q A>AÄjc{ާ38K^IEwH["""" "r,iݝSOxʿIڙcBDN O@ =9!o ƿMýk ?ˬOa3y!.\[DCpD5!@aAuò\᳅<Ԉtx <3 FԃlsQ_ XJ )Bpb"ZRAUb,Ulri]9_oo궐חX@-""""=],p0qyui β/QO;?3ŕdodlu*wynjy~>y t'jl3f/nC`;x\8a:[Ay@866ہWcKUrMۚS?7_o&g m/z1oWok`4&g }*ۀA,"""BX > YK^\5 2[u>)N%(.ĬCVtӵ>ˊp}/⎱0L0ۨ9|LQ27& 9ȶ9]µgf 0#o fa:~"tF+}uA9:fttn+WhMʥ3cÅ7KƬO th`ٻ͵CJ"9:DDDDZѣ `Gf'ݭ[6~^/UUՌ_` cP\v^kw1Rg7N0frZEDDD_\ǂA.`V+fT\^Qovm,"TE]1oUiAED^<}[G+slQA]h ϩ=?((ZDDDDDDEDDDDDDEDDDDDDEDDDDDD-KydVADDDDN@v{0$1_ُZEZU|#>-[~EDDDN`nw5[lb7ߪ "-ii*3H˗{ """",].ADDDDQXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDD5V@UCkawx""""rS i#Ty!ɢH`Ql0 dK!?.##ק@AVddթ""""rBPh ;`r"""","-׾$VzUQdΣ]0^ʝ?yTQY;7ù/զD~o*يvODDDDE%áRd^Z`U!_N-n\e?EDDX.""ǃEYR(ɉT_N/ܑjt'isz,CsG361sE cB$^ƣ {&c nvr[vqgxnlHDiE>kd.s1d3_1kk!"'qkG;QxYQZIÎ6)d]C^xvnkV}ǵt2gyZ=9=`Y\knͤBmL $%%E?˫اAiSbY:Baz aS]MZQ} SgWVrZZ܊BYF%yC2wnn^ RWY '6ʈ#X6(ЬJ(>0jAU FD3fC1//` 1b~}5Buİer4oq _r$""""H=!,tWky!t cĆEyL[Q k-3EN˛.Dz-B$-UA&^sb dp\5XUqaӵiz \jk- kΡ\S *IՑHX'tfU2~i 8C!NiƻS,),CJg<0 (R=9Kڃ杻nYXJ1L~v+bzLdޚk1(w4Щ%3cؤ@{foc72 X)6c;k1;m!TԲ|xxg*r,Ӑ~V-؁nud;suGXsZDDDEEd5fB~cQ}R/,-jmYӷzQW_X1yT,ӓm_ǝja`hh͕^bX^a˚vՍ;ݮ#s k 2(ħf&DZ% up ՌuT|Q y#gj/) j;""""],"K6+ψ&]uA~UɸɖAkl(A^\6mLws~vf̸ĀRPs;=Xۇ@ޱv&d)ߝF%6߫~r 浩 <~qk^hrkON.pď[$G::Jq0rF'Ӈ0 GS%^S""","Ǩ_ʘ}O6)QbXpq"%XU>7eIVq#xvD# 6xcc ~Z+ =k4s^oۼtclcǎcsQCVVR:[zQ^9o2nnN+bicf}s׹Xັp'ձ/V6_S"""rTFmx|;23غeQ_RUUБ9 ƎkJ}H:>ߪo4ƋO;ZȺ23de~Nx/c Ng0V跩WTyw]r],"rB_'W:lLiO J[j :8H*U0KDDDڧ+96ߡm!fxXuO-tg :""","'2> UNqff 8 uW7pB`1Evĸ#{V:h*n3q\kMŸ! {bܝH rj灈(q,!u3mo-╕V;3JeNȡσcNWt¸;>J?@1Ư̂=mUR砐c,U1 ݵ6N:!?2 IDAT̝y """ "RXgH\7}Ì͞lw &⭝Y%p>ԊUՅ L+_9m17tkvɑʕc-WֱH,؛;~ۆ텘f4>!h>5mz" Zv`:`Gv3~z|(%v:=Gxәܑ́u8/ %=۠{wv9osa-Oَn]hx*nvieBaz aS]MZQ})6 K3- `ixkCP”|J~cˣÌykzĒyC{py\Vķgwe0>]^*.I&}_[;[bix*۳-W%\KXp|n7$Ϭby"!-X[K+*ɏ?'2*N'_υ~..`VX)u{_eQV\ӚcLZٹ #Y6ȉ-{WTR:y ,);=$ýgpS,l*;}<ֆ͊5avN3{NDvWUpZ7zu`N%k|= WVA#X6(ЬJ(>0jVA~+Mlqعs `]WV_j^DDD(j橩{tC錇sV'rIw/jxvY%ITSAN.[c5XP( .U[j0fBoJc)Qʘm 1L2!̆Eٜ6rM ; 5|3sl i<<~1LN8XM\lj'PZݛ9 /;|P1-|D 򘶢z{[g :'[x$)Vg/uaE+ A<ǎ͌ Y 6 8w{`n_ߚGd2`q8ή?f߯,}8=vTp[^(k%fO 5*R&ss;'}- ;/xi5l߀vrSvӕpOOj.}5Vg~Pn Wq w "mYN І?yqϢNL Vޙ<c62 0yJ Z=&>A@#nVwBb!Y\ n@d:ݗ !fAA%.l_dfkF 6scvx Ȫ4 Fa]c~ j!TԲ|x'&Oq0yvf[ 13!N?ȬcxG0-%LZVq,U{8~OwҚ#t ATpa&9HPB} [k6+v\CcjYq#mYӷ6nC]E{_;&淵ɨ%n\\; e7{,J=~V+KX]kS<8yYsnجo፦-^%n 4A&>53! /9Uz79`9Jq0rF'Ӈ0-6dHH'7+O cB 8H tbs]hI-^^<:8K:]YsmoVAZ%ބxO3ҾwezkynCH.8/sZKM}%[qE91Cs[}O={Epy zu0eP QV mq_ܓBLZ avn;t ?E08w]UTm]>C ΟwV5E9 v0nْ^̴ПTv ǯ4zh3ؑ -J~?^jƯt`Da4v\^UC*fÇZs^(:wƄ <\XnTAnG֕d!Ѱ{'""_\ǂA.`V+fT\^Qovm,"rDsa@;!]7)/oc l)dw.*t"tpTT%jU@XDH񡀟 nݗZ>zcIV XU{A&T `cٲ,LZ>y}?s6s^ (0޼,qq6rǃ㠯{N2!y=..37䭔X!>Ƴ۸tO5>"!{5vaUz CAIbn,owz/ bJ Uul(fJZoJ\Nl>NڙyW*/ wp i1#27nram0fvSw58p?؉o/`ѯ:-,UPsvUrޭ\UJ7߫L~5/.ec狂*cV(1B]E][* {)%0-ۥa{|&Ӄ|A#W %V̮:֯.d`ZtPҳ xgz:(6 jV;6ؑ]y_$ZcSM\ 89 ]^*.Id `c”DƆUܽ'bë~,"SStm: `U ܐoJx!wW3gC;b52y*E]ܾ_YFQpz඼Pn=J5q^! >g|/Xk{VtpVJL /UZ1-|y*f.0i${jybf'Vq6ݧ}? 2!̆Eٜ6rM ;e/mxp@v+ +Yj ""","'Rfw0yJr+[IY5^p.$'`"IJS xs/"<^W"""," naI?Dj@OrXYu(狼쮣'CFqcj^8 K\WciD5Cx{(}M8tIs%5(!ma6|Z/19>lԷz}%[rEqe`(⹭G;QZ~F"F08ц'[wYAZe{*LBh3pJP(Vj.hK5]6uڞcL^"""4]^7~QnFͫ|Y>Enbم}8OMӝ=k g0nn_b€ws*:qXnLh^ +^/"T'<|y.WiyŬ !Uq>avND WͺK1Fh9o4\7m^: 1LM7 l5.Ɖ>Ӎ= vdfu棾Rߏ륪+,#!r&׬}%-=yfI""-$T!~f#FJjO,"|p UX`ZtQ}^(Qa9ڪͬAD+:bMB=qQӔ6vg6؛`V߿Hٍ)aGlAA\6EodΣ{3\N=99AuRc@Bfvcy۾?,ʴ"=j%;ZŸrx4-Z++5b5ѥ."pWs6J~.䕵a۪2A!:DDDDEy' `%oV9ZYܱ|L/4fX>S8C"m]~N/ 99B[2ʘ67Սw;=iS^+sьM \Qâa),(A~^^o`o';k¼[3Z]|ĥ)׷rZAjpe[x~:I ?|+݇H ."<%UH|N˻=YPK2̜Zz'_k"$Wţ sjm ѩQ=鵮Lb囟F;sr,}-ׯp?s0+qI,akON1B֠a;J"d>li^]59?+7ӭ?7ݜ@B놇U%5ոC@DDDԕKo:fQYG]I\uMʢOfXeDb=vqfܞϺؙmbuAZG1nbâ<^ޖ}BH3Mf1Oe/J%+=ٹl.Aebu<7jQ %:ED 7 CǼ Y,WDXD(f̀BaI>k{L8'&1}] h;{6iM hqǎ[*-*6"fwuZp=F&cl`+#{p38r6Q+?/qEgs@DD"/r,Đ)Q0Q(ghj-Z dy 18:OⅥe\]7QT-iE|^Ĭc9cab~QVOۿwn~]~\e9Lxp]E-Bq ]C,DrbfnW>f .avڇhDWTj ""rr򝅬1 g1$Fҏ/8SGbPLԔ}շ,aS{i1Oށo<ށ>vʋ\x:]ľ^暞2~Lz`F$GcGxo[ٯn2a a-V g|7xoX2ƜΩN]~`9LܸqF,m:90+Nv ΕEri/;X6<=:q16-gxGwvձ)NO!ZIu "75c]Zɨ( M 6۠g.oD϶ V(pď[$GHMx͵m p%dx zEH.0lW|8LKCb@DDPGwKX챜މA˘nvmatvH5OƔZKLq0Z]:I EN-z+8^|%H+z{*=M_DtɔmDg鈣ǟF0$ 8H=gCMD FO;"r)`jGUsrs!<~~\㵿ハϷϵM )6owC!eYYt5U\Th@DD8aX{\շނ//1ȣ'Ěd.QI 41 ײr#h5: Ifw.|Wfj^^u5N҇g4Ge1Ay{("`#F]EDDDD8M\,yw1(YHۓ*dΥEI$f{VXgO>_\: """"""c!|gw6/ jE\C,_r+Zo`vAl#BLyȬqRgZ[|]AP". | VֲR*|X?%:G@RDDDeec莅b|c02gbU' VD ,5dC'w{0{ ȫ`]N (*j 'BS'Q:M`8vh۽-=u.H{(.dϐ@0ODDDZuJ&Sk&*37ںbLb~#\ѾaCBq$t$ IDATψUUdn.]6#{gRncx;Xfjl?eCm|8w)?yܓA1 VUbmӉBlM'a=z`G}~KUU5W:X0B㚉Ic5u_h? #XDDD"4Ӫ_5u~]u, jb66=o~NKn`rkعM f"j ɠ~A`QC15~@`i *9jOjXg^HV OA9E8yq eА"""","-Od&֯.ZT?UWwS`ibHc"""ry=*,"GsbLQ>DDDD.KEPa@Y۹x@WDDD!9;IIB4N,"ADDDI%ElI8,6rIiI ,"2,.ADDD'G````` """",%$&""""ψ "-߸ TgD`o੧pw9%=X9AtNIᶻb੧ "-C׿ !""""rj````````QQi*/h\vBM9fQ-ﻮ0yerėo26E|e|:DDDDE nxe5_.Y'"""" "Rt=q;`tbwM tg`;vbN/3Υ JW቗`s oDkRLQ6W./ u"Ω$ndN 6a-ZϜYM)cql{zg]? wJkyed O.HV3 #S{eX'~EμOd0w>ȨX3,yYrӪDn}<]mP-xj!*Bh;rmLM5f3^kb%pDDDDE |9+|ch`OGK⏯qXjV3Yq<< ̶^eAl~#7cwüaa/^U'P6F.Ll'9#hS3ǿrxH7q5&*BƎePT-SBo;{fy2Aه/]^~O] Ϫ1y4V״cWs{ ?7m5yhГ쟈X1_6OuN/7RuN&9$&tϲ+H'QЖ˼뗷e$&vi%lHZ>Uie\wzw| Xeh؆Wpv?֊%=luxy#l;u&WqLi7gͿ_->;}ƎWG+)#߲"SΫgNǙ b?SXz÷+f ۵۵ϧȟoOAk:GEDDDEsLϼᓘ>(ʃn^|&{`AW0Ƒ7+>NWbbᴙ.[RGeADxO9Ubt@p0=`" J7eaQN˯.ƄM\D2/xXX~0}FD+aKciv{ބ,QWӺ;)3ƄN.zr:CL{ 6 {4YegZW.E ܉1GTT7,EiY>[C u\o7_sX0d;+8";]f<-)X4Mmoc+,}\[NA`pE屺DDDDEDZ ԖQ&r#8;uY6a'1b:Cl8N~.-]7;AҀvYm0aլEٍ1p(l5 'LoK3('"<f;v>R-n|]%l|IlPUf-ϗ L6FWc\v5_?6߶]ڿM`9lAl?A᮱]YY|̸Iv(W] Y9V|3?]˝{?$, 㑥maJ`qQ:~x!j:!SyCvu kO c3cƽ<97]̈́tK7Mϝ mm6;j8IN""oƾo%DuJKURJRJQ)ة]-"$ܬ7Hjy֯O_/Wd9s9sbXJжk3*dSYT9+>J7S,? hka#~^hز Ο;}999deeaÅV",ѿ. |q< Φ5 vﳺfsd8eqU2fJ=|?_pb FWn@=U\XĻ//+&2|қ~NADDDY/"74} }Sָ̎eey/ܺ fT;EaqrURYڵ5M8XDŽi3Yq1hv/'f42 ݑhQ(?Ģ(wy{ެcqJ$2k5˵{"ٮ{4&.>H qtSd;7T6Cj@~.Y1x'/WeL0yS*PX<l7BtşF 9cu#M="6jU#`[?AK㘴I#.ǽa4q_%l_e'Ѹ5*l~V_4snOMՄ$gں9\MD}?/=R_J0<[hF+f,g~9oF'n`<ש:9jzFy` k~1yiwPOM$a8n RyA澊#cɑrT@xf<'y;f0J^]7OLqOwMa5[nҔҭX2&I9:DDDDXD& Y 2n[cɏ ⢹f`2%rxPf͚  zz6EnYP|vXmv0 :lbys˽Pe[xC^aͫKnkќɰq gsXO-=0߃y A&)w%:2kJ ~}3uA͈t<&TY3 K:-=v$[ *tgJr_7}k#k+2K>gƁfGtAtфh1faX,7,WI%nXg߽. >rlc\?ӂ8ޚwQ<[Zi7|8lRw Β=P)-ts[ol5L4DFx6e&zՠY4N ҕ?=.4:Wb[ҽ7WGi{=ÜH#JI x9&#_bՅ, """$X"rat>p2HRDMh'c$i3}IIL:ehEfS<;B8oco Mnח%\J\łǸ@1x$Q6eEd:Zvb@~䍝qec3pL30{٣ HzB>My|h,njsɄ]o'ý;943@={Km&owADDDED 3,"tX^pJVwkb`?t݇S 0m6<Jڋ&WDDDW " ŪSޤx; z=m|4 jρXyd&#Ns 99:8DDDEqaBѠ {>' 8}[cXr,ӇAM+g}p=>ˮΚQm۽2ȡxoiƁ!uP?/7)5 d ai/αٌY|d7M&࣒زB_m_ç)$fMByXڽv@RzOCq2T-lGc5){/ضͳ85ܰ/zOnPzKSq߭OZ $ToD%s3Bs-'i'[nˡVyU{ũ0l/$^%?n&R.q/.ݶYCz\U3b8;e Y5K v|gW;̊J G"/J5fV1ʵ aLg:[r\="""? Rʄ)k\fDz lÿn3}u˸ f@|yw)w_ŁTځ&Nc´ F4g|×fT^(~bQ;uŇ=oVʱ8%CZӽQl=k$8f2ę>~x[\>M$קI1{`gZ^".ϊ;8Oٕ&bm(y׳ש?H͡Y{0y>Z>lhLk`Z /DœԂT{}3}bO-w"Z9#Ų9z5K]GLd9|YiKؗU{>]n4L4~(xm +`> .s˫<L_X:-dᡛPg_`/Տl-\zEƗFcDL>vcYɟqLˤSYQ^SFx/eh܁ k6|q?/\'&pxjBsnN3WQfKdlOWRi5;䥔VXr<[O(NlkySur.cղݷ9 8vb"ZN/g+Ҳ3LeRط[zM9g?68^:SꕦI-R̈aB6׼X9-z+6.I iTi^JΑǞyKWɱ׫P\VsH'34q Sٯ^ȹۖ9bf9baW+B"N8v6 $I [e8Ff )4{‘߱H9*vM ּ!54?-H9b@a [͚x2乀%"","#L.t@5"e,qw3A\4 LD\B xٲYSa#>z(m ݲ'~ F*V?[ŋϝ.3ƙi4N'JA16Hzrb20a"p//w09ԸԭR +??pQ”/ vU)xK0sXWpu2n@& DmYjÆo``q{4OiWC5.瀗^ kme@˴| s6Hg}I?>s.2Rfǂ.e&l5.&ӝ)U 2݀B*LW)dW|Ό7fGtt*?VM؎^z3Y;w3=f6y[=%b bujN^l]QvfR+NՈ8T M̚iyNԼmGTR+#`v3ɰf,X?+SnYbZ^Wpª+6}}qC"PpA1au-_;J .g[JL\^3^>ܩ'7Welϟ ""","3[Zi7|8lRw Β=P)-ts[odk|i3$mdMAiY~+{"]huŪ{o^`pXݱeHzo?xP ;iG']R.sxbV\|/?U:c~ c^d3H"6;'-mۗO.ڰ9DӈUJiK_&V^pBs񡪛 }Wf,GBphFvTz}8m)B==z]^}R9~ IDAT׊нvvܸՇSU+SEhjҦ2xܣRqKOL%0NƓV;#O """$X"rat>p2HRD$>Xy2x/)B9i^5GC-2?:u)~F~KhuL.4.hBT}.<5A50=p}~uu.$fW5γiV+(˾ax5{B)q~?/ /ϧ\4>:qٵkRƈ3u eEd:Zvb@~Mŗ&~Ѥ8U79FFYȶNTy#yLl~"yrDW|}]:k&L`X|}l.;&o:ӮUHc4j& ;ݪ8)B_p.hز Ο˝TќZSBH+ ?َAjPj᧘8/u6Omy=]c+C{9oc}1K03;=2i_A>4uJDD1?-]>SMLJzud  5 UkS :Qߜu0X͘3Xa,E:[%gzZ#MXD$OcC +Kéj0|;˒ קΔNe="IDDDEDimyjc8>+-w]G:1ןyh,/ڥݥ/""""_X (f}~I31rPZ1&FChnNdomϧZ]J&B̙oVE]Q^#sxnhqw9X 2$\>3eSC79Tj?E cw?fa`|خ*i\ضVs: RFJ )f¼e[>8f6ckk՗ nɾnuxuջe)OYcy-ׁc0$rܩ8=ޯWw쒯'> Ywkb6|1 (8H~X RB>n+ R[ ?C{6%Nd*[.ev,HR^Bgס=iɦEX{ݝ]{R{]5V$F,QF ʆ[ذq]v!,v k3_fEGRhm eK巻S5-J;t{br(Pw=l\ڴUkֳ=" PVY8}~cI="r}Ҟ^~/ـ ny(=f4}aɎL_L 9<ف}iXFŇ5ݳ85ܰ/o+TJKr8\BӍT0U{ H<_`aDN!4 iH9 O=uX>j'.[p*; _A9P:5H:|60t[jWJY SO5Ƶ0fMņ^&} ?NFѻ0iRޥw!$3͖h//JjcİvhFEU9hЀsOq*ywY3  WDl^d +e"v6;t2|T/1 2wnOT'H5I,c[f6Ɉe˿0pݛTXG=2pHxӈ ?弞ax{pދ<+ts6880S:-56~Cr[XPwΙ%әiXړ?Ŀa C{`0 qvI֥- JN$[~ZڼzgYĬVf@/r&&-aAF:;- ųXN>oa}ϛۮ߃ij~c#gJ*<u1jwƿن'ӏj^hk-y ]̊n@sfSZa;zUZ˪u-C{F5pa8@ġ) r)j;}%|PZ'X7K`DČi̊ l*MB]6H[gw#W7zcڟX>{4|o[sg*\_5O^-t>:Jmux{Byv ~0\`DZQ$~.܁տ xwDC- 05lq!fCq?9@-,_@.[⵻eZ9\MD-̥+7c ZjzrK)Nb;Ԫ.Ō֏/1hyJ`u+ɌE+?Lkr+O^fzM_AFzm~" \v5AF {JEڥE~\;|wP' 52Kny]juპM]8- > zz6EnYPwLa<#{LvclOC=݀h"rCFūdP/[z3lj{-}z2/"7d6 g'1 z>+Vw7$dٵ6S؊#'/2wL3:y3q"f9tFQ23ɼǤg3~h3Ϭ1Eδ˂uS. VMe=6E9d#n~ kgxrv_;sgDnfŷc݃u<æ' ŒA=q`"a".,%- z炈(ȝUJ逯gdGeYZv̶3XmO7ޤs{{ŚBpu8z3,G2 ^wF{ůG?oc[|u/#)%<{s,4hoO$ClۊŻ,-3թj8B5i{>e=QymiʵөJ\'(Q/,ÿՋ﷡9 yD\rޔ.DY_(l1ќr !XII͚-ϐqDE巐xoXٜuc(z$ Ino2ӈ>r=f[px6233]|D\˂SAO\`SHx_Pnoup!e}|&ryK3ρ"9#kCMAiY~+{OZ/2n`MR׏ #~LFbi;OSe!v'W^?g .pt*]>Uqhޝa.#_.hpZŔ_uv.ϽEj1`TY V+OQطb7 ,yѱe<“/Cr9tϓ[p}O;rX?h]AhĨ;PɜIt;SL͑-iږVH,D3Wv PMz܄^e4°"I\\-3/"ֆ 'pݜbF _g zctq\s$  5hQȎ%;8zcsW=9ү:bHsZê8f`D2<}X*VCn_ɳ>g;̉52 x"ԭq;ݙ=l^c{Qi|SqŁx}p(}da+(3)Zc._'ەTy5/OD𩣜7gXҀƯqi[r!~Fz']_)2I8-Qm_/R;=ct}i`b6A,\:-K&=84eGDvz$D3%~}xi3^l-*v/rؙ"Y8v2tmxH$`Hc~SwWAF)uLS\YvUiƅ 3;TA&7'OksG_1q8lB;Ǟ/g0̽W_-:|݇-|(k:c+Q׭jD%_/␑uK7~5l-9y1jP[%.ߣT3\6uUbX9g{明X[#ާԣX%/[9Ǘ}3lrp*ChNNYYYX)p!Eȟl 5_(@Ԉ)2J """"X?-]>ßW91) s%5 ̔Z0_sI!"""hHޏ""""AQyT5sFg5,"ظ:-%DDDDEJ5fV1ʵ aL'9_jà3۸Ƭ )6+k {WƭA-*#yXzaxw3PaOF';g3f!@S Z0&tǺl-9\κvS ?9oPkW׾Y`HjL<3a;:k,/em_rO{bF kɸ7N/T>CzT'#K4j)GM97ӝ5g&7E \n:a eS sxy.~1Jc> |q< ֤""""@.ٗ'23 |#bq3~]Fu]q2^WLe!^A"9u`RJXK岔!aGI.PwGEx6ܩ->y{*7Q~NO/l?f?#b6.+Qտ ّf8E1oLNͺ9&}6ݫzcݵU["^Ib[#4w*Vox\Œo19Db(]ñ\k7*VDDDXDng1S-fM<@$O7)c>>3WY&7Fu3qojdϙljUFe]d*cz[&Z9\MD}?/=R_Jհm"BmQrdL(hϮ*e)CÎ X tMңuoBRv~Š̀Az4# w{X:-uZr26vE 7e2"X1c9yl}?<}uu"""","TvΛil_>~/6S MΏ \k3?oYˌ#DE1#Wo+Έ$H$ot,MqdWAAOư-+7Y/mf̓|=VqrbڵNBIz4k_~sppőL9gƁfG-dw .V.9#`ώm!, j?M ^v~[$%ű[B0XRBR>fV$4C3t(3|@:O9LCKA2MIlV :{rr;'M,y6wn"W 5lO0Κ<+] {5ζH9aN\?׈J1U1/Ʒ7p~[lxA@P6k!DDDDD~zEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDD N9Gwptw9|GG_DDDDDDQR4l$OL2S7_DDDDDD^5Ae0~L:LDOcj.d9SnO3\>gmDl*YŨص#ږ!Ody'ֲ):KN;9p=ĜIf(M4QD#xfn7'퇟ؓ@}Zm  %7b_yZ+U N:EDDDDD~ lѻױJ6i>Exb"-k>a0uDG}sNa9_,P`>?\?8(F0[%G?dD2b9c|ZλɛI ;2FR_?)Õss6c$9ٸx+%~渉#lNO-;W7Ji#GX7E jts' ;*1ũ~|1.}gc_ QEd.2S`hR( u`[mMiWM IY< gc20 2~(J6G<`=EDDDDD1 xw*\rN@V s1fw{ـɖc4z{S;yvcs9Uuq 1?nf) dg|2pÂ-dqw>!ꊣvVF2e fYA92Ggl*Le1%|?,n1N,xqr?[L7yo"9ZȤ-T.%`T4z\I++ dfGM=|#GY|h!mGQ9E~""""""xa*N. )|B:.TiT̳l )VOG?{CIDAT x/g\bMfnv:["vgS|e c&mϡ3Yp2 nSW.1ri-xzX0.""""""r㲣憝nngZyҗ|j*o/2_]O:u;Ԑ [nε0:ݺ.p.,:հθ |:0A'4߬<&/¤A ߥn._i̛6iKiӃSx S``a68.7ݝ ?7CVVVk ;\ieG42Å'sI="""""X ^IHT\qpp*NLJzud c</|i5?zEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDX3^,5Ϲ:vxW\ۧb|PgZ.O]YYֲB S = RF DUOd{(""ȭZ;^vy,]afxS>Jcږ 01b~oL6EO>͚Xin~lY'lĬo%2F]l]"lL ϒOҾ@{IG%+&(,>afeDIi#Әr Y}S ׷Y8Jg1*vLjepRvopr_y+UyM"{7z4s.Ӱ[=s<ɉm2w!6<98zg_d=&XIb1gҿY<SǎrgdM%Ջu;ZT0ŝr<ơDRmx#Poަ&# dpU+OQ5,;{K8Zħ_r:Ջ*/:{3s%ݲTN˘3d5~vR^f).Mh_K!-k>a0uDG}sNa9_,P`>?\?̗C7voD:8Fp׬H10,f˄waU ǿ岃(in3hXϘSZdf=j{jMjh.fan " gpml\f/}=9?7o~|DŽiDv(E[8t chl… LsG/ OXipx)N/U$gU:X\گ7] O8`ݖ/&u1d..z #g5082KkEPN/{nBg /[G{iv~qQƖӧ]wbK6EIБ&4?-vpg>,[_O .PXXu{umHbgkJ$w|MbCiaKtp$&ԝ<̃Ґ _w >|0\u&.4z1 -%sw`Sv 0Q!^qٍP23/btCb(k᝝[H?DNJՈoyEv~{EDDnip&If hř=0OS1l 7isvyYkF1'؃ќGQ"9A#*=1!.+{ &.ntwE?zp<cd:Lʨ)^H;j i|C'3yeFs ?2v5iS˄iI$/a@]51pp@z>H͸/UP ! lD%%l60%I$M3WO;m-I'yaX5<ծ?u GK,xa1,xzZh݊,džm|8o3gnx d-ɗRo9ks!V+V66Ȧ2% ꆙ17`|vC(?(oA&`TRû ͻlJ{w$lɭYiP_JG%:?'&󏕓dі^cpyg{cI̎a=ϰ {4ÑK/ϸ/0YSw|8}^><)5ec6Giԡȡ䏟Ɋ Xo./X_!""X [mtЇڳ q4=s%,ϰY>O}X {X|/;ҥi/58z}pee8 ŃoHiq>t9ߦt÷6 [tgBV|_}4ߥs3vu+A:4wpN`>$IZuCg1 exԿN3LK&nZ:MMgd*DDDsO/='5r!<5}:-r2HW/sI V{cDzڧ=oy?562g#Q1<>ӀϯI5%,n}OO...89IyufZT\^h"r3"JXDDDD`'5 Dp{ >zG#"""""","""""",""""""R`2f͞e5,""""""UB """"""RC_`!FïT,"""""","""""" """""""1;ՂT{.EEvZVDDDDD~"9.UP;~-""""""UBUo@V1ٳ9jIvI ˓ՊT T$66THuz/ɆIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/security/image10.png000066400000000000000000004665511461403617600240350ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwtlM)@ wI .+SJQTT+RTPzUt !Ғ@Νvgvg;'8pt"""""""R9N~GkX rEDDDDDrv3ga &99;wۭRl6a ѧOohXYbbs`jHDDDDDr=x_]nngN/fzz*VȾ}{EDDDDDpnw}7}>kS3qDL{o3'-ywL:'`7f͞M& zU\,^ǃ‘RHx }f 5͌?}{3{|,?՜eW맳@09C>>dgf"oNbܸO{Ǻ<ѓٳg0{ |eRڀ`_K@P*BDDDDԾ}OL!j~Vk/Uf__23f8""""R.TYSl_:}{l"vx7hܨY~=/8N }`3룳K 1 frj밈jQdgeOttT=zw0;3p;ݸ-&YG[2 -V\?!ZDDDDᷞ^.Ѕe2L:\M:~n{Wƺ{?~B[ ڢ,rY F1,SDDDDStk6-L88:ߠ `Z?~BޣCrγ!_"a*eY!XDDDDA;벛fKGx \ꉹ,SDDD2qAu>fI_~SY,Rw ZEDDDbŊEJIIbŊž ?<\ӭ){׮%,QG)Gͷ Fu'"""RL& }Ųebۇ ?-SCe F0͆OƧJW;z9Bl^D9\#όMxXo)ҏƱjf~?_(n~[ NӗP$h}>kTǟ̡txuI`Wt9n/7hRp![""""f60_.`On]ރhTɝOoFImK -[ 7MbJ}|{ f`m4N@G39\ யP7>xn2Q958wCCOޤ7w;~j2u{$`Y >Ok;RL6ezNdߛIoW+ʚY"\-T2Q&+cx] Y11Qg`ݯq<ؔ[Ճ`ف|);uk 'X{͠LW͛P;v1 b. 9}\ѴI{W4mڵm_z pɗNϾ3ɳ{ a֥=mx_ŻukbD۾:z]1g^^#׵X9 n-xw{拕evorSL4̵vڵCrZۯOyXoQT/""""|vUNMŹ+FN,A|w&;nv3%AK@㛽1Ь뾼05T wSs搞i6fWCիnRr@sH&oH`:ȣoE`|>?5Wöji|~pZiZ#6Z&&P+2hRܹ*c>IR}w5/Mpde} """"\:E^9gpiam2]- S>ҽ{X7ʃa+[޼姴e0w"6=q̵X cdo {=Ȁ2{Hu@vRWfDԟã|x/ X"""""ѣGe  +m)=*L)YwOSq<:7e%'$2ompEDDDDJU*]yί %=idy{&31kPPWEpAZv/~5iGVQNU3=)?e29*{!@ŕ. """"rZeI&R3|XWDDDD.!JfE5&R3\!XWDDDDJSX̪1 >'{~EDDD`jQb| =a~}}}0uHMnfP{򾂯lZD.v__,s??z_DDDD`/A)KPv_U\VNi2łdfcjgK͆ӑvxU7""""rPՊ``E.D%'$ZZeAXDDDDDDEDDDDDDEDDDDDDJ~s׃W#\la```20̘jTBz=nN(^x\\0Z̘ P)K~\nN<źc>""""rSཐAtvzX͘-kEMmZuq:~s~EDDDd`pQzp:q: r&nGvVPK9_߻َl\n``9t^K&8<STSyXh(,{ࡋ۵fxR.:Ooj׮MjUX,lζNNJj*w/>ő,""""Rmv E0llv{7v]߽;i,Y 0hӪA̘9K|o]Z,6$7oތ}S"5[S߳U&^WUjveʡЬys^/˖--'XEџp.SG^| 0I_~U*.'Cqq޴fcw4WOn}]\l9F?3> I6տF6ykǬ[*tOtJD7F-qj]?Hh^%@Iع#g^s:uC\4Kvrli;=/F֢kwVZ-[5jcǎ-țRDFdN;Rt7o`u4_8`re1f-WD  N ׭'191+(߀n bP:xk#w4=K$ [rP % >L걗#//o6dz99[)7 iO"v<Ћ{0g߇:Zv0Sf;qC4&Ff|Iߪ.bl5hznL” G༧c&VUa{)YڶkϞ=10vPa_n*o ( ۴nscϧ~=wsN3Ы׍L&zs}w}#'Mҭ0b<^sM Z/I qmO oDeZj[`*Ŷ*4U.oʞk\~Δ[5}[_  x~%BoE2Y5 %V6GhJs{zl b^:ӶZNt||k ݵ\]+lnf%y{Thәu+S ßX lօT#Ǫ?BO`@J 2LA[os$%'BZj{st ]1qWN8rI" /@~n9ٵ{wݾ];]ϏV[1"Y9]wi1a"_LXiݺ 6n ]smS;MhݺM>#Cw`_;9]cB#w,<ݧךX1 Y).o݋p4,gfUPeϵ^ x/8w*GRLԬQax7rԀ̲QTgw|0{bIkP &^GX3B\_(A6o 6B:LY`KTmٖZzt[ظdKS$xWm*:ob0BiP-cy(W.'dfgʎ;Xv f-[ҪuZ9A3>~DRrRܗ`ct؉ӧ1I(`iv8-HE9 2=^=ŪU]O}{7*me{?'wfʔŤfa񦓚x<:M h@2>VbMƜqr1nJ]w-nͮpjש[vl8t2ی~F5_ώtlb3Y3 *#-FU^tIZ;19z;Z"zwFI̋9yl?lݹCHr""""'JJNbԨxGͲK1xP70fhz^#̞}X2.g4OK\ݝ8V  L{K|V}/g:@A9,Aqlއ# 2Q4̮ ra%o-A, 7e~W5oF zj._Z5F* ۤWyJЖtkjagld MM iu442Db ] \~6?hZV +О&kv:i_NkכM{#jQ/9LQثZoZ~Ϥ1D\DDDDp0Oٴi-[n;fѲe+6mĸ>-p-ޫ*z۷ϛֱ}{7G$B Rg]{o|5̘1lڵm ={\z~mW0zC?˖-aD8| 4dk!O8u/owǞ&Wҳe9Kfxt4(_|F`Gcٹ{I_URG{:07 sN W~o?x/^ਈP }{v8W_8x~ʩ )[zżs] :t5~dïsoZ2m]ҭ/\)g&?=gDԤnPvQAtZnJ#-v'Gy?2]g:tF{73k"zr3V=ݬܿTkۈ>tbβMDDD46;DFFv;w.fcXxm[h1w/]۫ILLb޼y\ߣ;vpp7. XF=NݻvV)سSSyG. ؾ];lVkpSԮ]ժq{Xq, 4$z˖-yg(ĒK؞0ժѡm;RRxXbJ(Sx"jYQUHRN]zao{nxٲ|Ԯ]~D3L||ѹuЁm۰kn~q:9'qMZ*-aނ1H VTXQ@D޽]65k`{L b1mtRRRT%(ϕwN1qAUH ӲU+ٰai7l?VXeڬVrX5x 0[,\0idU^)^ZAI=^!"""RX~`{`|&&ä[DTJvv*2wx)ߍ^LVUB1 .i2a!""""rzج6 CMXNaXYmJK9^-f`9s6c`(%}b\u0a1~L6n ]lWqѾDDDDDB5 V f/m`)gbbX==nhb٦_ݸn7j訉:+I6kԔ&ELDDDDD Ja pg}؟q)F4 e>>[?ѾO?"% /8|i4p4-n7 bNc5yNV_k[x?q!>+sH0iϳ?NS,ޣXe/Az F4:~y3%˛e^,ƵL)233IMM\ṙRѯr؝D LmXا :Pn}S~^ 2ٻa1_$|mOxw7&.Ӊ+]oy&"""""rWqϻqF6mUd^?f`jv5?"#^~5eM9g 5/ wC ҜyOF=mnFzF>Lל4BW|5ʝW Ĩwd\yoe4oHyT "$$.]v|ϷvZtBrxTTґu38glQ 6}=|p7 u"z=s~"Ha *WJ !e:#Ь~=ȪЙz6\>^VcɪCb?ׯCؼ0m &I])?ܹ3ݺu~iӦ ݺu\ro"/=G^f4J.SX7rZj֍ q|+S44&߿YޓxQ[0MQ1H 51$7rʝg̘UW]uڲ={̛+xL佊V]R9lޘ.y{xfלa-fAvy9_[udL&ONJ9`9N \d\s:puO?ѦM,]^zQlYB*=ggpB-6el~ 51H7_e}:_OksʲQl"+RWeҳgOϟ7mS<`6u,ӦZ&--vcDo<m>IYoɻ9~"G;G<ĝs]ysBXPkeB yݡôiӧO޴ * L277na2SbLJTm5ly yo[ }g,ç,%&?pA։ul{i=vXYU s>rŒI, fGINnR*::yNxx8S-h,Mz^Mť51Gѯ5=Y[ &UgH){`hқ|r_[a/+ԇxyEsKNIFCyCUbDht ʕF7޷5%θWS) ɕᶜ.Mj!ai>~FU!/![p[o3ce!|vej3AerK`duE,=zxn/w fՊ))yyZRik)`QQQQQQQQ````` r7`ҕ: """"""D6-/ cݺu.ۤIӾ.""""""rY-^0[GDDDDDDJN=Oivq\O """"""rﱿ-3fłl.%ku89ҘI3;YgH L2UPl6fr8Hc\XtO0bOV"v1BFThOS&T_QHU; _OwG\A]joY(Xh͌]t*SUgH > wTCEmz_Of'tEDDDDDrpt&L>9)ґ*}TG*^EW"""""r +͏ }`%$U lug5qNW+wPHTb@OM=S蘉p!Ļ::(((((K{~}'n?}sN~-?waѷ\-""""r ^5 ;7]fam 꼲Q 刴1\f`ơ]GM)[L|w4^͊3{$PJY;Lfe^|NB-B0`ONOn<ߪX~~I\9}|.&"""\8b'z%MWejpm|u[bt^LǠUd/~W&Qx+g^t/vtB\ES6y%]rڅCMB(W7,W`BRXw+O7X=b61"~ܛݳ/McBH&tyhYã-v)oDz/w2k"O㧵;؟ŧ\5[v{RՖRm |K߶!욁8%Q.Ny97e'kꧼ8Nzk zpSInM)[z ;?v 9Yۡ}-]΁ƋW3CBfcK'W`s? /Iո$7B3 /O"@ E@_L@n묗GYr G?/Mc 0Zոmg +h 6p}r[D  KVmmpm㭿լqݻqªDbAPh۳O`}ŗPkI1?lCZg#g,K9!w2剷!._(*H9|Σ|6욓­ߡLI`! oV1ϫN<`_ߖMcOdSYuN7t-u ֿ U{wEcuߐ}˦3{K7-cجA ϶=#zJ~0cџ7u<7 0Xz?;ͻr'лYsp]*{w]|idB~^W28j󅁴 1a]{pŨsBZavD{k8\_v=Fo7ecѨ |91'0MA$xړYw;O7:bk|2~ns.Fr,E53+~dK%xF9m#@6Drkʧ9n)&DDDdЯ|S529HGd5'"|^Yj;3C4u0<:>ӵ ~7Hzhʉ?-ocuTFyZ?~{ p~Չ׾)2Q fg<LYcP6 +I~٤Eɣ|43W뭮CɍQ/qo%3lY}?lO6UAy7ޚ3f(>4I[>r\AMo/^_xf gԔQ|t?)إn|>eơ+Ng!xFVw~G篵t<`gڅג[ j.b7ofˮzO~e'ƴ^ǟx*lo\L*qgǂq3uK<,ƴb}_d30 7snUHM;i~33o=v@T~E0gS>gŚ#K5b'^gQ"}ƛ˓b4>q?⛷{l}t)pifQMnバ28{Ԭ 7VlܹO&! REFQ2R둿z~-sS!,۞3X^76% O9ß7w D5 acv˫o0t09}Gٴ-eeFh3^#r,=ic o~7MW! zp#Kҫ:vkӹG-\WozZndpߐ`ȩ8m.*&]Spnt%ZgjTp0s&߽Q+9ݣw1uY A.հF.85ff]فN!&QW~h;bR/!&R-fC$+٧_͌50 G1g&Ưm:ey5X6=i3zξu;N~a6f+ݨj3u^չ#GUlbGqYoOfͲmӪ ouMlX=PDN_¦}8+7۴ȅ.$.=.21mf&퐝~|}B2|iM? ˔|.C;ʫY!7}Sg;0 RHOłoX-, ٙ4/Zpo6ƹmt&`Kҩs:'>Zvsrg=|p.;)-T#a& = Mi d83AW.pĀ(osI%t3$$ >gw?^ˑ+߇Ƿs9w':-Tmғ?^K^?A稏F0W7?Ƙd32TmЏWǟqI-_a1qZm\ǘH\hW<ogBŜ瀔Cpyʺj" IDAT+t/rzުq~5y7||&۔~h:gޒÑ(NBރur'Li՚l&$p1INΨ\ qҷ=)>ߜ}8u4> 弃|pEp #GŧheZYV@ܮY|ޗ|u BDDD( n`{{;He,H1ԲOtkʺBE<-CϦT+61Vo]5,dίfyNfzLݿj&r,taG&pJER;mba2ܳR kݡČXeԟ=@<[0OB ,DxAeY=UPƄ\?A Ь\%%){9N`Ɵ@_f{! [ [ܳj^z߽c_NF.QX8o/yR;O%0ÖYA|sIȽyvaQxnf"]|'5o^{c ǰŽ, ? Zy0LџWGJ XRP 佇No"/v(ߵXۙ={mKjxoNfÅBmrJ|ñyg`њ<R"x88rJ{FgݷNx<C HȠYeMS]zmcZB9{W`7h|>ǗnH|8hԥUf7vP#Ak0|6mC 0f|y9Lb*N# ZR?iPk cKyhn KӇioǠP];|0>/,!WPU%BHRKTg܇M?>>l;c+V_mDJn+_ ku11S[^8Ei@y<u0?8*x]ю%,秿hvN~:Wg.䋼^چt'>8>/^yRM,Ek BaU|tM5Wo7KPô2w:|jw^G }Ez6; c˽pay]<~RCj џϛjD֓/O6OѻKWKFDDDHbk޼49r;o[REZZqq\q'gJR 2,} ϙ ɐN{F,=n0jgu&At=!3P$Lq(_%WD4iW]'ċ`N<~9?|^ּS?ǽE X,?^.@*:c72&wRD2KߺOa.>ڶ ZQ2&%D툯6 *uF۶m5?bŊTZ-" Y{d-Vywyǔ03sn" 4̀k:Իz{ި F珫oQ1̺'2Kos+oPoz8/+:5]=T=K`C~_M0"t5. rg߱3=Î 1Y)w-""""" "9OhRHYEDDDDDDXDDDDDDDeu(߀v~:ٌLDDDDD,; a7 ņ3I-z^^w!""""" 1  yѷP=DDDDDDqY&m a` =KRKdaaIQ4r ~m6+-,&,lEZff|[{V+-}|8ߜު`,&,)oNoemIZjf6 Fn/Cc91DDDDDD(̐f)_oZ8Zf@ ]DDDDDDn_npjfeg|/dZX,%""""""Y'_]!З+"""""5Cpf?+ߥ͢¦HVWb ]AXDDDDDDEDDDDDDEDDDDDDEDDDDDD> i,""""""Ya|4+DDDDDD$ߋs=it:IKKK$ lVV+6 ՚m{oKt:III!"o›kRikG';NNH#P'8D%z:,aX,<ȸsc_nH~=MpRl^)O=o׍?\#ǿÇM 1Q'\+/}!=KOi[r^"`ҷvc JVIקy2NWOE;ǻ灋xq EMbEP.Eqo}:>{4v^begŊX\bG8Alv{= xf j3UNO?*2/⬥OO@~c氳Nj*Ոno(zcblj7] Dr![{"{㸥ߪvdß\˦c00}" 4`a1K/&xU䑐,#|:|&nX+`5R.| t')\K{o 4u)qd. Q=Gسa+GiA,ʫ6qΰᗯR"8{ϑCSҰbd8=PpqΆy:ye?(BZ^}Nla?3E`^ 8GliIj׽<)Ѣ>gLp >q[W+aڱ;0ÖilHÆO}>MElg1, 3YElgX}6#5`uٝA>eI8l|׋PЄ?>zͨW~ؓ_\u9W&T˂$?L4$„G^c'~Ljw4B"""w۴` .-+^|O0HSApQ8r+p\.> ks2,%wjkwm5S98m]iߡ*7Q>iv:!@>pTb#&>=̜s{ NM7y}Y8󧮠[ g5HU'v:Hi5,edS^us^R]|֍[R(`F}cv4I׽HfόEQ-#V0||_o`_GoB#[<{eG0xeeFfǘ8'w 7mO`jN\8Xw1LivB*ՠPI{puR֤e ,IÏR'/CPէagٸ?G~hXn|? ,B(Ul Xv,ޫ@u5nzn#EJ?@W[U4֠iLYA9 maU:QgQ}v*/ҺاVctR %f8}TNW%~q.AQ/h V`&Ks akm? (sSxzܽ<:{.A4|.7:3rzgl-,?SVQyQ*Xb8$rzN_ KJї"cy-I_0?lM冶8=5`K~&54=tG%`?O빤^ӹ s3k3'-tTvoc| ?vl 9[Ji5xfƷCGtٙ#HH9ܗPT8 >>_m92$J3UhXS{8SsxQO߂Z8w: UněW'8?NRa""""2xOxso)+mM~4|-P>`]\Gk&/ #\-eKb\8nbz߽)ҡ/s]ڼ_~ѽ36߷ʏ? (J YdUO[uf?1P~] LZ7Q'ţ'2Z_yCcWXmXO`7U~,/|9 xMJjL;a0 >tZQ1b-ҧeW,'X7cJ(#cz\y̗3W=㸿 ~˪,MV8~qը'S^(U|$K#>_fë7ia(`.Y/Yj́EUR劉aM]x%ybxwOej OL$ywN 2YƘ3,W^ ̉J`^-W4#tzθЍ۟<ۖzO`Tr]=DWo #Nӫ')f]/=NJ 'Qd=<G++s^杗Nx4~:o?9s)P=ߥGw6a>9,P^= Փz'ҭEkdLx-j~彲m?Őѻ?IF%;vS&+ާi#âSqT{U2 6>y;=ϨVYDDD͛77S&G`=|.4i7_9ƴQ@W$LIrV;'}'9~~LČ"G6ά-&it~=| ?/O՗\f㜉!.͆_Piݙ[{Qq_Gwv4xZ Z_k _]ײ I-yxffr &>e?ϫ p,V_DDDDLW?LtݔYZ `ٰXn~lժ2~.Rܞlܥ1zә\8^3&bQ@maL:=;p3>L .""""7Erٵsu=JUtKDDDDD$i ~Cʖ+Ma{1*\:dV_^q,"""""" UݨDDDDDDT Qtv6,˞ܹ HRPYY;T D)R.""""" -/SCcVEDDDDDDXDDDDDDDXDDDDDD$'ٚ&i%DDDDDDllv.,JEDDDDD.02ru_3#[HWK\vs[6M\NE""""""ف˙Oatd˥oKDDDDD$[MA((d#6@DDDDDn%Sa """""__>^4M[/‰SJ^?yr2B[훷/aaBBփGb߼E=Q t[JH@I96ly qVjU/p:- . ta3_>hӸ\.+IJvU*_u\¯gX """"""" """"""" """"""" """"""Y5|%oD7='y`kJ^i/&6\~Wyծ<Ŧy{M^""""B g_>Ə 7 FШ-ϸ< 2nT"Y&\lǣ%tdsϴitG/0O?bXgF)8FnHU^gk.YPV\\ 0Hudzx-`Y)wmͿc nƯUhuU{u˘~-^dB0L8ɟ,0xଐ0j9/C9%D^>7rU\rX8RuR}odLux{|zMr9o({!|,˶36r^Î?_E;9lZ'-ׂdSfj klGH;6Gcm8~@8˄b; Ѯ& e!1 ,{b=F-cAwŠO_ A01}hmc$߳q,ˡ`/,g#}v2 ~9mÌV{dc}0#8ol-W󺷣pF;&T?1 샽W0>o&ĬMhЮqgѲ2w܏l,#{yvϜͺ8ו/,tِrql4)55AϤߎ"Sc _}-ǔ'05 3z>x,9,_Nޢ{AU^9iU:0h4#R͋y^""""?W> @ sJdShR ”Ph^b5AZ`ogCLNxYq=:4(~IK4g>) 07on:Mvطwϭ?BrJll,VD+""""r0M4INI?d}q_}Áaƿ]hfKݎr}Ll ?jj?)\(((($` À<ݿ0ɓ*ʭ'Osܿ}S.}t'"""""riC,_L [aV*մe,"""""$Z,Η/K OC"j^Pi/1)SJy#8iLIͤr_˹TEѪ'ؕg<_rӧ̬çbER54̥"""""%pk^hor !ϖ|$B`i]̧Eיu|Ow0l&M@/yw3I|ȃCǸae5EjeaG߲bOF89^yn3?%qc0yiH&J`Ժ~ɛ34f7]p|`8$oO]ދV0﫞T7S7z Nة̚d}{݆oh9rcfh{ϧi|ב(^.|(TgEcW+YWGԢ~yC \83ehѾӯm"~5&~oBEpqlK=X*~L:q5Msla.KAlVORlZMpB^+OlYVOЪ`ǻZGÚx֤6 OBR#4œiH#틿#8LTzc8Kk@^G""""" 'sOV੯'2Z_^gK_nZBs^4d?(w "R'Y?r ?T0H%O 6lωgR9a&~\w0Zr᛾}.? 6M&^m>s(ri>w3 1QZ_sOܾRC,8'7r2TmԔ\|DDDDDDolؙbi=F8.=%L@<~̗quhT2ϣq==c,>W2n(=y,ƛ3Gϙ4g&Ky6\<92 &G Ҍ#ֳr+Lnԛ =*XDDDDDb"|2+&0HBޅr|8/l ?IK2-,'Ϲ2~:~|2OǑ$6o>\s ͼv%y^hz/j4NDs4B(ѽ/:\T`rInMܹ#5.D@Bk5^k5a"z!pR/7c7p%2 i|7>u-Q'Tgp<l$>+Q Z8e'g H [gK 2*9006K;u<˒Nxvlӓw 7:R IDDDDD>yfawsWrHKK#..6{3#[{0L0ͫTWL)̮6 cVs…`)]\:K2,""""""هzEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDD-^4-{1 CJ- **ȭ|WYo胉i chvr.ե=BDDK{tTDDDn Ã!!_. >}>q4Y{$eT_2XL͓̩'TSXo]|aGq\L> `8- D""ro /#""DEFf2Ök(R$VU6M1Nw6 _o6* jOg0ty4<Ԣ0#XYOtju0S:2nq6.hY#8/BA|\ӟ!v4ɇR7Hv{#V[HU'K<6eFN'IC]ӵ*9M0`1L\c1&9Sٞ<0xq]#~eվDDJ̣Qە{ - L,7%qyx,x`U08s0b)'J3?0qw'`r`w$w$3ğ1-rP3鿝CS>CRd3l:3/@ZH:>{QsY@0(-^~Wp60g~rX[^ْ{mHqa3̟g*`;7P.1qS30ůk}h~:VOHK%29Qď~\& ):mo=!!DAB'wkB R  -%)IHB\GpMh+oy9{<3pΤ(҉:Z{yyc.Rh:ǃN*ggk'yU8'/aJ0UBhdX!))t{zWj|G8g4u&\ơ'Ҙ~4ëf}*Tػ돱D!O{(^[OAa|dB`!;nv c@Pՙ4x܍*N*Ƿ q`WmoBP9\@7mY ]TRBE'1_&"Dr9TŚh~3gآJ%&%Bp+ܙWfS)}>Obsgylv͛QeϹ%5Og4e`{9s֒sj)rRH޼}qBR`!5T':>6VE= ?f"B)9f6d%b?̱egQ:+3V;|t;˲8J /$ƚvX`܅YaG]LYͷH +ʧeoIs =IGx}e$BG}1N4 v@9q݇ 3~hcݤj7f=îMik՟_:/6%9C3(?{mŌ"Iv!D)mڴQf'o7=Qłd"77Jc&I BQ4 &#f`(rBnwێ IDATX[Y(}mc:.70^>t:4{?}֬YeX!B!B!B!$B!B!$B!B!$B!B!$~hx%B!B<2ΟVCQ`ۅkTUO!B!xH]HOc8wb֍XEU4!'F~$B2].j4 G9r$ABjl$ B++k\=<_@0ZF` KFʊl`XD!Gԋ+T@k!ni4 Z+F# Z-֊YCU˝![/7^B!Iri%Ff%.mjGOB owBe} !m3B!Ľ RxBH"B_!B! !B! !B! !B! !B! !B! !B! !B! !B!X!B!X!B!X!B!X!B!x$ B!B<*z?-7~m`!B![w ~%B!B% ~%B!BH% ~%B!B !B! !B!X!B!X!B!X!B!xhaϞ=u~G$#B!a>/ CBB$WB!Bh!B! !B! !B! !B! !B!xP+Wd͚5X,h44iҔƍo9r0)QB!B2uHsc%ސV^ÓOvϯ$&&2c̻B!Bत$d2xWWWbbcj~Zpttͭdff)B!Bvك=ui+6\5j( dmʸc֣( !(ޝi'GKƲ|Շw]BNzbZsVD<0"C);u0AUZu|(466̙3GY4i`Dס(LfZm?s VmfΜ$.#g{:=;fsf)*F,ZYЦe |$v> CM(8?]: 'Ϥy>˧0qnNQ#xid+w ΰgAt5JO3WMw's8>k& 6SywxKn*Y#G`?`Z{lSw)^;y'$߷8++Afnɓ'KvmdvZW6@fD%X3n6ݸD/^9mL7>dS`%{N&PEFѴڙės{UfqںEOQCұ.ymyCyUGMw`b ;zX,{JZ}9 6/_*7hAUp3瓽F2zu?ϋ?\OyӍyspCFlBk>a+ V`>F~ȏ4(Oއ`QEn坱e9fqWukunxyq>ziff&ӦMm۶^~moooo)d1q࠷늹NڹTWX[?Uz n݂uԹotRΟ?Ϛ5kqrrZtW5'' &BRYx8-553fSWqqqqNƾX]ݠ{8Jmtl?r| ;4' sf2G'S^J6IܨѪOBl7_y7&PgY:\ YdZSk?` ,>NzLSx2="״!oU~v0g{>KUr`Pgl<&\3 KKv qџcŒ}<+ʽ9Y6̛f$''k.>  99;wraxˁ(Ñ#8,Xᘷz(GYÒ5܍m:7^=Yp,5 '>5ЫSmhٲ%šjqtE 11Sd0P.G&##EнTXL~wmܸg^$/[_[TN_gLkzO^ASlY􎸆7Mloñl Ԫ'V`9,;|NA5iݫ jY׊ [`ޮcu8UuN4s6D@"zҿ2SޥLyX< n[UE=ɴwdC7bX3Qzjx_4V:GzNrD *밤elL8C687GЕMר0g}[?1׭B1s._KtS?-_uJN)Kл:RL  35>gK vWa9N`ՁcdY{ׁ_J5} H$9OŪ|m^!TZf< =~7ѱ?ٵ*l5d˔E9I'a>i c&Łt UpאT4Pί(nЏ|&SVt+wGM ḆLu9Wuϡ?gdXi4 ,;YZcNnw̠fs| fn8l!vEHzd'gbuBv&oA&Wf,fe\H/wRow,7U9695I0xPkvu@ΩL\)䛵#:24&O&ebtp/>t)k䃹~[U9*Ix>Ɡ-0fa327kv!h^|j6S0}ie`Toߕ1^7V} S_dtk;qΤbB^gm=p004=$wiwxg&9#| SvcO4h#,,0f~W /Api,ǡmGXLWkQ23bcP)\n[ZĿPI{u VM;_mwߏKr֖gy3g%K1T˔)S@Ю];n$EEEh^\a6P 7k,,,ϝ ;  jIAUp>ES^38x f/r,?NѠM7"{&˄5?*}(HKf@0sױ-o,q_v:tz) 0g!_ɻow%Xٗjy]:&S0Mںkn!}>=Y'ōn׳%͇:7 ĕCr:bO mcּ_0e>SI~Ɛž'04E6բ-Χijͤ:rsM:/3Շ/$XT35|^T%$Va0v Q>~(?u кQѵ k;B /-ڴ#lI2q? r1'õ6B3^?s?f!G"JA{v7fSy#c@{嚕})|~o@5aL{˱{iڙ~=<1YŸG1ޫv+"ƔB!`m+:G(=;k6[-W\&7gʔ_?~;YV@|$M:/MV:_WP$6kstԒb3״N/(GXPSIXs\OڥLbtvNrmZYl%`_ :u퍯K1o4'NsǺ=r=<3D٘xiCf*/С{q?a+С]bŲFb# "I4#{o"Pk&F,ɇ/mH(u}ĵW$.oVu/A ~lб7O0݈@{=SU_T.z7k Sfǧ|TMdd$}_~믿&66>}0zh[z-Y]Bm^i[w54ј7+V;{ 3ǯ(r?Ci^ߩ*h4mt?HNN+V`ݺ(:t@˶κ4i$rssqww' P<<,ĸX] 0V6nT_QQ`1kۅӾĭîPi RCKxaaWv1u9k\N$}:ZсN׮Ja; qu~%? od:4y@lHAV>&;'ZߜB1mY̊L_Zct,9.yKx,WU+I2˯:McMdכٕp,ٮaT-|9u?Hwu7fK oG`-j{rJ6uRs]Bb-ѱT-Y̲vsWMڎ;|6A;{ζTo%mv^T +>POr?a#j~FGG /믿2j(Kll,{f̘193%~iZtBd3f,FRP{5 U+{ .n\t7oBӡC"##{+r)h4oߞزʕ+HIIСC,^777ªPr%qvv# *^r53sgұJ;O/os ќ#ڽd( 3Nv EV9Cz d5 o[;,wלzGN}6Gǃ-LwP%'S׎jNWX bsP#hvd@Qx#:f܈jmkڔzAnXiIiJDUfɉ3#ȧhTVñ=\?l458~ƀcהiJx^D v|*nG\yDuxtm$'C=Z0w8Px.5iPYϐ)j'7и;Le:U;º|BjdDR5TN5L{\2E\5Z$brl-HbgHE1޺λκ^:oNrIC?,W-- ,4bv!lG6ٚ4;+~WHG | `qrDžUu][̒+Ԫ[YP68r2zpkwDɲCZ3^,X߉Y8Y 3qfm}7ݬPAˠ/3.lb\dSWҵE]*QN@tO44eϻj>33m[nd2a2ظq}4 Z4H(UrReddiF6oބ [.i-h@_ק ^ueuA> W Zד8ݵǭfWofu#^ϧrq I4kUVXF\1>|es)ACpp(>W5<4VynX׉ӜMl~UkELٰB(]MwWAn1VY1> <3wm:XʨXǽ-vN9RNuyI|;O>K*dH`)]:i[ 8?T) _ޫxV|lqYO٠p ZCUKK{,zE`ϵ28 jk0.^ƒn`#>k+\ Qg+n}Y}xZ7ʊľ};v,vvv 4???D oq1O_VM0xE4} hOƼc~Wo|?//_tE^`00{lE!&&l{y0ų7_SO=Ejl*o_w8kUw÷<p;q+T+ +1$QX#*8jMFטT$zVoScsn ?us5bCZ%.?Ado_ N5*Q UvՐL"'!sWuRӠ∧Bf9rJy>,JsܬlF}x{E'4W|%?<-gّLŊ󦜕+=nhД, w&^4;mć7+*UܱlʻV;ٕmCh;/+~ćyzASPO<ѻ5B9bxo==݇2^ޚH^X:4F7^xJTr[WD<ܯܵ &2 Utų fjg IDAT5WnٹsgZnMΝiڴ}\f̘q9m֬X,f͚֭[7 7܄***ΝV'rȵ)f{/"\q>EH/ vx0K8*:YQv $Nf#ӡ5䧓huMu<}wtl6[W1+CźDele] ۣ; 3{g=}b/Ϟ'YX9OӲyjm#@ӦgY=}9FՒ 5R,89$D՗APތ3a$M!GVf%RmqgkP 2ȧ2/E m=Tvw^-$mr)hǢ0ru|П hkp' 0j6.!ݼ6g7c)jQN FtsxhM˦CV?x|W]|a}Ɯ5y T< rƴV3SM)PX.m+—cRr(qzn3|Wj_ n۝6>ǷG,m!m^fs-V^6|س7T[*kC6!U޺J8z`l5aR| bm:pr]ڢ'O8Xu,ڬ>_u|eg{֭>sGj]:XVi}<Н΂)bbˠݿ_=ȑ#=/};@PХ s*4b޸# z :Fzﺰ7F߃}OEEEL4ӧT5kFF ޽;?#,XwwwoC:ٽ{5={{vCIѼx6ObTNkm^|[ˬ X9W`EHXp'Eo:e Ʊ-q=xOfUmIԵLnf T}&k9FT#n2{b _eX?c7 />\P)^uY0)xVm+]S]v>a4ewә;y4k:z7Z]\]ވ.3} żKOeΨmNe @iZû@k&]ʸY*PT>OFq&5]s> ˬ+1\9w=UU|NO8^{3&|Eh]}m98P`'?&:B7hネJn[VXGѦ'vcWr5youDp!/u%A&-ßpp s`ʢe!ҶJ}p.y>*La֊?1À@T|m3掟#Gv9B!<7rv0>hg5xn%i҇ I+nL_!Є9$XDAurDBR/:9}]N*<~35{o:tٳgSO=gCff&cǎ%, mڴg&NH >t}T^f͍z-CBBмys1lٲӷo_lmmLB!󉤚TLW0qo~d_!m]xp75tbد3g0o<...Ă...kk2Y e[n$$t㍍ ~~~ԬYkڷoFaӦXەŠ+B!ĿNzS{ϽLo_I!Dprr"?*g${;UƦl2 }||u5kvzm`ggGeqBff&W'.e٨B!DY 1?ztߧnjmW΋&d]nݘ2e t_6̷XqFeUq [?oN*zr!B!3<==yW3xQDDtXB!B5nI!B! !B! !B! !B!$B_KXNK$B!n 3B!B!n>r䈤BSeB!(Q,ϘB{+G@Y!7%B!B!$B!B!$B!B!$B!B!.e` E`4  tӃ(B!BfMfltiz5MVV6ZWpww&!!ӰX,$/ 9vs`oo'AAApBʙ<R^cq𛙉z!|) \epzx@1Q`g{r]3g?>III7}?::VZ,%(4$dQe7a4ؿ/_h15~X[[K!LjjʵN'gϞ-TPGjJJdc oL|*TSU N8$ W%QDɽʂ{DleH1sjR=I M?1dŤO@CyV1M:UEQjk*6[ 'Kv6,T ~YfVih4G/Vή9Ue͚[P\A+ 666a#!!zxe-1yѕ+WazTU%44t: o^֬YyXY4V$ +=^5q|H3;;QF]󚋋 o ~N0-_ۢyJΥ\̤w:...瓑ngɚ$iFttC I+TQ+wdM\K9W ߻g}v R+VЬY^KF L>iq8p6Gѭ[7TrURVMf͚ũSX~M6}`WrHЏ{]GBMaǟ0ѩ#߾n坑9GK~^>666֖Ri^tF6`CPLs:wPԹ{=R͚"S.g~i{7Z[7k֬aРAcE=ɬa߭:4iՈh++tnxyqzۣKYs8Xl\FZSÕbү9Ցh4boթmnT=xAj!HעS`{N$P h߾>a`ENyKA|,QpGo󰉉B+iVlyQb׎]pyوV___2e yyy̛7=ZV^ի$V.AeXWsL>a) F֮]<ӄ:uرcٱc զql7^XZ⦸7mJ(CtqL&F#FcVIF&S)3;Ph'#1}DXB1ѽfQXMُw#Ng +cǯ8»WCx}̛7UUIOO'55rʕ.Q 6a[;&#%kT0ЇwpɏrOMb&-:s v\rbSqp0 foulLU+c'Iu^;&_j?iZyJ_M=[lY5/^]vhGƚ5kդFAxxx`h0V:%ux.P ޾}Cbb";vll6rDD7`u$''#yk֬ee} EihEFv6QD3=@u&X!33Arr2=%!6ݹ=]+sլٍ{H ˳S_dtg0sNev!k/zFa3LH%j'' 3u6((j-[{2qlya/ܛ73g,gtR=h[S f|yeII>o1|IDqLM%X]&;9Nq:;6= B1au4jډ&~cu#7Cwra缱<|ыEI ͇߬OУU8UYw"Lʵн u<4X˓3h1]:\,Rs^\| MÍO;i:u,/U2p,Y*n>|> q'W3bjNdU`Dk[kgx3 (!z\gw0uvL&GXd<1(A]61/iݜ^ \Oq*sRhg8a\޶%?$tuy?>rat>MjZԡaM̚z`ꆄ([Ʊt7*], +ojŠm#:`G. zmWkԃYtK='1G<: ywFdh4" )Bh0 _*nFXZZ2j(Νˍ7#t:zYzj*|UK4WSD)Cue Z`Վd E< Cۙź-h([GQX7G2,ۺ}gy96L®D^i\dMUtI{j8,<QfW8,`.r45\@Ə} z:],,,>|}w#ψ'!GקB^su|7MQ5|/d8.y@͊6_'ȰCkߺ]>3BDF=;RRIKml:ӃZu sKd7j}>lfefvx|1MhP;6GiIγfA2K:EuGdHcHk3M33JJ$o:]m)Z בգY+bݡFzk |,o?Fbȋس~O: IDATp9ukѮ5kz{f7ǚױV0#wHuw9䋜F 9ѝ<c(#XL; K;Y#7xV2dW%}vv(ܑkFLVΕ/.Nť6,# B'\kvR_z>˔ h[y.?6}i^V9ҽ6Yu HAc51ų J )G:_$"H=wV^ԯ_ɉ/ :쿎!&ɂ!6o'xws).J=%..QPc邋hzRaW/5"Wh[N/Gʓցw:%!^&lA5p9լۆ]\3B:`ͷp0:}Џ%kD~#Z&pZ6uk<~B/1Vnqi̐fZ0f硅fK;'/KQGTT)7uTK^gɵY(ݖ3ep $E9A,KoV1i9š7]0̈́X߇cݗ܈\o>DwC WZg5#'ʵ7/bGʋ5iaa  JTo`V;cT*{>iִ]bxgY'IJ#Suu^ϛ7$韻fܸA Qf!Eqt}2rooJ\'5K 0%Ws[b^وsss9wK.eIP&"'N$//__DٷmI=y,a쾔{mbϐxɻɬ"nk(o DQUZ:firAAU:=3--no(Y1+P[s={ 7жr)S.JγK/{yD=/ k@=M[ϋMPcߦ`b~:>}z5W,WX5})W=CYBSX**-[_ь_nE}%#{ WP-w0&_vewK"@~|mɖ-q']ǎk-]Te#9FT+\G1T#~eCr9-ˇ Ėb)cr >s%]eryƎ_~[KƎKhN~miz0o0Ίl/U ?DcEY0#}8r9>ϽT)/}: ℣tpW.׸ncO%;RR@T g'or=HlGdQQ*WVG>i4 dY 2FLrDRxηRUP(@DTTEӧqFYFlXHbbQ:ߧBBj2`*"UW3e "oѭX*VQ0ONAXXXЧOVX˗DѠP(( ld26l@ 5kulm\g@mo(4!tj}+j9b">̈́ n<БCSЋ4ZoFWNr.<,A֞Wi-Ɏ)Jﳲ1hf{AO46mI\V4F, B2mw9LgI5-?mEktaͱ\wsJK7{a_M98%[ Sβ{n<;A-Ӓwզ!nSv0V{T*q=3ش7>6jc?VHsp>+~ cxY(LAsg<=Q9^QzlGTLšji}$yf02)"&vf?Vژ^;Xd'y^38xRY5JtOw7 Cē3~g]o\ x $kgdI44/$9n `_u\vmƎ[2Ա,5K|Ғ.rrad>j -7AL̎+끍ROV rQcgBfxCliE5Bvd-%qrz}Ѿh%f 1my3{9igc=ͰY\ R U] 5źӦԱUO bsmac.gO[D=9rfιVMAy;s{ 4f*Lb".Ώ>TM:ˤ 담nZoKܸu˲`дܝ *-ۖU_G ;VI p1UZ bb{ o P Q)Xm`R5zݳ(ڮeemll6l)))G8qrr~*088J3E7b߾8pFXn8ڵ޽e˖1p@U>֫v27֕=q8d5ەVios>>5XDP`ccM`` < -dvV#ȑ[Z/3f28Q*\ɓ'tRL*Jg̯y?$Ӊ(xh- E45|3((D`Q&CP(Dhjh{IOOO<==ڮl:dtލƍ$UD;13+ 7 u`0 "LQDˋM??'L!c;R}JHHH:DBBB \htxg)퉄ĿXNBBBBBBBBBBBBBr%$$$$$$$$$$$$$$XBBBBBBBBBBBBBBr%$$$$$$$$$$$$$[ܓիRHHHHHHHHHHHHH<T*h xVPHE !!!tHRRYdfd>ҹVVXZX䄳T|7RIIHT$ZsΒXkdfdI\ \\ ERJ+!!!!!!4ZBBB)q~wX$$${nZ]tT,!!!!qtpT+xTYBBBBBBBBr%$$$$uILLzbOHH$11Q*h g)  ?? F___a{HI$$$$$$$$XBBʕ+gdꊅEE4bbbPT)79t adV5 )K^oZJTn]JRZy쿔Uq Ӂ+Xi֊{K!3?$+n|(CHwwwX[[답5iiiU^cA~ܿ l]7 M89[1]eQ:{7ldrW=$$R8ooOD߿N38Sl\ӌR?ི*䯯ѯWuCq8roɑ%IG2v NI/Q5\5(sg殺0^e09$đ ՂD)r055EVj̊9/&c4Z~qF?'AaewA¯/҄"SaB]ޯ9EČ}Bɗr~fw$W |\k ʛ;/DotyadKqh-B,JԎxŁhlZ%mry l?VW b'aS\CWjx ^ |P0뗳` &g%w'@>hyV$f,`HgjQhq 7I!yggڵ4Z}~0ͽ?81LSɊLkzz6ެI~s@ת뉫f.=v8zP"շ:-vOjXK}t_>ě{O=UÜMb}7m^X/0hw=nY?I'L6S::.pUm~sr;©dR%4lӃ=kT,KY3yKZObUX$uXf䅜-r\_x.[oZvuc:4osT t:tetuf7|-m(U(ykQ5n IzUK;"S{U΂w5'ę/sb}͐G~h!7Y?e.;2뵺ƚPO?bdť%736f rHMaec~UbLO(Of;a\c/l Ӊ=},Gx cX6SŪծ`-xsu Oh=h$#=e<,ds pegM p<xX³','2, gw#iZD=U;Y9Qflc#iБz;Y,9ٟin +>Y389&onŷE?!G9#q ԭ:\fټ{jh)Y% .f׵+s93VRJHT`@_A`0`4T4%Aڑo11NS(sY~4N e;ңT y B1!/g.?r;ӦfߵdM-# A7d }By~Tّgҧ\Gr8l/p:h11AǏdk ^4bVN#iV$_C-#\HAomSX/rv?{c Cin r+fykg]ݦJ95^㈀P.j0x&'п{{38u2/?p  %#iL)|b0kK_ uw>n1g@}hJh0 x*jYyNk$fRĭn'`濹p39"F̬ŋEJ(R30uw9{*'XbFtR^Rw֓\U=`\CyتE IDATG^FD8YR\A426. "+a/sYx2D,7a"=MN^˙9 |F@or`)bU,? GWp`I-_'d'ЎH0"srG73Hrv N㞜KvXRVOISGO`|PEnݟ7sf2iy:{\vc,iTZVk6W϶I4VN~©w>O.ȷVsj:yfV ]Vr=2wc,xGuh C',!ls[݊ Eb>o9V/+|f̛ Q G~uə jl~ʺHHa㌏} s,f5}ZrF<}D@ĒoMgټqn`ܘ](l9ǭr,RMJHr̦ =xU0>u ]5;m9]Q|lJڎELG ɔ !Gձlxy ~"ݝ*,I9zdڍ9 ^cŒd1qFzNg毾V/&c[Ѵ}S#c>{$_ FhDYl͈`aB8ko{1+Caρ=iM^dhTv3wdz&̦7°!s҉oMa:We7c[jޟħAjDo(bn4bZEFǘ}964z.WWRc VO|9WOa~sGkD>sdBNb!6ΏqNQB+kْZ6 oaYҢqċhGQ6k⽼I+P9y5~FDz`9~{A;Mk!S~)~32H<-W`ά$8p`l{-M^g!z3;}c}I"m,kWS@f \ZEed_rOњ`r1g,32w#v\nzKW0`:@@c# ,X2 ظ95u B)t5u| (QE G"S ƙx'( Ƕ^&of]d1 }gyBGoy>t4ExC+l<{z%fþ18gur/-}hOy$e۪D pYh9$^=%Ipn7d9H՛B5GJ?//wĈ?aiS~${b׃sI1;.0͙8r]~<Ϯ%b&'?.G˻9`z'ܫ_PQc8ƧǴq7.:wxVrOL,ʑ=Qbo?g& =֩y{굩hTSu5$D9oB/:MÆVES,~ ҒK55G5qMvjV֠pRa vۑ3FQx'L`ÑFvs/7utT4PGë6ͽ?!`?FψhTU'ڵSK]j}!9\㞸EKHA]d: .ZR50"'rxl=Hb{HPbāfnf⹚+@~`|[~Bhxyz"Lh~? &ƇaEBA4VbĿ/6Gs*H='97eOͱﶳ;>\=CGD@;HQ9yѾI_ɂnMƟ ٮH(rHQ`zN51aԶBp~Awuf]bܱsQ "8!v$=Èڿaޘ"+oOu9HB=jR~qY_[4sEYw-$ZxqF{GWdYSf~ܟF2cP5OhDK#G1f; i|{4R8etV5$$*?bOiM_0 !&&\u41U#z%I" _N&ʷ%u5;Ξ˲q$fhQjr5f9ȌyDNBGM^1f+UHk&3:ruf͎ =䥆ڣ+e|mqll,0*LI<~n^x]R޿ӫ DvoJJs!8ՓoN%Q}̧2tDwz:gЧ; ZFU ?}5ؿv3Ν̠ /Y=zy8=3asqo_{0FEhtE#5E{3J¥k\7]s Ƣqc#7WK.CڸqNJԒcdOWK7M 8%Dq=O˭DzWњؘd.&Ĉ("XÜO& 3#BJ'3ȂxWiS/DLuN]+{M\Q2=j9g v=fgsRX/e._nAy"6A_GMS9+pL,y< 8|));`Wۓ/Yp"M3929YS~/ш;'cVb9}ǹ9}}=.fs@ʵd,cxβ,[Z)} E2kwgP5rus$$Ibe`L0 hT/7CM dشi(k]V5E-Zԯ>M-0SN=Ā m՝FDSxϣ։hTeڼn(S3\NmgAXleVxeTd38Zide 0K7`r^/ſs퀓x |+Om:Yî2eJg*Cۄ>jVnCuAMxzS^xacޜɈ8F];LQWlJNBD|h09Lci$PTRc:w.|[&) kN[XaWO'#P6^L7XXXvD,7T\? "slc $SHVt^ۯ`h O3Y`PYӥ9Df%O&Tq;rr+P+ 7IVeCk5h1H)`s SjybSxYTJQ`7AĈ_*p߁Y$;VDZheg2Lnu\wZ 2:\äpZ:> oR /}ݱ(eߚTR"ç :ˏ_ [BepӊџOg@rve#feNxِ.Ow>.^vU1bedwڎ`{.Y(q|=ǸF$e+o_ԏ6)[]hУy<MRhfFtm̉~բh`cp؛7*;^űݶnjbUĭ'5WBYxi1 'w#IO: \2лV#Pع~ꂳZUoBqyѓt񶮚Fu܋(cJو2& NBożFQB%摝Sy%v&޵:>ٜ9vLhr|Rx=g =ibl9BlVtTZ]~a6缩?BMU؈%% s bhЍN>n0 @VK>{yg#j腫FYT'wNpsAj{m:'jOU <#|ڽ_٥5RV"#ul fNeKɴ7oUB,@_*h$ ^SJ%XZVLegeecjjD +#_YZ/:ZL9GB5=a]⷏}-.kuM Sѷ 'JFtD q3Gu|-TU Lp7qVlኗٲ ~`ss۾!Cx5/P&^`ÒMwnw-֣xF6Bqi.GRʦ1;fsyx9c]AT *q}憷y2.`P6QS Ԩ91u;%U"7Y2zubaw?Hu#>ՀfbP~ EN<6|5(=敻^o=B1˹Άywjŗrs8tvڇR @C,]hjWM_wұ3CBGzy 'o'^8`"pc ť3p_ڏذ}=~xVڳC1-y!`ڀa *8XׁJe"7t`ΐX-o_]g 3NV|8^vKuGߢo7a/7 Y;+cs#O*iE2NQNOT1kvͪb#Xzgo썬\Feߢ%=+7z[9+Ӓ9sp7[ERo8 -1oN5!&J~:.RnD N7^?|7Mq_%-+lZ-pٳ?i5nI:jfh.jUގd9d Jn.tx}+̶ʔX(sB&CPU~~Xw^ˤ?gb} d }pPI=uL [*#E|>gZBZ8y<+wESk0K;{=!. WdcOЇǻwoʬAߧ56*ՎHH3 ;'̌ܽZ䧒Fh&]y+046=LǺwWI% RW'P# sX'ԢTZbB["[Wex;Sѵ=S|7u<3ov5 0@0ј1=m˿z;¸K?)%ф§eOFJ6 ffJ9ۖ {1eTZjd:>OY8iQdfÄOPI~?JC!J}B9n27/OGRbnV\hNק+& W޳wQT}ǿM!$ .ҫ4) JE) RTT)J JHJB($BEx>ܽ;Ν-P%Q_u8YD#4#r/yd /Wx}\,"VƶYX*~5NC; f{2nT1X2 7 Vػz=(~wyX[Nfoha"f3.^z<N'x8Df|è;o|M/෨=G &{tVv9w $lrLwʋoTw)*$-`EP/6ϖ9?+RQJ>V5w58-)PNs'j̚s֗ UcS(?8Xԃ1u1C֞'͟ bA8:K'9r\E?zW/ |Ō2<:O 1z4)6_0fDw& o 9Þ)N1%Šds-FA5}ǷUOMuI6W@PG[TP2CM.QF2i1_^mZBvVp5֎N"~eFFg>䕋XQɫ]ܚ_eZ # Ys.3h[4/ p+,kGXl(TZĤE?3yr V8{QLh[K68Pgo:IJ G>|[=FfXhemT{&,W}״h’e!*2m[\_PZޝn2Hs왿M=oVlX|*E iՕ%r.=Kb M:ѩ Xαy>Ki=)11oٳDFFt[*Soa/\ ;3|^%ǫ'jȾ?sܽ uKyb;_G9N6Յ:k_3~VX dgf\i`eِMFFV< V֘"#3皜93I̾xhdĀ!D+9Ҿ4!VƜG ܽYdeé &K9%,2`2ae4t萪"""""""޴iS{ GbR}U[]_Q}U[I&1 ((((( Эs,w~YۧӤMVqMzQQ u-[KNNՁptxD`w(ԗ5IL6Cm6h_[f[H:[VgzB-IHHT-nܔ^R-@ -vۼ5oEJZZc'ONV4mӁbݡ?Pykzw${߼5wڧ޻~G]sVV6ok6n=yQsmodtދ?{K/0,[k׫5ށ-[dV,5ժ0X,0Y8c*իT![*IX:k_zV^g[f̝ϮOKIImٸv%׮W-@Lxkg7GGP㡪ri_[RN-L&r 'Na,9#G2g¼m߮qѿK 1SU}$^ҹ_~oOff&͠ߛo|MQT{ΞlT=g_/~ J,9$>0m89 )JGЮգX{Q?/MC }x1NâS1 um{>Ljך9 =Ĩwק8|yKeAJ,{39} 4i܀D6l܄EdffΈ1 F^}'mkq_с?Dff&GWWgv<$.ϋ/0ɲN /s$''Ӽq# |m|B"nX[j{2}8:8фbY6wv6=V&NN>?ei{ #GDhWBqm{a c¥'y}3xk&-5֐D>Ⱦw瞽RZ:wxa|H^=n.\gsq899ѶU =Ř|Fŧt+c7j]zR w 9%"Ea>xhNҲ#$%'yG<̚2;zt냆2;7=uHp1Bnu=pty3X4-dЀ~j2gƱpw|S}~1~T>~\g;?@…xܶ9 s*i3Scʸkǵ ZDVOɄdgg-`YHF (驾UPCG"YrGd4o"|!A %d}LC 4q}e+ؽwsX4;KFF))>soc-S frnL>V6eጩ /'_|y_Fsc7jn3>}<֨^hFcz(*ŋagc@Xh0IĞ>sg\jZZ_H8+PԳOnEZZU*'ߏFkq(;{;;d"4$聪L2AኆmgksZY,Aҥ\<^оMkRSR8y*{{.\ٸ,1r*okV|<~S-@[ !!& _7d6[c4r;:@Էe&Ԩ^Юse[_{{;N:EzZ:~=uujlLYfʊ?ҩC;m7żiX OJ.Yă 8{+گmワ遯Oq5n=a!TXҥJq*Yua[èq>&ۯ=<ޢΎS֏Qv?PT.1{;Z:;w;99Wכɑtrǫ;;93ohy>0u:zo b`T([:+NONIM]'&{;;RS[:]z+qv664mԀ:fujh]JI cRRR !-=^c'ؽw_Jw 3gackK1ooH'v_hX@5uS[0Bٸy+Dq..\GHq5k+ ?}쑆{@܅ O^7g'g>A}oYvC!A|6q 'N0y Z6krӱ»oɇM ))mZQv'&q vԯSj5ܵ{vFg}nٜݻֻ#i9|`ໞ_3q$''Ûz=̈́)_w>޼ٿ7*UPd=sACGpYޯ.\Ȍ9t$ g'GjU/(|Տ,v%K䍾/CUy xki 5C RXŶRT_VTcWV5V}Eh((([9z:===t;v,۾ /ևĖy7.XDDDDDD6L/^d  /&ŶYHp҂n670@hhN]M*"""""" ````````QQQQQQQQQ`````````QQQQQQQQQ`````````QQQQQQQQQ`````````QQQ7Y]}-[nUe ѩSTVWUmEU}U_Qm `u.Y*% رeZ  """" ````````^ULhj!"""" "r;mUK:eY*5߽}B]N|bϩ"""w궞eIdz206IMGc/=Fê͛GÆ w]'44Pk5_3g  ڲ'h8>jdGf깼7op&sv^?AE.оmL:G̎ |?SatXm_G:`LWqzG^^,/ n&5<ܪ**HadR>:|u\fʱSr(B@ݎ za{;t ˣNsbfg|JXr{O\ ћ_fd2y0GAL.ң4ZV'͛7gL6ݻɢEpqqaÆFXMa8r&k ڋUrZ-xm4ˣNi!"M_Gr.Ժ|IHiD0/]'ϓ@Fr8[z|]G9lhU^lVl;t{wb[=~ ιQ﬎hGhOǺ1KH!Γ2r +:o ?;+Ѽ0rp ?Qutnc}&FQktɋOx@Z:猂u)sWl@RikTg }{go *c^^jŔq}ʙ+IHBrI?ֱC ϑ X/ƧcJ]R5{CfR#- D̝LjO![CX{W ׆h6}es6 4oߖ~95O;Y.ƧaespeZu@o/^>30ywŏ8.eyf'JקEX<7pl<7‹rԛ7k3H!aZgsŔ LvxiLN /$slBqdXCcѽDDDzxee߲ ʏf#}Kt!6\gSU ~ۣHou!;O|ͳnQ[eԗ^|nrCF^Zy^?V18KbEI)FmnhԨF+W0f, t B_4ӯe\~38p\E_{LLG2c4b1Q 39k3>DȔ5uK&b,b/p66X:u|ZBr[87 C+`I+Y2q ^ǃ `±dEʇ=fO|w܉Gu/JxvuOP2 e[si*r?|GBϖp\'>iPh`n.CuB#{YA A'GSqkR_YNmnJ9+ݬ-vCyfD O;ci[+THր_*\%˅0mX;*$ZV6POo.nJt%a8ˣ^)L 8c{l6%\o /)_;@ ŀ1?DZ+$`v-GQaڻTr_(G9C [樾DDDܛaؖ9*_)YLm'O=.$st:iXrUܱt< $O pq,ю^i5nصkvZ)Zh!ٞަ{{q,DLK19ιϻ_bJdݴX1;H2QMŵe ^zˇ3\ }eTu2l3դyiUUқ.2OցFHkFGsÚwz&_1Np'ʮ.zHt:ViSys )c?ѦNִW&fg*+^gq» j_#gh(frf`zξjݟ':-BG >R:uѠZOepllp&9)k|JulXM e޸"S1\-q7^[-?OO.Nvw;g{io{'V1J!BzS>୉&#ʉrzC|h:;[&goT="O˵!c?2;&/\|!t ?3-_{cj|5oW7)uڪ QH.C[-l2Vv{snzȰ4ZDD\>ooXtu13b_v:#XEg~t6j111̙3z)|||Y&͚5h4dɒ}3fJa_dE⯘5pGȮҖ.5GXAbT-m >CqJutql+Ӥ0oUښٛPyv-[I9RX|y(WZ6o;G,xYs!żMg8=ej!b+k~T0'b~_źX/`O#^ӕ㳧 YE 0q<2 jeyߡm25F{㿰|o Z2Đჟ=;\~1 aK;vAU̗D"K@DDxk in+.o^'$lɉ \wmJ܊gC~a׎d&1gjj-msuujժTR%rGfuXuF&lc*pMKi+*|?+;aܺmYsq3sXpnF,z{!3b7gpD\'K2lg9 㰫ܮD {T0EuD3EluV1-73qLm݌j^q<+rζ A];֡uσVcduB(j$!6R%ErթdU?Z'fy3RuqQ (k^xvaB]x9FΝI5qppr}wlrbc:y>Ջ\H/Z DfggG١z0uW]Dr!,8P4KL &{\|v,+`{LzG%)ӄ'*sS/3mg#hѷg\~3z)o=E~0~3愜xDj>yDZ{ފ|A2V;3#sWld$^RuR(ErnlM9s}nkֽ6 ݳg[Үk}/tk X~ %nv=~cL:ǡ-߳a9LظҾ].)p:_K]j*Vgasp9xͼnoMMe3/zKpÈDDZlѢ%#BTd$۶nQU?ё;v%''k%M*ʽ͔oLd ᢂ}rjy O"""3[ײIglOjlBh[I̒XRH7;Q${g#"" """wEáP׍=%:`XGBDDD?HaeDׯfoJhȿ8B*UT\dIUES/9DϮ;QTO([,UVWo Y?Ϸj]Nߥmq#1_ėx3ɜK$r61} R71Xdf{ I2+ugxZΰ3923qcM:M5ml1Nv}eWP# xRk#HbcgiMW6ݎ/iW>ȇe[זbgOxq-/Q K~g=he>iOoPcsǗcnMO(3sx95 fʬT63?m82lP:*^Meo5fN(nj,ovEcf3/aQltoD ّl9y+`w oIJ<6`9I|&̚ߏRlGGPyJMLn9??s?9ʲiWW/"" "rND H{:su'%q-Kyƌ$2nQ}GO|POS=t4x9K|B̊N;&T .)F 9aÌg1X1gZ^À~ H_gԳ.Ɋ$*m6o§WC;CLk@M0g^GsoyZQ_7/ltg~a?e0jaGX\B^pV弳9 x_~b^|u&Eϻ^2 gihQ-6{ΗP OQoJ%ֿߜG24X 헑aRF dlDYnTDD,R7NgP"O_vL@̥cIʝ1Kcc\wnM T*m1hQl>0mryml9NMv"` }w;X?,քIߠu^`o3}dzan+dyB@Q|pzvri3ynMs=/2h&Z,Z] gbP0l</] アuéC`^MYBǝ^7|l:kf{s)Sy*)pa 3'/`Ԋ P㡲\$;` 'x'9\S.ItL.iפ-+K |/`ۅ_pRiY ޸:̎tK^ЋCww8s. 2_ bukb̩,[2-nEf΋/U@T"sz,/&(ԏ{vo߮1|R5AT5gE/SBM5\*m-{G8lU$qd i[UȽ8cՒFkpPh3֔Smܭ?~ m u""";|EΞ={G30X,899RHU\+z6DGycż-XS<%1r$9]nF섾<3Kf&Y:g1LfF 6?}w-g9oLnޏCԛ}N9[nu\pZ|nyڊOSeGѯ`o'>oƩ9dۺP;[7^qCX qJ%& '̱Tax9jEϰU S?Y.v4[NUdvo&Wl~p $&&Ql~hdϞdee*&'}vAN^lsbpzU$9yh?\Jo}$1&YG3s;Lx.;|]F~OqdR;}7tR݊uFnbT,'kdɬ~T,Uyp9/wY͓J>-/KF&{ߋ\(ݢ3Ay˨qF}5C}"8ﴻ{j6v&'ts-H p|~,߇:pP?FXcqJ^{8}">U~LQsFy\" iܗE}I,8l G鈙 YYLŌ X_Q>O H|2*Ccإcmp;>Xƹ n>i1/5en5[O[6?~O0cP_>0R^C0zK{E, Q,^ۥQ$%%Sh&,!#=2eJR`ʖ-ˎ;XqfLĉ܅۳2XjgLܾͪmfU׵EDDDt{|lUe]Yl j-,""""""T|O\8##'LDL, Rl)BMĞޞ& Ҳiץ1owlݹ Jө}[<="DDDDDDS7:VŞ4mXJ{ s.㯽hhSzze./]N0=wg:ښyIxw`  {,_Ga.Ƒ?pGLlڲ]{ވڻOεOml8OS\kWDDDDDD|%O7$&]^P++OH qK(9{NXDDDDDDl6aM&ܿ766WM$ߊO1 goU+kMB  9 ;_b$%%cXPUY?0@{0 VdY <+""""""`a仯y4o } wƆ.ҥC[I)J """""" W1 """"""sGC iiiDFFIvv6ϵX, L&Iy-pvv6'O`\x , òd'''J":&vf!""""n $((PU@:u۪""""ro`EoR[`d”y.l{g\T{k|sSꑧѦv%z8I7X=?Ϙz8$ !@C]AH@@&(U@ "UJ齆I4RH# M Uܙsgvg\ tg ,~#Gge<Ӄ|ɺd(qgq#&s ) J\?co4vn eڄ9r enϾUt.<XDH pݳ6Im=qqeL/j7nk_9E3lm'4v4`2Vf""&9oT_8EFŷ616|CY/F =oV%x;f|_Lc]\G^Pﺴ;7G6ƦR=#n!s7qjS+;4歒71WoeCߝ>bp^oQV7mV u\[/y[tP:$YDDDDXDϾl JZT>ŪH֍iNq!ÂpC:fB"Ru[կ׺=Z@PÆC3fH xkU] O!>G},ݓHy9j+F\84~od+;[#F:EDDDE!3|+~^ora<>c?%Zp)z[Mɇ}5vx7GfU_NmqKq4K&g$^*Q6[9Fk%Z,CnkD<1>$|hT峏W2+7Ay!,=`"5\,=}`a[ L~t5h.X2÷}W_/?ݛ[Ć" OxZ|2 Ιg˙nPDDDDE%=]&{lg<=sO]XͰDp -|)\1U`u T#;D_nE9d svU?kj(,s !kW烇.Y0yWnf뵪LE [\G Uz5$T~f3p\?YE^7NDy$dt("aS]?WiR}G0c}x`kN#-Bn:f<+u}(Ԉn-kQhZOiiid:]/bJL}χ_6|2E uȹ)rwv0aרf@*=#sytk* $9SX=f۪ tjӑfccz|Km1#G.c""""h AAAsА9}R"+lDDDDDkUw!?ȳAXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDFM vj(`wi((((((((3FM "O48əQMDDDD_"ςD"/Fp*s IDATi }-asd]Yyۙ匚ȸDR3bc]/B/Rߵ?~IrDI~r+cDd`] 3:(|`>E_s oIA%Fxd+GDRs^220Ņs!.s1M':eѯADDDDX.L: .ܷ+O˲ Eh;i0M2H9~"w"$/cҭ O$J.RqiBqW1` }72v38hB!cQؚ#ywR7C r݋۾D\ hщ+ya `̞sXJuwv&O yn|S27$WƼnճ}lI\Z! +7/ kM ` cӗSYM r^&:mfs8¹&ܜqȲΖ8[Hj F6'`Ou&FWQ2{#{ 22e?OE Ia} ʝ}̲8z*)8Q_M?E3Cc韭 ͡,}Λ6NF^֕;{s!4! k{<_g@ZCfRiJ}9doòm﯄W>J%OQ_9CaH`в?ʕh;4K[g/r5͚ik< ]vڵ=8xd̉9?2zO͕\DX s`mHCnwKay\a˗3}I3ps% v|7o>GLkI#x3޸ߕWWW qLx7fM\8Nd7-#1t[G\]KKʡu>} y.͹X;NJ]v8u%qp4r9\eY~"x+]pNJ)=c*S!m$=. ;q!lhFwzÑL& `xCOs\<~8^<Af#Q;qaR˷{ѻC3Γ'XlQc7jUϐLPD><ykzuyexLʏm֞ztMZq1%Ӿga5_FϮ-){0gJ.y"""(AM e4i҄Oj֬Y.l4t,HzrKv  ?ϔS{a+.[vpkflp{#F>b=WNcSwGC GѺ|S&fǙڭ]7[cy9Mcys gA!#^؞0q 1s"T4xpSILI/'n |03mκ5'Hl7++S{Mfo֭vhSDɾKaOq&փ–@I>KsODrLe^=n~ tԐ67B'^)K@"d|Z~{#_$xZ8Nz%{ƓI4S㗳(qmGW// #rWq*zְ6@wzСlam=U>|U `6|ί)k3.]Aћas)a$Y!8'""" "ڷ HH`۪Ue(kP}x>ZqKYvEfwG(ozT >vpkï1'Y2noS:U d: H,[g/rdk'[R쎍X~OŐ *Q:eR?}“QK5v%wۀC>ˁ>fxa7G.aǴ#9:1jOj;PmQ.{={63oxբ[:xބ{r6)_ȚNq̩|ԬZ=8t."ҳ5AQnʯwkk[f}b ﵧ]E\~EDDDX<l2j׮M…i= F6F "?-"x8姠b2Hzۆ1ifn@)R-w[g6`POu)qSY7ᝲ'!D'wr 4䍀t:>!_m ~5#N@JZb-T~¾o҈sBٽ)\1eثّ\Z- h7Wn6ۈ*Q/_{vov6h_`G%a.ԣ{9K9ڇ)NEyqxß| ,SJQfˮtQٗkcF6}`$OTϭ̈u9@|;u}/!>~ ιq\ $::}hS~Or|:u剋hV&.l""",r?5kbPfͿ!? eWu 6ȏF+y^.d;Kpp0FRNx>|XlߟK&d zw$3)l繜a)Ks3VIwU9̊~o;8`gN#%3oΓM>lpus>*1@~]2 Z>Ѿ-4QӚgMZX{d .јAZZF1Ov:uM0x w6à^` @Q>|:βmgg#։di>Qm Q7.cџf-^,`W?gq{נNq2)6n&_r8NJ6m=͎3xsők\H;y@*˲Y?chX/eLWMz9"S.`[J8HI}{Fp5j@EG^ K? t 5zJ!<ӗt`Y`vڏrf+I\{Q[ sb] %5 =) F>{HB 7Wg&ݜW FC7#6) =)\"_v-DAp]߃F=ym,ظaJd,6.OWQ]H#$jdxŻ bBn=+eؐ͟^=[w#2,1`J>"l=r'đl+y QV}~ $ X;U p.%v,L:{ʼǚe+ֱH̰6Eq,F.{uXR5xktR8< ٹS۔[ɛ}K!֍ cHF5B o.A;iE z ;/$c\iY AF6Ahx_5f}hzA9'V2ywm{2=2#e^>uJf.<ZT91)'Nn޲ԭzhb)%$[g`GUf5X<PT&,impGf1Yl:~m2Oh ctXl– *g1?rиDL\ #OQjj www|="u3Iײx~3?A2S;MUlXχ3R NY~}KmN G5Wd T{ސcC,ԓN_N9Q.b#sZr7r|7*J󩇳ospA*e:n O]&l.S^Cc)םܮ1}'V(Byq?7=v(]srּ~{69m_TtG;?\?-S>w;iɇ#Ufȯ_t)4zoEz0lSISX|5K{Ra队hJ*Wa#N#577i7s9al2L&İaz2 #3_Ʉ% 6s`C.qxvX˲&.epE - Yڲ2]r(J_Vݛu K;o|tzrdϵNVw[!֞. 靴Xq_xy5S[qn~ӺBAk(mg'frNdz^=j2yȳ9};Hh+s f)NfXȰ+Kɣ9g*lS[[[HȱLB쁴}[&X 27x zCݭ?Dڬ <6 #6gnqU1ˤ{-۞KQ ֓r޷zM} zgeN )a\v+N]M|Or~d:%".E݈CqPo?OY#>7ױ5b4 Rkkp(KޠNV2eP/g/E+_^diN_͢^PT7[;̤`gҥPx+u)~?l'f3?`msC*/PFp08P0}zlm54Ge9ͷdzj&Vnvpa bF(7`+va ?[',jR/;S~Sxr%ad1n~*{ z&Z\yfic3=ӺbsڼPykiVH5S!1ĩUo}OL9 @Nԩ 6湻);xfѤ,,7؃F0wV?0 v)~N$Ьc`v=OXƝŌ 0.\ C tks$zsد-v=N)wm;Ci8Wgxep<Ի||~޸D9")F-]/1 1O[Kz2OdǓzQ0+3 偟~-#`~rƺq þ\ʅÔO]@QұCg:w@?rP]un.;йsg:[Sw+iוBqb5Y$7A侼tzc4-D6e{ppO,| c,f?$)f?fm#bn&GFrj4fGx.ĭZbX7e:/Fpy| ZԹ3Y>@X\~H*4[x~ˏ{+0aOjrM>êُzJ?c=ogHc~|Ni W,t x0KTl%'`e=JX\7o&8љRsj@f/Fp*/?UCK){ ߱Ρ= Ro:Df]ԏ>?6/z^fHR` S,l ݭ,m_LUؠ8X2G34*I>hs_8up3D>Wu[P~FPiCjc] IY>up Mxh7>?̄9|F },,a{DszK( v.}w, )""?9"˿ WɒAUXn& 9{fHfB*N^fdgØ83pt(i0.Ef>OLqD^ǔXq,3{oPg|QgXUjwo66GJdt %0 @ƾ 3bH18\)Hd1g;gR8%aՎ?#D%n댣M"eI0jV %֍~yO#vfAB9ûNж#j8| ݬ8z}]Vkj/Qz[@6oAup؝æ*X ,C{) ))EԙZ[V d?0WyM}5Tbu:VNj mܣ_xR*oۜi|hůGsEܶ \ m8míkڡ22 'd/ᰛ&I~Y;YiKV,Ų =f5wuQߕ|%#J8XSy.D`Te.Y{T4t[k.͸2v.eޅ4L8/D8.en+]fUfȗM>ɬJunI+ۚ1|Y}=X6^TFs ֏}ds=^L_aC۲  l-^+v&GV ;%33uQR `h0Ӻƿ5;!eؖɟ<e+y92^ȨoSz aōgW[:`dZmͿEVtJ^hi`lx6ydyR-UݖE{[K|4rAJg=yx^e5? ț#,h4 Q|eeۀ:O3U%#o۾ /'2y#ܷ=i'ywyG^eEvnQmdZ <^(h2$p-/HhVr֬jY eSDDDX_*mZ_[WUvgmFrp\4k=hu)Ʉ.;p{bTRX5ΐzp'ǽͰ}7_'y_G[~mCYq֜ \8 veiѴik $Xd&)۰5hRnpD԰ʙ fos()$$ƃ%sI7Oz73|-BEq`knv(L 2?zqWҽmOH(+Y塚w(^<\98vuǓ<U)Orc"&3τ7M՝\WI`;OVbȵ2'cdCL%kaW]ӐvAef4Q\[^p 5f;_Eq9`M أ2 ̦[;/w77g{@uMϙT161hx>ٯ=;~m ^&yZ12(_MIPAgflӈie#;[;]+EDD,w v9skskSv\ fkؕpc^n*f/3Y-NIT :uSkڈchٔ,ly!;prq1![Ԁ,Z5& O1`m:ooSJ:*JYk $q|9QYs4`BˏBnVH?0=P`.aW|:Wc761SX*M񋧸MrBG7| -?'hwGt_l/lԭ$$ܸbO6D=D߿1릻X{. /@L̍uB;öGmJJL\2isGsҭzEL|"ҕQDD䩥`Ҧg=>mYM=!v:N|/78aٌg)Lxв/rActO88`kN#%ÕmǛ+d)'%4 \y>FvHT>DnKØ+EuoĦ@~RU]XͰDHyr}QߡX1~+;&s litt ΆI;?4o@j ¶j%wTfw|m{3q0¶4xȼiz/R{LF̭ʸ? i3]c`NP t#v02}|7q:z4fGx.ĝ~k߲qP5sڢ5hE|)D(dzεcH8%^ul,6_z ElXwG\x% 8'&\a׻6F5;-ynct+;#}EmjE,ۘBঢ়>Ew&9_'lİnt6~В!=1WDDD.y\'ٸ; ZiKz䵀}Aƌٗfqq0f:̮ ?l!-}LG72HIS}{sn/P$ 8> 22nϜƵG ;mjS[s6q!՛/>lEyqFhyBV'K&2QT9*zKXї2'/W@"E(^a[0vhC~NEr%Zp;gH%'0C砦 f`~!*gNMT7JoRnZmuRJ@הżu:̍  .I$c_l'*1XM歩c"ʔ!z1 |[^{bG].ϡS<8ԡzZ*/RM r~3O3K lH9s ^4;YԿ':u*^;oۘHJ7q='^YexV<߿ӕW?YN\~l7y,L !!9}R"<퐴b(]!x;f|=dQ$wK2ùK|w.j+|٨PcoMvOmw뫓!eԙĈiˠC}ctq>bqoۡCDD)XUZ iBDDDDI6j'<0ضşE8.R-jLDfe`]>.}Ӎg^4ԔSXNg̷Ys*4:_f(:[8;'a g߲dy*~=>f̉|wQU]~.{/Ă (*XĖ[4V5hlK[+ X@Dr)qEM7wXK9g̞=v| o"[0eھ7[xcW4oyA.&o!GΛ>8qtD:FۼǬEŮ<^ϊ{^-?މe{QdHzx{P@St 59!/9z%zYTU>Iȕ"6CYeVhn:o~J4oH_3*@_YH-@Q;Ws !LΎVfs.؄_ $iܨ-&HݰxCnn hqSGM:Y:!$fH*kenyqs{iNp{T6 꽂cM;F@|9Rt mGtFf)3G9Ol$j߼/3'`Q.gi"W`[p6cuUTu5p rU 13V쾌Q#0ŭ ltOZ؏y1o4eiֶsC IO{.r;2Ljr j@^>ϦX/t+IJ$GEc-J .Y$g&cYuc)]jHÐXEPy1,9`%Ԧs'?EXz ;)uJxOr;2"M#ò}3u3o `=1'ܦu!1(vFGHރ, Hxq/߯B^?%mO !W2Ei9i&{[P #m1珹~!u'ē+EUGI2/^b|7~}Y\(SCCS,?f$FLXCCTU'J|tr US8^,:W2}%Kr-\U W$yU4DLCYCC1'#JnKY|ѲB> 'Hn=~MaA2ʞ;}Νx g'a`'w)ע7ogjfDSS8'}xۙ6Cs>OkJ֖e)E1/ϰ,4ʮdv0Lm=cr EoWԨ[׻;ήo9tJZ'|H4M[zD0X*k*F\Bz͟2%ӷxp'1s1KnbKwzOK%r_7ax/;aXj@@#|Ix޵)fÍ_NIV+737jsj bEbHd.wI{,b8FJ_%`W").(^GA,Ĝi[GttA?G#ٚC{26>_`LU:UΖ]{' <Fr9}-+joXp5ήI-3;mNC(_KbIC}(ǚfr: ЬN-iHmRϹt%>yh3#顩p̫0U y2Yq024Ŷ͙5zME5T"5 " U@[YDVJ2W}^z{6Ob Syi2g |Vݼd2:[&Աc]L䫨M2k1zC``:CA^IiJk:`nHƨNnͻޣdŪz"$3'լm@+ON_ǯq6X , 7'Z EZr7@o2[uGKHY R5Փgd@zMcn=1[aCp˅#G?# '\Lk<ݚV_g\ںdo@ wiu7{I(e' G-L[gx@7[wzrEV "Y(HŎn3YLm|*;EDϝ=*՞x(112/"VF@B^/[E*֌طrOph9w;W?V@c',XQ4I% "=L2b +lڰee%u+R9b l-*Ҽ5M1{GLidnhy,˕BQxAlٍPdfJ1*`խ'N0@>sh@öbq[/œh7FȒʶQh[URb 3A/xo7jj#V0^^>>д4WF5dʌp5{tcֲvLȭfvzɣ9  `&^xBwCW|]nTuU$%stkkr IDAT$!++ؤ OT9%;0 gjUTRJQP@ ;q+Fҵ.ZϲZ{L躐|9g[R3Zw+Y4Ţ!.}3J:n8Ιq-)A ݅r=f]x;|XdN}Yi([M)d]z440є3yi)40֌cuߘ.4i`<\qsn9Uo%R޵ m4r!/)9 `;iǍ>hS@Tk "(c%_cx^w"3m&]zv^ X3l*z_A ߅Lp8DdWy*z[;jbkhBpv_&S߄PxWtw/kQ"%T u+%#o PZbɼ};"_aQ/)AؓQ2S0%T}c7 $2sWϭ2Vv gDtip^QY5_ʂcHg{H.5>(_~V'":U> 9zYFDul YG-n% Zw4$#-һTWbqCG2jèv:؟y#IJU=mm|jij$.=$gID}JL]ii| 4*3E4.@zvF#KVRۇ ic q-$^JyBu`_t ߐ\&XDӖ4dK2^PArwhc Z4~Ke"cU֮kS+.>1EʀҮE Zpˠ iy8UF˶8l= pzGkXԦN>'"CzB )4֒CZ訔[O H1@K<,eV@3KEE@GSxi#1&Sùb><3k릺mhgr؄gCyYQJ<>9VFhn̠^]RM= ER|Х}z1|ʊca#M%u<wgD4`7nͪPѭhu3A3<ՀN46D+)wynӟN}dM.556u*,R_Նj"J0U_rã*Ȏ9rx3NR{'FJ!Fm΃;7qx,-/kLWi03;//gKq9蓃]c3f|퀸3;RkMG{Lcz5dԖ.g΍UfFZ#~K0c0 ǎlekݩM 4JgutOg8TVɕXqdSeeU%=5aǮ,j5o9&1ah%{F_f]F4p;&j]'c'L`޲5f16/C}.cVxpd_ ]LG Jצ֧[yBw\w I-Q]F^ڢ;vbVAo;.kgEMX@o#)Wd'kw4)[p*ml%g鏳Qe둜\Mγؕ5k5BMs*x)oZ|nӓYop _^e{y&ڴeܪ6a˴Q?I}>~+k ߈߯kW#aJ' ^zI DGET AAA888 |}$X9͛KH}제ӫΞ^$9) C-d$O>T3Ǭ'܌zO!4"RtI2H-@6{:6~Ԓ}P4*xs4 0uY> ߐ[ОmmILIkc޸F'\Afgz,HDj[bF;h4,4&tȿĸl8&?B7V@@@@0(@ BT!&` ` ` ` ` $TCB3|W ^ME Q_q)> l/;d5.?DiJ}ELj~şqndNCB |Z/ɐM$,2w=Ğal;d/@{[/Eɮ!}!?*S'eJ;H>gշ{GL>Jd|oA0>ώ! 2Dy|9y63#T |ENA!C?>oi" 0p'ⵔPnE M;"?\wٵ'Me !3{֗CXGE^},ig`l ܯW:m1IN]i2dS{+`@aKO!"k.is'ne_oTNn\Dc92/[CX;6q;6?tUvQqqMP!vԱtܕ&]rTR0/y~v3RahY# ĕ~OUZ2g[箴1|7ѽ\=ɧugIH9бsO>5v^IR}R}v,)c ]w0F2.;u-+^z1zw /*ׇz1Jv%yN]ʣU)SWԕ#)]Tzdzƒvj#>[=c>@;gW Yq~B1v2{\A_NNk!%P}er9 {%2SyGgW:)3ӣ'ͻYL9~4߿;Ǖ_V1/gSzo΀xK|'{gA|3T.'̿8hܓc'.wuʏt˱N+?Һ;=KenT&~ZyƧE$ubE%̥FC^]Q]OM$vDˬ3&e׎V{s]$d<:M?0 t]l~qfzXѧᵎ;ۍ9趞Ax;פ-Mb؍,̟kAcܷ$sz[)ʷoۼ8zo'lk#ě0ow]c Æ4`Ooik##4oK_sm"7gED7A~AXHV<Y:μl̖%̼elMԺ L\h]iPFŇ5wyFDۯX-y{"Y %4ͮ{%.ZhTܝjW rFzUd7 pzG\m8ju&FscCiT)S"{fɸ|)YlbDo_kVp4NoI?.hFV-V>NXLus[)OdokULUUXN=ټ% 8vW#tTQӸٚ&?c50v6 a% Su m|+RGCD7XՃTdD{77*ӡJ&N[~82=NIH69 VM~!]@L~k!n PABilW;q)J~ABd<3>hv JEMCg%]Z;/nj.+꧘&Xc `=þ~J |^bM s3F!u:`ؕD8YiOGQB,X] w?L0Mq3X۫A9 xhυdl~l!ұ |UXN =W%y=Ur텓I?v?.gVXJW&<_e9:݄+ə.n8xlC770޺ywz.`(V֫Wvg-. /Y+3x+9tFo5E`3on~ɰ>m]źq?#[vu#T6! D Oe ns馯hʹ.q)G0%2cU)lWcQoMW9ÞgCXO}5`97 w|/3Lk%b9? +1mkZɄTգ ᕆ/}}btLc%}DgJ,Faax!Ό,1Fm߲;rz|'eeRǰ*BT^=ʞ}z_#t-ѳܘ܌bQ2ƁcnSs j%VM= QVX lk6߉7^th)fvz27[ UVy3CN\2UE=$>;Zl3eC=ϙ::Džpڣ̚JwaO<_A'N .h!8v=p*=w~ҟ|TMp2ΖP?Ėw?T M{7%,i6-ǴFW}WMDih8MLҾPs`֕2}ct)kcKw8k GospI.B"[5Ƚϕ4_3!2YcӈemJmmSHDYu}[j=+~fiqE3+lۖ9s}kITy81z ^jp=!h<@=^ !6[ Y73LR2ȑY8I7"paVS$nz82::0}71Ux.iڜGbLmli NLq`Ӗ6%/[=Iֲ7XZ5@w.'\<}q#\*G6x'x;,0XYo7 @ |4^_" kWbem 144Ų*ranJj"kGyL.a' UQ`M|DyWIdPSQ۞g%]C 144HLi"FH%t їu3b,fFh)]xo߯9od""5ryqKA(e#"^%Z(EQG%Hli yhu}on&)޼tPwƝ;AθON f,7<I8>E]ozk2SΏ,J'6Vܦ`|iMڲA9fuU/A3-9W CL^ix% wxܺ䙘E0MNa_{o—(F|o]ȣ14+"w.]ɖ{asǛxO;4$&4-]AРA]Sc&ּ}xk4m9ѷ\jlKpԋ4 98ti.ߊ`\OUhjk]])%Q2wfӵAsXQqaz?\CwI6qdqW V\|OR;~^@\uI.O&i,g,bE1mlIR| ] &\IJmZ+kǔћ=?Tu;޲sgGO8})cܫ7s]{?V$$@qy?XXȹ}Ys8T_x [ekO6l_c;k 'PO~dH3A!ʹ!VaE6F5U@-ެ5lͯ??,6x+rqR=F7>%+{wlWѰ\@x@o) R}0q{ gPspq+ƬHOm~[^ Nsh ֗1,,^å#,}>fmT8*h46yR `C@8>q mEl L|`_Ոkx(>4#|R~|_pE ʏԅH1 ǒ~HѧkSv_N$sfv¢Ve C,nevLHPj;g+&R>Ʊ #:'ޞԘ^;ر}#,eZMW|j&+dٴR@);JWLzn^%M\=Kڐl)NqCC2-0m’a-Q$Lp>QmgfiiBÇ|{4g̮RZthg.\?t^һ%uͨi2s*B@C2U6uI yrS~)ts,\z/.3 /4'hS,ޡ>聡>'rhփ\3"J-[*&>'|44+I@Ԭ=zM!+4FZr=e70}9)xMH!h+JI4EH .GcSJF*i$:շn T<`Osd&:Ƭg̚ԁZ3^Z7?Үdk䔇gesjof0|)Y1.ꤩ4ոUPQ#C/ip~ʧ Ǩc9t:ӿ=͌?~R{#$89Z}ӂaTW=[r&[ ,YȢvXR Ov0lDRGRvɈ(ue? 9{P_6qjmAUYҦ)ea[~z?F|Z:F`kjz]~\3=Jj~ {Ϣ^;TЯ^ڱ>6b.CwKW1S9Gʢ:0 0nCi+5@}#vVZV~Sw;٘anӈ;yw֥%gX8:"Zvd9q <}>qCiWgs[VW2~Z1mFWp$&YrwKUoŜ.Ky\=l0B>vLyRr-"Ѐ^- H {jթ%N2`B)E*vV15Zt*R^<5xtg{pLY8" [=*"Yx_m컶-=lbB[5JztRkFgѺYW|2v;Ǻ~C>w4д'pf/W"DڄJ$kXq5@< xmRKJHź4DlP.}\u)VŨ"I`)$HOnP0y +Cq1< }{e- $42@}̆PMyt2bj V-!W,6ilamεѥsc;sɍpH p]zϵ+sެ]$lIςWY7Ρ:M: [gD3q1gՔ̑ަv8. ތ"j[2U%[L;N +)3, QD|/<P;ς!+\V Į 7R@Z@R@TiˑXYOP ۊW>#_lt-tnf'd-iUod{Wd ׹^eṭ`[>E u!9ny+.S0c {6DED4=bqE ]+W{U;}; ڭ_GKvCnM.{ie,ı\'_2PAuVBfrz&DCjAuqG=^Ϟ6L,lձ% 0v_a_lh`,&Y^6R?M bnJaZ@RTTPMش5QdU o&YiM _!;k~bNMvthUYOF&|jJ!l}YIdkc'u]>hՓ* 8|7.Wlg47gl#h2 [}pva2LQ?ZW%K9;e=3uߣKLw鋽K_Ğa(rl4@Kdiȩdf4YGcDTrXWLht.OL6 >fySg0q|XႽ Dd+ѥFU"KR%<6 S'6/ho2ˡc=dU& jfWW}8^K Z"šin*@ | ]B@ oԕ@Q%_١:zF2)Or+;C=Q5 ëӄ:J"%ax_X޿B@r1R k8A|Z9|k[6g$&-6|ާ NNmZN4P)訪?Y{3EDd|Oʏ s%m<QϛXiJ(̗JnTG.݁.&??ٳW̒z/ N]>}->rbdw =4؈ލk;UI[{O& 1R. =SNM*K=%4.:PxTnzxMk9%K }?x+(B3UfDElaE]P*1<}G}PDwC>@֮\I)E蛾!}MTL.MNa_tcSMMtE~"Xe[2?]*3X@࿋kA v`G&}G4%BUG'(cDŽ1Lys-FXJA5'L`Lmݹbr;/G`:o^@ W_q3S60]ԩS:u*]"5zRЌbXⶑ):[FP 8b ?#ZdFAѓ[:b4#flA|6qSImn`mL$yc8h;@ \UPm]ןHBCdB~v󆭙PnŌtKDsQvtxc$,9 z޻Yt3WY&1{3!v6$7aդIs1sHgDזmccMk]\h >ѩAlrNn`k;gaNN=it;~㚢5΍kL ZC{9VR- O/,gz#|ؕӣ {NdA / Y|F,ةxx‰ kj7UIzzowFS,k/!?_R` "'w{ ~8Gf12NVui' KlIѼFu)kPuzm-׹#"#7M<!Z@CU?q ]*yA4tq@eq({.,ΣO%=] U PLvGTr+jbLrBQ9֢~zD{$%;#㝥Jn!,3~DGԣl07y/w_8 dBMO'!G$>|uj5̠_No)[66W-pj$)e@= tř *k8?( J(Rbbv3:13bb*H" pPԃ<3s9^ku;<՘bKnã^( 0)^ЎYC'km^͝𾜋lv–:]>I63|rЭ[*ˮr.7`\ uXp|=k¤}} k1{Pԥ&4 ,?/<6tJ:dեݩ}O' MWK fI%ߝAb Ǣ@U]4s_kjBZXń?1{F5FcO1\|{G[gĮYQ UMOݠm19ڭ[*+iEezTy?82$ӠlѰgo`,x#L vhgun߈@lvɨ+F%MSXez^>[w.;3p 1Z0rz gCR^l_;qY>in].CN<9i8u`G26ݵ!+H6,BCX-78zӒ51.LI31fQL斌q /y073W3{x?M7g!x~LR_3n bXVnŖ3g~l2]TZr nK)315' aN2n7vrLڑlA =>xPHLzܤ@E:)̑cUtr|>zY´gC.^|=2{zg2kT*ﱦ>#xl]AtwQcGeK5,^:hS + }2t}2*G[5Y^(ICGݏ=#'=V|-fm{2RtidefzvDO_Mg0ޞ.:lܽ#/bx3} |mW\CUaA[i0Δx\ʚ=06lkkg[\?0y8w_VӴhv%)ӎzPR2%91?Qe'Q86Xd˾4Qg4ή>imJɐXz7u"Wٽ{hlb΅lM96: sάBMV.o8ڴzMdol_҉65ȗ-wYЬqƍݿr tdamgזyQ ewvQeg:L]Wc,AAr?5J F;. ٕ֙6~'Nv)Tucǧu*A>k0ޝ2_T|٨b!bF}5~pF~./:~=RǵDv؍>}%:37Mk8`AgfTf y7*oI 89kń?ZrXʡLyB>B qq7{0]gpz .3Q]>zkǰ寮غdgX<75ĩ~[M9~Unήn2I^OrVoc5|>6"NsTsuz+MsчH9=jҤ͆f͈vVeN?ήnt8oCU'os/= 3~x{?{tj}7̈ԯUdч/}ʱ9Yus|. lI ҏeX3m'X^w\:q 2⹻|"۪ŭ3wT.]ɒJ-{]ֿcY̶B5eW^xS [&-+' mzݪk 3Ct;,䆷8b#kdaM5OSV;S~KhokeZnNo[Zf>V׷FoAWcҢ's̊g~N_ /a1l,] m1@w|ze3ћ5rNEnlyC]:ѰBW;;sϖ>!G7gϔf>kf |3`X/DPi/fؙaۖ&L4dff-M1fh[QwEm>a?_D.s(A@֯])l)6=Kn`JQ,p#q.0=4(ȧRīػwM&e!GvVmL* ޺k}rl<:3MFkwq3-K{]msȌDgЏr)DE^os` ~*=}Kt$>u*C̛Ueʼm?;8y IDATw<|r߂] kڹKDmXiFpq f dQ[k7ρyw͔,#wCKz!ɾsآƲ-3)3ٍ,ךjϘ>X'Md&V8^[khG殍<{i\f3OG"G 0IIlowv+"1_3nL ,ޏ9ԟ_b]HgYp.s.izxs&&ff=olG-fS~R^>Ț8yW~libƫxoZ܏op2uySka cHD#=E`!e޹.DΙΣ2LpX?fq*2q? @`DMuv3?9|+t1JE)l:Bzt),>k.ZSiitlTGqi&)ƼR)Oʹޥ!hbnm=-H<;a Y:/66\LRs:k΢ڜ3$pdvbgVYY7. =9*k\E,m9Rne@[[8{*U=~Z[a鹧I)Jڿ7J4DELuD4 c֟j|4` 4!R%5 7xݻbzBHoǜ4ʸ9&/4= ߇;!۶d|#4_[UqEG#q1TW\9`[-i(+6!UJYW( =q*tKY:IiPz^sbX~^p2m3yZ9.ahŝc:ڎu ܋e|?| \/VЦXXaD_͗}!^YܟzVy  G9PNmmfT o(8e>؅maQL.ڈ\M1az0cmO.N4_"oň͜k“4Tk405%Wwtr*]W^WW }#K~>ٮg̩\=Ē(i?ugJ.i=C{s~d; [k+ M(w'e_s˛AChY,d{.CAܻ0ށPA{O3`b&X[Q⻫:.p2PB=LXKOH+Da'w&OHȋ֦fn&f]*'8]Ws`Ӷy3mddB$S;5Ȗ$2 zf*io,oe ~m*^)0=Ytכ:eVžu/ۯ o/67az*Oг+ꔤm^Ԫ'78i-apUj,Wz}$%œG,ϦDƊ6 ⹾d3lvK<'w[6M_xs$3oq_"7s6OÓL\ssٻ3L;34YsGW18#-ËL;'Wm^3Xz{qc|M_營-i{ǥ\oW+9ey=Z${8D|Lfƒugyv|+_ctM"VKRFr[*^=ݲPeTB1tix:&ڸTql"3n<6cf̀BS–VMrBf]T>aX4K)*#I@Z־&:!\ }ݏwY*u.EQݰUcB6B,/¸0EFJicYL>JZtqquube3=jkæϦ{o͛ɘ'~'Qn5+feq. -X Dw~↷җ@?U9)2ΣTq3@GD#g.ݵ\{u^_[_?QWhp#'voaP7*(jg)t&Aa]OgjG]ᎏ?USKo.)OԶ]fݰ-E_p'2ߎ#xyJey>b$Z]礆{bʅGnG};Tx4,cKXd֍ٵL?oHLC!sc _?r/1hks,Ju t *D˅]1 HnY;NFXȧ}I^g/bصmҵ/H.ac3<:uꔢm7ݸ}5pix BTZXI֕r|:/E{jliPӆ7#R^Ə}xF^Gar( ?rY C*>{>F UʖK-Qʞ* ʼ&rWl$"-e0=z ޔ}<О3LEiP$靥|eG gE֎{b}¬uO'8=~pQR8g))g`vh;g^Ek<28u>vKAhn]wQei"a e zȟH-Y]<&ɟ(3 -4~8\ C Ju+s͐j. /ۙMSŽw˫l=#28]lmq”CҽjY̍1+U!ˑvG ρAN"21þzcJ/Tv(r"*M 4UUz*lRWn.+~k,n.G|:*7Z)uu.oTTU?wi3Yl1RQP5vS {/(g;ȶ =vi)kqoIO17 E=ם_Q wOP?58Muz1 tK߾eL^̫U ktje?ҪcA2(JE :u1~~:עĵwQi-Ɉcq: pn6]ؗe;@7\^m[2:ޯ,ˌ" Z!cih,=)ï [<4"t ,]SdmөREʖuNz4YT_o:Uyߣ:20Sgj9ZuRYp N5eIQbyXQ!Y=*扏y:6s}pz?N%omE-ӍLU<ʺGe.DG{=23ZӑE_WA\lWI`v.OVPnf|<7._͏qN2Nd^{vy49E6[2~\QRkcݴõ9yK;!__K]jag`X,7l K#o=' la%- tQ~DЖ6ft-kWU$c 2xS UQrϘM2} h|9؁v e$F_.QH|ҵKlJړ7+ݶ. }WI?ҰٷiF8x{ӷc(]ZAӣ2,KR_'Y1L%[f0/I̋R,o>2CrXu]LqnF"jAՉo;t9'S,gi , ⵑTwK"s =ϊ˒qJyt o?MjVy/}q|?p6gjMR<հm8<:y5i +#Ei@+34n^bSx^n^"ҴV9 Ү"`DzSc.vELJ{op+K`pD6U1y)fe-`}]ejDY4@ \ܪuX=uѠ.x+s4͸~=lǢ=^ʛi|P$%< Nt*ҿ g6'M5Sx2cOf>yQޔrJ.iSAK ĸV4^_ަrE6*= ~[E=u;eY ( Spn?l#!~%*ILot%k0/]~9zH^N̸t\g=uޏga],@^fSY:S kr/;'Xu^:ՠKIcT+~ ˹#4|SP[$IGdcKB#)L:eM4>Œ^ `Hu F`^%CR_+u|$/CU $-IU#e.%x8~ǑOУd&4E p#(7\]g2Փd4^W%lTmť'*Q]/EI{sAljقx7Yյ4I$&&61f- &zʥD> .S m*&sh ]P/ɬq/kYq.IJ2:Wܺ>]; 4|TwŒ7w!w{q= $RՉYFikmvUAڈ$.MG9{Os~VKyM1 J50gYΖ7/^P,3DTh0~w.ۜ FܾlArh^׃3\O.V6 ˛;|!Bsz.NA?'O?{q/̘]ҟ]\]9# ЬJO1f l LS> 5+9(૿CQ=9XCL{[krǬ;~aO3I$0HU7vc&]XXf-M^@2`^±؆]+D$6>G7rmu< ϳgk@i+ԾbUFCVó`..Z4;٧+V-ύ0eo^/G,*q|/#K*AIUF؀1Kr]7]fvct^٤%K.4VU߳+ TPk{O .Yˀ7l.WFɚi8{A[# 9uӘm*]gLYcrtɲ-MaA[TˑclatA[#ҴCO=Ct?̐cX 1ߥ1_9F/[7h jvcߘFx#\ %O3 |B=}vbzi`B'3y}٪Up*|͚}Yfm5HczMphmD҅ŌQLXCGldMQ3nΡz1NEۼC;}9'|)ܱOU̱[&ΜJ!k+?'A}eD`B z5,[ľ"-7oPc}D)z8eZӶպǻnT^\͜Gx$BtT/mCLٳ+cy[k,9@cpgu|ʪ]oxQՍLޢ7&v΢̟lr|MSY9ua?q_/EQZsfV(]@[Ӭ%2| rrԧYlM[͚#Y?pH%zvei?{lƫ>fjb `؀Ecf7;N۳} .M*S3q-$#eg#gy?RO|#>,\jl_7A|2/vdu3ŲXz` =Rq !#b_VhݺyS \9sXRfIĽ|M'|z5g߸%ng&8\bscjȫ5oߝoHze[6۬u<H+?}pH!!X>i;0hbԂ JQYc^.aՋҴMכ ^E}wޥ ¶egl%#bZ|d B!Y<mcߟĢAR}NBأRKfdJ|e B!?N3Y2[Cs5HB!B!$B!B!$B!B!$B!B!$B!B!$B!B!$B!B!$B!B!$B!B!B!B_^!Q|@X5K/9]\ W/ah7BD!B|@fȜkX~!IEHIʯw̧iOvڇn91 >*#B#k=G8}Ǘ7$i`da]|̑BB\9~{xDZ~c̭SYW? {-j!Ugb});B!B`!1c͜T$'t*]3)<9uHBDd˯'+!B &%>s'w*I.Xf=ȡ&XBoTU5~ vs#,7)J4 `_-}Z]]l?x{1$jPF7&W?`?"^CA4ߋV֙;`|AZ~c*k/7ĞC,|hhסWT6"O P.#}~⧃y9v5ҷku(øh|7oHHHF`1Jக͂+t͌C(NDLl2i 0n=+ .ldJCϼzү;; fuї f6F`<(1g8w}%X|Ηgɚ:ga47Nhn\Ò}>%w4uS&crI:*}|s6q1}V5zi4&&$EV&,8³OBx$Y׉^ѸL1uu)hjSzT+$a 7 Ji/{`)/@ܼXޤ䥠&i1O=G?LAƘPĤGg9{1(utNJ `AP5e "U:: qnFݼdRsE3Kgit;玮bp)FnOf22'-G#"(A1ŸD*>Z@ba^̦)|) &^(]gyȋwY"/%\;1:ox _Scv)I`o6 !z~EvP8nbcwf՗_ID"Jp2W#I$V$TmgzZI)>LȾ\m89$ټy7ZbŚ\xo砓CƱ՛C34(,?$ˇrM45d%hŨR=jgV`e)\_xo8{Vz}y Qo8-D c\<>8I)q+(7Zn6Б+B ,_QΕJ:-].DŽǓMCN "xǭfMj:-~-jG $qdPƒDҡgY W)vJ޽ 5l`Ϟ=NLm>PFELͳ6rQ8q񉼉zA3x$m9lu6kRaJ+}ҩC~MP?Ev*A7Лc ?ǟ H)hIB@ȓG1]#okWk%omcl7Ott4IIH B~ߘTחYgI?ɚI'Y\4q]2d0M $+ O6tT K+^AO])6t]?N;ö) (ҽ4`Z BRsvϦv%%h֨haE9Z-̮Z{EpjAZdq_b^;YPkl~jG`VO|\m֢M~DKfEI|O!E:}~<Ӱq;Z<-٫heS#Ր,BdX(,1f*&Aϼ$ի$}Or+_CE&b`RvES#1C JG+9A$IT;#;+5l ?o )`F=&gdhkjjn:O~ 9SeILVQ$$Z%F0wx\-Hšh[ySxOh"zVltt*oMbAS􁈪 g3]4ɏaA +Td>MXWnªot_Z,՝RjA shߺ={$}߱C;f߶ 7ѲfMZ[11>P?˫>P5GxA>tRBhڴ29UI`@Hoƭ[prG!BY+;Cnݼw*Tr*`!B!  !B!X!B!X!B!X!B!X!B!X!B!X!B!X!B!X!B!B!B!B!B!B!B!B!B!B!B!BT N7d?h[Ӿ,VeA86ٵ%]}?ِ>_!BB|9$M,찫Ӓ9R "qRn ۚ]C.&".t Ж5%䵑5DaiOf]!GOtZ(6{B4(f65|] vY0^ٻigSBCf9|zE`RN p0GIV% <Ǣ}KqxP.XĚΎ-OOp6ވ)p+h^9z,<}[ۆQwoDX^=Yu(~5@Oq=B!$ !4J2Sd0m; Pg<7xU)"+.5{|z5~NK6~.s3]QWxJ5f`ٲekUgq6%kMelݸ [׳V֡:e˖b|eիRs mqaXO"^ИlׅÛS2 uUNj:_*D!rޕc$ m.W7*m485M { 8Z`S!ߵH֝;~}OJcxad)8tOE&.аB!%D e?mSszY.J)Iq-|K~ kP _2T(/2'F"?I H,֘>,_]P/-տA40wXo[ˤMPQ Ai,jٜE9,~8ͦěG1M>Hz}!^ K[WӆxCBa3Z+Jt}Rcp, qwVFB!,ЈEa+tG *|u,oVNG9徨cGgU R? ViPP)t1ǿg/[7ozx4&O#ȰmcG[|u4]w".E]~aѲ" 2َǠ ->õaN蝸AdǟiRO!BSTG| Dsu]{LXR1^`0v6 ypW8|/Сhbo{)R3w}ntލӬCJ*(\]8;TT#u: $ ښZ[=+5+PuH*1dEb+W rW{wvbz|W7 ޯP,gFX8xsqӤ:WZ_~0ARQNO[W9t7?硞B!_}a;{g'e\WҢSmT v۰_"` z5?)d[5mPB֩qIϞn”jlChpf·|ӳ'M׵CW/.bGA0\{G/}v'+.孾0ve<4g~c\Ytu.>̓0|wdC5][llpLxAs`޹\:=ƒ(^&XEE+8W95B!`!  av).JcԮY+ Cy\G1HBEjuCm[CSѭm BJ)lb-G!=))P@A`;4*OA]272@>K*bc@)3{{S;DXbq9{;Ǟc]2{-5mgfKvLJ:\cMn=pӏlubf{|F~M꧴m:h:b(mk|=Sgvå^S\.2 R)E^˱՚:ϯõfB!/QjJ"(0G~>*7 _7jqeEWl9B!vqy߾2Ε+SZׯ9KB!B B!B!g6}GA!FzB!BHB!B!$ !B!B!B B!B!`!B!BB!B!X!B!,B!BB!B!X!B!,B!BHB!B!$ !>ǤIS!BG:B|LdZYNه*? gU`'۷>}]94赀 |Y>Ǚދ>Oyos~s:GNd.e6vnF#N] IDAT+6p~I6"1[$`U3'tBzc"\"Fߊ2m0gPlE9_D"n=\>CLS/SPz;ƎF=s-yz%N\Fu3a 8Y8Ҽa~=;9B!Hz/R&U=DL 2eebm[=M ZapʌYCNq%1Av Z&6DgLz{H"Y(tv1sG/U{ʩ5#|g$\zb8k1pVzQ 8bՁV 3qB!y$=BҞra'n>$4> c2_LE`T2Y&ph@wWr{\7@Ž6 +rzoӐ1RN)< 4x_v3"xdF&dN7Aň0bZcn=zY;m!A6y+zGܓ5 ?SiUO=0YVA]]*, 8pEtZ2 +s-%%f7UX?? s" !B B<&I %A[4ı 4jjRF!/S]:r|\]G9 [ģ%әU+:TC\*gügk- bgfx.q}x΃ap.cwgٴئ=׹z5g}}hMolY i+=# bA„B!`!>71 6OYOI|;XgI?o%?"c V^o F(ۃ/.65캵TF1` :@,FXEŝ~X;\i807w}`m| (dElL"z:T{FgQqvSaKLX'H0x1!B}-M _æ#F*0 : gyT҂虬\2Iz0HG=HB£m?y^g Ay(}L{N?ݚo9'do7=}Ts|1$"Cxp*R!3S^16pzpBHx6'Lw~+ISjRO3:Zeq=".ED*<܏kV0L8a%B!XZ_ѩx>ۗ=1x0* oמ OcP^|;xçrB*L(X0|b..~w3;=Work&i0Tj ~? #!]Ez?~'^)[J_S- ~oO /hO/ n3SwN}vT+pΏp3^uڝ/ʪ&]jq{B< u:2۾3tg&s8K@ zSBhE?4Ͷ .Z>,][O=yY"m4gɎ[#7qʲCgnEOX>grgJVYѳ}9B!H⯢iۀM0-M=At)fpض4N{0P5icB#^_$l+WPmШv1v(0o(ߠK ]lމ;D)6}_F\ae%u&6bn +}|a]n<Qkd&^=ѷL llWDPgy-%w9 1f?1d ^+#-#V;P= &,މØLVU.?IGUdIﺯRq3B!%yVT*x#"ox{{, !B!ĿX\|mq\jj~]^B!B X!B!`!B!BB!B!X!B!,B!BHB!B!$ !B!B!B B!B!$ !B!B!B B!B!`!B!BB!B!X!z[hkB!R:B|ԛ gH>Zb],ZwmyKi#!B!!XŐHuU` 5.7NyL!m$B!? 0صr!3x@D`ͮS<~Jl\:Y&X4_GxvnŒBԒ[}٥kN\QxJ]LM-1%5pe.{D%5ʱM+wc,P-{0V}O^2%mC SΤ^4dT1TA한8{MBI4.EY<0uy"utlv <…9r/XWo1]nx+}ys[G w.gkƥϺ4.F39L G˱? [~*]:z,^S!BIMZA( g=&". XtLC;.K?d,sg<O#Q{ d ;HySB24HB~~3R\vz(3Ҕ|IQ8ȬExݾ_j:A792Kz'_DD?.,i ƮK|,;`St qqC=8`8|yROO!J'&.Z΁+YToCI%Gxkz ~XTpy)̯KGaFz'J6`xvB!o#=B|VJ|/n8*B15TW@afzDLl" G1c">"RXE]a0TPd\7"^}wk+Oeiw#ᓙc3j'~ͪ^5@aKkM&Dqwޚ/tClA[T'Bj}Jeҹq'j $U% G Xu9=Ѩ8b؜5;PCOlH738gӛq勭80u >P_}ˎzL](w_k>CM6dzT7TƦq61_!B~ Rx<\sœan =,Y ߚD"`C@L4Z63UNb V.j)d&''>ؒelBu%JO"-p(<9K>Q*U8-B fSm8ċ>ݗt)2~+Z˷{ǎeeOhҫu)t!,Ǚ`ok!JRgT[\Y*t X!BIGWCSK ,K֮,eUa^ !k7MKuv{ö?ey!BA()e),Ũɓ ]T)<]=>z3b'XBꑑ3aLaMnĶO^_izucyh0`o#}ClǘFsWRXSW PҲ_.BȊYֲlm>{I%vu;T7V*:WpQeEDe`Π:ꑧW2aaĥaX>Ffoy>Ǚދ>Oyos˟%`S{HYa7pи1]?"$ꝙ_/[w:7gdѐ{'PǢ.hVg\fAm֭g6x/{`釄$nH.=J#H7`?ŪV|7d`*J8T0&|Q滅9ި;^}6tS`Ty=~ɖbq헓<;:*0yۏoh;b_q[Gb\G;guO||D$kiA2.$ת)N*ûd3J3vUfd{t3k属I|G p_š m),bgX>cYo-eh%VXBUɵg1hYZb"9s¸x2#IR`` #EZl</=$6#Ө)\z ?ґ4yy'ٵe݅6 '=z<ƭ';q:(2~'Ο&u}uJgd̓(z|xnmfw9z'[~gz~L:UCW*62VOK8dž/pjcxڅS[%] Nb8 CDzo²eiYer~sW'B7,g _2X783@ έRx7ngQ/+l*?fU7;GҼh zsau zbe+‚pQdHY1Xu1Jzm,zu]Tu]a;=P|Yp*BTkU <-dZՀ\*[綜WMO0sȸ,'ãIbn 4(@/5b Yp6&BdVZaY@RK2O{[ׯ MW9X mEm0= _x5v8[_pޥ3s4N+0olj;@al\"b8/yws/t1.MD}c3,R0 >' =,'n1Tt/`k"S#EA̬kzFg,\{Hfs"(h#;PI$Pd7 ٖ1s;SBxY:-߳r3siz߅*QicW !Ra@˙#'{{/HsT_gUM˚z +Qe:@K󪍩c/G5h!?iُKޟ KqWYu<Mr5VȖ~3m?Wѱɸ3ܛr_Ҳ y)R nǀ+hpamI#Q\ؘDgKuzFgQ_vodY wk~Da o^SIS RQ^!]luLyz#ơ>\sGY0ȓm !BЃ|΄||-6CO+5RbmљfV( IDAT%/Ѷ6s/؞b6xA|-AO$oOYPf]Tu_'d6YPNgS񝀩$12h}3s s_ɝ,U/8:f iY)Gwm]<߷$O 9(V 0u8ӓesl3:Z/3ޏTt)6Ej ϣ0* X 1Ŀ3k>MSU ';mxCgur_(5geV-wBPa N̢730l~/̏ږɾdkv(DN4,\_~EnԾ@B'A(ҽ;kŽm'wH| #>oZQq\3dxodl77{'/K,6l͛\㏷1/N;W˸ khuHyw*cWqi(.clWࢺN) X)7Y[0iђ84:5[ '(<t%/0(,{]18OK1sPx_τ`Ԫ k+vΗUM2ynY_PuJ̄zg)dT - zȑٛ8eY h 6a$HϟonoB?V( xykSZz*h٩"f'V2g[%Ӥ1w@CF—:ƛoRT}$lY̆ f/;4۫ \׺!+f1!8sWQQ{TsөB'`!>UѶ =bx{3d&4dnfFv XrZyM^$,e#N_ E;9.'S$}/eث/+oF4ָL{oKNvx'O c/3q[V0k$ 2W. t)ᾋM>ǧVD/cl-I$ø%gjmzÊsq=_d`W7ziJ|eܧl{l*в=rt]2鋘?[e ҂)s܌~Ϭ7]~ nos2e"Vk<͹~o\!JѪU+Uz@H8;;KC'>e@Cs1#3Xe{ܖs4װ{o:({pwV HeB񜐷/B\\/\2ժx !#"1o3-3*ҭY^%Ze7_!?D=*š]v' !BHB:! B!>-B!BB!B!X!B!,B!BHB!B!$ !B!B!B B!B!`!B!B!B B!B!`!B!BB+-!*U7|~Su9[R).v->{zSJ/o|7m6g><;NEׅ\gp4/%c#TѼB[gɾyXچvcr-CӅPcNִ>i皽~s8H?g C;ҩH6fy? v{'#;JH^}n۞~E֫?mqqה;?fT˷լ~SQ1rl:(rYJr!W7lhؾBտꞏTfV ~ۍ[RpFK>ODiMFɾy~ʃMK:{Ӽq3*6ͶwqW_¥^[xcJgδSk2Cٟw3|ŗ?n|cuJ&-Ӷ';|8_NF/ZRI[ ܎yRC\ Ȥ}O>/0Q3*.s߂2r˭'89 0ަu.AqWF= # lN@qu ߰er/*ɈF(zN2nK_O^Q^=wݦچ؞MZ=K?mEW:mcƃOi0_# Fdn8CHvI:GPoJ14ቫmʏד(O1Q]fhz_m M{#etbU/ax&\ Gm_I[8U׽3n_c+X 2^TW #rVA=^đJezCfOeƅ_b(-ӘwϢ1LxwF.PU/7i.|?2~q8 ^P ùr7U4t+7]7g}OSi`^j?wCf47&4*To9O)(׹?ZbΦU<3ikj}ٺƕ7Nn,Hۆp><NfuczVEKQX?(3SQA)Mpdd=˨/M”  F{m.?)2#5u߲$nɠ&2q%Me3^P}o"]k壎yfjG3I $ !t7شړ>ωV`jjIn?0vvbb6odGd0.TZgu[ :ŃƥehE_gyvݎ#è,m Qo͖2=p9/SThbQ({ǵA<ٲa'}RPхкP>@Iо_X}1qq$ehA!/5-sn\W `Vfݟ\4eJ|q$IYUYYƩuvjCic}QF9v(kn<Ӈv^堦SR3z,c b`]2}\ Z&v)]!JkL\̵z{o2ctgqh-snUx5_Xk֚˼ua"5tNq^HM$"1 ]K<^$hl?F<gۆ-;F}p5ݧ ;y^7. &߱r| Ŕ3ZLg.d47O_D~ŕAUp"-C_b\ <Ǣ}Kߺ@W`\Ĺv;7 b 0J}nax Bx^i7GKNXgmI5ʞƉSX|2 2CNeC9pc"QLAY+yv0O@ݯ۶ F [$3', ",(joF(^>:,wH AJRJ;Z[TtW\]1[W[ERE$e? \|y|3s=s~.enjE}B){rs:. C#)EQ[ѼeAS[}}}L P%e{:r$gtZQ<>~&?c*[717}57N52#'&̋g9{\oe'*P$gf]9ˆƺMH%F:zw3;FV"aL_-`XS2:|caAF-ܓG (۰GAQ G{=(d^>R6 L0`YL;JѽG!DH_0/vPoބ);"ڶAWU,nbcsS ! ! rmG23&.kp^aVvئ< ɗxlE#XK06XmggWP :ua׬ga+ $pJ\QF ӤLZ/zFcc[ dte ;̹Veu[_e-+R ,!ЂxS!gEaOWv ŁIJuҼzk }ߖM;OFligIʍSIbZ@YsZ^!zsK~.ަ]!%i=WE@[YqC\6oa } ̔R+6$K ӡ+dHŖEJRiM6Fաoۺsr|y\ꙵ0N{ƞknʼnu)H22Io2YM`5+':75IT$ji*@\չkt4 ozJ9MUU iEݟ.?FiP&&v3yz.m syH74eۤs:7,^V|xLH/Z6cYW/x78̈Gr+^RKk dbA'( tKtOÀWSrJ#8ԗ |tBBzE0V)_~I@ha!OyP2FVvuh>~-2l"?ʩ|>O~ oz,6¨柄H^E'w~y|+/-+KZ,,0:ߍp7wm_ZS'mQ-O^APbk;v!?KV8(߻o/U1՟c9ai{<üq]JϦXd璟$\O$/yE|dFZ8&pV<s#JD)+I'/gF OE,u*йqiLmLНn}q:i^BҞeot57L;*$50P ̊kڳ'eT=PpWH-ِIW:Rהi}6U~%eb.'t[+IP͆!}ٳ'ݺMܖ;H2v@&Vѣ_?vTF,ݻ) $;q8!8mƸ~|,E#O"i$IKK'--QNQPeAKstoc;TL qxvIR ^I0 R,]n5 [}zN{;8T'`A`:Fг]QB0y~zbQtԑ5z11 1J$8 D2y,܀=5@C#H̐Ӏ@NzW5_4 0߿O RJ<9{Ut_f$KL s`ޘfط\`!,qq+_(y.S>>?b( 8W6(RRM-ZZǤaC ~ )xU/Sul}mH'L[k#nfp{geE}B0_<;f O=beEeXB3 (#ӼޟfAF:ğ^Z@s-k|.FYPԘi['gG9J Ly9zvLYƑRS9T5 Ohك4,}u_˷r4T__/H0'3pߋ?_9$ $4MRaĞo +rvS˄3Sv,jUޥ4˧3r#xv[g ƺ%kro\~DPH .&*#{<{z»wa^қ l:rq+ju}͛ǘ!uOF5 ĺ%cgȽSw{ޱMhrEee,/S4H ?E㞓o;N"u,%ƾYz$Mma֋DDjѹ?t99|ןе0Ŭ 8= YYNO`g`&iäZ8tP,A#RlޘIs<*)Eu-,J^ riTC~V? '6> e$ڔS/ɬ^pU Œe,ӗeُAZ2{nZVx&r_c1[$G?e7P(C{uI5h2bNr+zUY4Z bԦ*X#{.):4}Mz/' _vNxuؓypr_7k,XQSƲRjd.dޜn_a?Y(LB֢݌r]F eMbOnx+[) ܭUh^Z Hm9tM fL.׈9myχC:ven@&NO )ŇoRGso d ;Ff^Vsr*;?Ǝ eK'Yjc0͌Yt{D e"oS#gᗨ,]9YecO fz:nqCף;N6<،@T[w^yQ m!?YNIT7JcΕyGD 6 i-}š#I7E]@}||Ю)?9+{Lߗպz\úzK&+F5+Y \'.%CG~87/rHwx[Wn\t$OKy Usl=MkXt<P)E͖{4Ug5,O8Q蟝_݇ sZc1#CU=0&ܜ)ײvjf>H>b4$rNA\m-KN40|o8Ac̎fʵu!Cגç294ピ`<1닣H?%X5td4j.XKEDW [) 'DM3f\qoʞ-;wW=g|V~Ue_n.+péu67vy+z3p/忍Nbv_p EEkTO'M޿/g+Wz9[Y`A(s杆ʙſ'HmzQsp*G@h7 P-E#Axfʷ(sth>r}c%g)+w!.F CDXiaba@ZTQRvlA- b1KѢ?!EQ֡HQNOpSq H ;3aHA '^zQ)Z VzO4F}G\uA H"BAAAAAD,   "AAA   AAAA    `AAAAF=Ν;"UjժDAA`k"UAAA-   XAk ;Q^$3]:L}Y%[A@ ^k:ifW~, [lXnm]͆ n\"݅uLZqihԥϤQt3WéO񜲊O_%[tcҠt)8tOeƶ< O"Cƽᖻ 9%o%Zȴ) +}⤨R3QwO뱚w PFvuF\+3ֳű**?7~|e;4yXA4Hiv'~6ϯ`<|:puB2qvRӍmHd-w!oiE wsnnmV%/ƅĩ@fWLoCYQ  `ArjUZNYS0TMl|_*;H'!I2mQ&BҿaA^ u}Ƴ6gܘK\_nY^*c*:iq}nR7.NnD7(¾Hz3u=MJsP )s٢ђe[fc̡]+)[4Ո>s'1v'm~S& 2݇RM7ȀzC1~[l_4G*Tv6Ԋe<겳enI (ױ?,1`zGsΚ,CZ36 _or+ hMic=8l-kpmy{YHeoΌ{C?PL4  X" /8d}d=Z2jfC&Vq0[˴dyv!1Б4bcj%ןGrVG:_bei=$Q90Uo>7:Jˌve gfHLq~D;o:rQ9Jid0h9ᘦU :1A_m2FtHy̹GT?*X[N |7מͫl6б^^d;,kٌe&Nk$`2VO8RTnԍnX8ǕIpA{%Fˆv3)%KbA 7*,NGNުTAI  N?CS3;Coئy Rh<(,I}KoԶ~*'ϣQ @nGBSdLmJmAF-ܓG H}Je+PC/dp&Hum;tҁ}UQK{0زxѰ/\bZU֖R=? $1l GwcELyY넥n'Ns&Eشk ʣ8}ٮ|pŌqps~6]pTVJ jӿ[Og'vzX9с <-fIusyT){CeF=DHY [!Xp@hKîcx(AA(?a[2+-4ںuxoGvo(~}Bf^?̉J3~(uL%5Icir‚rҰ^sVmԎٕVWZ+~$4:4o i} |)[ P9~k5{<p ,Ҙkf~z M*9IvZĭL)i NF>žR:-%\돎ϡ YZcn'YHc I'.u!%I'2yf5]A ς IƚsJьɂ*=R#W r-ͽd_N yoHdeoXt5k׏9P1++ԐΧ̂ŗH>u`YyBGkNËY*ڔ!MNI-L;H]Fw1aV[Ps&S/߻͝9|<G.O9t5}yq/eJ% 똻w^ƒ! 3- It;{*9@QWXz)$46ϲvePE q;:d=n'1l-8,wfcUKP]bPџ5m9"}9V`e@4\NhXVJo&F _?ϰݻثӜ# e=|x&Nԩ\VraE\\S {)՟ž9A2.CԐ?!(߰ ׫ 쾉:{g2!B ,u /:Cx&Rq_M&**o+g.:|-0ՠl9cyk`bX`7KS} 鵗TjmS[֖:`Y %bx0l+0\SM sGb"1Ѣ`A@b V~ƕ_.r>azq]~^2IzIXb'`o'P'&uoҤrNJFz)7J:$>}c?,{2ϛǚ\`ǔeI+ET|]I&6Ϻf׸25ڳËס<ؽu$A`bt$Ni6ؗkX]9 bæc:oXi~AO Z3/SJ C+9b18#uXQ O?~É-,ۋ0l*2Q-~{Xw`&Cui(~0hcɭD'gcJ&nqY6wTUwW2` IDAT:כ tLqpˡA?[Tj41k{+4t7.pIZ8nd}TCS* J)V,,c՜/EЊg3CGA,ƽ+96zcHBZ45sVӱ4tti [!o*ׁ9}B43U4P5֎\! J9?،@T[w^Oپe+8hiq o$1C UC[Y:}-QA(;W''*mnyRG`O:?MnT¨`KF ,tĀ|['Ʀ0sl\W-u'LgXKAªsNNNҌRBsRH ļLNn_(%Pz>3g6K]9ۆPOv[q+"2бH~eI=K?ۦV]+GgT-Z~6gz}>X>Y>ľQBϪ"-WA}&}/$ bm춆SmKGW<>:[5IFAAP|lrƱreW󷕥yz%$r;q3:$;q!V k'+2i۳3W`~5dAnEmObxg^MF/$>kIw1mjT)&72lʁі'M(7nrKu̻$t[fAK3¿D: ]O  )Rz9`v18\=wL%ҕ-[a.=}Q1-K^]9w0pqVl?ƭ(2(fGm8)ܞ  q\7WAP@>@"RvoCӴd1Y58 7֋XRԵ)^LrH5 MDKW22SXywdjavM&,gojY4U@1 ۗ{W-u1r[gQښ3B<̠ӚnD6h}aiMLEߚi܊e1+HC/1eVƞt,ѧOqIcu(;'6 kJIH#modAAAp@RL~/@\ߡj~a v\Nڐiq>&KQ"<9V-{L kUbrO֓'H 偆oC[0?% Z5"   pVqM f͚IE   ?ӧOĽcIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/security/image11.png000066400000000000000000002275261461403617600240330ustar00rootroot00000000000000PNG  IHDR!sBIT|dtEXtSoftwareShutterc IDATxwT3Xd(5!QvEQ#h-bL=$>IXQQ`A@c)AQAYܾ˝ˎVzs۹ޙ=kI&"""""""]<_65njyy$Si*+')bF"N2i>_6u~JJQVVF2TMHfX0L,鬳J7i&Ր5f3TaFl~3eee٫R0@Pyѩc'x<_v)}&2c<寸RR Ӂu/̘orEn +kŊOx8m)<<=z{g?#<3<'ڌOy0p^xY|ly0Sҋݻ7`-5)CkL&~uٜw9oWp饗pI'гgO O? <;m}/Z? ;7n,3g[""""Wi3n_WG:j&r! HD:_Wۮl26L&)..| z0?la H7Y- ;K5ymcY[֭+W#`CxWbG嗫]ouMMf=~]~?~+>~]n.If5rۘng~VZx?Μ^歷Wgg駟L&9CypءCp݄a8p-[A<a=Y,r^ye625, i_#<ʫ_`xpܘze۸O>T[}d/믿ymW|[4^xY^,zo~V#7Gٯ1v)zp,Ya ѩgַzӧ^,mm_q:x~nSXKx;lY#2I+oX7|sx l{0`+ɥoTVD xtڵp8_䵢"EDDD:ag-h}ٹ6f0S \CYf;nēO?PQQAvNN>[ϖ-璋'r5WcOD-icy󭷛L4"zo]MnjK',^ >7z&MŪU_z0 +>|ƍaGwh*feq1 ϖ-eWpe?oE2dGp9wmP(Ŀg̅L5kχx2hjҧOfx?}ƋuL}̘oBGbĈ_?ezuvQUٓpC[?HgL&~]PQTe;twu7]z cǞB:ޛ@^~;}H$X[n|{c=AϞ" +8`kmϨlv뮻\ kKq͓t=5?P|L}pq{m'Sl2qz|M1aj-<3q0\k֬mW.//ꫯꫯ~ngÆyUoƏjlw %""""ҝN=ԴLvmI((٩Vq=UUU?e3Vv޻o?7f]9?,""""п߮jrٯWojkk6$''lg>K3ff~('˛ń%5}|EDDDإ9n'vwZ.wZπa7_ c%!Obr}sίfr'1[9:t:M8j2N/sQV'|'|-\qe̞2N۾Xz2Nmcse䁾.ސǟΘl-ck؏@m/,/Ǎ_ΙD:4(??@QN?PX7~xUL8,;trT>Hwt3~N# /<Ŗ9rdΙǃLiv!sk/qw5q?.FuUnw]tD}m&]YڍVȉggu Ag󛡥L)u;V8dg(O:Hv[9$o+{Fo#B6ʹ.s,"ΐMqq֓Lc8;~Fp*"}r͇5im7 g S1oolxt:M*l|I3i;~vJ ps7  HxvjKpVVW_s@&[=ʕ+nmެ,n֮]˯/8~@l.+]ڵkcݡO2Ϟyh7րV8r,u;d,e\ 9ȡ"_5ԧP&vVY͹ک3Vn(ttzߖQ'g{ݥ""Aii)uԈN'odwZjy-i>cF[n'K25q5mCl >zۼ3[9l{zLxIN|;gO>|3&v;"Ox{ysCL..?}8 +sO3&c2;y*kC{ǩnnaRxx4aus9<6͒wIX_׿oGSQGdƓT2s͐3+㓗gI=om/ 2撳<~wTl~~I /v`M)+^7BKBo7΍e{A9[l5C#lᄆTkp+瘈n"\[Ng_7Aς8%~KaC{n.pU75Wsyկ cM%s\cٰkYnRw"UGu~pCa<N8lMeEo;9!g%u!'͘ /CiCab!/y<δŔ r,'Fu(%''M=|r%wOq.L4qxg%].x8p@&ඥ͙>}&/LQ}ej-[\. Rπ> ߟٯ2%%kd?l_vo￿K߰=7-+q 8 Ax͚ul \&ɒ{/g y/SbG2q%NgrX\^⾜reght^|c%#x1t͂cYd/`IqeOzV|Eoȱ~|ue?hIL`0"+-7b zhD)[p8*_<~P,~r@5ClX8E_qY_i%9~zZ]ne6PV cI BeB* IDATIհP+`o;(W_8z0E O$CW4*kY % ?V{0p=`_n/y?cw[91;*ZJtv?<ncUX_r<:VjUHO*ַxnstExgUq:b mp+瘈ȮTYU}=mJQQ69s6Ǟ1tƏ?R‘JޓjfznV*>[l;(7n%K/=W^y {|ro-=O&\v%9%K=֬Yá|]AUTTRWW~=9`@^o&6ֿdeem7%K~餰>vrU[Fwٱݕ`uiəVuzˮ{[fq1GCŋ>헬[ǀVYYYz-|NdL*lӼk׮eРm^AYv9v01&d*,.dzn۷aZ-)p ouW\|-O+^qo=-v=Cst![zEr<\.]̼jb9+֮}iW[)kc[ndIApn.OsqvT ZDYO= .̙/fZx.#GdŊ;~n'ysvӧ`5'{ ~}G`y̛;+m2-=Ԇm^R92nc]ӃeZw.: r͓<'h.v XK>J|9g:5^G~׹hnW 1jԱný 5fL8m[dը~80FuKN/nA^sbg+X:ʓo5#`{x"h|FX́sG]}BT5z|I b7N>?o!6`:P8\WVPʥ'--,Q^)1>ljc_|i_ ?_`.kuՍh)8zKbJ+*(/&NR!B+ܶ]I +Aۗemn ُmܰl?> ;wpnH*‘Cf#DzJ&L[fG.=̝7['O>?ɲeXl'ɷ0wx/+ۼSkR"H#e[-P##~ڵ%DQ֯߀a~a]^@ HNnNԖl@`o6?;?i ןBSτ];/+/g?wU-}'eÚɫV1s\p\H/`3_lʓu}:#~%)r2`,?f{Mpy?Xn9s/,џlFm}Z)/QV$38oK~br5Lڴb>ϛUF^-8éx~kCF_EiHm~9xFFSfψ_)xuNN72u qxN~JIE +08z<)#>y8Xe`ܱc 5,+%g >! G!=VbaxՃ'X:pt%޼ꆋ)k`kYωT'X̗ǟXmÏهLө o 3ьoPTPJSn9e + =׮#alZMi}i͎˿òV7 |GvZ87r6/f9i^NiCO 6p9jۓ%""6n,\Q[z%lXJ߾}; !M&ә`Lnf4x /$ 0h{kY`Nx<ԩ]OH'b|'[nr*;n4GUW]PӦjk9`:1|_0SOE$|aej[Nus{tB =ǘ|ۭLV:Lw>N:O9>d[tnIALy;}KBqq;]v|߲GVbqx]<}b~*6cIM3ۙZv\_qʕrKb,};z/>(#?>r.T|s7Μ=՛yOAْ7x~<7)?eFW굍GWCObˊRBubfb4#pKꍫx}Rʌ%›G#O`߱ 8gDOywiyXj7ԏ~ʣ㧴 ,k,_?=R%eKeKys1Î#`}>K?xŮ ?v,[ HROVoyjfbQtXjJۗf˿òV7~,io΍M[o>hpTԭ-c "].(**"0gN`X'xBIn̓_/݁`{KɽkZ{/?~ (^V@ wZM} jp饗SOǟ +kذ;Z7 Nyo.ϗի1 ӭ=7zŔ# 2}L>6Ǜ^r,ө6i֮g<++=]5s{53ocG5ɷbR qDuuUߏ;m,7|#YYY,X0sѣs7ˮK_1M[Jʪ}=s ^~ff;뮻+>g38ꑟO`ذCZm:dtQYYA,窫ʫL3g.S|(|UWraa}2.,xZn&Ə?=??}x,cn̞=g*npK{?VTg~пqKyW_ד8yHO0dݺu\W^~Z4nO6/37Xp?ѣeQ@ YO>3g_= xaݩҾH3QAUӏC+$GT(H7r?eϛ^YU#x!??]t{֕7Nϧg2jh`jay5L>sO:LYY>I/" *Ca]D]9Nm]#w &OɌYRS9s.MQsGyɷ>w7J~hq>qxFKÊl >DDwT2 55x^{Ï5 > =nO~~>~U_|f*gnnt׌$+l055]_D`fJƩP9i0-<:kO=d"''}K&jb1^/?X%pՕW᷻p:dDqs(.-bש2Dfu*VNn;X,"TVVʫ Zm ̘>g*va]Vkjq: &>_6vS1.D"AMM7^cF1z( {gZPV ֏ ersslD"Q,, > 41'""""bśj隠L&1M]n5®' Nt{QV轐b%7/h4J("glvq9]]ݶ u("G$̿xAXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDD YUEc1q 0HRlf͊fnt8:?FD2J<HHf_LfvʼnӚKDDDDEF2Imx"ʐJbq699>KוHFn!}I''ēalf'^,Nl""""WPhջ56'HPQYM8irX% -6SQ**u‰ GH{d4uBᶅ@`| x%xN<Qٕd -1;77/H$:EDDD[=ҭwkqe`&E"!"V'^<6Dhq&_YN( dKijkmu-۽fpZMN$±J" e<< m2{r8LNLE+1ҀblJJ &e駓PDDDD-KO$Z׊7Njn&Kz-de=}4^ Gˆ)'Haqc`Fp{~-pmuB:F<%5w^6oY 4i8.LMfpu!Ĕ NI&1YԯjTXd" O%RQFP't[{L p l^Y1w6!`Muķ`#'ta2aڰY|ߚݛ\xl.\6$BTW0Nzp:8q馁bql@:pʂ'?l-L]"rmx>,$fjb!R[rcsq WP& M8l&$t٤8F"N$FV^\XjDM6 H$0R$8mVlM+48lmxXDD E";-qClfI d/@H bk,8mjl,\ ɭK Ri"bScSY53M@:Fb.ۖYDDDDDX)E嶐s#-ƃANܻi< X /a[{f H7Zwj "f rXlaҩEtD VY:A&eⴹ'{#bq:tIēAZ"M ҩ BYDDDD;={#H ܹG!F+ۈwîU}uׄ=G-woKՇ)?elַ"HyXa#B'N[9~d[_fI7Ē 0gշHw쒁gnx ؿ}]Mnw ҹ&$d&$pXL7t ##Sܦlњj fZ-NOR԰&2Rnm0[םl;nv4RNIlv`MNlL+N>*ЫI/n.jx'[;gw[ۯ#a<<[^[xIEDDDDwA{$@th ƿM_U;|S`PPMv7jSݳs,)m80Hbba%aaq0[[͐2׸bf1N&H$Ym̐HỲA"n֙4'DSٸ9A t0I&/N b-&'N ̓`%ʨI4`Ƅ֛Sp5I4ևeQ҉~`8J,HIalbq{dgxƌh?D8'Hʬόnt:O |WBa5 on 5YO n5u?Q#?҃,k#ɫ QiRD1sᩥ NHm8LipC~S(6Wn {ՁgTP0œMLe)w\"M[=x]nuI{<; -I~dΜpNՊatA֏ٗnǒN 4PMX.**khq8d M}GQ'~l/ A(v$”G ` ͪ:?98~a ^2B*E&LFך#v;Y>Veg8VxlnBB[YDDDDK/aG#ANv^Oc` ٮb|<}[V͊R0S gΪ7&7IYiNּVxlg o $6v':u"D޳}>uƸ2o] "V5s|^nX|9Ny99lWÞ*mSYN-aqVͯ(os}MLTKqǎ7a9ÎINmj"pf$*(kͣ&|jL"TEkFA͠<  T6`MݲlH$bDcqb8dr6ӆtr:7בDxX2L<Ų6 ii+Qެg vh[m TTu2z#f(w{yxn<7sSN`k:omHdg .gNp=wpW>l ݃in_SDDDDd{ 'E*HEp4F<$A]Gm󲰇u[HHԇ5cU9B6NEBT%٤gV>Si"""""%¬XHYVgҾ(΢=S8ID#e~ [׌B?Cr)3*@(INmY[_(orjV,^3{M Fs2N4єjaw^[:y*YY 69Yb(6ho#n:,"ܜ9 ݁"'ˍ(7mrڲSWRQ?<)[7ZZ6wr(NT&Kj,[q*)&kc3pο@:D Cc|"""""" DP Q _dbIۜxxV$`%ͤUTV޸бPxUM0'?O͔EDDDDDxehxX;.Wcկ)"hl״)/g.lŁx&2;pQԡu% /(#<EDDDDDEIj7ZIYU5 SU#ljٴk_c!<>\F֦RqhP`2=ҴGY?ZE GS """""Ҳ6 *{SU$kX%K L<(,eRJB"2Vk܅DU NGOAp _g$XEn.W'YzsZQkEDDDDDZ\An@MWKF2VMUfg,G`dyŝb%U*8KPs;LL,RhG=`Ubbn줰\983}v}'~_ӛT;}>\e:!:"S6ɛ'PV"]]^|r+}cUT)rBDDDDDZ.E+lNZφ3;w(r䴦Cl(#ᥨ];Z7rYjP+5aAM^3l+F(_h-~,Gv1;TTT G%R0;\x|~r*VVIb`;x|2]g Et Dc)56M݉wa3֖I١HXpr`ET%gϽe{qVT PH A-HMnGAΡuZkFӁ7'oNsc6fj%D]ֽ_M*B:w+bXH"````````QQQQQǢ"^\eQU[M.""""""[ ֑+SS r`4q(O HƓ, %ں 'v@8a 砍,K)>ˆH4c't7a$XH 1'nKp zϢ"#r];֚( $(I߱m϶1 (b+ʲS`7cM"e*AM'H ibZ)^D*:@"s9 3+$eU`Q`<~Ӣ2΂AW_:,.vTeI*鰹"7I"*Ivv:u&|'mLb̯Jhe lر %x$ ?I 8Ivl@"nsلP0ƢH|h4 aYwL r]Un#f5 rlN* X F:/ BdN"alyd RvaUS:^ h0L(HX9~x$V65 &ɔ4-_JLZۀ [Y=l@ҲH 3=:T [f9h#Njl, 0 'AI:f`řU xv',,ͤMVM586If&L6 L:`sB1f&,IlfYTT%urx f_&}v{,QR3 tq`iؤM 'AFgd}s mͳѶֻ€a:^o[9.k~o[llɵѦwyt4!xZki*"C!"""""RYVX2u4DDDDDDVmgOt{,axT""""ۡH$M7{SO=, Ҳ¯eY| ݄FMfx ^rlM}ҜyРAdgg@DDDDl|bS*U6eJ% PnǬ`ib7f<\. SDDDDp\/gu mҬͫ:`IOEXDDDD:٩V'`E81l>::=NW$#bY`ȲyitH)&¢N^2luƌ RII,G&,di2N.E3"sVϬ~EK_?ga߁ޭ ?`l61'}qx~\r8uȻ?Ysɢw|1-3y 88Sc{=<+K˘|W~0">κ9rs-7cYYZN~^ܙ<pU7odxΛo YdE\/oLۮ\y9.^T*cfGcXx)`<ڋSNL;QD:3+ zСqs}xkqPJNYxM8U a^+*6@g@*'h[-Z46峱yݓ'B|}AIuc6. YsS<3.cٸ{gTTb1}&W\w;s_6x}.&2Nvm`1O>2=lop8`NQay ]lV~:(=crx%^&@˲XYZΗ_g{.{fh8cƳreŭ (YY_~\뛛CCr(*,fzK+ndϓDTW3ỉpun` }9na~:h4J^^+JJ/95/} `W\q;v̼ر#W\qEe'M救լ#x>}G,?T>IyEe͍_ycM=y{yb]k/?|?oRUN/=| :#ns<9#S^G堿˘_s̘5S5HQ5 >0>2, Ggi i Æ kʭTS:sbwᲪY2ul44~M$}Ő"$^󓈑 ǑK'RaTNںr(VBjZʰۘ~`0۾]ԙد8M>h#R]/7?p9oޯ7?5H Sg~: L&m6Yо-a`c>m&e1o" UGB.>4>K"8i!3nB&p?q9ӵϾ.糱_ָMUk\zt؁o?J,c:Ж43͎;nrʉxj+TWG;[tD7_ݤ~0LPc>3tQ >0l6;w{iR)pcc5;;;N^n}XKgc IDATX漩z(*gt^DDM#F+ݺoƕW^Innn4ɯ.?F.{}Ԛfwd#|,x?Fk?l\+l>*?/N?Ӂs?(YYJQaA&?5<=Z7Ob=w#2ə`VE|DzC5ͩW| s~/[+,u55tء-gN4MvݥG{\٣z2U^Qɝ?eYdgquܧwO.[ğ'3)DUu<1cn׶cLc睘>c6_~|?vwG?v뻋DDZɓ'sg;2~x =893۷&k{4LbVj`DtMocB*[V^Ck0O*b̸ | ڶ)gLs0k.?LuuH`{u.[U7k V G":y**k*Su>Ѫt0 ¸UUY}(+O?/=/I"hؘchnvmqCOO'} ~6M3[)nU/IfU?ߜFEnn&Q8dȐ!5j]-h`ݹT$cT$Sk9e:ȵȵ9u*}&Ԟ}W Zib5 ML'T*=>F qs7зwOv;_;~mg_ʄ/:cy(n3Ͽ傡3\=qqYwuG[!u_phG8RMUUA첚YYOMy ػ[ȳ#^Dz,:w_O6ŘqF9֦jUT{oaEJ~u*OOLa̛n__~""-̰a2dC S۷o_ƏyOy8 Z=:Eqnvv߭2Otxf͙y 2 w}9׷Ǐ?ʲ%wJ;P.;= }h}sξZ Yh ]y!CN,ccitl]\D0Tǝf |^ωkf6\p<̋,\N9ܜLܩ'֪o}#Xp1ǟf#/7#=>ASgVT3_璟ϭ}9A:rfq4w]鑞h_ 5;]L5}z ?/ 9J 8A,[^‰]m7]E2˿h{3.:?w[Xgvօ?g[#;ۏX,}OlT,[U͟{n4ۀX$SG&/9 ".@^nHN;aw3pġvH&x3\A}Ii݊D2]1GeANvث}<7n}|䔓q׳[]z=#:o'ϓΌ~&S6︑vϞ;iUTYc3ӻ'NM.7ӹۮd},VEqA{:z' 8`<>NN:(zaDz,\.';w…<;y9njo3MםἼqk """" IYҏ(YE`*ڤ=M)Sښ;v,%VDDDDV[r%lpiM`pn-Rd4׸qGv5ժ=3m.U,/XeRJwo'7#""""k4.tGK_ %MnJt^Rh , 08#3]УOӪY˯7'3}6q 5_SϾ<涻IR}ѵ1Ku2lcW!X,R ~>7'Rg/'m7_irC:o11|n8i2ۉ\z<}t?,L&oD"tapm5ix% 6dkdoeeGsGcƬ9tkѽ+y99I-/,3y4z^0~?fd^(lqGq>IkݙiJl0 $6S|`cOܬeSu~^.iRVV?J]o2{EI:y5ʨ.w̼mvXT'6@͝EXdCEem W⃏ij/s%PמiG}ܤmly d{(_Ⱦ{28N8"9+̸9eY ʦ"󺬼T*U|N8HN>qu zݼ£5ml)j-Rc}O  w!}\y9|2wZҮmkƌkIo4 ^;D} PϿ4JyQ}Yr yu?0ỉUy̙;δf|O$ ^y=cxg(-+]t#ώxh4J<租cђe:DDDDDXdK9S889o+*ᶛfs.o=z#?WxO'ln%f ?-"JaLS-6uuMرc),,Ta0@`b 8pu5nRM!'Lb?q0y&o߾黺EN]:XDDDDDDuGEDDDDDD̙)˲H$MjJ+[~n z}/""""۟x< 4gښ?o\{vZn,ѓ[{5-'""""drĺB)ew^U঄`|G`)oNma'EDDDD`R4 ((sa'd BDDDDJvlo~U^zz}Dt+K˘nbȶ6rG GDDDDDXdy᧙9{.arNⶻү.}!Wpg2[s̘5;{;oSϾ ci?Ç|AnNWкu+ned}rCyE‘jbNQٚ|>k<:?Ug~G{1qdvK&O:9)5xoW߭kg:u _;1u,ym6<`f/4())de)>>{f3LP`ۮt `Wx[|3Ыg7&:68N`&2p$Yw2nfѾ]/XL2=p'xN,٪ l7^pFi992Jr2=/ڶ)&:mu E2鳸u寵^?Xŋ͘TWLH&y/m6 0MS` ?oPQmb*+奃b]{1qd,|^;vo'RT]KK3,+'//~` y=k-;#?/~OJ'(l?B*N:"λz=0۵&i3u3S33(UII)7z׽{޼3H$w:p>/W6 ,7}lκ9:\EҲ n^9.f>$vܡ]:rߗ>* 9q˵<q̞;/S˼/]Kc%8jT"""""[/IYңTZ(˲6huMرc),,TaonVa6#lX!5-6d7ɓ'7y}Чi;u`>(vAD68$|a|T,"""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""",")LDDDDDBvlo.f-^pon{DQ40xN;81?տ/PV*ž{gùy7(++AGpYi }l8.UW^r{˛~ȰLJs/pe3b^s:;o ?osЧg|CA5"u3>+neM̝ _Or5s'Wtv;?L[q#q81W_z.]:wWfER)nA$5W_v.x~0gvΘͨ>[..{.m%"""",҈T"Jq:ʓ\v-=ɱGF^ncM, oi:=và#`ނE Gw߭+2Cҫ;`s'wi`wQ?35MQPEOA NSfi<˜ueTWuEDDDD t j$ʡK++)&GM:5{<FߓˋN$Lr)Dzd%a 3bQlf}Ƚ{{1a{ S3n.ۭqZugf͞C2c3IΝ@(㾛Mnn IDATڦj/,߂ro]m-dYĆf8-eZ)S(..'KDDDWzM$5ju1&_ YF:S0cƌV3x` ֿ__un!6l(;J8"""""ɲe˘={6Db.,̞=e˖"[vUW"Lm"Mڰr)(ꐊVSV!KL`Zx ( [,`QU V+O~=73I+)'H&.ܼBB>\ USʼդzA^j/(ݗn9zKQV_NeâX4 0-=:EDDDDڣnݺQYY?izh9sx֭*mܺ[DDDDÄ`Ü9sF :; jc;/[yoGAT-d/n>7dՄڱ|ݫGkntkuզݮEDDDDD#+n tdG=k0V~M$IftNRd>'I"ZWdM%jb&4\Vݡm0>i5=c9iҭlMT,cai]ΔI'Hٷ 4伈lC0TE"ߩ۩aB}t41^cni5MLC"CJW_O~}Q,l9;eQVVF Ha"m-|rBPH""" (vlVd"Qo?9Z%EZU>"""ڋ{LLL(V=2FZb^! ^G6΀uuҫts((((((((&(ll|YmD׆a4gd&6ΗM/+z[i """"Ғܜ&CkSe} (ZC!ԅԳ@Ks:z7sW{8D;MMowlktpۅߎZ[qNtt֙&֋fAT}:JT6LRMf~i6g-̗MgXX^BVаp}oI !`gZ:6cb3kMmG1XDDDD3WXUuG"ku=&rj,bvt}Ӣ;,з?nQ+q-*i3~_ Ϥ|Ke:ѡ1'_iSeU"@8ƲHG3?f,N0J!TVV U"""&\`IfE2JN(Û&|&' ̙C U|ljD"B!`Q^;P`w2B!BpDBH[ S!""" tRGI:p=i=U1`````\V2hCINEYLP&r1 plvTtr]{rb&i;E8eI2Aʕ`291ՆQl$I4,r,7_&%߀d*̼J>/AwPREiIJjYXVm<IDŽt ?'35]yǴ,0 0 V="餲4$ZUI44 n -d[u˥jXH`Fv}i Rc/J!""""jި, 1kvF85"v, aa`e|_. \AN*U˪tjX֐N,K!""""ޡ69]Ӆ!B,p$beZ!v#W$#Z~z{ F1g[9Sy9S{Y|giƌGu7M"i_d_r ;1cs}"\9eŸo sټd/XİQcy6j,/6=4zd vƌǝwO$R-oOcO>AG Y?qs'{AowޛưQcyi:""""" æ&*2Y˪x5sjYउ;&w&SA ,*%*~Y(1 |.?rP^Qw݀#yՉ?Xp)Lz^{yqJK-Ws9ISض57ֽ{]7>{!C^^ (yn7W]ӿEřOISDz孪Ïsӹg`6|\wEDjTT _eֱ**3:w_tKvKdrN>a,s;?͝OeU5 -SISi|,[3#p#xOy/gάD/=={tce,]^G𽇲A{s`:XYDDDDDxc5 k*V%[Xv:iMxU8O姿MN`1N 74) //RZ]f%qp1v\p:7~w/ߖ^=sep4MWO@zEvy~o0vHi*v e H$#ʪ̙**qAQnkq~VÛKˍϴ0X*Fy"BMiH7@"h0qH)Q%5fc6)QZZ@AAw(˖ѕsUa>n!߫\9|OF ۃ%KW<̋?r~3(]vH]ֵ^ef)\,2|>/` Fju2sTUJUDDDDDxpXD::'I+X^4n 5`(WPb; 7yNW]uUf;:Go,4y3j>q yl?Xd*Œy)Yt9UwtbirXlϺ;NqxdW3viޟm-9~?9~?vޑS>d.;QQY7ɆކzN]&mӇ=Y❩ӸSUUy_õ7}'G9އ?]ϽĄ1l!nnߟT*ŠwGR)<0[ {g^#Gs٧5[.;?7z/ݺӳ{WhՕ̚=jhj̘1N*0w<BEm38ض͌x9CkLGg^43_&fe'3(..no{>etRu iN$<` #0d@cÀ`ik/d1t ]mEf=u > ֿ__KgDDDDD:`4t:_}1p*BDDDDi-蘉Zn&Rimb l'Hi}.*CDDDDDח0ڄ\HptZS.de Qi0DB!<`P!"""+ gZ:f(++#zU!"m,|rBPH"""4>c- ,U8>3Ggh4ʀT"[ؒ%Kj q ,O~[th0Y^"vdY%m T"@~~>pX!""Ҏ4%(;Ib[jj"c1(@P=I:߯JgRDDë0 tJ# +eU"@8Ʋ=KDDdC(qS MRht UUU"UVVRPP.6f@ > 6Deq׍7i~3%o*8QC$' ̙C RDX<' t1JDDD;J-5YO;- rX\q2 x^Cҁh `.bIT]N8| BB!0DB"Ƃ ={TE콿-)[U dҀX " H, Ӡ{ q{:Ʉ͒5kA$R á&M]M Cx (Z~b /20H&~fEu0a5b ~LlRQޒf7nPRskN:]{EDDDDDD]2XDvWK:67uW)""""">%l4H8TT:`x 0DfJk#D6|<.n6]İ\Llnj`x2Aˠ{lHn\8Du z[ko6e)ժp&)>BmIʘM Gq,&X"""""" 7cX8`1 w6DqAPvXRLp4<`Zv:& {=21\U4O" L&׹([NZ"з3KO#N_|KɈ}d~YM?^tFm#JS%W}lH 5ogfl""""4>B]_4,?Ke9xq%+Kݬ?#5l>Q,ܸlv/fؓ7Y}lIi> { ̍\J߭CDDDPht R)ZvN:(z-,_h:} yg_HEe#ko3NG²L.0G; +S͹gh+JVrݬ r9cKopqyxg+ٮ6|t~2-3gw2sfGlEkk]Ne=v#/ͷҫgwnR~i.|7}jޚ^>R4t{qna>K$vޑ/#šu _|L\.8@ X,??>t=ŷ3c%tڅ ϛCsܩt ~3?Cٟ~ムA;5w|Gߓ 8 :r!i,wf= y1uߟ)=$ڏ;n>g_x EeU3U]@:msSTX=sqc]kW\w;?k/3Cwۅ[zog۝FwÄS٣;?|{ _GI<|ll뮸HM>[}]sy7zY/~;Crd^|u"O:?y zg\ +`1`""""Xm6 du5 WзO Zw`O<{ƻS? Lq΄S)*,`İ=xwݳztKq6/YƏ?c`wg]vb{**dEw>zS;gİ=xxg4 Y>{e!x4.@ SϾȂK RTX@~}iT1 '/ sǽ0Ek՛m;mo{b0e+v}:`})1W|ޙ:2lݻ'@.aݍ&gnxR^Q=yٺ7_}Gw菀ɱ H V5=Nj!WT8}z&Rxܫ?Fifc}XlitUegPlppʪju؉ VRY Tٿ&/z!Zk.,Zy{k>̋L!Hdj_QnQ;DSVKpf[Mډ|—_vϾvg6uCBLooBEEuA(y.c à0.šlw^CmmfLǩU m{eKx釀̨M+$yrKL0]U yZ)3&#^Sq=Z|/_0]DDDDx󆪮>CGhrZs!뮵fk~w|ٗ\zՍ9hL!U yu>{i  ?_6{osǟ}I>[Mգoջ߆wNcn0D&5r^;̞30y?/p Gq#ֵ |n/g4:NͭWoKeFbT%KSxr*-w]_s%瑛VWٝA;)2xfq`^~_} ⶻbId/TU7|Vx~b}0 'f|zo]\| ^n""""h,tmۇwޛ^zn]k-0>d~.F\>}4p;lߟ?><0ڿ0`mϹb!9NF{嶻dǁ۱Ƚ1M.;?7z/ݺӳ{lk~#8Tēy,l4o|MNlK߭{koo6yyygg̑O=<ɸcdi{! kOO]Bqø\.8@.^Sϼ^[d*ŬsXD0v3fJ;̝;PQ~qlfQԤ(&uފhuhvͯo)EDDD~e3=f̘u\O$( ?@FO+cWiwa攰a4۬NޠC[ntH{I9=l{ ehe=[\G"7<7;i\S۫t:cO,Cz:9SXx sǞ?˥6afs@k)o I+Q:D"73fpȈ}VH2OֻfLeow~`R4tJ(YY JN/YYJ*@p""",k z5׫JNyo۶(((((tF_}3;z&O;zC-ߜv"|4]'H6Ꮧqa'rs(Z:$ff/렝wb@m6z[S?;t: @]9儣1lw""""aT"`b/XDϪ zm_o88 ug&槟=qtR4Q囹"""" "ܻ )0O[ |ȍ^{ig_%xyy\zM?ro=x,/s{ 29#9C䳯xYp >!9NKqHM#?c{^_}}?L<@9TTT5zOI;$zs/e%t)gҫG{ Z,#+/䡻og%0_rnvضw>O>8Tąɮ@"'eꇟD.8wlׯ/?_7?͙f=wߟ`yD9`䰵7W;Fg?9s&vUVVrgssꩧC)"""ESE}ˉ~:ϯ{~JѿM]$V#ivpyys?ew4 /r wRZZƩ'e^Cyg\;m 2^wyk2qL8}@.šBQy#r,_=7O/ˎkm2x̾؛`xgYo1X`rәm>yՉ0rl+뵷֒L뵷0kΙp yVp?:a1GJygȑ#y=z4ѣe]t8kK~m{CYszK|?{W䀑݌;Ͽ&_|-Ҫm ܾ?=wc ugc^pC2bꇟO?g^p ;d*n_;+H+*y螛wڛ0| 3S`=wG`Y&sBmm{ pXҲFnCw\o;갃s~Ϟ5{:w\Eض͸ϣtU9),gi0 k'} 5Ccd2٪}ԇ_\Toǧj6Ab8]x٠[%'߯PQ!VVǥ֕ {x{fB; ~Caa~kt3Te\]pTVWM߭q HR~~;}ٓ&mu-ξlo  bL>]WDDDk~T}IfZ~Eګ)uݟspncsϽ:m'_P2>Z_|u"5Rr coY|,f欟7gKrxs/gC`m0k1yݻdrޚǍ=` Ue<37r.frq{c ^|u"Hp:;{m J_vwĞ.3f}1xᕷ8uo`uW9ݻ2ǹ|o+/ ǟz_Q#?=TUWg?~&Ƕ}洓q) _|.yA^|u"Z{$@.M%Km2n f<RXϭ_N]s3lw~eO="8N:8/Nzq٧x7r}~u+EDDD:l2ƌsf+dǎ`6"&jn:oBM4q`{S(..n?J9̀F_^'tJc8`0˥G‹H˪1cF ^=`m~}izk$ɗ.CQ,oAGpDDDDDjxU!DRY"""""ҮۻoiVLDDDDDڱvl11i[th4;ƟMiqU˶TUTqlǶITWUaꞩ,aA_|*E:Kq()( S*vv4vqTLdN;゚>V{bSXx 4u TDD#^ H4tja`Y}$?˖OT1lջ''{eXDD܆yR xٳRzK6ʑN!77=ۮ(**(t`.NUÀ ѤCYu## z{LI!?`[Ǯ#}XE r߾#H$ӪT<,K"""" [k!v1p[AA尸dA:m7\фA 0 \8ĒpRQvc&^۶q=I:g4M,ʆ_t,U{[R Uy " H, Ӡ{ q{:Ʉ͒ZgoA$R á&M]M }W4!>(Jg (tL c1`p@$fƍQߛбYQ̵CabXM4YCKW!@DDDDD$i&[&XNEd5nM'~""""""!VD ϳ'h94lcLm"?5IEc^ 5|`q˭k/6F l o > pJ /4}K  ۨmT#y\wŅlw;?ibF$m &ay0\rM]jPR,{c豧r罏4:W_GgcN>nx<oOr1sgYYGJ*oGr5_*涻#OfYdFvC 5 P )KՏlM`A<^HnA -<88s8^|u"O?:yڧ>h?*> }1ubw Hmna ӹgpY9n졭.w?7&1j}8SyOޭ ; ҉#""""ZQdU8EgQ1RM8iS(Ζek)[wN=b4[I u a0ģzn;#N?8L8F ۃzhm={ЫG7Z]Ͽ @.cO>?c1:""""" m1Lp,Mum 0;~kI~8n (;,)&\8۶Ovڞz8áG ꏏeS\ʪjDDt7y?/:}y?6eToȮ;p#Oә8F~e:2:"""")>g㣨?ff+ (boxv= z,gP!7Tl(ς 0!@@z6پ3?6, $! %.;;٘|gINn^32xl^E=͹`‘}h4iyg|1G;PN=unk:d3? otq1Ld6E 9#xlW-_o 2z5j[- ';clز,LdAik@\נP<4=̖2, rssUjL}}=s2Ç p&\?@b^d#FԊRMl6f36eAXds)\P/iwܞ=F"lB6 0 ܥt]g*Ȗ,uRv1Nz E qwjv#~\ Uȅ\vuY팫%""""" {EDDDDDDxsp b@tf3ߺ-~ tbz~TO$Q!D63EZZ !""҅4,R] [4A$ꈥ`l(,,"[藺*CDDA0n^U4 {Lb6V7-ۜU]2sQu35Ԛ5_[B6mv5vldزOZ{3c[HKKVl瀎NS޲Nx-t-`PEgRDD {EDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDD~ΰeHt:6Ϻ6G?eщpkZDDDD94ߎk5_YW ][ز,bE}̆? S'&v?9cluȶnQٟFTZjer}jj8`q\; <,v/ripm9㴓3ܯ%e˸I̝WCҋaS O׹} Wߜ+oKMM-wuW^D^nNr;0[̘RtY9 _Xi L-""""[Gf;o9fOLyqgfYy7]f쯘3uAL&>8jote&L.x,>vO.\}8_|eYx=.YCnc.ø{ C|w7I J~u~;/znJ=h?nRÀ}tbVz E qwjv#~\] x ؏= >zkw30 :$n7sh4EIvV&#ݓߛN W^@^nN۰L: (]\Fт<$c}0Y_|EIjJMm]rH.+=̌t]\[DDDD7W:BՑ XXvu\竁EuM-MNk]׹\uM-eqI$o,˹cKi ڷK/<;O侉O0xkjx鵷y󗯬ә b6mhk=""""" "[0ʠ&9?p\NN6ɏn4zۛIE]LW2c8OGpI$OOKe~a1hziX\92ަ6dgme!˂x}{L}# ́i|0}+**އy}ܖk,b˸;X|9ٙ8Rz})_Q TUrȁWq3}筆r:1 _Μ{uˆm.=B[8 1lnwqcG"L~(r}:CcֻC[e:d3? otU&=߮{9caq5L1ݤ8ӿ_oͥkoMハgn;sc Vm{a|g_k4g:::Mxf8m"""""eKѐS"""""","""""",""""""҅8Tٖ~" !\.TQԪ"55ۭlf~˗CNN """" "@ U - ߯`, l833S222*(l x\M"DZZx\`M! "L(((((((((l^ Ϥ(lv;~_~?v]`M!--:B%--M¡ȶ#vU,@NN(lJ999D"*fF=TQٜȶA6S[E4#aZfoYX.@ a-3[]hczGߗ?fp88._--ˢ1t)Bo[k/%Z44Mb8 oh Ӊԙ%"""""l6\.օnb8vU""""""a'u0wL,"""""ãlRm#ī"""""","""""","""""","""""","""""","""""","""""",""""""&GeچFB ͎ÝBZz&^{_ #"R[v 0ѠPxAA$f= P]%nw`7"j*kpc@6')ii8 (,HM94XI WR3\6(J==p<bT{6pM9+c\)8 1PGE$g^ e>.,% _=ۭSPP@mm-seth@ @aa!.],:9Im(*V/e,]QE] *k Y`ӭyyMaXD VI=號A(qO~v&d RnMqMNA>y;b^5MsV`(Q7\ r" bB1Njv9w ;t/6K'Xߛt8Sc*Pv}zM]ْ3Jk5z=\lؐn~:HDDD:n3d\. C nr@ L!H $D~j=I$pyY50͡Wߜ互#=޴~n[IaBQ;NA< .;DbC1ܫO.' D6Miu吟*[Xq"nZ8ˈxS=xS2t 7?p_⸣3]'o"4y/ -!矙!L~eJ-q]s }u<1E-cv+-9?ǞaA"RS};0?tl6HGxny>XN<(|t W\2K_U[77mZm(΍U0g;+n82x2ep*&zBi9XfS5lٱ%A1b ̦^8ew%zgK䳽aV'ֽdOu4@mu P\<"V(:B u`ÙCAb0_23y\qݭDQ<$J\%:wqH3ҥLpeK#l5xEƝ}_1>82KyR8yxw9儣^H$ngw/ɣ`Q]fU}y\㐾koZ/*YPe`F;ϔp+" 72/q>|$!# :mlqJXi38o /t?r*9{"眝ҹvg-pǗUF 藡/zCzFɮV,L[ nYgq1c-ٚf0qq'oV>GzuW.d_НrHYux*E=閗CVamYN9O0t;~7w9ǜr.7z|ZA s|gO[a㩣a^9^Oܝ2Ztmuc:OcW0kIGrY2-'ӿqlkYPayCq=ԓ{Y\?B|.[ZwuH=>GS85 CNnl0tR'^toP4\8X0@4@iچ'-PkDH7#¦,/ 7K(Ǜn(X###'&Ͽ㋯ϾOg3Y A%ɍ\\Ǫpo7¢21<9}P^ςXYQ%Ko7\ X,ag_|7AvV&2QGܦ\^Uw2Nyn&ݍgzwA#pɈLMajQbmw ? s.=5G^+;9^;Z^82Onscs717-.qT_`AM*#\[& <6^CrVcqm&Ņ39w 2g~WMw=_qTv-0z k,g HL+n䝢)T|#9t#vYk=h?ztgdz~ n|7Wœ?AI#^#l,*vhe_"O[7&ڗ\6x޷1 BqMeoA1_+"<1G~K'/{xUomƦ⼦'I.5w[,o>;EmxuLw^vվ~96L3q.EDD (nIZ~u5DcD`8RӲHOij"apKO|v_hzB',RH 79YDF-7d9XQC( ͠ ?(@} GVF6ƞb&\y зO9rs19}A"8,7zs eJ/\^}Zls ؿ/ KfQK^enYvJ,%n\vX/Ker!#D"zgqY\jjN!6s/Fw75Z%͐v$sY\G7̪7qOsx|;l?}zKo[z=,Y_&1շ?pSR~ewƮbϾ:|"Wb㹗&eI2~o:'{$\q!3GSPϿ`^5] IDAT~ \iǀL'9^;NG VQgd_5khk[aX ˬ˞C|,^MnAb*P\xѓ1L884-?3Jw!>Xȃ;_ ?sڸ5̫pT}z蓏M[n+o&s8?3f  JӸ*N~s?ȑdi8{r6q;}饭 ౣSKENi78}4D}ǡ}Sxi# jYgwb,'__Yi0ᐼY@4'c/s9ehZAL>i#&Ѓ,ݺy% L+nX}~LwL}sֹ\TU@?Ƙkӳn1FeEE ޼ |:AGFmmuMk'|Bnn \x <^|-[Z̴x𻚭e8vP:+m|i`O<4gΜ/3|xb`H$¡:4::mC摮f̘.G$ O=""""""mp"fpTg6f5遻TND@la'u$63˲6}Zu4ɟ h񞑘rF;H >D'mͳi """".VCkk7y[EDDDDDd,"""""" """"""" """""""]C%mI<'c&ߖn""""" "W0~m </"""" hf444lm6;EDDDDE6qb /""""Ih-xa)7q/{19?ŗW\'gRN<(N;8~o:/2,/&UEDDDDփzE%eTVUsqVVV+ko/xiLz.^2 /(t Ksӫgw ?N'n ^|qg&3#0g.(QEDDDD֓nBKsȽD,_ &RT\LG #T@`K{֩,Z\F<<w2߇H$nPDDDDD -BaVo^,,)e~2_| raί.(Ų,QDDDDd=Xd (Y=r9Do}7` vs'Eu1'yi̝We8N-4y523xꙗ3Doy.;]t.apIgsއ#p_./Oo;nקEٝ;nvp=:oz?xӫgw^|u*SMDzLɍ^JfFzxתC0oMFyAтE8]Nν***9p\smn_gyyB{ /_ɑ eMÚ+ZT_ :,]!\MWe1xqŤxkSϿ&o>XF͕ϯs{)m^!A^2קo󊨨bĮ;k'yЯoo Rt9 ߉k~Zճ{rڪӵ7|@4p52xP**$-.tr1wOιj""",i,vBCd.YE䴲˙Gp{)L4g~s~ර1srч/xxzҽ·b% l ťR/ӓ4Mng9̌tq#>LrܓÜ_ŧ"RWW<w0|c왣xgʖێSO ѽw?ɉg!/7{v铙_yaCC~k E%!.^x!>3  K4 %8CȵE]}zv<0_yd4&=p/NZMLg_|óz7_zݎeםQXTˆ;%CmݓWNSMޮAշ l # -fHO\.oMaK}u2v;nςEè#J}zq:`rL+mA%߷76Wx ƝAj=vۙWzvCFr{r9²WIKJuxR]SvrqG5 vÛZм};eҽx8_n^|qgNi=G'_Kr&?:T_ 3f}Κ>KJ9أHkZο e{M8vLӲp]-ڵVۨ99`pӋLʖ-1Qrqx=r @]Ӳw5elWdsx2L3NEe i2o~C^=SUu Cj5rɟw>,^eӋR`~&@uM}uaɑ.WTVaZym#}HE >֒n;G3bIIdf,_YAZZjۍD,.[U.^ʀ~}!_Wlr2Ӓ]\vE%xV&>k0p@_uTTVq798{)~~s""""gET.); ⛦gV E>e_Ml6~+~7>zKvXPX,ƓS^beEۭ1tc HEeuY ],a-zl7%XY koGl?tn-.)Mbe%6-ysq-mYM;qn_Rӫ_|]"D+أk-.[F>=)%0W,ZVPU]eY<sԡdefH$eYq0O>Ree۰V l־Z RxV>_ y90W p5EfF:7L_H D"bO? իο5.p7{ykNw -Knt:: .,>{rݕp3d߽FpO1 \z\{]|)pdgeb; Kӫg7\.ga&[[Rݶ[AW\<ˮh4vsMWaY%Vc4 *Zv0t;V&{%Ka==ISHKO[#=-v!#{5t+Qq3r2t~2.kxavjzA ߗG|~*y*}wPQrpW0CRq{5  m63N?y7eӻ'6u{’RFr8ջvYGɩ'}ק6g_0{maks%Ф)ʝ""""Fbqdglhhl$ۨܜ?ٕtdYsz[gΜInnnl+v t򉈈HW_TsΜ9^f8H:(@ָ뚾lkV]pm]f̘.W2h`?-""""""`Q٪Nv?=f/"""",nm6"""""6uO6p8D"lcloc: """"" "t:q:*6H@fQ;$DՒr5&6wJ:Y6`W4b:+FkCe˩!ϻk|NQZ.ՌFWZ(Hۆ j୅;zcrV0C bi;SɗDDDDDDz8LLu55b&m*'X[I?D̴kvƕeTLlb`X5?3짦O0#n"%-43ᯮ>4|dYQ37-"""""b Q yp;W˩ic=|^D W|EUW6H4pzSpY TU4/v z  _gï|E5 Kׅ.gEͪXq.P U }I=)\[2 3N4,MI0R_Cc pfP= X`4}1a,V@l7&l\=ÛH}ۻ0˪}r:w"d (088QAE #fȫ3:": HqaA霪+a?n:Wu}?Sgs:gy6Jy5 !0N:Dz9*#CR4gP"љ@Xd`s#cW$If[wSZ\ZI:Bx,+cW2ٱ ͐M)PPUA:ϑ2e8P#k- Ԁx"r8!HeIEDB2$ɤ""e$I4+V߻PgA+F#5D"R!w1n %lĥDC#ɡ~J<0JP NCCb/|D'_FzH!?mM$If[J@4@sfJ@ǂbXuBo=H$Ix+KcZocRc BX1Z+T*8X,Ju&J1Maa@!wD0|a"t:IIOD4TX$_Y$If@I`!jjd3DhS\ [6&\(PC$JK&d !^/RD>.GMdcyF5R4d{] - SʖjdB!_F@]diH Q*)m; B$IPU)W{DZhJ7G3tv%?Hs3-ds9wrG_bD\7ߜv.I$k9lbxmoλok> ʫ;?7u>u9#9>-pտ~|G|{|_﹘<[zƷn4K$i9Aj:[d< c|D<'cYk^rR$AH_ L}t͛/}.I$E c-K&b* <~k}[8ܷpN[[rG?֬OYF296٪Xx!ȥDλ.ӔJ% \$I]/|9elaE(߿?|>CtvL|<@o{>F qM?s^}.IY` nglM:"f}W沏0 ytnazX~H$H>ZI$IX:V^H$ttJ%yE|>x 4d3^u/{ IDATe 3N`n$m-_+^O&g<^v.IY/83j-GVv`3ѐmj5kv袝-;{}w1-?wwAܹsIoxx{w{e^ HvzWww&N+wu9i+[jhI$I`$I$%I$I2K$I48 tW~[︇hdZT2Y'.}g_zڤ9S9s]D"#$IthX:]+.oo痨Vk>_^ɊÖ>ae|\k-ï$IiKI^g<)'54dyΉs]Z/]F׿ˌJ&{Ӟ/}?_J&9 aUk_ ]vɇU?nW,^L&ZΣrs3?o7c>?ҵ%2StI$h$ ͝31m8*| qOcO^oy=/xމpӏׯ3r~7}|+%K/c$ItZ[d"+^z:3j." Cnv^/'N𴧮`phx_a˗uwL,'I$ &ZäUkyγx}Ƌ_?v%oDQJ2s$W]~w3?]L$C-e4\0gNZv/|9elaE(߿?|>CtvL|ْI{ @ss#~Dž\9>J$I:HEh kYt룎o/'IL&X*_Ʒ):/лiS7tD"N6ang;^>i0UO +m7 CVRO~sTx'?y>L &$誵xn$m-osy^B6ᬗ55  I$A*3<3Byd%m r4d0n;ZfWӶwIGGǴes'IfA5)sP.y_<)߻;mOowu9i+[zhK$Ix`I$IX:użU$I2KXCCg%Ii)tX,F\> ωNDQ ^$I2K^<'[$I,dhI$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$Ii$v~0 'X2ג$IjAL׻ALiC8 CL$IҬcX$If{X$I `I$I $I$X1@.'L;<=Ad$!υ~0(MפEs$Α6No\4}=ZJ$saaIXfJ-yɪ[ca2<+Ox0 w(]w[lsd$I2KAV[~ [I1y OOY0؃~~<{Ϳs O$e=s=lٲX,Nggz{{yٴi?93wY$% G6p pJam>z>zj^WrGZgz)Ճ$I(ВtPaH,% V&qWn#ʲ IXA&[ 3u5е2l__IX$I$$I$,I$IX$I$$iȦ \>n5 -}ws}q?maHf,IHoJ״m\(񫧞_k;FGȞ0 Ƿßڵ5ͩ^F4$I`I𝁕T5*4Dw/`xh K}: OvÕW]?h$ŠÖu*>K,$IX4;\7 G6Vڶ'/}-0r̛iRu782݇Exw䍕CO?JMXoŧpj%޻':ci~ol98 顧V֕GΑ K/=u_F"󟾜g< K?ݿot?pk/}ZӞ._:A+/my^? x477$M+,IĚ07S{]#S^1_?$L|+<7;K~͝:箹= ]\l*97 ]߳8M94{zQڢI0Unu|b|Vsޚ;fM׿g:~Z[Sg?z\w^zxNWC}wrzp\5ǻ.z#}?a]qх-U$Iӎ-SRoFjX܆Tܴ2$Z0?1ڞ:i"oڪ5kxOԧu8E'ʫ{$nF~__zҶ׬`$i6,lQcxzk¶E[Z^K!XHcn]s\fzs5JCIgDFsKy  BP MïJ춷ZLrcYIx >~TMycWb(x`6b͕o_ #qE/+yMZɖYQ ]IҴ=3E)K^R @: ԋK%Z|dǛAzld][-?Y-3y֭7?aCl޸ 6e"MS0vqA&:b)~5oK40wp{5~tz&&=>m>Džk樂V DzdSՊIy,;Kt C{}=`ˮ7xѥosز.eKV.^ ^r_o[`Kl, ߛʿn=eVvӴ շq|{9݁GZZI+y{^08./G7x7f{?̊z^t1Ʒn䝗~˗ȟ+BB;Y/;n7Vx3MM Y/T*\F6s&L X|)xS9|rA>׿y tq$<cpF[et8G $ ©lB))K@"!T*u x#-)zƭjy6RSJFG˄@- D~̙~k?Ou޹g4̯s[׫|mɋx_K) KΣZC|i냜ټxJs_á54#RƅS* JNLh׳xA|nZ޵W|!D8i1[t2`tvzeEtOy5۰E 3OUgu\k7BH1G=}-oRXp>%u@hz'h}< F4Bd*lbxWdZH/2d#ʭ$E$ gn(PMWcX\J%kG4=w8tǤyn+&-S9I?d>I۸bqh=^1'l#D&K%s6&&FN?dN? ;?ia˖pտ~tu|3Wt~׼9\yŇIık!<[ x<aAL-[?x衇0BooD^lٔAP2K,?>z4po `fg;H1z>餓ظq#.$I2KADrpW~33ZK$F^"Lƒ#s9]岅$,^x IX]= xH$szh"Xh4:WXAz>( i~%$0 D"A@4E}Ҷ]$G''3_MK`I?{Yϒ$4#I$I2kB$I,$I2K$Id$I$Lv"I$5$I$I{´kւѴe ̫t$Iz7sM%I$͈l˯ $IfM qv]U$I $I$5S \OO$I:GW oJ% Z$I,r9 B$In \4-ՊD"aHnGM[983t:maJ$b7t?яvȞ,\~۟fA޾DS(v4}iW^y%W^y%r K,!I{ν3k׮{ >:;T=׬:{ga@b$I2mN5TeִTߓo;(V$iK2 O,n W$iz]-c :]@,Itb5#v{ޝaY$j6> 2kݽGxݞW$if=yѾ8O\O+bho,{r@XI$ssEioz,I:Y5c=jO={0$IayO[xwI2Ҿc_F۝e|$I9o 7jo-aNiju aJ$`{4OldE8 C?= {rކXȒ$I3;<~ ÐH$b=NPpʞ*%I4s\k.:bVApOGI$Ms 6Avoh;;0$IAw_o,e{$I2T{ iuP͟GW$I N#2:Dq&Z[H,(elfyt& X1f[ǷYGO>$6`Cy*h} 7ndٲeDQ[$IҌb> yz7oa`D="MBax+-5}= B& Z~+{W#[hLBy-[Gmjn+=5N0Ho~rJju.I$<Ux3s1vKC I딇{:Z%H0#Xj5 <9m-͝KͣIDATKA%\iGg\浥z!Oi?| FP0K$I2NU LGF3dcaT(Qtŋ $If$'xF@H>^.wS.3:Rm3:cٵFgGJuRċ` /X+Wb $Id"l˽Z}R07FT Z`k ~hx|t[;MǥX$I=Jn'Rk BǵbN&H"M2D[6 a"IR$HӤiXhWٺu'N+I$i%76rAl.MBPTHLR>:3q3 )oaK)C",˗)9m_I$I3-J4Cg\ZI"#*4ϡkN#^h1 Q !d^g3xH)7pJ$DǼ4K7n4J$Il]v/mINܙVXҎ Xںxf,io}˖-3J$I2-$I4Z$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I'kV$IҬf.2K$I|hUt$%I$kڱء\V$I$i$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$It`ğ$I$ALiC8 CW$IҬcX$If{X$I `I$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$ICP"$I$Mw{^o`I$IҬ`$I$%I$I2K$Id$I$,I$IX$IOE=G^ aƹiOOh: 8E)K$I![%I$I`I$Iv/Bʣ (UjԉKhhi%XQȕ€xV7lGS\hǽ 7ndٲeDQO$I!Ja f<= ±#topF4DKCzq~ u [/K$gtt+WRլ@I$I$[JH 7v aFJB 84HA D I<~F"~ -$I 7GEZj dEX\g4(l{ٶRRHntbi)vĉi& FNI$IKvXQ)7߆Uր A&r QGI43-Mj5Bb$ca^JIӤbPYni[%I$rluLK+bZMF^$i;, 38\%(iH'P/LR>l)((_I$I2 FvbPZA%Lmj9jǜ\ё'iloqc̙080D00xvZ2wƍ_I$I`=&iHӼɴ!E mm'Yڱ?׶џ-[f$Id֡k[˯$I$K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I'kV$IҬf.2K$I|hUt$%I$kڱء\V$I$i$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$It`ğ$I$ALiC8 CW$IҬcX$If{X$I `I$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$Ib$I$i8w:k}um$I$; `I$IҌS `I$IҌS =SPc{[ !ufMXȼo:̦Iѱh (l]GhhSڒ;^{}/_@s|?Q}u[ hefF6$KDi.I$I{ Lt6EP(P/('Rb 4{Dt:$ e6nb89Y %Ixlv A}$I$`LTPP+R(A:}-PT{I4an~z*lZ{ Z_cMYJү$I$ ɐM 5mmLPR4Q bTD)Zi켨w`jH$uGFqjLmmM$#Pآ^֮#;w1u)20,1PCm^Mq C71P*00T=x}mj5Yr%+V%X$IN;-\a3RҐ$I$VtY>1D$I$Iv~F:;-I$I!~&ߞyi9$I$qwLcIR3IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/security/image12.png000066400000000000000000002072401461403617600240230ustar00rootroot00000000000000PNG  IHDR!sBIT|dtEXtSoftwareShutterc IDATxwxnzBJMޥ^bY^(^+E"]5BH@ ^ y(33gΔwΙ3L8ev;3N8|kpG!XDDDDDD;Պ#dž`ٲe?4"#rqjJDDDDDD5 A@qƹALLjHDDDDDDj Ʉy&ĉQN0 `˱۳h&PEEEDDDDDDEDDDDDDjKyg`vld2aE.É$ǑjřJ텻jQ0&ff7 XTňP.о "U`O//n՞H5`vUq3tWp-f jN<1Y|N9{TZ=x|KJAXDDDD{6̪5jl.ñ:#̖qּDDDDD.Rk(\U[X6-DDDD` z S):|TfkBHzM׿_JY~ݺux'x⿏o\PP} {i˼ yQ+E<&j2Of̼]2 ~gݺv?3+2߻\LSSl.pp?OWX«ZTa𖴅^zEf5b{00[̼lC$ǣ͖ouRAcU>couFݬHQ R3frxTw""""RfIL~5mƻfcqs^p0bʤɤTpp$qq';&77jGVVǎaiҼ&s {g\WUIyk27ǣW?(={)3?yk3_eÕ/L}^S pH%j?,+DǛ f(SoQNFb,Ƕ,ak娹]]F3bF1g}>Sؔe6MlH!xʤɼ;{͚6L6]D{n`٨_.:7<>o8_\FQ[C K uz2apC6/:Ǿ>dFkFq띨3>-r 3cGa\V7n)z(7o[oJ20fe|!NpVkvq'S//ƔvӺy|Kh=-닉q4y3nIi-L׽~>-sl{[nF//J{yګl6;*K2ndٖx?Ƙ+{eޔ'-/Ȭ i'aѹi'ŸNSKnmnL^xJa}fߔ^LFԫz&OkI1G2[Ӹ:tNԕf!8a7y}46#vw=ޭhvGz;?]Ԩ gy!xQtڅ?7lLDDDDjphѢΞU}@{AufR;0 -R`w7 n'[< `=s]Lb sLx疹{Hh9yp12}i/`%- jzE0秿J91]s[Fu ww2׭(|h3|.fWvV̟9dK2;P' a-μPLn}ׇ`/C_Ww<Zc%ԧyu fGh:V>IZuB4k q Uu2<<=ֵKްn]eV~].X+""""FZe=w0r |^d+;-^^^ ?~I#9)wZedwO~9&Ns?c;~/m/{8^6؈}98^xru{eo<"3cm gP͂݇:uD[Y~/"7w<f'#3#<G~=װU,qG$`obnwuVMop/mί؜\EYownF/O v='_K`_oވ^`2d@K>27n反/{'[~vlٲ5o6}BwϞ-"""υ~oiQ|!5mFTTSL&!!ܕ|A}䑪Ita 'I^f(<.wV:cfŒD+,/Am2g[||6o\Ÿ# [-smT~7f-L6˃mАo'PX#IڹdS{0oh3`Ç bꬱLX>GCǷ쀃Gtwrz_ڒ?w[0_uk]hH{LvAz!%.4mhN{fkN΀g^h9].# C WDDDDJW_^<$'' OHH`=wOk%yxwffߟz @rR.ҀGaJ;&|` A}l}rٶŦ^f8zi^^=ʍhB3쬱cF3>l$'x\z ¶/E'p&ϽH`b.++铘u 3Gda=Ѫ=,b0 {NGZxC:eg[aה|F >akmb`'^Oݲe+@^w_=gةIw^T/""""P-U}qq;mZ>ujq^?^yMIN;8!Hc_{0܎ Ya$7_'ab>ܰ9 ^74V __GgnӐ?̋KYFtj/H?K*Dћ&MX20!|G|bsZPgV8(μ݇VCqߴ_iҟc?:w#Õ tJO9qpեM1CDZG ~ܭkl֊XTDDDDj$//#͆Fjr)ɧu] ѣ13|hNݍ 8*Ѹu`F-aJ;Jz 0[qKk;lu:7^31_͎#7i`LW6Sy՛yo͞M9'.ïRg2+7[/;p3O^{9?^l'~Vzi@oP^\y%u'dL;S0uK|NoN(_9W!ak`,fs໥lo}1=9fÄބ?jچ~OX۰yp 4j&>Dnuwf{n FuWQϖUȞoyjv 3G/e'#1?"^!RoǗfsc÷3'kM/o#u-asBצ9QzJqJB\b^wSݽHHƘ-fmj7oeF*_'U3f*7kr~miؤAuIOMf2 <;wrv}U8zY9|"L`˳y{s\*)^ck\zzyWʼҟ1䋧5ʧL#UQUWDDDD.OZD.wVy&JM&՚H5VcT+¯ JfE5&R+"""")[tfK{ ._n0pTTce9 :"""""%{yyb2`j}Mxz{?+""""-,{yDj//,幟8미"""""%{xzA|REEf a`X,Mf=<0"5;vÁӑR݈U+" ͂EDDDDJIHo=JDDDDDD. """""",""""""RS濋@8N\p#˅ݞflQ C}jZu8m~sO """"ՍĉnǑІ B^jGzH5Mwfb6k[\&˺_JVhݪ%mp\ 'ڵmÇbkTTz pP` :~d%k֮#ۚ}^˵FX,#"?'5- 'N/,ײNGcܸqUVDDD/|?ΟOjjՈW޴wcӁ|Ý h{YllZKAizw,TEDD.w%:VF?N7l2\.'֬%55kƍLJb%ֈzS^H^l%,׷ݻ_~̿'e/%((_z)n9~L=[8aB:Dҕ2>3&xYi>OFV&n>={,QM8-6B=ߜnRèqeux73:y.qdѤesxuǯa(|MeZVնc_r1~ RS 8Akvkv妏e#S&c 5Ϥ:gW_}Ë/u7Nŗ_o9g{LNWZ}T<G;`ȣlݾٳfy`Ys&MijO=3?ǪUJ{C]ym!ڰg{iXqъ{AD*h>ٻĤ$NNHNNat)o7?x?yѣs{h|1RR. ~; efevz*%חߝǟ |_#OfPyyweX Cy޻IReW䬖̠Lwgſ2ic<7?L4Ip㋈L͎,95x과ן϶5^Mayhh`sONgx h}GqMs3Q+Cxv; p:iȾpOnH2gf4 &+::_ȲZ4Eu8zcGK?_zUEDD.~p!>L߾j6cӸ󓍤UZMs=zwsԩ#a[WJ/\ ++8n0ouV{v̖q?`EN3}z|Z(Źb̘1L}<s}g]]r'y_k֞_]ť)Ui[0q~󝞴NԒ5q,њiG[czE/Y/ 8ďu3[Wl_^'Lf^$ QV/4Uĉl|̧Kۺ!u-VRfy̾3mRY ߈twPJ-9M汪Mމrz4%^2_}݂B[2 W*{cx-9UKYq(5K>k@,+ a?j2SO gKA4/LY1lS(?x\:R)P6ojZd1| Xdrd+ѓ^Tw(xܜ,f?*xϞ!Ϋpg}'nb=NRBp.Yg ?w_ Ό ocM0J0R"r~O@:tW_ap b!$JzZ:iiig{stvu:AvnJ@?xWE@0u%4uh|oeM'1([ʳ돕N ~w}Q u_rܽ%+Sڶm[aC2lRq۶m^_|Y"]\U }zɽr1AoVF_uUU {aĞ(ˇ;gژvA}JĿvWG[8~> q΁њI{K;tI-;/bzK8[1̦2M[:,::ÑF|V-liN ȪۈYƞ~Xh;ԥ>#1~kڻų=2б\U/+isǿ]wڃ3y6v?ǕX?qQ{xkε?.ͅqSߣ1jLwᗲ?\n 盥Iv eؿ|6&K[Zî86F)|lM?do*8q+N3~0|~#z|~Ċ3~... 5J~Yfj /9hei*n^6,9g=ShUu>o'&tۇQSp>lmYdg(G祌)p^Eoܺ_/vd@ Kg?Y68Go!r[ mZa\FӭyW~ "'?I9j%#-yf&=zW>'=]KpRi~.Mhv4[ӳ6^Q.Ͽˑ?[78;nz k׮ ?-XP /@b?sС {: (^݋+WV=)8Y??>IFl9Ou>;GgNӹ\66{W=g7pcC|՚$Q˕AZ@сؗ+7zp&:=Ē =|ueyAрwOҪ%'?ÉͿ%8d1"sdHf'/:Ok?`o^h[??탷=G8ᄼ6u"42`O"x*gtg*mY\Q6 Mٷ5MLpLM"!!ɩc669sA)vTΔxνz9dȱoϘ"ta/3"/Cmsa_Qvjcshp#>s( \*nˢљWUʑآC!\s,w>X֒s7.=Qϵ}E+ؕsX;w_KFy%"RySy׹4mܘkֲh~-F]u5C.GYdf lظ+"Lҿc_9կw oMOs{5X3mxs2yG?ڸyt=՚_H&zMƥ(GeO`xx^JRܵsgRSR߷߲p"l6[kk֬aQCv|L&zzE}|Ge3Q.چ>{9Bq+U"J+kB;'vݳQiG ssey|V]W^]I}&+3WccciѲ͛5e޽EN`?XbEi2_1Ehh"4 MfG}xu4=®6vn nb`\ID'gyR]Y~!$9[at\Re$M}mwQP~X{W$" V '.\ų,/َEmÊlW9n*{ae,kU(GaZU3.:;be 5GNSZl|vًϻ͝={k.>7BE6J/> \g#<.7b s:axؑZb:a/<"R8B&Np^UM'N0?w"z!!V[Z!7LMN_\R:v(_7֯_G R!Bء#7Txw,|}0\FO^o*;bؑ@Í][S~vpyRBE\dY2"EH#AGLۆR;!'J%QM} , oGo+I1xǑMӆ}_eq/:6#vQ;/16ҷ7/ ,eM#)Ǐ@K#֨LP6oXB< ':pdnP׿d ayWRU(EmRA׭RU60xGp:,b8L7^B6mhӦ mCq8N=%VOogF>=z7C۵3ymD0?.fS';O]BJ<‘:t)Ra+jMX;1edjAMrlj[6(xQM}I -#ui aZӤaC7 |L a (ypL ZҤaiAvs:A4iFco7VG&'?#؄$Ғ]8H>|4RrTV$Zv]RЭWk֫KPH0^S_*Jï@oAMh]3FZZ-ZSJ *Np޴mܔFm(p] R\*kquSauP2e6t ۢ]OS9z!Qؼ*vy{~>٠֌M0m0ewY:ZhA\s͵wLf̸qxl v59+q=sF5>^4=ѳpZ |(SynPzwO`w'N Ywzc㉉Cݭnn>+v-Gww E~}Y8?O?Ә9sg7|;wg72{;̜9;UV>*ҩ Dho/o鍧W_d^y5{MDp ~Z|}hڜq^|wlyW#+0YD:W͚3ydڄ#)%Bׂ^4YC{j޽B%P9c<0yy[cٻyno] K3m)z-=tm_&9:%ppv ܇1t5tI%nb?u\3CZ?}(n#y|g ˆ3 Gv:ё$Z]c! 8NR畫q掏_;o[!6FOCBu'FN)G6l}ɴvH[I4QD2^fQHC.ӐoexaᆑMfr<;l.AE>%gFqGcH7\vmCAѫ~ 5컢7ƵÔÎp.h] Rt.kquS· [uPr6g=]ԉ; ?],+cg[fd!+.HׁD&'Rsͻ,T4lؐ aMfbtVmfyZL]o1~9ӫ%`̳7ȌˆWQyx<5.&&9id?ǼogO0֚_f_GJPm/>LMHHHI$M&lV-[\ D=_6UV92Fq8<ҀǙE:w9PR-gճj8>=-xUkVL̶={d}3uk؟-yh('95W_{?Sg*47:[Eʪugfd9ryڴiwCDD8} q ԭkֆٳ%<5&<-V<}4x.&-elִ ϚϛǑQחUyg{g0yx?0x_{-v;đG+|??Ҹ:3B|fM0jI r["=+la^ qƸ~_ɱ۱Zmxzz7wx׉WS5j<==0 *<TG~N:9-[yᥗIL7~)`lv*BDDDD4˅fYq4hЀNөS.v 999l۾w}.kz*ln;_g.0j@/8OLf )::h~==7q!،'i V*0+Zk #{# _e< T/#0ps`61ԃP1NӁą K""""RE d2c20T<1M&pS]HtQDDD.P&" "[i]EDDHݧ0,,"Qu\ܮ.򯈈asssWQ)lVŽӦҦM*EDDj{ {(\t7E|q>͑`) ""rh&SqN9-i)OeggӶmU\TڶmCvz*T`8رC"RCoNN64mۦٳܹ3~~~cXEjam[]E. t:q88U\N}:|ߑ"R)\d!t\.TQQQQQQQQQ```````l{b,zYL,)4v~:mbH5 jJˆsݷ2&\i&+N5W~.2EDDDDXDj*+{AZPK zv2גyp]0pջ_e}{S LQ*k~WW*RR 8ʥ|b""""Re`)e89Ru: {JBێcgݏO螗!;Ϩ|v$_c+wad-LZ"W2:/QYpZ6ynkb?=}8LcX7,qj~MF_;uQ,y+c."+r^""""R Wof<𷬺Ϥߗsώ:&z%hxaVݷˉf9/>,"Rg6ynV~37w꘢?O 9x$oئD9&;"u.(Hq ~#7SU:>Fե8%ºsQA==D\[(EVMys9aSO՜(HԱBhsH[!-u5A^u;`\DH>wx&6Ԁuo6u`D Z\sw6sT""""Rh)s絟pyz5" =; Moo߽SI6ϕrYX+ WWDDDDEhr%LKb[Ymwa qy hV[/xՏX|>4ԋsG -""""Rcȑ߷G"Rø\.N'999deeʶm5jT+l&v+O6ɱz'TEѹsgb`20 C#Rôk͛5Q \@ɿ;H:A{bK!| _+""""JXD.4c;c] vfwWcz U(H7A>*BDDDD IDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDD b7 Gc9At 32۲|iL`5M羸5ĦPb":. EՉ5A FURwg]Ve+| VX}ts7."""" "5BbR /Xʑc1 i}Фa}_=WlZ v?U ioyk"6ë#.p&%."""" um֝.h-ȑc1gۮR}n۪F-qHS~ILɆWYB1Z˻-f]A7S~^X[ίb1O|:ڡ㟻~YX5w`q.,n)|j+Щ?^do# QӣgAva37p٨ VcH(xv{.㎉1-9|jgHmXM]ؕn;kjwZ g՚ 󸆽xa4wOdW}3u%1/^*' X; Á[:>|j] ޘz#{ޙ NܹI^Ϸ@3Ylp͗kLD|QZ945>uwv«C<=_图Dsf}էe}OݷM{શ/CTP~`28}{~0xPz@ұCx'`&Xys1Ύ͵ڍQa)4vW'+> 75c}B>u$*ci0q{Vso@'2CvVZ IDATQ6<=[Ҩu4՞z[{!tAi [+ΓZ_{г?{?cy`\üiӡer=bשY} 8nc3Kq\M_1X"""BDo\Uh i%2n'y9lY=LvCgq{srO#B Tbd@1JKٛ9,N4Gsy@EuG5 \’cNJ's`=a!{f |{ef5PR=k٬F^;S~ Le+>uo tg1onCo6h)c~{ aaǷ6u\Ŵ|_?­ʼ9O0|K򽌓nLWDDD/h`3fssYUKS>ug>k+Su3'ia\vwMwg;en>6q˻ܧ~ wE5n\5]}m߹?%pUSAn@$>֚Jgp װp!7a B;D/@iI)NoOD"=n g4ڗc+x]>2?(ec/9qH~ñ㇃F y7U6ҋ\ԥMm^̠H YN3/"""|+LaI'ٔ=m%)E'Xh K?} Vʺ\yFm4X [:Yh%{<(}. ybv &y1y.{^wyE,;Md~A?h`T,!0v@nlx XG/~S*HOOZǏho3\ĝH/wsUt_=O1=՛ٙEӟ]fF s|y=V;yN4H&nvZԟ$:HMNMH"z3T=SfEr:w%$v)MJʩ$j_{m#ٱkO˪8لpa#`³W ,.?~7$20=Ǯ׭*C= q!{jcȥ+7>5oL sQYYIII idÏۇ壻nՀIر7&u`iv%$=Ms}1Zz-M?iʉ|)_5B'+˦4ݣL Q/\n!8a<{V'WkyE<޿0?*v#O:X:ṫZ|gap,ІmZKPDJv~6WMd55sN+\TG"I3xݢ78c8ӹ5uø3;.䌞pU^>Ŵ'8-Pߖ@Y>Yŀ1m`/"+$[3.Ҽ\ 9PmiAt 98)$Nv/!>޾ce qlKHCl~v^i'EδxxF_.{v=rj|`q2)mV^9q4=x KNv>C@]/'x> ,oߺOFV拈(S,Yi{r',XC#$vhJ,N!%c7);>";Dc#G]Юǟ|k w|ȵg050yvڥi &iD/zHca(iz^p5Q'B>Xs|KEmlveYn0wȭv3gm%KeVV5& rX>gXX )}c͖B U\AD3gk~Gv;%_ѩX"_T9Jt)V#iodB*^\vvHMI-b-tQnيHyE^ű&t9ܘO5<8l33 o։b3Y2g&ç0ѧύrR7vI$$ń$o?v'oCbBd-mA`ccoM^Fs0~}:UB|m.&»]DR\Il]^r|fqt vsRpjҽ[-u.Ćy}K>=U8HGcVYܾlo޴EBe⠺ݜ."""" -W9)MSf\yg^ ttl廟ӽze3#7^Hg*CVZ-[5eI == @}ϼ3j W;x^.ڲi[j^c cK$ElX F&Mbitk5S*u^ϡZ.).'*&sc-P.mԧpKU]~-51 m:rX f{i6cޝBzu~:fh^tNJݤZIjޱ3y77qWrќz-ybOնY$ VkDBۏ|#kS{P"ۄ1zzy9yG2,7|>DDDDDRĊY+u{xeұA.ѓ;§{k-yiSٿcXn]k[x㍉t[n2#Xb':a47&Na3|\ $ Ǣ-aI!KtN]CPI džuM uֶ7x@"߬twGƸQH)-?su BROh138ŧkbvי[]~ DBCCnCwVkCݠ%ln|1֟L}."sG>LVvyshDGq+ lZquB\Pm[kEDDDD`GAlR؀6y5}Nq±S0VNpƄҖ0i ?Zɖ?7Uݠ,G7Q́܃ (0/ 4p`I8Iqۯ9de;;å?k*((:EGEX:20ۓ'#9y.@nr}4\UnYՔG1晙<ҿ۲Z^D.n5(~+>HRBOz'tg8/U<ȊOX` Ijr F_֤e^eMpDba%BC _^-=R_ʰSXxp\TVVRRRBZ@>EDDDD)gڕK^Ɇ9SvZ0tfl\Zb'ky,vFb1=BN"7'|wvl]JJe =;G?LzGi+ˏgeuo?7tOcpo:Kd{t?};j)[$).O>8pUcDž 'ﲈI8g?Z);Hvѩ4 [3{,f XkY)=/ܿ-N!?a$yɖk84,Jmچ.:hcFڪ7\8tԓ{<==?sKB j_$cI{ ώ恲}lXuoΖ Ùeh ^Ò0P#c)KrGscO󺉈\pOX}y᷎$hO5i=[YOnv._ܵ tޓ̳,Yu'(r̫?-. uA.gڬYk1a )|ϱ[;yF?3N֒;~;Nxޒ'VQn)k\{ YGӥHٹܝ{y!^DW6uk-s)+֛eC':z#$v+Y=[rZ0]k[AJr سe#@H-+<ȡZ].O<3,eɺt,5_YoFlƀ^Ê3{)dϵxJn~Qfɪ}zLjHՂ[ӳG0-3pًܒ.NƚQCz3$" " vI$v8z1ԣp]DRB'"CQCff]whۀ6ZAٹWʖAGky`t&rv2y|~Je^.GwdtEDDDDDDrh"oa6ثK"xrr7FEPb_QXG3y<Ád <2F-$}Y Όa<7Cc#~wWM>>5_xG[kzF`BέypM%6Fyegy}.\ՖCtyλN?Fk=?Oy(JyzK}*yiq1iϊ[;\G%ŕw:p l?ȃ{,lKUN:Sy.~(&w|1)QvZQZ=$JvG0_LaŔTwy(*n#+n//-.d'`sǓy.::EDDDDDZVv:@RX Ӷƅ8X[sm՗q5-IAQWTUL ^`f`&)RxT(9[ .Q|g(b)<͈̌ڎ?DϩdKd リK@bi%l0,Q5b"BKKbg߬'$z}H=6[7+ҳWWjfᕻk {|2 ox]Lѓyu|hÌdw:-_7<[IW1f{W<穿?ɘ 칽WݽEDDDcϩ`gxV#An7#{!n ZPP6VJ~nt%[y0Ǔo2jͷ{ v%VӱzBFt n`ݯi~2RRP~:Pr_:~=C$W? /y(ěY}{xV: a%}[ C{% ố\X.cP@*V1,]}Erwrg""""穟 c|fxM|UQ5idAv]eldd`;3UΝxp-J{3` ؽǮ-c~ ; ܗ.ub6;SsfKKxT/e!ė:<V6L ={3;v9zT-+lov"o0X߾}rI^c[JnuiKGza&JQtWDDDD~R?s sM\zɑ.<4:cĨ#}ߓU;\?Muq6<dUچHjtcCQ)&<ȇ{2l!n_Ì@Av-"7%6?|!Db%y\nsxX Osypl~<4:.Nbڣ@TjbE K}]^1LzT{CP#ܦ=Pش() ?λ^!g_xtݓD:5ku-{Fcb܈<64aCO)?'t`_l<4:޶L\u?w? h`t=Hxn"-C]chR55,f 7HG'1V+"""" 7'Kv2rv3go1?L`>\;*HC~A !" ""-=sRDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXD`'s )ۛ7VcLlRDDDD传."rZu&O"} k&;0|#Y3􊋧G85o֓ri>hft{ x<,3)k+\7k5JIϣ0,^qwdzGPʆW+ҳW<]/L#ϲgꁽޏWͬ<^{fD-"r6 n 8}vA>Tn1:'>3l/zz>U>c;b:}sy_q1mobU!Q&l'$:lȔuY/?WzPL7\g,xKr>/CI'~;N!Tn^̌k,`0UP7"K=zy/C[L<+֦R93%8 3Ih^a 1,a~JM cg|d7\a5@2^}wYY%};8+uwK{^ŋy6'U ?""""͆@MtKHb3mKÞp۷oX.@|+ylK)Tg=`C.'1+{YYb5UFA|R?pS)F^JMW"&W 䒡阵Ɵ`f2H[DDDDXD.d;_|_\1`Gy+5Ob=u.b3b%/MMPtyaكNk$?VD }2חFghL/\Zu&gOzuJpzx==">.=m] '[ Ͻ}O6>//Z3?';[Cpy?W.YYp EՌB݋Y"vKaE{75]͆ZfHskEڋ87zMEIv jg䃔2:wu!7u%f8<她X px|ȥ^A#<\ķoǍ!q_w?&nF8~'zE,}^#_źr^_`q'2rRV  @vߜAjv)vrrpy04\mde w]Qsoϓ\{<}U< 1wZ3_Qe']7AH3a;v+ ۶*"-r4ƏgΝ˄ Ts99| ٌh`0"-LGkEDDDDD.^WUif^o?"""^HsԞ|(By~{<:?zΉ?T߿Mjvݘ7K9~ ^/& ɄѨ+ DDd4~^Ti~\.&zzq:Ngz)r=/EDDDDDvti_@A9_45"@ (G6 "IQiX~ !"ҀBi=DD#gڵ|p!]a *(,""""g@(((((((((HgV DDDDDZ>"`04n"*V&+=}BlB@\wm\s!~v;XU/_u8;ߩXDDDNvsҒrN B`?1L;LO =MH3$?u INSQIt QaeTXN y*#SS6?p??ڵmժIIY$mڹ*)(v9nQʜ Lqx:x}e>OD P3''YNUxEVhiR| Q= BXh~~>tThAuk#]S8kYqX*tۛMh`iTiI9A*DSV~[: (9aw:D6J5Eu` X""""""PZe+ C}:8FiZEDDDDDLa|ev;8v}Y.d~ŲHXDDDDDexؽ BFu3ׇtU `qb!~IkU 9-/LO0/t @zMhQi49ȫ@m8u}Y^q oaGLo&βWo55g;t4B`ȹtbP7`` 71DB%,̌a mg!Qa[[ɿڷ2b1A*(Dۑf_sw~x$V\0N{L8Mw6z*?6;it """s_8ȟdH+c-^R|YU@FPe^tmgh#C9pnyP^he[RڏoFښd3JF!`dƤ nk0  6؇lP塴ÎM\~ 7Ə;[ 0b3{)+vJIz;R;iR v[#bIMgQAU:Sneǘb7vC@>7~_0mT͵_ct,~0>F2>`Y;C,@W"eLu0OBCe0TMKit,O,czqnaZǑL8j,*>e ^<yKDDD\qy#yZ@ ~~H~F)z(wt}]o|4k;-p2v/t0 xX? *|??ĵͳ^>)]umt[筁ĺ<,Tłn h[: $v9ﴳp<Fﮧxx6!-@.KŤ\i=%,ヘbFeL ]{ M !]ʼeL/֩s27 K4Ӣ2`Q~2óP `0^tGBqLh;F䟑five ¬N7KX:U={GXDDDΝiv/X2}P8y!粪D+=s™`6TRӪ*xflsm"Y7%^0 ׊H^]IE7[k`:3[1%ҭvMsUC!#](rp2^wmdw y Ĺ)ڏ~,˴TlC :Up,͑ *vqeDC;={#  75:_#nv17=-.&~ӻfxBSΎL6Vo0>fV #2؝7inP3Wq3Cwa;{xΕa6 """"'aEܾ{s`/Ĵ1 ?W q~u/~;_r=Y~l(sqjKoZocb+]n~NUʓ 5dr&lA H^x=f,ah|3 ؚnЧ@sunTyPU%0z@+ԪZmWL}9l捘D8 \Hͨ \\ |W`y!.A/E&7o+Z=aX?ߎ{͹ƅn^Y++<ƟzYo%KU^Jv&P7$=Ó%4{Uk^i\L0wuSt4Ddm ~' E{eL?:+$Щ>YCt!;+j\<0tWݐZ[~YrWOwS{c*Wmx^m|Ϡ(Kn/Uq+8kݐ2σo^Ll¯#M)DR9˪g06st=s 9_l̀: HmwBթ^;l Z+&ܫ:c_2St FwtHzCvI;B"""r1>) x7^+'H"'6=Ԇam,խ@^7qS| ۙ15ďck9~d% F # Pv~+Rb_QlxIrr7Ӓ+yîu[Oľ{ 8M~.b(Eyiv7qy$"""r.{"p/|`n 3vJ tuLn^[Ql0J& +.gnV+<bdL^\K GGm5sn0^y_V*7+[gchcߔrdž?5NE Wµ٫#TjR\i՝ f8\\' 獐0"y#/‡3Շ @8gpp#*Oev3'(2NLݻ~fbNcg^ Z_rc&qvPoų]qaر^K֮,ozB^CEEH3s=r4Ə mM\N*9Ÿ}? c0XFⷎf383zIHH ((___f3Fe^xp:lz~7is o^;9|͏SEaX06R}wqN-"""r{B YdxيaQS#34>!l*jciTEDDD.LvFt4bsy++x4ϫ4z\ϫ7CO}Bujs ,"""rυSiZ<ڶb& %"""""" """"""" """"""" """, vrZYUӡ(K}yTrV9BM6`i))+S!.ףI: [};s֐[ԗQU9k n6QEDDQٿ? 0Uo;SQ^IT.p-U$? 3d7䳢*5q,"""͖d]r 7C7fOL'oka@Tء6& =MLMc\ rF#|CeXbukeo ^\yt.V,M uHqba\V*$jrUPGFvzz*4ّ^Ʉbb(VL&FłQaFF@."""""rބ`hT˯ """"""3mDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDE2L>|X Ç1L*tшhϏ͛7SXXˆ͛7w`00"J r_шd"<<}7`x<*XFFVh߾=& X;RDE} , ~~~k׎֭[t:z ""l6~~~X,=DDXDZ ljbvvU iL&&hZf(HK& rdۭ_iю\dXZX,L& zv3f<i >h0EE#_&hz*#N`i_GZkO3 ""rA." "¾ """r `HH38GDDDDDDMͨ榬d2QXXn}CEDDDDDg 6ٻ𨪃mL2CDLP4 X"JZ@ Z}Z<`xւZ%BO@@+A*D!QJ"fb!0Huqgf^kftA{?Bp,I$Ig8))P(D !xD04J$IyR@7,I$IҾ _J6J$IdI$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I\r:sKzpCϽ.E,_WIUNA}y~pMOÒ$I`˅u>SI$I| IDAT27'AtM!u+Ϗn\JUz_&u8y6$I$?(onxA 9~[%WPeI$IRvzߢVm2I$Iڍ8`"^[WIitR|Z@ ypB_/eCE5D)3 dЪ~; 9r7̾޳rqZWs)^ShB)Йs\mMk ԝ_jd#E{J?oCviٱpQumx 8dcĀnuÝ; /@5_Xg|Ywpx\lH#LU4h 5J#@]y6G8Ϩ$I/P۶mw O=7\_guGq=^_;lJTaG:myko/x ylwnpg+ջz?ZȒ&5ӧOi^x~Ѯ]~@8ekG>JpIb=?nmͷgy`hEYA$IՅEѮ];:,y晆מy:,ڵkǢEZl8UoϴQ }UVEiM u"aS'1,OU!X;W5h= g'#[,I$im{̝;Ӿ}ܒ@@Ѯlb.k{y;77~s ^k93kt(n*j; ז$I= .]vߟ7~E^GUǢᱪPwA7oPMawj<79,RX񃝃F7p+=9En<޺EVU,JȒ$IRMQQڵ]v :& }@>힙_C]ʄ+&yp>GRʢ3xzs1;]uB$FYIA,R7شpd%#)q:Eu8_]ɤ#2  ѷx췷3ۙL,hG;rI$jݺ@S8630q7pq F 1i1LbQp(vt_I蚺geupn(K[>&9GqYwo8(vJcx;B);F:" я]#[\!O?ڴLJ$I@sIlMPի^V$I$Iι]spK$Iw $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I$$I$I`I$IZϿ/[A$IZS͖uH$IZ@K$IZ}H$\$I$5@D"A"aY$I>e&ヴOu^.I$IjWƺ7V25$%%Ok~mƓtkNɆ_I$IjFڧe1p뾚i%!ٍpJW$IoeY}~>=$IԌO >ڂ$I$I_`1xhu߯僘 ?;$ 'GCI$I8Ͻk=|ޭ!I$߯u0$I$^fhl3I$I`I$Id@$IZ͛Y"*++HKK if{K$IR -Yo@lVb[Rq e6X$IZW_.#s:r7zKyd-om/orA\ǒf}反0%%I u-Zr9on5On rt|X`7gF=̝I-SnTŹ9WfE3PΈriV0kjȹA' I$+W6<}yk`},?8$559·$qx;鞶_ZHlXYy?5QeeI@_jš԰zV6[Cͻ>K1kI5m"?f3XPBK/ ~9υRh1?c"_^ſO4F*a:s^ZMye"m|.@C, ӻ?XT0;i`\q_Ez])I;C ~2#M>:  @UcmfdDםq(5tJ7vlni_yGI)!<@.hšIq+u8"lX uf3p۠YO!> xu_J2/SUK(zREM|^VeSbs Wx/ʿ?gSZ =SYL{vL˞%T)ν)wZ„Obsy\sjeDQ+ePT:d2zj;d>) 7rP´P%EeB{i 7=emb$e2YSGsbS e3 z#/p _5s2Eù<"DY5s2^*ij;'"g ֍HǯÄGqلaʖ0BFf+I>~K$xeX Kvfęv8c򫦮<ѲOo"PE,ڲMeid=OAvLΎԥŬDI\KVRƮ2~m22CK3SOgE(D$&Zww$&Be?E|9~8ICd_- EH^{̧q.*crB#uڍ*=Φ)K?_H8L z}ȮIcSDz8^; r?5\Yd)+=#K XR=!l|[]ߙis)8ۇ|ï$IxZޮJ1HAS&S vমRIjr2|:7?*gTy%Ka̍MřjVy'Xǝ4# YT`ęv Oo-ugkc:r%ѻ>$F+㦡 fW]/_63)/nWuNm"x1q*__bs6sO9h@yWsCx62iDI?ʉMD%LY I(IO+%I XRk}=ۘ[ z 8"2']"U-a2B݆1OI|pF)]/-d?Rj:Osy*L3v>ۋ,fsԏs^L/gq=,5u+%{&xR5'E( )qRDGc !>ZQITLOy4V{&DDpTǺ^֊Wg~69t u匕0w˗(}XȄ_Mc bĈ1mmt(,VwΥgOθs<簨"<Umh43|BR\i]|3fFIgTQLx AN}G~\U{e L|ԯXI/=C ?뭃˳^JRZ>u=[ﺧZ`ƊydjȹA'nggrC,\g_n!V5QYtBbYdg%ĪU@ o9Džue+);h^3Y32=(g9&9Z'wnho|oR}~:ǯ#'q1}~]%?baz ad0pYØN։2a<:gFP|.p9;3f&<&tj8+!%-n+Mu đcL#WWIpd&_[4 Ny;Ω|Jp:zwfC٪nj 櫦1q잺[ee`CY} Q|X='{0Һ!A=Cj&1g+Ieds9'6Aںի^Z[[K<?>X{On=0j0m%Q[C 4HQ'aGlֆ`yC5ՖSX_B0'\RT%ǠBzq òUeWTRC޹sy'FEX8"mF>5s>1,c0b84]z/`1θq:ãrRΝ?$Ivv?ɰ/{r+ϯ&%%P(D0Hۥa9`\Ü=yhmJR~X\dF$I2h#\2u4ܒ$Iөس?=m$I$g.^[5 NN_'خ`I$Iҁ%s\`;GV̗頃>~ݚev$I3.[NgGН ,[͉=$I;̫[q[1_; .}9su?fuK$I/pp])g $8Ϋ lٝX$IĶݺqVWU:mC $I,I$I2K$Id$I$,I$IĖ㟐i<\˿w//dHf_ezL \2Kr|J$I_מ$8YoGzCQ{IY=B]љ6!Ex̛|Bg@Ɓq YZ*I$}Y^{ H $[ HD&.ҕ27ϿNXO.aÀۼ'2oQA z+ѿ}p_g髹wZ2r~7] dv\vrP?v҉3X:\ ó(p7\I}>nA~rU<'aJb,1RO7 {gV>"S>]J;_X(D2sqŌ:z%I/XhM+9#0N|=j: *W,|+ p#6!>O$a5{ |"qv:#$=iObjT_w LN5!Gvđ! Ңn>.UUREs'/;1nBnqo6.~z>wsߗSi0WGpnf9 '~ $Ir^L)/a$]˶&Յ5 IDAT_> 0^/gfp.IwnP=EjO'qG?BխB}$MN I[R3l"B b4VʂKD:uvWAhGoY_JWf8:Gh>wg?lܗQڼ2=kc.T q>4?;=›7$5,֯YfQ5>'G4^{?7i2R;*ll t*IKǿ8rXPZ qt'gcLrH$}@∎-|Hz!5:ĩ@GO/'ZH_ -y)+pvbv0j 7#P>D\9!ѕ,&J55'TO}=slhOHe5 fLމQbxPcu= w{ۤY^8&N88@NeС}]l.DYuYǢĈn}9/O~u1h9m,a] K֔M;Lo<~%̍A$IRH< [4Lӳ|='Ѷ~Cl2 ж#/|Ѻ]}I>~ Oזՙ6ئS}]s9k>v[ңM937pя>xS-gw1'JݾQ{;pJ'g7^'B'ZN95Qnhsо\B+ybKGʄ`$ICIy;]C'cS!am &uw9F2:s|.bd ISHw!驓wk}$Dk鲶SH=9Сu=G8lz8,j'@uT756)Ne6>?ΏY&6S z|R3h+9u4Bl=ַ/]f?mq<Մ=?]N8!qG84r)6ߊ3x~sn<d6uJ5dpτ^f],ï$IZp.' K܎ఓ 9n7%\^|!{|n5g~ځ#ѿ;{(BGX7$zwH ^ar>JIxItk=̦"[w9QJfl%3'fq5_3fG?y]+y~j!:1w v/oEop|Nɬd)LG2G*.8&bS"ycӕsͤ㧷\ww .f{B30{yQ(n@$I- \7.9d=~6;"0 2N'ǟ$Pa;XE`,S;YSH\I͙$=$n^u)GD_9眓Vdm WX,F4$4[B$IRC^D .`۟`| ~3fWkD"/lsn圣:`I$IRb$I$%I$I2K$Id$I$,I$I. Pui7K$IWvuew%cu,1f$I_@@ Iʽk.} d|vhN$I`]'d|:;RuOߕ`E{%I$8~<]PSSC" HX9_IIIB!¡X$I0D0$ Q[[k| `!7!`I$ImA{~zu,I$I1\UM0$I@K$I $I$%I$I:-'I$I#A+I$IR>!۶m^$Ibo @rr2MޗJ&92K$IR3 `@p[ClqxGmINN]!I$I: "` I$IJ>~G=%I$I_.,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I`I$I $I$%I$I2K$Id0m :%UF!?pZbk.aK%I$)L}h1۹g3kY!I$EJn Qf=M+-i,ZUIY'-ug#c?VRHq@r,o, )YQ =)(ёYy0Ҟ*(s8OǙ|lTRJs 9a \ec)O*aRR^A8w0X>QJŔT etEzj6eՏg0u8b,-ZMe,DZǞ\a3+0wZ{h&I!+7g$I$I} p ΆϡiĊ~ ;@Ẍ[ļ~<p5yә**ĄU l{aa@SKɺnaV07{Ō#Y[4*mR7y ^G4.80Uydq]ws8_gMޟfۙr~<'h{MupcQX௳&1WSoŠ.R--䆳#,2 Y~nfdEDI$I2krDCW-3~ԓ0z~3~t#(i)@cQɎrN''V~ <&HjF HC8=3P[ms @OvtaOYtIῘyh;%,xu{܏s`Ň LjF! z^>?:.$I$i?05K~ԍ~_Ȣ^cr,w8 VSV6ےaZFTVR dJ):VĈmX;DZv[v ƎQlf.auEPp\Ӊl/Gjv!ھTNIy\PɊ2ʣvv9Ů:6?[ne;+=GqI$I2"0QL{9[c@ ʢ{He?nk\]jn읷5~ ߳2l1v &^}l]BY kC;6z=rPl)ExWsuXn$I{->t0MfZɎ  -ZFYW娌*ZNy +J7Azi$NnC!VK]<ԇ_r1'VuMςAFWF(p:91q{U*c#I$IHv?fCE;&:3V3b*b@*}x ؏SwP ^By X¬EdG6dCɲT" [M$13TŊPS(F=䝝GxQ,n _;~8эeTTň+⇧dc'0Xϱb&|7\UWWTP&i9$ItHn9&aYtpA\va%p9'e/z~Ho$~r%wS qF_@ λ6(DZ|^>X&2[ǒkNL)9 λїdӹwP1;F?qB9 _|V>wLaW2zzb,_e| Ҳtz!<.n0￝vH$I p9$&(Y[7SU%S]]wRxۭZ9՜p?6K$Io rs |56}9H@ ,I$Ij`0H0lX|jk$I$ߤ$II$%%tft-g۶mul)K$IvorR2ɡ;Guo,fBuojI$I$)I`azqNw}᷶ښmeq˿c4J$IgQ]*Pܶm6KJͥ3X}:N$IOP7̫\4ܸx[60~ -(I$IdXM4̧Ԝ&n6Chk$IC$%I$IOÝtthos$I$Iffwm I$I٪`I$I $I$$I$I`I$I $I$I s:P7Y3*YԊq?hi8뙏p$%I;n5[wyb[Lֶ$I`I>}qc˚aJ*o1s=߃3"PVΠ[X31Lv+شE+B+nY26 Ӗm)qOsն$Iy $I{닪ؔ܊[1%="w,Z|#K-kʅZJ*cf0 Hjŕd#ش߽UVk<-? [8[*⇬ ƞێdBr__Ze3!t$Ij`$IwLoWpUl!֬<5}>`r-*IX&5u pתa31 }–r\Y+>@L;5mV![*7\:eyiô82?.Lؤ$%Ij'\\/|p+[->kt o,VR|ln%7c?_{\ƹ}KWX=旧±xukn>9؇1lRlK>8ul%(h"g3gpw@^]BLOlھV#R-[m.IX'\NV;5׋sOϾɿqm|x'+YUAf+W>YWBN39SI \lږ/U3Ktx7x |+(e+<_eO3}tyv _I$Iڹz qw$I; `J$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$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$I $IrPl6 @6%  Bi$I2%Im7͒fd2dY2L[7&no("DÄaX$Xl6 -ɖe2A :b#YmA ! @8!FDmcX$XD{S)R9rdoEl$%jɍD"3r9h f2Ź,tT:M("JD1A`KdKd2d3RT#z ìm8s睌D"$ot:"N-!JDX$$iKNdZgiA@4%q Vݲl&ötT:E4%֭,I,I^&!B&&uٙV$zbp$q|q6!ٶt=vsKdKInmZgi{#D>{o۶t:Ŷm[$I2%IlF2B.#F;B¡pdt*E6! g%I2%Ieٶ}SdYw<vp2¶m[FFKdKOo*$n=s^^2DE$SIZZdc;HK$[EI'~өd p{iq8 b1bAp$B&& JdKҩ۶m% b,)hnn?e6R$XJ&I&[gPźbŵvpkwzd d$$rtl6KnwK aA@=f47'd2$vHcnۺT*I4>v'YPXf[ZZ$X7JNZ2֍H$.O({a'Œ$Ivo=:utC>ɐJH$$+r$[Zf2a»8bd32m6KdKԅ8I ]z IDATvhh,I2%I겲,dL:1cDP8L:"%I$I]S("vnݺwߎ ~8Lm=u2$9$X}V{y]`I,IRHr9"hm #'2%I$I]/sBGhɰ ZdKd2ݟCοYDyr-I2%IRr9,Hpl,8,I2%I:gA#wϳza%-dsX`I Sn哟dG h5'pQGR\\̲e+XW|uY2[Yo{}/A,=z>+-I,IR':ÔBw;Ͷ1˞]Ny)((`a||l6K]b4G:O4;r̎Ϣf=$$p{3ÛokZ^~e}T*ʕ+樱X6molI򗪿Ͻ:oͣ 8^/[ŵ7\'wzۗ+Z$$uY>BuUl'ѣ|+j=[fWp0Y*͜Sܻl6NgŲ|j,ƣ[nG?5_f`f2|ӬY2fpس@K `I]sp,UW\q۝̸FwΈCFI'lr>ptoYl9p_x>}Jy7#0u47pSN;TNR}?ח8 ߩefDaO%IRBGqD.QꪵI,Tf4vs$$II77'etރhtNRlL8!//nK>G?o7Ga8o0__$umP 9"NfZԵIRW]ll*-#zhI,IRW:v*\5_dH%$I2%IBPGg.G#a>UPe$I$I]TH\2z泎$$D" dȤӝ~yNSӛ =}H `IP(D,Hӝt^!g7`>Eƍ ;h8+I,IEp˶mRI$ɵEmwDTIܛ! %$I$I,woK˶bf5͒fӊe<2ԧ k#z@I `Iv^$!]'-dsYbnDݦ9%¢G{7@s'$$_ֽHTL:M=G"lp.ocʓOX #JL%f2RIR$PuF8דL&iii!Э[7,_d*ɦmt:ZG&gKݟ^Eg'I `I> NNZ/QIɐVlb1nJv1 :SA!i$[鑗Ƕ[D"aZ-Izq’$$i >) Y=Z7mP2~%I5ܟJ$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$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$IE"r#!I$I 3%I$G?ҳ{bK$IRG>̵. I$I3 I$I> vw$I$u6%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$$I$$I$iKմ3>rܔI> K$IY0prz@*ɖլ}18{1<7$I$A|߽lv|_roXaAU6c _7~4xsvg8ߟ:ὁgaE;d[Oְ"N8i*h}Isܔ9w`b/,`yy hݍ9, p֏&X̺^HI^~<^S&0O~{gްLj[07q䄡Nsn[e C'ιS'Wb_t-l,$I$u{8Q^#$iX s XX 'pׇc0K7b|M)bG7C;->y#9n^3Yj׏֑ q֥S9'%Oca~D"I8u+S_3wQ 浆8{gA$I ;|ϗN3FG l2v啍x'}HP wd^ĩas=Mx%Gb.c>d]}s?FrhKŅ@3T (/bѣ+c{}a8G5? $Idsżc7-wfaSC*~\9v߉ѳ@߿~_|lV7kXj~y.O$E;ϸ{[#Ou<}aQ{n_BӁ؅|7I$I{P#rx?xQLLQH7rIz3zwe+-`^U ʎg(V$9%uVP|t_ #a jhZŢ^ØxHʁ*VܼE+ 9c(), XCs01S?sԜPN2 jjK1:wKXcoa\!X+ƟįƁ,yk1T`PXϿN@8nw KXRc!@O,eʥLf'1j"_$w$I^ж~‚ꡲBG`iÜV0*R%%hu[ܿ1^H%em7(ԴPcяu2e7$ ( I"ԟ H >6g5/aUO @Q!m'm]T~) v_6 :7NAaF޺kxk d,I҇d~mZDIPyqRfݓ"E/*GumѾ#t5k)b͸=_Q XCjj Tʪ} ̱h;E#9v1ӮWE/t01jt7 (bLCbc#1QL)46&U,~FsFꓰg h8؜Ɔ$IKeiXEw,bc['JG[%,~ Uϰ`3,}\n09ΰ"nW]upɅgp5 hPݱgff5)uVHQWU^Tmh.|( DXi{VPVTxܿniHT-b{5Nb )%NA䥪Y꫙%\`5;xν}9qb8 2k4+JY,~~9FzQo b$V|]:?e?}w>ɼ) I:$> 3iLGjΥl6Se3,ƕ+r#9wU2ԑt n>=\NEa@Cm56F22؊%̪5WFV<)`2uF)"#8":Y]v?i6%J71n{b˫x="((1L8a4aT;b޲^O@A 7v\kU'}ecbF3 x fI's^E_3:F_5){>$IXjZȚwa?&q-2Ho,4'q`bR.;ZVS$ꛦ2};~y\yY5u)x/J*3 crt-vx3yyyA@8wH.uY;%}h IDATYL!IoI$IRWuHw~A$IK$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I,I$I,I$I,I$I"j+YI$I7 c@I$IvG-I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I]\U ^sRk47'\!$7u4+D8,FV,[ƕuk_Iv# ׭K~Ίe\!,<Ed0cN{}#ZW$InReg0`y6Cbo3V3 ~>^BY!@cλXNޯ'3*flc w2ꓩe7-%д.CÐ\{L={.a󭻔&_o˹ .uJfW$InuTQZv`PM}Q֭#UZN)qJuuJ(-!ߔhL>s4#ZM "VfwSZXH龓4"`V ɪ:d"('3h #ISm55 f±T=j-FYyp=nߛr15/!?3L0Q!E<^{fqD iH@<} qR<$IvGUuR?#`#>P]PVV 3 } +1J2JY]"ǁz6((ꩭMk$&RD Q@T~5ֳ x \rXb@S=  [?NJs8〘($^- ~tI$I%HIE? F7FSrAllCRC3|b3$Sz/ꨮSy@[Nk~1[krGQ~=1F8e?L>_s2wBSp(?r~Ҏ8DHx!q (CiǹކAZ$Ik (m?rHƖհZk;s}M#VQKQkMCME%3u&K(/jkIQ5m'ˊݘj Q:*Tmɼag[bli#:n_m~? fp퍌r&K*KHU#zԬ~leP?fuvd5ِl~c$I~8&QDyY7 4>KkHS;L? y#(-յ])Y[K%PO-kM32i,g;Nr+dwqřixj Վ дY7-I /L/A(<` Òy*j]6; Ĉ1k ͬe44ԳY,L e/R&IІj ($0~eā!mxymg}nX7g GQΪ6v!v9uGnHQRQ4PSh~ĈQq87cKIhZe2sY}dTUH8+-rf`'{ cy̼ygM1Lڻޓ[qٜ\Lhg>8x)|J M[ywpU 8xO92z`BN?֦&m\|_s> vfJμRnkf^y^~>c)}cIvC5u$K-"+"SGyE[?i&qx z1yW (-+b!%Y%T)-+Vo|۫)1_,bcxjf~_XʑL;gGKgslj.l6K*o.c i'L7vLˏ*b O܆ h_]MOpc54m^͢?ּ7K+=plٸ{~q 6OįWҷw>lq!^θ3Nl_,+uWgmMjY4[y ɦ^s5~SM*>C 9+tJ7|p7sl\pլ ~}Whz7ẐM>Wή?( E΂iSabbZ\9k r-=bqgu9)`I?C+}ۯjS y0|J4q8[i-fcc8x`14ern:lD$ N()ř?_ovk PJ> lXA{6װ>s8%$>O qqz)O>މ,zh!l%g"<;A'3G^s \}/ձ<'!\[6'm5,y'ͬs7p <>}x%=KKIt +/Vwm3z"hZsRP8/c$xѹ,Zgpځ|rw; J/N8'' !r?Y8b 0NӳOrSbB2N)S⊙xnsD0&$I]3RT=W_Oc}L?h4>t5f85!=m5 c9v`M .w<^x92o2Oӳs嬕4Ū2z zRCaBT>͓o|`S2Aɀ}﷜}6g ]4_Ol\y <*#9:P|xe\'~HH& (ga HTsZc3&,IgN*a1,ݔG`K-@п?}MkHg3<^e{VG ^y~w?pSFIxY\mΌIn\Mpw󫟏eSظشESM P M~g\)C-$浍@Y ku<=# $)x,c1شg68$=aˋOTk,C cblfzJS lkj޷bC8x_r;1&$I]3R'Tܿ 5$ĺ=5 crib֫bGAlf-wvSɆcc_ONOaas?{ulnrn>s9W2vʏ8{>7!Ff'єѴ45M'de˦:3ՙ楞#J-KI5xY"xtoacZc圱Z%5Ў8(xxImNC %;c[:(f +uOzb M{mrN"ʿ8Ip_IK }?9tMUrir#mf*HN%%岻c/~_/%h7]œUD$tvk=6g'eV\v9UK\HmE+\qޝ?i%S)P':ƹ5J""~mAt} + !d?Y."!8PBq{>؝WKJJ(X[Wzs<޸X H_k[ C !q@\;\eU%lo"M' V}Gx;+7{:gt$j3۷֭ёU4NnI<ZƗp?2. /toB;hޗPo" !E^Nx>m}Ċ%%QI$XR"oёK{w"6,⅗2W.7 !sG5+ŋ叩wrKz$/YkNΟ61=3eKUeO r=n, o]!.$z7f *clﳙ4 c{2"0MGvSŖO> });;焗F*^.E2'|FL/u+bf;_i̊ˈ!;D"K F?p[Ҙ^~ygyïxvLs9}'QV>ˬUhm ;(ڤ%լzphqw   o^|H$|`,r.:OxW1ՉHҹֹu$b x.I$ `I^yy$I:3|$Ԫ򸓐$I:\$I$$I$$I$$I$$I$_$I{.Ĥ$ IK2oA$=dKu_ݹ\>c$Igc}>0nݻ; v٥KzWwu$I`I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$IyE;qcj,q_$tȑ#R^rMH?\и 8Mdd,IYS(~|ߚȺ_ &T `9rgcHtpX:K׼ W𻞷ӮI+#re/0w)Ϯ{ ]$, tpuU0ی_ iפ@~WTWU,I,t:|0 @ZD:j8|$txgI~}J$X$I$X$IdK$IdK s /`K\{ úNv7Ȩ~~c$IK:>"RO,垱Y6_{$7@(,O1H$T%3ӶWS-'>7]GӼۡmPKBBi=I$~eK"V樂xZwۯ"-X<`1 ,cOS6&-qb c'"֖TڋdK_ڇQv,ȲK>;`SҺ`$%^e9~ p-q{flxa<+Kfɽ!<+c2mX:̞5O6'!3o.;.d=y1ڃo;v [wQE3ZOr /.C>6^=.cCQ)`SZw;еP'\7uF1=dZF΁)Gq]j)//"z}?hӦÒ$s,\z˿3W} [X6x:9O1{S@+^7^fK}*P'y(]rg0uo=#6R:Ia/N1$A@ '+yd,TEn`b}dA@`1@! nWxfJ(p^M$$QZ ^Eq^>Vnِ3xhVxe_b#o@"RYM$'@ɻ] ^\sٚn:Bo˛b-av+qWpMc=.q`*ޅwG7H#YR2qRdof]vv=I3X#@IN.6+!a-q;'nc-jC~rn ]UAROr phݮ%_: XE1}o{ALۼk6Tސ'0<bg6+BCkQ˄ Xv-cƌ73gr]w1l0&L$I2%q ep\)&˿ՑǞc"qde^iI5lFrs` ,p ]PkkFlߛ/Π*» :§p. @N{oJ+wQF6uj14jFPU^.Ehk|\.p^?ȰE$@zjtnW i6O渄feU!?(2335j'N ~1x`233$(I `Iu/]÷?}o2Dz6f? 4ĩ>>㿳Wwn*ʣ }Uy?{+o!'w 7Mwʽd_~7oÇ{`̛7($I9KuXaWT=kj"-(erq j_ ⚇W(akyͲ&4#G_(HrRS]5owLڢ^v`p$ *~ur 9~Pcē`9Ej,?$g+בC"iI`rkski*oСC:t(#:ڟJtHuWBR3~lCV.F!P'wѢvA*y!Sw΢M8tl[9t/be: ?8檫p+l\4'zB%h<| ZIa{s {پz9LTb~J߫xyV+[X/!>Iku z;uQ 8J֓SI!i?Ҩwd@ Gu^ K${\}o`M f3}o-*F뎭.ud滹' 7)~w> >?DBo?RGow׬3ϫHp+͠q37ދ KY9g.bңcey'7Dڐ!\0l,-(A,3r]/&=z7Ne'=m!>iO<3ol#x<|UƴwfBr{ّ$I1pG#_wz8t|ZW~@uu5e|C=o|z6|yg<$ΑkZE{"EluqՒ$Ve_>@g Ҏ)-I'*ۺolhԨG\# IDAT$IC<ZN e|ؖ];$IC\e]noА^e94C%C}hH$EK$I `I$I `I?03k@Ð$t:EDDq!ç/o΀};ק$IEDTT7u_ܳ,! ~P3%**AHdK:]"""rBs\WeEÑ~fQ8?6GпDKdK:kЀ; /Ç;gELL q5h@$tz822zEl\ѣG:_QQQD"## `I `I?Elg'TVWRQ/:d%|՗>MNe|$7z3*{3|m 碮4?՟2q ,W}~/I\kX$~xbΛ2CdGJ4T[o0C{"T?"Ȉ"> xOqXTM34.LADEvS "2hJ$~9(s׆^A%I `UZzqͨT?ń]=ys̍Pɺan||Y Tx.%/9rw"+m6BA1l.M1Ӷb1ɨ_ư8(nKG=f} IJ;\Ɋmh{C'So6qJ0]&75| ku&2 T,e\~̊}3tep/p]t/)OP[?ϻ6 Q;f d+ YT,f'p[*@`'y1}%I `V#81tLMdVJi '=1&sl/;d {%.|K|bO[ζ20 LU֏9z o /Lb|5)cn;=Dڕpdbo&&Janr5)5O7PL|7<5|*y|\xN9(I^hPR MX(!&6WåP+5ے.)-YX3k(|}$?1~R_I$X 嬯ǥ'|V['ӷՋ9j2V[g䧭뇹􄂫(XŠ|Vڗ*+ Šf9S9T6 Dwfܵ[uz%Qb&oH0OǏdql#+K$d"tiy#6flL?$Qk jo}~ɉ9ͽdbnt,]ΊK -۷N.2 mSqӀ5[&flVDiR=XYjz'5޶2YWL]Qbľd.dFX>=t9K+@Wcsi\d+nS3kBQIi%4i/CrJ@u>+v9>lWYܿ6oWvǼ$IiZtv07 ELT8b3L&_Ќzʹ)Lx%"X7DT`nmjgedBSL>zx&>7Aiu* E{7rf4YS RgrJfId J;RGh#3e HE c+bLH|1sz$IΘVe_>@ȟ _ iO$I$<ZR>Vq $I:9W%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$-#""$9 ˎ$I:ɱIDDĹ`E,I$Iuժ#L8G6~2!Ħ}Gx}{+$IT[oþ#O}F#8L """(t OnF;U^]OϭiOLeSQylvk=3L kؐyz^Cjd Sa-\Z=1֌ϴ*(;xFB[6OdqF5oVè4n̈:_ZiQ.]g5+In֬yKl>-gѤmؼNYxTZV^~CCeUXT\k*/vnV|\Lˡf|1X#/Qv/KҾܹڕ>"*.d$iolVrk:P=bS[Uk{J:KRo*lŪYDd6gwҏhRX&շ>>jQ2JJGp^~4]\-ͦSLltTn2IV~>_[=p՞U]5|+<[ۜd@YmAQ#P&u׹T_o:FMn_l$Ok[~l(`PV^4F>zs $ZhXnբ}hێ|}|W{͆;j A oq]?ҁU\>!|&ܧV#ٓښh2-/^J5^ztΠ~יduz=ċMlڼ= '5q4~|}}1LG/z;iY5mrs˝srde02-72L4.<n2NdZ *2"\5Ս;pKCx֌\mN[5;_[?$uk~$jz:#qdIRz#=tאϝYĞ+=k<}*E k~pbޜn~Oz^qn?83JK*q[}aQ "-Z6WL<1gէoUBݗ_WAZm6M&XXbuUTTD]TR <ޑ˹]~ddPlmID+ץʸ"uLm9>;_[CuL/dׁyUn\UZKtx$E2<[$V[e[kPKW$f֜ 0wϽѩڿ~vs^u/Krr9WZ3$fTZjm\d6cܤVqDf8ԂUi-$ ?AڹZݻuR]\ꊊKM[{f]ZZ ?oIWBkȦZGvi :/"fY+I**.xM`~-\6J_<w}Yw8&Ir}y>pvJj P`=2Hye4mh`ymܝykw+ ^!Il ԧlv+ _{:df҆[v╧ǎ>_'x`rz?JNIs;oS-cj 陇ԮM""$Iq2MNIWtTcU\R=VO[*4$Hٹ:.I2LjB􌚟Mn>6K(\'B&zݠWU\Hkq$fWyK"l|͡]5(>t :EMRH+h6)hR VswamVPoSaylJ ~ TOE]6 _p}ZA[ڳ3DG*.z Gԩu7jdHJv(.6FzvGSǶn׮J\jӢ%+gc߁{+""q,Z\ǚ3onz kBznqϿ%U_r̯45Z|xSJq]p94eյn@C8+pQq^{͛eehӖթc;l}zF|#-ےRݗ/sջg7 9<^/I|:͜[]|\s1D_Ns}eMVvm۩=]Su~w^]pjgK4J59;kZ7]$uHIRzA 쾜9+e4oڔ6U3_1'_SGN[ߓwW~-}Jfwڵ>]˙NїnyӬp+^& i険s&v=^{FQ.JKtx\[M[Gk/?)?/8{%>W`yrn,I .?mhZ}m5j`4cAN'nT6-UZZLoo5Uk6i՚Mn/K`J~]%HVQ#j^}^'5\VV&=ؐꮜJ/X\ե+WwdMӎi }TZµ*Ik*|LFZGvޕ^Z~ kc?+Дu@W'~$/tPeOh{N 9.RRcl$1 ƌ$^or6v|]>9Fӯ]4%M.g*-n3yo{>}:.u5hڽOee˻ݢΝ;}zuS~K4ee(&:RMX1_jݭy?t8/߭~Ý:-K n.*--S8K;vx]qcF(>.gCXhF\.bC=|& oӞ(\Tf4B!!/*_>e&MRg2e2$ݭyæmz/k/]Ϛk`ЯzG;QJRfaޭaCye^j.5촍ު槭 | N*L&g---Us^عG;wuM۶jSKq,[I>Cۦu:vhRg6h6Vll:wj6 MI b5}{Kٽ*+-ztϝ7Ᵽ4g"͛N̞Ln;@}8qe+Oc͙Iiıvh,gU^r]c4R>κ P۵w\;oN;wզM۵~\.Yy'c]JMPzgMڰi[] ɭ~dU?bq}%M]Կ_/uAW]1Aڼe~e.__uCZa)qEKV/W_Z}@Sw̌,$Օk5g0W?٩c;}+β޽+nq[m44JEKXߦu:wjWcy.TW5g!9kpH睏[K'],7WrJ6yܷw}]_j%\3tұNߺ}:uj綑 =7i@^5YRR?]g4ڽ_:lp@DG*+;ǥ~=ڻ5th5j=nX^}}}7j׶s^Vz\6M۽TTIz^=wѾw_[ݽpl~[ m}b!S49{AW22ǗNH={tp^mآe+ EGExI*..jip6c9 ]flwV[nF -~ڷ\d6cYx %&:RO=~2>"^ 59gp?yˎ:gF `}N~U3}j86zU\|:utDju.6_{Q!00@uj=wޠ;oR<,OnJDp}ڍヺ3͵s9?k8Q?g}jJIMWeE͛GkҹIYZZ=(++GYt嘘H5VLt:uj'aݮeg稤L>f\'=N6p`Cx0+^ `W @x0+4Z~}A%n_gWOW{ruA#p2̍uU{Kufu:HņMPf>0"hgQaMCh{ZR|f1P vk" ږVP.~/ eJ롋"Ui0M Mڤ }uyᒤ_65*,U8R |Ƃ\۴P2 ,jg'G+,i)P.ukz\-]"]>@^)Ñ}2_ezr|"|Ze6(Ot0ע{JտvAs+eɹ.}J*hվR-YFAZDJ-\-SX?=~I6dUhʽjG WNE.s_f ?2tW&֢?Jd5o԰fQ")13*Gw|r_WαP|%PU ńupMB:p98q}NU36Q/Nέ&VtYuUtY,SQ4Z`f`N$)<ФG.$mK+Wzn5x.,)#ߢQ]Mb| ?:oԡBbBM 5H m7pU]F:=}IRY]FmI-y%ɠ ߣ'LfUYIqa?SH˳F*( IDAT>`hxMų&<3l&U mTAk:6? 5)-lg6[Ƕfş(Chn3q@AmNI,te<@x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W `nɩm gyԲE)w_LTzF 4o]:SDmܼ]knrKO9˝;?lj=ċ.u~~lݡOY2"g>e+.;J|p8އ_5dテ;&@ ǰ:,DGۯWV-qTpF)IZhQ#1RT^^t頰А:_[XXm*!^F_ee.#肑C=YRR eeRpP"<.Zt}d4eݮ}}= Nȑ#xb籷&-g.  ڬ;Zf۹޻ol$x?ghЯ!IRFf{-mظխτ5Ᵽus]ϪOnu};O=v.u^)P|=*))u(00@/Q٭xh"-^XO?׆&Vx۰ܪZkwާ{-(Vi\gd'P``=-))Uqq$)==Sr}&Vyy&O+I+eWRDZw9rW&vomlv^}}صszoꗒaCky]5CԧwwI%+] }.s]kAn٣ f {r;g MvfHz]>eKJOWY"Q۶rGCA-wR {N]]\Gg$%Չiv׶mR~Ϝ۵Zk䟮pڸi[9Rؿ8PHt9_6ߐ`W:ݏ3kw]K?pj3>fnjGκ{%U{C+9%M4}Z|U]ݍTkO\lKOQaa$hίܞYK;ur}5Ѫt rdѽTuIRlw٪KҤcmw_3;C|,??_=}.up g~P>>>[N9fӭ47JKwl,z']Fsw5l }G_}u3b@^x_Jh$00@z~.~2y|7jınc3zjhp1BCu{lw{ñM\~~عWVM]tP:_)Q\lڴIPhHpz`Xk>eff+.:vh#S6ђ$ͦɩ*)-SX3pKcVdd|}kos`NE^ @}!@x0+^ `W @x0+^7\% zn4@B/Ig& R`eٜ``ht7dn\vV,VVl6<SrFL&L&fL&ӭAjUEEI#ǨJkCИ|LRHF.S d25Xn]2bZMUFFJKr>ҪUz/KNnWTTjϞjӦj'l}jk)--ݥ.,,T{tSttT} i%JHhۻ[dBCCէoz/Ï9pf[_yÏ1] 3;')ݤJLuM, jYuZmMj~{kZZ>}֬YLs 5mvjsT wy_J]+OXOn?,I7n _dR^V['H6v#I Ϩg7XIsgy ڪO^7on٦qoeƼE?fƏY|l1oQy] ; Aڵ`l6i Ѡ]J$*,]Jɫt+РvIɠPי[bUqMY$5p?C*..qR\\r:n`Ƕfhnbv7oՁI٫whWqGnzG傂]s5kn*Wq3ɨk>Sïԓip `v IZ7On&mҦG渇;=2Hhk$I-՚ˑ624'wڣPգgws;w҇| +Cuںe/IJNNъKbccվ}[g[ժgiE:?IQQ:_Rpp[ٳ*",mذI mۺ].U\\_~+W$)((Ho{?4]42BCC5h@:_~_-PII osY̙st2Grd -(7'WUIii_*Qb_UW_+L%}Ň2OsP/ gz07 0Hrh"}d$1BWgCZx4sΏ9\]tҧ~Vm 96W$I;wt[V( @obuP(55M/mߤիyL4C6lUW_.___}Ȕ$mܸYԣgw]+uݷieJN%INxJnÆM57ԅ颋$Iw8g=ܜ\DG>>}{+//_-ZjeZڰ~$顇lVtU:fռy?d]^~ ke)1c/ԅGR_OGWYYM*--աC9jLzF]0B6]_p|tƇ_  ۄK>Lض 9aI;2]ٛkwzz͚9G4i )4fYvG؟ -nfzRr=K.|uA1c$I:SY㻯8{Ĉaڻg/[V* @{#X=k4jTvN߾#HrRimz?h̹xXji߹!,1c.>-zXӷ& YZO3_CED}wռ%IXn}YyÆ:?ɹ;nE$jBNT۶mZך5SKrtB&鍷^U6$Is#iɒe߻_ފ_8T3-hܞiA>&iWaLJT:3…KTZZqUH艿X~~ڵGVUZd̞'Ij۶$ mݤG{H>nz%jȈ'/?҃+IVU~G`ܰ3qfO{PG`W B ~^45< Gp5) Z&[{4g?#:;@MLAnJlԠK f* , FX ެ"$ؠ!A`p஑6MkiRH37Tn`(٬ѭ4}]+2 ޤ"8(Mie22\n7čl6V***t O9FUZcrn]6ᒯL&S v]v]VUEVUVU6ypZl4e2d2z8\.#rg6ѲoYڶ6L3M-555=QA W"{?<9ٌ[. gCnf9_HwPsb Tq-$-,""""""R܊o-,"""""".AXDDDDDD\`q """"""EDDDDD%(K0Dv"""""" (wq*l۝l6󵈈}a`&8pkZjbZl""""""R\Ʉnnnf kZX,gcVj8 Xly)A&3|1$}*ၛ[`^ ]C- Q^-erb IDATR ۖ_7$ԯ !bl1+5۫wPZDDDDDDJ/3 J Y`f3&S,PT,;UxFG""""""R ul@xFBO\l;A4YDDDDDąyܱ[,""""""gwF,u/eR:J&ۖ[M&x؀{u,馈z&OJXҔȒn5%ۖg """""bz>@zۡ[T+5pҽ׳s^r-Zrٹm/+/f*&kߧ{'"""""=JM/RcmLXDDDDDD\``˦{*d6߆5Z-zyV{3[ZMfg7P͸*J2Hf9<֧ ^8wPj{q:/I;ř}R%5*ccC*ޯcX~bUjݸI:FvV6דٸ~|: /tŒˁXjթwq5Y kηZ^8u*jիЧ7+\}VsвuS)戈5>Xj% KELWh>p$$M19[P i Q3<@ϠF_%Vȃ'10)ChJ[޲)#Ihס%T,jQ/&r!v-j[._0`p+>?3#;S׶e,~Fc[2oH1_=Gӌqԩ[8YQ1;f9ͻqOX+u>;1O/b _N.%=IGKM9""""Z uW_vUke8߯ƇnyT,=!a/0~>|ÇE^眙onZV~e.C"Q=v//Oz6ߊjeʤpP"Yټ$&aD=@U2|mڵ )(2- @v-!l\$=$/6\ȕ3oӱsn'P"vzj̘;NepM}2|?)>ujUvjqq W\7_n]dk'e<=0w ?δx>ú"c?O9weY6b1 -YgKI=ل YVfE ~C} G|hr Gܻ۷b]x{{1GP~ؼa;AHI>KؾmKԾ+Pk[Jhzݙe)P^}nfN] %eTD.8X aM״y6o@Rm3>dfdҴy}qb>὏_IXC>h<>>޼S:uw^ڨ;"rw\ȕ'"CVXGrtҶ=;Ҩq}&87_JEn/ /R3Se6o؎~=*U+|GXh5뷒vydǶ &<<_Z7N/p#,F{x5"Va5((W>j8!ۗr,<Mݽ?0Rr 0<4j$3#.6[w:n=dee:{EzI֥Re!';]zt8֮՛i&ԳPX2ѫeߛsO k -/)(kWob-֚8%yﻆ*p~<7 RO\,.U府r?@3K>k{),v-Gpnm^ 2x[J 'r*7I0Yqci"7DzL>yNg^n Q*zӧj6oEfRw^lz merw0YjF\oW̼'_2x{{Q>s{aЩML9 Ksvl6ۘVpx  _?TĆ[zC lO3渎I9u4~ w3o釗}/VΕr|cHɋ;@nm;pva: k&sݩlˈNf}:qWH{N8VIK 1' dYOiaZm<3Zģy]RO8M? \'|u*V3Jydee;ٻ3H<|zI>‘cuNO A2ffZk/Zը|vFNҽW'+V[i~ٹl'Uk>t:<=|$7zУw'L&}wuԓ?͢Y0š6bx⑗v,B;i9_׹=""""R19{] Lvs|y:mKͽcx9:Go͆S;wÍ3hV:Fp+Jѝ;"II>Aͩ^#ǝ~ϕWY6ZЫo-^CVV6^4l\nǙ{/wSYz<R mڵe\?K|NVgIβzuן]i%ps˿9ѧ7zѣ1 Jqs;; >Y蜁7{N=rwrnw۾[(W777޹9sMvoаesyw3/""""r1E6\222+v2>X蘑;W9{/<3i=E T#ݒCd{}bN^F6AxZ>ab_z"yzlؾ}7cvm[p)~q^zT,^(zDMzʚ2u܎U*q<9+1g"P NHbEQXDDDDӻ+'RSXd5Y5~ZԭSQfunq3kTtF&s._ ;#Xp9Re.rsZڵk鄇GpD㿟BD>7}q}X#9G|KHHekY x\$)SgnR !۵_nX,?sqNIݷͮO9?ɿ{5B׷;b붝̚q̎>F?98q:o!;'x; pv/[+V#**-ܩ-={t*H{Phcճ3uoӹS[NtoژT<޽޽:ӿ_u:}L?_N 337'xα<-խE]1FL&Wo`Kh:c?NNDdÇD6o pv8p˞2ϕx6>f=cx?0%̞YYl[agγ2uLiYr+V|9?ڷoŚ6qvg$33 %KWsώbo*U b,_?ڴnvﴈȵ'9[ݥK;-Z @luY{Be8ƖḹȱXطws}:gw?3m190 'N{9z,-[ (<&z,[ӻWgpx IGt Qf|w<;L;ԩ OPVuٿ<ʨ]:c^Mhzw7=Zr}1ιg0MGUTbO_rolO?Clt^|q2;ԓУ{G}.#9CN%DZ9~<7\ݳw$}P~cF? ;&%?"""""eR{cٳ3[qdffP&MB/ZFjUwGۯӾRǜ8 <0KM㙧 2>~ чG^ź2atn=f|7wZ/>4WfŊu_/Eӭ[T7@A:wjKjUhӺS";?:""71+]jZ:9x}|dY޽{/_װv7kvq|3~2]:nF}/EDDDD\AxK!U+t{`2\Wl!zn63>t<1g;\~ mPoo/'O18~<оkl$5->>f~{짬]oڵm'Qus3۱۠aѹddd8Yv3^)++:CQ=jժ\3Ģ+b_YF^~ v(""""bj֬V}~=0q6n!#ݺv*uY3;&336̫Rx(\2k ڶ}7ǏR2'}NFf IN9ڵ~GṬWn-gNy22ظq@vj!gC;o=7#qX25jYGvvgӓS!)(d_Yp9;u֞ t23ZЫoj٢339Hz9(^*9gF&&fcXSG&޽~{i԰>7PDDDD +EB&$\Wc̚SO:wZ=7hBC95Ù]uocذieb3lr)Ypd䐒JHHR23HHCG Jժe"_00L€AYndpwwt?,"""""0 0 dX6 peEk=s\ xB`)!e1`IvMfy:2&~!% ڟKDDDDDD2(KPpM<~%ƕ@fwφl ӎn-%""""" 0fLF/U0ZZDDDDDĵ& d*0Iv:EDDDDD\`2>:a .EDDDDD%i$q """"""EDDDDD%(KP,"""""".AXDDDDDD\`q """"""EDDDDD%(KPPfp\l< G m".6ZҢL`G_fs{ˤ,֕umf % RLs}l%݌Ra_[Xb]I7CDDDDDT0t^}lc9o]1)ɩlۼ_zĈ;nӣбcOD5jUcdgw@wn6KYv3ӬE}tfM`jӜ}H8}Ç"6oAp \߬15ww37lg٧3sg/"/7|@9<'ҭ=<8Ym<%p]XCy3udټaϏyKXx 4oG4>%?/nxK_]YmnۜgJDDDDD+S= aI$o78'!m<Ə$ccb I6i Y_6WQ~c'QAm~ed7ѭgG-^__Hq(S=#K0~O֮HJ ^]jשSyp+^u --ٿ-`-T3J86@Pp!>A!qPgYߘ7a؊gA7jj:ӾSk~ @UosBo޸o]^T #ǹ}ܥTRZMl~ Xr5H-7S m0fs#"""""eTG ۡs~eYY$Nb%i߂ ,k·SHI>q6tkaS?_O/cGsi;"j^5܋Vod;)I$NBUAh]~[wq00Lo=<ٶe'DIIIz_&$s0c5r<[V5}?>3 .ez{{72tLթk[VFu ׌>xK.oMgjٺ)-Z_;}{_2i&Un}Ε|grvM$&svn6횳t*^x-&L_x7^ym/6 ;\G|@:5x豑W""""""a?wƦf#77 U^TVV6 I#(>w/Y÷?&)(Y9HU1XVROxKD 1N݌W^8Fժ /++ݎ7Y$%%'BU\K@`y*W'"""""r;:#\z/C\9UC*F3KcR_ /w#/OPp"hL&Uzeݜ3e\3WE kK_!K""""""rXDDDDDD\`q """"""EDDDDD%(KP,"""""".AXDDDDDD\`q """"""EDDDDD%(KP,"""""".AXDDDDDD\sITjn^H1 D.l p)jEDDDDDۊKX@v6[qV)""""""fs.F)/""""""^!"""""""%EXDDDDDD\`q """"""%DxQOY,""""nfwo4SJxn,KI7KxxxЬYw1F`2 ,""""f#2r//&KnI7GeY,6oFx.{u4i[I7QRnǔ)bҧwwNʗ/WMq9'0q Kdʔ_y͗^`M%""""nbkW$¯H *_{'vEbXEDDDu }V)YsssS"eUY,łm;{秤`DFvu%""" -y$Rz Reea,ZN7vs """""N@Uc35j`8d˜6Rj}00 316mޢ%Ƒ$cwa6{h(ƤIヽo_gﭱc[l A؇^Fl,_ '*V,""""""E v0WwTw С<<ܩ]U+jrABCBbb1`>>&&.]0, PƲev=Fd$'CƐkC q(aϳٞō?{+V`0#r_`~cǰkzպE""">0hZTJߗ\r,""h"쪖svo~c/\psώbЀ^ؚ/22EKVڠ.nsl!F%jTaϯZi<; .PG#G22@^v oGJeeEDD4Y#zW{sJ֩IӰF0b`ǤiՙTcc\u ®k@ZIn~cWIG1ٱ# h׶;wwwSNW?IѮm V\G L8hHxq{ Tulܴ+ױq6BCҢy]{5{!;vD?0.x͍>2Ag~CNHo"̰ƍ#YK.&Nc0gNgcRv v;9~ 19W v0͟=bl݊`!L?{^y!)iĈޯbY6\Hä)39H 4kژJ劬Y?,CHcMr爛ËǼ!yy ?,\Ftlߊ{G۫P}Oe@&ye'0a EViՌKnn.̘HKKIPڷmA^]5On Kԡ5a&#|"Fиa}jpt8NgX32l6;ݻ~~zjv2uqZjpT<dffbw0"yy<9Ub:V\[ӽ[g6l 'r:oKcQlܴstjP|}Q.xmrD>t0'' n֭_r`>/9|}|9}:nj׮AL!֮u %~ 9Z@c>͛ysM/Ffs@p}}ånň y}~? ?@Br؇ Ř6 㫯F爈Hٔc_ۋ'u;";غ} Idgڠ.7m(pt_/։4nryιx lIHz<~2rZUk6Pߏ#Ov,x1Ò[-)'g am߸>R`lIZI6m f̘1+;;}W_q_v/hеk{^z?:_cЧW6=wWh]/>8:&L4C3y6g~ѽDE0}\F  ><>G㜿r/}Yd{l~Xཽsg:AFl5 N??LFCych9Bھl: <s<ު#l悏E {jJ6K=ξ~ ǒ{r_mLn&8J`֜?yǜ}wcL+7n#p^m9Gp1+o| Q1TRgzfM˜غ}QcϨ{α< ؛#G(Y hPo4?2c|=co/dS VEv-ٶ#@[BwԖy~N4p|&|쑻9x0O<1Xa+u}՗FӮMs>7Z=tӵkWƌرcAWhe.sծUDl!N<1{8Xkcִlq=Cn'/UGXXCf^Xzaa~ޱ.ǛÖz_Jff'Orѣ#+;_GEšDgÇ d2qàp. ޽SlܼL9F {|>wwq -[+Ob:^yC"#])gN4jX{78x(@YnH`@yn~#3~GfV6G[Ep ֱF}L蘴ۋW^|7pJ'b|nZu{T|?={ ]F- #&7":5šEY5k7q]Pnԇ]ۓl=qnՔ-[w[ wٍV-jFrr,urn~[X _~>ů3ljә sYaɹyydd8~~ yڵ .\ͮcGxkmfx_)m|Q\{g7_Ņs;gיz 3NAfV6:/"=YouE(\/&++s& stT0 l_/Rd;`?9|(""#zO>z! AiҸUC*Ee8&kJ:r vnK1/1/g0,\^dSҝm;ِsɍc۱a/բJ%RǏI9˹zrbr܏w|[#' dPF2;hK~ :2ސ {'vl#޶,C%PĉC~>|<&~ǼLJf~ՂsE57E\"|??s.fѢwD_qم 2yiG+:e_KDDD$'; :gsۂ͇~ ZL8w /Ŗmaӿ_>u{gNf|g=9.3L =#NKk3fΧ%i0m9pƬ$''2h@_`).UPXg۷}z-mL.ٹs-fђ{Xn x<n.xO&zu-NEẼ%|TUՒV/_?ݧɃ/ts45y]YMbB.Kן'))K̫n#!!rB拟Cb1'vXϑeFwNh4Fo~ ˯x/wi#o8`~nltlq>}{SW зö(8:|4fN+p'+]k/;2͊a?gD>A+'t}-%""""_!%\m̞stDb4_ |e V+Ç߿acf#,3Æ ߿ÇbZXMDDDD+co8>>QF2`@?|>`0@8]9 Ʉf#>>,""""_)F͆dpN(nшljb61EDDD+`0`20X,0aU~EN> ?,""""_I'ӇnjװEDDDDDD` """"""EDDDDD$&@J~""""""r `ݮ a-DDDDDDbf'Vg'<F6ftCsb0`41'w0pX_c00O!{ HL*""""""EDDDDD$&(HLP,""""""1AXDDDDDDb` """"""EDDDDD$&(HLP,""""""1AXDDDDDDb` """"""EDDDDD$&(HLP,""""""1AXDDDDDDb`5k{ """"""JX̮r|>OwEDDDDD=݁;;`7&A0ʋn^y9Gt?ۋӿo O~#v}$A˿cgא;>Yj#xt*"""""uRߧ_ےO|SϜ󨪬!;'V,[|B(tfΘ3aL=s"۶`R**s;䱾=]$ {q/>u{ O3pPbV,[̠1Frב¬󨨨raV9ʋop71~h>xw-mŶ;m߹w6C ?zJƎɝLBb|}BRr"+>_eW]U0i,; Kxؼi;C:?gNdixryg0j)4663qV;>G:\ gaimicY5c>3>?`\|yP;35Ay#^yΓra6y/#3Ef3kyw(,(a0LlX^~U ԏ3ΞߜrSDDDDDN.'5_ge/Xy˙7{ ?]/6pShoogNzWc3z)ٙ\|i7暑o2Έ%_0w>MBb<噿pPyWq7} f0Ox{0?h'_Ow`t٬|x%?TWb2轙7Owh"992~"wg`轙׹pG1V?ŪxGٶ>|S֮H ow0alٴ~,y太ϛ8g{gMW^q-=2w?p)x=^L2&r(Q=~)+xws9Ibάۃ?.=oEX`i1 $$q?aꙓxTבE+yp㴫7a~GP^~̬tN=9~fNzQ^r.%ťl1΢pô++ߟ7 [,?<ƈS~f4Gl6#̜>;)z;ZZZy_\?~ʊj ˕~>zEC-SS]GNnQ=O9TGcn"-=9NQa ?imm#-=̬1x'}llPWJgӆl]C}]_pK><͊Wag̸x<^a\ÉDPY wnA}8Z]4m)`ՊuLh6\|?6 O),,!P_}wþM1-=@nn6V%:< Q?/9TPf͘aeKWqXro!/73cecLF ҼoqiI9Iɉw2hpcURNN;3Xp9YyX*k_?)ߘ*N#;SVZ3Ko3uٮ 2 GO7n㗿)cǟrd n)o|*kzIIIby\M\}ݥ6m4q8촶Fkk+`Ԥ)eklN4;ノޛɌsI593v% WPSSGC}#sg/f잊^G `G;00/SϜ̟3Κs ^e:;7mEHe`ܥLF6M.Q?>}kчū/͒E+0i E} [з=?q4g.d< SS)/9K館Oك}߭X㌳&X8o)/>7r3>MWE{ѥ3ks@`}JZ2ߙZ<``_n7ˮG~ܚebEWy8?'+. )9?oh G2l {̉I o^`גߧ!^]qE>_wqKIfV:Oǰ Yt˗"-=`_e|Ki5l|\Syuo'o̚1Y33~hV\΂F9娟< ᣹Q1 B^99=%SUYCfV:&f3ncԕij򐑙MM\MfaZu'c i6r6Uy֯Y˨c?Ng\>a]~s2vw͇̬CɏFMMi):HϘy^78,1?'E0 :0)z @RR1WzƾsXNb4BB}ugcjn"_]<"""""rreM<""""""r(IN]8.dI HWEDDDDD$&(HLP,""""""1AXDDDDDDb` """"""EDDDDD$&(HL0tK |-0`وObtwDDDDI u ""_R0>_~4`9C¯H7 t7DDDDI>_OwAD䤣"""r9)""O[EDDdsR`Q,""""""1AXDDDDDDb` """"""EDDDDD$&{'_L=L.۴PCcZ{ooio +7~@iq ^/I))~tჾ]>nWSOup(ߞ;_bY=SX0m-|E SCc6W|0e2ƏvSO>y78t0Ņ;><]@eE}W]΂B_r p:oʘއ|Y:%ߏ'2l),=-6o`b \ 8K^K41TYlZs`0+S[] b^0}n7_=w$0exU FON"OI ;wxx"}xqz' SӃݿj rض9w`aTo 廚;0x 5opvPaBk] ڬ7/:Y9xSǎ&#+s߹`B߷oo8Ąc{e:}"6y1CDC^u8|?@gL&f#|qmۢ_vv,v)jqcZ;Kt8G{'SappįYD w`(oXĶMMjw2*7^(b&\ ~2l\w[*dWѾ7k .BMU+ ?5ҫ]ǭD7 6#?h&l>y^DDDD')}O8ʢdF %.!/.gÚ yl'0r7]l۴Ç|ђh1+7Qjz:-ͥ*.nq.6i"M:v0}-4Vבa3!O]nrřO]y%}B}UVo `42{u-fWə*oC0Mcl?ZZqԓIJvm-T(/H_}0y'&E^ȿ5U$v}%]͈i S344}ystFOw>@+☈ *{wɅo8'͞ȰÇb:mp׵W{axsW~JixOt;wG~taǍ@rf::jIH󳻠ͺgq2 .Mħ$X]fboa4q&waMiknچh]߈aFEA  _Kf U5d]HMnl7}EĴd @}E6S_~,մ;e%ٰL ,]9Go2j|*kWc68з<<%ij3j\*n0 f#[|qI֭j 澟D*Vڪ6Mue+Zx,""""=/acGsz߷%hkmIgL᪛÷ޥ= i79~"z.Q޽C_;kKb7|Y輋/`'5U`d6֯ZӡIߘBqNBmP IDATu56=G*=/G]EuU-raf9;o))\ iXlsB<EdeL{ gVve=P9[9x~vF|3vn܋s10*ѽq}Xވ܆+5)Rڌr@~Vɲ9IuiS7vd^5fa#~EDDD> ' hnnWxԻt-N=`0Hmu -dd-拯qz22yirLfvV l4LjzZ pAFCW OP0 ͆r5G=p+m-=u1Tc2OOp(P0 oml`4BV>V`@*k8 wS@NnoAǶx۱9LL~߾3%3>s""""y^78,-eθ8w@𗐔xs6țLhh2TYݟfr-e:>F 4C^i4M&C :_԰=}1pYW`; s """"O"@bZ Upٙ#1vR9)M> J|Bw.%tNHyأ5߷}t7DDDDDDbç<` """"""EDDDDD$&(HLP,""""""1!pMuMOwADDDDDDzHL`] r\q=  Y=݅c:3#cS8 t=鸴x,_tls ͽ9vT_WT >M3nY#lU+ֲla ?`0Ϟ`ɼjoi=L\d`V%++ɀ! ,]M0{ɳކj+{Gw8J $X|xn5KWsPWMIJ 򥫙q.k5Ra/;ivlpQ͐SؾkO]u>ݍnbd6o 5BHWbjO75-&U+;?ϻoMn]MFV:y-Χi&-#ZZ[HJNdú-8u(V%V2㣹L2/;-vS/ 9Xs럏f@}.P?L>3( F#Ƥ+?~7~7<M8'0rL ޟL;e%ZV5i}3!-r̤z^""""""]aj$%'ŝ7ΚDcCnQcN!3+%VPUO[0̉ 1x.[36ZhrIJN[\G~L^-Ve4zZ_FM!f&oRLcC$uنl$+qTHN3 #mY"?ÿ""""""%@~,Vqi;=#g`{V~q8\|ٹ4Ի(U8Ɉ`fbؓ:CxH0y VĤHeexv[B!kVmdq( ϫV4fZ~xVK;>>Ä )ي1D_zm>^G(f7E'úl܋s9Nߟu~NSmqn6!>y HZa-GP@ @ss37+խWUV~FSRG-R ۏ>̅B!Z[On}ѕ&HvNw96<ϫbh<c-e4c"\yc_*Jg9DDDDDDS ݐ.8&MnI*r݇IDDDDDDNJ1EDDDDD$vTgS81QKEDDDDDbUL ^`XSXDDDDDDbWL q """"""*.H]SXDDDDDDbWLĞ!I+ |q ^w"""""=$a.b n~xۋ9DMG5(ްյnX#:q? 3 k}'""""bHFSRz'LCD#)VӿX"_xrDr:ݶfE=fG.V\xECNIngꂝHwߡo!;K1 -=$JMu=?w1|#>@fVzx+kﮮv<3O`ŌyphU]OجTki%w`ʶ@z^6ijh% bnlNq?flRhy/<+yFs|f)ë́BaF}; S3ظ;<qd:عûp}Rܮ_ڋ S3ؼ )-8jMXmF}¥!ZBUE+x3vfo;LKA Zux={j;@{9k%Yt ))g̞fo+ T\Mlٴ Z-4ܼtn) `Zo3>p6+~)/z]kxO]Q \Dzi6zc J`˦ʢN9]NBB -Čb498̝럞%W|+C|+hlp;?K`xs(" qqڤGh: q8qdͣ%؝SEf#>9d nj‘GZlRiجV|J9؄ p(L!0[-؜* ;kjvI{P(Gf&LhW]Y."0V3gw"NJ%$$Zu`4P/vZHJAQg߅ȟ:i6-]YϔH˰1rv0ph" u>jڰM$7;? l6a2s]LHc|ko-mH-eZM7b1q_{lŗ~F1{">xg&sg/a\sKq:Pd̚Դ>o ex^|$$GuU-RRq84{[HNIo6oADZZZYzSFa5c@;)Ɔ&>|w)udcEkGL:wrw5i4ܬZ~}kz"1-wŧ$aXdpݹolɃdLoF[sKc}C}&#pˍhl8GBו`{;Q~ յ_ﯪ^gdE.|k}Z*#Ǥ𝇆0fBd/~?& 9Nl5Ӌچ1+/!+;^~AC3y8FN(b֌6~ݘL&N8ޙi'!!SDZ;{=OۡOysKXeӯ>mj?ɒ+ ˳ N=o_~mTWu `˗GMBb<g_c\x9$%'b4r=70㣹|,n/3OgMxLs@W[ۂ f"d6T@M8+tsv¡p0ҊԜLR3hknbGcб:rl ^O*[,ouuHa'xlC,ѹ!L&F{D=}rNӄۥ[6t ` _]]$&&F>'7/9RYX-8T /[Eb=+[ ظ~+o 7_NcC)I{es0:ReZ0"1ۏx/{*vGk'=#R-sEÇ~~?-2XmVJ9IHoc=C+?ޅhęO{ u؅S*IE}0Ӓ19?tཕ;lusO0nP;"?+`[\sK_3;X+d`E~V.>3S݃\ȱ)&*"z)-7_$&MuPKWPYx֝X,fFaA|Ĥ*90"nmk!}5b?qFj^|MFv@*khrEB@]m; Ji|"*-nAܵm؜B91[-j*)HnbZ 83qI 47y+?x F#Iijqc2u< 8%%bZ)ٴgB<Ey=סW݌oXo8=r^̅W>z|*ױauF<'v/8^c=ph"ٹ>%[Y7aޣw:vEر /7a[@vo>t˪l;dƓ`&Wtpey u5yF1̙;Cq^N 7C `t'C8MeCB^9nm됱`0xP;|<^|v2hp?~{`ά,39+;K8&?fάv3a ;enٟ.dx^3R9㬉\p̜>Cf?{EՀqݒ % z#XQD{/bQQATD&MzMjBHd?V"Usܙ{l '2z7 SþW̮}SdժS]usc$Ie˕Qfu=52MX|_9JN:իU&jڼ[!I^εµT?NӒn䳫:brrup{"F0@VWWde.ɤ‚L|ΑEfEEEEry>Ú=6g^.lRnndwL>̌yxZY]L۟iI Bh(W.>y%6'_%ϲ%9e`PPJ~[яS...ٯWTTX\yx;^dql6+7'Wvkb#2g]o'}-**RNB2ug`hm)WۡuK{Ֆ/?s9٤WC.ms+/}6Ч4W\)%Kox,Q?0[ ~'*sk6_+I#>SxUG^3r!5J|̫լĄy랇/OB+z0Mt-2[LHUc\> Fwsjױ$j*$b(nf_kN+V#VY/iϟ.I6l_+l !  (n@(}s9/JM\ E``!@``!@``!l?[@iS*[IwJ~ҦT2e0RI&)[pY"?__0$77wťpYYK}KkTbC  00C  00C  00C  00C  00C  00C  00C  00C  00C  00C  00JZt IDATC  00C  00C  00CDv]e/%$I&S}./,b/CWu nj6 ًU)p)@)0C  00C  00C  00Ct.ݻ1WWVB\+JM~[Cԣ{ǫڷk ~*,*1ڵ{>KU*%=@ )uzVj4^IҞ= 9Gm޼]>>^jڤG...}`r-X\>jذz |ljM9_-7)Zl|}ﮛհAIRݮ_&…+sNZϭd6aV իWSYZlBBԥsuhRtD_EW*##SSmUFUIWFUKrSzzzJYYْ){P;o=8)IRjڵ{vޫ Xboآ8=t8^l#SjU4rԏ0Wg؃7NHCC()֬ݤ5k7c 5j磵d Vvv~>WNibWFU˯/U:*Ij׶UЄ+++[իE_cZz8pHqqG$I^֛jGHrrsb6wÚ4e<~|~uAH_&TzcժǟxUGiXh%I=jDGio|Bǎ%iæ?=]wm.g&٬$Iiizϋ}g7WXhum7t+;ulꑒ^wϿ@;jUn񰑒؃k+$$PTFU=ܜ\y/=}Q^աCK= פ).=є>m-Y8Ig=Hg(+1m8@YRՠ~m-SFϩz5G=t8^FPaa Ϸfs.V*EժUh=A-*/ocTJDy/=Q)З<%I*%Ę$$*Mx]l2&d'L22ͥ;K|* $d\ʧ@f27\ ]@``!@``!@``!@``!@``!@``!@``!@;pO>! n3)R%_S\L^nLf\\n+//_VE 8۞dKCns?<< Vh}yy? բа+eC)5P;磗^RҬ[t۝7ۮ^&O;޷td2]>^U5B~-( T!OZ41z᩷tsۮx_I***ӏ&IzWTFYLYݮoq:c'_?};g)5SgN : 7wWyr:|BO#^T횫ufڰnV.[k(2j׍V]RB#(CG4|mZo*;;G6sjOLc+WW u(^xMg9Kjoôy6׋-;ol2  J8M(0_n>ertߐ~zO$I5%}.}?3edd:jёZ4>yk#I s{ N}, WD k˳$U6MYڹ=F5jUs|ϟO(b5k|ѧWrRmݩm[w*bþUK%p\6oܦz jIֆu[a9 Gr}?bd荗>ԁTQm5oHl[|,1u,5֫wcb c* *k6; FS׶1'HfL+IT9LÿzGtv _OZaCtgxn}G{-U+wIr닝k^;:j賑Cfsy˕<7Q>زre%YI?O>yE}ޗ:DVs/=*ժ٤EzSfW"q+#wye߽{H7NХ{;-Tؽ%I]a Cqζ5^-1ܵG+p׆##a/I\sy+IR-ռUc% U"+IzE=o"IZj$[Saa9pz#hܘI~ϱZud2U5jUӆu[tzJs_WRV5d+;;G9ΝSSҴ\/۩54yZbVXUսgGj{tT 9JLLɿ)kPK9e:===ssr8^U*9pNvxVc1$4P! ܷvظ~&*fUlnܔ"&[ա5w-^RQXIRzz$iӆ?kڴolퟶwO""Õp1U+^>#wՏc~Q eZԼec tfL'nޡGjt?TTޫRSz!X,ڴXM7PM֭ިXuc./ RDmݼCm;Pnn6mV`^{B6vأ w}퉉G~4I5KVk 7_!zG+fU|[O5jRWsg/nWu?0nRSt.O'T4u$Vh̎k]2|LSOЖ-^ |tIO>jё<6zW8Asf/R^5yJKMo>%ww7-^RMՂKuCZ]檻ޮekm.l95a);;GzLQO?}Vڰn]*9RSҜmլUxCk咤w?~*eWIrz]{uZ4rsso3Jr<'gWXxn2KoXߺ]3nLE=zu֬c$IO<L)I  cOb횜__gz7:<<=T%p~gjT+j:RFU?n*X:vi-F|RSҜEƺeZYCo}s'p:;pMoMe=^Ԭe#^^&+o>a|vkǶݒ3E׬Z27׹c/xy> zRN?OS#]}Vd[}Cu78fkvX,GȯdL?0?CzA^ںkj䯔x,Y..V8nէoozu;oe\0&yU3UjJ&(;'WWqS%96`?udW"+33Swu\tݮc IJMIs|s+==C!gHPjjϹ>n+Xrrr+Wط#үӧ_JJ;5%-5]Ul]pskE)ڕTjFO3L W`y)SLsX_a*[`tʗun+uS5U~͒+? 5 00C  00C  00Ct. WtTk۱eIw_+4|#WS@``!@``!@;k[^n-_?ozd2tLǫ2#v2[cFO(vR07.ծ[zv'ZFժ?E߱m^x-jظ9Ϲ egu<0_uQ2;"]RxnnSPp\V99JHHRX`L&<"_yxz\̌,%%Wa>JR%$i ڶu$)fU3Kbvӌie6ED{NjڼKVke;pDkD~7)b92EWh v[bx= ?NKՈ+$4yٜ8~Rk~ߨ~7]5v+UNu~;jos{>9TMnn$oShXlzOa]|4Rf~Ç!/O_SU.x4i 03LX\XXg{MP߻oѠ!w>p$)11Y<,f}լUM֯,IZv>j׉֓ l3'JJ9K$IC?zI~4o;ݤ',IZjcIvKMM$uFTu=9 |5nV_(Hem%@lًٵO+I1Zt\\ǟ*Q.}[n4*#RjJ|W eHԒ+bSHuϭ!IHEFE@d5kPw]ezM4[;(84Pm5}rԥ{{ekz j:IВ+t*f.lg岵b폍SUԹ[b3/J}{Hwl-Q7.IڹckVuŚ7{$RDE zD;ڱGuה$uUYLj$-_FYYٺu$I[7P%I)i1rwwӐGաGp2r\\W+攰R1aӃݫа?wY9r$hԮ,,!]Jwp퉪Ԕ4}(ڱG$]Ͼ 1ry6efd:ڴ?&I:xƩc6rquј\RyFF%͙HS^SƩv_^;BY]IWQ ڼ˫l2*/t,!'&VwnגE$ݮ{zzkPSnx}4t?LѨcQ%\m7{#:GׯݢLVJsN^p>LMT)L~\TXTM{oהgVhzkάE7f$)+3K?]m*2-^7^S?8jT'O>Yp-ٵW5 H cnU)I?vuj Pjj^UgNv?ӝ^IyS'f:wk,}I)JMISdTe;'zY);^|_m _q]' IDAT8^p~?]SpHW*Ů  В+*Wrp]_rjZd$~jа:tn2e\r]?0Yƻ;Zl23.Z>eLO>_{BMN6jZO/Y=;j9b[jԤ[A+UղM CD=JO֭٬'tg|$黟[4˱9mnV_i^7vy[;ǨY6^E;~~7rM 붨NnO  ;8M:G۶rr]zW~|UXXAԮ{$I{PjJ=O=o"w :qLfF=Nբ#/Ū|勺ݨԭ,??(Mvأ+ZUSS׶:x$)jeLqOQz$WWg?p~DOMUIi:|BU*;_wACGd24q}{))izԪmS ~dV~WL2[MMEEW}* "x\_1FVoR$eԧ#f*||bZUx(6SmٴM[6mM۵iڴz>]xiWWTՈbsj߹E_^6Ct,!Iҟe(_/aTmTF>_I)i8n9Nor2U{bbUQm83FfNc"]k~ߨ~&+"2 *Us_IԭM[)ij߱U[5s3B~kS,UM$/_VOl6~إ:vi-1.I щ'Ԩ]M{bbu8.^BJt%MtNcqCg hvܫG$I4aC=Mju3۩g+]Aںy*`|]8 xoc;}"IxZ}ϩufjҼs]iTjsCewWSs%[ iii Wr_%+?y"UֹXըI='R G5{:7G?s^WP GR+E;~|Wv]YmeH|23l*-[ZܲM/Z~ .~_T,^hú-0}hx7CYudgl6땷gqS5qTlܭV3w ?ΫՈ,~N\+6QkCu ]u]NJ85})?vY} ,ԈkDcj6M5jX͙HVU*SSsf.T[+4V`}Ϊ7f>ըUM&I殀 Z|l6b޹W5$Iv:f]w}'͞@kVmPv$I`-L -_g.4ߕys"e_WZKݭXyDdDyyruu$mݴ] בjQX1bw(*V2cvأxC<|sx}k5ڽsytR|:yFF!AUޫ^|`x{ׇ>'mN^^+UbB>_# ;Ūf-~ڴ<M^g]Sj7P\زCs&I+vmV#lzxڜ&H-vCG%I>g5/h=:S׶ioKcTA6&iUϺ6 {j68$P9lTqᕤ\͝HΥb;Ũumu=V?3*,t3nնvvmߣGvZj1mZkkӷ֯<=k;5M*c;(;;GuԦ 222ն} egQx,Y&ց \NVoy˕x,Y+6GD/Y}|ݮd29#;qvGVo*V7#!/l6]=1;͚>_4U=oq6^| :G.jzࣤcɚ>uRS4pp_IRS>%٬}s 1;;uV[6m+ոY})yԎmz(77O'TkPKfYUW3eXդy}9w;b\N*b^2e˨rDEM0ϧG}SSn)?҇CPngw&M.OEU✂F~>U7Z6l+kԹװ?JT^ ^Tװ4샯 $IZ6Fh9rZUQmbfMm{$@imN[caCTNmݩȪ%I諷_D<$ɱ+o=\{}%IԔ4U9> JQB+:GJMӼk}R0=c6dyrӷwd~yQQQ󕙙:]&)77O+4,zRuD*ߗ"';GLsusMӝ,=A?N^5YN? 5~2~Vm[]4c\}Տ1g9|T}vnqWzFA-??=#jѺ$[/=;y~-'RojǶz᩷[OۼLBϹ^zoKj߱vrrr5jX-X~!& lҗÿs6_{BE<$??eff)N5jАT%6d>y+m޸YGJz隆=Hw8IWZj&L%IeLK@f-TޫCqV5oHZtli9**,1J9;{NrKgkX׵uv-_Zpul%VIV,[Z9Zk8C \VZ|s4ulKH، qq^>ުU'ZӪMȒ殠(fU=εn$bi %%Wաsa::yy1b(ghni/)#?aOnI۵'i3~2#?lj3ny"""""RFr |+ߒBcT L5qsweC}0nIE^kyrmϯoDDDDDDQ["4SgԩӔ.M۫+~ʲe.-_GHLJa˶])ӋG~y<ЯV#t4Z4fؐqqq.^Fz&'#4!L DITH ֥nۜ%s))ԮLf ڹ- dテ,c-[6!d$K 8l?2U#DJeУ[{֬™XڴjB([ )lݾ&ʙEaמlڲXf@888X'#)Uʓ&Jbb2㾙'(,4ӡ] -y)M2eQ8s>!'?C||{bCccb 9xMpP5vPdVp6f6SػF$z-k$=H|̞i3ɦ-;شe=$≍'7'H_x׋ϝs>fMoY;HJJ3{RNEᓏFiztmOrJ*w%=#3/\]{k223yꉁE/^rX(?CvNUk6[;zsG}şo6oLvr{`iǏK-XD#+w_}Pr,^YgN̝#Æ< XBkaU%8.?Xŀv ?_ƍżYhܰagsO *V `̚:޺֜ٷZ:瞶sy ^j.δlިX{.Bm݌/?ɸhټ9k8iց%'Wp*";wldڷm׼qqqaŶ=ݻX&""""wܴF +˨wZ ;uhM  O.)RzU녩g]'#NеS\\iѬ!3g83WVs/m-((s ;koY|С] KCFZ6+rOFr*".Tزm}|IС]K{1rrr8@puqV@4@hXDZlYsrr<ƴk׎#G2f̘"Awь3#G2jԨ;C@M;v׫1pnpw 33Ⱦnn~fVvj[bmZ5㹧pJ'$qh(G??}iTBdX8coo~r{\ cƌnS;ݱܴu,G8~ -J G L٘fv "l޺LMIIRWsSğOA/ЗNο),BU*{Ofr{-SW|bz*VVYt-C=qtt 9lsNyUX}gԨQ֑`_F-\βe ߴ|q:oNmO6ìbU L$\XJ:oɦ-;Xt5i{~SRhۺ>eKL)+7ʼnГXh;8Xڀ'A߯wWoƖm ~G\(vk{AL 9y4koa֝tԆfGGG /SfSع2eL-IK˸f?<*ܝ4,7s6T ̩(&LA5W#:#hݲIZhl ~wK @-#Xq1ԩ+/ёaC9.-<ծMs\] `^,b}}ԯWȾzԾ'M3 IDAT}֬߂'/σ, kQ֧4~w/'"ըQ~EDDDb:nI呙ә^ݤ IMM#'˔^L7t|\y<<ܬ^4r~8}OR֐ Хߧ3ie"l(SƻHYNN )-|22pvvٹ"U9{L ~(ncAڌ{)4;|}^d2es6w77ʕk$,.Yk}>R<1d_0777kNJn?׵)WꂫUڱOWNNNT(_2{{{fs!f_`Gӄ,E.G̟E͸byy7ZGH"YGx ͅL6%_uHaLIٳb廢w2dBzNu{nA.kW23db[k-;óIJnJ=ɤpLyY,;IWtQbVb皒Rbp6eQh.,݌$SRmgfޖ.""""r"XR£s1aO0XJJͲbvv y|@Vޙnk,jS6Uڱf~0_T>wn[|zڟdS2}ft#"9'i7'>]ߋ-o*zVfѹ]/3C1i\).:&/ݎ M8AXb(y$dzGi]9FNA.]'ݎҮjb1!q,z˱Gy跾ˈΞozz8G8 _[yju+G.%ϐ_[Y=swV:#7,[Vꈈ4,ŜH8Np8913M+4g{Vvgvr8"#Yptuf[v2j?=?Bx?oC>\ȡs!L??ûkFV<ח\d((, fD;\P c@x@vNVetyVt֟ZÎ1{r7pstcKG=pZf<-c϶NnU 6yqA vڞ2{mڞn%^皼3:zS^#֓p*2P\oj kF0l`ҲXr|RǷ.֦sLBٖ|:MVoҨ|bQDDDD^)RL9Ct*zVn;w|fZw,nݷo=v -`|Nue'pm Σq-˾{K쇷KiÊmww`q0^ wstuړ*0g"025_[+_cE oj`^ugau^25.SvU;XG˸fDDDDD5bzǭ,#VNfn&BDH~oy%ysq=<5]^S~Vm(Q'čSpwn}^`+&"9H= OrzV]ڍdUr я)|S2r30eYSԯ>4y\@Byi\ N=2 qupla&0!S'=k- ,䒕ItZɣUƵ 7`0D[W="\ypR/|hHXvb gˈet @ͲyӤdqF|cwꟈ?ʜ O/'#VS(ZAFoSg| j?t:U;eFbeuw׾Xo^_oFw)'=˂s f@,ܔ<~TwC{|vDmu|+>_Q _fv_^X4>+Co8xv,}|%? P&hms⽵a1Z37+O/1ȥKb01sϦe5 #_r :jŖOYזD:R`=*`0p4:1g }?/ͣbm>U'""""r0+?W),,$//L&0c&: 99T+]:UbYdrv"Sp&ٔvggfp:%j:+/0`EGDGS܂\bRT" M9w?kGzD} 70ʸmݖNFn:/'='oo ͅ'QX K w"SEDDDD!aFppp`"" G, wy+wGwֻb`Q&7_0\1;XVb vW W:z *ڦzQb=vW\ZDDDD(ܠG &ڋ\EXHZKDDDDDDl` """"""bEDDDDD&(MP,""""""6AXDDDDDDl` """"""bEDDDDD&(MP,""""""6AXٷNwADDDD(2ȼ}f3G"""""\wrIMIcJ,1Zk7LCQ+Ͽ~yїIMIc//_E34P,cگطiа-;k sq`aj iڼ9x(|3f~wuSDDDDE#Rlř=-W wjGw8@据|kQXXx:99XkT¯3v`F=,"""""iXrՊ3Ŷϛ{Ѧ}sz_D$z~*3}:юApuswQ=*YY 9F hױ%S~MrR >>]pp(&N8q'amxyy `-,Ywj0|/#$$$O`շߗ OÎ{)_]7|~"""""wF劢"OM]ǖ>x Naul\ WgVeXx5fŲu̘2‚<+صc?qd y#%_DZj:;_gu:xEV˙5mN,Y?L/_ZdȡԊS43U;ɇ_b4qH(%0n_HHHٲq _wr>2tvܼ< }e9gW߮{[vgb׿䉿wwL;Xjf/ L,3̥]V4lT~&d^x Y8fXH~w8=zu⻯u`")Y/] X3/<O[B^Oi?#FBn8sZg~L5IhϤЪMSΟO۪MS~ >r$m+?Xo07pqqf-#1mؿ-Z5'8VOT Ĉ//vզ~{ ܟ!䃯 Lf3ov׍FMϷڈhڼ!ɰV,[Gݯ aظ~G@@Z6]Dy 9jTr2M+X>a`0X_ۅSa2e#)SefNWb>>1.@,׶nZԮ[1@AA ISַ-4a{K*$'rȉ+W ~DFAn:!77gg'<܋"995+62s<կŹxUqqG(剳...LDDz{~֬]\}˕*U-}Cd[DDDDDXLjp|Z< OwWDRry^|zD_K!pzJRb ek4qqqd'''L&x.UZuqqqf s!}|=t7>lt\.Ü.Mt,aLfF7tog9L{y{AXz\'""|..}Ý-]ggb-72;}63ˑ؀nDDDDD$`h>~w\m-Z7Y|e 󚕛,Bgۼ@{k~֯Bέyh`_Əg"OEuaήHWS=uZrPp5~o}~~0NNNX2>sWE&,_:KlݼOߗj"TTDKέٰn篠I,`w?zߦ/.U~-y5*U˯=w_/fXkȓPژfZmۯ @ iۡǎ^0`yWg0pttGoqqqf 7m~EoEDDDDo),,$//L#LY&K{]{sc>_z.=ړAko9kȾ)[<+3 \0⚜ fU?d~4jxvrrr__bizz.2͜O$//CH ?/RfRS.>\DDDDZCpssz4,g  ۼ8Ea4-W?@BXKZ DVb񙔪P RS8,5﯉oM_, ]ֶAHM##>ϵ$/3C1.#q>TmYڅd&dͥ_<'w)-ago3YIYo'f_  `G7Gzԣrlv ig%+҂VQX:ZxHc̅fF<2eptu,5lr#NN?JU(EM8r5!/+:w](-ydgz|ԃB-<ĮIJsTiY\S.ILhŇIM#d^!B`gTRTjV 'w'bӈCfBfJU(EUNܱsM OO1J۫.\L$-6 Rx 5&FxG~n>xWl6v6Lnf._ey毈VNwAb_0777wjXn sRS_jL*,-;5֝L2EM/AVvEBGWۏ o 738CS{b27kRGMӲf:P"`'e`פ]운NwEDDDDDz ` """"""bEDDDDD&(MP,""""""6AXDDDDDDl` """"""bEDDDDD&(MP,""""""6AXDDDDDDl` """"""bEDDDDD&(MP,""""""6AXDDDDDDl` """"""bEDDDDD&(MP,""""""6AXDDDDDDl` """"""bEDDDDD&(MP,""""""6AXDDDDDDl` """"""bEDDDDD&(MP,899.(K15])zO+%Qb?5L?v!w!`)&f0&|G˶EDDDɉm[3nw ݑܝjn2,""""""6AXDDDDDDl` """"""bEDDDDD&(MP,""""""6AX:yyn=FX1e.a%Owu ^-_!de6eӯfMRy^Lxh54{~݇u8ICgׁ;!tL99DF!''6eq 8CVf5"2 w/'?燽?dʶ/[7_y~݇o|ZfB6Mغyg2hܴ5^BU*U`ʍ{depqqj@%ni;\8jtٱ/enoDDDD䮓Ͼ+ϽME9KZj ׻mn_ ͜f %L5[f3=ۻjwgɂEEFίR~-^}yR黩2pV?LS׶<6?OORkPɝS=*+cLl\\eN&1!6zC:99̈́OnuwY;oivZw@=E^|O??}F@*_q'iа w/pDƍ-}řџ` )]#owm5gШI}6em2tҖSAZmfݾs庶 Gذv+w˓ бskT*VgnN.>СskNE`:uji߼qWkc?X2]GP'ZAXhr |E?uhɃYʝJ+tjbcY+M_)hf [ʆu[y}"xd/wwYYԨȐ'!08|3Y<2;eL'"ع5kVldq0thٕo` j<V-Gè߰LfN-weGгO8HMIĿgNǰnfܶ{=p?=v}g@0nӅ+RV- 59#ZepO}>pC.mwپeӟ8s_z>bl݄Xly#rsYPXȎm{Lӈ8/!ԮS#_9Zmxy򾸺ʎm{HMM`úm|3hTZ3'Y9q,Yo)W· }|׷z80#*2wŝgCXmE2zZjLϾ]9u7^yS|8,XO[G5BSN0udʶZX_'Q3ߦ/Х5/24>xopZ|֭¬i  kdefwSHNJ!5%DKS "''F~N^^Cz ddd鎸gޜYIO!v"euմg9bسжC kyrR _w? ;HFѣW' <S>eK3c<'X%_ %Zeq֮V!yNG2pwwcߞssr,W/GfdJr3SZKrH(=3Q1<ߧs6ˏ3ptrޡFZnm =Ł}-ʷm߫3]`gG'p`ek}n} p߂=}t/o 3ѱskB_KHkŭ֯\Pp5Wضe`OJ .G,ֽgG_Ljj:qi̽ue8n]Z`^J~E3_BOr?ҶÔ«~`UZHre Ĝ|E?<<݋S%eK """"rg0zq-3c=臻+C=ܦy }/BV`0p2,geݸ8SRy'SvǏгO/]{3`h_Y̺֮՛Yx5w =.pOZ Sn0^ޥ8r/>dž<̙% W'#hظ_Yޥhܴmcý8Ã~"plްm支{ ׬򈢤"ۣ">fڀKa9%)ŗ?^].oͅh |vqeݙȕ_x]+qqqu`2e[a6c69~$,:fۖ],]Zp:20pp4CNN.#@ԅ{blm <ռU#@@ib%vl˟=0wTJvvm{8v$ݢ]Gtoڴt[(S'H\\9~4usw'w/rC'w3m֩_z<ժU*`2e[/Xc>v$ZuzEDDDr'F"ۺo &S65a4e_O͕Z39)Ą$pqjX^9|º0@Lt`}6&)Fzĉc ?MNvıp ;qȈ3߽X{bZ^U_|RQ1M$228o5iv~]YKˇ a(_:I[[vß[vb:NJ@ū}e 7>s.<-/vaU,hPί,-Z7aǶ=,]tęo΃8PC.'QoMѧqt̢L{,ɨ(͑<GS'L'JdAv珕Ek߯ V**:BmTc߱sd_U3Cd4j$I { =50jCiΣ-_ym>`^x IRTtO|ǹ>'H6Re_QfA0Rlxczt]|If%:PQJ5A[aPzo':vѽR=}nۭkONkGJBC4њ1%Y&VMoN5tq޺p~A7$% ˜e#[YZk?1h #t=F4ܭ^CG,-PF^8֊8LS'v2Ç(S*\yHe+~΋жDfݵY4K38(?uD:qFFww5 wϙ{me&"ɤO-Ң6&q=s^^^ 8j*  ,כreP.0-ʽ+ߺu\3aەK)8$P7:w G9}C#C9+A#<<ܝko?y mF ;a0TOAAݯYSMnP9M0%. p `K \@0%. p `K \@0%. p `b6[˅K5_XX_.\RvU߹eٔ}Mrr+Pn`rY {%ZT~ځ;Zul6:FfHYo֬/7.wBmmٸSf;)Un˔WbJ jߟ(׳3Εyye5n7Lu(4,D?KS|Xڱu:wMN늈 Әqo*<2TG+jb;u_x=젧v-\PWO|W!e7~]m$yyyis5}v#tJ^8BMI?UtH8F 4!jظ.8COF%S\ be2խgvl-IJ;PHrΚ>_)%5Ym۵gJ'/_j$YjUaMJYZLdkߦvU?w+ V~=׹'Iڻ{bZ6crczʔ5V+հ x´;6xq[qbc_m{ԽW'kǏTou9YNB2ҏl8~OY^Ѩ3&(@\[vtˆ[XgmٴKcZq2:i{ͤ]*?V\K3%96-?j]j%?SCU?4X1-jε5j֐$/}MC_xKfէ]۾d]:!uh$L^Ţξ 1\l5CuY 0RAHBBԵGf:(*:B[7n׶-ߗɳKCmV:vm/ڄF3^S>UN-gmmޭգ$ct8,fM'ca`,b0ܼ~4>V3S%ʸk%M&*sY$%J 5],Ut:ݪusG*aHIRy=޿4vӲfLаuQzvҷk7Jeg d͓ƌ{S젧bLZWsڈUǷveT3}8#fbd2SͫI't1SAq)y<]fRPp='b2͒]ݍ3婦gMt?v>7Eΐhleff)00T[.fvmyxW?6$ -"yxx|1 1 3tq>w ŧT߮lo٤S- |pHuQ-4|] 7p ӻcGTaT'`T [4)uSVAoTGl p Lv{O[ 2@Qnfӱ#ǵ*%Uie6[[˩QC-۴ЀϨIrss#T%l68}" 2fEԡzo5iZjt>`8vYV},UE}z [[D7lїR8mF*Mde1[q'I"U׷^N,I8,fcM>00F-g/PރEV PA``۪ {n#e#* p `K$T VUNfM)+Μ=ڵ}ԤqtW`6+=$#*nժ˿R-E5WZjڤa4FQ-\oILW$_R_iϜG@]ıIJT)þZK?qJcyJo@i.‰*5IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/separate-openapi-schemas/image02.png000066400000000000000000002644011461403617600270330ustar00rootroot00000000000000PNG  IHDR8ưasRGB IDATxwxTUw2^IHHQAw˺,boؕ EzNHOH!L |?s=7sLa,! `G <@x0# `G <@x0# `G <@x0# `G <@x0# `G <@x0# `G <@x0#Xڸev9 n7^^&eltj~r>ެJ+X²d [=2R1bdFålܲSQ^~Acw!4$XG9 -S8K5:a4Y`,X54v75d`oM;6$}{xSvz`4yM=JҚu[4g:=ï$mH~[`4iSmRթݐ vCE rkfD8z[ڧnoqW^igݶM1$I檤KA}ک1*ZVn.sevGܟhR&7?߾i2{UNf(.)ջ~ܼji\w|lv|K+Il~Bm۱kBCuU{;8e_R.uvd;Px@'Iz7:t֥զ SɚsY$Iyڞyb2u\YنJ_t>įn;g_ Fge+!!^ҹ륭3Iyymp?:26ZmZs[yyھ`w<ooETHy[jki8o^qo`NP&IUnR. n]:mZ+I7^3M~~*/PYyuqڳ/Aeen/-;ݎoKei~t­J_萁jW4fxG}GͧhA}7hVuEvS\ _8=fdQIE&oՄn`B;Տ AquHG`v'}(0F K[ޜ^/m#:gpziL&~~ꮷ_mm~GlL ]zM8V>>n<̫r*kY?|TmÇIRYy^~#EE)+;ש~="*p?SaQ}vY,f OK~[ScY}-j>Vt(wflq޳.|چQ_[$ i$a"KbB+5?^>#-|0U؊e2y;@~ #/E6{\-?K3 I& 2Cuo h*xer)՞ۼu3"xRRj7?oF$dx>E]99+;Wad2)UK~e15x`o]x5ݺU$j9/PDxbkNwZz}tnKǎpܺښ${%Ise96뇭S%I뎴`ҝCt {vf|{nTׁpm_U J#Wо.~OxV>`~n?8Dn`E%ZpAA,[Uc%V'pOVFf7:ӯSPXXIRiwdmv,fB][6Y6UT ljsW8D]Xt2ygNvQ!ɤښwPOe0_*b %Rmvt`BemSd`O%RuTًӎ+]pvI# e|P2%0l*0l.j{f1 귕֙3oq3/)pto39ŵW6]oJCZ; 7U@柒$Q5ږ$N'9hm?F%T*6|.=>% [$u p.ժՉ;y¢T  r[i}bn֒}8{SͧH\9>w CrȠ^,T A K-X^BZǵ?KOs N}.i# 6|u߿r$D9yq٭zK'I:>Qe՝7_rf~TkqӊʆaӢ=.%LwMTiE|-a2*GxLV{m@o>"]kL^R׀VwI2麁Tj͑ C~ᒤՇ^t׎/5ݓ1Vxxs  *{x1ӪkWբpV¢bZpY;W?sz)"iznKoOЏ?W^)8TOp{$}ٷϵm4{ޯ.e1-4jP}1y˚,m߾Kzvu>tmO~i5ՎkU3zctj鳯g:;}^:׳t_[>>2$]L,I!n@h'F7~ X mL&/GP5 &5^$ %IJ͏wݟ5OvB^&oMSk֎k4cCK{³.+=vOwdo_CyyFGݍ f $4)g]NIM]eٚ޳_w|)5w:WRRx4l޺CYos Fp hܯV_`9D?ZT忯Ԯm+*)%qwfZvKKo|t|()UO>ZFG&fy5O>ǍNe+[UtEPV.uo+8̘3M-"[iTRQC/u*:ZRmnˏ}V)9V~/O(VILJg_R7?[e?gߝuu #Qnfy,QZ}L T9 3~SA躿^8NK_;~hmJYY9mK۝ 5oz=w \-+7@Y/ry]?K&N 九=a\ͺUUvfq Pd24vHgqq֮۬DvmZ}&)IZnKY߆ gm.$iCۧK;4%M.+%n#y/g~~tsyS}s޽gJӖwW}Y]:wp]~~WNR]:u$)))m/ֺZm('7ϥ|#6%K#'S\]..)QJJavV-w cG*6&wChHFR.|& k>/&OE)Q>lKytHm9DS:c/v:.U3}ްAP@]pSk2㛙+g@^'|Mm~i㖝ڵ瀒S2TPX(UꑗIAAj.ڝp=Vk3mKT{f+` ˒e7dVoKEPLj hΪ|ٴ 2ySKfY՚7nޮ>W*9 5sB GVϞ]ԥS{={O!Q^^_~ͥYXzt8aݎ2ZN~X{nQlL~U>[TaYf#얔jڵ{vګ]֦]5_~֮?A}utް ~ޓn.{~ˢN{zM4\{oӐT7鼟|SK1:ywjYv֬ݤuQwsOUu{GE5}{jzYXhXڷѭ7Y3ޞS ë}?.ޝ>zϝ]+oo}ݬ:_S\\g_|K]_w}(((Ԓeܞ{NeWkĺжmN:Y,+::R-".;D@S9gaw@^ڵz誊 }%:g8?__}?n-X ]ٝ԰s_ߞ'[2?ּKN(OrNWorVֹ-4O([x ݡ}uukk>m޼C6mժknU|2ح46Lp`ahm.7\{&]'ݶcUd:oIӻgW [ݺtԕORyylݩ~Vqi*#ozJmoɲUUkԝ58=-*a!.eeeZteL&}.mv^[V>u7LS+*n˗mԥsuZʜy =}c ;wgu 0RgQ#-OLJьofjE5_IJKt|dEճz9yZq6KFTOϛ dI"Ta E ٥I}tya7*(ufz}Q :pBVS#9@aAN]-PaKV)͐uEt~SPLEOlpo[JͳPv"-zHE7#(SQ>C?dlCEgK_=?/KVeڴ+\eVCI//Ȓ$Z5Pwn5Jl2fn*-#][_ CVCӗjx'=61Rv$Wt(۪{K4vA+Ӟ+Yhsy .j-UE!mOh{J]Ѿz٥ː!)UJԪ">X:PeŚ'HK(f荫[(K;hZGLu%_Iýui**;LNαM* \d<\`nQ`ULE;lW^UhӬͅktS+dK%v]: Xb|ls.${o2t(B`#$ISʔSQ/-vY5[ϗI!~GCt}LT&m$)Ȧ<ƿd:zfG[TZa(K[4}E CM 9zѱmblڟ!mw^^W~VzlbsZ!h3 *G|h5j5x^GZX>i!]2{IRSRN*y+LbŤޭ|bV6{t[ z~4}y*r/.?vwU٧$fW"k1idU\vͽ/ϽZj: ? Q$Iv$}"WV %ICI6CsܮOV% VX_mI*SjUev=9>X[}eWۤq:\hբE2tݝ^+kEj³n_sB$Rϐ$]?X~fY ]=PɹV-S,IaCC-m@j`]ڛQM;H?n,O dCd1WDI8GI l.hL߾JT9ˢIl@,䷓$I+@__I}כ$UXy !["Nmt`~QLOT9A! 2uMY2IL8ڦ>NainM9Vo@Aꖖ:p\#}B! [ uQ]!ioz5lRnM/=SeX]Fݹɚ7H>'TeVC2,ЬP)Z_;g IDATjWHoG4&lXYaf^RcbԮyAk:81)k,k1{ۺaŞP/Cl髲Zu\^S f<@x0# `G <@x0# `G <@x0# `G <@x0# `G <@x0# `G <@x0# `G <@x0# `G <@x0# `G <`iCuJ U˘SnwXԴLkЀ>dEڴe֮8/ogtN8>8ҹ)+^p*iuN}iS.rCZ2qnj}3Ow?P'q8~t}uwĩ[ܿԧWji%KtR=tl~Vs7hujݽgQXǙ󕚖_s[DEEŒt]{}նg_|Kee:y$0 JάVk/..QExc5j( Mz+܆ CKP֥ zwÆhyCƴШCշOIe ׈C6N}Ӽs]i.ճfX kr;F MvnN[I]]˦MPQqq*+VkݎQ#oWPP3u('7O4%ktnRժQoE9>wQo|}}$IUZVvZ s~HKG|Q~7s~?goi#M6ge(%5qBW^>I믹\wv; ]{rTJ[Djq%UN_QÏukn$iJ>*,,Ҷ$UW 5-VdpZz\ 6mNLr^s:>~jt1A&#L-XT.}Z]oO M,Zԉp{mrJqqqӯQunC^u+Y x'$JU>U w:N:nTW;ڽgk^zt?:S:iukmvd uZڜJxZldplL 5k7ꬉڶm[ikǗ_:QAcaf9-fsٽ.wٿ=Lk75)11-pt`BS]Qp{m6qNc]ͦ?FrǯMڟCNǃv|<+WTx*G޻av¢ziVMvbM_7Q࿞soB׎9T|R$I3g+֨_ߞZݨѥDG9*(($ev[TΝ&ZAS.IAA ?Wߘ;W]VbN]8[5`I2q޶'8#TKW:Հ=/ݻuV1n%&?uVJjB\B5mxJ^=9LHԜy*)JM:x71#] WSKw4|`mW_~w(3\C?=?*֩J@|T꿝?x=wݠǹa옑ߗ+=zS/ ]_LF˱M\^^صO6]ݺvT:_CIRLtڶSHpPaڴ{~g*&:ul+sђ$ݮC*.)UhTo3;'WEE%(""\>>h9c0IO `G <@x0# `G <`i}mC ;wPdѠw0| $U :3 d29ސ4eg?$$/// ®fjffnw}Bff,fӭAfSyyJ 3K1ynviSaln @WMy.//lI]L+6[Vf֥H3w[bcJ`njjaBeֺ h |-:MZCeX05]]jg6]MXigW/`W ӞZ 4XXpTCg&5CR*_F|-Suo Ld; <ؽ8Yu;3P]u)݃3Ԯ`=<;] N`G <W^^˹ ^/=?VM<̞]ǎıl|ҠR&MRBc2^lԮYmlL|iRaytlzӕҒ8zu^ڵڻwڶm [ jOڵ땒T=+2y}uaekN:m o~_XǎҊߖ:>Z{tj<2bh9q&M.M_o(>lRip}s׼k I^>k׮WZZ9gZDp9oWTw~OW ]+Nk_Oa$I&;-Mk֬S6q$ݮ=J{)ݳ:+iqpxϳծ};[ ,Ҷu?Uwւ%ZR̓g|/{I&Ta3PvCˤ[?b0l,2 ))¥s I٤ʯ3ئ2$)Pj_U)S'=GTQQp#~ad֩n Ðjz[l ջ:tl_~gz9uiΜ*?/OǍL{ވC!i'$t׷Ub$-ۗ4LҨvҷۏ^S\a\Ý_W(I 0)֕hmH {vՎm6٫ӹ]v?VYy˯au7 C۶n}$IIZwIRtt:thk4k-ZD$ysW*((H ,9L 6nܬ njVjjoۡ ӵE***?ҪUu@B(Iz>O?Δ$M&䟌 2HYَfT\\C>{E?xMڰ~$_~`/*~ZIR:|8Kg [h=ڷw̞.]:k뛯P]8fV]ywIZ^-4pЀvY+;BvQH~g[]w_զM>=sOj;oܡ;;oW_{QzGu!4i.\jO.uιCcN]ye222u˭7J^ϛZiڱ8[oQ M7_T}g1r_ЕW]+T}E}j?).V9C`_KeM-4UKzxI%Uh$}p\c9)\ZOgZtB5s]Ώ5Bݺv'|WnI'8GGP%I]tr[Nk_obbup(99E .֭ݨ5㕛'zD?8K7n֕W]&}JKK$mڴEԳW]+t]jJLts%IL|Jn;$[MrC>lEE6׿~L}QnnZŵҥeٴqfI҃/Ţ=+?͚EH}ziܑy|͝3_=uѯ_=*Tڶue͙=_'SIIf|f|KBB5B=S-cׯߨb֭KIUOwKnSXX?Ҭsղe&MXݺu=>P[L K* RŹuLjf6dvIGqծ9`/E>#;;zij->+E:-٢C8?v݈cU^^ٳ*77O%%%Z:^W?Pxѽ_(Ixxu",9>T ׷~.?VTZZU\K}0m߾C{Mlk'$))uyyJ<7_Q۶%I99uԩ U..vtC~~Z/>TrR-[Z:*U!gO?ytux\ޑn8=0 P𒷹M?cŋD.S{6_ʟ޽W6MEڸqtj׮[oQ͏웛ſ.UxD ϾTNN>=imzH֬w y$i„Չo"Y,f 2H .VO?B7lOkՏ?T.e@_͞5W.Ј#ueVnnվ][j9k^}K[sEOgr }7l_ 3Ωתա[S-e2i\'ilG y˫]y}Lpk]; Mfw I8q:)ztplky[L\^{'zDSNozW[ǩm62U#zG~;nG?g_r, ֽ{WpcWM2S.=پikU h<.[-f 0d tcw%V;U5-, <@ZV[{,*1ԅcFk*))v'ǧrtg?֊嫴u6IwI o]Ϟ+%9U)˳α[nХ]liF˙9PQ?nBEEEoqo~Fð(Orվre,y?Xֲ"UێoPc$ð$r"Hy]:}ٳ{^ϛ8A/Pxxj\EEgVXj-MNN,LU@iԯ oG(00P G*aȰYe2No=H@d2diؑZ@8=#0#`_~@L=8s@&I֥He͙R~+;@ML*ܴ ٨Lt"<`o!CFL2IM`nhsCЄ٠S Ðag_t*hؙ  {CīȆ `G <`iwQUǟ;%=HB! HoR,`EvԵt-X+PEJU*# $$102~;w9;3j9 pmNuBj 8ڌ V0MS;v({TmX/t*EPhF Nyiʵcv:n ׬Vцj kRC0)4My^L&Vtnx5]Z@*sD-Y9Ӧ)[dju"XNy^WEKᷚ#"?IRцz5\_Gpzτs6n0T\j{@pJ3MSf` `%m6l,t*I# @mUMq٤“ttY$ۭ_70 ELrj `maa:MW+2v\)n/@q IDAT5uJk ?,xq'=}f{aE5+ݿ_˟yN5\MpS{+.X}{UIjćtY'l׮ Mקoؤm[랻nV+VѨ_jJNNRseoy}z-*))ч>ׂT۵m7_=󇹚5{6nܬۨ]tVߞFف6a$svn[nDg|+/WZ:y$):9[QIvV{zk:]׫=r%I2/ж _$;[u5UΝt2 Cmhr]JM Wf^pH%_Կ_֪$GOv&;]}-YRKԤgOȏ$DGi5{ԉT5wBIE'qr%IgΖCߩk~?77/_VX1Qڱs $I?b3fk5aǬk),,TYyΝU+ ;wls8U,GX$i+c$ɰەx/U'OI m$8_jz;o ۿ/wZY+jr -}i߿j-|QuspSǎZ|}IBegqJ&_~?fh'Қjj_yF}NJ6n\B_~GMSS$I ٨7uAR4 ô/ȃwK>3^н*Iۻfz[nh5NIVVV~1?q$k/ׇ ?Y9Lŵ{q* QxR}(N|M{n^[oQWtz IRކ ͟zPQY}%I{fVwT<%%qNuO VWϮ:Y^{N3fKJ# 9Ez>͚5_N^o6o~Oc] զuKm޲]={tURR:wjcFY]AOe%F|w[|%7b{$IE.$i_Ԧ+YwOӶ;{>V]uM'ZVcs"a8v\r֩./gh+UW gP\[A2-qҹgWEpصE:ֿ;B)+$]ݺ\[\ Qf >8~QzuuFN3gW8>,,ܫ`Bյsk/+{vK8x%èCӢn|AКeQ+..?> ܰ6HQ?KP}rrZm۾S:Y}{qpʕk5zWܼ|=sJj)~$ yE8*~Pn^֬EݺuT^oU˚gp+ǣ~tlN.C MWn]u`@.~5AK {|[uUGyY+Q\mėsk`r|Hۻ$iDmN]bKFJs.Z\ol1~K+/ߣxjsZmQOSxkW(<$ku{~uCj2M׮׈>ޢ_q_@7avoT4uxqEPt+u(OirBTܖvõLm"QU2=I.PΈ{թ#W^M2ŞF2.U 4MdwzvUPPׇ.)/W7))-UN~5hp̀G\ڽgbcU76>i@l6]4O%%Jj '#S0-^ʴ$I^-)מ )Acb*=,/Or?t~RxRG\P {))QXRi?|wI}ef}ӸbүHr:UXf !b@HpvyXX7kr}6PoX$K8 PxR'58sr? =a\ 1n0K , f C2;x k"8ZN=0ZPXZ IR椉j),T椉tWm>6Muk-Yy ,p:UojOV@l INV[oSiC1NvzB"3 fl6N9xdfM Ðnfk Ny˜ar8z~j{j#$Ivd +"P}jE~qMk xf5]T/N` `%Ԋ5dq;௩`,a!ð)cܷ ,0 9NoeUPp!!/XaH6MX /3 LX2Nf10p$%@X` `%@X` `%@X` `%L޶uɨrix<5PTխܥ[UطzZ}׽˯j?iy5]"7ޒ2N ?Y?8S JgO3gロ /<ٯ}K+<.\Gif͜ ԾC;]5z?.Ք)մi]B{| Ii^ܧ)}wky6mvܭWCvk֬$NTI튍պuոIF~ ܹ9޽G7cg>O/!It٥zs;{tFnܥj !ݺwU7R^XXzO_X5 ~//F\_OF$i_[9U\\7~M))Qŋ Qhh$&;oo)_<Ν;ϕ$hI[n痕5LuEzF&ZW\9HG~t|awM+qF7I/ƩXv䯿Us̶1R94": PxD\.8͛w?$N>23@&MF+WVIq:q4w|͜ҘꝷF;{neee+)5 _kھ}^{m> E1J}HPS˖.ׇ~];wX999jDP+T9rj$ B}?sv)Ij]&ZF2F GLE>yҕW Ҟ={ګr:w(IҥfL^F~Q!Gg8 +װ+Y qN;Z%^I"ClnPdM c{`!I2 )>qB}ӯ7I:wԷ_oֺ$ngܗ4jh-EKWW˖ /kuPM2]SL>RttV,_b-_RԴiI;G@bE/=O?,51[/>~A$io~>[x@Z1eItRR~ZV!e Em#~fjBIRVG}֭$Iަvݮ%&&T een}5/un%I_OVQF(}:#;844TCn<c؂J7Ӈ($<9?O7]]4Nn&JloĶe I V^4kl[QfIxz{եKvS ؂6fu ! _kJe?ƒOrBh۷ob|›G =.w|c>+QCݛMT؞'Ccǎ$vnDxڶm(}>U.ӂk_O P a#mҳ=ejk[g4 _рju{JUVK!5Yezcp mro!^]Ys\{}WǎxRM:C{ӔQ>ռ ԸIQkVҕ'CYZrswG U)M;j6+ -}}74;(n4}.RMPWw#Ð޻>Ay.D>B;rܚkSNW J IDAT\W"}3iӮGi2"+qBtl]^ZO>s4qdݛ{DMj7pmc"""ԥkg-ZX^~];y?)//_7xڵo'Iڻ7SLKxY6<6IjMEzwvw%W1dѹByM?SrT5M*Ho8<ئӭkH^S!OQv}^P%~CCCCsG=CPwof9xj޼z!Iއ*).QV钤U+Thj4߉EVQQa?(UYi:W88UdMwEC6CA kَJ솚sj[[?~6CJv#e(?>-4{᧒?Ur{*!1^ObSNN+FIS^غ8/>-I} aT}SM|ft:e SyMiqߖ{M}et裵;Ҷ laaajSej@, 0K , 0XQT`C uZc(vICBKJ "EZ_PzŮ"]\SWttŰtA9K.)A*=~ŧkZ:vaXggjfSP+Tcm utUjt.i^ӥ  Q|b96f(EF l69NulAx<2MS2k66M6]ah}aHanptf*k-ɆapzeZ0dAIkJ`+\dXeW ҡl/jb2 ㈑_>#|Wru¯dc1Zo6o' 0K , 0K , 0K , 0K , 0K , 0K ,Q]2M4P ÐT5U'&ɨ>u i2%dz˫}fp`S>bjb7TSِ@, 0K , 0K , 0K , 05]@Uٰq<OmAAAJL p|sCߩ ;j&ҷwիWWGkm +o)Es5MM5$e@OK$A7J6YMSS7S+(66Z]tM7\%)Iڼef|?G31ԡ.xիsLWsRݺԱ$iq595MM9g+/(ͦVq_}TX?aR=!Iڿ?OffSaa:wjQi*23$P7z\bIRn^6oٮmw?{%I-iMZa,[w|IdJ-Y]{b"ƌ߿yvm]w Ѿl-\L -O *!ZLog/Pr*..ѤS}?_fKVp^P\y>P|$\JoLuCтk붝ڱs$)&:J=^|MIRIii~l6 m۾S;n~z?,}7{ {]jb`6>AN _ړ 7+11^?^ Izժe^eeWff.[!$8$pj |(qJl6n!I:p@/ YuƠ+oQrп. ~2$iEmNtygp4w%I[lо%IZiOFJJKUG '#Sw }L1Q׷ukoj>of)_nJ4/./Ovȥ":o(22BgQzf|SG|neh[,_АIQQⰰP9vIPXXuD=0ӏ]$WՕޮ]3jnPկ>$)k_6$4jW^|J4wB*=M,֚tAjӦ.]gUYY9Zv3fܦ`-\\ԠAl*-լicm޲Z&%jǭ{VZN׿WknЫosh{zzV ,Iǥee ;QKsy] p2jܘ?p@cP 8oQ J]JGԩc[-YR7vz쪹Jڵm&)|1AiVHԼYb9U#E-^#C3gke ~TaN]1"Ii_HNFJoL ԣoݣHRG)I|/!ߞ8QrNիWW3ܼ|]p޵cXay;zr*((?BOv./r:JLCںm_Ouc7H| TtT#k߾lկWW11RXXX V7oirmuf͝3_źk %I|0Jish5\5:`I[.*..i3U\\=‹Γ$uIh>mڜ޺Rqc~@eG[ [ż^n peQK2)nTڟ@aar:'7g*<<\N] )G SP |3!, 0K ,!`n_GkUZZZ@!y5]N_;o!@)--Ղytz"O>z 'Aii>.JD^.Vd(+ 0 06H)11Qwqv5qDM>]^Oiݻw+77Wa(!!A111ڵk8p6bǪ߻)(Y]vI0oY_u0P2UZXƱrx˽ەШPƄV`oQαI&ԩ~gرϾ\pjѢEU^F /h޼yz饗TN*++c=[U\8 ЃA氩tgdWYaaN}ڐ s$.vkJ;'r?fWϣ1MSEEE߿ڵk^xA?edd'TZZ^y*i4MZJSNE]ٳgqJII3%++K|AKSNK#G|uUW)::ZV҄ sN]{9s͛P]?XM6W_E)==]}Ν;si˖-U^gIIƏݻ駟Ԍ3p bw氩wrӮn) Ҳϖ)wGdJY:!Gmݑj%˭¬Beΐ}>jZ`UVi׮]'_ =ܣ{W:ubbbԱcGEGGK.JHH$vlR-[PLLz{L{VVVZy]lUٶmƍ /Taa )hwe*9P;']MbU]WlmA۴Niر_:nԨzɓ'_uxnvNEgUϞ=uuzBBBԮ];EGG0 Iʕ+'׫M6r)??_yyy'ܶ5{ !gSb<oQ_]o*{],WQv$)T*Iڻfy?_5qD 4H ,ʕ+eY@ U `aSDD~JKK5aeddhر;v_)**JwuZlߖOyyyԠA 0@#GTYYٟr 3t0K36(rdsݚ2ezꥫZ[nU~~~ v i*))QpT^W^?Jx͜Z-)))t:}k~S(J(2[Y)^FDtowۃB{c768ۜX*,ut=X֭[GcciB!rWzTyzR#f^FEX!B!\H)B!B!DIB!B !B!$B!B#{{z f_e_a 2}m6NuD#ub*Ghs.1*ĬD{i7&,.C׎^Jin);ۇ $H" TU`q| esQG(_[Ş +R 41!hZjPwη)DbV"pōTFBJ5;=o&);JH̰+aV,e\Qӧl۶3B! $!_ޤFNCX-v4. ;~=/% ޣg撿"o֘Bʘ&3ߌkp4( (M~C!itӢYl>T@F&,crÍΨU|W9ɣ AF? q8l}y+Ko)+=0I#シu[,{hpD"gYeow+0v0z1[,~ /|]1H2f;Y ަhKf ׈^pLN{x[݅\k^|Q{^_͒ohkh۰5hiau:{dgg3q3B!9 gKNWMSc 5}mЗK #"5AKdj$Mn,eBΤ#4!x+1Ⱦ.}&6-伔CCqQ7"(&/l4]Y2`cc+ ދe۫h*i:󇧄3zhR':v{E?7&yd2m.؁i4 Y_}a=[;EF!vP,.Ddʿ.g6a)tO`D YWdćR׷sh!S»&v4: g $tr^ʡ* Tp;8G'?`Pl#f` /`MzbĐ0$~Q5d,0N7Y$KpUH@D&=)Z<^MދћTM)6GJnBuauܗ͑Gy9NèFa؈O4, IDATJTU%uB*[_JqN1f Ңp:ؿt?;؁ۄ6,93)\_H7 {{S;:+]N.CNN999\yٳ~N!B! p77blkKN"1+]DF Ly` {X-vV>33p@YP=*C5I!th*i"uR*v'auDT̑fS7AsT5Gɺ"U/ w%$!$25b#{X#afi80QI/ 86ODR8Лw =coKse3 E ؇(Rtxq*VrdLa&4: (3|,Coғ:9^#z?4jTUf~\2P`{SIܕqnZk[;/I#h*k"0" -DE3tP,b & 4o1qmNTJPLZy*mm,τ>$d&`4 M{'E_Xqu֑26鿛NZ gb\vy42 -esxHɸޏx_:2fhN_[{S;;ىzV+|O=s^8qX!BG|Wymf_Gd\VYjLC5侕K7 pSiLk%Jطt+ jV>G7cAcI#s jc0Y6*iߟpx ->QOxJ8^Ğ`407HOwr_z-ZF7e1ȌGfls_KQ7b'Vb1\BBHL8n<ϻ8u45zTqǤ no'{8*X묄%lw\콮^&41W xk1uut3~pښ6AF0x`“V2fkA9x55T҄F! iJw8TʶW*FyhojghkhCgkD/ W:qcǛ;!Ȁ!ȀVbwy?RBM ܷri<7nu'=>.2rrrؽ{oMB!JS*ߔSuǻєMDjᦡ=lCkjwaPW "<KQՁ.EM^S [tXDF` 3@dbq"R"Cz-S”qy};_Ub7pyh\j*TR}G̀f<:w: ws G3c i*mbA=8ZZZXd O>$^z)/2v}B!8w(Yt:Zܿ1gg<ԓtzht’P=*MMJPTީ@7UkВDhb(u=\KtZ4/Rk1&AZQ m.׈^ p}T"D+;J}R.E9ڌ(l.6c-v*^a:kVC8L&&b!q!4W5Îl c`,-v-)8۾|xM$L&8>v*VXEC̀65hGDuV*T`|#x`x Yx*U%z!Mz*vWcф&Rf"{xP?l( Vhn7&1bOSi5j%<%ƣaRos`d FVnb47R/t:G&66ux !B_ݷRIfzY& DbV"8o` B!-4,~DE'jgn7u܍:`#aoSU)--'>Y!BcE2fvj%ȶ˿WS' D]a~B!BK6퓒yG~wyV_z&;A1]B!'$*:&h9G}^\#`!B! nwQLmnmk{;lZ:I'@޽iooUU&**Z[[֠% ׏U|W~_p\0nGHB}C~L{"O1ԇRW~;h D );#rTJkM+mm4W4M굤NJe# vgьi4#imhs߼ 5ݶ',G&SWX6S_Mq}H %M!1++;_jJnBuauІ܂Q1 aA1Al~a3OFz۰Y0Iu<3eSPҦQrh(n84: .Dt4Z {*}+onpl0#At{-o,id?R—0h^8<K9}&!5^C|xfi6kc0HDcn[W1]^{aLo2 MGi@Oijc(or<TȦ#Lhtz-/?Y!ByKvL~% pE!))[CII mmީ>cZO/;sdy@VhZ=oy֠eܭlh5d])ĶWQWJYĤl&̑f<=Ql}; Gw8TʶW*. &>s jԜz-/HTZ-ENJ%:-M}yլ|d%6L'o$`c p2j/Cצh2Jb ўo8R'2`c+;Ihb(1bPUu4w?fV@ )cS  y/?1)lG%hB!?.]U?ITJku+{\ol6b ! !ޝunl`nE޶f_Mi>}U?ro%.kgB^r5wJvbhM-;qlsReߝT ~;zt2]-<<Nyv>yz zM{{;娪Jtt4QQQzrfewQ cSƒFNaˆԪꝆ{}U[ 7e+ۨ9PCse3:ͼB̀TD́;gz-ɣ1(\t܍{D:6“ñ[ۛ172ĬDf?9_`mzkMzSu<`E)Jseou`D CuRjDBVMM45@Si1h>@񮭭oCdj$TE1HCqncP<Y47RݖBq{_`oc 7<2`ک[^*V~)B!}~>ImW.엛:O}+UԈlFףH{r8:tXMM 55'׶:8ȷosR忦ƒN=Q[z)MZ_շVUSWݩtS{=cW&HxTJSI{+LFzTisB[} ;5ֶrhMڃǍ:c~[g;Rd.DN/B!8;nf6r_v9$ pRBWg[w[~Uɗ( #id=aqxh!BRW[Nlܷp^Ֆ~$TʑMG*gӉ+cգpT?|r'g; !BqMTt_Tn >MQ4<B!'T϶˩*9)nm^8HX!B!~b,MܾlsNTFA!B!YJuN$#F9!!B!9\ɹΉn:g~B!B57t8-Ή8-} /~q&K",B!hd܄< IDAT5pNsf<3g; !B!?RDX!B!8IB!B !B!$B!B#H,B!GX!B!D B!BA`!B!=$B!B!zIB!B !B!tg;ӡk^wd2ѿ?n$%:Kum477sќ֮ٝO`=71udnnW}..._|#nj_,_pFI!B!~΍ EsfsE3IIIbrpKy׺nﳨCx<Sg;fTUUORW[sB!BdDCBBc|1cGq נ(+-AeE%OJEE%Zn>|o_B>)]+ƛglޔÇ~B}]=[䳥nF'GdquWg)+-?~~7b08pGKJIH? )B!s*;TWUQU 11S~ =b 0w¢EQXpH>紷 @Ue5yyhkk|7z˖͛sxw8q<6ϖ.'::Soppz9z>S;uB!\tN%GXxm~~,|w~ݬX_Ba GYY9힓ߗ_q Cf.櫯C޵аP.0Fvp|Ç ;햻~ Aeet]!B!8S pTT$s^`ǎ8|+`MSWW';5l(ZdL&Skw8vmnͧ=wNmM-ӧO%g6>l9Xn'|.wtνګh4:t9Y/B!BJcbl%=?j1La4iokqrzV+VvBCC|klv;/oup8GM]]=;ٸa3//~W__3JJUUQbyc0q\qWj !B!wN%NJFqfX^xo &?ȗ]cC_rb՗C3ظa3Wv{QUUƿ?obM3uylܰsEQʻnΛ2 EQ|xe=ckvYZ-q1n/*:߹~FP!B!;7c@io_܀hdw݉N[s,wM>)(Cfw>f\p>uu\}E"##`55[$''q;nX83OI'j}3/?-ƅב9]NqQ<{vrw;vd !B!ĹEQ]x<8NV+o ٙ3fd!&&Cvfbcc7^[,g.xN8""#:r :N vbbOUIB!BctJ'5b6g$97*C@@qq0u>ޡcMpW4q߽]ǿW&B!B!N]KOe/Eo\B!B% p.7l B!4B!B!zIB!B !B!$B!B#3`>;omB!BFF57DZiqN$s7I+B!n'gvnůI917_W!B!~vw|lqZ mg;!B!8g+99KW!B!~8JuN$B!B!ĉH,B!GX!B!D B!BA`!B!=$B!B!zIB!Bf{9l:QSxEEEv":+l!B!G%կشioqϹKILLmر5 z'ߩm\|L0&k֬aӦM,_1lܸM6b>4\q 9so{qף|m3f`ɒ%|\~ݻ7:K.'@`/ K._&..{w:ݻ7gx:f̙sV/B!ę;)RL&z=,,lڴ{キSgi`00c ***8|p{k@{{;大yJmm-ۗ$q͆"44zyqwcZNs]wwy'---qw0p@|ANʟ'TUEUUx Cr5kiii\q|G$$$t:IHHO>aԩl6w:) 6+WxNNݽދF^8B!LQ%Kr a֭lݺxTz)233Yx1h4UmoNvv6FraX9r$6ffڵ~ ` .sҥ444S<^{-tY&~xg!##7U{ܹ>}_s72o_NM>D;^ߑp饗e233뮻g455;)rxvɇ~Hee%& ?ʎ4L]ޯ_~~oF4 7p&MEU{x<477SYY #۷/v$ӕ@YYw:t> /wx Я_?l67o_d21a5s!88oxx8SZZ6sLMFhh(Eq!^}Ul64440h N'>YYYL6g}˗3h 222xg|;WTTPZZK^̙oN>}oyѢEXkvǞ:u/XGr-,X_O?{DPP;)Ǝː!Cؾ};?7t7|3ӧO% 4믿|4zvZ,XobA5L2k#F`۶mt:~ӿ^uߔ莪~w5n8.TEQUUv54iӦΊ+bĈlٲ>}( cƌ]l4IOO[oI&pB7twywO!BsQϟ?EQ0 \uU#u8ݻ^ϤI&''?'ҫW/|I3xwf۷/mmm<~)7|3NW^yS{/6:5\Ô)S0 (”)S|q;),,dȐ!wyTWWOxxٴiFgdddPZZʪUx뭷hkk#=={ǷSFTW_}5SL)S0|BCCׯ&LUZ0aBtTz.\ҥK `վwʕ477QPUc]%=uuuL2oc=k+))l6@KK > vbh4 v\ݣ333h41n.rNQaʔ)~ ̀8p ݻ7^|͌9:{ƌw-B2m4yYp!mmmƏOXX}uZ!BEQ;^<NyvO=O8 `0tòN#&& sdggsM7gϞ&J_?O۷_8ILڤB:% ">ϺkŲu] U}յT7  $t$d#:ke2sgn+9{r ;v䡇Ug9rzcbbϯ7!OOOBCClgϞӾ͚5vO{\`` ~~~9rm~6Zn}NNHOO]u:t֖-[K˖-˫wtBB3f`ʔ)L967h{~qƵz9s&s~f\)`bxל:pEDDDDD|233l2DDDDDD\j,q] """"""EDDDDD%(KP$djDDDDDDDN޳KiJjxM ˉdb䩍]Fhmx^z}Pi&}sh>i]@Ci>'}T9`q """"""EDDDDD%(KP,"""""".AXDDDDDD\`q M*WUUqqJJJ̸7v e%9k;n ݓ*\4̃9k!!LvnwNA~Ac'""""""&1|ϵ] IĆ'OBBgXdWaCj2ǵg~~4}"++^|L}/ng tt}||ݛNLp3Xv+V@Aun &&EnzϚ(++Ʊ3x@MgwHKKddUW`0֛osqdW1Թ#6.XU؅nًޞ.̈9j%""""""I(>d>3螜DRDx={gl6Ӯ];:oɓ'IKKZ^ ˗_,$88>}ze62djpԫ+*>\_$@m˴;nl6}N̞nֲbj}n?޽6{ty=z6oBmm-гWjs玧XVF_3{n`Æؽ+ L^= ؏Zg;Ɯo8Xj-'?f> _ի<^m6dfv` 0fu}iMnInNV-=,_򼯓Hcj#^w5W]=Lm΢Kؒ)[^wܓίGN4x?_lJ%)ys:?n_f=PxKssO2l"##غu;[nl6scqsss@bR7C)++ im?=^ 1 ?= ̷ld%,ZLsy'8t0'Lu{!"""""[$EKϙ8i< .6w` p}m6TWUSm&22??lo| 9pQ\ujkjVZ ZQBv͊嫙7ۯƶrf/sԹ3FFFԫht<؃哒ʺl}!b۴pP^^4ܺUKyٵs7|'tOYYn`U>%'7kז`=йsjl;ԍnX mڴflݺ3ee >z?={rǟSXXĢuǝ:''{~@Iq o@YϾ`͚L:Cn||}# BfmY,Zk)o$px,_e_F, O~eҿ?F |i`|'9j;ʡiEn>t>/|  +j6|J/[I@)S'a; >tիWF#Oo˻@=qlb`F% n{'y{;D3ix<<gS玌ݍg杻eplnc(//u8!QUU]?P('~~~LGXxRpώ&'0*++ӼE8:p% IDATϳ""""""デsbj#?닯F""/ ΏšuOOr3tӓ_U/ Um\\n꒒G@KMQҵ3]vn2DDDDDD~s.$kˀ`q """"""EDDDDD%(KP,"""""".AXDDDDDD\`q """"""EDDDDD%(KP,"""""".AXDDDDDD\.p VDEE~aTVUpBCCa̵"""""҄4)Y9ί[o@0,lJuf>'}C7nj/вU ^{}&?H ~|>11aw0쵵,^ǟx%_3|Ft.+su< ne;7Yϵ},ƌ1-/VDDDDD4Wy6͸y5ጌL%v}v\9b˗,V+1r8-[eDsQ9<ܷ=i{9jEرQQ0OqqI,ԓ緰հa,ZE ֜wNEDDDD5JnI5 unb>J׮WPYY )x;_mZ;mT"##o]6RSs00XV^z9L& +ZM,Zݙ6m_|ŋ:<؃哒ʺlf9W9&[q4}]nزesq=7c`@݈n@@QQ` ԟ*n>q 9u`D3ici ǹ.nfQ^^yq[f=: |O^Lssj}<\=zO OO{>5C}=&n3+iW(UVVRTTLfz -zt{Oj#DDDDD\ݽ_9x!>>>xxxK ֜i=IYiS)--0N mTVUE鏈HSIL)@xx=gڧyf4o{6~X|KDDDDDD.M9""""""","""""".AXDDDDDD\`q """"""EDDDDD%(KP,"""""".AXDDDDDD\`q ]@CXzmc """""Ҥ 4K`M"7 !""""""@KP,"""""".AXDDDDDD\`q """"""EDDDDD%(KP,"""""".AXDDDDDD\{cPN`޼صs72uaaط/_.f۶mŨFгguk7b*>J\|{nwD7J_DDDDDD5Zw3?f)9|/ @nIy F#3<䳤lJ eS*NjtԑFA^^~cvKDDDDDDP>t0EE'h"j^GeÆoݍۍ,^ɉ|g$q7:;k3_""""""p?5HkYY{u<:MFF&s6f3D=IpF[]]j-3''c wLDD8EEŔbZXmoۊK<f)9S'Pi޾F 6[zY(߮&>>OqtDNΉz:@BY?UXXD.p$ҒRAڴg 8x06k۶UVp?綢b9JLL%냈\\M"jҥkgno6:+++cXV.'N2:x\9bOaU8[ol]3i(Mb }̙)^ڵoa:zm.`Թ#xikf؃X,B&R5Lvm~4gwb^{}&-[2www T4&'v+o5Cpq#1LmFOHA~!1-1p`o>8v23}NzYޜZ#_4L{5?[tMDDDDD_d"M3nw.%uW9~4< }=i{?vQÜr.U՜9Avv}^K>x#^|1!ozSO>Ö-?/3x3VRZZFZ^}#sO>n瑇o'44E uӈOc]~k.eedfWޠ( GwVZ93?Q[[ˑ#Gyikdgew2AZ^:t,f1 lݺ> V+jjظqYYֲdW$,Eb"""""r6.5,'3Sn}_Xh)?&/wNK|ͨmۆ.] g}`׮4fVZGBB9Wt⩧fq͓Y|<7q-xٱc3pfzAn]l֞iwL>;,ZYf˖픗0~tXK{fxWtKʡ {m>loРO`Ķij媫G`0yP3 f5WQ]]ͦMٟWK1e$?w;חnl޼лOO>:'ԍ掝0 xzz[8~)uZ+*?PPPȮY|5}>csvV6ɮ c[SZZ @Vv:w$d] $4'r!G!tGʦT m6HQ_%ua{r"n`+7͌{gСC7|tW^f=QQ|} lf͚P_@^^>qqaLvͫ/ΰCۯ73ػ7//37^:m[ޘ͑#GY նj>s{JK~&E0,]5>>ޤsJ#-m/3;Mi$ r4oorrNP_i1L,YP7]{"&&17^g~O<@}?/Sۦ5!m۵w7݈7??@CI}ٜe+Yl%L:B>2*_9ֱ0 >6.>zƱc4xWĶiM@^۽z`y4CsnfQ^^yqFJi,޳V+'ݽnSۓ0i >R罼?%D.hiu?vھ'11ѧo셗=uOTiD rDFE0[i߮mcrX,7إqi rDEE2wcK*<"&ep'Y\EDDDDD%(KPE{搚.GDDDDD.1DbL<,ؿow9UWDDDDąUUU통l4)rQ.7oNc )4,诈TS """"""EDDDDD%(Kct҅^x|-++{FLDDDDD96nȶmp8SPPe֮]g}norDDDDDD~,"""""".AXDDDDDD\`q """"""EDDDDD%(KP,Ã/lڴ͛7`bcc,ro%;;9s|FJDDDDD弜8q?9o-"""""".AXDDDDDD\\RaaaxY.h^c<w;eeTWb-6ψ\VSSCnn.;'@3f tڕ;SQQ o',,ÇŽ;1bt҅e˖@fxd;vڱvZ^urrrXϏa`0pW0}tϟ˱lVS_^:j/fh7xx{vp['Oֶ,6Hl<_U4} l2̙3 UV?3` ` |555DDD0d^~eƎGQPPd"))͛sСRSSÿooNff/ ;i7mH!GSϢ,$=[0hѳs$fdmbS#q sM& 8jl9FDl6x <9q~р; >>֓2Ve0mTT0&pm&?9.q- fZYx1PSSZ"$$m IDATyQRRoٵk!!!۷Lv;hтp~iEEEX,_TSEE))) O7w7_ٞ<} vc00)8T@eq%8$ |bt7wfsCX|4#gX kdv.BHn8HJ;.n']"?gv8zc[aSk`0DDDDDP0p#шdnSYY @dd$-[ltUUUݻ7xU9rȥ^=UeU,yh G6fTnd䎛 dw>: 8ÈsaV>_8"Frlٮτww*?~b_-""""r.>&pO>$%%q};FV+| hO>.]0k,ʳBUW3Nw N뾭1ڞuΕkmTWONE~1c"w$G nT' NP: gg$\3ڬ6c"ADh r-̛7zMDDDD`i233IMMeь=,233X,xxy!'Η_~Iy'߿+Vу$ذasTՐn >\` ߼ t_OxwdKXAi=_7PUZE,Z )^_*bӼMfm++Ğ\1 {s5熘~ϐ!CԩW^y%;vp bp\gvl6ܿ.Ghlhߤ. $,,ǏSRR'-[lf3TVVk., b9vDNN:tE>|={PUUuzΝ;ٿ8Cs}B|(:Ztʣn3ecEGS~lfw h{s a%a4s|q))Zhn$ :+K*x UVxySU^n$c8F#'Nh_):ZT7Ulo@\\O?4ׯ^LjȩVlܠデ%,`_ߟS2d|I6mڤg M!k 4i^^^c_,"MZnn.ovc!""""-*"""""".AXDDDDDD\@eb0uT, ))) 4 6`jjjwAFF_|Eرc6l< n-x衇HMMw޹Fzɸqشi[oq_ݮŋSzG I[τ%҂hZh4Z[G&?O'k_CEaE몌nFڏhO;`t3Rtf}\aWnhߜ|]UO@TS9!܏ވ s'udzqdoo"gw/n~E)RXq釾tׅmo#kGFowtMLGS~wRNڿ4epТE ڵkv!#DΝiٲe#T_`0=<<;?>Z:e`pt ___СÅkw@Hܽ܉ @Ln|FmW>Oxxyn4ykz/n6Z5X<2=ѽy6  "s9+Sgz~|4Wdjbzt<}<%Ґ^o3_Oe410+J`nZ.5݁,(/lInn.^$l6}]}mСC?s8SZZJ^^AAAQYYyAknr,JֺeZ[-+YI~f>IzSW}4JVUZG^P_Z;{!}y:US?dm{퐶 z`y7qQ~p`ö;X*, k 5~\`Ԑ7`oooF-B`` f-[ukk 䣏>? nfNxx8999̞=ŋо}{MFrr2lذ?w#G䪫`0sQYYĉ&;;Yfq1ڴiäIعs' :ݻw믓K6mۛxZƎOvвOKbĒN {j0IJeI%mf${G)S8!csd,B!mYm|wd8> aIfxYp!q#H?Y۲8{#; F nva!s8v* *GLr ǶuDu"cu_YOUicj"DP||2d~D{WnoL`@RG=<6nz}:|8p9vSf͚1p@Y`/ Z{;!PUUQzKsvK7wC$MHZh%/#Nč#@>;Q]he{ֽrf72fq0zw*_#6fq8!+ FHJK 8H @YnY۳hL~&|J/h٧%ԟcd$G ޙ}6M$OI&~T<q#`,Q ,$ :7O7;3o#psw#cUaÈAڢ4<3Ƿ"@:́ǯp~"F2,_w?ޟ}c0ݛKEa &pCTW- Tp2$!mC0ȧFp8XA0M-"{49k5iÁHH\IH"D`1c~:87HUi' K$ &?^1 {d'O&VZQSUúaN{N0(;Л6PUZEٷlI욿 ]#);Qٮ?/Xf 4.V}Z;;?:f2${{XE(h֭-XEgZ-nWr*[uXm( fI lIf'dfY@ Cs|'3nTDQ`xoa˱I!}J:1()4<N 1 CߴNCƴ ?:&e/ލ[SÕEukZWsF'1EH΀pպpV9Jn aX~1 wܥQ0YMgߔOkZB 'X\E!++[owy^{8222`x:u*999|GhZRRRNc…(BQQš`z&yyy<4443ϐ%Ko~mFvv6/2nv;%%%9rI&VTTӧO `ۙ8q"-b„ Ŭ֭[ /@dd$/&11Nw΅JJJodȑ#^+]M=N4Z ɑMJh[%_>%C+\kp=e4W5SWIlF,o+ cm!磜oz`HN%qX"ڣDD1ۛCWf+~pRǥ忶hkɘAmA-]EcE#}'Ru Z}|s''v`ʯPU)W (L$Dc43g ^G컳|` ncNJh[WSQ)&z+**q8?>I_e`{3=s"pL5NìggiH(|-#O48W'giN(_-x #2Qw ^=F9cޯ?~ٓvr`I`61-wUBg{Lo""/?kVb;{TJwR_Ry:qhkHi/]ɘM5<.{'鏛qAW94INms͓ZՏl7=(1-AK3IDma-]G}qY98fU)!qX" C|[B;Kٰh3w (n^퀍y/;F!D,.K&himm;$/!!xϘ1cB{^z=k֬aԨQ<<رŋS]]Mjj*63TU 6pa^/7pCVmf˪U(++#,,f|aq\>|sϋ3LXVhhh `٨#11͆f8f3> iJaaa=VAb6AlXz:Co8N6)G$qն(DDkQsMQN7gC,4:Mz**;/Uzhq@z ht3AasC5\`yj]_q hkrGـRnb4}2ޤ__zS1}E:>ZC(w1ǏSQU5KIp~ǩ:ǂ7o|COU碩28LQg>VvF}ə8[=gr+<6?:Ju^EQ0DI NXx}7(j{gKP:u.(9\.V.XI}i=kx[177On}uѩ4q;shHN/n>^M2OO 9gN`I ~_Z} F|t+dZq۲6{%l^NwB%X\E V4 ')) ǃe͚5,_O vЀ$++9spUWLFFTVVz~|^TTI @UU4M륵0tGh4b0p\6NmK%BlXll69(?>=<TUbϵ3a4W5JW%g/8=茺`ܷZ|Z}yg'v9@ myJs~|>taPΨCuy9{} pZ5hZ<.m"131TWcE#_3hZ,Iz+Zx^\.Ve-@^^Ճ?|EkІBFAom?'50Zdžq6oIԶ}Q^/Զ=4QVUGEkS+_KruK?'aգ.;F!D}68b0L4ɓ'b68q`С|>JJJcXV͛ٳ`…lڴ Պ(l޼hnRSSbҤIǟo‰dbdddqUΝKZZ+WUUihhbлwo1cF(Пnrr2p88pYYYdffb4:u*_/Xf_W,\C_oCq}w8"zEP9vģUK1ǚINEg±LjL>n) })DDRϔ)Ydǒ!@ʨbchl&aXB縌83hPn#ѽ$Zts$ O"ixp~Saqz)DdRǧuKǦK%yD2O u|*F 8{~YGi>ZM |>iIO)DF5H@xtawǒh9sSp'5hIL(WIj%yD2NP֦V5NRF22컳uPKѵ"7EۊJ- .41킶xuĤ>2Ȱ4%131t_~4;9eX$`0(Sqw#O4aQaؗ^׺5|WKLǫu|-> /?O{4Z ̘ch4lu;;ډޤ~/;F!D`qYRU{R\\BC~:=ofy֭?gȐ!Lv >zj*++yw{kC{q8N]gO?͡CX`\GG oڵޮ;wr-K/P[[C=I3gdڴi |,Y/(\.򗿰e˖Ђ`+!!3f`ZYjU:VCl Qÿzn>?F<j=eW-\pZ( 㦗nټx3lvf<1#t]կ ;g3] 炞K@ P7gf . f?xCҶWQU"c>O|r]<}g}/Ԋ퀍P(+xG1g c^'l9==qff~FV"y  ǹWWq݌㧩 Ns۩~pQ}*?>HxkCp|󮥾g== 8LZ)Lc3k"?'W>;zO4dߓM-zd;Eۊ{@ =c{0 hZZvuc$ Ox{qhGK?Z%¤_Nb/'+5\#(.PUUU^/N~iYLqf3:,&&ѣGSYYIaa!)))8Nv;IVVVÇSXXXVIJJ\JJJBaTлwo233q\QSS^'--F***NZQzEbb"t:)))!335kְqFjjjl LIIaĉ466:`0dc٨ ڿRSS UJbb"466b0HKKk>g?~<lٲyAj"*% 6cEWqy$X kIj|94V42Ǚ1ǚi8.}JŤŐ04W4Y,{Z|ԕu8|}*aǏb$*%f<.4+-3Jp|Dj ksz$e&k̫ sa4b UciXەx[oޯvջhnFQ{GiB?Z! XZ/HU'ǏNj48'9ed :D&GiS?OQhr~|C(XS@Ci-FHАpEla x]"mN#I4iq5hIAG1uI4WFdR$MM47ILTj~!ĥfz fz}h$Xr QFh"x -[vsMlXTф=ǎ% kql˶ !+!$!@SSvjwQ-!Dh7:=A "wy.z_~BH yꩧ !zCުsB!D =B!B!z B!B!z ӥl2o΋/QYM!Bѵ$Np8?5k;v,btwYB!BFptR>3L& .K!BH2޽{s !B!D#XtLdd$UUU|.G!Bhejjj8z(gFӱo>v؁҄B!=.1̝;Yf뻻,!B!D!=$%%1oSVVM !B!dEs8,_呗E !B!z",B!G,B!G,Tbb"O<6mbdggwwIB!BB.c0я~ٳٲe 999B!H]FC~~>/"]B!!Тx<%..B!B0E b4rB!= N0|pƏ̙3B!B0,:(3瓚ʆ B!=`~?ߘ1c.?O6lXw%B!a$.Hws5B!BF2:4N'555]B!,N#&&ǃrB!=`eZZZسg}aҥl޼.K!BC6H˨ʕ+!33М`!B!lERU"!B!D#CB!BB!B2Z\Ң{b׮]L>[b |>SOLz @g>c{)WFDlD (uzii}1wN:wkv1YM7Ge9=gnAg\ (ϸ>8Z֋r!B!FK||<3WOxP2:@Q^;U|s htz Eu :(O蠀 ,*)(!~pg!Bq1Iu /ŋILL$==9se-Zš(@x7INNfƌ~X, B}}=>uuuFƎKBBgPPPС0Cnk2`K"zO[-l^7Ggqw<:}kUb|9ceOF0 hZllΣ-%B!ą,.knիWp80|>z=[oHDDV[[ѣ*}s=:rصkE}ZA &ЊC4-էRv g348(^=׎S8=hta6q}68DmY =z6/LJ ؕB!^eKQ@IшBZZ%%%mzCt9r8N<]hmn'>tgk Vqfc豀 @|_hTJ @g7 ;PW]S`I"6埿$wy.YdLyV.XIe^Ej !B!υ"%&PUUE `Ɍ;~dt:M?nm۶Btt4h4&Oj=Eaȑ\wugN$bcP4 QGLZ 2t":|=EQ0F:{(f | hmne"&=۲x4 Fa3w ng[;ћEs|~OUU> ~Ǐg缯Nc;nET $ O/JXjkp8c4wMv0 xծv܊=?կ(w``0ɡ|Q@h4 Ƙ1c2d6l`߱!B!h UUUt:V^Ձ mfN%tj%11r1 t:L&ƌCKK $**(hB3tPKII EL8\?~a{+9LÉӶF4D4PڀW1Z\ԗIkc+(hoĒhqzJYd5a04{?Q&<[-$M&, =~G&k@/n/UG:R۱ƽˬYX`>B!/ZOS1.=)Xr ʢh=zt(OB!_ B\2"##Yl֭+B!.: BKlܸB!W0YZ!B!D X!B!D C%-**{w(vٺu++V97..瓟zz=~;\s -رc}'`Ϟ=,Y_Fa„ G?bΝՋ8^{5N8qQj(E^u0a:^\{C$ZCɱf|~OvRTB!W@ @߾}8p aaa33n-d4"--*^l6(_\_˗~qEQB] @ѣw :\|) G3:#`:UDQIB!ĕ@z%RSS` A}}ۉ^/o6oEnqq1s̹h 8!&&ZZZ.=:^ (63cd* nxEg)VxU]^B!rH4GUU֞Ù={6?OZL& ~M7݄jtw^KRR^Aq}MUU[n#0|JKK1 |GQ?wIxx8vW_}2222뮻%%%3gr!^y 99p Bdd$nj̙È#]o_ϝwIrr2^#77ѣGs뭷gFEff&˖->rڲZbcc`=C||k;$''͛7cZhZ t:ׯl6͆ hlld̘1tMp1 @tt4yyy޽#Gb0qDf͚E]]\}ոn֮]{"##xg8v?8Gh4rM7qСZo7i&&LExLjaԩ̜9Fuu5?.>P͛OkxMFll,+V8g( ?.Kȉ: >C|X=QǨT6PB!W Ⲥ( YYYz뭼;kőԩSᣏ>BՒɓٸq#x^mƍ)++CUU ӦMC#w6\ƓO>Nc…(BQQš`z&yyy<4443ϐ%Ko~mFvv6/2nv;%%%9rI&VTTӧO `ۙ8q"-b„ Ŭ֭[ /@dd$/&11Nw΅JJJodȑ#~oj46eg NsB! eIфmھ};m'$$O39^^Ϛ5k5j<<;v`TWWf쌽a>njzYjeeeLXX> iJaaa=Uym3sN*@VB!O,) h4ORR˚5kX|9~@ Ã>HVVs᪫g "##/**~QWW$*=^Veш`r9:(޶HQ"ðN_Y!B"2Ⲥ*6 ̤I f'Np磤8Əje޼y̞= .\ȦMZ(͛&55(&MD||9:4M&&##M($$$0w\Xr%JCC޽{Ȍ3Bu$66"33ԩSX,߿Aml6կ~… ;&jbiIKd>"J#B!߅˒ݻbϟ p8xyx7C[n9C a}>oTVVr=p׆p8:T_tt4O?4b@paG}G}4tk׆zw-K/@mm-=v=tݙ3g2m4^x>c,Yl_FQ\._زeKhA󕐐3ZZ꜋`KF7>NI<0{$-?s_GYqcv?[wzB!Dϣ`UUUz8N~fIͥl攱]B0zh*++),,$%%ӉnGUU"##jra QUJvv6IIIՑKIII(j4zMff&.[#G'{Vi|v4?~}u|~&!!&4:Xyh4 ̻fc{0f7S&VIX^x9tn9c}3?Fx6=701[Z۫`-k2ZrP3ޫ',LSSUUUB!Evp`JN*Z7vRCtZde=?o|@) :jfCp (}SQz$ƀ&&fԣhA=f4>5V;8~c2߯sv!7ϞAgOv9,L vCXX3B!BtvoG9n"-f&s+VoO'+s IHHALLNRb/Ps>)K=wߊV!ixq| J󛉍f򄑬߸iUR}w&2+  &ϸɤM&6Hӥl2֯_ϔ)Sؽ{7B!٧٧`)[}{KGؠ [ZpJo՛xc2r8R$r`g~8Mm[Z),.VIS}Ou2-;pf'[ -f'l޲ 5{t>5+B9&֮FUkt`Çs1X! p{jԆGa 3P[[h xW=/@Fb,""hZZ=l*25| K䵀:{V(*.é# Nh|] UzzY;zÆf`[`!B!Esr? Mu[ػ/>4tw?m'tj]'s"Ur[em= Wl@UUE ʪZ/!i1֛`6$${+q[0im|3Y!E tfzq:K+/͒.K)cO{,&&QFz}zwSeÆt=nt:Kz\_!Bqv,Nōo7΢o>8gu|_^_!B>JNN_ ǷϡF^χ,eML]wEq1>]{g :ǒw0Kzq1 jd~6't:j__gFSb4YF6l ٶu;7pͺ/7oe1zHn-[޽Wg_o [˨eذ!&6^.vA2bd?mpD&'Nqhm`4ڭԿinvRS]ÓO?B!BtvzK?O{uyyGxYSB!'=]3m`xwOb 3g_GC `88]5&Ox'ٴK Ji F;foݡlO?%9 &3zH^/~:7t~#~Jfk6vE3<= ϗVOJ gg'؝Y2dاA}oNPI//OFKHSRClCժ.v8B`Qʹ3=l$B!Bkz}s=k֬aӦM \dd$K.eӦM=ԵB!B^;!כoI@@qqqX, kwƌL&:ut_]pzss7ezU6lH:u*?^ԩSh4jTBFFL8Ʉbax{{ɓCRѿ ӧOB!(JӸqc6oLbb"oe֭xxxzj;8-[J*޽}i&TV/}}J>,;v 11}1etBBBwf8p˗V>}:''',X|h,}N2w< Obb" |۷={5֏?֭[svA׮]Kʚ5kׯ_d2K;z(K,!,,(Zh@VV[&""{oor+B!DEXT9sPF 8}hڴ)`'W[&00~hW999tؑ'OO?0p@>CڶmKVVAAAM`` ر%7o.=߃h4Mvv6=zPIKKcϞ=wؙ3g۷/999ԨQĹ+W_|q{C [n[\BB)))h4^{ W!B9RxyyجY0 xxxp-\nn.:N9Dnn.Vq #YYYq;;;6\7''K%.\PT_SܮV[ժU+qxܺuD,.+bW\l߹s'ܹP^111 2< ;.]R|$&&*ãB!I,*Ş={X,Ԯ]>4QtЁXt)4nڵkYjRQ^^^9ON\\m۶Ņxj֬I6m(,,d޽xzzEHHZRb68;;3w\ԩC͚5y4hP٠A  ]1bɼ;ٳIJJ'`׮]%VTWݺuQF4oggg4 aaaݻӬY3LDDDhdȐ!_;we"##UG>CVJhh(={dСJũSէB!M@JIll,)))jՊ(vĈ?MҾ}{Ҙ:u*~ʶi -**aÆ4jԈl?֭[YbftJbƍ@߾} l[*(C۶mKZx"wώ;ҩS'{x ƍu/_.oYoUF ^GR)CVYHMM-Ӵ 7_T#""B!o'sşΛoI@@qqqwA͘1DN\pzsϟ'== ^ϫ2,6zhXdIiiiddd\} !BN`Qi7n̬Y0XVrss1Lg}FBB>,FɉBmɓҥ oL&9u @V3m4 vvv,X"NիWzwg`Zy5jzk׮aJVVt:]ùp̝;&MhHOOg„ ;vL{РAtܙ3grȑr=w}pt:yyy[>2j,_"quu%??ӧeL=;w.… !88{*zѣqppBkӧ?~AyէVwߥM6{h"V^oAJŦM9sfi֬+[xM2Ν;R87n RY|9hZHIIgϞB!(?-*͜9sQiii?'''>}'; IDAT:>>>䐚hd…ّNӓWRfM @Ϟ=qpp ((VZ)I?&MBGvv6 >\3NGAA~~~DǎQh4 xxΜ9NCrE j$''F̵k0L2X7oαcػw/,Z!CÈ#LZh Xl:^xdddPXX=$%%@lllgZjUxy7qppܹsdeea0Y&`%33UVJfͨ]vWY}CBq ŋhZjԨQrssjB!(?IEhѢ\vgy}vZΞ=hOERRZ:yfV\I>}hڴ)]tĉnݚ@~mϧ^zбcGN}:qqqmY&mڴ{ ؆ЪU+%f٬̽S5k駟.1Nʊ/$>>X|||(**bťߴizN}ѭ[7 ED@@2 22SNJ`` OE^~ezͧ~ʗ_~ɚ5kJ*)!BqdƒBVNInGiڴ)۷'--S`mn6m[峨 ҨQ#9~8[neŊfbbbҥ *7#`^ض0*^_$VZ\xQMY+^(jǎ%IU1z=)ç ƩShݺ5 LJSNxh L/_N^^=ZYwX~~>O>$yyyL: 1ԩ25 ݻNPP]t I畛3}Z7>~xUjYfzu>njquu%**֯_Ϻuٳ'* NG~]v`̘1T*O^{VK\/W_}``۶mdggxB!SYo/)Ułl&77v2SX`WjUT*U9 dddw^^^\r[yzz$yj1TH<^^^̚5 k0زe z>}ٟVӓK.񼃃R.ڵks×Zf2x`;V=yzz^ :==y_???xR缽/i FBB#G@Szuf3իWe~f>B!~/YtR (ի߯^Jdd$`[Չcccc,vxΝK۶ms;w^c#ۺu2O_|g>䨄B!*֣`!*ڵk1LBMūm؆ PPPݻJ?Ӏm֭[Jd ڵ… Y !BIX"`!B!į= `YK!B!cA`!*^I&; !B!]`Q&MD.]XlK.5!!!qTTXQQQW0a>,;wjwb4yҥK|>|N:ѫW߸q#j{9z۷oO?UV[.&Mz=zSVA`ĈT^#Gh"%fȘ1chذ!iii,Y7AߟMƾ}xꩧѣG~7|lsذa4kLj2m41bD/@Ν˙3gڦ''O.qgѢE%͘1ooobcc˽Ze˖xzzF KEVVZ77Rm]| B!FJw%nܸ'^^^fƌL&:uTс3۷oAqر{qyKl-t/˖-FdeeLPP;w&++;X"HJJgܩS~WL21=p&Ndb0p@yשZ*k֬ARXXHn!::ZŋZܼyH}nz-Ƞe˖Ӯ]r%b3fF?QXX{ʕr%ݻwzJ'xdNbhh4wL$aÆRTTDQQ`<ޞGDDбcGIX`%kZ0ydlL˖-X,JwQ^~{+BG'CEiѢ_5JkӦ ;v ,>h4*׾$$$ݻӧOCCCYf +Wlذ3sLϟFa֬Y۷M61i$w}GXp!#GŅr?~)111tؑǏViӦM׬Y>mYo|d"22RYLc߾}ʞ ۷^@>}سgdzo>xrQ,YBXXQQQ5 V˚5khݺ5)))ԯ_ƍcXXl;w&""|ݕU FHH=z ##V`({ۣGMVq㈈ 44TI2x>?EEE,YX” %44'NPTT$ ի (CX|9%Uռ[\~\ /#Fɓ'صk=ʳzjǓ믿Nff&..._!L`Qiϟnӳ9___, 7of߾}DǎQh4 #GҳgO_ζmj?^9~+厵6zhƏO<ҥK9z(ΝCVMTT7n@R)J{/7nɓӸqcV+vlk^z%ƍGBB 4(Wݺuu֡jyg8s :wwwӱX,t:t:Zqa0qqqAӑO^^]dѢEX,ƌ'Wy,X,:uꄽ=*mFKjo.{P7npMzlѣ%^Sjh6l3g,Q矱X,hZ6mz*!CaĈʱ 2m۶/*ccc1 ̛7جY3z=۷ĉE`Z[. PX,1撙 gB!XTva08y$:t`ݺu%ܹÇ̝ "++ &00@v@dd$`y:uP*+W$33/.4f,Xba\z%GCu۟7oׯ\\\Du 6k.FΝ;j 8 |I,2_o߾pc .l_FÁ۷/1`{NJ 2nݺGll,``(NZB!,$t,YBDDgΜQ*i*ZP#''sw7(ٹs'K.-tǸqؽ{7qqqY,ehѣDPJ Y~R[b4n8ݫ .?JޞMO쬼xZo;;; ݏ B^^ PM_r-[O7kLI&N|Q,//Ç}vT*O=}U[n-uʕ+ywؿ޽{\e˖)p 9r$_}k֬d2)# ׯJϏдi;]qx}VV:NzV+GEV+X-,,TB!ED2daaaL2:Uj5XV߯$jk͍ f3̝;:uPfM~i:Dǎquuoߟ-[k.9؆^7k֌Е%00͋=z2L`TV JŬYv3gl>FЯ_?={2\7::#GW_}n:VJ^^jb,] 2dZhS~=֭KLL o6Yj5jgРAdgg̙3y'[|ڵL8˵SHeX?ȇ~HժU >CKloooL&ÃŋhHIIѣGٸq#7o$11vXFmڵ2/Xq"}(VgΜ9X,RRR_Rzggg֭KffWϱ',,W_}72d'NN:zenBBQQQѵkWڵk\.))Wb4ٲe _|aڷoJbŊl޼Y'NTM:ƍ駟B!s ,_""##nڵPcҾ}{L&UVUm۶VZ\xL&MĞ={QC !(( e1"%E_jmLL zJEիTPP]tmI닓WR իWlT*R &00^z OOO.]Ĝ9szڵS*/"M6FrW_}J"""BEGGcX!!!VKrrr;DجY3emej5M6b(ã2 \XXHƍ`0m6e8::ҿeh}K`MժUzW.Hׯ:ݻwFGGRܺڵk%תU ??? %+(_nݚ{Æ F^yˣ]vzt:AAA|Chy;v{΢EP՜;wZ7QQQܸqJEjոr ZJRRV˹sgҤIhZ&22Çp9Z-NJ*4i҄ӬY3{rcZZZwww.\V 3gΠj\xBZ-?hpuu-onTRZ;?Сϟq˗1t:&N͛7X,rEZ-5jrߧB!IE@R1~xټy3FҾ}{V+F xb^ Q$88/ Z$''VO ??zꑓ@ǎ=z4V3 .T{)**^_'|ؒaggg%YZFb`2عs'QQQ(U?X||/]|`gLB!B< $wÃC駟a&tj5&cǎD6mZ 0jժR5kǏ/ܹshРɜ9s8\\\8y$4jԈvڡV=]ۛ¢S!B!Ľ=_2HKMʕT%MUk0צO1ͼ3]va;#f̥ :˖Oɤ~F6mBo/;WwoaOv-Nܼ/dpJ*3g!/7VAرKV}F=?vvvSd)BVݯȥ;vѢep t$#nn88埕~I9hJřȸ'پ[-'amC(U*B!Gj팿 (%[Ñ3v><^:_n7O>AYYY`=YwVnҟFbooΝ{Xl%sf#=: 6joY?ǽNo oS!B!D JUꐃid\`_bggǖqm#]ۛz/6)o @0څq00O֯ǪiP{;3ذ~`[pk*/?U*aL<Ķ-?T˃@q !B!6}*IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/separate-openapi-schemas/image03.png000066400000000000000000002462631461403617600270420ustar00rootroot00000000000000PNG  IHDR8ưasRGB IDATxwxTUw2@weA&u?ˮ{U7JGB]:!=!'S~ fRy{Ûs9fg9 `G <@x0# `G <@x0# `G <@x0# `G <@x0# `G <@x0# `G <@x0#N-;kfHVePpPZEsǶ۫)-s͞**Of~^|[(&:D^16vl6[ålܲSQ~Aacw!4$XF > -s8 5V:Ϳ h8#̞TkminTk^?fD/wmHy4kq.Fcwp;hz5hu{6_Iڐ{cwp;h6nY2שݐ ٬6Z7O>>>/ޚu[]tm韻 #ǩ} oDϙY?m#2bJeQia:!#:UQEvd|5_|bUa-VgL>@'f:7~L@h4iiUƏ>Lr򫽦yt3uUXzGbE.$b mǞj փ\_nί[J̓.ީOoC%?or:QisK{Iyͦ cIK$IeSڞeb0u<ņ!J+Xt>įn?g_ Fg(11^ܩ륭3IEEmp?:".F[s[ھ`w<oo4R(yjci:O^qo`LPIEUnRG.襮۫MZ+I7];U~~TyEuٔڳ/Qn/(-;ݎoKe=v߬J-XjG]5n8G}HGN&kA}7xWUpEvU|p P I:Iݧ`Rieo`Wd8ՏUG`v쐶(0F KoO^y13_u&YA>s{vӻo>S綶lS>I#..d&O#ou~uefe;jOT=j!dT^QWDa)((@as?o53E+**.!ɨ!j55]ޛ=c$Ij .5Km#ƨMhQ~AIV'I2c Ql $HE^t0T ^yD+2е_m"F`ZW{˔dP!.SGWȋk wXNn{]N~_^[w(=#K1ͣN'*5-CozzaDJjfcۿt\XXKWXgUI'Ǔ0_TV~Y*Ѩ`fEfEBC-JhScC8>?KI2(&x}p o2H.U#s(x{Qsԥl:PeJKo$=8HF/;χ򖺼,I6E|ls=3И leBuf]=qob= gNqm7ծMכDPVNA~J}$YmJ-Xm_HL^~lO՜?oRrJUX¸Am"F^kSJHZ٠ɍwA-[?γɼߖZ`bOTvO>ݻuR]ʊK[wfZ: ?oIWj\ȢZGViX :/"&Q#I**.u{M A-J_;-W썎ωdtj6Y}sh`sxÆ+>l Kz겞3B̓\GT\ MROkIK 7\{;'jJ >gٔ/?W鐑yX7mSEKVR;|M4CI)z_+)9N91eV6$Dp6)9MQ"RvmR!ѡ4IhTxX Ӣk~7E\N8p, |+%$ {G_;$J[Cc $vkP\` Fuj6Y[#ɦ̢,ڬJ)XQSݾ!r}JB2Vɲ*e4;Rޑj1V6Y3[&&[ iMFmhテؘ٣.u:oSoآ_ft01QؘhUƍVm]]AՆKWi>JVDDXXw5w"tÕ*ݺKgWwr+*d4eG¦ZNȋVT,Z^?tא$U&>2[tnG%!]E yL{6}-d̜֩+l$>Kvd|am1XwXb{>R|j_kL]]WYK[jngfe+3+[ЗNp3ֻky5ݖjD۟=gQpѩ ۟zIki]bk!j5Yھ}zrM}֥={r}{uբk.*.тE4zbpw\uogk[>>޲I3ʪXBCn$I=bՊO9oNHAq1 ^jY6u9$uHIRZA칲*eV߸۵9ufVc:W> >D$>үZ~Ikӆ?{:E]r_w!~ MYS2tss&?_Z"#Ε遇v;ͷ:CzNo~ ط?i#Ӑs`IZhi ^^QEFg.?도MjۦJK˔8O\zf^٥>v:>^xO-be6/^|޵l3Ū4/嶼>Abў}N>%kCzU;[G̵.r͢mID)ݳDdԎot g~>$..[%~-bMN~㝏_Tw޺o93n;JmZTvvvG[Rgv"͝إ^ntWyf/ko\G^,CWI҄񣕞|SG?Tլ[ƹ_jjlHu^AcFϿ:zjrN.Hdp{MvcFH֬Romַz9Y ;!IڐR.3MI iJMH Eٳmg??\\_wٯrǴմs>O>Ʃ^Rr2K$%' ]si5or]G_0ܱ񰡃\d9>rIiRS3Os^׵lQǎ3Bq5BC5jZG~wa73Y_+ߌjrTaC4rFaa#Jr?י;wn.++Sba5 ܷwwy nu;E&ӿͨqyԦo۫6n٩]{(%5SEEZkYժyyqܱ cV=bնϵ7{ ׫9._>Bۦu:vhTf2ﯘ(4RLL:wj2 MI b5}{Kٽ*+z]|}uϝ7hQ;/Xv%fw?CC}zsoʄSXs/>Vz\6n44I~N=woK݀ݽg8s}ߗ (u{9bTMnfYXc,K&]=jʄjo=5rĹNeQ"k$HRӴ\8BjF |ENp;-7]qu?t[>_UV^.I2zz}ԓ?4MͺlCd٪|q& <7/_[s;pk\geמ U[Ǿիx܅uU;<~}w׍ Ty۵5vd9 _}zuU"Ի 69>uiK)^2lU]8={(9%Mf5oL];wTO2PRF=(GGGyt"թS; {l6(++[%e6竸;~\cUP0# `G <@x0# s_uv)lU4B'X7^Tw oTLt nNF< ˭_;RlZ{.װZXdrf#I|P4(R麏RuQ \(U'H7&IuS][2ZExq֛ sTTnՁÕ(0MP/MO(ЈN rzꂮ 3rbO,6ih{=tQ G|m 5)>[.SFYifʩTdI/]Fye o;>GOY6EW/VFYEJP٦F۠WgKl-Fḱ2E;)RTZiե5GQ&}of-by.eK[z)-Ϭ>Gی*&7 2:z)lfxџjbR:M6YKI*(_k?%Vǻ%I!F WXˠZK(midW|IѴ#\F/{jSɠEUyzM6־#{2{EujP<-D;Hm/IxEVm+$ n'I2[lH%V}*_F/ujKr**ъ{(R",A:xRyf-Q֑+<6{SY[ȏK+ϨrMv TJYH~PPcDаtbfV##>F&  ˦BlBd2C wIY+ѠGGd4 u I)/_]} eCxg&,I_ J/XkVf J@?/7ЁjmT٦N1>K~IڛQͼe2WbK`?/=<6Rf_w._& _ U٦} 4*6g yfYՉ) IDAT! Il<`TX9Ť$mV{P=͏u=} u on7呅|Muu[7.̤%th؝-|U@+#_-@`ԓiP[+@}jS8،@x0# `G <@x0# `G <@x0# `G <@x0# `G <@x0# `G <@x0# `G <@x0# `G <@x0# `G <L݁Sq()E/^8}0l{۟ [L=Qu%m~Rѧǝ;?|=ċNe>n۩Ͼq2VMG#Gjɒ%Ϟ|6-f:3F_0k3+jM.LI&QtmPrJSosj@^z%IYzŷq66[oW_qcG9DϿ7Q^[?8~t}9ԩԻgjiŋd=StX,z᧵~Vs6hu†jݽgqX󔖞xPw[T% ]wն^zG2i$f9W:弎?vf6II*+5^s~?|ǯ#Gzdnsm.Z6j7?p ];wp:^AOJ4l` ?o9b.IZtS~`o{}+?? :={tѰBX\o?1\^h#Vi#Iu*.)Տ?q9_em߱q.4*;Nڶrڔt㒒R_+=nl.6}7Zv@OJRo|lg&;t|ܨ$wQ"{~]QzvRkt=t*ۧ3@ݺv7?ڎ*9y^9Z:ٮNkn=Ymڴ?:/tVMql2k=_tǿu~~gdd98TNmB횄ڼuk۶w:~Z,74/;~mڼJJq:ؿs-_tj7 EKV9}Ojw]K;pj#&n*ǎc}v!*I17-_F} NFGEGε'6&OUaa&&ko]ZS;urޚhuMf:w2||^kw뤿]uZ=vldG%i1.{۟ǎGO>vSYn^-YTSۻ־tI,W@?2bXiB5u8J=:LL칿+)&}|[j._Ss4l mG_u(3\C??2ΩJ@z?t}wߨ)ƺaߗ+=zS/o w\ ck,Vv:_CVlLڴWHpPa6[{~edd)6:vh#cђ$ժCI)*)-STo3'7Oť6)22B>>h9c0IO `G <@x0# `G <`jcmC =w``l zGS@KRՠ3Y R`eZg? /// ®blbbju}BFFL&FӭAbQEEI 3K1yVn]6ahl @WMy '6[Vn֥J3vto𒏏cJ`jl6kA=mPw4&ɂ-HM!%2Lj ..|3Kh@3۫Gn}pi|MREP,K 83bqMR/Fv&ԁ~i84pM~aCQnVwk/]h2L^=8s@Lf@Lt"<$MX=o 2-гc6[3/jy1aHM3Q/> ( l!uif %۴TyLƋ چW4olٜ.UOOŢ7M*+-UhhXW'^P.\޽ԦM+4TOe+Ǫ5 >k&WjjSYhh覨fEE*>:vlrn Q&˖8>Ϝ{tj<2lh9M&M[oSBlbgiPKCƦU^_kӚvzgsyLs>>n_wW^qZzl6~IcOKi͚uj:^dZg^I/}{iڶu}z*ΜX+-ы>uƇ` d0H*j9me2趁ϵpdY$dIy.mek$y 9%[%IERS 'O{X%.#UKNl2jujoZ%&,oool٦ճWЮN<^'8.((W^ٳ{|72 cyw}ঝN;IdIwXI}yzttdF~J"IRTAO$}TkGЄߴ޳{vSmڶVݝڵ[}+s/b=qfiڿ$)))Y+W!IQmu-fΘ D5kskv4B͙=O2Wqf]8zҵ}xD2SV U``$q,a{Kh,% wnc`hYYdrjy纜9rv>J+r9\'wL/i=I:w訷6a֬zUl(%%U ,mߤ5'~L}{+//_-[jɒX,ڸa$GdRtՕڟ05o}v:t(ImyBȚzd6.b$i uQ7_ UVVV)ɩjӶJKKup#u˭7j#dD8mݢNj UqX6It_m$clۆY핎XN˱I=}=fϚ+Iyii^-Gyy}j=tOR:vђکW=b0ۻ_+Ҋ޽{jy͙=O5uѷoo=胒[*mۺ]/VJr.]ظZg:*U!g (᧚j,R|}S#EJ(}ת/p I))[ճWeef9 кǯͷ|OW^e_sj۶ڷwHԸǪUL^|5rG>7yiɒӝwݪgyQwv\X{QFMB`I$IT0dӦ #q,33˗jjj*Tx‡`$Ic& ̠q&t9+y]KJJ Əc>}]t1't&X$IlVZ `=^<3K$I:CS ǷOffX$I<|b:?7$Ic& NL*$I$),%I$Ia!<ide  IDATeGEEQz (UI$I++We߾}]_\YJK}عk7PhԮїo{Ȳv9EAU%=v2ujנgI$ϱ~æî\tAϿy xWhղ)>ٗ={C(T t_j7ѥS;\|@v/_w2iw|5b4}1+c6lW#F鴶`I$/ziڵ㧐JY5W}TR.9ʕHJN9x=5|/8MOi@j'yv%{Xh)M7[h$ls/I iؠþx5 eА/NHazi݌n];gHOϠGΌ3[ӭkG:wlKgҸ!z=B4!իQrEuH3g mhW@ZZ>&m>NiҐҥKf'NcҔ,_4-ҩݱH$Irz٭s>e* DD}N^.))< q +k`>SY*j֨J.׹DDD0e|XNiܐ+/~¢˸sX~#? 4wݎ]>X ~yb gzo2۱ }RҘ=g>cǟ|} @L|GbEiӪӦ`欹~~w ?T ۦ(,\w+D~^TJgKࡇa}Ǝ¼2[xwlL4 ShZ4orϴ$ItپcWo:o豓ҩ|פr՗]=g> `_zzoxq>ȐCWZUٵ+[~[`/=g>wnM[ؾ}'lcd|w衟Ký<ǟ| 9=`$vIŇ >k׮Fԩ]WR!(?|\\s|:-jșF_,:W^́Ѡ836>;sjw:-o4 - B F~5jU+}N&Ou1|W_ًȝS۴`]J$IRVxɾts擜/+V3XU~lRxxi g!)[tmvJ>wCsM 6~m7У{n|`X~\۷kE](R0OLVVv}DYäI {\v>Yء ˗QÓXj-ڶbxZ4o̠!B /`e<|#;!r}J\*^J;TMɴ3y;8i=$IRRRݻufCa\֮˹DcSH_Cd(;DCJJjh  ^] ʃ͝wR!>GrJjٱsgཷ_B|9nT_UYj-;.$9%f\?| 9?*-{EKٺmU*W>dWDGG3tlڼδ3v$Itr_ڱC|0qJrG*UrVZKXjmhRxrBM[IOOA,ׯwpiV>Y?U=EvxCS{uf.{s|m;"֬]OfҩQ94ds&%⊳;!z3jD$E"c#::c&;! кu3vt?T$I.V)QQ@N}߻\35THf=g>ԇZnۤqCjTLrt˽gQfxsZ6D ~0֩IѨAsZ_ttA2 Ɣs9fr.oDDvK'%%Ff4jP@P!|7.3OZ`q(yh݁@'ao0 -^Z\vy}%I|[;^pYtINm/doR!x'u =h/(X0*]ء 1,eUhF~_ x$;;  3࢘a%$!33ҥJ}c]TP{RRRٸi %KQd\벃AKDDDۢ`[)X0iVMD܁N$I:ֲIOO?~x_OSFUҟ$)Zao;!mvPL)J;d}ZZI)*YWsHFf&IIPB? =O82㨽?O-Z#o ),?Pt4+Bll kUuΈ@t?AO$I W/6&LzOm'X$I1zL?|JIIaq?;7$ItEDDвe+V^?1Oy]~Cdd$-[:&=N#$ItB||<.ZjCIZu%؟4I$IL  ""(*THzE0_  **("""Nk $I*Ivv8tˊN `I$IypC~,I$)ǀ dŮ"|.@y]$I$Y'm$I$I $I`$I$yA$I$9#fYI$IRdc:"ؼ+ %I$Ia&E uupD$"1J$IRx  ""@D9i_I$I O9>MB{1$I$1H$I`$I$$I$),%I$Ia,I$I `I$IRX0K$I‚X$I $I`$I$$I$),%I$Ia,I$I &YM6<%%5גUI$I"gggsۭwq z՚\nĄ<.|L2=ː$IB{72 'O2$I$Iwq9r ={ܹ `y.K^,Xm'OKRG#-5nݻrE7ߌ~`u4ir2gt'7駞y,_6Sf |շ8k6Kɍbމ #3sI );v}\PС_~z4ϥzj|23fΜ! ͈Q?dNiڄEkny.|FK͚9ܞ|3b$'M%++-quW}4>>I$I:p:xܹ}[[os;φ7loG3둜yf7hƇ #6;z?T憿]Ǟ{yW`eR?&Mɍ>͢^k*  ؝sywirJc"""xWyQv-ZlΗ_|~`O?ϾpŕaӦ͜tR]*TLҴi O|oK8sqlYYYdhblܰj03z\z;u`I |$I$XW#^֋ '֛yM;v}V* j=p75kV !!/}9$99^_5^ @ʕaԫWҥKv~DGGDʕB/\nݻWmڴg@VV'Me͚9}BUy\quL8+ʕ*iۓApp߮Nuǽ,y4TQNO#PFuvN8"$I$k.p7cτFJXz 111TV%yqFL6 y .y `? w!4eH"6NΘ1ذ~#ͧi&U&Ŋ/P%K %%l/^JU} ~CaMlټ%;coڴ);tlO ‹~oqsjִhٜ6s$I$Iǻ|5mZѲU ^{ SRB˓)St(dg@OEr YY|7n={j7̟Դt?Yݙ6;ƏȶmPzh}TlܰwPbjש/fܟXv/܏JF(X0s1`GlXTvI $INH*<z2a$֭[@[|ԮS[naɒ\{hT2.b^x.4R  |ЁBm5kv M5G }5Wч4p[uH\z!6m]|Ʌh -3nA>?wsO>,h},Y[W^ Ͽ7@U{$I$xIvv6$''s=;E9(WRK0dg7wM)Rhkz! 6PRhVV *Uo߾ܿ={P̡;vdݔ/H}AbccbӦۗN}|+VD\qВ$I3:vSpaB}GSbbb]'B.,@jUC (Lҹ-VOJ.E҇^ 9z*Uێ,z$I$5GBB~`I$I҉#,G??;ː$I$K$I‚X$I $I`$I$$I$),%I$Ia,I$I `I$IRX0K$I‚X$I $I`$I$$I$),%I$Ia,I$I `I$IRX0K$I‚X$I $I`$I$$I$),%I$Ia,I$I `I$IRX0K$I‚X$I $I`$I$$I$),%I$Ia,I$I `I$IRX0K$I‚X$I $I`$I$$I$),%I$Ia,I$I `I$IRX0K$I‚X$I $I`$I$$I$),%I$Ia,I$I `I$IRX0K$I‚X$I $I`$I$$I$),%I$Ia,I$I `I$IRX0K$I‚X$I"}AAǾkI$IR τ<ǺkI$Iq"}UԬQ]:pIs`ܟ9qR2{*U献ܱ-v%0fd&NNRR2-B3:R:$I$)\|[^WZ{}cRRR؝UkYvO= ;vwPn-.[e+=w>o,[`̞3? iBy9֩;2dֲr@vJֿ_Ƕ;9k.3g3P\TW^SfPRRSj>@D_:I$I W.}""dwB"O;ujЯHII^Z#ܹ5Y~%ģ3Ͽ@ھ}y3DDD3fz>~5玛qfFa#ssU0;MlJ1y 6T_غu;sPtQ:$It|w@=X`uٳ}-6,E&6.*W@n83s;z8n]֬]jǙ]GμZ6)X1'a此G\bT/Ǧ[P"8;[||7G$I$)ʓLLk.>%#334m8#3ShzJ#҈EPLixխLM`\X(SYYY?JCdDFFE.V诶xԖ@N\rlظ$I$|7|@ll ]:g}*W@*xᙇL3_qeҨI̙3G|wpѲPcMDthf8 Si))\Z5rPhT1eWfݫVazXh/7lb\HbI$I: PH}t)(mJXw< R"͛5f\SڷkŴ3hҸ!5WɐO`ŊԨQdjתA$I$)\)+zPOԫ[ƎYs)W{…cֵ#_x6_ } }ndɸP[bޤP i6gNS |N""rNy@U\{Bn7l IDAT2?q; ui$I$@0 N`޽=0.9]L6nLTd$B VYG)_ 1196| [+^,tv'$mʖ)E>xf^`0H%)^9I$I:<:'ShQ4GC}8QTZ nNr]W"8%ODԬQ1H$IRSP!'$I$I'_{v7=[^!I$I8,I$I `I$IRX0K$I‚X$I $I`$I$$I$),%I$Ia,I$I `I$IRX0K$I‚X$I $I`$I$$I$),8=J$I7y #eg@@ ͻ  %I$Iy,E E plSDG+I$I%wD}G%I$)< Lx0Ob`I$Iұ]%I$Ia,I$I `I$IRX0K$I‚X$I $I`$I$$I$),%I$Ia,I$I `I$IRX0K$I‚X$I $I`$I$$I$),%I$Ia,I$I `I$IRX0K$I‚X$I $I`$I$$I$),%I$Ia,I$I `I$IRX0K$I‚X$I $Ii;wbդRje*UHd_;wH%(YT'==@ @TTԟ/ Ndd$ 8JI$IZZ b ~ڵr+_wKO`MDFFRrţQrX78++O|ƐZ^t)?Yχ͈\ye\zYZqo-[r-+]_p.{@א]J:xgs,F~;eкM+/Zp͵WZ%I$lu?Ͻ$'Tm1㹮\xyֻ͛(]|nMN-ZɓcNn@qy\%.8ڷ%--?Ρ;صktҿmfF=-ѺM+J,^GNI$hڴ ENZy]JXx$W\y)]~1^w7;v2eT;RRRA̝3=T^.-[h }ƍh222rA0kl'7뮢T>]N-n ޝUWfù泡Ø0~۴"22K3Q̝Bw%|`6nHMzF6Ϩc4q2gt;ѣr5W7:y;u`$%%sQܥ#/ ,ӡC[~YJrڹ7O~&: ڷWq0a2[3ؗNֽ>ݒ$I ۷`UԮ]/?LhF'7][!رz`vi={.ӧ`sU&Nn9/% "oذ!yבxIMM%&&l#|Ehŋ#OӺM+֭[}>Z?vC{g7o~ĉS煼E+zPD+V`Mlٲs1x'/_B1KƛzOvL2 3p{$%%mzu0~Obؾ};/ed,^LlZ_|9lʋ/J.R"%%ŋҠa}пYn=UTfϞ=|3b$iiiyml߾?/d R2֭WS[R$Iyg ̛7&4`u̞=ٳ熶ٲe+ӧ`r훖#?Κkiڬ mͬYy'm%''s5W;A䋻@o޴%z'>gggAreHY 8$Tlْ?(X sپmGhs=0K$IGS۶m椓Cjj*iN ,z?_ᄃ~z8;;ͳc9\~SSSٶm;e˖ ׬]SNiLZZŊgjk±c)\8f| [b*V@|#}hǍ9seVׯGLL/˯>Gtt4)deg/k.[11q6;U*wo97'.]NǎCyflٜ376+Vw5k;hK$IR^*R?#: vGӺM+"# vlpqǢJUU!.8 xCN (ܹ?nպuK*U̙ **9#qqqTT-[2:v}B  _Ò%Kپm+r|?{BӾv:-Z6c3J*R2^ӼE3FK0i&  w'CIHHz>w'͈4:2_ zLӁo&OF2ٵs;v^:>Y$I'zQ{ٸqG=fķ$&GPh&N2nn DGGuǕ|x~L6 QPѬySKw'55뮹Zj.6? ]:2{\ƍUٹc' 4 ۏ<?n">1>+!!ɓ9v? Nvьv4N*pnv(P`/Hz#f߇؃F}%K`!@NoӦn )W>rF{?O< %3bgwgK$)셗+\8Zjr5WчkߖU+W3q>NOc TN- ,?_`hwMFF3/v?:bi{\ڶmͷ- e˖v=}5,E02@MN_g䪫/K/_V EC͙z<,--Dʖ-CDv`:zŊ.;))]v_ߚ0˯K.S`-k}RhubmDEEQt)$Ilya׿ӌ=cksy~7[o3{t˯#!!^zB1;(_x4nwyv.|?Ϙ'.8} IAﰛ… +O-*AlJbʗ/G\\_f۶$MBۻ7D`m[o,3pUI$鸲glJѢE(Sox8_L>X  >|=ۦ\+W-ZC-}͛7Xĕ8 I$)+VbŊuǽ|?59drr^!I$vǘ%I$I:%I$Ia,I$I `I$IRX0K$I‚X$I $I`$I$$I$),%I$Ia,I$I `I$IRXIu $IutZ^>I$IhI$IRX0K$I‚X$I $I`$I$$I$),%I$Ia,I$I `I$IRX0K$IBd^[zz:۶n'9%RJQTI@^u$%%Aɒ%I$IGX* Ű?``ժWƛQeG>?̢ yGwE s}}yѾ4oWu|r4nr2"E%It|Yn=Jʹ۷͛_<ʹ4lJ*[2ePpom;V>&[Y`'կ7\KXl9#~5n2)?~"֮IuKR&RJe:u@*UXr_Ǘ_}ʆ>ԭ[7?n Ơke%W^u7t=֮_`۶ǿA<8k?ΚóϼHF ;`ǎyyXyj}wmDFa̘~3-alՂ^_@չUL< /:/ώ+/mڴ.ky6-iTbcsY,Y}J믡zj@m۶[^}ҥ˩T";0ٳ (PM5zAN3iT\9ΝO-0|lSO))nFCԭW_;cޥFֱ=K.; `qoџAPVMիQcп s&mO8{LRUǃ?٧_rfT̝O=>NF (UFaGCHNN{qiߡ-jdi#≯z?q~:-QB<7lFP!Iw^RSS)Vx5jV'!1<|SLg4mքMO(Z߸i.w\Ue_@D .ĽroqfÖe(+l2245J+ʭ'nEq#?$~p<9G4'xW-3{>11ywiܤ! џaF:?؉c4y:paW,BO|;7shٌ,##/X,ؾߒ%Yh)M4bK/.{>t&M[N'[N-~'K1Q88XF ,OF#|yaG,jL"] X_ƆU+ɘ'##ӦvO)EDDD5yTRXp :3TThب>|焇Ϸщ.HBB11X:W`0TaO`2xo؇ jaggd^R+թy OpO\1L۷y^Ӓ쬬5t؎qI<<=0iӶ54oޔ v[ [[[T!/Ɔz}͛P~]b/ZSFus/]EDD@d-Suڙ/OȑP\ ̞5R4hD,hF|R;8f ݺu֍n|q/^ĥWUZ5IF9{=O>ðw?ɉQGPߋ=<=MeMLLB`nn_䣢řWέޞ[?%Y0Sqx^ti:P>O/o/Zn6D}q`k%&$d֭ fݺ`Zl*33ZrgɮL-]!R6Ñom,~9 HX)]:ϹeNjU)c+wZx.փ/_ iӭkKѵۃt3g仟BDeĵBejv4-]puue+xч =J0 a4)Y҇M7c44}lGxK'\[Ԫ;WaXh)u{~ܚs'pbB"CKxCqrrS}ԯ_;;KOXL9seq8|o?^zuw4ew#G 7"w]zzzuĉS{,[ Qь5ӧpY}!)[ ]v1p9kGCIOO~{erj\goȾ<}+_vz}ԔUJgͷp>it*WĖCi23/pWLq&&O//OjծhilټE P}>u_~IrԾiiiW{Z57+ƍ.];.i&xzzPrE_e,Y-y%Ƚdt{Kce˖VwJ-ۯ7g{Xqp˝8q<_WO^,+ ;wLvZoY|{?Gr yWV̅crrr$99J0ӕV*;N20qb/Q\{zHKM_fp<ǍF#?(O<9__.];3w҉^/$;;ά?ZhԜD ,ZĺKrnܹp:b_?z_ߒW-?u4 ̻{- m۶"1)8z,3bp4{=3+W+VfWh۶C"--oLc5yCSm߾I%&梵Nl$9)ٺztŞ={mVoMZj=/`دزe;Zޙs3{>:s!6>k4CQ̭XKDDD(III!<<%-'''NbgkGeYnflP...'H`~IIID$!1OJ=8Wzz:1z4"#.PLD )))l"Gp]9sHLH]f ɓ'@2-}{Ł̞5HOOgsYx5vzB""""""W,kzӭoWl6\y\?5 p`AN:}M}MII)xRRf{ܙ݋SvY&dffaM5ٱ}Gjj*e˖aoRLi:ǣ`2ӠA=kfh4SYd|{]j-+W_Mb7)Pij=z阏ȑP*Я8>GƩ1154"""""RhX AAo޽)]ReSxck̞;:uk3IO<̝IJ6&;;g3{ 7˒Lnߡ-oϋ}_iڬ1[l`۶T^LiۊsgиqCY̥Az[;/Ǩ\qYDDDDD} RMT6oM kٱ\ԩ3,\l:)đ#<إNF'!_|1~ {gٰ~#IIWmڴb_ظam۵j@6Al LRR6n!55ysrB`ٌKDDDDD.`)jd-lڸ͚X˒1KxֵKHH ^h׾UҠa=bc={ҼySk-)ɖkgddo5__0DDDDD䮧,WԺuK2rx{{Yת]RjՂ,XL)R(Ǻ6`6Y.8_'Na4yԭChBZӴYcr(;M4`0ԪK3qlm.""""Ri,ǀu&dZSΎcGEzz#G3o1{\Lx^znnn7I`Cff& Pq W?I \)$%&S?J(-)899Z3_Ncph=;Ao1kίDGZ"/Z..7EDDDD_ؠ8\\\/pͦ`!*︋UCS {|ҕ,^'Ox"_H6 xx~^$"""""E7_'Ҕj/OO~+(]Z9hРm荈܍ff0s.-_&."`00`]{'(`l6e4ή!-+vwKqs"L;6FR)tC96 rKqv+iOZ풖ʓw_M2M.Z!XDDDR+2eiic.'NãծCv7d6XYg|:x؈nXl NY8FS%%&s<66Ob8s6hhʕa>b.dff۬Elٶ)*ӤQ]:kɼٵ{\ @ 8v 8|$~?CGPJEA2t$Աs\-5[x{{gg4_g3gϝsw>x+vPbԮ#Z۬Exq7ԫMř(QZ55iԄn]:`bÆ ro) KIMAp6:0dףaמڳzι;ĤFQRm8q>q&vُ-1cMkytL,;wcC| ~gݍ[Yb?ItL,QDDF/1cy!yenl_0ؾ3Zً9q,| ЩC+Ll޺ĤdnPr w}gI~<}<GaUa1D.ʿg46lÇs|ԨQ=2=Xnؑ#U&;;cO1є+wԖ3'ӫ%d=q>_s`K Ng)ԯ[ 'y^t}zЯw|ϙJ9kfNں֬Cb/ci@t_8hڸ^k4 ݲy#~2/>NHϰ<@Y4& gؼuW{wKH8|U\ ѣ5j¯ȝI#rխɈkf9Zrrr_mݜUڹ=L^֯?#yeMizL6zx)NѣG[)ܙ>rWXFH;b^Һ|ҮS88:F|>'騹JxYpl޺ g !_p4s+@rrJ..`jF:mY5Z4kD>=p91<C{}v>[b[9L |}: """"w&v,7l_`שck&=&L˫RS0عR~%ٰq`k2%si+mDEн~#SS{5rr Յ._ ;vl6[aer`+NdfflZJQj,XDFxߏgGXr8_`6nWҥΰa~EDDD`Xv3)Ke#hjY;}yynU!,si´iՔ[Yx% 5&S-7g)i,])) /2EWa銿pwwR`@uu޴ݺױ'/u3ڱk)i|muNjm06n}DFFuxaw&LmC=~4NnՔCn-_;F况kӂ e9q SZ5XG+?lWr Ih޴A5o ~>סּ BMXn#Q2 Gz=Zh SA-ltl\ys|sA}]ZwFr۶UBEDDFyZ xcxzSNE| l7++qrʿIUn0͔Oظi#FӿGX1WJxYJMM#|$..,yH.1ua}cps+~C?s""""w!͌ {{d&%75˝2]gg#+ֹҹ''GGGK, ww+oggg}Ӎ8u,N@yʊ[B5#"""""W,FBGUHȷs*11(|}hߦH,\ڹ̙9?͝Vͪ^:EDDDD)m""""""R)H,V=1)1C"E\AG[G \m`""""r r -2 [7L!X6Iaغa4n`CTu&Xbe0X^3 Em?owD4GGFEDDDnF`05hͼp)E"r88;A3hP FEDDDXYFqqui@Kj%==l̘|{(R[[qqq;;{ `h4E9vwLȱ1`gg=vvh ȍR< 68boo f~Ek3ȯ¯ȍRm{;""""""rhG)PI?Y@'Ma$g$]9?|{ E=6I9ls6{/l,vE%Gr>MoWDDDD^,Zz '{|>-CEO\9֖uW_96 c/Jp]L .bJ4OVNM>M#oz"""""`'>DYu_?MȀlsy`빍y%e$FfN'W+O̜Lo9#qiW5=ԋر8tnᛙ;6YGbzxFv+}?'r'ֲuW.X?PR3SX:㱡WbjLjJ+08f[3 vrF- """""w*m%;;6v|v,K;V'V`k%ǜCXG;'|@jV U&ѲlfΊ%[2DdTAOsLvNs?qitISnnr$/韯Ϣw-ʸcSeNe6bloNO6gS˧ӵ^]ևl>'aBcAlE:U-8Jzv:~n>Uv~~d.]+?<2#"cxs\H ȸy2lqC,dd'WP˧&#D%֟^Ö>Uf興4,x*հsm@G7el9̦878S9^#fD՞b ufU9]ô~wݗ }!Lx`/g]6gF*<'v#ۜc՞ϰ\0)#kN.gG#~|)_>g&Wqqpe߀S~|)'ҥ#$'>|uzneLy[k!M%W/agc>i>VRͫfϹ_c"H3yǗ/ IDAT-:Tx!I|ne:Qɳul%bnĤD;DrFsCUw-lxoޠoaocOq6tx ,NNk94Z]8pneǻ֚vJ@y  sp~doƦp@|r`Y C1kݚ>1ÿsӯͭG>o/FOw~<ñ+%]VXJul \OP)Y)ddQɳ*\q2=2t,::כU)qiy,l/=ܵU<Pųʵ{^z"""""EF%*>CW$9#s?L%$r/5|{#ҵʣWm753%߱ %*RXi~ 3?G;'jԱykի|3^oKz#=+<9=kaEͬ蹙w[|6gӵ򣜎?gFHjfu-m*3tfA9(.PTc휘}pnepvpk0/jz}ZRѣ {/&#;d%iA0Ыn{կbgc_'W1 ^m4tjdq<"ÉL:Ϛ+ UkЫnLqI=;'""""rS|~b!vQz|1u_b(3ލh'lܔĎ-4r_٦v+k@pwԚ\RJc0puvy|vgp|מ},nq+ f$999dff %p3c\Ҳ,Qɺn6d\6+pMťR ;32,iU(Qg{|lB"wQųZ{?gOZ G[}ТesUgbhب>-"55a'9r(ԣ>8::CcL6sԫWzS̭X:5jTݽ8۶nG`=4nҐ'\EDDDDn7Bܹ낭۰~#:cY+f=iۚ,&~=AL̛X_DIߒ< _ISy٧^N#9ԻoCyL& ~ $1)Q뿭-ڷe~lڴ-gcQ̭|8ҥf\N&1!3gIJJl63ÏIJJb蛃X)AArru?eьlSDDDDvjpqu~occCP.󽞵ãI> =n=z ݋3߫ř(Q==5g\Enl gAz *T`Edff]ӳ ;Lq %Kp_ZZ}4o]:qiVZ˺u[ @g3OjF5k`kC ;~$\ ɑ bIS"%%/)&|3+W3ewDDDXu(Gl\"**R~u"""""wޠR=A+^^i#'Nd 剏u}0Һ۲eZa2Hbb.)!!!_XRlۺoF# 11~/d3J232@C|5s9{{{^ ؾ%2st~~Ν  By ^?'OOOŽ 3# jKK`[1T݋c23j}_"""""w`W/[h$&"7oyܱ͗_N ,[6X.CmX>} ű{ *W1]O>k׾ oT)?Z H&Oʐ7^E?+x~vedl6sY\\uFΜ9'_C=R~]Mo#T(Od)QeKWb2x?WHjj*_~9Cغe;K/Qۋ }"""""wB;Ω/!!H:{5C!ef9ڵ j`][Nm Xx)fsmS2 vzlmmٷI)\\䝷3_y 7YӸqC&}-sf盉S هݕ_{԰Q}VXÞ! 6|ͯK2 ??={kuZDDDDN|rcg}ٶe;j$U 233kz~g}),^SO<@0{4mDUٲy˓^ `}v6=#Kzyy2xȫ?((l(K.PV|J6ώ N}"""""moo233INNfT/rw3DFDS[[[Sfⷸt'O۫к L&,kW\DFF&䩓pZZ.D遫k ٳ:u_S)ֹf3qd[hwA03zDEEqQgk5dAq`ooW`0c++./@n/u5 _'''ʕ+[`ٍrOOզN7ҭYDDDDN,wM^hP;JnwDDDDD]EײWDDDDDn-`)EDDDDDHP"AXDDDDDD`)EDDDDDHP"AXDDDDDD`)EDDDDDHP"AXDDDDDD`)EDDDDDHP"vw@L$%%fe0舫k1owoDD_R|233x1FWDD$LzZxzz)ܥ4ZIJJT)l龜ܕ%;;)"rR4+""R8wRD䮥,""""""E """"""R$(H,""""""E """"""R$ȵ1DG@ O`0n5册=LqǟRjq.w3uDKxPt[{*UFLtQ;8?YY,;msёw34֯s.r_4w8U˗ܲ(s޵}+8TxD ¹i_r""""7F(N8w4׭t'O֯]EXf<\o<ٻ{'`ɂ94hGGAfF:NFlm'nݩנɈp!2zS,Y0@t}{{vmg͊^ŵ*W^V?N%>D-fԪS;?S'd\.DF-Zqdgg1/h٪xxzQ~#7kimS,?pllmX5afufR&.6/oo+ѤyK|JYٽc+;?n;! "QjVjkkoo=նVZޢP@.! WB;ͽIH q33L0|bđ¾ X ^|in(JvƖ밵X%o]v#j&W^Οh:^x1g;+_ ȕ\"=5r<Ğ;pgk'5-w-* #3D`\&|_3!W\}]p~] Z>.Xt֦HIzyi Sόg1ksǭ7o 8a` Yf9.rB%{g;5͘KcM9iڷ (-IV>obp~./qg!g. )v9#SR(?TsKdb*Ky?"1)j|6. v`9f,U8Hv͟ۦ»oNƵn$R[]+F;~+V[ {˕Pr`%tpѥWk|1|gkڱ5MsS#Mot:=[7owVF,?Depw䘸.J# ٰnMd62hc#|}>9I5rrQ,b|n *ՙ[$#Q???$Ous_[d{cmw,Ժ5R_>'<ڳk.RF:㿶`0o3g`utkKTr]`#<@:o:c )ܝS~)}X޻1_ro0?/IHL`~YcƷb%Lޢ~m(J.~99.~ˊ w#Fs_SZKr&7{.W/]O)fp#ˊ  ùv$\_Wˎm[عS p.ZW o CX??;odOBA 8ӳP(.ln읃OwʃE@!ݝV E;)_,?T[ﱷ5sx4T 6Tpx(^oۚxڎm\N-V1KH40.'fT_Cjk-/ȷc{ؽӊ?< B!>$,Fcޢ]tspӘl>DZm--Z$;x?0aۤg+mpuHK٧ ^ ."^x1ngf]io3yȺC%8z"=3i4.j&MFV {|N2Fr\47|ɵ\r tnٸ؝>aPְppy ehu:կo1Օx`NGs{ w0K;15`7}F%q;JcS%\_[~FK\:Zi.cCP]`$)=[3͵UXb=QeXKSm&T&#{]XjO6k1 &h }lN}:{w6ZCSmVbFVq`0/RUщ$-#떏#5= _/ rl&OgqC[q[[dm]ΛIJrhos{dfY͋eZneyZ\|-hJ._ih6>NҸ fĿ,P@(b.X P6Ew dLBT*)& (JҲr0GA(D1pi>BPCTt,^ Ra?ˋsSHL2[lWѪHJ6R~h ʬsuM\tiŅi+`01ح^,Z8~LQ,:x{jU,Y͜)nxRiTuvu jEctYA5)&r&ĐwQWc9nj$G3ӫز:-~ Vy(+ 顭E ҃᪁ISQ,XƜ)jٹf'qrO !8I,FE|B"W,Y ;+_ bT1'Oeڌ7p80ؽsSW~O]M5kWnJ+;Oe&llki&oɤnDJVc0pN-P)~;+_{k|2ǰ̿|?7+0x"BfA{q8]y qR%52GX8sx,ǻ~Nx-,Xts,bES1=/=Ȳk4Z>#\;ݝ(Q{wRkyC~{7V*U#YuGO7)Ԕ D1q>|^%;9JM[}5 e#q-Z.HPI;:P*Ty5%W^=CL-OwnD-l 3lؙ<5[ğFi thVɤFmtϮMwSoh-Z]< L[<=6?GTrq*v/6voFddFry元y~ɩ&|= 1JhTV+zM(tҿB!`Sbqݝgo!G(wVH|B"3Λ/~zEGK[C%cϮ\z #?^Y4 `O6| 7,y?SWSMZF}B!+ڱ {wWۡw8c7|o#sX>MIhNf΁ /GtrJskq x^Ϝ5hx#F9#=@r%Rr`MXfZŅys;1P_ \?X`T(eV2qrsnu qg2h;zOV+L:j2kF( yP(ߚV|Xj,fȳz}O .{-sxCx"+:L?/V%Zwd} jO}BP\hóN_SXB82)APpKXj:"FE2m*Dٰn {v :&6RR;w~}?,:& 'P(Zl-VOQ*RڴLz51TUQ[]i陑Y3da9>c3ab;oF)! 3?11L2i?֗pxEY)||KƘ,kkرu3c}oٍ+NlG ňc`evFukh+n9~ 52؇3{Ig[ IϞFڈ s\ƨpĴ1tu%{ɰ%6P`k<\"~8f Bt`TB@7RURNo -+4:[3pLf.^7*C( ->ހNo݉2WwĠV)zxAl-. Fu$p= ϴ '  DkIN1RW~,Pg$ ^} 5U\sHP L}}|(c?ot j8gk]SCc}s]"T*2SWcGVj];,4ISijtYpa u=n;&1ab,uTWvo睟FU5$%Yvs&ƞBqvYIQ(? kYtѥ@xF#_rUί}o$;yLV8.>51Yc1)eɵ""︜ }߷͐=ojCue9~n◇=14-\ ,n]Mud0? ΘrT`0/HIiP(w9G_ZmwC|4u]Y\#joYcىgXX};\C1[~EVvRX#w6ER=Gu^TLJ%)ۚ)-Is]i( G_7yL4:ςԈB %%-Ҿ\.'Uh:Ͷg?ppKXfZMh4!'?zX$ G*PSUA  &6ĤpwKSc=1PgG;]]x?=v; _&nڄ)LbR1c]# ۻ CDP٢Sys qX_N'5-;u c}x.aqPkT*`6-MLD7{3qLfCA ƨw z ׃Z=&}uwy2k=s{ܮp7?~6\Ȭ9,9gdˏJ@=nT*%7Գckw~}*C8>̃>^\~4%jQ!'!]܁dBьߊC9sV}<`L\uYѿvt{ޅ,VΟL昑B9ݾ }NM3 ~!\=T p)%GBqN0F|=/O%i'^53*Ik1fcFƁBq4 YvHM<]BE &3өH<m9F,9HrB!ɒXu&lB!Bs-B! B!BsB!B!  !B!8'H,B! 8a-VB!B B!B!  !B!8'H,NXRrB!B B!B! &`P(كPtwG!B R^~uvOsNP(Dcu9E;>ʒbJ~6֔SUP(DI\Ϡ#clh'ZW/W!B9$g#I}W_Yy{@O7o_)6֔cj'mlgc&y=o 4gnG vr. LJw1`mrB!ĩ>gS= ֪?)\f'|&Vdee控/&QYQUW]Jb͚h4rǗcڍlߞcIxtA ٵs6_2O?"j'a@ӓGCu8hutؚ5 ddO@7 nVk#@zVZJ׃No$s|* %*3 ۍa'6!Ds}5zR2i)`"15[S5匟<3&d 5գ&ocM^neEV ^s@8~ge9( bbu jl\_GwRP(,$B!8ZS= %.&%5eٷn.7,`=\|"o3'sBSSSfZr_ˤ/o}c;_V\) åcd۬MjL"*:>vͫoq#9j@ट¥~堽t#nwφ( ]lkqyѴ4YfN; P(Z!o;: 5LxYD%qP(DSm%SiY5J wԱ._UezCs0;`åf1Cժ0`KO7>3/Y{P("}B!g)'TOT/7>]TVVÏQ[[76׬^~8,X80ߟzg s-ɰ bSptH tPWQVG7΂4P*](*h>/]6Nvq;ztFu%t`D(BTRlk! q;-?/B!LXj5#|6X\FTUΦOٝoEV{v'L p)JKYi']gDV+9Tغ[nөhosvu /?G~;0B!@2vTVV/?Uky/l̙ٿ7=F0{5WΛo@ZZ 7tq=ߞzfߟI5ak j ,1ˀ8ӳs{7\qItuF޽e3RT** WR66RIL|XjB%THK]E p:15Jlkhh:j+Io[FX}צnM V㣹1ػTWvT*vu qzf,Je1c-ܸ"gZw~}*ֲus#h-KfGtf>GV2yjcKF@qj475k3{<^?F1fk%*ʄ0kt>?wG'z+`w `ڡJB_!BB yxaf6>>kgEm! 1v\^!BqXϢLy|O:]h4Jƍ?~B!87i !B!< kݻB!BqI,B! B!BsℝK` !B!~ !B!8'H,NL%B!8H,B! B!BsℝIZ!BqH,B! 8aB!BM$gyB!TX!B!9A`qNEf6O'EtwcPnNB! % .ǃF~m8z|'ݕ7=B!̥>gxfw|ƌɠ@ Ȳe0wl Xj-M\zbnz>h=7l!&&:r)--cڴ|_kرcv{SLdo$>>ń)9ΛC5KMڸ/c?/%Y#~Z8G!B3⌒8mM~~СrV|7756UW]JAA~W^u) X-h4-eΜYpÍױw5_ :n/7Pr?Ѥa%[H43!C|bb IDATSIψ.ÍFbqr edfY":Fsʶi}=[6IˈEz|RH!Bς@3R9d^^.R䢋Iw3Ħ[inکӧL2 ̲`n:;P_@ ]A '> JޫBTN&k\4`6E>oȆued#`@VRτDnwr&bƆ[\]Sq:'HY!B$,Nة(nok#.>~HHHd2p:]v;;|.d1|OL4^ڵ"݅,\8M9g}l jG==>^} /L[ߟŚ)Bwx=: }E6 :Qs4kfu Xq-f9Ù&S_._q-:ΟLEY'5Uݴ\z450{^ [66˥hlq !BYQBG$ p8|S,-Y&L|ݩ~?jg_gU? q:DEEjv/M~ey&zr YiQEe`QOI,8读ˋޠ! BSÇLJ䧿J%BsBqNG,%ℝෳؑMyfSj4J|6y2J;"?/X&B!8kH,(^[&P_g h &B!tX0)>jr$C/B!N$qFg!B!ĩ"8+B!hv*ʟFM!B! xB!bI,NXz B!&8XOwB!S3^?]B!B|NI,Nةn6B!$gy B!X0K!Bq6XQ!B!b4OwB!Sv*&r:晬`08mnF3t(`m[۽+B!8 H,(===^]o~~|lu^cM9U{(߿gX;)- ٠ˋ X^m6gO!B$'l+55^GeetZf7}_V>#3)S'l"~? 3qܾ۷zފ4!w'Hg7"B}?4 "ɓP?KvןjNg;]]h:S{O!ǧ>/tJ=p5kp85VGG'o/AR1g,_~-Z.|,jX,~\nƍK]}_w}7x&n ,޽xTWגyJkkSNV`6GX[lU*>x J/-V:eˮ1 ~&6mB{{'cY|)yylݺ_Ø1444YΛ @_B믠PXI~gy?O=wz3/֨O[S-zLT(IL flM:= CakH0G7Vo@ JaۅZ!} (B e8zQ('>`~2NJƌ17w6g&~(#q2|~'.ϰr scX~sg]!BE`qF1EEz===<ǿ;a<7b%њuAxMx;v{Ï ϚnٲU>&'gyylڼ{ۃEyy%<gGGGG=11db|H_bbq\;app5~|66qÆͼ[p_Ny<^H\ŗ؄Bq|R-Nةv.ˏ~]_tAd]s=);ݾc)?_~ vy̘9`0Ȫ?F> 7^-f̘h %%{/tn}MOOc\XHgӦ(J|Q28i>$>d$k>cvn ?O<ȭ}|)"//h ii)|wrŋp`tqU?ШC9G*jmڬMjL"*:><@ObZ&c hu~j4Z3HBr= 1 əDrFBtwF\R* ) AKΚW&eCqzRR{++*(ȷM_%&VOMmio `i[77RQ>ZIFN?+_-eu8ө72h~T LQN?5U݌k{(oa_Q+qzƌP߃'!il8^\N?1qGJI3cˆQiO!#'`qFwwGyGK-b 6&& 9.[v-qrgΜM7/RQ\nmƠ< fdA}ch5(JM2=ܮV@oNBB8;i2_E"l?))Z~ءYcμ#,;o~4BBa&.1ߺζB>7c{~YRPهRciވ# Ms]%P$f=zZ|ouP@mA7>ÇPl4UFC]Y[3xr (}h\yX2iJ<>_ѨKOwoJ9Rt8HW?Fmu7s[_`:Z?> GSGx ?s称{gx~bbu1Yf3B!lI,NXzJmYZ1+|9sg'(+`ΜY-f-6.\JEq>+*|GETgTԡT*5kEL8Kزe}Oq` ~ظ,V@nA{{8XRRFai&z≿mP_/zXfM͔U~#:;j֮@œ1c󹗘>}*~'d+ . 3ss/`C,0>WPk}5 ) FWjl:ζz:MKc-m}o8v PFC98vlMuXjș~69=D P(DSm%SiY5J w܁飻+<ɛ٬<18n ʏ1_@jвG1:j%J Wumxs?(-BI,(c Ζ-۸|Gy/IJ B¯~Hdݍ7^oD>ݺM?%11nVCQa1vW0aB)x>^}eeY#eS)pz\NU̙3,2.X;-fϛVh/o|7믽EbbsbuWjٺuwu_̈́ 9|'nn7EEq{i3RWQBCuIiY@ B)ztwalG{K.rh^ R祫/`u;{(J[#ܺR2LL|MJJ%*ζ̱g-)BH!$QBAQ^Eի"^*"^J"餐Bz۴M2SL2ɲl|nZF[SMԮ-xMEť#er Toj*(+'PŢґڻc6|"I;/iZrUffw|JJGv9'yn(#Ӯe]"#nyN:cVT4 LS~~*ڵjE$Ѣ];ZpZ4}V$0V*##@H�W mji*+urчU C:jFSU5jj hۖ&zZ|}wβf,kVQqxlԘH;[).MP($/ۭgK?UWUY۝]hcZ~S=?/ mqN6pXn[: rR[-GKa(0MݱUEť#*%5KpX^O,Q_ } ò#?~_gk˦F=f}_iLIR0# 4Pvә~Rm=|: ܩgYt7/v8@Hpn8ˌY::r8,]nnY72V#GHDFE"DMfN^\>-0Z;?3 :q骬hi*ڿUЉ0M##+kȬcz  %?#1eu>P‡lGZMZ+^FJɠkऔ `XoL1  $EFuPlm Psr NR`Xo, c^$0LC}}_wIcd@BFBX,1S?`$ܼ=#p85N::} Ix=y;^^"Ba-_Z6__wk_w8T]mm̃u0{~jM>U^m֭۠7Ҏz7\-IzǴpXU{v!a*2\GڪrO:*5N[׮Ԑ*%#ښUL'Lw[ǥ'TJJ|ZpSnKNj``IUZ|J|ZJIUWϕ87pVX+GpT)S[KKGh35 Jqbv}.>⃄VŊ}}n[Ow^'W^_?ZF?^Y_?Z~`ljv}'FP Èyܼܘ<`5 TSS7i䉒eVeix~s,}L鉧TWWo|eggiʏ;袋OΝ/l (ٳ$I۶n׬Ye;$vCc2 ܨȊ6SVHjV]>BAN :Jvg6UR`@vgJݙ; )ӥAGbZ r4hY6;ڷk|^Y6 nm[USG~_6E_S,緩ҭo5鸮}ZJ?ߙɯG ~\ڵEM^}.2r|wZ[_h,]qxu10J~AAkZ,cl Iҍ7~#Zhnlh֭۵uvZO=N?}|JmڸE3gMʕln&~-I1bvꙿ(!gS6M^Wiii2O84~FUpKRΦŢAH:m#WZr USG{6k[3 \YJR]޷[GNW6e ӕ}UWOJT[GŃdTopP޶QipP57j-1tY]?0ؽ] JZb{\߾31\Ks^~L[ e.Tfiݧu*$IZpL*,Jc>UeW ׊eۮruG?n&Cz5T2(];7tXnjlgҭTN25dԩ͗Y`@VfN-0}q8tR\iJIMS(֍W('ש¢sスW;˚u奺RBK*YlŲ*}R;G~mv 3[ (-ݦ#IRSOPjMO@{vjpiv5kۯS5|dlvSu J8:ZN<[ SŤH|#|8AU?wxz7&׫nдS9Lr4x@i5:wY3<[5u"S4KKKv:{:o㻚r]zu$Ә[Credʙr09R"a=pMU6VDF ÐyHSN~rT_wp޵u}6!*laGQ)ۯ@ m:r{h.j/IƿO+/'jt3d@l.SmSsuMcLv1OWvi4 M9Pt4nBrnھI\閱r+5hH <]8ZΜQ 0O:@ikzuvFFɍ(polB,Pqfmܰ9zlʏMM6 CӦO$M̽!)GtCӦkG<~`|Jɇ`o[Uɓ#%}S2}$V-M4l\陪,Wkw P0WVQ5*ߥBI=hp?Mu+,QNA6+VZ["+#6omReE*+ԩo@ $mj4 aYLӐ6g#\wVswFz-AI/3+-nݺ]^WGԍ7$) {u6ثN2+z_qfP(*F Ob6Xw_#[bV:< hǵھ5rK*Ykksö3|0]s /kOK\yӫʽh5p(IRjFU.) y@KC9EjiֵiYjomN6MSD> 0-ݙ[70 eە_4HuU{R'WZשiٲڹ9`+-CahM+,{0j[i׎ay<=غH..;,z|Vix`STUѮU+"x׎"Ӣ"UUiBz:e\fh}WVKs$66xUYѮ+52ǵyb?Cgj@K74(5-2Z[YѮ5uCZJihu뻣v5kgYS5jL$-ub 89 Brݺ{qHdU}݅jooSZZbnЯզM[#T|~7(##]iiG_̝^¡.GNrH9l^!.ŲPբ{j˦F=f}_iȴ# bT8,ed{/WGSOTmGVݭz:sFQP~4@Hpn8TO~p͍_6[jɯ]oMJMMf;Xb ^yݧ'p w^L9Wv zN"0-n#; ;]þ3!4-¯Yp,\ilКiina1cs4n|CwʙkHp`V{oDYuE wi/IE]dfΝ=KKJ4~©}ݝ~%3'/.kne5W,tNSKs\. NybeDu5|d^ZzڱO34uWu7'O]CJ=R~$V|[kˈQ}QpRgIrYCFzO3ּ1 !#45~˕֘c551c^$0@JJr$0JvNNkg|E['0z7l1ɴj 95{ca-=`uvvƼfowqҳc?@CFBʊy/!zc,P(5{]`$֘׬yM= AuttļfoEܢ={zU(nEI4 ycZt}q[ؚ5%UW>TU[ѵ5=ˏeN 1P32b^3/ 5{VJJt'zk zwJ[4m=ht8c' V}_TJJJkZkڴyk[eZܳ󕟟?pjjjTon_~Ks^~L[ e.Tg(UkOia:{@*֬?Utji%մEڰ^xyBvjUaq$i6=f99vh|]qI)/>UUnpZquGk؈د0=5jc^9LVE%%Œ Nbj!2 C{Y_^.-n* * %ZB ^IRz]YUȽޯS5|dlvSu Jψj= AEzktIRJJdqNN È5}|m\E viݚ:M\e[t3iWL8(M4Х3,$]v0Ny$ edrr:>RkH L/` |R555kݺER Pjj$+Ik$P4].—wD@&޳v"#@H!4G X={Pb^3/??5{We^F]~_#zgjezgU^OtƔI'T-cfÿXN;w8,7ʭ}mFnbir:sFvKeUjjL.,r:-Ѣݑ}okgjmРyDm>덅\1i[`ay^Ca> +.S}Z2I҅ǝp}''['Iriɒ4v-~oVSchݚ: >$T|A]iڕhWjMyy)j^ggM kGjͰL}qGdz{}a(݋%k_dS]ub +ŒiͦFegĴfo z:Zn.sAslԓCޠȴ (5֣pjk79~H>FހJkfU׍!UҷYMu:܁g 7˻1*Ktz@ob %  hG&ŢbI҄ bͯb(5&'=Z54C;˚i}N<I@" zc!lZVzzd˦$)''KaĤirf$++$nnфN6O8KԬu6J-zWVvj5e$EvggPw5#f?X-1[/k55}cuڲex2vک>{˶5E,4 US喻ݯiw*W'w Кk}kT*'ש鳊 |ijk"%oШ&O)P!+E}덅} ͋yZ+* ˕ؚ5k /G?䳺hUit+ʊv .mР4$]ujл,~ryLФ3 wG,kβfj0ýH(݋%ᰞ{n>{֯ۤK\>~.'E}z#nRjjl6[,FBP\S܇{WO¯$/NZ`@R = A%sM H `@R @$0 )I H `@R 0$.~nG_wſMZZ:np8w/эfSnnN'AI2 9Nfuo=d 1l6egu7 f$0 )I H `@R @$0 )I H `@R  ÈgslLӔ"u* t$E2M3!8.0h>%7ՕhVWJ䆢8^!8n#ij!^-ֲrF te҂a]8+*ӌߝF8ǣP(`0(ϧ[{`GfDF~/UideXᰂBP8s`iX,X,ZX,q, pXP(5wP"Xq h @mr$o[n >D$0 )I H `@R }h8' 9xkBPk0 !4_3-`P@@`P`PP(zp9rMӔbbjbr5A|>yjRZuW ī >d7Z+'h@v]%nagϧmպw뺾hfeӴv iZ T eۣS{[FC^jZ닦ܱj-_jZyZ2lPV]jBGƣY@=Rkq_9nGAL{$4m/q +=wF>dŇZڴ]ސ/8Mfe%3+&?YnW!=#u ,m]x&3x&Л@$0$IW~{ZZںG?Q0샞N0  Ro9/g, hyܐ\];V)jtjJ *͙l.]9t v3КrQATii؟`8wF0{ZUvx{Z-D|^>eD}>vlߥ!CJWOؒVhŲJOO ?-^WZt.`~kgA/.N|Ћ=ۨ^Uug$uixwN(X[u=x3)wJkV->OϕVہ`+{z1 6=t{{ŸQ?9G;? EGnQ[o~.Ov(\u\߹ѲCoOFI?|{?K kbNgHZ|Rw֟F۶P"]yer$IRUe^|U^Vyy9:I+WhoU?O;ZHNf̚WJ]|8D/<ܺ|EN@qܟïDS-ߍQMƤIV60{^7nrM"5x#";${##}l͟ԨONTu ZއЌv;~y3{P3~L+.RA¢wY:³tmE[ѧZbRR_~?myPjnTfV$?[O'IHj#a[Q4n]wӕz~]spaWߔ$]q2m)ݎ8V_MX,Sz^-mpι={d5mdiӆټWsS~pwtW{YZQckڌ4D0uDl޸M<5_gϞ .>G<'u嵗Kѓz.^u=JI4es)>nlv+R󤶲.ץ"Pd?[Ut5HHA=8]~)1hv@s#a**n$jߺI_ݻju76K::zW>`ju(%ũV5L"L 9T.5{vֲ+lJ85~X]|yniiӢf?ߛCyt\+\{~]I?_O^]_WjKƏꕟj+4vh]q9jSU]Yܼؾ[LP|޵WGΑdggp 眫/:[>_e}ኋty3v깿ʊj}@ّ`I>JI?iة{ݪrAS`dk"ajzp=]"zM#KNMT^|{.,`(/ _Ҕr6 MӮ#u#ax<p/ܘ U8!%啤 bSo1C>b;oU^}}G=ߓ$]6B90EXqVr.Ǫ*klJ}KO:5zr_dVk\M::;SC}rr}ֱsQn=s?la6k䯊` whïDxenRF2$3.q0d54@C\>HkJrpJ[iqi֋ի7Uo/SGW~g}Zv{d{[w* Чl%a)^}[7*/?2X]U^ܬ#>=9_MMzv{af=o%E{dHW"8ϹӣGjKEZl ]-x 煮>osz1Y, ool6Z//|Lqo~9SǶ?pu앻p9|%M6-L__ғS!0+vaZ+>ohګO{%Cj{fsk%3uc4:S77WYiD JNUe~?WC}c??3+9 wUTG7zyҬs/Tjzw4n)kPuU$)5եW>~oп| IO[lvܫKp|~_A}lGjinչόۿsp:z})ϟ5qz^ЛӅ-끟}^?ݤF1u*>yC.Sa9I_tys::JIqj)#tɾ?$|FԆ,Ԕ3'9gD~9'zHhͽoֺstirzշ$I_q9G0y}?nӟ~ɒ;S,mĨ7}R|iIEsfk3e.+I:QS/i¤q7~so_Αu>#z> Brݺqzzmιivg]$ɖ*(SFmdҘQPXPHa0MH^$ɰ]o_8 }/pL>^i0='Ða= #6 H `@RH4m}݅~-a}݅~-aVd$iivyC>M4m=2,a 9@oh0 ;#-!4e7Lq$ e72M3!8.0hZM, -mڮ %`4eZue=[Ro7lb$7 lJ]=AVkd8^p8GCPH`P>OeZԴVkhURKtepnb--aaAAABqg4eXdXdZeX::nX:BPk|E8$ˁI } H `@R @$0 )I H `@R @$0 )I H `@R @$0 )I H `@R @$0 )I H `@R @$0 )IڻRͭ B}@ XԸop<lw~\Y,x6#`Pu ڽgN7&!8xTQaA<$Z5#nnnnUA~n$\57ƽݸP(ĴgHbOփbh@R @$0 )I H ־jkkSMM<UXX(0[~"p{{x ]׾'w^o񆲳CźSu ڪy橼k.GB`ۭM6IJKKLO/֮]vr)4iM&K]x,XV[nQaaa%KSUUUi뮻N6M㏫NӧOWuuV^-ө .@SNՓO>-[r骫ԩSW\EJ.KcƌѴi4~xIR +e˖UEEE:S5{.}cْ{{F8dzeWi)unkkNIМ9s4ydt[+jkkՙ:uoyöe裏n^{n甔?vNVZZۻ~W]׻\.+###bQ(rͼyLE͟?_yf>8wl6/ ! @"oZ-RVqg*V[촶bGmXQkmU֗j+[@$K Єl,I6?>fIB&egsy6~yΝ=y""""""95@_!xTR#._3#22iZUU`Lu;p ;6s+WvltML6~0k, )--FXKDDDDDL ~B!g7|.:;;4ʍ3Tg@}xgy,5JӁ,X%\BQQQsg ŋYp!---A᷼{rssYr%O?y{"`7 /gGpff&9rR^,KP`?>QQQ|7P`Zy٬,2228|09%%%qgu-&x<!55׋c PDDDDDΟ߀ y$xT0|X{r]w`Y|o ^|,[ Q~rsskX@;y[oł)Suܹ/KcDa\ԩS[DDDDD{ `7H:.zn7nwTA[['N zL9N;F\\ǏZ\~>n?m?Nmm-7ai_DDDDDd>z toVA˙f&N8,m<\L&;vlEDDDDDD)"""""""EXDDDDDDB` """"""EDDDDD$$(HHP,""""""!AXDDDDDDB` """"""EDDDDD$$(HHP,""""""!AXDDDDDDBy$-Q<͊H`hVDDDDDDFh """"""EDDDDD$$(HHP,""""""!AXDDDDDDB` """"""EDDDDD$$(HHP,""""""!AXDDDDDDB` """"""EDDDDD$$GEwwHwEDDDDD`6 <<|2,.`KGG¯0;]D.\.uA`?J `EDDDDD$$(HHP,""""""!AXDDDDDDB` hzG "&<<| """"2*hXDDDDDDBFe@. (NDDyoODDDDDB/_"77x8뮻g⋃w饗RRRr2^z+Vdf3/p:X,֬Yd2ʮ[Ӷo'`Zyz,_KhѢ~ꫯxx';vi t̤I~:>p_g}v2EDDDDd)9P?R.@mmƜ9sظq#Gn 혘Ao6Ow}]C.^{5=ʬYϨͳuvg|&On7|8>vXrssp:|dgg3g>~[ؿ?_K2o<6nݻt:9~8; '? gUǙ;QQsg[dd?} E)EDDDd8)cr5}]\.IIIA{kll4ԩS,ǂ X`"N8ɓl\.vō7={:ϟ@QQp8DEE1m4̙͛3m駟dv;dff7|@qq17lj."֬YCmm-g?9EEE=z\fݺuڵl6SL;$!!M6QXXȄ 8><#8.Ş={ͪUHLL ***ؼyQv˖-رgyƨ3Otww׾zj~/l~cƍ)//w&im6VZG}4`sSxXؿ~?g60O=UL}};̘1frWn7?,Ԝd21aI. hhh"W/SQQSRR+ٴieee\vepW'''|rXj3Z_>+,Yb *رcf[na׮]x<>̓O>SO=E]]SN6FH{ۺu~gΜɢE())aÆ x<z-cvܹsСCFT?}cٲe}'==>|>!%%7|-b̙|۷onw@mƶm۸[ w/8$ IDATɞRL!%%AUe%͞M_KSSv=*ZdNnN:].۱Z\rDFFŞR::: Лf޽t:1ͤɓoe&;O[.;; enO%DFy+NP<qqqAN?]ok,V+np=|-I[[{uutt /F7x#_=mmmj+VNꫯKNNj`\9zΝgX,rrrسg ޽9?1#:kX,}]|WsfOm0qD.] <;XI8(z@z!VZuB#A'**$&&rAidMÌKI!))eeDĐűnqv;ƍJrf`oY.I8DWWW}ݿorrrhooȑ#?vNA[_Gii>xs?>|E-6+曧2cn/V\Qp3?.֮-СfL̞`kj&<Ę16l6 0ouĒ%DGSDNN>6H mX3w\sܹsٺu+R6Lc_߳`:uѷ09O`At444vF m61Juں_~!!QSeddw?Oԟdz:gFn.__|d2FyƍDŽ h>q:$&M⢋.d\'N0V g ZZ[iooznL"55I&TƏOTt4QQQ>ts~r޽`eO2~|4ɟ=""Nñcm46p]u{͚R\w]&Ǐؾ^{K/RY´iIY)*rAW?ƽ~}͉9sRȈ? u Xjj*+ٺu+mmmU_+WvltML6'0b =M;v,\mm-뮻~!ill ZU9fXXXP0>[{A6LsnnnS9!822ynjb۩'===;l6Z=]]l/,ylt7&)\%%xa{Nöm5[?_BII=X,=לʝwQ\\UWr= ɭ_:`[Ss#vŮ]8mTVȃК6-Vpb&l63yr""""|Abxp8xb.\_}Fzlذ\\.[n *wQwIff&֭#++ <7o&??JL>UZZ+Djj*555۷*222ظq1 >ՌG.0LTWW6i^ɓfNܡD.RJJJ8rzO^f 111F`oCS`U}kɒ%_ڵky7xl^˖-K.9n6~(((0nH@HŋϺгhתU;/S&egrcwcL8V:::HMM뛛-?ݪFUe%1114;}IJNbpgs\9>Jbb$G;o%&*DDgફRO[ozz<K͝QعOXس8ouHo?Fw H3mAc4'϶do4\?o\o<~ p뭷bXpݔ1e͝;we˖|{ *ϵ^ <7\UU… 2۷o7 \g]]]ecbbxG~{ʟL6-ycgSr999{5c=g3ٞ =}-ݽ;%%ohDGGF}]e-)-%**Lnj!22/[d䛭N233ioog{a!.Hn-7SWWGdddЖV& g<.<[kJNM.d2ysёfy .W77ܐE|3j gŊLĺuy}ԜM3>1c1u 7|;S` >1c """" 3pG1 :O<9칐nys&hnnfҤIYeq:!tmד@JJʨݧp8hmmeܸqsg|߳efL!99Odddmf3^;_ݴ{ڟjOg\xw7(kk#`~;0K> /,l[z~io;DDDDΧ9[#F !d2 }. vVhf3IIIhƄ sGaa XU!QL|@la}komWVrE2=jOYXIWDDDd)byyy卾U/0a+Jk]dg'}zEDDDF)U*IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/separate-openapi-schemas/image04.png000066400000000000000000001616551461403617600270440ustar00rootroot00000000000000PNG  IHDR4tKsRGB IDATxwxTUwJz%$zAYP}wZk]S7JGB]:!=!!N1d`IByxs=3{nY!^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+{ڰyvޯԴ,f7ؽFB">F;U^]OϭiOLeSQylvk=3L kؐyz^Cjd Sa-\Z=1֌ϴ*(;xFB[6OdqF5oVè4n̈:_ZiQ.]g5+In֬yKl>-gѤmؼNYxTZV^~CCeUXT\k*/vnV|\Lˡf|1X#/Qv/KҾܹڕ>"*.d$iolVrk:P=bS[Uk{J:KRo*lŪYDd6gwҏhRX&շ>>jQ2JJGp^~4]\-ͦSLltTn2IV~>_[=p՞U]5|+<[ۜd@YmAQ#P&u׹T_o:FMn_l$Ok[~l(`PV^4F>zs $ZhXnբ}hێ|}|W{͆;j A oq]?ҁU\>!|&ܧV#ٓښh2-/^J5^ztΠ~יduz=ċMlڼ= '5q4~|}}1LG/z;iY5mrs˝srde02-72L4.<n2NdZ *2"\5Ս;pKCx֌\mN[5;_[?$uk~$jz:#qdIRz#=tאϝYĞ+=k<}*E k~pbޜn~Oz^qn?83JK*q[}aQ "-Z6WL<1gէoUBݗ_WAZm6M&XXbuUTTD]TR <ޑ˹]~ddPlmID+ץʸ"uLm9>;_[CuL/dׁyUn\UZKtx$E2<[$V[e[kPKW$f֜ 0wϽѩڿ~vs^u/Krr9WZ3$fTZjm\d6cܤVqDf8ԂUi-$ ?AڹZݻuR]\ꊊKM[{f]ZZ ?oIWBkȦZGvi :/"fY+I**.xM`~-\6J_<w}Yw8&Ir}y>pvJj P`=2Hye4mh`ymܝykw+ ^!Il ԧlv+ _{:df҆[v╧ǎ>_'x`rz?JNIs;oS-cj 陇ԮM""$Iq2MNIWtTcU\R=VO[*4$Hٹ:.I2LjB􌚟Mn>6K(\'B&zݠWU\Hkq$fWyK"l|͡]5(>t :EMRH+h6)hR VswamVPoSaylJ ~ TOE]6 _p}ZA[ڳ3DG*.z Gԩu7jdHJv(.6FzvGSǶn׮J\jӢ%+gc߁{+""q,Z\ǚ3onz kBznqϿ%U_r̯45Z|xSJq]p94eյn@C8+pQq^{͛eehӖթc;l}zF|#-ےRݗ/sջg7 9<^/I|:͜[]|\s1D_Ns}eMVvm۩=]Su~w^]pjgK4J59;kZ7]$uHIRzA 쾜9+e4oڔ6U3_1'_SGN[ߓwW~-}Jfwڵ>]˙NїnyӬp+^& i険s&v=^{FQ.JKtx\[M[Gk/?)?/8{%>W`yrn,I .?mhZ}m5j`4cAN'nT6-UZZLoo5Uk6i՚Mn/K`J~]%HVQ#j^}^'5\VV&=ؐꮜJ/X\ե+WwdMӎi }TZµ*Ik*|LFZGvޕ^Z~ kc?+Дu@W'~$/tPeOh{N 9.RRcl$1 ƌ$^or6v|]>9Fӯ]4%M.g*-n3yo{>}:.u5hڽOee˻ݢΝ;}zuS~K4ee(&:RMX1_jݭy?t8/߭~Ý:-K n.*--S8K;vx]qcF(>.gCXhF\.bC=|& oӞ(\Tf4B!!/*_>e&MRg2e2$ݭyæmz/k/]Ϛk`ЯzG;QJRfaޭaCye^j.5촍ު槭 | N*L&g---Us^عG;wuM۶jSKq,[I>Cۦu:vhRg6h6Vll:wj6 MI b5}{Kٽ*+-ztϝ7Ᵽ4g"͛N̞Ln;@}8qe+Oc͙Iiıvh,gU^r]c4R>κ P۵w\;oN;wզM۵~\.Yy'c]JMPzgMڰi[] ɭ~dU?bq}%M]Կ_/uAW]1Aڼe~e.__uCZa)qEKV/W_Z}@Sw̌,$Օk5g0W?٩c;}+β޽+nq[m44JEKXߦu:wjWcy.TW5g!9kpH睏[K'],7WrJ6yܷw}]_j%\3tұNߺ}:uj綑 =7i@^5YRR?]g4ڽ_:lp@DG*+;ǥ~=ڻ5th5j=nX^}}}7j׶s^Vz\6M۽TTIz^=wѾw_[ݽpl~[ m}b!S49{AW22ǗNH={tp^mآe+ EGExI*..jip6c9 ]flwV[nF -~ڷ\d6cYx %&:RO=~2>"^ 59gp?yˎ:gF `}N~U3}j86zU\|:utDju.6_{Q!00@uj=wޠ;oR<,OnJDp}ڍヺ3͵s9?k8Q?g}jJIMWeE͛GkҹIYZZ=(++GYt嘘H5VLt:uj'aݮeg稤L>f\'=N6p`Cx0+^ `W @x0+4Z~}A%n_gWOW{ruA#p2̍uU{Kufu:HņMPf>0"hgQaMCh{ZR|f1P vk" ږVP.~/ eJ롋"Ui0M Mڤ }uyᒤ_65*,U8R |Ƃ\۴P2 ,jg'G+,i)P.ukz\-]"]>@^)Ñ}2_ezr|"|Ze6(Ot0ע{JտvAs+eɹ.}J*hվR-YFAZDJ-\-SX?=~I6dUhʽjG WNE.s_f ?2tW&֢?Jd5o԰fQ")13*Gw|r_WαP|%PU ńupMB:p98q}NU36Q/Nέ&VtYuUtY,SQ4Z`f`N$)<ФG.$mK+Wzn5x.,)#ߢQ]Mb| ?:oԡBbBM 5H m7pU]F:=}IRY]FmI-y%ɠ ߣ'LfUYIqa?SH˳F*( IDAT>`hxMų&<3l&U mTAk:6? 5)-lg6[Ƕfş(Chn3q@AmNI,te<@x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W `nɩm gyԲE)w_LTzF 4o]:SDmܼ]knrKO9˝;?lj=ċ.u~~lݡOY2"g>e+.;J|p8އ_5dテ;&@ ǰ:,DGۯWV-qTpF)IZhQ#1RT^^t頰А:_[XXm*!^F_ee.#肑C=YRR eeRpP"<.Zt}d4eݮ}}= Nȑ#xb籷&-g.  ڬ;Zf۹޻ol$x?ghЯ!IRFf{-mظխτ5Ᵽus]ϪOnu};O=v.u^)P|=*))u(00@/Q٭xh"-^XO?׆&Vx۰ܪZkwާ{-(Vi\gd'P``=-))Uqq$)==Sr}&Vyy&O+I+eWRDZw9rW&vomlv^}}صszoꗒaCky]5CԧwwI%+] }.s]kAn٣ f {r;g MvfHz]>eKJOWY"Q۶rGCA-wR {N]]\Gg$%Չiv׶mR~Ϝ۵Zk䟮pڸi[9Rؿ8PHt9_6ߐ`W:ݏ3kw]K?pj3>fnjGκ{%U{C+9%M4}Z|U]ݍTkO\lKOQaa$hίܞYK;ur}5Ѫt rdѽTuIRlw٪KҤcmw_3;C|,??_=}.up g~P>>>[N9fӭ47JKwl,z']Fsw5l }G_}u3b@^x_Jh$00@z~.~2y|7jınc3zjhp1BCu{lw{ñM\~~عWVM]tP:_)Q\lڴIPhHpz`Xk>eff+.:vh#S6ђ$ͦɩ*)-SX3pKcVdd|}kos`NE^ @}!@x0+^ `W @x0+^7\% zn4@B/Ig& R`eٜ``ht7dn\vV,VVl6<SrFL&L&fL&ӭAjUEEI#ǨJkCИ|LRHF.S d25Xn]2bZMUFFJKr>ҪUz/KNnWTTjϞjӦj'l}jk)--ݥ.,,T{tSttT} i%JHhۻ[dBCCէoz/Ï9pf[_yÏ1] 3;')ݤJLuM, jYuZmMj~{kZZ>}֬YLs 5mvjsT wy_J]+OXOn?,I7n _dR^V['H6v#I Ϩg7XIsgy ڪO^7on٦qoeƼE?fƏY|l1oQy] ; Aڵ`l6i Ѡ]J$*,]Jɫt+РvIɠPי[bUqMY$5p?C*..qR\\r:n`Ƕfhnbv7oՁI٫whWqGnzG傂]s5kn*Wq3ɨk>Sïԓip `v IZ7On&mҦG渇;=2Hhk$I-՚ˑ624'wڣPգgws;w҇| +Cuںe/IJNNъKbccվ}[g[ժgiE:?IQQ:_Rpp[ٳ*",mذI mۺ].U\\_~+W$)((Ho{?4]42BCC5h@:_~_-PII osY̙st2Grd -(7'WUIii_*Qb_UW_+L%}Ň2OsP/ gz07 0Hrh"}d$1BWgCZx4sΏ9\]tҧ~Vm 96W$I;wt[V( @obuP(55M/mߤիyL4C6lUW_.___}Ȕ$mܸYԣgw]+uݷieJN%INxJnÆM57ԅ颋$Iw8g=ܜ\DG>>}{+//_-ZjeZڰ~$顇lVtU:fռy?d]^~ ke)1c/ԅGR_OGWYYM*--աC9jLzF]0B6]_p|tƇ_  ۄK>Lض 9aI;2]ٛkwzz͚9G4i )4fYvG؟ -nfzRr=K.|uA1c$I:SY㻯8{Ĉaڻg/[V* @{#X=k4jTvN߾#HrRimz?h̹xXji߹!,1c.>-zXӷ& YZO3_CED}wռ%IXn}YyÆ:?ɹ;nE$jBNT۶mZך5SKrtB&鍷^U6$Is#iɒe߻_ފ_8T3-hܞiA>&iWaLJT:3…KTZZqUH艿X~~ڵGVUZd̞'Ij۶$ mݤG{H>nz%jȈ'/?҃+IVU~G`ܰ3qfO{PG`W B ~^45< Gp5) Z&[{4g?#:;@MLAnJlԠK f* , FX ެ"$ؠ!A`p஑6MkiRH37Tn`(٬ѭ4}]+2 ޤ"8(Mie22\n7čl6V***t O9FUZcrn]6ᒯL&S v]v]VUEVUVU6ypZl4e2d2;:?[}#$$la !l"QQJZjץm]ZuJ]"`@ &d#!%~  $!z9sΙI3YVY,6fX:^<5\s[.զ^}_-=^.vmЎ@0'> `O |=z϶Ԧy<33L2L2 mî1:k6eXdXdZeX?4n*PJҔVOW[uЎV C70F~~~X,mM6z\[[z4+]7J#)l;:jSK25M IDAT'/UI3Djm6xr4$MWǍQm40ی,8$MDjlnI+ JاڢY@4>*m`cŴgafj=.#6 +=iئ>VjyI=i!l~.~l{w:g[w7N+qptm:hdwN[\;8|vpl&p*> `H֦nu65My:kۥ~#IkE ^\~Jz^>p$i%za]QXӧRc{@'n7c*gow(w_z}m߶C qbTk:__Cyzxy35vH&M{sus=^}S}AkV$EEG֯ۤ_gԎݍ_]Nh9+,GǎЖiǬHkνmת HgCu-V|:u#=J>w c+Pk]PJ-ޡCϼ.=E*>u L&}FW%ɬ!! {LTv=kYb-aC5QMsX% w_Xd. ظ#5)]Y^v{oQq}עow^WRy^}>kmX鿚&???*ȯo$ IҌkЭwܠ?TNvng %I]9Ef-իww=<I7_j~@ I ZxS+_D)?@Qёڑ[#FUL.ڽ+[}:f=GvL|λ֩}K.@}'ݗO`I}|(n 4ה߫zAF²Sj9K4o=F)WWgH=;*]S}*fϯɲٚ*L&uА&$jw^~ݻ5jnRnƭj=Y;5eԡӵD~US]ӨhGnXKSehȰd]8&mԂ/nƵ4T0M8}yZ4U\^ڐ჌}9u{_sխ 4}w>4>ܱi3Qn??$)mֺ~Zatڇ_ɇJ;G>o*nB쒻DYc"1` YIqr{@hr%}>kݳn2{Hh翯b;{y5x|o}~L_|;]~ՔfvFprJ߸MmݜҺo W6?/Yݻ֭jmUVPmMQ9֪ot+bٯ}t<uL&*57[K"[2Ijt}8]m]5ꭥ[S*l;GsT72ڜSqc[ox_Qёzg{DJ[Q׿c=O~ܜ|x]J2PEW(I Ok6ߟ{5EE/}$~QcM۴#kv֔KWh{nKTYC7N]N#Iz]QtkC k5|?tug럯#I`DM<f&]4A<$ihz?4txR$7?^{9蓭j8 n|&mgZ0W|~ _}*S@`?G:]pLE~ ۿ4 tɣ7lQq9jw;b!YБg yE Zv{ 쫋/@~?>bi~&[BF5\L>GQT@@ϠVVAn˳οp >*}+I Z~qbEtUP_&I1]eZhr̔K9SA~G)""?wߤ_*5mϸrbhgo@>Z= o1Ч4<~tc)xt:UQQkvwԤ̵<%m/$ƒd>3^G΃UxV*dM ^WjE)@új2+,W ق퇆$yj]rUH&Ck4wM$sN߫ϋ%GAEFqth#Žڢc)))jdVII튌hRޔ|B8u}dN-ǫӏwi~p&Y~A*rL&LLfl!v9^ͩdtE^~?lzm6uzR4 >Ju|LfLfK dCU `O08lk.vpl&]8mq:*ŏ$-/Tν9=mϸv#0X 9ЦSM&S[6:#Y6L23[ >㔟*ܦ!Md2Рx-/lfL 7p[66ͲZ"b-8]KCe֍ECGn[ʪ,Լ4USڙ٪A"bOBp`++-%--ct>Sf,,V,KNn, ^W U-j\I/m @[khG`O |@0'> `O |@0'> `O |@0'> `O |@0'> `O |@0'> hB9*-uGml6+< `O |݁:x TYY.](66V&8Mt\^^7|SiiiװaZ\ܹs_+""B=\kwЁu)Яj+IC/⺜Ng?C mٲEԫW/=zuye.\^F:\ĉ/I1c6mڤ2ejkk*--M8pѣGjm|K..á^znPllٲeo( zGxbc43S%;˗#GJOOה)StUWiӦMFrofhɒ%FtMPPPfΜ).`feee2ضrJ7iӦI GÇ/~F*++%IӧOWuu˕͛7uUVVl>tObŊ:p /fIi~9㿉'jĉz:tꪫtUWH۶mӪUЯJӦMSAA_W!nr=˥"g}؃6@+44fXx /4 f.R}ǒ[j֭裏4j(|rxW?Ҍ xm)66VǏwJR~~$iΝ;%ɘ,XȪ9 iԥKFNꜞx n/WRRfΜL_|+V(--MQ/Hᷞ/ pPP>@jر(Iu gՇy?&fIJu7NÆ SjjjODYYjjj$I'O֤ITZZ(fddo̙3'xB=w"+֫=^ziJKK-"(03F袋;3gΔ6<?;۷o_[v?׫מйL&)""Xhkr:JHHѬY:/!S^g #fYsƌclk~/p vmw%Q?u]JII$#l6~q};Ǫp/eTSStϨsڵ휜ۿ# =c[k :{QAAfGu].T^^ݻ7zx9۷OkBzڵkbbbڿ+77W!!!ڵZ}ho=!Vw*m6ZѹL&%&&\.],81z 4 `O |@0'> `O |@0'> htŪ5,K7fd{4 c`)@0'> `O |@0'> `O |@0'XۻvV.j,K{wUt`ۭJ/"˥JJVg\"3 Ng\"p,`O |@0'>nw{wh5t|#8*I_"bnSUURRRt=۽^nI҄ 4p@kǬoZ~Ql6{U\\dxx9M:UVUwyl6^uL&9spBI_mꫯ^{Mn[v$iƌ =~K/$IzեKS/++KCQQQٳϼ&׼;Z_Tppp 4He^okIgfii>SUVVꫯȑ#h"9NٳGz2և9 IDATc߆m|Zz-$w՞={4tPu]:s,|v@CԧO]s5_GK]tQJJ$p?$ 0@#G&~CCC5}tI֭[b I… 5c =Z-$mذC$=l6$w'TkQxF'ϬV5op К'K.:h{CEEEF߿˅jܸqqt*55UtGv]UUUZn.2Iƍ:ƌ#IJMMՂ @%%%i2dHm{^}7S*&&Fb }ڿPߐg}5k֨H]vՀt[nzו+Iھ}yqJMM՞={}J\.̙u֩Tv]_pIŋb ǫO>UTT38Cw^#GT]]~ZtWjʕZnk׹瞫XB]wTUU5b͘1CVk_7x7gzꩧ_'cszq!Ţ;%m5k~Ւŋuƈڗ 󍥶R^UHϯtTc(**ҏ?h|oi sd2鬳ŋkݺu?'&&j͚5zWj*ZJ> Ф-׫]vIw3lݺU[nmrٳtR{NNrrrtRPjjq&ǣ )((#<<*mܸQz)EDD(''GYYYҒ%KK.ժUݨ^FFF~GDD(&&F.8Yf}zڶmJJJrT\\zHNӨT-RFF׿d2#Y|/_K.䔅`??? 9,ͧ^W^tcy5*(oAXn֬5XLǴJ99e23| -ZTp8z(JƎŋKug(==]tYgI?**JvjkkSOI-n.tp4uTl6͛7Q9ǣUVIӧkݺut:k.=zg릛n2FHZl~  /Pׯw}'өsӴ5J&LЧ~LG|&?^7xcիzըGJNNVll>#^x2dϟ-[(''G+W4F;H|AISO=uBlnv/áiiۯbcc;v#iBBBT\\,˥ LNT7;!Qp%飘eeeZUU jcZ*++FBC555ڼy:ZS>}Z4毭[URR}rDfk/^V=V[ 44w&:f\`Wecy骮Vyyyf%77ר.%\"I*//7VwrZ駟%In?k׮5>l6qFjÆ M~'ժ=#fkmdnדO>i<&I޽f̘!׬Y(~ќt:gF#"@mPDD2oWdd1R}]56Vڜ`}99ضM111VQ׮]sNܱCɃiszԣgO(.Vmmm}ݺe*+ ޽[qqq'u ˝z-JK+UaoR k\}}iBBt5hPjj󟗩nb1i„OQQfNWfffF5$ߢ*&efb1):.ݦ?qrJJe64w6L&Mh91$''37| R[6M1110aFe7L5j-[4c)ݮD /`Do|>|l6+//ONzx~~$)..Q88p USShnGwzm׆8p`DEEXG<%Nevn*,,LRRz*zL&1+I]vU||$)22R=zTn$ICCuc%j???%$I*-+SEE=}UBBz쩥 7 q3=B͛ҬY2{zzgрtj߾rUЪۯlLIUZrnnyx#M;v*))RJMShjk,yz)?-՜Zd2);;[=z4OŻ<(ժ*''G={R=p8`zs52>77*c6*y iϷ gxànWX"#^^gnnQ뭨ݶ멘@9Mڜ0ƍ7L8U@47hھ}lb Çkڽ{f52+88ҡT*-[CoRԩSpBy<͞=[~?k{"f͚oQÆ ;j=3x<9sqCBaaP^^ ʕ ih}Y$ovϬ+I:섣۫Wl6JJ(Ťk}=hlfmܸ_snSDDV'ˣ?[`Unn>x1d6:=uA47uC9VNynY~_fFׯڵkxZox?o?Q0]p޹s&MdYrq\y7;]688X>߆[oURRR5cm;2͕KNN-bC}_c5y SKi_ө az/,TYY C"pn[˖.ƴ4wbWֲKeXd2Ws:$&&B+WЎ;]b(&&F;w%KF2L2H=ԙgjٲ}o.ɤ%Kꞏ꣏ʥi[+gWV6oѽR3g}wrrjƾANMvhɽ%I_}S[kРh~Nۚ/lhܘZ[{:4ʛQ\\ٳ٠"- }2.KCfGk@ኍxǫ BBZ`rqNԩȆBnFg @k=wTbaJ^[ӧOuoOG}OZ @ БßeG trz0p 7O\JVF0'> `O |:EZ:KϯVg\"[,vXVbwWZEIEv:0B0'> `O |@0'> `O |@0'XۻvV.j,K{wUt`ۭJ/"˥JJVg\"3 Ng\"p,`O |@0'>nw{wX,9F> LnFUUn6IE]_򗪨PFF$iРAoڿ4sv$eeep(**J={l~@Kz|֋/(Iz'.}x<^}]ٳGC]wux&8~LFzp8TYY7t<ƍ'z-M8QcƌQii}]eddF⋕"Iڶm>cL&]zZ`ݫ׿l٢oFEEEJNN_mΝ3g$/7|L_&L%IO?k׮ZdkV^zIЙg)SH֬Y d2x Jo߮^wqS222vիW/?6׫[f6509Y]t9[lQEEFy,^3F0EGP[lфs1{mڇl#8}[ 77Ww6gffgϞJII/iPFFnV5J%%%ʒ$͚5(O?)##C卶UVVoqQ3K^z&M$Ԫaxu7 RLLmlެFV@@)ϭsktz#cdk}-%eksrd2)>>UZsBBBoJ[s5u]h_Rii{=5Q=z҄ 'p\袋4o<9mݺU^W&7駟h"I҆ Ԩ\rr:,͟?__iӦ~Z>տtMZ*EEEnO>ڰanݪW_}UFuW9riѳbbb$Iv])kszڹSGb#ԣG덌zXc[NX-({tteIRDDU]]}jڵr8nTM7ݤxUWWkܹ[111r87o$Z~1[߇կ~jxTVV֨lw-ժ1coFmKTT n?4nASLQnnV^kW_Í`Z5t0IRYY23eefju7~|uz<RxEFFj{F2oaTYY2'$($$D32kNSYYYJG~~~ܾ];wЀ$v,$%ia6iqkt+o_Qƶm˝z-JK+UaoR#c;mT^^Bt5Ɋ Tff^yeκy3 غX￿U ꢋzkDIu6)3DIv6;TRR-٤sd2iģp5OBII/d}cppPfffi=_{+S6^]/..lQaaY0֭u3?B>Fv]~y?__>ڮ07HӎJJThRSޝGYΒ$=! !,$Vm=jOmk|Z[{*-_sGn]]!% {2d23#1@e2}=3p?v{Y/0{Ԃ3&UDDDD? 'bt:INN檫=++W@͜9:䮮~FzwAdy^N'+_ QQQ'ݦMMMdffVZRBRr2]NgF:8lR~?Fc[fv&##*ZMӐm=4vqÆ9á[Í~x';wQRrsLvIZ$<۶Z,TU9|?ne̘xJK[?>_"0 `$ڰXLoq2s{EDDDDNh8̤&󉋋cl޼ȴi>W.,%555k. Ye}ڃᠸ&غukOd2yf233={vXe`Gnoo l6[ܣ= jF HLJvwnkk`0v΢ҒO֧ܳfZ黽JF䐝n]N9:|9:u-{l1@MJ ,VU %nwgb1aE`Eph F`{ F1w`nI]`)Ö,YW_W_<`(((w|㡇h4/_1c(++nswWTTį~+/^|@{n8q"3g ÕJ™Eaȑ8Nv QQQl632س{7 HMDBb".I{{;Fjkjltttgnwiii464Nbb"sք pAsN c?TVt%..`Ҥ$V BdݺJ""gwhjr2gHظ׿~Fvjx IDATnॗhe*},^<Lu^;Hee;ee_@TJSG slƏOII NZ.\ȍ7w<O0h g_KHH 666@WDD?O`TUU{.6m_|֞0uwwk.<ȢEu'2nx:NJK)+- ֝_P@RRݻç }NaձnMMM~PhdۧfSETToۆ`h42q$V+cǎz 9ONIjef ``W~F1U81}<--.hh4k$55o}+9:;{ʕy=F3}z;%9Vj_|rSFDsMj_G""""rj6mcamMr8\.bbbr^/tvvc_nJFFimm̐M>vwwc1](wfƍL>sEGGZT ,x< hm{{;6 шd2O0M| :::z|dЉj;xłlzCywwx|!{Y~?v;8څwĘ1{DE1{.2|~::<~GlllX;D2H111d ˊƧSBBB5u~l<۾Qi`6uφP+!_Hm7La'}cȐ ^/{bٲ.tLc K_99ԗYZzzXC嗏ᬳ!77 M9վDK.\"#MLz .y ]W`ٲ>1c<9*q3ɉ{7$2bFƍKf)Loe\^rr⩯ ''n;?'9s89bD2-]qcqy9=v)F33;6E_.e.)Sz^`TsȰQZüzu2oY=鋆@fiztttr/u~&JJ{Ω5M Q } Gk8bbhl,ϙ^_NAk2ǵ6cG;vԱdFcd]<_mDD5*vPHI 66VW- zEDDDDDB=!lN[QYCsK+Uu6PErtv12# vE(- 1?NUu-%e̙56;dpt`40*uv7?H/Ϝ9ӲZPm׋YxKVuޱj^eJ,_^BYYgwٲ֮ l߻ jk;R^n=>֭5B\\\ܾc7NgUZ6oɪ`.?+X[|/~{.#*o`m\r<.]HcK.|ޕ+reW:?dY[W[oW`҃˗a Fa0-5nY<˗eGfM <–-56mgt0zt."""""gh9M6lf{{{Xkmm%!!!mUXχA\HKKHJb68v{zDE{*ݍgRY#\4mfS OD=!8! 'e4OIHL ԕ>SrPxb{4_9!`я (+kKFSEDDDD̢BbbP "$h?YDDDDDDCDDDDDD$CzC] !u """"""f """"""2,(EDDDDDD?6P"""""aӪDq:pvHJ[Cax<^'$$0sukRp$&&hz`6mHZZgMp NRR0 |^_OvvrN9=CHHH8ȯ! 55'wqs>Ȍ{TU;\~zx|Svƌ㵈SvSGmmYYڿE]]&$ \󓟜ù}=t!EE~Y=Bڵf)Nsl>V^ȗpvS TTɞ}vja֌sHI\8#OmrYHGZ~=ׯ_) zʊ wV}EE8sRRR`qdffPYYɑr<6ɓfP_!>>N`0ʾ"IJJa)).tbX;n\XW5p:5k8c|Ua0 j53vl))goщs>zrrIIQsq>ˢE5k,YDDDKK8Sw.b+hwt߳g}b6?w*,H[xꙗصۍ%2o\tn7Ͽk7dq:\S<3/S^Q-7]E{S/z).=Ĩ_;w'I6PWs눏l6ҫoa4 EBʢ:V+]k|·x ͌+S&ꍼ[3#Ux>s׹`~ӻ x`N=^K ++#ø㩫#wD~?nz&P_OIqqpaҒFff(>xNtb3Euu5O`tNGYBl11L?J.k]<JJZzL\.͖-5/h40gN&FŲwo#? 7t6^ډ,\8mjyx~[,-mw`Z89s$ 0d?Nll$f|T&M Miksqxw<.-fZb,W\1K/Žڞ<9/k[|o|cnFfܸS;rEDDDLENo#;v{lϱs^̟֕;ח?z6|-7:"^q1Wf"..XkKHII&5ںڃ$%%ɦ-;٢vN>7n7^NcS >?* 'd2q5b? /K١#jǑjF$ʺ <◿e'8:;;d21qD{v&66'M"--) x<7: FTT#xLjj*999Ll6p8|>9\g٣GO\\qqqxްr]SAYY+ga2]}ȷb Pa;rV&)JD#0:9JvvNgwbc#@u$&ZYqP'`pjWj&*ʌFޡ'"""rSpw1}Z?wV\n޺qcGSWw,HYd }|g7a|>^};1L?ox~)6[4q,pE? fiL(~ojMޥٙL0vqݎOo>ʭw[4/z]w:Nk{;IcRxeW)ċs/Nk'8==܉HMRROl^HINNR~?F㈎_d2hlhd2aZ]vqÆ`tc{4ff>FeΜf6O?]oX*++ū7pzĉlZ/~1v|p;eeFgO#GM~%{{8WϜ9̞=^;11DP^n[""""g2l/*s4 sIBLGG u+#R5gN?'mnmMCc37x=M-$'b4wg:1wI_%22F#Ow^VK'.!nURS |_g655r0 X`Z].TWHAAII !l6^/~@gggZ۩dtNv>ٵ+l ..3gf械r;v'|zM<KgO4TLJlh4v7ݧqQ}]]2PtxGPx/{yݏػY$Q]SLjd2Sa-mp=7x?PRZddsiljᑿ#On#Wmݕq>Zw ޳u> ^4)𕉎RV#O.U5, \۰M >h=O<"SϞLeU -TS[}%;8y7o^wuu?Áh^ɝ8V:tOBGG&D\.9`Djj0`wwwSVZr?7/+s92У֯ߝ̒%pp[p{TT>۳'po_Gٽ;~~9Sc?,wߣF|NwsF,S׿^w ˵zrr7-+ᩧPR҂她7,eV<ʕwG9۷[6Z ZDDDd >N4nhox`qyu\|\~v-_Ƀ? @t끃~k}ɏ|j#+V!=m߻DFFe.oBᔼ\Feevߞ YqSQQV,9ӹkW,=x/gbDe'=> `\bD lش)})yX8]T9kٺmm!h=}9EGGcX,*+*ؿ?{.mY@zz: X,Xv-III455QZRF##GRUUEUU!{SRZlx1 ܱ~'x\Waa#sd_dI11|;)ϝɚ5lTh ''V cnq(X,fsp^|E^]C]DttYȝL&#Ng7~Dkcv7{UW;0{lÎy rs?P?]khHߡu*ቨ8Sֶd7Y,esQF1,`?\ɃXq93#̛7 6|a C?@@XBX9 փosg=˗rEuZUE7 |+cO˹kY _WDDDdCoWa>WԷy1o޼.<(,ϣq❇Hff w5.bb";6!8yFCG=}L{99C]ȗ@p*@|Q]DDDDN3aVaACeSOB?BPhEDDDDDdXPaAXDDDDDD`EDDDDDdXPaAXDDDDDD`EDDDDDdXPaAXDDDDDD`EDDDDDdXPafyK9c)C]L\gD6LDGG1w%DDDDDDf3јL.%,Θh22DDDDDD 9`EDDDDDdXPaAXDDDDDD`EDDDDDdXPaAXDDDDDD`EDDDDDdXPaAXDDDDDD`C]@x^n7C]l6dRztvv*Qww7xޡ.%,Έv3֙Έ_SL\gDj IDAT9`EDDDDDdXPaAXDDDDDD`EDDDDDdXPa<|yޡ.Ad2 u """""`%vD222X,C]pN/k0y! KbŊ^Νw鸾Zdʔ)ao_DDDDD? !^?WTT,Y! ?mÆ TUUq= q}ׯbcP4'͉Lsdh4ӟ~;3(>̦M/E[[gKSH={n^O=^x!gϦ{r;v,W^yepy0 |k_wȑ#ruQTT{Gcc#yyy|fYʕ+?y0i$-Zį~+/_ٳ),,dҥ??ɂ HHHy},]WUVXAqq1YYY\{;~۷3bn냽7plܸ|QFΎ>6nŋ5`mmmٽk `4}o".X}EEtttpad~֬^͹Ӧ {:9~?"""""}Qj>ѣG3e=r-̘1JJJӟo8pN>k9t{Tzz:yyyQ__@sssܿ?>\:;;C^ߨQ۷￟{9¡Chjj t::KKKKp'|…^gv\lٲ?2X]]]ڹx&Ol{)**w3??dx ??}m|O0 7r޶6uuLDDDDdQ O<zRnjK/ HII'̘1G;999\pv\~,]ξ} ^utwwcYkvv6EEE|>No'11-[grw?Yt)k֬!""ŋ g?g|#G|'RVZ`1q{B<&\Ffss3%8N, cǍ#555WUFV"""O\\n"Z[1;̬,QYY'99ɓC~/@\\g/47wQ]w$""77KYOcv;=ڹ̤^z nTv{prWWoFh ~{<;OSƎܹsYh} 0w9 y>sqqq<#?3&Lyсf59zd."##ˣ"fBl11L?JOjj*. N\\yyyfq gg'Q\\LzFuuu323X<Ⱦ"&OqV7~<+*2?/ϛoz#FDs)(9<JJZY .߬ +7 \p(RR`46-b1ryy}lVc:sg={B/h40gN&FŞu|miiG鵽GC(: ##{Γ,..!@ 4La۩ YS]]]T<8Kѣ?O0 <Obᮻl6pmtғ~LSww7Q<*Ǵ#""Y>=:CGsssUϞ:Dƶ[b4cDJ ~#G N^4 MLJJ L&N:V)˗ɴiil^Cm{搝 Eb/'++IMCUF'.ױ ;W\1'7V馳yC__Ijj4&%qc?L}}'|`UAQ> Irr2W]uUYYYY3g$##ǹ222픕#tvvW1bD04ut `?F#f989ƭj?^K\\999V58xmmm4׃dѣn6q\}` zM&S8z\v;1ddd0"5ۍdU6B 5<° ^.g. VgiSu0'&ZPWu*<9o,`ü`픕h3u|~V8ha69,{-f6O?]oa4j p4effRRRBSS\z57oh42mڴվ`. __8px^ﭷJvv6 <`{jyfJ֭[7;˹k9pBMZZ@NbƏϪ@?SO=ٳYh'K[[]]]X%Ft`MbRRE۩dtNv>ٵ+cZnfΚ墪*R0$$$0)/MW!%Ÿ\.Ϙfc-'5=XvuML oqqUU |Fl G!ryXLL;''p4{<`]"""""<@[^d W_}5W_}5< 7=`דό3غu+---{ス=z4\r plN+ҥKy7B{?W\|د9|>~{p^qyy&L} 'k̘1TWkNcZ9R^N{{;gMBB7.띜\pxn 8v3PYp,|>IMMPYhm݊-&w^pqw3f 3g`ԩ̝;7q饗mƌ?kg-_z/^|°<fSxx6֯[Ǒ#GMRRFTVTv8lF#RarJ V-7nZL&;v3(>xaۙ8q"F1chlh`ڵl޴8lfy&<OFƚի)ܳx g= GSUK/'66#?kG[x2kb̝֬٣Ξ=; I>{v.0-LeΜL ?R\e ΝbbӦj6o&5FFF:  1wy 5X/\YELLLp륺N233TFIOOsn臨~;lO? O/x ׋ ~]]]X,7U>Pnbc{&1R~?uuF}t'/1ry^|~qqiУDDDDNpLE<ީȆ'!Ѓ+@L&F`61̹/ǢZ} u}GY,~{a###O^^|"'Ndɒ%!v8Etdd㣎_ /><)&~w}_ =UZƒ%_v٘^wh3n|a !!_? $'pݳhks+ 3#a)Ǎ7>2puر9O))) u""""""aY(HDDDDDD4UDDDDDD`EDDDDDdXPaAXDDDDDD`CDDDDDD$EDDDDDdXPaA8.ADDDDDDL83%H)8%  n }ݟؿx`K+M8ȡ.!|0mߎ-//{8\^mu|NN<#ZH(.(999m~j/qc9\^o_łgqv^Y6Gڿ\ KHNJ0S&pӧpWdM3)&55ILZ18WUG$&&ǣ^Bkw)`׮z}FrcX>*g̘&ON歷Jx|y rr 46:4qy/ػq8p(na &$en.x;ɉ;IDDDDD\#mLsK+koeܘl\.7O>Rp*FfqYWno'=mUյ;:HJL`˶LV[g5r.u+wr㏊L&'T.^؇d[1aB>j~Xy,_^ܞngO/|#ctt;DL&mmLOtvSX)ubE h8X ӦQV֊!-6؏DDDDDDv{,2Gero/6f8̑iXJJ˙q\~38oPS //'*Jg8tں6o0f#&yo, //?y!^ÓO^c]h` ƎM`Ѣ93yK<9cʔß,h.Z0KĄ@s|5.ė?)iPL~|q- Qǎu,Yr>YgFFyRRl jPp6[VTJUu +`oA\8]H%++@aJC(SU] @IY9sfMN9198;>M8/F`b  ..ŋ3gN&--Ŵ=mjxb/Ē%Uw쨣ځgٲ`-@EE;˗PV]km:q9@O6uk͠GDDDDD/6؍Evj&>X +;_ 򈊲ƛ+xXq\4E9kow#3XlE7cg%k?0wì\Ann'h40~U[DpX`p~%DDQ eK [<%DE9QYeKMmj7sY|A955Gyyș?pN 1wZ[[IHHktzU>pt7'Ettmm.ͽ^^?QQnwxٽTV#`2 w[DDDDD.66YTdQpNsH GS~uFOd锜;'Þ= /$GWDDDDDNHXt~Za#+9(8%H?l{?>IDDDDD?Z:E/&뇺 3^P """"""a,""""""ÂpC]ޝGUgL,$@ (jmkmUVoWZzkju{UAK"IX{&df~@`|{ ` F|0Wh&$T} CI`!9M 2Ԥn:va#fH.[\p7 ݄A12y)[]1ёvsMށh4jC<>ݻWQњ4iҀwڲyΛʊ YVC)ŨY9֚55vl"#-g<`O?.`w2!V?]zhiޯZCF'%\sUee~VS%Ir͒#33SWڵk Yz- gwŮcN\[hQ~࿻_%[k"IҵfhΜ?r@IIJ@Ji swj'_PHHW>׏QDC2+O333+bB`PXXX孭ݿ_'MRbbT\Tg)<<\ V||fdH***tLCʘ6M!!!*,,Tgg:m6YVY,͞3GAAARPHH϶v婭U&III0a  [z\=ڪX2}֮-ҦMGs( ϙ}`5bc&57wx$ȈӍ7N?[8}ZCsr??T[UQ546WRvNL&.^?RKZo('7_.Yӟ\-RWW^{]m޺SOPIiO ISYynJ]l>L>NhLg<=_5vhUUשNMr"#tF&Qo .tBC<]tFAAAzruWߨcj)d{J?FeG+tteKϗ$=_zI, 6m(ܹKz! CeEEG+22R!!!:|萢ua(88X6M8iJKJ(jtrbbbt!9|XfϖSuuWBBU\TiӔwl6ƎƆuuulkA~lȐjUiij׮cŽԨ[QݻW/IZ -Z1cޥ!éІ e*)iѼy ٪VWS&-Y,Ir+S?>Jyy<9F?LEFZd;]#IJI W]]A;Y{V3٭78tm$IӦ)$Ĭ'Z'Iosu;.k*j jmm=^Y9h}3*;'O?tݏ_.Izy.P?"%2 IDATIZa:ŏ}M%jni֩pEFXА`Y%I1QJ4^5ujii%&&JVkvRhh͙{??PWC/[ZUФW^{[/O(V||ƌ̬/2SqqtRvH6l(oZ=:L=~ut8iQcbք Q۝d2("¢vnԤI*(hо}Y={4jT&NVIIJJ p'!!T6[ۻn=9ScF(&&HF*> EwO%I6͟7Sz%}~$x]{5!mjj[~#%3hzFV,_ϖ[X =2p QdDV,_G[j1ٍ?Ҧ-+H&+==M{wkY,W-ẫ_[o_a!ZwaS^7n!Izww(*2BS'O#>]{tURLtqk͛kPss"Xdyqs?Dޓ@y"CY   \gXzPX!188XMMM2LjinVqQn C},u6Lp*ۭXOw󀀀^l9A%է;rXgr]E&Ek1{Y^8 =%2F}˫ל9 /\f/9G'g0hٲ1*.nʕ??I7ݴ^G4jӦs[,F֥s}e?S'kE֭E1 &N֞=UVP?"BCl<:6&ڻjT|, $]ww5*jΟ?G?qh\ݗF/+UФh?4RtKq2zZ`0>vxZ]'I  {5K]W_-w /"]]]U@@5v8޵d21k̙QQajjjt_lϾ@n:xPʘ6Mڲy]kS2kaZ2CըIVW'Xou8\X|{x`l6`PwDŽs=Y~6jOuuvz~ں1xK444 1./Iz郏6<#JѨX%%ƫJ[3wKxc~r3$h4hsUФ'~Y[3wOgcޟ/Iڸi>XYv;M WGQiYV\XFW&$8Hw>|AnuvUQY6I۶$-8e'ӆO2 k$IgMSEeuV5u*(($䎎s38/^G4rM]Z|$;;xt 7 duSVuw%Oz߾^ZZ'\w.F u|PIĄq6ɧ_֔ jniǟl.^yw_$Iɣu5vXn}u7J_\Iڸi>\E t+00P(s^IҚ7=ozdIIRWWWey x& RC Kt|]Kse+=eKϗ{+1a.^k~p,@mܴ]wӌSz罏euV={sy.IӞ1WL?'iӦES32cǪLɞɚNm*`|ZvjjjcbbРB)??_;oW@@5WqQJ :tH wd,TP >n6NV{/N֖-ڹ F*))Lee-ڼl 1{Qeåw-ܹ 81J~ypeK7vV-]@mX&-å߳f. 3}z.MѶmPXY[_<4)(hPAAƎPJJxf%3+CV]{J@}^-^8PvNAUUϻ:.l6fmwv+(n6[ lns\Z;~Ncjmkw{mu\ZNzZk-8ibcc?YZ֦P uuuh4 KwwVO8n:ggggK:|ή՟vLVtjuh ШQ!>3v)<|ZTr`Od)55Rwܱ`@:.tzqM|z.á SqgjZ=x~4}zܠot " `F gYppPz A Td4("s }+=z9g/_rZ-J&샯.7\˿Bd6:.e[tz,Y%K w3ݠ5>TG* @y^t* C_>S+Wf(# p<@0] m$tff_ 4pTB`wR0 `_ @0/~ `_ @0/l2 0b5"p``p7FFD6 1O%\`2"8M#&1Fw3Qd@0/~ `_ @0/~ n`q:Rwwp7Fɤ@nʠ`ө/ nutttwSň]]]FJ/ FDd@0/~ `_ ip.r:|En TnhT``[CAe"O=v-Iz]G}T@]v GyDC)))I4}t7fӿJnF]xj{uu;@M>]oj2zgtS'x|Z` 999pNNNN>m].׀/Ţzwr]r_%:^*"0c  \.eee/Ζ$%&&*66X &sV@@kŊJJJ|„ rl?y=?"`24{leeeXCfYjnn$-ZHT^^5k֨BC1c.~Cƞ={TVVӧkĉRk:z{.Kݫz%$$hɺ5zh[N;vgc骫RQQnݪP͝;{7jlVrrZM4IT\\_]tW꣏>ґ#Ge˖iΜ9}8|M<{3ϨZ_|jjj}vp Ѯ]4a>PFFuww_WVVI&oTTT$iߟL^Zk׮wU]]>-8| 9H : ;pkE a vSs0rh"eeeI 4s^ݟ.\f{スۿ߯V]y>}!UUU)44TTVV߻g^zI[n~_QQ mݺU?ԫ-˗/WUUJJJzU׿jÆ JKKCnӬYڪBIc>NM2WKKKb(55UtA555^vVyyJJJTVVmׄ vu{<ͦ\qZzD233+bHB$7~eCrk0G}{.Mѷ=yP.`[Z쪩*==p?f͚3gz?+..N~wnMFիڪ~ ,ԩS].K;wꫯVVVpD/ok˖-2z^竭x]}jhh[o%á^=X}uk߾}ڸq$x/5khr)::ZJLLl6kΜ99sm 3g%\lmذACon~?Kz! aaa}9Nٽ[њ2ul6ӄ ҢnS5{fv*ɤĤ$M0A *..Vhhe04eTv+?/O2L'u ?_͜5kHJLJSǎpPM;(W֮-ҦMGsa24c ߿_999 K,$͝;WiiijooΝ;*I:$IJOO7,IovuwwSҾ}::: \A>w|%nPFF$O0޸qZ[[USSkkVSNԩSi&\. |=?3Z;[nlVFFrssU[[Z|2C˾T VBBTZZѣuBbҢC*).V*ϗCZjR**,CG^IIr\YnnnVmm&L@竲B)cƜ\n][͛ݡQBt5S4s(-Z36v뢋K<|Gî]t%I69$!@%j Y,FNZaW(;VyyfA Z(YcƄuુ|-ܬ={x.\P?I}"yp^ UUU_>Y}~>SLVw҆N﮻:Ǐ~ C֤^Azԩnwߍp%$$(uxUUUiN\.ΛFZ,8lݮʊ O$*$$DFn\$iy2r\:|$VQޟI-1m!Ѩ3Ww-TDDKо}5iժE;6Bԩ wo;0M=**jVkkO?_孺4ٴcGN~YefV(>>DSjǎJ9.lRvH6l($EEfϞ/JЩ'|[̙3OX,uuuǎݱcǼmHIIe]>U⁈~VJJJsFFFz'r<,]ﺉ'*//OGc%)44T]]]ٛ-&;۳jUZBw^?&IGVށ-x۶ IҪUez__3KЖ-[vUXXbIҘ3PJ?իWkɒ%C6/ PkkkHӕ~Zaaa(yfR}үkr->5fkΝڽ{wo~WeT>/X;T\~Z~\.^z%k^s4C~GDD*+*d4w<3}ZMVUA՟rv+٬bnoe?qFVIGtMAAA}l UhhezUO̙̬cӼy z"I:|QT\ܬ>ROweNP#55RfAMMW#j>ܨ}m&LRQQ|2G3f)'Vu.Ũ`ϟW^S@@rskuM5uy/7={s||FK/Utt$)77WEw$ϤBSr˗Fe+V}ddwZ_w},X(755uqqLJK/Tz˟l ]fɾUVy~ nf,ԧmlT~jhhPIIiӧn{_!e0w޵Kn[ӦOhT||uUWW+((;ZƎ+ۭ}~lY,j\jZZZef3EFF>:U?X1Nmz㍃ ʕ1clUPР .ŋ{ٺ{}ou _/Ы櫢M˗$|l-Zy:rI\2[^8YQ;wӮ]s<FgY}^-^ݨgwNz+yΚL~g](ժJ%''{ev]7nٕ%vEn[2/RfYɧ]=TSS(%&&L^v{>,L&eL} vn鳢{<ۭ6;#y~m6wugggh4ꥩK_hT3ӳu'GuTiv\.{<˭v""|Kf^0@;qPdÓ!p,=xIa'mZU^qLͭr\ga`01)z?,Y~ `_ @0/~ `_ @0/~ `_ @0/~ `_  KwMIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/separate-openapi-schemas/image05.png000066400000000000000000001310621461403617600270320ustar00rootroot00000000000000PNG  IHDR A֕sRGB IDATxwxTUwJz%$zAYP}wZk]S7JGB]:!=!!N1d`IByxs=3{nY!^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+{ڰyvޯԴ,f7ؽFB">F;U^]OϭiOLeSQylvk=3L kؐyz^Cjd Sa-\Z=1֌ϴ*(;xFB[6OdqF5oVè4n̈:_ZiQ.]g5+In֬yKl>-gѤmؼNYxTZV^~CCeUXT\k*/vnV|\Lˡf|1X#/Qv/KҾܹڕ>"*.d$iolVrk:P=bS[Uk{J:KRo*lŪYDd6gwҏhRX&շ>>jQ2JJGp^~4]\-ͦSLltTn2IV~>_[=p՞U]5|+<[ۜd@YmAQ#P&u׹T_o:FMn_l$Ok[~l(`PV^4F>zs $ZhXnբ}hێ|}|W{͆;j A oq]?ҁU\>!|&ܧV#ٓښh2-/^J5^ztΠ~יduz=ċMlڼ= '5q4~|}}1LG/z;iY5mrs˝srde02-72L4.<n2NdZ *2"\5Ս;pKCx֌\mN[5;_[?$uk~$jz:#qdIRz#=tאϝYĞ+=k<}*E k~pbޜn~Oz^qn?83JK*q[}aQ "-Z6WL<1gէoUBݗ_WAZm6M&XXbuUTTD]TR <ޑ˹]~ddPlmID+ץʸ"uLm9>;_[CuL/dׁyUn\UZKtx$E2<[$V[e[kPKW$f֜ 0wϽѩڿ~vs^u/Krr9WZ3$fTZjm\d6cܤVqDf8ԂUi-$ ?AڹZݻuR]\ꊊKM[{f]ZZ ?oIWBkȦZGvi :/"fY+I**.xM`~-\6J_<w}Yw8&Ir}y>pvJj P`=2Hye4mh`ymܝykw+ ^!Il ԧlv+ _{:df҆[v╧ǎ>_'x`rz?JNIs;oS-cj 陇ԮM""$Iq2MNIWtTcU\R=VO[*4$Hٹ:.I2LjB􌚟Mn>6K(\'B&zݠWU\Hkq$fWyK"l|͡]5(>t :EMRH+h6)hR VswamVPoSaylJ ~ TOE]6 _p}ZA[ڳ3DG*.z Gԩu7jdHJv(.6FzvGSǶn׮J\jӢ%+gc߁{+""q,Z\ǚ3onz kBznqϿ%U_r̯45Z|xSJq]p94eյn@C8+pQq^{͛eehӖթc;l}zF|#-ےRݗ/sջg7 9<^/I|:͜[]|\s1D_Ns}eMVvm۩=]Su~w^]pjgK4J59;kZ7]$uHIRzA 쾜9+e4oڔ6U3_1'_SGN[ߓwW~-}Jfwڵ>]˙NїnyӬp+^& i険s&v=^{FQ.JKtx\[M[Gk/?)?/8{%>W`yrn,I .?mhZ}m5j`4cAN'nT6-UZZLoo5Uk6i՚Mn/K`J~]%HVQ#j^}^'5\VV&=ؐꮜJ/X\ե+WwdMӎi }TZµ*Ik*|LFZGvޕ^Z~ kc?+Дu@W'~$/tPeOh{N 9.RRcl$1 ƌ$^or6v|]>9Fӯ]4%M.g*-n3yo{>}:.u5hڽOee˻ݢΝ;}zuS~K4ee(&:RMX1_jݭy?t8/߭~Ý:-K n.*--S8K;vx]qcF(>.gCXhF\.bC=|& oӞ(\Tf4B!!/*_>e&MRg2e2$ݭyæmz/k/]Ϛk`ЯzG;QJRfaޭaCye^j.5촍ު槭 | N*L&g---Us^عG;wuM۶jSKq,[I>Cۦu:vhRg6h6Vll:wj6 MI b5}{Kٽ*+-ztϝ7Ᵽ4g"͛N̞Ln;@}8qe+Oc͙Iiıvh,gU^r]c4R>κ P۵w\;oN;wզM۵~\.Yy'c]JMPzgMڰi[] ɭ~dU?bq}%M]Կ_/uAW]1Aڼe~e.__uCZa)qEKV/W_Z}@Sw̌,$Օk5g0W?٩c;}+β޽+nq[m44JEKXߦu:wjWcy.TW5g!9kpH睏[K'],7WrJ6yܷw}]_j%\3tұNߺ}:uj綑 =7i@^5YRR?]g4ڽ_:lp@DG*+;ǥ~=ڻ5th5j=nX^}}}7j׶s^Vz\6M۽TTIz^=wѾw_[ݽpl~[ m}b!S49{AW22ǗNH={tp^mآe+ EGExI*..jip6c9 ]flwV[nF -~ڷ\d6cYx %&:RO=~2>"^ 59gp?yˎ:gF `}N~U3}j86zU\|:utDju.6_{Q!00@uj=wޠ;oR<,OnJDp}ڍヺ3͵s9?k8Q?g}jJIMWeE͛GkҹIYZZ=(++GYt嘘H5VLt:uj'aݮeg稤L>f\'=N6p`Cx0+^ `W @x0+4Z~}A%n_gWOW{ruA#p2̍uU{Kufu:HņMPf>0"hgQaMCh{ZR|f1P vk" ږVP.~/ eJ롋"Ui0M Mڤ }uyᒤ_65*,U8R |Ƃ\۴P2 ,jg'G+,i)P.ukz\-]"]>@^)Ñ}2_ezr|"|Ze6(Ot0ע{JտvAs+eɹ.}J*hվR-YFAZDJ-\-SX?=~I6dUhʽjG WNE.s_f ?2tW&֢?Jd5o԰fQ")13*Gw|r_WαP|%PU ńupMB:p98q}NU36Q/Nέ&VtYuUtY,SQ4Z`f`N$)<ФG.$mK+Wzn5x.,)#ߢQ]Mb| ?:oԡBbBM 5H m7pU]F:=}IRY]FmI-y%ɠ ߣ'LfUYIqa?SH˳F*( IDAT>`hxMų&<3l&U mTAk:6? 5)-lg6[Ƕfş(Chn3q@AmNI,te<@x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W @x0+^ `W `nɩm gyԲE)w_LTzF 4o]:SDmܼ]knrKO9˝;?lj=ċ.u~~lݡOY2"g>e+.;J|p8އ_5dテ;&@ ǰ:,DGۯWV-qTpF)IZhQ#1RT^^t頰А:_[XXm*!^F_ee.#肑C=YRR eeRpP"<.Zt}d4eݮ}}= Nȑ#xb籷&-g.  ڬ;Zf۹޻ol$x?ghЯ!IRFf{-mظխτ5Ᵽus]ϪOnu};O=v.u^)P|=*))u(00@/Q٭xh"-^XO?׆&Vx۰ܪZkwާ{-(Vi\gd'P``=-))Uqq$)==Sr}&Vyy&O+I+eWRDZw9rW&vomlv^}}صszoꗒaCky]5CԧwwI%+] }.s]kAn٣ f {r;g MvfHz]>eKJOWY"Q۶rGCA-wR {N]]\Gg$%Չiv׶mR~Ϝ۵Zk䟮pڸi[9Rؿ8PHt9_6ߐ`W:ݏ3kw]K?pj3>fnjGκ{%U{C+9%M4}Z|U]ݍTkO\lKOQaa$hίܞYK;ur}5Ѫt rdѽTuIRlw٪KҤcmw_3;C|,??_=}.up g~P>>>[N9fӭ47JKwl,z']Fsw5l }G_}u3b@^x_Jh$00@z~.~2y|7jınc3zjhp1BCu{lw{ñM\~~عWVM]tP:_)Q\lڴIPhHpz`Xk>eff+.:vh#S6ђ$ͦɩ*)-SX3pKcVdd|}kos`NE^ @}!@x0+^ `W @x0+^7\% zn4@B/Ig& R`eٜ``ht7dn\vV,VVl6<SrFL&L&fL&ӭAjUEEI#ǨJkCИ|LRHF.S d25Xn]2bZMUFFJKr>ҪUz/KNnWTTjϞjӦj'l}jk)--ݥ.,,T{tSttT} i%JHhۻ[dBCCէoz/Ï9pf[_yÏ1] 3;')ݤJLuM, jYuZmMj~{kZZ>}֬YLs 5mvjsT wy_J]+OXOn?,I7n _dR^V['H6v#I Ϩg7XIsgy ڪO^7on٦qoeƼE?fƏY|l1oQy] ; Aڵ`l6i Ѡ]J$*,]Jɫt+РvIɠPי[bUqMY$5p?C*..qR\\r:n`Ƕfhnbv7oՁI٫whWqGnzG傂]s5kn*Wq3ɨk>Sïԓip `v IZ7On&mҦG渇;=2Hhk$I-՚ˑ624'wڣPգgws;w҇| +Cuںe/IJNNъKbccվ}[g[ժgiE:?IQQ:_Rpp[ٳ*",mذI mۺ].U\\_~+W$)((Ho{?4]42BCC5h@:_~_-PII osY̙st2Grd -(7'WUIii_*Qb_UW_+L%}Ň2OsP/ gz07 0Hrh"}d$1BWgCZx4sΏ9\]tҧ~Vm 96W$I;wt[V( @obuP(55M/mߤիyL4C6lUW_.___}Ȕ$mܸYԣgw]+uݷieJN%INxJnÆM57ԅ颋$Iw8g=ܜ\DG>>}{+//_-ZjeZڰ~$顇lVtU:fռy?d]^~ ke)1c/ԅGR_OGWYYM*--աC9jLzF]0B6]_p|tƇ_  ۄK>Lض 9aI;2]ٛkwzz͚9G4i )4fYvG؟ -nfzRr=K.|uA1c$I:SY㻯8{Ĉaڻg/[V* @{#X=k4jTvN߾#HrRimz?h̹xXji߹!,1c.>-zXӷ& YZO3_CED}wռ%IXn}YyÆ:?ɹ;nE$jBNT۶mZך5SKrtB&鍷^U6$Is#iɒe߻_ފ_8T3-hܞiA>&iWaLJT:3…KTZZqUH艿X~~ڵGVUZd̞'Ij۶$ mݤG{H>nz%jȈ'/?҃+IVU~G`ܰ3qfO{PG`W B ~^45< Gp5) Z&[{4g?#:;@MLAnJlԠK f* , FX ެ"$ؠ!A`p஑6MkiRH37Tn`(٬ѭ4}]+2 ޤ"8(Mie22\n7čl6V***t O9FUZcrn]6ᒯL&S v]v]VUEVUVU6ypZl4e2d2;:?[=!$5,6dڊjKkoݵ֥jݭRWhpc @aMFBGȐ$_ý3g93 <~9#*ҦS,KGC5>:C}nE4שk .kr%n-@0/~ `_G>`2ٖ4|>?k|t~&I&IfܖAp]xlvkAII bS۪i@dYpAI j6/(jV/|QyPEhBteTlő=4hiǂ6xFn+m%VzM|<]rx]ݕ3B٦ u}Ҹ tx&;BoknQ^qplm:Xj.vp|&3q:Lt"$[Qn+,(q{ڡghΟ~]:ffLvRǦ/YSʽ:=:kNbb:^V8  S;* yr([zzuk,"IJА;ZZ?^|SyrT;`k/+gUʠ~qiէBB۪'lْUZN'uūknW*{\4Qq1ӓx'_묳{nx1e´/4~-:.xx\hORZ|]t{ɺPꕛ3@vP{I΋{{O^sIty8n~0}hxݚ ꜱgkBF=$) 0]T/?JͺדI]z _UY'No7ZUᄍ@ᄍ@O0[}n~bmټCw?:/臢ԽGe_hƔi1eZBp/ڨo@;+˞CLz豾3$Iӻ #ᷴR_ܨEYI _)6dRYM٠Uja ֣..{VjoEjȅ.^vezN'g*kϳ?ш5ʸ\fmخ}{6tI|/>[୚5p}SVV܂S:;c4/Yl35J~0\Zpp|^2 HIINLN˜gtEX43a.&"Izq7Z\)y}RW--٩jC_s~ѧ-?~'&YÂa=ھuz顴۹c^8k$I?20u/I>JܯQ/w_/Ӿيјq#P}b}o%ۭ*/P۶dK/u7THH*pZNf+2*Ba!&sᇵ1/ɉ?xʙ5``_c{PP^<ޞBBs Wj~=_}G;wVRD]9sF3B[]uk2J^^|Jg#wh=3[&k3} W^Vyy.1UWΜ~gWlYd $$LYko*͖53Wf#w{5d2@%^qҳ{Qٖde 5bUdW+g^hھuPAQ>afmXY>ڠY6ߢ?*ȯ6l$ Y][QK_& I.2O|Ue$h}zJ{UW;{~а uk6jUJMK?X$+,U'éH ~!X~%? QEB ;X>_#4N*jp\6,FTK>cCu_Sҕ^<ݧj8:?&dRboOV~uupڷ7[ǜ~F6o.Iv虿blZk.Ԯ~ߵD}t8?wXڧkt4tx.~^Upp&?צnԠ-P5ֆlͩ}ګnmpLHhq=1Vl\,jI=Cr$IGYk?<3UXh!X~%? (~.o*ƒ%O,&F՛cF)R* % \SSz (B6=8 M}㴷ntUUp^4Ut^筽ȨcdX4v-fSύGlM?O5}*+ڡ+kze]3()xJ_κO|M}SppXj#';O6U =?eW\ ?V='%؎:u.@S>f5e4h>oSMdl!$L:PYX{jXx;zo|^\C ]m>N-2DV-*js]mwR`7骮vK/PxD)Pz]{xTnвūgIz'^j~uz;#w_]=)&6ٺ}^{ۍ}W7>Ըǵ8OF_ ڹGo URRO?J&~VZr=ڲi~wן}.־~+eP?lZd͖WbVY]5Κcst/$}5zYںyvgӾ=ٺ T1ѳ9}j5rjϭ5Lso[A#G]X [n^0OxMIi52͚rD=A/аiJ:Po~{Cz卹ӜSU8M>"C8_rB ՟v|,SP`?[;ld3Y}$Tv~*q@hG7mܦ:{puѭro}n󧞫o-SuCAJO\>UGB</]-G =A&w?1s\ 8kdZ1>pP0Ϩ 'j𐣯rlגK.s S..C2L'J߿{F\|txRTt#}s/|>ckPDd,/|x/00@ z?o܏[F3WƧReezs2mz"Xm5IRx5hkm `_ @0/~ `_ @0/~ `_ @0/~ `_ @0/~ `_ @0/~VTV*;'WvyfEEEGn mM>ז VTVjݫbevxTxXgkH6mgRTd۲Y@_Ҳ2 Jߦ3vwmfD|Xۼ6^i,K*@0/~ `_ ݁*//WAAԥK%$$d2wg+**k)##p >|x?KEGG駟n:?^j~%ngՁZ\j't\YYm۶Iz\=?|̢Eګ{3Hk|eddB ҈#4fY OuҥOdջwoxJHH0/[L_}!Ch֬YlW_}Uرcu)((H\pFyiǎ O~=ڨ{͚5/ 8PcƌСC%In[eەk bɒ{6L>ז \cGnםw)I Դi4rH%%%5ZTaaazF[oUo&۲lz?IJJ#<y睲M{1Kk׮Ջ/q>RRR駟jgU```@KMsN799Y5m4Ivf]~:mKl[f$`z(i&n}y/KM U~{=Zx1ܙu)ВtwO>ˍW׫-[h˖-uUWi͒jGroFfkɒ%|͊VhhfϞ-6`feee 2ضb ?3fH ^W#FO~۪$I3gΔPEEuV*GI|֬Y9QVV&)I6mL733S5{liΜ9z駍MxN]wd[SFFnlqر E]dܡ={yg~O>ڻw{mذA뮻d2)22RB[;wlRxz5w\{KiiәG;lֽޫcߩSo$n3 C M7$IMVRZZ$fo7F9^?vWftj˖-߿QuQ^^q hn:_TWGgС\TAA&GunTQQ=z4xDv_kIgkTt5hԨQor~([½& IDAT~ymJj鵐zKװat]wP'DϭgyOQ߾}uyy^EDD.3wEiii$ݮO>DQFIRi9s$iJOO$-ZHfҘ1cJ6nh`ݮCIƌsRe6FԧOD]wuƨpS|>_QSQgV_PPPߚ}Gu7ShMSԥK?PՊi"#0r?~$ir\Zf$۷U]]/$mڴɨcر5k/P^^BBB4p@3FCmmϧJ4}tK_СCJNN6B}}^W .ڵkUTT]*%%EwuW^yE;wgwܡ5khJKKS~$In[֯_R%IZxӕ}SQQ:,M7w%p詧$?Պ+~zoӼy󔟟;OJOO_aÆDovڥjEEEiȑ5kڿjj7ez'駟6SufI}EwZluk**:ZoQyϧ%묑#u0'G:ȍRQSx8ϯtT(**ի9tN)ɤs9G/VvvN~zIӟvZK ]rV\|P)))|ڻwk I|~m۵}FΛ7OK.5(''GK.wYƸȐUffjGQ^^QWuu6mڤx@O>,eeeiɒ%F٥KjʕfY'33Q/mܹs|>رC%%%׿elw*..C=$eWZZoV,Y|/_K/ Q7}>|:׿UAA~4 lsb1*d2))gZ 8 [`۵zj|>eee5 qiŒ-[謳Җ-[$Is$cccumFO>\.jeٴ`^V\)I6lfΜ?޽{SO5`|i}˖-3СCujÆ or4|cvѣGkĉ㏵k.T?ڛ0anFӻwoݻA^{F 5tP}gڶmrrrb c4J|fs vmP<ٽ[g-7+<<\r݊נTI*o_+++KCjUVV*00PGPPPjjj)#CUUU ip#>ө[njUBbפ@m^1˥fk/AAAV=V[ ""w&&ԩS~)00PNS6lPllƍ3gpByyyںuQWUUUk{K/$UTTM׹vp8~A{ $7ru?#ͦTmڴIڸqcc~_j*<<\<$Ehm2dFۃOmgddHzYfI}vn%k6?>XNwv\ڿo_mQъTHHvff*::ZvTLL1JҾ{5!A111ںeB”֯(sp!ǫk׮ڳgޭuUWWg^:\\&}6UWU)55Uڷo|Jנ¥ަBy>_"M8V7g)<<@? 'ӣ?qkG-&N졸Uk޼-ڵDfI#G&kShQQQ^}v*bR\\mݭf!ɤӓw-G>TAj uf)>>^'Nѣ&IGֲe˔a, dܳ>kd `|lV^^t|IRbbbp:h t6) 6FiCBBY!Ȩ1hРUqq =%Ngx|X: @KJTYY)fO~Խ{wKKMe/11Q! Ϻn?Z&O={F(<<@[wΝl.Wbb.P@E))1r U<+d(;ۮ/N֡CZ<~az ]c5k>$K^o4EjoN>}"O<޽fϞ}rƍӲeTQQa,\U7+Is̑Tpp 8PgnviSFlgM_g٬VUy|Ԡ\&6n j)WU|y"#?A6(+D6[9O]7ܐ?ڦkuu͵ -ZO0)מ=RAљ(/Bw_h cgO-?.}-VpUgOhSHIIft4ۦM)Sh'~کuZ˖-kPnnAzwXׯrdM8Qw֞={D='c={<`e2Խ{wh۶mڳgoojy'Oj„ m1ԨP&I٫q}/U^^.ժrWٳv2MUoFu禦@|>eء-9|pjF!!G9 Tw%&YQQVmlL]>^^Ө͉{h$$jӅ M{OpϑVII>3ܹS۶m3miֈ#a۷OwuWO~WfVhh[y۶mz衇7kZh^͛wyA략=smrM7ݤÇp}\sj vzڴi'~=1z[d2)**J[llY#Gjڵ4y<=zLUUU޽jl[kVel ֞ݻ‚&{^|>fi=>ϑR^^תּЊ iȐ8-\%I꫽ 0H=1;R6Y%%LJb1iݺ|yX=4F6Y6;+ϕ$Y[?i&?D6:3uA45u9^OyYjl69NmٲE7\n^o{M7s4(SJ}nxϞ=2eQfŊqu癟tٰ0=~[oUlп|m'Sr[skTT{Faji;m1rqc6nؠC*++ӀgϞ*7x>^{v%K2L2Hҽg'hٲ}n o!ɤ%Kj ?٩jfn]UfR`E7Zw뭷)'\'4 gLpiƌ3M#I=ھX)( p*L|af \cGjZ_݂=I{}|͉(..VIIzdPj>f-.lcYPP(%$$tz^婬L]v5k=Y˗/דO>٦Ӟ[b%׿bcc`kV<<qrݪTxx1NAQuNp+(kYSF|*(j֋/nPvv^ziֆw:=z}MtzO}^O.|4ӥqNȆCnBg @k u=wTcaJ5g*̙63`8aݒZ3Q~QƨF)) = ,9qNtO&K@0/~ `_ BVVg\"w,S`ŢNsW:ժY,J4b(88:0C0/~ `_ @0/~ `_ @0/Xۻ񨦦FnjU@@,K{wUt`ǣ*/"ۭ*yk;vJKK[o)33SNSɺK&Iڱc>CL&]ve/t?mۦJEEEJMM 7ܠfrAۚ1czV?ߚelܨJc[`` f|Zx9RNC۶mIZjڵ$'nnv(>k [ 77W3ڵKzRZZx\.c_ff233u뭷j*))QVV$iܹF~AhJ<@}ի`ԩSܚukQ&ݮ͛6i?aq|T߿SOEFFygv =l {kd:v].o/qXZB"I^{MtO>?~zJKKok ݻ&N>Hv]JHHE] nk|25z_z /hʕꪫt%ʹFg0IRDDi޽rzڔJL&%%%o~t:uVZJHLT߾}p8IRr߾JJJ$ؾ]S\\R$)33S.K2thF9}"#U^^#}r4(U¯$mR_֩-X{\\BCCm6IRttp8ԯ_?[Nv] 曕$áKnnk$愄M6MFo Vzz̙sZ^^.ɤۣ4|I5kp8Է_?ynݻW!. }6UWU)55Uڷo%N.,,Ԁ*,T֮]JLLÇUPPiiݫ"i͊R$ٽ[?[q7hjwV%%)&&F;33kN >ѺuL>PXMSִi;Rݺi~Yj Ef T`EڹĨgժ\Mtz4Y'ӣ(tcE{TQRLLkt#h$}^mX5bDS>O!^x? Y7vԭ[7_W^ZJII9US#\.*++2pb lNLLTHhBBBdʕ ?8uUK,QQQ|>99ztlRU[UUnXUVT~~.IpէO\z=\%{pFs<8'ߤ$eeeXC QDD/^UVl6kȑ'Usڵkh"%''kZOY7PaalQAA쪪*# WVV*22{wUy}3[&FBBR@B]Jk[R֮zmֻ}պ+UPT^BX$$d߷I&<L zE9Iw~uáfɄa8N߹:::̙{clPs?d:0jU!z_r=ou$ +""""2ljawyb۩f?`ٲe8NZ[[:u*?яtV}yx饗[qӦOgO^mIAA[6{FGGwh1L$&&R\TbBBB СCdf6_` 99XBCCf f3cƌjR[[KA~ &cPSSæ톆>y$Չ{ϙBsu뎱|"#-\~y8mfsia.oyxl*ѷ>+vm/+Y8n6o1 Lqg~oV˜8qD6DDDDD;?ov@ybS=͆ 227lrQYYIGGSNN˖-׿u|nkx墭0 w.㫊wvvvٱ};t: 1Ora *vgg'DEErno[[F0L~?mm]DE_J IDATMgHo[}|1kvv{hk"&=miqm'!!&h@:q@lx:Pdddk2}|ٳa֬Y̙3g@Gj3ܚL&bcctx+W>k lR_l6iu<q7G>/p-}'""""" [}='bՙu&ϦXl~9`2 'u7Κ(;lDDDDDDOEDDDDD$(G0  6HPP,""""""AAXDDDDDD` ~TUU uDDDDDD$EDDDDD$((HPP#%%e """""".H)Q__?]N;"""""Aw7A; vѱO.;w3{46젪l`k+Y||nٵ{?Gx˒/*[t\w_pnk5PXsNl`0f`~nqini%6&p.x+q1ggcM/Ɲ'>~@5 3ٿrskxE$&cf]NwX5v ;@W VEDDDDDC`?""?Ʀf**k ndTJ"ii)_pbデ--mTTVPX\Jhnib06#7'MeHWKKtt>Tiz?Cٹ>ꜛ[Ce oeem\YHqۅl}??#GnEii+y+GvHR؏耟sW^N*l۹uѺ\Bd1^/GODXX(oZ @Ζ\vN s`7l%RXje_\=|5kJX[:u${+F شw)"2W}{W,b1rE1`*{ʕYh46xMl^;ΝU\{x~ R3&Y9pΒ[w2쀞-knn&666[U n5>N-8l=p˅!,l?Sٺhmt ca2 -"""""ج1tTnI>{h Wbbxmzj^_vY¯|(.nEJJiiEDDDDdxQ#..n aaޏO9GhEsC 0`?\.PwADDDDDDLXDDDDDDC 0` ~h,G>Kֹd2 uDDDDD,P"G-%"""""2(9]`?HIInY5_DDDD*"Cn{0l>PwEDDDDL`?† gU]}#0yމA|\L96t:{me̙C#M72mt]m-\tlݲ$7n{$$a4J{.W^9Hzz411ֳҦ ~xe.d4r~:!p/9cr+h40*%?O TWaҥZjرc{lX,`@twn'--_8igܸUYi+d&\wgSPPh{/7n,cժ"nq3g~@Msg+`?Z[[NKXY{9,V.3G{P~۟}4GDO)''A ! R^VƬ/|P`٘2u*ssIHH̬,RSS(//Xi)N&MLxx8vM]m-NϘ`tww?666RxvJfVV@W5p?leƌD :fժ"֭;SO]0*nhX兀Hlގs>aLJQXDss\w_T.p첈iӳzs/|f o]BcS <*y{ ptua {߽K/ʦ_][i3a\GKx?SXX{;~z+<el>őN.;/ǟzѣY3rn"&&w_GeU fWxȒ+/!"R_!44nn7^ṉ|י:e«oCєrs7E s=,]tBpkk+%%=%ƱRGyQSS x>ÇqaϘncr8$كbaLFeǎdyQQ^Ρ~xMM\{x߶NyfM\L&]7ŋǰ}{AF٩E~~=O>h:?Occ'70ŋǰsg5/ȑ&ӽ's 5jܹ)wOʹuqm381ʜ?--8.~Xq]Y$%K2 \_Gz{-<^X7epw䊈pEΒV_OHx|y|󺯰pMV!7m&?޷.M$L%_hI-DGGEEe5w Dakk`D|,KuM--mDD1kTr䍷ޣɲߠ&^xy^|zga2()-q_Ǔ,`%)>z_9VVȄxٴy'8}~{_WJputtPVVnc20a6}{c 'ĔS1 t:'""0l6D2227~5kJ((h.<܂7X,Fl6#BIOn UTT Prrʩ^maVUU\bcg>j&,̌t zG|рODDDdS؏no̞͝5?liMVjj> 6ms L4ŗd3w n7ok5aawc6X`ϿpbX|I6;~%ѧb݆ե1驌Ɏy~OVn;7]/;zȈp_5::TTVؾvfOmG._b1%g?WJlY NNNf}G&&b-,p'**HH 1fx<#:q6ɄDhh()rvuef߹رV23{VSS×/?Qdgx^c!(-o⦛&q=Λ~0|]퉉L0;/gS^#좸cԨHsmm]ydeŒ{{ ?٩̛77< Ey啃k;22H ;pGDD9l񟆘voBDD87uF&xkΝ=ƞعk/;w~p3 M$IƽwIx0>3_5$F#Ngw8UPɐ鮮OWYNJL *3>ǟЀ`0PxHN'Op` zMF\|&W&<,GXgO拾AyEV#!+Mw0 3x⣏sxW1}2U465SYUKuMPpp'.]ʂ >_6 MA~>110fjk}=zC'&$$ގd"6.Auu)Z ݯ`@h|_?DNN92Z@II0l/O;r@ǎw~}a)WXjR{{=VQ[ہx p8\46vjU{fM k֔x{㏽swwzZ ZDDD?T; PV}7XG䤑,? 56y.N*S&w>n^͎yߴ `_zONTTnɓ'cZ)/+̼Zٰ~=dbccZ԰iFihhF#)FQQQAEEoxDBlwqqq v撑c3yرu_Ovvo6i?<~*6uk%FRR"YÇu|)SHOp+qxe9::jj}:&/nLL8O? SHK"7W=/-mFuu;oWh4`A*.x8phM |:Bk]}v~Fǝl`dϟ$44<_FDD`4d2d8sioojb6}`tK__v)g!wt81x<BETh6f#M<>.4n{9nnm w=lh?mm]Kz M ?t#*~$$$ ڹM&)?aa}wh HxGٽ'<8/+~F㩯T~,X͛ϙ{"|PBXrb qٽ+_ǃp_{;[}^̳:v~}T_~Rb us=_b,3c҆G}[` ,n`XHNNh74ڏ-r]DDDDpUEDDDDD$(h=UBEDDDD Y""""""CMCEDDDDD$((HPP,""""""AAXDDDDDD` """"""EDDDDD$((HPP,""""""AAXDDDDDD` "Ȱ5\2װ!!!CakdaM&S sl&<<4] aM&aaaC 9G (HPP,""""""AAXDDDDDD` """"""EDDDDD$((HPP,""""""AAXDDDDDDPw P\.]]]twwuWDDDDDDLHH&iârP n:::p\Cݕk """""2l 5,*""""""gdaEDDDDDDNGXDDDDDD` """"""EDDDDD$((HPP`\.PwA>'L&PwADDDDDI` Ád22uwwt:1XAoODDDDD\?xIMMw^~a:,Yrs??񏤤PUUŔ)S/~8p뭷hѢ~JBBB2e :k֬bO<ro9smRcܹ#o <v}\NN.V|@;S\Igdgg 6mZͣq{aϞ=rW=C"""Rxeee~//[7^S^^ƍyGϧG_.8zh K/G}{t:)))#wy'ӧOB<W&Lǒ^ZdddpAxg}C)++ѣw>޽{Yt)qqq}*999pUW Jٽ J[W 6o`4 Y@[ZԴ3n\g?|(aaлwfڴiω$$$;9r$K.ݻwOꫯ3g'N7fnn_Onn.o&NG+Va, > qqqhihh7t3#8&99oڵk'W^y׿6M\\&M"99v̙36m6miӦqW{n>#N'*v[ǟ=ҥK-GFFrر};qqqL8N]deeBww76N""">cA~~>mfSRʢb"""h42aDx<؈l>  ::iӧPp;r&N jU㩧Pp ԩSٳgyyyr- `.233l8NnJkk+nСC7o#F wutvvr!v{h_2$&&mJw&Mxڵkimm17x#'Ndĉ[MKKK㰰0? doOS, &Mb޽ǟ`ғ*aa$%%BII )FqRr2UUUFTThq1Ə@A&MD{{ݴv7~t;F}}=))xnV% @A复jUfs2rd870iFO{݄ӹ hGßhض /@}esHFYIX&/|;p:݌IMM;>ݻkW^9h ;;ѣ>u)dgggٱcoyou;eeeg|\fffF#UUU<Zڟj'9a_u|b6<ZY$:;[TrяG)'11GeKN?,>* 66TXDDD$H(Œ3|à{9]xW´ix뭷z 9>}eee*++}}HKKcɒ%DFFGLLjz[ 2n?ypLL uuuXׯ!Ci…}wy瑟Otttp7 ލ0 `X|=/668̑Ç߿?Â7m*ke2^x![+}8..bjjڹMlT \uwwyy߿w6 ÷=7h4?,l6hQ/X@Dv>r+05ZDDD$6 3!!!L2VGUkT_ol6O^^دʼyؿ=*zEիWp8hhh ''J2ꏢ"@_Wv:lذCaa!J?O,]  bXc0hmmQQwuwoiiCE,Aj6~+M6qa~a9{r__xp8wyO<ޕun7?O\G[}K_R@~ϙ37y /fn7˖-_O{EGGSQ^nYؿoe'jkkH'n<#F`X8Z\U0r$墭^v"""ޣ}MK$'GŬYIn3f$rp#ͬXqp.:1X,FF2 >8XyT9r+BϟjbJm$11sk輈 dd̟֝٨E_!L z ޹fU RSS}>ᠬ1c]]҂!** BfBjjW~φjjj%993Kaҥgul63idcNp8x<*nggߊ<mmm;{Gg`6L4ں'&Rҳd`b>w5Wpv{|Ul6'lm"*ʢG!STT`lx: ~ 4<40jgpmkpUnP95jpHK"-M"X""""""TCCPEDDDDDUEDDDDD$((HPP,""""""AAXDDDDDD` """"""E6CakdaCBB """"""p\"L&Çͧ""""""Lxx8&i&1L&†""""""r`Q,""""""AAXDDDDDD` """"""EDDDDD$((HPP,""""""AAXDDDDDD` """"""EDDDDD$(l4q\gY9G\.Ƴ_=-FS[psDm]gݳGZUEDDDDD墪2F:<l7jkoVnn^DDDDDDh$66i8I9۴ ` """"""EDDDDD$((HPP,""""""AAXDDDDDD` """"""EDDDDD$((HPP,""""""AAXDDDDDD` """"""EDDDDD$((HPP,""""""AAXDDDDDD` """"""EDDDDD$((HPn%78SIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/sql-databases/000077500000000000000000000000001461403617600227405ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/sql-databases/image01.png000066400000000000000000002321451461403617600247000ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwXTWEP`ޢnK61^7ewS6$M/gcfck&j" fETP1y|tsg9"ƏGDDDDDDgƌƩƩ[+(CdEDDDDD\.-2,grArTS""""""Rf0 k`=T;$$īDDDDDD.S.Y%eLfSޏa0 Sa3viܨ<HJ:IDDDDD2v; <,R`]^U#GrH\'>>LӱX,'.\op8YDDDDD #>>J)/44_qH\ gk 0."ꢲʪQ:.) ˍs;l`::5Cjb>_.'^V~ׯO\a`0.1cFs3g1ydL's݌3CGX0.X03g1q$lf[ʬp6[-xy ҽɄQ/"qq8]Nv;nS"""""73'U0k8qcƌb!T8qfeV(㫫@2a |7[-ؼ撗Jwu|ǩ.C`,X0xCG}>\+rJw?g VkaokZ~[}|0[uHu`Z!/7r 1;sqp>k[M&^mjlneghz^x2wP&̙;̙0*ϕ{. E:50=ĉ \.`?DjTA""""r:M[la⨢Aj2q©Nܢ!veγ"o"Ցa*UeY!XDDDDAmY#@CA+=1W2EDDDBCC/JYW~.\FSNo*Tu ZEDDD*ѣQ~J-Lԯ_s`C p`_DӼ]ڛwq3>3x<&NDDDL葸*)wUepٿ[o^X67޾c>Xik/@Ee3_alm69wuGs-Q-Z\XV+H&e+k?UN:~b!: ~+E;q {ퟸΒMJp7nƦG|ٷDv8-yuYݘN!f&:ɩӜ LiC=ZP//;r)ktOOH&h yeM~OM4q="'yjե-/䍏Wp7%~~^N;.Ա7oŋ*1 """" vw0qM|xóڳŧjhvsV-qwlq3wG9s15+ƺY" u._3P{O1Ղˏt?4C9 `8.z [~?f@mؑ Cb": aLʴѥsSv|æ\9GwQ,x>YCo3푱D| k}g=1nZM;4嫯 ¸3q mߢflرyeO=s{~?b}EDDDDx>93NQ dkk6 ̔]K̙?7.WJm2-3X9i=Yg<^w)tW~}&?F/Ğ s)w<ƴSZ!.}0xP?x-c[X =;x1=:7%Y: MMm%g&miîU:e4z'PuA5"G΢?ʋe/P*aL"zb4rOa';H_͎},|6tϘQyAܾW6&hJf1茵7 mwE>S9H2|R_z 9Mv<2_?Þ'-yjq|EDDDD+`dY2}V':+ *5bB?i$'-Lv7[{nƱoOqacX?%^?Na!,dkA:@"9mm-ƾj{ `X\`|GxmVj/6tl;KnS`dxq,gt  1'odoZ_CT~v{Ա<{P*"""" Sx\. ? bHηҶ'[#zrw g$"68=r8;{`3paүQZś7,X/u冎~lXu6Qvq(- _: 4n(6 w;ײXƆ,Ɂ +8t2|RW3yUoxftL*өL]xÞP~xes2c|j2dXWcb!ga9KreĠnoX_eh? z0Y;/O᳓Px-ZaZ-ܐqE| rcpGxV{{a)ey-冂D܏9./>wǺs5CY9E>_Lj,:tp@֮};%=mbч}#/xz))^O=SK?XDDDDrѸQ\y~Ph[9E1Lt\e_Pս""""r \+/zsCpj۞M L| fNTmeTq@UKUbvK]EDDD ӸQLJ&jM+{T+¯\AʕhfjL+{C¯TlUc"9=|*W${~EDDD`jVTc^6`O狈Tɬ{Elžl Ep """"RjW%r`η\DDDD`)+_@6oUh2łdfl"W///v\.nۣ?NZ|X-X#\SR=֨V"""""","""""" """"""" """""""ՈF(׍ƃG#\ja```20̘jT xp];AWDDDDƉ Ōl0 U•čJcx< 0ЛSDDDDp<3z<;q廱X͘-kMmWZuwTy-PP+Gƍ#?ӥBXt/⧂¯\)~ߵ;8] RƑн"""""WL6w8p5OeN嵃w$'٧woVV\E=ߟGEX,b%:&3g o㫩_W0zpj ټl@Aw*kuבի1 ݻS#sWHJbB%;Ił/yQBp.ygYΝҹ3# wޥuV `U{~j`D5Yfݻh~5 }RU#>z͆)Ŗmiyu}7r0O\ tz z /sƷJ`Yԋoi_)SU龪 t{,1%VYK^nnayWپz@OʀAC0h7?^} sr4i2r+ٹ9q~Evnr+'M[n&ܖ:H[^yԮ%!6uTK~*TF~~>J޴YӦ. hӪEQ#G}*W Y~{)RRS/Ug*m ϳO? >aܹ'ŗhA+e.\Ӈ?[m哏?@biԘyW2/~r:㡻yu_径xԃ1'fO5;[Ǻn#QM3 fov1xb@cjOgѧo5JEy=9Qo}KF X&z5 ?C p搰s WTi]_rÚzey愄iӦ۷ |THaal޲u "ٱkEYs0ۘ5{N uB0wrYߋG˖<~w}X< g-\E <yggضe'Omu0xlh jyh÷ǵd*4 >/bx2{G}2m5ܔb+u{{fdooy]"̖}sCqI?>o1I{M񸘲޺GMDv{b[qm F2DRW+}D7jϣy68=Ű[Pg|Ûu8 bqno5-kk~>CHwHm+>nK4!e>.WdAtRR~c'`iFN]X`ٟz=зeCB,%exHj80wREDDD`f??jPߟ M6|17<NffYYdffU͕:((oGDDsnt,Sq<%z*5 uCCo6:t޽ ,>tѝKV-ڰR9i2_N\/SңGON <Ķ ع=z1\5z ~:HI̱<|W|ؒhڞ5ٶ3p7ǐ<)m@mw x8W&&5mh~hm#*15 hO~999UVwsJ q.m Re%~tWv{< aˋv.*f>FjW1Bѻ4'+~57sKXf^Fן8YS/ۍ#)i( ]ȓ?:4gY l8̱l7?9xwyGh+;tP0a~=P\19e +++b.+:V Kϻ͛^חܜVZ]iOLLI&4nԐ]{s۠ }).]Ƣ_~(_o2pW&QOy/\Sğ{tLٶ!#&kzzznKBidһb>C5396ڇ.[X<޷';Od6o1{ q3Ņ9iPZ5LYCFXF>_NDDD Ͽ;wҭ[wl^{Y֭;;w/>+wޫ1rp~uS_>1?xz.J}5k R孿/[`Ջ#Fu6ZqA1iԊzCWm =n(m۴ek!O8 y?ǖP gy־l ]Saw$o[yxrF]9oqNj0ld]o1/şVmU#?WU8[>̽wIpѶM}!zߘ|mNUly73gn_x/>U~OYrv}όw3\bL}-~[3MǣԴT|m [|=XlFyGhՂW^W>{&D|DDDDJaFXX.ŋc6۷fۍˆa/wsmw,_޽ĉ4,YCׯNo˯K^`C88@`MN䁇$`޽Z<ѣIdc.7vlg,[J\ʞg/אݺu㙧f@+WdɸGFҷWo22xYv>.S>wDAo:DDDD.+-Zb¹tCBqDE?"foLٿ2N_t~WeƌYܞرhܸ1+dɲer F5,Ut(g`QD5Y썉!:&f"##C{u[h[&KP\fuNvV6۷o+u}۶c5e.jl, +bt8##)_}ʫr< {T""""kld~+j abUWT""""^6*TW i2eCDDDDJxzam Rbu1ߑt%ݽ͆b,gfl6oL5 """"rf_<h&Ll6Lfʦ{@&.|~%PJe0Z-Mf CߴŊbrrpxQe;aLfL&f:*K&Lfh,#g#U((T%LWȕo߮ZBzF?K !(Hu """""" """"""R-+~->.&OrU !(((((\F,ٸu'bxĬx?>PDCYuqȕ@f]DZzfmCG=tտoäAD6 ?bOdήWIˮs:M;Ll׬V/Ҩ5HDDDDE] yQ3L9o*%//#J](""""rٴܷxI(ga"7m>Fng^7BZ!ԉhHT ҃F"tٙ9wQ\ qǑ.a{6V՗#|oܜ#7fYW0mNs}LgήW,1 G[=o'N՝!Ֆ ~/xlE֌ǔGND˪ A3p¼ +e?/.z~"""",WXstAnҬBKח&RYp7h[ei8O x{7eΤ)a^ב[w7g/d0`D}Yx͸ƫϲC)z@: F~ŰLړ[b۴L6nIϮ%Z~X{Wu<p(%/?_b!ZlٝǐfOxM>ʮG //-AEDDD䲷e˖2oۡCR e!U_M_QUaKcM)Lz13*]Β up'wfL &g kvZۻHڱ۶5J:Xy,Iˋ<2Ӭhrf3ؐ{\ꏤԫِ۟K:l&38u5Zܶl:m0Y#;rq"""""W6AzȽ8ڸI9VOѕRTһd{>Aɴ灿5 Ly?=no?|.N ۷ǒPQ} k-ݧ^GOĀ)&<`Zn=u1&@Z,?p:9'#[d*hw=Ԉ~o2;9CDDDDvYwq?3숭qjVs.gFUH):mŚeEm1pw G6'Eɉf2V~9TGֳr%Z*!w7I4m</ٖ_HC1谝|QDuh\vEUvm*޹xwt۰UW3j\֨aD6kAރ;m~u0nqD3cU2שil^K +l6o&]Y٤,x!9q9+3~']o[c{$Ԝ|o ahֳ/c3*qQ;Vµޤde*ϏDL4s w,J*{0/LfJ_ X{C#сsQԍ|5}vwn4p T0׫B%Wx8p4ZK+oš {a1xHk,1Ń_p0uOiݟ!,]܌nӉx*0 gmW7M;ž?ɠFVA7ѿ)K-L߷D-Ainفه aip$f(7 Gct7a?zرOAQyyƶb-˙¡)ڱ~z?{qb-奓NBnV8 }Fkn/8/74 =~bnnйYν;Ual٩I ** %uq^81sahe!m4$U,ywpWoͪ߷^TH#,6eEI nwxRJ= 8~Xڷ.u]XwxiSݧ='Nɥ\0_S|'mbۙ_~R|#z 5mt?N""""|p?nkmZ  mCdzal:Heф8:XO  #mݹ Qp{Wfc0{y5\"44Œl/>0UN~}VZM+\X*g'[xЯ#.*<=Xΰ5IM*yAkгx{;byI#],lwnzf ԧ(_Xb҃g͍ Ў{gzt`M\ԭҹs*bΚb{i'v3_O<LJ 57?N A|p9I)ܔ|Vb=,_؏yAپHz#bݠ,DZTIijqCbaFsf]TjKpU l~պ͜i z5mlwպF""""|Űf[ZGu"ӯal͸{g.2`׾й=$$1dp%oA }bXjQ/RCF[dtIϢ۶ݠm뗲$+c}WnգI%Q8w+dW/ut`yQn"}볶=["CW-GTt?N-""""|d&q0XծCTekǓS'dWA^b)J /H4#SZ1>nW+W]zYm3Gn{W%ALKAkͷpycY9dDb|yFϮٵe{,tm ]ĭ-.-_37l7;3cU2ש׊bҹ]Q>_'OηgL[` VSs8=,7߶^Su`< /{=C.{Yx0pZ Y)R{,|j֤z^ˈe("""""3E6>s͚x{~Qϧy}p΀~/vxߺ3u&֬={q42L)z{";a~)n`agvxl85]MDDDDD+& ,v9S#h?pDc{q;wr|[MJ{61m}:ּ(5peDWB6{0gU;FDDDDD/;ϘC-q;ju1}>28I .FbΚb\F&u|ߔb}3 ˟A.ulN/(~OpnfV#i,1qI ϻ/?뽱^e^FS.:YβWisyufp;|]ffkDDDDDZ2]H35kH+W%d&q_{Sl2lEox}AUls,D69#.{x61wϿ{F.i^_ ӷsxEfOsV;FDDDDD+بOAXdytN >uӢew8[}od/ Yf;%DY΂A'I3:krqێ 9}|jو{1x'^=["ubaꥬ(.zH5c :t{8x`ݪ,gde˖2?CtҵpYF ."""""""')(_,q]yuXAqq\.,Gk!{~El)rQ.*.U!b6ȎON`k^n)\bgplIvr8zˋ m%>;9fxm`-xmb2l"I-& $79pA?ex ɿeq ;ٔ(^'yXSm^ENuzyS7s~Jⓤl5$Vfy&plwmn)[yagE./Vѵ̺BEDDDDD*e!;a 9s0{z,G ni2d^iyF0˗ݓ“q !G&m9Y>=&ck+EdeZ;o4|_b}4׆1u\C>#w_:1|O;脔t1 Xxg#~hgßSX1H:0>אw9:EDDDDDϚx¼ 5_=6F7)h]gx|7Ͱp+tgK-{s nHW/з/9 3}baq|zO8w2&Z73IɣD5Dp66zi,2q,<(4T>pi ELW2-fN6+GM!1GrK+ _t"!Vp/.&ee3QfI׺msFxLx53OOCA(9e"MDjcjILu!D_]w鰝6>A/ ;?/Nșɼ4/t IDAT΂Ceϋ5t;6;/FNj5m/5YÇ닀fm`}dnBŔpgM\cwNn(r59ge.C!+f\D%I$/78K:VKeH,.:TĔL"udr,͏K*أ-_-/gBvH_lUz\ : 8g]řx+Ҫ&b)`ybWDb[Fb1)4"l\CWL+H綷PGW;$I$*{UeN\+SڱQwnH$I?b]V@ɓ'<-Z`۔\xEwMM_ F6@AV͛'n㤛?fL$IvL>7;}tZlI>},2O}^&Si\q|/1`6(a719RB ~_߹7̣=9vtB:GsN<Ͽ,#?iu:ƛf} vIАﻗ,y*/%>p/>z6s$I˩P:t`ҤI;<ߤIС\ve*E(f~9{Ц>AhY>hbI8N9J>~qu9!, 7h$ OjاZVFeT~{Q؅c4i sSݝci|?fvN*UW$!QŞc$Ivi*Ubذaoߞ>?-[{GLJ,.Kꒇ[Mlĉ0Yλ;&,)HqKm=Wi/Kb!IsaLNgmjz=W^1`lo$I~&##cкuN_ӹsy~a.oKJU_ΨAB8t Ja5;#a-^ڪ̱;}򷓛 ɳI$I!cwߥm۶[M3fN8*WlJ\h%!!uiR|j6&ܡi~g֟w'_kcBY2*WfTK$I~{\2;w?/y?sΆ?'l)l;Mv[Z)bAUNy cۓ5^R28rTO޺M->p1|valsm-$IUV[n <nݺVZ5 w*EW.G7wܕlf,ndզF \BĜS7/4T}o.Keo ,gyڒ$I!xСӭ[7uFzzjV0O(g5cn{Ѫzqo8a.Ƀπ1ڑ/w-C 6a}+U&7[̸Qoc \nI$UÇ'==tn`%ТT3%$fOk!v4-u \SOٗD<}qiTZ_'K[#GE;9uP=V_Xk&}x^xvߕD5X@Ņwӡvj݋VfPȒ~)taGTUxRI쉼,GZs5,kM$IJa?a)U[itEsGӷw/\Rng@:O{;6 !,n^i\v %7<|I]QCMz׸+9WZԘ+z]e7>g&3͇!g٪d;r~drŭ}xpL<Óa٧9mV@!+>mw=S[%IR\ٲl&3=aBK)GVGsws)iʠpFCyZ^/>Z֥jr< !RISv?~*RߖO64,ٖJy)tkԒL._WƯۺЮN L&mWo?i%ېKVve.{ ,^x)SJK$It),̛;Y3gX*$I]º,&OhoS\K[ $I$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$I_+ހ/|Q$IR]6bI$IJ@K$I0 $I$iv66?$I]'nS!EEEn]U0$I$}qqQ(qqqDR Zz'sCϗ'xX$I$iW U'=9FBBhtlށ\XXHHYEu$I$iW(;Wˊsu{)$ࢢ"F,OY Y$IfB/示vS"F.6Um$I]Y*FJTCߖ<*99Y$Ivq5"ɡT߽)I$IGoKk3 *Ԯb<&qK<$IYie.|[.OxB C$I&3)efcБOpQMI$S%qz(㪍'JDhY7|Y((Gnڍ|r%5!@5D9K782ʋ߭3ag E䘮t6y}'4&bRNByq%q8"\@ʅ3py&3w<asH#VUF̈́?o2+y!)[N L o|>W%d*lH.g#sF$HIH$w F^. YdEcCROi~)r6]0kl0O$9#HȁB>!(, mV_yR/ّpwͨ$"Gľr'4=8,|. VdULF#qn^ϚoQL]AY4nN3䴦%[m9E&~,{c$/(KE:l=̚pi6U6-k~<6 nD0 f&M)GzsE\j~?ᅗ`YCHZ=h~Y\|dCm쌹|, "z&|ɫ#fpCH\!2qwꃌ.b{9~O,<2#%JSN$Tׁ?X 7veÂ/\Yo'#c_q3W˭{T%9o- ǼSՅ_3yվ`Idޝ%ISsy?>M(>]H"AjBkJ/nI$ DU ),Dw㲌_gR|:e0} X)/bz 96M(S6 3(}&o9LRnC6\ٿi[* ț{иL SҴEI̟ٙ7aWq\AjK) sttm~Lz9+9nabyjq.4Dni'˓uNG6b36Ӯ{g!I ]ĨݐVr@jqZ㡥<+?KFq?zUz0!Lߢqm19EU#=ypY@֌K.ɛLduLKlje#7pwHz4;[䒀Bb^=VX.-:K_j;kWy+qE8RSSWiZMH/}hdbf-[Ǽ ռrTp$~OQ[΢Hm=x4)^N Kܓ3+.y&`|*F}x]<6 X|9n\0bSw/o/b\ݞyn pg>m=K>S\[?qE;k,/E~!~<و' o^Oӥf{7pdB5Q@ wHq(s2uQm`žsF?@fluϰ|bȩrZBhs& >훓x慭 No>mtGaZ-ߓ>T'-`Kۣ3{aK>^/瓘lޘ,a7y S6BBWi_2%b*&ӊ}j%w/fYRqjxZG֎'t8tMNvR˕ ̀̍'<O)cS>0B(vx[3!I ],!)J !@Ȱ 5LgebEo\FR?,>_UIE=XF7&|DF̛ȈW vɴH dc=?`ϖݦ;or{Od2j8Tܗ[o;2=%I箴+Ok/a2g?F@Q|UNCΦjX{[0mV!=pMULŐ_P.;|._ŷK*rQ{mgr7o84=CbunKn'?9!l C'/H^ ƴʛwJ/~,Wp3b{s(,j :'9-_Ar99NPtTReeCxṫqslrl8:*0K$n'$E9?=D6dpN||c4k<>YrQY~ȶ,zL0?3ߠϰp| bi)2~X?ūuI܍9dm'|T;ɚpwGyx#Vу`<̘cȌeL}Fx'aQ7=6)L?xxQeLzA݃8Jy]//xzk8#SgOMǭ\FTtnQ7V]lŒiƽ;sY\޸7-ceՈ@R9x(/>[>īs7[gdB$rlSr~h^Sk%Ӱ\XǗKspE+E)Ҫ  IDAT6_)7Y/ySyu 68 Zlw jCm k<&%l{>jԬ\: }/^Vb3<cLsd ذv9Ȟ\|̎o q .'p\J ħ[Rus,ͲmüW)TQ*ϛrj4d)Iy̘!9dM!dW9'N9O?ɓ_P@֏ŭgsVߌ3খGsT/G޻r׉2֊_?G\ZꟺާrYrxZy)>o0y@AuqT&gD^}q˔Ґc=?K׽Aǻry 93<魎QFoۂN;MQpܷ.$\]3$)8<&F\/J<9كA:O3S<-n~W%/>{wS9C5< dHPONI&O&ĿГߟų=;%I 0ORQӲ1a5XED O$!Hb:I'GU_ V#eS N$VMgCD|Evܡ1|}"-lnCA_B{3ba&5Sj1[BaVo lTfQ&[t-{ȠsYg]Z g"y=I6TDvuYî&OhoS\m# rKor-DuwCjY3&'gxpTߖ;4W_"W2R(W ]a#y?0ձ]1ˊE7H$]LS/3xBF}8M+$' V~?W) jqsQ?/F/d#)6{vA`I$R^tCt]<{NB*n8-HoϝC[a$IdH7ն$Ie E=8L$Iw?ݱ|L$IҮl}qLXcujWV1ZUpF{K$I2f*I$Iҟ>$I$$I$I`I$IJmGB$Ivu M,8k@,/&G"^H,lލCX\sǾaڧXp\wIXI2_If}A2ѱp> G}0gyzt Ih![N.͋p}m ƮQY^v5py+9Bquwyx s1a;t?=^C7.aē}y~LQA3_yg6~">y?|5B2OsK$IɟL(:&A*">_M%BtLxu#&Afp9UO$=y_Q=@ё`WWϤcM\FW`ȍF{yPT'+ԕΖU2@RZ5|z<2yNsE;05 ><54m80 q&~'!B^ UlK, ҏqIſOf_e>Xn^Mm˳xЃk\hԑ qzّ4sP/ndk,1焿?}G!vpy}{sk}H$T Bq@I*&by#Y0a%y'5+@6o5&}Η#0nΩOT~5ZE!R#{̍|u;L3diEP8Dڦ3c'L:b/>_Ha[oۄhX K:* 8(k:#kѡ;1 Ls~Imۊm$Z9$I*2WS„rl^IpPEً lBdX2躐0i4ҋ)! /)ɦ/Y I4G*OY4iل-+`s㛗CN-]#%O9ˡ;[RyR:MӮswNn8I$r  ! &/kf,_ʛ:V`TP@.%TM]2/)^o˜ )FEiLz|A t=4Wڐ2D<іQ`F׭^r>4)Ζ QxoH[%I$7 C lA>{+,(FO !>h$RrLd$Ip\4Z;.0 ЂeS{_$I&aXÈ/`I$Iډ! /3a]'*OJ$IALF$Id$I$,I$IR)R*?p`GN$I-%I$T(om aŬQ$ID"D"R}U=%Gzk#I$IA@$Hw_ "~%I$iAn #[c%I$i¥fBq@~%I$tRX$I`$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id.e};;ǜvׄ-;΢}|x%5C]:tv=n|2m;$CV^ן$kNy0%I4HȞeYߥwt9 ef7q󄬿daP#ޏ KKjZqssjCIۈ]w,$˳p9NY[̈ǟ/gd5=w4r^+8&Þ咊m(NMWcd4 2sS<4&q@w8%3 KF$9_ ?f<{pܥs^t޺/g鼆|Ty9U}gG웷sKK9SJ1U:Fgq }k#.s /=ҟO[,e@ԠdG]vYqT<_ ޒ$I:;$kk?_,$x)*w8*Lƈg*3}0<5 ν+eW,'$aG|]+=r#6~}GXKڎr^ɤ.׫cl,w6 ۻPc,'c0aWn{^n?0_1O_`.2:'fPg0'$L'.eЕ4LNG|OՌJ{qux N+q7tcrۜ@-k.ڜZ_u;]?^GGK5t!/b,%^[A$IJN9:$E[+w|O^ؗmiyK^ϮҊӎݏ'ZXHnNt9k]h* ?ٷ4oؒS;Iʬ^fIڎ*O# Κ&t=i?8n{&zh B hl~XC꩷˽8-#o`RQ2 O>?n{9XK:im?CأKgZ֪Ǒ'@0SV B(X}jj ڝ%6rjd'ዂIsp{f2wE\$Rv )q'1pXn⵼>gʵn{* B0>b VH6U& |{t e6 +elTPHvv™yIs?W8=ڍ˳ IRDU?{U0PI2 BHR{U,u-k_]+*bD@TB M~;({)̙5UݤaƯ]"cղ%%z#+)R:Q (*W z$tK$UՍmG/ī-kfp!Cx;s铗r`p ]NI'$ERW%'GΤ2 ZNg$QahrR9[9S΋+=j_I'`>WTi㽉y4/;}($IO#!@Vz:P!XduȯXYIuR63.~w;7) 9oo}\vF=,.%@.x)?\?;rԕ7'X| ɢ{T>y-̤gqTӑ=7φq˳i{ƚ0hB/'yM bjN$m1}xȬj^Mo4(..'i uMH&V9걙tqo$iZ]KH'11HdT\PXqyΝ;н{էnV2~8$Ij_9$IAC I[CCIrX$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `I$I `I$IjM5+I$i׾6Bm`W$I$Z$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `iH(@Eߵ|{7JI$IDC:u C$IJZ4O{o"89<=˥}vnϞ.__'&r ?ge \JͷA]a*Nc2^KB/ؗxRrzAacɺn8^MI*>x5MQ}o#g aRX֋gnOKl6i@U(\Io􇐺 v$Iɸ,L d IDATO;ҥs;r7z'OI ds@?sArWRvi#㥷`۳Y(L H6LM򬋩l_+u\)~ Rt$qz'G7#7H HhsAH$Idwo?_>Qw &}K/ԦeP:zI*Y 9)XD7nTjJږ:Êd]\g/꾝NMsc_MH$I2Y$[̨xC^.n]+ YTLʣOWK$9%;8[grWMx&Mg#Ә[Ѵ#v&ܹ1oGΧc,?f7=OdQ,]_׿F.l  %兲S$;vN[}Rրrk~, !g.dOYk&$!zQLu,FEI%EĪ*IZIQ3IN&!ѹIF7|#us_zŘ7v4_<~3[yVD*er<|4x7R&\_Ƣ2f-iW[wqRҤGg-;,^;9"L ԇsaD憄~-a@g_a^zGu$N Մ.*H7BS~6Z5Zu]eE:g쀄qvhFE@++Uk8o!i6mBrr"I렢š b\,dюBҢ^8hI@xyn9=3) ݽ֑hιv2)+ISݷP@Iq7^5r90 [ɉ0n {(O $(tڗҎiē%y#$};#ԩͭNmOI iPQ$O}仮R<:r/U^on!I!99\ ╤֩H27MhTNx] ;Й;ot,(lڊE+|a#nW%2#/NH*;ґy$ǒ֝a'O?#LIKg?8_Ǐ.׀^zOM~1^";Wt<x+-v=ҮG98)U[ܦMI233)Xdosp1sW _r:p/Y;\Y8nYN6OtPYJUUHI%#c\h4= W_WW!VUnϒIz +Z%%U?@ 88e2uD6s\)ޛkNMWO*7a45q]?s(vv1$IXwCHO (仙$gpq3'xuj@n.v؉\veX ٱ5!D Hܕnݻҳc]JJ(ON'3q{uf֏P7MYuhm)GMʃc%I$w3aВe2=z-WNjOʔIeփe/R4eN]UR˧|ŸTtv@pn%/[U>d?q4_-$zUIc`kBRl4:t@H:u*-;fJZJFF:D"~Nqƭ2;w{Okݪ~&R5_Ly=9k$I$mr&7.4~%{/99~Ax$IS!{wI$Xje/E/QK$$I2%v>a?Y$I2%6nL=A$$I$$I$8ˋ+]Ӓ$Id^ _)qS$I$X?U6 _൏0!{z`7qW?Ou'ìnWZ/hO6~%I6Z t{T>>gϏE;p}9hV>o|Wu.eYܦ;}~2߽ #uΩm@bRc 92_8)Mgռ3O B~:']>|2;$c=.?mvg%I$PaNf4(%_YL$,OY"h A" 7Q$5'i2=ƾ5ֻ!"_ϤױN8O_}y-X0xҚ@'=Rdب7փ̝0i=㮶n$Id^ 3 Y}S uo._UG4>gi١{ w9/sxft*gO$?<Kv$}R t,_w`K2T6^M3%I$7Cf͜7qb%$}n`nΥniVfٜit 0uTr[w H ܵtD6 |{θqyΝ;н{էnc7|t 1/)$I$m &J|8e!ɹm9Aġ$I$6Ico㱳 IdC~ IIR3)\u$iJ2%iMII)yyyTTT8 ***ˣhFDF.В $$&^ +)XXU"I4)JJZKUI$m1Z>u;$Iw$I$M&ꢕQ W I$ISX+ar\־p!_sgv-]KX|9$N ˖*h<>gVU>ˊfl'l{<X$I|ƌcYbc:w%̟Gogp)G5#BBI 1&<օ:"'`ʱܮ~^'FߎRf/,:5{LNܵ-ܫE@:Ư$I$Qj p.ebwZܥq*veQcTCb&xET@$IJ(#"e '޺--:vܙv.# rhbqYX4_u}$IMVKC"u듳vϟxHrFdoQܶ#e79/ O؍@д `IrZ^}L1ߺme9s:%m뭉eӘ'N!Y$I$x8F:$1y3S0gy @N5[4 ;L̼ h$m,quӖkX<3Gn}$Ido ғb屵N97ؘ֩30#PmKE|TTuinM[$- 0䍡Ld񿱺MiXܵf)%dv]=W$IP0h@$awdcPPN4;cu[ ʒi٩?yhBsWPݩgt|:5t˓$I$xcJ$06"3~dgo7㰽xdI$IQ$~Xie3zw N$I ?*n$I$mu"$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$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$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I\%n[$i=A`H6*[ _#X)c|"Iژ뛬za!)oV2ee5UqIzq"I(d֯O{Т6C^aŜ?l.2~%IYH$i㩬`K̘>ŽXn %5!Ց$i=߬ .K6Ȋy|:j83NfҺm{^O[ pTL* 0~%I!$m<9k(ϧ:w^.H$I25?%I$ɞ1%I$I2%I$I2%I$I2%IJaqt#Cҟ"!l33t_̾SgϜ,=>Kߛs]qT2y~X.XFq,&-f#94z$6j.'G.K4&RW$tg"*TDRLgoiU{dK(+x<[A:.͖q+KҜ%12 qاa2T3w~w[e5ח$ȡ{$Rc|7;>\Ɉj}tlQMUBNhqU<|֜E̘GwWRE7΢{$.364$mIR=#Qцn/&f$^Mޘe+~,WܝyӉ+I݆Ż4&9m8g0ӏGvHE,m¹+jb9n)$5vQbK ϗ'$s_qtS?_(!Y? ɽe:0n ^Y\Mx`,Oy@w.oJP?n)1^;gVi-&I[Ycqݏ[r9MO{!m8plv: }͂saNJ>^Z J41 !\{k/mʐj4=-J}n>72^lٔ6͎ 4U$u&eFoXB ҸEgb,vIX6~9~RL~B͡wBm9 QT̟Y#9rl0urnRAlzZ6Ye-ƒ%hұOK!闞~jhz;H\}^><܏wg&3Uα ٷ~7pM] `isǘQY\5b%{ZNY!3X-qvD6@ ;Zi_'cN2gqE@Ru%V]-jtحw[.'6]oz-U5 sR+02dS{zռ|\sِ,ȕ *r Zf%*@MRD22ZtEHӵu]׭.k-gEi0(aęۅ΋ҶOy{5&']ۯY* i8gnx}?6GO9QWu1Vbvf 7TQgz\߶=1 䀙 dq *B&ƀR\yHSސc!8f'iQM#Uo)Ia 8e$mIٝ!z>=1oqZ*E$ջE;.ײ~tzq& B9Щ,soKôhdIќ![A4c|]o^zsX5h*?KZt%-(gh+"# wͤcu%WWh־v }a7Vyr]qtDfLZι0af9)m:ɓyjEͬpfbL /Sy&(QQsa$LaE0~%i Dnc϶&7Hڛܟ^@Dv_O= 9;rYmv}+zsgT|6WU8[зo05Mo4(..'i paHEe%=-@QE cUT*]c%I[ .#9%?9JZJFF:D"~NЊqƭ2;w{Okݪ3$I,I$I2%I$I2%I$I2%I$I27I$I[eHIIu0 m3k>.<~=$IԊyxuzSGtJO A5H6nA$m4;6/~"zHxW2(dE$m'@Dԯ]ѼU["#^ ÐH$Br4J֙hBu $ՉaE$I߿I!g x1I6VyG2>{]yIҦxY{XM2x$I>Hp_I$I,I$I,I$I,I> IDAT$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$I$I$I$I$I?!a&$I$is[;vU5%I$is:^ W^NJ[$I$m°=BڭH$I-z?=x܍H$Ia]z;,S@n^ ; FHy/}o}Nȧ< E騳J&>$ Jjc]i Hy/!]DC VG#aþO^,6;rgpF\ z $IJ ( W3bt:\wNDǼ97 a17[[sgq߻3~0W)@4Z3#_Ŵ>\鑰 Oߔ{z.zcduӎ/M*]/XIu$#ᾅM9Ȟ4XδBn^)gqGӭp"]w,oc$IDN*Wa%gmw紎 D>;).97t'iW\dZFm&=zaiPamDFs{> oO~˰iAs(M7]19"yo :;'E);s{XE8bOYm򘾬tmw6Ln]9.?F9Fy $Ido"|i{/dy_1i~x^-fSЭ^rl{VdFd0kRJ`ZYHImضnB'd ⫯M{ J9@UA[ޘ~'C Z~:D7c$I$x Vу_9x9qYYEfFk~:Ǐl֒Ii@aD&ONQSĹ3Z:HÌZ[yp)惗z'L.Nǰ[AK$I:l59q_#٢)B(:viTFI5W`w.VyciK53'1}UGΙ<6 e;ڧ/I5O(TGӥ  cY8kxyHoo I$I]@à%ǟ;\!y/d߮ppxzP#ey3h<.};͹HN\F.(*c'k@MG3!Z-坷f.H<%mLk}[x|XuP?XaJ/!qqmR-"b971H$I\Dw9s&-י;7_JuD* w:.?%N䮳hkIk۝:~knrJʗ< 4 p]4(9O?t\qju:~/D<ĀX"YͶa;n<I$I킾}xȬ6u&x2"/aLf&I$IޯdUdeeD$' ݻ\sV-p P$IU0%I$I[Du&?Ӂ$I-3$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IT8 ׂ$I$m~K3o<HETbq(I$ID" "-8&@4@<10 ݲ$I$i3H"_ "$$IGp?9x0@z,$I$m!~rf0zƯ$I$mE}I$IU0%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$$I$$I$$I$$I$$I$$I$$I$$I$Z[ x7`諜~ѫHӑ7BԍE$I L$W/@M{W_($3JCN.[7I$I273@ ғ!i,vՃ$I-Z<8##(%oE]O㦹H$Iޱۄ1^U84N%,GdJI$Ij.^#ׅ߰ acfSxvh!acY{ucwb' ^I$Ij 7vu>x-ޞ\Npu&ݎଝ<9n}e6=J***C I$I}xȬ6u&x1_| `%I$z4oьq8{p@~Vhn&MjJ$Ij0mTn&>t5$IU^`kV$IV.J5+I$ifm%,I$I,I$I2%I$I2%I$I2%Iҟ%!= ꐑaZ'u҉:$xYq yјYKe7vasl$~&/}|21g.DSogovGxsV_I ?\1㥇!L܈[L&A_gثW'WcyÝ ۯ2譧yG5!"so_jͿg z X@\;~^יo`ؐWwzQ='gqcOސ7տ~aosKcؐWygksOުߩm{x7ڃo'2~t*Ͼ՟'nohq_1<>"cࡼ3|V]f KfjL+ ΕmԎ+6+ʆٶNMhˇ ."_}- ~G8PJ~~_v;ێA錘RJNc uwKGz>s]=hۚa 0ҳu^!SSĞ }/>öI`G0;k;,D$zWn?|ƹ)m o{` ]Tm{U{DWLfwysA>,=4n|c$\гc#oadu=|ZJ~s>z64Mb1<})'<֟SS?檓1}|Ryn*G<֟sh rśHS81{湴l݅yٿqDTF?9׾"Bb9i^[4nrּI#ʔݹv4_4"B6ʞѶqjBgLkqO>vۯHk^`8&< ] RGCzmi\8wo{/_}muZ@ټ|W-' ޝEU5~ 0*" . n%[ZiiYYZi> n-j.; * 0}~߯&̝s=|9NʙlK(Gt,uKqA&Hwy[f֜5?\bڎMƲjP\?Yp=fϿէ ?3b CШbf]u3({V(Pc:qGp)+Yb&P$\#rjJD G>WJtbVOZ򅫻X\' F4a9AOC:eMc\9п6_<>ax!ζШ^iD5/Wl%g>j rx-ٕjMٌ#6ڣMlH'Yjݙ?5>XV{gٿ+a}q&m!c,bM!*ywSH!lpfO ;Jy?q.^s _~3qD^Ä3ؚl!1uViͶ\(BudNˎcΧڜ$ֿ_Km_~4݃)F&>I#ZzǶ3{f١S<˗P_E"""G|Hgӕ)p0˛ 4.oSaC1}O,f事j6 DMŮyXч˜9~uK7C %wh@j;wM|Ӿad/9VRv':ո-_Le拀˿c܄ Lp[gT/L+Fn=kՌ0Ͷ)0~?~=J/S_q+sl-gmJ^~YJSkRb~9|nd|\$3Le他Y 8=T e*KwyJ؁7%ejO܋oӓNyf|5ab>b?̋s ⎙&~8rveZgK*u,5ܦI7+AҊ=ar1 W}C,_+eghtg\7?.d_ِlfc=#Y["1+6|#Ǚ9x4i_`\z335gsiZMK  9;id|[sV, ʽz5-hnUx|=Ru7awVX=ʎؑ$LƜ}VUu]Җ]m5xТmN`=g6xJ$ooOvRL'a vjpi ggo'/#v SH+:9 ̍@&)e 'F`Yu)k"OPEE)ֽ7M~B#d&SN2 hߞoBL& a,P դ%dm']hݨ4qQ7,U4F -m]Y9bȺ׫R9kv⼑K_U$Yk}^lǷ>kF#NdVeJhG(sZf,夿3u't?25w8)'(ЂU3sg+6\bG0'-;WhacW,]C*6 ߟ 9yMp`gww~gٸ$dlk&ƲjFN1=UE ']-L iY؝b}cQײp1K|?+ɈR_wF8 __nᎰsuryS%زb>kZj*=^g73o+-tOwKI"95n2A̚D|l %N8, C;O^P9+$1y)w,KMKsfDdMa'Øyγ ж#[Ϛ\j L+>3JaBs012I8JfN'9g}mGb>.mOn*\XTbmy !l48w3㷜}?[k4li92=IFt052 Tr!`72fЭ-G>f6|ûCװ߽8j_nx9*2I=RI~8.8tɫgT'듍~AfWZTmD9 !~D1d\?߅)b>)䎓=EnKH[fexmSPG>~!^I7NQ58$ w!v_o=1Kӆo{cML5hΦ[19U(~=2SR$ g3tm؎c:bDsBN9z> RY@$R `L ?DDDƚD\P?|b2MF㋈&+Qv1OOkuེH} k[iֈɟ9k8x؍{-4jEK8w_i0S La_m"Ѣ1i[y״jу%qI d/'Be>M9/ι1!g[1De IDAToNu|2_iO;s|Csq?(Dv̉_x|( S(M`=v.\SBƯ\q f.K;_,@+ P&?ڷ6o|5bgÝ'V8V.ӿa_1$>ƒ^aLvǷ?I}.FN0C^_HӶgOf8N4e`5k)VHp!1qx9g ILk)=r9~?|B/woI%6ªh[їgKc剷@\n{'%g9 q5$& )IQqzWî _mԽfYwm9h _q0!! GX0%g^Mai:<߀9{Wu͹pJcO*I("n|FF\F ʖuGW~ǸR~<ݦ)U~5_e ԡO+lI-|,/} >?{*kzJl@1rK:=?6m֬; 2܈Bkg0yGlߤ$g:qQ8Dzwavv s'z1q.QȾao;7{զ[D t Fl~ˮ՚ܩ5Kdw?}*F=Յ,YV,6qXiWKgXG^NߞS9`ȹ1 Q>ќ&o\' \ټ4l/a3:`z4BǨMD>Γ2J:sp6euf[H[GnmWFJK+%=mޗ6!$e/s&Dp`;|䰆1Yx GqEjuUQv y[Α>grLO;y|.\h213q>Ų#/Rr=^MdmݧlW1kwtznz1[ 4bgߕt+ ؛FԚ(br@' 9$ 奰 M`ѫzyhaۇwGhދ\?g8x4IŔ 0x02^%:j-8Ӕ9y g<{)ܳ<7Bm`>8J3Gv1bH&{|=(V1A%(S vJD[˖#dKzؖ@@5o͢]:)nCaW_  ɓj.N5DZ?b; #O&|}̉-gL^p'b\ 3ⲃ {+`L&gl|40iT}:ⶰ|"-"zoI| JPj;sJU6^Ξ<򳔋HT [ƞ܃^ǃdvμ^E?,>5?1H6:Ѳh3ag#kP#ѿgF$S[tϸD.ehUZfhTw{-9izu;өX"ExQXіyJ$ܽZк-wח4BjD_WD hTU pL25nSOQƒ3\\)M}lIڶ-?19sɣ*8q)|˱_Q#-՛q8af }.؀ d()4 Dg)_GLcCeٔmP2Whܟ$q ƾr}jdzgx5:2ij֞Ѽ+1.L)IĻV"Wo9in57Ogw8'yQ E جǓrԡ<͞mAc?[2Iv8-=Hz's".sckEyk,{Ladr`,6˦t.׍v~B|Y.cO/OÄ%IIy&v{Wu79Eʄ\~a1bT5>VpJ/8ac=aGǟ慦J8Kt7Ągi.3Β|gܽZ[7z[Qq/C>ѻs-lCʏcxA?Iޤn]1g:bML!|=ӗOިO3ۙ{gصu郊Δ9%""/C-Y+Ob;zoSBVV))Ă&tڄi>rT_ 2L/W^#-$K<KtYj{߹Cutyr⚑7+ر`[t=ȟu¿t}mטYP/ g찱T^}?~q2`36ea nNq2_ڞVG-#PQG|ͽٚ?E2w`CDΝv dr,~zPDDE'ϟ8G˃@EDDDDL@` >uBaݰCBEDDDDD]EDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDU"""""",""""""{7Lˆ[f1Xg?+/`n-Q.OxWW^|`ӮgDz47y0Yuz5Vp*S/Z7L0VPNt drN"֯b”yb?oԠZj~reWٖ50Ⱦ|M붰˯)53:<zŦ4s pSf+d2q s6y_+*]̞<݂sXGjt]M뉣y sߜi bK錞ԡokY5n ?8M[%kx |tfG.f{|2Z\W#r1K%<*0rP\ԟwP^!ճ>oxVI$]rL,WogxMT|1mlɚ^'i8@} otsuU;7q#Q[tW>nbצa5$㢶p(ۑmZSߎ+2w6ń45d.?况x凙 hJ dY S끧@Zn^ D<Oph%&#ϕsHIh>/!3 Gh.zq (ž0nEMML@:L{@6VW'Yy~qjS㽁X@XWcVT;Ŝ# ;ӫVqgy&&20[1io5㱳 2`N3RA;`4k6Q8ܯa{s3=gx7ckė gy=5ӣ./5*^qւc71:DDDDDahѢ5b9M- YYYv d=/ȸ]Y1tM<ڮ1^..ac&_ uӥe|`y)#NU7+'DDDDDD4,"""""" """"""" """"""" """"""",Mvl¹8"""""sttǷa϶'8$D-%ǎUGFzz*ǎe/E(kϊ#M /jϊ#M iiڳ"""""HS.zD(((((/҅DlGQ j """""" .CX+ܵ,bw~Xo=geV%׌'`B"VMǜo>73#O]'f ZpjmW =;%ozk^;ZDĢOhj[FJe/s}Ϸ Tl2kBVΝȨpy:Z;3EDDDDB!4}'s^kY_sWH$bNRs*s򵻞Ss;"/a4?hCՀ]A6oksX4,.x>WH^1 Y ^x7mqg\+z`/8oπ^OQ6nc%ڼ݅F|ch7n 8E޳oTt:\y2!VR=x(Ә>K~⍁kj+_ 1WMlM~_ep1e ie͈|K5R*ּGӽh\vCcZКNg&ѓЮf;Yq;U+,OO|1{( k6-&2ҸOy,6> W2o:$6>ck=b*S6ຽ]/'""""of*No |\ÒKQ݄slZyc:W+;"X(ÿƎ+y] ,gXx?L\|mEֽ^ʁE\lAup:5wO-Ҧ_IY.Ժ~&majpi ggo' 7 #Vt(s%&&F@ɏCH]w drv1k"OPEE)ֽϣ<Svf:о=O̅L+LX:0I' e3X ^h"^&26l䛕 lSYZ7*}\%* v QuBKr{G3c[.nθĦ,z_mODDDDL#)I 35'šL ~.\HukitP9+$`) Uyii,Ýl/}+bX0fHcyz:ֳר"# F⧿OV`6c'fֱ̻'`iuۙ0K[7\rW։SYx:>!˳<6洜4[= VfY:(tzڍW 2s:wr^|6{{X )b>i:fO'b`pdq)E`첃\+S Y?0m;Fj{"""""vGZAŜkĴ&)oE sq?(Dv Dw+N<ֈrɬiiԊq`1y`Ч/૽w_'Ѣ1i[y״jу%qI d/'Be>M9/LU)r,l">N$2Ӆ |JP+NaR9~26,+NxW)OIc:s)$Aq? ad)M`=vy6N_wYRe/_\:6Ѿ?VμZníY#+JF{Q+|I7_i\KB&} ƜƕiM`ܤ>V}_iY| |۞C.%1 L>ӑ0dbšI>5B1'X(7Vݚs8MΌxikm^dGuwQ/ªv9]5C/ 8PS/>j~ |T3{ >6'X4~ XlVⶱpӪϰT9=rsc}9M58O:ym|vȈ:F {~sPx9#/TF\ia=JIOMwI˜ 3X66`0&k=[?/FƏŖIdܻjyI68lťdOdg_uHYCW(Ҽ_B1+w/dK:D7w_`Y3Q7>X;X:c+gl>oXkY5n ?8Mɬ/&ZY:̻X7r8W `iӟ#>,6C7އ6u_үœ?cF|#mj} >ȱy#"0b4pHχyi{fb|KxTU a.T? LOح?QryH+MG(rC/{-1kg1ˁ ⢶p(ۑmZSͿ/<]c[skztгECGpQ.l <]SpϲXӖ*аC*^;ŠW1dX1INu֠oX4*Ys4vTh 5|\mW9<"ײ:BǨ%;ds(b'Wrm-Ҋ\1&^TCj&6\3;G'.1/ǯUKJa:DDDDD }&фͩ\cœ,?QcsJC%tF\B f38|=Ku_(r2w3pɋ|AEmHܵ1 nWC&<c pdn&F'LƜ¯߱rVe "ԨCOpC?MaŎ]6l1/ΪY|Y%6NLACADDDD^8~ {o![O^UJk\o1r;S<*otiQnJbW-aC\w?Ejo(/ZH/{2~cW{5Sn8&t(`:G>h/}R8}Úa\H3p-V6pM N.i/e]b|'^xZ+?AnFƼ@p NG9#ek4#1c~N(^~!K>䉰5LQ)*QoЛjC!N.϶O gy|{1R3zH]Q!""""CV̏;xdG b˶gHR܈<>-b2xf\FYvO;Ar "<Շu剬,9-3&2! 0T=@eZ9if%-#AwQϫt.lG_ޘ<l)1tr 'hWfi3>c>"բfwHס@NF R=o8zC6l:e=)g@ϊ9v;!LU?[ q9;Ysz~eҼwp[jP/É4kV&3ޞH%%%AljsȐu(RW.BDArq5|3k^nBU buM)6l \>vjoxSADDDD\ KWmePa"sr T*l)o.d8`BpP*d 7>^$'0[OXlp"& B\MX|s,B]HK 5ա.eJ0BLMo B`Y5͆9?$_5Q(Ke9̺4Jՠ#fl͒SMyAX>Oə}ԅ73,_aú׽"""""D;Ξ:dffBάn`zJ3B~bwvi6LEXvKN0O gE|,W \Uv~ mVc.Y/״ Rp"j ]H3p.ou)"""""GVV7NE lݺoN.埿(v:""""""(P````````QQQQqȏ;~ZGVDDDDDyʗS{AKEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDunj=|={9[/drp ڃ^&2B3k*D%Z*A8`||/gb=CӷZC*_e䃙lp3tҫԋ9;H2}r}/'kD>:;? W>f3y&A|8C-FDDDDDDSIʶbЛU1Îs;ݧ%C֥EІtǹѠ$^>~T|n =O(Lߺ ` m]L7_'`1N'L-Xq΅qhNFePZˡ0l)G.Fň(m`F`,-{a#6>WϛKJ_a(hH SZdzJxoy9Fv7|;`~i/|X5= Y0L/Y^LDDD$S D.rJο_ri~E)c1%-#Awa~r\7>heX}5,`?N U;oƭdD,=c-oMA`X5\^gp:Oe&CO(VbGL$oEʋi.Sb ߲qǘ[97Fa2Nd*ۨ<Op-t$cC2 """"zE2FT%.V!zSH@q+2GJԤ{<>aAVi¯s!9; }<]R7?vk3r!SǗҼPûikAm(l?u!q Lf+6O\f.N9U2nJL89zBENTy8cWMvIJC$IhL6Ӱ 0Y֦~b4V,<:`TynWS&f$M-ēll=c`eR1sNZ;/ z2] َM8ēk%)f܊;^`ݜ,d֨S{`n!|_2 ׯ{f<s1Sqt|JhЂ;ҫP`ӂavlvfzLdB6~&K֨ Y:ӗٕD(Yv;㛽i`op+<ј27""""z|6̞țiAt6j#o`3CxZl4g8ZW"ӫ_ɦ ^L̍yTz#-aUGVzӴye5&GcǎFf9|Mff&)t '?2lb"^ϔ~tN~\gkCڊ_ V=Ʃ݃I IDAT8!1񾗭[ҥ,"ٺ%gԠ """"`yDZk֏1]i+`yXK=ŔuO=R\eBAWDDD䑡QEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDE`^G XB^a"C WDDDED'T&mΰ-spX/ˆf=zOvֳe0{!ixΝ{9(Fᷔmk]Ϟt+ÉMdI%)ـ̝ܐhgMZx=Z, u=|C}ٚӏk1V2+Swڳb/+""" ""YOV+Dv855<駏/~_9ذZm(BB#Imׁr[!.}vFT ᖢ4t>O6@Ll6Cgr,sڭ -W۱~>UhAVi z)MkVdrjɹ9po}֤KX~ Mľ*fdyɯ&5w{89. ,T|]}#8}!w\%.@&iPJCzn{עe4KY'UlHO+>[ή[/"""," ]J?;63}qV?Շ']%]Ċo̝/8YWN29~=5G|? nKP# k֑ۃio=Өoc H3#8\/̭{K5fpn~#Ɣʑhnjp~>F_Mb`^iђ˹_i{ֱ?UZ&?$($Fe~[OڌmԂW,9z1s9dF/+Otsy3 )j"""H0u68w6gГC$99nY֢#!r=tUouklהo2t} """&o]_VV7N{ٺuߜ.]_Ay4)W"~Q{v%CDDD ZDSSƯI?ώQCoCi=W`̜~EG6,l$""""3ZDI\WXy TeLN;OTͦ$h[w|J}LЦ )gZ_Ha;IЦ1mV@J%""k^Sl%1aGA S1 ,ty5߱]/q!d8i"Èbg[oX*Qr$f O2EgLKn] `׶/o6.JƅL5Gcq{\<]!G/[gz6XrOf3{0f-n  dNPDD-ȭBvx&pk:x)j[Ȅj)b6aoTfg2zLkW.q̌#œ;Vɵd~7>q՟b~>)8T8^?Ȕ+8 }*0yMڔt¡F%(N)g}8{CM<♫hRG<[&wx+H!lr[]9gQ'fSs3l|ETOp%֧Tcph''}&TXΩuSXs#kp}߶[#p LuBm Cxcw2oz"ѽlq|,}j6]ѐ r@{?A1 (a\esB#HjѦ/߾]r0ksעQxluew8̶,(sL%X3ŀ LM0;cٝFViUn!q!v'gn$637E)^<Ul =1ns,Tpv[}BYS[gO(q،T2teƥ[Ō9Bt6Nì/`'[93ܥ]uf87:2g05<-Mc#ƓlsrXLyq̺5h7y!ջmcA6MQz4nMC/;"&,eĘrɝݸ{-Xc̯=ugTp=&̗Go e#9 HLwA!#'x_ 8s P\'2Q_m1^Ǥ\)مqkm-ekWѬ=Wbҩۯdl@J$9ΚʵX3=0x6ڧ \LKvBc%^߉zȨS}KggenoBَ YQGJ]kҥM,?&b_؏ YF;"amڽһqjgf̃iP3'pyW[ 4l{x\Znb|h/f?)8{ف5rvWsnu Eƕ l-:{ )Z.6.=ƉXĒm6m9~CSrB*>ًd>Ɛ;\mњ:ݛqeG8)>(Qٟ+g@E@ϢIp|m<"D\Dc`O)i_Bf}Dֽ'EIj3Z(|/GrɂXmd`?;`DZSϼLOHk^}Ibi )geU`yę2/ڎdI9@rA#+X ߟɼc`0a#Ir+-Z|eHt&d)0Q'^/|'(QOlt~6Ǘ]]_~bYXz/ϞJ㜊5/gKr<1Uh3)-E 2˾~qW2x2OErES˧#4)5%4mO_3)kNj L{ֱ?UZ&?$($6r=n㭞< \ % wl78K2N+Uk{H@?3U=Naz0': ,Ip4<&33vfu[]UE| Rv^4㙆"GLcyL|nMh~zɋȃÚu}ݶZY8WW{JHLe֭st)tnY N,aktVפXvkYWDD`WNMf$pn6ϼx6J.F7h=Wy٩"-T&݂4X ڼkXֿ=D*aD Z@>N{7}w3-xyjhDDDDE=Ǘ07iy?[#2k6;AA ^cbgڒj woEVsΚo{5ήw*q։2lYrmFbx)`"=R!Z89dlw?8S@KoGϱsd>;p= [5:S'яvJVEtd?7i;#t'%"r|3{>S1۟^oOă|l+*{q!YMhpmQ oq8’uGI(ߖ1a"-pJóC^x9z"|u& .p,NJqlw=)-`DmlÿON;xM>8Y'fGb,x&rdEk/sJZEW7-dη;̼5󋈈?zE ! <{r5 fi@ *E5ֿV6}t-kB| ߳ŹOzaD~[;ՆٙIJӚPC!Lk+Zv^"cWe fɨKZO "M]yyId̄>ּ&mJv2s^L`tπ넮ĵj-|b/en&,F(E}ijUjR~o{Ee_VrlLӶ 3XL;vs^ɟxg%Û_1-ygC5"oA_/W ^Bt'@&̇2+q.PY8Ҷӥc]t \/Q3~ܑ3]i֝3a# I k@A[OK/Aq2q\fe[LÌMT?K%q.٬ʲHMK%*2*}RX+#_XI?+>#:$a秣axq/b`ݒو;sU ۅߊUS!ٌڻ*;sr @BH @ \D,.+HvQܶ,vuujWqֽ̬ζvShWQ(T[EQ[uNBn$pr;?Z~˓ߓs~QR:]۷ ·Xb*C)raWWu?D;YyRV%IB:ϰc $#?/~cSݬ_>/ӂI>KMM,h\.ȤO'|´I nm4i<o~Y֯}U(J%:[NtZ|=GwP$r0LI$%]ɗgqZmrb2˦^Γ?ݞlƗ c@G;ktc׹g4M$IdwwZ GH` Թ- uѸ1Ko^J~koLK`j-( }r&Uȭ7=V$Is&p/d|.ZvKgT7s)|} #{ذfϱ?lbly~2>&ObarWx~:>mISʘM̧m-WWwx3^@`I!IQU@{j>{.Zu,i[OIQ"8LiCR0+1a3<.2K:j:D2G=;G$fS29zvpĒJkcÓkx/ȸt!ZXLтL4oНǬE]<ڛٻ-Vq~vSYWsqr7mϹoy Y-Oɒ$)uk鄔aLN,f,%yc;Y^y7L&#Frɨn:!rL2zwh{,.j]azrf1%S0h"vH3/&. ^yEDLĵ..G%Ik͓O>k3vH R,pbwaj[r:L)d °`5PA4g¡Ml`҂F"=׭#@w Gb08I6''Mc⹤NbACJf:zֆ4OZI$IO:#sQÍ}ڣͤU4$VP]s@ Q?~vcק ù\X垈,I$I$K/gqNڪټF\rM).%P5=1c Hj!TM`qH&S?5Ah-TյL@( DKw f0,w\=gS%I$} c%L"!CN'^ywzUl,ʙ̲/xd2{j^KyiC:;5]u;U< b}3YT:EKG R>wJtLWw20y_N*$xjKz1LW4nyY֯yU%IRcg̰$IpX$Itah4J,f!$I$Iq"VB$IBM'W2DA$Ie3g=$IƷ  L'++ӪH$I.>n…K$I7^~ tKIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/sql-databases/image02.png000066400000000000000000002430321461403617600246760ustar00rootroot00000000000000PNG  IHDRLF(sBITOtEXtSoftwareShutterc IDATxwxTϭ[z$!Л(*TŊώEQTQTz Iғrc Af̙sΝ33^W^BH 0@ @' 9ܯBh2bYaHC @ 1` ɒ$-̌~ H, 2&"@  ()e@,^2ǏXF%@ XI?vIeZHC @ rѠa#"$!L@ 6,k4*X$!r@ @h W%,KBVf8S4b|3/GXT6ePRvVf釻ݹ9XlV#I2 Aᨆ]v%Fџђd-7[DP~Jɯźm` T68k7(CퟛZpG[gIWqN'NKK@\;RiןʚvfnD>;e?R:"jS@;^;\Yv)hX ';j[mψ@Ʉ5Ei} / r $3@^A#)6(Gp\ּF^!I\@dDZ;5ƘݻEyraL첺^QaUjdV4, YSk`Vk3p䮨p*]DFr3`㪵yͰ cFE؝6 VվbٟFQt 1҂o{s;}@{KΒy݋\R#~Z%b^=lғLCoѯK_hZ 1۶.Di,޼_`))_De)*4A*ڨ{G|޷=OWV;YV~dIF(5*Zp{"Qh4&]>n"q"Bzs}<4.TJP 8 au=onvWDdƿyQa$ aU(tzo=y}M cYp@(Z^M uƸtv A ڨWpi D%nw-'&%ѷyY7ѣPhZVמe˙>Fܐ9lhݘ`sO)ç}szxʤ{9|˧_dôi} f'I̖֙GWJ 5iZϯ;cn;O@]ub}ݗ\C .fw}Pf\Տ |WFkL!=^]7~(N0Ί;~^@{\iT+(dJUS@?`T‡WѪUjLzVXzd\K//?uHRnUkcncJ5xOoow^CSΞܚZe(;9<7̘0\Y_QLMK> @:⾗@]b3Bw ԜPsjϺo9d"c3zj 6efуƕ~=44Ȏn"q.яnG~8ngrlZ/xǟ'+ƍʒ٘o?5\GtɆZdTV 4d濮NKe54S-`,]cH;>=7'ETh/߳5YnFt]uZ6OLh˸%<4@y}Yfoj)C\6z֖J2dyaXp[m' z5sNFGG,Iy&UZR²ߴW_}Uk$˲ߴWj8 ^ߙ-&"A 5 R|? \m5i@rᵆpTwF rs0xѤf4ZV-OHQiݣTesS]+ѱ=MCؼ9X(a:0!(J\RR M]b('p9p KlJI%kD]u`&DL}3Mr٣~7mvI FSXrTVD`` mdEE;]N @{&kZT Ȃ3~X5Ҩx}L1#G.y O#>VY^ZZ^ZKkuGYp=VSr/F@N7hBF6DA^ي~)%[bA!9"8e'fĩE0[zby$!,{b<FiSPjQTiaz莑)jbBt\XHZx -@VԺh}t1?.0oC\W-&yaq}'c#tZp[+* U6 Һ|xEĤ1'9:1 $^Yz70$ߴ`6;tr ;vO}) &l~)Ԯ ?.G/4m8|&+9BNfF`!$L <^wu'J,[sR7ZnLk}Qˢ'??Y6dyE8y+{iV.'"햨2uBvI4ؑsP` ),~ҍfL@Ӯ`+-4wL}[LѨ0FjSOM3amd*4U'߿tm۸\4)$9<6VA*߷\32{Y'hcf[ik}5@@-QF+u!C{.Z m΃<^E^*J.ٳK~qǍcxGOS AM?_y6w^:ѿ_Kszi{k2n]`$e}=ʾue qBl>yeoe"gN_Ǝ룥/?,ǩG0\!]A2)@]ĭZNeg Kj\sJۢFp O?iO~~\rãLvMˏ4Q3ZO{T{EpK-$+`x+*mXxYeGq+t+?E,DZ$gB9!_2mM"do@}zpm@=38@~pC:a0f  ,EQT$v[2GhB}׉oeɦ69S 1iYQؖilytf4u\Rԡ%&F%)rԔ4%ϕ_>.2K׺;`qJbOQT^আ&/(8c{St,PZmܪxxoQYQ Uv9hHZ̉N7v{0˱NՐ)˃m,3 uk55i,`ǷVwTpyo4qק'9LURr=%.5XA?P)y}pKV_Mԧ1 ['u&㜊&OVh,kYB᭨`#oݷmz+£qy4iP(bݻ=)=}o IRIZe˴H1lVTyZfK-St͟],NۭOT[^|7_`s=f4lsmUrpE S/jJLpCq(>S{Is`aWU\7/*0a)C'ٗVS4(zN%My иՀQ5;ȀVpr?gay4cFm]]dbb#Ci!Ghbԯxnz3V4LF~/,\}g+dIl!I_0駡wchST}!T/z}oI`9Yh5 Mj]CiRcp6g0jW1=nm^Mhh=+@[3Ė_eYkVTMW9T!'F2'?,G˂9qb%CN6W,xZt$ (޹TZJZ%T5?w`=װ %{ETwTrJ8[۫ֆՆTZmV}pr[dm'4u RQ<0Ykt溷++NIW i閪FuP,a}XpwvZi{Ryߏ-O]ÙQ}Yո 6rr=>#۫`DDӈ.,;V ؟PNPҚ4Lt#GGS\ذd <ŏoy9= b`sUcj Oբ׿|ZKxE})n;?ڀ+|c]֚(7$қX8#w\B~.R?>4)9t˿ִ34 I>#,oC t^óaa!i̾*ҷ2Z&eo< | iS<}WZ4\˕iZUc )8D0_+y@"-*̡!&)HdԩûG5#tgj8t䋁P_gF`y{7|r0(⿶t]tuցS Kedm(U*,:JAM?|O裟.~|=CZm>u)Yh#6WrOG;fVJ'wn?nRk-/>sʟxBg/}H0!~F[2Qjg:a fX{gOj0@Mq[;܎;eQ2 R=fnk^i% R^+O:->ĨVV(e_r c)! N y/~zʔ=z][Z|i(`38K>g5$DQ^4~kI]g99x} 5v>(^MB͸\h&J!mTYJJ-jE4YyI& ڢ;jYȐ@D((..̙ STteM8oB7WU&$P{o7iӞi?3ibE䱻]"MR40 U wP0ϩ,CU3du{12h4^%.$# P*377ng 1JIHqzcݫy$0@ ThTHp n$S0JRQ HGk3+,Kn HF>hժuaq!}Nm\75*^dh< eu6{4Pz$r!Rv ݚ_+|q+ۑkYS+tuozi~p5F"?+$I-2hJ>OP~k%Ⱦ^rt[ڴ fy^fUЏSauz$IƸdZZ𗃆RwpeڅO~~LYUsS qVM"VZ"bxg6T<(TZǪ?8@pEDF&7ZTQ4Yi]]&0Klv>'@ 5JFk|eΤ5OHJ%')뿤8k|zOym @k++fVݪ(V2`k? J~-}d_>)OyVujZJiku?{wdF3Xٱʳ5e[:Z \.{{JTp޿ΗG[o}ьB @ \A*`rhp2r5D&&%/~7E{gm#YO=Oww&on|)[4቉]b o3sխq>:vG_ q_@ OlЮ'V<1\Ygx=zo}!cb͉L}xSߧA Ս6>po<3z!Ʃ?Gvcwx @ p Ӿʔ>0i C/sχXY'x;ѹH葑PhZ?3mHȸOZQw3y%cM1c<(L=ګ¬tf*rߩS@ޙ C̸{?靾@K>؞vutnv ՁFw W|5clwd61cȹ_zoc^_|kӟZ14dFq )>0kjW xC~[hv{W6_;"Y>Oqu`YJ]O xj2 ;Yش~cnXҭKlyxE1vP`A"ꇻ1 @ 9-'bVoXkKEH-DԱ4[VwO Ma\9vFZą|0m7›NDW:4qf1)Mİ(=*5`ظ4xnNMG7e-ݼq{7"-z+W'D{Z_yPPz._K! ̂!萑{R8nr @ ?׫w_u{N3׿rn3Y+c;bMӧgS(ٞL߳kgOxq7_U3WO*}C.*d̸Ok?š|%^v֐6{>&4Jի/uF 6/߿1!_Jܶ() c\@  笣p B^̗9wMr)q+r߽RvF6#P[j-x4FE^yusK@:44?]>E(ejDrH0:ir#4l{vAq7uՒ@ @ІUuGOJ ޚ֭s32U 3Fuxp:}h6{ 3|3߽=33Zεdؘ=t֒hȘ$gN!UN';1ތU }[@ŜړG^s&wSpRz|_0/LvL\ g>tnmi:QROT~b@ .C:cM_ЃÄx{qԋ?۳o9C{4vW礜z_3kgۋ<WKs1 3Brg߾zz8KvWQ*tMct(`ԡP6!PVNouf];ֹ)F`TϼxF?b٬x@ e U[UFpNsד?;tOA @9ˎ%Sp/\hZpC @ \D@ rlW#@ d%@ @ \VeD @ ᲁ/BGv@pav{jڰ0FV1VnIлG7RqN.zwK?}0LOm9e&1 {M$.)xQQ+Q]iLс˩;JKJ{qYtۗϱir'e@i4e{9Sy|Ȑx>f dAAGTo/7_ œ!%+jF?ygM4}w >SQѽz j4M3 i =v]Q(K]wx>ei)d6fn\>^i5zz_L&qE}K[\R'^sjxgV\f 8w;W,$I{oڼmR)K޽6_SG?ke垬XZd/+<^jo\cfh-؁n|㪜Wu},5?9c{d8|由}GvdKZc13&j:lpm=A>;Dힶcs97x4O(x}hkv!qEERT(n5%%%!0sfUVN{;Ze}?BWls>!{E-άWCgjW?]2Yf@ۛ5U뗾[-g/LtV2.>ElwZ04r, HxQ`~xv crRͩ2gͰa˅UgQꐸԐr{5/:(8<\Rr8%.wv,hvj+)-5טu:]Lt4BFҲo3jT$!ePh#uVVsu;kQ`9{VRBƒ4eTYOzhB؈o|aɺސ=<4-gV=_?>q@JppDXrƄWB9o/폸ՆkU']ׯ~(tYWMM MtCiPp3ǦEDF7վ_<;_>~@А0SXJIo5p~+[4{ag5x֙АWںÿcʭmtJt),)u؃[YifYVT꼼Ҳ;wԘwڽs[nPJ]^SvY,/G=';x(gOV ;K)o؛.?gWx1`^Q|}r=Yb[PYTj ] zS@`dLL34'ެ'-B}*:'SkN{0ȩjǙ-V$ȑY{9[Xd,*9ffKrٛ/;/܅;RJ`0hT*UeeǏ斗WQp`xVL! ZQU^k?QOVY'Ć[`):'+>Csܤ9,EE6[JLTdGrpKrfޓ/{Z XN;x(gܣEf ڂ1axB3dM6']bWʃﹼZKHO4|9/|t.:kLFpSDYviс)&:wЫ9uytv O̘Ak^]5i9pѭ۪ 3i[`Rw@E Eu㡢^9k;ŅuKH8tճ|ӫobxk2''d{??w䨈Wm>J~%Wm}⒆→ {r Wwy x.ƵsCJ/{wk̜ߺN??Ҹj];ic4]Aʕ/w`.A]y}<C&?eg `: 1Hk joTxC0c0RdYeYQ%I9"BH[MGLzs~ﻳ׺o5M.T W0L>2v@J>}Wpl~ H' :1=+Vy`N2"B?.~lep/XP11y6#8D+lz㩗\};uu-9bw>9ŷNuepapUĬ7||߱zu͵Dʹ^ν5K}{j[t΋_R®/VƿHFiDJCW-/>=p Sv`^a⏧'[>\Ԥufp80/$3@Bb U[t_l{?y}1;ʯcHsQW>OzPZp..$I>S&%&%#2|ɇCɌoN׳S֝^^4&q/zpi`:8,Ս? rDƒia$I>G(Jeߟ4McBQ7aвEG=~+}~|ߙ]^~K}oWCF_s+5;Uq<^Y#Vl2Oo>oA ڱj%(#׵DuM] ͸JO+~ܕ/N``Snx4]=yzG@zNK'ΖnYS^t#mG@[:udR^I Jĉ[Z 3)z騦?izOaV/G#kԨ4 qEwj__?k\XQ3'(I}w 3ƌxo`,6ѯ/+ p "(.5+0L~w`Dlm~qXa} A>V9,܆A%Ij@{^((,LJI$I!y.s8XZ˜=V!( q:tv3r*ʫ O @ sNXJE.DͶ P*mACղ=bÔ5T]guxICSz@漎fk^Vb"44`\K{:k\XPD{y+DNS3ʶ~nR]BV1 5d [ڨH-U6Px Z-&9r v)1*Յ C5tP YJbZQAgXnJh(-/ڏZrAYk̔)%.XO*Nt*ؑ ]X [22`/eH_W)=5|U{$1*(Kch IDAT aIx[$I j7R iu #\B꫿s7,xx=0"3:swZ2nhpEk}/a0n|'msHJ!ni:7˻ȩ7vz~ wY񆭮Tcn/4_kG˒$b_+~tT~'Ǐ^_u Mr Z>U{&7džĎWn{n]=xˈ763Lli9 )pעlȍ_6ըw5N`tFiϼUבSn߿׮,$iλ:-Q9e[zc.TiZcRs  ʔoÇ>/$aYEQ̭w’Ȳ.q[A7r0;cκ¾C9eBFǾV(=cܧ^{ۖIJMYޱڼPU b5;~ъ*-U^;i*l;ESXQYr{pæɆ3Č~?\ ؚEϿn_A1*='̃3+~z'͘=kH%*۩MMcK6DI$E$e=/NϻRdMS5:7G zKqJkͽ]k$X_E|b 54aLI{f#0!-;;7q xϝݶp-oeMcZ#)V 4pP$+ƌ?i6̈́VkԔe8( O@{imN1n܆n<>c)N0V4Kkm4\t 6QFdwUYEP2PP $"@^Sftz5).=S( z멂cn)8( @u$VKK%thHH`PڕoXR0:HϨ[) T3Z2MEZm;+;!94jU:`dyH+WBIvHB(63sՋx koV~9wԒ8ﰁM%~?ZVy !b;wP'b>(EP O|hV<25;6hp]%)}.@Dv͛7?#xAD9Bnٕ{8!ڹsgqqq```EEEn ;;?eP(,YEulKww4H b؍`wbcZ]؈ݱ ߳0wwΙ{̶K ]y h1}[36-uaoTj22WT/l=CHϭW ڡgwgm~J`I +@q~6MѦURT*$Y]10^Pq^S]7#iݣLFT%PDd2IqfU`Mwd2jMDCfq)!+)(s0UfU(J0CDrZZ25&0?9(*/'@!7TawE\uMmy.M|W\On|McMyR GDTR:']QL[9"w$R)q카t |AHpP*ȱhInrrŖTc+hԘ839Ye҂2ovᰁ(xO V3OOXOSa1i[/QX< rUQ_gʼ%IΖk\m^VO&E}0Og8 h$UNRLUiubf}БG4>٣RΫ0wY&qT-1HiShhg#֐`_j/4V"ƒbIQ4`PK?o )%ɑ#GW^)))7oޤiK.,+==޽{ɩ=>-Gv)KRsǖ}/ܴuBs.s zcѥ]f--:==d^aFp>~>[g {Fʻw_@⤭߹vכ`3W >r=}U--UOS:~|yƫߐsZe쪽RKYg/ 5͉EyL!Li4k6ˀ"(WhDGw61Nr]2<|GL-@k(53=^ezMr5UAHHzJJ%"qvi:;2>cf.zmKZ~P_wOg/&ܺ6g0+l-;&q?[?r[Bz$sz5O'ʺx1m4F@0hv6[jk펻C4rʒHDQCM`82!:S'#(7\"TQPeeʔQzHMM:==}ɒ%:::!!!'O?ޘ ۹6XCG<^gԞ=GhRۺ>RE\aC<LZOHYXF]m3*68q`)MMI7-$ae0V|ñk$/וbV˟UZ۵}SVBOz*ɒLΝ-_== cutk'I)j}|U#VI Q[Y(a?[Skg*O P^Zi9HRcs* $TE:E4^^AF~gۃ};/p#d~W\uoۺXȝ>#^_Z+tBRpnݣ{#z*2^) K^-qa[vs*MwU0LRcg%\t4z')I=ٳoL}2W̺0z9~- W &ʬ7_`mf45޼MRSQVVVf2 Hpc87oU{e(RN 䪬#//JOMl&, W Ք93_**B&*ĘPIIqU d~)QQrMJ%<-zO2\MdHE2+9""*\jw金r<&FHh<g<A%sc'\*ES.((pssb诠U.-E/RPH~NI+LY +,~ <ʨT'|.UaRwc+hHMy&-UQYMHJl%5%/ STIIILTe,T%?MzYTuX>ՕBUK-@д69Aζ{ 1sr s;ɭ1]CG""u"˫!asd'-F +x_ߩO[w Bԩӝ;wKJJ׭[gll2'0ԳTۤ{9bw^Y˺ ?ծhnsUuLWcsSͺ(s*^e̸/hNZ=j0;0?{$k/_(lmavm]]]aMťOӮǧ]u~\dӟ0j 1r'GG}M*L9Y6TMEJL"LJJY%My_UϘ&q&S~vbbjL$h_[LNC[#%#4 09VWz{LeddLcU[E_KL&h(+qpiEAVN upQ֔7o$ EiiAꢡ^G'Y fɩi~(.3S3f829!JԒbJX=ک95Ԍ/i#P5lkM.J)R4`2TM+i?9u֯A!d&H)k,i/SWuu858V}`.]g[̮ѵ.֘N93'ZVvl3?vZ 󓾂pp^d7|u^Z0p [6Մͣ0̓4BZKvGVNtz ff*\NY[hUӰ6p]hm1-}{W{=:?m霾[6fsi9M&-ljٻZuGy3W/SQ1ioY+7d!P~FEE9r騨(@$I@Vvw7縴 TlZU:U0S]>a霐R_VIͪiJH{UGƇ&`EyY?R)i$I| ?>v4VJmMmk㙐tSX}y8Ӟo<2LGBn,32Ḽs:_QQq&)\r-M7n|KɢĄRXVRS4;{\YYY푝i[y9CYIi*nhg 9b|ϼ߼-=j8x}_u#e|e?O$>wl%ϞX~&|%UUU0,%%NjE#A#9sᄏT"|>Κ hO8vA A֔HjMDˋҒA"q>`0*N{yaX2ga:#^}xfpx:Dzyur%;&Fa/[իW+[l @%RiiiIبD4GrXlH%/HF/Fr~ AԂ*x>B,h勔TU $7,-y Y˱˖ qbȊG8?.Z'9H oEFfUQ^6@ Jr@ b@ @ P@ @ +F~@ @@ @ @I@ @К@ g%97oFR@ @  XiQ>@ c`JH @ =x@ @$@ @ P@ {{_QsOL/1bSL::{I2$a" M EƥU{]};ӏ4]"@A#ysGFH潼z+_EkkՉބ諈v Oԝ2n?~Sf,zmb޼}[{~߾}uO QI>Okl7%nWq0 Sc\gݺ*c q(hۺ mg).>3[k˯'98kt`Ecן%H6çDh!3-MϒJΝ=m[L'JrjmTC0 {3 z= =>S;é9o/g8!504i:ܜ\49rAD_|fTP)))ZZZH ւm;0AYa!ȬsQf#:O:Ҟ -cstAA | L+bnlk ՝T:qޥ 9[NoB:4MqLz 6j̲u$U+NEQtu>X@TYx{z~aV~OWsZKINYY1@Q$;8kILDhDu4x``hbL| sŢׯ'U鸂Yѽv[c16sp%Kkk(,%sݸ~--}0@́cl@[c4EGLfx]A4yo^y\ORJj t˗J^ڸhC" 31Wv,;DO Pb.JL,d(<cr` ,͠5kw_0tco TOnR ѳ⸬<{gE Jr˱qtZн 'Nl::sgãzceSs/%9%%%`(3( @9HX,FRq1~?Ў?\-cڑsn?:`ɪ:7RlqҰדT6 `RóErKB,ae5m?zISEi]q f| 7hӰCS][nҤ[Gw_ ly#}9 p5[f_DZ<4=oU0}E/o료s+05sϰGuBhr"lnYi2Iw)+sV0u-}f!}lS"C}lX~vz}'wIh`]D(ܷ׷r5чQ8blh@ t4@ @Ie9@  o_C*ƶyOGG8gOJJ~@ o2o#m]{a5 Fҹ=,4xlœQҳ6aÂiLXLUŬWQK(J5 N=vñ'4slU ]tW=\@ $ɡ2 1UV12k{ܲO guwyezڦ-MZZMCUdMwrʵc7 y~deч.*.>s)ᘨ> 4q 6P 4A7uRpv]2lym##5 J%;OAs~#F?%uq%N@S̹ePꪊ/bjc;(<'n1@ ~iҢ<1|bR5q6&|a`+xQK6mݲtR/g9tS2sqquog}4_yBVla**Vagˁ#:;iM-A By.Hhpc^' A'\]jX4w[JPw\{CeY : n"۰YۮܦlЁ_4~g;]/Ph1b .cCK`lӈR Nr82^}W)5ǩ:noUZi5& ]׎[Siᣱ:7vbQۤ9\ѹ)|cm[W/`$miݗ`y \~-VvZt-C MrpcGgWmB?%qU@hic`aևoFZZjfHwt45o9x껥tŹA^z>AS<ÑϷv025TrΊv7⁴*xcb_Gs]C;޹dfh'?_]L; ΪD8Yj:+>fiKje]= t D_T[;tK#X_UCKUc]LZgql lĹеr74Вc6Tinl43ǷFXscCC֥M~ꁚg}͝ϯʧhk4xVw3Kxv=D_wǜ>:8?4`aVEgO:1C邺jX'S/xH'=/Hp%k|BW>LWN|'X4&4k7vS.9禤s博88W}tЅvFtijfg,xEua!t--U -{>?1ײrj٬}ۣ: _}K Gwqӵz %M>hH&fƦM9sFh@OC̾M]756un5f*7RmbkyU==[Yk[*v[ع|# Z-:2OGqW~RWxqF舐V~;?:҇x̴.;ȞVF,[O@|7?'1'6l߁clXC"ՕyK`}q#t͹1d5YJ*2Dڥ53 4K<.=bQD\5mT0{_6TM2kވI׶('m `o;}vTȷv?y{^ҡ#Bg&9cE}C5z=;k>*|čRߙ{XT1䱄Am\qY”2M`  o˄zY\PtuvA'O8KiQ*U[V q(iyMd'5 Cۭ2|p5WUyX|t.>~6dTm9W.>ȳ,ӆ}9D'68=zHغ0qD;%r޾+mxlU*utPv<{% g n1 `[Y? |uuw[7)7^MAT`PFtߔu 1mG*O S ~}fmm5٥s60/::[2JL:4gonx9rm@xd9o%9mNǚ3W8fa7Myfay3'ְ=1(3;m!(K}K~BWS[|)QNqYSU;ܖT1:ꮐuaɽ)KK/t?24 9zLXC;{Tc+&t6"`oLrk@ M޼)ݔtuϽ{iNe^ibjƯ.Pّ6&ZF1|<p.Y,lr{ORb-}xһVRrraF:#98VKfF!M۷ҽWGwmfU)5oSHKrbV\dtٴe8YUP95EgX7o0{G+bD_(?6M%=lPvU}B[V:=K#D7@iݕrqf֟+imsmoo;N Ņ'IRQ!#$8'5^[(}zH+ӎbu$WWN49_ʗ(rqOf7'`U|L'ދ[⨖6M?OTċH r^<@w&M~uvs.쫉F#5@Å.v뇇${t쯇Uaܑwrhs5 &M*l^|;J0;jOgꐪ `rͦ~߄s#c[q{֞dZ9)l5ӯy,?z3<~w:^jؤI-\6xu#{*3~f2V72)_]tB 7Jr>rom^xR OiUDEw/\siR^G*{᪎N槯eW9x2K"^!V>I=oܫW.>͐4YQ8KYdM `"A/$<{p>k8[vGa2n*lxyEQhk1Ur#`E"aGh` u-8M3v0)ܥˮFv ?MBl{zs?HxAM~4+ZpC91+cP@?~6Q[MC (2tZ~!j "+~QB>!*$4àЮ4<ԽWz ~T0YsȓgO^Jjzh8X<'<0zIPyiǰZ1 p ]:$JP=פ[do-0-@]S}J.7YL[FTi 0>\s(i&,/x_#I5e]n8q~\>Ͽ(zGf$V`, ( LYz[P,ԢFqH!\^EQu:L+w֦=OA1gp*(O{~u蝹l T nI *n0`Zu?+*YgG t0FGHeyAyL˾amׇN4$:<޽\EK=ru*fmd ;#*Ƣ2e6A6v囗GJ f K׹*~38&⥌^_9ǥ hЬ8F66V_zkh o)觥=#O cz4$Lz[ա=|tU1f_ Xd'4<|a3݅\3KC_Pk?6d;w+fx\Ѧ' 5:9@Ilii޻;>|oiJ܈j+#W:uҴU:fWWbpQSF -g7% x"c/,yeC]Y,<\V Q(flL%,qR /o㭄ƍV`U3Qh+nϭ`n D + $ C{"zjY[a[M^rđB%Tֲdp=KGo#jf! ;Z><. IDAT8m=1̻moeۦ\S\brslQ|AŴ@k{j5Xݷ^gAِ!ϸӂCxp`]9Aw`;=hl̺FUbk2F:Y\~R|[Eƶ ]~T︷7`MzWl^ ŕSw7|iQKIdt\$-/`Z#[Jd 55 3Xww狔T-[Jk陥S2r=;X9UToy2'0g(L3mC#M:܏/n#YHüͤV]=>C_G).P~|rh F{O;klӞYH1G!khcZc;)8"d:m~660Ƿ֮woI|k9Y9 qQqw E\.WYY1#7w};;D F\܅N^4`X,!/ y4GcspGxb688 7x0 k.ŝZ1F&}W/(TQR{̠$WI &oCeUtћ_GZ`~uҬaʧ#‡xѴuv2!6ڋa-([ٚ]E#'*3ha U~%9gQҁUdc2Dq zpG:* $D==8 b.3+.)xDqIܙ? 0 |Z8LLJn*_R <ѭ3ѿat21- O+::T IW|ڃg $ @9-iL ERmOG]Fil ZC |E%*BAP#E,ATo06( .p2kyz<q>*4UAMA$A[H_ϡ,Εgl'?[gE2YFqׯ_GԟH*  6 _kޢyFO"BNJT;?M[1ַ}QR|2!ڻ OLi?1]O\/5*vعaE~B+97̸oϰa~Nwg$Gh(%{ttݕO]J=sNj]d+^Y7`y_kt=AÒBj^&7mt H='X6g*3(ik?@NPvƐ'W2"bcK33_ U sHD&cTʾ1vkL7ѓ5l2Y2.uE _xflj^CdIR$I$EAjF_7oU?Jh` ߾j\1)g ~“c >$~M4]O)2?i!jkiKu7T|E.dN>WָPYh_oη^D眈^BHrsmw7GuP443򏇸bX[#=U={ޛxTz31P7uk3G4E]LmϦԬ=zy6h/ʖM<6u6't4TײaE{jŐӹ4u8T3~ PqCO {EEE4Mdgd|V/?C ;k) {۴n|WO 5EyE}siZdco?'c-H^Q!pd*v7PU״j6hŕǦtQUS5I@$, |9%/F20^777ʏF?9XlĒVkwRh"V36G)׶/%0ž鲠s3}&,,LwwA8U@aN_\Ӫ#]Xq] EWv{BXsO K5ޑRNԫQ8%_SKUG r 71`Mz}ɉӆ4at~m=sp1PeU~D#5Zo{@I@ u'9y wTãl6@5[߻L᭵D N)A,njc79riԦC?i?z0ٛ^ԕͷ WV`tۻf7얥]uYzfKnrV;Ɂ,/be^Yȓk1{yFcZ=NU)Lijn.H넆Ox}}:9lM˼V/;>|GhP`J4V737g~m5Չ6ݢ{gWEg\ NiE;kn_V]k];V]׮EQBK3s?1@绳~.s9swΙyh~푛]lhW;tDY{hM'y]ި {)rU_tS&P 5ʝÆ_VM P7n:iF I6lySwh>΄bYvWnc )W$X(hKS$WF=+zMz)\@W#$NCGAOM]U!z %)u/SM:!_o$Ў)}4;Y?,M M ,z,ˌI)S8DE1$b-ݺȲ9 RopUo8ƈ5> 4wYjy3͝=RV!/ TU I+˷ ,3oO%DiiCJr i(P^sKOIqo!ɋDhᡟq Cβ?p 7 8O87nO!@xVrzPX{kyyZ4xJ?~Ѩiżjzz9!Op%o+7k=4i&㎿&3]$b-ب&6*BE\Z9u[3c}3Y7dD-h{KnoΫ!Y$m2kEA)遲Me=9 R *mmmY!GX _mfHI 46RJ:/whQ(6Fqۏ>ȕu%|sQ('S*çI$ǍkP5tNNQM]\ =zL)+),zZAnS X["PHn|&t).o)RS)*P΅sVOM%Ή$M ESBOE;8U~:ޣ?9Љx&R&|RVg6 *]c)!ʰӖ[n}[׶[~b%,WJ̓;V.?P#Y\XlFzQ [Q  7HIDPvcn᜸>f4'RV4N*nzUrK|OϝңFQEUj0!%6_]:K ^X~km찣~u>V~p얣JT=lu[y 6YYk'ۘʼNΌɵr<7AA \ΝrtXK (%e%HOKTZnQ*GnYpfoN|]Nnzb1;kBғH*.7ɵqS2.t|VZJzwE:6|}MߧuRJS5)k IBv'1ϜB2GVol'sh&}}vlfj/zo >EkfqT]uzjRbϵwsSޏ)ߠ!o|_P(-҃>vF& /\4}`#m\kSϘpnjۻRj1~\6+Gל7U%n'+nSG}W$54ǺO{[Pout6P\ llS;̶Ƒ} kn&O zmgaUgeW:huA !%:x<إ&AxO,V-R@IA=)j0}+׽Yaۈ>tՑ۵nw1mT bJׂ4r^*sA)фH%弦NZխ lee%`R3( &;*ciVtxtnwxwP]lc@Yޣ">W,޲mک,Z-DlHa l᦭f{uλ5T&;,>c&[Y{K4-wbQtY&,0,q9-[lŠ>|6Kؖ)66訳KF.e4j{߳lF3(ۗ]xdSiGsS,6"m5*8Do̒>{s?) BDZtN Bҵ ׄg6]t8N&\"US{\>5v: Rà'NlѼޟUsWװ xN,?fogS~!ScJWQ) 0O6n{y.|%ύՓ* %%%!>_XS`b9GYQ~~Maf},P J[CW*@un'U@0MRxA@k{{kUYbƊY#9JCԋ@'km)Z)&S~?nZa S W=@R_]~s89)M\W qWuc06+WX1kj9G__ꁊ2qE}ۘ"9SQRb R ɹ1 PK\މgu)M PONBBqf}OCE23V̚ZQASS{I5Y2KQ$74h[nqRT" *(ύ5'mT;Rϼ$ħdk(vjdd͌w鍏 fw+|1W8&=88X0,,C4#[`3+f%!"~`kkMvs}Bp{z ,]]Il|aY\YIY$Ց *k(ύt8&]~J͇*h(2ƋE8X5q/VBR]ϣתۡ~aiPTyb&gdddffffeHRB J"X, ",Ǵ12rl6XH-kӊ"_Q"qʅEPpȓǏkMijj[ZԪyŠ" *(ύJvr;62y Ie'nilxb`EL ~4,6mij"*+-4ŧdo:  V###| !$ן8N*&$&ږ?YRNc8a9Yy޿,{ro5\ :bODc=թ)|οhmsE@l''_kv23'Kzr=,) V&R㼬9l[K7:!_T(&Φ lW:4yƖk1 Y^ }}}EEK.ؔ?,G2~f_tKW,0CR$b8uGe:GH$v5MCAaN_m4ˊ F_|*Rhe `(zh;6n&ѩy1SҀ6@H/R !!A[[[II#˥R\.WPPPQQ U4,nH'Wak|Bb2ܩ 16?ҋsEvNrOAUƭ5* nk$:?Q )h[iԦQ}XH~D/ƓznN̔G) ÜΫKÓ4{| ?n>[2+L|VQ#+o2e BoW_y WfZuiVGHz#Tybk\ۍd2@8?r̰y?Dus<~/[üωi9r--!9*&zC/h!(mHDŽ4Qe7cJЩeJ{; [g9 (?I\wSysCmE@+7T2rs$:74Ⓘ^NF-]fN¼=8c#55#)ăm(j}:}ZE';wCf5M:B#fUUUGGFF|a  hXKKHz8B<8~7ǣO܋5`c8f'c64)4(ItEw-ߖlÚ{gn]PI3[nY*ŭiOGR>M O_q +TdYYL闰eܙߡ=czL\ZH;vIk݉ ?|s]K W㶮n:E7zҠ+;V\j 6eVy'U6d{/\Rх3YX_! RCI%W06(я\vS+ҊiSs)T|#kٱ&35s,+YCx~Bg2N-+94DApr(w܏LϞ^r3@3:cP=>@+/W{m9eIu޳5iuȓ= 00{[ߋ+0\Q'Օo1 ˌK[KN@stĶ^MW;W>Fh֭6lySwh>΄beg6tۉjܝ/dm7yY PO)ooXt(LƢ/1Y]NhU\⎯4_cx^:w?FB(KN@ܹo'R&1Ss(j+9ճ z1i#yջ+N:ǵ|,ԟO(UCk[ۼ99LugxNL \6F]խۋ (um=*~ln$JAA*~wy< i(ssJi}wwK@9rr/Rs9{IrV?2ڼrSO|nespv8(-_{c& 4t@[; &g12cZ.,gM>#5- ΞU# g5r!< J|JiWj_(ڏ۾QnAKUZۙ.ڳ?}XXiBo[k&ןb_ nؙ_ sq;iεz ;GJ,Si?s^!Q׏Myӹ')#ٍ_SWy΍]EŪ?)DEGf}b㟿YLM&c O?.d7]yΫoeQ>৴0:ES&l2x!)JAA*ɑ?ZcN5Euk)ovp~H:س~_\͠|fe枿,o#RE<jl߳kunN`3D5)EmS:" 8bOP)ORP)'uuPV˸lwaNB9v\Q362 KIIɹsJユC`n'b/g |'DE#/>FSr b%4WW *nM[{1+Jê |B^{/] smˍ=k]y_S+|6 7AݕgUwhl?Kh \*5Wx^=N8+24H/Wi|@ӇeO+$ \Xש`<E a>IKJ{(A|zGoR0CR֕@юZ,! TC_<~O79w*1rji?ׄG*$ P~4 4rn#B"dYH@J[GBrTUxby~B[~4j-o`bc%(bHɩٴq#@:ɾSEq7}tIԸNv6&FiT!` _1+dB>/ɸLQ 5LMnX9cfirA+RBKQ!e2iN g(N+]nۢC4'Bg`$0ppc1B.%Nܡ&tkgޭrO bsG!oҦQBmxܼ8[tm\o c\,xEݼc' *%N+ג{v,u@uHU+N$Lh.w2 R{Jg1U,%,WCI RBDmee CX}.HR9Y7GR! TCi8\~Vāaj+׳e.Yd>4Jut}I#Z]4kTK uyax͝Z,wl~iB'3+3{ > %Fh(6heec 2EȁB ɑ=AZjKgPZ@ﳡϺCJ9o:OgIW/y9y?,'e_F'fPPrMU \1F]MUCCC(fee̡ڲ@<1Y`m+z%Pު '8Epi_:9%YV}ߑb @jl;lWqڰjPv<Phؽ-kN Q)ڭ:L&*mGX]^zPr? F蔉=UcwCңHT +oI7O;p3eځ͔ Aa;}5FӢȝG8$a׎_fڢЮ ,߾dioF];0{˘ψ|\_7Ux#k!mb]f26!ܧ}ei  }36M1*kH,ԡrlXrye9< S/Bn3yҚV޻9/lLfD:nvZsrZ,˱7H-l H[ܶ'^*竈 mt5QǰX f;2֖O@Ųt:4iW-:Ԍ+_XCfeKY!ridc?fdHpZ@/ +{r@ XYY䌽k$93cٱYi<~(:L+gX9ò rw?dB1z/\}Ӎ 9-;vYNh.Zw-ɬĢpm-hk>vW+uZ-~ػgŌgzSW ?i}]N3-͗=3S/iܡuOPtpx"gԖY",M= ͢<[+)ϳR\9NZgmK>rSŋ7Q*]޿E[>w{x-nXCg9d/Ѵh;߽Emge 7m|<6V7<߻w}NNJ&Zgj7;'īCh  bJ_WR9ydv9𦊰zRD)g9-͎nX~4M_pk׮%ivybŮMu2v7s]- %KMωKy&jbW.Ebx1#DALww]AOG'0zv1\% )9 5/^b2bX1D?VB4-[4GA~q5f>oYX~bƕ'O[!x8JI8 ֓L ZJE}Odc'N[{4Ҟwma‧miA>U E~_SG 10<4%S^S{rs5 RN_uiz`jjӡT{&:e@fV ];F փ>b0ª˓A  -%U+&s" ȏrr~3%R햒sMKK8m$MiiiՌubɩ` +bv T WSNYa֋olm( G7߈kJX1kj9Gi@1SA*K~[|q,2^|ӏ?~y-r1cŬ%eA89i\"?zGG nu+f,(/ %`DAA|\EjO" H̀F AAA'AAAAP }zmu:!֥TtMZӕh4\D{99 }ѓ1IlUUY&:.ʫ3Rf DA*-[VDAAqAUW3JlycOKgP{VS%>SeӪU9IA&Z[[jHKE&:4crЎp!VTOTL7x)_N?d*Qcƃaf L̶u2O*Q'#2bo^~مzksVzz!ko~8`1ftg#䴒*C-E N[rqoY7Ϳñ#H2 x@o|i El =ne.} ʒMYZR^C#si14NlB-vb$\N{Vio~_*G8È3RMo OCIAW8GQ~Bz^`A9vWvဋ )jcXjU:9}"NȲɸ/eScE쏔8&MR`9T؈\(BP+ BVR¥HtLH @rIl2 cҤ9h!$ԔK#Ni91DhE4** x* :<ݜ}A)xR-&emL1*G&zB&X f6 [|LB&CmTMiBPJ,<);?q,fSp2)$G%O(k B=ڥÉ HV24(1 ,ȿ(2$%ɋ@yXorsPr ZVTG,N[MARJO](˔g|}D\,*dPJBͼ/< *|̔l#*RҦ *=3o$: QnE(zyY|X)@)vjilwGb81yҋ@lEI, t&~m㋒BK8Y|{˙Al|*RN* |p5xG8[Nbk 5|ߤ|CDIIU;++%p6}csnnƞj4EwTH9*gF( jLSBEGKZ|Y vF8] qEvft75SH&xHh.lfu|HqY H{rVT_2އMa:2%\!υj<8(e>$rw.'s]& ) ɻNoɼ&BHEm  sSv67mz/Hʧ&KcsmogP؃M,VLLgD1_ť~<%0HȽ0fjVzv c2y q)/W^ITb:4%ι?ye IN);߫~]}|hm޼yyg[yZ׮RVO$;+E}r(-[4di߱OOtKy4)cZ+=:!Zt:|5'$HXR3^V1ܱ!Hʥ IDAT C_]ZEFXR+ٍ՚xMJ}!`n;ȟ.j3茴% ZL`2௖9r޺Mfjpu5}^e HD`QZz:7龖$Cf򫭮1fVLnM`.mA租T_U}G_m1J$Ag E]?i2AvWMmC&َWlz ۼݠLV٤QkxXMxA[jB@}y]]kZJ.yw\ H+6pF~{hąUL< 4Jb׶`z ߐ,nR$1 )B|oiPò+ie>u Ojj΁k[?>b*@AWn I>yK+͓?x|KMXtsv zw?\eSkCk3-iJ ŵLfEX;]y&n@jݛZ`vѠ7Bv%d\p" HU.${{}*B)IXa[=[z/'[7l]xkg3t}k_5G#אYgRRU'vj ] ypzi{3~ hιC]VM{~ZWF <\>p򣺛G8>"l߹ӗ޼v`}B6p甕 = xu~ckEw w= ~{mhW5gCl G{d$4AΣF\ԟ6>ាQKzM8δkWӇq9_KҒy{ag㎽ 8# &zSS߷֕'@Hꕃ6S+$AA'a*² qHשi+0j?s;8'/4Zc v֠JIN}0<mJђfݼwQC'osA"Jy IeXasoRz֪k]%#J{NeLax|ANgiRJ^7hیN48xߞ7.Q[0|];z4c-&N1TsOߡpO 0rY?8t:LpKH!0 o|$%B]'%<>YH|hvPeʶICG~ݦ{)~r<zcfS=p.Nΰ,GGpliTJ.-W=wqK%:[8bw7u90g]MPzI;w Tk*oNNik%iq2Cgc~n(uS 4VN32-Խn*DöL'%n ZڪTnz BLNGXF`|hyj;һr*A^zIx4㚑Cfi{^uHӱ *O]4ˀV *A&b"suu^LE*%}65Qʻ S=^`7EDNkhS ^YtwҖ÷n^sJ<+^~٩}6Y*7v2v* =n^t'woU };miB\J^-D4 P"m2#U^ J )l}SRRE]ixmsedAAɩ ~D1.%4@vBb]5i=]aG~Ha7`a2e×G>qiX3\~ R8|#z`࿝n ֫C sHNÝcɎEo_Jb|U\B~WW+5!Q$,}R!@؈,$yLQ3*XzO= dI5fၺ'k> /weJfNS>.tQGnRNIÜ6P%(m]qJDDiAEhф"(4תy;(@Vri5}=R P@YQ^nK}VvdtsAצTI9D_ C^y- ~NhnC^?c8)\NJsH4QX:.--SL,$ ;L GJ;ҵ(Pq5@o."( i;"oy^&IXiRНnDPקw?AR =\e-.К/X!S\fZ2GK9"T4Mqw\xOEKG,i ۟;{)bO۷=lCAn 7,1IZOW6P1a)~>"j:%NdǾ:ji*e4+ه1.8#AA~e~ɞBzEfNlD[E׭qsݰJʨK&z- Cみ7oV&3-ܓCS47ӳ@KYɍdv ՓMí:*vQ@po͟134Q 57/m%*sۍwPa!"-sch D6c9Sz#Q;6j]f:)'M5U<#i0xۦ!f@ݱx Ivإ3缍"|e/!6;*2)H-[;6Mе4_Zߣ:JýUΕFf{ O߻Y>{aKY|-VG/]H7)K”ZZٲfcS{֮ZBSl,oR[4Zn=):RH% KC%'ĔU>>eFM6-rR4[+++iņlhzkPUuõ(XAtʩVO{rAvrHi9'O(EP+BhAA~]'0 raQ+ OFE@A_aXu]NbccP T T]'tFAA;9kNzD%١VjӵBAuraYɹ^C^ jZDAAtrArrrP] B~V ep ZV  AAIN8  T)pWoAAAɩ;={,}t),cf4U1( nLyFz],VG/_]Y_sKAAAj2?'4;gLr㢦GݦA-us ;{Yjçhs+e=oOV"O?ղ5]׷ΙNx`17pS5oOE}H;#j"}nsrӞtx(]䴳z^< Yuz>Nv>@Wf neC37nMYcob,jisX@vuZeOnn`eii}G';vy+x p5RSZq="ji\R84o>/;wEl= ;ľ;)k#uAAtrJ!ulx* ^ꚲ=q^<8tYEBD,+W܊yȌA &2p: ظ a[B bQoy#鬗јÔ ;o'"9x^&h%D2"$Z Rތ S/O{;6:M:K S?BHoJj39#zt?İ G:Ig$]0ֳ[x*I8bJ kMoB{x!a@;wBgnUv} ti3uר3xd C(_b̘Q[i;w:ܶ#Q6[UXV%𗶚SA~}^/V<2$Fa {>ouMN?Nh bCʬG$)$"m$"&WgUڕj^$̎$EC1@*W*²zP呤ED$j#7QBZbD&l![hьR[UH{%@bꭂEA}pbr9Qa"[{},.]B!UmǓiՕ~[{QD: VxQ=|: |uu8iֺ8M& "bp! }YTX22+S)̝ʙΧ*"F H?)2.M`qgDĉʹX|BS=p)Q&iH' jY SkT3"I sT2R*~PO"R afDFO,-t<[RQgt<蕽R&oƊ:loiaXspȯVzf&>CJD{8(pwtHOO+x+Ɯ؝ 2,D"⌬,:^&RM"F"#k.#Uy(W޲G˲$TJ{] 7)GDb "v^m S%=gw'ɞ{;!t4"uA/'24UNOFĈ8M>f26RT˲#H vxOx> ˞TUH̘ y*=i襽m섽TD']~ϓ:1!EXBx}Opf6 Yv}:o W=g¸wY?nÝV:Ճm# \_%%?=}̊:mDnj7GMm,z̨u5E:K_ 8OeNJHkjo┩\q GA㴽 k-iUB1iSOoZ$k%$l?t*#?*[ oma&!\}wH~NVՎ\ ',krH z9kj9⃄(F$ժW曈HlR+8v;ŧJH)gĶm7O.wl*$"f#GobR\rj:{D)ź9IOZܰw`r2k3uN}j m0W9 ^š%R= R??dQz =%D-Rسgt9%Vs'Onݦ |mɓ'UV՜8q].(z|cq"=""i^IT%NÏM~'gBF2]=]ƷT%FidXͷ֪oG; QV9n;|߿$n론Jb<"VqM[]uT}%޿z;&BQYpO Tʷw&ǡ]HBrc}rY.dyrIGukj56`ʡ<~M0"Tև0~OTi͸x~(Q!JTոƷDVBQCRB!~uB=UB qPÄ(ܟ17p54E޺r3>~mC^T/*zaՔ}ԍ,?O7܋S{Q ʏ >O_V_Mm5R̮4ݣY?ZQ^]ЫW~_"}+GgG N+.oޛek4_H}Igt#^АrqxMr>6U沟wnIu{F=_V?<9D+=<{\_6T]LI,<ۯN}s-5$l86{vUu箾<%) 8"VIgO4$,f ?,`0@^|kVh+kW4o*nd$cmq]8S=Яy]/WG3 [+ZǬ=>2M|+6Zt>#-P;ϼS! izjȳ^|v~嬬Ti;XDւw;wpm9vӴn&'P6guą僚V+ccg?tIŕI^f&杶*akt4~^*(~澳行XU󶷵5rr} eQV o[ٽn'~].;3FصzƁd WE&{'ukTkfĈROg{k(OD|eoq3vU~㰣y%s:j˦Vy*{^ow޵A)rkwT-neecjWVLڠϥcYAwGXzYۚڕk]U.]Mx<ج>:ڙۗju>x?)Lj=_ϽT wQah8{U2cJ{qOmIk$_]5~Vӛ:~c,]7p.*|ޭ6gl_|ĉ sbkxD?gjFٱqV=S +f 6@ F8qFl8Sje=QƪpMgB:_=xCu֒DmORM_SG#r3 Dr}K766';W""qۖ6'XUm^KTqV_%ze95tՑ76Ι;x@zˊ w\-6eTg`o ;gS1bTaFީ4jF_SǏ›_^TʘCN2~Weux?=HRki 4XiaqvUԘ""^wjۻߘW(/ފY5Xzz?\>x~5tNŋs}5 =GƃͪgJ ie*gkcnqƹ뤆ۣ"Ĥzz&&9__Z ^Fzqze2BbDɼ֫c+=-ZzSw/pq- 9I*s&CgYvEY ; yjӖVkZ;w*V@D-?%IM:]{=CnK&g""{N89sQl|5!N9fX4_C'gVNݠ~M[ __P ,ׯCW]ާO[ٓ8Ygs].%,Өu'.6mE)=UTMjӠfuG qʕ9#W?Y]DS~;hck<܋E;/,?$}ŰR"Ū ]S jۈ_N+mlM].>{;bN;1i3E>fjתCTI[u $"]Wj_ח툄8Me9pKMǑy]pNq@(*[ޣ"Me23ۦNǃ qQ߼yjVJ8a֙C\j%E$nP>@a/q_M~**xST>UuxS˧-{EXj.gCEmyOn|^`|m|T'Phx+ \S92&t.*\!']Vy(Q|r ))B"xr"tN[BZi324/xf7Z]HcG^ji,+4<~ l,42b2d ef2K v} Nq˖wgve\޻[ϡW}a}^~ځ> b1ƄVn5d񇃤婑pOx&fR_)m,ZR3nsm\x(8@@*K (BDDbx^wyj.-WXxυZgǕZ]H(e0{-jJL$ cDY6{9-ӌJ"Pvck76>Y |ı=u/4 :͝{>`z5>xcE D"!u-9X1bG }F!_Rr"#Vzv !hɮն_]Ӫ7BWׯGjy8E܅<|M- JZS uyG!a.;y5-v-!r_ʻ}de'VF@1QDFJ)5!II$Ĝ95/7Ksrgl*c'_eRCSK%&&3S{ԙ7qyt +Pevg =KI<eӳMtQNx|Vp[W\Ԕ# -M!OdwE|}W4ꮨ5T3 yÌ)f2ūDE3-xG^H+/^gkSHJO*9IRGϊ-5].moFH+ 5S>>orzHݗFuj#MxfԤKpfmw[qaQ: ^7iulU86#츨k?/ݫh=xQ9бmv.g2:w2}9;t]:4,`\`6wubtʖ/{hFVzOHk9m)xWue# :Lgڬgٽf5C2N?kúKG]FOfFBGְo5\k{ ݺ X7|jQZz=sGWdըaMolZƸμ:LҼڊ&w/7z6iAV-ygwdCU8?u˻̐cY?o3 _$U\z-pG kM aͼ4V=5Y1JAwO!>liP qxy皹q8-ómOKDA{7zЧsNCl&*;=Y1C~ܲzϜ)]wҾV=O̽WfYS ]XnkyS/s "WiIGts↓/͙k N߻ag_zvncD$4jNfұmqV*Z(R|Mm:{^itr&m|ѵJ1I;/n&]֬I|Сݷu[57~v}B v}.;u5շJ7#|E{0짞;x||i(b?~2qqQa=wm'OVS78viܞݻ/6EzI{<12.ӣ<}e`[t_Xܰ4wyRXҼ*M74AQ!<"M$۰(k}Qo_%+T<'64ЗpD ~.65MI(32̸oVRǿ4سm0_*IrS̾a2r4֓= H1y)RZ6^cTiIi G{]!SĄxl,θY1bF%&:R%'&3[udC(1!XzTd]O8mSiddd #'E[Ic$1uDGoGZjJ^]}=al\\&RU=]/O @IJ9_ǧFEjɌ#:.*N:ISOWykQzJ:UӅzԸx9cHNJKlmВPR2}yw5>1*:W{t]DATP&!.3MF~ɜގ\O E/ccLLRRzܗ7:q9$|HfxMΈj|bbҌ5SMERJ:i4)YU''Lxp5XyttH,г1ڧ^PbΗNXhs&jM3dH.1ԖpIBC;Cթ"C:eRdhӵ1r@(qiRiL#‚Cy~dВP2ΗdE\L"Ӷ}rMlL%GDNC+qǧDD՜DкL1F$227 54L ĊMdj!\#/]qŢvź~_gH׏j/sσҮdM)@i8_xMX-X@CDD,t,k@)8!h:yL4THX2'^?ޏ-M!XY#r玜z(Js Y~RRbCÕ2 Jۃ%G9UzS=Iqnͭ]7B? 3:NQE;:8 s5|?5Ntќ?18uzl'ބjZ9X |>%6qy2v[ ^s'+ΑTps2;cM8 %Y7IU+[sG7৹UΙJZg.j#-mhq.44L}p??GrRj+{cDnͭ[F+ HuAS:ro] ~ml! "Ult U/|*RP +KNGwZR #=Wn޶3Z;I_KdKW\5 o^/M""Q&ED5#.Ԏ͵IhҞ*gWwuq3'"d ״lJRUs+C-j)+%*5 !t133 z6%$XҖjILMrV1i7g!s,J-nhj{rξ| 4U QOW 6ZUVOso {m]{>H>8l-xBw5?z}n1pͬ&y˻:X1ceKqJh̿Yde|V84[sNگP/7 'gd "">`]9P$g~ ~Q޽JյM+_8n0:/=H8]IA!G`Uo'Z:uWՐR +蹓NnӦ֨ݴӈ$ߴﭚH|b~&v_~-'" 6ZԮ|> ֯ܵA[+OKDz%ѫKa.G9kkgahba8쨢u.^>mj_vȑ'2M3dCȟ@@ciiiXm7z+Zܜ{p!7m9;Qc>.}-緖5te9c XMfyvʾ˼ִg.?s?q(N8[N8YȜp>>+]<k"bmiQEkF9ۡH`Vv:DkyʻUJ"*ܕ]=\~u}ϒ] u82GT)~K \Zӱvusϸ/h](2pӋsNA !+&@ǹO,/&b[LAj%E$Bs+3.&*6E(3Q|\"Ow0q~&1Ek֕?eR$8?;iTH\~օW˭W1ƄVn4˓:$ p"c,#0"%Qi.-oLބݞQAFa˥ IDATizzZ <4` 5N-ml*r).ko,j-JK/^gkť+e;44,>>GDTuje~~аAj9'a3 CT?ϊ&歇_}ilT6aFM1/=B[4ըxo~HFWb&-(ѪE pM䉓y=1#! _6M?rʂ.g֬7sigQ"2w=ʷs.3ih9S>^d`}DDB^<drбj[Wo"Gܷ,\\TXA+;yt6mg8yj"n P,/x۳{z((RmPJ44Q9%DP%BB(В (P:P%JtW@(Q] dCw5(uJvw_'%%DGX&-S7 @itիȨkԩ_ 7z1S-DFEI_Z=]=MMMc%ZRbRRzW9wdAv1_! ,pBgy/^"Mef59P(%ZLL #Vjbbb ~}|q|-irGG✕e\S公-9PjDRrbbcx722273+$=ZHdƨTvW+ PfL P( !!!;w4jPV|dg Tq1Q)ɉJyZVU*Sg%B:nI}sNy}ߣkr"IXxxLL GR*r9cL"ϝKNI\HKI||\4x===J=]KKǶqR7o]w/XΜgOPΣB!<:#ުYs(R&QQQJNGW޽{iiiiiiO637]vbb׋d('UzZjd;!GZZZ III qqJw(]-ߞf-ּաGuӜIMM3:!k"VrL&ɘݽL2Dt…ܯYcN_tdD"Q(<  y^Vx2Dw5(u!fd}PZ)Hdj*Si))) bA$)TjԨXvE5oxVL$q\Z*>߽{V9355}5k7l܌j,P<<xCB}r>Zr>)ڬ=曎7A+d}_ijTs7{K=iH/ +_\2pƵ7Z~-'Tա$5_~㣉իWݻgU())9&&&!!A,GDDV%"d)ʄVWTl…74dzμ yVف RR Z>B$k!QVLDnǶO&""ōKX=>ȧSMsJDDv> JjV_{|'_Wwwq? 9V?d9]wrjӆZrQNմ :P ',<<888{m^=&2Q*r\RjH# 3bԪqH8j7<طYB(;B@>zfPgÕ4t\ŭTF|}+hBbx2ȽE k^ImX_tMw`#uL?_&$&G2INN:z􈶶GZZղJTY9WMJOyӋVYkA{7I9*UF*Z_OD&;whۮX$P4G>V{ԙ7qyt +gz \m%D]a 99թW(慒WxRL'ULڈ*l!'59*H$DqUjUFQ(f rÆ }+Y): .d19ꩂD1IZI2È{XYn@+Oq <,7C,ܥCeγw/7z6iAV-ypzk;q^9|+OT*޻w/(((]RlUZ`#!>;mƫ8or2%Od2MM DVϴ3ZRa-Z,YI>kBS *Z H4pN٫!Z.6yFזdPĕZ0帵#:uՠq#t5oʣK&w N#$횃{{lwd+O'}bN'O^dFx`+"MpyT+FŻzK"!d3=..۷BD&STwSUjMDȗv oeӯcֿ=f坏/s֞s>j7PМ`SiڵiYjvqTny6I݊<7ࣕ-]Lz57+B)u)l? ~/祧+H' TrJJÇp844:[b$%9W\gall̳3 T^( &MD?/c!Ld*y{;{VT6 hgoN$-9{fU^-7 оg9߯+:؛\uj*zW]!iߧ֟rWݿD~6],t鷨::S y8."%x744hiF(YqE?y O%=ot}}}]_T>4ʰwZRRxWaQWo݊ܨXGbffmJj\[K[%535A(YqEql|WMMrJT(@@@@ (Y*>9? 8ӧ(  KN,Y02(ZAPV(+ qP41BY!Lj9(" eᅥU eUˊwj_͛zo­&3zyp\W! UAQ:ԟ@IԱOFURˊOxuЙƫ^Ztx(-*MΈ=秦6Zf_s=U]ٴ3,+5۬qύ8v43heSYT_fP:_4YUw3##{܊mٺ:Yhc|-{,}U֎ WxYKw:/үyEе3wuTzwbG\ 0s@Ͱ#sz jjPf|cJcIX#*+oM3ךq~Uced{T%8r׊q: }dX^zN{}M3glRCn~[ЁB.nXpsu~\px|51qBC_L pg%띿Yb{qFꕩ曏]<~CK<%SV+'G [w>C+xϺMK4 n a B@Tjx1Q~߳V*<cL!""o/Ҏ׮(*;xFc5 h^G8OѢ]v^GJD;_yޮssh$Zgz,J]VU͗rrID~!_{j̫_5J4?YU&DD..),ljUjNň8 WwRݔUqVBN~S%ݰw]?o1y#"^Ռ8MSGWkS" 숯nQu muoZuosDTUS7xW1-y"$c ƈUj^ue˖++"_;_5jE2)lʯ,,Yѣ{.ӶKϞx2Uj^h`l@G訨ڕE?9__/vYrþ=:e_\Y5}Ζ O):\o&s\ ̬̹4$D )x̵j@>g܏RJ,Qψ(EWw%WUN#)C^#wę0ƈV\td1!PffLqq jH*vuwWVYU+=ȮɐkzM{c60QK\YQ+cI.vkg6O N>pBr?̜ Έ1uኧ,&BVj>|fP(k9KοD6fk0=;o^9]g^kTo7u@o98~ rI4u4gd֢ \ODNS֙4cSm{zNxͲ/~ T<#8X<ψF3ebzE~pl-+""Th:BӾX֦FT rvľ u9ƈ~ P# qҫ9y]3z""Fڷ1qnhs\f{Y'z𭎣s6'+=y!Fv-[~;壧e{&\ =Jw=ޫ>WğaJAeOhi )1.8*p{6 WWn ҔjĄhj n"RTJwצ񳾽"_޺^kzC2PBO.zPhIO/=̨b2^΍殞ɮ]ͽubĈ%r,^vNiwnxi\Y&N}{e2ghd@LRCa˜U GmST+v|]G^;`bIQf-{~bmd'u Lٮ(|fC4aF\NJZ{-d.1;驂D2GղzzğekUrCڪGu{!{2u؎)_k|8~rAq T'-ʣ~pzFz3n֢͢9M=#3V\A?9Z`n^ӗ'"Uobbӎz؇ן{PK?|yl:i:xVo嗢yƴit#wv5PhH->B&?dRбjMOYmfu|VܵnVlccl./?  1FR Q@IJJ|Hw1۝ $6ָ?l>:׭.o3;,w/fڱד-:0F<_o/{u6ҡrIN_=wgSǽ8QYGT;moIQ qģؔ,VwK?~1h]1KpgIWqu./{LU}J2\2/btڥLD!F o+8cmw͆[ʣʃ_.䃔w36oکsg [ܼys9\s)/ ȏ7nh޼y֟iҚի7kZ ٻfZ<[*鿃)Vx<#p%,pwrP+jEPrȪE+GUbcP+jBEhReL!b`׮!nݺA@ ^yME7b(/E/A:YNL3=l,'޸ :jOVߌM7q8}\|)&H%gZ4٤(ڣWo& ~-HjPY2nW3b haJesՠ()'7 lcW}گ&֥1GVRxeE 9_scjқ 9T:;{ݳ O]|YoM=ݸwDV|%9K~vqR3QNH3yN4}FdgՠI /qkoeLz% bq:#ALڲOzҮ]7{ k@a tuhg̖ۖc>9s)gBS/SwR ]t(I"̧fm<)mƹwlHbȐ fJ:p9#6*6ٔfvט3L'gВXkkMDcR^beZs^*|4jL.Vrh'I[eZ8Tyظeͼ3zP3T^#*^еJH^>-9$eF)&IvJ驝_T(ML7$Z܍Kim0Yrՠ(!'1UfĠw?^^;yWQ |7vLmcKu Q Ƴrnm4d& L%EQ 3T|{G%qrthb1-zZo3L$Ord!D)Gխdsɒn,Zaɢ)I1U>%UoQRvS$?.Qi];:NgYMUB+8,< hRn&_δ8 %`QKB>RunU$T7˲"RjP#N5ԋ dvoW&65-/I 6=헁߽,=$]BCU2̛YڲQm%!S_cz. 1u#4*#N(_.Ao>r%СjM;H٤CY݉l%W Dbyg˷|l2&Eɍ9_I_41߬3ظl|{xkTe{~ӏ|TS~7T[+ɴ8r? }U혷J?|\6ZbT̙LoŕqCz~=ɳ)/QZjEX`'v[+x^dZTUzؤaE_|6cRmj&gF(!!o-G)qAb*!!-eRQ%~..47wyqjrP ^'LM˲h*ELۯo-6/ZjФ#VA]m_:?mKlut[͝+Aouow=G,;/ ujtJ1 En-Fud;f?xZWg6nj0[AjήYwZ᤺\HoUNUMmj̯L0{5cq=^Xo/Zro#_Mˑs,1}&LBs®K3C̜x fg5!dԬǧ3q^C/Xz{s>cڋ{Gڙ5hXƣ\dIQB35{zz>yן޴gH3b>vjk)UBN}{8j~?p!u+9<;t;i^ίڱyZs.O/ԅV Ѭp,J%y?\˄Bԫ*ͺu.i^7OFaLY40[-1̙O1ojcVz]N@}KmV[!콃sd&ޠiloWV#),> 9]Ɓك&\*|zoo}}7*:!O=mqeQf%P{zIww/7, 9kM=Ȯf9ro5d./ՀLQN+oKmuXLE]HDX7-_wIa>/*4"P-J$%(9ta-wv̜ܧCUOҢRMBgrҬM+&딡~%WmU>4@]@C<˴ӭIEҶRBNIB[eO^,o~-_$ !dEh\إ# C%=x$ !YYi";j"+u{d{A߲\r8/0˩G. Sv}w[JYFy;j3߭zS|K~:n>.>=Sɘ҃K!*}*׎ޓt#$]W;SݐU7}5[Y}TBO [{W1W gM(rvˇy@2+/͝$!t!aAbwWu_Mnݲ]nf96Y}\Qn U^?6hI5Qg]]d(w9i[Wrפ8ߩSUuT!j֖ g λBD*b̢/n1GC,POʳr%{R^{A!اwm\O-d[k{纀9kVFQ+g(VNj5m!Mx+\vo OdFuX~-϶ck}|m鐶{ZKf;Nhx;KP.g h, !RMkt*R?nj:4f l1M"Q޸7j#oQ &^8m2Fv6N:w9*g`x.џvmt [⯟uY-4!U:+rج-X8uڊCNޕzDtɲ.zjE~vjx99>zeܴ߈7HV ◦_M`G\ЮT[.ӆvMv*!7k:p5{ orОGh⑰{ ԷV4wg\LԾJ:'d (^s7?io]uc/۔˻4sIM[hϞ=S@[yE\{m׮"?ί @69>IDATu׾l/}Ѡ/e#;vzY?V'gJ^ACή|^N_^v~n+!,'7jO'& [:c.ٖnQ;KB%Nd*jԙT_~mެ)- 9lro·ٕZ5uѽ" ߖ{:SXlYlHr^ȐSwP1ȁ_orn{9M 6y7Uqz82=A@f VosZm*̭UycQSh7rI%}(b^Xv4%JeE-W4EgeoovF)YVnt"E|hk !$v8 @ |}}^v捴vv~EutuuBI-DI{@%r7dfW(v_`X*W,$]Q$!#j\` Bs_HJN{7D `v5 !99@GC <w u(I׏^5ywHt:V<ƳlW͏=R&$Izr7$eIkSʦ !@IVAvB'\n]ZBZIt.^./Vғ*zo`;9[W] ,rJgmBEJQ Ikmko (BZYKY.@IOIzv !=ܓ.Ħ{FPdNd"f}QekkaJM8ܾۗ3VIRI6ޥ3_;w1V%JsuԾB$Yx=2n!dV>b֛'gG)9MR\JYZѠNAE"#ɲIAV64ss̉7n&<}\K{{iӮL4u[Rc5"!5`3KrJ8Z%@t66S2QwIFLZQj W>!RjY|76Y*$+{M\6*>fYdg%?p5H"ezj q7_r+.CZ?UAr+JyKo\y6<=J?4!^1ODaby(5(b8si#IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/sub-applications/000077500000000000000000000000001461403617600234715ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/sub-applications/image01.png000066400000000000000000001424501461403617600254300ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwxTUI#I: M:Ҕ*콮ew-oW]׵ݕ""RPzIB$!$!!u2G $$@B {{s9E?p8qq:r{H9Btv3… @@@ c\.Քhf !G#66Րerv;d&T1 a*Ay&n75GbB"t5\n'QDFDT~O<ݻ0#GrH|@ff&X,Se [u{"#"HHH ))RNȈr B}f`a")*+,^h_5ZjKpܸ\Nny3 f Z`[V3t9q9 z1[ԯ_ """"""rq\.'w}7cƌ:v3fdɘN{1{cƌbl) aƌL8 V}V8ld¨@ܸn.'v;nS"""""\03'U0k8qcƌb9!t8qfPWWe0 nZy{c%/'G#""""&>H뢢"O+\.C`9̟?|pC(5B.? PW2g? P!""""*>6o[/6[ߢj+E{`alC^nn ,*WSdNZ~Ej/| @5ʹT?^۟w۶ /UhpTt+ {Tqh.v]ϩ?F9=l-**{?QQU~ABRbawrp>k[M&^mlneghz^|2wX&3/8Ռ31*pqߢ^{aIen.h"Wf`5`""""r&Mҭl0y NqTѠ `Z8qRTGCn|z2շW0㎇첬,"""]Ʋlf[Al)PiDJO5d""""Cղ+j藟痺|i|t]"n5P+H9zȈׯ_<ɓ'_~S]S`%B\f!ؗ:,o.ߏr'~ÄQ݉T1#=_%.ݻwU9T\\?>'{͋ F 7:9wu{s--[^\V+H&2ՕUeXkJJpN{1|[I #شH/VCuShŻn4njw3LqUwMr_|dZw1&<-ֺN it?7Vۏݱt01NWuduI{/ՂTpʴ撖zr״ݤ6gO6 (9uhP,`X>/@αF1,}ƎSر5k&//E#rp?l\wVEvt 36INtl`"(-6w1s*^#OkWcO܆ظg:ӎr c2jXWu(E@=gG֟H=kBU/Qmjx[Yz6w]x<Q|?bq\*@mx6B!)ig'a4Lʴѥs3v|æ\9Ow?YCఙXN=% kG9ͱnZO+4㫯 ¸3i Kmߢfjꪎ[ U'~~ŗٽc)l:/ )߭s8g&]<}K/k&/ln)[?u=o?o>\t0c[dd'Ys7CX{Mu3R;0a 0$& .8/~8ӒNwvC[-- a~<(n_ /3ma>/E܌_~dE665Ok3vkwβ_Vm'G\mՋ?ᗇ ‹;r:/z<Ԕ! C WDDDD)3;6Ӎ^> 5C֛н?cF EěR1DGkpZ0Agqh [!=5?;U uiשWw'i-<<OnӋi!^+]}Ҽa >=g;eSu>8OU.[? *vMY S9n?jakmc Qn޼;K oXvT/""""\a4(ӧfubѭrH]3/,`ʽoF{Ǟց[{FplޛS|aVW7{>wH/;t2e4hPH"gR>gw/_mOeQkSBc~by יO>~4 J efU8:ogm O;t~`Iשex熘S6ߢݞ;]Ց<{P*"""" 5Sd|<. ?}cIqXilV쨞AD5)3lCl9]nm@]nvp'_Q\ś7_/wƫش17"vq(= _:tl(6 7w';ҷXֆ, +8t*_|V3yU2o|_3oGsߙTm.8BaO#6"+:.|e a}=੷_Uvy#w%٬uyjtn]"wtKDDDDD _IώNjka8NK#vmv<Ս暛g|xC_3/ O1~C?`o k52+b!ga9scĠnoX_eh? kuD0Y;YLSP -[aZ-ؐ㊄2m&2½m'3~ ::?.瀻l?elUP~EDDDR}խ."ri \a7j\idR`e~nV+HlQ`zWvV-jL&Oa¯ԴlXmު1b)|}|1uH~ÛMx^ܓ"γ\WDDDDjZ6[-xD6,8υԔl? P5%r ߕ@&X0xlYc2#ߎrq{T7"""" BBT+"~+TFjjJDDDDDD~EDDDDDDXDDDDDDDXDDDDDD7#qxh_K0 LffY rQ<. """""wvN7N`X-ff a,N.7*-xp`7\a&x3z<8N\7EqJ .G~߂_2\~n;. r..|?~EDDDJN=ߎӥ,%x|]r.I/+Wgϫ2;z4mBl\1̘19vuï}.k֒[mUVV>yr0h qϟ^;nyNW~ &M[o#;7?d3[octMT5EWV@^@c:oEM]EDDD.}ү_ pM7kF{.$$Tk9FVyYU\'fa}IMKd\Nn+Wڞ=%?= >s[_NATݻw2].Wӧ}El'Qcy^+?XlY9Ȋy3/W{xmoDxЃB1fۜO5;Ϻn'QM3I+5bOg᧼2%<۞گo}KF"X& 1}[!qbUt}aȍhA 16.""""[Vf͚wދۑ໿F`󖭥kɎ];fΞog5/ Ä!Ne~3}#6oK.-~O{*-eğy]{vs.eBxgٶe'2Nmr<>%c(Zp-?>Mǫϭgd,ZCfN2Xf=2)P mK}8t ^0T`XK-cIWSm$_᷺Bp= ~9s7#ܓ*{od2o\p_LKnuL)ޭ4OFv0k;pl:In1SCl+S'fkQvtbjͫՕqhxc^7b JlȎѣgwz {tpn'16sZ=]/?X:ЮVv&|s,)#Ѯ ΋Bీl.serDfC'yiERߖKRҙ%6z&*>!uϮׂ6|w(Mc/؟E@.*܃obt<.JG-wŰ1fL_JJpCc';VcUTzp[zd.<`?YTKDDD@y1)v;ٙݻM7a6ڭ{$00Z4HHg0fhl޶2<gfɩA*59.ץmA̡O cozeCYϠAd$6/hb2jTJ?f5Cy`0pӏ)c XYYYL'u]AjT~_.˖/66oz]__rsrXjuDfMiܨ!9!!!<,YR-p8M&.G/1~_|!.^>evG4PmF=]G }@ĦW1Ѧ/ddһ熄f>gB5396:D.[X2޷'2f37H9#''?map5L7ӭ[wbcbr/ àQ$%#7/:oC:T XT|<' ǓS7<!!yvAV)74~8ҙvm[W,GMLJi&e޾i&$&U#O˿{f/3#!6!r֜1$3tïyNwۖ7AI]26vT& o l ߂뇏NF[7ظmLqjyN}kMcln"Sr2H/'"""r|>3vInݱyne[ܹϿ2z׫LJy7קO~}o0rp>=ի:j 4[+=_!ǷJ/9ݫ#G8vm[cҔ V^E~7Fpڵm5B1 >sL?Xz7C{7{[ٞH6JZzt/ۓ]my3-ȵcs v# ׎q^Ҫ 9u?OZ]4l_1^qfV]9oqNisNƭf7ӘOvf5rJR1yDFFE=㤤LgZfT<{>=6ncO>>$ IDAT'pw^qMܬz`_‘*HOwΆ"vm}h׶-=0o럘|mNWly7={.n^|ἿK/f֏ m4zj.\lْ-[ҪI]&v:c[F{3 s~wG3Խ2'>;Clpz.z qF3Gc8>i9JޝiR7 ނ$ܘ۝NP!lڐz2m-7m&=F]5'}~2N^vb3 {ڷAD#jc3]CdanDx ޓݬ;5{+oF4lٔ:^tnJ6hD=u)]ӦM9~,1c30zX%%ҤI_ -!9SEۏ0 =RZŸkU^V5{֛y}٣;>>U~O[l9yv;=Gƍqn)MVf&Vpyfxƛ__xz?I<أnɫs_VSS|{eVy-ߟGM&ql۱7tr8=^!ѻuƳy$SJW6E@:U""""kld~+j abUWT""""^6*TW i2eCDDDDJxzam RbUHU\ ma:(˹CS5A!XDDDDm„fdVl d2xy{r9q8]U˕0.هHU20T]j`61 }Vrw ,+ˍrG]EDDDD.a`21L꠫,f20M1DDDDDT"""""","""""",""""""Rs8/3C"""""""W~޾}jEDDDDDDjѭ=Vh]P````````QQQQQQQQQ`````````QQQQQQQQQ`````````QQQQQQQ)+@dyyv6nɮ$%'Ϟ_%xۼu&\ݡ ޶2?`K·_NRVyNgB}zӱ-,8DDDDw:tp`bcvV䊰fYHzFfX1#ѤQ=xb%wFz^v#[DkuEt7n@] Q =#_`# S7=_ =/PDDDDwrOR= /H0/vB?--Uy,èՐ.=>mr?gKl|9ggƜsG2\[ן=v1s<Ŷ1Gfta{Wq˨kho{fX)e͘■vgwVdA`]h<( LXc8]w\sXvۚ'9QѷKt ǔGŬyU' |QYyؕ`xZDDDD~7|۾?Ǒ[e%{bHc邪o8dO$nZ~y6nyΖОpۆ`-ߜo<{n4?~%U/,L6nY- ӋpG[5?)4|;7(؏fVv4 . M^ [̗[^fz4醟4W҃gPDfKtDDDDDXSŷkdUeÜ5)⫗PcMTb'ʘC]1ϑiNÙE4nq1mwzp{סy];6sfXۤN]cI^^䑙 F3y;džl'fP$MM&^Ȇ\utY}cYIH]ì߮mɶex d!ϝ=?}ӯ'b֌zVS(j7ž_S~]k mф8u=7SW 14;jE ׼L7xO8q(_"F:4W  YpF5wFk=6bZ~5*u]-{0c=.-1|*qT4m6/OÕKj6xl o7de.Yd̄,x!9=R-]Ir!MMkq3-C _O$ 7+&$S{鷏F-:][]{mfM."""" W$gN~e[c;LZaHDF4ٗ+eZ9H\qOϏ4iՙ0Y@!\\~#Nfu (8)}*|X{CI~Gj9ZF6\v"d؝=7wI̶P\n-“)в ]Z{Ѵٻ߈C`ٰG,~>M%0!vs3m'E\%E^ݰҗ`FG.eXۓJJ~CsҵvK81.%+>Q/sk`ZXvi!ìkX7 4O$=H=֥ ѣŎ=} %M+o+Q9ڑʡܟygs.|XeAbnV8 }'9XW.^q^H{nlewzĜݠsY`#{U]wr#;D¾g%s H&` u u{ƌɷu e3,{֎NSy6ztH{1d˂Ճۮ78})XJ]73S؜vh|׵=c $N¡;QcHVn[m&͔Gvj|lN~Ϩdl]LʜCpu""""" WE[XnƖxe;K)Wh/=N2NcYL}fZ/Q>EgutK'dյSd] KY}-xJmϯ~ІUm!LyGX:mKImo|o/!#i2_'M.IR2_8hRI;|P1|X>EDDDDJz*;+i9h(7 Ǟu&$ ӹi҃t>+iA-F"ѻs[#OC_)gœxj5rKA`h<(K&Tu;q [AzW˗UsϾ-OzѱU^8 &-9WAJmcALz%Ǝwgc2_Kv|#%P""""|eHg+Kj4.\6p@{{I35i-SGEsk⋕LZUmwO>χ 9y ^T0!ip)!e#sb-2:gm[nжKXݏѕ :cɉb=ЫGJ+IH66nɮ$;^Еf^0ZG7m[Z~wlINLr]gPϿuzӱ8Ɠ́cW^R=OMSex^p0<K/$"YۏLoR)_}#^}1g*9Y\]0-QMaO'!XdK p2;T6zvDϮ.f k!}"^/:+&t.iYJj:{nW7f3gmZuIG|.Z)Y0ݟ ݠl[c;vҏy6:z܄pcip`%ct",CYIA\{K/j}NNl䧘]}h߹ gЪNB60;.LEυid7Z .CCo]-WDDDDD/^V>;|7Rv&w'Z|Na#{Xud~IWankP|9ʮ Še{9߯Ja:Ur|h?8/oe 8>y =k"o g1ep,߶YS͵< /{=ê= ,ZB0poZ Y)R{,|Èhڜ^=cD2NwgNcFXf_4wZ|o0ߊ+{>㙷̣l]5w{O;#UoOd^?3̯ ,8,Cݳ jyDDDDDD~wbYtO0B},~2bjEa`(xlO'~V.ǐZ^cML[ARZJL%dmg?W%cDDDDDDI$9{=вYH)c)DTkZ;^^B©j$q195(M|Tџy)+84=#""""" ?\2K /LٜQb==Y7}Ofo`}9ԅhRܞrOVvѩ/Nr&uNoҝQ>WQg73A0+&2]#"""""5=@uA.-XCzeKyo*dy4^yo ^ͻ8XuG|\g¯ M ǁBg8xV.WѢLԧob̞xf:wXWn Qv-C x@,ӿ?ێd`nu{YwYn&U9γ>eéPk"{[BvdžgjM߉gu[+PEZ-؟9ԣu<9W7*{`MbEn#6+.\C {Kha[1X뮁̍)\z<8O~qۚHc'Η~ /?__8A.qy)!H%[rVtfbb~FZ߸)bmϨܢ3=B`ꙖZG6xAHcϮH^{]pF7&O<>e^S-9Ӣ2e>{V8i=iW|uxœ҅{+dГLiѝYpnP!-e)ytctZSs} w#L}~Y5{ع(I'rr eX>QMӹ_F^یnMfYQr->٤]+ 0{cjNz*w5w$ 'V/at{GDDDDDjcСÁVH"LC`F ."""""""((_,0$.rߓ_""""""r\ίY] f]EwEDDDDDDV ;!-=|]{J HHeb;#`KЫ_]^jh_{ `x}b mﳓ4 ;yis'\ e"巣 >nM9Nuj%?LmU\g7s3d>I.h CBhmlP )ḕr#2:ج+TDDDDD\M3I Ұwǂ1oD-◤M,&%ilrT_hĂ"y8?}>Kr}x{L&lW& =k ?ېC:; fE0u\C>' ]@ u1|o3/ yU>4`]Ne` h>A"|\Cޭ[stu\Y" -_=6F7-h]gx% vyy3, o/rlt%.Vt2 }?#x0ӷ/6 Q7)ŧFrw0ѦN2NUL/| 7~'[LKe;-S"dez/jh. P;U^`+Dz]:EDDDDD*ѥeg&wc6h6N4Sfa/n",&L0ܙdB %`A@EDQT{o Q׆ZVAJQQEZ$!uG kYwǔ)w&g[ң!Yqib:}AC*+]F^3? IDATH~1W*Uͤ(E#d{Bjg8 WCPyM񦏙%#izHI[fI$IR \&g )BJqU!De!J (I*&Eho >lG_[y޼sႀA'էe4 aoNECIɊEHݻfpw~o+[,Z^*(b#bJ$Ia;2q^>7N. )t ywf儊ᣕ1S|=w+gd3:5^K2˦fJqęnfIQ'@~LͣzA1/d|Q)Lq-k2i#|nr5%R'%0=J Rd5@Hٌľ$I$- p>ct> q8|! '$Щk&Ǧ h0w)')`aAGwAk]%9T7N[Ѭ2N[BP==ƹpe:oBZK-B'U#I"I2r+OF[Y% FN)p;&q]L@qǒ$Im'޽{X=k6?Nc.e5>dmTK'.T;G1ߟ#I$If[~ݨa,eA19!IQS$IvT_VGouE8N$ITNիSew։yl#$I$I;4g%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$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$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$I,I$I,I$I,I$I,I$I,I$I*W .w Xknz-`xhH&5E j皧`_R;F$Ir,X׺E]*GF$I Go~9޴IM=;jxt$I$e ;OfMV$I-$X`b;W$I$i+v\|<'W:H֮y9_W{Ø4m>VOD&{ұ v@mr=pMm.͹{995rY0]~<~ayn!ab2ݨ1aYݸ;ԫઞ0>!x`X;8> K|87uNH*O+]$I*c֮]˚5k^VViii$''1fs"fzĩJo+ٺſ~ۇvc4^-J֚K{z$IT]veTR]2iҤ}I&ѵkWWΥ^Zl'ps wC~/*\44SNn\M#Ŝp,V3nv8{*,I%YX!{k[y=ȫՅzUss9kXnCZƏ FBv/UP@qujM$IʬjժgѥKuƧ~J֭kv֍ի駟RZ5x.d´s(o|l.۵ ]0 !R2SۺEM 6*Ҭ{D͂xH_3: ~exĨ]5`͊lV}J$I^&Ү]-GU,\/fL~}vՉ?"]jkFXθkO吭:t6Gc!33oI,shҖX,uR|Χ X7[`ҩYujS+ J$I{#833=z矗?G>~agNJ!7mLkZe@< zѿ<īߖW9޾nKzBctu6\g%I$aj*W^իwj*c*oXEX[̟wAV}j U|?Nỵ%jҥ]7|؆kjdjyΆݵ%I$FȠW^Ջ w m~>(Wkcm[ҶvɌoZh¦]0o{_͏gy 7|qk?~2X?B|t;d;X8Zw$ITիWaÆAFFÆ 3~ىNcP{, ){]0'.y->][xBykݟs_%]Sm\>x5,,7iЀ Z}.jGS*Vڊe, {>t_ [6#eqX=?kD<=%?8L*$IʡJN?sdb!$Tnn\..ݧ62(,Pà H,xb:UʻH/iTEKkξm3b%]{7.Ư[UHKxB2Uy H+]\Vg]Oc%땐L:Mػ^rI$IݻEٳf$I$i׬yү5K$I$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IJ / $ITa{$I$I僻@K$Iʅ>$I$ *n'I$I*; pSTTś$I$i OHFIHH nYgz)((`8/Dfb$II*tj'F72#k<85=\giK$Iʂq\T|׶ȧzH$Rv^?<|q=nC$Iʐi6,bآDkX]w.ӭw.**fbط$ITVa䒠O+[y_9۳$I$au"a_$I$ 2H[^^ĄeqvdUm4OR$IVE`y! ]g"C$Ik ௗ:;$I$O.vlf$I `I$I `I$I `I$I `I$I `*2ٛ`H$IJpD8YckFh! 0?K:ʃu6!O(䐎1v3|E! h2aLڍs$I$xGߋKJQ(.ey!F$7g׏)dr\#7ge?dozܠ8db!@&u+P83汬$O,^=^%w۷r6}C%SuGN Cʸ~rA 8T};V2Kgvc.zz$n}p/هiWfзMI˓/wᏦך0🽨nGaȃdN#'&//rұJp,Z=à)'?iB}5{<־)\N7xsB]wc i$I#/#J!ĒJ~^^D^$ &&D~U!Z\RQ2< àK)p6ݫoZs择g֦eTg2m0[@箤FKY4SܟXi?eyc.y^ҀF1/;?ʽmzWlHCvf3'9! N>)pp ZZAmOWu^ K3la[|>ZM+V6)ǝ_:Cd5oIï֔.w@} 憄A:r8.)/p~q8)3Wؕn}›?QǹBF\~^ *bkpإ|O;.iI$y?) ԫEZVmG}T\qSMQ 葴['TGo|̄x==if z>w|WΨWg>`J$iqO (&\U,ueVұʋpt aK҈E{ '3-d<;}s ) sY\e+r`d^h?:׋@a}9^19%ӱTiۙ։~6Y?2'f출6}W3h+Mx7OI$;lCeP!J*!@gaj*ċa/t pa, x x{eqwf Kkg`.+4g *o8XZj !D s)˞ccs>nZsV䒸h}N X]qeI>ߙ[m `-9 TLHJ7΃Z|?]n 6J/ \KVQ[󐐺a0@淊VrB BX;呂"xXS$I 2b~gg[(VEk#k$k~}--]=ACj39yt40|ĐqTu7sMTJgĻ[+@I$#u1_d冯W0 ⃆rۺ(N{pc'W떸3oC@.=dRSֲ&'H)+)(P,؏ #65#Ϋ hn$}UyxԵ[Ep>b)=|OK*D´ңk,`T$Iy DɚAYE኎!JCq zAVn"KsrW yp[;!Nk1iGRLE+rXZU yfJa! ZWhg${?S_Pꟾ⽛糊hT%ͱ(9m$I6 _Pʀ,V8^2M+EKYG߯hU*l4ʩQ6?pH8MO_wI6e_n|'fO楇ޣYw͔|^epFx@WcWdE0t ӹR=57Ќ`hёKnZ_ϩETm"6@Ax4/PsZ[xAkt}G}ˎ 8^d~ yev]i[fڹ7GS'Rr%jw>t'oq^J_c?bۏqYd@Zh{ _WvM (LXV` vo8o$Iʇ{aQM9c[@$I5O%I$I*V߾MԦso$I%g%I$Iulf$I ?a 'w6n3I$I;3vM !(b²8 P;жZS{H$I$0$I$I*I$I2%I$I2%I$IډllÐ0 $ITݗ}?@!,I$IeS@ XxoGI$I*:I n0 !^+A$Iʺxv?upB$I2.wK$Iʼ $I$\0%I$I$I$I$I$I;@$I!;  `I$I+k~;6%I$m Ð1"??$%%D&MKC,EK$I<}4zs7~wP̟?7^ӧzg%I$m(3v hAN`feaL:1ctf$Dej`I$I48K,S*#3N;b2x6%I$m.(( zud~]LmK$I,,I$I,I$I,I$I,I$IBtlzڋw|`uޏ0aIB`c IDAT ;wu ¹ 8F^x;W$I7_E[My눿xmy\27L2N[r(=қ۪q~ƕ<6 no.$fw!#PYdwSüyDb"se|_$Io?{e8,<׆Tiޖ]+@%)&=el;r ޚ]9 t r>É~{dogk I"jM.zDW ]{?OB*Toʁ]&WM| .Si1>K?,'^={W)Ο>q`mRMv9Ln?uFK)%t w0=6ysp%3.)ʓ`Bj,{}qz_-JeO}2IN'q9 (<&7 p *7.;_r zuT^pC>_/pH6{x Āxbpu~8_+{&o:qB%B4!31E#^<ǸfsD a-o%>kDkeЃ\4hrWv@b#Ch2rː;ƭWfϥ_2,'r5|&'rUgq| ?݇w$IʇX$1o:tlCzo>u:i,AMuְ⮜|F{j[^yj$N~ipysX|g>_㵺JI$ xrx$F7Ф4a|W|5`8!B6VMJ>YҬ3_ݕ@*L1#f2nZΨH BK:Vf8_a: զe1a, ڰt\ O8LCS C0 9t 38CsEڑ /J0`3D^ni =o%!pIj(Z|H$40$҂w]"<7'f|ЎN2<=F!cœЮîT|ikHw\rsWrb#{B=}>h/\yؿӼ;7Bv]c -H{=09W?(R8^ )  &4RH)fGxa/蓠 Fu+Pzej4[qT ! | X2dW.c#9~*7\,?^3s1컥d~71)hG+ћw |H$\i܊u+䃡b:.䢐];,̝kCr7eՒǓ{(bq7*{یD*6ًD*?C0>}w.t:U^οn1bTX ;eisͭ\a4KP=D_)բucB"@p?v;AL2OCR}jD2zt=bW{X1)쩼V{SI ϙx9v{|>z[*F9?xYV#5B,Uc8<0#&/߾߼O-Zg `I$I<0,0Q;6$I$ΠZڹ"ήy}"{T:I$UڹY5$I$X$I$X$INy r$I?d/I$Ieގ~u8HP\TD<U!I$IeH$!@l3o&%OH $I$%AD R\~xADW$ItAI ^c%I$l= U0Ư$I$u%I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$Ivsy9 7]^2<(;6kޝW$I$lUp'ߐv`7xf"B$IRPWm^sE^ d{z:2~ 3ykCburyWqy p\r:Iӡ/J3 |OĹ+YK~\zՑHql%=_UH/{>cV vō7E"@.| 3 j4e璃k_swqĸe czLgya)K.HX!5/j3>sy֐Lqѥ{K$IrYh.>$ϟ[9/ڏa NAo8vտC퓀%xeY'xa>w]/~ⶉt}Y>;$Q/ ; kgȵN_a^3WOqfoxW o?eC9~ xJZOy'ه[rӯ{sxS|YXAGѣsV1ڧؠw荇 <9U$I$WT~/{>Yyngvn +6䘓1|n1ql+*wWL$wVRhЩ-%;'բ+'7IŴaЂ3y'kMF 8e:?OSv$IH(+X\֊^.gq+j(-u[T>1{IE7{ jW޾J$\Ry245PHNq:s@:T(}B/;Vi*6w+¥ʧh=pe^hi/_ULx:V]A:5kie:u$ifsH7Ys$I$xd3k;kZ+c9{^>VUuѾb;o )Wgj@`×rª?9^/t 7] xbM|1Bzf?>/Μ_+yxK$Iᕋdh99[թf!79a<D2u+'vJbx+gW6LGR ?1(rɉE]Ɍ_Vu 2he:{-;^:1w~F?e>Gavk*Ӡav<0jH$I FAC{EF4Woم.0ůYZ5?1,ksn"y|@үycR۴ UY9¼ `1<*&lEcJ&VeyJ,HYr'misxk2GӓdOz/_ @bb@ђ_X]@n=9r f2-ɣ ҏr%Qg.+%>sTΤ#I$I$:K d8 p͗e \~‰u <{<`T܃|?>{/w9NnV2|t .(K1}a>sΙ~'C269~]uy.QQQQQűQ.[lG/PFcAm}ć)j`ǝȡM̚pb]Li`|xމ=׿Э̛uGI1|jԕ ȫh+ym'aPN F.e-lyn7q8,ۙ)R,Kk 9jŷ43#ZRetO2uH0|1^x1vƷ\R]^ͳCwp=<ZT-Yّ'& Y-|vȓqܧ!CFs|zXX;qyT)oQG3ygf olDed3`ɋ?D'!YˎuI* e?7`;g~곝}!D\8E54mڑdf2\ryzL;BMKOGظ8B!-q33ςGer-X7 C.#ɽ_|&C<?USL]ƭZӭ;[5dyץ """""" 8 9<'/{dۇyԶdIߥWw/.6lNJ>)#YF*hNz KhW&ʕ QgɉIDIvj nS)+46 etvBz~|`0sT$n zBk-,߻)/~Ytp016Øo˦[ӨĈwߢl~cql`Gh{e8|u5^ ex>>m[qx$|9D[o0lC+A9ؿPwH 9PV ԪA-|lEs ~+haS'а==W ˅SE}xbwoǸuˏeKBz*g@QxɏY:Bi߱Vt5̛tșfsO>t0܉G- nMMI>ԬGǵ Ƕ4͜D%[3l.mfycLyo@̓&=>״w3}s"ٽpOB0gN.~0όhxMj3S:w͛ j9aO7ĤuiHqgttDDıBܳ}}o^zwa~rkeX¥߲'&Ti؁ARYɫ8sq| G0Ne 7nfJ]K6*kjƍ[D̃_mPKV;}瓹*%9BK`|iyÊwJ4l!5!c>ah=6^ r mǰVɈdm,}bF#hӨ]'Pݧ__LdNjW{"Yß-C~pymCV_u[%~3 ʌq R?}*Svhӥ.v 6; 2xP 9 cy ll aůJ]z{Uݵ މ}Bxu<3~>[/dT3/{1N4O i9/2ku܁Kz~I A2N)OtV RnK=>_Lߢ$Z iNֺ pǿhf,NĽDQ+ f\5 \d>q7qiƵ'wʰu43n[DDD{IN.}s6]Sq<xvp C5r+atʘ ~;/;xuKOr~N'COmvtu %>ufmR=i1<[HNVbtJz@Z|wr-hݩ6%;5'e8IQ .JnUB/eGHM)l &Vרz~)B*C\.gbux̌/bO`rHi'IV d!`8x%>u&uF+ 0l&br4.W4!BY?z ӵ@&^RuőNfy2^Eu][\DDX*i" F oLwN  nK5iC ʇiә5@%E*[?OphE0hvDXm\Lk؋^lz^jGwdiOub%arùFoa\+ףm8\øoXڸu_ۏ#ɍ2ځ0\Z>Ia9Js `$>^^@NSK %9RO`VR޺@?U4]Gu՗j&+Ō9nw;td'b9[3+<,NPhJSΠ:E@r&o&%C[3!Gxg;<W9Bzfr3OfW&OLދ֥ϸTФ?G2JPhA5hۤ,;wlť[iTϋxskg`@6xs|/º8g:ɪf \aPB9{rXjϾşx&WS@6(?.K֭,4:U:؍8N'+;ޘ?5|"\oyʠaݨ.|;o!vlw`  6.)alf.KӃR2XuɔZ{^q\*ulVH ww/79iEDDD- """"""r;"pyV߭:?zEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDnب'eEDDDDDի)kCȭHCEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDnsV@ֲ{.V-_A\l<*-ËAwM6UADnBvlWDD¯-$77:};(_Y*>Q\W3,M+01 ̹biZv !fv>~s6D&iPaW{/M d{b9x,SV?d?s[`]:}au|M"0vx^jsM͸"yr/w-F/㿚oAIJ Y.OK5NW0_ߣX[#Y<ķ?WF4iL:`}&0룹׀3yqoF'y%>^hdY|#SnܜADDDIIq|~nMSDDUo㿞obx^ ׿.x)U.! c2/iOta?>՛2G]fOx;^{窣! 3 T\OǓT`O'uB,ܐ_6LdbaXqf9⥙h-3b2V~J{0wF‰9 o:OAwl:8!o/K dNZ0_DDDDDn-ȫDܕt0c8dZ5[oj#t((ש N5wtL$6#ЪOpXgbʓm*xD(T7Sie/%T]Xʷɏ?bڈW?c_FF`/1 >:\8@B I Yz֘(NPoӜ=Tu5ȉ&͑NJp eWnJ7dDUb뫓~`Q39³xe&5*usu8K;:MnS>q 3QNU1""""r˱!2@bٺQV'+Vguip<E5:Y<5-EW(T}TT2Fp'pyq6wew+rsd~)l]K%cls0r|Y^-1w&|g-ݟ i۫1nhح%U,e֎%s⣅ȯ֥Lj6OJ@P`iXh+I ^oէ~l'#De9F~tժע|YGSmh_jXϼxP~vHcőaGŰ ' 6BC_ѡ\?ʐqLߑD`䧰gGe(ׁ86I!o;0[3湁\&(]Fce|s 2M;W`gQ)dÙzsdAqSyubq,BŪevHv_v#K~,R aXqq:pjmV눚՗ݹ;jaS 6:|7֭,4:c7|8N'+;jK\{{^> $<?rR(JG0\p}KsKf^3R8&*SZek霳F˾khӵ͟>.κ/xjx{Ҩ^ۑ 2+޾lNxFً.QVS_◙B݃MPn6X2 -}hЬ'uf֏7D[JиqEȏf*' 84 ù=F$ŷ$~ Lͼ0mfRh+I-!0^c읜hSMk@tXl|!ˎÎ WP5ݫNqif+:WNz"Ӆtؓ[ .;@aqDGd\:uf&rk;> >Kjƣ3ƞSLڜLr+RÏN(ELfۿbڱEì|wCR3c;/<:3aJ%Ju W~l2ܲ"ELǴ0 L6 C="X<v{3;Nj4 HR;GVݚlFM$]TtaRؼ3_Eá-trކ_ǧbr6-HWAsS\Kg\{d#_L_~5[[5iS[5B &OBH<ɾ9]Ch^O#vi(~ޕD+g0*ҽ{MYf9^J&cNw8MB\Æ+Lt]B.ՆYɜsZ873o D%B <¡kV Qg ;3>5O¯f,R\nO{GV}–͘^'l5zMsO$EzM Lh#4<7r8u3FqeoQ :b 1N=ٙz4|-$o.ǠN4'm?yE M-AK4|zh%= .Ɇr>׹+f})8["j׬}?b,7YorwɚMt!/ݨX*Tek0{tВÞ`t طI؃  i 7NpǰN>Eo;KAi{G :>0C %JSŷiv +Ӵ?i ٔ6ڇuƓ0ɉM 0ɭӕy{eBb 6j5̑=qY`@`$I&?싵 `VKwҾV_ZtdEmir`z1~ IDAT~%7WdO  if49|,Q;Bd?g'c8bn,R N{N꾵jb hDpx4&Ppd-NI{ev2}t gg!Li& ,`òorM}8ś$Z|ݲ=#eDQ$^`;vl͖t^a{ԭQ2qDv8R9~6Vۈnq+S?Ҏqa l;'ջxʾCg'~9Mz j5,|?o@p7 !iӮF9ȏd{nC&tBb lJCiM'kO d9 Z)FUUevsM'AA~%rR%+w5Z;K&>b1=2&$syM<)KZןQLi]h͡H0-?ɉYxv:Ȍ!*EEs*^H"TR6rں^M9p3H:䐒iDFMDDDDn' ""H6H䏧T `+:RDDDDn&]ZDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEyxz"""<`B` ""sQ)z"\DEf-3g KExxxƤ瞥Y*MbU Dn-M6IӦ*I="""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" V@b a "","7*y?CEDDE߂VF|#>;T||=u4EDDn:XQPPc_h_ဳьX5/@5EXסv1& oHRa*HjOl}Oa9wKgS-iII_V0fPd*\\PN'uJ "7ѥcn/:6EDDDXD]YDǧ(('aѱ)""" """"""" "rc_йl7Lw|Ā=}߲fwWӷcmCY9$Ilf%L mn ȼ~\%6פJX,ܯkDDDDDXDc.ߐA^eɡyQ6#u^SDYum( &{?Ƥiyblz[pq.]_ʅ󼱓ۣH1 7c&FBClFүّjKFMI2?}Gzi#Gs-?w?cRu'Yoہj91wQbMJWãxYy"|qR88u(+zּx-L˜|r6M$ԦǨ 0X>v&26ľVmʨc.!xyF f6_~̻_'256ہZE-϶p Tݎ!c߂KO<;=֗bNw!Y?=хjv,22xڷkw7AAT^]`|fδu<ռ$~BVW̳?~^l`矟#yE0[xazbalIu}`qt̊9L !w3q\WGks$rҫ&VBza5u'/M|ˣ\AQҧw/ f5p)g?lӍJwb;3>J:M\T*NrT-E%?q|s~l$㛗"ixO?dh@Lzn!{&p<=~F;Ѽd>g} 듴k֬=g>>{vZJDD6`QCGP-S~n^֨Q_*ۂ:Փrcf*X=Jbi]3NuǟB53q/ 0Rq*Ijmxvk܂y:!ZЬBVZnܖ.umwL.ykT-Zypg'Y8 ؆\r!N'hK G U+>y|j4]ZؔZ,[w3&ILnfkʜy"4qF>}1q#ehc޽<#ddd0j(͛ǤIٳ'= %"","E/qdɧmtl/{]vPu) ~ʖ^;Ǚ!+xs8F]yٞTlͧ= -;RHDDD֭,4:c7|8N'+;jK4q:ddda+r>p]}{^t{Q^g1&8o}\?rN܆V""";+[j[.H~*+jl/e """"Rhermg4Ы """"RX6l֌%b:F5<Ӿ!"""RXDDDDDDECѱ)""" "ע+J9ZDAb "","וaEL^ F0"7&8?"""򏧋`",..̬9g~ֈ4d3kއEQ~-l6=Cp8r|dBSX/@ϐnl6, QٯC+]m6}JзF/Tn4U$xꊧ7>%p4 ZDDDXD'IOomyn`_}>293e1[(WXH RJ:mwgsӯziX_1ĬjCks;NHW)&)J)TQH*J)v[ۿK@Go~g~ Ӑ;69uo%zC*5eivE9pWνS#iӦ,_>G<%?+p{=|O3nMܿk+32zr'ny t3%g~|4O*?P.$/6WI^]Mf -'&;ʘfefMTl_-ѷ/}dy7fH1ٹKR6;f*Cξ-7wlu7Ӿw_pMF%R}S>ۡ朚a3}gKdǿB-=5Єt{l}ln5)ϟ2-ˎh 3rMmژÎN7ŝ˔ߕO/V.qjtz6~0堻mFοg]9֜Q]HyyΔԟ$/dAY=fk: $?_jy/'Iu'Yl(L=&IrHIccҀ;2,=t>4ܑŻ_ ._H';1g/*\ִ'G!ڟ͗u͙ڥ"[+˻~4kZWs^م+&o&ozkUj*GClT% :ÙqA}{ zϴdSߩMO͌glۘ<,9-}!:} ?>Ob $:5zO_o!oIE\]7QuSa Ξcݜ%{&MSܖ^=$+ɒBK-|rEmPjP,r 7u}{FnY_lmwuهocQW劊?dlѲp4\ ϝvRļ,)$Ȁ57 [HV=dƍ+4u?)6gWmسMyt4;ےl'޹o[>c62+ߚjk˟mYm rw٘If槍Iu=gϊBRkyaϺͨwGZ.{ՏrLZ6-۽H3>TjFp}7Oɲ)E1i\*moIvyw`2wll!m6}Y*B|}9^~nej/Ǥ6m3ɪgqME'8+ʿwӎw'og.ʠg։sԓS?]!uۥ?鸬/Um12~ќ*~eqA-;8K6M'ʹc:>WuϜ5Զ'\OS~ mez6U31u~̈cvN̤~f/n)gNwL8;o VcܹB}+IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/sub-applications/image02.png000066400000000000000000001501661461403617600254340ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwxTUI#!!@J(Ҥ#  PZvײvubYu(+"U)ҫNH# L <ywW3nc?'~B.(y=5dOiO-[W,dXDDDf:eN\<-~%Hq%PnzK)A=?0-o7:~=]F+ ";v$/בǟcZ +|![@vRFF{gOY`?Mk{k"k3y>:v;Udm>k7!o3Y ~+:76Q7= 9blNh~ؕ 3R޿m!=6ǓU*n}7˼MN?X1}>3d<+|iKdδ>})ѿ E}?}eo+XlO!c] HH cW:jI?G2lt]߰% /Pgx`d$ ^Oב LxfO?% a~9.N aܑoQO^uUg `mj>{~?b{ၱEDDDDb<̫-!u6sgoCdH=Yؼ 0u{w|a-s旭GR6X=y#c<0[w)tg>~}]&n< /^̤aO2-L'|2˿ua 2'?şp8q:yw|/Wd-U=G{?Ҝ~m]uټ|ٳf')qYɊhM ~ʒG ٺ:r&/Ԗ! C WDDDD)#N&ꭜOw5#כs cG [R1D@[~8!笽ix++r𙐞M$Od!lqdg?AiD/"<Ooʳy^;ݽӲe>#\k9μuqV>@U|g>S<2ȣ,aq*\>(n >s֭ CϹNegZ~{ zJ;ќzk㤛G|nMʺy|n!S_nE&#{__7['Jx064* Fou^vPCeM7zѸq} 1z;nrDr-3!`]Oٿ1~# >doG k5vCw#!kJf_!=ݴߞIku0$צQ w mmٴh=G6fnJgU1*u|/ɇ?q^D#d䁽p/eG錇xt񦂩NDLO+9*//C'{r5#{Y=>ֿ?Q/ X"""""1|pPL׫W-eAi*\^uڷ胇x|qBꗞR| z)\.5m\-W. %#Id֧ۘ-'ʵ\yp5KFZvuM=èWO{I71/U8SY˖QUWDDDD.Wݚ-"V@+YƘʕM&՚H-VkL+¯\AʕhfjL+5\!XWDDDDjSX̪1{ n_m0NS/$nO_Skϳp*+K n<+ """"ro<\.SUSy@>=ssyG.IUאkϭcrDFF<fY nrn ,) 5kwjm =ď?eܹ'ŗiNϞ=N\׏2vlO>%biڌ7X%bUz>8uz7#[{ѹi)`wx"UλC-N[S="OjF]I-7o|Fɺ(϶>s݈ӭiu"%f~B|^~溄 BV!9߽ūc8ʮ/ heMdkLi#55ߌRB\n*Ҫe+ТE 8PU-U45RXh([m/u]0v]cu4k&Ϭsj_\Kp"d3&l6-_^"SOTYp]ٷ_xp >,b<u@FEQbڑm`9D{_ܘ LJ?LPf&mg793;Xsy[DDDۏ#Gc`p}+JZbU=zzo $r 5{] Ƭ٥{5bD՞T9n?E?/72e2Jgy:t?yc^x\LY\M^~[N}wimu D8Q}Wy#0A9-u`L+o.8FTv2f]gc]m/vHnc7W$2ѲESN B:{Oo(m{tƱ^|?c%9|r7 ͈l[2<vO 1rپ|>ЬGnkaĻ [9صz>k2ؼd5Ru""""RV~<ԯ_ rv228p[nl2ѽGzꍿ?V h&%'Vme1e m"z0΄hIQnхnw-w_ z61qy)` cӈ?w:[<ѧNϠ]=%8~*K^n>OT4>=~qvj;3 L!#GȠ82 ɤ)_1iW]V%bʋniϵ&';kVhޢ9͚6aϾ}600{e˖hɒr~Ʉ3jvu|_|).ᄒ͜ na<ۖ/?{{b ns(:F^OѐvMIztmlLC;'͛ws,Q}[36)8bЫSl18b>5áS=G]-wN@0uL,V'{CA 7}map5Lzmѓ( 5"Va4mڄDrrOEH>|JGJ*N$D Q/0yC~z -5ݺҡ}ʽ 4(#"OF]?gϾ̸sf`Uv/^wƺ RQ} o[H !elV_3yC:d`gix֞9ovܕ^ҊViD/&g"۾eќ Ř UP^wG jؓj~V6Ng>萜 IDAT)VZPT<>3vM=ynaG޽Ͽ*z4lGϨ#x7Я_[o2j>}B6: 2[<_!˻Z/ܹۧFl?ֻ^杷擏?!b_E4mO qq,XDVn#m> egn&q1@'}ѿ(:Ze+wO^Tڞi yipG['""""a#44P/l2ӿ? . {͕.xXj5}\ɓi,]Ç1`yyrtYWMe >p9S0ƫMgNG$o~}aV{-חnj&22p9]ص7|Jpp){\Cу{~~^'nA>}I;uw}2ewORδ}y~/rT֭#4m\Ar-DFO>&ztٿ2N_tqO:|~EvN^|h5kƪY|yWuNrY93z4"i٪Y8u*26p=wiϷLR|9[DDD:ٓ,vQ:ÆʼOE#T6fYVSN1TyPNP Zqp-"""rZ||LI᷊ r+ 0"*`d2a"DDDDDnoU&Ula+R.""""Wr0[z!،扩^Zp,""""W`ōqm„fdVj d2xxzt:w8+a\d`/jl2c,v ,+Ӆtƍ[]EDDDD.a`21L꠫,f20M1DDDDDT"""""","""""",""""""R{87#]"""""""W~޹sjEDDDDDDjVm=Vh]P````````QQQQQQQQQ`````````QQQQQQQQQ`````````QQQQQQQ)+@dv6o͞Nkϫx< mOO[kw-[N$!3\gۈtnt;6""""c >p9s訽">̹HKϨؑChvm\͜=oUsaTWhp$""""rEk٦fM \w5~34}&1]4~ iY|E\7\6]a\~I;:/iy>qF.g^7B݀`7![oF E;_\ rڙ9wQ뜾a e6%/is]lwm̡m3?mǘ8gU>Zd]ŴٻI,X3.,;ݑΜ=oYbr#!ܻ.&{4 3.N;s=k,m_ٚҿ+t)SKYkN 2S˞' =opZDDDD~7|ݹ_|'_|Ť_SmGcﲍ%o! p~"[3wyևRdEm޾-A0,gw;FizoKnrxßC{n96}u?gyRmQzA,$}nָW*ZX 0:4(08DFd-/JzEv Z i2$4lr7C(KMfWyc>NUס.A|2jc)?ɯ3~HsOTyҷ/A8f㞽>Ohc-#ui{J݅˳>-Hڵ;=JBtY#3-!0{6wMIټN(LA M9ęl)3Oٿ][;Ve+ɾUk.2C"W)7Cq'郷I݁Av.wY<򣑧dkhՄDzM.pL[ps76S% ;s!-^Mkq%OV>hEt{϶-! 7G^aکꏌ DZq-%bԩO grw2oK՞#dݼgCަ5ɿV¯[&᥮kҲ5ypkqK^?If܈:M{)p搒6` YʾosfN36 nAVVRrLiH+2/fO~+6sYS_.ehK"5;aOhDSZ]Yp=f 2χFD¯sc~%߰S)a -^>>+Xsٍ=t$"3/ ~{zWkx;79xAԎCPܰA0/Idhݎnm= m^=GImalZļc7>AA:@FDZ`$Ӿ "ܰAp}r8=#'HUsCSIN^m EJ^5W#p(,pX1 &Raj2 LҀ.&Ǐ+kC߆+K[>~Q t9S8+#6ŸGFݩ=|G|5xm҉J'>j/79XWl/Yqn`GnjcW7z܌3ݠsXp39]T_wr#;g&TݿmdDHYpݘ>8bw0sQlm˾w{>0'!n̻ٶp5F N\΂y,Ki"p SbnnwaС'Xp(>wgJ/1$GwS)0咕 Qp8;S?0d}#pS+F62/,/S7cKV,+*ǻ[)3#^{v /]|m^|j;֟.Vh͐1|^4Zn-yw5/S;RB2c,/zmL~c6~7~+ex>h9puvh"~)LOR{r ]R2~_AWQo٢rxd㇍пn6I%ߐ>46n9Ig^#Y,j%+ߨvfק(_Xbҍz^b ^bFl`MXk"U>œuŎVf|v;9OGs 5?E7!~5p9;I)ܔN~HTa=\؏թH{oInۖo!@%ؼ)b*9^D0?.*%:Chv\˄.d׋W6oF M'(_1Gّf#HN[8c4)% gƬÅ NQZt2E`M[904  /E=$ofntnEF.ںm+ ڶqK0ʻAݗLwFƏ>WQ"ԃwynDxѡAN[Z~lATJ3㋌]3[hې}hZ~EDDDDrHP|bԫTe3_O2yzO%8އ viOOww.f{G}"^//+&v-iYǚa΃<ʝmjVd9sѿl75ɌQZgdO]QXϧϾɷL[`' ;M/KǷsuk{Y`5w8/>X]88h=#FUɨn`BO9-= ]"""""C_a(m4fًum=ǣoM[{e/ijui}-r!\׿Ew<xXNZ#EDDDDDkN;nêZw dGmf^T\'yzﻬ]Tv~.ď~sy%W‹P%GkCHO)# La5sWw2?sXu|\/ hJ ~}ٜR<^=<$f!L<u/eڑGXH0{"ϯ&:<6ۢl$rkm&P!pD><ôZty$_Lؑd:{ixٛmҨy ^g6=uGbG0mN}'9Wf8OkDaɼ#M ("GqdԽ|Jz8̰루qjk2LfG*0E{rr L[Dݕ RX 7;+0G)MImnG_ԛ]?˚~ZsBr:iץFJf e[3pgՂ# w}}[4&/47*D-Lmv;G RI`V:lrU?_ʪ̺" Er䘤Çmzwf˳9`2n73+ò&8i[22,V'Y_3X˭%6'b$WUM֕qMq{O^q^ =v[Hߟ˗%> U qyK@ 4qJc.4N1%;Csy6\>O pe Gh(cgYt;U,J6d\*=ZյҠz Cl?\۸ `t VKυb# ;`e:=&H߫c>/Bر)6 V#.)HaZ!3 g `A .+yHQi%DYM͞'j!!gc̽;%In\vLAɟ[8-O?tT$֦0:G_˺y~nxuBI?'gPi#gN00Y?eL2q:'yT. r(G:]Dˇ)ʸ$:,X lܱ,'3_R]ff<`jӸa 7or&MMfd2u'xCD}FDDDDDSMuQRN/nӒ3B=_UO;ݞŒ dMJ;#?M;79c4KR],=bЪHaf0I=N Ue3#Y5pҾ4ސu4{7?m7ҭ}u3砗ePGvX1'}ì'4-N%|5*{c}&eeN%W],=li MGx]a` tҷm$1XQϝAVb*pe_'I݉ܶMƍmJP 9C@MVDtV.Lplvg)lqA\;Lg y,9rAd/7q7{9y}4q@\yᰳ;ĠVȭAL0^@I4:C.c:CGcUdVvVͨ9<\5v_ļi#AlpV&ǻ d\O*u]gz&v`ME`sa"垐^OZs։A&<ς{P Vs"tG)T^u .@y.?ɜf[""""""Epa+2DzCDDDDD":ZDDDDDD ;M"IXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDY06,mQ3?^_0|"H%kQ } ퟳ@[""""""E0&Й೓CJj&EדihDDDDDDNG7S^91wMLDDDDD . pgNfEl؟FJju}&cvk7PZ0JզE[}W'-m"WMQ^[pp>5;O]y(qJlqOON3}:dLBbxެ'e3-,V`i qM:EDDDD \2339 & %VaӨA7b:w'1OcnV6tpo՞4~ywPo.ɻ3o,)"""""CR^=6lݰau7(R}viu0dvG JWgy֞;};챴|e&MϗCe/Sf;;Fr+iz#Fp]w· Zr~" ?񽯦+'2hA#^q|\|#_b`m]-""""RՋpڶmڵkzkҶm[bbbٳgK(ubvCދÏ?IJ?˗|.ja58'xuxan0F'/dO(_"5Ks$S .Vڽ)~֯ @^6*_Vd ~{(UkѺ Ly6gߖg_./hK$[ѹr]}#]<4/N «6!v!zI@H8(뮻Mv-+""""""rɫRz+*"""""""FXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDe y HмY/tHѠ)""""""R$\ iZDDDDDD.}a"]4O'""""""#B Z6Mχ=`,""""""f=fjbٰZ |AJvga?#[Ha-J@n8VI!c!MNjml%"""""RP~WEŋb)zSUvP;ܠKMGH!R6Bx /ٹ^zAʭǦ@{>%U)Qpߧ /X<;ѴgBl\'(yHpt&n|~R<YGZ0CDDDDD~/\O6{{HR⁹|٫EW&5:(,R1````KIѡ uyS""""",EY'ҫCnd뿾nl""""" 6>znaVؗG&%"4P;K=7O3r=>>~=%WّG/?ou u:vȗ3\ۉ _sUiK9z;UYu0i fue2b)Ď1NdZ;qⷄ,<74կF}{y&vrvmI}b_Z#*u{j_.o9{_MDDDD/x ]¬ksbOn1+/O|& cZX,\[l V/eBqI~l&[~K’ŵc'0y{U&w<H/NMr\Wu+f=̨-\7 f5OZ`n:\k469gˁD6GS^z&.?Z>aK$VW^+l!Jtn<`K⎞H/O}|OȤtr2`!Vj0-'|Gӗ))@h򔹶ob\NWJ?fd=kq sHT/_ e͞oɫ9`RnՒؿ1#^g+_ozTIx{<=~\2j0F g\m[̩ܕÞ~`4||m +|M}kUDDDDbuE'&k0ÙP7?DʼnvRh5mAXC|BX> #8/?X q_~d$<庘ߚ0lyޠԺRi CwFW8994k4O;KoÚ:`. N:0W\P]V(H:Y+vMQ*a0tu..;=JD.5)Sf4?b"p׿ l[\{3l46M2 oұGSu3{m)ǭW*hr[{!&>y ѓh1Mϟ=);q]SjIU|5-,nQ3 (a=z´6>wº>eC%=FfQȘbegnpAȭWMŃ  K8>bb,Ìּ>nXUd{ÎI3YvO mMFdžU?d`KZ9o1YޣCz> 3e0*뷦Q>vx.IKnͰUlLO&ݰ77=9 \ -av$9T<//>+kOj?ה%3/8U02wW7Qp~xY<oHo3$ޙf}?mOO% \Q= *f&\"4]*%E*bN[Cc%鋗kԗ!ꝴl"yς{b/Qja|1o~4kH ߸X(_$ |G6pX,UGGZiQxhIL8!xf {R>]xƏqiDHe跴)͛ԣfZT=mMn >p[8f|aEjY8eH!+ۃם@`dj 8iBn7RΡ}TKr}' TVl#Ƿy,4iԊ+q}w574᪮WQrTSs;r3bGUъ-7Au2m_?e-}u턚`Ez&8z+{(whI杶~gexMfǹ2Q͍׭gq)}Z\zT4zwBfY9&s`\e5`/ T#wnKǖ"TDDDD~Y&R)܄0i!=>W`}tk=`9n_v+|ᴹ)sMG>t3w$mt-^ib  /'7`Y)^Sz`!v; =ZLEeL^@^QzJ2#=#i"_P nV/"9?˞?v pڇgi]MJ`L"ǽi.N"m dkBR\SMvcf';ШC4 C򯋙4f J IDATzbwtxxipvrO$ép]wy&o^47x8NOwqyNLj(L,ܟǽQ\VJ4) )J8?.wkESM49e+gΏҮR$ŀM{u_˒0Hǯswxy{/ko|5cUZ}OƵ?MFaEZ0@td? pp v& XΟrUϹ\T )5d%:3;=ή/G0@sW*A`OXɌ% 9 T"K O;ɴw ۫ ߘ4{;ŪTFoM=@1FyZ]Y_;I4&ӭj ?1lmćY),K!;B?M&]~32.ػnc͋Ǜ_kձR^웷n#¿SV9C4sCpCl&ؒ1թ d`s'yOě:~ WDYK>i .]r1Ae}WUh~#1{}._ %Nnsƾ0=lS1]zpxv|ssE: ӷ{~4V;ۗ4 nkԜ^ueI},cGνa-Eغ h ߇ XXŰ8-ٳw7GeZ\TrbXGคç3ɛ2?Bc8 sLI #t}NZ=vf~5qطk %<02ތ?#˓8-W'=$5= GlĪw2aV6q>,%h,k)xpJ;S{ikO~g0D;F56/q| ThDDDDDbv^ܣ eubaKEDDDDDo sDDDDDDߡ9"""""","""""",""""""r ٚ&ij$DDDDDD .4(Nad"U}M:DDDDDD VsNʂ4Mt$v~`ׁ """""Rș~n%"""""R] OA"AXDDDDDDEDDDDDDEDDDDDD.!6uLa? F=6N-+yiu-]Bbb".Ksq:DGGsU͉/…)`9!x˖|d߯{r\߿I_~- e^`9otRUNV]d`7mb鲥Wj-TU`UEDDDD伆`Oґ#lJ"MHMN*vQ\ĎOnnn,"""""=MXDDDDDDDXDDDDDDDXDDDDDDDXDDDDD|.Kv:gu%P>ؚ3d F4ԃ:פ%/ wު:bEDDDDws?>9;{ûPO[6o4winj](y2NOk?ad}\T&T[(7+vxKls\`\:REDDDDo@7~0$_\VluJ7 O s7$}b)}PCC|&jtڟ@׸mJ]Ξ];_WkwHq 5gw3>r7獚,g,.tb1\HO6-a{3r_ތ &숟fwCX5t\z ykKԮ5SystH%Y͠QfpڼL~Fs[2lR/Zd;pvylDզ=~~ [؝kR,<5;K.""""rFF4Mz i6(ߣ?ZMv ]Lu1tC>`l'?M~i0ufrӋsЬ71@'n`4bh\>{?a[kh*gkF9wk\ʓiC<0>^<2>ەM{sP-KP,+ 3Cݕ(!CE  Ahb͸k9ߙ;R/o ^'qje҄yZ8*J1rv.bЄ_OW}{LL wX;0T1sX;lف՝dj'dsmƽ vouOQ.Mӧ@DDDD'ArZiH5suzrյv7JҾ[͐jtф&hýsoK6ΘGǐ7]QT,@DLq%O5,M 6w6.ٛ?!ium:?a}&) xÂo5u^=DHתC]ZЧ@DDDDJuhj7j\wU4c&-/cפDVT1=ٚk].Yʬl׀(;DPqvB.u `5׆К<<.ZOg?aر1#8@瑱|y9eac){~H4ĕ p-X# m_>,߄f,cіl\> +17!ȿs/o55̜oY`kSfΖvYN(hM/?Up{ q-Z'e)K^&qV55Obs?90,z7i9aԺ_wtR`5ؒ R+Ȃ~=bDj&{~yftX)wʪɽ ,H՜ʩ|LR۹O?eT 0~8R{XsQ8L؛Hndۮ, & #2 7XX27^nDS:s6#ā%Y[nGkִ1îŌv/ G җ~кKm:]łkyq5 ׯ槌xw(Gf#f:? ț{s7Ѷ_6 ++""""EiS8>|˰QU?D Q/Bhjp#,ڦ flaܠ1ЦOgAIhdLUs y+4: vbȦI21 77RTwW#OuE9?_=S+ ߿Y;ksw6 ⷏>f)|.oxrX1n<#'RD#Fkr0a11^jWMdV֤xۭKt؇5yu軌^Al^>""""REiA-?qtiuG(&A/2&HXw>a tG#UlO-u3gNt. pPˍ u'>]KCvN뮻Mv-F~? ,3D+""""Rؘinzuacv4|ٯ('_~Op`ojJߴnb9*U|]B9tl)aZFt /`)ʹ.I^yzDXDDDDDտoܧ(",QQ9;OMKXDDDDDo0 H,ORb:"ȂW}tMDDDDDql޴͛6S.r 5*X`9bPR%n&ʔ)T\N'eʔobJX,BU~Mjp8\*ꠋbb`;X-qT9 lZ0M418[ aWXDDDDD{2M ]y)V9@u,˥/Y)QMԊԙ:QKR((\B.k߼¡WM]/"""""R] V X؟)D, V bwÊf4h#0 , X|E7qð`W)!0̓` е"""""";_P.P)7A"AXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDD2=|yW5I?+D}( 7؎=+:IG(l#ҵQJ=s&C)lyתuIs[pw{,ܖ ޵<Z".N z^'%Ց>;QI9 K7Q&QA=ZM܉|Vnjq&š=id8B)פ =tu2k&{ufTp`j1JsEyyyR?Kv0^W4;å[HԀ[{*Ö3/NGjclv Έ,vLzݞ|61I/"""""B\2*ȣW;4fʳŵO_ͼwILEnNޜCi, h6{敏7;=^\c6#޾O68C~!w%&&k.ɨ)0\ ~6SV]8&i5'cF3cox,.|S#]wQԉI $!{/JnAT 4+v{ן{A,ػ"B RG,ݩv;wfgURpH:,zv\ߜOĸ7{cL+, L/8<~d<(8_ǻ/ȊKщlu$I$޳JHg{AOvd>ͮӻQ+!]6{ ß_fPNhCy\cR_$G^ʳ^ɱ=Ͷ3+1ElHЦ(KrړyTJm8yعvITmӈ2@T6ԉvIhS=-`&ۏ9c"8S2eҟGy\ڜtm H9ET=nUI-$;;$I  a\e^qt(}I$I +X\ ҆S>^ǀ]YO `GUCYQJHU+ٲ@4=<.^öB($8.?8|ʔٹB6*c^-a6?wIl2;_IXbbrccKp#K6S4rcNKX=7y YǔLhIT t֏nSm@xؑj]m$I$xϮd9]++$v@ ԻGXvOnf$;n?oM!xg]ɠL c3A %jA.'kO.m;;ÊӘ՗u<{UY`I$IyŷT␑h>i4yy|*Tۖ]vwI_EZT%;l msοg 51ovcb(Y%E/>YҚ1%kwTQhV-\۷^goo.IBM\˥lޜQC^\v;S./ _|$I$/a\Է?9? 7y/zU\+~޶W^MGW]T*>|q k f7E ҐdUbՌl o}{brٔ1\+z;/=ńqo_*ЮO[*Oz'fo ɞ&www  (X˦r˴_J,yyglnO=*{<<.zu. Jc} UL_G$I ࿒5O=eޱ7pe1\8h0ǜw>|.kຳ{Lk<;6)e>g >yǝ9ΠWrVxz-,ɲ'0 |ywLL_:.|FT;/ᄣOfCSvW, Dhһ+ͦ00&]5 3xy}RB.I\kκn0X IDATM&˅#~A%_1/$I$I}A߾}âJOh?NKJJ(**";;_Fؽb?CGs$I߬'-bbbc4MO3$I,I$I/8]nKy;,I$I{8,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%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$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `I$I `I$I `I$Ib#C0tKH$IҾ/}1{vKv$I}U5~?o\&g$I$0PR3A$Iu%{|=aIOI$IDž%%w+I$IBy$I$I~$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I]̾RY_$Dfxа[_$I }CHM6Rl@PPK;{\Is7 pI$I2xU0WϹV%xg`6Ij߇ˮHdM}?.3f$QUWμ,E{D2{MQSR6DU$upnܒ la 3X w9ub'=H&?R&rY$QoEܽci3~6Őؠ5ǜy.v ?$I$/'+}mWDrmFu@Iq |>'{>מցYrucX85^% Szfۿ X-\,Hjg^NkP8 泱 _?~-lwtk( j6IـK磷dbcӶo-^͆z3y/-([O_$I$b t^޽q"x /WCWS5Jy}8';3^?fs!ӚULZMabZT 4{oMf@ }{%phfaP:L|w!Oúaso8 Syl AH$ѼN2%:H$I<ͧq/t9g~%?>(R͑,:D.pb+3GRaG>|2yťdF/x^x#ƿ:H$IҾ.۷oXT|r-iII deeq W^Ws܍3,&I$IqD$!*ꏟk4u׫S$I,I$I/8.1I$I 8,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$I$I$I$I$I$I$I^AV$I}_bA@Ś(.*g$I$C!"hbc)! C$I (*("Ư$I$n-_`x,$I$!g*/0Ư$I$A$I$ `I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$$I$nu=ӊ I$ҟc>anM?}*?zSO{}y岿{1/~d憔Pz1hT{2s紫dݎoL$&mu iUOy A8Nr?Ǽ݊mFf ݠ$Y&sݐԉ_\C9.zsdmL ui[/kW0 \6g7O5޶x^ĪĚhs0.:e($çɬ-KC8_o-S{,dea [o lPgSM8LK:Ap _zޘʢT|<_ҏd~1{G%צЧ1ei/r}z>afqZU"8,kļ羧P{v'z'M]e!~vU>=r^\B[$޾ gF]{3|2o ۂ$<#〄`>P^|bHs>o[$ҟ^AʈsdeV7k= 6.l_g>/fyuSv.mlܓ<η,ݘKqBEu>sFNjj}qfNa֐ dxz!h{myy;AƧCvm/n>-܊|OY[.sQRp-6`r+w%a\Bǹߓ2XjN."z}f5$1QB$}3↑WF=λ9!al0m's\m̤Y (.iaۏq rC=pO]ԛ$07n,7p9);."[Xn͈_ueb7$I؀< 5~31[GWriӲDO}[|Β=8 ZOpœ3j'gs27@N͚4 *P1nG(mgs{ 0)v{LgD̤oX@\i`Kl8.}:&k}vnoӶ| ^E}OJDra9d5epR1/wJk xgԥö'3,!)]˽TWaX @* y p~tEҚ <ldݣK6z֤Zd풥X]fcUkU!J1oŏꋫեNL@Lna6Irb}QfǼ8=v^4sS8>4$V=ZR`/aE|pϭW?*.G$b.4.b?_o>{>go|<Ey>f*OڶMKl$ v7LZ]nSи')C8y,MY< ;́XE^ʁ jjDyOE0{M4˵w=g|L굇3%q>U^o5EX.aBt!ɏOd@/};8q6 'vq@VǸ47O6E!Q%ᨮz{ ඕ K} JB/[^z?>PKJ(**";;_F?f4gwjZ2 *T}2/8p|^zBk63ѳ w?-Ee4A=w; Ҫ9s֪07>-MIb&sݐg,js{9+v; ҿ qǢ\U|7?=wBw MH LyI5[ H]9uitOvhKbb111DE;$7iٷXҟnM- `I$u8 I$I8eq$I $I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$-bŕZx[V$IM72P$I@K$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I~.!.|5o6ի֐H([6ujq ӱS'DC"S|]b…Ư$I{-\]bꔯ$IĮx\ˋ%|FivWbfO i]ÕSxdZITkׇsFHy#3%-4:4 d|K7ٚG\VI>cG] H%hܝݞ랾"n1:o9G-^sjJaX##apJ>/'g ~\S&W=:@LW Z6ݱ;4A ֋c5>c$IW]Us@>Wإ3IiZ2}qo}ٽ!0ykӠviH/[C~zaͲ ,gM1UzU,!XVLͦ_7=q#~r9)<¸7^aSw<>=d677sȐèyK> v.@lB 9[V2sCv[DJB%9[v$IwY`-עZ6 o}V W2?=ID'1zr/>^U~8틗1yyO-UYi ^OȪ5zƥ=kPVa![1577@XyH6KzW.}in;0ލ()Wι%V$Ify&"48;}2KٔƪjEwәԊ#y0BŸ.5fVDUi(d8j7F3?=V]ZtYqz +OΨ6\{4\~c%=soL_v7 o˄iT6;ގK#TH$;gn/r*P$d~͙9D%TI$eJgy[+z=9Vo%YT)Qd,$f}j+ײ2Hj͟ÖkY[ֲmjĬ\΢⊴m/[˦ij[P筅y?7h{} 仮f2Mq͘tl_ijI¹,yp!g ~sRAj2,p,W2kvj3F$I{M+YkVc5M/_ÚI !&9bs,ؚk%Vcj5ZR:R(^JKgԮ_z|l|&]z#2q?j-8̫xNDKd<o<6o_6ہn}3YX@FI/rԕdn`c߆=*H<ԠV*$aI7u0> sMuйBFz?_}"亱pdDzmڍԥEu9;+~a݋bq9F,LT4Hc˛73~$NO x[. ܤi?ׯWgߜqG"&q7ȣ$Wݰ'Ӛ/7ixY ##T҇AAb@vnЙMrmZ_%Y@r %?Ƴ8/$$J,"gZ_YzQ٦=z\ORS(ܖʏoVSԡ9GӾvSI( *C|Gヤj.mi_ 6RGYI4Sf6plZmv8GDHαiՎ䛅y涠U+˿KVJ%./=:n?FaurWse !doN,iڀ{rECiP~.҈Ě?Lћlӕ']SI===>aP7ݧt"y2 Ҽc+*vH$OQAih.|gL~o}QС`ڜ\@j(?EE![: R4μҋB*'yK1)rŅGhDnA&gP)OH9's(v抗.O$ ջ9qY 12oD47o1-esQ H鱺q%+9GdO\tkӖ [GZC Ә0kHDhպqasgoMjw'HƅI>:Wp 28oCԪLM/gTSjf߮KwXfugMf|\6zmԄe^s9%:m@^ۡ,|˴AqHN_& HY`IpXڇOKOM`IA1QbѱaYXo5mBc ;}.D޷ |w|Tɖl"PȂq/29tw­d쨞4{_Ƅ.O$x67CR Ny~V}njl!f+x=ZJVPjN Q>|5fڇ** YJdž0. q@z+昪Q֎q@vbhѡ!q t!90%s]Cӣxk_#6dJ3Ҿ⎏P[HTA:s|1:s[\׬t4o,҂tiIPA`$6qnunהIYsyXU@[Σ0f2U|kˡYlN՚o;hza*o/]NvӖxgARLvڰ#wɆ]4?>h[slW5mAήKj(X17:sm rY}&Az~۪--#yVQl RO<9̝]%!`7߱4!g5LPLQұX\Lc΂A%uTA0!SV21X'XV *obv #TU [Y~ E?V թG,3:U$R`+fsH_`H$ʟOv$I$Z$IdK$IdK$IdK$IdK$IdKeeI|?dK5k:$~.}  H$Xuڅ+&MRl"I^l4mʕ]K]iqKNة!I$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I@ڻa HA8$ p$$I?(~yc; @JM2~ ::0 `I,%7-{ZXBX3߼Mqqc"I^`/] lڑ{{\NJM O6wB.w>_4=FF}(UK ())2ƯԔ{z\V )))q`$I2%n\\ EEH{`AAkS$~~S$$I$Ҿ&צ$I2%I$I2%ߎ=n=Δ ԧo(-op<$Z6?x$Igx`Im9n@hX%a"<7<"cR1V*/~D-󻮃$I `IbWoǐ3n˚>|à:=<.^AY֪LQz:H$'ؾh<&ȶ5>wNfKS>3S!H!TygUܻ]ڙ/ 4ƹWM*?=ԧ929u x~->_v>KGQl@ndcOyW9k:Wg}2rFfx-;de14>Ѓ?w.]ÀSyט0/%~K{&5M"ymĕ< ɪ_Ӵlbtܫ\ ֲ=He~a_ߙ⍹'Èh[: WxI|.9FOŋYf r^?Ϩ]7v$Iڏx /ᱛUeh}\ѥ<> GvH>WᢋCLs{f@T_^Jo㥮 ̜sE[.i{(-J-Ev,nyʹLTr \ IͅEe8Zh(x>̙|9kNY32ClCGka#?k]A߿ŞfȞ}Weo'de7z[X&{ TMcyjU9LUܛVv>Ym<<,?uԏȑ#3c3lذlذa95@& 0lV7ϧOkwJ]V?]Y9-T%YnM ة)-U _>),l _;n?xf+˩0(?>G [3(RNHʮ*aC+|^չufET|3*,;$Ii<7' {1srNq}X[rLy|L+Odk+Cl/xuntv8Ե2ʋ[BsNIyߴ)暧˧wY- mYSyYyi$W\>; ``cQ߬ez"\lUꒊjYjueI4_vmҬ<)3BjkfIruM:Haf}僶`UfΚrJU:3(7YF1YY]Ҵj*̚G~!<'>ϟ;Ϊ-)rD 7ܐsI/7pCŢMa#6k.$'{m1K2o=k y1 ߩ;ckY]HiCuAEc̼Z}jҭz J玭SH]fe?87~6+= udmQ3SVA=Lj̽\S[_Ҟ{+p4CQ]^|0W?Zj{N5iߤSrӈh}mITM)d^&|mL>{!g;J32b̬nMN>j$K>S_hZ~iθ}vvm9fm92[ 3[ů/Ͱ+19qsxUWU`X 0lj9>6m<_LZ|\Ǵx=Oˍ7>eAgܞM-\h}:57yIZx`.8O~mX9sK̵7 +ҥISSxgcyr}_[TgŸ[3lxvmQxg NN3ab۽rʀ%uuuYtY~IF\7\../N$Yg?e;{߻EsV9&-ZT*PY{/OfMS*)suulhwx_~9,-$-Z61 @ˊIJQ0 3 [k`n9P,\zmلƤ#3`_& aQpN2{VGP(425m$9yS lMɷf50VJ5) NJb1UUUiҤYhJA>Jb15JXLfMůnL. rbs?ɐ.l!:/~4]Y(kBn}WFv[>vI+n'sKr.._u}xsToߙI{/`<3W ?-gvFlSLϩ7Gf^Ϛ{_&t="|-+S,$b)҇Mi :ݫV_ 3cV|7O.8/SLR,RTQH*J)nlK@Gͼ2g.tn鱶!+_}iyṬ#f-'JuyqrT?_q,Z(Sߜ7eԗ_Wf nK^'gCo˙ OH]uE&ַy}.m I!) \rsElM)]Vef{/3|VISLQ2<$~m*,#yB|9]LrysԕB~دNR=4thY*ʽrKӻjnF18ߟ;3Y:G }>5.VKsr{c*O==z9-+î͵Zn {hHeՖfg̶[qEfM)MWf.e{iyZn9mIuv٬Cv^*ټapG'dQuEެo$gYaםa-;gܖ9_d@Z} R~E9]3nАlSͳ΁쓅$UBIDATu2UݱIS]SrAsmy㍊dVxϳ۲9bċI甦xaH:=4}x̺ΛxM.kw 噹gj!yjm4酤ҫQW;IkrϤ r[ƩX1#o3ɑSe)Wdbjᔼ|tS k8Uo^o }$J r둃2n9?ٗ9埤|tCe~VY̠tx⮬O0ʼu-Ega~|ilf[jt eϜ:✶<;t_؆#̉'ޞՅwM/~>#7S.On2}ߵn1QZ}r &%Dȸ/Kk7N.wkP7}/?rYC*ʏ_^}_^?^>6}<(ht4rX& ;< nN~}ytx( q6iIBkk,;5xɌy]=Yٵ_v؏lݮ?x8:8yL($ͺN9+^VKkkO$~j~]8# I]ǃs͙ؒ ֮aQ&ϘopόIi'>nܨE]gW[On璻?ga֮Nj&IM-'I뜼xS׎k\zkf^/>t-Kf乥+<>BH9>TsAz_3wJfRϚ݌>8<6(-s͏>;$k2{n3stXqynw79:??|aؑT.ӱ)T&ٮ;7`6Y8,z+ܧG<45{A7 /O9(5OUs]e Itܽwj>:k_͕ݟΠ;.ϡ|zz]1:[o-l\&}sf٩T s^ϥ_4~H>{>Gзor]}9JdIJSWWKGdU~YsVw=Y{/OfMS*RQܣvNw.l l4j_ɺ] @ 0`` @ W MĆn@3l6X  too`#toNnR.ٯ]2~X=F}m[NTܠAgbh*3:3WgKuyv~9ۯNXܠ3 R)ks\̃`cнior~uZ7HT;\,SUUuu9㚔$Y?^n?Z,R*o.mA)H\^#߆Aw`ޤ_q0xU0` @  0` @  0` @@ 0` @ @ 0`  @ 0`` @ 0`0` @ 00` @  0` @@ 0` @ @ 0`  @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0` @ @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0` @ @ 0`  @ 0`` @ 0 @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0` @ @ 0`  @ 0`` @ 00` @  0` @?uuu) y'ɊˍR`3zΨ)$I=*ϟhѩiq=ZH͛Q`͛%Y;C9h3f])(b*IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/websockets/000077500000000000000000000000001461403617600223655ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/websockets/image01.png000066400000000000000000000415151461403617600243240ustar00rootroot00000000000000PNG  IHDR&sBIT|dtEXtSoftwareShutterc IDATxwtTṲBI CBRiAAXuTT,+JQl UX %}H9s`޻&g~sϢ, f@Ioƒޒ|dw:-B0KLL=%Iv]K,HRҾ=)22Bvh6MXTL$ү_?PݧSNRCpr8ReVl6kގbbXr8V\t)EFFp5uHQpH%zϝ;]vfs+?qB'+ן:}syEW{߭q+4mN%y.[h-8`UXHיݹsTbb:%S9BqΝ%BC~gOu޽SӖt-^ lD5vj3|pg0}lܓ2蝩oPwjuщtbYwڵ؎j5 y⩧5uB`[E5rPOaAexQgOjʏg )mwVdܘ 2VvB6fYe*]X۹pdTTBpw o ߖkS: 0D>'({a:tD/Z4WϞV~]* (I8'UA#kdsZxM1goa"Irk1R};^,?[+whMfU PpZd[n-s׽svqٵW-Z6ܫgO5iH֮s'8?oҠ6lYmUJRXg119,IJ<vCSB٥o鹅$IqP~^DjҸQƴ&iӦy钢 ]@~f)8+<~tZ$IPUAs4k{޾GfzNK1iSΜС{W´ƍ"iӦӮ=y{~ߟݻv]~`,6W:~ѨRc\t‚\Tvɝo2Ƌ2 ?\?,>7 )HhTF5yk.cل$y~ʬw߮ɥ{~7m,Iݡozi-? kf-{hTz{Wlsz r=y~5)\e9kw|IRbw)\5]o~v{nҸ>`B)׳8_-zO~ҭGu%ҶUoθCCQ-2,ޫɮjoRǒ-6={o1[)K' Z.\]\AFG;gT+@ @ 7#:p8ddd #ךbEYmV٬6YmOQ v%'H^ndHq(E)"Wl6Y,*HI˞"ź1rX$p 2\ jSdOv& q~_]I~S(~pcȢkՏ!eOs"{]IW7r wb'1%%'qpop0OQ)Ne47?pM]۶rsuV+!1l[UXXjT&ݷO{ tyIaCɧ2%%$s5!w7wI-(7w"oѭ.\Ukbu˖)E?H.L Rkv..ҭmZ_|-MSOyzӦiSMyMի[W ,t;練맰0ժUKo>ٻG.Xs (MoEY@;Ҟb+6!*Sbcb$I~~:sUÇ հC559źb5F'] nuJŶ?LRi__͛c8x+y֤z{&mf9s=DZ]лhYjѢ"о}{uСPHNN)Ǜ֪YSeʖw_UzۻWoXZ˗+ޘ~y|Ϝf\\|V^6[kK?^λE柎grJjٲeln9ڵ&j-zu!sVCcҤVX=rx}HM1m{>qwRee;}T[gUUXQ-zc&^U=:V_Y^&B',9"?e/ UQ ;-U䣋>QKRkl~ ڇtJNX*}m_hP+W^TfM߿`+2]H!ڴyK*W ;Z-{ :T ~_۲tݤ8L Be:3 +_YyyzMVT|\\I'2=z4cfRRRj?_?}>g:G{a_f^ǐjRe,ۢHj68X,٣n Kіk׭ڵ+ʹT( FOK"Μ=ٳgx]6\|zRn: s?z O޲Zz<5c[f]Uv8=OMڮ^OqUJJN$%uN[LU&U*ZIQڳ5*/hRÚs߼lWJi1ӑY/?KS{zژb TJǐ;'=T'MC{#%Emz^e=:ZIϴbYImJzIcUܺO27ubw)xJ@ׯs?bA񶎊t?^.^["{ VJ/[.2"\fQTR8=JR`Pb9tpݮm[湼Zj˗+vm8p`?9KϜU'a>UVm6G8H7ݩSھcZjoT7Ij Wnï$%WkN=c᥸kpѭּI |buGxƶWnګӽjAy6L)P+q͖~^YUfUyܣybP:c˅{3;s./ V+]'/:oi_=4a/ uy߿_mK6U[PV+WԖH޻)y{{kտo?{at[4;K]+`iNJJ2v"_C c^+;Q^rH6nܐczn]%i۷aﳱSGr?f=1\f .hƬO4c']eD'yv^rx{68Yȶ5kZ*ڹ{e|ZW~VE|acSظMl]SB?'/?yKl^JSpyLId Qʾ:7F{Qc*/"#ZVu@hR{3>*P#baY,UZE"4SAu"ur XETG(i[oL@usAfE=֪a;_л-Mՠ~|SQzר^]‹G^9\ h]ciйxp>Z1R-i91 .)^a|k/ʭO5s}۷S-EuZ~^id =ק$}8ڱcZh)wnnjѢvء7(zUioOU=Cv:k'Gzд*BRg|:vZ쭿EUW-Q j{ճ%կ[WݺtVBBfp(5kVA #0H 7КEBQU5p<4jZ#Oߢm}հ^qmP=_". A*3wRiO}:Orq oǷQ#뭷K{\w!CKoQ#pXnVBp㏊3J٘My Iң?#UٴJy{R5fsɯlL~ACMp_,8AC +nK=:oY<4`@_UVM\e~U89P?SR@]tiWaa*Iڷwݣo,йsXZl.j۶oРJukN7WW\\\0(Tɍ͕Jn@n|/*DZrs(1rsuBl##\ݮ'J@=esqtC֫pj-,hVY.[FdZ&=E)bX,P,\/\]]ddM||v,rqqvv ];bjjF]0 jjJ0%G{R+?o۶Zxau@ @ 0`0` @ 0 0` @OVo/Y,Wt5oz(E:$O5嬧v&j{c[ _kuAh飪jq}S}ꛭՋhՌpNjVeXjҺzqo `Z[[7}a yut[*(_TY՚R5W4mޏZq >;~S+woiO9ϼcƍuɘufm>sj(X^緙%j᭚?%#Y:Hus%˾/iӒ$Z-ԼCKz()oܤ kvhӚߥokyax4WQ0˪Z};3_Ԍ_v;j:TJ[dMPѝھfV>$uXzPں-ruu9M SajZ_p3%WV۾v2R-\#}C@ Th#W-o$+oՠ>hQEɿn }7A ߼_KȊ[ĜYz.1sbњ6%lˏ,gYo$]H7K1P='of_zUz۝_w鲫R`sMR:>b;^%JxYϵ3F\ IDATv Ez5I\p;CY:]~%) LO׏/!?Is}W֙?X.>Q4pu:*;O^_n"gSc/ykR=4:Ӛ37{$ye3\d9G̹@ᏺ̧xB=,W\ܧj%$T<9q,C]wP콨~{5GGKCϮ|.eiWUe=T*8Rb3eGvx&?񠞨Ӧ2j3^ԢS'FtSY߼x\>KLg(aXRA]5R{~k&,[}9yZۜ]:wkr\6}oWZ&*6hvGMC֯ Yٞe_ ץWV bN$ҎJq) _~ޮ+I?ӣ/JUV7y>&1&BV9w\d"׌4k3VR&?JzKWge'ЌGgF;Mi~ْ<6|s0Xk¨#٫t~0tG*_>A5UΖ;&ǯ cF_ڨU*' k[C^N(A>{^ܪnYoR^M?''k޽ܵZ m'ެHr~\VnC7,'ig^>T:rrW/QtF6A._ô4 mQ=sZ!;-~dC_SU{ӡC+Ӡ|£9wE9/~yaޯfYGު.n7aqGA*rIf5ٔȵMavϲ5̭}{5VLVnY˔lcwZs҉fЦzjr>&zyyTiadnQ&sM޿<{fTR; >3Q߾LR!x8a /|ףʹY_ڙIα 1cF=+O;OX(<ě=ldn )\.>|>|%p)9VhmӹsgSlY9$W/ՇyYHfX#&Us[+{rlHg5zgw6qfpffQ۹LEh1f˦{!(- 7yol?d᠙qdk;?XW!AY2L}Ylxô-iT|w1_tfЖrKƙ5;}_x_g]3pKr:di YffV9؟s cN7wx_s`1fj`2w& 9 օzoTKNIi;u\Hߧw=l.5˝QO]կ]3Mաf- tu{E=C5譧չT#O9/i}|gݚck5SSt֕zl=,H/J;yփ-=Vo~$˽'їl&|aYjj@&??/iMtS.Oz#kȆiZwTsg3}[ҹŖ T^=>@ZUXkj~]ȻH >wa)(6zG}iIǵũ} yK#azlݿHsg|TFV~.5H(49_f+崖o9cFdJJ<WZ3gnokLNӬȟ~ֆYF.FY\=T}ܲzqɉQs?ғYuvW{]:ޥ CU67A5N_%TY_iNН.jgT3;`/\Eˌ]ļl3xX΁,tKLP8K5;O\>W3#ҪH)USTwnAMbl԰|GeξuG{f0(ґ|JS)[Z?7XYyF>_3~QlЋ]RإRL<)9_W{fps J<gc{(qXЈZ Ϯ kh>c52-2B*d{zr]sJGz˙%#{3 X3F*:ؘFfۯs%FQ6&i݊:\_OzH=VYn"=0*-@Tlzfko ֢~TJUT-~f?:棽(CbTĶ6|옄ήOܕY1Gt:9v,zY GWFAgjr)Xj7k†S-Xiz*YW:jlߺu٤/}404]KvO]u}/O/^*I.a)[0L|CyU<>UKOu}NԩHJ뮻<SbbZbbrv).p_G~Of )ҫO^쿑$*!!U/wթR 5V/d7v'v\__R'ϨpzL^W}ӄ4e) %*K*ww_R-S 7jfg_Esن{Zj쬏է(CKb_Koi۠񹢇L3ͽ/UO-v&d_l$y=罟&JȞB<H?\?{ջVQRZ'KZ%Eq%l-,Q/3e_Iu~`Z}*2}TF,K./~^Z,YW9MζXE'"X ]rCeM1-#]yU7:YGZ+W=ssNݤ҂Syխ-|GF|`Ϻjm5[=^'辕ٺ[u}\KywjWk~٧O'wXdB9P%Pj@;kJ{:F5̽ar:koD$disNE弿v[䔥+5L'Ce4+:VQN$h8-@ql]҂>jT N߱uOm?@ZGK4v^m V*}2磈潪zM9ݑG\Lbv϶+ϟ8 %Z7VKܓvp <ӝRW]*di}٥_`*'#kʁ*#Я^xίsGoR*(19kh۹GYwk;gоwwR|Fp SBn86g9]r_ꇒl~)`+~@'=qO./vO.OG9zg1$`l~G^\Xe:jd, 4#^m4vTPЫeZGXwۋ%kѿi[x>ZEjiSi-.\"=v&=׮KRJc^֓UYuf}Զ ia}y#4ff^6e%(f{d*=y,]S"מӔͣzi@,uS 1mԙ'=kr]BZѷi- :ϐE?Զl^ַ+hk݋-jQ&>c̺0:{ YʫnhV4uKUT{snVhmS+)F*r1:m^Ys)G +,c֍ה,ow 1V$e,~d.MX.Afe20o|s[)xTkhc>ofƄ_r=fV_Բ5LAehȇfSnu7w3U|ݜKʨYSi1Ƙ̼7;jlx=2+MGi޿^r6_S|:i؝Cg?_׼]39Ҽwg $zj0] 4Ç7#57t3gYQڸ<ռi<;~7/43CSԺ׵iPXͱ,{{sY,= m:wl,ݻw7)CIUDQ?*wbˀf:4g]KFz/pV; F˖U5UY'>X;Fܬ͛7k-tt;QQ:#W~ }?-+vQ;h'_U1EEY .5OS1VNzbkd+NfRs)zzWsi;-?@#}MZ?ګ}QcR@լYOM{}P#0Z${m8*Pd_~'/ӂ?Gux"bcW^K\U\Y լ] hJtڵ4:SꝚK5]셜e\ʫc:r]ƗZs"T&$DVaQuD)˻҃Z59F/C}vOPJ^n%X, und)))2Ɣ@$`` !Q"_t hx =sŗezwd4 yZ>?//tSSYtŲ.` p\HVOk}T]ג 4pԻ˓jntd,q8._` ;_.Ls\[{#xӫjC:35O킑*>x:vFkcU=&WѝS?гJɪ'r)[QSydt"ChR/_:=7i!E^NU{#3K5wLXBk>E7sN?zQ>\4қSPz]cWјknLh ev8|j| fӈg5}i9\^Up8TVM'UCFzR={j "u՛t坺}Eep+ 4KR4rS#bW؈'L GX$:HrQ[vnds.^#v S FoQŴbJc݋a]#(z} jmUVAI,A;#c.;8c)s ]lWj[_==V]r8d~n-2:kOSqD=Ñ:p1Y֛:AC֗\#Rd:4K5F+A 0˵&Vis:eFL\-í*6lӟ0o)Y?^e*fCR 9aIn׵h8G+}m Z0PJAӳ~_M&\&<7GSܓcCU55K7u$C?_Kօv`N8@pINL@dI ` Vkm2;P/pj֬,Y"^of8y@QARk5mTM6" }&` @ 0 0` @ @ 0`  @ 0`0` @ 0 0` @ @ 0`  @ 0`0` @ 0 0` @0` @ @ 0`  @ 0`0` @ 0 0`;n0Qt h4'‰%K Xn8Փ 0`0` @ 00` @  0` @  0` @@ 0`  @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0` wIDAT@ @ 0`  @ 0`` @ 00` @  0` @  0` @@ 0` @ @ 0`  @ 0`` @ 0`0` @ 00` @ 60` @  0`oOӔy6pTm$kyV:MO~Xv4$nڔYwi|/?} j ðtUU$YIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/websockets/image02.png000066400000000000000000000436261461403617600243320ustar00rootroot00000000000000PNG  IHDR&sBIT|dtEXtSoftwareShutterc IDATxwtUgvI$@ЛP) R+XO좨 EP!RDA{Z }w~n ~?쁝C :LLLE]bb{#|e:w.>>^l6-[p$ooEE]G.FM4*J$}5tijnQ6]v{Rbqj)1 ÒYdUby93j[ݞATl7::Z{R9yN|sr/ЬYdI7/5rG=)-.]X/Ќ3ju:NrqqMN|$|cJ%)!>^$*n7~%_>1cf>U3fT~}t~%iƌ:[s|`ww{pÚъkd (zN8w+ ; d˟-Ѧ#Gߌ^5r͘13ǭD Q@z0ZnHfIfͺ#%Y3fL{QjS8,^Ȱ⎇L hp[V샬)#@Kx =1u ސun۹2헥N=gj^!~QUUlWW-hȇN)lY)S@יYttʔ)S۹Qs$u%wY -z={ݚ,kP@[k\SW.㞒iݷ;Bf8:uD;]hp<3z v2j2~۾B-.9қ?]>&V]/LTejӁ "ِi5" -#ΞWNaoO#be _UQWu-s"ё#ǴhbzTJRI@Q  } 1^#*Gk 5iٴ9k~O v$ɥMa3{fVMP;֚EMwS0}g$[rZ: '>*Bٷg5o*Ii!WϞjؠ6HE)gwOpn$eeY?Eo:wͲ;7kt6C!}GU5x$)]4eU}@t$ń Be2ai6-[ ~tI ;tDRMZf$~M?{Lmjͽk<}275=Ltᔎ=a6hP_-[MU:3{Xmo tr~NHrO4n`kyEr"W&K/43ϭ0\<#tU*S{t9ƥ"L{3U|l}0u%S_ԃ\#Rݲe$u^tZ,R[~=* sVtV{hdzOTsrUs>ysi]X$gM=<0`ӳW n:ߌݞ6P ,Fg|՟]K|qEZ]ͭΌ?T9 7^:t%:!%%k1m=~I1ۥI ߣ*B %?FH o]kې{twDo/9s\lW2_Oroxb'G)'-}_+:n@nl߬A 5즎>|~ei :z6J> |7 EQ B2P3 \h@Q V5a t&(`''+5pjO6 (j0FEK^>ÆlfX(*M+Eo#o BmƗ1 Nrqۀs?u@Q nH1ooSW d1 NNZrquՙێŐ[19(1!^6Mv[LIINT @ P0Ϳ@vv2e laȐ!"*I04M6%&&I^nʔ=ɮ$%I!g'V'AII6dPcd'np*SS2od5M%&&ɖhUV'ZAv 6 =&Q dGi] %8`\-ɦW 9 J 4JHL^߆d3OA)N5wQ)ٶM8;5kwC}($$DU*W8}ktI4l}>|_S q\-URrn^$&յztWhͺu2 C-7/3a7 ֭Zސܸq#=Suި7jݻͷQ55h|`ݖ{~Էo_Zjh}aEGG (7iZnm_HLLY7V(|SUfZ?}zJ^Bi.U{{rZ}q:Mbbcf:j٢P[<=>E;?w}6S˕S d6-Wm۶3anߦMGU&kZjU.Ys tJtB+qm_}\Cۓ%쵏!դA-[MneԨÝrj>_OqʵmkKUmSS_|@Q0r!C.^3.I..Tj.D?Jl ~o n٢e/ f;ԈYoDwb74Ի]5{vC4}Nzc\0/S⼚j̝%ul%}k闾=h^mN2TzǐvP?n࢓?zVytҹչ_hվꇒp*}yfo[a*YL^Uvm}՗ wvPdT.]Ku%]r9gݛ ^W.]ϖdXԴY35oR>>>rvNnɍԏ>TdTd~S~}5Kӝ?yJLLݍ@pBBBnJ<rl7MiMYgZ8>}>FI5ydIOv"Cހ?u)/xyE.Gg iV_7<}Zs,iʍܽ ёyT?߫8Ii@LtFeb{>7Z""{hCcU\9s/IjKzK:vб')&2?`]|Y3f}>. XE*?7 ի[M[bcbn~XXTJ+h޽,ﯧǏʕhoݐILLUX,%MW!G#2uAN?[3mXN_{tKFlNYK;>LwPB9_|T}bbbє5jбyzoN E3@͚5}ٌyjD/0Tb Wl\9L}wr 5iHuj E=*+|ʕu&l*?MoyI{QOf)sſ6pҮɣCg4%স_\EsHQց:rVoߢ ?̍Q*ۮY 9_e#6=݌WT5%$$ih׮]j֬\]һ8Yڵk>IoA^ ,]ZSWz[O۶M׾m[5ԫgMy].}C9_C箅[V~%i6[WϞW-WfMuYqqq9{N~Q?֭UuxF@Ԯu >b=t[i+)=^,|uuůk{A<7esQGb2MSJSyٟ0$ɦ5Х:uI:m=7pruqUٲeUlYْ|rY-VkVV''v*>!>޷?VF?רMVx1R+V$+)!Aw_XyCFeIvSG$/ؔlK4桇oضM8;zSQHHT$ͮ;whӦJ,s5$zf5kJ+]6[o 6 ȥkҁ_=KDɒ }xÒ]ߝکu:r~bboOpP}TR%zV | R*U,_ϖ\joooG!!,I:ߧ,Ptt4 Auر=uԕGbڸa},KV`ECA*=88S mŕ|HE.|0ۅirqva$gp;'Лy7WWY0ruuZC)B0n+SMڶEb%4 Y,\\d%)1Vh\q(ɐ!F5 9;;j0MF.>;,.&.SL.wv0dXeXdA|X-X-cd7g#@ @ёKQ ;vVE^pH t+` @ 0 0` @ @ 0`wSCa8jҏ3m_1e|C.z#'!WUpZOm_jwcg _ km^hch8g7~}eWjj[sǴfzwG5VA~2 C~ -Ac4Z~ LKK}k򶾠/^nԸvoX秀ԨڅА'_Ӕy?i +hZpqu;[C߿l<8xMM 1>mzZjU<2o5Qў5˚'Rj5J Tut^r}|^$I՚i qSBIܼEҖuH?,ʆC%hl!^Eu{w}gǿu86j TeJ{DڹnV$ _~X+8,ᦒ5eI76BЮ"WUDL҆ Z=ڹZ IDAT)_HS[>Md~%?DOO/vpü+ŸzRr{uXtߠ"gۣآӮzWj=4ԚegB_v);4A#qn*3Q#;wx@|HOViS颴I|Gh+}JsIZW'ge S];givlE,K0PwU4Ծ__YAopH?!k]×$%( 5~@'5VZ~.2TN }-?*kj]JgXGdkMu5߫oLk= `NOSRBq?I$yGU+R5 {uh65M#p71@fFum7+7ж =f<6X=W/Oݭoꥌ&s;4mнzjc2\ ^9CҕVZ'}>ؖ}صs5apMBÝ|XU!Ґk9ӑ/[ޝ:Mݯdosfjj܉57hhJr|ż܆ZN2U$~y<&a#[&/Wl5p9Yunfxa#:n 2hgo¬Sq_MYwUY7Ȭ9}u38ZmYANӬ>jng[G 7zf*f>C1;,CaÆy|goRfbl8=*9NUܾ,kJo V}g_3ړݩ'd8<ĚLy6l:caaÆCoyp59Zpusf>i'%s^ r~9)* +f 78Y%ilXg1myf5 33}˔q iW&^ه0\SG+d M#Xc:KuM%S;^vy=)m)nbgsKYw~cux40nK)lq HB2^-1ݢ/x 4Whfy;s]޿W_ i5 %͏<=Wi6)Xل^ 87B2u!=^\KhٙP`ٱZZ[CtXOϻkӻ3wUM_#^vBg5Ӻ/㽢3\,̜5zFsYJȓ:-H:>iu>8[fG㨯zT%:SˋtL)'[} 51$]FlK V;ӐԤz񮖟J3Ht/K]We>xEfR箿mx_-]!&EH?~#W\\na+^eQ:&Wj`Og]xoq7ո%>\qN_gSZ]2qSMI֛W(RXR{+˵J;/Ij;LuT݇͜8=?E-نkkԻ CK|MLmi٤ϞROҳM=7UUSҏ/*R1`L|E*;V _HoQ`#@4x5o@lI27BȺ7L_ñ|I/Zw2!c۬2Z}$ALfY8h %@AL]>jX-\c'rj]5Sqwd3PX+?">5qFKnns=pUq"K;@m3n^W'ӥ0 8t t.3>Fo.صFȢyJj?dkWDd[;O8@~z5~5GvXlb|J3ÏAfGv4lQI-UF0 =: h#VQ^-:ϷOoeEIW-_mCTlA;r*_M_Jiyu*%ȦN-֣mj/;k;\ ~9~h4=U!C2H!XGn+&v\Nt)כ-JzZ[1,{\ ]ӓ"7^Лzrjn~_c~ܬ qOxL[=Fm{fr)-qː%sjS"/_TC֪هcZ;i0%yrBhX͊g'[ .(]cRx<-媋tojvͬ\ݬ\̷oGdJ2}ʟev.\Hsa: DwHFcz2J&w 2ۯJH[j㈆J!-w hjR<}oYƯ>7߼ǥz4`3|p@_fszL5:gY%_戻O-Չ=0Y񸤴z%ysM4Cyp,mĚ{_푾_?n9i^I̩je-g1K*^e{S"m|}L_]39ff{9l0s>fhudVkݼ|ii ۜ>/|i,e&?v݄MxZ}r-}43}}},ʝ {GfY75Qjέ\ܹiIvSG$߷':wWκѫuүҨ_tez&w7Zn<˦J(2Uf1l/{nݪmi:qฎ=o)zjc5U+ORWuatr UkX{4eJ:ERN/P/V> R:-uh=TǔK/?m3⫟j:q2NIJrڪyƏzJ˫0`P%0 0` @ @ 0`` @ 0`SnrҦͧMjFe 5R8k}eiUp:Gz)C>|6nK6bQfMUreN*PxiS 9UN:7OEX, T dfo` Wb@r~Er܅I;-&67ي(:ӌ(-YY Cԩtew>i$m#Kf\YV R<zz9UXKNp->4r>BVwQ:UnC}sr˰5Ru - 0(О~վu^Z_Ku.YunK=IfE[nՎu?h:=8C7m\>/S!v5թvծ][5uը_^wZUڵUj>[|jw- OiYKh`Y^1)厯\uWEݯtUjUvBZ KSmDy2__]֓!Œ'4GOeuRr=~5%dh~-tfJHR. jZ]7h$Z-ǻԒ}krn@{%O}&RoCU.~ެ虻jC[kl\EaW}j|rwoA&՚5m9v%^o^eەXûUEi)I=z-y}UkFݮk\噼}!d ushg]uJϣ/Cj$)NQիTz)2ktB#u\Rhڤws=\+j5WshMɰ6]uHsҲ-d֑hq_ }U2N12Wm&MBzCt|~srk*g#AӦ)I!^.i۱H2%3NѱR9/Mln^vt"*];6,Gd]ЮlUy\2fϨhW[CzD?=q@='IjvW#iZt:IJ%J^>6J u®qKօ(SIt&{o|5ỵ+XeRYW cˏ/iAWT~$Ӫ,2%v?LEnRtbLS(EGȧBv|9v%y…?ְɵ>^Y&}.WˮGKkuoՊ=+kKs:j\֨Isgkk|rri'^*-<&wZ~ӌ{n3u5٫o6vJ>OxTz#C+O&lJadUMmZ$#zӔq< } ^O?Bh!)zU_UJL3xjKJP>޳WJRV -:\z6i~x1 c %(6^|UF=ٓ3f_zj6õZZߥ)smz75|dHvb*SN{VC=Dݩ}tRϽ6Lm&˔| e7&_NYZ)M8Nף P>})h6` ?P3n#ޢ9$ܹCh@ĬYF7uNGEX,Yz J߀`I(7#ɢ&   Y,"bp ik =1k+5V186iD˖-f+RI&Pp ^ -M9AaZFԨQ#*790pA0` @ @ 0`  @ 0`0` @ 0 +NIDAT0` @ @;n0Qt h4'‰%k@s 'z"@ 0`0` @ 00` @  0` @  0` @ M 0` @ @ 0`  @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0` @ @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0` @ @ 0`  @ 0`` @ 0`0` @  0` @  0` @@ 0` @ @ 0`  @ 0`` @ 0`0` @ 00` @  0` @@ 0` @@ (i<8Im N<P&I|?@uJr^Ul7mJ@uݴI}@5aXD:`L&IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/websockets/image03.png000066400000000000000000000514431461403617600243270ustar00rootroot00000000000000PNG  IHDR&sBIT|dtEXtSoftwareShutterc IDATxwTW;[ [aAQb5DI4Ę/5jXQXc `BX*]0wGw훙{{FB"%%DDDDDDDe]JJ l"?҃%4Z'OLDDDDDDe]RR4h4`jjXܹsah4l)""""""*r9 IP GXB``BBJ)F 6Xeez;$$2mOVjU+C!DDDDDDTiw]3ܸqrAnGxAmLjELL  E6aDDDDDDe?~"%{;;ӳم={va̘u{z14U ]kljKTʩ aljƆ """"CԪ\^ JeFoT*~ !Wa@T@mhĄ0|+Q+ɩʲ|X\{~SM-+DDDDTd4T|3k&6hr._ijru+Cӯ @+ < U߻"OgM//w4{$%&`_,ӳd ޳g4)j>k{e29_m2H./{(zql!Ởӧ}!%Iغu+'ںud}Ӥh0bu«F+W8C D\U*:(3e%2Y.W`կQa6(J\*VG!7kN/qzCIk é?gvB.ƠulS8< ;7`ΟO *Gt:AQE7Szfk*Xf/0Q2Kd7k;*GD*׆ߜo1>7c[Qv4!*&Nxw]ժU?Rzm۾C>ë?O'cو5BV0pL]9 !7qdXx~FoX>-Zg`9%<k{&3l """"s&8?RT S쓗<7GD ۟|.8tQ:]0w OOwćDj>*4i(cYƍpE_d""""b.Q"7/Hp~6XZ<}酯@4sw`N[wy 0i=7…JIS^x?=y'b&""""~l,<PLig0qHPTNY|QBgC!"""""eqjT1ny>`jo? \œrp99BY5.\;_C/X;nz"""""Ƶ;q24Swu%dcrQY jL2 d)K,g%"""J ZDo!_DDDDDe%Ԇ065cKAʙB6dCJn $AR( aRADou9#( F&B+6DDDD &lR""""7TLdcjEDDDDDD DDDDDDLDDDDDDLDDDDDDTp ZhZ~^7I AL.\&LI`*!4Z RRR^""""R]@@E*RIR!\$Il `ʋT 4)B[ۑV$IDDDDoX8L$HII&E RqM  RR=>~$AG))ФjB0ӋhR5HNJ*O_""""zST C00 )ɼVRrNR[Zb#>1#GZ J;~I%McccgggԨ^ AA ֭,6;W 91g3Q)2PDJr T"޵+ɓ$ Z v0!  Цu ͚5'NMѬiS s}u`wF5&&ӧ B@`ض Ϟ='Qhڬ8yDMËB^w`P13ssDEEx!CXv]n؆@g av8 jתuZ&ժr4xmw!@/*Q~j9/YFnN{ȖM7rټ}1d;P/*n%mԽj<ڃ_9Tmas*.9@hV뉈,1bLMM ABӧXfU00PQ!&22ժV.~ nղm;r]?r1 w^dpշ~U?^z͚<ԮD!0.+f^E[ȃ18S)矡|x6H$%G rDFc=1[McL+_%P.鎦n\(PWC3 rGsjԶ6ÿ!0< @ u+Rkɉ_q$){4}^}*$q9&Dzaz$ >11}q6@[ZZbppraXf""߬Η" ml |{lvnn033syC##h*W m}N^?Z]/V}-[+ ӟ,ko\v-[cNyG?6z?=@J9 (KU9aܰ0;lsv5I ._ xҳ&W}1 r&OX*w#ڔ( H*EPX ­ff7]T IIŭ[pye24wuE`ffRד%DtLt~WԪ<͌ΖQ\ <~^|eCgP[g q݄ i|mD)r0NCd 3y!0Q~cƎG wF;FbxwXGa!F {^bXgј3o`»0rۨv[)cr_?srg ;wVŧӧ#Iijرh!h*0% O> jժZjvukd&Nor~ȋ_ٍA{Fo2> MM.q8* \URy8 mdè`W@#nm ;GpyL(Cĥؑq®'"""JeIMž} Ѯ][ hZ THJNwyc5r8;6i4<۷Gjr2H{$XH ܽs`VhS~cbc1frusRY7+cccgggԨ^ Z^ٳѣH)ɥ5%+LsSS?qAnUvmΛӧOӋ(jժw@l{VB~\ K<)dy}ѫuhmڴ{e6'.O424B~^V=H{mb"3gVr`*~T$3P D@`ض Ϟ=ck{+W.纾~0*WgNsJ% QP,cJ6@EMy!e2( """"zS!`4$11SrJ|GщMNuj r08ˡR!+V LDDDDo`- * 29oQ4bo LM*RR5˕@DDDDT$H%eWT* !ILxHP(P(jh5jLDDDDT*KLLtdrdr9远DDDDDDLDDDDDDLDDDDDDTv816BDDDDDDo~r [<'z9Agc#HW{$^i 5V]tB# g; :DDDDD|y| _8Q=7U%eιƖˇSm8;ۻ#\$NФU{8~XCa `Zaٵ8<}B?~fMhV 6䰰MeTk<1oh8r/JSn|ؼ?0>kpal3΄6GtSxå 鋏 ( 7]֙_bݍhH, t&՛-˾K`[L䘇uΞ '&`] :- , SYk[/zf[9YL""s8f{wݔiPêNsRc?p' &s]Jey%Of8Z|nLJك5ZZé' @Q*>?®8:- ۽g 1ey E$+naո,)saX4K wGX=3~؀cx6$""""/(p7<, 5/~RquCb=1sR\g<쌌=y.s۫ IDATP |ڮ*ϰ_$$Zzv3[}nn,>y9It7V1Lb/ <}J6:T_y7]}SR{`^+|y! hJ\]N{A@\$V  1ko~XH8W>ݤRP.4w'7bݽg»MeяfbB{ _8h uѰYJ\WWql f\*`/'%gk`peIq?rv{1}.Nģ+0ٻ\+5lDqs~| ʃ`_wWu\K2\,4g*D"n(89,h{:ǰ~x>X[@RԦ2j ={c+p2)" k*省E.a8S60p@f]_q):v ѣI#^9syulj6.)y+X~04=Xk Î4O?w'~VLlj^Xx) 'aژa6+u60 ֽ0d.\{q0w40G^ۨ~坧U8:ND$3ÛlN{+g9@|[1^^]d DpMjC_#Z uϷ!Z!3*{ڙ kn&ED-E} uD9H:9^%>߸_>~ tǙv|F\D(tf \a*>m|~^c[ݲ bv&gۦ?_FGŶ!Mu{OC_QyT|޼rf=U\T|沆#ou%>ѹEm/_' Z*<vωZQxb{jus߳Uj+>HQSF{ۋCň~2^q~ѻG/_Ω~~~bADDDDD/sj Q,8:M4RKz!bc [V2Po53OYkv}1* @𾔒nxE!N^7=$6 i3 ߛkV#xU 4~@!b~kz  qjkr6a|[?$hU J[W`g\$`^S;/'>"sثymLUSh_"KӪ`ZQC'0lvS^^өXlaqq\:܆RZ6]rEϴc}P@PsgvVLr'#md0m;gYFMz^]o/qTC~[ s[bxruŦ~55$ϲ_keb/JWLz:&0pwZ5yx)ǐdyyه[B׺ΞJ!""""*6R} VOYC\u^+N Tn ANl s'! ᕳuA:N`aeB'8tNzktkX?-f\7 ,_\&83ƴg k/eؼ&eru'21/ G#6žYM',Zi o yn0 kX<8yy> VF&u4E~&$&r._2+w3jlQ?MRP헔x~& qXoڀUaZt6qâ52j߃7bpp]Xٶt:Hic5 UT5Phb -->ը6d61/jʐ3{GnOT VzaSs!-+ϯ rF_<(o"G}cōpf{L{9WB5T庸$Z%4OF#&$ Iٙ`a>=;-x O bgl7!:KN†!Yu׫n,m;b$˘ci`am!/Eٰ Zun"!>szԱY.#"-@ $&}gfz.հ0BzԃqA[9TC!^>@Wt8gyr3[cz>&6fP!۽~I){iس/KM fM1:o$IHL̶Nmע 6B*00Zc8+<$J%7W/vln`Y:5K_aΙ~  j,]?3oXowӻǽ3Z *Y-0~]%)[殮{#rL|5QWje_L4AO$$fp*UZUĄ sCݿIڞۅ^ٮ_e aF;r8w9:v\Je+k;W'+2/ K3Y&""""b'+lbxDp@sYް&lje?1I#OC ׭{~^Ukg^^ s~Näm҂SEq >{a$.^Se^? fnV1[MLDdIR}TcyXaZv'* < `9yUFo\{*;cD;+7_>!Êp"!tl+9owS^\ }d5d4+2zdpi-[DZ*gmt;~:2 >YdѤ~Wr(U?%筈6⼞QEs:<[R܂8DDDDDoD`nz7F 4*& ;Gm +e}ٛ-vܲȺ9fϥW;׵@Fq_[/4+e[5]MMaGft7,-([{o_O#ùh\^ |:9SJ &!<`3?ԡ{R睥qDw6\O䭒JEFyw oedxot_jG4 U@-_'3{51r.\|4W4!k&-?HyUTsiG_}:Kr3` L% 苘VzAMh]v@"\ęмG&!fY}9Yz c~0f9D%fn?}\>SQ>s$l գ\Gyy 1c;~>oLQOibuz2]Yh1K/rkm8=bf\@F;X@cmBۧ~o7j,vL$o#A{~uJlPĥo?SݜfbŊm`C,~{7ʱ07fʼ3ytT,*l ׫Ut-0o/ٮ~ ,8qny%s/]Z<*$dy.rys\GZCH"U+p]@`%SGQoU\i'~.5q+:i6ǒee=@s*FMq~1^ohx". AxGQɾ!apLWc™Gq*( "Tn vVYotG1еK_q|>SsYUGզwRUlgt"ŸyY١z;cz7Eyq?4.^3a$v&wZmƨ]8v>A!`ie5뢉[xly30kvVDLik_/?{vl;. ƃyE(MMaeeʕ.m]ڢ%ͳ ѿm[Lқ\oDé>UO,{~'xG|1o^dGw4M z.}f>A7ex >jvZ׭1yL?44KQ.kgZ(LDDDDDDT MBDDDDDD DDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDD DDDDDDDo2E~ojF{|94M9LW^:_P"""" *tN: /eXmLDDDDTM !Do"""""b&ʗ(W V[&&&""""z6HDïS>>F~zߠ ~MIaS>ʲDDDDDb&%k/ fg8s7jyCO?)h.t $@h//`"""""`|I!];@gT gVa_p幀1l|E ,0vj#I⓺ Cd fE[vn b&""""z&zA~џ dz"9m_W"TTCE>LAWȑ#8sc o>kcqH<㏖ǘ}'V3щ`&""""b&*j_*xVe7XGcst _yVԣ{ Vdfֵ܏B {FW_:v@D8h|tCOc~X{y%j^Cr > __e0qP "a>nq$9gx,M 2UHD괡 LL@1G~eu8F`VLݧ_`- YY"z_pVL{%hj x Bg9̙8(aJ@qa8F6$rPm8|zV7qY-VE#z?3,B7^_Z/K(/iM i0 [>b%@kP ak ]IPeld `v^S${K,0:_Y輸a=/L ^UMb9kQ,e}GpZ-ls'}e0g8&""""b&w.É$bd&""""b&b&"""""`d2Y-qRw"""""-Go,Cє(7[hM6EӦMDDDDDo$""""""`"""""""`"""""""`"""""""`"""""""`"""""""`"""""""`"""""""`""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&EK]H'cD]Ɩo|Ѽ%l7.JHk$ LvE%IW8rsRC英!Bq{fjH za]xS&_4/ʶ{1sed \) H-`!3}oVrH"c7{|//t]{%[H>h$,G a6Qvm|u{{@ 5:%:m  qs4ͅ M{:aH=p vhf9s@ X:/go܎Tuj׫/ߎ>hh^=_87n?~Vz Q#""""] GZѩx<(z-@8::習3Dۅ8pKNo׋吝HG7x"@1N`E!C횈RtElB*~X#Y1gŒo%޾NC8!T~:}|\Mz=*=oew߻wV4۫FګIVoHV,ͅ$%ͯC؝>̹4;w~GIO!+ӯUV5w^Kwm_N}g{nJf,s(iп]uTީr˂)ec'f-IϻLO13]^oaMN^ǜ Zvǧ -^;noᏤ,g{\<;]rJ&#y]}ue{k97S5EK|uQi4{;\|_Tva'grsrоbqQRX? ϕdݢI+]W6$;IʷVC⢤9o/Mwa!Š1+aܞ??63FGʂ{gs?ʿdf9>cJk3ۣ3[iqԬ]'C[䦹?ˌךf=wm?ʳ]++n͜S nѢE}۶=cmF߁y쌟05w7NWNԮ5+@4'wL[#Mó&; Sö́Q_MY/Og+l9틋GfƶNk>fYwjкԿS㒢l<\QюmvU+ i4&n3LVn^/^AsFd yL1+k/ϋݯ^aMxFi26o= 27۶s{CϜ|?e3sYO`f皩Gޒ;Q+.uCrE:U?褴-?}rն76JAGl+ I|H?~{h":mv\dx]wޏ{@ؒ\_+ɋ~r{pıɽȃ/~cκzrμ8G=13^x+O?,9E 焧dp٩Yz^T}UY5Ͽ5e|}ۅ9WWbS&.A8[Z>85߾>}M.}zۋ2SƴC동GTl;j]OU#//\I4Om<=jxnپBwqJJF@89ϰ1@e.>EZ.ϧ,Jz8-4=K ӿuR9z珷w9q!ɽ7m׆TʢW;_0!߸ᮬ^8=Oڻ_)Mo$ӾƔM?WfԿ6O~uIR)/Oȉ3K2ӲP5׺J}R~=i2fT~&G_v\7i'dݾ'˒,o8(sBy|mڤQQvbz5!GO3k#JKGl©iեW/ڒ:ܔٗaGqi׹GNhy)LRx%k&&e M:,:e?@둊GSk!凥I=vL.jAꕣWq9nix@d27+UQ>}̢7_s3ѹce-h!'~+Wߵ,ٰ$S.Oʹ L; MZmN~,Iޜܵ,YP]3qyxɴd2iԹu9;Nwϳ٥W;UdX;u9-;SX~4-o̟']WBʾ1.sʜZasly[ #2~_VQyyyaBj3K6*š=rG7zvΠ),`1:7kZIgMLr鯩$m[KJJ'@3*N d΋2=wgF]guv!'8>|w. YAdnٕs`7Ͱq;Ho1 0` @@ 0` @ @ 0`  @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0`  0` @@ 0` @ @ 0`  @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0`  @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0` @ @ 0`  @ 0`` @ 00` @  0` @  0` @@ 0` @ @ 0`  @ 0`` @ 7lْB@plڴH[#I^];ZxQ`S$_n׾nzn~zyw}&IgׯgTw:{&>Mn,nc޼yۻF}sIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/websockets/image04.png000066400000000000000000000742641461403617600243360ustar00rootroot00000000000000PNG  IHDR&sBIT|dtEXtSoftwareShutterc IDATxwTW;[ [aAQb vM4Q4$_,1j4n &VD tvP9e͛޼HMMQy[JKG`&""""".99h4I 055Cllܹph4kr$Th ',+Z! !l!"""""2JBM+e2rYޏ$ IuAբFP$%%!4$Ἒ06 v+zaDDDDDD倽BBBV,ֶTcogJ|?P 2$^DDDDDDDEqU^cbb!)xQ~h5Zh4ijsdrd9z` 'ɕr(Y5MMnR̵[[[hjICJr2iil""""*6Zxaj"fM9VZo~`ժՐ+HF I]T@V#91I l""""*V&\`e~*>2<{z¾}onLVfݞr ~Bw1q*CC!X=x ZϳqaCR~Je/P`!J>LTȕ X<@zr""""*q99UyV+2b/Qy22BJj iEx޷xA XFƍ=ܥ˗1s'E4e @{(!JC5.r@UH f3 &"""rIy88ؗH셐&U4M'~-pL&MTxG/#DQ |S`O=d2 ۶m$W۶mLVT ƌ~Ox11֘1j||X\V*Úr֬YG5hRĪU3urrγ OD$+%9d!A;RUyY3@Ex ꉹIDDD)^곌޿/k׭ǯ7y33^ G:R~!z^`""""~vv-:sz lmmK|?u>s7\X{XWZ`ݰj']ljhU`:et!h|Q xH;>`9E Z[ ٦"xzWwmܽ|i*Gd&:}EWS!zf)\f/0Q2KeWk?e*GDF)ׅo1>7˷+fFhd)C2'TNM6޽]w-ݫjԨ~d#># = k>Oa5хT `:+ Co\uϰ|T#5. wlł 0-kJ\+w1r ^ETboUK {BMp6Qy y\SG- 7Gdȏ?D)X H1z0gf Ov$D%j?*4k$sYMpE?W;d""""b.Q"/H=5 6XZ<Cpwu`I_wx0=M6…J۔ӟy+~y'b&""""ҡ~6Pmng0HTTN/Y|QBkC!""""bex:j7&k ,/*]EKQjL o, .@p]/xr-8~l!S=p(/bHx1uO`Bsf-8*bӺ]8@ ƺHArq^5Tju ه=7k)I0C)1e g!Y ? <`RZ/U/~ZOoGJ4XŠ8l7.gLa| UD%ƹs%3pe~s|Ka@*  |asc3f-~C0nhF2OXx~98oP]E\&"""""*$OOO{n60X;{\=*L"*بbs麰DDDDDeEUK%RV |y1ٳKTH%P~% 8IƼLT= \KDDDD% Q9Vpq`_""""*OXňs.{8#% _""""*oXTbDAa ,mODDDDT^29&*ox j#m,e  DDDDT\[24(K9~^`Ʀfl)WHSSԆl""""zI$r*JLʑIPW0)h4j mCDDDDO6d. (%b~VDDDDDDZ`&""""""`"""""""`""""""r߼t3jj! g%""""z$I 2 r29'Ph5HMMxgvmiH$ Jr$)?4ФA mGZ 7'b2 B 55 T-J9 Ƶ>W-j4HMM)KDDDD& ^8J-HIM&MEAJrr)U`%"""W9ϻ)H03S.Bh{^-!5%Z-).%>%=0v/$ۻ@ı'T*466ƀ~^pvvF5P(l۶O>˺_~RRy5A*]na$@*ήݻi|<< IЦU+` E 66 {i'T(`hdvm۔JnѢ9>~:7o͛W;{ԯWC{9kkjb~@"""""*['O('(|F CJ037Gttt`_>݀֗JltM}iS*uc{7053æM{0{tG7x[1f9 C{y"}t^ÇC|b؎;#>1ÇÚkʿTDDDDDŠCرcHMM(Ǜ:֮*eߌ;KKK4WTǫwoݿ}zJUe0Nf}ݩ~i\Bb8mZhO1ޟ6 ǥص{GQQXr5:8UVŲOFSoΘ/a钥sk`⤉=K|8rHH 4l)5oŧ/7]0uPk4^ GA{)f>(Ù9Ǭ2%:[{5p1׀yc 8R(HCzlѨcn#9'G'XYUԮ]n*\EB_QLFÅ\WW_+6ھk|J|_H ܽ Bf+9.Z0VDm۴ 3>/2S&={-sV}Bp>c}6&Oy7s:w\hU;6Y"F ;aO#< /PgQXn*PgR'΀wFzU%*N_b8jovl~#WC U^B;}IC~(&8ґS0n ;<ʃ1c$D?~kW.\%b2_z.(6ؾ3cG~ LoγzJ5kv%* )vX1*zV?.FĬaǑH=5]Y5G!9%#3?u aM9/d:Y/} _O4~DʾҌc;*\U})$q&D q$ ރ;bbcO"..Ooxs1 ĈaCP"ðfzDFZ/3/X`o_{mvnn033wyC##j *W m}NW^ u6r '$!4,W]AmShhtyZ6w+=&*X$ 0![:)!- "DDDDeKLl ~{Lxk98ؽ'kdE z{gw~Z|ˢLSZ V̵]IU/uG_XFR]6042BbBN8Yl CڵPz5\ye---8t0T'55@_&AZ9~%ð9 vwO٭(HZ49  s{4j1 """OBB,^c;*a2L&àApum\PE%IWp$&%3T¦5ݻ_N?OiNU]4DFD--3$XO_Xv!pi + X@Z5k|5V|o9N+穟a[Hb2TktCA\b tіa.#$&e "luh'^{aXuhGer} Nxͷ-,JVV8` `:e,/zN:]6{nݎDFF0 5jqRi| RlTB5W-L%OjSSS򂳓3۷ɓ'lX""""Bpm Oq<7lF*S@\`2P^`"""""*u26ɫAid# T_\_R&o """"WJHc0"W(`4(w$^RwV W:0ӳC*Rxi% DDDD f_H/i2ȠR 37N# $ Ѥ!5MSb\ IziJ ?JJ29$  ZZCgvI ! s.0L.L.8GوM@DDDDDD DDDDDDD DDDDDDDG{b*DDDDDD+WUsr;@k^p-A$cuz'0,w;XuwZ2M$K\`^VAΟpGt`2Kʼ{ٍˇKm8;ݷ3\$N ЬMG2SXCe ``ٵ8<+}A?~뿙aѢl-`)aaakѼ5:xzc{_c8r/Z=xeu """"z( AH:w _cM̘C m(3w 7]ƶ_`X,:.$Mjŗ}/}-;)uΞ 'áf>`]:- , cZk[ϱꯛzf 8Yl"s8l{tXČHs%ocWT~ jmx IDAT5' {}QER@2 ]Os`9+3ܧ-z@$vcEÔ!Ҡ_ˇt0,1SUeQ1ggnm-܋V/—w?ҀV=1Ĭ%;`hյ)/\n;;?zPp/OX~k cᤖ^Iu%BbYN?{Ox 5vD7;Ԋ lXzn4<^Ы*ęԨPԬ~Jq[x6%G?-!qE)hpt&5q%/;}&""""*g`cr)e.F/K3+=?'h9]qӼű , YXöak8'#< fDQ%['ïy SY|ٶøf{G0S3Egr >^o4D5k H sTEog_ }oN&Zc[3p1@"W}\Tޢ~+.do1< 5A '^~+◚㼂U.CzջYϵ(쌼Mvѥ~uؘ[Ħ6Exb=fL~RWj1\apnE( wcCN3q4MʿDפoQyzz n݅STGL833iQ7r*镎MX@&Pܥ6L9\E-vZ3*bؙ8Όn_s3afn/ :vl-:X请' uG}8٦Ecm._lHwfx1nL`2q!Ig]>J42Ue;Z%:׳-!irm6kM=k*c[%CbŸ܇/~\+br~Ss㚴Cw0'/5I&yjbŁ[Óy|#m,>BmXb_fZ^""""Bߜv08B|_(׸m4Eh ~m++ch?~. 0/.85ռ.>S["쥝sӪ`^QC' xT6u|v?O=`g k M0ssT<J}k->|%y4j85 tjbblN?܆_}Ϟ,7fLlw5KЫY_ϫ*co0qOg|[ctrmu;~5-4Orke/ZwL}w:f0dwQ=up)אdyEI9[AΞJ!""""*1ERC @YJ0OwoĆ'&7FF֣f3s71hUsvt=2#,,ۄ\ipҝKͶ^2wM,D bg4?+1cgL;ToUğq6>$k:AP}=5r:m`J+at#'TM`ؒTly;f`u2 6^) 71)9kQYQstj#%gtܯ^{"7I CU_r7 `DF7 HU1t\Դ\] ;rpαӁHa B +`w@]iAn*FsxVpWgX<)COfp# 7ԟ 6JsBz8ɣW]VgqfE>OŠ@페!r"範/3S9-G/Hk 甜޻C =WGþoZt,s~G?c*ԭVk4aOmTRxs%#{ Rf)sD=ʿBDDDDD*/>p׫/ŬFj7]{m؇Zc,Vf%ghIѻiiƄXD [?5j~-о㌬A#r)rNJ*y;Z}ڣH_T;ɽݘnxo"""""*qbɶ;FGĮ ~^ֹփ7܅M'"*YcsqXU!h`^\1nNP0y$<9L&=8UF=;"COšXf`íQ5*爺II*+Wj1Úour2@9 3]+}Dg.7C'"""""r%kxj@U=!^㻠ZNh(MO F@x1N$$q2^hAﯽq7eŕ2IVKIbw K?Mr u N׾fbDs@8Kt%J^Is?h7Xk":7#.&هgK*؛[/+eM{2 z»Y;pB*zcn`al,n9> (Zzy|/`ңZT6q-\ڮ&M0#+t:y qvכּZ7jfY,F;?9S/Jr &#"p3_g{SK来q/D2t6<O⣒DFEwmd˦xg|gj4 UBޭz5Czn\t4W41k.ƿHyUT>h`5ϡ/tC̀ 0Z0Tkc.b֮[ k6㐛#?߾(,nX~h]v@\ęG&نE}zbc|`ŽsNx d-<'ơ'qLCbϱV)/>Cv>w$8ﰘx'Vދu3J~ VvLXD=-D,1HResk|n\Jcڛ^Sxt.G:ȶՠ<^#<*#v&i_A8==k?r3aj]YXW6n`/:IfsbhWb:s{Q#Q]?&TЫG]p>&7} 3ef=fw$5 te-j6Nj}\Mn&0lWhiE5322]…B>-6 xCQSc?1c=+bDž`.sʕ+g]/8F$1L)wQd\^sGWѵgFmfn/LE九UyX|*UfΩ[MaשL8*uk#:Xss\;tU"vV5Qy[7~n{ha/Y~Ȉ'xl^ vVv٠9DŽQQ\M:yW44@&q]yV[0._e7@`d(b$#XZ٣vh #M3896至w".}-mGNRC_v`qVG"<6f敡45=VS#wkp46DOhjz#NE {4wEeTHBȞ8zS PUA7x;g4 =:nlV|2:uVjo0m46MQfF(LDDDDDDTMBDDDDDD`""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""`"""""""`"""""""`"""""""`"""""""`"""""""`"""""""`"""""""`"""""""`""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&"""""ז\\`+r6p;k_)蕰b%|iܹ3gF)7!5kJDDDDT\@5#,ݔ-Gw\ه6zԩ[e DDDDD^iiiB&""""$ː@^F-MDDDDD D Zj`W(C}hذ6j>bs|m_I{_4n'S^X=Dy`ُ@!֎}gE- O ߌ1#XBVb&""""b&*p~^" ԝ 5 v:5Autf5W vЇ:ũP=wRaq !<ރ-lGe xq1=@=#?GFY!_e[畻FejB@}/G8rN ;"!xǣߺ غ/oAä1Ig$]O0@1gjhh6EX cKt1_yV VսBvB ={FW_zv@di|@ocqX{y9Ǥj^C/ > ]e`ʨػ£`|: BA~*Iy8@>Z6h"""""`Ϣ ijlӋ ؿs칥(+K_~Uɴw Hق! V'O  H x$ÜCrоhqMl`|~<[hZ >~ل&нB?uh#WCjug ^hZ4qk i3N ǥj={}x Ũ"N`ۨ&->@*:%k_N.Eh=yg=[c5l ΂=DDDDD D~_4 xa/^j> ȵ^$Fg+= ha ]o 910QpyNLDDDDLT Y$0Q `~&``"""""d2Y-qRw""""b m%X ﮹ȖW½Ԋ...F)WŅ/(Qqr|imrJ𵓡\oYѼys63Bp@DDDDDDTA""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""`"""""""`"""""""`"""""""`"""""""`"""""""`"""""""`"""""""` ٳw4ZV했w9%\<i]_p""""b~Dӽ]QER@j%N<\:k}Bc35F}0~n<ĒifI]-k[mwcFVP2ZBfPD3'xZ+ZvLo]~:b`uCDDDD Yü=Qfq %ż W!${6~n|!ǰb, Y>Z]0H xL)0CI00k?}=6varpkK_o H _t-yB;T,RKkGDDDD ꉩB׊gž\jۖkoB)p`=otM&{*chkKcsX?ߝr`% gӺ9Wcu6[ _39E_jtFm|r\L³Sw=[@?]ϲC4h~6 @~1dpg4i㳅=ogx ŰmѨZc4P=݊` cxl,ί|l{S}ѽ/zuFub u$%|} Ctq|]@ĝl< >^^JdӱR%vX@Gz|Wصѭދw:!ֽ-j }KuA~1ԫ3 X  Ҡ_҇6]?Ԧ/U=;vB!CпS[. Z!~97hܬϺ_W~^7~~D8k,sؑcq pogԨop8:툈<==Gѩpt#^7xC,x!~/\`.Rֺ3DI;DZB`Ȱ&B  ̹(D^1®x?UW*!aεОs?@,w]]"Q$0bB}] ?s?Ϝk^oѫRmL\s՞9[g;!b׍OBDqz@EBcY"f˻sYV!Pg?_w.BE},K?W!bM7VZ㏉խkV{DKǜq1L`  IDAT\I\h_Ke/yXa]cXBda&S_[*pkRiVg~ G KK:}jXr%܏<ɼM.^>K:qurp>v݇)9uOEl+`4c cK7tRsL䈷>~O&@L *7u]ꦗfV@GdU|^޶!cב8X({wӽq3-%5$J-NId,IDD,Qk}Wb;% 5Vk)-jJ43Y<'1ǙsΜ=Qc$G=_SڷEI 2JaGf1꽱&vtаrH>ZOھ~=Eb9mbzg'7ʛSxAt11E:F|Gm#k{boĆ-YG^rթʿ|v+HT6h߾CQӠ?Zc;%Zm. *銤1_~==TI+WNf$i­JN.ǣ@~ wH;ѨhMU+-C:}ӴNk*<"mp-1V l3YjpTw~m]!}4w VX3T9X$GkW)w'Jų1Egf_뒃 Jұ:ylxdR*prHfxV>eLS,Tӆ/Uזs~$4yu(^[ˇ(b tJCW{{'d_kG=˔)#Gd^j_Ў FQ.K/R_[)1SVK=4]Pn軺$zfMxQUb~ԾCU` jQm8XWu̸ԩZuµWh*0vѢPW*jl5oT=TU:>k,OjX<\>%Sbz9 ǿmpGɨ-SfϞp3^!奘Q ~kqWy\҉|OogO!8j~ Kt:jd k%r;RVk"4UՎ<<+L^t5twM>j+q4Vû뮲I2gu>w!y잣h?agFըڃ9@*NuX+Tө-Jj.Pqj4'%-)SZݲ#"2tvӼyE>i'k4;3־)7\ |E޶BO-Qv3Z[kI?\ %}О3ڙlzJ*I ;)ϰ:\zGul0Edۻ=I,4=Mi⪑ꤵ˨t:j~=.?[jvClI^4x&UL=A>./ g#xH^ee\O?}C*g*'U/9:}o@3Nf*ߘ>A6?z?-=T#BBIs7{@opV37[[8@x<\2M}kX#KcRdY>Ue)U1Y^KE,9dvas,#׷*;;UU>>>?uUBIYo;vy{ou1 Z?%+K2z*l \v6I),Um_~H襧i-ɥqo X~/GA~VȪl˷pT#ե|?}C(G`Y}Uz5v6Vx4~UyBw։XHoiFx푗L1f#CG Qi? <@r;J-&i۶m?;gjfOӮźr'x:nz+(۶bAmƛI74AkjǤjCo\Eʫ^*.ZnҶʷᕤyUwKj⳱BəoJj5j)~ȇX_RizmXjt~3'nW~8kguQjj5U܏$3Gl@8~ãu/ZM{WZG-|1L6OK=vA_.iP|4N͜IPKPK_nf,VtqV;uͦ/ޛ՚ipbj; =7ՠ&Ҷ= 0Yݫ68@s#z%J؏%&O#ZY l;bu U@DSq_ [QDz^&_ZhTpcGtTzQYտ.g߭T&jFM}|xj-!/hlE!Z.)E_Q޾jX5uaDXrʵhOWg5M?֫/SѤ.h-ۨmHcUj5U_m~/YZ/}-*5S]5F͜m_ϣ}FMVETv-ZvUIJxo浮|eTo@Si1y"PE*=@jms>;A{EYGԚl19/cLBԤ:9ULVqTm6R{w}TC+5Q5 Q)zlmThpSjTpc5 iv:/Z7S#kچXUZu5Z{=)EߌnB.g-ҮjFv_ Gj5M3O۶mVd<==;}&{0g|FSg=7TcZlZ8E?j>mQcI?l&,f4c.3U5}&=8Ǽs֘Dqy1&m|| ۼLe!\6Ƙf^RF#wڧ=nf/akc|^-[h}˘.ݺ{̫eݲ1) ;Uebҍ1fgZFmNch6V6jg>/`LN6QQu1$M 2j5ӾƤDu2U%ٗ}5?LߒF m3 k{Tet}ͨi6߾̷oagA۳k1kǛ3^IK-3<ڝ_ϻONcuJQ晿g.Y훹ޅof;_v:aSaY_\41͞1Clojg1 3L}*Yh9Q́W1槩KA-FZi~_b{}Mtf連&jgJT12^#sMbO(d|;bM|jzT={:նȶ4M&p}\iv|Lo؆w 0|K3{zGCw^IRBBu3Hsk?3u|7-'j^١NJa*`?TB鳝JJKQ_7?ۦYoJ )iC#\/Ul.&*URՆ)*W}ZwUtmG>_ι뵀NjVTbӣ)ڰ0N5Wc$G=_SڷEI 2JaGf1꽱&vtGXV1XsB'm_e?ҞmiP6}PJ)] I"WU#Q#^R]wXfyGY; s,K5*ouRH.)N]\٦a?57Ohk[7bS~yyJ߮f۷jUklGP m$QuU:}Ӥ=#|TgidxBڶ.њvEN}A਒]z*lg{t'ݽ^{6{:M䧲h.v|,Ag(N27ZtQۺ^'/~z=&#c3vǏQ[}{F ?ukhwtT!i 'ӵtMѶȹKEY{~v5T8*@ݻU6U⮐>ܻy+sW ,I։5ߔQɻlۢW/uA%I|JzUE2Wu)wQt:rH'.UO_ մKU%ܾ_esMu]-!p_S2L2={0zbF)@ms\Jd:ñ[3I:}AVMPڲB;3g.ɧȅ[O5ֲuhWTȗMA T裡s 2QV|wESkqWy\҉<ѷ3mG5?sְϗ|A5/B3N6G)*ҠmOM9sFW_1ZRNMؕuJY?ȯVx= y6Tۛ.j_={ |Q܂櫬M/Tӟgj^w>)A3Dl{iLRC`9C'JmlSKoT…lɫT U~Ngzu愎9V'|UvT<wV0jƎUs/wW2(!!AUTyyVN wF/wukZDf95H?oq#:9:Hn^*Z򜬑_*W^W$gg~}qHuDAMn7^TddkuT5IZ%k2Gp8<)?&u)ەуej[f_ouVw3i"]:SrB-zb˵mӺ! 6ɼNVB*7}+CeЄQy]TÍF>\;؝ p3zǿѭgUNe l@n'Ȅ($NypSOvrS%}Q-DM*|+<ۗQ".RӀ#J.Okkz [X?qafnZew9=(_oJ-La_25]]gSfTbF:\2Ǣ:uMP6&i‡ͼgfie*u0t6޶7>x82oMб&ۿܰu3k25nfƄlج4Q湈>fڗG̖My2ef}-m&Kym=~bVj]~L|6rƀ߮5W++IDAT'j=ǙE?fLqݬqu+ol iXȣ\\|;xn7nqfBXYyBUS'<g&4b[z\1懱͍Mζcm;}cLW7Zi_<@[VntGi$icd/m<_*?e?t\|m]^.U\ϥJ?z@T>V+IN_rtd߀'89(gY>U1M!|8 l@~Z{Fh,i):Unk }~\8JЛ--  QZ*b!K7ӝ'ei˾LS&^wfNf hfu*lrw5WmSOe>Otk5lFmz9[h~QQ멒GeUzN=}KNIWa&):zZ?oV=gɥ5u}Rt4ўG4{Տ=~~x*8"Btqږb~jزچ4VVS$o%KY6KW5%4.I{[*ُƾ.@EDDY1bNJeZvl#uZ%~>[CSaSmhq#j&m۶TVH2f߾}?=o]b3T>a*1O-6-\H5{ΨR1Ƥ6j31יŪ>lc^9kLzYڸtl>xgm^&l 2c.cLq3~);7301s>-e>SMeL]n]=ղnØ̿*2iƘTW-6'1\4C+5x3\\Xgfmv0zY}m~̨Q̨Fۺci_WcR:*˒˾ҌogoIWǎM2fܾf4 o_8ش(/6 W ?_;ތܟM25\j&FZ3hVji^7zݸѹ^zJ ko?_ι뵀NjVTbӣ)ڰ0N5Wc$G=_SڷEI 2JaGf1꽱&vtаrH>ZOھ~=Eb9mbzg'7ʛSxAt11E:F|Gm#YIz6mhj74-n|ުdݵK!h;޲/~~=UMd.OI x xh߾7vix5=jrHoIt-]tSD-%Rbߪm&+]  P}կMu+O&nbq Uz9duh7svTDx9 p]rpPAI:vR'/Һm`U]]T%,愾?&)"b$鉋gUWf4jynʺMu]-!gYUꅊ15~j xZ"tKeIpe=־օK1B+< ^QSx ft m^Q7ev(Mg\ГO7P jXe/ЮBeչQ[OQe~SW__ʻNt{~;C] }T㑊;wa *}|TK+4gsD_~" v3gt%Yu/U_Ԅ]wFSeӵecGDepy oEi^0&LBfGO^Q{ŃyU_Yb:z`z)5ǒjF~{8[f16 IM=A>./ Wny _Ӄcīl̟KtO|zP$'U/9:}ή:c'89(gY̼WU1M!|+ARttשׁ5bl@~Z{Fh,i):Unk{ ,׌zVU=ϻ{!<        000000000@@@@@@@@@`````````                 00000000f````````                 000000000@@@@@@@@@`````````                000000000@@@@@@@@@`````````                 00000000Z_~]ư!yKRjౖC.^e˱U$ժ]$'gk; /ԩS}82э…4 kއMM\>B&M‹ v׽?s^$e`0PXXeoҥK]rܩ= CM 23w""""""jAK-m!nwW!1d׼kǐ!>(*:wW1k pHٶ{/QVVR{Eʶ{|vS7t>C yQ#77K^]?<6qVrDQlnĽ GGG|_3O4]*bIˈYU|3 B:/}O^F=23FgϞsxZ8pв<8x"޽{ʕ+Lf-FeYQ31+j&59w'uo9z,!W`Ҥ`|' """"4Lx͘nzСCJ6k..?..6jSLƁmosJJJ[Qg2!<< o.[)L(,,PQQ!x/7ꎝN5~EޡԥVpwwäI&M FFF&V """"e;tg&vQD͜{cǍ,}-ryO' ӧ--' 3sx _| 8} N>駣?oMTVfYzxc2KLkۢ^iq7^x+~nsxZ…Nxe=&Ņ Ko gd2vAd$&==p#?گDbd[ҥK(/@>},O#ܳ30h@#;n8a8IxለqU6 cpat]pMMM#wމg-v'$ V[ӡ{\R''@*a9j7V'hċ}6@]I]Øߌ sO`o䵆ߨggbu@Wǯlujn| {.{ז#"w]]: >:wu?ޮ2z{3֭O_@ii)zZ"}={zI_nϓ&〉n,-l(223qi~ca4,c|>`5RR>џiӿSNd2!Jv˦ku~ <#y0 0L8ˌ`12lҥKXn=~$=GDLO|ݠgz"#d2_î_jΝkgDQDYYi|w?wTVV"53`R>7j,""""L2qDhQTtU{GaT*dBYr888h4b Hu:OiE/DDDDD7 Ao̳A/{>>>  ,6эDDDDD%KA/]XDDDDDDt]9 ~een{[G*ubucR@DDDD Lt;`~EDDDD $H XcDDDDD =zAwp@n""""bnd2W-NN MDDDD |Xܓ5Et SWW~EDDDD&Z988@* WD D=^ш:V>w> nnMDDDDm~VDDDDDDt[`&""""""`""""""[g ֢ƀZu:A9D88:I*u̢ptA‹Auu"L&#LFLb$" 2SwRFUUL&VuQT AUUõA袀fkDsOm-j\Amm-L/ '''?g'H+WL7'D^JC@DDDDGɄrTWU9b% j 8:I!⅋aewɄjTWW[^svvF޽QU]gg_S`Tz$"""h2ۗnn=7PRRpwwǤI!~ ?N' o~ ***x1:Zrʠ7}k0t (/̊ """JE\GϞpqvi>L&=zBi) 1mS<<X憝:hujv777L1]{vჵk0wpsshqlUضo0+J[>eﲱuˇUZM'\7ڊ??yuL˿HDDDD]~~~h4Z_M&#d2:eKosGۇ}Gi[;QY2v +V{p Sѣ.!x„e3^{Ŗ„ cXLp%"\i6Bg5K'a$h%5K>KŤ>]\q쇱]A1DDDDG)S&uhUWZ[.]DD>x궸^m7áR c\x=:m3Œgwyt$Xӈ]9Emmm߆Vݯڅqis4SæڬQ~_{-EEE>Y,SoPYY}=e*vzǟƍ½=Pb׹a0tl|G]݇ߞ+.'"""BC}|лwo' ۵?#h}OMk>Da_dSӞBJJ&Zn z"g5;s {~ocjj "63[_[~[YYynZ ._Җ`777ۏB஧ꏳ-G_[\cb7LO~߅fAĈT G=ŁZA^`vᛂ(>➻DDDD!C3dL@޽wA``  ,sk+欑J-[\_}Zn_Z]_eC?2jy t*vډ~āoe㏇b_Eg=zT{l v}?Cb{ڧ6iM9}K_yQt2E'yMeZ:vR<pf !C>hR~;:6t;AMns`uj73f4oHjGX Aj56&j81=Ko*ar4'%#$l3,-mud2&S];5\ރ̓>y>O6NsvAӣgoYY: nZCT׆nطކA"` /Ӄ@|/>{QApL@O6L |}]fߋ݁3O 8˾W/Ǒi}.l aeqY6gk[~=0fLjO p/ėi0@WW&=4^}õ3Q'p"/_ŋcѿ|y:v۬|sS&cʔ8w/_\WwgJRKԝwچ96ۑ,?QJ ~|;v Ҷ|l޼+ޱ/l޼jp ,^B*}۶}Vy`iS9ZrEwai||*ܞ=#yw x5/!鱸Pe pΥu>wwqӇ6hf>@dgg#i׵|kׯTTTɓG`Ȑ!]أ |2pQރn  77&˾+/ @qZrVkʤ۵`uj] |i\.Y{^s'''zre`4|-7pssC9}Cu&S-**![!Ck,w Xw_o/Or X&6*Gy||9UY3Rmq.@W3F\G(T @}#+p :%m2+x }U&C`` ~lWupp:FΨoilöm3f }"aر_t 2 ̞=7,s Ԙ[j{ԓ nn[r4eggg,͛XZZNSYY؅A{V&\̛As3+԰\w1?cH ƌywbÝ ƌy.W ǏiGZ}5) 8u4 O/o:yǐA*W|{4~75kV9 `(EGoccO !?{|,<50\ \KG_x:]E]RI) )(Ӣ?6o?\KەNXNDDDEpETUWc/^Duuwpv20wdG.[_@]֮Ǒ#Gp|"vQ ҿ؁u5^K_ΡٙO>+W 0p#QTt zga41b^J=m.Sk]'+W|#/nGh9G:L&nMQ^Q+ gw`Wy!o&̞͝OyxwjN;?ő< O to?:r |=/0q?<2u.fߏ˞}av+x{j\LCOgQR}}p.}w^Gq@Yxa#X tBqhtp9Q߿?~f>,o/Я_}nmXL&oimcכqۻb7F}wI}`͚_d4*++wLDLWয়BcĜ9,j˖d|\t >^pَ3'>F ~{2.w]2f #6?űX83 >t{1 搹|%JJۡcзr⁊JZ.^{-[|ŋ_oZWw*X- <^3c>IJǸy)ϖ%Qxi(3\ 8Vw}Jߢ ,y њP^y";x}M_80id5sUN_<2;1 PS9Ix흯`0|K5xeu8P_ZOpXswøpB|^Fh3sFڣp }]NDDD\e2Guu5v0O5~CduZ;UkO"lc*l,BEEk_GLl[Q“C***o.5eDi̙Ϣ6GqJ̙sq0g< ޅ{v<7T(Px c`ʔɖm׭]kwУ+/}*3탪N{sCA-?{е:o\p]¯yME{ IDAT48}4~(Rwjkum O=$Ǝ}a߾oG嗈n) y?e2W|}zٹU!djpwwugHΩ$~7s$'<<hZxxx`qz葫>FP(C'=Q+[{מV`""""롵֟mLu8ee:#X LM~`bcSлwoMUNOO9DsfoQFNODDDD$ ^J۴dLpr9 C[Cow"zzCC(}ve5Hpw`EMݣQ7o߾3y[Ua֮cۻOTUMm[o1555(/̖`""""q!C"GO8roK&#dZqwwqc0v(wZZ OB 7 i<=pvrBuRi*;@L&#/h`""""RԱsdAW+.^Vu^{ b [~(g^Ruu|vѵ88:2Aɟm]T]A> 555~V.NNN TVQ 8| B}jFԙPWWQcQH$pppR'KpҀ}pvrL&Q  /JՉ00M"jjj 9Bo uwb:jԲRo=n DDDDDDLDDDDDDLDDDDDDԍ4kn\PPZ!"""""nO9pMDDDDDD`""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""`"""""""`"""""""`"""""""`"""""""`"""""""`"""""""`"""""""`"""""""`""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""b&""""""=D$H)#x]icԃ,IF8_$ Xs6 Q!rwN Z[sbdmZO2H${B@fG܊$WZƆ3xu'V,"_52Ȝ$d@@MDeHܒS: Čׁ#mSgDV"f%N akiϺiQ$fGց!uy,RQX0U:I @;qw'*pZWwyJku\m*R8;mM>Tԣ8sBt7l!@+ǁ裂:\}LWzʫl< oPl(H> ^Pj8 ȡTQcg99*h֥btm7P=,v/r[2/ yF8DlK]27% ~yrJYDDDDDvODp9H;uYHVߍYm-r5$zdZf㛆_ʡ Gd/a-S"qۿ]zBfۅ ޻/U^iK!. ׏EM #l}F'!|c٘X᜝(6¸&A1#'1++rj87:.!z^ <@([ѷ[ Toz,E)6DDDDD7.C@xO[Hޔ)HL0!cw!_AiQfե`W z(/G7Z#2_CZ'L V>im_S=~aT_.ocg-7f`@~v/HC>ȧ xc1R75m <\7b=w'"6"=!I yB DȼTW-I@HUCːyyt B[* 硨?<zb> |糐JBFB)IU C$U媖 aYh1@lCT?*<ͳ-+0pD [ąB,pODle1yHN R0hdjފp+3O1 4LO ?e>7ߞ;D!,8B1ܼ0_fӅУ`[B;.9V#]%F'ÈZoĉ(Jom=/(E6/[t="b۽Y (_-jYSrJQ=]#Fjܧ<@\r{^= D`W.D|3{5=K-o#)km)E-jD/iþQ9m_|篋UneVpy.TT7XܠmZe7Y+&R*Gtdq?ĈYz@c= wG .JՈ*KT5sc ?Wj:#jSCjqeA=Y[&j1br1k^!x[mY1=bHDDDDD-iȹC=$v0x FTI>ӈy"UR4@kV\=^ATw[8AT:x>ցb[{!puم~B !%L["n:#V_%`yAe{ss_YZɾl ,拂 x1@nʼ⌸aUK~0W-*ʥa[_^"*q35wj W{r=a {njqu݂d1(bHrSz:܄<2C{f ywcВI,$@e?nx[f*۫ؕU,Ir7U, YHbW?IKՐ4Re r-CJ|k$,dսYDhxù Sѣ`2$ľUג}UW^&cI Cd oD,i[jXmRi22`b]v<9gץ!^ HTмcyM$ 5G mF ;u`¦ڍ4 s[f$ôgFovl2kvg"k2vV7h$˱PZ i=[Qm!9@ u{BEuK=J&"rنsl C*'nTf#-ےlA ʹc"9Zֆ’4DM4S?Pl>YCοqfXgb&@z.#M`TQͿIDDDDD7qDۙtH &\ @șCd@ ɓ l'rA((Ѷ=M AE6aXi+({-AĨ<B"*Tk;yS9C X8&oE^J }wj+Cdmya,@'9huKcw6 'lFj#pr!""""0|0D{5~جPxٷz#dxGP]__Xن85K1מ_ںWJmpgE]G4lJl\hoT"` Usj[nm43QXS͍k(-H>T]vrF񗈈 H>㫦ilkE>Qv!wbZ, Eu!y[^,d.ӛve];pBV3:YiUOyp [u D DL njĽfJĮw@hOe"@+]XC]E;+MKgS yT>h:޺3?X2][675LDDDDt` FD,!rf@cC543KpP%VB7"}p+KP|86T^W"N*zJh5. qX^l_LN-oAmK 2q֭$C,V#kS,BP`DT(@ )m,!]`o9)H:\Uc&""""j'~D(ŎNբZ[-c@Z{^ }\.zѻv}\T CEӂŀB2K ~3[,krd1JTO5sYb8(~uOuP/1zz :7ATM 7['ZqϫjK\Լ3.7LWՃ9[ ΗK C6=X#!%'x n#zWo?d~9-(Fy-tz=A~J(J?"'kx% ?b4D CJ3 ɓ\qz3YyA4~Sl[ȥ^bxs:7v %z@jG"zn(TZLDDDD, @`""""""0;JvLDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDDLDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDD DDDDDDLDDDDDDt+ o+nI,-ݺu+*++Q\\|ԅR~iDDܙoՐ@t+|ݺu+AIn믱uV`""jv&""*++CݖC71эQ2ȞHAۨ3ϟnHA$B-y$H i(0ꑷ)Q8yW u|1P叐qH9'j8E:!!kx/ dJBૌDU1Ќ.1/Fޖl?˼XzOTu}@%Ӑ7XWC!sXRb>ɀO}h? 9%IFF"hą*AUjYW"z~޳C 1P93ӰFSW"?OsH<оGަ a A\z+{@.΂J |ED\HAX__>9kqO&描CVI2F G) 2j |GG"`s"l0$/FחH9QW|"<ðlK" o |Ŗ6+ӱn}  {0ǭz `}#1\vj^߆c̒-X;ON/nf x̞$&<8#D IDAT7 '1#1#12t}RoyLp {(FNY-zP<}) ~CDD7[nNAz*<|D |+smhe}P UP\Tmi'M J'F~i.G |%t D\$?$̌DDd#(}9/ %;f" |o F+;Ld$P!ljX~aPKF}ňx/TE7@VQ@j|TF-WQ2#gLQ6b@U߿ mp2v"{ I35ȼ?TI3|rs>r"kvO]˄b$͈Dj-WCb$CW< sb {% >L.CTd D炱zM$}" ތD`7u fW]}\]W{& |<Ѝ(ҍMO#Xn3a &;d+Dmb'{EPTH섲A4vZt&l+gOt!٘`GT 8<:EFYN 1pH9B=C e[m-~aЬ4}bo]l#<>~F)9u4[7r;/}llgG?%m>o?ھ_X{~?+tn^x=g?D;֑gXZ<<񏎳cox?/ǜ~vcB!n8gX#)Cև=b|v]BYVt:d="uIht|}8HAuaBU{anYue&&)/ 6Ӝ5D]BL⏕6DhNڍyk{Igǎ[ˎ_(h(N]iNgFSַ^\W[B5Hȑ|8@!{=%9$X&F?L_ x)h!/MM0e2d4'?0քZ}MiLh؝mVdφvz#)dڜ\u\Ny|J|z:${м`!/֊j|oUI+hU!m8o=1DXtp_g .+ y LS~R#^'n@h|Dh{%D86',7RpG^"FZp_rNU\Q6坳"&G`EGcvwNĩdAvNt]t0J.᨜r t=O._'<^vmYz?(4 d?~̛ygɣ3gΔ׾}'sgѾ_khB? 9k%/NyX>CqmsʥՄBܢ0`ǯIFNש``FL͎C+bF9O F:q ~r 611VJdMHĚ.qs#; >3 =JzNNm^$ a ˣoaZlԡRB>r"tR/Az,0@sp E<);, '- ]Rm8m:džH4M&>"7{<{s.z Qz:yOۥ3;sεNߞC'_흌|?d,пs4B-lȕ~w6p%z~U3y2 jMxnk(;ׇߝ%Z #^K1Z׀<>ň.z:qZ"8KbR~iE;if8YWeCvl]H嘍x^҉lxV8CRΤٲޏ'R;v{E!p0`w^JEvBϧ'C0c]n/-6ЬQ`sktҿ'FTDsOre8nN'glN| _!Sj=n!#y럣e[<:V%ݱ3~Ѹx;~<;< RW?_R:;{bl񯷯O_h~w6YiB!_ul%l/}"=k¸>qzFK1,%Dl̃=NZ:hY3^Ja3FcYE ta Xd y^m';Uku-gCz}}Aˎ8-xXtX v@$t̰5Ҹ^Y*N YϷӾ;U0Ilmgbfsѱ'X+U ׁw{=yt=턞Nbjn 5,Z!%=H;Nѳ;C>49kkW>MN)f^!z&ΧoE'g^Djw~|/l2l"c'0܎gA5 cѰQK,YW"`,\OY"*fn]AtO'/7ע8h?=K҄]T/j.M-"ߢ 6 v]˩GAoɽo?Zbi/}M%f 1u|OmE]ɾ%,\y$?O"oc5m1˘'䩧?/O !$zqkQ!n." ڎH+Bq5TBLzVUXӇ*!B!3Bq3hy-R=0BY`!U^^;wyr`!#I.'J5qYuo&ccc 0(//!g|! B!B!,B!B B!B B!B B!B B!B B!B B!B6?xWքB!B|͛ʕ+olB!_FeȁLb-3lvUC {h?X`}WKC0D`Οg}-`-5F'kiXLhE1'jiX襁@~VRy B\Q{?9 N8:>{q=RAB!p s a\%;KqgFRUaH^xL]NlY^C%DN94HbD['t;fc١0@Kdz-$c :oKCägc4C[]Iw=6 0@tM# w.)'gC͙|mβVvno^tg7f^6?ġO v;+#m;?{X㔬B!b) $Hx 1Pȓܑw쯕&?W BmN.~F }XJ^Bj'?jggmn)Xh |lk,Czr5p-v( ~"|f{ &_;v!Be`ZC?'vȂcĭ %z̫aBCև؁HwR-{2~Wk1n$ى,zfZnsي7 Յq4*41-cr6DhNKSKbR<|R}+`q?!K.g_ߥ-~6s!B1kלJ_&tq|sSaqo 8ƋbOgD&M67ƺ8CwLjV#mG;pi~,Ej"aF`|}lQ ^t6'q• .=~n" ,tYΉwO\+G9ٳљ3goJ !BYW|r&'턏y 0Zi`[o+0rF~o9C@LbtK80'H [d3ۅk npnx8E!e``bKY|rofs[J>9}{7qϯNp~22Mt򜝒K%B!+0nxևq4y7dvlwegn`2MCn3oX\^VQW:20PgزBx1Oΰ$$j%ӒZo Q١ qÝwxϯEk,~/_?dA=⳷w7RB!bfzH0Cs87p4?ߋZ/ EYbڈD*wxeoa$?Ot'䩧%矗*B5fT/?>Ko:u8-j5+lY!B!nئA~ýt"!B!B|n˫ZNvku y4m+$b6 Ð !B o^:M;$ ,ĵ*//w;P^^. (B!&ݦIn'|R*AܖfJo266iuAyy94B!`٤J_ JI!Bq;WRB!B!$B!B!$B!B!$B!B!$B!B!$B!B!$B!B!$B!B!$B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!B!yв2bIu|IFHҊʨ}ż.}Ք9# n>3@jB!+K5Ը c4UM-WUFce*pxxNx FƝ;U{W ?ðB!6ݱH?@{>JA+4_i :e276".j, /3+YR2vO !BHeeHa< ~gn9+}D۶8'c#0TDB9;'B!nNhNE%:=*ojiX0GH?vePq4l  аCAKTe)"k!9\:ΞV<2}4j(.. L Ԯ ZۀgY F.{+>gU5վvb汎YUMق)πI?*֑3ކfV6 ]^K+>3@ʾPU,p߃ U58 ,2۩uy|ȑZW:([ޅy6SkQts!< <<F-˿Cja ess]^?Z%;*{ D;!-"GROR j7XVMŷp,kw6IeU5w|'bd>J+=Y,Lbkkq}4CAO .LP/C,*ltcg?"G /Qf_- }nfl TU ej*zuC =j]"P16s^K{nP2j[XȒ|.DQK)O^b,Nwx!\lR:>)BUWu+LUU1_}Վ9,YUUU2̬TP6՝RSw8ׯ:ەoG;O7Tq)u]QTJ}PAKE?,#ۭה﵉UtۆJ;g\J_UR*4e7Uaۉŕ]*ݢ ͩ;lB=JٱTS'6LUt/nXjR[:Tb`H ܢVT+Qu~}A]iMSnv+otbwTjsc/˜K~5ylV'h2Ry%T\WNsJ\Bk;٩=ZS%JR['=MM^KnWi ;&|oPi;7> uN;\4vfJTrVTt^lԕw{n_a[$TPה!|\LBMtOG9SiUm5=h(c 轚rmMZ>kʵy3QtX_}}cVrgvvmB!LĹU|u}n//9~txxx`ǰ3x4NG@EI&Ly?ArxRV{ &|'7s:WQcy>,da gH~ 'iʼn~7Mw`AÊE2;f=qi:ueel6 ܂SyFo_ pYHo]obwkoD HNyxxq-ӹr~"}uK9/%Kĵ\c,2{e4W=PO[h;7=*{ A\/e h6ܙ"\̾4:_|NZ+ >+x IDAT1w3AN ɏZC~eswmW9khiX\܎ޅv&W<&?T6'nNh?#5V.YwjdL!sAa,rEcXBkDlϪ]O !B|EnWՅN}iho?OHlQ~'41-c!BC6DhNBRhY\ze3[df\:h&&S 6Ӝ!  :YL 9_칮,]Ct}e2 &`*=y+ kjs`ݨOs,9Quu}=S[T.HO@4y1sdJf^e`Kϙ&HhCOovɧP ~EhEhR/ZLí<1e7^Ÿdf_E[ٔL1ȼƞ8+u~weߚYDkmo ?I)9ȸ,/mrCŔy>;}\Xl'XS*UB! t(O>U܄O2݉lIx{p=j8'zu dgo $]1z6xHdos9 fnwZGӌ{$B+!t؊ݷN/Gf k|? 5Cа~GEP!n'KM*D u Z]PUZܥ2f_@h. ҏH}|mU~=l.01b/H zpooM[ i^c{"4tl?[]C{ _[U0I}sS?g#wӯ];Bqfxɠw޼y Xfg5wW@ό0ku ok% #Ѱmao=\x INY\cᲶA?וEk%Χknk'vz r&V<øU*jKwu-M|w-X`@.Ȕ1r:G^70gcuQD-NցڮB!OG?ǏG)0K,1c S؎e5gWUĶL.ҳsGD'oX5LLm7evqIKCgIN;70DhUTʒ&g\ز\,`'-sly:9ÍNj/ڡNGkI(H! ^O!-9\ĺ{=.N)@Fzk{/Y^ͦH'!gR$&2L1^ n(JŠ5)Yzkx$BU2ҁ͐,c cKfl4f\. I|sl2 ܁rmq%&x7dvlwbsu p 9-^'t,jsGdѿjЮB!7- ˩A׭~\W>v,T-uNe+R5uOR:^ j6uQaQVƠ 6>vfƕTAQFc|Sʻ:^]ӡJlsoGo>JAytTgPTUK]?=MneXR:jK^\>z[jAبRڹP {*>թ Vq58Z[U+|rTx iG)_VxUx`1[6?խ3@ .5n7>^ 3m=WSݩMm*Kiv (k>VG-*;FpTXҽn<ݡܕ/kltTT:=/eWZe4FR>^)>p*٦|KJos{P95Muß*u*թQڒ90zRDSBKewB]irPJU-ԩtքx5]K}ekUj-+ӍDhYy{_WSm{g-rA4jćj(U%U49F ]Rͩ/GFUneue,v+o}PE3R+ftmX<7a+}Rjhrjv>)Bf^Eqd?IT@86ϲ=ĶgEG͗B!F㪛o W嬽4z%_~Rc>B !B\5 zOýl W!WXX l끦v!B ׇuƣ_enB 葑_m}"*l$;}]xć1H?"A@!Öjj͙bOܱd,g[]pwTTYYKCTj =cU}-4q#gTFB!7}E O05bĎNZʂMcњ(u[knFҤ޿^!E`f*/QNRf\N" ܴſ-70D$Q֔BuO訿I20;Kۣs\S`:%0W oP- }ƏSsIإ- {0 ~xWTidz֬P@ ttOq5B!Hu!|&S|q*;v0]$?}Jϱ4K7$fAҖ5I`eA@IS?)dHuo\fGɝlc!;sXк;{SЗ>#Z`eIlEpY| Ԯ y#[37Ӱ@0@rb4jiP󬯥""є$- p>;t }V_- kC4xk 4!nW[2Z@0BL!jWkڋZq[HovA Ҍ|$H[hOs}#/hlstmiz\~&I!kx=ϘgI@~DfxB+k ڹɾqq_o`L?=Pnؓ>H1,[毚iX@(vy-ͯ=k(VC1W-:;}he}fM\t=Xmk}t}ʖ_z^yCyC]lNbtZKI*lh%oUPng/[66PsWe>lz?A u`+5DޛM϶"w0B`m=)"kc:Z.]!B\zUT1_UWȑ#jɒ% PUUU* }OgeӔ{mPT>MS-ACjT) 轚rmR ]*ail&GR9Q?ssNC{kXj\%tSJ)N:]9,{JuДq:ەoG鸟T>PmG/scP*˯Ts~ԩǨJ3:T.٢.ҪZs3U)bY'JseYVrU[.*UaR)kmC[tvsź묳+cM\f*ƹêe.xMC]JL\CSy+ݓ7 *=EUnʱ4UVJ?WluEo(C3TKNTGUR} *{UXVM֝]vN(Csj0Pm'ԸW&MMÛ TCS]>^ι u+4?7{߃Қ{:PA]STq5~2 5e_ӭ?UTCNU]Rsq_)ިORaetZT.Ut>h\ >Rh_nB!*qn1_w}ꦛ˿K?^ciKWX1/y;2x7.$p5lN.~F }X5\Bj'?jgln)Xh |8+6!=`rM,5p-v([|E& ʑ>z%Oۗ>s{9ҥH(;i}z .:~܁M~F%K3yGR)́FSG,XZpيuvS{\jW^ua=e$WzX_aWKRx<r?>{b$ׄK?/j5@$ ?󳏡݉6/~:7)b{rxօq^%שlWmW9khiX\܎ޅv&u-2w3A ߏ?$9y`Gq_v!Bq]nW`l;Ž F [=cbjЁR,1i-wRz-41oӳ㈏0-qR/EhQQ׺fk8heIE^s⸒킉)XfR9߉6qA:SX!g{H$ [f{H!Ή@=[ϗQ38%{} ݭx$5iy$jvacu_0ISm$&Hz78@3O`2Z1s.w;"=VF*e8h=D`q= F[}*KfccJ4Șp]ti{ө_]YǑ oJS41qa31M Ko[:MB!37o|x0$^㛛xMqom\$+FLmnuq{1(G%? v X烣)M~RG-{؜ W^uWEx:ݤ$&fP]d{'YX-oF=s E#˖cI&Y/}qb#Is A+*D^(x=I0 b^eac#S9q赸 $B&dkBxH*痹 -HnJ( t ʿn0c=^} mu!!7 r~i.]!Bܦ~#?Ra,Yrto㶁g}tw:[rogn/4 6G)/C+w+X  bOYYȰe]'+Z 5 5Vc.aI_Ilkٱ5 F\w^CDf:Οkk>F\':(m4 cd2Aj?3ir lxKf b,攸l~[a׸Y\c ^IۺX{&Eb"o$cMb̓@$|ʎsWh4L:&?ڑd)70$~Hÿ.p3@Fz{t85OrC5w:m*i0#w3I>sKKgY270DhlB!͖Zݪɥ}ms 7v>Ц>/hة:* e_VaGUneue,v+o}PEӣJVunm `Oyjgf\)Sʽ¯M~󩶽ٝ*PWZk:T&zUK)Ԩ:[6L)wK9?ܩZ^iWΥnkP}N̓/z]+ (^~ҕ}K|*}PSu.\U?-f3NtZ׭Uf5C LW!ʧձngWʿXSbq]+ 6tʩ/KӔ)dThJ[T&TtKi6 x~TP+Q 54>O n( * r-u+ű2R-i) ѢU(}_mcWyWUѫk:cN]v!BqY隷WQFHnl!1N̠eҳ#ˏ,z7L!˖QqRB!eT/?@-I$ķdJ̯(. FDQ ~B!׎M૨u #,p^FhWf T˄B!˰#D-iVH`"nr{{B!X|9tܛvҷIjB!B!, B!B A,wZq;&p,pQcTxY$uW#}R!B//CP1d `48sY#ݶ`>+uz|B!7o MwDIz։^Z}4 %E# P2@(؀Lo8vV6hXUfj*hx}2VR돐.gO+Gվf}5TWQvCXz&MjWm}#=mҳj_;wX{lAg@?{? NS ' 8T0aݓ zBC *lrkl lCI%&0iCMn$(@BG6զsr __ IDATx^纮AZYFvهpdC_Vd(`;t!t# ߡV45"W.hG0tfEً>8u^>_YA3A@b?#n;>f;CtMO!6pns&=vXOvu(rvߏB{ 1$.lo.ȁ78: ׾f4Y!Di!CF3-Ulav ]E:n[S[QgBbl/jhkZSJׇjnk͸Ɛ쀳"oǧ镚jBG#'`_gmC]bPVhT(e:lxnGߋ9DFѲs]t`g׶u|q2`8ru6`0 *KMb 5-y&jjjl62U9E{i<1C 7ZGDń,VI/4Ót>\n&u#Hbh^{8)H 4&/M=)iHP`?Gֳ3Ir YT |b }Q'J#ٲO}׭$`0 oR$wzVrҹ99rde}d#_ð ʂ)nk]J#ڔGrZ/͕s,Q/aN=Hu+/zq.XFrǛ!pL"yʴ{;"V7]d[Vgt_x`jN^IdY`Hѩ@j\R@ble$B`ݣ xFyv#޵Bmo+z愲q,}FV4dvnJJF r>;H>%'(2>aɢrbH ):F CGӢ$.FWijWJ}x>T* 0Jmfߊ}A-wc ײ򹙲]l/mA& z\e3úW/@{/m$"?6+t 0 lz jx2,V7oX\[/r Ƈ@Gؒ^7m `0.:wr*f;#Q`:tCGmPv4,gp OK Za#S%] pZ|p5f "&^# 0XĚAq/"$mXצb`lPn(sQ0ʲTY0Wĝf@ס5Q_ҽ&blj]}E ɫ@My9t~PQHϯz^aTd}BXi~0w, Rb C{,n߁bkQ6Dr\N +t ES]Ճ"<ƽ}3,eޮCݛKV |^}s)0G6yV?PU_̭Mu\'Q6ʱ `0^C^)[o׿nc^3vHS-*,p:\"|pWLgFls&K~1~'~!c|fXyM}j>1$ 2pp^gc{>JVnrMQ/,/.7"tE D jѺQ;G"Em*{z{]MID.4 7nnQte[5( șr@:pfd^AbOD`{9 -lKr@ yRy,Gց M= MI 4."-)M&H(o'l%7}6F}9|fs2  }_+Z࿔_@s\:xcH̽pE׾.tz9hdi:94gzP8F? 0k9 ^Y0A'p)N8lh?CJHkAtŃVah_T&wuCF~~*ֲmh !^m}]bl xO0lXd0 ' N9pwO12]&}HzQ!$׹M2Fy 7ʟd ~XM/R h'l_#M(gp[9p{'yqubZ i%xy!7=H8Vb}U0t+Gqxp0޴J/5/Yr{`nR vi1 }AL8X|S$|}g@<ݰ&X;:XA<+c2xHgʾJg0ߖGx[[/fXtx13g0 ' h 7}@k4MQ H7HFҋi\Z]=e_Nvx`C!oJإKi"@)Љ[+B8WhKU J7&tmCZO"R<#WmX/ w`/z1>B-Q0`0 YODZU?ԣgW}KY:8%8FW}pt¥<`zq7!uǧzp(4Ձvݪg.sp!;ZE ?[ TȿD1,;<)9}Ƴ 1̷nTeh jptAS˾r`m7vUEUۡ}D~cH%0z؅orOէ# o@GVEJt6T(aנM]Cz#4Ɩd8`WB(טC͇q6d[ oᐜ58Qb5A d- [ + ljns0J_H"4؎7<Z^SChWCHΤ:(eIC ѕ`u>GԽ ǧm{ؑBڊF:/+vC:d-.,[׫G'VͰN<EߩVnB;耫sΓ/ /Kq} ,ݏB{ 1$+Am_jzCu?\]]hg.rC8?s_]!֡8jcA&8g A׀: ÃPgn(_:Ќ7`Hew}P*0 M4yn_\y#Q\ҋv!v!iYe{]g0 砻/5-$Ы͛F Ɏtl8Y0%IZOq$/]c"1*=~ggHS57Nx4ï$EsSfhl,ZX?O$-,wd0Sw'+u$"yQB^/:e!{w)6 Nfr_OB\,)u5_H$NTJV%5ZPيđmY +2<;N'e"Ռ'S OV!RDPʗ;(u^h"Vu^"QY^}_#nPn̦N)GE:e! Nr*H;MIj“/-)Hj|w)%'ˑEY3e]zEV :j2[T|"O] ]#KP OOO3U|IH EJq ȭMkW3=ʎēC1{G}}!I 鳙uL{I\e 4uBBQCFm:`0?*KqnB[?۷Ksss8rT;py%ĿB:.?k$G& lV EKSY-H/`|nraT)χJ,p|y |ɴu^3ws[1Z!wW26呜&$2l,0ʙUA 4 u+F Db:#~5xeMUYTrfrƚR lcUl(ճ読\/(!_PS0@ 7VգB2]`MwFa.:dٶ%Y@6/I$Js 9,]vXPDQm]/m=PJ rO!{9"`L1s ]!Szώ4RwWė(w\BZ mJf)!.+zկDj_IgGRIЯ#pSByJNƭQxe}lҝj26A \Q"VnkhsBo8Fnƹ{ 68^ ]"z| ?zY `TNSELceK^Z3N 2B䪾u`0^TV}_ m@hv1Tۀg>*'ѿqCVS̰x<cp Z #x!B9 t m ϻ , H|@䎁ztص"uLCCס:"580P,0o&zZԡ? } ``i[o'6={]B< H@ͅV/ɉ`\GTnAaR2({CVrӇK~nj@bE :ǐ,͸/!w%3q?a9<66nmg<^ 8Cr^Z <!Ix >q `bG>$2E~8~("Aîuuzb -b_h27f?P_o}#@<'a]F.~p9Z J?(ܟjھo'.u0\mHI4z7mFr/4G@%-ۤC!b.mfI `0Xmz-]׿{p}G G&YU`;A+ 8"#M"uq nD.LR7 N$G`K9;(+HLޓ0LLGn^,5,Q"[1Ԥ@ص$ Ɛs@gR^2B;c|+C?1T^rW"q)t m*۪ғ|~,!0WV"y^ZWDsT ㉑ "v=Mnˆ]V~77Pl>c|9_KS"mV;ޤ!>VR:1ʨĵ~+¸׎`:76 do1|FC=G%s}[^LǹW6!#\{ZOO3 }= IDATm޷z X/oA%jE5 X@a )L#w-좁& #H]BCb@.޶x%;A!hǁ[h]"DHC .2= K^W}jfQ!`wɀ] Bgk_sT(-%~,J1ey$}}(Qy ΧF]2/q %/e  ^[ cH;pc!(Ж꬗/!悭DEAdkR^;ᯞ 4Aq(T0/B*琛ُ{."~o3$E#_q"DmqQ#~iD| Bi (_g0 W7ܾ}D9=wnL}]5-Jףέ̀ IΥ_aSqvL:"ghׁ7ȁo4e5-TM9 _֯AjZRC rPDXejB_|~)jWw#@u]cy?!#8?"]qJl5â^GI_}P irN(x^5|GdioǙa8z ҳ;Zd8Q^N Ws0a,$Q*o8ԡ|_$*s<~J$U$B>rnq:ؿK5`df`pW^If w-lDI[VN(ؿ+e.\IAS!q熴CLwBND۟Z߹`6dߡAۛCjn1{4hϡ`qPi 14 #tn{,kS/"s5F zG!o@)B3yd]ِWeP[\7%M ^DʉH_(xD!W!G&ic4bdHSIIR;Q> b7]ɧ"4S 'wA KM(sCF<=$^ Hzmj~1%+:|]T]eOHDRJjDRȲm0Br Mhk;*r9?E|&NU;5NSKNH٬3yE'kƧOg%J$u?Vu)YݟR}oVL"IF(X2?C2I }e &F3 SdMGw|@UǞ uď{;HGeӟ#t~>%yڎxw]̓ `0^%bOOg-۪&ǜp&6af0~ja~2 `vDP* o֥צE1~V1Bw&`0 3>O8BJ$,e0~0)0 `jl;1L `0 [3 `0 ?>1hPw8 7ð/>'7GziGi?pLc `0X!  SjG͉џ^R7sW3~w{p&,!!@z w'I# ~Ǿw dP `0?8鎁i'|R?*=Կt%UYou ?b+V"fQGd|$`0  I_y\^R2qk$cL2_YU?0mabl`0 5号ģH}@aߛd(+@(e58%(o, .hvr>8:R]pw(j\C8?sr. nChF݁1CGq?`mLJߌ¹{v)W)f!ԃ1xġk:R5<E.Qhoa?>䒽]%q9FG׌7`7Z:-$1z;h09 ؎K9thTmwk4acj+CH,%O u UXwj_0Z{wpV4RSM]H|Ds]l@mQw}W 훪C,BGpp{1q;ިC:ZbO5 _YL6/Uuڡ}Gnq=n& `0^%uIl&^57oޤ6@MMMf\FJ"BH~/'fh')+uɼHi/YZ<4UAB&t"z#URN8-.}P'۹ J|G2O4őx,F"z2Kq4VP'˩~G}~v6l Իq}r&=0N3U-ԓ%($RqS'(FӋU4RaRv ^*!)b}?ZWytpd0|mUd(Ƒ͜N,]х5B eP K4sF\JrO(2mnO\Uq::IMI\ߓ zv<~ t){c0:HKQu_;ZH]] 3dHV (vcZ4xJ\χJxF)ͬ[5qA`ZVR@>7S+ -dPρkQ`pfXwVp岍$WTgf呛Nc1]/A5# [RVƃŪ keSXn!r[m`0 V~NCE B bgd8J ]n舜֠ jЎ,0siIax_+~ A aRACס suWA٤CkD&X30CX|DXZ t[ jԭe.XYvܗJ4[\^0 :&k]C$BlڞMZhrA=` y5Q}}vb|{:`6:4ס6= w_]:BXhk>=/@;?F.4"?[uVJ[, ahC~o;Vc-j߆P+0q@|ۉőߚ.UhzPC߸o,[u{sӊϫo>_F9A ׁoG꫃)_4P$}ކ^9Q`0 kk7Ey뭷w_mL«z[|z EVy`ZZB"}9 8"#M"u$y`5X/5_?slCl+B͠'w:DAns ,y ѐ~χQ MIC ABtJs+.;H>o>m5ox nD.LR7/i`;AYzdZZ5q<p\PBua/29^[#qNJOHL@7Wh`0^~9}뭷oqtY.n:5~xX{=BX@a )L#w-%qUmy䫓p=˫en"r6k>#w·Zqӱ[M"ZwBvZ< ~(S#7Pe=}Wo )0&V-< UQxG! +vi?:@J!,\zu5g{8|![fn4_}` %pMGx;fuEfmB6@C 늝Xa]o}$B=AnSϫW`0 7ܾ}D9m "Yl_a?WW\tφIs'W&hscǁ%VLmo岳ch:!6 OFWe 6MԵŶǂLbx.gFc{~8K.Aplm \Bs fJ_t@jz^7V<u˙8҉GW(RE+)}*gY?w}W,=.XcWU^aˀR1 i%(0rYd 9s ҍ 0g.xX}v}+e9^(Q_ sVu v(=<_":g`ٞ ֹӭP61,"W^1e(~W`0ׅ- 3*m$()$w>7*  tYHha#&AHSIHRHD)鲑ԣ/Q1C3*YyL$J$H$d%m- MLi!h#Otf̮(o#QHk%[Bumt8=NGD4K}"$a_"Hn}6BbYSg6$X%|FF"eλIIWH}>S~[1& )Ӕ^[txA$;22Sm'G`!K#V.gMhOջp(iV![#OBDoz])*)]ɧ" ![#H TL{/Ge{InD#r"B3O::D {A\&uZYX?<{xEPy4F(xB<Ǔ!笗F,=m>ZZ:DN~.WEPqdPNfR8P18*H1EGl$ <{m$uH֒軺Y vVgtߪMOf(LI $Qqzl cɮjyl`0 p^П>{=`.`>#" .e})̅>/6gHԐ=I`0 c3ͻ?MhcS,6{/k)UW| y ~ `0 (] !\i;s;vYK8GcRo0s2  Ao7A釯a(9)C+ 밣AC|q u̅֡|C01tDԹjŎ7`#S K` o@AѺ\<}˃G"z>Ϟ 0 ``Ӄ2z0k24BrCk_57$^To w= M(gp[9p{8d ;|}=?r<7¯J7H"z@<6E=0úyŋKH?maAD8?49~t32;D{ɭİY$!z S6 `0x. rw <=,]G֦nzX@1o=`MF48E/Íka\wǐ{dhohBBqKulFxގJCDr:K_Q/̷F1|&'E0L `0,~f)'p-تEQ˳,BGpp#WW}pt¥<`zq7!uǧzp(4Ձvݪ\~Cv@jD1,;<)9}Ƴ!n oῘC[7\G'qMq.ʁC؁VeɇrW}pnyqO!1a9c# o@GVEJt6T(aנM]Cz#4Ɩd8`WB(טC͇xa1M?ڠv8?J.1i vuu hUUj /9R5 ~p%(¸C}/uh>XVьCo!hԽ54Ϫ!z wm ǿ{1 BLr l\dZD H Q6:]vco6/rrvZ;jKhfb.bZ2^ٳ@|<if<yn{p+>kv -+2]:"/}/#qqaj@'+"?>&_Γ]u \~OF?GebG3,sn{BSph (7myGScSYW:4l1b'ImOS$1t[/"""=}v3Z5߶ϛ6VS*|#~Ř+MgS7V]5\m,>VYXc~gwc)lБ)c̙?d7^Z61b~^q3x\ESIDATfHc[fv=f1\1l|i+fpeNo sMK?1Qkƿܯbv;YL]71c3sDܦmF;^݆~3~dꕐ6s_cѰ4 .F;_7ɛc?X+1uer}Ҥ7K93ې7bYƿ&k=&}h+qs{61w͘#ac[!+圙) Ȫ[շ1&7o>1ϙ7}KA6 ۶a_3Ǎ5iƾ07ηj?""""5O>yz_qRgzz{}/K[V8abD@䛽^ #}A:B6 Tg֘7D;l`ڌGMcf Y,u{@h<\[5+H`%ic}cܾy4<_c}Y#|wq]l, guJq4.8(k{1׿XOzO۳w$'nޱ[Xt%7DMɓ=ad_'R8LmI=!j?? x~B(,Lpeuҽ"Aڮ( ؀|ADz$rܖm)jX2Z;͗(M))&q9%v:G.tc{U2"1N2-lgCa d:Yܨf H1wLv ݧ h,ýRgt0CdG'.:6ڄw\w#(Q\'Ctt^^yylLP&w|KpHx/ڢws[]-ڗb^_n6]Q@5OEtw EDDDG;Z`jb]Izv?>̐:<ԩ%H`];Oug%̶,0_`2Dri$H.P~cDt{6aO/L4/&NvpډZ@9?@G#hX4sԶ4-W˫?P<uԂcW(:''\r){U&eQ>x/dFؗ LO3zUfd.zx3$]t wҾ5A֗$wq޶\A]4'L7Q'{V|'s7]`DZ;E*^;y?cYzHEX o%wt˵?FMGT11//D,z =3LLd8YZxͣ|:YVGolhbmsۻ'sŻZ$Fjư\BWL5Baڣr!o5KH#tCCkP9h]tmism&ϧ 4zeFg(yo$U9BEcx3_αU[YJ"͹% 0NDD9ozJwΤ`{dyݙIRx\&Ϊ[s0d;϶[?RSfm4uuvO[ȥlթ\ n{K5EI1p[+^RƟqk:PXjWr&n1C'ܻrlJ]VN{c{t<~Ogg'F;b#4|_31ϭ<ί\|MǿH5H VחQݷ=|A"hyqWi]Ϳ)sx}wZkM{7& J張nSu* 6x Eu."Ҩ`vD& HkENf m1UXn?2{ 7ZƇ\Vl$u^yE]X "{Uaf  d_5;Lwz O]O^K@Da#h}Hs]?y|wt .<5c4u~Bg%XeK)E @D\EGeq**bLY )Ҵr݅:-يybYSyrEU0Q'HzK|SK@חvj_oU_x">EsbVΉQW"rfu"4ԙ4LK y-Vqߖx"T2 Zc[zSg:ڲ2LkO>Y>^vp_A_O :hȷ{G=AOi˿pGw*e5'n찥/4fzG A1A ƈDs?rlC^F)  l,Nn۶-6CnZ2&"X{ݮn4*95D@$E2w`bt<<'sY:[O䁱SY&? xC`T‚deLN6yK [;;mV~2Nnyi WnTe7.7Q^9\ 1TBSo-ɷjZV˯Ll(i8֊}PbI-+%fi噎0aj|T{uErM n*ߪjS좬\U2A>M+4N.n',Wk~dP/ln44fbƍ Mq/*0Wq wH=5oٴ`ld]x' U%o7Y=""ylZS(C/T ݗ4QΝ?QɸعUX0oŒ9okaU ^{iuIقeO T\No4۰ӵ̤4b.@7#ruscJ l12ŝ8Rh9"bdi9'Ǚk*trNvzHKU&4UIpܬjy})=)jB 'x笈Ή]z+D?3r9NX&?lCvF!dwOz%sl"oKlt56Tח妢)Fr5SI+-M='[WiWmРfc۱7LZ~K,#S2_q& #D=yrztYm%0Eh~xknz||}^;O$ZY3?gQ6vlstlX:dZ\{mu[;hK9S~I7t[q~U'X(Wd,IZ[TQc$4lk6VzJ9KWUrVW7"zSDķg5 D*bRm=9d98;,5js8EJDc֧JusU`&?z/% Î,eH_9?ǏjZBWݿ|(FniyD{?f]bBH8C?(""Jc*W:ΗnEWEd:g0qڼ e v_#K3S14lT(jSr ^Z[]驡]TӒ,[k %i*muV":bMvQ:2-' `ZM|!ww{wl W&ɧalG/tW^G/x)"/_ö}Ǵ{H 6㵷GzFM=5;n+x&V6rrZdT1fn&gBQuJ6K'S *WuqMOW'Z伵nS!/hM+)99 M%dL^Ma^ӘiuYaUL5Q+-+L WUluIdt}1Yw> $YZ(!ΣTqxCC"VT^NƩsVy~oDݯKww~Bb9+̤gqVcQ^nAI>4th%o*߶M&SX{%Ң4VQg(k?UciQTTu'xUvy:Xj3t%y*u+<6p09q 1~k3@謫k2 `klqM>]XDh3tZcC`4M.Xk6Y.n3Y*MrHpYI:++%`./j{<.t{~iCy}eZ>ko-iR"bdYd/:ܶ_$&q/( t8_^ʳ6fPeRe=^\:8 N֋NjeUYfigˉj2Ҕnjl[7$L-CD*>\]j[kXNfm:yGMYMkm5ە:=\Frr5۳mL 9eXD͉;l ,w"'"Dc@$"漧^+XF%fu[zƮqm.""Jz;]9͟6ejrI6FB?XVLm5p*hOyBP 1D$AbDBOmR|s̠`hE_/MKذh EF[نmN{nu-U$+٘e[3&7-?+W wuL .U)䮷VΉ$(W)b$IEuI]; pvn*va53'f{V^mjL:L'O<~8\ 1T+u$b0z)8ng5&Cfa^a,Mզ,_1+h}Н.X_wZe䡷VeKwE4zgW$m.3k sWܱfw#> C}ȕ]73 S(C39=ЏÞ.37S˶CGv˔Ę_QVW@ "N., +q$ l{zb}y]QJ MD{6"rm-+ s+ YpY,l\9?9Z{}U?c}zhryӘݍs![v.UvQyz1xi/Rc?g.,˗KX~j0w ،܂p:[j}Y]V9nr+/n5^Wk[xfci ?X$nsOAX*2kXh,w `HHH%K]9E=ͯ>ruUP٨ϸZ*YvMl}G?:o4=rm1gFpkư"Cm*pYBp   Ug:? ~-KQ4:n(9eC=]mϒfwg{:X,~sp]{&J*csp4$ MRX|Msҥw߳r?5G.yѱgwvPdFӷq4\#yc@z͋w%."6%lLQ7̋5+"(9FF#oFD谯]T1#!!U6D yyy~ ?lLg8W0`h7^3yIwu'VZgs+ZW ڰug[%ז׭OjI&滃e.\MX`2$"Y|?;X}ݍfwxu6it:Y)qTY MNa~I) :)\is*l CȽkb։޾+- &ܪa(r:R 6TJ.xX`l0{Ui˻M vI-6[|rcrcgZ:;DbMvQ:mR  c/9k 5vU:-i23tɽ{.^Φԕhu*ScϴuɁ䬩E}nk6yԋn|q.0 ,]~\zfs˲r"SO~u'o6I\%KKU•쑥V퓦|VZWcO[:Xz&n:(WQY\fd"$rB4nzrwNmm81en[\hwMM9b |sOKw=^:}UԘ3ӳ*v-u .k5N9=Di6Yr+zU]l=-EZѴ x6eќ3`w庍9Vk'@l ViXܹ\W#h%V%)3G#A?#b@8oXph#$}`T‚deL牟y}blwy\!&OD>&RƐ]8[~Q&? x]¹7X6nlwv۬K IDATܭƎr}a^2Ӹ:9=_mXrokpuf ;'*xnVɬ-^A Rӓ^bwZ:suZF,S)8F!aj5 ^31OɗvfKG؎o  ~O5 L>[Ti6,-Re[:'|EUX^%gʲ:%+96I_Hhfdtnڜ\h+ ]oԭ%vYOOaZ>IVdYFɦG4m86yA_ޖq莸m5W һ_ /äJXcvY3ƶg:FMǙ&M1d~؟/|*vi=aqА"fƶ8\f|8S$( 7424%@@@t bq}iͯշB ΦmCPa_? p 恰%wiD"~puǮn_%l HgwQ ._pE"@w?0y8py?ퟒξq;X_Pü]SۿdG\~"yɄhpS;Ʀ.W.Z1{}mC7f*nDږk;iY<;E/藽K~Žtxjs^(|uH-]!4E?"̮&Iqr'x$լ;?00#6=aͽ0u|owOKV>MtxJ3xRr%7z;5brCqJ}vs pΑ"F$"kdPh_%~.h7f//X+]$ё5 SD3$88e-c};5>d ~&{ל"11b 9(;"fH#/9/Zˈ^0GyGۡgj|k""re.G_wro쪔zKpղYچxA rit>m8QUܶO77r^L=׭2<3f}ƌݳNCĈ9NL^We}ڧ'ӓQGm8?.!:W`wrwpJvw{?}1HDw%ݞ"gnf'93k~>Wع/g^l˙ EjODy닪1ؼ\#1G0أ񫛺~Q#}"/nŻCM=~c OOabW-dHkz˽GIM=#!_ȝM_`bK 5>)BMw&>@zDD9x? scҕ3bbyG=rOc#5F:w+=<% us]~/"2ބ'~?V;|}v&|uj]qu͹% ^|.yD,囖×PS盵A"r{?8+޿lwm:H swI|$vD ? ;ޖ!x Fl1Oi%C/Rj;D(<L9.J{1O<3߀緡 o=aFӜDOIJR L,g77?zChAAiBK͹"M~]EЎClj_nyP/Vy<{sn=us9E$S0)\yM\ퟖ֙yJ:R4u"p~z91a1SD$r5τ—cC8݊uAWƾn)6u91D$qANzOY3 O?+AH\1//#z {xKB{Gnozy7j)F_,an[}NlXܹ̔T!=:XpQ<ԫx9}ox#fGGD{hDyC7nꙴD&HLd"%6~)|8A!^$]>.LuI@nvWd2Kt=JuON\DqkGG%)Tgs4,Iь+N>{^ւ3$rFt,rƇr{p1W%rc}`y1""Lh^tpV1a'R8H)ʟcw$<|3{h1<*JP/ _X{(0fG4oEΗ.;~KdaҨ-xb%Գs\cE+9i_}D4ti0ȬՑ'ȿ."oyOs#O "o^- FzaQ!};f6T9|j Q}i@`[ޤ=F]-&uaҢu/hÈOm~}_]N~xO>Ƌ9߼E|_Gs$t"KRoD~y[w#O~Oˏ6F}O&NCڃD&ww,O&h""A8{ziᶱ}]e4Lq)sӳ\$yCl ]#u]9P?I9yzji~yycM/sϹ=qa`ෛ)NJb z܁M?jjg?z6c˳ӹY0|.Œil>_oawYG^sƬ>F7C`O?Qvtkv0=pZmfFyػݸ(Ep FR]F  ѪRj-A!¦uIjNCOooB.]%}14}Z-7_J9KWUrVW7""PNKh64H"v:s3U!"k i1,ljLLzrݰ{42GG4xfO4cCGIzCKDtwG_tӿiczqν9js~? <0uD0vzKDaZ+6E\^\Pᕯ+,Koh X[Lv//:R"?]^T\\.]f*t]l,8]~QI)_>я*ܘ#n,w:!oX͋8䆈DDt饶&U_pk["QcG;rv3/ شO|)|b{U L7Efcհt?c~#z,r&sK>!, nd(elx`[G[=&&wmD{ =ӊ:q$\({gpTDWrR>:v~2z[k*ZޣfIii?g.i)nLw7sH$q#o~:1ŦyONSql\]nlL^)6۵)Jw[zn ]^ l2϶;v&&Y:>Z)\yYZieQ۾5ievNS@DE[8%.Dm6m\>SQHZTnPXˌV89PZ-,kl. kU`ޣiq'];.J\x=D$2ǚr;Q{~qiHgJMZ|kkܨ$]?#n{"$WO̿aJrmtFRd9knNL:@`toi=61<LlըcVg14*Ќ2v|c ;>w77ůY}}KƆj田'ð,:jUX8?g/9;F7/|y-9Wi߱5~6㇯ܰJ !UNpQ'jN]t'0bLM/aL%FLCcT!=:XpQ<4#D8^0;y3(r,wiq?4D ngp4iCWjܻ>p]Ӆ6KJ;,eu0Zlژ.Te![.k%Th5TЀBD ƗvꝞk| y~RI/voVݹpk{C/4p?6˟씦9yH`qQ+̌ik\z2QI~mvg5Rv׉I-6fjLsWѬЉw8Wǂf#U t8Nw/ g$QUiA K>0p|-zh(\j#ǎ9FDr t/Kt>1h&J<pNjCu}Znz;aTkK֛fl٤bMSյfl~J\^8%MEu-{NS >N:Ox۬-nZ 52}~n,(j|1Ca?V3?:߸٧(yö<"f2iTx뽚]'HV^%Wx<Ɗs+3K݋ZL{`EAo_H5iGvZЧeyCVJUŘ$"jۜ[0jm!Gڭ m1BC~Zvk.%9D]hMe""Zo2'ݕ6Z""Yj!_gjSubٛz[e8+G\VXeNQ Ų_oM>G_M %銼jzF b?Aё= _wkួ2[,=+;}{^/VHTKf wqq}^$/~t%;__@8wirEhԧ\cv/[$ϯ@`*̬"Bq EֆBgKM2&=oSҢ4o}E-SXa Ll[ 5'R`ɬ LQ?90CYUI nCIgb=+秛mJ:c9YZSѤ IDATj).k@0+VJL5<2++wcym%.Kٝ{L%V<؟> gv|fuܓHw]Dy[r/ؒ[֏ɹN^tON5IFtlmt]΂y}; >yfo4f[n{Es\}}V7vyDdžv_&>>?|SpjsyWy_HSe5VmdUfjkE N֋o D䩫+3t'+k" t6{n~Fk؛cD7E5"u+_6_:h6%FKw~ei'O yIq&Ժ9DRڽ K,_͘zo#׽=)'qLzѽzk{2RcxEDZQX6RDtM4wlmK繇bB»:&~`\^VSHV1˶fL@9?8c n-z ޽EUf@fD&xL\ \\-.حpw%wmfVZAQnIhƥAffa33P@SP(/_pΙ9s:s>\ǍH^DznZ;ƶ=Mr6d7tLXSpn  3:0Lѽ^{{i[J3n=HEN"bƎt0氈d\nк]Vlry 9kisB[slرcc?:-~3Ũ>^~? `ե/teh!""Nm(^Дt>Hη*rjH%rg>i^soxL0gk,1 C􃆈H f gnP}KḎt^59,!\*g!DO7&9:x^c蜞%0˘]Znwq]n7_HtD}.MZ$"kjyQfٍg4#35$Qq+9* r8`iI{Fs&vjܕKH\<|x|n-W ;)'sS33?X뷚 >dng8/nMA=9K(/)ֽGlDTwDx郞^{e C ]: Yшh{"wֵ7nМ錦È:أ=DV6R|nRেF-w^w 9Sʓ_c_$rc,bofj23S#jQ2&mT0{at?C~w,y$Cܕ^B2+:+?N{w I:~;?(is^3qpa.V'-X@)[;cIV-{ѮF'l<|n~XK>=jT"r9vdtL>%R#I}PI3 [6l(n4 ӓLoA/^`S}]ǏBƳ5nŲ.v)=ޗ| n*pYNX(|j`Cnj&'N;Ο ɉj""26gEgLܠ*! ^|ҟSxRKD,=p kr DDEɛ yeh/!cRfS{kIJ%) /2m?l3[r[#LJ=3L"E"Q㉈T s XfK[sji[9m_F1䁛h{5Dy*Vv3.+4rg=YNg.ߗKĸKe&<2)eiᵕnNX{ZBxRU+ 78`: 4W^늻8vIC^26fQtҒ$/NN Fd$ȋIPqIלh W,$7g&+ eڞll֪^yE9ӭn~=|jn\f ގ:c:,ȫDe'Ĵ)% !^Z֠*)*E(.=YP[PKD¬XE seNVR+[ɟr͇'*xGF~Z]Qt4~dJ ӛ6ɂBt5MM~zה.8`9}1 ~QdM{lg~ $ Vdm8*c׌S%,S}l!ޠSk ܗM*1z]mǓZE}ԿXXK ujv_"" RH fvYzݏx܋ĸ8aqc#6ƅH11eёS&m۫a >ҪHpj{Aō;E bصKUw)Ƚ:RHK"bs6T2'8ϒ[xJ13_ S%IT)m9vy/DXvVe ypº5}_6G* ^<ҫ$_9HL CYWtigMrvL)*<_*%MtBWPLfLR2ع8Av9 1o.#ۄ^Vg{5' }8m!w~/Dn,E,XmuLMf;|z8漱aWj{yEEs&z`+K%IYiIU_v8DKʼSAI|KO0&&m#BFWq:*[^bla{#/f'oEV}C2RMr9=%ۖC5Nb ւ4}핤\]E.J?eBOrY1Sdk1U=T\c}KHQʫ5Pgk9#_YH]S1G(ySleҝNڜ&-Ւ#ٶ<:W}௞'WlMfFOVjr~rr5}0,OL\>35_!i(MO9v#^[2#D2Ҕ7J?0E2\{!>W_ޏgbi7e 7yN!]49}Y:O17^]秵;p'$ӣFH%"wjGMqMwVnto-bZl]/^;w> ,}*T@Phx8xY9/j*.ܐ^tBD?[KDD_.XNDik XfK[_j/qAlFm9D@b7 FWCJENo9Z]x[[Qf-nh 9~z"\|99*=tիeG .;g$/RAV"D$n"逎I)KSok r2;jMVf\'%/M HXICS\ݍ>.!=YQ!sf߸RS3 [NDℴqKӓ6Uq) iĿ?-YBtk+{O-^x[4O}qn]hB%' ,ZRY((a4s;ÝлujNs֦ݧsBsõ7Wj-`#EQ‚J֠*)ܐg %%"{ KjZ0G;-oTfd/7J,HQ%^+ "EƆ6 J)~ \uh skp`YA#_$RDylC :z͂.K8B 7\]_Vҹ$T^?˴-JXӕl!W5՚ڧYju .e:/77X#&Yr:?Yu;E&'޽"1.0f'xDd>57%䁫/@kݮUQW\;MWx#}85ѽ F")=626q\}k jy\}fS \!w۰Y=SO=CiE$td{9- k7BqeOnYѦ;w t oVr|^.w74=WL I]5[Wp4*Ԯ\4]!d\YD"pu@N/eUnH8,m0{_"b Nȵ)izJ<sy\|kAv9r~ڳ2,T1cï,Q@h13u6핹Ȅ) E7^89rfrB& DD29I3bYhTJb0)\aR7rTtKͥcdzx+n;Zh}K.TSfD""'N^8dž||JDö:5׽ӻ 0p``Ny;k n&,/1y00h3EDnA݃SGZa]VO̺ʍ'ϖ2=f4_gHV'-X@)[;N+QrO}aS~7PϽid]es|G<6+,IRȝڑG1ǦJ//ɶno-#vy 2f3'Dğvq_S[Xpćl<\^$j$wjwΨ{o'ˮ/PeU 62阀a,EE?|Xi͞pb :F : F X>Vpt犽e7[Mq3ebVה}Wy36p'e7Mcf/}(mv(GGж]įny(jWr/x,sbrBobܬsp%^,P#/NB簚;[+/^=~|`υ+.n4'Q"7ٖhk9SD4x>y.6"ܐ56jYS t@23X$qsjp|7WLk;v\c=3{ǘqH.9ћ[+23SfojW,FPUt'gκw`|R)}+YWuo0K'h_.M"/d'x[6SNikr-mQPqyuk[/"hT^nl[ƾ4(/ے#{3/>ƅ87:1KzMƲW͙ s<):gUYj~:zƆY |[a/ AGdQDTv#inYfxν1D@VMUqc۱ ? fadTIDDx91\rMo][rb<69Z Uk>Ϝ9K&<]EŻJ[̺q}dp{uH[8M<7E5yavEoy:}!a?<<w>v?% 5B*U;2h1ebTĝE-z垝'PwTಜձjQn3#b3W$b;QwX`4ʽ"~xp< g,bI3Qw\" Xg 0XF-M5GEpnlQpC;Րb܉~,T9ݐE6+TjM5Ee` nLl&_L\n y3Xn0-x~,["O,rȩ>Yc''6TP \~+h|[ u?-lJT;i֔ԄwV T   $|zDsVܣi,aݖ4r&:,AuZ>5ҝ_:W0pgFܫ!wN |Y9-y~TVeDmyȭ/SQw[+dTSbPw[I2 pIh`kz[M/D,H Y%Vdn r? ܩy@2>.>ح dDu?-W1:=nE.rpw*@@@5pu\5u0-W#^fLm~ͺ^飇=$B@DDbc'ecOy~#

{)kԫ~u'G6o=jT"r9vd\# ,fj9VTT}-XDy6e7IķT/.D!aٚOvvoXFS]E͕m׫~k/6!b"m/?+ Qϕ) vf[%"Wr8̄Eyq̵Mi9Z""٢Mq2qt1)?Oϩ\g \#-IWxla¬JDYdRa!5W((*Ig|=/"7ODHؘkX/2[r]fD Ru)2=ԇn6v.s'{M첟'gȰί>ek|RtoKa1i>ifϟjl>pbjjnqs@6CQc %;Mz^Bݪ;MZvza _ԾfYmY{-3bqh[ ݎm X =]O#;^ZjqQ~sh,:8{m>SD0U6{!^^V}dŠ UvRe1yj{c}ܢq /-$2Ttju $I "FWh5QؗHE/5u|Bۯ/)$\M3,|KHtGb+cDDAܲM-v"rݻ49rǟAC}PrzIz܃LK|HRq=  f%{uYґ<80D^-m9$+zߙ'8ϒ[qo& cc}?'Wǿ7RzLΩ:Ypei0/eQ3[zӒX}UH QX2;~\7^ϫ,VP&P_aZb"bKg/ 3$,xHKLrQ2qh\0.ͶI^Θ%x˥ۏaOfb:l1KLnƯ \rMon]&$J\ЉSz6yCE'񸄌EmΎZ |FkV}Wrp3Rl=%oLZ_ʼn\ZrS{:ۖg}\1˯5x?V~A{-?x[O\~H/Gvq_ט[V/)~ޫLgn+}0,OL\>35_!i(MO9h#^[2#D2Ҕ7J?0E2\3zdz[Jr) f4ŤwjϽ\;bcYfG;qx<^ށ0wTkII^B]_u*+5u9ۣ/)),b>Ig}r+;~/p(ʌҺ}`pw*@@]y?_^-2daȳ_FɛUooyɋdZ6ޜ M06׭>x1jt ^[ڸ<I,0ܾ~%'v[J XԁFs>2~ 8F>hcTyC_,yżϜOڶ`љZpZG\8rgÆ@AvƯ95;@XQ#;Y#s SȤVjuBj=^jYn-b_*5P}nҙC_Wa~n~Owa`K(J]PNಜձjQ̝ݟĒ>}t{j V$au@ZxDu4%ށ26-[$h^yDTWVċ>x1VEpʢ\G̥愈H:inHuʼ*qR'DzINY3ʎ )$FKyz7=$!"R~?[KDD_.XNDik DDMm:v'߹sJo>oW|CaTi 9kXfK[w23n qB"bv}"=OJDD.`|m`LDҚiD\jמOmy菹)FQd9oi¨fSg9|K'"uxٌ-DbtT/}9x'~ҹBؼ{k-ՙN"O'_S|6so=j.9&Jݐ2yΕq1Y Kny?,}8_!KUٷm0 vvds! ǿ礣7hU &5;g$/RAV"D$n"逎I)KSok r2;jMVf\'%/M HXICSGջ|B)"j"e/D翶"뎈ҞY-HLϏ\HrĜDDt)gg$ؘ\2?=!&4g{9|2mK{ss4SN^U,}ti{)"Ҳb;R_=ΜDDt-IL~fhF%kKs^^c^:ٴDqȣVLX/[3)3o 9k$ԓ(r=o.}^FW/2T']H͞furnjSi{QtPGƊH#ɯ~qGz]wSV>klâ?rxH}o4w CWkٱD;jUVCwmxuZSE:}DCD^ oJU= k&]>\pxma%};%nN-']?%%lޱHS}pȅޭOmBDUY|:-O\%"Km\g.dTډH[!o܆Q"rkfOIPpKEdrCNn1#+rr{W~EaZ"]rc#s+PUU xq]>˗Cv""j`in'&%|ZKDt!cȜHY%5(ieFGU|L+gh!ACGYeiGHtݗW%rW9]5>nQ8ܗmd _Ai50AC|C_O2ثp3f"a۹ {u R 掉ͮjf3ۈiv1 j|ǿejm}ڴJG\4 @$UuUnjL<`慹zm?W=OX~.7j]lmehTخi<?rsMg]k9of` '9 r]. B{B΄u=Ooc\.^{>0"GdU_09brݚ8Uo|d!jS:DD؇S N.n)҃.o#si3@տXZ–=r~""FˠVa/VRz7G\:6|;dz/ F_,^bօD+`BNmkD{{sMg%=݌D暢C\>+p sX x;zd}ҤpT#]y-͌PK{nM-DDr{5]˦rq|^ܛoWPZ!AtokRsh]ї]Ui |5)D^1>ډ8EgU +`ƈw{b))lV!Pr /DDd;TWĈn، gpN؉BGZ_YU, ҹ_|$,NZ+8%n7'c2N(nѪ n,"p館Kbr&xTx\?o-.5GO{62T&*f,zEr"UH-&"tF擽20E!?hf֓oP1([8aT1i³kfR1MCܨPдYQzD;n4lȤ'f]7RUߔeixIό I 33eրQpxr{Y>3ޛp@38a0OE}˧8%sS33?Xӻ~JaIzW͙ʞhzȶ<ƣ%ƎyxLZm:z_玨 :tdا^̯rJn/Bxbi35""RF&]Rocmm U\UjvTHD\2یg99i֤x.P:m "7.IJKbù& J̬GsfY_V\t G:;?S~{?:ޙI6}3)u^FF>{%5|/I8[}U^zFo`$P"qƱQw7EDS~FZi#OO0@S]!>7; 5ܮxѮUx d†+Y\PԺ|Ơ+Ey5]>⠚tBгF'7٨˂s{h^cJp1S 0/>pLƾs]/x)%:z S?QXC!zC'jCn|cQ|qAӻÙQx$Iԟ5ThqLBgAFi+Z=9$0 !St_k| 5(]y[ yp9UW'NݖB!0@!B^<!BMB!!B!Pok UlRnnfƜǏ5}^;|Ҭ왏ZrKh;G6O^~QD=rt"0Ǭ9=%o!|`q n?ߛwf ?YdsDvs'0)!mkֵf3rѬòZQvRw[Q y3iu|b%;lk$Yzݪ7pp8#RƆp֛~D)!zt0!kܨ6&F4mSC ;SPњ1Mu0Qyghbȟ-+Cvj3/e?\9~.!9 WHV$NBtF^ی Á#35خ9;- Oj>gz[5NCfZ4Eb1X};Ւ I w:'" d2o[ Nݸ0~nrByuIJyV.+=z{E1KlB<-̠I??zn"{]!3YjP~\ybSe0wm3U@r{\^*vf)o-_}ُ3>`F@U֒{+h̙m"?`bTҫ ;n]Dg;Ϲ{wyn9 azx<I˲$4w(UfJ# eGb;U1;v9PY^^v`@ 4isd9bv:0"/t`8P>ܽ!zYQQ%2Cޢ@;)AѬݝY)"l{nvdM%iq\$d9T}qodI6. Zj%v5`=͇k%%hUJ44*{⮭(۹#vuTO%;xE>$ڼ9LKR,ex]\P dYRLJpfN<ɏOE%>%wn@MʖG$l~y$ddr%h-e˽o_86l@>ܹBʖGD,~D5N'B=S~~f@Zդ J"MIjd6/{RU00q@pV%wG[+G#e?VԪ; :g5i@[!Kaؒ)W5ե]x~]-;rPU~;3U=epU]j5N78ƚl䊄RԖHmnا3f y-+?VY][=G-l؝ p-TY3<Q"$-!)A4)iqaIYadTCp$ew{kASfBNf:я"@DQQ~s=gV PS'jW!z t5׋Y_tVC#:ç9ΨH4PwݖX"׹˲&+&@} iUު}HMԴjF0} -U (֦e]3mPZJPZ-| K[RJ^s1oS!]',0 EQ@Q Eiܧe 6#e/ʪݔˠ$QkuaPΚT)~wHq?+[IweB|‹?ɦ!pNýeZ TIn`} )Uqagh?"Fn> Q33TJ@Gn:? hZ_ȓAya\n@C(_@k{d)ޣY>NC!3B4 w>]zsfL +2I(``/)X\sh j(Z2#+@A.2:V誋aݵZ 'ur`یLO.l05f:\ft1%(ʤ.:@FT%U1Xl6ѯPEjmQ=ܒ=ֈRQ:GT&!KИ!|o(HItPAmt&6ֆ@UVyuN&6V;[]' 1L#Ft64J&`!Xzj u%R6f@r [1׊f1Gp[bnk9Y9Ş@cfĨ`.&I"{Bl@(-3q X~ ':X0wsbp~p+cplwi5l@^7tSSBgL!31k2kiaUdZmM@/ -{ H|55SU|wgZYLwP}e F()҅5U^-*a ZGZo}p!#œ$$((ћvQyxNjT.v@~7Ewΐ埸@qrmWy?f7+|hmgzuRjƔww(3wG-K #7*9EmYn qUqaJZoܭ;:1`DmY|J*TXLw?h$Tnjoffn:m4;=3udN>U(- E!^z9bʁ921L1@GPV>ߊC}:%` :ܹ[wΕl=A:Vz7@~чCޯ3XB!nuZͳGn0??u}~c#20ܽyU)^dHf$B%ЋMlc# à</}-ԅ!,<!Bzy#G{M6 e,% 62s"<;B!!Ba>B!zF1!Ba>B!|!B!B!Bh\qXѴM ULA-$+`#҄Txx_B!ЋD,h7ϦN9[DٌݍﮡTͼ& 4B!B/ e7Df[h#7(抜 C/P#B!4Ԫ&-F!B[>@z1 D B!h^I6 9 WB!Nw槤T`TB!4k RR S!BbǬLV%5k40hFL -F!Bm@-^9p0G@s$ؾKZxo! B!4XB!JCB!!B!B!B B!0@!Ba>B!|!B!B!BgMrƍncabD65T 3ˎ41i$W.fhB!zq~׮Z#G*P@=ڬHpUpfD(mŠ#B!4xyeP$i) mfLp^WK B*.1!Bt̀nA$T_!Bv^Qf1d#B!Рh^I6 9 =kq̊i7pB!a>@pݵ)7=!MGV4cB!|AEI?ĹSB5B! G0]Cfcd@ɚ4 />ߝ&<[@!BAl{8r\$r`̐ȡ+j=v !B!г( B!!@!BB!!B!B!B B!0@!Ba>򇚭Iγgp5dO. {|iiTڣ. `ǯҟÑE!| 8zGxw?>v}Jǩ,.ˬ׭zs 瀃Џk>xkǐdr[M ?lxcGvmeq'zh.|qYۛy BQ[=^]}x'읕 j L0rh.k4FoB!^t7a7jMP%Rx&FtP75T .f $ԁ7sI8:q+ԼEM@ %%yY,|隶!,o>}35~cLVB!C>`aoG-6p@ZUYF6Rn6ņɑ[WTC|O\5;f!4VIOz>rr2'bfJO||̍%W*<#vld1OcbSfpv^= @혴ctT]f>I+n>fUYK:߶43}$G}%l”43gƀR7@pvnZ}1ܜ*%G{Ksm0bBK\Vu-'wW{FQ@}]xMXk6oGғo>SM? [7:A%cZ*2Nk>D(JqK`N^g?ƃRyS=cCNh Q/B!A> <"Df[h#7( s h2[ͳ"V7߶ % תȩl2E%(U?xQei*jI_ﶻ 7/ȍbVQw rәfՀ+?>~Im}x'oɕFV.j+Yr3%+A n([p1٨f[ޒodI6Q}飯ۥNyǏ[^Ԁ5-i-E0hyrĤOw"{kKGs~9^fxRwγ|`LgHfh0(޸VYv M3rhw^x|+,Ueajҟngv-[ b/_cM|u8 \s,d1)~\Z Ȟm~Bldr^QAv!W!BϛV5hь 52Wɼ4Wűnǣ"{ l MJOͭK{r<=YPyT{nێ q\(ISP8pB˓FG͑"=65kAS@Wy]ݏ n꿾K-&UV׉f'{߻w)"__R h,Hd IDAT*jo[$҆%=n0&qYƞc [;^,ZN (jqF՟Y2ywB2-qX..2?U\/S7Jiesbz۲So,UW3SU4r A!gӭv^{+t%WRRo(t^sۭs1.u&f:5~[`` vvЩP(Wz XC}㚹d;PO׳d?L[FtYVϼqV@jZ:AX7OZ[c0MIZf$aغы;yb+<}KW7,wwXJPmm00~R/ ZX)莰EAhƫ29}nJ[7NhB!W>@Oif5xp!+ ƿs阩q( B ,|wm~J( +h8vT]+P8N"q1 YBR&&]ZꄭM? i펖#iζք-%}bpX֐C?B5Q`(ra<ac;X9ϴVˑ<́V [Z9mF>}Y]˗1h{@ 7 " Bh4k RR K#uG W4~$*wŦ(B(F P) 8Aukb6V˼KsS 3I:.cΜ|jqf۰U?~cτa]S` ɡ^-ȑE ϵ &{U!H>Uؚvs@r [1׊f1Gp[bis'Xُ4Պ:.^Sɩ}LJ)NccgoFu&ꂃ0a<3nb8L*Z2ʌ`O|Ӹ>]oMfk BBLא55Ъdf$wZMELELl}E dfu!oSD^uGU{bWQ͍EY[|MkNj(ʋNݟ,8CzۘIBdVTY#zeYSWAg=QEY̔za/ƣ4uk>OԳM9m:}Gv/xj., \ (\zj1llw&Z͞}9=m}KԺkƬhNyǀB /㍪3{6]ǥP}5Wi~~(եrE'pPMd I:m>!zo p~X"sdvLC#Pd5%s*P({NTJcH7i1bCd|tLz#oA䮐UKRz?)U>֩p_T럙 O/b0u s+?ڶG׭٢Ø|²ٽ}g1 ׶qBV(*R*A"/Pcv^ܪ ʗL> 8 }gCt[l cJ@}Q1q|C;U_ƣb/E z]ThqLB!4xqѻrڴU)s^W֖\(.lz>FRY>S_!zڝ/ˁp :?dEK^͙ `B!B!B/B!0@!Ba>B!|eezsW~1,h/A\?-~.fɝkt'NwXƙ<˾\x~M)!B9ݬ>Hj5fR۲3d acB@W@V n}؄:MN, _`aoG-6pEl{;FV ;t׉gr.[ԭa6vƻv<hT,J ގk2f@__nx-Qy͡?\my}*Ǎ=g}z 6~ b 6oq6oMB]l ە'?㇟z PkKxߚYC`g|ltLz+flKKNjk1qAP/Ɠrlr]&"E9C&eu23vڸ@:036qCɦeԙ/@qre0Fy8Iez95UvnPkΪne3jYAR1tC Dڛ K>w~@ n3js -ƽJ2Uoh&p_v>o7>>y ^G~8)1@]q0]ݏߍR"E[#I(HqYIIyǞ51)}˼8~՗R&diQ[,Zs҅x[qiy1ゕ9ۖ-pk!%N|># #bOԤį]dm|5}C$)MK $ݜE]rJU.CaB h> ̀qMyM}Q#O;DJǻ 3b?~NեJ'zzmU\(08œS{S9 .Wp{N6 [ZmAvqIOH{~DRhge݄*++S(ʲE*pf">j!гeӭv^"-3ɩ)W@*ɠ]n{A O#.wPLc% "),({B]GmhPmʻw(4%9H/PyW?0)jә[W6!t,镡U^eayT+@ܻC'ہgt'GKrT. KVj(y+[) Zާni˅?w,T{u{\tMeSkDZimӀԏǿˏH1OLah( PTK[$ՔF!.MCᜆ.yoC+@:Դ~t. &.(q;kYl}[0dSI|da>عvBnC1ټ{PG#퍁 tGA@׼zSuJ_mU:.|H=#Y+uȫn_g>wIz,}ho۫vS6PB=[/Dpݵ)7;$6a/Z|}-y&qu]YYs+ncGR-ަL^#p,ۘM>aeTa-2MN^8Mp1)JޑܮL)] HFNYZhSoIxiRT(3vst#"yɑi޳8fY{1_@ b褪@ # 5EUq:.*#!|t {CAJc/ݺ;-bE/pW;2D@!0@!B=3k|l)ܕ5yߐSu%{m !BhB!^s9y$HB!G@!Bky:oYwn|G}i/ffOaM PGBY7ݱ!M,{ !0x\2z~;Y,O:o0:W L0rh-ֵ5rѬ/! 4N|1A.&X,{a2zQ#{?=Ju##J(u!klwi7M$!A<,=mѢ;fcw,~ڳ<mα-USy)ks qוw-]#8'xyJ׿Gl"plBac܌3֩KG[bF4ϜQ`H{fpߑp':r.ܭaレ.X3Fa֡K@xGrX.\e֡4ЛQv$6*QCLE%dP.,R):{s9Iוea|IwGŞLo|*BvEz p@f9 udh%[?#mmLJ1dMff O_:q {H*WhTͷ1)Q&t6'TXXp6|;Ϝi;$`޲OCre!A&yp6rB{ B=|@ct^狢jێcNt)YEiA.y޸+H[OK%CkwŤwQЇkآ 5&W?FcƄd]zMU=tj[UCbJ9ߋm@cR)(\ѥrlc]-/6-s<*:w;~Ji~Mk8.r2P M q*ȾmFi8sAU* Z~+B}$.]zkof9AOL0Mc>NNe@j߉U)4ZШRZ&[c(ហlrNpTrh5o=OPeon؄|)Å<"zty9 ɲ wG͚1$x.Q>$r۔>k,}-<ǁknPb u@D3sД(dܳ6o%ߕ֟B!|pJhǺҢVX;!>w3S^%Ƕr[!jqJ aU`߽}\[ͮk6oZՋJqGצ)ܲp}Zp~z{1% q^i-BGջ>S.؏=O_dXʨm֫uH1BF]%æ _Wߤ< uj$ӌ9Xx.f͹zH:Y1lR8X.jz+f?od9ќSzM`b?1\JHml݇. fbL [NSV&{_1Xl6$ϡ#U`,vk{K_)ˆ0GlW6D fViOMfY: @ݎLD=ZyH 9Nf\GbAh@d!Ѐİ}|Չ[Sfàdwd-*|}L,m,ݗvw{ ӈ M c|][R+%jNl&MleI]a+fZ1,nB_m j3I'_\3S=;38`]o ߒye7 xIڡ|fsDENfks7'&n 8˗9KY´^okkuJ`;q{J C^?k65igt t!tt u ŏNLᯃ@#I6ޡJ͍ v粹#ýu;3~<@AOMB!ԃ.Mۊ`hTu55w46+g[[T#[vsU.čE ׻3 N&˻w ޲omxP_pm*]n 8w n|b谎k׏Q~든DoFբ\X/PR#AVO'zkjY?^QP4ZQrutIXCQKF6 #Q\&Hɗe9,߼C*Ӷv\٘Jf/<̟}< Q}}SyQejr{Ξt(K*ϴty704E+muJ;_)ֶG\ 8[vhwC7Z [Ue)}(i%!#o F1?}mQQ߲_16V (Yu_Ϫ9sYWTr4 .y02"gL^yoþժܿ>cC_Ǿ!t!ԑVNn=0 g6ۺ]"V==!j)!zq!kܨ6&F4mSC ;SPKuY 7ƎmBUSm)9B/.ǡdA*ɚN5X<٢/.q64Bhpvقzn3*``< Z>-Z.lxE;oׯ^>g)p$"Ǯ[3knlH? D׃}< hWJ:)%81={#Gs>}zUUkU> ̀I LFƟ6UCE~E o bxp(!zmM-ZpЎ.CWbY[Ў3ev7[: 7M9$vvzoW=yMl\9߉;DWw/Z2M|BղkZm;xp///k$Izyya;C pzPVcTooo6j 9rm5׋Y_tVC#s)MՁZzWOfTz3@Lc|gk&v²ᓺz[?wƑ;b +J񌑝T?k)i_>|MvܻoC=ނoVbw߶3lذ>|>;pleˆ K$P{|fşdӐy89 @v%@ АYd7ٙY݆ze3{WPsa+Zn;U``8iT0WW zuo㢪gAA]@!@UpKA-F*nde-o$MroSLP@@A`FvAf;3?H.dxzc939|>]mӇ"bi5]}R[`G{uz[ \tcP(>dc"<f$oJR(Ķv222̘_)?jo~@iF:Փ) gw6H~tU_ބO LME""ڰa][[YYٳr%7!!pO૯""Xr*-@7߾>c X8|POIMw7Kަu3C&9d_L$+>szȴrniG]ҽ4y9&Fk1tñc.^HD 7 <8qD8~?pŊRi\.?vDhiidbDrQ.o϶VZ^膰0/゚19s۷Gĩ iuķ$"b SSP1mTwsFEG@o . 'IֹTBB}1h='l[t{ (m8]9flj?l`blt•3~OotX2/:3CJKDDį^8x"Ϗ1uDV{:6laV*mFtOMMG͙3ʕ+OT =ٸ 2{4wG6v쨉Lʴ &x,sa7 “ڼ~M𸗾ΌCD ߉+(&wyŰb3SZӰSj=Űwo֧4@Ti<"ԳS=kpᢑ#}LLLp?ل ž}OZ =DI_i^u:ZcuJ?.]wJA>x o:\?;?~uA;K,qvv /҃@OENe *>wqԧAaX,EuuٳDp<<<.]DDii^JD < Ɉ  @Rֲ[t17'S ӬYjnn>zYYǏyfI04tuɓ'}r77]\\jMyyٶmۛb͝RHHHoݺ?>ղJ?9/^鈈qvvv-2dp~#Ggddv-ozkk=_Qzݺ***qҥl;jقINd" 4dr(y cxE%ȝ%xh |U\8<\⫯7vl믯WvdĉӦM۳Z??7|s5׬Y]R"ܶm;ao 4iҖ-[{KK¥K.]2tВ"eXDԯ_cǎ9rݺu55jjjFFFΕ+׿nbbd |n4yE֘s \ŧnuh}бKR;j󁼖۴A~S#?}DqwqŜ9s+WQr1'N|GD666GgXlhMsssQQV/ڵW3FJ1{y $$DB߿ӦM{t?`圝  #8r{ӎӱ>IC!cIy!7 aXl;/ZUUioo䔚z-,k׮Yv?))WW,3jko7##sʔ);w]v… *ϝW_}r}vo;y0KQNNNĉ |s ^/[W֏r/LjX3lbib:nDۗvgdd[omWkhhXlȑ#GGG~]˖ :_:.//__>oܑ#G~і*anT;rnn.h0@`~!;8<΋]TosCCuUUZZZRX]]O'7mz[,ʕJ˗;wO]dyyycj|ذaΝ+//gֶ^ EC2>ז*77^ @?͎h5뺎 OSߡ:DcZ^̙3^^^'O̙=h3g~o:v츏ψ 8uɒGΞ=k„P;;aÆEGG+D6g2~x@`oo?fL`uu<~0jԨ bqp8 Dտ' 0_~7JG\ /L7T>wRZ;88bŊGi0@7y!ޫ.C0i;Nd.;1lʨ׎NcL m~"hΝ-H$[n5 (//׿/N6ʕ\}yri63c̥Kݼy-^{mySSӡC SvttDD\aB0o$++{ٲe*ի+ǫT-++뼋N۱cGL̲SVUU]N+.nT*Jᄏpw}fԴGi0@7 =СC;s<.Y\qYc,kτv|c+9{jJv}.a9/pi4*\*˙`-7Bg̸t-Qh4j" yzV&iU*Ec@'>QfDdafpjJœs1aK{DXY#Sժ{o DGG Y Y O˻\8x\K`@pfs\#45hoO8GFf > q8l?qui':T<<( H!:0zݤ홥əe6QiZ$pD.Lv_YV|a?O'Oz"I.~#uJZDOԤ'++K*655:883f%j{曃nnn"Y7j1y,t8p8p`uuu{ڵk˖Ť Bww @S!)q:6|cBÿjI666FFFDy{>RIDAT||PxŖ"rvvbX K 66L+aX.\0l0sssO}t7nI$`RUYYPRљ<T7~:6tlւB8.ry]afӦ=<}5rJK/Y ƾQ__{V,D"L&?y򔟟[{{{CC.=0t5d.#"nk 6$;;[PѠA8 :t86v UVV=z;GQxU%%B77#Fdddg<јku}%k>$"ܜC leeR:"k׮󵵵}ԴQT޺uۛ;<&Hdi9ե"?ĉE"<, 轊r<^D{+sͦZ)|-ޭ6gkl4L'4WW׭[?h4B̙36tttx{{O>Ȩv˖-RT)...*jʕ5klRN?%KMǎ>|555U:.//o޼X zO +ܻ>1q@ȺcwCgX{&n;^S'-WU:o1[^KѨFsQt.gςUdHo :<2FrҵDFѨt2Y@U-x FDYYu+*7b 0*n0>GhUU-jjxx({tjd>45hV&%%|lfb蓀s Q\V|CՎЋtSMڞYYzZhcVE_ @ONg-?ODdHeaiFY 7n\ܹsBƍo|7l0{CĉcbDҸtR\<s9*s0}*?ᑾNW^RO,]411… vjj߽͔ &̚5 NO {Z{0M(moofցÞ7eaaabbrvB輩j]:^-]DDǿs/Zdwyߥ\Rb:Ujkd{M+tlEx{{YZZJ#Gđ }jsL ZfjyV>%cΞ=ֶ=''g׮/Z(00'H$.ދmwID%%%煼DV;?/ԅ?{vx(G/ f/D:""htQҁ_? w~g_W|kfS qiu&bΝ;oޔkH)))wN'U p5+?FfDdiiz 999|>oC+WXXX|d2ٌ3|skgwTUU=cL/س|zæ3fԏxȞg@U1!ujR-O\!)b/iZs*n 9մ:S~D"IOO9ҧs fзsy-5DydeeIҦ2}E1c,^7D"_!THv|n=i?or|0<<<,lwŸQDbDTVVVRRB [ZZىb%$.5౑SS#T>ZPPP(uޅ{"a6mzkxxxW^#ˉHT\cZ*/D$sq[hذ%} 0aСñ\]]/x# Ȉ׹<;<6v|GcYuLx-osP""_r:''Gsss"  2$"bUhhJH,g]/6 SSP^^ֿ1>}gx@UT!'vf[k6eOkn9^ le;?ie:nF gΜ]{FFF55[lJMqqqQQW\շYc/{v' :.rB<"+]"k b홐َ<zZ~`tO5YY'Zjqyz.0 SX{Vx 39{dVZu>FGG߷<##%rX,h A<0~C`s8<6E > q8l?qui':T<<( H!:0zݤ홥əe6QiZ$pD.Lv_YV|a͝:6l{Ta„ 3-[ Wpxn^3GtNZ:<)8KjF}}}f%\ a<1@j97YrgY]qD\ @.J"߹Ryc-;9& ^3|ԩST󛚚(pE֘s \ŧnu4k7lljZhBU"铒rgfзsy-5DҒdeeIҦ&}x "1c,^D]g޽|sM$===obbBÇ4iٳg[+**{"ڷo_p߂NNG<UHv|n=i?or|0<<<,lwŸQDbDTVVVRRB [ZZىb%$nF .򀭭]CCB0cVW^a:;;;|p7oj05ul.< GE쳭 "::qP]Xg(bfӦ=<}5rJK/=R,+3a~!6k0\FD:"6lhqqIvv |0 SXXx VVV.DTYYellih711Źa7 @/ew4u]DŽgzrIƚ9,"%'H,srrR 2dHDLggg++PJ%X,NOXv_l]*3R|h1cCBB~gVӧ  rt|zק86 \)x F'_6gkl4L'4WW׭[?h4B̙36tttx{{O>Ȩv˖-RT)...*jʕ5klR8R-/m۶ODϛ7W"? "#z:thee]?\.xD5WE=3!uyJxΞ:iZ=o1=&O:~ݺpI(Q@hT (:UT3g[2n$鷅z q#9ZFhD=p.߿رA&yzY&iU*Ec@'>QfDdafpjʰ Y3dȐ_Dxa\ y!^aС t@@@@@@@@@@@@@@@@@ڥyIENDB`fastapi-0.110.3/docs/en/docs/index.md000066400000000000000000000462231461403617600172350ustar00rootroot00000000000000--- hide: - navigation ---

FastAPI

FastAPI framework, high performance, easy to learn, fast to code, ready for production

Test Coverage Package version Supported Python versions

--- **Documentation**: https://fastapi.tiangolo.com **Source Code**: https://github.com/tiangolo/fastapi --- FastAPI is a modern, fast (high-performance), web framework for building APIs with Python based on standard Python type hints. The key features are: * **Fast**: Very high performance, on par with **NodeJS** and **Go** (thanks to Starlette and Pydantic). [One of the fastest Python frameworks available](#performance). * **Fast to code**: Increase the speed to develop features by about 200% to 300%. * * **Fewer bugs**: Reduce about 40% of human (developer) induced errors. * * **Intuitive**: Great editor support. Completion everywhere. Less time debugging. * **Easy**: Designed to be easy to use and learn. Less time reading docs. * **Short**: Minimize code duplication. Multiple features from each parameter declaration. Fewer bugs. * **Robust**: Get production-ready code. With automatic interactive documentation. * **Standards-based**: Based on (and fully compatible with) the open standards for APIs: OpenAPI (previously known as Swagger) and JSON Schema. * estimation based on tests on an internal development team, building production applications. ## Sponsors {% if sponsors %} {% for sponsor in sponsors.gold -%} {% endfor -%} {%- for sponsor in sponsors.silver -%} {% endfor %} {% endif %} Other sponsors ## Opinions "_[...] I'm using **FastAPI** a ton these days. [...] I'm actually planning to use it for all of my team's **ML services at Microsoft**. Some of them are getting integrated into the core **Windows** product and some **Office** products._"
Kabir Khan - Microsoft (ref)
--- "_We adopted the **FastAPI** library to spawn a **REST** server that can be queried to obtain **predictions**. [for Ludwig]_"
Piero Molino, Yaroslav Dudin, and Sai Sumanth Miryala - Uber (ref)
--- "_**Netflix** is pleased to announce the open-source release of our **crisis management** orchestration framework: **Dispatch**! [built with **FastAPI**]_"
Kevin Glisson, Marc Vilanova, Forest Monsen - Netflix (ref)
--- "_I’m over the moon excited about **FastAPI**. It’s so fun!_"
Brian Okken - Python Bytes podcast host (ref)
--- "_Honestly, what you've built looks super solid and polished. In many ways, it's what I wanted **Hug** to be - it's really inspiring to see someone build that._"
Timothy Crosley - Hug creator (ref)
--- "_If you're looking to learn one **modern framework** for building REST APIs, check out **FastAPI** [...] It's fast, easy to use and easy to learn [...]_" "_We've switched over to **FastAPI** for our **APIs** [...] I think you'll like it [...]_"
Ines Montani - Matthew Honnibal - Explosion AI founders - spaCy creators (ref) - (ref)
--- "_If anyone is looking to build a production Python API, I would highly recommend **FastAPI**. It is **beautifully designed**, **simple to use** and **highly scalable**, it has become a **key component** in our API first development strategy and is driving many automations and services such as our Virtual TAC Engineer._"
Deon Pillsbury - Cisco (ref)
--- ## **Typer**, the FastAPI of CLIs If you are building a CLI app to be used in the terminal instead of a web API, check out **Typer**. **Typer** is FastAPI's little sibling. And it's intended to be the **FastAPI of CLIs**. ⌨️ 🚀 ## Requirements FastAPI stands on the shoulders of giants: * Starlette for the web parts. * Pydantic for the data parts. ## Installation
```console $ pip install fastapi ---> 100% ```
You will also need an ASGI server, for production such as Uvicorn or Hypercorn.
```console $ pip install "uvicorn[standard]" ---> 100% ```
## Example ### Create it * Create a file `main.py` with: ```Python from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ```
Or use async def... If your code uses `async` / `await`, use `async def`: ```Python hl_lines="9 14" from typing import Union from fastapi import FastAPI app = FastAPI() @app.get("/") async def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") async def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} ``` **Note**: If you don't know, check the _"In a hurry?"_ section about `async` and `await` in the docs.
### Run it Run the server with:
```console $ uvicorn main:app --reload INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) INFO: Started reloader process [28720] INFO: Started server process [28722] INFO: Waiting for application startup. INFO: Application startup complete. ```
About the command uvicorn main:app --reload... The command `uvicorn main:app` refers to: * `main`: the file `main.py` (the Python "module"). * `app`: the object created inside of `main.py` with the line `app = FastAPI()`. * `--reload`: make the server restart after code changes. Only do this for development.
### Check it Open your browser at http://127.0.0.1:8000/items/5?q=somequery. You will see the JSON response as: ```JSON {"item_id": 5, "q": "somequery"} ``` You already created an API that: * Receives HTTP requests in the _paths_ `/` and `/items/{item_id}`. * Both _paths_ take `GET` operations (also known as HTTP _methods_). * The _path_ `/items/{item_id}` has a _path parameter_ `item_id` that should be an `int`. * The _path_ `/items/{item_id}` has an optional `str` _query parameter_ `q`. ### Interactive API docs Now go to http://127.0.0.1:8000/docs. You will see the automatic interactive API documentation (provided by Swagger UI): ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) ### Alternative API docs And now, go to http://127.0.0.1:8000/redoc. You will see the alternative automatic documentation (provided by ReDoc): ![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) ## Example upgrade Now modify the file `main.py` to receive a body from a `PUT` request. Declare the body using standard Python types, thanks to Pydantic. ```Python hl_lines="4 9-12 25-27" from typing import Union from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str price: float is_offer: Union[bool, None] = None @app.get("/") def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") def read_item(item_id: int, q: Union[str, None] = None): return {"item_id": item_id, "q": q} @app.put("/items/{item_id}") def update_item(item_id: int, item: Item): return {"item_name": item.name, "item_id": item_id} ``` The server should reload automatically (because you added `--reload` to the `uvicorn` command above). ### Interactive API docs upgrade Now go to http://127.0.0.1:8000/docs. * The interactive API documentation will be automatically updated, including the new body: ![Swagger UI](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png) * Click on the button "Try it out", it allows you to fill the parameters and directly interact with the API: ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-04-swagger-03.png) * Then click on the "Execute" button, the user interface will communicate with your API, send the parameters, get the results and show them on the screen: ![Swagger UI interaction](https://fastapi.tiangolo.com/img/index/index-05-swagger-04.png) ### Alternative API docs upgrade And now, go to http://127.0.0.1:8000/redoc. * The alternative documentation will also reflect the new query parameter and body: ![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png) ### Recap In summary, you declare **once** the types of parameters, body, etc. as function parameters. You do that with standard modern Python types. You don't have to learn a new syntax, the methods or classes of a specific library, etc. Just standard **Python**. For example, for an `int`: ```Python item_id: int ``` or for a more complex `Item` model: ```Python item: Item ``` ...and with that single declaration you get: * Editor support, including: * Completion. * Type checks. * Validation of data: * Automatic and clear errors when the data is invalid. * Validation even for deeply nested JSON objects. * Conversion of input data: coming from the network to Python data and types. Reading from: * JSON. * Path parameters. * Query parameters. * Cookies. * Headers. * Forms. * Files. * Conversion of output data: converting from Python data and types to network data (as JSON): * Convert Python types (`str`, `int`, `float`, `bool`, `list`, etc). * `datetime` objects. * `UUID` objects. * Database models. * ...and many more. * Automatic interactive API documentation, including 2 alternative user interfaces: * Swagger UI. * ReDoc. --- Coming back to the previous code example, **FastAPI** will: * Validate that there is an `item_id` in the path for `GET` and `PUT` requests. * Validate that the `item_id` is of type `int` for `GET` and `PUT` requests. * If it is not, the client will see a useful, clear error. * Check if there is an optional query parameter named `q` (as in `http://127.0.0.1:8000/items/foo?q=somequery`) for `GET` requests. * As the `q` parameter is declared with `= None`, it is optional. * Without the `None` it would be required (as is the body in the case with `PUT`). * For `PUT` requests to `/items/{item_id}`, Read the body as JSON: * Check that it has a required attribute `name` that should be a `str`. * Check that it has a required attribute `price` that has to be a `float`. * Check that it has an optional attribute `is_offer`, that should be a `bool`, if present. * All this would also work for deeply nested JSON objects. * Convert from and to JSON automatically. * Document everything with OpenAPI, that can be used by: * Interactive documentation systems. * Automatic client code generation systems, for many languages. * Provide 2 interactive documentation web interfaces directly. --- We just scratched the surface, but you already get the idea of how it all works. Try changing the line with: ```Python return {"item_name": item.name, "item_id": item_id} ``` ...from: ```Python ... "item_name": item.name ... ``` ...to: ```Python ... "item_price": item.price ... ``` ...and see how your editor will auto-complete the attributes and know their types: ![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png) For a more complete example including more features, see the Tutorial - User Guide. **Spoiler alert**: the tutorial - user guide includes: * Declaration of **parameters** from other different places as: **headers**, **cookies**, **form fields** and **files**. * How to set **validation constraints** as `maximum_length` or `regex`. * A very powerful and easy to use **Dependency Injection** system. * Security and authentication, including support for **OAuth2** with **JWT tokens** and **HTTP Basic** auth. * More advanced (but equally easy) techniques for declaring **deeply nested JSON models** (thanks to Pydantic). * **GraphQL** integration with Strawberry and other libraries. * Many extra features (thanks to Starlette) as: * **WebSockets** * extremely easy tests based on HTTPX and `pytest` * **CORS** * **Cookie Sessions** * ...and more. ## Performance Independent TechEmpower benchmarks show **FastAPI** applications running under Uvicorn as one of the fastest Python frameworks available, only below Starlette and Uvicorn themselves (used internally by FastAPI). (*) To understand more about it, see the section Benchmarks. ## Optional Dependencies Used by Pydantic: * email_validator - for email validation. * pydantic-settings - for settings management. * pydantic-extra-types - for extra types to be used with Pydantic. Used by Starlette: * httpx - Required if you want to use the `TestClient`. * jinja2 - Required if you want to use the default template configuration. * python-multipart - Required if you want to support form "parsing", with `request.form()`. * itsdangerous - Required for `SessionMiddleware` support. * pyyaml - Required for Starlette's `SchemaGenerator` support (you probably don't need it with FastAPI). Used by FastAPI / Starlette: * uvicorn - for the server that loads and serves your application. * orjson - Required if you want to use `ORJSONResponse`. * ujson - Required if you want to use `UJSONResponse`. You can install all of these with `pip install "fastapi[all]"`. ## License This project is licensed under the terms of the MIT license. fastapi-0.110.3/docs/en/docs/js/000077500000000000000000000000001461403617600162115ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/js/custom.js000066400000000000000000000151161461403617600200650ustar00rootroot00000000000000const div = document.querySelector('.github-topic-projects') async function getDataBatch(page) { const response = await fetch(`https://api.github.com/search/repositories?q=topic:fastapi&per_page=100&page=${page}`, { headers: { Accept: 'application/vnd.github.mercy-preview+json' } }) const data = await response.json() return data } async function getData() { let page = 1 let data = [] let dataBatch = await getDataBatch(page) data = data.concat(dataBatch.items) const totalCount = dataBatch.total_count while (data.length < totalCount) { page += 1 dataBatch = await getDataBatch(page) data = data.concat(dataBatch.items) } return data } function setupTermynal() { document.querySelectorAll(".use-termynal").forEach(node => { node.style.display = "block"; new Termynal(node, { lineDelay: 500 }); }); const progressLiteralStart = "---> 100%"; const promptLiteralStart = "$ "; const customPromptLiteralStart = "# "; const termynalActivateClass = "termy"; let termynals = []; function createTermynals() { document .querySelectorAll(`.${termynalActivateClass} .highlight`) .forEach(node => { const text = node.textContent; const lines = text.split("\n"); const useLines = []; let buffer = []; function saveBuffer() { if (buffer.length) { let isBlankSpace = true; buffer.forEach(line => { if (line) { isBlankSpace = false; } }); dataValue = {}; if (isBlankSpace) { dataValue["delay"] = 0; } if (buffer[buffer.length - 1] === "") { // A last single
won't have effect // so put an additional one buffer.push(""); } const bufferValue = buffer.join("
"); dataValue["value"] = bufferValue; useLines.push(dataValue); buffer = []; } } for (let line of lines) { if (line === progressLiteralStart) { saveBuffer(); useLines.push({ type: "progress" }); } else if (line.startsWith(promptLiteralStart)) { saveBuffer(); const value = line.replace(promptLiteralStart, "").trimEnd(); useLines.push({ type: "input", value: value }); } else if (line.startsWith("// ")) { saveBuffer(); const value = "💬 " + line.replace("// ", "").trimEnd(); useLines.push({ value: value, class: "termynal-comment", delay: 0 }); } else if (line.startsWith(customPromptLiteralStart)) { saveBuffer(); const promptStart = line.indexOf(promptLiteralStart); if (promptStart === -1) { console.error("Custom prompt found but no end delimiter", line) } const prompt = line.slice(0, promptStart).replace(customPromptLiteralStart, "") let value = line.slice(promptStart + promptLiteralStart.length); useLines.push({ type: "input", value: value, prompt: prompt }); } else { buffer.push(line); } } saveBuffer(); const div = document.createElement("div"); node.replaceWith(div); const termynal = new Termynal(div, { lineData: useLines, noInit: true, lineDelay: 500 }); termynals.push(termynal); }); } function loadVisibleTermynals() { termynals = termynals.filter(termynal => { if (termynal.container.getBoundingClientRect().top - innerHeight <= 0) { termynal.init(); return false; } return true; }); } window.addEventListener("scroll", loadVisibleTermynals); createTermynals(); loadVisibleTermynals(); } function shuffle(array) { var currentIndex = array.length, temporaryValue, randomIndex; while (0 !== currentIndex) { randomIndex = Math.floor(Math.random() * currentIndex); currentIndex -= 1; temporaryValue = array[currentIndex]; array[currentIndex] = array[randomIndex]; array[randomIndex] = temporaryValue; } return array; } async function showRandomAnnouncement(groupId, timeInterval) { const announceFastAPI = document.getElementById(groupId); if (announceFastAPI) { let children = [].slice.call(announceFastAPI.children); children = shuffle(children) let index = 0 const announceRandom = () => { children.forEach((el, i) => {el.style.display = "none"}); children[index].style.display = "block" index = (index + 1) % children.length } announceRandom() setInterval(announceRandom, timeInterval ) } } async function main() { if (div) { data = await getData() div.innerHTML = '
    ' const ul = document.querySelector('.github-topic-projects ul') data.forEach(v => { if (v.full_name === 'tiangolo/fastapi') { return } const li = document.createElement('li') li.innerHTML = `★ ${v.stargazers_count} - ${v.full_name} by @${v.owner.login}` ul.append(li) }) } setupTermynal(); showRandomAnnouncement('announce-left', 5000) showRandomAnnouncement('announce-right', 10000) } main() fastapi-0.110.3/docs/en/docs/js/termynal.js000066400000000000000000000225041461403617600204050ustar00rootroot00000000000000/** * termynal.js * A lightweight, modern and extensible animated terminal window, using * async/await. * * @author Ines Montani * @version 0.0.1 * @license MIT */ 'use strict'; /** Generate a terminal widget. */ class Termynal { /** * Construct the widget's settings. * @param {(string|Node)=} container - Query selector or container element. * @param {Object=} options - Custom settings. * @param {string} options.prefix - Prefix to use for data attributes. * @param {number} options.startDelay - Delay before animation, in ms. * @param {number} options.typeDelay - Delay between each typed character, in ms. * @param {number} options.lineDelay - Delay between each line, in ms. * @param {number} options.progressLength - Number of characters displayed as progress bar. * @param {string} options.progressChar – Character to use for progress bar, defaults to █. * @param {number} options.progressPercent - Max percent of progress. * @param {string} options.cursor – Character to use for cursor, defaults to ▋. * @param {Object[]} lineData - Dynamically loaded line data objects. * @param {boolean} options.noInit - Don't initialise the animation. */ constructor(container = '#termynal', options = {}) { this.container = (typeof container === 'string') ? document.querySelector(container) : container; this.pfx = `data-${options.prefix || 'ty'}`; this.originalStartDelay = this.startDelay = options.startDelay || parseFloat(this.container.getAttribute(`${this.pfx}-startDelay`)) || 600; this.originalTypeDelay = this.typeDelay = options.typeDelay || parseFloat(this.container.getAttribute(`${this.pfx}-typeDelay`)) || 90; this.originalLineDelay = this.lineDelay = options.lineDelay || parseFloat(this.container.getAttribute(`${this.pfx}-lineDelay`)) || 1500; this.progressLength = options.progressLength || parseFloat(this.container.getAttribute(`${this.pfx}-progressLength`)) || 40; this.progressChar = options.progressChar || this.container.getAttribute(`${this.pfx}-progressChar`) || '█'; this.progressPercent = options.progressPercent || parseFloat(this.container.getAttribute(`${this.pfx}-progressPercent`)) || 100; this.cursor = options.cursor || this.container.getAttribute(`${this.pfx}-cursor`) || '▋'; this.lineData = this.lineDataToElements(options.lineData || []); this.loadLines() if (!options.noInit) this.init() } loadLines() { // Load all the lines and create the container so that the size is fixed // Otherwise it would be changing and the user viewport would be constantly // moving as she/he scrolls const finish = this.generateFinish() finish.style.visibility = 'hidden' this.container.appendChild(finish) // Appends dynamically loaded lines to existing line elements. this.lines = [...this.container.querySelectorAll(`[${this.pfx}]`)].concat(this.lineData); for (let line of this.lines) { line.style.visibility = 'hidden' this.container.appendChild(line) } const restart = this.generateRestart() restart.style.visibility = 'hidden' this.container.appendChild(restart) this.container.setAttribute('data-termynal', ''); } /** * Initialise the widget, get lines, clear container and start animation. */ init() { /** * Calculates width and height of Termynal container. * If container is empty and lines are dynamically loaded, defaults to browser `auto` or CSS. */ const containerStyle = getComputedStyle(this.container); this.container.style.width = containerStyle.width !== '0px' ? containerStyle.width : undefined; this.container.style.minHeight = containerStyle.height !== '0px' ? containerStyle.height : undefined; this.container.setAttribute('data-termynal', ''); this.container.innerHTML = ''; for (let line of this.lines) { line.style.visibility = 'visible' } this.start(); } /** * Start the animation and rener the lines depending on their data attributes. */ async start() { this.addFinish() await this._wait(this.startDelay); for (let line of this.lines) { const type = line.getAttribute(this.pfx); const delay = line.getAttribute(`${this.pfx}-delay`) || this.lineDelay; if (type == 'input') { line.setAttribute(`${this.pfx}-cursor`, this.cursor); await this.type(line); await this._wait(delay); } else if (type == 'progress') { await this.progress(line); await this._wait(delay); } else { this.container.appendChild(line); await this._wait(delay); } line.removeAttribute(`${this.pfx}-cursor`); } this.addRestart() this.finishElement.style.visibility = 'hidden' this.lineDelay = this.originalLineDelay this.typeDelay = this.originalTypeDelay this.startDelay = this.originalStartDelay } generateRestart() { const restart = document.createElement('a') restart.onclick = (e) => { e.preventDefault() this.container.innerHTML = '' this.init() } restart.href = '#' restart.setAttribute('data-terminal-control', '') restart.innerHTML = "restart ↻" return restart } generateFinish() { const finish = document.createElement('a') finish.onclick = (e) => { e.preventDefault() this.lineDelay = 0 this.typeDelay = 0 this.startDelay = 0 } finish.href = '#' finish.setAttribute('data-terminal-control', '') finish.innerHTML = "fast →" this.finishElement = finish return finish } addRestart() { const restart = this.generateRestart() this.container.appendChild(restart) } addFinish() { const finish = this.generateFinish() this.container.appendChild(finish) } /** * Animate a typed line. * @param {Node} line - The line element to render. */ async type(line) { const chars = [...line.textContent]; line.textContent = ''; this.container.appendChild(line); for (let char of chars) { const delay = line.getAttribute(`${this.pfx}-typeDelay`) || this.typeDelay; await this._wait(delay); line.textContent += char; } } /** * Animate a progress bar. * @param {Node} line - The line element to render. */ async progress(line) { const progressLength = line.getAttribute(`${this.pfx}-progressLength`) || this.progressLength; const progressChar = line.getAttribute(`${this.pfx}-progressChar`) || this.progressChar; const chars = progressChar.repeat(progressLength); const progressPercent = line.getAttribute(`${this.pfx}-progressPercent`) || this.progressPercent; line.textContent = ''; this.container.appendChild(line); for (let i = 1; i < chars.length + 1; i++) { await this._wait(this.typeDelay); const percent = Math.round(i / chars.length * 100); line.textContent = `${chars.slice(0, i)} ${percent}%`; if (percent>progressPercent) { break; } } } /** * Helper function for animation delays, called with `await`. * @param {number} time - Timeout, in ms. */ _wait(time) { return new Promise(resolve => setTimeout(resolve, time)); } /** * Converts line data objects into line elements. * * @param {Object[]} lineData - Dynamically loaded lines. * @param {Object} line - Line data object. * @returns {Element[]} - Array of line elements. */ lineDataToElements(lineData) { return lineData.map(line => { let div = document.createElement('div'); div.innerHTML = `${line.value || ''}`; return div.firstElementChild; }); } /** * Helper function for generating attributes string. * * @param {Object} line - Line data object. * @returns {string} - String of attributes. */ _attributes(line) { let attrs = ''; for (let prop in line) { // Custom add class if (prop === 'class') { attrs += ` class=${line[prop]} ` continue } if (prop === 'type') { attrs += `${this.pfx}="${line[prop]}" ` } else if (prop !== 'value') { attrs += `${this.pfx}-${prop}="${line[prop]}" ` } } return attrs; } } /** * HTML API: If current script has container(s) specified, initialise Termynal. */ if (document.currentScript.hasAttribute('data-termynal-container')) { const containers = document.currentScript.getAttribute('data-termynal-container'); containers.split('|') .forEach(container => new Termynal(container)) } fastapi-0.110.3/docs/en/docs/learn/000077500000000000000000000000001461403617600166765ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/learn/index.md000066400000000000000000000003031461403617600203230ustar00rootroot00000000000000# Learn Here are the introductory sections and the tutorials to learn **FastAPI**. You could consider this a **book**, a **course**, the **official** and recommended way to learn FastAPI. 😎 fastapi-0.110.3/docs/en/docs/newsletter.md000066400000000000000000000005021461403617600203100ustar00rootroot00000000000000# FastAPI and friends newsletter fastapi-0.110.3/docs/en/docs/project-generation.md000066400000000000000000000034541461403617600217240ustar00rootroot00000000000000# Full Stack FastAPI Template Templates, while typically come with a specific setup, are designed to be flexible and customizable. This allows you to modify and adapt them to your project's requirements, making them an excellent starting point. 🏁 You can use this template to get started, as it includes a lot of the initial set up, security, database and some API endpoints already done for you. GitHub Repository: Full Stack FastAPI Template ## Full Stack FastAPI Template - Technology Stack and Features - ⚡ [**FastAPI**](https://fastapi.tiangolo.com) for the Python backend API. - 🧰 [SQLModel](https://sqlmodel.tiangolo.com) for the Python SQL database interactions (ORM). - 🔍 [Pydantic](https://docs.pydantic.dev), used by FastAPI, for the data validation and settings management. - 💾 [PostgreSQL](https://www.postgresql.org) as the SQL database. - 🚀 [React](https://react.dev) for the frontend. - 💃 Using TypeScript, hooks, Vite, and other parts of a modern frontend stack. - 🎨 [Chakra UI](https://chakra-ui.com) for the frontend components. - 🤖 An automatically generated frontend client. - 🦇 Dark mode support. - 🐋 [Docker Compose](https://www.docker.com) for development and production. - 🔒 Secure password hashing by default. - 🔑 JWT token authentication. - 📫 Email based password recovery. - ✅ Tests with [Pytest](https://pytest.org). - 📞 [Traefik](https://traefik.io) as a reverse proxy / load balancer. - 🚢 Deployment instructions using Docker Compose, including how to set up a frontend Traefik proxy to handle automatic HTTPS certificates. - 🏭 CI (continuous integration) and CD (continuous deployment) based on GitHub Actions. fastapi-0.110.3/docs/en/docs/python-types.md000066400000000000000000000420401461403617600206020ustar00rootroot00000000000000# Python Types Intro Python has support for optional "type hints" (also called "type annotations"). These **"type hints"** or annotations are a special syntax that allow declaring the type of a variable. By declaring types for your variables, editors and tools can give you better support. This is just a **quick tutorial / refresher** about Python type hints. It covers only the minimum necessary to use them with **FastAPI**... which is actually very little. **FastAPI** is all based on these type hints, they give it many advantages and benefits. But even if you never use **FastAPI**, you would benefit from learning a bit about them. !!! note If you are a Python expert, and you already know everything about type hints, skip to the next chapter. ## Motivation Let's start with a simple example: ```Python {!../../../docs_src/python_types/tutorial001.py!} ``` Calling this program outputs: ``` John Doe ``` The function does the following: * Takes a `first_name` and `last_name`. * Converts the first letter of each one to upper case with `title()`. * Concatenates them with a space in the middle. ```Python hl_lines="2" {!../../../docs_src/python_types/tutorial001.py!} ``` ### Edit it It's a very simple program. But now imagine that you were writing it from scratch. At some point you would have started the definition of the function, you had the parameters ready... But then you have to call "that method that converts the first letter to upper case". Was it `upper`? Was it `uppercase`? `first_uppercase`? `capitalize`? Then, you try with the old programmer's friend, editor autocompletion. You type the first parameter of the function, `first_name`, then a dot (`.`) and then hit `Ctrl+Space` to trigger the completion. But, sadly, you get nothing useful: ### Add types Let's modify a single line from the previous version. We will change exactly this fragment, the parameters of the function, from: ```Python first_name, last_name ``` to: ```Python first_name: str, last_name: str ``` That's it. Those are the "type hints": ```Python hl_lines="1" {!../../../docs_src/python_types/tutorial002.py!} ``` That is not the same as declaring default values like would be with: ```Python first_name="john", last_name="doe" ``` It's a different thing. We are using colons (`:`), not equals (`=`). And adding type hints normally doesn't change what happens from what would happen without them. But now, imagine you are again in the middle of creating that function, but with type hints. At the same point, you try to trigger the autocomplete with `Ctrl+Space` and you see: With that, you can scroll, seeing the options, until you find the one that "rings a bell": ## More motivation Check this function, it already has type hints: ```Python hl_lines="1" {!../../../docs_src/python_types/tutorial003.py!} ``` Because the editor knows the types of the variables, you don't only get completion, you also get error checks: Now you know that you have to fix it, convert `age` to a string with `str(age)`: ```Python hl_lines="2" {!../../../docs_src/python_types/tutorial004.py!} ``` ## Declaring types You just saw the main place to declare type hints. As function parameters. This is also the main place you would use them with **FastAPI**. ### Simple types You can declare all the standard Python types, not only `str`. You can use, for example: * `int` * `float` * `bool` * `bytes` ```Python hl_lines="1" {!../../../docs_src/python_types/tutorial005.py!} ``` ### Generic types with type parameters There are some data structures that can contain other values, like `dict`, `list`, `set` and `tuple`. And the internal values can have their own type too. These types that have internal types are called "**generic**" types. And it's possible to declare them, even with their internal types. To declare those types and the internal types, you can use the standard Python module `typing`. It exists specifically to support these type hints. #### Newer versions of Python The syntax using `typing` is **compatible** with all versions, from Python 3.6 to the latest ones, including Python 3.9, Python 3.10, etc. As Python advances, **newer versions** come with improved support for these type annotations and in many cases you won't even need to import and use the `typing` module to declare the type annotations. If you can choose a more recent version of Python for your project, you will be able to take advantage of that extra simplicity. In all the docs there are examples compatible with each version of Python (when there's a difference). For example "**Python 3.6+**" means it's compatible with Python 3.6 or above (including 3.7, 3.8, 3.9, 3.10, etc). And "**Python 3.9+**" means it's compatible with Python 3.9 or above (including 3.10, etc). If you can use the **latest versions of Python**, use the examples for the latest version, those will have the **best and simplest syntax**, for example, "**Python 3.10+**". #### List For example, let's define a variable to be a `list` of `str`. === "Python 3.9+" Declare the variable, with the same colon (`:`) syntax. As the type, put `list`. As the list is a type that contains some internal types, you put them in square brackets: ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial006_py39.py!} ``` === "Python 3.8+" From `typing`, import `List` (with a capital `L`): ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial006.py!} ``` Declare the variable, with the same colon (`:`) syntax. As the type, put the `List` that you imported from `typing`. As the list is a type that contains some internal types, you put them in square brackets: ```Python hl_lines="4" {!> ../../../docs_src/python_types/tutorial006.py!} ``` !!! info Those internal types in the square brackets are called "type parameters". In this case, `str` is the type parameter passed to `List` (or `list` in Python 3.9 and above). That means: "the variable `items` is a `list`, and each of the items in this list is a `str`". !!! tip If you use Python 3.9 or above, you don't have to import `List` from `typing`, you can use the same regular `list` type instead. By doing that, your editor can provide support even while processing items from the list: Without types, that's almost impossible to achieve. Notice that the variable `item` is one of the elements in the list `items`. And still, the editor knows it is a `str`, and provides support for that. #### Tuple and Set You would do the same to declare `tuple`s and `set`s: === "Python 3.9+" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial007_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial007.py!} ``` This means: * The variable `items_t` is a `tuple` with 3 items, an `int`, another `int`, and a `str`. * The variable `items_s` is a `set`, and each of its items is of type `bytes`. #### Dict To define a `dict`, you pass 2 type parameters, separated by commas. The first type parameter is for the keys of the `dict`. The second type parameter is for the values of the `dict`: === "Python 3.9+" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial008_py39.py!} ``` === "Python 3.8+" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial008.py!} ``` This means: * The variable `prices` is a `dict`: * The keys of this `dict` are of type `str` (let's say, the name of each item). * The values of this `dict` are of type `float` (let's say, the price of each item). #### Union You can declare that a variable can be any of **several types**, for example, an `int` or a `str`. In Python 3.6 and above (including Python 3.10) you can use the `Union` type from `typing` and put inside the square brackets the possible types to accept. In Python 3.10 there's also a **new syntax** where you can put the possible types separated by a vertical bar (`|`). === "Python 3.10+" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial008b_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial008b.py!} ``` In both cases this means that `item` could be an `int` or a `str`. #### Possibly `None` You can declare that a value could have a type, like `str`, but that it could also be `None`. In Python 3.6 and above (including Python 3.10) you can declare it by importing and using `Optional` from the `typing` module. ```Python hl_lines="1 4" {!../../../docs_src/python_types/tutorial009.py!} ``` Using `Optional[str]` instead of just `str` will let the editor help you detecting errors where you could be assuming that a value is always a `str`, when it could actually be `None` too. `Optional[Something]` is actually a shortcut for `Union[Something, None]`, they are equivalent. This also means that in Python 3.10, you can use `Something | None`: === "Python 3.10+" ```Python hl_lines="1" {!> ../../../docs_src/python_types/tutorial009_py310.py!} ``` === "Python 3.8+" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial009.py!} ``` === "Python 3.8+ alternative" ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial009b.py!} ``` #### Using `Union` or `Optional` If you are using a Python version below 3.10, here's a tip from my very **subjective** point of view: * 🚨 Avoid using `Optional[SomeType]` * Instead ✨ **use `Union[SomeType, None]`** ✨. Both are equivalent and underneath they are the same, but I would recommend `Union` instead of `Optional` because the word "**optional**" would seem to imply that the value is optional, and it actually means "it can be `None`", even if it's not optional and is still required. I think `Union[SomeType, None]` is more explicit about what it means. It's just about the words and names. But those words can affect how you and your teammates think about the code. As an example, let's take this function: ```Python hl_lines="1 4" {!../../../docs_src/python_types/tutorial009c.py!} ``` The parameter `name` is defined as `Optional[str]`, but it is **not optional**, you cannot call the function without the parameter: ```Python say_hi() # Oh, no, this throws an error! 😱 ``` The `name` parameter is **still required** (not *optional*) because it doesn't have a default value. Still, `name` accepts `None` as the value: ```Python say_hi(name=None) # This works, None is valid 🎉 ``` The good news is, once you are on Python 3.10 you won't have to worry about that, as you will be able to simply use `|` to define unions of types: ```Python hl_lines="1 4" {!../../../docs_src/python_types/tutorial009c_py310.py!} ``` And then you won't have to worry about names like `Optional` and `Union`. 😎 #### Generic types These types that take type parameters in square brackets are called **Generic types** or **Generics**, for example: === "Python 3.10+" You can use the same builtin types as generics (with square brackets and types inside): * `list` * `tuple` * `set` * `dict` And the same as with Python 3.8, from the `typing` module: * `Union` * `Optional` (the same as with Python 3.8) * ...and others. In Python 3.10, as an alternative to using the generics `Union` and `Optional`, you can use the vertical bar (`|`) to declare unions of types, that's a lot better and simpler. === "Python 3.9+" You can use the same builtin types as generics (with square brackets and types inside): * `list` * `tuple` * `set` * `dict` And the same as with Python 3.8, from the `typing` module: * `Union` * `Optional` * ...and others. === "Python 3.8+" * `List` * `Tuple` * `Set` * `Dict` * `Union` * `Optional` * ...and others. ### Classes as types You can also declare a class as the type of a variable. Let's say you have a class `Person`, with a name: ```Python hl_lines="1-3" {!../../../docs_src/python_types/tutorial010.py!} ``` Then you can declare a variable to be of type `Person`: ```Python hl_lines="6" {!../../../docs_src/python_types/tutorial010.py!} ``` And then, again, you get all the editor support: Notice that this means "`one_person` is an **instance** of the class `Person`". It doesn't mean "`one_person` is the **class** called `Person`". ## Pydantic models Pydantic is a Python library to perform data validation. You declare the "shape" of the data as classes with attributes. And each attribute has a type. Then you create an instance of that class with some values and it will validate the values, convert them to the appropriate type (if that's the case) and give you an object with all the data. And you get all the editor support with that resulting object. An example from the official Pydantic docs: === "Python 3.10+" ```Python {!> ../../../docs_src/python_types/tutorial011_py310.py!} ``` === "Python 3.9+" ```Python {!> ../../../docs_src/python_types/tutorial011_py39.py!} ``` === "Python 3.8+" ```Python {!> ../../../docs_src/python_types/tutorial011.py!} ``` !!! info To learn more about Pydantic, check its docs. **FastAPI** is all based on Pydantic. You will see a lot more of all this in practice in the [Tutorial - User Guide](tutorial/index.md){.internal-link target=_blank}. !!! tip Pydantic has a special behavior when you use `Optional` or `Union[Something, None]` without a default value, you can read more about it in the Pydantic docs about Required Optional fields. ## Type Hints with Metadata Annotations Python also has a feature that allows putting **additional metadata** in these type hints using `Annotated`. === "Python 3.9+" In Python 3.9, `Annotated` is part of the standard library, so you can import it from `typing`. ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial013_py39.py!} ``` === "Python 3.8+" In versions below Python 3.9, you import `Annotated` from `typing_extensions`. It will already be installed with **FastAPI**. ```Python hl_lines="1 4" {!> ../../../docs_src/python_types/tutorial013.py!} ``` Python itself doesn't do anything with this `Annotated`. And for editors and other tools, the type is still `str`. But you can use this space in `Annotated` to provide **FastAPI** with additional metadata about how you want your application to behave. The important thing to remember is that **the first *type parameter*** you pass to `Annotated` is the **actual type**. The rest, is just metadata for other tools. For now, you just need to know that `Annotated` exists, and that it's standard Python. 😎 Later you will see how **powerful** it can be. !!! tip The fact that this is **standard Python** means that you will still get the **best possible developer experience** in your editor, with the tools you use to analyze and refactor your code, etc. ✨ And also that your code will be very compatible with many other Python tools and libraries. 🚀 ## Type hints in **FastAPI** **FastAPI** takes advantage of these type hints to do several things. With **FastAPI** you declare parameters with type hints and you get: * **Editor support**. * **Type checks**. ...and **FastAPI** uses the same declarations to: * **Define requirements**: from request path parameters, query parameters, headers, bodies, dependencies, etc. * **Convert data**: from the request to the required type. * **Validate data**: coming from each request: * Generating **automatic errors** returned to the client when the data is invalid. * **Document** the API using OpenAPI: * which is then used by the automatic interactive documentation user interfaces. This might all sound abstract. Don't worry. You'll see all this in action in the [Tutorial - User Guide](tutorial/index.md){.internal-link target=_blank}. The important thing is that by using standard Python types, in a single place (instead of adding more classes, decorators, etc), **FastAPI** will do a lot of the work for you. !!! info If you already went through all the tutorial and came back to see more about types, a good resource is the "cheat sheet" from `mypy`. fastapi-0.110.3/docs/en/docs/reference/000077500000000000000000000000001461403617600175335ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/reference/apirouter.md000066400000000000000000000010141461403617600220630ustar00rootroot00000000000000# `APIRouter` class Here's the reference information for the `APIRouter` class, with all its parameters, attributes and methods. You can import the `APIRouter` class directly from `fastapi`: ```python from fastapi import APIRouter ``` ::: fastapi.APIRouter options: members: - websocket - include_router - get - put - post - delete - options - head - patch - trace - on_event fastapi-0.110.3/docs/en/docs/reference/background.md000066400000000000000000000005711461403617600221770ustar00rootroot00000000000000# Background Tasks - `BackgroundTasks` You can declare a parameter in a *path operation function* or dependency function with the type `BackgroundTasks`, and then you can use it to schedule the execution of background tasks after the response is sent. You can import it directly from `fastapi`: ```python from fastapi import BackgroundTasks ``` ::: fastapi.BackgroundTasks fastapi-0.110.3/docs/en/docs/reference/dependencies.md000066400000000000000000000012371461403617600225060ustar00rootroot00000000000000# Dependencies - `Depends()` and `Security()` ## `Depends()` Dependencies are handled mainly with the special function `Depends()` that takes a callable. Here is the reference for it and its parameters. You can import it directly from `fastapi`: ```python from fastapi import Depends ``` ::: fastapi.Depends ## `Security()` For many scenarios, you can handle security (authorization, authentication, etc.) with dependencies, using `Depends()`. But when you want to also declare OAuth2 scopes, you can use `Security()` instead of `Depends()`. You can import `Security()` directly from `fastapi`: ```python from fastapi import Security ``` ::: fastapi.Security fastapi-0.110.3/docs/en/docs/reference/encoders.md000066400000000000000000000001071461403617600216550ustar00rootroot00000000000000# Encoders - `jsonable_encoder` ::: fastapi.encoders.jsonable_encoder fastapi-0.110.3/docs/en/docs/reference/exceptions.md000066400000000000000000000011251461403617600222350ustar00rootroot00000000000000# Exceptions - `HTTPException` and `WebSocketException` These are the exceptions that you can raise to show errors to the client. When you raise an exception, as would happen with normal Python, the rest of the execution is aborted. This way you can raise these exceptions from anywhere in the code to abort a request and show the error to the client. You can use: * `HTTPException` * `WebSocketException` These exceptions can be imported directly from `fastapi`: ```python from fastapi import HTTPException, WebSocketException ``` ::: fastapi.HTTPException ::: fastapi.WebSocketException fastapi-0.110.3/docs/en/docs/reference/fastapi.md000066400000000000000000000012751461403617600215110ustar00rootroot00000000000000# `FastAPI` class Here's the reference information for the `FastAPI` class, with all its parameters, attributes and methods. You can import the `FastAPI` class directly from `fastapi`: ```python from fastapi import FastAPI ``` ::: fastapi.FastAPI options: members: - openapi_version - webhooks - state - dependency_overrides - openapi - websocket - include_router - get - put - post - delete - options - head - patch - trace - on_event - middleware - exception_handler fastapi-0.110.3/docs/en/docs/reference/httpconnection.md000066400000000000000000000005471461403617600231220ustar00rootroot00000000000000# `HTTPConnection` class When you want to define dependencies that should be compatible with both HTTP and WebSockets, you can define a parameter that takes an `HTTPConnection` instead of a `Request` or a `WebSocket`. You can import it from `fastapi.requests`: ```python from fastapi.requests import HTTPConnection ``` ::: fastapi.requests.HTTPConnection fastapi-0.110.3/docs/en/docs/reference/index.md000066400000000000000000000004501461403617600211630ustar00rootroot00000000000000# Reference - Code API Here's the reference or code API, the classes, functions, parameters, attributes, and all the FastAPI parts you can use in your applications. If you want to **learn FastAPI** you are much better off reading the [FastAPI Tutorial](https://fastapi.tiangolo.com/tutorial/). fastapi-0.110.3/docs/en/docs/reference/middleware.md000066400000000000000000000017371461403617600222020ustar00rootroot00000000000000# Middleware There are several middlewares available provided by Starlette directly. Read more about them in the [FastAPI docs for Middleware](https://fastapi.tiangolo.com/advanced/middleware/). ::: fastapi.middleware.cors.CORSMiddleware It can be imported from `fastapi`: ```python from fastapi.middleware.cors import CORSMiddleware ``` ::: fastapi.middleware.gzip.GZipMiddleware It can be imported from `fastapi`: ```python from fastapi.middleware.gzip import GZipMiddleware ``` ::: fastapi.middleware.httpsredirect.HTTPSRedirectMiddleware It can be imported from `fastapi`: ```python from fastapi.middleware.httpsredirect import HTTPSRedirectMiddleware ``` ::: fastapi.middleware.trustedhost.TrustedHostMiddleware It can be imported from `fastapi`: ```python from fastapi.middleware.trustedhost import TrustedHostMiddleware ``` ::: fastapi.middleware.wsgi.WSGIMiddleware It can be imported from `fastapi`: ```python from fastapi.middleware.wsgi import WSGIMiddleware ``` fastapi-0.110.3/docs/en/docs/reference/openapi/000077500000000000000000000000001461403617600211665ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/reference/openapi/docs.md000066400000000000000000000005501461403617600224400ustar00rootroot00000000000000# OpenAPI `docs` Utilities to handle OpenAPI automatic UI documentation, including Swagger UI (by default at `/docs`) and ReDoc (by default at `/redoc`). ::: fastapi.openapi.docs.get_swagger_ui_html ::: fastapi.openapi.docs.get_redoc_html ::: fastapi.openapi.docs.get_swagger_ui_oauth2_redirect_html ::: fastapi.openapi.docs.swagger_ui_default_parameters fastapi-0.110.3/docs/en/docs/reference/openapi/index.md000066400000000000000000000002361461403617600226200ustar00rootroot00000000000000# OpenAPI There are several utilities to handle OpenAPI. You normally don't need to use them unless you have a specific advanced use case that requires it. fastapi-0.110.3/docs/en/docs/reference/openapi/models.md000066400000000000000000000001751461403617600227760ustar00rootroot00000000000000# OpenAPI `models` OpenAPI Pydantic models used to generate and validate the generated OpenAPI. ::: fastapi.openapi.models fastapi-0.110.3/docs/en/docs/reference/parameters.md000066400000000000000000000011331461403617600222160ustar00rootroot00000000000000# Request Parameters Here's the reference information for the request parameters. These are the special functions that you can put in *path operation function* parameters or dependency functions with `Annotated` to get data from the request. It includes: * `Query()` * `Path()` * `Body()` * `Cookie()` * `Header()` * `Form()` * `File()` You can import them all directly from `fastapi`: ```python from fastapi import Body, Cookie, File, Form, Header, Path, Query ``` ::: fastapi.Query ::: fastapi.Path ::: fastapi.Body ::: fastapi.Cookie ::: fastapi.Header ::: fastapi.Form ::: fastapi.File fastapi-0.110.3/docs/en/docs/reference/request.md000066400000000000000000000010041461403617600215400ustar00rootroot00000000000000# `Request` class You can declare a parameter in a *path operation function* or dependency to be of type `Request` and then you can access the raw request object directly, without any validation, etc. You can import it directly from `fastapi`: ```python from fastapi import Request ``` !!! tip When you want to define dependencies that should be compatible with both HTTP and WebSockets, you can define a parameter that takes an `HTTPConnection` instead of a `Request` or a `WebSocket`. ::: fastapi.Request fastapi-0.110.3/docs/en/docs/reference/response.md000066400000000000000000000006151461403617600217150ustar00rootroot00000000000000# `Response` class You can declare a parameter in a *path operation function* or dependency to be of type `Response` and then you can set data for the response like headers or cookies. You can also use it directly to create an instance of it and return it from your *path operations*. You can import it directly from `fastapi`: ```python from fastapi import Response ``` ::: fastapi.Response fastapi-0.110.3/docs/en/docs/reference/responses.md000066400000000000000000000073641461403617600221100ustar00rootroot00000000000000# Custom Response Classes - File, HTML, Redirect, Streaming, etc. There are several custom response classes you can use to create an instance and return them directly from your *path operations*. Read more about it in the [FastAPI docs for Custom Response - HTML, Stream, File, others](https://fastapi.tiangolo.com/advanced/custom-response/). You can import them directly from `fastapi.responses`: ```python from fastapi.responses import ( FileResponse, HTMLResponse, JSONResponse, ORJSONResponse, PlainTextResponse, RedirectResponse, Response, StreamingResponse, UJSONResponse, ) ``` ## FastAPI Responses There are a couple of custom FastAPI response classes, you can use them to optimize JSON performance. ::: fastapi.responses.UJSONResponse options: members: - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ::: fastapi.responses.ORJSONResponse options: members: - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ## Starlette Responses ::: fastapi.responses.FileResponse options: members: - chunk_size - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ::: fastapi.responses.HTMLResponse options: members: - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ::: fastapi.responses.JSONResponse options: members: - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ::: fastapi.responses.PlainTextResponse options: members: - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ::: fastapi.responses.RedirectResponse options: members: - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ::: fastapi.responses.Response options: members: - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie ::: fastapi.responses.StreamingResponse options: members: - body_iterator - charset - status_code - media_type - body - background - raw_headers - render - init_headers - headers - set_cookie - delete_cookie fastapi-0.110.3/docs/en/docs/reference/security/000077500000000000000000000000001461403617600214025ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/reference/security/index.md000066400000000000000000000032051461403617600230330ustar00rootroot00000000000000# Security Tools When you need to declare dependencies with OAuth2 scopes you use `Security()`. But you still need to define what is the dependable, the callable that you pass as a parameter to `Depends()` or `Security()`. There are multiple tools that you can use to create those dependables, and they get integrated into OpenAPI so they are shown in the automatic docs UI, they can be used by automatically generated clients and SDKs, etc. You can import them from `fastapi.security`: ```python from fastapi.security import ( APIKeyCookie, APIKeyHeader, APIKeyQuery, HTTPAuthorizationCredentials, HTTPBasic, HTTPBasicCredentials, HTTPBearer, HTTPDigest, OAuth2, OAuth2AuthorizationCodeBearer, OAuth2PasswordBearer, OAuth2PasswordRequestForm, OAuth2PasswordRequestFormStrict, OpenIdConnect, SecurityScopes, ) ``` ## API Key Security Schemes ::: fastapi.security.APIKeyCookie ::: fastapi.security.APIKeyHeader ::: fastapi.security.APIKeyQuery ## HTTP Authentication Schemes ::: fastapi.security.HTTPBasic ::: fastapi.security.HTTPBearer ::: fastapi.security.HTTPDigest ## HTTP Credentials ::: fastapi.security.HTTPAuthorizationCredentials ::: fastapi.security.HTTPBasicCredentials ## OAuth2 Authentication ::: fastapi.security.OAuth2 ::: fastapi.security.OAuth2AuthorizationCodeBearer ::: fastapi.security.OAuth2PasswordBearer ## OAuth2 Password Form ::: fastapi.security.OAuth2PasswordRequestForm ::: fastapi.security.OAuth2PasswordRequestFormStrict ## OAuth2 Security Scopes in Dependencies ::: fastapi.security.SecurityScopes ## OpenID Connect ::: fastapi.security.OpenIdConnect fastapi-0.110.3/docs/en/docs/reference/staticfiles.md000066400000000000000000000006071461403617600223720ustar00rootroot00000000000000# Static Files - `StaticFiles` You can use the `StaticFiles` class to serve static files, like JavaScript, CSS, images, etc. Read more about it in the [FastAPI docs for Static Files](https://fastapi.tiangolo.com/tutorial/static-files/). You can import it directly from `fastapi.staticfiles`: ```python from fastapi.staticfiles import StaticFiles ``` ::: fastapi.staticfiles.StaticFiles fastapi-0.110.3/docs/en/docs/reference/status.md000066400000000000000000000015471461403617600214070ustar00rootroot00000000000000# Status Codes You can import the `status` module from `fastapi`: ```python from fastapi import status ``` `status` is provided directly by Starlette. It contains a group of named constants (variables) with integer status codes. For example: * 200: `status.HTTP_200_OK` * 403: `status.HTTP_403_FORBIDDEN` * etc. It can be convenient to quickly access HTTP (and WebSocket) status codes in your app, using autocompletion for the name without having to remember the integer status codes by memory. Read more about it in the [FastAPI docs about Response Status Code](https://fastapi.tiangolo.com/tutorial/response-status-code/). ## Example ```python from fastapi import FastAPI, status app = FastAPI() @app.get("/items/", status_code=status.HTTP_418_IM_A_TEAPOT) def read_items(): return [{"name": "Plumbus"}, {"name": "Portal Gun"}] ``` ::: fastapi.status fastapi-0.110.3/docs/en/docs/reference/templating.md000066400000000000000000000005551461403617600222260ustar00rootroot00000000000000# Templating - `Jinja2Templates` You can use the `Jinja2Templates` class to render Jinja templates. Read more about it in the [FastAPI docs for Templates](https://fastapi.tiangolo.com/advanced/templates/). You can import it directly from `fastapi.templating`: ```python from fastapi.templating import Jinja2Templates ``` ::: fastapi.templating.Jinja2Templates fastapi-0.110.3/docs/en/docs/reference/testclient.md000066400000000000000000000007021461403617600222320ustar00rootroot00000000000000# Test Client - `TestClient` You can use the `TestClient` class to test FastAPI applications without creating an actual HTTP and socket connection, just communicating directly with the FastAPI code. Read more about it in the [FastAPI docs for Testing](https://fastapi.tiangolo.com/tutorial/testing/). You can import it directly from `fastapi.testclient`: ```python from fastapi.testclient import TestClient ``` ::: fastapi.testclient.TestClient fastapi-0.110.3/docs/en/docs/reference/uploadfile.md000066400000000000000000000007301461403617600222010ustar00rootroot00000000000000# `UploadFile` class You can define *path operation function* parameters to be of the type `UploadFile` to receive files from the request. You can import it directly from `fastapi`: ```python from fastapi import UploadFile ``` ::: fastapi.UploadFile options: members: - file - filename - size - headers - content_type - read - write - seek - close fastapi-0.110.3/docs/en/docs/reference/websockets.md000066400000000000000000000032311461403617600222250ustar00rootroot00000000000000# WebSockets When defining WebSockets, you normally declare a parameter of type `WebSocket` and with it you can read data from the client and send data to it. It is provided directly by Starlette, but you can import it from `fastapi`: ```python from fastapi import WebSocket ``` !!! tip When you want to define dependencies that should be compatible with both HTTP and WebSockets, you can define a parameter that takes an `HTTPConnection` instead of a `Request` or a `WebSocket`. ::: fastapi.WebSocket options: members: - scope - app - url - base_url - headers - query_params - path_params - cookies - client - state - url_for - client_state - application_state - receive - send - accept - receive_text - receive_bytes - receive_json - iter_text - iter_bytes - iter_json - send_text - send_bytes - send_json - close When a client disconnects, a `WebSocketDisconnect` exception is raised, you can catch it. You can import it directly form `fastapi`: ```python from fastapi import WebSocketDisconnect ``` ::: fastapi.WebSocketDisconnect ## WebSockets - additional classes Additional classes for handling WebSockets. Provided directly by Starlette, but you can import it from `fastapi`: ```python from fastapi.websockets import WebSocketDisconnect, WebSocketState ``` ::: fastapi.websockets.WebSocketDisconnect ::: fastapi.websockets.WebSocketState fastapi-0.110.3/docs/en/docs/release-notes.md000066400000000000000000014041061461403617600206730ustar00rootroot00000000000000--- hide: - navigation --- # Release Notes ## 0.110.3 ## Latest Changes ### Docs * 📝 Update references to Python version, FastAPI supports all the current versions, no need to make the version explicit. PR [#11496](https://github.com/tiangolo/fastapi/pull/11496) by [@tiangolo](https://github.com/tiangolo). * ✏️ Fix typo in `fastapi/security/api_key.py`. PR [#11481](https://github.com/tiangolo/fastapi/pull/11481) by [@ch33zer](https://github.com/ch33zer). * ✏️ Fix typo in `security/http.py`. PR [#11455](https://github.com/tiangolo/fastapi/pull/11455) by [@omarmoo5](https://github.com/omarmoo5). ### Translations * 🌐 Add Traditional Chinese translation for `docs/zh-hant/benchmarks.md`. PR [#11484](https://github.com/tiangolo/fastapi/pull/11484) by [@KNChiu](https://github.com/KNChiu). * 🌐 Update Chinese translation for `docs/zh/docs/fastapi-people.md`. PR [#11476](https://github.com/tiangolo/fastapi/pull/11476) by [@billzhong](https://github.com/billzhong). * 🌐 Add Chinese translation for `docs/zh/docs/how-to/index.md` and `docs/zh/docs/how-to/general.md`. PR [#11443](https://github.com/tiangolo/fastapi/pull/11443) by [@billzhong](https://github.com/billzhong). * 🌐 Add Spanish translation for cookie-params `docs/es/docs/tutorial/cookie-params.md`. PR [#11410](https://github.com/tiangolo/fastapi/pull/11410) by [@fabianfalon](https://github.com/fabianfalon). ### Internal * ⬆ Bump mkdocstrings[python] from 0.23.0 to 0.24.3. PR [#11469](https://github.com/tiangolo/fastapi/pull/11469) by [@dependabot[bot]](https://github.com/apps/dependabot). * 🔨 Update internal scripts and remove unused ones. PR [#11499](https://github.com/tiangolo/fastapi/pull/11499) by [@tiangolo](https://github.com/tiangolo). * 🔧 Migrate from Hatch to PDM for the internal build. PR [#11498](https://github.com/tiangolo/fastapi/pull/11498) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade MkDocs Material and re-enable cards. PR [#11466](https://github.com/tiangolo/fastapi/pull/11466) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump pillow from 10.2.0 to 10.3.0. PR [#11403](https://github.com/tiangolo/fastapi/pull/11403) by [@dependabot[bot]](https://github.com/apps/dependabot). * 🔧 Ungroup dependabot updates. PR [#11465](https://github.com/tiangolo/fastapi/pull/11465) by [@tiangolo](https://github.com/tiangolo). ## 0.110.2 ### Fixes * 🐛 Fix support for query parameters with list types, handle JSON encoding Pydantic `UndefinedType`. PR [#9929](https://github.com/tiangolo/fastapi/pull/9929) by [@arjwilliams](https://github.com/arjwilliams). ### Refactors * ♻️ Simplify Pydantic configs in OpenAPI models in `fastapi/openapi/models.py`. PR [#10886](https://github.com/tiangolo/fastapi/pull/10886) by [@JoeTanto2](https://github.com/JoeTanto2). * ✨ Add support for Pydantic's 2.7 new deprecated Field parameter, remove URL from validation errors response. PR [#11461](https://github.com/tiangolo/fastapi/pull/11461) by [@tiangolo](https://github.com/tiangolo). ### Docs * 📝 Fix types in examples under `docs_src/extra_data_types`. PR [#10535](https://github.com/tiangolo/fastapi/pull/10535) by [@nilslindemann](https://github.com/nilslindemann). * 📝 Update references to UJSON. PR [#11464](https://github.com/tiangolo/fastapi/pull/11464) by [@tiangolo](https://github.com/tiangolo). * 📝 Tweak docs and translations links, typos, format. PR [#11389](https://github.com/tiangolo/fastapi/pull/11389) by [@nilslindemann](https://github.com/nilslindemann). * 📝 Fix typo in `docs/es/docs/async.md`. PR [#11400](https://github.com/tiangolo/fastapi/pull/11400) by [@fabianfalon](https://github.com/fabianfalon). * 📝 Update OpenAPI client generation docs to use `@hey-api/openapi-ts`. PR [#11339](https://github.com/tiangolo/fastapi/pull/11339) by [@jordanshatford](https://github.com/jordanshatford). ### Translations * 🌐 Update Chinese translation for `docs/zh/docs/index.html`. PR [#11430](https://github.com/tiangolo/fastapi/pull/11430) by [@waketzheng](https://github.com/waketzheng). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md`. PR [#11411](https://github.com/tiangolo/fastapi/pull/11411) by [@anton2yakovlev](https://github.com/anton2yakovlev). * 🌐 Add Portuguese translations for `learn/index.md` `resources/index.md` `help/index.md` `about/index.md`. PR [#10807](https://github.com/tiangolo/fastapi/pull/10807) by [@nazarepiedady](https://github.com/nazarepiedady). * 🌐 Update Russian translations for deployments docs. PR [#11271](https://github.com/tiangolo/fastapi/pull/11271) by [@Lufa1u](https://github.com/Lufa1u). * 🌐 Add Bengali translations for `docs/bn/docs/python-types.md`. PR [#11376](https://github.com/tiangolo/fastapi/pull/11376) by [@imtiaz101325](https://github.com/imtiaz101325). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/security/simple-oauth2.md`. PR [#5744](https://github.com/tiangolo/fastapi/pull/5744) by [@KdHyeon0661](https://github.com/KdHyeon0661). * 🌐 Add Korean translation for `docs/ko/docs/help-fastapi.md`. PR [#4139](https://github.com/tiangolo/fastapi/pull/4139) by [@kty4119](https://github.com/kty4119). * 🌐 Add Korean translation for `docs/ko/docs/advanced/events.md`. PR [#5087](https://github.com/tiangolo/fastapi/pull/5087) by [@pers0n4](https://github.com/pers0n4). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/path-operation-configuration.md`. PR [#1954](https://github.com/tiangolo/fastapi/pull/1954) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/request-forms-and-files.md`. PR [#1946](https://github.com/tiangolo/fastapi/pull/1946) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/dependencies/dependencies-with-yield.md`. PR [#10532](https://github.com/tiangolo/fastapi/pull/10532) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/debugging.md`. PR [#5695](https://github.com/tiangolo/fastapi/pull/5695) by [@JungWooGeon](https://github.com/JungWooGeon). ### Internal * ⬆️ Upgrade version of typer for docs. PR [#11393](https://github.com/tiangolo/fastapi/pull/11393) by [@tiangolo](https://github.com/tiangolo). ## 0.110.1 ### Fixes * 🐛 Fix parameterless `Depends()` with generics. PR [#9479](https://github.com/tiangolo/fastapi/pull/9479) by [@nzig](https://github.com/nzig). ### Refactors * ♻️ Update mypy. PR [#11049](https://github.com/tiangolo/fastapi/pull/11049) by [@k0t3n](https://github.com/k0t3n). * ♻️ Simplify string format with f-strings in `fastapi/applications.py`. PR [#11335](https://github.com/tiangolo/fastapi/pull/11335) by [@igeni](https://github.com/igeni). ### Upgrades * ⬆️ Upgrade Starlette to >=0.37.2,<0.38.0, remove Starlette filterwarning for internal tests. PR [#11266](https://github.com/tiangolo/fastapi/pull/11266) by [@nothielf](https://github.com/nothielf). ### Docs * 📝 Tweak docs and translations links and remove old docs translations. PR [#11381](https://github.com/tiangolo/fastapi/pull/11381) by [@tiangolo](https://github.com/tiangolo). * ✏️ Fix typo in `fastapi/security/oauth2.py`. PR [#11368](https://github.com/tiangolo/fastapi/pull/11368) by [@shandongbinzhou](https://github.com/shandongbinzhou). * 📝 Update links to Pydantic docs to point to new website. PR [#11328](https://github.com/tiangolo/fastapi/pull/11328) by [@alejsdev](https://github.com/alejsdev). * ✏️ Fix typo in `docs/en/docs/tutorial/extra-models.md`. PR [#11329](https://github.com/tiangolo/fastapi/pull/11329) by [@alejsdev](https://github.com/alejsdev). * 📝 Update `project-generation.md`. PR [#11326](https://github.com/tiangolo/fastapi/pull/11326) by [@alejsdev](https://github.com/alejsdev). * 📝 Update External Links. PR [#11327](https://github.com/tiangolo/fastapi/pull/11327) by [@alejsdev](https://github.com/alejsdev). * 🔥 Remove link to Pydantic's benchmark, on other i18n pages.. PR [#11224](https://github.com/tiangolo/fastapi/pull/11224) by [@hirotoKirimaru](https://github.com/hirotoKirimaru). * ✏️ Fix typos in docstrings. PR [#11295](https://github.com/tiangolo/fastapi/pull/11295) by [@davidhuser](https://github.com/davidhuser). * 🛠️ Improve Node.js script in docs to generate TypeScript clients. PR [#11293](https://github.com/tiangolo/fastapi/pull/11293) by [@alejsdev](https://github.com/alejsdev). * 📝 Update examples for tests to replace "inexistent" for "nonexistent". PR [#11220](https://github.com/tiangolo/fastapi/pull/11220) by [@Homesteady](https://github.com/Homesteady). * 📝 Update `python-multipart` GitHub link in all docs from `https://andrew-d.github.io/python-multipart/` to `https://github.com/Kludex/python-multipart`. PR [#11239](https://github.com/tiangolo/fastapi/pull/11239) by [@joshjhans](https://github.com/joshjhans). ### Translations * 🌐 Add German translation for `docs/de/docs/tutorial/response-status-code.md`. PR [#10357](https://github.com/tiangolo/fastapi/pull/10357) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/query-params.md`. PR [#3480](https://github.com/tiangolo/fastapi/pull/3480) by [@jaystone776](https://github.com/jaystone776). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/body.md`. PR [#3481](https://github.com/tiangolo/fastapi/pull/3481) by [@jaystone776](https://github.com/jaystone776). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/path-params.md`. PR [#3479](https://github.com/tiangolo/fastapi/pull/3479) by [@jaystone776](https://github.com/jaystone776). * 🌐 Update Chinese translation for `docs/tutorial/body-fields.md`. PR [#3496](https://github.com/tiangolo/fastapi/pull/3496) by [@jaystone776](https://github.com/jaystone776). * 🌐 Update Chinese translation for `docs/tutorial/extra-models.md`. PR [#3497](https://github.com/tiangolo/fastapi/pull/3497) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/metadata.md`. PR [#2667](https://github.com/tiangolo/fastapi/pull/2667) by [@tokusumi](https://github.com/tokusumi). * 🌐 Add German translation for `docs/de/docs/contributing.md`. PR [#10487](https://github.com/tiangolo/fastapi/pull/10487) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Update Japanese translation of `docs/ja/docs/tutorial/query-params.md`. PR [#10808](https://github.com/tiangolo/fastapi/pull/10808) by [@urushio](https://github.com/urushio). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/security/get-current-user.md`. PR [#3842](https://github.com/tiangolo/fastapi/pull/3842) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/openapi-callbacks.md`. PR [#3825](https://github.com/tiangolo/fastapi/pull/3825) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/extending-openapi.md`. PR [#3823](https://github.com/tiangolo/fastapi/pull/3823) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-dependencies.md`. PR [#3819](https://github.com/tiangolo/fastapi/pull/3819) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/custom-request-and-route.md`. PR [#3816](https://github.com/tiangolo/fastapi/pull/3816) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/external-links.md`. PR [#3833](https://github.com/tiangolo/fastapi/pull/3833) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/templates.md`. PR [#3812](https://github.com/tiangolo/fastapi/pull/3812) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/sub-applications.md`. PR [#3811](https://github.com/tiangolo/fastapi/pull/3811) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/async-sql-databases.md`. PR [#3805](https://github.com/tiangolo/fastapi/pull/3805) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/middleware.md`. PR [#3804](https://github.com/tiangolo/fastapi/pull/3804) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/dataclasses.md`. PR [#3803](https://github.com/tiangolo/fastapi/pull/3803) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/using-request-directly.md`. PR [#3802](https://github.com/tiangolo/fastapi/pull/3802) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/security/http-basic-auth.md`. PR [#3801](https://github.com/tiangolo/fastapi/pull/3801) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/security/oauth2-scopes.md`. PR [#3800](https://github.com/tiangolo/fastapi/pull/3800) by [@jaystone776](https://github.com/jaystone776). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/cookie-params.md`. PR [#3486](https://github.com/tiangolo/fastapi/pull/3486) by [@jaystone776](https://github.com/jaystone776). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/header-params.md`. PR [#3487](https://github.com/tiangolo/fastapi/pull/3487) by [@jaystone776](https://github.com/jaystone776). * 🌐 Update Chinese translation for `docs/tutorial/response-status-code.md`. PR [#3498](https://github.com/tiangolo/fastapi/pull/3498) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add German translation for `docs/de/docs/tutorial/security/first-steps.md`. PR [#10432](https://github.com/tiangolo/fastapi/pull/10432) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/events.md`. PR [#10693](https://github.com/tiangolo/fastapi/pull/10693) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/deployment/cloud.md`. PR [#10746](https://github.com/tiangolo/fastapi/pull/10746) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/behind-a-proxy.md`. PR [#10675](https://github.com/tiangolo/fastapi/pull/10675) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/help-fastapi.md`. PR [#10455](https://github.com/tiangolo/fastapi/pull/10455) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Update German translation for `docs/de/docs/python-types.md`. PR [#10287](https://github.com/tiangolo/fastapi/pull/10287) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/path-params.md`. PR [#10290](https://github.com/tiangolo/fastapi/pull/10290) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/handling-errors.md`. PR [#10379](https://github.com/tiangolo/fastapi/pull/10379) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Update German translation for `docs/de/docs/index.md`. PR [#10283](https://github.com/tiangolo/fastapi/pull/10283) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/security/http-basic-auth.md`. PR [#10651](https://github.com/tiangolo/fastapi/pull/10651) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/bigger-applications.md`. PR [#10554](https://github.com/tiangolo/fastapi/pull/10554) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/path-operation-advanced-configuration.md`. PR [#10612](https://github.com/tiangolo/fastapi/pull/10612) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/static-files.md`. PR [#10584](https://github.com/tiangolo/fastapi/pull/10584) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/security/oauth2-jwt.md`. PR [#10522](https://github.com/tiangolo/fastapi/pull/10522) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/response-model.md`. PR [#10345](https://github.com/tiangolo/fastapi/pull/10345) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/extra-models.md`. PR [#10351](https://github.com/tiangolo/fastapi/pull/10351) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/body-updates.md`. PR [#10396](https://github.com/tiangolo/fastapi/pull/10396) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/alternatives.md`. PR [#10855](https://github.com/tiangolo/fastapi/pull/10855) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/templates.md`. PR [#10678](https://github.com/tiangolo/fastapi/pull/10678) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/security/oauth2-scopes.md`. PR [#10643](https://github.com/tiangolo/fastapi/pull/10643) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/async-tests.md`. PR [#10708](https://github.com/tiangolo/fastapi/pull/10708) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/metadata.md`. PR [#10581](https://github.com/tiangolo/fastapi/pull/10581) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/testing.md`. PR [#10586](https://github.com/tiangolo/fastapi/pull/10586) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/schema-extra-example.md`. PR [#10597](https://github.com/tiangolo/fastapi/pull/10597) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/index.md`. PR [#10611](https://github.com/tiangolo/fastapi/pull/10611) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/response-directly.md`. PR [#10618](https://github.com/tiangolo/fastapi/pull/10618) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/additional-responses.md`. PR [#10626](https://github.com/tiangolo/fastapi/pull/10626) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/response-cookies.md`. PR [#10627](https://github.com/tiangolo/fastapi/pull/10627) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/response-headers.md`. PR [#10628](https://github.com/tiangolo/fastapi/pull/10628) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/response-change-status-code.md`. PR [#10632](https://github.com/tiangolo/fastapi/pull/10632) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/advanced-dependencies.md`. PR [#10633](https://github.com/tiangolo/fastapi/pull/10633) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/security/index.md`. PR [#10635](https://github.com/tiangolo/fastapi/pull/10635) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/using-request-directly.md`. PR [#10653](https://github.com/tiangolo/fastapi/pull/10653) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/dataclasses.md`. PR [#10667](https://github.com/tiangolo/fastapi/pull/10667) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/middleware.md`. PR [#10668](https://github.com/tiangolo/fastapi/pull/10668) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/sub-applications.md`. PR [#10671](https://github.com/tiangolo/fastapi/pull/10671) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/websockets.md`. PR [#10687](https://github.com/tiangolo/fastapi/pull/10687) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/testing-websockets.md`. PR [#10703](https://github.com/tiangolo/fastapi/pull/10703) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/testing-events.md`. PR [#10704](https://github.com/tiangolo/fastapi/pull/10704) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/testing-dependencies.md`. PR [#10706](https://github.com/tiangolo/fastapi/pull/10706) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/openapi-callbacks.md`. PR [#10710](https://github.com/tiangolo/fastapi/pull/10710) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/settings.md`. PR [#10709](https://github.com/tiangolo/fastapi/pull/10709) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/wsgi.md`. PR [#10713](https://github.com/tiangolo/fastapi/pull/10713) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/deployment/index.md`. PR [#10733](https://github.com/tiangolo/fastapi/pull/10733) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/deployment/https.md`. PR [#10737](https://github.com/tiangolo/fastapi/pull/10737) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/deployment/manually.md`. PR [#10738](https://github.com/tiangolo/fastapi/pull/10738) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/deployment/concepts.md`. PR [#10744](https://github.com/tiangolo/fastapi/pull/10744) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Update German translation for `docs/de/docs/features.md`. PR [#10284](https://github.com/tiangolo/fastapi/pull/10284) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/deployment/server-workers.md`. PR [#10747](https://github.com/tiangolo/fastapi/pull/10747) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/deployment/docker.md`. PR [#10759](https://github.com/tiangolo/fastapi/pull/10759) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/how-to/index.md`. PR [#10769](https://github.com/tiangolo/fastapi/pull/10769) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/how-to/general.md`. PR [#10770](https://github.com/tiangolo/fastapi/pull/10770) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/how-to/graphql.md`. PR [#10788](https://github.com/tiangolo/fastapi/pull/10788) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/how-to/custom-request-and-route.md`. PR [#10789](https://github.com/tiangolo/fastapi/pull/10789) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/how-to/conditional-openapi.md`. PR [#10790](https://github.com/tiangolo/fastapi/pull/10790) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/how-to/separate-openapi-schemas.md`. PR [#10796](https://github.com/tiangolo/fastapi/pull/10796) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/how-to/configure-swagger-ui.md`. PR [#10804](https://github.com/tiangolo/fastapi/pull/10804) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/how-to/custom-docs-ui-assets.md`. PR [#10803](https://github.com/tiangolo/fastapi/pull/10803) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/parameters.md`. PR [#10814](https://github.com/tiangolo/fastapi/pull/10814) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/status.md`. PR [#10815](https://github.com/tiangolo/fastapi/pull/10815) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/uploadfile.md`. PR [#10816](https://github.com/tiangolo/fastapi/pull/10816) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/exceptions.md`. PR [#10817](https://github.com/tiangolo/fastapi/pull/10817) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/dependencies.md`. PR [#10818](https://github.com/tiangolo/fastapi/pull/10818) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/apirouter.md`. PR [#10819](https://github.com/tiangolo/fastapi/pull/10819) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/websockets.md`. PR [#10822](https://github.com/tiangolo/fastapi/pull/10822) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/httpconnection.md`. PR [#10823](https://github.com/tiangolo/fastapi/pull/10823) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/response.md`. PR [#10824](https://github.com/tiangolo/fastapi/pull/10824) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/middleware.md`. PR [#10837](https://github.com/tiangolo/fastapi/pull/10837) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/openapi/*.md`. PR [#10838](https://github.com/tiangolo/fastapi/pull/10838) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/security/index.md`. PR [#10839](https://github.com/tiangolo/fastapi/pull/10839) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/staticfiles.md`. PR [#10841](https://github.com/tiangolo/fastapi/pull/10841) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/testclient.md`. PR [#10843](https://github.com/tiangolo/fastapi/pull/10843) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/project-generation.md`. PR [#10851](https://github.com/tiangolo/fastapi/pull/10851) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/history-design-future.md`. PR [#10865](https://github.com/tiangolo/fastapi/pull/10865) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/dependencies/dependencies-with-yield.md`. PR [#10422](https://github.com/tiangolo/fastapi/pull/10422) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/dependencies/global-dependencies.md`. PR [#10420](https://github.com/tiangolo/fastapi/pull/10420) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Update German translation for `docs/de/docs/fastapi-people.md`. PR [#10285](https://github.com/tiangolo/fastapi/pull/10285) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/dependencies/sub-dependencies.md`. PR [#10409](https://github.com/tiangolo/fastapi/pull/10409) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/security/index.md`. PR [#10429](https://github.com/tiangolo/fastapi/pull/10429) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md`. PR [#10411](https://github.com/tiangolo/fastapi/pull/10411) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/extra-data-types.md`. PR [#10534](https://github.com/tiangolo/fastapi/pull/10534) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/security/simple-oauth2.md`. PR [#10504](https://github.com/tiangolo/fastapi/pull/10504) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/security/get-current-user.md`. PR [#10439](https://github.com/tiangolo/fastapi/pull/10439) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/request-forms-and-files.md`. PR [#10368](https://github.com/tiangolo/fastapi/pull/10368) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/encoder.md`. PR [#10385](https://github.com/tiangolo/fastapi/pull/10385) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/request-forms.md`. PR [#10361](https://github.com/tiangolo/fastapi/pull/10361) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/deployment/versions.md`. PR [#10491](https://github.com/tiangolo/fastapi/pull/10491) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/async.md`. PR [#10449](https://github.com/tiangolo/fastapi/pull/10449) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/cookie-params.md`. PR [#10323](https://github.com/tiangolo/fastapi/pull/10323) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/dependencies/classes-as-dependencies.md`. PR [#10407](https://github.com/tiangolo/fastapi/pull/10407) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/dependencies/index.md`. PR [#10399](https://github.com/tiangolo/fastapi/pull/10399) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/header-params.md`. PR [#10326](https://github.com/tiangolo/fastapi/pull/10326) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/path-params-numeric-validations.md`. PR [#10307](https://github.com/tiangolo/fastapi/pull/10307) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/query-params-str-validations.md`. PR [#10304](https://github.com/tiangolo/fastapi/pull/10304) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/request-files.md`. PR [#10364](https://github.com/tiangolo/fastapi/pull/10364) by [@nilslindemann](https://github.com/nilslindemann). * :globe_with_meridians: Add Portuguese translation for `docs/pt/docs/advanced/templates.md`. PR [#11338](https://github.com/tiangolo/fastapi/pull/11338) by [@SamuelBFavarin](https://github.com/SamuelBFavarin). * 🌐 Add Bengali translations for `docs/bn/docs/learn/index.md`. PR [#11337](https://github.com/tiangolo/fastapi/pull/11337) by [@imtiaz101325](https://github.com/imtiaz101325). * 🌐 Fix Korean translation for `docs/ko/docs/index.md`. PR [#11296](https://github.com/tiangolo/fastapi/pull/11296) by [@choi-haram](https://github.com/choi-haram). * 🌐 Add Korean translation for `docs/ko/docs/about/index.md`. PR [#11299](https://github.com/tiangolo/fastapi/pull/11299) by [@choi-haram](https://github.com/choi-haram). * 🌐 Add Korean translation for `docs/ko/docs/advanced/index.md`. PR [#9613](https://github.com/tiangolo/fastapi/pull/9613) by [@ElliottLarsen](https://github.com/ElliottLarsen). * 🌐 Add German translation for `docs/de/docs/how-to/extending-openapi.md`. PR [#10794](https://github.com/tiangolo/fastapi/pull/10794) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/metadata.md`. PR [#11286](https://github.com/tiangolo/fastapi/pull/11286) by [@jackleeio](https://github.com/jackleeio). * 🌐 Update Chinese translation for `docs/zh/docs/contributing.md`. PR [#10887](https://github.com/tiangolo/fastapi/pull/10887) by [@Aruelius](https://github.com/Aruelius). * 🌐 Add Azerbaijani translation for `docs/az/docs/fastapi-people.md`. PR [#11195](https://github.com/tiangolo/fastapi/pull/11195) by [@vusallyv](https://github.com/vusallyv). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/dependencies/index.md`. PR [#11223](https://github.com/tiangolo/fastapi/pull/11223) by [@kohiry](https://github.com/kohiry). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/query-params.md`. PR [#11242](https://github.com/tiangolo/fastapi/pull/11242) by [@jackleeio](https://github.com/jackleeio). * 🌐 Add Azerbaijani translation for `docs/az/learn/index.md`. PR [#11192](https://github.com/tiangolo/fastapi/pull/11192) by [@vusallyv](https://github.com/vusallyv). ### Internal * 👥 Update FastAPI People. PR [#11387](https://github.com/tiangolo/fastapi/pull/11387) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump actions/cache from 3 to 4. PR [#10988](https://github.com/tiangolo/fastapi/pull/10988) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump pypa/gh-action-pypi-publish from 1.8.11 to 1.8.14. PR [#11318](https://github.com/tiangolo/fastapi/pull/11318) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump pillow from 10.1.0 to 10.2.0. PR [#11011](https://github.com/tiangolo/fastapi/pull/11011) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump black from 23.3.0 to 24.3.0. PR [#11325](https://github.com/tiangolo/fastapi/pull/11325) by [@dependabot[bot]](https://github.com/apps/dependabot). * 👷 Add cron to run test once a week on monday. PR [#11377](https://github.com/tiangolo/fastapi/pull/11377) by [@estebanx64](https://github.com/estebanx64). * ➕ Replace mkdocs-markdownextradata-plugin with mkdocs-macros-plugin. PR [#11383](https://github.com/tiangolo/fastapi/pull/11383) by [@tiangolo](https://github.com/tiangolo). * 👷 Disable MkDocs insiders social plugin while an issue in MkDocs Material is handled. PR [#11373](https://github.com/tiangolo/fastapi/pull/11373) by [@tiangolo](https://github.com/tiangolo). * 👷 Fix logic for when to install and use MkDocs Insiders. PR [#11372](https://github.com/tiangolo/fastapi/pull/11372) by [@tiangolo](https://github.com/tiangolo). * 👷 Do not use Python packages cache for publish. PR [#11366](https://github.com/tiangolo/fastapi/pull/11366) by [@tiangolo](https://github.com/tiangolo). * 👷 Add CI to test sdists for redistribution (e.g. Linux distros). PR [#11365](https://github.com/tiangolo/fastapi/pull/11365) by [@tiangolo](https://github.com/tiangolo). * 👷 Update build-docs GitHub Action path filter. PR [#11354](https://github.com/tiangolo/fastapi/pull/11354) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update Ruff config, add extra ignore rule from SQLModel. PR [#11353](https://github.com/tiangolo/fastapi/pull/11353) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade configuration for Ruff v0.2.0. PR [#11075](https://github.com/tiangolo/fastapi/pull/11075) by [@charliermarsh](https://github.com/charliermarsh). * 🔧 Update sponsors, add MongoDB. PR [#11346](https://github.com/tiangolo/fastapi/pull/11346) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump dorny/paths-filter from 2 to 3. PR [#11028](https://github.com/tiangolo/fastapi/pull/11028) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump dawidd6/action-download-artifact from 3.0.0 to 3.1.4. PR [#11310](https://github.com/tiangolo/fastapi/pull/11310) by [@dependabot[bot]](https://github.com/apps/dependabot). * ♻️ Refactor computing FastAPI People, include 3 months, 6 months, 1 year, based on comment date, not discussion date. PR [#11304](https://github.com/tiangolo/fastapi/pull/11304) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People. PR [#11228](https://github.com/tiangolo/fastapi/pull/11228) by [@tiangolo](https://github.com/tiangolo). * 🔥 Remove Jina AI QA Bot from the docs. PR [#11268](https://github.com/tiangolo/fastapi/pull/11268) by [@nan-wang](https://github.com/nan-wang). * 🔧 Update sponsors, remove Jina, remove Powens, move TestDriven.io. PR [#11213](https://github.com/tiangolo/fastapi/pull/11213) by [@tiangolo](https://github.com/tiangolo). ## 0.110.0 ### Breaking Changes * 🐛 Fix unhandled growing memory for internal server errors, refactor dependencies with `yield` and `except` to require raising again as in regular Python. PR [#11191](https://github.com/tiangolo/fastapi/pull/11191) by [@tiangolo](https://github.com/tiangolo). * This is a breaking change (and only slightly) if you used dependencies with `yield`, used `except` in those dependencies, and didn't raise again. * This was reported internally by [@rushilsrivastava](https://github.com/rushilsrivastava) as a memory leak when the server had unhandled exceptions that would produce internal server errors, the memory allocated before that point would not be released. * Read the new docs: [Dependencies with `yield` and `except`](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-with-yield/#dependencies-with-yield-and-except). In short, if you had dependencies that looked like: ```Python def my_dep(): try: yield except SomeException: pass ``` Now you need to make sure you raise again after `except`, just as you would in regular Python: ```Python def my_dep(): try: yield except SomeException: raise ``` ### Docs * ✏️ Fix minor typos in `docs/ko/docs/`. PR [#11126](https://github.com/tiangolo/fastapi/pull/11126) by [@KaniKim](https://github.com/KaniKim). * ✏️ Fix minor typo in `fastapi/applications.py`. PR [#11099](https://github.com/tiangolo/fastapi/pull/11099) by [@JacobHayes](https://github.com/JacobHayes). ### Translations * 🌐 Add German translation for `docs/de/docs/reference/background.md`. PR [#10820](https://github.com/tiangolo/fastapi/pull/10820) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/templating.md`. PR [#10842](https://github.com/tiangolo/fastapi/pull/10842) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/external-links.md`. PR [#10852](https://github.com/tiangolo/fastapi/pull/10852) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Update Turkish translation for `docs/tr/docs/tutorial/query-params.md`. PR [#11162](https://github.com/tiangolo/fastapi/pull/11162) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add German translation for `docs/de/docs/reference/encoders.md`. PR [#10840](https://github.com/tiangolo/fastapi/pull/10840) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/responses.md`. PR [#10825](https://github.com/tiangolo/fastapi/pull/10825) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/reference/request.md`. PR [#10821](https://github.com/tiangolo/fastapi/pull/10821) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Turkish translation for `docs/tr/docs/tutorial/query-params.md`. PR [#11078](https://github.com/tiangolo/fastapi/pull/11078) by [@emrhnsyts](https://github.com/emrhnsyts). * 🌐 Add German translation for `docs/de/docs/reference/fastapi.md`. PR [#10813](https://github.com/tiangolo/fastapi/pull/10813) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/newsletter.md`. PR [#10853](https://github.com/tiangolo/fastapi/pull/10853) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Traditional Chinese translation for `docs/zh-hant/docs/learn/index.md`. PR [#11142](https://github.com/tiangolo/fastapi/pull/11142) by [@hsuanchi](https://github.com/hsuanchi). * 🌐 Add Korean translation for `/docs/ko/docs/tutorial/dependencies/global-dependencies.md`. PR [#11123](https://github.com/tiangolo/fastapi/pull/11123) by [@riroan](https://github.com/riroan). * 🌐 Add Korean translation for `/docs/ko/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md`. PR [#11124](https://github.com/tiangolo/fastapi/pull/11124) by [@riroan](https://github.com/riroan). * 🌐 Add Korean translation for `/docs/ko/docs/tutorial/schema-extra-example.md`. PR [#11121](https://github.com/tiangolo/fastapi/pull/11121) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Korean translation for `/docs/ko/docs/tutorial/body-fields.md`. PR [#11112](https://github.com/tiangolo/fastapi/pull/11112) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Korean translation for `/docs/ko/docs/tutorial/cookie-params.md`. PR [#11118](https://github.com/tiangolo/fastapi/pull/11118) by [@riroan](https://github.com/riroan). * 🌐 Update Korean translation for `/docs/ko/docs/dependencies/index.md`. PR [#11114](https://github.com/tiangolo/fastapi/pull/11114) by [@KaniKim](https://github.com/KaniKim). * 🌐 Update Korean translation for `/docs/ko/docs/deployment/docker.md`. PR [#11113](https://github.com/tiangolo/fastapi/pull/11113) by [@KaniKim](https://github.com/KaniKim). * 🌐 Update Turkish translation for `docs/tr/docs/tutorial/first-steps.md`. PR [#11094](https://github.com/tiangolo/fastapi/pull/11094) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Spanish translation for `docs/es/docs/advanced/security/index.md`. PR [#2278](https://github.com/tiangolo/fastapi/pull/2278) by [@Xaraxx](https://github.com/Xaraxx). * 🌐 Add Spanish translation for `docs/es/docs/advanced/response-headers.md`. PR [#2276](https://github.com/tiangolo/fastapi/pull/2276) by [@Xaraxx](https://github.com/Xaraxx). * 🌐 Add Spanish translation for `docs/es/docs/deployment/index.md` and `~/deployment/versions.md`. PR [#9669](https://github.com/tiangolo/fastapi/pull/9669) by [@pabloperezmoya](https://github.com/pabloperezmoya). * 🌐 Add Spanish translation for `docs/es/docs/benchmarks.md`. PR [#10928](https://github.com/tiangolo/fastapi/pull/10928) by [@pablocm83](https://github.com/pablocm83). * 🌐 Add Spanish translation for `docs/es/docs/advanced/response-change-status-code.md`. PR [#11100](https://github.com/tiangolo/fastapi/pull/11100) by [@alejsdev](https://github.com/alejsdev). ## 0.109.2 ### Upgrades * ⬆️ Upgrade version of Starlette to `>= 0.36.3`. PR [#11086](https://github.com/tiangolo/fastapi/pull/11086) by [@tiangolo](https://github.com/tiangolo). ### Translations * 🌐 Update Turkish translation for `docs/tr/docs/fastapi-people.md`. PR [#10547](https://github.com/tiangolo/fastapi/pull/10547) by [@alperiox](https://github.com/alperiox). ### Internal * 🍱 Add new FastAPI logo. PR [#11090](https://github.com/tiangolo/fastapi/pull/11090) by [@tiangolo](https://github.com/tiangolo). ## 0.109.1 ### Security fixes * ⬆️ Upgrade minimum version of `python-multipart` to `>=0.0.7` to fix a vulnerability when using form data with a ReDos attack. You can also simply upgrade `python-multipart`. Read more in the [advisory: Content-Type Header ReDoS](https://github.com/tiangolo/fastapi/security/advisories/GHSA-qf9m-vfgh-m389). ### Features * ✨ Include HTTP 205 in status codes with no body. PR [#10969](https://github.com/tiangolo/fastapi/pull/10969) by [@tiangolo](https://github.com/tiangolo). ### Refactors * ✅ Refactor tests for duplicate operation ID generation for compatibility with other tools running the FastAPI test suite. PR [#10876](https://github.com/tiangolo/fastapi/pull/10876) by [@emmettbutler](https://github.com/emmettbutler). * ♻️ Simplify string format with f-strings in `fastapi/utils.py`. PR [#10576](https://github.com/tiangolo/fastapi/pull/10576) by [@eukub](https://github.com/eukub). * 🔧 Fix Ruff configuration unintentionally enabling and re-disabling mccabe complexity check. PR [#10893](https://github.com/tiangolo/fastapi/pull/10893) by [@jiridanek](https://github.com/jiridanek). * ✅ Re-enable test in `tests/test_tutorial/test_header_params/test_tutorial003.py` after fix in Starlette. PR [#10904](https://github.com/tiangolo/fastapi/pull/10904) by [@ooknimm](https://github.com/ooknimm). ### Docs * 📝 Tweak wording in `help-fastapi.md`. PR [#11040](https://github.com/tiangolo/fastapi/pull/11040) by [@tiangolo](https://github.com/tiangolo). * 📝 Tweak docs for Behind a Proxy. PR [#11038](https://github.com/tiangolo/fastapi/pull/11038) by [@tiangolo](https://github.com/tiangolo). * 📝 Add External Link: 10 Tips for adding SQLAlchemy to FastAPI. PR [#11036](https://github.com/tiangolo/fastapi/pull/11036) by [@Donnype](https://github.com/Donnype). * 📝 Add External Link: Tips on migrating from Flask to FastAPI and vice-versa. PR [#11029](https://github.com/tiangolo/fastapi/pull/11029) by [@jtemporal](https://github.com/jtemporal). * 📝 Deprecate old tutorials: Peewee, Couchbase, encode/databases. PR [#10979](https://github.com/tiangolo/fastapi/pull/10979) by [@tiangolo](https://github.com/tiangolo). * ✏️ Fix typo in `fastapi/security/oauth2.py`. PR [#10972](https://github.com/tiangolo/fastapi/pull/10972) by [@RafalSkolasinski](https://github.com/RafalSkolasinski). * 📝 Update `HTTPException` details in `docs/en/docs/tutorial/handling-errors.md`. PR [#5418](https://github.com/tiangolo/fastapi/pull/5418) by [@papb](https://github.com/papb). * ✏️ A few tweaks in `docs/de/docs/tutorial/first-steps.md`. PR [#10959](https://github.com/tiangolo/fastapi/pull/10959) by [@nilslindemann](https://github.com/nilslindemann). * ✏️ Fix link in `docs/en/docs/advanced/async-tests.md`. PR [#10960](https://github.com/tiangolo/fastapi/pull/10960) by [@nilslindemann](https://github.com/nilslindemann). * ✏️ Fix typos for Spanish documentation. PR [#10957](https://github.com/tiangolo/fastapi/pull/10957) by [@jlopezlira](https://github.com/jlopezlira). * 📝 Add warning about lifespan functions and backwards compatibility with events. PR [#10734](https://github.com/tiangolo/fastapi/pull/10734) by [@jacob-indigo](https://github.com/jacob-indigo). * ✏️ Fix broken link in `docs/tutorial/sql-databases.md` in several languages. PR [#10716](https://github.com/tiangolo/fastapi/pull/10716) by [@theoohoho](https://github.com/theoohoho). * ✏️ Remove broken links from `external_links.yml`. PR [#10943](https://github.com/tiangolo/fastapi/pull/10943) by [@Torabek](https://github.com/Torabek). * 📝 Update template docs with more info about `url_for`. PR [#5937](https://github.com/tiangolo/fastapi/pull/5937) by [@EzzEddin](https://github.com/EzzEddin). * 📝 Update usage of Token model in security docs. PR [#9313](https://github.com/tiangolo/fastapi/pull/9313) by [@piotrszacilowski](https://github.com/piotrszacilowski). * ✏️ Update highlighted line in `docs/en/docs/tutorial/bigger-applications.md`. PR [#5490](https://github.com/tiangolo/fastapi/pull/5490) by [@papb](https://github.com/papb). * 📝 Add External Link: Explore How to Effectively Use JWT With FastAPI. PR [#10212](https://github.com/tiangolo/fastapi/pull/10212) by [@aanchlia](https://github.com/aanchlia). * 📝 Add hyperlink to `docs/en/docs/tutorial/static-files.md`. PR [#10243](https://github.com/tiangolo/fastapi/pull/10243) by [@hungtsetse](https://github.com/hungtsetse). * 📝 Add External Link: Instrument a FastAPI service adding tracing with OpenTelemetry and send/show traces in Grafana Tempo. PR [#9440](https://github.com/tiangolo/fastapi/pull/9440) by [@softwarebloat](https://github.com/softwarebloat). * 📝 Review and rewording of `en/docs/contributing.md`. PR [#10480](https://github.com/tiangolo/fastapi/pull/10480) by [@nilslindemann](https://github.com/nilslindemann). * 📝 Add External Link: ML serving and monitoring with FastAPI and Evidently. PR [#9701](https://github.com/tiangolo/fastapi/pull/9701) by [@mnrozhkov](https://github.com/mnrozhkov). * 📝 Reword in docs, from "have in mind" to "keep in mind". PR [#10376](https://github.com/tiangolo/fastapi/pull/10376) by [@malicious](https://github.com/malicious). * 📝 Add External Link: Talk by Jeny Sadadia. PR [#10265](https://github.com/tiangolo/fastapi/pull/10265) by [@JenySadadia](https://github.com/JenySadadia). * 📝 Add location info to `tutorial/bigger-applications.md`. PR [#10552](https://github.com/tiangolo/fastapi/pull/10552) by [@nilslindemann](https://github.com/nilslindemann). * ✏️ Fix Pydantic method name in `docs/en/docs/advanced/path-operation-advanced-configuration.md`. PR [#10826](https://github.com/tiangolo/fastapi/pull/10826) by [@ahmedabdou14](https://github.com/ahmedabdou14). ### Translations * 🌐 Add Spanish translation for `docs/es/docs/external-links.md`. PR [#10933](https://github.com/tiangolo/fastapi/pull/10933) by [@pablocm83](https://github.com/pablocm83). * 🌐 Update Korean translation for `docs/ko/docs/tutorial/first-steps.md`, `docs/ko/docs/tutorial/index.md`, `docs/ko/docs/tutorial/path-params.md`, and `docs/ko/docs/tutorial/query-params.md`. PR [#4218](https://github.com/tiangolo/fastapi/pull/4218) by [@SnowSuno](https://github.com/SnowSuno). * 🌐 Add Chinese translation for `docs/zh/docs/tutorial/dependencies/dependencies-with-yield.md`. PR [#10870](https://github.com/tiangolo/fastapi/pull/10870) by [@zhiquanchi](https://github.com/zhiquanchi). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/concepts.md`. PR [#10282](https://github.com/tiangolo/fastapi/pull/10282) by [@xzmeng](https://github.com/xzmeng). * 🌐 Add Azerbaijani translation for `docs/az/docs/index.md`. PR [#11047](https://github.com/tiangolo/fastapi/pull/11047) by [@aykhans](https://github.com/aykhans). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/middleware.md`. PR [#2829](https://github.com/tiangolo/fastapi/pull/2829) by [@JeongHyeongKim](https://github.com/JeongHyeongKim). * 🌐 Add German translation for `docs/de/docs/tutorial/body-nested-models.md`. PR [#10313](https://github.com/tiangolo/fastapi/pull/10313) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Persian translation for `docs/fa/docs/tutorial/middleware.md`. PR [#9695](https://github.com/tiangolo/fastapi/pull/9695) by [@mojtabapaso](https://github.com/mojtabapaso). * 🌐 Update Farsi translation for `docs/fa/docs/index.md`. PR [#10216](https://github.com/tiangolo/fastapi/pull/10216) by [@theonlykingpin](https://github.com/theonlykingpin). * 🌐 Add German translation for `docs/de/docs/tutorial/body-fields.md`. PR [#10310](https://github.com/tiangolo/fastapi/pull/10310) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/body.md`. PR [#10295](https://github.com/tiangolo/fastapi/pull/10295) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/body-multiple-params.md`. PR [#10308](https://github.com/tiangolo/fastapi/pull/10308) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/security/get-current-user.md`. PR [#2681](https://github.com/tiangolo/fastapi/pull/2681) by [@sh0nk](https://github.com/sh0nk). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/advanced-dependencies.md`. PR [#3798](https://github.com/tiangolo/fastapi/pull/3798) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/events.md`. PR [#3815](https://github.com/tiangolo/fastapi/pull/3815) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/behind-a-proxy.md`. PR [#3820](https://github.com/tiangolo/fastapi/pull/3820) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-events.md`. PR [#3818](https://github.com/tiangolo/fastapi/pull/3818) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-websockets.md`. PR [#3817](https://github.com/tiangolo/fastapi/pull/3817) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/testing-database.md`. PR [#3821](https://github.com/tiangolo/fastapi/pull/3821) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/deta.md`. PR [#3837](https://github.com/tiangolo/fastapi/pull/3837) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/history-design-future.md`. PR [#3832](https://github.com/tiangolo/fastapi/pull/3832) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/project-generation.md`. PR [#3831](https://github.com/tiangolo/fastapi/pull/3831) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/docker.md`. PR [#10296](https://github.com/tiangolo/fastapi/pull/10296) by [@xzmeng](https://github.com/xzmeng). * 🌐 Update Spanish translation for `docs/es/docs/features.md`. PR [#10884](https://github.com/tiangolo/fastapi/pull/10884) by [@pablocm83](https://github.com/pablocm83). * 🌐 Add Spanish translation for `docs/es/docs/newsletter.md`. PR [#10922](https://github.com/tiangolo/fastapi/pull/10922) by [@pablocm83](https://github.com/pablocm83). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/background-tasks.md`. PR [#5910](https://github.com/tiangolo/fastapi/pull/5910) by [@junah201](https://github.com/junah201). * :globe_with_meridians: Add Turkish translation for `docs/tr/docs/alternatives.md`. PR [#10502](https://github.com/tiangolo/fastapi/pull/10502) by [@alperiox](https://github.com/alperiox). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/dependencies/index.md`. PR [#10989](https://github.com/tiangolo/fastapi/pull/10989) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Korean translation for `/docs/ko/docs/tutorial/body.md`. PR [#11000](https://github.com/tiangolo/fastapi/pull/11000) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/schema-extra-example.md`. PR [#4065](https://github.com/tiangolo/fastapi/pull/4065) by [@luccasmmg](https://github.com/luccasmmg). * 🌐 Add Turkish translation for `docs/tr/docs/history-design-future.md`. PR [#11012](https://github.com/tiangolo/fastapi/pull/11012) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/resources/index.md`. PR [#11020](https://github.com/tiangolo/fastapi/pull/11020) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/how-to/index.md`. PR [#11021](https://github.com/tiangolo/fastapi/pull/11021) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add German translation for `docs/de/docs/tutorial/query-params.md`. PR [#10293](https://github.com/tiangolo/fastapi/pull/10293) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/benchmarks.md`. PR [#10866](https://github.com/tiangolo/fastapi/pull/10866) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Turkish translation for `docs/tr/docs/learn/index.md`. PR [#11014](https://github.com/tiangolo/fastapi/pull/11014) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Persian translation for `docs/fa/docs/tutorial/security/index.md`. PR [#9945](https://github.com/tiangolo/fastapi/pull/9945) by [@mojtabapaso](https://github.com/mojtabapaso). * 🌐 Add Turkish translation for `docs/tr/docs/help/index.md`. PR [#11013](https://github.com/tiangolo/fastapi/pull/11013) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/about/index.md`. PR [#11006](https://github.com/tiangolo/fastapi/pull/11006) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Update Turkish translation for `docs/tr/docs/benchmarks.md`. PR [#11005](https://github.com/tiangolo/fastapi/pull/11005) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Italian translation for `docs/it/docs/index.md`. PR [#5233](https://github.com/tiangolo/fastapi/pull/5233) by [@matteospanio](https://github.com/matteospanio). * 🌐 Add Korean translation for `docs/ko/docs/help/index.md`. PR [#10983](https://github.com/tiangolo/fastapi/pull/10983) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Korean translation for `docs/ko/docs/features.md`. PR [#10976](https://github.com/tiangolo/fastapi/pull/10976) by [@KaniKim](https://github.com/KaniKim). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/security/get-current-user.md`. PR [#5737](https://github.com/tiangolo/fastapi/pull/5737) by [@KdHyeon0661](https://github.com/KdHyeon0661). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/security/first-steps.md`. PR [#10541](https://github.com/tiangolo/fastapi/pull/10541) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/handling-errors.md`. PR [#10375](https://github.com/tiangolo/fastapi/pull/10375) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/encoder.md`. PR [#10374](https://github.com/tiangolo/fastapi/pull/10374) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/body-updates.md`. PR [#10373](https://github.com/tiangolo/fastapi/pull/10373) by [@AlertRED](https://github.com/AlertRED). * 🌐 Russian translation: updated `fastapi-people.md`.. PR [#10255](https://github.com/tiangolo/fastapi/pull/10255) by [@NiKuma0](https://github.com/NiKuma0). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/security/index.md`. PR [#5798](https://github.com/tiangolo/fastapi/pull/5798) by [@3w36zj6](https://github.com/3w36zj6). * 🌐 Add German translation for `docs/de/docs/advanced/generate-clients.md`. PR [#10725](https://github.com/tiangolo/fastapi/pull/10725) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/openapi-webhooks.md`. PR [#10712](https://github.com/tiangolo/fastapi/pull/10712) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/custom-response.md`. PR [#10624](https://github.com/tiangolo/fastapi/pull/10624) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/advanced/additional-status-codes.md`. PR [#10617](https://github.com/tiangolo/fastapi/pull/10617) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add German translation for `docs/de/docs/tutorial/middleware.md`. PR [#10391](https://github.com/tiangolo/fastapi/pull/10391) by [@JohannesJungbluth](https://github.com/JohannesJungbluth). * 🌐 Add German translation for introduction documents. PR [#10497](https://github.com/tiangolo/fastapi/pull/10497) by [@nilslindemann](https://github.com/nilslindemann). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/encoder.md`. PR [#1955](https://github.com/tiangolo/fastapi/pull/1955) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/extra-data-types.md`. PR [#1932](https://github.com/tiangolo/fastapi/pull/1932) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Turkish translation for `docs/tr/docs/async.md`. PR [#5191](https://github.com/tiangolo/fastapi/pull/5191) by [@BilalAlpaslan](https://github.com/BilalAlpaslan). * 🌐 Add Turkish translation for `docs/tr/docs/project-generation.md`. PR [#5192](https://github.com/tiangolo/fastapi/pull/5192) by [@BilalAlpaslan](https://github.com/BilalAlpaslan). * 🌐 Add Korean translation for `docs/ko/docs/deployment/docker.md`. PR [#5657](https://github.com/tiangolo/fastapi/pull/5657) by [@nearnear](https://github.com/nearnear). * 🌐 Add Korean translation for `docs/ko/docs/deployment/server-workers.md`. PR [#4935](https://github.com/tiangolo/fastapi/pull/4935) by [@jujumilk3](https://github.com/jujumilk3). * 🌐 Add Korean translation for `docs/ko/docs/deployment/index.md`. PR [#4561](https://github.com/tiangolo/fastapi/pull/4561) by [@jujumilk3](https://github.com/jujumilk3). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/path-operation-configuration.md`. PR [#3639](https://github.com/tiangolo/fastapi/pull/3639) by [@jungsu-kwon](https://github.com/jungsu-kwon). * 🌐 Modify the description of `zh` - Traditional Chinese. PR [#10889](https://github.com/tiangolo/fastapi/pull/10889) by [@cherinyy](https://github.com/cherinyy). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/static-files.md`. PR [#2957](https://github.com/tiangolo/fastapi/pull/2957) by [@jeesang7](https://github.com/jeesang7). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/response-model.md`. PR [#2766](https://github.com/tiangolo/fastapi/pull/2766) by [@hard-coders](https://github.com/hard-coders). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/body-multiple-params.md`. PR [#2461](https://github.com/tiangolo/fastapi/pull/2461) by [@PandaHun](https://github.com/PandaHun). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/query-params-str-validations.md`. PR [#2415](https://github.com/tiangolo/fastapi/pull/2415) by [@hard-coders](https://github.com/hard-coders). * 🌐 Add Korean translation for `docs/ko/docs/python-types.md`. PR [#2267](https://github.com/tiangolo/fastapi/pull/2267) by [@jrim](https://github.com/jrim). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/body-nested-models.md`. PR [#2506](https://github.com/tiangolo/fastapi/pull/2506) by [@hard-coders](https://github.com/hard-coders). * 🌐 Add Korean translation for `docs/ko/docs/learn/index.md`. PR [#10977](https://github.com/tiangolo/fastapi/pull/10977) by [@KaniKim](https://github.com/KaniKim). * 🌐 Initialize translations for Traditional Chinese. PR [#10505](https://github.com/tiangolo/fastapi/pull/10505) by [@hsuanchi](https://github.com/hsuanchi). * ✏️ Tweak the german translation of `docs/de/docs/tutorial/index.md`. PR [#10962](https://github.com/tiangolo/fastapi/pull/10962) by [@nilslindemann](https://github.com/nilslindemann). * ✏️ Fix typo error in `docs/ko/docs/tutorial/path-params.md`. PR [#10758](https://github.com/tiangolo/fastapi/pull/10758) by [@2chanhaeng](https://github.com/2chanhaeng). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/dependencies-with-yield.md`. PR [#1961](https://github.com/tiangolo/fastapi/pull/1961) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md`. PR [#1960](https://github.com/tiangolo/fastapi/pull/1960) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/sub-dependencies.md`. PR [#1959](https://github.com/tiangolo/fastapi/pull/1959) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/background-tasks.md`. PR [#2668](https://github.com/tiangolo/fastapi/pull/2668) by [@tokusumi](https://github.com/tokusumi). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/dependencies/index.md` and `docs/ja/docs/tutorial/dependencies/classes-as-dependencies.md`. PR [#1958](https://github.com/tiangolo/fastapi/pull/1958) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/response-model.md`. PR [#1938](https://github.com/tiangolo/fastapi/pull/1938) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-multiple-params.md`. PR [#1903](https://github.com/tiangolo/fastapi/pull/1903) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/path-params-numeric-validations.md`. PR [#1902](https://github.com/tiangolo/fastapi/pull/1902) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/python-types.md`. PR [#1899](https://github.com/tiangolo/fastapi/pull/1899) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/handling-errors.md`. PR [#1953](https://github.com/tiangolo/fastapi/pull/1953) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/response-status-code.md`. PR [#1942](https://github.com/tiangolo/fastapi/pull/1942) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/extra-models.md`. PR [#1941](https://github.com/tiangolo/fastapi/pull/1941) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese tranlsation for `docs/ja/docs/tutorial/schema-extra-example.md`. PR [#1931](https://github.com/tiangolo/fastapi/pull/1931) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-nested-models.md`. PR [#1930](https://github.com/tiangolo/fastapi/pull/1930) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add Japanese translation for `docs/ja/docs/tutorial/body-fields.md`. PR [#1923](https://github.com/tiangolo/fastapi/pull/1923) by [@SwftAlpc](https://github.com/SwftAlpc). * 🌐 Add German translation for `docs/de/docs/tutorial/index.md`. PR [#9502](https://github.com/tiangolo/fastapi/pull/9502) by [@fhabers21](https://github.com/fhabers21). * 🌐 Add German translation for `docs/de/docs/tutorial/background-tasks.md`. PR [#10566](https://github.com/tiangolo/fastapi/pull/10566) by [@nilslindemann](https://github.com/nilslindemann). * ✏️ Fix typo in `docs/ru/docs/index.md`. PR [#10672](https://github.com/tiangolo/fastapi/pull/10672) by [@Delitel-WEB](https://github.com/Delitel-WEB). * ✏️ Fix typos in `docs/zh/docs/tutorial/extra-data-types.md`. PR [#10727](https://github.com/tiangolo/fastapi/pull/10727) by [@HiemalBeryl](https://github.com/HiemalBeryl). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/dependencies/classes-as-dependencies.md`. PR [#10410](https://github.com/tiangolo/fastapi/pull/10410) by [@AlertRED](https://github.com/AlertRED). ### Internal * 👥 Update FastAPI People. PR [#11074](https://github.com/tiangolo/fastapi/pull/11074) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: add Coherence. PR [#11066](https://github.com/tiangolo/fastapi/pull/11066) by [@tiangolo](https://github.com/tiangolo). * 👷 Upgrade GitHub Action issue-manager. PR [#11056](https://github.com/tiangolo/fastapi/pull/11056) by [@tiangolo](https://github.com/tiangolo). * 🍱 Update sponsors: TalkPython badge. PR [#11052](https://github.com/tiangolo/fastapi/pull/11052) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: TalkPython badge image. PR [#11048](https://github.com/tiangolo/fastapi/pull/11048) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, remove Deta. PR [#11041](https://github.com/tiangolo/fastapi/pull/11041) by [@tiangolo](https://github.com/tiangolo). * 💄 Fix CSS breaking RTL languages (erroneously introduced by a previous RTL PR). PR [#11039](https://github.com/tiangolo/fastapi/pull/11039) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add Italian to `mkdocs.yml`. PR [#11016](https://github.com/tiangolo/fastapi/pull/11016) by [@alejsdev](https://github.com/alejsdev). * 🔨 Verify `mkdocs.yml` languages in CI, update `docs.py`. PR [#11009](https://github.com/tiangolo/fastapi/pull/11009) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update config in `label-approved.yml` to accept translations with 1 reviewer. PR [#11007](https://github.com/tiangolo/fastapi/pull/11007) by [@alejsdev](https://github.com/alejsdev). * 👷 Add changes-requested handling in GitHub Action issue manager. PR [#10971](https://github.com/tiangolo/fastapi/pull/10971) by [@tiangolo](https://github.com/tiangolo). * 🔧 Group dependencies on dependabot updates. PR [#10952](https://github.com/tiangolo/fastapi/pull/10952) by [@Kludex](https://github.com/Kludex). * ⬆ Bump actions/setup-python from 4 to 5. PR [#10764](https://github.com/tiangolo/fastapi/pull/10764) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump pypa/gh-action-pypi-publish from 1.8.10 to 1.8.11. PR [#10731](https://github.com/tiangolo/fastapi/pull/10731) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump dawidd6/action-download-artifact from 2.28.0 to 3.0.0. PR [#10777](https://github.com/tiangolo/fastapi/pull/10777) by [@dependabot[bot]](https://github.com/apps/dependabot). * 🔧 Add support for translations to languages with a longer code name, like `zh-hant`. PR [#10950](https://github.com/tiangolo/fastapi/pull/10950) by [@tiangolo](https://github.com/tiangolo). ## 0.109.0 ### Features * ✨ Add support for Python 3.12. PR [#10666](https://github.com/tiangolo/fastapi/pull/10666) by [@Jamim](https://github.com/Jamim). ### Upgrades * ⬆️ Upgrade Starlette to >=0.35.0,<0.36.0. PR [#10938](https://github.com/tiangolo/fastapi/pull/10938) by [@tiangolo](https://github.com/tiangolo). ### Docs * ✏️ Fix typo in `docs/en/docs/alternatives.md`. PR [#10931](https://github.com/tiangolo/fastapi/pull/10931) by [@s111d](https://github.com/s111d). * 📝 Replace `email` with `username` in `docs_src/security/tutorial007` code examples. PR [#10649](https://github.com/tiangolo/fastapi/pull/10649) by [@nilslindemann](https://github.com/nilslindemann). * 📝 Add VS Code tutorial link. PR [#10592](https://github.com/tiangolo/fastapi/pull/10592) by [@nilslindemann](https://github.com/nilslindemann). * 📝 Add notes about Pydantic v2's new `.model_dump()`. PR [#10929](https://github.com/tiangolo/fastapi/pull/10929) by [@tiangolo](https://github.com/tiangolo). * 📝 Fix broken link in `docs/en/docs/tutorial/sql-databases.md`. PR [#10765](https://github.com/tiangolo/fastapi/pull/10765) by [@HurSungYun](https://github.com/HurSungYun). * 📝 Add External Link: FastAPI application monitoring made easy. PR [#10917](https://github.com/tiangolo/fastapi/pull/10917) by [@tiangolo](https://github.com/tiangolo). * ✨ Generate automatic language names for docs translations. PR [#5354](https://github.com/tiangolo/fastapi/pull/5354) by [@jakul](https://github.com/jakul). * ✏️ Fix typos in `docs/en/docs/alternatives.md` and `docs/en/docs/tutorial/dependencies/index.md`. PR [#10906](https://github.com/tiangolo/fastapi/pull/10906) by [@s111d](https://github.com/s111d). * ✏️ Fix typos in `docs/en/docs/tutorial/dependencies/dependencies-with-yield.md`. PR [#10834](https://github.com/tiangolo/fastapi/pull/10834) by [@Molkree](https://github.com/Molkree). * 📝 Add article: "Building a RESTful API with FastAPI: Secure Signup and Login Functionality Included". PR [#9733](https://github.com/tiangolo/fastapi/pull/9733) by [@dxphilo](https://github.com/dxphilo). * 📝 Add warning about lifecycle events with `AsyncClient`. PR [#4167](https://github.com/tiangolo/fastapi/pull/4167) by [@andrew-chang-dewitt](https://github.com/andrew-chang-dewitt). * ✏️ Fix typos in `/docs/reference/exceptions.md` and `/en/docs/reference/status.md`. PR [#10809](https://github.com/tiangolo/fastapi/pull/10809) by [@clarencepenz](https://github.com/clarencepenz). * ✏️ Fix typo in `openapi-callbacks.md`. PR [#10673](https://github.com/tiangolo/fastapi/pull/10673) by [@kayjan](https://github.com/kayjan). * ✏️ Fix typo in `fastapi/routing.py` . PR [#10520](https://github.com/tiangolo/fastapi/pull/10520) by [@sepsh](https://github.com/sepsh). * 📝 Replace HTTP code returned in case of existing user error in docs for testing. PR [#4482](https://github.com/tiangolo/fastapi/pull/4482) by [@TristanMarion](https://github.com/TristanMarion). * 📝 Add blog for FastAPI & Supabase. PR [#6018](https://github.com/tiangolo/fastapi/pull/6018) by [@theinfosecguy](https://github.com/theinfosecguy). * 📝 Update example source files for SQL databases with SQLAlchemy. PR [#9508](https://github.com/tiangolo/fastapi/pull/9508) by [@s-mustafa](https://github.com/s-mustafa). * 📝 Update code examples in docs for body, replace name `create_item` with `update_item` when appropriate. PR [#5913](https://github.com/tiangolo/fastapi/pull/5913) by [@OttoAndrey](https://github.com/OttoAndrey). * ✏️ Fix typo in dependencies with yield source examples. PR [#10847](https://github.com/tiangolo/fastapi/pull/10847) by [@tiangolo](https://github.com/tiangolo). ### Translations * 🌐 Add Bengali translation for `docs/bn/docs/index.md`. PR [#9177](https://github.com/tiangolo/fastapi/pull/9177) by [@Fahad-Md-Kamal](https://github.com/Fahad-Md-Kamal). * ✏️ Update Python version in `index.md` in several languages. PR [#10711](https://github.com/tiangolo/fastapi/pull/10711) by [@tamago3keran](https://github.com/tamago3keran). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/request-forms-and-files.md`. PR [#10347](https://github.com/tiangolo/fastapi/pull/10347) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Ukrainian translation for `docs/uk/docs/index.md`. PR [#10362](https://github.com/tiangolo/fastapi/pull/10362) by [@rostik1410](https://github.com/rostik1410). * ✏️ Update Python version in `docs/ko/docs/index.md`. PR [#10680](https://github.com/tiangolo/fastapi/pull/10680) by [@Eeap](https://github.com/Eeap). * 🌐 Add Persian translation for `docs/fa/docs/features.md`. PR [#5887](https://github.com/tiangolo/fastapi/pull/5887) by [@amirilf](https://github.com/amirilf). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/additional-responses.md`. PR [#10325](https://github.com/tiangolo/fastapi/pull/10325) by [@ShuibeiC](https://github.com/ShuibeiC). * 🌐 Fix typos in Russian translations for `docs/ru/docs/tutorial/background-tasks.md`, `docs/ru/docs/tutorial/body-nested-models.md`, `docs/ru/docs/tutorial/debugging.md`, `docs/ru/docs/tutorial/testing.md`. PR [#10311](https://github.com/tiangolo/fastapi/pull/10311) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/request-files.md`. PR [#10332](https://github.com/tiangolo/fastapi/pull/10332) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/server-workers.md`. PR [#10292](https://github.com/tiangolo/fastapi/pull/10292) by [@xzmeng](https://github.com/xzmeng). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/cloud.md`. PR [#10291](https://github.com/tiangolo/fastapi/pull/10291) by [@xzmeng](https://github.com/xzmeng). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/manually.md`. PR [#10279](https://github.com/tiangolo/fastapi/pull/10279) by [@xzmeng](https://github.com/xzmeng). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/https.md`. PR [#10277](https://github.com/tiangolo/fastapi/pull/10277) by [@xzmeng](https://github.com/xzmeng). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/index.md`. PR [#10275](https://github.com/tiangolo/fastapi/pull/10275) by [@xzmeng](https://github.com/xzmeng). * 🌐 Add German translation for `docs/de/docs/tutorial/first-steps.md`. PR [#9530](https://github.com/tiangolo/fastapi/pull/9530) by [@fhabers21](https://github.com/fhabers21). * 🌐 Update Turkish translation for `docs/tr/docs/index.md`. PR [#10444](https://github.com/tiangolo/fastapi/pull/10444) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Chinese translation for `docs/zh/docs/learn/index.md`. PR [#10479](https://github.com/tiangolo/fastapi/pull/10479) by [@KAZAMA-DREAM](https://github.com/KAZAMA-DREAM). * 🌐 Add Russian translation for `docs/ru/docs/learn/index.md`. PR [#10539](https://github.com/tiangolo/fastapi/pull/10539) by [@AlertRED](https://github.com/AlertRED). * 🌐 Update SQLAlchemy instruction in Chinese translation `docs/zh/docs/tutorial/sql-databases.md`. PR [#9712](https://github.com/tiangolo/fastapi/pull/9712) by [@Royc30ne](https://github.com/Royc30ne). * 🌐 Add Turkish translation for `docs/tr/docs/external-links.md`. PR [#10549](https://github.com/tiangolo/fastapi/pull/10549) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Spanish translation for `docs/es/docs/learn/index.md`. PR [#10885](https://github.com/tiangolo/fastapi/pull/10885) by [@pablocm83](https://github.com/pablocm83). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/body-fields.md`. PR [#10670](https://github.com/tiangolo/fastapi/pull/10670) by [@ArtemKhymenko](https://github.com/ArtemKhymenko). * 🌐 Add Hungarian translation for `/docs/hu/docs/index.md`. PR [#10812](https://github.com/tiangolo/fastapi/pull/10812) by [@takacs](https://github.com/takacs). * 🌐 Add Turkish translation for `docs/tr/docs/newsletter.md`. PR [#10550](https://github.com/tiangolo/fastapi/pull/10550) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Spanish translation for `docs/es/docs/help/index.md`. PR [#10907](https://github.com/tiangolo/fastapi/pull/10907) by [@pablocm83](https://github.com/pablocm83). * 🌐 Add Spanish translation for `docs/es/docs/about/index.md`. PR [#10908](https://github.com/tiangolo/fastapi/pull/10908) by [@pablocm83](https://github.com/pablocm83). * 🌐 Add Spanish translation for `docs/es/docs/resources/index.md`. PR [#10909](https://github.com/tiangolo/fastapi/pull/10909) by [@pablocm83](https://github.com/pablocm83). ### Internal * 👥 Update FastAPI People. PR [#10871](https://github.com/tiangolo/fastapi/pull/10871) by [@tiangolo](https://github.com/tiangolo). * 👷 Upgrade custom GitHub Action comment-docs-preview-in-pr. PR [#10916](https://github.com/tiangolo/fastapi/pull/10916) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade GitHub Action latest-changes. PR [#10915](https://github.com/tiangolo/fastapi/pull/10915) by [@tiangolo](https://github.com/tiangolo). * 👷 Upgrade GitHub Action label-approved. PR [#10913](https://github.com/tiangolo/fastapi/pull/10913) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade GitHub Action label-approved. PR [#10905](https://github.com/tiangolo/fastapi/pull/10905) by [@tiangolo](https://github.com/tiangolo). ## 0.108.0 ### Upgrades * ⬆️ Upgrade Starlette to `>=0.29.0,<0.33.0`, update docs and usage of templates with new Starlette arguments. Remove pin of AnyIO `>=3.7.1,<4.0.0`, add support for AnyIO 4.x.x. PR [#10846](https://github.com/tiangolo/fastapi/pull/10846) by [@tiangolo](https://github.com/tiangolo). ## 0.107.0 ### Upgrades * ⬆️ Upgrade Starlette to 0.28.0. PR [#9636](https://github.com/tiangolo/fastapi/pull/9636) by [@adriangb](https://github.com/adriangb). ### Docs * 📝 Add docs: Node.js script alternative to update OpenAPI for generated clients. PR [#10845](https://github.com/tiangolo/fastapi/pull/10845) by [@alejsdev](https://github.com/alejsdev). * 📝 Restructure Docs section in Contributing page. PR [#10844](https://github.com/tiangolo/fastapi/pull/10844) by [@alejsdev](https://github.com/alejsdev). ## 0.106.0 ### Breaking Changes Using resources from dependencies with `yield` in background tasks is no longer supported. This change is what supports the new features, read below. 🤓 ### Dependencies with `yield`, `HTTPException` and Background Tasks Dependencies with `yield` now can raise `HTTPException` and other exceptions after `yield`. 🎉 Read the new docs here: [Dependencies with `yield` and `HTTPException`](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-with-yield/#dependencies-with-yield-and-httpexception). ```Python from fastapi import Depends, FastAPI, HTTPException from typing_extensions import Annotated app = FastAPI() data = { "plumbus": {"description": "Freshly pickled plumbus", "owner": "Morty"}, "portal-gun": {"description": "Gun to create portals", "owner": "Rick"}, } class OwnerError(Exception): pass def get_username(): try: yield "Rick" except OwnerError as e: raise HTTPException(status_code=400, detail=f"Owner error: {e}") @app.get("/items/{item_id}") def get_item(item_id: str, username: Annotated[str, Depends(get_username)]): if item_id not in data: raise HTTPException(status_code=404, detail="Item not found") item = data[item_id] if item["owner"] != username: raise OwnerError(username) return item ``` --- Before FastAPI 0.106.0, raising exceptions after `yield` was not possible, the exit code in dependencies with `yield` was executed *after* the response was sent, so [Exception Handlers](https://fastapi.tiangolo.com/tutorial/handling-errors/#install-custom-exception-handlers) would have already run. This was designed this way mainly to allow using the same objects "yielded" by dependencies inside of background tasks, because the exit code would be executed after the background tasks were finished. Nevertheless, as this would mean waiting for the response to travel through the network while unnecessarily holding a resource in a dependency with yield (for example a database connection), this was changed in FastAPI 0.106.0. Additionally, a background task is normally an independent set of logic that should be handled separately, with its own resources (e.g. its own database connection). If you used to rely on this behavior, now you should create the resources for background tasks inside the background task itself, and use internally only data that doesn't depend on the resources of dependencies with `yield`. For example, instead of using the same database session, you would create a new database session inside of the background task, and you would obtain the objects from the database using this new session. And then instead of passing the object from the database as a parameter to the background task function, you would pass the ID of that object and then obtain the object again inside the background task function. The sequence of execution before FastAPI 0.106.0 was like this diagram: Time flows from top to bottom. And each column is one of the parts interacting or executing code. ```mermaid sequenceDiagram participant client as Client participant handler as Exception handler participant dep as Dep with yield participant operation as Path Operation participant tasks as Background tasks Note over client,tasks: Can raise exception for dependency, handled after response is sent Note over client,operation: Can raise HTTPException and can change the response client ->> dep: Start request Note over dep: Run code up to yield opt raise dep -->> handler: Raise HTTPException handler -->> client: HTTP error response dep -->> dep: Raise other exception end dep ->> operation: Run dependency, e.g. DB session opt raise operation -->> dep: Raise HTTPException dep -->> handler: Auto forward exception handler -->> client: HTTP error response operation -->> dep: Raise other exception dep -->> handler: Auto forward exception end operation ->> client: Return response to client Note over client,operation: Response is already sent, can't change it anymore opt Tasks operation -->> tasks: Send background tasks end opt Raise other exception tasks -->> dep: Raise other exception end Note over dep: After yield opt Handle other exception dep -->> dep: Handle exception, can't change response. E.g. close DB session. end ``` The new execution flow can be found in the docs: [Execution of dependencies with `yield`](https://fastapi.tiangolo.com/tutorial/dependencies/dependencies-with-yield/#execution-of-dependencies-with-yield). ### Features * ✨ Add support for raising exceptions (including `HTTPException`) in dependencies with `yield` in the exit code, do not support them in background tasks. PR [#10831](https://github.com/tiangolo/fastapi/pull/10831) by [@tiangolo](https://github.com/tiangolo). ### Internal * 👥 Update FastAPI People. PR [#10567](https://github.com/tiangolo/fastapi/pull/10567) by [@tiangolo](https://github.com/tiangolo). ## 0.105.0 ### Features * ✨ Add support for multiple Annotated annotations, e.g. `Annotated[str, Field(), Query()]`. PR [#10773](https://github.com/tiangolo/fastapi/pull/10773) by [@tiangolo](https://github.com/tiangolo). ### Refactors * 🔥 Remove unused NoneType. PR [#10774](https://github.com/tiangolo/fastapi/pull/10774) by [@tiangolo](https://github.com/tiangolo). ### Docs * 📝 Tweak default suggested configs for generating clients. PR [#10736](https://github.com/tiangolo/fastapi/pull/10736) by [@tiangolo](https://github.com/tiangolo). ### Internal * 🔧 Update sponsors, add Scalar. PR [#10728](https://github.com/tiangolo/fastapi/pull/10728) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, add PropelAuth. PR [#10760](https://github.com/tiangolo/fastapi/pull/10760) by [@tiangolo](https://github.com/tiangolo). * 👷 Update build docs, verify README on CI. PR [#10750](https://github.com/tiangolo/fastapi/pull/10750) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, remove Fern. PR [#10729](https://github.com/tiangolo/fastapi/pull/10729) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, add Codacy. PR [#10677](https://github.com/tiangolo/fastapi/pull/10677) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, add Reflex. PR [#10676](https://github.com/tiangolo/fastapi/pull/10676) by [@tiangolo](https://github.com/tiangolo). * 📝 Update release notes, move and check latest-changes. PR [#10588](https://github.com/tiangolo/fastapi/pull/10588) by [@tiangolo](https://github.com/tiangolo). * 👷 Upgrade latest-changes GitHub Action. PR [#10587](https://github.com/tiangolo/fastapi/pull/10587) by [@tiangolo](https://github.com/tiangolo). ## 0.104.1 ### Fixes * 📌 Pin Swagger UI version to 5.9.0 temporarily to handle a bug crashing it in 5.9.1. PR [#10529](https://github.com/tiangolo/fastapi/pull/10529) by [@alejandraklachquin](https://github.com/alejandraklachquin). * This is not really a bug in FastAPI but in Swagger UI, nevertheless pinning the version will work while a solution is found on the [Swagger UI side](https://github.com/swagger-api/swagger-ui/issues/9337). ### Docs * 📝 Update data structure and render for external-links. PR [#10495](https://github.com/tiangolo/fastapi/pull/10495) by [@tiangolo](https://github.com/tiangolo). * ✏️ Fix link to SPDX license identifier in `docs/en/docs/tutorial/metadata.md`. PR [#10433](https://github.com/tiangolo/fastapi/pull/10433) by [@worldworm](https://github.com/worldworm). * 📝 Update example validation error from Pydantic v1 to match Pydantic v2 in `docs/en/docs/tutorial/path-params.md`. PR [#10043](https://github.com/tiangolo/fastapi/pull/10043) by [@giuliowaitforitdavide](https://github.com/giuliowaitforitdavide). * ✏️ Fix typos in emoji docs and in some source examples. PR [#10438](https://github.com/tiangolo/fastapi/pull/10438) by [@afuetterer](https://github.com/afuetterer). * ✏️ Fix typo in `docs/en/docs/reference/dependencies.md`. PR [#10465](https://github.com/tiangolo/fastapi/pull/10465) by [@suravshresth](https://github.com/suravshresth). * ✏️ Fix typos and rewordings in `docs/en/docs/tutorial/body-nested-models.md`. PR [#10468](https://github.com/tiangolo/fastapi/pull/10468) by [@yogabonito](https://github.com/yogabonito). * 📝 Update docs, remove references to removed `pydantic.Required` in `docs/en/docs/tutorial/query-params-str-validations.md`. PR [#10469](https://github.com/tiangolo/fastapi/pull/10469) by [@yogabonito](https://github.com/yogabonito). * ✏️ Fix typo in `docs/en/docs/reference/index.md`. PR [#10467](https://github.com/tiangolo/fastapi/pull/10467) by [@tarsil](https://github.com/tarsil). * 🔥 Remove unnecessary duplicated docstrings. PR [#10484](https://github.com/tiangolo/fastapi/pull/10484) by [@tiangolo](https://github.com/tiangolo). ### Internal * ✏️ Update Pydantic links to dotenv support. PR [#10511](https://github.com/tiangolo/fastapi/pull/10511) by [@White-Mask](https://github.com/White-Mask). * ✏️ Update links in `docs/en/docs/async.md` and `docs/zh/docs/async.md` to make them relative. PR [#10498](https://github.com/tiangolo/fastapi/pull/10498) by [@hasnatsajid](https://github.com/hasnatsajid). * ✏️ Fix links in `docs/em/docs/async.md`. PR [#10507](https://github.com/tiangolo/fastapi/pull/10507) by [@hasnatsajid](https://github.com/hasnatsajid). * ✏️ Fix typo in `docs/em/docs/index.md`, Python 3.8. PR [#10521](https://github.com/tiangolo/fastapi/pull/10521) by [@kerriop](https://github.com/kerriop). * ⬆ Bump pillow from 9.5.0 to 10.1.0. PR [#10446](https://github.com/tiangolo/fastapi/pull/10446) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Update mkdocs-material requirement from <9.0.0,>=8.1.4 to >=8.1.4,<10.0.0. PR [#5862](https://github.com/tiangolo/fastapi/pull/5862) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump mkdocs-material from 9.1.21 to 9.4.7. PR [#10545](https://github.com/tiangolo/fastapi/pull/10545) by [@dependabot[bot]](https://github.com/apps/dependabot). * 👷 Install MkDocs Material Insiders only when secrets are available, for Dependabot. PR [#10544](https://github.com/tiangolo/fastapi/pull/10544) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors badges, Databento. PR [#10519](https://github.com/tiangolo/fastapi/pull/10519) by [@tiangolo](https://github.com/tiangolo). * 👷 Adopt Ruff format. PR [#10517](https://github.com/tiangolo/fastapi/pull/10517) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add `CITATION.cff` file for academic citations. PR [#10496](https://github.com/tiangolo/fastapi/pull/10496) by [@tiangolo](https://github.com/tiangolo). * 🐛 Fix overriding MKDocs theme lang in hook. PR [#10490](https://github.com/tiangolo/fastapi/pull/10490) by [@tiangolo](https://github.com/tiangolo). * 🔥 Drop/close Gitter chat. Questions should go to GitHub Discussions, free conversations to Discord.. PR [#10485](https://github.com/tiangolo/fastapi/pull/10485) by [@tiangolo](https://github.com/tiangolo). ## 0.104.0 ## Features * ✨ Add reference (code API) docs with PEP 727, add subclass with custom docstrings for `BackgroundTasks`, refactor docs structure. PR [#10392](https://github.com/tiangolo/fastapi/pull/10392) by [@tiangolo](https://github.com/tiangolo). New docs at [FastAPI Reference - Code API](https://fastapi.tiangolo.com/reference/). ## Upgrades * ⬆️ Drop support for Python 3.7, require Python 3.8 or above. PR [#10442](https://github.com/tiangolo/fastapi/pull/10442) by [@tiangolo](https://github.com/tiangolo). ### Internal * ⬆ Bump dawidd6/action-download-artifact from 2.27.0 to 2.28.0. PR [#10268](https://github.com/tiangolo/fastapi/pull/10268) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump actions/checkout from 3 to 4. PR [#10208](https://github.com/tiangolo/fastapi/pull/10208) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump pypa/gh-action-pypi-publish from 1.8.6 to 1.8.10. PR [#10061](https://github.com/tiangolo/fastapi/pull/10061) by [@dependabot[bot]](https://github.com/apps/dependabot). * 🔧 Update sponsors, Bump.sh images. PR [#10381](https://github.com/tiangolo/fastapi/pull/10381) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People. PR [#10363](https://github.com/tiangolo/fastapi/pull/10363) by [@tiangolo](https://github.com/tiangolo). ## 0.103.2 ### Refactors * ⬆️ Upgrade compatibility with Pydantic v2.4, new renamed functions and JSON Schema input/output models with default values. PR [#10344](https://github.com/tiangolo/fastapi/pull/10344) by [@tiangolo](https://github.com/tiangolo). ### Translations * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/extra-data-types.md`. PR [#10132](https://github.com/tiangolo/fastapi/pull/10132) by [@ArtemKhymenko](https://github.com/ArtemKhymenko). * 🌐 Fix typos in French translations for `docs/fr/docs/advanced/path-operation-advanced-configuration.md`, `docs/fr/docs/alternatives.md`, `docs/fr/docs/async.md`, `docs/fr/docs/features.md`, `docs/fr/docs/help-fastapi.md`, `docs/fr/docs/index.md`, `docs/fr/docs/python-types.md`, `docs/fr/docs/tutorial/body.md`, `docs/fr/docs/tutorial/first-steps.md`, `docs/fr/docs/tutorial/query-params.md`. PR [#10154](https://github.com/tiangolo/fastapi/pull/10154) by [@s-rigaud](https://github.com/s-rigaud). * 🌐 Add Chinese translation for `docs/zh/docs/async.md`. PR [#5591](https://github.com/tiangolo/fastapi/pull/5591) by [@mkdir700](https://github.com/mkdir700). * 🌐 Update Chinese translation for `docs/tutorial/security/simple-oauth2.md`. PR [#3844](https://github.com/tiangolo/fastapi/pull/3844) by [@jaystone776](https://github.com/jaystone776). * 🌐 Add Korean translation for `docs/ko/docs/deployment/cloud.md`. PR [#10191](https://github.com/tiangolo/fastapi/pull/10191) by [@Sion99](https://github.com/Sion99). * 🌐 Add Japanese translation for `docs/ja/docs/deployment/https.md`. PR [#10298](https://github.com/tiangolo/fastapi/pull/10298) by [@tamtam-fitness](https://github.com/tamtam-fitness). * 🌐 Fix typo in Russian translation for `docs/ru/docs/tutorial/body-fields.md`. PR [#10224](https://github.com/tiangolo/fastapi/pull/10224) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Polish translation for `docs/pl/docs/help-fastapi.md`. PR [#10121](https://github.com/tiangolo/fastapi/pull/10121) by [@romabozhanovgithub](https://github.com/romabozhanovgithub). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/header-params.md`. PR [#10226](https://github.com/tiangolo/fastapi/pull/10226) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Chinese translation for `docs/zh/docs/deployment/versions.md`. PR [#10276](https://github.com/tiangolo/fastapi/pull/10276) by [@xzmeng](https://github.com/xzmeng). ### Internal * 🔧 Update sponsors, remove Flint. PR [#10349](https://github.com/tiangolo/fastapi/pull/10349) by [@tiangolo](https://github.com/tiangolo). * 🔧 Rename label "awaiting review" to "awaiting-review" to simplify search queries. PR [#10343](https://github.com/tiangolo/fastapi/pull/10343) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, enable Svix (revert #10228). PR [#10253](https://github.com/tiangolo/fastapi/pull/10253) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, remove Svix. PR [#10228](https://github.com/tiangolo/fastapi/pull/10228) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, add Bump.sh. PR [#10227](https://github.com/tiangolo/fastapi/pull/10227) by [@tiangolo](https://github.com/tiangolo). ## 0.103.1 ### Fixes * 📌 Pin AnyIO to < 4.0.0 to handle an incompatibility while upgrading to Starlette 0.31.1. PR [#10194](https://github.com/tiangolo/fastapi/pull/10194) by [@tiangolo](https://github.com/tiangolo). ### Docs * ✏️ Fix validation parameter name in docs, from `regex` to `pattern`. PR [#10085](https://github.com/tiangolo/fastapi/pull/10085) by [@pablodorrio](https://github.com/pablodorrio). * ✏️ Fix indent format in `docs/en/docs/deployment/server-workers.md`. PR [#10066](https://github.com/tiangolo/fastapi/pull/10066) by [@tamtam-fitness](https://github.com/tamtam-fitness). * ✏️ Fix Pydantic examples in tutorial for Python types. PR [#9961](https://github.com/tiangolo/fastapi/pull/9961) by [@rahulsalgare](https://github.com/rahulsalgare). * ✏️ Fix link to Pydantic docs in `docs/en/docs/tutorial/extra-data-types.md`. PR [#10155](https://github.com/tiangolo/fastapi/pull/10155) by [@hasnatsajid](https://github.com/hasnatsajid). * ✏️ Fix typo in `docs/en/docs/tutorial/handling-errors.md`. PR [#10170](https://github.com/tiangolo/fastapi/pull/10170) by [@poupapaa](https://github.com/poupapaa). * ✏️ Fix typo in `docs/en/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md`. PR [#10172](https://github.com/tiangolo/fastapi/pull/10172) by [@ragul-kachiappan](https://github.com/ragul-kachiappan). ### Translations * 🌐 Remove duplicate line in translation for `docs/pt/docs/tutorial/path-params.md`. PR [#10126](https://github.com/tiangolo/fastapi/pull/10126) by [@LecoOliveira](https://github.com/LecoOliveira). * 🌐 Add Yoruba translation for `docs/yo/docs/index.md`. PR [#10033](https://github.com/tiangolo/fastapi/pull/10033) by [@AfolabiOlaoluwa](https://github.com/AfolabiOlaoluwa). * 🌐 Add Ukrainian translation for `docs/uk/docs/python-types.md`. PR [#10080](https://github.com/tiangolo/fastapi/pull/10080) by [@rostik1410](https://github.com/rostik1410). * 🌐 Add Vietnamese translations for `docs/vi/docs/tutorial/first-steps.md` and `docs/vi/docs/tutorial/index.md`. PR [#10088](https://github.com/tiangolo/fastapi/pull/10088) by [@magiskboy](https://github.com/magiskboy). * 🌐 Add Ukrainian translation for `docs/uk/docs/alternatives.md`. PR [#10060](https://github.com/tiangolo/fastapi/pull/10060) by [@whysage](https://github.com/whysage). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/index.md`. PR [#10079](https://github.com/tiangolo/fastapi/pull/10079) by [@rostik1410](https://github.com/rostik1410). * ✏️ Fix typos in `docs/en/docs/how-to/separate-openapi-schemas.md` and `docs/en/docs/tutorial/schema-extra-example.md`. PR [#10189](https://github.com/tiangolo/fastapi/pull/10189) by [@xzmeng](https://github.com/xzmeng). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/generate-clients.md`. PR [#9883](https://github.com/tiangolo/fastapi/pull/9883) by [@funny-cat-happy](https://github.com/funny-cat-happy). ### Refactors * ✏️ Fix typos in comment in `fastapi/applications.py`. PR [#10045](https://github.com/tiangolo/fastapi/pull/10045) by [@AhsanSheraz](https://github.com/AhsanSheraz). * ✅ Add missing test for OpenAPI examples, it was missing in coverage. PR [#10188](https://github.com/tiangolo/fastapi/pull/10188) by [@tiangolo](https://github.com/tiangolo). ### Internal * 👥 Update FastAPI People. PR [#10186](https://github.com/tiangolo/fastapi/pull/10186) by [@tiangolo](https://github.com/tiangolo). ## 0.103.0 ### Features * ✨ Add support for `openapi_examples` in all FastAPI parameters. PR [#10152](https://github.com/tiangolo/fastapi/pull/10152) by [@tiangolo](https://github.com/tiangolo). * New docs: [OpenAPI-specific examples](https://fastapi.tiangolo.com/tutorial/schema-extra-example/#openapi-specific-examples). ### Docs * 📝 Add note to docs about Separate Input and Output Schemas with FastAPI version. PR [#10150](https://github.com/tiangolo/fastapi/pull/10150) by [@tiangolo](https://github.com/tiangolo). ## 0.102.0 ### Features * ✨ Add support for disabling the separation of input and output JSON Schemas in OpenAPI with Pydantic v2 with `separate_input_output_schemas=False`. PR [#10145](https://github.com/tiangolo/fastapi/pull/10145) by [@tiangolo](https://github.com/tiangolo). * New docs [Separate OpenAPI Schemas for Input and Output or Not](https://fastapi.tiangolo.com/how-to/separate-openapi-schemas/). * This PR also includes a new setup (internal tools) for generating screenshots for the docs. ### Refactors * ♻️ Refactor tests for new Pydantic 2.2.1. PR [#10115](https://github.com/tiangolo/fastapi/pull/10115) by [@tiangolo](https://github.com/tiangolo). ### Docs * 📝 Add new docs section, How To - Recipes, move docs that don't have to be read by everyone to How To. PR [#10114](https://github.com/tiangolo/fastapi/pull/10114) by [@tiangolo](https://github.com/tiangolo). * 📝 Update Advanced docs, add links to sponsor courses. PR [#10113](https://github.com/tiangolo/fastapi/pull/10113) by [@tiangolo](https://github.com/tiangolo). * 📝 Update docs for generating clients. PR [#10112](https://github.com/tiangolo/fastapi/pull/10112) by [@tiangolo](https://github.com/tiangolo). * 📝 Tweak MkDocs and add redirects. PR [#10111](https://github.com/tiangolo/fastapi/pull/10111) by [@tiangolo](https://github.com/tiangolo). * 📝 Restructure docs for cloud providers, include links to sponsors. PR [#10110](https://github.com/tiangolo/fastapi/pull/10110) by [@tiangolo](https://github.com/tiangolo). ### Internal * 🔧 Update sponsors, add Speakeasy. PR [#10098](https://github.com/tiangolo/fastapi/pull/10098) by [@tiangolo](https://github.com/tiangolo). ## 0.101.1 ### Fixes * ✨ Add `ResponseValidationError` printable details, to show up in server error logs. PR [#10078](https://github.com/tiangolo/fastapi/pull/10078) by [@tiangolo](https://github.com/tiangolo). ### Refactors * ✏️ Fix typo in deprecation warnings in `fastapi/params.py`. PR [#9854](https://github.com/tiangolo/fastapi/pull/9854) by [@russbiggs](https://github.com/russbiggs). * ✏️ Fix typos in comments on internal code in `fastapi/concurrency.py` and `fastapi/routing.py`. PR [#9590](https://github.com/tiangolo/fastapi/pull/9590) by [@ElliottLarsen](https://github.com/ElliottLarsen). ### Docs * ✏️ Fix typo in release notes. PR [#9835](https://github.com/tiangolo/fastapi/pull/9835) by [@francisbergin](https://github.com/francisbergin). * 📝 Add external article: Build an SMS Spam Classifier Serverless Database with FaunaDB and FastAPI. PR [#9847](https://github.com/tiangolo/fastapi/pull/9847) by [@adejumoridwan](https://github.com/adejumoridwan). * 📝 Fix typo in `docs/en/docs/contributing.md`. PR [#9878](https://github.com/tiangolo/fastapi/pull/9878) by [@VicenteMerino](https://github.com/VicenteMerino). * 📝 Fix code highlighting in `docs/en/docs/tutorial/bigger-applications.md`. PR [#9806](https://github.com/tiangolo/fastapi/pull/9806) by [@theonlykingpin](https://github.com/theonlykingpin). ### Translations * 🌐 Add Japanese translation for `docs/ja/docs/deployment/concepts.md`. PR [#10062](https://github.com/tiangolo/fastapi/pull/10062) by [@tamtam-fitness](https://github.com/tamtam-fitness). * 🌐 Add Japanese translation for `docs/ja/docs/deployment/server-workers.md`. PR [#10064](https://github.com/tiangolo/fastapi/pull/10064) by [@tamtam-fitness](https://github.com/tamtam-fitness). * 🌐 Update Japanese translation for `docs/ja/docs/deployment/docker.md`. PR [#10073](https://github.com/tiangolo/fastapi/pull/10073) by [@tamtam-fitness](https://github.com/tamtam-fitness). * 🌐 Add Ukrainian translation for `docs/uk/docs/fastapi-people.md`. PR [#10059](https://github.com/tiangolo/fastapi/pull/10059) by [@rostik1410](https://github.com/rostik1410). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/cookie-params.md`. PR [#10032](https://github.com/tiangolo/fastapi/pull/10032) by [@rostik1410](https://github.com/rostik1410). * 🌐 Add Russian translation for `docs/ru/docs/deployment/docker.md`. PR [#9971](https://github.com/tiangolo/fastapi/pull/9971) by [@Xewus](https://github.com/Xewus). * 🌐 Add Vietnamese translation for `docs/vi/docs/python-types.md`. PR [#10047](https://github.com/tiangolo/fastapi/pull/10047) by [@magiskboy](https://github.com/magiskboy). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/dependencies/global-dependencies.md`. PR [#9970](https://github.com/tiangolo/fastapi/pull/9970) by [@dudyaosuplayer](https://github.com/dudyaosuplayer). * 🌐 Add Urdu translation for `docs/ur/docs/benchmarks.md`. PR [#9974](https://github.com/tiangolo/fastapi/pull/9974) by [@AhsanSheraz](https://github.com/AhsanSheraz). ### Internal * 🔧 Add sponsor Porter. PR [#10051](https://github.com/tiangolo/fastapi/pull/10051) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, add Jina back as bronze sponsor. PR [#10050](https://github.com/tiangolo/fastapi/pull/10050) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump mypy from 1.4.0 to 1.4.1. PR [#9756](https://github.com/tiangolo/fastapi/pull/9756) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump mkdocs-material from 9.1.17 to 9.1.21. PR [#9960](https://github.com/tiangolo/fastapi/pull/9960) by [@dependabot[bot]](https://github.com/apps/dependabot). ## 0.101.0 ### Features * ✨ Enable Pydantic's serialization mode for responses, add support for Pydantic's `computed_field`, better OpenAPI for response models, proper required attributes, better generated clients. PR [#10011](https://github.com/tiangolo/fastapi/pull/10011) by [@tiangolo](https://github.com/tiangolo). ### Refactors * ✅ Fix tests for compatibility with pydantic 2.1.1. PR [#9943](https://github.com/tiangolo/fastapi/pull/9943) by [@dmontagu](https://github.com/dmontagu). * ✅ Fix test error in Windows for `jsonable_encoder`. PR [#9840](https://github.com/tiangolo/fastapi/pull/9840) by [@iudeen](https://github.com/iudeen). ### Upgrades * 📌 Do not allow Pydantic 2.1.0 that breaks (require 2.1.1). PR [#10012](https://github.com/tiangolo/fastapi/pull/10012) by [@tiangolo](https://github.com/tiangolo). ### Translations * 🌐 Add Russian translation for `docs/ru/docs/tutorial/security/index.md`. PR [#9963](https://github.com/tiangolo/fastapi/pull/9963) by [@eVery1337](https://github.com/eVery1337). * 🌐 Remove Vietnamese note about missing translation. PR [#9957](https://github.com/tiangolo/fastapi/pull/9957) by [@tiangolo](https://github.com/tiangolo). ### Internal * 👷 Add GitHub Actions step dump context to debug external failures. PR [#10008](https://github.com/tiangolo/fastapi/pull/10008) by [@tiangolo](https://github.com/tiangolo). * 🔧 Restore MkDocs Material pin after the fix. PR [#10001](https://github.com/tiangolo/fastapi/pull/10001) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update the Question template to ask for the Pydantic version. PR [#10000](https://github.com/tiangolo/fastapi/pull/10000) by [@tiangolo](https://github.com/tiangolo). * 📍 Update MkDocs Material dependencies. PR [#9986](https://github.com/tiangolo/fastapi/pull/9986) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People. PR [#9999](https://github.com/tiangolo/fastapi/pull/9999) by [@tiangolo](https://github.com/tiangolo). * 🐳 Update Dockerfile with compatibility versions, to upgrade later. PR [#9998](https://github.com/tiangolo/fastapi/pull/9998) by [@tiangolo](https://github.com/tiangolo). * ➕ Add pydantic-settings to FastAPI People dependencies. PR [#9988](https://github.com/tiangolo/fastapi/pull/9988) by [@tiangolo](https://github.com/tiangolo). * ♻️ Update FastAPI People logic with new Pydantic. PR [#9985](https://github.com/tiangolo/fastapi/pull/9985) by [@tiangolo](https://github.com/tiangolo). * 🍱 Update sponsors, Fern badge. PR [#9982](https://github.com/tiangolo/fastapi/pull/9982) by [@tiangolo](https://github.com/tiangolo). * 👷 Deploy docs to Cloudflare Pages. PR [#9978](https://github.com/tiangolo/fastapi/pull/9978) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsor Fern. PR [#9979](https://github.com/tiangolo/fastapi/pull/9979) by [@tiangolo](https://github.com/tiangolo). * 👷 Update CI debug mode with Tmate. PR [#9977](https://github.com/tiangolo/fastapi/pull/9977) by [@tiangolo](https://github.com/tiangolo). ## 0.100.1 ### Fixes * 🐛 Replace `MultHostUrl` to `AnyUrl` for compatibility with older versions of Pydantic v1. PR [#9852](https://github.com/tiangolo/fastapi/pull/9852) by [@Kludex](https://github.com/Kludex). ### Docs * 📝 Update links for self-hosted Swagger UI, point to v5, for OpenAPI 31.0. PR [#9834](https://github.com/tiangolo/fastapi/pull/9834) by [@tiangolo](https://github.com/tiangolo). ### Translations * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/body.md`. PR [#4574](https://github.com/tiangolo/fastapi/pull/4574) by [@ss-o-furda](https://github.com/ss-o-furda). * 🌐 Add Vietnamese translation for `docs/vi/docs/features.md` and `docs/vi/docs/index.md`. PR [#3006](https://github.com/tiangolo/fastapi/pull/3006) by [@magiskboy](https://github.com/magiskboy). * 🌐 Add Korean translation for `docs/ko/docs/async.md`. PR [#4179](https://github.com/tiangolo/fastapi/pull/4179) by [@NinaHwang](https://github.com/NinaHwang). * 🌐 Add Chinese translation for `docs/zh/docs/tutorial/background-tasks.md`. PR [#9812](https://github.com/tiangolo/fastapi/pull/9812) by [@wdh99](https://github.com/wdh99). * 🌐 Add French translation for `docs/fr/docs/tutorial/query-params-str-validations.md`. PR [#4075](https://github.com/tiangolo/fastapi/pull/4075) by [@Smlep](https://github.com/Smlep). * 🌐 Add French translation for `docs/fr/docs/tutorial/index.md`. PR [#2234](https://github.com/tiangolo/fastapi/pull/2234) by [@JulianMaurin](https://github.com/JulianMaurin). * 🌐 Add French translation for `docs/fr/docs/contributing.md`. PR [#2132](https://github.com/tiangolo/fastapi/pull/2132) by [@JulianMaurin](https://github.com/JulianMaurin). * 🌐 Add French translation for `docs/fr/docs/benchmarks.md`. PR [#2155](https://github.com/tiangolo/fastapi/pull/2155) by [@clemsau](https://github.com/clemsau). * 🌐 Update Chinese translations with new source files. PR [#9738](https://github.com/tiangolo/fastapi/pull/9738) by [@mahone3297](https://github.com/mahone3297). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/request-forms.md`. PR [#9841](https://github.com/tiangolo/fastapi/pull/9841) by [@dedkot01](https://github.com/dedkot01). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/handling-errors.md`. PR [#9485](https://github.com/tiangolo/fastapi/pull/9485) by [@Creat55](https://github.com/Creat55). ### Internal * 🔧 Update sponsors, add Fern. PR [#9956](https://github.com/tiangolo/fastapi/pull/9956) by [@tiangolo](https://github.com/tiangolo). * 👷 Update FastAPI People token. PR [#9844](https://github.com/tiangolo/fastapi/pull/9844) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People. PR [#9775](https://github.com/tiangolo/fastapi/pull/9775) by [@tiangolo](https://github.com/tiangolo). * 👷 Update MkDocs Material token. PR [#9843](https://github.com/tiangolo/fastapi/pull/9843) by [@tiangolo](https://github.com/tiangolo). * 👷 Update token for latest changes. PR [#9842](https://github.com/tiangolo/fastapi/pull/9842) by [@tiangolo](https://github.com/tiangolo). ## 0.100.0 ✨ Support for **Pydantic v2** ✨ Pydantic version 2 has the **core** re-written in **Rust** and includes a lot of improvements and features, for example: * Improved **correctness** in corner cases. * **Safer** types. * Better **performance** and **less energy** consumption. * Better **extensibility**. * etc. ...all this while keeping the **same Python API**. In most of the cases, for simple models, you can simply upgrade the Pydantic version and get all the benefits. 🚀 In some cases, for pure data validation and processing, you can get performance improvements of **20x** or more. This means 2,000% or more. 🤯 When you use **FastAPI**, there's a lot more going on, processing the request and response, handling dependencies, executing **your own code**, and particularly, **waiting for the network**. But you will probably still get some nice performance improvements just from the upgrade. The focus of this release is **compatibility** with Pydantic v1 and v2, to make sure your current apps keep working. Later there will be more focus on refactors, correctness, code improvements, and then **performance** improvements. Some third-party early beta testers that ran benchmarks on the beta releases of FastAPI reported improvements of **2x - 3x**. Which is not bad for just doing `pip install --upgrade fastapi pydantic`. This was not an official benchmark and I didn't check it myself, but it's a good sign. ### Migration Check out the [Pydantic migration guide](https://docs.pydantic.dev/2.0/migration/). For the things that need changes in your Pydantic models, the Pydantic team built [`bump-pydantic`](https://github.com/pydantic/bump-pydantic). A command line tool that will **process your code** and update most of the things **automatically** for you. Make sure you have your code in git first, and review each of the changes to make sure everything is correct before committing the changes. ### Pydantic v1 **This version of FastAPI still supports Pydantic v1**. And although Pydantic v1 will be deprecated at some point, it will still be supported for a while. This means that you can install the new Pydantic v2, and if something fails, you can install Pydantic v1 while you fix any problems you might have, but having the latest FastAPI. There are **tests for both Pydantic v1 and v2**, and test **coverage** is kept at **100%**. ### Changes * There are **new parameter** fields supported by Pydantic `Field()` for: * `Path()` * `Query()` * `Header()` * `Cookie()` * `Body()` * `Form()` * `File()` * The new parameter fields are: * `default_factory` * `alias_priority` * `validation_alias` * `serialization_alias` * `discriminator` * `strict` * `multiple_of` * `allow_inf_nan` * `max_digits` * `decimal_places` * `json_schema_extra` ...you can read about them in the Pydantic docs. * The parameter `regex` has been deprecated and replaced by `pattern`. * You can read more about it in the docs for [Query Parameters and String Validations: Add regular expressions](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#add-regular-expressions). * New Pydantic models use an improved and simplified attribute `model_config` that takes a simple dict instead of an internal class `Config` for their configuration. * You can read more about it in the docs for [Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/). * The attribute `schema_extra` for the internal class `Config` has been replaced by the key `json_schema_extra` in the new `model_config` dict. * You can read more about it in the docs for [Declare Request Example Data](https://fastapi.tiangolo.com/tutorial/schema-extra-example/). * When you install `"fastapi[all]"` it now also includes: * pydantic-settings - for settings management. * pydantic-extra-types - for extra types to be used with Pydantic. * Now Pydantic Settings is an additional optional package (included in `"fastapi[all]"`). To use settings you should now import `from pydantic_settings import BaseSettings` instead of importing from `pydantic` directly. * You can read more about it in the docs for [Settings and Environment Variables](https://fastapi.tiangolo.com/advanced/settings/). * PR [#9816](https://github.com/tiangolo/fastapi/pull/9816) by [@tiangolo](https://github.com/tiangolo), included all the work done (in multiple PRs) on the beta branch (`main-pv2`). ## 0.99.1 ### Fixes * 🐛 Fix JSON Schema accepting bools as valid JSON Schemas, e.g. `additionalProperties: false`. PR [#9781](https://github.com/tiangolo/fastapi/pull/9781) by [@tiangolo](https://github.com/tiangolo). ### Docs * 📝 Update source examples to use new JSON Schema examples field. PR [#9776](https://github.com/tiangolo/fastapi/pull/9776) by [@tiangolo](https://github.com/tiangolo). ## 0.99.0 ### Features * ✨ Add support for OpenAPI 3.1.0. PR [#9770](https://github.com/tiangolo/fastapi/pull/9770) by [@tiangolo](https://github.com/tiangolo). * New support for documenting **webhooks**, read the new docs here: Advanced User Guide: OpenAPI Webhooks. * Upgrade OpenAPI 3.1.0, this uses JSON Schema 2020-12. * Upgrade Swagger UI to version 5.x.x, that supports OpenAPI 3.1.0. * Updated `examples` field in `Query()`, `Cookie()`, `Body()`, etc. based on the latest JSON Schema and OpenAPI. Now it takes a list of examples and they are included directly in the JSON Schema, not outside. Read more about it (including the historical technical details) in the updated docs: Tutorial: Declare Request Example Data. * ✨ Add support for `deque` objects and children in `jsonable_encoder`. PR [#9433](https://github.com/tiangolo/fastapi/pull/9433) by [@cranium](https://github.com/cranium). ### Docs * 📝 Fix form for the FastAPI and friends newsletter. PR [#9749](https://github.com/tiangolo/fastapi/pull/9749) by [@tiangolo](https://github.com/tiangolo). ### Translations * 🌐 Add Persian translation for `docs/fa/docs/advanced/sub-applications.md`. PR [#9692](https://github.com/tiangolo/fastapi/pull/9692) by [@mojtabapaso](https://github.com/mojtabapaso). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/response-model.md`. PR [#9675](https://github.com/tiangolo/fastapi/pull/9675) by [@glsglsgls](https://github.com/glsglsgls). ### Internal * 🔨 Enable linenums in MkDocs Material during local live development to simplify highlighting code. PR [#9769](https://github.com/tiangolo/fastapi/pull/9769) by [@tiangolo](https://github.com/tiangolo). * ⬆ Update httpx requirement from <0.24.0,>=0.23.0 to >=0.23.0,<0.25.0. PR [#9724](https://github.com/tiangolo/fastapi/pull/9724) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump mkdocs-material from 9.1.16 to 9.1.17. PR [#9746](https://github.com/tiangolo/fastapi/pull/9746) by [@dependabot[bot]](https://github.com/apps/dependabot). * 🔥 Remove missing translation dummy pages, no longer necessary. PR [#9751](https://github.com/tiangolo/fastapi/pull/9751) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#9259](https://github.com/tiangolo/fastapi/pull/9259) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ✨ Add Material for MkDocs Insiders features and cards. PR [#9748](https://github.com/tiangolo/fastapi/pull/9748) by [@tiangolo](https://github.com/tiangolo). * 🔥 Remove languages without translations. PR [#9743](https://github.com/tiangolo/fastapi/pull/9743) by [@tiangolo](https://github.com/tiangolo). * ✨ Refactor docs for building scripts, use MkDocs hooks, simplify (remove) configs for languages. PR [#9742](https://github.com/tiangolo/fastapi/pull/9742) by [@tiangolo](https://github.com/tiangolo). * 🔨 Add MkDocs hook that renames sections based on the first index file. PR [#9737](https://github.com/tiangolo/fastapi/pull/9737) by [@tiangolo](https://github.com/tiangolo). * 👷 Make cron jobs run only on main repo, not on forks, to avoid error notifications from missing tokens. PR [#9735](https://github.com/tiangolo/fastapi/pull/9735) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update MkDocs for other languages. PR [#9734](https://github.com/tiangolo/fastapi/pull/9734) by [@tiangolo](https://github.com/tiangolo). * 👷 Refactor Docs CI, run in multiple workers with a dynamic matrix to optimize speed. PR [#9732](https://github.com/tiangolo/fastapi/pull/9732) by [@tiangolo](https://github.com/tiangolo). * 🔥 Remove old internal GitHub Action watch-previews that is no longer needed. PR [#9730](https://github.com/tiangolo/fastapi/pull/9730) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade MkDocs and MkDocs Material. PR [#9729](https://github.com/tiangolo/fastapi/pull/9729) by [@tiangolo](https://github.com/tiangolo). * 👷 Build and deploy docs only on docs changes. PR [#9728](https://github.com/tiangolo/fastapi/pull/9728) by [@tiangolo](https://github.com/tiangolo). ## 0.98.0 ### Features * ✨ Allow disabling `redirect_slashes` at the FastAPI app level. PR [#3432](https://github.com/tiangolo/fastapi/pull/3432) by [@cyberlis](https://github.com/cyberlis). ### Docs * 📝 Update docs on Pydantic using ujson internally. PR [#5804](https://github.com/tiangolo/fastapi/pull/5804) by [@mvasilkov](https://github.com/mvasilkov). * ✏ Rewording in `docs/en/docs/tutorial/debugging.md`. PR [#9581](https://github.com/tiangolo/fastapi/pull/9581) by [@ivan-abc](https://github.com/ivan-abc). * 📝 Add german blog post (Domain-driven Design mit Python und FastAPI). PR [#9261](https://github.com/tiangolo/fastapi/pull/9261) by [@msander](https://github.com/msander). * ✏️ Tweak wording in `docs/en/docs/tutorial/security/index.md`. PR [#9561](https://github.com/tiangolo/fastapi/pull/9561) by [@jyothish-mohan](https://github.com/jyothish-mohan). * 📝 Update `Annotated` notes in `docs/en/docs/tutorial/schema-extra-example.md`. PR [#9620](https://github.com/tiangolo/fastapi/pull/9620) by [@Alexandrhub](https://github.com/Alexandrhub). * ✏️ Fix typo `Annotation` -> `Annotated` in `docs/en/docs/tutorial/query-params-str-validations.md`. PR [#9625](https://github.com/tiangolo/fastapi/pull/9625) by [@mccricardo](https://github.com/mccricardo). * 📝 Use in memory database for testing SQL in docs. PR [#1223](https://github.com/tiangolo/fastapi/pull/1223) by [@HarshaLaxman](https://github.com/HarshaLaxman). ### Translations * 🌐 Add Russian translation for `docs/ru/docs/tutorial/metadata.md`. PR [#9681](https://github.com/tiangolo/fastapi/pull/9681) by [@TabarakoAkula](https://github.com/TabarakoAkula). * 🌐 Fix typo in Spanish translation for `docs/es/docs/tutorial/first-steps.md`. PR [#9571](https://github.com/tiangolo/fastapi/pull/9571) by [@lilidl-nft](https://github.com/lilidl-nft). * 🌐 Add Russian translation for `docs/tutorial/path-operation-configuration.md`. PR [#9696](https://github.com/tiangolo/fastapi/pull/9696) by [@TabarakoAkula](https://github.com/TabarakoAkula). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/security/index.md`. PR [#9666](https://github.com/tiangolo/fastapi/pull/9666) by [@lordqyxz](https://github.com/lordqyxz). * 🌐 Add Chinese translations for `docs/zh/docs/advanced/settings.md`. PR [#9652](https://github.com/tiangolo/fastapi/pull/9652) by [@ChoyeonChern](https://github.com/ChoyeonChern). * 🌐 Add Chinese translations for `docs/zh/docs/advanced/websockets.md`. PR [#9651](https://github.com/tiangolo/fastapi/pull/9651) by [@ChoyeonChern](https://github.com/ChoyeonChern). * 🌐 Add Chinese translation for `docs/zh/docs/tutorial/testing.md`. PR [#9641](https://github.com/tiangolo/fastapi/pull/9641) by [@wdh99](https://github.com/wdh99). * 🌐 Add Russian translation for `docs/tutorial/extra-models.md`. PR [#9619](https://github.com/tiangolo/fastapi/pull/9619) by [@ivan-abc](https://github.com/ivan-abc). * 🌐 Add Russian translation for `docs/tutorial/cors.md`. PR [#9608](https://github.com/tiangolo/fastapi/pull/9608) by [@ivan-abc](https://github.com/ivan-abc). * 🌐 Add Polish translation for `docs/pl/docs/features.md`. PR [#5348](https://github.com/tiangolo/fastapi/pull/5348) by [@mbroton](https://github.com/mbroton). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/body-nested-models.md`. PR [#9605](https://github.com/tiangolo/fastapi/pull/9605) by [@Alexandrhub](https://github.com/Alexandrhub). ### Internal * ⬆ Bump ruff from 0.0.272 to 0.0.275. PR [#9721](https://github.com/tiangolo/fastapi/pull/9721) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Update uvicorn[standard] requirement from <0.21.0,>=0.12.0 to >=0.12.0,<0.23.0. PR [#9463](https://github.com/tiangolo/fastapi/pull/9463) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump mypy from 1.3.0 to 1.4.0. PR [#9719](https://github.com/tiangolo/fastapi/pull/9719) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Update pre-commit requirement from <3.0.0,>=2.17.0 to >=2.17.0,<4.0.0. PR [#9251](https://github.com/tiangolo/fastapi/pull/9251) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump pypa/gh-action-pypi-publish from 1.8.5 to 1.8.6. PR [#9482](https://github.com/tiangolo/fastapi/pull/9482) by [@dependabot[bot]](https://github.com/apps/dependabot). * ✏️ Fix tooltips for light/dark theme toggler in docs. PR [#9588](https://github.com/tiangolo/fastapi/pull/9588) by [@pankaj1707k](https://github.com/pankaj1707k). * 🔧 Set minimal hatchling version needed to build the package. PR [#9240](https://github.com/tiangolo/fastapi/pull/9240) by [@mgorny](https://github.com/mgorny). * 📝 Add repo link to PyPI. PR [#9559](https://github.com/tiangolo/fastapi/pull/9559) by [@JacobCoffee](https://github.com/JacobCoffee). * ✏️ Fix typos in data for tests. PR [#4958](https://github.com/tiangolo/fastapi/pull/4958) by [@ryanrussell](https://github.com/ryanrussell). * 🔧 Update sponsors, add Flint. PR [#9699](https://github.com/tiangolo/fastapi/pull/9699) by [@tiangolo](https://github.com/tiangolo). * 👷 Lint in CI only once, only with one version of Python, run tests with all of them. PR [#9686](https://github.com/tiangolo/fastapi/pull/9686) by [@tiangolo](https://github.com/tiangolo). ## 0.97.0 ### Features * ✨ Add support for `dependencies` in WebSocket routes. PR [#4534](https://github.com/tiangolo/fastapi/pull/4534) by [@paulo-raca](https://github.com/paulo-raca). * ✨ Add exception handler for `WebSocketRequestValidationError` (which also allows to override it). PR [#6030](https://github.com/tiangolo/fastapi/pull/6030) by [@kristjanvalur](https://github.com/kristjanvalur). ### Refactors * ⬆️ Upgrade and fully migrate to Ruff, remove isort, includes a couple of tweaks suggested by the new version of Ruff. PR [#9660](https://github.com/tiangolo/fastapi/pull/9660) by [@tiangolo](https://github.com/tiangolo). * ♻️ Update internal type annotations and upgrade mypy. PR [#9658](https://github.com/tiangolo/fastapi/pull/9658) by [@tiangolo](https://github.com/tiangolo). * ♻️ Simplify `AsyncExitStackMiddleware` as without Python 3.6 `AsyncExitStack` is always available. PR [#9657](https://github.com/tiangolo/fastapi/pull/9657) by [@tiangolo](https://github.com/tiangolo). ### Upgrades * ⬆️ Upgrade Black. PR [#9661](https://github.com/tiangolo/fastapi/pull/9661) by [@tiangolo](https://github.com/tiangolo). ### Internal * 💚 Update CI cache to fix installs when dependencies change. PR [#9659](https://github.com/tiangolo/fastapi/pull/9659) by [@tiangolo](https://github.com/tiangolo). * ⬇️ Separate requirements for development into their own requirements.txt files, they shouldn't be extras. PR [#9655](https://github.com/tiangolo/fastapi/pull/9655) by [@tiangolo](https://github.com/tiangolo). ## 0.96.1 ### Fixes * 🐛 Fix `HTTPException` header type annotations. PR [#9648](https://github.com/tiangolo/fastapi/pull/9648) by [@tiangolo](https://github.com/tiangolo). * 🐛 Fix OpenAPI model fields int validations, `gte` to `ge`. PR [#9635](https://github.com/tiangolo/fastapi/pull/9635) by [@tiangolo](https://github.com/tiangolo). ### Upgrades * 📌 Update minimum version of Pydantic to >=1.7.4. This fixes an issue when trying to use an old version of Pydantic. PR [#9567](https://github.com/tiangolo/fastapi/pull/9567) by [@Kludex](https://github.com/Kludex). ### Refactors * ♻ Remove `media_type` from `ORJSONResponse` as it's inherited from the parent class. PR [#5805](https://github.com/tiangolo/fastapi/pull/5805) by [@Kludex](https://github.com/Kludex). * ♻ Instantiate `HTTPException` only when needed, optimization refactor. PR [#5356](https://github.com/tiangolo/fastapi/pull/5356) by [@pawamoy](https://github.com/pawamoy). ### Docs * 🔥 Remove link to Pydantic's benchmark, as it was removed there. PR [#5811](https://github.com/tiangolo/fastapi/pull/5811) by [@Kludex](https://github.com/Kludex). ### Translations * 🌐 Fix spelling in Indonesian translation of `docs/id/docs/tutorial/index.md`. PR [#5635](https://github.com/tiangolo/fastapi/pull/5635) by [@purwowd](https://github.com/purwowd). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/index.md`. PR [#5896](https://github.com/tiangolo/fastapi/pull/5896) by [@Wilidon](https://github.com/Wilidon). * 🌐 Add Chinese translations for `docs/zh/docs/advanced/response-change-status-code.md` and `docs/zh/docs/advanced/response-headers.md`. PR [#9544](https://github.com/tiangolo/fastapi/pull/9544) by [@ChoyeonChern](https://github.com/ChoyeonChern). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/schema-extra-example.md`. PR [#9621](https://github.com/tiangolo/fastapi/pull/9621) by [@Alexandrhub](https://github.com/Alexandrhub). ### Internal * 🔧 Add sponsor Platform.sh. PR [#9650](https://github.com/tiangolo/fastapi/pull/9650) by [@tiangolo](https://github.com/tiangolo). * 👷 Add custom token to Smokeshow and Preview Docs for download-artifact, to prevent API rate limits. PR [#9646](https://github.com/tiangolo/fastapi/pull/9646) by [@tiangolo](https://github.com/tiangolo). * 👷 Add custom tokens for GitHub Actions to avoid rate limits. PR [#9647](https://github.com/tiangolo/fastapi/pull/9647) by [@tiangolo](https://github.com/tiangolo). ## 0.96.0 ### Features * ⚡ Update `create_cloned_field` to use a global cache and improve startup performance. PR [#4645](https://github.com/tiangolo/fastapi/pull/4645) by [@madkinsz](https://github.com/madkinsz) and previous original PR by [@huonw](https://github.com/huonw). ### Docs * 📝 Update Deta deployment tutorial for compatibility with Deta Space. PR [#6004](https://github.com/tiangolo/fastapi/pull/6004) by [@mikBighne98](https://github.com/mikBighne98). * ✏️ Fix typo in Deta deployment tutorial. PR [#9501](https://github.com/tiangolo/fastapi/pull/9501) by [@lemonyte](https://github.com/lemonyte). ### Translations * 🌐 Add Russian translation for `docs/tutorial/body.md`. PR [#3885](https://github.com/tiangolo/fastapi/pull/3885) by [@solomein-sv](https://github.com/solomein-sv). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/static-files.md`. PR [#9580](https://github.com/tiangolo/fastapi/pull/9580) by [@Alexandrhub](https://github.com/Alexandrhub). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/query-params.md`. PR [#9584](https://github.com/tiangolo/fastapi/pull/9584) by [@Alexandrhub](https://github.com/Alexandrhub). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/first-steps.md`. PR [#9471](https://github.com/tiangolo/fastapi/pull/9471) by [@AGolicyn](https://github.com/AGolicyn). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/debugging.md`. PR [#9579](https://github.com/tiangolo/fastapi/pull/9579) by [@Alexandrhub](https://github.com/Alexandrhub). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/path-params.md`. PR [#9519](https://github.com/tiangolo/fastapi/pull/9519) by [@AGolicyn](https://github.com/AGolicyn). * 🌐 Add Chinese translation for `docs/zh/docs/tutorial/static-files.md`. PR [#9436](https://github.com/tiangolo/fastapi/pull/9436) by [@wdh99](https://github.com/wdh99). * 🌐 Update Spanish translation including new illustrations in `docs/es/docs/async.md`. PR [#9483](https://github.com/tiangolo/fastapi/pull/9483) by [@andresbermeoq](https://github.com/andresbermeoq). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/path-params-numeric-validations.md`. PR [#9563](https://github.com/tiangolo/fastapi/pull/9563) by [@ivan-abc](https://github.com/ivan-abc). * 🌐 Add Russian translation for `docs/ru/docs/deployment/concepts.md`. PR [#9577](https://github.com/tiangolo/fastapi/pull/9577) by [@Xewus](https://github.com/Xewus). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/body-multiple-params.md`. PR [#9586](https://github.com/tiangolo/fastapi/pull/9586) by [@Alexandrhub](https://github.com/Alexandrhub). ### Internal * 👥 Update FastAPI People. PR [#9602](https://github.com/tiangolo/fastapi/pull/9602) by [@github-actions[bot]](https://github.com/apps/github-actions). * 🔧 Update sponsors, remove InvestSuite. PR [#9612](https://github.com/tiangolo/fastapi/pull/9612) by [@tiangolo](https://github.com/tiangolo). ## 0.95.2 * ⬆️ Upgrade Starlette version to `>=0.27.0` for a security release. PR [#9541](https://github.com/tiangolo/fastapi/pull/9541) by [@tiangolo](https://github.com/tiangolo). Details on [Starlette's security advisory](https://github.com/encode/starlette/security/advisories/GHSA-v5gw-mw7f-84px). ### Translations * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/events.md`. PR [#9326](https://github.com/tiangolo/fastapi/pull/9326) by [@oandersonmagalhaes](https://github.com/oandersonmagalhaes). * 🌐 Add Russian translation for `docs/ru/docs/deployment/manually.md`. PR [#9417](https://github.com/tiangolo/fastapi/pull/9417) by [@Xewus](https://github.com/Xewus). * 🌐 Add setup for translations to Lao. PR [#9396](https://github.com/tiangolo/fastapi/pull/9396) by [@TheBrown](https://github.com/TheBrown). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/testing.md`. PR [#9403](https://github.com/tiangolo/fastapi/pull/9403) by [@Xewus](https://github.com/Xewus). * 🌐 Add Russian translation for `docs/ru/docs/deployment/https.md`. PR [#9428](https://github.com/tiangolo/fastapi/pull/9428) by [@Xewus](https://github.com/Xewus). * ✏ Fix command to install requirements in Windows. PR [#9445](https://github.com/tiangolo/fastapi/pull/9445) by [@MariiaRomanuik](https://github.com/MariiaRomanuik). * 🌐 Add French translation for `docs/fr/docs/advanced/response-directly.md`. PR [#9415](https://github.com/tiangolo/fastapi/pull/9415) by [@axel584](https://github.com/axel584). * 🌐 Initiate Czech translation setup. PR [#9288](https://github.com/tiangolo/fastapi/pull/9288) by [@3p1463k](https://github.com/3p1463k). * ✏ Fix typo in Portuguese docs for `docs/pt/docs/index.md`. PR [#9337](https://github.com/tiangolo/fastapi/pull/9337) by [@lucasbalieiro](https://github.com/lucasbalieiro). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/response-status-code.md`. PR [#9370](https://github.com/tiangolo/fastapi/pull/9370) by [@nadia3373](https://github.com/nadia3373). ### Internal * 🐛 Fix `flask.escape` warning for internal tests. PR [#9468](https://github.com/tiangolo/fastapi/pull/9468) by [@samuelcolvin](https://github.com/samuelcolvin). * ✅ Refactor 2 tests, for consistency and simplification. PR [#9504](https://github.com/tiangolo/fastapi/pull/9504) by [@tiangolo](https://github.com/tiangolo). * ✅ Refactor OpenAPI tests, prepare for Pydantic v2. PR [#9503](https://github.com/tiangolo/fastapi/pull/9503) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump dawidd6/action-download-artifact from 2.26.0 to 2.27.0. PR [#9394](https://github.com/tiangolo/fastapi/pull/9394) by [@dependabot[bot]](https://github.com/apps/dependabot). * 💚 Disable setup-python pip cache in CI. PR [#9438](https://github.com/tiangolo/fastapi/pull/9438) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump pypa/gh-action-pypi-publish from 1.6.4 to 1.8.5. PR [#9346](https://github.com/tiangolo/fastapi/pull/9346) by [@dependabot[bot]](https://github.com/apps/dependabot). ## 0.95.1 ### Fixes * 🐛 Fix using `Annotated` in routers or path operations decorated multiple times. PR [#9315](https://github.com/tiangolo/fastapi/pull/9315) by [@sharonyogev](https://github.com/sharonyogev). ### Docs * 🌐 🔠 📄 🐢 Translate docs to Emoji 🥳 🎉 💥 🤯 🤯. PR [#5385](https://github.com/tiangolo/fastapi/pull/5385) by [@LeeeeT](https://github.com/LeeeeT). * 📝 Add notification message warning about old versions of FastAPI not supporting `Annotated`. PR [#9298](https://github.com/tiangolo/fastapi/pull/9298) by [@grdworkin](https://github.com/grdworkin). * 📝 Fix typo in `docs/en/docs/advanced/behind-a-proxy.md`. PR [#5681](https://github.com/tiangolo/fastapi/pull/5681) by [@Leommjr](https://github.com/Leommjr). * ✏ Fix wrong import from typing module in Persian translations for `docs/fa/docs/index.md`. PR [#6083](https://github.com/tiangolo/fastapi/pull/6083) by [@Kimiaattaei](https://github.com/Kimiaattaei). * ✏️ Fix format, remove unnecessary asterisks in `docs/en/docs/help-fastapi.md`. PR [#9249](https://github.com/tiangolo/fastapi/pull/9249) by [@armgabrielyan](https://github.com/armgabrielyan). * ✏ Fix typo in `docs/en/docs/tutorial/query-params-str-validations.md`. PR [#9272](https://github.com/tiangolo/fastapi/pull/9272) by [@nicornk](https://github.com/nicornk). * ✏ Fix typo/bug in inline code example in `docs/en/docs/tutorial/query-params-str-validations.md`. PR [#9273](https://github.com/tiangolo/fastapi/pull/9273) by [@tim-habitat](https://github.com/tim-habitat). * ✏ Fix typo in `docs/en/docs/tutorial/path-params-numeric-validations.md`. PR [#9282](https://github.com/tiangolo/fastapi/pull/9282) by [@aadarsh977](https://github.com/aadarsh977). * ✏ Fix typo: 'wll' to 'will' in `docs/en/docs/tutorial/query-params-str-validations.md`. PR [#9380](https://github.com/tiangolo/fastapi/pull/9380) by [@dasstyxx](https://github.com/dasstyxx). ### Translations * 🌐 Add French translation for `docs/fr/docs/advanced/index.md`. PR [#5673](https://github.com/tiangolo/fastapi/pull/5673) by [@axel584](https://github.com/axel584). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/body-nested-models.md`. PR [#4053](https://github.com/tiangolo/fastapi/pull/4053) by [@luccasmmg](https://github.com/luccasmmg). * 🌐 Add Russian translation for `docs/ru/docs/alternatives.md`. PR [#5994](https://github.com/tiangolo/fastapi/pull/5994) by [@Xewus](https://github.com/Xewus). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/extra-models.md`. PR [#5912](https://github.com/tiangolo/fastapi/pull/5912) by [@LorhanSohaky](https://github.com/LorhanSohaky). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/path-operation-configuration.md`. PR [#5936](https://github.com/tiangolo/fastapi/pull/5936) by [@LorhanSohaky](https://github.com/LorhanSohaky). * 🌐 Add Russian translation for `docs/ru/docs/contributing.md`. PR [#6002](https://github.com/tiangolo/fastapi/pull/6002) by [@stigsanek](https://github.com/stigsanek). * 🌐 Add Korean translation for `docs/tutorial/dependencies/classes-as-dependencies.md`. PR [#9176](https://github.com/tiangolo/fastapi/pull/9176) by [@sehwan505](https://github.com/sehwan505). * 🌐 Add Russian translation for `docs/ru/docs/project-generation.md`. PR [#9243](https://github.com/tiangolo/fastapi/pull/9243) by [@Xewus](https://github.com/Xewus). * 🌐 Add French translation for `docs/fr/docs/index.md`. PR [#9265](https://github.com/tiangolo/fastapi/pull/9265) by [@frabc](https://github.com/frabc). * 🌐 Add Russian translation for `docs/ru/docs/tutorial/query-params-str-validations.md`. PR [#9267](https://github.com/tiangolo/fastapi/pull/9267) by [@dedkot01](https://github.com/dedkot01). * 🌐 Add Russian translation for `docs/ru/docs/benchmarks.md`. PR [#9271](https://github.com/tiangolo/fastapi/pull/9271) by [@Xewus](https://github.com/Xewus). ### Internal * 🔧 Update sponsors: remove Jina. PR [#9388](https://github.com/tiangolo/fastapi/pull/9388) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, add databento, remove Ines's course and StriveWorks. PR [#9351](https://github.com/tiangolo/fastapi/pull/9351) by [@tiangolo](https://github.com/tiangolo). ## 0.95.0 ### Highlights This release adds support for dependencies and parameters using `Annotated` and recommends its usage. ✨ This has **several benefits**, one of the main ones is that now the parameters of your functions with `Annotated` would **not be affected** at all. If you call those functions in **other places in your code**, the actual **default values** will be kept, your editor will help you notice missing **required arguments**, Python will require you to pass required arguments at **runtime**, you will be able to **use the same functions** for different things and with different libraries (e.g. **Typer** will soon support `Annotated` too, then you could use the same function for an API and a CLI), etc. Because `Annotated` is **standard Python**, you still get all the **benefits** from editors and tools, like **autocompletion**, **inline errors**, etc. One of the **biggest benefits** is that now you can create `Annotated` dependencies that are then shared by multiple *path operation functions*, this will allow you to **reduce** a lot of **code duplication** in your codebase, while keeping all the support from editors and tools. For example, you could have code like this: ```Python def get_current_user(token: str): # authenticate user return User() @app.get("/items/") def read_items(user: User = Depends(get_current_user)): ... @app.post("/items/") def create_item(*, user: User = Depends(get_current_user), item: Item): ... @app.get("/items/{item_id}") def read_item(*, user: User = Depends(get_current_user), item_id: int): ... @app.delete("/items/{item_id}") def delete_item(*, user: User = Depends(get_current_user), item_id: int): ... ``` There's a bit of code duplication for the dependency: ```Python user: User = Depends(get_current_user) ``` ...the bigger the codebase, the more noticeable it is. Now you can create an annotated dependency once, like this: ```Python CurrentUser = Annotated[User, Depends(get_current_user)] ``` And then you can reuse this `Annotated` dependency: ```Python CurrentUser = Annotated[User, Depends(get_current_user)] @app.get("/items/") def read_items(user: CurrentUser): ... @app.post("/items/") def create_item(user: CurrentUser, item: Item): ... @app.get("/items/{item_id}") def read_item(user: CurrentUser, item_id: int): ... @app.delete("/items/{item_id}") def delete_item(user: CurrentUser, item_id: int): ... ``` ...and `CurrentUser` has all the typing information as `User`, so your editor will work as expected (autocompletion and everything), and **FastAPI** will be able to understand the dependency defined in `Annotated`. 😎 Roughly **all the docs** have been rewritten to use `Annotated` as the main way to declare **parameters** and **dependencies**. All the **examples** in the docs now include a version with `Annotated` and a version without it, for each of the specific Python versions (when there are small differences/improvements in more recent versions). There were around 23K new lines added between docs, examples, and tests. 🚀 The key updated docs are: * Python Types Intro: * [Type Hints with Metadata Annotations](https://fastapi.tiangolo.com/python-types/#type-hints-with-metadata-annotations). * Tutorial: * [Query Parameters and String Validations - Additional validation](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#additional-validation) * [Advantages of `Annotated`](https://fastapi.tiangolo.com/tutorial/query-params-str-validations/#advantages-of-annotated) * [Path Parameters and Numeric Validations - Order the parameters as you need, tricks](https://fastapi.tiangolo.com/tutorial/path-params-numeric-validations/#order-the-parameters-as-you-need-tricks) * [Better with `Annotated`](https://fastapi.tiangolo.com/tutorial/path-params-numeric-validations/#better-with-annotated) * [Dependencies - First Steps - Share `Annotated` dependencies](https://fastapi.tiangolo.com/tutorial/dependencies/#share-annotated-dependencies) Special thanks to [@nzig](https://github.com/nzig) for the core implementation and to [@adriangb](https://github.com/adriangb) for the inspiration and idea with [Xpresso](https://github.com/adriangb/xpresso)! 🚀 ### Features * ✨Add support for PEP-593 `Annotated` for specifying dependencies and parameters. PR [#4871](https://github.com/tiangolo/fastapi/pull/4871) by [@nzig](https://github.com/nzig). ### Docs * 📝 Tweak tip recommending `Annotated` in docs. PR [#9270](https://github.com/tiangolo/fastapi/pull/9270) by [@tiangolo](https://github.com/tiangolo). * 📝 Update order of examples, latest Python version first, and simplify version tab names. PR [#9269](https://github.com/tiangolo/fastapi/pull/9269) by [@tiangolo](https://github.com/tiangolo). * 📝 Update all docs to use `Annotated` as the main recommendation, with new examples and tests. PR [#9268](https://github.com/tiangolo/fastapi/pull/9268) by [@tiangolo](https://github.com/tiangolo). ## 0.94.1 ### Fixes * 🎨 Fix types for lifespan, upgrade Starlette to 0.26.1. PR [#9245](https://github.com/tiangolo/fastapi/pull/9245) by [@tiangolo](https://github.com/tiangolo). ## 0.94.0 ### Upgrades * ⬆ Upgrade python-multipart to support 0.0.6. PR [#9212](https://github.com/tiangolo/fastapi/pull/9212) by [@musicinmybrain](https://github.com/musicinmybrain). * ⬆️ Upgrade Starlette version, support new `lifespan` with state. PR [#9239](https://github.com/tiangolo/fastapi/pull/9239) by [@tiangolo](https://github.com/tiangolo). ### Docs * 📝 Update Sentry link in docs. PR [#9218](https://github.com/tiangolo/fastapi/pull/9218) by [@smeubank](https://github.com/smeubank). ### Translations * 🌐 Add Russian translation for `docs/ru/docs/history-design-future.md`. PR [#5986](https://github.com/tiangolo/fastapi/pull/5986) by [@Xewus](https://github.com/Xewus). ### Internal * ➕ Add `pydantic` to PyPI classifiers. PR [#5914](https://github.com/tiangolo/fastapi/pull/5914) by [@yezz123](https://github.com/yezz123). * ⬆ Bump black from 22.10.0 to 23.1.0. PR [#5953](https://github.com/tiangolo/fastapi/pull/5953) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump types-ujson from 5.6.0.0 to 5.7.0.1. PR [#6027](https://github.com/tiangolo/fastapi/pull/6027) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump dawidd6/action-download-artifact from 2.24.3 to 2.26.0. PR [#6034](https://github.com/tiangolo/fastapi/pull/6034) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#5709](https://github.com/tiangolo/fastapi/pull/5709) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). ## 0.93.0 ### Features * ✨ Add support for `lifespan` async context managers (superseding `startup` and `shutdown` events). Initial PR [#2944](https://github.com/tiangolo/fastapi/pull/2944) by [@uSpike](https://github.com/uSpike). Now, instead of using independent `startup` and `shutdown` events, you can define that logic in a single function with `yield` decorated with `@asynccontextmanager` (an async context manager). For example: ```Python from contextlib import asynccontextmanager from fastapi import FastAPI def fake_answer_to_everything_ml_model(x: float): return x * 42 ml_models = {} @asynccontextmanager async def lifespan(app: FastAPI): # Load the ML model ml_models["answer_to_everything"] = fake_answer_to_everything_ml_model yield # Clean up the ML models and release the resources ml_models.clear() app = FastAPI(lifespan=lifespan) @app.get("/predict") async def predict(x: float): result = ml_models["answer_to_everything"](x) return {"result": result} ``` **Note**: This is the recommended way going forward, instead of using `startup` and `shutdown` events. Read more about it in the new docs: [Advanced User Guide: Lifespan Events](https://fastapi.tiangolo.com/advanced/events/). ### Docs * ✏ Fix formatting in `docs/en/docs/tutorial/metadata.md` for `ReDoc`. PR [#6005](https://github.com/tiangolo/fastapi/pull/6005) by [@eykamp](https://github.com/eykamp). ### Translations * 🌐 Tamil translations - initial setup. PR [#5564](https://github.com/tiangolo/fastapi/pull/5564) by [@gusty1g](https://github.com/gusty1g). * 🌐 Add French translation for `docs/fr/docs/advanced/path-operation-advanced-configuration.md`. PR [#9221](https://github.com/tiangolo/fastapi/pull/9221) by [@axel584](https://github.com/axel584). * 🌐 Add French translation for `docs/tutorial/debugging.md`. PR [#9175](https://github.com/tiangolo/fastapi/pull/9175) by [@frabc](https://github.com/frabc). * 🌐 Initiate Armenian translation setup. PR [#5844](https://github.com/tiangolo/fastapi/pull/5844) by [@har8](https://github.com/har8). * 🌐 Add French translation for `deployment/manually.md`. PR [#3693](https://github.com/tiangolo/fastapi/pull/3693) by [@rjNemo](https://github.com/rjNemo). ### Internal * 👷 Update translation bot messages. PR [#9206](https://github.com/tiangolo/fastapi/pull/9206) by [@tiangolo](https://github.com/tiangolo). * 👷 Update translations bot to use Discussions, and notify when a PR is done. PR [#9183](https://github.com/tiangolo/fastapi/pull/9183) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors-badges. PR [#9182](https://github.com/tiangolo/fastapi/pull/9182) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People. PR [#9181](https://github.com/tiangolo/fastapi/pull/9181) by [@github-actions[bot]](https://github.com/apps/github-actions). * 🔊 Log GraphQL errors in FastAPI People, because it returns 200, with a payload with an error. PR [#9171](https://github.com/tiangolo/fastapi/pull/9171) by [@tiangolo](https://github.com/tiangolo). * 💚 Fix/workaround GitHub Actions in Docker with git for FastAPI People. PR [#9169](https://github.com/tiangolo/fastapi/pull/9169) by [@tiangolo](https://github.com/tiangolo). * ♻️ Refactor FastAPI Experts to use only discussions now that questions are migrated. PR [#9165](https://github.com/tiangolo/fastapi/pull/9165) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade analytics. PR [#6025](https://github.com/tiangolo/fastapi/pull/6025) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade and re-enable installing Typer-CLI. PR [#6008](https://github.com/tiangolo/fastapi/pull/6008) by [@tiangolo](https://github.com/tiangolo). ## 0.92.0 🚨 This is a security fix. Please upgrade as soon as possible. ### Upgrades * ⬆️ Upgrade Starlette to 0.25.0. PR [#5996](https://github.com/tiangolo/fastapi/pull/5996) by [@tiangolo](https://github.com/tiangolo). * This solves a vulnerability that could allow denial of service attacks by using many small multipart fields/files (parts), consuming high CPU and memory. * Only applications using forms (e.g. file uploads) could be affected. * For most cases, upgrading won't have any breaking changes. ## 0.91.0 ### Upgrades * ⬆️ Upgrade Starlette version to `0.24.0` and refactor internals for compatibility. PR [#5985](https://github.com/tiangolo/fastapi/pull/5985) by [@tiangolo](https://github.com/tiangolo). * This can solve nuanced errors when using middlewares. Before Starlette `0.24.0`, a new instance of each middleware class would be created when a new middleware was added. That normally was not a problem, unless the middleware class expected to be created only once, with only one instance, that happened in some cases. This upgrade would solve those cases (thanks [@adriangb](https://github.com/adriangb)! Starlette PR [#2017](https://github.com/encode/starlette/pull/2017)). Now the middleware class instances are created once, right before the first request (the first time the app is called). * If you depended on that previous behavior, you might need to update your code. As always, make sure your tests pass before merging the upgrade. ## 0.90.1 ### Upgrades * ⬆️ Upgrade Starlette range to allow 0.23.1. PR [#5980](https://github.com/tiangolo/fastapi/pull/5980) by [@tiangolo](https://github.com/tiangolo). ### Docs * ✏ Tweak wording to clarify `docs/en/docs/project-generation.md`. PR [#5930](https://github.com/tiangolo/fastapi/pull/5930) by [@chandra-deb](https://github.com/chandra-deb). * ✏ Update Pydantic GitHub URLs. PR [#5952](https://github.com/tiangolo/fastapi/pull/5952) by [@yezz123](https://github.com/yezz123). * 📝 Add opinion from Cisco. PR [#5981](https://github.com/tiangolo/fastapi/pull/5981) by [@tiangolo](https://github.com/tiangolo). ### Translations * 🌐 Add Russian translation for `docs/ru/docs/tutorial/cookie-params.md`. PR [#5890](https://github.com/tiangolo/fastapi/pull/5890) by [@bnzone](https://github.com/bnzone). ### Internal * ✏ Update `zip-docs.sh` internal script, remove extra space. PR [#5931](https://github.com/tiangolo/fastapi/pull/5931) by [@JuanPerdomo00](https://github.com/JuanPerdomo00). ## 0.90.0 ### Upgrades * ⬆️ Bump Starlette from 0.22.0 to 0.23.0. Initial PR [#5739](https://github.com/tiangolo/fastapi/pull/5739) by [@Kludex](https://github.com/Kludex). ### Docs * 📝 Add article "Tortoise ORM / FastAPI 整合快速筆記" to External Links. PR [#5496](https://github.com/tiangolo/fastapi/pull/5496) by [@Leon0824](https://github.com/Leon0824). * 👥 Update FastAPI People. PR [#5954](https://github.com/tiangolo/fastapi/pull/5954) by [@github-actions[bot]](https://github.com/apps/github-actions). * 📝 Micro-tweak help docs. PR [#5960](https://github.com/tiangolo/fastapi/pull/5960) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update new issue chooser to direct to GitHub Discussions. PR [#5948](https://github.com/tiangolo/fastapi/pull/5948) by [@tiangolo](https://github.com/tiangolo). * 📝 Recommend GitHub Discussions for questions. PR [#5944](https://github.com/tiangolo/fastapi/pull/5944) by [@tiangolo](https://github.com/tiangolo). ### Translations * 🌐 Add Russian translation for `docs/ru/docs/tutorial/body-fields.md`. PR [#5898](https://github.com/tiangolo/fastapi/pull/5898) by [@simatheone](https://github.com/simatheone). * 🌐 Add Russian translation for `docs/ru/docs/help-fastapi.md`. PR [#5970](https://github.com/tiangolo/fastapi/pull/5970) by [@tiangolo](https://github.com/tiangolo). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/static-files.md`. PR [#5858](https://github.com/tiangolo/fastapi/pull/5858) by [@batlopes](https://github.com/batlopes). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/encoder.md`. PR [#5525](https://github.com/tiangolo/fastapi/pull/5525) by [@felipebpl](https://github.com/felipebpl). * 🌐 Add Russian translation for `docs/ru/docs/contributing.md`. PR [#5870](https://github.com/tiangolo/fastapi/pull/5870) by [@Xewus](https://github.com/Xewus). ### Internal * ⬆️ Upgrade Ubuntu version for docs workflow. PR [#5971](https://github.com/tiangolo/fastapi/pull/5971) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors badges. PR [#5943](https://github.com/tiangolo/fastapi/pull/5943) by [@tiangolo](https://github.com/tiangolo). * ✨ Compute FastAPI Experts including GitHub Discussions. PR [#5941](https://github.com/tiangolo/fastapi/pull/5941) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade isort and update pre-commit. PR [#5940](https://github.com/tiangolo/fastapi/pull/5940) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add template for questions in Discussions. PR [#5920](https://github.com/tiangolo/fastapi/pull/5920) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update Sponsor Budget Insight to Powens. PR [#5916](https://github.com/tiangolo/fastapi/pull/5916) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update GitHub Sponsors badge data. PR [#5915](https://github.com/tiangolo/fastapi/pull/5915) by [@tiangolo](https://github.com/tiangolo). ## 0.89.1 ### Fixes * 🐛 Ignore Response classes on return annotation. PR [#5855](https://github.com/tiangolo/fastapi/pull/5855) by [@Kludex](https://github.com/Kludex). See the new docs in the PR below. ### Docs * 📝 Update docs and examples for Response Model with Return Type Annotations, and update runtime error. PR [#5873](https://github.com/tiangolo/fastapi/pull/5873) by [@tiangolo](https://github.com/tiangolo). New docs at [Response Model - Return Type: Other Return Type Annotations](https://fastapi.tiangolo.com/tutorial/response-model/#other-return-type-annotations). * 📝 Add External Link: FastAPI lambda container: serverless simplified. PR [#5784](https://github.com/tiangolo/fastapi/pull/5784) by [@rafrasenberg](https://github.com/rafrasenberg). ### Translations * 🌐 Add Turkish translation for `docs/tr/docs/tutorial/first_steps.md`. PR [#5691](https://github.com/tiangolo/fastapi/pull/5691) by [@Kadermiyanyedi](https://github.com/Kadermiyanyedi). ## 0.89.0 ### Features * ✨ Add support for function return type annotations to declare the `response_model`. Initial PR [#1436](https://github.com/tiangolo/fastapi/pull/1436) by [@uriyyo](https://github.com/uriyyo). Now you can declare the return type / `response_model` in the function return type annotation: ```python from fastapi import FastAPI from pydantic import BaseModel app = FastAPI() class Item(BaseModel): name: str price: float @app.get("/items/") async def read_items() -> list[Item]: return [ Item(name="Portal Gun", price=42.0), Item(name="Plumbus", price=32.0), ] ``` FastAPI will use the return type annotation to perform: * Data validation * Automatic documentation * It could power automatic client generators * **Data filtering** Before this version it was only supported via the `response_model` parameter. Read more about it in the new docs: [Response Model - Return Type](https://fastapi.tiangolo.com/tutorial/response-model/). ### Docs * 📝 Add External Link: Authorization on FastAPI with Casbin. PR [#5712](https://github.com/tiangolo/fastapi/pull/5712) by [@Xhy-5000](https://github.com/Xhy-5000). * ✏ Fix typo in `docs/en/docs/async.md`. PR [#5785](https://github.com/tiangolo/fastapi/pull/5785) by [@Kingdageek](https://github.com/Kingdageek). * ✏ Fix typo in `docs/en/docs/deployment/concepts.md`. PR [#5824](https://github.com/tiangolo/fastapi/pull/5824) by [@kelbyfaessler](https://github.com/kelbyfaessler). ### Translations * 🌐 Add Russian translation for `docs/ru/docs/fastapi-people.md`. PR [#5577](https://github.com/tiangolo/fastapi/pull/5577) by [@Xewus](https://github.com/Xewus). * 🌐 Fix typo in Chinese translation for `docs/zh/docs/benchmarks.md`. PR [#4269](https://github.com/tiangolo/fastapi/pull/4269) by [@15027668g](https://github.com/15027668g). * 🌐 Add Korean translation for `docs/tutorial/cors.md`. PR [#3764](https://github.com/tiangolo/fastapi/pull/3764) by [@NinaHwang](https://github.com/NinaHwang). ### Internal * ⬆ Update coverage[toml] requirement from <7.0,>=6.5.0 to >=6.5.0,<8.0. PR [#5801](https://github.com/tiangolo/fastapi/pull/5801) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Update uvicorn[standard] requirement from <0.19.0,>=0.12.0 to >=0.12.0,<0.21.0 for development. PR [#5795](https://github.com/tiangolo/fastapi/pull/5795) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump dawidd6/action-download-artifact from 2.24.2 to 2.24.3. PR [#5842](https://github.com/tiangolo/fastapi/pull/5842) by [@dependabot[bot]](https://github.com/apps/dependabot). * 👥 Update FastAPI People. PR [#5825](https://github.com/tiangolo/fastapi/pull/5825) by [@github-actions[bot]](https://github.com/apps/github-actions). * ⬆ Bump types-ujson from 5.5.0 to 5.6.0.0. PR [#5735](https://github.com/tiangolo/fastapi/pull/5735) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump pypa/gh-action-pypi-publish from 1.5.2 to 1.6.4. PR [#5750](https://github.com/tiangolo/fastapi/pull/5750) by [@dependabot[bot]](https://github.com/apps/dependabot). * 👷 Add GitHub Action gate/check. PR [#5492](https://github.com/tiangolo/fastapi/pull/5492) by [@webknjaz](https://github.com/webknjaz). * 🔧 Update sponsors, add Svix. PR [#5848](https://github.com/tiangolo/fastapi/pull/5848) by [@tiangolo](https://github.com/tiangolo). * 🔧 Remove Doist sponsor. PR [#5847](https://github.com/tiangolo/fastapi/pull/5847) by [@tiangolo](https://github.com/tiangolo). * ⬆ Update sqlalchemy requirement from <=1.4.41,>=1.3.18 to >=1.3.18,<1.4.43. PR [#5540](https://github.com/tiangolo/fastapi/pull/5540) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump nwtgck/actions-netlify from 1.2.4 to 2.0.0. PR [#5757](https://github.com/tiangolo/fastapi/pull/5757) by [@dependabot[bot]](https://github.com/apps/dependabot). * 👷 Refactor CI artifact upload/download for docs previews. PR [#5793](https://github.com/tiangolo/fastapi/pull/5793) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump pypa/gh-action-pypi-publish from 1.5.1 to 1.5.2. PR [#5714](https://github.com/tiangolo/fastapi/pull/5714) by [@dependabot[bot]](https://github.com/apps/dependabot). * 👥 Update FastAPI People. PR [#5722](https://github.com/tiangolo/fastapi/pull/5722) by [@github-actions[bot]](https://github.com/apps/github-actions). * 🔧 Update sponsors, disable course bundle. PR [#5713](https://github.com/tiangolo/fastapi/pull/5713) by [@tiangolo](https://github.com/tiangolo). * ⬆ Update typer[all] requirement from <0.7.0,>=0.6.1 to >=0.6.1,<0.8.0. PR [#5639](https://github.com/tiangolo/fastapi/pull/5639) by [@dependabot[bot]](https://github.com/apps/dependabot). ## 0.88.0 ### Upgrades * ⬆ Bump Starlette to version `0.22.0` to fix bad encoding for query parameters in new `TestClient`. PR [#5659](https://github.com/tiangolo/fastapi/pull/5659) by [@azogue](https://github.com/azogue). ### Docs * ✏️ Fix typo in docs for `docs/en/docs/advanced/middleware.md`. PR [#5376](https://github.com/tiangolo/fastapi/pull/5376) by [@rifatrakib](https://github.com/rifatrakib). ### Translations * 🌐 Add Portuguese translation for `docs/pt/docs/deployment/docker.md`. PR [#5663](https://github.com/tiangolo/fastapi/pull/5663) by [@ayr-ton](https://github.com/ayr-ton). ### Internal * 👷 Tweak build-docs to improve CI performance. PR [#5699](https://github.com/tiangolo/fastapi/pull/5699) by [@tiangolo](https://github.com/tiangolo). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#5566](https://github.com/tiangolo/fastapi/pull/5566) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ⬆️ Upgrade Ruff. PR [#5698](https://github.com/tiangolo/fastapi/pull/5698) by [@tiangolo](https://github.com/tiangolo). * 👷 Remove pip cache for Smokeshow as it depends on a requirements.txt. PR [#5700](https://github.com/tiangolo/fastapi/pull/5700) by [@tiangolo](https://github.com/tiangolo). * 💚 Fix pip cache for Smokeshow. PR [#5697](https://github.com/tiangolo/fastapi/pull/5697) by [@tiangolo](https://github.com/tiangolo). * 👷 Fix and tweak CI cache handling. PR [#5696](https://github.com/tiangolo/fastapi/pull/5696) by [@tiangolo](https://github.com/tiangolo). * 👷 Update `setup-python` action in tests to use new caching feature. PR [#5680](https://github.com/tiangolo/fastapi/pull/5680) by [@madkinsz](https://github.com/madkinsz). * ⬆ Bump black from 22.8.0 to 22.10.0. PR [#5569](https://github.com/tiangolo/fastapi/pull/5569) by [@dependabot[bot]](https://github.com/apps/dependabot). ## 0.87.0 Highlights of this release: * [Upgraded Starlette](https://github.com/encode/starlette/releases/tag/0.21.0) * Now the `TestClient` is based on HTTPX instead of Requests. 🚀 * There are some possible **breaking changes** in the `TestClient` usage, but [@Kludex](https://github.com/Kludex) built [bump-testclient](https://github.com/Kludex/bump-testclient) to help you automatize migrating your tests. Make sure you are using Git and that you can undo any unnecessary changes (false positive changes, etc) before using `bump-testclient`. * New [WebSocketException (and docs)](https://fastapi.tiangolo.com/advanced/websockets/#using-depends-and-others), re-exported from Starlette. * Upgraded and relaxed dependencies for package extras `all` (including new Uvicorn version), when you install `"fastapi[all]"`. * New docs about how to [**Help Maintain FastAPI**](https://fastapi.tiangolo.com/help-fastapi/#help-maintain-fastapi). ### Features * ⬆️ Upgrade and relax dependencies for extras "all". PR [#5634](https://github.com/tiangolo/fastapi/pull/5634) by [@tiangolo](https://github.com/tiangolo). * ✨ Re-export Starlette's `WebSocketException` and add it to docs. PR [#5629](https://github.com/tiangolo/fastapi/pull/5629) by [@tiangolo](https://github.com/tiangolo). * 📝 Update references to Requests for tests to HTTPX, and add HTTPX to extras. PR [#5628](https://github.com/tiangolo/fastapi/pull/5628) by [@tiangolo](https://github.com/tiangolo). * ⬆ Upgrade Starlette to `0.21.0`, including the new [`TestClient` based on HTTPX](https://github.com/encode/starlette/releases/tag/0.21.0). PR [#5471](https://github.com/tiangolo/fastapi/pull/5471) by [@pawelrubin](https://github.com/pawelrubin). ### Docs * ✏️ Tweak Help FastAPI from PR review after merging. PR [#5633](https://github.com/tiangolo/fastapi/pull/5633) by [@tiangolo](https://github.com/tiangolo). * ✏️ Clarify docs on CORS. PR [#5627](https://github.com/tiangolo/fastapi/pull/5627) by [@paxcodes](https://github.com/paxcodes). * 📝 Update Help FastAPI: Help Maintain FastAPI. PR [#5632](https://github.com/tiangolo/fastapi/pull/5632) by [@tiangolo](https://github.com/tiangolo). ### Translations * 🌐 Fix highlight lines for Japanese translation for `docs/tutorial/query-params.md`. PR [#2969](https://github.com/tiangolo/fastapi/pull/2969) by [@ftnext](https://github.com/ftnext). * 🌐 Add French translation for `docs/fr/docs/advanced/additional-status-code.md`. PR [#5477](https://github.com/tiangolo/fastapi/pull/5477) by [@axel584](https://github.com/axel584). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/request-forms-and-files.md`. PR [#5579](https://github.com/tiangolo/fastapi/pull/5579) by [@batlopes](https://github.com/batlopes). * 🌐 Add Japanese translation for `docs/ja/docs/advanced/websockets.md`. PR [#4983](https://github.com/tiangolo/fastapi/pull/4983) by [@xryuseix](https://github.com/xryuseix). ### Internal * ✨ Use Ruff for linting. PR [#5630](https://github.com/tiangolo/fastapi/pull/5630) by [@tiangolo](https://github.com/tiangolo). * 🛠 Add Arabic issue number to Notify Translations GitHub Action. PR [#5610](https://github.com/tiangolo/fastapi/pull/5610) by [@tiangolo](https://github.com/tiangolo). * ⬆ Bump dawidd6/action-download-artifact from 2.24.1 to 2.24.2. PR [#5609](https://github.com/tiangolo/fastapi/pull/5609) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump dawidd6/action-download-artifact from 2.24.0 to 2.24.1. PR [#5603](https://github.com/tiangolo/fastapi/pull/5603) by [@dependabot[bot]](https://github.com/apps/dependabot). * 📝 Update coverage badge to use Samuel Colvin's Smokeshow. PR [#5585](https://github.com/tiangolo/fastapi/pull/5585) by [@tiangolo](https://github.com/tiangolo). ## 0.86.0 ### Features * ⬆ Add Python 3.11 to the officially supported versions. PR [#5587](https://github.com/tiangolo/fastapi/pull/5587) by [@tiangolo](https://github.com/tiangolo). * ✅ Enable tests for Python 3.11. PR [#4881](https://github.com/tiangolo/fastapi/pull/4881) by [@tiangolo](https://github.com/tiangolo). ### Fixes * 🐛 Close FormData (uploaded files) after the request is done. PR [#5465](https://github.com/tiangolo/fastapi/pull/5465) by [@adriangb](https://github.com/adriangb). ### Docs * ✏ Fix typo in `docs/en/docs/tutorial/security/oauth2-jwt.md`. PR [#5584](https://github.com/tiangolo/fastapi/pull/5584) by [@vivekashok1221](https://github.com/vivekashok1221). ### Translations * 🌐 Update wording in Chinese translation for `docs/zh/docs/python-types.md`. PR [#5416](https://github.com/tiangolo/fastapi/pull/5416) by [@supercaizehua](https://github.com/supercaizehua). * 🌐 Add Russian translation for `docs/ru/docs/deployment/index.md`. PR [#5336](https://github.com/tiangolo/fastapi/pull/5336) by [@Xewus](https://github.com/Xewus). * 🌐 Update Chinese translation for `docs/tutorial/security/oauth2-jwt.md`. PR [#3846](https://github.com/tiangolo/fastapi/pull/3846) by [@jaystone776](https://github.com/jaystone776). ### Internal * 👷 Update FastAPI People to exclude bots: pre-commit-ci, dependabot. PR [#5586](https://github.com/tiangolo/fastapi/pull/5586) by [@tiangolo](https://github.com/tiangolo). * 🎨 Format OpenAPI JSON in `test_starlette_exception.py`. PR [#5379](https://github.com/tiangolo/fastapi/pull/5379) by [@iudeen](https://github.com/iudeen). * 👷 Switch from Codecov to Smokeshow plus pytest-cov to pure coverage for internal tests. PR [#5583](https://github.com/tiangolo/fastapi/pull/5583) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People. PR [#5571](https://github.com/tiangolo/fastapi/pull/5571) by [@github-actions[bot]](https://github.com/apps/github-actions). ## 0.85.2 ### Docs * ✏ Fix grammar and add helpful links to dependencies in `docs/en/docs/async.md`. PR [#5432](https://github.com/tiangolo/fastapi/pull/5432) by [@pamelafox](https://github.com/pamelafox). * ✏ Fix broken link in `alternatives.md`. PR [#5455](https://github.com/tiangolo/fastapi/pull/5455) by [@su-shubham](https://github.com/su-shubham). * ✏ Fix typo in docs about contributing, for compatibility with `pip` in Zsh. PR [#5523](https://github.com/tiangolo/fastapi/pull/5523) by [@zhangbo2012](https://github.com/zhangbo2012). * 📝 Fix typo in docs with examples for Python 3.10 instead of 3.9. PR [#5545](https://github.com/tiangolo/fastapi/pull/5545) by [@feliciss](https://github.com/feliciss). ### Translations * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/request-forms.md`. PR [#4934](https://github.com/tiangolo/fastapi/pull/4934) by [@batlopes](https://github.com/batlopes). * 🌐 Add Chinese translation for `docs/zh/docs/tutorial/dependencies/classes-as-dependencies.md`. PR [#4971](https://github.com/tiangolo/fastapi/pull/4971) by [@Zssaer](https://github.com/Zssaer). * 🌐 Add French translation for `deployment/deta.md`. PR [#3692](https://github.com/tiangolo/fastapi/pull/3692) by [@rjNemo](https://github.com/rjNemo). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/query-params-str-validations.md`. PR [#5255](https://github.com/tiangolo/fastapi/pull/5255) by [@hjlarry](https://github.com/hjlarry). * 🌐 Add Chinese translation for `docs/zh/docs/tutorial/sql-databases.md`. PR [#4999](https://github.com/tiangolo/fastapi/pull/4999) by [@Zssaer](https://github.com/Zssaer). * 🌐 Add Chinese translation for `docs/zh/docs/advanced/wsgi.md`. PR [#4505](https://github.com/tiangolo/fastapi/pull/4505) by [@ASpathfinder](https://github.com/ASpathfinder). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/body-multiple-params.md`. PR [#4111](https://github.com/tiangolo/fastapi/pull/4111) by [@lbmendes](https://github.com/lbmendes). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/path-params-numeric-validations.md`. PR [#4099](https://github.com/tiangolo/fastapi/pull/4099) by [@lbmendes](https://github.com/lbmendes). * 🌐 Add French translation for `deployment/versions.md`. PR [#3690](https://github.com/tiangolo/fastapi/pull/3690) by [@rjNemo](https://github.com/rjNemo). * 🌐 Add French translation for `docs/fr/docs/help-fastapi.md`. PR [#2233](https://github.com/tiangolo/fastapi/pull/2233) by [@JulianMaurin](https://github.com/JulianMaurin). * 🌐 Fix typo in Chinese translation for `docs/zh/docs/tutorial/security/first-steps.md`. PR [#5530](https://github.com/tiangolo/fastapi/pull/5530) by [@yuki1sntSnow](https://github.com/yuki1sntSnow). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/response-status-code.md`. PR [#4922](https://github.com/tiangolo/fastapi/pull/4922) by [@batlopes](https://github.com/batlopes). * 🔧 Add config for Tamil translations. PR [#5563](https://github.com/tiangolo/fastapi/pull/5563) by [@tiangolo](https://github.com/tiangolo). ### Internal * ⬆ Bump internal dependency mypy from 0.971 to 0.982. PR [#5541](https://github.com/tiangolo/fastapi/pull/5541) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump nwtgck/actions-netlify from 1.2.3 to 1.2.4. PR [#5507](https://github.com/tiangolo/fastapi/pull/5507) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump internal dependency types-ujson from 5.4.0 to 5.5.0. PR [#5537](https://github.com/tiangolo/fastapi/pull/5537) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Bump dawidd6/action-download-artifact from 2.23.0 to 2.24.0. PR [#5508](https://github.com/tiangolo/fastapi/pull/5508) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ Update internal dependency pytest-cov requirement from <4.0.0,>=2.12.0 to >=2.12.0,<5.0.0. PR [#5539](https://github.com/tiangolo/fastapi/pull/5539) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#5536](https://github.com/tiangolo/fastapi/pull/5536) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * 🐛 Fix internal Trio test warnings. PR [#5547](https://github.com/tiangolo/fastapi/pull/5547) by [@samuelcolvin](https://github.com/samuelcolvin). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#5408](https://github.com/tiangolo/fastapi/pull/5408) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ⬆️ Upgrade Typer to include Rich in scripts for docs. PR [#5502](https://github.com/tiangolo/fastapi/pull/5502) by [@tiangolo](https://github.com/tiangolo). * 🐛 Fix calling `mkdocs` for languages as a subprocess to fix/enable MkDocs Material search plugin. PR [#5501](https://github.com/tiangolo/fastapi/pull/5501) by [@tiangolo](https://github.com/tiangolo). ## 0.85.1 ### Fixes * 🐛 Fix support for strings in OpenAPI status codes: `default`, `1XX`, `2XX`, `3XX`, `4XX`, `5XX`. PR [#5187](https://github.com/tiangolo/fastapi/pull/5187) by [@JarroVGIT](https://github.com/JarroVGIT). ### Docs * 📝 Add WayScript x FastAPI Tutorial to External Links section. PR [#5407](https://github.com/tiangolo/fastapi/pull/5407) by [@moneeka](https://github.com/moneeka). ### Internal * 👥 Update FastAPI People. PR [#5447](https://github.com/tiangolo/fastapi/pull/5447) by [@github-actions[bot]](https://github.com/apps/github-actions). * 🔧 Disable Material for MkDocs search plugin. PR [#5495](https://github.com/tiangolo/fastapi/pull/5495) by [@tiangolo](https://github.com/tiangolo). * 🔇 Ignore Trio warning in tests for CI. PR [#5483](https://github.com/tiangolo/fastapi/pull/5483) by [@samuelcolvin](https://github.com/samuelcolvin). ## 0.85.0 ### Features * ⬆ Upgrade version required of Starlette from `0.19.1` to `0.20.4`. Initial PR [#4820](https://github.com/tiangolo/fastapi/pull/4820) by [@Kludex](https://github.com/Kludex). * This includes several bug fixes in Starlette. * ⬆️ Upgrade Uvicorn max version in public extras: all. From `>=0.12.0,<0.18.0` to `>=0.12.0,<0.19.0`. PR [#5401](https://github.com/tiangolo/fastapi/pull/5401) by [@tiangolo](https://github.com/tiangolo). ### Internal * ⬆️ Upgrade dependencies for doc and dev internal extras: Typer, Uvicorn. PR [#5400](https://github.com/tiangolo/fastapi/pull/5400) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade test dependencies: Black, HTTPX, databases, types-ujson. PR [#5399](https://github.com/tiangolo/fastapi/pull/5399) by [@tiangolo](https://github.com/tiangolo). * ⬆️ Upgrade mypy and tweak internal type annotations. PR [#5398](https://github.com/tiangolo/fastapi/pull/5398) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update test dependencies, upgrade Pytest, move dependencies from dev to test. PR [#5396](https://github.com/tiangolo/fastapi/pull/5396) by [@tiangolo](https://github.com/tiangolo). ## 0.84.0 ### Breaking Changes This version of FastAPI drops support for Python 3.6. 🔥 Please upgrade to a supported version of Python (3.7 or above), Python 3.6 reached the end-of-life a long time ago. 😅☠ * 🔧 Update package metadata, drop support for Python 3.6, move build internals from Flit to Hatch. PR [#5240](https://github.com/tiangolo/fastapi/pull/5240) by [@ofek](https://github.com/ofek). ## 0.83.0 🚨 This is probably the last release (or one of the last releases) to support Python 3.6. 🔥 Python 3.6 reached the [end-of-life and is no longer supported by Python](https://www.python.org/downloads/release/python-3615/) since around a year ago. You hopefully updated to a supported version of Python a while ago. If you haven't, you really should. ### Features * ✨ Add support in `jsonable_encoder` for include and exclude with dataclasses. PR [#4923](https://github.com/tiangolo/fastapi/pull/4923) by [@DCsunset](https://github.com/DCsunset). ### Fixes * 🐛 Fix `RuntimeError` raised when `HTTPException` has a status code with no content. PR [#5365](https://github.com/tiangolo/fastapi/pull/5365) by [@iudeen](https://github.com/iudeen). * 🐛 Fix empty reponse body when default `status_code` is empty but the a `Response` parameter with `response.status_code` is set. PR [#5360](https://github.com/tiangolo/fastapi/pull/5360) by [@tmeckel](https://github.com/tmeckel). ### Docs * 📝 Update `SECURITY.md`. PR [#5377](https://github.com/tiangolo/fastapi/pull/5377) by [@Kludex](https://github.com/Kludex). ### Internal * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#5352](https://github.com/tiangolo/fastapi/pull/5352) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). ## 0.82.0 🚨 This is probably the last release (or one of the last releases) to support Python 3.6. 🔥 Python 3.6 reached the [end-of-life and is no longer supported by Python](https://www.python.org/downloads/release/python-3615/) since around a year ago. You hopefully updated to a supported version of Python a while ago. If you haven't, you really should. ### Features * ✨ Export `WebSocketState` in `fastapi.websockets`. PR [#4376](https://github.com/tiangolo/fastapi/pull/4376) by [@matiuszka](https://github.com/matiuszka). * ✨ Support Python internal description on Pydantic model's docstring. PR [#3032](https://github.com/tiangolo/fastapi/pull/3032) by [@Kludex](https://github.com/Kludex). * ✨ Update `ORJSONResponse` to support non `str` keys and serializing Numpy arrays. PR [#3892](https://github.com/tiangolo/fastapi/pull/3892) by [@baby5](https://github.com/baby5). ### Fixes * 🐛 Allow exit code for dependencies with `yield` to always execute, by removing capacity limiter for them, to e.g. allow closing DB connections without deadlocks. PR [#5122](https://github.com/tiangolo/fastapi/pull/5122) by [@adriangb](https://github.com/adriangb). * 🐛 Fix FastAPI People GitHub Action: set HTTPX timeout for GraphQL query request. PR [#5222](https://github.com/tiangolo/fastapi/pull/5222) by [@iudeen](https://github.com/iudeen). * 🐛 Make sure a parameter defined as required is kept required in OpenAPI even if defined as optional in another dependency. PR [#4319](https://github.com/tiangolo/fastapi/pull/4319) by [@cd17822](https://github.com/cd17822). * 🐛 Fix support for path parameters in WebSockets. PR [#3879](https://github.com/tiangolo/fastapi/pull/3879) by [@davidbrochart](https://github.com/davidbrochart). ### Docs * ✏ Update Hypercorn link, now pointing to GitHub. PR [#5346](https://github.com/tiangolo/fastapi/pull/5346) by [@baconfield](https://github.com/baconfield). * ✏ Tweak wording in `docs/en/docs/advanced/dataclasses.md`. PR [#3698](https://github.com/tiangolo/fastapi/pull/3698) by [@pfackeldey](https://github.com/pfackeldey). * 📝 Add note about Python 3.10 `X | Y` operator in explanation about Response Models. PR [#5307](https://github.com/tiangolo/fastapi/pull/5307) by [@MendyLanda](https://github.com/MendyLanda). * 📝 Add link to New Relic article: "How to monitor FastAPI application performance using Python agent". PR [#5260](https://github.com/tiangolo/fastapi/pull/5260) by [@sjyothi54](https://github.com/sjyothi54). * 📝 Update docs for `ORJSONResponse` with details about improving performance. PR [#2615](https://github.com/tiangolo/fastapi/pull/2615) by [@falkben](https://github.com/falkben). * 📝 Add docs for creating a custom Response class. PR [#5331](https://github.com/tiangolo/fastapi/pull/5331) by [@tiangolo](https://github.com/tiangolo). * 📝 Add tip about using alias for form data fields. PR [#5329](https://github.com/tiangolo/fastapi/pull/5329) by [@tiangolo](https://github.com/tiangolo). ### Translations * 🌐 Add Russian translation for `docs/ru/docs/features.md`. PR [#5315](https://github.com/tiangolo/fastapi/pull/5315) by [@Xewus](https://github.com/Xewus). * 🌐 Update Chinese translation for `docs/zh/docs/tutorial/request-files.md`. PR [#4529](https://github.com/tiangolo/fastapi/pull/4529) by [@ASpathfinder](https://github.com/ASpathfinder). * 🌐 Add Chinese translation for `docs/zh/docs/tutorial/encoder.md`. PR [#4969](https://github.com/tiangolo/fastapi/pull/4969) by [@Zssaer](https://github.com/Zssaer). * 🌐 Fix MkDocs file line for Portuguese translation of `background-task.md`. PR [#5242](https://github.com/tiangolo/fastapi/pull/5242) by [@ComicShrimp](https://github.com/ComicShrimp). ### Internal * 👥 Update FastAPI People. PR [#5347](https://github.com/tiangolo/fastapi/pull/5347) by [@github-actions[bot]](https://github.com/apps/github-actions). * ⬆ Bump dawidd6/action-download-artifact from 2.22.0 to 2.23.0. PR [#5321](https://github.com/tiangolo/fastapi/pull/5321) by [@dependabot[bot]](https://github.com/apps/dependabot). * ⬆ [pre-commit.ci] pre-commit autoupdate. PR [#5318](https://github.com/tiangolo/fastapi/pull/5318) by [@pre-commit-ci[bot]](https://github.com/apps/pre-commit-ci). * ✏ Fix a small code highlight line error. PR [#5256](https://github.com/tiangolo/fastapi/pull/5256) by [@hjlarry](https://github.com/hjlarry). * ♻ Internal small refactor, move `operation_id` parameter position in delete method for consistency with the code. PR [#4474](https://github.com/tiangolo/fastapi/pull/4474) by [@hiel](https://github.com/hiel). * 🔧 Update sponsors, disable ImgWhale. PR [#5338](https://github.com/tiangolo/fastapi/pull/5338) by [@tiangolo](https://github.com/tiangolo). ## 0.81.0 ### Features * ✨ Add ReDoc `

    0eߍԠqҪbm:$F{S` 3ILfMgӚyib:mN>~S-Z֙ߐuAyF=3=w&6VAz=e7½$I e(^÷˓q(rQB}:x&y癯dއwpE(?c՚-+2, _GrDsW%t5<6Ւ9(,firy $I$I{ ÿx0 F瓲dYmStӕs,fx ~V$I$iє}HLL$ᢹ%tΚ5ki߾=m$I$Ie,I$I*<o)$I$I=ϧ3k^ޒ$IdB3yn2*;K$I\<~=9S1)$I$4/d!DqI$I2KuҺ@HK$I\:U^C?\Da}EG^$Iʘ2quc)7 ns9$Id>u(>6Q$I$t*&$ qI$I*ڷo)֯M )(,t+$I2T.,74X7qnv%I$.}"[g܀3y^ͅ#.I$IpOr%I$̋qH$I `I$I `I$I `I$I `I$I `I$I _HJ$IT8~[$I$M?O׭Y$I]̭C>mHLJt˖$I$ 1)!Хe~}ĕܵ vq $I$"-I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%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$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `I$I `I$I `I$I `I$INqǛa蚗$I$^LJk^$Ivۋ?=: C(v$I$ ^uo߱$I$I#&_I$I*BX$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `I$IJҰØ9_IN8mYԨ-I$IpLNͨ0ʖ5 1k^ė$I$xWP%﹊CÒp57.w+.V>W6H^c8z ?;oo$'H־2`Cux6}wyz"Uiw wڊd6`g[םۅ9l;  &2d4;!;}E>uEqTlҎU-? $ITV" I$<{<3q9z, n$E>ڈ.ُo?_dQGJVڸ7yBO.ĭaSCgV '3蹉̫ԑ3.1u 3z(&Jčëks|.+X3|vp5#z@nԛNRV_I$I*J͋u= ؚ3VQдZnjYN9+eL\UE!Zz!4J<;$+&;*'q4 Lzj|=6 RZ{.1׀-'ɘcx`'r13Fiw 6@l~X[@4wʑ5q؁軱5*) I$I^.`=w]C/A*y*;_*-/f{]2fFQq3:ߝ{7.̫tgL֨Fbנ @i בx<67mB B͚U Fӣ6o #5Ӣpґ4O[I$I2b*=Νȷ,)bRr98nrX g|sHO_Q n {D)*ZL wyͯ:۟K(fL™pD<Z$IRTjrB?NKoGquTLC CjFVͨBAO$1 (ayZ*և﹛<}I\v{0}WP@)_)+$^Dƒe%ԢC=Y[Zu fM7+/ހT(i I$IeM\i]0ǿ` 9e>8C:F:̷Nό:GRt'o}ۖL\Ši]#֖;qQ6wR=Si=3 Y50vkHrmⲿˆ~0"E,mA2mӪ.$I$O\f 7;G ZsνP3 S t6"]NKy oSig k }qkjA֢< /RMO>q9ܢ3{C>~t8ő֌ï9k:V џ $ITaÐh4J^^ Frm8OrխG$IR-D$!n+I$I* `I$IR*sE]0zW$I$,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$I$I$I$I$I$I$I .I$I^wqXEEas$IA@l\Ǘ$$$P$I$ [v111t+bcs$I]uYD$I$yhI$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$$I$$I$$I$.2:2$I2nS7rQsG3zl?z}W&gXgdqKH*Uiu1▶{.ê,.RpxS9m3B=m05GIi vAO4`$Kϻ7NJ$iinp&'w7-k*ߝbې"f=6eN!;bzthútFҲtA f}/_5wfpJ[Aj*fZ<2s)vAQvyKU Uw %IKlߓ3ڻ ILA:#/;G;I3y5t=0Wykdn Iۘv2F$e#I,/GCNhﷆO<ϋ`Y4&pφJQЪNl'ㆁ3Xt_0ycK.HZD gҫ {jk󉦤ѦytL2u4<)W@Z tۦP]l. hPuC;Wz.Nyf-ڟcr.wθ~b*-2zxᶗv˞ȡ/w+ *X.I vQ`o3%'~3%IT6yFk)乣b d#m#>Ljoג]G\2;B, j~-y/Ļ3XTv=.9ڎa!fMcVN1cYI7~t-p-}O^{~O-X¤!wsݸa~K Q'1M>\}?h~:O$_凥vC)߅V iy7l<^3%~11rjz<7=x+T/Ęb"fzx*Q?ˇ!G 04N̈́8[bkzTAbҵ]ރO{p-c|ur~4Ħ Ň+0d/3rvu$IDٗN7N^Jg1-VYw>h6yybOM"ց}.VN|L^6'M$|}: M}XĉmeŒ,8 PEYiռvQWy~7Ӭ)tTuz6v=8{X2Aasmy⑴O@:3r&EPRVu`.ݼh2/FLqA@C|:3fR j*;dqV4$IMa|nuO;R.l7Zv&sRuQ6~|}XMrVd@RxD ؏G#ZΝ{2M+Y@&wrI3},*]QeT665YVR!{"w?q/X6 IDATOq )+$Rs9 (R*&+`Sq4 -7G@V.3ՈJ^Tv_@H2;-NJ% ؔ163TN 0[j%$%@@L8H$ݶ> @PF,dGTx" Tvo3nS;uK;8}t%jlIrZK5kbSFe/pL>~u3t fw:9:WLJZPM9[Ԡ-ِO4Aq?rr Cuys{njf3$+XST8s.~Mծh!` yb7!HN4)$YkwƜ+?$IkD~Ȑi]u|>yr ;F!g|M: ҧwS`żz$:4VsP*e~3w'ʹprSHn\!l[.̢4UX98 \˂śwWQ4D ӼeT GbR|8?gqe/0(:TuV,agK]'Cp 3qq8ɩ,+#9-qTLҥ3㊘L5C/Lf" N_A*:! -dQO69x+<^u=$P<[fR8)/9YDz9}t#T'wbց\ݷ1*rR Z.Lk+J|Z7ꆐpH;^eph<+>]!l؊cWyQD;Wbko1aS<~[-gC)OJ{v_Nk[r rG˟B*<҉rշ1tyIyĚ49\\(qiims!Ա_=2+R j[4{|=sz* i26 }￟ςTҏa|E$IK7/[`Rkw z͹]96>ό^.ùT?NBd,mVS_~0 F瓲dYmKާ +^}#&/Xɚ-QbԤE#sVO%AɫSfKHRtߗ ҪOp߲*ZG=x/j7<3W6H[B*4nE)nQ1scKGy+D$IS-rꈻͻ?oL|wO3龜r7x<:Q2?^Eb[yOSxSo絜 \sSt7ZNJJ˂h>Yܠu:~U 0ie>EI5iۗ^cKQrLb}y*բ_0Q^ϑM*t8J6R*,CGxeytZ><:M@F ڳMn3_?<&zeZۆ߰H$Ie/ גOx=W5 )]0@M֧"+ &/h [M,`˄ |V;݁z)i\tp"?M.Qf5ŇԥJJU>ީI$df 5}Ooɪdqkf^cM3qE9{=i9l~f|ooMVr =WGPJ-9^xS>v3k܁wU%I$~+d}! 8ڼ1b [\Ź?=?eÎy[{g! z_a0 F瓲dYmpK$I^lh؇D"ADq$I$Ie,I$I2%I$I2%I$IڋĹ k} oLdzFDMDp9}9yR[|zwK oo\.aۜg}[p>tn gP;Ni$I ` 7Od!'s^fJxM^ cK;s:|҆jѻ^wn"kg=\^В79I$!0i/^؝7q}SzWBzfciRŸ:)iۮԑۮ˳Zpx{NK$I..[qܼ9h\ۼdp~Bp@Ie0#c[R\z4G,3OYHkߙS.!5JNc)XO<ϫS<*5iX.=F[}}nKv pNčdw3xW˻ދ9waػ︪?q{#sYj9RsYZ;rY[s2S4aAιs>{gR [.8"c67|ԯcT,y1X"d9lFL7bͱX2ܼP]xN<Ō6;tkpgtׁ9zҏ+4e5cH0,/HYW92+f=…4 |i= S 4܅ %b \Ѥa}g7)oO„7{T|\>tָԥg9obteG䴉| j;_c 2צɕ^`(iZ(w4t@IO)M2a nO |+aVG3BY ɲyt)ϼYxgNҚY0m8}FV8ǒ.K>Z9v¹uR|6pJ1}r?cI,5Ǐ%tOƈ5y ﮈ%&"""" ]y4ШiYGś|eQj /19[sTeku)c =rՀXӡ4oӘJm3{sTBDD AuiX: u1Oz.S/`]-XMuˁ<{ l|8·-㕗=њlvgʶeKS7^:ɾY]9 5XߦnxdӤKu-a is SU/ܼ\v-ӣiv_ìT@dZLz@k*1枹E<.q>ٝU)`: {&痆Ny!^^O@qSי(?#Sstʩ=8 ?򏷲"t-]jM<'¢*ؐ[Bs_0|? 5qן[eӽ P'O)\CAi\ .D~o-얎乥˴x[S{0R/rl/mTh2(]a) JyoC iX 'w;cq3ħ $L`D,v%9BuC6sgCyyoWWHlR1RjP2)bXdK߲ !e ϡEDDDDXAL7եP4Ҏ`{_3a&joHooɤ%Xs'O~~7Hob(GT$ On,.xtnpaNgi$Zc^}3gdwi4qb1q-<ÌlD⟮oftʑ_.){)Zדxq⁷]eo,si_ɱX=)[#_ Wt*6$-c3I~pjB*JDUo9CxY#lu06is'$2ܼ ֚]߼dTzz1u 794E[lSw6+fkpCpصmkU 4HLfWKuTE8>I״P!SDDDD:CWWW, : '(ydX(?h {UR (((((((((((((((((IԠ~w^vtZq德eQL` ~6^"""""" dɅ-5~i~6ھ˴f6,fi<*5PKgP<Ì`f;ʗt`knlj5HySwg;aۿ%`/bCՉyd V`ZlҲ_W#+ G3%2qRrrr50sve`c¹^bN%[ozWf8`wWW3>X0]5kᇵGIng}ފr:e2h:!0; "Ql+ЏޡoIK6jF1ڍ CX1h[ғߢkj4+w6W~3FJWo3sNYGW<{_y#g''`EDDDD,d_Ume-5Gl=>g`!.sJnJp Kb=\しEBdłp IDAT=PEE?IDn:GwyLz/B(ry7"x4aovML+"""",rt4*-d=?/M[pKê}^6v3zNNzjKF쯯V.OƲl'i3+L[|#`:pp5A.+L,__~թh% ԕliӛYy;)ω_dPkI\s˃]evn i3(`/h}u/v)8^W k_aά. 'Y* X~UJjO˩zqe~ya[nJJX 'ZvVO N-E;O9QMj|Cw7_Wnjw ĥN]!g"?t'_ra󣉊AAp63KqL3jәXDDDD?0M4l$%%6RUyҷN=.; #Ẑhp+""""94kmquub`e||^W-gQl? ar$""""","L4}} X""""""`+4o0?"""",AFF Oip"("5ZUnj""""' ~}OEBd¯%- "_IFFj""""'Xn2Mt@Ր*LޗBT+'uOҸP=ZDDDOP m6\+7*+ ff="""" pfF."o -̌ ``y!XDtm(dM```b=OSaӮ(#Ȗm^*w?4PS[<2pp&$0<1ROo`'MA@զգ1e] NЍ\oؑdֳDޔx ZӼ}WV&lIá`u{ƹk&@^xJ>)YM-ӣ.-y=`#ѷ JJy89R80q,Qq]byaӦcx,MPü̂}BQ8?q.&b)Xn< /jl]|%?p": c٣.-Ymį7/"dGoK?AͩDi׭rzٓs z!-NRL.?p9r ((H=O#|twܫ=_uOlMIX^a!߸  9C8ǭ">r%r}0)Ӣ/p8~'@ԂOy~ 7M(r1i<䓄uYʕYd %"""`ӌ4w*vB!/[V3 7 8 ~ۥL(#ga )GBPhQr.1vzC:8>D._ƶd֝ܡ0YdOju{ er`#7agX WL5iPRِܾlb4΄CNŊtzG-^X[9i;NQ9Bl`A GDsbS+RAyq"Msa8Sy |Ƕ6<iz|n;2.=9tԦ~8t}}Ο?O.]h߾ۥKڵkkB(ˣ" K&&ٰl`Y- }?onM!F.w˚zW9m¯ q!<p mRkԁ{x]9|3>B<6lYJ}|?~pp7<ѰKē7%!+4}eŚx<D]+xu*9ʞolEXt(aT2T*uxRƱ 8+|Wx[Nԇdڴi7COڵLDDDDqc ޞşbh%l-`ׯFVmA_[02}t^I7ߥWf b?yY>=wj`"r.$8T1SYv[~8±c;Y~h'b[})XtR!XWDDDI˟~i$U o&r.g$ս(+JP#kM9qH0 $ 1g.axqj$/Qu'ޣΗؙ:uq5L)^ N@ٳ'={TR i>@ );ƒq Hv~uq#r"(KaMzE6qLHH=YaP rq[_I*.ŽxϹ6No`Rեp\8&gĝ[ˢxW"vl@Y]0P_<ȯAc?źeЈ'n9ln!hVH?\$.euy0<[Ӿ9t#[|0` &d|jWGQ/>):nFRDDDD,WY?g2eide=7[VhB'ǃz+P/V7 Dܲgې6Z "&pPO&qg]oter$f()3 m!OP:M)coӮ4 wU94kmquub`C?@ RmH03 """""PhAm,;| K`9׼ """""P >+ѹ!""""WR ((#0 Z8| "7y ZɈ"""" nYOuGRQD{먬_r+<Kn v )ֆa? #7^EDDDA`B" IȠo 8"pbmxP"""" {Ӳxcfi*_x-cXpsw ``yqrrW7W2ï_%b #""",#aX|EAX-"""" |yT1H"""""","""""",4Y 5~۳Dbѵ~A _lH.,6>Ɋv +AnoL1}xb3 ,"""",>>׋/{oRqؕǯm>9]bZ707ƛ@ǃ}nYEJ"""""(K` +0~OS>y#ܼ0ai~'dӯRn &Zڏ8FPT:,ct=x< ho76;dǙt_>l}v@<;ϳN5dn7m7fy4 .;a%>{yF0 3g;ƺH6H]q&>8zpwHb[J"%RBT$t wօ}G'ax?{I3h==+"""" "aF6e4-lV2oN$^3gS=5|ZgNΖөy!_2'o麛ũZI U"G+#;ߛ6:eZ9i|??#'r107㙋=EDDD?H`;0}~챤ңmtL&0_8CFV8v KqOm yR?q7˓RZmSf,Ó@Orx4[nO{O!:{#œpz= p+XȯZrIol )5p" HK%p=9y07ϣx6: l5 L b4𓗳J +sxbS W>/Ԭ惈2vbZj2g~[?p$L#~ÚӬ4=E0Ұ<1yB8ޜO̘{np5%Odŭإ16_?w' bh zpl3zdN;G'SR7ױԥ |sgE^A\ dq<7`gjp^^>iYJd͵m9Z02?W},f; Xw{&sy7|Zȓn!W&7y+n ZPa88lIFt:EDDDgi>71MFRR^as.Q- C\ɶW~{ȣ,ła<'uZDDDDDDZwJ./s ;XDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDX""""" """""""J td./KM)4S>6y3 ސ}^FvYϢm5\k;E/뺩KF0ʏH݁;"4ҭ3={sS yu^ՙc`jr̀NNũ_҃zZJ'!Η:Qk83aJ@+:E3>M`yRצY;[F# Y(6d0;p|{FO!W4[>J覓\2М7ׄPf=֚Q6& %agV1؇ qj!]{'鳔x2.ܛxNΙy8gsƯZsӐ[_B%ȹg O 3Hl@T.1vs:6炕xݮ4E$<*zw Tv ya;mgc.@^+-bX*>#rToǐBI801b{Yp,ӈ74 `ΥirslV9:mם%тcfS`}z3Hlx :깛; vڀ# SI0٢xR ,x17"% |g:eG~\uxuL;;dܺp;űmA+"1qb1ڳM{eo\̻Qy*wBe]i5pl?b1pޙ;1e uf&w??}S9X.aϥ VU 1zs;S6;je n{]"æ^%/`g,tSBp8K=2UFOd֜A=,l.Ҏ_N⋎j3deoiҍy;{?D!F8?j#EG8:ocԜ ofIt.P S檉tYuKt{ucj7}qa³EC+ dK\<HS6R<(_mӸj1.^΢W5笓<]'!f5|A( {wqk!ߒ=3Q'砭&e㸝/O$?/C7抓ElE gR*|sZ@ƂhӆkTN¦՛yeG8·-aQ8I7ws zsjܜm$H#e`:ɾش ٿZԅp0H;oT ؈I%M׉(# %(}td|~ }9lE=hN5)ڋ[TV . דLq7o?}]ݬa+Tw0nwylVFeھ)T&͙Ŝé5K&wv%!$/O܀ĦL ֟p/ʫgf١ԓ:mhj Òpuu!>1]l-t$Gl1m컏}s-T2ʦ!IDAT Ìp\`'ǣYpm?}QfLŊm?a'7l$اu5'~֭lv~&fBJ cӚsGal/ӱ0$~zgdՌ|2Ǘ-b}513ቷG.[Ʀ=;|.*Gv\߳#ѱlуf#kMb̾(R%]˒s. ɉQV\L3r0[~X(Qkp`#f ^~;e&LYض=IyK""""`cqYŒ :tMn?;>C0`O63(txͿc%[atFV N';n4>])o}kXu=:[(qrm]•`&k45Qޖ~}\0l=?O2{ʼn/71v\$4onO/0;fM[ wL-xLMN`8oA*tC{lԤOӋ6 e ܡ{tf_- 2*| Qfe@^tʅOg4C?oGK>4͇ބc&6$]*/uʼVc}>lW94kmquub`C?mDDDDDD?AXDDDDDDt5dԪ*ٍ/ȨЎo8Ĝbx/t'@ZF|5)5u2572uYL*F3c~w#*,-B&+ڷ㉿?ĕ!:&u$6OF"T}6JzᖚJ鶂^}f]fӖth .'v3zbx| zErhs&Ì3Y{4/%?GEN"|p,D5PR;l(䈹qK?ݡʱؔ[3n!é0 }O0K|~qzsv C-A97VL^!kSCض2K$޲t@>Iϟ>5I+X]$u{gN5I(16s'(?UgyvvtccSq:|?O(#ÒpsfM4wöƦ ÖYR)p30c& #yu c ~mֺVr9f%DzcY-h"87]Tɀwp$f)<ˬZ賐eY '?|c?r4=Ny$G&H^sÑ9 iSpۓwl>%^͏[xRIw''?xR_],n|j-k7w@k4N=wKSxʸmVhHs_ Ɛ͋R١k3JU\S&*`]'Gjޫ%:\?YFbߓC#iz&q7>h=O +{UPfѬXW{ͪ,Э$.]<_ĥzin0_2b7l3]yeUBojZq&$KLf%[q^k@gv)<&HA3SI2*kt|QUuj-*R@rM_E 9\UVIҽNݠ@vUWgUJv{̻W:V)/F5sN9ةڕՖWbS$ zɱ*N]*ԅQZSWք5{ UvQ-Sgfkk@W$Wa%|oLVBC*@!tB! !BB!tB! !BB!tB! !BB!+ 2!~y4B;cv^ %yrfZ˞>P$jtr$v@7A9/+0 b9.7ӕXc%Қ?CH]m'#  M9ڷUQR)ET7*lt}53ENAw6t\R{JbpZ&J@&Jz+H4fNO-"X>rZdR)Kbn^~4x5B|uex3|([WXY6RĸBNW@$]?r4g1eP+}0Iu7oҔ Sك?Co=XA;1NdДU9PI=7=Q B}oJTI{{/U^ $a°XB#aܻ''VHd+{e*ydHy\X\^s} 4xYHBĨ~45nXAmUqkd΋ns;}8x@֨A^m3(~{&ph cjonPﺥKYbY{N?,k- o{fgօS:*)15lt|[5\Bs}m3lۺuAr9OF.vY:Eб%iǞs@f  N.ffڼ]f9 ڝn :Z M{KfA` 0i!`h lΠwNL]\XzK5b.2tLT=fsNWN칵=?$0vxwv[- fQ IDVkPPx8R =:d ^.TcC l5uJαh6~̺l5oɈ `_|*IjV|ɊFNIeHJ<Ϙ ig4 9~^JO׾2.%i| iu+'/F0y0Y}1mmZ2k[?N0X:ts2Ǯ{4i#]"1J,ͱL XͶfK̏d^+=}45j])_ 1>w-~yT=h`)A\/4\IiE,WZg5Eh'qSB>TOmO8@5ד$uI풫N6YY+Dڽmυ4x<@_UV.$Bw!=eB]8(<+~yC7kRSwro;5:MyaO4qҍ'q WժTu\vi%_#EJPSV):RN8e9ŽwEr:] !^ x2kAWސEw48$<ߠ]VG])M.J( }`>6 Zv|aC.0UY..Ɋ>~jz3W d}@=kmؔ~8j KGv1Y(1\U~j>=^]e }O%ddrh5wUrҬ@K\I hJl0X$#vÁ1;F[ӊ&vh#̈́Jha4R=.A7(P6RJUftuמ(dɅ-Z^+ };]!gTm/I,j` z.m:aݩ7"I鮸0\1gy 6-uO| @!~ j2DKgEVc'+=vΉʮj.>P"|դ/{N.ovsa6 B[OvAlByttc!vDFglg`@tB+ !~|3B!+B!LW!BB!+B!LW!BB!+B!LW!BB!0]!BC*@}1|#B}ۮB!0]!BRWWe0K$>%B!M`F+`0:::B!LW? &~Z$B'BG+}3Ֆꅞ{HX@~9;`'p t"/sbĤ)Wv6ZaNALR0 ƏXAE=Iϋܵ!81ΟJ{sie_oƵy$i?v">MFX6gnhg@**ˈ z?SlG]5LdāgsEm5Znc.J‚/eȲ3Llg $’ܴ諧} $t FzR%yOή'Rxu\zF)C%o?3'\c7"[>}q XtWl9H::7(m_&͝V8;ݏ X|w r^2y4qխꃮDzMٹDBEzac6XA]""=&υ\Ms ,Cۏ1i#jPӅ˲ FEGъ3`ZKτEJWr_А'&tZ,Z k/3_Ybi30@gγQ,pGi|% `v7;i喀KI/Y_<9Raa㸪-;t?K㿗z"ߺC*{z9-fTR/8ܞV,noZ=݁i,MFyWˮ}/9,kzOArݤ2-x[AA+Ԝ3˛Ou }[%wzL^8eiԵ0Q@F{ۗz<}e(ΦܪKի)"qїﳝCs} vqK3ܲ:ϡoMZzSOs$À&K;ZOwqw8-C)hYcfFNEMW$j^G6=L4G_Ś]Oj<]-ԥV[H@uϥgy4(s){K3km^D W"vurg A9g< +(rB_  :vȷG Iv腋!z;n /\|*'LTw.ZP6s0$z  V=coc^odD'w.ɖMMIa- uXK *I}޵O0IyP @ddTȳ5D-~ zD?M{۽ޭBcG;i20)/u1Z>Ʃ6#p0UK% i9jLog=-:]{~ztq;7SHKᙈTt39P𹕬e;M<kcIޕ{W^8"~շ׮{v*C9"n])Wۼ?{\0S;[jz9JB/Pt(qgmϭ;4"_NP[v% R(Tͭlx^IcJI^d,oGԙ; jjJ C[`pm@W76`&^Lh;xM?Gڦ9N=x 2OlvX=U9qaޥgGL?K.h9_S/ j￵n"΄KHBƩlݑ\) BMJW@\| ,ny+m$샱嘵/FC7<^ "ũǶ[ġU H.ohY;vp.KB&[ߧdHn ;&¦ CQz'(̑|, "Wʁvaw]|=p x` IYKjeZI$V2:}w?!bSZPTHYѪJUP|zH,J@"Gz5(Ӕ"BSЄY=|S,h*HJai1/InᷡG*mF vO=_X\.kc׾YBTIIX"ף ߔHTpA$kkagg Ebbүhok4ӥR^aԽ 7cSL_u"RHYR^<ʼn;FzOdYy=ib|x`{Iۙ+g|7m|R FHeQ׏\OgPN N^0iq_gfSOӂ)JRFkMHy)%wLRqNjˁU#+LW~ '2:+p`;.| !0],,Bo\D~D"rBo >!Bհ !BB!ϊm~IYX !~ 5 Œ҄rHx~\=,<08TMϿGUB, d#cdླ'Y[騂$+6Ԇ{rE*08+R=u3gmZ USWoƎm"e ֯ .H ]mX0=3x:1$U7=%pπSӪ̼=9fC :k`3qK(WnjPRݝEMH?^,^:5<4j$+8vxyE㐞zz Yɋs$aadkK'?~ڬ$Q8Nt,ZlJK!fmH|jLQC4@֓Ԏt֮ML5h2nѣg2yխPZJΤRz2ȌkKӃfc\4(%gN!]^t &m@*3b1= IDAT5h> `)fpǴEwrӼGl-CLnWb\q~*MyqF蜰"vUnXP.C|t95Щ2});HbM|A S]h|wƭ;cwjࢼ2uq˽fK}CapV&T0Mj)Sg LZ1nicȾF#YwK6d]`e757R -w^}XᨓJӼvQ]Ο|ITLdTQY~zK㐄~`pV<9}l憎FSz l+pMc0 9ol;qzV̪ͅ!#vWV ؙzV#B)ͰK`3TxztwƬ|JP$jmBwlS5n䒂C7M)H NE!P߅mWʮ=BWDh9:)`1gM"fg{O)P+"⪂J<34KF7m?2|e|1WI!Ip>o~k}~ae}+hsTiqΒswѬɂUm r`wϩduCb(:޿~$ǒ (+i? 5ǎ'i: ᆚF+j lwg,:U|PH=kk jeb4ROMcm4I,RJ( yi;U |pOKiE#_Ior޲8Xh"@\%mgJ T@*D1jtrp9zPMECv3$u.lHJTtmy{'t^}{?LJnV̉{ a|x,wCoGc/x\hJ<u_ߦ X\ٕnVЌR (䀻3q// NXhUEc*ȜJkk#5rj$T[mz r}q(??>9]-2h I,%tWd$J>R/M [*람aȼD:qVU7%%g`@BZ¼2S&HYmZߎhԪWj-֋&ȥ@R2ITA*SDPsR_@hk2H[U HHbTZ$u[`joAMzRwvןw&{jIʚܦH%biT,2Vױl'Jeq%$I΂XC_ŕdZ$AVlKj۞Qz͹h`R  `(24JЮAjNR꬘řh(1rfF%MM.fϰѩLϜ4uNF+0T6",-H5 jNܵ4T*e6@JI:ByEŒ최ɉ ˢ)2^d+TZ*5LbRCt`|Z@̴1Pz Ŭ}'HT4fC=%$ЙZ_P ?qcפ Ƈ&0s?O7y N೔V AqAe[XlW1AQa/*}9: "Talnb9IRS?o*s|Jh!3S?3gG8XuhMB,$AGU<^3OʈIu RnFV9qL1z*8ht)%M5kNT #A+#ntO06r[B Ozϴ7V3th=~ViOI~f%Y&7-H$&H0Vu;|󴹽Ԟd \m3جL3:Ļ]"mdŢzM Gyz,30UWinb2{٦$_O0PR([OZ'?oe 7$`~aSߛJRsO-ȏj3\X$sh!}"(θ8 Ģ>~s;r&3H_YR"̊I'Wvc&)(?4Ͳ{Mcf߽Q֖3VLz1h ^M}ڬ>y"M:t®Y $+6k͊$/B 6{wYe5}Th~u8`V=okQ||B8id /i}>]yUGKNm(ۈqSzo ǜ ?l(0g*{x. |=]Œ߇! zSdɁCnwYVߵ@Hsx$s/N|@I9JEǢwMhH exOpw=~Wnjo7D3(TֈʚֱWEa`d;?XjW ij<7mD&_ `hdGEL=K洵6H|5Xb`lyJ)U?b1nL#TM+Κ~o5O+~s2X7Hh`b}˜?*1AӓT)H+%`hl~܊qoM*ˁ8+Ҟ7]\ W(P(is+H:&hW vK}~dQ {h"wy2jygj|8kSZ.oR` пjbb~IW=tF%*tT-kJZ`E2ޑB*& ksΚlQS1'Kp#п34j MwǸTlB/]a ŽJ򋳣_|L9s\zK!kJ0l5~ܸLYY~f4|Rw0ү[~ ڷIl\]&Z*?'5eͦOjƚ`~0<Ӿ|{hEaY轫~G[YB/Oy=8S.2y54lvhKSL e tcB0])kynFih<αihʂ䗏>*o- {jYr) ayVn (RX=G fe>^tBNj sKصRN%b|0jPiOFdW.44 U\H)ZtR9zV儇=j>fY3>.f"u;T6r)zy7"[&,p~'2r΂kb)/Ya˶me|5E:W Sfˠ2}) gv0՜۷Y CnV7ƣA=%A2~3(@3]~ {0nR1mkv=lwPEZü!Q 2-qK` a想>ᒃZ*QHqR;2#*R٣sO+ߓi/8x1Y n ^>@H\,3siF1KW^pn_~ rrrWnWwCCCHC.\ !9ukV~S9 @7(Kx`Zt͘ri57囥Swzl6y`?ˠi"GuKyyeմX2XϟѪ%Ă{O7&<2k6HG{ ?;Bt 7Z:ch#毱J83QfmfU9SfUeW|}ҏ_X p>`🽲/}Vsgutd[Fs!˸X׭kKڿ0^NIƣ 5OW=)kh:`+Qޘ B^ԤQn}-M`'g`Cް7Aܟxz }R UqƷhBPcpwGA/}sD1=;|)S}q{+vfL8vX ='+wny,yЄ)W6JC[n'>u/ 6,M:8nC\u˖ PQnǶ[ġUunW;fuk'Pn&NZi3%[hHCfQ>}{Pűo,IH Ю>(⒄ a®_Ǐз7m`1mR#QX !JWde3i}9pfqZ+0@ErLd$_"O?;i ZYEpdGq*J۽n;rׁ@չC[jhGnAfܳsFb;yXs @+&|+ibV.̣L8k"*_UONCDiQJAˣ 7qlDdgs甼bѻ5Y2 A+zB}tUn8|m팏Z=1e솕Y=:]ǵA?RYK.qJp3N?Uk~px?FD9]޶#]{|(c淳F3$~Au .keFpHre^3 ZÎdMl\Ǿ VjfS eɷ_ӓV^9}Í(+l֚y^Z^wGw2v.Z36`aH*冟TF3B&['GA6(7M뾎 Y6Fyr,X@DRϝ8G'<>F]F ZYp;8B6#hmBGB]7<Ã5Gޱ]7vkwMqݿO#zȡr3u[r ;Ix̰._*k*E[SFhЮ;CVYI`ע[NkB!ukkK[X,.VM`XlM8!B Hp}@B_VԭrVOWQ!SG+~7hY ڇ#g*W5帼BBM!jg%R<'*n6aDЪ-ZXDE d8K65nxͳF}(8 [ThD|,;=Þ0O_rWo#NL`|ģ3gk]C}eI0ƣ[8"RJu5=7 sfbjOo>Mՠٙ;v+~eϿ}V3P='jW(ipЃ|cQmo$ U^M6/$?i΁yol (7+Tei̩.Mp8WɌ!%X1w劋*z3|"3v.wlcx|҃ݔYI ]`e757R -w^}Xᨓ$04yf+ٙ-X7|Ueg@Q0zOCW}:_НCm;0]!]ŹW/#y, DX ?gwa`\8]+Vdctkoyr"N3S$gGUH-uNp8)]đ@pNZk>))W.2vy2|[} KL|7 O,"qIȡfKw_{  w~W5 2Oۛw'8݋w<q H aB藦 ;m1Mqn\C'on`bW^dEBo=;c _Ctd{("K)yhlsTD5㛯MeHrO^eT!TtOpzJ`%F1fKkْءx׺oRcCuCޙ I= ư.φfEc55sj[ $yk`FS"l;uͶ?'oYfz5|-iqF3]I^@=kNGγW\h7LPb<<}k>4ZvHg8њnf@0~aGAį?vss3q eLZ3[@<< I{zm1VbT ;WBmx`-I)a7* QoZR?GíX)IF"s·$h5sh)ɢ>_vZ5hv/#Z>bkuC%T2ұo @3j'u;b,ئ 0ȀӉH^0a*NC#CG7S~p_5#~f|s&L#>]v+?VD$ `sW9lgS*粄ǿmZƼՓZ܊ Pyn_\ mmܼāh>]5B( 7Wi-}Np;_C OpwmϝؗZ!K %Ψ 53'ݹrf!}po>[zn|c7Ĩ'>ڔ,/%yL Ḙ8ȝ&WlժQU ?])9דW}AMg8s1>p7۟7&΃jn%ZO':ZɆj9򟛎)t`l7P7*^V}~מ,hȮ ~5,;}f?;ӆL]۵e_ dOHr\Zsw4ֈ*2voڗժЙގ%kywnOSo%vgZcFl.?PB-9܍ah,:ǔqK?F+y?tEE]D2@@ xB5s?o,v_~ՇǸ VE'wdYŽj'8wQB[ȃ Q{WW|kk%u`Zٮlw 933ksh"-5~prזbjU7 \YHZ!4 Xen7>')EdPG[_%VhaѮldLlk;zU"lnVoKJ9͝0=8},@ӟR׎N|m?=U2|G.}nzG>0g SK%-һ ^Gk*q.d(T=Lxӣw8]c˰>VcWϨxsN/Wu!-*1s9W`トg17|TULϝ+,3q[zU s}Ț;_֧xYuh98W~Hhf*>>K'rupL.o7Frwogy /N'L߾hV'/BFQo~{䂟Ufjd @\+$ꞔ _xyxWbgcsdwKV/nyW[B ^/8]!/h.aKư.gsY(0|Mm@f~ %m-;=]ڢ:a2 ,X{ׯ[~s1b/!CTʕ纹=ldߞ*Q(#{ L1w 28`N4+`e b4V`0$lPmr C$D (ɀ Ш t :8xe2f\J̏kp+q+1iDB7jDN}ŎW<7/]dgA wV"nǿZg #cq+c%W,:E'ߡ.'xm1!uvLt2m's7WH#bg5/۸y^ .]~[-Xݧ.(( 2dHeee'{xx$&&޽{QTT$taVr_VXјq4鑑QP(~AAS̪Jw`8-[JRrܽ{x}J.[sʝ;wSSSYhZX;eo,<gEz\ICӘ϶JW*F&բ6CoA@p@pFKn9@2^ Dw(HN9p!xCCCA䭠! ^kDžԚg}dpA+h fe>z8{¾2 QbNk,'[V\V'3Eҿ/6 a&Fą[CLo{q^ .L쪆.m+ ;@dX/:0$$d c߾?`Ȑ!ӧOx19//o WhҖg{#@={;~x{{5F{z٥g ;ѣ &N֦LKV?)2l=[oݾ}TP<h4ZBBup7xٳd@hmp҆7#\$%nڏ *AonPu߶n]!@4f=s,hL tNBF`JHO' b FMbio u*TjhUZ-!qp =f#) MկRRimSR!u=]s'<^T𰱬j@[G8oDv['?jwu~\+ċOees*J{{{.rBB^)--x1Dbtt7tRss3,YN'N;LM)s̶wxgΜ?FefF%׮]ӟ>n8 Ŵ@G611Dl6H$;6??+KDX!233_z1N6lj4mܸh[[;ccP(JOO/--h_~{N0B8qb 5~:̼| ɤѨ{mmm.Θ yX,޽7n,_,###'';gȑ>>>všҮݾ},**IdTt:}ܸqNN*,55_]B$"==իuuu}[q8\l$''' "+3t:eo}ǟJe PUJIom}n~"77lKK GGǫWSZRs.D*h˗o޼Yp˗p[?/gP!@c:MyL(PWu`l qs@jag`=J>>3q~svӉ9 ;erX(bluڞ=)#{yz]g~;} =B<8::`дG?B!?zȼyoLqqǎU*F>sf={Zm۠QW^yii""ƞ>}lll._b|||OcHL&Mz޽B__#F>445CYY#*44 #11ʕ+ EKII lΎ.Ʀ[...SNݵk~T.$%]>2..%].`' JKKK1]͙@?tZvww755JeaΜ9UUU{A$'Lw1&3ω[[[WW=[q8\{6)D"1772e\ɑJe~]#0>[ u#GoV˗/[tɶmۗ,Y -AERhUÙN43=q#J Y;RLӂ! L(A[ 8Y :Y)V9Bu. ХnCC-;kt ޠD Znߐ+= (v9?Ė78ն&l"١]kMY])CzY/v&dL׳I*UWp8\JZXXx{9sD kk~s),,(//ollζ?\kk߿/a@@ ^v](^~]*v{)A r055𑅅999*;;߿9nzz:˕H$999B6@ y3=!aN4E_E"qzzzkkL&yK1?Fc2X ohHS\.W ܾ}b^PؘOu1 OOϳgϱXbnpoejɵ%%Ů.}>{nbjjDf_6?!C40nEס< a5,i֮ C!a5 @"`A^, S!4V|`ra:x%`jj TWWۇfla`bw+Zst4g̊ٱrv?5F1que+LWW[01I#ڣ&y}=?ڑjrz鑃k*3-x;f֤[ءO_Vt!vYYWrf Dcy/%j{,0XfG IDAT~K1槫@V`!FC$(8\94P(x;mm@yN)Nsszg.M;f>:^,--:Ol"1[Ehhh[͛YYYnnnNN3. `6MrRgnnwccH$WqC~VVV 2t"h !!AA4kwXM0[1tG+w6lשn8^45M=\)Õ8ZgTJHA`3̘Cm>HyCTE3_C䁽yw8@UШU5켠] 2>TeXUm'w,rS>E0wDdP}e©YfǗvSh>]Gr9paYtӼl~05BѦΪAqjܗ;v;eH޲TNu2(#u+]<ܖQDz9HGDx{p:7sYIl6RjzZ57ӁF˵HA7P( ˰n߾3#"ƺ?~k pO>c>ڜ[L FPRR啛URR8VUU=ϧIOXFSN֪ꘘqH77?)u/_j{oҥK/_eyն1Cw-Y/uoɣ?y5揫8UpqK9)ЪLm 7;Ρ{$Ů주)w =t]ZK;Xcf?t ˷RA.uBǿuPl>8 a_o/(JPڢ~?gًȳ"0)O_5S0O&KKD~h;VVV\VbKǜXzWNalljJθ|+#]ngg_PPԤj 6Z~, kTJգMi'9aU؝a0lllL뒒~6D"{[[[wO\!η" 2WVVbN5KKˇQ]:^8nŊ[i-[+Vv|kws _͜ nLb<<3hAEUWT^FMTj?y[G? .uC|c[($$$h4773uL...&&&@NNSHH9}ԨQ e^^.hTOOOidvP(Ǝru?#㖫KDD% >"(rL6tP>h42E_2j={c\\DҌ`hllH$\.g +5ԩS-,_ylQAAF6mo\\l zYfuQWeee'ǻh4///?~BVFP`XSu%=<<*$dwi.}nÏ&d2L&1.ҳ_TDҌ-9XI$Gծ5wfskl? ~ pVÖ}0]aPf?uFP>Qa,x]9/"buX3SSpB l!=f *_2J  >Bd~O>>)222>>D"I,Vu9:qqq˖-# #2IJJ %4>}_bbbƏ᰻ǵ?yTTM$>1cFVk._\Qq܎ޮ%%]8qBpppmmmiiIGkצL@aa˼yI$#,"\.H$cǎP(mmm #ڴA}U>տCYΞ=C622Bi@V:t(**zS03gDYwɓ'HF<p1??zZ6!77$JNN X aY5kh=Ά} > D%ɟЏN%eHk~?~ .Ӑg]}{'E!~<[X]]&;sK"vBO L~RNUԖ7"g0өʉK 6ZEݿjjj{;ڪ| F{뭷v1KLF@+ (*o kL`,'ĩxƳeOGU6CcSCY cPSSkC\9ly:;W?I+ ɨ_]v&ضiI+5.Ѯ  y_K t1(F TuQP(O(ש+L`ٴ|+?l:[$%#{iaC\a^[0(C,$˅ߢIbE7TKD92UD*1 ]׬*xWE &R!@ ^uc(bg!VDZ+JJTpABsnff@ ^Ruc93ݡ Q6Fx(bW=R5jT@ /u=r„*v75|amX/b͒7_V:u?}1sLRw B"={Lg'MZN&WܸqǍHL8~x|DDĥK_MH :(򪪪WSQFYPD~>rf򨤧/\ ++{Ev222q)))w>}3 @< v܁᭭cbƑHF=ywwwb^۱cN333?~ĉN>tƍ̀a>>>=q$ u܇Jl6ɿT*噩+@ ff˗c~-~:>n8''GJUVVVGbbbi߿>J*m>|JF P,dҤ...:2%%E5jFS*[+**/^qqÆ NX~`-񩬬@O:Vϝ;WUUE$x|}}K;2444qrr,--}6^*%%bcccz C&eff޿[[[0V퍍gϞS(}0D"V+ ʆ鷺F  yݹsSmxO4_~ˠe˖޻w/3>/H46&D'IRT*+۵MMM>^~]aa[vvի)//쮮QF?pt;ɉB Ϭ^..VV >_pD"1**H _WH#RW/3Roq܊@ ̙3j?D SB1=rȴiӃ80{,ww.7W58Nő`>- 09%Ree%Lo~t!)BP7nPiiiOR& LMM;T1|={jZ;;人Ç3֥,hg0W\W(ZJJJ !!n8{,`G wBV]#G'%%555EFFɦ4Jĉ1K(JQQ&MwǾQzahjjKJP[[7rv#ZTTeEߴk.H$ss)S劜}剉c^Ä sb֖Faꪏ2@ wNpp??Pؘjllč\6-x q0຺̐zNGP݇\zmdׯ_:B Lx΀$&d2Y&yRJF oo3gr8\Hbaaamm jkkrrrB˗~YXX#H;FVW477 Gf͚?hŊj:)V'UW@@@YYiQQ@ tMuld4tʪǟ4@a`X55PUUU[[ۥ`h6񦦦R!V\[[\]]]RR?'H4Mqq^={zz={ŪEEE컌=w|WF,,̱ =d2h4؋F! ukpjka>:|>;kqT*56664-ZT]bEEz ~ VX9Fr8:1RWe``>E(bϚ<9ϗ攔fϞ=:J5;vIN:Gu􂂎X(((xMLLJ&<=I55Za4ݙi``ILQ>bE/T*^]i48)UUG\܃uݻZL&?1gh;88899ܹeJRꟈ]~ZzY`:ٯ'--|l...#?C?JTΟ?u> @ɑa)6-}||0PYY,J5ܭtRW$t|$Z\.733~#22ԩӵj:&fK@ # d``9Y[[G *"K$D":ߡ woIHXњ=G aֆyX,oo/<ϔ}}}}ee%Nr H$aT*A8#/FFF'DAAF6mo\\/ɪmlƎ[\\ylmmGaeeefFh4bɴ0'],PTRRJf̘Mcsrr ǓdB9ȸaiid2@ S(777뻆1-,,bbd2@Guz{{q8ܨQԠ}~PСC-[2y?55%L&(}p8::VWtw=F3g&:99ڄc3B!aebb>>NNp&Owqqh^^^~~~)#urr&ɘD?<2=bSNj,w?%p+Ds'G訰P< h43gDz=*II&L0w\LIwvv><@ 'Nv ^XX2o|ɨKDܼÇS(lZtߜ?O"fs'˗/30;;}ׯ_2eʕ 0ccƌ }E46rQBVkjJ:u Y&޼e[ygN a>|rV]w{7U.ryMM5Jrƌ&`p4 :wc^D3p\.󭭭.\ޮerss۹s###'OL"xԾ{m_74$bK;WswAYYُ}'Wd5Uܮ͛$|M٩Ho-m7lqr*# 4"q OggڗSŶ*筷],\1s>3>/xYY⟞]Z1\DA=핹756>2a7Bڵ뾾: ^^^݇ߗ6\p@ = fҞD J57 b:bv~Q&}Rh g(wzXrRx@J^SW:հeLwWX ,m/l|SJc櫴 |s/; Hk6>zڗeLV0S4cJ }0܁J#T9I7'jt |kp|U?Bw/6l@-@ ^uev:I`hV>xOZÌVL߼fج `X].;9_5; ,H9?6-<*\%j=u*oo+tDCV/@>>FhJekEEŋm⒡C666:d]}tq㜜U*UYYYjj~}رcMd2ݻws.chhNh+++._w92,,ܹ|u,UhTVVv|@ z:9av{$8c-}Ś;vTl1b̙{j(' lll._b|||OcH Zȑ#S(G7o͛ro]u1!!n8{,`{oi4Z@0a:6?P}H{{;V xʕj x1ItȑꚐ3fl޼YVę3gVVV?*..N*7s=|\.OLL2 IDATi> 09%Ree%LvvvQ7nprr:}œ9sH$N0!::*99N8)(0Dq&'bbO83xȐ!Gp"É }P(Al7ob''Y󁵵5| z vyPP`mm ==+ :I*UWp8\Jv;45==`.> rAANIII,K.SY# srr@"dggc1ꪫk +++<<+?ӓH4tZ EAAAzuGb WTTrLwڔҢDQ*Uwϯ=%%7--m֬YѨrvo ĸw6k2lsKk׮ 2$ `؈#@ uxV+ i4z'[Y1p8Xby.xڵk1QR[[`kd N]_h4Db?[ݿ5yr/))) }ښ8 ȑ#J2 `R~P|+KKiX.@VvN,Nb`\SoСKR)ARgJ56664-ZT]bEE---}YTT{Nheaa~ΗdBQRR+/o(..z+ѣ--$wUnd2R6^j---O>k֫h>@ Vk~iݻwkZLRu U} ]o|OO=ϝ;hѢ'DBTܸp@PXXwܾ}gcyu@_ ^ uiCBBv܅je0>GXGힵD"ٶm1^^^'N裌 %1qfFFƱcǕJ-c9;;{xxr8/M<l &-bqG@xH[x<"`ccӇ'L(vV=";? ι@yAPڇZ?۷OVϜ9sɒ#G쬄0ܹ3vl\)9+X,9&s@etuuu7o>333&9Fikk̼yndzV/_t}H9dhee[0 dii٩}EVVL3B<[}L$GlҩSݻw)222>>D"I,VwZp8III#$ӧtޝyuŦ ]}V55%O:Ą,IoLǂ; `ZT˕;r䈼<>1cFVk(ac5KO$] 4@ 3ϻRJUujSԬ |s/; Hk6|Hi9T׎o>p y_ u n"Mp{-lG@ s@#8FX1lԀ{*yhq3>X1Ax~ڛu8c&,eԏk聯Zx2;7oU3&Ff*/nh,]tAMŨ X+%H4|j9ޚsn._ȩ=HP/=ϲ Z|D*6RG&\{u@ ]L'zXîMXOMh sת-E+iT&96T#ׇ϶22hY@ ϩ"N^հ]>Eb Ȉ.Vxw̚2E$ޱ ͢6YOQ:@ AG W}Ҵ{Ӂ*<6~@GݑP"4v 3~C+/Z>!3p:ի`Pvn6F x,3kXӸ{-@:aKA挽׆ȋ0HX{ ʠФIϩo;ͯ4SBPu|\A2@ swAYYO%Hz'W{(#JVtvvAxieeeiݭ#PZ:@ ssINԝy@pQ @ u@ @ RW@ @ B @ /}p Tx!*x133{WBi4ZsssAA޽Hǹx<^yy'Hڰaݻw######Q gMK"Y`L;Iq?p+%Z3sIZzQK4sb./?uHR~#D:y/6MRPG QWJկ3R/3{ m+.g7sYI]g|+'׬xB+-\ívִibbr*T ˖-2čNs8+WٳgEDD={ԩSLbbbfsۗg„ &LM6gPE$''>}O RRRoǬ)G}hcckfF ΝssL$322~}FA_]@ u@^1~Ƴp6kp49}ӴdB+H?{&$VXa+QQ\hՊZ[PŁ_[uFD@W @H|RWGrsϹ玐{n׮]/^X.]:8p0'GGEj5ƍۻw/x"?@Rܹs ̙ܿ H$ҥK$IxFkkGaAu}f2Z***{رqyW^ů.B!LWԏ+gݛ/nel; \.NogϞ߿U?!g.&;d2,tؑ-YTPvJV5lWXX啜m[n !SW6gM넚͒Qv,tmV\=YQʙ] Ze)>Tiy/J}/3L$VB{dOHi@gP!mq aڱ%nhJ"@kooGR.]h4MRu9bH++˺:#8|L&FoѿMcjCCCmEY3'"tf 0+, 7IeqE ӔA? 锹sǢT1eP _?ZwSA1?ǥ ^AB筎ɲuZORtZ>!9f֥ˍ:۰8Iװ1ͪw-O95Z@EEJ*֭[/ gܹsϜ9d2׮]C|H?Rt%*ToYo}ߢjB@h !m+F܅%(WJ$B"ʿ|7dbEU1Z~ձCrU%ǖڊjEJ,J'f@G2ܻ i5'.=9{S~ deR4kce-J2))i >SVVh\nI#:A՞:u*??˗ du6Jod,w_KB2ku⽛brIbydUDգ$FRfTyQǰRLɢ6L+Cuޡ^dQQdfcSw&"<aӦ={N(٬֭[=zjjjbcc}|&0CCNe8=EQQ1J=zTRR25򫯾hUUO>-,,\ sUVO>lR^^a i4j|w.!0]hCN?Q 锤Fg*Dj-yJZ[Y$Ojr,H*kx0}KQD,8;tRHE3v7ͮd0oϹwレaþ500ǏȨaÆ3FRK5pu>yڴSNeee-]?00D" /_/]eg:sСCtG㟼s!?:[EէXio' !Xe][y/טI"/=/p̀$֭{OzQ.gYk*nfgpDU3riA\XX(rXMao۶ÇhV?~dsׯ1Q.olr(~iBajl%Mo=Zto&)>~J˓mصi&x/\XPRqVp&N͈rlZYV`w6c W [O)z6[!З˅۷oQI^ryu/y/:8ь i6$(j`=<;!BMD}=ηA!g!BB!+B!LW!BB!+B!LW!BB!GDGPN*u>>}!t¸ۻd)%_}9ٓvCYsHʌI]G\1B5tW'a.Nz#i7 xͦ >K/!B_wq+C]Vchw<\B!>uWSW6gM~_%Yt4ٓoBWέ\}䶣CzX;{wʔjI=lƳ`TiRlX9Y%޴ڲ? 4ö$v4y郳.R-GMښMw.ښ\B!Q.oBlpQQlؔX1ٜKƦφٽl{be3'l}L577>|yr5LuvŪ:s)׵慵G"K]DgOwپt3>!%9sc pH6kAȊ#qB}94g+et31C%--VV(l͈嫪+DD$1(N|,0nmڷ(qOnSh9ű3J g?.Vdy\nDt\[[&PX !r+}WTYKX0K>8"|˱42"_}YRY7æ#M9'0D+Ó#ߩ{ngvmᑑQ6lPT<5{o753Z{͚iii\.W__H$>0q?>xOs\]]JJJE 0m۶s/ŵAfff>z<==ynv֯ߐ 5}>|ի/_CϞ=7pÇmܸp̙Žڴi3}zHMMX,M6ݺu3,,lܸz'JС)0p}\L&/^:&&fĈ:u;w̝;(x=__?"]IL|G&BqWx<ױcTJ>_UU%ȈŅy==="7##V2#%. K0`ŋ򂂂7400~ͮ'6fddTTTTTTTVVa5 IDAT?!.\IɓIIbX&h,^[[p EFFJNhTht9sFLLUTVVԩә/_>;~[nׯĉllx'O&NdJ(+iEEe E|||Ϟ=mll D6*n*CCd-ZeffXXX߽{W"tڵZl٩S5kFU988i4 cc lt:ugsx2\\\$ >drvv6>̈xˆȸ+++ޘNfmmG@\\\\\\Vjf@ZEnN+))q#0ҒB( N68w%JݻBaB:ccxA~}#"vk<ѣQQ{Ņ_VV;jzXׯ+##rAD"$IeeСC/]Ծ}{777KCsqSv]]>iĚ|bqqqyyyjޡ222ƌӺuBK|^^^@ q^G 6)770''(2L7n3ftvv6L>yܼyۻ˗KD!LWs5رcBB…Z \08o޼+#""nرc3gXbynnK5kF&;L \jՓ'Obcc) ޽GꚕՐuyMӧN "Fؼysee?Y^ KIIɗ.]ZxŪVV'Nrrٳg/^"jDG]`Dsʪ)STUU=zcllbrzjLL \|fϛ7ȨacMw>!SxWOyxW>>>|ĉ?b0UUnJR?rJ ?$?5'fLa7o޺z3P(|ǻB}WeEÇ P e߾}1 3899QTr?ym111oG8㱊Bg#::&::Ȉ`H$BS>_ZZ*H$iI۶m:! !0]}Y&PS]B~+W\r>B!OW^!v6Z1yԷTw]n%rߏVdt<7wуʿ`F GB!LWM>ɷn #~y6Uu `X樒4Ywe5p:_o,o^[>J<B!LWMYΧg/lkT|//f U,z|=YMᑄB&~_\}*F۠]mIW.ٖcSJP ^.ft]qI&Fj_HC,ɑ3W\b!ٰ5!;-N1Љ$<^>kC>-, -'! ̝={rx㜟u@5uK7T:ɼݨ9>ӇgO?)uZORtZ>! >ںt}Q3c.8_"69{6?v)PTG^UQU+Hq*Xf_ݼ^ԩybft$νې?V^Sy3;D}hkq9{>Rh߱]:14u1^B}Y>3wϋ'{w~it#}OaNJswYɢ@$6Xɗ/B}|z˶y ]9tR3BU&g0e DŽ3gk련ZkokFʺ?Lm w{W|Iwr;V5hD?Y)HݻqaV͜T5QC!ٙA9$kzq$F62x{)]'}7524 H:[/(]'y׌oQ˺>q"cd1cܞvPRZrhĺ!bb褹t6e!З3뻢la S3k7fM^#*vL7w[%ٴ\4ɋv}Ew£{vO`oϗҡCƮ2J&zpq3z9IuU/}W!З˅۷oQۗw7LQQ=F;И pp/<33Bw8Whjs1H8;!BM7B!+B!LW!BB!ПB51;fq\]];qS >QM }}֭['$$hZ)`فm۶R{쉋ڶm ! wׯI}}}nnnttt|?UIϞ=ߤVNرLVWW]x!=E);wزe?xܹsMljjۺu+QQQw… nƎkooez@Pt+)P(=z\~c۶핕:3gΉ'?\233 d.{ر4jժ+W=ccc߿hNNN_}L&k 3'RҪ_oۭ[t>3Bf͚"(hEuu'"""ܺuK*M4сb8qܹ666~~nnn2СC?.ۣGɓ/_&"#{nSL0G}خ]+v< TjbbҎ;J%Bꫮ,~qqEU*Y͢bb0'O޽gO/"]5klIȑвeɓ'9r$.N-|lvIIɑ#GBbL СRzڙ3gӧOkٲc r 0lط&&&"hݺУG#GdeeGEEQ]]ѣ۷ō5J XYYQTZoԩA-ZjwލwwoM&333#""D"9bl6*77/<<Tر^^^T*5!!a5t7ξ1gO۽{?>&*N2wdǏOOYZZDoSNN wwwvڅ !ХKQTT4~Nc'N8- #""r]3g"vBad W)2׽{7ٳCw6|Ȩ‚ 6TL<%!!Sff֭P("zݺiioرCppML\ʈN gg;w~9dggt: ߞ={ٳU__߷o?Dz.;}47n ۷ڣjƍwކhBa._ݻwq@܆ SSS7hT:th?/VTTHKH$V=~{u۹s]vUWK\33g߿#0]ķt m;]'`yIZί4)鳪Zzs5J\k f{ԨQOjk֬MKKrD7H$Ԍ_͛7pÆ @C"\\\ry%,g..|ё`ޔH$D7 komkkNNN)) ++YY2fvpe:thnnޡCŋ;wر͛7Y,֋/xpJJHH$.%%MwgӦM'z4ԩAgϞT"I?*jt OBav+1cF_|ƍ 튈)..644~ѣGv28))9--tβUpJKK4h聣s>+-gώ43h@T'q@޽{;x%K*4WW׮]>z12$&&+^]]S!LWebOr͜/oFm=cR+|c6RN wH-v-xqqq]~%JWUU}*FFFRFĤK.k׮P(nnn'=yj]]]rrrtqqH$+Nwpp8v8Q@ 76CCj:;$dc+++O'L?bĈ?jG=|) /]"깺>}cJrj˗۴is򕜜ONN2%b1 --JؼKKˌ˗/^ܴbq%>a~.[\\br\.qСC33~gf۫p9sXXX^|~QFzyyrAPt:-טJ]tIFw+feeM>C۾}۞={N/_l!6f)D?|PCD~ܾ׻7۷or͛U_!Dӕ5tb}[ȹw/ޱ;FvVy65BvSYYL&pG;gff+x ޞD"2 Dr޽'Oވ׬SV/]͛7RD7XCU"b10 [[WrÇB0 `Ӧ͘1.]wȪv9jHb@V'%%}WZ8|Ǐ qc\FmH$ TJ\Z^lȑ# Fs4OlKRWDGD4ibqq1qRdXDKYU2mA&&&gĈwGnzIoR`ݺB2¯7L|||||w@Ǐ55NWW"-G&؞jZ*.^q'"X򐐐޽{1bРAaa ht~9x{:4Oת{peѩQ JWdRtf|sw}V._߷Mngo?ȑNWw\Uv[J |ZAh(R$j< -T)KZ;3f2ꂼ\&iCC秢B&hᖙaaa|]DҾ}{DB\  EPP(\nUUU5t? e.zkI͛d"WVXqQ''GD"iBa^^~^^ˬY3gUŝ;w.//;%dee7o\]]‚>ZTT%%%hV}Ǐ׬Yݯ_ߌKiO,smG dʾs***\*d3B yzv˅yyy%H;޾ cruLϔo̠vD6>|i=@s'ףґOKmݷByr)uuk6vuͤZvG@V~բ?f FģETQU:2}nA}k/=oz8qUUU C__jЫWO_____/m 8dȐx 4eo¾NWe)}*˔wAJ.H)Qj*˲J kǷU'DLw5gudQU^xu9ַsnAGbhajB۷/::/YrT*1bDHBt%crZ sZa@- Ue *25DRB+Nmn3Z}JZoЃ(2jV݅8 &QJPmg(RE[m IDAT9@/122"T(xZxzzl֭gΜmB_D)@c(sS 5:qhyq tʺXKfSr9A>=#B9ՕK=RTfG[t\ P&(+9flWUʟ+2 d?]%5k{nߎ}; Y(E!>&sUtaHv|2A.Ҕ{uW NSjtM+B!>'d!BB!(*nZݸq˹p!tyff /^k}ڴi#B!Uee_.wʢ;bVCC޽{]v…@Pt`0tSNuwomllR?~|Aid2yc0O>"ײX,޷oӧOlԠ-Zhڻw8|g3B>]&BʨT*HKH$V=۷oΝwU]-rt:m&55޽{fcz/YxѢ0a޽{9rFlٲ0ٴiVaaL 8O__ݺZJ|BaBMlѢE_С[dBHKKsuuڵG8555Ij:)) ''7{xxddd 4(22֭[_sv%%%JJLLTOOO[nq8F վBaBMLzё`>|N&srr޽پ}ە+Wn޼U_yRFH$rpp UZ]QQall/_3g˗|!+tݽ{… s-))Q*DJ/iMR@yyyHHH޽G1hР555oTjT*DɩS|||@kB_._re֬FFF:uz6SSSSS⢒Jղe+bYAASQQqku@!0]}=N=g9e1-(?-G.1ԖO]C#v0GwOEEE zѦ{~LMMãSN͚5 F"zyyuޭsg JJJryLU??^zu1,,,777)) ի{[nVe2B}`E>|p^VԦjٻ~:KH$@KXlcc3bp6]]]}xPƍ311IOO_~V#G(J__:Ec>m۶С=F+++۲ekmm-B}HO+z\V$K),*M|$xtmxfyƫz_uMIes[M1pƇ??b hyޖt\}~~XȈ/\ů BƷ"Owŋڡ\aohʦK[G@+Z[.ҕ͒Qv,0ΙӉUZеL )J{\NL>~!C=\ a%μU7]sFԸv,\Ю}I"P3է+τ KSo_ 6$Y#?k޷Ze)>Tiy/J0]WH w;SL E ~T}+{)9 iیCVӎ-tF0]f ٙfa` ־R[+ >ںt}Q3c޽4s\ u4/~29!Wv,WHb֗ v}Uӫ"UcracUZ$!Ysh5Z-v䜐6/x,4?c kTߵ7xyZNn˿z,Z 4N)X7׮*Ps:iќJ %QULzn,є)A%A!h* HelY%/K+K֔oܢ*nmRǂJznr6h*%0>UG2␪V([b@W\+y}ͤȐVNJ5UHӇ:P׉>Miբ4+d:]fTyQ/ 1,-+#qxD)ߨjMa}kʨ}c~);u~oҕTqB}qj {SoB10P̞/*W묢?R!e TߴkCWfJus/ NgdͥCq〥˻.|Fu>)t| ٮEN6-o pIP$T\1`oQZXVh ieAVV:SB93PiTJ 㮡yذa߶l!!MVwTβݻw!>O+z\V$K),*M|$xtmxfyƫF(9ٔ[گ__777' 3\byyy +b={rsV\3du;lط?ݾ}qw!gCW[lߎCM;NڡVZK* ]o+-%A̍YtuUaڝ3QdkCG[0@R|qj}Bz1Kkq5d+odW5$<8k_FL3Ҕ㛷Wi5/!IĚmvl%]IҖ=ܽ~kvwP7+ogӌT1˪[۵F|zk!i;{g!;6, ,sWj>sú@|[aG[/7<;xr~Fxl[t Ӭz"$ ɚCLq)>llll۷#""O Ba8C H$y殗{x + Y3F,@M6;"g*@"``C =+_-_K(lk$_a)DrFGҖt#v݆dr%;Ýrg͛ɓuJ5Ӣ9(yxuϴM$-)л+Զ*atwAA.DAQCU.C@Dwm,EZ >Ci4x_~NH!}?ߙN :|s"Wm;Fn;*",V}#+ᖑ~_\p{Cnz:tk^/;77LKK>|XBB¡C5K\])))mڴijjGZj5`#iڴw=klvcbbfϞ~`ƌwuرcr8 ѣzSgΜ---3ݻw/_<,,%?EBBBXXΝ;˟yfܚ5kE$22"&&fnwmvwKӧ8vu<[o̝;WQ| u:wewϝ;VH6m&Lyé9s^3ƍc,Xh>_e|b5DDPVȧO)XDfK 7>Gf*,և)_nMu*C4G +ˮJ߰KT ۣetT%"RQR`Gzu@5I+ƠS䚺R[.2s ٵ4BCyeYHG sT]~j>}|FݿYfgeejZ "Z(wQ:M6 ׿m2N<ٻQQ999 G6m4h"s…=^TE[nNӛ#jK.ֽm۶ k.iiiv:t s:#G 8ںM6^L--5jqYYٱc_yHfff.={_^D222,Y=֮]wF/Egt}__T}̤|Z}V*pE}:ms f-MQt/WW>\DfNkԨKL&h4Jub'][u;lVp8??VZH.9]vy{^:1 {9ݽ{wRҽ=՘1jDA uf;v>v'NZ xDӮU|يOߤSE/CǼcljC}jq;XW[[&"} %cS4kCEOc]82έK/iвާnO ?ߧJ!QE5}vn{sm.D˦>9e\'FSdo9b7hz y=EФI"ͦo1NHbbb``<ٳgLHH4Nvc6 ￿;QhEQN2\^$rbh4]v-..l߾Zݻ͛2yK=zt7n\ddƍ佘醼gs=fYWN*,,j`pz/G෬tl( i|/!i3ov)ڡO?\W 999v=<<~uC\Z;L%">>>=z6mϽlڴY lݺD]u}wؑR7eҤI;wRbbB~~ϵoZlsNo޼|xufۮ)=jUY֔}(x̧("'s'}rFTA֬_M[Tion?-gʼ+doϬ5o.j%ϜfՕ^2vUkq]:'F>3&k2WﮪHZZw[-(Tݻwo l۶J_\\d2CCC&$ğ>}ZDVk](ҧOc2w{ĉO>Cz^s̙KJJ:~Fi۶MffOy 6lѢņ ^y;v֕V0S IIIo+h%jɹ7mڜBIIɩS>^&?/ͭ4m! a.{in'o{~˯NYZ;TvА;СC/8;veZvlΖSN'Nx%K#""v{]a۷ODΜ9Swyo~z4 /8TAAA۶mV\)"&tn:u4h`UUÇ38:tX,'Orzټy3q\=zXr޽׮$""Wf1cnСC ,4hP>ϟ??yKFE.rK<{.6Έt6WTTjV[QQO2dȐ!C9<'~ߝclڵFcy^=G|r\2%%=u)%%5%%588XVL&ORYYw1~> Ws}bcob'?WW}7d~͢537no_出DQS'_3=XM+?//e\/7w;gɻߴpxEKR?lL@~屫kXNtw=[>y֗wͣ48y_r5pA-w_" ?Dс+LH/DD8ϙIDATcǂu8jՑIIQ>>-1{TS]yZ>kbtsRQvuXF4Z(ٽq{%8ۏxNZZD9ع_T9jklNt:Gå y֜ v(O3ʌ5fؖ=""bYyłSkfV&44t8N+<6d.:/E\FGQjrK@]yZ vM(ZGZQO"\<׉C.{c1~#8Xjf)`}rzܶ*J yHb)t%)75nђ/ Sg+ygWXT^SiECf "2_~"rdn7o.N qf.׶Z; [YiQ5 |+.3E 4U|{FbG}]@i<1፽AǏܥ y5GEFzL!ǺJD ϋȲmeی"2`yC 2Q^lL|[>q\?y`J)͵yzMwmZ7 i|K]z{toR+zǼ+kMѨ>"UJ%"RS4MLF}mEYe?VS%nА5n)C&ƚFjO_,F]jκr6m1s xw8l'výyβ}$UϽ9t<;8g9䇟 HYJÑG|[*+s;ϊHu`d㸸ڐ)*Q=;$Z ?XB1jC%[__s)m۵s4:o4Y{G5*?̬TMQZM{ab~_&b^{u'N YxāWocΫíSW蘍7+ + u@]PW+ u@]PW+ u@]PW+ u@]PW+ u@]+ u@]+ u@]+PWu@]+PWu@]+PWu +PWu +PWu @]PWu @]PWu @]PW+ @]PW+ @]PW+ u@]PW+ u@]PW+PWu +PWu @]PWu p+xIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/generate-clients/image03.png000066400000000000000000001671631461403617600254160ustar00rootroot00000000000000PNG  IHDR=.sBITOtEXtSoftwareShutterc IDATxe\k6a P[[ucJ( % Kl9 0@ w=EB#+gc2UB藡` BanC!BB!0!B!m!BsB!6B! !BanC!܆Z *M!B}3V;;`'p:CgЇΉOѥϞ+;9\ӷcx@IBanVsvʪƢm'' J9ʯQd2ETܣjolf޾cn4dP_G+U 32ฌ!IA.JvUTeԪ:2Eʹf}̵\hr $%i7/W P݌?\qofYv(rL_ ѢUV .8ͨҤ>^{n-h cGf3⤃k&IcNTacJP$z+HM'1bMUso%?WL蚽ٿѡד>AMI˨.ȕwZ@Չ;:9O.1wرw8M@)B:ה~- *yM55F>yѐ͇3Ǔ#Ȍ|tz \UB&{|:{Bn{\OUԸE)z"525c529?`Y-X5|gbs"UlAcC cyHĈǴn3$kx /D*~} Jiՙ~s{6ih@߬;7{ܵ`MkKZWq-ܓ oS2ܽG!Y>q1aU!V}^N: ]N.nXEe`qĦkBߛl [ W\ɓdˡtl vNd{td\*{E1ǷB "Yjjݢ"armQ~v/"c]?6l,,F"-bo_7U_K‰[0Y}uwjLN)C|m[窾uֺ(p:a>[m*IYQSNaӓAi;u!)M{t H_$;[1xv?i( W ]Fi?dӒ[+VU遝a0.vd<| I8IenݵFF)Zl-7wb~$ HMdJq 톤h٫޷H'7u<*˔pfEqҺs2) 6{1JkGVh֦ 5nJ![O[/t~&[}=I @7LMٙYwaR5?( m m#dȇ\WG-qeNtK=vxvKA0RCqVCBpjԺkD->)y ?zZ/82jOB/4$G V=e6jieWHE07M\6L.PXJz7p"2A%MapFִqEmuz;.4T .&5tʊ5]J msBanCW6 !+!BB!6B!m!BsB!܆B! !BanC!BB!0!B!m!B.47Ï"Яm!BB!ЏI>_*(B9lo^zzz COO#B!d2qпIg =uR~z1 B=|&)q. ? 4".sbĄ(Ww[%a}#B@0;f>I{4!͟x2B*qo]8_a~}[hvgk$HBF;DQux/ܷ*lydƑn,<xD1؏ܻrj^(:wk´=ܭU7O_ʖemHAH%iQNFHWK]w>BX]jzIC:*1g[mF[4iCX׮r[yEfΙ$;ݏJPt]|yYG92i{/=Vi\k 䦅zA[*%"I8g1?no)J@Vxbt ?C6=}6uG7c 1sêhCY|ueٵz "_ъ wZп΄EinSTҺ"x?N,]%ӸYI+]Jxqc$)lLu;nմMq[]v*^Y?E u;TWnx\Y Xq#(1y,iԫ5XFjA\-.\,_{ѴnIe:l ٿ1Ig7<6j7o~5J;ʻN\8WhyW%<0P^&Uvm?ٍmЋBVΝi]LAʘnz;\7R$mѷYppA V>hgYobB'Qw.ɖ Mia-YK *M{hhK TT( K22:Ԉ;;u~WOߨgiOs4P@wj /O|/Ew=Z}aC51WˤO k:bT7:]{qztI|:6RJ9LtОΓgL{$k+Y رw>( >lԤ1&j,:S&Oz~ܳp5ǓEЊY56Gc ݻt9"betg6MW0lchu0`Ӧ72>R.}+u!?sA9npF6oMh& 4wZtjm +/6@ MH?2oy`)dzgvϾSռdž={j4ʼnC+ڶ31fgjcFTƆT,|2s껴kڨSSSQ9Ob1huIxp7|kQRmbRi{WZ0,nƵwGG\M;WrD$ݮJ7xx`tV 5\;IC/t(glϭ94"_AlR (-m *lx!1WbZ͒Y*e]3=v/ijL?mybQ]6=[8yFÍ.=8lbQw<˦Sz:CV m@$L$nkz~dP+ B?6 Sn>M NazԚ]K"ˡ@"åǶ[7x:q%ȂcU(ą\E6%Y¡z.48HY(K>Ztl£o? PĄ$kM}:F35U}mԪ~C r[) ʞ٥I珓wwڽWIIJ,t?Ne2)P'[P>bBT[)}?r&ӿQvz(@C'r4 IjQ-z~eL{7˹/OzNv7r;y (o@@g1+ 2rzwWKeY k1v7,|"'dցr7sz5ԡnH.yUIى+s\dz6pXet 5JiqYZztoxٚ$ ྊ+n$=5d߻Ӹ+C/Oc{-B r[Ut ,\\hێidb&z-vuJC,qeR!"ڻѧͽT¶_r\sJeɷ2(fSkQLw)˹.>$ͳǬ-+Z-$-zY .ΑU嶊WVv5gVsuddqR + !/))d^h\Ũ~C=RE}6W{:fNU{x"g%v1 ]NaMǏ^EX1ߴD9oIB߹:C..J>wn[Ysz3g؇NUԮLJn: p6 ". 10Ty6]%/hq#==A}"N>~w .tJ #s  $+/äu.$FMⴒ2inliә8*eOT ])+(*W~&VWzk?;Y]c }\H¢R{yYJTejhB-մU $Ӑ×$7U0xw ]a @t>qzeLQVyTIut0Չ+LX܋zllŤœŷ\䶛?;º[IJ¤ѽ,t /zY3@&I ~%07܆ sOn8];`.r:+P`.|m !0oaee_D"܆Bw˕JܐJ\.#B!ߕ^|~_B B!0!Bk~KYX !~'ކB! !BanCYTIsZ*^y?؜ :\6eoFفi}mըXOM*3wo==k$ ]VrS=m$ N`ޘӨ`3쨛6Pİe@ yxe\As wK+6Y?&L;=ti(S&'n=;ՁST<(y.fgy_;ƫ*hH?\6wϩ|P H}[.;j^#GJNkoyߙ>9k_]8 U_Zghs' Du^nu̬Eb}gzǶ #ϽA\=kGcc=}M5~ A?-L@S=:̰ ^{~;V|+T;  ۨl7ML-T,ܜ4H( K KG=C(>2DN@RCOCU\.(o4/pGr۫f=#+Um$=l\R}R?\VHPYкMrܤo%6S:CV,p'gOV$(-$^AHRvE/.[t_y.u"U>Vt&g7kXে;[aQϡfqۈ"/=4=B4i>, @߼ 9Oi~JiB9$8Vv,/;2 Nibn| JNN׎T#^t2i r@YlmA{jý8qy+Oݺ󹜳&dk{Ɂ+?}ǶWՂ#RÞ?~.0()Vw==CZycSG:=u=jxΌ{{=.[Ci$=Ё rODX+,xϚfAHn;HQսռ95;H LJq_zͳcgz@iaI QmqK\ wIȣ؉FyIIg'IӲQI0CY5UG!fnH|iL4@S?>a7irM-z<@&bSTJ7GCcruPv)8{բj G$~٨EghL{am߅j|@,@\1 IDATpUQ]QIscH׷nN݆j<+(W>ӂc59S(痠Tۚv`Tyo_*(?3irNM>tj_'ZBO݄}[^ӹݫ`ؙkﺾpTYe:dܺM=xO.+Ӵ,鵵x2t q~U`BӬ;uv lmc7̉r3o8[ {'ԝ o9-_щzdBlR8_I.jK ۟qCIW^,*#+[PIpW u^p}5H>_x_Qsn &3ύMw=)tum,dV)ޱ ˼2pu2Oe^I53e6~g=@Pճ io9{%V]204ʨMiCwckl5yER&^Z >'b6k=mϤ">_)T%RPƊ8Ьb?yma+⊹*I$xXUfֻ݀ǛKe΋{LtFO 4o~ˑd{Hlval=JV5~;roϜ~, I۾̼ß ӈsz--wx_{hCu[b'@sόT|PJA˚\Lh IK2ײF)O"\^mؒ&'hXpM̻}aoiOm=fKzI)N>b6M']8 P@Ai݈L.<5bd6+u<.hRu? X}[oCKkyP!0WҌG$=)}}š`c@T]. s2Ķ&,(oGlpwz߿C!xf4vvV-;/2Pg@!/[XCX.3lʢIb>R.4XdmŠp˹dݓ]]dNK$ݝfV [R,Y^,VXvQeYc3˱QZYVFCiB$U"˔*^JՍ je6jvnO5q;3K)0$I:[ݻI}FF8Z3nݭ*-]>awO&iP_W+ sə;Ȼ7s,/}(3Z4f3e*]T4tD_e?~b8TwzC.%U?!WӶPc࣎%Uמ"1WQuÀBuwizݮߖts': 5uNT b+u-,MBbQ FH75|A\B`09c|98F,Uήt[D[ 1c+)3TE;b%&R;HPE_|ړtfJS Li J,iM!(]T\3RߖF؛0>ɉ'Mmx:WT:F4p+*~<1e.o776U5 HTB h.ؽ2oӲצUݹE^73 ?޿ㅍ=߂z ,m1O xwfݤ[4XV܀uk~#, Ο I Ko2Yk{ٽ5!O[ _3+{y@U[$)}T"˓3yܓEƺzVD<$ Qzjr+RсRRG%IPd:'4#9u*D L U{&U*%V*4WIJ 8m5fQΌȤ vzI3s"1Ȭ| -di@kSؠDK[V d_*_f+̬,ȯ^yyWY4elkKCRYkKVHVvF*Ac@tȤ@cuorst7z8eVxMMXH^?hk؊w*dr9 r\Od8S =Y^+8 {GS &) O!gՁNS"xh! &VI[@H K_nyCfmdޘѤ{i_DEJX- %Ѩd6j;$CT즳'jw/+;07cP?C9b6M H) = n֤޼ RUL۹b$>ֽ/V7v=ڡ%,AυOjЋ@JMTeƽ\#Ǚ6״Ӯ8^gL$;ٶ a[?~,0e>Hnq3n^aVt/Jv|r3HA gi]ΚO|0L DUXU_ |P/F{@hr :N3d1$ҬPJRļ )8BpERNVT1|zx9U|'fo'v{ e%GJiI-Ѩr[]07o{l ӨvGϛC~~@;tCO]nFqMȒإCVRg}WFg]Tf}W0*y󅷁 _//ioC![60!B_B!܆B!~VBQ$]1t(kSV.zvVĚAk<{t&K< u@%jTS{Жji&Bh,[i(kVftNTG2g`- _#mR=5P !~܆UQ:nֆ:,*/Ύz4HG?C5܆B!|ol)+y|GY >=4~fNq?8oCUOOk_Wjiی2@(.*%Q?-@Q %۔VƉ[![6~8F+D9+M~;]R|(!0!Q7sFY pC')eKsHB/|.Ii9^Γo?ro* En֘9@rTɅSBƮcnji\)/ ˈnMhFn}۝E79# vw{nKj`]t~NjKM 4i~xvom|ăQF *ä{WVD[yROu~n}inoFƭ^dZKpdO(M/| hlT !rǯA5j= _?lk (qeɥ(JZ%?KaykkkIӃ% &;j̚=;; Χs@nn[UlTr.B={-&d9\`iii0IV-ZwRk+t֯ {TsF:kמIA]CdߺCZzwv+z}7<[.,W8|H@sdg FgTt)YUfj ^?@H\ܨoRֹ7nGY_Qpn"LO:svC]CHC.^ !4[9wjQv3 @78Kx`^{OwRũ;]7o֯uɴ'kUOղdQ  K&ξnaF]xvii_sҭ2Poڿ++2Z3ڄDP"FTgYg xo!>BC 7kR8Qti&Zo @zXdUweW&<2=ϳ?gߩ9{yu~`[8ub[Fkٹ<>S}-_ޝ,ܼ}< uwH3_)@/|bI!]K[ة+[ EƎY::$ueimN 8;uD&¼dž={@yS'tQ^(9gKFVZ8x)wUuQ 'rL7#ٍ1iqSuzNI7sWX$r;IHPua}1b oPQǶ[7xY*W- Բgf@jvZ D)$!O]]!yhqt٫U|&.\ , ݏb ERp y}AB .*Z)$X3t)I2Lg؏ o$V_|dAj2s K%],]iVXMZUEQZ^[4=ۆY0|3&ZAv&/Qu.& `5.jRI?\7B迕۪ۭaGvLKe߹497p ׸_ǣO_=>d{ahP) ~9}js)7#3vcXQ-Z9e~'.$=j^+͵CfB&NZ}ew%bRz͛H n :}nv@9 Z|N[5ꙮbܴu [:{i5{?+v9ĕH5O6W-7dƗp?_}rS+xB!_m@fS MTǎ׼Y/'LK,{ =|FxT|, <Uϝ4[C{Dyn +ɧ|u֕KŵƦVu 1ixVMZuaEF;ݺs`Rƒ|Ht ~OT)q@![[;[H~+Y,.V~RXo% Bp‰Z]\gw:r܆H$J@_D+bN9qKa8+q\gp9VDŅEX vnC/닢MGݸeUٸC7\ݻaV ۑGOj~loC?C"cKeFyOT|#k$##㟒e1JTmoꓳ/ql;6^xv#WcMnFG={#A#/SǗ2I?cd7dm}C Hξ޻UV/%+Y;$̦?Cġ'?=N |~p/oOG<6憁'*k$ڎg|OQ zhL\9y#̌u^mol&iҔͷ^lv,`"mG:.PG Eq/iyۙO۵:"w[hэu"OR y;Q+-u~Rnkt?ɳxwּKn'?^z+ IDATJŏ,rGCsOfVr?3Tm:/I2ncր[h#N ߃giٜZ"P6%+~[4aޣ.:$TԜq~qSt F ]΋{{3WN2}Ǝ\tŸq)BTO%ln7OL9M݊1@Kc'b)gj b;r_vƠFf]Rr}i^ I?8tK`\Od3ξKBgfу?|Ido[*K5o0Wɾ =0͍͜կI*8BF:F'Z1ֹ}K+0/bڌ1C7SZ޴|an~E &zK'jaMs8.Q=9],T9Qly!Vh֚0p׬[ s{p4$Av~F¼B`RqaBn4åbߩ%rcCwXpf`V;ƴG)uNHdum"`F(z͒ Kjnݻ(R~7]T"Ri ݺ4 K8JKYz/DB+S EDl %Ip&<$huub{eu .+Eix>@pkKW-m }8wXSIO*%@Boҋ(*ko+**WQW *.PRJ $H)$ADDܙ;sgn33g:.@EOG0PRDQ2Yu zN֮py%U5ůc=O1ZK{D$B3-<#5n ]ri5{1دoDTgmQJ*)84`+,~x= c(}(RL&;/3h ==\Vбoɭ٤à_Fc!O7]@Cɽ{3{mN\FZx'dA7,)ڼw/^_kwV`Tniq{=2jmem1ܜQ_ԉuIO]].nh8OE-JZ:"gRUĘ 4tҎPOnm3=6L,WBgOhj(gĶV2L^ xBy|1/I} h b _/ R͖0'wԢ̬iTQ'&il4 d8e`S}E?Te@ ǷoUpe9; UY ЛmoUy]DޯXL|}QZzxo݃k`⢣5WuxVi1ƏjRY}OJC1/~fuu| Jk; z;o^= .6/{|OB ^jX էo`-nF(̻kBě&VD>UË(\2WUi}ӭܱjjo^R%-W@2 ӓKEF]z3 b6SjV &>X9JgOl_#*ZY'ҥfp+i%DcuU$?yJFJM5y-SySx_w[}+Zhx/֟b"'0FLO+'iܸXY@Q.Myq*XW nCQqՓ{vaPijef,n7کWCʷ=k|eN}2쎈 S/RWN ˬ=.zxH1~8Y}e.g$J{ThF+3" WpdΩDp@a5|Ş89Uy&*Xgh#]u%MK峬;z^یX1w%^FCgu1F sy<0VCUQW#V2C!$IX8tqj:c'do V2K &ʨk6Tnm+)rA" =T]tՕ ,{Oq_FNHۼ#&*6s o)QpԩiNwmWs?*nX2PYQQ~EܒJV">lOjṱeybvpeA27O =chxU̔{u[`O SCC֜\Plc6ZiAP1mW͔M**Ǖ~xB5Zy`_7A`R =) ' UWPt٥vJwõN-h٥tn⦩24 g@g7z/o7pΒW͞=ƒ*,gяxF̄ v`.B?sL]pJO}&VNoqSgI뫊 bznn?>FT魍h{a;3Z[ 믬]9nUhdRiAϪ1qsMmb$ÑK;3PH 4[\?ˡ& Oˎ]nv SVJlh@K]aMnDg/v"h)|D?/OSkvl)0ge3*p*3\<yMFZ!"t/U~%Elq)1{/8{ˍzU" NGփUdi"VͿ% цa|y 2MVݣ T6+xv+ιD)nA Ktu]Bi2S.Y]' U7ƊAx?tw[ȍi^=Fo_H:qˎ^'<t _\b63Kuoz[}cT.Xq e~*Na 'mu =f+Eo@*ٹ:/bˉH!ķz+bn=H~'dsifw롴jw|ezǵB$wy/8=?o@ |@|f#W@4Ұ)-Cq;$fLУ)LTŹ#-e.]u`FJg=_@{S@~yի]AY}0r`#bbN #c6]NsEʡ9@<@Q,nĕc@ݣyUT&q̭ۿI_(nMJ1D3R =!InYMs]^2H s To_T&,|\T4똍YBQ]L7 d)15VUbkŃTUdՌ@tK{z@ _۸CVWy\\Kh'ؐ +xqLhj~Zb^BENI7(U}hkNpj_sȥw#`Ei>6V/!W(}E#>9 n1#LMG@U~1tŶKG<+cQX_}vOlI9s@ %\w.>68oqgz>Ǒ 78! ?h]6"ymbvլ^ D-@ӫ٢E M4iذ?fC A͘=j g YN;BN^GQz*v ~?4ـ`ߏ_cߜld$2eBhġ=PQ l=4w-;4zp;>֨u_X˗Ƨ444$**jРA{'SSӍ7|n<nnio˪N=:[3&kOE}4Mntr V&@شԭ7yPŌLʾ2q$~B~Y]Eu|NIBNEura5bkʚ#Z~n O((('bTULL jm4 2eʔ f޼y,G6fe ր@czɋ+<З-fa'5P& 8$/._ $?e쭧:ζo˪P"H!ss} d"""rrr$7nuBϞ=*+>k100ppWUUuBBb5o޼޽}AAAt:MaEG5667NQrwʕ+|}ZI999VV]mֹ'$$<))ʨQ#edo9s{ARԊ}S 0`@I^\~V/#x|Ŗ:t(Bil=y,,,L,}6IB /_] pXCCFӧ-h̘1r999 V <|>߉: v)X`04H${yܴa~wbo2DbdFC2K$ݤlYROSGs|PԚmoDxٳRRRsb+I/q^${φ=}^N9܆,.]򳏞fIS#݆@xnxT_x׫W1B$&&Z[[USÌr{uqqIBBBMMMTTTu5Ժ:Hmhh@&6===99b'%%۷u.o߾t:J,kjjz-ٻyZozP]T% 333555[_TTJeX EJJJS{yyy,[___YYń &22* :_RR\XX$$B`0"#jkн'O''O}¼ ٭[:6Q]/LVI0ƱIIx6lIꆆZkX;}jVqA9&w}uwX˘LŶtL(h4EEVi9())֪V 1ʻ~"iiiqqqX\W׬K|L@pptbX Gv BI5JjR(YYY99ԩSN925E,++_lYaaAyyyFFf zMh2IבֿL}}"No t:5\#N޲ң'mllRm:L/ HJ!3QIUp68Z'Tg͝7O_VjJrY O5MLZb#lQjQ$H6vɆDXLG+õv.jm 8NRNR[i{[ntHd ө…_R"( @GGGOO JDb3Ds} J$Yvnn"V5 &rB(d698mD|Nɸio?tˁ>_8 k]F5޷xnqkOߑl?в72)6)5%QmDy0zR]aUUU**5O׵&TU$L& h4Vbjf۷W/7o޴٫Z~_v*H)ohh`9:::Y2,--uEURRuEuu]MMMX,]$55LUU*iGwmW`OD"//o,z>>"Jm{m_<]ޓw@!d MuH&cjk1\Wx|#78.+w\[QPPЮ~rpohRo)S,Xп|sު*mkiٷqDQQdzftt̒%q8dX\\\mjjZ]]Ժ͛7SLyyymRJl}vё't$**qDcccqq\^fyEEE5/AKKKOO/??۫P(l-C<gjjZXXԱӇlnn./n Lfj['OΛ7L&w)S,M%t[ c/C&MqYVc̏sjd]QަB Dkxe 'V%͢lAik>}:rAX$<''G }V2,۫YPPWVTXXĉ܄BAzzJ4IRR2dqc%]鶁 <'TWo߾#MjGSSc)))qΝNtD=vpC{~ Vn`=i9lcDnp7Uyc&I_Ni׉.ςz@ =kʿ~d"Y0x"<֟6RFԺ?~GN?Q5#?JJofC'S/uܸׯעF ?Or9U/o2j3.n-A, H4wiuTKUL|-[/mo!n:B/{|#>ϋ>Uף8ptFI~mjjmL<}S"#*+?S-U s4@ Dm2dںLֶcRXGnp\Vs#Lyg!$~lq˄@ c,Wm!J7i˺b g~\FWۨf=fPWԺ0^Lt " \g6RUTf@ 6sroy{WS/lwY{}MT&q̭ۿR@fkk6|Ҥ F$nlȑa2oaEzZXX8֭[]P#=%H6E_xwӞKgиNJydj8<:GE pu@ ~V-Zqڵ`|,GEG`Լx;3}43338vfffXXH$M"xz ;!= h+7h {UO0P8˾/u-|(>@ aff㍌23~{yyC~⥲ںׯ_ xNѣV?'nکy 2uU|@H_S$hYN'׉e b*>S.i(Oaԉń@ [cc㚚&yԱŋ,,,\nllKpǏ[ZZ镖=zJyĉXmr9t#99Dw A׮]++9s0=~X_~K.QRRbq<^'¢}@ '511YtyX,į(,,ԔӧYY'Ob xyrq]ǙSxC ]g vlpwgx\>In7KU'8~|fdt !_˗.^@ N<{/9H$ٳN޸qӁ,ߒpǏpᢆsH w~ǎ={R(6ٍ;f~ zz[n YfL;;;P(6m[~CyyA[1mttkJKK׭[o9::v\`B2x'N`omd[O}cj'<`i{Zp]q}+ :-q{S|92_w]vDwt 'Ov횻{LLt|#FB* `Ν5 fH6zW^||||Ϟ=&;*z899|288E|r蚚Ns/..޿Y.'OuKL8!>>>!!eCd1+Lnj.j3@ H}wva嶳@IrjNJTG"]@ o43m-Ӈ;n-*'#ڄۘxNCm@ oHcc{\Yvju*]Y@ G,zL&s b!͛g``w^^cnnާO7n1u[6L ,VҭݜԬ/=L[r3Qz1FR[.Va@4p^Z2WiN\zu '7>W&t eeԮ c8-033 FFFY)$_CX,vРANNN'OD{&d2E@ GѨ  R I vPm}8(dlL^ͪðj1 GZbO]JCյ}q!/C :[cc㚚7Hq㺧;qdbb… mmp,_&I2cƌS`.|<U%>}*D\NoV@$KIme@ @۷'Op8prE̙yTMM@*EEp8iӦm߾mÆMMM5tnnܹs)JKF7nܸqd|[:?99yذ6m\fMEE۰a#D:|o`d8 :T[[<3ʪ޽ ϝ󑒒Z`7i $ۚ%Կ"YVzH~G1c j2X`7N#5DӖ4| 5 c\HG6_aIrr׮]sww]__'22R_\\ vvv˖`0ܹsW^122;v̫WwР`ر=7nb;z/I޽{1556Dwb-`0n޼%o>A\.RRRLMM LLLRSS9D[*?U^NIkD5h։2ƒ3VN )ZdH +nmÈBC38+%*ˡ"= 4gϞo߮3448tPmmm88`0>rrr455% %&PoZWqqfO:.rJJJ CRRR3f JKL,`R H[i`0n*Ym^q{6 xsr yh_.IlwYR∳7j C^|9:_T2 t"%H}ό IDAT@$NEDDihhh͞X`>옎ŭGjcP{!\.744t̙9ͮvĒ!pnaF<٥]~*r{`i{ZHӒoMA|?(0->Daƍ666#G<|L@x=I7ͧ(**222˦B___B":-ZSOO?%% JaX[[ǿNKK SWW`0o޼266IKKk_sSjcѦs]4][[;5 FOHHh}Lyyytt̺u66666[lgC x"Pi?naa1qD--MgϟvA=p@,d2/^nݺqJedd.1cF~~>mmmjժ1cZgˆ6F oťKH$^VV<:uj޼nnHtzuJJgBB7.] 333iI~]غu[vvvNN… h4ڱcǾ) A_ϜQ-D%␐7ndhrrrri_?D;'kDٳ~]Y/8 <]v} bp8~~~E oݺ]UUj @ ~!.]A |/H+k˜1c\i4znnjkb'O^Ŷ+߆@ v9w,pgΜn}:cgϞ?x`SZ*߱cǽ? "-=hO@ {@ m@ @ nC @~@qA K"UPzVC zJ"&ȑa2o@uMXxrrro߾rZX5Drs[uY5*^7W5la' j>V@iS[]3pgv#yn%1Mbt#rW&M0~m"9 rw_;{jjj U`Y!!!|SL344,..ymGy<^@>oX~ SLiYQQqYI3Sm݂=}(2`دMX @Tf1=?zmmm^޿UĉPu+ bc^x_{@ HJJǬjj*'mql˺=Nn]EQ =\cllg̘sss7322Zd@ ,(?~5t+\-Z,3a03g>|h„ &;v, zx햌f͚e``fs^{{T8յO eee&v-H$;o},#\P( []G":' |>N䥥%--r?sD"ijjƊD􌦦&MMMɮ, j-=zD'Oѣm>i#@ ~L ZNU˼ӹZ~c˜{jT'w|&󡻇|V3|qU$f7 ( i?u)US\VZŅ72ڤJZqzC   曙d 22-5kV;8DGǔz'g"ҡr%酅}V&L0~8555")))I?PϢ"V\\, uuu % Fuu7jzK\uu|FFhQ">(?もIƎNȦ+*RO&++Zbc+..QVVhݾ|~AK$xp1޼Il74t.?{>~p.H,(bI+v$&v%*֟F *(7Gk.ѯ/333tuu^86% %FıرͶ<^aII)q@! ~yoGqel꿙»;iפؓ{K)B=t<oҥ55,C$.x9@nn. 4ZO'lٲ5==]*kg4C+Wf2<{UTNNNۻ?G vCmZy_ LU=BXXXx D5JpAU*ml}3N,k7ߌ#~LY}Io"Үs7\6^$BaggwjZ!*))|2___mzlllϞ[J T\\fgܻw #WK;;;ZM\sssϞ;::bF41O{^ ollpoqBP({|E"bښnPTj4mRVVm;?Gɚ^::: e VW'TrڎKҀ d2]  MMM_xbTTvJ&===T*\ˢ4l6{.^عsgSSӷQ9Cԩr#o-h{,lrM w1 Hkײ(bϱrt`C -,Da:zd///p8&ouL{pppܹsll\[ti [[[;88r[vﱦ&%%e)NNǏ'¬\bDR__7?DPTԉ#Gs1U<d2[Dk=[NNyyGZhѸqbck[4<cL&sڴiݻw/++k%Z>y򄅅ysCBiWݸqsasԩ͞={) eٳg&n1<>6,lg=fffK~K̚5 ׯ>J uؿw۰98tҲS 7F^$2-,1 IUzb#VO 7.G!)pS[[챚l}rg6mZ ?U۱ &mTsi`b%kQQm/yn۶ o007~]{#?jt^yA*lcfu8~O1Fk7H3_˱oee5^C5Kt^yǃBٳ;((ɓڵrdɓDDNJ/vE mkb&jC~RЧUB!qB!¸ !B6B!b dӦA .W^=Ǎgll'NhooO l"44$:«MrqB}l2(JhhCnݺTQnwܹsϮzϮ7F-\VX ܡCAj_8#+0aݻ_5!v}}*?DٳΨBcL&Bộj3!6~ oP(P(0eOi4o|͌׸7???{{ÇDbkkkm˺GBv1bDvTj~~Ostt fooP(=*ܶm@ 9sԩr9]_pqРA uV)JtM)Ǝkoo/߿Rڶ۶mL䘓C~풆]v,\&;w6lArr2annSM2֭[OL:fbwZG2668rO"GGrtt𰵵%P(C g rSS@WW744t,ksttRg_UUh޽{8SܼK.^f_ў^^^>>bD(>}~E?+++RڱcǮ]r8WZZJ$ߩS']]ΡC233/_&ҿr0g}}+W;UNN/j&56 e62N5o4$_$b6 @scc Ö/aƌl99۶mh>>>d2޽ҥKpww722u+؛Z>=}UIIID?p;™L_|zKkSSݻw͚5tqѢl6{ z"|;̙9QQQQQQmMӝ̙y 55G%Kϛ7QΞ?HD~h4ڵ#eeezyyq[n,Xt::.Fnz8} ׏a۷_PZZZٳW 3d2y٧OVVVl?iRRRRRRhhH}6ѣۏ9"<<ҙO䧝t+-M* ~Y8b-6MTr;f~WllիWKˏښXejjêK.\.OHHٳ'{$'hoQ(gΜQT555Dȑ#D&ҥKիg^^^B'Oŭ]H$֭{0{H$mmm_Nuuk8aFCFMr^ a<#"Dw˒m"5g sBy~"M@1~4Iy©Jci,9dQMrB"ޭKxK.eX"v2//ښd=jѢEƍm STy,O!88hy/[0iӦu޽j ]unܹsN̞=`Ԩg&n|<>6,lg^v$Lֳgs焄LW׮]{'P9CdKXqџ4aͮOcWl9Kٴf[5LksƷsݽMJ`XR%jQ6+,?)GFڸvXN1C;4 z6o2pX|)Œ5Xh~mmQL=|nff;=zvڱc:T(&'qqq^^;vϝ;?ĉs޵k' QQ޾|sssG9e䪪[~GzÇ/ׯ-n" srr~ӦMڦ;w=*/_|ŏ񦥥5o9J9,1=====Xs68T/WgϞ)wy6[mmǺpv9**6M!9;;w'dHsKy1rmƪv_sނe+b{מ4foPKV䫴y6z3pǷ}߃e~tΎ-f9b flw J@WWצ78ٖ^mNG1}zs1ePr?)3dO^rGv&RXR^:st73pm[]&k(wӞI_Nfo@Ciqݬ muHбidGxr*E !Oo:3f|-߿Ull,Ҷy&ZAqB!{Og]|}/~<!BZdB!B!kC*@ȦM_8_pQwؿ3B:44k!=zx{{r<0nC!r2nwxʕ+WwԨQXrT*wnݺu֭3g=ITVWW'c܆B!2>4ɓdeeaͣRq&H$>_J毿ƦL*++xH$/HR%%%m1R4##²cG?"n޽*,,!'`ZtU2Kml6ر%%%l6+(((44d-`dd4{ݿz{{i77ss+~H$NNd2 k}ژǫ2/HۣG@iiÇL&_Ϻm޽=ZWW7xBЧO&aFLmرchFFF ݻ|>PѣGPUUՎ>ܹC,xYBݫF) <B ##ԩk" ,YLRT˗h߾ǠA 6X 3|}}}};C?UUU]JRHo?D"++#FB…5hBfffА]k .-Yz1)7pZD%n&x@ ˙pX/:XqqhqT*wΎD">}xW2UFFQK~gll`]_y˗/wk}222tzϞ{yyjW5=utBxGBLjmvC"СCrr <|ޥKg8.9G,KP9|4=A yi4߼N3!vW_ _xQR7++[{kڣGzzzeffJ2DTkNNA^a~B蝓d+WMM!хiGkm?H-B M6\J\[V+Ǔ !Oo:;B[~U8 B۷U44"*;$-K;zo?7鰩$`ŦH4Of`|mi_۞_uÓ !ٳP(vlBDDcE!Q o uDu*JV/J n$l #[иLSw㼪䠮o󛬣ȟK6.9dlۓU8,B  &p!$l^sKQϵPH^aWu5s#1iv-٘i.&+G 41@qfݻNIf-le }L -l;7W#6CJƢs,C!QebcTJmjn+Sڂcv XNYܼB:xZ/ڕ-*lpc3lm]Pw@׹cn)yg͡v0⬃`cB!^+oܱ1.ܛk.8MQPE#h: I>e2+}\]]B54ޟpOB!qBԦMIoZ.\um!%##SȗmPPڵ` #899h``P__ՂBB!;&&&Çxbaa1l!ЧbҤ^^&;;{=555g۷3@O \.744Cj޽{NlٲWLeuuuXl(//צwϏLdee]~]V{yyxbPxrqsC_ cժU+Wd]t600 otY\.wŊT*m9A۷]K"&Ms箒w* +033{ꎎ;v<|T*曱~~~KK={ 1cF{zzBSЧO&aƂӧ緒ظSNQPPуbi3ǣe2YjjZ}}=V2Bmfs$S8;;gff TL|Lԉ'Onqw<HS$Ю pA"0ۡ[h4nxw;Ճ nNyAW+0 25rL&[rS֬Y w$j޼yCׯcq@v 駟4Mrr޽z-rss=4>>!>>iJzzzzz:|Νw<2v/VwMk(j(Qo.;=+񆎷BlՋ.ݗ$ ~Eu7nl׭[bԑ#Ga"Zb!M_@u;›o%0ix6hZ~*ۊ#!X[55&P5<h4Bx7N3fĊB:5ǷZ$ Iws8T~}$moOeklobη:}FӾe|;^H%yyh׾W7;ݍ}~ҥ:y%1/ʎuR"  ڳg78IPvl92r?BNJBsŬx(5Sf!ochR 9MZr\,7l*(krD yAZ+i ;kHdEƜZ]R2KRӨ hPʠȕ)>BO5n{ ;y琶o(SЀRyLՊN9D3&WQt5; /x@5gzl8qhx2!B荢υ%Y*x;NWIH&,{ ,I$?Q0Yfvܹ1:|UABʕ+'N477 fk׮ݶm['ML߿1)JtSNcƌ;v 5'mŴiS===%IbbC~eE4Mcccll{JJ F0\.}NZZZ!_A==߈ݻuM$9s߿SNCC&{ޞD"%''߾}y9rrr|4M[@OJJ '2. jYQ͍d>DD۷SsrrrrrN>]յ?ܷoYYYB@^^|>}zSnn`=.\V@Rw޲ÇH84zrgg)|zFSYYiddfݻj://eKu D"\\\޽IIwv?ѣ86"Ǐ2Req񿏂WTTh&?.ѣxxx$kcbbluuu2/8Ϋ%2 IDAT̙->1kD<l6K("~zvҹo߾_٩XhhhPP(T*(J*C)Gw! /y95MJJJJJ 8p@߾}uu\˶!" q!^(J Ѵ0Qnnްaì*Y,h5+,%%~OifffiDᰉD6UWg{wowvv~0Wm}J&ӽ)6;v;ii!%9\gaa{ޮ X,V߾}RSS BxR TBћ;::hkG&9ݬ,ԩ3F355qvv.((x޶|>²WQQannQ[[ 511izٓgyz{{;992L6[QQ!h411W |~2 >LΝ)S=vv@&l?me &LXWW+ E\\_x񢨨b3<<?2L4ѣ3g\|na]]ZRT*5jRr VUUΞ=D"'|ӦMe2uj_}d={(ʢk׮]CE% @WWעoG;p ->`̚5O ߸qs„ܦMjooxǣxuu .\̗}WFG_QQǛ%TY3ud2׭['O$eeeׯ^t ?wZq¸ O"nC}>v&75MϦmD:9-<h4Zt:̘1+ !>`ߋ\Gpt{K[+b/QPS{")ʮ];-GFP(xB'|.=ENI5bU  &p!q+4aw@h@V^IcSQS4$``e'P䥉 B՞P-llя˧8̱ܳCUujiQ;x&nS.1dĝs"&; e( Cԗ۹#F:Ff̐VXۭ#6lFg6;_8ox?36IRUp0bJ ȹgNfeHWJݲ=Z:kG=3NyTM7:92} 5M?7+]h(cṧ5c6yz=wiT F![l˔dHG}*囯6g|C^QwrǑJ{}6؄CWJ ٟR8B!q۫KS/6mڳXn{3ZVEӳ5: SQ.d.Iͻsm|uغW13zg|;'X[Ph 611W5J ےdkݤ@R-61URZ z<IJ"k$Lqg~T/{;eb4vʦ]cO4eDU J*EȘMZ.\um{n}(/7nJypɄw5mnbWT)b$punyHP_'p-Miy|y!-.Ѭߊ E' Fn^@$ҬY$hw׉eWB)MT]Ա1ac94XZXh7(tA#T BU=Kr2oRɚGr-SȼkťHAa ͭ~_^]GwdeTͷ0 óQ[ŊBe˾߻w_uuG6o"=IUJ6orb`\ʢMZ܉tlxX CЈ1'iv-K0qFӶ((~?fiφ4 ňu'kwHl4}}Y nN&<4~GSC+ϩYݼSY~9o;]v̦]uK43nJQ/Qv25ܽ%E#U4,}MfZ!yXKd ~Bvc^F8OG2)9z fEB!8+Vlr֔9ۤP ?{Dl^jewu7u; \PWjCՙ6xɖLQE-ˉҟ:eo\BTSxrj^qӂ?=`ݹi6lljCe卑+I@?:ngƨY?q}Ķ4QK+'μ'M ""TJnu60墊kWug|`X8n=2s'LOڇ@+y^zyzzd~=99֯_fzEQϟ>v=ظȑ?F 7`Afff|3tkkb]]έ[\-޽*,, :t(HdrSNqfn]TڵkW322[,̝;'>>sNLN^^WZ<СCmll 88H|wG&S_Od\ ћ<MҘ))h,ςomxjX$Ig%,]~9+IuOڿ#Gڵɓ'~~&M?1<UTT>|855ԔFA˗2Fm~=z5j޼yJHHpwo߻wJ5h :_8qyqÏ=ZWW7xX"n~.]h4R円====@b:uZ*ֶ֚::: 4#RoƦg&Lۆn[$+wx% Bɘ1c>\YY_ >k֭[oߑH$DFxQQ'jkk/^,//:IY~MzlebbZTT윔RrrrZكwJJJuuJJJJrvv֮D">mP(qqqjZV p=bփg9;;gff Tdif飐5ſwJT^\:"~ B7,lAXmbYYYz]tO! :tHX؂"ig3EEEo1bPx-RxY7n>|ܹxԉ'ɔ1nCO_]&)_}uhhhCCCVVVee*///<<|ȑSLںuk[z~gkkk9,Q"DE CBB]>+=====YbZZZZZZD@u붶~}Gڃ7}qB}*.^xb O=M.k׮_v6A344P(ڵc27f6^߆>oP(*t:].3VAaii9|0S\\#|.!>${")ʮ];-GFP(XQ@yyyDέ[۷#G ǡY{BS)M#B=0x7sg wE,B7'} h 7F B}q kFJy:o$@?Kr V}@H&>'B!> jacc%~ ?_E^>Ź,d TK3qwL t%$#|5a/ GY24W)517eP_7c*ngL6:qy{I„Sj@=sR?7+CRRUIбVi9k$[+ΗSOlO?X!ѱ:xl{j/zw(-^ڣ.$UnrguNfl?SHgKG; "ԓ,ijawqQ׉?0#oMs3-4Q@SV5\Kx|;=pCoǎd^z]_7f}o<ʌI 68#4oQ͗IKKmjUL̠ &sws;K/a,ܿn7tr ?|>)T{^վ eWVCg׼q+֔U֛Jog:8T妋)3u5J])pJZy^#?9Qf^)GwiT!jg1_W-Uuh/l;S^]Cտm55ʂ6:!oMñn༼ ?mtBD`כ^=ţ}xtT/]ư;]W}4=H!Qtheэ4(PԕWC^bI7>LB"j9}Eѥ͙GOGtGfٔ2Å5]h!0em=$p1ID:azfJ_>#=5F%UM[QiSEEo8kZ!]Kf7ob$77oT*XðUvj,me2YI6E[84pώ]үk6ݣtNL#OIB.2Lv!f9vvv ״oʲ-Y~q=h(О>ݻy56(¨=C£4 !soNKuq!ҹLR^P`rzxe-a#t9M?lyZ>}S*V...޿ݻ N۰a^:v,n;*yg& }O4"v$4y^j5Ֆn1 !(Os]^';OiN(JאVVZZFʭrs=q/)Q߲cgmpҥ=ܳaÆ_nj [7oG0qE֛mN_ ͚}f5շGQe mn??#G5_&--U11&LPWW__߂nqik~SΜ9sM r^޹3gvB5>ݸqeV;t;wyyy-mW8]?kkkyєk?u=v:f#""jkk#""V]]]]]L;)yHE'MP~⳷48{}SѴY =hxRgG*ky/l#[9?_A=x]顩g1!}dDғ;{ZMv,o)Ʌ*ǤZ4eqi2ci_2y%+*]_ݪԿK0ħxmgYX)"7ԩSzܿ!DyR?^z`|׃cFc3'kƍ7nyR4*1oϞ=ܤ'O":::<.+CTca'>=Gm2 !M:c7v)I)EU3m6/`oOg޼Bܤ/n\T*XðUZ>&m۶%&&d !~!::zҤI kjj""ËFFf!Čo[[YYlpl!Ċ+6mڴsNtܸzZӆC_ٳѣGWTfZjշoV]RRhs[```mmksJJJbccu:]YYXt6n*HN~sժծ|RC.fXV"bSG|]]>\u2uU%yU柗g**N~7tr !z|O YzajZV%G9AQ|ɾ,ua:=BCUsEAyӪ:Wgk).LKݡ_ʶCeOw2(n>}S*V...޿ݻ N۰a^:v,Sq 6斕m߾{BBxᇄ9T \WppĉYY'kjj22EEE6:q"KQ__`[DQQf;w\xx$88H*Nz֭EEE(((ƷŅ* sVty^uZ씹;VDYBFT|?ŸcwoZai_KUyQ+K >AKLurJ5ޒڣ%=Uڳ6ßᓦ{>Y~{{}aUUN'i%lR+<$|AA=ξR6W*!OuMc}xx;r36M.R:AGVWWՙ<=/^ʩxW[„~ddٳgΝB@HH^jÂJJJ\zhDRrrrZ\nkSlbNIy>H}p:*B&]7֬3S8iTREޒLr #v%eMye;9U"j9B]Sgn^93&)?J*4@-,B}Y{ToޗղB $Ie]ya/EGGϙ37??n"777!DvvSO=R^^ok`pم L&Z}!yx]GR^q:}g?3m۶ q!J5N jۭ=[>z4CO=O/xݭt K.]tVU !.:]r%T=; 7ۿ]Dypm|gmOxG/v|Bvoj3d]5]3C=?Oĩ}蜪{mPL!̭{>*T#ڶKMw9kK!b؈Aၾ!FzD:-GiN4~iaeWԩӞ={Ξ=k E,Onn~pff?2j5SyVd2u>۵kR٫W_T]՚Ls繾íV^oرٳy uJt~~~m۸d 0t+;ܩ̳!+/ vUW59$udn-x͔^b*=+uic3^vڤ6P=fs^TXJ1[ I)J" !<5""JQ@) x|jUW cռ &/6?u[3Z%$oUXX5_sήr4f Ѵijo8u*56Tݻfkl0p]gΜ>e77S\c7.""<'!{o߾bpdsTm?a2jkk /dr^>nzת{x\;$22uJLǂmO_}ۆɡ]ڪXSx]K{/jv*[u!k[tU=<$[JHkY:w;^zAڴnSe>TѩSQFjZs?";wѣG8b޻{Ǐӧ+Jk7|뺢ASUz1cƌKZ?B޽3bD\PPT*mH3,8w[\BW_ [SKG TZjKOްj*! 2 cN947ۀrprT*2j^uOB]w+W!RRˮxZ*,mk1ކm~o k kO' @Kwmj1O @n rm6@n r 6m @n rm6@n r 6rm @n rm6@n @n 6rm @n rm6m @n 6rm @n r 6m @n 6rm @n r 6m @n 6rmnb+>bHIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/generate-clients/image04.png000066400000000000000000001511351461403617600254070ustar00rootroot00000000000000PNG  IHDRAP}sBITOtEXtSoftwareShutterc IDATxu\l  H `ݭwuzvwb`` H Hұ.l0@wx3EB+Gc2UBUB!!BaC!BB!0!B!p!B3B!f8B!!BaC! nT&B`= ^hX?uqwv8t.%qq f}˟>W$wr$WΎs_W`&$ \n!GmTV3o4-Tw<9I4pPUwZ,^9E&QDE}P ^LY}U hedFݹ|% 8MGNАɤ G]H2j/ "\k=52HJҢo\2ޙ@a?4,eٵzy3e|?PXWXYvR$B}{4r*GGt 5t #>*N:@D6fI%7luɿOr,t0}ol=.fT9wl_B}ńٛJ\~-T¸\9y|ջ QؾSۘ#p͎iJ98 BWqLiI˜ZSc _b9|<:ȇ6;(U!pGQ&6ayTEU)R#+ZC M܇XsOKWv˚woɪWe< 6/c+ eb t{ @G>t6_֘!Yyڷ$WƦM7k̠]5G?K wn]4UQ]znciTJ[Yca*XH;$kxMMuo{vgj &u3VQajwy" п7~-}͗Y|Rh?5 :SY;0={:2r.~ؽҢ[,55Sfш| [4O(H0y'tm1Ty4cq颯v/ED{(5Lttm]Z,n| <‡S3_ιong< !N൥ ?$0VXO[ fRmhSXT%+UPP:zP :La:/j0衅EښzLzXI4xbsfIj]2„c$Bz*M*6|نFAIh6y7*K8/ i4 9vn*O}x-]CgiJ:/ y+&,;%awӊ!5|3l\ҟsŪT`r,h5 4k"Q$" R"űH(XͶfN̏d^k#},5rm)_!.w']-{}&|8𺲎TVŵrX,k(NZwyN$&w7=f\rȪ۶M !~ 1~EުOnK7oR?ג}`́OސeA{ll,U"ms:BOMVO|}xAUD56JIā뙶#9R ϰOWL4%-I$]?qJ=`W' M[e T*c^w!PP5숷 \zl!-^?YU!)Ɋ:vjzօǭ<"1ήߘ?ju߶ hQ6.`魨8P~zP,R@*Q%ddnⲥ9werҮZR%n늤G4R,MvXۙ&>[Ҋ)Fm5͸R145OЍ*+ t-*%Ra]SbYrai'{j~8cv7!пakk~=IeCzn9m)6;vIp݀)ʑz W k1݃zz8va(%[ςV=obj0Y?|ɊS6k͉̮j/1X$OZkM%_v?oOݦݍwl^8]wgCpPQ91uNb~+;|-0}{^ p f 1\lMdNZO҄ܶ_ WĉyxPڛnMhnXFn¢ۜE6?Gz7M7r]!C|--4 UqȻ&k7te1dg$I~䞕COHwlVJQ䖹[]Gf",HqRP,k;Fj B*,Mz7@ @p:EXs+ĤUOO*}Qpp`9;ވo3 Ihp_?vƔLʳӦ/70wDw$'VzWKS,8‘Ns7KKO 7.sǾR) I9ˏv}~[MTKp7\鳩g=;jX VCC:YY]70/*%o 0;} t.Y 2Ǘ՛j W/h*H~"ZaتeK?,gtDK@W3R0Gi|% dw;+i怲H/Y,_<Rc/orխ8Ok5N+H87o吪^]\^g˅be:ҊÞŒ<{ˀ`W`KHQ Цeׅ勗y-MTöohtfyCp/f]Gy׉ ٹ&G[)J =ˋ=:Q$gcvoV[)"g#'Hg:y3Zc,^kyiUjDߛޱ]=&ϛp1;:9OGoۜf}q,IK!~ G.t;az=l_^Ôg糳,uT^cL~>ޟ/st6 >8$Rb^UEy}1(Kx` v1LwfٮÈWD=IC/\ !4[;wnQvS)cNVcɞJ0 _a{߾fU];/,Xxfy PFݾp;[N6*O7?vN>Up cآ /&kkQcR ,Ȩs>P#>]=|=yap3A;^&!e?\;vÆkbFI<lĨ:t&tI|96RJ코Lt.gL{8K+Y ر?(}j4Ic\LXtL٧UѴA+*.gslM5@Vw⥈R.}#u!- v3cR8Ai&Zd4[ JYX@Itm-:1 A {'<2=6ϣ߻g߮jcYpo5ѡڛؘB33U#*c_U*B>y9Bmr5mԹ)'1xum#_p5_d&z/}B*ͻrhU ͸6<ܭlݾ|/#"v==TBƿ.,۷ YIzf:@=3e=n)eu e7Qzo`.RL@Ơ2xbx-gN~, RMAsWX$|+IŇ|QG]YZ/?tU,AB .*j5f%sa dAgD E)}tlq*Gy-%&$Ov_vY4Ԝ;u;nk.'WmS2"z##eAA3[L(w;:{D,˒A'@pkyZ&Z u¹ )*,(@M+җ{b(}vl": n6er,h5 4k"QLdBnHkYY2 G͍]rO@BJ^|]SűccKWR{ wDح<׍uGhi]x"xMUSKJquA[{ />F9Iu̬|pd7 (qjB-Nn{rbnFZdwm o*bnuKRk2ssfMwlD~t u(ҮF2K~ѵTvʜ袦}y^ف8\Ft:t,-=:r슍6lM p_6IOM} y|/8ͣ+Z)$-yZ .ʑUe{WVv5gsubdqR + !/))d^h\Ũ~CSF}Ps*fOk1=ZWUPr!ѲCϽomضWn5ŒkAkwGWVx3\Z/qCh? $|>QLái_j["COTv[_:L2cZx\Lt~} C۩D9t2aODQ`061<}s_ǦcryU7f8 3K$7b mjڎ,J=rOg{UI>TϞ4[ZN>}$BwDB aJ&*K 8uB@uŒsWٹi{aAʃCG}xCRCFxpbm&!D\b0` L>K-nzzzIDx^=VdNJHHE%9q[V^R\H:Qi%e">بj'5qT{OιT ])+(*W~"WWfk?=Y]c }\H¢RzyiJTejhBZ)մU $Cn'7S_?xW ]a[ŻH^w ̊኿}^$6^wj <_p ՀT䒸w^ ݼk㯟mdj?O*22x ]phXOq;8b`T:N VZj*pB%JtDqx9;#yMt48+54$9Q"ϴoUuplO)m=@p/c</[TA\nqIJ~OKELrY#AeA&6q L HΠQ YYRd[NϞp٧.IPћO %I . ( 촋_,`!M;\3IDf-2*>}&Z&MFn޼:CO 9{43j CWsӪQI0}Y5EG!fn H|nL~7@֓{S?]ڿ k WIuw[O٣o¼2M1˺̒^]s"CɀnV&T0ZJ(ʼg&'̆X.v/(7 3'gqؐrW_J)aɶ!#NIT?NImpT3=N/X]_;EedeC/+vRY] N&KOj5~ $|f"MBfe᝼5U((敁y*PnO9A[=ݙ>3_G1  Z=;E莀m!y_Rppյ",A@>880 ʝ>p;s,v;jV]CWD89+%`9{;"f6fL*:w0s{ IeX"eO`ͺI/f_ۆ"Mߘ$8KQ k>j̽:xTi鼸OYerk5j/x2H`y[/W&g@bes*Y(Z<ʩN#ο5sd/0ad_מFT;oisp众i<2jgPQqB)Oe WYd>hP$dUJY<:$ywJpGӦSu7[ޔDioqǻccQsחLn995'4ˏ1*Rjn@0|E }ཿ{W;ʎ;v7?x~ce7wϸKAwbHЯjN['rp:̵QAs|[}$@ ni]xo# vg݈s)A0)ҹc{GusJ_((v=q:nzك͊|zl+ pڝ; /b_? zVYB3JBpA.pI?)}u١`@T]. s2Ķ&,(G6ZBouZݿy_:: Cxid[,wp_dϠB_: 7]ng،E |:mJhnaLۊAsκ+'6mQ:5"/tsY7MIɇ3|jd x\ZԲ*S.HYsߏhʲZM;)d@R%r(HLIRUDPؠV_@j3H[U IJ?+dLDQ>dKWWܔdXZefx?m)514j$#+RKVU Tj5u]rwIvhicjF U5lE299k2t,OGrYXBgqcꔆ'@3``@ө n&Jh <̐abޤMStx?$CH%pNnyCfmdޘѤM{}n_DEJX %Ѩdj;$CTf'j/+;07cP? F9bM SJ)= n[oފFA)_Q*&~\|SA`j.X[[hYA tZ4d{҄Hv i3${e˃'j^uqo҆TzwU2">>Hvݪ63n^aVtʹJv|r3HA ٵiUgPwybW^֒1u+WJ~ ^uCK-dT[̍)7¢4CC"͊Z< I$E̋,7]HtܷjuO'zOZ7#{KVBVFyLooiЋh :Co%Lg?ˏ>*'Lr٬אeG6m!fo{,Iس>Lv`%޿%QJo^N=wBv$x5@s8R|4pv |Iе<J"<<}*]nSEު\PU+α7j\4o@..ci2gu"8jzm\5QIR#S6*3UH$4)) TRMj9B>a!JSlٮ(on%m_dcf ĉR06>϶KKB!p!o!BaC!B? IW ʚoŔˣ^^U*fB?jff~=W=l%jtT5=kh+d|!h,i(kVfutNTGBKOZ@"eR=4P)!oT:ֆ:,*/Ύz$HG?AE5 B>|.oE7ć<{a´O+iO|N,B迁~= ?Zji曌2@(MUJKXjKF9hG_)ୌwBT!)~4.7~toJ -ʾ+02>Khv凋$;I͛TgnZʮJCcu1f?{+nپ(ݡY-j",eӖp#G.|7]<ϯxM팙L{yȂo_*I ?}`i)a%훾:_ϼ׮x hZetF6r+ .4 um:X@)Zx䕊 W愽|si1ji#5kNˠ١Ho!U-ϖ 3 UI1Y,_<6܆/ř>ÂY,=KR1nֲeE֍Z\a?RuתDz#5, @*_  7t`@ƪrحMadYIΨenҠ[~!T@r# CY 0fS6F/V|aʳTSurSC"  r1N\`a30違,Oc)4١͝i/Gv}pb2\Fz!J# Q7(3ukB9E~ rtbqWwC]CHC.\ !4[;wnQvS @7(Kx`^{OqFw:D1ٵ`jYoʨYAUg}%Cg~s\z/zfn%Q7ӅIAoB"(H~tx낌|f@h#ȢL}h歶I8#ֱfkaY՝ifyYUmv% ?5csABAݝu(ҌG@f5g sB@30vV!B)Aʩ: /"E{YZN0~W,7on{he ݯ}W+|۴q#+UcN4^}6jx1=;|0IHvFL8uT݅rO5;#ȂV(ą\EUK!E||qKuQ %I{Ϟ/%] Q7=_1>[QÑX !].~&)y\pd7 EUP^#}7^'zʢO\+j3kAv$*u=z9(w$P]۶|e ӂ{f3UWPG7B/Pu ]5DR%fM-<[]iYuZUEQZa7;ۆY0|3&ZAv&/QvMMjmz౼ n !ϛb`[D eisF_%0Я{z| w= RRڟ9~ RnF ۰٧[v?$רy: ~I$ʎ8YdhGylIQ9hb )& ٩k/jYWAe+nX3ԄRgq6-mWW|&^T)nWt+j4boFm7Zn؉ϕ^h]Bgp@fgA׫ӯE^N Y6p-h@x=i.,xx}X;uݚVUp+8B v[qtQ rj6 Uá60aGƩugg5+~jv>FO{BQ*M?})UNVOg)勑ŵƦVe31ixMZ{3"Ne ڮ0g| Aߧ;;ٔ6A B? kz$_1M6~::uJ={0ՠ-]~rB GeIQ!0!!N,׹M42*H? yЯع3&ս+ҿ\4Ί{9W.j/GδF;SqagybCmo\T|CٴsG;䇣 >Ͱ~P/wG267ǟ(?^)XG0 {ᜂnΜ18JFދV,~kcg@4iW#GN¯#pfLifb݉iyݑO۵:wkh1u"S%MwO+,VJM- [Ǫ IDAT (?ɳxw6]Kn%ĜJ,r{CcgVr@d!2l㡽IBqLqSohy4pavZ4W%|]TZIK_sgGr~ml .=+'>cG].\I8fS VJ*6ex~ĦS}i#b)gj< b;rovƠFf]\r}ޑi' I?ӭwS`\^g3ދBgfуIdo]: 5/p7W]>/?MWpFѤe|ߕKW#hw`#BQrLsg1mFޘ})U!@k<ל8AzhAtrTn{7XKEZrbei ,@v}nƚ #]^PY^v2B*.LȍVυ5;V?Ol~7# 8[9/ -1n90@x7 XGz3ndi2{F[ƓB鏜Qtl9dԝWhuw8Qnz(Y|p$$smw}cV@ T}UE\y9]VNf4ɞ=ٽhCA+Jޱ vԸYd4-54VЧ 7zB-( RoTb!J!\ՌH@n2'6 L[)]^sNQ]@׍5eƁw[D 6P,({oʊA\':;8WjlQ %n- ;}nwZI9ø1VG, BёuiRtǰ/_a}ֈ*F3-?Ik츶kZqpCٮ?'̞cg>ƈ0#n-`f8s_\`Pf83~8v=umǣqF.%@g0П:e}5;bqCJM+Z"76ts~M&w?J@K5-a"Q|1LVGvTѽ]Hpi@;vnKɒ)@D*M5 wa@$KK1a5Yܥ\t>2PQ\dhѝ $ N='uNoԪ9ce"9# Nxe颥MwqM$m6dSہ];=ɩرݳ`]{(Ez'! BH6d?@E((93;oyԤ3I6m_'*˫ Xw/n4t;Co&s>DT .+$%wS] n]Z~.>MP݀0xthxjz^qQFsk[jc(])"&eq0VЬ' 5HdУ\0gdz ,Kz^ /z4mDmΠi#<]xV(Ώ}B4VSӉ^Le3dJo}/\ex#R~hg (ai/rJJ ^\}%13^\"|R:hrQ+1N+(6oCE)o%fsC 3s[Vk$~|\6x%T?Ǘ |;bDcKN+ɦ2Lq$F.\$g75670ȫȩnyqI qIRxR9%v6zk+#1.FZޔA"K 1Sw4^G2S꣗pH8:_\GrkArREB&'ir Y0@\!@"W4f>;ا(/չIE~b^FJO+]_f8,E]g'L{-:!=7@Jw]2W>w1V0:)yU[^1eۊټ@ۖ,PUs=I5UmP@X;J%4풠ъϝg;LeJi?,rHH 痻{_6aL^^ RYԫlբeY\xgD޾֤@ycydn)5./}YY*a޾/B]YLYsv@? ~`sZq mVZ W ʹ9/c^ =G6̟ts)|>F)16Q !.#i5UP+Kx})h*A%d1;xjLsnbYxA1_Q5/f\SSu+Z Pw K!yJ'+̠,x$}g< ijoub3 s+WGU j ur#*{yRxX99OWEv-S9Yz sEtî oeFyz1lߞE_;w)6sRWe K;s;m1 ,urń]o5$URߗ{33бpr9[) #imۚ~l?Rf靌M-pV\gy>],uٮ:9(EiowBA.ݠ:NL{Bdر 29 V֚ObW%hX*$`΢=.(tf=U%U*wӺ'[j7Ghž,(h9[|Ip\щ5C>Dʣqa@Hu\kōv97_M"u|m_:F+3a~:fzA]Y`rT+rNܽu-"Y8-) +}ϊ$97bK^7k~ CCJ//xI`d޿8F `TSL:'ؐVlyX7y^?:!/d>A^r㳧8s'JxK70YAzH!kgҰױE*L lR\'3gP|p)mPҒޕ*@BNstձʜ{ymm[xYNlץ+rѹE4,j6[Q3LD|0kk\`E|!ZAQtiۆ$is=L>RīIMgR;e&5n״0;%^;F i^p;FΟڋA!9MgVϙxyr%s"v͟5}쉝Tw,9gqpIa'W-]cP07דҙ^ZN?FtDIM|{ӎgeA*=O3F@ >ɍ<{>6^Fםhɭš#cέ8hXv |jXPgG {&Egq&qeTI Mk?˂IDHKEee~a5LSωwL9ȱyvӾ}d(X`Þhe^{o\7+ZtjJ #ĥee'GgSyB ƏoQ'у>)yhrtQػ^fVE5tOǹPVLjх4|fD@4&Yo:??1혅"ZwӴ\Qq 4%U/yY%[~pI\^IZtg?(SjQ<̔L\뢈WÛ܀[,!H* @P.!H`bQx51r$TcQo5 2تtQGG:REڵEg^9wOoD]G 3yO+/i6,^NԨF0 hMZ!&H?ZaJ؆4fsAdqh/kae"\,R0Mj,Qi%d[r}T*Lu+-U LT*7] 0*PLR,嘯W.rfg ޙBλ_wEh۷_-gjj `|M phHr䆓055E5U}+pbTR[nffۏܮ#ŏo?4i ѩ q/2ͿO,=|?™ PE{98o)rI_v#'Jq'C2bz{qJQo,#.>m9 "Uʫ-,4iEwo/3[<=GD3tpsRAn4RCƊ@4Nvv*4\Hϴ/pc=pd1eR&J\R ϾGǻE]ZSܫR(!7L8njtBRVTweV']!E.}yq=7&zdoNzHQޣN3Fe8\XܽLg[ NSG[jgz 0iX@>=+? Ih!5`kkp⻢5{g3`s4wzݕy2 tyk0|y@ +5p_18COˊJd<p{}?>QUTz@ T@ H!⫃t>|uEeC(gCGiKI(1la}Z cr`ҁڟ<1"CO#FN%}<}2C InVYkT hu<1㕳F|׸>#<(zcK&nfe&ϊ=Xa?/(t'cLy9a ev J[J .#fV)᥅y*@`9 -5ī۷KVlgSCrZl,ǑS<8/Ƒ$H-?]9/|AWb9f!qN"~uQUP:u핚Ŧw陳r~pJW=zjƐ> aqWo=8 Ώ 9,mRR0Q7j$ ]6tf}%\Y&}pJc:ar6wO8zw캖W0.z4 鉃7U HrrTGpl#TL|fFRK<ϱ5[J6a\ϙX(qA셠]kvx`c>^4䌝o>,38tpQC6 d ~ƈ (;RkyFef`̪ Ag6!x5m lN/ϼ%2ZW^0 L!}z脘@^WSuNk7{$ZJ1K. }Yc_~O,UoYz#T@@!1;=;*I*{1ipCj_Qtp_<4vl"SR,G#uS LF?ؼ3kn^uѬ(%'BVEɌzM2_jix(f][9'$MS bN[X9wiY?g$dM)t!̬f ːѐ_4凣(31$f:(ps²_+S_?ҹ~ zZʔ$dX?-Qw܀[J>v1g[O`JmMdYTRZc`TLVOP 80 ʄe)zl(̠wo{H7%U2 m[~46V-Sx1=l)xIph"{ٴ9`YHVeζcǺlLx5t*4:~y ²pv,)T91ҡEccr![T?"x,j”Zڶ^u-(d>™ۣIPtݳnvuq&,ǟq(+o} Wi-;2غ/J-Θ2sd:'_hf-9CaF8 p]MAre4Ӿtn1dPy;x2}C \ 1Mz171㾀yGlGi/4Ab4@iYVjVq,(&_BٱO2} \ Q'v(T rWeǥ$Dz6 L_zGr=6<,AeoWV1ĜKX IDAT %aUm7Ԥ@+ycr{zox Jqzu7quMk&-D!y)ڳ>=?w='= 9ug4h8w] .V*|]AFĽ{-%h~1hUܴaד?h\eyGي6VJ دn¥ x'+dm^ƨS{/܍O+(*>_n`Mk4"-#]\sbdքLtiO97"W|mx-[ Kn>xibz+E +cOy+&Xw9YPH OA/콓 "OlYiԭ0(>'OAJRuNa8E%ٱѲ΃`@$; *Nj\B!EIy_光ϳ^d X55p}'tL7 SϬ@%Nl%YrEtpvN>$'>=akVU!Y4 !'A! $ȑCgso?f&/֦"#R oJ8zYZ~N:ng̡Bj',F2Tt^=.g߷vɽ(Us%/k<*œ2@`Lքi31Ȝ$ wkz93JǪޅ, 1RvKL~Axt~Rv8(:l%(d GHb7iZ5b:W7a[yn6ntNJKKO~t~X٨V+zVܼRY%Ӏ ͊CjdP9(;[Zq 帅)]Q6R_\m*L O?PFPRln^.V02elX4 Td.+߹U#(**! x j Wh` &mॾsNO;: ٣5S[f6PdkH!,۳{NX;]ڦ SvKXw5HvM @@E)~l8)Μƿ 5\1ngywwHrrsr6|ήs:勿ޓ aX.>_B Se)gNsš\~-轼gJ刹{g:FHV]ZA-C۽aPf:p>XޥcdVYSKB%(A2ʨoE7S,;S2(cr|PX:MV#Q Zfg7o޼yݫ2A1+r6z5c9_\9@(iZ&%/G9}l-pJ[TD70g)0oˑ #W}P lZZ< ^ֵ;!AMw ]G]kں*D;uR42q<~2+N4 Ixl?q0bm{u<wSm@1F\W0r=l8lC~4w]ӽ'eXu`8++ ۄq=:ӓ"U4 #e&n)D3S%zt[Zٲ̜|Q}$Z'yCu8VvFΞ2e}*RAi8#HLq;٘hitl-Ju"nljOXr!fw 6 qoRe64(8m% <'`2tF)U5n dMj˶3' M͖ju(,gv3[2|l36sɠvWCjTKoI ׆ODS sͭ3_'~J'SH-.K3uE=R3.iQ?ގo̷0X<^#Ԫ~TO(/H\0]/MulKyuo䒳ᑋJePbޚ\+ eJT:v :usE:[GQYZ6iϖ)I[N&\wRA?u}W8vHpV~;Hi=W.GhTg{frlQ !HTAo6[ʮ}lk$U\2#OV#0@G*ߖ*y`v\kwWju;g;8N_wo}3=I}ߦD^[lqmΙМT$t@^[zV'P4+e4:'^y2a4CVmgnѱ:S)(/G[ RJuۧ1KgZ a4p8e6'{K)_.r;.x_wO_G3PMVWMEUe$Wb4s]j]g'bgSN$?yZrqUyo֠C977ݑT)UߝD]^.A~')}׳p^Wc n?J):<@# gُAbL޿W)ʳbo>_K}Bͯ,iŬ܇N;F\yD~o흧(-]>Z|4q6*V]UL&5R7>X*@|(>UjfX+t4Rry^X[l23?ߎūe*4"ZܷHuFaa*)ŕ2 B jVCGWS} ʤArx{+7jYΟ(B]@.}2vMHQE@ Т$mmF6akh!h,{"? -aﭪ0~ @ D㴆h}{^xxt ڗ@W ꖙ\z7?x| :֡"@ /Faޅ)Le]DP `jw^w*P:u핚܊M^3g=\)AFݭjEDn?pvF3FvhO<ݼI)#3t¦2j>{Zq4@r ,YJR:T&0Law΃0(yoyȣ*0~N:C _?++F28yQ1cƎjHoC/3 zZݭfmvϤE;L7Ĕ(qZ5FȪ#;e~oN K?$a>΅-# R.M`ܰ+vatЉՌ_!ķVRDӫ)()?w߻z)~)zx^[_S/#nUT}زȿq{-s=?w='= 9ugP 1*'QnyUv\zAB4OaWKE q/Vy*:DV[}Z/r5iry\LǘM':}i[#93[!fb@ BFArpG C ([^zRA{&j[?%h5sߺK+Qb |ސ#F;hOBQ pݖO.g\=hHܬ7,.0%/G9i 9B'g8CO,@#;)m魴5O8 F-[0Q@U.IVnX8u)D3S%ztiKX}Fhc8caf<i{E#Æ6nIs5/KJ\ܪmҶ& /?8Ռñ5rd󋥚b3bͶK[Fo.a40:dh6qR9SFɎirHo5svԽv[?]LG*: @Ɓ@>vs OĎ96Yu]!#O-z4"5ryv‘Ż~'N .rCw b ?ʯo|( 3Jvcx  e[Q.i^[:uiIik|%\VQosZcrkM9oFKڪ0[RkyJl}EE _iދY]&OPz<[C5lmΕ}'c ;O,2r= Z@ G GbN ڷV25gʭweNhaU.^>c<k8'lלo ]})o>J.|GtbkJ /rp u3b1eyaw%+H ]8| ۖ*CV@WtKpv $0R=hb[GQYl%3^7sEr1TiA|rOmq^Ttۘ3bo"q<CfN,p9@L?c㲸>A _3r]*Uv: E/-iT~+͓l",Kxr/] E,Q><{A:k!7O9 iwX $@||u52N>w1~8}ڞ)ϵf]bET閣zu<] WPBrp@ Mȸ A0RM>+XqrBIF.W)-Rzk@gHp@R@||TIvت6^R|ިwosŌgfmH`r>FpߟZZzfm^mYp,5>@  j3콧}g;{Ej ضwo),ީF#<۶=29]C'Ol4fe?QS6 ɁKj;~Ƿ. \c'O8vAwZ~䉓'Oo۔7M['N<zbC*|% mcMy_UQ2ڸ4}54"::h#ǜ݋ZOꞆ4vόWjOVgY=J{EAwCݞοlV ARJK潝(usn $`2n3V9ۭܪtxWd$x+>3V'Γ|[Bg=w8$Sw0QqlԈ $e1sQeo^&a_'Zwc]Y{E9mcMKj8㇡?m·=㇡iA Uz~80i8eEܯ#iEIɂ`" SCʵ)Y[>ًk C[O&eV_YWkk_Ré ^?ھ99$^ Xeazzz"'%rem% . iJQw+lZjQ/]n2bƨގm^Z[2"Cd/gtȯ; =X᷻Nj~dMcNm\ٰqTUNL}-cz;3'Y{N:BF b/]㉔GNhg\WÐSčdX`9 -5ī۷^M3w|{c$ܶì-\vAS^E;>k :RcPgs* ǟڻVs Bv>d5j>{Zq4@r ,U3J"I~%Ŝ]q!'@՝M4b Vl&5@|[PGtv:Ӛ*Ьuve;oyCà%'BVEɌzM2_jixAZTPVZy{N qHX*0?"*j豛4ܖWbp6=/bF5%7iz6c#,ژOK9Ɂo]Rf?CKc fvcGGm_)ihk"umo圐4sO2 fNX6nBsL{ +~ce} IDATz"OO{%svΠy{ċՒG?}*<nC @MrYh?t?;)-r5iry\LǘM':}봢4mǧ.gt^BoC}9_8vӬY槍sWx\bڭ}Ӳ_߿ = 9$&#@N86,-Vۨғݻ"VBͺ{Oe/1=M> &/MBFl3S;EBT `deE%@>r7 ҌjFmTtA#v3g} JLǂM<<,~!@l\NpI\n!11SϹ!oA~"OH{Ǒ>ΩSI9THEIQ 0rKM HȜڭ _Gi31x5.]-H*3_IQUY64@|0Rv?i^Ȱ :{C4KЪzyo+vgu܀g;f<>43h+N\OV,ܝZ^&,\:zNXS 7߯uwwnj+'';'n9bO|(ng_ߐSfcF#U#D$;5K:Jax4x2RB!Zh7ˆ"ǡSCazr=ʫ+8f58dqP)yp,oyjNE(T#W8Tݺk7㏤0#Á:;4K s Ϋp s!A6iSnioly^v%VO9\S!~IϘ TWy: Y5j^t` %f)jC?#yV,zjP#gq挚?m92Q6T $igR#T;|L^*Ili8h3/\~0O}x a>w1v103N4" aaZ뤹Z- 9luǟ}~uog3ܯV57GS:xNeسRͫ8fN6&ZZ6jKf3cŔJզAVM(,tv5Tq))gzH2gڤ-tl:;ק9ͮ2|-^&:<'\w_FzNml--VІjTK&D8)Y8ĬٽD+ң ݺj=/x׳~vf9]נNp56a\3{Tmxp8`)v?N@ 3ohW3ʮS~#rBs7CuiM@Іku*#NJOE?~;D<3ш=LN8xtod qQAzaTDCp19`?Vt:AH2.#fbҮL 'p[< @¸^W)?OVêӣPьyΐ]z 79"ж{ l߱>ys*Vlz_)zy.fI̤܂ض'5<+Pag~͂Iwаב/*K<| b͞Vݿ3M rvo N [T|0F+Y%ZנP$F.1^4@̏URsKu¤;bKQk=uoy*Fl*ߠ 7S`mmӼ+;u刯 wmvvN%'ru~ͯWzD27kO3XHLg?x]7̯RˌSۜ]F>2'|3ol.%%ik6tF?\eIGTKC5@|YH\U]vPgJԞG_H3WǏxt7ILV?Seqڽ\Mц%qI aՓD#Ji6gΞ)My ~ hs&^;g(@ Z ȿCU7Z岁EXu?^3FF0k6o{ *oKemҞ qik|]KցCыD@c<@ _\ZU֕SbKt@|o|7p/AgLIgG;c Zx*JeO+c0'c(LX=K6SVh⭉JgbIҢ9N2@ y K6¹7< Fy3.Z cj5G~۲@eܬ)%sN[TGq6c2*+3a?ھKAbyB77K${uJ"O(Lr[v$V)x|F~NG”$.T0d%@ 6ZGU)?$JgSGr[G.H ! U,-*Vw2vާ"KQbPM"CA cr!k|=#JlD/Ŷr,aM^{Yר!&H?L sV*,ټ>RV~}C 2*XemgSkT~}C1g=,/6!|Qypgn?O%>BQ ɲTU!ˋDe$gc7'm]mUj4;ELlwLo VZՂ['/f^S) F䣉؈MQS,v4ל+beæ L;X2g+#ŷo'M;jKdT]Oɐ U4 #.Lam-֠'B5!"oc.9oj,Jz_T`qv8)⼤rh[8w6PmBYSZAﴺ" ꪊM MVko%\qIIϴ/ps 8Pg ث;b0 ,<8gv M 8 Z;Xꄤ(t*8@gb^X-` kY1C3 PwsLF3FvhO<]@8P0qPf:Ѿ!M@SKORYVZ^1W8ef lU&^ݾ\$i6dOc=o{>^J]\N*=Y߲F(L{L8!Nc9p9I`v\kzգꎮFj I^x#_2 UiO'Dѻ[J8> ^YwRfkN68!.Ȍ8O>0$y/@!v['xtooJI%gw"3ߌ]▖ٻ&lHڦFdPp0(S)D`Q%2DT~" {o2t7M$ͼ$R|=\>'W?wEU>4QƁ:<6&Tɿdpp+/ .1m"\sYs/wʊkI8#B$.Z$e]j~ۯ\͚gX]e&i̤uמW~6~g#] s oCx qrnnwV7Keb▾עlͲ򬁭FѾ".IxǼKN-.7cIxY_}o)ih' 2ݟ/NؒMCnݢs:Qp#&WSM1?:A5~gߜӭ}x>όhs]B_6~k'DnM|K^8n.(Hzپ*qy5ӈo%"珓Xy>܍o0~(K͛qTehعBJT1w[a늓5K35+:|#C$Z fJ/P&߅OfsEaM\m%겫QL_^Kpoc`+Ӧ+MO:p*[_ˮ-q K98 (ݽ#p[#SuhCDp5Gv==d$i$lS~{ )'rr mg.$3*gѕ 瞿s.yvΥ,iKevDe8VvֶWĄwx\IF<+lVWv~foDׁڍ ?*uQъ|>|}&Jٵ6;}|6v\tDC?/:ODt[^|o¿LD""*zv\%1@Sa&2u^{H&-s>~llJѵ%n|;ڃly'Ȭ<2jވ9@":M]qsӨu~RU%9]L8x"3"j 4JXUPETLX"ʲ,ڈl6w?V~2M)g,I-߉mMzvϲ6"% BC}E]tO}&K4ŕC>@It%lƜwY44@^q95\mC0^vJWߪW֪ 323ˮ1|#o4.ڷV?7E-t-t"x5HjW[ɘܕ'.E7<ʽp/ Pk1WqqM=)؛J2N̖%m>1qY))@Vtb8%"و8p$~}]< $*mi>͕7l>5.:nّw H!aԿן֘8" ﴉkN-Az^»|"I`GD)#טSXcX8E72$ҹ7mG' Щ[V)|uk!_$bÿnJTxz=^լI9F1bn)P֭"w'(""B=AFZ\\ zT(Vb|h~m÷&ml^AP Eu=qbw?cOiN(GLw yVC7NwY6/5 4ҧ3sQeuW+&+Cֿ]T39i`D_9+c6tBC]Ҋ*]7IUʱ5BcIce|oBPDdV6l@T˞Bڼ\5З6"\Wa%tn{e&GK U]CVUN pWg ?nWW>7ڲ|O{þ^\[+} ]=Ŭ^[p̟Q\~0g9-Kyqן/HrcUN㹺ʋ+ ٌ@?&m6nR{ۏ~x9GDQEk1;8} +Sz6v^~hձͩ2ɋԷ"iӬscg}PuK ?kR2P)StE_T_gm Wuc%b>ZQwcgok6mE@6S^@0 DFFߖ͛7;u4Zj'ՂFOl0tG͊wÍ)\pӣ7.F/}y׺(Ow6IcPަ]bkoU;p*>;%.a8k8 ƿ}”s!l  9iƐAhd8Sw &Eek&*1Mr-{zFxW\.C?5YZ'SY9N7F[^*ښ:ש-GrigSY?~V}~1a͐ P2KٙɓxtWR%޼ڲR:"_{Du!P=R-E}#<+)c>RۜzAEB|"{Y?GS 7V*\yg-7F:@ty`^!]jͰo6ei[WD0np|q[1DI\ S< .49roQU)WnwƒPP0sVyy-XMd8t u!Y&aL\?}rm(4hN(Q\]zyb.~~S6^Yb`vWVnYJUF^URQBy|5GuGX+0L/?+I:fu 6̹J+:3nvsՎZpS55 ;*qλǕ Yd֌RZ~qw:K{EK Os2BruJŁZӏ ٹ#9 +I~Ӽ$lol骴{4$ww"SECj JVc=_#\AV=M۟<bs۽۷>;+*ێ .wKDʑ[ro퍛Hʣ(0Æ5sxD1|NE>9kKY\m+>lE#-} #]A:tSZD{X"qNl2lǨtmf|U \Mm$=.Q۱#&~䁛2{"r\YL K{-u}g]kʧc*f*g.!Aާ> 5qj5չhkMj';/6vU.r ?G\m<݂6IRAYa䚉}Hf^p|=x}vVLS hHnJf&;683{|p {oN{WRReT[Sy~ÁS~ʜrt'k0]/˩U#ЪIf+Z ù٨IrZ^1ie嫄.?X?89~1OToӓ݄&g|l\>kGzeB ZԞ&ݴygcG/4~q/I?vrS)3)pDD"P(zdٌVQPEyDD.ϵo>: :4|uEr-/tF;sXQZwޤy}u";\)7|GmO+#"Xqך|昪T{8Ⲧ /a9WEp$|q] qQ* cgM%n<}ȓ|s߸~3 ?%{/{z2/}KWW1 m[kN&KUjJXuT(aګK}ܹ}cw=~ZL*]5gly[ck:vٞ22xjRkOíX*"?{$T4ӍW xWݜj#Sx{=?D p pp pp Wk8]=<]<)j}2;q7/ܷ2#;RsC%3yMW)_?eNR/Ϧ>~åWaPȲ,:3FF'n>lw;(/G wCNxu8k;mM_p|OHDwdߙ ^o;S[Hnpw3"S문EN62Z<.6]^Җ 9"|g\rIx&""H60 ƘybGJDaϞk?sy>|nm#*bZ;!ݱc*n/>K}?p˷~OA'|9N8锺52WHS'%iRf>ZuW׉ٲ=9ΠNqȈ_U7mڳŨQCfXЗFxv K?=fq/L!,?l +/1]u6P]&;nVt̽+NʣJ:D.TV[pT#"h|މ ?% k71F633?5qIK?xa,[yYfrzy#ēw,52s\~)yeyx]nk-6rB+OR8G2LRoªW5]*`{ܮ˹_/o og x~o͙ͫVnJף2ci_4uP`{-AQ^y348KUbCRհa?&߸гϠKor0GʪƷ B179~0N983xcfwf=HDDĚ(뮃g}ڌ!CCD ߽;߶VQ -nRLD^c7,^z:1Sw !bN}{uEHŜEU.4'H(%7uIkKGQn_{ʂbb͚#:+]l{FuӋ,wng]Jfoލ (}+[ǿsKgT"TjQ #DFFߖ͛7;u#\fx"ݵ%%; jLB K)mf2ՂFd' @d8@x{Rr82 22ܓF2ox~D5_x3Ғ$d.Wf޼S:)c;#4HRl ydu;Ñw^,WH|p>%VDD:x8Iw5\YCɷI.h:-x>uS.|lk+O&G q[#,KzFItׁGJX8UG~Xg 0w䗶{wqǜ/+֫3jR\EvdڈDI;, 0cgt= 'qe!t_U7mڳŨQCf,] N :w -FoV/_,ټ`\FaUկlQ3[Wٻ/2 N'/l;+ߘme uҐ͓f챻+;md[OYq Xj9Ϸmz1d.QLPGo"9ےC:mŜʰFO9cLOEYZXt|fIrVUrD1o;d8}3FK~^vڵ&ĺ]aY풦 i劝$UqIanV2:O&7kxl&]"rUբSwL|)*cjyqA{ndQP';<|7y3"ed mY0lzzηl -2?sν[#t(6!ȕ2bۍ}Z W .,+ȤPƮ8)ebzVun32Dd.6R 'U+;(TYhJ7iZzzw*8`|^weXWP\7Y[.2pC|<ߥo DD󯯪ͿE ؤ) fM!bHWj<"ʯ㸬m_3lx/N ~]o\4y7%"2Wd OCd5lf؏7T0⦊ Z$X!,JNaU8lNacO2ϜsOؔKm]J¸Y KEQ׊b.2V6"1 Oq,~߷No˫$-G( :|1tpCD$"" +ޝhD@\{encdk*J!֍RM̲ww5e)CD/42=4cҀ/6D. 2"{חsr4qx/"{7?4Sߠ~9W48e^iT(t=\sx9 $2%j>:?؈]rg;|;QW\.:pt_K~9s,;n'#z%MYc\6V،zMrXS~ndp sJ"d,٠tcKgrV?kC?̲ىCMf@N6g65C|xsԧoIwxL nm0ȓIC""HxdvgNyFb3^=97N:YomE9{:) UkYe ܏=@bYkXۡ_4|3qa>)pueUnqܑjA#S .^d 8 Md7krSo=9WeV8'c^an<42 22 22 =.gH >m@{IDAT: Y/nj;nɢ L~Jh=rHe@SS6(2GDB5C*ps|ɜvQR/洋/= GDKp ᯭbٌLaTdK8TDW&M a^!^R,7yߺ*#r{~1MtyI.^He`|zrErW1:sφ93vdwo3?)c\:jZ"yƼ52K@oݬ)6jBue<& Nolܐ>]>g˂IX|cӵnVo݂bݻYS$b+2x" qlkM˰λ'o-_4ei N&_,ټ`\FaUW.yd4^ l+KX. 3bB&C[5D NϞm8[^ݯՐE.8|QEˁ Fx rpժdrc'=2H=tѹH8n l7rĄx϶HC"|6Oqoq/{L4̎^eXeYf%@)gQ5տE&K sJWlMQoێ8""--֖팩Nt}Q5Ʋ,V9#s/=rҋuU{"8XXs5&7/]Ҕ$\Sա24ˋ sv'bZj_+qT^ڥa8!" 8"zQĚWX0wcv_/ihG- -2?Sd o#+e.v*1\ɾ 8Znᷓ6R\`+6VQR1@~խr] teekdfaS_G̷fGDn&CBbJBzaS.6zmw䗗>oGT^\* TnE"Wt&NPͻs$mHy;$xXKWJ%+WO6'D/f8"J/d̽LDKv,QBD}^N/C۴Ezz!"<]&7ȹʤ{wt! wyHdgp%=FPP4:{sÆ t^\l p]r;F5v@=o1k)#ֹlvqS(ЫYM00QgO/6uz@Pj[5Ap UϘj[9>!{u7koX43ISavZ-h@{h}7_PZrAm}=\l-[}ADNƯǬ/*2.Y#2SM p  p  p  p  p pp pp pp pp p  p  p  p  p  p pp pp pp pp p  p  p  p  p  p pp pp pp pp p  p  p  p  p  p pp pp pp pn&`px8x8<ppx8<ppx8<ppx8<<px8<<px8<߶l>IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/generate-clients/image05.png000066400000000000000000000745631461403617600254210ustar00rootroot00000000000000PNG  IHDR&#_sBITOtEXtSoftwareShutterc IDATxw\%!MPqZQ;VV[g a$@d%Vry'BD"@ 3F@!ϱ B!0r!BaB!BB!0r!BaB!BB!0r!B!\!BB!0rc\6O"p B?Sc.0/.ŬGJ^Qi9LhΪ0>n+Pؠ3>E!п*rcW1`Z:N<<sJ{ؒy~W2tWB!/\Q 3cc⦽\b ~'l ~ARkƁþ1>JWpϥv=PaB7\urQW nS1tmY:rg>0dygW)šU9&ؽv\aR0L=AT/թo<==P㧧6 0tYoWb`OQ?OwS6[kx8;;?n#LLu$4aWᑄBZPq^-V(d:?|rKJo[-w`ݎbXb:fUKa/$v`7[, B &^\Tv#u n,`&}-}hKƖH%zM3~>&o=f<󋡎 H!j%ʎ[{9Nk=ɯs-Z'dU Deyhw K 9JFCqph ,N:/>ߦe0kɇ0u(h#R^މ9=*Z_M{li{m B"?42o؈ # <6^h jL7\ [!y;X<bu=WT\(^DrB"f\{ae{!B7˥51Qbfvn!o" YO.h ˎ,VUy y-<.~v`2^0߼i;f;Ʒi)SciA?px71Bڛrim]fK;ZiZ+7J/{Oຬ{$DdƷu2DШ"'_0>p4݇ALGf ufw x,WkH>WrDZ0mKLQ-_Wy !Bz^.N\3*zW<^vM^*wyAuUG(θ!89STq_{sy<϶ :uڌ_^}Fө^ݣo޶l*g92}c9gx鏟%$!BDD:$)b~~DO Æ(|PA֍Zn3F@!0r0r!BA B!0r!BaB!BB!0r!BaB!BB!0r!B!\!BB!0r!Bz`44NB^.B!\!BB!Pp.?/,bP/oʄ(!п[(7CzatOn=qgT}%Ŵ\B߅D<ʼ騾v;΋?AS墘 (BU)+*"ڿb{ γ'7>|={|؞VZHS#"z6RYUMU9>M&lymǝ+EF3ckg |/ B }r".[̪xe"r,۾O|L c3Oi+{m0%C C<ۅ9d܈RoYdݕ2ѐAaR#kD%׎ehԊ0WcCf|(|~dʼ{r7C!Ek &uپ.ž.#?:=&J>&n gH"5ɲ48bD[[wt_>oBo萡nf$Me_XRMt"IKOfڏnlƢKS7#Z}zʨ S&uپ.浇\@|1 ?ܖE92*ɌOhuQC;.WDzҦی*TA3{;$LiHwo>g-Oneѥy9 5%acFv Z$m9PZ=B'r7(:e,;;W5Thæz{_;ka”ImVԕu(TH>*ʎkŁ'ցQz%kɹC9[rY}P6p9 3̱p節&CCϗ%k:W-q,:ټăClI0mm]2w.RʑJqWPT K]$O l!rz_ZLV>xӃ `*I*sT X-OI.U nO*4?6b)c_VģlEWtr4%r\I+%V _]wEk MzOkF]ZSu 8$ʌU.{\=_hC~2BYNٙZOŝ{m{u=7*;ө'$<`16;д 3P'ڏnhg E^M+ o_bD!@wؤO Yهr1Αڃ+j—Ne_oJknc,);:B^wy2\%92VZ,¶Ӑ&7R; K]u[̆pG]\yig|zᐲ/ެ-o%Vڳ#$&C8u#mߏݯ"D=Q{h!zw^o`rMI7<4bã-̈́vW筣6.?r~mL̴n6_eM2T|فC={m:@{`!l}M%2տفϵpq0%8JYZ)Ř4o 2fw-yKs$pܖ]D/v$-$MkVm/|a{E|>Wp27WO.;qQϏI~a2ȺQ˭"Xڴ4*0EcB! !B !B#B!F.B! !B#B!F.B!Um?mfף>솪&L5ސ7*;9RKYihdyS&m xǶ^ܵuVdl-#k a7sgf:3k ?K~.B#WfVw\ A#X$t1]?\g햧2\Κ~)듳5`xwzımruI7*WaGk__<٥:A#~|)uCgj'*c|LfZy\Qo1tfYLug]=fIy;pa/D3㇬_S:tan2o'm ;Fz?8,}hdYC5doϮW̩(v4ل8qV1VDr̵͠siɸ#=qkO;SjX7\Cn I[ QPM?!`ЎU4^y5&nBɥ J}mE%eU,CD \_a^ݣpNe 'x)+j0/SVvkWTcS͚ys ٱ7vlȕP=|'w>CE,}qɷG~ݛh6@9>kqצz<*(OU@ wTr.v7RCf p@iՕ'W-R#14Wd=¯Nm K'LiFQ\S4W_ׂJph8_o˛Ou% т!Koj}~nju޼# خ9r QQPx@kؿ .V\ìu,cm7C6yר7 ^{7ݛ 'M6oם=t-ij/~\2|& Y>w~['TLcnk/nsTh[M2om'D\WXo?7'{UkGDO}hɡ^*6 Ű ,nKb M&by6l)v:u㓧6XTh7cWtТ}QvAm=1 PSd@"( Xmc\]bR(%uzo3KyZM=^sWՆZ*i5: JG5ށ=ySʞ+zT޾uD*֑!ĵ݉ݻ=}5â`8s~i9m'7@ )/^I|uӐr[ |"v.[}*rs/Vyt  RT85W Ji W(L>~Yg$ I [E 8dPa_$Uũ ێ(fwvE'fUv.!2ncSQa6tiu9%U.3`t[x}k6]=.xg{j= XxBc͒K z3Kw3ogZ-5Ԛ2CAms[8!\1 /ҰIC% RlkGo۩^7ui uI) (I}^K J>uGӲ)g)1g9̩:[uCd5@SUH݋JGFnʫdh1|? -*6s{=L~˱*~Qc]ukNuZP_%h=~=<` B9x+ԚgUZ2"b%-vo(4W뼖MydTn7z3I"]cP1͂M꽮[>&%+y9=]WӲ>Y,[C#_ҕ[/K<"e"]Q@`/ݡ[3;*i:C*E. px C[oe`eB#?M.6VAZ-=_oTEOi"p laՀw?IzwBPWq|Y:qF77rTS {K3Y>;xsM[YMj 0u>0H<dWcHfw%;Eյov>Jei]hfb$<.۴}fFYD"Z#xͷJYV{ǗC~Ȫ&J~6i3__ .mnvD>O̿͜} =׹߂x{~*n xڋ{MgfY[1њRAɫxi5˵EiEGk5A@5.z91j|or-'6zrӟۑ;;p IDAT"ClaFhT9zśWz7ǔ^{Hy:Ǽt|Uܼ>|bdhq̟3yP9fF @Ӹ/}6oU2Px8*j=G~֨푹ضvnyEg/uׯI&le7cq.I޾?Ὸ01/VFe4M̺VXDg/?? !BB!Лo,"BaB!ȅB!0r!BaB!ȅB!*m""Jg3ĸ!? $[6{wsَY B!0rsr$2yR(2M&f B?esMB!Jm,,IH)B!\ Ң_K 社B!cv.+B!CXԵ'r*B!ݗ`۴_`~Ջr :eR!BF@PA5KȂOSN@!!B!"B!F.B!\!BNliԩ/]flBzgVn%3OfA!p`!B# )n17r{ M?f.=헍M_k-;>=w ­_fx"0q3CS#!Ƒ/}$?"slr0o;#* rG CFcx)®[' q)WG)BrQV>QmCݭ-x@U&]J)ޅQrr''5 9(Vp4&<#jS^TUߐ ">-"3xF@!\)y%KPnݵɬz5ܮ(0YJ6o{ѻ?;z ^Ox#5H\ a_Ȭj S=*^c׆>x*̟[ `5 Ek8dē! OjJ`bVϯp-Ϋͥ|m6;ONXaҌ=+G4ɢS;203.MiB=yE zݼL$=\3٫ePBEұ_/O(mQZ>kFE+zK_9;hAL-Z+fskb)}\kmDK%k3{<˯枓l͎kӖ hJf@-4u?{8!mZw O&#gUsHhS+jiW4X3=/\2 z6=CO/LM% jVt*뭋7v`cr AlِkCQzQ@QF^@45KG[nuR:㾾fDpy<.+B"o+_^O!{"8zf>Ժ;/+5-P}ưb`т^YV 5fԢ#SW{OY!2~5J_&N~QT,⟳ pݐ7CԌVvQoT*c:R$ o|Hbǎ6BHZ(++$^<) xׯUhS((<=D⍱I5Br>255˸+h 1,&WZ`qjF*_I)Ϥ?ȠBG:Wo$ƜQHmY;5\u㎔W.6/H0{Uf"WŪ~P?yZ!'r=\H޻V>O]zzz?Q4,tqekzx i}q%wkQNRWzujo*g6fwd)$*NfCZ: " 88,=XObQK3IɺKs'{ySҥݴҪvUL? 7wr|+o)CF#FB딠Br5mג(.S(KP+OsEJxǥt.rjM4Rbv}YmF 67w* N.}ZdLi|n桋2W+YHEoZg>[$qW(ܭUL* G|4 \͊GqԖ1[o !7J&~'8`)F]?& z* <>\y6_Woơ2Xv}昃 {݌~H8k^5[;/X9JzMۧc4tkf}z |;uf?] !"Dzjek7(~pVv?!G?wO2B ^vx0y;|yk׌^{[>L:g®/~\vڊFO[f -Bw}sO#dL G[cĚeVkg^ [m6Tݾ/ H{ɵܱпN}m?e ?XRznּݒJju9]m3f64~fǏ(Y1惞9λkrM~eM*X7eE݅s>\V>:Q"={X0dMFտ@ _#ⓥK2u`u8<%Tṑ;vؖz}ԾR{[1O עp𴇓O+7rg1ޟ]| M]{a5S&,3xB43'utwLeR캤wJEalQ0{fk1u0!W<|sEԴI_sK\(E;W,xq[hITRxwL4Y֥W"YD]v^eq&My^a`o "]z7U0cS~eB765hȢSڵXr򇆘@)=}¶>VByBeҲ{?m.*=1Z CpS.~~:> VlP-(L(g [{V$m d BlM@%kQz@mڣ~> BoTj[JY},o̾ye{²3:x"gF[A[Nz ߫]S)j /#W}[))ZAI-ؕVd"4b)MAU<5W" T@pNlFܻ[Dz]g rޢ.'?(ZxZwDѳlBpJ+]Fn~(⊼|7}ebMDѪ% %j;/ 0Mu;|鬙 cZEl-K(5-d=&6ΕYKYm#yBN;hb9†[T,zT~5YʍfF"ï^zko>-g|E6eWRBv1z%Eឞ<<9֜ԥK0ũ{HfF(ݹLم=|"gX{[9]#U3v)UX0ut[/y1]h'F­`̶Ŕ@y6 AR Yz<捰g9|єOXN=Fϳ3 zU7ljVLIU;69Rua'ΐ+uc jάjϕ-}J;o6K2Ԓ2c]e~iU 6-*WئGG*8Fz@} 'V![koN\?Jɯ ܛN|e]Kh+6;`Si×|V5|a\+wJ׿l`!,;|?uO'˹~#-qpGoͳ~?{lHyo[Au<כ2:K[8_seϽ8`ߏNY2m}kπM@DӾfptz_ vn$(6U ]@*N0%Dsڐv*đxE-ݳv>L8_Y}'^aG]S{+(Bj}eJeTU__ ܓi'W"p=Ӷa-YoPylȀgpX_eA:u01:Gٙ $Mq; n e'_1>v>ݽT/~<VyR` dþ6q_(9t-sE%ujϯzt-I9r-,2d2-ؘ(m{wr@knaFPcӣ.ޭNE~\+Дcd ]MɘZ./E,(u1uwve滬SFd׮n1&uVطbW2 @ŔH*Gkd<~CNie1=#x쌿b5eӷ4J5%kW7Z_.WiݤUTUenA%^F9v-jck?  ؁ -j>ʠL lHCL)#(wߵ57ʽw^z5]%R^z>}LJ z^z%-<*s儶OK$ֲ([A|`bk؂-z6fCFgņ EӊGS:`ljdvrYOD.naO5ҔWD.d+^{<{]U/)r9 r!66z:w$ ~yzVEsfWO](彧YF\xCCviI. PKx<j:lWhO!&O5/,q|y Ӽ*oyNj϶=hrM )i>9::*yio\ǪW=VJ j?5?h7>@MF 8YMԞlBX~.yVbc΂׏\WG{詅wyPPQzKh׿:)(5Fsc~n0M.P!rvU\ȬI̼|HąB^~咐tz2czЙD~w^R˂Z#W]f-7H؛SivpnkFz$|xG*}QmR%E'i}I֓ գE\-/;*. =w7EQQs'5p%^]ye}03Uwᛚ\ZxZ[X+3 ,MMoКrp2ێSy_Ze"n9{pݵ9+ Fmt=-5mdd>6Ԗ*Б;~ۂUu4φ79q]#t-KizR1yV?{Nly]{*ɫ|@(6it Nnk^0K8i{ Y2՟)TҌӬZ*rtj.+`wY>e}4W%G!N΃Zz XLssc aԲ_ki\]- Ee6Βl+~n\sz^ԕӦAVlWa!(@#lVJ*3z3|!T6Q'4y!Tm,KS^ FĒ&xɽ:i~Dz8A:y7p5L_o[z4åyD|sVDr,];NtM5ˑÚ;98X0kmq=;)<.׻{8Q'?j:Eφ䐏S.f/Mڭ{2v pq 'U}jd3!M,䣝z}]͆985l9in&ۥtp pi_tql ^3pgFtc_{ K\-KsTҾ\H}=Pfeh%D+z@UUU{ʨqml5R2uwwуU'gPYȳa:I-% hv ҙĕO}6U&iM:({EzU@{]?[2De%A@((PhKm:Ҧ+@~6<ϓ] ggI"'9z*E+EDY?~ - A_ɮn1lV}͖y_ZT;&qĬPG{G&$8uXϬK֪NM.>%{ME\U _6lSƘ ى(Fue2Vy-$m{J^Oo |qiSyeSNx) yjè^.~^O77b9fC{O_&? 2]?2AMNoF_Fy}AM3E>rO92:{*Yvg<GD(K`w^xH$yu+X{셱I"\rS4L''e|h-aY%jwO֞ʫj{2A-*2Z {ϑO-%k-V¢B9^Ve'Xp%fc9 ko|z=m,>@޳^di?5\+K?7?V\C֬* ?[7܅Cemu1Фznf\N;p۲c~PԢ:Y_=1ϣ{Xul•L=@b'Xm=QOH DZ By`R? rX5iT%UPZ+_(mMMnz2|K8Z\k؉HE'mUtZ`_o[m"Wur>mo~)^'"OmYX%)1\j({فX\a[?z\z0J"[4g fuѕ|֝}o/88q6/2R-4%"JSiߣ71ۼU0$lv}SSop,\D4zm{:!Dwosʨ0/ʓRVm<`LFퟋD, GyA~ Uyoo;_]E\|]U2}ED% t9kkȽ1-0o.}LyJٷq:ֱnKI6n}AjSr~=k(N%ቻ "&fsuJZq~QDؾ=B(J+OgGB%48u<|TQTXpN_+,U1{&|\uED̪C-]_hQE$jϊ[LI&V'}3{?V>to/ֳ̩Fs7c*}eN *ӵv`/}Mꟻ?L6,aݶdDm]e1jMS 2g@cu)У냛">#_r#[b- 괕bb*$'hāz=ʺdÒ sᎍ-SKv:0 ?(Z1/q>]8?rWeL-+K]4fL1z42E^iOO;%"iMW= *N}zRZRLmgx"8=Cg,R,"bQTsu[EӍRqV͊[wnܻk/ݟLf2 [B|CPCQ Zm*]HK_}<9gT4Q[pe6lUHi2E鮴f%[OG 4?Yl\B=l}TUEĨ؞۾ѩ%E33ևGác>}lo(:x0@R\Kؘh%Xޱ{?w[Y~Nlqcj\ KoͰ]gbi' 3 ;SC܊O^ﱇ=e1G]fZҔw Y]Zr-J SU7ڔpxL%'}''>U=z2thйZYe"=e{7)T89ԏXGzxۊ0')r߁Ԓ[IxJZ-7{^鞙ӗ+nꮕ˔wC^j*e-"!o\@mQclG_@ @­eV~{jTw&S |hGBlakQomh1%gL@C\}$[ wXʯŝOᦼ-?,ݣ1Je^)W? 0rYĩ1#ݚQjqssw)wsgմnHc;o䝻1bڠh'|eS{O=5,JkVҨ7X<3;ujbן[1yU^|w.ۻl狲/oݹ4gj2㳸hȑܯ?Ufˮgu`Gߓ/ ّ{Q7~6u`G-0vc(-Y[U}qڥ*7OfFOը<%u/j*xֻާNM8X|#6^?\EF>.EyGLl,EQ{# KXWdY1e.>ݞlN4YDeq) ?~"K!",qן( ?65^T/]XrpqR޳`I} RrZ= ]J1$$['e(&5ssժOIRjij>d|yh >zlYθ8)Jؗ7V¢[{I9`h6Ϝ4eQJ>^i#|g4oQolsf+UFol軟-O)yᮮjT u7/\ЗjuIU_Y[[7oj.)K[2HlbiP6˗'f诲ŷ Q ӆ]UWTrhpCAa0-]/!hhi49DZ82uUzhh_GIDܷ,ޥ4CCC{x~ek/O>i?zjOݣypfp?^Trmpǂcp>eDzmR "ʟ_>rz淿x,i=gIճ&]mc_=aѕgos+c7,K{kk46n'Tf'mǕwr)+arTj"00 3{п[G#RMb5z&IݸiSmH~D՟}? 2 li=3/W0 [NgW _w6ZT)[ nYd y p{RclX5T1J:&`QV@jUcpzWڬ58T2ג 2S*WW׆tu85EZhTeh e{Ue>*ܪkLvniQp%"r]D3?>v~oLKPŋR\ha`/+VSz[o~K䪲 ds:K2|ErÅ%r"V-͡~{  V_eSuG A SinNߓT^e)v&R:H)i]et?؊'ݗY+BWV@!K꺕ˢpmϜl!EIYU8\ךJZıyG?[bVxkKJ6\.Gw_wgWmSYU*DNj y AW)ӻ䁄+XO.f@McQ߾Euõτ-kHfjQLvH=0#A/&+UPine d O(B#mE^efvEEﳺŬQǗ}zEKVaӰI >FciV[/_ v}闭5xWm7/@Ua]Zx1P\Ft<ӂCo-.%U@l!A9p[rԺc2n&@ PeǢm̺_geY~˾Wrn6C/aηg礼R!n!k[1rEi=^UQb=iWchӯJb)ĶY: HD&/!osGXseZ'ed%EDitXyD5DZ7q0$-)Y-Riݼ7u18w̙/뮆t fn[uױh  Id6kt=nF.Cgu+X\WצkbsE$-lmǜFl&CZE\ &H7G4yqcFQWo(է*s]ɜ)'t\Yj\oi8cQx=P*MRӨe^a"x7_Ԝh4. /_ai7_d0?<0f% ۟Kt$|o]+{d!?63}|d"*QfEz|us_֎\ܶc=}_˟V4~kՙ۩**/znRCx|raaENc[%Kv<0Ӏ&b8S`-"dkʚ7;iXUn iIɽUTEDlJةlDʝ* 훶o!v{ז剈5Q/{H4wztܴ~λ/ķ#N>bY+UMa<գc啇uNuok[*8@MDS3KeS]Ǣz}#~"TjjZW41dcNm5^`+{:;<-Q!"E# v$E/Ls#,DQaX6CaӵHjRsk@k8[7OFwpE'[m\5 KlEG hfh?mGczYwT5. [Z:f&U7וu}ۀf#ޑRٻ"rxmS4K1[y]WYT MC ƙW"-IDY&gܡ»۔us2K^وDu,=~_G:;DOi?ɪz^sMxIAu[(,:Q7P]Eisba۪EG9bHc"^G)͑Ҍ;fgmxIDATtD|y~٫;r־lQ>8_ qT5INl0r1pRUYwO1sCYq˿Y|k˘~SXܭ6a}^L WWn^0g3u8c4̣rzmttdfRpՏiu -|…׎[jŵA:s "K_i8;lP X*DghǺ}rsWN0 r e3?|])w RܓRcTm boeۿ3.,kg|7 Q3/4{IyGkXp nk;Sӱ~aMdCߑkq|13\7OWzשQ]Zg {j[ZCjbeH]! KRy"t}CfbHNDKy͛|{]B7sjnm>^.|%"N^?==apX?e4a[ګmc3r/^wTuuy^ fź34`yDwn*J<πWlqGdMp{V.JDnJa2 v֛cX͒ru XV/7J>ust''<{O':MϤ=ɐwwo8qַ̟rwGs{v(wz~~*>KS]?l}>ZвL.ޣݻ~m^O`?C]:w\*H/so-YD^6q8T5ಏcb7uEȝh^ D-x'ݸj}%e'cSvF'$M!"S0M-\]9s66L_c)ْ[!DD^6*巇lBwUʭ[,ʏOx[[Ϻϯ32/=o6sWo pE[G瑧EeQ Y-XeC9޶t엾`*ԋOJ͎Ck_}nbk􈞯MQ-[ܧ&\JID* QD* FGt hDz志Et XڔN;HL֕2%/X܁{HquU-?zdt7'{1ʢeӟV[Vi}XCnRwՎj1T̽aЖZqMz1u)ٲle;G͝6Aw:ត9vӧ[WW`ykm=""U澯[f#Ú?O7\/;zꝟgG/!rkmRT** &GX{eNfa G5eݟ:=Il_ҼR]+\Չn͛W~m7wp$:|&^n=7 !_~&+sxY_:wT(\C:5o߬]#{8DKD-"Փ7K/ʦ'꛼[o|{KwFW6ΞڶUGv[CUo>:zhޢyZMʰ.o*ÂC* Ȍ<9Qtl,"!3[Li஍~yzXuMmZYJ3n *6VAa-=E%*^a _mїS?;?z*-VTOpC ZqFTe.ulĸ`mY広'_~uy~~x疯7N}*={{KfjeSlTʔOlַ<֏[M_PjG6!FSͥp4w69sLkM?q'Ei.\x'VZiStp6Nc0^~']^?82>mOۢR×a^{26?c5{M;vٌa\Oߝi#ݎĎghqԍO{sلzmU3FYt0Z* N[p@>J5}NqjޭvL+oO"8'-~߁]>2FDIb19"hh{}D$-G3`g2[Gכ5V応4_==D.ԩ ۨ MpuBI6Z|ȅږJ%$p"ƻnm}|\U/ٝ\ެϠ-= Ww[?ˢ5i"h-E#2^Z:rP鳢DD&.\vܴwEiژ2Tm8u 9x9iˬӅr^N rhuv^zEvR)8uKUU2]H"׭W^8:;FYlZa0UѳkӦ?Pn̘1,ת=Ѓ++Zݜ_oAݻ^쭽o[{ckE$'''99:\*;7OOOOW(]}<=D.R;ۿIUJL3wkѢmRRRC=@VݩS'u퉍;tɓ _ ɓܨw~*T«˽c;8(DD<{iq&-u`7eyAvsvm۶MHHX.MΝt.66vf2eʔ${{۫T{~5jRTݳgO||GZj윓iӦuUHHȠAu:Ç9zyW׭[d47nܨ͚5S>/*++GO?W˞9s7,˳.ԩ[ qttXG۷_IIO?l0ja??ÇTUUlذ̺j:988t%:v,r]\\\JKN<z <<nj矗Ҿ} \]Vܚ]u5rV _$&&߯"ϿTѭ[׮]>ӥKgRY]5#PRR:k֬[,B1k,B.F,_qUʢu $053]&$$믿{G{uq^ҥѣǾkooo3;v&%%mv„/.,,}+V(--{YD;w&''{zz3<66A޽{66|hooK/~w999կ4isiiܼ%"YYÇwppn8Oҥʕ+z-Z>}{3336l`c ަM]^ãQ#oUU͛hZcǖEEEرczw}ywY΍TԩSʖ.]z#';\C _뤈Ⱦ}<{X,y>5# "fy޼f=3sE1ce޼-)%UpG'n'''UL&SYYѣG;wW(<Um۶ؘfBD۶&.....z[]7Z;|]7~RDd2EDDX,T:>cI]D̛7Z"UmTEEE*+>rj4ymzS"^\\uq+((x7~ ۷?t萿ӧ/^[UU%"* ]0L5L6"R9r{Ƅ̊^׽{ӧ$gTan]tj=II"n2+/Ol}|;wW׵vnꤔꪏW788|U"Jp1P^ŋ[PT/߽{wDkRj\n߾]bbeCDFzAQڵɓ!!!Z۷ϊ+DD.Z($$$((pĈ[^zlr֭OMM5ÇVtU5WM_M+>,=Fg֬gfs=?sYY`! w\//+Xx{{t%WUTTTz6h]))*ҊH^^^Ӧ7&ˢ&''wСM'Ol^nYkjÇ\CAAAhhF1>>~ǎ7oiѢ56i$===!!h4j,8_o7X8;;\kU÷J XֳQ,\l6/XPT= r^JJJgAwuDE ֭{~N;4o{Ȑ)))ZVD?ЬYȠA|}}{ٳg\:]i˖-]rN<٭[WJpٻSoaÇ7i%44-7<<<۴iCAAumY_=rOO-[lW{|&#ak[cDU-\Q΍뚧jC*z;'zbc^ĉ'>Vcbb"""jHVV͛3tx .4)9rtȐ7n.h4j=zt7M997km۶CCTVOa "F)..:r· M7n+Z;l6ƍӕ^=A`ݻ#fsffƺuӡOL2gff?~~3'x"//ر֭[uvjz{WΞ,[~1"j/_~rRR ^VRRR直ܵku^?ko+a>ks=r/ ҥe_v7nlS*88̙3:!{yShަRm89},y_U[6kBN{y?z- !BwAW~#'Zьz]0mvToZxddJ9VXQf+4JJW݊;A븞S0b#sD.hR->|#$}T uV5㐺䘞/o}%aFW( Ӱ!CFlHSƄBb{]Ap*wz|ngeEw9vӕ<_|@o'=AcUÿC5߻qL絭})+k^ x%ύϋ =xЩy2]"G\2<3D/2U)릳 up[B!лX(9^:?,IFƑ AY⤊ŏti9> iD+[$+Yt?߶Uo'0^dA כkeHMTӲ6%۴oجm[>!B"c !.0|l?В@j4Qp輠飆"؀Mc; XVT[,c扩={=f W6B!>UaaQ d߭6܃KJZpl`"TYFIvTxsh-VI8-jynv;BP¨>}C-7w ɌwLoS^3M̙TͧaϿ{T/B=,o]*2|wR_綶G8#0ZW-y>װζ 8lw p.z Ak-F Zsfuj؅sYV`Ȑ+ KVAfc 7-€Bjްxv>O^yR掹B[2PPN81@Q̦+^6cNwޝ<͂POZI_RΧiRqv-Ht~ƿY (]0fzr~5_O>!B/EOu."~:``qAUYwkyJ@!0c!X!z+B!X!BB!0c!B!X!BB!0c!B!X!BB!0c!B!X!B4VU`% B)؎B! !B3B!f,B!ݡ\s&Bwh2}ԁ+Wa׹ԋ@; ᥳUڱSu.pFHocsSKqC!>b@;KY7rf7w85'5СA|. ([߬DŽ^GƇB}cvn1qΔEؚ%?  I_ -e/΀JS^012_/dwðG B!Xa7t@ws̾u<&G3zŭ?y2ws4ioG2c_:O6mE;3=?޻f_oڨ\&[kŸyxBc#-~aNG~#0t|?u^I}a@+5O,#.3۹f\sZMjX#`QCdjpCD!>2=IہDdD9)5LCJy.D.WH T-ߦ`2_#  {}g`r^]&h"^,Ȕ\H h}TbPXDˉˏlO”^AɌ0Kz,ψB}^=xpYڅc{&}Xv)Zv Tė4 mVP>Vp}K=?kiRs5plL߭~2oɣ@M@$I.ٙ SmR<ĮO1 ;+}y[ :rzB?cw/}>Hˎ/Ԧ{' jONwzWXrTe%w+-@"\[HFQk14'nǑ-R~}PR zX,֓,,ԋ|^#GRѵD|B!qzB=%=)*)$[uVW%]V> fEe4> ̨ {8p\+{GN d>rf׉V}[(®I#[8@Dnpobceez: $_Lkcܸ3`3K{Ӈ݋!пkc)t+cO׃,on=ݻv^!:빻tvu[:-́g'Xtj7(=1L\`Q&ՒcOLZ|זeO)$侰'iz2wW7/%<[;w^_Wdy 1<,Xd^zqoߝ(~ղv.^lj)kIe,{Wo7x ^B!_p®s@)& 2Ⱥ[B!0c!B}<7B!0c!BaB!ŒB!0c!BaB!ŒB!0ck Z7ԹSGnu~"lwYs{v5 8g9Nvfh'BTpiZ |0ol?3RuW?y=9׎0ZFiÚx6K}~6)<;tI Caנ; FUkPc382sM +l?O9݇~ɪ{nE{Ƭirks'  }a?{Vɣ7\{ews./ͱg>7׼˹9q\c9y;Y'8t[>k%7d*ss9/:2~x߶οL]_. m|xvMGj^d%H L/!PC>uL9Е-msH^S gV/I,Ш\_ 0o9,^ PlҐ}RmMM͊~6 3gYs`9ZTy뷊5HpޅM;n}2; bYxsx[DdU~\8_[F` Wd&)5+;ﵷ-HVvsbJ܌ٜ ox63”UgRLު T.a=*ݼi]cL.MLH2Vmˢ1όe)3q䳝̞kH%92Ow;'߻swzCļ$YE:9u&rȝ훈mW( ;OOF,\z=Evka 웰p2v+g%N3 @EƘ ~;qs#Nx*@*Z{o,#蹉&NjjEԸfMo_p! f$8趒bb"A,0ލsʚ Ɇ%ͣGtвm]H!["/ʏRg~B8Cf`شq͝7"e '?*c*2f0{4!3$5 BUiu$*'Kz~V~zI޼a?V^P[UA% nUPxDPeW:c0[Xۘ*R;rl[PUrĄ^ɹUPKfʝ^~jk(Y8%!E#nexpSЩRa|AJ0~DǗغ𙄎hChoh2J{iq_ǜ9|ͯv3.O8}~,}+.)Z h}1Gܕ/+UNHM_ +<{ p,ʸ[gY&4Ѥ/0&NUJ_ulb}neK)SlDƌeR]|S qAvwNW~j(K/O/Uk2dɱ ڶiܽEߌ;=p Rn61;%.IUJ$SEQק4<~%jgnY~yyrãfmf{BEWϋHWw:ǐɓnO8!و?di\GЎ@u)D+GOsqfQjU4EwCIhSHrAL|i]Ų4ہXzpi6 $,}t=fR`}Zqg/㬒R }uo]{0~3kVxЍNi}y[M;6WJta zΨd|{=`ψbق|mh%ҷr9A *+`" F`usD5!XBhk3 X܏Eg%L)f˯]4)(^'*X{.mGwJ:_0T9+9s@C{lI+#t:C)Lcµ;sO2}BUIޢ8|{H`UĈ't#׀w?7qJ~ZvkS&eԤނ-6{roӱڋsAn=! {qbBAV8Se"9IP"Ɖr9\,y4=akLܝn^;8X*@\ }}_tFe\=֌q[ ^^|G%*P1|K tD¥zV£?Z=w9_ԙdFt^{lK3 JlDޏ4kb,[4 a vwe\y]o)칠V7Qw"`LOMȤ5S9U_r&,[dl?S;wچ?QwS |9NܔPfN)[tEEjyXzP~f={ߡevh琝z>R߶ 9z~fzw2&W_G˱5k Emwt4vsߥ dNSc7uӘs`"<ݵL8]}YX smmIT)utsȪ#) /k3BK84mA\vY6#.˖D=Y (9A>`n)\K[md xoafLm$JY!N^g}1 :yi7zhSZR*X0}#e g)IP=XYZ$~ q_-XsҐ%FNlt,-2VϾS`W0wj{%67OQijn| OK:9Ud&TERv϶c?02EGD,j7zK?4Js (CO6[ Z$.8*3cKݠ}?C|vE0X]&MB |ѝz_FidӬ.~I={)M3߳Mbu|PLS˚$NkWF=zf,cA׭Nnc.ن qm3ʣ[Y#uobz`,I Ȣ:IrɏV5 8eٿdH?i7ϋs[">p;ֿԿ !BB!+}!BB!0c!BaB!BB!0c!Bw|g-Â}<.*ݻĈ+!BѽY[ YjR⣄\SӰiVB!Xo33injH"+WUʧq#Ni\2!Bp< J "B3ֻqf$1Baz7L--zڄ!Bʥ>sBBaz˱En킈x* IDATsrX!X}c ٔy뚌akk NUj@!f7G ] 80j s4B!q!B!лWB! !B3B!f,B!n0>RL!ܩm|z!~c|yBG}LU.=jL, g.,8ØB#+ }>`6)uㆌ\;za`-O}nȄ)#.uqΨ~6^.gG5zXyWy 9uѽfuqJ^"oQ׊AjlGKanɎt,G ~gɤvh;NٌP\"Gvs~ӨJdXm>fWavο|mbɎ6:A x  h͊M-SI]nWB^j8_Bd'&>"kNl!䎹Cf)[yE3ιҕYjn=4J/+)u7fG$@̙]֎qzu֦ŻѨ$=V(CΞl-_mz;9leC?;y׼g*CeF 8t̀'uX$߷sKs6JiaIK:Sgbz'3w ˗C8 r4źnEQ9 Oz>Zpr`ZyܵsϧQ={8YR7~x= %)7+Gk"ܦj#`ʼS@| 0Z8w67$#eߚgD@W˳SBF0?% CeӀ3W??-ȼlFqA?7DS`ew*rI_{;\& bٝB* NOQ27X`=S##=ێ`fm1dPmMƇOSg\qd3VJ: ^"H~#2I3+oQuguv 4bIcOf׾g}b3UaMDl0Dn>|wk ]nRq+rbziRE7)}XF}paE)F,;~[znyXv\>::m4ީ D \}z XJx:Mv]`mNk4< 8mtZӗ'EG+(]l#O}oޢS4A9-=|,"''L;l_pݲE3w+s| Z6Zhyge~8&j%tᗧ5n^63}^tҶNd"+2.G^XP,\IXR ZQ^+_wMbʲ?TIy }]$ɒ!9q+B`-"GS` !,D:Lz>%rhܘ&V m5[Ԕڳ7i~:YI owZѸa3u1O=yn\?!-J-w2&q+C`r WnNYlp~-6aF4 Pj}m$i[ڰBi O{hm.m]< ^ "`t}r1Ϲ+/0.9/қ}>lٚa{ v|dQuXk>9N[ÊZK[Wekz-[2ná"c/+sŒeu48 sVܟӢwmcti&xԯ?:5S^N`l}{g>IkU Gs@oO8'_@xrվK/WⲁFO+zz`ٰOQm#vbT#evd3m׀UݖGEO.g)ԟ|OQ6.[Ѝz5uEZ ">#i ǡRN6iCn8'폋q\pנ]ÿ.{P][[ѽ9rʂԍ]P!/WCWQ6]K? ?|2]nq zvCw^`bt )RkM.ly`1Ѽ +wO|ą Nbͫh]+P~Tf*7pمͳ tOQA ƽ8ڏM Oot$eUvvm@== ѿ?5vo`c*+<^"}~6ﲺد=S(y @~ Ƥ\L Kq,k6,na6 $;WSTm vd,uU%u TG1ғPBtp+KgNZȘwu.1R<,o6XU}aN۰WoX_;[)/g`LZbi^̽ޯ>$PNԲG ԫkD|\vYI0r$G+FO/}Ģ|ᵍ_ 6%Kҏ;ۺ]wcҲRRtQJV+pd\jY`R$d҄ha\LA-ߙAY|[ZILZRIyI_7jaөt┼BZ1evrTt̊KR )mR񭘢bi^̃2-T?f21[tnxNfSb$$j+op:_gYYatƾ><"VB}"~։[aֶ@wS\Ը{7I'͐l/IHtNpƭغԼ7<*yH~WЗKJJ9ע%T*q|Z`ғ|65W(>m"(6K̜ƥ]Ìekm tX ~_]b"Kuk3Zh̄&esĩR.M>0f┄0ZۖM6'~ݿė77]=.15΃eEq|?!lǪڪ!midY3i:;ٺ1FPDZ~f[Xq[?ICzLR_tD&ߛ8g]k"]ČĈ+ś , Woӧ ;gz׎Nvd"͕6ϓMLah^w3P;xp.Z[Art$f07yJNt`Б40u駮I7ΝsGVrVËїUNÍuO:dg*xx0Iƪj-5vi&Jt5*ϧƦf'Vh`5aVt~YB)' QUgRf bV^=FNEPL $IӓZ`YDs͢3=r| 9vUeEGm)xQ5 @)je&I yRaDގ9WKǍJT_x=-7E>:HMAIȨ^YO/y)~oCyZl s&҃M+TރB 5XU޺q ZthpP&psOzzFޖi=;TIXL @?JsXی#jӴM{BmgFQϿIh7igy3!Iw" #W`?qp,['/VbqCg͈Uw ,XտKoxBwRN ރЌ;ҷ?e|%'_DM~HϴK~XBxIrЮkwp$M'叫3j)xe[/_`[fѥY=xÖa-fTucߝv^+ʤNϼ3oxrӰF&Oܸy 댋*Y9iknAT+F4aٮ _YyX_OmbI'G-(VHG >:ӲF (^T#I0ꋕw34t9znjc{n\5[.,k0z &qFAk@2jRoAiռ)PEq ~, O"L+7Hzn#WTdxL1KKkAT܀L i`qh[\cQ%>$<9aԚYWG!_Z:hbZ;88Vk7/*Лi㲋 >-^qn9ta žn5ۊhze^YPs }n;:im[wʬZŦϞ$@Ҍ,Qfz˖U5ۆ.>@tdC9h EsN3cP90x ӼsMH v;fͭ- Q_8bEÚGz@5"p|GQЂÊ08^G0zu>韰< A?3icugO6ڰμ.)cAE{ҲڬS9}>>GSֺ_Fx: BZ:/ JyV0X3[KPL)ؚdV]RlKdf[MY>;Fskv\60l> ",(7fd2*O 23"G,/pjo9qt3)ck-M~Cfuɉso՚of̹s=An6nm,f}1&_Y5pvtZZT+q8/3Rԣ甧,(T: x9@ho_9w6V]Yx(a᳃X/JWn g2ry.ic`Vg[R x w'b L͝F5yZ3Wk"нI%W>NǞu#HX߀ރ:򝚪hJL-]܆7 p `۩[X8X⇦ܧ=+ѩ 7Z}1|{.%ܿo&K=F/ב/7H3wWhޤ}+8L&ifA,IywldB/`Z18&`ţdk~{lKɖ,w/I9sW/=4{넁zCY("wImV3G+TTq+Haעo ~?*ݼif(u%kEND⬨HI30}w= g)IT~٥qGnov\!;9Ӡc^+6F=;hX#vcT|+dzΚkR(z{'&WB(;ho<6Z^TkqYN;~}6j0߳]|>/s~^Qi {Yi3~ K./rK/cs_ȹп(K޽K[H8fO=}s'6I8_[:N7GuI/8Klesp X!> !X!B蟿!BcBc!B{/hj4\!`;7Ŏ:ѱ"BGV$"8}ϼ&E 젂KhXrbLof0+vJ:Y^ݢ6/<.M!Wg UWZ>bݍu`"CE]iؔK2܊B!X`"M`]"vL!~*B/hth^f4wa4ryK㕵U(4by94qv'#Xy6yFɰ||B=3u;J78~XCc @j3n8:[{ B!X |1K3n ]1c@ckS,kY2IE Qk(XiG4vj}Uұ=U6.|z`*\MfkߊVSjφf"HlxӊmΏƍQNy>XCZ[dM vޓW~U9wv \*|kްA#IY[(,˰_;Yxag\哗I!["/3<\5<]oY',f調J "M峮5.bGkbĕYś , Woӧ ;<[%IƲ)Vlb (_XweptRM/*uf _PS}Uǭ³#49(m@_+& X!0c0fj#_E,blM+˂OKVS*Ih7igyɂW`?qp,['/VbqCg͈Uw ,Xտz]<Ͻၡw7 :ᅉW6YMƓ#+֣iBׇ{>mլԭ>|t_M~ e2gU.&@oheǖ'N+Yp=^9S!eu)U7`B(%HHCb?o\cH“MwuWҲYFlĩz;j8 Y:P_erYPo# >Bɜu󿪲+B*nwMS![]Ե/|v3 Л7M tYda`e r9&pgam_(/1"ԋa#B ȚSXB03[m$<= V|<"1Ӗp;aN]Wq,H Diݙ,ꓲ863K}Xw޽;|ֺ^9w63b]m9!C:wWzLJ+9cX!zhP,ʃs%c:;RB=q,N k1cpjcw*_}&XJ>0L:XJ  btA sT9Sox0\NV5YH 8;˺̵!+%lA@DƮL+|\%c- })66/CDgi˃p:4n=oŎCFU.៻_ umu~ߥ"-Jx?׺[791c={T…?N}b̋r4J; Wt0Ba55u+R«sF-b.NUT4꧔1o^Tk,ia&jKg`<nAwtBe`huEУ{0S[,K02蒀xL6(H?~H #,d$;s{/[\n ymii cVdžD3%К6ք8_Jιos[,KXfU&|t@:Zio-b9&c\%wI,Ʈ}f?wY)morhKcuio|yx+9[}Wc8H!1(=mY=zl"g5vi@Jeg͘39 -msXn} l}} TeÍ@﵆m<8zd 8)ecb;B h*c_tCWC"tt-f^9\ hsec,gsX]P ju-Wt+k9"7O1ViCW,lޞ܊&Hj&eڪ&/&FzyPڙ_fGciy=lܓ|KNJ!U"i!Y+#/آf4jcЅ&_,1Fq{Gstw{Lr c[T~𧼳 ,P Ł05DD ,G[I)o־nVô{W =*sr1'fzՎb)o_Ro߸Sn-fToLhjo%pܪ`eLvVW5(j?_ mBceH,SXcڻ>ٓr[i{ E;ZzM; ^xP{j Ain-c$*=R%&嫟njuuٶbI~3?Er2jI雋|^ϧ/qc=}[No>uYK5D}G|jy}Sk;y$Wb Hi@ ](9ZbaJy¦&`80ZRW7R.ymc p!1^-ٖ.az,p@ "i-\lQVe2hxL/g;]5&ti@=qv''uaD~>_c|^z3bO x)"e62[2&TjbvzۙذX7O{{- rpZ=cwsyr/07vuuSYZ VA]uL7M \%~WnaTG+0c9A֭ȮkoazO  a4PDS7p;巋Yl\df^iט_I}N &֠o -ԭ0vXdP>a'ilp_ʯZޫn$,P[4m߼{+[=c}qNa]SHB4V@{ճwJDͯ%6 ^uٔ)n]3=9/e{  |JnII sM(i=pLpӛm77 A!1B#գ|͏vɿOμ|Bc, Ob3 zJoB!z83Tlг8B!_DZBa_!ѳ B!0B! !Bc,B!1B!X!Bc!yzz,Yo:[o94,XOYaav@D"-]=](L&[=.fffmdY/gGeҥ::: &TTT-#;Z.--%[[[E"ѐ٭ZFa}Lk֬...4)a111>>L&oKO%O{`>}DLqF\k׆O puuH$S ZXXddd;|24d̟?Ɩ>}Z-gҤIFF ˚]]]N`Q(dwKKKCBBq kҤI,K&*++?w>XiΜ9틊433Jnaax3$-)LEEMSN.))IOP(K-u)JvvիWW^u6'NڵkL C#F2%CWWEpRzmmܵ~7dJ$<-GGl6[*ܾ}> X)//KKH iE#('ewdHKB---\nppA}}݁:;B$%֯_L vEEE9::P(Px⥺!S333ǼO+`u42bډDB.888xӦMÿ0% \z-[j5DZz5ӄXaggK|"R:x񢎎Ç-ZڵiGAAfϞoT[ҥK ?>---#rlllhSNe\\lZJ//ę;v3g&dggz{{>@ P*C`0㧟?A`u+5;wN h!ꓒT#\Vr{{!,PWTTn>%5fcܹmv*fCcyzzp\׮e^pT3>~:NN>#ZYYX!sɡiii,`ҿl6{֬Y/^255$Lӯ^&t݈(K ֋FVO! f{r^υRPT-WL1kryPگS;;vT?Ribi4`0OצJڼyիxc֭V\޼>B\!z"c*@*m^WW,Hd.&ijjutRccH$JM=ojjjaa1d.</77R\SS{mH"]]]/_ W\H$}V;::q`䲲2TnݺEYGtڵ&BQYYEX̪궶6Pt홒rn(k&$$xS(^OOB!]MCֱb۷Lr5+p6o`oogBannnjj>fnݻ<^lRv̽?CCC==ں6_`sss331czubfƦuG{EFPN! "ˇًBBBBd\.OKKrݻwg̘anΩA =7o?3kׯ9rT&%&&y =#E[{ҋn߾s]\.J51`W/NNNNNKOOtx:=zw"HWRTk׮{㍕W_0BZ\!zB577 gJ|>Fj&QjÆ${ 7Śė>;x|fF#$C$ߏkkk]ܽ###b1ӐuLKKKNNξ}BӀL&!rl\%c@ ѨVVVϣLf@]]]vv/-ϷpPD7n$EZ ե L&S(KIY/ҋ:;;D"g viNY~~Sܹ:k66faHAsZlXk֬ VJϿɔ5k @ !rBˍwrrbX/Q__JwxҤIlٽ{wb=ήc81H$jmm bmmmkk;y |b*((ȈT*!Ja0,//;vETTAuu QGR1sL++KSSSooiCV㵶555Id8GGG3###VzO] eXvvv!!~ ''P333Ht bccl6\>HK+++---{zuuZNzί^W8;;3L {{SZӺ:Jemm=w(Hçl'''?d2[[ۈƒY[[[HMLwޛ0aD}$' I[eeU뱱VѨ>ƳgO vibVgg'#"""##{Խ{Ù8PՇ:5|9jҥtn TZKرվ\y IDAT؟J244HHo J]Tj?c0Z-=zX^T*8>e$I$*ټq;?1XTtLrXXt]>_>o߾M"&N HCދK >|B+J7DΥΘO"$IVVvXXX"-p!-4446v?p q=#E#ha-~+(ԩL&S&^|E{ rhԨQčRdzg.YD$ܞ4iC#eZ&9GV@;12i]]2 b,YcB#oW%116.ـsu%d122JNN Ckk8+:8W\OcXyqSDZB=_։B0B! !Bc,ByGh$U*UrrSZ~__?ga̘111Ͽ gܹOˉ/mmmO;5q;!0B艰t?Q42b^]]ƌt>_؋`TD9onʼn' ]\\LanntH$zꐷ=zҤG{dT*U~~ts2{j*ИơOklٲw9s\\O8Y\\ aLrنz:]oĉs<%yV 1"ϣ驩mmm<8}:k22bN2e9;v;b{ҥ2ϟmvR4T啕E9B0Bٙ zzzo毿 SN.))IO 7@PBŋn\ؘΔ)R~y3D>>>&M22bŭ/_l:uTðB!`0V^g^$q::ǏD!ry\.f:fKҜ۷<ԍ9y򔏏B8sLEEjiiiHH~{g?TG򲰰ܱc;ђi"+=eii-7nEcǎ!)7n5~qLD"3}--􌚚,wBXXرcJ[Yù`- mmmBH(6M<2,,Ғ8p,#""9L֕ !!j۷'I$m?DF4.ћ͘1~EEܪ*bBqeɒa/@QFT7kr׏vttTeeϟ'.aaax3DQw(,OORooo"FO$uuu.\xfX=JΟ?wh)`Y˻---5ݺu+ 4WFloo'&,--b.VVVzyy%&ܱcH$60093!;;;((RiUU7D=4}`lZ|yNNNZG`udٳfͺxbUUi\\\GG'6fdd:udRM@ P*}Pvrrnn 8Dӯ^&t݈SNZ޼yK/TZZ'ֲXL;;{b1c;* ̙cNZr755wamm5m4>ZˡlaR {G{}rg./HN>cnn+H193qر7o૯Gt:{rGUjz{bkGKK˗_^#XɔȈ3gw$*EK..&&&^^]bc9rX&M={oRa?3##cܹ=xĂ73gZ T*E"9rx;vLMM۷ 33oLzzwWW+W5Js T*R|EN Vyyyښ{׷wPTtXTVwttXG+D"WjM,N3Q޼ySVH 5$dX }BBB.]Dzzzzyyrje2P(tss=O{5d  /%4Nrr21TCwwwM… B(ٍ;xfH5T*X1%,njܜSTTDHdb5..L&@QQ1$9NPܺuKV766VTT3`ݻG\D .3X`{ڻE,NX{zzii߰aEcc#"sssSSͼ ݻ3f07UVVVWWΥƎ;sfo.Y,c>`X`dbbLk4/--vqq)--cb1W:+Ga%RC} bfƦu*vn==:i>5 f̈1#~:>TRifP hqrrii_~dX,>y$1Ghii3jlDd|MN)JeJ%Fkċ/H"9:LW**mll\]]ϞMyN"jrDb[[ #ͅ7$&p||\.Q!W\{hD5kV a/߰5***>_~i޼yCfYظ~^^yywI$pZ J>Uޣ2EE\ﺺ:''ݻ'EK322 hYVE,zXmmSS c֬ׯ_?rL&sssKLLiȌvcsfy<^WWWuwoyW1DBo /=HG.h>,5|>‚F W{{{~~SܹeU2ttt@,k^bb1s,z.??eܸ--Bbs0dԽKֻ:::]]2uv#hg===CC>}WVVr8&&&~H$q1bdff6ۻlwvvwBg4N{ vlYkWT }[[[[ZZyWXlll9΃5b%jjjNQ__J^`XYYFDDyywML'Mfݻwȝbc;>16fZFHȤa,~~~Ǐ&~󥥎ׯprr 533p8ήP~s3o9nnn7 hs bccC|Ѯ] eXvvv2dffL=z4ŲJ,!'x<}}}OOO":מ;D455qqq˻yMGL\>b 8P("##MMM<==|||zF%:;;oܸuӧO3 KK>H$D#QGTZQQniiamm=y䢢"]R666 ٙb57% E\.7>>ɉb9;;b.ߢ'NAA+۳tRy)'H"X,L EMd2e2yYY)2]#3zllUh4j{7L&ki;vXxSZ[N:M'vvv8q2"""22EEER|]]ݠ suyᅐ kҾ\{Խ{xK0Juh:."ܹ3I$D" ho&H'DK$ROAsssdrPЄήC"K!. %K(HNN룴@CncǎEDL}׺d999-B/Z:]BVWVVVVVByDK|.:>_ѹdɫiigS,X_w$$7J%׮ej.]b@gtDVYYY߄dggwwg.ffz*Jb,YcǎM3>wEA!+DQZ[[=ݻOK1B"^|1޽{\SLZ=ǻ B"!$$̌M@OOnllL T*$YO*,11q9CWWBcXkk֭["##<<<;F>>--M$NN>gooe.X1B!1ztwwEFFT'O* !aT*v-D"ѹs3fēH$DFR^^~ZfDD$7o޴V*DNgtDVYYP(r} zt$;;;lWWo"Sa߾ }II se ȈNYBMp=㼼<'O~= B!1B#ӳg^lB{8WB!1B!X!Bc!B!B!0B! !BaB!1B!X!Bc,B!B!0B!Bc!BaB!1B! !Bc,B!B!XcggBc,222zvq]v[x)S {SSӓ'OxzzI5j BCb' ܴ:~&9f\.ǖA!1B#hB}}uDDJzz:Zظqݺ7TysCCCTjNNo 3f̘ܻw8NTTTTT|wיLevvv:uz433[rJz;]\\.|0==}۶xBc,h4ZppIK (hﮨ(եظqvةR,[lv;<| -{]&@ffѣD"}Gmmm6}keelٲ7o K,T**8 ǁfTUUݻwkkk0::QPPFF̅ _!b2b㪪갰P[[r [[[2#88x1jll$&v@B'!0B!HRގJ~GF ń /ZZZtvv~uuuL&WTT g$_ñ8s&)++Bc,F@PgeeiRP_kJ =W_/)JD:.CCCMCjط~ΝM6 y@Bc!twwDJ$-[655켼*}7Y__d2awvvb__4ѣ ESS&ܽ{w^^ާ~p< B T@033kmmX^^mdd[RRJROKMMmkk#1cc RO` |^{e$q>gΜNHvرO/hMMM?c{{; y@Bz\ݫkBl>K!Bc,B!B!0B!Bc!BaB!1B! !Bc,B!B!X!Bc!BaB!0B! !Bc,B!1B!X!Bc!Bb 4jGV?'BH$ !4 Bh$rRlXFFFCT*r9 c'GTT\.<{lVVc/XO}߮ۻw!XBP-{m_"`[~N< XF͛Iy'M ĉgϞ}!0Bhk׮qrrz7=<)&&;v<1~~aIIIyy9v- =BB&3歷 4sw|7 Khkkwu_}եKn-ƾ꒔SN͞=8sPPЗ_~%JU*Dz .//J%Luk>ӳjӧ۷_K~m__SSSؿC\m6BA"fϞ=mZiKKqe˖i3ٺS(U |۰aCdd\p.]7@Td7oUUUۗH ^6mZNII9pZP(,::CR=j IDATG}( nQQ3f$9Bc,5k֑#GU*ܹsB6_RR---v޽B055;w.888,Yzsp"??^LMM FQ=4njVRRrM ^󛂂Ȉ3O>dƌcǎO6m̄ovݺupCCCGzTjgg' ᄏtᄏ`RsS8N~=6mZddg}N&?5%%%1qf@@ ]hb"}m!4|Bı?_"᎛X,nii%Hݭ؋NaMTTdqq1`1L b.kr9}:GWWWMMMc2?o.@ D"HHybwԩ@ Z6R&*Ɋ ukSR~YY">RRRr> )+++++!f;9Bc,srrjjj`2Y--B"͵ +++l&l ""]&UVVOzzz6\.WYIIJf0hf3ZFr3k׮166ss>[peW7c ǟ,yzҥDDd MM>>999* [= _u?T*uΝ ![GEEzyyʳgfee?AⲲlٲLRVVV>}'XYY~ʕ+7lXj'-O:x4o<{{~Q.xQ^7n422R(B||@c,B,[ɓϟOE"~cFM֬Y+H}!ڵk|M+s8n۶}Ŋ.]H$vvv?accx"//?#3:ɓ'DK_x۷I˗/啅jzy2lٲǎ3}tkkk*zN-[)ʢE 'N 60Я ţTn%,,.}ݻ///Ft666{ȸx"sssCCÆ{޹c`ϝK=z(1UzQL#ٶm{WW$$011iiiɓ_|ESSҲ;v4551SWWwDvfxT*UTo*\SR]zuǎqF__2\RRmf H/chh(++6mT*u޼T*5''~'j ݷog>.111,,t͚ğv<cbb8h,t_u># - XϞ=.\4hc!!![nY~}}}}\\?Vhv:OOϵkפ[߿9s.lP(֭[_XX( `to5ɥR_`cc3~&'899֎1RGEQ(MKrĉ۴iP }lmmZ\z'>~-[>gt% [n˝JJBmllӧW\"x76n2}32,**JѣGs+ӧ?mv͚cǎk׮I1BJ/8?)(ȟ<ɥK,ZXՖK˫o>NxxKii۴gv:lkk#uӧ=jcc3^z饷zK3Fw޼^kΡ3zmv6mڴ;vXzd2?ܹ?}uBWJIIiժս{VxCED6,,ݻ/^jZΈ#yrB =сϟ?/(**%Muuk~5{rU*U]]onjnڹszWWu&%%_^,Yd͚5Wwcǎ|ԩS \p|F2[4if)S~{MZZBptt|JJJj&5553_K.]~nVVVj`0X899I!j4Ӿ}{Lv)N' T7oޒ9lPo!DRRB\vW)Z.8СBqegOWf߿ϩS^jy!Dbgg租裏tiy0dzBܾ};55UFڶmkCCCBoH-?Ç8qBQR922;??ť'O^.2V5-Ν;뱰/^H{ǎF餌%Gjj3a .ܶm3gf1z>"4tA={V //7XQSShx⥦帹VTT$&^1 ///{HՏ0adJNNSBܓ&+ltرz7͉W<<<|rt~wݺu}…3߆י3gҤeeeGp777iZF-[߿5klllv36l6k47oZ(T:Nzۻ3")` !ڵkhIo...Bo-Z8{?+--~;}3&L)_~x˲eш]v={V |z/WjkPxÇϙ3G=|͛7⋳~~~ZV XB4[[[oor;nnnBW3{ݓ'OhB___ "??In0 É'ƍumȐ!WFrmZÇ/^T9|nI&2`0d2OOO{{{i1_v+VabgggggxڵkݻQ#7mڸ})4/##q'O5"O,Aʉ=3tM69rԩӿjO?#=(,,\jnOMMmzrKOOԩtdddX^R )lrF2СCaaaUU4$P:ge]Bh4\lAVVV-d:ܹssWf;\v]zܩSG[[ׯKCbZjZ!L&q… aaa/RQQ!8t?y&vڝڧOI&J !F+I8RҥK!k#Gךdɬ,sRP__'17|o߾'N!233M&Stqqqqrrԑ#1[{|Ⱥ:'''4{l㿝;wرc-Zx%""bĈ&Lز%277G?EB߾Q_oB]7I )Sp%hooܰUӞ?F^_R wΟ?С&L;vlx2鲹?˗WWM} K;Mٓ֕SWW'̈́6'awwYzwo;R)˻tZRrOTΙ3ٳ:NVC !llljjjyƌ{~YPpҸ[YYe(biLQ[",::uƍok-:.izWqq[⋴ ^O~~ݻw g`vzDDDtǏku:??_۪U+R)m޽[}}eQsfŋ.}#GBx{{4RSS#pttcZm||Olmm%5GGǩSRT~QJ̙_XKV999K2:ŋ&'K]`_2c[[[C6[B@@@IIIuuuݍFcUUU^^?c kNj3g4'O1cL&qqq--6-Z̟?/1V[";7<77h4Ο?XcZ111F\,ԩ&hOIhBN"?˹˖<]^^֦M˗/kڦNJ6 #F  EkrWWi]Sz~֭˖-z5noJC£G...}Z 2x\M3LzUCz_yוJeUUUeeR4 (Zu9Qό=r}?̴>}$'':tso"777::߿Ԕ`~ T2&Fӿ?DIIѓ&M<~Dqqe-ZX[[#6mh޴ҁFQRUWv) !5+lѢuuuǎ/nnn'O0 )2xꩧƌϟ?/5ޢCmnݺiiVc-/K޽ ?cǎ{{{ rƍadg9kVtepǎ㝝Zgk\}MMSOMqssڼysmmmmmڵ^`0߹S(Baa/,YѯSRʙ:uj`X^m+|f ***jM0!D.h6-%%%qHHpHH^OOOB\r%11qƌ?&%%/kۛ=ü׿JC¥˗/={o,/)Ѿo}W6[݃|L۷sn1cưaCҥKeee22'BCCCCg>l;&((h엸3wph][8ՖϚf4mllvsy 4`0m='L`239&'hY1V׮]+˵ӧc8@=c+?4 !2 2 2 2 2 2uF?X}۷Z__gǎq.F9rD׮][lY[[e+ڵk[,egg!߾}[v+WyyyUUBiӦ3\0@~MX >~ƍJKK{x}>ꫯ^Ιj͛7F!CLG}'//;kڕ+WY~,**?XPP5d,ǽ:,X@2{JEFn=ӧOzJ-زeb˖-'NT^^^{~ZWW/[Jw߭Z/44TVUVVFEE?k%K޼yS`xGΝ2sfhvjjjɓ1cDG?f[It2sfh֭ryAA={!Znuk+,B 5MBېJf۶ sԩ;w^ye~ӧOy-Rk:u1c\.d, XϞ=.\4}1v IDAThc!!![nY~}}}}\\?Vt$''ݻ666;v>>6|`6|+W4mFz`6=zhhhxw 899oo޼!Bkɒ%_fee[vΜtiÆ C]]-W 4iҤ)S4B蘕%())qttb7w:vآECt'xzhnoVVV֦MnݺtRYYL&stt,++{$ Й\o;rpb GQQQZmIHHYaFfΝ11G Ebbussd:NZ ?l%ƞw?k@ cWw|A c@ c@ c@ c@ c@ c@ c@ c@ c@ c@ c@ c@ c@ c@ cX cX cX cX cX cX cX cXd,Xd,Xd,Xd,Xd,Xd,Xd,Xd,2Xd,2X7a%~IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/generate-clients/image07.png000066400000000000000000001414331461403617600254120ustar00rootroot00000000000000PNG  IHDR+sBITOtEXtSoftwareShutterc IDATxe\Y{sHEQpml^{uW]{5pfmLB(a<}sy3g|>))) D+D+D+@@@@D+D+D/R31-b׼8<"[(AjЁ4$OSTT/Wɝۣ=9CseA7}(H(m2Z;S3 ~FCM/J jLIՄDq \{ӎgT?W^^%"HD?Rrf""+$\17usl45&CV߽',I||'KђxfDθ}H37&;7k\PKbaJrr9Y:mljT#,()2_niΤ23;;em@9Gv[S_z q ĬC,ǎlL$x4֮} 5EgA]fٛ5ЊBŪ9bۼ?f*1 ]pbJИ'"7N6Zlb&u!ZPi"" =j9.R G[  a|N23C95%-ΈIz*TN?;cq\irCd ?J兦m~-s?S}""]~z1߶\DJ,%"-'3_hzUAի/x|DF ?#{*u;8gNDY n;{k{587؎q7ӕm&Lkߍ3#"~w}ߕl8/25u*GI,Ȉ?w"qތ`g2AF$ΏtqǹSܣIrmixsAuG^fb6z\߼hdVi[W۶&DE:M]^IBr]*upM:׾MWȎۀijJ,Cǡø;ůZjfv NDDC 1J?hq={dlןM#C>?d\\EDs;("3:hmǯc˵Dha)<֊!Z<.$.d Jc7G'<.,,Iϒk؛xOx@A4nK%n%.+ShZYrT7<:{#2 ً29I W/IRτշR#;l ϞCP"j0db9ZZG]ӧo\=s<8 :ⲅq:CkhkkK g&Z&l1;uҡsZ=dzLԘr %f hru-M UҜ\\M - ?{JZtȈ_"&k+g9սj qQCվO'To26K_W4 {,+,pa{LX% qHzj<H2]0V R~zOz8?:gnjfUI\vm'ǶBKbaj5ha) >՞\ryDĿDQMo:.U<_ V*<3 Z Z Z Z} &y՜VNXʵl|۱[IDDm\7{*sʅ?C~@mq{O9|;g>ym]o[â]+t<Sъ[U -c wmָlN1G~('p{:/MU^M)W!uwB 7g]9P"VXٻRŽz)DoXbk3{ވߧ ]-?{-Z5]~c ;/?#~bQ'_Dzsk4xeiM;dK} K =נqKwk#]=MgNͨˮ~DP>O$1EQm'3_<-I/"e {[7..Kƶpqla!jӛnjǑ<eJն4t59 3s}T''?:t  <-mܱ.%ٽm8\NDrn Kkg*BǒilccfMU9A}Ic0b:WZi_9ðnߐ) 3%X0~ҞL"Vx""Q9kRUg"'I~&e` "rDDb DDSgL! 8qD:3jP+x~ JUt9YX j{VIǽQA51|˲B@ŽJ%'[aά[g˞ "|p_iy@Y!<Okwbooxbt7 OD -5uf,lЄK}?gx0HgW^1?^?!0]MbZ೷"dV݄T9CkInЭ@?ukhzKkgW\".|Ӎnܦۑ&DJ _I:Mw13bKoJ," c-]jȵ""erV}8C/5p iQ;Hl`¼oE:D]wn&Ͽ#d~5BH(GPѫ],t]P*l8zWﵪ$ފAHk8,XU,%,_OJ6ݔrvF`̛la[4"'OYyc=#9#QSEdt'v=w c3ܸ>_iS϶> $DDl xP1Y>铞q\fiKKv!,aEfPD̢R#" ᰝ_6@,Ck_(=921;&B4Yi/a w`q~phrekLTZIfcJ [;ؾ}{[l\" 5Ln9sVꋤHu=.9h'{jtq "<79882OQ(e8 Cx7++Uqvl)){ŌG_aG<ˎޓ;]/~sة!S7 HHi=j1(Ͳ[Z7ĮZ%Y{rxm!LΖڂh5;x`ɣoR,.'^nw%B7^Dfd\4oFCbo=8R\,<, *#dU&25yˆ/?ϧޗWǗ_j@K,%P*'erb( 22:\y_SY@DD y~dQ(" ^e1~V^ 0[kFgb](D XLBHNbGNjw/f5_py\GIqaiWV\53wv1uic=q^6?V! K~wFTR1j z8,x퉏q#m:X=.; ~9[{e"{aӽ\rڞӓvOz9S{&!g輽3 ?} YNLV(;w.QӶPS׻**\ "3_>^$R~Ұ{oj% Zwȉ!fHkA* C{us&usuXžWM-ټ^C_eϙ6mLZj7`ݬ_~K_z}h>Nm;;CVmw] %pO|zcf^8.棿3v0LFN=7$~Jxk4bE]wⲫ?4A)C014{ٗ E y~fXKLjAK$3$fH|J>LYY?çPjܸTM;[ 7_SyV-\C4-$Q|cW[2>}qQo;:DɴOUoi jEu6Jj*՞Ud(<*zJeVz(IV-+L)i~pHDYTyTuT/^~Z|'sêu?HDĮYǡ!OYspѷT)Kϗk64i8JB^v4qkndz˪5ChvpS}g:"[9>CG9K{f}NDthq3f\*Þ݆ˈA%J7_6 W/0e/Kퟱs-IzHNcLZu\1OY)/!{޹DĖ={Rhg^\(IҊ%7bJH#'`l{'K*22.o}qOעʧEڃ;^XLNDTJ '-dR^T3-$zGje҉,GKnO*ysQJ-oh(/{lSoQEl5fXIrYrůڸ\9MH.riJ&lKSQZgS2CsNB6Nk92Xz ||> e9?cLq#Wd?1ST{ 4 }+O=I]ѳA ˱wlP)W ZI3އZп͙7v~>rE{sR?(t&'eA+*wrmtc||CN_+Zo Z|}ASZj) %7)g∗5gZahϩHW}RȌz2n> Z}zo]LgEZy]l x,yqNJCli#kLԘ,Z-ř$iVuɅݒ2Y:ύ"-(5[n䨜_g-@EE"űV\Q^"1",_&g̯&Z1\]8Y#2( 1{֌ "|Æ < :L*3mRB%bOb)ZT;_Bv |JnҴ'ѝ+7KEeJuzZ"W@M{uݽrEї<2AD*PhTQΪql]]]"bKsKu}ܰE*mX~k{@!(q3Ͱj 'W p b _TUUq_?ukhKP^+φ^@)P_zmɓhBE|^+vUqd/z7sVKrRO><Wybia5SIV ?-ҽOʳS"{9GbibQk. 兯rovgߋx&-UTX'2{>IQuiEr%F^Rb߬U9"D+L0gЦE?;}zhcPe*J2kp)H=E_$ty3Շ/{<_##"wJLbz~eδՍW7A0]S_]X&o c稹tb,M5tdoCJ[ϖEfӒRE\krV.ZړX#%a)Ҝlmy7wy|a2Q gYDs[V\OjAbiJ\=^Kܗ,3b"LBX "ҍg'؜ e(4^<И*lРYo,o}^Aft㟀)O2UNvB]la =RKiVZZ&Ik}x&F+PyhTZfK˱(wkR>/ ;nDŔd@Mj{)yHΦ}9C^`aG~4g1̲F5%Oc'JB.&'"ÞwkMtIaPmzH"R*x+lL7ZMurҵ]}V" fhq;@z#c/KT|٪(qk!x@"z5_`ܖc~X[K?0K~m͞5UP{_JtȦ{GP3kY KlXj^/LX>ԟ;h((nt^r  Vq Չy*+" qbggJRLL *z&7tD`;|4itϢ3֏EJģ}Ņͨ:@ŕM0eUZj*i1EGnYirߋ+'I10w/֢Q]ks_rmϫ4tOC{`;Ԛ:5׭^XJDS`phr=[MW:%1cʶSWOPϘVF_Cu6_W:>spaiAG&_w A?j5\r \yp^5YiTRElbrf2Kkn79""% rYv"l aו|vNHCA+s9QS{@DC:;`'a/lȄ+ H"ѻmy)3^xGDd9s}3]’}9yA훞?^5ukWcz8Sr \R@5oS\:lʒښW]۪?xJDj&z''kTXPq^ج/PqϓW:k = +&$ U'I&_^+ ͹'<Vvm!] *[fy4lBINMvjM{-_uщ9CMt4=VM/-u@'>$!-M;r#|#ewk1;O$gnpkd)k)LT:lGYyM Z0:Ͻ?oy;ks?跠,-89Q- OYTz?z7a5ȭm޾U5/=8𫾊ivN3c"2V_z?lq;.zh_ZAmId2q+o>yvƑ#H_&Xýa{~icñȘ´I403tgX8=$=+C)UpxE/ml'T.L~JDu}HQf+wbv%"H<(< ǜڠk0QߠC>DQ;.Le\GwX91Sf8]G%|"+y\Z@dZ,V!ʅO]_9`ev*(-*,Kڻ}2e0r_3ҋI&D""@Ya |44Ya27> &Zj:g*"S2/l={+k#]e.F׼sgKS<[TDf}\Xؙ}V *DrEbU. ˏ܉JeH6 M_D+•Ǯľ}is^qޏ j8B9In-m׫bH(4{On7Y'$Kvu PG@>6"#K8,VՒ{/U8?x_%'npt~͝eWG766կN2 J::ھDG$qեb U/TxRGTKXeV-O3ښQc_Œش&6zfaID?ʣ=H]SKǿwbe#vpw ^=[$*O$ܵfyW;quPQP6uv4o(*5 iQ߶U*$=G܉8*-:}ӵ1=&JQVS6s6i@a+@Aqv|35MkP[|dO[}ڎ]4kd>-mNs;KkP/m:sSQr7سIVS|ao'ybp G_n2l>:e?rm]>c0O]%6-{Oͻ:p.\2JgؘZ$F%v䟇qK>؈$1]1Bnm^28$>eի rMf+T8/'_,&3:-b z!0Ky{fL8xFWk.ٳA \x* 7a^+S赂p#Y=D:;"9P/viv~Ie;ihroGVElk5wK Z Z Zž[>ګHejm6qum矧Qu}X+0&}62=r$97{o8?\VÆyywy|FFk֬s6555jcCL}Ԛ7QWW:6B}^u .9rTYfg:t pջ4n/aMN?kʳtL'ds]v YP_u7l޾{[ϝ;6nܹs?(**BC7NvvvIo\wkMA[&^ojfv]_"G8:6\jAWO>cU׼|ʡCHIIi̘1-Z4gXQQQ&soիfff :=z֭D1i$gF'55Ñ8;7:uT*vbƍutt,//c^zzz쯶ȑJKK+ߞ={׮]Sh;k֬'&&Ι3We|y^^W|||h΍RsrrVZn=h@CCݻ5|F;赂2Ya-]9d߹c Rho~-ZT|׮]vz3xիהw͛F/^x4|ƌv펈x֯_E6le+//a2]5ifr+V, y<eeI&=j߾}{ww-,-<|HXX?,**w/ ,\tٲeKuuugڍ9 ZwHNU禷mmjRC~rHjݪ´5ny2i˖-'NGD?qX" -+QHHƘ1[&$$$%%X,U={ /\]vr.]˷ˀ[YYY}}h/I322HWWb&|O{þǼ²Rav&dEV U J$D"""fX,TzƍsXZZFEE=~^X,V7o^nݬmG*((5faaannީSʒ4 HLDbH*)*)q/::zmaaa111w1 gaOة9oN2P8t@zS7nܸرc/^Jzzzu+7y8T1Nyyyy{ IҥK;:6֭[޽g͚- >T&$Xflll>tWo޼yիW^nnnLfdcc""Ab<׭Tq Y[[ Z\55222MMM\"ݻwΜٮ ]]].IU=2I&666Nm}zބBa~~*Ul++++++"ӵѩ$334kLYY2,=ˈ#ͭzݻw/~СH$JKKGV VP.IRmgAM 7lX_~}s缉(wqqٰaZ ;w9rČ3rrrBj$;v~YYYPPYYYK,5j%(::#bŊѣGXdݾ[uw=zL^=Y,b-[6+0`U MO8uɓ/$%%^fȐ={DΝ2˝zrSRR7lPPPVN"fMz7S~鱗N'{ojm׵c;V1$v kVDb[5/0EW]_*f >[D+<#ID^_(.{-*-hLX|.0|C ҳgm۶~&=w9 oBSUU:tHf455sss=Ŏy̞͛=7{0uKK}暘Tp2G9gJDߺBӃD$I}gr&m۶"JJJzbє) WEp=sm֬s#---T3p+)//W9rHO." .\PjkkO}޲eVZ] q ^rdRQQk~agfdRIongϞ֭[:tp޼yGQѦM֭[*^'$$g+ILLyrRSSo߾ұcG"kڴG⣣֭[|՜V_62.aϬ-$ 1,5l4qݻw1_7(+++yx%"[[[###EH$&"Xx!E))FFFDdddHDɊDe``VUh?~I˓/" kު"00óg600hٲ‚߶mǏk KKr9n Z7&/E?{67KVQ㥥eeee**/{< o߾}˖-|}juu5kss~ff&eddR&Tvya[]ޏ;FW&Wճ^z6&MxO>\znݺٜڜ8qi6mr "}رclmm~ݪsrr+{|v|>L A[ _1ʺqFSޮTuݼWXe;oVZ^!|uXZZZx+==¢j&[pu%􄃉k?q$9#?xrѣ@#yyy#赂Rwi4ݦ_$R1~הg٧阖=NȎBEzZMXbeRe-( J˄c.xPPg̘1vA:;7JHxQTTDD666~|޼622 dDt eeI&>9""B ?PתUV֭|T*%"o>"ylsGVP0j˔g9439ݦA^GVvontygff.]bU.uvv93f6lذwޕm۶Ucƌ-..>}Z(otuu|$[un̈k1d0ڴYg{n N놾7oLJJNOO?~===33ʥBΝ;Wߺu+''G"={sDk۶m6CB+$ _k=u  3!+XyVFFFGjР "ʥzl6["Qzz<33k87_Uj IDAT_5kVkii5ob׮]_h'ԋNN_].)##c…y^^K+٬[Xj+,&&&##UVD)@>T&$]MII…92@ >"77Wez9^])TTs87۶mmT ¨,VB077ɉG^mÇ899uƍ:ttss5jTxxxVVV墸8''GOTݱvssBmBј'+ky6htߋp͓&MS ={aÆU޺u{%**w=w\eȑ#vYu?;WRVV^~ãGO p jjh֤K,&]}8筿x3wʷwE;w\rͭ^xqԩD"پ}[FG.+@oóԐ'xKFa^eo4$=7MM͛N|2ɝ bE~ 'ًI_P| MvvvIXZZĠVVVhuf0фpy#naLwvy^!+IE {h6l8*0SyXjZ]rEFݧjsI=./Ч~\]ߟϟ:{RrӧOm޼Q(n߾#$$xƌ6O>>Ddaߺu={{BBBv% _FUZZJD666Ǐ% [n+,,DS`^+>TԆNA CoE_W7mwNXG,{3Ziii=+Kt)SJyMDs,X`jj:}Ҳ/`OOϥK-[‚hÇ̢{)jҤɼy6nڵk}SWW:6G={Vtt֭83C >П+ҟU=W1YMv(e:ӛVQԩYeܿ66ӧHOOOJJnصQF=Ä􌸸xL;o$ ̄" (2DDAYjU}mt8ZWݶjT [12HX!!42{={3gNjjjBBBƍɓ'kCd2L?|pl~XZZ9+Gq\h O]R&jL8ڒ#1J1.qkheeelRWWW*BÆ=s{iiٳ[wuu544`oj !KRco !6mooR7$kvvv xׯovppPYYYF'O@xa9݋t6QO Q˲m.?~ "CCǏpόIRݷX{&4g~9~ءZ7ŀpѣ=}}}̙}\VV&(0j።Ob+L\E }B.]jn466d- :(=^NZ77B@H\[\74 ZZ!WI_E$[wnrP(@/^hUTTVTTYw*333www1Cfs^^^/p8Ǐ744$0qU cرL&]0 "myܤgbs0҆CeL7ߜ>}T*={Q<ܷ~oݷ555 ~~~r.{￿I.'&&s#ymmgΌꪬp>o߾e˖GE$ *F޻T*U$:u6<Zt=vFJ=C6̰%Қƫ+( ,pq'B^ )j-Lk}n66d+ܞG߭-z;vL&2%ɟ@hr4欛9&rC͛kff& _~({}6  0 uwwG8qܹ;zѣGo [5o܈<e˖hL1}oGw9O:#{L!up5m``@qqラa˷neee=L4_|T*]xwΜ9?t_eFzx-i quS68M2kYU}x"=zBpMMM]]]ÇMw^jjj]]݁  W A+:oK/K^WRyG\r2cwUSBh㤾=K]R544XYY x,@c|>*V&_;U-( 9hFyCMT*U*TW R+UjXl@/ccc###Z׶k0<(!::fٲeD"1##2p-?k<?w\moAʔM}!*c u_ @%''ܹ *zXڬ ;nռw\0'8O7p^>wBEx5A0qN!)EWR NkKwĴ PP ``k&hH6&q@w9W\vIöZ66K.ph4 aڵ C,'%%9Z볥;*T7_>Z':=F:X o^__mv\>~8:. q8JܳgOSw)K@h4Hم l{$Fhc $I;:N5ahh(BzlRܻwgddxy VBYp.,!xd{_IrɌUMEB+6UQQU̘1cid2! B+"_;U-( do@&ZŲZsR*R-kk뜜 -wuu)..̔d!{{;ݵ2Y'BF&$P ysw*hz.OLLڴ='''[[ۙ3#B\n͢RwwwTI@  bfffbbɉNH$va'sssEjh9f'jkB1LNL15fYGdnQTYG{͟?/,,@ dddHZKKի"""(JIIIJJ6aMMMTTEo{{{]]ݲeKccc++\.T@4M$A9!cXP W...55KFٍY.his,#v]ʪ R(C+O p>QR0PU YGmPb';EW*Sze \(B+:C9Z@hQkW[[ݻwazk-׮zwB;w^+xoonn޼yKss3)/5}InbrQߴ 2oZl߾~۶r|qt:](p8JgϞ&;S, lG;::bbbl{T*-]չ. ͲrAڹq gX'a-gP |-BrRw>5|5obf>TVV4xSByP *UwHjOl3q-srr400ե$33S&!td!7DzfyMMTh4j\%m}lZVB3flnQjսEPV`04欛9& 1jU[=('xBB+ Z!E >E{….hZwLGygN[3PB=+̃5?ZB]\zC7uV<pճgBm"kb5 غ*-iM)UG kVI&o&7mzϿprrZlvIWHŋa }||,-[8;h;11+L3;&fn\`0\\F|ɧEoC 7˛ig[1~s( Q*rǏ pĦÇc ç޻w/99ɓ'$zr<~߾W^%NNP =p "g6Qcі$a/Wyw$ւ666ϟ]HQb BH bK:;kkkdP(@r{֪hw/}D>Di/ˮ޷wgJVk_kp8FQT*[J?!Όwԓ{%Ϭ%}=2L&.HP[677722]P("kZ!WI_E$[w龒W0L:]6lkknN81(hʕ+JZD"R("m'ЋUvJr,2WJʫ}^N<;ܽ{H\di{{\.߾}e˶o߆\nRRr:}իB.\puuU(ڵ Nz뭷h4jmmCK`XP W...55ڷ7jT mg52qf-6^^- [Be.- 0d'(´fcK9k}Zڎڢ4uԇvvvP5 '9fsNx/k|Y㍅/VuVSP(6o5O@hVB+0ߧhw\@'vvv"-ZbًDW]~z^=>F4[X\%)9ha-kr۷.]G B8NRٳ'.n?8}33U*մi>xqBl6룏>}ƍ8xyC f 7˛ig[1~s( >W)))ffft:!T*WPP222FcWUU544VTT666XXX ̙ԔsFɓv:`@i9T%d 3|RkKG |kji/6gll, B3f̘>}%LFauu)B EJBl6^۹rP9 0ETv'(e6uT XVp!__%Kͷ2lժU,}_{ ?~h_JF'I}&";suu)..̔d!{{ֺA= ~TQ+*i靖d\96ERB&9{ŋ9Nttttt4T W _u~{a$7؜<2x.3|Ge399oQ*nݲ?ImmY IDATgΌꪬp"W'bA)^jߚިQ)羷ƙDZSxu_{e>.--rZ?9B!llMF=BGWvAY `04欛9& 1jU[=('xBB+ Z!E >E;"`?3@OIKtݜw|eiTO4*Kط~CP5-s$Uh4Ht9!m\iU{1#9m%m6v:|yмWP ܬ"֙8{=yn׿HR*$H_XX"ɧO.wܕMzM///ZuЏ?`ee/ؿJv[L&O>2̽{|wkjjɰʕ+;;;߿qLM ZE{|~hB/4/t*Hx甪xk.\t?B]hQRRҊ+HBqqͷngvvz*lu̮9rhL옘X\IS<<eѢE~R^^^4L&KIJJ1cH0)))ryצM9;;A }ҝ2̰B—B1m%D x0fNk!O)H9s?&VTTK.122D Ν$ u-\0((h]]]ڵ&.Yx\. x<^ddݻwuC  B+V`hz}8/B2|3L&/\8u`HlOkY,01rk?ٌ=~L ՠ>SYYYbXCXŭYf޼&LP(555ڵ~ B>999Pl`HV@_s;]>_J:}-ar.dl۶vǎ ʊRv`VO83Cɾ8MZ0a۪t&8K,zW^pΜUѸرcٲ孭VVVK`<##à`x_~!tyl>ڬbY}ݏ?ٻw! nZ__ߖK.Y|h5V`HAЗ-QR'<)12¥[h% cbf?~lӦ++Blٲ9;;{] 6Ď)B3==[֭[oRR\tg&çoذD"OmM&O>scǾ&##OpppBBBh#G?7 U@p;З?W+\7e~oӍ,8Ӥ-vxHڑU:NKPfdMNN6-!T__{Ynlll<}LkkH$pd2H?|p:uٳ ϝ;U@kAYp.,!xd{_IrɌUME7&ӊd2muuM`` ԩS>={v O7;;;B4uذaOGBkkzIN.oh|P"$''ڵ{ǎ/L e2]*T4nxTjJscB"H yFkkk pxiBÆ 8TD*:88`o7lZ\p5Wg\.onn?~!L޻w_.^/$$͛!m888'OhEd2۰Fu֜9PZ}eVl죥 VS<|wcK_۷l򨨙|A.W+Woڮ\jn555B!JKKK?33g~ݰ!n t'_Ւ%Kfώ^Pnnާ~OSN۷^ti͚X0 ۼVQvc} Z754 {@$<:+SHbuWeV`HAOK\mQR0([~K 2flmm ̙3'-- *Z!R+]ͪL+Wtf%ssj "i޼y7ZI#G@ >C  B+0 @h^ 40(0 VZ  b!;ms'ԾXhTYO!! ,[lĉPɓ'C92VBr<>88[|WV*,,|嶠lJj666>|e`Ҥ#\ [[[+X<O*RYY-1bDTCw\5Jvtt姧Ł$<==t~Й3j[fX믿yxkZW3Hz-rh }|| N>C M&˒S ,-mmtوCw⒗pFJz{{%&&q\*yZcYYO?b2-###Ϟ="HXcǎDu4-**FX/YCW@h^$77 BhѢE2ήg\II!:u$yfKK Bhݺut: !dN :{\YYCcc K.i=<<LMMbIJJv{gg)SxYY``T*B!BHdMMMdsܲesac''ssJLLzB*,,ɴTT<+8nĈ/_DRmt)SlVWWWiiiRR6[lYUUbN >LMMݰ!.###77@PUUթSuOD"Mj``  ?z_-ZfB)GE^oٲ!駟%'88¢-333++˭PQgee˩.5h4ƍ!*:nO||Bnn.BITB!!FO/===tR(uL&{&!d2DBDBRDČѣGKff[%ƍ7X($%%~No߾ݭR͛wĉmmǎkoo+XG&srrlVII{,,,֬Y;;::BSMLLΞ=Oj7 }h 6޽[p 6pH{ @h^u,}jjjjԩS˗/h?}Բe#"f9sZ&O8a9V?#{0eܸqnJNNxB:22֭UUUnnng߿Yldd3Ç'N,,,ݛ@ P*`DFF\vo"ZEEEqO._L$8:r9.--Ս\BD"q…!Hᡡ㝝w>"haa*))quuՆV#GcCBLfӌiaaqXbccC_յkׯ]뀠7E"ys? }}B Ȱp8r @hoo媯 چ%$O0ɴ*)CO{m4 =]vo~ܻnZ4v!q"ȨֶꚆFJ2#.]`0>>孭-LꩫK9̙37##̙_e2و#fϞbĀ9gX{YAÆ ՚à N{~3Op8܆ qjz_nÆ={~ )`@<&ss>[|IRjǼ$---uX,b1vnuK8l0cc#Ͻg<~:N233O8){be2;OBOlkkk&JDYАJv[*<(袨KKK?r䨩)vXuuFO_hiiáwb]P*UD3Jh4 b=L8b>c{7!`3n&ӊ0#bIOO =z4F [r.e?yyl F?mmmFBf jzRI x zz.D;A/ 瑗?a7zZHHHdd$BimmHOψ#/ڵk~%/adI/M:s*wQ?ѱ۔fsIV͚mhh֚=joo/:=D_=:T* .p(W%~I}]t1+W̜9B1؄qtGGGTﶶ6!!J?Y6m4###>3&?NPxvuu98'L%IBs;o߾>aSSzz?7⣣p8\kkCBBtIᬝ2tΜX씡gٲv򅜜<?qi¥:=js^2roݺ5i$2v^v}ڴc֖kcľ2OII";v[_f%48z*"bFgl& h4ڊ+bW^MBX.>zPy]"SSӫWB\njkd/ 1?a7W}^ VZ`F5sssssfffeBz~`?=*7L?1++oܸ14tr```KK e˖>y>@AZ^Z[[MMM6lxڛr 7|.NOJ IDAT2e *--MJJV(CCCF/uuɩa*:nO||Bnn.BIgiiA ܆[nakaaf7nkbb\QQq5#'0pɔd7ns8 ̬3FѦL 6"5랦ĉ(JIII||€0J*Z˼{ ͛wĉmmǎkoo744>}h4 8- ;99䘛3X,Vbb5-bYnyzz f3[D^ k]]rDy^NNNX#H]]G7oh1 FdXeYYY\q'$$`<n`@r B&1lذpǁ@ D۷o55B144$Ic}% c2-U*ǻ|Z8nƌl6Ĥѣ 葑طDuu={~/[{ ^HΝ[QQyKKˈV 7k֬CYZZ̘1CAA6p/*zB+WOG/v: H$.\XYYy:9>>!dbb|ԩcƌ9qĂ󝝝?~MX,VJ ;:rp8\QQQUFFF *wy?X:tBX̘Ly_ hƍ%pz1Ө*[u=z(,,,11]娬:}~tP(shmmP z Mbccb#G[[[ }8 BH7b>Prr{XppgZ^j XYYyyyr~jM;< x8X"fMz~2鑟AmL&@ oeeXXXb#Sϝ4b2-TPL:09#77x'NpffQܻ=EEEAUU=VX1|1d2Kv qJe[[# Rccc`0#"fs,CCCssFuuUUgX"deeMd2ñ Rkk+Ƃ[FF `2S[~ёlnnd2}}}}}}:::ZZZ  bx<}J{=s={lhhVQZZzqo{7oݻZ)))~fX… ~~{]VV;r h4ꌌ߿6nx8++[k'sfX[;yd"z/>ʲ}'0pF c:;lN+**<맺?|w|BMLL<͵O/6ۨ<2Tmm~ iiǏ`ll#޽kff6j('#XoklȐ!'?%j}[-x<.׬Fq-D߷5kV+**w~5k֬TXOZ2xngDO{}?`9/_nWM0>'Qff&OX~fa=s[n566埙xzz@mo^+2 VZD &I$vڱ٬|;; &\G >0 xfF6******9rȑ#nh\i?֭[.Ukb\hкZshխ[=ߴH$gΜJh.@n4h`}}}~~>Iɓ']vy ر* V/%%%аo>Çթ UUUDt4$@Kx; Z Z Z Z Z Z Z Z Z Z Z ZŹ]YKK7|m6^ z[XXTWWݻOPmNRVVaKobbr͛$$$ 8p@@@ԩEEEG hD+xe!!S\Kr9$66ϟߡӧO/^f'N aىWRQ``@@@-*z4f;Du[Ahnݺ]t^pTNNNgΜ&˗/Gk>r {{ssL&;{^zGDh48h##9}333۷޽?~0!gϞv鴡'O޳g=xɓ|q!˗/ ]__ODn:y2*** ֮:,s۷##C,JQ˾`LJ'55%11z޵kWD+@?tM ^#######Zݧט1cꈈ,ޮ];s~歡Ǐ_ 4UUU w8hrZꚐ5j mڴyqrr\|ɓ 7~P(֬3eGfsk VjllLII~ҥ?mXZ[[6_?Jek[XX(JT൳o-[;2TYYgֵkC?ZMMիWNp|ss\.|PPPfǏjhh_?77wܸj5UIIIRtU*쓒d2Ykii(J w[5 ZkdŊ&N x\sϞjjj|L&;r(GD 0aZ.,,T(jBa544?~Çk~oD+-Z}K,;͝;ֶȑsΉQ(ӦB <|L&@HhllfdddbPhiiy7 4QFFF9)Sk׎5MII:tDp۶mկs}fI6v|r׬Y#H=zK qѣ/~+((("bTeZ?s Hu&&3f̜93,s"9rӣϞ=;~xf}쳍555:`Ŋݺu;vG>FCD{{:::|`EǏj5С/8Kvֵm۶DtcǎرcMMMFxxZ600?~~m۶ؿ?l߾>\,kyަee~aIIˇ JDW\&-[ˆH߾}'//ѣG'3bĈ#G655XٳCT*u"52lp"8o<\V3nܸ'Nt>ۘammr% UTTp\" iiiDԶm`"rss>}_l' GG_$"XTTTϯ{K.+))i۶- D"~#GH$o&"///ᾛ7oIOO'"VKDÆ O> yjĈAAy~t`}||x Ըd2"ںukL̵UVM.tٽz?F1lذuYaeeUtt1A{^|-_)x͐iL$\!1..ӳB`RP( " BAD"0;[”211aҌl&W ;;," Eù"**??mZϯy5xr9]RRrY///;*ɔl⵵5cǎjZZm..^(::j wJ&?~B"dee?~w?~"'''''ɓ|lB]kk+"֭kRR2.ND+i߾}qqR,**dBDA</77ںM6ԩSǏ3!BXT__Ǽg&SSSgg,jD9::|o''kWLTj۶.\8EZZZMaa3k655|FT~ͷSN9|P@@૯>}̙33Klllm۶ϔOHH8p : ss~MM *N<$l[[yݸqUUUDԹs޽{gDddd\Wb6.//OZZZ2Hy5l"DLرaNNzsÃ)+K$#RUr3% &tU*q_P\(啔WXX~a鵪UT,+&-uO?-(( OÇ/^駟;wݝLLގ_ϙ3{w޽z*HxMfXC}z0=|eell{sG|r3VVV}Fl3%%ܹsk|hffVYYwyOnmmRݻ-TTT:thW^oʹsΙ3;#hKKO?.^MD_x+V,7&ӧݿ5r0`ZDIM:uȐGsNee%r l#׭[O9zfo9 gjjzkb.^rebb%77W}8V8 UΞhX,w}_}l6p8ϼcvss薹Jqk^+= S]]]__| ,DkV?^+Z]~… .}ϵ@@@D+D+D+D+@@@D+D+D+D+@@+ G;3hsqܮ]&&&t:x<ٳwf޽;.ztV{;ãM6 QQQ w_i#OHHxfll;t:]UUUnn?|o//_|Yv_p۶mCBBvp⮟={='|W %%Tsg+WjL~ԩ2|\ Z 5`˗l߾C.^z.[cgΜy|&H_ Z[[>|8==C _~ݺO%Τ[niZfaT*_^l }CCß~H11))) RT666.\P(h\-l߾%KNsα:rhxxܹsbbb ˌ3ڵs333;zSM P*u+D"r̙>㒒]D֜9sL4iׇ~Frttd)_ucc# گ_33naaQտ޽s0}nnn%%%JMM%Ν;Ϝ9ɩqq;u4mZ +**:x`r̙ݫWƋ/>~"(11woO+6mfX6mܼygyԦ[;^,Pb"##K333khh6̷ZqAkk gd\rd>}vخR[YY\ Rfm66|ʡCzyd+'&&FD**dDdoomۗ:wo5k֬[>-->ccc۷Sp8@D]vMKKy󖵵UHHȔ)ڵe={<|IL3g} ǏbK@ 䱱Lrtt矯Z\.?l*L>nڴYӱ,)bbEGGXwߝ{}D>\PPس~~~!!S{knN:y={[UՖ[/oiieύeeDԫWϕ+Wùmۖ]QuuuXoiYaÆojjjbvtd[\6uuuLy)k F_lpGy( @y-[D˗oܸ199ԴK.{)(( ;N4O?j^|F ƍ;qN 쳍\.੨rD$ӳ3طb|-[hС"XR;;;1!"Htk׎\z  ;~!C;;;Q%IZ}"zRYCCC׿77sѣssODdӳk;x[ǎ_tZhޛYWWGDO׏u27lttt裵boiY AMMMrrFi^K"eee5fV{^NY'**ʙo& `FP(nB%'XYYM?R;wO?˜@?c\\\ EFFGvee%3D$2Q6mqF1}wu:X,z@HT]]|>|TII ŅCyUU%$] >|D.3?21cƼL}ZlaaADYYYdmWFEEdr"ruuuvv үomm]XXhfST*ʕ+GHlذx/(۲ ϟ[l7(7RRq8`llt5f׮HȨyÇ,XЫW}wؾ{&|-++ybW5_d7x;_pڵkסCo`-Ons:t`,KFFz~}[bVk2gվ}bR)X0cFD$vHX,x|>_~\]] .]po޼yq"رݽÇ9lvNN"L&Ɉ8;;?z~駲Э[h⚚":w?x1ߛ޻׸qc FIIIezDt;w}yp3[j~Ff I|^^^cǎaZS3 bfeRԅ Q;g̘^XXhffIe[V!! Ft䔰aÆ3fpTڵkי3g ||Z!M69f3-:Ν;ZظND-ghhL{j4BfGͻLuJKK.\8x1cƌ9rժeүɚ5kT'Ovrrz~;-Փtt4662Ý-kg~ <2^9)//wuux:yTTΛ7ƍL3X,V}}…N 1c޽ 2fL, c7:t044d=zO?۷cTWWK_N{?~<##cɒL),,tss----;ÜSNntbm۶ewYV)Jݾ}{ŊO<FDEEENNNEe^d2YBB/\b6R__ojjV|߾}7n۷-3z<}LSSP...jpfmmmry6mmS'*,,ҥ3KSS>IC(XPPHDRi~NwG-ݫ@YZ!x_a;u:T*}sH$j>s%77pԨQw&s|͛7t\VVfcc[^^չsgkk`fM6ͷ& /]kQAAA]]OMBhcۿ U**J$ oܸ/%˷nbʔwrG{ɽ{w^lls;vkRS<={3RT?w;88蓖Pؑ$cjjZXXrt﷨<5n˗^:44tRiTT3}&77wǎF(5NgwL! 5{vҥ766^t/ػ㭬T*ս{i'NdM8qĈ ֭[MLLNCCsAe[B{iddT\\_^ti֬Y<OT>z >}١M={ 2ȑͫfll\__?qbE]]D"o6m:kժ*b> |iiL4BصkwAAڵϚ5kP,Lֲ:NNNcxg϶RSSP(233Z"JIIINN:u%$MMM YjuezXRR'0r|͚5s5/vj^|F3 HI~SN2dѣܹSYYp\~  2V#G5jp : .455 M?ͼ赂?ӁdٳC5 2d*Jw3f~ EEEGEE[XX0w'A?G'///'cbbO<6& s=o@/ ?/ Z Z Z Z Z Z Z Z?R``@Νhڵk׮];[ssZ=۵sIc Wž<<<ڴiАpWºu~޼<޽+77oݺur]]]AARYGD!!!cǎ8\0VcX pwr>߫We˖=z̙3D󳳳D"Ǐ5_>>Zotsvv.((x2lݺ%%%_mQQD+Zha,Y"w;wmUUՑ#G#ΝP(B-ܹʕ"C/^:q-YX(ZZZ޿ nnn!!!"n[ZZ~w˗x1ZI9~OR__豫W:1ԩӞ#FEDbviڴWTTt"_xT*%">33EVikkbvڝ8--->}x"۷ϔ)S?~sg8:L:ɉƆG @ozK %oٲEVϜ9C$%&&v$w޽bGGG'%%wmҤ }쳍555:yIX~… 3FDLXJJ s0󨬬lMׯ_eo!lllbcc+**/^z"svv޶KNۻך5k֭[r ,yԤ鈨k׮MMM g}?pLgϞ˗/?uD=hР͛7͛7ŹC۶}Rp ZʸqN8邃?lcFF5˕H$DTQQrtrnbbrꬬc88ŢdfO?T"ر)///00ٙUphذaj"gȐ!W\),,{8txJT__SՉDygRhծ[dIuYYٜ9sii666Dt=};ƍG!{|ѣ8|h+qqqS(D$ ++++**BP9991a!JJJH.$"P%unݺ&f5"R*k5Mcc#cfGGGw֍ بkjj]vo݊gfddt񗩔Z0!XĤ_~6Z cjj9[./**ڶK-ssse^tp ZY틋J@`QQ!c %D$y<^nnn=z/(%l:Ea;99dgK~."h4%DTSScjj:tВ{p8cǎ=u]>pͨQ-?y2 L_ tϚ/tppx3ZmϒhlT3^) )555DT^^bkkT*;uHmmm͛wƍjGGL߉Ab̙?G+Q~~JwnqfL5:))$ u`qJҥLنSff=z0ъ~ݤ}bbbKV\ 5' -((ҥKll,S}No%hguuum(>>wXxN;v&"Vzidd\RR\]D‡P(է|qƥwss]b%Ҳ{400pÆ Z|РA馦zwo`۶m;w|sn߾Lr&MΖA}155i_udoIDATիWfgg'BVxUb̴w/IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/generate-clients/image08.png000066400000000000000000000725031461403617600254140ustar00rootroot00000000000000PNG  IHDR"'sBITOtEXtSoftwareShutterc IDATxuXTYN39( ݺƧk׺kخ "! Cw 3LQTq}>ܘ{{rB@!k(X!Bf!BaB!aB!0 !B,B! B!Y!Bf!BaB!~0Aer)V B!~tw- ? <.`TB.r3^zix_+G$~.o@FI !B}6F`Ǝf75zHK&JD 3.]/Ӛ=Ka"B;>UcW `MnM^˾P4BVm2CR?g TX`o:Cvn\<5-νcKB!P¬qyЇ9>MIwL4 Ƈ$XbF0(YN;n1fQ7_St|/ >K傘/RsO2u q,ꩲĢo?j`nDV4k8VLŲ^o?ʱ1!B/gѶ'P)nt~fdR$=ͨ!/G a|ځkO}YꑒAլs-/im^nvbHys-|KΫq$QA4h*0ˤw1V ˆؖB!,nr _PI^tvg"^()?uPS\uaQYoD>@v}QYxST&(oūt]t^D^?D\.D". *j:/:B"mH+َ}jci4B!Rܷu /Y~nP L*@W] B \UyyY3)L=s)C,}T$aKI={tQF!зEs*UXBnɼݗg|H^LԬDHH R Uν+HpP@a(N!d^cs * o |#, @*\ !Bգxu]\1J XFx[+S6x"\U Z,N3$bɋͷ(iqDҋm0Bm¤kj{ M(d_ZXYp~e*yk_9c!BCٛE %}VTm}9U:!e[s-E72IGwD^>O,kcFS,W1߮yښ?VB$YTʊ=ȿ BYɽ8B!T68^jr\'`_I/X?da! Bf! B!2!Bf!BaB!aB!0 !B,B! B!Y!Bf!BaB!0B!Ѱ !,B! B!0B!0 !Ba4H:[N`9 B+4_'C^- b\]@U "7u?N؊z#' Λp7|l!Z,?֯٘9ݹd-Gۀm pPPeO?^u~CQ _~wŖB+fI=en>>LS=\-]W77y-BO8 dA̭&32:B!BE͆noL<$MN::]Rr˝dE;*S$Q^Li e|4vZ7k }(vqr$Ac tDꙧѢn\u_&Dsr0o{}UE}bHŠI1/`ߡv6w:6&'V !0A[t`'{B%N4&Vj̚E=~4*QG” hhm "op_w]HwxBӾˤ%m~dh[ڳ CDz.Έ #.9ò>hߟf^e˩}x9mmX@SAb:Qm 55*BF"$1na0?sR_! H%6VE~WRR+%4ވPTc*)]Yb(#7\܌-~u/&8>:^-Ȃ iFȥ"fnS̴-|-K$5 yIABg57$;zpaKgB?:@SC) mH˔Y=mԠ!ʌ}YO4\yIeJQGוյtq6BOWS%WQ$'&AP}:Kyrwci!Bf5c/oԠG>ܝW\!'erN6.Tb '_Tv_&N XngQ"iBDpn :_DzqAF$@2Z>8Vƌ7p ld!S %C;m$̼2`><ގ:c*Uxu]XġRX'j9DCYICCJ[MulJi.>.ݸ.>;x1w Iic='Ri=*⡛ǢPU>K>l+gv$X0s_kOjK%uߧE,o_] $պ뚣S8q'Zh;`ؽc-{#Ld!a6()X/\ZNnFz8Mu)15?:$A4ά|G}wz jh&fR}9>{~hܷl]B]Sst{@maP-`u_=8&ETk3^8/Re--ԡ]uCA};75BEc:{Zki)E_=ݔ]6>zt8Ԡ҆ǜaeز]_v˅(kU'Ir* MSF4*I$a1]ZZl:RrĖ} ߈_!Y:CRwڔ e܉Iq{IHB E 2fyJLGٚή|,`Ln32?cgn`?fNV* YYr3GR3b9lmx 7Q9g&Y՗Mhη=Co-ܘ!hMAE9۩"*,'$6& ѣ3q?ĪsVhW&< =ǵ_#rYN\þcFQv5䶚:l$[K]:@ p@uRΆa='-3vvv&PPԝ@[rwN#qoMVtyI #TiEn["HވT}/fI}BVET9k Lps#{HfKN3wKhFKO(qAio sv&H-vLv=2BUEbe껤mQvc֌#_ICq/&5/.R'Q3VyWYY(yn.4z[{gۻb3sbN_u~hw}rqyaq2N6"}.367%T򇕛fceؘLxz'{8|z39jbHjЛ?piڻqۻo?#16|L#[]J“/jh z{Sf+hOOfVY{3[euI'XnnUOē^*SY*u[iι"_lLԔ-w8ۤL rDL+=M*ޠYm|vj%.2[T4ՙSFRZZbB/,}K^aqfN?] q0Ki0Dف{N')'V>8ͬ* AYz]G2!Wxek&b6vA:@^gc@%p@"_^(I^s]d$~+2 w];ދb&.4yf"q봵+Zp!S>{S5-/ݮ1,&7˦iB!aB!Џ_ˆ cp׶RgJJʶ_* c#BIs5 '1C<׌"B!Ԅ~AX`0ZB! >dv;4T;pB5o:7K1usu娲dY~zodMw=Qˏ(SBM{Hm 3IN_ MfԩjSu4^I-R!5B!ԔbE)e ~iFiU\d5WC4V>UQ)?B!̿87Ar)p?,{+!B?eEiD nҫځ]?֭p!BMYTn6Vƣo*|*J '̞t'O`|O"B HC,OoDi43F_7Bc,B5o=hHn'};[^E'@ +!B7͒iӑ_5u#Jf[ pO.N~G!7MPj6zշ3^FB! B!PCPB!0B!0 !B迍efc"B_Y!BMfL e"B!oެojX!͢]+Rz"SQ( ߅&sֹj?_L4'A%}plvqvʑ&lZin2B!ʌ@ ¼Y#:{DzIcץ@mMDX>M0?s4/uqdP$2 V!0KK\,-!ǍYs~sIJHȐ[ U P()fN&,4%BiXt>1(\&^`Emw@ slrf ,j:VSIhc`C> IDATd_PR3 4rʟ[=~$c74*PK 8(?ֵ80VX:Q/Mz@9kU)fN@Zf)(-7B az!WR}L{kov\;?4LW$d.kO '2^9Lyn׻=r&oZ␠)hf'* 3%v.4J#]oz[bfheURq'[b<')Nz<[(ɗf8髥Ʋ's\+$2Ej:jBBB!)te= dY iCwJv`Uu"&bϱ@,*U3"t$ M& : vV0s7R=Foأ)i+]+ iQpuS[56Q e2?HA1E080SvR5GJKMghq<"]V_f}yD! [åxWw=&wj0ޥY@R$\ t|~9evD|&="HRM T.rϳefgAB%[eM2&}f^rŇ`4Q="03gVg.TOO588nBa,|k/lC }LmWxPHG˪ U35(Y3,ݛ~.Jfx3#ňH=~Fіzʹ#nWNB%kQ) .?,{>/)tiؐId^wGF7̚w*P(WLYAi&B}i ;ԥW},g+?~qz0-He?wsE,xv2gf/=5%}û?}W 2AdhNtU2ٮkG<BQH'+ש9Uog`ָ`/?q d2PQG 32p 88o<`$,˯,UwL`pO=Jyt+s . Y%,t4>j'ݟ2 d嵥Njl[ 7KLu*g#ފsvŢf;d^1h/;sE?&H :cYNK=H[ۚ(1XLjg-=QkpT؄ Rd1|ڊmvP)}y[.0(A:JKUKsy'nPWəFq=oGW臁SQCIrI=xi%c@Gbx#6A58g^Kbx84Fkx):#:8{n=+̟v16.-:vylz zP:ǩ<={j7+I]]21˻ I(*=RUe5bVշd%WXSajk{AeY1鹭 곌I ('fR6f$A !1lLɛl~vTo~QHjFw#-Hww~e Tb$t8C) JݖOPfя}|lL,&Va)$K>=r>=m;? 2y_(H,9~|ӝޫlȑ HחJ+6Ҩ3 DFYEP4u'Ih@*+*TR1_Yr5>wki|fç/x88(xPz/lʣ$&f;r³ j+wꇞƤt5** M:%2hTWV_^aِTX,w7wTTn޽j)')ʵRGsU{BTV Te%F?4D۱% z=25Ŋ 5CFStf&808))dr`->HԏtdZg FgO"O{beeQfEI噅;8 4M3P}3e*f?!s KP%f?<xkaj.R,z'fQ)@JU-U7_vkFM @.8ps(݋Iqm7TWHx:ae77Pbަ:XXtkY5rTnbfPV&vL @K]HKX,jJ2qζՏ/ toB1!Pu؛jio?Ԕwnmǭwk#{7Y賔U,?9BtpAB&Y.։wB?3S,m`oB!Y!B?4DȩqlG^LB`oj5é^n3VĹ7+ѕug ے>عsW}R)!п{PC)1Tzj$Ɖg;2 \|lfWO$5ZAAA-677;wΖ-[rssjBa~lS;/c3TZR\ũֺXvmkR?^b͜9ͭSN>}F^^L4A(|iJONW{/.\|>gX8Si\Iaa[ܹׯMLLLLLݻ/5jZAA7޽ !Yq,$2(YCOgKT ͣY+%3Oì#mذQ$͛7j;XvMhhؒ%KY,ִiSǏw'O>ym#GjH8Ԕ|'NFDD͛7 mݶm[K֭[u떋***rww޺ukvv6>BπsPC _uvBN̮kF(Pe:y9$٧gѽ{˗DEE%$$\rjT*=rHfffRRA_7C yٽ{rssnΝSRR "##|閔y}B{P#$o본V/*9|_rn )JJJiiiii]W>:+Ĥ[nU[bU/ &xاOEFFd2}Bf&'D\Hɏb𞻫;$k~No~Qї3s,''''On}X!  gɥ2JJJ⭩)jWZZb>$ JmTj<%--޾D^:v\\Z76%!YͥűꧽV$I 2¢U}\.9rHEEVBB &d-Aj[uv9e21d#MMr@ pphAR?-Zp8[ONqFLjj55>0###e˖;v$͞=K[[{o2e2B! Џ@.stW Y?+e cСcG/^Iⲳ;vxۡCǏ+^'''gee'&&)IMMy <|HFFƣGBim IDATBBv ...'NLLLzٳg;tfBa~-61)ӤBAz㔠S8ph̘۶meX]O<VVVϞ+HĊbd(v|t>SlOMMRX_!0B? ?v+[N.EG.!>2((ĉ ,Pl)SNaaa%%%}A!$B,K;4YeVR%Ꮜ͗W6t9_QQQ7Ν;{x?~!xmb055Ul733S۷iׯ'I244ȑz䩽 Y,֖-[_zUB\.K&55MLcݬ7lU444=job#33Ӹ8, `ojH 8@NRF1BB BWƪ\r)735kv1;;{b #`o8! {B!0B!0 !B,B!x9lz~J\wE۷Ǐك'"QձPKJJ?ڨf8}N >:RRUFBrs``ŋ H|*!444 7Y*=ZqzsijR.ӈc6eG3'bB!B7kV{,CZ^YD"M4!M#j{$]](kii`!0 H:;!'jf5ru(Ų{l <?~4^VV֙3gD;w޽{K˗/;99֑6XN:)v!44LgB[pnjDx͕{v}*UE%gK΍k?zݹ{/˹H$BF,jK Y3SSӚ!D~¸իBgg»[||²eX[[WVV>\׍7_b3*MEEA~aDssR(sU*---nB"1Z{TZTjRoKOOW(JRCrr2={qHkǾ} rq]T*CY7w2Rd+>>g={8tP~ fq\$w`&RYFT !FUoQFn׿~v /3cǞ>}(33̬v}BBbVy: !xV/zEVmuZÂ[+\W_7XRڵ駟[`ۍY>|8**v}tt1֯PJBB;,X⽣Gח>}133}[t <<ƕR^}_xbog[wΟOYoz!111￿Vvvo{&555֭2 fە,Q]j6o*+skڴs=OOYx5:/LJʈI;('|\YY_n啓K;xxxi<i@ f@#Ej*1?I>:$~vzq xzzbӦ-iT_4]p (1}żYzfIho)/-ij6W-/>]o?: sww755pne2َW\h֭[<}[{䤦^Bׯ_ӧnv횟6]:.::zȐ!EEE/B5ݭxr5k>`SH[[ 6j4-[>#3B9iĖ-[j5/fYKx0oM>tNش%a߫9Ln}tĭ1&>>… f ߞ2eN`ԨQ[n]rb7U9s渺WTT ,Y2gΜ #"">3͛駟:uuƌ˓:v8kƍcbbJeh ++[={NVVVݣ?ϟO_fYvLx4 @$1_DjߩSI&f慱_ֺud/ jѢE퀖СCG"0lڳukڷжm{ŋYzNP4kL1x! ~?_٣Vjujjj֭݅Ν !0,a&ҢC{[N^^TTf-ԩҫKS%RƬ͛7Z"!5􌛷w7~t)!1Z+ju:񣹹L!܂j~YUUeggwϣDGGϘz``ό#W\w+eCH,*27Ϯ>ss羥P(ΝT[ZZnDrӽ6JU1$ ]g֭{Da5 E||Bvmt2x^Mו0}eYY߼)cIM7 !Ǿ}-Z EL&sqq1~tw dIR[[{-77~PV+033ҥK}ˆsQYnDj0F1p}ji4R'=z=+]]]tܥKEvvv~.v?zh77-[ܳF)))ܹL&'OرSNNNi)uO䞼ue'nFCLT_d^EFuW\ꫯRvOpWz׬Ysk׮yyy_}mΜ&66!βÇKYYYQQ{#o޼yܸ,J:t:Y޴...޾}ѣG6w`,Iyvw4à^:0'.mƨr*oJNc^^O-^`,<4f=tvc"dn-v`)cuQVggg;;; _}D3JNXĻPf!vvvJ2:::115rpp(++mآI2F~͛;m{+~іl: @xYS9ZM2_CM_|y@F2>mwpOFBuN=uӋi;y,z&]ZYTw}^iƟ";yh㏋n3MFoT*?pKj̳t___!ė_~{v˗/ZX4t-x<նEӑ]kYwĴwǨ*f^۽{@ZZڛoJNN;-+ qk=zYv *jQƕ]tJ MC3gYSi*+4e_%mXpNѱU;Ut'u:]~~~y"qJeeee\vvv7.VUU)b*MEEA~aD< =o(Hj+ԮttMC< FirT*uqqzP(jG¬7nLGYx"..NT-[z74))Nয়~֭ɐ!CjGxq u<+aKٗyz~j"+ C}:am>~ݺtQhO.-Yl=<%///4tдi\*4tPbA:c4 HfէΞ}Bnri|z0s-eM?Ҝ?Ev1-hefnec ͛?T*Rtʔ)~~qqq;w~ij1 [\m[iu]KJIvziz֪sZ4i xb0N_4dKJK;qZ-pskQTBGQdt'rXR`u}llluuٳ<==]]]_~%OOO!D^^\nmm-[((E;;&M-133_&p+ڏ֖v/uZ|@axVz@~n=Z[Uo?:.9DvÆ JIII**77iI8|&Mj+ 2j}4ҥ-Z7nlXXXVż<: @x$n+''[t 4~]Jiii[|T{C ,X0W_qss+))?AII } fg5}蜲iK4WGsNҥ[cydd˗-h4;?ckkT*%NWqƂB3(--ep[[wYVYY`Yft:cD";vlt钏?j@L>b:Bѡ3ԾS~L cv֭u_x }F#|q}MMͦM˅III,fvW^-..B|۶}陑il߾… B'Oѡb&ҢC{[N^^TTf-ԩҫKS%R,=33˘ׯ_߾2Lq D"-uW:::,! fdPޭ<׶SoZ #5H<2̃K.cƌ^j3gjI4͈# mKu:msMו0}eYY߼)cIMK9<=[[핖vjZ֢nZ]%0rգVWݴ>''ӓ.j1ZNUqT8w>e[+VWWϞ=_2桼|Z[VYYyQQQPЋvvvM4[ikkcff&KJ:2s:wrrСܹoYZ2$5nPVVn\;{C[V-p~Xuq #=6cEQ[钓Ok?lР TRrss&OԿ 7i$!!bNN΀!FС}G/]ܢEqƆee]B899 80;;;;998=sw> 1.#n+''cSftڼk]ܥSUYYǂwb@£B":C&郊*sVYx`(9cIJlڲBu~M1 _h7 Y,bYxHMoL g|qTԞ=??~mذx:GGtXN/6Ye'zs.w믷;bKMZ ӨN ifӧ-?G/Zjq {USSe˖[K"Kccc Njݺqe>+W|GRAW}iig+:p ҢC{[N^^TTf-ԩҫKS%R3oGt]\\]wuiiHi\SU2.;;;JeeeeCTRRhׯ_,< ûGv2`ZsfٛgWfy\tmz}rD"1 {NWc fᑡ/ IDATוۯTv2RHVdfuv0.;884nܸnVmmDBCݘ`k5:Uō"Sc0;T…̀'''[[xRBBFS={6mڸ 9sy 555uK^UuԔ?!3~A'/j]ɸrc>U?W|=|W3gazSS1cVTTh4qEF.211ˋi8qbǎ'OBDEEy{{k|_{5ܺ/7P -//ڏM}aivu^ps6NAcT9g7Wd>?LMz[DDt𐧧ʯ* tk$!spk9u͵3L=̬wǎ TXXtB&] fg0$%wgmY:?B@@#G!222}zo@L~Zv,b1 ,۷oPP[lN ^0iӦ<B.w7o?!!VQSSi3g:u*))߿q/+23 ENNNf̈́>x`LLLAAAJJ?xh` r bE$2nN}ה^U]_(붵G7J_~};::d2!ĩSUWkZmN7~47 !r["//X3(Vk۩ˀi-ΑYTd$go]}枕z}ݏDѥK1cFZ̙3jzҤInwڃb֭{D`&}Jpnq,Ȭoޔz;JK;qZ-pskq*>>>'ʍH VSU(29]O;˗ݭknѣGl2$$$$$1wi4FsVsEV*-!OOO@#B":C&郊*sVYia0$%wgmY:?&?^w/4wǛ,b1 ,Q:f6}N%斴wToxick>z-9?-5EE>OmʶǢT*kkkOOϲ͛?<{H&ر}ʕfݺ666^?~Ė-[*++|͛7+;z2ekNNN/1trrڴ郙3ɹ ;;;O8׷_⋭jKx0 <F v]C}o6mIإmXBU9ev]eV;vb}¢nQ&L-*//BOsppX6mZO<ɸԩBC|硡BC3TO󳵵5n3'''''.',"#)gϞlٻƍGdڭ)V|I;>b~aR7s:k׮uK:t/UUUY:u23Ο?W_unw$JzzBѣc~½zٲeK^^^VV֭[{%H<ŗ\Ztho+t׋1컅:_SzUw}ijDj>V( :ٹ͉'͝.]2~ɑJCMz*Bkݺue̘Ç{*BWKG9z=OX%''mvذ}qvv>y T ӓP0o޼YM}aivu^ps6NAcT9g7Wdi?oՂ?,\qq̛GPaA12S\;}0s͔s#J6m:jȼ bCɉKRbxw֖婧zeWcn4'7 !1 @1 oW/zw:0|OX&EE _YSQ]?*ۓ[?ǥà\77[YYرĉ 9sxx+2tg}VԖ^~_j֬YJJJEE= cx<4̛j$vpg^ jtZ!Ď_7z 4SQ?XdnnhѢ˗k5ZjSӭ[N|9L:Mz}z}>p $v~;v5kvƍ߁111BÇxefƌzx4AF_zvꋋFv}ݶq3I' vi%nk>⣏>KJ:Gq;v?7n8uSPرڵk))'={juqqqjjj֭w޻v>{ vM YmՏgvΈ KTVhʾJpc7'W^UƏ9ݻw7.o߾۷}zܷNڸqcCy7~ZUUegg'nԨQnwKss/hJS}jWI*40f H ;XVV~W NN z ^s0uϨw91Yk5:}M7jB33+^U8;;[XX?lqju 57Sӿj LRyxx?>1 "#5iHєtR&W˯fIݺuի׏?(pww__ᅅW\ݛBd&&5l0~ü[jB fg%~??OOWdeav[5?,S͛77~RqBFb{'NXf׿X!DIIqAAȑ#U*Uzz%Kkjn6}`nn^wB3f̠A+ !N3i;!<i7 Y,q<<Kp@ 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@ f@ f@ f@ f@ f@ f@x?axIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/graphql/000077500000000000000000000000001461403617600216525ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/graphql/image01.png000066400000000000000000002724651461403617600236230ustar00rootroot00000000000000PNG  IHDR4=esBITOtEXtSoftwareShutterc IDATxw|ǟ~v齑@B/RIE+"liҤ( U5@)RKH/-s37;;g}fꗗ   Bzatm,b4*X2,avaa69   F***4]Jj{il6^&GAAZcnnn~~~+spphҜsګ4:cc#  mu´LLLaS  ȓ gzÐze(fhV j@sh6]uz^c\CVV&fAAIG׽+cǎ={mܸEs_V5kر lm͇سgx4}[i4bQ4x O.D0 4j5ӡAA)aHCƎ~Hs7;Сl~C7osu@( xSEhEs<>_T <̝zVVvDgg~Eb3 qЁC̝aFGnKbS3S O A%++ntp8gshp8fh/ Fbh/l<j AAL'd5 ӌZ;^~b ] EvNCw7Jkߺ 3C 0piǏG}~4Ò .&J `9Y9Ym,z#!n۫uk\w}ontV{[[}b# ?gʀ@{sRu5߷UYUzlGCf>//xgHN"]aҩm߭;zH35#OuN5W_qQ7c6RNc4PΕ}六".$?Xcb%1 ӨTr\=b7z<>;7WAy>iݞ:\7H:E!ť$jc szpJޣY"H^+-OMdOlݵ:rd}75~/K}xsVձes[~q缭?|||ͷfh*h9i;cS]yvKL5􍹳ޗ&tK $e+CU{6\b=4,<;dί>t 6pʊj-y\VnpoOK@u#]i5^A8:V7WG+21!;cO(OCuSIywg8*ȷ6}lw3[^UlPXnz&mM<<*r!虯 75%Ҭ7,}M ~G7hk ǻsm@(fÞO޺jݹ e?Wü=MjyV9ۅEsV](WM\`%A$ȺXZWTR%Sf!ybBRpH#zxfAAV\'ֹ9跿?n;]gL@4F,fspÙ_VZg&a+Gt,д$O#u1&'Db~[n *rthQ> IݵrPYc-r?w(Pǝ/{:dh89]+@r]K\(EB%;:T-(EC 79r#gׯ8rX:+T  usG;gQ{oרF{mM*udKYZp4-'7P$U?w An^)CS|I F1NygN7}nڤﴑ/Y+ ɄW5ujC26-p5aTX >y˗uaak3Rt\No1kWcZVkjZVSq[_[iN^Yt~oua['e>޹%d,C42m#~?F1˂iy{ OD!  ?X/a5xHǓ,miəSvߋ)VMp)+9鄲ǻTeCVa97+.YrOO/n-YK-Ys|NMRbE’+~ vM{ޒ;7:%0!P6|'f2j*#؁_\jٽiV^ռ;#Oc! 'M4 F,.9?h\ySWy tIY>-%|99"XVia-\8mђ=`_< W|UI5.C=kc&1"m՘ͬ$k5/%C넓'// 'w@gUW4#KK,lPYr}H/:Hc0Up)Lwan P K)-iM!`1.OyޜMi  ǂ:`/sڢ*]zuoV,+!=*O| @ګ>y[yCg'./JAr1v *oQ<4ϱEg\?YYZ_n\݅5XRi #qq2+oge%k9=]L^¯>;TŠɞ~p S0{_}q?gp?M*  +E6V|Manig :Fě_MY|R ]]eVŎp_}8ڂ_5Vɀy6:~+pܔ˿/da0S`Oյ?6H[c}&Sre5_mrg0QJTIŕfh _-/L7kZّ)o2免i#:17v߬`@xI/hVEA2BK$Q2kZhT*@?qAA{e!L70WR@B9 Z2x;\'aTS%<]6,J۲ᡠgAAuz t1Iй pΚ"~o3ef87W1c4 nn(w]_\s1F[_W>锊yLLEь  ( OGqAiVcB!mb]rFь  HKu3M@ȳD]-E3 <ͦ@3ӥ ҹEꙠhFAY7SG!fvi%g ?  ϧn,㛑g,PYLj{뤠bFAY76W D <ݢ}_C) <M4ȳԔAiU7EQl6͢<e4gn⋄l.WQzF# A  ,l"-slEDA)ߛ3AAiP7#  fAAA݌   (a!n@AI( (]usB3zVAyd 耢8l\ usGZLP@AiDa n juz-4UuѬk@E3  M@qϸ`4Z^G݌z^V8@ь  jZN3vFP(sAy6e9hy*ɪSTAr8gϝWUXX,7f;NJNNLJڳg_Ee%LyP4J# AA jMsk5j.GCerXBBLLMlkgq0"<s``{wyMJށ{xoV~׵KI'T7}sbMMLƌɉI{qF^]+hDŽعoks œЪ{l%ԡw` !$6|33=n|yK+2037/))l,/)cl`[['a蘛h{wA4wG@jzw߽{{[Y4q$[!zC]x5jXap |sATdiȾ&mrb]ho>1֝o߱G[Akҫ.vV´{ɧcTˀA=͞Zmh/Q kOYbQb[~| Wvrѽd#Gw:cKtˬߘy%zPæ#AY y%O#؏z0Wډ>zzt/N>xp 邸G>5һ'wHeΑý̻gKSːaaNVf">G'/w֮+H:wؽrvG1"w\3ּ#Kqmp2nwOVSoNxec&ASzbׁB]D|JVyl,uAcfDYW.eizN$c5OQUk9Z2=pxҔ_9dx?lL^(J$MMbSS o۶?Y5aWVV*e2`iH$iS&9;maAM[O FktA4ݮʖ޺6"## CBCbbbZQ ܿZ'}݆6ll)҄944v 2ΐvhhXY[rP,uBu " ;&/=Pѯv׺:voR~뎡V3דGv򷡯ꚙ*6J_Y\OMTΒƗPvr)fCdŬdӖ{wJ- Y$-pɋ$_8X>(^£qlΟؗEY;2|D-%rps1ɉ9tH˅J pΕ-a6Tg"kV#Q^H|q;~?N<)+/זB3nn96ِKr\7Gs.{{eeںyI-%fJҠjѢu=_IxB!1=5qxa,{SDdg<~NV5,1>Q}+w]A;j3;Of)LC5Wvѳ==cQLN.c 265x؀։l1JA%8hXg *߱Gt؈[Mw&(|tɭԠWNggP ayܜORҭY7jbjr&-L \gmw0ż}F7k4dmV/}b5X! 89]r8aSF֖jʺ },'ۦovvKs",ؒi`·\Y334H<["P7b.y0xD IDAT4U'q=TZHLɊ+)3.tyuJW ƾPγ ъ¼Mc[ STPc7fZW+75.ý]XI Ty91Mɋp&dNeE ;*)u󙢛GFzNsD9%&gU\8_BIH߲{Rj6sY e6dL0bCԣEIxK~gJޒ]eH&1cIM'*Js:R)i!Aα2@)>FW$IAF# ɖH)/JՍv7z6ݼxuh3gG BB{>u{vtws{^CO]0&ԱkjMj}׶~9B,jM5BO̿oe+mɴ:?n\o,-mK(²˫E}o?"Yӥ ,M)bMΟ_}st:"Vq@O'v}yyn1S߽@,c%1ן >dcѥVQ+ѿ_x\&8<oChףs%%zduv޻%<== ǎA9w\A~{#.ZzD+eNnB\nThFRIJ5XtϚA9,4DgTj ߙ4iIk=zoN;2iYIY+5פUpsc}: @^!NC-\c{^my:cw\TeI-@:wCvUh/ej4'w=yߘ3y i^j]gF’ݖ&eyǴmÇzLQ^[DwayA8N(+121JT9t"Fnŝ҈Ql`)Kr{Vh(ˮx-iP =NN{Cv$%4UlGصZ{{m9zDt)<ʱԎ0{#lhyOy\^;~8͢h6a֨!~Z\Sgξ:{晳"#KKN< Ç ۷N?~܉1x;/ UwL°syeuPFEFr95xܘ>>>嫧ΜѶvfZnrAŋ;.9%=<#"**]ŋi! t3w(fqq~,!ʿ)c[ Om5cŒA{>eeZȣsg^{=99i׎%Ǐ5X( #"wާP*@(7s'OzRifU4Cs=WQQ6lu׌0zʹ҂E Ejo= @5qOM5Ey ,aмصk=Ke۷oI&.]\fCUf6vvfY:}.犊MjVM'>+a/E3?qE3L*M<%J~Aֳ +㇕t=Hl aj5AAg>GQd,lvfAAgB}~Ds-l6mNEAk>GӴ;H:<~tFAQ Yx,~n͋;o(.:}H+GA9C3Eq8lE?zusG]b9l6WG@Ai1EX4ŢiP@`,.  *:4  nFAA  HoVU-AA @AAڵk={(Ri8YMֽ!4AA0[-%Stlcs   HC0 c}  Hs@3AAEsY AAJsgAAiB1?Pi<ꢢ\Bhʁ333.#x< AAGNyX\>o~dZP(juqq;wD"X,F! (EsՎ͏J#\]]uf0r\.@^^^JJX,vtth@AAh=p^G*&$$dgg0]PPP(JHH(/w# (sFAc"///7'[n&b0 @aj>*Hnݺ``DAEsIgo~97H*ӧM CX@mb]_X,'ƭ[UiRT.Ξ4MD"KKK6Lc3OAAE=uu3a))fggQ4Pz0l4KBYkUTTDqwiR[TTdggL p! ϕy? `|ARgt֍Ţ)B1.ninT6V֎瑧>gkkd{,-- +XOS?t5uȗGsbN迓?i׎hHÕU\uUn։%)#]_iN(0,@5Vn{iʺt0 EQ0PIPa%KDDD?ζ:6)r"vH.W=|=,}l#Bim˄%\;0Gg>ҹSh2E~^}Ij|#‚0p|Ƶ=rӃ6dX,7D"J%Iͬ'NO$V0g/簾;XslnݼJJ-r?ڜ"?>Ks Sz<$-L5d~>#0ELd8n?y7`Tû]\3g +mL6YVθY9W ieoBJ]ⷋ X@nzwC+>4# V:3j )vIz esQr?mϏT"v'UCZ̀?9jo 4N,9:l&GZgI{ ! !]a1~hR޽ u2&p8\RՖʦ0(*Z[vhi?zIˏ^Y_\_תM״x"loۇSuw$x4pҍ_Iq|}.^;e|JD1e;o> mZw_Ȫ l\fIˏ1g'^ĕv#ꩁTlB*+UTK{+_o^u}9HyKIirF: AlkDUo†WQ=DYJd͡@SRY+TAQFܩM8>LY*1bQEyr=kLCAQQz;6I9/MAh~=;{y<-38DZ5]O]jf޺vf߸9e~1,asTJ%1 cBHv}鯼7+##7.G4I] ׷7˴{.);?`$/WnV]ԓsŗhR9ҊKá4e ;<"ОZBR&s G6q2 Ċ:N' W*KM7yJj8A(6ai*2|݋f{ *⮿JH_'FCVۢ6mOw}j/37Jz\Zbb/r&y8= Tͻ-y_?!PPp1>تow{5jm~JS[UNO$G?_XdZg௮)Q-OV0&c|>S8pH$"@oTR >FmkZus7ouDh`fb5c/ǿłdT|?{h/SB:sCޓFϑTd!uO&jסXO.U2|KAwe-~4}󦫶͵jmޙ(btB_eeP?A$l?P.+w]>v% Oxz͠v(鼙o.,س5:bJ&/d9YpR^Irn$qG .b]>z~-5IMέxs' ͜Kr߾z=kuoտgf۷lmD_RruJɿ$=|#ğ j*OWO1ž5%(wwV |#uoM9||<ݼF[ 0;f̣ϤKMO"ʠ{kۯȑ/E"@ԛ߸k++__Y}W .p:TaQ @,bbKʬ{ԕh޺̀ӈeGNԅ5N]KN;״O{M!p{T0n  ȓ)[:npTKE~ǔK*x蔥b%3ucX,<۵?Oqfv+:q5`?v"3qd$F>iHST,' ^{/+^?Ȇ?w]zp18w q|-IZ~5גyoh$]N[d(goQo'|+j's|3Tf03[Z&ZRwqU3s}spWAVQEnDi$M4m.vM{ӦmL\%T (( p}"j}s8g<33o~gw,)0j?E|og|.80*}|LMwYmcwcSo2웝\.Z,=iyJ,5~Ѣp?n_~m1ƌz=+\&>OcOJE~࿯gn9#vZزǛL%˲]!z:,fxPtNOhR23)s/u|_wr3dM-|[3Ǿ.vH%@G Bjs#֞pMpG>9oj%xIWIdl?.["<,|C-v5ytҠ<--QwW|oUr.]LJJz\֑?W2~yyϥA!Ј|rJJʠԼ<qϬ#wi]gޗb xf͋';i)eلgj?@Y?~W߿[SLo̎Wu @3^? a!G/0ۻ)7;y;o~{OCo}צBac'+Ro]&PufY>^7{B?%k:'G }n#Qx=COXgr!- MӉ 'NT*T"@p9[[[MCOHt\B1meE7x].!ygH ԪďW.Omb$QeZϝ?px%/\,aD,fY?At**G'&FEE:/M1<.Ž|N]\ABh='#aGEGI$sϫ!ze  ={ '+a ;g=!Ѓ8fSsrrJ.\tBp>0 n?-5󺵽ШanaM"B͘o|v)4q-:sN*(*>OQP`qf7wϳZC!B>fs1p4AQԌlPxnaYV PbBCC].lv8Xu!~;; $ո= 1 8I\.|>ir544`]!Bhİ;> cHsn!BV s7c? B!d]$n !Bw7#Bn|ytw?|޳kֳ[7<"9DTxWb:O_ٿ8Լ΅+"lv(pChHx%¯M!ײZXI!,~Ҫk]tJ?go5h"jiMMfM$WbT\J`qOtME57zrVH7SqиQ:wmu3%*x|LS(ĠPH=@ > ;R<>Ʋ=mܸq×?e9QqrP)Xs8d> ǎ H@b\hFfa>0G'BOcRxR+hv_VjiBQOR!z.^ mkUE#! OEZua|6'# U|-&u`QY@R@P@a`}w-/|` NX=n#C|. Rƪv;0^?78|vi2EF LO錗a9" w/ vtDe^M\W"٧cW~?#X!yq3k(ra<>c-[T] ~L!T2tR"wT:"&;KAH*jfɝ1Z,H`N_*;6BAW6\cBE0Qf:s)lѲ!||5G7uG¬`|ϵ|GxL6'(bܽ&~*09>{xbD2 O ;9#а~ 0 0 M3OGLy~]n\pݚYBݸ뾵vaJ?R4wt&HfKAdͽ,y@|ػ!ِo3=VE-̝x+l N#W3)RHV#c @Nf">}j#&T;m1o@ڊ3 zjo ¨Y3y69\yBKWh_ ڌ v~XH܅)U?[TtjYC2b/`ģ{v\9|: Ҋht26S/K"͛ +Fp;NHE}ĕ9pvKg~n!ꕗ_wequÄ́`-/#V(lSg-s)B~\:yʘ tg =?_k]Wnu!qX"nRw*ȈVyb=fIclbyBhq+(rԱ?l7ZًIZqg-L@p:.;_e@$ǑzE9Gu?w|l7.nbfUѪ}p '0t%a:f l%z@֮ u~m7Nz=[kcO< $L/3N|#/SE~oUi}zxC2_Ip6ݴ}뵟] nli973 6&GG=nqQ5?f4VYeKtLXA?I@Kr>GdX"v0i韴\}>/%~-?(ȻODzgӪXlmoWx_}-vD=NqKY%CuH"4<ެb Ј#~q$·ft63UGl@-`}~a[H&U?;  !;ӟBgJWq{4l9\0߱e-[*.["Bh$^9?kK/#X ;.vc$ $,?p 2Fkq3Bhd2 CbcraC])ϯˍK[3+Zzݷ.Ġ!F72Ei*wN>.ΥoF!BfB!0n~`|ǧ]y@eww#RC] IDAT jMܞ[|ݝpG6lצCqUm~܀뜝zC$\N=7w_ۺJOml~;j_^l[ќ϶W z70w~ʍo{> "M2͎e-f!qRCB^ga83?7Sϴ֫Eۭ~R֧LN i"(mHӻ,~ٚf-$N>.XqyrՒ\bҧGdx!TX;^>+̠Ϗqe_-㦮^"y*!0v|ML6sP g|0*׭Vd+:xs?=5魃y'toz[mKW;b %`nД_s%ܦҎ\aJJ!_]s=IY-Yc_6hbPyh}G󞎞I-wRK6?6.\0KvT9kI X'-2?KꃨLJ ll/빰/YP6u*b|o7.yO813($|RSwPXÔFT&Z`dI|U\֋_g/YPx$ Ͼ|}|ңGy{8 Y~f$7oLsYPu|Jf7/Pf_J>"f:CN9Cwۛ%AcxѪ oʚVu1aBJ9!5z#eR˸Ӟh*=|`v)DO(%cIK:L^LIZs;jN|Mjs&Gh+}峻3^X5`CS2KVԺD^ʼY5噑=;V4</ ̙ѹwn8wFD5iP @'-1QTkb3%j^=.Fi6)쮙>3&7_5cvPOɧ4jg+ͥ&7Ð9ϦiyE5-?DM>-VV9{<=ՓݹoC} MeO]04+ΘyŚN_ouq`℧"$lw0k=ɑJ6{{IЪ;'v4+,k<2cD5n*;~-ϓk'Na`̺>:K&wΨ'[*ʍnZt8{z:g}} yOx>!^3ky]6AUS(Kv'N5gӴ}n3Db4ٜ>kxK+!֌AY[ecBk=㋶Qv^6v-m$6?cH\}`e{=N8mu^=WlEz vT}I5sF5Qщb}WXS!!hɚcŒ쿱DLEg`.K(s{[f RF}E\½Fß5{ͥa02v^s|19oŨA@6-GI0[/Z:`g=f9N;SdKB:½z ^%R2Do &qǚh[9,{wXBYX Hmh+EW VH+񶰠8R0gL:Mm*#g8m4h9s5SBQT1gJ|۔iM-Lq2]MY3k:oCqI0+fZjtSMH.:PIX6+1l?C⸡˿v֞'Se583G0*vY:h*#ygzt Pt{yk'ӆ鎛z>PE0wX9ZLf8]Xs8d_ӥt&^ g8&IIZoTprF OM9M=Iòr|T`U!J+W1)M6o*2ahJ |68"uP֕]%C'sgRWowf*4s 7J箭nCU?8#Y#%Ձ0l@_vaB\W_אz# M6/l{1@r;j BhB[a3xX ӂQʛv5U4x \yLJBT%2fzC<&OX?.Q׳}Of̞"8>jv߫D1]J76rYae0q;cTq.|r쭡ωO"赉ZRw`Y h濼}_[?1V-dݙ$k)w)wC;ܳL;Q#s챺>m`mFv^He )gE2r[!ɫl\?_gXBN.M'5iI@k;EDZP1YɡkH{`'8hб}44WP8LZ ǏЃ7P<'C7o?rV̤R!z.^|` NX=n#C|.i5U^6:i:A4Ew/$uGDF.EtO0 +ʱfܕ&SSC }ƪv;0^?7WDOQ=_$A7ԌMvixW$] Bks'D;~eVE[N$.hT܂XRf1@8+zr"?b=[)ar cAoǦHt"qךr" O׿ Mݻ " LEZvWS6E1aP᡹jab$"_qݕaq<+1]m28x#E-#dj'@myⴷh""xÉN coLr<P.O7o\`>׵2D0t6h ʮQ 9F'Iy"<@mgu8XB}ct["!fݣ3 u% ⱄVµcf%sHv jRČp="]6bt7<GF@>[U(ibֆ/}{&Mg1-Z67O覢z,7쩗O{+p\,/HrB ~$!U7ʠ(e< 8p02,GC$BjrVL=7x|Z,H`N_*q9֔v9=$_sJWPuJ)qïI faQb>v]Z8A7<*Qy\UGH-O԰ε-#uaƞQ}6Wyθxnydjv/ @Ru5C}#ʊJXPX:\ )FfT2REt.A N]J*( 0:)&EJ;;{iaBu?~#:؉E<Խ򓍕g >ee{,~ 6o. "QW`1,%GNI/0vr=;.F5 9Z uS7)3;h̬[^~6{ V:5ÏP@X)$O?-G>mh(4! Od S 5ӘWoYÕGNX0. ɳ3:ϓkz*WN*(ufL?DY}:P!LicX+VH}H%M0^rsYɚY'wmLQT5Yo3ZݷG z訯)LriWNl\șUQhno]Q㟪;Z"G Pszwkzs+>>S{[n xgIlU>)Ͻ'w֌?љ[-yj!A?ٝ(ͧ> ӽ$;`K?[7>%dQнw\hl7wWF.DxC;K^C84oLrzS;zN 3Aq5]n\,ʜc}$1*ZAtN.9l}iW)ɹ}}':51^\7]~ ·!A}wN*@ţcuLvygfK=7# br.`0DGG?7d3\׾ݟjBpo6-Z;U5X^ga83?7Aj9 m4 _M%6D(&}*zNj0X=PȞo% ivyHゅ^_9=l3(͟O+_._r&VBD/9mI;ZR\muvq)}Y;eγ*f=+z%#xң{$oڗGpDh$ V0!tLzO3L5)ڛ%AcxѪ /zdVe'۷ "'W³f>yo6?'yBEԹ3BH{$hURP\#ۣf<3v57:h9I}ܙ Oy VBJ I-k|fk O~f3ɖr'uVWLv/#SNNq7TL.lj0gb'x\\Seu2)'FPdDu%ʼnF3G ڜIpVʎ~q^WspS`l5 ຶeGKn|Av\Zkr3 l,/ilūr ZjtSMH.:PIX6+1l?Cz ѷon̙R+GKfdFke\GSѿ2v-ChjyAys8BQhT`NL zU/=7C'Y~8$~#hGi1*.OIݸi`\v,8T1,% @ vnwC2cTx Tmp?>iIZ!Wq@!so?>B֋[ y pZb| սdE =~5mTh(9ըp gpIyWJRs?1#DDW#m~a(;l>a:  "}2)w/X!sHA3R|Ơ nIGW՛ut=[K:3_??́-JO0')NWI\+I_By<>q3!'v2Lw Wzoټv 4v/F@@Q<~W| IDATP@(`90l0+ x yTst.H!B6c7ܾ%MJ8+zr"_8ᩬ =mk 9Bͤjm2^,،XCU .^hٲb){DwvDB*rʚ찯M(ԦfKYj?pF$!%s|. NEhBiC;/ 8 _/XXvdZi\F'3<^8J5 "@9uĬdABuǂӷۗ4@b*tҌm 2z s_8U?Bcmjj A3B3ʗY‚B@Ly~]n\pݚYBݸ뾵v=f1wtѲ[|@;*oY`jX}9j<{SǴhCEJK۽7LLRxW Vuhʸn*5{pHz|Kϕ2>Z^~B DОGA>:Xa8_g#W+@J s <*Yk/=yrF tV|;nv`=W͸#?pk +!cGeAXcEÉy }u'd՜>`GW%EPS9yї]_ֹ K[nR4~¨Ys}EEǶvƇ0Λ LN?r}d cr.`0DGGkRgStQ n:%grlg WPZ޿Y.hHq?y;[^H#b+7_fɱ9BOԴc#p7޴But9|H'AP梅:ȇKWOղk B7c)=~(I'L{CRZ/fCIXd},!¸yQO5ұo삗bz&.{[!BOx!B!Bfg}:jMk\AxݲiJO-=χ̓rps/ClCM~h:ey#B=[|W! 1' hqwm:~@L 4788ޙ$L% :SoNuN`9ry~X᙮L6V&` 1ytܢLx6v ,!S.Mp{Cb\S6iL``2'Hm?DcGeuXL+i Oۖ LdRξIGW՛uZlqTsk&0>4 ,t26\r`-V#'>17˺ gEX zg@1#>` 4Bh;@ X bt2D˖-c-Hh!4r] Dޯڻ}_9Xsb ہRH)VEoX6PMy2ot$ev{<^b|;<< 'ЮYWˍan~}~f"drc咴̊ƭ^ 1hF {u߾dDelg3p;r_D|=K6s_`_a"%XKstv w4`'͌B7'"yXƜq1͉5V400G!s6T-A[l^^)|Vh޳~8jϫrm)s4sՁ,,F}xW1(#ᄨ_̸IxRVTJ,Im'K/p!::!V&s2բau!B!нa܌B!!Ba܌B!O(S|Psw]]Gkw]quކ'J S 6ǜ-w/T4HnQؚ~m%sʐ`_Յ|S*SY{O{j~}]lox@;iQC軏Xd phS `rwüN$;vPɰݾW%=5Py^Esˁ2M ~-']qE/lEC o[wql@^#D`7dŬif% '7^mU_T\j~̋A@ V 'N&=8Lϡx߿&Iw:?a׏?uy"q}=쨴وR,.;qʢ066gHXc7^_Xz$'.-!hYh[DXV@2%SwD&Ɇe!Kŀ!Q ]C @:9>+WZ>Y\" d\a"ΑQ"<'ELȝ+4qC2V )s&HLāHN2YWshH NLoϰI [߼wF]ZBw[?d<-bNp:^˛g y%daqyqQo.݁O4^x18w>!nlS6jzp8)ToixSs&ߑ2Lr0fw1.rV)9)hXz* <}s~zheY\K9?m|v`#q֬ 0*p;nN{Cs+- qMPe:ԊU(ݧRLbnZ0mcT:q7h]60h/F*BQ_~uRD$>n&RcJH6#gWc))yCQ.ͺrMac%%kq=%'LJ&)ᄅkZǸ6`l[U" lah 0=ߊ3bf7X\.|*?⣌HQY ];v=kں"ja1yba xKi)@}T1b=jefZ0 ߸;-h `Z~DYO m.SsyiMCgn0F'uϪ 0R},в7&yf&Z{awp'ƑNOf: ܸ0}`J6jmdJ3]Xt|bocI`p$NéX|rz D30.-dMAIܚy!|^kpZyb0qjTn4:G-ˣcq62{@6ݥ Vؠfx톡~1aLmE2խsXuCcv,֪&erflU|(5鞵Q{9L?F>YzMNA^X˰ & :{ E6JU$Ǵ&6^ zbCo5.OtF^]e~A^`K|oQ(MVPǀͻ?"Vd=ϔ[}Hd X@tZ/8;5/¥iqcTq,mӈG}: y @>~T]+ m+HG(N)h r>#&GfX2^í;%ٙ7uyCL@Y@Fnޞ޹F3#zCR;. )n_wpӪڛmn`pŪ-,z +s;0;(W\|j&P8S(ۚ+4 uV^nr%m@~/dHiJnڹ7A$<+n7T:K2S.6>9a?qBXaqU :1ЏJ BPMvWLy(` %{_2,pKyoWX$S嶍M;>c ek wDt{LS{u8yd6ơ}UWSnwc@eqfO[i|r~LYi#]]ZE+&ũS~~LIh(w,=X^q2I¢|8Sug,Yaե\@)q3B#D޷̈pdG ]ZR=晞K]9"7|^-D@c".>޼~ghbcc?U#u9'wI4cՕ+TΏիqtvi!+Xs6эϡ47 -b1K.N=[e'#{@ @Fz?/}z\L4f 3fΣ,D`L~)tt|q^Zޱ.!7”oMAcm԰i ğ@ 2#[ @ tr=*o5} QH{? ĥ;U񯮛iLYnvD}jt^kĘMgQ|X7Y9۷5]bkb`SkPWs~l݁S|[o“6F E j 1IlB7Wd3)"RK 춲/Êa՗.6@n;Z ޻[C~;-"jkՕFan3]v,4-??C2},Ce"8"sqUˈlatMYSy޹߮s Ϝ{Zح1(2w9Tح7}@e1 me)W"fWF*uS.` "r% hM@UeĔ™BqƝa춻vP;qĽxQv^V3z(3EKkf#T>"O:X}ħ==0mp;9[^hݢ5J=!L< %nˉ1l< ~02|uG䛛7*p5z< Z4V!H 9 "Z)ܗ̤&?q(߼Ʀڗt?dIuTo[/+ې](1w*Cd1*#xFn)`afn$c8E8TAc K_{USEj_q4Rɐd{}~YY*&ʃ.ٷX `Ҝ9qߋӠ&'206޺%.&WΑ[CqF \* M v?_L}E4%4,3ޭ=]=d'=X`eطRm.no?~r&Nx8q͘/$Cfb0[+һM_@;F]ʯ6RNfG4_2I8nי|L̝5Ƚ ݠhpq gr|/[LlL@7ア.b1' YRݥ#cWx66oy])0!D%ōtu~ AR…C;`c`ke&lRr1`crmE-*rtjVČ85 dЃmxuQBp^dDP'Lpd(YSKhYfDoqB PE&8 mfy\.$k={G,6&LyڴS^d9ǔ*@be^Af?'%KyWJWk0NOy#3j}eݔ"akb|I0#(XXF- 76SPB${'QRg$O,Lvi ^՜`fd A8N 3J(܃*_MLB `f/.݁O4^x1N (q{p.wE C66>VF tn |nE&ye ;d:W[Y7w[ڧl ('!qRv̚H=3[ެ݁ 0 mu.c t!)!\j7Y',/-3 '8h, Aﵙeb( tˏYmLF5SM &QyHIE( HWFWToixSs6< <͔&V%wI @ PLi&ziMMɣryh֕s/n +)i_[/GCzk̓\v`q06 -*$ݏuy }fXl vX\.|*??ʌw+YxS .7Nϴ0b=jeX9P-}6r)h:̔\ikwO$_?pN:>P`spQS9K0T.5:wV$ HC,on>D*p:43dP>cpƋ &>EW `ؐcFޯ(@ry f a'S TM rw?3p0#_w򇿜޿hf Xiާca\Z򗃒5w)cZ+2̋H〉Sv(I?p]SuX)ȓb=:M4PnHE, khy+}l.qPϰ 8 w^J?* f[[&g,T0-C lG10&Uf}]6m9 :׾l;MRt*1 &rMEk9>С f4=S4Ҥz1ةq(hمeL=SqOZ'l:SiSږ="  _Ju|erRNCQ@yX>Ū{d@;&Oj[LNYFUr3]{#@5!d͎~FvǹiC)͓>aѥ9YY} b鱑{R3,Vw, Y̛(uyCL@Y LشVSv03BD`;iU67M0bUxݔT^WzEPq! WvE2EeV+@ &:n_sޭn3^z󁮡a{Ӹ~74./+.JQ+BHS6dʧ6bNS g+2HUBO߃_o0> TX9T> 5˝-2@]h|^]7!?/XJrht僴^kĘMg03R>Y aT5?'-g@ _n`()s\^xHm]7" "h[ puM/_mX04w۞$ÿc*+L5*M#5Wd_7]N\ek?tx޶N`q_>.9.+}10a2vɕ1?vڛzp+J=4mF`lR0p>wU2Iqt kKOܻ;͔餟\x [fa T6cbq9ձp)[_uB5пi2zϐ0Gݣ3%M5c=0tĩۃftήB_+'%VTyt[YMt۱h'xEq 6{}NYe=*|`(֜T|l ]28ȉg]EC o[wql@^(Ӥr۵'-q1r%wު+87JUyWphҌpy,`&! eG^_Y{ E{81Oz006վ!SLzzbQc u j.d&^cCYCHz=̽Ƕ0n/b'7^m]NJ(ͣnSQvDgBbⷛO&cҜ9^<\=G_ٝ*Hw젒a+}JxH1w<-_}w_8vd1*#xucL1B%; ꨭ' ~?w]2 [+I#fcRLXϛ_5J=!L< ( ~)&Fy0H<n |l|3)Jח^b]Q~LF iGUyPMxUuA +s9{'QRg$OXS+':>Ðoq0 (Npf*H 3]umI7>o4rش좁@0gXV2V]@`R.٨vŽ_[?dmaacckN\9?]P:5Z݃s3A$9"FR)sfSt49HXmL( fIHn+lGF$I"D:b`=}ĕfW6]e uπձLXe%t87/4Jf7&J;!ښ¶gXƍ89 IjIq:ZLLkjJPC{uSXII}iIa1Q c,7bZʌw+YxM,M(plp"rS3c@GK d awp'Ƒ=`9 ݸ`g-VoݣYF>|-dp k0^ ` >E% 8حs 0ֱhy AS= v!l}kˤw=c%8~D{)EItVh^:: c69g IZcDqQW N݋%i `j|xIYl8w 7cUq),Ӫpk121 nXWEFlz7:lX2`[2B6a /Ll7~{– & M&PNtږ7;6(H55k6xm&G ꌊ't81 L_iqc@[7sVǣ #j4OGWƒ.{bf̬UvSRy]W\ɒCZ%:w}Oœg*ܒrU :1ЏJ BPX\Pjųbv \&r+LdNvXEgqP=V|)>FI_ مESWp4f8lّ[W\ob8;XO\~2-ofC[(q%/1;WQO>dJ,*ҷ]'Gq3=r)FEn6_͈ݰVK'W*%pYVNtHi)# M ^|cy &'H”kmD/q  MɍV_; ĝg-? ؅?5]< )N]}K[R&"wGGeGYr;V:`q?8cF*w&K ߖ^V>D >Gb1K d.dgLG@|FZ<1J٪ze|iDF"ь@ bɐ᱓!ڝ-_iU.pBi{F028@ J 1C' ##X(N@ @@ X >6Ns>k՘\L^)EQk4zr1"@ gG)m}uKةٙ|[r _.̕&GIޞa\ B ė}\y\"ா]vkzG\Ml/tWrЍLʠԒ@wi3gGp0(&MpdZ^`M9B3ޓ{Ucrx1+,ؚ$XuQیn MfLUx5ĥEbh:HAdZY6Gl[]Q7d "yC}ĦbQzER5_ٔ= p:kj^ O| vxʶ,% 5Ug+ݹdg`ŅɌ_[]v'/dZp=jG}zZX[*l> ߲{[q3νf3p:'54F8!=|FO]'z+3GFfJrR;~1vLآ?!wU?}ާ{I ,+(U`j}\2b$[eS|;]y-!?{t؅,77NLy()gnܙ6cq/:6\Ь;rx0ͷ dNg&-Zcv3K=bX ێ)ݢnW5'ݶg?Q@amcᮺ(.LiFH,fcpLi_:nϭyǼC{҂Ut'Buq̦Ҽ`pS03ZzǃK@y}g)"֖͡cucqy,`&! b-ܠ驁;*fS cG1g  2{l x\dvsEю"& `7ƅ;O~޽ӎ)+ST2,}eU Ogs}|۸b1)GN8a"|鷲G G86U y/`%;<u^ت_/.-gZ %ױп)[Z!ݧLӷ߯3$('t"(q[N,a߼Y˴:+29c %0hG|Tゖc+ې](1w*CQ}}5 'g4DQ"wTk s T\Tx*i&N4hhB[]݁ԛ^㧨*!gg拃~gqaU)[\!_m,UW8`F*TX`k)R|r_2[8SLS|2g:N8evU@< ܔfĔOcMx߿&Iw:?a׏? riZٳg{chMNq@&3J'Q?b'KcN\h: Ӌ^bFlf2y(w3I.;GN3b))E.澖Qf†,%0&G-v Qgb 5;U-bLTwr&N/0ƒW ˎNU;G<`k'&f S$-2b7I&FO5 QA6BF$#:{Qiclg:-1\fPjd%Vӂ[ixyb Ο=$ǔ*@be^p^or"Sr1<$<9|.LZz̯&u^{Ap i\܌_vmcғ#E,%&)f'lϦ$EQ⼯ ,Sp_$?J 3Qn';"{vqA5uz v/F>gf@؄>$pF\PrMre[nq;[>E;oQVӃKh 0Id .%e; /fNY/_6/$IQ㮡 ᪞YY!b3Lp[N ?,U蛘r{0A`߼wF]ZBWYex]WߦtSs{ȨS%VWq' O t%K0o,aʑ~5'j-~Vmcz_OX)reɺ*@ P Oǚ'L^iQE<4ʹ^7-ޗ'#$L8dqy\vk[YUb]Q|`|kZ6-?+Xȴ nZ\);m4n vpdHFQs|~GZ`8,I\T~x}e?N؟$nK,Pg/vE p̠@ҁ+&UgG]ނ}ߨӑ߆y,~^zPrBq|hR ^!Z= yiKd .ܰj` _,B*z`3)sr ozŎ%W꣺w^l. cL>+KaeVqx\=LW"e9qEQP;񑩌UF6Oz0Td\ `p$NéX|rz iAgCvxF3.w9$8 }; NCkffY4pڇ-3ׅ121 nXWα'7=6{k7 uh:,`0Y$A00sИ4%ox^aE8mi;܃-@;h1kb=V/&GvaLIh`P05>N ^ƥL)9([/e>dC֖ɥ9LM VEF]ͣLbQ%HӘwC^9:FyWۆ?Y"R :ڇ}KȔdVļ7ʺm&4!ϒov_V/7f-"SiՇɅy+IG(N)h r q=+,%VS7jo#P;+d[g vJ3/з{j'U{ػnٹ-\am?eMVhS9K)Dk6\"$|rFpb w{+.>CYyaso;uy>y Wkp4f{AfiJnڹ7A$<;MN }S;=oq7:Y۳8W]7(C?*'A®Cybx1;v\?;}A0aZMl  gIGjpy9'5òl3e>@Lގ򚫗q٤@.%Ȝ찊8X{, ,yX$P$+*n "DӽƽVv`X5>vT-QӿI諾sN0ێT-׬`N>ǼlXfuHnJ*+"YRq(øx,+Ku?p:$ev9Zm4!ğ,.>޼~ghbccorqrφph*no9-qGΗY7P&g_٥Zc<N>Bԝ/3܍vcv\%‘nw:d@yW@ @ (N@ X_nvv&fYjÎKGoK#/"2t3>5ѭҋ?;rԷbm-P]CIsÊ!)2ٿ_{ ʟnr/h@ jf ˆ܂+ãZ*1;RaǢGvKf,@ 'bǕ%k_2+Ak%~o|Szc0y[n_8|:jew2N>?vڛzp+J='m.+}10a2vɕց)3̍;SS5w3C2ʒxqUˈlatMwb8/tpy"N{v/ MZ#7*YaUV^q%kTDFX;JZ4Sv;/:hS{ʺVݔd oJOTtf-:ۃ&31GӪn͍qDwF͔+SB@|!3Rw~(L3EQ{wԵ3&D"εR{3ۏj걭UA(2 BB}Ol[O{v+3J邤u=f>1eGM#lbIB,9ߏso3=}[/dnt]iOΣ(ԫLKj-g[.|gq{c< {YƳ@d_չWk>}b.ں/PF7C()ؽ-B{jބYH7*C7![ k~|aoǟ֦]'wܼMhWsZ!/jڰuz9㵌M>SHFsתsʛN1UyRw;@Ú_~^m>Ue/of"bC4/n|,^R&xsB$\CUR0(6!;,vǑ/%)+?- ߂_~qd;[#""EPj=RʈDjkWE$Pg .#~+3% I2Vg4UD'D Ѫ&DigC3B"EЪzGg{>QFD'Z? ê="ޥeNi`?;8$aC̋U pNʪƾGD^[[o#p3U[cx!b8;@Ww̼[j督Ngy9'rErd/`zN$#~yDF.9퓯!Kgf k0cZfT%]M8%yqq@iiSVY& uꧦ UVQWkTKU쬺p2eG)tٟn:ݼ7qfjxO=Ѿ""KՙosrRF*]5˻?H.ۜDr"؜Ds~sQ"V.'%CD斨-7>yHrw(?CNKDs3O8#"x8~ DŽ9ZV8z(ӯ:xow$-:?CtOeqh Q}ÎWrH~R"}Vn;|`m,4:QBѣGg Dt9} se3+w{"8:Z_yMLbɓASq7ylxb41 sshi?NWt 7 e'+rl$QN#m›z8&nw#q! xBBiщ\~#u PH"OcUDDL`z])Ҋw$.Q9*NK*V89sh *Ov[ f_8- ľjv/ hgN՝3F ՅdϾl)pZ?r45!*`.j/?Vn>nW;~S#ݽ7_+x 'kwNY]'.r][6o,UgK[ex5r &k=‹dӭ c6'įZbXrֆMJ8S;]wdt4?R\ua~e1XQU=l ZCr^~wo:ӘCPGgmXu#{_0g䤳;w/EصmSiZO[>LHd/k~c.&cCR"rwTU*m.9^ʠem<fߚ8 }aEEQ7aibrUx;e_"g.:?ݚK[5]nN VklZ,_E #c۞Yqw}$VGV%^9za;AW$ MZ"}IE##L4Q+5~W}HrOW]R?ݚ_V:8jP`]Fo:=L6& 9hOZ]|~(9CM&~KrDDc'-Egx#:&\]{Hd8Sj[x+ƈ9*Ûn}]N6\nFUR|X﮽kZ7^g|։.xc#!6'\{}&\ IDATgW.<r'x8?^QV2d}#ukC'.^is$;7~8ۭ sw,-~.dʆ PL߰6A+sֶ]\RhntZIQ+waygʛ'n+ω-(='4وx?8=Ucƞ]i7;Ol맠y^`O֪Z$gMulfo;όՕZߞpiPԟ\}ns_d/fURo5CENRzWN5> $">nQEO^q?,lq-Jܾ˷ԇgB:;0>ˬT7`dZHQ Gͅ! M֗\{pTexg_%㨿tFީčtm۷N4Zsl=͌"w:I|}a/2ڞܼ>t(PåMLȜ]GWІ{elBcb#4 D^ָuɚnl>m'޸sgwbRo9OjȒo>W|r\EM,O}yr\MeB (P<Ә7o9u\|Vyn_:.Կ]טc??լ.ɏVM>>nu-coa= wpO>h]12A魆5l^|ݫ4ʸ_|9B3p[xDO/{%Q3>hg=onhRK$)Fw!/.ys N'outr|J*"&pc6"I"ևU*msԫ}[-6f_"gHʌVfmYdY믿>v3jVdƪDD2?) )HOMdH`1=3{UħƨD$խRLsqIJӰ8km}>O3$%%m3D$U + ޮ7w4+:>H U*mޘgՊLt )!'449I+$Ei8[{:zZ$Hj?v-v--4ωj.\~*u&ynz+Y\&GfxO\U~&x|kD{ںqstOV((,"I7B' "eY(,+ɇMz_O/I\Y*9͏+F\y]na7UC~,C,!d1"\luTF#AfˋPC[KO`2S($16 r1Y`,ur&q|Y0ric;73 oynNHӾwspxr@˥SmWes[Lյ!+xƓ!"fsKT9 3.T;̿tu{Bviw3OF9-><;*%Ʉ9ZV8z(ӯ:xow$~Ѷ1mJs_|^8ݦ9g=DDlHUܿvcEDt9$J?_)`C{rv"W:**2@ŌvhUG >8ehik6,9\[^&mkh@CU9z[? Ұ!GOLN^`c_Mf8mQ5:l<9 W*X_]ͦ<K2*Ϳz6Kx }&Z~/hD% = ,umH \/ fd_mS0¨cTfX7f<-cVHIRd{x=o7?rcxׂovv1e';7M^6013Kf|nL?wzHVÜĹVocbbGM&hWX m>P`x8z). ^xl͘h Tujq]}EAߚ֞k'.(7|x:;;}|fA(*5%ujK#M(ܵ)7Unk3]aLB3?|AD^KǓ>  !d;جgWO}!O+=dOxXQvK<ԦodJ`;4[:tݵu OxDE{ ]}~~AQ;iŭ gϛrQmip[q]g\VK.H `MUo{ת2hCCh,7{xcVjXtV|WŜע G;bйkVsWlyq1cϮ4_﹙魫 ]:Ɩu Ú_fv\8S\[|6iVe[h{kD{LczC :oF-'jӅow]^܁xSE6syɩoz\3PZڔU=YƠqqÉ,o<~:CO^:[ؾu蘐#GS*ΜJ~.ޙ ]n8;NVtOEٲI쥚ěz8&nw#"4'''6LFk>>OxXu w: 0?fff?%?p>@X <DwG]CQxў@ꩇv[QXΞ7+*LZs#[eR,eO@ZIQbj/]Vs܃VA8T\T^>&UFf_[nsAz1gh߅,.x+o2Tq{@|PUBWO {8~rt(#tb{LoSWg-:lJmCK-呼Z9ݼ7=.(-m*ٞ,c(B4>gn9\fᒷ?=3^̺_~tɅ~-e<7DwG]CQxўj{-^ YNl8{ޔjKۊ3Q-{VrX]RnT:_PcBrzLN;z3(?=4?={#$|` =Sc1k]ӹ"?r E#yX:,1;R_Fx.Ū#}6ˈW{*q6:vB*]u-] 89.W ܼr}L< Molz[ǣn 8 xWe9sETIq.~%8_' ϏNCzp< Ênb}SsEіq'#ulLL݌yꎞe56/ Qk օ*W}HrOW]R?ݚ6\/4Mx+ lI: ?@'8.*}gDžSuEGӘ亨TsS볳?H(9BED3ߎx?^ue*Vo̎P(~K=yaO e= xcUv[CWwsKmR$Go} mR_S>kW7^hӭW)b͸<3#37h$4Y_r/GNS݀㒵j!G- yF߰l=6Დf'&c2h,7dUBqUjIb=Zzr"|/X#"Y,xF]:s1E]wϗ_Rڛ;Kc^uZbFiA>7(U|𖵞C.;䛿uܬ%E5l^|ݫ4ʸ_|"4/ÆqH/%&ݽφ?̢JH WAi)!oL;mN^,~#) )HO^Y|Hkʌp CҠ7VmM-y_"yx\tf^"ttk""ÊRH$RE$)FK(dWC t곢T"t\ηUzޤȉfBa+""ne\`Kq>TɠeNiek;<Æ lzP!OO ""\˜]Ιns[Ua+G q.(I}Ȁn[ OomW\sGikPǭGk*m"sټAE!vYs,q"5$o} jgQΖҕ!3QOTQzn^rꛇ 6e,fT&d|23s1RrSytq3'ʵaqѰ%[B$ ;ʾy8?H.ۜDr"؜D{B%7[LIQMqj ś#B;ng<;+e]_6?2,k$Żm1488"8gz|Tlb֏\]zI ;r8FLqPQ_u+f"F2NmiMDcW1QV&zgHuxDkۈ&_48Z1h|=̓sqBN#a<Ϛs7Fdr{FfͿpo|Cccb:w:<$*Ddz6sQS+DkLU _hSk1lffc18 yKqx-xfgGɊ[v8ɣv7NTV_9U&V>;ti+vΰIGȽm.?Y(m$V*yLEŹnN VB_EDC+O+'JEn:0\g"Dվm6QXFߍ]nD egO=K6@4:Szٵz+ :i5v[҅}/phK ?i/Tfeoo? @>03J"Wݸݱ.Խ2$ge]>}^+S1[Μ;g'<@ ̏76?i\ KiT'''6LF8@-/oge$L/ Ug?9$3q:;;}|_bP.UjJ' /8{yrwMDnWȫzpGj;Z|x Q7qI KߒGI R7_F[?ei 7X~SM=z񿾿oލή'K_?t9gi֩}9z>d ^nޣ (hO^@D ?\{ru8 V]ֆMJ8S.VΞ=z}fo7#V&/ĊaIWx?kkU`Xr]^ʠem*B®[BUED5 Gf\OgGӯKDxz[AQ4g_!̽M_[U^XnP$\""KՙoV}ktxg63/ DϏNCzdt{jZM.F ް1z`͏Tմ;Ydxrm* Y}z*O\i ~'ڴělá/3;.K.٭j>sed|_,1<<H}C@WUwX"njͧƪf;Dcpph iGsf 3̢J( WQPZJH @n~ G177,oB{kD{ںqGlKyP}专Ss?Br\KD(n}qnbplvp16d9B\L^,ܼ\\ocpBRWM8%yqq@iiSVdW,,0%k {+Zv$ʈ%"Χ덠jLlv++N1J}Q"ȼCa[gr)\v"%y.XXqy<nwh2Ȅ9ZV8z(ӯ:xowEC3C,n"%BOeRb2#zmmOZ'o{ 3-~>>q7yl^v" P1ݽW{|&ZFD4ǎ |~dETZ+;yQ;iDdoy\aΒΰI$ IDATGȽ<SCwY]F Em( YYqOWJ&`y&yqP96sy]?6X|ѽ[wkų"֐%٫n ]ZR'>L$(Z9^*cbbGM&hDZggK[,:}JMIr3r3r3Ci27JТnnLt{54>)OT3{Ɯ^Drr6=oWDUmřGUIOB_΂i"uXbvAR +rrXCT5`Ue2΁AV~2~*5!f\o Ӫv;n1#t\~e^̙{-`y[f6(!NKW5$Zx> Z.V='4وx?8=Ucƞ]iK-*ϋAQ'ƅUgK-V,@5p.d߳̕긼~{a3rKj.hJ=֕O"6QFĞ1}\{WKڧmd_c24I˄DB]BӃ!>R̛*JqKN}☁Ҧ2潩yXCqqÉ,ÓOm(2%@k}>$t#GS*ΜJ~.ޙ%fdET-;yQ;idQycwkow1$TMYZM=aL;ԑ{߿LđeqI|й+Zyolnڕ0x/K6;$Z)97\&[xo@Iѣ1bP0J `or\umAAD0]{QG^@?=P86ƜHzmRx9)p)w_ՖV gj>3XsBmWFT n4X:,1 )TVݩq;tdϦ$i{ת2hC5rr*f\o ӪgP3pπ?6)HM|AKop_2H/̽M^ȃkf:ji lZOg ұ>8Gz]Ĺ%˰+t{F/gf"",Pce llpwNwH|BWK={kD{ںq@uF?dlIb%v$~ŏakmtS<8f)d{O\3:fE"4b"!qGDp"!6jBn_:ل% ;r4yqޡtO?}dH"(;Y=eN'yԎu6TJ}bm[ĆΰIGȽwV#^\D<=+6x ai nm22 W `os$0-?\jro }$ei֖q%^$Z*5w+Rį]rXΞ7+*L- o&veޖ}v_lsvSaS=&W?w,9^ʠeޯE$R߈fd`ejqS?1%jtKop_2H/̽M?KX520k"'"poTCf+OO.cnvw޻X3ZXMob:%S7aW'"Lt{54>)/3[Ξ7+*L,񍗾z )lct•!cXn}]¾}+:Lo*(|0s ;]d߾9AW+SaE삤W݃VA8ZvAwf6(%gzPYDz̳斁 &1$pv4 +2Ĝעwwc3ݾxeH~GQ/CޭVӤi³7lVމk~b暓?ug4VEDڦA N+(M/l kB"v*psZf`Y_I벸8{@[}9XuiQɞM}N!+QeOPM?F4q'-C.>hԓ5ܼŸ+VӘǍ37.S}!&"[cTE+d}v %WRu۱/yzr8gw8ߙ qjƘ\Hh嫏=ӿGnޙ|z\#cƨy zu7;ۏDk=~:8G|nLQVgPZr8};F.Q \hy1d sC8&&7P2}/]^ARcmpP +g?macovw޻Rg+,LP3]#= owFvcwn= ܞd6]0\sL1^H8k}o ,3uN-+ة2kDݘY&l*wL(̷T?U$ޘ >wf40M#z˭M8%yqq@iiSVd٬|d"γ7BviI"ȼC46,mnz=B`96ɉ2I ed:.>LQ_Jdo={zf{h*.|rYChk4SyMHTOr< ns $rѬyޘ0!Wα17c.KD 7'_m`W9{_r22dh~}Zq1vqyؾpLHޑ1jeꎣ 2Gvxyf Y:|7>q7ylǦ$VG0s*`JyXߥHj i0{&jF-9]WJD4P?2€PO}<4_ˋ1 ,+sb>(}X?h' >OyLLցљF0t[=Di}OD$XLv"r5u[Z־67IXɌ{ˏCً6[?9O?JBYF(;Y=oN'yԎu4ΰIGȽݐqfepq~Pݻuܿ&]<+k ib_ư~jSd$1?SglZ.$"YTsyk=B:rU!""UVqd\*Tɹ?DnyS%"ʏ<#UngEsΞݔ~ՁY%vwxfF~-AY  )6nq޹WqiPwzJ ɺ;eMDQb6Kg0.jѓǏL&Vuksܑɘz NY,:}JMICm'D#4b ?9|ԏm6IdNͿ?ߗnX" 6,tspb$>aW'9/yS"-n+Ԣ܄׮ʜ}n޽Z)_#uR{*q6:X< 6(%'-*O&F3##sm_~e^̙{-`t#kd`5 ݾ0='4وx?8=Ucƞ]i%xr/{[taʰ%V52`ŭwW>A,dF:=7sfw罋5iB/o(qN7/9CcJKJ't7^qxYfÄ9Rq8Put$fxr3o}^^>} љ77pM:2PGEhw ODO?Ol2F#::;;}|fA(*5%ug`~ػ&5Q_R% p6`cbgf5o}oνnzsg]ݷޝ; M@Ct74ـgslIJz16ejۻT޵kB!0oF!B,Gz/֖7;F pۡ\ URx-wQo^x9кWtW\[`[?KYC 3N=ݭ8VyѸCY! {Nf$ }G}ODP *ژ\6{՝ dE^iɤW#;?}9ᘶ:d]ayUאIY}8t}{dj#G3̵7)t 5ֆKfk cMk{7U-2N6o3ukxdo9_C!9ʸR}|zp1E.֒[^ ?E X%:%p(8 jӎnOgﳂE)٧?E,y75f{) Nqf+f(ٱTh^t]5t;zt:bچ[2KW7mR%)C;Hi[7:g5Yb\|Y"cPvGa|BϛIMBg (YX"亇G, ϛzĚ1Xa>o$ͣFBg6y8{0Q`xTXX9B)LJ`*3cw8{ E,AfLTu v+A?sw\ Xcw7X6W)4.ms p3Ygݿ[/`_еrG7Gg_iCCc_ZM^?Q.س?K?uedX [K7\P1;l2-;u}8>MQaq1v}935|wRPV*#^%p/a/TD쭩* ڏ. by? 1'{)MˍOW|Ģ\#1PHq `~`s=g9[kkh4mf3!Ul kg˰$:PR﫻wB7lt2-\_kt8=uAh)ˎX哺as|x:$_2wCt۽NΟ䲄or^N EL6+̛+_!餹3'\$nCuEUy91f1Ci(8UڭM/iН ;qϞT}qJwu]׌wٺU^BhSMB2$|Aèf<|0̵z0nU Ð=g~_oW|cip?$VZ#,U_Mv$ч0UfAGbi|0e/:HĀCS'ؽbMz1GҠ?l1Ĩ ?ihcɩI ~uh$B{yap-t]0e/.%s~μ2.G,Xztj: ˛QA5'.@#LݻuKkcv%@H/~A=;ԕuv'^: dИw+yW_skM-C$L65.+O'dcJgo?>UјJyil^O/\]{tmc #Eȏ%)nkd:oQoyJIxG;&/=q#+k~{scߊI3B-eGPr蝺*2Mܺ{uhdѭ976tj8rvAI3/>?)WȨ$*["XS7(NL1 z٠]]TogCu3M}f\ $9+I q}{_]ː60'6H+#d\T8sau~'[c k٦W{s=UTV^÷}[w\,Eo_|Ͽ]q,l'pԣ XxiVP;[Ł kTBL!)o&(ux/4FjnL6f8:H#1bVştϷzXJzuBibu^zICEprw]< 4[Q1*@!on/Veɉ~i%I($w&5w (wsIU%YAq)1HF$yp=xjx|0 I 9fs/D Q:·(w܈֊(`)jq9GuZXm>'E.0"|wLi57v6vzofrH@NN7ݶ8vwI Pxf38i#!O_=~s@D"9݇' yӌB2zyCH `{+l1QGPx</ ɐ#Yof̧0 Ǘ&F?lx`nwfw/&({;|1㾾7t"HDsb8ɫ7|ʋuYl, `m6/ZP=6au$YJ*mLtal XܸS0tψ4ۡڍ6mT5T4qoŬJ yVD!4gsh)aC0{B\ohl0OHU2;L ~wB?a m3s}ܫMH <(nQ]?49h{Qޡ91d2XGݴKq^1itL`A}7Xf8LOu" .t6wH;NL0-7wݏknXvUa3L7騙m̷ͼsƇw !6fVfsW<pƺ~2_LY}mýVY~OtRCbP^̰ɿŦS$6\zWpp4|];YWiǘ̆JhJ}9c~ІMoty?JQgIiQ݅9k횴-嘋%y".i]ltiuTI>+UXOԭٴn\pM7O$r4L׫c_έ7O.Fu}^aeb=Op޹[}CQTlPMu5zrmahFcA/g8jkkZie=.;A|eG~:&iQ_xZ4Bh##? ^%Vr c';;G]r:wFg/ z[ CEMzb15x ;8>g:Yv{ג) Bhƞ]?WI]h r4Bhy!ty33jgq)Nb5,$z=VNI8DLB!1DZaRpb&=Uᢷ_)uOQSǢ` B%bйMB'Vѭ9?#i8m8p!B- 󻇏n/Ve-&pS4b<̖QnCISa B%ct{򑀜$o"鶍 X,g|M޵?N6R“7I'] dB+ !B-RCsȆ$a8\`Q5C5]P}AK(<<.8W)a2f!Bhͬ`kGy(;\Ԗ5w3M~`* ُI3B!ZJ(xOcBuR,ZBw*1!q|6B!Bü!B!̛B!¼!BC:Prv3Ì9S\ ::|_)ٱ{V zD`,%gٵ³m+!fkcyY}"X EGz-cpɐq ,nۻRwf;$/Wd[/j[}~zVmLT.k꤬͉>tRoolt8r4\{|Oɠ\nߤ/ ICX%:%p('n_?(X':;,ul;u޽r%;^q>'oۦh'-KRMOF%s&BϛIMBg dmIC}bM {,0HH4ڇ]&6^H@]YGᥫՖG|WF:LVtETzG%ޟ>cӆƾTg;+{k&Ø*R7fM[vp|b쾉r|k\[^˿k徏"$|wRPB:?(WH E%KF;D?h[ e$&NѣNCToB-Ӽy*pU+ָ.&u^vVo|aRJ/xڇ$lA0y>3OJvbLjHx'W\αv޲KweY? Sp+~ȿYbi[+}|"1w: 7_)R2YY[oiCL6m%E=-> a8-;ɴ#$\~ό_Gbg)|,HvT9m }!Sz`F1ᨾrv]ƭHQKD+ nQtCf/o1-oe>/\#9=1Oytw cÉ*^+~*Bh lNGC=wꪰI6zmvN͹TW6 [s7oP{m> qO?Iɮ_|ſ~v44V*A'LmK.,I*u3O|j2p3sio"Pɣ/ =4>).v1qCLi57v6E&; _" E|FFB?{L^. IR9a `4e(Gw/Õz9+z+ Qzp45z4UWŸI{,-%5F>B\ohl0OhNfeЈ[݂.Ƈߝv3h U6;&ɹ|/;4y="7csʸHD0>ks/4Py5ymI=VSȪ"6ck~Z7JmgCmHIIIgxK!"J2Xgo h+s+0Я {5S}6<{̟tQukq$f_S:DyT=`pV.L$Z6Z۪ls5Gy(;غk<(v=O$ L޼:laQ5w3M~`* /\V SQMeDݼ|T"xq, ?hæ7OV<K_Չr5vMJ]rŒ Zˆ(xOcQܤݾQ+\-JadG*J}^o{,r̵.Zy]YI]*}bSkBw*1!q|r"%389iGǃ&vm& 0,nsmM~NB-M7/3^^goC2>ԋ0=7NOR*\ !|< ZrpB-ip0!B fB!f7E1鱚%]K*{F,O⛒%R\d8 Np]*B!B'ofF2.3E:{)^,8>\@W޸:kgY=*=c蔄nLĤ!B-$M{" N? Z`z̡kG@ӮzĚ1Xa>X=!BhySMB28VJ/wY\6:==wACgۀq{8b9}XK!Bh͎{Fma\N3fڼ'S*}Nu[s7+[<_Gpp,B!Z淞^z!ZL dPL/.Rh3 , 1,܆.ZA!BK<ƛ#99I K\R“7I'] dB+ !B-RCsȆ$a8\tz*NT76K(<<.8W)a2f!Bhͬ`kGy(;$٣eV@4R2Xc}7{4#BO;6 z+!^.f}bSk0\!N%&$F!Bhv7#B!y3B!B7#B!bފ 7kk'e %o73̘;@WAN_2<5ąhަ.Xu0-m)z8ßD_llm,/o0;\_zpj=P >Xk.\2dȅ'K\tw)~D1ux}[{ ˫,_NڜHcU{?Yuz^*0&t}{d8r4\{|ixpbg)/_P9xЮYCQUҼHmcQE)~Iۄ+]:W^n:H!ČYe\fF)t>StXpp}Yp23&S[-D$ue";)`ݼ*VSD6V^X)o-_ZY"0F e=U-Aj Rfo' u]kʯ=YE_fLj&'?khp-Iˡz 5)c(|:ZzaZNk\ 'mqˍ@w\YGk/_23vwPdlD{k=4QAQ Lߝ#s7>HG]nC19?SZz0"ԍa2w{iv?Ue 伜<*,&ee%Pb5ݨT>`~`s=g9[kkxWYg=Mަ'#$G~{~^&H-}|R7l IDAT>YTc0GhDxف[ln.OMʍSPXX54 b7d%g+ZZ FZi+VY.@ nV1v |zD`,%וyc%t /Q;cۘXwEAq}﨓K%+s7DK-(%SN=jzN]OvTuX\71omM}7]}x|5zYhu:Gӕoztɦ9a)<zw%o4jHWdoMUQ[ņQg36ZR+[2xA_d}q=z<1~\+EcC to٥;ퟄ)8?,ݛ&7<okێ$[,޷>h]УVXX9ʼ+ǯ|õxNk>õ*8GFyWxЇSIvlX#^rw*wUNO̎\zJ;Zo]+6Fem s^IN5ǫweGrÄ3f49/u{^-Wo۩UV@#~ďo=2ޖ0u nڶ1mV=b#?:亭}cԌG 0nExFJZ" z\_}pQq;ʸ`HgnsAvB6bhnh\M*5 30\.llŤKxh@H2[BI_,hmMm#Ӿ5 3}|yLy6<?#\hԧl$*["^nOZ|Sܭ3'?HM]݊`?1' @ݭ-<1Q!j0VQ"xЕaNfisv*&C+z&F]EH`#Cf' yVx\ \Ze] h_fd{+#d\TXSt4t`nGLٓ^hxXWqKUxJ*8pSw\J&%NM?|>\._B}3fZ-2''[^Ɔ:4rMH;~ˤT-txx@C5N|bs|D߀+=6=X,EQĨjj8A(DBk7; "$`^ljL \f;›(N*prc~{tT<.V0"\:։k-`螠ԔYV܃7 |UX>şeq;R^hsѸH6jc$lct)`ș 9.hBhsDuleUˬ'(u}vB*'7$ !3+aƙ*NⒺa :\xKIΌ]sc*jW ^>0C%I_DMZtERx~A_pL^. IR(2=uCBW` 'o63fgO$B7Y$%|4S34 <8ݦ>@(EzsX_e/ALF<fbXI8v uw4ns?q-B$&K+ċسg^ቔr~qhʦ(!1B`kX}%lJpn](,k4u:v@0ʍ;Om\~4ce/e4GEWFZ̪0h7`|bmԹ!Gw/JA/ߍ$'ojD)z{`h08PD ]Wuz]v xPPin~ +lUM4УA,Y5?6Wwz/bL2:5hNfb_dXG^ل2.Rf(78LƇߝv3}sSZer9xc=s`3XgA1X1&R*ǻ7zxReHu: Q`xilzpS[BT',,MYe<_ זXc5U*"`]2o/2d:n $ $6gl29C$ $q|\0PS=<=̻mS bbû⃧Ėqt?1ci|aW;"+t~|ÔoRG^Q^-]BCGD' ^0oN,ۥg[,f?!ީĄ9$AM=V&ͯKKn0Z6>k'GĹ=#{ f/sͅ e#";Yx>~듔<|1+`XINBi В4Bhx>O@!BhV7#B!4o6շ./ IOPΡ'+֦G>rkͅKd wޕ8e!B-ʸR}|zpC>Y{k7 Z=VNI8DLB!1y&!-)T- >p0c M^H! F 5j1XZB!D,`:pUttaG?Llhlwk6`ǫ!{.e߮$9B!Zvy;u[`Q{%Nx!9a^ +n߬͡l|U|Ik釳tX?!Bh9t{*[dNNSjY{[eLd85z|Bjwf†aqn2#UX9!Bh9t{򑀜$ĊXGhiRZEW!yͬfq,GnC1 dGS}4 B!Zj1SyaC3OZcV+@)%HaheAЩ^gV B!Zy3Mܺ;akn%@Y$G M}}B\ovMB!yCGR"/$%S (v+MzEQ ,JC+,X1!Bhy'&,C&7! x)o$*-kNJA!B0of-OjGm.Y* _wV ӄsIVQ,B!9opƺ~2_LwK4VX|l"xQŊA!B0o&āoNt}6JXy˼vc B%Dʱj]?zB!]"8wOꕿ+5B!!B!̛B!%ͮ_ṿc+x.OMU/NEo/3>? l@?/oub B!3wjM6KV'pF>4yA֫f"NmءoO}}ojvǖymSEQ?]Ko?pߏH[s8wkl?}>2VKoڽe{OV■,(鿉R_}YcbSU!ǯ4m#..{>SmEB-Ἑ O٘"yNskIb yXK_J̜ I_v%Dv)(X 8|WBȩh¤a:хbjj _ǁA~7ם|a-Ξ KFOW~-B!n,Pk%B{x Qq|Sn:PyXd?ڳ/d&?~^wM.pMR?^͝|bu#2o.{/c]5k桲:jo7s[9`|_5U9H 0l^Sdtrlտ_uKPxc7XÉlEc5כYok:Jҷ{pwTH.wkP6V&(&1b Ay1sIUŒ!BK6o^OQx>ia~?w zĵ{T/Dp=M>k=ݶZ6U>pϟ{;,L֞7c.Ob1w k;1W6d$Hpyk"W__)a_W)/f?"m_ ` 1۽G%ΘD_{v&@lo%V Mۻ8:}[%Ye$#vǹ'f( ٥f8 rlH\߷c[-ljmV؁@"'O*~yU_=#N͓r >=;''y5deZ_ծ\޷fFO\u笼̚=9q5Ө{:e:6nIC~th}Wbΐ.jY'%slVyC+!5v 7Ɍ/H n:I͛7PTSz&+&e%nԵU}cWፏ9Y8k^~WUq}xϯn¤IY(ahs7xH_va+N|ESVvk~oJq*VMy`\kOߔD~u]v⡹-C=/uC˖fMq#*c>:ӻv8Cb̭]p<ڑŵK&w;3}CǗ~iqD} ԵksDZ4o;ؽ-gdqS>ݓUf]T1-u}Ȥ3=ĴYuҐM^00"J^4'zgB7#R996g}^[{5tD̜/.Гh߃3ʂԑG7$no*;=w""oŭ٩Lk>Q:=z8wHg:[R7a֜)Ѿo{;[R?yΜ3[;~+sm89U8eE]-[xhﻴ1/m3NVߵw%?IT)I>vpn4漊o.*=p5"/Ræwh~ٍ6nw k e޳6r+gzeǔ).+xaݺU8 4zjο뮸1&bk'yi93潱}'?/? GO#SS0jzo|[ѳ߭82&U'F~_!ǂ ?YɎc|G\vٴ7|>ݻ*1M40LU;3ե#{.^0,?[繖Q_:4N3J,]lI'sjF͝;*"2Mtf˵ї{˥cP:G&pvs+}x&Oke. a7)vP>15?"nzW 8nBDZM~ݻw3Hd2 xGٶm[II)wkmmfNCrh`0H@7n t3@7n t3fn t3f t3f@7nt3f@7n f@7n t3@7n t3fn t3f t3f@7nt3f@7n f@7n t3@7n t3fn t3f t3f@7nt3f@7n f@7n t3@7n t3f͆t3f@7n f@7n t3@7n t3f@7n t3f t3f@7t3f@7n f@7n t3@7n t3f@7n t3f t3f@7t3f@7n f@7n t3@7n t3f@7n t3f t3f@7t3f@7n f@7n t! t3f@7t3f@7n f@7n @7n t3f@7n t3fn t3f@7t3f@7n f@7n @7n t3f@7n t3fn t3f@7t3f@7n f@7n @7n t3f@7n t3fn t3f@7t3f@7nl@7n t3fn t3f>wKk i|3Zr+/w`:mA|3|orazA͢@:f th n\o f ttY:fo7`s|϶-dNm`M~T*uөKJJ b4@7n t3fn?V :,|౵{[*G}G&ѻW3>qՙDVʟ|?sԆ~ޣGg5Շ-LLnqݴpTU?^|'W$eOۘ4<8hYߓ{?-?Hu[U=K κ ee2;#1_{D{?R{ݗ5_|?\tڭ.}?6|+_94"3؞N|QS1#.޷dTA_;!xvsc []<«/#72"s2^9 Rtј5:z}=u1uɗL~O-2Ɲ.ٝ;'FsDdtۼwڙM;2SDtn}~OoDlݰwܘ*fxtտwhefιmㆽ֦N8x\0*yp&ٛ +?K=Nx]-TUyEeŐ>pa*/{*]:0a\X7*=Q'aOooo&ݺi"}trV_[:튫N-W{ޤU]9z޼טlLO[/V8zbMD$w3ƕ*{lݗ<6½FDDyQlشawQ%1-[Ϋ.9K>p:ăwa|?X'Hz/Cι#7mZ|SSwoXz˧ϩxvsE]EJEDێCήD2+h֎?әDل]c͚.jssƑqr9'٭4|ŖUsWL$zّJL|{r=厜TOD{}݋k#"bL/8ϼ51bG6ڸo?BϭJDD"";qS/jkKL9]95yُ/x75}\Mg )MD&j=iᢺ {^B^U#r؛NwuEDt/*Ljx]]]|%>rDϰq.[̞eϟkQv%;S2'Dtm:cೃ]-J&N[lߑCٰMww#"2]Z*~׿P3}y+z7j(xws_ֈoyOO.}|t~ Ku/q_W-L^Uùl1C"sh]<o4DKf/#>7T3D't6Nݻng{UgO7e!FM?{d:^ѻuLcKQ~Fݢ7nl10"".ֈDІ+{tyw}[e Lϼf+5{<ד*(9㦋L6$M|bP_~s8zDSVU3pEM2A}S.rt4_.iMd\*vB}YUggA608$ f@7n (onnk,ߖ 0 |6pi)TT'+* $K?ݍ|IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/metadata/000077500000000000000000000000001461403617600217745ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/metadata/image01.png000066400000000000000000002506451461403617600237410ustar00rootroot00000000000000PNG  IHDR!sBIT|dtEXtSoftwareShutterc IDATxw\TW 30 DEeBbQ4Il1eWcb)o7w[n6EƒM$1M,X0XPDT& 002B|?;w9sg{=@q8n\."""""""g:L&#>>>۷^DDDDDD2 XvpB;SYT+HkfO.O """"""TTTҧO_7UDDDDDD]μ)-sEDDDDDDݲat:5˳oN 92X,G6a0Ԓ"tr9)//R"""""Rˍn-D=1UZZ^#rXX¯jCp@@ &I%L&"""""M fU="mV"""""M ZI gWDDDDIdQ+A>>iRAH[ :y%""""RIӭ+6F547ja\*ȃ=ċ/@qII5xܚ xx<^.""""""ggf + / 'LٳVxǥv p,BCðZ[V-SLQϿ8c3L"""""" =ӻw/zW_ޙлw{o6[`0t:s;wl搗ٹc;~NtNؼr2kpy)NSј2-!DDDDUp3ٻw7 =Iß{+++IKK FHrppӫMחӧrٸ1DGGSQQIFF~/i622~!++8|}})//krNkyzt̙3߿/VÇ㖭Ov-pjUC+Jq>bw!,,0rr8 5l!~~~<>l Λ >.АFz8&NlSH\2洕b˯FaaQ;~քO?͛k?0h\9} YQ2T`@iZ3 tꊣBٱ3VQqү__x`6~86oWZo|bBBBؿ?/2իxΛڵi|>.9N:vٹs,/o>x<V$x:0axn&:SPp|m4˹;ntkޡ>x#G <, ~pqmеKJJJYk= 7Lc?!?p,.B5wo/RR67iѣ;OP1 4*cc+=ϦM)'mO.ӧJA<>]g$bV\L~~>6yw҅n>LYYPvO:ժL[o Wh'""" }x<}.l'tRH뫞z3P3b]74,+x?pa~9uٳ`߰? z^+XHDD~1;ud{0pl]'!ageW^{g㦔FeQYY_FJfJKKk-߰~#WNDǎ!$$=z`^~p8l۶Qyoyٸqfy7]v#;n V&-=чQ.$4$ХK{ұ턄йs'ra2p8'm_AALpE*Wl<¿ ("""f[o8!??x뭷P9sLpV eޟ=FЧrg>xj=!{ |w/0bD"K.k0U\Z,~S8XkfW_SdQd㖭  H^ɜ9p[T _^RR PXXGcYk>o{lܸ ͐ , Vy瞋jCCP{V'|Ɯ9{t{a1lܸoۓ;wqaJKK9`XMj0[,BJJJիWp80_^Ě!tbgMN,5h^x/ NI F~ٜr% &ϻ͍t6xuywK}v_"+0 ?qS Wae*n|||HLa\8r%%%z͚F籶rt_nMۍ4kVk~mqqOx{^VvOwm3KJmhٯC0 _YzsmPFC7{ocۇ~q|`<`COz}r]zl63gޡ96z[Əŗk-^nn.ns9{\M`@:}hCxoa&\AIIB?K*AZDFvu#ǃd ZZ}W^ ye,X7?__|Ҙ;u\NRR~l6c5#rZZn;ŋRQQADx8.W{v>}*G IMC} 3rd"aaa|ɧ'ѥK?g̘K9IqUS8ň\8rƬs2qLv?@^^>AALr2.i䒒;/Xbݺr啓xݞm5mo'5u{h2?zwqq1cǎ}u\.?s G qu Q.RC(7:v>R `0PQf+>sO[n[n/Orqz[z[nӧQRR¼y 33?=+.pȑZ/5+hd bZÑ'NϞ={ݰqEEE\9y7vz M4yyy<_NhƬs2N__?f;0JJJػ7f?}bNˣ|w&+\sf_vu\rN' ` 9-E u_,""""r&ki2ޣ:wHյZ5,CqFNh4ppA\wݵnz5Nme0@vV6ր.l۷{ׯB|}yU """"\Zް[rߖכ/'<<v1{8r7n cN|/luvJ>a6)**b,YFDDDDDmh!"rzhBQ-$Җ? 4.LfH DDDDDu,ҶNb4 B"m>"""""~PF"""""`ٌU#XVf 1x@hhZF jI-9F#& ,M|%NGyy9. ӉVÈ#":DΖL`CI\H!CEEN\n7ǣig Fm;}1 j|vvEDDD΢c@˅墲2 XgM6|0|04+7N Ӆ7 ˰6""""㡴r[]`J**+,˥`6|}`{i&`9}JK픔!DDDDۍǍ`lj /7ө7UN0T*(//>f6Ӎo;ƕ(SpXR"0 Mף+  b„$ DqtgO*+Ybdgg?rL>m+R MŢmTYY%% Hٞ`IpH0y81mTMJpppϵl,\ )???:tVdVUYQAaQBDDDD$$4_o*b񥰨~_*qqMTkBp `|u bBDDD,dz Ŷ  ;*wO~XS#AEeh3@}1TKFSYYf`` Sˆ --[2o{I}ySz&l0x0zөsس{7~r#nKIgÞ 0gWYB|Hڟ^v""r8~f=vQVVvCf=K6i}5loo]CSRRXd)IIHN^ĉHHH^pp0}U=-Νihpu @HH(^8ǣ7y7 =;7G{qƞk JK20i4"$'&9[a&f@}z S4  !RGp aX"$NYwpeS &9Dy#XCYضam3npxq:r"Z&OȤINimj //ӧܳϳdR(~%ܳ׹n|\ӧO=+O???D(9}|-nonO[#GOۛz.h7fOpuX+>ӫpϞLzJuNUEeEz+[pphH(WO+P^^ΞM>wu +n'6U`]{%s"Hk߽L.o'=й'ĻǏ8wf]ѓ`W)u9uzߔuۍf 8'J̊o6U)KIے xzfi$ƫm> U'y 7R*e5}8coq*lI0wdֽ~] :,"">.ϻSSvQQY&/jGt: b괺CkjRSx\\M6 7)ܹ`r 7}k{J ['ĵ7twߙע"=uy_JVZCU{{ yYyYoHKO癧e֭-Fkpes^ǟxǟx ¢Bޘ*9ٌr ?KoىD0jfW݃y.ϓW3vtmywH)=1&?<5x{ ygWgm'CKqW04(՟.d :dű hQWpYOHs}I+0(Nm ի;~9i;AQDyQUس -ZVcQQ֌,23UlUtfm+iFNff&1W;<] #k tzQ߲`Fjc~2}w^[Cpk_uX+/֣=€Z^2l8-<-ZbȰ^1ĝ??mO3,8=m1=^'-=k2GN/ׯ{wIƝ<1?H&7f 󯽖ĹOuOV>\9u$-b|f :\VoƾQ20`6gծ" h߇-O}yu)_r7R3ɀї24htn9FWOx0΄+(ؿ+ֱH<f7f_QC.esGI6|ְ}EOGmsŮeVr^[Ye '$LozMLDGr-G`-keŞ"02aXL]U;_">{[2:wY~Rlu{I0G$~bGC!1mS(F2[QPB;n, arݎ(u##7˿ewA禮}#%BQ$w#edm7>>|}LD^Gbb"o6v R33x\pFLJ߄]C$ T$%bM.ѣߟ}2xW]5wE.Q< 5\̻sۗ?~իzWN➙wӭ[WK8t/4|?)cw/w/3]zOTV乊 k gjBpĪO zߵw|<{w>ak\Pw+>ڿ^P'!~[i38~238ayO|0#jDk+6vʦئaP7X޼uS>U$E_j+wn ,H?p13] z˫kTOb-lN+{rټj1"{{.igY]L#&Y|B/[}B pPPD Bpyzc OdrT~q\vy.^BJuU\5u+>;LH*m,vY^CǾ#p(r3S3? 'x*(UV.(+[i IDATzt/+e;4vSֲͩÏ4P6ȮQ˷,mpH.,Je丂;2Krxz\?/X+8 >Dlwz1t`֬{xj~ǣ?'2mu[33^!/?E+Og>vݻYyvj¡,z/Y,xth%TMy7=o  %5uoe6-[rp3x7|_ߟg'zzncQ 1AU'Ynnnt"5R~gY5SlϞ|'}NZZz}% i![^ssMâ[6nΝٳı߇߄ }[40ĬJY˩4,Ԉιq ѼuOV|:gה0q,T8*X ƦI ѽbL ɀHvvUkߑ`Tˠx++?`^}y&oBBu,=xtXZXv22*;i`/v='b;XpakVٴ1(R,''ݸsdѦ ,=eJ#ǂb{ '՜OWI.9'bZp:~9ZnNW“ͩ#֑L;dУ'5*XcEG6ջorrlV,}pqI1cg-a%yɓ&2iD233yg)-+kVp.;g)esyJ~:okV4?___>B+WӥK=0Wd2p<]#O8P9ꓟϞ={T`"7|c|O?OlvW8<Oo7Z˯2 ='á)s#=(Vͧ۽9w6P֓ͩjr:]sԁ?v\~{_HSnato]koD֮]o}VϜP\\̞={Nݑ7лwVonnEEEt T &((Lkٳ',~:aXLpp0+W:r4VcT^65':Gii<;oO>Tl6s# VUkZӉٳW OM4qw.';N;7z۝:w&';E'q6Vr*7V8+r7gmE ƛooeĈD-zk'11Ҭk4uta6q\:uB/ Y`!Fbksv4Xx)K,W VU EmrY r tPPPP㟽|aWfy}*d'n;2a;vp;q*Ҍ7X֓MdhF۞uN7LNF0QQ~ۇDD|Jʈ#>.Ҳ2)++mq?2rzܞ=';u,]#>̜0w뤤%Kya,]ܹsOx~V֡V)9Swzvz|aݛFyy9et:2dpа&1ja3K/*a9xC|:/}UWUwm=nXdXN,䃳: US\pu-gǝ'\ٓA՟]G;g=#yęYcnw0ᙯ!޼<xxJGvjVfcu9 3!f '>162Kw[vظz%$m&ԓdQ5s).7F+Jpl=Nbi#iY5zyP&Eld_Y0 !ҶUNp> Mby#GM#'0Nr8h5((Yaf $CEa O4G2bcLI/k%YwqذctAΌ`T8eRObGlN:Z1U]DL87e%'I\!-L2uԥο$ mG۶A5Rٱ^4Df2Dz3Z"rFfLnFײ&ݺuk6}Lg +z{$XIqI1K^%'lrWTTsY.o؈l7K/au6.8Q1c=ތ5o|nf عs 0Oo۾+.7(/rf'-Fᗜ^_#VW^~|g1lP5)Vvg;/nq7/ZDaQaɯBCBjT:vGRh>~̱Ew#i :XY-ΕIʇWwMɌNĘ㇃C|ƪ۟$k|{ ^MճN >ŽOXZ6Ą7,ŖFA+>$_t|\Ʋud9}1_Lbc/=FAPDž~PYJAFYW5YxD>U_`#,, T-/%}/T__:\/ LP^˾\I 8qs( v4 zvvqCHJؼluե}7X֓MS]Mmۆh4or.O?zH$] J-trl&c "Ҙ*ŋ&3R-qV+)~ֵ{R\|챬xӧ]]>U?beRXTm݂Vx7ƛoc2cƝ̺w&0c=ȟ{EF#r!رyʽ/o:w=MII ,b͚Ue0e-ݚ` Mlik]R=7UЭ~k1"G{A񐗗W?` ^v9~ {v|;uLsqOؓ93uǤu^˭rciȽÏ?naѢ8ԩqy؝m"""O\|ۼcK/imB ??r򨬬dƌ;k]/^9. kӦz)DEg/~I&z;w\y i=|3lf:DY5/Ѣjٞ UO^W]=III lݺ?{ [)-7۶na 6?$kMr2Xr= 5amgS]E\vn F#YYYsӍ7PVVƪԷtEך`hz_gMt;6We=ПoO"%e|=C9ۉa ~Lbx0BL8 JkvPPHb4 h 赥PXXDPPK~3qdPz\9l6۶ċ/]άQx<-~[}Rn**+(*,TC#?B"UAA^Ne[gIui׷MrafpĜy{+5u3m!8}b?ͳmH8q: ӧOei' ...fႅ,XHo؊lLm m\Iq1eejiߟ6]ˉBeeU7) "i(F+C$'AZńk6S^^&nΔQR-(0K=VIoJlU^1F=dCII)LDDDDmcN%DtʊJ**+0l$*\zw9EDD;G""!~j=3LA\| [2nObPFllٲ8poKJM ܟ c{g{55\{vZikED4a6~|և_?=kV,"m;[3o޶uf-kfޚL;M%"w7 g@`,Rl/UQ~HˇG2̗ٔzCXPD Vk NZކ^ Fo+8@pV]᧒+KlGLO?ldM֛P/K(ogwK8v ˘[!XA=-ϱ"P= ߗatX*⃵O}b]u=(7SƼϵ{k̽ݶR>l޶ $]y)t#Dѣo+ חNz}.I= ,}NΉaK91q+獝U#1]B[13oZv„W|X{ӭ4#r,V>wNc ӱ2fĶs1#6b8΍[q'1d%)dx<>NY}Pv|C^ʹ~k3LW+*?֬e """rvYf)&a))3tML8gM`\y N{Ĵ}}ώfؽw__z]0\ǻ7kMw_B>;+j>}c_|~s 5]c]"aǗ5nޤr}\;Pc ~y?P`B߸3s_]}tCSDPӈ0n?QH?PO~|t +p'2 $u . !cB ځЏ@>H@[^XDDDw.I~G[S(DW%%Eg;>8&x+3&Rj\GO29Ɲ-q(+/NGr8s8T#;kv?#NXd$& jf H~!N')wVɮK"([Ί}ߡ_$rn\KLB>r3KFo|݀ptNI:d?2^'[z&m\d-o3OYDDD`;?BiϬ(Hu&WL{׌#Eqop[)jWk WkV23`DQqI˃,~g*WF?>@/"?,~ۉq֣۩uNg˖V[w Ӿ]?Ke*e؅P/T9sbsIꘀ`]U+$I >9{VPREkuC~jMcvēěY;vg~ȶ8""""$WaTJNa+f0J]Kc7SNkg)w[n!!A'?nc =kZ1AI:2O&ÙD|D1>HsU}>^:@|d1 G|w@̮,ɯ Xϡ[pwNvKUhwZJּ̓ q$NyC}Jo8@q%[~̽:ė,iWhvM`8);X@!m羄v lpRNSՃkbJXL@gqpl5 Vy>JK``o9v/) X:;r"}I=T)OҭxN_uKrºOT⇝/dZ4FwYBZFF"wyuN@3'3qT }蛐I{WɞfF٦l3_mz:~`SYo.Q\^~8#nEKP#@@$=wG'+8s9c8ХK$&\dć=HK;*Z;$X&2p `B|ϛgq2K$ !2r]AlD,@oD27| %NN8[j$]M#Pu"O&@0D9<4YDDD?cI{y$/;_XFG0nMdYd IDATeHIPI%tϨ&sNqUɆ-H(Ç ">Xp:r'Oܷ6~-Xߦ,S؞qJ|;׏>[nM񽺳35v5kvMӢ8b; 4'oyض10Id`( e $\qI6ϛǒ!7EUAd deuu\a᷽a;)SkJӶumjLU4.oz; C@thAbxx0:׹50s]:5?GA-݇Zyc_?è32a% E,N_â9 f џ$>)j3aRxBCYs=h|@T*NxB*.La[ ip|*K)cn~x4Aht2.ey&[:B!(7H՞GG{9Y'!1]T`0Ӱa=olXNjAUU~vētY:5sX̬{U+if5zB\_'D֟0s̞H]pjL[{.ZPu UnLд8%F˲oV)|,֊TCYS eEH$Gܤz/ 3HZ,g8Q)g\x=v񽟣svq&*tr[F %JL숌%ݶ˭*{þӠ/4}7#Y??죝AYyhKW}]D~lϢvD0?"p]Ӧ#mL iv%[KوƸmkOdreX8^i{8Ix^Z7,!zƸ*p$dY׊sd0`T,&>;N65PC 8_HB!`£/: a+e F_󀝕VLYYPs3Xn O_}]B7^wMTwǓ8=r6Rň{Te˒ג߫i͔^K|i o, D{ڽ5KY Ґdx \RI|Rlz=̤*]Zo:]|SϞ"+z"' %gw ˡ -Di- [_mV ֝E.VhROxGU}_}[N5M#?о [7)'Wyd~lEݘͮlv]q*~{/Ⳏl\SϟfF>oLIZsB!ec8ܯ W-Fζp3핦o@ Wh~?ТyoU{ʞYdM[ΉZ̺2_Iә7wx:Z{iw1Wa#eb~tm5doH9ͼJPXUe^ bOaz>R W9OO ߖldc9؏!vtU~4*ѽc!t/c8{ɿ ɏ| o !`KE-]H{+ %,nZAۯNТ#H׷;cip{6^|;1Mm1ފ1e ,揂JηHZsY[)FꮫUwČl?HN!9$ȧ[ !@L֣MXbUTsx>!ϖJ]_L&w%瑲x-u<÷ ;|x+x"ǵ2.pNӠ?+0alM]_]Q?m`ђ-Y;_t|!Uv)Q~/ճ'ӂ*|ocB!UdlCc~᫪YG#.Ly9Fw nť7y aO_;ǟdȮV0wq[PHR7yˎi+%{{öN=d E@+ػַZJI+CejâgJ01q?FYyN@ͲĈΣp\sB)iНwX4\t Y@ʣ][{*?CQxCG:v y:/x`~Bq[MLsvvU@Jn3eR0;9K]#k;`$eM xSEO >q )Z9N1:b &QȇyDCojmtH^^Σ '̔8 W3Т lV_`4HCۦAk9a)ӮqoL~ɑ31u'0Q!}Tn{ýc#G9 Ntŋo~6Xa{TS߆߆N9eȅ~g@okHOeʳB!XVaBR=O;Omi&`~l"E鏂#bxaS=UZDqq1~$<zG{+(zZ^ѵ={\a` zW6V6_֐ӟۏqt+}FE_pE܂ Ӊ/6PV !}Rť ,B!o9{C~܆2X#iԛ/a^j]Q ÷Ԡ/dTU7v]i;ݛ)3摳d>o,7zn=ޞ~:Wd=Lne5hռ†hb<]tWx t 7X>)W!B;"{yk=Np>`U8koV{wc-wM9N7nJיH{-6~|4ŝk sUSp~rvnW]}VB!d,oTנPLImFN|lw`[I[zWw?y;YCs3ۻ]s߶c !BOF5 -u\vO5̛s-6rraL9QE].?ZQjϪv|T&y$Sݷ)+L7yzhnZͪ^=YaDAz_[=y>{W 笭]ŵB!Q!jk/E۷u~gO_6@)HIܿp9[6%ֵmkk9}Gղߺ>hkUj_!]/Ĩu,S*kz]~YAAg _[1~W:prB!p7#>3 ςareŰLneĞ$̑{Mxt ;(ow'!egn: ʺ$.5c>\gtn#ݱd=_n%zضr; :Q5wN 9=F +67Sx ƃT\!B!+9čzfWI\Y:َMhmYI{e0G-Y۷SX׌_]{zZ|N"5PiL]!#go#ߏߏ #joT(QHny/]G6[Lb@~T+B!ĝAGl ]5Jη e[)0Qt"3{"؄9ى, zW#NrLo}BuGjazPN/qdzi3{bq_KQMޞ.z L|̢\=^Evv/ڟ0l+%qDΐfmn9L9 L\!B!:Ч{5%$ȣ[nS)[Kڻx^ESxbyTL'%KbΕ6l!q[ 'tz~j2us(<\x:B~g嚷ɝG:l VՕwQ1ZX@8?sեRP\X[1pEJ@֖N! zJ}~R~]L{ V?d?UmV+B!}]ωO,Bܮ'|#xy}Փb`ڷkUFbxކ*f$Kido#~5:bzytrNں*hr7+ۚ)3R&=j.qF_CF'qE{|Zi.FnB*N͉g~/uB! *y C;Ǟ_M֋ pyám,R4AyČ+AH&4*搲(߫baLE[_+O҉pK;OV13vYI7,s:*(a-{I^OH}1nUB!B8p#gW_JabORV׀EmZW|GtX },xuC6kONѓT՝⊗_ ! DM&jƖ-fT>'D2tB.- ƧGk؜z@#lhLb^NE_; (,Ҋ17Ӏ )5:NJXص2^|@BmkoF3vu7,bBE\!B!xEi!V< 1ΩOȘ#B!:Ξ= Ç{͸q;d T䄯4B!7i!nyPU]˩ [nBՌs5nW!B!$ q%Ox1ɞ+HB!,.h [30Y;Xg~]J̴0B\Q*0/yRB!BHB,7Ƅ ds ] yt1IdB!7,%-b2NHoEH̳H4Pu+B!- #B2 io̘OTPЌ:!,Ig !B!n yB!B yB!B B!B!$ !B!B!B B!B!`Oj;JzB!B;U<ʾ ͣ#9/_B!B!*+E.TgI.h{<Os߾owS1QoV*co75{gpW-Ԟ<ڋ]jy4]ܔa<֏rSjЅ>|K-yn0t{Oaǰkk}t yYWk ƛ8]ˣ< @"7?`n ]R39M<~#B!!̋T炳5|_08M湶5:6dLlivbeaqn΃~ȍGyՃ2;ɛ^V^ʹ٪VmHl~:m`|̏ Hf߯~u5/Q[ȟᑼ{?(B!߯T?~: kCN8{h߫U2c!#rϚ/ Ox)r4L 3 'Fh.PgC/ U8kK b ~~0e/nuoZzڋNL8#S[aK+1nW\ۆ1]kCMzB!BB 7Vb7; _{utlK[t~q\gZ.PSg.2pg/3ЩTm m]hamO'?- d C.p|o> m`5ɻ݁CY9gej4 \ҡi!~pB![*LH?[[-5a}ԗV[lhn uOȏ}oJ/4_qgՓ\ќ8AUSܡ^g4sw^beݞjwOK`6 N'B!}6OOpMALr:ǥz4 djXg|6h ?uOR^rV |YT3EWcLpub/Uh;okE/=rwiT|7U=h,`a#\k㦋Eʋ1St:!B! wy^=Nhh7 3^N̈f2aL;JM#^בU +/\G=JNYtCP&6X@s!> 'Wr_}+g\4-t/B+[6v0qlܶS1mф'y9Om 3ݩ߾W~=֓> AC-1aTg ܭc ~@^^KE'y_H}}$oRyyxL_g}qw紙ȶFa+"kwIp}?qKIMEG ȩ&lXBX^ꂖtt=^42gǎTVi!Nŭ&} Tm RDvb,{[LJQDKZź츇+B!N`͟7F"uz x*6 1h$[Oz<P L5Rv(18Mw@w,bF8gNtQLC`5@+xq0#U8Z@nŅVysp61׻0s@qqY\tD-J#wy}Ĺ3#O34M #ZAq5A1 M h{:@%hÄF w𜹀Ѯgb5v~W]5i Rfp`F W& $fNۨ6I#:eү|Iӌ [,_V h\ [>l0a26m30aÔa 9մ5Oosu TtDuH?=TJr͟Q?9f[ܙYY" 7 fA׻E侽IZ9gs'fo=H<`23F PqcAὸVKYe+%$3rK-5Y. ͨDr P7w~5s|e;V; 3a,B! @7SiEaL𲜤[ԷM1Sq/s"/-H7{y{@mM{r"FI.FNթxP|یg_-4B!BB!BK-B!G@ !B!=,B!BB!B!X!B!,B!BHB!B!$ !B!B!B B!B!`!B!B!B B!B!`!B!BB!Bq M WKm OٙAwB!M`~WySIӓXw:>:Qd}bʬ(IGJ2~C<,׳;U/!NFO_>=*E,!fl8xSo9uN8B!Q'O{*K+Z7a3X7^5F u\|7Nz8ɻ8;9v, EV/$i8iI~ԀX{/6IORr>3m/^o6ġw3ږRxy Wܹs|t:5aW?$BqZĤtZ<*֥:1 $WԸuT͟{tR|_ wQ&{(ߟ2. Y[_'yS|ĝüf >{((j3AhoΙ3g8qC[gpɉ/ $Bqpٿ2}<WFyQXǩJ.V2m{jF3ibT_l#$-<U80)OOpNk 姙} ->A S7'$a{[І ܠय़`^KƾcY@7IsjDE-B䞨Ճǟ&eZۈRARf #.n|FW17$-y"r "̑7SPY?S&9R HZGHb_o\gO3 ꯺K /o x7UU?hdl=B͕i L ܷ3(8iWP%;15S)7(ihE$jvԾL/^S2C>Hʶ39Gg܀q%`L %;MFJ͟ى, ;_c\7OZrid9jY(ٚ[L4(>cy4I(@ 8eR3xӪ]%=i^, 6VO pޞATY= $OzR3vRXnoq U'uu{`}OUWaFRoy4-dp̏j+<9]z]V+F񛥯MJЮ|ַ`ԏ WH!6#&>-seϵ}qh wG)ax5 >f2ws5%1= :E?JևiyIdZm,]7]ŎmHvxKcZm $!ockI)peSk=3! /UPӊiWz=)LjX9kVA26DJI1ty(dj?S&bX}$ÿ`p}?qKIMչ aWhZ{ <]&ÿbd:I+Kʟ?"G)O;t|śy-/0w+/FpnK:q #fB+r>H~ɓ| KWs^%wGbդl>2?? .7 ^HG涏LoQ]q7nfT|*6R(V0hǍ%QP<(15qW @I%u 1~ŀj"3Ra* CL.Nxsd *wsW )[kv:F86nJǩyX&<ɺǃQ#QW?+AidGώdGD):5 /r7{aph YquR\FBB!\])F4wo?G(W?S'BeU.J`p F?&}s5]sY~J$.wRg0hb&MA %Je9941#]AJФ0W_ 3'ZO|5|XrYiAAҬP;[94g"џ, af3ҾI8ѬNA.vW& ݵar|ɽ#x(x" hRk!9{5}Fr\,͜CAjo{f9`r\ lXpy}ш/l_%#f UFF7MGI^]XffW=>zƶg}ܺ1̋ W̛ M0RIC(xDLىFѣ8IQ=,A?gx+ :Cp#Mx\@hW@3l J9+(ZW{IH st`5@+xC2̟EHay0(o@C<{<1%@Rጵ+ cZZJ~\C_ !B۬@jee{*mCjgz:lJ tr\UYud]*J{ݭ侽IvNHcڡ,'Z7Re`w#C;Gny ʔ{n3 b߰m460n@5epS49xd `k g(JM&F\"ްԅd@!B f*b&urDMV)7 _}R]97Fu> UucmٞAf1N4`SA3 ͥ0Eٺ s >zWjY_J)LvqP#yU1Yc ` rR\˦#ʯ9Pڧd_۝>N6='YP> b~_iau;S5=+^~c0=aL5諥;೤0t*iQ~ ?WΠ_~=wП $B~ 3LkdkLWY_?iG+HŶk۷ñAŴ2 izumE=Gz]+pqhn~~B4 CP]olBtbGd&,7wSs Q_a:ڌ$=Z΀ C:fw3Bd5)ܴPP&>MwW3n~%3^HʾV_?}ZWj(ܲBK*)^~lzގz œޥ?~M,sTDL06_*k;|oTxz_qk_j8;맳uys uWW9>[3v)y-U⼏]Aу=98(NUpc?5 !LY9w=I; Nw0*8q NcOʎqmRR@8F=WlޏXa4[#sH^4aWO_|5jPqcοBRUQw&N'WZyu46%~Xϟ_~fcs͔+B/ř$-$P1e'J)*FJɜ0V*wzK#%3Yyf'j%f36Obk,44b\Ig]oͣ j~mhf}Aæ?'v_^ܡOX 4S>׷R͘k9[ 2ZwK)AȯVLַKH' Um}!\m Y|}dT4S}c'^^- 2ydD]dnDP|~:8~s*=f>ݺ &m?ziL9L=5eh»4*7Ե=CO[1{+o' FƏp'|}XojToaiRL*o W/v-[*(0Gr/S&:Qf` ?F[S]Ivnk)}'UM5@rVlA(XCYC3S7r3>z-U4Zm#Z;2{Q_!B>4/v!X *k+Z@G&h}A#mY,i$Mo{ O z#|r5+xE)+XCz_ )^2Ih+@ 5 "J. R84wbn@$٧FtaQZ/$,[:ao:Aw`x =,S3W;Sv~ek_ҊO̧It92%ujީ|k.aj#9RfۧHN[HܡX`!^:3g0lMw'xJVn (~c7PU@< IDAT—üY*-`ebh ;wbNß0g ?I=:ݸ^>FA u nƋ*FMlڵJk"5# ~R^b!V 7?N'A,͛~Ę}8y9ܗ%7lEs /&st-#GV{) 9v: ws_2rf`\2z d cfqf 5ir,x 4dc[\fPgñ]rxq:r"R,L=R' > sU_}j>N&s:?è79<rk`?uDDDDn]pႺ1a="kdPx:nV`}gpܗMScoBJr{ zyCd;w%iDDDDpȑ>'99%S%0un 5R^Z9/}{h}ŋ-df)wF-&dܕYu)ʹ)| ܡ.U,d,^BS]כ$""""""w<ވw:Ը{ΈWoMKnd ~TQ cà>極Bx/ӳ7.sLl*6Ow\r},riĚh9@INy[1lřjAJv]掠Xf"cE2у۹5^9Mww5 ZjobCt\KݮM4Zhmr}Ju1ߞ$#v(>|mԵ5RWWvIQ2Ⱶ8W%oC$aM6]!d.v07.8 ]ԴZ!/.`\`lpzAc05hN)ϟ dZ* wמF2ek'3{@|4J0ک"$ZZDDDDDD8BD^5kK$h""""""?Vm>yE8waƥxI!F6E3uKӣv;v֔uxorwifR5oCm N6ct K,̞}>h""""""uI/.=9_X֓@p\Lס  cG]5lL}q6Ru=U[k8ISoX!6F oXkl7^++WzhNV;y/,!3iȕ}=|_ZO_EDDDDDDVFC h%Edݺ昣ۜX=Fڂ16ک)~!/٬O np]4w냥5FFk_!JR~Խɉ(_GoӐ#lأh @×ryA+NV ~%u4*˱jK./X2wB<sįI"""""" W1[U< QvRGƓ5N:j)"{|4(NUS`,0}]ǫٱ783[-Q+,c,ؒIQJ{h$/$9@H C_D5jĠI)xŽ$e/bYv8~\3(GNr7ޢOU4-0LFDcgCIYKJv9@ݱa;?~ym 5}-*¾g7oCÉ@;5,D?̔pȭ .\P79rINNn$`QQQQQQQQ`````````QQQQQQQQQ0YOg2mRgܱo 3VRv.*?Bj:ܴyl^3Ny7"""""FW]_xLdޗ_ >>if:1/""""""w|U3 g))r{^!Q`=& c$wq)[C)wI&g9YrQ_GKyqn34KdDvj^ڂh5j%,L D./vT5s7ǗPp&o~E?S n#/=.#F1Q1tzp(?HBdB L X߱<_' %Lđ۰5R/$i){P|&ocMI7x` c7H g0lƽ|2x]´3;ki I \Co8;;o|kܚ{cf?'_^xgEQOɊbQٸvNͫO3go6tL[7ϯ.سZ s(~78O6[PjJ};C9k`ګq3O- :)= 3Prذgm;. Uvz=vQ f?(-{Ѝ̄YȟFJVe7f/ ,]_3pv;9&VRҧۉSeǚBvx̤>9qDy`"""""qǭ8v"> s7N'xj:3 GX"̀9sR(]qj6a#-'`>b`|&LH!q[ԷAH ӢFuBjħk2i:&S>S4ĴS2**=&7!ñOI3v8VGTMdn:|ǒ8!xPw+Cd:/&Ns{܅}\Qf&n a0Y]fcAU_i>M߱uOC'_H>/U/ms}|%CyfuZGaٯVŹpybjjt;E{0}~d`N`~40~qD`vW4~5"DH(Bhb, =`Ep*sx1"=iӧ`LDDDDD!뇣H0ཤ_XCg1¢$_F33w;,.!gC%Gvr#%4ϬqBItَhn/U[4! ?PA&_sIj9*6oƱYJ`0Ǫٶvf;{h9€I2v8_/7+,s#y"Sc8:/UR֐S7=c&JTSrw;C  rR߫o(_ςU9O+sg&88|>k 0r`Zx2Y:%ifB2f-+53헳I9Ǘ7ˣWs9C'-8'ÍIyS8O<ͪCa fو4[ם0%p<6J'k]u<&Fdz)i ۨ:3̥O7 TWMFEDDDDޅ .DDDDDDvpy9r$''`((((((((((((((((\ң p:x1| EM>]ܽcfܖMIo|1``w ZWcoz/= :|6ۏ#-<>極Bx/ӳ7.s}{WQ HʦbX/mh=<擤L{DDDDDDDzp;WZ#5RH]_9ULy_k494k4.s3o]x~O}˶GDDDDDD??,6df"BS57F;U]ڟ$cpഎ}.ߐx2;|F.jhxGS0.0Zk6 =0!6& |䫯ۜ<ܙc/ &%و4o⌅F0␬ܗF~-!oRt,mg޲JZ9GB3԰/Q:- ^cʹGDDDDDD1djT`VSz.b5ˢQimNcasO}# msvj_(_K6CA@)GIq_+tŞ/nȸhx#ԼŴC?}`vC)ӋR162.fC+x۩{ !"M]4n|cnhsr F|snuc]:G/6q-(*DMT*ƍeK? aRY'z rҪΟ&#""""""ߘ[4y?4*sW+y/X0p{8|s&b`q=w`KOSa4|qI25̬}覮gldgy}ϻ.jϝ377 {kgnTut-ς_?@0s Nhߌ|@/X) =ؗރyn<0Lސ/q!|"B~d;'~t!T_K%[+kLacWN8wl'Я >iZ}nμ?}Y7:OwPnl[;/8[`B{to3l qavۗ[dF_5[BժϿ>C3N<㞤dMpMdo&E5MYDDDDD>}ú4EåQQ6>(& xஷbOr sֶ. g "¡)]t\kݪz<#H @ƫ䣶~'wsP"îч4EǍL!7El:y.N2_Qp"">`[ IDATJ e"V0GEǾÕ}3 4^lqĎNĨ{Q;KH+h53رc~D,;! ۙJJv5hY.y.g]Dx: V@=;qwu|`v>jdK4>/U3w50L-=NwR~'Жw\h |G+qܚ5ܤ;u-2ų`Ue0R6gl`ș0g d-^'7ˑHh佔ؾaWGO i6yUfPgñMrk:=x,w2^,naha<0RymbǓ|׸慫bo-B}"OM1)L]MIB܏9o ż|E>q[FvǂWg#uM+Am{.\n8r |@| EDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDX;dOp)+) 6Y6{{ơ?l%k:n.eڌ٤f&\ wskL%SazuSo؞&uWQ`5so68U_i[ b㢿}}ܴe7\/a1e㛶qa^IIg.zG,;1}ܼ c)n7UG,\g5h_6FB|跮#"75y!&ؐDイ~ """";W7N!:CH_,ӣ1۩ Q^ExyP, WNvy=4qQTV1ɏ:ȝ,ӃEF:"Rx׿`Z9@=IjVwKrFH4϶3\kDA oy|Fޫ elܺZcqd(;ZK|d,v0pO1o-)9e^O`˚Hmn>\ Άx vI4wQTzwg9͜DMedj; VmcTxgԳ=GՊG(X@ɷO| (B񻍜3oœd'Y8D,'5='S](f4)#5bs;oicS ϙHlPy˚x<ޣs >|[=/~7VRTZ_|TluZ{Dp,v4pMQ&wVSr䍷Pϒqr>3x^s A`^*yFΚ°MDHK%T4Ƭ'DDDD䶤yF>b0x-ol^s}xlaб4GL!)'(߰Eņ8kۉ}p6j>?NZ@f`EOO,]󣘷t y-xJ׳5]_g5ϯNM(=b&4fܯ3g?mS{#Qv7kj:Ga9)}N0x-fҗ:H 'sTm}~7+_Uit`~i Gt۟yu]&!""""[oCer 7|L;9&ثw^1t ʤXNCLsbr NݯʨO܄l>F$4;-wôiأ)o0iHF24lh/w0oƅP4&;L; F"}DbI3]Dagׇibǚ`Y槴4l55lE,DsaW *dTc臘6z7/ih7S}4 #!XH}* `?=`ك¬n4l'(.l#0r6I#dpR<_P>=1Iɩ#qhB8Co`߻qug i81h0fQ{`41Pׇrȴu$<^B=9q"#S~4$~@Or@4Ӧp ߏĸ06GW?\DDDDD;_ܹ" 624ͭߋsziņHMv6`04.v4;2qybO34ncҘ@lre^|=h췭 ss4+um#Hw\N4).DK# ‘lϿV֖vEc%p1z 2z 03=45u_qr ޜba =4o'Rv<N {ozh9Dv+ <)Ai1G[O4"Mkj<2}{uW4fǍt-I7:pEDDDDPuPȑM^K#y9Ƌo,!#ͥ1"R<6{/""""rNx!CdȐ;qVLdL8@y`F2<裵-Țzw@o&r|YGXo2qUV ._r&ؑFpۚh6I#CFձQO=48{h 4bA B`u Ga{|t&rUAk^Gc̘M`]4 6wp.M)nFؑy< w Z.}?u~/ ' apd:.xi+K/Xm.spA+FEDDDDo&Oy&?m,̙H\.xe+~8s&3':'>ՎsTlނkO%%=cٳ<jvUK` +QFG /}|iPlMI]-{|W:-Hŀo&#b|(;3[?GEدyIMgh]a8@84fcDPT*iFs9d `}pe^-†}x#y#'??inbČ;+YSg35S._m2'ڱ޾zDH 3qwMPsY/g4G>c!"M64xL[pd6_?B$Ǒ#Alvz4 s?!}F. 5H5㪀m^{8Opy:!/o'Rq^lRz(#dڈR[7`>Ы/DDDD .\P774{"SfmۻoY^J6I&}~EDDD9>p3#Gnd@#rN}mypϷO`oQ϶Y """"r[S[j'wtoLu9Y@ޤP}nEDDD䶦)""""""rhϡ-.\@g_{_K_cJ:n,)vhvWv&j=;vR:% ߯@CtDD_3#IhjjxI#bcnv{GĤyLWRK]C%^ q~/_<67%.<⥃!$y,"ip0 WRT|؎4$Y +Z}&g3sr7.`>e/e 'C 6eNe3=` 6.'&CEeux IјZF0fz4sʼ*Us0d<ɗ;ʞ"Fw>g.e6v fN#g(~F;=`~qmqcn>Ok.OA)^tRUv>Gd"Q+yh>cm>OM!!ZNq~}i0(:pL(`PJ#r- ԳzmF㙷I,-ΛGF¸,s&og2/ryC4h+gVF`.a6m(*tQ鄰QL{" _p0I<@3'Nfa`od^vCj ut)ZC 97J;.;=wp=D*ոr5,&xPw :;)= 3Pr0p?AC '=e^wm$mni87<1xw\F#%˟?緿N8Fݴb&}p27Nk6/Mpy)'OW[ϸm- qM-(*nQYhak;Yu1iazW7Wrwa6 @O<}s:MhG`Co}ڃ=dwclcI [3hH熹d*%pӲS b?Xd&6Byn @ iI \㾅yhd@ɽ> Za,t-EkVSyn(h`kWb׍$q$Y1gs@/lr@^h1X;NƫYk~侟18ɵCm8=BڸXORz7Zܽ2+)^m&w@#d16F?""""|^yfpZwd c=@mPq'\'  X7n`t&揀3μZ~~ wҥLv& 즶 7fB +rMžR496d}k T'QɃtƎ R0.NhEqo:@0{&!˹(J[ho|^۴$ zBPSۑJ$aO6VtO!ECm0 'l(=ٯ9M~ɭT~T_Y7+9_/T`+Z2{W> uapq7cW%eݮwsYhɣ0cH %HR~v|J'+oqGkȵuPaɾ 9ȴCwq R,FdXxG:Axu7aa F7?6AӮ_$fI'6+ T9A͆B{04 hU?^O>ͫ/>FA{E"7wLG sHHxO9>$ v%ir摛:Z U6m$1Ád:v ;. pS} Hشr38TqՔ$Q̢ 6 !CCo]ÑY[DZg32qB`f ZNjWOuG: w`?mv~Z(s8Q|mȰlQ>̾7;>%F߾v0e&́஗y̫/(w 0꭛xWxxͧ@k%[v4yu3>t cl5  =p80mZm6 {3ٝǢE-4uͤ[ IDATc621/zn~ H9*<7;;/6?@6UontT \=3z ^67xN H{{A3v C@pTEA`+hr6S ?WCӐ>K{c Aw'm67H0|0:FR\ɺU7܁dsc O/""""cv+K6ϼ9_aOk'GQh9wpت>f좇xbdFwVp+/\[ [_Hs.w& kx;iPm#?F2s_y=خ<;3w]`kYsO7'p6.-*+ ޴!m{SݜDn~옙d]_9%E4 lS"7hbYmA;V!C'8~0S\wۿ#JG ,4Ux+4Yu~Ģg0Slau6rǹ@ 9-5 n ,p%gg OwXH=G"[J8Iٰqբu#Jp7ɴd {pSE%M''ܽw~:lĂȅFjvkISWd;G {d^6~c5X}B^0n(FKGdQ"c5aŶ.70[vT[<6JXb {j]~z,<z񩸪;t~͖vj{s2ϞPtsL2obF!;Qۊ\έ9^VJYj[Ǿ3%x6%򏲸7̈́ao}2r[./_ /nifeh/Idh䮊猥y옕VV5cl)sw[:CzpN=bEs}6f_xǞiI&ty=/^2X9W(f;Vkpf*˳QwO͑v Fm #7bevG;ƱD-<7|Q'{,jCipȋc7'Z0Jo8%(̴XU6 ; 0}f3`•Kwey107ϒivr,@|K/Kh᝾U$LWq[c=ljo|KE),Jٕ!6Tept a"gB"?;vf G=nϝW1̸Ƥ qm+"""""r; x;b-q$a[Lf #O5bA912D;JMMkgmEDDDDDOh;AnP}luotQ&.[fsg$R=}TN;fY8~X;sNjrq[?m8DU[?8\&+_@`o'C@w};_l3;5Ȇ=d&1'ɰ`v/5}a܍=Hqe$lH[;\+y2ݶ9יѨy=u׮]͔)SsmY,"""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""",""""""|\Vsk,Xl~Wwy^h k >CB}GF<M8-g&qe)sY.Ob Nlʏb'gY^6~4"FB_&o.L%58t>14>IM<{ʚ7AK:"""""_#_QF|1ʜ̊>rrptRrG/}&z$^\?,x/|}eG6,6\LK=?t@[Y&6@}y)X(3FPhPQz )Oa0lA,>DKɗIevVqp%\{N+uB~צ2=zXsXf:BƫXN^e;x4֎ 0.?U` \csxf'}OÝCx_uI-,4̋U}!(cNUdٛRb=>+v)HkLvz"?b^ ۘðmܓ8ʚMAwy33JhuY0g,6{<:ZcVұ<Ć-kDopN;=ρʀ_HoD!z[I,Ϣv=K"f$\FrԴ w{rG0yI,6Ҝܒ}a]mYELO4zY_Y2NO`e =wvCIv-Je5Nbzb(OzI(Ei+73Cl>ΣTL; @>^ }DJ 0##|S3 `av~/xX &2n1pkぃq,>s[]JRbC]c4PND\ܑ,y.: WÝCXmpU .?e~+ c>Xpy EGT'~64lzI*ص;ŎRo q&\ 'fQ'P4'c=FeبNDDDDDN**`xzBzYfQF]`@.VSƢ| 0$[w i8'C|a#q1JNb^koaJ}{$şҤ8 F!O7JUc#YGEXKHbG)>09M7F.e58L`<~ʝݼ GİIeư4x5[ݦ9<&o%2fˆ>Tv-%pՖ戮st@p@/qܑjE<彔5QcO xټq?kt_?!׏B}PXmxGјDM▉x(vo߲Fr-ȹT`$ytlY``bA~{;p8O1b>۝s&f7Nw7-pƊ ‹ͩ,0=Up+7wPb{,mf nke#SyƙSt-dbl2 @r"Ŏ.Td&0=2w@}ǘ̀){u$[c?o̪*'$52rG{CDDDDDv)RLW DBz}%$qGBT&$ ṱ P}Tl?dxn?u({=~$Plӊ7H]!값m?~>NL1ua=^b䧱d-,K~ӞU Pke(Uma-˯q z ~#*w5i/qXgiSbjvl7xgD)mL S>Jwwxh:ϐ8\vxCfr8Xzun6' ٩V\?8-DDDDD 0n_wwF/OjI3dv5! -M\Fuh Ppv6cqyy6H =GL Ën3ƃNIҊN*Q)}KY1&mg#Xyc̉?AOw; S&:Yϧ/N U! /6я7b:wJI`% xcOG n;:;ANK$)z=Cd$0^~܋(nœ u6_mfzA]p<3 X)3SZ(DT}̍/8duyee(ÛHqbڷƂ;8\|;nV|ԋ765zLDDDD|ECT}xo~Ɉay)d s߶L~V20{ɲKpY.F5?%ö3{s,{gFyλ60|=Q~31=aFvHn;o•=׌e S]73GEw?#{gmܽK߄+#{F8W|#Ta7Xpy <祑#7)H]ʂoX}Ҏ0<1cVbCbә~v}+ZJd<۹g7e(Vvrwl"=@@8+'2$u6ƪjpSrU{<_k`8!N>Dj>Q鏀=eI$DqN!XQKM`lEi,83JŶ9خjgs?'@3$ctz/]lh`8][tXuakS):Σu^ևx*Kݼؖ²#?SxœGDYZ-?;8F(JFߌii$cie ^`8wQsY._DDDD'k2aT~꡴{\'94mO:}Kx&[) A}ι#' ^ F\޺Bq>]Q˾;DZjܬrGQ28gqo|/mjco~o(M{_a]ԏŎ%y+Ic?;Fh^:ěw8v䶷}S2}g:0jiLvt=ԝk7d~. KQֽ@,x'o$Fз#&X),y,$'G;^ГɽE?+V7l[3+O2?Է3Qx6]F1!'!>2{ek'y=[B^~'1nld ae8뫭#1^ǎ(`ii ?cGPh0+?ؿ>u%±|x{:lCq,[8}Qxu>l(+%3\X\B#voy8c>Xpy E&0[)o< IDATφ3}@*gO]h4SpM8\#sOzI(Ei+73Cl;R\9fc~DnɎ}>?Æ> XY0%Ი0m-`٤X/ U=Ԝ֞L䏴/L}uw]tJR`PX Qlb[D43sL_2p_ROpNҌXr&r+5'ߙn7#j0Y7:cCO<~k`Ϣv=YWofvA`aNA/䔯6ݖclf1vf'Gl 6AU[-lWҐqfH0>gb.?hC gnszOFđ3$48 ᎜ڢZqҺ'@(:y1DW$VoLaqG☚<<8̧5YqO}שzL\s&~g.kdq !B:YLז'D}k՞6z>=>I,wMVP<䤝vV PQ(V7Pm$ǟog!}Ȱm'~~p҆Mo(#9I O^V?V00q>ɺR#ce0Qtu6qU%[zdhv秞v~*w7C fV83c}],\9?3_㯌D{l>ˋ{< G1tw:cUdev F D}h0tqLp@]!^ߙ YKH .l+փMWun%|zzpQ&_4"~@k7zs.:  {o:p'S\b?|۝"ӊ+gC>{%pyYl)3uWC7oM(m@c @l8b.36[p%B}6 P_LQ>-q}?KnV0QaI$LiE SQ37f㩬%ts}nduB/N U! /6`W#т#el7|GP EȟD˪Obyy<fj}DtquRZTRxtu7JvxXq-( QU(VVN@]QXoZ"ʼnNVfb; D6+'ƟNw;<@7=Fۙvc&{E(wV26q~w0}}}e'Yڿ' )}ufO\{4I(m v:zEDDD6xt~]QYV;<^;t!7ɇ@;xw5!{_~#cUV)gDL3A3rRx|^eaxH׺ NDȵM5'gop&&mBI<1CG gbK)N:qm\6iǕf׻?Mv=+|Hd׉{cC-œ fn6oGJ"0"SN\'2#,s8v&H/mc 6_[ZXl9Y|phqX1#?k:/aǼdGDf]YB&Uw\DEH x3leU.͏}}y)X(3FPhVlbFe+qC&rCg~J.VSb| VG6&?I~,{rMGvmXL "7}x9-nJY(^2 zEIWȅ#QYqh@ҫ)>\ m,%3F JŶ);s*uů{\Φo 3>3 }}aصpZq>tVOR8٩VSgO_`\>N~ W<ʇuos+ɺEDDDDD.ԔȢI84%yfJ?}8yYT}M9Y&D FoC9`0-v/y(||;nV|ԋ765 ktP3&e9&ܾW@`v࡝XRܒ7sf]""""""gӗ<:Ȇ}&d0,^|qM>6xxo`RS@F2/I nxU#yzF/_bޚdv0V6ŗde` 8SxnoᲝa15?5'|}~JE2c7L̺ano[2XtC:-mx]'8^bEDDDDD2S4=ԺFޙŦotDDDDDD7 ]v6SL|EDDDDDk-""""""Y-""""""r """""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""",""""""_+qu5lWk?:ixmu [Vok{d~ Ħ*.Z_> k6>J_k j I;~SXr\&'$pշ,xd'QxK(Rﰈ顽O#ˢ'e^ZO'MDDDDDha~2ls V蔉7;>7&L'*5,a JP-A&U OԚJ+UPE(kJrr[ % KTKRʄI~%Vd˛=<9;l<Аgu 6yy~P†mߐ֩]޳.L[xL Б;+LY?-o|^^ 0hOKbPTמ \yg.BiŴ2 Fgq?٤h!A^}Wz+@KG ݱ%Ifڵ5Eoкuk~pOˈj\[=k6O^{KEN.\V汨=ŝXȝܿe`Bf.dQaOʢJ$IodѢE\tEFp c3oB,n*O)7f4vƧ?osO#I>O=>E*Y3o5ZvOGaB.TvnyDP Ϡ6_q}yj}7niھ[y۰X8k$I_`k`ih kVrnLӽvS䫯V|oV~lTqׅQ͑OjOז$It#unGOj²/,ږƥ{/U^ȬIGҚÊOjpRʻ?'w}.=UȎi|j'NuHe'|j=ۨ9 DY\X5yKjT;+ $ITuޝ?Kthյ&D2h6l+_L`U鴢%n Ocojn92e&s"^~9q]ƍG-i ZʟϥKL}jONg51?H#i4kޑSap.yV,x$$ R= 5OalI$IcyB^O/K|u.z=4YI\s}ךR"Y^>4u_&tvdWknŠ̆n^27 e}ϱhg'F<8]ϡlv Rp},/bf蝣z%~|#kNNH۾zSWcZX^-I$Iu-!L>3 $I$p $I$XhuuJ$Iꎘ4{WUU$I111{] o-n4eDQ(UUU$I$ K  G 8yxOFQ"Ubq T+$I$IuE5G-vzrP@ `׎jvͪmUOeٱŸI$IRsw5olߜR]]}Gvh4ʋ xz,WH$IR^,n'E"6ؿз-REM$I$e5pKMՕ k%ϻ8Y$IvEwC$I·~UQmbnot$b4[R=Z$IҿG]mܱ"OJD:;wW3#X$Ixݎ\tIfئcf Ua$Ic{,?OkgN$I$I$$I$$I$q\y;I$I겕Cr}9>ό7K,u'}{ f?sI$8w\nu0$v1bUn2oUMCGuU\G| ռ8oˎ of.š4L9Ft"BR0!`f W_|ln̙ NH.!%I$o,Cd`C e fd%-q7DY]ջ;e;p(w|}b]|u`׾Tԣ'| :ї>?ې,ZkKɐɫ PkW 5ŹY\wkє3jMLvs+'>Ȭ;ӁRS m/K#I$0׭eCE}uZjmڵ pMC`GVƟwAޘNQ. 3_,i r<'D 1+R3'{LO4RʎkGش6֔P#=rٰ[*3oe;-tLyyR* iqFޝ!Z[H?3@웥_ŝe=)ϿRA$Z} ]NJ]9˩lя>]_w'x/~a{x%{9>4]$Iߡ7Em_CvZT'yz*t`%><@XbH\I+ys+нفOOI}j^s2 IDATCm Mջab4mZJqRHyߖz yoUTQ/a?,u}qѤӃ@ߗ L;xLɫ$݁wwb3Bvۣ# `ٓ?y%̟OQ{5Б 8oR'.xç@2+SZ e+Ko gPt93W1OA @McԌ {x-B-'\ʜ1.CcFqKF0{q/:e粫LNH '>ϒ zH$ ;KWQ 8W¡Zx4 dwmصjP^U,>=ZYe{.颉ܽdkWYMqtoH8!D5 C$"TuCY2I,x&Э[gҺqNu/ ~HOk_Uyn]JtU780%;nQ/Y |/:C|s?2 =O d;,-ddc/3Bd_ڞRzuͅuL0@5蔴=O#9 aCɒXsF2=H$ՃhѪGs7*6NvUE&tzw*j!PĝHAy($ѻ_orA[)TPr?)?EAkF fRZT? g )e%%vehvWڌv&wQ@Y^ʖe۵^ά"|4fUD9!@vP $ZU nJEgG fƾT:9=c:aBB Tku"#F9p%pˍْ$Iu&~?YbŇvЦUs߿00\8t9=lЄPl ]rs묊f`!0 (#:4ZĚ6i]L]A,{'/PLw*c\ׯگK ~QKozDē$ed-xx>dD xi5O&H5 ʉmlԐp=Ǐ"^v4N!{0Bei!S~5 R; I$ՍԔCo뇍}X'bY>EFg/2!eMJ쎰s{%yo`; šОZ^A=nՁ'U,Uh$D(}/:ʕ_A(LN8\ٹZXƢY7qeL&-3/Bd+ LyyU@d[dZ$TPkE.YGL,bɞVnxeGxvyTaOJ["[| V?ݦ,dObNQ:OI&9C$I)~PsuukwA S>謓 K*6GxccVj̉'zЅϪURGag!3歂һa|Ə~(_$w\~mSRw2,5 uăץB()_oHR"ˎ"Ë_c}Di,RVœyvk@œw*iqe/2OtM [w2̳Qwg!~~s"0383r]\w<K$IR:xr/$IQuju $I$`K$I `I$I `I$I `I$I-q$I[bbbX$IW ֳ7)Zݻw;(ZőҶ-.f͚!lK$IR~z>=޽իVQf ^?͏6%I$*&wsE_B8v`1k;,yM~*q;^K$IQ51,sŗPTmX$IQ7=#jCWUUcaK$I:j^$I$$I$$I$$Io_''Y8\\h$4I!JB]ٖho<)$I:~E|ro|]Ֆ,>46{a[޼4 z? h*/?63wR؆K)X_)I$´;/lxAk桯08VxLҭDNf7o_"M /%7?=;ԫr,}{tr~?a*ZhrC&r W1b2~ ;7e2O.c6HhҞsHJ4NK6AA;yРu&!Ԛ*o&cϒ['AFF@F{9Lh '?Xɺ!MG99I'ݮ[+YW е KG%ItK"֑dP4L#1}k,Y4Ï>Ʉ-{kpOzM o O^EӾҭ.\vd$7a]i*}.ߍ6_\20 FItZLi_}+-<`yKȰd3>Ȱ0}X1{ȿa-91h"{vs( BJsy2f{ar^=ٛ4"^Ytܩ}3|tz= yu.]^< =]ANVʹc䭙 Tdƒ<0niW{'1^PDBƵ~#}pͯp$IR 65KېՙKHo78e,Kɺ(_BGL9*<;_SYwRWnr5)1aOR~*F A:adT?oA\ݲ%,|QHhݖV\bI$IPmG$tGV*,*?4ko#g%[ZDI @?(MZ:붕j YipbPI 뢩ɠ?`*sYUDL"/I,5s׹̎nvh~z7oKxXi锍YQ 'Ӯ9J5&VJ9$PGk* Dl0iF o.ka})Kr~!^pM̞Ϻ?eQ%~JYY=g*,}9h4BaBe7+2jG?ǖt >K!wC-cId_Ӌ&eJ6GidW$I_ (S ) HG~0'/ʢswwW$7c9ʡU^d m9#P}8cn F'Ƈ̜K;3蓑տa͖Ջa};4&哎?a.섭̚C]- 9Y}=gGУeoV) -{גd <ńܭ2q9i$aB yqr6Ft#2v Vħq#p Iȟr}Kg='0}u)$I:.4(@=GSdE,ˊmgc|&O ȼnڱ&b[Ci’9Swt>5 O}bTUUQYYɎ;$Ɏ$ITGUWWk.hcr=#K'p\vg5=N=(F|$ 4 &&kyߌ9ۘQɉ'H0$6?ƺ}v}#~͹ GS%I$'>)47$O?W$Iϗ1{V.ɼu8C:xf `I$IQ盙$!$I$$I$$Igqq5gTVTT8ǰ$ICx5#7^ 6))_* I$}}A9/..ܧo$I$bcciڴ}gsz1gюWifGK%I$X ͛7N#R]]cbbbAq$I*&&8 cs?$IQźY$Id\>v -d*?o [VP6"oc0o  X(z})I?G.S|p&#&<1f%,GO;~GJgW rO0R>|K"5ϛYĬәxc2Əŏ e%Hҕb!t DXCL)Ȉ/1k\̔f=ˎ~l ]@x;i _#k3|*$Idi ݶ?|>oOI zJ{t$ NGf 6R $^vOOFv0¤d%ٻ@%>g% Б$ xJ SִtBف~IT'æO2^XHeN !7gREoΥ,\n}"H}~t۹B@,L8|ÄB@|݆> fԌ$I$1qni ؑ&O#dzSOJEKjN+9piМDRNI-[)B7y_Lyh">IlDp߫#lzg&ڳR[S%>aC4 ēO5@S7TR|U)|J(V!󿰉JLFd$}@/ yHڅG$I og亅?it8Ց(5Ӆ oƒr{lTQ8jbLW@ʰx:3 sW] nă=d HqOp}!}ZsiSTX[W2'nѣ$Izz$oGO!n~P\$DˤüUE)NRZ H k>^5 Trիؙؔ&9Zƚ[dF$(^WrU+>/;UOI")X6Fo *Ct뇍b∮ly5>#I$>v[ ٗ9Rbƌ%p%t9!@ gP>/`N^)MtE!B)B|_EB["|)I$82̒͘0l.38.iDwʀef_2坚P^ZLYEPg߈>p8 D9~>:[rslϏna.VQϱ. jQo~c `_BޔG4Dhʽ1%u'u!WݬD!ԼG؜?܆ەR PK~VH.9Wag!O?0ٛm$IT:s`4 N.^O tz?,}CBU\N4` K,o+ecړyQH?/-hryÇd hmO^E~f/\B$ԑУpE2׏fsFJ'\ف-22?,6-|ACdwma6zA$I .ZoVY9ܛ!ؼ(iXȯ]%-:w%\/qM%B-tߛ6O"UlTJRVnmh ~)kz)ѬI"PHHb<0?cСsWz\y׺ $Ide Ys9rl/|7Sj}%H@ !Cn.YΊW2/bn!!B>. ~uη?\XQ1z|mw$It|7r@瘘[@-h DʡY}V*M"Ts2֭f2GғLæ~R+z׬w>NlDB󶴋6b=\1+dEl[ -y7,/ I%)b{_6H$I&nY kg|<ϒ-s ٍ㳹|tj/~Ay2].geIS;Һ }{o \ڦU$2.NxX΄$69rhջב݆i[!>4&֡JV![&WI$I2럄y 2,҆2䡑s,x)F9x gg1&&gW4mAțɮνKx"685Ә+?LTAQ aus^zA$I71Bdǎ߻_'痹I==$Iks1/O<`0Hl7ۿkc$I$IX$It\sy9^8H$IR`I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$IK$IR}P.bbbXe+v$I:׽1>\b $I$&&@11G$Iuj]$IoW$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IEuosjvѡL5DyFrW1ZX,o\zIz5Z-. W\RYYlu fB BәL,ڙsT46iZ'|Ϗ9gEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDD ][^R]\ϺMp[bOg7cx#yNɩy gN'd}XnJN%sR}uS&O>MsU͎ .hhnXʥnOz-ͩk,)"]| nq?)<% yOgYWQHq\?Nq k yG=|m^2 K\9rh,'57v X>]i9I]QX 7R V8[ZizqY.zí{ZLZv.ysc<4u-HB$D35.$kqM= Sg yX ?컖kOq5V?2hga ^z~~͗w홃t D0&XXPȒNRrkdzӍom!To\:p筢4W>s[V.5Ԗh>ɮ~ZB s+W. y =[ONOADDDDrՇ~MYNzdkI~yr&]XUyG8k[4P8\LM[Dފ Ukc /eyչ `sV{v>hz|=[@^/:0hYOZ`1D!ɶ-;P\N[8qݵo.pvWÿ }7}0c L c(px? Y#p`hv>n, 6L|7NODDDD>N#rq٣$L|u˦*/Gxz U%3Пkc p \@ Bj,LMl\ݸ^m_/7MtQ'ƈVFrI$''8";ki@}m%%%~zb.ŃLH'{iLEc/(Yڣqw` Fq9d#JqVIu˘}EQ~_>ʮvL\`Uz]q,' ~N:jh95>ENi 93D{ fԥŅo" """"srZlmqӉ,?mu{H+drJx3sWo!͟9{,h˲1i)zZ^!$|f8|停$[xgil >N%,Ow_)XI:y' ɲ)ŻX__^JY2] |R̦VZK 6˵ڼ|_ ],4lrm,wa˲JeSm>>[amS'\jėY}pCeî,vn;*uj)>DDDDD?tDDDDDDzU1pfm`ADDDDD~{j````````QQQckM?N\yn\ZDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDD҉bT>"W>.@RN WVH4x] 4²_瑷j1>g:hc<-*d|/v"=vNFHU%>NƿYMb]M/ п1n6/FUԝ]]-^vmAn.fj9v=r)מn5/ zWe"9!F爀 1!!L/?nLEDDDDDd71w0hx. nhV mxG]o\.U t„#x@,\撗8&q!΄a6ElZhW&2(呙nvf!PF[|0Q|0͛`5 tV׫􍹃a˜6OKn O/xnvA,D w v!£\~B1;l:8 <.y|J7ު<6rn/TRR*ɏ|2[ NC4/zAȍNp26~yq[)sc-""""r4xZ?);r;" ws/Lcu"}$J#7H{ddyL+)V^FIw{xK|o> oDAƒ p^=!"""""3@5aD u~~f!dm`m#W: O!A /k^) ]Qa&{Al-*$o6haO;o[)j}zhdz$1IsEp%t ;: &v?ެ;c90^CK!L3L?f2-%""""r]'8+ιکk q׋N4lk`{C8D7vc^靾%KK݀I_u;ɋ3?E`[rWS7Ex˱K%}\Q:L QڪFlM, V 0{` yxy/uO'!aLr_4\ox8Dڒt25qx唥*cv4P}aL+1-d.%V5n-zʩh&l`]]!W>>UE-6RLy9it͎%5sy4""""" )(܊#}KF;p/MV,^Cot'{!iiΙCljIDATQYMreIȉ(˧!BGs+_cG<6{$&c~? }3C1;3Nx24/mfd?'9%S'"""",((p2E \O~Qf?E^X]+ȝeǃճa"\Lg)+fΚW, i cdE.iy:D354bfj| 3 W/?zvC{fd"""")$Xr/%{95&n ekw"J˟`*Y[Չukj='|i*u:~rdWPS[frWP#dGU9f8PTڊw5[w>Eel:Xhē4j?EMM.zv':Ai_WwRue6oeMU; .U/slx`,αE,};I0xx'i)=EͶ.od;P&'s;޺Z# "fHpp2c1.^i`?q޽p# ݖOq ^cn/+*A_Dq-E7*d-D;HgʛGddTBRC4$2G E+z8лkLM^7YOwH'xf)"'kctaQp_k as_"""",rP(LϿJktu\U F5dyf@&M&qyxyӕ C"no֙D(-=ow&d3IlMM!5|ыwd]y`ȄB'n[nC L>8גH3ྃ>XOt=p׉#'qvqSoK~uS&"""" dsI9%u'ښä"+;0~rުbb`EpYCo:B}>c>>"/ӍE$in_ """",fQ.tuvܺ`2L4J? zf\f+;>r,L@1z6<2spMYX6dbU-F<$O9 ϊ <9|Q $qlN|a0D y$ /Wֹ:¯υ^cDqk8;u>2m7ch`krfe&2 Xck#v 4ϧ$.)GcPE7tE| 9o 6E='%N'޻%rpJ嗍XC#` w^eˋ]/ŌVÄF]8]9$G۩GǛzo!|ӟh\;g>W'hbسUbױ`6|OaZ8Ęvԁ͍w+/5,zm1TeDR];<5.bo'ID'MRX\CDzhٱ[: @0#vM;3`bd׳-&} lo&lv"!jEHT4vx3y誫dW{I׬bx)3u'(y7?:0i;\xn Kɞ>R8z9沽IrӕLz2,`:!*JD.[Ȧ'RĹnlX]9Y~V ==~>Ի>ob9 'v!sIQw1m .} w)ڽ;(G継ޔKpdUX1;^R%S[,}&$L#$vW戟r k-pz׃ϟ{kSWOmYQ8o^^ߊ)uYJi9/CEDDDS'EΞ=K4Ų,9h0T"SqA*d'.%4 Án>Nƃ-""""""`.h 5 }HWE\ZEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDD~_>*?VZ/Y-""""""GҐ+Y;~CoGYd^NaJ:b/e8J[PCDDDDD>ZP,7ޅ]l=9[ҳMW_lm a4X>cc_o.Û h>ww1l{g!.2.$k`_N^'GQtl6%bBFfc l̮|k̬,!} v峌+KϚ83] M啰|hU b!qA!.W ˇ̻'B7Q7_O"ep&Y.cSY0h9HM/Y6mXإ69F2 Mwu1>SX?O'cz?/w~Yl L_Aq69AQ!7P^gcZ"""""3ˇJHw$n<.f'z9~SRBAt@M-?3^rf'!+6(;s/tj:guO!5Kx2l$'ǯeOݟod<'3-1H[pi1QZ7mثD}1(XOE%?]?<fQJ:7ōװ(&&kl%[g7y/Cuy|E"q=jNp.04,Ņem#v\?nYfYYIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/metadata/image02.png000066400000000000000000001351471461403617600237410ustar00rootroot00000000000000PNG  IHDRXsBIT|dtEXtSoftwareShutterc IDATx{\Te pBEJ1K,.Z6͵VvvvRֲԶVjxIMk* \g0}߯Wsss33b̘12DDDDDDD;y *ohh.le4kvgɊ+ &` IIGff&.K-%""""""͚V-0 >ֲ{$ hv) cii)2Tˈv2 { `PCȯ (\L ݁7~xyya20h xxP:aa-(<{˰ݛwH-}OxM!""""gjGx+C0P~H?\VVFJJ6kae 6shnGKܥ[&2e2;iܹcʛ::Ek f >rU[r[񡬬l壏fKec[x䑇{w8r۶Lv_ogL#++BoW2t8YYYgܶR?1]DDDD䬄`9 C~f-x EW.Z IO:V6}:{&ջós2d0sXj[j/2yF#ڵe=fiiigt\___[lEӦM.kplٲWj_ كۇߥF Nչs EVy@vKKO:,[߿DZll۾„FQQK|{OtpM7h׮-V9s??Ѓxɧuͽ̙?"#s}lVۏkmlذ[SQv؁-[?&fړ{swV.3{?n[o @h>#}q6'n9m; fƍmb<fZNW`0pםwp=wξyضm;ƍeiժ&//>p&3?}^# / ܹ'\P*& T'Y .,(qWm?v?@II1MaA~`8iش"))I`Z“O>><8}=,]vo~@<1_dM8WV|eڳ{~3j'Yc~o}؞8 ĉWv>QHHnF#.gOcRe.޽cЩSʠӮݕ۬Z)S&b|żZpU۷W1v샕>b!_am<3#>cN޽b/1l&">NmQ]8G5eJ^ފ8y<׷߶"+~N!G(-)6ᕯ_Q\\?勇,22)oLbٲoyt:yǫg{^=g|8cs~ƛo},ל4 G8iݭf֬O&QRZB^^>u:?|]wM9V\ʕ[x?y֬YKª<0n,^^^]Ë/J\7͆baNUq{_MlZm]aaaࠓX fkJ*CEOc U>8v>EDDDl6[mZ{wO i?8Hfe򙟍71L>#GMpmN-4<2>NII E6IAˋ[Oftjƌۆ yϞz=--:_w5X[=O1ƌ???vI?dmdtt`N=dÆCԥ̡ JKKԱ#/<~6W.s ):lSOTߪÞ f}"""""M){< oUqGo79V k@T}\.|,ZAhh(c j5}fdF#1]c(**ou=x lI܊nrChh ~yR@] x#=z\y! ѵk F7r4'K` > -dege+>[Y ?cۇ1iun"<5<&sePq8|,|pM7c2h׮s|V=3{9sGQQӧ5ޠ;)V~ """""M)WSRRس ‚j8Ddն=Sii+<0n,ߌ!//[ @hX(#QVVƾ}y+~4Z }Ƽ MR{g7mL~~> zVcw@HH6}Lla ~UbYtyex|wun'Q#X,ٓ]es]p&9#jworpVV&<Ƅ c6 Y ZQVUIDDDDD3-q<$'iV niS9xP6FE0L2M?߭X_wfs+;;j?XDDDDung6LtؙmڒW~/|||i" ,o F"Ȉ{6ԫ\x|EDDD89a MOLL P LjPեrN@u6@4ѝ0gѨVi_6b"͘&`}y`%"""" e0S4czpA7 TCpmWk\PhQr-ZD. -׏Z""""rҬVFɄ~Jd0LJR\.Nۭ_O kV| ph0eggU[Zȯ(\(4կ@YY2ˍdG""""rf #Fo ?fh䅗 Ѡ@nˉqcGXq\j i4ˍe,4xܞ2EE݆lۻ?7#eR`0PZZJq S""""rn].BJ(O /o~~pEII %%%f3aaar0 ҨJX)""""͓j-`0`6/g>|!۫']Ю][`$V*a5VUߏR+_H/P5W|1>\.`fgc۱X,5Q$((ڵ] 0B̞˜9sA^^>>>>jEA~&w=}p:]Z """"dX qr[-~0}Ox{ Oxbхhv5{/k=Hx<֯`0@^~-^HטzkL /Tn$80 ש:CyLy9ok@YY99f`` N߾qDGw %e۷mg֬Ol<3LzURZY_,9K.ݻU0wgXOИc+"W{ l@Q4I=zuh{IIi ~u .??>\[Sobb"/!>? :t#򉈈c3WNp nu=''4h >]~;q]w0듏4h >  lб<EK6Cn…x<3>}yXpCnwwsa$UDkxFqф{7HtmC6lHQR\TъP~#k}),^'>e%v{G*_+/UJuڨ?7Ѭn9c}oL|֬^u g'",[o_yԉwV;n^Lrr2G%#3L^|l6Vg|JV^\tyzl<C^ ?@6@>\K#g.a̋NH\O2jOSÉkp(&+u +Wl!)7'&w1;T*hbs絋7wjLl';i̚&WW11U{ORrcw93n7OjII{IJ[.'9j$gmRi'ߟwf'Сʿ~M>F;v1ާ:fYg}JpMvԖfZ jOp`` I3y e>&Oz۷7޹9-<$'' \ˇddf'99,u?ǒׇydxl| {?<97=;6ea~3&n;;7X|r@û27x?Vw[\Rc{ӜCeےɚsd#em)"n07w}W?t` aѹ>Y)="rI;d/Sp2)hu:۷iiiѷo'?PYn!NxdZQۺ ħcڴe06NYlj~O g';cXXl9˖-̳=W\hǬϬz#Gb0zӖ}Yp#G`f%<w_=/9ܴXwV:O'G'|m^ƖiÇ[fu) dV/}H ;J>n⦽:=9X.m>Eꊵ9Y#їEjL!ŕ݂).R)mɈ/%bۚ7Ee&{/=pp#Jg`2K)q7л[BŚ9`=>O.iO7dk8!ʋ 0g{ȭLܩ$b﹮`wX2>Xĺ2~ 隣 sI) M(亁} I=t4;=mh \_X#:͖ `@D6[V/"@x;NElY5kJZnļ9ktY>vr@DonN6ӎEBp3c(I'G\B$-Uk_N|0nl pG-CsTF":'3v"VDDDB˰0{Q"##-OJ֭[;QFT[ƻќ>=F//[t})o$m""h޽"#3W^+>^~x3ˏ7ѢE il۾ cF^#3>?Ϗ_';GWܺԣ&gsʿSfg׹NV~~ϥF OLtI;ubOMJʾF\!^usUâ/Ν;p=ßO {&ӿWΝё#e~¸/N0hh-ƜN0V sDl V>~feOw],ĕ21bH/ !ʒI>TuQ1do!t(H+V\~^!p@4=sV,,*b;gɡcW~]'ܣ珯T2#4(PIp=*Yx1􌁤H d_{6HS*>r:^RKEDDќ&Mz{Hr1/Vfﱷ ʰaCIKKcҤ).)Vk2*;ڶV?4͉[}n[6ULTn=;w䇵 0> W>7YWtoiXyl_9kyNL&LDqc=p[oRpPWL͛PVsپkWm_QL"""5L7s?#..[Q3cN'f222O={sfϡL`~3x/Z’ŋܥ / ?0COx|SM3GRrb]G=xlYgVaNl6t6NϪ>uh3-ѝxɕ))6$X~(J<-ȣo_Znݰ XO'$~ým#"߿_C8O>5k!ִjIӾk [۫}Vûؒ~e%("rsgc'$,vLJ䇷0EE@N IAh6"/lַmWezH"fAn6"ղNV&35YA\= 峯wLgg2k6qm?٫SqTWwE%&Z5ϔM;@;U+:u/MZCqI ]cbCqI 999Ӈ.Y=y8ഩYd<4SOe$&&Ȓŋ:}*<4,bڴi'mqV4JJJj){߾wM}\Crr 8䪫z5zݬV-BZԻNuV35fq DX">ere>=#̟;(;j zРaj&:ܹ1j&MzN3f1wgJU =+ڙv,{%/?yިhك Y_[k:q٭>@oOp\*rLJ׸ wfܩlUȝW@\2Mݟwhzcʐ$m &&R:cIacJzUf>'8Hכ!1{yNM&Ml;'YGpD߄=BSl2 (_?V8PS]8XLPB'1Ux:M-$~J%׶/}Udd$1c{l~Xio̾1.2'$ݭsh.1]HX Jﭩ'!aYi/O ŏ7f7;駟;xcG+3ԬY2?sWع̏?n^ZbN[`w{mNE8g{g{/΂ +C_q xnT2' Ǘ:N<`٘2-^||2k&=G223M~6"I^sE|Lgoxz_=+|^ k K.ʊMĊZ>_(Uƺ:I[ko0Wx9qML8^eco(?ǒlj>վDDDm~~DFFIII OuM7V>"ϯΓ_s2c݁`ڽI{Z/< woZI[V>JUg`IQQ1?c{_?QVV oLy oǎ!((]vt:oӦM1 sY:tp8컾$X[ntyHNN eX#GG+< $%y&7!!!unѣƏ?\~ѢLyʞ?L^amޜ+/Bۈ&36lhӦNc:G ,\Il6ޒFߊohfggU;S UC0_Izw9qDwfc߾}l߾4joᠰ ^X9rܹ$99̝YJ3o(>4qqeZ??[W}lSY|b0uti9%%eZM Hff&AAA}zo>3~χKJ06uf9rI/4cc̈I UWi[`|, |yƏ5Z r[O=oFXXo6?I3$O$}.(_.'yy2_DDDD1 Zd߃].~>bϸ'96'Y(-u`26: %H !""""MF%ˋR;bZMV0kZ6uo#߰-).)m6&8 ,""""/d c}qRVVF^^7ODD^ᤤdff|iF7%%xLͪ+r9),(=""""rnLX0y5NPr\pа0KM//!RT\95w!EE ㆲG+l6`4Pde </`2p)s:qܸn<HDDDDΈ`h4ed Ng5(-c<0{{狗 Ѡ@nˉp8x<+P Hs9\7.(ShhUP``fIj?VfChUP````````QQQQQQQQQ`````````QQQQQQQQQ`````````QQQiLji$ =08@6DiEtܡL^a[2o-RB\ܢm;O/.Qi r brg:XmE$ E#k@BC뽯ֽ,7ؒ˹:_:3ú@KDDDD䂠!,m޶wg>&3ywlv`--Dz DDDDDX|ظe' I(cW߱q:թM7dNi'"""" "RN^>K[,埲a&~+,O{fMKx[ebk]0~"26`2\$svPZmzuD`1=Ċkؑ㪱ywa4j,hNZbbYUle*?N<3]1*" ܩz/+ O8Gx0Zt!.+yE;ٓ. Y8S@nK(vlElMBьju}BfK=l8|{~~\@If* LϨk'AniׅvY:e#E L H_Ĝƶ\6tOIaϱMBEAc􋣃P8LT6Ёd.wr` Ki5=1DQ]x$iDXw`O:Sf.ݏ{pyՆ/VJ:'ps86f;rAq: I(& mȉ]~>]Dv]Ҋp_ /"29zWٳ|p&Y8eEDDDD$0k:6 ! cz;vm=kWzySra̗;x#mi_݉m/4TONgӹ_#(]ʷ]#jF8w>pYK%?3݇!/fO~މs^֕c1 '<:NNvl{I+\Ǟd?q wŽL7opcPr:4'n r׳jA'n`]) doh1DiFW}IVoZOa 47eڟ=l|3zt'6SeHxX՟IH]ǁ O{6׵"""""M_S莹>4s֯fsUɩ],q$Pł<cg>cؘ_CH\ Wc=n{afhh)uKuN`6aF|↍vڊ{~;=n/}|'%EwMvb;]ho}L@c{{_TD~JOt ;苻ӽ@`pĆϰ ]g3*b"Kj:(VDk}_<֭JA$qW:8r|6DIn&dCېpAfI0mKf-zV U$n}'~:Yx+9{/lBmnۿȋb!5f^^trԖ5 h2u6|aں4wҫw7;KeiH7յDuJ-ׅp_pdMzEx"MPz#صxz?M6%S^"Qqth2 @q.xE&;I?#ҭW]mn Rs""""" M+u3v0+GRw!u}֑;'>O\c#5:p8H-#uN1'%l\Y}qx, sMާY&ޚ+!=9@X58Ssw.-k,`&>.nU^Pu'N"-kx@nĄڷK}[ k5Ox?Zv8$[k,˵ [Ŵ =k9dOhK|$x(M`Octk6$ҝn>b+ dNfEm3Ҧ"Q-H""""ܤ_O_0c~%{{sKI<7eOEL{n4vkA" Շ?f{Wև⁁55Apj7oKci ?}+?{ǂرfrIs[}1޵o[%?j1EDDDD)k'_skbo§$ĥ_xw:¼w?g ǥ~IrQ,}b Lt׮&rݳg0st=me/v05kW}WڣjB^3c [m;YZ<)/mZdЀ8^ɿ uX/Vh20 XSDDDD<.1sx9 r?Ϝ+Z͒mc޻Y^s̽L}*)7v-|L}<v0ݽ ,v0b-8ahv5bp \-Qk ]QmtDr6ܕFb⑓(ю׻&߯(kr:__n=wSh!x`\9B""""ܤ97;*^1 ߞ9ҫˤ4]+7Dǜ~Ȩ"uiahBXx$mr׳|g[\0լ/FopRLg΁ЧwF=Rb/5\qmoy:[{ϧց9ɯ,RYKxk,cyt k3zSsra Tr~t'ʻyʳ>96P=׿ \0 d'1 vqH +9u~Ys70Ɵy:Ew'GsHM !R_`=g Q%*Q#<҅=٫9bK-%cwɹiؙ[ԄW""""|YW{Wg ]c5LTtDDDDD~-~@bR:yXg6 IDATcZdW ClXGKBC6li?WA;vf] =@XDDDDDDNWdFٝCQ3+%9vN6ٻ說Cd`A R$jjx<-D (""EЖVմX#Q*VE*TQC "UU%c' H@!? 1vm6\s$;#N'.}O[r|-.߀ܛ%1w~eg$I$w"qOkIpwܲͬr4A: yw|u.r7PZu9J0it>ȸ+OD,doys:c}b ҤYK.lߑn)=wu"̓`$I Gy M㞿蝗Nbwo\U/!t@*fY$M}y2Zych$I$w$ ?>08ۂru]_wE Vh̜ ݾ|\Njoz%:ET_3tݔ%I$O_U۴1th.(81mC|rwҒ30e2?}` E{&(Z_ $a7o@#Ndh#lٌOxt >'$I$:Few9pPh>%'E7nc1EQ=xoCCd:PtMTjښ%,޸{.x䑦u%]6w^yv'$I3[gpm9KPZ  >=HH-R㎾\Ȝy9y|0K [srgA/دq+jm!Ne/ǧ$TGjJ.hqg$I3ŝb`ugi (9+FqnLj<nL9/1}e9 Xs iF~Tɝ,Z_|u|1U2W?Bi߅V3XWy2_{ #{BH$I:s{n0ӝև{m RbQԺX2IcxQU2#&Nd\ ?G|fn Pn{RRp,-DR/߯v/,l$ItFkp`^wr̜1E+ XP HVH;C]GR7θe4|E) ҤE[g $A,_Ź)m 6mOHrJw2& n!##,@QY4oK|]By)9 <$s$]yg'Lp y?K nВ$IPa}UU sKE$Itkpўw$I$X$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id>&;z~/]LSO(ߗ$I$*[`7 =//.8%I$IӭlT˜Gesi#i W-OjrpG}hkd-aahSM({^s/ J6SMDw(O0|SӘ{z`@prF dyY[h=״`@jf+dn vw}{d}mS?`5c c^jq#FhAZ^[ >*pW׶dh=%I$D9V5Vצ1vitiB9Mݖn Z2}̽!sVBn5l1_4ų֤[~*ȼ1nѪox(+v2,ǓU+ovqqj[f#~nl_'w[Y: jw`k ˪p,թP@06o we[;a$I3+da\J*XШyїu'::e|vq1ސr59 PŖ@TS5#cɭ|SV779\Y[D6m;Xs(G4 '*\w yckZF2i8Nˋ"ٻ>Q(:z?$I$H' ty`l4PTMe{byMe]7-<WVsnK.nZu |S]F TۘZp =go'z ÉY؝F'~A hDTTj\{kC:aLI$I:@D8;w*6W¹vuU#‰.}Ip߅Wrw+llsqvo^YY loX/V[T3k7rsmUMqU8ol%$I!׸6h6?`Vpވ[ 8UYu6-'F\Q7| ͟Z=VvCUpN`mP}{rf}S TQhوNr!|~"8"EP -ʙu5P|Ә+$Ipr[wQq+n3ឞѤ/.۲hЀ>=Z24 'pn#Zl,ڏwygnNm@y| k >?5tZ7ׅr>yͳ6gA$I$I:Y%\ufO*$IS[ VOVÀ6$I$N.В$I$@K$IJ`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`GX^ujn^ޔH}h :R-,;d't+p_t9ՁoBF!}Vɷߖ H5Nv $tҲ7)iv屿?, 7k6rXBi(Dq /H$> ۙ[17r*wAGRi^ ٬Ɍs,?Wz[$'K5K~+RT"ݖ MOVv reuHHFƄ S2Bmrnt_!=c1=^ߩvą;d׫dF?@Ϳh>It?~ Q}S [oQY?0P 5tSf`/ drg7.GǑ}V&mIGY.of.!ǙQQ'3bF =uAI S|7qNٖbuIΨQx뭷K_%\rTX /QFUevref S1o"GGP3gg3gMULN&g \?qO$*+`^sdP"Yy-u- XGҜD֔dݟB﷋#$=:'ͷK-p]]RqϝkW̹,]_Q-7?Ny}e}HKƪ$ӝt۞ԧˊ lubwF3m9WL Ar=pͳQ<;K2%yy%T"wz0]\|$YyRBD>{-7.a[UL)'ugįG_+Z;$&`UFͥýcmdȸGHߒ„'ſ`D]zYykog]ʼ1q|>%[wd Kg_t9yӧ0i'",#=$&rx6yy) DyFտ&365'e02bb(m(ݧ%#wyϿH|hy) v?kvןdlCʭES&3eZ ۰at 2W%2n̢>təLCK8oX~ʣ Օ;gOa۟n;DHo^q&="sirAWڲ\ Z@ͳ8#ǥ2*nF0nAa{P77I&gM .rc~} tp=xr::QH1|v6#x{G$մiS-ZDjj*W]uQwѢE4m* )}hKNLRDϸog=8hQwg3fi]X09?KCZO&4Rj{-|mI/1&_3nQZMm~AX \+t; !f3l|.ɐ?w:OL?nyPc_-P΢)y;^7'22{]'/:NS](Bd>m,\S6\ֺue 3w屩y?mSXZVɞ=oNbD<&>\Dymhgİ:ﳺc[Irrؤk$5K[;^&3|8;?|ikA"Bvԕ֡bfM!(dQ{l}GĒd5gOәq2_]OCϑv^~c:3ᅩǤˏn}GYw(2|'،c[Z'D ~.fsJđw$IAC^UW]Ŋ+ g}C{C_blNFҮN fUkYw DB!*wkDrbIJPB·]cI2"iw:D`- #Ԫ# tU¢y4u C# N8YIt=?!ʃےİ':*HKsin-skKdv쀈Ndݚ^D;l;s։@:dhR,MGޑ$I Β.q6 [Wf@IJJ"N6C|YY⪬C-K %_lQ;ְί?(VQW۠hc1//;{VAlі9dq.9Kjt [Ui3mVr>Q8ch_݇?}~9tKN"Gσ_I0%.)5mIMYoInLm >Z U;9dk\r#eOoeZR2)]:DCrۏ8 [=G]PmE%|:z3%yS szn HN{ϙ 4VM@-u]NVtB{:j+MV1@9#ʪ EhҢ!_m*r[1EU1\b&h;DnV˻v?κq22 2g,#o[ݾ%Xt.F:Q[۴S?nВ$6; zQ5.c][hmfJ<4!ǹP1<.`]#i<1sZ5#-tʵ|I,<oW4<}[B+|EGZ,?5OǷI-d:V_sCo3zWZ>$]ufZ$2<{ЮU4I' _I·XEFL茇IzO[MYhAejy=1ܷ =Q!{2:s?3G9oo::uAޑ$Io=oB7ԍS2V-9~s։cޑ$I C~OOKeY [ G8W$wTFsf_$W@-Nsc3oEE Y2=ԍI ,T2g2JInWw'i\2gPZr삃;:ցb>+BdJZА`p'[7RZߑԓ^򙖕[Cw{>Y9CRϡ\91VzM1Zr>,9'vH(g.9I>XKU!AJ(Z_NeűfnjCo'-_d2ܸue iݪYmY˴(+d޳!.,60,]o? IDAT\#΢M!*gɤ¼X_I'sg33w7cD%1 W&9S # &=ڒrI 6ֶ}it3xU3|e;}I#˷k ilʋ Dm f0+vu`&=;ZB)NLa<"ArRWiNu}G:lKn06)\I'2明H$=҆L ΦyvCrUAwsߦc+ nKw3G$9a)ٌ9J!>֍A_1YQ-6.f%f3Hzr͹x"đw:,Iҙ7"*O>5jg-olVC. l`ll e-ؕ-ɭ1t28/!ۋt WP "{-12O+_ҟ.|v69u帠?SK/[Uy3/~h}Ntʫ(hS f G\&s*؛Aj_IUm]Šn$I:%\uşf`]p#z}jgh2^R;-:ѿnGgPZk[r10\V49fdщa1O.a]h4Kfj:rEaS}OFސ+f6hޫ;[μF2)4!K(4dï$I)4:nSz/[ʡq, &58w^ͺŭ>@vdZBΪ |PRkŗwgࠞ$ץwrL1E+ XP HVHNɰ!=H;foQmINGkG>Yt7gQJ${{I$:N.В$I$@[$$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I:U48aQ$I)'$I$Ig@K$I '栯%I$Ig>k[SSCMM {^K$IΌFxx555'-;VWWS]]ͮ]صkמ%I$IpiР 4 ';wy,./ʭ$$It&05-Ch\MÆ  '=ofgAN\TD$Ie5|E0c%U o 7'$It ڬ ąhРIk>iA-}$I$hߊ3rY$I`qQa|Q~`I$IVRY+kXCSY \<Dؚ/I$tʶE_~O_`їռ$Id>VlfnW ,9A}o#c$IUXR0z0U85 #"Ҋ>T+kYc)O'j^ZP$t'}}&f9g~@a2oH8sw"·sc$Id>=ސMàvRF8p.k_OfW5t{+w95UU&T_TWUլlxf纹rbO3w7K`W'qǵ|y- PRvL[1(P6k91q+><} c?൑$I2m: ps0\XPMMDCKmN]U\t.;OQa?wAa Ӑ>La;?0 @9 ?c;X>] !> rBxUF;HϞ@\|/MŔILLKߓF!!w=Kgҟ/)4%dz ƍcRH{.X^P@S:t"=uz+P t; =cdyP'sHB%X^ AiՕ<ޗԄEoh ASl *E;' ς,[~M̕wңq̿nͦ $V~G>΄`3PBvVm`|=uXt4jKBB"kVR~L묯/ P F7{ƴб;>ry팼6` Ǝ. n4Ň^$Id>ep57wˣ Ia6By'I_>U׊[ % sn!bRFPVUNWǰ}ޝ>xrfv~$&vox'x;0|8&<Ӓ?LI/?t</fbm?dSН[@x1Psy aGyɯ%ޚx\W$I IF-j流*wƽ_ಭ5g(YŸ.պ-Q\8 6Эe$wIsDŽQxG s6Hh IǾ?$WXY֓E s> '$]ԖeOt+^^Zm7 Ғ.=.rz9$ITRSM?spQ0gZf {,0@[oP,7~\tL',㝂e|D( Y< _ƎrXp 1b{xP= %_ݺftg'P#L( PR";޹CXJ9UWU-@hl8&mUCy[wߔ*˄[1uWQDFy9q-I$Y\ѥ}/_jM0࠙0ʖ1 ;΀N}ݠt),_»sQl^z<10" @ Dn<~@zu΀+Hu0];6p MmEMeHR~$I~bJP\߯\’s9z ^!T$D<7ȶy$cЁ#\5.{yX I$p&R^RA׮h W6dvLh;+x{{[ ip4?;K|Ӕ7ېF!7׶"~^p`Kmq>?/`$qw(~R֊7m̅It<g\J4ć(\^{7( @ g~@qTW\[Wui\u儀 |E2fm&.%vy +ºW?Lza%h5|jH۰rsv_N4VIK\^o.?Y$I][ 4mfmsQ\c:Nl-_y;e4'P TC决+rppnr>t 'g )?W> ۖ- m?+"xqxd~44ȣGצ@W_S^slѬ`.o=D\em' 6q,m;^Lꨧk[Nn˭SߨӑȐЕnQOmq$nHlk~C.2ẑ'OȘxBvBX5/42 /[$I]d>}쪪|ܹy`qi2&r.jvQ 4$a##"]bv:a |{*URB5hдaO:رh6RהWmGiz>ʂbJB%.[axi];t:^ Grr'z痎$IN7.1r9аaCÿ>^ :I*[A<ܰz&ip6c Wϋ8$I '/Z'G ^|{%IS`I$I $I$%I$I2{ޝ|I$I2˚8}I$I:mvu['"Қ o0$I$ULDoZI$I҉aUI$IFxx8FBaYGB$IPe5\ ᄅ{,|!I$Ig6Wس4 4!VnOUK$I?Tr[5׶ ѠAO(SaaaZ4澎9SyU|Qn%$I3Xc 'ర0bw1,.m;$I$ =٭'-QSSgwHMM 55v$I3AXX؞̷Ϛ\?.y@$I濃>kT$I3_E I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I$$I$I`I$I $I$8 N];R^Fqw}7DI$Iґ,I$I:+^-{-[w zx-GaI$Ii$3pP!&0R$I$ Μ.e,- 9Y%gW3\giY}Cʃ.ЫΈ( ?ɬ6*d޳2!AcΚtV1׏f7+&o}F3[{9OˠC{~S?>ץyaķIT 1Q2vo}y1?>CHΘ~fC2 ^aMYTE 3[I=ԛҹ/;O:^RGμGHm\sm^P*aaMCVb`_4Yɤ[0bF1K,*e[v]`Lo;c_gyG<֫3 5}6E|#g2Gs_QgG3h6&~wqQ _002@DMǟpysvJ[UدI٪[b*e95ւWļT1I1ϫxxp1\s]]J~ S_XF~] DDz$En*s'g@4kIܾ]ncBYa 1O\T5+/O?($~QJO$o`O}y>EjW7pΉ5Ervo߾E#ʯYtWrt,9 Y]v|L(mXą_:~lt7aY~~~$''s}#\UxGHNNOśaMխF0$-O ^!gML bk}݅$'}3^3̈aK2=hT-A'fRFTpʂ ;o ep:0- 5uW>luX(عt{ έifQ%{U]_Uq4n6سa7b"I6D #af"z/V o'9oӗ1}I6ql'agF`m M#1&wg$緭xd$p[$5{>#f~/2rySl7w.CLxk/Ǔ\f}.CmrR6-f`wHJ78ƧL j'V h;I3gt6oZAôu۽|gxm1ɫ^% xg/>ű~rVi!oU[֑%=x4 f'%夣'}ћL)1y[ 1l#n. #՟e" Kb IDAT2~`uxǫ+oL슥)NgeZ(76ÃG֑.uχiyh[j|n{)t%Aӎ{l Ik2;lN7s)t2CM-md]>/V@;e0aQ$~Otȕ+S͒UI^6kK[ 8ׯ!zbk=5*=}1ɛ1obiéװ"ҋhp΋ImaXڂ DZ۱$|! JT澳s/qLS̠e a|ҚIl 2mɑLc;O9'rY0f;_zݰ w"^~*eǿ gWLXϲn7wnoq\2RWm 6EOh&Sa}7a0aFVRK~Q h i>!yy*N6"!`0a~jũlMc=4 0C=l`֔En>@gcui8K'^$f{]=Ǫk2GyGpkx)䧓&q ƂfZ4jFKc!gHG0c8#+#~r-ȈGTW|vzɵҺ0"{{I[Iޚo<(.Q i{;35i}$ ?Āǚr0L?03fl ʐ.JvZX5o{I+63thm՗g'[NLt8m|piI9 w`HFtoփG3u\ZnJwЙ{lTeoS%s.NU`p}+n7snɝ߸Sg4:W٠Axdq"oR&+:[y,U׃k&vi 9ݐF }Bk=@˧ 8Kzf}.`fˢYlY`0,<=j%0zw&vk%)ܹLmkVp$EH=bup[6Ra'шR8ݤnlgSV ,#`E9D ێKx7tstMrz,}ȄE #o?FNh'Ock:aC^wkIHEZ 7wxcjW},渗?5{IǶG^!$deS?V` _ƌ&*cwqr}Na,X uF*;m^t}5 c7+Is[+)_gвhZ X2х?I(ukXc')L/Sg@.BZY&5qTn%f ג|IobfC3iheƱKAƵd hV#6oZ5WA Ѳ qX4`>:t s"WCglId8l`! ;38UNpF̀VFЙ7q˝i.ҏYh;/5%$R(0~jElٟG`ƼCd֦ӥxtoǡDxƄnTx_6 <^tT(8+@FUV܂#k^e0'"z.2aN]igHޑgx5>.$=8]W C+xN&3~:(utU2n1)WI~3Z>`%˚[=kakΤFҌ("HY&QWpZiP8CaڜY{3?vvC6Yٜ nV,[UKYZ|}B/8IFqSZ~MIPZ<"2f˰PJdr0O=< Qt<3lMIX $ ,D IM̈́iDdGRWEY PƆ=󖋖eve 3I?am iC ?EzZܜhةv39xK qjRVN?P#>a;L$ህq1_65Eґμ`.n'1oNL3s;#U$\x9lʒUY?gU5 05^~ҿγÇȚuy_l̢GၨXכۚ~XqIMٿ9]X6, !S֌YYvW.ẗ́ݪUJ5#Ld"ʔ@Vv#wFmqelBg %f1O7xZ  *`\REGUg}ޓQܘ)KWwjp2m) քy6&( vw=o-GzFm dЋ~,`xbcg3d-<Ìxgϓ?R8IWPƢ,fǶfdy"(س%@7^PEy0n񯚲q,E@fOs@3 _^ZM_]`dC`PX443ayYWlxx ){zn&գ߶njrǔR6WWz0p};7J }AwNV^E"{/ U ùwFӂop;z NodR64!5`£lyQomŵʳ+XyqX§A:PZ m7ޤOa}6tbL'))|6d4G $B8cHXI~$|9DsD<3gT:cs1_w>-!!K~W>K76rrCaDܕl f|7 lC)&`:\gD ɀG2෉g&\w:f5+Vw]~D9'!!:%ْ"J`֌?7UM]}i^u` v.v ΥKoYv[kbKY~>7Ч ab;Pϋ xO? ؘyp)OҶcYmp^;$4]iF9Y**t~Cs Kh|fj>~qsSv ^'ܫkdqύ5kNn^uy#exQ]Nx_o7vּ: NVvj悗f癧\*#RV\\Dnf,#5]m#>!&513 *t#`υ_e@1B!<}-+9[b/Okԭ+E4iEAgbFFLePޘ> e|Ys,iJqL{m&&2f7KG1i{;e$q`4XI\}:'t)MB8˕΍wџ22X"_L 79ްADMGc7^~;|>6#XlҾNaX4C^`2^Ey،6iJk0fDk<Ʌ-DwK'6ؿLqSN}OiiD魢 b w,Csq$\EjQ"}v֭uw91كF ,D3ƿ^̛bt 3 F=cx;,]H\/`)432f+%2`Q޷+=_eyOB 0kD+C6<賐OxePJ}>ľdrw=7)K1zX -$j,J&ZG8u6x^729o i 7pΉ\guc_2W+-I/I嗢d:>}l2 Ƶ|3/?07N%FU/ka8E[?,9݇sr*Ƅ^_v*M™ٙɧ2w0Z͝QqMy_a9">.fƌ =뙽%ĪYVe 7~++]i|2ؘ\Ư3"ݘz\ԦUR̄Αǎzxɧ1͸f3Vax 3o6'xKp\Ӭ/\gVMH=[0r!ZX,,>[hЧ,zUH;3]+݂9lqv |B-{;Χ5)oAS`s<쥜:U3˜_]e}`=jlq?ϖ@Eir;gjդ"aӠ^kFaUSS1Vs]?* CfZ`9ѕX[ŀqM]kĐ œ\Ṵ0 f8Ӿ~ &|8Ç_¤UKkLUor^NZ]k_禐e>nOd5W|=R^q_=P MSU ]ݹּoV3>.ܪHrX^eGkÝƲ~ż}eP]%ߒk\?<;+y`hf_?DC͡3G埄FMyq%g]ҺK_c;I}%(%^I+&鳩]EL?<%υmMFF)(9I{+sg+9]R[sDe%C$v hH$iM(1DܕgncIl>4J#eՕ!6ݠ3] "*ԋ(oGdRF^+PM+%C񿵧/RVJDq_`g2w3<\`vu^){O1|3RʸPr%2啓+.\V~s6ڴfv`:IhvPlcv Ҽ`7.$ˊn\qpWu͍qM5}_%st3Z"7,䍷c;=6C*r>q**ZH[qvsܙSXǿ΄wH9/g ݼ#cQb:oV2݄Sκ;F]\qhGF VHe(;DUCgli;f 3Vʣa:z\iHH),$<0[Rfm0Ѹ!d#Y._CO_-Lx"W`cIº J*"QWFiyvrϕsikyl4x7.d-'dV)w?X] tvYK]a{ 4u2S3{LI)uR)YsofnvRU Yfy;_IDAT5;NU@I)>+K\f#1ʢ] .@9عPR;q3~zb+F?XΪϊ* Yy,"* ϓ[X/0syѷE˺ҼmzuI%9WƷIa z.<ڔr?c3׋k HFtYV)t%("CL0z(8 sO?qq$E3$<F|^&vqIO;3_C9z= F|`>gc0ØJּHxLd٨RĖ1DJ\Tǧ-doQ~ +D3i ? I-6Ě79"$K3״h &A?ߵ v%54>3^N!!,oBq\ =†Z3,y-pP0̣&晱,Hh"Ϯ%执8i`w;HX-$jSD>)MxC$b[&CxK"Wi[KDzlk HNLbˡyF {{Yx ;_<혫C?O|xfyt_'!O(#sltց Twc*RDlah ig zqDcJoVq)}Yq0YrweYo[=ff$x=|ݘ@c[X `^,`$:B];3x1b'~ %*O2t=rh6Y6`#eyWWT hpm'h|w=5 ;qW|y/ڦP_əN;^)u!dye ~ͬU*""""r*e؄Oݥa98bYS&rXʜھTƔmRaN!Ճ9Z=hI%sj8 rDDDDD2+oBrq}˦xk̬T-""""""w%u{(((((((((n |DDDDDD]{;{@=ᶶWTT=\\\ ˫~#Z{EEm %Wr)++jZDDDDDD~\]]quu 77ok nl9adgTDDDDDDnp7tMm4*ݽ%vdq9q`v qLjSpu#>j!"""""ri> #[pssmk*C<6&7u<~|S,"""""rkOEpOrSWZR'|_vԝ5reD+&拈ȝm^|Nq_36H>^v(_;0g"""""|ʴs~iDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDX1{~O0p v8DDDDDDX~,a'IuWI,]_eћrCd}ϗг!邇K͵ɡr:f wZԽrM)/W%Q^Χ)?s7f;Wn稱^r6DDR%d&NnIl=Mu- Kٺ'lkock} cϗ1 s6k^0 lDψ """"|/kbi?8WwXZlʩpF+s=8XX~o w ?QA`ۥKcy(:fOwʝy<^- bg2vb6qC =syNC?+3g$K^;؁طr;{OƿE;vC2_(."""" wd.'P^"\FnuI;Uwykmk/X)-}d=gXU~2@OK#p&H4q;mۏ`VUoǤf^xy?Pľ'0e}6?j0ddyR2r6/d_9zDt2m@LrRlfcnd}ʾ}'ZGx6b10Y|x+3?JWNbezaȤis!]4}29/;٬5}Od 3>lLDPf=VFΞγ>yy%?fƬ1f+X:vRYDy1yX`7KQW&a< - +Ǫ~U{{WXw<S:_v)οvQoGO#>Fq;*|'IL%X:Zh&ml4f@\WSgESFk2)u _4'H7m=Jf_a]o契DIfG%1=XeyO:H荩])- j g{Eڴʘ7uE;WE99zng 'gg׃ :5ǽ[ֱC^{SZ);s/Ѻ8]Ar"vD%/s72wa)~'\kcعXM׹x7)+TF>>+@޺L+X m}"#Wfz"{KcGy쥸,Wu8w7ѽ*뉼,Ú5p_3h^zk(73э=ʍ2(t'+tnfL3cIYe6v7>ȅq<^WgWXF m>^vYaf ۾ugSv]x&ъl0crBL Cb#hjιΏoNelٙ'_̓߉Ľ55g)!""""u3SfNY|ŝ==x' JKG^AF.yѽYyגzΏn?&,Ͻ/gM}֤VK&nȼƕ`ϏV0zӢ]gx-y'jhetfp{ruI9\ f߆]}-!N&mQgg"v:[ïxSZTH!2ٺ>1M>_f_FĔIKw׃BwEDDDDn=% m}lExPN~SĺbvCRo K$,4>_{jsgm(vtQet$6اttl~+݆chf<F O>c&/8PdykG1wvlAl?(i`g@gnbͷ6Z D7Xf>fFM,D^yWfΡN SdL;id,O__w&hGE<>q,n޿zg_cQo3mq𝜀qώl.r;bpW&T>+Wkrs Ce+ky㉛_C\]XSބO{ 28P1e ~Y?-//3XֿǷٴw~ڗugI1 eN_kO>-[g=>Ozpww֏ fW-,! WْxWi1Yi,QQQq}&""""" סC#5Nhȝmڀ/猾g2A!""""" +VZ9gUDDDDDDo%\]]VhOܥVp7r:"DDDDDDR8Qh nnnnjcr>˴%XDDDDD.r2;]cMm|۞2`W9o)a #TDDDDDDnp7<op[[o{vqqߵ6n^NyC \]]z]\\BݠEDDDDD...Uʿ3f,Y """"""6=B@DDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDom(^-PQvP`/甯ݗ?y 0` @kI,/KP}p8@q$9_48}qU$i:}Ym$ 0 8 [E{:IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/openapi-callbacks/000077500000000000000000000000001461403617600235645ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/openapi-callbacks/image01.png000066400000000000000000003017371461403617600255300ustar00rootroot00000000000000PNG  IHDR!sBIT|dtEXtSoftwareShutterc IDATx{\Tu0܆PHEr j$^2[Y&ŲuӬ\K_677v+Ww4o妙j7*AQTDQdf&xx8s|>s}>|<΂DDDDDDD;ʕ+݊_߀@N23R""""""Ҭc/pٸqફ9u8qáf777Zc:n?±cB""""""r0 z >\ղBDDDDwQ' x!DDDDD0zx㣖iF||tJDDDDkO//H3[DDDDDԋ$<DDDDDXD(\jޝ4KnADDDD*5_}f׿mV{ZM4_NY""""""ry6}:ow翇\&;=F~;ӦOo4 Ns9d9-?<$KGLE%]~ewd{`m}YfGOtT%׾mj]V """" z /}>~9%A;NZ E No>K:\өeUJb,nl 4V }MVj2vN+%sǒncF$O?_j#gUWh/(r(5{h)w3獿ygٓ_?A$""""cC8Q =2wssMv^ŤtnoPnvw/d̹mLج'Hܾ^Mb.bnVf56c\O\:G']ۦHƉucƘ;~_@i+.c,gS5+IU\G7+;ޙMťĪ=Yc pͰO[?{<ڪh3z7Io"͊%#^gS0$V&lf<mJFbBt8!̘VW ]A~GwY3aSEDDDR,0wɤ S ]aԛ^Ȭ֚V&`0WWq׌C9NgѪlh59Q7UD&S֖ nCFp}jgʮs};ؑ Jv`;9^Wy+m3L\?5`y#> 㟈[ڪ7O﩯0׏Ȅ/aM"9o/I&fLIWTx}͌>Ç|!EDDD =:=u zyp ڴ vǫr}2Nq<0nI^^^~,?3Y5 E%g9SvLacޭ숷̬#$&Tv)uG߄mlH[j2oe/ҽʹdalTMfLަR[ϗ'yo ǻİk7|s6ݷl'0G@sd$6;d= ~y]EZIY?& ;;L Cxq5ϭjD˦2w®9F48dza+.6獹%`WKkl3f{~2' %"""R95-G}6}z^'xq/2o_ 1 823NMɟRZ9k"dLOD@X0%¤5neҬE 5Y3fa+l$CfHaͺ+鶌ּA*كzNI,TtF8flZFA#u-c}{oт!XNe{i˫f?ka||{<̟g>o-J ff_X$D1cH~MTb[7%5`a,_tqHYHDaƾe0k$I+iZ>}ywz{cĥ0iMϤWWؿs0H֛ªE_~^J.1՝acǢ,Rѱof}1Cl2 j s{~;AEDDDꠡ{vg[V6[pђg]8y>nF~6_5ҥ+ؒ m-@r$voǮf;x-g6W71*-Gּ/CF{;Uҫώjmx86(pdVl{'(.S`N'>>j]qGNу3Lο ǷfA*7dz_ G6$i3R:v„ 1ɂXs[I)VFϤ&tijjѷ?Uk6 Ʉ0ꦅm5E> c|I{#`װ{ k>IJ1~5uvX}+>A6/G5,c1x!c6&duכ9b3ema觙q)L gMfߵj/z'Gr=7ؿxkf,oWiJ8wH^9g]ﹹa}6 777]N'~~R泵o, ౱03& kV&]DZo&2c†%G{5YV6,ZH;%,$Kc攢Z6&)+RΓ;:~â17\vd}& lVN$g,*ڑ†u?2k8;6Ǻo8+o in3em]`}`IJ!Q*VsŬ)Lv?3Gt"i5+( UF_4q c'Ec6ٰφgf}R %""""Ҝ9iw8IL^Xh٪Uns<033K.> ]k0Z2͉H|ERyΨkgP"""""MEX5; h$sڒutɥ&OO[Η>K vS8aݖc&ϱwZj4\|EDDDht[v˛۔iuwE_trN^5GDDDDDq5%"ri5%"""""AX5jViƴ pMfvT"͚aQ&,,""""r`777Lj1fS۰(WW4 `W !"""" 1zxH2C !"""" עZJ2bG !""""WF1 Ҡ9"!777}}1yzGÁnP#""""WN T\!܍F|f5\NgdyQDDDDDD䊠,"""""" """"""" pu(,,p p,EDDDDj ps3fwwFұ pjd_GN\*8( >xN|u4{0<0s|`%䭷­Cnã~l6Ѓ|z\0ǧNl67k:Wf=ȿ.`Ml޴-\ć,S>iuBE'ߦ] /`ZpлUk_:p 7t1ۺ^:Vlu|jgѳ֟/,,nw!@erWj=dgg|2<ЃČ[!o%<, 77KZQn\{ؙ>nw^9+~g"{Eڳ =sn{IAԹ~N&-Q~7ǧd3s5F> Ь~t L{[֫ whGGױ9l/}j*ئ+]`{Su֗v벸DFͨQ]eHO_B+9g4υ^~|9o去掻fsYtE=TBC4&> vpt Ӧ?s֯-[b80$oKAAA^u_gOK %fe+QKG s>K$~;EL ?gŚClllMfo{ƶ3wwΏw?ΣLu>WLnO|tp1wԓ|}>͐̎L{Ljy'k2ouo}&2 䐞M'8vH__gGl`CPOӋgA'|s mޱU yFgR|*z,<;Z eiߪ#7ƿr^It4>GuI   rjeWnjYT <"'8Pq:q8< Vc\Sw2N4Uar<iVljst;Z8{$&%vE痢%{v3<2ejp>Ydi _z֯F fǧ> 7e'<Ȝ7ԆȞ=gq8jT'{ILzdr7m`А!1,Bf͘ɯ㫽yG^⏧e0ou(~6NzOaHߡp,q|QmcŘsKLppx('w} w~hxp>hsO{m3n,~~~jE~ϦU|3)/V9E/[F̸q,^ny/{ӿ`ֽ-kB\sy>p|?OéKŒ7{3a`;sòy_y_>0|?I ?'ٲ !pTcg"sbټ p~ٛ u^ܣglGX'O2]=^2aEyJU6ځw];<[I>?=|PwHX?HywL7gϗ.#dG ,y <{ye=C;LO?Zm!|0a9=m'%Hqy; >vcVߪz_x;rd~Bա#FMg(0-> oHA> [wͤ^'Yh` iWlL PU]>ն^U"z;olMضa#?rmS~wEex7 v|'eNn]XxS*%?# |rkhY~+CT0ַkGZ{gq6l 1e^[*ئ=T/T: NXP jk|Bb˦Tg_^ˢaoooҥP2aƒ;zcǏWNh;@:9&H3&wִlX7U }S4&[ +5i@~Ǥёφ &ϛ1٬X2RؾunH^9Ø`>c_bK;$mǸt*,Nf*ֹG51,s%KApS `O+ qoL^t!C.7--X\lㇷgn2cʙ@6s\ٍMɶ=%wt{pvVY`(d XtτK۠,nGkC;q#u^|p ;3/ǐ})^%EC/؜Ox1Ȋ!~Gx۾`icQ߆-X>Ɩe|K㸫MY9ጺ韭 +%v)k/޾n G7ߟ΀o7 f=}`;:x}y!Ap#ثEWRwtۯ-8۸TZg-14E_?C,>bA;OV%=q+X?cCrdSZ>9wZwÇ}-CUm^U[V-_݃)$Lьܒ *JTz k]peGmB/B 5˘|f=R:3l"jnުꐵU)ytv&>pm\xK9z99_z^;FD,+:Aٜ^H ЎEtk}I!NY' |Fn%\p?/^98x@ɾ6l;!p IDATdu:3IM=CNTSW|vvdR|Qtngv g&swuMoޕ"Ͽd;pL E=z5w˞)wϔSurRP,-uX5PXE[>+:_nǒ49͝3R~W sNˊȯ#siH>\BχfmVj6)RYy. [h i4˞DW*C'*m2?ZȬRL/vG1It#qq{H*>X٣A\}V^rdad%>>ZvT?hӌt;ne_ie:TL#na i}/q7@{6- hʜ2O%jՁ@f]i\juubiY~TU%iorX*O%LGm߳GHUөC͎rկob ; d ˆ _(v^ritfI4LB ?>ˇMB hZ;xjb(ر;֡U2T}[kgJz3诿'Ã\@gb˖z %,4^bfgg>봐 j'L"×t0^ocL1|rssOTx!MVQn  ©S[=2 '-`s~}Qp9R]0EWPtd߁?VZ-Q?+$8koы?bq(SFGi4xr0`0b3OG[/,ky寎һ3$&ssdV:c'n@a&_^Z{W /ѹ<;n7L"^ _hƮ[529{+GH:c;`4k~֥14m֦*+_5֓Jym+Ut'`c*WulMou=dkeQϖ.onf+Kzx}|/=w.^|k0^A**VW5+#\'IkOw_0f;2^7h rϑIsGDA9{r; MK[r Glf e,gZAZ `KILx>_ǒa٩:eJNywλhOy1~7E覆d)o(aq85/%!{/Eu0ݻ+ zJêYQXqxu+vJ}폳ZX~=~e='lZt6Nlfυ_W -lx9fX`/~չVң@xCd.:߳{I /nH5Eп/'r btC;C};pW%'~c{3rU ӣ;`, Gr~ ٽ^l^~H;0ĴSvf#YIH7GpC0ن>F-ym9d|񵦓Iy-]{q#{~"^}jS{vtЕo;Y'vFRlU׿^E#}o߁sX O<8x4g[5 #g3ZH\šiZsDcZy7EַLၐ,Jf3,ks*H O,;X퍤/_Ķ&T7|ѳ'S&?ʞݻYG3z[oP0j{יH|Einak?e3n,IIټe -~4 HXX(+V"g;;ۯ7OgdjkV=z gY~}nbƍ%BCKn4߽CWA^~Om+bm#f8Dg袳:Id +VlRoׅc@啵9_DDց @oXV|}X~L,=z$0 +d0^6>>zp$Êͻ-}Lc?olg,h*fݴ jm Od?G}>|7XA{qԦX[x_g?lbgȫ[T)CP姹 ,֎yidhuqCKj㺵Ccѥ2C;OO߫X|/6G:=|ebz |j.S7cY94_Q|qM2e57+_&Bq6E0xcI?]Tv~qCKj㺵FMu_V6pɸURBC쌋t ,up8WCH{J.ݿ?aaٳ$ ߲tبEpwwӓ|[>K woSm[Q]zE۠E-Pww02T&I=!77^^v vKDDDDoPF(˥XF#FBG!t:tq3a0pww`ť,Mx1DDDDDFjQQQiR.+i\~RHpZgd2u \EDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDz!`2oMB4[k`oMBQ'""""""Œ%KjYAXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDq//`ǟxuR-ĥ&a¯@[8͍\fy/ݵ\y-9_83NQmr>aScmw+k?3{٭F&szEDDDDD'LKNɫ1Ld˺}^LT@`UV敧ɳǷq9Zd"""""/L^8|p?{az/fÁup&۽%tø S63n#Wo!.Y9ݒkanCqaoxr2N]1Wyavx.⒎qj/Wwa0qLK_]xn#> Vz0wsdܛJ_Re|ɓ} ]DDDD)6m}zo!22Z[n!$$iӦ!/ _J͞pF3Ǹ>P˄9q[v}r]|;9^poK+۸YPu?\E| <[nZ!toiѢ 0oe(c$qW ?ïwg=5{#[cKy6Ɓof׿r/]ƿa'v|;=KcCćk!{B^/mǸ/% yAż9? m6q^ðҢ";i%\Bmoߏ^7G”Y|RGX<7i<=E;yiITNͤF"]gkR'{ ]J^@^ߍA @Go^9mC]| څ(6${YDDDD WRvc/i(Qpǐ|şMKm޵ R-wN7/I/"\u"b/1M1Ѷoq%;+l"""""|>+^iӜ8m\8&sێ1q{Dq1'YxVVS]Wԝ-l5Q\ K< W\vPd\ X6[bɪެWȔݒ_L`#ժLDDDDD+.b2O6hYf|>m\rogb]na7x ,ާG{ SV"lsqym9ADDDDD (^q zUOO2AI:VAiqi6d[q~foq{{Sy9H)s&R/NcJuf秔\[DDDDDGfSRtrQB;78Vn>Vgӧp!%7Ky Gԋ;e#+m|Pvqͫz"7BHͨD %Y;xwɌGؾFLxL>|:|37fb2'><ikL857W+8߆0Ա zЧ2؈[*oà Hܴ{Mr\[R?[wnj]n՚."""""Wwj骗ɗ]Ѭ\DDDDDp9rp@D4 gϞg{F)X5ͭXDDDDDDvEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDR vZ """"""Dtԍ Wb㉈H㈏徯KEDDDDDpI{Ngͭ+ :NN'%|0 %w:2_\r ),,ncK^H`00 FFc/iᠠ6+KriV2?&"""""D\قCδ3( nn.y>nXq^-4߬y 2| < vΜ"H/^ aȱO~<<95q[V.Ȗ}9 W_C[GoM}i~oWg/m[4H;;o=|"""" Wq_B:!ʿ3ם<}i_3jo?A^wP3yjBaoY ,|Ԯ' Ɲ0-K䉟0x2iX>@{8zJgg2cy7L<ٻCd:a+/ "GBpAJ6FJҢ!kbKҪmGk5*6BH"ы#ŃxD=@ $24 g tǠ4<kg>{+KH3(ཾ6T9#"rx4/T%& ߼]VhK+bl"M@o+U[QUJG/XCH'Xά*nЈo==t8jd l~"NN'dMRuU[8 qaĤ"dnWy?֐7/!^={|&[Fgmcy>g|q,uW7䉇Xd2W%~k/>o=&΃"""" (ns\?A7`5|ll;ُ8F=7\_in^{ {NjZ~C0 @9Z'֔\RB_Pl}_j^ALn_L&W-0ivSu"#hv|ΎUxdGڰXk <* ׃]_Rw-k+G_W+u5o2@+KWADFqhn{!MYTBǮ ta%2v"RsJt~oFޭRY`J +{Y1xV'yr<*(RMs/&+S`f>Q͖g*.ẍ́$G i*ɢFv?ɼr.ᗏP>&zZw尐O<#|& L||-}9[r⍿}1K'ogOQ ;m>p[)/}=A_?4O-Ntn{#Țw.drBVޅ)?ueEp=GOiKG:Q`">JNN?J1`%>) Ǟh(!'@[x旷SB/{ )+e0?gD 4W@F{`|:0ͪP_RmZq\V~?.ڎ_kj[=t^n}~!$4cؗ.8 Yˢe ]լ}#0KhT@/0zٰh353/le[dM]h{G[iV3#0v~k_\ZH#%鄸}0<+SRtekKO-s//|N4hiT70Dp.!p#jI~{_o/l8uͣ6, ?JeXg15.P+!|=g"ALd,QڼH -ɘ`gc-4Wf(<߷5^}Gn xS>ވn7װwwz0PĈ1ZM u~'Nfo6Np6;qhR-X8wf,~uZ\B.S2~G47MvN%w[] ]掼T.,2/~tn__OX2O݇ԗ[l_Ic[Ļq'-dXЊxH V.Oٱ{^2Ǧ!WRe~p3lyo/~֛m&Φv4n?nm⦛ImŽfU 8l(uJ7g\' _.'MC[ۨ{33`b):ܴ&70f"1G:S(1۱c{4^MsLr몫dAiSir0I!-Է+vRql%Y̪Zںvհ Ome?V`}1'ߦ~`{۩P7ZiGC%^px\.\-c1@;̤ Kb]C6jwL'Zi&r(} ,""""zVy2K7.I~7sӇㅛnYrh2 -M'loՊV7.ѫ]Kw\6-/]AՍ- }TC-Ӧc4p(̀{^i`\:ByK+~f{\?zw})CDC'L7ķstwy9s.dRSBf%u{^qT4رa YyWh76ܥ=oy܍L3{g=]LX+a28nZF^|a;KXw>bI_N#5˜o(䱜@g侨t|6Bxb6y #ڕYDDDD>^b9sG~Dkh{?ضrlSs.&pɧ>tÍ3 CM녾_p#Y0pL&Y0~jPRbv ֓KDJ|K׺k=X9hԭ|5,iK(y|b'UKS|jS0g{7}U{.Z&3YώJl 0f1?y-}M9uZ*K&r:/6;ioB}9I8 .~um* -H'::p*2 ???f37x>}ų``o+`)ϻ%Eet-0?N!ab|7~+wR=\@``;gDDDDDD |s;gDDDDDS; 7~=)ʓLSehǰa|\z(((||*vD{BDDDDDDl=!""""")y!""""""AXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDX>lX +*v5=լU"""""yxi75َ׃Pҙs:cJOS~ ֿqG~q9X*s&Qۄߖ V,YYCXpwlcŒNi!KjxS% ǝ +ə>N`!9, {+pcB:yK15:ر)\ϲL+ͿZ*,;:i9,KY'9sl]BNUQ ;kqXoc\2&!W2q&Tm,agm+vD%7/W~BDDDDDj>3F<hظ&ɷ yEC:OƑהCщIoSuv9 uc?XA4bX+dxelq3f)d+kqLr )LLRؠaF(!ں`&sZ&$2<0ʺQ^X(!4rM!/N|? d.EƵ8N_OfO5DA` eγx~YOP4-fE׵ȯ&XpTnu{6<\FY""""""W9:dؿM:. cG(#lv 9kpX0a<_v!_f}sqAtpCҊ=0餭لdpuuSb}e %ذa4ܹ.JӺ[ٱ(BDDDDDDxDXx7-e,/(cO}+4UɆ%k$hrdO]<5i: ZJ_oԇ/fpupqܑbK۩rE[E?RLM6 N 7x~^ rUf )m2)cbII6hVA)J<^7ƶc=!""""")vSYa6k?466x8bxwq9((((((((ڊj\CƎEy\?}y{Y^z^W} }k_΋|DO5+f?Ag1*lk}!9s i3*ݵy&m4AV>џ$h,\YCMo_F&EDDF3&Y]6\V2Vo$YY)3Y팽nl$:ifTEF] r7b1sYc3OxDZ`UЏ#ُSed^ !tM{X:U8Z0?4{7+(9G/6=7bY<"McIMQ|c O.:Z2&0~!mxdO}\sulj/y׿dQ o~L֤81ȱ׮(#,?.{F?oۛaMfF0'~d%<&1WaY9l.WC۶v >"17ۇ 2/ndynBaS*)?ŜyQCTmuw}J>FsoM/UUfk)""2\e &d@ hLE=[}4|:aI^ر)\ϲL+tRa5ǺqGxt!+n~%S@+OLedF]=Šl8ymM8}sVQB񫍴9iH^4VPMÌ5&yL>Tkؿp7Kyb> &6 !(N/ ݬXf@ﲣbވcs> IDAT~ o.qlr#EYۛݔ’\8"MîZ\rH<[mmGSo}1iX`!&hbV9f_ώNn+)yy9*(JI?;%.\fEϗRA6,O&p*dIB`=̗iSWs|غͺ$r hBydL47mJ)GںPn!~+jYn{6Q^c08-^(^̓YYgYbru )cF^mɉd!lZ:dj[-̿͞׏8 _E㳈3q5d;LA6%:|J1ſkdzy/J7Up܉˰I#DR/lWv\;`=!լT e ,%ygǖ7fF\X-:i9즩Ӄ9t #""r`[?&e/ vڱlLCH6l _y#na8k`&!N \ooIWXண4uE;WVGu1+y)+Y >M^:tLz [GL35?LyLz>Ųټ4텬z#P!"mc{o- XѷPdɞ|v+^q0r=4ǚCFoaK n߅e9W^l>dՆAlb,SM-4KM(91(h'^Lƪ|H)x$ \p8JUíWl}߫ۇ݇C{ħN#$>$w={FMd20UlͳޏٺB=5sϿx8]\DN>.[]oB}ou|)%tSg0eϯGqtm{}?K; gӼk[&\fG%YYPn.̘MΛKa`ƞ}~i)_ 8W f_ܓ 8_@ooJKHec[9}nF<~ݭl3M٬e/.!{֭1_z=3Xo'sE/LD|F^7R2)ZYAǐf[G(6:3 erl)6sq=s>Kc\G]렋i8N_X=ωJ֭%el޾wՅfu!""̋"pA`|2N::/ c0 `L0k(Y|Qω%f2'Zi}aky/;5#/Pc8&Nf{#!4HହMIsɈ!6Jxuɂ0YOorQ9#Hz`LL S}QD7pf>=Gx ,D&p[wޣ44w`Of]x.9Ќ5!P_, "pl5'0w~AƷ>#~b]boL&+s3I[ӕPH%2FR t:GW>jq$0f2_ o΄ ; /Urp'}rzܛk#㓹gfok '13!zmt>2o6>{ X_*s )0#W1X$f QDҍ pnl2aǖ j^-c cFL7bg3`!&6lؽLVn}Ӄ1L1ć7;M:P +311q4Xz71XFSjyd߸?=Ks\v@Ͻ0A}-vgmIÞ#f1F ɟy!7ܶ0,p Aq[!/R w\]ΧúT2Ou4&4adtI 2Jd| 7.DDD>AA7ϲr,jVGq{dSf|ԐDV)Gi7{nwQSx.n+6v᱄=dۍ桭a)sK/Ⱥ7u~bI]H+jGLR2wFl+3Ay3Iͦmm keptcZtAa^rՁ]6x n콍ϟ$fz.}NN~ 4 ]+gn`6̾:vF\%|U=%Č-kjZ2jw'tm\8,~\mv܇Jx(EJښ#\_BBxK0twczMfÊvddߟH]`Z.YOa93~ذVL`X c{noͯUCw.>oxˠ?=!y:2Eleym#X3i8n9pAJ-D+8zpGv\ ,>z:^Foۅy~Wi>5rB%.K s\]tνÜOwvgIL&f6Zr䤡"M0̱j\4֟`0ں`U>t_WώVڝKX7/EPbb麩&fⶓorj2m-f}\dfj}\H _qO7R*vVuW.j6eǩt zAzYue|k3S})/?f025dM`tzEr]=]{aoy "m@md!dU|e}|jM_p/_vvb?GGgL4.7zu ? J+;:jhM%F\gs?pzy{F{_/8为s3 ǷD~ K^q.WWtbIʎiXIyaW0.DDD@Dž۰9=̒{ tPMGn"cn#d()Lr?̧Co5v h\#Z WAHL2sOTSs5C}3u@ N:.+x%4ˆmt9K/` w\F7'\v]6}رt _fPG۠7k}B8#j?apv~qu\8{:{f2_}?v׶*Yd2e\clZ!v@z.}@p?vzu4!#48B]X_PEZB1wE[Bzս}; "иqb]'˩#yѷ%WK+82RFsCg砑Sv^U8Lj\~ٲh1?{uvO`yC~!P'p8)pw7C X3Ovv487C{dO21ufbe5m=hy;~p"NQ^pRz+>?\쯨ܝ>ZfMt6j6Ug3i5b#S"2talܗVM3|.܆1DvղUwA[iiUKUݙpLݔW򂻫҂'Xr=&qN::]#j)D=:o8ڴK<9Q _"zz69odSaƌ Q g4=Tb\unQ>1L$%[94O&%}NAJH+;?B ϤSS;{^ tZu7b JEGkxXILz;zll-f[ݘѷ%`4pWJ)/ >Fy\ wxZ21]SLGs$ٹq:i{iuYOJ ""h1wSiąQ_b.q^PA+w |Rjnk{ndbmЋKJq$ݟ/SEsIxhIʢtrD175xv(ŋ8ɝκ}JHdgQ{gCu< FiވVbb,Њ;-c[E<0nF>f_?̾EW|c/@<yaq5ܹwɵ}{@,I1P'GqţKlٺEEAZz1RF;y7̜9z?OzWxcl[99#S<05 =U%kﳡ? ?H_ﭦMW]r~#WZ)؜C$""rVNEflӧ}_566x8bxw!o¿>+yumЏ*iqCo;U;*9&/1>߿FL&YZٹ'w+;^n%L_8?GAfY~w* yn,ٹJʢlkѤ,<\ZYU""" h """""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" Z]~hmL\_HB.1ms#drzkY5{1ǮccǢYQ4MDDDDD>TŒoMw6•gl~,'\]wSw:ٹj@w0?+ V-PXDDDDD?] G]5\U!%4'\Nn~u{ޤdQz0EؿayLVc"ȧg9[H\5cSqrיB;;]JSBURލJy~EEi: ֘Tb.Z_H]?~PQSŠivƤW0!+dZ7lX7.N#9$ѓxx#|z^k\T#ϖP'NQ?9کZ#h}l~d`m shY1qi_)Fl<.r1ml*gkԗp>i f|8[Yy]o#m]}ps( ܟVto3g}};׳,:LYgy[)Z 6UpNbs4-x9Ʋ{L\qn<پEDDDDq];92a|%57u{hU5<<3JÖ @=ĕ8 ֡QIճ7&lgBvQneb^%/~Qٴl4Y!G(T;0| \ui=gJ6yu:Ew. Γ[W5 qLƪ|H)x$ vV5[_y[PvQĺW]x#e;Ś4mc#)ÛQrb E/P5FOJ9XFM-Yxi5= rY@ỷ]Y/3JL 4{[iQ8vČC?p dbUQ:l}/&}m<kB:i(Ep7?B=QXL`_JDH[xp1~0&5,Oy*$龲3$q.$2Fbj.ypWtf 0R#։9y̞h B%cR75o_CIXd%zn&Ik0ćZLVn}Ӄ1L1ć02KDNuwQRcB7|FXdG*,1ɜ2EDDDD~@G͉2R}?%IexYySN8.`P1c/N9AsaE +炔0EJ}Y3OAJ|%eDC xNSMsz=.LsBZ :&E=nCHJy3My鷩`S0i,!bKQJWp07Z[րd74BT6AG.$As:(~Rz6yp)_ɃkRZK248H726jC;9~PDDDDD?i[&>i$}!J E|0t\0!UJXNt$}4?hvv = IDATl|Z'C7 c@z?[?he34@B!B|nҥ_K::@繛 /˅dzazș !B!B"00V-1 .4u?{B!BK$B!B_$ \&B!&#B!B!$B!B!$B!B!$B!B!$B!B!$B!B!$B!B!$B!B!$B!B!B!B!B!B!B!B!B!B!B!B!B!B!ׅ?}S:r2aI7n&JSWv[NcG OfWzsFnWɮDmroIv8ϔr:_q !B!iJ.\2֊6Pdzf\|râ$=O'?Uwy7d`__ɉVWW.fg(hW{B!B|SɂIL[v j(k߭E6omgݭAQx:pd{cEXm}:7ЂG-83gk8TRC u$Uu4DJ+qr-- !~M&v#%!JTǾA4X,D0gt.~UKp2Ct|bg-+|H YIV;]lrM f+4ElpU{hW@'ziy+cЏVY9G'I_G+߷Wy/&Z.T rӈԩn[O̕:D pnר &B!/K0%9g,TUs^tic("~^bL`I v@5lݷ~&,m"znw[Ҧ\L,B]\tӘ_/&i.I,bm[I9 nb D`C!?(9]>&AC1-`k1[we[J_up%J%_OWh$^'=Lr)a9c>ȓ>Y٬I !zy{Lq S̜`Ř_"]3G[Fg퐅b>(~Sbn'~̯leZIIEֺhim+d5U6j&B!7N<NNbPҟAb-m,l~ar~RDهbk;Y23>\ bHnnw@wm8{RTzg׌mh.KC;Nc;smM#9ѓ}D8 8zSfsl#6MT KG$š1nk)#{@ĵi,ĺ$yFhbHM']S'4`w<#Ȇ8ғGm)f-C$ڑJK}+awksjz /729H !4ąbwIB!d ux #o,ʺP-aPtUby,Q(?Xqyq&D V-{)vr9bubIs{C ʂ. \=ʶt>'/`fY#-S 89|gpщo (N+_ ( >РZ>@|x3n;P=>EzȗaE/Tye!87Z%B!_~젡+o$d$:-%558$xZ a~:яf@ :uJxсs/"jbd+uy4-ʐOP=d8 ``^K s8n>VORx`FCXyf^_{]qP4-?֌߫HuB!bJd:~Af=!ao.]JY?{qo3;Lj~~3xr_QD[ihV MT7JUB!|ɬ<eϱvТ bS?9eUn u3p?x=c 023uMpUB#vo'LEbcJwT[nbaDV߿UP9*y(U\G䭌(4BP s*;X."+sĹA i9|/' $gx7R=z.\8Djmoab@5"syoxɌUH֒@̈Ӑ:o;& !BY2mI,E@KӀ2ƑuYJ~ъJsC8c~e+KJJ*z=h7{)Na|!o|'% b I佘Oz7Gcyajqꇀc("~^bL`I'xQRo9QM:K,&}@qJ_ uG1W]'{+tpغ]S};ȍ;W}Xp;rCINf3\ʗB5Q[`F3;/go4OڃgN{9Է3cQgd8(5vj$:_cB!_#2: 7~wRLh=>݁ cNzȬ!E'c?#Ű`~VqMy i}dT:Z'Js9V\I&D=U[]FN3WAQ|Ժ@ PQ+R 9P.4bzP@XQGsvS%uDΏޛkN{<< 9&8s3qϗB!B`1ڗ_~9pr\bԞ$:'Aաb4-ʐ!'A~FnifG~Ub/v "xs@ t i8=zDY)Ȉ>xVڒӢ8\HCx+$lR) <ܼq#ӧbKB!2:~Af=!ao.SXq{^6VQ81tNMT4Tb#Su/wy@縕0c. qx>,aF\ -ZՉrf~gʙc6N9 @t[@um3g$Zy#o8z{`{kELdh7?9f 5QDoUoi@]4=\!BKFwRLx%TY o+hEͶxF)WBӇCi&-N %?Y]D YlXFIr^Vц}J#vo')5 !qN[؜5N𹌟9eUn u}w-Sőq)3Bb l'虷ĊKSHcű)~߫;;Dkl O|yh zb3L1|vrk 8rAEgTvyXB!Knҥ_K::@繎/˅dzazș7ʩ'x+j5 !B!%┕Yj喛?… 455Mx'Ͼ=+J@y{8o5G$M_!B!d :&jt$!B!B|M{yK>!B!}MԶ(َioӍI{ukdFPm5Չׄ)U7z_ERjvW?f2׳z:_Dɼ_׳y{tzEv{w ~j )#݊-SNo&V&暴=i87~7͞`#BH,zo 0Wb?;4?:Vw΢L5@ilËx|>>p}%'Z=7 2 (Mz$o4뾑 Qh#1; lw^)-d_Sno3XH?|ѱO97HX:}B!$o.c'19:b뷝{;5V5֢VYrHl?@?9<O6b02Ry ]pcQOIv7Qs Ov1'TУnoz%C XL蹠gs?T(8=PBV@l5^2cC==@miwT܅>> Rs hgAl!Z9ZlhL&ה@p+qr-- !~MEc=ځ]aw>ߓ7ңó"+C8kZ8J/d= 7̯g#_g|4@j>~ן(}=>f+ZF9Fjbc rXŰ48B+yJ߿(}젺̼7Uqq`{BYuFKp|iDTj>5uD4o 1 |m9h&.fܗ-7Fk9G1lYst-V65k){L<Ŀ+1t438r9;j?cawTr]9䭌)q0؞?\@g5*!DDVҨ&JD{T?3󞾌yG*Kko~]^ U =۰)xgTr<“iS8_@Ϳk#?;Bɑ(n6H G!\㻨xBUu+=U@Gp;Ɓ.7l-ɔ^`tpغ]S};ȍ;@m&7|p)mcrXu?%|1jѺ;85t'hs!8+]~N&;we}t4Bb>?{ Zcyq%cf7a,-1l|+$vSV@b6kB^^So˥ԆZZ"OZ(P @·B?Rǘ3 O3;}3J! |x? Q4[if{<]OFv>GW|P ֐Dދ{s<_ld~MMfþ X] \kth8H9=XZ@ʹ RmN_^ok墥Cl#6X8k|^l}y`1Vy -gH`՚(j-_헛]ɼE#餎-m|9S[9zvZٳNK*9׋1Ef@$tfڼUN6=g ]S}Xp;e}zEmn voe_2xʉI$ѵʨR*9Nk1fV2o֮Ntwqt1t?ڍ^ Ӆe{اp (s8h"~gL'uw`k$9==@@ Ɂ8=ypaXрz#$b]}6Nzܟbk֒1ݜl?Kf,?|ҍד$n':…bw]]6@,(϶RF>:x;9{@@5ıbs6A*-97_Y`Ut.3kBH7`p"Kt zPͪd+29H'ݡ!9{~tDRA ,n'O q'kw$iv@VEljflCsY;Nc;3zxKmz9׮L2tDט?h{OR[߅m$|VMnv1J{'1?u>_-FR8 /ʤbXq5h1r.< IDAT_A1޶( 5\$Р]g>riF5ǥ8^z(PEgЁkR~et5sc| ]}ZʑO>>dxK(l ~3*޳ Pg@Ê_>R@{Bo;v'A\9ZwrFagS's\)'SwuBO 4@|&BhHNra%+S@Ј}M%2z/>&?Fqι%bJ)nruse=@/# o7S oͿB!/r vHrRb$:-%558$xZ a~:Ν'S`Btq%G;ؚa:V&o31ʎ3?3z;'q\uS'l~YWb9Iw9; }"r&*oMe'X3M1\ב_:"VUj.;}`D; t\k֎?(q;ۊol#B|Sƿ=|+^hbw)e{qo3;Lj~~3xrffFV=KEJm:@ԱFzTIVnmF!ޠDK~@E`'xEQЇj[\NOWϣ:;Uz;Amy &9J=#ZJc#m1NwOv~7j{%~zo~GUd1^w_ulBHmVGb[%a ys`{=Su=;wQ}.,P_GVJ^L 'R'!ʪVk8T90NꈞFݞU۹cw=@KfxspN xEQ$Zy#o}{`D=bۇi"v~0͈Pコn_=Gv̛CaZT{\NS]𤽲QzG返?: wq .)?jwՍ B|SuNʂM{dJ XhцfXOLز*7E\o8㱾u0,cHSe~Sg. 7? uX‰o0"4.Œ8`Ȍ=9uZ(zT7"R*ktQQE;S}:O .7Xá`)k'-T/*dO9Dnw^%o1cqWr Z[]{l|PA’2ȽqM l!;AŊ*N!P3ovizn 61}ff$tγDκPM #Ft'6o\Fރg9A%iZ[QRUa!g=_[QoI[Fj#[qdfgr+(z5=lP]IȯB|ҥKOtts7}_|. ˑ3!:wek3W5#k"m؎DJ"vl-/X>I:!+q,jr͟T|&NB{gߞ%S_e#(_km2/Z ;__!BLB&(}$!7츑uIW@l B11`!׃&%|=? Nm4K!BL !B!X|R:r9B爧I+U7?*j5=[|S6)籵~5SS_|qbyp G'f^{vr~xyt]Yxi>-~&rNՈ vp>}Ğ˿o:6N)I%„ۃ ^rPԥvAM|=9|>r2T_~'_IFF[4[D%=7(y`{9XZZ塐X9[G!Ԟm:xFzj8Z݅($7v&;2j'_ITן`L8__ɉVǍ jPWbU7]ƞשxu*~%*'љoJJ|e[*ܝׅ08j U%8>4"GuǭcF\M= i;HRM4Da:TQZD%8qy!:`ש*^'bp *)? m멟CG#=(!2G3~YPwrdt/Ԧ-t.Obfފb羻qW9"+C8kZh{储~_d+ݖ_JM%/AmUt+E/7b;l.XBgci͈B4~pk\Տnmy1#3ylW)>TP\݇ }0;'CHM1ON!Z.h$^]~N&;we} tFbu?V# ~z]hi#/foZֈcV̯o{NҬӀEBAn|oA&!}#QN) 0[!!%w/ȓ>T,FjۯQ< eIϫ ڃ]j+prVT\=mk~eKa(yL >䷔cy}+KJ̿uʧiq(lA_xg⢥/zTFߥ\#ӯ>Mm3W+ѓ>S ^BINf%TZNhg: SC!)nkkM;'z'q Sn㮴PgNoGg$E}M+=CvQcokN=#MщqpsM@"]F݌#8:Wl!ޑp#vħo݁jcl(|oaD8.!OzvꈍikcS+J艞bwSl𻞻HObB1xFSHa_p`{ݞIS\b<-(N9;h\qs'7UHɩ:t!0w@ӽ1&rqjcf8g.@@àؚ87#qa)l?IxoΏLK{g!t^pwE|L;M$]Fg|5F9vwG#grwow6,O\ uvUw%增`nz'0D Yr "y`Z>;D12o7 eIm;Nc;3cH9HN#Zٞ4Qv[+i 85ؾӴ Nf=o{X]4DZ1W ~1o_#XQtOC؅A-gTwO:K Vwż1lT79vJ?V&/1?ncۿɰۚv aeSN7DILCm9}yZdr'ЄB!u#XKI"$m*9EO5kIgOC$L=u_t]aH,5;h#zO_.Nb:}z>5.lq 3[ ]# S#n`a}LՓ)_iAX[&zYK Ҍ8Ɍh#:V ]蛇ZD,Rg\ ^ٷAᢋaJ@"Y } 簓s,e n*x{&B_Eq +G~4qOQ5|k1ǁrA3gnB#5})}r]3 16 Тh1ƧiSW5?{v3}D!-] $6v`2 e\(?V q,Yc"+ɉPO0q9鸒7ZV7b6n+NrKN2^߯~\AêD :w<aK\ŶՕ=R."S30ރvVD7Jo)E3 9-"ڛހS)a Ѕ>@a`Hzlzxǐn! bb.`8Oa2%^C . B@qKᢓK>@{K{3Vg, qz g }SaI,F}: w:~w.{T+q``$6m(-Ű5 JSe0<'Drj$mIl}!1Hu{GZmt1ϧ~wƪXvVV®6'^'N0L!:;ol"5$>`"jw [,+fU7TaVOtEvzKDZdJa+.';+{| )h'qރ_S?<~bU+ٻogD@4V"MR3+uEr󲚛kk]-mڮL+25,CJ qǠ~^p9ys9ΉʂO6v,r밳80!|v|vdEˈsr+O*lg ="]٫z$jghEpwR~WSPE;2t$x/aϖ7 Obv1K 9mЈwh1eԺDطbκf[3'*2*8qhW'Wsm?"/Wx$"=.q]|_k&3@ʧߜn-gilQNXw6Lz쟹\ F |%^z8d6;QQZ|r,#^͌ <%iz\6v͇f'nMAxE]1kBbL-}r| G#&ɓ"SdXY Jמ~oVi݋J\U}ֽ+%cc딖ֳ~g\Wԑٲ1 FZ۵*j}e fu=gW:~~\Q45PBSղgw IDAT wppdR^i9sXd_Ogwv\w3r['+ۿy,-\ڟj-ԓ V \ H%9@7IuH f?:_OB֧_|dUَ s֍=kXzm1C}Sul/V}/y>86&ud~3a$i%>XJXѻ<{q[{pOX\6NAmɋb\Bybz(&]8wcl^wve܉=|pޘFԭ{{]N Qu.ѫ"0pkİø+_IXΡ0w1xs1&?V218[<zG.Vn$*6<-cS𰚞! /s'Ʋ<CWG<9K<~PcdT5ykDG?"9k@`'Oˉípβ|#?EU=.>Q.W"F?D<[H)C ':F},]Hbntäf_/b/'ghw&Y_'Wd U3bÌC'f™, fBf3p{.dј7kEXPw򾝬ǰ 0tϞHfy6rAُ -BĭKU<zrO5߿1[5?f^VUUaZyVK8F+?z&4Ծt Ĵiԟ[\Ϻ}Czf,C6o%-v.W̖=N?T)H95ƏmiDGe 4qUxb|Fajjl6 sS.wdXQ9r}{%`?/f,! '&j].bX N|G0Sű4q_S9b2tr4>濱d9c0Hqa8iǞ&'L.o 3]F~3(EDDDDDXS_ޛKzf+f{3,K_Qbd2cT|+w"oygUE[1I:3Y2y}v~QoJWg"w#g>yFf<戗i"tH0k&%wH3DDDDDG-g063c<QdsStOXHʠ]5.]KT]IixE&0@;5dG4Kh=uM\ mo]L֞rm""""")La#5ZUsF &zLr+Fgy8sNDks*3ªnQDVVk\(**DDDDD|q=}3;oX`lDxѣ͌>/v=sz2/=a+&}B漽Y=q;n|`N4Z"{,ͤ_/#*IݚF;t@ɪJRX:e>Af:?[BgZ̿'\lfZ9bͧrIͯg-fٮ"""""|#?EU=.fEleɳX҃cP<'y3ɄVtF§bɧQ|05=c3r wdظxuie7wOx᙭xywPj=m:=>[JphEWU3Y{3BZTTT<+C!#&+cne;z H]|Rp? '''F#W~Pqii))))Lhh(Bo?1~-lp+V)7KXY>="""""1],7<]1̻K """"rS(((((((((((((((((5qC(Duuք\EDDDDDx~WUe2kCi誮5TUi#&p,|1 """"""FVQ6\MA(((4,"""""Rz>FШQ`g&#=ے(~S40M4wvO!"""""R𛙞+Vr(;[᷁8X=~(=,r3 G;$v/"""P|!gVs}>$ /: `¹?=d@nVbK/,N[lۡ${O' ccù/Ьױd;P[žAn0rߚ _Ôy ܯT?cxg,;/7+Aw܂,edi rkI:dіe\&C^Ҷə?&9tNw{(II& p02SZ;MXZ\~]֚V"C1c<ᆚ nlFO& T{s ~Q<>.MPȔ~(#2x!lZG܆]/疁cdS9a$#жH?˦ x?_fнid۟/aFܨ0ܷ̣Ϭ$,鱡 llx;_҈w0Ðs;p/.o_k7*wI.>ysR8Z2~#ùv|1K$󨑶wG1eBͿߗnEf 4 <~Y΢V|pȇ!:Jڪwxsu2I]Èi_%t?~5%76|- {3HJ}߆?#g1N{@Y>߿9?&|!S)11!*>zH[ yc%}LfSsO{E1~T8&el|_̈́ OgHh&|\ SdO*nkr2[ΟGy a)$L`r[g!wwU <_ns\scY}~Fdl{T رK2Gr_G#G3yT~8)Pz 0슟؏>asOw7f3룽8 (̂H*i儽8w #ˆ,\{*ERL!< `dzzj87qKO9h -d~Ǭe{;˓)G̨{+J"nle؊4e>r1۶wHb! vͶ,"""r5LoVAN;{p-jKH6 'sQ^Yb&D:BLYP|&K=ݶ(t0&†0e`@l88,F\wO?%ށ 2J Le33'?w{AٕnaHK&!㉾L/D/#dz?or]9JeIfە̤^H#Ƃ>z,*<=: VMonm}r[p t#w0zkS/\rl\NG3@Mϵsy_Lr~?a?ݹc8LIoggfWyv|/Ug0</ ݓ 4V """W3e0~A @=\494[aeؔn6]sfK]8n/k+yl,ƿ}́<6|MOZͽcaXaHzj=*_new\B  {EU`YCO $NB{+{se6 }<3Oڶn@~>=q[-X`oFswl[Lt -@:& \w??[GM+&zz4xFx@'zm?睉?76hk=I 3̮%Syknr|GdnjR3v@SFM%:v0\'"5?Ss_ЙLf6Tvm[Gږ$?;'\ _MEQ:eLi[i~{ަo?sn 6#wrt[*^} 8wHJŮ7AfҚ!""""W/k$mI%r7eueY`@:S3}J 1Q5-+L hayW#s m#K٨Mx,r̍uŹ&spvikJ11]7g_eϫ\'~󒷳a[:>Zs3f0⹵\h5x]vv_f˖wǩL_]+G=}2wE}h6i?/du GO&M zkY:tυ׳>ŧGKPŮ/|t䂼kYihߨoቻr~Luشp( =ˇvRYj3>"WL䑙HZȅ-O$A-!I@f>JNvhfG{huweI,.&WbS?1o-W^`Q'N/(LM~>~HM_.`DJ-/iџy~ |EX"\Kr0N[?!<̛ٔsPx;$^Gr?NSp6-'W#&>Q uUghȥ0{yoq2I{ r4G{fz$qceTex6AMn'Dڷx":Nb}pnm>t,~9ܰ58CC;kë\Lʵ$d)ǟ$ȥM˧L1e%_Do^A̚Ew"/cц": a0nяGn5c:c3>n&`c]MÈ5GԵ/8H8f]D\R9C3v .zm1Bhk(bWJ*G9<RK-#? G(zƾ!:-^ǾfDxMN6`/OfXv, C =NDDD^ 2@zp=g[W&VrF h mfZCnt^bm1pښI3[ "0f\} 0q4u,WTWUiJ+Ъ*, H7;5!""""@UUUaZܗ }S?+↾GɜOSh4py>M^ 1f3&\JKKHIIgBCzi7q@u@K&yC"9Oyn)g,"""""׶T>\QG_?=!zL('Xj9/5((ȍ#j9DXDDDDD.{s6m5H 6~}t,9FѨQ#n܅CهO'5L;N;S?888߾D+V4iD5m_>0?jS+L&n6j8 ^hh4^W844TXDDDDD|0 888`4R4P888,"""""5jz~uukQ+Q㶗Z qpdKjitK0QQ`zjrjkX76\Ј<;zH hܸ18\ ٟI """""" 4;88,|j$HæרQ#Pָa\Yz((^( IDAT(((((((((((((((5uScX6u=E*Ud!0V{9K3> 1G-b{j )(7`Fnx͘Tr'k^C'?g;O3ְZxNW."""""r]h|}V˕ȿJtYv hV-Z1//վfUh *(7\Ŭ2@Hޙ7XDfϳ,gIXͭHGF144+ fk8>Czf {4W1/rp';WjgD7LvY~:D^% 'kU+m)lD#Q ymZuc,] p_n1|yJ{kS,Lk;̪gc)qˢ)u)TN'+l) O "o )eo_xs˄hU/ 抛و0ۗ-$bNך$0ث=Y ߘIf|j'}k ';Y*ˮe̘(6z$7^x#.O)HL·teV+P[Ԕ^u4536y֑=]޵/#t$S[\MNY o'yPLgiq҅ Z֮"""""|w[21F̂/"*H޸"[MmM>XrvnL8ĺ?" o0ﵗXxZ}M ,`f櫼<#f ec/ɳ9 -Y/1{LGLb6/M EJ1S^ڢ #fMexq{=1x9~*/zӥS&II8pŷ /ϙW'1yN/\:wՍA=kz]:\mO 5ҷKp1ݾ:u#9px'3xk2l?XG9Wӣ ߱xF3u$NNx3jD Z.ܔmquN^{-2[Sv˾]EDDDDk|Cֺ'5b=\ )G,?}ǮDXRH g{Ey{`b[y@볔H{yn$07J+O1gO! 7]:^m'h ^g"}?6&""""" Woq֍$2~]9 X9Bi@R{k׷K[#-\[\R/ZC\; nMa YJtUDDDDDt 6\Aw;I.oFs{Z6+yωe{ N[zVb7rk# fZ2f>*lXK]"""""`ܺu&86}dADXᮞl܍+#W 8?ƫdXOf_ >.W`?9K[s#e`a-y]T+\X][yPL?7&^ZNnΡ2ɲ; J')\ϢYVOyXDDDDD Kv253~0/:=4'⦭|=Ϡܘ6sG/Nu'{yfOr滢=k8ZTТ#gP ׽ÉSn<׫3nbBbo+'=Ϙ'14CYŔ_`9/uHШldf @+Ъ*V+4ϊPH 'u Gprrh4pTKKK/Bo?~}J[;=;«ѳDDDDDDkEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDD[ZDDDDDFѨQVouu5TUUx-"""""r#FpuuuBܪ*;ƱcN-"""""rsppƍch Y>m6ǬVXY^y~gKlrM<؆&3=r*#rٓӮI3id\wMT [>~cX^yfOj5,"""""7vMT T14n^c~9HZkRZ'n ,qRa"""""rjפ?[J,""""""R7Re ky?TKWДpzADDDDDDBZ~bODDDDDD. 5zkq3QRe:```Sd'yi遆Uxn:UjMM-7+]dU`}<iofyt4IOaSO]Wx2hA0䖫М=~j.a<0Vs}vǾ`lО<<^Z;g!%l1eCtn벩LeS{ދ)묀^ʺm{(,b5iB cG4Fp#7f ikbo ;й;J0>3rs[LG`Y{B37|kd`͛1[.%+'%bΝv^ xW0Nm+<:nepe`;*l(>@aVyշ .WdmZ[z_e%i0BC 참y{B. 0p8+n*)aW^̜{/e-e##4̽ 6MJ7|3) Z mǼE*[(?DaQ⥕b~4u9N%Qn8A5P]S M.5kɃ]!r i03Z_MvS^-d}yEJl}qf~y+ t½-t~pnd8";:8Hp [v f-.^keT搲b v]`ߐD@P/tR1w 6':DOd6k ^}fF[2qEʼn0ꎚϋSp 'F~*jpè)i9%X-$&UЬW=I-ƴmjmY CQ!mY=C;n4Nʲ+NdؚTu 81pG^ K[{5Z.}+rjh aԿvxmn+%cZp#ɓd>W;r(.OFѹUϦu"tbϳڎ`tv:sȩe7gųy`,m(9@:?1w~˺p<&:6>lVBƇ+x - ~#jm YZ]wݬP#xy8]ȶ]MKװ=)t+-k-U@N4skAˎw1d\/ZǬ$V/xu{1=d}R =]q2>\vgM}Ѯu±p 2 YHO㴥|3'SaqVS_7vc54,v}Mlz{)rlMGpS]48R}y6p>;DB'LB=ϟ 暯o){ FK]Zٳ>_Î[U/ݍQWDjX;?fYP]ˇV?tiǭtkՕF8ȀoFPm ⵼im=f3T?,co57cu$,6C+-dOS5`d\]*=dU~SQ2g%c1]h%k+=Lpp0e m{G{u7$nًS oZXCVf2 RQ.ך7GA-9_7(KƆĖ0mzWv[^*9d|>{qք?\Hغaݫ7;HiQŕ>j֓E<rj .x1J<7X[Ҽɬ~%A ;cLMinnI/Lj?$,-j260]0Z MhMppj@G(?BVvEu϶]-0R4mCk[=uC~g>[$怓w;X rNIfonv?J»ݝ.|MFТ&:|n)C掠_¯ym[ߢܜ{31 `r½m9dmmKngL%d}lEn{{x+| nk$).&c)3jO oqb= ͬ>@7Ek ށVIaVpnW3{K+uwKj6m?Hsy-0fZp_A Ҕv;Qԓw֢=|n\vmكhv]9_@oV:7.ũK\2|Yz6!#,0~ȅM^$%b& O-3sַyjd^!3ξF*6-\AևKYn +Y] <7oaG{<]Fm.tHʿzv \yerMe k(0M@,{pϯJ37D-x=]yVqc0tÿM%T~sE1e`'z+Z0 ~i^Gpp~ s @^u_r!" r98Ƀ"rߡ6g'*(,9͡[nWuJp#;}O7- gws/]81q0[*Nd&#Z#)[n#~ ={u4Fdޝ~'Kۙh4]g~KEu;mMR)ʼn1jz+KIVl'ww,/<Ўg5wqQ ?0$ !("x"-χr=YV>Va3[s3[j=ZiSK]4OI"(AAY~̠hZ֦~߯/9 ^u_'PXw~<#jxvcz.O}m$%9{mߩs`̠'/5rp U Vm-SfO_ll f'anr_cۻx}gW3M+ؒgL=/VMXFwlۛж`tǠ>=8KfrYqgLTz礟[ 3_ΈvR^IoApdՆLcSe>}+߭aCJv41ɹޑ5Xl{G4zM _t`_|RIk|yiחyoZR c ǒ8祟7709˾,dg?+|"@[ِJ`pd y$rguI, 3e䥼؀/1dc B9{1Y1H̶"60? aWu/Egκf]|mw7ț# \|$,y% 1uL8Ms/b#IILђ/fUR4c2zNu\o6{&pҴ$OeKY? ]کFGďQa+/n(Mu&uvVF56[o㈿oHIJ=,<^Jw&uZ>{ұc$8pͷon#SF%cbG 0E&2K{a-ZrgHf90/m7fȁ"#4o׭p9'9YUDˏ^PvZah@ge`7܉r7*E}1!.#Pj"ܴ5y0;<],[ C VTU [InvYVz5O7̠dc346sޞPI0Xسh.y mF A(=עoZCN% Vr X?u;[(uN]m0K&̛TLL|;:D¯>ywv;6i#|@h{og9񭶲j_9ҋEyV*s>Hzcۂ3V'u)ؗJtJNm1Sb.ٞ^iڿG:$b; IDAT#}Nֶt]J+'bT=k$wg~J֑t{8g#֋3#_@]Yκ<5LĨ{b뒣 ".M?dλ@i7;ޑkagrMv.|SWnn]Cp/ذYA7ѫwxͷW%sG6dNI;{Z,ǝTo?{Q _4t/>_}ڎչ?`Ί޹[溗͎|E(#F{V'ƃ E%/WEgzJe'o8agwe7`ͭaTp7s>9Ulgjn  aDnG %y$[!fT훒%,Kn$?Уk5FVBnڹ 6+U6Ȍy?cp]O52u_NiN*rRٶ+弽Olo P 1xN5 $U9Upd|(؛CʶL&z/J ~5 '}- ?i#}_/9* 7Gd7%t[ߙp J3f:gf(<1ם亗*G~8#LW^ yp3!m3.n.qmJ`=[ `=lu31{zܠa7 }Q@u;KPINTz3b[ 7ҥ!$q'^^IrǜXo;M1Oи7[b:p_;rk|9&ߜҝI,FK xM`P?.mdR ޮ9St}͜$Fc̈H|d뉎ۅwp1JyYhV-1b'eݗ8/&>cQ"[MA-2N c !8 <,$t}ix\.e(3&d|ьxq4} FʼnI8~tnGGV* =Qz;'s+2=ǀt*mun{y`60gz]ݻp&v%Y|ٗdj.:,r] w,#3wޡ_a*:E$XoPp!r^*烰dJJ"kl9ϗ5ߓhr><;ox˖_>Fh=?}F>Jqf&Yil[J|Eg&NJkOcq#ΉWO9vpt9Y+i'U{)ذk at웗'aV 9yd-^Ȇ1o'b&HVO?=~qL >\i別}Ȗrx6jtzS\>xItċ9a8ö`a78ym:vͅvS*K&gьs~sXVkwq73Wquܹo=c- s6Oϟb7c 'hQS՝fxy@)v+wĄ!t:j/*p> EI"NK{vljjC eTJ]?mDvW\DB4Fp䓕c?Op}Ph9>ՃaཉI%;ӝlXzatlΡuEȪ EʩҔS-#IZrK6bvi)u>ƞ(2KaVӵKE:[1^7FµhO?PuXN lC?("eu]l<n}n$ptg=7voemq^":xEqp쁵9C)_%N@Ԟn S\Pt JٖyjOp3g#=y|]Cټl+'wj`SA}K ?6zS*y#^+,}HF2d&t0Coq~u7ev|Lyh euyؖbG9ik)9*Yfel Dm[8enr!9mg3w@vƨ8:52{ Szi's=(Aa|:R894g_9ʣSga݆}y-0ЮY\kv 6$s$9vn_rYfY_wҩjMLH>;85 \,Pt[CDZݺmk"?MrλUT9<hp䁽~FKKR\Dsӵlkz/^it0 }2̻ _Gc '@lhX]Am, ,v3Gٍlq36Gpcrpn8sz1-߇e\/!~ cs>ͧx|m5cnhj;YAH;4e%|2|PmDEj$2%M+0DyFbܖ}JfMv܃G#iOwuքn =}#?a(`'甇9a03Y7Ќ+*3_AǰzvB9=TʄШ`9ؓ1\0^L2T8jU͟mK8ou>M'[΃vd^Bu%d3y!^nϴd3F \-[)r k_Mt.6EHeR8)[}mUXm`=A|ZHFC?Q79o:eh%wOO g+|g55b)+V;foݗ;&`[9)OE~xXJ15vG~lĺo5Fكy/;粹0U?>xTSjq|1ڂ,ɦ4 l+!w:Yeh# |<xC؈ \Ŏh9\ʳOĩF]~II,!)<،5,a0::]h?_MAV=GG)YG4]|HItqvl,%E7;'5dl+'c,fz3^'okMˆNQR<꜋˽eՍ~{yp1˫#+Nth,o.fC3u.iŬM9cf qmoZNީ,4m p;F,~ ɣZ^bOZ@<5DDX~܀lLYčfoVWLkq@C7_AQh<r'JH<ԂlrjB}|;TmGGGDCĤgfc=a&m,: ya$̭,#S=;zGa|J"g/DY.#yࠝu[P\OnP}ә=ccO\#5S6*nk&)$+0Nw&prIR!Ѐ!^/>+ټeV %*)sGT~WĖy4{E?6w ^Ⱥ" tUfp2ټ6{zv8Ez8DTK-q7_v{Vg_41g5DWٜS_{{8޸n@cǝQQ7'PBLɽ'F:1Bl{Ԟ?Yͽ0ϼ1 hF{߿3ԯ"KvbO%f|ݟE3Mbf횼 dz>L\utUSՀjN:jl=WZ]]nj$wlˬZ*'E{U6(w4plIpԀ;`nn`0u&0\B~'i}'fƤDM8b7ۑ҇Vr zw%O0o2}̙X6e?1i&czJӘ×sLf?c;9pHf6{53^0bh"~kr~֕ChREI9wZ=Giul(4A=GD 2W ߵ\ºmHH<;~X9C ~atp ZN62d3p$A:b""W: ߽5Z~cvJHF4#c4ZCEWa(ߚ,"""""" W 3Qt 1k5u14ps#:NrgS&ߤKנ!m'؋\4 ((\A{kjjttEDDDDD 555PSCk: @u 芈5*\U8[8udEDDDDV]}:#Oh`rѵuEDDDDZ\t``QQQQQQQQQ`````_[E*wg &Zmh ^Wʾ8rYT'?؊ЈCdgRlxC^p(]m:""""",юQ/>N WSٽ%!<Β>dͷsxǽf@ 7>xB.XiMB{E1~@Hy ^ÊZ&0t]i0$<#؁34Iz3vaX 7g(d Y5*#xG\`ŬؑE~xВCF3J k4zPUA_{Eێb8{k dpd oӻm@'sxey*1;ÊgM1 p=Ӎ(JoSޓm܏ҝ6-S1[,mD&t75^\^mh wGhad[\zsO",/cW{Zb.^a3Q9_UUl.Fl=grwbzGHw rhF /z|")'Oh{4I Yd18`'|DT-?J nxeUkZgQJ4 b0û{BF毬ٸ#F+s7~ n |(Пؓ(V!d>m͇;%+1t;ldz QU$|3ӎFa†A~s6lWmO{}ʢSa?-BIFQBC lذoe[ua:D ާBmyU~QZvKow/cǟVӭ i"""""" W>?]#hl &|CѭsH0kyjϣM鯺2 &L_;hB>/aԍ`*mjvjc<P3u0'! [lޘJr2YI85չ"""""" W4rzl췁)"B1URz'Wbzi`MÎBhLJˡN\D +1lC[/GƏ&{/1ۨ?D#pŌ{r- jIg(_L_[X֑%yS:G^x{Xv\e0qlaot%oG=iz1{W5q;Vga=SCOL@OXҤ'=lπHڰwf-Xg?[輗~C}k)7v?=GA\K1)fncw#ж#8^}mu79=OO'|^э0MA88c:cw=;<8u}S6塿>)ßȨF>yWfg7VȴBu.ۀjN:j@nNjv;V&8eYfZYIt**o\Er6,m IDATyپ]5{(,c'qk ŋEy'?o$"R.cm,'xjOGG%$I"p #3 hGLg\^TA}6<jv.{7ޛ@NJ/X$,Ejpt;L`;`QװX3=gOf3?l2* wT^~=FG&fHL]ohWtM#^'2qL^~*O2o7CgOgeaNg$Sf'ԇzk>!xTFu0{$xg$;Y ia$o,΃Y=sYUu;I gf3) SÛM厦,] 4Qo3:.b Lpzj װ4HLH^t5)c% 3c :QD#hȮlHc6FGm_4bB!cd ',JٔOt 3F;[O?w7+;1w$1`!tT `'ۉjflccC3 L1M/9BDDDDD2+!G2cJRѱίGK$гJKzAƧ2 (kعNÇSF|qz0ݟnnr\F9&8J8Rd m-9s%@?,+D9)ϏeYq"|mZo}xO}u6HvMSlQ2zwl/ lJʼl8vgOrZ3s>cM[1oOaџmF"d z~i?t2 ˬSCߥ ldK Lz4R"""""rYiGGcOtQTYG)ŏ@,ҲZ@c?) NhϾ Pp-Ys(mͭ P^NA|LM8茨k-)l??|%){K[M>`㓘d,I:tGPFadǻNOpզ+eI:`9й+m4ٹ"RPʖJЎލ #yX+.ALF_?<*H0CY9KAլ]رȂgjs LPuK). >d|#vpX)X=VnKgS″`oWHq_BC#G:ێ׆??1c|F:摱?׳-х[vz}!F,ƻU&#::_p2}>Nz~D ̓ kxm?=u4/9x̎/Q_˘6!o41O`ez ;(^Ϗ7@2E3,_0cŌo v :DDDDDr0`@IG WZ]]nj$wlˬZ*'E2<9EPˤC 2ٌhnBGb)g1N}*@ȵAXDDDDDD -~oīDDDDDD~m````````QQQQQQQQ9W芈kjjFXDDDDDmEWf_]vU+ZGVDDDDD\}:#Oh`rѵuEDDDDZ\t``QQQ]k">zNoDXDDDD.sfGNV}‚B*ol (8F θ+4ZDDD fN־l_}|i6_jXDDD vO -BBT8"B>\߰SL&,"""r C "E!!Ac,""""?ϩ wC0ҊP(RwgSXZcMh0DDDDD~4 9/BDDDDDXw(Ysq&{5<}; m(pc7NF(/ :EQi4xi'5=M7>I??IN7?ނpW~<ѡ p]8a'uhDDDDD-΋ }9#Y hpoEua ˾-A쯎j Cɰ\p7 5w qqqNhNNGuΈ\: I9 )p#JoŶvnD!|3O=܋G#B13G.+PԴVP-n'q;.m$x߇qmGMfK[Hj|ma* mo[QJo;j{Pݮz\vb2Z6<+ɏ,'<0ChA2nWA15( h۩ M N}n=/kStP*ۮca< 'o8PxԻj7NЗƊozhȯ;s/⎥$aS˾ٶsxҭ ЬeQW;F8qaQȒ?=ɢٞT!_1ѪS&NplZٟ|؎oDOY9IOFkփ< z}}%1a47uT_?V?Q]^J~3vaX 7g[o 3z?\іE >esz!F0S&EgMqG?J_L^\۽}?ѣ՜pOۃۍq_7ݍ?5u N@ ^OT&A q,-YiGe\7v5ɉH6M O ;}}y5[M1 ~!FDyhSW:lʫ+,ǞڇC 7к}$c"3J'ƍAkWe_86?cnGoaW^8-JF#D_Zt^nyyy?~o4jԈ-Z1s+ KR!<@;l|̔o-_ZLA1?Dd*Suv.I7ɣhFd'g·m7<ɏ&|l Mߺrq;3Ê4xH)3Y s^cIQL59Wn`tCB]VBvA8:\ ȾMq:zhߗ*ϧx68z4`Ij4?{~ ii5i؂Aa?i0w;7vDDVcC11>bڢ=ΆuWя %!Fg]q+{X&lNE̞E G46y#bdsuo'i;|(OM @^10;d,OqKvso;Ǹ;ciX^`t +Dzr,s+XYќM]m"f12V׿Ë9˱"j5/<7#2lr6/o'q%_}ĜDKk߿?~a[?B/Y,yU>` h|~Aqh{ye6b$ԝQ?1K`:*"^eG9LnMx€[/p9xj<Ûmzw~Ca-I8d"/k@g!~/&c}Gm%xFq_ Ӎĵ%RѻT*ɠbͿMp<g܆֍vuLԦnj>u=N-Wwb[7d7T5:`n;CDDv=0kq6olhG xؕ@݌z/m_g1160;!tF~w3Uҗ!ބZxk (ֱq"x`hە(?ȮYddҭ+fu :{nAG9t>f,F<ڇJB$xBd,]v %N"g=u3~0qM(rxabЕ&G&/Y2:i#L~͠ 76u_^SN%//cp cǎc„ *(૔({wVCzcʟz:޶9 VUχE+4'"B1qةe{T|҈ޓx9lF- 1@QQa0~"</r):XHű;i5jC CmnF,~M*gph]EDD~oa:̚0o6lnV%|;#8Gak')#%ٳƆ k_egռT8lFl9iucP8HQ!*wןᮍ978D^ 4{@lv/V7Edq 1 Y?hCKN:1>J~PCiajPa׈_˻ p*~}}(_^^ht~k%vׇҿg(Kv׍x"9tފBǶʹi0}jUI̜ ଆB Sx:xH70faEdQˢHER)X+jJU֥.+ 6@ QʒA S"  A&NHh]PP1q99=3/m<1D̹XgNљZNBv1aZsy>$I:խ{ ٯLZT+_b}r7 NXΤ Qi>@mzW ue) mxK Ծ3=bsry~3S7'o&{?׎$! $5u9;_b wV|t' 9x=qO (ضhҟ>e/o.:dطB5Gɴ؝Yăv&:' _EC0 C= 9|]ƕC/Ӹ[s4;Oe´?UBԃwg۵|H:W\߷1qЀQ\o͆-ģ)[u w1 ԹO"g_T~ne0e@\q,Ny%yw8sOmsh&87k3x`wn "n i_+̿3olZpא:Hf &̈́潸Hs$w?Z?&؂ǘ47Pdv @tkxi0bƄܣ䤣V>.;Dv;lߖO>R>mGua9^XZټ"冶'ܓi71j^ZȤAu|UJ=vH^rlV%yLʪUfXdW>/W` S9餓Qq66Ȩ(Bիgx(coRXX=]n7kCٿj>Veɂ]ם$(;OfRՌt@/^kÕ.ю$I:> mD'v_q@$X'n6ϤpKT%t9\5w8g| I ? ċ`I$I `I$I `I$dEFFs.C}5)X$IHjըVksϧk#HEV)>"X$I'@ /S%c 2pPY} ,IcZjAt=p8Kٻw}#~sjR>sAg `I$>fMq;G}'eehNY6%Itz?'MYYrpAWn$I>"8   `Gz-~/eK${?%h$I$I,I$I,I$I,I$I,I$I|LxACI$I':?T͏A^5P~$I{U#PTtyvիYO5 `I$I'\W^W3rz;$I3U?U!I$DgU\K$ITA$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK_:$IBĀ IDAT `I$IF e-$?+:VEYV(5dczm<LJOcI$lՋ~]+}'H?ݖN#YjΧGoo_Ea n_[Jx͌@R3f1yTkܔ$IdS-ϡ%9/9k8~ 2x蓐Ƃe/$s|Cy~uƥ .'u>"Z+j937HˮgriDO&_鼵p$G|qk tRgߑ$vMczE✖Dfl$s}1=FBN68I19)Mp9_1c8/v.A.ݑw )ݮ_7cUJrA;'x!PnhRLD,@){g1sFAbڝ/G"m{QRw-( st^LIi HVI\>;uCm0myo='b%a}k?qwRJĤܔH_*$Iqsϫ߾bJKӻao< [ֽ‹4l}BӘ`u/[hJAR^5y$CWHM.J̞?˷R򦔬Oev&O穙YDqX3i/";vUT)[Vm ws![fiϬPn{uwe0鼑߄{ofH},8øGV;y,NbρR HScҙ9n>}ό܃i@|]$ѣe4/Zd:3|*H%#PKz^Җh OZK$V>6-:FzFt P7O?`T$@.맲%oep6\{ݲDtfqB֯/So;GZGW,xZK{%7Ϊc@v?oxlH͢ JYE|q4._S&mF/@mϧO|-:?:1dS f<ʂ{NS.$T_+$IW [`.lޝn9H^|/Jˀ2>lLL? ЊˀuET,!28X>}X)E1{ȇC?xZwoC9pg6dx^߼R(J`‡oR\গ˷ +rp-.JB7HyQ^9[  ~v;÷mqڕw̯AY)֢BgPRt% @qv:3WSJ)/ǾN$I$ oI@TqF*+H2{6{^MT* ;sSWӎt&]9]+ ƒ@/d Zrġ~/ r]ZEb[KS>w 6B?<\|u"I$7/F,Mğ _cwg_Vri=d(_8i^kf(\b̟w_^|>5g{yqT& O:|AAZ@ t̊<D xkңs)CD1sR7Ҵ]kugM<;;{x/oL%? rRXǯZN&a$s  HM9빰%@/.KķO◗4ܵ_ȞC|t]e<3ޔ6ZrZbbwl%ŴkZZ{ㅸl9KBX=rwI$V?;y_3-:i=ɟk=AAFq$I `PZ ^b(BnWE >H9nܠIόlth+=u#Tq:>$It` KYӑ 7c&Nx:C˓h(ksH qŤ Z#xdW|8'`7)l:q{5JңQep -;a={ .ڝZnѓ6u;V{׏A7Adu]O)%;}~=iQݹQ.I$X?E fѾހ/p&!GGևi^8ڑBn[T$YN a[$ek}*>eyKKe]ŗoC\P0J׏QAa'7 ^?O%cL=$I$X?(N}<%4 sUZX9Ȣ3rz 蝅<8Q^M!(cǻ싇 p hM5,kر;0UXSpe(p~ :V,ӖpD7GB0KKǠf4@Q.\v[P6OBEEwƒ%^Ӱ^,!а s}188̎ \"$ ȞCH~yg4V}t:!\q_Y$I2u ySgt0'Jmb)kGAsеd5e$4mKY)ĹE_6nBv6wEmP%uߝ-Ӷ}v#]B [dȠ*";oC~$fϢÂ"„hwCb(iа Ш|VA$4*eǚWX}06KYd)Cn۝;㒉޺=(ߏoWw_{X7էo7<Ĥ(w.Y$I2=M{mnWݒYMV]D§B?@!È&X< 4LJhBeEx3iWޟ(Rn$%m,J?bnuϾN6`,S櫖ГuX2)iy}y)In莐;?E:Jnvxvà@/dg{J4 FrR~5la$DŽv R7 cpkgvܿ.˲45}{v4Do1;:@$I1T߿۷eO>bbwl%ŴkZ>|E#}O?i M?bxQ9^?G3#GDqF.ke])ItM7cl2H իW?u8y M gfM9,(Z݃uK@-i(i)Ư$I~ `Q~~=I<2?J$I `4D@~K:k.gvWw$It $I<.Oa嵗{7B$I$Xߛx00PUq{}sԖ$IEY3,I$q-.^wKnדM("s= Eyd/C/eG4g2i r/'zIq]7$<kӲqMϠP}`!a4cBq\1i@FN?m mE=ZGobr1Nd?k̅a~K nv]BVV>C6PG$I|[sO\Jxە5oW|8p]]ҢY,oh{݇=:J_^Z$Ic/^N:$Z[S*ahK(yy]AoM\{ZGG~XB@a2wXK4ߧ$Id;?-  EB: w-#{6%>ov _92-o|,'5=!o_M4#[VT(((lxnᵇ y$I$'g|D4lxږü^DD:׉ 59pҳ|:'sX="9>,("L6}1$&o/@nI$KKhR֎8 kjrˢIhږ'rI$I~ONfBgu!y 7s8<; ?Dѣе.є__Q%z5SBfI"I#`v0hy)Mfk#@ޘF8,I$IpUA3;`K$I\ezInlgK$IҏɏAIrDx;{ ;&$IdW=uHAY"I$I?2T\꣰3$IdWau'L8\`H$IqCP7|vWr3$IdWE <}oI);@nNE$I$UArd9 $It`I$I,I$I,I$I,I$I,I$I,I$I#p$I$pW$I${z_A$IdoU_9ތHD$IQ9tmj8GYg3I$I rX$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$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$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%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$$I$$I$$I$$I$$I$jTv!$I$C!X$I҉. 'hޕ$It*uO$IA2&b Onb'~ :v7b8D\\tH.[G$I$89L$?ʶgZ2nцؿ @ƿOcQ2Qޟ>%07>bO?3k@ww>Κ]חЧ^+S淓RD:B@ވ:S7Ӧ0]̾o72l\w gļ=1H$Iqod 30~z.BM{sQ[`k.Dkv!Dؼ/a> .KnF^}h݇.gf6 !S{3hOnVŤE8Ԇ8q@R}>,I@u0Ci`:\o{ٙڴ;\ ѧkvDR7<I$I2y}AQq]`{gIM"yY{fNcWm23Lg/ר]:wӨ| P&$TN86la^v4|F4?UZG4 'uݺA> !p{+yncZw/8A$I ;||{3q%64?Oբ%dD[xu&^].MI/aJ ÷@2`Da -D2V.ZɕM$I$<($ F^O,:@\b}A{i:4sKc^-t=kYS)zܺ0]6,BvAŝ%3OS`.6͵cogsܯ[ og?c$I3G#ИWuջ2xVvMv韸ry3NL2/p۝K+/hAtx+=mhPb_gQiW@m}D@rR}2R6Nwm,"h|} SZm|hgJyg^œLX8 I$Ip2츊 kĬ޴i\y߭ :*A?i:yϯDТ;׎>5\ggK~>Gmhnu]1g^) 50&w.޽ГK7e-Ee!NmE7 !<I$I:T߿۷eO>bbwdpiEvGVMfȝK(q+i3T$Iwq66Ȩ(Bի6NcDFF :Iaaw^v?ݬi#$I$ `I$I s7Gp I$Iǘ3$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdjXI$I'8?ԨY_5P:tȽ,I$jԨ-*ժUZjP:$X$ItpաzÍ^G+I$D pjժrH$I:EU??’$I$Uc$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$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X–ncx*ñ$Iw3f5LJ+8JVԠks,9~U] )\w^r6e[ϧqsIJfs_L0"mE9#ن,RȲCM~u:o}Җ>k41.ܟ$I?L>-?W:wi{(&y%hOa#k), Ra"c!G 搹aN뚎ӷ٪PN6/ŻȻch@ѣh݀om7O(ֺШ;Q$8R l8>:%Z bh7fF$%(G&Բ,HuR-(ʲXj+{B̈́K5(_R,Ŵ+s0=./ne3xmV;H|6v=԰F<>4`391L] tRgߑ$vMcz9}9Clμd8,U|l-%В> _ ;>B-|6̼?q3}Y{-DRp~}e KGÂ\ {"c^?Ň+\J1=<\{>krL~J^/$I:rsi1!nHaw0b:|=MVMU(mJQ#K<,ʋMdqn8J>y6CT-wKIpj<HecI/.4~h7z,?F'rYlj, g&e[YD-8a+<59ц ^[Q\GyD+ƜOH42mk[@atEDQ׋5N(YQ4=jy|x/gNc{9\>n8ݢ,VEU ?*Ccc~,;yyyC-z&6[~ӝ˕),Ȋ 7sȶVRkf89,J$V#TɌ?>e`E$Ry鈁Zğ-%\yJ^YJiݺ4,n;vŬmlCݖinUXdB5ɢwAQǟ?LY]oAAE<#HAskMvƋ1!wU4*jh( "u7{qIs,*DHc/q\|^܊sg R v|-\kznс•g&h8.q[IU x5 2yE$]b`cZ.;-e- ڢ?魣L;[o?`KwX" QzodBwgGDDD j h;=`u#|upFi<1TPHsc5G[ͩznkJK{q ~V.@kѶ9ܢv0ik-纵2 C '61+Aw7M'8C۶ZZ:Lyl*N,$'bDMTo&ogxm[ ;  # e`0H'Ն8C0gdrlUp`O A$ su6{~]1l" v:wN/H""""c"م+N`|x F/eKYm%wW^uo~$x %ÕGc`QkxE:77&c?_MŮ`i½ɤOQ{}'8>ߢ6ͼ{5p} @i[Ѭ3Xr}^ {8,CC_LİHt"fvJ`ǚD.#u.н1j@NoJKFBN@")WgQ!.2_{6p4A\䇿 #"""r{}̯/5Wٰ8wPz缶O9<8:` ʒGKq}zpJʚËkp1vs-J+Nd Ab\<`{i{̟QeWFW)}Ò^t]R9ޟkM[IRb笠pέ琟~s֬6fu,ܶ]?^ 9,]sӹ%3H&doq>7n2^9ϓȟOKs1.tO#{q~V^S)\Չ2v119pbY=W~GyO;?ܹ|ѫWb&P?ܶ2;B!9ˋxǔֳpCDDDD񍻩wQ a0`u(6m,ާ?\cEDDDDDσ@tU,"""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""",""""""_ TMϫDDDDDs0Uތ"""""" ((((((((]|9-HÖJ{e*`LI)ӘEP۔n9o·y,ΎMۡ]]oNydbEDDDDтO#H\}{⽾EasFsLྺ/6j*i=k_%[l)>I x/Gᖵ$cCƙ]om%zi!fC!].jEDDDD~_s =臭 Ŷ50 }n']@-}l˟F`OPoD'N`Qr͟ig(>Rܴq}spa֜\\CUIs_Ï9xmY8VS=[Wbz؂&^)U 6B/I0he}( _(kVr{ b\حLɀSoՄ;[z c]pG`rIj$s(0 ɐxW'{ȁX+@o{E"2(r;!"tecDn^c.p:x+Y%X]U];q|q Y?n-=Bu&2[،yb"\V<,b0rB⍆ |ˁx[i4hپR8>3kQ37C+c]TTPۯp8? Bpu=k`l#M v`ZmXA°<"""""}يk9k<8C>=uC=ڸ5bյ=y|b?ηabpFvuǾNБ~\ǩiASyiw8OcӍ7|g+L܉1XԊ粣[ 5c9 tqGea3P[徹ضfFt vu-dz.|n#χ~Hϥ,a4e%L[AS+ieT鷆58s0"oSyR;mU{WaH2I1NG𒟳ï/eJMu+""""ͭMOYҦ1a@ ۰`Gbo9e x3@YD4s{xo\xft-h|n#?ϛ8v<1>:ؖ=cB$[*8_S_tEk;L Uc BP[Dn+`q,|O a8I]yc£1 _o?DōeO1|m|3DFē>qq]CGeY~;6=%&,+`Ch|3Ν=-z*i n.#ym+#"+"""""7WDY,__m\,?R_|pHd7n߾K`7(~EnP.-ZZ~?\{RSወ|ܗ Kw&.0#,c0̴8;vJqX ?^# D&,evC 3K,sU;닋ќLscae?gws(ZE;|Q!Ң\"Jď2J_/j%*BW,wF !bs0i%ܽ1}<غ$۰r51/1rJ8F7$e.`qNR)\!,8GMdv~.)Clsl dީ 0cI^b:ZؼU5v4ӟ\”|\I_dN Jdvy'<>;ydz?go˝`ߦb623Hڇ&TBKl.7ѴҪP/Z9κ[Va7$p-vH}~=ofuaK8z˶9n- GD/^s }vƫ'/77,,n千~ %߷U6_V1{H#;OcaJ>祵S1neI~=,.륫Y<}kwQ`@#LqJX\vNv7dzx\7sQIOly-j%"9HddX|ϡ|QIDAT.`^d.N Ô4jiQp5q%˶oZgCeT4H^佭-ç2`=̇&@VO&bV}i<n5e:27AG#Un2035ABL,$qN}DXpf`GRJ"&g0a ![-vKRGs1|c~)5 [YWIdF>%kDoL ;pĐ4#hػ|Kwiیo#aŤµxi:Cm.(K{IENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/openapi-webhooks/000077500000000000000000000000001461403617600234665ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/openapi-webhooks/image01.png000066400000000000000000002516151461403617600254310ustar00rootroot00000000000000PNG  IHDR!sBIT|dtEXtSoftwareShutterc IDATxw|TU$L2 FITXˮbY=g\(*E^Co "3L |߯/;w=Nr{Ztpp8\8NDDDDDDDZ;OOOF<==ٱ}5^ѣԆV͉He00}ؾm-6]QP-ۋԔ{(n{\ZZZ3k2jDDDDDDDXf_fy3hc=29Mn7Ayy9Z8..WyY5'J .LRRbUň=rHH¯H+g6 UEԢQѨiF#~~~`///f%f.Z45D __}wEDDDDFOՒH`&`DW"""""5n_C """"'m5ZoyGx7(ZsSYan}EDDDDD)\=j~kWS4il|=.--`!88YjimlzsTbcǿ}&}8vNͩS[G6 82#V /f#5ur:̞9nqoUe)Slr}ywB0P~or?\QQAZZ bKU ,,l\.lt=IL* I<|?O/|`aۛ󾤼ƍ7tX䓏sȫ0LTTTG| *ח&?ؤwyL|/=/ٗÇi^Wp\gчɧ^W\s=쓮[iDDDD䴄`) G>kj&$$^/.p w΍RctCRSwk5srOi5///a5GDDT<<<ԩ#nO>MHFFI}~My= Сaaag|=̟6lQۇkޠJN3T`@ii yy5 g0 [y &<fџcZٴy yM0JJJX[y}W\qw5N:R\le/>sD{"׿@区idH"aa|\GDһWZCxueee\.L&ICvjN(1DDDMPP]Wc {-[[O7tS Ϝ5瞦KmcֹqmKOouL^^C/N'_oFYڨQ#o5_DDDD/ wy !W_?QE{}j|JpyyYտn7DFv 00{}8]=ѧOoV\Vg^ [4p}櫯'Wa۶n7xX,, 7n⦛n8! 澾DEu;&Zzn3Lx{{WlZz =$ ?yʹnzN'%//K1lPo=yzz2޻;w>oNUh:&{oü_}~;.ė_YvG~̙{ZzOsxZ)NxUL?x!!a~\.<<~o –-[3YmϵnxR/^W_3O?֯+XtwMOOO3ECZbo'??sU}ե1m6lb4%%xa%45;z7TG{OU[׎ץ~+Ow==:{w[ 2{t+_e/p̪u+g~ 0(ٟooo}! ''O qmL<2J'Wg~lmr͘5pii);wjr32q<}9,_+Lp+lٲ| 7n" 8յwh:]0wn׽{2фSPPXzAdffQr=mٔGR~{5j$VUA!˙<l6QqGn/y kפ &-mNﺓ a yQA##4x .>Vw]Ɔl6N'&o>r戏c-7fZrkp8X7ltjL&ov z멤~9n??m4fΧ'bY~=FN:1k`kx54t(^BBBZNÔ)>X@e1_~)?K w``ܸ `׮jC·}BaQnobRSw7)gggs}r}<ۛyY3 YQV՝IDDDDD$bb'<C uyFD+g6yOzcd6gϪ_""""")MFt}T lɇ,-oذx<8|8nFYzu֑3(slf[r'..G^Ihh(K1;w1 Uci-Nh9Nhʣޅ!wXDDDDqhR a`NDDDDX'"m;"H`0iiD"m ၟ*BDDDD兯Y#r0xyi(lj'~fD !ͺ%""""g7FOOO|||5Dyy9NÁRňکDΖ/  f``6D3^n7v{ÁrvU9""""gG'Q>oIi ee """"g9tRQQAYY___f&{<4zb4zb0hk+É 7 C `0(+/jcmDDDDMii)su8~f.^a Nf˫?oo/0@IiFOO`9}JKKZra).v`0`2b6PC ˫^",,RmŠpg-PV9ZϿMGE??36;YYY0j$Kll:uCdR.YFqqfYYYKgۊuhUVVժ/4@ v8f' qna[ Y3g3klb2h׮KFZv;Ei`T]N>>UK|\\+%܂!8(0r 6r_Gk܀آ9 }}17ҶŸ`r*.X8 >. l6v0ffo7ii٩K/n7˗FEEn,C$=l޴3>'W^kg6yg "6>"8I]_r#nKB |#կ3 Wzۗ$n}yD%9v (/#*~J)i%ur:4SO>rIrRVV?Iˆ7i}ُچ<'''p"dRFEBBByoڻ n!EDv@Ii m~>~cbiԏG1b83>o*tcg2bp1Fެ2 6=={fÏpq0,EXK`),aL~zoo[a"DrM^1{o@bz_HL=/$&0yNBZQ CK抉_h#`"34cDN5׌f̘QFiii3`[},\G<ΣSgEZ׍c[Ίexg]@ǷgknM6~G&~[˟gMy5e+B >l~G͙Gڞ=kW^?:e7g\}Xx [qc)//'5eWGyћw^3돞OOI$i2}c 9}/"#бgM`#.`/Ȯ:I2O2j)ֻo7.׹QJṿCOqJ9e ?NUas]S,Ѧ,֞.po0 qg fZGQ+k+~:iW EP9H5d:N~;k/&DqqU{WJ}=]NvZ`ztOX9]n2КJJJjŞq0sf&Ś6]ftmٻw/_z/;wjϨ`|tRK \vUdgeVߧyy¢B>|]ڱ|};林ˢFe:na/ׇ;c WIN&oaٺj_6G6q9Zlm`j_zɀLϟEkQ`:r-)2q$Wv=~7e{$V]kjc׬");9b' |2*)5o)k:V4#䧝Ec;9͆ LFF 2;<] CUGѣyEune$ z3S}is3ϖ`<}oٳ3,OeOu׏% ~~O OWL 6b+`ÊǾ͛asۘx|XBNto>F=JI>t[.¼i.37I+u|K$#Lc4$s,YS=iy7FMΆ+{5r)ϣZ1p~BūW|ly$^ЙP/()_.gDd˹͚څsr5Z#r⟹nAxoQ e=@UP3hv}6P٣|#1{do9$1kێG2!!PV]}oJ߿?#RDÚ/zKΩ1b8}B 40j+g]`$檻V|k-sA & 4שּׁWSg`_   ">2v 'L[ߨDl/6Ab8}=RodofudNAyxd'_ldշP;7>j~iDڤ}ӜҀsՍ#11>+0T>"sFF+Z{zzbW&[z"o:%)i( ,jrz K",,___Ko5ϣn,ﻗ#{onKط/_yWx׎ѹs':t~sSysdm!jFW>Vn$LL`J>[R5Խ$k `Lߋ3*Kzsy 5ņ|zZ#N 첀g&Wz!@SuuaumLdΘ2͎^Pb=̄GE♱oR,xEc`XE2~p)ogsaVR*cC#oMR0|~jƍ;qn<##~ܼ=<{llݳ>O}&yR0?23y0pۭ?rϯoɿ>·~̚&%ewe7M7s٥箻'U )>~m%f__^{eu )GmfΜ3+;rrr]oSYӵrҧ]ߓfa5z!_Þ;:,epЁ]'?: |8+nM!ѷ0Eq':d>xj=o 'b,բsNE\@x IDATNn݆x;^cuD΄qq( !: Tz?3~(ֳ()p-H)gi +!oXr^t~17Kmؗk$$tYŢG/ۏ׌t2 .; $;0*`sf%zYm{u'=4$2*R20Fv&™L/qwۙ{.#ʘ>We姬&He 0^ cwC)J/2Fo#륮iGv+c.#ps~M<ꬷZϣt~lR*خ_=ݑmsNþ 0~|O]zr5j#j6~2f6َڤ}Cn^O<QQQ|B,\XcW^<ϼfhƌMFFeeWu,wXwʤ{&>yCa]տOQJG߿V`֭b)IIC;w2}g5/L<>3Xt9;F㏲| F#C̚TZW呚IejL2HgowzTlwuqZùia^l72 i%/6FI)@sqD ؞V3><{zSj=왬Һ$`ٓ dW\Iw%#ь=?V/</1E~Xuyѷl.yYUyOcSꥡ喌=8:uepR ߥUޓ]G-Vg[&i]*Apqǖw5{IGj~-QFDd}'2$ٳ5ƍN*zxx}pСzgΜŬ:t(ޛƸ?#)) hB3q2G6s*٪&=z߲ޫ<~٬r$ԘUQ2OQҚjؔ+`LW^{ժj j -9 *>> ;hڷo߼k/]OpP  [||CO: /`gOL "UKiͶ}K#HHwYpmpBJȫlf|Lr*tlH~xHL,r [4~yi=!B9uL^qdyNN]9X\!Du.)nlghؿ/A˿3M \Vy e2SMјYNF^8ѽC`HjB;FN^AmP4h+.50ZXGԫ:mľ2J()3Pv:N$s 0i258h._nؘϮMo"u(++%//Ҳ2∏`y\w]s~lRL#F kF3b8VA\w-|{{-㰕n:.`+}~wmlߚqDB  tzIb %>1?2+M-\26i d^9i="m&g%)l՗k.uؠ}8&jSpEcu+ $~`-;X `%c济F,!H"Fl8%X~Ys8SDf||:@~ᱡ'` e7ҷA'+*(>R!c¸R0gMa[FC1Gs޹0wl罍؈zwy|< ql٢k޿Ni>k3aYE1|sPv>7=Wݿ?;suO=8&>P>6ɯ}H4i(`w0D3ܹImhlr%KzwVظX,^JX˄WK,=%t8Yv^^^XV֬Y[oG}͛pI$ IX3f|;o'??;vһw/r֭J֬YɊ5Xx{{UTm巜QB~O>#Ё󱕗h:3Vf<V~: ׷Oox~6n_T=]Xr3}W_gWJJuaa*Ͽܹ51\***4to 27zt/UN~}2=##II͔Ga̘U46sI^';/hUe]v-6QVc)Kc踇={?*Bu׏%qH"1]bZٳg7oay-nLii(oټ]?h0ƟTNb֭^r=r N‰H~JJOmi#|}aߡoބ5i>>6n2b MJ"..1GU~X̙[~233 dmRVVƲԷkFIi)-3ᩜ[Vwim}*{3Nɍ3͔5!r/]򥋑6&<|UV_QY _Ñg+K-#iu~[xxx`67?t\]<=<(/+#88"&{ }}ҏ5*..fҽQ\ܺAv aaaX,l?M ?ugSZZb8E@^aP!"  <69ZuN;E j?թT.Axy{2;N|L&,l6?JIImᷭ0LbheVnJJ)9ͳmHP5qV[p8 77* Ək7Y3g1sl a)`l3+!Ŕ"DDDD^>}p8|SXX9_~@@IÆ4ȎU))dfbɒ3H+`(//oR>Ôa -"""" t|!Jٞ+'m {Ψfl|}}j-nsDDDD鉿m߆ ZZJX0pW`:'nz ohj|&44r[9e8CDDDle411鉭n7x7 :vp8q8nl.c˫m7j3n ݎQҕ03'FOO<<10y{]`7ppiH)3gW|46@DDDDDDEDDDDDDEDDDDDDcDDDDDDgpnU߫!""""""rVP``````9;o}!XXDDDDDDΈ[ """"""rƅ^7nLDDDDDDrUEDDDDDDXDDDDDDDXDDDDDD 1 DDDDDDٴiSݻ7`9K(((((((((((((((( @ښ [vk>efSTlvam0 cdΣo ͙ߐ֝Xspj`@p"'zE^SDDDDZ9L" .[CՔ)80K/xRAxs7,MEψ iEDDD䔲X,lڴݻ~\[ZmɨI^ԩ;V;StЊH X~[[X㒳>;ߧNՁ+""""jhzްeGlCotHIUuٚ8r0:*%3u-sBjd;`wڸw$a{(8/gsw?8Ah=QKVR>۬71stVoOќ獧GH,^RX]op:o8WA|P4v%lJ9:S#_|]UHk`i6lQW$]{9,3EDHbkc>\˥##cR8'c@d=ߚBKq39a«rgχёK*s8yaA+ ea&}уaEVB0AȰZv5+.|~4\|sO1ȷq^A+*?^`iUN[p;yfoGK>4nx;NkϸC=Na{x{ڞspa`F\1ؠm?Y8:߳kNb΄.#6;`f HoFgnz7MB| $rqe8uZ g宭85>#a1 r77ڣ#=={;O#Tuư$b0sYao7{~7h_|!6~uo{8@^rS…,LYH#~AqD{CY^h߅=1Tcjoೝu|06a0o'y*jzKRxGܩ{yY:˘a{0ϖCC r2)p*P:N:N:7!D99*(Hx{d6ܙ֝5D7Pӓ vb۞O0)b9oYV!93IM|`z{$VQӿ`uI7<g1oӬ})dZOKyqxOx>(uJXy;/c |nQ>&Yy_F0kj:1&|<2Pa{6ܖ?tplqRBVw$ V;x%r~? ^)H[DUu`_ߓ1:׉jZʁ<S8Y([/\Z#n>Nt_ŒM˛ɫY_ 9XZފim_Ǯt@ODt-!aIDW]psxkCK9[cx/c~¨."#oŇw0O""""rhU=C`]6m(oH7o2M_杜L2}%n塄0Z>{Y[,=@> R1ѡͫz'*.ޞ=&||Rg>a-92HOबr&'$XeX:{p>^c|! K@="OuD. &-A(Of[F2*[]r۹=pdϢ~`6Vx?qq!i']>-+"""" 1'S3 Xtʿeqmq5yU_ XykW,Df9/GЫLzuu0^W0zLHjcdDp6΄$9t ʲ_%=\E1ГL2* /dqN{39ikܵ?Fv,am4}|FsyK$X]o'%l-LI C_K|PGb"Y;' ^? VrKrq> _z29v8>ַxw, vpW atǝGVAzݏcEDDDD2VmEjar?Q0p(v,_Y}/S\=?:v"{IW\NR ;{v1iG~"uZ.eeQWWEy\G cn#eO+d`sf/.4 ")0GIΆu1~tŸb;=/_#D= IDATVpP(d4B^̈́f/i+3HޞO€hK $g6\Ķ®%^pbIB;4y"R-c*|LrDgO(//<B}綁2寧0z0ehK#{K8(,/Xp&qgDrtC\!M a1:x'Qs{'j,`'o[;a$lä&}j|хӠ#p).$I$ǫNqE v-T2gOxfNZUMLU܇&NoӅ d2,}/jֆxRR y_Zy/M˘_?_^ w}_8i-6|OW)ú9ć|S#?/O-=~rId*?)ycHa%Id81y 5f4OMe ˟cQ!2RƢW3Ͳ\~zeqQv?Һ$$%俶 4?}vC-L,XXl!\3v{wCykXdi QHdtzqeCx?:߿I$ S{oFH ˎܹWϏ|tIi xҾ?8cC?vp%I$%\ֽt^y%Y:L Ǝ3OE ^)g{~qt&}XF)tҁN]zXQд5ӅCك-t_ڃùG^/˂mͷw Rc?ڝÿ--nf7&5k6i߱W$IQ*xy4aS.)bړO2$5 %MZS/6A %,ږ/epf g< MMntF^ʫKOtUe9[g ,0{$c}n}a`0?޸-omtQ[[ݣ111?7nާ|}>m ݵήЛ:ZjZbi׶ ݒ.o/|%Id>Տ0iYe~`0g3Os9ϼY.)̞RƴjiMVmxvI}s)\ aS{q&9/[X'<17a)~$I$?v̙~k:йc2ھA^yd.籧^B#u dz>%-Ǩ w.}JݠO\-$uL!O?fdt $Id>)e~K=ɢ}&S~C&g5 U3|NgtRL5iKg-lڼe,}hٙ?$ξm~s5+vfbO$I$Ǣ)lhɺ p8 n߃{uǕo. w ,z}=73u.^"WMY$IP|܊={~K]+(Pќ7!L΄35{]ˀ){=WKKn 3YL>e?>۴j͂}ZH;JANvf_ۼEY$IgP p2wmU1qW9'qxnŹK97nf??sF}|sɯle,g*fݿ'27EM6$9@p!sn gZ~݁N?ZIBڂMBի)ti?$I RcZw:"S{ L67Gȝ{?tdZh?olT5o%[ާ08fۓ2OfU/dBR'Y])TJdw]Hqt u*@$I#᤾؄\㻙Lڥw10綑=]2kG4W2ce}woUyQj՗';r uÎzUw$IJܙvA~ȼ>,\([A8Od^8IF3K;Y;w n.#'KO23>6ITQ70oW$7wPPe]+n0!]z~ a$GH .AitBZt^x Xwٞ8:0 .^$LMAK$I:KZ $IСClذ4hpu$I$ $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I${wݵyDxOE5']$Itto%%4_Փ1q']$IdVZɦN |)v3mA6U@lcffpѪ^Cۏa)GZ/~=m7d t;c?C5xs%w_Up̋^<w}*:4΍5ygX5rưggԝgыSMG%I$ aVK=㡼Umzz<m:&U^Z?6ؖ Ю9 8RZ^/>BR[ 6]8'VIxTObP(rCg¾#uC|۴M,.:žxF-=cSR[)|} y'yx9N;8nĻQ$I>F|w+y vp$>1Ii `bbi`U j]|~Ss5TP KımTGBsl0@:TG{tC?˕ށ{GtMeMceOUåBzy'J$IҙvVs muuݘ\Rv%ԵRi|.RH 緉CXc*K>lzЖ}L1 ,aT.VE8I]Q,gtPUc/& TpBp$žH,zI$Iҧ]; P4;GcQu]}0/lUU STs֖[6q{_wyoc#o*Z׋ym9IT_xwrJ r~R,D༞ [l/ 9/%yI$Iҧm9҅- 2=?X]Jv^-] ky;pՔU31'83ebɉ pu~F!R:{YxE9׬mh5Ȏ5;h_5᧗&цq5,^%4gc=xyxphh/nJ2{$I$S[[[{Zl;\|s]mK %󗑉'GgG$I$}: NzA,g6qN^%I$I\)T׻%I$8}@K$IԌ]%I$Iz`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$IgV]'uCn%'at~v5 'nr>[}?9__p\Ci%I$ p>M{3@<{f Ɩ$I𛛛 E]īJZZs ɴgfP[(.c5&:l_MS29ɝɽo:3^.kz Jhk>7#Iu<$I86޽{ϸ^~o [`gp}/1&sōS8<0yf`1,+G癭u4b 3N& Oo K~p%޼aؗ7WgӋ?: YqO2ºm0dAG}I$ 999l۶|f0kaFCi_phv:\loaH ?w6G݃.2&ݲR5MjttOf۹i%of=>e wU+|LHj :Nnl&[%I3>?wH cr.Q3{qz. gÃ2G8>C@/kޚOINw­̞uGԅߺڥ7t0̒$I>t-..>.6P7&؉i\ήR{7UjRt%jh9EӮd{ҝ@ɕ%$oąw2y<QDjvAZv%I$}y[H$5s8\$7͹P3@'9 `csC'OڜzH DR gY̸IPʓ,NL*rzw`"ze%I$%1V$I$58t6l8} -$I$}4 $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I$$I$I`I$I $I$}>ֺ$I$!eLI$Iҙ.В$IBܧq&J$IZ&O|~jjj.I$Ij=7&&c D8z(HH$BMMͱ%I$Io%#4y\p#pƒ5nGRF$I֢M:Ud!  ᷶GRxkk2bI$IVh-u?\ Kmmi?"цkI$IjebhÝ{/20zoZ.K$IԚ]-u9Lp%ц"Y$IZ"[5)V$ItV~/FUCQD: q1t SK$It%mN{.I$u`•f132+ xB3񃃾$IY&F㊮1M!wka5l{YgLǨk//߭ pi^YF)c.#'}W-d; HzeM经Br4oo;e-z};̿)Ulx7{4yf1+4gn_6I$ /sM xQKjxF|6ۺ[kh #lŧw/KgҘ33>ήÐ.͕BV1]І@b5.Ė9Կ~K,$*$̖^dc$o_iR@Q9MaʷnIm>$ַV񱛹~ ٬71sZ}؊TP)I.auTa;B{q#?s+_3gG\~isD7?Ί/bLB>R57?hJxP5W<>*%,{tyEy%zn)%CJ JםO|`?t`O3Xs78I֠gX*}[άIrϲ GyDb3mVz.HjNKWo/_',T] 'X_Q=N|W~b&ya0m kr -3y8#>_?pII%y=s-uu,|\[u6}H.Ǒ$Iҙ{`"ǒp0k6(sji p蝚V_}E?O~8A2pӮSVeEX[H?3&/ `v4?ƑLrqc]Gyr6SG|3q pBnenj?_Ca7kGT TTa\:߿^D PAUTDʝ.`I-nKfĴ /|Lg6\\pBT-V6X$A%qz:$IRs>4ykrՋ{J 7,;õjhBTKcc%ЦE:XBryzaj-މy||;/kxa:vl^/~HDPN=>'CO8$Yz~f-#:u'&O XW`מjzDxΫY:Q@uY>Os^vI$9 ;)H$Skφ g:UE OI1&u%99⒈KLnhӺ;({q ku gWN0{q3~H!//ʧ<dY s,q`~W^] us.guY}.]+'g2@EK_aKMU@j&$Wcu+>yqp%TD26oڨtsEuLj܃uwvY "Ͻ8$Ij!`x}MY~\%mcZB1Cxhe5H:? ֦jkP/>0~ M/f˂c}ÎWsJ)=虚BbU[ +D.Y|sb&k-`Dz{fUR!*8\}*?s-繿Ts8F=q97͟/p;R|w <=׭#C2|3̹;̷u4HI29CSke˧w9mO^%NbT*@c90@RN{_M=q3< D9tS[8$Ij!%xߋϊ S[[[qj***lm"ύ<ǯ=JaFo7{%X԰/T]j-ǝRLضm>/;>2Hg-Hʣ3'!!.nN$It 9I$Ij=/N;+I$I:+|b8&&X$I$rGkiV bbbdu]5-$IԊu9!NK [=vvDl $IVh-/0YE  6uD&j6 ..5sa~ ߎP$I֢M:υhK\\\ifn  (w D][kk$I$nC@ c][Okjj5J$IR+ 7n~%66+I$I4GZYY$IAU I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I\UP¼LeG}e&8]/gHa/񥶶J$IR "4o{tC6yQw}Uےu̹,*1aճY09wT$IԢO t = n8<$RPXdSaA!ھ6v ++I$I:]01_c" 6{B 7*fAy_aQcxNGVLI$Ii27P RDAal Iy 6=NaaQTHfo$I$>I:f6m`n\X΁ r_+ ʛLڐKvű}ffҩI.a?R^!;@.dfdҤ h^,4P|:$s8NNZ|;ysVBzUL< x Kt?* &t O?GgҘ :Z>ݾ Y|y(_A8O.=;(&w)1嬸GX}ˇxPXp%k7E H>\4fW l,$I$~uAᰄº$3,JSMmpqF}h,`{;9(j+}#nwLVjx?3릹,Ql)៍oKI/]]z+oGMЏ]75{2 >=[`cOUy)57x &4sc6%&0LRaq=:~~]xypLzi.a}+֧frHKbwmb@}yer&m Qϙ}&f uZlȺ}Ã7oMx<%I$\7x"uwN(,<l22Ե.i7PM!HMk5>^{E p~p8&$so3{C5X2e63;{Әv]_Ǒzܞzp3Km4h&˯ [flv9.|{Ufخ0Lo! BlYf5[XtlVoe2PbLu2&=0i4>LVQuf$K3hdN^֦-I$47Vn6f}{wk%_\5ڵ:EǺ=ucmlc/l9錽uZ.od9wݽK@.;:ٸDm}r9k74s23n2DI$I:m}*-MW1lquotX]ps uVkWXe',;qTi}ҏۖ=$ udݛ1t2: #a %}w9{nAZ*Pmt¤SqM|זګgTyضUY\ a>BfFr _V alVTu\n^Il?2g1bp6J$I:~Z'p[m 2[?S;ݸ"BR#'rZLh!%iӸ'U-uM"[S5MB}r%Ү߸=RMV7_BϦc$sm0}T:IѳQ+(~3O\P%I$i8[(Oa}kgRF?V~ HXBi%QXPFa:MMܶQAvح{)H WVͶ9Ly|a A먪l)̓Z8j{ sOtSkOKu=͜ײ1ٗ 錽m6c p ԅ.̻*I$IO8p ^R?3s< J -"7۱qiM[S;X]mL[y큦]v9FƇi3JQe [wm%c=HR!:0vL3Ǥo;O_y,cʜ|E*Z,Vx)z]p/jt+1{4=guK_~!j {}0+~fk RĊ Xޤ GDMM}2\ҰY8 ˙0c^ݬڧ3!6WW$Itڊ4O1e*.IPC(L[ixZ3ܻfdv%]X1WՇpӱ-̾~]9 ! =] t :}'\%/_Rٷ̤ʑdv kyqFQP'3yΫ ŋ`Bv96 'dpC80eR&.ˢQ19 ԕ'pp<9}@5flay(I$I27\/' GF` M^=ac9]璻؝&K~C&t^4svʞF%4~=w#o/w3fe%aYMBl߫`x0lZ6M˚Wn:|+{\qR/e y?Wrɬt1G22 YY>>9U%I$[T?xMiol&X V,\Ҽ<@(OR2+GdɞjB92f\փ/3o0ʬ31ٿ$wrV@Ծ#i\t8֣PL΍X4<% LSt.΄ # H[VR x91"f3/{9ϼK(_AxIIݛ_cҘL:@I$I:}Z $IС5o6lp 44'$I$d$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I/8immm%I$IGLLL ' ?555~$I$Cll[KpC؍D"=zH$B$$I7XU>, ߧB!q[4tTzy3uCÙuDXnz"N '5ʇ>73[l=̜o79Q_NFev^ەN?StP^^t_kAH^'N&gsldO d)KI̷$_d}X+ eNxF?ZgF\,b/:a1p,ث":H '04} nr !yǿ7_v~͚mtin"OkΜ&RУ+Q3wp p<ȝ$W1O$4Tǹs`XN|JLV%ϝ|rZl5CX̸j3Ƥb CcCOP9zP{j D뜟){y&2BmװgX~ç 7jaUd[қ⁞6z#~/ (t[<0n=,z%&; _/PNd(94\MłĀ;3Bѷ< {*{8{9纍9fο Q'+7Sb8F= L26O(㭏c =^&5KX§E2ŪHϼHJ/Jzt)=iCu"G=y { uy)5B!hE츧U6~A#ײT] T܀+=:d' k`QMnfU~o"[_⤃g8*tT)tpb}C;Q _O%?Ci)KR/!>V-|9[+@F513$ Vyr(wxlŤO_&#u鎽ȱ}yxQ03avG6Sn>F̘`S顆2?C3A|>fƿ[0*I@BLNw? i௫%P< x͎rJVPy5ڧâWiD^UJژZ̅R[ ûӾ ,|')τ!a!ջBп6#K:P2~bϖ`jn`ߕWK\B\1Ob s#ܱ'ݽ e: p ,`J?,ӎ^4̼rO$& @YOڛ.?(oeĸ UjҗƑtՕ;X97k L}>)SI]e-JH&Mºf&Kjy7Ȭs3VV/e*wNbLsoEM$;L?V`z)/_!!|3wv{@8ދv W]4쬫//:9]ף?:Ef绨UG2aEk)-0B곘rۊ)\PۚMna~W"f0_2s0ݬ-:pFoD(2T@/vcAaL81g+{Ui0hВc{({8rN !Ī|cʹ9:,¦=_:B!)pg4Ň~A)Y'3}8{{NjqeHj7u4ЎDX}|3?r𺆒EB EZjiw.6(P<35;²RVWb'ssٙ[=fxK7W@Ymǿd 2J}g@>b?jl>+ |O]&P !2=\ yq9qd!n—;8㥮zCmz{#6Y ~AmzguMaD'0K/R쨤C tsi1`Wo(J[@{4rO*f3v`{J2ә3<,|&[+'!篾-;z{X|@hvXs`h_%ߵۭXt]%rWRcFfPx;c~4q9b1fK:?F ر[Vӆֵo+gV}uCFwU.?:ӄNxAәf?^AusWe٬I4ļ€s%2~OTRDJ"է8b&!"c9R㈡=X;#2>xadażZ=ZN^ϝ^oC;|/2ۤn=N'+j׫t7l*xu:nW[/(Z; ]h*9es9R> !෬KߋqL!Xl$k6W:vp}gJY'e_g٣3ڃ(5'xc$_sl W\#pzЎ3jww8-K qw9l-aޟp%vh#1Á|90赘 >۰ljj/b \>UxxZUA (jjgW]Y9;6gSf3 mJ Y̩a3ϫwesߺ/bOtJ6!X9˭`@W>wa=<\MˣGX7'Kfٜ/vc>`wg UΥ o/p#<hFXٵ]7uSF߮d~\No?6-[3Wmm擽N!cq咯y[ɮr] SOR!B ~s6H71bL މ8\}U%;y:T2% ?tbM7s9E͉*2{yx1%n#YBYd{xP]eŎ>S1 ŘLJ"{ ƻ*9Kеmev {|Kmhp >7VQz ^_])KSUUL <ˆۦ}!~Sij]"=u&cX夓/zWO$f׭t> o=f/`*jڣ IZugP>y&=z #`j!MT2=Jsx4YD/eϱM/#_!(+MA{>f^~ 7f'SB}#f8立Jp ~A*8o7BTpQ{¼?lKq$mj1)HUPc #oZKf'ÞI"֧Tx` eef+v7_B"жӴK):rÆUFO~S ˱h4j.~UP}$$|JLmibm>' {#2!F=w91ӉW ,,tNNl[|koމ,ے~ޛȴ{. .&PC.^`&,pL(ƽŸ3b`{g3 M"ax#>/8I$lV_imaKl:.}tqmi]}-,|70Ozf1ӆڞob|h}6a_{V q"P%Ш0+~WÖ?dpɪj3Ƥ^Sq<5ؠhK1Y(=ut3G%\2!}g8T֎<8n$]Td&){\w=lVzmmu̴]( &e|,;}oYf+3H:mSt ѯpADӥ'||4 Ѿ<ƌ?g7Wn~tVھ+*m rQHMѯB`_};O¤ӾC#5<m¿beE}%nPv +5ːW^d+صՖ{JIDz@:g|O^C ?f1n~2C{i1gItӨ8YU+2$r$Gf{>m tq6Ntrd~&+^TO^6XuV>23!_<<"v"zW>+)\ÊyEIZw崱!69nު2t}Ow!9B^_~k3k^> QVO|Ϧٸˈ#AIL5tmCڢPE?>OsV6R sCU5a .]b,Άzȸ$7v;gm?#&&1ciS'bHj2ހm `Nf٤P$Hϧ8Gqj0k#տkvݘk~+jQz&H3K6l}>%f;Jm0'Cuq$z ޙl%rfԅf})KXS4]zrq$j5.ꭥT+4MRbZ8KY%J(FMJ$ZEKce0#귑v$oe BޚKB* l9`)ؿL`\o姙@}H!&C'YPA{( S5KIY{CC` hb}r0zϦe}[L(%陔 o &?['H=i=w>cZ*OBf3 tk:|'&ptȈR>YAM}1|}#$"科4Š1`ѻʻ#S&Sxx8/GC̤%j 6xbkHsg0 '2IV Xj/M#;ȘekY IDAT}s}Kҩan؎=egjn Җe]?^<3klM}h>?{.Ch~%[˜e ZРs6p^"a|')fBǩhطxF1ttjpi]Y6ؓB6F?%O=-&;L\}[p}:" GAw8x^$WuF(}ٗY|R.eP%W|>3XNC~N%3f-z6r|_=;e_}~pcỤAeek0S}m1|8QL+XP7R&Nïb3O/\IfuŔ e\Ryk s?2|]uu#}X_7?( ?b}}(eBWW.Oyl70} .T,: wơ> <ޓIK^Nګ+1Ի(gG|k1/%Roe߮oo {u:Vb_]FahzSX[&I2zNCu R 6sY=V!ܿLa @Eq<цi+I;T(˭u<8k TLs< 7}Io]>Qw?39ر}Tm*-r?k( ӭh)mTۤw C rW VN=5,D s<\֌E-[L˦Z:ZW~)WHPn ܮߝkco+>w}` ңwoP\vf($\plP9Cle;|Amj.V>y=hvo+wI [N $9?pHY 3 3XO5c(RcVb0x|<~ok6[O2T˼olƗ?ƴ#sFvTxWZ[1ӗa%0o{|T}70_@B}n JNjWQE?L2>)jT.9΋ع̉ס=OgtjT]vb͜On=9ևުIw;%5l(}z*)W8CPzpUA8D&q$ER}%fH;BDQq{Ď u*s{D3t2)K;Vo䘩y CѶr{%%gck2A_j-to}j6,tSA9i.+gF}[5bԀ MGdwv 1<ǥ9k]sG(#NF @RGl+m3}C R&tRvP @x#|0^3>:s[îC!δFdHJvd7rob VNn\p3B߻PE C (?Gߺde@|j 8ՃCP`)sBA2N?a!}cd\Avc"\FR3 ''v뤘swSǀoɃ ah=Thz#ljֶvц]SNQkUZgk0x1Ctaq~n߃ P&sC]3Njzr#&ʧ:8'6XA Y{\={ws(6;YhT cP}u %6T _4L*L&-`1}ϒ r\C.GZ(gv͕fnŘPw'AUXպ%sE+Glb *hlC{u+C^9ڻ֩@Ext??Fs xg0=7wRW_kmV6ĖcW}(l?[#L _8ywaٕ-1z3`4 #y00bjOg)cZ+͕.R:_h•[yPG(9C`:􏢻7q*z \-?x 5`p_)˵\:k}lF;8Z^ɒtQ@E{0F!PN9{hqxLyǦbhx bƗ"C-b^}6buǂۚ^ z<`'NtTRVnd|ʾcp KW0(w1BߧGV/RެC`镯Ke vB?+A;%s^:HѹKei*4PXiZ|uTb:Gw o|}TX9a% 519|5hT::kh֌wϧE0"!9eꞄ L}RŸr绫QZEң}9LztAv?`uqCл:zܐAa->)(^npX@*㇤^40ӕZ͔_*<ҜWkX~ξ :t`7k`t]=PpP>f |ZP<v6/A~(;Q}|Sl҇ѧ 79psO eAbvtjЄ{|U݇o[vT?9ۦB_:<rh{}?Z/V/APzǜm9:+ً汦^z+9W'2.Vcs Z Guܦ&{O\])$TyJagnֿ{2)%('ŌalD0w~hs6|3߸g#/z ASio*E+j?J>u#ۋaރ8nw4r-\͗IOfYl)v`_VSg3)H np?ڰFUm)DkY@3|B`{@@ #V4r+9ʨ$罇kME  e7$O:o!)W-Zl%vꖎh\Z?X)D7Y{i &|j/L{MPAaDg fmssS k$6hu1MM^¢0T&c2) ߄& {l鯦Q8pffrR*_Q) ٸp-qo'REy~eWRwp+M z=pjh|9R\8\}nH?K#vڛ 8^ٵ=ne[jVJZoV(#gظݾC~LշN4]r{JP@ޮ&K(z1dPXW ޖr.a|K^psN9+f~j|Bk\ 'hCBA %t/T LjnɪbWy5Y0ՙY37Cy񂎘 KXUh{F$=e_h`77XUd([8nPyhFus(iU'NڪIhU[/ĘwRPw]{(GF>xdxC-6_ޡt+-b׾bC*Ph"wF:_8^NYkF]hpZT*;~YʢBEm^]K]S[TIӋgq J[^C|E5[@?uf^sz#[>9}5,\z町`R{u R$F7m , &UzOr G @S) _Jo ԘtdkLG(;Zdz]n9 ZOi-wVM aPzr|f_>O ;+Bc'#,h_hv\\A()*oobPw %zT"SLcO1[,^k.WWJ0)`Ct>tUqB_shy⍛9֍nj -X7qk73ykwbNv\ )'\ob~Ɖ: ~DtJ <3c~`q$gv'w=jS|we5*et}PY^}|f!o7|gA٧7qSMyTէd:,9e"3R)`)СrNxH=6V˰\MYuus :g_̡r)7Pb${ѫL V_7(u6hR*DػTJ`:n^ExlO~V)+M~vUd:"tvTӭQJ~jVSѽT֣"chaK~!-PX3ZT"6ZUkJɆf(zH" h|u~ )fSjeV6|gh)_[d [ne}\#wEѽs7buݔOZ*_ wqv`wX)Zkb 4 l腯 `f$ssAJ_};c26}?cgg:uF:ӮtVVBc.7bTJ0WR^mh{ޖms=o+g)l+h$oKPw#7P*C4=_r\_#D[5Qj(kii~ZWb:B4{S3C_׫M;Rm1> ]v0z) sŜߺi<>sK)(uI9mVKԚAml[>_2h[6S[ ]v\Kz{. ==8_BnWߠVwa]q<3sLV:;Iw7=v&fZڣ ψUɒ7_˯ߣ kűsavsc;@0&x 9WNWg|nߍSEs^'sdj*V-z?O4nM$&/)w NƦD LJd/@3Džsy:nz| }/B~*{ʢяk^*O'bGI]ҫ 1ooaGg>8I ^U36>޵ݞ ̜U~-Ŏ[G\34`4;J_{b?!j=GBl$)`{g s'KG]1B/U'pG3dV, 㶩G>G e ܼ%vCxG1jЫ^g/9k.C[(!ސuk+.Yɤ 4\磸vU9QeaffNY̆)ƒ-4eɋ` ,fU !O3sM̙ۡ )y Ծ#VVG/׾i=c7;9ҋ0DA͂)""""Wmw%{ ޭJq; /۔9 R϶5*~XΔi{ux殘Ewp2 `W@?,62\f2/`Ô$t2~>7օ+oȻdXvm&#f#pwo.A&""""rn!T-\wP0gOj4Y#VoNtL7} Ս+ILD](%(=]^o^fwƁ} -`A?͆O&Ӟ^1xTvZ'SlŠWwߖ؋lt/`О:zOqQR]n_ goBQsxNW,Yp X N8(<;Lo& b_l'NFJ3Ӥ[f=15;cQ~rRt8kQʏ]zѓxǔ4uv9FPP0` wv"AV k]WhfRl"{7.+]b?ӸKAO拕l~g~!Cί@? """"|^kjl̵r`ױ[df;v0^n*+F. 쁖Wt j} ij"kI~n"w+r^Y9]7\WȄ<®CF0wo3yr+l3P`/Z逡Ze?YJDS+JRq"݅;b6AAJS98˅*AW 7NdY1tDJ-ǯ+ 9vb{gOoiel5 0pPV>gty'ƯᏱ^ۚu866ko:1,ddd"&E{B[Wx7|?$DWn98'zSF|\s]9u6r..Bvs\xn lHRjZ!Jq?֝ URe)mUa odW\iBncbZ7R<ɪ]NKe2!/"|.q#$Ķ?ahV㙰Ǧչ7TXNt`HQ~ }|`>Y$~7] l'zCɾ pr\N-˭߮}!<a' 2-wy iOq:KnChl싕Of(_ʾ bȀX-"""" 4wn ݁f)/4CŁWw_).w&%C)՛RmPSD OƷܖ\Kئ'[~+A9F~"R5;K01p 7l:v&NK ]ï qv5_fcp cUZdp^#z&G؈h`XJ>3ڰ4rjYD Z:9Ս*ݕ|4,%"U!=`jPB ڗOL <7Әx&zs >yC$+/u0ɓ;0 ^d$ ->v.wxN{fJh7hoUWxw2SaMn ??~RBS4m.{Nf!ÌzN<.\~1o:=3x"Qt{#{YJ8m= 5*ȅӌp\더b(,,zd1મEGzR~i}7_/̷uEDDDD.!9 탧'FWk݂M`/= 6nMMXDDDDDDn XȟigՃ\W,"""""" AGRԞDDDDDFIGRԞDDDDDwwlGڑ F]GTDDDDDDK`(((((((((ܴ:j_DDDDDrqqQRFʮrulCj$""""""7RF>(_DDDDDDHf((((((((UvCE~#'^9sͺy`q=#0W}/*"""""|oDPVKX+5Lcv5˦)"""""| x478\:MJ"mѕZ)̝:eݓZxt ?gm1ezh͆Y3v7`Aqĵ 3἟͈ I ISXK֌Gk?g,Kxk*8ս61]0z@ 7NømXN501ì1_Ylm1~&)wď|w 7i_]u."""""rWS[ , b phN,#ƭߔl]FJ5M Vz`=blGV,l4Ne]3p0}xBKҷu @ho&=^3 DV} ~4 neՖB<_/wCsL-&ˆ9S^DDDDD+=K"7缢Է)& ?Ŀ]nj e/g ޙ6R-Snj0CuȦVhsoՁLiX< @AtZadZֹtV g5#X}K/PnP}6J4ͽ]F/""""" !6MVD?II57/|sXIJ*Ә9a+~X$e L\oզM2t3cĠ xlȾ2fT,* Z7~]n=Ⱥu;ٺ{7)[V1aoF|Qy3`Udt+"Zӣq]L,N^b}tA!Q@8'ԛ@!;3xyb2/k/ay+&̷` ֬4Rr/X&N Xa$}kLj"""""|c2PGcj+lXA'deum :MfjK K'y Vb"_ڠ#},QK琺t vb3QӋ}'& sbC:fmĿwU!i"6% ;VX@]i^NqB~EDDDDzidW53V[:e>%I:ȦKW.f5Ͽ1.uݸi~u2~Y3_{q543`jҙ޷{b:U9ji &O]D{ OE:H>GصdވgB{`\j"""""rSrq8kRl6?~bm7ռH%g_r[nh4zX HNN4lzEDDDDD*ʦWJXDDDDDDn """""","""""","""""","""""","""""","""""","""""","""""","""""" """""""7>PvQ?ݸ\K!"""""7H%R):.Bj]DDDDDP.p Jl6ڋHe..R/ L&#FH% Nb\(T@_VEU_ DDDDDDmDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDD gx O&&gF#ӯm gEG1[lj!ql>NL'؈oX{L ?!a^ `B̜ {S[iGDDDDD*:]x~X7ٚ΂Wf؏7GFѺp% y { '2vTfA#_@3xT3o &W8?N=,"7ʔh`O9'ekqg?߈EsNC~K6[f:Y}y2x)I2E i$ |4q VROb(ONdxLs^KJ1`Yl =ߚKI|o1e|/O=Ŀ"7"""""g w?dMl<I 0@&Tٵ 3#0ѩm&so∽ mB#]V noK(<&0D2`T> 5:ƃ?0l;`Gh-0^ NHZ?{<>MStz7#4׍p_Mxn4y;)&FhzaRhUL?͆Odκdn=27d #hUᥢXr“5c' 3}!/Sv]HHɢ`b&g#ށy]xN;*̇;*nOMTי*p8FFhz;ƪ's)e]Ͼ]>WLOgд- HxV>:Bm>p eyv(:9PH~2ǜCV"lx@3elt YĢS-gטܾ?"bfV>f[^DxFN&3s^8YWSd7"""""R ݸf"nNVC^LѴ 9ɇЦ3;/<ܐؐd& #Maxbw绉Sa7}F #/%?-jjXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDnfnFC/"""""RI(_RZHeWZ:6!v5^FX#EDDDDDn /YC""""""rc$JD@MAXDDDDDDEDDDDDDEDDDDDDEDDDDDD/nVYEDDDDiX`KލjSL&#i؀~zQ?",""""r={?*VnOɻ?_!2:+Up8())aX6:o˫*G_f,XW_7phM%""""W=[VvNPyyUc{w*V_XDDDDz.))e¯ȟ9DXDDDDj*--U%T"E0%~c|y%F,""Dt^4 \<)y54rJDDDDDBC<,%-X9mV،?R-tzmgQq[on.1вpd Ȅ*`l}qn%n@ T]' l!A*7g5#}6V`t}?cPt_M E >k`[ W n`{) ;WBRUxy<%ař}u186#"""Km}g;ӳK_:?f{Wu?,Z O`G6tgb_`C X@m7TH_J\ Ъ>`X~^u6dd@hJ|qeNtFt BN/֋ܝ)u{85 Wٙd uB1ruAD0x$nÒFLܟ-FګC.fUa>gțmP PwZkJ_-s)"""r|uVc;V bŶfAB 0peހG_A_쇙;t8Obnh8̩sX|x֤3#=DTY8`ܤlͲR=cv<Ğttz5ϲYc3ժ;#'qlf}BfxynϮz/Z>V^:YOx$fkVFtb "=,9fe6bؿb{ YwshK~n/p#X γEY6c?`"}kj\AҦ$,Zaڽ]޵5ϿF?;mV,o;,crd غA6*'V پAsq7lll>40jo)뾚Ϟ}%` P؎a&NYlؒΰFA w ݛ{@c7lȪl;ё/Bڕl+ʋCE-qu1lĽ4mkn{˻iըws Vg`g@nb9,[N~ePD2ԧ'}$}lP;%''֔44QP#Xl#GͰ&n|1i,0 V{^PX-mw7kw |unݚ2o<^|E͛ǐ!Chݺ5ӧOWE)ÞMƳjp8 %';tY_qdKN6'sڿ\F&F҂؛4kݞW1JXͲoKVl?zbGfƒ{vfmz`Ml(@d+Y-$֝$DODDD OoGe/V 4 jZ@xZ.]eެLV)Jۯrmx"""@Wy]#K-U_Z~ñbs~?2R.r;{:OUm {:e&mn{T)Xp>A+uvZmߥ&}g(K~Z]; _@:X-P32j 9 ;k8<5"{AXdl=\'HpKmÚ{ԃF=:qG/NK`_v3~$Լ@nle̽XP̾298_bv%TȮUٚ-[eI#"""FfXYX;4=#Xs]qRӋ (`VJ`"VGuE_g gQt'[Xs$s[`c3 P?t~~]w4o+.f[6:u1L"udw`ٲ,^b$nA6a/>|0&&wOL@iO1ڂ0 7V%p#aw7%SWZ/̆ScD{.> hz?P>iɆ-I?aXٺ.mҾl&nO⤡63FDDD@>7|*O3V죊p"۳U!6>8emÀ_֕VwX FMhï=Wi=^7$ߒ彄yPvl&2O|ɪS>8m߰'#fw tk|Np?VCwxԑF4/(zu N]6Bo'ǩס7H-S 4x%~5 NHn95 a . .D.Xzhs<9 L( !AFh3+f0qV 2nL8'z!A,c}kѡ.SXl'.q96bL0Ld&ڋILM:vOLǒXjZ݊Vvj2dyi0c9gƯcވG#0ya D2t CaCO_0w]$Xm>|hӮsC[AwkVGyN0̈́QY[N-gj=XF8"+|c3FS*]xqDG|/ye#=n|MxvDV#qz///ܮ``r FWkZPP릦 sr nɺՇvRYR(|T!" SѬmsv؀)/"""ב;x吋,M7?MT%zi\.WU(( FjUȟ,?'Q`%Օ5C`?1Κ!!)i,\\\pssXk֬Z#'2礛zED#ASI$MGZZYfY[M֏.ݻi[g[֬VM?4SLrb*B r0үmzp9p~%I7 gFJZZO^Jߴvlv`%$I76lHLL gӦiTVV9x@ @dd$cb9{ $IOw  **s #5hЀ  iذ!@ฮX$IZnР GӠï$I$}C0 ]B}%$I$}yhI$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IXmrYm$I$%I$Ioװ^?s/R?ouL0[S_HӺ,SސS/&L斻ڱLs n>wU^g;[ʩ"q73[/^hLxh;x 1)oauO~yC:v{ G^b{D! 3I|n%A$IdFŦr/wOr[<95&`SuI6?& -K҇rsp1Og$A)yMgyAC[i&: udKĨ.{S{9mo4)/g I9bhO#:]VSA!!+w9My3VW MOcng~MqQl}&UWW W}ɿ[삦oHgۮd:wK"拇^64m42fgU$M:]_H ɝ[z=ª_ps&@ y2^ϣ*IY1rTZCd,IDMk؜_D F˘]@h ~.aohHϮ>h?$Iq~]\^Da?ET)oֻX0e{e-[5)&'i<|S;JwA""*{1^M)|e>o_R)0@" Y2~3tޙIew-̸g'z(:_ttk(xң-6SQi8?8mUf>4Emrv?OBc8ym:}4MjBD(x?o<̯_-j:6']` MX ̤I| +0qf2͋fozgf& rϣce }M҄1wU$ItW=&pZ/7sN5G]_<<8 w0DEQ\C X .AGZ ^sGe?E|:ob?# \D֑vC}*g2ʎĤѿvJnhMJ`%kX;+אGJSK&"P@3yoN PMkXQ-~g`.oW/Gڜ~%s?w23'3wPJ5lkӇq~ QiS=liV4۳p8PT/¶Lk/ഌS'Db5gu>ēP aB8X+ؖvMR H/I$vM߯u pDkBeD;}.ߏ {6+6F_eUA)Ua ̑CdQc"4FA DeYW􉍫'q4nC{bOy֐9F2Uȧjzw >Y˿vR0TU O'  PU}K 6+n+P y^橉y15ã`F }P;ٳ~-k8PEeӓYDf@ ?=Ί 3\ 4QRTI~%I$p=lƹ_pY>I Yg$0ə,ݝ_yw IDAT$:3k/%N\RT$Ah'%{Ě\+6 z:sѩ;cۯS*R̠a4.\ ?os{?gͻ:~0G4(~10@~M !o} $ITԫk-o3(]o cpeLc6U@8D5})A*B^e/3}sZVR~6V.#w{)K3iY _w|zޟǂzFӑMX5 b 禑 քyfҼ/s*5椤]l1wSC/I$UpG84Oc>$&+syX'-_mt&e^8(=/TH6W$%G]0iؾ7W_ Ч+M,fW s3Xx6-| 8 }z&: ƋH}w&;C@ts^b} &WB6_m3>M"LlGϛ~3.d dLAbyek(Xs}8NU"{pI1hi9}vV7mNJ\L4-G/$It98p*C|_UyC1ywV~N'?1$I>4)WӸqc"""hd{lL$It<0K$I -7@cu$IbNW$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$Id$I$,I$I@6兩Xb%J[V$Iq/I\5zڶO5ח{׭?1J$IR-Jz+Vȓ?Cpi_I$I:J~a"^3Z$IM?+I$I"K$Id$I$ >4Wdt $Itix\0ٙ"6o $IdbO$]ʵy$I$!@$I$p}I DQq-.I$Iǩ=:?揥o4ʳ$It=Kt(ƽR@l kK$I>*#oR^~M %[\$I W2Deג$I5S"$$ hI$I2_M!/Ǣg2cЖ$I1(8C>:X(%I$\oS0RlK$Iq%#@01QK!I$z,Lz ?#$Id!i#v6%Xk|D]s /9]'gewq/ 9-I$鿒O,s$IdV]/_`1/0bFYȽ0?nIPQL^V&wf6a /#ﺍ]R_L)<:~9e@uL;uQNIDK֙LDVn$}g5f0 LK!>ʊX:wbR"ViKy"*y2fNepZSؽq%biˋp^"Q -qϱvM"]Hک5 ߢ< '6 -/'fM9MCt\승'9hL?g䓗Ր^ iYbI21]i$%ߏ$Id d݄r* 8<}t܃~>ʅd_Jyl  H_eD2VΚڨ l c+|pX4g͉m~x'3vs:ggSL!JVΝȸz:%H?ffz^A?rx9f d a}5n e`cQҹ_ 挖4Bl2T:\ӆ+X7\{qS8K}\VՂ҉v;duK_6]Fqa{=m[%5˄țn0%I$SJr?pI$@d J־>[kS[_NAB0n!V*6޻&[+إP'쒞_Ճ $d^; Hr/Ue9̛GҕgS5AmO؟\ RVk АPܹC'r kes-fox|qc!pCaѾ_Q͛@ lR ̺Od;_^EMv?bZ$I ɔ'rk_|,C~Gul @hf22 nr*j@Fe/G2 -৷7.&2PPQso|{՝/^է7~k_PΞ}_~SW*Kj^Dy1i.I$G" y/˵/Г oby+*, Si>+Á; IKxfY'~N\k2M8OWOg҆r>Ǐrz Ipb $I" !9X|:b6$ ĉJBCu VABd1bIܩ2s%=#S:kWkt1:"FGT?7p'pRs0,j1ᣦDZkATd"1[s5/GʿxPV6(nG Siلx?WK qH$Ix NI:e|ꪣ 8^LZΤ3[H2BT_^#I$pF8@UU{!>yӇ޶_?L h ] YL7^K:)I9o/9iSqDDDРAovX:}pC ūwr39= B .c t@ْL^0J$Iq`hvKi(]?CL;S$Id뽷W$IR=|Dgܒlf4@<}>Wj衾$I$q"m$3fҕkMRnJv2]\+V2qLS}y0t8&c|\O㗑=g _wGtHHaBN:㓚OUI$I#Y3,yl‰$x|> +8QMI_FރhڊQ &YƲW&q]Yb`WX2͙} )Nd/ʸGfh2MCxv63oO}`̹+Ñn2MSk8eg3cLLAJ/DzC)ks-#{"LCև&H1u2^ƢY}ARDz 2:$yu&4!ļL'ۄ$I _CL89jM MXSFʅ= f-$?6=I{h$}[͗汞 k,Ԋy$W%EĦ Kx)<6 s&0qLy}1z} X]Bq~<{,b0m)@h &|::H-ՕgL}~%o&5w2/d^&'u!Rs'0a"6jOtA$&zui$#}Ќb!?%I$Չw"%9̟SK隰ڸI##3raқ&}=!w?ҝ7z~1Ls{GNJ#pkgo_ceOKqzF >$wXqbһ'Ӥ˯|B@̠u]%6&K-!k @# nWF…xs]uuՙwu8ػy ?>u+կ/=Ns x-[ xC⿮o\Cqui޺1\޸%:G\Fi uj?wF ?X{Ӭx_,h5zG jLmtW31ػV^?$Iz!غq8 .(&sgz+1 G= $k#Mދh4ᤴƔxgV2]A~*$۶*Kyu[*|tѶ D]:~FLfra]]ݘ`vXŅ[嗽8)4O/rJl)۲83=LTB\"@\6-omZ.stZˇv>2׬%ly9lum0jJo]EQji]@oZы΁ȚRw ?"o3Sr%I`WO[+3H|rr/{Dӣf FhXxJ{>12dLcd͌ tJ"d>pLeȩ5|".6Lec<7rߵ$}#x $1/mAR;@z"m]'e¢0:DVڂݛřCk3q#ZL\SiuF7XpgQ?7Fˮ7Lqĵ%^;J}aF-U::h[ ZV: ziՏ>tKE,|2导Jf*~Ŋ@I>/%,Ʉ?WzgpRdlтP L\Sm? ZyvgՃoQ 쓉GbqT,{>Z .NBd:t[rY=6zS79J6r $I"o2enB9v moe+OM'=x"A,g6[Io'gS"o]ڞȼGA 64LYX@8c/:moARY. {aFr|m;i>S&7Q6fl ;w QtMĝ u볌j9uI{؟#t$4q`JNNĵJk-ळO&vj c2Prmh*t5Xo]DzCޖ:!J M~0!kO}7C&Ĵv|Bi>؝H[ u'ԮASnL~}  \ ⫼U38O&aO'gXwİF\ϪGj6r9N @Y!w+!.u4&eE$7GliP V!;v9-I$WITi845xb1KY4mϖԼi!36j~)5-I$u34+;/32Tҧ?#Ɠqm& rDF);,߯)HE@I_nE$ @,C!_2[7.=:X P:6K˸~1iVeùGud߷t>k:s @|sI;b9n g*Ή=Ѿusb( jH6UBdCT sHGү_w)*Hk pҘ~B_'x]Zgޘ lsz:o !0[.xs$wOyj3?ŠϮw*~Ӛ?z+{%[֡*W]lۮ$>>Vݓz[*\[^h' IDATJ$S,?I2M/9,49H[RycR lr+ҹH# g/lJ X&q_JJ \G&ey_)V&&8>0.g7ϑ]J)C': (Z= 7x^_ۙxkrV >T&3?Gf!%@|O4J]W?z{$Lb?DBb$:F_iҲ1DFh"D~|f wS>;V#m܂>JW~npɭbss]q҂r@`?t7&ѪG]?$I2hw~‡ٹgs^VR 26lKYڜ<fCŻ) Cz|} E9{%xM6yt3FP@%):Q狶?=.Kђ̈́i)'oee]WA/y Q4`jLhv]D~gU|R˖νpkdC|=ؕfH&~ʳ`MilZѲ .h ѲB: K}9%|)P/Ty#}:SuUxAqoǹl+KՐ+f;:t7{O"y2~yeyQ>VQɤt |_p jlE?tĂ"VF=f=eJ'v5r pԐ aR+Z׈pmZmϋZws̼Kj⍔L۟]GҲ[-l/G{t i"zu?`I3UQGs=7ArD3ChHFqӂ24}*Aї:/Pߗ?͘=I8=ø?ynхչ߫|6=gפCnɈ+{RHmӆH(oI\C \ʺ ЬO1[X Jt @ ,Nv \I[tRhHi,~xݱ⏶Mt`箤utkdM)< 7dNN7c} /vc8Zi\śb1\۱#m/JZrQm&*;8ELZx«V_rnDii*qq zpq9rLQ}kygǨWA,&R,K[ؐòVTaqbWMEi^ S*Iv~9pUUUٳOzے$It sz]_r\MƍAou_yY{%I$I ^0W'ެXȽ0:I$I;.ɭ73J$Iq};w(ȝͣ?Ғzve*$It,J2G`̬: a`-.I$I 9t=e%I$\UR X$I X0֥'If`I$I2[f3eNǜ9b $I $>˽O#g]Ȗ$I$pLJ"9_{o$It:>@\W$I XB$ U$ItC};wKY`I$I2Gdt/̿$Id(Xc+K$I`I$I @$IdFFڒ$IdnS fI$I27|Ո6C$I@02F\oѶ}*<{i$IZ[Gy R3!pI$I.В$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$Id$I$,I$IRF<$I$}Gp c:pў-$I]wձo}A=I$I$>S{ؑϒ$IT?| I$IG.В$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$Io\zq ِL &J;n%m$I$@J|WQ;3n.b8\$I AT?51QLo{aO3w6i]/g?!gք/2a\rЪ|pOޜ%gn .ᙅ)&sΡw?fw(w`:wWaTLzi-ӌsC'm"O9A#nMw$I$k73xf;|4 @yt,`܃Y7nɘ }OgKV.^8ף0g9'jKc⃩s,x.nY8~;S P<%?3Ô'o$I$8Uzn1ry#U1ders9׷B>Aݷbqn~|h)5ʑ@yr?FҋV@\,=3[[7$+4k NM=[??s>g!Bˇ@2 j/ݘs~:i,K\c:_[M璯{ Q$IOS.U)Z3v߲@NNK̴TN졒 (`.lIRya͘ĘռQлqnٔO=96leCiV *vu UxoFy~2 mfo$I$xӰY4ыedsuH؏[.53$\t3/=N'9~v*=uOOGc^B1k9o;+.i#OQ7fI9|`Tsv͹VBB4u˦uA$I OypS[I-x|:s<8Ӫe sݬ֊L{e}<{$I$ׂӯ%664ݽ{W^M&I$I{UyIdXwtBP!ˏQ4m(+% Bm`mdt!&S4QH`$ne2(ɤtG PWprs>ϝ9s>\ EDDDDDCU9:msT""""""_B````````QQQQQQuu—+Vuun9_B!N:EDDDDD{u<O &faPN\y@WDDDDD^C/Lw DDDDDDO@(((((((((((((_f؇(U]\\ :;,~v訣0;4U_W7v] wڇ|p<ɽؗ='m4"<2qp3P]s(-bm6xGĂ{ )|KZ2"q_3(ɴcKe/mhGIqqlz7:w֐K""""r-r/dZ/)sxB +!C,R^u6k!kFPvl1g?!k_h*|^\K{ȞNBr:nM q N_S,# - (z';bKq[@\}yv^ t;XEopcIy&_G2ۮ+o: 8z.5G1D.醎ݬ-D[;Dl*OC ?-2i)3)NU6{ >D7nwP{$mBYIV~=i>,2 axAH4BDDDD.R&pp'-aA/|C:DX~yh C񎛺^KWPW/ O{̀*03H{[{)zpLM"2yphN<:6"Gǃ"&3X$R~ ]!fV" ZOk o5 J{pӳ3EYADDDD>*M}|A>AŚ!S,)#o$چN k0*2tT:$CF,v;V?FBZ7Z|:,x`Ogm*qh Bp@GqE`H/3陵^&02r(!p{VRZY6ܞAL^[=KA˱}9v0DF]ǽW4&? ~D@DDDD.n90]({$%Ѻ[J7}G7QW}u0G/oe 8:Wgjx!n_cs:nęq /27'0nJ"$!4D^]wh@ +74c;c!XceyUro"Yڍ &F'b}e%ٍzn/XRdϾ]ḝQ |N*jRj9 M( """"Ozl>,՝Nxi ~4k wGL!dIai \ȌWǠ}׉=S5S=ŅΞ ͨ)]' !ҋRNwu N!jέYSXIp3 UyAELz.mTlIid?O1z +6y{)ZA~e#NYLO3i<m!YuzDs˭fjKVp𤕔id 61*=5SRCnLY4lyXs7NG  xuK=81+o\-¨b.';W>-+_{1r$IvLjSN B󏮵4 ʾ2*nM:W2M5[eun|`;;end$WU /(3tx,ܹ s\۵c0cg0%5FW˛++Ye4\ IR ҹ"A sYg&oEhWb ҰQL´')2w.Z{ωFT,n9]]qViDFFb_y_kt."""""rrC[ Ǝ77a7 %[s+tF̀qHá i[}HpXf\!@3ҳN,8b ^\ǭ$5K-OB'?teÞƼ_`vYx@}%~yI>V㋈yn?qLʄٽ7s2ۋ nZi!dN߾@CX{qy,pۄ/qn43tOrxLo_fl%v}ػ𿭭g] 1DCt$?ц3-""""r q}h%.&%r5q>1 Orsm#x?HG, rK93CD$ ݇72rӬÌXk!-d'd9,.9Pc#O9 #1~\(a7l fk͑ޝn0mx33|{܋RM0&`sY#OrHM,qn&* nHˡ\r27}[:3șO&pnV/iY_`M?Pf/-xTa`qikQQ-;*FWȵ䰛cVkM0ך%:`;RƮY7r]3LOyt>hǠcCvq!v#GؒIO#X:\HY]sgG^==}\ҧqUbω右syglaq3%, `vp<w7g٫)){9!p5\<./{4%1&MOߜ<J'!6;f=FV:n\o吂@BWc |Qɽ;zԌM,}a}ɔī;JHCgO{7e1ŏ?" g%aQ/B=݁߷X`<7':H͉ @*pAa$8̗}HtֶÈś_cσNDDDDDX!>@QrW 9{NͭEϐ}s׶1r+fu{(6i&KQSɝF|Wּhy6*Vm50E0vK#Og/իXwOk#NH'>" eq ~ejD/+=CAf'[, \w?& [[9vYG4x[!NQ/fs(mȞ ౔*sVΔ26 f'Uos $ YHP]gr>cXu?XEj: z~;~L 9L޵{zIYdOJ¢/( R%a\OR66n9f\^’G`rf1È {ysU ŏZCJXYKvRnAݼ\\Lq峦SK;O>\I2gp-{ e,)K\, ݈Ѵe,iaXhf+6g~]EcoeS!z B'^j>?/ė`rrfRx^p$1'2)pa(YX(ydFk K J44ZAiA 1dSl0vR"iDB5=cb5";;S***l2VVURT[K2#s uȻX<73 Ϛ}97o4Ie#濾[MJF<x2R흽YgXz1D`—2!Ba@ڵXGMf| z3>ȿ>վaL!lNjbgMGm]Kb܌6p0tPېKp/۰Pj.s2tE:3ާ~Vq_>{R˩=>s2i$l۬MnFg7mtr q$AePQQq|nUCʃyL;_ ׾Z^Cs?cl<+͐_2r,rfHAQU!~2<2 r'zɸs8C&aDr/V~%^-Wh&!=EBhCt._`cd"͝Æp`;䳟/&>u׎G@Q|0d#QZ^qg}(h'am[. 4.Cv nt2bHOI|K22!BWX.."$f ؿg7g  )C/CeL0!6.T 7Q?nrv>z+:* TG:z͖nAqںqhDƬd̂tRV\bS,=D?;ȕ zUǻE>B:7 [y`C 00@G6#~pu?tXfBv;}OMBf g &=AXbfW .wo^#<8`gy9;[OFd;ַyc01X6/5vR'bb {㢱nD7" <5LBi"ĘKA=]g}H8osҭ3/ϞqxoC4\Z@> #3\ؖ@BT+ ջ67իse8s Μ%*~ O@-cX>q7SSܔ/| gcY^ؚ1%A'U˘*Q}kç?IEU)Z a`u yd%I( d !?CEDDDD.N:uJ?& ?4([5/r}_(V+. 0H 'Oj\?&8 sġIENDB`fastapi-0.110.3/docs/en/docs/img/tutorial/path-operation-advanced-configuration/000077500000000000000000000000001461403617600275565ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/tutorial/path-operation-advanced-configuration/image01.png000066400000000000000000002047601461403617600315200ustar00rootroot00000000000000PNG  IHDR!sBIT|dtEXtSoftwareShutterc IDATxw|߶$NB it RXX^m-E@߫WJ/*UH t)M,$FH~>hvfvٝy9c{N'"""""""u]AA .4=6߈H/)8 TS""""""RrvXf F-qInjJDDDDDD4Ʉ`aƌ㍬ߐpqՐ\2F#mZat8$Hɓx<3aTg U\XDDDDDDDXDDDDDD` X,1-&&ejq8\.*EDDDD:pPPAEZh2b4X,XsbDDDDDBz "\P`T""""" A-~=:bT*/oziŧ6:Q./L`PjN d6UqGqzG`iE/R|  TAkw4\;uW3 d1Tk"uT1~+gE :3*|DlUk"u^.^ aiYH _HUO[.2VOuO,W3Ӗ-Z믿 g7$;'*tL\۠9ΟoԠ +""":2L~9n1x?3#sUzz}v{.w ED\х~y5 2.]Тe+e|zXޚ>n`"!(ixO'2>[lw󉍋ӏ\>*;˯zDDDNӗM`P-[Ѣe+n2æMfB0 ?6Jݟk4;N<@Nv/F"#!--|_TO>{5}/UXlybt|n]x<%C˿[nN bogsXV+MzBeVL4k;v$0Jrr ;vrw#LRRRySbM7 {#GZ麽Uz*SR+\^}#%xGsٹ}g.b-H.|<9Yn^z"GJJozvvѲUݦ'667lOMM6r-X,4FvM 5X1LhiӦw'|!z_ޝAfƍ5ԗK^{Э[FB1T"""Rp].+=𣼼sw #K. X=4_ዂmT㦾)>Vjj vB#NkO2|,[ֱ͛zJ~˃iZz9ﻷ>Clݲ[6s=J׽ͼy5wo_vÎX+~9>|XM+_>o/_ƍxo&,]s͝Omۆ[6ӭ[WaCY<~ؼիVҷO /scy[-~>;w:#̟)k_͆q]_72bp)~GKNM_mc=qС:AE^u{u.>0VeH, S7^Vk X yye$00BAv,SL%+;S$&&`bka/k/yvg,X4>{hذ!s?MNײks_o.K,`_n7 qDñc6k_+M{s}Wʼ.x}KˈH 4oѲy|E#DžoEQ&?\^&xsk[Eh4vIIM*v??wJin=ЃӦMk_P˯_75傅e6mM˅_WN*3?~?ع 1֑Æ$=#xMu }zb['|ֿf=:,^ޭ+ݻ|wzjڤ !!!lDz˴lْ4<}f`*???4nsP@\]r-Zb1QǜK 5mJ<旽G-IKKW9 Z۷xsZ-o..g'?xx֭+w;f}8y>ͷ}0>v( ?uּ#3gg%?/<-+\'sX+LeN'k׭g2|ٶ-6n~AL&z*ӧ7999qrSPp 2[eZN{eee%,,_J]k650V5EmuYӊZ~y`|ESZEDDFg⏝pGÎߥ=g.tnm윜2[w5аz'p{<ROۆ FBªm۴Ϗgpdl'&f;OȌfp8!,d2Lrp>t.|ļeԨ%ng.'8~D/jym٪%7mf͚x'?^@vKHh(K\.vIjjZ)>>MΝ駭y9q"A֭YhI?C3zHMNL*qs]ܳon#F '''j2_㙝۷#reI3uR)00 ݑb(Y 4qvyYl%DDD>}ƍbc0 t&77Rd<lyff͚2o^y3v(ޛ6}Ann.gx\R_~?K`HOec|j =kݲ|jg˯(6kޒ<;٧l0(('+V"Ҽyϭm_呇z:u5߭=#ѬYSN'~tL6l^+999,\vq@l?Cff&FzAϏ'xz!!&?Bn/Gn|j/{n&3Ƹ;Gvv6q ))L| &=6ɓϏG`ŊtԨJ~>ٙ?3zrҬ=/cذa^K\r=AU n GHOOu>DFFҼf}2jVWUzY)Xbg2_|냫=DDDD*宻)vYy:kڶiU@fhݎFQMeDDDͯc'J BUe0.YDDDj=%}@eidhGR0DDDF60VFjM.+w`(@)p" ip*:BN{ ,DDDCg lD0KEOb4Uix$BDDD.~T$ Uc"u5Z@:{=3@ΔE : @L&uL&AAqpzQtӼOjG!"""-xF|s-'(0sUNf5PrP|v"""RۃgKh ^xjJY@Fٌd& E_\jF#(rrz|pd˄ςO'DDDDҔRQU"""""""`QTƾ q\x<HqF#Fٌ?~~~5EDzFقll4#"ǍrN3/RK#n[T&Ǎ$//HP`^˅5Њ`tt:st:qHd2aXJza23Ujpk ^$\DDDS/^ͳO>:V\^Bhզ%MC[m~-B ZV޺q שAlue"Rw5[oYװ G>K`“w=̖iS|r/[δJ]h{ey-YW_qΝiii'sՍ>|Wwpw/>E6nD-FBpQ aժ<6a a!<6aV&$$Z/ ة3#FɻoiZ6_[obd1ŋ)۷לj5޿1{f#U{~ O+q}Cֳol 斩i^bwcѫТԊ,{u-WP:z`GtߙY9Co'Ir{+*~7@;Txg4=?;4w_O+38%_}17øQ<Ԇz-ydddaw{=T΋ YDDF֧~Dx<^ ra0p\p׸J]X-tU3ߟgή١G8qoMW{NNj ߢ.媑c&Ɣ1e*?xoLʮ]=o} `HNJb32_^y-Y 9)PQ<ͺs5} -Jjd6W&v ^ lʥo0mX#]3Nl 6 >1sBRly=:|]+W Sټ`.,F=ZP 3 Vp1c?^ՒC^Į(Z8L4oրD2/PY=0hd%c:v$krkGJgˬ;RN޽{@BB{qǭ^ȑ#jeFYBCC0p%=}N'^cd={N_H՞k[mۯ/W5cok]ju˼ tԩ].oI@@; lZ?VXh_y>.|%/APPP@L׷dO{IF:{coW72{{/ߋloӉ{G;Vj38wewwWFY8f'94ͳ6!K9= #u|;cadSz MwmnHVҷ%#2~<}˽`ZL+T@f~֯컮k Y߁ 9M+_!ٹ ؒyb+np~޾wóApWs8_Ƅ;:5XD7w6ZnQC-װ & 'Y|qsvQOK?XC!Ɉ L d6=g{!7wˆD`t$mޗl =GzRJ9 m69leǖ5znIX?~.;Ev͉2J9Ȇְ/Ӄҷ-8uҮ!l{[a=ݚxYe˳ cYfiۦcJfxSnGdpѹӎ&aԐVaUQxӤWe /V2 N,vuWcr[|v[Ɇ`Z,*g IDATl=hbUl$9Mz`(|dz=fnr< +~%3-DeCZѲFln tԟ3y!"Bܗ.7,7n%o$k_nv#I,aG%3E򆅬I'X0).i֪9!'6bu.p䘉wBeUpκz9 q]ˊ}pF\~j;Ħp̕od$mR.gQxZ}9i52{r{b896>6&"RGF䓏ӼyeǎǍ+y;KZ,&)۟7Uj=5n\]wu$&&W_#ߟ{ﻗ-HƩS?>^~%>p[l%<<f>;wbРxG} ͛j2mڵk )Gi>;>+lKMM-wqZߠmAڵiÒUo@xXx/ k_W-\~NwNw_6"vh D}3OO1,i1/:N(6>[i/ZzlŮ#IM㔡3-[Xв;#s Y#s9F#X "b |>{.yDd|۷&8e/qWЫ| F Sܚ~Iv / q&" -d~j+ *˱x=z椁~hy)ɤdIb)3ښ8h1Ini}:x^n[:ŶG8xkcu7#RpgzJץ0;yc R|;G{n:wTu= bh9֙6SС5cl{ 7p$-z6%ʻ2Kwm.?_ /W1_lc""5--=)SK/мys.]βt%Fq[ JHH`ʔwO9n,fIauSuپwenT$>!N{^~ؼhb,y)fϞiox'?s`Æ4m҄^z6c2̛7)B~~AQ *T`ٌUPo1~}̞}[!Nϻ'[ r=\^6CE-'40G2{SpEtn5T ۶CdF3+܈&40^qAE%bk({-~;~%>u;B3 EI-=AM7xOl6@-L\݇Z04C~>F [*̲nukIV cP 88MVM6.rOr*W~5H-d㯯C>Q#_?Y}Rb|޽{y-@vv6gxcbh߾oZZ6 gi۶-!!!lY˶mӆm24nܘP֭PrWyʔ_cmAT~yckӆ5<-f:Ӗ ]6mӦV"<9tJd(w+prRڍHNJYtc6S?Gξ}өF72:3;=)e߬RZpԧ7/[hFmJOY{vucyb@?cݞKQHr=6 q6*NnVUJ])l1;ҽ vm'~]/vp<9f3`ܓ1ƭ?bɮDY bߢZ[h>yRO6{nj{FVƥЖV/^Y^򟯬˩uvpfDˍ<ƪļˢ.C%O?mGH޽? _ oJ޽رcg¯pN'MbɳZΝǼ߿3ߛɸ{1`/[i׾˫L0(F G~>~ž?K o .ׇf/G*YX,v)s|-ZËϽHܡCmۆ 88|K 9֏ϠmycݛFU4yxXX_?|Iދ-uϳXlώki,tJb9 mD)YgN%gd$ =4nvfp"[jIX!\f$㊖7of=ÚZ@Sf$sFe;D?kC߫CHٸ06chHvuõı!; 0~MsPа!fChyDf,8cgn2o!6Ӊ)L$(/4y<<<́妑A2TVge˺w,5-O`8a{";==zGSp8\C(&t˦O~ܔ}N Rd囸m;ΉtҜtԃkrcp#gK;\e=_T(y^C 9Gm/rǶ}p~PW6Lz٘pcZ"rykѢ9y}nyf;n?z^NuZwDo_qh֭]GvNKkRʀW֭ Utxp]lٲ?\lʿ~,v͍2`@& )'79s>塇 ##_GΝ|-U{^-[p8plڼe*Ov\Mu[)mm 5~{ƻK/K/pYh;tN2dM y(P8(VRRr?||kX8>6[f¹hłpWuthj%?2oXe?eߵm5#Ğ'ɯ=(G"{?=?~VȊ,[&qV/noJ>Nd7?dp+ bQtrgk*jٮm*$KkƪE|3=0&Ȃ+?ģpf &3'Zw(WӖ G9ܔֽ_P̄| ᗾtĚCbƙ2-,=1&Ȃ;7cN~d wۮ`p哛<!sW|x#=f\;'1ћ-=;}ZĮa7sس,^s\e59gT(Wz|_=slZ9[#_!6:GrH}mu>FDb Zi޼9͛7nmD``o~U|PlĵbcM;y"6qw@l٬m{ĖiG$+;~![ne֬屉x9z(&N*ȧN{ȃOhX˅S}ÛoETFL>l>;M7L Ԣ&2 6r{+A% ў+ht ~ݻ/BݿrY-Qx[9uԙ7# r:߆QQDw`Œ؏Nl|4g#*EjG5-"Ruܙ'|;v2[Տ䮻KL2tQ.d^Dyzb L87ٲL6 t?}mbxҤqcq#}ϝLf9WXtY*b!"2|gޚgnҶM ; G`.@M_(=m={zE6mСCڵE WkkxPPYYr/gN =iߡѧouuӏ+c@auӺH!<IuAX+]ߔؘӽ@DD@+.;v,1=-=w.]:w~*2T`P rvׯORRsΣD|[0{n,_QzP

    TWרhiTU\\/_uvxz6V\@۩ly%"HF2棲/x561E&e>fz{q8f}]'&=~Ɲ!w{ q3nݍg?e|DTRZND:ZOzA412 "LT*7KcbhjN^Ր \fvNG.F uu%e,ƲܥkQ1!wl-uupe 7*^\N^g;wtTKʮ ejP43y[c⩪0ܙJDť2L&I$Rn['^\O/=>w GXsu,-p޼!(|lcepRG';3'C|ls$QnUTT#"N4ԙl,Sff}۶zO?:f&17g>VxCAAA]AW[SG[,AfQ9yuuJJJ= pGc/_Q/vqvruvѮ:42RSC]iW/:BmMǍ&F̜ eX>>>b,%%#ށC+(T:r@{[K%e囶﫫s 8<:d_] [6n͝0yG ZcuvN΄)S***\:uzv:9%n~i 3}-QT*UQVj`pT"%"U\/c9s|}|Z|ԑ#V?'ϙ3`˗_;u56Ɲ];3>9{X"QX;k6l`y؉))3Nߟ$Hv}W IDATb3SәӦyLr +K'OJ$^={.^@UURm=zQ?{)y< 71Adls>1A]}}YW5 3m3p:@>~GXYZY{HQQQ ˲x{b ?n*"RSS񇶶3g>[3*OSw?4EYzP(tڕvsȑ/.q_}uӦNO:9|}v?}mIi?-3ԧϝho4g+KKΝؽWcCTΚIDO=pqڝWmfdIÖ⍛jWof+pwܼɤFY9w5igi1cWo_\3v:6WvNp<܉(;/}0:-#ᰉعܼ3 "s/?kox8&"yMJIynm#ogΟ]8>'&ދp挒O>u̺:EEEHd```blfǏ3WYV 7z4l޶ͭkWDssۗ,Svӷ2K} Sg\^QML>D<Ϯ];Ηϟr8MޫX, (#+AfK1Öb{}=ݻAfVD*ivR,jȬ>052$}=oy񨝕EMms؜zwND:c.ՓbE'9$ s"PdY}zp鬨̜=<}f7='WV(/?{Dt%Դ4Qu9e2YuMO>Yl=`?~lmP-֭۹ LW]];o{?vc"231)**\.oȐH1czzzߩcGM^+ ?HRQuM (;7~ RWW_Y%쭭 3PqiiMm/;v7L55Dӵs+k'ksSH_܂&3LkjkK5ԅD$H$< o~إc.!WZ+*ݸѻW/c =]ǎ0CޒX&:zEMMs%8xNFy/Y:T*ɈRɸ\ʏ6d>zt)8$֯716nbZAC(Xh~EUժ`'oP+#T|^JI^**훉hׂ))*O_X9"1a;2E.ꍈqvi 7q=s?IȌM]FƎbUqT;N?x ll~Fs>?~Ww#444̝M2crrf)#3_2EE:,7޽!n] J"}51WQQ+yEu]~=!1dIwVTTkϞ&vU A5; bN~3POWXt\D"U x** )ier<UQY|,)+ k++)ed2%sAyEDt/>13+[W[kges\΅k!l@WAo M}.уG&o\͘0yP&]VVQief:jWs?MJ&RRsrRRO„cמ=z͚֭^"8;?oe[h]ժU;:wuuze+**2yqqfRUQtT*524ƆNNN!7o.*.uvg,(,.,.!"UuS[W'D!xvz6Y9'/\bd2ّs|he1e>#cd2n6e'>uh?mgٵkڵC Bi>ᝁKĉӧy1cNn?;r,"*-+矯pnn W 藍VԘO4i@߾x{GF>mu̙3SSzr\BEE嫥K񉉓My劒X,sǎAAE:ڃ6y2ib^,|,*)]ݻЗ*E#g'&q[ѾOI_ |nePFDEŇN{2xynR\𵐰Z3#M H"rM֩ӗD"sdT\ϟ>~4lK{Y3 ~ܹ+| ^fŊ6eоaonfѫ@M->1| DD"= U"C9 P(H$( cyf8|sdKA~}x4ѿ@+}1111JJJ>n}tԩ/>߿Ԑ[~߼9F|G{^u_ gdf铘t=$ĽOQuu5} 9 @[`jj^m]" oOXj@>b/W`,\8d`fx՗a>}d]DTPXƍlY4Չh=z\qcoVV_~ťz։ݻnTXPˋf7<B زmۗ{ݒ|cia;BP @ PSwyD`ɒhKW\reÚ5D4~fʏ6ԋ~`f "SSӟnC>|hE[/-+[jsv!"Z]]jJTWW?hI%%˖̛5 1:89}d ӧ|*SpίrְD蘘۷3#~ї+VHR6MDZZzzz Bv{MՋODfr87BB^DEoU>rs>ӳSǎ-,;sg͚4q⮽{Xqh^U\-SSSk(^OYy9ϙfH"ՋJ ldm\(CVYY|j.]Hٹт***MX7ڵe><))u1@3~X^Anյ:XP(TQV..)@>x!8G D$ _cZ*++7&6>޹CtFq SSSs33"*//IxKchy%¢ ӡ.ڡ}=,^[wppH${o g|'47)@xo6]~޾s;{}n3g}XQ]S#rٲ_6n\ldݺv7{vo]C]}mڴknݼ<>>b,%%#P"8<:d U5UkOC|>o읟TUUE@B>v=    /f̚5vۇ@>zOgܱkWtL J}gh`ջnVVJD" cr@>""}D@>/O;9`@Q /xl޺SǎWPPP022BkbBIQ| ^SVVA9 ǫB9 e>zT\R.(Z;֭͜J}jJ>' Q@F(Wo7.Bh[?@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>ccccc5(unJIMC919~ZQQy9ZqIK- (A=bƗ;q*9%f;:櫪LvՒRm>;9^, J{fَozU/IbQff#7[=[w$&%]ZPXj톞=ƍoNcƩߣ$Vx.sam۱k}VVCGԅ.h}D?}X,>rc?@DI)=<6.~=K>/kמRtS$<2m$fiSs<"3?<|HDL~m8[qUubnfRK}\DԱݹ5DU s?e~<сjĵ~0ܬ^,r?/_Hoڼu{NΣG8tFD;v ̏4ݤFE=jP z}Ӗm˖|^tzzQ1=ܢk- cO/8Q[Y9ݺׇ b&$%tI{h\S"޽L&cXq v{vgOHj|\SS0[hHTf445_kQgd>/Y>S II,۩AM~aFFrJ#U3NTuqf%Ͽp¸W[[[;IoR|;aUU"]9w@D"MҕV-(~͍;[2{ <"Yt|AVTTjjhxv˽ck :cG0{ ձϥDD X,>R::D4jİȤΝp>JeGlc#c{vwH$} ""n]Ξpk7BN 0~L1MܤaÇwt ,ꛔ&mm"{Yh ّklnbݺ~0nFEYD"xjkkb1D|oֈD">_%q.BEEesVD2=Mi29s? hv_TR2S?03ȱGF ^j뉨j֖ 5/֝kC܏;'xx$pܼ}`7/ƺ̥eee- =Qjڃ_0 -\"ݺJJ^[Y/͒H$Q0!%.7i9hȧ:ص362">W晚?`XC}AzFF|bH..UIIy%Fמ}_}FYYSukϒٹCn^=11[˳Ut5`~A?wXZh5i;,Յ-ܷn]35-dan=zk~InaC}hllٹc QN-#@06gN./j橩57. u.OHΎKxiтy;&xW׫w d.G^qF07*p554:ױD`ll$ozr4~)/Ԛ]ճ7DՏgmڲɓ^# | i³x[3Svw@L_UU{qX%%5*fBDgZx kij)((p8Qh^V -Q%'g|bUTT2-+**y@eT*TEDUB嵼gpwP%n8V'iu޵051nvfX٥3Ι2>VZ&RP}};SUUWKRoȨ'e2"٘_8ե?̰Mܤ E#zvw322|Mϯ|A9Z{S/cz4y݋ݼu{Ϯ.yy%Dleiq)igwt`ҳ}BbRY9A/9طki/8ɟK$9\Rn%%%[' N HLJ{q@M__̸\=zu/&5.^nzӆ IbX" Шaɭwfd?8tQ)%TRVV۰[w 8{oJVZs?/??2^qI)}X٬#OdeeGF߻ɑtu / 8y5_Nǟ.]ym&e^$bCZ>Ǐbq.2cLΟCD?p,;laCڌ3ҕhkc;aIZS?PQA|̏8u6tҿo3'n!^j>ׯvé;:r<|'NEg^8xTf" ˹gEeBgN;4O 8u_yyuwJDgO8l];x>@_OQQQnR"ιtc_k/DJD x)AB9@_pzqb??SQ"R47/_&><~#ޖw읟|a#aF-obtB8hÛ <!       ? BYMm- !       sPmx***~G{zxΛڵD4d 61̑d.;tip`ZWuƍg'yzx|vmbRҢ>C#xƍٹl]>ə0eJEEKNNUWs891140h>N9lNJI3g/G#N>ffYYXL:{nU! pVVR2ܧAB%$.kq=iy7vwܺ癳g{p| Oز_hNU! fN#M|>c.FzFiᘡ?wؠؑ 6  ㊊zHHXܳ{/-DTZZ? ŅY ??ӏ8bh`0cTId'N...6359mW̤/W?~D"ճ TUUH*n޶\``qIѣǎ%㹻ךB`4O6obڃx&k ILH$60s^qʭ;';;^ =o$"*)+_V̟̹yA `AD$޸QYUeb`I3Cc++5B9y=ܡ^>xKLfpvBL&+1*? 0|~ѷ3U*Uڵ11./^<11ן~ڿsgN2ETjѝ;]{t߹ᖯ۰͛'|uuo|vح[oݹogN~ҥVܳgӟΜ>=:uُ?^t啞6&©>|wsˏȱnQF mVӗo4`/׮ӆ +GN^ MܧoK"ӱzYӗ͚pϿlhꘑu9zSUi2Voե7;} |"k&>fMB{Jo<Qm9O=6A(((صw&L n]vѨO?>rJb&77W"Ԩ^߿=\]];{ꇄdҲysZ.&fq:t w۰ar{|3kg,'gُ?rc VR~zBiX{WPX>wʽuJD)~;u~5NNޡ]7#F$LQ[jBF  "Z]V!w?y֒o6ifj5$Pzq.ILzeME;wzX޻};}V>nݔ7u}p5kvp=wW7gH$ҸQ/\^iorjۦX W_ֆwg'-cj;DnٹNpP턄i0w:ү[|j۾C^km[o\ѡ=Hxy&>ge5x۫wYOM(tѴ|JýKdekcK5[,;mXݼ{߸a֖]|AN. s):˲U3Mxǖ-_9!6/׫7kvm۾ӭvEGGلD"y%w^ݾR5Xywuݺ|w|("~tђ%'NrrrzeI&xzxc|GTЏ>ܡwn{Gwr%v߻ve=y" 1|xEZ(wTnƭ[}#G\\\ WYw~yVoժݻvxP@`lu⥽GO̙g|X"z#,+B>vn{1L8x$m>.d?o^@ZVۼMUP0cW0Zmo|7aյKe15|QmiioTԭ)MSYOyydVxe? ",}W2Cԯ]kAGN;r|R^vicGy{zBE~݄OeB1#Gc^1a|11111111111111 M2.[=P>btTPF>.(#@NF[awJPεiEw6nX)+F8.} PᨯnMJ 4vY[gS_21@YLQhTКPy)0b"_HdcG$H{/?eeLIQH! ǎ=lbDF>0R~3*xu8nm2~9EeZ`|7 Cc_׮֑vܚeeb=CKD&T=jm:}'o;q*BE+ ,Nd>;*%Edc GQ2b!18 Zx8Odmi؊۸e-fҜ)4% :-6j|Zz?n±5!F#̌f@*%F+_A2,>g4Iɥ)JF>®}ȆY|p3OvDdcs˚d\.dS$Md;"21±رYh'50L>"# _6vdkB@eJ>b]hǬ%~lj}vc|Ǥ Ϫ)~ѱiX: bw6ɹQ]R:O=3kYg_[+*?]'TY:Ύ>թkI+[<ۿg]{lW|Xࠤk_865k&eYük}26XlSMA}T/~ZW򒇼7 *+.fĺsf5H~vf2kG3G֮yS{Y_muB%f/gBB°4Y]| 0 11ESˎ}L@ףCDtqa4d($jWcs_|;$Gxeب詾'>F~W=~k!:amDu&J#NFOe#HDDWn R &%3+. \"]aD""\8mjiG4p;\i>zbp1xlRFԓA\pq=4xXcǥRhMTplrÅbzAhJ6Z\ ]">xյaǎςz.&~[t56M&^Xʩa4UK]wژ_׮~<XD$EbQղ{)r,!źeD"|>"q3 $4wјfUJP$Ō0uWXL\%c*Db M-+f0\nA[iJHT|͚Mw^0 %j܂tz,7﷐QAlY%JԿUM"U"""&M6m׎~#xSK7 .:b]O~,ؼW:""?bOgU#""qTLs ztV]_"^_PIKl(Ժ" /;K%WVqvסǍ5a@!*yzQO(t-M86?mjX_a,sk;quKGxT=lT} 2ۋ| 6ICJߺV(IQDboA*x@$M2n"URNX?5*JE㺉œ )_OD_}ӊc"UDܖ"`!#^$fDDIh#v$6z>DDF V5dU@~4.#)FmbB IDAT1K{.#[+'XWۿk솥zKq)53Nj(1[ ߽pј;~E&+A+]%TG>֧}6`oz@:EӶΞ7_X}c2-l`YLl81*YTǐ\3kIP{`֓%FpcLR 6wH~q"R{v_ T)挜|ӥ4~m1뷜IfńN8]k4FC,)ajF}즮ߎۂcpi^cx+?ťy]kvI┽+ʃ6!"uVjeϢz|?uQo3}R?&[v&@"NoN\꓃{HU~xMޗ[VUD,岤J|,|Y!֮PjM0)sfvAwnY{-^4vb^8TS!]=<+V'8iŘ)CIJDr)o$wZ4_=Օ:Mt,KDFv'W2rece\Y(SGTU#tssFR\.gYt:Ʀ:N6#o< &A1sǵ*9&A?O^T5~\?}|ɚcs!{=ƒ_N= }#M}VҪo>GFu&N\ |}ֈ$ \qL=KV*Hť)uZKm"zΚ8@'m g䢆!/ೕ767k"JP5h(>MNP/xǼ_pi/QKC{+U]]l*yU?qǴ2|cEj4}MAnYaE14k_/Ϸ;s}dofsi甲ijl. VE۝\T̅f'7[rX zlf4*9=:"Tp#cSɘ*{y.usANZj4ՉȺh/ /[T>cMyk2/h,d G4.=VVux3h/1<LG^d6}7^{ϊp| )77ݐE8&B 7{hA3ud<c] ߗҔuCrTO'/(+1  A>}[J5)/Kk2-'}dhe#@%{{F[xV6C41slYM'/QnO|,O^\UF218T孛}*7}s>}g\:TmPHܗeYV*'c嫺aBh՚@>wLVrmک5Y[;QQ-V՞t95l=<$o zM͚ɋF*+&I±6"O:zE-'3F`cpb]~OGLo8awDD8_HL) "o|zP.osaeU ?<.}&L|el?q/.hd"^ś0`a!)ɹQ3su&X]T^i0ۉdic;h+ 7h{UoW@z66Cqt{7T?,y%-׎}l~ǹ+.Oky,kXea}21HZ@}FZ@$M2 C H,"RUJu+T G\4'*Ge]$_nVN:&Ÿ-T4VT\bq?G&^n\jW6C.;,6W?m̽qlݔL%QJ}Au[Ed^+([5:rq¢ B/ɛ ^5+,;ȆY3| )F+9Es9bf%ݖt2JE"!:Tlqްy=w;K-1+"kUul[<nʕEý\^Q)I)I d$'$g*;Th⸘Ż/'&ݴrkeƩVO9~.rE( Yl//Yz.ǿ{Nͷ"CN8r*c%՗&X.--l3UbRϊ>5kz3>L,۷Tl^3l׿gӞgz:V!Sq!a3̋.T DtJm>+U]]l{[^~>NJ-w$xt[Vx4˲_SŸ2/ODwm YcZ{aqxcySYA}z|>O<72|< MF4f wUdO]$Piz\m>udWCW@y˸5Ьh4,{~'(4,h(l~7<Py#DtQnJS^yGڋbc A+-N3rW_\^{Fy=[;P xML o7x@TgzTBdT.Fߗa8[P bȊcrk_+ q#[qfn1L  Vr c 2䡪c 6<*i6'4ͯIy{5'ss`B-9)b +`c0[-E}fAʂjۿbSɡ* _L9oKʂ k}RvWy&\?bHDаKOr^"&IW *oڮ'5uecJu^8xo3onW7ijiۯ!Ӎº<νH6 *M2&"1+PugWF>DZm|t"kw.y{ +iYWd/"r#-,! lWE3M5,h>ϲ,lC>~,",3,eSx<>O(>&<PQ Vh׶.f^Uc} FUYX'zˑ*uP61sg-%nV;-;?y5WWyۯ:i}"z\׼yLz-B1@V]BV!z.>^P2uۿ_߫!">F*c ,7,B0Zu!ѬˍʂuSÖ1VT籶hE?ZkXb)N3[nMЙKV6dWqVOw G6y}Z4OZzV@b6х\\%Q}>xޮG ed5\nڼm-)b*窿\X _H%"W:*kH@ &c2<40+sٝ{,;CC_rʩ31%7o.od+Vx*|ooFY\8|Yơ{DDU ۠^HOc|:fҸџ4j>qWM <޸Xo,P{uxݧ/-j{kvk3{cבofqsc-ߌ "@V 3Loh֯;7 w1קgzu<ܼmgݤS&8;w5nϻvkڼ} @@DnN}^.e{-^9Mh7.Wۓ[vlXY[_1| :^4ϯ榝2܅a%U}˳:&vZo:x@?WWs[RPXǟ<^DxQgh;Y\%%Mj0OciBM6G (6&_kzC>\]] ^zۋ j~?}?O2oth?jG'O~yWosk;,1Orrocw npPW,B}럤 x㢈F!"Fӵg_e37.8'ى{~Uçx% BD|c_| Zg=9~vuO mPOocy5?N;uz`@.]?q|\.WW"zuxpԄaFd"˲M뀏C'陣-x<>_M.MD<-UVX|e 1ıGW*O9w柋 [XX45zݼIEQ(@RMnZ\8&"jO=+T|/!:|wLeYzF h4:^>.l`B}\uydzX:31$jg !lf>D|/O&M}*opw`,KohɐAF׺E^m T=#rtx*J`JΉ֖&Wq淭.( [Gap[vlbPF>P.PDX{{fܒ+NwzڟWodddv3>6:ӭ`x<7~ߺL,L͹[+ yjy|\>sD5vի006ck *iPme]{}zKkdeeܻŵUfwl歽e{Qr1limksNbҧr$lt.#2˲Z "h4ڈ eZ,ЍF#2[ FOdtZop`?_]f=poP?OH&N?='=>m;k^&t&"V'oYcg42[gx mmkm\p L[0"SbmG2%s({XN((?1@eI;t:YM% 3KL%cЌ| PIô5Y7(l>"u -lI6cR^Fdԣ2Y7ȆAy&lYccʞ0B.7KȬv_lM2f5ᘈ*(;*nǸ2qJyKi*CwZwm{"30 e7p\5 Eլ Kfzl6d"ݫ] U ;m/?:<"&]SX/!)Y`GD65Ď s`Pb*fص{/Îb+ ʥȖ#L*+Ȧ `2"MF: =NaG\؎c tKT}QզkӛCJ@DJFWށ/9c"}$DdIfG Dر||%͛.y<wnTp.]:w.U&;qqqSҚ9s&k-IENDB`fastapi-0.110.3/docs/en/docs/img/deployment/deta/image03.png000066400000000000000000001467401461403617600234150ustar00rootroot00000000000000PNG  IHDRd?'PLTE988HFF---SSS***)))+++&%$'%%766#644}%PPP%/ILv.{0KP[5MUT7~CrHo%]%qi%v%D@b%w_CGGp/yA9w.b4X%lN9w~,S%gXCq/%'|/~B;%FCaNFC=i20ZOZiC/>mJ϶#Ɩ%IxH(8hL)IB@A(N$?v!""'VzVgUl/v%&& Cbi֑9>&`DRV֪n1`9l1xǁ/v'YKr{Iu(m>u9n;<ۯqb׽U"IDoP 2E{`6M*덶Y w=rde؏xU%*hey4IWlٟ;=JBÙotNt^xIl0hˍQȓVן[#nHc-8^u'_   @ 00`&` x^Z { h=s;Gz}{#z6-3xb`L}[ 'l>  0Z3:&X{2>e|%X6:9&X4bgƢg|j@˞`` &@ 0L 0v|*T)Kjb "M)62eXR2Hj>`;`3P`U+mWz\D~#ntcTv@( |nlQ R*Dt? 5Y[W@eBD ,ޥHFfˤ_DOE}~9}U~إҟ|S[~ouv3J5U̸sCq6zq64~P͌E&2/osyE_ίTw]/,oKi<\ѝdu }uyx?_K] g0<[/cg1O<~U,zM<..w.okY <-]]_MXܰzCaW[Q>j!kpr&'xR.,_[`wbE 8p_fzdbϝMM&`7,9tϾg;[?h|^;]|/ ;tw}vpkk}/]g,;t~ݳ_֞gN0m6 paoe疜|2r"vvE}WTaloK†fT)}gVkwvm#k^,]4i!">,q E$ Ge&-۽ ]-;Ȗylww_|dUYG_Xv_9jL4 +7ݶL]7}}UelZTEX־B}>HTFvܨĝVKZ~4t-Dp@ڴTo~ XZq A>Pp.g^{ÐOѲˇV@FjVZRyN槝̫nTH$N6 U1pNI7Sߢgة5 OÎS /ү*^U^;Rpv*瞬ïհwx+/ Kw:+da8_E aH4R\yc|mOVp۪P\v+ᄔrh$ȓ֑K?ZhGj/1(ߧ7o_"Uh6pdP(+d{4;_B..xJ Xtt",[x 53_YcJnuoWI5!Q=I 5 ^l <{^M&#F/F!cG_ȬX; VVT=Y+ x N//pH.&i T8 7,X ]2쥰a\TWgêLA_)hqz!3d8ui+lEշ!y]N$ƳV3M.1j'88'Ǚe+g]!WI ' ?UN5Y=|zŲK /’ gȋa]VJUdl;{>;/On\{>|ww[?ߪjiٲ%ӣqt'_Xޗw 3PTWv'S0<X+>L!g``-B6? @{[0Ħax00o"ax6?>oG}?#, po axA `E0Ã03"fx0fF?FA ` #` `fD0F3<3# `L0Ã&`D# O8oЎvKof;uqgFƒe3iq4X ÃWY4wvӎvw$Rk1ogDާOu;IGj:_ UWsw)hiރzp 8~ye\4c<o )hY^|eΈq6ٽڽ2gxGY]*&i)J=˾l;>(fNyܓ)GNga  M9Տqs& MJsy7 IL+;% ؉'RL \1Fqnh! ̌ P)ߑ}ӲйSނx6 q8sYL@8!nۼZj::p1wP~?z|ɷ̌ P!?CJ{[EfxgBo|t 7g\t:(U95m#J֚ks*vOgU{:.|w"Y^-uۜ].\hvpcYnM"{^wߢ<_RwǗX_<;Yi߾t~U}WY.vxLd:H'39HTVˮ;{xSq{]Ʉ5d/l 5g`k@y0p_6J Z}z~;2/47X NOu onV;"A`+- *g eպpF1WQ^V)оv~SY7LNE<,}_غ}@`8<8rXmp\q)F[zW\+ eW1~Q0nu:,'z#mŮiuP4e7r,+[5}%DUzj9V {zGfY嶚~?xxJ>P"݅5ww(L4mv(;)Ư6Uݗ 8/)AS^,fVK}ˊt%+x^  N{uq];͛{E{atOO^̓/ʗ&[5+ppL0W~i7< . ymzLx6=I/e!:U{5G`9?G0n(uV{!~2E\q^7=fZDV_[Ss1~LMN/w_źdGNZtvz[ "kX6/KгO7/ ݖbp[Gr{Dώx Z]$=ଥG `vEhk쿧9\WA R I/0Ep(R2H0& ?|8rl߮q}+||sjlj9yt*e IDATb#|j ܵa"_p_p0Dg)9;=]ᚣ=/.A40ـra[!88&p-nm0˾Me o޹po*؁wl-`˯˿WN[{fظߕ4l`F^a `  E237  ;0oX`/WB!+4+-ogTl+~:K=~߂_lyh11[A1~hs"s>-^WwKQ2 HUԀ%f?E yzUr_??~Z/0yC.D1eXdYki%JgL_ 0@)Aͳ2,\L Wԅ-L z{Q]fxKɁ#cb~x8<3EyH`+3~{UUU` 0#Xxpzn= ߞ_^b/ߎu_ v R(1':Kl2ms`Si0ieS26?|ϊв3cENg!*(dW  #X^~%xXֺVwKp5m^EyY!l uh? 9Yw& 0>܀:XR2cNʞ|]jC+X11?:t,"+%$-fsEtnw#j/E}(g|`f͈>G2/3A &0~aA_ـ`k؀ 1'cpP%iGl[E{pr /%Ӆ-r߿0RqpסLw<,=qELK Ug؀'x0ey;}>BGXW+4(V,lXi%) l<_lr0g078=?m7ؚ_K̀>*к^`u#//`:j? &Υik0"᷍ ;ޡ%*pA,zG?8'y0AmZZK2`9|$Oh X~Pn0hG_b lK8= ~1*l&pjCfKs)8pp|_|?"%N9yE7槍k nh4(1V+/u`8,:s$b^DHGb"=y)Bycga{.8`bɿ9\`ގ5W`*J^΀oBW\3:j+0ρ,oY4n9Vx 7#ZLl,vJH"z ze bo-o%_d9 $5},O@#v\E )!ֻ<_^|2_/bhG3VW`Ϋ p B wj$WDݴ"]Sv`k^*-͹ f F_?{B o̥R[[9?=Ϋg3G2<|5!KΘϷ$`7ON&d—o? SF6^n6|&H;?PVWHe%}Bů׃Ws7-ƙ__ 80B[T3EpeRӀE䯷 $mւ?=~jl >֌"z8l|~s2 ooMϷU\⿉_fl$dX9){it˜>7 ] X[<@@Xxg7 !,-`<7 I>nvՀ c~; x5`wrKpp%.+EaW/kD<QB^Ԃ"6K{(1V W9hAͤ,'}C" _9oNW),XmZ%F+3}.߄RQq^"%k "=;N "Zx27 {vFJKCwĖD0yٙB0*+"NU I`Փ%QJ V3BЋk&Drؕ_}Ffȁ%/03N_^  3AeV泷7oR9hj%3^q mXi/uK,hbaCx.qĶ rr}~ s4 &3 \_U7I[s'yVKм/H7ȪIYCr./N|1b e`\. ^6Fܬ sS̀qa#E߀{€h0w6ȋx(=uNP?̙b\ro{[W__G-ޑ/ @.CW~Eڞ Y7yXM v<7뉼$Kx{/7Ԭ3%]}9 ۢ^F̀h/)ԀYڅT7礡Y/VǑƙg)F 3_/+e!o~RF[ @X" X#xI?kv Z_E-X|=`#|h h_% 0[gŨLߔ*tac#Zƀ^E2``݀X}XDqΡje^_)t] <bF>V 6wFν2R~,nj4./xn.)iĵLoR:_&~ɷ>JW)"|hloZdTs`vf 2`j暍V{#`Rtէ{wINˬkeCHA:fȖ,=CXgO<]gfN PykӂhZ8)_Tipwk\@I#nRw^\ ^uN00 ҔnEQ2~erI}*Rp&II?s3v&;K€ys৕kA}3 oRa-Fᪿϖ+Gն8%xRa CtOr#XxUG*r8Ԁz+FsT}z_GWςROuKՎB)薺ՏϦ bj^Uۅ߫ۃ%YCp۬+WB43' m4\,Nn+U%NǤ“;)3յ(sh'"%S48uàiJ\)h .``Ge""ĺؑ|w1!&xD# W[Ɵ~oLǪhT>Ɖ24,L[3E 7%,6i8f)U3::`gM ~}|n`U f6+wF^{ wH{Nl>ڰ8¥\8kCAT{u)Dq8 X]1X"ģƊg#r| &{,RWi9 [[}S_28] h]XNԳL0䗏(pSLv#u}Bf%6C޹#m8|m# ?4aEN~#F`gޱc8Qj=Ч /[Cx4n+ x4Rʋqmp[ V6`}7濌?d0I`Qo@X"⴮0`2`=Nմf|0/k}Nzٹ>}iT|r`^^@=5RPF܀g4+]G€e 0} ˗*<4:!8DG`?6\NubW0j+ 4 vjH^ݽuVSez5k_9JHKCm0obQg;F$  >TZAmd!G:|( f(ɗ^lإx\|_e~fDGWU2l 2ʖղFyi¯v* X4bY 6Y\ wNgz5} #U^uwEXڂS: WV ~y42ܔ1 X\5^vGt܂ق'.e}7?Gs0T^s9]rY]8*; nM=ˋ>π;5}C]WrZpn' HJ~p^jqh 8UCph_$wG7n;8X_Q[F_Wd25iOp+%{VaɩH_TRUW/BJ &÷sfKYgŀ`(aY+pV n`?~L3Z^`Y4F=inC{Tko, |gpr_ 8WpV*lE CV#`%| -`]BI*`oL7 +;Q2 ]ˀ4amgr1pM MлaKzj jXM x9ɀS 82KDfp]}H4} t!,ll-`@!ν%6P ߅_xb9E L@rlS;c[_iQ2wk.ŵ/8 a&=`gn'{=fjGg+_JIB:UYb~pt%oGIވJ~ts#{~`?JUX a ڕu ؎q%[$}?y ow`$"| ߒW1xeHtl_2xGBWb0pGX=$4aKf\,| 6  Gj ١/nXdfx8kg@~4}w?dEU c߀{ppc& am2ǀ@53o5U<=cВۛ28U-6FGpr q ?C76p\/Tb25C_mGP!~o } oҀvcźa܈C//֧ߖǢ62`}g4@ƈC@}F =}ɀـR2X^{F]oc~=~Vkcl:0WX'*aEрWO 6{&Eξ%vg>s#Q9[ 4AWYK|''Gpl_ƃ]휉gg`{ _r\QX:Л?ֳٞɞKE`g ,KZlJP 3Yf+`iwww1_z 5dR ,G&9~iY&l7ppͻz oѪЀ h6}̶-/|n/4aXQ, {9K|h6G(ـ> v Vy*~g?/@?KG`wQn- IDATngA, 0DA{V^oL!tpTO_5 O'`G4t͍ ύ  Z«j;0-~W,Z3c Oӂ{"?>`lv~vgux*, o;u@ ZBn5{pVc 2Y =wT%x?S-f51< FLy)Ow_Zܫ!5wˀ_'JuV0y kJp:cl%K)] ZqpHCU+ ,tHG6_ 姹uI@n/kYABy-Iݯ4x1_+DС٫_Zu$x^ڀڳG{lk> }1JN~x'&?\^z~{gVgGgeKf4A6F9 ]E"p `./ k7Qݏ$)kl꒽>{h; m,Y5~5;B?p< OHP( 8_: ;]ТѤC |tෲe[pfNCFIk ذ7Bp m؀x,!Xb1k^/(0V3jkG >Ȁ۩3)l(hCRj)9r 4ml+{zWW2sA! 8~$G}9~o3%L?;;CNW8a'[|祐ů`!oh b5_Sg\|ouSn60#فp e_]%2sx \:2O~5Ǐ`׳0lNv]MX(ŢU Vh7]X9{4k)cy2ٽq໹E#|ReY|(d={ n\SCISz+W%5`->ᗾu(ـsx3=-hdv_y6MX)KXl15৅EV@u+8 31`xD)M9" 6Ic\Cx #lj2t  8`>Ȁ_V{B4 ,4l `w`;~-X}! =]8ta"DM XE.(P٫0wEjTL3sxN|ss,6aY^IAp% }6k΢ɞ;L2ʀt$N?G%Fl8PJDOfF?`j^x^m9ބI# ,рWK h3e 6Wp<=H4`i8"gLfMItY/!9W-N>.,߅A9ja {[EjLQ}-{)s5"<$x;c8_eoOI>xN eIp[!+R sƀhWĬ%#kp*L 5N&,2{媾rh t/B"X`Sn'oFjq_hXPGCNA7yo"ކ)]!xݮùS˟wkz8tUy#ǫu*mCB7-tY+^7pO@3UQ&,4`O"%>#)}vh _KRKp$ M8\ bḫ[[_QvU-.h[C#N*l*p%P#1r@װ xfxc рٷ=,4`G_lnxo=~A3w 4m"5xb00U_ī8;"IAKg2u\O) 7C!=ѷBĂW_ժBWA"ZT 9R $CCߣe{C[>%يԀ%f. `%#[)lЀ A_p&Gb[4`5/h\ܳM#]%xN'g:2D0n %&NN2j>?c3 "efr x L .+`m%hgY<}{nƝO܃L2η"s߄e÷bQZf5`&G*%s+7WlЉb3sxCσ26498Xq%~R^.4T 2)$cmJ)(Ԁ%b~+-GXA+=,Quۯ!x);%p]kI34y&,J_~ /^ āxGpoЀK *z&u=B&5'<Ԁ#o ½I! KgǺQE^Sfp; wsvhp}ɔnIh` ѭby=W6]5`q%e)(JJ(,D N9K׀ϩ3㽔9r5. MAN$Ge5q -4C70`q)?z2]XL+C-%?&p!XpHF w5]FpcֿK~PNk߹@[$_7 0W0K?飊qzs+۴>y  9g祟vsz͵Z$o;97`,`wf Ƨy :Ċ 9r.hf7_DdZYh.V0lrV+~v XfJ %A ̀b %Bs(^~7k4߯T4rw_|A5ZW#4`g/YT`l`x%٫9`sÀ:'0߅~3+}PeJ;' fcH,!B˱FfB#dXwwᑭr`^ ^16ASx`hC9Gs&Dpf*l?K:č'O, wfx{XR Cg5 )01`ʹLؙ=YHȃ<+SC`!B[j{˂5s?ܗWǯ `PB`c|!9!*`Z32)`A>&6˚O*¯y\^kһvg#ſa:o.e&,k3bgqu [ o n~fbU1`Yv9rKo^ ~mm 8D1eGo Ym~UVM.],zkbHٷG?w3b5R;Wv]v0Ʋdˮݤ .{n K EZ3v?Z0@{]sƐ{v>-v[ƄujHY$%sJYRߗ~dYXaU1(ONZcZzc!;٣#s`Z#t/ʖʀUAHgZD.n*IVMN2m fHuBW5bEkYw]^gvf턑xǷ.awipuQ ( L=IfhtO4t;XcpCL Ņ8E2TJALj 2GP p; Oˀq~%@ؗ}XSїESiz܇B6A-p=NҀg/t*ɻm9g]~M >?=wg h;v7(4bU]d.F10;; &輝śy^&0Ԁv C|mz8+;ˁCSߖ_Na@froX/]l!qh?À /" Fڊ0܁7;vйܱ%#OOfم݁;翝⇋_c.承Sj#G޴lZ}^%[aeIśf ?Nw(sO̘bh[㞅YoɲM6Y,M7Nk=e]d.~<m5(?\F f˲''M.B{!kbB0e_>U2T1`ܴ[f|a#lF`xH //MPnXˁ#WR0xs9?mvpt>]O;vLՠS&8 cG/Q؇`}RmEoMBmߠnُ%=fS\\|PKI:=0^_1j78c%0&O1X af@oc\^Ȯ0FhZӪHT I-=H2*B +*Uᅗjf< bB6]ȟ{=m-_规<%$*$9[ D@v ep&ӣݞ{wJWg΄!xUg}}b ]^h_==;çW4+?->w%ou6^Xba古96Z_LV>P?$՗_[3kpH IDAT+i{  C_N@s. 5Wo}sn.;6#&8j޾ r 5)5ѩ fѲu{sޅWY}[B ;3\:ޓ>׆D= W}A▯~k4's{=bI{91Z,&dK\L&w%0?hn41/}1ʾZx,6Y<ߦx[S'_BN5lw>{Ymc~3텼q7p_)Cs4[m҂o{AЛ.(4 ,&JU~ s~ѡXS A+>wJu**/&=O' 1Mvl?DBAK7NMbp)K`)'4of`D:i7*2~? @`蛩_D|%Jݬ(f@xV@gӤm~ Wm*VS8 gMi)4 ~T'zQh9`vRb%&.XX. 3"怽2 BEn?!0okGAw: 8#-}'[+֝cp<k5un&$g{߲Fb<) <2?PAQ?f8_hN@GWי`s@`]}x`|KƇpy`҉q ^iCzڳ ?n \a5t8*mH ` W- S8L ?C>6a:=k `FjŠ.x8'mof;`:+ocNʷZ̡4D@"Y#8cV#q_'RPtG "_1ߢ((k 'RW 1 n4OT Xe x?/}L0O`8wRXJO|43-4^<,XѴEɹ.~N00p hM>+ai. BБ+ұWTRVxV6X&& ̀v+8̵Cu$,&4p&)q t͋l:C8}x· ni C 2Bv CZ.MCR4 L;Y#=z̩U-5u9X0*E*oBh`0)Ok\Gbuw/΁arRgF!qQ QE3_eM}yBksQq: * ]i`=#܊!s]9p`QV ${ p+6WUeO5Y"!DRE<}0\״*+;{.Y] [56\UML^ L R, o%q-0MQt\]c~ {A*,Hq(‚ B;;l:g"Ц(0uݸJpԉ&Lkoǟ{I߀niEʸ$0 A0 Ua p^{ H]U?&@o)-YI#h/UBWD+Y(‚ qf7w.5̃^Φ蘾eIY:GUXeX?00怃&{KI9 K+EC\ # A N]54,멂΂Uv 0Ivb54pؔA0HG_Ha8EߔhQOa逩áp /Bv0E14Lbտ0;޴źceLL,(#UjE-( $":@E? &$ͣw-5;fx;~ `|ܥf5L@zo^|zq,G|! `@^/͋iG~Oy`$ld|}muUI4W,B{ThU[UhK2kHMl{'~=(N `.`4MsE ߄]"_͖iYVhsݝ pV"뽏ef؉ 0N1n?Wvu&i:^VضcTr5,wK<%_)Bv"}+VpN&Xe"cX"^ 4(zjֈ#29TRmqoSuW9W.n# XQFԜ\*v(K*&ۙ:JvQvjW8ZC`gB#0 V*ο]ȺWȜ W[ 9Vsŕ ׿yu׶FP MH# ZUu߮pp5&h8o{gUȖy3# XNLҭTOtj1Tl- 8ZtAEuWk X 0J/?0~SjJ* 9RWJ.<gQ '.o?:V\I$,5 ZUX2ݝ 8Le9=0~ݏQmjZ%^$^sU"WJ"9X/>ge#j^ eߖ)6V\I2$-ݹJ^>0F*g `_&k_(|Ǻ["`iО9G%RNL0zZzaGqW?p4جv/AX&ZG%d˺OqҤ i4LVqS)+9^Ml=e][?2V\IFQѳ8䁝Iִ,  X hn_- 'J1諵dh-JOΚwg4FOpO;3a z?bM xZr&7 k,!>]U{Sr[_T|d8+MTH/j 0 `.d?5..un (f*Z)p'(wo~Yv<`"c-uɫА/ǖ ^:gݵJ.Cz\a m#&`m%r-[M/^c"` xܯ뻠&9 KF x𩔨8nL=ه.^%嘀ánf%`UGD 4FpNʿ)Dʳʢ t#zawUٓ%yਗ਼f0> .'`)LcIj,1}TWr0 x_NZpN-OZKR-2h $><_͖ӟ1|%tu*!` eV(fel˯^(``fA2c`w8Bl1 Z5Tf= {8וYQN^ ^XӂZB1<.{34/^mޝVE+:`ORMGznNwZ˛'j4ːK W9Æ0 m #`@#`@00 #` #`@0 `@0lw'qmV=SoCL41`#`FF0 `  d(A0~0$S Kh{0d x(Q8iٓ `HbNBQb#"0d xuH !vc%=O !]VGn@hæ0 `@#`@  0F0 `@|[ss{9;{&ŧYzN<jC7<~U+0<[/*2G3ߨ&{]̼‹QlXs>ѭxOT/G0 `33*~>3 xw/엳/Y>_peNghjk]}{]W>3-h.SO[gh>pX,ʹwtA  ONdּ٫fWe=[*C>(TlN0$-u6` |__-?xr?*Ֆyg@7$` yObԾc0F1oUyw2,։;TAZHuV˲[1 ֱxvV&[ۧu^vR~F  쯆8Gt/z[h ]-НWt[8'GdQ<|W4aTRذ¢aּG)P{5ZEN<-~Pl>2YۊpD?UA(hOg?"Wrp+EڃW+ۍFAhQժ_oih=wޙ2F'svP ~ T,yŊlrk^'=K#v]ogvtf|n FP(- DTm?c{<hmm_첌73+{A8w7=ZugXg/vv}KΥƄ.I SǀS \/qUm4m*g`WD/52[!#ՖXpI*7qhM; - sMo}|-R9Ӈ]ۧE;ko5ϞRNdyB9n-V&R}K?ΖR9Z0:#>3{??%Up= *eDW(pɌդLD;P6YlNJ8[8_pVMPFEeEkݧ2?sR{w-#*~/c[V(i93 `qGC9WXAGΒP2$cuֈ,Q*Y%1h ߏt(KJG&471~&|l:14c$L/QYqIǓ:$KJ[(*t$djFuYscK,@j0^(ESXԢ` h5 "Uhٛۺ0HW81=NUjAp"wgrSЈ`z0KGCs٤x_b`Ig& +FV%pTEy LƒW,N)fV[AL:>f,69 yд+QVRMXFųԆE Ne\E9fIiw˧B]'#篒MX`zBkv)fcjX6lbBh]>?L`~d`%)@IsP1\Rj_;~93uvI0<90^Vf[,!/7j:͢.XB u_ o%s`/g`zk]b0GqʥԐ}=ZL+b3\bq6pq IDATn:@9MjOjjEoh5&&ʆ N\EYGbZ$bI|-;Z髎.R.X/ʿ.t'/$"ϓ|k\,S; a;x vuwj`s+ݓEݿSZxjؤ{/J'%Q?>qu:HjbGdЈ){aP߈йHL!f]R Wp rq沨ʖO<+LThù3 7EMNe\EYS}:|d2_ zmim/}kYj7ΟqtNqb꺘e*?/V C_N}%ƟFi_0Cբ?vU=`! 0;bQ/-]` ! ````!!!! ` ! !````!!! ` ` ! ``~_!`5;WeD?2Zr[; C `dzCvr $:G?ă>~PH{'=`GVۿA˓O9J4>Y?l}p9gv`zLfGs;8wpOk!:̲ʿ>Zw~#`5zF~b%MbQ J{Ӿ0:Z j[]^\B+_~i:AӭTNNC1rT֫N <}$ܲCzg"1_}0OI("7Vo%–F6MWWct!cDE$Aͳ9` FӦ#םͱ0:K2wO(Nxnx6/~gZY8z ,C&}ADvr1agČ/0qU1{Y<M:՝t',5;M'HjR~Gx)p[BmտI)qu$G]W<דWz>Z}´֪UN/Jtuؽ4~oW5AupUqsKFra&K+I:ɗQ1f~TƝqP* Wժ jBa]fښ]}W?D<*4MD67,{M鍬,r8mVth2GH~Di~2=Rbkvk++}JSWYc"_Z+iҼ]6{6KTHǹlŭH_(hfYU?k: +`L9뇏.ae/O;Ug8^m[1C};/Ȉq`5hd޺ j'v?#)`KކE6=c,RO~7t*i]nn֫˦V\#CLMZ% 9ljZG`&0zU鎦79:q1`"4x^bpZe󫱤ױ6q`:[*}' z>Vzۭ͂'v vux4]i.Żڋav|r?O*>o,~6/IK^3N W!`uk.L+[.qP[蒖gj&HQ,دƟ*qh?Rme\K"gvY_뵆59Ll]O;:ěp{^0 `xe.mWNo%qv&J2oJ[GAGf{ Q^<>ontI~Y 8)fl``1[Q9Qdt3qtm$W8ʘ9 GAX{MVH]?lc\wn/[rSN$%R^k67w࠼ȪN9yֺ[ 26k'VJ22LRvp.nn.ǥ 6[f"p\php ֙<[.*E+oVn{R]y<`)4F*MХѤh[\2p)Q^[iդz:O'`Γ\ ڽRwuR8aeIdIw'ZUk+B}rz',L~U){',s->7 p─cyrw*ʏS~{'pfmFڊ65NX֭҇'SZCr+,,-2V_7r\VEB'߀-7Ak+5z|G-?P©PsP=AوʽRa~J QrdOUw~Kha 3  0F0 `@0 `@#`@ #` 0 `0 `@#`@FT 0 ` 0 `@#`@#`   0 ` 0 `@0 `@0F   0 ` I?η.I[a?`ax yCC x0Tti ޶/C#` oY!9E%Dްmo7 `am{ .'<Ţ;OF^`q EެM 4 =G4Fl8,#`@@ 0 0 `0 `@#`@ ` #` 0 `@0 `@0@  0FP0 ` 8wV95¢R: <7}_xmAc|SI0 `\tٮR1Gxhᠳov#x9j;>&g/`N"` x/i܁ 1Pu9Ԕ[r7ZPd|"E-KJAZ [8]#BKSٻ޶<}hx𫘫_NF X|2] _"l}uFUj_rfHƮ";oE!&(z؈CJ\Mz9:#`=^F]I6&Qc>-:FiqUηc}@;1Z _-b9;n 8sq:vF-om &_R)=OSM:??:4N~<,JK< XNyt]|*Zxs!bQ]p}>L {K^X?x.w x}m;.H>ʫWiJc͇mi: xNk H x!l~1oJF?\nVz/zv6߿oq 8 89Fmf6N>Fo۫i4us!5<9B+ 8 ^5u'^sfo,˯n\twQ?Z4^n#`)A+Aߕ?.%f,6]dG xqRZ$o&q Q/H7/ xMm47Ć?Ң)ܓ.C£&),$|&bμ 8!go|zKKm &WA7gqBjtCqO788H 8߈cg<>Ѯ|8L7կ lnq CH WLptO)_2}Xn#`0&rm5N%q3u{k \pa>C,Wph1~w$Z~la[O_ji/ƳE WW5U.>W/%b}0'mtُ uo^]jgx\UЇ/{(>|V? +v1= /cx3o>CZ~z)绕rPGtE g1.JW.xeL!IiЮO e:h KGk/6!^K +=y?5[0B,)} `t /N [ @ `&`A ` &` L @ `0@L `   `00@ `0000 00AAL 0 ALAA   (OUB `=fUfF `<_Mfnw]roKTbRgPG{ 8#`8g5e4Kf7uN Z Ϋ`6\$*WK[nw7-u&J `|zeyu{ Ey2f3&' &໹ͲGU^gXYH)kQNN4My쌀A|swYm;qj3٬lf9 VqGӳClN =o+ÌvhYOL+'l\G޳^CVh:Ǔx>,t.BN1n)9~5XT|^Mζ{<)> f! ɰaiUBEr|y/o֟1H Cz7GgٮNfg}g & XM\YPGyȃVFh^])_?<ɢ$BxQ|Y多07IeNᬻmSyW_B*Ŋ0v&ueU`pH3.[9S%`gpR9i_OpП{4ZdRUҦ3 xޝI@OOrXwjI x|ZGA\ʕ94O)AfWcpTZNmg`$! s!Nkkf!4-jM 4v+'Xn~1ep9'i_0ƉX\\B^^\$2~/R(M~Ҷ!Hإ\LDr[gU}Xo'ԇ ;_/^+j3h7,Zx/t:OFB&`|e8Vpuw!L T]o x77RWN){0x07i]DCY0oxz8~ֲx!OL `T&`00A00 0 ALAL:A `L ` L @ `0@ `00  `00@ `0&k.v=6q lG m#-A}<]#ľB 0 v&0Y6;߿&`<[߆.՟?} #0$0 8==&`N@J(mxfF=__R {|gjoeuͻ?od]U\l aM>*}>'t޸j)\X `a %ىʡ{* _[}˔|+«.j^e UʬRK՛hIn j瀀0 ʔBoC-`EAUXu:U`CX24@,%KBׁ.ok5-r@ËyI?I%ۺ'Ҳ;mm IDAT"*l#kvw{Mi|.ʤmEG׺DkNMyV^o %l_D[[1@o'ȹV yy½k?t=osV>mUnr^ -FmU2ۜ:.o}r|y2rWegsslC\I2/40\k\ب7y͝^KaA3,{uYӃ'`p&O K—$,aIT>~O#]ݒ͝\i Wߋ.gp'asz;pM@߇=|+a\ڽh8Ҋ µq?>+}KraoK꺴}N0 `pozCX!3pz^,6"|Eam5CX !,p|0 `,K͕~^ȴ^C_,z5on~J_C,[`#`@0].)i >R%(URQ7Z@0S>Sxs8א0 `-K}0CoCsF<0#`@@z%G00̸LՓxo_-/?.~rC Xz?aVs0oP,!< x~|F/A0jHA%>pX4aW7Lkt. ` 3!`/c eTrAav0{<Rt/İÁg80 QWB!J\"` _0 `x"/F <ο#`@@ 0 )%T9R~'۟tcW3 `@tη}f^Zʭ4q-[9-tㇹt&l~y$LOP_]r^1n^3PzIM4~9b:\^I/+)|Ԕ?~WZ"Sji%_#Ʒ28XDʣ(ӂFp5(QF ?⋁m>Fdr?i{\bdžZo{s00 g򣔑~͔56b[Sx&nKhxG  @]u4a$-Xz1GbNj"n"Gj@Uqׂđ1۵qx8MͨG{ =q.mL?`dzv;kHqLon!`@LZQpfnOelu1dD Fy5`Dekrhfto@-$VOo7͞;xm} >tCx]C: i#bh/#`@xiUT˒jWԳ5- Y u I`d*ˆt\0 ?CHG AF}f/Ѽ;O%R;fsQ.uٱ =P5t@}" ؂#ꮧ*)RYT<x+]Zj_NOvoE.bZf_&U@SbGx6 2Ww$9\ŝ%cirn9e _ YuѲ#`@X X{\H 엞l\uSZhdX "V&F"J\{''j]h|էi|/+W]P6h t:in4Lvt]Ԩe[ҫާ5UW9! #g?5:M {I\Liܣ-MQ2qښk*W$6w3N 멻5Ձ+@̫%TcӲf`~FFjVɄ;H}L@VNKk8izU !Hq.p bc0d0 YOWRUGImo8v[W9UuoyU54ZJ_N02g{чy`z `[ QO:ó|( ҔE:+'5@,YՁ.Urת$T%U/tE,D-bhPq_30Ĭ lwp#Mޒ.  ʛ0J 6Cų$AS0ؕiikBTMR9qg+j2 e|mf\vEk}kS~j 1AFVf-- ٟ7O!#Sa@1)%D _3Pc2[I>,hy"cd- `ۘ'=fd@[gc"k-,g s}7CW_x-Ki ͖2M?`x9eU( .} xt<Ut jyM iSdvZgr^9wڟy o{SbpBsvMc~p& s}Ho{fg?pA 36jw*Q4 T@{V%IM)#ȾRZNŸK1aKg'0j\Y:q\Z"-`WyIN `-`Wș>$s+aI\`;qL+lʧKź'y1*IN>hHpހ^;bU8rA`;42Eڲw%Ue U,:VA, GpWO%Q)w'MFiu Aonu[gXj7XvpF߄m˅<s۶,ǒ3 - 6<,&!nCbNTНq\ ^Mx/pB[tn-Eifhc"44Re>DNV^*xY.8TIn)_#0[&#q$5-8^,N!!d }؈rmxkK,0lbʜcDQT|׻HE);I$3 zf2p%eQq@\  XN(C1 h 9eHi_ LN a,i C36(bxq\[[,v0CQy{(Džؕ .a!r8- MhD.)n4hO .BT^=]{3ZǤfndZ 6s7UR)% Å,rl* kpvE0{/3Itt)8JA@X>}J!#cA%wi.~/k E /KӉ [Mf"W r1=:3SFFVE g˝̾#Z۽?Uk#trM]i6Yg T}"tؾ{eNn25Er[~* E~]PV݋uL x; i^ UD͜E4{ojE+7pUVحsW=-*]!'%[/>v)%9E*`ľ7/9mclD|S|:cnq$F tMhL4Is{z\ 36U=0Pw{ۦ*x\FQ+upA?ut Qt5#<< c~boƶ6] {8u8AcBp͡bn.9M|$/[[K}reN#;|cب1="R}'/ON~9i&ႆ zr ,d6FU-vVteAm7cF;.?Y4uE|'8 i-sĢ>1+0J[]g϶EC0 |{ |K{nXfkC^4} *5L7mJЯ534 W 8xYYnF\4j/LuuH; Ȍ7s,U`BnhE\Pf,aU`C{ ]AtVsCPs. 1fC0r%hn^МՅw{; sZ'QP߂p-#> U8tX h4Yz^s[8[qfNwOwY0wN']>M!n A] Ct,'9`!x,!ݑ 3KNf׈  AХl`ِ`zQAsw`z$޹`zΪx CPW G Mk? OG uWM^0hU[k0 =^ol~ڿ 3𨃠)[t0 A C0A0C0  CC0CC0 A  A C0A0C0A0  C0CC0 A  A ڏ@ ;=wnW_aC uHn^vV_:9̓ף?/4y/_/6Lm~Y]]oyv V7p4<<+{ `{vy" S{|_n\o]F~~YJ] wAoQYSy| x}+UOgsg.m[,aa .hk?Kg4/~\ -(7 5·O/0;>>>XI;ӱ;/{e ;,``zio3䓣7XðRW@|UdGෟ?׿_Z|5Oi8#Ԅ9Goy6_$䫪Ӷm}Ǩ'G۲u4\M=]xU_we;6<;>u^E(vOBA2-d,YHɟ{cwvfv%;GҦR#G։/nlVu1>(׎g{TXledaGKUFi'n*jR;Qagtu. i8{۳r;V!U֕7έ.T#`qN3纅ХnNtxՒ}rϮWp=y<5ǕGJڕɗEHg,v+]@oQ+3"_)#Uu}gQ6DfҵyܳaWW',=H&J 2^18ydq6.f+4 Bc}ptj*?v5NRU_d=ZdԜlt!˰CsH50ܫ; Vڶg([lHYnMfP_~f*O%F7_=[ A^2UQݴT*UV $n~T,O z{**1J9 Vb9ԋ{<ǔ::kD1jTGR2y=]dUDFbrKS djnH^(, V,U%n7v5~o3t\v)_BN:&j b`ospW6 X/|::0/˞>Mֽ*].fT8==ɷozz}66nv'#[P=|w:ws瀏 wH|_ 2]jͱ^#`-wQ7<^moӞ{nӐU7B`ֲ0 `lfMZ'`ݟՅ$-PMڑAM&U'gJ(/8G1QDSYN*c֪yhnY tQToZ*';IWFIKU)sXF׋y+`oSYBn6A]k"V<^-ut[8v8 Yܞ`~ S{[ԉ#`+Fqte̋Pi$:b:+N-bshP^uAR/`q?γCXduitvy|:/ #<+S=[zfKk0TIYv< -8ec׵*`qʟ]mnj =w!WEva SϾg!`@8|#`6GM19&Ej|-|,I#n쌀[Ԇ٥'`x,p) ]#`yD=~pE2(l˽7Zy"KS@kݷi2 ',Lva SOL09<޵BN-7T怏Ou#`t"L;/&> ƁnY)yS+mPv5VWW$zQKӨ&Cs̠=WylBup,իkݷirb\epǩ?rΧ&C˻\iD)pY*5Dv|aMǾm& uWAy:+[:Zl8Z;Z]͹H]mPf s$+2x5Jc"lDO CNUG;VA{u5 M!U|Vv"`=w!Gf08u1#`;Va/TˠgӅԋ؈TVJX*UwffeIR]?_\6$4KLHnA#=ĆD0q[ӛ X3Tb2UvG+-w\έI'iֹ4 S]NQ6=f?U/C0nڝ[{!pwuѰ3ʾ]L'aɎxb_IDžu+̆<:*բ;O²y@Z=۩34rīn.2%T6Vf,4ۣ#+`[Fsێõozu-Jeۼ+~, Ys;lCGo2F;ZCTtѢ6=,- ]wȻ c6;7;Ҡ[`ϨDy kÃq~VA}Tܦxm>FHʷ]3ͬ) ` F EQSW|_@ 0 `@0 `@F   0 ` 0 `@0 `@#`@@0 0|~rޗs|O0y_!h`  0 0 ` 0 `@0 `@#`@  0 0 `@0 `@0 `@F   0 G+{0 ~?_35 V 1 >ׯw_k+` >źԯ; guߗo_̣׌B|_m0*__5nBltQ:Fz۷//Dp0-NsmM0VodE af0+`ُϟhܞ@ +G%&hMt0<\XzA!? L&7~ X4;QPͧCxϤ|?C`Xxf~v0[X}Ahe탸;VcѢ٦׎+VV׿,6|5̋?m3l,)LF)=vRKK sIPJBrI["mm+ɲ3+3c|'o8'xVzVÍ͍2Purx͢؏gf|]pa+{ыQ\FNDy _bYݽs,8,~'y pkq^ ] ?BGó,Nf?}6VlEr|$wy~(_Yk:sq\z_OOCzIiޛDa[/s}9 yVtQt#v'?_^w|p#K~rx|9^߿Z~)",~ˡUVY8zQ p~(OY^L8S«GV?$j&Ǘ9kރI{"[óbO.߿>+) 8^(&9yxnVᠵ805ӟ?7Skß,X5/1yp,Qm*wK^۹,Qnın^poCoeyy\߭ 8^HWA/K7i`cЏNIv|-|`VX>m|(=oιhFXNF >*6{NX^ahoҠ?z1A$o'~! 8۹hm5>fZy|u{a|j\+>tا⽠oja߫q i /Mޟ] ۟#G#̯=b-ϯ_-˗xxo7ռܲj'6G`* .{%{3Wγ%8=wͭ< ߹e=\߽U#hHF=β ~讑 0_*^ FNǢ@`|F`@F``F`@```j\T`a'nm)XL L>O"ZM 0 py NQhX;@ SXX+N 0\/?"[`_; Yʎ,+Tb_aXS ~N`@~`$x_kΜ9s̙96gΜ9s*`3```@@```@@```@@```@@``kΜ9s̙96gΜ9s*`3```@@```@@```@@```@@``kΜ9s̙96gΜ9s*`3```@@```@@```@@```@@``kΜ9s̙96gΜ9s*`3```@@```@@```@:4A  \UEA? 00   00 '+I6N/_CIENDB`fastapi-0.110.3/docs/en/docs/img/deployment/deta/image04.png000066400000000000000000001411401461403617600234030ustar00rootroot00000000000000PNG  IHDRd?'PLTE20/SSS---***)))+++!&%$>==(nyu|| v .)g t+# y2448Ol)ؐЉTr0/p,&Jf};HӌrR])k@[Da9D̯XZy5;`8###f׷&&&h'a#e6m&=M߲؄L,M,n4W*8Aއ`~h5w2<xIE-R,b)0r3H^'j5ds%í6>Ôֿ7,V>-78t@|ո:}0aFvG3KӱوGpLFCG5pWޡd2KLF Bz" ,j'oj~!6Sqxwv 5H[J|փC]]^*Cjii._Y>j E0N2H0.668P. LW;h9U,֛$Pgn9+kԜbt7wÑ<9&CI8‚Y4{}r1 OV Xx`+7HH#+I26ã ~ IDATxjIXQ7̂ bri5 0 :,2MCGs a{`[nYl-KgfcY-6U'^;BE7AOzwu96M8C` h66*Zy9:8w@s|o`@M`vQ p?) @ 0`0` &ՋWo#`7 =+l5pi-^Wgg/^WS㴖*I-K|\HjL?>"gfixv>=={9; 3p !q"iBέxdMX&`8PP7JD;.{Ĩ-?0- 8  M_߶J;maNt)djwcDƬyy:=f]_zb9*$D|bˍmVnטM޳D'IXTJ-̚mn[I'^+2!xvEGH!> pm#b :I(|-T<1.l:?[٨TJ2ꅠ[. w+b`1^RamkG[NB<˽lU=7w,cws> U+TBeE62Ѧqr`]-](ZiϺy|I:`f#U?KQ%9` (uupw "/6I>#o*&ۨQV*?fz}4S/LeD-.JyM!NKQl-t9_pպG|t5q"|51uL+K XE^Tnn'6[x. <+r&&| <#/g 0xݹ/4P`p`v`L};q *h.z`0 0k2>4kH Qx4et#X5:`4dg!M=# @ 0L 0` `&xfRj6 R`pp~j)\J;c iD|NRL p61ŷοZyv3 yg^d_xoM& I;Ti!Bv!8uڥb\@=sbrc1{~.Z==nқf;t+ىK)dܲ7z:3z3R-ܛf|cJ[օP}^؊{{h] ,*se퀙9:ERLoq]R/`&LoZ`4Xh>' SUTZj޲96sH:*n6U@VO- Q.u4|w@)B"Ո8!{'I߬`tRm& p?G Zཟ=_ԆA8͖_R(=֓OYn,w{?ܹpb,~_\5CX_p_Ë7NlmzypDmuob=r@WAҒ^uUkUQzzZ̴nbi?8Z*?i/oU~hMq\l͹\|/|U?[P qV\D?Ǿʝ*lim[K8>Bu(]ty_ClE4\t7a0L+ mf9D5/묺iZ'@o`Ke[qc9U_sʉsU1@z^G'Lϱ+qNL`5hbu܊L/U?l[Ǫp.|5:xUQ"}˖?ro{ ?{]~vO*S[nQ.ՓD/swVH{oE7KCЂ3eϳ2ހq \=p7HXNmWoV=?j9_#/fW=|Lc5{kP|.t^>T -I:sh/_3u 8H"J ,qxEX^u"Cך!Nmy=7悔щ߸zkYU*h_-G➚ }_}YD7k?&c#nMD~0} `QC?~#"e4)/jߡ!J\bo#.19MQc:Mpn8kn#U|xsKqޟ5r75b$َY]+N7Kxy% {,rQDewWZ=a?tl?|^NYꮜ& A_Fܸ%95X׃^CJoVӐT n3K;vj>v nǭX L>UrV25]9Pi(~mln.g\9`"/QBJoV qcG/uO fڍƝM\1ĠVyFƯi[ h{g4$3GlF/s쟆TwO'Ns]?K+oOrxUEl苺xұ siH럄$s a%L)7r)J5ёȋ^U7o%w`w$;`#j{rW}Z9˖UXί1e(Ok2.̲Kyō3Bl鞜ɶiE_C]t$Wc˻"`vG| u>b ӼzR `ΫCjnްmyOU6ؐG.C)?lY[޴gfП?w;x.$#𲮄fbSiY `kSժhꨘN/'U2v1S9VukZkA^ :dS:^3='_Bpd+(_a8m,[/ }lp5:IFV]x0 0L`&00b{{u0    f `|B؎؎؎햽c؎؎؎Vui2ܣeufۣLe{I=C=ˬ #G=k]zH` 8n=H=Yf=znOE=C=ˬ^Գ{06oO&dv,e:QZƠ#wKPO&aP2`  ffP #|fP #|fP #C0I@SYU؎햴]+krz޻wOc ݙ˻r=YfV-%{YϥԓN^z[,JbٟC]f8!^`j "zuDrwGnz4UJ':Uǯz}8!~?n=pZG޻`xYObw$;AzO/z3w)p$}#);FB&IHH!`NV:E O`?|C;1!< ~Apo5+8 'oLcxzD;2߼Qoި^ ܻy?pcyeDz+90Ƭ´oA2}istŒw_oͻ`?Un_~8&w-˫-| K i~3טNϷ{D{j|X5!;fIBvz7h璜Vz Z Lnvl9U>zR >X~.(/x z#bo}̍Qm,WexXDo }z08<2=ɢwO7 *u>;$]jWb0m8hjnx ?o$cWc] )1oObZ=5 /7wxy)<$prnBs.6 q~Uꂧ{]p'N^ٳ M.EFU _6#~#G`ܝv;83jO i7A{bV>lYaq)ۊg$#5$V8Hھ¨RaD0!MPaRrv?ȼ?=XJ0a>|yߥ_ _ELSi҃ϦI:,~W<zfJsUa.w6A_k:ȱaRf9 3&/;!$93`QN~"ֳU~e7?orD`c)+Malx=ik1zc}nH(# [=?%߈U`+,G,|Qߗ )C'L`!gs*1&8r"MW]80 ]#_eeT++1#YoŹv>_^ZZT 083`n3SXa"HΙ r6ѷy d '2e ڧ}Ɂy /{hGh;bm&yv9ʊ}×֢BO%ˌ>WI,_w{2l5]g0C/X ~CG`%p$SycR f88dh\<$m ,᎘({ym{,|iBgY F@-%9. F!#2yw߈J mC,Ũ! D7|e&~!ΎD$Vo `SVj ɩE3\ֹ$=X`,/E3 kK~w5"4Sm% +ne)# IDATIZ`*~YhYC=&x6\Yp;5#}ZM?zʅ p.\2LC.>bi;i,H\rWe\dv\̚nH=a@VF糷 XƛR"F2)܆܆RZpu[KaW# !C N3ak=ufVu0KA7Es< 9@azϧ#WKߛ50+ŠR#z/ΣjUOjZhHK_~9JLHv{n 3Ѯ~I9sY0qUh7h<Vӯ@ZZ4Tvpx}Dupd!nQe #j__E읞>)'''t-c+ .}G]I[* J -$8R..伃ׯ?N.?B?rfwQ~qW̻8 J4.y>#oRc,W,4'XSFh iUfZ* 8,gW]ejeft[W}ϣ@nLSœnܾ}{{caSz[pIW|x!8ͫ4G0_ A=~#e/O?O~׾uq H`M4ώqw)_,m%ŀKm:"[0nn*ՠ6נzw췉,NՏ4ϥ=w'۩9:32 . $㯦9v*,\^ (_2ߣ" fr7%/'Os\|~K (C, 9R+仐#> 1{;.a7( k:UdѸz< L !~o}|̌]-%pI=_Wxg<%kh%\(.0?`__G wx'4fVxV_ո3LqE?%,#'Oxg΂K{{{h kBϣ21F//ȗWf%R0ap'OvVܯ%v;'? ϩFpN+"s1;ר,hkLZ,Ͷt2Ê"Lٸ+2Z㮦- ItJ D_VB``  e3%?9ޙ{ 83\܏s|95x xcwS?6+ -Ѻ 1kaAQozLw~ʀ9e><(W) c>&:Xl$H1 4CJ$IF_߾7ݗn)]A7a!?0 0/^_! dp|ova d}R#)My+/!1LAsveIO"Zkp>׀+԰J@7>ʀg>8s~ nˀUצrt-XSK[upVۅ8] E߃ޖ+?ྐ}peA/?<]X@!~9'O׸ 9ğ8P/,G] zP؋K~;.s1ċ|0otayNތ!H얂~܀5`ʘ9h`n,X85ہ 8\?\[NL6,DbCVQIBφ4>5Bئw. 8n߀?n&y/~;Yh_ Q W?jηu>>f|^T.U*/zv>CJ}x &iMh ڣsHfbe1I-8_t`O@C .C],~߂x_r\)hj?hWi X!XuATK5C9J-6>3r-wˀRðNb7ؿoJ~ #E]$%UJ <5  317m 8|4ŵG<|;kF{y]E8C2m8`gk37`$ ylV`X`?Ϗ_/l%)E`megPq<}Rk<=ǧB8h`ÀI! +%A'{ goXyF q/o>C߇Ze 0qcz\M֮p=XYcF o؅Q8·(G ` +xjV3 h 5`C} Kr+Хaj-B2;#!\?.`IsSpE*0m6wf[Nt57Ӡ0hf,bՀ׿{Oߋ `>h<`LD4 r86*'jGsᢏ_aAq> E/ځKs vjm8, + WdV`lYpƿYR_}f4 ^3W!v7``r*y$E?=* MtBL%r.Ή.,kg;B&N|pt˕_'L}VnUc~_\4cX׀e4u~y_7;,:}q?_3,/3ɓ#zM+phGt_~;$ExւYeH>V6$8 dOXb pUG[\wG?_YVh:zjSZP0,>aT!Lt< ~Ӿ`mlm nj{nKt[ %GP4|ZĤ|qz|-F"ߑE`Q GO_z L)tdQ  mIJv#p$\K*01`#0CpRNbWx~Ӹ)SD0p{q>WmѯE;E(0 5.b0/C 8XY4rha5_N&íXp#7|vړkwsy]kF֤ Iǯdep\k%Wڂe, hڃEj e.[ YχnLh砛!8]X8']If[ &ۜss</ _MX+U0ր07>.硰[ ~>Kp>&xEط I `pJCGyNy{%MW|OX7a|؟y\q X"1r`ՊE\Y\+6 d 0E'NbB:m.% ӥ"ʗ͆_14#_A䷨bw8y!XL6|?/`A`,.fϋ[|(~h_%8*W`Kfjҁ]/Jjv '68ϳrɂoy<{\[N*[a9DpgAM CD8H@h`ы544d@deQk7%M`_Rn~I!*p~Ůٍߩ^hوr#LtD|>M*fGPϊȞGSՒf zO_XlܸH FևpT< xGYuT2;ek 9,oS%ae:7="NaH 9S tCg*n,_} N[`MW!-|rVT`&Xk0 úv|o‚R`$0㮢//^Aa[I?AWp ܀"z(jp&&Kʆ" &9{<G5 .O: ˆ`>RLJ-n+yRI!>ۏߗ&,> Uׂ`|9G޶ ,*J0Fyq}ݔ$Sabi1$tbNj ;6fHG`0 1,$^\+x2[֌"d(ܲ`^T`_NN}4%~s9H4]\#ߣVbj^Y ,20) ^7-7e W Gkx`.OEy+?]r_p@bBlW, <S %3(Q̝H<zА3z 5wGkQ&RBwh+R-wWCGcdJ{ZN&O/9Yz :_q^l|/_qW X\p/A^ɖY^pJv]1A}_/UZTC~`?`h@{0LAږ_$`+[ t gXHjց=gtT gs|7y!x!`|y4V /oM{nDw(Xw( O9Ee |W˪T4=9/pX__9=׀ XB~y:r.qx8ښ^5c* 6asy<V܍Dfh{0$1 sүy Šv. j>;*5Re#4|!Yws,ǵq|/X `u;_v,GvO#YPY,ĮC`~Nf%)CS@U-h׽xnv&ӆ6O}ryE*&`09 | zYWҵ`_' sag70ĢX݉"؉$=C#ڀpT|vEk_{'C$?G,gYFn<W!(,};]YY bj`_`=.zoV~yw8ڿ}GEvf ق^7N؟>+o^<{ I2rQ+C}ivIJVSXc=rc*m1#j-jK_ ֳ?J@;qgʋx~%KyZЫ/2)]CWoY!\( ,*<|{d)`gYvHVsA .<&D=?_W, `! jkyYa?G_)%Pg` x%DXe`5*0mQWQQ•vSS,o %`x/NHs<>Mƹ/+~wt a0f!lv!x$4jyZݍ`/з `0JO_c(o3l n෭_o%c֣- J`kYf ד78(= \=3bp޿L6>cB;L3B13_րj|C0 f*_jP5~!xg /7~G2/Pߜ)Ama0~>;/Inkleటϗv5n}Ƌ MCLr X o?"#Xpax( GƝd&`]m߼9^l|쓋V CC//9SX }\{5u-\ۖWoXQ~M_,FWJgpï@vF0 ~923hA#WS#T30,hݐL b 98go8 ߡeXD{izx~>iPY >{ -h_xnC>%]7"- ls:yc~k<ڊ=OSVT i S~0 Lgn`z"Y֛d~_`q_/Tۀ#jY˿nc[d5b/[+Q~y)mn ~7ʱm}MS}=&s#Yf0_ !|t$-~kUl2m?W?eozM{-_Vc*;`S)P# SXPFHF:4_W;/<+0'[1X<i,c %̷ < xܹCH`!g^$+rptGTG 8p'$`&.f5ё$fkNjz IDAT][# á;=z $+YMÀU;@8+ INتjqՇ>_Zu| -`hwN!Iӯӂ7'&y`peIƝ ^b$w'mՅ&o hc+83`/J`FΝw:΄'6tp0 HŞbOOqp4S2Y" 8ڵ $VykNeNǴH_|o{[>9~m0 -37Z n NRZ_-U@+g #"I< NA_odP=lBpOE`Z$-")}Q&+ \o.IkvߥŝLaN b5pgůnALឞɞo;-pG#)AO$`-Cp.k i3⺬z#_qz7 {gU?ab8bUY馊0L,BB>5Jdf AaBۛ.Q0;a(;Hpۍo{s/^D"yEFWN U`/V,;W~oH)D01`] .FvCwn]+\ KЀ ZC)j_ؗ6CwmQ`2IhdQzbU#9=d!%8>a  q vڀmBv;w<2{w ĥ7hI" F)Un NgтC337-UX^;^|1 t 鑷ۮ$Cp w03C0/O>WBυ~N}?0׻ZXpU] {>&,mZʰs$}9P9I{=@' y`i_DKҀ%u)w`WCKï07 ^kn}mؤ̀#u?[g),짗ӳP,Ucpe/w\VѕʫKh9muWD X+ }y *])p[ZL wzu} ~.ܜs6V2Эvh{;e jLomP$ M/Z hRN 8˿yU={C]֤7 ,:gwt4AgVUzg nh-%S `KS>GS 5K7+V*tu%1c2 k5` iRǁ0=bUgdc_~s(; _HzkA6a9'2s M:v'E cNA,%&$NGU{^G~/~~}|3Lu2>K. ^ȵ Y-Z6#r<{өB XRx}_sx]lZrJ<3?W|ޫd2!%JĽ;`)/x3+]:l pX|hdCz [N%KްC d}{[aof*;`'XW Dt`ߗ " ! )cةsTߐhA`PZv 8|{- N>V| \(.C;־XT_%~ ^R/įucI+Sw \u3!tP0]O6;N#Y5^"U(}csQK0[ed1V̋$۠,w7B3XyBM ;'qbLgN|4~Pتv/BM s l*V4iz75,{_ lB, A XvD{r_|`Ɋ+S,f+sxIBwlߢ02ʣgaH Z^A x*]ė INyFUuY s;N}sٜ.x:S씤a/BC6,L$Q<6 l)aO' p^y^~^*>4|7L~рKrN:oTfrm^=0 [_oT`C. ?9T4`@.X>j%qV9Bs Mtćj}vJD{vWoҨ*@XbX]ТlK-G 8$+w2:00EEd)PkׯSlNM.J{G<\Aˀs, 29rP[BWT + K,ῳwBzJcek# bp*TЋmH(,+#MH$Lp7/p~3рR0 ou//p|,KwRЂ33U wv+ 6Gh/`([!OI=X :N1`{o_πl)J-}A 00j3t|<_58B!GRL 8:pAv\9AaXIlٳ Y/ ~9?`)=D9}Ϻ,: jEu@o9t ZOl28 /|;;Hc_堜O1Āͪ,{XҀ/8D,/A_-9擦D5MӀws xF#.D4|t`ws !6R9 QC+J|| c*đN0p }hc_o;P.e_Іԫ`P` SoqGniD-zj'w,A=H9 j$0'pL<\"I R_ t)n\p$ز`1 ~DW) T"X'+Oڀ2JgW1A5`_ل AJFAsx45`I :`s s:†ׂaI/#y| ٴĕ4tʢ2ThbPoBt B#ВAI"TE cA\Gz @AF*2?EC99=Uv]8aM駟5_ߢ2 vi )q3 bGG^).z2tfR&Sv's  []Uw/$^u i pbt9Ԁ. u$0\Hp:9ARꗀAe S^n5yJi?oKU!&DpvA;0+0"VTPoJ s@#jW"\r x74}ƒoـK=8u ݸVCZ~[h$,G GE Wt?7 _uڕe0&8G21R+#q %!rʸ`?Rۯ`?.G^/7?3~uiB' }`3J>}*؀}^#5Hahߺfyֳ"`@*p6qkD`dpl2gq|K3iX:@=LAef.ENaA9/X5\t[A"ϋ6gS`EEޏxxHg&u`K~> Y]c+5C`9^Z7o_s7-Z%OJpJo&?;%# 3 ~kn ؤ *jJojֿSW8h%M)gp k}f, x܄e.,R/0 xmX e@Bg5,>~ M]Wʿʀ)]*k7rp⤟}N1/7.Uǰ T_^C٦=E/<㯔.ih]_^W:6h9&.}9+ ¹\Ź؞A$ÿ]|RUxbt 5zр'IHؾ//vSD^?8hl׊mMQ郛$;f 7ME/<m&333H83gn_b0_0ލ)h4෽c%;~ހ.WZ^.,*U;L_~A/"hׯkjݭH/'W+%S&jGξb,0"{\ '8p`V݇M_/V :W74 du0{zzZfcԊ75mmە.x ,H??s2Ј_N?+%6 E%»D0g2 _#8\ Xx70.)={q|SQH"ow_[ cztXH+]\tfg;غܙXU=N.aϦ,G<gV 7|G"ŒЫp ¯ +"o[r-8ߦ"~'s`|L` _'me4P 1f a5%W g),Φ;}ɀ!Od01` ?9ktХˇDw&h_H@+>*Sq`oժ_nF vsqX/U*A+ m.עf=}`q#xg:= f+",oS׷F} ij `BpJ  8_h|-ښQaEcZD,κ;tA !kWǣ#8b_q3`FN `jGJD/+X>G _ ǻ96c%uM֣o.2gR]:pA.̹D:= :pZz_\[ jxe6O׆|Կ۟Iۦʷ`Mˬ*sX6c9Чph:aaX[ x YW+b E܁ րUـK_ap2PD Πg"J:!'z aڝvx5}o`7߉8%Bp͛ {¨7՛7DҚ^VU 7*P Nkg''ۈ!i҆MO ,4),Rήj,pwMkY?¤[5j mBba& ҈`Ď b-q! YΐEAoP EP À(q!~YAp/0{ϹV:W9OEAνW//y9}WpQ $IMBpEE06 IDATBNxbMR>]4u|B4dO"vI/d;r]p^@{qea\-XJͼ~/ah_À<<(gm~W+ xxX ܷwϓhK1`PjP\>*7' O(ks_)Fu CXX}\$J*pࢎkր7~6'A̜/hBX-[_q֌hzPcƓGK~uJ=&S sWwVN~oDV8 `4Egnf9̞ xI,!G֟{b++nΟbjI|F] ĝ-\7b"0M$ [x㥗O5}z |8N|zu}1׀1{+u@KHp)V^N5YJ}KA?,X;<Ư;ķԵ"hSp~t)_ Ɵ~hD8cVk 3x )kY̝-~|&XD+<]7Bؐ(</ Ahޕ<[# `o%!,R`D }`;([ >zC \`]> &%O* I^O_ޯd(~|V *#jx߁_>s)4Ce<}u#N=~jKc〾ms7ϓ1ᇡfok 4@s}[Gn];Ƣ`k :O@~i<>o`0j5r҄`p\M`$p1 Vg=|UwX#8f=bA>2,8J7/X>a_o`E1~Vp#X XoL , {L_ }A/Gl2[12+:zs0a!~-7X7~"~Q TɀЙ;U;h_( kG$(Aw:΀ZO*Ҽo#X+pG돢Y*W^,/ .)+}kl? 4x1%@d0}#_zC6B?VbY4X%ϋY,88; -fyY4wnna-+f[V .[1` ~4R`GSmo{jR?`n9_ſ@kwTCi\,V.0tog W;>pvݯ$7 Tqo-Hwa>Lـ:^Z|#3l#iQ<N Wۮnp8}|;LZ7ғXr9pf#^w;vWt60tCYC` LM[xQgS`gO^Ҁ|ؕg/ЛG `5}E_'mA`6`+` < !.G1t",#|]Qb_?}ǽ/$-Ħh #LA҄/Op``N!ncp+Ξ} 5 (V֟xc;;xy}wG/]wD`/?l0+<@^3 <{r|Q#8< 5؎Es ű|5}wQZM!8+g]"n BwwzTtC'ـEWj+_=sDvw?~7Zגy @WM~1L wѾ 1`@M=ƼNW`KjUOyi`Pb[1.sxm+ڣƀoo 1}[/S d* AR u`m峈~ef-O߈x%! 8WGϑw^s $vUݮ4`ٳ 3CNϔXЇ0#K` ot_S5E4rw 6V2XodM]W~55}rPM p`1ǀ -s;WWץF] l3~E/ ʁ-> r50pQG.GM]B 8`8xJ/TUZ A_s_Fp "hc@t,sNl{f7ݛ:0x+y''Ԟ-8>&{?e>0[p*A 8.#Je\2Viq/]2``7%Rh\'݁{wz^'J-I`O QG~Υ, ` ?LyҌ;1iH`ǫlɦA  F$6/-0 H&0'dM98VFSRTI BC|{f[+R1a~_ $5h0~ԁ؛=د_LA e#ވC"`5!Z WW­pkmA>̽?jW$4-tV+#/V{ s=C~Ɯ1`1x|ϸϦ~םyWqӴC+I3LTEpׄuWx^2$qOҀnZꨢcEpās6gŠL ޯө% d= Q`NB'1`Q⿑8K L*ށ c? :`ݏ5k+KrW)|j4t XuB?W;|^E!~o7oG\̢_-XHBoOX6/&~Nc "x뀶~1`0xRQ׀= Na ^I .69@/_rV$ ihs ViKVQI|k,G~L`8R5SJg_ndpUyjշO )sгwN`!GaI:^g-w,пNQ=%a:U򻧧g"l#Fk"X4mx(nT%T .G.i/K ‚ '3l;s}Ӓ5`pVO[b!p g}nR ZE<R|l1[`wtVq3?#oO >-|89{{BE+>fo2J` |{3U߃u}D!%ߌ_:v  dok:54&ڀg}DGcFG| Uyo01`; x2׃eVaa|NM#4PvxȦ#-cK]2VF z]yEˀ?k0]EϘJoEӵFHg/c)6a<܁xXnFVBOݷ'ǧ@W jO! ]a.+p"VKՒHa~[޽^ͷ35tI>s ۡ5L߶//)N_黎)ӘT&EB& FO1KBK#1Z$228eDu* J$ob XxJBݐ2.v gR~7& _zގX#[vwv0t0 v!pwOyLp` 8mSЊ_>(D^`SΠM61x],G3(`"aѻDZF'  Vk7m(iLn _G/ fbzv;]GpXlh躺瑮Ppxg!]Z3Q+SΦX XL`sJb'߇^w`,GA—l :)Φx k/0 lĸۍoT6yhM`)q Q0f{t2ܣr8une }}[1+ ئJ?yA+wՁ1Xf,L x1@\9\D1`$N€+_BC,>3}?,1͐fU` VϺ,,t nzpZ 3Ab!i>U6l<67=N,Ќ_"`aldaxpx;BzV+QN `9+ x`pS&L , m FH}M`FGo`L~-8i׀N=oԀqmE_FyÆlKK~38I ؛[+?m%IFڱD( h  [3fQ`{{q_X%sD!EZKn{elwWwWUw~f50Goշ"3A&(Z>~r$)A ]+Ѿ1'< ,;Uj>@_e o.7ygpd[)?RmH bp1bĒN^- _'Oĭڐ ꦗg{~2ŚշOK Z{bGKZlxoZi`paI,n[柏+pw `؝RI0U!X:"%o#@+ttȀE+bV @.3)sgOL`+3nغ#OIBBS+4fq@;wB)ܣBn,z:gRN;`*DSlՆT&Pc e@1pՙILL`I`6{;wI* C m&`JQmnүo 4~坥`0&X3%`PJ<1 @0"x&>km,0Aϴ{+{YO(h+T!]&s@%Jdd~~:\N` V* 9h`AjMAky.ѡ ,N_ ~%W >,|͢#O~5 ֽH2n7p꫾txC_CVs_//4o]jW Z I4}+'}$0|ZJ`@g2L_'E^J`{7?՛eԈaE?)2Wăb8YrQ/X( 4 M-Q|)-A IDATI:ÂLI摁Dᐌ+n&h`!}Anv`_釆X2V-N `π[-"rV =P v&`!~l)3JO ų) pKτyrX˘>,czYh[\ 'I%<l5 e X%F:օ_g6G,5b:0_$BK !#5J `T~x[a ,Ֆ_maS0Ow 4oi!Xǯ/o3# u&/B XSF\x L60Ps/T}<㯆pO&A`ZMpdtTտr]sE agegR'.%&pl5pT89M@Vm4= |[bXͲ/b$҉&TmP CqքjV |U:H |5qu"YSVwXL_@s%~KPغԀC3 (3 *~cr0Lہ0vc +Ok:ׁwW+y{Bxe{20V Iz|G^'NNzCքxpM/{g蕆a0v "W4`idƥ*-6v7S5n\ΟXzy?hѬl2˚@.羟w͓7J}^_fY8k`[V픣qr)`&mcO88A4tA}! 37o tp#ȼEM)kSܞ -]=.a /p}%}йq yqO\Aq7!L/)Dr&{êN岒#qIz !: `5onZ|$T0.|)Dl Io:](Ԃ7QZ&3 X+b/|Ml`76 FeFʊW}&R^%~4 0[B+Hn®Sz-5 IKvkV0"PE {4aeOMO HT*¯}&R X`-p2xT.&+{x[>BIgL RY]Pt|՟_5S(.`COD2{``qD.2^N;.0\Bf*`u4rW|s88A/e.Q ϯedp+2!,4@c;0!Dx%lVT M*Z@KuB+,pi,/@k27XdR² RMCK8ڎ%NLF `B׭Rb !\kf\dp[!y gvnG+`K9 H PaۧNƯE8 l =m40 \`g63#zڰ$ FRlz& y<Op|D?X->~n9 rX$FL4aoC^"yvY5K g;x `a4^rV􊸁X~Me Q,(!\.9~2XmV  LqNpjc MmTƯ% <8ET%`q `y6t wWj/JR X@ >^Mq'ITr ̟h_? F#uAjkY4>E0P0E08DK`BuKHXk 7kNC ApF P1z}W~㷀 q(`*[ LЎ%9,9Þ`5e)4Xw7}_.D,"tA 'aZ^chc&p40@+f"j`p M kOAE` q8 8b :}-nuLI`MD.p _nCXO|< IڰJ+`k$(}/4}/IkBo t&pXCI m8O-жC+`֍0VyrXdINеWQ&LBXہVM<{-op +_8vHK&p+ Um̝L̗Vn ݃X< w+0@$|/ } }6p&Ah Xl"QMכcMr =8;%3lsJ^bj`5KU'h[H9EB7g7awJ;j;($R9"r#˧ϓQQXAU0(70/@k#n"%Ah<6CrNObZՆT0"p&ptLxXWU$ =L=cYp͠2|[djveƜOa1.BX.``73?k X>el2kB ;BHv } ^7h7n@ \} Vj| RG \ 3q _^Ah`H%2QLa}K`gg^CoG~ 8pBn`]0( Lڐ N+Ē7K)piWwos_|m` MBX WšSX5+`h u5gEڳ E=s}X) ba!{ c4X>073l +k}w!ŷ Oֿal'-`gfzXNN,L0mąMBXKbD } ~W(]Y% v ~?zp*J,__"o z %ϔE/BF&4o=`$*sї ߅UI K6%:hL ]$[a=`7ީMx8dW=C`Nl]`i= h`0-A#\ ^=?;l %0E(`8N4 !]GrTQݰ x~"xmFW_~[a}5X(%:053M$$R@3,MWH;oI,0W+(-X|I䮤O \1e{8,[2vYh*"BtkHG]C^cpo 88Up'h.sFt ^A"kU 3ʰJ)`_~ GM\' .$UW ̠=M7(%jum@C LUJxjMv,]`rXAZ G.sNOZjB cc( HdL<}<`_C ~@H,&A$p" *཰nR.VLA-#R1h73h`E_Q Wil~i|xE H_& }#hN+|!;R#%&~ )+`RN; SX5+hp`<^_g&0A7MZNJa72 ,ACgl^Cj-$C ;w[ 19WA=`~"&R#6ЏO oQGyBЭ2 N[6JAs WA9cf >T(p@ 1E9 ``|FH`$ׂurK3{YJB:+`Hx=Ah{N׾ |1 `wP` tP(W \$sr@l6h vO-)]\@oN,o` w03'ҥt*(n!" EYfH_ '-el=`QKw6uQ 1蟊)#<1L΃BτU# Ϣ?cvGn# =)hWÑ*)u??>ݳTp#[, ApU2?[_ O1hLBz}a.'VEXkv2V8M(e .+oC@{Z8ЀI$`(W&p<@Mм"%M<)w~mdWgG -,a)l !i! -Ra84?@.e) t)1eb(/CPjżĀ@>h$ d b=Ώ;GH{Nb[ν33sνg&G'ǟWNcXJ`|ޢʊyF[,KK)[ D_:!4ǐA~r*u8kc?rq3AT<* (P V(~G)˓wc;B> ^d!2Уfr2GB|5' YCf!++Cӿ3`Ed-sY \/7yoS_ Csp~E ?С} 2a;_q8?O#UXW"х(#0$+Wb$tdX* 6ˍ `IR. ۋp4z0 C8ϿڟORDZ2&փ[9Oo;kAًW6#3~- Swϻ.^u(ztx&p([ %X;?Z~" :Z@?[C8|3_ fIDATpw!̽NAF3rs:o2f G~9w[@hS?{ /iA0y!3,#݃hhAFCC㈈Ah`A0FCC㈈Ah`A0FCC?`0GA!0v #-wt{Qh`A0sv4 G`40 9+K 8?`e2ʎY 8?`t2"~J `[=0Wr9\f/ *mqF@mJIvܛR;8XՇ-KRO^LBQ m\F>HB6 AԍxiG9!ƾݘw ꏱӬKscJu+(9}MtĒ{\OC0ڂL:\T#%ͫζNL_5fdOMY򰑺LT6Ic~k1\;&=" k3P| xwk~{D-.~(1O Ps!&8G~#UO*j7 .@#*!,Yc{թS*GN}/ڲHOlAgf,pJloϩy#EtJZ^qTKx e7 `ZO2Kv t0pa*Һ^+4|o Efm*&d^= 0|D0\!\nρ0muFRǏdY^NB$>IW +'#3gkjQ.6){I򺮲.'Aᡬ=P>Oۑ^%ueG{+qJ0|yS%&*2*dK<ڷ^:Wֵ62RJFɚP*ΆVk%]z!4vd?^J[W*T5d4x GL)? +W#5 TS`FA+'0Δˉg`ͭ) ط6Y)놠Ǜ-Lkofg`d,+d\^2koz}9sïlBY酠%خw!/܍hO<Y1dU%CDcwsEH>`aPOATқ`rm:-qmH MB-cpb׊FH0SK<>"` X&VN9wwϯ韛D73u/7n#,h\U<*'?zE~>ly3yuu.y|N(Woֿyta?}߷>`7y~xx<Ϸgm<:?`oD`4?0D=X=%'&써G=Hh= 1>;Q=X=#D=z Yֶ "= rє>(KYx3Jw[uvv=Vxf7uWAz|xdXݔzlq_@7x-۬`og'cmVڞz |ɺ8 u9z<gjG]p)Ii:~f9z<'ַ8:s@TY'e=vqu 7GrRϋQ_'aXE֞)aUϋQ8I d2/OanQOz]fN ᦜ $ipyx<%']wR6fg=/sVx[xԓ_'h K`xa&up%xeX{BTEXe O_t2] <^U<{E}hVdUd)lڇOuysrQ\h=[/[Xյ3} ~sϳ@";| Jsͷ`{Bt a{ݲзngCDf@ \ ~G?/lvƾ]u2L Y;J}<RC5Xc`p'u`N垛u a,N; V>/Jio;vivܛuHӮ`yNBU]U*JD0?,`C Ut*G`hY38N`Я{t&$7?#-BO@!% ym) f+步X0Yep& 8xUYIQ` qX0w砎bh-0H|7C;]Гp_j`ݽ(xn-AVj,!nY CļbhE>NuGxHHЋ"Vqz zsslv$B^fC˫vnG2>;#9p?!`o)TC`` i $fқGrH`H0*:]je$0 is] R;NgE;kv%hW_v* oDF0JH"ލa l; QI`#S);)B׹4%J@#`# FHf$Hoڌ]RKi\ԖB@z^QZ EB[ 4bcB,HB7k^JfF i`H bs ZL3 D,{ yfBH FLwz DEb,N;KЮ|^$N$#Lh@" { 9bfp+қ-\ ,kgBC` :,u\(!p;^`/!0$][ iL˅\ ˝ Jp%‰o0j4g40A_H3 D e 6 \ `HF]] HdY|0 AN\eYᏆ,:] X~O_?1@I>VjNtvgN&0t:Nkwt:n>NtvgN&0t:Nkwt:n>NtvgN&0t:Nkwt:n>NtvgN&0_v5mۙ( >0NB8{: BrȒ wl56io<&M׵ oOU3gΜ9s=cΜ9s#T9s̙3gs1̙3g1 oOU3gΜ9s=cΜ9s#T9s̙3gs1̙3g1 GOu^h(0o*0/k#$X_P`޼,7 V^O`7}K`@7>^݉=h{;9.vڋ-vڋ`F``F@``@`X`F@`|}0^\\n&'{-:Pו<-ot?b"O pooqB1^ij©<%mn ;B/G/Hӫ|!T*׀yF)|wfvGw@,mUe~n l8Be' 4w9sEq[%p\\©32b 6-6 NKn2< zJapn_r_w>8CHq SNG-fHtgkmg^ztTO";~9$=M9o~yo )n|tMj]ްlR7NzswQ 4@Hc07x.{I=wFu#=4Ě6Fi8KI㧓a|lt&SLzIs) :Cx {۶y-Rx;!))6$<-zGŪjaa(aEyx|\[[F p)g4R_`0 00# 0 0 00< (/7 f Oԁl& |rn z*ٴ[i bb?7ӛ 04 4`f 0@[` f/86θAǵ`4#1nq]'ɫgM\o>l`@_-3P~@Q_ 838;?EúIENDB`fastapi-0.110.3/docs/en/docs/img/deployment/deta/image05.png000066400000000000000000001005521461403617600234060ustar00rootroot00000000000000PNG  IHDR\9tEXtSoftwarewww.inkscape.org< pHYs2PLTE+++SSSDDD***)))---a&&&;AQ$$$k888,,,CCC}OOP444"""(((III%%%BBB`_`RQRdcdWVWihjuuu>>>111[Z[QR\ĀppqPVhd\RR{zy...y~<- cs-֥֮$p'9אlЏKC;`=:* {SUJ+jƠ11=?ǣ23ct \`ƃGn5C>m׷9"-w[yX3 gFw=ϣZR#M}}\pgvWˤ0W:PO\}<8~%ap+CTM> 3c S޿N4X-t;@]k6^;Z<< %k1ܭ )ZS]t>{* kK;HoY|׋cgk @1X- ӏ#IYCƬIRh;߭KG`j,<=`\VV{0M4\Of>Bc53nr̙`l[}"_*̟w2W`xvz~^DwC5rɅ_<-˒{ěd~!_Eܚ8IX;:e@y{h֕)K NVql3c xb4v#k8͋ 3ý=*=.ǓUY}4:xܽfx}p4oTS1lIG>KO ;,]=}=Vu[>F7 nR}?yz [d@4*ۚʯ@uSKskae ^cCmt{!ׇIOЃBU{$KO+m0Npxe;͹? cd̫@`pa{OzoL٨ ^o ĴZK[4Ŗi 1ܲQLʫ FQ>vU/Т" {~Ha.JՄī iy^:O0/|%?p-C3^[Ʒ2:8:^<M﷾<33ץH/:)^#g{.=vgJ 6U[@6W)q5sڶ#a><&_#>̮2_Y43wm?/M:7kB'C]Ǭls_χ+3&CzAqzq ]exjсղglO%@>lZfu~7U5'4gKjR%.B&llk\0m]yӻa麾}5|E\oニI27#FraFt }&\_Ey1tO~'؅%7+uI |_fB {.#>/)Lh?7}5o7&sI lݼVA'7y`h4[O[[;V67k8r|'@S`sno߇a߽ڞ6S fV]oƕ$ѣDחGH|)WY/ps5ĊDtj;ng)bXz&|JL=FT3 `qt' &nYlu4_ vrx৺ߘbYX +E{v!5F2?`i.mPb"IWNj]7ӡE&Y */8|2oV^7zOl )ݸI^o:}KF5O+lf .{=l?D^:awdOj1O>MA>Ӊ4;!/M=("{,a6Kv=XlXza1O*>GQ9v0bp60t@_ X@PnVSIu0fn^:.:/HidGn*vhlSu;e7~Did5--`ҟ?4QձU,~z*"IrG_D.#04)O؍,)[(Էθ崜Ggsq:&VeN{ 2e3? _k9_Qa8dI%/cWuȀ=tN|^Λ8l{%lE1ʨMW 438Oi?`32-v$*ѡخFݛn{Q.|涻p.Sw28 d"?M% >/KT$D_ ( AΌ11{Mr^M̌z>s1]If \]s],0}BXŊ@C:@ e3x00ו̨k#T0vt tzOP_UE 5@uRQTB_giBAf_!Ǝ'twL:AW#kFfTkd( |#o!KLP-OHb{6ma5#bbm#Ij\WeӒ@P|2im~3 @i=SzU)N&ꂲε̚*@$YE@J|3 @wD{#][beg`mSMCc)0QoX|kpweR֧4 %k0}SPzHEѫҁ`3VIpfW`朋 |*G`)[}NGkzΎۈ֪姩mC 08lwã{h5{"@\{:gX W,9Jt+=? ! eįa.(C57'h9_%n{MUל&˸w*~#n:(?NlԪlSoƆƖvQ:c]zUcCv]~GPhd E:9$Y@ܷhLyȘGn-prO6_zS 5%ѸƯ W8CQ{rc8F "L)yAN~kEr@.M@8=XUE)M}|O}U ǂŎ|YG2 .j9̂CM͒ug3:qr7 ٜ@9e \-!.L>w&Jʟǎ\afݔHça[MQQ}dҒ7*mq1h7?jJ@ 0~\ u}"LX7ܗB\aMOQZ5^&Q?_,P|` %%$lEݨvtxNꢔaHRPT-o!')0V> SQ$<&;ǓcS7FS ?%2)7{?vZ@WM$GUoLK@2o~aD0+Ztn&̔Էf &C`?\l\("@6))'%,a`͆*\0="771~v"<dKUY|e鑞@Kjt+C|ڇJ;thٵ=y?[j39ttj2`V X@wD9>`ҰAr@xf܌DE5,Z@3j?ÁV˽8(X]P%?`Փ2CiR$5žuEFF;~11,5M@Z5o3PVH AѲ2@_Q@~=ɶAWt̲ ] 1`nUKR)BwPз`F F^XƲA5s;Iд:_|OzT.U\eB:0E&¦C:rىDbNJeN?GGt d,k 28XomR_4] 31:. ,0Ȍ/r'f;9%9vmَ&ϕ#XzQ59k6 PK?l`X}|-H ["pn{,a=nωGKv `c>JrrqoOgP Y |ZHm d;{LJ y] ۟sO x$c KC.]x.Ee=QB@5+a*DST.u9h.+jƝvaW`"iD)g1=6uNg*9"iəI!GIqcBlsàK"8T6PQzJ㤼([ 6T!hm4!j 3+EɜϞL}xhNqyK׳^j*a$7&ϙo(T"D@EQ㍅2.quFr!N:K#/6g\p%+7zy_@<o|] |ɋ2F7kW ;~#XU7^~C1ZM\tR83yN[ݺ\'AQI٪[_ 4nvhMN"d!T, &&\ JKv>칢s%`sc;"{bzm:FYpy `8'E>.t%>EgOZ=:\_kZXlE*"߭@|2oN{3`{.hݚ]Ot89X$k>;u ZMXAin>d]שl+#1XҮ]N jP8n"juau$) 1/?SQ !~@()nZDlՑ0jPObZ;DWҕEŷ%p62;}zk0J "@@+/+LP{v1Ы3Z";3BDh WgNesj't^T8Q9'Ω!@@@@@@@@@       ;j^]79=Ws|@ uKS3.5ԫw@h 3R_cVW.2-.4˗ CEx#@xzqvff&`2?q[cftu\^YY)VV]Ǫ sXfs{ɺ~wnVRnu_|߽PmZeYs=|`|j])?Y޸=_78a\Y-̟ ;kLמhAFߖsB٫;7Y9tnqa߷uZn\=%,îZP~xF̎}GO?|ŒyqpK'ژg h׷?tns7~orr/\KǕcEѳjԧZx7_wz7^kݭc*iOytawGPw1MiߤL&qWVre/%*1(!s=&eA⩻jWb vl43i )I(x;Nʂ|>8};$>Iu|̌7R*` I<д|>bt3cn| -GHn&dX"-YҞ&qnLGYLޮzda n-ͭ9.+`Ó 6؝6:1lnɍQ*Q$JMYjB_d(X`1џͷ=qx5vk8F.b|a:`Čb7<v t 8 E|g&Zҏwa֪uY'kP¹FR.-`Q"7kyxAP/.NoZv_X%&Z-v %1 }}lJ PJq+ ]?|$)xrp8ƮV-Ҟ8H_sPM{l{s :^+NjՂT@Viӈ~2^ۈu29ĞIv*3 !0ГP5 xVZj4<.3v3)Jd @+79Jokz7\nݺwܽ&m06@w r2 7}RJU`o*>zS%=F F? J ˼ ) iy9 9KdpVP?gPδiZ0?ޙ~}FxBz<+|Qyhr)QWu?fK|f)/.Z@/_6 ;; Ni:ڑj1vHmJFv8ب`ؗ.w?34O1!>"@ߓ? ( z4,;.$l6 Ȏ>H\@(x!IV$:*#\KP` r 3KhOI4Fe4,'@'JVQB4*QhPHK89t$I&%>jhJ t;Rn?=A!#XڿrAǶf<#@ʇ F$Q1CON?ەT@W[.]Os  ;Ưݴ/({/!%UN4}cׄ:&U-[`w nU&_[S J<3`;"Μ8sN`K9D;w,ХnڷTiCVVwlW7c*HΖ*L 򱰡/pFt1[o }D`;UO&Q-l VZw;P_?;mv;PayWH炽qX&w'aslWuMc|:Ʈ*O@ @G`'w!rDžypXpRs i%?K_H/ǒ6 lCvjcgW'՞$EJ-=!sO7qŗp\ԙݽmhKfgf}g.{~}zN<>&.{^/ wzH밼7/>&>{+kd2Wm &|O W'W=sݮ?Ν{ꓻY}ǫ/??Gf+ M-KMo?|텟[?Wrt7w?x7ȶ}o1œoy^n0 Hүڲ;lm[lM}n-CpZA_o+\@  @dzsW ۛ㣧}<pm@0[68 F[a&{o -/iV*rFe~[v&+ewt_i$ٲoN}LhfG;H|nG"lݘ]L>ʏ6)6I>iLnR:ޜ?Ԏ R(?:2LFkp`wRe~o-ƚs``yRY '^,•JH}*oKMVF7jPgx|y5w|v/dT#t3S>; ojND#0>ѱtHÉóRTK ,4-7+I+lYo<5P2P4fgε^_i (ܹT gb?Ә@s~q6)',fF jzD?W+Ͷ Ѓfyk +4NA JrLv Í(Զֶr(Tf h4 .ȒbSR^lěg6ZD g&KٷSAA}Xn@tX?\.vdf˧oi0)-fv?LG,ncR>]Mȏ6/Oln(ύ6gۗH6SWrJrh#loӣ۲/Vn&I2# zgsk{a=o`Xj'*K̶Owԓo?l;YnГ?^م{c҅Z0H#aFl>7ŹtR^̬m;^OVA mߡgܾ y{#aXrͺ=v>9(3̝rO4+#>&[0ܿB~ޭfZ +EO @ @ @@ @  @bc<{r)pv֚bt꥘ ףV T?΋Uz*:r@DC,R3,^416YKkw'ְr\8^L/@ @ @ @p;Q`{!q-m:< DY<.[n臕?sE%[,mD 3I.Y& R~Ey:_ @yfGj]]ͭQ} `8\g#84sm>@>cwFLHI+b4w֥7o- =7;-#[+3UYK{gEE.nߘ4"^? %_]w3؆]V_~{g]Mr92p n-]WFVv;M Ҧ'ԁԺk'~_J4  [2.T)eϋ Swۼ<p߻ RMmhO T׻'k7Il# @42&f4E< TE W;Ե\ڶ PQ|ߤ_k@3gT&SbZKi3,K203e~rV}֜n9gmx[tg-:t 4# b7ŴI7r&)1WxW> ]/0 f{3 ?y5(/j_p]>`Z-`5D%%S!OMnnΝ| `, Zc8Э9<1h& $>4 C9y?KP(p\)}U&tcgW|LȝēIC_-}7C{(Fs9I LN^6(r]'y @ VJ'm?w}Sy!K:Swg}džm3}Uz4yDYx$0%߆r[~9t)gu\e 4Xr&Z`Z.nݴI anx"ۯ`fh!p[8E Px2CVm5YYRz|umw h5A|; @U|]qґp_0xDI-x>_fќEG@u^У;V>xۻ߶hv{@y\-*mK} ),}caU+^γykҿ[Pֿ9@qo+\vFqk[];./n/@<63yLW~>qPUW#tSmxy/Oo/? @ @ @tg`l7h"ib}?i x!ÿh2H2"4FS\rr\9Iq22ɓM"gڴMdI ̳^5˼ )hP}?RyY69`L_3c VhbSt@|҉10ֽv()`|ky3^]59. @1f9ocoL'&ؼ!xwon,]-5)RNR<(RfA&BHX,V7- (V«fu&=n*MݳI 'Ț?x^M" |ootSR|6 Ţ7vgj -N핔_ǺTͱTqthwcn@@v\yG 1ыo~?I'`wȇεE ꡻AeM;PКMU߲k Ktv5RN)6~4? y}C;޹vnK9qx˧ϟU{>b [d<#pqo o3L'gwh='VUzwmYv{&TLs,sZ;ѕkOȹ5 5"٫<-4~D?}jdIoie _YO|ȣ.}|6P郫l>^V eZ͑zTzMf|gjߔ%G%@b +Ãj['6l-K~}uO/237ͱԶ@ixȾ \`wCe 9 )qmn/OO^@@@QW? ^Um(2r广0 # 0y mPb7Ymq7 ڬ`;Qn 21Ynd7Vx@hXեhv9V#@r""M0ŠU@򢊒b}7dSVQV)shÿUNL@$}x57 0W@*tTD`G@ <'A@< 4= ظyedܗlHvj>`I  NaRO 66GIQqV9lN6u\@,_2 &^+P>OW*D2鋨%L;vGWl44@if5bXmq_iCF j+rIPIk%yZ@@NG3xb\  @&~Kf9F +C9"A fɔ0  atXϷ^s@!oDT(+pT(_=27]x UD%}~ai*Mɐ،f7,K†YM~v`D2`U x*TOB[ -Ҵf"B) *xAWV/djVa﹠=9; wAqqWˌcLٖ )+ڢ,G-d DEцһ\\#_M;6%5Ζs@xļY.::1ip2y'ӽdN]m&aйQ>}& T HƮo6kmf(/CHEܦ R*y(. @{ ͫNS@ S) ~L 4mUڣ0YP$ll\I  #TKw ĚUHQ~pGGτ5bHR"D~Z3FCݦ'L2;CPM)ue Mγ4w.JDeMBe sՊCPʴ6GZ:D sSL L L{>qG8fFPEO6c̻ϭ]"{n4ی:uu6; ,RM{IlH5窢ģ{# |:Đ^GX dKe4kR_mpYTPڣ6%T@ ]ko$l5{Č_O}9cKw*B^_w5@;SŢ%`\n%YbP;nĈt ]KՄv e#0զKdw}d)6?tOeҔwbC;$Q5SP(jKm@;1<4.' XK|C_mC.f @k]y6ɟ/i~Kz3z"#Of *im}2D)-&ZK55b2@`OI̸H5M}'(xD[O& ,>p#Lf\<P"Ȉ:z,# ƷuHϋRq/O;'k{rImhؓfZ$$:}]lS#@ vTGxvz`G_,x?'g9m `U(:fiɈh1}5]hj¶|#x %2 7V"N=2fA"B uk{Peb &@ v{"T`yy#pVƁ[ O+jZ(:IQbj?Pc.cMuYz ` @7ji}y* \;O\=L?YГ}XO!t@繽Ϸ-̥p2!@  s7I>ə1ѷ3.8y-+dd 0Vj7J\ >6E)u=SC YTdzNGc!ZQq||PjIl3NgpŸ  >Q -&;_ V{V>;ΟUc^(|}|XIwg@Ը1Nkb8pu1'pl HY2ެB@h1plٳ]_lUfbӕFSh-fI%7 zu"Xm-R&RFJZ@+(?d{l/ͧӖ?E!*R?rn9z9 O£Xw {{m?pH:sEO}?c3A-X׻z͑o[Z(nCQж=+zF 6lDcxTaH9[A8wc2\YQmFv~G?.,~~ErEl{8; ṅAFrgLmEeОʋV<n o?w$\ehZ?(HIey/4<MgÜ9|\ Eɺ9{׾?"-kk O@oůcf@?^#Cɞ`F۟N]񤍽`GѪp|dt1^Yuͪcs<`d ~atz pw?~<}#{ҫX_7 @9]8g7&;{ ꁮٝbɏ0AP_tTG[ Ɂۣ㮞:iXU?1s;~+x@O9`֓ }rEtN\-vu5W/ZQL\'͏ ZF\(g ZԞ Q7]yhKo=0DX+`9k`ϲUͩ:+ΫoQ6Oz}ς5Ϛ@|ۻ`bӲe6MҬN;Tq΃N-۵lc^t Huݕ-t^!2i+ c#ϽXp@K,bRH]zqsK %2j3w]j@@F8.+KwQ ir/ޔg?[Ycy0uNN7Z UZpiEq +VTQMLH?u) ʮv$ .vMY4e @~nYY u rS:4 'HhOLl 2S;<NU2G#4'@ @ @ @ @@ @  sRd j :U_UU}iٓ ͫ@j'6'}`\x?Ꚃ 2 &OKPbf @ @ @@V_{q :׹d3[hmЏ\ܷ xW1rUc3۶nE,ojHVz -gy]j];-5HNMAS|@ĩ}/Ni qtO˟݋9#&x\3UEP\RRq:fvg|3/+/))N`sq0h:g #w/4Gxv<\⣳-._f_e{+VLװeoxݙcW;/u`țp[i˧HŗYZZzdNugv,y;[Z{<_xxә/{tWkwN}6ٵ#{xW_ea5Y^yjFFD4mYUu홃MJD Gan@ @ @ @ @ @1f  g~ | @ @ @ @ @ Tnnpicsʻq`y0?1#/F]L @ @ @  @ @ Å6d>r =Oes{TV^GhiR~y7kŚy3hLB ~)س5miwz`/n}#oodRyiƻEƻS Vi^Z0cQӣAtuܴzs˦0O$o m<O-󧢂g7o~i>o7kPvʎV`஢;gǻo=2 %|8dʉoEdn,en=;CG6P88gD]]-Xm`ֶwfӕEx`FqJzn?~oa>?wO?|9j - `֙Mqi A%A`Mf>{lUco^6ѶSδdrW%Ũeg.E' {mI5ՅY/oolsY٪=] ˂#uMKuawef~q<\ @7~*s .{J?w f4E9Ɍ@לQػת7HZ677r)YMaDiB͋@#I,1"vDSPJ4UPSʺ )a9_M ys|sso]1=ğH[SuF7}t߮:y.MCׇsމ&UtPYr>E +uDIpѺUu]ŭ 5_Kga Z____{2Ig@nV侬@w𣿜{#(WÏzGvOx~nďO6E Ca .7w닊㏺ևĵh/JjUgYm][)ڰ7%[3@@$*Mx. '\Rb*]ݷXdv׆5y{s\[;~Ϣ95a @K;nt4ca?{zǎw+>KÃMdYlѱsi0 fu,+w^sQ0pmϞ[=!8LkHٱeuin O5PiÆt]>$k㖏ml,9P4f0D}mcpTk8|tG3.L`d3ogKCD]w6[x\υ-e?-p. 5C۷B @ UUs c/.kT tFˋ{&ғYR$>,玔 ;,Ύ3kӯ%/zPT<=G^o!g*(>hoֵSev@;QC8O/ (?>N7Olws`*f.Jds5i?ůQKU? r^.s[u4% MIܗa0?3ng@z `kz ;Y5a85=P:ޔhq2<i$(-GlOOt}] -}N3\0-`Or\p<.Lvi*&Oq| 0\a>s \;kmK ) ``<m'4  9ֶvڑO> ( VmjήKꊍ@t.++K߶'8pF@s,?rֻclL>M`0K4 ׳7o9Q(|*o3\x08kñBwQyˉƛw^Phۗ6ܛ0pkcsnm76Ϳt>o_L467޼X~+,sao O } #g/ OѼD! y3SW3}|܌~fn#?}s>6U)~8qz~>_yxSVف?YO93j9⍈E9Ι9S3|99s_\! gXisMo& {]+ncX] T^l = zck/oër jݹc%B'Q=Weg\{^oa@ZسlBey1'[n:P%'aOi1z.OH[S5lDIxt䇿Q $޺$䀜Bi󟊽6on@p@k띩\we/JEsoP;{_VySk_7U1抿`Bf=7#2f{x>>ZzK = coDּaZnj?Zgqkm fyuƊTڌ͢ƇN9g]3 S,au B+-vyf\NZs. zP?p@d? ]m@z!.3#56{[mˆ?==&-n{J<3cc:%C FkYߓd7d!*!Wh-<0@F*z0bU~r|}#jfKM2r @d =O%p9wroyEagP' a]-[501 POh#7J5s 3u6MYMr| #4 ʅ5klvKl9uĢujѪy,߸:A̟ uy Um(,+B1#G7<h:.{^`S34l1!~J&+@,O2b~4 q=kl}[UXepwѦ5ޢ97d]kaaakQjMsp/ cf[k`]M{=?'@dT'x@O - c2{w5̖x5cKt^E: @j (;qNI> {kS|m@ %f59ͷc{z{pD7ԧl xȰ2DU*rw9@d}- {;OyV mNʯH`N{P}d`z}5LYoJrC,'us%#7kui`[쌻x,Cy`s:4?9nwy@K p;z x`^'`T商W7=z{m*j@GT3\_vM5~W컊LsS\S$ʸ\r 1pJ+:~.wKzHy?6K;]꺄k?*N@"HNWæq- E"Kzp-YԒHT]|'8Fg&V"5j u5]HqsGdG>30 YP_$k]W3ב~ArA^G"=/s}3g@_AP 84k9CSGW/6U;o8Rϒlq      7o+Y9vyy0o,Y Y8 v  ]_d@@@@@@ @@)`O~;/ ~,| `~ +;Y@O쨯w,օC{N:prgY ;`LUAU@ @  @ @ @ @@ @  @ @@ @  @ @ @ @@ @  @ @@ @  @ @ @  1×xIENDB`fastapi-0.110.3/docs/en/docs/img/deployment/deta/image06.png000066400000000000000000003154661461403617600234230ustar00rootroot00000000000000PNG  IHDRoٶPLTEGpL020/!h"!!,**{yw&%&޼ƭPQQ˘a_^~jhf988EDD[XUA>ФٶadrGc 茟 @7fۛOz"bI,v>>>~mu*$>- > 'tg r_v뛛i 8P9y^mpntY /WBןmiL G?Ç$Բ\'q>_u1NW+,LSq u6- ,jE za(r=/2ž-؁._8X2$, Tqc)P>2p4DCY 0F։l [Kd#xuJq(wyۼ]eYP-8AڍϏ[B5mh;7ȡnLvixsjQfT[@z06_(C̞q|]鏿? &]vY"01P54T!9#Ey^I@fYpVa"ui6'ATV[iԴ&0ٙ:G]t8a ,U}v@'UFC/pzq! m?FGFdKF$41Mo?/@ x!;%۳eO7XF)WfiR[y)]xIu`k.\♜?@O24ďN޲Ôwg'_Gp&r+?/ \bל`w@7'm|~0>ض윋^-p ͎Ε@a@_ƻ(8nob@4~xޅٻ4-!ތdAA!z9͠N> 殹6 FҎ67sͽ2 ]C8W7"pV~=G %xtX?XsEC1[LB1XL<{ 0߅mk6j/m}F1-?_`JӲoеq Zzl4y4fT0 2SM?x~c |d? A"ؘ~ ֘:t8Xg dd7 cwsgeowe`Lچ43O&E9 Ͱ O[@?`4P/6P96W{ >`1vfMU66 ɏ PKM1+?Zb|DJU~dz2HUaUJ܄PZY\d~Ƈk =Wg:wD~0iu]oOTߛn *~z,![_?zB *0Jx)r&? {oG4W.<<(NvH rgAO׽mvp:QhB#MC;D檗es]on+?bM̶6NHOmWn9wq8m[V扯/(ە+ 4N3v尳2(@+5OR/jOU^`*DSi/wRLTb;!-7SIUv:-)4l 3C6Gl n)ؔN ۯ֖86@V6%}L |TH#δɶ49MzQ;5 / A$HE~Y"AS$T8|<ۄ 5'.a`lRpĚ>ݐ^GRWTq6[T5N9Ү|NPl  =bLk @A~FT⯙PǣRʕ MoSO(4}[1ney[q_Wc~X㌻j/GWT^Y -T>l8W,f3!@΋-Nکx 9op3wS"(1`Sm,F6|@jDCpD2nǯZ A,7@PXQ CNp&EҰmE(@v6@mB>2{,}2/KHLUj [B&+ c/Ǧ}@О/^'(' ':n`KS'QBز2Zݰ Ʋ%hz`qi &a ^Ϡ&?CP _&Q^)PV٥PRD}u&5J$ PPm~֪=6 ;$D" *LlM 5{i"W //3 ƒÖ8`U&nSV. ~~sJh gⓃ: &pXK{+ h]ر1${J|Z&ʁOhmcJpv0 k `=_B{O[sH 8TdlYe.>%ybQf'r^(`g ]N8pVP3PUE(%~**sDd @$U2w /:y!I`Ą@_M"н)[ 2oc]þI?:ywT PVWg,tDAa 0OJ^ 75)>z,S2QI2(t hOiG۲ZQ퐖Udhtɂ'U6 C%hL)p,DK5dĵQ/(r_qZ5H#2r ` W9[`R }j%xiLBw >ovIb%b;lPO 925Ӓd:ב.5 a2Fq+\GOu޼XxC UQf`ԟiHU¾7]ǥF@b<8`o ( s H+6 "9}"w+4KoM%@+mE65#@2!ms8.J?MbuA^% ʰ+iT`+Sp@AΥJaw2 \>ö ))0!Ám|XL$ay7uJ2鵠LV@8Q pH~>>zrCDb!كpokc2Tv٢H'@|ZP'@5Be?}%Y,W= oKBPE' 3:"L[ƀLk7;t`c7 sfhg:#>2pQ}'@)<EAc.+ @>jA)Z%Dڧ( 6xܠ:lMRǗQM'\gM.iͪ@CRVZ h6{K1;PbCw`5Dn LPx&'O3b9.~sϣU̓g~;9h UXz΀r>9~yv]h/ݒ0x q@"Tw/#^K tQO<]0d3̿< Efx /QA{ %Pi T Ѱk |PS$(*.uDX7NdGLG:|g/caNE&5rjZH?qX4&?Hf*ݿzL)/7\[Gf4y u e]BH  X@uE%('x_Wh}؝Xlra _/SB}?5`vǘMs[4bu6/ɱ_"cwg6"zd} ~6-ni!?Qn(:2;=y] 8PiG]/ @ `x9!Ts`vRxڨd*@{0Y ~>gVD_=juznȵyuPJϻJ -Z},PVϟ.vv}q1 bfҙ ύh(B 8qFo- *{(m x~.3SqjD-x%06:G R4p9nY`"p 0UWӚn2Y|j8ne#^ ЎߺzUWRo»&_?V.^K=.œ |@vZ=0 s~5z#~Z~!;OWW%PP P z»@I`WN]C0l$jya _gi$X>f& `Qlt6( +y3[oxRerSdn{s^"97޹XJx]E@|L=)GQ~U(eO=$76xr ?yJ~9> ~F;HG>)|'H 6í9Fiӝ5X}cߍ`׈~ Ź.UtnCtv*lq oyyU[eQ`)EoT@Cߡ)$Y?5* Q? 0 8;Ռzm$-8\n,ûz&i<6@÷@~ umSMDIx?**W#F#}|'|e G?CHD ZPDHkԭ5xe-4m ܋ak<{P09rO`e pauЃk\~*#tt"4`Y=G3e6ZetcNœ" o9s9NG B|f~K蛫a;L>>޴pq$6F`dff`Hеad@g/濟PӦwE0_HQ睟M+_vLe+aƓp`[-0I<;d)2\i]_ i*{y2mW k2F0ktHK?%吐ޙz& 3tǑZYcK⁲ٻ¦ĕ%h<$Bn~zeWĥ5O$$X]Wwfo]'3,3O/ ^ 2y/x3YgYEAs|oX~a@OG`q.7D( H^/-"EQ' 0=sw R9n-&pFcPlw(s_9 ׳FG$(G޹g`"w4`!${lQ JC`掙uFipG/g`̨cbv0iuhvkΦ6D1_R `i`PoT1Gjq3ѢA<c9 (` z88d*`Nl?A,!`E-#c%z^ Xtއka(_5-W@8(X$w֫ (x%G%MJ& jK .BD.@`<,-F@ cur>Kqk.E+8WdY fB7 Y:=99G?+$<>ιfP0'קp|~uB/, @+vDtWjQ'IerFV ۛ@j.fSCiJ3̠Wiŋ!'jpa:'{,fyl] t|Y;`2!JC >R p(&Ẕ @D!&I 8#?q@CSrRLDPW!3W}c!Ɇ0&tE44Yk+Ej$DA>gƌttxAqP|[xX/fCV\!+ ;v Sگ@m;fٴ1B ];7U9_>M B*_H'C.zi`sy Y^iN;A۝2Ӈ!4pW|ЎOhqWՇSggGrb>]cx|d9#Ҿ ]B>/Q4-ܣ Q<]i4~knQx:xIyGµ|M`)},x3 -#+8Do)F,@rpⱩơϾ;`+ѶKt20AT@A^4iI>c k*`iYE$} Sw;ݡe`  px-s.t:n1>wus0OZUkiwm M1}Bv7e<Pc] b"/2ѕӎn.~tV5^/ǐ4jc4y208bug`_Avn"\ؐ(\?t@?RpfkiZ恆m2d A{frP_.@쒯 R셞坲)e1MjF KOT5jA $lh΃r@a5B3*4кP&hZJK}9`ꠊо$>)AsRYTdx-;(!\dͷN*m_B@o ~ |` LU|:0>wq[9F#Yq:9)L)׮;#ebIcbs!@.e0l"vh5yhf~WY ?@B&HY(AX][pl>l2݈4rR/P@@ۅH5H9a@b5-(1_ndD6קE`q'N c⨤40kOo]<[Dpi?d qxlr7eVn-~H8(pۉc;Hfx;A@; ð#S~gLӔeB@b9ƓFA n?z,͸#3x=]6m~nҮ,383$@0" 68(lEpQ36V6z+3%@PoiirwPM^|2(0/۱'Wd^mx4)S EPtd.o (P* d@dbPMPෳ-/pATS@T;23;=f-.GK=m) tg_(<doL;Qj( (K 3EHEw=ida/^7 \(&1fy4궽Жw,n]K@ |<{`y/t$@/- qS@ <[Mv@Эr` TCanl?@ R7#gw+`Շ@ nhژ{I  x(@PO77@ @,̖g/y~@P~Z@%kh |_[7<0}{$㿾߾0]puX|, 6WnO\`c4e--m[/c)~ @n6" mso-0-vOR .il=x/vHȗYV ζB/n$3/ru| @4@@0<_w׫mgnW7ZkLk0M~WYP 4cvy?-Niclrl(0@8٨;bo|\pq88"?[Noy:0rPTD)td E'ߢ}gk>o䗧"{L_woz̏tyߠ0ܺ- [0KG䏳| >A C[6|>n^{8yz=˘-6C'p})Y,MӑP0hwӟ$e?}^4o&//^O'9+M&5Id$I&D. ` 8, GEa_[# J=*Gg喔M{Ʋ j4okxU!Z G;,|F~*%7^\r0]Z]| (4਻yq>cD ? NƉ& ~%@|Q(h ,\`P't}h(^ :?0$ty*d+@w'@@ 1k@' zv s @ @ @ @ @@ @  @ @ @ @ @ @ @ @ @@ @ ޽->8Œ$0 ~Ӣ֮uڪo@@ @@ @ @ @ @@ @  @ @ @2u30'YN' B+9; >IjNuvPil d>] z㟛<0WۛAF8hFxWwWe1Metez^3VO݋oG<{xi?>l9>ͩv)pXdG}6J zYRia0NCP?,,-Vb l颬Pivr5itaJ8>qzꀏ^װus:Y Q0<*EtN <?o 0Zg'&j9ǣZb}KJFp]]޲پl//@'Xϣ;no2[Nm?=&v‡f/iwԾVAe{TٌѤP%`U/A+;shs}4ݸ_1!`uMԌR%@Iv٪|dW( W8v_e2$ [ҏLa:݌^X{Gi\#;A%u ^d:LVhT_Dv&\Շz *|a@gmYf6U|0 OΌIk:)8tB_- _'on/?^>MxO}Zu,[Ap0~yݍwXC7oBuӁzuN&͊=O٭{yF-~%Vß`kPO凞P?v;&&etgl&z5lJwY29_f_M|M_zAswD[@ݝp٧,[<';O>wc Kg<|nѼ_ IDATi47<:7o!۟.&\뛿JV8{y\ju0~7 oC *=fǻfϒ~Zܿ䣈;o{u|'m_1rtQ(ު/>)דᨻi.ʴM~8`?cY9^J}=vA+-jY+S5Am*i5~vEW@L~7ipsPnN&3n .ɍ>) g7'A'g 0 VSp8ٴw}ZŽLҧ[0{׶ܨDr*qG TvZNd';ۚch)*RQgKnl$ 7uMB<ۏ52~cҽ۵Q֘) @GMEv ?XzF|K7/\o|J-sk8>[[&ʼd ;[{0 \}=:RxB4vk53Fumy?M=_oDRacd$p`aqw 7[GMγ_t$밦<^Veϫy P~=]XGLU^ʛ-.R.+ֺ9jZ FRn_ᦣ<w2!]Y4Yrp.m!?M?L M@с j^@a<-8SYkM@>#KIPۘ䰰PxTF3Y]eNnFO xY tֿAUz_c=z;_b @]Js, _B1LKc6z'2Qll<+KK1"9w-61[jy=6ÙEzti0Uc-y7CDžsZ HKkg[R{St4-"E˟r0_ޡnNɻX-*W:.y(8E#|<qKS-e916HT6Yg. s*8:bRTRqhM{qkd\MڌPk6oDE|>w:ʃ,,2I9͹qHro~XMܙP]eV0 ^NY]UPǿ|{o:5 wViJǔc; $͜r!P%X"7A00s3 `f59 $gŢ8FӇ(xR9Ŷ` xu u7g.iʃ)2 \r˼yf0Y 4ŚWP&DW3/V@ox 0JZP0j9p6mN8Ti7]itק^SщT 6.W?;{뻠 ,hK#oezWӹ'iP>{ť1"YiU |pӾIT">+K o8f_&4lj'Ķ*tt Bb B)b HH` s"@hs>F/3 iau3p[cH 7Ƹ=@iEtW St%d \_*t :8uBJsʭb?wJLS\C׭C ff#u0|$Dm tz4ۢS`]"W)S}ođ%rVȃIƫ^,niO<^QN1-Y7ހgv mit7xTʆf8lT`av:3~E,|XFLUMϛM0ʳ{~?2/r_F,ȚK<CH xhhptهpǵQh(ݟH p(C܄m==WbQzaZ<4-q'McUiuH yJ@$De ;$0KfQXX!oꀓs8#TQzòi(%)`$ sWk_;X:)^j9*BNxd} uez_97wut`BI9k!YY*`VQe8R^qeSr Vt|wȞ⟼̕u镽yAwpdeHwʕL/WvK>ADȵR.oLdRE Ӧ(SMkEa*;` 6Y5l4C:+vXo/,Tm&9\+l#vV`ܩ غq.;T'՛*J\RYU 6稜6ʝ^z7}u Od8**}ۋE!Qkk|#hڵ ;zi8쭇 )iU}`oEb&ؼh`bRF|+O);%y x`(n>BӐ+:>I]Zh*JP(z0@8o@Sg0~(rvBNH>4U$6-J@qaJ{בFe"%[(N$ vcbW S6^F_(z[EB0O]OEf;rֻT$)䊴]>o7WU[:6X=}o]mN\H͈Yw=@o[plmT O,y ` X=^ JaAop&_Z}V΁mk_+ mg3euUhszy䍙P_\ʈ1vwg1*C%ȚϏmf%mTFY'C1 <0"/J|ґNْ2fG>=h|n^U6H*ٕ?K@WsG\WN d[ -p.;__~Şˍq7.@΃`]p*xo[[;8b)'ln;NGaα+ܘ ]0:CSHP+VJ0SؼoyaRm~@ *t`MgRFKoP8LJJrPtt mn~ tz?A?M0Rf74P.5&<о00")lkt.5\,-IEͫIR>8^wt5جJvppʠw\w0?`%u OS8B1r]lpPQFũov`׉Xˤ̈́IcF6zIrQ>f ѧ)U_"~بr]@Կ=MUحfT'$5!"[ԉ׬L4m 0wP 4%tN?~d+ N3(` HP/䮃_P@w~M-]Ʋ?brwZMs7pQ 'baQ@zst ޠΝSU68iVxeet|dbNlD=I3{VHte:J;Frͽ|I$4S95,0euy9F<*_$@~mO)Sr ^OSv :AF ߶{A(Zb=V!XMn\tPp5 e遻&v~oI̡KE kV?w09ؚM :gFQAM ]C(!\{Pp 5nG @Lw{V?k}yz8w z@uy 0I>m({'T)z| J \kQXXs-1pZжh~q#/8EB_ G }$8&d"tn` Q}<|r\ fz[+[Ɂ53<ĚW `3Uv]>6CY\S.w^/o1iFIX'1J,)j]J}jI  y {^d'J}_]jUy?u0 P` PvH!`o`%6J;*SUxKymW>=^)NC6aRUBRcZCJs&]U|J6S2!/}iuˡ@htnʴux溼$ӐnQ6Pgc٫iZŐ-{n,KԐ6f0(& o3,5#,!0LF0Yjɬ(; i}kr p^$M'ܮ-y{y ҕ#gy (lK+@,`Eί*ݏ:b䋲o W> @ =nXC!kT79uV; IDATO44 BsfqATa nYf)@Q:L؏+R+ ɩѳ4@Rn>FsLjm\+W >FW$BhV~:a>B~y  $Xd M^J+NɊUnKI y})j0į1 U3FŗD:|Gn1l'd8v\ mt2|.MVSp6SV!u1^QHgپDW`tMkױϲ_J0TI3PlW]Wg,FQ96Ɛnd"/"A-L4Mf-T?da$= %m!YKE |^&Qgg$C[6[=صol,Μ,ˆN)/X]:q6sF{AOX!av|0I,+=-v8$ @D@Mu#:rxǎɨ (oU_SL9m| Jyqȁ/ce)@šZ2l~'8AlC!"$>A1+ˆ%ʈi+B ;M>[SdLܓ*TϿB܂(*;o `*̼,C-* m8tLs5I䡵eKZ;Sw~f+6c=ZZI7$C&Oܑ28}X0LK1iTOLE]x(~]֕Gn5H1,@as^ ol N9MӴsflX /jlg?DؒAv,yҿR,۲v͊e?P6eִ j5{)JS(M jp1flxoft&B+uH!֮n]1R setT_rZ"sZ󲫀ȱTwMugS%Lngd-;y '8S.LJ.M&'4í!oNԔ ,FH+1/R]Ј~uEl'PR6\/h>etnPĥ̹8Ğ"y-%N0,9r˪J׆Fo\`BHW31m TE6VOaTg׈Hr{NSNf/ewAT5'a~^3f[Y2<:PWwƲmCѡeO>eECPV^V̔d f3$e^_l)=c"׌[=,8YSN;l+&Jj<,-]œI8)U*! 02}T O qMerG-(iQ&~Kܝ?%C}=(ic|VkQhLD8$}UF^A' 0x"dN9_F8QXvOxmtX6Q6(N@iU@qrm QNmBM _5dO'v.öKKSyPX8FNDr'%|ts,C@!W7bZϷt3@=K8T:=@1r4W[V5]ksIh_k|f6CE=}}*iY=f U۶ˋ8/öʻw1rW~{e[SH@@9@m'"¨:<sAB?Nwkew~nKٓM.>e (ɽrp _ .BNAlNjJCt뭂23?I}l&v/xYͧ͝~ ^;ً~k-wvz4 *N~[.7fipu~<-ڌogkt< S7B'ZLF±M:|gw.Q}f>z઱nlv%̪þ?386ǫ=W=?7ϯ\ڢ8hZ;v=e]JkWԸ{zp ߻_t'ЂvyJ(Qf}7zs|1#Yݿza3z~|ml^7^̬C;WgV˚HcmUӗK,~*eZB/lRTnh:Y#.9 ±Ƴ3WBWfmd]>3SI7wϿbWjg}8A71<v?(K}U4\CB!gYs{p. nG/6A~P ˹.-=t_ +`N:3?Gt5ɗk'j$ɗ(a;Vә/Fͫ͹ϔl.+Պ l[>X:{6FP)ox^57M9ݷ`Xzzhaop&CC'Ek? _6iR9SI137f˟?>XFE&ʕo홏,GoQR.6tp&t2YwYzR_XLYmH6p,hswC'*&şp_V~G(}E4-^/}%R"ֽXH/CVۧP>dAr~޶&>Dȷ󅝣(߳TV][6N19:K;Gs m k@3Jq_ؤ|td/v_J_yK*Mz Ix|g=d6[-Dޛ6&^\=Y?"|9#/qZQHjqtFGt:ϺtZk*=_v tKjnƺvai#Pok;uחQ@0M0o`SJΥphWF>e?9ZY@0mF-&v m4|Rp90:r/mE:Ӎz*.Za_l|-.M6O歃,U)IoR^&˷ `hȲ5_=t0v12 E^@@@@@w(Gy_Se9Ҳw _$/Lr_@@@@@@@@@@@@@@@@@~r?/-\x}7fJ*㊂'>KPy3 ߝ2~@%N{$.^6/N4K\ {q^?4w\ْ}U'S7m&*׮xLʼnZ{&~9< ZD4sj?b2P fv^L26RJoėG(ތL&a%g.9aqED%{y8M!;ģWK2 \~i慃$sJwjp&];t\S}xBosݤ *v-C4\$t^yI҆o 4{\"`M=t[ŊChƽٗ7<0xuB6ܺeBd3<a/Yu$B]B:_~!G s BEO}}-.dODYMڧ-NqP:jCG*9v[qҾoJGvo=jqxͪ'p$ޢA[z=ѿ؍X nByɻ:Xu~q5Wȏ*' 朶G9V5A ^flG%3n30`hjzhgD3\8..udz򺮝%qְ5bRX8+<|!$l{ (2BF[=\q@fO+#߭_GaIuuh.I$e(~eg|M 6U!m, )i>? 9aЕ/@2y4eK^$q] 4il tg}v[(8 G)rznpb皋 O ͨ]Iu۸Cu0aki eq!}LD^ " D_?m'}.mj1ƋF ]<&j]B>=@ GFXqMW)X!\GvC_AX4}>͊ί)䴞x }^жEq"<[o'9K|#/p_fBw/Xԡ6:FUT(âx 1 )7fSh;?r LŚk5 K_읝0^|,yߖ74 J=o1farke=ZXS_녜e;T+ PFZ! ҆IC geԘm*&]huw8$n&)q6APec?qA@"*'EmGpj ay\3Xlt5錃p,;}N^ >w4ppxf/j m>;E5BF (QLgBȊʊSҞ'5'kP-p VKl@>T'pH49 &HP;Ι*]7yL#$[b0w1T\js<ftj)Leڅ{IX-C_HDr̹TD^?Kl`>`f֦~i;~LV$kj7 ֣ʷg0f(*ioym=->jԴKo;ǬuN8HeR<(a:Rl']$c#_*|JjL\(surNHJ&Ai+@l.a4`5( =T @`R۔#O8w%'L2OXzHc9hѣZR.6)>I\<XwJ?8ȭA1)H阙!(L3kOQ`"!!!ȑTAa(h#SX"/sXx9+Ҙ 320X2ABOW?22,i̭R5QJ#Y!خCQOg^8I%N1vHec4CFܪh.VчfUrxMj8m79oa< kW8HGOFz Tq@aH7 ՗ *'w 9IKF)<"C`SA"TMoZ$3Q1J!+O 5Z;$cЛѩj.]">紱 R뜺&; vJ&JP ]:l{DžA-snTl(Dy1* 'jgB<L wUDCz||,8oNy%H_0d\ds殰T_(ـӹo(D3<w >+Kè6h!44Cstn!D Ň{r8m=ZuQEَbd'P)J 﫪:-riYydN{Hk; ܭ_X\ZUMwRwJÓMr CR_gƦn+=^cx̙x)sO; 0Ô0˼y{v&~ZΖJ4*ㅯޖbX&UiFZZy]YYRAXt3RXr}J lj? 2 h.bBap)|;\ih>#nL;120MA~SD IDATg+BFyp(K9uAU:]?~x@v*oeъn xE&z`BQc('Fk(6(͜j@  $s%kr =So(0Rf؎IփguWkkދOG,p Eq#)}[ =†[覐:nHa7ƞJu#k$~xӺ9S`FhͲץ7Hdi*3ƹLcNXL/.8mL{+8"+uyn.@ S. zV%` (ky}ݞp@IƈUI^dfY`:l+K{T h ~NvtVGuCHe(NY~s)9UJc_y0$yϨvFI%ӿ?#qR'1%(-UR@KyϤДRY0/r5YpZYN D ZL";Hg#kB?Bz]=RCψSNmׂTy_h6$2TV4Oz(Z&N`+"A6R٠$YYL+|D+ (?v_C'h( @ҾaR\bԅ0v ! 3]v_B *hW)u=)wn_,SmA`t$ Vr\K; W/c@ +%a#P.Q%CWx{1^4"RG:e{+-HߞI@3"3=x$C$ l}|x' -OL?t02[P %.V P(Q!.N|M0"v^CDe'Lz(I3PYr&nIH kd,Q}79#ǽo*xuno:;ɘ#u4q IY.ޮ!qOc 5|KuØN'],U#0 ݜr||-S emH{ty8YH><_UiƯ;K,O4)+ Mi1.հB|  5R`kHcM9ބ緽 t!x3]HD8Y0L(RkM.TzRljIx~:E'!Ph+QBc=Tl{BѠ¦&݅;`f{]eCPt`zBN؞ &K+a_w,D]JfX0/":' 8!EYl筨a\20dɭӨwGK_@MsT~əWn/pw=6(kپ2|_L,BBļ  jd}wѶڹUY}>5lm9X%I$/V7o-ysB3KS`m)R >[`=-SWLCRՆL@Aнi?ӇZ`t4, ;SZ MQU="Tz%G~N玟E HDt^e>2 me.Hr:+u`7l|L(O.gWPVNCXaa&2m]WZ$ʅխ.ZvP.)ع ,Nf8$Vb6%T)`01@Ҝ`i2Fah3gs[S^]FN)2 ֏PVZ }|&]e*PX"QЊ(~cܝ` !Pi=1s(7X5KCXwMNtrSk{9 g}Yx3e_R@E* 0EÊJZxqJhץIj$iwMk{s. (Tf ȳ.J!`7k lEo@s0V϶ɫ0fKVmZQ(Hvר_¼9Hg .p2pposV0z .jkZ›I)CHeoΗS3 Kf@EXY{!ctbRn">R_m“8Yi*P 4kL_tGm+@X 8:("T>: Jr[bZP~+0]@Ưe͊\\2#qa;v@TMr{mWYr5\? ,e\mA@+ cMvRw#O@0SwjvEN9hI:o#AY`qlBXҝ#VwZB@}vUNd(C׎ ּ5f :JϽN3.W]yEye@6uYrBH:w ͶxO2l%@ oaw!h[/ 2TX{p9A݉(x28xr$4 /EW_լTIӵ_e뚔؀yݸJjV*R4BO١݈ckNtO. mugQLh]8VHOb *sݰkYm?…%&E~ZzrXt/TE@Mha^A@_ _MCԥ\^:tAUZ٤6'8"@N~cWGx@sڢ, V]/һ4\Y+ޗrs|4lBdInܥ̳@;EY~(=F9p`RgR%Ќy8)}g.S-go2NԆ{#B%_iblo.p >04isIsS D#PUЄO$ 8ڦOnjMvc5>*k@y{=) O/ҍ8C`$0|+39&=E忒}P[/\Ua D?н/icPFH ~}G܍ڟhS׮5 }wױ8C%+眃YHRCOvzcY4 >nЯSS0E+ c f,,2||KJl8Be@ S`\2m{ٗw]L!ځQmHlםEu\`$-x?xx-g̋W0*$'-f yqd1LE6 @_xx(~!xCZF= b#wo{͖BVWx$(x>bpK{`5L8]K,Ămj[W>(-xWL1_lk7D%X@^P٪bZ{Dro0u6&lﶉ= D@Y @81%ޟw "BL[@4PUm6qBk.?)YwR{Sgs ʿ0sG>[C^UU|R0BP-[Si<4[lo!̍1{zlw@`ݴp Kʕ:^ Kn)}h! Dؙc8Fx6ma]$,W,A࠾Ί䐵3@?Ze8,PFI<\!ps{ф<!h[7|L7 hx4^ +ypt%*H!㭿a=ʹDb 'ZMf`L@ qqY[8Rfq7O@w ]VVK<˃9ci2HЛf{.~́,EsJTd:?ю鮻"Щ9pO8]ql6H:Sd k0sϾP#NX(u'3]QRaҀЧ[Ѯ<@{l)*L glB:tL7q^$Iیe_O%Xrؼ'lG=I937[0`s~.\ݽcߖq!l7`1Wp=5C"4+_3fSje,B388;V0>żjV9Drs,o@2+ӷȝ+85#9-,Sعl6ce`-ǔVRB!DKKB Ub@A!I bZ1oofOЬQd 9dO ,~lV Erb2J. J/,cev$e S Fx |eTƆ(^ OZ7<boS VKVq8DRd^_cnKdi%F8%k>E6tlqD\`>JZTK!Q_S)!WH6aCL0ƫ`* >[ ׇbU[4P*k@S؇ʽt<_Q IDAT`zyS^Xy0pUF::C CTKT\y񱆴 ^DՐN+u t=_ vb4I%eʏ`K \ h:ɛ%Qq`]K). %m9b[03^=snL\|C؟ @e ``fy/RrE37RFCwF$⠨<Ns Ьg5%4¦9eTmei 9B Έe;$x"&eq&z[(S!!"("U$g؋}tN}ν| پH>\ɬt@q+.Mt`3Ǚ zD^8 5Lγ+df(f?p 4üӖFlKٳS [-VC q2,N@ :dPΔ\ z"6Y-3|cڏMRb57[5O@i_d=`|]`*zǎ=;xmmpC0Ro`WcU)E ˚e>F+p])[;w:qNQ.o޸.Yq̬xyq3ce (rDԘ-)v^!)G{[Q/z&S56@.{<3m&@]Cv"ae*`ٝX8dbfI,` F:&7\_Y{1^.B֐:(TG%EU4Pe3e~%aE v"KC] |ė#(GL S۫.R'[Nao +̆(FӍ O4u*W3.0ޓ yu7n0GZGJdVaՈ ;81;ݙqwo2x#[ `r`C'XnS3ϳ\$Ko:cij&eFf]`rw,&#8FƊ62 s|iuj;ދ!T [4vACi_ۗt(ӐdGLꎽvE;j.é\vlx³M5]c;:l,\IRiH5p:uZcemBSk`>y`ewBgB u몮SO$2nNȣfO,L>:^I>HwOp0ūc벢bMXEHrEF@>@7_E Ļs 6[bGAqƃ^ "`n/ܜuFӗ[2ftOiuΪB}mɬ ͆8#sSֈ(F:̇>sJ@S,f@9ހ^dl:ηAȓ,on[1u Q[M П1wB7kji0W+S,u) JCL67StܰOCmF/$y$dB_B&"ygz3FUd+G vVh!ԟ %|e"8 ֔Y2L\YxQ/f;7!Ii)LIZzZK^X43E,2(D`90&)-/eXdr!4(2T}15{V8z68lY&9c-l&{@?NW8h$"JpgC4n2Kⱔ cZxǁIPiV< $!@BKk73PnIwGǟ3 γ=7?'!a4Ff=3c)*t;.mDK+ }4ڻĺ`a@|$5C))NI0x:xйQ Sz0bN7PQ4 `\"Wr 3nh;Y"%@.cgE AJE`,/-[ Y0>IA *5{7eӗ'?1 p[V;A`S1ndc,&H3WEA Rd Ef)Iw^Oѥ33_AϽ:Lj$ri0F)g%?X,mUVCF[S͛@^) ;GڵkתB_4+r<2e|^kmۗ=H+˙ldA&ljiԂ @;ڇjأ`9mNr Ϩ-~-)3ق dauKް<7x:*aU)QG3htG\9>Ц07|KUB'Sq)mH/" GC8^$0~tI1"+U^%L+t{<>0 `[OG9馱/*nLv+v󣧡S hEE×A-'U{HN1i2F7J+::b@ohZ R8MP#A(JmԎ5nh3 v$R)DlX5wrr<&̮],D%%ƯrXaX;K*4*}vj;)ڥ=/>VlIHƷ:&\Xo>_lJ+(Xn ~*;&ZO*-/LSh-qQx&8àjtX{l>*Qa3W7eYV]k feXqhkCYb#ZZlkS:Dhcw{JP"e ;>\vO/A֞x ơ&0fcX9=oi2hGJ8y]۸}8>PUW;|x{eZ:z1 iR0b`.1Jݟc [# ΒdMvq +X v^"0E ͜dPY Q;]L$lW T^TvƒAͶǛw[霣2z[} `¤.ɴ$@mRjFСHvFQ|pdp]رv lL59M7a/jP0jܵK')0-5l(f$^XJ%£Q'$w8^wLx:ґɎе5]@2%I]G3Sp Vy8$κwjǮ@wYl+/CQ ]!+>Tg%H /&UWQvl/: 6~iZ(v2/eS2#퐒vU;bf=Ƅut 6q;e?VNF48Kۆ,fJQ~BT>v0ox pc^xPyn|{/~?jI#WMo1p⃍ gBw҇uW9|Mq{A??ϑ-J\+ (n3?>?,> Kq։/!gŊ eRJ"wJq]p0/L~a"Jf[[6 ھw & W.<=aҟ%xf"XU}90 &Lm;}PbI#x`0`NCoW7+w=^د\eYgRļ8G 5Y.D;*ZȟWyռ:ҫ}|'Ⱥ>KLzXMBQ`VMG~')!]h~NTt0nj$Ku&>i߹co>N59&G7/1.(v?GﳧnIV! xreh^t c$`={MXKi"0ZH%99EU(h8ZB.rqkcRZd#]bk9W}L*bqEHjF0Ȃr<%w0e&Ғ!9e"@3jگ[pdд+%I +"f&O4ݾ MyiRJ}2=Fe M@_<" o-@\B9@^,@ڠRN~_^{L "v1 lA/'(!C>*a`3B阜K r#' &.rψ8?0¨ :qwIfxKQ K,Eai+f+J~ں8̅\<[1[lf 6! 9wZU  H.G*y5C*p3i%[5b^Xe)rT 1ge x[iઊ5DDؽqkKND$VHt T ,$+BѩeJjO,.T- dk5abQe`/=V*X1tekJY\[B/4۩D$cpI ;p @4?23VXaa=BczJ{wD4*x܈hXD"od)#7bXۮx>2e!s :6}qcK~|2, V^fKŦAƈW {0LjVw`4O@z&I HTٺm2p%s1$ԡ]`=dة|~}_$Dv)dVDgS#aTt QM)"(%B497m]]85Ւ&#[4[p^ wwTwG,e˶PwTʫmeD4Z(׭l.>Fcl*CD,e7?WۯQ{Dt:/Ӷ`r}^Csj'F ڮ9r{J-~ \?,q r aqvӕ H@~o)w#dv@T -m0551}҉&sH1W}%Uؿ|/}˫u$fXn"LZK߷ö(UvYZa/3<;0ܝjJw D ,dW|(kH ء%LDr5ɥS* PW:Ar Csl&&Y2iw|VeNb ˚1]OA)2 \&/a߁זt 'VBz-zN'לQ>&u+/(|oak8~}إAtxD>-a; .*w[ ZͦX?Ėw,5%R9zan>࿍d 2[ NI(P,! Tw[4D:<0x(%7@>/*F(fAwq"cԟqKd~>~mVnwYl:{0FWewAC)00ZB#iwOYJ^|M8f$Ƭ[X 0Y6э pi%(?Lxe%NQDfLlSݐg<=43pi^p<2L+Ĝ6n o6iV#^ Y8{.]"w?SDQ#nv6UпŏaNkֶ٪b{ion\\!&i6Ҕnєib=nb+] 'O,Tۮ&'3`?<Җwe3z~;v@idMW3",ioQ&=kw9ե8dxsej &&=? !I%eݜ>"vdf\`obވ?9zuO inv"HZ 42>\M 'f'Λ>(@ni͗0`.#klx0kXsKYSjJ[[:H/j%Oy>緯)?Ys'fw7ȥQv=*:j0dN/Vݔ2"Ȗ[e^z} @="V3 F=?Y;>쵸m۳!ڻqAeܚy0|S@c9ĜWO ;Ll1FHO+xRҾ.S%)YqU3. t>5p˥P 2؋jr!1)`ff«?CRB&NMY+C{PW]LT8^i(CpFߵa!:ڳDtg0! zsq5H}KFܔO. H=жd.A[i=82i*`@JuE5)KV}/Uf\MѤj3ZG*m8Hjzz !+NCPxcCQ|<~VDpw*`O;  |=J*J* O{|c,6p/C'B%9Cd7QmHw5{3[OZ[<An=l vWCe  H%C.Ezգ>h.|\>_ lPH%gr[#H8 a@zk)Uvऊ=پK×@,2xXx%ƍ~@c K_.psW5f;^uΌoo@v[S‰7!#>Ҁz@&I-BΧڰ fJ6lɉ(F3T v^GW5:fPLUMɆP׶VAnT^Wc0PC7F&N^RnHy`rM3^1]3LՔV`c DO(|pI5(`5)~/e˂\&ETwEdEd_!"ՒdXO5amrnM(P~$袮Iž)8 綤paHE' 0R}, *y R]$;W`4 &!4vzSdzl4*nLnviѨ{@q׏k9"j3TTwdP|iw`;u@$Y\v9od\_JR?w=^K4%^%n^toz5tWqG ^[%&|ʂO+5 [;<8_D>dGՙRl[@8N>_AhhX$;q )~5wT#quSbN n 2}lh3 Tc./QgxQ/'IVC ʄ) }|=iDRB?x5|8~j)B%"0b rS?EEt[)zJ(0T62k8)gPXcéSد;Rk4 0T֍U`DXZqLx5- UtcpHE"Eu.=L,L֡L6(Yc"΂`l"O|HE{՟r9wjvү$;ӆĽunVGALѭəzJ`6IwS3u{X <T;Dا7,`|^"%n7766*vE =8r!j[e`ۅXƄIX+X+c"lJ,P(# 7#bXoz=`RP`c|Ԕg%o ]@jASJ5s3YH>%qe_ܡW՗I8:%~n[RVƻ_I H>.>*6ࣞ/%jRz(|id&娾>T19h %8lB0YC@J-i[gc@rrRN.r@u~-/@Nlsm<OjRrJ{T /bi75 8QIDiY VUho_{Lc(/ol\(,p o`ϓաc/%Eusov|PE{_L3ZlΫg]8y$@ă~y+`\Pxqܚvq\)wP/;xQBE$/ p\L)y0U^< s=;XSctY `V?JR|1m,9<9 t}\x!h)۰cx0tB{x9,^]bpp8Qpqa>Ns_<`1Lb mAHh1x6`V)6)Wb,F l $.-ev6\ Pu|?>y0 _CLAB P]薏$,}Y'UpH}xO*`|=)7Dl!*9F=tYӟ 8ٴvTqU/#c_ͼ!"GSZlP{ DB Kj y)UU 3ྡྷHGw-}k N4(R޳5@d?PԼikë* nv(_'Gv- B1[㪲t^eAr$;rfŋ(r$aB@ƑB{l35McN@^5Qe mf'yc(cn9gOv)Φi*D()0sQ!6#C%ܓTOs:Y{54uIݒ 4[|Q[8ꋬ]983`ʽQ?T'k_ zXYZ ݫ܋R#Z^?& 9JUO6k-)40i(W靕ۯЋf-`+9nc2)z,7a9 }e<# ,\X䍋eM.9S 7D _89u";սb =\aPΏ$]2:@#0] ,*̏,'f@+:f@[AG{x O1WC-(IԞ%ZbKNFmWx9~ekexPI?- 0w 6EQ|ɻJص9rˆ UW4 4guQa%C = Pf]Uc5UM$`!3?8"R[ޏjO\c/zo,ƆV=Xi1iܗݯ)14KMP*hɪyhz Vy @[J\[Xk=j59˶h?W6Ūq]JE9 j|hwb?qhb a]Q{3&rtz放{P IDATY܅X=gcѦ:£mtng`Y[a:LƯD݈O꧘ ,!ɂsٌ)[`jadVgsgg%F%M -l$˻qbY8= /nԮ7ӛp*{6jSr8Lfv,T2S&\}j8+qEJ-1s"G `լKFxv0S Z?}* }+Sso~G &{ٽ~Wp%ž W`d/Q?v{$. dOeR&*OM@aJeҤ)X&LX"'jN+X /XF`(h8r`?^< 5՟6V/(F54$ ;M``~ 1?rج>ղWfⅥ:O!VQqVM=7d2'+ܡ |ǃ]`5ħ`1}j0}uB:j 6WD˖5ã ؕV˼g|E' '<];@^xd 9B~zr>:?!;8Y4=`Jp d޴xK%p8JsuJȔ1-6-- 0)B퀬i!@xʬ"@8W'a;#HdF?`8)=pf ck>e6| voԼ yԼ&@.hѢc~cn]u0Z:]R7/3)nLQ, ڏ:E8{<3UVȢ5F&0${ ̛Ac?h`~3]m ,fk:aڷEQ PĿӠL[9@A%pk6'yax !Q{{cҶe1Xxvױ⠨,c* \J+D2sTXc᭤pcf6̋ ϽǺ hLSs[/T4>qXE/4B>Wtnx R[}H0Oy@B*Wthl$ =hsv,+H#ufT_Q!7O&0jNù<,&%ZVE}uZ*a0# yt#;}r|t/ۊq73mI+DH[1W \Fʆ@ۋƌyF1忰~AI;A/Īϯ A>@׆<|n`lm  EQT>=`2T$S>{6þaF Єg^xCt{I'& m{sPP5@%]C?oZQJJx`ٶMCCWux?B  ʬ BTTFv`Hͱ̱dtGJ;2K㭯_IPr~R#06~w \I75]{GhbΔfá/. p NSC+f*QDi(ψD/z L=Xy3N\p<~-zusH#Z46X L%Eoj$7[P݂dKC@ x@lCsG@XjK{֙[ \B8ߚJS7(XVӐ:_{A535& IC}_zPa ZwFBsIӊU2vIsVn,ƭ=3FXD߂yi,LYaj?ijMT(קF/w?]g`}蜾N>w^a5&q$!=ب@26!un2B?6sz'Z+ה&0."'YrU0.[e*ĔxњŞbl%&|=J棻 m|9.|QMN]#tR 7fR6f?DG {wbJpdv5qCk2 @+kջؑ:Ɇ|G@y븧tIzcV"2tyn.(BW*OSgs Ru5Jˏ }I orKD 5X$QߜCDmjuGF#dY*biJK~}z@p5 M8=beXJÖ 苁w wCݱU)t (]bOn {cr]hO֘ !>gg@r6KrPH@bq&0 5Ez2\RF#,F@2ghlEϽؽ| Je1`&ZŠw@Ցdh@0E 籽H4ykOU4:| S"*/zLcƩbr{n) XDzjN:2)k kg4l/=Za"cĒ Qd`&'0A{Fmc_X< t.{%S<0Z@ֱ4- :6@r:HRkyf;L8Z6P?Oc%LyU1MSxtal=4s#3I3ޕ-}ށ[H5(, MQ&PW^I2|EO"DY]6&EU =FT&RSb{>IQo;ާFi5tIgH c}Zp ~:شs(8rle7FaR>! 4rOD.U/)JQY,Ba ũˤw;K_e0 3=hfX,|8cQl1BJk+EPZ|Ö+rOAh-H$9%}v| UJ%-v40hK4GuɬV˶>l'#W`9#taﰾ$ w˜R)& PQ,ܽc0ڨ 6Ht? 0-,*5B%Lt ^Q`]L@ZRb^]ɱʂ%̤q$ u6ŏ@,Yp ˋR6aʚ1R^C1 \W/YGmkGW@|C 9^nI)JZ+Cט]xcb9o3nbe~tĵLzn;(+O)@4Sa]JV y@TE$ۺ;lPNc@K' 1Ư)ȋ@n O+3I<i1$ińKwM.\G7X41Xwtظ9|bQ"'+X?昆6<^uazb0aneZS-'"ZYF)[//' )W&(yd @+۶6q-טhVQ@|-o4Դ6qy8[ a \PNRtlL-0RCL௰VB0UС1)$dhƌqԙI"fG['I0d1Vpui2PTIgT6r"XEDmFMO3eJҜبF}EwMFcF0Xo{\k@ V A@=cO{N=IԮ >ϗZ̛LBOm> ࠚZ4~Id\<O/lR? R*ljuzOTzṜ]j7U=%]AreQq::_ojV [v[ h(?䕰Un7d0 R"/d䅬tv9$/5-nϴ UE'eVq4YŨvފgYxccR(ާɒw A0Qy~(ޘtuuƣp~G [כ'Άz5>ʫG> /-y&TljGgwoLnjbEI_krBor8&sxڷXvܟt1!jz4]d9gF)|yɘի;QyR< aCgIzݻuufgqZYR;}QwccԤi p,.۫\g<0ܪƇ/QurWu?pfiطc @XPW.*_OƵERV 5\WNټ$*+i,Ӌ;fЫlzXNRjjo.%;{gGz<{~3{,Aobh7;Pe?q}+TƽMneBh66OX$j_k @X m5k <0h[i$~yx3ERTŸ7I4N/ RӱJէo_V0^~t̖E]^~K?kMЯ﷮~;IzQ<8߯TWrR}GwRDI)@Tq;nWyPBvvv|@hݛw޼yϿ>:mH>ßW GO!lBqbثR||x][o~(JHzDHr!FC$$c{%vݵOuV'3>{r΢[Xrn>u.47WO֙& w@/f<& - cAxT7k?W ;q3 @=%Ui^V k։]>C@;VU5rcK/nryNU9{rIxq~׀‡#];rAB{!'`[X`?IbK7+լpyKʳuTK/j47M WS%܆L: V2?'ڢK6]f@M2ȪP0v5iX"L^CsZ] :庼U=^z'?&œ|`rݎJJw}q }8F͉1|õVgp*;w(f ";RYl=eup;^RLj&@:\~laJp/ ^aM28Q@!&H^Ul=Z M7| gW-ۃh0 Ȑ]̦,"]29RhG]8 /Ubp !?^zfj?x,GBuؐtKY _˯3)?HB!8] 4N%]-W]=ukӮfADAKhne`ו϶O]roÿNK=UrWyyX$ .bZ$zuv\\ilW0=AP]f!NiLwQTh0==bLͪ\Niy;B4xW*v0]3=n״x0bj׊t"91̈́ZJF'ri-_/3X5hkFX`|D/4@WK)iO q}b]}B\ݟ@1@F`C{o6S,u9fF=sbsոgIS IDATlȗ+X(@Ya`11s{Paty^yY@χCPbo*<,Qb WoӃP|閟1 M׆RGCO_: Rxv<:mڶ!Gh d#I2ۀ>MNG&6s2 ^zGfx\ T -`h](@ma`f>.@D?%򏖍p1ϽrJCg8Th; >ureLxF~Ͱb0pvK'95xL[U@hdsPt 4L4$tOSswW׳ёj i[[n0s e_^b$]*4Hnz$2z빶UW=YѓǎW2 8*? < <*ɱ\M9+S| 8|OP `}/V #e$S|—^k,@`LA0&w =,˛u3[QdHɉC{0wk!@ #p`\e4BMR"D`AoڜZPvQcdgsJk×;-8g|tGeY:QiBe K̥RSNU;b M3R^ RrN&Mgoe"C8r曯 i>FA6|[~)>|eN *!Qd)zxwtj/ziZP::{D? b܃1л^z o5 )2=^#5 o 0͑*rW@%M= 3uX{g4!>.V0٥RpLlN7z܄8H or %0C`|\z~#*:5U.S¹y /pm^S%_>=%&o+Q!2Oe8W?mD' {)M7;0YMJf+T ҋfB7ba\Bq$H[5dATDDpab&vZUB3g>^ڙg9ɬZ]w0X)L/<,X'_-[r& @?EK\bл+Vuѷ?/$dI@t쯤T S]>׉T%xGG/ n@?i@q>pqt2L=u6(/m#7jJ@R&J(e %LD'&5պL`\2[ #U,Eٱ,t'3(L5gN1ԴqTO`,O+_CÆgu t $ۢE6im"\ ^Ky~iyuu 6;I~ na *S}Ї֞^ȏ:s<{꤆N@ se'9Dd"s 4~k`Vdjσp0Pv:=T%a0-M$$|HM,vB @-- s27(@q>35:X`}l XXͦ # s  @Yu8⺺ 9'N^a)wZYoJ?Pyo7u9ޛPt! n\@'>ֆ?Bda `W..Q8ͰC`}}ocJhѫi5f(R } -ͪo`ũU|d 'yQ'1lhSʯl-,T ƞ376SKq# 4Ya4ηprncςU/*Uƪʋի7YCYW{ Bωr'.A&G phss@\||Y  H豾hb!ӘkjQwE,X0x?W=v+${k#JW>w.=2;J pPR`-Q:z"{o.|k-zE/6WUXRuM,mBV=Pn8^>@@\˓$œ382 0^ʃ,E}ù  O ?Y,F\}"YITˆ\a(umXxnRmn\Q#YG)bY`M~u ,N/<@G /bb=ww?{?#$svXpP ~<]/b0I?jjeۧZ%y_uF~dд B]#(@ooYUjOF|Luf ,Vu>p$ i5q9uN\p5hCKCq (<ҙU6Zu_U@p/oV@g9ʕ}|n"O@/ 5WLn2ZrBY󼩕: J{jPԋy۰)(2YNcve,XxO'G+N]5v :;xXm ssA(6>QxlI :asE(5/ Y.0VfSo]tZ9v".T&Kw. (#''?A? DQ-7+u,lÎ,.t9`'E߂r?YLS7B@ 8 FefdTЅN?a@NjN~j* Ep#jT_YW1xJq>zG_B{& Vl;4^Fsmj ܷmxbH婃p#Y@ZtWz "K(!F4R{@>#fzϏhӟO/Gm\~rfѬ*Q@kL ߧyreF@aM[R}~XүhݧvWm{3[R +`6f:xm7@na !b;*4u$w76 ^(b{bK$鞇W\чMwu'@{?YH<뼠x#CΤ`>W3vOV7z;J#ꍈo /k=@٢/iNUHjaa>.@RN,OXUR[/7yT+No6w8+U8&IjnFfv@C@6ǹa,Ռ 6@cBJW ,O@+$@}ƋPh4ֿ@.uZ8?KωOZ \6%à0 A! -Қyvb_;8Ⱥ*e;nS\'ȂŲR p=aAcW駟7X^kW}^1߹^C,4 f=հ_dd]x زgw\qN37K}i:]b@զ%miuY#yCP.ʣd2*FkfڏtnپkeYh2Ac׻kzn9%"!UMk].d @^I.b=j*xM5\<=~R"{ؔU/|0A2J^ >pN'$~r ^`̐?=a×L}~P(MϯH:imyedjGꆷ0qB;t ,խ:͛jhmՉWr6[WefUou[Z2a5kuê:Nݕ邚Ţߝ YQZ8^zQ0C'6onZQsps pp=@^ְ-kbHu,+͗d>{j}kPd>9zfx9-ӟ2g_ڐ ~Z_\p T+8O'6u{r[㇜4]+2̡(\f)9! Pʎ'mqCeZgZzQi,3NM^7TbJTGeݎz1NYoެէ޾14;-9Ӗp0Z gkޡLT̉(#`}*l@k7Hf yGPT#:nĉ7ݲ䗏ڙ1g{MJ78cPvz~=ӀjȗBE\s$ })yfl"<ŀ Mao9d`NЏN&xyB>d1Eq a?yurQ{ݠJ@гJIg[U_gv9fepƉt_;OMF]<-QA`n[qyEI2) Ӷ8w~oùffcy2;kNy;~ "U&"{r37w|䄔!S8 @s2X>^.rTͺ?B`>g7= W}NwrϓKt'RG-,kCSCDdKh +sJgqxFƦ!փ~޲xSK^6m;z>w\ٙwduM{ !+eamWx~9t#rl \N8 U"a?PNP1Qyݶ ~ *  * pO8].*E ~ [+T  lp=?g/J@ @(x7J'rmep?C\N``7$S)`@8 Z-_]J ]?%ep|L !dn@8__ Z @ E3ot0!L~K`o5p?p?otI ӀD;(;hcvo%{:\ ./4s{Xֽ@Yr 3~.W        @@@@@@@',ެ5콁eu waU[{[ڥP+NdeWviVd4*gVkl/>p TxQ0̆l/i. [3յJЇy ~PjYZ>k7Ѫ޽>0 3If%1'fewWo@^WV KRWa<Wu9=c |:Iþ"c>0.fiY5@! ^94+4ɫ ;UєࢭM]{O|ME-ӥe#71111@vZo\0}e^Rsrb\hwbe?Aڔc}iMLLLUrv ;/^k?dӚ v}罌z;cJ1ct=^}~&&&&f7F&]oNc2崊^eqbvۖB)Am s Km~&&&&f7 2s)6fuk^r]m\yl-RѮ[Pol$Mj[t57111ȳmOX{|uԤrX:޾ٌ&ʽݥqAZ෴ۯ)j S?ؾme𳲗a4+>txySibeC!}YYϯtj~me^qOB:y~&&&&~n趫Mm{9HIi&m>,hd/ }~/ kIw4GiRϯ;%?nSFu9w%[Vy:L3`DKTiЂsJ TN~tcѲ'gacJpVBF0wZ8EO:`bbb@9<ȋT` \Xk?ȳS/ibn ^WYs0bI(;{QuiA4Mט\_ P8/g7a<$9 W;?-Vv?geoPŏsp=.d_Mߺ^^'A7^(Fk@!.'/qm`o)ʧƇ۝xʁDO%VLLLL`2Z2]: RD&DLblQC[ IDAT1ƄSm?6/E&'L=2zxI׌짴nSj@X b,9cۄKhSvD:ڵ+{NYJVrkl{HQwUC@8UguM#3ozjxX`G G s y4Z@*绸SM@t8111cّ֪v;`TGkkN-N/pqiVc;Q u EzО o~DhG'-D+@C{"aHT;cOڡ\;;ťo|_ md#lۗ*(4C d;(rzP9wFȦl  @.H &&&&~nC_HzrRFi4.3^fh+#mLz<$_ǩ~~`u=/\Q~iPqEBz8|d brEvtю=%DjeALϘU-{֯Xg9ޝO7;k7<4pg8/&L }TVÎRpij2CNTp5  #)~QKps2֙m+nA_lwچa_)[*ދ,vOnq#SW!%'j sv4߀X;Pnjg(cTxsn6O*E(k{$`q!;FbDQ `$*~j| 8kg5 Lz]\8hX?8Ժ9} /UyXӮy5.LOk.R`ea,U `X f%sN"o愱t;} 6Ffp|bfCA a@]>޳4'&&&~vuxRQ*?I'f彟\;PT`/p<>DVGy)W̊Ĉ}0Tc!¥M_OŻË  $g0Z1Bc\"uT཰@^F <\]g$۳b"8.BP`o\{[{MD>GbVG_vIn?OEXw}aô_ÍLAUYu o6v Λ Gy Hqb!>ď (7JUCz%:-H@+5"]*tJ=$An$wE))EjRq?0:zܻGqٻ]qxY@^k l9XR"Y,.B#è8mpbߧٗWw\g%8w8ϥV*W _yYUGCJK:~d(X&׾ltTX(-1=7mUKRy]w9C0%ik+fI"JI9Tte!bŊ]M]b?%U+%V̯{n:̬p_q`nck[/d6Eu|s\X)Bjjc ql "_5ͷx8pcL1FZFH8넧M* rr㼴gWoH .;esP *B^Ñ6dQw! 7('Ma!8@ !I:@J#S3Ty>4SO픬h (VXjg q!/cgr7V&T:9[,#-lgt+rg']ns̆D> j|*+5;ؠ𩶋~n84'pBX'(*FK,^=&,)rͦq 58ck a6tt3֊kibŊ9ts~>c PgO'&F̕v9ɋwjmFz?š d+ :*[")/x6s6\G_/7sQ\(mWii "3B9`Vxt ܱ1JtM1Kspc<{]o"Rށzo3 )Q[7 gVKIWL,VX( ; ʫ3;z׃8J.#uUA"A_Ltl Sk,މ ~m3i8mr~y$Ԡ#5&׺~cgP̯dMVL_drN,l\:bc_e!$@n*5P;,Jt~+tc$F2a+0y F47v(VXb?nȏҡ_a @rT72f壵, b )GIn-RυB9{*mV-0f %(,stSw*qC>(pO\%oSzBJ<@w "wlDzo/E$@Lz.VNo @ U:-"l@LUvPo^bŊ*踏%t\`W9M8Wczfe/nl׆cb95–/rR,v'SXg^C|yDR`m i4č>ϥ+gfm6B^*+!@:u%tC_J? Mƽ,VXb?űY6BMav\n'W~nX&wWıt"|Ddg3³Z<޳|ԃ.ow2jYB)ci3١ҩ>U!yp3UFIІ>o.õ6 2]'F\^Eu`K{L/|`F\Xb~${<]{uifQ+<4+ɫ~}K7k˧,߀*EG9_`M<.ATt)XOw"gdqzgj^SEXSX]fVȫ!f8fW(uύ[^Ճ244i3@?;TrAe7,obŊ+`(_m "ѕr6sf\>erܴ-=s0ȦikFH&ÀAw&',Ei~ iXHN[ ho|=3;-Լp\5'[F6GS,q3^@F|k0w݋%zdæN`LR1N;mq܈^OWRnLDB#?0hZt)=@cA꽥-oU+V}&/X0oo8 D^L~*aXf/̑d_M7 ͙ @5Q;]mO1ךy"ݝ%m\S <[ U/\"jsmt&: ȯ{V#O8k @?]+ۮ7qAF:E;'mQY>sο{!$& wgƮ5XGk>+VX_;<ŇmB8M@nǘY~ xk˺1` ٻč6 j@B)&1&6H%.ڪ=?!?嫝ᵀ ?rtIYŸ^_M{Ӣ2>Ͽ6>zy^HC\>8qg&"˽WߝɇE5e w¡r,p^: =⊴G磗s sYRqV_?8ejy˭&fEjqNG[q3 }[C|P&j$հz]5>|.ȓ4o-oH7խ/'i(WˇyUmZ0;e㒭Iu_q뭇[l$ͰnAI8"yAqm%2.f>i+kwQp;'9<\_|ϯ/lNM,Npp+jb}8?Օf90Ϭ&,kP|\:7{겴EᅩⲪoUVWfh]Wk4y6oLjjYxy\_6bfؕIy/wzRvF *||Xڋbx&rf?>lE'Yhy_.W>qCG4nqz>"0IX \ <?LY㢤ݟL\Xa vC96?ػ:7tvUo<%@+t\0e{x6i gھkǣuwÊ = ~ywEQ7Շd>jO_̲p q{qHK(+4m*$o |^k;eB[|8ix^:u_2RG0*}('Mk]@@@@@@@@@@@@@@@@@cDQo( ' q5mY}4xNŭ=[7w?..{w7hW8:%,[E,_fft tܿ\K?z<9f/@އ+.A^ځ4aw"2_3 ;\A@V@EYdo vx,.aOP/n`[NZ!"j)'@G@ @@ $@ @@H @ @HE&&!xa~@@~[j'V5nfCiy7~n>S!\\GUVzz&,L4Mˣ ]$JSxlv0 yxA/̔ 6<81+OMIo&$ [2HؑZ=8Ȗo힣(<pbPɢjz7<Џ_gXq<735M?B@}8/]'h޺N]hӰ=khOǝNgR&@T#Ӏ^XUSCwj0,̗u+tgDih?~IYQr[z$gy^nRz::_MӺ޿>E^TOQ k!Ut~›?N7VSoȲpV=? 023@ч! {K4/nwC>.370A9nfhCM w'KE~ +#m4]͘\q'2ON \c|lQ?i F sI5MPelR=eE,׏|)Jyo4&s+^젵$L&WDQxi;G`JWOm%Nӈ־g=^ 9a_ލ⇹Ķ6v{ ήk0ri5Da\J7G-oVRaA *?\~?58R熫G:3Ujg$^YO3NE(z ^4dU"C!*E)y5%-a <ݶ'Q4p6jo hwVELY%{rdcN[{rlảL<2^7kc'iM+Gwۚ|Zi#RxVU /ãחӥ_ MWo c0",A>PWg735cY 4]Wj N*ڗՄB JKaݘow*xYS:7=[ &袣ǏO`/dȭ*P-"xYy(\U{q 9\U7fQUI6M_)v1]B5F;@z$([NX-DIl8\ه\otJm Rqm6 q~+Do6*J~qyB&=C~)xw@xz ?|' my-Fǝ5繉@\joatq7ϩu8 bznX_>WW^0&9\w`Y'.CkrJů"Vzj%PИ~;'Rlקua=ƟhEgzs/q=zNZK`'tF `foV (kQ@4^j˄?nA!ކl{ LKR&uHwXCX($`Y-tl mFCaA ă0Q:0ept5!:o uW흀@^Т e9`$nԬtl{*(dm>VkѤW3I *mn.¸F=u``EVT@1:n¸$0j_* Y+]N EE)+38 u_miY`.Xx. +PnrYЎ!/QNBwk#;v f`}'p5v4p$<pwye~܉zR})Al/(NsGUPﲎ?2Aj4W+-.W`lh}ߣBySPb0|]XTu+(sh[G:+m}u *xS p N2hT%Deʷb/6~ n|aY\*1~![VPVpd4W>R P]52rV2zO .pa<!`mb"&Y1't8R$b)F*SA.v W*vEjjc]b9>?o,wΥuXx҇/SrfEdB@Pٙ.O\¶+`V%SnZ8k8}Cb`gSx;3pi;za{xB ;!nOߞhxi%@Xc6LB\~~anWA%Ou_3`XD)Q#TneDj+JBt6pet43!$tw~Y Ru-h!*r9fO}}nu3"5帔tQWaE\ ),<uT @y&hof3`M>( ػe~LqcƵzQ0C 5~L Nb[p,`"{0s|x`H (O]ڄƶM}#|\xKy^|El&`h #!e5OE{6`._.R.-焝pr @^ !9[HHx^ IBd\}rXB|pmSsS@V 0z8קP˺1x[vn5Tfaj)嶁t4~2zD zѭZ QcԷӝ*ʟ(2h|#?O'Zx㶁8-!<~`;Մ>vvN3bxgob;L׏v .vuǧÝmQ:gFZVgݾ?9u\8(\`u@xW$ZwHfg+ޯnW?PIq0+v}Gge_`.?2 PKG^#~U ÆX@l$w?팻3+@o gQ? i|I {V?    p%ή*n.7.o*.7'W]H# 닻 ˋEWbv& @#Ky8ڔ+7J l'lw 1y?~{M 1hk %@T_w "nx^ޚ/ ݺ>o.]*>>)\XiDio.|MǻpV1O]``^|JV^{T|Efj5%k4h [oDlQ=Np kdX? "Ji/VZzs:WN_4`ٴ?vB``\rA P0ɞ^8z<ߏ؅*:Uk$Sf'.]{NBOA.Kv)(:?t0?kCxp$^+H T[O(j+A\mޕh}]t|St]YƬO?ZPB8FyfM~Pc3G->;Eޕ i44Z1TN_j.K~-. ~H_䲆L̴nV.sw}.1<lwtm9hcz`1U4E6bia2MvuΔb/tIĘ󪝙 xI3i/LOJc#F -?0H&t/Ħlm3%_))Co.2Ψ X׾\1Fjj:.ٞ{dLK}gprhqc^jcL&T4[cI#)SRC 1E]UUEXDxD+rCxikӒ/ū 63`ŵ;:Aߦ(/V;3dCڗׇ|@XpntXChm\&1 %'c 6f%J\2/ɫs@OUj|P`_||TpP|I]<H"OPt*GY'fƫ\L]Ηh6LLA\oxM{^mJF(OI}FC5d(TiK4 Wա8aIsZ].хgW +X* h,Rt\.\VrcB9LvFra܅"g>^Lݐׁ?&bH7yt܈p#<$ђDD Q Oxv6*ԃ7R'ΗH{r˦$dD@pј]i%XU0t/ Um%v:K0>ʨHf*&s.Of1;#9يs4 't#%e>s#vykܶ2ǜJ8GmUȚ_E7һP4jskh)mUv'A,`8N .2}vorq+8&՗>y._WmiqFD"M]w A ^R @=.(@=?%W b.nYR8F?^/4" ϘcZ=GQ _806I Wd~2CR(C~yXT~b]KMTh.e˲:KѮQiL).\Ah4ܭ%~Ӻt%:fYJx9N'̄uqFǙ ȹg`f*(QKݶ0߹LڙӕvlhKNGAn2zŧvCRI5C(4k@#׳{p&+A\=YpP)Zn]oLn :<7A]pcfԑ Kn58Xdֻo=imT HF6 #Ü_'Xbm}^(ӱ: X VBQt~ DMy%e  'kH|mЕyZ$_j E$jn2WEwRQ77sPtf^5́#sfu<"$O6Ʌ-Æ^;ƭorG 1i*e9qS/ l\v! *,(v*4l'g={#cqH(Y׌{AL1e|]Uh0w'ط^}@VHJՇNL9eKn^GQ(^V۪zXoƊ ?h"|AJxxwz"`ۛiNއ0/iYGEd}{P"ԃ- #І xK4wx0b VT2z_XFK:f,1OF6ˆl^k 7#r帱퀷@# moG<L*ۤPi~ST-m n@z+=4\a~}^P:!Y=mebqFedj4#BP/wCzһ.~dE F{\/ @*1h"^籓 S|z>KCO @wHSFQUߞ@dO Kw\iktv̾kC!5ʪ0k.7k\E^1 +wQ 4`0 6!c)!dP݉MS\\+?kw^`eO}l;"1pHnkDoqv^~@~ehA*z;'Fy|$Nqy 6Q[R2)JQn8@.@ym9qaW) k57 fD qIܐR Y 0]ߊ #`),ݚ#VXpo |𓏵^){K-AHEZ`mhOZ:UP&ajj-iu#WCYi߅;)}&#LBOlq^d9^j~p<}oGzIx'BYιsgH&N^&P[B@ҁ,e ֊>͸]cH eeAư^8vb\TɫQ}т+Xx{ ξFT9 X.x /fW8 J?&2 !2aXiD%Sn' .GQHhK;]~ !:e-/-{Ɖ3,+xCp%n+(ҩ=Ay}ZWXkjxֳ *?D؀$2+piHG'<TGOnoFRK@>إܖ薐TjÏvJ.IqA!XBg~*DǶ1Lrr6wM6~-э{ .4 wZL>`(;1Z,9o{! H'B/Xui+(F#]MymabsT)ִ{o 5x7PSμrz4Ls kޔw#IA-mJ%z1EXZ5.'LoZQ:Hцa |O]b&g7 ^,?ܕ \Zxta,pkyWO={j~hSYܭsbBD)`nh:>(uMPd(Q9<0lQRj51k8[7]ʾS"`*?{8E"yH,bqGkoɖ8tug} =9YZgBTMCvM-{-ZH!@6Q񻈻^Yҕ=8_5^k[_) 5XZ0ڭʛwn1걜@S5q˛/kz#K)qK 8|?K l'使£¥?Cu IcȚchn952@|o4'Ԣ>W&8EE"ѤBCF*W Oqa \_y[ jLN\~ZΦq0Δ}tpe_(Ms./IMb i\Zef"26(p3a{H3 ~Žh]饙erQ7֐Sj > s5# 0ɴ>#vakx ~9DiD$.f',ġ?_nR{yHsflH;U^[# 8͏m#Y2*[AS%2^6nKq9&EADŷPI ǣ2}/'{)w RQ9/ʩ4ށਾ҇6[ ŠFn1Dr u~.-@\-^}`<HSbNa+x'R"7z0.4=1@ϰ#g?r ?_L_IDATW/N I,3?ZtIC#~*Lb@ %]t{c#2"-{aWX4QLLu|FerI3O{>j_^C$[Pe7XQs.W8raJ݇F,iI¤Hw3I00q U~pn=pX佟K E g|I9º^4l߀I^ > #q^0{ٯ\ #Y#`^&&?J ފ1 W%H! [V6cEw2ɆAtХz(ْ†X%~zPm |'(-V7IbAו;ϕ[G8<6 b=6 Nvlȵ >u*ЯufC8Y׆J,}3?VkN0$a !ή{쪇6{xJ?;La#2eؔTs½ƾCv!&׵Wa0v[>2+NHf)=D~:;Esq:Vk7%YRݭ IBvi\'{8_;[#gtg_M__G֮cJ gZ/&;;m$b!^+Uf ؒTC=̨`,׬ҙ蓽9I<9ir^n7HC]9yM"Sp{( ąȸ#D>0keRo[\͠xz P'[RәJ)~ \tkO [ϷxC cB$Hs>Y2>jnuw' t:iЮLJny[]] EftBjL]{,{ǼiAڢ&E!+x*Pd_0t-_eK7ݷ nޯ0zɔ_:$M?{g8;r` $S8IL{Hkz(J"Ho Nc6H-VP77 ǿ pI=sU#ÏF_/ΊTD"xcO* W.+jv[kN = t.(EmTX8M9iD"Ho<"S.nmNVҮr!w{^- >لʹD!H$J|S3[YW8]j`5)ߴF&`Y E@"HB aѷy@Hq6i=H$0n} .+}6]NXvDccTy~ H$/s͘C Z?uC(l+\Gwks C ,SDvYz^d$D0oQLj2y0Д9Vk6R=thiIvut;YIy 10MƝ;c0 r nЯD"0l9ZTP i];0NƤfZi+E̽xpt7R%lƘ I¿Vmd# H$w6q'̈́=>B@^hsFh4Ӄ1&z>Zmck݁hzk靊)ڽ/$Iq"Y E4htB@"Ho jƓ{]P_+{io`L?f cg!NjK5N ^NQ?@',kxU)n(%K5`ơދCGhQ[n4 H$;j4vg$;&B6U~1KIDzP#Nj>=Xm: GDW dw85wt}ˌco3-5b@|Ǎ (1!a % HXD"x7额 >w=id@C0`kx3+[!Ct 6ʹIlaTR=HJhg L%Hy$DG=ڹ8@Ùt]Ƭ s.½ޗ  hs&+Q'`#Eum T%bQ+D"I9)-x^ Sc22@0Nf=/+0]\p%t1k \jVW(M[$D;Ԅ>X0k`w8O  5qAluΙ%֠I"H$7MX&`m ^J۹_:0] d{Y]:AgH$mKZa8^`._ULuWY@~f @̷ [O vK V@wX×D"HQH?`"َbQ&0]uvg(K O Op \~@WF.vߎZ*?\G@"HX zŻap4b9y Ђ/~u"la\pA?M4"Bu D"?/NB( 'Vf'X%X 0*|>jsY?, >])RZ,H6 H$ ߭ZϓsR`+ؠJcG3<|:ze0'%==vbVcM)[ $}H$闊 X%f{ڌÃ|-xL6aa`iKS ]F\# H$? tb>^fN ,гbC}sKJ2f n hōX͇p`e.]QAgkET{Oe] I@"Hv~ ه_梖By_nޱ"a̮bB24D"H$m؟C[UK{b{7rYOx+ck#8&xK`H5g/VI$a'#Pl ZM6J"HV*8tn_{`4A:$x$\"v=&YNgtoӏve[=Gո[{ZZ7U x@ @@ @  o}9 '" @ 3ȴ @p @`l @ @ @  @ @@ VôZhf- FX<@->nx|p6YbU@u2 _60B,{M 8P|^HMuSu8e n'?o7z|p&z է͗Fh.Fupr7.x3k׳ jr;lOoN2QK# e *򲿽>{jԿ]/?= v"o޾}V^e$-/Po]Z0t>Oo<om1H`⋺;F If$*V<* Q?> |/ >8֏ o[z9N=^'ӞSr:{Lo..d~NjfYo67OϒT{j^|/X`r6>+,Y.X.$M6 @ @ @ @ @MD& vP<"@|( f &,e'P4lxCP4Qx ㇒LyA:@twP,pt= (m#(#(w<1 ([P W c)NdQ ZȷX5ȷ_P{? OU?ʑ5r+V ү|/;){rcmkw=YC6JNd +NPBF6IENDB`fastapi-0.110.3/docs/en/docs/img/deployment/https/000077500000000000000000000000001461403617600216735ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/deployment/https/https.drawio000066400000000000000000000633731461403617600242600ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/deployment/https/https.svg000066400000000000000000001170501461403617600235620ustar00rootroot00000000000000
    Server(s)
    Server(s)
    https://someapp.example.com
    https://someapp.example.com
    DNS Servers
    DNS Servers
    TLS Termination Proxy
    TLS Termination Proxy
    Cert Renovation Program
    Cert Renovation Program
    Let's Encrypt
    Let's Encrypt
    FastAPI app for: someapp.example.com
    FastAPI app for: someapp.example.com
    Another app: another.example.com
    Another app: another.example.com
    One more app: onemore.example.com
    One more app: onemore.example.com
    A Database
    A Database
    Plain response from: someapp.example.com
    Plain response from: someapp.example.com
    Port 443 (HTTPS)
    Port 443 (HTTPS)
    Encrypted request for: someapp.example.com
    Encrypted request for: someapp.example.com
    Who is: someapp.example.com
    Who is: someapp.example.com
    IP:
    123.124.125.126
    IP:...
    Renew HTTPS cert for: someapp.example.com
    Renew HTTPS cert for: someapp.example.com
    New HTTPS cert for: someapp.example.com
    New HTTPS cert for: someapp.example.com
    TLS Handshake
    TLS Handshake
    Encrypted response from: someapp.example.com
    Encrypted response from: someapp.example.com
    HTTPS certificates
    HTTPS certificates
    someapp.example.com
    someapp.example.com
    another.example.net
    another.example.net
    onemore.example.org
    onemore.example.org
    IP:
    123.124.125.126
    IP:...
    Decrypted request for: someapp.example.com
    Decrypted request for: someapp.example.com
    Viewer does not support full SVG 1.1
    fastapi-0.110.3/docs/en/docs/img/deployment/https/https01.drawio000066400000000000000000000143601461403617600244110ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/deployment/https/https01.svg000066400000000000000000000245271461403617600237310ustar00rootroot00000000000000
    https://someapp.example.com
    https://someapp.example.com
    DNS Servers
    DNS Servers
    Who is: someapp.example.com
    Who is: someapp.example.com
    IP:
    123.124.125.126
    IP:...
    Viewer does not support full SVG 1.1
    fastapi-0.110.3/docs/en/docs/img/deployment/https/https02.drawio000066400000000000000000000226441461403617600244160ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/deployment/https/https02.svg000066400000000000000000000366621461403617600237350ustar00rootroot00000000000000
    Server(s)
    Server(s)
    https://someapp.example.com
    https://someapp.example.com
    DNS Servers
    DNS Servers
    Port 443 (HTTPS)
    Port 443 (HTTPS)
    IP:
    123.124.125.126
    IP:...
    Who is: someapp.example.com
    Who is: someapp.example.com
    IP:
    123.124.125.126
    IP:...
    TLS Handshake
    TLS Handshake
    Viewer does not support full SVG 1.1
    fastapi-0.110.3/docs/en/docs/img/deployment/https/https03.drawio000066400000000000000000000304461461403617600244160ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/deployment/https/https03.svg000066400000000000000000000520551461403617600237300ustar00rootroot00000000000000
    Server(s)
    Server(s)
    https://someapp.example.com
    https://someapp.example.com
    DNS Servers
    DNS Servers
    TLS Termination Proxy
    TLS Termination Proxy
    Port 443 (HTTPS)
    Port 443 (HTTPS)
    Who is: someapp.example.com
    Who is: someapp.example.com
    IP:
    123.124.125.126
    IP:...
    TLS Handshake
    TLS Handshake
    HTTPS certificates
    HTTPS certificates
    someapp.example.com
    someapp.example.com
    another.example.net
    another.example.net
    onemore.example.org
    onemore.example.org
    IP:
    123.124.125.126
    IP:...
    Viewer does not support full SVG 1.1
    fastapi-0.110.3/docs/en/docs/img/deployment/https/https04.drawio000066400000000000000000000337231461403617600244200ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/deployment/https/https04.svg000066400000000000000000000553411461403617600237320ustar00rootroot00000000000000
    Server(s)
    Server(s)
    https://someapp.example.com
    https://someapp.example.com
    DNS Servers
    DNS Servers
    TLS Termination Proxy
    TLS Termination Proxy
    Port 443 (HTTPS)
    Port 443 (HTTPS)
    Encrypted request for: someapp.example.com
    Encrypted request for: someapp.example.com
    Who is: someapp.example.com
    Who is: someapp.example.com
    IP:
    123.124.125.126
    IP:...
    TLS Handshake
    TLS Handshake
    HTTPS certificates
    HTTPS certificates
    someapp.example.com
    someapp.example.com
    another.example.net
    another.example.net
    onemore.example.org
    onemore.example.org
    IP:
    123.124.125.126
    IP:...
    Viewer does not support full SVG 1.1
    fastapi-0.110.3/docs/en/docs/img/deployment/https/https05.drawio000066400000000000000000000371111461403617600244140ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/deployment/https/https05.svg000066400000000000000000000630671461403617600237370ustar00rootroot00000000000000
    Server(s)
    Server(s)
    https://someapp.example.com
    https://someapp.example.com
    DNS Servers
    DNS Servers
    TLS Termination Proxy
    TLS Termination Proxy
    FastAPI app for: someapp.example.com
    FastAPI app for: someapp.example.com
    Decrypted request for: someapp.example.com
    Decrypted request for: someapp.example.com
    Port 443 (HTTPS)
    Port 443 (HTTPS)
    Encrypted request for: someapp.example.com
    Encrypted request for: someapp.example.com
    Who is: someapp.example.com
    Who is: someapp.example.com
    IP:
    123.124.125.126
    IP:...
    TLS Handshake
    TLS Handshake
    HTTPS certificates
    HTTPS certificates
    someapp.example.com
    someapp.example.com
    another.example.net
    another.example.net
    onemore.example.org
    onemore.example.org
    IP:
    123.124.125.126
    IP:...
    Viewer does not support full SVG 1.1
    fastapi-0.110.3/docs/en/docs/img/deployment/https/https06.drawio000066400000000000000000000420761461403617600244230ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/deployment/https/https06.svg000066400000000000000000000664171461403617600237420ustar00rootroot00000000000000
    Server(s)
    Server(s)
    https://someapp.example.com
    https://someapp.example.com
    DNS Servers
    DNS Servers
    TLS Termination Proxy
    TLS Termination Proxy
    FastAPI app for: someapp.example.com
    FastAPI app for: someapp.example.com
    Plain response from: someapp.example.com
    Plain response from: someapp.example.com
    Decrypted request for: someapp.example.com
    Decrypted request for: someapp.example.com
    Port 443 (HTTPS)
    Port 443 (HTTPS)
    Encrypted request for: someapp.example.com
    Encrypted request for: someapp.example.com
    Who is: someapp.example.com
    Who is: someapp.example.com
    IP:
    123.124.125.126
    IP:...
    TLS Handshake
    TLS Handshake
    HTTPS certificates
    HTTPS certificates
    someapp.example.com
    someapp.example.com
    another.example.net
    another.example.net
    onemore.example.org
    onemore.example.org
    IP:
    123.124.125.126
    IP:...
    Viewer does not support full SVG 1.1
    fastapi-0.110.3/docs/en/docs/img/deployment/https/https07.drawio000066400000000000000000000452551461403617600244260ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/deployment/https/https07.svg000066400000000000000000000717331461403617600237400ustar00rootroot00000000000000
    Server(s)
    Server(s)
    https://someapp.example.com
    https://someapp.example.com
    DNS Servers
    DNS Servers
    TLS Termination Proxy
    TLS Termination Proxy
    FastAPI app for: someapp.example.com
    FastAPI app for: someapp.example.com
    Plain response from: someapp.example.com
    Plain response from: someapp.example.com
    Decrypted request for: someapp.example.com
    Decrypted request for: someapp.example.com
    Port 443 (HTTPS)
    Port 443 (HTTPS)
    Encrypted request for: someapp.example.com
    Encrypted request for: someapp.example.com
    Who is: someapp.example.com
    Who is: someapp.example.com
    IP:
    123.124.125.126
    IP:...
    TLS Handshake
    TLS Handshake
    Encrypted response from: someapp.example.com
    Encrypted response from: someapp.example.com
    HTTPS certificates
    HTTPS certificates
    someapp.example.com
    someapp.example.com
    another.example.net
    another.example.net
    onemore.example.org
    onemore.example.org
    IP:
    123.124.125.126
    IP:...
    Viewer does not support full SVG 1.1
    fastapi-0.110.3/docs/en/docs/img/deployment/https/https08.drawio000066400000000000000000000516631461403617600244270ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/deployment/https/https08.svg000066400000000000000000001021241461403617600237260ustar00rootroot00000000000000
    Server(s)
    Server(s)
    https://someapp.example.com
    https://someapp.example.com
    DNS Servers
    DNS Servers
    TLS Termination Proxy
    TLS Termination Proxy
    FastAPI app for: someapp.example.com
    FastAPI app for: someapp.example.com
    Another app: another.example.com
    Another app: another.example.com
    One more app: onemore.example.com
    One more app: onemore.example.com
    A Database
    A Database
    Plain response from: someapp.example.com
    Plain response from: someapp.example.com
    Decrypted request for: someapp.example.com
    Decrypted request for: someapp.example.com
    Port 443 (HTTPS)
    Port 443 (HTTPS)
    Encrypted request for: someapp.example.com
    Encrypted request for: someapp.example.com
    Who is: someapp.example.com
    Who is: someapp.example.com
    IP:
    123.124.125.126
    IP:...
    TLS Handshake
    TLS Handshake
    Encrypted response from: someapp.example.com
    Encrypted response from: someapp.example.com
    HTTPS certificates
    HTTPS certificates
    someapp.example.com
    someapp.example.com
    another.example.net
    another.example.net
    onemore.example.org
    onemore.example.org
    IP:
    123.124.125.126
    IP:...
    Viewer does not support full SVG 1.1
    fastapi-0.110.3/docs/en/docs/img/favicon.png000066400000000000000000000116631461403617600205130ustar00rootroot00000000000000PNG  IHDRF pHYs2tEXtSoftwarewww.inkscape.org<@IDATx{xչoN6(נxVRъcVG )xX}J{PnXV(("X DVV@Kr3#3{fo칬ۛ߬Y3kUDBN! ;B@ $jO+؏e?B 0,zgv+_%$ $x4D/ r%v؄oҌbGt2wT7,F,݅5Vs:maEthKAU ZJEM)u[P4ĥd0@mM S}rJ2;-@WL)dOm1%. $=}ļ&z^2լ{ָ-%-󯳻`[;X2< ˺QWUmF2Ζ}BQZ'Lӎl1,5(:G/qe3ڢɢn|J c$77 ӛP9MZ9r1CGSD}Qǣ#ӌiH Tiބ?4Q(ò"T&%'͓Ht0I} ky>^g=B6da0,k}"aNo`ghFCe';agDni6I m0b}fl~7ƞÇֵ+ _~n.evP미D5aq5-,sZB%?9<"\3 WY/}l9\ 4}-غNHPܕ:5%Oc` W<К[ld~E`&Z]n G^E8[6ˊ> ͜ZnEG= :f s7W7P3ȼ.O+);pc<*mb-]vu?l Mn7{pI$n0Sϲ;K {<57Ns? c4p7UdyknikrS{} /C7ש緿ޫ0?搗ZI 0豍&nB^n'lY|J~~G`b6NMv~پU;ug hP)rO] T/U^%hd~#踵+7~xdHo K_:/7/lN+pyj•g r8ΝCk}UU05_v}Aaxkzdg˰i} ~CS2dP׉N^2 WGmP@fu dZ& j}zm>ўZ8/F屸F"lڙCvV mv"]" ,~=+f7<-#}g%Ug Y֖tGuq8~&+;{%"LJjLJjfyzW1.TR@7uEjn2Yqќ&D']k4JOuһSVa=; }{z-s>xϚޛfi-N  iwD}v`&P49ޟ:$%1n@g[ewZ̓7,zۀAFvˮyI_7Qn :?߹b޶vEYb U.Vrm>t= ͮ4t ĵlH>e.-A<%GO[wVAp!i>G5pDlr0H)ynki+:":U-/ee6y2,] J(  7WU2cS??H֢"Sc.PB}z-XaabBI3U 6:&vƟl*{&W$ i!v(3Pgv}hM\7HuUĨځ|ts[)-?JIT44=b^Gg]So} أÖ> zwۀU2n}\noV%w,W1@8nW'260Ͷ@ <363+cilPy (߈RLi߁α'PB}./;֭2W}/o_=C@P9 eb Yv'{aNks 扈j}r;J%ԧ! < 5^AZ XKj c9=*_<)bh# PZQWMRp>ebZK\MGTƂ$mMR:,|Em". Tۅ(y)Yh%H!R*ʗ7=oĽ#<ҁ(TBs?**;) )Sd eȢnX']E(QRl6DB`f-lj ۅ^F%Ѯ@W.<%Q7W8Q#WQكA*E`nn7 GIENDB`fastapi-0.110.3/docs/en/docs/img/github-social-preview.png000066400000000000000000001715351461403617600233040ustar00rootroot00000000000000PNG  IHDRա pHYsodtEXtSoftwarewww.inkscape.org< IDATxw`չ̮z,r%w `J( IrRMnR!NPllp&˒%[{[mABC13)d]qȥv 4gwB)F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `F8 `n u{nO5 I׫:<O|"" d0R "".Kv|IJ$$SetJv)eBPӔʞ.U٦J:Tyg^|q!cRL)Lٹzfv-?]~v1AmmnTm ]MMӋrc<6XAh@ؤuUj]}뉚89;hD3 ,mwMa28 K+e5Gw/BF Ĵ }"}Qct$@ ĺCBURu^ˍIIӟ+o,a;?,Qm-bZVy s̜$ &C%; 7In\_4ͼx9+{#@-p>:4(^jx;ڇ<W0M[T"$cSuQz.̒L]'gdʘ43 ~mY[؍8IQ_-Wm_FJɍ̟.>/829r0 :Zռw]G,=4 mlWZeŬD=xRݩtC`gھ?83"O/֋,seG+-zޘ +otD ;=ָnj 1SkyH 9}/Dx]!yty3AioQۛm-j{[u_6S[)"yQcK'y#!>D4Ww{k(ȇpW6s=SYf<6RWL&r;*67,cθ15ujM];;6˘4}I±͔8K0 ުn_u_"crwb!c}rChUUiG:ٮED䌑c4`ٞF(d6*J;uO=R_=R_\. ;g1/_iч8ߖ2{&w₽ͮW몌'Ͽ,Xh@@TTtwwv9ա*;y9Yuoz"d;4|iMv{EyAYQsXQsON/Ne9}ɺ@ aOJצ:ZPhGK:ܿ=E 8AHO:٦vIig*jWGz];^ڿ߾S-;zظv.0M`l6{獝{nj'" "Moj EW\k|&^{#7AyPiFm'-Pju3zg,/$ im%&)7,] 1 ]ϳQuX>9Ϻ76s=1kW-u}gfWwξxӮ f [_{0"¦zϺ[ݕB4/~ykuUQ3.}E#;ǃ{!OηGQD+i=pYp1@g:g{i$9B4+ֹΛ.q̠R"OW4]5 ] A};mc_A.w}{z{ ^=nX  9ʺj5[p{qöQxOV-N|$-"?߻øfR׀?;dx?@8Gʍ׼v0YS ~x@@,͎hkK?F9pkw.\LpV]f/uj[1=F%ov5O@8ֺ7Viw)ɛ 5 떻\ ~w{Dz{!ooU A}iWk6ο,h'yH՚ijkn3IsDI/  MQJxqZ\|o0o0(S=CC:4Ig@蓚Mܫ..  []v9@=9\fg-8QO}&8wHQ)^&2"!\߫^>ZiP8 nZl~7Z=rSUvw-j{K*hU4Kꍆwt  c#|/ ?kBZ28rZ;Ħf"qCy` ]dKJ}4 ȮfZM*j{E#'B$^Tr._`C:-oBnkV?ݳg!8i4P/f|}B˿LWk]2P@8|l1d>*n N}=>c.#$).'M!;Omw]]8U ;Yz|^yPa׊O3wyńB(#8b2%2*̴ #G/2pe@gҴy兪CƿLu XQeu|R3ϗLK\M_ܹ~UH?_0(woXtMW5鑲}Fjd&$]3pJŧY3(UC4 NG}CRC^y `0^;$In$ܒr[R$Qɩ265UKMReBjN=a| JyWVϠ:'CupPLS2$ݒrD[nIJqizTJMM)2>5]'+-mx} Lg钎VKÏߗ5n6!USfݱŨnmiW6R/>NH̴SV#wnX-o77]ʇ].P>=MvUݩzU`pG~-, Q‘zQh="1ixgxyXohҮu[>JNz\J)suqv]4U*kX0#K_>n{woXciRYrL9r ,RJ4Y?X;$罌V"4GF0k\Iq])YV])n^+>ݥ|}-ꕣ _{VCnkQ[VMlWޱxAYY[VV94E_;i9cʻ;KGuj- iPN ݆!EYzvvgF1)iMV~Ӕ[;o|P'g4y[7:CV +myȚvuT!l'ɊFM_$\r9vuk[ޔ]I][ &\U>k565թm-Mjo[sT,}MlS?Q+>ǜApt>TEk!)0M9աuu{wLHKO/[Ǧ:7֤{0jxUO฿KF@eGF|6&/YՕF@pTrE ;;KJVϠǮPAu9Fej-b n(.S.yXܽq4 ]'RٮV bLG(566RoVӽیKO2-o^4nV}ۍ7QO*y LGt:`ePGؚVkG46L3s S[w̠<|pgGC˥,7_ i_9jXVʬvp҆뒝be5~]uلu k"mc+ZkUkU35)s}[7uU˻kikv`2>-]W|k*ښc/.Y|gL}I+738oƬ\y*$Ǯi!96 x#bzq2+;2NJYW|j;6X69 |8vbwueV<a^C3(_ڸڵ'N >HM(<R<M ̬ܰЭhT| GD֬inOEJ˞mvc11bJF%ՆcujO W6Gʍ))Oe`9rG9DXyGY̹]4@gZ~tXff= x#"=Rk3Gyc]GjK_{Qu83ŌH3.5M詠eOzWs}~ W76:MM<|p1nL}I|JɝN~vS쓗c!;6 Yq>yk_PDnlYu,^ljAyAI8btI4֢#vy/>ٳ 'ȵS.rUrJgTI=R^bЫD,(:ŵ;$]ܑnmkiTg-}]0d%\27'/f_XkJXePۧ轑I)ىE|H1Aq2ܠ 1^ \8p]Y%_{k[Kiypݥ\ewH793Q IDATlZny5+GGhEϹ[cpق9y:yJD'Żv3/ɚ_ef @@+/"wCP` @`xx#TݬA>)8mZe ʏw#]NؼPݣQS7MarתzmhW7][,,cXc_GXo, 3^O̶zC^tFAoZ}1,"_+ˢN+$xϡYʳ=[I襪 k?3bOQf̠ܰv=*K%mKVnXmV]esGT"rt7QV?İhfFy 㸔{fγ ѢC%r+vc!*TMȱ5kE]!lK.z2b:<#1״p۴f(vmz3bϠ/IgpyQݩJ;Wق)Riwּ"m^'!-^>s6.5MSww/;6r53+!QB1%e +ѧ-ӊ-$LoU;cy NItd1^9BcϷYQsXZMt |RRR:ﳪJ=UT=zhrueDN 5g OkjhlQcdQhm(*HtlOww94@XE+kv LA_|f0ľu EfNblhH2OJѩq qq=7M ꠴ JwHyyp@Z=(/g2mU}vYmqLho5?UqKǩ yш:"€/4/^`۹w6WJuom5DյUpə"UfT=.-]ƥ):'1Y2$;!Qg&$~:>ZDTUoTtAikVvl ʷw=zޥLtvW'ls?V_><+=B~RAGUtwȡUٮn9Nx|İ=TjyzanvV"rb;7[!c#/UW7O}O#dD@Dk-Yr°7`'{ĚZs(c8Ð9yza(=?w.v t<%"cR497{}H~͆?ƷaNkw*0 }& ץgLt|{VϠlin0h8V=YWRivm8%!8!-#Tb ":YPY#w_)ZzhAAw:̬Ifd3G ¼|=oH`=/N5+jVطx)æۍ?w_)orS&%"}Fk,L1)"""jeMZUTO 'e輤p63-:'jB9#6}lae _C665M_4n^Ug[v53kDMa!Ա -@D͍LD”a=sko)!ܵI_4|tWrcjS^0Z<K3CljXd%%Z=銃ONT0M'gu}9ffiζ&c?Ipsru 5xScp,C)xWN,2w}@qNh; ._Qs$$|d%h\j~ ̚9 Cenqq:Sg Cn2;$/T_I[U[p@v6͍E3ddrJH [ի^Akvǒm\@7_uS6ZMoe3Z}ńBkbNigXo=ua G.O';$ֆܜ<@`xv%[(6(x~HϱY/}J~_GxO@] ?sM073ʋUjzՑ.Kߛq.%CL= ragdţX|LVÁ=ƀ?tS '"tӨ!9vP;ឮ#r+'1IV\rm0%.4k.;Ziu|өg*Ǽ5D!ɸp]R,3م`N9K ]0f`@poΕ%Y~eՕxvsdžnF3Gf= aTvwZzαzVv6+"K(#KH Y@kGJ9*{z;G}` )[U3UDD1g(OmyS^:d1ώvnvHHF:;MOXwfZy8 j|LX<)Lw̘c>zOe%Bܹa)qqr؉\{a^k;2(?%U4ŲuV޸Z-;&>XM_%Ĝ ꔈiy³M džs No4Xzk͇R*vC)e,#G#thiT{[ռĊ\V}k Inb 冭jAY%`@c|v˄aR߫LM;_9]a ofڇq)Ȓ7тYn_R87i藱)ivc\2~dEʻڥ0=C~$Cn;ZT@F|\S0%bܤdrbţ{}^ypq"~`qoa͹ l_WpqVĈ6.3]L{+1KP^@p\录ΎMv[M 1c5iFC3"r7At|7]nY/?%U˔Y 8AdsC1`LL˰ KʝVɖK WS(L# Zxse]ogЧGlx+&q麾gԮ&6A;m_wmk ;; 2b =ZCvaOK-3^~*?π%8IcRtv]8^@xqn1֖f ء;$kX9&0C)uZqHz@bE'߹ŵ' &gf뻘jX7lJzvXYow m_|U}geFK_<^vdrK"ꙊRc(L!mӊMCYz -?."G+?1~m e>ίyGG:Юfu浮 O1{;:kk1UٮfY<W׫67j꺣bN'ο40*K]x l7#dDq 8%Zt|gǦ}"F%#M@1kI8ӥ+o~U/[@2󇭝 WLl%7Madudj-Ѿ^VGz՞fYDv> "3I@ܵall$">8Iq Z)Z<3!AN;Bs 5_q/c cT]aXQDWttn6'$3eOT0Z~RUݧ}'{hzU'~}R6QmAiMTXdhѹS0xZ6.˗#h .9}e|b˪+[IwR"R]@ˈ6yw`oq? B९o6'6-KZ1m aG ʝW>yweO=2Dʞ. =S?6F2VD;b^}uԸ}Dbl&04JDue-rgC%vD[D%'/G{.'*$ DYaC|פ< U)OVZNA܆! .cUtwWʾVK*| /͜kNLMuTrJL`/P_ țVϠ|{/p}sf3C"`uF@Ȣ|2XRs>UQjsa繷x3? YQ"<6P+揳El Fv|R9IvSn<<']5nR{=up@ڇ<2^WZKP󉡔d'HLIz\jJJc%?9EKMɩvha3 ?Am]?ܽuӔWf7s'-o( f^R3hq[=ӢwKߟsa\'MaDi ]FH}cBKPʦRVNB"_zeO{ڢ7NUӭ; 27wgfгsQj3s_>3>X2zY̫ &d1T4ʺjK|>wn>XW'ćZ,̀aIIRFՓ]zܻyy.%$296ЧhQo6Ԫ 7;CVCz}gdi|=oHGu>{ڙFFolS\9IOn:uyZ~ψ>O:`X h_iCuVUIxOVB|3f2 l5*1Yˇp{g&q6b0ٹE~_Ra4!jW.3^T,oU hD7\nÐ\pEpҧmO:<{cշNeAX)Le~-˿P?~g^1qgd}X VbmZDӔz[¹XӍOKte+*{ԯ08h aP9sW?vgF++Iۦ6G%3*x~Mj&uyL߷mpY&lW+ 8yK/j~}"sÖo1D i\'m]W֖cv8~UtwܶX^s05|$`ukGHUvھ[\WL(29Ǽpla~O^<y,DŽZIrI抚#//QWN,P r̹}N3GH" lU)WLqv!.}vH22.nWw5"iD>eo|n20~ӔG+G+)sL)64K1|/UWV{Ƨs:*ܸul]YWmyIlT8d|y}t}ń"@n 3uJ\ 5b{G{_7klfepTg珔m^btnXsYkWkSDTl\ގ-{f ;kIpxPno:דw^Rn ӷ<]o~oSfߘȜE#TvMu)o2qaVOnd'* ]-o.9Z3~Ű]qg/弞@@stc =%"3rU1wk,sUt9y\.y WNb޶uW]_om=l㪉,8˜7-89OVV_,3ejqHmjg[Z;ʑ7q)%Y8{=^1rNpYQ4vN"(#K.7),_){~X5>-CG.pmnjPWz] B1u w~wFŚֲhhqلBN_bqN{3*J7ycG1Rmޞ8Tb, tgfyzfvv>w:lph4@¹F5]gy_4#l IDAT;7-M a;'QcVWkV/sMGoqiK?h~wfכ 5?-XD$tÇߜsa&©yP[84 ]!yaƢ1y~}+NgOqǽ7%7U'lg2?wTs9qUW}[Iw(,?;+ Zigq ¿xh7v6?1z J!W]˫+\h@H+K<?t fD]I[@DphMrɝ3<=>ܾ~櫄6JOY#ElkUz|'ο,|\϶+/Ѐ/7];d%Bز-VDŕ UkUoUj[ Z-*7Ed_ Y3ߙefL^<g9s>2]8*)ROrSvd@#DlgG;ܙi?:'[tZ}\v)23!UZ+@_ѻyA^Ύ̽%:8X'q 眛5ղtp"O-;m?8=?v7{&-r/-U6jhBNftuH:~LMIn\?;֫l yj][Mr}c֯|mVJDf_ W6ڨ|lp\+Y_+Y?9UxZ yM!ȰM}7h8sJcс=FEuXbBBC; SkY݅p};)=6j[]ѻhwp#ɤI^ CPSVIpV\gkNا%YW~1ah\WK=]e瀃O=܇YFG  ڍ=[v є_zߒY2j|asmz5K!e&WΚkx5Ad4YLtp<8|uO.c.Cfq@aMu[ Z}xmVy^1 b+צ0Jϰp+*Wܯ -WJDյ;:JY߷70]w}rDΑNPJ.KNן]>Ǿwbͤrypmϑ~Gڷ k_πL^n1\4*GD`ϖo@t~m`hf`.cEnۍv {nku*s ڕa2G%,2(Hn?a7Mdb/|:ԇ#z8qS<աVRx~i4Ǒf{<3 a-"_ii7hYy@:3 a;w h0T[gdɳ[֋wdvueg)Y廼sצ7?v ^!1mwp3hmOGv{]-\v곷`/΂]L)ό mhPahwhyk"vk_i>+rs _(;2JueC'_q5[yvV ri3}7yGl@v' 7mM-I'^AU\ |f@6?tENt\cG^R hjgV 7+IۺL坬=H m]Z@s|fg2zl|>h =>I=qEf$7edĸVkQ֞V Pz&,9r(Yz5S"D4(&^HJmwwSz&ɨ=<|&VnX񉜮W<0dt;O).sNt Mq|qxw֫-d(h-YVaC؇zF_;ܮn2n>/].J|F˒́1qtBTeˑb!?ݗ^1-1Eo}}-|:V^>>/˽n.mVƅJJD::DG vw uZ ڭ{'oߨ)/,l^K?DtX*ʔG:Otn۫ntLX%'Z% uF Q~fDz_ p2ߪTNYJi@gU@]5|LQT_E9e%rȓVzI=9EUf~?KsNR""ӯvzyZkOx?ĨOtwuh-γ#[ "agO,ؿ\Z ڵ9i!q]a3!g`yY2 tw < {ߞ3z?ÂJ)+U+یq?}2LYxEvPJȜoe8f=*/]-rF5tObStle6 漀<9AAx} SVYvH R4oeZw }t/tPAb@Jkfvm&g!3ch#2,P+|?Pny*CAra^_QZcD]o7)(͂o$W/۳Ȃ BǴ]ssAnG+(mf˒)=FmnA^L%AZlHHiiן<z};Jkv Fcf0-ݺ\SC/ONk7JDJ+)3q8䃃ҽKLKLzv0 \t#ZMCFȱRyxb5i௺ߌAӶbOT*kƇvipа:ZVNWWyu'GE5^}l[sU>fx`Oê'#DdDGVy[;k7#Q>Β-5X?_0Ռ ~)Dy@)B>O[+S" IsW]媔tl/iʢ,8-:@yyҴVu{!2毗/<}$)ռO+)5\Q@S]^9:e^PU)_;畾ѱzLB6Í>/q [t8&i_5JDap/vl<~'ȰHRDWrMeU~.R끗050& .Svw_]BB}2mOgNuʐZ7^p#Kj9YU٣yvdGj+5-Z[zd{yPO)-<#Z)ɪ 4PoU0_j CItaoFz?Cț^ kFR` 2kj=[i{wk)I mgplOƞm}ǙSj^ӭZ}} ݬrԩn$_.IJ !Au wL;A2Mnox{BuЫEsZMi_\W86wKoM鑤{`r2p9-C)A]yfS"Kݻ>5goWQ}~Gz{ aݼ~iy|NMS 0bwRr}>^oϦCB,QAm*`9μ4)~/-2J Mnjš9='*+ﻶx4|^}{Do߿{XW{}{.^ogrC4Jt/7b[]F3NxljԨ^L0bc5+,DjWūLe޷lV{R S}j7EW5nK5&nz', X+SGFMJ Ћ]a(~vN][V}aֳL%_ e/s^SkVX=٢LOݪF.Ye' [|\*6y{NU_wk|s(aTߍbۙ'ẁ}43~Q3ӸCKqćt+7mƅpl<%r6(y{.㒥$.x5ktA"*l6X^ݵ'z_̺AAEf=ɉ ;l u/,=~5o>wQ~58?8ר{vU)}r4u`iq+# ߰(%M1*GǮ(%/1">E)ksU{+-5K NTV;~0} o<>/ T?x3C|vO:j}ݙ1̧->0+[NVUrQnjo;0m~)Oq~۟?e`LE^@(\Wʇ3fٓ# y:J?:yn^il0U_X)hTGԉF"F{\v7>˅oha}pgI%@e mr$ǃh=;/-;Μɶ̯,7m7fۯ>+kZ|qXoEf$27Z v I@[m=?3g;.佀^5|!"mo6mfפ{tCád-NvPZ6fߖS'ԖS',ٸJɴ=4C,?UGժc곣Fa+]KoƅʲR"r׀!VwxM)Y][Wwm5R#zLB=,=iZ *dU:RZv ΢j'Z^p]/k~̇7|_UǏ)> :+@+_ńmώ̈<=fAՐB-l0-UcCB$:(XJyVRoTnEWe%_UrJeoqStZM[\3dU,:Xt`mv}c{h%LzE.EGyOJ5bu8XE)+U9rD)- N-\떳(%ۦ/4ӶMUå뻷9-<0HvbcfiJݦ *`2OWvӔfnZ:~x e ]dFR,,ؿӘ37"@ zɥدlqvH>/ut>  e>uCTq8jk5xZDIx`6Rk6Ӕ^o
    Z"uy" vq8f:Caq]۴QdP<2| `cmV)Y[rXn3jt3[`h=[/j-ɱ8;xe G[D]x ~gvj?͋.w> hHnvӔj9V^rJTQMN=T&nKQM)-Q'*+݆1!1/d=|7 w{f_|޷'M}j|}Ƞ`̻Z#YB~oFR^znP\>\8J<: Y8 Gs}qN5K[MnI=ѼQN݅l~}ۛn5l& :4uwDAR`QJ;scَg q{^Ա\%Geϱ?3fRIs8޸GZEdM~n?W5.ON7#}1k4~˧*峣y@+ Ddx\<6Cy؎ ˯ ̎t ק0pq#N2k>{]~O3.cꧣ74{}ߠlt4 ]dFRIQdP}%w_EͲvhVsn_3zbC):6̾~yJ橫5p9o3:sjRR{9鉩z w ek ܾ4gGSU^_vlp\7۲# meG5վ=t m@{3'9&{orBBO\e27&9ͧNg65>9d>#(%q߭߭3rEYǎ/Io>y94|!δ+70_piq0Լ}AY|UkNz3Ȱbhսi(d IDATARk]pȿ1͈צWcp$šjYv& j#rMj_s]>ٷ vy 1'9Go,gt'6_xw,J/qxgXёjY!cCj gXNH;2ZzGFzHlWi T==1LAC|`5ɩ'͉=;msC).}9'8{(k*7 XdJd=w~gXxO0J=3 jA\ աb}xw4;@ˆP>M)W6䫇}cxxg}&@юGF5C,8Eny2T6P;(پ*i(I ]İI Q;2RGޑQ`FVSNPvO OTMO쑨/KS""y0j@.+rKsԁBZ dX|W81Ŝ#I{;G4,evjDeAJܾߍ֫<8*.TYŅrP,+QerR85%"!BB%68Tbu\ho!C¤{.;q JM*PQY*D_IAE#"uzTGF>1zX|7=k794rU)P[ Ng ԱrWQ&yeEI3,\!]и=86^yF@! vOo^g$l1%"3̧L2%P$lV9YUkjvtH,OcH }EK܏Gș*9]]NWWʙjuRlC*6gRfa:`5:$DI\H P5X۲M$\ZkġZZJV%"l .hHx`DIRxsy(Y՝[v@!͠Dt1 1@ j^㹭B:4 b9̇G3 /2Orb>~Tp=,\1`]zuT9PR;GsN# 4 {2WkvhKLS8g|z4(m|z9f]© @#ZQ._1>:O;NUu Cu/ON33@'GЎmZ.P_=V?P{[GzGD4}q3*(W 4h'j DZRKۼ`x` cz =f^-!@+Sjw):RZ"JUaym9RңKNOT CԈ()$h1@*SULuT3ՕrJDD*vesnCI%@BH\H " ]{hXg#+w?F1@~c# ?F1@~c# ?F1@~c# ?F1@~c# ?F1@~c# ?F1@~c# ?F1@~c# ?F1@~c# ?F1@~c# ?F1@~c# ?F1@~c# ?F1@~c# ?F1@~c# Leee[:]v^Zm۶Mw}@T`TTTϟ>_4\YYY zTTTO?m;))I0[2{uެ?nݺ{x7ɓ'|EUVÇ;׽_~+//疅 ZJKKe*,, RQ{->}p- NcƍwqkqѣGHhh<3>xb_;iӦt^n:ȸqxh䢋. ؼysB&Of2JUUvXmT NcڵnAʄ Z|OD$33S5׻շtruЀ[oM:U?1c興)((P{ݻwj@Gi&w/b/:;v&L&#i]- Z5'H+WTVUDD=fɧ~j,_\m߾]:uYp /Գf2#""dÆ LDDu&CwcǎzlW_%KwV'O@IOO3gԷv ?*,,5'NEDֲn:[lQ'N$%%ɥ^j}-!W\\,|b N8!v]bccez̙2=i~p8oqn߄6l۾0MS-V&iii{!{Ahrss|k#''G$''ɓ{l(h߿ZdZjq1)//3f;ͺ1i޽{͛վ}Tvv9sBDGGKAE]ǎ=IrrrO4Iv>#b uQUZZ*qqqo6s-Unn>^233n;p\iLLLL>-":88XWUUh>"z-{C-..d=))t]N}SDDկ~ tۯ_\+v7ߴ6tsϞ=6_:dffZkm[=Mny9"322̭[69m۶m_}k.۝w֭9w?MG?lCm֯ZoiyjaZ[˭_왙Rm&M2]qM79j_``.//n㸾u]n>XfmƌNŢ_z%~w{xxx͍7zt]ym65''v]w5ED4u>_6usI}Sff;v{3M:|{bbbVHH~]֞8`ꪫtCӤỊG6ݮ7LjtN;v͙3v5jhѢs΃!C8322R7w}l'999l;hڷv&#"g_=.[:5y\v/lOHHx?~O?m mֶ0asn4V͚5m_^r%DEEiaζq>`N&&&&~s{7ny͜9fu gn? yQQuΜ9On.]DD?~y=z`G͚c=K~CBB{RRR̓'O6:իW(}=4=yqQwJJJ:W9p/Rl6uذac"((Hر_{~""78}vȑֻw&Gvms֞Nhy-r<>rHԩSVr[nqXV{tttӟ\oariӦ=\Bu:D`~-m[C۷orP~KJJdƌ@EΎ<}t}%ɢz!?\r0` 'NNw3swZ6nhohuٹs[,JJJIII:..N̙c߿_ܹ9)S67 $Jq!!!r73fp֭[믿nٳ^x3fܯ7oV555οcbb \χrrr߶m/~zԩk׮rIYlu~H͛gYzq'L{)yfyfLӔoƄ =6lNzz7n9rNHH)--Y|zVUUo~<6 n͚5jʕߞNSRRHvޭ;eo<|ll<5c ҥ̚5˜4iNLLZk9tZl78ѣGݣGs晕On, @sܹz̘1f||ɮ]oa;sq5ט-*s}Ak-W_ug߾}}gN6M[Hnnճ>k9q℈䨇zȲp%(<<\ƍGtttXV),,իW?(--u~_7~_ 5~_ 22Rnsܸq:%%EK^^:p,]XnsĈ# oݺUǣ}?pw 2i2gT}gddA58MV̞=駟:spp\wu̙3urrZ믿n1f}myZW^^`Wټy9sf@m,7tyך:..Nd_6\x-W^yNMMwiik_u wqojFV}[fIzjZori+"fm{Z9ݻwc+WVXa{woy_w3g4׮]{κl6`I&W7w}nKIIiMYYuҤIs=go켫|M~ 56m7+ϟwioMNNv;zG}vtA۬Y"sl[ݎ͛77}4U-{ylX,3kzkMŢO::DzelՍK~~n_ƍmm7tC)?3ƣ}o>gذaj~裏܎ z\4Mkqrrr=vv9eo޽ϻ9s}ӗ_~a֭6vffwFϿnGmpfgg.b^ggg7Y=nW^>hwbbC9yUl_~m…GyQSSGݚ%\b~wo9ٵkO0abbb( OFjQƚYVk+'x&v IDATwxQXXּf޼y .nt׿u3fhq&&QJ)=o7u˪~m].m_5 VBkTsj֭[k݆>es[`# ֭[̥ wp45c$jܹohhZctsuYYp ћ:i_9&֭[v=۷o/v <أmVXX(wߓ9:{1gs hѢ&P[_qa '|ܻwnkIjCOLLԻv_z饍>}oFիsH*11߁g]{;_|qTҥK{W/¹o|mj޼y?v?䓖7*(㏛<'EnEDnT[9t萺?n^uzmwƪvwر[n/czȑ722RҜm۶&oj*~ay/sW^ 6c+77Ws?>;p;+[j- ]xKm={ԋ/7u9O]7U0"r+>kZ~pwر~zu 4Ho۶~6z,(n3Nl7ǛBBB~>84=3Fo hN?b9'jHm׻wo֭96lؠ}ĉ=~LKKsϼ+Ʊcǔ/:Ɗ냊z-[2eJׯ_xW /`TVV:~-oԨQn?~xP'Ot_SsCI&&WZZ*dСړjqq Guw߾}uCAhAAn5r ܂=;;[-]y?w\nƸx߿GuddG˨ j :7ѮJy{uȨ*++_t'f^<YY[xPЭ[Fikk… ߹ 3Ҹ}?-Dn>v DD<dnMaÆ5{<٣>,999RTTʤT\رc; OkzĜS[LDdF "">#66E^>ɽ۬2ӵ]D}%''G-Zy?5CBBnذh#""Є T\*y6mnҤ vqqggg 0qDo Ch.\]Rc vvvocR_)FÆ aii)̞=[}vJki\]]8;;cgggGGf1ȑ#cǎI&m۶x[.aG+,yTP.پ};-LJ9`!""QH|bhذM+* +dB/&>}4뫯o5jx!u B"%.HJ5im޹ ???ɈŲ!ޡ^sޡOٳgy.999Jc Oߣ)IM;鳣t:@j+4-\u9UqT\ܹsUVѦn޼JoRcɓ'b&BmW7l@q^^^hcncc'Of&Ot:FQQQ(,, :ug^VV:cZd~~~ĉ\v ԥK\RR3f`͎===ʕ+_/c&//IJ/0p9r3ĉy¿+W .4eilޫH`/=1o u@ P-@ B,sP(ۈK]S3S<|4ߤr_ѹ嶶6KM;LjXYY?ֱ\GJHJJB\M65-''NN>#Dm;;;@sď@98p[̚5kL {A)RSS<<]Ysss͞^GʜhիW5 +t*u+C%===|,ĘtA6cƌa\]]yMWEe:effBjj,F0)֮] -,--a̙Ra`@پT b;vn .47?_fl^ڷo^;dž l}U֖Wwiii+WL~nܸY Xb-4]-**2zX$h߳wڴiL^^0%22 >TXXrDJfͪT7wL{yyaz;Z-pUcǎ2{иqcѾPXX 3!7|/P]!@P- S[I axSp~%wuu?x97FSLJJBYYYD\R9sJ/h=ȸ 111Pc6f96\\\xטS(cǎe"*L"ѣGf y!66V}*upPBcoF\MMso3F;͍OykUDطCBB(xE#Pԏ*#xVZk׮S 4} 5(\?~urr}3gǹT s(**a՛fW\{{{[F%ڪMHp02@ !@P-,uH¦"r$ߟ'HLLD۶mZ-ܹj֬fbCah/p*)!N&MRqz~嗴AjԨ3tXEm`F$B-B9:uꀗ{]RRFl")) M<Xf^DQp\!E{ n(..y橸qr֬C7 ߿ 0 lٲ u+ӆ TBȀ/Xڵ!dOVVVȟAVx~X322য়~RïJ WHsYy?}4OF4Zkzz:Z|Adact:Kmۚei!-[. r!K.ldzk׆W3<<'36otޝ7WZEq?!%%Zʠs=F9V\1cJje*wjqڵM޳vZ;!,V^MZB&7P-U0 DFTL& `РA<͜9SG"""PVV HIIAW5kF EB%Kʎ8LQ;7,\P~{`Fԓ&MR ~"c111hذa}d)Hҥ%,X['͛'kO9i$D*..9>P \Q=T\6C1ZQxA+Rܺu }-[.Ppuii)۷Or Ú5k͛[Gc=u` s>}i5kx+ڷo@r`5$DI)k,--1`7f}is_tI+u+WkWZ37nh1SQF M$߱i&ӧOK]7oξJEEEZmP>ooo&88>rҥKPuF-,,xvԉ),,4FiѢ#|?e]\\6//OIHH=zT7sLaÆ{ ?~2bT]>֨QW-[2={ )S12w0ƚ 0~~~35j$}aspp4M˺oܸqxUXL<7j5~w[{ +WM6 !'O$Ҹqc []'N֭[LJ_tڢ"Mvvŋ`ˋ͗-t\f3si3224h/]]r[nJb_t|w֍7|}}FS>=yDSN6ݻ7w^]RRP߿_3 {nllV-Z0?ҥKxSWuЁA>… ~;wfnݪ{;k4Ç5s.\{n6wsscrss_Hϟk¦?joܸ=xn޼y~kп23355kߴiS"ӧwݺup9W^lԮ]۠ ia[ԭ[aaaڬ,Maa&99Y{yҥKuAAA?ammgΜI8qB ߿_7qDKSNg}7Z7<<<|~ѣGy}x׮]&S8ZYYx{%H"$HvܹsCٻ+$L wcXZZ*yuxIcB}:pNxK 4`<  nݺ%0D2>}$NjvI3gaÆѦt}-W4@/^kŇp^=,[Ltǎv}Ą>SB4^Mƍ 5}}} $~VLm, 2 D IDATf͚I>?++7}d^JHH0گh֌9@` 'uA hf̘a3y_~\rR^Dwފ777,lǏG϶ƎXJoeee'>>`N>z K#F\cuRu"|!ej<LgZV3| k׮3ghF,! h|lLwu^ZhuC̙3G3ӻwSJJJ4nnn1bŊI"$^f"&!d ^tVSpF2zhڵkQF1¨j:wGݻ#G2/^EH}'6m`3PBNaسg}Nֻ6l_7nCQ=5jk.>Esq [ii)kԨF6}رcCt3~6YR2vXfz'6'mGEE*;h&ߣVuds}cǎxƍX7|X6ǘO|EҥKA@ɶy~csdb=۶mszvPAcͫ@ T&笠Dg͚4h@2)) m߾ÇKn׬YC=yGaOm$Z-}Ϝ9O>fggA?%$$O"1899a___B5jGt # -- qG 4ڵϞ=Μ9^'Ю_}U\\3dG۷ .PFZԩ8000+*--?:uz*`jwwwܮ];ܩS'<`lj C]ve%mڴW^)VU7n}Q(11MPF pttĭ[@ܫW/sؔ`VZڽ{7߳@hժU0MQx{{QF1z{ hlǎ+)?r } \Hkݺu۬4 k׶kc8qt8V1UF999jQ:ukF'O 1Ԯ]ؼ,t:PT GHWoaa:/ʚrss!//ժU s5*">1͛?QFUM(hP:udkÿTV_---'O N:ںrW5ظq#5k,Vl2:88y@  PZZ >>>jcϞ=qHH+U7n ???VucŊ%Kƛ@愇Ν;cɒ%̊+D /K.ݻrÇg:DڄPmh4k⨨(]uH R1_T*Xzu=U9Pkٲ%/Q\\ &MRuԁM66!TkvAsN DH ~[~zh_?c& ͸@ Igpt)P`ΝT*yRRRxrBUEʕ+@D @ ^2iiiÃ5kٲ%Í7ƎPVV(""EEE:?eE/}]iذÇ<*իW)3@'N@-bV\I4^!NBW 49viBKU "WM=AB%,,j"`ƌ뫴ѣGH/ܹ3N Ts^N<|||ҥKSLQjՂa%TkZ-|7@_" ';t&Bz.\Hݻ ˄O"$?gϞ믿^u={*==׬YCׯ_ńj͕+W7x{{2Cq@x`@x#GGG26& RSS9EpðaTlmڴnڴ)'@xI @@>}aaaԵ]v˗/=Θ1z9t_~Iؼ*˗/FΝWB!==tܹJΟO<.]VVVT%HxpT'''h޼y7{EQ_%Oݻ54lذ@  @L>]uϟ?СcooO>>v/ϟ?ׯҥKU-[bWB!<ckVJJ JNNfwՌp~ySY=pǎ ֳD4MÍ7kJ>;99{FF>|x"JJJB`mm ...ЩS'L8VT&߱cGUVlժU 4{ޅ {.\(oqӔ)Sxs/"ΌZyeѺM659֜eۛ}f&MYbu1bK#Gd hbccC BeQ޻w2wuu/**|:???F޽{ǏkƌcR'NH)a46mY]\\СCy}ѣu2aZJܔKSL<Ў7NzְaCf:n}d_&KKK\RRǢExuhrL:^%6lSYuy|{nFlܸQn>>>LJJkDI$IDHI$U(N=|sssSߕ+W 64|8Psj5~YC{Xn U\u{nNYtb ?Cw-m@@Z[[㐐YeiZtR0_aur±aٱy޽;06*ě3gaΝ;v)V2)0y7͚/pRR?h.R~ wAA+۷ BBB{0 SvׯeeegkƎxYYY=&M5믿988H>{ݺub_|}}yjZV(Ν3犊4 >adҥ۵kVZڠm۶\AۣG܏J_cѱcx;vm{N &LEi] 4(W׮]r`Sѣ>p'e.͛K-Z0Z$H"U$bL <0rH&99]~   (h۶- ĭZNNNV!77nݺ;RRRw~/D} FGG}f{!0`4hӨQ#ِBCCǩ"___^ȑ#͛7Qbb"}ԯ_lmmU˗.ccǎ9~81b-[)S0>>> ў={(SVV >\{`ر* J={35kkk#t9tߠ7oDzRgggW~}VnjÌ= NNNqqqhƍԡCUÆ ͚5w<֬Y33XYYAAAM[!S:?x ;器\]]a̘1Lƍ3Abb":w:1A6Opm۶rMQ~}O>ޠ4iӧ:**f͚0qD{k4z*ڴi5)T۷={l˗/ư%KsHII 7n@\SO___իsssљ3g۷ٿ3 gVsH;;;Сڵkʷn:jܹ7ƍc7nmmmYs tf̘ڿqݻwWqXXXaØZ>|Թswhڴikff&pJ/<3lݺ5cJxqAkr׳gOwܹJŚ)Oc^v3lذ!/5\?x:u2r\S6mTژe7Bӧu/^d̘1lYXXb?nZhn*WXONNN;Ғ%Kx}fɴN$ue˖̟)Ҍ3xر#a1ڵk%y߾} פIf޽:MZ)~5m4^>sw];w\q)ܹO>CD*i4 5СC%!H_zve311W>L:fޜ _3##>988+i$wE^YetB0rH"$$d2? @ F<gn֡C&&R==adԫW?^w"!@.]V0֤ @U>dcӦM|O< ͠*JTTZbkR֪U+|!;vw3+ۼy3u1{lnݺ͛u?~lЉ={ӦMcM%௿֭k2nb#HݻwѬYz/#FBSGnW 7򣅅,ZILLM2sUܺCt&ﳵE}QMN!_>"Iϙ35F;]\9___,Ϗ<9:Nʚ#/R)\ބ@Ezj2;v숷lb2o0j(x23/++o666f:66V7bĈkf˗u:t0Z7!ER(7Fu˗ qƙz1{OURRj9|ƌ< M?D& "$ՂW"Vԩ _߿hUINU7Y1==ܹ]o:w'M$+϶})V˖-cE֭[KjrJnnn|r>ڷoϫǏ\yfl[|Tꫯb-ԩǏ#nM2Yr%m޽{h۶mlӮf * š=z43zhY횖d.k׮o\rb] WXA7nܸoaߗF\?#-W"]v q}se^S!p-^t x5$$$ \O?e Ξ=m7e+L7/~@jŋH]]\\iӦy+))˖-c}׳TqOQ]@@2&..=z'8pc777wffdq~jg6jHmAjp,GC !>>%%%QVVBx)p5#BO?ڷo_7 9qsjc97nB/RvP3IK%ǣ'Oy뭷CQ3͛G׬YS² 4MO?|||ĉe }GRd￳>}:#v`[E"+7WfA5kքɓ'+ WcsJLLD߇ CEEEPXX>'5mذ`Ŋ/$u낛0x]l2VҩS'E?CRAppU*888'O@ An͛G a)r ~RRB :}.qqqԩSuÇgLirʅ;[lkժ%޻w"1tRҥKڵksXCDDO)WݦM6N 2!@P-,,, 00P,++ ~WɓԵkгgd+m߾= euQiӦh_~L``1\0SJ̎w{ꥨm )%KsNI+,xصkO2vXEFttt>v54i"M!niժ;ڵj:t:wla[kqPk!C(C]z}k`M]rgm (??oVe'k_V)))@@1ӧְ}vڔIpРAn{E?~~0zRTTP2&Bggg{C)8 ܏4=z3{\mܸ`ɲ#4@BWQώ;*}=(Ϲ3S֭q۶mngs 2^@ T6DH <cd7m۶5jԐuozz:;w.uaSE'''IO>޽{75;JOOGWFWj5j ~0b{.hQE2K{!))  8+=vtt2 aeggJBt:3K&e\a#G*:L߻wd9{,|CRAV^  m\]] &/_*r7)V矫vI)EL8w9#G 'N@7o+/B?}ҥKi۷Z&syvR0`Eu&NNNq.___kWe |UOpw͛7WŋWCqȐ!@w ۀi8{,[AAA~fiǾ^Yrr2!+|2OTCU(EEEC Q|=\w RyP&~3 *ݻwWHuԜ9sT\~ ???6l3c,Hݺuʕ+~[%4?(?ܸqݸqmٲԩꫯ>@rSzedn ŋj4 \mR'O@||<܀\Qbtt4jŘɓFZ5ΝjSwtV_TT3i%&B^@C :($޾Bh<}wU\_{VVVжm[7nAݺuaȐ!hPm) okz) "fdd {a5CUll,ڲeha^ IIIlRQ~oݺ ޽{w0T"EE˪hx@")oL255g2۶mu%**BAyu%(_5mݺ5?>3tPFʿZii)HG\-,+++E}322 {Sg͚;v/2ׄcaP9腲|1ƫwu\PPvm60\O8*&'2Ci.@y cǎfmO III__ ];yrQ t"e*,$""BH +DH |:|0[%KR&ѕmllL z@X.,,iF>_bV7@٥KDjEwN;;;%\?s)\ݻJ?%rLؕ`am^Lxqb&(̗e277wYgr 0b^YB %A\1geeČM+;wR?vYlI|!]~ڵk҆C׉[F|5k_ŋ_3}!**ӔTJÇ|. Dzn5lPq 4_UxϞ=<ӦM3Y:uH˕;O+uEPZZ (έ[͚5㽿"srkjí[LrXYYUJ?z*j 3F'o%m1za1kXXenծ]["@ N @|B}15k‡~h9Nv2h _$ b_K__ [Bk%BBpjL4IR)BS-gꥨH3?~nݺDA,((=OIW bkkG~VvDakk-W;ۋ-X@|ΉLKJJx2ʕ+\߉}qUz+ رcDn޼5B8?(2aҤIm L2cV^ͪl eee<:`%>dzgπ+1/BfϞ-\!4Wj֬ b~:R_R0L&MD=%pA'>`smu:9@ ^'@ Ti"##ydS5޼e)x1JMM}!v4+ nuvv:ByC\5"sF[VŋS\_s5P1 >|(r5ńQϜ9 XILLD\ s-nnn{ј+BBBo+++j)I1Х֠VǗt$W166FIL۷ 0bP*s|Ě;oرΙӧOg4&LFcܹ*nЭ?\4xȵkׄon;hZ61rssaǏ7x]̝SME7nupptSJ_D~j4BN$c{())>]y&QdGB5 ECJ#l:D ]Os|'_dJhc - 4\3AP QyVSM'kc?0 DGG#W~SPId ZnJ޽}ȑ#~ߑb@ Ȩ[jO[o1cƌwc&"V FRgggi&ZCpNFϟ;3331ᆪ~u֕ !*|U]?M6l`P܏h57VG"1w}Wō2wB=/C>?P!@Pd5j#.^(QɁ>LբE Dž&?HV ֭ZnmuVJh֭l9ȉ'"8 #*?F~jƍ5۷t?ajՂ=zx„ *UH||<6lW^jڶmˋ I{j֬Y5i&NJ¢E$t3f \"JU0_h4g* @=yd1371,_FիWWPH#4bpZZ:tZΝ;hΜ9ܹ͛cп>+ RRR=ռys-[vL/z;wJ833L PsR͛jWT*رc \XL@ DR~B4L>]eLpsԿZ;vBq=\Y͚5eGV ¹T01&MZx1;qYrrbqk!OlСCա5'Nd &:;tӯJ FN͛7SM4Xf {<]a͢ciػw/ղeK T\3c >R]φz7 319 ^޵kuw={ ƍ:x [R( t$$H"*&5 0.]0rk֬^x1}im||ҥKڝ;wFA`ԤIw]zU˽A̒%K蘘Fa\pA;m4‚ ?zH+;wF3gΝ޾}[{%mtcǎ_. sҧ~Jskcc.]t611Q{Y tC 9s&~JΝK'&&j1a4޽iU?acYc%X.Kv &t(D]2F)4kb? Q 6PБ.qIpi/R<9?`w΂,|y9 .xնWرcMlٲ%Jm3g޽;}ԩ'Oر#3dSmٶmV.\=:m۶t6-ѣ/Rn6:{mp=Cٚ4hPdɒڵkӫVJϞ=ֲVmӧO44#GiӦ <8Z|yf鲲#Gٳ'|̽ޛWAܶm۸y˵7|:GզO^۵kO6-~Ç8^n]?yk_ZTu;wnwSm͛7|PIDATk޳gOz˖-颢ߟPVk޼yֻVJhٙ?7x#x̷Z>}.z]k?|dzMjG-ðr=wy'ݬYjޫW_O9s<򲲲򒒒رcU?8KArZkmmƏ>h(vƍK.ӧO8p ~L׮]-uQfΜYzuF_k:uT9}^T4)PӴOm۳gO/?nѢEBZNNNXq@u:C k֬|lْdeE)=zT[ɓ'7I(tj=sfƍs6mذVoذQW6f̘l۶m+[`lg{ںN:nզq 7D W+Վ 6l/=? *Z˖-w gծ]ӦMjɓ'kEn拆ﯶ~XɩF`W/^|I׀G_}tuWz_W1cT;v6o|ٳ/z[g@W\\\uުjc8{ȑuZh_(U q}\]޲eˠ$ӿZ_^^^?rss3fd7mڔizԩSe˖eZې-ZFVZkaKl6[k0 )SD{toΝ+Wfp>ο~F* οX󵷺7޹sgfРA:*i&4iRЫVJ;;ųgn6oV=n?8kT*XlYWU 8{?ٺ^[㧞z*ۘ}׮]3gN[T*ezy۷gj˜J_uTj^#S'ܹs=uJW0^~}1`Ϝ9,RTPP,_<[TTY.&M~ӟ^g>\~ [a„ Ѹq.:n߾=S4}ǣK6=:ZjU;ߪy߿xȑʟsh߾}ql]ø={6Z>W,X [\\N|jCT!(yWOdEŠ+RsMܹXCNNNЭ[[VhTQp޼yCU'O<% v /_ںuk{AEA^^^кun noWAp~իWNŀař_Uŕ)S]~y RoFm۶ȑ#"[nt%ٳgܯ_xȐ!qN.:ϵk׆3fhaÆRTPXX}ȑ#/ ,YR^#Gzuy={6X`AOU)QOUkHRO>٨3<*..kإKxoJ5Hmݺ?ϲr (Mlƌo߾LNW^y%U\\޽;j۶mzp:uj1Adׯ_MΞ=8q"((((jܕ2`uօApÇZ~q8q"8uTغubOD_L&;v,O7iKqa_'IiiipɰUVqAAAiW>iUѻwm۶A:u}̕;YQQQ*)O/N>S4ã+W&".@[zuXA,^aʕ/`M2$nΝaqH?|hr3f̨|{„ 7 C;v,2eJvҥKСC?&/})~73rtJJJQFUFxd9uTTn~xq\q/4 &@  `@H0 $L &@  `@H0 $L &@  `@H0 $L &@  `@H0 $L &@  `@H0 $L &@  `@H0 $L &@  `@H0 $L &@  `@H0 $L &@  `@H0 $L &@  `@H0 $L &@  `@H0 $L &@  `@H0 $L &@  `@H0 $L &@  `@H0 $L &@  `@H0 $L &@  `@H0 $L &֚_IENDB`fastapi-0.110.3/docs/en/docs/img/github-social-preview.svg000066400000000000000000000062321461403617600233060ustar00rootroot00000000000000 image/svg+xml FastAPI High performance, easy to learn,fast to code, ready for production fastapi-0.110.3/docs/en/docs/img/icon-white.svg000066400000000000000000000025231461403617600211420ustar00rootroot00000000000000 image/svg+xml fastapi-0.110.3/docs/en/docs/img/index/000077500000000000000000000000001461403617600174605ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/index/index-01-swagger-ui-simple.png000066400000000000000000002206561461403617600250650ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwxTUI#I: M:Ҕ"^ײJ\q] (M %HBHBz2G $$@*|?s[s9L8t:N'f2<6!!=^N&,""""""UnrvYda &--Cxۭ*l6aPfѣ!5kM||jHDDDDD v{x\mɂl1 a~Lx<7j%77xOjy<.# wfJϱ9~,GFFiiiX,䯷8\Nu{ˆ#!!BJ/~8~,3 tT-/jժz=.<˙LfT}l5c1. 3j-{TXDDDDDDvqw3f̨ ={SNt^߲p:{=3CGX%?.Z4ٳ0ylf[YlZ{ ì^"rpx\.UT{ 0f(&ORάif)3E3`)o\?]"WÜ7j='lUT|cŮ?->ty:tgѢ<:tDS`_+Ϗ`UTc|m9_0.kZïj-U2aalGnNNl,Jw)Jb-f 6T%6NW9^$,/""""v_C,}^|r Nu) }`3竫K =(e=SKa""±ڋ^)w%w^h>nd22w+8'DH%|׳ / tYLgϹ Wgd*ߗ?ͽޓ~ xuf`{gɓ]- "\ըm`j6]nfS^tmS::r 3JgKEV^E"T;*˲Bv e3ۊfKGrL$"W{b" $ۺsI2E.6}_3SWȕ[h ,"""Rǎ'<,W6ϕN+}?|.y8dhP|AWXnN4Út x2kTw""""dpX,ǏVʶ {=v|.[.fBL7EO%g:e8&97")݆#3N~x꾷 ӭsYxd$plf~N?0 <~znDmoߙn;רϘOͳ'>z̞g1D@ --dXDDDfK2յ+*'Ɠ][7-Y$ƄalYz}+!T;c[7cFܻ3(!}yO3(m s?Sv|Er],R\ UݓOӷvChΌ™knOq׌Ei]#9蟼D%c)|X5/am2]ZӶ\7uʒ3z ^DDDDDR.Zn4N/h)^̭y1wKrQ|TlsϿ'; 3 SK祹>S~S{(husqg]xYYc-98F#fvx uvz7Sm3\diA&gw=G /MŬ]p:+;Ji9jѶi=^2ʩI#_ԣOUlu"t_9i ?-]Fk:/tMGnOKTc@DDDD|d;<瘳o K,ܵoW5jMy)mupרŨa]16d7A)zՇ$ U},>Ԋh5'ߒp^ xXX|IVvV]+DcJ?e8j;6mՂ2wAVH:8aKf-9^0{:K }#"^ /~Li3ѱD~ezpb#\(g}yaܕoAsO^sMG `m.q'ߧ1/<0¶(yßIn\3[{Z`o96?|`à+~ܰy ֣ [)M3U:l$0q]Ǟo!ݝ_yIO|K0gbڝ3#L'm'K?ҲbOx񽟈9%ݼسKңs3~_HA|)}Z98]uٴmٳf'9⒔jҒfV"..':>dY3y륪 e(ኈp0e$B'7t35WMc'Hrp#/f? g̨~Տt*v-Ըix+7_͕wi&ވݴ#q-t|S޽A;؁W\6bՓ>.M#C/e-S$2gy5 wap#MM%-3}1{|> f۬U.QsrlqOgaLDϛşOҁ.Ud{ߑ"+g ,'t'!<;zfafg21~#>`oGk52+b~dWi˲o`ĠnnXil?) 0왜8LӣP8/ -[iz2mޔkïq%3?Ȅ&Ң{VJVɌxm漩NFH8)ϽǻsIꑽ.W&}X5HUf :t{9\>5kyg?ȴGe)#W{>3]P2RҒ+|O?XDDDDJѸQK\y~Ph[8Iv`9QLrTe U|u\4ejOP=5g/)JRFXF%T_\_u/ehJZXDDDD25Tl2Dϴ+UTlDR+:+HU Y5&RpigBpyWWDDDDZ6 6_՘HSA[/""""RU/&ox _=(j |EDDD`ՂjK*`Rs\lHU 6_?US"W l~]) d2 Ɍ͆٪E:&,>>8vn7 ǫOZ|X-X#\Ғ =֨V"""""","""""" """"""" """""""UF׃W#\na```20̘jT2z=nN(\ٽx{c5s/>;z4mBTt4={9q_M׋#שYDDDD dy-et*k7k1 ݻS-,T.OJB|e;Ił?yIBp.yg ^Νҹ3# wޥM֌r`]{~UcDyDGG?j?ϙCzz>=hϦɅ{liu]}7s8W\tv2=szb;nfZ\:)))<9q'L`aJ]0HH?>}.֓}m~}z?^#(833` -o}G`@ wzK==R\uL2 NVN6s~Ü搕̈́ngꔩtMTUAV@nPc:oEmƋ\.}_~چ[ӛ6o֌j3w!!!mϨ#idRZԮ9~iSR.5kgJm s<>a'%'ŗShA+dnTӇ"vl瓏?PBiԘG} V\Y#b 5z^;uz?a#?cZc'}:mgg :~,R}y@F%Ō#ӌ>sS7|3 ʽ 3Z4&0q;ѹDDDDҫw{=C|Jr|5rzY~/U٣g/s{f{Rx|ML&^?Ŕ/Q71uڴlJ OdX4~m#p\L^o_%&chV'cwd3k1̸&iͭ֕ԿƢooԆF}lryTbdm{K>WIlm1k][U'i׬ <XZqXжxluiJ'&`>@"zaԶI;_ο?k^mՐIò~J70cj8R4[REDDD oQ-0jA m۶|0:FFF:dddY:$$;nODD K!]wңG`'IÍ@l;) AA|T玅粵{_̊)z_fhW-jkI#ѮMq29x-5>$hެ?CkME9éo!!`b)Gl[z&ʷ>.+uϪׂ6$vJw(Mas9!uzo1q.W,db g cFq]&ËMKV븽g=2gY\.F<TKDDD`y19v;Y8p-[`6ڭ{$88՚4HMK qc3j46_[ с3{|3degWZ]A*4;R?-H9d ӥ^R3hΦM,/վkB9muc_()jRݛEƩ9$%T-B\f^5}?K>ߟۖoɰL59hÏ 8mz>,r^FL,ftoh"<BFMNМ-qllVFCI5N׈/XUxp,:ʉ,$?9RRywyGi_W3ٞn`Ҥ1& X>cK.3Vff&~_]quWp* U.ZK{ONv6k׬'$$дYS7jȞ}.X6$$yW/I8R~ɄY {D>/>{}qNw M2/£[g%(Mْ2&Ȟ@ԞXqW}`G^kԣMCR$ ȩQ v(KNH(ͧ{lfq4Frē ߥfHsA~+zqc.Zvm㹮Kgڵm]6>!M|&MOFu<.gO츜"eB1 ;o#cHF2F@^ i)!5=E\jn˖?ABI^>U;~tlH#o ,2 3N[Y-hJTt^6Nw(ZӟZ۾̴Q` r""""p8|g޽nݺc9Cnٽ{7YoE^ W?x#oЯOu7`|{֫wI_3`АJo|%`?J /Ğkw^1ڶn͍˔i %]vmZ7okێ*?{{m*f+- IDAT\YTj*oO<}j ?vmأֿl7Tj˖~yxx.a x<P1pvϱ<|H>NuK< 'o>6l)~e@{=ŏK~%pz>s}qÐ1wsr[١i;;H]?u`ŝIf!R^eI{{X|IK_}(}Æc9F^"&=DDDDaFXXnKb6۷fǃdža/wsmŪ_{XjzSRYlÇ_~ƍ/˖_`C:^b fŦ3sedÏ\ OX~ dQDFFҴIcP>wdaJRT""""W-[Cw~?nڵ7v-㏈*?T.߾Փ11̚5으;v7UYb%ʜ)-lQF *?Ks\8J=j-"iޢQQs搞By\{mt-S7īBDDDD0ݺw'+3;w]aojl, br8==i_}ʫrj5EP*U""""W.ld~+j*abU'kT"""">6*TW i2cCDDDDjz`m Rbs)ߑteݽ͆b,fl6_L5/ """"rf_i&Ll6Lfߊ{B&n ]i\y }(T&kX&3o Rbbq{p{xx번0 L&3& YtLf& 4F@DDDDDDEDDDDDDEDDDDDD"fVDDDDDD;wT!-=ҥk-"""""" """""","""""","""""","""""",""""""Rns,""""""[,""""""U2\u4!آ⦛o*s,"""""" """""","""""",""""""Rh,m۶e;vXr((((((((((((((((((\,ټ}7{p\Rk!46[4mvWeU$dƑrUY,'vo:ֿ%X(\-c%eT~ж;9r#Y6ƌDF}^̩Y{|.1GI s%ո^ \w׳/I=WjZ͡c ӷ<_f1}ĜZ EDDDD~W}xW,vz>ƎOm-YHQx~hikPFmD4$KOA@Ttڙ=I܁ 7Ho3[95Gߛ笿[G]G@̽2cnNJcޞ ,1G_=؄`ԝ!7u]I~qnFm]Gg%;}˚t!O0p| 3y?{nyWݡEDDDwC-WܝS49'{o,~.V,[i\'zz|YV>ooΒy+oÈ^ X l-㮣Foqp7w?F۪ZsKjZ.vݶZ~ZpGۨ5Kw>OI4|;7܏fVv4U#?86yIly _n{CФ|8'_eoHq?B_nf'"""" r)e||>+kW}_t v9cəLԔW?qg@}x7e PY7Mx|м][ؽcӬmRP.ɱO\U F=Ǧl'&T$MM&^lVO:'2O;Vew+_9y\O.vGCDDDDDX*[Fʹ4ڼKٗN+dS '5v;!Þ T+.0p8z|7ɵ0pf@_RKBV|GAym?fԳjѪf#)K%7<f>7rS9؋ ;,6_"Sm3Hs YG-dee_X]n`w eBP'ֳ̄h%$9=jЏ:CFj!(~ͨe)<2_T^Qh 2/eOqj6/6.sY3U_/c(%nX֤{eEF%.(mj~^ubNMZu jT乇z;$S{Լ0f/NeZ߀rsJmiD~iHèof۞Z ϶@ؿ03׫[NjfrxlC־5F֞$6b6X6-a1 khZu o ǢGs趝hs=zuk<1i9p{RamөG-GyӵfK813 +~/s[`ZXvm!ìX=CDT&Rh"L\N&Ǐ:z)("""" WT|>Q#/t9+#6?z\|D?{YL&ȿV`]9Yxgnǹ!<]#3tatUyɍ\!Z <#䕿 n Wfza-aٷ Gvrow.?q3iϼmWnTn,:'Nob؜3vh<݁ÏQr`'ȏDqGCU _ H6Sf%+s-CLvQ ә0sCDDDDDͶsKؒʿ̟_u)f~T{4<*3%gEڊ)q"B[e YzNgot@K][۴eY3,7zѻG{m6miLd=ƊSXQpۘ6lVVm>yƵcl8:T^ubɟυ){>ӏp,,f?)>`=6:OAQZ8No_&- vش`. 3φ$RX2i&fmLcXڤ$f J5Yq|}m1_Ͼ-ll`F+ӷ<َodbSPDDDDBҋ_` О^`fl`MXѹs*a޺B{nf~v+-wO>χs󗝚>A Az-py;I.:nu+V-UGܐP=snVl!o*%{ؼ)⠈ _F;a /)%2WcA4i~rj\NdW W6F+j\O@Qj؏#F#mװp9[su`朘E9p:3s n֢HfCpع0!aԋA4Q{ҳ`붭h7h, djP7r/AѴҤQ8O;fCğ8Yf^ڴlµڜ巸`7ό/0:tBzDM+"""" WoF"OKl@:NU<5} Oy5S4Dj Ȓ~`zlk&FMڛy_٫ְuh7i=tmN{*q',ϛ8(20@zD/&vؑ}}mډ];]׹LѵCD_0qm)3~tWL\Ӳt6Fm˼9g˩]|qDfEv[6\>mZqYG|.X)'Yd?sAرd=' )Uwqˊ:zǚf`nҕz[]O]dW%bВ=8Ȭ5I^R^#O>wYDDDDDDb*O~oϙLg1eh$߶Y֢}h>MtS?oĜvkhQ_ ӷsxEfo,;FDDDDDبO!P8ZV|-$mq2 h *lks&DڌJ繟t5ƿ=mv[FbÉ+9;v˖B#D;;1ܹnբŀ!#y>Ի@w[CWxKm ~6giWᕽu273pun8-*,S:طΰIlhkC _,V,9wTIW X!dZ̝9%;sd6v iѥ/oN5NP;Ͽ~fD2\ԧeq{cϋYn'T6A?'is:qqۍIy'5Bjޤ]+ 1osrNz*u5w  ӧ.gÑt{GDDDDDcС^KiU!-=m۶9;vK7jpw9MXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDJb񬣼«3qEDDDDDJa2_2- }7Hwc͖.bYS۟WYqim)v8LtQWZA\2#ے\͂^RCbD^?`'lP^ASs.ONr؃v28`r`ppI^ښ)78mqx(ëH8OZdK^ee[8<1OZBǐZ!vI1xeq u-qt;f8au]ì+TDDDDD\M^+)SwpD5b'M,KLZ{\c9y*/w4b]) yn)"""""ru`' ~4uR3՝,?}oǗaV#d[m9jLWз?i8 3}caj|zo8w0&4;EO/0lK\ll6RsX|(. =0+irϰjf 82v6dx8PˏNa +'ܺ:EDDDDD*igwQ $R-xE,"`{dž8bÆAPzKh$|*uqAvΒy-sN,R\ IDAT8%/ GH ̏Q'?weꦍlL6i+yDcǮ bHTT8JQPq{pGQ5^_Šs r1}v2hzV6_[hRN+ub +T7S2syw]1z&TIX$Is p>oƟ+Cr2.$Onz(HY7Zv-\< U*pm 3V7̿]AgQ=-ʙ{UW 5ޫ YXzHl+Y}X2muW㇙z* TtI(ܲW׽”D.;4&P:X$I wfϚY6tJQȀ~5OU%´C*|<I$I{.:u^m۶tЩF 뗅YwŬ I8%I$2n m1U:q$I$QHW~ͮʹ^:G5$I$iK$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$Tf}t3 (wh+?z|ūYWO^\2"O ϗؑ[_I7aI$I?ϝdc ("oE&k-I$I2LYiͯg]З=RRWX^ }>I$I2\V0;Y): 5I$I'Y[M(Mζ$I$'\;G֐Qezu') {h(|ekrTvٿϱom6.mY3Z;a k-89!%rY0{w2_̪B„$5McRcˍȑ׏`e]|ٲ;u'\&F $}wN#n aKɫFsUфijM/1htI$ cݺuT^7Ijj*III(g-|Fθ&["f|]v~=PW|@j,ȝ.Ks;́[MlQݚ0ۮ&-)HIKmV5/W$Iүٓ??={~L4 lؔis]f}[ZSbAM}a.'{l~-zŒ$I?TZJCӇaÆЧOjժeAFhJԪp}IޏX4sv S>76Zf,"oWXP}y,Y~E7?7YG6wז$I ~!Ӈ>}nG"}}+g+eMa-I$ScԨQΨQ r4 V=wY@)&_ӑ&!|SVdeULo:Э~ 6܅fPĒ'oرa TExRSH zn;,$IʩJiil&g]ӓ\墇oqɠhY2.!ΑR3)h4h́_ϰ}JrmշMK?;Hf8Otzٸ0~ ]׋T!5bITiщnC4 r^]ObڕK>W|4az$Iݻw CgʹT$I$IelNm:֨a,I$Ioc$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$I׊[ $ITN׹Xx$I.В$I8 [$IT6Ae p?$I~S!mx`,I$I樂㈋#>>r M-Q>YO4I$I*+5KғbDQ EEEdŸgf"W {%I$IeŢ1>_V.mOHH.п63zyݫm%I$IeLuF1jYG7,*CVM]:մW$Iʲ5"|"(<-yn*9Y$IʸPc$I$#A)k YELZcUUUM""JQC$IڙG֖-e`U!|,sY$I ֗Y1k$I$VNycI$I2K$Id$I$,I$IX,}z) e=[<#zo,>XzKf{rK$ _=~{(Z6 yy0L׮oӸjr6+^BN98z˞W'3[?y1wȓ Mzlܒ?Z&Xڵ' iQy8nLy-fGQPڦe B⩳{{:i۾{ӥO/ꯘɨ1I0g$I JP)YrQ-DؽJ2= Kf_yAqȒb..buI T#ܥXY\f'?O&rXoW67FmJP7K]i(d$:Kjm[q 8ܖBev;rv[%63q`8.c,f.o |yi:=osH'AESP7},>BO+y?SR8noxϽW_`36s $QnS95lcQ,o{@"Id4mo8eG1*q.49`O3p­F$%0fL61 ޣ;>]8%N۸UeVbcfO\¿ߞy讜ML(9<{U [BO'`rپYP)g.HF6t=ǷN'3Ky2-G/b7}ZOci^Do2pL:T%-+g ÐקU0nޫv|!mh҄{G6Hbכeʱc_nJ5ą yy(qcߍ2&$FKu>)wpShxOUckœ2*s#7õawwo[4;1Oxj^x _p5Voږ5I_ÂoN?p>κ%IxgwzL Չ&n .26D R*mZ*aD‸`%%Aj6,!(|:ݫokԣixr2kivNn4#\'WE*ԩ^tɵENdUOiR_|ǼM)'IXa6 ^#kQ73䞴Lt\<Sak\Lyb 8]sEb-N݀q,X4l֔µ,ɺJUkkӦfü5Tmؐj1DU=b*עQr!Yf0kz-< 1볩4@}ITkFܼe6?v;-Ӱ)͂gv>j$;~xC#adg&~knXo->l2Z=_-#LH Vo/θT|?;@qj={ N Y΃=S*z?r%My3M$h_K=䑧>`FNH4D⊃癳AM+ju,7tշbjVy/?ud /_Xzʭm[%sYyp4V@Q|kQ7v$$Ixg1U"K- {4pd $p-q-v% 9bJn* ʻL;JG#Jf}hVoSzSo=>a'3wSɫ/LfUDsآ˜/QKyoκUI Zp7gr}cˡS#6Ő]x􍁶 ;S.?gy'ZM0+bē͏ >{<7|/_o'$w:;Atۜwsj~466 ej1w/\^>}3ò`Dqgqy2ށ`aFz0!'% (dRah^j%ׄ O-;q3*!^˙V}>Uzf=N%㡧QGq?ڝ5ݾ5y}Icŷ^$,í=ȽfH6ϯﺃZk?Ɠżp牤g䪳^ݣdZ<f<5"JVMߡ s9U=ι=Nݧ.NgP-I ;׉HMWؿ拿 1n^o{cHc\/W1xc\/l) aB<STL!S$BaNINErKoGnm[5v ?T?wiM}ȡ0}D,+&j;E$˗߬ uw%HYEBBjeDSHIsXWBuY@N8m Pn٭kRHzAGއ¯mL|:;^DQj=v? :6Al>XJ3{*dMtݹ|dqO=_@b4ۦ9Y W|Uswi!D;vcj#3^ܷw:PXkz|k? x!WMJQrۃJ@QOcoݜ9T*m9|P/X|z-ҹ]s.^$I7BB!#GX4)V$ڷ70JnY.xm>/Bף4Yu@@˿_˚mc3Gָ՗\y2 &3Ɍ~[u78Ȁ,>}yK]koMh-zs?oeOofVww\ -ƀgEKRM䱪T U᣾gȷ+xIU:x_=YZ~[x{ rm! U,y)+F_}sX fL_`P//Qgv+oǰv&*u_oH\9;R ,ɟptA齁??*%] sY dwd1UkN`*\J:dN{2`=9IQr2 |:%oU}h~n 5%hCe9_}L)U~Onxh;:9yc/*T*F"BTJx?ۙ{$IR@*#s:dAJ O /7NQ(*%V}sF欩Gͧ*緈FKT\]ҚUlІViyՉ[_ʩ#X IDATw.-̈́+ )iۉCθsڗɥVl>ycWli5-&PS/z֏'*/\;Cn@(wMЬEkS#֯ɧF]$@$19.Zaeykn8朱16{O;K?eĒn|tϽKvyszO_Z _/sYY@Ri»^bKŦ'%37D$w(NH-68^M+Q3nig12*(唴8ڧmsM1mݗi8l&k퓷smo2Y dt(OE,]v;moͻsݷ~8~Gnᜰ*m?{c-B? ;+9lZ2 rsOm^$hYܲw{m.:=sWITݻw Cgw(**bzMnmQSm.{sxԫx&0x<|{?`k s\*uCNiI|^>2/gy`I$YzTsIMM!>>HU6dԩSwxmСC5o %Sr = o+Hn0y{{6JƝ9[ȺL1AJj|Gc~LF-+&IgNk Ifʘǝ鋟b|:|.[W㐃R(|{.S?9q0z[LSz}Z:^u $I2KFq]u2J|\뺟]&$5pZޕ #I$FR]٧ ILrL$I7X:$IT.Ч'>(b j$Id*E? T$I?}V%I$I`I$I $I$# 0$ CkB$Iʺr޲{D>`$I+ gU7, L\$I2wrs:8 C{I$IRy+.CXbD$ITK$Iʅ| $I$,I$I2K$Id$I$$I$Ilˍ ,$I| #n'X$Iү a2{,ƏKff&NHFFk?4iZ %,I$iBY!,Z[Fh"^2f}kk,I$g/@q,Ƹh٪t9 ѣvLƍGf͉x#[%I$bbdX@0QtV\I,,I$׆2W@ʰMg5K$I-X֛X$I$$I$I`I$I $Ig?MX0;s?EB.g <}ꕼ \EǏp+%~dO}: dw^xq|#{>ż K$i'dWkqxr6ƍyori5WV?%k#7ٿ[o9ܟ9G+_CGrs~f4? A.s (zw=Vy1itK\1|hS>g YzuTXp5y7}=NiCҷrM/3-QHH[~îwfˇ>Laq>\ѿ'{l1B&@\Wuf ,]$+Tk sI\C!CC߹ {pyuu䘦qbuع%8}0ޟOnb λ?Uѐcޘ7y \y}٧ ͏PcWq  n;/mZaJ .(R=yPPXHAAPȆ-4SH&=oᙇec~wtխ@ꕁhRqT ! | XDCЇ6o#)1ێX:y!ɫFsMѥ/ˡ;JCڑ1m,?z&WA6׳/4 H$i܆}!%M|<ӋBjt;W0Br7e%رV'f2sa 1bTu'$PI[D뷟d!53~-_V#%L4^ٌC8W:L[%JL*#rcw$\;#V#/fѤW$I^4w&< n';~+BOxzADX sl>A7> ]w!$!hڌX6|9\K%(P@H 5L@&3_y6tMEx\ֳ5g1uyi_} KܝSJ|̳zN$ok_sۭ's@z>$I.He t5Ki$ɴzn>x7ĴwەT~SvOq۝l>'5[ IB:&'}ǯs\^U?NQ\p,y+y=HʥgMl#2zpс6L -b(coݻ!~ٳf;bM1 |'J$IeQaH~Au]ccư(!&6mX$IRr:=5i}~jl,I$iS ^q_$I$I`I$I $IIJZbQmM%$I_!V1iAY1UVC}3q,I$I;;t7̙|;sRu#K$IDhԸ1G::u꒘hAԩS#zIƍD"-,I$goE"D4m֜ +,2&%!!He$IA8>.x0$ C Ӧ8[ $I~} ð4GR:޿ $IjSV *LZewʃ{%кw$IdRf$I$%I$I2K$IT1w$I$I:^$Iʅ "ZGqQX3J$IʘH$B\|AU3lQ$IÄ@~%I$|r}>X$I`$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id.g*|ף/V_-N뙃&%IҎ_SYo8<=/; ɓ'͞W'sar+6K~2%8~O ֳ$I=i@.-g|U\=)/u4p{RX^g>ǠϗPT=_}WweJ~xj׮̂/Qr|%Ō~Q^7$Q}_.7Ocn6'pG O\Fز7ןQzYqp՜ Ϟ'̕DiW\aY.IdC9ws<}$c|9{Np ?oLg~Q˥U YU.'5L[OX%==Z}>5Q lx AګssKٷެ#ɮ@aY5ߩ2xU'<}s?^׈xE Ҩ;Hڦ={UȎap1xKRyS'J<5x"?zo;x$z+^O4!䑌n׏sFΌa\s49,_9!ys=oE\wtw& b-IN%sbUiuErs0|溻oS3X#aHwRƟ۽wtUA"PbhX5c,IT,51_"Jw@JbFP9ߗٝ92o1"*FF;&Lj)C5o>ʟOfJ_W+zdVni^!rU|R:^q%X<ʃ.ƹG7!umxgK}qxb'Zv0BXhŶ׋uc.4tωq6&r+ B3| tlygӎɚg$IV:53 (#S҆uic9]>afRY U3om1g_F&Us8!{my Zjv-?ZH'y84 5q 5B<j4O1tXG:=3[2q,c*r/ovYC.ڈV gq˟^+!~M\S@QN]0N2[/dʐbJq 'f1kcu=$IJX0K8EE*f9g,TIKYɢ x1f/sBu>s25F귦k-K/ eq:o"6@aqHF6u3|Nd*7(6nƖ&gdB#.cTeu-WxɖAWFugn_H~u_;.;#'4^{mmzzNg$ITѼ=MM;1#mِ+849+VR{)]:)oɟr2XΆr Ēɼ3}=:b _SI_E>l$rkRXx[l*MLߒw+>gqd/J* RYɦ5s,I5S?vמTʜX/!Ø!$U+獡qO3*cG pH{jV,d̈lZ=wﻓ1MacYTf^ bAɾIq%>c^Ǭgk0qա8p<0zSzWg81yw ;YU#܎|@`cyU:k g]ÆZt˭hڏ\}/ +5ja{KjeG<;4r\YqՊGx읇ևpiZKΙC*dԧTky#5ڟ C)~5h|\>*rXz|>nPnU/ 2)| MdZ IDATA-z\݋lk#%U!msf& 8EE > Ioq tSǮ$|PЃK 7nɓ'y:u@nݷMkִ1~a$IN@$I7:$I{nI_xX$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `I$I `I$Ihuܩ{d%I$Zj T K$I@K$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I,}IȽ:jLy? )I$i::Px-T$9$I Jo-~Wتw~SLW~)׾/} skk^=¯_^!w}yZf{KCbw9Em{&vG#J-;/{o64=A3)<ߎ[(nZI_n3tF2Y?GDo~k WQx)dqf]* ds\fEs %4Q$InUM8MYة#]j~ås ~[jӪЩurJH-jB;/9;gZ;"R7~y;ڼr4Οl7LN'$/?ʂ<ҪsC!ܬ% bUl~j,Ƕy?71QЉep3SvLίMҢaMN,W~iM^@t$k}!jL.fc`iVr<.2i5rR&/2[]ٴ>#mq)i$V&O&` ɫi$Id_M'LiW=P1u^]ZFy\qUwuCɮX[|& Lz6w3z]ЕXEYyƭy霎BH>Y3AaoΦ2~71䖫{.F]&" )=S%Z uJMB~MTڀ:h@UZkm#Bm6 )r*QR i7P40dyև2&%I$&{ 5Mh lDИ: E# ֹ5[4).q{6d!iߣ-[.6>[_&o]T _%C])l:z8ܿ͑}[e6}=J:FIӶO8HI$InQ\\ @97=!Cb5Ear61 EJ:-EPQBeeHI#3s 2o053[$I 222Mljv{5vx-$7޻+bAU)EE㻲uRZ$I$ SRHE [ !yS%:ӵ[gͥ j$XU!-jG(e[ۻLg%I$IdȨMƋɇ ާp\/yu'{] [ gLXUArHЧws^yhY뒉$I}5W+9G5'7gYLZ[N" [.ٚZcϣo/xS?ZɓRn jlI$IVU!-`Y}Dxc-I$Iv2U~q)}r!I$ID:\Ujnxq$I$zV 8]{ F^w-ЃB|p=})/WTA)oƉo6?L^Xɚ cX9_pA, >y{1tJeG311[yȐWlF9y{_+h~{փo.Lg̵fГT$Ivjz t:N+/MIKYrTyA29rBj1[JrÙՙ.Ieu]_8sBr.P6Nè⁜ߵ`$I$ ZiL|꣯}=܆c/ϱobyP&u>tw3XVF(hZ2 9-yKCrοOmDaÛ9_f즐Z\y̒bYuN8o:_EW%I$ $cϯwxeCA>TQ~-_*s:SJ (m\U$IdbL!dsuпS9)05kF^~-9Ĉ}\u2b,I$I𷗴y1_~٬OCj4qDnrCO|VژV}wG4՜̙)<7fa%#Ƽi-d鴙 oI(I$ICϳ Z O> 9{Wiǎa娉`V۞6iv&uvJ].&W_:$I$3aPfubL,\O𳺒mhڏs=ҳvyr+<| = v >bCӾݵg$I$RMM1*-a57#(dg{F31l1ɇwydI$IK$5QMi˥X:)a%JvJ6{%I$>M$w|1_..K$I\A7oekOϩKYt:zIUIqI$I2w՜Uk9.!ި3:f{%I$i/;V٠0mO{%I$i/q$I$I$I$IDtoٖ<(/I$I{K$I `I$I `I$I `I$I `I$I =C%EV8$IdWcif/+ I$I2޼?'= $I$i/uۗ9$Id?ԕTeԢ^ϟkzp~u_Xtx7]ܚ \{W\8Gf2O{V3y^Y@xFD ݼ@D2jI5?^Ӌ:!|(<6AcȏfPcc<۷g$I$-A8WUqWsݹ"ZBPU-']5z'$Jc.e/q vZFrt^_̥uf($< k%~ӗ/agr|#e bG#OnuL*O>I$I!U+$Unbye:K)8F6zPota'\9;jMZq$wfu;(c…,Z QI$IU+aЎS/>|p9kG,W]+30_HN'+SDʫ@z dI$I={_zW|dS4ejwDJݿ-$q6Y5Z$I~` \°;^caNByeAFw^M8[M,'s6_F:RHn܉#ؕN!<1+̓$I$xWp:b6KNܑ Էyd"\1-{ru#Ca}ɆF3zЊX$I4VV,^sf& 8EE >{ՠ'޽27>Sd{J$I# A4%On*,`zN:Э[mӚ5m\}e#~'#ju`:~KJq\$I$@ D2u#.KCR4 qf݈C#I$Ipu~ I$Ix R$IdK$IdK$IdK$IdK$IdN"n$I$W^{Y>ZWΒ/SXX)I$Iwy. Ϧ'7/'9 kRk$I E.aLÚᕒc?y9^=;ڤcYT{<1ş3zv>uK(`'|9kU)d{0:4$ 8&ǔhXȢQdnˬaٔz-J!W2}fG?-L%'6g)EԬXgRrgN듼}êBq$I$[ɬ6vۦFJȹiKyYO'Aђl"kYx4(-[PFqfl"WǓGtV$@qꖘV0; q(>S7gg}hCWo$r3R=;%I$vp-QY2LeNEzmϪ8qFfQEHDҼaKXZ ּu ̘*}cm[bٙ-Y- #J Ŕ,GcW%ͫ&ԥIdNI$I2e7_i\[8ԩ[r<ȢY^"YMK ($<ʥ,וmMØ((g٢U$ui[nUm}nxHRf/LU <;%I$i֟īB;w~bOOΰ$RҢ^HTD*7nXxP Ӂ$RT h@|BP'p URY2=`ӳIͅ!u;'1g<36wp睂]$IU+L2Re;Tvmɚ3IQ&Ԉ@ޖft>[H8s4; 6AX\} .-O:b`n}7mS_ 5k sʥ=6sLtLI$I20K:1&]UMbcU:9?E > Xs nҳӶmRe{]ٴ05_T~vakYtGХr711/H$I$MMM1*"vkϦe }d^f_:AVoqV,Yd9|st˪Zi⳿$Idv稦;NyZ]סE8tAvڞٯQ{G" 5l$I$xHz;אB.h&I$I?C I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%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$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$Ia3 IDAT$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$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$Iҏ%oAGB$I~vcF$I$AS)~m$I$I?qaXSi"?,$I=Aj{G0$$I=@HG೿$IGͯA$I$ `I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$Iq p)C/yeQmWN"Nmї$I$zɢTTi|fL}7¯pI$I2̶~/J^j^:Vѿgy|3;c9,ҏn<.[)7?>6VPdQA\t!iC( \OyԢ郸`#_zGߝȼ$լCqr@8(?Z4VY4=*uI+!/2brǣd6ߟ.K^ I$I{҉e}8> jnYG2!4Zf$Nzf#F&:.$ ﺚ3s"DkJw7xnuRp-i\j3o]9KOΜF`$I${<;L>6^Ɇ2?}dV1syDMO+7j4kI׮sY#JZmZP#EkR!ō[onBH4}$/XǬem(jޚa$Ӡ^J i[L ͣuz8~@_$}$I$xVy ws3CG'dc%52gi xV;f$  = għә5g^c05 Sd}m n 03yW2hw =Y1W4z,s >y$I^ pIqV$>Z @ƍBy ٯ-k>RʉmyF%Ws9t<ܺk0j5d֎\2k9ԫKzVN X3[ޟy WTQ܀z25=Ɵo\i`]$ITE &CxQL{%Fv#;ܔN>;/^J' ?9K̎W?-Mqg'7]o.&A.%#39<~Ƭ-Fd;kO{iqهo,μq(طq$IdW?=bYpϋ}yY.FȻo?]Qc_bžr*e4j/gZ.LG_^t=j~.WO蛟#G/:gpj%ػOKnNH]$IT+B/Z9vJr\sgW3C=$I$UkGs#VIVVXHd_TTXɓ<:u[ۦ5k/J$I $I$iuwU=//s $I$i`I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I~GA$I{zE̕A@<3U8D3J$I~b"I(A$BGDHNN"g$I$A@$H?/bƯ$I$#8zNa }X$I~!~r'0zƯ$I$Go_$I$I+$I$X$I$X$I$X$I$X$I$X$I$X$I$X$I$X$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$IdK$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I `I$I,I$I,ep <`H$'gՓqpuIeI缇8~y&ٗ%k)( IYfOc?K" Vo=],rZwȟYj xgXx:pf$/~gSy@%Ig=YrӫFޜZk8`GJ~%ahaM_̭]͡F^ (\6I|˿.Y}aЄVYM1~p%<<34 ޠ .y <$2;iHT}3,Z5%XϤƭ&ǫ8oC6c/粴4$QK:zWՒT*Y;I~i KKҨ{YZGO簤2JN9n<3LDY9i@k.>]n)F?wFg:%489v1(yCf/!Ǿg_Z 2== +~jS[9B_В/LoA!mڭ*zӓw?`fa*.y%?Aֲ;g(ܵ p^3l~D`zܛҗ_c|a~s%~cxKz:.{s1W<Ƴ} }o}F> SPӂ+ߧxmC]z}7׶ Y</*M{%]ԊqR&}ʔM!-2SАpyyoCp%v=pбl!cFly^"e+E3OQek+aCws׈=<dLk׫hzFƊOP:1TJ_÷H/%l?SZ?[{f0g6Alp|YW:S09F$\ňa9h?&=%wtGӴwBI x>4G W2?xrI7ƽĵCF冫t NKy~a])99 e={ v6o?"Wk0?Zkۤ4ixc78Ġjv$^AuPܨ-AÔJ32[Ahr_5eGAt, ~z{&c Yh]Mia\pi:p}r"M,C=˴[3>b:)mtZWftv3f'uBʾW$ĥt:"yms6Sg@X<2r0m>V("'ǁ~Ç00E$z?>ٝ;;0^@`o@T6ͫν,dWQ,ģ"@Vner6lǹ _'G&9*{,vq+ſAiT$F,o-FgWE>z.VlёF __ptΰ.N|uyUS9by'Sv4#,n%5/6q3q#ܘtt#L8Xy$hYO0|o$s zS6u ē^SՇRkۅ` 8{jt6ӔxSHI=3SS7\Q-k>' GAG=l8?͂1QS\kK{_ ^pu Rk78ޡT108'ʾt'ӠC}شWĬy𓟉,Ͱi÷]:q/qf~w ӾL\"~3k6 4 tvfi:-s\~1[D+ȵ ߧC&>ͼX‡Js0މCf[^΂w'1. e pK8>օo%v _Jd%Tyvh- =Kx ArؽbImoB .<>ݨydk,nȫe>>{k^ZMܭ-PbuBpKw?C'|ȌSؤ| - xha.:xT!kɸ|8s^^Ϳ!^?t# /Z4vis8AnSN-ر}=o|^Ї{1j xy,YS>c{%}LU_c@CDDϱ`KNJ{كvN3lj=ZK0nE<;aHNh~ e^zb訨GZRBQQ99 ٝ]#?ռl;@rû*az2^4.);5fS7Ca3cs %,~!ȍ]>c1}LabM܃AEar)X zƓgrm'DDDof Cg%r .ݗ` 2y#qܗNxc;P|M'<ͳp: `G3X}T-w?~+F2`jb3JGٿqҁ[huAw.7}}&/WQ`v*""""ϣ`QQQQQQQQ``` Q#Ohϊ v*EDDDDD? (((((((( Ϊ\vɲE'??W< AhRQ 5lm55GD(\#s9[^cm*\ ˖,QDDDYq^㙗^ae氡<#N7y%:(vv6c2g׬L JӞ<46ZT0(<-akbŞU;l$z䯷q2͎Ϳ!F>} t*1!AEgE 35#GNN3^5N603{aǝ \U`u1 v]-H>0^|棴LZƸYxů9&ϚG7x뼼't}'zU>3:~dlW~^ ""K|Mp U 1oSϕ$گ:!Ɵokj^>]R !!׸ؒ#3=ݛВ}C5nulwkA hu#٬Q˶Q+3A<x_c#9n b'n!6̀`1k^bsM\'xYK53xPZ41;pjh ~>ř O=M(Sɔ Aen8)R|7㯷q$Nsy: c7%7nϊca* .g3ȫ?p,ڄw҅4 58Q$q4aeݡ4ZÅxu""""rEW]{!i= "υؓQJS^d}ޝ_~/Wv== 3# S ЄSɸFb\SV,dUz ȉb&y&;nE$ 秱xw/w&WǍq`Ynz xzx xfM&y&à 2üU,k6l^L0c8dP;$[OdGRQ[7bSTEtN$6˗!]H`Xgctg:VpR_ӁQ:TOy֏w^H ,`BQ-̙ŤVډWϸxL7< lЍ:{V*kZ"yUhlpny5GsS.`8j;A a,1Iu!0 $ipz:W0Ɲ ư뼖܈j+}]a[&5Wtw ځ>݁ӓrKGmx{qɗK7(Owܜ \=Û:fDDDD**mz- +b(>IW!>OL!7&×pc@*W#t1EUho`x/ ̩klM#:4n*dh4Cq tB(_iy[>ghqS.vu0ຄS:q4PAi1DHiկ)MXO-MVpj_6Sw&·!/ ( EY:щrUc8.r'1K>#SlƹP;UM#-aFڏ|8e㏶>>zyslzOGtٻ>-sp[ 5M{#yLCzZ2gfqa#u#F*0m\xZ/Yb+O%jX +""ۉHb|~0GQ٫bByy=ZϜݥ$Y;SԽXg<4f |,! 3 N$P!.kO|ˬXǙ=(La8R+Dr]rd3șM"#;ʰ y!|8m`TNU&w3O<9L+)wVu ŭ0}?0s*'5`ãSL=d⍻^ce%ָ,Y.C *]4O$ A!~\8] qF IDATq`)h+!>q&eӁbG|G{!>1;ߴc:{P~G&!}Wի(6xѿ|%%%ˀYY{BnO>/|3Bxa~% zmZWൻc[?^/}y㵜HhT2MT:螷1~?Eux`ʉgT &Dže/1_._" cZ;Kjb;gfeӶh5`{PϚ[(_كbЎ<}kC,fƮTB? lmY@ۦ'w҈O~:fX4R/DzYrn[c!3r+_|wvǐx_:j$ ߑpĬYƌ]qAt|/øàM7S/؏;uo>Okۊ5{ >9cڀ*X(e?`ϯR&~ضg_\CMϲ7 /jT6Hع+巳N];IorT*&rfH+_Czޅ>18Zv)?+ؼwVBP\fзa )"=iKgp~eȍ̢\L r`Tҳ8Lx7͐m eSJׁٰ:vL yd_8>؜+ֹ3 K"\nz?ǽjRٙM)tY҈; ^wg|;=^hWEA82,\ </obK DgOoԩM 8p|PZzA 9!SPMŶI;S19IDuqE}'av=i,0l8ID7ʭ~7,/ grI+Ry(.f4E[:>D`5'3֛׾g@5'v}+"""78\/'<{}v \uJ[MO pmZMKjHhvx .q:.gJ _} 0 _14\y3/=ɰhzSwӄw-q&K_ iެ=}v}v''>lG#7*m6w0>%λߢ3{cƅգu5'T'"~ॅMcK:iviЄ6 v~7x ڴAt P/Hޔbڗ"jar眽L1mZҺ[_noъzeKDDDntjXBTu7}Oh7ػUI J<izcuU]t*}{toMVmzC o\Kj8}jv 4EDDt 5GȷL¯phF,͒+(..VMDDD,rౝ1vMa*pjOozw莏S'XDDE-"נ'Ng~EzØ?q80""" "rBpq1РR "r;sSDDDEEt~D-L":7EDDDXDDDDDDDXDZN;yߝg[ 0O,XmkM?ЕWM)e#>fNS%.t>u0ܘӱURn(6eMv`1-4qĝt]w(ÍЀJUqEADDDDEoPp|Ӧ/csL*F9#ӂ|s]>ECy鶺xI|8MgZ=[b iO勯p>~p9B[ O9&|gB[癑]l`h3!6ĥRz[W%bʓ}=a^fFÄr},8eX]s sn9otj::PH|͗|~Ï?@ZT,NC|gu჏2My6͓3f+}e,pDsk2>6ŌOR6∟x`K+ePa w%zg<62Ӌ?H яqa$?=/}\0~v;xuT9Z@C٧1Nb7,b5p*g)؋5Qp|+}L3T<w۠ekϜچ|Qm*3F}z}&O+f0F%ebƾ0=vm8[ ʟ^[Kitk7ڔ/}Կʕ+cƎK߾}y'U(`^xz/vV{..7*~4B\:×&.U`ĥ\/vbR1R=Ŀtz#.K+Lb^̜>%ҷ"%|%7qѠx'J$([(bwXOi٤:AXJi1.R;&;sw+BJ Z7(O`o$S,+R&xU`su;w.CeԨQRPPĉ۷/sbQ'`n}?փL쭼eltPx /syadX}֛&O=85&nyiz.vrlpSؓT_fޙw~G85w|;kbby1x`ƍ@߾}7oNNN*`Iܱԃ50IEcKakJxճ.}ȎHB %ξWooTĠS eeŋxCdj v0vC@&lS "mFc@sp9I4Qÿ%/JK ॷ&h*gxv~ԫ<Έ L*Z,O7oV+"""eT_`% 3?}.alGQ7+Яz WR7R_[RRz)Y-{5JLrZѽһiiSv-n ?w'Pغ3+R9'on!3z=˳=p6Hض}S T. o&οZtX?}cݹ$bqx~5?DJ*4 t?Z_+fxSup_ŔcfnFrqvͰDDDD,r6'VROL]0}*DbNRʺ'7=.Y`']hSLs?7d}o~ƫ~&A?j7{Z5}c|vץsE[Iӿ +iSepf1ӈϠRUB<ڔGOR攽'sָz޾>v~Wx#n: WDDDXDn3ϖqgi`-[{[ 7SW%33)woq}Nx1frj6/gt8@%~LOU20eo^lz8ީ-ËOcMAY-Gw`;٣pߦ`پ_1rZ !yQ3a!?`DiKgQ2 ٿj]~nOF{]3V=?¤*_1ї̩ę3ަYR,=#X3^w &8N-AF}]ѿLfּi ^if B{q8|Ę[Ԭ_ٲd—=yg5Q2%,d!W(*qίWn< _UYw#Ưe=5K3$HDY[٫t׆;3f5x%+Ba!E14?0eKJHIyO?\vO~嬹l,!gIQ IDAT&Fzzks~\:g8AP+_`\>ؑ.ͩsɩ\qA,wײ_ 3<#{MGfz"1^u- E>1 8r: }uQO8LTbKxxtZbS_:nLƉP m,*ȵ+s%(e ,IyT 19`QEK*M葳osK'Ύv9/x'›q6j塞/ ]GB=[HN}K;_dZjca߅1PЕy:l29s_gL~<-ϵ^f'q>]|Rxxbi_ d:GUa 5 a'X1)陽gK_W;v-m?dp0'__Hm"0;>y$:ϘV[ ;h/Y$g5G=(> *+x= +˭s#⻾N[)X,pZ,/y禱tW}F>8[ _lˈH: V{/>ˈ[P BdF (_ᛙG߶B/^_̝3V`n6x3|*Qی]3+ 3C3~(><?^Mt ⃮[ $UQd^]tE^zb(GZRRBQQ99 ٝ]'DOs߻G߀vՊw*mѢչ߃k ZD L}-""""r9j````````QYUkۮ;Yh1q """WA<-[ " jmߺ&_kD~~.#"xkklߺMQ+aْ%*>6+5pǩ1nn{o@NjT}V_0vtwDVzq'+W:>L:==MtA}M*׼-xSxu|>O}T-/}+_@_SyGu*?/OEg_ 8B}۔zs%'#N,dZ!O|,`BuHU f +ON0{=Sg!<{{ jTja iNSyԻ!m]>3v:pY1""""rYc#9n;I\!6̀Z`ʡo! p{RgyG#8@֢  (\4.fWu p##)PJe21^B⿟οkA`ԇy)|$/,0{C*WA5:r[@"WP|"Hһ1'J'?CnL1/ǀ $TFbb_6͙S " /6tG&)uh # Tɘ)|hVa[>`QrZ5<|8C8#9#rkLsg `)ad~Lwm:PDDDD`M!2@M~MlZxkn3V{7 ixq H8@a@-aN TC98\z}ζgbdg6]wMe#ն$ Wzc>`άLh*>ʇz` c䷙Ъ<}ysIn%0g9{6{t[0zh]{^}Z?wtl ) %tB/#TD+ *.V,"T +"* I'BB %d ACx>N$Ͼ;ә\/;~+e*ەҍg~W{VADV%9A}]_ժx֥Ή |GV2X O_[LLlZų BmJGySQ Kǧfe\rw?E~GpNwf#"\5*0ʿĹD<}w[7VR Q[#OK^ؓf(\b#yi7#Y5RlyxW;{p7q4|#=N{^K<[wL߉nBI҂ѾYmW/'+/+=,z;in#C{-NCg6SI׼~dZ\gdcV`""R,Ĝ#1ez5jZ )ԸOͷG3 ſMFm~Ly sG&T hQ88ʶv˹㯉z?wgevLeC1񩞗܍Eet䙜 <5_i~~>go;;t$D`PҾ>C| `QuYcSF1j_UJCVQC۬}r:;7_¹jx ;BLkiN ygw 2K-""W*0u&8;;c\N)yfn*R9dܘ۬`ڱgce~[{ʥ⭕FYB{K`*zpų}bV9arPzySA'=?Ix.Kh~ hcz"jC^gaMϾiY՗6̄ìy}SiY yϏs=ʼnCflpa5s_lB5u_0wK v IoƶnՆo~zy.!q7kw;:*=ڇO^\7JqlqϦXStDbקm*3z>})--Mno{f؎Mp+?26~ s|u[=B&N_McxKH }i ֏oGgoY8}WX@M"DG6K 묻5"T9څ=;f >1MHOJݪyիI0@6QUvf!@xVz]q0j~&|GpHXkw.p6l9v4hMeeӁӿX; ͎)gеsC\Rבw BBDA`s(o֭h]I>7U)#s/$Y|ȉ`M$Ff:. v,Z®͆#BlJ+.6Ξ%) G^ ]WDDD䚰"%aڍ&G~X UOAtFeaJUq19|x0ZU@ZGNg z!5mek$n}t5gw'/.\~Qv!!)}Wsј&<[%[ !,|#MA6Z909Fy*I8ۉuEaa# RRh[.M6ծ eZzh, ~/DDDDR HIcTkk:)|Ï!`'i,z1P\0jnT-A9*ٟH&U)c@ZnA9#;sq*֘MqWPߝN< )qˣ\x70[*H)M7cdD{ Rkss,eqwjEHE:ȱѻm,ư4-ZTAD#*H֬ys5oBMj````````QQQQ)FU4MA0 CEQk|MӼGD{GAXDDDXDQcm|bqqdge8"0W77*V 4m '''LTi H1-[:MGF(K8ζ-[SQDDDSj)f.vu;|b%-[4!bbb7wbղ4i WKjXp]wަ+/ !pi*\ݞ@JA*ȿg0;+|uQGW|SDDDEDDDDDDEJ0)""" """"""" "rm9e>Ch=t&[ qw:q?v>냆:q+k""""R<>"VjDt :ir>Og2| oZWΧc2RJWuDDDDDXDJb.ߘ5jKݽyPw(OaChw;q 7B-_(? ;;M_DҌRT'ƞ\7ϤHn3v0gk _jm&Cx+./~.窭9n  n9Cϴ ޟщd| iїGB5a&cGz$['1./ %h>ֻ̄ۧ-o|2VA~vf}ēUBu0,a&dXޏC#|sP>D#(C3eH$ϣ`FVL͗JkT?ZpJӃZ>'PeZ dcݨf3F"""8KwOP` իWWDDDn`,R>ه1ac\?AjEE}luWؽ<2g9T&`ˢE wO "/l#/? քypB{]9aF pz &O|Hoݝ9|L# vę^1W_,9q<&`FטXqq6pʏem׃JI6`fp**\4h)Bd?f,K†9<:k?ـcl{m%ߧ;֬ v,e3sc7flu[&/@]hQp_ '7JQM@w odxzo VpbagXVaMpT2&nԮ7ٙşN߾}۷/ ,YH *H$rf㗬u)/c6p?ƷNQ(Hw1uT:ǚ1͝jp%gvj3|vaSIz͛cjZJϮ4^=]+g[;jGnd8rZtF2|4lfq6nWJ0HYWғe3xʹ+7G|u S H_ēoРeȪx;dH#_pf>Ղ [R80}2o'M,seܲ7đB̪aj⑉O0,fdkn˞t,?Iw^poO:eGhW e{nq$"""R\=z0y&';zWOnn.6 4%55ꕋʲtW7<'}0M 1MnIW6kuzs>t8;;cCDDn,Y:OOLy5hJ`u[ vWADDDDJ0uZѭ|}Dz*H `Hva,jد˻X3P ZEDDDDDDXD=>""",rpusd)C_t3x3)""" "ra0Ī0"X>Vde˖-|G),NNtԑO|̶;ٶ}"/ع''BDDDXDZXZ4mvG.7|ORR"999*?Ņehf6kjbQ*`.vYx.EViаvkp'4f~v+ p?> 7YmQH Vl.Xz~>އ{;pFҝ1:FgcxUW3oG|Maç<.^&Χ xAlC?-aƦd|?=w7rsL.y8LY |nFw`2dZ3SvrI|a (L.’_lcֆz<{yf^/^Ҭ=i^Rk~vÿEꄯ⵹xy0b~I2H&3yOK.9\4ɪ%&6<=8l5(6gl~3]7{j\"9L8x6fz҇MgըGy맮t _rכR@f'xc`%\ Sϟ >ʕM C7AeyDdd$R-i8(M_]^^gn?M3E/#rkÌf/GaU|y, |8c3qMf¤Lɛӷt;XR΄ DLa~,˶/q[g.eGIM\vI)ÝzmC`ӆHRN’#\ay.Ҡ4߭g[~ ][T 73B,G-X3q*s+R.|wm棅I/|^)MX{9+Y:%eo1yOمYêBkT>@2;ᵎS{gv T<'=2irP&rojLƳۧ p{k㩥&^5rVJhn_Odt oH#$N`:o7go;;t$Dw KV)on5i-"""[ogyL<==pvvb_y5hJ`u4XD~rowGuqXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDovdŒ%++CyH߁hּ "rQ H1}6&ODxX¯H1AxX'Nbm*\ +-SDDDZDEJ8ADDDEDXTDDDZDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXD FOeї+ذvBTB*HɑԔ!7Wkg<6g *Hc8{d7"TK H WH7U `ĝ-R;IRT."%&/Ow >|AE?j)s/08l&oEDDDDDX1$!|?WQ)v;ـi""""" "%A_OCDDDDDX*dzp+7EDDDD-R8ُ䡻YX *HI -60BDDDD2-"Œy zT}aN|]eMb'oPq̦QvSaʂ))?L_V޵[]o`$WV2/YL_pR6};J9f8+3a< RvUJEdV{;0x^\cۧx gٵs~\y?"R'F9Ш5<2C%WDDDDXDn@q:^xBymP 3/'Oe85m:U-x6iG:xΟˇ_Ƒc !ӇxMOYIhq&s`,OD85{#230ضdQcu:U_8ʆz?/ۿe_.Q_cntb&ql6`?o\&KfITaـO9cG.*EwWQ.x[0xQz:=̊`ctǐY ;_M ۛp$CO?]vrl?deY"i#]YDDD䆢 ȯppx1rt}.jٚaV $v(7;B݋..Fyח~:sSKnϑX2kWBנR`xPuy+dO|ђCocJKĭT6,"""rQ V2jՓGvjyiEEl:=at v<۳ohOO9g7*<%ΓM݋!t0BsObư|jZ?ܕC،Q;9&""""ѣ39@xkOu~>go;;t$D`P*Bq"`д<to$""׿/VPo3w*NIM6kvStj=3o&吻8H=\ED~HT.%"""""" ""',rb\"""""Œ@ߒԔ!7Wkg<6g *(Hc8{d7"T)ZDlFbL&TnYrIH."8\nbtT),"sA>{&-3䭢<$g=ƒ """","%n'0= CDDDDErr8|+rTbvxb<⦢H@d?Βf]`*Fg("""","%hT)ZDDDDDDnjbr㗎g?*[m;,@ Tm""""őZE6CL;dWIy՘|أ<*JXDDDDXDwNHi]1\w[ohbR:""""Ŕ@uĊ_45H 82<[0G?CQl.~w&TQ,Nk"""" ""?͕%;_j{nTǚ/3ѵ5h7ؘD1k ;XWHu\X̳ى *wOe^R<mVvnAyu'LܲУ;To c`cVAuȿ'OLlSgȡ e=7)i³~GG:ۏ1~TEDDDJ,]KD߉9f+jH&8Z>ARr3tWӟ_; hҨ H-"RXDqaҪFĖ':#=ܛcǒ'z]k@69+s[}ÉR<[0}N`L-"R츝̇[.Gc:S J'~Gkjɝ|0qFx_3_uIԌ>:=rTP,"ŐA&95Sfsǰ_81FF\L%""","R88h2-u&V%Q)FvVeQ)L;>Xi """"{>7s^]KDHj6fj*ȿB_`c{-Kmp~a_ߗ~aT pdZrDDDDJ#WXD*]w=ˣT bhĵp^= JcI@ؓYV.Dӊ2-_!ۛdxk?gUT9'_uʏ,pI`5LY4#]k\y*U̇]/N1)8vrQ]2?͕%:""""א\7 3oP4 `bM0\:Ïkczdxk?\ANNxEIy?,]wk8|,]MO;RFV@}yv dlro.|Of_Nȵ1"R"Xs2wT觘2._<݅JHB_h'n5=f3 :O&X0877WUA7S=xƼ̛Sm7"[r?Ja _IEIDATDDD_ Ju-V{D8MY8EIA6jL߲D#{U+ԟjA 7:ّYݖ=bTM죁ۡ;.]qgsT )ThѲt^L_ojXJL_UEDDDDDDJ\-](H.]*|MQ%1_IENDB`fastapi-0.110.3/docs/en/docs/img/index/index-02-redoc-simple.png000066400000000000000000002055641461403617600241110ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwxBBU: "v=9~vTTTEQPD ;$$l-@Hts_W.;3}-c ƍs """"""r~3p*VtB\pسq8,Y`#99ĜpDDDDDDf2` ?ÇT%$$HՐ%pt˥lьdc01yψ^p6(bbN$"""""r s: MPZeZnJJ d~?c嶟HRSSINNl6܇3o ۞n""""""Z$::L f͚Z8~,SUXPY~|||pp:8vNy3 Lf&cu E& t|;8rr{1[,Y&GEDDDDDd;w}7#F ;zgaԩO-Frɜ~.s>P^*5BJ\+rsO!""""e*"nn+4[,3ïb)V{x`hd1-3l <{^rWS]Ίb&3njyz^}.l \_DDDDʌawޢM]oΝ򫥚"9Ԙ`OeVkuP0{j}[EDDDVvYBj*;p "C/\8Gh4 L%vˢpVrg敗_-r2 ̞=炓\͞=t_9{W&ƺ{"n5V`R8v8AjQf2-l)))ԬYSQS B'[m/Btգt豸p?DDDDʙh(}9T\\{?_lצd?F|%8&[# }Є ݁g'ȌjH^dfXeĺyWσz3lx4pO<(a^qoҰ|r7N)tC/G-<`74,й%{j+.ݍ־][m_K%YDDDD/}w2yylsٿ^}WN߬1DMٲ;u]{q+:c K&}xvX/XDYTZ̘^nAqkNb'xX,3}<OnA;Fv+Ӎo"⻧xwAn׫!MiMcPrO#_#7YHrL٠+"""" ØÁ]{ox;?>?*1qnrrSA? eİ<~X)_F椲d`[itߛ"1{^4)3SKY:5w۶yݡ]V_kZ~'V Sp߀Fs Y7,fڽ-9e3Rvupֆ1kqtt,:wgg!(a 8+(CS۸edF`v }9瞂\Gg2n! aݛ ~isB2xD`WuD\?/}d۲~B(_""8j shaq9ZU6@Nݹ*Q~0eaTqv_gcGOz}*g:oߛn;3[Ty{W'w;y}ozr}lJVs9x>h٥u Vܫ7>̃3 nn~nzd |⡎.6+{.<3}q݇>֪d޶(]uФY7i֤|&Qyvh^7W lH M4F.K>?mN -_}o/˰D,}7u& |K yl^Կ ޛ7UNbB/x;#EH}>g?Vsđ#-6xMzB4l=RG:e=ۍdF_bb޳38<v15|_ۢ"\ N/$X"""""3]9i*UJZXG%YGDJ&9>5z,P`KE:\H(8_5BZvE.r """"rU""""""|QyYrVkT+pYS믈\.d2D.cź:+fjLrŽOa¯\n`YKr (ykEDDDD.Ѥ1"o2Y g38 """"r`ŌS%rp\~.=SM\A|}qsPEU@3``6c2ahg+р'f,Nӥ'VD?3f+Tr||5\EDDDDDDXDDDDDDDXDDDDDD2o3:q:pri_`0`dd4a4}RXJrp:ɱ%݅ ݉; X&L&3A,Ea;pq,\.0SDDDDp \D].rr8r-&Lfŵ6+-:d{+""""W&.V?J'Nsrpz#\vYYWAWDDDD|qfegaw(+K.lb򷁜lNSVʽSy>d6=rzjf:lY ٧7#I&4_LHh(BB={)9n,c)ïl[>""""" 7ۢ[9YXʼo$-=c0޵+>>_pio@/IZf<<=qm ;vůRw@tM|Z4on-uv8iҸ 5 44!}RRR2Ѩ-|(e9jҬSM7mMwEDDDJCǎ\.֯_Wg'b6m|wT  9) JHHH|縱;?Ĵʭ Dt4?Eg̼^nӫ'~~/:v@u̜5 o/o7}ۭޟLq 蝘2e*cNzfsÜ?搞13uTt颿T 6{_C}`Gͨ""""ewӧTe*Ǜ6jؐ*yT㝿?-6xp .}K py'&>!}223Xn=vV-><3L|Ϸ<.>oBڵڵkp9zⵗ_aLba-\y?|mVZU#` ?؎[OIA-h)(;O)iq?Kf6:w O- -~OQ)+KOVqP.r=kҺOo:C:aYl+QٹL۟ލgg9K׆q. rmaiEDDDӸQcV@Æ 9x` r~7ѣjb.S;{TX͙7qc2g/WZDjU/[!x𡸹b'/Yϕ*3ϲw^}^nOXa}9&~ ?,;$19h;ޒSÆ0uڴ"n!`Rߟ-[2cO nm4#)9RHMM%-=hݛˠ ?w>ڵwL6+}*|*T d/3.2WϞy}OOvʊ+d5vm8t(MwStկ[ڽ'$֍b]tֽ8F ѝ{TL%8Ξ ֘-Ćmh=y^- iUH{ֽ92r9RK1Ҩa0aI*bv`̪At$:db G"IkYFB}K<2=}Oј8v%2Tfp|`Xrd #R-ua]> %Iqs=l+;#oV*z6v9>҃FJ*-^'R]y:W?(ժf̬,SS9x [md4ҹKv뎟%7h0IJN*gQ#1l8nnEآ }eߙL32ʭ*r2 Ḹ6r*S7d Ɗ{墨gP'(͛7x.g =Ȱa]tzɓGX~S=3֐Z >UJ'5ttO'В!2D^%K>WlM70& w8fy 4t4diP6jwN;Ovc:'o4`h}#asX6pyux1߻!] _Ua2i\؇cKg*$7rGW:^ϯq O.."""W$>d>ukf_pg8S<~HD_E +--Sg/;s*?K ի/;=펇'_M \w]{iVXɒ)V78r.C%<>_G9 r;o/y٭S EPu[߬hBF]JAᐤ y?]IҶC$cL@xGϼ: 2+W)]'lܾ)}O(Fr4Í6Ad: .Zeddgr߽~xy{2s/yh4r-ҥKWBߖ u:A-32wkT'9 V6USK@>dU/ᷬ'ZOn5j;f4:vU{hiP~oP>QefuSיY`t. hgf١ yO+*Tr%d+alBįL٘L޽hd4`J'Z{=pe*r4L"$܁e=3qa8w\'7_gt銛twcJ.]ٳg_UoY^ Q>nѧWe}z1x|֨Q!u?үro-|)`Or I-=z0xРsײysn?6)~(~_V-[X=F@Zlʮ_~/ǑyJuSag?ȮG-_ U3M:Bt"L'FK_;IIgb<uTn]·?Vs|S3Ĩ>زl&(6,1q>δPvw't<ē}4>s}~h}I>92{{oe==}wE@*x{zѪeK}!>x]L&3HbRgy p:{d0xq:l!8 uynx[RG M6iӦ4_NCLRk .➺Rgx, F lwx {6掶x$hFm{v~TՈ~]S)94'F{%Q7KVqsKbn#@ iUכa `M9ڰ B֍SA ҼGn.$ާ׫U7g, MjL` IDAT;AI%}?k2=RV6m@5Y =È#ygyg>|$'_^ɾA pGFcݭVBr( 9.>*RWw˲%q׸;}_*TGT d.ʇ{{xk=eŪزx=6F:iLV][LFz(!)}k/‡|AX|_#>B&My󝷋 i@x}/Ў;> Ovq;f7^uxw!+Y) ^uQYY> L≍-YCm|Zscs[hā8 =qm v7LOp dWfeOeaK#-2,M{Lk{sjO?cL"""rurQV-jժngҥ&zltfu#+;M>p}zZz$/_ЧOٌ5eWTH}U$Xr.J٦SNNM(^={bX=ۛÇѤIԯd]lڴWSKeٲ5%z.]xguk =0zӻGORRٰaz]≠|*T""""M'$4 ">M9o!#3wx'#G^zY+WVH}cO7 SXʟn'חÆѤq5n @hHB96*:56{a(U%K׮kBjO//6neZ-Lf*X5x0b0Uỳ4MPh*CDDDss1 eDxX-dee"u͢J(#FUFX-0DDDDD. Ŋئ,fkE^tEݽ&I;pssXop,""""W`Ņ"ۈ777&߲1W р݊a'(;W.Q)O *ˮbd4a0蛶1`6[0-8NNN.\,""""rI|g7 &F#&:*KMF&#h,@DDDDDDEDDDDDDEDDDDDD.RU+""""""r[VDE3ŕRm;vwu((((?*~EDDDDD ]XDDDDDD[lVb!%޶pDDf"22 ЧO5kwODDDDDD*D͛7/ƍ1c駟ݽe3b9I :u_ٳj͕Į3YDoK$>;v_|^|E:t@tt4 .$&&O>%G;3NûPٞPilF#"ɍ $\xڴideeҠA|}}y׉g̈́\,'6Ii ^OkdUkF/CdrʵhrF+t݋G`!{8j 7 ;f$kܝ#dm+߰bQݫ۹u>U""""""elE^m۶^A&11Q`Y\\,>>EouԽvV,2c.׀>)y73n߁^=?09 lS';g.ɉÖIZZGm?+Oqվ +w~J:p*Ѻe=NϿi׀`KQwԉ{b0䎗_0Nkmn|^/dɞ]xK wuevfvï zByÍh'\f3V  K",ESͭ9iO;n)j=28 5&XDDDDD Ga…㏬]s 6n܈nn~ZjUYkn}ىXƥv=MVl?GRp{cgV {x2H# h}] hU5ϔ>Ll$E]@b8p+"aY3<ömhذ!ӦM+v9d:Lxb-d=%tojeH%g[_s2R4a'F*E """"UrJneIԱcש.bZ㏙4i/sO_ +""""""r1_2b6raTHE+Y###U"f͚\DDDDDD.-"""""" """"""" """"""" """"""" """"""" """"""" """"""" ""r%`N]y"6#87]DDU"rs`bmS'V 4h4ivK.bApxOb2h\>\`G_rEDDED.,+{~+6/>֍;niuo`?Gi\ߟ9ߏ* ǀ }ds̰MXxx\Q>j#!a ojxv6sO4=g׫xbbv3-k$gB ׈AevujEDDED}w/ҺZ^LJGkh ǵ+r'BX1k;.uedds<*[#c/uҚM˧{\#Vͫf5qP ks =ܭux^>^ɋo.c0<͌܌ɰٱ;rߓ{2gt~i?`›"Q)OO+m{`04 ?ۃ_͔;/Tvw1%.\'+IթT`eaz=4o\%/?Sϝ|} )pΧXz:zvl7gO۹u c7GڷOo.96o<0=3&~wk^|s9?KOv/z;ua,%TBZSD/Xͪc # O\Z!a $fѵCVvjWQPSa8"?IDDDJFU "W33|tdȀy=cȽqi|< wwjw:`j-;\L/3 noٍR=')Vft8\,-8-Ajz6U0V]3ʥsXww7Sϝg_2YG)Gj+fg\k ۸y|C#>z#>cy.9/;tƍj5xZїǾ2qz}yZ)Y@޳%&>[\.LeulR Iq/6܉O$1F7SKYDDDXD!*-W]y&? _UZL$%g{]g O_+ӭcPԟw`42_MO[[^\a1xNevixyY ,;ղnw8\^#b.ħpyS|boOKz4g3qpnϬz4OeDe?w{k$kG"Y2CIIyV۝8ڳknڜVmZTEjnS.%c8@^9ɕa75v1q&}U,;"SX1bpw3}iլjAZ`٩ҳo@OrVRyǔRcJb2Sd/4`:{[{b3."W ĵ߁;pN-Vm=kf~ ИKi{$-cC'Üۆ:K2c;8k|򙬖}Oy#5;繤gg{֡͹gt[j鹜j-El6R1idf $ cj/'>>Tm$&ۨYݧ?uFyNýp囒CYNͨϢE@uj턛쮹n9hӢzęYBųi[$w?m'>[/*φ-m"msX2+ֆӷG97ww Ԩ]nɖ̜BwĂlIϮu[V\B%\ۏ>rV"ŐO!]ϴas$q&dg #"""x.:g~';-*Wi@׫!||Ƹm U4R!O3 u~:{]Z=,%*JmGˊFicK>8'8²;z̝,7xrQ[fӏH, 7'MacYxvLkshƽ}Ȍˎ?gq-JA4<{' _tR\<6[npw;p#ز/z[QݛLRҲƍZA8-=Du"vM_ lR ml'h۲%>{jv]׳MrQV;Bu/+nmU|6Yoo><Inuީ3]W쮋RDD]FY[χЃ4z.dcV&Ide"(q5R61:6ec eMl$V'jаM0 .Ɯ3m] !<` e_!'יd[ܳؼe"!|-,fC%doNN޹Q3=y"f*/X 8h6Kbxo#sp-|}}޴ ޑ?89쿷;^+}KV.&xV$juܙg݋Q+ސx7~U~F>bM"9G@|A%_wL xKƕ;օ0s';om]FN_J|T BL^{^[%z6oaC ? [+:VcI祷V˜Czj=INsoL_wVn53=9`XnTꥋRDD]R]s<0mԉ]`9H1h#: Hq8|ѡZ.lx񩪙O⸮g0]ņ-:n4F5/RӲٺ3Wfoh 6mb.Z5NTu'--wq,o3_1`|9m ÐZM7As-nLIqcMu}{TÇek H&%^4iX5l+Z7+yLMZ̈́ų@/>֍[4Ϸmrj`M*w3}Gk;8yC׳Ui-S639i^ٲٹ7ѩxY4kTL;ǣSu ]"""WzvďrKAdS٘C-:ʹlOg='do[Xolg_0ewSxQÝ'x~Q{fH7*yݥwtgpl' d2npEẢصN;<:e8|{0fw$6M}V`g'z1/w;0n8+QFXGl9CNջQ>=,71wa)Q7]-h72̞O7oY&^ ׍)v0iKW< IDATϥ!luWux`\{-x衻r1c @sP˜=d<0UfC>\Қw>]Ǵ_vz^RE&pީg*_۹6NɗSbm8 1\)hOBD{{Zi޸ Bضx㜯iSgᆪ6&3 CM)RE)Kxi R E ,˧4RE N N&Gd $(u׺9u}fF޳˙(-0?ԃT{qb~?#T>p|#/"""x3ǣtߓ8zV~`Ǿ7y&vV1g~kX߈}҉6U_+m:Q'2;Grf& IN/DOxY 4TKi1ZUk1OKwNyTv=`pr.x CNF=ZަMo>RJll_5fg%Gy/l$j?k2wMRS-(gҪ=hM2i^ȝ(-͂"^7i4x-q x;r?|OtP|eI`L#r_|Bucl+Ϳ Nxnù!O `hܠ׆y5h(4̭lm U/flF;Wx4!% q/RW91n)OB_{=2ÿo\'CPY3AAT(涯2.w@Ώ4t2s;~H[Zq幑<[v6p ("yi^s[LQ19LN m]or{8Sy;/Rg[gW69{+sላS:gH~.?D_˯Ug+gB6\3nt$:E̕l_WgQ6\ń#3μ5o{6:c-3?o\C5ztb%>p!n,oOxy:p!"b׫[5\L?qgdt5tEDDwL=4CI kz fO0U>{GI 6gg23m5lT f?zzٖ}M>&7ۻ>o3'eړ$||ԴWC.p.CFѹF>>OD޶4R|o>YmsQaSM1Iܝ0deQ1?B [n F10dfb*ߎ^Z^T| * x|wX,mƈ#xiܸ1YYYy ,,J*^v-={˃zbb"={dΜ9-[?&9dgrdepx<2v88$"" ""w'ŊXbTRggg>/^8֭[GRRժUSNq17oneVm۶8::Oqvv&""uff35"44вm߾H<<>>uYYY_ӧOH˖-qqqc4jԨs2c |M6m C=ȑ# 穧BTTwwwoߎaaaۏڵkX,ԩSp[+Wr̲e6ЩslqQ1x{:ӺyY|b1@^DD`0@ʁ3IDmXYo&Tb.g %=i>LƂ9 9}.}j*222y{xW9qk׮W^?~ܾ~Ș1cHIIaѢEۻϙ3g}K.qwNTT=4O<Ƒ#GҥKcgq ٓ%Kʧ~aȑfGn8u 8qhbcc?~KZZc٤1k,ou{#t=q3gμcԋzвi~x¾72|$%)yb>'N~Wt]0f>WbϹu]<7d5_t>WhSҳ1`1_Kjj&Dc3N}}lF;cy~NMfL7C,"8w+Vdر4lؐz .]УGڶmK*U(Z({Alܸ@6nH:uسg-[ .`Xx7T6G}M6O)Î;Xjͣdɒ[|&MĩS 7ɉ޽{ӢE Kڵ7o|8::Bǎ X1@"E2e FDtŠ+ܹ3ƍUV+TTO?-Z8Sh޼9aZlY`V+cժU5""g2gF#:t&..mQ?~<_3j(ʕ+Y`dggӭ[7VZEÆ 裏_>| SLaĉWi21x`lBXX]tWoooo&Oh'CDEEQ\9RRR)WcժU 8ҥK|rS`o,[0<̝;>}z_ p_~'111TPqiJ&"2_we,ՍR%zd+S&åX PiJff6[ywb?v"LjV dԄ-Y{dGqr2is`=t\v<3x%^O%aMx}|ld2[yG&Mݰ===` 1 yfh4?̡CdTT˗111ٵ4hOnZ~hРܮtԉݻ^ȑ#iݺ5<ӧO7@˖-={6[nߟ~ښѣGz=$''m݄LJ///5jg…^h~A-Zػ<вeKvnK`` $$$ٝf쟷Pj=tn_WVbhp)d37GӸ^iRS3y)Z5+c4{Srr ORӳXy6lqa]kQm;iUT J(Aff&ynnnʵCn/#GвeK8nEFFFω;SΜK1ݜMQoݙlkI)f=(Rγns4=:W&-u-J>|9\ZzF6E];r9D/ q(ɾ]j7!&"]&"w*Xh~~~TT шє)SY&u᭷b4i?@tt4jպ2/^3Ç9y$lݺ]v#0yd*UDPP|;7e˖ѢE|bf3 .,k]L2SRD {镙駟 ٳ,^]мys&O̜9s޽;|'QF BCC?^yf3Fx۵kǸqh߾=eʔa֭ 2 ?iӦl߾۷=|4sΌ1-[RZ5"""Xf FEEEV)!ɌٜcqbB}Ҿbn](c΢HwB4*_R<4oԨU2up?^Kr/^r'\2yƅ???F_|AVVڵEnݺ57nk׮F(V.\;wҿL&k3z= 2 L&mڴϒ|/O"##~QJDC>,ǏK.c4yn:vڵ[׺uk>s,Fǎ9~8ݻw /@ҥ9s &7GD֭ۢ>vX}{K{:uPFwyf͚a٨W/me˖={z Ʉ3G҆obZT^b|H*>hWHկ_zш`g+5e|||YY94h?G /چ51r1&>r;:)ϋ>TY-Ow'5 / k\/_t+Ex LFԡYҹߕ뫨k\?w!wFoK#P4<=i SgC+"r0m֖e}$QT+"p[ RSSo ''˗/eoVrr2&Vd zSHdIWL4cǎ1i$1L7++<fMf3IIIg޲e Ce˖-dddQ焄 +cou{llluh6 #~Ell [,+pXVnٯ+6 6.Ŧ錫b=tx.aFl|:n[WםJ}b뇗H5UАRj[y7[=ɔe07|Oqqqw{.k(ZhlV7+ gb[O=pp0xo4h4{4͡D"EPp7puutҺ"""rCjի={m>""""Q (((('l̵n۶-߲5,Щi3OOOl6Ŋm۶w;&eX8rUTvBll,ӦMcȐ!YA{%WA֭:Zp!uͳlӦM4n,Y`nng,R۷dɒt2ٍ3&:uШQ#}EDDDD VaÆaو䫯⥗^㮯/^|| =JHH~~~ifNʶm"''%K={9s&#F(tl4lHX椦1wiӦ""@_DDD2 TZC}vš7ԩS,Zl<==֭>>>XV-ZpppYfԪU IDAT&MJRRӧO_fӦMDGGHbb"j&ۚMTd$999<)S4ϟGll,t֍@fΜ'INNcǎ1{l4h`͚5XVիয়~"33ŋqF̞=^x/СF֭Kƍ=z4UTȑXVz) ?T™3g[oqpp $$N:ٳy4i:ttl޼l4i²e?p@F6mPjU6m9s ۷| U|| Z^???^uˢEZ~}ݗo?Jjj ^%JRh퍣# Svv6f͢[n 22e """"r3'?w&2eCd, Ǐv xquu+`OOOʖ- @@@ӳF` ӜytpphVT]vO~8|0v"44 E#33qsu䔧 maeuµecaue6ooVVnwk=~8[lwoܷZOi7!!""""r%%'{ފ5jPVАRw^ƍ͛ٲe ݻw+?ÇG7KDDDDtqTbK^(^>"""""ro`kG8 DDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDED֮]͛U""""wIU "vwfǎ;::C)S̿Z^~e駟niɓ'S\95kϟgƍ8qłժU^z8:: !""" "rZr%o Y&ƍiӦԵ?<l&66k=~8/+Vfa0 %%___ +hl;w///E 3:DVVDGG7ߐFXXsOի)Y$=q=-`ƍݻ `ݺu4i҄_nݺ%LJJdɒL0A_.{ZEa41L&J.M޽yGiذ!E%~WzAŊYhʕ˳Ņf͚ѬY3.\H@@*MDDDEݝ{?SOfΝ,[gRhQ֭Kǎ WٴigϞ\rt5_@޽{Yd O͍ZjѥKun߾o'O'pBBCCyWloZYb[l+V6mРA?fׯOf9rGGGjԨAoi&VZŅ QFt(gff͊+(Q Go̙3̛7GH*U޽;Eo[obrO81σPhϨY&Gͳ<))N:QV-Νŋ_쭎{ɳ P-Z`֬Y>}}1j(*Uė_~Yڵ+5jO?ܹgyJ*m۶?} DFFr)NSNqA B%3g}[Bdd$ҥK:$''G_&)=L<-999tܙݻw|rڵkg_wizAf͈tDGGSR%-ZDj۟?]sѨQ#|ټy3|  Dx ڷod"((_c֭iݺ5K,SNL8&M.&&&M@TT+V۲e ݺu]vlٲ%_ YnsΥSNK.'{p"""^:o0hР[rJy'Խ9r$#G?__Sjj*:O<tЁ 6l@bb"EO>;,"k֬J*egfL>=O(UK.ݝۗӇe˖ Ŋcԩ``ٲey/@ ?>vbʔ)={,_}U СCNTT[neŊ cGA۶mHJJi9>Lҥ<]ь5^x_=O?u<3dgg""","o>x *T'~7TX1_חt[ l+V>+Vȑ#1 w.f3ϧGM hܸ13fȷߟ{ڷo@˖- }rZ.7+sof<y}XV V>Çs֮]/=L]E/m;;;~g͛/=W8p >B{ , Ǐ#6DEEg\fw<׿OKdɒwN:EZZ.]ugggsC~aATRTT^&99e7vFco鿶o /++ ҦM}DDDEDn{.t6lEͳ<--xlrck^###i۶-4hЀO~08q V^oYɒ%>}=©Stk׮ :ݻw?fL6_``ɒ%z}=#((%JDzx2e K,ɷOt,vAǎ |۶m˶m R|ł 쭳ۂ^GzoIjժEݙ>}:CС&&3u(""" ""wӴiS4h^^^<\t@;|ppttۛCx#G8ˋ=zp|K/_rŋȑ#9x  ŋ1b-uS&OLʕy'3fL=..V06l?Ν; /dǎyyyyYhȿ=3gRzuz͏?h)88 ҹsg~Kڵ1L8psѦM6l/ȻK߾}yꩧL6]vٻ_TR̝;]RjUO5bӦM̘1޽{䚫VJrxqrrXb\^xrѲeK&Lk/B>}X"l߾iӦK/?z<<<شi}eĈL4+K\\۶mcŘfFgyhݺ5գ{hoooΜ9 ظq#cǎvyر#sޣN:DDDZ,""","+Q'OGeku7&"">3f0vXi׮o*To;PdIƎˌ3ӓ.]uV5kV`ڴiΝ;=z4&M"%%}/g}F߾}iР_rNNN,^p~irrrR zoK/QNƍǻKzz:;^y :q,Yš5k>}:f"..ξbŊ< 4|+V۷3c [l64jԈ5kвe|M8,Fb! C۶mmYVѿ2*rjEDEiiidffsm333IMMᛐ_0f0#NRR>>>8;;־ž^Muj%99y ""_𲈈[ާFԪUǾ,4ZED~K,pvvun5`J࿛urrFQWDDIDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDD䶙T"ovErl6xyygʅK`4'ÜY1==qvqXpYaFDc 憷!v1.遛kHo/'=#,OMM#19?w1a|۸hr$19qqvק lδo0;^yfqb ix{z`'\]\qqv&''DJ(AaĩSY3mZ4lH(G܅5!''G<=ZEdJ|%mDO+ˎ]{x2^IJN͍a ii,\UDzkqwsٙ,y&|>s[ dI} h@ޒmkjXh߾"DEIjb^w/Yzꐘ r IDAT0ioӖm*سOGzӫeh:g@IRF4^՜cٸEF96˱l^UQ]q^w+KF2Һh՚jhhThhoo֬Ӧ[lnVUM27AeeQ2LJOIUnwꖡ̕fWPU[sw{f7]_bC8 .]R.Iռ zU]W`e_񱱺˕i>YX&YVLnf@cPlt 2*!>NFQťS]}6oݦf[5*_Ą6f*طO/]v!AJLhyTpP gsv[z6omyTppwއBdjbU\_vC=2mߑ`ܵ[RKoݻ5l`Y,-_n[aaj;w*-Q##w"S>888He=3C!!~Xv1l {+d4Tc4^ٵ}b37/_q1UeUjs xDGE~[t%'%^c@<*UYUبh㍉R4_ #_1QQ%b6kמ=#3C۶o1u{>v16lެ 7-K[3 2}񥲺ehsl*λX,r6;E{?(Cvv՞I-h$I vf+8(gں:IRNNNӧ$ie)4L&B{0? C|5=> |YLh0` @ @ 0`  @ 0`0[oM}}YK/ @9Ny^Iʕ+x^9cijj @M7ݤTIfXV=Z\L8ӽWa6I&IӧOWYYnfYV$YFjkkS*==]?X;wWSSo]K.{ァFedd;Pttqt-h̙st:'rpb/á=zgՍ7ިW^yŷ~ݺu/JJJΝ;Sǎp8`]}zcnSbbOgyu*,,̙3}v=ҦM4}t|͜NNBCCO\.555),,0NЫ7JJJ$iԩ={LDDN**ժS*77W>e65em۶M.BΜ9s#(**JԫW/]{\ShrݧU5k*++vgϞNFuutRv曪h.pz~۷O/CClnnRIJJJ`}VTTڵk[f4EDDQpp nSr飏>ɓ{̲P߾}:/\PYYYԩꫯ{QDDď^ǂ-ZH{WUUF3f{=M:@ciSt+--eL&Se \.!q `4u=lqq~\YYS*33@RPPp8(׫I&'?빝7oFSs=W=.FUVV^b"^WO?nEGGk֬YƍUYYT]yO|C؟z)s=2 Zjkneeeiر2x<ϴqFYVGyyyݻwO?Umm4qDiZzUXXx7nTzzG'TǙ3g*%%EVZZ;<}ᇪPbbJ=jϞ=Uhh_]0 ?٬I&Whhz!6m,Կ]tE?J~=sk&ѨoQf₝\[[\WWM6뮓+-[(;;[u]'M6iվZbFk*77W7tVR˰w}W&MRrr-Zsjʔ)r:ڽ{."=U} us9:թwYf-[/9|y<}jhh;C'''믿T8W IҌ3>tMe4}ØǏp( oo=O#00Pou9sH^{5ݻN:iʔ)uYÇs #Fر8 ,$k׮Հ$I߿VZ#Fh˖-2d$IC ]uYjnn3tJ5t#֭OR>:|Ij׮bbb$IݺuӖ-[nGկ~(++K5552aaajjjRss, 7 ?Q^1xJ?eʔP`9⺚-[̯G3$$DT__!555ڽ{}Y[u9Gs:~hHzy2r0P 4H}9ƣn.պ=Q˥3fn=Ա-JJJ~iܸqGf_Nf̘oYQQQL#ȶ:8ge)0Lhl,sssW_sΑQF߉R٬l-Xc[o^Oh_/^~?0DhzG#`8"d<SKŠݻ{?ȾxZEddƏMQE8@VUKM_.oI7*? oaqK:hY([Y%9-81AԖMR]r Ir8)ײXV~H=-*_.ǃ1:J@%>{)6Fޚ:9 BdXp/'Ӑj^HGk=a9_*wkJy 0u\V*yJd>T[~!׼r}@Ƭ yw|޹2_w$|ti\<0Hɘ&o$9~WYZsI<;d|,3dh̗fKŲ6/wRlUл3@yO3$yGV9z_A3B[/o 2efȵ{57*?:vi>i0)0師"p+VKA\|/JRW˞@62 ρ ">&RInwKANǡj o sX5XdH$!&Z%}gnɵ8ޯz4yWo[exM s曾-r/l.rMKHS(m:i07l!6wlom ё2*׼Rx|~& xptwRΧۥPVZ5UǞiRH adp!>]7U0bd=M5D)w$Ufzui@).V#!<\^M_wr;Vvv՞I-h$x-=#nYo6ge1T!8lcmtH\pƪkRmiF6p`߲@ G L8ֶ_6#RR"i0ٌ;?h0` prx0yq42u`%I @ 0`` @ a ^JQQs\_~@q2LU2WeUlvG&@oYpUaa2LjTU] 2=nZ q2}644902T]S+I[~x=MF)$8UnJ[Y*АVUUרfS a2)**үMg0H[AX,GmoUMjj=YfOޤPD]8j,v>\n|_X\I1lV۠(,4oc/&>\d0dr?׹C)kWv֬SEUx Պkv9N?r:u+ɢ2te~v***ۣjuNNօF{/Ѹ GKz}v1#‚N& }xAV4t@}vݷکʪj%ǷP1!1չԿooMzTXR8546fcMN_._ .8[fsK9y?]SS5lȠ&I${,IڜZ24oY]d2Nve㳏xȈ]q[_|'_+٬er6;q{T~Bq1GgͦwӖyꕕ+=_ڞ/Khޢ"544U}_AVkڴɦ9|#{6 ՗]M[i5Zd2ehBAVy<@l-r:۴#>O2Lڴe!1ѷ`0ԯ1c1[R@:77//_AAAڼu$)48Xy~8!6N33dw8e׻ťS]}6oݦf[5*_7$([sǎڶ=O,ݪ?ඈNM, [r}k-Y\cFǍNCbbe4Uo2EF+ %wlv'SjyO4l`ؽk==^hժ̮]ٵR;uں:)];UVUZaaTTRBCձC*=5U+WW\LjkjUYU:(s2DPX֦6n򛣜AioQ7= 8;X,ꕕe+V[5rԧgOIbVRZ7XK|/" S |c%rܬ .ifS`@5Wsu999mަO΃tNd2)$8X!j%*,) d6 R`2p PΝi`x ֒QÇ/kI @ 0`` @ 0`0` @ ӘTCCq˹\.`ᔔ fRee_ݹsrssnכoj.`NҥKU[[{ .TVV:u$I***SO=EiժUzW_IBCC5f{\0c h+V(%%EG\מcVVV*//Ow$Yg֐!C4|pIRYY^~eo^]tQZZ>S*33  n̙3j*F >\*--ɓiг@^^>3+>>^&Lhԛo)áٳgkqy IDATذaٳ^z%C֭Ӎ7ިe˖)##C{֢EzUQQ={(&&FW^y$I999Zd\.맼<]{ƍ.v~~< +^ziҥ$o߾!-@ww}X,z饗+(66V''' Z۸qnN**ɤ'j4Y`0Hz5rHM4IA$,fرJLLW^С I֭[եKuUV7HjkkҭVkrVUN9,,LMMMjnn @8W|G.r,`Xtu/Ԃ ѣGpx|;""M۹\.V|p%i=%KZ^\\L8K477+!!Ar/_W_}U}$I-Kh8|ħ`2z~4c mذA3gz*`CX, QFF~_xbߟ ?Si8 %$$8eBCCu5h*((P=nݺ^8bz5j NLnhr:tP\i`!0` @ @ Ӆ&N#*S'O_!0` @ @ 0` @ @ 0`` @ 0`0` @ @ 0` @ @ 0ߟ&p:{{z|gvJ+P -+NgeuvuA=23U^Wo~_]y-YJ#@=FuTWMY<9\F# (}^pޞ)%9Yx/ժor4o]6![ŷբ%Kb5lJK/Ta2Γd֠sUT\ ԱC\n%Zzlv2ʉ+<^Fk֭ׯoI/L+׮UHH.1B?ݡ?X[sl6O8~f_R͞;OJ&d+#-ͯLYp+TTD;w  Ht8cL-_qfSK0lnnFat~;V?<~vܥZ=+{ڱk̇ ~1EkoPzwu) ußSUz慗t_hמ=rk֭f[GϾkj_ܧ~+WW_˯Q*{^ѿnU+|7pd}`l&-"]qM}e6j9n׊kt]O{pF*.-Ղ+9)I%IX<9]{$iނOGsiUWhӶ\}hW)voԳ/Գw*?uo֮wޭGxRo$鹗gjuz⑇u$Ir?>ޘWĄ׳2MӸ+ӄc$I}vݫ)Izw<=5T]Szfe酧+jUcc~1vo鋏b6fj9]h^Oh4+ZgTDx$}bFd4xΜ5l _Ͽ\W]:IݵKoCWfD_ѣɢŪVX07# ~%)3=]SFϾ6mULߺoo(sDxz讍[ߡ\=VաCKdbi)j$kC}TnS޽TSW+$`0*6: h㖭 6(bwR|\$iY*TV~@lVQiiK_z3ӗ_-׈ssh`>mGYdb-*VtdjԫGV%Iڞ/xew8|x6w0;dF3o풤fw-?PU%I*))U޽4u teWꂑ#4l :՜c3s{[[vMohІM}$<_ϬnY_z?]0l]wm*)zInlvIRxXVB-hvyvAmjjj'Q\%I 2 jhh;Oɤ󆝣HI#룷e㳵i640rdrd565?^KκɊ"#"N$/ӟݳ_4`g5P~y {s$I1JKIѧz;vfo}z8UUWKL&\.ڽwvMM6_һŊU|\"#"33S.^Fmߟ,pBvMԤ[>o$_w۶\IREe^8Nx9ĄxM IҞ={NW\2A:oC55i|Wږߙkn^{C4f(>߬Ѷ<ږCC;FeufClyH{ u덿hQ7NSK^567Y+׬մ[oV: [=h-=!I:`L޽/[iŚ{uӯRm]b=+So;[mӊo_/͔lQ80d2_ߦ;kwh9COд믾׋گWO鱧w-W_:7Tx%&iwrl6IWW]+3__tuս-C#{M]{u ѫoFFD*d2酧>_SϿ${n  $==NKIs3!;;jOA$iM _;S/+٩g 9N%W ]wm:PYEsScS+*cv+1>N&{v\Yq12 G,gUvBC}.ݡ kȈpn|Rk srrڼM>-o8++S:' w2q1mWHpRO1d2)}qYܱ1Xt2g I:hh0z+pa4 0` @ @ 0`` sa nzh  ,!Ϛsi p\^Ϫs&8S`0` @ 0 h;ۮfO1^]n\v[kv-/yoG-=n:pR4zhʩɗQ㽧[Βb[ZVUn$ 3}S6}'sG.LM ӲJlth|s.mUzr;9bY}RBwRd0N=S@u OfRҤU].B]0Pko$jZUUh\}SMlxʷ?ܢoM/޷kτ—ztêGzN6\QYw&uu%^]tpI8K޷XR=Ql٥u:V>)^F]|s$-E{^!ۡ ;=,E/$){ZUU; e0>-X4&a$)V_vUZh/Zq CNf:?~$mUjTVx$ dccuؠ`U}Po]F󊾒Ԉ>~fs5hJhI`8U>+F(I#b Қmzyҳ= *S{bAI'kFI&]aqϣv@Ԑ[*WkaJE CZ/;A몶+".p"|SUܢy0X]"GVS@};=͚_\rHӨD0NQSyFW:jjuo3*j*ksŨPIR%.0svIC|d -/9J騍Uʩ[)$Q[Wa)z Y7/ܿR@T՘/}zWj㾲/PWxHJm١Q_LkG>bڪ"[A}T~y&]nշ;S6Kj8TzoRB轃tE+,X7,X^ {QQlQ@)yA@huظIB@!9sܙ{d읹׬=?7+ݝJ?,߭ ەVy6aE܅K֎.s鲥[gMݚG[t6g ]Mm&*ݝyQo֜?ۏ]=E.yPwi6 v}=Ct]ݿIS7J . [|2=9oKzh4NbN#:41`a|?o'Wn *-ᓤ ?T'[[ nIj8$I9 TWWY5xX;G;khծ㙼ebӳT[T#i}|zaz8= U7A([<$Sܠus5yEoiizmi&ל/bXtU][gHJe  ]WɿTz(I\2k1,z>VX|^:K7hh彥Y^CvXGh{~:VVê^ mt2<9rZrhGӌ%IݙJU;[ "auo4Z=G_vy!&j uuABSߣv{հBM}YE;"ێ䊍4}=IhU:ip.G,  '3 Ui[#ӋR&E}u/_xb+ dZX%3%I oa UJzJU '|\n զ]`p!x9j܆O(~o^3U!zcK$<7XoI%^M5B6L|qKgץH[XeUB\ì *՝!LmܡCvjh%1EZOo|[;sStcuGÑ }[}{Ʈ>hbj 9ik@(}o׷zv;$JmGx|^>=FMl_kE”X]P=\nW쒿yuJH_Y/l@5*kjQMxZxhUp9 'X=I~\W=h{>Dj'J .=;pOhD9 {5;5f_]V\IQkׄign^-aF ڝȲT T#,Ai,xQ}pk._;߭9փ\u^KPZQ2wit5:JSw轝꺺Îן_ xO#k+[?Ӕ39W)]j;nTbhO5;CݶEmJo٫ K/)ߒ[PKDk;U&ϭk?'77>Z' /` 證IPݜK~/߫z/tߚtߚ4qʹ>snmƮ*D8n_uoP+6I2Us鵭UFj*TbHݿTR`o- na^h|m-IZp`F:^^W-~Du=Mr}kd}7pE5zMi_A` u L-=^.{Tn |fs*Óւ%IV"aQDX m|eޥ͝stxš?G]~O?v轝jH%U=9L֋[>Ț} zZto5i2M,!Ū0K9Uv/;మ[T^gpb1Y^gkNtKFR8k$;ջr[=bFxV3 lR&&\xGV]Qzˮkzn_5Ql\1H5\o U;ri;8VZ5f jՅ2%JhG]+Izɕzh+4z[Ce3|$CeToV)߫G:[?V IDAT4F 0-Р*tQ`( 'jPNzYzf;|Wxue jͥ :n N%IvêoSU'[*Ѩڃ wW7-zWaѫmM;;qT->IReeX{uMwpp;vH6_K|ۗTwYbh9^_]銴)zLU'}_\ Nu?gbP}Gb-V%gH+]1HXmw֎LwܦWh9;~3>S +(2}ߕh{I|Е&aWT3{:Ph{VTиu2$IW.6III6mծU`Nhâʅfl_ {._.>Z Cz6]#8 n rBJΊY`Jn U݈t`ʷq4:0` @ @ 96?a|"8 TF`?ap :bu(N`A풙'/NiʈgϜ*8sh~N;LpF` @ 0`ps姤iT ,$YY_APM3NyG#sV|_܁߾ݧTK[ؠ`r].3+* $(WJί'Re?x;Rv4]yG~q{.o#fj'3@egȷl\ܳ .w$[D=L+#Ž[~nzy|+c@/dmłrO&{2%w$k~ײViCʿ.1Q6iǟuv5,U|VyM%3;K-sMlIN הWdEi*;FerMxYeWK~Uf*[d턏ݙ2eDEڲEpF|,=dWJ,-;S L Ȼ` ]YM r@3Qc1!;e< +%PʈuT0!eeֿ:.[6}S0{I%GRf]6Z^]ۄŷ -& |)#2\S +;W>-;_.$Yr|7\!~̌,\w 9yrO~EGַ{ tHھՑ/ !$.KJ ֝*"BSҬ]u%IK6_ Vش !9ul|2$cfKԭ-K*x 9_.Kڲ4GD>YǦZŵwPOWYi$ڍ|X!Ύ\l'ܽG-I$MGBaLLr-ukZh1E_/׳S؊oxQ᳉K :ʿf n{@dKn!K#"<0^y.p1t@ +[N/V؇†!=roҤB:Kn.ƕXo- ۆ2cgjd$֯Wdfe˨}f4,%އlgȈ,˜K^{gfp}0,^fV`rիWy$IR6jת0+6Ʌ_IQJS~C'tR)"< @ 0`  @i |"(0B0FDYfQI?,l3#0` @ @ 0` @ @ 0`` @ 0`0` @%iܮjټoNپ0` @ @ 0` @ @ 0`` @ 0`0g2]LWA^dtlvBe %_܌t:Dnrnː#4i:@8cf |"(^)0[~_t]6(3DcT%1QhS]uekRϚ Q$IQQQأ4]~Ū^}4[}6=G59ܩC>y[uQ/-yb#PD (3po^ٟPոaCl6$-umj'3ԵKgխSW*3NMx?U6DSJe-u#?7oTSsR|{y (UtLfϜ ~gϜh:| 'Nd5ebXd؋,=i^lٴW_WmWhO>LonpٵW_Ww`_jֳ/L/H^2U?|Ə{T=\I jCwA׎ <2RRkګkwӃѭܤ(';'7?+g^IR]յw_$?O/i׹t':ڬzc4N-17ߤ*\m޼EC_/f34Q?ïa14d.TZAZea ѽȲ>{VwsZ jefi@s5w%$T v< ? ^~~A0Jo_IyRխSWxnڲE8ZM4n+!!N 4H{;v8@_‚ ѷ~/Y w>عSq}p7nt*9Y o':w^7!ذ`o1 '!ՕQj QEn֯o}7'MxXl6m1e_C)SVVVe>_>/!˭;[#/Hc]M7[Oj7,,Lm:6DGU˖>6L\uˀۆ\:|Ȳ\ 1:x1].223,۸i/QzZ'Hs$X ]9d886el;>4'K]4"?gff*-=]&M9ײzJ6DS&NP!ÎoZZq a-P!Rwsim۶)YsY,#uLJE)գ|b' e%p^F7Fmy^o:e+VQ%9p׫'I'NS&)r‘0}"Y.LK2Wb}>,8:u0/ծMqap8=p={jZqa9qgSteÐqJ ߲cNҶ?I]"znά]azunUY+^/_Co.pػWW^}XO< MXI߲y@VaRR$Mvek`N<_oL-.J[?,Y]:uiP>Zt[:`Ö۴%IsXfTVMn"v.>o:uhPٸAoR҂խ8د/"IjޤF^phu1l"#+E?O>ӲY3]0lW ]Ps ?pmRԡMk뽏?5kT?EX޳G}6mRb_UՕ#Gq|ZqedeV _ݻtRTdI٧~7釔祺bk͆zJjL#/8OZz^}.EG聻n$MC]5rW577UVNvu.˱kܠ.|UVU˯y9A@UvK \?v6zy7 &9I+G)5-M7Z^^:-[hHs䩚V /+*0$IڴR8Mxy$AC%Onj٢xn$^]:)B"#rq#IcoY.$}ܯFzZUltUSjZu+G)#3C]+@mt}Z`?t핗^xv-.6nXo*T^THh /IЧW6IjG]_U]Vɚ>EYVKٯԷguI7u'c jܠ7inAMԗ IDAT$-^LtɅ+y3edhg؅Zv*UW^&IrE[O]' ϧ+G^\4Yzx3=}43IPt(EGaz1<=S:\0\Z߷jKt*'/OvM:u,S}4l ?6^] 3?n׃wVl?۫*iˀ:p(R:j]ţW}y.Yd_]z >Os n7kHϿ_rf"v{:| 07-.:[F\ ժ7@ +Gk]&'| .T.4Oܞ=%I.tI~Trfjߺ$)/7OQ1l \.}6k}ɧǼVvnf}9Gԗ4⼡r:jܰ"#TAK^\.>쯶-խSGX}_}vI \Ɲܼ*>{t n q8tazOyy:5ki{EiݽVV6\\j"9_IHwߗ$-XX؊YEړO{ӈ9MԲE3-^^chWvFXZM;v`Ϯ?PʁC]v&* ÆjİE#I'5'ԳkEW.S&pb_7//_ʕ.I\.WpQ䖪SH/pb)S}VAculԹC; [;Vg_f$i*bLm-/.3,ݳwZD*[^cWհ~}5nPOyRj:=;qn ʏw?gR֭Ku>8v ᧟%Eurwv.ڪ_Ϟ߻V5 CЛ-kHgxXX*DFH:2[ǫ>睻[|t,|G[GNѥZDό{HԸiG>xƎLu>粪:+;+VV-խc]͛NQ!ÕI@ˊee`;n\jZIx̝?\RVEsN֛/MOj…zɧu˽K7i,Wá8IR탓9m߹Kk gJUVɒڵ$v]Q^^PI+׬ǟ}?\y~OΪ|טKSԠNۺ봪N͚Iéiz|edf("2իIb+VTU;vzc$?jE),$D PMijҠo״7Q=Tvmt6MjR|\"##5UjUI&2mfy]mٺM-i"Iiٯڹ{$iջ[W:yٰQVxxhvI돽ǭϜu#UNmz{~[^Tf -]Rr1ݳgR5kH՗jUƍ$Ik6lTZq|\ޘ2I>O۷$9CǯxG''R~9G̘%ǭoUK~]vZjuԬq#[HcsxRi$ө57O~1|,&TLT~u嗩 e7ޢ͗bUVɪUX'P~?l}q\F]z"ѧE?/Ѻ4+(PǶմI#(U/=loSs(b<1ܯxNzi͜*WG]s{MuQYf 0L| IRe*DD*""LR)SHJM+2;OocQ^'r8QVVrrsO%hNSc4â8\bYTyJ=>.N?~5[4+s.VC7(#+_6eu^$%%Iڴi\VV .p.?)Dn-K}\{-ׁK,|:t?z<>R9v[KgFVY[_8 Yٺ}S@z0Jv`яt8m@ 0`  @ 0`0`lt3UӦ̴t痋6*br^YmLynY.0 V:~`8#E ;SS'zujrBBhuv]͊Rvn mq&#D0Y,/S჊+I?ǫtmXܵrB*'$hUjR>#>W9 ,wbX$E6rH0(g i^yijo紩Se^??;SgHéLN@Pde^徝 UNfكa~1,VynN@P{~KX ʼiR,r3 @ @ g\_29&~e`8 pE|KO;˗$naYgun:J=nYy){*XcHZiJ[޶a I/O~SMc-SRZ{$կzG9gӈUO<*԰H mac:iFZɮ-8ltH+7I6;H4FU맺{.Т-vϗlv}vMSЏ{oK-{.6Jkd1MՒUs[4TCVjNnqd:CHzWlX*9#d76;kv(Vh7vIY<7M S7 d׫bHMCK-RN.ؐMWMc`+ }E'˚+(P/q^ Ɏ}j&4DUEI2 j ) W0tBQ[U /c)paj.6sdpK|-ZF50 i8̋Xj тϩK.GQ|^OՑɰz{K\`8SX 8O ` @ ev߯А2o~/08@۷vn}#+y}qV`cY3uMvyfG:C+D*(v(42VM1ԦR/7mKٿ_ *4*ZV%<&Vy=j4 7[q'/6,;7O>Oi/ ULŊ*0-'PJʔ'?Oi~1 C6Cq _@pl* QHTLiW[!j)b, @ &pJOG'M1UΚ2 ڻ3F},ٲ-ے,KW`L !+Hi)9BRڤ mh)ɂl!xƶdɒ}Iٖes8Ǻ7/c?z @ 0`0` @ 0 0`ʳdB6.G; \\$IoW\\Ą`)>!Ѡ>i}MWWWo=Z[.O}F~8}fjv!ql 0͞]Y3fۣmArj^,Vz{T\T.m+/Woo߸s8JNLa}Er\IrF;d"NԮ]%I+/UVf"je;uT˘ZRoܩ"$%#ڷ]ZVllk$I6MK-RbBjUQCЙ/K`;v}+f`L=JMM$-[D;>=dZ>XBBnvIGݠ|a%kz~z45/W7Αf]wޡ;IRNv\ъRnn FY}ZB?Ǖ GKIVn=4Tzb!-..Vccjk$I J?!Imi͚Um[?D`" ,V"#~7#+_$uvv辿{!W陧~U˗k48nӃyH$~F>=M~{=o$Iw~#"Bh=yVҝя76m$:tH_;kikz Iz}Zt6mgzm3;[`H_\. 9>D`>"ͮWӍArïiiiU0ںݪعSӦMwp+ï$= ɓ.Iڴy^~-[X_Q/+dV#bs9cf6o9&iQo;rh rvEP[G緦|^r5HmcB@ޯܭ{%E;-?nEEEw$٬ QKK$)/wy)=mrP.I@P}bcbF`8G+/ӛۇY[tVSSnzφ/L.)Zj>[.I*.*ǔt?v%I1.9pLHWZZ;NlSIύO-gS]]6)2"B cO؞&բ9ϩ`~#zk 9>DaIҌe0HsT6o̦3+ϟ4IRIqi>'Nn&9vsחtIה,E8rF鳟$dy Uʓ:|obj_MG'ƬIԩ2:|Ȉ]P|@II\&+0Il4w$_Ң}232ew~ǎ}8`H={ Kުg_=ЋZ}^^zeIRRRZ[۴7k7ngYW`0WM֮]^㨯)9?Q__,fx)ןL$Æ B@HUQ¥+/]~-VlVCo!EEE* /vpH=g\.uuu=VU6-|p\.Y5ɨKOިs1DEF}1vYW%I{>ŒmSrXy}y}fw!oۼ}p}gmOHWijmk;k \00Nmh<+ţX~_L @+K/rAWn&% ph"^ eq 4 0` @ @ 0`L.f"\Y fb󾙙JII$m6*)G 0i;Q?..VyyLKyD p1Ќ|Y6>8Q}+N[TgUyٌjh٪;}ӫӧd5gl{Ey%%JJLBR[Gv٭榖rm㕛OAdT\T,m^&E9d"MfصkRdTkKުFî5WRUUm/SZ|^}m `LVUe6564J:::wZdvWxv9*I;]ΎpHWss2d4uV=^ RNN 3=-M55'R v]):U[^uMMKUWccRR)gdbbc٥ں!}$&%(1!A>_jO/\nhPvfL&jVZZ<ZZZG=ѠtE;rY1}=ڵgOxG)ڷ$f)3#C6U--jK1ZMGWzfF&&'')..NjkN) {ooP]}=JLLAR^CiyӦ99YzZE9rFGkڵ̐$Ÿbh|-_T.~:E )1-?Wvf̞uQh<>MU9\ds t:-O(-yբ d6kY(gT iՊvk֭UdT@~Z%&&*>6^K/q&QkV֌|FMӚի ںڳo//Wɓҵ\ԴYV-Z@%%sX5i^BkYX9vZ\ӆ=T6UySzj3ک\^I2L*--Ѽy%|8\Xr)@0Z*7O;vjIRssJ畄Wʌ6o٪ջVP̙*/Pɓ=@$ebcbx¡m{B!;t5Rټy:rغjgUuV\wQ-բMSUҁ;.Iv5JOMwUќ9:QY!AMv~8f5;y%sUS[X;~\ZUUUjmm9 ctyVUT$557+;+SG8Mz{d0HFYYY:y|91<&\L{q`LRc?1>AFQgBkUU旖*&&P0RcfΘ!I9Uy%sN%%&ho_xpaض.?pHV,W_G9sOkScznW IDATlZdXd¯+In[6U};p9pUQC))r:d2 eY/01?LfCqSsG `h̚6[Z5=?_gR]]jkkuTjuZZ=JNN x* 5XPDD"FY,V<> Rxmv  l0HQQQqe2B?nWpK}>_TWWLV{{E;?Q9b{]} Uy|~Y-l2du5 ,8=[^J=? ǫjn?kfhPp`Dg7~w5Lq:rZ嬬R9":Y -(-jzhPdC===rF)';G/dwÎ*2*Rm2ڴykx[a^MMJKMCl_d[Z}}r:hטkOMϫ8j fh.w<Wyӧduv-aosf2C0z{zu?ĸ$I**,TɓjooWKKJd4d24Hmm@g4.Iд!Ll2)3=]5.r5jl_KϗaWΝ:-?ådXa,U  d|B$)%9u8WUUkVAӦ`0(ݦHOjp#GY d2ǞظX_e?v̞EHirmty?m旕d6?@9QdTI\%&& 3b].-fYmV͚9}P`ڵKsպkێAn+/⅋to 575k3+PPi*+'ժںz{ؐQ]}Jq2ԉ_wݐmkn͙onWCYgkY Q h߁Zp FZZZԤqiZxGu_[]]t}dAUTV85Ʀ*+-삂mڼekk<(î>r<^mڲUN{욎6vy[.'N@@>ONo6o٪ee*,#ӧ]?x/[o^`@G;W2aذaC-*$IKW^kM˜djU_O~fSHAy=gLMIѲG&IfYaxB57@ܬ[Z55zQvy=kd2XKuQ#f?l1l2yhxp5RX-2UVU`pq^gĹMMWO}bIRYق)9Y cxyx*n8+l6%%%(5%Ev)1u>gͺd5cpjpFusA@z9JIIV[uqNy0p555뵍^c8my3'Ѽ•@ @ 0`y*/!YQQOds9 }/Z8v\<\ <{XqO雿}f8h]MEXm?vgub @% jIt麹 W/$>]tW,E  9 `0P0|x!Ix&GZ WǣnG MML0_yMw١&m<&$IZ9m$j_?A~=1pq6lB$<$.]yY7 Ŧ]+UI޽{ǽOqqT-o%0 0` @ @ 0`` @ sf&4!Q\\|} P  @ 0`0` 0̔0Yz-#׳ώ/+Ic;V%&}O%&uo%&}&@ +?KRoo\̒0kv!U\LX_IZhq8q*߾`hg (I+Yn]7n 5ӠIENDB`fastapi-0.110.3/docs/en/docs/img/index/index-03-swagger-02.png000066400000000000000000002225331461403617600234000ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwxTUI#I: M:Ҕ"^ײJ\q] (M %HBHBz2G $$@*|?s[s9L8t:N'f2<6!!=^N&,""""""UnrvYda &--Cxۭ*l6aPfѣ!5kM||jHDDDDD v{x\mɂl1 a~Lx<7j%77xOjy<.# wfJϱ9~,GFFiiiX,䯷8\Nu{ˆ#!!BJ/~8~,3 tT-/jժz=.<˙LfT}l5c1. 3j-{TXDDDDDDvqw3f̨ ={SNt^߲p:{=3CGX%?.Z4ٳ0ylf[YlZ{ ì^"rpx\.UT{ 0f(&ORάif)3E3`)o\?]"WÜ7j='lUT|cŮ?->ty:tgѢ<:tDS`_+Ϗ`UTc|m9_0.kZïj-U2aalGnNNl,Jw)Jb-f 6T%6NW9^$,/""""v_C,}^|r Nu) }`3竫K =(e=SKa""±ڋ^)w%w^h>nd22w+8'DH%|׳ / tYLgϹ Wgd*ߗ?ͽޓ~ xuf`{gɓ]- "\ըm`j6]nfS^tmS::r 3JgKEV^E"T;*˲Bv e3ۊfKGrL$"W{b" $ۺsI2E.6}_3SWȕ[h ,"""Rǎ'<,W6ϕN+}?|.y8dhP|AWXnN4Út x2kTw""""dpX,ǏVʶ {=v|.[.fBL7EO%g:e8&97")݆#3N~x꾷 ӭsYxd$plf~N?0 <~znDmoߙn;רϘOͳ'>z̞g1D@ --dXDDDfK2յ+*'Ɠ][7-Y$ƄalYz}+!T;c[7cFܻ3(!}yO3(m s?Sv|Er],R\ UݓOӷvChΌ™knOq׌Ei]#9蟼D%c)|X5/am2]ZӶ\7uʒ3z ^DDDDDR.Zn4N/h)^̭y1wKrQ|TlsϿ'; 3 SK祹>S~S{(husqg]xYYc-98F#fvx uvz7Sm3\diA&gw=G /MŬ]p:+;Ji9jѶi=^2ʩI#_ԣOUlu"t_9i ?-]Fk:/tMGnOKTc@DDDD|d;<瘳o K,ܵoW5jMy)mupרŨa]16d7A)zՇ$ U},>Ԋh5'ߒp^ xXX|IVvV]+DcJ?e8j;6mՂ2wAVH:8aKf-9^0{:K }#"^ /~Li3ѱD~ezpb#\(g}yaܕoAsO^sMG `m.q'ߧ1/<0¶(yßIn\3[{Z`o96?|`à+~ܰy ֣ [)M3U:l$0q]Ǟo!ݝ_yIO|K0gbڝ3#L'm'K?ҲbOx񽟈9%ݼسKңs3~_HA|)}Z98]uٴmٳf'9⒔jҒfV"..':>dY3y륪 e(ኈp0e$B'7t35WMc'Hrp#/f? g̨~Տt*v-Ըix+7_͕wi&ވݴ#q-t|S޽A;؁W\6bՓ>.M#C/e-S$2gy5 wap#MM%-3}1{|> f۬U.QsrlqOgaLDϛşOҁ.Ud{ߑ"+g ,'t'!<;zfafg21~#>`oGk52+b~dWi˲o`ĠnnXil?) 0왜8LӣP8/ -[iz2mޔkïq%3?Ȅ&Ң{VJVɌxm漩NFH8)ϽǻsIꑽ.W&}X5HUf :t{9\>5kyg?ȴGe)#W{>3]P2RҒ+|O?XDDDDJѸQK\y~Ph[8Iv`9QLrTe U|u\4ejOP=5g/)JRFXF%T_\_u/ehJZXDDDD25Tl2Dϴ+UTlDR+:+HU Y5&RpigBpyWWDDDDZ6 6_՘HSA[/""""RU/&ox _=(j |EDDD`ՂjK*`Rs\lHU 6_?US"W l~]) d2 Ɍ͆٪E:&,>>8vn7 ǫOZ|X-X#\Ғ =֨V"""""","""""" """"""" """""""UF׃W#\na```20̘jT2z=nN(\ٽx{c5s/>;z4mBTt4={9q_M׋#שYDDDD dy-et*k7k1 ݻS-,T.OJB|e;Ił?yIBp.yg ^Νҹ3# wޥM֌r`]{~UcDyDGG?j?ϙCzz>=hϦɅ{liu]}7s8W\tv2=szb;nfZ\:)))<9q'L`aJ]0HH?>}.֓}m~}z?^#(833` -o}G`@ wzK==R\uL2 NVN6s~Ü搕̈́ngꔩtMTUAV@nPc:oEmƋ\.}_~چ[ӛ6o֌j3w!!!mϨ#idRZԮ9~iSR.5kgJm s<>a'%'ŗShA+dnTӇ"vl瓏?PBiԘG} V\Y#b 5z^;uz?a#?cZc'}:mgg :~,R}y@F%Ō#ӌ>sS7|3 ʽ 3Z4&0q;ѹDDDDҫw{=C|Jr|5rzY~/U٣g/s{f{Rx|ML&^?Ŕ/Q71uڴlJ OdX4~m#p\L^o_%&chV'cwd3k1̸&iͭ֕ԿƢooԆF}lryTbdm{K>WIlm1k][U'i׬ <XZqXжxluiJ'&`>@"zaԶI;_ο?k^mՐIò~J70cj8R4[REDDD oQ-0jA m۶|0:FFF:dddY:$$;nODD K!]wңG`'IÍ@l;) AA|T玅粵{_̊)z_fhW-jkI#ѮMq29x-5>$hެ?CkME9éo!!`b)Gl[z&ʷ>.+uϪׂ6$vJw(Mas9!uzo1q.W,db g cFq]&ËMKV븽g=2gY\.F<TKDDD`y19v;Y8p-[`6ڭ{$88՚4HMK qc3j46_[ с3{|3degWZ]A*4;R?-H9d ӥ^R3hΦM,/վkB9muc_()jRݛEƩ9$%T-B\f^5}?K>ߟۖoɰL59hÏ 8mz>,r^FL,ftoh"<BFMNМ-qllVFCI5N׈/XUxp,:ʉ,$?9RRywyGi_W3ٞn`Ҥ1& X>cK.3Vff&~_]quWp* U.ZK{ONv6k׬'$$дYS7jȞ}.X6$$yW/I8R~ɄY {D>/>{}qNw M2/£[g%(Mْ2&Ȟ@ԞXqW}`G^kԣMCR$ ȩQ v(KNH(ͧ{lfq4Frē ߥfHsA~+zqc.Zvm㹮Kgڵm]6>!M|&MOFu<.gO츜"eB1 ;o#cHF2F@^ i)!5=E\jn˖?ABI^>U;~tlH#o ,2 3N[Y-hJTt^6Nw(ZӟZ۾̴Q` r""""p8|g޽nݺc9Cnٽ{7YoE^ W?x#oЯOu7`|{֫wI_3`АJo|%`?J /Ğkw^1ڶn͍˔i %]vmZ7okێ*?{{m*f+- IDAT\YTj*oO<}j ?vmأֿl7Tj˖~yxx.a x<P1pvϱ<|H>NuK< 'o>6l)~e@{=ŏK~%pz>s}qÐ1wsr[١i;;H]?u`ŝIf!R^eI{{X|IK_}(}Æc9F^"&=DDDDaFXXnKb6۷fǃdža/wsmŪ_{XjzSRYlÇ_~ƍ/˖_`C:^b fŦ3sedÏ\ OX~ dQDFFҴIcP>wdaJRT""""W-[Cw~?nڵ7v-㏈*?T.߾Փ11̚5으;v7UYb%ʜ)-lQF *?Ks\8J=j-"iޢQQs搞By\{mt-S7īBDDDD0ݺw'+3;w]aojl, br8==i_}ʫrj5EP*U""""W.ld~+j*abU'kT"""">6*TW i2cCDDDDjz`m Rbs)ߑteݽ͆b,fl6_L5/ """"rf_i&Ll6Lfߊ{B&n ]i\y }(T&kX&3o Rbbq{p{xx번0 L&3& YtLf& 4F@DDDDDDEDDDDDDEDDDDDD"fVDDDDDD;wT!-=ҥk-"""""" """""","""""","""""","""""",""""""Rns,""""""[,""""""U2\u4!آ⦛o*s,"""""" """""","""""",""""""Rh,m۶e;vXr((((((((((((((((((\,ټ}7{p\Rk!46[4mvWeU$dƑrUY,'vo:ֿ%X(\-c%eT~ж;9r#Y6ƌDF}^̩Y{|.1GI s%ո^ \w׳/I=WjZ͡c ӷ<_f1}ĜZ EDDDD~W}xW,vz>ƎOm-YHQx~hikPFmD4$KOA@Ttڙ=I܁ 7Ho3[95Gߛ笿[G]G@̽2cnNJcޞ ,1G_=؄`ԝ!7u]I~qnFm]Gg%;}˚t!O0p| 3y?{nyWݡEDDDwC-WܝS49'{o,~.V,[i\'zz|YV>ooΒy+oÈ^ X l-㮣Foqp7w?F۪ZsKjZ.vݶZ~ZpGۨ5Kw>OI4|;7܏fVv4U#?86yIly _n{CФ|8'_eoHq?B_nf'"""" r)e||>+kW}_t v9cəLԔW?qg@}x7e PY7Mx|м][ؽcӬmRP.ɱO\U F=Ǧl'&T$MM&^lVO:'2O;Vew+_9y\O.vGCDDDDDX*[Fʹ4ڼKٗN+dS '5v;!Þ T+.0p8z|7ɵ0pf@_RKBV|GAym?fԳjѪf#)K%7<f>7rS9؋ ;,6_"Sm3Hs YG-dee_X]n`w eBP'ֳ̄h%$9=jЏ:CFj!(~ͨe)<2_T^Qh 2/eOqj6/6.sY3U_/c(%nX֤{eEF%.(mj~^ubNMZu jT乇z;$S{Լ0f/NeZ߀rsJmiD~iHèof۞Z ϶@ؿ03׫[NjfrxlC־5F֞$6b6X6-a1 khZu o ǢGs趝hs=zuk<1i9p{RamөG-GyӵfK813 +~/s[`ZXvm!ìX=CDT&Rh"L\N&Ǐ:z)("""" WT|>Q#/t9+#6?z\|D?{YL&ȿV`]9Yxgnǹ!<]#3tatUyɍ\!Z <#䕿 n Wfza-aٷ Gvrow.?q3iϼmWnTn,:'Nob؜3vh<݁ÏQr`'ȏDqGCU _ H6Sf%+s-CLvQ ә0sCDDDDDͶsKؒʿ̟_u)f~T{4<*3%gEڊ)q"B[e YzNgot@K][۴eY3,7zѻG{m6miLd=ƊSXQpۘ6lVVm>yƵcl8:T^ubɟυ){>ӏp,,f?)>`=6:OAQZ8No_&- vش`. 3φ$RX2i&fmLcXڤ$f J5Yq|}m1_Ͼ-ll`F+ӷ<َodbSPDDDDBҋ_` О^`fl`MXѹs*a޺B{nf~v+-wO>χs󗝚>A Az-py;I.:nu+V-UGܐP=snVl!o*%{ؼ)⠈ _F;a /)%2WcA4i~rj\NdW W6F+j\O@Qj؏#F#mװp9[su`朘E9p:3s n֢HfCpع0!aԋA4Q{ҳ`붭h7h, djP7r/AѴҤQ8O;fCğ8Yf^ڴlµڜ巸`7ό/0:tBzDM+"""" WoF"OKl@:NU<5} Oy5S4Dj Ȓ~`zlk&FMڛy_٫ְuh7i=tmN{*q',ϛ8(20@zD/&vؑ}}mډ];]׹LѵCD_0qm)3~tWL\Ӳt6Fm˼9g˩]|qDfEv[6\>mZqYG|.X)'Yd?sAرd=' )Uwqˊ:zǚf`nҕz[]O]dW%bВ=8Ȭ5I^R^#O>wYDDDDDDb*O~oϙLg1eh$߶Y֢}h>MtS?oĜvkhQ_ ӷsxEfo,;FDDDDDبO!P8ZV|-$mq2 h *lks&DڌJ繟t5ƿ=mv[FbÉ+9;v˖B#D;;1ܹnբŀ!#y>Ի@w[CWxKm ~6giWᕽu273pun8-*,S:طΰIlhkC _,V,9wTIW X!dZ̝9%;sd6v iѥ/oN5NP;Ͽ~fD2\ԧeq{cϋYn'T6A?'is:qqۍIy'5Bjޤ]+ 1osrNz*u5w  ӧ.gÑt{GDDDDDcС^KiU!-=m۶9;vK7jpw9MXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDJb񬣼«3qEDDDDDJa2_2- }7Hwc͖.bYS۟WYqim)v8LtQWZA\2#ے\͂^RCbD^?`'lP^ASs.ONr؃v28`r`ppI^ښ)78mqx(ëH8OZdK^ee[8<1OZBǐZ!vI1xeq u-qt;f8au]ì+TDDDDD\M^+)SwpD5b'M,KLZ{\c9y*/w4b]) yn)"""""ru`' ~4uR3՝,?}oǗaV#d[m9jLWз?i8 3}caj|zo8w0&4;EO/0lK\ll6RsX|(. =0+irϰjf 82v6dx8PˏNa +'ܺ:EDDDDD*igwQ_-! =TiR+;{og˩`ox")"( ݝ $x~$z>fwfv;ɾΜ0?)F7 IDAT *8#`iiEL'Vz.^4dAiJ0vNXА,W*1f"s%Q^gD-IYyLbbm\gC,KXhϕeHEH\gI$Iz3$M2"d,M JCgT +=L nFZ:Xz1/uKY?f > Fo2-MQ 4͂Dz!8BMrq\n,-pބL^eK"'S,HE&˰+I$Iqq3Jټ}4=RMPr2^KF9=ZZʛ+˛RFީT|.ch Jf'(@i C'д, u[R@Y֤WYBoˢpGg/J](Ѳp"XB|S' 3e$I\Gv)^{&g݈FaBұi¡Y@y N_1,F=`=o>W<1ba&WɄ_9mUn{bM%8e"ɋِ<9hI922=2H%fm۪s}}g]@&9 5 pve\5tO\O:@ոcI$I_'۷oX OL~R\8`x9ifK-7dr<#I$IQ'LtmUԄ@RdDmNI$ILlX98m!I$I5T֬iƼzKnՒz81/I$IRfX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$i[Aq㇔Po\E?2,fܬ%,KH4ێ :u2/$I$mӜq̮̺I/`-#I$IɄ> 7saZWBAC5ޕNn>I$I2"/)Z0w-;l.α;NwN`îaa pK7sTv1a<88E:kݑn3،f+/9, < WNt_D |۷~\ǫ%aCYGryqtI$*..fٲe4mwͿ`rrrSjYIw_w'(HB}هMoӸqcr ~עmbft>xɫ;[NARۣksJV*ҹdv:$s)G۵Q#.#{&AF@!˖4p$I M6]%klNgѯ_y~ap9yߚo/y7mӔD8tӫa1\t {Ues27 kV ?~'_'U}M$I+/2;*ӌ3<&M~3$٫OȪ$Xee,[˗ (fpwc<X%z4m҂VE/+I$鷇&MЯ_?}gjO8#D(Yi WJkNuE@:h9l}?|Y58ץxqKx?8~_ɪRX/Z,I$mZhQfذa|Uϵh†jYӢ՝1IL6,R'DUqBAs8x땮[ϗXqM gY/Vtז$Iawy\>`>`rss TZг}NկY•cz^ՄqV s '߶3Գ SQ5mK,JUXk/ے<`ۘK(F3oOfj)=s#|(M@ُĵ,´oq %cdq<~l_HnX=]$I!c_HZۭVH! n}f7ࣷΔQR4{ӹi$Š*wK[ cۮ6څzV?\xӼ97n*7^={GAG;gz {+o1t>Dv;6غ[IW]'~̽\$I׫g`0Yt&ulE"XV}Z܇aiI)*g&phG:q!he v?js=_mcպ4.sCrptq?z&*Akn߰2_Wwۆ C.8ܳ[[r֡\o{.Xvi٠}Pwl:ǽ\$Io߾ay*dO?0I$I$FX zݻ6۸]V$I$1K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$I[+O $ITKޱxCl͗'K\omޝ6$I$o´[qI$I2)7Nm6$Id$I$,I$IX$I$$I$I`J<B''$IT1IaQmCFD4(d4OONuqVkj*g]tZ+A9/ ,bL،S%I$\8~R)~^T25`lᒏʙ-+ᛂUBf0+ɒ BV4&9%,JUɥ=sc{}iތOs/3cұ:4xK?8K?u]>~O&*$'r.b1"9Mw®J.}Ffn3P/[?Û~"D=v'ak ;|:IϹ$I :vpH(1`"^-%Mqfve4&H fr,'ĉԉ3jT>i 1 &y{2K@Tv=mr&<gú{HdlΩO])8(aws+xUOǮseeO}yܪ]%^p ;K^Bf9$d'ɻc 9wO1$IXF dWEoJ"zRn{s.% 0MX @4(| iH4Uq[_,|ǓIaF: OKB(2=6_$=T.ݳ@8}$<-, Fv#hBl<|ۃ^YR־[,O|?6&"~z~>e@:#MO8g(A?NWq ɛx1}w O*3Ҡw]uPUe:ָ[y wフ:*H,>~r.acӭ9m'-5(cҐ|Ө#5_8;I7vƋf`2޿Fnv9usޝxQνuu>`GGl~=\Nu!r&˖㫉s_tӰY~zd 7LxᅭSγE‡'衳.В$I2+ EXy/@oMG٥ق4sVWy) ?Qs)u&h<~< \?^4 ! w ]dr|_Ii͖\m&[i] X:G5>o fA~\stǝ?"~Y(bE1CvV1 K, QVt֥>qks{$Nvy+,. &;EfTXX\XFݜqlU+JG:#'QÊ6 BѰANAV_̏~%I~6Wee ^?;yw H*U 6FٌK蒺x%w;MaS=;s_Wyl?™/G/BdFE2) {s\y?ՠ!{o⮓Nqߞ^Ӷ[w%k.Y=dzSas? rZcم .{/ʳ@ۅ\U潻RXtUnIcǞˇ1(Tvcwٔ].k{)r=3a:י$N۱[ƭyj ta$Iz!۷oX OL~_td2IAA!>_NwjGPR@t:EDDD2V(,Ii)$ rLi$,&\ HF$jQqm&%1O+g`~%Iwxi"rrbD"}=#'LtmUXH ɪO-nF"{Y96:ШqohoI$IXAБ|+I$'$I$%I$I2K$IdrJ6$Idɵ8]۸$I$d5,o#$(r7TM(=G8'$IdVk|~@%I$I5ɯ帚>$I : AafA-!I$I5̂4Wd9o Xӹ`I$I>f!XֆuZF֬/ ,I$I5̂4æ&(dDZ[^ggȭMK17]_Z&I$I5Elعiś['B,3 FI$4$9]Z$I$iWX\C: R4%aM$ITs/o:_I$I! !%I$I5[&$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I(W jK$Ij o7 n$I~W N+aJH&?ScI$IҺ bQ(Xh4Zk$/R)XXy >gj;$I$afk2rI$DUBx-Bp2daq;&eeÀ*rI$IRM1 ͧs+rE]KiID[p*b[6 8c=K$IjV9ZuLM2bn%kuRn]:L1jjnW$IjmE=?:wSm ,y.oY$IjV9Rc$I$medi$cY\šgGwQ?a{H$I|[~$5ݹi.icH$I2V/Luj$I$Pr6n3I$I`I$I $I$%I$I2kÒɽ!=j^+7趈̍q y?9ٝ[$I`mx2yhxx5}x5;n~8?a΂෿FtSW>=dS36VoTMfF:Q"jb/XԞk[#etCM"Ñ3k1u# j6e :Ѽ&4lޣ'aEէI+L&gg5 BbleOM8}a׃f$FarZ+I$3qT(Re4kv"l0%31+[W7^/7H.N1aV%!@2iLsJX Ku{& 6\=vyYjoE^Asjt.:tjʁtZ K,!щNtN-dҬ4\<'&tP;aWZ%w=!>̣;gG99~ZE-~f: | RиUG?HZ,cΘ[:"IdtQ/bEZ%J(7ei:fL\\u* #q"uOHGb <,I!%]z[*g3o}F{9*_<|!xuڊ)q/^%; 3l m> 3❪^gɇCx|5k˂z4܍=>#% H;ߖ#?M|.śNc̃Ͻ XF7lB.{rei5!=0xW,l/oW _Niz9WF| .KuO0`[p/O5DßyxH9AUU1<F}3%4ۄn?H} -xx O>`r8|LL5b3Mz+GK>#Jor|U??;b>7J!*xS%UmoΥ$A]Ʋ]×úDhP+%ANCa!e|Bw߃иm=2bj* lԮ#2Mg^5o5R_}'oTЈǓwL>6J"eeꟵ:mw_gy1Yy˹8q'S(_oLeiM3/-znn-iEo:&w'?t,.x8mƽ}ׅ!>m:KDp:6}$: f͟®s͎ yՉ̟[v/^:2~(Me_рֻRTiEz=+'Y {y6t)c71tR"W' ;$I2/ MHcqNUݪ}dkNsVT&74QHF%3S0>WW9Sz6kscg>Ƒ,Ym[dk0Bfm}WU}I8u*+ZEL.17ũ7wA6WFn%9 LyژI_25N Oړ1l)5TMp?O#;;{K;w@,c=n ɽ^*g$p_-bC%(9Nusзr=O箾sY/0=p;;ΜLZntFWf!os&zƿEi ].{Ǚpӥ\I (gμyW->_.b#: @n׋"%=gۛ6cW8_rp$ cx^Dfz\ؾ>o8+|y;_0I7vƋf`dϧӛn0qOz4 S_v_dŷLd74+!ָ)>yK^Xn~2)_yӿh%~I|t4~%Ix}DXI(4_oAI9+n ppԨ:/_e~H ߯, ocIP7;NS'ByaEf-iNopsӶls+wmOj{e茀TՅzxoL FMQڨ}7E$. g[ ˖R gtUM<@ivdg,+ !uy, (l'BunU2YlG7rgz8Ϧd+Wq?I9Kmߖ|ڝҏxpzENѧH@V:J'|ɗͷu Ķ}غ{|[3v >B(o6y+? 2ފ&!궤u>lܒ6Y -,(8~Ue8Y’Bw{N>cnϳߪbB}y{b7$I282 (P!kec.wKN+W7;"Q5{AÖ,5Q04ک?-ٍ8tMJcK޺^a$|38%0$=;ӖQ@4E*(,$Ɋ;Ȧyo?S 8y@mO*9v_nÜlg &!AGv.sƿ(d^Yño_X?Id^D5rجKBBnKؿe@U38c4 -N.ѿ, ȭu >~cG1!N<{F+;'՜ ž x}O|,7 x=#&;a*FK#kZ鲪c]E,AAa㝗{bπ+bx_q^{ɢ֝htݝ[+KzGyGݏ7'%%c=oѴ~@qR `K9}fki#xwԴ4^B~a)aPͷh_5]U1dyy8lc.l{ݽ4M|)!APɅYaЂ=:P/·39eCUd \u{4mM*o!KPl/=|?}uY\qpᄊocWg^l2m_?U#o|.{Mv?mO A'(oԁܟ&$hra!N9)5~'ρɋꞃ8x٩݀ܞk(#:akqN<}Lμ| =z $4. ?Ncx+:;xu7;Bۍ&!;/= G1)6an1nTY9/Y8^ozJ!Hr zechA[|)O9GWLt'!gr![;U?=05H,۷oX OL~_td2IAA!>զ92N-Tݶv x־~ EijFq8]Q/I$\ \J$Ij_q5}V%I$Iu :d̂[B$Iji:dr~c(s $IT}6/MCbh F٭Y_.65i%X$IjiMM2aQˉF2UQ['ś2bnJ3L$IjٰsӐ7-'NX,f H$hIrX$J!@OI$IҺmˇF1bXU6u~h4J$! ê$I$_ju $IT3Cpu hCJ$IjM I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$Ql]@ޗ$I$ AT{o$I$I5'|AxV0$JL&+V ƒ$Iu|ŢDQbhVI^^MR'g;0ȟ&I$I5Efv{EYNShtl^L& д+to&I$I5ҟa>.&Y9HVVYW [a$I~늼lS~zT*Uk t2Cݩ$I$&kM1 pc~J$IRV5ϫW%I$Iu~5*^㟆-UedCX$Ic5< 6(-Vc-$I$:L$Iw(/q6n3I$I`I$I $I$%I$I2kw ^.7e< 'kX+=}[$I`mƱ(=xEdV~yCr՟\-_u zxex&qg/ɩv;;x{>5~$I+b6Ӈ X5B0%D9 s*pV4B׍saa{5V0Hϕb>|#dt~VqvܦIPMS6}Vļpv̷Y:'_e[Y}8d0OMKy6[tD_׌ta!/ /gRA]ԠFz-رqDۈ}ڋ?Űxf8c#I$ Cػ︪s^6 *p/{d\VfVfeôefi3\JS,G5soܸAq1e \*gi~߯W{{q8'+ p)S`E,acf9sxQ p)-0#-S'1Kwy߈LٖKh !ds EKQydr22v]ر7R/㹶T'p)Jg݌ W fS~KlY A>{ip?=Rk|QG9kX=,)fܓ(ȓ\h%5m嫩X/;IjuhMX1#wRX6n`oE^y|Ьz6w!3Dz9.*9%g/˳T6 W <Ȥw_8퉄Kg< .I~nbun{mt/SGl4W 諧c~ǬjEDDD*Hw's[Jj(kϙSk5 <R(:w(Ze} "$݇ y(;OٯC1Hx ,>{Xam&s|ǟB,w/dfxmOr¿hYHvnK͸Rd})c *wJ@ W哟`O"2"+"'_,F=N-4)t>LE3ؒeǟYDElg:&?u f|?WxŸBvWhɾOAB N]T#;аW_"U3ńfɰ?kHLaM^}sƁ=3'oG2h9>0I?~i[0181/')ibJޏ(Bm5] IDAT?ɌӉ8 ѧ泚iWΊ\q,D'^lKߗ84Syݞ<zpG'`VȢgˣ? Q~u~b9:ĜU4XVBz_㎀iL+#WQ';WnyD޶2ax?=]+@}0B[Mcu`~Lޏ)]\%~ÕR/ϯ_dOФbybdqĉR=eB dq82&=q 5b>|2M&OAt4m_ jjs4ځ^W[ÇcG|U#c-L#~ g.f|d 3!L ުEϋXxLMdf1!P=>,,x$fڥ$}ޏ _W ;~g~O1Έ$Wgdy&o^niXy}rV$ɞ@~ yg~:-G~ʼo2IccKƥYJcܷ%R͍#L9MΏ LlKӾS)? ݎp^-_tW9r0eO{ouQy+ES\A-[Cxvvy-fInc3k=E9ѱ}lIrO?S|9Dj8fb3!\Fzhd EUhT"U@L?kq I,qb,>h[}ٙ G{"v9O8hvofB76=D [E7i 8Pj=Zbpĸrxڤ^a$^+RMKfʵw70c&~l>CL|T㑮xTy93,` P~mXgZ%AdJ5I&nlfkQV%7ld嵶3)Bh^L(GrxIZih1?͉$ĞT, \DDDDX.r#|?YCKv鸤w l5]\r&Vgu:7XnZJIA'^S9k\#~bIUQhq'"v(b7k6|6͟mƱ|6Ni=]p<ܶ罍>i9-`?q>5._(93#>{BT_?`׌WmX<_S>tiV'K._ +.Ϳ}MWoKanD2逑DLFpBhYFnDpc{ f^87^O?c1mnJM_DDDDޕoٓ`N<p2q4( @uAog6Wl`9Pkp[ߔaa'ٞJ"|]!ld ;Kz&~ajܵK؆Uxι83mib:q7d-߳g6?p-״,r j2& q³fnv8? \h$1CXDDDr'Uwܜpuw咒=sJ2*~?_Bqv7 r:'r;d)+ω {& ={vLr(Do YAv=n4x !}g ^y<Gl&4*?4Km9dp<{ eOf@ioǝ⻷C=a71q=0!=dlnx=y4 |̠ssȓ?Gc'&)2ռѮ췼K翰/)}1v ç(_jr>.%h^{טwOy|u?p BݢNl̰^TmXsPu`ۍn񈈈(G97 <l}ҿAb4X,ڜpB=5熏$ق[E8FW_1:$ '쒾 iDD$ٯn-:`S&I3.mOʨ9ÙpvTR4jR nIChU4ā}e:7(>B ]S4O7v"p?8'& 2c7/`{D}m9z(NP_ a􌅬{S1qX,UMjQ6#JlYVB4a ј8bKQ^4 #b8ŔMzD MWqa?q3Nwd;xV;ffЛ۞JYT]S׽N2!L>c%d猩z""""͌uOOXnڄ^J*ԬY²bE,(=''ݭFEOnbg,Ae(RO6-N=ǤXL&|G-8s0-״""""ro"rG)ԩ{Oc Cfرѳ|(ȓҭ|s 'ڶ3R`ëN.[=?Ɛ)~J[Nz`w)M# U\/huU63Q S63ݹ]? '8STSw2[)(47K5$""""""""""""" """"""" """""""?LS5!"""""r? aF\_""""""w5O9NfoN5b}Gxok@j>t@r.1&>ݟϖ+""""w/˔YW}K^_pxQ7ڔ,NǽFDz3rO._L`Z1vQN^6xԖK<,%>;k{h=5ؽp^KYI`/ >mzaJA3e6+X OaBգPNlOR= ?g368Ǚ>i Ge4NNX_~ڔvܑ 44ҿA"ggCx~!Z3&6S|.9|T—G"żq?~cӻ6MkФMUTBߝL`#8~ܵU.jh¹5y.9n]CwUxKFI:uę{0}9x~?o/E)m-+Q,_p,0{#Ս?wK7M Ub#?J[ u+ο`G{1yk.[$X/gWO6ȃQߏ1iRv=ރ.Gz<Ԡ4$ndӤ+/5iP?q+ngږԾqYs,7 ׯO~6Jv zS """"+Q275Y H+Lcں-F-$@IN`^cc.T_o7[f-u pn,<9Ҽ~yb!O۰Yql3v7̏K7ӧ7-VUro]m8Sv1DNiJz ۊ",sWqfJZ,_UgJ&lW?2!HLKUk^%sYjq9k)׏钆42UQ t `]agBRxrq\D;{)&,>a#b`Ƿ!˃K緳 ,JsP4= 2OdG=6#s'9Q_GGy͹l^6AɅBҼ<-ۉo~ʣ+>hIʸ:3\Iz",[Aq9҆̈́$ySV eö~bYb~1=H43`ر<=䷐q@ """"r0HLu8Dn/Z<آ1u}/ ϮyiV.8lZS+2v0dIʘHIMOv,v;`A {gN۴&%؎6dʪSWnm{ufFIѣؿpAbb"&DDDDD@ib&vݙu-p͞,qv=Cx7la܂ p>Hjb6ՄDBCCox*UPf ˂AsoH 6yj" _ZusO_:`b0{,@W_97(]i\EE """""" """"""" """""r/qs[¸% """""r /+_ELt W<.IDDDDDpZ5{BժUCO,""""" iP[ ⢂P((Dpq,B%,""""" ibX(]Ep8p8*;bb`ZڬX, ( """""rA i|ZEDDDDo*4/rgٕ~V@u>K }!޿ՇPADDDD$WSQQEr߷k Hl#pX,q7\=-6gg'Lԕ%"""""r1 ~ pvvVC.й5-?"""""""އ @XDDDDDD_{(((((((((((((((((pngz:O~g9 3Y37՞C/"""7a<q1KOJv&e< RDؚfzt=^y=5*͌S؞mde(VLQ/PWD=5' !|\~P.ŲS0'ppV x%ܞϷFa)ےOggXk!Ա86 n͏ ]vKU㕷mzM4Sv}^ 9U'JI-LWj(o{BL*yxW $oɿT:Sn<_їԟٴD:t f}iG?~AhdUfg [tas| IDAT}vSMYQfs{,,Tb2a,~wDZT0.4W&Zߢ #{T~%ײ5Xп]0OVk/t+CƟyw)kVViϛ}IؽWNni/ó~aa xKX%}."""wXᬋwpntޚV{-#= z2BKao3;g(Zѫ}{.G4榘`bQ4>cAfb!e;A_X9`汷Z{Gᕆ\vߌbLv(ըeM8zԅ֕iڮAfHZ )yJ62x:. ;zlϔtiVVd\l-1UsmJJz&A&ӓ]gMPT*'Ϟa̓O2pn%`ddr#.DOZØ/B1q»j;s@0u zvq#0#g]<}\I=.|ylX2IJ1/,fᆋ + fŬy|W$0,I o^Ez<37iOwL\[+za,U&~ܗJrrTqJ=x&VW,_lgLI=vMey ]]>$6aF=֫O8Dҡ;Gx{x\Wr!&qX-75iGKAb=}?_Q8E`ʍw_[:صb7Gc:mo\,ea/ ~z3Y>z?%L7W Q~(^sG*zv|lp3 y`ÊS)M?aɖLr"æo AͼfV jV 6gKVEqYmڴ+B䏝lY0ai8תC}Ƚ8KrTmĐWN1x"~ǎKP)ZvoF.,:F+~Uxct {.|tb*_,L9&jӣcu\y0>e*=dO]X F k6d-.AxӴk\ OUqaٙI]W(5YqMcVK<:EΎŜ_DGZ-+"[63L}LStV5!"""rRISְ+J\w*NH~zhh SJj֬}aYp"聵""""ɩDDnU""""[WYN "wXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDD|7Tpլʖ*B*YDDDDDDL]EDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDEn}{ { EDDDDqV-V>N* Qט>qwiZK/|OSq^6<+oTZ(ߺ4̫lo5>J\}? 埆0k%v@[CpMaA(VmMP, 1 һ2hT6fж0cl<y.P.u("""""]ڍRQryj=*3 .L`q͗USr0vRՀgyvP~?9PxέU .4;z:AxMބ3A>v8AXX t>"""""r[ݝ-FEKb8ps3_ YYS^(׽:>eJQH ipfy7 NAb7.rUBX q'g M@shu$>m{YH s0&Ah ު&{p>O^5I5vłToc>9u1vk8X~{j9-Ӑܒ}Q|hW믈?e⊷͸P箻F&1簐oWIn8[l|"vb'Ĝ,H\䣰B]T~>6x'ibqqElT4PQ@{c =xۅȲEDDDDDoF 6m'60'L`)8{Ѹ͇ {dFX}Ѫzeՠl |VDM->sCcX|b!רM}P^onU`Mэ1u(]q?z6 $jOu[]|Uj#'ףC)Ӟ5(T#z;6mS'm&I ըcxD_Ϣ%4R ۺJO>qfoTօIe7Nӟsڸz|=Qǒ嗝$On(FtZ~ K|('9p)X J+Q("""""oqOej),zGew3AuФE= ;E|J:veѼ\>2ؾb'N0qK>g0Юl>8v3SY1o>YjQ=cI?KdI9oCW-p:פ..>s;v`$ALL~9c.ɇ d}x"E;P?4Gb8w,R-j8~ Y@829t2wqM@XDDDD}GGQ5`& {KQƧTD*( "E^{  Bf? (*H{s8NvޙY{(kN"kȚ$N`KOdE0՗s.<ҾQsp&6Sgse$%M)ry#83-)sh1J8~^ """""" yapH FjP Z䱁0q%ɸ`q'N_r{`I8c//3k-Sn!;OL#r:nΔ@^*>֔ZY MWOӉ94P,|rÕ V1mFv%`Hd2@JxIL};TT_҃Xv+ccfEiۡ |=yW%b/Yuqj0F=zkĻ}e>͋66/Wʮ#ODDDDDDvX8andӌ  z^T<ͫ΅<_EDDDDDDv/C\yڲӚUU]4'"""""q]ƹEDDDDD6((((((((((((((((\@DDDDDDu˗ Ƚ>nw5fL`{a8~3 xcxs,4!M5""""""j,"""""r0e?z<EDDDDDDXDDDDDDDXDDDDDD>">DaEDDDN_3)}9^ ,""""w(:NmoNRR G?A<1W i*gP`לN'knϿc "wIRRYvNSjEDDDٞjgꌹTVt$o`,44qNaL>ժ`qOT-jEDDD_JKKnz:g+r̳Ow ",v4.NTˣ.IIIj,"""",SXNH /;ᝬ߇3U"""""!=K/e`Ee!""rQ M`yϴs0+ 'B m=LZ iPtinQ(8о?~&|Gᙏ xot)Kۺ " V(BHM߻/ߎs|_Zx/>)Nut*x]h7؁7~_|/#wMտ,8WE:P/nf:#uؼ ~9 smF,@!}[Xk:>Xҭc wN.CסI(Ԛ^mN,siGuĕB^V4 x;~;Lfx~_0& Xqs5pI c8궠malQk0/q:$WN ee=rŞxFv"QIFsX@Oѥ?Qg{=e|93rP73&HwiLcFIYnO tɦٹ$ɭpz[ٓ۷K/Gyiժ={TA)ͻ\ o ٘R6Ha$-[4LOތ ȇm~8nqn֦l -fxI*{JmMɖ9-` QhNJR\p>|̣8AT"&I(mϣHq 8qy2uhk>!{6^weѰq ?[uDF\Jp\S/]KECz˙#o QQ6i?0`8}si7JhL\W0wF^ՓFcN,ؑǎݑ~ jCaiނ6q8$8#8c~(/;~T;q% 'cM+rMY`T;r-A y;y)yZ,nKY1Gr2, 2pj<̑~=#jOՁz0n8:u믿NJJ |GjՊqa= SwL3k G&b*>9KcܾJ|.pVdH69rލ,^5sfܽ=Yܯ6c{^ufjmf>Lǵ2ҾQA~xE[qfs6cI|;E_a$"""ţ;{ŚIgf ^/!!- 8aᅬT.‰?eiS 2zPI⹯7yXl5w-,ٿ^e^߄I&Ѿ}{yZjŤIpqqQ!mlm\.d= PK#ؚD2V.c3,JO?*͊31?ƾثf˰g_ g_eic}[2-ruPIK1B Hȑ|_"\?jWɓ\ <φ/!}rCmш*.7NըOeS'3nof,LOu 9;c7= ,z-ӯC9F͟7Ե78;NϘW(sHwǰ!GH.Fɟ { VO;r{ wen$Dsg Pc>rl3rP* y-2n,C.bAt EL7ڶmK۶m4i*;Y͖yy:h{~Ȋ*hX!rݳ;'*5fȮPYVwp6;y$\fyǶ*2Y5۸4,>m(/ '#Oҹ?ֈMLQ4LpqfB hL+_rý?G,'p%wjފӿaڜiG6vXaI)VGR/νWJ Ka,Dž d]>MrY`,n&\ B%eկ-5DOG|Ҿ,Lw<[kR rw q{|Q[)x{v/c$tR:LrզW3K-bq|<ψ^|Njqr֯ x˷/}bY+ң=e] \/fBL:t,"""7ke 8$}Ҷ4i';c Q=1[m/Sn[*uŇŮ4hر*qf۞xn>u5i+'1zwo߭ _O, +ShˍM|$m[R!C]Gj|0;m :w2_OR؛79v\~{<m7CFլC+5gPVջͻ-i~[cӑ4ző<\-ZvɐG MKKnGg߫<ڗ=+`' VU͠EDDDvrqq_`6_Vͪ& """"r/MMW.̵U|}a7KQ]pCD```k9 """"""<է@AbT4P""""""ł+/Ofꢗ܃ bE_\]]~EDDDDD| r ^."""""r_Yʮw^}IDDDDDD """""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""","""""" """"""" """"""" 0ھc ADDDDDEDDDDDD5VI~K0ĝ2 adq= c0MN>|Gfj <ͮIh5 aٳ;ih<$Rv[#12-? tOE<:y^GES'(2Kњ\3+r߇Yh ~߿1My6k6x(#;-价ǐ Vv})/o7}ͲNO3Jbp/זo̐oƗ0sTV<^y<|̦)sp5K"/Q>Jy?M<9qjs%bbd۱wlC_0#X+KP ?{G_no5Yz}pj]{NdF yj3SqdG]F5%,!qԪ-0ݑ$8\9Mҍҷ'~6"M_j@<;ƌcȪجi'/ףeR&шPI^-DѸ_Ozp5x*K"RI1\Y<^,y(_Nz2s17ϢHg:Vo[ݷ׾IΝhYtpta:?=U s|ޚuL\9>coޕ 7%>TTNM4mG@6q\,q +>nK5*c>`x%`X^mYs:p $$&p%[8r=Ǟ烘;c{1XS=Y=e=a8VNߎ9R2^ɘ'mt-~cɷ-C>wC29 cμ/5c:KӯCN]1'V\;Ż2_LFCt՘ . yz0[%͢H7=( -Q(~ڴ h_8a2my/`^A&(re} 3VJ,m7 Q*st+N>ۿTضFvn 9Q:稟s+rڀZXMh[WEOԏ%p&ϙƒ0 }>sܺ]]чRfpzc`g`.v"ƽ雔2j7-}> sf' $M"((eG.c|8ǕM7W*R'.c@I5c⻥l#7cӃw6E  Jjv)kf'!юkau~aawvS@?쪪uKe/rhlCL<ǢIp8o^@f8yChAgc4vcO11 52hw|ӟ7.%<Y ۬V3pJ!vvđl6yǸRn^)dv.FR®m(?RPf~X7N@GLcqhŜXTOGDSFx~+c/y 5&)2ꑯDt=8l4˪T&lZh OW '~C)4Jbk6T<,#ȵrS f S֥.9rZb-͛IFxcM6tN||.-flT[R[}gg>B&~EJؕr'5/X1 şhAÃ3X?{BW=Zڥ3U%W'v>}#;G. ({`[SM0ѣ ˷+2?K.W0| bOnVQ?J~0of TNAc@>SM<'7༵kc=:f#Q^{D^$""""3Zhaڝ&'CҟP|;Lp8$$\oSiU }=+qhnE~IL#;GBXF*p YdM\,S֧et!6/e܉4@6e{fYUФ~iV;[t-޹3VvMI:q c%s3=oi;=vM4-ZAr-9(Jn-Sp!5Sgwe #-^nH뭔[>mMyf35 Βx\q;ײRy\ .}HVř8SWSu((M .8(īÙ]\7sQn+* ɂ~o[W')qhԷEJOsUI맲Գ.M}ce=ao Xc֒yv}J>h;Olc։?8mlp-BF۾y)ҹ%OfB柴l4}Fl6nZ '*c\,;OM6q[kX`KI 3r0ʰ(m`O;)ҝ;/5/7]}09[]i >Y?Nֆm>sT~2붣Ov}i_ݱ< ZX3%ӄ oGdI4 MDDDDDD?iިUc||mKE>8-@xo65[[w{bmlԷ{0+k^MyC^y[Gm*WLL@.fv,1'""""" wKFebA'u|s7 Ӕ.UaN6M#{tK;Cna}}oѸUHeqfvR2¯Ō4L؛[8plVՊV@9 |lvI5= w 9UWDDDDAdh´;MN"9|/4-- AB%f>7jU{!џc}}͚d[c(38boF:T""""r[>sn^bX6iTve@]T  sXp#/UX#SCqXDDDDA,s\OqKI ||FtIf4K{udJQDDDDDXKV|ًzGT"""""r]'ŧ6'fMVq(M w%s؏L"[OŒ~udxio,;1}ZP!"""""$5ůæ+L_vJ}#tpX;QDDDDDI-?dCJ\PzѬ${o].,[̱5qZ}5dho8xܶ};T [Ir^$vm`WYrKlϖqp](+W&<ǒ/2 K*(:G SS> bD3_.''aCbsyߐNE͏f",D¦d؈2/W=RԌde, ?`%0R[-Ҙ>EQ%5UG1bQ3?^Q3C|ƧOѦKPl@4UXՕ3i+"""""" EZp Y?xF!^,jxF=LK VTR ܕψQ6-ㄏ/7H'u Ќ`2xҕBm|t9`Q+#\8e 9 pe0qj@ϪD#ٰ`Q~h\8٘R|9n%G'6HXȵ͚ _| J߉U3}c?:n:{ho nVΏ{)<19"""""pQ87/'G n@™k֦D%[ A`L$>w2j_-DY_IQA>8>Kę(qE8IU"""""" {)j$_lhP8~n /#Masn8=gQ k3{)m[6\`8\rRX_?p4_DyuP3mgmߜƯ^Qgz=2e66׍]A!""""" #+֌"9v#o9.gMyվk+ d!!kj$eufZ4k_,>ع v xlMu03e9JԲ|kƱl:DDDDDDAk6 sBUC tgfA"'f%5<ݭ}g1ynO3)"1kg$cEZɡԃDDDDDR 1nkZ(?.7'6d MLj@EDDDDD&5W/F3il=~o,_2c^Nw.x.aF4#)ݔfc)?b蘕ON=։G:g/:2R,_9}\tm*;(oi.|g@O_>fׁ^`Fqfwj;vjܗf^͏xf\޽^W>zrfCI7w"q?leܻOˋG9,7ICѶ@Z0li _Fgm,М@ ܤ᳙I2xڷ4+wzK~.XIr,64ˎ3*I3%}"lH|73^ɗ?-Ǔo<J)B,#n+"""",7 vg2ax&DޢkY+'/fgP{ >9MYG[1ehԹ%3sBcNՌ4[?Kl4g/j߿ Ҏd .j@oygC(]:k0uBM ϽV|oi\WPu >51#I׎xa҅pdVƒA#|ГϿ,Ն( .8(ī͞ſ"MزdsxtF%q%;:2a3!{U:HS YĆ}wuԵvU;(ҫ@PL|WpwL{ ' ;"bAG$֬isip:l䓩=:zxo-ɰ$Mg)yqTl&۩΢#c9É3ٙ74kaٴw7} %dOztߝztPLֶL#Wӷz@K$I~keLzfғc/IC6| t~B *[Cmf@T~$fDggsC* gn -sʩ7c  RjEDr̝p̾Y+0%I$XBr>?x -Q0pNl:KH' hV: +:uD@N23eW.7qFr&9& ׸5-*Eҟt u/8$Hc+Pi1ȁp!'>Ży#@!R<$%I$XTQ m[(ޗ{M` FbZ0 :c.ݥyt4Jde. -$uӀ/f2眎8@e6mC3/׎D5wk;D Vg6cn/?,lޔ ƴ6{ۘ,$ȣ<[g%[.Zg78cV$I2Dv"W^n%!ûĠG24.œx_Go罻%gsBA4.Hg[qۿRg~Ɲ7T>b4b|`! 5>CFq\sѥr?”>q\S9볥$ќaSLvǝ׋肝Y$I!"0dȐpaqɥoӳf׿PTTĮ]T2x7]ƺg%I$fLy]ˣqqDFFoCVv/^Kn{?n԰>$IC@I憷<+&dքqܼ4ׁ$I$ܽI\o$I$I2\%k?c$6{LJ$I␾8`/KI%@NP#B$I '@ko"Q$Id.{I$I$e:wl% pjGI$I2˦M{/L{Zy-$I$5 YG5 z4ny#V%;($Id=E5 yݍE7.8!yMd'Sy.gwΦs8D\VʄV@a\5ɐث##3l$I$2Y;7|R߱LtmmLFb<ʱCg-,O)`뗼'SQtˉ7>̯loLVUaXu7du~MhS%@t=-ǻ붳bcu6nFpiRשYbw(׻6S?\ݣFPzh׃C(~m$I$ Vׅ[^߷rʣKظ3DŸcogTnP?9\ 3'fڧkx {-5LpoWOrZxaw1nC%I$kNɈ_2fm+MuPToӂmZg7Aq(bcV¿l]K;{M:PkV| u+2|}FSUG֤Mlo؇K^|Ǵ!&{Kf I$Ie]!7o_?]._~ 1`x>i GRs\zGd:rFf0=mjE@z+d[86N@ U8z@K(_Gg5^dgj6S0=q3y.36ǰ}uG硜[~ ѵ:nn@K*OԯxYKHéc9~5պ$yy(M7l\hl$I$u!C ìON`;-))lO> .~pOp$]ˣI$IRرlA""~J]tqXI$I!$I$"_yy$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$X$I$X$I$X$I$X$I$X$I$X$I2w$I$~C.@m)QRR%I$I2DFFR!(8pD ܹj IDATY$I'/@"##_I$IG@G|AWI$I:tB}-?~JX$Ig߃6H$IC,I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%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$$I$$I$$I$Uw_Cq"C$I:)OB ._eNSY7.gLze_NF~JUhޡ7cG~g b ]>i{`0[s'qv*^#FTyfX6|K':Z=SBW\q̉?_G<7Wғ3"3բ% clRD5 5%ųpʍ}X5uph~㎨d}>'Mb0iW/t>~ulwnij%J~ w$IC;q9ҡxl+oP"Qdmׯg[8rPmY'uSNCOypz'{_o!;Gz1{'\ԋyv59[$}OSpƴMԽV^ToQ8EXX&tYex䲻y!*ww0nd03pߍo4-S!u=sv7E&c׵Pw\:(X#}⦃kULQL9M|;k<} `@8w>̤˘8`-Y7 i ܺ"S' ] 絋{yp:e1Éߜ7Ngt7l:O&%I#'3vFCu|Y;-Q޼<|˺Z]QQԏ_b9:L2PPMAmI&t CϬ$f>pdx2bPcGݔO>ƱŌh..Ϫ 0%Uuxe|pA?u.9a CjtH)>R1\֯1?ArtڟbN<#-FjjҮ^lgs'-Fe|Y =_x)KY5 c$ _wĔs;nwŽTнZ…OyfQKy_-vn # -:@ t(Uk&S_6j](7mFlHMa AroQTEJ[SH. & b@rv0̣$Xj +$2Ͼ@a壷Mi\~ɑl{f6޳0p귢S\+)j…_0[J:G:;o1ݩYH@42vV9'CMfz4;J"c[ސ Q/H'I\~?A~Od䝃K'GytjV^Ĵx{9seWl^ܪ#GV .ewu ̾!FNyz1MjQ' ɬoH. ]́u7Ng]WD P.7@ƴiՄV "+Qnl^}]^zI.,)NQG$C>-o`d޸A:% pɗqSXWIXE#:Ѿ\1_1f_'>$> + HK:ETdUKxU ܴ׋7ӥ̟2V&kwz `I v'tk/⒎Yw(}]̭L 3xs x }Alݔ.ł2UbGz )љkNo *2gܕf|g8zXO@64|{{ɪLa" CߒaGTa>_CƟʕl(52Hw25m{\έ/ĜO{q Z139'1#LNaְE8b^󟟏yfus%>~Op rٞe #sXz_}33So?U[s7r~lylI $A>+ lUР's??8Gm/ļLYDdju:{ *4!C ìON`;-))]r2e{B:HO}Ϭ׭M"It(yy^"..H""~I_l.~ܨa}$I$TeI$ $I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$$I$,"FJZ$Itk٬P؝,I$IO-I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$I2%I$IH@s%<7m&/?$V!aC0D:8,b +֬3~%IcŚu\{ǃb"~ / I;>bkg qYsܭIbe;7" "27u[qⅣ9mEOmJ Hs~~M筋oܶL| r)'>{'~z7gClM$D@q4եIB=.U6g 6؍v|D޹}7ŏ! {&]'oے\(tůqS~&OzOX^^ I?JgYFy߶n=54.Wz 4 CVMm[ĺ4ؕMa\~tWJMc&ȟ5ʳ;0ū|2r(⫷x^* hsJXK9'I?ɬ,ל16'YO릮JaWF4 d3brC.f`ONņvq]JJ߸׾'<_N`)W2奓K:u;>gtzŹ!6/.?rrG;cCJ](S^;A#5lXPo(jܶ6dֲeiiֶɞӡ@ 5,φ՛=b$I+ڔʦڿ}|F ;޼6QxA$gO>~~& *ϧ|vg6YFj>y uI ÆfFSxzU;2ߞ[;K b4 ̸^n [rOԺf>~afT7}Yn2?kgqԝ :'"Q1.!6/, S16{^Ź{%I$q6LQԮ؊3{D1cSi,K ЪqmZb@h {ӭx#39[YUL6$A@&Ss}2EYjQ*]nXɻ7ÝA@$-OMJgc3:EPd)*[4*B"BY +Wu# eQ4l\,cVM mIeStM)o>0צ+̈́nycUy^[J(cEԽ|KH%T gWw[!JS56@Nnֵ}g.b1%I 4 U.nWNu$ŕov[.]vfHM3 RjԤ]TltSXU@F-26YTMd^)]sVښ ݮڹm }j,;E.z67:Vm֦5$D 5jNjҮAy3 iѶG$IX] DE mGg~fR5m QDQϢ;/eUOoX6gMܞCڔ[yuv^z N0G4<^*VsuxEdrq|pN\@掬=zɐ"b7ߞ(": M/SܱϼݻG+PF .ǟ1K^u3$Y̆m"{Т<<= ܜV>Cnx=՛=/UvHKi۪Q8 vӰym iּ>QDcn/ ًnu\҉ MeG͆8?Jdܪ Ocwpc}8И 'M`dvLD&>2LEDbiÇnxvgհ\?{*-YZg g$e<{,/:ߕ>Hx^$F {wd[{ ^Ȗt_\?:V Jǔ($y^3{hjhբUi6ōÔٔ^^ tsF""f-P˶GӠq׳,倪]9L.s0Ƭf⓷3BQ1jە{Mb?w!C ìON`;-))]r2e{BڏY_ttZm[̥4{6>(>iBfP,|C?~Pٚcq}̄sbO}vFVuDjD*|Fxt*IhƔ:^E気%22_^<]tq tH A_# jĒ_fW>\q|{~mɉc9a*?@ R`NoXr3>V"E|9%\ ة?#wqʋ3H}ZWDnF*s_}w68FL>8DSΆy( ԧyCTG( TGQ}XLZq5g~n73o |Y%DPt1bjJ댿}Ϣ=vDjH ~|; ZȜ;:I$,-(]o{Xf$C;W7{Rv%Qtq m_Jc<=}V>$I:E8RPJETsF3Y($+}'!rc9}4 PՄ2}BSʿn8T!UѮB鏈#/MEۨ<imc]y 18+Q@Ӯk1MZf6hg9Gr6oAv:%M06Z5cD"0(nI32Er !y K஽cٮ#v ms&ɸW,K_'t 31w{`@qVpT%f$I.g2xu8.ycֆT}"7-OQTS4I, ݢ9b B5yټJvfApTl!xOKO(bG^$-C3 a&O_[I7eB|F otY{όl!m"tLB|wҚ># i1 |ͩG.k!? ]CZn+&jU 4n{I拯6 Vc[M,|[S;6o?vZѥI9X!Z Qtw5#H=$:*(M&DGɭ؀&Uea"wm#ynhq,?O2_ItsX*+̊7dR.B[Κ]BZ #nִ$P*BZ֦g0iުeӮRJzU {?UҸ PDֺw1K0:y @zMl=;3}K.]Ϯmi up KgY,&]L6s-'+~E?o_Fo-нN9j@Znh2~(m_mY8(d˔Wx ~JҾiw8tjd{Im~y&&?'jɱc1ǟe{ҾemY5{\vVm͆ rE >uGpr誣^#v.x7dHm0KeFvT(#LA @jY ߑ*ANO^\DSx}_9e1 D4ߝ^MU!c6sQU 3ylxgF >>gIT6e6gtYXPߚƖQp6:@DW"1146f~P v}TpkP9֭;U]hTMhrըY#PRws $&&)̢]V^81vTM/9Q\#t0Q2vlqA*ըN}hH~{)_/~}` +ٱ46X<fu[ I@~n 摑ܖs3;IK1PGjr|lvwl)̃>ylK%RHVzY?2F'$Ieg^߽:t۫Ĭ7^9$ISEwy| I`I$I!$I$$I$.**r$I$Ie? I$IR8p`85m+P!I$I*5O{#$I$̩Z _~1'_1U8*$I2Jg5p#I$I*+>,Y>ʹiIENDB`fastapi-0.110.3/docs/en/docs/img/index/index-04-swagger-03.png000066400000000000000000002037641461403617600234070ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwxTUI#I: M:Ҕ"^ײJ\q] (M %HBHBz2G $$@*|?s[s9L8t:N'f2<6!!=^N&,""""""UnrvYda &--Cxۭ*l6aPfѣ!5kM||jHDDDDD v{x\mɂl1 a~Lx<7j%77xOjy<.# wfJϱ9~,GFFiiiX,䯷8\Nu{ˆ#!!BJ/~8~,3 tT-/jժz=.<˙LfT}l5c1. 3j-{TXDDDDDDvqw3f̨ ={SNt^߲p:{=3CGX%?.Z4ٳ0ylf[YlZ{ ì^"rpx\.UT{ 0f(&ORάif)3E3`)o\?]"WÜ7j='lUT|cŮ?->ty:tgѢ<:tDS`_+Ϗ`UTc|m9_0.kZïj-U2aalGnNNl,Jw)Jb-f 6T%6NW9^$,/""""v_C,}^|r Nu) }`3竫K =(e=SKa""±ڋ^)w%w^h>nd22w+8'DH%|׳ / tYLgϹ Wgd*ߗ?ͽޓ~ xuf`{gɓ]- "\ըm`j6]nfS^tmS::r 3JgKEV^E"T;*˲Bv e3ۊfKGrL$"W{b" $ۺsI2E.6}_3SWȕ[h ,"""Rǎ'<,W6ϕN+}?|.y8dhP|AWXnN4Út x2kTw""""dpX,ǏVʶ {=v|.[.fBL7EO%g:e8&97")݆#3N~x꾷 ӭsYxd$plf~N?0 <~znDmoߙn;רϘOͳ'>z̞g1D@ --dXDDDfK2յ+*'Ɠ][7-Y$ƄalYz}+!T;c[7cFܻ3(!}yO3(m s?Sv|Er],R\ UݓOӷvChΌ™knOq׌Ei]#9蟼D%c)|X5/am2]ZӶ\7uʒ3z ^DDDDDR.Zn4N/h)^̭y1wKrQ|TlsϿ'; 3 SK祹>S~S{(husqg]xYYc-98F#fvx uvz7Sm3\diA&gw=G /MŬ]p:+;Ji9jѶi=^2ʩI#_ԣOUlu"t_9i ?-]Fk:/tMGnOKTc@DDDD|d;<瘳o K,ܵoW5jMy)mupרŨa]16d7A)zՇ$ U},>Ԋh5'ߒp^ xXX|IVvV]+DcJ?e8j;6mՂ2wAVH:8aKf-9^0{:K }#"^ /~Li3ѱD~ezpb#\(g}yaܕoAsO^sMG `m.q'ߧ1/<0¶(yßIn\3[{Z`o96?|`à+~ܰy ֣ [)M3U:l$0q]Ǟo!ݝ_yIO|K0gbڝ3#L'm'K?ҲbOx񽟈9%ݼسKңs3~_HA|)}Z98]uٴmٳf'9⒔jҒfV"..':>dY3y륪 e(ኈp0e$B'7t35WMc'Hrp#/f? g̨~Տt*v-Ըix+7_͕wi&ވݴ#q-t|S޽A;؁W\6bՓ>.M#C/e-S$2gy5 wap#MM%-3}1{|> f۬U.QsrlqOgaLDϛşOҁ.Ud{ߑ"+g ,'t'!<;zfafg21~#>`oGk52+b~dWi˲o`ĠnnXil?) 0왜8LӣP8/ -[iz2mޔkïq%3?Ȅ&Ң{VJVɌxm漩NFH8)ϽǻsIꑽ.W&}X5HUf :t{9\>5kyg?ȴGe)#W{>3]P2RҒ+|O?XDDDDJѸQK\y~Ph[8Iv`9QLrTe U|u\4ejOP=5g/)JRFXF%T_\_u/ehJZXDDDD25Tl2Dϴ+UTlDR+:+HU Y5&RpigBpyWWDDDDZ6 6_՘HSA[/""""RU/&ox _=(j |EDDD`ՂjK*`Rs\lHU 6_?US"W l~]) d2 Ɍ͆٪E:&,>>8vn7 ǫOZ|X-X#\Ғ =֨V"""""","""""" """"""" """""""UF׃W#\na```20̘jT2z=nN(\ٽx{c5s/>;z4mBTt4={9q_M׋#שYDDDD dy-et*k7k1 ݻS-,T.OJB|e;Ił?yIBp.yg ^Νҹ3# wޥM֌r`]{~UcDyDGG?j?ϙCzz>=hϦɅ{liu]}7s8W\tv2=szb;nfZ\:)))<9q'L`aJ]0HH?>}.֓}m~}z?^#(833` -o}G`@ wzK==R\uL2 NVN6s~Ü搕̈́ngꔩtMTUAV@nPc:oEmƋ\.}_~چ[ӛ6o֌j3w!!!mϨ#idRZԮ9~iSR.5kgJm s<>a'%'ŗShA+dnTӇ"vl瓏?PBiԘG} V\Y#b 5z^;uz?a#?cZc'}:mgg :~,R}y@F%Ō#ӌ>sS7|3 ʽ 3Z4&0q;ѹDDDDҫw{=C|Jr|5rzY~/U٣g/s{f{Rx|ML&^?Ŕ/Q71uڴlJ OdX4~m#p\L^o_%&chV'cwd3k1̸&iͭ֕ԿƢooԆF}lryTbdm{K>WIlm1k][U'i׬ <XZqXжxluiJ'&`>@"zaԶI;_ο?k^mՐIò~J70cj8R4[REDDD oQ-0jA m۶|0:FFF:dddY:$$;nODD K!]wңG`'IÍ@l;) AA|T玅粵{_̊)z_fhW-jkI#ѮMq29x-5>$hެ?CkME9éo!!`b)Gl[z&ʷ>.+uϪׂ6$vJw(Mas9!uzo1q.W,db g cFq]&ËMKV븽g=2gY\.F<TKDDD`y19v;Y8p-[`6ڭ{$88՚4HMK qc3j46_[ с3{|3degWZ]A*4;R?-H9d ӥ^R3hΦM,/վkB9muc_()jRݛEƩ9$%T-B\f^5}?K>ߟۖoɰL59hÏ 8mz>,r^FL,ftoh"<BFMNМ-qllVFCI5N׈/XUxp,:ʉ,$?9RRywyGi_W3ٞn`Ҥ1& X>cK.3Vff&~_]quWp* U.ZK{ONv6k׬'$$дYS7jȞ}.X6$$yW/I8R~ɄY {D>/>{}qNw M2/£[g%(Mْ2&Ȟ@ԞXqW}`G^kԣMCR$ ȩQ v(KNH(ͧ{lfq4Frē ߥfHsA~+zqc.Zvm㹮Kgڵm]6>!M|&MOFu<.gO츜"eB1 ;o#cHF2F@^ i)!5=E\jn˖?ABI^>U;~tlH#o ,2 3N[Y-hJTt^6Nw(ZӟZ۾̴Q` r""""p8|g޽nݺc9Cnٽ{7YoE^ W?x#oЯOu7`|{֫wI_3`АJo|%`?J /Ğkw^1ڶn͍˔i %]vmZ7okێ*?{{m*f+- IDAT\YTj*oO<}j ?vmأֿl7Tj˖~yxx.a x<P1pvϱ<|H>NuK< 'o>6l)~e@{=ŏK~%pz>s}qÐ1wsr[١i;;H]?u`ŝIf!R^eI{{X|IK_}(}Æc9F^"&=DDDDaFXXnKb6۷fǃdža/wsmŪ_{XjzSRYlÇ_~ƍ/˖_`C:^b fŦ3sedÏ\ OX~ dQDFFҴIcP>wdaJRT""""W-[Cw~?nڵ7v-㏈*?T.߾Փ11̚5으;v7UYb%ʜ)-lQF *?Ks\8J=j-"iޢQQs搞By\{mt-S7īBDDDD0ݺw'+3;w]aojl, br8==i_}ʫrj5EP*U""""W.ld~+j*abU'kT"""">6*TW i2cCDDDDjz`m Rbs)ߑteݽ͆b,fl6_L5/ """"rf_i&Ll6Lfߊ{B&n ]i\y }(T&kX&3o Rbbq{p{xx번0 L&3& YtLf& 4F@DDDDDDEDDDDDDEDDDDDD"fVDDDDDD;wT!-=ҥk-"""""" """""","""""","""""","""""",""""""Rns,""""""[,""""""U2\u4!آ⦛o*s,"""""" """""","""""",""""""Rh,m۶e;vXr((((((((((((((((((\,ټ}7{p\Rk!46[4mvWeU$dƑrUY,'vo:ֿ%X(\-c%eT~ж;9r#Y6ƌDF}^̩Y{|.1GI s%ո^ \w׳/I=WjZ͡c ӷ<_f1}ĜZ EDDDD~W}xW,vz>ƎOm-YHQx~hikPFmD4$KOA@Ttڙ=I܁ 7Ho3[95Gߛ笿[G]G@̽2cnNJcޞ ,1G_=؄`ԝ!7u]I~qnFm]Gg%;}˚t!O0p| 3y?{nyWݡEDDDwC-WܝS49'{o,~.V,[i\'zz|YV>ooΒy+oÈ^ X l-㮣Foqp7w?F۪ZsKjZ.vݶZ~ZpGۨ5Kw>OI4|;7܏fVv4U#?86yIly _n{CФ|8'_eoHq?B_nf'"""" r)e||>+kW}_t v9cəLԔW?qg@}x7e PY7Mx|м][ؽcӬmRP.ɱO\U F=Ǧl'&T$MM&^lVO:'2O;Vew+_9y\O.vGCDDDDDX*[Fʹ4ڼKٗN+dS '5v;!Þ T+.0p8z|7ɵ0pf@_RKBV|GAym?fԳjѪf#)K%7<f>7rS9؋ ;,6_"Sm3Hs YG-dee_X]n`w eBP'ֳ̄h%$9=jЏ:CFj!(~ͨe)<2_T^Qh 2/eOqj6/6.sY3U_/c(%nX֤{eEF%.(mj~^ubNMZu jT乇z;$S{Լ0f/NeZ߀rsJmiD~iHèof۞Z ϶@ؿ03׫[NjfrxlC־5F֞$6b6X6-a1 khZu o ǢGs趝hs=zuk<1i9p{RamөG-GyӵfK813 +~/s[`ZXvm!ìX=CDT&Rh"L\N&Ǐ:z)("""" WT|>Q#/t9+#6?z\|D?{YL&ȿV`]9Yxgnǹ!<]#3tatUyɍ\!Z <#䕿 n Wfza-aٷ Gvrow.?q3iϼmWnTn,:'Nob؜3vh<݁ÏQr`'ȏDqGCU _ H6Sf%+s-CLvQ ә0sCDDDDDͶsKؒʿ̟_u)f~T{4<*3%gEڊ)q"B[e YzNgot@K][۴eY3,7zѻG{m6miLd=ƊSXQpۘ6lVVm>yƵcl8:T^ubɟυ){>ӏp,,f?)>`=6:OAQZ8No_&- vش`. 3φ$RX2i&fmLcXڤ$f J5Yq|}m1_Ͼ-ll`F+ӷ<َodbSPDDDDBҋ_` О^`fl`MXѹs*a޺B{nf~v+-wO>χs󗝚>A Az-py;I.:nu+V-UGܐP=snVl!o*%{ؼ)⠈ _F;a /)%2WcA4i~rj\NdW W6F+j\O@Qj؏#F#mװp9[su`朘E9p:3s n֢HfCpع0!aԋA4Q{ҳ`붭h7h, djP7r/AѴҤQ8O;fCğ8Yf^ڴlµڜ巸`7ό/0:tBzDM+"""" WoF"OKl@:NU<5} Oy5S4Dj Ȓ~`zlk&FMڛy_٫ְuh7i=tmN{*q',ϛ8(20@zD/&vؑ}}mډ];]׹LѵCD_0qm)3~tWL\Ӳt6Fm˼9g˩]|qDfEv[6\>mZqYG|.X)'Yd?sAرd=' )Uwqˊ:zǚf`nҕz[]O]dW%bВ=8Ȭ5I^R^#O>wYDDDDDDb*O~oϙLg1eh$߶Y֢}h>MtS?oĜvkhQ_ ӷsxEfo,;FDDDDDبO!P8ZV|-$mq2 h *lks&DڌJ繟t5ƿ=mv[FbÉ+9;v˖B#D;;1ܹnբŀ!#y>Ի@w[CWxKm ~6giWᕽu273pun8-*,S:طΰIlhkC _,V,9wTIW X!dZ̝9%;sd6v iѥ/oN5NP;Ͽ~fD2\ԧeq{cϋYn'T6A?'is:qqۍIy'5Bjޤ]+ 1osrNz*u5w  ӧ.gÑt{GDDDDDcС^KiU!-=m۶9;vK7jpw9MXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDJb񬣼«3qEDDDDDJa2_2- }7Hwc͖.bYS۟WYqim)v8LtQWZA\2#ے\͂^RCbD^?`'lP^ASs.ONr؃v28`r`ppI^ښ)78mqx(ëH8OZdK^ee[8<1OZBǐZ!vI1xeq u-qt;f8au]ì+TDDDDD\M^+)SwpD5b'M,KLZ{\c9y*/w4b]) yn)"""""ru`' ~4uR3՝,?}oǗaV#d[m9jLWз?i8 3}caj|zo8w0&4;EO/0lK\ll6RsX|(. =0+irϰjf 82v6dx8PˏNa +'ܺ:EDDDDD*igwQ_-! =TiR+;{og˩`ox")"( ݝ $x~$z>fwfv;ɾΜ0?)F7 IDAT *8#`iiEL'Vz.^4dAiJ0vNXА,W*1f"s%Q^gD-IYyLbbm\gC,KXhϕeHEH\gI$Iz3$M2"d,M JCgT +=L nFZ:Xz1/uKY?f > Fo2-MQ 4͂Dz!8BMrq\n,-pބL^eK"'S,HE&˰+I$Iqq3Jټ}4=RMPr2^KF9=ZZʛ+˛RFީT|.ch Jf'(@i C'д, u[R@Y֤WYBoˢpGg/J](Ѳp"XB|S' 3e$I\Gv)^{&g݈FaBұi¡Y@y N_1,F=`=o>W<1ba&WɄ_9mUn{bM%8e"ɋِ<9hI922=2H%fm۪s}}g]@&9 5 pve\5tO\O:@ոcI$I_'۷oX OL~R\8`x9ifK-7dr<#I$IQ'LtmUԄ@RdDmNI$ILlX98m!I$I5T֬iƼzKnՒz81/I$IRfX$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$,I$IX$I$$I$I`I$I $I$%I$I2K$Id$I$,I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$%I$I2K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$$I$I`I$I $I$%I$I2K$Id$I$,I$IX$I$$I$i[Aq㇔Po\E?2,fܬ%,KH4ێ :u2/$I$mӜq̮̺I/`-#I$IɄ> 7saZWBAC5ޕNn>I$I2"/)Z0w-;l.α;NwN`îaa pK7sTv1a<88E:kݑn3،f+/9, < WNt_D |۷~\ǫ%aCYGryqtI$*..fٲe4mwͿ`rrrSjYIw_w'(HB}هMoӸqcr ~עmbft>xɫ;[NARۣksJV*ҹdv:$s)G۵Q#.#{&AF@!˖4p$I M6]%klNgѯ_y~ap9yߚo/y7mӔD8tӫa1\t {Ues27 kV ?~'_'U}M$I+/2;*ӌ3<&M~3$٫OȪ$Xee,[˗ (fpwc<X%z4m҂VE/+I$鷇&MЯ_?}gjO8#D(Yi WJkNuE@:h9l}?|Y58ץxqKx?8~_ɪRX/Z,I$mZhQfذa|Uϵh†jYӢ՝1IL6,R'DUqBAs8x땮[ϗXqM gY/Vtז$Iawy\>`>`rss TZг}NկY•cz^ՄqV s '߶3Գ SQ5mK,JUXk/ے<`ۘK(F3oOfj)=s#|(M@ُĵ,´oq %cdq<~l_HnX=]$I!c_HZۭVH! n}f7ࣷΔQR4{ӹi$Š*wK[ cۮ6څzV?\xӼ97n*7^={GAG;gz {+o1t>Dv;6غ[IW]'~̽\$I׫g`0Yt&ulE"XV}Z܇aiI)*g&phG:q!he v?js=_mcպ4.sCrptq?z&*Akn߰2_Wwۆ C.8ܳ[[r֡\o{.Xvi٠}Pwl:ǽ\$Io߾ay*dO?0I$I$FX zݻ6۸]V$I$1K$I $I$%I$I2K$Id$I$,I$IX$I$$I$I`I$IX$I$$I$I`I$I $I$%I$I[+O $ITKޱxCl͗'K\omޝ6$I$o´[qI$I2)7Nm6$Id$I$,I$IX$I$$I$I`J<B''$IT1IaQmCFD4(d4OONuqVkj*g]tZ+A9/ ,bL،S%I$\8~R)~^T25`lᒏʙ-+ᛂUBf0+ɒ BV4&9%,JUɥ=sc{}iތOs/3cұ:4xK?8K?u]>~O&*$'r.b1"9Mw®J.}Ffn3P/[?Û~"D=v'ak ;|:IϹ$I :vpH(1`"^-%Mqfve4&H fr,'ĉԉ3jT>i 1 &y{2K@Tv=mr&<gú{HdlΩO])8(aws+xUOǮseeO}yܪ]%^p ;K^Bf9$d'ɻc 9wO1$IXF dWEoJ"zRn{s.% 0MX @4(| iH4Uq[_,|ǓIaF: OKB(2=6_$=T.ݳ@8}$<-, Fv#hBl<|ۃ^YR־[,O|?6&"~z~>e@:#MO8g(A?NWq ɛx1}w O*3Ҡw]uPUe:ָ[y wフ:*H,>~r.acӭ9m'-5(cҐ|Ө#5_8;I7vƋf`2޿Fnv9usޝxQνuu>`GGl~=\Nu!r&˖㫉s_tӰY~zd 7LxᅭSγE‡'衳.В$I2+ EXy/@oMG٥ق4sVWy) ?Qs)u&h<~< \?^4 ! w ]dr|_Ii͖\m&[i] X:G5>o fA~\stǝ?"~Y(bE1CvV1 K, QVt֥>qks{$Nvy+,. &;EfTXX\XFݜqlU+JG:#'QÊ6 BѰANAV_̏~%I~6Wee ^?;yw H*U 6FٌK蒺x%w;MaS=;s_Wyl?™/G/BdFE2) {s\y?ՠ!{o⮓Nqߞ^Ӷ[w%k.Y=dzSas? rZcم .{/ʳ@ۅ\U潻RXtUnIcǞˇ1(Tvcwٔ].k{)r=3a:י$N۱[ƭyj ta$Iz!۷oX OL~_td2IAA!>_NwjGPR@t:EDDD2V(,Ii)$ rLi$,&\ HF$jQqm&%1O+g`~%Iwxi"rrbD"}=#'LtmUXH ɪO-nF"{Y96:ШqohoI$IXAБ|+I$'$I$%I$I2K$IdrJ6$Idɵ8]۸$I$d5,o#$(r7TM(=G8'$IdVk|~@%I$I5ɯ帚>$I : AafA-!I$I5̂4Wd9o Xӹ`I$I>f!XֆuZF֬/ ,I$I5̂4æ&(dDZ[^ggȭMK17]_Z&I$I5Elعiś['B,3 FI$4$9]Z$I$iWX\C: R4%aM$ITs/o:_I$I! !%I$I5[&$I$%I$I2K$Id$I$,I$IX$I$$I$I`I$I(W jK$Ij o7 n$I~W N+aJH&?ScI$IҺ bQ(Xh4Zk$/R)XXy >gj;$I$afk2rI$DUBx-Bp2daq;&eeÀ*rI$IRM1 ͧs+rE]KiID[p*b[6 8c=K$IjV9ZuLM2bn%kuRn]:L1jjnW$IjmE=?:wSm ,y.oY$IjV9Rc$I$medi$cY\šgGwQ?a{H$I|[~$5ݹi.icH$I2V/Luj$I$Pr6n3I$I`I$I $I$%I$I2kÒɽ!=j^+7趈̍q y?9ٝ[$I`mx2yhxx5}x5;n~8?a΂෿FtSW>=dS36VoTMfF:Q"jb/XԞk[#etCM"Ñ3k1u# j6e :Ѽ&4lޣ'aEէI+L&gg5 BbleOM8}a׃f$FarZ+I$3qT(Re4kv"l0%31+[W7^/7H.N1aV%!@2iLsJX Ku{& 6\=vyYjoE^Asjt.:tjʁtZ K,!щNtN-dҬ4\<'&tP;aWZ%w=!>̣;gG99~ZE-~f: | RиUG?HZ,cΘ[:"IdtQ/bEZ%J(7ei:fL\\u* #q"uOHGb <,I!%]z[*g3o}F{9*_<|!xuڊ)q/^%; 3l m> 3❪^gɇCx|5k˂z4܍=>#% H;ߖ#?M|.śNc̃Ͻ XF7lB.{rei5!=0xW,l/oW _Niz9WF| .KuO0`[p/O5DßyxH9AUU1<F}3%4ۄn?H} -xx O>`r8|LL5b3Mz+GK>#Jor|U??;b>7J!*xS%UmoΥ$A]Ʋ]×úDhP+%ANCa!e|Bw߃иm=2bj* lԮ#2Mg^5o5R_}'oTЈǓwL>6J"eeꟵ:mw_gy1Yy˹8q'S(_oLeiM3/-znn-iEo:&w'?t,.x8mƽ}ׅ!>m:KDp:6}$: f͟®s͎ yՉ̟[v/^:2~(Me_рֻRTiEz=+'Y {y6t)c71tR"W' ;$I2/ MHcqNUݪ}dkNsVT&74QHF%3S0>WW9Sz6kscg>Ƒ,Ym[dk0Bfm}WU}I8u*+ZEL.17ũ7wA6WFn%9 LyژI_25N Oړ1l)5TMp?O#;;{K;w@,c=n ɽ^*g$p_-bC%(9Nusзr=O箾sY/0=p;;ΜLZntFWf!os&zƿEi ].{Ǚpӥ\I (gμyW->_.b#: @n׋"%=gۛ6cW8_rp$ cx^Dfz\ؾ>o8+|y;_0I7vƋf`dϧӛn0qOz4 S_v_dŷLd74+!ָ)>yK^Xn~2)_yӿh%~I|t4~%Ix}DXI(4_oAI9+n ppԨ:/_e~H ߯, ocIP7;NS'ByaEf-iNopsӶls+wmOj{e茀TՅzxoL FMQڨ}7E$. g[ ˖R gtUM<@ivdg,+ !uy, (l'BunU2YlG7rgz8Ϧd+Wq?I9Kmߖ|ڝҏxpzENѧH@V:J'|ɗͷu Ķ}غ{|[3v >B(o6y+? 2ފ&!궤u>lܒ6Y -,(8~Ue8Y’Bw{N>cnϳߪbB}y{b7$I282 (P!kec.wKN+W7;"Q5{AÖ,5Q04ک?-ٍ8tMJcK޺^a$|38%0$=;ӖQ@4E*(,$Ɋ;Ȧyo?S 8y@mO*9v_nÜlg &!AGv.sƿ(d^Yño_X?Id^D5rجKBBnKؿe@U38c4 -N.ѿ, ȭu >~cG1!N<{F+;'՜ ž x}O|,7 x=#&;a*FK#kZ鲪c]E,AAa㝗{bπ+bx_q^{ɢ֝htݝ[+KzGyGݏ7'%%c=oѴ~@qR `K9}fki#xwԴ4^B~a)aPͷh_5]U1dyy8lc.l{ݽ4M|)!APɅYaЂ=:P/·39eCUd \u{4mM*o!KPl/=|?}uY\qpᄊocWg^l2m_?U#o|.{Mv?mO A'(oԁܟ&$hra!N9)5~'ρɋꞃ8x٩݀ܞk(#:akqN<}Lμ| =z $4. ?Ncx+:;xu7;Bۍ&!;/= G1)6an1nTY9/Y8^ozJ!Hr zechA[|)O9GWLt'!gr![;U?=05H,۷oX OL~_td2IAA!>զ92N-Tݶv x־~ EijFq8]Q/I$\ \J$Ij_q5}V%I$Iu :d̂[B$Iji:dr~c(s $IT}6/MCbh F٭Y_.65i%X$IjiMM2aQˉF2UQ['ś2bnJ3L$IjٰsӐ7-'NX,f H$hIrX$J!@OI$IҺmˇF1bXU6u~h4J$! ê$I$_ju $IT3Cpu hCJ$IjM I$I2K$Id$I$,I$IX$I$$I$I`I$I $I$Ql]@ޗ$I$ AT{o$I$I5'|AxV0$JL&+V ƒ$Iu|ŢDQbhVI^^MR'g;0ȟ&I$I5Efv{EYNShtl^L& д+to&I$I5ҟa>.&Y9HVVYW [a$I~늼lS~zT*Uk t2Cݩ$I$&kM1 pc~J$IRV5ϫW%I$Iu~5*^㟆-UedCX$Ic5< 6(-Vc-$I$:L$Iw(/q6n3I$I`I$I $I$%I$I2kw ^.7e< 'kX+=}[$I`mƱ(=xEdV~yCr՟\-_u zxex&qg/ɩv;;x{>5~$I+b6Ӈ X5B0%D9 s*pV4B׍saa{5V0Hϕb>|#dt~VqvܦIPMS6}Vļpv̷Y:'_e[Y}8d0OMKy6[tD_׌ta!/ /gRA]ԠFz-رqDۈ}ڋ?Űxf8c#I$ Cػs)B+F̘iE*Ju*]:UTCQE@֦fm7=?n<{so|jc?.+a=fW̿39@lG,ݵ8d,q~#0iY\[G[˄ vE|\ 3'JS/#IE/tz4m)xSgoVZfOdzȮv83c2ic$&Wh8{u}R*g`OZDYKlպyx"_߮ -n3wc{5uEDDDDN11MJд6Fhصq|:a;v Xo>~1 ܝnBfԥwX/z7<9e;eں3 Z=Ӡ;_u~; k~r2dË W 3OW˼h G/c5gTsq-e">uq$ㆿ_eMxnF2^u|.䳰-_O.a*m?XI~.|s[O '\/v.phwPcǑ IDAT3T2Np7fƕ׳l45y3P #OEg[S,<š#_xv:2W51[:\r=O`*kO`/LU5kcU\qAЗqCb4z; ǸԭPny~j ĸƅǬ31JwezŸ1Љ8<{?R4bט8~( ަˬ[)T> Pkj&r'.7LS|U=#cL#xqCͧOY=i.rLL#^@30ta…5!H=>m-xF j-_f4ۉzNh;=>msx;V=1=VOes8y0|{Ys u~EDD$_P !<5i;޸gZ0vE Z5/0:Mg`@)<ґc[ e9oO?iՄ,r l$2^{1 ҨF%j/Az>|eزKN`HJyWf$Iqd#3Jǵ[269%QvZ ^>XMjuel3k{g H FφZQb<W{oIGʄפ{2r5z1:-epI@<ܭzCG91 JSצ޴ӌAv"$v7ۣ!rݛPű%/nfmJ#ަf4˯I-%⡁-M0-/1dvؒ:u)*P'8(QK~c?2!ˆ%aݴ_: K욮`;1krhپ ,[YD8H^9c\#ybMU[AӼvNFdANLV|:՟m&tq[J$g-gV/n=~yӖ[ ClQl-s|+GNWc,;ّ)dFYB y>'h/ !=_ ɴs:Մۛ|9V v?Ns?|ǾVwªo@4Qsec,ɂ $'1m<.z=m6ة#>VwTJzZ G8ȳ͋\,@P 9/ d3?Q0aߜD\zƱ]:ݤ* >Gc ص9ˑӎf7w߿]V~}`seαyKYesOY;ɉ6̠ ,&ݵivr#qM`F0ͫ{j;ZΓa6x>tbR߇ 3rٽqKfINMME'FIr5P &Ǿ'X,̽umxk 9d%58" PM(eÊb]YiQR ;ksutdce]oOdVv&q1ss )z?݂}ǝO"Oؿ_]~dI >R2:!?8KlJH::{zlh> r L~}{[8x[6'\<=َt2׏DgwhyЋ~V ?Fg[(瑨 |\ kCu)FBWҽ'o;bӶwk_q-U\xݾtz-piwdKP|Bé[܉Y6j Ka~1m7($))AUڀ:六cb7M, nV'<]/~}Ed;[}Q,LRW,eEm 2$HM.zɽ_ݛu߁,&m:Ddt4@LŔ_1s[#㈉gT,C%Ih8-bSDl'Ө=ߤ8 ?kI^nv}L ҉ŇWV/#r,6\A^J tzz{d=N9!3U?dh4](k{?Y~W\Oܘ?y6a^S{~&ptqotDDDDDD(\^G'1[ح`qS{ 3UGVSY^""""""" """"""" """""""l#!"""""r`Ӵ;L{<mSS;77su2i}ignj`4_|n{k`LY:DDDDDDG߻ AXDDDDDDEDDDDDDEDDDDDDg%Sw~) P!(ȍ 7>+sa`4M,["0-HKW%w)^|VvP`ɳl_G~otGYy|v;_9&֪?!U@y)< 6l_aV'''R IpcB 7BHaGYnXXDDDDDnD&#]*\Y)* c,"""""","""""","""""","""""r]',n>ɫyp6]Mq *F͇v/<'3;TX+ٵ f8H :~ܮ|&Z Z SNrhaVOUHxGL"""""Wb,8P܀cr&=< 1W9:yrGNrۗlX(&1}QNNRyt(ɫypiɈz6(aD֍LjUL2q *zb@`0OSWDI^ۇvwӞl2IE_:sQgH&c߽&~&f?Mōrs4Ȉfq]#Y(#/=GRW,|"߮tb?p^н4.a0XBB&N@+ g`+!hS'z6,Xq m:C2<u!ʔ':N;Gה3$!3rc zq߻McX]jF,L%Q=8s#.ݖ~}F~gVp23u& W*Z1~'G= s#LFd?|3?xR%kLJgCxka>ʻ›}c`"|›k)mvH7!օ `-Ͼp_3Ǝͧ#H98J-7?1ra ] F)Gj30y,am5mDHxow;͌fլD@2woTi^bfYc'+N;XM0ݩ6){y&ԪO ![Wfa8AVu(Eoljt-mg7u/fR ¥ȁK_c/fG4kO`/SAzF:EzxwSjw|VlJq1qh4;htʆ]>Hx__ku,˶C8c{<^3P8ь~XxSOCe7S~r֝XCǺR=P)!הw#wѴ,0^.kaՈ4lYY 0,Gl.g)v 6Y7oF,YزŘii 7 Q*hjx&8RF̱ӎLß pόfͤŸHx$o'CPrmZܾ5{£+sot,~""""Vܒ} w0#alsZ/~ vb (ۤ9nxn#LOltN++-;T]@ptek֐j82?_&1g[cŸau9!}x?~?/w)/˽di>Z10qo/Bƃb.W1o ]4ͩ@1 xׇIktzVîu~K_ˀ`"""""X~8V'~Q+,}|ᓱ"S} E3:V y'˫ X8v}pT$nɧIHFHc)Gf(a?Ĭb#IHRP [-j*N4(F%Oluו:H; """"_5փf 5f l>-^页BqHs4}ȂKj.-2 brg-=`XR | , vXbNúp5*Čм fpJջ`P .a?(CuYwފ7[WX~fOu٬MNBo6o~ړw{~6]iº1lu/t݌e[9fxRշYg_F<(tjA|E'2"b曮e)ZW*3Ѱ'&\pYI<AG{=.= OL ɁKQq/A08&.ϲro-[Y9&Gq\ ٷ'7j"99?ugՑMil6ܺqL:Zs#uyðZa~ニ Kd"""{UPfBKC!DDDDDD䎠,"""""" """"""" """"""" """"""" """""rpF9W^EDDDD$oOfQT(y-ꔣ 7>8DDDDD$p{aDذOn*jEDDDD$O¯b!5ޏCᮂkPޏ^ Ţ|~Mb`uQ Y+`۱*|#'""""""ͯVx!緛ZliOn %"""""rX,8;;azT-V N3KDDDDDc, <+"""""rsMk5stsl|̈́n(І#ȭ~>""""""rGP````````QQQQQQQQQ`````````QQovͤ=s~72OxukٸL>=ݥ kXMb W慾^ D8߾o͉"]6ۅϿ2cY2rc8Dnނ7^><華 X,ɓ,9&/HX3M\͎xeO:H-Et9eбm)m_94#̳͑l7Bj>MrwJ\:~ԍ[bR6潉d&cyR3>d=){(6QX3>~ciڥI V=ٕBͺ2 f?5Iv\FRH[VvaĐ6݌9EEZѯw3zs 8;W$[(Ԭ+{Tv nؼ%Y0jz_j̛G"/KY${jWmk5H9>J;Ӧ@:~&D/Xs>7orBMEbkѾQGYh'mT^O3fl>̝|5r 7R׃X;\;Cn$]0)N5Ì |! dZ IDATW Y̓ M]>V7@ _@:gLR0`/0bz >'"}& /9elǗ?ϗk ];{8=a5_>0ĦaN+¡-|n펐\{`gx IMn'&s(y>bJly~ZA/COw\Md(<`(~bZ`ÌeWXxS$v=CDDD;bVmhġcY$gřSYjX)6}|Tv`DzNc :|n$"8[14Ӧ=2ݩ"Y,Ę#b<=rڿDo6r(ۙE<₏z5Æ3Yi#ϐ1?1gVӆ?5e6咺ҵiSԕU3hv6͛Ľ8תC}}щH|GK?-D1tZ;DDD,""""""wgͽ nrQ ((((((((mv|S{Ց;^2%T{A?ShQQQQQQQQ`@3嗍AT"""""gUp/_'(0f$_w U gT[m\ATAGO%6.'=A= =j‹Y_BdQ0A' ,~XPxCp˄?P&[ Ah﭂>@,zx<Xatxr~KQ1X i?u*{|K@q>"""""n&XZU*P\&b[:e-*T@*7I߮ Gx{Py0(/ðVGmt "D<@`\GB`|0Pm N("""""y6h4xZAoJ[g? {~='s+lг|V!=Ne@XZ@, @ r BaO4$&Ͻq$ZVwOZ6)""""" ϟ@3lbeVu/gؙLt&>!e^=N\{m㏪m;!ZڧYgëd=^}Q]ge@eopv/]yp~tмqs肁 U<.L}*̼06.< []xOܶ9vӲHNĖVg|<\pqZED+\wa֦[ RQsģLM6ff}407 OY({þf-'!rJ^ V g94(VyoBő2HC0s,:m+_{E퀰0}6TmTPpl-\cMaaǼ+aG!G5Bf=[Y(wUFah!J撎'(~Tk a0{?ԩF{~/:BrF>%eM ""+ ˛,;6Hv)!E NI&p.\&&>s4mT!#TaIjj2g@7j.ձfj5,u}W> e8K>< Ȅ\f:pqOarqu />%eRP!"y{{D."C5)']xNgK nSd0]\q9797 Ydf HB¯)[Vj~EDWWW " yHlz y:_4)iC.9Mhg8{sApb XldLp1(Y( NqƆopgX%x}.D@ kb2ؼ j尒U{XDDDDDVjU7laCf l܂E3&z-a^'mx57v`ZS&s8zW ,O;J9/"""""9M& t!~6k?zW$0v/sodkvatw} s>lZ` "#vP=kXo`g e˖fV#GؿoOonMJJ*3Hma߉ʖ-7ߥQH BV4 ggg,SMJN֬YAL|QW`ͨBpz W91cXtl-c7`|}'-bG|,Go1okΒsh.)?A͊o:4zm0;qmnFN1=c """w@D&^41\n ?߁&v~m&Sz(, K}_w'VI ,ED~KYRǴuZF3Z_:_3*0h,;K 6]oVR:"""rQ Mu4qS=3bjN|D7| =48;rï+nnn/j§E ֻUpçd9B.jm`٦ސ;##m/ѿ[^MbKӽ3*|Q[Y_K;/ t7*-9} |K\Ov8?x܂XZ;ZM|a,f1gO3mkXx-m5~CyEDDtMjb*.R_7hO_sh=kLիKuŽ_N'|?}-τ,EDDu{WddHl:"o%Xɳ %n^_6D+f a`NyGi{YDDDH؃=i8~BDnq=xxF}~*^y=m0τ%yX*Foٽ{E}/ٴg sRAmnZf=g%epzK;1[9d/Kj(w.Di/,mw%nu>4ݾx7s's#ӆּdpӶ:_qj/C!""" W:ލc,wѴ.l\MNGqfRL/h8ʶe'-(bfsr 6\CӶk >HρuxcjĮ%dL}S|F ܵwC3qI3VbXNn+"""r`w*w[u0c_fKV||jV5azswJ}[j›ЯQ%2]s3l95yu,gGՇGr61lj" ӤNAނm;ASթ$?uV0}Hg.Zz̓ASfٕxjzs5We0~{n<80&""" *uiQΝ?&9ȅ/ݵUͽ]0~fH-:ҫҤ" UW@,X`QP "({=@( (J&;?3a}a]փotUレD ~FZŅL8x+þH\D[V &v|6?֐n!\j@<.b[iԿQ˯uY,8? (-C|\'F˖-L찶+r5"++SR 57S4;Dx"""T+[IDH !r3ߝvfaX,.{k.Z$L_={s]l4PR+@*2 JⅬL3 #=ߢ҈(N<ܽYS'R&[WDDDDDDj0OP Y( 21u(\v0de8})hM#z m9N:V,p$H;Nd+(rzz""""""r7:T[`^~AL<^vx-J+8΢t_^R&X &tX=r.EnJ"bqyL`2gc &Y""""""|I~NL侣$lܾI6sVU9y d# >1/zZIٺ{/ѩ&2(yYpVb'1+7q3 hQJ*)||3Dh̋z?U"6Ӟ'"""""|5yQY4riySO:L|H-W#`)RpnNTMҁwAB"D;ub I6ȝƢ(((((((((ܩl7| L4%DDDDDDnvxt4]0EDDDDDnZa/%^$"""""rs3n17`4_[{>L+,![#ڋ AXDDDDDDEDDDDDDEDDDDDDn!6@DDDDSOi"(ȵ f#R[Q)"r= ,""""(:N._/'aTӓ`vzZ5aZ1MS!8+t:Yd9o ( iiiDo%q:*J.jvs#@PgBT ,:?<0a4j׬#Sj+r$aIW n8sL\. ,""""WpP$.!0n0vh /cgDDD ռu7rctjݕC_]`7]lNZ`͗ѥ#t(ykO_eᣥnmQ:+ & b>9e m{A׀pfw7UVSeWm;:i.?|m8UqJZXN؎FfR40p" _JU.Ip88yp/۶,3޷ofELƭ=r߀g_4?6#gr\jwu:EDDl.T.VjKZ-N({(==qU^nD "P" Oi?&{1L,ʴYG61vX×yaPdc3r;x hRb fͳ47pP-F+NoH^_FMH:8^/,a_|>qꝧ7A&s uJ`>%ڿa~aI` ˞@vF| SœPJ-|m~ue❽Kϋ[Lϫy BXJPX;ፐywH;!"[̙V*σп1`F(cp"""7]zT#pVgVpL+do?B-O>=a0p)w_MdS؊ՠ ϬÁI7T`{hq8S.\҉|9~$@x<`|%1SVku`)a7^ewC4j_АJ,b]ew5}:=FmϢܣOVJLϻs8 ѣ\*?[ENՅb4F.eO/Ǒ9#7|#RMxnv*-yFKIܓ6Siۜ:A..'~ޝnW2dgߞNVxefCqЙf?1Y ĹDsG|YNN#=2m*]Dwr#?tm³_@FY(u[g_Gp-;*[᫏h >| wjYPNDӷ͐AT۟K&߉epYLeWC hO5qn&#T'g"l n1Ky+gוe:@9`G9]g᡿͢Zҁ/""rSF,Ajޕ_ G8jD*Pă?`]b>#Gi_K/6~[W(9E/=3XnbЋ{0+T[9IS )X,oZª%QڗCP(F[V }ӟ=%&F~|ާOc ++ ,`ss Atl,IFr{ aA':Oab#XpF{90lWF3d2>vd^Ty5X8>"d72E}p#f`qdX?ħrsWG_v~PM`2Tx`v$Fo J̓CyC)[ |һ@[C;5`Zҥ $##t^uڴiÏ?Ţ(_ } poC&O:9`n S&#Wd?)<|ak!mcUeoyY/҂hV\]ܻu0:4.ƨz'GēZ!ڲ`~Rgdԍ8"fF'/W?Ϻ2sBp!-?2̽ySpͳӳ~~,EѰPe뷳3r5m[͌O0}P.yqѡC^xڴiøqZ*5r|t-do$,+0&8R!\EF:nX g!ٷiMr0фNakDxyd8CV*w;|Bֺ5'D+{2Tp±SLa ع#c7Fl@"xQju,=sn?nM'rdV8[LD"""ry<@SD!f2qov|~`a2  <TY}Δ.\@Щ|dq`iE,?tq.>kR"d&\Jv#tyخϮ2xpu/ pHpu[sOc&8ֱ(@XcLIl:'eՎxl6& m۶m۶7ͦ\˚1kjѽL}!hTm gԦ<ƒAo)xoGzT z*N Vw/&$.AMhԾy֣:K<dy6lׯ}Ӭmh8S4rbdzJo2M`62]ly{ Jrݰ4oR\G\A@Mg{>VN߆[]q#;zůrx,̌E -TرiRu.S5ir_mՌ*3GfH2{1ja2j5T@ zOEoKI?i^ k 06+;M[qo_odkFn~MwI_H/ 2 R)_0#hԁnp;m.JQ<Pog4{3~giѣk$ז~ޛaɵqGu,w O3~9CFQ>KJ~ۣWP)IU7<*0ॶgpdtOΫ [ɻ>i5)"6 2q8 #ONL_wY~vЭٌ.%}?n t8LNǀv'?u.|xi_ʝӶV.}< Xދ}\" G~h3ffhSi9&$%5CDDD._`.}C}ݯ|0>m'U[Kmj[8s$xwgڎGrg1Zlif:MGewrIRRA-~Nwz0럪|0oCf<#HDDg&YYY$%&9mU{=I@a?rcpZVfaW ᭈ}gpss.7JLJqWyfh0\.J?|  #ouiZXE2)[8e_/D)EIܸI`A}h2""""[ڎ=[H% "|5!j󋈈^'g4b M*tо!rteQW:"cSXDDDDn?pPNIQ0 à@ ~;C* }f?,P3ǧdMDDDDYVZ4k7ߍa5\FEZ6ojU!EDDDjX,Qfu233={Hp8"יAA4irukV EEDDD䊝Zfw׏Pr%N4U$xfwS7h`V+XV}΄_`O`777n,""""W4MV+ vw¯ [},""""W|"rs,"""":;n&"""""" """"""" """"""" """"""" }DDDDDDn x~w6  CdeerCd, 6 \Vl1ݰ٬zXM0 , X/?`~EDDDDDn| op ."""""rK[^ʶ_,""""""7{_A;(((((((((((((((((,֭ߨ"(f:߇۞Sm̥}}`Q9i=9\)YOvOb}9iKWNϿίůo]wۻCyw@o0h6ks/=t-v[Ru_ /´؇ > 2[>/MBrK%as7$ө_˛7i!^oYiǷcUh^ }jh[3?o/MA{a ![-_mv^3-ǩy<;=ϺU6܃^ds.R+Ǧ9IŒ8{Z.Ʉ:-E۱&l0wm'*˃-2^ʺ]j5uPqys5kI {翳6*{ô ~+m6/_07~^aJ؀i_?Rp 3mx~<ྟ_MdA5 .ˠlы^iF 2@횅98K>}[;  W}{ǻ_ab̋)+am>?SLYě#R<]FJ/kl;H'a}`&/ w3 md Ge҈ivw,Iԑ)"""""Wm?=çMMixpWv4 {\Nm|@7&CS4K%"16 pC Nliiżt-'7eQr:#8f/D6wt`;KҋX?0?ÆKt,@1dN4qʈY,<܏q(wpf<[E|t7 $=sNvv܍uo<}ƙҍ *n35`k~zLn M:0EDDDDD8BJR?v8''$w3 @2ܲYI/Նy-wޛ0}(>dS3IɜH5τM/74:Bm\ 2Niq!$'E&y[4fgn 3 U녣jG&{&螖vAQ?`G/1Xǥ\5ȥL:真",Sf:[~kz:m" pr|2\7{.O+M]˘<{gGǾ59^%.e)o9CMU08O+S֡$,ț ?֩Bu4KjdX }#iLsh{ç"w@4 өg}*y0qL.T@vjC+I柣(rK\CK0zx٫Ua F8jIѼX3}hG-T)ĚС :w?yRFOv౩tY yxeUN-[NQQq탩EVVN0+t-q[UR!DDDDDߝvfa\6Ĥo^En`EDDDDDDXn-,""""","""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""",""""""rݮ+:֍ nI! IDAT2EDDDDo1)kjT-[œu6_c$ %xvNT-+2f+"""""r; ?E:ojZs-[#<aQ;FovؗbUA|4r6?ȝsPBEDDDDDDEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDz3Y mՑ͟䭽NDDDDDD6aS r[ŏHޝoV'<̪(߆N9p[2 """"""u͑J """""|_mFP@CDDDDD6.VndUTیZR<[ mu_؜(ߎ-R{դc)*휃pBDDDDDDvnMH{tUCDDDDDDU J.?[{mBwaaNnUMDDDDDDo_>GI O|U O-ֺѴmڑ&_i?-{|Ck+j=vsoqx:_csqYs~6+;n\"=|=ZQz㖙AIK &-Z۟ԦghKzػ5TxEhj^$N.HDӇy_u22j1_ obv _zO䃤L`6'H:<>%8%f?Q.% hc40JV>[ =W-e95ȹ|/,!T~?o.f{r++{>uxg@N0ۛ/Ӆ9=@b{5΁= x~8t?LRQ+6q y=!c&&#znk9K]T x#<ST~5,5`&8y괦3=V$mST ).׎,C#I#\DVx^>NF]v(}y\|e|+H9k(T$㣗G2#)?{]^_xzviva# {=+*hbK^x/wJ~͓,6UGTungOϺ_s Yn]PX$_.{=Nm{-N.9:m ,e!RNے9YovY_Yۯ<.by.뛒"hS$>k}1o̩%,HrQ_/=gHҫ*Xw(vwC_7px5Z7/ݝ3qRFOBXıL_D{"xRCcW1!@_ ^vHҁ-Nj܄ZDDDDDX.5={ Y|:b dn9#x6[j&v$yfvD^T2׹>y}ngkp2>rd 'ɸyŧb1SY8 ss<bx}XrYe$7/9ZDDDDDo9xwYjr҄G#kZXnAETGx)JܸkI}c# zͧ:_2UM9OHŪxoڞ>3o֖P}D_δLdǒ̜5']1s>gc#'# kf1n|&(ݬ!cm[Dg~ wA6)G낂T.y-&Ax?̈́Ye#;~&/oc؟OBK,#0oىpSrբ}K94o|ePzaU.1-#KX V-v*=(F1睁t(A@Ip~mÑ8hٲ4|.,NJ!`JW2N|?j ˝+}= y׸FEDDDfT3;5Jߝvfa\NʼnIի<3\H@ܶ`5nUUA]orNH!݋ wC.MG} """"rZofࡾrU *j=vsoF^ڙ>w{'<ԶZ mh`X5yωy9+߯$*0&<96;_ODDDDDn*ʚ \K\YD|[+xۊ YAFR3dsCc9!AxoJ9p.1k>Lԣ4/pu$awt2Y)xq{ǂ52h ގی[NEn """""7 _|t/Fx;KCp{{g#suG$F[ E^T?oHY:VYo -hQExflT Z<{2i9]Ѱg>lYoùByW>+C'q Q2}%fd" ZDDDDDn"jR"i†'^vqDE;!w 0~䱐Q_lNƙ^#lNL>1B`h탏+IJpvQes,ڎ^.Bj^N8"94of,o8 r_/ͩ{ax"4¸߶2~f~yvYieiB."f-~_%`?U֯L|-a[ _`iό;EUv"""""|[*]XfQ}zB]0172o2>t-^qJ ޝ#_{[ wKfL,y RZ\ڑ{u8A{ǐE0nDDDDDDdb#r{o9M޶F|ZOo!.`(~/3ٵ8)ЩEDDDDDjce=@5_A|S'8}o Q7ADDDDDn(_Cϳq>mާ@fk[rh:j1o>vN`lڕ΋RX4MD=zoo>AxG<#Sޠ^<.K\uj?ُ]&q$EJt1%vmrIF(tiNDDDDDDJ[[@~ʌѕxۿޝY]aaAc Eq/2}%-ڞI s+5+,AEŅMQQ"631(X&b6^Y}%N_fiѹg5r}ܛ_6[tl.8W6IoyܗߗϭןܐCν7s Ii;rB,82_zgF1?5gc5-d Ҭ,jkλ;c odڴ9?Ɗ3LIRHd$Շ^G.:+ǎ,ɑ^|~v<qLUf%8*e+>+g$V:I!szzLx8M8?\O%>1;81Go >|\<"얓̤{ _4GZ GZٿoV:Iegnj~?lb>xkuAՂLnZj5ޜ2Eil,ƠL=tܲWܢ"So/5k.mHHnΝS[^{zcydam69㔜FikY&}F>81z+71!#Vm1XW6M7͒'{栝a+G͒M9' Rjv {faܧ3`>us7kν =)M}NU3?ydQM17ٴnFU4~wv.'Z.HU!9ક7$.(5zm_øv*.IIqI)yt{ޞ;?zQIj䍗rWC]'5o楅̙N$i|v&ίͲ/u/MST10jG򕡽Ҋu&eʼbw2]Ӆ$)T}a_%yeiSQB_vynܱ$`UW,JR o21;,П)#=6i$qllv9[y׳qA6g^9^wݹI|¼˙\kj^iy4*dݷfiԵWСu ʼnyvy桌Yw״;NI˶> Y' ϯzBRmds6Ӧyrh6ݾ~R$)L~//6?f#.NZΏ/<5M+n%I6u;}iN /ܛA&Շ_c yE-olU|=߻s⇵kFgYYtKzW|`+pż1eJdė֦&ᄏ8C$Gnuu`3 lp޳Zn2R^,))YWRYp^zu:u_ AyOTyos6 @!/5j=syg1%_.Izg4mgn [.ˁ:g@t^3ҺS6+*Ίv_ȶn6dAU!ԤAUX6,&Sƌ, /쑳&_\0y1'kuS7eθ eOb6Hxz*Ji e @=,6=4*3$)~a-ͲsM [K/˚]ilDpT֝ڧ  0` @ @ 0`  @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0` @ @ 0``C 0` @ @ 0`  @ 0`` @ 0`0` @ 00` @  0` @  0` @@ 0` @ @ 0`` @ 0`0` @ g Pꫯ6`bWP/1`_oܺ$h '~w{]D=͛H<6okEuzJi}tJsY&YArg\ز&K,V ٢&X+k ?(?X6٦ Y @ 0`!@'+C`69 _{ce>sbdĨefz}j8ٴMrPۖBkm#k{)yqygμ,2Ɵ@lT:}w-:wXpb1ynB[oeucy)#YS*oΘ[˯NO}mmmJUwNݒC'm76̷Hƾ?*m nq=f\d-_ީhm?9s塿= N1UNk??Pԯb1ɴ?D~&n\7I2sN*{{$^{OCeEG7筁{ͶzҺ9WU]$iS)~?-e?0s` 0zsXRC 2:T2m^&iQt'i[ c3+چivpʑ9s>o/c77/ ?-a|0kt($3LFH&쨤a<+<[蜍&̛F^z ɂ4l=c<9Dt 'p^/^IYrIvuWKp}2fb2杤F䧒!% %;ݷ.?|{Hұ_rВd3ɂd}vK&IM29˒$|5ٻ2;rW2fjAy#ei ˻蟟޻2P7_ɰWdޥɌ Cr3N<v3?پY!Ҽ:\z yu6k3fۆI4S][4/IDAT)elϩJFe'{Ocץ%cRUHA. 'dWW)5ou7qBlcU&II'9.~^K~dZÓ͒F$wN\dduN}M=)tZkW޿,ddSL\1$Yb]4,O.6_Y/wb.m/w I3?Ln+g}|oLyT%Y-9R]3p9rNŤeI>ޗ>;ey- <|^MkXr6IuÒVn$ݪ'N^dUY,Ie!i27dd& [i>*(>k|t~xV2faҲ{붵drrw#;5\x:O6mN[l{mSy粠&ǜiBUy\tk1]ï{1TyyU?yj$߷ψq3a i\trF|"IR[hzLmZ +^L9x]u١2GoMFXu{d-W$wVz'6Nj]u ʒ lK~dؤ]RZHV':%]:%- IuN6Ztxmf/$iұm*Ib6޶Km%˖eyJӰy!+ʄ~ N./IsgLIlQI EYܨ}m%ڗP˚f)RY^We%'L~=&7ɨuA8l8?B|9{yg.ulwA?&=-EޝA__/_{N&榫ȝ3[Igʽ*^WեYZJnxp|Xo /.YFŤXLUUUʾ?u]w,rn祬,)$,c):WK~~ In?.s-RZZT킅~^^zu:fj^YKZ3gީߟ|P$-ْۢyyg7x|ǦtVIENDB`fastapi-0.110.3/docs/en/docs/img/index/index-05-swagger-04.png000066400000000000000000002134211461403617600234000ustar00rootroot00000000000000PNG  IHDR8ưasBIT|dtEXtSoftwareShutterc IDATxwxlKP PދH (vQ׮(bذ\JQUzPB'͖G j {'33;gf~{Μ18ǠAvL>8q&ru* `)q:8NϟoXȁDFtDDDDDDP3` ի; aa{9qjHDDDDDtpnɂl*1 aZL\.*W%--OyRg rR|]oBBvlv;ƱG l;Ǐ'11x,m[ u{)B9~8 ʕ+wM̱G |;>1[K0IH_aJ*v]0ϢSGDDDDDDrtt:pܗ-g2LfUmV3p:pfdbZl\r9rXXDDDDDDtӻw˖1cSLt^߼`Gݻ']v fKV7o63fbҤx=rΫf#3ݛLf^N. Ӂ==áJ|r~zɤI2k4i2{d޼Y!L4i2f9뼪[g 0gnZ$=5U䫡Cqы+_>/qs׮ݙ7o6faYڵ]$͵~Enp^^SEH:r(T0kZY_՚ yll"jˋYW.""""ZNU:Z<+Rxx{cϰr\WF.ˋHq:Zemٺ_sUS]Kxdu>sOm%R~ڏ:EnBkV`p1B)W\| +Ws`;:w w ޔۀji;Y7FW aߊo~~V<˄Һww%xGZ@[Ƽ3lMdzl(K%P(F<$}lޝʕ+2vܧ$Ͻ7A)m Z)lz]>[xzrޕ_7Yt2UcWCIG OBF1*y5fĞ8¦֪c9.6JR֮>4[ִocӦ`~oP=DDDDDƗVA&{0wk;{<Ϭ+Ypf=5濵j.N(A1]p~#a^n$=jD;:\6njZ|(YD{KW&2jc0$$gb=l~ߛ,寙ho4vozg<-uKBDR7NrP8AհmT7L6bHPRVdxhĽ?=e3SG~wd~)EM60̒o{N֯iiZ~/yc~`R༱+:cif~Q"4(bdR=A-2uK^|e_]sMsbvZ $p9x?G;/ҝQ.b{i2Z/>E餝A҂<'jLx곞 \0?'73[4w7F_Y޴ MƪmfmX.YgIUrO ;Wn#8'eԤFaX8,ԀHy-gMaPaJd϶6_A಩ O7CY߬={b;زc>^W[OwfɃ$Fv/$fs=6muhߏ_0LG9T/""""|«T?~;"#J!z\SϟMɋh'Vx#YamX)7^oߙvu鐞I;Pa={TP eHIT7ۢYﳙ*%N0\g^Gs$ÇV~E|N˰R?Lgh &s$VqB}wcV=saOKJEDDDDp 9rF#: ˆʰR[˷, &(N*l?É<~nʤb?֟?ƂYv8{Syky& %ص~'pN}ic{k/{}֤[e#̀6[ΡӡJu)+#9^1څ}Φkg1s!l *de(eF~0r3Va| lM翳.ԁ.VZ3pg^s~x3H!lM I+J>]9/Vf3榹6L飇uˡycYZbt %C Be,J~]cz6cw끑CL<= >_s6Rڬ$V.?:o^{j(>L=Dҳ֒21]^Saper>~xty}Ŋqc?gw?ǎk,ڵ;`x 9奌XORxbADHu7"""""7ʕ*\yίʶE3qE&[F0m<2r}y XDDDDkղ[x[kz4 !0d"g+_2+O9)#7,¯\ײ \_9,""""ELJ0*-L5B,V`_)BrhfjL5!XWDDDD SX̪1s{ W """"Ra`Tb\yo vHa ^^̺XP_fy[8'Ԟe+Ha fjKr5\iHa ^SM!>xxz"DDDDrA300,&36V,R <}ldq:.FDDDDnZYX-X%Q~רV""""""rSP``BD2GurpH"""""כa&&3&'%On7N (ܐݸq9\8pa`1- Rp883pv 8EDDDSܘྖA&#Á3ÅjlQ\ojc/j$#^7¯M׫  \Ğ~ *(HQNn=S!XX.vguHv;./ީ<0 |DJZC{d֭Y,_kM___ՓPVb!l^1c,xp@ ni:EDDDDn@6 E7/2<<򽱫[.$%'b* àEf1{\ e8qvjM-InԨ!bŋgް!6]wqKU`˙{~ի5B^:{eOfΚEBBR"^՛skGg(G尯@x96jfժyZu /sƷA dI(V8111<?8h ` dDO?3꺝pV!-55+{zxضڵiͻobO7;ӡcgϿ/o{s).w1'Oa`$0Yuɩ) ?)дiS*$\4h{;U<._jQC]EDDDmҮ]ZGFF||ij,Y2+i N[iﹻU -K OEtLu;RRSXr-[4/Ж`?__Y}:g6?*:/Li֬Ylt9mڴ/[ 6Z b8o:oK.;b,?>ۇ=›OO&0Fל*u'D;nyzި&>4i[0j4#:Txz,Λ,qa]z^4DX7rž^8!;ҶFNXĂ8rkPzM F*Ujժo߾ȝߒOF f-W|wfu44p ~ҥJ3)U ~eի,^{ƈ̷ rsbyع{'=|N9p0qc?gclexkMJOlnŹ[<[<Ƅ +}b-3ˣ8͇DulKu=[)ԛ"_?zeޭyxIoa6e/ynY1 ,GmCf<[vwe[NmZwiLW= 3%kT7r {\ȍU6:t-[=CxR纱`|W}[u 7jV!E`<0ww떿;kG{0LW,;e_ӣ=L:5kRr(F7s-E6` ;c6NJhسTVf|96ͯ CۗДWyw>T?{uݬwTJ(~&lVGXNXd:p[*Qky*NY'8Rޠ>.O!ಔN%/#pyz*l0v})ߺ-kSʒN,_"`ٗ-:жVEJY 5z'~.+~ mU1E~t6(t@>>닿?%SӦ0{?:@\|< $%&HRrRκ7C耀Џ+\\LSQE8k>~OӮL6:t֭)VX{y{Ӭy3/^//[&k.:Sz|=.wH-ض}'HvG=q;Ѽy >|.rg/@O vNEqXx 9/5ڭg뎈m/Fը[<>-639J0QZ%<! oNB(JDb'N)u'g57eI21l^6k7Ulh߇^زd.+2ܴw0%pY)ѾUv}\V&vr\1Z%qlO(+IjQ̿ßxҥ33Ajz:ɉ۷6b6hҴ)͚XbX̠Ʉ>%.>._?ח}zӻg/<<=rĭoמf2ǟINI)`k^鼾-H9/d ӵ{&{P!$]0. ۻ={vh#ȅG./siӖxc)N&1lt&ΨCp<)OeĚ_e@3_?EaGO;#s2ONDDD\qq|G ˗g̞sg7n,ݻC;:p3Rr.f$&MISA U~׵ eˮXÓV-[MjJ VʷGDDPZU*Wݻ/[6 Kp5\~Ʉ3#/6:|vk?y]3?إ)?:ܔ))#y{8PB1te7q(Eqs"N^Kj@̱:v6[s8Ń[CHu]87. "d&6l$""""rVJJ ːz?eW}ifדS#2 J*q$iyyzT Q/ZM"yg9y2AA#n߃`X}ŲqԭS`.퉈VUTDD=m¨E"GŒIhJv,X}Fƀh b)x\Z;^˶nbo6mn2'dxg֞oW= 95ۛӝ)_Z$a$7נDDDDcˉرMa;fѴi3v_Nu͏ޫAe2~ݽ.ڴɚ׮M>x]ލc?&lkRg|=:v.|7r. 0{\iݪww~rujצK1yW 9VZI:u *t Luek!4v9?x7C5k7_z-n9VZׯAcsH+D)TNŝm!;C/SG9EPrƟDԪB0v+&ST{|f~p~eNN,A`K9'a*O9ѾԮ[`&"""R9NԭS'}{}@luƿ>Ř_Ga0p\ktCpyz@sVa35kRfMjU)΄l~oxbμ>o?>|kb)<, };9w\Jޡt2n +0SJr[T)SЬ#88]qo֙U+RtGM7n u+gj/y/+ j{ՠBp00;?w&AUС[ BvknVH!=W X*m%*skhUʕ dJnGEDDD.jժ:I1jԳu/'#NPJ}χ;~ȼf#llYݞ)xMA{<4V5 >2AA|{<8xu9Z4oW3/]FZz:Ϗz~_/(G+z{f~y{~_z>ó ~URex j䍷3 ݯ*UzSq$u8;vt6 ^8x{v3?W|F̿ަSzg˿ܔEh|h݄vě4⎇DNV7[GܛzNmoY)AթǞs;ۉ[?~I@ƝNJ3-IwvbMgfm{7,depeΏ9e{A O0UZգ'#뙿gt8X`fm`Xp\xdd2a6\5لl%"""""7s6RHq=i)x۶mQ˅ ))߷:""""""7k>X,LTe5jwu((((\zHXDDDDDDn,""""""2^w`)r77!آbԩy^V-""""""rSP``lظY """"","""""" E͎g(zdic69.,h!C~F/J?YpuB?'NN+3suqK^f}skm⯫ADDDDD +ghKz0xx旼]!>OʽgNc x ZvϮϫfK޲6^FGE5 e>'R0J40[q#=8r/Vy'܉[m'OwՑwPۚH);e:!F&klUR}O}+x}﬏wA<t/9+uOxs;Y}cбq <4c㔯t!Nx(OZ֞ARJ>$c#ÁIpkщg[t$\&1x?jo:'vZŭgȭ5S0oAsJ3JQ/ XZʺm`lqfr&<uapCӦ[}0$:xAl QyH`]:dLw#Fwڕ0yw~<9:e.jzY!B@nJf˚H"tݔwq7,Aq$z o-9 [&N;>8^bK)E`l?U:il1OHJ $rJ֟o6;/ڴI鰕L?<;A:LNbρHgT,eo^_gɍٞAP`!bO3񌚹7-,K^({WN->J[*`TNcp~Z 889+I|k=_"3[ow.]OprYzqv]"""""U|:uzW@;Oڔ9'턺dHثՀn}]3/>v ؼ.RM4 sb;Z$ sbNtKb٬>7 ; z`iL/یAf 3@{w[wW')<rV_C<1?i?]}Na`ܽRwY\ͨ;L-ۆ9 U(9 ؟&g]ޏs4"_te{k#ovKNeiqr\z tflZ(K˻:`HĪK(A. &&A&8P.F ֡gTziKu~}_XHac=KDhx}X#2&>O4sast&5/ ) @4mfY? qQbeB|QO>F[w<Z tzf( {V"[@ڞ/,=DkݪQ i ݧe÷9oɝn}I'`:fAd~,'sb;eۣBr'VϟWˈez}AĬ!*3^_HXv9SI>j0*׉>gl2jk K5,&x%P<ٲ$ &0t}_wQ6ѾuNTqE |I(MOE;ǿ_q}M𯑃xީkݐӫ>npʋ<Nic{ſ>ΝL}c~u]s\hD6Df@;Oߐ\zyPFC3A~8?"""""r!_EZwxs_SR/`(4? Hc/vYȎ1U]Dv=蔼)q$Gm`DA-t&n+|zաaO!t++9 ǫ}.gq2Æ0R$.CZx^UsҪUJ8Y!:ɚ{JbT< Le/n ]f9@ƼEKn$8sH?ڂ<"""""|9;+q5=jrp/|+, , }NzJ>Fxϊ5{% ƆagZ|]༱Q2ҳӞ/M;[vBz>ʒW$KDZ TzUu,ur2J6-^.U{87~x|Gu-MZ%3o̢?/gs9\X'"f}0$%ݐO_& ٩9!mٷc b ; %k-Sپ'2GK\vh5fd(1t.׶?gWG_q玸b Rt"L姹?at-Ga&x1?|xQ|M:U‚'? 'Nx"5ڤ~%2{ѠQ*ޟO^pe|Jl~Tی&n[={˄ҸT Hr~cnwƪ NDDDDF׮]N7۳7rp8$%%0?67UBGVn^ikyGo,n\@EDDDPH8^b`2|soD|~jOW-?hm0_^C(KNy6?~f[_3i ၡy'~s?.9nz*uDlv:)vhWOs]\7{6ayukCcSlɼ;m ۣxW]l3>{jӹLH<É8+R+(g{u5ˌމL[VN8Jg02+sxMH~5ߞte|};^= 7i_=acT;Br. x~vnȈ (o!t䒴2:AW>6s)䓏W_ 3ZVz!n2wpƂ~o;rЅ3 gN܍w { cba7JhŖ{zQ|sv 䠶Ւ""""""R$)8YuР4TL-pI+A1MXMx}:DDDDD䆠`;LwіR;b/ƚc7QcK4114EѨ)XbK,1&(^cA^ǢbҔr2sfy~9gy[s};rQ{f=o9c'ߐז~O秜{AnYg'= '}t8_S_ΐEgo k,uܕY}5~ܤڎ;/;R} X)*pJ) Ʉu߮gRnΘBz>9>̊*ͯ w//:^}oSפu:tL~}i}znZ IDATʸ̪h8.'Ls#oo}9q2庯7s酤,o#5n9嶋Ֆ%Y4\z3p̬Դ씭;#wFi$s]r];Mf;漿};{}?qLFϨKҩS8O{4guU^,I I^%I6Wqk3I t4OU&>|s~y:*zKFNf:MpɩؤQd$sYe{FW+6&i?wl0?1g .ϕӭsZ*~=(?l3<_Ň7#sZv}_ir&iQGޟgrrA4GZ DžZo%X$l<2gD>|kujvV7Voo0lnfn{Rih,%3#e>ٿG}yqon## 5zsggnM1-u?4AlҢ$ M˔B>fWb֌٩*$UW}?]’dYYŖmy9ncS`Teڌ)).>9/)3f% Y%Zub,3,\{e.{ti6OӲBOI/h6YUT,8;neKB{4q6\w.%NGߟ$UdނTռw݊iUBsR<7 U7fHycz#$eC^ȀF#Ұs[[m-5HUU§879WӼޥoWrlNrI;@]Ssw? s֫;g䚍V|,޺Wv+A&}K^5:L8"/x4<_1OX6u4Z<-_68/f,ze@~~Րgo%&?7/o)m?o>̪Nmu9V<L6Y>qv.XݥKх_O[n}i{]~9Q䒗;}booΟw"Ψ_y:*KҷU ~W-fI7Go.5557o~Zytr_V 4jif\ۻ8TV6IYYYJJV'̞3gۧOA ^]ԽI7}KMM^šA_5 b=ry'dВ/.ω4Pjo˩qNs]׎N+WEZvg/9ial&iSLfWU#ZIjRZUm,Zi.&_x%^kKl}d  0` @@0`XsX4B x5 _{ceVo ?00-YLJ&$OzmAh-kd-5o5:O=JNUUx4H-}ң[Xí}nIF7Տy}gw%X\Uq';Z{VR_WW_MནUiҔ% L=SRZlK/$٬GߵoZjiW32|<+٤{eX ]+bw h^X'ɤscu5}uy^+L7'C5X8!םvqn<|܆j[_΅d46Lb*Ҷ<)Td16\i|͙٧*~c<;D^U>4I专:_^=3 S&%Lޞ7I%9f8?8I _Lf$|uAue3O*Ngߎ{# >}˒soϽOBe:oG~eBymW3r5i-'Œ_/U)iAv8dNx *$%}J^^#' I->$)oxZN-O=4ٶI2# =?'syu ZLnx.)t]rho7-NO'דܞ,0M˯Q+S o -Y_']60S I{wӠj'2[su*ni~*:옳>&GG.}~d]-SvN5mVߝ+&nzHҢsҫ]ҫ:y7lu6IN=&i]HHn|=ys|g_i>* ٶSrkY s潓lW[LK0Ubf1yybmmS6.K^x,LMl"対~*k{wzl=$:[955ۧ"3݃3&Ǟ|qҔwA ]gm/n:Bms&V@vO(&M%7Y8|$.vMRLJ ?8m_}~_MN=CffR\rƮٴs1*ŷԟ<+s蟇UiZYjlUsAݖTT_S<ʈ J {% ;)U!7*lg9˫Vs4\^=3׿IvM:[򃵟v -%Iqvw J?$7IIIBR7Z-84G/M''IuiŤj~1m=6N8e)oZH>mrL~q+KR5xH^(iMږP :צӫSe Iq*5 UAm߾wNAZƚXe _1G'I*Ѻd޼iuQYIT|/ftIߟP+Koӕ_!I3OZ$8TV6IYYYJJV9k4xO}->}Y X`  @^4{3YyoШa$ɴ3JX7 B!i3V`2Irԏuo]?+0[Hѭ!,yz}bW[/+I&%:J*&N-w#G;u9{+2_W_XLmII v"V|9gx2}<Ġ 9*OJ65%VѺ\,.Cf/BAk +OV-o1Nik LMu{K-Ӱ&oǪ9` reJbsWݒ?F)Q I'۷KSrǙm'|G6#wNMR[æW6rsÚ\vu6|jF& ` 3PH7IZ)]n9?w++30?rϢN9⬓e?ͩx7I2fB}o앭Wܘ%TRR^r69t&XVamѰq?{ЅUruzwtʭOuŌ47-I9չөq~ե2{7_hK :dz(w̎S΄yylnҦqof<=85#kһkIg`1a$I/=jcoBV> ;شC͝ҩv٢E!$U-O]*6+3$;*O$&felYw&-$UɹvOΝ2trY$3kK^LתɘZq]wVMȪbz5kȵW%sS$)^$-Y뽞I0S>tmVUBZ*zY)fn꯳`fb_*\?m~/Ocjf]޶ F^$ б;KaycvްGs!Ŕf㾑lԡӅFZ>6-gFlwsƕy9Ҵ(/Sq0#4/wLwby̨$EydŒJ!͋u$)ki"?:p9OC+ʛ}ms_a}v(i6ުGVRʬwGekL㿜xWU3G]U|'掯7}whjMۡ<0$;l|6;,[W/ʜBӴCN٧]I2 r͓ogjuz}^i$vM3rZUJ[Ɇ%?>it($ ⃿ߕ<+f+mc‹ongZMY*'=nۦqcXG(86ם0&Nf.8~TpGNLNiO梟ߒuWN=-?9a`2oTn%y8IY4nT^PMJ=khCO6r#=sʬ_SLyٹ٨_gI%I9?:c(&=' ΁ÏH6.fA_#[$l_$;9OZ ʙ??!ȡ泓3Ɇũlv)kw:hv-KVck[f䭥.kɹ䬽ҫ'fz!i̟Zz2t\]٭뀌r[ziڭ{l[:G.ͅ{-ڷIb2f,zgVF,,f~ժ$)&i9/}e1B>;kdvUU% s.rCsu&wȗb6J{ x O.w]4$cgUi减]K]R]KB˳}ge#27sug՚,Nlk1ib4Φ"s+[doW1;X73<ݡ4ܑ͆Z];u1ZIkt*_E)Oye!Y<;cGNN=Ώ.En9fi4<:mW=iǽ>.UAiulҨ&Ge،%??wl^_ڊٺK駸 2y仙9?Uܘ{NFUrVcXە3%ǟK9z-yϷo~9ãa]9%9bǽrNNoY=o;-祺rj_Ltr-sSs.IݿKfxU) ci>0M{58׹f9ӫ&o>7! M-} xS9kA9gr_̎}!']{0nsɷO6dc3js+ϢFi}ۜv)9dxz×[ΔqgM%I6<']?ʻϟxJ[vVGէ;yǤW5ei~ Ѷt_)`mWoյŌ=:IWե:sI;MNwgA=a;lonWퟩߜf͚<%%s$I[&Ie6N S 00` @  0`p$~+\ǮPH ,:.555CfJJJRVVƅB} B**SVVbhX $%x7I IYYX#CWKb~` 5>ѫ`V]マA`  @ 0`0` @ 00` @ l}dkwf/Lmw|~ٴIa7+cE䗽9xu07Op؂T<kISIksSQm1Ijr߮OߞqipE9ޚK>[q_;g@94?qw^ W3 _хڧFn\B$ is!9gkv;:I\eB$ɬmͅo$ 0m|M'Y3Vh;o ^]5ڼ[zk337|ɸ~߸2wLKI!).ʤcMmoXoA|r9o䋽ڤ7rߋfqσuj. c32h<̤$ ?;d[cgu:cxY'j9{%AwN2q#f8|h>!˦Eyk[yV+(?U9^o~Τ9p:?mNqjva,Y'{9\=5zlE;Ժ7u0UYOs,I{ %| {~_43mཔ ]ehxh+CHP:8[u/r7R cM$&mNXUͺOWK}mn;}0H3 7m2~ΎÛ Y63x2!>^o;y.k]*m/~:5 ,^mezϝOȏog[EqݧrI5ƫ!_Z[gR-,Yi+%VێF/}del&mhb3Kz݆<%E#R.fG슰o~ fI l@$+7:yz$y;\1 ̈́ʯCǰbA:OMW 2E{F$ڏ3bɣAZҸ[.쓏~0ƒK0E"= Oxa2vIZ|ɦPB~۟Q[H񺸙q ePKShkG|A4~!Rmj985'2l59/Y\ 7z*_D|p3vR#)_>I$&֮ND:Tr:OW>DܛXԾ4X%ͫxõL vgfm\QP,eU l|W`g1$8F'K_sym>M|*5^M.Kf`vcĬnL/'Nlﷃo 'ӲwqoލSÊSY>e"?l>ɓl;iGN]D:OX7'1WϳsX/?,ι6[=5 iQk+F ./$Oʸ5\ehT$&3vNݨXc vyLP?5M8 btb@"1l_/fd/9Jr׷4e)}a;#hԖ6_ß&1ey K~f̸qLY{ ,3ZpNz2#ҳG[x:oökR0o򣢇9ۮl@ gyǖ.\vEX. B~ 0M=Vr)xc"Y8v$[H,To l4EZPR(Q8ᛏd;E<kƋ8{xbq)،J'73{w&8&c#$.qX|6,{dƎ#ql];q=ɂǹ&U#QVՍ,>gMuیSq](ŻV׹m2ijom=Cd ݩsD"52O 3j?9:7Hy}܇F<9eS T  Ibr>2enIT Aڟma|B %KX;=Y{9J(kmw-yYs#,Y]񼲎a IDAT~SJ\ƌY+jW6_G[W*z4dgi̞KY"@mJJa_0n>ے SWWZŃ;Bk#>犮g"ɶ$ @&ڸ oJ9pƖ^n4=8~9dg/WnvO.hVsr?' ?5X8r ӊ[\aS9ՋE DŽ3l>1wM=Ε!VY3}Sc+Cb(h͎3ٶh޶&v[Ʊ.3oTzTNcLh!7'wQ<>b f%#,00Y ibnhDf)u{j)+6ylZ@ZhGȇXc4a ę|iѱ1LRl /pFΙ-`21Ge\fAW 0`յRtowی,=kb7iY(=+2/x?m;?j 0L&a A%+2( RIyL3\ȝp 3VkDߦ N`7G7-al۰[TPF-3NLwvƖ^ٲ97u'>JMԾS2̤0^ԉm;qk?֚8vcXO| Rv#|0xydcoHG~ʤEInT_Ӷ+7v3}\ZYk^.]رn%[vH9% ~SVl qkX^>87˸1+0~aRKr)΄f=Xzx K" Գ#XqMY./}t9w+ m˻EOO{_YӘ[Ui^\- ǃӍF|H^ k398<ʧZŰQǰck-`p3X\'] e)K pnώk5𲄲l?LWޫL@ 7]~*]͆t4s!|z۲"۫[m5I68Sz- P2?BSj $[+J[7':ʑ :, a\|xk\.͍/9xrMܰW_\9s[x#UcRKdz% 0 8h3vQ& /ٌWJFwLJ-ǫԌKhrɛ_}ƛ.싡wlפm{سO| $`?uB!^ IrL 1W&%t$nAI!~Җoo12ЉoOb$YgujDĝ fzb,Ve c]nLvk u9*_*O~rTyi_0,[W&gq5|T?G/j5!]SށXU˲CUS=j m:8*(& ٖyqȵ}u-1rHL.JizKx<;w7Q#eK@%OrgϧOo#mHV= @C9Xr_قUJapύs8B7ga~;ӸV.$NN@}n:d+;pODŽ\O'KW+]]pKDU*^Qx` 32+ԃԃ#1;51zq (_r.cH?YY܋RƠ嵼bM#+P}VXG[zrR`,ߍm`uֳ~n|rf^µXgquu ML?#p@^' 3F?ߘ6at'3{[%%h xc 7*f{H =&Lr|E9ǻwKNE*т֯wކW/]n!cB>zL̿zlb= .xrٚ"^yPcn5)Dԉ= Xpzw^-Nג{r&'u% a- nQ˞VbtD\DK.E@ 7#'E= B ųlq 㸰hzK/@ {òjj$̹,Lc캐T,3&Li6&[l0;߫ķh~rX, -T^b -qko6Aq(k<> -1#>r{a3^xySkj."(;vt`^+84vV0l7m6[Ț_RCx:8oo~'HPϘT +G>"ٴĿ8?:"LhՑ@$YwB;cl9 `xM#{I57'y 6 ]}g"jS`̫6\5a[L|4~ƶ>ĝډM.oV X0v,X%V19Zz HٓKx$Row6B7D姁+7OI6yo /;/czڔZmSq,a)W#x iuHnt)֛6}H1.#i7w%'~ς]6YTtyE'ϡ<ނ5_c؀i_V|˳_o^ͦiP%uc7qBbe>ͧo*M*JGIvqFG*2ˀWrr1Vo8VǠl]mҌbw,[$K{Y;c`9i8.\ rhUR_u;DF(ᐏ Nf&7F]Z q1~FYԤ*)P/7 CsQT/I^b3\KBr16n=W@4u4s~,d7I<Țҽ?c '9-XY01:JzS&ҋ7o%>잿c^d!LspW?lx2Ȭg9eρ~E(t_<{ ~#ĸī7ѓî OO<ؽy_-K泍tI/[8ʞ+ :n >ho|~JVp+ ,X?{ "rS)v{9=üʯtg4vg%7~wJ7&c7&J&_Np:\Zň;ŠBm?'2z[Կzd6-f XʶwϞt>>xo`9q] װ},~fnڢ5կlb;wsZ:ǂw^F@zō5S6 7[.T"a=֣a|RRgTy˚ȿװ9.An/JӴVNYG\zF~c<[vW1t+w:4EV`GFui\y\BsZ;/IҴmUasƥ`eĒo1X2E~ 1^f4.`[65\eıJ]Ϊ ,7Zn0 |m5pі={ҳyef߼Y&ͻЫrCF0eOM_[4+ΑUH*MoYN9ʪ)A3i(hJs5WZq&' Ъ7S8xBg< vQXp-1xk&tx"᧹u _?JNӣcsGs\XERnY͈I;{~Ucp}>wp`s0/|x[&YjU(n eĉ~O3g3 hG=y&Ou{zLV`C^oӳm՚ |>a4̡,c-cܨ[Hm\-: (>OTP˓-8*gIxp}ed VBI>~,A_}nb aΨ?MS}0soХe5N/*ᩊV1pl_\67gΓNgɱd<كZ~G?n\y ͛7-::5჏KSRRHJJ"::s;A_#1 _.|*im9zN@-m2ᛘtix)*3d3׬]b#8wq'DDƨ3(Olχ n1xj#Q5k?:8n${IJ>3NO >6-~n &?|aXZGbEE2 ${0k W>&ӓ}*tex%DrfT>a֤<4)V_m9>e*7y>7>2t<:0fx>vDHas߂eN&e~HNeg*fr"Tf|x>!_drٶ2'7<}hzY?.[y,_Ogougso*dxmmQ{9Aܷ9m\qQ[-IcʣomS"+&Mfϫyxxt/ x7oB=gX[SG, Έ'd%K74?Qӷ[=xl&mhW,&Ⱥ/|1Ŀ Wȵ>G 4XY.v4z_ϴغ(NS*o'~H1b*Cʥۦ@[pP[o_ymIxu3bk)&Ow)h4s&|;0Ee0z ~˧%K.*^Nh䳄l`+Ӵsr$x8p/V72:ɗfkbc&IB dBng/dIX}FO䫒iǤq_6>ڡh]Ӝ70߾><;S&֋\;%|e0jQyc`'ݨ'|p3v,9Cɣj]Fzo}ՈĴYս6A"`KS/DDD$SIz-qb!kH}Y2KubO͢#>OnbM`;*3vܟJ:s\(ŻV H-@B) g[RajJ\iՑ[O`)S:QXFeq4xV570uM(.Hc4euOeT5F;Uڅoa8_hLۦ f_Y+P(]{9cpBVT6: Jᬙ's9S|Q+O۳;&1}p5|*#/fa5vFg{%غc r =09e__go+m ײP|0X8>k#C(ws U3bbvX lsNJQ+#oJkۘ1k[Jh{s=T&LsǠ-1I1xgdwuf(`AW(~%8]̛|ivK;`D^B"|==8kϥ^ɺ(~f#UDxɝ<.I2#9d;]3Ny5{퇸b箴-%?2}KIMuJcƩ wfb~_jp&[Cu-y⽺CpywLqJOr?GdIS\AAb1+>lKձ{8XD';ŊB+K,ף- ?\ZJJiV:Frq (.\n+bG OzXAN%Lp "2_f:zRV oK,#cHo>9qQg\z,f6 ؔIg:<1 {ιO<^&#vicU9{ξe cl=ȳLk3tv?.`S#[oZWsb"kn|zO,=9ОFС8(KG-Ӽ4 :YJ+ ?wN-tXo^ͦ ޵[Rd! *KVP!$ŽJ#~&^`psmژRZYb 5NaCHkW.0GZ\>0`9Y{5dN#ξ4i<_>#uBjʜ`$e⏋I)sr]osf uZuA5Us.Ngɱd<كZO,X8dSHR|5}iW9)6lAMGWU3|ODR؜ќ>w=O)Ԯ|)RWzy~ uq1n}-z Cj=8jժPʮ%+_R~~\itiY 컇Ǣ=Y<Ⱥ]c%M_hy2x7k곈ysS'So\sG)))$%%C޹/uu{ >Kуk ,-7ցGo9 ,\>DL!onSeN>CX([=0>Ms(z~/c }>k2i?MIVqA$vw=Iq$ǠiKOu'O)wn&NN`e诩F]K}2®]r+Pj+5,+Tsop=bڟ~a~dDNgX%Nckl0ĸz`,) '=63GgjǺ&n?uƩ#a J"""JEi/|{iGoeHQ#yDDDD < ctRDDD (Q,""""""XDDDDDDD `%"""""""JEDDDDDD2g"]Ŋx,""""""%""""""XDDDDDDD `%"""""""JEDDDDDD(Q,""""""JEDDDDDD(Q,""""""XDDDDDDD `%"""""""JEDDDDDD `%"""""""JEDDDDDD(Q,""""""XDDDDDDD (Q,""""""XDDDDDDD `%"""""""JEDDDDDD(%"""""""JEDDDDDD(Q,""""""XDDDDDDD `%""""""XDDDDDDD `%g:"""""LS^$^Ȋ3My3w l#+"""""4EH\f}ڛ2~8;(3ށ2~ 7kVQia5Uf :"""""".""""""XDDDDDDD `%"""""""JEDDDDDD(Q,""""""JU""""""XDDDDDD)aTsi2.nU Oʼ~GZ{{ӆK붷Ώ >YOwa8Xƹpq}+M/j(~XZ$"Oauw3Gs~i(MܯDtnQ|FH|5ۙ4 OUEDDDDD8Dm޸Y_0)$Z5F_'(X?w-dlfKy1S[bx3l'"0(W~ɻ[8?a|SƆ ػ*FŁ s}+5[ Z̽g"j{8P@69gxx\s}}: 8eƧ*5KtQ/}v%߼t%a ޣ/k\2tx)t:ohD9`hn޺[w~ #%M,eZᇑ ZŻCi[90mu㵸l}1riIh|&m"7.g4| a'tSS{w:&٣:w~8ofkd ֝"A9O-"""""9|ؼ{ɳ<~oK2;c[~*S1eBB$e+{4q .G8aG~TL,Y[iUZ<p~ϟ(K$^m\(_+t7wg Р_7zZA:H*i>8 낡qkz$$ac^ ұŵ|y]S3O7*~;ƀt,Nk{ EW;A|[*asGeQ|🾓^uW,""""""9> Р7G1LZMUWM ʑ?n?ۉ+] xfhq4%iY2!2`GC^ݬTΣ>9Y2۟ocf݇܅\0Ʌ1P2O/ϟ#y-'V*T ӜܽGk2z/ 5_'\g0cO՗Jjgpbnzt_s"elEu|$;gHaag=Ʒ7Ms^)}1wZ=LCǿAX~!L'lH7 .&=A1?tkɕS2k%˾K4>xNtԳNd-y`Bu'fЛ@DDDDDsx-)W3/"և- eKj8ږ;~To&Oej/M|P5|*Ttfh lD+[p4lr'?j5b_kٗc&7'eO[G`Yve'Ѷ3w2siLOߡ{Uˇӵ}Lrޯ3pսS XyAZjeI˰ @s|H5]BpfdώӔVDDDDD^T= ''Glllzcqq5jԼګX9""""""BPJ~6A_)$"""""`QQQy؇`k6zII:"""""9;U]:o%wrp FΙ_ya$%'q&8p0Hy[tdEDDDD䅦\tdEDDDD䅦\तdYy) XDDDDDDDXDDDDDDEDDDDDDEDDDDDDEDDDDDDEO呗|&BDDDDD1kuG17.չ0e6IQ_2vîm+PxP7 c;5ywf|f z<2bClR' λO6e׶Exo޴]=3{,?V > ~c^~h+|lDBz{l޶ 2S-Ҵ?~mصnͬąῂ]|FjOOㆵl]5I* qzxz޳u7Rf.Z– غj}GKl޶>e=ֶd['DDDDDd Vȴ-]:]?󕤬k2a77>WػjKo`ҜŀMlY|rHޓ:w=#|ro:&bI\vd=;qOѾUoם_Yz/ݞ46<=F{bxp0bܩo 8X .4jGFOɈ$<}u]8῰nJ6^_?F^`eʋ:'bC%ОT}EbƌQ[EDDDY&oLGko;^Đ;.Қ|,?].yu~,=}M|ف.A 8(ߩFخܭRrƻY:O:{/䤹h0yӣu #A+ (~j'p6q{hnǍSZV $.C1zeɶ*,Gt&a\xX"X\NjӢF]J.&`%WIi{Z°1H~s:ů;Ӹt4`>-(Xyܹƍv{xP3gٷ#rDڳ:W-yi&;IABR=Ze`\e"/i2()T׏wӘKz0ѿy/­^5 Ela{ tںN"t oqL_IoSx.8eV7&^صP^T ;bUO#y4 PIa*BEs9WnfށiV8|'`3E|+LdkJa #֜cOlx`q egXp$`{N\!`9H orKsHDDDD w2@ZbV0}3[11N?~h4oG ѥ[ҭt ~:}Ѭ(as:m0OGf[lb?\J~hzrtdƓtR,`k$jGf3fef&3c\~|l-`6'51۞h=beR{'͚ú ůcceNO~~]~ b4Ll#97 :qC[pfM45x֧/40T[''O&T3&qr{#UgP'w8w1`# IDAT(^vd\.@VytANR*'L׮q^ ûx>rŐniXp@y<\?u= 1aVM <=iz3 xQN|6槨AɛNKp}`I">ɿ2{e++s7"禍ٹ(REm2,O{&%_-HLx;?`4]"m 9pш#`ƒ-R^G,_"Lx .w 1bT.N#l9ui*wcG6ys=mlյeFۅXX8}I+@Fn|N5vLkFuy4е}%vžƛQ-#J`[\h//+E$æqO7K2ӾN s:u|fiCփN;BdÖ4}C,hh\kHϑ|Uqoެ'T<®ݩ^F,OfwM#г V`[vo VEB?W<.ۇFJlhǤJbuCSOXe^eszFȽ-{ARtpMsQ-{YZȈD`@0QX`8=W_4{.a߃2Y7crw &*Iį Mc5cgwiϊǬc0}LZscT̅k[Zn2&?eö*BˋyuĦ""""p ""V5sv 8<ďPi 8?.t }-DrX|ɣjRv }dZlV-tu_<::TJ}XzaY^_R\91m#[ [sw^&? .m] &ϰ7h]6Onַ{sU_߾؃M<(}®vcv7OJNJthc 98+gc_r&V<=D͟8wwzJc'bCձ;4۷u޿2u!t32Y;J %[ozx-ןнL wr)[kٽGeL?Yw &oZaYsPnf , D߱/9S.""""3jʒa!,44+]87Izz: ^,]}EMn T7xooS/n[/I>ϦkM\:f:DaQ}%jsL I{'""""\]O;.cbekԨyW"~=1Z=i`t٧p/O<=B9p 4k~^DEI ŒDDDDDOoMMD,"""""" """"""" """"""" """"""" """"""" udEDDDD䅦\žtdEDDDD䅦\[Ȋ M jWc̰A+鍃(Wқ1Qv5wlrDmJ:"""""")"""""","""""","""""","""""","""""","""""","""""","""""","""""" *(69u~θ{9z#tk\<}ۣ+ʧ."""""ʙ#Q0ffo2.p7SG]DDDDD3Gq>݂KW:y@YU^(36>U8MxXѱǖP5zhF|kk˼F I|>s b´ K[Q^߇QUs񜝿/#,΂Y!nUݺqkޝi};|]%5/t^UkI'!Qf B|U??ćyR]6v(Kߡ]ijx`uܨЩc;E'y>T7w /"/T;8\' ] >kh`dhjفWZ $[Q~\zxZ?MZ*U7}>)I YgX˜qv6s&{;Vİ?+q _N_5n51w]݁Sk2h [ۻYp}?DM왿@Dn\Θi¼O:QL:ǿIT2]p9|v,Y&Q۹T1W k^W&j!t5= ;jwyhV ޺yg7ܪ&}kP݊çm?_ ƶkTr5aS^i wf/MR.! !͂4s)əzgߔΔdÂ5UQpat%SG| )T*m᥷:.{ P6}SzcTrMHL&48u ?`\bǑhKy 8M"""""\˱-Q}s2Oy*YJ16& )2v0XY8uB')1kENq8WƐX- $mD- c6ӭXגO[D0n.&L>m`Z .83HTjqmwdgi ,hswXȢ+t  B/lggu;kћJDDDDD6Qng~@eu=k&?HDD,NnX /iwo9G7k87Dy(+*w Xn.8}ݱ0ٿ6:}.K*V(K7@ёPb"8:1`'*Bgn<ǵǹG}Fgs'd??B9q6" XA3c|tׂTc?1T].g_2=w  oc,:'}[2~~DDDDDfhժ%-BXh(Ì233IOO'!!kB:i}u %Uyv{qNN`e/*Q^ŊЧ@ iWDDDDDqEDDDDD`ٷD@[ADDDDDI4,"""""" """"""" """"""" """"""" """"""" """"""" """"""" """"""" """""","""""","""""","""""","""""","""""","""""","""""","""""","""""" ztCDDDDD&'\=q/l1WnJVOכQՠ/9Ǚ5tht½dY^ҁ^s?y'?fCVeqy|;J"zdKG3S{|LӔy=sɏl:wt7Oj-L^K ؛%Kay7.eȯXv5S7 ȠftM[DDDDqrpyf~~)- a _f4lQ4g GBK`1jtzMI6F,=LX-뵥ksj$?YʜKِǫ NW/;0[eGfϮ[oKm<>32' @)_Js]m!""""ω9|"#qbA/@n| eݒ),hQ,ld2_"ByUSsZ |+5^mZ2ǧ`Į0x#jIL|F/JF`L&I{2 i-x!T֝NIΨ9ϔkdS/mf,gOs9!naq:""""ȑ#D 3?޿o>\N!xk}o cE; pkM¾Ew&R}(&Fd#/Quc/S,=Oz.e?bO7 $ѝ牱-AN)A2[{{7@ =pforeh"b iXq 7W`ɌACrM~P.თ.# 8EFa"dϐR^ n֏a> C_9x? w@Xw=w4"[ Iiؘ/0@tloq]0H~ҹ0)OZtc!6M+Hw,;(?+n9M|X(g {p*>U+Nْ͚=JlHd|~c<-܅'VK&H9`$Mozhn13~gv=GSaM{b{<3:=q%i:NU """"ρyp4tZ _o=|3;?-JoyEB-yzQ(鎁 \5ɩW/k։ \oʸYaNѨ&+ ,_eͥ0NdѶgC-T}pv'V('O5IL`ƞpbH,1wv`IH,,zNc2\pw!B.yNKmK4g.}ka\K#ӣ:#^+t-[]}9a?'tK! Р6\%d>ril2Rur' '$3Ak6+'+@fCy*VWU>2|o, }jҷS5V_tQ`+w28&Çt˥lvG{v-{*w{.S/nOE h}"""""#VZY2,|ܳ#=3tɽ+tYLzswHN:W^lD^L4gs=ق^{!=} ҕ5$(и 6ņ|͒z} RXeзoϭ&"""""9O;.Eűqq5jԼګXEDDDDDDl#(""""""/`QQQQQQQQ````MNܩtdEDDDDWڧ.````````QQQɩ;f blt84j ^&d8zPo tnnA\2cY_1""""""P9s85o?_Ȇ\b6I8;8c]~,O ? B޾CY`4ga\VTQ~$đV6ӄ]UZ6" 7yj3W`N [OO:;ƵmU˓ny(׹ =XzsĽJ Gý_EĒ쑏"@xUż_xCC-N]OwЀbv_#"""""/ߥku)dINg'Ǥ8b#*тC@Fbq3""""""H69}7￙RHQy= yc1<ʷ yO1$:  '&>;wvtE}FDDDDDDy/ﳏU5Cӊ/]p0"W0{PԎCduP|H)&+]^k*10u*#,&x(m+bV5(=_ :g_jY^#"""""3>{dOo:P õCglzI*'udD9+wdzT>;W21@O{9 $%qw=7q Ί|ͻ3oZ9;_;GXO[坁?m1·lH5wg*䵀>CWbpK&WpvN9ݬ:E YgSN3 VƎ1 k~ceD1ku20+@$M;ܼug Rޖdv'ƶ:Uc]l#QҮr> U;fۦgoW*SgYt_MŶe'ޯ_]Gq,iuh݆B^m5{=23i$sɫ&>Og#v1xSwq[ĿҶ]b͈<}Hzm79M\2mَ7kV|` 6TLÿt \ ȶEDDDDXDU:i|p~CtIHJ|20cg{˶ywPCnoc*mzD f!cvvƀmbi1?8 {sJ#>rwy]vViْO[D0n.&L>m`z"p#{lOn۬Nn8D&aw omb4QmrၧUI#~<|pvb\"""" "<1Aoȣcf-+˫689I7y46}䶀knW.uLزk8v☈@a0d!37Nn)81וLTL ytg}.K*VJǴQDGBI{. &* ؃9$ Iqw]ܸkUږM,>}Ui!(ϫA#""""xX$'2kO`ƞ/Ύ e鼿"i0]JH 1at}73& IDATZ5>>'mMWF2l(&g]Md1)dpqJcanܨQ uQ. :Ŏ9ٓbKFUq)\V_OczdX6_oqjx:#8֬˟EDDDEyfSo%ejEdм;ce}?YtT |Э,?/c tZUķ[gnR|6yL/ P msh؉!\OlQ^wîS6dƵڶ[aYl2hZv}&%-DDD乢{EMitl>MXYplN,F ԬM;}s"cSyoƭi(ȋ&Ͷk/wS(1͆sZs5%#G dVl~WPV-5'J~َn/-A)5 iOL:%VsǗʎ+mHr:%([^ʸ?Twcg*@~xaYcRUAxR\,_Τ[97?.tW~9Ix `caۜ|-GAsz6^u7&854e+Y}͙gTe͋1e#_zT~Kkx;s3GRkYJyowog9ç]?px6Mc^.,xX ֕7Y/kIӋ)䋮hk1s%b~VrqҎ~ TDZd=0qF,p830sZ-XR5O<\' ݶ erzL#E77m\sw$Xգ~Cq4Ő!Y7W~~== """7}X$p`}HNn2k^w5-Wܨ&/[)>fihڒAj@,޳Pae;\ظQL uG-6 XRKl>+Ұ1:MM)SB|N´mP;Gf*QLiP_ÅG_?3}ƳO ~KØ3FL& 7cLvD@ӗ2A%|LFcLƫoܦ;.pn6,Њ/w{8{8x+%&af\W"\7_ʶOaOZkE09U.Pl\ 8@~Y YxVDDDXDV É{BpwYf1]?"CCaoff]LhAlO IWOkzv@Xu'"V~W;4wٖ{\9q߲ȿ-b}:w8{t :OjZ6JӲw:-.a[Ң?kҨkOT޿6/1\LùN+} 9gq{xPzB ߎ29Ek;Lx?u PXo*>ҹ[:u3~]ٞe5 OGУc#ʶ=XGz Yq<j4([VbhE:@`w46;BDD`ltgZW7cXcX7FKcs'hڗCvvn̄1XѸw?:Cҹ#lLqӷLk#"}ǒIƧ(1}+vҪ5OǜM˕ % -mIΨTlsM4}-D QmED?sW,ه#?dAIv$vX/lD=CfLƥHN.:0L`BCC<+¯dx\\zՖ"#,Rt<ܶͳ(""rlX<.p~_z;;;llI)) 4BNf4 ~EDOo [Qɗg6ATd q*_,"2F܇NdQ 7|+X(S73*_ Uj7`k4j,Aՠڜ8zP!XXD6 wglH̸SLҢyvÍI~RƿP:)+]` KF%$5ӟ.os`x=4/nLFT H$Uz,dx\4F/bx^԰lX ϖr(+ܨ1d __Ȇ5K0^3`B6E30A>|<_k|2=쮿٥C.aÚx~vGDDltͯtgiXDnmSqe1^$3ezVz, iֱ)5>aQNbcנ< =s.^]!<"""" "rǙ7|edbS;ޗĠ3tv mKR+Ѽa6\lygX?EJd3ӷcʼn =)u{ZqLx3;qKzU `}#X Ls?}F~q̜vTsp,MvMVa"hҰvF¾"R.w?c39 kN9[ˤi3Y~!Q~<'3lkc7gQ+[M=M{q̧VHdձ|7mᡵ$WƋgbLZntlJ)ruz)Fcӡ5+~Fqb9O5ix-Wk.CPzW|TDDP'nc#mx[#756" [`uR\(/a#A$[Œ<2:of3doI& a#lM#=9j5@!?sTXlkդ&p2yz͒f54l8}ʦr`җHcݖTjQ.3x=3%1q6;wN*""Œٽ!k)EFool OVDXD}>}ƳO ~{GG 7b2qsB`̅h9o~Gq""n>CrǙ3{gƇI 9v.O;3\>C28_9ΕS}bǬRQ{\۽{3pwщ9Og RV(]2~L*5Z^o2-̟o&G \lhl҆)-;$4" wFn!2ӉHk&u`P@ʷoCؖj!Ϲ M;6Y^8c;Kv'l ^~.GEGr .Ե#blf\5oޕ̶kΐNZAi_ Se-_n0նU:SҔʟ~,:|%(On-iZKb4^vW{Mnt鋥RYtϫL> @jZ6JӲwOg6mmBhAZdlJ53Uw?:)jQ~vrjy:GKeUGZ-xap*I5ʴ`k>[2-R9^ ^kXМ3s0ե' gaü_c ""R吴s#kj_I+= )')B J |z$`|||JP>\;|+c<|;_OdU(պ)l?a`SN~}B@n:һ^irg΂Wm.x /jg{'@D,&2%m29u1yF'cY5P ;o=MDQ]!ӬP} lyE;ɮ`!/[$'}ї*Է{J """"">.$]N(;"bI  *e"="/gJ?~#s r]d[a4jIR6\\g|gt?M#"/c}DupɇⱑKǪR[7jM'_xN]Ρi`IF3* tcӽHɶcѭ*3J5p=9T+WV|jr[;h7PGG^6҉=ɣǎ'iL'b=EDD/N\R9+cۺ-gx~v9١hVAc8v3'g4.\L?t 9DFB?$s&ڷ1f1;Vbfy@*iv03V'G B*5wTT nP9ʹpN8vX,撖kж"g e *p蝧ym[ ("""ۨEcEoY}I1g찱JNImР&X"ćf$cY7}dV]!"""" "Rpb4@3 """","œ˅_l9Z>7gju'EDDDD=(rmB?_LEDDDDE@er$ZNYI.lV1DDDDDXD/w$l`껉tgh>MwgC*3222pu+BN,">μGb.ĒkUQDDDAՠ*D$ "r 2?MJ!"""Ą8N=Hr89:ak4(f223 1!NQNMDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXD<''GADDDDQX+"#*wVDDDDDEM1aԨ """"rrrtF@ƾ>M `M֡I:*MhXDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDXDDDDDDDXDDDDDDXS D# ^](]%Fkw+sTy>wzOĴ =:=>Vf"""" "rϰҔgrI:{U~4 p"""","E^.{q2J1#彥G uagƼЎ #$lwgoP\&ex_\өxrrQ&\JDZZ'ƽ ?eR .4lv$@梏hM =ל+ؚbo>LTk*G7\7t:gj7Y1bN]/6jӇO:`W9_e$<;a3\ā!yN!g2^).vO9C7q&׵n1cFoMODDDD],Rا'p9:qDKyd@/#;Q/=هԉM8,р=p{frF.k ߏ5b>iMF шÆil_zr~|GV3f)l b{G4Z7 HaϚÔց^9D7-LIDAT_~&F}iQX7}&>Xztw 3v9'0sq}O^֊/0Xŭn7&ى:8'jW\ ا`N%4*aƜBjk>..;;bouftaۀBO3oMk숗ז,~76\l.Je{l 9\;&=1~RnxvS`r+Ӳi 4%fX>\# ۾cv852'ic4\𴂩Lo8ʥ|jonˉ/&e!' +~xd $Ʀ/+,F7ou+u¡;o3q, U gQx8aŁz#^*^gKKXYBǼWЯ[T.%YxyY9Q b`I]y""""r蛘Hqd(C )v!GBZT='u?G΢SX"613vx;cˆv_̕lͳRa5ѭ=ٛޯٽ|>gaװ1͌5(^N/w#&'V߽~=jfqÜMc7_93f.y[7mENzU ٛyVlsjyop^ޤ]SDDDDXDn;f<]ў͋uтS>V z{6k*z8kOW }i;O}ր0fS4n!a|ح,J;CP1_LcW'14#4_V3g?F' {67:u\K>ߚWS謑GMi9wg\Fw.ՌȀks}4%nP%n/ jDDDD1ZyV΅pı;ިb!77t<^s%DE8{.Ū˪""""}I1g찱SR{4htqthr혵 """"łFEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDޢ`;+ p DDDD>D#& `b`=z*GNQedfpF?- "ϼW"""" "߅*;H񗑑"#*(ȝ8`2,oˎd zlglvn&rC90c8Et7rbwmiXjwe0W6>=?fi9y+i JcGM痬 5'}uyU]K?l6_Ao= ͚L|jdZp:E=ؿ4>(u%c1XV7A^btʸDcMr k[Xp^|5xu{ˆ1_]_StћjUKSq]r\B޿!iT]C">KvhXDJo5ICPzֳ>҆j^yVms0ƼJ;ЕW7ׇ:RրñL6_dzY|2lF6fm}8{EhKZQ>yvb_}(9}ه2uL&/JC):%Xcpo7w8ڝ ,X~x<\O1K ⎰!ܓu\l9ru=R}ܝ*֢lʼnJHf/ )ި˼k9]_DDDM(i⧷f0M+aLem'GVH3Zh|I[2wqBZt%/a#A$[Œ<2:of3doI& ƸЕff_՛GP{k$~]Ϯr<֣.ݬ\Q#(ק3 ?P>a`B> 1OVԜW9x*A]/&(aa۽f0V~_ ,)3+քnxDdG{(N/F2q#MǫC|{ޞW N ;׏ZL%pu1@|V dDA-w<=H1c&{x)0r$h_ڟ*?sӭOxzR^?,wmB;ސͤ% +Dq*64':AB~;Ft\(#rsmm* ЗLF'{gݩcJ7O9t(ȿ5شR{(0lLjP,G}]  V-B|9-l Ǐ7y I)B3Ւ@7C7b2]MI]~=aH*KNoeSj Ҵߝ)DMaۀZ78kpǯR Lө^hR"@ٺ՛-IUÞreSnVCx<2m7 /3}ܪ^x.4ִ[`GW3\;5W2bL:g3ӋO7wI869Cxit?;\Qp-"""o`ȵ9PN6Жǯ$o>?+\57-M%x%(M^Q./Ͽ4=8␰ cdž$/^I#"2HuV!ֻkWneĂ,?g {9ፍ2OdLJuzӹGo}-˦xwI4{-+Gԍk """"Chh՜g\x8'OZ,rssIKKsqo5W[BohcpO1Rc,4IbQrJ""""wņųn%<\\Ώ&\~n:9s{ޠA+)""پOÁм~ ͎<GDDD6=g Ch@1fow]s&}<#"""rB `vه!|]72HLJ }7o~_"_}qd6YzwyX h>~F[?үѦMOݴ"""r?Cۋ?HElX޶U5KY>џu;ӟ-1ilF[~PT)u0wdO"""+} XN`Io>I7zu`?د;٦F-(w+.]1ǖCe$b!""," +Nw=PӞK:mwa1*?}\v$[Hl0c;cs3́x});ޗĠ3tv mKR+Ѽa6 M3]!MMmP?j:dU`I<K7Y8fa 3>1e'Yb2ϕ}'p9Lm51ThD锓䍞SʆsGX;kSv]ڶ٣!~.&D?*HĭPiHuOOLִu%hW7Of66'0&qɌ^r[?zIv}6]^tmU_IrƓ{] _dߜO-S/:8fprޛKXq:E=ؿ4>(u%c1XuVg?[jYX+3d1,8)B{cFl6:MkEDD>\>\j [g} ռp"c۩,v ay1\V;ЕW7ׇ:RրñL6_dzY|2lF6fm}8{EhKZQ>yvb_}(9}ه2uL&/J.׃[mnSjH hJ˲?sVn#zbk &DՔ|=[ vonӧx;l^׈X4s&l¹q,7)řKٖCӃpY[3qB6RmfOږU,=p ?1k_j)~dwn9??l {amZ ޴xs$xy5#m苼V\TwO`{䑞:VޙYpZ0٩Vh(am'l!cp/_[ 33CYqM(i⧷f̫,7}.>3ٞ[!h麊%mYe iѕ>6pU\jܟ8nKRѡ D~3?]${K2 $U0SiUy%Fr-c=be;as>BcdDz |}:q%x44vUY&5IgFM,r4.ST)SÚY_cDɱ^B,Y 0(# LjLqP!eksl ,eH-jT1zsuz8Ф M͜|r#+m=111b9gt @ݦn""""""5@HÆ[! AU 9r8דOk 0Y**,kY5u=\B,:tDDDDDD$'uL&قl*׺Nl5c1v-j- }HXDDDDDDs3jԈ7{ Lǟ- ƝwQ#:tX~5[ E={ӦM^e;ӽɄaVjpt:;U)""""RaN9/Q#6mz9iӦ3j-_O_iӦcKr`O/O\Jxt>LJm%Ru1JfOp밈h!R)wa-h|6vG~-u d2ъkEDDDYxJL&ٳsٳ`2˟;(xub`;#iӦ]- "EjT2EDDDd05[l/8+V+ӦM/xщ{j>1_l۫HMdJCevYVQ.EY#@C9^$"zb!Wɲ.T黌ȿj&_VGHuP-j)GҰ! 4e)-- Tzj{<\9dhP|A,{Q4şI:Q`:z8\oTw""""dpp4GGWʲOݻwU6T\Gwxl!_›:P&{ Y/y I\FOW"7d-duZnOxW1GfR,wnbXV0o9j!={7,?^el9?2ա@eh mҤl![""""f60W`WzU/_,㥏'茍uՍ\m$1;4dç|ٷߏъGV5@27*Ol6$}B@wQY93q ß&k/uX?<κRػ;=.( FN׺ z&ܬǻT6y@ߙR\ w}6s7G=q)O>BO]ǜj]cQE7`/ ۏ`̳ךInn Wdr pwyV~ScL4v;>?T|+}ӿfy.lXFV|'ʻc# ^7p3!Yy7?LL){xD%+_.ÝΝ.-[Ne?tIůP]EDDDDp+Zɹ?Μ=w2^kvsV-#blڑߺyf=ËJ2qei|{KI<ㅪnV 7oBiXRXv g#3+XڎG!0\ߞLB0%Iۙ3osf~sX'7`_OܔE\woLe_O5ٿ<m4xoNb[S6z̸bs~(Rq;_FBw,soVwe71+3^Γ/Lkp.n9Tl07Ic d+ !\Y7Ot {! "( δ^Ɍ[df KO./~ؚV7Bʲ{O_zv`VWL735ͼعaOA=Vnv{-L kM3)/UCl(ኈp0DZwӞNl~ _?1ګf0el\v s|9o=>=0jH&6KcS1ڟn}oΘ:|hK?!=1/8g HEvؕuze`3<_w:Y"xw˖ C;?~uh}՗ʘEDDDD@X3ZXWXk.9u,-u173}s]|8t^ 9udtVLxBY{,>DƁl>pGpg+1gNv~٬tjǑ; O=#6Zxfßc9,'g>})!W *v{Rrr+9`RQB9dtcؿ(Kj`˟ڋ;.@"9Fa1Gœws73qQ/w7>TW?Kb!i޸h=^᝼ټjs/<7+N'Vluk !ް\??mHpã^+ǀ6u^?>{Z>Ɍk&rޑo7~dÅgZfI=?o:H[31oQuЪMBjӪrQyw1<{/.IID..rW3!8Zmڇ,qYl#~z.>oF&sp{Pp \s9AQYz^s*g]ŰAٸʷ=gT!VŽp_aR^J|hhjfjL+9\!XWDDDDjRX̪1K{ ._i0{Dj0eo vy===0 H>&7OubǽwҾ{|cO.m9O?בlw7?G3F69)n{N~6% 7=K>wWr(\prС?5 ƗL#7_@ȀAk=;tM$'V_L["3eq7/En<_}jNmZ 3N#)) r^ n̓EײEKԩ @ٷo_-j "5 aǮUVGsc¸q̙;u2坷SNUG;+P=ITXp:K9?'}]{v}oKr "3wy6SKzrǃ<85\qj};X/[߱<~s<>G$&^=3==M؞\l/^XՇ c ْ{m8!CeK~\JGu2r^r0{ٺlnZOŬ P' jD8EՐ0f4Kv̆j~8Ʈ߳—\=_mU&խ}r`{){  kʕ(ucWXy 5VUճW9s~sݵVF>zL&sꫯ1>z1K4n25೗vpO-kȳ`ۜFXwڹ1k͋g3KQ̼[R{9fov:ZFLk^f@n/wxЦ&<.-Ԯry{(~};`rO9~CiK&$L|?RSQ6S} 3+5 =-}CAKӽ- 䊰츸'ØChnِ:\Rb5>5~mSىXlmz5_ۺ"9yg43unlg]JA{{A¡Xb9'[ڋ߾dkHv7E䆙pŲvwl̪H_3k{r ŇFC+$V{6 DUx>FPevu;E͌ŬYI/I pe|2:&%bAdise'{1ϊ]3q7@v}X<{9WY'(Yd w3=ķƾf'AI>~LD]?hc[hl"jVF_Բ2$[Ы/fex~L0=DŽǧ`y#;vMv\,dߖL4.lޭϺ9N٦d {\ۙnKBsze I7HN<~4q3mzQ?̶x@bb^NvJyh09tWé/7/[&{"q, m+nQ7Y}84uK!`66gv*^l-JTGH<+[5gDZ;Aqi!Ҩ~e*~TEzmٯ S]WZuy<=w/{efdwrF5=CYt $Yxe%BZd~יZfx<|k*|#!im_͜f\.ͨkl18h.yݗɩ6/ 6$-ٻMv4. IDATr8~E-Z6Q5Vb8{2dn*㹎Gf;2sȳx^MT~\nu]HAD;f+&o{w/OLeM4&1sOIpzDEQϦǤGe;oQ/8}Z=|fA֬[K=zy;n.֕r`a<Ko؊{W:O~1م ΐNv؆-I p%SyKՊk&/Yu0mﮣ__Z?dֺt咚Z-iBxDed̞Ӻmɱ0L'V]fyxH+<,N;bv:="~ne,H$ӳ}Gu8??L#EWtv5{:{; ԔBRGZ)CAEɊ.Sqe=VcݖPv WDj<>c.w/sd7ݻ`ΝLy]J\+~}{I"e4 F/͛ҫ{hYUU}uO\;0^^~_HnN.} +vmrA0}W{COk\/'F`.i kU\ yI|0d yʱ$-^yx&&דC g +h+grYO[+{xkH]"^FݫﺏtCYA\ڧ+aPa hI@j,NLhN!z5kLKmBAz\؇=g}[>DfzuhI i~)mxxf kw,EHk۪ axm/BRv>*kDfzthNhܺu GqxOlb2).|NǷ]?kFhY+;?EDf͚,QnGcG9%,iپW@ pP`m\.<IḨ.MHL$(vխ_mJ_Wp:;oέwu^^={Y+Wa̘3Bd;or͚rl6QқGI)I֛<̳|DF8m&Miݪ5/r|wp)|f!%!ڈ{9^~Gz n{@Co!%&KVg8Y3nj(:ӈߺ-KasȓE’@zuI\.@\ZqO$ &ϱay;I?_NU+:K1r+=//콺'}GŔq*d.v Wx{`3I=%k#ɉ>Kyr4nN[9qTTDT:e*nԴ(s]*R c|~uH~bǙI|Q2 YʁHuNÆ iذ!Kb6ׯ/fӉ;y{l.?V`57),_k=~_J*29\DcԿvŦNMOgo>Y~O #GЪU+5pmv6lVarsrK5$zyc͟k82aa)ii֛_zUSPf%IvT?""\m{+xnP:a4Zf^/:q8O?!+;D/O/naM6e5,*| RjMU~+ecjي-[qwT\(}qq6n„;&oES dafwTڝ+aHe20pU]j`61 }VR;Ŋtt8q¥""""";aLfL&f:*K&LfE)"""""rd#U((IOUȅ7oެZV&""""WjZZ?ۭ.""""""rQP````rEDDDDD """"""R#oq+~K->)1̟?@LL ͚5iF{ODDDDDDD73ϐ5kCexxxzxEƐpǯQ#jyU]R>{Vekhҁ$"""""rÇSOSO=E׮]cѢEb6./Evft7tNTAGNCGg̘Ann.*͚5Ϗ^xD6nHTTM4)}$dMW#Ms~dت]⫽*""""""UwEhhhA=Uشi%% gtkH 4|$0y;p36\ ŸCpF|'16Z i5x:܅g&%cl3"^ 56{l"ʊ-KkoA:DDDDDDJ 8B-yq:aݿ_lp`{aSww]iξy_MDFBHW ֋Fyl=8qd¡-pGQ?O续GpvGZvΌ7ɉā:oO1v.\6*.c׮]|gL8^6::@./IE,ߋ~?!n^Mm.{cd`܎Xc\ݗ \b͞WFEb&#y{Tl:3p_Xo!#NSHws*uDr\gEDDDDD.^zM6@va<ü\ve\^ IjѤP #9v _tzNfMc,}'zw"_ޔͱ9e9"""""" թS{Fƍ $==|}O/ӫW.vFxÊYJL3skNPZ5D?y/93_ ͱv涙"[mn7"@zErN剎ϾQ\WAeY3݆QUݥEDDDDD*W֬Y3:uD`` >L#ڷongaʕg]-d0wG[$v,+ٖI>{/ݙ07-ݒٻd>so"֯ m => H߶oC?rIIN+bM9IZ+sV$~Gn'u1Ε#=GvaCJ|"GI*СC]6عc["//G}-[мysf̘Qٲv­t2=}?ՖW [_mYdy鈑jU%yVvvy7mҨj@SNeРA%rپ[|/;T?jSI&iH0 DDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDU(111e*ҠAU B.""""""Ձ@(((((((((R+Ȳg1klII=6wm~#^/e/ٜ7lͱ.m""""""R]G-Xwj]""""""r!oܹ\~JjVf: }Y3%lݿ wN7enz߸}ou-[rbY~}3 ~~\?a{yЬx{d[r&_0e0vӬþg r~?WlK*.:7 ׹ywj8aN%rO$}:#Kֱ edF$cŤ:EDDDDԗ-k/9KO!BHrN`cZns[f-| *=(lE-3sc7n6ĜXvLuw{t|7%fſegSrat/rMPP>ck߇xp%nx4iG!oN;ȦuۉyS}mdźDe#u| җ.O?zGI74- .Somp,ۗJjr>\A`KHh{F:GcO%W磈T잽JˤFJNZ,tLWS’gY=ܰZCsĞn qk|5ު."""""r`agzeGOL81ϟLdWɊ\ϯS׮w}ߘWfU0_۫ۓh)W 6nHZn.BPT"h"r\iƺ`?+E\oo.<.s/an|y"V1 =2%(bCi+9xhOƭPJbOyȥ}"MrH91W=t5xr~nRg\lY2Æ +Vq.&>/Lo /ٮ $-|A @&sip| ^yzwى{wæse]i}Bp&dC3>ךEj81U\q#\swr5V^z2m;:u?cP.TOJ8p˗/'66Fpp0ݺuK.5~6oرc`᧟~yz0QFt///"""|&/9,+r94QٗV0$&~S2;3(^|oßfؾ1[r}iJg!#3ˍeI|*x$b1\OnGCn 4Ѹ@J*ݑ#G8q" . 00OOO;n',,^z1cm\h?: d_{\f;fFn^x ፟wZ)gGx/`}{g|3lNY9u|8󶯯7irL硔CNNW^y%Wfʔ)ÇIKK~cǎ[TBCCy/m;v,6d֮]2e ###PP"""Jo|K'ˑSevEݮiqc?2qY3mc8>Scrw'7EP߻x6Є6ho~NamяMp|v^5kְzj6o?({-p뭷@DD ;u[;Dm稺 mB.?Ϧ5nru *-!!裏஻bɒ%j*qbccYflhh(&L`̙nf1b<׏xfΜÇcرVW˖-y8pgy͛7|*7~xZjE^e˖ӫW e###3gsc̙;gڴi3qD +Raw\\_|V)S\c*--eٲe4n''' DDDDXDӧ{O>N:|ݛnV.]Ziaǯm{ln0{J/VZ/hРr<̙3K6ZÇWy7x#>hێ'$$[^)++'$%%""""gä&k/<<%%%o̟??y_:Geݻb)ʳ*\_c=ƫʮ]q,?~ XG}z &0aGX5kovḅdeezֵW^tU9^Lep_{*wwwڵk;C߾}ϫ=NLDDDED)7xV^M-of֬Y\RR?cm1dL믿/~!nnnz####ԓy]-8vƍs<6 xxx|I\]]IOOכBDD1],"kVe_z6l￿˜j5b 4i|<T q˗/g߾}CX1^]ELL_ݺu ?ϵj"??زey(\qÆ ^61cDnÝ*7͌=5lؐnݺ2i$x+{';ȑ#[,^z3Xܹ嗫W>}K/UvmX>|x?ԬYvk@ZyWׯ۷',,2vɗ_~Ɇ 7nuiӦtؑW_}-܂ 7oog[n5~ULxx8}aÆj ۙ2e 1۷/_}:[fӦMDGGsw^z\i;vd|W۷cu^x嗩_Oii)oǾ.g=ӦMiӦ|'y???|M{*kР_5#G_~899q7Sa4{3^j.%lQ@Y,233qss=.??͆%[aa!fK}J^^WW<8pss;"""r-OwtTzEBxx9s!'lNNNg WS'&뉈O`(((((((((5twPTVWec6 ˊ/ہڒ10y,ȥ!se?1ၸa:""""""r@_wֶrY"EDDDDD.9ӵ|pgr]x4y'vϘ!8앗o4_~=m,[nNPV Zx+LA*Qu}?[ 1aMYDbc *`Qv6zwD6P{=K3SY1_m}rvn`y?+e(9_>K{XT+V;qs8qmgxT> XP5r;QDDDDDlvho6^ʒR#xSBz~`vC˘W\bnbK2Rb2_]\ r< <Ⱥ ~}aNKv n܆6Qd6lRg|5'^pdd~۰t'5[ٷ)W.1 JV3磘|bM]>eؼkѼݲ7ʴۢ3Ga|hצnO6f-5/o4:Qǧ 4hCSBb|k4}0^oGc!?e݊k7W ">M;Jxh1y&p1PPf'XY%]zX}hɪvx8V$>ԹF6f|>j$.uJY3c%;zLGέi\Ț_Uژ o,% ?M&5'#:ٳ,׋7#I%$G| 3T^F;/ՆXy~QsF=!_V 0K^{N@i0 z ]Ϧ} ] zbtܟ?E(}9?z_~]ɃCTumѣxo'7/Ow팯OyH-,仹aڵၛ+Ѳy3Z4B?ȶ;6xPw~~nhۆUX'/?#<4oM~~>?.XHXHH`Z;>lIb!P*qݻvf׾}s=Avr-]򢸤9 aHF>^~s]DDD P}GKSKv7xX)fݖq%Mў,8-0'~bnp>("#Qad- 3i&sIδA=K~#摎 `7qې.|`?h2z228ޗcHol% 0ԣo^]E.ԼU$)؀,&\\]7Oׯ#OŭϹqɵ4Uw\ڵ':ǖ3͝ƭ lĤdIڱķt?wO̬߬K:uhߦ6%pkn$%"( wӾu+GHX EZVV={gǮ4qu+I;q6Uȿg*Cgl:ߴ4nz*??n7Ph/fݻv母qww綞gϝ- nL/hMg\K)_NngF_Ȯ׾jo>M*nUdoaܧ83w o>̝/ƑmJma&*ޱv¨_˝U=GƩC/6Sf}œ-g $ _Ů7\|v#G -419%"<]NCNhXw80LV _ c~ϲ9~\\6f3>FKӻP.ؖ,[+V2sKhz}?ig2bP^ I;wӶ7mN`æ-=m,[_~]ŏH6ug21u`4ST *X_YY?e΢Ц7CԭuHQxʬV6Ϟ)..\ږFq Yx|6ϭp >X˜qB~-Eplthp0w.]3aDEDD䒻=6ʤ$ZrƐ;׳"!~-f6~~wjb\+&}Wa;&]|S} gh_lƵ ^D" `*1ʸnl/¯Z5k8&:YdBu<D*0z߽w/.l62GBB V͚ g=lMLiFvw&Xdb}4qKԍpB5?Z4c͟[.&Ku\ޓ]G9,"""|Wq\27Sjz z}OleNӦ"b{^nq=0_%خM"_*;aCRL„UFZlտÑLJfn IAҎpTd$M ڽ= bcٸ%M[߼eV+[O7FqI U^""","rݽB쩲R#avPyggFG#Ibٸy+7nQQ/@S&24_{R#>bZujצ-]6nƭ[+<7_J m[d 6O75LZSM WDDD.)CϞ=V;O-aZEDpv ұZ~3O?yyn||kQ+ &(((\]4 m-_ADDDtc{`}XȵDCEDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDDXDDDDDDq6Q8{5;sORNXJ˗^|f[2Z4v[vڱyZI S[O k<xBi\^1o78{?|/⬂RDNne9ʑ#9˙kOZȧ3f+ͻ?Eo<ˣ?g㤗9[^os9Չ!:;4(eUrŶ0SX46[X99ZHi9GI.D?JY,[YYnl6LQQ* OwLB֭f<]p9bÒ+Y/+֚>jumΫ/?KMpC|36űxNJ(n[=a Zzl~a{`KO `ԛy&\K(+f͢Ox:=L<~`X,bcctEDDD|WM#K?Ω j/w»]6<(8\@iiug@Z[GSr1t~F,Eo`^+v)w)õ³vgK-X T#kgO1t ]\pqF]zÇ14nܘ?aÆ;_L8_v+˜1cUf 0`><03Gypƍ'_~%Xߓ'O&))c-[7n&I'1łboQ߲2a{q+X8lo|e|;'Z}\v񩖸5pa4jiEz |OS/BD9#Bgr/x版 &&Ç2rH>|8C ÇL0o򟧆W_}EYYYWٳ箻b֬Y:9ɞ={]6NNN;ew;)))DDD\E v?N_QPP@->}:wuzщȵ$cO9:5]r`1o-4 .5CKU!@QPg?+m}b;em#7#>7Vaǖ[2}+Qـ]Ff~t: ͮu۽jnHoYAZz0X2e! a?VH$ک)ML4 e8GDD8/@``  `4񡠠??wFFAAA{\Hʘ;w.w}7!%% 5kvEh"6lHڵ)((/`Ĉ]:ݻ%K3T<++[5kÇ ODDܠ[k~ZKv7$6,.Nͫ]^ن~cbPkao^xn}4x,O-J}4 eI=vJLLLe9<90/222*y:5y3&e{6" \=6(www 0͸b4hcǎwqΙ3;uOn࣏>⩧h4ԩSu.v}^2e qqql޼Lԩw… پ};eee{15k߰Z4lؐݻc2ll޼7776mʎ;{am݆III[WWWRRR*yfbcc#FaÆ1esssZmǖ-[6~kjԨXo(\ r $ *{2dF1W^ ٌK}7n+lՕW O:WZ^vm?\a[#GnSZZ˱_nFKCkժѣG1L899a0`lwyZh5kС iӆڴi86m"**pJKKiݺ5|KCCCi۶muͭv&sgۛ |4h@BBYf#11~OOO<==iذ!9992>>>QZZ~ `+aYleC=uN5r l6[rrrXreMcC"Þ={+WPPplէ㩌FcmثRPPn?,Ƿ_VV,"" """^^^jՊMVvqUװaCWiٙ&8;~Ũvy鄄8%:^lNNNİrJv;ڵBl.,"""g@DDԭ[K2fFI۶m>Dhݺ5dܸqL&j׮v<""=z_lk׮gUzf:vxuzW_}o+aaa޽XDD0^jo^X""@L"rzVT '*..tmju\z|6A:ww-++c„ {nɪ.g#--YǛ7oN=\, &L' @/&Rn^ywtTzEDD.S`g4+DVZEvl/tMwd2ѳgO,X|xjԨѣiStRZh+""b[[f]/|c%NaRqqql6prrwԯ_lA瓜|Ѷyeggc۫@DDDXDcx926\5jDF.ɶVmO^JS.Ğ~YPtb\#UґSR\|A!W==3 ̖1N"+2G0=PT,J,"r_©uyc|1o]hž1x{bŖӭ=pjӒEK00ub]˸qNPl)q>`m i8l"~\a}l{0u qj䉈(K.X? O`CԮĝ3q2vn7a{J*<k[B"LWWlR(I플׃>('܉(cΎ6W=Omݚt:uhu }s0cؖ9ȱɲl6,L9w;5H\x{PrV+#/_pcާd; clٔ1` ©g_CPF`~eps^ZpjBqyq#{q1.P:a""""ճgO{ξ{ؖE""8;뮲v{yO &|S8iY\γ=O .:?"""r;u[;TY1P\ [WWDDD)\}1!DDDDEDmƨZj@DDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDDEDDDDDD.K~LeFRX_EDDDύ(K\Kt ((((((((_vvͱYs۷o';;[/j. y7nSF zIHHߢ, ;wqƧ-AAAQQQddd0yd^xᅋvF&Mҽ{;ڴiSṕ+WұcGi[[no???zMZ]gΜlܸWWWL&[Czw V_|NBB1?c޳gDEEȑ#/j0i$֬86Zj1|p6nȴi=zt딕qÍ7ҵK 9+ ѣ"""""ryq뮻]]~fϞMYY 8V+gݻ0tܙxLBN&77?gy+Wo>rrr!>e2%$`4huԡo 8p L6 ooK^^}%,,3fPXXG}O<駟Zp}v.]lc̘1z ?HRR"NNNiӆ;oҸuܹ}GhhhFƍII9H6vZ-[h$**~RPP3x'0avkfժUѩS'ΝprrG\wu\ݻwB޽W~mŌ3'22[yQZZJ>}hԨcǎߟD֮]˰aê_W_}EII Ud^^ 0cr]1LU vbΜ9wOk8"&c٘>}:}'>>3gj*5jO<$/&?bV+P[@qq '|gɪU+ `ԨQtڕe˖0g֭ /@׮](**3}:^ N~g}"\LWr穩L&ԩ@˖-X,޽VZa0駟۫Q//O[.!!!OOO/ NJJcؘGTw97ѣG=mh4F˖-ILJ"ؾPGP=f_wmڴaŊ4hF޾};fϞMi dr޽;֭GSvmVXO?|DGGvڶڷo~;k׮؏pHOOE,^o;իW?Laa!...<#ާkکQx{{M:QTTOTCprrd\`p}F5'srr]sv_`ǎ_DGGc41 @>}rUfht:s`و!777^HNAA!c xu0WNFt1]!۶mc۶Z'88B:://Oضm;P>ĉӓ̽UjҤI5j!yyyЬY3vk'''*_N6mݲe 1܎$%%:B[|111ݻggg|:Eff& 4mʜ9sh֬i˓o`ѢEg]b[ڶkdBBB### X`>DDDDDa0^Jpp0ÇA1m4<<<(**bp ̘1B۶m]v̘1UV9ns.Y~=o.< 5f̘1L&/Zܹso&ڵ#%%w}2bbbiҤiDDm۶e񸹹ƽ-?&5jԠ^z4jԘٳgS^}GΜ9cPFMG8>ӧ9>>>ULIa{eɔN$PC H1 AP,uuZή{umg(RDXAEUQ@bB(J0'G``H!..y<0R5Wܽ[7}ayG֖'T^^^ϵ/e0Եk7 vudXt7jΜ9)nv>~=&ϩQYX,.}I3SUTVXqjޤǎ(<NEӦ2hwpϷrtFV̟V{;WF!aqul=KVFaaO{jVۧڸ+wwY -[7 |^9{hlHlo.UǴvط}}݊O5%בǴպUKEGEX~ksHhnZM z4&c/mM>M=һ?V-5&co-Р}T Q=M_h0h⸛e6p8bG6 ۻ>\.>]AF7Ns.٫-F7mZ#5nH׬QveeZλjެZ6o಍ԍcFԾ\C/f )6:Z{S^=kE%&&*,,좷eOb(99AgÆ ʒlV-Ç{ROLL&Mjc?p5kDAA*,*ޣ֭Z¯$OM7~}xjlva<5HddߞuQ2 5E=_U^=j`2iP>zͥ:r5m]JmҲrڻW7sPa\nutf0uj^u$$hgn}VU-S޻WzҦ-_CJjWVCڤV^;v(%%EcǎhԮ]T\\*m߾]S^O[vXg髯RRR:_}ff>#EGG[oUhh֬Y͛7t꣏>UW]X6n[+Ww}ݻkbYFݻw￯(?<͛aET_^~6oެ-[o*)--ղeTQQaÆj׮]-[*++K5\sYj8Hǔ Ul9+~_xRy?CQaQbck>ɢ :nѣ~x<ΝŦ/:YT=_JR^\-١Çu!eѶLuRԻTFpPeZ)2٥mWr6uk}ﭸTa5jW{]k.|9mN'pbk;Q3lg.OK18ᑣd;Ԫysm]{}fv|Is+""B?^'hԨQZp5rH]vG}Tْ/٬^{תfɒ%7ni&_GEEEPeeN<2y睾AǍ^FQ3fУ>*I:|&OiӦfg񛙠\k׮յ^+IzW|Ι3GӦMS``-ZcJԭ[7m޼Y>|>I /ÇkӦM:|z쩂SyL/ڪop:uX{ݷ9Wn j%Zr:/ّ%L঍h4SZ;FEiGV##շW j|={UOp(@k੐hnTt:]:@k)0۫>YN[nsケ\nY-C~Do*+j3SDFDqܙ&Z'j׻Pyeڶn WΞJj(Ѩ6׾q ڝbC3gTTTz =󒤞={jGgtןwٹ***׿U;wTBBn W։uȈuMp.Uսrv]S5;p@mSi-e;w˓nWUՙ0rֈ}Ճ>ؠeڿBB k IRzz{1mݺÃJsճgO 111JIIQff UY ͛W^y>[rJ5J۷XKw^WϪ謑=&~bcղys.A6gWkW3,U<~bGpd=(eeZ9pVzwQtds܋zߧ:NEFDb(~?ZGٗbY%)((HzFZ?{Rqil 4iݫWYͬOw< OdE(grG#Fo~}ZdI떕9_}ˤZsC̿ 6h /22R׷޽[.K۷uyzz٣_|Qի^o㕖h4^ |սڶFtLKՉmVj.o,ɤxIRB|+}W UZVv+uyߟ۷ʉ U\RrI,Ifo2-ժuA_| OkW_+S')$rZKNYP{o͚6Q\lm ɹyy:|Zj\ib5STdD9cZ3l`UTT9z~.Tee ZO>yw ~\-ZP˖-;TknbccU\\m۶2Lںu|`XjM:tl٢;k׬Y'No߾y;syzz-[tOҡCTVVѣGkѢE*;5ڋ/? EIjZw|5_cX4e kFxz1j_mTNUYeo-dQv>o.X{b|2_1#Gj5g-x=գq,iC}zv"ǭWW^ FwεhTDxڥ$+c d:{1d>^NHfIEÇ^uѹUza\.kSڴ[>->KJu1]=?XZfiZ9QL_~ton ?ҥկ_?zp.ǣ~R&IVm[߲s -^X&L?"-ZHz4yd=JHHP\\>t]}պkTRR^z/Pk1bURRK5>o۷׹+[oUߔ'xBm6*<<\0͐u=p@IZ2o7YY9*ŷ""":N+ eee2[׫'NMT;vhN8qv?{㊉Ѥtد/))-m{83`V$Vի{W5iHΙ`0(4$o1$r3 vv\WK p/$Jsl6~%;œ`P\\\۹sgu?pŋqF|~bӦv0̈́_ 8 ^sr!=LY@~MMpeM@*g뿠.Uk@ 0`  @ 0`0` @ 0 0W>En4a@'5bڳgBBB4~x :Tt:|r[N%%%ԩS,IڻwV\\*++ԧOM6M-[ VLLVZ%өviڴi"\9;Yfiܸq??Oz嗵sNIRaaviѢE0az!\.Inׇ~'N_믿bM:Uk׮s= UV9ssUVVfϞ_]}}'E$p9}~n`0(>>^7x6m$IjҤ&MpIRnÇԔ)S@M2E999z!ɤɓ'kΝr\r8z#($$DAVNa.ȑ#GTQQ竰PNS5gUU~ZXX7xCn Y 4`nݺ111ϗ$\.͙3G}爇RUUo-Z`0m0kFQ*//Wee***#T\+.](""ڵS.].qW^4ǫ@ ,P~4l0:zw?G)D۷Ok֬ù9`!5ol^WL?[vР}@=Sn+ƍպu:/1 {n{}ӦMj߾5kG޽5k,W 0TUU}?x𠲲.i4hf͚{W&I6M+V-Wݻ[eeejܸF-ѨEn뭷R~ԱcG͙3G:t֭[uwhݺuJIIQΝWnnbccuM7)::Z7>R׮]{n?^QQQ~cmV&Zb?,Zr kFmڴQiiΝ=zh˖-۷zjl6%''nhի@O={$)!!AYYYݻ77F`@]wrss5}t͘1C ,P/yw,Ə;S&M%z-=Z=o+66VӧOj 7ܠ={񨤤De˖rigi֭:uM~[j*++5c M8Qk׮}NJסCyW1((H\/o. t+((H6MO=E$3WVV*((pţ0gٳUZZ*ժD9r7JIIў={TPP I̬sݸ8Թbh̘1ڿ_x/x~p2dddxnr$egeR*$U\.^\ vUUUR.׶RGy7͞=[&MRllp`0\NSnۯÇ|r}ݗ\Ԧ/T|?NhEhjZkd/9앗kھ}8wyG;v~f}͐b\Yf/\.}GyD<[ɵ˳*/Fjܸq:z233աC]u4ݻy999ѣO)cS\0K-dXV7o#!zqEǎj,'>Y$U{@#GkߨyJv{R5“zT^C&2=UsVQ)K.$Iv<U/?e`8( *5T!,Dyei5 ]43exSZIòL,׺MrYG0̿(׊ri)/2v$ɽ_r\]:{)I\<0\H1%I?+I?̷ߢ=%I===[͔2J2$I޼|UM*Әk.О-+Yɹ#6K ^fIƮ@9`v`C|?lW@<Ts6GֿuC 20dVwW23{)8HkG¯$YnEox`h ctfY2v,5N`.$4L`5[{N`?gZ,C2>$c.2y[lspU" {vSʘVF12o@^r][ד#g_Mn#_VdIrX-,\,}n+?^m4)4Tre1zٽSdec"Cx :Rd'G IDATEUM!"\X Рbe}>(өNнHSՌ?!oU,7\+w`}:^8 IʤTH+{Vمk҄?\S- &<}л:do[]XY/VIiEoۣG/ϭZQ b0~%>u\Ä%4.-AA͘ВBRQ0` @00fM(\v~BL= W#G(%4M` @ 0 0`gk:p@_6!KA\L\>wy'p/h'|Rzꩧt;Ғ%KjwNoFӧOײe|߿߷NVVf̘ &hʔ)O}˾+s=4iڻw/ D 0رcz'uꡇRqq{9{$ݻW .ԃ>VZ풤;v駟̙3|͞=[ڿ^z%=jѢ;=czꩧԲeK..'O*::G?Reeù+ 5P1cƨW^H'|rIn߯x ϝ;W3fPRR$yz T-$IIII2ez- WbZb+V(;;[\*//wץT}lͦE P gB6_vnXԪU+9rDɲZ;;[/Thhe˖iʔ)\l.I`A9//O:uzuJRlqqqϯ5iڴiarzZfƍaÔ,Ik͛7_~5ѧOK>$}Gɩ0 0\a-ZnݺI&z;wRSS\K;n8=z.өW_}U&LЭުg}VO?"##%U7Y4hw45g 4H֭nW޽5h IkaÆ)>>^j*EEEO>;wZn)))I{ァ^M6M7ݤI}eWXjԨQjݺ$X+VÇ ίCںu5iwf͚|IլY3eeeir*,,ѣ%I999OTZZ͛kULL$i/v#Gdzo nҤI9sl6եKWUYYiӦbHGVdd*ͦӧl6\ݺuӈ#(QIING믿N:)**J%%%r:+**dZ%U=z&O,á7߮P-[L֭ӵ^+zZھ},Y?2z7'jZd>UTThɾ y}JKKt:u7QFڸq***$U|rvmdM>]ڲe.7ƍ5p@IRV_pS6>[BB^z%9]ٳ~3fƌ# I5JFnbu -t &ŢPQQQݮ[n 0_HMMMUVVoݸ8_hϞ=i&߿_Rt:_ݻ+((7o ᪬lJgX.y߆.Õ`0\vFѯ2l6l6=~˫{L gkԨ4iuM-[lC2_mZn_-oHHߺω jĈ5CA]^^Y,ﯱNiii uD X",,L~8qB111 UϞ=եKZ`!"FFQ!**JT]w*,, Dw^(!!AZ51kP?c_4nX%%%]vikƍ;gI***Rllt_\uUZdn*ժWtt>tjر&ķz{=}СUVVV>j*lZ_-[jȐ!zWeZe0th4O>*..֬YdXd2t 7ݷoڶmMb222NWH2)t[xE n\*׫*_7ZUUL&{\tԭ[+**xTUUphٺ뮻!(oOI'glOVs3xvL# I7/_U4暋:'+GAKJVn~Z}_"כ?8H[  dپRP߭fuΚ&{ST]]C{~&-V]=ObIcOK{bclU-9v}ͣ~!޲]Զ2Q зsdg>dŗ!Y'7Om;t܀ޞ)C߱%2D4\+VKxxy. uro˲M&Jn3W/wOlwLBBdSAgpZݻ)2D!t\Cl'u:Щw}'""䭪k\. W^۫$IY I|e(pzM0;[]k١]d0zw_,YmK+7,E*)-m{uB+j ï.KxP߶_!`:"(0ZRW4@ 0`\,~BL= _/ M` @ 0 0`rɟyrq`,^XAf=#5k\.٣/9s=E UVVjr8u^WWqq~VXlIR~~/K޹s8 S}~Gz_;o< tBrܘD?!?//Os3*--رc%I˗/׀ԥK~L5kLx<0abcc%I;nvԵk :Vbbۧ5khܜ0\nwyCjѢ$\A:uqY5k4nܸ˶۷+''GӦMSdd$iժUZlM&I:~լY3IQaa}ݻf͚}*44 @}.^I4x'|Rz^zIGQ@@tP```;ڰa^:v)S(""Bo.]2}wj޼tqu] K/ÇW^qiȐ!cL:USN՜9s4x`|\lӦMڶm$o߾ӧ^Z;wjUN4dսݫ?XjܸF&Mؿի@O={=y+Ţ}o߾]vڱc nI&鹹 ݧ;k׮:theuV~%iСzg,m۶MG?t뭷jɒ% SN6lb >|XP||vڥ-[j*//O<”,ݛ@رc풤/;ԯ_?\.m޼+I>:vW_}UfYW5w\tMjԨ6lؠG}TTVV;C͓$iƌ]H3gΔԈ#|!k…zժU+.r{ѣGxb5kLZr^.KoL&^K.Ս7ިdرC^YVZJUUU1cJJJ4|5nXZdZlǫ@sQ֭մiS*33Sv<͚͛Լy:ߺu|///ܹsմiSչMAAjUddN8Z|ͮ-N~Z'NTll<x kĉڽ{,YOC׈#СC`%c,GYY $d2%ͦ7Z25jڵkO?A\bZ_ɨ(=cZhoݮ_5`Y,ǫ}ΖPvvF`kذaڲe&mڴQv|ʪ333տy<)55UvT ذa*//hTxx |8PaaaP˖-uĉ_\\:ߟ`TEE4enݺ2q8> nW@@FF,$l6UUUݻt*11Q!!!:x$qӧ5jxx>x`?k A?sL͚5K/ڴiQFW^u'''ϡCtAرeZjٲ%7$22RǎSyy<__hUVVpF?v7{o>ZJ VEEE Zr\ 7v͙3G޽ykXjEcm6y׫|tH0_뽔_|Q.Kw֓O>{Π> nz/ )$$7Bwyy/薖l6l6+<<\~ۖ*..Ӄ9O{ڻᆱnImڴ$|u 9rD˖-dR=ܦy:pCu;Pﯱ,33m*++MnL&ڷodչ~nt YΝ;~z_k[oi߾}׶nZ-~XXqqvܩdfjݺuzrZn:t :hݾT^^ڵko٬$}駾-[(//O^WNСC:yOոqcԹ|ٲefM6Uxxu߿mۦݻwR+VPrrrGxnժ\.o`˥?Xuns@6nܨSppNڵkm]O?͛'ɤ =3<[5sL=SVƍrQ~Dz|U}(/_g}VGɚ6mQFi2r\]رcgT]󟖖& Zr5j UVfowZl[n5iҤ_IJHHu]?P˖-Qu6VnV{eաC׹5l0nJ%3dddxnr$egeR*$a>ZpaM4I $-[cz qz[p:x<5Fw>Btvn[N󼣎gҥJJJRn\R&w/YįiwBBBޟj{J&ϚÇk}SM~]J^t!z83vKV``Xo_ hȐ!JLL0Rرc}G_eC:~Zjȯ4;v.+j` @ 0 0?&3^` U2z(_@ @ 0`0` @ @ 0` @ @ 0``gᆪ*6?RIHh!;^(DQD( ]X@@RDޫ@Bz۾*9ܻ3sw7; 0` @ @ 0` @ @ 0!p3~֏am tyO7, Y!p3;XTVJhʌt=i $1 LGTLSgbuÏe&2 E"uW~֏:qJ/.IrZln(өڡ,o[ǣ+WkݦR%սK ՙ1{&֩i?֩ӱ*R8B=bQQtZiVUP^tڼuyQ_DlQppZ5m& g۟jk2͊ZU۷lVtlf̞(PuNʖV\\f̙'W05oH nILeL޷8 8D^{CNQٳzzr84TURJ>]ՙ"}2~>6oۮسg5itu>-> 5a:?y6zLBIZbxn,^⫗{=FII 2]u2|~YQ9?-RVi IDATV~y=VWg4meZZi^w8OpKb-tl~ZLŋUTd$iדz:7n(Ibۚ1{zM¥OϣK={=11=D}>c5nPOq6=o}8BS>'I/aV}NIÇpgkoo…12MJNIU{ӷ3f]m$I3o'N/&Vjk^%%hkoZʚG PFF|iZ1,f>x4#ǣ^K3U.- IS7$\|֮[/ѨxUFQn[fQzu}W:K֨ݔ*IN._̅P-3*2~%^ZZt)f/JRrp4/k~U\W6SF*ڹg<9]lKvwHDAeJNM}(0 @^u ӮTFu%l2hΔ п:KI_s^]9#?E MUD┐sqzwmk;t*6bcjVpZ5m@WLjG*p28uZ3U\Rf꒤e &cxe|wyFj\5l:=HAg(I:s&VkTד?/UUjT45 pK`T->U}{?tmߵW.ɻVrJJ*WNl15yX uj7յzw={vJ\.2! P_S?EEi\'}Ztꪗ&!IJȐ`Pzzz~ZL&5oP%I-5Ѽ裡kvڵwo nI;N-5bQ0oSG٤Rwr+[i'ٸ8IRT $>{IS(P7T{TFf=I'}J^=/,<{U庯%JhȀg%Ig?а?QjղL p W'OkYlRZ|RҲ萲?*1)Id2ԮM+U([F8m,߬]^d" TD  SJxJgddXԠnk}>w;8(HO?$װgϞm[өK'$A`ԧyO7I'x"0 u%Jhܗ*)9YjRdD!L~˥sq*T eeY:O  @ 0`0erg]W,9[b&[{^n-I*Ɠ\3Cgga =N;(j嫠5bHII86BJ寬Q5XPU'htƖ օcj}T8 M9~g!j_*bD84M?le ϬӀm#$IAa~!Wx@ $1 %Ζ7)G@jU8F[豍$y$IOm {6FƄ}znH>TgKc7]4:Gmh\<M9V^KFK[rxrʥwՊꋘoW`O $1 652U -*aer7S.)[xzRQ>/ɣK׉̳:c=,MۓJh)}$!a.ky<Ų=ުT'E)\OP@oVk@ ST?Z(/D;lIj#Itei_yKMẒ ؙtXk+ T$,涫ilj5&BH /W=ZQRP@:m`S6'Ӫm;]'_% *|> ^=/ѵk.ujz~Ɋu쪟K~_EάS.Y%3kkkSTc m1a٧V+mSTOxga=C&Kmw;/=+NʪEڼNcke84Jݱ쩊WlyvMM֔+2 sǾ|3ڝrT笉zpwdօcz~(=mL;t0mF*ɞg7يgt$wwѽ^ZCw݉uoKҎjmN'Imv9RziX{:w`Tϒw߶uޖ`sZٍ+&_e=n=mH>NQM`KU5YGz~_x[$)ɑP_.)~>ZUШ%IuUּ3k}ux\uEֽ_ѨY!ZCNԪ;>S"~>?w ޑ_I&=Y;D}tՀIF(&e?<[.[ ,GJWOwN`555^翚~rF2Qz 8gkl`Gt5 }vdFFS f}uj"Sim /d22(ّ.ˮuU=oY8Ltޞ3%T> >B݊PU4Ǿ^V-w~GKuP5m7cjs;Town*Мr~WQ_['uD]/H\ci0)bcQ]im_9[ Qzn|C g[ W *TH IRr|ռP- o?+㷪HP }@O=A ߬[o3O_Ss$)̒Gdw]y$+c7 .*=+>sGaj7ZrmgӦsPxrٔ?_d T)P dѾc:+DvCQM>P훤zzBI}M9Xߟ\;ƨuM7x-7N9XMVpIR+3~li gr]zjYbR;c)_hPKni9 ~ V'T+_EtW}|;*OkVO+U54ڒ_GVMU%XCK(ȀZ|v$B_άmovr$-?Yo&۩aT.O12\Yc^{_VpzgN7%UmKh= kj_Ɏt𚖟,I22 2_~J}&I/V/;~|}|LW/ǬljXM9XzOZNeH(z^%i5iԠ5tyO} oV-ջRX,2Yr]ZB;Om#5[BT52@9QUdOjwbo*ӽHjQGoT-IZak-{R@ & GA=KܩibE_ew;FUFSm#d0鴪CFX_0ևkաH#}vx7Yk ʵoW}BnXUTO߂Xd18v^5NɎ4,Kup5>E ?ISm*=t6 F}>J/R%5!%IRRA=m&9N=V :ڵkq<:~$i] ~?ݾ3YoqL'ZTgn[q$Xl v*ɑ<ْT?ܷ ֟seCvJ^v[ۦ${ d0e+sy\%)x>]#Ş&ǩacwMzrÏrYf[c{֖0K9Ζ(Ey/G笉 Ǜ*X?ݾ6&Jgi KRgFQ/F|9f9h,e1Zr{í`RdaR ?+h 1 k_ϗK 5~\ @.́*' AjZ| 0` @ @ 0>OB-`~C-W9nV&\N`Dn'=SFIVún*_IMLIHF\KVssFH5ȔOdE2x@ll+÷/]RzLUr \_`ҡs4k$s2]zNyl6oPtKެ5ں]m\N )w>j,#:U|FVM/`B jyS To(Or:2{U2FE>z\3r;!OZ<62i U*D׾AֲIdX\.9r\7?v_+%OZ%:[73K׳Wc+hOMYOH9[ `-j! Y_x].~s:ٓem˖E+~ Q{k.us9m'*OB\bPJ\\fs<))W ރ25 1(OTn3f˹~rɓy}&Ǿus)=C#.1\!ԜțGճOLtFP-;dnwʳ!_;ȵmQ_nπ 9KyL_]1Js`2›{_J׫7Y/dȟO!_NoRy֩){P\ȓ(cٮu[$n!O2_@deʐ'8|^~[Fd*UB>A,5S"҉CS2Fn|UW1G'N=Np锡X?.ז1""rs˷Mse=KIv&YCyr #?u3*Wkl뱘Iϔs=. r?.9]l,SJ dϾl)˗]{- .w=f寝\;}Z6JEwcZ:`=Bpn=_+S$r1csZLIJ',L{R9w T.6qaYCwuPbV D^od:L]O~y bIܬ ~VFĿ4 WmHet%=2V.^um߭ng?~7Xׯ#6-)/Obh׮1b${bTxn`y_9]ɐ/ڷMK`:dOR !!M\i9m/I^oNI~``m`tRRS{ۘz*Y`M~%)$ sonoP3F$[@vqu/{?3@ 0` yL&S`>C B0O  @ffsӶsr 0 0`Dwo6t8x zڷӱ'eQ/_Naaa̲JDQNjٶ7_O)Yj׌$5lPO I p#ݥΟreh1OKqI%d2j߮^(:fؗX)îޏ=g/ѲJԬ̤T_ǣ ́cbU˩HZ7}%۷C˾E b}ɗWIlYZ5i?;jllj@7le+V*|j԰ Vmeٵn? I*Xԯ'ǣu7(!!ѷ"QE?_: (_pܹG$.]R56Ne S"?m;v*5%W^+:ZRzZYN3c*P@;vRUVBCBԩc{%&&_/WNժUQJrN6q^MqڬjܰL&~]^%IkRR%tSڸqUw͵nÆl_(+[FիWSzz~Kq8XS )7e~7]?OIsU[k*t8og}+Iww?-$͛W7Hd  GDHd.}h3T\9UPA fR.|S 诹?P&UtM2I}DCԈ?P%ԵK'^T $jѼֵ͛iΌ2)uQfͱ?ujT=$IShHBHd/I2"EԼYZX*U7ߨRŊSG.QF 4}zGTh18hv w|]a7LƎQEUVM͝5SիWEQ qjUPoչ2@ ):V^,_'dClY +,m2gԦC',/ԢyVߩ͛6UVmto~_V,ת5ե[w =zA:{F_x5j٢Wտ *P *ỿG U7sl=Z-){_횵tWβ_8u}͚>[0}גgwh4={ܯbŊrcD-_PK-QXxΜv. sgΐh`r 0h./.&u:o? EDRDD!hҥj{睾zk׭_I:}?O϶VR'NVt:w_ ͛}*,X@h3g\SE?ΙkDD!=wNiR 3f_IZfL&͜+WB <];wq}W4ilΟ?2%KVx~>#\rׁjZ0k!EWCg?6r]\IB:}&V#>͋ cDJ ÉnbX ?^>Z9+OOTK b_]:wu1?ĝ;egU/&F=_~`Ґ^*'5WS|323t͚iيق$n9;/IcO/ vJqC_ϿЋjՋ]wA#[= c6 _0eZTt R;IBϢ5[6lB+Wb}_L\-O>,u~7o7h ۿo_l0پZ-yV,^KjӦֵ]p\tvR-?W´A=̳zWy/ںWںc1عk=?P#uWhUjԠ/*5`5|h׮1oVݳQ I޸}Ign>߿U׭նYڷfK֊(]L,ؖںp<ɱpb֪NqmWUoć̦l5mg— AZ4ol}I͚zS?,yiLF`l߮U25xs-;p>is9azzg@yCc#۷a"IҎWFtlg*Ykzm[3Z=y L99ƳG٣=v5) W/JR173inɾ)`0`ch~ ܢ @ 0`ۜ!p , 1 @ 0`` @ 0`I1jIM)  xgVfwu*6oݦ3@Ǎ$=;e-_`:eT/\nMٷ>=ujݦM7l0H3ʵbQF twpgk]A-)Td Ԭsq8`:tV$iUVMKP5|b];Qz }{iJHLy޹|Z;Mk ZtztUh]9w$ejլN>q_~M]mT ~x>^2NvpܘpV+uW~|zyZr >\E*,*$wU}{RTdڶn%Izqڟ99ڲg2rI5eZN6E_/VW^|:oHUUUK6kպup~^oGjH?Tɬ$eK[$'ZZ~$it9r4ݙSlLMZm?3־/uɅխsw˖ю$UWU+2<\LZ\N]s2MӳZhhOK6u>?JQcF -[u߅';w)lVFtףa=3v8Կw/uI7gΒ$EGF*i#_5,79U1M;rz=ڱp];t*]wxv-7øqn_kiz@6pY_a QAQnW2M*-+[/z譙_ l)2"BGܖjULh| D\ؘXoh?fI*,*o:6_~&I:kG11M_P(("44Da*(*fߩJ֭[6钤>Zj%~++T^YqeGpt:{nKٹG~tCz|~<^ Oӓ^Q?8cQUup, 0 _{w =ٹ9LW.˩%0` @ @ 0` @ @`t^G!VʊKd)I&Ѫryd2  L/>ڵixri]*p׉ IDATxUhӚU$KWB|6[N5Y =pƲ/H!NW_|QVB0(jצ58RڵUeY`8Qvd;( @ 0`8L?7j|f@Ì3FՒ$ɤx{]y2 端-Z&48~-n]r40j M8Q^W?^xyy^]{5 g0}ݒ;F_~v;Zv5vX=ZO$l,qʔ)1c|P˖-… rJy<;ڰao]?F}]~z5m4UVVl6W_ի*IzoXSaa!1}'ϧM6IƏ?W4vX;V _+WԘ1c4g-^XVUUUU0aBgΜ)׫_|Qm۶SO=ٳgkʕرza 0@NS&Lի%I_}bccx~ǣ;vd2m۶t53$$D<~L&ITzz?fIy֯߿_Em۶$uEg֎;5|0#$'˥ vf-n7 /**Zq~xEDDhܯwonFI`ȑ#5k,}j֬:uTڵK Qaa$)>>NO=V^~[;v%I2*//@#zr8ZnfϞ-IRs9J5> .Izgg),,LzeR~_[n[h4{ڲef̘ӧ+??@l6;Tyy>UVVJ%I;vT-j_`D]qZt{1F=㊎-ܢhM6MWllxt=Yf>}-Zj37{$iT$)mz|%9}Zrr),,n[]vl6fΜy>^+Uuϧ:LQQdZVtbF|\IҺu&==]'ZV-dX 6 /Ծ}tTo5 NY8S,8եKu횦I. `8;kNӦM@ lSn^8rrsl 'JXdvE!Nm?Phx`8Q^nO;( b2D}hR$'7W-^^%DQipF]ާҒb٫$ Vt&r2\d0rEFMAN/8p 4 0UM~Ĥ;2 @ 0`` @ 0`0` g@ꑞd:qo' ^zJ7oOf&MsMDie4teS3ɗzX%K.H>}je;o/]ʁ`8u钪;^˖dmd Pz4UWh Z~`7Ӗm=p8jmW#5_?EkZz$ijѼB5r0Yd%IZr/2CU#e6_xFFV3&+IZЯ(soVX)`ߺ}%p[nQs]ڬJI$I %$$+.?LA-?Tllkl6$iqUlL:赗_Rm$IIz-,Vv͒V-[*2"BaaajӦ Fc }ZIIjL/>'IX,zⱩݫ%kiƛ<ߟ-I+C^4IdYȑdYuӃhh A ?j!2{_Yt \'wFLfu:u(٤ .Z0l2ڶm?**22{DdҴ0ݿOn[wOSݻuSIi*++kɺJy<#_YU^.IVKkp8UTT,IjۦfuQUeej*%t*:* _q4t {%H9Yk4띷G7 @ 9l*))$wK;b͒sǮ^.ITp-2ccc7ꂉk%zj(uW4hrrspUWHڤА51G酗_9$Y-AzYzYJM\?Z(h,^WԱC Rnݔѳ̦Wrr$GzuӒ6xy}vڥ̬=+e4l]wܮH<Zj`t%KLpé2Κ޽G[mMQ ,A?jkWQkҮflvuj).ix5ut:y`8 ?@o{e6eVmظQ quwyެ}ǎ/ǟ_|>Iҏ+VKЃޗҜ>$ũDA9|p}xY0KAl?֠5R_pu,\֭Zj/p(_{M99y0n8WݒMSCOd~,AZ,u\VZj?*,,T^}G[!j{e(u?/,VVk2DFFٯ1zy4pI/."uj!,4TXNĤz|ϕ$[m%I}nՂ`5-}u7|QVVve.K.}}}^&:(C{Cphl`hRO>Ip6i7H<@l%p)8K@ @ 0`0` @d'APYS;)tm7OVBB$fsj'L'>*3f7imp#J!5:bqk׮Za^ݻuSvuJV^X%(H]tQfV.1m٢͓fS.]Νz]'d٣J~L׮QaAi9vccbԦMܹ7 0DԲe -Y\E Ѐd6r3j_L&^w{lÔ˖q+}; tڵop[={]dVl;Faa靡aC*"2R ;zBB9VcFRӦMv&Q#GPǔFoV#G8ox_e˗+sϞcQbR,=7pU ?vliؐJIi_dXҶF!c=5 ׹c(>L&zꡞ={p`*jWc^_5 2+gOXJ{dI իgL`ᨙ>tR;u+{u霪5I%'9Կځmrҏ+W#;3S={jfcf;325bPmݾMUUX*++$>LZƍk+WT4~X%'&i?[׮ڵ;3pIyl6GL+Wז[5邉U~~=?m3^QQgڻ?[+ccN;effAh8jMt^l\EZb$P-[4?+&ڶn/+!A7vZh=uΗm?ЦM5/An 34&VFQYYCkffzꥨ>@H YԱ$iᄑ٣bccTV^ZO'lNr]V^^ 7kؐr8ڰqcUi-/Ptt***|S- dX@*Ym RL&Zȶ.OiiVXd6jspd6iӦiZḠPG ^5=yUXT))ҥ~W3[jm]N8+kj޼BBB,Ѩ N'o`-.lV ՚60UWUd6qZKG6Mz.ev]ӭh\E%ŪRii 'Z;w>liwWv{d d}d(**Z{r:\ 22 ~s%H# ^<.yHӥ`6UA3.g':v@٨Hܼqqq:x>3GUZ,X-lS9HՕUtUu,LCܓy`О,mꈗ隌Zaajղd=#ۥаP4 7oLFQ_x--)W~AiZ_EEZz=n~EDrULL9vZUsYyjjG[3UTUtiGR'kV^#ao];w4CШv]N"%I!!ꖖ={v{TZZbH& ѠT\RtFI͚%KBCCԾmZLl2yr;!(R栚قmZjlݦ>{zTrR0vNU^A~`f2&6F_3hl?3395U6[l{SͪPbpmΝSe2j޶DkWf,;յK!)+fެG!5=yҾzgdd6sf{UxxRd2Gj4q)sYE;u9NCP3htWV5zk;wֺC]|.@2TXP%KP>5KNRFZ,ڟw2)I* 1%ϯZn^V]n]hxelRt|јѣdXܣxU4o_@a ӆ5MIÎjw9,\U =iCϫ KLy`j;=].aEtbi=Jx{CK22^kݪ38q^QgGy*جVbիמ8\z}G}p[>4(5doM;ӑ*t﹍ ӎQ!@ni]?8CFeun 9@NB}3oaX؏Ks0Ϡ g? @ 0`sfJuuALFmٺ]oxs޹ܹZphGͦb @``8{iJ1˧gCLpƌ7 (N|:G6oܬM[%~em*))Vf g7'H0 `())SB\< ?׈t g ګ; p򤧧>@ @ 0`8uNֽUTu]xw3ӯ׸'$QԾǽ}Kp[n)`)pHv9r7cs;(FYeUԾi߶}[n)wfJ2dA˪Bw.(yS_?a`(AɨUHtmzu]Yn-<:Ch29Z0#UWuliMkW?ߣzLhаփ;K+5*ޙ/Ij@ϑ$ͺ9-$yr-ӫ7WptL p}psڿnO`Ƥ)^G{Vxr-u6|LbG/UR֪*(׆YK5'6n (Ua㐰d0ݪ>nͺ񻿫gmwN%tmw՛çR#qYf>)IDAT<}v[$'g]_.1Qu:N {~@Yҩ3N^98c^~vDZ{]3paOocO~_mvRۡ^o߬lO/w\u7Ռs%.s㒤[?\w>^+^Yɺ㻵峕8 h]c߽ ~l znل_2k {ǫFK]!*WҠ^7᩵l]+-ǧ*ܞ۰WɎ܃?FTS&Თխ-;c c綑JHoW,wKƤܾ-2YM~ ]Mz}?:1Q^-k5{Xr4'#g.3TXt7g]%8H'5[>[W 5&̵N#\xLc?cuߺ^O7 $y^l'lf%vRnU2HfYzs7xL& p21 go/҄ՕOZKJz{o)46LW "D>2`4Fݷ뜩}rW߭ΪӸ'Te,ҷSm_?j$Ć7n/jԣ7ո'Mi֨iǤ uN?^'2'aܸq~ׯݻ%I6*$Ii+ k5u ZE[tĤz|=}?nՂK8M;%EWX|$)uBO_S;uҗs&p p 4Ǡ`K~LW|8Y~_[?kpG pfX|-i> %0` @ @ 8:']*e:N{v<۰]*9e!eCя\K߹K;V 7<[Uds0I.G]2{opR{y5uTeoıGt-K4|rߘ"Z/ 5Un!{Yu`YHPݾQ}},u]M#gv}؜)RI7~w}1uڌP1Q-$]?>Y".zN o4raB*ޕS>QϹ& ׵䙯QVUsYaughǏ7_}Yi} Kp^PrIRÃ2Yw8qqaNqv媰qH|ֱޤvDg9NϹ;2mٯWLS)¯$9qw +lvD{3zv&vdY~ΣUԌO*[Ku|(.Ge`ݮ|yc$Ar927f{>`$hgf_bu|Fqx{^;n$KdS'Ժ, g| -jRizsģ_8=Zaּ[+v*{]$iGe0lcߩ[><6cU~GQ.uWAA4 g*WՁKzQRYPDB>rXG`W^ސ&a2 _ﯹ`2]uc/SkԚ@P7,Bڿj>1=8$XII2LԮz#eo6˝Ye:RU$ b7n+snIҦ IRJrۢuǚiz_<А gҴǟPN.":1smFqnՂK{~+[ҦM p 4kWzB0 v]p 4 0` @ Nɺw׳jO׻՟ޭ>78 ӝkݛ{1tǓ5y {F O нUr֍oOlΘ): $Qn.WL9'}|Ǥ)}^uǖq0d_km;ʫ䨰תQc1Ha>1| d 8\\v9UZ>KzDlZ7qZ˻LP`|^~x+XA61pNJ3 ࡏTTa{ddu_'I۸O:I&"۫Hk@a\7}A&˪Oi`7~w}1uڌP1Q-MCj]{}rWهڟimpS FMv[^KVyX9o^2;4oVw_½=Aʗt y`Awm\s, ҵ KkL}$h{r|^\v9~~CiSWik ȇ/+.g]Qx ROewksthϫ2\^䌶jzmz.|z^Mk[Rky\$vf^wMz}#8=s5veZ}3e>ՁY_GYu`&PEE*++;oTCvBjoZ>j٭*y3G7-*_2ˠiS{{>`$hgf_b~][IQ*_){觙Kd}%l߼_vӮU@{69Kj&JUZޒ:W>+*ؖ-Izm?vYK.ǥWy~[Con4zAnI Lny3"): 5gs(UVj3_j7><.BՅ߫k~ SuQoڧY7}pb}~s>vO$>_;~OsA2 &Lo0H9 ~-9ޓ$N~r7=}%Gm[W؃44&\TUXUQP_7yӶnT_n !_ iK е?u Kstjؽ?_+((k*WmjRIStXIRDr&\$Wch[d?~,٣j Q~14?Tۡ4$I`U=2;imڧ2]7>=><^͟Sߪp{:d rk٫ lrSvN1i٭'=!=F6~zzoUAZc(gȩkdՓ`m7y/88 ƍw{ܽ[iz@6pi=>-:1smFFϭ[`FmGtV!] B;n΅(!x*;TqMqS4 QZ먗 ":8 :Iz uLJ4:X,qC=/ϳ|~` @ 0;e?QE~g_`m$YXƇ{A0@n0!0`،qq V1;{ Z~j0`0d hdpDWKZ,~)]8.j7n,@:f#޾y]*&lXt;ULFD<,˱yȢSk~IENDB`fastapi-0.110.3/docs/en/docs/img/logo-margin/000077500000000000000000000000001461403617600205645ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/logo-margin/logo-teal-vector.svg000066400000000000000000000143371461403617600245000ustar00rootroot00000000000000 image/svg+xml fastapi-0.110.3/docs/en/docs/img/logo-margin/logo-teal.png000066400000000000000000000466031461403617600231660ustar00rootroot00000000000000PNG  IHDRq[@ pHYsͬCtEXtSoftwarewww.inkscape.org< IDATxyu:3 hYyW]Rh(:0`4w)sF 3VIv2\rIMMsO@sM 9xf80|7swDDDDDDDEiS@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$5DDDDDDD2@  P@DDDDDD$ɀdsܖh[mpccGl1V2K/cHlOOܞԲ8ߙH2igY'v;~0{{wTx> o_*""""""ɩ U؊|? ~`Tڙx&ܵn7KN%"""""vjHE9=ّv5[/#s7.J; 枵9Q`'"7}lkwځDDDDD$``98O;d*=eci)?wn?iW;/ 5$6m( 6IyRr7?4iڧ (kk̨S6K;Oe1~ZnH;Hv~GS l86[`aͿmoܲ|9K8p"</@Oyc-T5d؜?N+#m?d} ;_CD7eeݤDErşx/T-w%f`;g$0b"8ǰ 㦾bƣۛ[~&T:hM*͙3QSRѝVh?u?ɓHΉov`v1TS0F. Tlc?~A+;;8AV? ܉bɛ>nb$0[ H8jHX[['ES%}a/ZgDon.@""vl^[Kܓv,mPД:O9eIZͺM8z`pDs,X!$p5p݃oIQs{3igN-ƕ~!uv7N{%D""lĶ^XaTZ]}aJP Vus=n{`"0ˬrnkZe`'Vvg5Ja?'NSqDDkZٞ{;v#%2l^[4|3XAdcTWq*v>1?>v0P`'o/C($ۚȯB~ 䭭qډDDju5V v[K+c̓36XT09g]ڽ;ϤJ$(Rоs6Y.6\c]mN#"RlЖ89 ;{kP[3Vg쎭$uO&,5(^fN;HH`2TށSRꁉVhT+5duu|c1-nB3i'IٔvZVsѝv=qӱaDK Y'6k {igɨ/DDD8دCMWX_>=5 f3gaH;Ka̱B [>3cH5 Fdm bg gX"o&du98hƑjf~uiGY5dY}#;8,X!F!DDD[U6vskNT,5d̙.',i]?H;H9Ycn@sf>`I5t8THY0{ig5p; KEDD6OtqǬE j7{?W% <C jlllJ0د̏y#vjȻQ}(,~d] Sv|~!/z8"]6g͞?iQ9>6x;̷}{pvr5F@vެ}}ܤxlwMtb]6}ק&3|BK>""5-CSyuxG)]G,)>fL x-o9l[~<: p`ry[V1ELg;BON; DsNi' &fϮOq|YOhɛNi`p?mef[Gd efCNfmv5| "SǗ|©zsIx8Sfu ~P@u_ N;$3uXADDD:%AB׽yL2 5RQ"",%fiv%(v ̘aӎ!""N"&%P$3뉳'"'ˋaY"?S+2 oB~!`P5DDD?l;KTĹO @䭭E2 \~o Z 5 fTyðAu뺾5_41{]]ແꉈ_t2fqDO&ME7e~b+1r5EG vr^G?8< {(>,--j'Hʭ>q>~cV_ |:aVh7yI7OB~G 5~~{~/)? ؜OI;GrLUZ_1_Y{UV]`mmjH+1X?Q ǫ^aTӀV蘀Djr+-l谪XsO>/^á˦ z"""ϑ|l?-' 6wnMn^Zh;\U;,\-S 윎#q>vr:i+u],;T:ŀ{ߙ6㈈O7}*|̘U98u$^uyԇ1 KfHT͚58vr6;^#6/^bǽwıٿF7PqJ g ևNN\C*_uU7β&M;F92z=۽o*(=ovg) "gsۆR-X<Ȇ>]k>lwcr<[LO,)JT5ln~Cvc9m3Pnzz"n/b<σ=Lj}LkM6YW{>\on}}u?㍭ˬ?l󦖐ĥxYg!pMZ"@F̙<մ5b69.6,GOK/Ȫ !nа`}}_#_;p0{[߯B~9p/_pݛZhζ`cwz?$xc>b+SOc r²'gHՉD}_I#6 H6YPx_j:P OvrEfٓM7_[Za~b6e ޏ7YA<(O8r^I-H` "` ̷fè׭o⭬Ssj1֖=s$W4wO+h$({oDuyj;!N 6jzÆّ;RQg\S|}Y.Qdb瞾)+ρ} fLaV{:ȵZ!x'K.ɓ,4@| 9S=h=RDj~kgN\_Ҏ6ԈfF?8Y2'#[[c+!{l֬!>iDd#ҎQN'48W9ozi璟+῏%iǐf笐=+sς "Qڹ`osVz Vhk"8Box82lp~C]B_ggLz"T8kkiJXF8垵@or3ׄwm4?PNjK%~2tR9ixmzU[zLq "ZP뻆kեc8Ǭhmm{:gT-<0P|jti6ɊYpw?+`lK|:Rp[üTqK媈$@/?qf;ut4!<%_nqV@818Q wٜUfϮYH;:zO0RftžaW,.o1 u@Tblc`DA #SΌ{9]_-'7mȴCH{<Me]/dm؜;SvoBsug0s4Gg}+ZvQq{bs{#'Z52 sv9n S{~5n2(vqfX7V7 g|(?`$gw@JIgW]_ `DL PG*ˀ~5ޙH%+cjo?|4璟26v3cSH-j:?ΎbuzW(%wavެqWx//;4D:7 PG*^YZj 5ĨCombg_]?]WuW^\iGV[+G>)oe8 W@}YYI{!eg04Q sz#*(26@\akqMOIR #`&}xy? ?{ʻoݨ c5V:6gA|`PY1}ٵ"kNXQZOTae sl}ކ03j%H15}Nöa^8GwV+UvBj7N{SsEVHjg5~CҙJh-[0۷<{I'kg:?T5k(fTR@fxMM{F LK^^uk\IٴHMU0֖X-=7%" qbMAHe/;@Qv)ms C{v+nw?Oҕv? a1f=?Pb-?wNٚs 98&vNǡQ0+߀c odpx ۰95j͙3Qe._ 'N NV>c;>"T#-VH:ȂZމ6qF . / t?)ϺFi+?q&?Ա/NYS6G> Dyǟf[?8*-bTCLPޛ̺ٳw}X{W׊GeLQ4壸+L> ?H*E V05Z=>q}:>OҢeD1Yjv# faM|L ѾoWXu1VcCVMZP{6ow|&8o3LJfuxkkx:oyfBC/D7y|!X0$Q?1c/3bѣjpp62,ݍeŕ|[J?}j{㙜~r0{޳3`\;ݷ5 yʿl~0G`NWlyr?K+aŇ}gv7M5iXyq"vVIVXg &?+}_D5:߃fi(NYf{Õ^Y%@F`miϊ(Xb'`G,!O XsоfTm>㦦r87O}x8 3GC`EOHX5 Dy;gX@oF 6{&E*@uDM ZE&Oöv>"19ֿRZgoM67aߵm"xc2s7,B/Y!k @aA2^7MF9<о؁ \Xf7OIQ9s[BO5W@Rkkvr9eAO~W+S<+vMfK3v T띙'=A{=R% ,yg!爊#i3k W,'\-Q9{d}dm_C{+³z|툼o `K#Z kkI[}["D:k8US 8kkӪ*fmt VK}{&}P~䵿++wUV5;7;4Hw2r iA򈬍=&a YޅO`#iq}睈B fwllvж}av̓o3=Ҏ 3Ddb9<;+Y+{oſ g-fxׯ IDAT6>Hp֕? 쿤KˑjYZDuyKiwZO;@Uq>g|_isSB< >aK *;0Ddtٮ ? ydױgNXP;{~'a瞾)iتJ ZflvK#rSCmC)5\lKvuz"-mvn{GsIcf#W\T?ov]׈ [/q8vv8',M_$ڊ~.hǖuKcmmu~/z}ѯe㵳.8q֩iS*q䎻ؑ;2t{GGsJP1DR6O&Q7ś"&9?H~@X'N~ WnnFqoĒ2;gToO.]z;HP<蒥ԍahaSGch [<~Mז3ռv:#Uw~e(΀J-5juOeO> UjHy㴧1MXfӲ-u5Dݦ  >q=AWCˉg cmmuu v?y_wPWߪJi[ncڼ3,_Y:+J{ӎYͼD֙"V,)ϊWTmKv'Țg^ 8nC\=+``֙n' ZY"@-s7t>_7<3:VDHx9l@<uDV9<+. h]Yy*6mM߱:͟|E$cpBeFjwwS鰫_ڗʬ&^C"'oe:ӭ} DޮT:$|Ob\&/hxq Pj F6|&@l[B"+EO%+6$LyiF5,'><;Pol\"[Xo<׉8"y y'6g X{'=i>~9ȚP۪0j0*n۽q7zJɏX^HDo„YV}mܣPlΌ=YHnUA%_SL OYi[{w +kYʆD6(gm0ف(=lӚkX5Eޑ5O4-}͏{FgлE*+$^d[MG4۬Y_I\1(ƑŕҔiX!rDĪlۭ_WF}bʾxw}[йPR+ir9Ր˞|4nuzN :{3/jRi>uљ@U_avNG@5%la ą N@~X8l15pM;€r!Iɯ)zgo˞Ѩ!C+Q]_C"A%?w4}!ew$묐Pw: X?Q onK@,x:y!ߚd:R9A>'N}>$"D ZfV'p^V/Ge\;r"~\VȟFaJ^#,om@ uA.wiy7P`]}v.G:2.iwR;@&u/j|´cӎ5#Fl$f݆`_"1!=4N} 7 `1~ MSo/8RCl]!@2N_$PhO%^[hƸ9FvO1Z9)O Z\GL.Y+K.Z'ܫ$DѾ }ꓳʁ}~?^ހ/?Ea&~` Dl 1<wR7ć?iB:x<=?v?iX1˺@|O~kǔ*asį˜[xXs uLƩ΃8j2Ҏ._|7|MQ}3e~b06k{>U쿈j_`s\5<'L h qN+.d9?Yҕ(ݬ}eXŞKk 04alݺQh7O% ""Y21{24X%6"u쬳c7ϥaŋ] y]i=MS&wN#OY!;+?mmmzEn3SNY MI bt`1;zzi@-j;{E~=~sgW=S|x'O^v ]֙?ƩUrp ?B:F?e]Q< {K~[S͘|-y!͙1'NổŁkM-/0"!PA'km} WefWǽVHum(2߫IظXLL/m֕R<'N#v5E4o >e{UKkcsOߜbM;K0.(;<?ȨǬci7($3 hą@eAn8>Ȋ^ z囃⥬VԲ*E"@ M-OXWNN.tŕ|[J?}n]."nM;T7;{zX4v-5`Xڹp> v'yS˹iǑ Ti@uٱR`Ј{Q/E*N͂ӎNvhc;tߵ? zO䶴HζȕFE̛՛'ǖigulAiwg;RVO[CDjVd;<㘳+n-CH5$? |,'zlMR%`<mvF Pҷgtv|ț HOiNv7j/Wc2,9mO;5Wu ;dӯco~.к RlND\!Vvqt87}?#TrphgwlA'~eJ>C:O9eIJXߍo8]DBS |¤笐[+'o.KO句WV^*9צAEjˌgq)p7,^-?6'sJ'N}hشpN>:AG}l^ 5v3]3τ:GDR ;Cqn{'zHXԽܛn&⟏kPM;TQC>[ઋp~B5v/~!+KK=G3~ҒM8jL<:t(C"WYɎehDú~;)M;T+]àҞ<'= >MSȱ%{f GBG]WlnP/}fLf)jd7N{Nv&2kXdm7j~: .I;T'+ ?XA`gS_ VSixs,rwXGhNݶ%*E@>#!"E Li'8|D;l0jEYwZlX&^Fpngzs7U+|76y,/_!$W?cpvv-jd 9x)>_؝9t/Hb7OU"R>,\>5P-@{X^܏-A\ uX9gnKBf} ;BDj&=Y'0js;x-z_O^yIqҭחVR]ԶҎ $.HWF@<1X^a6dpe %eptX}@0,::"R;wD9֯˞|4o~i+,]vV= EH%IiD >yy<p͠M^™vp?ڠ['EDVG yqi qWVt3JG]wEiqO@D\eQn5?`|%uќSHsH^ĮUvme]p.T`ZoW&luqe*e! U$s"AfuD$Ȣ\/(5|9PCnT;O"?̿Ǯge>v fY;dJ]ksG;B< pC;:$yR<>s {v6:l7B-}?u[/zJNK;O٢*M} XV]҆T>*H b]3G}*@{}ԩx~/v=}0D$Ȳ!+pÜ.{x^P4&seLX[}RM7Aԭ"HUX(KC (a*ZZ"QjdmƢilo{^]?]W:+J/w T/S5/8?^/y &}3 r~Q='@ P$_r~ɷ2 g "@yˁW/Kx}8cH DHQ͟ PjT + $oj7SOzxWpڞ6},R@=5b}xGwVx-w1rҎ!5Ģג׈w D|᷏x|$@q2yU@"Ij{7KBDC 鵰'-də3g=Wd8BG!H;Ԡh ehH51vI\ @0!n7ؚ?9-~ "D yOhִsHYt?$?3֦KaIXiȳJѱ@;S8<@Yg {XWSr?pEy6TKD2DodU {f7CB8클SHmq^O^}tΊ5*j䍍+ӳ@D$CUxkku\Y$K+RqmԒe]mۉ 9@d(R3OjH './j@pn|!$?!5yց<= }ov5ym PwPAZWۢ>)/ϷٳӎvvYYp9·T 5K&P~\zkd眱ug0i~nEhbhԀCU: PDI yGr.Ƭs:YUop,"0/`ŭ!Ѻs-խAQt[~Ԁs$nQ_Vȟk]39{>?ń^kv~jp;Ϻ:.[&5kuumc!w{AQχ] EzT420&Lkо9X4'La2<ڒ9a]_@C}'˿p`nڠje͜9J_D=Vq(})58 _cnjY5s^`Izr~~ۯkB>~}Vhltj[3r!kH ~< +6>vY>'Ll 8ojy 7.=_ayR+_~u7N zEl0އ3 ,:/tѷe~f'.=1EO,BvzNjex\":"[l(76؋?[5ԏ ix|L "?5Dd- k&-mSj`y]'Lq1$J>0|3(/-^8o6˽CX3cSmհ) }4`K {5b zF}:7l[m6xssaY?mvO#.n;7>ix9[yp~oc;>CiLQ'\@ IDATbNTἲ53^9j`=T$NeNpsyݜlsFPqfs΢ۮʥg-}{㑜Ф~RV`d3zW$;e =8CRMW\${u|; 7Qygw.ᶏY|{+o]>YίI'7iK;r>,]%SKQ*I90\ʤ>7˻Hnlǔ$ZsYhzW̝/= :>uqXsLRcB9QU2Y߸k3I\=;\;Czѝ]寻[C#pXEӻryI>, XlYzL]7=S/MdgtR/SWa~T'&S$_{_qF/lOra{n}P=YW$w3WdM{ܞ\4N\$_hS2 Nդ։MMYx^jg5֔ܐϪk@WԿՉI}y'uSR$'9;r x!)Nސx<+s\=SIܘG}gŚ]Gb~ՙtOZ8f=iK,,\si{rM|WbO_*|4/|aS'7ܒme˖ {IK=v wd[j%jٖ2-{V}^tѮ>7ɖ$[''IKRILqOJ>Z?:~}ԥFR6˒D'I)xX7]FRn< jݹ3^rLR͊OMrtG=)"d)dpto4,CVGYw0#{|+_I|91zu?IGI!Å .lXJRr9){mO7 f[7|a,;eUNYx}R^̾9r$I?#u=?eS2_֦IL1NeϞԋIQfyLsR<x) ržϷx7q`8n^3S$]mI5~5|1{P/ul8z#\ǦZ 'd8<=<"ⳭOⳬW$995)/KR3%;RΤ|?5Xٖd[~ǽ =p  @h 4@ @h 4@ @h 4@ @h 4@ @h 4@ @h 4@ @h 4@ @h 4@ @h 4@ @h 4@ @h 4@ @h 4@ @h 4@ @h G'[IENDB`fastapi-0.110.3/docs/en/docs/img/logo-margin/logo-teal.svg000066400000000000000000000146241461403617600231770ustar00rootroot00000000000000 image/svg+xml fastapi-0.110.3/docs/en/docs/img/logo-margin/logo-white-bg.png000066400000000000000000000505511461403617600237440ustar00rootroot00000000000000PNG  IHDRq[@ pHYsͬCtEXtSoftwarewww.inkscape.org< IDATxwxo9{@@{+"Uj:D-R{ {qr (#=}ꥅ~H9<}v;HtJ'@DDDDDDDcHX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """"""4""""""" `HX """""" T݅ҮvTvw؅N׋>&3 n7nW: (lǁ:nGnk3ښ9`u?#3,#1#2^޲IDDDDD$ 2jzuU9.þ:4( X,MX+@N-Nb䷵(EydD nLtJDDDDDDX 'TۃwrB*ΰt:Ǧ$xr9;VA66Ub)P!^X4?7A!JCDDDDD)d"!;\6j4MqpS:!""""" H3>^Q(vl\t*DDDDD,C Xx8^8~ ww3"sp8S!"""<>tLGɄ:Lg9`l ج9ǿNfʒ/Bp/y{##||w_4 `fkM~oK7Fc\pҩhΟyB;)4#b<1#|e^u=Fu ݝDhCklV3t `$!)0"09< kʋq^R /:GPFlX w=[RT^G&ɳTI~Qフ>HǤ*NI109OLB*`ۑւ8܀dR:aѹ!58"F`j̋Ejpi ίzqI1<=OeDΆsH6 /Cբt:.aj?x+qeL) [-(h;umRxhK׀ k{-޿Fҩc_A#ˋrX1/:>;dڄmD^[ҩ.,ٸ K_s@߈9 ͆6䷵ imBYWv;?_tZ1tHߕ0rmu=FU=OyW'^;W㓰,5GqZ $˹Y0Y`W}5ϿF(wu ym-mkFA[ [LgZ,a^O3KϷZk1Ò|XR rZ[hUiJ:ۅ-gE2Yx%(~?v"rY,а1k xa*0oPYt*DDDzAzGgvbʪwqAt>}xdҩh<[od+ "6T K&|S].[|rm[0sJ1k ERX!1qWEyҩhf#3w) xklXaMJC4(,АtqՆO @DDr!EV`ckXU韯@^{4cԏ+|!t:/?oW: """xAUEs|MJBtA,Р͸58Ҥt*t9٣tDDD:ц5[b8l=r]&\6$fP:r~} 96( ]sYkpS+ ,^> G+ޘakQ'<<xx"{ ҟhc0SonC,f[0lsvS?]0lΩd¢b۵w #4\t ݎ{jSA]c+L-J!0S " k|~q>jhFzh8~1qik1;|>o&rڮ.z77 /u8܀eX[Q6.ܿm&9dEa:KGNl-Pٮt*DDDB جx%b뿚w &Uix=0/:9'x=G&![eI3  tNsvwi~jt NHOOǨF||PIpxa||BWvU5Z ;p7"""V:?0 KfNA'cfwh8Xvܽu=zX_V+YJADD4lꪑ%qH_yoi*qy{z.áHYXWq[k*eM4T,Y^8~;¦6:9JADD4,/Jy7tpsP<rN"q{㴉پmvB~xZ{e_h֔SR'3Bfnnp [jp(~$p2Z  gWv(Gzhi\PA{ ~!}HRSh7G9d-""WIS{&!DrP 1 5`bw7ȹ  ]J!+~aky]9 hd$;|m赘Q݅#Z{1`B&3GqlVXl6 BF#/Q>l4X&tLj^#{{g;Nx й!"}h_?G|t@RƤb?fˊ%qI!^9a^ޒs9#|P+WSqG 굘R﬍MJq~w+>>Yt*gXv<_vҩF4`]I|UUmNQf5Efh~6K]Ogb9UAr.F7֞U#pm|ĻR,U:3tFP:A{0}OfLx<}@Ղ ˉ3$!ssâx,/ʕ} |#w[>ӐՏOt;ЎMs@v)b.SB$n _Ʀ2Yvڄ8N&@aJ9Js^ =C>wNddZ1I1揌ŤA}LiG_;&LR!qlv;J:ۑ䍪I8@cv;wfSu՘z`zd)̤^Gs0>)imTcW#.σR 0G[gXr_ck-hCA;w.H>~\=گtiimN6iax@LX0oX;)<ã$+9Qxn=<2%) q5;jE8~kvo-\~''=BR o͡]x1iecU)ڲ&UTp01lp]5]-M~ hđfuᆲXЈ&pUCD.Cuּwr>9Yt bj<pScSUi8s閯¬7᜗bVJ76(-)cR+`ī\]N  T qUкJa\>,X1U4UZNT*S]ܭv; m^r=H.fqUDđh? 7<v5@O CrP<<~vө7}hEs_{2v 82-*hÖ I1nP/o!LFFh8rZ%PYc7F ɋCiWX<@Ja@6U' ޅ4]`e57޾JB*4AH Gjp(b0~A<YQՉ]PuU8X'g͉Ɉt!ݎ_!Kl_ww,5qcp8 +jʼn6wac-6"Yxx"%(tXk{7,)n[9"gP.WXDClqͱtAAg]E ݽ-.lv;V I]ssCJP(FDajLЈA=_NA!ۃ szqT0#댹cϚb; por|z=2BÑ=f3Uace)6UԈ(]%,ADc;9Y,;gF`fHA4i޿}8o)͍'26(DX,`@4)lLHyvz-f"n+Pt '5!L&Nۅ9S>c^?.,V_2c.n*;%bIܩLa{+6VÒm>Up7%$KT: B%^%1+NIScƆR\;zHi꫅ DL_.;َӐGwvlBi^do})J ŮbVHw&Oقbwfa6~9MX)J!nILR9Ujp(RCiim?av(Er!Wb<w,;^P6g{(5Sr(8J4pSX'q WjCXc>@~{NDqɈQ?[V\/͹BQ źu'L?1 IDAT%\yt {]7'$>L-;^9#F!U{T9C6U )jnP:<.v-k0W`q\}b"gXd,X,ӎ4CPA&Gs ډ.FĘe27f(8) PPf}=x|1Yt%b{w}),۾%?XM}=0$]kZNC~E3zq]5VzBdB48"ݗ<Cws}ic#6os ʌk1M+,f7r )WTLR39ϳOˏ?Uw<\Y-9NifibY(r#֖H%uJˋr5?eUXl6ܵe= }Գ*)'Tרt Bt:xa}jM ɸ)!YpVfCXq"ϡRcƸ0 R-)\Rviǝ/OIVz0[I>"> [k7}M'N->P جJ DR`08~eNj9% s6|B$ `!q~}`'%rd~q$#( ǔ(inLj .>IPf4FTbMy1Vmzp]HT̬NOdL2~G-F6+,LV΂'P,[ &8ܷm6_s;u<Hbo[!of >n쨭žo=3y:vl%Űbfc)akyC`PF4XcTLӹa^t,xvUkX a6!MZ<W9CI}%_ . sui2}=hE ݝDYW&Q4sa@<'W?7AȘ+j{ЎMYWt*лTY(\0*^HVk8^rMoI}L=}]>]P/oDz"Ѿ~Rp,KDž6lx0+N<>3"CRъ 5bX:x.k?;X_Y#w]NMz~()%G&1lHNaD`1rH ƬQ ů'9R'Ͽs#jXk>M ĜY;^;-.WE$rm} 4`kM%VxKFzm~ڌDH Ǵ&t]{Wڍ$J^LVsؾO݊[Ǥ4̎R69͆'$ǹ+})i Va6~9q;ƻ[S¬BA9 *65$c"6G;W劬8b%TW(V3pf$.OOpz&Y7 16(&tgָ'%DpKbqkb س8]Z[ɩ.brx^}9.QhH*T,> H,/׍v1%xlf9|mgƪ69Ba{+^9K %w '/3梢>~m(;]=X1 NDr I@@7 YprX4?ȥbq.h$8z<_r| _$Ao_C-;+Ke?%nV^^Ni_ ?R3,%4׈{llw_J%hc]'`Ql~9W@C*%+xx8PSm߄J❴*c~>9YtkW*Gew~{h7pd/O3a:'lbyycQlu8%)jŇ%x,}HA!51KǎCSDc@F"e?@Yl6MpS g!<{h7,l)7^d&G]mljٰVivUw7uLˌSӹs~ɱqa>> IAfhɆK κ*Ӹ(w(:mXc#67ʾK q{wlP:y %SGb쩯AR`0~9KϷ#jp-MNsY%h:҈-MƇOH ü1KG W鴈*S0_5>*){Gb^H xK)zOOC7߃cbiIg;~><5a~8~| ;0/)0安$cV(!#s!aH Gzh8:&b@&E* y䭹?56Vɶܐo$\q:LJy:=~?uINOmSptOm?so3qoқ5vKߛ&AI6s>/+柅XUvB4HeXА[nI$ ZpjH=Bˊa~9 stnl u:ܗۗ7 #4\j{d]ݢ\SPE9J@D*ܟ~"cʐ>fռ}9O5iNY_Y*$IyBbcpcX~,X֫/f$γWIFVvw)RkvUC4HEXА~Xhã0#2z_m 1`ʘ-KP:rQ~n'oλ;.NRq⎇smos w&z,꿷~q,?lv+NTy_eNǮ)++Fƌ8ujI#EȃA\ r d.e ,3}!#R?+-Ksi hOd}t1fMUa{ >ćӻg(n@'̩Bb|<=%wY}YQ"zޝITw$s/ʋ""mc@MH_'|85o\lKǎGrPi#⡋\AנnॗZcTmӶ'4SЃ%1Y@DQmL*|ڞn\3<;LVSNg&R: Rc:=Y*͆c& oOg׋%Ǚqa2r~޾|h!6W=H4(:m03>_uղMCyB6&EH^0/1ʺ:d\>,)EccRı@H,".4Ko3˺ƂQzCs׀ ތC)*Lt"U|gm\p"?hqƨ[wcpmnL+Zi AD]+M;26ax(Gh0uBNTWjqK"f(kiimRԘ?2Ѿ~@ U Bb5hȱX ceK?]CpQx.kݝנeJA*!_IgLՄ (D "F횛K?XHs V  P<=aW&`ax?` u$&co !24L ](|[l6|P"ހ ,A߫~AD~1qƇbaUށte?0 "NTfL`dMMdg;5H!/sFG ?S`c>D-,9Mg_t$A7>[x=|ݕN4`шtr|d2NIDATeٰl&ܹej|OY,XYyk?Do׈MC.tĜ϶t+7 y1l4*>w9-Kߎj͂lWqorFKϗov:L&] s뇛(6sG:dPٌKrQ5 q!-xbW+>*)ܑ13jM}RSPUs5Y8T?cQ9N G&jpJ;Qm*\.u"R :0YۃuUJCBH)xи6+>*)G%uw#8."16(Dxݎ#[҄-BvScr,x5SG`\p(B1.8>EvS?r[ ꫱cY14%4n|8 @_==`O/`mfCS_/{hAQ{+rۚQcԚ{jTu|ix!qixjv!V@D]W݈%Wa:gOym)~q,}/+Nˊg~mRC@O`8k<\:&a?s;Z׃*c{{`vmm!7x3Y^[guCpoo=`p-lfC׀  =FTP݅.5!ITDx8d_N sdn7cSU6U5 ZXUvB:77ܑ$ܙ4<㬟Ky r4ԅ;V/ cNUOfNųg)i\<5{.nҤ Z aÌ9=KpؚrP ;0kkKs.^m}p8lleŸ79MzbDzlH酯܊Q#N yJA Vn^ʳNw8/&N1S.fGA[ˠ>n@D I6.WMvlyJAt +/_ Ows_M~>a:Or^xs"+ڞ_VҞz=nNLGnO֐sG]]Bb@CՋn |aWN7.ox쟜h@|y6𦙜kD<`D<"DK_`O/q7Əfc|!HXakJI| /Eu".1 ^y= :ȡM}Jb"志są B9^+{'r!"267N7.^t:]-ŢS!%qX{ՍZkx|Fx?M7n¸0SNt47 Ml OO\(9\>j4}(lܵ ":HRұ0?PTToq\"x7ƇOҦű{FvPdV^ĩ!^[1!,BTB|E51>) 6@;ĝ`3@"H aw]2ۻغ_߉/88.4pqki :.D6]$M=*`iN4QڭQ֩0eaܢbss؎cthLi'9v~d)k(y[]QKkn>5,Hͦɧ޿6u?Ad$ ,]ܘ (=ܿ!]rٙ<modjfj?USi7xt]iiή$;o|nf:7K7ߕgߐkzc.Tś lڞe-?`~- 3^ؽ##swќS+{sUwu(925oVk'K+_g~C~.,x w)_2/<1O~!9x#]2_XK8s5xmLh֮Ϧ}ZڞOOnSG?7lzoa$k{5u9?|?p o'yjhgĞ> k|kҒ ^_YӹwOﶼǶW8?E<|s450kWm?ښW|VsK_;pIl ƁyjhgڙgxOKsU_n'`<~, ˋoȫCsdjsU{GzsU\/- Lp<}cvpv=S949C925g3=;铩K}_ilLWS坳*YҖ:2љ\ڹ$j(@}> @(@P @(@P @(@P @(@P @(@P @(@P @(@P @(@P @(@P @(@P @(@P @(@P @(@P @(C)W )IENDB`fastapi-0.110.3/docs/en/docs/img/logo-teal-vector.svg000066400000000000000000000142451461403617600222630ustar00rootroot00000000000000 image/svg+xml fastapi-0.110.3/docs/en/docs/img/logo-teal.svg000066400000000000000000000040331461403617600207550ustar00rootroot00000000000000 image/svg+xml FastAPI fastapi-0.110.3/docs/en/docs/img/pycharm-completion.png000066400000000000000000001440051461403617600226750ustar00rootroot00000000000000PNG  IHDR7֦SsBITOtEXtSoftwareShutterc IDATxy|?fCJdQ ZPźPZmck[mEVm]ZEP ,dw/3HPn(K?;ww5Ι64\egeyCk\=s{`ƟkY.?,{hoio̜4a~gCrٌdأm=spuܛb;?_66/\:9gŽwro[Iig%!l:q;Ԕrgo?A?pUSS:@S&3Sb-&UUCY_Xba:Ew;QV:.l]6Wwn5'"k,SN+bٶ nW~~͘0u+nS܇-ݤ~vCniT5?sR(lL;} ;~Wznl:J)(ĶwDLZvbӬrE! Od?)QrIaPfGv )eƷ7nkx\=ů]+Oˉ*x[J9lqLt|+ko_qYf~^MOX3=jbҚ7]U%)nֽ7N5E|b,@{vvC %G,BUF"ҟT%Nax`v"_ۦ -MUЀpbb#Rk7o^=~t{G3]KbLͪL$RU9K)"uFĆIxgpY~h۰Y7K؟> V)-$up]y`IH +KqUһ=<0o.Ov̻O,yʶy+`ο!>wO=]4ħ%2N]iKO"'vu@Ԭe~'wumZ#iE$5kٵ3uq즃d|U3+CxT ^ZߌN1+/X:"Q"^k[:!TZs󲭽%%#>|Z2HD,Oq OVM"WDg@x=tD&Kę0߽OWjь9c#[{;mDSS\D}eK/ʉk~78D{8atr ZLCIHkY+1c[ =ծc DDJ΍zIg]))\x9 2 @.t̅Sd=c*qAD$i vfDɋ͞`UcP&@k,vRTaƢv >N$|~_~?7Y̌z5@7t40ȢJ$I<*ZnS-'"R.EKlYcӺ+RyB"DDj{y)clXb6b3сoJRB$bI[<̾Q?Fc>xkǹd%ۙ.j[_3b- qbVU&҈Y,V_;G7D6ѳ~=yCT)\=gӌ)ґ9?']oOc+wH9ݮ ~#4z#xiii}XDIKKsCG\9Q]npFvIȉdDD̘8vRR i\8`O81i!mĔJ繋G2ˢ.ϰJ ,ǧyC?w>kl6$q/,P@J9 2tO,0<{~ip2GҘt[)i~#w1v,12OW=Osya pNنm"#"(::^KW #)~C+lo~':ϹV!VkF9}r~zqڲG5F!!Ԡ|˫w]?|Ig X+LR? !\Xzb)2B*Yz?7lqb_WDZv7/}rWcaY;ck5=o<L7 J"b)ۺ楺9ۖ/kχD,:phͳ; sݵ_k۟VHy}Q0;LnzC5sb4i _ˮNwcB63ɫf*Wv>)]3O,7끡g| Ś993U%f S%>wO=]4ħ%2NDRҥi\C9uǥMOVQea^HS鮮)v")eeO=S[etك9'0mA.ӻz^F5}ӺEcZN Z2HD!4*r&'$:CGdӠH OMqOw+kNΉ PzЛ=1WG$OťtQd6lo;U[;=P]廪j :j۴3{NӱC~AvoMRw!p7{8& R|f76ӯ_~gg(xV%i gC]F.o?*m[ݷO F}c,:?^[UW惎1c2aQuy4gTcO}3s~~q{uӒpgrEϘJ\!qAlRd13m߿{%t'hִhLV:=!ɋ͞`UcP[g0ZIbEX!`ퟣ%!) qRόְ叿.'λ׶?"o**_`ڴ 6Sͪϛ^:}kUk>+o7 ""fU|x%a4:`xfj۽s*iŒcŀw^ITD"T0Կ3*i, "[a` HoEzA&"b1~TNK9ۭK2rA-v?6C_6=yC.\(幣U⎒lg+n]|/TnMOZw|r0/T~3ۯ[ TA,b~_;F":}{`%p }&LɴֺחbZטWɞҲd20y"Ne/aJC"{KC(Ll6(uYǗv#l9Ҥ{UI2g̽jHz\WQΗ_/_Ѵo[?,7z퍨%`E8kxS9FO^u~yw}hujO<߃[WlSU2{M_}䣆qv<p?(&rpUVVVMM a gW L,5^b.ٖNܲ૑R59w,Wm۶L87݌X C])),zYc#tw67ux5T .`J#ۃ`xWe RH `}P/)Yqfux1:_GuidNˈu{(Sw/p8 RtfQ&"bHBA εf|17*sHC`pSwB|³))RR˜mVdp׌12𥣠gTܛb;?_66 yͲsV{,_FUS?e:Ā{MJxsb "Yt~`ãÆ+VΟgUTGuvs9{w*vŤ5o^~OtASU5ćlqLt|+ko_qYf~^MOX#Rk7o^=~t{G]KbLͪL$R].VvXWoU#'H{ae)ۺ楺9ۖ/kχD-NY%O SKW?tM8oxwcf|==`(VفCSɵ-tpyޒάɦm'Һ;cRj #%Hf{F o}wUofF$<5%>AWּ]5v}^Q>vOD؏t&UOLF 4R$d00##0=l ;&/7{BU!R¾x!|~ "~,fu_ۯ &B9UnݦZND]|.*_`ڴ 6ٲƦuW)4OevtCaE{?ԡCޠ 7x#',G$$ɔ3{ ]3GU?.YYVH#fX%O%\ɤi߹i'Ngo?Ud%ۙ.j[_3 }D4 sd.1&rG*T FUwibD' 1_s1)%U]娬ڑN/'ɚ7#'giUlu%͞\(.\xϮ?RNK̘ǚKڜ\ӸPգr"R'"2dOnSu|l\ј,ˊ,cNQTM֪57Ob.hP 2 m53^_[}?RߝE| {:9Ɣ8]sZ2@7<>a[UZ? ifTZx{lIJRK _V#%ٷY!XYkNYw;'qHzKU\v̘9~epR $ggre\^uuB?wiio&ztKgi͆)ܥq6KJ֕9k׼t7g鷅d߾=eˌ=&ҷWsbdS0b͜Tڪ3Jk^ om|ȫϝ$zSO iD*oY?%T+gHJ||Ss-/{y'~˙8oBQAҺ;cRj=-Q !XWfRmx]pvM*QO;?3 2X**E>mBLd<ض}ou\Nn4#t8\G|ʈd ەӯ_~gg(xZф*UG3" ɱw6uhl F}c/{m?W]:ƌKIeKi qocFu=ذGq?<i0ct: c>q:T$(K4@Qq4F,%V]e+B U7oգ W$ k}⋀/ 9TZÖ?z[d8o_?q͛=!)_LD/Xp6dúEvDD|VnrlDDd5.O߅JFFӣ GC~oC28)c%G|4l6+9,T v|l;.b> vƤoS+%)3Aߪό t;wozպn觜Gw.M?+TG7._s{1 QL5~ŭ}0[ŔOT1sJH",7X }kכ {ԏsF{LOkS1Q=/".xiii}XDIKKsB"QSiVbDRWH@&-҈l Ҥ! eF(YQY"db1ؓ"&κ"*ɖ؜YCZk8ToI:#L$Igz^;$YfDM3&ckj0$`뢧3kL$G]9>.VƎ6Iɧ#j=qrzFp/_,puƴFQ[I}Z,C!AsilQ5-_lTn/.Qwt"t1 Ӄj1\dKRKN_>R_Η_/_Ѵo[{@is'wom?.sW-O`w_ VdΘ{Ւ VN#vykoD-s,YSƋ׶]ww^oΐG{CSKADJr\ݓesdL0y |a-ј?0#adeF3FLmUڮ߭?o ʪA˔Rl2%'%{<'ꐆmϼ>! R ١KWK1vL4wGcSdpRlKL68*ʺdLNsh#Rƕ?;|k5tn?5dHbi9qVEuTyKi2V]i4$G(/ܹOCR9o+J6J,vw^~7CCyץL9{*^rRv"6#놔i{7X$|N]CXa?J)DDLISCIaICk}=Y/Ym]R]Wm˗? bo߿2eYp ޺2q횗,6ɖfQ놔 KbWFG1A$5geĮ~pg@1GD W+h&kFXX-Fl\5QGm6!:Ro*H;>D?~xǚ*QȍqD kpm AzKryCm:(u7b)E2U%~fN=*VЫ2`(4M$tq͛=!)_LD$ kɲaz酫x&4[c`K-nߺ=CY )Ybb$OMGEYG|%bf_s{1 5-F$\Ns'_NxJ"uԊ_&ᅦU-}oTCVUUŢgDLo1+@sz7#^N5oFNזYWXe"35+,v~pn-cR&Řtq҂jE0ْ Rjj,E:;SF AH+SѾm޻zxkou > |[E{M-/ C ?wfi%|Vd޺𦫸ZV~m}C(&_Hݕ[-rNV|Ջ;~R [1th|C[*7W֞#sӘlk~8#|9SlOO3IDˇs["a;Le.WC)(c|]t.uJDZNj?k gϿZnkiUHΚ; ;LL}i7N5E<>Yg/7s=2Y|ӔXTōEm}iξ+fcyh2nDzekjtψmi׏poUUf C،橮.zy_S7];ezuCJ^'_]UH8elqb_WDZv7/}rW_$`c_FܳOw$ͼu%Ӽ{Pj͜/1/ueN5/Y;.mmA'"-Q 8Esɇ?)Λ0_/4 1R^,yۛꕔf5~Y R3`H3uu]~z/P_a3bH6B <5%>Aܱ9-;'(:>1[1:jtspxUym긜≎ kQ fO, ۼ3&5AOmhz[vQ:|Y 9+jH'T7> M3^AD{#aH6>oުG/{9j.y? F"nX4%BQ!RF_8 #$w7VwQy`hfZe"b;*Hj֥EY96۹{ӓ֝K91Hҍ #M0y0gٗNղGgFq{" kgVv^ɦ+3-AR ? L)3RLb<:[9R$}tMaz7FlE-e_9ȵygR Ϳ ?>ZטW|[E{MJ̑19p|3沂7,Yoޚk|Buynϱ+2o]xU\-+\>gC&_jΓU08% j?G cy-iEm{g~Yw/ke݅/9u6YeJ$ۦOv VU+nvA v*op#䩑'%3d.+RCԈ ln̉eL[P)E3ۈ?!\1r:)v\1p8%DKKKTTѣ͈ ;f{_FC%Iիz&hOKdH)Ӗ/~z]o.t5';c'^8|5JI޺2q횗,6?pWLlO`S=#>:+>g˖E7~{S|ތ[z}&nrE 49; &i\oW4*16JPӕI ?EPY*{C)%܉NSC6*?7ևT^a<BȱrHNN*P7xsEkj\7t<0&SKXsW%j۾;;"PM^Arv/Qdž5l8{[*vlZUDV~\"ؼ@jHƚ;ï_IX3zGnMOĂ>hFd4`nTiXȃƣ & Mi߹i' Tw$"!ᕤH(H(R/WVOJwpu]E |yLD$}ZDьjA( qjH|f$Ĩ &_0CLZ͍Rfڽ(pS.2%.ZZ\J;r2 "S8[oK5\p6nň "|e'k=5 Ϟ@J@J~mVd&5cL(, ' owoaѩĹBf]j:5nxE:?/'ƨGF -V>wf %|R 3۳rƎ01?rYs]4nܸQv< hR>@=#ҧLwSv S&Kw7SVldGWk=U&%#u ?lL;?Eƻ*|vW#*X "*]R$JL7[0M$X)`gKtÏxb=مH[R(l 2KEn5a%)nULRo>i"DA*lHN([qz5J.ghŴƺz뜼-M_)E3ۈCB?X EnW׈yĄBF^"X(@$Q'|Q꤭=fR!H{z*#"/3o[|Nq#,q.-_&&uR4[t2@Nq%dZCHtCdd{>!bqM"Ua;I{"1/y#;&6XuIf}95d5x&֣RT<1ȃu`Ը{Nec,%lI@@2t ^NuMuTvH贌x[;xakQObDkԭUR(avH#hܟR?|~2YSɍ'/f&G%"bVЋk ?޷/ vʰdlPOLo0?^M)}x'tݝv?(Fⲅu?ShE׋9z.QdEX%1X K>Y%"NHHbU;¬E[|&Hʇ-9fLV]۫N {LOk//PCҙ-F#m  vF}lncuwQHOzw'̣ˏT$Ș*PYUbMcvV3.!KEX_"eb2ٳEnl^3)rj 9QeJI5WOk IDATtDNpWnP TR)!'#Π(2e9nT(1F!ϑ&'ݭnF$M%!7˯t5:.ͩN"9\c:!?Y6V,.=:(Hq 3d>|q!1Y3;b&J/;{kࡂEd2*x #|a۹쬌K9W?{w_GYלsI4iҖRh,V ?D\ԋxEQBAJC)]薭I}=992gfIۤ=hyxș3<<393n OX @_'[8.#7lWlXu-Ey)9:{Ym -9xGΟlsZIIISSҒαr:ER~ubQoX]rJrrkSb*KyXD| }pRL *{c{|"^C.}&&P6M+ pp1h@J9Sun[[og L5U2< gUp›sy 8 02z^;W>ҝ\zWHЅepw<ŤW} 5SN dᦁciI𗕕~0s~Ok\8R_wNŹnkUL)u'!Xt8QLibq.+ Ҧ+ 5nKio( c][k%r s}O(E[iy˹2gS#]O J-3㑭1%U޵YlgIrB%κv?5v;+(Kԁߞ}`R#2䜼9y[<_#eּ#" Ŏ:i:cź"o0k> ?|6fxJX8"62xuP1#+[, M[r] "-vkҺ`jKoyKjyۺM7ftz{_eyQfmVOO閽ab/kw΅s~siݷm_l=kސ+ZQ{cxKٜ.Iظwx"=o5ϾCha!YsMQ]uXY8=Yp5] ٛc tR|TW %6.sj85hDDMXe5F-wõZE8ӛsWd;S}Fz:+]uhu tu*82UX]]][S]["]G6 ߣXAA`,9Q "\ ka;G(԰3)\5[pYN&jg`m띙1IW47k^4+ƞJ,sAjJf\Z.1b9Kb]`Wo6iP0Xr,ޑMm=b.+t&E뺇^oá3։MYeEIx#kn莟B]ݽ&- F4w[+uu{|uHО?xsj?9ɬ)}}W|ʻY~K0Wp""%?tò~LJ4$ #:>Dv!Q֧VT<`a*1/ň(Ywkzws|IEUOul lwywŖ,;oVd4fgy<ωcHǪn)Mɡ o`O680455\J)Dd6rsZZZ(R |pH3fxɈ"Xo>iOʏٔrӢ/m>fxo4(23d[}هiUO Ί˲:Ij\1nE{=#i?oʅO9[3FD3be/# .ű"9m*ʲ1wgyau,d i.5Ҟ\$ȏ ֲK~HS3 'b-&kr""fɝ[bFD<ؗAte6k28͌}4H?d71c{֨3#A`0a&9R(9 FvG|髐^cFy$)))iooO&SO|X25|H_o5 HkLޮQS2ѣc6&=%Ҵ'+(5:HnXx[pׯejRg#M\;1N;3f9n[䤞s)82JWfy2$vioHQ ^}g?y/N@xgZ$f/2+fMmB%( + ze3ݹoG mIO i k_# .ȔSpDg+, ǻNs555SxE將ޖ䲰cJ}E i]0%[I }pID͒{w(Iŭ]&$<jsWPh` 7&t̘*yb^b/4$F/]8=Y8ށsY"[tӤKh tpF)H)o &Kre*i:X/qM̼Y?RFcVzOz:;) @ ;Ń]\e/|QX}'n𰭑`wc.-JDޢH4ڍݟR<$u k"^~2""t,BڣB (յbuc]b ''6zZޭ޽uqy"$K }i@4eJ'"u}$d80ͥ 75&5N`s#"mϫ|GWOw}d$gVI7~;>=7 TVVY]]=ErD006]`(aP<V9}QZ>ɜmǾUC 7W.'%d-P^4q&^ytTTI'T-M !ǞaAKW6B/rJ\]NMBՕ}SU}H(BJ!-5y&ӓXrj~"I-]8)&p2aluΚL'qn(J,T)M(r) R` RR)=88m1U_CM籇3#;?7$O[#)P*sx܅pS]SLz_< duD;`ooL%"M4Lt]e9&½AS`jy<#fJG"|Rx*(PD!ҒH`40BpD5[Mә:9_0NDl*+4HHI_sCwG{ڃHvSh0=5='Fu`H)H)pfx^[綘3ʉYrK\8#FӓR(9 /#;Ht̪pG(0ՎX8&<}q,Ɣ2}4̄Œ@XCkLH))EZ` V0NDl*+4HHI_sCw]h`S :rxϞ@J@Jycզ;o(1 7̝Vͳ }|ʏf;ikg[H\Yz6Xxw./7@JU_k_ȳu3Rk{ɋu[}hx6HueYkfێ@uwoHV.NIJ8tfVXc{wnj^4J]GHFk/t!]}Moqbҫ`P0V޶vl?M#OyWi7^~ٺʥ#;Gb2S;> L4ЧDQRUi%&H:8+*-4Xo\v g>9R(9 N):s LƬl{9Zv+tƕFm0C¿$8e}[gVoLd=_q""`~QȮBh-vRh\^DY.0u:VR_oji#teVSdo?x0/XNa\;Q)RڼtjAD$y<{3j)p9\Qۚ[k*^k8΅SptR#"A`JJ9?A^v A]7Tx;Q;G˛xǏ$@Y=+!~IYx} B_YUwvRZKz!"+ik:WCɲj`?x Kq̚koo55ֹ[Jpw(4,=I NY]s/.o$brr}y{AbNow 6UƏ/*ҥ4hj(Eŋt--L:NqY]up`cWqGymY:+uvcF^85Hs;IF[xjdJ3{5j}5iC ?aJF[6Ə`2jrrh4.4E\vB-$9^{u(r5ѻruDEeYN%xXKDR:Ĉ8'l4}6jbsW]%5&&U ͥ w5&5ÃwϯXuűGkdr2)L:`Fƌ0fW>p79g9[gwėAG2xaQb~jk!"2h8Rb? 2YRʩ OLET""BDĬd+oGO, OzD4n nw)xu%d-P^4XmAq88DcDZ6"O}h/]UV}33EzSW KUr*޹x`В{)Y\.!ڔԈ(hlF^Bf#dܺ)4L2 o'MugbdPJIiD X #c>?/jDڅovܡj=:W}tWbahd-sCǢ%T[ ]4: .Wh7ϯ텕@$lgmkjiН5 lJ4Q<PY"3:#R cRXTiƥLĦL$T<ϑ57ty+=jvuìeV}|Fk)֨O[t`fnwHt? ^~ݰIk9q"^ 3l{dCc \s}ʒ{_vw=ml%F =!#kƶg[R쉅7Q'8f&%ctdĢ߰(TMxO V=:& 0V\=X2{@xB\Y:;K xH)STLl\MMm뛚n:Bg-,]:5e ﰜl LYI s1h@J9Sun[[og L5U2s4`=| ҽ/^oy'ן;;a{r\ oѩ:и)8s38*W~PD""ᕆf1v&z{} ] gl-&kz¼hg"5ODO%E_VVV=ܣtI{F=˕gtCő1Wu-b-U8?lveG3zV*-4Xo\vgѻ5Ra1]'[ %{,O&ĂE#NL(,d^t'Wlx^!"ʛnivX[\"_&Ns]Z퇷Ž/qϐkQ+.[zhI;oh6/%vT*ܫG"/1fso|] +Zrmb<7j[+]tM0[7Hݳ-y.w͕_5ǥ)+}]ՓDǪοa"54PQGPwJ.t79sIF^>LooX(ggZBa\c5^MјziOPۚ[k*^kqg>T,bfǰ3A"R!ӪIN |l(4nouwIt[TZPۭE,VH납--yYEl6e߸ 3åK",˫2gn\}x~rO}#YGu.K}hg Y\qG6翹8"|yMF>!MOb}<~܅ 1kvɿb5ޑsw:/j}m\5CCGt(ݼǻ}kk{ͺo4k4TKtg({ݝ1[,f{hyڜA.֗J9l݆ߴ͎\k~湷k&˿ݎ_y\= y s(7xdMZE8MWd[A='SP<xP0f['?rNwJ7.Zq[kZD:ޓ&riMr޻Kl=9'%nz]=]r_b-^}MkH#=cK> |63 (hZ-qQU7燻(ExF^#  I` ;OoєBI_{!<+p$1d(4l ӑ9E!x f٦ L2"Ĉ&W_hޭV~yuDB^9&1]}J$EeJDģr|I8W5Mшkv,N&A" aW\r|x𥞇{#q"i眉ߞX(6XX(zn粢 Rk*VɜH &}|'=XnhўbDcc_؈2Nlcf@N!YC<T6)L#)eNP'"&y;.1"2'ݚb62$23"NLdf6IPB{_Ji·_|Br߯5,u߽޾{hNb=?(gDZTtVH#fl{,|D+ݲ:錯v 5n a#P$o%KG+hb$ g&8Ň0l}.IHf=#d3doÇ"u k_vu*񂳐>{ik)?3FPhb+RHK %"]ϣ2gSFty]] ug G1"&Y^Kt 4y4+((%#JAAA$ᜫa",s#rVw&f @9ek #W<2XXXTi9Uqc91)( I"s$} q.#%>0wwuƂX,6Q&"ҴUo]#95qb/ݷO{U-֛?5?35﷏j]Uy=o B_c@WIځo]ofV^ Rg|'Ԋ',L%XǪmz.zX~73I]u ^[{yU;߿?۾k@D+/'_u7nSb԰Gf c?|醛 hgޟ*xy^z??4fZdNDLdK E-? c|+_Xۿ%\=I0x֞w-fƆxlW*MKI紽YЉO\$=8i m~*9uOhyY꩎gЄaK7e2<}}}DD1vcu~$$%S;'818粻?%CBcw8"j%%%MMMhHߝՊ'=ܜ얖D w n-1;vq"F^ OS' 99mg[c`&nQs]:kPiIQ#` R`{'s;ruOa sLLc$+o=Ss?bԏH i{Z:&2Vl+W.b:.@J v222fZr?_(L =B ?~L˒sަYI,kX?+ݽ0/[LwVhDAן;;{r34oO_+?RjFLsرζd*uuq9kDD[PiH -ι d2FC[[5L]]]aF> Lje`Z4]XUAӅG` 9RHK7Uf,Swlj=jg]m9g{"GzS]!NbH$SRRޞLN٣@Kf՚/+բ&aiR5ʟ;8w\&ztƤDv]F' MKoN5^Mјzc5q3W͟kY5];kE&N iF^lmVx}h'FuFÀ'8]JM->m06̽~$_ BEruƪ" fE)Rj_j$8ڥ%n1~x^-.[ %{ "bƢ۴ؖ}P=C UYn+k_G>Ztk9.HYy?s.D)^IbD`z[>"[*- (" +uԖzjn&2 '16Kݡ$wΗv)̒s`h&J\UbCCy:Ce%ckw5/]hڵ+2yfȿ߾p{qA^c'\+UsϛelҵrHZa5 UGE:C;=Y8vZm9~f%߼̯^34$ DAci>,'Q?Mdζ3ό^l(/#qqΉ8Ie1$)y`S)uZ]+.?>Uէ_88S ;\rў:MIpTL;_I %hH*'ñA;'[#8=>b4ZB:Oɒ"`zEqg4|"]/?xθ~)I$ 7ĵ.)T"QH9GRYH$Fv"Lr]:{^w5wOtnjs$"=*]԰3)\5[pYފd vY&(W̝m&  o|ItMnhx l*5LvgHg@uC_zf.D? (zL̔69""jk j<+(37ho[_0G1Η[nj}C B]<{=+wQW.0wVV36,Z!ߣgQbge2grh#}sʋt q2רkMM>Z7pq#_Kxˆ/&8G{^e:io5"bfoqbҫ(iK)%[*3d)FDuh)F|)`(r"MIO1Y5rhpP ]0R 3 - Mg;0#%7ĐQଧ=˻;*ZΞ9)3m)sDDB)tlė *'XL$`:Rq5A@`S 3 -mSRޑ_ۛ{b >y^VOv!㋙2sFR8ADCmumAn!tuiL%<{RR))eaU>l(0wN;[u7.\+?Jc$+o%"1seʫ+/{bM߹܄c)e HT+ڷ}a#͈Je'/^oyw4#Ueҳ6:+o;+ݽA>"9/[:%)ҙ[a߹V4J]GHFk/t!]۲ r]f@\f#.G:{cgᎌn.'|*ͻJR-5T.]^>m3#pɥ3QdL[&\PBNj#JNŹnkSΉBZ92Cfo;NR_oji#teVSdo?x0/XNa\;Q)RڼtjAD$y<{3j)p9\Qۚ[k*^k8΁D)^IbDԔ|cWw޶K r(Җ >_;~&_ q'KF)5iCɲj`?x Ĭٹ&vܭU%v;Uݞ@B=PxYx_zKv }/*p{#^\I`?}%WJUf[} [o/4K'"lf^=KJti!MA$Zf򰚆#uQ"?+T2gX8idwJԕ©02H_f8(q++} tV&&2~~Sᱽdqj|)XG5 =TwE9i*K031MעP|rK~`M̜N=ں?Pw]:"Ң,T<%")QbDd6O>Yt1Ȓ{{bG҄҅WCuǻFW]52q9 &É0I']ƁxW0dy_>5h@&w:,U##"Z̯\s-DDfbF,>G:YSH/-K#"ͩ)%_k*wGHK E_ +B,哱p[V {]mꨥb7Y%Ui"IEaD0[@wj4 IDATwċ.kSy0y^>Yՙ-Fq#hwX(%):zhVE!ߴWG)=#^A]tdQMPH-_׮;?@$YP&(e/9GS[ ]4: ϕ*ڍq{aE/ 9ۙa8g"iD6tgsMc*MkfHČLjo=Eq)`L9nN) "⡶ ͙gI1JE[Cg}}l<0~U=|av5jg<"G$[89]ć?v#ݚkw/f=nX6WeClPdW]z=cf+u:}dCG$.(Pyp_cmBDr(o5M4niov-N/jjl 'teAGZ,v6JǢq:qdJ>L+(|y2UM:4T,\T!ؒeʕUWW-v=d&'9mU_'[H{h_Ǫn)Mݡ_8?Q:+s6nqY/5=2`DXx;.`&())ijjB;@Z9V_NG^/^A,ʞ KyXgvvNt.g,|NL!f,vSx) *{c{'P-4CK;vtMYB2z;,'F}X$x9F|F|4;<\;3w+iwW]  XqpŕĎ?_ˍoI~k-M3HZ+m3s?Y'#VsΜ33g Ba2Xy**UjB+wK"V>Y;%OifҾ ~gI}$$cxZtK{zmpDi&{Gs}yC+dhM=7YԾQT$!Y–Gҥe]]v-90|3_pTax_Ֆ,|b-rQڧȼ7K&q;v}V._)mфMT5GUJ1O+5OzFkj'ŷůy` S]'/Pyv$yUlbN^"%@Gͻނt-nۙS%MP`&'َ yd+L>Fi}tcᆰyvANTF5m,ֳ.[Z/v׭kάFF=:\EѮ|h7B;LB88,ZqM ycc5J!BhE)x#-\lHD1q[TfH䗦WMdh2Fc@tiޡd?MtտAvR0?C˞23oyfnٻ_DG^8EN~sCfKw;,4KHi冧r֕n>0kY/Z5?5?,[''L,Py>3|xӡHgq[MDtjzͥnݼ{0OŸ|ʾ/|W ɇjP !e[:ҟz!rI+#ukE%ϫEvoG.%I6|f|ݴR 0248uuwvG'%^#B <ͨ4`8 Y,CfqFM@M_7sLz*O "Za.umY~ģRھ9OW11i]{: wt'ݝ.Oɶ1 @I2罁CT优#YY~VEwwflr[-2*ǧ.j󮦣dtz?.P+F(n݋-^Z*SU!BڕOShC%Wښ[&@9`~OXJJْ5HF\ngW%gc?>5u4Vs[t_b;Jy`$?@R 8'<ၢ/n-}nШ$c=JS. < <<B(&#* desֳLDz*OS(:%Jyg\[@!HBI4IѾW`XJicuY)PP GS E.((C) l썾 ON,jN}ߎ }Ʈ;Sq޽qgvNd#J^hiץ/;:Zihn > vv?_'K(Cq9Q w Z#Su5]D/jo,rh)vňD"b"C V1ɩ+u=%B!t]BuZM[SeǴS. &Q?<ɯZWElwQ2 & |Xy"3 ?y87VgUdoklcV^;M_TzJq#Wlk}kw)ӜBHǧş䄟4n6?%==/X>egY8!̘Em'I#3XqKoN?/V;Iԯei>s賢0JN8ڃZ?b]s B'~czL RXfg^:\N%Xk=uy֎y.YV<*MӴVdMMM22*J$N-W sfh=]Gݲڼe ݲ: 5!qR_rB (XaQ+{WA{'L#|ZbuD"u\Ñݴ/(X;MLT)nyp`Ẻ 65 |r8X3Defv8Y g@ DHP@k5 땽<+iLT$#Fc*Z;]#txaO{(2@S~|{}NN˸MGDmGcQJf+A栴rvWVW{y#ĥd(Rww492*z֪:v۪~J޽e*_NZ#jl?U{_yfܬH2抯lsSߟ0I#ڎW1'$N&;۠k z𝯋Y`R?qy6.:crZ;zV %@R-](%Q|!RBxj歭* Pe0Z[[-KP%**`0ƛxGxj&@ ~ x`ħsRE9>dxUd EWibֲ!"8yxS]]\R#I u/4sRr]%ŮQmǜ22sN\|Oc`/$f'Z ,R:9vN^~c oٵ 5mB!4\\4q\U]vq@L'h#(zzzz{T4A )aw y:`7i>}@ '^yv2k&~kKxW 3 SG"\^8S'^NV$IbR: v/+(}K=7S0N_}bO}JH 1=VGOcȔ&r7o)lKLP]؞f TF>pN>\]ۻŎKwyWc-}-%gW%1!r9[RHwЗ+,[ ?a x<<Pt*q{.ޓzDPP`#@664AkH-o-Ak#R겹-msRqƚv !Q hyu֓]>=0fn?_1=[/N-֭K慏A%/{\uW#HiVˋOF=co爘Q6Qj=XZ$6BܠO%e? H%wUJ uN"ppkDZ" Ď"FD:-^b+}FEj1DA!&w`/7]CdJ Έq̾QS.Nyai*ih_9 WB$uyd5*-yq,̍Y/DH$IlvG8F.hFQ x ϺǩdNjaNE^Te(H9ƺ BJxӣVGY6xA B!4TQC*C~U[[;*G7'Mp6ȧ<_p/sQ4j<|v|XCL]/ba 4lHRT0҂倄X E222F]dr\vH8xG(VUpXcC$uӒwT}~,-iF!w/ܞ3B_5هpp[z_BL,c2|b^/NȸEZbGؕX!4,6 zqMXnx؁#=6lB!""@Rߚi`[ !BnѦӫd'*Jؖ%ݺ'2/X!BRDhw47<%%%D ƪv r-e"rtSaF,{o[R&E^xRB ~XU(.-jw%&vc ! TbU}CHc?ƮqoxucQ#F¾iG"Ru4IuЭRX|.#QDX;:]007D/3-s\&D&ƵlJoJ S*F1伹V(i)F'bń' 8ό/zOIR`5{^~J\xFcnp(X'#i8kz8qVTD7Ӳ%z]=vOu^*Jf'Rx9CV;4Eϲ}C.G)@Ӡ{].%%>w;daoMJ8:V"rY9/ZOdlƪ˿ô)4%gzZ^Fe5]$1pu:=g`׆_B]v'GD5? ч~$ 7ShCx*(JSWUYP$%EhX<}mgٶ̀m6 g+D'z:K8;|>O&6#Kpޱ 6O h(ߖS-4! ]Ι|\k6.BNZ~;(&)5\ "~?:lv_+R4RX:i΢K']oC_A0 ^o$MGIm7IX}tkHR8 x8< lCՉi1~yھTr"bB _hx3ydJg(]oJc( 2`v@"xM>7{ >@+-]"/P.^ʠxLI7>wh cǎIfx IDATZ_4hoh3fV6LB9 "ڗ3bjz4P4mHrBC~@SbJ\3..!4(.K!ʳmsUc1`{ؖ^ulO#++ }] HK\' ^AJۯeO X=|G;:` 4JtK륬z)=umY?8`: ea%/((]a?:zUGJd/B7l!n/..4ϸ WF †Fn[U9VZ!Bh0໅h Tmyyf &E{-Ɋ|B!0JA6pM)W, qɈB!n)B!Z^ B!B x/!B!44E|m\zDTTh9cnw,B!F)j sezR/WkwXGQS jn/X薻)2sey:qe׿m5Mo{@<^o:n`h*Ah8 eyrva'ggjGiӔNo.|?fdN}~I*sӿ>9v̏z`H:~?_}d8sϞ]&PNXyQ\!r01ghPⴻY:rIڤ=x wۇha}ƾ_bv"S -x3!Q B7Q6V.yh-x4V/U"; 1XQX`)]{m<&8->'pGJ ߼̣[|X;ۋv~p@3- 9R鸰oǮRs3Tښdmǔ13%r~ǪW^^.ϧo0+w/+!#t7HQ$O[xj^F\n*0B=~ٓҖ_n?)ݽlnn7f;>:I0DI}>aΆ5"*%L؆^*p.pB[V|zxc1,~r J*E)|;Κذ"@fzT\-w1tS{ʶ⌯ I^13]k=[My#, I**%&T<}&ګR7jj] <󜽩1E@H0LHQpUm)2[j) ESe4BaFޟ>yP&9_6blv9JP?;8a_i]Ýf"𑕋7}V꾸ر-fJH,Lh[|(xtYݺOkQk-s?CZɫ~mdE/\ΈX)t^DSQq@G,%ݗGUe)|&Ve$PQ޴ݮ˦6)AP>)Ubk>zys8Wv97s7ُ?83ea FۮzH[{B^pr==uu,0 YPxU:R^uLnzx6B !0o?;HV_>z͕tuBlܕӘS3g&R&K0.3 oѵol%dT1ʮN@*jmh16+[#;֓\ T C!3]6nRMWǒsO6 n0;xoI3i&OCIQg)F5M;uMX[@H:m==6>PcelQCdV/ʶ=F-n@lkK>^ψV=XZlT&}>SN?oMoxOmgZtT_'m->!9[rv8PM7gnm4**p1X0*|Z:!Z%3*1\ \Ed6Xu iצNlǍͬcl>OH cUgꢙJcuGOi {)hbh*F)S h^K"Nyg*FdC?˓x\8L櫲F\vBqoںP r2{?[~5MSlyUg ֥Nj3ZwD )M>l!SsJ B ^"@s9!lgM)j4UkN kv@2$̎W(9'O7U:0FMM g6`꾶[1:c]hd}gs#\Kmܐ|y΅1fZ 2qLZ_K-:)IAKIzw뽞eLЉ(i|Ą: $c9`J#2'MP7扻d=>qwZad 3;wsu$)ֶCC? %:gW6+Z[_-XuXdb;c`wuhOٽ++YW>)q ?08|Z{<@K[*}y ڐ.Ouo5<7][J8zqKxnƶ %TT/xkCO=̏,{4˓]#X~J_Wۭ`מ_u>lHǬ}zf;oٌN*Rn߶򣥔=[κC>0K6JAy F 5"@J{{cxqW(#(tLJrmpD/\wR"T (z|nBgCg(9Bh_h4*-N[6.="*R*m1Ỷ4=]k mx}A5wm/i>YIM5Y9owE;G4 !F6F,_!F5/l!B!RB!BB!pOϣH. B!F)h4D&fv ˕z2_vzq[Gν/Wdj-J?uJZo\Xytfߦum+s&ks|eŭp:C;^lh7AaаQ(a#xɔ>Tƌ]7I6My:J1kw#cA\4`ľwsaβO;эF:~+Ljkk<{WQU:vOQʎ:?/f#!#tOH nr;SR\g3{5AȔPg| \][$b$]>dK'~oURJw5BerX<{Ú r^l& lom/ rYfzT\-w1bH#O-Kf}m&2 yTUf]$xzkj6LRcUO@$ԛ !7g(!Hebic,f i)if׉Rqpλ6NX?׽p1jV_YQgKN(ǧt%ٛ*Bs򴍇XY:[Z'0ZP(Li)e1ini()595h&~ |HeRk7[e,opp6NXftʲجT@;\}FO#g7ɓҤk_dB(Jr=k D]'!G,d uj}%0:uO W8qxQsZӣc”67 6ni..娪 K$RQ}rcNJR\w[qq @>6UF@8!V(W$MpzlJY0A' wu;$M-"SZJN Ҍv5 ^w@Ǧ%kkq(E4MdQ鹩JFO^()=8!441wk0%p6LÔ3v]I0i:W;ؗjynlqvnNJŋ2,vk]>JRXbkm<V&/Y"B0hTQ+\ؿ+0%]%{ί,|Y΢=ed^*?|o)2r_;*ѱ|aYr;9ST U:N D!_'MLO-++JB7y_PPu #Vu?Uvu47|%ϭg2 C]\v\{& bX|I24F,$w*5U>NF7 Q蘔癣'o`Bh$_h4*-N[6.="*R*m1+=u3sb剧dZyNoƫX#!Ј3 B!42g|~`F!BaB!B B! |zFr(B!F)ČڎzR/WkwԎ7$5.H){_~~śSWE[,a(~w!dynzۛ0{(a|UG ,OKMS^.Ieo*cƮk&clyhwβO;э n#uϯ#B8]Ex@}9_Qǂrg7l쵟!;#,4zE *@ab\$)IP3%Plb vZ71n7c?_zz+fFtefn᱐BKAH6D/A>kcv4Pԟxrs w$[yK,Hy:.۱Qk Kzo~v?PikSLafIH4t [|X;ۋv~p@_+#\ZR.Z3Kx=F͊Lx7ۋrQJ!\>clVFVw'@@gZ[˛řw=Oy VLNls3n$luX= Bah3+W0_/Z=a2˱{QU;uMX[m+ {|joiAS8L:巚ek.-%ws@Ӂm%aڵܲs:G>: B-'^i6ZO/"".ixh+*?!)k_VħW oY[NZ2]KHW֤>%"'׽uKEm[8x d5++g'M\H@?I(Nx]mٰܕiWD$Clb\ˆr<%3V("[/E.g{,҄I" 5!_\o阓5R2ַc+͓DdO9.^D<O/u^91#cl˘p'[NF1u:n9Vј_>km:UD⦿VAUt}?}onz- ҟ]s6EDE PVuC='v_JJSqIDYFkXCe[SO*C c[ƄkWxzͿD5a9H/MYi_I51eK^N9~FݧĔi0;64NQ[{ۖZcVoj8mKsPrr$5e՜ Nј^XGcδ5trQ/["uH|tx%cݔV*8[ v[RB/[<"r_L3<:AȁË^=%#zԩsJ1jG?7fU7& wXyԋsB'xrCRܮ]GKan7%q6KdQCǭ)ZRפńI)!kJDzzHe? n alM[o9e v/)}uUKv=rS )}\+"u<$$Zffz1aބKnt&qv͎wb:sx]%-Ϯl>]S^DM<(7-qGuHg'~ۤ%O)m~F|jdc&L"לXǼ'}Ty=zK۽{Ƥ?,HvA'Ƈ?$c1m(z$ks3Oq2ɶ O\03Mq5p'Voj?6 /םϔj9Ҳzfu[r*MsZzƦ9-p4tx>uetв}uhzێ~S[p}c'2`Mݒ(V-("${]yV i]ZDwR-"|.ϖr3"]H`` R'T<%0W-H*%v[a!=3#>EaH/GU;Bw];Ӓ-?Ό ӽlDj/:jٶe-"AW}’+]p9BsTsT'ֿג)WnK_aRէ>p!UTMfi["Rndb˖*#ក}^\~`X v>5U"hSK vZvR~rdn1XF[S?ХEDpDظp.Ѳw -e ,]xίҰim@*ߟ- 47#% +0 ]lG"!%j=8oP^^ҷKW;^Sn2Lvў?K('WvnQOpؗm) iSODTa=tHɉf# ^I̅ FyޤW/)\\qwPΆ |S[whg7{hYەm9ݓ[ޥ.@seqYr%s`eRJ5O/,lxb`K%k]C@y &v 3pm\DZz^ԨQzFٳ'O^_@M;Ⲟ884"1ܰ@q2Oء\a+G''%Y xwLH.Xc=g[6Ga]vE翖Xk˕:{UG~2۲l#̶^9%I6{3&' ^XdJO6)y' vܾa)\=0i(822?8 zfEZ_}йCO?"";}84qSUO+2V%\VZ=oXeyk|s勞&q|U^U F={eyU&œk0fx2Qi$Cؤ`G%Mr(8yŮ sO)֣᭥36MK?µ{xtG=|9ʾBvS%zSPs2WT p_SjuV-22:=C=԰_Ϝ93A0ָZ>W*тk[k(xN '{Njήq⯾ꫯ}ԡ]K凌B iHpƒ_W#׹pqْ׼:Iyp\Ŀ'$ǙCGuKL @&5\~Ų+ws}a/߾u_ׁ(JA˝z[!sK]ı9+ldbw&߳d?,z V'֭[^ըN pS^ӧّb' f,Xvڵktt[0sZ'|T2gZOZ.]i}tQ]ˣҙ"4 } M*cthJצ{׎TYnCEgΊqVx!UbWIpi \4gnj3YGɦ;\뎭 %%|lZ[e)I/Eyz F-.ׇ~kdkN<ٺu_|xT'w֋ȘkLjȏ{O{@y""Lo1~kzRo, R} 6:w&&8r|x;zѺ@`t9;n>n6HvCF:X ^>-yyWDtڭqNdΞU/ 4ePώMx9`U""jܺxMVQXDͧ2jZ-Fc 3jQ\.5揠FQ꼃=rV5*)̤Ӫحyr.2&ʿ%*&HDsͫt0AUrX*cYgd>0cɨժEQ-/Jg48lyVW`&^q6QͺhepZAe.#*ChIq9V|r}WZafrXjQɻm 2Dͮ6j=/L .*C(.j.խ3#/Sm2(.je)^2͔/%Ș 6hLf 1:o-ݦTb4z*z;_Z".a+m %Dc 3Zާ?%J`ě7o޼y6mܮػ#e@l4 9|Љ_96odZb|JwC:3iSDt̵,N,Z7.y$MNMLmmiݒ'ƶ_m3䉭s5G":'$&ZGOs1/2\o&~#n4uyġ?;uѭ""'hNmVݬ'm6.wD]g;%7cn]#~|6˞i6fP̉;xռt3i(5?ntkNkf(LZb/MLQ&Úmݰ0ye@jqڬVKeʪd܆3{߾KGq]9LfYZ[N\C:EDuee9Do 3iՊҢhLURZQqaQgͳXEVZ.Z[.Hr*\~Pכ¢Y.SIrUGw^&H͚5W},kݘ9tPhٸGDWH/Y iOo޼狈'g̟=N@ϦnvM;ut""?gz{vd3 L&7rwkΞc(9.&-4̨F8J-9yv_n{i٭vY+8h+,VeI%FFn!(֣vFW#WUjD<Tg2%Ӗg3 zѨvY-V}Kd*t'[mɠgI8qm6 eK}"NaҞjp|nWXd+vfПˀop_"&ZD f?zUGͿENŠ)WPaewjbV\bԪ%(v-. iWĤV\]Nt:EgЋj}"6> &eVs/(92nMQsڬoqa+/UdT;2mΒ f^csE*(v7 @&.GΝkԨa}<%nGu"^]ޣG<:ڤ/atN//"Gx<  oXUM`:>(~_oɁXzI۸1Zz<+[vujQW28Ex<""hS` ׎(?߶˟ 2AQU,ۥASzh9cuIZV՛cʞPTL:zqEzlJ9Laa](ѫjy V-vJK|jԊtV:JO(s+rL.9Up k5jEq^J\D{RQ|[\T+\Z_J]ZnQk"Zm)\NE1TjQl_R%=U\rJUQzEQEvr;I WI&qqql6徦ڍNgB9}Kx1JN\Md8wϼ1ֶnߺu~ژo"{~;)nRFOܑvI'^j.ۑ6mP63)J>C+n?>#/tJN޿Ëy+%FN)v*ґ">уN (њu+ϒiNC&m4:`0MF5\ i+҆[OT!.tTݐW2Ŗewׅ6 Wⲕ3iʹZ` 3ok7+}/yv, ,ǯK3W[Dh}3 ED#L{ G:5k|cS;QNswlݱq m8(-WL, IDATSǀfJ3833 GlK/'޶YFܧȹcR_CDR|UI*VNF}H.KL:݅#EDvAjŞW25Ux}nۊ|Q:ۡo?\n)sUuAK|V٨Q VVZFhsA7ܷ̃-Y  n;sĨfuUzU^+VG޹@UZ]9]_!'fCFŸm]{v4l011q…۶mϙYܬs3H@tl gZ4-~pp9ݹw`]6n͵zLHp.jۛ|y|R|?!hf2so`k{n͢9Ze.`ɗuWZFZo̕ٲun]~tv=Fw*c.7}۷}KPFLa^PDk0DDkY5PsƑ$%j^%"Ҙ#Rt6":J PF`P;]>é6.3 :JRitFZN]њ5L/NMњLsku*wݥ6u*Jc0W]dWƺ>L5iJc0hWRn}E6`odTm27 Nht&^\vonE5T"j]JiwhԈh*z{َLM*Z!!Xow *ƒoN-_u8**MrrrD8??V6IH^ܩz`ƭ9M\=?3Z:k*\O*Qn}syIz&qWDjUg'|giU\rQפ=}i1db.3キUsL jhܯsS_|SvV8~pcbw_Z#"sTK'"I~" Jqp ?!*H#_6o;Kuq[W31 O?u pp pߠ bb'$0fԭk|aHT^D~m_`χ_tzN{ߴ9Vp>^0bpm2|8a3s? 7jtujj,Vκ;"]~Zz卆Z621p5zYjբ˟=+"UWvc^pY;|C=[fM?!C"{ɱ6bwt֡c0&pY8N dɓYxq-Y^*n~`wg\:? }kʘA><튉?&zqY؉µۇSlyt}_ߙ'옞urP)9KJ|ujmEz[5G #GQ+z(E9vqANgPw % w6N7V[wN_4E%$$hɓ_ݽ{w鬔i?ʕPg-mU\WmzKOcǎ#G~ ۶m;vK>\/=_2#$$lrj =0/۷?ԩHNҴiS裏.;2m]:]Ν^z͒%KDÀM&y[D/O?DD90|뭷~{nޏرc֬n[DU߾}###jC{,:&Mdddddd<}oF3dȐlR?z?!gTUoVYII+}ݺuGK/Ο?Լy3_iW0vuǿ^~z16mС^_y#G>D;S^=hʔ䔔iK.;yѣ_{mӧ_0DDxqqs50feKzO]\uǎ[tfgbJ?l6rM|'.r޽aÆLiӦ>h??TwÇ8q>t_^5:t0|x#͛.6/Sۋȉ93玟 "<HzzES,ˁڵ+==o7id|sqqq:uCBBmҤ`VԨx<> 4h`Vڻ/'Ө#fzU7ӧ/^y%{i޽{ӧO_qgϞ)W5';v,11 [͚5?jʽ8?4>{,=pp:ٚ5kHDD \/41qbݺu_,׫R5M VZ_p̙JW9r$Kјf81p%Ogc_aْq=F5ktǎGǎ=O^ҹǏ h۶ݻEQ p'Nh֬Yzz^n]"~>119ښou 111ZvWw]޺aaaf?1bd~~~uQD6mdnsgWqK^GGիK/>]\\\\yyy}~x:iӦ]ccccc{~=zPTk|b QT#Gl֬h,,,LMM]l3g6wfs˗wpZNÇE䮻6lhӦMm\.v1;2~BBU{M6}ӧ}h4"'+>yP?21p5zYj Vzt &"m۶}ӧسgz"##{҃?399n;|C=[fM?!C"{c'Nh5֭k,;*܋\W*4i۷Ot,9Z7lj,y?K3%/ m6[NXtYƍ5kks?mժ^_-1x`|pz+x!yyG;ud0v{ǎ6mwފW믟x≗_tӧO}w{m:{lzL 9sfΜ9={ܳ痭[֨qnygϞ9sȑ++++!a\lkZvڴ ZߴiSttEIOO/CCC+^vO<9..nT^=///5upU ָq#GNjkΝ;9ro  өnY'nQaQ21p纕Bu]'+x0L رcu9>119ښ:'/::z̘*_>%{1r/1bDY^pp̜9+55 (1wnUob|Mֶm۱c_8Zg>|dW}>_XD֯_~nݺYÆ='"; Xcw0$$vvL j~d۶mvU#E䮻6lhӦMm\?K/_O?#G$$>XTV-y_xy񏝈9zb[7n\k?`ڵk[h3} C iZj]lwm'|E]:XDZl9hР[v-PSO=y=7xgGJN/Si6NiR\.W>ODXD}6O' fϞ_\NzC =}kժup?ѣ|ƍϪSԩS}>#<+IknӦDEENq_|w0l21p 0 /)"u_3r"?]2"WV{+V_:rY]tQeyyy?ҥKjn|WVl޼aÆZtYFFj]~}^^^233=aIOO?vؑ#Gի'"o֯_oZ/X׵kW:,N7/Sۋȉ93pFw.dQFVVϬYQQQ|oӻ1?(.>ZAOm۶N:*??hexK9// QG̞NV-F59{%5]̙3_݃=ݲeiR|>ߌ+؀ҵ>O>(c'ogk֬)"'$`ԨϟҾX,kSz^x,˧~F/U-22*[ƍ*;E9w*޳cQ۹YIIIO>ԕvAt[ljQ/{5M~[1db4r+|ߪ !Oޱ㧅 RLUaXƎMm뮻~;é׻תU.UŋKH'nߎ'; q dbN9vּ͡˞v 21*QT#Gl֬h,,,LMM]l3gDVZ-Z4[`}D焄Ȑ! iR ZCRY+*hi{Ǐa67\|yתUk>|XDaÆ6mڴx۶m|bWk7_qūWVSfϞm懆&$-,,Z~<SRҤ իW/叝 9s111:ɩ+W>PaÆNݳ#s8y?vj=; 21pg0DDxqqs50feKzO}YYQs?߲eK˖-~}SfffVVUnO|>ߞ={N8a6GTz@zHHHL=em/"]tQegϞ?W^7Ob㗩vhE ۜsOH ~={>R~@ٵk_~9n\B O;' }>qqq^uoF#"QQQ| 21p5zYj꟪m۶<3x{q\=\ddֶmF٪UVZN^:{L?UVq_ED~igrr2psq:ٚ5kHDD \\S4i۷OS/;ۛoN_n]6mzj~CK2Z-}psqɒ'1J/[رΝ<wQٳyyG;ud0v{ǎ6mw^O=ԡCrrkժݴi={}cǎl򫯾:}(KU\ Z/_OK>}{oٳg+dbUx℄fT<شiSttEIOO/CCC-~v!s:۷o裏>ղeG5wk/vO<9..nT^=///5u{pU ָq#GNjkΝ;9rT{;mAt[lj{@&h#G;HV7IDATQ[p dbL 21@& dbL 21@& dbL 21@& dbL 21@& dbL 21@& dbL 21@& dbL 21@& dbL 21@& dbL 21@& dbL 21@& dbL 21@& dbL 21@& dbL 21@& dbL 21@& dbL 21@& dbL 21@& L 21@& dbL 21@& dbL 21@& dbL 21@& dbL vX` EZ^#gIENDB`fastapi-0.110.3/docs/en/docs/img/python-types/image02.png000066400000000000000000001352671461403617600230040ustar00rootroot00000000000000PNG  IHDR~ 6sBITOtEXtSoftwareShutterc IDATxy\GBdV- Q*Z*ԷWhmնTQW) \$@B&cADA:?ݝgfw33F \#cG٢KљTL8dip?ӿFU o:dc>BOA@  S%":L0B]%?SVU_z1 ^V(G.A@ #4ύ@Ӫ$8&(E@@ @t<@ @ @ -9n_mfX#TEלZ-u s I1 IICnG'iCR҆v]lWj7|柷$IT|q*Ɖ.ۮ5Ik ?gYȨ?@<@`| WYdŖwn=K!jݓߑ.\G9E7s=UaF{xPYu5:⭇^e OHϙAY{׋0z-M+md!5<fP),L:z4ns^d*\C2@ -- ߙ:o݄OXq)u0ޒnHaΜK'ot[-bpV ̏ Zy&"87ztJâ&'ܪukSSzgw8 ^7c湯/|l͜2^{RMIED#}TA?l\F[ % 0/rwrʙl zxw5ePغWjA3-런3by:ZT\*ˠK9Wd]3le~kT&i@ DK:.p峃G1g_tOG9tpbXA~7+*| 1Dو33 ^),]F[Qp\|r<=)f_V M޴!ya.UVT~[' عT!a%@2c cc-TB)6Jy)`>qȚ|#lB{~ʨ46!?њbJ{g'`GY~Jy$iW?xx|KXPrˣzLe9z@ROQ椔nk/=|k}]Oi33D&@Ԁm~ Z{wNgD!\P|OOzj,J*Wya@ŜO+'e 4eo5-$3^|n=f?zmO8.cY[HR?1Jh:`|c,xPŰaq -@h-t{5x߆ō}0x8Q)5=}XtrT_2>|ޟf:sT%#B 0AKeY36x` m+JCjB @b@bs$mt,^ίxz8m=c='Vf\_ֵ)N{.D 2żJPA7(?v;l˧17 D3.fwDeyCt @`˛oY}[dPinQ\{*c`̪_'mѳ;Q5-3JCY=iW X<6?un|0:S *6CDݒ@ڔ0i7[87.WQ4j3ۄ?6 o}v_k)e;R* iHLxDˡPQUQc;$FqnW]GOG_ :)Oq[ik: ¶9^9$GX!1t^yF sz̮,6L 6ˈZFG.K vES?f_|F!j[W5CyF *!XTzgdnGJb X{u Hdpz[׏U"J]}5,Q^V(@WZ-A4F dKfϲqx- ȵn턪|q%۷EC*&Y%%z;πhzc{ˆ $9Xk\{Fyoֆ a {9#@fq8V}E}C#ۋ tzB %}XvC=ޡNڗȣˮgƴ3ҕ?Gסv42{4}t˕K&;:{:qqܖ{*eO5U%lgE"_y닄U'+ zliũs`p@bn#IgOHV[`Μb,K^*I[Ό'ruC,[`\_3uJ^Q4Uv`QL5.,+63:? `o(m"mGDݛ0HpHS%GvmbХFFI~\K]ˑa'CQ'ړ.wgԅ uOd1eҬ hǔƧ: g)i O] pA(/ê#QU~Ho c,88S0!/@,yTm`V9Fxm ngp,g/raM1ٍ|jX6O |d: 8IݶV&h\ n./fA2BY^/p?!Ax.6ôe~>aΨ>%,Z7{}2Ԓ Vplpxx+L[^Ut־Fey7shSGQꇗRPlx1 FàvΝorpkK`;(eY]ўC32ɣ?Yn4?f ^˗G}wse(9ZEW[]A޹;oE+QfV, OsI؍,04G!@ i.͸ez7>pKɹ4~C}cop*wix(@ ͍@ @teĚ8_~X'O|)Ԗ@ 12@ ѩ`oLMQs"@ hMY'NX;k&l:a`wS{<߳~ -5}4 b=K/7JbToIl~/>Ԩ{ 2 9'_5deVzn(cG5fMG?"\ZI+>G$ u>lXXz,$ݦH4]TsĹ*=jM/M[ 34 at;B"]nӋ RUsWS!|\xWWW#G\t5ˎ%gKHཛྷt2zXzMe wu  nDQ5k{I&JOOϥKܼy43<6қKbO,M$3aSĜ91Cvtrv,Z@`;24deqح;Η Pΐs|oIFLF0qF(lZuޅT$@* iN.xkK @mV8f`tOUo+ PJYCϱp]L.\OѦ+@IMMMMM5ׯ߀^WͭKn#mYyկAq><$JOܴ`5*'vȵ#H?"?U9uGFJҳdw`. ]yAk%M]Ssί?cg7[M|[V|İnW$ỹ]1%牕!%",xy %^ QRCGI sA O8HL.pDCI)GNw<4r$dkxJ"V \fApR")frUjCdRM\.jůEUռԧ4D$TlRt(HcJܪq.S"5Fcǫ^ü1 " lB$xJt ?݇3C=tIyDL/eȃp SKbCb L;86dQtUbZ @D b`3@Y?7tۜhUAa[@tT;G B&2XHLE*5TPiL6HJz*{0 @TW=LLY dbSd =lL-J 7ԋjΤ\JWHdLΤ^2E}JTs&M-Uh*Dўh SbIlJTIdLc8Ha 09/53N(eT&K„Zh0 J!a J5FRc$-tH L(%F(1L%"û&J HY?(pcsU2I%.)F؜[t)2UeLAi4 B4PĿMLLΜ9^rySB'NBL )huZNՂVgBuX<2 Y4O*j4-INya䜭;gd$&_*I}rNz8^!A9YR{!V3@ S|>Nq^ĂFNcˠŘjq#!0 T&ImZ8; `w$u{L4: 1.?NVb$PNs6AL|(eJW+U*JQ0!08ԣaГh4hvFuvZC`t '$ct JM4hnML LZRT)Um4oa#Im*p*W7# qAsada[4Z,jA0[mDLo\40w°'oF0^O@PO.BT7/jngg͛7d2d1uedJ\lєR<[2 s IDATX<.3fI C'N~Ig7NX9Ru8*teTd++Z)냢ސD4HIvk_*>B)+z-R l:  ڪg ^U' lqL B-(:e{G#+ȫ &JQk^kQIU4.BRݥoa4!I$&HhހnӋ25QZpRI UtAg\r )%PIM=ҍal=GzAR(ݼƄDרY{Ą&}[Щ$sZQeU@c2I@[jn#prgEj <[`L =N%HT:mcc(ZE`L&R5Jd`j3TDt z DAǙPL܆ix3ÙS$MBl:D2q65U ƶ8Lܐ5De2ijMZJĘXl5 4JV_*g3@껇pG1fLF7CJ`T*ݦ^hHT&ΤZT1 \v_7%׳owO.ݒшΝx_~errrqq1TY1a%9/;-z|փK(mvwJs81ybi'#WBHM >}^U$p<'C9*DpB)ɭ 9$b *BĚR\n[I _)U3UJ Mh;P8aAQF"81CXoY<>8!pqǀP*ŢVch$" ׫ZT$:cc6iɥE b1sؠVJdjQ/XnH \jXz8gi6(Y !*s\X v(8Ǟ lCT$z O5 Fc)e֌%PH-Uح[[O,o] q^#ebijw?Yf5ޒnݺ&Umav2ySNUWWD t^< -)h^ֈ+.u 3yFVF 2 TI~ DRד8F(B]u u[Zl%KbHd֠ȗt@g8Nkou knݺU04uy3ܩ2Xzk[q2W3vNAimT"֭sERiO eaI 5KQWUV$d3"P@ FFؘ /O٘mg>zښadD*u:0lA@ @4 @ ׈܎Ys#)xPL@a88:TȚ@ D.Q]EJ:DW'123Bc@ F ;Fv9db_:Fc7!S\H>Z"#47cVWͮ{:w@xӿ Ͽ70zx4%-Pb]]n}<=ũj3fLqqѝ;wb"oIwZXPP6ฌZg`*b%V=RI+n׏/λyR3g mX@,aiJ3WnyB@< >k݊9u?u~yGXp4h߾?[43))݂*2N݌(:,R4.#F BOsܦz1+5D^\+%rV o#k[;Aÿᖍ}ZN#@#:Ìkkk~wwV,* oE :kkK. ͇lYXB5^#UȁLRS/OeeeFFFm L">Çwo] GIY길!!!4:lp2AxKQ9L\^tη[`ߎ?}##Ѵ<ӿ_n%Tk+>/Q"R1zL鄬yy85UR?S?8'TGF3iL&N\H8L~m),ZpѢ[3uKK˲?z! BۿqÇj4͛h4>,??_ plQEyǟo0wzɓ' :|ժ.^h5~x__ HKK_Jaׇ~(xR``yvv_<==?xŵk׌Iz-̙3|||***=zu ]tR {ffs l٧6l`-'Mxqhcƌ9rg{{{ ݻ/DS0W_^2ή/QPXXx֭^`!ɰaæNRLKK駟gzQFu6\T*{ҤI Hs#q#`{™L\QTŒi߽Eqɻ{lÿ|.^2<AK~ܫ} v$YԿ7/_+5b.ްل,Aoa4{Gcǎ&&&6lwtt ]믻o޼9l?_t'o~7q82h #F;wʕ_N8a̘g###ضmD" [&W>}ܹsR l٧3f|l...Ba~6Â{VjkY;׻X4i oD*'9u{] F$/X555G] fgdd;FS?@_TTDw7oނ!7njHhoo_SSzuDuuSN=8l~wllٖQwRe˖nM~ؿy3ή{ a <`2͓ݻ'NXz',lp^222y{QQKoժ?.^X[f?tΝ jL~p޼yfff>q̘1CO4L6m޽솀.AKK]=#֖-Yk\G 4N־ST8Z0ګoނ{5ZR1݄ܳJ!#xáXţBBPe 1P+9{KKKG .\tF$ ѣG99wޑJB0;; ؾ}GfTqE6}FX&LN@].*U=SR*2Niܨq5W_}yPxՈWWWî}]zcǎ8!F۲eT*U*.]oooRo˟88*++[&ef9w\D"}}9r8>>a!aa˚$ [fPRRT|>,\a ɉ"QQiiZZZ>ݻwOܼP(;bDK. ҠI$ҵkd2P(?t@&S:ܹDVzwBcrZ;[Urݰk۔w{^ޘS'6n:'zmW,v4[/?jsx-r#+FjwۀN"~EwIwN4з$zO[tiiTWW$0hР?iStffZ7o][#wL)I4֣G ?GFFF wg;7h4W˯۶ԿgcuH+,,|VgfٺuI srrGwwK.UWWJ:889rT*-mUr+P(666k"ܹ\xJKKK>G<}uuu{)Mh%$˫%UU /GdƦ>sX{֖kKA:}퓫^"9Rl8F2q{رo6R={uر66ݧMjgg{lb*"xL&lL4hFÞBƍ *00Y 5z]Xv9޴G>YڙpzpN ؐFz!3̍)&m)6N߹3fi`frxcZMbjj:k,kk@K'u>>>666ݻw2ݢƾ%R ~ӧܸl >32n5MEE0YZ=s~0?_8\.wР jիW#Fj -s֭Sf.D1CQ׭:xHx]Uk,X4枨d>x?IL (m8{vT*n$''MA={a"JK߿LH8V`fffe|OAwJV)=8_ouy0Cs%45eRi*wsG'ͥiju31cii;Œ***9ᇳZWU>xر׮]KKK3x*@MMM@?߆/p9w.e˖}b555Ņ7ol޸qcHHȘ1WWWӧ3GGoZd?D>}wmۄ (JqqITTTcn޼ !ۣ"jprrJ7 oh`po/7p'|)oy3-aH;ӧ;9曵7z/Zx[lhx7F&h,d52\Ϝ9#|ѫWm~@<==jw>r?ے矷F ^NNNh& x0|nD!!ܭ[7XgzzS#FL:¢ٳi^5ύ47ѥ4a$fBa NP@ ͍@ ^w͍>B FFRi#?e?tF0 `Ա9uСJ*~5kP#!>?7C"aFt>w@RSS?|MwîI&סgfmm][[7~Ȇ gΜі%@@kܸ*UR}t&Iؕs4pذ/ݻw?^ZZwD1c}tF""ϖJ%yyyOcƱc^Mprr<ڵ]^z޽޽cs tE ͍@ eH$ ]*OS|\lIΎQ/|V)'Mܽ{~z>99YP4>obPY\Ѓ2uO~*t͛FD No߾\1ݺ̙=gl0/2w.vuue2j:%%E maaq޽7UVVĉ'L߭[ҽ{h~~~q=BaEEEC}}}lmm O8rg?w\C۟@&M4lP+++\sׯ;;;Ϟjj;{l=>`EF9++݅FEju|` N{ٽ{Ϲs $d}DDD|Vt:}޼y^^@&1cL8‚UQQ~z͛ Ͷ)F  PR;wR? :t/8};f߿?h4VzA@t:F{GTsAp/ڕͬa+]:aFKgR-yN&KJĻw &ܹ9l06>>ĉi ߋ/9rD/!Hz}z}Kǧ@YsŊ믜\__nry}Ϟ55532n?͝;06OV3{y,PՍ9ϖϟV 5b|AS^޽Ƃ{ŊꫯZZZ~z #W0khqqqUUk^O&W*9܎1*߹sѣ};yĉ 7U:ɓp0ؘˠ{앖RUDjSSm~R*&Mtqq>$d]Y[[L;'$$ai  2DPQDADQAp0TPXEV+JQGցhQU@2†I+d\KSXE{/{|ιy˭Ns{=*RL~qqaWW>@RRRKK5m5uI&lOPƍL& UNNVD"8v옂ݢZZZܹ*SaXiiBaC|6jnɮL-yeou祉Yh'($f~z} ͧϞm9JͭTQQ`0PA z֭_KJJ,XN @Fѣ/^=~%G A:\X,_ss(Jo/UC^.))F@[t.f0 FWWHKKY[[9rf+**BBB.]$<$GkKK e9knn6֭_i4۷uuu7nn__am4lkkC(t:N?~,9Qbb"Z@oohL___+9mu={v C|;wlR;veee\O4477N: 4\UUF[[FHNjsÉٳ˗"`إKjjjVTTd''Gssshg?Ș@K`!pWMnիnnkLȹTȌ34 ? ļ~冁Fۿ?Dxb͟?;<ihhQUUeXf0|ap\YYYoooIIɶH fe322O8fjgg犊={ r .[[[>yf{✜lged2M {{{:t0###99YL 4Iٳ4aeeׯA[]]meezj6yʕ'DѐlaaSkk/@gX,Vqq }e :􍷷md2eͽqA5G(5kV#R^^~PZZ_xV@> UUxd˦fU=y&'k+Q-lUq8o JDsTPP̼p"uxҥVyyc2FnRV0˖9=tqu֩SHIIA_/MM sر_~7{/c0|k#GNMwRx0 E["tS-C ˚ $;kX%dDJ^[iKscw f>x;俦oݺb32Htv^M@ 1b;vD!B N.PE,qbp\===75Gry9m5ږ@ :ut͹XX~:r֮vf@ ̛7oҽɓ/^ ,g-]HXE\xLĐ}\4ܐ@>s m \5(K>LsC > @Fxm jncXxgO@@ LsCd!8UȩSᰃ!577A]jr0Z] |>.@ jn%&(N^6UەB4cZ.s'TX1`w@ PsC Q!&hzC(Q*)fX33pªR g4yOOϙ3g`X:~\4-z… XݻWjiiuwz>w+\/_Onn:YYٌLf9TppXlooO"jjjb @ =ld,c&gMZ~_&Kp hۢFݵ+c=X,=EP^^ǎ_z>a„} `޾4ܻm[seL zy``Pcc0 .YܹmRRݻWQQv=@@ SI{.^JbrM) )G|ٖBUUu֬Y'N,--RUU8q"zݼyA'˗;~ҥK555gΜ 肂?>ʺʕuuuW",ʕ+/]Ԕrz%XywU4`KJ YIIiXFR7o%%%O>'XRRhmmC d)))SPDwf0ʔ@ 8Ǐ'I۷l ;@@ VM555|2 `<`޼yo~wzgժը @/z`FN :%8x7*!OmK ϕk׮WVV b1(a0744jjj544p " f``;@ PsC -a(7_z}^EEEQQa,?cc%%%]#_0u75T*u„ ^hxrrʕ+ԨɏsssMMMaR7nXe<[ aÆS®@ h[ ά'$ 0R4p6Gi`Corss)e&5r^Ovww󗖖bsss\ȗTTT|K,FKJJΜ9|rOO&y 8mذkcIIɫWI%%=:9-,,,ljj7@ `a+@ ]]]uHl52" k3sJ[L+/W0\<eY tC ...GŽ?6(ioo.sx}e7m ϐRԧNӾihc\zȘD"|!ii+WVUUrk0}nQ@A?)m=(\enh ! Hrz_v6mlhh'O dECCcϞ=ׯS7o?M!!!N u̝;wnvvXޚU'Np8V:88P(J=== FuTT!~e>PsC mGNN>##ΝD"qʔ)[lVTTSk׮^Lss>^ lL:oKR҃8iii]I]]]ݱc`B @ EKKkQQ 77w8[[TsH7N2MJzpm uuu~~Lfٳee刈3 FJJJ8.22*++k׮]ʔq&&ޏ0tIIظ\ѳRRRn:t._̨Y,DuuIsp87n'&&hbbbőN֯_PUUEóg#q8|u6 ֭3g6˭涶6nn<`gglƍ^kk+gggYYҨǴi8ξ}\> iiϢ##Ϣ-1c|yyٳgɓ' %%|633p8IIM$%֭\{=(0--mLWW׷xGb^^g̘A jjj###o߾}LR}}}&M_W57@ cۿ_GGUVV 4ZHHhWW'oį]Spq11L}}555&MZʵ?D/),,d0\޼yAA^^}}}@u[y.]ru][  zT*ȑgg[]~]qㆼjG߿֬Yi_:;MMMaaanɹsm͹siӦvtϞ={@dee5++ `nn[[[bΝ;3 SRRn*))waA?;P&t͢b-[+))Qcǎ g #j`BCCl߬? IDATx?qww' qmICCM&tX`EDOox2H#G=@ ؼyPsC _$=}Оj H$ϙ3OӦח7k,殫Eg+Gb~_QQ`Tyfdih*kkk55RHHHGEE=z`0N766FDfÃ!HYYY|>Cގf9r>PsC _6մw&K(KJ)G>4_~M`…>&38ݻWX _`bŋB\\,.&&V^^fР2 yBeFރVEEE\\\(C[4G^b22L@ hiiFGsZH$6M X;壆 /p8<b}ꕅŕ+Wx|^^PWWwrrFSPG5(w P(w`VI#BEw YE"E555[ZZP pT*u-jr-[[ۍ7,]CcX'VBzDk#hQz|vU*A'Ott 1lnnmժգIÇ>7oːZZZSSSaC#mEEŝ;wաI|~gg}E`K͔bX*cGP||˗};0!32h-Pa_H1e 5CT>|)˗鮮 <'' r.:rzz}`llfr%`0۞(L&NJJ..ϟ0ۛx466ϛg.8x0e&pnjn 8y4_TmW2 ώi)_Ra}ؚQa0gD~G쪬vڵ999tuuuQ3II)mIkk?]fݒ|CCCuhsbt h}D{EgQPP\6# #g*++fΜ}uuuT*u@#sY/8JPD͠ ?NAu˗/G 999 544) J{{{Uc \@EEd8f޽ijTTtQsz{a6Z nJfatA; ܟj**kzhNGFF577cX___PNN-%%_n?|޽{d2<믿9pk3}Lnnn`0?sLSSEEevtj߾mmm۶m۲e鬓2Ԟ[4OS>MҶDFF">>(00&pe(NNP{֮@e+))9r8?%?-d2i=AA;w2@$:|Xw&&&!!^^tzs3xk֥ͧfg8::999uuur .[[[NOqq\ڵx<>++;22r׋*qii޲rt5&&/884>>ǿx2===:|WWtKK?}A]|kb{ՕZ%55ɓBϟc0U\uuu={hxCCɓ'h'NYٹbϞ\ |7۷or,{'Og+ @ ~*Χ;~^rTn9- !ݢE_)**D7Gm H\fp PDG572q:Qiuu5;ǣ>!PsC _=&Vٱ/sssww~8׷auu5I 1Ňs͚FFFa08hDG`Μ9gޱc'sZ@ ̬쏚DZ+%%%`0<4!/‚@ ӥӋˆԨg54ޮ7Bʄ;0,>}ZQQ JJJgxEUUu&SETU1ĉ`wC ^RVV?ld,h0)NjǏs;&Nxĉz uU444֮]466Dݺz}}},bUVTT7rL9}qq]vD"(..{LLLLLw@ c8 ά'$ 0R4p6Gi` sCt/O<0a‰?dQwwwSVV@wwe˜:֥I}}õk|||H esqԴ7lذuuy#'MF@=^|9!,X <}՜#jy@ [|:[Hl52"PG%{Աx3|?|a_@ o ?h[r7m ]6؄:B<`kik.7Ο?ܹsx[Zj!!!V^^v(<!`FsQ[+c=-ƒ|̚5h41DfAbkk{itf8`Adѐ-[7g9sFxׯ:[hMLLǍBFFQJ P=72@> Sx@ ƞ={֯_/tXZ]] 9u*kmlΝ;7;Os8/l@@͛7sssq8q}c%7B3.\jnDqxpjݲ$!!cMGGssXܹh)))ۚޛ7oۡgn!,ZQV|a:44l:{6q& hhh?~J666FFF|}} IK{N=xzz]끞 _fܹ~~s7o޺>@UUuóg#n'G~633p8IIIt?-ҌȨ!)l))) 4#Ǵi8ξ}f̘&//_^^~Yɓ'{zz(((HHHTWW߿4gl===sF|bb…vtt\td}}}llJJJ8.22ӧT*gҤI}}}MM_~%33zym1c@ LH믢œjnnppKɓ'{{{)))ߩ9rʕ+\.g5<sbӧO^jj!!!CC[[{ڵTtJJٳbbb˖-[$%%^QQqёHp'Kvvv~=TTTܹSQQ71~||hW11$jێeY!M2E[[ϯB C&jaTT;)dTVV_윖ʕӧx<:]ݓ')L&+''ښF %%%?UUUjjjhaX,pv͚l6ȑ|> $;++ bXh͞mKeeeͧ?zΎd8qݻ dvuu$%%4/^8r1222öŋcbbP␤3o޼14MfӦח7k,@>mimL|QR |>+ &a]Fyx…>&3\4/Ʉ}"t:cɏ[ZF;(JJw P(w555[ZZP pT*uDCC=Ljhiiq^Тp#9 k- 7hK nU6ltw_;<|iٙ3[!q|~h聟~izzzQt??vDze@?3eXp|/ޙjB:CD+T*uǎГ'OH`7"~Ḍhkr~mSsG%;;^^!YYY'D4(''AQH$4߆ s@o۶>Q6蔃Žg#խfb!) N~@ A?xkWpUU…  x}}}!ɺx1&,찅BAm<$%u=*+KwȉR@u5CNNB|>9z # }}}}YSSڵUUUŐ`0lݻm Ӆ$x99۷wuu\@/^͚5 } 26ؘkfffj:˗/F}}@ h8jkkun92жbV!=7**)fX33pªת(]A :܌b}}}i4C99_~x{{O:E\\ŋoњ5kZZZKD=bY͛7m޼ -;w.򍍍/_yD"qMfff]wށ]QUUխ"H%%^PAAA4ԩSDw,An ÿ4*+,d6Hׯ_|ǏSSQQA&jqqqч7''r׮׮]q~!9zmmmH$ҽ{5558%;;[Ll{mmm7oޜFEqLLś[TUmo\x1?ئePj޽{8BMM͐1{{{啕s GGG(￯[ccc3B݌L&777c09s}{@[[;üz* E)$$fkkO{;ߣ{wŋ1[wtt<: qƣGkkkmpbNNٖ;wغutH֬Y{!?tȗ LrqYfsssoܸΉqttrrr*((bEEEQFFSMMMNv[t_FhZ%f~D^^^__߆ S/_566666 s.zҥKNd D?.|~ƍxPsC  t"FjjTѳʔ7`nhhDhhhYf)7W4lzl}B c-ENpC;{1ݱ#hĉ'NPG]8YZZ p\]]MMM&NhhH'iii-]tҥ#899^EEyjj?+*Ǎgi9L&~Ar#;;{"H$N@ , @>bƎۤ%Wʐ~q~<=0Js/de:hbϟ?e0J7n'EEE222O>N^t-,,޼yz())r9s/_wpp(,,477;:::;;˟;w@x]fʕ+ bNNNOl={/Lr=0YC"n<st  $;kX%dDJ^[iKscw f>w@ C@ _O-%ȿAx-ws.^yqeM(*d6r@`LMMEAFʱV*iiiwwqƉY}ps[#//?ERP(!!!!!!QΞiݺu.BX3@+݂~Sڐ{Q0xvΞ@lf͚ill4D"qt3QUakk{i ޙL611 ٲe˶ml W<}}sm^J1իΝ~͛DO99e˜Dht]FFYJJ_ eIt76/\0 /_q9"⧹s--gf̰Xz Kο~gw>t1Aسg0]Dll_N4aco@[6˗8p~,ƚ/_pܾ5rxzz 'P>_RRBPnLBB޽D&immu~~MMM}&cdvuu"nP5BvMMMaaanp 񔌌;HhS޼yLAAc[TT퍏g2Yrrr^L&ƍ/Ɣ>>>11+Vܹ300hȝnX{{{G,d00559w{yy9w.zbrsscbbmmӦM{g.>>ӦMh={p{6lMKK54jIt 駟H$,V,"'3 SRR\:::<<t2|pX^^p,s*܏'N%%cD{SٌEEEEo|11geX,vA )08I{:x<tW|7^ dff2w/**JJJdgg>}zѢbbbIyyy"oyKK p!M2E[[iO@m*+䯾Z5r5:::zzS_ b˝;w>|h>{'*ZSS3xӦMP|}7X, E_>- QbmRTT4{.N:zP}WQVV᠆%hRRR55f#;e(󤥥&(8n񭭭PsC aն3Q\EYRJa<|>TgNǏKN~8m5AIIΝAA ΝCNhjjM;p8JࢸL&RFFSD" C`0NN@!57܂KQ444XlH~a8s!.,K>bTPzd٩ѣb*eڵD"QRRQXH # G4C%''''#Gnٲe %%57QJHha9x- BϮJE>їU8ӧo߆=|8|>?4e˖3EEEn>rȲ{Y>ǿ3<ePCVS[SS3펎~ y? 7DA~,Vl>|9 pb#鐹vt1)**joo777(((*zo 赐~ .6`f*Џ2xի/_2f7S޷̙-hQ&W /K(- 7RrYúXBzUТpLAy ص+ ڪw^__0&ubLXa * II!鑒Tkk,yZEAS]͐P(衡!G=B&Lk1;TQ:+-QPPMdd_j4 K}}=72:VVV ALMM FVFFF|>z$x99۷wuU5zzz*v[[ۈDxwx&LD^ͨRtl"+KFda@큯fUHkqJ_f8*)fX33pNUT׮ Njnn(++_Аf|2.{SjhhÉ&O?E?Ç̙3X,N?w.|;;bbbwCZ[[;־A RRR$ ]>իW*((WPP:u*H}֖b"y@T303 ` % [[jBE {14Q7W-\hQoi yAE\EYa?N%%sΙs93yݻj쮯#G,--1HOS/^jN tr/OIKK377z;3󦱱.OHKK5m۶5i¸qc ߦAVVNII矛7##wΘ;/& \3>>!%%eΜ۷o/**>\j4]ttݺu޽ŋC~n޼yxxD:;޽˂ σF5552+::Ziڋ/~5M۶mٵFQ(c^lFBQYYfb… oAb}\ s9qvN:WUW>fYYY}@VwܼP./XQ\܅3?P*&;vW_rP>}.\T\\$A!#:wp̤g϶Ҏn?~SҭsKFl97xzz1w'ӝxxx֐hEg9r^ߴiݻ##wg>>bݟW^ıݸqCΝ;͟?\t2[[Aѣ,-VXQo[&Lg_qSBBfY;.0abqq'F?7P_їϧ}7dȚVEVk8ƦUJJ=[-[TfbvT|gD"Y~]J 1sևըT*333[[~|Ν5jaFQvvv޽S Tڶm[׮722??>t ⧰ζ}_/rBa=jT8_jΥ:x۷6-8?`5{^vmX E|m` ͛7;wN\\'jK$K.ClC27Pef޽B'fffCT>h42o>222 }JJ OWllllllC9ڌeΞ=Innu:ݖ-d@^pz"٬gΜaooomm=d`{{{A=VWϜ9m۶yӱcGJ%ˍA}vlӧuܩE;w )jj[Ngg㵝ԁN%G?CVG55E._Cb Z݂}'NOO#ٱ#\&~۷oڵXf͚W s=uļ%S% JeM;zwy6Ldn.=zn9"-?ZyKiM 533AgYf%%5jMUJ[ũriգKe gjt-Jn [-J^k4urNš+nNMM,2Oq@U?#sNt\$@C!027 5FC; p[%@"dRܴ<Ŷ_?Goq)Q1I:VՒh[RBf>cꎭD [}(f] Lf'֭sxbs2Qk^TR^y&,=?I|S; '7g7}.~}Vhx;w?mN]EgQ˖Vc]\zիWBAڶm;~|ݻw:cG^aӦ_ɓ c~~cAx TwネA\{ӧϩj{O𼢟b}\ s9@pٿmB`>ZVujnn^XXT*Νjj[[¢eMw'899-\̙3YYYG;zi#G4@ Ǯdqi]|Z7w)ֹ%#߿R\Z-BVVX߽R\~CUU۷۷o?`#3FٹsN|raa}k ?{(B-Ь&!CTUWt܃ַi*ZͭLOϰ|)tbԔ3x>D& 'xD"޾_z##.E8̛ =9VVVJR677O,_|cHHR27аY8=hBfRg}tttuu̙3 loo/?{o&)))zJ*ww<cccWWWR)qdno9үvNS.;upZG-Z|:K.kժUhg{5@e7o>`։'sm6q'9e^ <;u-T֤w'gĉJn۳+<#Ihh֬YIIz}ZSVqǫ\Zhjbkrb9řZm5[*v FQ'$)"!ZuMM ӡiu:1W#t:Fa< dnO^Qk4-@C^d2THnZ^Uxns'm+n3~ Lf,ݿ?"r|׮YL43 I2̸m~%g 񩝅>QK>VW̽jjN"dn^32;NyAtb!p,{}ϋyC 4hJʺi˗Ai_y\\ܚ5kj SLi>##C\_-Zܽ{aa_XYY jZ ݻww)VΞ=)Seq}oذAJe'Nׯ_ii_}B</&ꃘp@f& vNA*M㭷ZlIDATn}p𴘘sZXXveƌS׾}~3f_YY9s{hX_ ~o߾?xINN 999%%%mީ[޽+װGsTk׮o{y f܂ +''wIIWL"J927gBUQK X̤w@1 d}9...///*`JJJ޽ KwYUUUTTt6mЦM;; ߼yɓORٳgRSSwAq#YvAnnAh۶7mٳ'3fdddӦM9ƖZ[}9|7]|Cq`UlΕUӧO>}ۆrAAXlڴ VVV&;;GlY,^vmժ_~Iׯ YYYcoo'~og2ALMM 927g ⧰ζ}_ȕCBf߸Qw^_S' z^)ϛ7ٹСCUTT\~cСy7nڴ鴵H$q_cKKKRR--[6 m2Yf[ ҸqcwwC h4nz4LƿY!wuwwl׮]@@@aÆliէOâW^y{mfܪA j:###>>!>>ƍdяiݺ\.FId55-V .H{pY8yN>uҍ:hd$6qğ9)))//Z򳠠ownnc]]]JC[˖-+..]vMReeeIRNgp̘1ÆyK%B||¢EĚǏwqٲ&&& IҪU+Zx62225JeM;zwy6,ֹ%#6ŷg[-W'VWAOQ̌Vf͚_ר5U)nz:ʥU&/&)6_SVz@Rh^k4urNš+nNMM,2Oq@U><:VNs5Bj4Ɠ@5FC;`@ 4d-L&JeU@?7PҶBf>c|<\PdƂ G~?ٶvvvv|+?T*Ɍ]R^y&Nycg \}jąc:VmHUXZ%\O.oڢ&i;=?I|S; '7g7}.~}V s݌$οS^nܢ1 ^9"G޿! RnmڴDA0mtxAASZ?Nۺ}u<55u5 XZZ7W6i;:uZŦM8СC+?Avc8)S]v o 6йs'ooVZd iذW^Æy:uꫯI&&LUcc[n7III\3&ꃘp@f& vNA*M㭷Zn}p𴘘sZXXp豸 SI$WWݻt:q}.Zxܸsٔ)&M-Y򯠠QQQ/lQ>}BC?7~~JWWW ^QTbڵk۷^^ü[33Ց#G͛7cy>Joo.[㏗tG5je/8xڮ];$\*27't!ت%y,cfܻ{k`Lbun2|u0%%w^⢯rQ'[.??߰UtttAAVرӓoߑwС۷oꫵ7˫>y2M6bo>}7o\n} Gy3;;{-͚5{饗 Kl>%%511~pww+-,Zeff:u:1 !bl P_їϧ}7dȚVEVk\\5}ӧ*o߾-***BCC<{fg爅\AJѣ\]]6m*gRiؤP,TVVe++#b9??c---ǎo׮D"Q_ Y*QF~鶶W^p!ҥK\'27? ⧰ζ}_ȕCBf߸qE4R2KF3=z;.],33S}J#~ VSSc(YY^j +=Y999!!!E7Mj O'NԩSNoڴiϞ\$%@Ì楥NNNu.m~-{n@?j/ Z~n׮ѣGt:BhѢ# ''R,fйF~/Bݽ{O~~AMMMQ%^...1P\\bʃvڕS sxBvNZ}exx;YZZk. C (߻wobb矯ݻw= [wҥK$$og;::JRT?F.?>ܫWϖ-|}} ߆D޺ukkkk\.vB149rD6C#Ft¢KFF& !bl 'o9үqG/E3u(qEmQQ^^&N?'%%wWTTl۶]̾7ⴀ3իW_jӦMSL^n]uر㩩r5B1N}[ǀ͛WTTVVV^ sF-{m'>prs}'wIg7LOO/ю4/dnd|w  [>f3G|^{65=z>}`‹/ x"gggA6oӰɦM8СC+?3EyA޽x$$rDi/vN:WUWֹ{S͟ ,[p9sf^b >>>k֬3ORqFx+.[5=]|L{wq I\)(::://6mڈo~Ǐ߼ysݺR3xїW"dȚUQn{{)(( b,Ͻ |p^=[2225yK?YM~˩~?8})$vNޮO%GΝ;͟?_,+~~~w?dgٳwɒ%wIZjE+φC]H&U;<tܒn۳+Ղ z ѬY*%ҭTWG2ņs3jZT*UQQ![ z}FNIXSpɷEB打7h327?DtÉcFtZFx:Fhh%@"dRܴ<Ŷ_?Goq)Q1I:V>$yL>IT.Xŋ4%dnJe2K "τ)/y쌁\qLjuV1y?lѣvI _ry퇽6ILIbY89uju2===?Sߕz緁6g:Yw9vYѣvalI۶mǏ{Cvl}36ٳw֭v h׽{wssիr!~n^I q L+H_:,u{{SBr9qqqV *,,6_wzz˗֮ KL2lMLLnvM'NXb 9DREFF={o8p@XDӮ]6//e˖ӧO+..9t萸U߾}?p^qqqpp).\ sxҏ]:=Ҏn?~SҭsKFlUT_۷0vپ}X.**  ŽBqƊ[n5lwI=]v155k]&V˯uccc;v` DDD~faa sxjmyiGt &ƁUQ:-ZXVUU?gWKjMuu Z#ɤRNСÈ_~e1?_PP("OOρXXXrA [eg爅\AgKiyAOa 쿰  0zN;ɋ/8g츸 &zy [tD"yoV|5WW1c6mnq^^odߏ&ׂ@ Z?>ںWoƏ?dG#9:vRrylVfff ٹR77]_t)// jj[NA\ƑK'pv|*9EjSK.?YYY޽{k@dggWӧO72޽g+4/P(+!9Һu>[j_~-[8p`?++W^ 1?79? HRYƪޝlF '*mo϶[NHOV? ϫ[ ɢ<0?7Gu:Mݢ$e+Ah*Jt: FoS'oj@oFal 27gb@ 27@@ s sdn 2727@ sdndn 27@@ s sdn 2727@@ sdndn 2727@ s sdn 27@@ sdndn 2727@ s sdndn 27@@ s sdn 2727@x@@2IENDB`fastapi-0.110.3/docs/en/docs/img/python-types/image03.png000066400000000000000000001235701461403617600227770ustar00rootroot00000000000000PNG  IHDRksBITOtEXtSoftwareShutterc IDATxy@,H HP׊VT|ԪťS [ŶRI>Ѷ֭ԺPV Ȣ%2 FdwC=sMg3'''@ov֭RvJ^>ix^_K.B6ھxȀˑ( e>_~tM_nv=_R=*`䲑[> %uH|k9tI3V/_Ƞ[U|1#bw~5Sدsݶ1Vm; R}Ftٖ4nB[pJԩk/ƁB2+z, )?؉ y~EqY "%V:ٗq|!f R<)z{7?$vb4ByAYYY*$x.\ Mz?sN#  (2=W<$+mx0brgoY0RcӬ) (]^[݁F<_ h54Ҝإ{b%.Oa +@}4pDa@A9^>o[ .q-xʡ~o[)GFRB%y6N]8#g?L^ CCvw@I_Yf=2re ֲ[Yu#P+ɹYFE{Ojm [|*-`wD,mYϲ9?]bu޵+Jb -A8ퟵA篗x /;|6h3"z9ȝvU7F~=<{;pt 0[[bieҜ?Bas=JYGWޜDPffoFoZ[gp'ovTie(zӟ#: \ɦOFv΍KVRI_B7#r y\vwS=GK\fw}֯7&.#tgk>BOr%+K:Yꢚ"6NNM = af?|U"`bB+^F_;pTIwF< =Q9z0@͔-yW'Sl-+8gr_^¶L=Nm8o_wPEY_(SwgRO5 (m:3ǧ+\N}LizR4:OO=> v_뗍1HKҟѓ,:ai4 i.QLex~E-\ޗU: 26#<;o3F iҔk9VR]~M}`1jn-7yw=t5Y6LCQ:.)h~O"WUkPq5U~N ùK,,ؚ@ɮ>~_/X@*?%d?4~J//.Bq< 6dǎ7{VuBlm /rn>x,fi!ϛ P߯k(Ƽ9sXL;:&M^RWWvubZ3&K ^ɼB@Vs3>mX ykhZ@OX,:XV7%+xVYuu/r+N+6sҮ^?z4Q%յB;?`aN6c4tKZZӂNK:āp9'aɶx<61g{PT'fw )(/˫^w~~U6w˚(}CA֡!Q 夥^ޗr>iJKKji`sYl-xr^v5eBؼw>uxT&v](; 3R?Ba^۫TOT?6}o/<[/*g숀Y"\Z; \Uթ5H5jF4;&oX Y1Wճ㢀6$(-c@tXxCL=L蔥1d1[bޝx`k2/lΊպV},$!Q~,Ȑ}@^5@u,)^x 17_{II)nճEBS-<B?RevZ@!^8eٕm]Ӝ5td$JzM <,Ew*OvĜ$ Eyzli3JX3|NGXvػ[=8u *kjTVa)Oԫ&#-aH?PSÍk0giie.~\EiCS  ߥ$Wu"=^ʪ o%&W`k+hɘZZ4c?ޒ)!Av1P[ee¶%!bϧi`adTy`ˋHTl[ ELf%<4u!¼i+%j ϱ r@ږ6eO)2i"$.fHF9y=)!!ZۮUJ0*lJ@?{5kފ!&m̵/‘+}F#I.};TZz,\80. y2 0$3>h ?ga% L5Hmaߊ8a?1˲ǪHnrs聮 z[f{mVMpi~ yZ!3Ŏ\ @Vgx.G)'+=x|^-4yRLe`{$)xBіI Y`,vorS%izM7^(w6y^& Z4Z(ReJ0g=5' mۢcbBmyx<677o׮P(.--};TW,x"hdYW*=Mn'Y3Y֖e''gyѦXptYr] džDT9ʂ+/Γ3%;_M߆1l4  =vXi4Rfn55p?ógnZ2u(&%̞ך37E ;J.-Iڻu'/u<-1.V+C꒑}%6JDǤc9Pl}p,+@x.ty4qfnTx`dtA.DMG@{75ugM++dez\m{ЕWn߯RE#;mqfX+C_ɭ +$˧lIc%./Vۗ%qYfIk׮AbzDx`ALfx=؎^=&#lFt&K5=?뽇 *{p,yk#z]I3Ĭx@o<e˥ d?[_"`5=xoOG+(Ϳv[E VX4.lǒ Q}o;fbˏ}2<4x 2;9fMd|0b?޸Pz"lFkzܚ27؛n 3|H+45{oRA+P$1t˗  6,;)fWuZLY$V|RHhdLͷ<F*x}g1Qx;ϸXWp%E$CwʚNbcɃ܇gpIp5jYaJH itlOPD 9h( j/3BâVZIH!h YJaՙb h0f0bШeG.hZV xh2A ºqs/$ r0$-0$8Bi$C s(B"p@P|GЪlnjFazێ.zځF0t/[ḹMUǿZjnwEHBAҴ96(\5" V7\%ͷ yѯM7¼Ν;w9۷oӧ_~j^O =F8왱ȋ/g.‚"5s{YO̎ԑ3BC#fjRKY17.,to[/SK< MG0Y# &Bb;59٭r3]3$}gxǭqxPcBo([=_4X/%Ak x£B$-[I125eLphxrx%nZ4eՂ).QK’"fGPr{N # ZU,(YF"\IUN{1QrsD"x~2ZC#E"1D,*/-tk/qԲ\&8֤HlO.Rk@tA)M%EBBU(ޣI54R$׆-t A%-T@yP,ӊBixtq>W!͖\{T>xtan1]E$O#˕fE">*׀HlI@Ym7wx)=]=!8<*7ؤ$jo4\B:WI#[@%P! "!_FjߩcR奩vZYv~PVH bG])"9j2(lxeUS|!WV(O$ՆA,WkD?@ Xp1{Ɣ.2ͬY@~$&q̚=m!Sl H(A@=@{}׼ȁ :Ϩ)ys:ςlKyxLK~&f@)/|.)(N-„=(D|_7=\ʛ2frv&/[9$2fbhAƯsW10P2V6 PB_1T*pBB#ʌ4Ԟےϡ `P|UӨ}AdLؖ|F(Ls% ZjyB(-(d >a;n0<%I*TEOuV+-h>J"´Fj --erд2hACA5P*H,kwZ&Si "'j1Y񞡁R=kШd*R0\J!jȤpUK ua / `@(m/ B)5!tX,.@uJ`4ٙU dkbc^~|L|HZ #)̖@ jn3y}M4qdp%I.,h"=]3H,[S+_ă~CMC^QϏ0fp8@dsD4H.')* ;Z1:xo[d&.ˁd2[FX.}p24" '^$BAsH1Ж4P$2 6@j<֖hК |q @g` e 5'%$[xUSNɰ&!=>eg%YR'Bajʴ1|nP3.M?Qpx,Z/{Eap Zn*X2i2Լ*(ƽSPi55RQXЛyl_ԩSMܼysʕu+ j7˸q=ZQQڲ- yNkYQW'1N6#W77 ǁ2&@ÑZ5\RȡU؂*U!6 @ڵ{PUXB2kZ.z\!ICBX%B+ڷoe)߱!_*eEXO뉣>oo=r>k~<S쵩uR]V\lBAs"zÉl㙙-˳,A!y=2A@!^! 99^3bv#Q B!ޯ@0# Y/JNM*6'|3Ϧ,vN6Ur,--ӿk4.a04i҇NkRLA?{8t}gD绺JrrrnLB!*޽Gݻwk4>|x~~^j- nR]s*1Nh>]c)*++- ٳ;v_͛޽څw޽{nucggWUU={v7|?šJegiyzXݻX[DEOHHhюZ;Z}Σ>t =U7Mev(ʸƉ>>>C DzF𰵵4iݻ ҽ{7[[+guGQ?ާx>&kxϹ idE^. Z}z?4 7o޼D;vܲes^^޹s璒zVȩ?L6k2 NRTuϚ5k/L9sر EK~`z9Z[ 4U~senZG¾}bB۽{\.={vr{0,W zɛ{܊k6rFWȒˍUPP@QエTi0<]YY୷EE5w<_r úuQu/ÓL '֨<}X֨qf=Za;DgA!V}},_QQL[]]eTWW&X@?@F.(+=zF>/q}G~;humF{vL"c a` ?'䄄N~Pj޲eK[o͜9{/^ܱcgml*L` urџ19C ޅv 0DN%od6N]ftr3P.M4?y[!SC aYcǎ}a^zݻp,--ΎĘ |<{ /v=-kqz}śSG>Sd.NN<}:sѢ'TgرWNܰaÆ f͚egG\]sNb}WW??'(hv`7FD">e P'˥W\Kg,L@/ l=ǹ, U ^,ɻ9ŷZ: kZwww쫉1|pc;vIoߎyB/YG[f :*T*JǍ׮];{ %PlAEFTQis\QW|xV3_ 2M6Jҝ;w2xWlmm@T+1Tw.(*Y, 9F}{;`PTXP#THNay~B/MUUu̅5S'9ZoxλpHuuSeKc&GYfmpp֭'&"C/'gԭwUI7y +ԉb{{?5hiW*dN{Յ]?Yn UL;KWVlff}cݮX|^gXXP#RSoՎ]>>Oj1N1I?dSu:ܹc=#])j\pQ碢/|4h̯EPs2tq${'6C^k5rCe}굈zg=x:t`0iT]EgеSw>dA[ᩯrq J8tmkZѕ>y8JU* = WթooUd-bhWm#Ѳ~:t(//^g0-yzFaSrss}?é!ל*i^Uu^:/U|;Iu^jaHGL+Vh˦c>"Ba^];OK{k L}).ӦMsu?aKK""Vt~?k߱c{\\\^bq~~5ke2qĉFѮ]DfO>w3M6r?H$ 7 ,k^|eΝX!ݰ r%97k.kS;{8Ln#+:99e3g:vqbxcݾ} >}FEEԩS===Ǐe˯K.ssl,n<{!BW uuoh>⦅8qbwj׮݄ jc?!$dQ>o$٧O۷obxڴEDGG$BB/MUUu̅5S'9uh9# DzR>o?wyԩz~Ir}wϟ/--~iӦ/%%SRt:6xq'RRRܹs Yt2|z!z999az{Atho5mw쥟 ./4DŽw;$-OC gg1z-ݙa|BϛuYUZ&K~@)QV\ۮ}Y{˙{\aj|ۍzտ " J޹P V\۔ܳnѴt'B!+BM0hp"uwB> !BW ZZBzpYB!!/^* \:uAb B Lfd-;0,3B=PrС6'Y<o, ZZZΛ7׸bNkŋN;wCa^P[(8H| '`:0,]EDm<<<,n`T_.YgV35*?ܹs+0p,_Pm^& ]ʨ~*JF \<|̘1VVZ*77֜;wn} BVtBa^zڵ3;*960+Oۜ>nO;m4WWƏLOOꫯ`֬Y(..;w^;vld#͛7u4{o $I+W0x… '䄄b!$Lf0|||veTm۶\jߞ[;](~mıcv+,,l޼ -??4}pufXUiiiuիufo޼vvv׼xܹ߽u+5!!ݿK!+B/MBsKoSQ%ƉmGXk6Seee={0Nܲe˖-[|}}5gBpO7m|KK>xt"Br/2k֬=vx| zr1BaYF޶m;{yyN#G VKjZE}ƇzJZzE Ek! ~uu˗r;wj7BQ:ǖ%m({Aa^zqMe`WO?prvo.6H+݇ZDE( .\HjޅB!tRT(@5_|ɤ7pĈG>##7۱cG77={j~sO>QQQ7n9r$:zl߾cbɂaV(X!+j4u+٧1!lY*((0&OC*fdd[̳gϩT*,EQG;q"><|ٜ9AuVWW7b#hv~E^ֶXjU$ڛ FQ7n,..6_yz3nܸ?Ba^P[J]ۛ|#4R1`0,[޵k IDAT=zE-2B͛&Lx2r %$O23)h6[Zҥ6W*Ubƌ嗍.]z/\Hx+ȨhB Eq8gкN!55555;t* Fڵ7nP);;# 'N ^޽;lrRpuRʪ _o?aK8D?d:SNj Z-A0322]@$q\KK۷@vvv@@Ҵ,33!yBmEG[:Ab`VVր:u¢;wѣ{rUZ=p@NWXXT;~:Mu."鬬ڷoT*bL`fM۶m_ 8,,LT目^gVVV֞={G$$K|4;44D>g0233Zm>o>jշGzzFC~,'LoccSYYw^8vxN͛vލyBȔF-''D˼q}sX}?&yEW_+ǖ}q<(qfI y-kF238kL_ku^5iD?,-8,Bu8;o7c eٲp`ٛ6E/IIIXFۍ32yAtho5mw쥟@}Ǥ=&?&lyNhٳ#F:'4t1F7$ QQ뢢'%%~ܻw>O#o@a^a?(^jAR+]ۚVteDwRU(~8郊2A1 ,>z)hxnΝǤ!yBoXnQ]kKY_rk+mJshZ,ܹw߭i:##?vclz>hzB/B~L0h^ҾOB=o7j)_PQkzB!^=0!B!+B!B/B0# Y>CHiʕ+[V/rٲَ_|eϞ=.\hǜP4~Xϟ;t>e޽[DD'.өSO>ձcGZ}ر={VWWz%׬Y+ɰ"_kWޯ@%KH;snvIZ}*8>ktݦprr\,g{`+W~;zXrv嶟5k֜9A?3?Ͽ幻w5 O'>hɓ?cDZXݻ0aÆ 6̚5Ύ\;YƎקK,y<|E9;WT*@|x|B%郴jjjuuuVTTN2E):;;W0PrYqO#BrkPq=HUUm۶fg\sϞ?f0S&huwwK@\x==}6- B||<>V{ܕ@ G)߄DoCh]S[[Jl 30#ypɒ&&Ɩ.G1LN__eVd-Jgd2ttt(ʿ$iiOy<^@ /P%]~ٕI>j{ٮ~RGO%&>ؾ}׮]C1'N~7rr6}}}+L <x={v#rsvڅyرcݣ$gv=#Fs^t)>*۳g>pnܸ! xC@@$)ҦyYgDd=fI.7<ZN+|@" 7=[r8bBh=|h0`pvvRV|<~ cUTTLJJ< >tl!xe̼Cf.+b6n#|&T_LVQQ\f͚++++[VfffS!N+++lx_vtt9|c_YZZzO2@@{ 1 W8Ä}$z nĶ6&w/))R۶m[|yTGGGǜ񚺺:|y:tw<x/FT\\a'[),,c DOM|TU222_ARnjfj "c?<1=… \\fEGTWW :TKKǠ=+!7x 'x\Aƌّp?c9s!T[[voĉ!mm툈 6Unn$-[hkk <֭qqqR #sQTTd0_˓ʪ>QݻwO8T}es%СC"## &BHNNk֬YJJ۷P(wٙDb``ĉ嫫kBCCI$=D:sLgg'BHMMm͚MMRpr+B...pRǫx;v+WaH 'O8qګWN8=zҥJJJl6̙RSVV 0aKH J˖-]l)Bhm.QYbN+W/^/ϝ={.99!8|^XXH7o̙3Tjfffddd{;!$UGY[[KR3`a1z庺/^cHCKKuh;wzLLLtuuY\.Ν;Z[ߧ=,00>-- O-&rK8pPN`0,,FGE1bĢE FmjMJ>_100K2A}}ݻBNS+[[s,X07D"??_gg蘚55U>/ XAA W\>}]DojjjMq6N°@%NE~ȑ#D"iΜR9!ɦEEEyvvv98q7ц0 >|tǏ͞=… !@0_XK1cLLL֮] +W"[dZZGIOHHHxkշkT$277+--pBgϞUPPpuu_G:~1kkkd \bECСxÈxж#EEEx^obWdʔɣF,..Ƌ=#MC}T`qcD1̋JVL{(ÄB]G!!'OJJJK544OnnnnrB# /\8{[<(6lJ;;;//O--NLzzzjd2Y|wtX+*as;zĮ.}}}"S|DPtuuF7YYYvvv/nf6BC^#M=~c5kծ\K1׮aiix{{MҲ"=Pvk׺nMNN޽^.yT^xŋizzzz?7v(;;;$$JZZZ^ ,--G60@ Ļ199z҅ >}o߾g޸qSX!,lgYY?aغuެ+\P( F=ǯ#"|G 5̝,;KȿX:?T&:TSQQQQQ盛`0jjj LQTT8jjjG}EIlB_7sR'`bfaa!9六QRR2s+B7nLNN@D33O䫪說ZZZuuu! P؟? v(//0//κܼ &] P(_GMMM55+OWM2L&0RW>ݻgɜ9snܸ)Ui!{q8mW`@\NN`e%^?LٴdƝd511NM}2oF+..B+V,744>҂͛vvv***^:vx\o.\!'"BK,]ڳgov횝mppw}]UUmָmml6ϟ??))IKKݻӦM[xEo|j49xxUd2Y, !!dÇ۹_lZ]]=55zʔ/_lkkSWWwnccM&F]]pݻ#/Oӫ ܼ/_n۶566%&>Y"2C X,VGGa7񡡡%%NNSi4͛Sy[l4hҥo'IPPɨ!ȓ'I&BgΜIHHrJ[\.w߾ծ ;;;]狷o' 222+ #o96oo\٣߼ys۷oKHHxO3+ބH$q/T=hkksssCH${+ӧ54h*C|v^gUt WbC sW.~_zzz;wuttcܰa}IIGdm;ׯ_f<66666_!~ժAoEE޽oꊋl$"""lmMII=wy9>鑑 .555QBeeeqqqgϦP(iiO% \%$$GE]\fq8GwQQQOO<;}ʕ[d2@zxx 4ڵkY]YY1::!$vŊ ٳ|3MIIIJJ-RƎ7nLf2+222:db//m۶ؙJH$>Ν>Zp\ni455Bauu} ޶,5%N %99>- ~wbJK_B\pR(윓'OJ6577n  0SRR<%Kc?`R]vD|wuֆ677WWWC\aJ3+o#GmARP4eKj٭gyFr/d3~QWWԶ..޷sxGGG! G# q!}PCx+TUUN]}v1+xBnbiCgO}qhV_MH۷o:/^>$쫭-+ LFTD+4!t+ٕ_ ٔgiiyЯ#F$PEjVFFfXطP PUUu͝;jkk#j$_oFK@?;a 5{Hzs5jq455+++ş:99O0A__ٳgc^|iiiallB#9;v,FP(=N2 j{ٮ~R`Flg۾>b)?#J'P(1׮]EmݺM8B"4H6Z>>#j{B'L].,o(y#pA a>D&hmo{rA'+~Z;s0w.c]{P̙3ui^ IDATmmƍg^GɒWaSVV;ɒ W)+# Gu'D"&=͞ ///GG)//7U޿A___OO]R]] +Xtx 1hroE{bkb2Æ C477AEE6lH,..+H$Hd>ٳAj%NNNNvAAAǏkii"֮]vxP񰰝eee? a֭{ \re!{G6ٴi<==N8Inj\| î^qxMccl%xB$z+תT2ix<0#廨6~I `1sJFSϿyӷn w@ չ~!dO!t̙|߹ꫯ&O`0דK^r9??Lʿ(ފOK6ndee%ٶMGG͛7(Wzzq_^gUt Wjujܹ3cK| KJJ>B&>A??~;QUUenn?狍WHKK{lrU^.%b"(%%5//!tٲeIII)fϞMPҞ'{LMMW^ccc% ٽEG;6)))*4qwwWVVnllsTTT{;sN>reph2p222B jnnvZffB v xP޿ҥvD---;BBB|~BBB~~s׭[\]]˭[n ǯߺu[O@mmmLv]]݀/_;IrogJ -vqp=zϸx+]?nԌaB=TK.s877Wp -AOOJwmȑtTO^cʓ&L2uI-]l9HV_cw/꒞eV@@TؘUWX}Ϟo^vܹs/Gdn,C >')֮V5JUUuܸqOd2֖JH399@iӦYZZ݃|栽[tɯ>7gW&%>PaaeIYBoa/&&VrnL yf{DPbc; >;֭aUUUm:slqq1\M3A>8B"4H6Z>>#j{B'L].,o(yΝ`wXgv|P +D&hmo{j7q,ڙ{Z;тa(&>zzz.\3?~xUUջwᄏC8;;)+?|B-ʘy%\VmF*d8;;YZZhjj}N4j;Ͷ>j^aB >(0@ P}$'\2G7.|tDOMrrr^^^fRRRfϜ9RVV޽55율(fjccc~KKuh;w!rwB($dcHF˛[V]x1''!檩I"N|Q``ĉ嫫kBCC%̙Ӄ z;es45((W  \\\<==B^^^C-++d0H7o̙3Tjfffddd{;w544v؉?|PPP0B9r8---&&D"y{{;8ؓH̬3gtvvd }9  yyy! ˗/mooxRRRBǂ 5~~1555jj|>!$ cbb RUU lhhr劢ٳ^z%//?}LkkQJKKUTT]PPb5G?w|^^.BO?޽{KvvvWill3R$B#0ӧEDڪ&T ZZZE ߲e3~w.2ljjZTT277F;wf7o޸1I}|899_xx{/oCC>#9!4b)RTT-,,Dgs)  YrTlaXEEEtz%/pvv 6mڔyJIIf#z+X G HD"Ij+}STTtqq?Qr@ x~jkkkcc}~bwwwJC@76673gNyysBvv_|1!!BjǓhlPI1̌LٳgV]]]zꕵآ""he5c _~Q*"}oղRPPpuuN?~uA3*jddTVVfa1i733KM}bnn_(SVV5k?*((@ 2ԩ(_x/TVV:88 >BYYD (88yQɊi/aP(BGGcrpʆ[į[Hɓ'#;){Ȉ | F& @ lM!tX+*as }}}??_n*20/** *9?>.,))ر7oJLLmxi4Z]]]ʲ|w3Q @ yxc\!UzL&n444a0cXYXX;:: ,-- |)H +@"(JcyyyjiiuttQP(~ƚ5n޼,W"D"񈢅ˊOhf:TSaB][[ᩭc ÒZ[[nذ~ѢŒ+_7lᲳ5as&''ꭓDPPP---ZZ=LK v/[r+ sss8.+{k9;;yyynp8䜏"tooo---[[ܼ.aիW?N立.C;:++ ðw,QQ;6!!?SО={$O:2iSH\\ӧ 3… O>p߷oٳgoܸς @(i(*00wh6/!b#|90ǖ7\ >g F-a())TWWc\A QUU=p EiTɻ[%%%555vv}a#:;;oܸy N\Npp4iRTi[ss˄ t۷.coo\PiiiSSB~~~%%%!s=__yy ^5dȐϟq X]]M"ϟ;!D[ii x[\.w߾EW޷Wٮ*g/k6~])&M4s̽{2uÆi^jݺ~sO||A!,[޽{d?I?ˡCϟf͚` (if*wd$BhEZZaavvvHTTT{;szKy+CCd!F$`R]vDY~Ck!!!|>?!!!??ܹ֭ mnn~֭ۂ7nWUoݺ-;$CWWcРA׮]s-W__dsTh,c"!!5<<…|>ϗBdg|Hww 4yK,0իWǎG544Xx?.>O===(޵#G9RP4eKj٭gyFr/d3~QWW䆞o oع3 D:gΜ`S||k#ذaCw7q[lRvڅBI~3 |xF<̧ IDAT/==3Ǐ!}}}|AOOf+:B}.E HYRWW'LςNQ?mnn~޹sg„ p+20#yRN:l0mm/TUU%jɒ&&Ɩ.oiieXӦ9:tРA[]L&RT͛/_066VQ7;diS5kǍnlllaa Atw.?gʤgR* 5̽lW?)K}?Tggg``a41;?vxH$:vʕfϞMIc}}}==={FB 3&&&88F" ~R{MOO ?1b@ X`a%{NNN.e˖sK.A2 "Af^Pc:YΟdr9`yC!ϓ}n|}ۡx`>(>o7HagYV~GB9-&b-Dw|P%=_C s'f/12xO|tzxx\w}TO^M *$Ld3ag|o ŋ9::}Occc};ÂԴm1c,ׯ_/oو/O2eYYY9;;{xYVrYf9;;l?" mlGEP}}=T$0< >Wٮ*g/k6~])&M4s̽{2uÆiWXϿHnSUUbŊࠃ T|DUUa))6_hTUUׯԩ,6f%BT[[[YYY LLKK_ {xxXoݺUrW}d!z/]gdqr*RWgM6szƾԲ[)Ζo^(ŻΚ---EEݍ9Jttxƍ+WTNN.&& !TUUDbFFFsssccWB555\##gϞZRk׮q$''#ܹ> q/Ç+))!BTxUIIѣGJKK=z*LLy<~eeNIɛwa0Ӧ `>(V.+iBV> P]]ݪUϝ;WXe˖m윕+Wyxxٳ@ x~ð;W[[r~EEEЋ&&&VVV7o޲mll^WW"7X0 </==3Ǐ#H~>|x?"$,ZĆnUSS322D3ɓ'&W(RcaG$;::N:uذa_~9J422ѡP(xTd2I$ȑ#B..:&LR[#Fxyy999ZBŋC +**g̘E:AfxF-Wɛ+K}20],A$ImaXii$?}رcݣO`0N87l^O fLLLpp06NvvvZZZΝ;BTWݻ__]]]YIDK,ػwψ#k׮".] C>: އ_H$ RM5ַψ'r$Si |B"(C x *^$ ^6FB^ww7  1 W8Ä>  <gqC~P D$(ܮV_ W0" < cY6ݾ}G[[رpxC@@$)ҦyYgD@mYd9崃 |>!stIOO@o |@" 7=[r8bBh=|h0 [l!xe̼N*i=~q[(uwwCxz%}$)D"Ä}b^!xqC~P D$(ܮV_+oQ3pp0^&<(0P(WH"xDeŧG4qYmCfK*˩L0PCqh+񈢢_C s'f/12xN(.@\聜!>J,"*p EQ~iɤ;ImH {w_Uy(zxe$d DBWN2hk8z*WjzI(V "$@X ξvo~Di}^{֎?k=?Swꫯ?׍75 trˤ!C пUV+W|g*** ns=7͝7o^{螓ZQQrӦ Zn}~;g4nx/8{ٲGQjjjMMmqG./iӦ[n1㹵ky2 =ksTGS2.ycMѻw.7Miζm4o"6m4j( ;A8k [lILl8zcL25Nrr˗]wݏ:vx}xAvwʫ=xBB…^Yqƛ6~ݻw8q֭n7 GⲲs2dOL߶m[Ϟ=㎟沲2gtߴ䃭+t|ڪ%gKk{3 ٟ|HVI/(X_WWgϞm***֬Y3~ v_`֬Y;wq<|/w]]]QQQ~~^aÆ3gFV۰aCB ԭ[HW$%%H0l߾)?V `{ݧ_zegt𕩪|s휕ŋ/~륏]4UV~˖-K5k֬_~ҷBP8ްaCǎeee}޼ysv"se ޽{#˥;tYNNN^p'=!!a͚5D͛wM?ׯoQQo/۶m[M49& ۸a]Hi+/R\*_ӎ]ve0as_BJJr~@P@Ş=[cYWAA_8g7}|p(T0Tm(]Xe od[EjkuP)A |}>_A~<55U5{tiJvt[&%pR 5 WT$5Uuj8JEqv24!uKF%~xޟ,^s}dsA0o+1ErANSS&|#;Gފi_pk&ɓ/z]>>']Rs7l-=j3zozyo;p¤v}e+z_Ybڦ>q^ K7EB[~7^@WB?{7ͩMeXxs'=q}jլY~?,+Ac{eA_5O_ω,?`E%;rw/!>nKnؘ 7=85@Wh9òum`jR=>\}{lxʒ'y#7m?rvӃ xޟ98you}ss/ oԛzk.kGH(+cp`<:oaM[a{O^iy6냍[KJx唶I]RNwc~xUoxo=:Kgth*mm|N^*sߙ3kϝ sr^uPT]SA\lzHlL1VU7;rdÖ҄i.|t|&e|TO){Yg& >s]{b:3AQƭLҮyq1Al.-y{wԮeguW%uPpTc_6uTɫ6/zsMQ7T&e ;aنp1/4Y]$Xg ppQqbZT޶_1Yb꒥7egtCgtnt ?/\{ 8eWt˰)]|QQ@W*G|~Z*WI"*666&&FAAtŊ⬔~ Mk rCړ.neb>} Xhѣ_-Zؿ1~cb6`94m[R^9:tb{TTT]]'بQٳ_Xr}˗Ϟ=M6pxŊGOӦM}@+?%-+z_Ybڦ>q^ ̂:p8{oeGEĦ?,wԹFxWjѢSO=Y~Fꊊ g~aʔ)ڵkUUգ~ժUC 0VjkkW\DlAAq9111ƍڼy}-\۴i]׵kC;3f<| Ynΰ]{<2qqϫWmݻw_~59sƤI7nuF9s)S&%%A8k [lILl8zcL25r֭_?&##{Yb֭[ 1⇭[:tcCB|׮mNp},Xp_Z?i䄄1c暫OҫtoZ֕} iooxmU3xU/ͥK.[<ȬYgΝ;nkjj^zP(vݻwE")Uqqqd eeeO<1=\VVow`<O=T8`̙wuדOG@W_@Umk,^|A[/}yοKo訑+۷oi{BC5jY~7&N~֬Y;xA.JJJ`_?99m۶/w`ӦMU2T3gJ7u#l޼ߖwΞo**;;cǎѣGg̘sᑷIDATW]5jԇ׮]{ѣGw3w5?o:߷ H555A}SRR"Jos>K)Sg}S?rsNFnnᒒ't/IM6UUUw~ 6\tt:u 99yAgrrr:묤]fn\rG}5==ӚFja"_ӧO]~/^zҤ[8voo"A SW~~Q}&ڼ5yGP14eMӧOk 4&&c[iǎO<1}„ Qw~Wju]۲ew}Oӑs//KHHbŊE=7xm۶᪪{k_DGGo߾}E^MաCGn:u:_ 2Gr߼O|/\y^g ~~uUAd\XX8AhZhbjTf۾pNĤ.m+WR[[IiӦ{qA Tm(]Xe od[EjkuPgq>gt+t+] ] @W@Wt+t+] ] @W@Wt+t+] ] @W@Wt+t+] ] @W@Wt+t+] ] @W@Wt+t+] ] @W@Wt+t+] ] @W@Wt+t+] ] @W@Wt+]+] @W @Wtt+]+] @W @Wtt+]+] @W @Wtt+]+] @W @Wtt+]+] @W @Wtt+]+] @W @Wtt+]+] @W @Wt* " IENDB`fastapi-0.110.3/docs/en/docs/img/python-types/image04.png000066400000000000000000000442541461403617600230010ustar00rootroot00000000000000PNG  IHDR{GsBITOtEXtSoftwareShutterc IDATx{@Su8B2@蠘biX&dS e+瑧aI[ 5/^H.lq†pcޯg;{>}wemmM ":[>x%"< 0n x<Qs4nm&~=Vr=Vu]6AXc?ҺZ_Q?b1_n/v- O[2\Wph碽TrTNY 7\mpls~t]QnycA0_g͚5b˗?eP}%zFDϳj.C,duyeK Rߩzg 8ek6\\\K/jxstꯗ__z|V:T̉u`]؆~ij@DDwN'7kՈIv{*{ko 1ڐҏ.42r>yԛDTutuVM 3SHyޜ@/[ksC6SU)t5t!o;Ch=u޶9to9g%s`n,ͻ3j1Ic35(䭃/t Qb7vE4&"jČ֡.hv/0"<$jvPG]ikLSSи̊:DDdj9s<ScM+',.KJ\IYߏ>}l]6:LgiH׋V7TNb DD7 7Vy+_o^5A^}EuPo ?rHYYYoW`D݌'=8mg nEK nlY-5F>DDi詩?*fjK]=5u] 9g\8Ɇn<'*b(shy_.Ğ1KD_DL"h I+&MZEn97(jay{즄Ub̭OƓ"#Fp[Vx2m*09vsr{"nYhTiyvAOg\ylQ)'Z֑5tŮO1Kv5i:rGnisV3$lS_. ٛn>%2lȽRX]Q&v>_VJzVW5vʦ~~~-+RMWfgs:;9~fDDΑ;OF>0d0/m0-lGll'W=yXZu/Ttunicte ӌ|s鵚=}uE^>0dWԗXFzWlYBt۞Z&v1vy[#:VYwDlP7Fū,}5CzH*5\ʓn.Kܭ`*?Y,ݷ]&"tmݽe'"iCQsMO&**e 3)$lԳYn=}I"%v-M7Ƚ"\t^/*UwJTD`՞f"D.]۶WvcBEQ)SqŢ*ccsvF#n{EWd+ ch;cDg"W^Ⱦ-IvsPݞ Uզ5WIXv@5~+:SxVZy|"$ڶ80[;]"2z_uC2Yv¶1v?۲삽^цGn7:԰}m2kg|w*MƖ^=K>;zE,>ǚg(^i ,QǦ\c"YjʪZJaȱ3Cu64P3W P1 52 H&YmzIm_4!`b #O)^6=y\U%)*b:ԑkkN[V*+R-mmԤv(06 j7U M@~"ZJ?hhP4SH CCkg۟=kWWm7:jY̱4Pq3_y-근FiTMi#?}m#tmiy*`nk~cw-{-+m |yإUa6R_jv[~ cyfT-MJE-h} w}uϕ{|9.U޶?=q#{bCD2%WzG+2+s5vΖ/1 hJ ֊]OvVǎ*9]TE!._hZ>'bF[BV6h9&3yg:`2s?Kf4X.sv}%r]^{d5yiԐW_o~ѳ'A3)tj 鯖LAU_$#sq2ea€7ؼTږ:ߺz!;v8u Ql;E2%`nTUX:uŒ"z٧%33&0(ek{rQ)̍!2YηЎ>WD|[Fu̙o+h0͆[+[z1c|AYZ T`}*9(=[sBptttlll7 *TL~8e5y~h'Y{ͷ] ⚴NN-8;j&SvTU{C",Y83j!)-o7?Dv4q9۾akp Gm3Xy(J zEl%>".1 EiYvcO2Pd H\X y4oHyk")*h{؏VBB\bZd%KlnLwJVdf.Zw`OɏAQz3[Xqɪ?O7R4=uWÙ;61YүҡoX~en ΰ9"\ ?7'd3ꫤy{hKyo$'d㒙 7PQl/n\fHUҼ3J{8?D?짘Dtmwg]\Gu?lz)'ŝ+;U{c˖-3fLۿMMM~~~uBd{پѦ) w0{0_\3>. -oLaqcŏm|+OwNd䕍 x_x6lذaÆ磍ƺU.|©ܼ]WTPBEQBCз&M|"߫Ʉ#LʎG|/;SZ`0nh;iΦY"Õyp^c}Re1rmz,YblVU]mXVLDz!=g?% 4ڥg?U/+_<9!|_i?'frz3'"xȩ͑td-[J bBxJA [ [ [C ]\\ w+WD"5 [wNIIQ*666* ݓ-llll Ϸ'1ߚfףK,ڵkhk@9ss1cƜ>3'Nu}|SSӞ={Q'<^~͛gΜill|rZLL 0D /:99X;vdg_'"oiӦM[tz ׯ;q"_%~nn\.7/OqJ"ꨎDvAjkk;߶o ̷_(;g}dmꁴ_tuu3F[[;;ԏ}}9p-3qℹs߿4. ._cG쫯N۷or۶mkllTꫯN>5H$;w~Ŋ0a 6lHKc̙'N077WT/}w ϝ;5EGGСC{Uorɒnʿz5Zt\&&[n䓕m?lR}QQQԱ?~ܹsjkk/_Nۼys;=-00%$駟z%lI&i?~SiB ,ZhР"xݺuo611پ}_ ԟqu%zA/9r;_xQ[[Ν;=~y7| "rՑCKX֭. jhhtwwO5577}QQQȨ ..^xԨQD4dsԫ{/EFFDWy\\\V'?τ ?NDo5|ժs玭F>L'+?`Yp?_Iuuu?䓴 6/8uTllܹJɉ6mfӦo-z_ןscc_|Tֽڬ?_MMMG}}Ƙ uY ;;ʕqƭXbٲJJJ:;;//||f M2g~+J r'|-z~Ctt4!"?\PPp}wQPPPttw6 2?KM JCr~Ҏ*##cuRuuu]~CZǎZxٲe۷o|r~F#չ#G&M[on`tǎϷׯH$oy]ږ/_<77g,I[[*++_{m6V[{h "LR1;O'ۋVCٯ9sRT*Uii)44Է-߽{ݻ,?hРVyhgΜ9sѣ?`[oijyyyǏû)@/fkCCqƙڬׯUvڭ[7o֚VUU%''Oǻm8۷ݻ7nLKcʔ)*U{|E;uxb4|'Dgux<m 2uW qFlJJJ'ZZZ7600lٺkO7nzzNNIIQl߾]i^^S^zp"Ǐ6y^}/0 0G9%w;vĪ=:v옱c۷mΝSWAݤDkmqDhhA_rEß,))nQBD:{J_=/x7nܴ0?}72M>777o¢:ۗ円=쾘gNo񆵵:3'򦦦b``nLJ6|^PP(Z˅ =Ξ=VCI D✜ץg;w'K,[Ln>}LJ9d6~ kχ'.[ƍ,j"ss D^zUyhBRlbNOOoL`y~э7JJJǏWQQys+"?xUmNpA% cذC[*b:DDwHGu"v]]7f644߽{QISJT0qCvuYǎZiO/O=kϲelcqqq'7|ST:+u91o֤ή}}__re'ݠzЋTMA=pR{Խ>}|>-//[ΝoLLLڮmmmSZ*rR(s"ѩUt\.?uttt#GG^T*Z_Ʀ<%%m;6p@NMr!]]݇^B]&g%%%mQץ VG늊ƚ\8p֞={ 'OoVqbbo/޸qculhh׼;֭_GRuZpڮiK_5tҡCݹsdW:w͘M/\,:zmj}<`.w,:zmp-N?:vuuw}|fJ$5k4~wNlMwW9~9s49f.CWYY{ .-[Θ1CGG|Kz۷En7WlW}M7ntwy ##Mgcccnn%M&{s܃O<;vR͚X6:99BD3cB'.&2r9? ~)n e MP_'ТE|ױ׮]sδ4|? . f~5>TSSs@@@|}v`CCC/)|>nU&M[(677{Aۿʤs6>}JJJ:+wȐ!:::/Z?=ЭRܼy&s\B=6x0)xЍ7OFss35}zeNkkksss322{) gWƭ%o/h;O^-_z:@@~Լ?[nkF_@^߳EWW1co߾L}װaVO#*++?deUUEEr 9tЮ]?ĉΝۿҸ/\Ŋ0a 6lHKlXd1/P*^{mXϦ_,Z`͛ %nlll[ȑKY,kk" \I7n܊+-mhz[ p8 ,xjoii9nصk޼W\\eV>ok+@}޽ͼKkjj*+\BD^^S^zpbqqq|||QQɓwܹ;wD"?IN8_~Ommllo~!ǻqfۿ eAAEuלJeUUS}i7ߜѽMMM Νhiiݽ{H__g[;q℣sεJJJB'9!#Fu311ϟtiAyy+*gqfL&_.\XVV oBotZZZڍG)..~tk77c…Oط>,##7+ǏoxP(|饗w٣ў<{kG7,XQ|[?|+nz'@FNĿ;e@^RRs/fGse÷~0~6 z(y./Z[L8q 9B?o2-&,2hefd9I[uX4KKR҄m?p_} |QUbր\ꤾ$>xq~OD[6rkZ&#l="V$ŞB.#IKHayE#-OG?AR)8]he@UJ% [wZ.>|Nn5aAQr3gW%)a匙K@hhd,`k.LJxDVpT,ٚaX/)k"|1Qb%- 4< ]{'Qx ,*!838WNDgWy%8+)½̬Js`sݼ;b?lqwliҖ,8. JS}YkK!sٔE `'DF9NeA1Y {DBU'"Mغ$Gl ,p;SʲmUrmMfA!^?-3z?[XX6QgZyY׈e;>nj7%7ͱ~Mƌ]6y MNFCF.C~=VEc޸~]>gotLޜ;K~)4=i*jVVؼ:^TT+EW6+OJlЈ0UIrbG,nLc~VlIk 툌Isދ#B#"] [wh:::iiin&Qb248Q@IYD{`mk0-;wfVrsb9KK( w,'6 6UID1=vx{ bvU9YbP@gŎފ#bψ?Bk$R|#.u:,'=vRl,[(?#U"z-S YsҸgˈbwM'3G>.\ +߈OG>/pt rtV2'KbI榈<ݸLMBL&c x\+M""Y=Ҥ{@+w wGLwh8N vter#w;W7~F}xIVʪM>P(tLFp5p줾O!QI2`CD, O;RS¹y<{SIBYRBG x<X4>ޑ}2nmooW^^~ݗ^z$99k:eRL0< :ΏQ*)I".Q*Bj@U28-AylnNLޱֻ%::E%zQF#-1K#Q886!ku+2Ů&ΛQ2'e [5V[IZBRлeFّp ؀2INfbc';ܡ*5jnjU5pl{u;Qcc/45)p~lvV^+D<|+ڃƸ~i!L@)8˝:#[]ào峈.O^uߺ 9c9fa;I,ٟtY8GnXtOzqvM8- 0&EL+i<F8rH"|rQQc/%%%.o>Y\rºߜcȏXUd q|4=] uR X<@×ee$ܚ` ltܽ>~1}b; h)d┘bJϷ^d$~COX^GyglNύ)>ץ [? DThl"WAzqdnɥ8kCYLJhl77x!RRs=b|+r4{"d~CM玹lNڹx^:VBFߞ2&"2r{h /{/t]7J;bWJ$,#Ivvo?kcF$jl'7ᚰ(OdbD.[%!K*c8NTD2)YQdkB#a>2Q&DD\&tilGW>e(B˦{L+'sMIIrHfE9*X!  HI鰎|pwVRwp\6DikI19rohpbYPL5t_̷~~~oƨQy'vWۜUѤ#Ju1#ݘUP[Q 9}m;L]&?.WkRjUTrFTHh%Qb2Ig$pHYbi47)6Ql tQA4-M)3iNT\|}rb#cSseҬ1VnKUd6M@DB!gJzzJC1 ibinR [ bnݑ*.n=۶C qk͒Isb8N =JsѾ}ZZZ?~xxx455= ܮUiŋ\?oԈDž4* KRtm&U*fq4[Fa%\*2f﬒[W`TD*!Kl6|cЄ{Vȸ,Fu9b W(nn  ĉ=f2er%][1O""fl6rWxj5>}䥗^zƳ51MC&?9nd"J{s"];Tę&ίnYbX@LeH O'{,)-t4 [g<ݪc[~?\蕩 յ p8]ӕܔ_g. "e}MtrB<5@z2֌*2;QJN؀J"2M@alvoQ%fYw(bII f늊 6^P*]եv/`Ѷ 2qaԗj n|Y!kD}h' Dwcn*DoD#8Gu[.ʜ,''M"t35*77bI9\ W>tP'pt+D JZ!0IDATZww/r8!C<m*]}~FjT ]*Zo۵w7-v5qތR^?)SJUʠPIi Γ4G`ssRDfuF}-)*ћ27i/"Nؑ(\~5S֬ H2ތ#47,z)d$ Zֽ]##xzHtҥ[@ 8}\r-1 ՇBӓ=] uR X3p̀2qJLDkxzkN9!YHus> ʴguψ>hdkdkdkx^s%r<>> ݓyͶ'O|-5 [w[]]]]]aNNo>m =cggAk@~T/bss3&[KdBƪ,!vV1<dD?q[7Q~X*,e8u#Q1?8y o9xV~{H 7Ν:dMaBeˈybz'ޜk]>x NM=vHLDtG4?P ݜd3R-& *_'!"`CdnVKL'34aE\ 3$tiY,W`CV3LqiK8M򔰣OSaa?\ED,+U k?]5jA?$iZ:vqnT؉,-E-Op-jUBV-˪q-QYjCH-zK Bbk0yz,)|W89f̠ !oZE Ye2 bZp1:P|~ӥt2>@[wm!?OY"/Wh0^*HJ?(yUN&j*<VFHd{^C8̐ .^@<'3D.(H?  YyuByK?F}DŒ]Hp>4/7zgve7֭,;KjzBV[Ocלc! 1@,.EƏ +|9gl"/-mDhWvlӓGD#9iH2Vm-U5 HsׇWh䍈NJ+4:4?Q3L䥅UztXq,Sw/_/WVZlU0kkŴJ‚w"2uh>!K5mbY+?2:[IKʊ:[7w0TUTx <)HO8"`}"9;L,D:C Zω ]|7oH $dna2%IKc2i ,!s)dPEMK#׹Cx\<5NzVQVJ"s. 3e}.yU֒Iv,`d[?<0?1<.õӕ[5H(&{ v"&hCHA UeEo2op6U̙Wʰ&>*=7RA-jC0Ԡ=wUm&DD4vWD|ۯ=U RG;Cfu~ְ3Ƅ2w,pwҐgo :""v!K3ꒊO-pUpT#Rt iHDU>aIGN>~\m \$H _$!kKDD^DDi|<=y=LT+--ݲM!'.t%"YeDȝ74Y0#DgY.,쨜gOߙ+F6h&k%@?T/,ҳu4[] [ ;;GΖ5%Ϸy:9ڜ"p t ?^A)l)|tt ZuFXVws?vakBef.R"Kh嘠0npHȜJ8.3sF,I͑9ceHDD!VFu-R>{dd+aKfTk[9[rp ["3Clx*Ƽ:7ÿ^7Nnht-,IDY>:qɚd>do63ӨϾ̗H"^o)֐kȒ/I$L\=toÌlPOD˜/Ǎ2߶H%S.3-̐WY\a""aSI櫮?~CkEDD>َ}&gSk "aZRŕxRΘRR5DqA+2a* 3s˛%wkлgȔQm^esQ d܂I *1pϘDbOdV^if2ajuT7bRL]ʗ+IV̿|q1q4ezCSl9Ts-/\+&eVݹ.;;[.z ujɞ4g~jF+W_(i>:#t΢[?}xjfP.!ҪTEDRH.TJ$KX,"zr4YD\ilka[%f*Q\F$m iH.%bij,>tԠSG%\ؗo<1Ks=d)'%6o%^zHXULܮ}:ֽIo_Q#kVLL?G#'v 5, Pxl [ o'muRփ,%yNLHNmwH()%щV} l?m+$"oH}:ٻG؂3H}/zە T&|}]VOv%5#~jw'y^Oj"ruuuvu 89o}Ke2nZwrһL$}[tZ WVW妞:iQAif`ldwEdک^$´5ohgmF/!3krX\,#"y~XjeҰ9|1=.|DߊUV}mMl^Iٸ;xɡT]xDKŅR=G΋ 32Nri>\R~Yyz4k&vr9*]X&$점{L TWy2M_d$be<719\.$75y/P$dUw7IAtkykHSNxS蛚j9t5v׫TlML-/p1̹r J_I%!n-9/s3gP@[yoq݉DO?H3[q<he3uW/nkzr8>ߵ#1?XXEv=Yj1O]V|>Ҕc۫syz6O0%]n҂NLMV%ޛbkkovT?|{/ 8ľ#ca4ސJڨ>mʳox9'grHqsurL ?xߨ5@OæaNBq`JZA= 4ԘȆvo_zd {ЖO WZFNÜRS?[IFnYSSytU'Lzѽ:o Q3l}Ȣ $K=~nfg$9,T/dWĎNT-8{S$aA$轠 c ^~7Âv/YL+/.L=]NDTWN_`6Kz/rlXDvgLexxoC]?gTsa<NR{oXVo%{9[CcN)> 1xU7 yuCN.ׅ~)ARj)Y5mRCB T9\(i$i))7gu>Tt<\}Eu0;PZR$IQI%WWS^ySt_q0)TE4)pgtZ1smǔUvd]XBgM)9]c?e(ׄ(I<)) w(""e*s`v R6ΖT.L"!m^*b(`g(G6x}ɗN[5au:~////) lPYlD9q,ϐ1P% M^rg?tIKݦaykko\"s5gF+(Vp^zyyJ~^^^^^C ]=2+2,`N@h! Iِ,A)Yקs\DDs}- NCؘ!QQ!FF}G8^ȯ{k˱N_2 R*8ڶzgUDm-U*ˮ&C}:әIDT.HIlAZӔ!QJJX".HO8t(I2@ǣy# navUm:csfDҜ ՜"+Td K[ءD"T&%ɤR)I^~ |cyҾ\D,F{2lϔ*1C$!"TFRRL*%.d)'%6o%ZD%72iE"E&StڂT IDATmc_Pzb4iuj[]\]]]}'Nt[I"*-9:]=gOgL:-ZZR%tojlg*TEQR"ሢ KHNmfzxK@ uphL"Hۻ%NKb^1TWvK"i*KQ{=XW>du_!KZ.*NSmk̶A$J/y|hM@ؐQQ!sYV [F~~SBRH'}&%!>C]*ņGIcpT""Ne}#1A4С  P1]{U1zǏ79sѭoZmlk2o`ސ"ڷ׮ <_rE 0oc=ǽ)7 &s0?u`;gJ 7Tr|vf`2?-9f;x){%62qZb|;~pJOΆtRM\kjFj <ۃwDk~{5suj'kz1]Vїpw~?+W1s ǖ kG[~?—Y}fDD`D$;\y;.1Z׋6Ґ|’b. $!3"҉ؼ1~Sy,Hv}\CV흫Vu6EXLt 6 ډ)FW[EuwҊܜfytl.}B;;lUiLy4=t;#".qJ͋2B(]MD>><|Yot/ZB"203e$K5aU|ISBNKxyyyy5"zeVdXhC@Sp(}Y^!22Ղ&2 @4&CWl߹sWs7g]IB${ǑB7'okDg.<3#IVrL!Y=GvZ +)ѫ$ G{:+(+-[.SsuMjFj /$' =Oh[s2:HJ*7..ZzL YyFE.@yyUs2bi2d8FD2W< 6gro|μH&IeDR)|6ԈE@4j;1'N죓pX~NJT]FվImgbY6ub7R="o`ZpI^a @oxV,µkͬ*ZBJJ,cP~qev/4N6n$μds\c h*hȋ26gK+*+Ϡ=h[eKOPI)Ur2sٝd>ܻu/H(&{ 6l?Ic{Opqѣ_nox"J$yF1:6"f,~F{+G4hlhNYemb/0@"<܄"i݌vJ,w)<Va￿~_DpwM5/^}iv>᷏~y7n|]~ ϗSO&5ފ@;RIHI/ѶOԃDjoJ8c CD#SvZU#^"|f țBGG-(*건_ω?MzFn]xK hO䓺J_oŎ MKDEG/[3n%x;d;G#t hxQ7Wx ʈ(77M𖱱F#KREzo:*FæU:"YHSkOo!*&{ֽ?S&vc$2jRf15Fq{iW]^s5z_; pOWV*a3x WAUEb:55U4wEMI̥5%zlOg2%睓4閩멺# ɒ{m=z-6h^dsRK?qcwK*F^; -L9[XE, AW*; e~uǣc^tjE6QöuD#/[˻NWX\vRSZ^SrޖPD8cg w@pfG23h>MMMײ|y@T^ռmM J+Or o}L 2ܼGT^jY57V^/GD\ qNv켢-O]Nvmj!Iesl0-͖^^uiAY~-Κ K$gEmD4f0ƍh0ш9Wk=WjrS]W{{'[$(ɈKWYSLu{Vh|_ Z=9DjjrE㪭 Kʭ̌]AiŽӗG{ު_J+Y4m%۔}?g15=5ǎcg~TeUmn X++~9d z~>~m6'7 e˦L*|IA̙3?fΜٵkUVK0q>s) "*q:Ϗmʳ 2RSg\75* suurMN{n={p&F@ET2][OG͸b#rk@g;?[VQStԚN&Mm~!d}o]q37B"+?9_X"IJwu B)wwM8/W|q%1/ҧ/+2ySS7t؅kDdou/+*>9x;o7beeϛ7o/3\;i OA _~]*`0f̘矻_%?\ X~3I;Y+λôf(C"*..NMM!_e ',NAT覩 ńbQbڭMyťBQY'-MVn=L :ih0HG-٬ jj;*vꬦv|L87[T'//oÆ.…U>}X,ֵkTZaMDymeS_|?~=~~~ZZDtA\2`ш&KAZЮ*kJ%mm3/[ӼX}9_ tx[͝WE 2;;r E}J22<> wtTjj&>2 $"2?3r!EVج N4U(=Ws˴iӺvZ]]|e_lΜ9MOO={v_HD?Ȩ:::/^ܲe\.'={L&k=Rkɒ%ͫ8ۉhÇ{~zmN:mT"v-H-eZO?=OD;wù={KJJڹϑNIIil|h mtLyryWԙZs8HQs7ivZY^l5z1"Ʀ޽U6/<<<45p6iҤ9$#W48ih>98imGY_˾p-Sׅzk7+3@DdgiFDg/S-5m%f}\Jvn!i]F7h^hyٴGت>4Y< A.7tDz9# ~!-*l04PoWm,3#O(lKx˗/?t{۷%88X(  ?^jkk7&L!7nNrH"6lذaÆy晙~Cl]:ǵOݻwޭ7:] Lڼl{ ޺uX,ʕII駟iii-={[ZttkןmJꂬ`R&Y1L]_}ID _Sv֦&>?GFpcƌQ:pI\ԩSw؁UPɼ0=éAgNUb46\'m`?6+ 2@]t6`]Q^Q˭m&;vfM{%ϬPTbjxd%yE%.6 :t/-!Yw9z{^,뱘~<؅kӲ5Yښ,rJN&]f]L 3ښ[`pUYrIeM~P{U $#NY4iQYu9iv1p{dmmIa͚:fxʸ\.n7P+r=d4 j(Ν83x(*Q5NĈvƠRrϜJi3Q+ѻ⋷)X/-n?]˾sr:NHv1 Bv;Vf-GӼ,͌eYy""]_\i_}H_v~rߟ ? 2<}_\6g7~;̹Ey,Nff#+ricVO.*$jq@Gqr:g`~Zs3֝4R<u9/09ӏkii~Я_?CCCLi٪|'"c `իWiӦZZZl"zL"X>ܹs-3୭iDRAD,Ri|JZ 49VE2!isz.pbZ[xU,Y,n7܍7[VЪ߱c':Z4B(u-/\u{EYw/c.o(4g@7JnU7ym{WG\u+v?S*@ܖqSJ$ז?)+{>~]κ8:"I8g7̉z}zDD=ρu0ի ED֓9P##/Xo_̷~W]]ݯ_>`mx5儖G* ==6wDֳeNSɷX 9iԎZW}=BMHz^\g?gD0z9KKy \Mm~ ꔛmۧZ#rz$\n."stgϞ BSSԴVkkk++ӐdCdccnii:&: fe2Y9tNn.Y4$?7vڛ @YㅇZYYh:0a|/J$5%y"/\L]v43fwPPݝRQ˜b-I7dȐ͛7իu}1z9Ϙkaa(-޽;`0fl3;;[''cN{ҋx<^.]X,kHCC^xyisHNNSO[[[ǀd>=sssm۶UVVjiiiii)K9{lCO?֭[.] dɒ^vGީ35-<系tguj։QCy$͸N,3=^ﮓ14uZ-ѵcf5Pc0*[XXz}aX'd*u+tj3:E&Mj]y:Tc}xYn{.\e;cr CG /J |ӦM?~|uuuJUeΝ;,YuV!>>>ԩ_~\[[P&~日*Wcb+S\\\Wl 6m RWW+--=t̙3Zrl7߄iii^~%{,[Evv;t裏>yr߆+WΞ={߽{3K4iQYY|M 6f':s*o_Rnʏ]g>l@ -]ҪܫsNoյt -}QOwuР۷ojVVVhxNjhPrs;3gzA:%KTWW ƺu?o۶U􍼝ll7o.4F^=t\##Gc@7/"Tv ufff/&VVVz 5%nm E3zO}3c;Ϛ5ɩgSSSff[JKK … zI$ӧOٳzrf2w###32Ktqq,++믣;wŋ/^DD-#<<"t3q>y䄄>"رÇWF#O2jԨ7o*ܽ{#G>cjjjED111h 97YpvOȸ} IDATn|lYI[[[H^^^cƌr,RSS'O ̼zZZZ---Gْݻw^[33oܹS700j 7HeMɾmrׯ̙3֮HOO7orSRRw}w]VݹsG~<)jjjMM/pd+r\kx+]𯐗okl`uʕz"hU9?~O>stt|ҋml[Z[|gL Wr hj~)T駟veܸ%w hРA={l9dڴi\mϞN-Cqqq1ce׮]'L0a„Wɓ={;vySXZZ<`@ԩӠA9mmm"jjj:y2kĉpP>i+*ھC]]2jtKr2"ԍ}(eΰ/%*NU(ݤP(RR{r:uȑ# ƅ jkk\;VKK+++KOOٳDԳg O<iii;vT[YYy=N2dMMͤ$HRָq222AKJYYYiiĉnz͖UUuuSNԺveff7x$gg7ttDނ_wYY^Z@g~ܱ ZQ֗N3Wt A94Qu@ugggEoP!Y}8@!=!H'Kzo,ſnKZ455d Rחc;+V.oPFB!W('o>Od2@4i: FK^=q8|7DMCmgd"$ cݺ{="p8{~!...K,裏^wuX,M&9m>}윜z*@Gy#A CfذZLĜc3)r\/kll,,,ܳgoJJJ;P(ˉhpW>(wGQ uӦMrJ^hh?kVD#*`hhh0qHEMI̥5%zd̺3+r\#"֞=!\WW_ ^fcc][[/}lLLKegg֬ɓ'LqppE@4xm2#P~\=}v uh.ƆfoڴG]]{̘1lP(,366KIm۶==O> ҥAEEEllCo"ڼyCbccK.''Nlڴɩg``Ayy'<ئK֬9[OHNNٻϸ&'% M X\,HQ\)bE]ݵ׫ "*m@Q("RB! y?̾fvdf2s )cmm쬤TRR^SS4ibiiicc#sKKKqq~oL&'%%uvvDY=uT*((ЪU SҤRIIIgφA@4@$V[n4$"rfaD[VL Ꞟ^ff"(,,o"Z)}ETeu)..nܸq::: (_=ZRwJ/B222+W6m*D***:w.dnn>!88x׮ݾ>#Fhnnޱ#40lΜ9׮]0}<==lmm]^UU< h&aذa>L&͛ƍd0 -[&''w՞xݎ?>u^^EEE^Ɲ;wB#G\n]JJ*BKUUUKnݺ5 P$}["y۷%dsvvrs[እ3*++_z⥼\P[{QF8qx|`F nX|_P(?Ӏ'꩚8{v{駟 Ə?L(--O?fglٲBxyyG͚5kϞ,kǎ+;Z+**>dɒ[M+g+++MLjrd2Ϟ==}x(#}xxGĮ'ORQFm$իWtze^^^gg;w%O( J 7o̜9chjP(۷oQjj*BhR׻w=|!tLٳjii1 %%W^IܤdCr?~tʔ) .Xx'O;xFggg B455Iޑ@ Ȅh//kF c vJb˞ؚ諘FVew|C1 <}Bܹs"!t]vgbb"isW9}tߦ&PxxիW ޾}+ns\~!G?1s ŋ:tXr8TAkCTy/ǏP((h;vGVNC3V9>$99?sdH<,0g8KwuuL0Tr[}}/_F#GaV[[~!A) 6c6>L^f$nD"QuuVuuuY,d"ބ1>/9*l˗)**&$$πrݻ0 )%r8yyy<FJKKKnN6m*BL~SQA100xd8իW555K]mmm׭[IHxw+ee) 41sw޵(K%%%UAaGRRRY(eeeK8RRRmmm ,@H$--,)S&KNuuu11Y/_IIIȤ ߎk&FFF/﫠Q4dr[[Bo24"D#|-z&!t011q-[_in>NNN[޸{GGǨQ#nj1 5֎?>11C(vuuUWW=ۼy竫k455ε=}:k6>+''b_`IvMDDDZ__5kIII쌌 TRRR))ݾ$::z…ϟHOO?rʕ^{D---xLvvNVVd42y))!*6oHKK#˗g٩Oh$77IQQb! bddx~_ZZZK,2dź}vffBKׯ bXyq0(!dddTQA(--;FsӤ5ɉb"n__G)kdž}#^^+MM Ξ effJ$@TԥsO>EM6uڵijj[篧'###^BxxO:Johh˽p" ¯+,Au)aag7m$ѣGi̙6mjn h!D"GcDZZV_uӤ5-3B<ԣz&6]_^.]V9 7šY}v,yH$*** ollD5jjo==MH~ӧiӦ]!doooo??55ΎD"ݻw?::!dmmqFn߾ؼ9J TpGѭ>&&&{`0?~ M6._-D#o(kF c vJb˞ؚ諘FVew rb0xB8Y]]=f̘y>[nah`/>!x0 JlG~@ H'=U>!l 400\pB<ojoMMӧ͞=?yH$"#VJJ‚B0/ w%==U=+9]]{>|hܸqxO<}=+W]pamy55ׯ_zʑ#Aֆ\QEg%Chs'Xd u(+Ϗ1 |B"C ]]PonuC>OERPP\rKKkt'||U*T%yUcId)?ײB!rF!zu~ZH$~YXXVTT@OYZZYh!"[__?p~MMMPSH-0D]6/Q ӐGOvӄa (ʔ){.M1(؄SLCf̘"HOo effUƍ_:::vŋRjjj~-kJ88,0,[0XaðIE&0: kI&H?HHNNkn1cǎUV|b5WVV-ڽ{S?6atzessǺ:2+.0yښ_~'%%d2^^ d>~/Lf۷ohC$7lrFFݻ(رcת^~oy9999}ѣG=|h>}G4-*r[[Zg'++MMo޼A :fhիW;툏pqIdd$Bzݺ?YlBH]]̙M6 8 >L&gggo۶M]]mСq:a/^$''WSSsRT^^^K5jùzZBBB̛g7o|ead2͛7ETWW#̙rZǰH$u;w9rdHqŋܹWv3g l 6(++۶m'N$nnnVd2933+22RT5557n?bcc S(Ç H$˼yv %333<<?FP(޽ Gߚ# /_x4:zBH ,] ߙD"'''u+1իuuu._OIJnBgg'O:;yVJJJ%%%ǎK e߾_jk?CxxxMMiBvvvvvvcǎ?}!hBw!###,,!k8>H$ڵȑ>>&)Bh6A=cǚDcD"VVVtLDyahh|[MMuZ3C >_`kk)TQQG% ̾144ǏuˋKxR^^.Bz(1..D"XO}ڱcddBͳ+ϟGE]VUUuuuvuIII `lly!5qs0}Źsrrr.\,--8[55W^|f-D# :::""S(m۶nܸI@vܼCmeKO}8bZ>xچ˗/mUUUPAA>^ի1cL&M-ͯ1bDIIS6}a)}А Yh˗]^SS^)Sږ n}}}[[ې)S&]LfÉ'm)칹y$˗C ͡R۳g/Pq%Hd2Y CZ8 1g9 ͽN.ΩxaB&0wTUUnR]]?0 mmm;wٰ0aφ|齥l ~"]VVv}=b<sPY;wӒgtرfV]]]ᄇ #?Uzzŋ"#/XZZ$%%gCxް644p98}}└А!OнO@CCcɒ%׿z.:r055uJ/#F>E`0 {bgg'BSSS|Ç++LYӧOgInn޲eTUU?>"~*FK ߼yӾ}E"QuuVybU||H$iH,)Epˆ=3+fyc.\@K!'Oŋ)**fgg__0ax777==vNVV3g^UYY߮隚#GTTT?~+G455ݿ @_n߾mii?eeeWVVر=::jQWWnlld2lvkrrÇΝ_.TQQog0d25''HvvvAABL(sѣϟd2fP^^7szM˗ FլYf̘QSS3bduҤIYYY,KUWW`0ttBmmm}eͳ UTTzjkk^b 22tzBSSׯiddTYY)//O޾-y rBnsss+++rllM6&&&mdeeu~P(ׯillR/jii 9QTӧcbcc߿ogA ݻB{p%¾T]jii9xСCccccbn47^̓R2ggӧ XKKKU>hϗTpGѭ>>D" 3gxyyZXL~INNŋ,Yf~_FSpGGe˖*6-sՁ|>?>>ʕ}vΝkYWW?|ŋ֯_b ƃVRޕ]׮]Y=~xɵkL:y$ϟ5X,VPvՁ555n?,--)l#Jmjjv7(*\]]TTT\n^^͛7u{zzHKKgg焅uuu}LY477\oদOgLg'wٲmh'++&}__<aXU>.}ŋ/nlvjnÇ5jڵ<ƍ}E#Yj /ү gddԳ+BZe2dF٧f=5sW1͍*vcWvx??ͽu67}ƍB,44!mV?W?O77Eggo߆\d2O8!ru]YWWINe۲ ۷ kj5"H!r9tb2h__fc:mʘ|>ۛ?jM-inXS |Vee喖^ֆxwWURߚiOUW5֚$M9s-.!U2-Pd?A?x/_B+Qe˖UTT߄;kѣܖeddMMMPy#`^Im^ȣ z!z9h ? &```QW^={MhhQÉ?hjj~;ԫiȑ6P7bÆ)99-P(::چ}-3~x(;0H0XaðIE&0: kr7mm'NxzmҜ9gϞ3h`^<^^+D#K$gbb$ni566BD#W'''w+n%Bh+Wzyzz!V4iҰax<ΝiVjoo|d۷B><{6L~~Fp8W^KHH@-Z}@ @9::.^HNNҥ<Ç'aa? fffF$7Dgg1=L&Y[[̬H.KR(**lܸIeeeCCCUUU##/dff"T\nvvNDDF;{]v~!}IZkk+ggg%%Z;;;͞={ݺnݺgllr*J|rvv6BhȐ!4%..Ν]]]ϸEkYW{]|[3x<ސ!Cmۦ6tЎظh| Fiin֬|>*jggggg:vӧOEy^׻K:uriiٳgJ5kv@ @]t…?F{nP+hWWW/9"i_$%%S%33+<|cc#O}}Blv9<_pQ2KJJh4///wwpPaa!^ lmm|||;;;ǎ5ѣLjD8{(1..D"XO!OO[[k׮WUU)+=kDsaXs",--/\XZZ*##-OBڬfmknn舎f2 d2o޼YUU5f ZXX]xjR׭[\'uuumm'N`XŔ;9//OVVvܸq Fe\wk,e˖n%>lذ_~Ç/fiiv^HVVtLDyahh|[MMuZ3I.^2s^ӴƦ~jQ~^}^{u?\ĉl u֛7s9pAAL/..:t!e꫶t`O @@&I$4 FX:׏޽+-(x"T*͛7Zf>m JQa͛#ų***GQRRjh`J.l Brrr%uUT*uy{G)( S_Ajj*L07QbWWד')F=!5~277ۗK޽{Ç3gϞUKK`|Lq|!C,_BիWtze^^^gg;wBzwM"(//Y-*++xBbʔ;E|:իWcƘL49-ِ!CN>R__?cƌwRYB~m{IHxI\sJJ*"兄^pQTT`bb\\\ljjfUWOO…  LԵ6vH=TaBP5b[[[WWW??$7n\߾},Ǿmֶ~:g w_;nܸ{W:ĔUTTķ---::xC>4ȐH$ ))k:::$i]dii鏼q@H)"Ty/ǏP(".\8tP>offv]d<**H%sssV&zwM"􌌌~ƟM2YYYE|…{3@ H$֖-/^߿Ν0:>v٪UBD"!2) BgvKHK miiqttTSz ͞2e2 ;nz4M|n 1)GD]]]g>cX)9Iw׳h*%. sssÑk?B1ełuuu_nz)))!CxbMM5avU555k''?Mm RSΜ9-55j--~777+))viFUUսcV[[C ?zM?EЭī,--jE} Ǐ M}F)s/_B➫JSS$<266~B(/%aN\..77oQQQxD# "jw3!83 #ܲbZ=]pFc0._y_.^HQQ1;;;$$ȑb3g\uYYYg~Lfn'OjooWAAI )$ں5<<V;o]-X xmkkC)**.YHWJII ږ(bBW3 2ꚓ?cYf͘1fm)"))ԻY4A%~};ooJHx$4޽1YGq}OOOiiRmm9;;O>M(ZZZpf?5zO--,)S&gdd׿ySlc3FݿqqÇ B< OI7],/k(|iTM=;?޳[hٳaUUU7ndٓ>q-GX-[l_w6lƍΝʢhcǚ!jkk[ZZF4O4b``PUUގZ 7"yU}Ԛ1ck׷o߾xG 1yy3X-aO JJJ.\(-- VsՁ|>?>>hN;::.[WUU잻=x@KKkjo*])>*&""4tW=*"rmRRRl6;##C| %%%RRRiiiiar7{l6;5ie{{}}}orLf}mm @ 04hŽK(/O_+%%'~,+W,^Kdn߾' `3ǯI+oWl4fw,zQF]߸q˧윬ľ'NX񭳳sYYَW?zBmggG6**)___&Cal?m}ZIlv[3}ܨªn7v,<022ŋ?777֭x߈b B!:r#G#6lX?f)>СVyX,ɯرc^q \nbbthh(C_{FmJį, 9 K+]]P_7P̙#~ߋ$UUհ6mNeZFrof=k0$mܩUkDsaXs" K*L&ȲTNg+`𒓓(QI =jԨѣB4=;;[(Qٳ7??!0hLԵ6vH=TaBP8csW^KJJc?嵲 А*(x-H{y?~B0!lkksc;;;uttH$ݻ@ diii>FH$2,!-3͜^O'ET<0P8&{{{ ߷o?."!G !!---jjBuuu֭qvvrp ڎwVsiiY}1NqH9O-lc k2x< QSSai}}8Q__?9˗/ FB\.޽? ajNN.$@4WD$V[n4$"rfaD[VL  .ppph FUTԥMǮ[篡{n î]z}KKKEEӧCBjjj+W445dȐs+.ō7NGG`?~BܴZH$޹sW|I6۷BǞ?!dn>Y[[L&?IN>i J}YXX8>"eȐ!ƍpBaa!0(s}JYYJe%CEE%--`̜9ݻwmmm**4dr[[NHHp+^~Mʟ>}:::&66r I*b}YCVNj`KnѢEgφUUUO޸q|֯_g)SXZZbeees.qF{el6{ F5k֞={Y,֎W;v!daaZQQNCCCCCC{@KN~\RV ::.޵k5ߋ/o:tBݼy˕+WB~\Mm?pܑ# DT0DDDZ__5kIII쌌 ֒%K bn߾8fTjSSӵk!?'Y37N+.{bk梯bUXFC-[vlP|iӦ͘1֭ǏXܹsϝ;dgybbbCCB(::L&Çǎ+FO\\Ĺsm?:w.",199YoWΝ%rwNNNx4: G.0 r*^~e_޽w^zk[ Ye皹- I{w*~;OugEE͛6o$N7:::Nq)--wxF333((׸x DܡC}uFDko甗C1h4ZSS@dD]kkcNCLfNBss*`P(}b<7vtp\G:6F蓴Ik8YzTOuK˅5<jjjLfCϏ~&d/D#H$iH,)Epˆ=3+fym:uT|{֬Y~K?555Eo11ćDE]7n8~xdҥD"ΝP(.ߗ5>ʏnѡj`zGB6'I'OhByԬYbvر! Њ w%y`_0?9Ӹ3yg],O*H(11?}6rHvލo KsHFFݻrҚ\>A[[r @FFF@";Oб8SXFe6fF_y~YA0C> wQMǟ"A#T!Dk)F=joEO{ꚢZNX[ت ߩMRQkAzDE\Q\8 N!~yO$kYw ѣVkl(9wvIo_ T8m:v$=ruuc6TjX-fJU cnjMA.gJ]@~dX&e_LX$Luixlflfw@4R KP(rEeF /.JX$IIvUGGGzJ׿.={,C @\P(m96d­IAb&=x15,b$ CC'sMM͏^С]v1K_RZSdkvsF?6 bߴgU2;55$@g f kT? OQ#Q Çmi߿9u:]CCS֟kbϜ)PG qtTޝ3'pppо}yeee !&O>ڨ7벲Z }y߾}QQQZѽsQQQ'^:5ܖFjubk׮γg~?\J1wXSSRٖGt:֕L&KKK//vf_`mGkBP]?~h4Ι3w/ѣGTUUU Wj&}]]]J?=JKuU3G, zߝw_e4cc㼽WϞ=;##%r/?odۻvnw@rrB!߸qCRҎ!C0 MU.$tZ7kjax`]텱73%F_"Y,IS-l6S@l4=F!!~*G{R-Id]z^RKϞ=PF%+ G[oM;pvRЬk^L/˱X$I ={\`ASSssscW:t(g׮]L"iGW?up-ڷ\я 7m٭E†GiiiMM-# ȼtBeeU*Oocik|{mhm[Z+?glNаZ3g jQBwg$&&9o߾>}l_YYBɓ'3W^$nuCCbÆw{111=uKKKryddd``۷Sl|LLo6lXKJJ֮]wMHl||.]b6dL:jmS4С_ z`jŊτ ooT~$//o͚>>ڨ7벲Z }y߾}QQQZѽsQQQ'^:5ܖFjubk׮γg~?\J1wm{է^Vk۰ݝ¶Bi6I~?a4̙ݻw_|a}ݣ}*BkKaa>`JCj]\\#FhwqC joƹsnܸtfX[5sĢYUg4]{⫶Fcll[o1>~O?RYYq7oڵg= 99%*ꝍ7899q}^JK.8pgiݛ3===/^v:0y#:|ވ2\u_ S h}cm?jMdXb7_KJڑ>,,om/CBBnάF.L6tn.Ɬ:>jBQ)LlٲļCBBl11 aaŋ?_W~_|QQQQ{y...M9sf_PWW| Z?9~6?t+{ ַ~ϙ-EO/שܹ`0 g>gu:矿SYYuڵAMv !nܸw1c=zTqAΛ7ٹ˱cN8dF1JYSruG/gٻ(5>Zof777!lV5~+**Z֬Yc2>t9@Ncmꉄ Q{7+X-m^ɄVb6Blݺuݻs.]4͵kט#UUU*ãWr^Y磻۷ohRHFDiP"oQRRRRR2uTg|饗Zw 8p̙^^^:W_}Wm"#߮KOO߾:kL}P{b~lfKkwN:ؕV݉qq=m;=}b۶mii;^V߾97cSS̙[,-K~<`wlnnnL1xJ6_s~aCW'jθi}{RtI՛FINNBTTT'&&ngddDF}޲l!?ptڴz JKKo޼yܹ+W444h4=oݺ,IƬ)W`Һ3]l uG]~>`3{yyj!$I[mMFssS׮]&oRZcwkSO$!o~("ؼyKLWzK,ˏ;e8L W)V?tCFIpڵo?/ Bd4ە^^^N1SSJmݻ3%F]N Cu4g=88W^eeeB*B+jaa۝X\\Я_].%nnn2WZ SF`OZZۏ9bQ^sit}yǮmW%` !w !mۖbvYRWWcGɓ'7~ y]_}f|LRκۿY}јZyۛQ@'[VV~7V.Wtsv>H;*T&Z>60aۏZSh22@'㣽t0 zQ_vh6ל~$zwSk V*6^Vu\Li1*`x`]텱73%VB'eJ-i2 44 iiH#H#@@@FF44 ii~=&Ɂ6IENDB`fastapi-0.110.3/docs/en/docs/img/python-types/image06.png000066400000000000000000000716151461403617600230040ustar00rootroot00000000000000PNG  IHDR isBITOtEXtSoftwareShutterc IDATxy\T?72 02 3$"\)qAI*.rI~JR3꒡rsJ" ʢ2 3,2&?sA \_G9Cs1rtt$ b<{;m(QK_mT8w?F䒱茶xlbimZ OLi(l@,+E얋-Uyc9-Zo}Ϙ]9_7v`McЛ6 jPeWبh}ͬT{T &8V,R*T)ws!϶,R$TzN/RWU˥ j9Z l\ࡦw:#_9j=j|2a~X Qǔl^Pi/Pne6Ȋ,Io%*6\ՒEShk?Gջq`ro /;Y 䧪^w6~Ɏ|-e[΋;_eHD쁂[/>TGnZȼeUŊ;W\90uc^7J]&WHT[զ0fQ[t8ߟ^;qe5kj {aWfz|'?Pl.Z LKKes5b5׋?̅zc!r&i3Ox 5"w6u*5yP$;$3D8ޕmkY{cmk6#XV ?YW˵DDa,[>yO-x cvژʌAfV66zR+5}^*SDAo^̠4\GDCBe]$BHm,~E@c//g>_5OM OkPJzCPu%nfo++,HܖZB􎼔k a9K1;e[ 'c?lX4ea^w-=P   ...8~ OcOG{_2M|W{~oꃣIr XB~eǔU[lѲGޚn{6Whw,qv':u Yz.m?Q;URkhkħ7V!W\髊1Oa~f;|]>)btcO}suv]╸UOn  8孜GqX[eN,n0I(hYV")Zl/ZWg!"+-ͻR|⦰YojY6A"WMgiR۞62 v }Ǝ9]]vKg#ShVv֤l<8+WODefyAG"~>fKs$Qþ~=ԅ|^hN5%_#"y;GXRĬ 7P}nM=ƅͷLL_;m~5g~]:e+БU+Ek6축LD_oyo~hK5qj""]=DV\RV\(NZ~POlio-cy8ӅOj؟XEDN hM yWٌC*Bu?=yLOS>TmyqVCd4ϞX~%":\bg{XโY"ܞ!/ۆZ<ӬYX 8<r9'myⲧq{o>8K:tR{Sb8ͭ=0WFk\ψ[VOy+'o};E}I/4>GWWiϥ̞K"؉B~dz8yH|&wB"F7n|a'r:DqIAbWI,׆įU.IP뉫!&|۔K'eU:5i_7iKgLVזJ$]k +Bbt51X&L JN;Q/Njӛm'6gmXp! ,qׅ˜urǼJ p.qKpQo.'+\{miRrVڲ*kqVzrd-cb+W~%G0e̠֧u؉4֒o*]38/}%>$k,Sp0Z?tL#mcwٲŲ['ZrYgsC;vw^ ]!Ό[u92-oGzg`-%25i /+$vE[ҾM6 oTc+*2KřC :3?TXmyVVNJ&"h kxЎlG62YlvVXl8}bGzXq;8t:2| ˂Y[Ŝ[ss5="I\xz{/{2բ㿵5ߊ.fl9z .x71AcʎR|VTiI_z 5:[.Qa ڜ/p6}))KK{(%4\d8Em rX,Փ/[F5PQ_\6h˯QPP0A+:6wÂ6xlq 녑Ӄwm }LXw5YLE^̹1X}%%&9vzeϹImKWWj9g4'b2kj g|>IԆodp[}OywF˘,wU5d:/s`f)` |yrzw\_zd0ɩ1֮lw9DӫSBMDT< #[ <O\v,PMX lR=|cb9.dՈK& "qJ3v7D+&]KL\~'Gf +>w$oy#Ӱ-GX1tGk_;f/ 1Q 1<>w2'8X|llι*xV-2.3"*)>t'Q?Ab$0 :{ Ӕjš3Vs^q!/~.Xqn]j؟qF,K|dy(vuXb]8:+'r09,i?V9Ů^B9;T*jٷ Tkl\cA Қ35;Ug('4l[&UaQߎ>qqqH$8O(o߼<著}Ř xpu7ڴYZ\@[<>Kݚ}i[,ߧ(r\ܓSŎꗞG=ta ;;ڤ"R(/ve+_nWe7>φ_Z"EJw&ID_7%t-0ׅrKH#͕$ ?7[Z* Dsݥ 'DD$zm-Ƚ[[#w2N** <'tިD]HK/RE^p [^l|X!SA6rL|5tvE3]6ʮNjFKhH1X,&G"`/KL[cy*Y%HOSXR65w=ǥ^)mɅ\? g/ްC^%KZRnn?^麦ۢђir-qK:CF.,>~;vc0IlW6Voq^{je3m&*//׈&c-&ٝ feDq0y|S+zC;y\xx ,6^kɅm;w)<^/&&&DaRZ乍qamq^W)ٳ"'8::ׅw=5<6rW.D"(H* squY]c|(}/Z8ΛrIYx_ #eҴ? +u=VX&I.iH ҷݷ {b"%kT =]׸>7f2.)e2ـ1rttrnjlcej ukcuIe}>E"Ӣ_zeieh\  p;| | |7Ҳ7:  O~jiA+oٚ{ZF+c69ɣiq÷1xז3'5|#zA^'tިNӵx\>Z1:?s=L5Q٦G(5?IiWb 5RY1XfR|1> MMɶ2"ےW}PS~pCUQ_rchj*ny1D37UZSCѸcE*&C,XUDLuymv> u0ۃ mN>(գ4^rKlwE,vwqR8M}M#4ш/m^Xg;̞ChB5߻air~ZtBHlǪԜ33;buV,uc#.W. +,pݟzL0?Κy'GˈD,vu%emc#qJ L[IdQc DDn^p`5[}jl|̓xRX5 D*%JֱvB%"OkFVu}BsN䅲M EF>rCH8.2r8w=VLmbF†\1}ccy3}x$W=QhjgF=>!=f|߆c*⬽6wgGSRK2ܱ[<^<4ڑS%R$8ƃ2CX~"}áaA>$R-Zm{ "2c(+JΊ Yuc pyGSŕsW8;5J2~)=O8t qc_8&W*dR,7m) *g5yꢳU v^Q/mq^s#Ubٱ56 ft~yNJ,KϬcy9Yx]{⦢]923+)GO/LKAShbqfܪM97l)x⿯R4Uc)s22$uXfXrDQݾUY *3s㷔qڎRRrH??Om7ԣFL܆\ 1}sJriM{$c{d]KiST*$99%Z" xdJr$7#no@/M^Q"KNlMPܖ8-\KZiF\W)/uE Mg+#zW{,]ó&=h⊮WӠZ;rގ㳈 fuTnP˩%HV;w0VKDdhh(k ;[Di5tF%}TΫgD-p:w5k(4: 4""l-c`V"[ɩ뜨U@&kt Õ:bsXl"(2/;v \{h5HK%U45y(i;4Y90;ÑJFv}QBu0G+ˋ*[t]="ss*T*j{>e"k/Vo8R$ "jY;ꪰP;ӆھ}|QS$6h7k ƅ:ۛSԍZuy@jH]'hgZd94bFH.7r=DlJ|(ǪF.Ȭu "RIC<Սb48TH%D#y$R ͋ iVGn&1^""XFf$ u:fG4|7f]#LIi+-F23&2vuwLv6Xys-"ь`Õ}jo~tyOHܻ>CxCEhcz5-&L&" B&xޯDל.$;gĄ$z~wM^o’Z=* F]c_yƜo?yJYh/ђ7d/<) i-;NMl GX fZ_AR_+F G(gKdU^K28oݖGg^6[GM6%RÉ' nكVH ; ╡wxN~ 5~ fO?ڒx1.);yv\_'""û[R+Ncj[ v+YEg*dJMUR}/xΉYSCŌ "b$2+{i9D'm>w]m3[ڟ_ڻ$oy䘋fXyvEpt4mլQs M^`Ll wSLEܨXUd.2kx $n'Vgq+}7DgWC@xTL,r^.I.1sKmHٲqFGn۔/V,;^K8'+9abW$"r[&,^W` }]P;>:V Q,[*}&6\9'sQB Rxx=<ֲ<3M}?X]VZ t=`rz]ĉ_Y 0Qm'꛴3Em/vZ;h%Rք {`K\qZ ҌL xqr27ۛ+%2{2wOrHUkEɾL"~1 ~-ʥ%'o&1Z@ժ'rDx$-+҂{b00]D.-XK^x7Ki(=pI (zp-}?t[:2\Z[=&R* e&6vpF%V//,k8V"QI""B!3Ш4bqDZ/n[ xD(dRT2<]-t7챠!ȊU=Xuk`IbnF B@#M'2VHaB5G!mA[5V},֨sGlY)wmx{](=>uq} ]wQsr6/;fN̙^1 8Qa'ZgNjGVk]E[4nZmzb2:'[Ybr.0]DUeŕ$zq,Сs< E%2J$2z>p7V!ؕrO%w i2K('Rz?[cr|>:ֹ|.>fKrh8a \8fnn%re1Q⪂DgG<\q|â݄|y ɽPePydžsnDq9M(t>]}8WK$ؕKc"cvn c 9<|etOS)I32ƹnatzWus\p}a'LexSwh\XHؤj^Zq͇f8+vwxbsb8@dff y '$v޼y&&&SN}aOlmg؉ =4o8") ϫǙϛ;^9y(h_CAn[;,hg{3v209׃G"QqYuEM]5^RV<"Z2sbZօԣgaFιc p ,eW\ASXYr ϗ{^Mw[z/0b=C:}AiEZo.zMm55|6a":oaLDf&,,FKDjNG6EDC^p ^8{ת8djooOInb&_~coϑT;[\ODy'|}^="Eɽoص{Jz^K{/cUms>yu;+"5aNZݟ!r=_ސTZY+ x3Ε諟ASΜ9ښWWWnݺ " "?_H$x 4@0aٵ4k֬KfIw$cc6 x^k7/;\b7>KD%_8Х{q:p2,=ߦUV^6n×~wW\ZyTݻ=zDXf{1Kr/5k&ϟ7o^RRs˪[Ǝ~No>x@}X5yuQ%{NVSp5rޫ/ ]S<\k}ܜ_ޣ?}y`JD?08w\.z\RQ~~^'|mJNy>);vb+f[*O҆SW`LcSy=zr 8l:|sZٿ~]I˺PxM*5}CJF[tM8݊>Ç38P_ u7+V@7٩ї@ƿ{v{Jxӧsrά]IPPPqqqk010p_^ݡ|wWͭXYY]r$IhhXNبP(P t (7=<՜9mmmvED釆 ՚o#g|czNhg&>4Mh1b0 SWޤj:(/y&L_u:aliiVt1bpƘl\H,;8`}{ƍ] ֛<;KjVVVDto7%ǿ+lή׭?s pvv"}:''-W ONu`yɞsboʺկ+:=V5|hkk#".[WW4hР7VV E#}_}FYhs;Ԥݝ¿{o]*B333SSS>_QQx`7Ӥ\$r111}YTԊ]v!Cۏa?/_0܈>>>VVV,k|97nt$^ [|SO_pPNϵk׈h„ _~Ս7t:_|׽Ν oْ#ph <o9DF s3CC;xqDzz:d_=8qDC;w2,\UU Dh/4MDW&O6avvvR$,QFY[[aÇGGG9;;ۅ/;99988L<{9;--pʕRIѝL?SѨ MzJk1;:(, uz NJ,[Çzu?o~ìm&%pqooQF͞={ժ\# p0^Qx}sTK''GGGG##"rww?ۻfG.$%e0W$`~K[[Z^ZojnDn$ޯPY+bYEb@39s|Fo9Fkkk77ܸq#''gŊ{'Lr<88NTUU}՞wB6yyA۶7i'@7%E] ?^&VXSrs3G%y>ߖ-3i'@%om3O<8,..N&56Ϟ=~_I""F gnFSճ>;mZ[ccٳgNL& eF7pu\eM/A\~/ru666==n۶UUUvvIIIgfŊ mٳg m;䷿}.}_ di_ |adž|?tΜ9&fߥ>CmֶW_v>}D"ӧoܸQ___VVֶ;kkkAP( (o`z ߦ{ނ ʞԻx9}C 7N`*/++VKAAK9RLUYYY6jcǎ_r'c봚G_/?j4ͷd|q};s~ҥ,,~h4-PPDGG/_j˖ ,,(( ]je~fPZSE\̲wFFA߼Ҿ444WrF, =m~M:922R)Ղ X[[rR3tP77J{ǜo;-?pY^^M4ܹmll.]vԩmoaiiQWW_&&&vnnn n?Wݞ:6]r/u`ζmRQ[Iλ .>:ߖT*MNN𯬬p}UXXX||W}}={~*wwYfX޽;ҏ?!BrrrTTiݻw g͛7;;;oڴT|Gę H$+V5jTHHV]z͹sz/pgLre72TjP>K,Hy^STǎ˩z]QQqͰ_<֭[n]RRm矟boouEeee3>>>55uŊVV |y/}&(z=W7kѕ3K|2lꚪ!Cb9|AvZv8˝#Gn弊@Е ;ϖxcYh jsCWWט>VV·ט1cvV(w?M|p'''Hd*^T7}TjeC|Gb3ƶAHMMݵk->~FXXҥrh\jegWFjjj K =AMM飻[[\.ӁM }a:T^^n4zz VVV oྑ1ZDYYYYYٔ)S,--===FV%&Oy7م翓BےJ.ڽ{icɒݲhڲeK lGee%˯m@V9;c+R+M2 Cfjtf`7.\흜<_VS$Iz;}XYY?oaW{gXsQ1~.{]97 ɖ/O2d!xlMMMzv}}=@a;h vk5K1=<xIvk3r媔O?իWssLy޴tA/x7+fc"cD>#3O7-o鑡N;P B+}<|}}x(󜝝:xy{kkV)ʍgz?dqz?ܐ :zx`9::'3b Z[[zmIMZX';Y ̌FhZT}Zm |,--^jmۤ蓜w]?|;/t-kkYf H$7mT5~z'Odfbtـ.ZNΘ9S`W\S-3W+))^^}7\Рz߉D"ALJziE޴|@W:{In#Bc\>9'&|NNa'9 TOZqIIIuuƍR Q.\ 7 N5^yИ+ZDkP>|}kqq{yyYT2OVf\?w޼-Z /hm` @c TVʭMLnQSs˴ݫW/ 7c\Te-6 رo!C 2d7mmmA8x`hh1cRiRK0} _̢s.I2sdeZڵkRR^S* u: ?zٷo_EE%t:wU+"9imEWΘ"Cc?vbEymN|[fӦO6mlG}ĸ@zVQj*Ӣ|xAR-U5կ7fSȻ |0Wom%5k#c\ Gg ږG7t^```eD"ѠIII+*h>YWaUCC999 45>.]1| |x @zX,Ľ$j.s@gcPQXٞ()0 RD"QLLhxp0Z"fԂk¼GdZfb<imm#[Ąʤgvs򶷷߽{?pBI/?SA 72;UYqHIDATL0ci^^}旝Jvppg i_j_>l0[[[Ӥp ]5ʄgwLO {$B:xݺu111fX[[j*BNZ`0\twذaË/Κ4iH$bAn:߀ytη XD޶AS<ʙ?ť}zdhǢN(-}<sao%2@'9;;74t^^SZݕec~5!7trtt N.ڢkKj */F:ٹȏ-2---off4F3F^T˕JMsZxaCcBcO\{8kuAm{tjǪ*M>>>^^^cƌiYP0"NVf\?w޼-=]jSSSwMp1 jj%飷O[\. |,MR4<|Xxxx[UFFfXXXBBL&yk2^8::̅9@4U+椵]9c Xtډ嵅:mUWwojkk۪ @j4U_ZT}v O/Bʸlj0nCj4 ȴ}[[zmIMZX';Y\8::NTWWK qVVHd4z vSRRRJr򊊊__K. Ưy?~߄oVJIJJzn/߽{:[yyZr|2]H":`6W?;\;:(&|jQicǎ=<:Xj0}Kxvaw2_h:y))WVV?~Ĉg6U{{{ٳ7++KQFPYYApww5kV~[ޱ# $''GEE?dϞ7ovvv޴i-ד8QD}ŊF jW9w _{8q⯣Ξ=7nXN~_nݲq㦣G 0|SsMHH]޾K:uJ^'Onݚhޱ 7r wƄ)W}s!CV ev775-Z$Jզr%K? RyTcǎ:{Pnxxo /h޽{WTgddܼy3,,l/Ͽ|u֭[jۿۧn]pQYYbJWWW++ 鉉2얝R\._xI~Νcu.?9sAXjCmIݔ߹sy .o^yř6l; _ tKu~`291sr 3?y,MoذQ.:~FILLÇڵ}w?[IIIzk׮߿_P 8WxȑO477Ҳںq+W={.**5:zhi&BQVV:zh ;@w/<[~hLhkg^5u~wwNW]]mXU%o>>>^^^cƌiYPl6663ÝD"WxR|uӔA._ ܵ+}Í |'oS'7oy|v [t\.7V_ɚ:3[[2=^R^^G{NZ"xzz>z{U;M߿CˍF-O%VNtrr3m{yy_zմV|rar߯ | ,MR4<|Xxxx[UFFfXXXBBL&c>pH_9޲%CZ… {1T:jdH@/Р[KUU'_P,5A =Xa F/?\|h4t.^,|g̘yQTjZRPRDD>}ڈ#OgΜ8r#F$$$>}*00t˗/?dxbbB\\\EEB0Ν8pƎᑟ_RRѱ~`. G| H$m4u닮S\[ۧG,:ĊBN6,{ I xRF^XUEg' T [j_oͦQoh***<<<"> |^om%5k#c\ Gg ږs8mZS]]]VVVnn.=i'yaɭ⬬$"h4;M5IJJ\T^4sgqv <#7г%m,bH$%WkTw :4DivNQh0 Dp0p)H$HG[[rbls3tFQaaaadժ666<7\yqBI/?SA<7vd582$vtPLԢZm3@RytԠS]^³ OF HIy- #F={ zww{.]ԩS p/Xjyqr9;c+R+M2 Cfjtfԋ-JɍjS9sAXjC_|}R@˫]A]7o1v.S>'0wD@@ O?~n < ;Wuĵ]%EWΘ:wm@m*2zAmf< @wH$>b t2;UYDiiYii+,JÇߖk%% |=NKKk ,2-s ~m%٭fxɥ5:*&&f}};bO<C}.i:^QW4Ik3Oo{224vci'VtηU]]߽eڎm_P(jZFON4~AHTTb߼M F,- :TTTTxxxDEE}N@ڢkKj */F:ٹȏ-2---jqڴX''\z #00Nz$^/ <|X |oo  7@@ | |oo 77@ |oo 77@@ | |o 7@@ | |oo 77@xfַ:IENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/000077500000000000000000000000001461403617600202375ustar00rootroot00000000000000fastapi-0.110.3/docs/en/docs/img/sponsors/budget-insight.svg000066400000000000000000001103011461403617600236710ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/bump-sh-banner.png000077500000000000000000000236331461403617600235750ustar00rootroot00000000000000PNG  IHDR,(D pHYs  sRGBgAMA a'0IDATx} ^EgM$qeHJx$%Õ$쬒@XY* "  A0ԅA\ ρY$ᕐ0 ;y@ronOUӧ}]]U]>;;pP%Ou8GqU ^e tޓԋgNs %M)Դt\<0_KreTQgҬZGyc;uJ>卺d$S2ޮ'$@\NjfO"B']9 ^bi'Ton l`=^NC[ [W9Ҷr\긩e;fQJ,Z)}Ll}2) B8)S>v6rq]R5NfmsUpwm45d  M0+>HKܠ =fYj1(ʜͭ)ow21G;*r 010E9fk`In\.+7} 2/b!Kx^b? f(AJu4/j,Hgט-C[.g\ZEZNBPbHXGv|0;Q%m.)ꆀ':K?U b#!NYfpx)ʈ]eޝ+C6oغhz2;ί#>?KzABJLV mP˫$u.`K1N𴻫_. 3cB]-Päs JBïqMڵ'm 6Ji'x)3ee ВI4Mw;*E-(w®I D/5eV[hPeQ kkY]?Zr+-e|2U9&\N)]ְapgC ZVzR(h#,򭮪g2Eb[!ށBk;j<#ɯikab%`|x;11dP'wq{ }7ͱ_Vr9N:q.]~Khl:-a䨑0c`„X;6W艘dZFOF-lxh!&5m, (|$?&fF1w/3f8TkP( l(&bk>1n//`GD՝iض7tۮxz8|iԨm`G̑t7HG&Y-GaWk4c]c9~s\p'XTe;4чώ;{߯~u҃q~\sͥ隟]_-YJHcƌ>vKvq^XH Tb2%¤Z#ڿrF4۽VQџyn/~vU  {IG|hUZ5 q]wMUdh[N }-{ֺС(\~f'tks/sϾ֮hL38i7S4@`4! 6{dY҇Hvat/Y;e,[ !(+W@A+z XG$ 9 |@u׿v3&x<&P|L@*8%iZ#xK~<.!O+``/ȤjJMeHyz{xI'4:pu:1Xxg`6Ƽz tᅲ0`#e{ 9z⪛a(;7ˏ%Zk)ة}u+VPa 0Sa=vϨ Y/tcN&<7}˙40_+oiGOiLt ~ ;B@qcʕkZxO8З=bXp׎Cs'%09N|<":uNtw߱rTO&z\7>a5'2صW[g ׯ#F |`!r*(D7zǞ4sݹ د{S5ԎIɿ9Η@Xp57z;ST4"Ѥ_Au7s/Kŗ}a;1^~5D{߽aWR<G~q}eaw5VBβic~uJQ\wsT~1}F?pS?=5 ȓS ]9]gЩ,ۓv j/.{筤NfpL@ :6\_ó S8 |%> T,Ao2i9a 3}wϧG+N_l%"eⓏ/"kޅg=.[_:x- ïi!r OE;EX.:4,$Ƒ"Pa_֮-X~iaYKsi3`%WSă[H|'s%=-&p9r Ǔ[6a~ 'j&Si{SS_xU>nYkeò_%n 6KEFl?{}G>[Ga!/ ʕ?UԎ/?pY?̊ˮ~\gUu@^|,@.22%*vw/n͟IrU{I Hw8b{h=rMK9NF~П.Q$E%-|lj\ x|\DHyƅaρ'(8ce?|E# j~#U8Rbh֌08at$. Κy5EV7sTGoπEO< /!9SU5cca~,)ӭ݃U3tٍ[\:n.f {KӅbZ.ґ5so/NӦOw0㜓iG j vMwwm=08"/ ^GZ3= n~d puZWG&\[/ W;A,T#b+??jiH7Dfgyi䋠"Ώ@t-/BbyD)Tmη7eH#}cd}`Ʋ%y>aEnarSsgؽ 'Sd7PX'vNXx)4r6u?iS}C9{D bn\~pK>}@Uw /=9-!0Z+z)bG3)~y;?^ 1`ѵ$#(T vf7<5D"X0/פtTdg?sq?-7], 9|ZN㙗:%ހv nzQ`32xN8WoC~?O.=`5pyߤ#}fk ;6/CHrN艣QuAt⽬3G6qh;{UJX61lD;8ӫ8azޯG?wx?:n6Amw/P̑;K?,T,ޡ%PuRgq]-~LK:i =wϋ.FG^Ӿ2nF@aO`1B|EpS@wbPe}w-7씣Ci)KB^rbhbM-^FrHZVC|yi~{A)qR R  8"ozA^xjnM wG`o?pR } *hgy*>_|}~+X{ ҞGcjP_ާHi,^^Z/6m6I1/^-aF|Y|ԗݾT8yVps~ 6Uy 2VZM{Ycebհ< Υe&ym+meὫX.~a^1va_ϛox}6l( 6 /#-&٫W9j7߆?D{L ClKR,wY_^m##To%57~{jWw/爐}1?.~tڸjg^Gz>ˠƊ#0nğe[ XBeX۴fyE}1 /k|Km}]ṣÁˮ=/~&MT7a)*i/M|fӲݠZ#n3sekB.|AiN0k{ݹfY[طvv[V. =&P(DTꢸ]V%Ϸ%.Eԫ-xO:f8*18vLt\!@ijt\+-zAo;=2M b#ƃIQ*ۿlC3ԔNq+/wi/#Xɔ3J.-X(y:("ME `U)j@igµ ZiT4Bc=CU׫  `,iь\VG~}GAlX(p,$ulp9T.-kXLY4=g-ѣngZ_mxrKbjN Zf,lKTdgԗ7#һvoQ:1RɷdƦ!sD-g&`#lX⿺;4\ b<|σyFL"){? &аfZiq-9źnJ@֪nRwLG IхB]oֵJژt a #AT# RoHLOO Ds)"UGcJ4tEojԞ^\R ЦpMN[Qz9dž7K= P}#ƸfA $9$:9fiކ|-}+CglSEMc2oSAk J.7x@3`Ry#F+PBS]jXB[ima"') W60j.t$9W*`FsP,]I. 65u=Co#D\JZ5GZW 6 $t(:MC4QFLS߫rֲ:ֶ4- bh hJs/yl܏QCTNj(d~ߥr:L$)(RWN#aQ]B@K? >y_⫢D^2~tifqـꁨZM`P?c,AGp(3] ,OF((؄( 4p&G*Tie큒(i8I0Z e7 5L9_ENʚZv$XN 6G1܃(nx-!N ,ʶbZfQ4z+'>BC¯3P5t;"?֛_IENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/bump-sh-banner.svg000066400000000000000000001131351461403617600236020ustar00rootroot00000000000000 fastapi-0.110.3/docs/en/docs/img/sponsors/bump-sh.png000077500000000000000000000442611461403617600223320ustar00rootroot00000000000000PNG  IHDRd pHYs  sRGBgAMA aHFIDATx} _EoLJ ygؒy3BP$AyJT `.ۀB:*  c6sfH շgk򿷻~U}7|:JqIX :*I2㤊 =U;.jNnjIm/v+;r5dMlj՚dM,z| rpyPGȢ L St^kHyd:t/CYq^h\G1/v#ԑ/2xsA1b*486Zh\J IA]\N)IH߱t"_vO+ A Mج^ƚSr<RXma'{9;72XKWaTt,Fn=:жg`&ދWI|ۺPY,noT)h])#$Xc GɃbAcm[Fc'wcJC+pߍ8\ ~6NҼA29x9tt Fo=!Jv.SfЦ}k^x^hHJF.f/@lD+h6[2ҹ PaYN`)5c33j9aSR3o2͇a>Y~/_fI$dr^/w9ї?Z`N x9A+^Ot̢ 3qQ/y٠W "(E]3i:l4{B75.n*l_?p#P"T4mK h<Uv/-R@46p7Dn]'Qa*F=xwM ȀƄ/l*MI 9JpK^qWy\]Q˥:-5ѩ"%2XwXҴ5'=ip0Uol!j8sD6 [F+K|S8?bڏ ޷+-xtevb=Mon_"eM;NK&ɫ#=ɓuShu9$(sQ^Q J#) ИO 4hѦ2rA lB"BI;Ft=&~9W({_׼Nw2=)OHeHljjZL2ڕ4ܤ*C ̲fNj"CƓ kTEaͧ&VYbz-e˯%TY.Ii~ kآקl`c;$Yh|PP Fԫ2*I*<o)!TWͰޙ@n!\*rp@H A^,we\H㹳ړ :9c}q棭6S^5[uJ61-}!-W60aJFM2k3MgC+ -fO:tBL>MP }A)j|JoW;:!3 &o#wzc:u]Ox^hXYV7Jq[$l3F/j ɐ5[n){?k^bڂCK4ޱ95ݴ` X)/IRNz,mT@N`+l训N+ );~쬞e('8TLbOdo/|ۅ $Z p b5sl)>T!gj( ]=iq ~X` qg!&]C#~k˅}Ո,P]^EJѱ!k^qZ \9-T;@s7)`TM  *<_O#״(dpG%e|rJ"FV%]UtxD7cm5qGms|$2^~[e% en(J+{u[C;h)[UY3?>p,u2nXmѪkƢD+,ǩPr[@s9 9fqLJ KK\ʉdLcO 柱Vz&пcx~5=>02׍.:oN:>ۖÏ<&Vb7ڬ˭Wj%q+FlH6n(PTV 6$K"h1UyF 乪Ws2 (n1.ײ!LWT"YB%'*MfX0w&|3Cv406' 6~ҩ6dc_-`|ǦO.|ㆥeD4'zrC q{v.S'bAAfۧ`@W63ٔ$`!ǩ^h(/6j: qRR\쉤piWn/;=:hXZt ߼ֽn3S1/f|_󲞟w5>Λo;``- E.,RkA\k]5IH&սmi`OyKZ slyjIjm)fQd*ez]HqT\?AI:dZObJ{+TXz-/Bns 41?_xQފ~S&;M>wɏ/ʎqߡ_q=\tiwkX◞歰voqݭpͧ)w8/ tstt+W> ]ƎZ< (hZ 6Tp Q&'-ÆU>O8ӍrףzaCHW?sN('߁GCن~7`[|'o3erZ :YVh MyOi=@Ke:qJ8n'_{]N)͚y0̚uw/| O{GCz4R_d|`k4&s؂` > t5wD{X2,ɛxX]}fg4t>j6m"vrĬ5kϭ.%`6| >Vs5M&lkpQ"q30KɃ1cz=@-$vmcǵ^g<y`{+~!["zwS{SNxN^' 3g ONvYKkxDa0*C)T;D.z7b@VWO)ZJ^ɕdBkXOatTz01<¬`F $ 3_I>tjcWyMߛnkm |HMuyҽwPQhW+`)t^]<}8)ɇwڼvF3N|젽2ѬYnc+7?:9Eճg/ݧ} ŵ)oq ֕ :E>eȊVRy+ Ҋ> $%MWrPW?˘etRJGml`֣ChgR8Vąߦ0|JLRN7Ӭ]^5DoZԡYn)޽uOMzsϭj!ofT:K~#ͳץEo\7a)T^z5H%{U2/k`;i\6@fʞ$hȄFaOo]kV ~+& 6f~L CHIN7q S߹t9:qB(IB_ sV\nks pw#cSArrG־+dd(\n7rT_0)Ј¡'u>uFB|hNJu_2 6,pj^ z籣.&ҹH6bX@e.$kMe7RM=#o<(, v@4WG*z kd'M5y[, ñJCuyFִ<nhKBؠm^Vj~ìrc.jk TSRb}+LbNFbb*h`ު=`De7Aak<#O0P"rҬPZz1 o2T hൌzTtK'z?fqkA\9lˇ/:Kszel4YQU~4p+!-D'8DW Y5X⠛5FաDJ? 6x|Nx[DVVfRnSJsɪ}l!=ȁD%[_&|i΋tb{,E n"x+ݎΩ s<n.3QWo̕L&`^j%0v]Lؗf)V R:g:s+g2ie3<=.d53Fderzz\-\KQ #FAKd5O꺖&_۳C+iw2X 릚R<}Mj 9 ^|Q̉z_pr@hu—k!XM1CQtp˴w>F ÂD>y}fa14 zD/`eJċH- *e0զa;cc&3 pѠ3y.]ƛL^+WEGwRʉA v^DV*`*y"}Z&6;@qHN՞)Ϣl/ɀPowQ:N1JqLzwfSG5 x%r6YŨ/sAoE4(sZۖBUaYhpbyآIfPV*qJ+l@ yC Dю4Z@gOQ\`ۨ>Z+qCTf+`\lH39QF fHn)GVSY{`=O-bX k[Z\QNr{?4$m?i%脶W!@6sጂ$eLk`+Q*=UQWahc&  Ie-[: 7ֺn f_҈* .2ud,%_6gcilʼZ3X}_DaG<7UR#P`wlyZ!>7kࠍ㪒Im1iE̻V Jr#luMO%׵QТa3`UAC*Lt?uW+'{4A#,7y (ʻT[`љ@P@*u2[4+:lEжڷTTuP*rTha&?ʏ lUYkĘys|ȲɰUG3NgLWDƠN%:MtF,BdDn/9q&DŽa/*6wb89KaՓi-6m"x\[G/5ѼM`Q["T`6(<ϩvwU&#'dn ͕$n&x=v%^O0i7Mk 3'fM:O>IyoGyGb0aML`sҗyay\qs\NmXpYh25~x?UO>5$kv]4i%XwH{6<<$;g\}qiw65XtovbD\A:_YB۬ϹvHkԖl1R5pmyȣO#{"yƧYm؊{/,8k1,nO3N;y7`7/z! @¯ 7QoPN߾e#}$A:uB>]+J63̕OF%_ӭE%ZS^p a|勄6^|BQL P&lNtkt }0mƌçNpmxg/9xJӦ/g :1{#L a.6x2` OgNrn={]&1֚Rk. ;_I>>d0=,Cwr&( SN=s a7ym:Yȓlw<MA<ު Cu 52E,t#xJZT]u+įTVA?]n s߃rXg GF7_Yv-]nLu%؈OXκL7Y%l,MisT\u7v;DCׅ 4 >pAw,_PNdrM{<ǽ%ȴ8%~}N+o 馋@# N)?=j;E馥!6vk`%r֭?Jw6,ި/y?ЛТIY) X:=v/bHe^]Z6@H7,-7 a4tRXyP\3hB5Yu} #MO.m ʸ r18uxmcd|nIu׆06f@qF<2ÞCXU1gD:1#xtPmTO[8=xTOL)U΁ lgfT>Qq7lhobK*0k>VkoxP4W/nBkգdeF, QOUmuH \KR>ӄZ_;sJbl8`z͊2?.ku*sťkb!:HB(\{=(Fn}th V K=С(zM@/iBs4ƛk)zO!j1e(誼AXGe`S"7Ԏ4^Z/'i9ȎׅGJnth~UhlَŽ'~9 2VO]DM~CG+ڪ"ZE`tu]K&|} 4GFҚe 9XƖkÁT[肷;6j;jfy*<G{$}1:1/\2 y_i¾4.75q>`Nݺq3`g5u۝HmJS']dFY5A&K}u\Muci/3䍢RTVqg=z:Iֈ }7Szd[Ücg5/P|Fl1VnJ\faQGdˡA#*k<4MQR߸|l'u/TxgkS:Z=t H>NyӜ;'rhʦƂ_J]e lLK!ӏ4)+@!Z_L=Н^W#LDzC?crS!J<詠$wzlJhn=l -"Σ>N9b_)YX+(MFo.!=ܿ֏͚WfcϏτ7qpOA׮t)}7ͷyPnF6 cahl>Lgo:ON;_mlZ/ tUDcK X5rB%V\A^{)"=Z8A]% 5φgkSCw9A1)Mu[#, FXrp>SC33SޞꮌIB-%*y({ŒC[ R|!{{[zisͲ/Jcά#lο'mmywGmr4Lbqep%W>ѳ_tAx4^J@o8/m v+80)|Rwixαn}GQrw˾yf?~p*_=u _=Ͻ1'̂^xo7~sH_?NAIϜG7+D:ąos,uvq:ٳkӞy^/G7OˁyAU,^xWX}FȤUYHg M4/޽1{dGiT@rPXQ3iq"O ]0gur50<6Otjkg\,sQBj.EG=?D)߱=\sOzBxW>o*уKt.Ć7ޝnٷ|k)=G /'焼1{K}g8o|=f-wd5".8aa) oeԇ[;S a۞}Ǜ ]>Ky?T= _4ԣv@k4q.9^$ yп.m$WmyRXz^eDD(%&5{ֿz ޕd W)4/%D>\S T˗T瞌^.b'뤗F^H'eR1r^J{g?O<(zDͶzln_mÆUllc” [ zjAgH6ݢ-U10@Ӆ (]ʇ:a2gOMy*NcxeYVE=()_,v֥?/-4W\uCKsaa-JZ.׳{ƞ>ࣄP,UsOQ?$#ݘqe'g},GjlڔZuhZmZ;9)NF|}QSv/a3ڗ 2x۷ޗ68[Z"J!I vkz{~{utub6XAnl| Ps`f78}ax]*q1t'OL!1kr0M_)Oi)+_"ޤc-g9/dDވ}6S 0G66P:/yj)F~#j#?<9WK^ֲkŻB9cs@Ị2 2_i/*!SV_yoYbi f9T|%ęd_`e"*و7kU -(k L YTt*OtZ8ޝµ}hj)lsiOB`V܂Je)/ m%`p>ˌ;xk&O~ѱ:89bQ Vӿx%7 for'Ή B>ZXμ2'u;.nweЩ̬D l@` k MR6 Ё"Z \YN_/ ^46ä:t/,TȒ\&kʴ hM렲asM)`N^N_RCa:Zl[$*c) )M?!L\ =7?홓|hZ- b^:>25="<ө*ߗ6a$[iy"F, n*9Lb]iWehtȣ cu}*62}i p=8/+Lu}'t9QmBh*q3E6Y&89nzPѡJR9m|け 1f^)8 !v|ɉDe t˟1'%4Azo9w*)p0E%0Ky3˞M)}'^ῄJ4nZ7t5 lU}W\ ;_OTrK:_8&|8񥁓v[L}JrD=-П,`s tX 5զޙN7x5K/u vm;k{i~Y\ ء2LҴovy3@yM~,U"03OVC@-b' Pba2fTѷf˩k֬Υd d ڭyۛQcyH~JZdxۅ_ dDX3H4m3%.vy-l !/HNF Tڔva P,5eN4VƠa'5mr#*iET0M0ǃ l áRh:dfZ9̟v;&n!n*clp"Mo` 8\t@)/c,2B (VpDck&ppskL(i+~EUXyX`yjv$?g5h*#!|4&jį|\=EpԻzx,@s}iaKyabWeL^[dZ]EeE8$;IݧsR^<Li((7fr9J9Ja+@3h0mtڈT;ծti{ƀ~>s-؟M LYCq@4hxu[}awvrذq1 12sҖ"TU)Lfj Hnir]GK4\%t?Jҩg1vPO΢sM#QxԴJeevyt8\rNXt1486/%_Ý֖ƚiQs! * mi)[baWQ"NP2uEMӔePV39󼀋3І1AMZ9Ѷ*mcP#eQm;].i՞Dΐ&k4/5*8v*q҆(\W`5d_'AR&eKͧ8TdV&K+@.9VbP ;c&ձ/$PDguFbd3TL0f|lk`,2Rxrdjm"1Q 0h$7JSZ]r`YV'"zt[i& )k !GNH;7 $m2uC"ߩR !4ײ`滼^R)^U^adnݚ7ͮxm /w!uجs~X5Ҧ+?;^*\Ԣá G;,;=5.ŲkuU;oY!ũiev׫ *$g:oMiſjoM@眯CN197|Ǟy`ݿ-kKB4Z|Hաǘbəl*$arZ*T6d3)FU>&2ەA~2l@ fastapi-0.110.3/docs/en/docs/img/sponsors/calmcode.jpg000066400000000000000000000410651461403617600225160ustar00rootroot00000000000000JFIFExifMM*bj(1r2iPixelmator 3.9.82021:08:26 22:08:04d http://ns.adobe.com/xap/1.0/ d }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzCC ?( ( ( ( ( ( ( (( ( ( ( ( ( ( (()? #UGgk:+o^$E獵}O_ZkK˩G([ȎYFeڋsICHּ?O~|dޅE_ğ ^/ҴqtGM]ZWPb)E=€ ( ( (k*7%F⦧߁gza@~MN??&;<`??S~Y/|4w[E?kwZ%+Ou9~|[YuԾ%Yr⿉GXh,!W+8w+]YYۓ ߳!-t:7#3MuOs?7iƖfk ;jg1OgA} WE>"Hj%?ៈ5|f|Cw/*| x=k>#|#G]]}RMZ= '7w&?9{(~ xVnׁon4|YakzxQÚ|-˼Feuay[6Um`|/wWCNOS |G7xO>]SHtx)w&yi)_x"L6}Q |S~?ࠞo/Gj~ttL߂Юmii^7]ͶZumcnX#U/|<߳'.~"v_g ڝnVдnIHWXa`^[|S/6,iH_?c ySY|gA/ziM |E%ƑmAZ'7/ W|/|a7Qo>bշ[^/F[֞$Ú慩YA%+\[Z7MEjo)/'O{>f>u-$O ;/ǂtZk: ɥx]gúmG6|[yMIm}eN~ߴ]N5n^5f¿f}J-Gi߆4rhgM.MJk4 7D[[^ֹK@?:yXOyf>iXm?Eσ_~/Ztq467z[lt}_O ՟gnoOٟ=~ſ|soq4-7RE=[9Kk\A x@tXoV}&OgأWO[ۿ;g$^m}G=7Eᶣ:MKk얱x Sz'+G?zB'(ag M^=ȋOukaU|Y;AӼQ]~[^_jF/+KjQ n? ?5h6&mgy}C+i}kź6R>u$i=/_Zv*x'VO h~+/|'oo5;⇌|+q[x3Ὴvm ?"ռ{G+}e ?bm>%~d|M5_<7ÏKZ񞫨xoZLn-4]'P^CT$C >>~_N/ |_c3?_O ] th:^Z閚ŽlږCrVD?Mٗ/M|o>|owo_)⯅[X |Yo#^G+]oWѴ}OToV+ wúfw{V|L ?Cshg_^=+|'`Of:_<CѥKkE𾟨[sT~4}]:,/ 5f^x6d>~h*:us5{H}B@~!|BejtƯkMgO8~/(1aouƩ㿎jO >o<9e;º /5+D1xQF]<τ-.[pۿb?'lS_|Ag^"g<+OߊmW/ x'byuhO=OX7%O\>񏇵GWѵ/ DM3R_3|+T-o^.ѥ~E͡]O7>;Z/7޹w6?Z߂|3xF>G_? Uj!Ww;gǾֺ}"ɧ_Fi+-LJeje?k~?ਿ?a/x{Y7o/࿈?>m"l5 x~|g54K^=<FiٛgsПNl:Ma5ׄP!σ%Gm[@|GhTuhw:Ɨ_Z(;|jҿş)^3ѯطF|PWo M7|eVc*BtxǞֵ]?>"ռ{G+}ebڿ_~'doH-h | uMOW >%Rcޏ=^ uCma=o@:?5w =xB|?|`񿆬go=pC M?c ǿ)6x_;0fS_, ]1xz6מ:o\tN<|%|Z|v~#xxLփx2!k{;'&iۛWq k?o ƚI( ( ( ( ( ( (?*'Tٲ\A׏|Ms]5'm+мAd[,3g-Ofᯈ?#R o'ʽ%j2-$19xP( ( (igߴo]o~?Axk?gG'Ei/柦j^XI1@?(^O ς52~x:֯)}UChvW"+ ȼxi~^OG0@P@(;ekTocO~*|[ojk.JmmOUdf;8voſ;ᶣ]k/:]Qӿc{iZֵջ,Aê|GtX!:nc<51LOy?cdzq\61@?ßRmz?!x7?lOR>!@xZF <ԼWY~?]xwP"—ZoGᦇy`9GpFGCyfg$Wm,5/$I[|-RLFhS\7˸oG49-uϧjzuTROE"n| I.$kR]~'|0A5fSaI/+r!|IAcx/GN>1e⟇ ƅj|v*GԿmiZi:udϿ#UAq~V_]_ ?xH}7S>|=%:%myak⻽sNM~BntCcj@!5=о4 ࡟O\jv|(֍⏆k~GgLf+=ޑaGtzt?~Ŀ|/YkG 2iև:iI KO+,#€.6o1Oߵ~u|_j^үa=/ͫiKs!rf7u\?a+m&}/4 {zqiwĺnrka k??'?W>_xI/Þ8t=C|l^7ߋuSXvOge6:/trx4ǚLg~=f㇆f@>,]|]oo" |O q:]xcDi>ʠ ~%|s~Ag}s~%O߉doA}rn|KI-;_uKk@]/[K U?_j"<[\w¯⧊SPuӴ vs-f->;Xu}oVtm@?ۗX}w^> wCQo(c#ik4? ig6ģ"0c~?Wm<1|~薺x\z$&_Cg%ki76 wڭj@ lLob%;Lվ#Zj(Okpjk]7]x5/ˣY&^:䷗cLFd+[?gM?k(<xUs+-*$ѵQZj~4nFӤׯ xhѾEaxOV}3c IncH3 ~2_4+ѼIoiw*ciP\+9Q&T@΀ (~aj 3K=^"\/j5%,>-Сg^IQ0CeMj^9G⯎߷H+m? ~x>ᇈ$K&|ׇah7t~f.n>TA~GW6|}O ľnY{xLni3߄tv:Zkki:*RܙTmpN~ş9K|5ng C u? /WQ⫍;þ,:mwa(?o?~+~_&xG_ qKx<)o/uOxS—:춓g.|,BtP?/_o{1|H?fD]HTnf¨UJ/ ~U}S|e7c|u_+D[t+N&E8֓yƑzu-vN=v{]'YnGӖ??zw|;| 1>4}÷O߄,4G{-r+58/ ²P!#_5? /|T m'. XmSElj.t۽OXťyt9"i?-ou/ M*=+†K}S֩^eGPe`o5['V7¿Vwz|/[k0f'Hl6Ft69)@?*S6c_|SAHHGl[%~|p|ON]W4Xדh#O/?;2oxf ~ `^ n]ׯf&Z$v3x= ӡ4F ?;g٣Ÿ#yv} h7Wς.9lCxRumkWpڅ֢) H?? #[Baw9g|tmd=Sm_IaI)-tX4@;HVDf/~q^->s C-H|uYQ4MZ7&!GΝB^+ƿ$Ocx>_?>--='Jg>xñ2ټ96O!ڞ{-Oúޓ=*7?k GI'Qׇ0]|+?|AR wQ];hA|?lG_P_^ /#xwokZME]ԓ^֯DUPg2~_?h* |S$|bGO3|E4橣!y+k1j0}Uֱ+]_<7k?O?xᗍ1x?G/ >MW>"I5%b_jV4@+q=(d`qA#P( h{㿂$߷s}s x#%gοz> p4kXD/)||%Υ,xFఓF -Vԣj~/ńe* Z _Ŗ7:}U) 0]ou 4 xszӵF͵7`L?5 0_厕x|I/5oxm[źwC$oG7%ߊ+aa75At~ A@}[/|],~i~+N]嵏?φ9b+A>񞟢k::6^(彷O.>o9+~?8c߉_⦭?w^u c⯏-]^>Y ^mV4 ojei'T~_*~a|>凉#oYҼAn^h/t}7^eͭMma{[~=_#Av/ 6𶧢^1S2|AL4i7nKu/|k:.ΗᏆښFnU_2&`|͘+xe+FSz8@k>;g AG5,+^jff͏؜Nm-,6F3'E\xÚ.?jȮm|AZ-PO mk,oVMC  ?)/ψ.! [?o؆붞4oYI8 V-9 /p ~TSׯW^"3|xҼ??tm6Tb%x cK,DnP7CZŽ/ĞӾ=f'm>l5w}zC¾14]}-0>mTO ~_4~ηZׅWSڛ>> Fgх%LDd߱f3xw~/_ ~2&o t㏅Simk_M[]+KTh,(5}JW x5~:YcH<⿇R^1|No?`N4S}χuHu[?{HkGu"fM5 o/GKiIQ)ci~\7Q^&g#kM[?YR\j:hY-knwĿk#>JhxY.W;t [k njmmq``r4kįxÞ3<Vk=oJ}?DP{mKIb{_66@>,Wk 8?g?_v ]OV?_5xNO _ 5%ӴRu)Cih餟9P/3ű>k") ) F;'ɠ 1j?ZoIf5OdTTQI'՘ǻ1bzҀ)Ϧo, Zh ki$7J. FGQȅ@—_R$}psAbx 2On[h1q繠U ݏı>`w?;ڀT*[Bzt~麵z4׶Ń5761mNNIiUoDֶbkklYH͖ UV G!H@4?4J^Ig-F F}3M"0"dZ0c u80rI%333s )E #F@)$n2*:|& ,0x-噌P[PFĻe%srs3yˊ)`&x)Xg֎x%Wt*vc c'h 3AhZKӬtwmoYHJX,-b?z;|̡}%H>A$ d0P UG"( bY%( ( ( ( ( ( ( (( ( ( ( ( ( ( (fastapi-0.110.3/docs/en/docs/img/sponsors/classiq-banner.png000066400000000000000000000123111461403617600236450ustar00rootroot00000000000000PNG  IHDR^('rbKGD pHYs  tIME  VIDATx]kpUdbwIdv(UXa~Xej $IXV`Ɩ!vBv5835;6CAd`q+MwGrYRiw=#( 00000|o(`"`````/#^F x20000eAE|>< y---c7/O r㸼ԙN?PHjV@KK jjj/j¢(>F,˔8Qjƶ\QQjZZϵ2'c3Oe[iiiJyc(t6o93lxmTǨ:>+,x|+V EU>Ⱬ?aE'GpxwlX"/OjGw_dj>*S뿒sj>ysݐeeee,hhhfiv~j$t:rh'|yy(A5#jjjz!2-zAv כ2WUUXH=BH$ ӉJjkkr{I IA(ip?/x0VVdž3Yeup,\Jy\6\٪[X%^u.Z2%ePY=-Jh^*EC(_b-{k~ʗsXيm/7KzPn  pSW&鈉 8HJA444yJN>hmmMGgg'AH1id(9C8nG8dKzزe "|>`޲ Dcc#n7\.E͛lj0`2rKjU55lya1\ו[ي/-LҰɨ|9"ΜX_.xz~ #,7"o~hiنNhD"P0S}hgMhtp. $yѭL=Eh. eb)'ܜrXFt:iZS@8Fss5NBd.X G ƴ}`irzA;J*7+o}Ah=dX oދe<%x݁mspT/Esa2h.jE="x*컱sFrmmmfC?'p8P(Ym۶Ǿ>(H$ 9CUU~!ؐ%I箮.f+I\.dNhnnp8 Yi?օi&@葌 Ю}hz7[F;| P"bן)qEpәdlԼ<8w^?ٜ83C7L8u%X[)??n /Pppg =ugB\`"ɈO`vm|c\B8]Zx"nÞ>Dڿ(/;w&l8;:\$i:y7ݶ~ǓZOmZ֋ }!!μba!]L ៩BՅU[UV/b_{ߠa{_.A_}bQFp*6Dt!}K54b%r&m2ixNV.\gk.t;KߥB&l,![B Zm6d#_ td& WF'pOSY g;o} #:X ._>M;^=Cflё) tL$XRvZ%et6Qux~ȰlffaF~)'>M y83VobhÐ&fȲ GC1Mc IgAcԤW$fåKֆ@ ?E,Ijkk~zwߥZX~=EA0iKK s ~Й[HD\} 4yfKo@ gamgƛ/ѽog8w_}Ddl|+!o7l2NTgD. .qz4{nIFH , dBUU N466Rn8)'yeyBjkk!$Ihiiѕ!zn[H2̒ƛFqN+zx v FF)]մ qݵC'CEɉD^E}}}S"? &D[SSAtYa<~1mY/|:6m{t|di碷Xq|Co 3 -vU7}-sqVhR1Oz|.$$iD2mz$$a%ܝi!EnuUyX||iL5TCN56 YHSL{'f}&-nf% -oޖudE1_O$#EO+`Z{bɸ鑉­v`TPr2m`5˱mKG7YWSK9R!bΈvg1N 3];u : 9¼vSYD0 LR.P٣0¾R|C2 ]R=ۻOwsÏ2Ypl^=Tdz[8R2tSTnVt |1Ghݺe[KP> R"7j@ʬZtitK=]Ɋ*) 0o4Yysa-jڃfQ̷)k>𕵇[\$f`%T@6}mo̤B"h$^-JׯvQ?%ϝ=[pD20dy#8;ʛ?2 e>0/g,GDLީ,44Di]keLo8elG0kWX߃0?3ir$Bj2y۷uL*`áj{,[ícXn#g&|IDi8Hd,h)r'U2 |v>):;(0p\0n4q_xlg A*n!G0۬䥍1SkЯr$ʾp?pZiI~}flm=4r]{?<<{/9Z怓2Oo}[L:LrFbwQs v)[W noG`ޡNpG@D!F1=_;~5גoZEeY)n'ά,@m%?ޙ -:[fb n@ Yෞ48`8mI{nBu޽\ꒉ4KګOeQzjE Y'ێd0Ϭyt"!aU'y cnG1xiƿQLyG)С}jSԆ(IL[_.ۄ -:׽} JYhk{*7D\m=>4A!^po̾q{;8ذ@c]<*kʯT Eaii>⸆᣾nN,u #ݾk(o,j߾!qe&G=zώvZ@ k?Yլ7:S&9FYd{'[˧;oL{́}5 Zi(!e`R9B.LgENUw4Fyw._> ߳w<;a-Hʫ221]ڙt4 N~8eVNc5$ Z.6O|X]8iyS{>'+b%* ^ \>A%m鋥ꕟKePscfA% cط$|zW,4Uȩ=x7`w 3 U2G۷dKjCo硞9EB@@O0Z,,]Yxw~{;pHi(،,G)H7l(yBzZQRA$`lǵ&9Xhmhli*6n|keKQ'wh طsXȪ ^=(Җ C}N&Jz\DY| {Ͻn=oحlɌGXb[/gVreWr#=vb8|SCw>$^';t@!'" N A}%9]$ޚ:bJ@* *3 ~7]&|(؉1W'B9w+ Jm~UqXpo-psJv5tklYTeN\te9ENVl$geG,vS:fY8>X2n01hJ.ip yԢU4kIL'vEסaw&ǩt dY*vn9ό.G\^U'N%{~dTF9m:l}2^i;\-`lQQÓYK_vÅ j.?3ogd"Q9QP/|Li 0iϟtYhwdhO:)t,q@E[FIv>N3o蘦W2WBBHDwp*̂1؁scklV96cV0D~$?^2AiWC{YSW xU^`T'~g ki!g'Togn<\LdGҢԚ[l{GN@qxok(,wj}D*%j-4][+ZQӆ~8խd`gYg{EJ/4ĮO#*;'q|""agVT,x؂KcD Hn[sdayns{\FZmn.WmZ_EtAΗ"c ߹hO}R-z|ZHC L[M;<'cs[DR[.I}B|xE o$iǟ>e41:bY _J*WMmkqH;ޱ]xfIY1Z:%+ThA1CX1CX1CX1CX1K3gi &zr'Ol, .[\s5߹̳>kZS F厰;Ӝꯢ6P:6md/_jp-t)i{" o߾fN wm̙c>HrywX>e3qIqk_~Ǐw R0˹k~>ȽKimG7eqPmٸqP Gqr':={vٕ3f~ S.y^]믿}SSü0v=fA:h+װs 3b$eM Jݼ`W2p 4oK!@BY" 寔 @,b2i,\HT:!(nRSWWw _E`;>Coڇ,"qQc)`QPttY&1r#!mZvm*I*Zlؐ ibƽ+\q cThl'CQaT]v9' D#cq3 0K=i* ><q6 unlFyYP6Qc_j,]bj ٩ڽ.?άY D 8_yo89㫡Qqx^ؔذ#֨sTX^0#E*eTy(/oqJd1 5q6~WwEtRD,b?_vTZGw,@8V4&2NXhr60RXN1USGwIrcR+C:tׯ]F%ʼ}v"+~]3Col`\8j0FX e> ".9πH O$a7V&n2pf@An10OƇ#)x``IGzII <#/)\?e᷷~9p"rJl%IHcTZ$^T~d_ˎKjGdl#1}yB9PCr1+V($|K?wBga$V}T4h$BJ7WyG;\&ذa/ #qa2=׉i'EjSYĤ_2v!^[#L=]/C yF%0AL$y.&裺+=J2TO9T/$_b~pxk>hLO[y&Z!0? ޡ_1 E%Ϙ+s{O<I#{  eoC yGXO8\UIg}'L/ I?_ޭAH$Wan2}^C/ _Z8$#IH[w-GmЂI#*4+|@T;jXXHVr_ [ӗpF!;#iX8iТ PЯP E P E P E P E P E P EA:&3TPt0|oQK=IENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/codacy.png000066400000000000000000000734201461403617600222150ustar00rootroot00000000000000PNG  IHDRd pHYs+ GH sponsor logo - 2 2023-11-16 5dd4e01d-4a32-40ba-9728-4a029e250cf0 525265914179580 2 Codacy Marketing Canva qqIDATxw%Gu''GMNhF% 0ldA6~66yXdI a (kf43oTU^o_u9]awJ;Om{([Rԣuo׻JHVt -4itaIOݾW1a}--L34΄ s0{r 1Uz>'3}& z0G)]8 Nn5 ͻdS|+u=vy)͎WfJROayIt 9 {xoK+Wubې^-@#6 T,3!./HgqHΊ`8%RBsy2 P'T/-eĠ GzzaVOU?6ƣ6L~H0,kΓ. 1(baſ)F'fQ{(TC.MEG~2Xt4X4#yJ :d^icڄG(J>:c l& 9 ň*rpp 5L'/[Yգo}i8VprmOәYzálj|G2)SeI28Pl ]{c]4SaՃLjX~f]y*V7'Jw0'F9}dg=N_@&/H4Պᅵ9D4;'4RFg6մ饎Om{I{N泭_aL=)a v;&i K'M̠9>3UǕruiS?|3`'ITC, 8s \{bk/K6AR8ypz Mqʆ'mukՅp2Rţ*#LRR [(l!T}n2N pe+1ըB1-NT͸8N,X2ԧ ԨPEP1Jlic:mx~ TeMjdtZ q薯ī^^qۿ<Ͽ5X֓$6tIZU?`8x@p$P:Zh-2xj&r=9s6RZ:їϰl&%Nz2G"iyi ^w-qmQi^YYWĬm6kʃW<glM De wx5~$Emha7uƔRlj+ΛGÖ09VYZ]F֦ 7pU !px ƆjNk(Ut>>2(Pg}>?feKVH/Z:MCﰾ%d1$RY9\r̥d _+zp- 6Zj7&1Yy-]9ꅉV ++ϰgKOv1H[e-ߐ7$v~geTyE-DshqMMYn Q@Rc  `M yEź1vGID µBm }~F$lF# DUPTP%^*kx\HiCoZg6J*Tt]2΂V)~L|迤b˱[p޻S8bg7^?א/^ٗ΋<*$4^M>611Z__G:?6 L*Ey3ta)Pmii8 wreAUP)8{-Ae/rb>o nܬCc[Ñ^8kS&ti\KMgԥPCԔ"S2b:VVpIԼs ,lq@t1һ:tj#z1󖶡oo(`E;l)g{?n1gi֋nl _3 N_y˖O_B1v64gypgՀɺ5RO\Hl%GF^4o>0'(#BDh*pM+in:nSϻƳ)j27K2; S,a8Ol%8Jh$K*(ECLpkx Q@\FKat: h1`С㩭)jiS(*P%4=imhXyESK5 MYkv1q6Y#h oftدq|̑kULq|j-k`bWhn#{߭W?8?QS.Vi,Ӹ y.*)F'q2Bs{׬͟lE%dr/>?ū޷DPXi6]otJ PEObzڧnF;> zT6$!ZПyoگ(b2  )u F^C2$`iwhʏ+?? :VJerQeC D9+ˑ]hR\e,=gFDsA+e|h[tF4z@[3|*6C JqE7Ǘ_Y뺹Epmar{sTsO?_ nvwm/wh_FfyJcܖg>'JoyObl?Gv fLK߱qv?q/G&?̺K"^Aza+ۭ5MؐΩe]ZU(ո<:ZV]߉UJ,ao\PTi äTiƸ*A#7[y($аduM$mJPeڿJFsGވ^d)Y|zǬbBBSS06R &2ebņ.> {9]ZE-;8Alt1u7˻h|ʟfuA)ػ2MG.!¿s)v2.[; _2.BSkƖ\k|v@{&F+ی_`ݥs.x"l Hi6ROҧ;;  Kq_{>5H#x .j4(.Lq&nHI;]YƊE[w Ww ?wHS[.zUG8)Ce?.B(T |jFTAh%O,sid7smܴniQJR7m<3׮wsN#n:)Rk=>_}d_"_=+r jeVZG+<8©#&mhs]_֎Na^F'#ukb\Bq¾}rSGkQq`V7yӌ N2cA JGe2 xVVMǬ&FJDZ=CT^Z_M/^By>g=N/!LkfbK[.&Wp#o꾭}|o~qlؘ[z$׌%af=-l950_UOۦ|s}}fGdry?-,Ϯ8 ;8}x4J3x?^ Je5 Ԛݟ}o&}J;5gݼ%yL)ַF%2Ht.Wr%,wz;|e>*ݤ]=Ұ0i6#7?jE* UMDi<4UOq<=%ē2џE8KL>1chgYvce>8w8J4{Q e Rv`N˓]T6{8¿|S>Y"O .2 *n< J4Ah2̣ |F=@?h.m^SSPj>źK0[(v E 1xȓw~ T%H[?(ʦkJk*zFzWkRog)1>xt.)Sl07nSo/2Na Y\)QCqQZ69R"q`b%7 Hd$62Hv<|{Fu5Et Mlҷf]#}W &{b=1:H[20f?Gw|RŒ4槏Jj /o3YtyhEIu)y"AtCC* dK % 50PΒe?! :$]km2E=M * H O*_5: %jJJȐaBU)R#? BE"SdId101ݓp!Q _Zh3BĹ!64mtnu1%+<6X{Ͽ!Nby$5L5j(hգ͒VV +],tvCt|BXjNQ@jCfb}KX ,Z\b)ل hr)R,H39$͒5ISƩD8U0&eeDRdxAҒOW|}tOA_qkrK0wY::'#%NNGx'atac]Gu$P 3X{iO],&vnLz8_T%} $*slo=Uϝ I1UETU(Y&T.2( D|O.B tFƩr 3dq IMM.P)E62`.4ܞoGa&SxEN2߼oD6P4LfrQF40J6򔃝ZeUEr+<,diUy>D(<5ҕ+ 59q j,=6DڽO轂ۧ#=lcɠcOžQjRs6&(&P uUIvUf 1e az4[L.yt8#]$U@*CWh&(%2#CYq)Q#C/ wB( Y:x;j[ByiC9t@}82?49a1 8n>lMKL#mH6Q^<[+1_3iI{}qOktzZfCnMxiGKݛe`U;z0@KD35 g1 ( ʡa 䃊/7MR%j.cTMv]. Z"o 1@.ϘߔH-!H_ TZ|aZ*YJVڄ3£j4)] Eim) YoE!އ᩼-鏰(?)Jk1:|&."*x\W#Vpj(Z3)5CP\F(S1!J0%,1IaJ)gTʼH*>I4͈ΡqZELR0V"Ls^fPqz1h&0ipn(cNѰqSp|څI GNJWO^;J7(Ȕ͔6f).Дn2dLUy BM)r>irГ+r燫x4n&Ǩ* Y&|ZØTxum;M~_T~hTS'h"=+^Ngn S1ֻ}Szd49 54n1u$j]Ӕ/VizJ#rƚ^zoa/_S gRKk3iLL.ƛFĞi9.dV\x4 Ǵ$ڝB52La9SKrDň*1 LP-g ݱPh-b00FƇZ \İAucqdӷQ֥oE&)uDU%2RLk[N,~4W艑"iIԑq(#}nnǏmS:t[(=ő3)V(L٠pp{2[2,^TiH&ǻFe%1c#LW TL| X 3XkN/J2^gc7Qf|D_b[ UdUHb6;;&>)XGvaN"2`7S3-7ɯ-_[> IR?.0Fv x(<\:B(Tl P0Bq* 08*R=jcVm4QeѺvںd]xbڼ.^Mf _~?{>ww??7k{ _5;: ;ՊՍo~id4V]463,=C;?>W6#{9,^ξ/G6븪UG0Z +==l(wGMD gǮzB,Z x52y\2!JT.McLU ş#p(+8_ߑ%QBUB0!\HrgP&i!;z~ 8'1P4UeY<+ Ȩ8\~".yB~ս~| .E(MԂFtThɲlc';JyWF@G(VdGTX9˫>9w s͛|;:o|,ko\Y;r)PޓpW ,Fv3[~#[9,>}O p;xr6ٗNq5s8 KS/On8R ]N]UĮJ]=q][I Cˤ5nV@Ih 0ApPx@A\ƨL"uƂ' Y^8+ĥj 0I EoPkhrhf{{&Y,/?>gBF{'ާp/RZؽןEVn1g,mq'}ޣx]@C4xS[(C|ZY}&8K?\E7On5lCqoukt*Uv=?> @CK?ѳ>zsX87 A% /_@sGSE^\O٬xF }}O',=E+ n]ϑ94Ε[LkWj#Z .\?36믚c8f'}wfs|Vyx%O+s+m,C Q,gEaJ,RTģ"<##.yg'~uܟuXrn U)&F\~".q|IO"oj<-,9rUy^u>4o?e.}Bιr<]+nV(U8ٔk?ƥ7.db쳚ɮ;yZPO+[ieK䜎H?_)7/tx|(^4!9<]E/ϑ#M<{)2tnێpW`7|r -Y1%L W)Asr#%ѭW.ľQ:dGos.87Мio|s|痳t^G-d8W~RjcIW7,'!@kQ3$̓)SHdD%KK%fV egr FU 'FwIU8&CCcjңO>2z "dd|p/^W-ЙM7,ǩ'v+>ank/˼$id;?OC.\4?_{S6 H8z,O߷I?( #I~__Y+l&d]Cnkџqp*‬݇{p-oؓ<7kY:? >l|E>az!sٛ#3K1qǾ%_1>ڨ- dNJ=ʚҼssk)hIHHj5+xb]APmʩ.ۚ;Rr@3~S ϸ&cg*17 id ݦ*\u2.?{ 7ֹ5 Pbqr'5:gqzx^>z=n5_O޳s=TO=wm\ucMb.m{N;*kW|U[A߼Ǫʑ. ̕/Sts1wG8 / i {=Lg7x珜6}9@8o^M/}9Toጇ,Ah|'kyuK^T{߲~R@t'd>/=yw"0ΖB4/ QPv#W[΀-1)GУ%'%2DPfA8Of, )V5"ՐIќ1V`mkmRocI%r+p+Ie5g}+W"*bƛX;59DWz[9Wo#/P&\3ґt277.њ yU_> :.ި_rߗ΀b緹3.NWnŃ)w.{>: J9'."a)Oݳ }\%F=;W'i;U]d2ؠUa?k޸Sn(}TP6R/BnqONPL Lk}fdDHH%@B$BZQJE:ҒTN .RT$Ж 3aw3˥W$oI2+iCvȹX !ha? Y!Th5Sҳ\K$Bnq|RB@P!ԥ{X-w!H׺C̼&dbr@yZ9tRWO|8lr47kS;Lf"N&{'ek_No{Գj]1s"tEh*;0CLf,sc}SG)iIȜ&5 y.b3C M>z&CĈ2GcVuXgD%-', Y"eT2[ j& 7o6󃟺Ԋ q'5BX1jzdoM%};匫j {G%X`A'Rn]NAC-~lw`Τpi 4){ADzH˔}rf'e~/|S)GoN4Myׯ҉"hH[BR"F.MZ8)qV*D)(չ2.jJwi^ bahKGTZdaDYe#3Cu eI:*`$v‹n:҄Е' xT;#$G]aꈭJŵUԥtxu>9n$_4t#oN@~5 aZ"o/8Ȥ|O}1::MM=2эDj$p&WēV [?Z-y<:É};>ߎC:׷\^~?%G-jyar ~#٘uVF[ąkB߅ĎBC\{;8sr珝o&RZYȾ,(kj f 9Jʬ$k`Ȳ)yOɚqK3 Di _k\9e%ʲft)HJQB'Q>5H YXJ1UגT Ӑj="LC^nG|S*C<4| o;=#piur&`״pOg&vI_{-' NfoAûQ^ƞhmW Sy9*j,kIcmVއuymm;Eu!4 *Q*NNNBY bAH"C¨Z˴x.p+ 8BGH†8?}!GHGVKF<;tXԺQ2pZ9-񱱐;.eZjXR1l<{ %E ֌~5KɼkӢrp#KN׬0Qc7rkk}Svg"=~u^1v/u{{*&Wub1ǨKWFta FX֡VD"d3v#Z0rYᑋYɉ11(9t"'#:Ԫm":1,#)EX-_"׊% |ЊL,5tm.\aO fj7th(jZgRj$)]l-t'jiI[x@KU1 }'‘J wT"($bZԹܳQ 2Np'28yk#Pm/ 7u-q˿}^ʿ&IǺX6sB}bsiCJ5(q󉜲nPR*JrPjTG.dQ]?yWDRV (S;>Ik8ڌh:$% t' 5`Kr耣Ҧ!i1OB_ ZBEYpTD:mS:aKa2s dMW>UThE"Dh];l*^P9j;ȖkcbnRgDGLڡ`rϰ8^+%Zea[#xX6fsN o1FSrG6Gj'OtzrvdHcdOz&uшKLEAE⺥Z83oo-P" HrCJ=UŰHTDJmjބqsVb"҈CIFL%d~j|G[Ddk}.diU_I%eY2|`DF\>pP2r+%Њ )CJ2 '+P"&oQ",/o` Zj$iNseZ^x?6}IyOӳ¿\(?a4{s- 9Y;S[JRl%&'7eScZbmGbm*J!}*Z;%V? *LGN*9A]u1 }JRUs#=K\)\,W {umuS?>nNu|NYV281a<@t8!ѾVcgJ &W9 Nո{k w{ǣzS_7LߘXmE!@ɣMp FYb('uF, K.Im/}9,-k06:EaM.>Rq2{DŌYm6q-g$s{4ՀN+OrzH7Z)Y:GiY vP[|7mYf ZIL T[\=9 m&|WSIWR}mD{CMS;Swm,@bf(рDQQQMB"!} [\<:2|:.ٹMr: - j9G,yc*,"a/H=;V(us9昀Pko}r*sPiZrb&r}6x&py$Z <ԀI3~w>߷ri5>81b=soGXiX+ܱl%4lX\ka/"K,B1qs{^ws*,32V[]?Bu"̶)wZ-8ks!р+lcbM!ANôPHY&cKG"b~O;+ &;Z+qK&PPRA%Z[WOi=׮Vk,( ] R>cPMCW>Y(SJ&91QKrAtyBxBYs8de4S{SXK6g{63n-zTL2I/) 0KD*!NCUebN/c9 tZg4L@r'IBT# KɇO޿G_p#䵷gܸ!^:.TLRTBr"PˊQ3uR+Dm6J 8f9i ט 1t>١V,K<1[,kƌ.9iaTʂ1`"wKųڥ#Ya Y P(6kgP }}!`S66'9X?[bTPX]$BXcl[@M! ᘞo:;H:f(;jH3;fCⰶGBev(){<_ G)g-y7ٔY7qXJЅ"{h[jXG]8T!֬1"J Epeg%q}NqFaqeP+ZbhOzXR&ŽâCPf+LzfD'4ܭ!RJu)52pY61JFD BUJI} KkbE@GYgD_fiztX н OLe\5;D~RiGJG#V5SΪjt\X+蠶l 's7 J G qfLDX_`Y6yQU=ۃ) + 5@ծs= h]DKUuТP133yUPTUR$`}l8CORNH̹3;HEIQ@&92CW iY-()ʈaJ:t}=" dDʢ;JEx4xv3ZgE^DARb 0q~tRL1@jδzZouk⑋QM1ڜόn@,#"}VtȺ ٢`%EO~s&?MMYzqc,C̢$,p4cQ%3ǰn`{1ϸt^ULg/rV֓&kGţA8g9B"vRՀrQ5C(5@KDilAP{'몽R92-L)XiFQ(2 3Z($Dk:)킻Dxc$dvP+f8Kn.Nb:T68*-:DͿ$I{Y3rX3M:Nz>mBӦ'~$cMT7j:9Vb7^z,Ȧ7)-&P#"qғRFHi:NZhOmr u)jA)тu U.B r2! N:Ht\CRbŚniY1tm)_J秘-{ⅸ):{ǧ|*ǦDM0SV@,yUr>W=uLIyQ>4Ӧ b2T 랋1}>;")- MSjJʔhVb%xdGۡ$}bE07xAvtXd,€;k:,f8͐,9~M# I]r$U,h{=ʚ30hjb`y&4 㪣cq?ѹs<SBp3_ (}l;UeUa텬Ԑ #!(+Ϙ&^b&#  `~ Rj+7։BR}}Cj{WyJ q޵!c%EY`sUc A\;7{|~RTz2>`*\ 6AJGCRIHM)D¬D]-9͠p.!zV@ˆt)9LFLH@ӎs!y)# -2B$nC7 eXQIۄlaカMfH ׊e@N0#o=(?XǍ< `ݤ~@*x֗guJA汴 IX pfɸU!Mc AO]ÀS]NR=y0ʹ.6QPj[>/ִB^ &hShc!B`ߍ:؋ &> :Pc{EC|9<C#~|.s __*rQɐ ( !\sHZnn"zQ=IY:s""`!P`V"IΫ_2)}JBKňMԌsBV!Κ["1*Vəw63b]V}8n xW)0eD}An1ºiUn4097=TZl{hg4S>Cc5]S͚D8ꕔs .:Ԉ.n{k;J:n۪01=f<헨ؠK[,uR4i.{{\Uct[z/pA Qg,Bd!1c1&DB 5AAA!sP 9Lp&'+SI@rH@(%HPr2*PJu+VH%]77+NE"En!?sJ? Țv]pS*u#Q_opR>.DEk BeChِ(K~#(C !p!uPp RJ J j@ !PKBr.93!\!<)<)\I R)q!_^@KNw\݅a!RTKv ȷ_x!J4pR@T pd]ۃ X:'kB#R g}W57% |!"b_0BRJˌ 9@DdEs  gJC` a1cB0RB)5 bR |AaS!* q8 ΙT\I$WJIM4{"G9ЮD Pp|GZ8y7U! j->{1@gG-Ȕ>T/Z(巖N)H)=R(DL 'EFzW^7~.~t@!!(C(cPMuÙ~DuA?{dC @B l:|h|sT3}O N"yØ L0>.P5ai=B"C6.qU$MT yɷ&`n;Q?[AqO(r-yTP%3FP"#jP!2Jh6JBK{P,h` ';"_6Ȱm;ȟnò D57M4;f+B<1D@^}Py+Fy+O4(`D0)%àԠ&5LJ-jZM IŅd38wdJ %ROh B(ʌ|z܍C^ P#0 8T>}Cq`y|]Yf}ʀ}`]1|R Ps?c[4CEHЃ_M]Ga|۞~&O&w RI_@[wI (<'06b_@c&D 4E &&S"*1!\sp;*vDž N2PY! yYZ1}m.b^ ͫY8_:C`}Whԡ@f1CPy(u\ ѯ D^ L,kM_L (CRO|Qe"t} FcB'M4 0,bXX Q! b\29w9s9W &q@(P/(chCAaiU/`^|RP(|%v|JNݬ*ԡT82aB*MM( {+B F WAڍ\;MuIf 0|B~BBv,*PanpB@kC`4M5l †C(5: +(# "V+3~DL6o g <4eBXezv9s]o(~@QәA DeaĴR*%fq<Q WJOJWJM$(P)\݊|+a(*_+Q%!M!g;c+ ݯm]<&G?@wp$<%#D!40H%@*K%;H_A!yVD@G6 _yskϤ@6!w!0&,;ڛ/=;: +VeiY3I`[6xF? 10<詘`J014Lô &!rT qy9;R3u#|Bj !(n.AE*98AGL y%:D⏻Eݝ:bLgU_zy}`wnȣ sgK8h J oXKVzf3!;.+%eEҶ.(1aiڦefL2"#Kz _+)JH)D, :))rgGQKbϢB6\*>N!8)Bzƪ&$u,\9RĴL)p<) ! R)%\ˢRCZ)RRjPcue7m=H!fm L$ '<RJQJ[ڛ(]yFXHu:樮teeV2ioh‚R9c˲xTR D2J)Լ]ߤGyLW?@( Km O!PJerj)e&%thm))wx)*@Z3st#lGҳθg?3nɷ{z#z]6x{K[sVe*MPť :ؓ.~b ;Sol I$x" Lf3a5?a<5ƌ0  WDMӲLˎc5mD,OP1@y9LFrnY c0CH&㺜tڦ<%XL$c#EGGs}vlܤlY?aU]IڒR")q zK%-7v+/yV(1cE<9g18'PJXVLZ˗35`l5+Ͽa5c'䲉d*0ύ'RJɦRLWgkK]j>}GiUCS~ۧwuUm!l[kǼtA֑S;?ʫfgŅ@qq:Ӆ+HBN.W.hok)" :X,~ noز>ɿocy'Λ?x]x?^`۱ښA-OQ+٥ EE1RTggg.-,,B2ٌ! [f~NnQ䲕U֯ k9'㸹啹l;Y>ԴCJ*H/Z4+_QVth -`jf}maG?IɃ&ч_.^LIⱘmD"nJJJO88 0fc=fʟ6]n38窫ܶi'| ~ mce\ǩS+Hlܰ^[B!~5646nSoEUѣ5'?bS"G^L&k~jՖ.zwө7G֮nԈ=x?b˟y݊U+W}΍ŕ=68 =nzqQmu>_~8榎m^{͍S8IJ+W_sZ[d= &j(fPPL(TD/"%0Q( X`!AH$$ !u8COڑ+*.8뤙y~G5KF^[SܖNIXJaJ ԚUzezQ6 j5X*dM=a߽:<\=F\zXqeI"]XsC Î޾}44՟~ sκgm~{p]O>t?˲1*UݶAlh@{hD{gs2V1֦X,и풋nt\'^v\xo¸1VUVryg5W>d!SFNKo>jiIe+]X~~bk{#T)NŅx~-7=pЁGSyW/r9g]|ۥWYw<2s 7]xiSN;on_[[ !.v/=(oe`L[_][3oy'ѧLciUJQ^^Òe?i֬{?9[nJ'+K L9!taQ# !_rQ#3ifWuoi<ƍ|ei3ç{Wz3ow~a--m]]qvκ~5^s/,޿6gaC'Ny˶wyѹ{M6? y8g[\rjq= f0H/pB(!FRJ?B( "L& " E B".4"(!~E]pBNwgԔ=~ux38ѷ^yJ"RΛ;IChhs(4W\y5OJJԶ[ {jmk}ѿ%bM^_lmXnc,G:`pGO7\{ !uu?s/:C1XUtee't kOc?aCGx\`¯VZڷON/xP"lhvםO 4 !sgw^vݭz@Y]ݻg>۶m>R"TҶc0i7n\[_u߉R466TVV;:lPS3F/r<0=##-c¢;jt}cF磻lko׬[q-B҅˗/~{Ht+=!B[<]Cc>e57vi^8u7ixb3)Egg[yY?z=s1@\>*d (bqA+q+,^[cqەuRq47lhmk(~߭x}:j?ϺiGCW<=+g~w̚~Դ>oc99| &LQYѻOQTTtqc h4WaZԴ 6iŬXŽ%X"O&d2L$x*KT(K]iI2p!᪘#r1HE9d.' PJ2=7i\nc*>;w<}w!OO&NޯW^O77t-WӦvÏ>f;n3gU޽~Ȧ+RWY븜󊊪+['Ǎu"H<Ķ, L&#2 =;:;=1cG}WuܶlKoٲRO8cֽk7/⋮/,,^~)'F +ʪ'L̳?#ч_6-ݲ 'tF͠a`f*Uto9yTܼCK˖/>sSSYYv/&().Ѹ>~Xt535iҡ79̩\7f>~'>ys'Lv]gM^q:{{Cm<BH! JcEEֻP *I&SUM&;oR**X[g^Q^ֳ߅@B=c (l"8h>aB6c2l ;T*liiYv}Νer!|gm1۲Ey BV3lm ˗!zg:^ec~XR99+,(`#(-/k= !Y}P1n;vZ{L&JJv\eʲmE<)3BȂtv+1}H͘nm<7)vl75 R?۰TWt>(Pqf4"A UJD%P+%1R3) !BpɹB .:;%w"/f!~l.i2Rlnj\nMqQ}ت%Kmիwy-@6o4~\߿uaCk|Ss|m/_ mƵgajC>s/,{ݺ[u~?r[{_=n`L o'G(**7nPÐBu[s̗s>dS۹UKJ%KvtM>x c^6їjI]ÇQW>UJӅOo;,˞+ް풋nLx.{UgQG|5wr~YqaA5~XԌZfYKΚq8`hFZRO=.0諯=fƏC/Lk^yUMxb5cFTO)=H6ߺxɼlWwRߩG_!jbwW^8w=gwOaFZ(--innj(.,G?q=,[xㆍ5@WW$ͺvoOҼ}1!k׭LW䃎p]gp^kw*~Z,xakgU_|i0\p{c/6l\s?o\~jq9,YpUKtg|yOsgy _EJ79aҳx3/d*qU'aXL өT*ٻUTT4 Z3SO?tL*!P⋯ο7xՙ\ >dQG6lox=Ç|`hV{%ÆQ e12aI66N6lhy UG=K|9tҺÇ|a1sLy! ή͛6pSGo[os̱G7aʺunn=ȈC~= e2$0 j4M aD@bH @"LhPc1ədLp ΅`kD`Rr)\OR(%瞹NJJToGvȻo-jΗ 9|nAJ!ҋW:Ga#|螾},;6hPy?۫ZuĔM;w<Ľq7oZ#75q2x 898ر/֞=++{m=ؓ hTzzn!7t vN_u&bfR#f LZ>m"drD"yΘe9q8u9MM/xħ#Oz;Yٟt֙|˖ϛzuW9~߲Ҋ rN>O:{kll8#׬]ed@Vn~ޢo羉D*Y.O_^o䈱s}l±cbս46V^{R \2@ ꧖gL缴/h;d2fRD0iX%%%?,GϺ.wp3կ .#w}˟f1fv}ݎ5e!kZc_zلX2aY168ͼ˟N2ʕzT|G+jn2 JpyxƝ+Glܸe{uԴ+Vޜtӟ۲/Ҹ)qsuªd 7î`RMCbHlD"\aO`&ǀqy1s7`kD`B0%B0۟Τ*,V[j7-\4߶mu?_|:hƝ3N{sxy>|_|e'[\VT(ܼeYUUDAAçtno}QQ^R&mu?@u]9~M-wa[WJcw46Mh=*+((HmŅe-m;)()mik(UP'mOQKJTe%U;BU^mx<.(/d;|Ҟmm%% ;FUVR`9%%u7_l;}Gm,B)hm2ĥED2QP=߳oWWmҸmBdPuE め+BrYJY-'f3l62- ]_Z7 zU%aRb l D`@H. 6e)G7sZ+{s~5\5fTA`⥟A8=p VW] 4UغiN 8cfI$@;7f)1z)QUBiY1Ӳ +nX1MOɮ,sr:;gliViA^.縎^<tBtfmش P>xPl<Բ ^DJ& ,q0_i@;@a'+1FTɲ[PtEu1wl !:ڔe^aiR" % `2]<<\Ox<<xqܓI%tkiB_`FRz%W1 zR 01 P>.&DBRf{ co(P*A؅?v[UvAXE2_n-F"J7t_>OՈnblbL5.H)uv)=) !m{[͵]=~ϱm\U?۷ϭ3o>|_Oۧ&M[~F^&bD+AhiٖmeZi۱Yv1M.!rqs\6,rR:Rs @{L0j`@d6 "BNK!0D)BғFRjP1A!9R;XieYmIM&PKS`$rLyt=s5(xyy3]əўf GW+ɕoƩFsv^Сr?A:NyL%:8ik#wt!O,#'?Cd}6?]/DUaBJ)%c x{g{oyEEe-ͫW0UU_yg2A0 ?D!R ;(DAM˰lˎvj RIsb,ôL+fY1ˎv5@. 0*eV%}?Tҳ>]̼<"y1\@ce4G *VŇH@m[N*E =a *!$J(5&_;}~Ûaw M>-c0N N 2D/v,fX<OXvZ1D-8lfsN.2a^3GGOGy ݷ/`5T~:cL^`DCoS-+feٶe6LlZ@-I Se zB_郂?UAmˊٖm[mEm6&$q9v \s]?)G7tEl \Ep|GhC:@EB~u{|Uc[+%E~㙰L!V]aP ?:qwZG{%iebeM+%  1]&pL;/6@ؕ&@~GDP0"}ņ A)6:m1˲m+f۱mٶia br$.C9ss=qr~lAr)9(}DsB%JuL; vTjxs1gjO?1B$n<5~^<-[ybbTa|q)E0jVT)uIQM3^ ad1%%*a,[3;31- !'˄1/41>' to ;Ψ$nBe"07_ %HOy6(!ڍ͍1ӌv7V66-E,8ʹqxnus:u5YܑA`J }dDw"_w3(O3 *l"nn ]aMvc#HE=")! @ߒT7yvޫyS!o@[RyBR64Tz*6 e|<˲{Cm0CxwI)4Ӳ,˶cXܲԲ%6ݵ- \o].9I ڞn+U*dri&-=!c|CsXV+q.pwRS1%ƵiK7b#sR[)D^ sSM$hNDNq%;+WfOXcV a1F]W=޲ǻ>c8>bV)qe96=tS-L)`WP,kR./r{#!qλ\!JS! 1\$Zm}I c3́ko Y~M,Neikۊc)+up%ɸ0O(esKn%VJ,,\ eғ\T`3 >Aue RʿYcWnxEۗ}djG,ScR#QmҤUL ³6#FfKB՛ _$,q(C7X., @;~ }E%eQ%:>Zp~uL6>CC¬T4h\wsnёqAD\Ip!'pa-( s?J5V]4^]gcTrcbT'  tjScиDz|/ W%35zZ T qn\!ZB0HAf$37_JZ! @ Lp *~hEИC E%lf+@$Bjm|In^0iXߵ޸Aw^2ɀB5k-PHPDIENDB`fastapi-0.110.3/docs/en/docs/img/sponsors/coherence.png000066400000000000000000000663561461403617600227200ustar00rootroot00000000000000PNG  IHDRd7*sBITO IDATxwŕ=3]~B#!:7B!qRs qn7a0FcAdEvSbm6-Г33ˆ"DRdJW;}Rі|Г13n!`X $Hʃv{;ZN5g#V111ss r`9p`p \'\c 14c1Ff 1!X D\'Kpf73x 0B#B(J|pMY>У#eƙ`8"HR\O`zYIxN^^{6غ7=ڡfLm2S3&gۨ<nh1?&,ABȄk]@B!HD 9s3ʁ}B1 %Qq*ʒ Ȑggr[D In6YٽɌ&;lXfrMMέn>ӌ+B{1@*0#d\=l $p!Zt1!Dt0brz.fD H;ݱI m2s[0Cl{qcҚ]ᖶtSz2Ӕ697[)p6niLD3@Q1y1@P40" 3*b-MB= & +Ģ#9!374TJ (/*0 dIq:ݵѠroGO:١fM}233nfS^+7 `_D 03B qcmrJ.SNU/51/Sv6l4UjiYc ƈD$G- 5;hjnssf@90q3cpp 钿 A#1 1 & {}^,y4n8p>nn#&H(IኔtN g =cY*+"ρ`" ,;>TRKF;~CE̹ h"p\\ÚOahcTɑ;܆ AXOT#f-(rA15q Ip` Ѵe橥3fqVx˜(y%W"4ʃ=tFZ9F LƊF3XPcb\] Nc`'~ d 5W͈"dːh:1Hc!XIP-,sJ5F hqY}, AS {(۫#j~XA/zTHCr П 9276@>ް K0Ar*a9>"*(ʊ][FZyW6ӏ/_>Z=OS찀78G/#6ILtcBdJM]es\:x]8ZAnZU.6Lnpo nd<ԺRvM|b2ӖgTg,`XbtD]7q3.+Hm;Gѡ aE[CsG3v6"IqpcөqSU{JbUǗVO/6Y{{^9F:l>M8пmw\rF4',+Ǩ6a/"Q:0QU0.S~z}23=l #1MZ1"Dr"#$Sl/+yb8 TkL.[py{AQ`\%fZZo70>. [0YA1#b@ǴG!@+N%>: ǓO= ym\0rM ̙3g6^p==#~^|iqԺlf3Cw&8 @ =~G9RYUe%i̞ݫ5FƘwG#M09ƨ=B4nvhmݰ|#L,c6PPBAu650k*g7oO|-?s, [n=,TH4BTDl yP8l6ix~S&NRj`qkٸ_%'bθ$၁_ex?YE=8?@0h&!bT4csX1,g{kH XP$'&>߬96u_ݳod=؂y~)h݋~-ʋ۶Mt1H`3{.%0]d(CʤP>t˖d9#.j]/xvߣ%IM\ze^sg.=[]IeϿ;nuw\[P Լ~ ПHh1EA)ӽaA1&!BHNä3,Iϛ1w7?_kZryK.8x VdMS(@@9d3j6u㜕a4}|y/'&y{<Ҏ`FG0H7匦S:ڳsZwVTMq9PWzR[k/8A3$9XUYݼf9@n@+W?\׻W7e0>A N?;?+Sj1:?('( afsIx\tх|+矿fjnooK^;OK/83k8D0\nnh=kk'#iZo #2>\CрF0"KU\%FL3M9;A,SE<֖/^}gwmYp%d^z6kLQ 8% GÕՕSO:!:e m}|~w>?h9R^"c !0MHVU\vYs˗n@*r)a.X՜so М@3g֜ 'ruuuiiy($y˖%1UYQʷO8au׿> UQ66L>7v,>瞳 666hy|m_Uepk7B#9c!_|Kp3{}̎cGh1F1 Fa|,FhB'@, H `2( ctxhttr9LCQҩL&( ~7O+Ps{^MN+%i*eC~UU%I@C#q@9x>GuˢNЍ3(@tE`dx4=&gBq00C"DIn C/ēNzW2pizzߵlf`!ɊyHu=ME;u=ǫ//_nӺ&UQ[OlO- +5^-//tS&O{D uu>t ~8w31FD"lISad2<~2?WYpN^vX5ygE~ͻ,ڣ󜙄1Т$ɢ(  [p}`GVM8%W9c bRf};`|12q "T=H~k 5]O.l\U-]?(?6$J+λܤ&ۿ9s?/ >ȣpyO~K/t׮]sf5766VN֯m_ Jܹl_7|/B]]m}Cvd$~5W f0cƌ'D"g%Kή,ʫofMӾxX,zW ;^]S??aڴ?vg‘@Q?E1A dܥf=n9cӛLj(.XYI) y.3.%\H$_I&P_8FqȲs>6jy= \fp˚[[ۖ,9H&KN8 .Ag_ֶkzœ&U\s;s>}{k{ŕW\qUif̳?]r%k{y导t]ݹ\zLg>sܹsN\ /VVZ!c? _z)O=ܹs~; /g0?$i~aدxfH2!5e|R TyY~jj(^#8a6X :I L0"d.Y<^)N^rI=e%њㆆZt#iYӲr\i-+Gθi׎A!ƘscDBWO;,"1nY3wx<!Ji2v9~$FߗHFW^y (ƮD)?oتztTUUۿw͚O8 /4Mؽk7Q_ڶdddҤSXXUUi S{N- iBغu,\x5C}MI55p \jڃNe*+>ï}6((뭷Eaau]e)~+y;.b~1mQEA9$5םJaN&ӧ@1(1~' cR clggI`DS Jټ$*I^/b$ݎ9K.+>FUL- I cc9p*.to}MO⊵%?!~]]Skoh6}%.Kc؎][' 9C%幬:Nݶu\ Ⱟ g%t*#g~]އ|.RJ=H@ ybA1fY&t:1͛0 sNt, sΝ81Mӆ원b(SQι2-Ӵ2l(}g  @,V'B1ӣj*ɑCVtMklZ[shǟmk++/f q D 2bd2LG11|^2D={ۦ٬Qfe3}&3~9C 80D7aop{Ytw{”[|0?9 \r$\|X)hU)Ӡ>79n˖--71i&0Oo۽g״MpiY|… Sԣ<GRh,{`)PEeө4Dj4`y<-{O>$y ->cMUyֽOa8P*B)Ajim oƲe4=u' Q8xt?`r=r| QvQy;]_z6\$ IDAT&p%S^RV]aRծ #B A"( dIeC -W6\N+V!pgVu~Wjn@`Ke_!8f!́dT״zvYTEH[,LE!!|nʭmX_t₲ҲƆ S`}])ep~JYy٬op?瀰H6#iFMM{W\?{ϮιM6p[z?oXQUy͞ռa͛7),ۿz,Gw]m-}][wߴi˲(oA gήޖֽw}ﮭ[^~Z>۵su_OoP㛧zigqx{Ghbg!q㿍dk$Bb$P[޶%>:9BF9Nݹm$)H쫩) Ed@)!\Q%!QrJC.k-^pe8U-rEĨg0FEŁBV%d_Yq^9cԲLT)e.%\N$GvE{54BHqC#-!Lp\-(+ۗYn $ICV۾zn~h4S9t׮?//_n8?(?Ⱥk/y+.W|M6} _Xz m7|N8ᄻ_^.JE}.ȉ88ީr5Wg}Nͫg}֗nA9,k?Z^~gy/]bū6::zι|s_/^`-=nƆg~\nW~aa(>|³G}H,jtS"*;ueQTp#Ĺ,2E(*r8<^oIEI̙iB Z`v;%$*/yd־G#1s&sVD1oi|, Q-1 Zb9(b"'S{`d,H+Eq9絠?r=?{뭷۾o|[O,p8f=#ӴprYs%PWw[g_hi?ʒ;VP nrp7 Wt)DpUsn*e^4 ,K<Ϋ&/۹`q pTc[&EcZW]us Ӧ6d*SgX)G"1zYguם>(vuӟƸ9P.Fc~he$^xk3OVM#\.Ï|/pȞ>XU==q&+))Y~[ZZ|K۰q`m=wYjjYR6m_:1jmm}饗o۞{l&' #>fx(xɫǼB,!b&7L+⦔bB2Iϲ LkVtW08nVme !H% )e NBe5u 7/|8+3O֞x]n3vR666|ɋ<奖kKŐ ^tV4(@HNLfcL c-~Okvᅟ3{-~0>ovAؾm3^yեKϳ/ ,U`h]H;[9f4_=ƀ218乷vMk_{Q)HhRcìK.Y8wA{`׎doP:G \ڪ&%Z 1;OVL*DW6.K=Kɏ?_7L\i\m't#HNM3 E&i)T,.Q$7~_Z0Pa CqOJ'3.{[ Dꪫ~׏?~+rU;4 /^p8u]ܑs0 Ku?XZR"!X̤Xs5Ƣ$%Zey>ϏSZ a|~O)ETUs:P8!e9n7Dw9h,ny.?j{>o npCp4 #W R6øpbvG"h$ySY;e|\ 0F0%~7lg YLZon>nes S+J+@@*M3Bf 0pctضmXzϡ(0Ƣ+ɡdum!{r=?45߯(jŨ#[^\̎c0+D:Nט_*PmҜBckkD1 |;G8ڼyK:4+5{ؗZݻwo۾|‘80\:I2j+C4|Ndr\4BkE ,5eQÎ@2Mӳ\651f8F c\׍\64U#/a] ƸULl&ϩGs|<@##1k+gcPsq0ү->h$ @$vCh}}YYa x(J!T DÝ!kޥj}0vr9 @'R++EK| ȹnuG{ϼfi0t-HTnQkEPى1Fg=Q.8؅I6\NEÒ%K5X?9y͢(&;[ Dռ }.Oh'TCrMM21 D/\v(Uޑd9$#  @D(vW{wu{G(2Ɓs(\X8yWKKI:F򟺸T,smL=ʞm# Vw9\#IC$%{4 SkPqoJӠ%iӿo>ē_/fL DռvD{cR KyBn6kgxKX<9fF>(lb !0L`-FMU/'/aެg|7;}ލՍ0[#.!1NyQaI-x]?>M9+=,G%LSuYbhD#;t&geNgƸZT|d@WpsnCqs@9BlS8/X`aP's˟9_ў~4םcLXɕY0 8Xs^C#b0/E I~YRs9رJ-Kā؍9D7,Lt`,b8cZeYAPt1gL&eh9ЬɍgNu D"- !!2f1j12i}Lλdh\ɓ{ASq5 8|KY SF7 (B9qs4$/.Ar 8E7BUཊ !M t:06bR4uULZ-L$ˢ[N,}Fs.,K@[q,]t&>-6Y]NZ{=Xήw1x4h(,( ;p!(DQEl;|uV9I1Nx 6D z\XC$iꚖ5AGPʨea0,\4;tm3F ,"!l/pw8c ԉYWM%-YE%\pd.kѨ`mb* $Ȃ!yBG*E ƙ,(`ä+ɈsD.UbۣL΁1jY2T9I'->35`Aqf,r:Ҳ, c8 @ņj9MM2A_M(~# sdE]̬(>8Gg87"ٙQG"ѱǺKcb0fwI 01&3JeajF2U sZ$)14y9b%X].,I6 ErF3Q+o)]QlVK"!,x%A Sw/YP,a))ۢѸc/Gc6A`D&޾aAcAB1:2uf ='CrpS^E<~tJ$`\bqnqn0Q+Oʹ%t?7;>8ڧ# 3 =nR.^XA#O-60LmJYS]4g*c)0?ܝ1J=kںr;AƘ8F39cBHJI塭em]# jȡWv9dhW`p9LTcVIˌm[o|֎~c &vg³7X;B@8pBP&EM/,br̆T%b0X& ;"wtSIU/-jZ3)p `geE Eۯ{L"򠧦*0:N&3\Vr!YXg16oEg.Mq5{XD١„nZlW8Cc"G6&# b6rLC+B:$΀sN-rxwq`)c`" J4g&Ĩ젶@1kW4D\:7LZ:C##Y !Hr7GӪe+UR5Mуr Dn?0 3c[kc^Y;J}c [b0"cvGc(5k֝j2X(Aj ʍv4fҸs82䩝ˤinh hjRl&jh]Xi<}MUw_/ sMSlx}G>r.q5tqt"@,iZFYZ^42 j6[Xdž[]2}3TMȔRS03,z1& Xmͷ;*.P(Qlyc4'XRk O( L'^~ESͮɬ[U?h}?Sb%n;7igRi~#/j)=MSSm͘e?s*g`9oKl|#1g`1ʋ! q0IO/|w+ҁ9tt?;|PLsD"p B0){ su`N{ι|s|Ò8QJn;tɊ'[sFq XZSf( niu]`H׵o e|ӊQ-+B0J(y|~ x䘊2֒6)a94ALOgu+{يKuj8kb!I іNM) *ndA %TknG4FM:9L!5s*ќG8>A!`X䘊N=jukܭvz;\}09X>Z@[hNDG<l*,&շ9hMӳN(1M)u:]Xpd*(U6xNYӲ$[,D֐HFn/1 FPmǻ.8\i'":-QERY Sg<:/ IDATTjUV9|xghR%I(A QbpCBDH3%&gc%gt9#qeΐ@4(5Ym -ϿwtK: CcY1\9PZ8B#, ĎY?]LX±a;.gjG3Zxs17x8clڕϿQfcf*D$˄vcZ$^ճ /[2 $"Ŧ5Hmmoێ:R9Eۯp=cATM,QuMu !FEEUgg;`,KRg^E.™L:,z!Je_Y1&]ӛ6yB BZt]+6Šͦ뚮ja?b&DK/ Xh#sƹǍH%!UE#ӔʸMbdts~ӗ>2܏Ϟ[wwC#Lzj6Vv(o(EpmWxk{bIE3ٜRGu3(Q[9sErcdY$Н_ڧXnʾpB+t^\\:it:9_p5/Q"$Ebm-#͞#l6ZHE,ܞjhjnx^UtF[$I⌉OvFm l=jB>hkkklw8\CM͵V8s8M-Xkqqi2}ϙsV2 SN>{7S΍MSz&L#j +njvꔓ@%Fa'Xy>Qh=kmnD[.J=Y3Ev(JsCeL3D"q+js܄p;6t59oOr8lr,9Ȍabj=o׶޹z=ЯrlϚ~ּ -tH =@$˳5V 0FegϘ:Ӧu.k<;`G(y 3ԯ~s{sK={mw\sfhh}?7Gk/% ^[++ow^oؠA[/:8\e1jѭ[n/V-~Pjs,O uRxL$o% j4$DOgSOsNܹ8CQ1 =ƘA̬g45IDmU? ; Ft&{cj:*-?*mYYHlCW=m{ͯ8ڸ룐ĤZcr`, 6~ظfaCGy3:d)3:gꠁCo P39>t,xUnƁXx:k`Y3g}_vży?znT*޵{ۂyM1{٧s~[Fw3uԓ g /cjUU7_]Ӌ_2dDssɧgݻs0vwz}oQqwO>PWWlvJ>3võX&3~S&b֏Ǻ9YLg.zga}$,_z-s8fLo-pPΙ,+`M