flask-debugtoolbar-0.16.0/0000775000175000017500000000000014676013405015235 5ustar carstencarstenflask-debugtoolbar-0.16.0/src/0000775000175000017500000000000014676013405016024 5ustar carstencarstenflask-debugtoolbar-0.16.0/src/flask_debugtoolbar/0000775000175000017500000000000014676013405021655 5ustar carstencarstenflask-debugtoolbar-0.16.0/src/flask_debugtoolbar/panels/0000775000175000017500000000000014676013405023137 5ustar carstencarstenflask-debugtoolbar-0.16.0/src/flask_debugtoolbar/panels/profiler.py0000664000175000017500000001122714676013405025336 0ustar carstencarstenfrom __future__ import annotations import collections.abc as c import functools import pstats import typing as t from flask import current_app from jinja2 import Environment from werkzeug import Request from werkzeug import Response from ..utils import format_fname from . import DebugPanel try: import cProfile as profile except ImportError: import profile # type: ignore[no-redef] class ProfilerDebugPanel(DebugPanel): """Panel that displays the time a response took with cProfile output.""" name = "Profiler" user_activate = True is_active: bool = False dump_filename: str | None = None profiler: profile.Profile stats: pstats.Stats | None = None function_calls: list[dict[str, t.Any]] def __init__( self, jinja_env: Environment, context: dict[str, t.Any] | None = None ) -> None: super().__init__(jinja_env, context=context) if current_app.config.get("DEBUG_TB_PROFILER_ENABLED"): self.is_active = True self.dump_filename = current_app.config.get( "DEBUG_TB_PROFILER_DUMP_FILENAME" ) @property def has_content(self) -> bool: # type: ignore[override] return bool(self.profiler) def process_request(self, request: Request) -> None: if not self.is_active: return self.profiler = profile.Profile() # pyright: ignore self.stats = None def process_view( self, request: Request, view_func: c.Callable[..., t.Any], view_kwargs: dict[str, t.Any], ) -> c.Callable[..., t.Any] | None: if self.is_active: func = functools.partial(self.profiler.runcall, view_func) functools.update_wrapper(func, view_func) return func return None def process_response(self, request: Request, response: Response) -> None: if not self.is_active: return if self.profiler is not None: self.profiler.disable() # pyright: ignore try: stats = pstats.Stats(self.profiler) except TypeError: self.is_active = False return function_calls: list[dict[str, t.Any]] = [] for func in stats.sort_stats(1).fcn_list: # type: ignore[attr-defined] current: dict[str, t.Any] = {} info = stats.stats[func] # type: ignore[attr-defined] # Number of calls if info[0] != info[1]: current["ncalls"] = f"{info[1]}/{info[0]}" else: current["ncalls"] = info[1] # Total time current["tottime"] = info[2] * 1000 # Quotient of total time divided by number of calls if info[1]: current["percall"] = info[2] * 1000 / info[1] else: current["percall"] = 0 # Cumulative time current["cumtime"] = info[3] * 1000 # Quotient of the cumulative time divided by the number of # primitive calls. if info[0]: current["percall_cum"] = info[3] * 1000 / info[0] else: current["percall_cum"] = 0 # Filename filename = pstats.func_std_string(func) # type: ignore[attr-defined] current["filename_long"] = filename current["filename"] = format_fname(filename) function_calls.append(current) self.stats = stats self.function_calls = function_calls if self.dump_filename: if callable(self.dump_filename): filename = self.dump_filename() else: filename = self.dump_filename self.profiler.dump_stats(filename) def title(self) -> str: if not self.is_active: return "Profiler not active" return f"View: {float(self.stats.total_tt) * 1000:.2f}ms" # type: ignore[union-attr] def nav_title(self) -> str: return "Profiler" def nav_subtitle(self) -> str: if not self.is_active: return "in-active" return f"View: {float(self.stats.total_tt) * 1000:.2f}ms" # type: ignore[union-attr] def url(self) -> str: return "" def content(self) -> str: if not self.is_active: return "The profiler is not activated, activate it to use it" context = { "stats": self.stats, "function_calls": self.function_calls, } return self.render("panels/profiler.html", context) flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/panels/__init__.py0000664000175000017500000000531114676013405025250 0ustar carstencarstenfrom __future__ import annotations import collections.abc as c import typing as t from flask import Flask from jinja2 import Environment from werkzeug import Request from werkzeug import Response class DebugPanel: """Base class for debug panels.""" name: str # If content returns something, set to true in subclass has_content = False # If the client is able to activate/de-activate the panel user_enable = False # We'll maintain a local context instance so we can expose our template # context variables to panels which need them: context: dict[str, t.Any] = {} # Panel methods def __init__( self, jinja_env: Environment, context: dict[str, t.Any] | None = None ) -> None: if context is not None: self.context.update(context) self.jinja_env = jinja_env # If the client enabled the panel self.is_active = False @classmethod def init_app(cls, app: Flask) -> None: """Method that can be overridden by child classes. Can be used for setting up additional URL-rules/routes. Example:: class UMLDiagramPanel(DebugPanel): @classmethod def init_app(cls, app): app.add_url_rule( '/_flask_debugtoolbar_umldiagram/', '_flask_debugtoolbar_umldiagram.serve_generated_image', cls.serve_generated_image ) @classmethod def serve_generated_image(cls, app): return Response(...) """ pass def render(self, template_name: str, context: dict[str, t.Any]) -> str: template = self.jinja_env.get_template(template_name) return template.render(**context) def dom_id(self) -> str: return f"flDebug{self.name.replace(' ', '')}Panel" def nav_title(self) -> str: """Title showing in toolbar""" raise NotImplementedError def nav_subtitle(self) -> str: """Subtitle showing until title in toolbar""" return "" def title(self) -> str: """Title showing in panel""" raise NotImplementedError def url(self) -> str: raise NotImplementedError def content(self) -> str: raise NotImplementedError # Standard middleware methods def process_request(self, request: Request) -> None: pass def process_view( self, request: Request, view_func: c.Callable[..., t.Any], view_kwargs: dict[str, t.Any], ) -> c.Callable[..., t.Any] | None: pass def process_response(self, request: Request, response: Response) -> None: pass flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/panels/g.py0000664000175000017500000000103514676013405023736 0ustar carstencarstenfrom __future__ import annotations from flask import g from . import DebugPanel class GDebugPanel(DebugPanel): """A panel to display ``flask.g`` content.""" name = "g" has_content = True def nav_title(self) -> str: return "flask.g" def title(self) -> str: return "flask.g content" def url(self) -> str: return "" def content(self) -> str: context = self.context.copy() context.update({"g_content": g.__dict__}) return self.render("panels/g.html", context) flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/panels/logger.py0000664000175000017500000000634614676013405025001 0ustar carstencarstenfrom __future__ import annotations import datetime import logging import threading from werkzeug import Request from ..utils import format_fname from . import DebugPanel class ThreadTrackingHandler(logging.Handler): def __init__(self) -> None: super().__init__() # a dictionary that maps threads to log records self.records: dict[threading.Thread, list[logging.LogRecord]] = {} def emit(self, record: logging.LogRecord) -> None: self.get_records().append(record) def get_records( self, thread: threading.Thread | None = None ) -> list[logging.LogRecord]: """ Returns a list of records for the provided thread, of if none is provided, returns a list for the current thread. """ if thread is None: thread = threading.current_thread() if thread not in self.records: self.records[thread] = [] return self.records[thread] def clear_records(self, thread: threading.Thread | None = None) -> None: if thread is None: thread = threading.current_thread() if thread in self.records: del self.records[thread] handler: ThreadTrackingHandler = None # type: ignore[assignment] _init_lock = threading.Lock() def _init_once() -> None: global handler if handler is not None: return with _init_lock: if handler is not None: return # Call werkzeug's internal logging to make sure it gets configured # before we add our handler. Otherwise werkzeug will see our handler # and not configure console logging for the request log. # Werkzeug's default log level is INFO so this message probably won't # be seen. from werkzeug._internal import _log _log("debug", "Initializing Flask-DebugToolbar log handler") handler = ThreadTrackingHandler() logging.root.addHandler(handler) class LoggingPanel(DebugPanel): name = "Logging" has_content = True def process_request(self, request: Request) -> None: _init_once() handler.clear_records() def get_and_delete(self) -> list[logging.LogRecord]: records = handler.get_records() handler.clear_records() return records def nav_title(self) -> str: return "Logging" def nav_subtitle(self) -> str: num_records = len(handler.get_records()) plural = "message" if num_records == 1 else "messages" return f"{num_records} {plural}" def title(self) -> str: return "Log Messages" def url(self) -> str: return "" def content(self) -> str: records = [] for record in self.get_and_delete(): records.append( { "message": record.getMessage(), "time": datetime.datetime.fromtimestamp(record.created), "level": record.levelname, "file": format_fname(record.pathname), "file_long": record.pathname, "line": record.lineno, } ) context = self.context.copy() context.update({"records": records}) return self.render("panels/logger.html", context) flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/panels/template.py0000664000175000017500000001036214676013405025326 0ustar carstencarstenfrom __future__ import annotations import json import sys import typing as t import uuid from collections import deque from flask import abort from flask import current_app from flask import g from flask import request from flask import Response from flask import template_rendered from flask import url_for from jinja2 import Template from .. import module from . import DebugPanel class TemplateDebugPanel(DebugPanel): """Panel that displays the time a response took in milliseconds.""" name = "Template" has_content = True # save the context for the 5 most recent requests template_cache: deque[tuple[str, list[dict[str, t.Any]]]] = deque(maxlen=5) @classmethod def get_cache_for_key(cls, key: str) -> list[dict[str, t.Any]]: for cache_key, value in cls.template_cache: if key == cache_key: return value raise KeyError(key) def __init__(self, *args: t.Any, **kwargs: t.Any) -> None: super().__init__(*args, **kwargs) self.key: str = str(uuid.uuid4()) self.templates: list[dict[str, t.Any]] = [] template_rendered.connect(self._store_template_info) def _store_template_info(self, sender: t.Any, **kwargs: t.Any) -> None: # only record in the cache if the editor is enabled and there is # actually a template for this request if not self.templates and is_editor_enabled(): self.template_cache.append((self.key, self.templates)) self.templates.append(kwargs) def nav_title(self) -> str: return "Templates" def nav_subtitle(self) -> str: return f"{len(self.templates)} rendered" def title(self) -> str: return "Templates" def url(self) -> str: return "" def content(self) -> str: return self.render( "panels/template.html", { "key": self.key, "templates": self.templates, "editable": is_editor_enabled(), }, ) def is_editor_enabled() -> bool: return current_app.config.get("DEBUG_TB_TEMPLATE_EDITOR_ENABLED", False) # type: ignore def require_enabled() -> None: if not is_editor_enabled(): abort(403) def _get_source(template: Template) -> str: if template.filename is None: return "" with open(template.filename, "rb") as fp: source = fp.read() return source.decode(_template_encoding()) def _template_encoding() -> str: return getattr(current_app.jinja_loader, "encoding", "utf-8") @module.route("/template/") def template_editor(key: str) -> str: require_enabled() # TODO set up special loader that caches templates it loads # and can override template contents templates = [t["template"] for t in TemplateDebugPanel.get_cache_for_key(key)] return g.debug_toolbar.render( # type: ignore[no-any-return] "panels/template_editor.html", { "static_path": url_for("_debug_toolbar.static", filename=""), "request": request, "templates": [ {"name": t.name, "source": _get_source(t)} for t in templates ], }, ) @module.route("/template//save", methods=["POST"]) def save_template(key: str) -> str: require_enabled() template = TemplateDebugPanel.get_cache_for_key(key)[0]["template"] content = request.form["content"].encode(_template_encoding()) with open(template.filename, "wb") as fp: fp.write(content) return "ok" @module.route("/template/", methods=["POST"]) def template_preview(key: str) -> str | Response: require_enabled() context = TemplateDebugPanel.get_cache_for_key(key)[0]["context"] content = request.form["content"] env = current_app.jinja_env.overlay(autoescape=True) try: template = env.from_string(content) return template.render(context) except Exception as e: tb = sys.exc_info()[2] try: while tb.tb_next: # type: ignore[union-attr] tb = tb.tb_next # type: ignore[union-attr] msg = {"lineno": tb.tb_lineno, "error": str(e)} # type: ignore[union-attr] return Response(json.dumps(msg), status=400, mimetype="application/json") finally: del tb flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/panels/sqlalchemy.py0000664000175000017500000001211014676013405025646 0ustar carstencarstenfrom __future__ import annotations import typing as t import itsdangerous from flask import abort from flask import current_app from flask import g from flask import request from .. import module from ..utils import format_fname from ..utils import format_sql from . import DebugPanel try: from flask_sqlalchemy import SQLAlchemy except ImportError: sqlalchemy_available: bool = False get_recorded_queries = SQLAlchemy = None # type: ignore[misc, assignment] debug_enables_record_queries: bool = False else: try: from flask_sqlalchemy.record_queries import ( # type: ignore[assignment] get_recorded_queries, ) debug_enables_record_queries = False except ImportError: # For flask_sqlalchemy < 3.0.0 from flask_sqlalchemy import ( # type: ignore[no-redef] get_debug_queries as get_recorded_queries, ) # flask_sqlalchemy < 3.0.0 automatically enabled # SQLALCHEMY_RECORD_QUERIES in debug or test mode debug_enables_record_queries = True location_property: str = "context" else: location_property = "location" sqlalchemy_available = True def query_signer() -> itsdangerous.URLSafeSerializer: return itsdangerous.URLSafeSerializer( current_app.config["SECRET_KEY"], salt="fdt-sql-query" ) def is_select(statement: str | bytes) -> bool: statement = statement.lower().strip() if isinstance(statement, bytes): return statement.startswith(b"select") return statement.startswith("select") # pyright: ignore def dump_query(statement: str, params: t.Any) -> str | None: if not params or not is_select(statement): return None try: return query_signer().dumps([statement, params]) except TypeError: return None def load_query(data: str) -> tuple[str, t.Any]: try: statement, params = query_signer().loads(data) except (itsdangerous.BadSignature, TypeError): abort(406) # Make sure it is a select statement if not is_select(statement): abort(406) return statement, params def extension_used() -> bool: return "sqlalchemy" in current_app.extensions def recording_enabled() -> bool: return ( debug_enables_record_queries and current_app.debug ) or current_app.config.get("SQLALCHEMY_RECORD_QUERIES", False) def is_available() -> bool: return sqlalchemy_available and extension_used() and recording_enabled() def get_queries() -> list[t.Any]: if get_recorded_queries: return get_recorded_queries() else: return [] class SQLAlchemyDebugPanel(DebugPanel): """Panel that displays the time a response took in milliseconds.""" name = "SQLAlchemy" @property def has_content(self) -> bool: # type: ignore[override] return bool(get_queries()) or not is_available() def nav_title(self) -> str: return "SQLAlchemy" def nav_subtitle(self) -> str: count = len(get_queries()) if not count and not is_available(): return "Unavailable" plural = "query" if count == 1 else "queries" return f"{count} {plural}" def title(self) -> str: return "SQLAlchemy queries" def url(self) -> str: return "" def content(self) -> str: queries = get_queries() if not queries and not is_available(): return self.render( "panels/sqlalchemy_error.html", { "sqlalchemy_available": sqlalchemy_available, "extension_used": extension_used(), "recording_enabled": recording_enabled(), }, ) data = [] for query in queries: data.append( { "duration": query.duration, "sql": format_sql(query.statement, query.parameters), "signed_query": dump_query(query.statement, query.parameters), "location_long": getattr(query, location_property), "location": format_fname(getattr(query, location_property)), } ) return self.render("panels/sqlalchemy.html", {"queries": data}) # Panel views @module.route("/sqlalchemy/sql_select", methods=["GET", "POST"]) @module.route( "/sqlalchemy/sql_explain", methods=["GET", "POST"], defaults=dict(explain=True) ) def sql_select(explain: bool = False) -> str: statement, params = load_query(request.args["query"]) engine = current_app.extensions["sqlalchemy"].engine if explain: if engine.driver == "pysqlite": statement = f"EXPLAIN QUERY PLAN\n{statement}" else: statement = f"EXPLAIN\n{statement}" result = engine.execute(statement, params) return g.debug_toolbar.render( # type: ignore[no-any-return] "panels/sqlalchemy_select.html", { "result": result.fetchall(), "headers": result.keys(), "sql": format_sql(statement, params), "duration": float(request.args["duration"]), }, ) flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/panels/config_vars.py0000664000175000017500000000120614676013405026010 0ustar carstencarstenfrom __future__ import annotations from flask import current_app from . import DebugPanel class ConfigVarsDebugPanel(DebugPanel): """A panel to display all variables from Flask configuration.""" name = "ConfigVars" has_content = True def nav_title(self) -> str: return "Config" def title(self) -> str: return "Config" def url(self) -> str: return "" def content(self) -> str: context = self.context.copy() context.update( { "config": current_app.config, } ) return self.render("panels/config_vars.html", context) flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/panels/headers.py0000664000175000017500000000254514676013405025132 0ustar carstencarstenfrom __future__ import annotations import typing as t from werkzeug import Request from . import DebugPanel class HeaderDebugPanel(DebugPanel): """A panel to display HTTP headers.""" name = "Header" has_content = True # List of headers we want to display header_filter: tuple[str, ...] = ( "CONTENT_TYPE", "HTTP_ACCEPT", "HTTP_ACCEPT_CHARSET", "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "HTTP_CACHE_CONTROL", "HTTP_CONNECTION", "HTTP_HOST", "HTTP_KEEP_ALIVE", "HTTP_REFERER", "HTTP_USER_AGENT", "QUERY_STRING", "REMOTE_ADDR", "REMOTE_HOST", "REQUEST_METHOD", "SCRIPT_NAME", "SERVER_NAME", "SERVER_PORT", "SERVER_PROTOCOL", "SERVER_SOFTWARE", ) def nav_title(self) -> str: return "HTTP Headers" def title(self) -> str: return "HTTP Headers" def url(self) -> str: return "" def process_request(self, request: Request) -> None: self.headers: dict[str, t.Any] = { k: request.environ[k] for k in self.header_filter if k in request.environ } def content(self) -> str: context = self.context.copy() context.update({"headers": self.headers}) return self.render("panels/headers.html", context) flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/panels/request_vars.py0000664000175000017500000000313014676013405026231 0ustar carstencarstenfrom __future__ import annotations import collections.abc as c import typing as t from flask import session from werkzeug import Request from . import DebugPanel class RequestVarsDebugPanel(DebugPanel): """A panel to display request variables (POST/GET, session, cookies).""" name = "RequestVars" has_content = True def nav_title(self) -> str: return "Request Vars" def title(self) -> str: return "Request Vars" def url(self) -> str: return "" def process_request(self, request: Request) -> None: self.request = request self.session = session self.view_func: c.Callable[..., t.Any] | None = None self.view_kwargs: dict[str, t.Any] = {} def process_view( self, request: Request, view_func: c.Callable[..., t.Any], view_kwargs: dict[str, t.Any], ) -> None: self.view_func = view_func self.view_kwargs = view_kwargs def content(self) -> str: context = self.context.copy() context.update( { "get": self.request.args.lists(), "post": self.request.form.lists(), "cookies": self.request.cookies.items(), "view_func": ( f"{self.view_func.__module__}.{self.view_func.__name__}" if self.view_func else "[unknown]" ), "view_kwargs": self.view_kwargs or {}, "session": self.session.items(), } ) return self.render("panels/request_vars.html", context) flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/panels/route_list.py0000664000175000017500000000202414676013405025700 0ustar carstencarstenfrom __future__ import annotations from flask import current_app from werkzeug import Request from werkzeug.routing import Rule from . import DebugPanel class RouteListDebugPanel(DebugPanel): """Panel that displays the URL routing rules.""" name = "RouteList" has_content = True routes: list[Rule] = [] def nav_title(self) -> str: return "Route List" def title(self) -> str: return "Route List" def url(self) -> str: return "" def nav_subtitle(self) -> str: count = len(self.routes) plural = "route" if count == 1 else "routes" return f"{count} {plural}" def process_request(self, request: Request) -> None: self.routes = [ rule for rule in current_app.url_map.iter_rules() if not rule.rule.startswith("/_debug_toolbar") ] def content(self) -> str: return self.render( "panels/route_list.html", { "routes": self.routes, }, ) flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/panels/versions.py0000664000175000017500000000170314676013405025362 0ustar carstencarstenfrom __future__ import annotations import importlib.metadata import os from sysconfig import get_path from . import DebugPanel flask_version: str = importlib.metadata.version("flask") class VersionDebugPanel(DebugPanel): """Panel that displays the Flask version.""" name = "Version" has_content = True def nav_title(self) -> str: return "Versions" def nav_subtitle(self) -> str: return f"Flask {flask_version}" def url(self) -> str: return "" def title(self) -> str: return "Versions" def content(self) -> str: packages_metadata = [p.metadata for p in importlib.metadata.distributions()] packages = sorted(packages_metadata, key=lambda p: p["Name"].lower()) return self.render( "panels/versions.html", { "packages": packages, "python_lib_dir": os.path.normpath(get_path("platlib")), }, ) flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/panels/timer.py0000664000175000017500000000624314676013405024636 0ustar carstencarstenfrom __future__ import annotations import time from werkzeug import Request from werkzeug import Response from . import DebugPanel try: import resource HAVE_RESOURCE = True except ImportError: HAVE_RESOURCE = False class TimerDebugPanel(DebugPanel): """Panel that displays the time a response took in milliseconds.""" name = "Timer" has_content = HAVE_RESOURCE def process_request(self, request: Request) -> None: self._start_time = time.time() if HAVE_RESOURCE: self._start_rusage = resource.getrusage(resource.RUSAGE_SELF) def process_response(self, request: Request, response: Response) -> None: self.total_time: float = (time.time() - self._start_time) * 1000 if HAVE_RESOURCE: self._end_rusage = resource.getrusage(resource.RUSAGE_SELF) def nav_title(self) -> str: return "Time" def nav_subtitle(self) -> str: if not HAVE_RESOURCE: return f"TOTAL: {self.total_time:0.2f}ms" utime = self._end_rusage.ru_utime - self._start_rusage.ru_utime stime = self._end_rusage.ru_stime - self._start_rusage.ru_stime return f"CPU: {(utime + stime) * 1000.0:0.2f}ms ({self.total_time:0.2f}ms)" def title(self) -> str: return "Resource Usage" def url(self) -> str: return "" def _elapsed_ru(self, name: str) -> float: return getattr(self._end_rusage, name) - getattr(self._start_rusage, name) # type: ignore[no-any-return] def content(self) -> str: utime = 1000 * self._elapsed_ru("ru_utime") stime = 1000 * self._elapsed_ru("ru_stime") vcsw = self._elapsed_ru("ru_nvcsw") ivcsw = self._elapsed_ru("ru_nivcsw") # minflt = self._elapsed_ru("ru_minflt") # majflt = self._elapsed_ru("ru_majflt") # these are documented as not meaningful under Linux. If you're running BSD # feel free to enable them, and add any others that I hadn't gotten to before # I noticed that I was getting nothing but zeroes and that the docs agreed. :-( # blkin = self._elapsed_ru("ru_inblock") # blkout = self._elapsed_ru("ru_oublock") # swap = self._elapsed_ru("ru_nswap") # rss = self._end_rusage.ru_maxrss # srss = self._end_rusage.ru_ixrss # urss = self._end_rusage.ru_idrss # usrss = self._end_rusage.ru_isrss rows = ( ("User CPU time", f"{utime:0.3f} msec"), ("System CPU time", f"{stime:0.3f} msec"), ("Total CPU time", f"{(utime + stime):0.3f} msec"), ("Elapsed time", f"{self.total_time:0.3f} msec"), ("Context switches", f"{vcsw} voluntary, {ivcsw} involuntary"), # ( # "Memory use", # f"{rss} max RSS, {srss} shared, {urss + usrss} unshared", # ), # ("Page faults", f"{minflt} no i/o, {majflt} requiring i/o"), # ("Disk operations", f"{blkin} in, {blkout} out, {swap} swapout"), ) context = self.context.copy() context.update( { "rows": rows, } ) return self.render("panels/timer.html", context) flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/__init__.py0000664000175000017500000003225614676013405023776 0ustar carstencarstenfrom __future__ import annotations import collections.abc as c import os import typing as t import urllib.parse import warnings from contextvars import ContextVar import jinja2.ext from flask import Blueprint from flask import current_app from flask import Flask from flask import g from flask import request from flask import send_from_directory from flask import url_for from flask.globals import request_ctx from jinja2 import Environment from jinja2 import PackageLoader from werkzeug import Request from werkzeug import Response from werkzeug.routing import Rule from .toolbar import DebugToolbar from .utils import decode_text from .utils import gzip_compress from .utils import gzip_decompress module: Blueprint = Blueprint("debugtoolbar", __name__) def replace_insensitive(string: str, target: str, replacement: str) -> str: """Similar to string.replace() but is case insensitive Code borrowed from: http://forums.devshed.com/python-programming-11/case-insensitive-string-replace-490921.html """ no_case = string.lower() index = no_case.rfind(target.lower()) if index >= 0: return string[:index] + replacement + string[index + len(target) :] else: # no results so return the original string return string def _printable(value: object) -> str: try: return decode_text(repr(value)) except Exception as e: return f"" class DebugToolbarExtension: _static_dir = os.path.realpath(os.path.join(os.path.dirname(__file__), "static")) _toolbar_codes = [200, 201, 400, 401, 403, 404, 405, 500, 501, 502, 503, 504] _redirect_codes = [301, 302, 303, 304] def __init__(self, app: Flask | None = None) -> None: self.app = app self.toolbar_routes_host: str | None = None # Support threads running `flask.copy_current_request_context` without # poping toolbar during `teardown_request` self.debug_toolbars_var: ContextVar[dict[Request, DebugToolbar]] = ContextVar( "debug_toolbars" ) jinja_extensions = [jinja2.ext.i18n] # Jinja2<3 if hasattr(jinja2.ext, "with_"): jinja_extensions.append(jinja2.ext.with_) # pyright: ignore # Configure jinja for the internal templates and add url rules # for static data self.jinja_env: Environment = Environment( autoescape=True, extensions=jinja_extensions, loader=PackageLoader(__name__, "templates"), ) self.jinja_env.filters["urlencode"] = urllib.parse.quote_plus self.jinja_env.filters["printable"] = _printable self.jinja_env.globals["url_for"] = url_for if app is not None: self.init_app(app) def init_app(self, app: Flask) -> None: for k, v in self._default_config(app).items(): app.config.setdefault(k, v) if not app.config["DEBUG_TB_ENABLED"]: return if not app.config.get("SECRET_KEY"): raise RuntimeError( "The Flask-DebugToolbar requires the 'SECRET_KEY' config " "var to be set" ) self._validate_and_configure_toolbar_routes_host(app) DebugToolbar.load_panels(app) app.before_request(self.process_request) app.after_request(self.process_response) app.teardown_request(self.teardown_request) # Monkey-patch the Flask.dispatch_request method app.dispatch_request = self.dispatch_request # type: ignore[method-assign] app.add_url_rule( "/_debug_toolbar/static/", "_debug_toolbar.static", self.send_static_file, host=self.toolbar_routes_host, ) app.register_blueprint(module, url_prefix="/_debug_toolbar/views") def _default_config(self, app: Flask) -> dict[str, t.Any]: return { "DEBUG_TB_ENABLED": app.debug, "DEBUG_TB_HOSTS": (), "DEBUG_TB_ROUTES_HOST": None, "DEBUG_TB_INTERCEPT_REDIRECTS": True, "DEBUG_TB_PANELS": ( "flask_debugtoolbar.panels.versions.VersionDebugPanel", "flask_debugtoolbar.panels.timer.TimerDebugPanel", "flask_debugtoolbar.panels.headers.HeaderDebugPanel", "flask_debugtoolbar.panels.request_vars.RequestVarsDebugPanel", "flask_debugtoolbar.panels.config_vars.ConfigVarsDebugPanel", "flask_debugtoolbar.panels.template.TemplateDebugPanel", "flask_debugtoolbar.panels.sqlalchemy.SQLAlchemyDebugPanel", "flask_debugtoolbar.panels.logger.LoggingPanel", "flask_debugtoolbar.panels.route_list.RouteListDebugPanel", "flask_debugtoolbar.panels.profiler.ProfilerDebugPanel", "flask_debugtoolbar.panels.g.GDebugPanel", ), "SQLALCHEMY_RECORD_QUERIES": app.debug, } def _validate_and_configure_toolbar_routes_host(self, app: Flask) -> None: toolbar_routes_host = app.config["DEBUG_TB_ROUTES_HOST"] if app.url_map.host_matching and not toolbar_routes_host: import warnings warnings.warn( "Flask-DebugToolbar requires DEBUG_TB_ROUTES_HOST to be set if Flask " "is running in `host_matching` mode. Static assets for the toolbar " "will not be served correctly unless this is set.", stacklevel=1, ) if toolbar_routes_host: if not app.url_map.host_matching: raise ValueError( "`DEBUG_TB_ROUTES_HOST` should only be set if your Flask app is " "using `host_matching`." ) if toolbar_routes_host.strip() == "*": toolbar_routes_host = "" elif "<" in toolbar_routes_host and ">" in toolbar_routes_host: raise ValueError( "`DEBUG_TB_ROUTES_HOST` must either be a host name with no " "variables, to serve all Flask-DebugToolbar assets from a single " "host, or `*` to match the current request's host." ) # Automatically inject `toolbar_routes_host` into `url_for` calls for # the toolbar's `send_static_file` method. @app.url_defaults def inject_toolbar_routes_host_if_required( endpoint: str, values: dict[str, t.Any] ) -> None: if app.url_map.is_endpoint_expecting(endpoint, "toolbar_routes_host"): values.setdefault("toolbar_routes_host", request.host) # Automatically strip `toolbar_routes_host` from the endpoint values so # that the `send_static_host` method doesn't receive that parameter, # as it's not actually required internally. @app.url_value_preprocessor def strip_toolbar_routes_host_from_static_endpoint( endpoint: str | None, values: dict[str, t.Any] | None ) -> None: if ( endpoint and values and app.url_map.is_endpoint_expecting( endpoint, "toolbar_routes_host" ) ): values.pop("toolbar_routes_host", None) self.toolbar_routes_host = toolbar_routes_host def dispatch_request(self) -> t.Any: """Modified version of ``Flask.dispatch_request`` to call :meth:`process_view`. """ # self references this extension, use current_app to call app methods. app = current_app._get_current_object() # type: ignore[attr-defined] req = request_ctx.request if req.routing_exception is not None: app.raise_routing_exception(req) rule: Rule = req.url_rule # type: ignore[assignment] if ( getattr(rule, "provide_automatic_options", False) and req.method == "OPTIONS" ): return app.make_default_options_response() view_func = app.view_functions[rule.endpoint] view_args: dict[str, t.Any] = req.view_args # type: ignore[assignment] # allow each toolbar to process the view and args view_func = self.process_view(app, view_func, view_args) return view_func(**view_args) def _show_toolbar(self) -> bool: """Return a boolean to indicate if we need to show the toolbar.""" if request.blueprint == "debugtoolbar": return False hosts = current_app.config["DEBUG_TB_HOSTS"] if hosts and request.remote_addr not in hosts: return False return True def send_static_file(self, filename: str) -> Response: """Send a static file from the flask-debugtoolbar static directory.""" return send_from_directory(self._static_dir, filename) def process_request(self) -> None: g.debug_toolbar = self if not self._show_toolbar(): return real_request = request._get_current_object() # type: ignore[attr-defined] self.debug_toolbars_var.set({}) self.debug_toolbars_var.get()[real_request] = DebugToolbar( real_request, self.jinja_env ) for panel in self.debug_toolbars_var.get()[real_request].panels: panel.process_request(real_request) def process_view( self, app: Flask, view_func: c.Callable[..., t.Any], view_kwargs: dict[str, t.Any], ) -> c.Callable[..., t.Any]: """This method is called just before the flask view is called. This is done by the dispatch_request method. """ real_request = request._get_current_object() # type: ignore[attr-defined] try: toolbar = self.debug_toolbars_var.get({})[real_request] except KeyError: return view_func for panel in toolbar.panels: new_view = panel.process_view(real_request, view_func, view_kwargs) if new_view: view_func = new_view return view_func def process_response(self, response: Response) -> Response: real_request = request._get_current_object() # type: ignore[attr-defined] if real_request not in self.debug_toolbars_var.get({}): return response # Intercept http redirect codes and display an html page with a # link to the target. if current_app.config["DEBUG_TB_INTERCEPT_REDIRECTS"]: if response.status_code in self._redirect_codes: redirect_to = response.location redirect_code = response.status_code if redirect_to: content = self.render( "redirect.html", {"redirect_to": redirect_to, "redirect_code": redirect_code}, ) response.content_length = len(content) del response.location response.response = [content] response.status_code = 200 # If the http response code is an allowed code then we process to add the # toolbar to the returned html response. if not ( response.status_code in self._toolbar_codes and response.is_sequence and response.headers["content-type"].startswith("text/html") ): return response content_encoding = response.headers.get("Content-Encoding") if content_encoding and "gzip" in content_encoding: response_html = gzip_decompress(response.data).decode() else: response_html = response.get_data(as_text=True) no_case = response_html.lower() body_end = no_case.rfind("") if body_end >= 0: before = response_html[:body_end] after = response_html[body_end:] elif no_case.startswith(""): before = response_html after = "" else: warnings.warn( "Could not insert debug toolbar." " tag not found in response.", stacklevel=1, ) return response toolbar = self.debug_toolbars_var.get()[real_request] for panel in toolbar.panels: panel.process_response(real_request, response) toolbar_html = toolbar.render_toolbar() content = "".join((before, toolbar_html, after)) content_bytes = content.encode("utf-8") if content_encoding and "gzip" in content_encoding: content_bytes = gzip_compress(content_bytes) response.response = [content_bytes] response.content_length = len(content_bytes) return response def teardown_request(self, exc: BaseException | None) -> None: # debug_toolbars_var won't be set under `flask.copy_current_request_context` real_request = request._get_current_object() # type: ignore[attr-defined] self.debug_toolbars_var.get({}).pop(real_request, None) def render(self, template_name: str, context: dict[str, t.Any]) -> str: template = self.jinja_env.get_template(template_name) return template.render(**context) flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/0000775000175000017500000000000014676013405023144 5ustar carstencarstenflask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/css/0000775000175000017500000000000014676013405023734 5ustar carstencarstenflask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/css/toolbar.css0000664000175000017500000002056514676013405026120 0ustar carstencarsten/* Debug Toolbar CSS Reset, adapted from Eric Meyer's CSS Reset */ #flDebug, #flDebug * { margin:0; padding:0; border:0; outline:0; font-size:12px; line-height:1.5em; color:#000; vertical-align:baseline; background: none; font-family: inherit; text-align:left; } #flDebug { font-family: sans-serif; color: #000; background: #fff; } #flDebug tbody, #flDebug code, #flDebug pre { font-family: Consolas, Monaco, "Bitstream Vera Sans Mono", "Lucida Console", monospace; } #flDebug #flDebugToolbar { background:#111; width:200px; z-index:100000000; position:fixed; top:0; bottom:0; right:0; opacity:0.9; overflow-y: auto; } #flDebug #flDebugToolbar small { color:#999; } #flDebug #flDebugToolbar ul { margin:0; padding:0; list-style:none; } #flDebug #flDebugToolbar li { border-bottom:1px solid #222; color:#fff; display:block; font-weight:bold; float:none; margin:0; padding:0; position:relative; width:auto; } #flDebug #flDebugToolbar li>a, #flDebug #flDebugToolbar li>div.flDebugContentless { font-weight:normal; font-style:normal; text-decoration:none; display:block; font-size:16px; padding:10px 10px 5px 25px; color:#fff; } #flDebug #flDebugToolbar li a:hover { color:#111; background-color:#ffc; } #flDebug #flDebugToolbar li.flDebugActive { background-image:url(../img/indicator.png); background-repeat:no-repeat; background-position:left center; background-color:#333; padding-left:10px; } #flDebug #flDebugToolbar li.flDebugActive a:hover { color:#b36a60; background-color:transparent; } #flDebug #flDebugToolbar li small { font-size:12px; color:#999; font-style:normal; text-decoration:none; font-variant:small-caps; } #flDebug #flDebugToolbar li .flDebugSwitch { font-size: 10px; position: absolute; display: block; color: white; height: 16px; width: 16px; cursor: pointer; top: 15px; right: 2px; } #flDebug #flDebugToolbar li .flDebugSwitch.flDebugActive { background-image: url(../img/tick.png); } #flDebug #flDebugToolbar li .flDebugSwitch.flDebugInactive { background-image: url(../img/tick-red.png); } #flDebug #flDebugToolbarHandle { position:fixed; background:#fff; border:1px solid #111; top:30px; right:0; z-index:100000000; opacity:0.75; } #flDebug a#flDebugShowToolBarButton { display:block; height:75px; width:30px; border-right:none; border-bottom:4px solid #fff; border-top:4px solid #fff; border-left:4px solid #fff; color:#fff; font-size:10px; font-weight:bold; text-decoration:none; text-align:center; text-indent:-999999px; background:#000 url(../img/djdt_vertical.png) no-repeat left center; opacity:0.5; } #flDebug a#flDebugShowToolBarButton:hover { background-color:#111; padding-right:6px; border-top-color:#FFE761; border-left-color:#FFE761; border-bottom-color:#FFE761; opacity:1.0; } #flDebug code { display:inline; white-space:pre; overflow:auto; } #flDebug tr.flDebugOdd { background-color:#f5f5f5; } #flDebug .flDebugPanelContentParent { display:none; position:fixed; margin:0; top:0; right:200px; bottom:0; left:0px; background-color:#eee; color:#666; overflow: auto; z-index:100000000; } #flDebug .flDebugPanelContentParent > div { border-bottom:1px solid #ddd; } #flDebug .flDebugPanelTitle { position:absolute; background-color:#ffc; color:#666; padding-left:20px; top:0; right:0; left:0; height:50px; } #flDebug .flDebugPanelTitle code { display:inline; font-size:inherit; } #flDebug .flDebugPanelContent { position:absolute; top:50px; right:0; bottom:0; left:0; height:auto; padding:0 0 0 20px; } #flDebug .flDebugPanelContent .flDebugScroll { height:100%; overflow:auto; display:block; padding:0 10px 10px 0; } #flDebug h3 { font-size:24px; font-weight:normal; line-height:50px; } #flDebug h4 { font-size:20px; font-weight:bold; margin-top:0.8em; } #flDebug h5 { font-size: 14px; } #flDebug .flDebugPanelContentParent table { border:1px solid #ccc; border-collapse:collapse; width:100%; background-color:#fff; display:block; margin-top:0.8em; overflow: auto; } #flDebug .flDebugPanelContentParent tbody td, #flDebug .flDebugPanelContentParent tbody th { vertical-align:top; padding:2px 3px; } #flDebug .flDebugPanelContentParent thead th { padding:1px 6px 1px 3px; text-align:left; font-weight:bold; font-size:14px; } #flDebug .flDebugPanelContentParent tbody th { width:12em; text-align:right; color:#666; padding-right:.5em; } #flDebug .flDebugPanelContentParent ol li { margin: 0 0 1em 2em; } #flDebug .flDebugPanelContentParent pre { border:1px solid #ccc; background-color:#fff; display:block; margin:0.8em 0; padding: 0.2em 0.5em; } #flDebug .flTemplateHideContextDiv { background-color:#fff; } #flDebug .flDebugPanelContentParent .flDebugClose { text-indent:-9999999px; display:block; position:absolute; top:4px; right:15px; height:40px; width:40px; background:url(../img/close.png) no-repeat center center; } #flDebug .flDebugPanelContentParent .flDebugClose:hover { background-image:url(../img/close_hover.png); } #flDebug .flDebugPanelContentParent .flDebugClose.flDebugBack { background-image:url(../img/back.png); } #flDebug .flDebugPanelContentParent .flDebugClose.flDebugBack:hover { background-image:url(../img/back_hover.png); } #flDebug .flDebugPanelContentParent dt, #flDebug .flDebugPanelContentParent dd { display:block; } #flDebug .flDebugPanelContentParent dt { margin-top:0.75em; } #flDebug .flDebugPanelContentParent dd { margin-left:10px; } #flDebug a.flDebugToggleTemplate { padding:4px; background-color:#bbb; -moz-border-radius:3px; -webkit-border-radius:3px; } #flDebug a.flDebugToggleTemplate:hover { padding:4px; background-color:#444; color:#ffe761; -moz-border-radius:3px; -webkit-border-radius:3px; } #flDebug a.flDebugTemplateShowContext, #flDebug a.flDebugTemplateShowContext span.flDebugToggleArrow { color:#999; } #flDebug a.flDebugTemplateShowContext:hover, #flDebug a.flDebugTemplateShowContext:hover span.flDebugToggleArrow { color:#000; cursor:pointer; } #flDebug .flDebugSqlWrap { position:relative; } #flDebug .flDebugSql { z-index:100000002; } #flDebug .flDebugHideStacktraceDiv tbody th { text-align: left; } #flDebug span.flDebugLineChart { background-color:#777; height:3px; position:absolute; bottom:0; top:0; left:0; display:block; z-index:1000000001; } #flDebug span.flDebugLineChartWarning { background-color:#900; } #flDebug .highlight { color:#000; } #flDebug .highlight .err { color:#000; } /* Error */ #flDebug .highlight .g { color:#000; } /* Generic */ #flDebug .highlight .k { color:#000; font-weight:bold } /* Keyword */ #flDebug .highlight .o { color:#000; } /* Operator */ #flDebug .highlight .n { color:#000; } /* Name */ #flDebug .highlight .mi { color:#000; font-weight:bold } /* Literal.Number.Integer */ #flDebug .highlight .l { color:#000; } /* Literal */ #flDebug .highlight .x { color:#000; } /* Other */ #flDebug .highlight .p { color:#000; } /* Punctuation */ #flDebug .highlight .m { color:#000; font-weight:bold } /* Literal.Number */ #flDebug .highlight .s { color:#333 } /* Literal.String */ #flDebug .highlight .w { color:#888888 } /* Text.Whitespace */ #flDebug .highlight .il { color:#000; font-weight:bold } /* Literal.Number.Integer.Long */ #flDebug .highlight .na { color:#333 } /* Name.Attribute */ #flDebug .highlight .nt { color:#000; font-weight:bold } /* Name.Tag */ #flDebug .highlight .nv { color:#333 } /* Name.Variable */ #flDebug .highlight .s2 { color:#333 } /* Literal.String.Double */ #flDebug .highlight .cp { color:#333 } /* Comment.Preproc */ /* tablesorted */ #flDebug table.flDebugTablesorter { width: 100%; } #flDebug table.flDebugTablesorter thead th, table.flDebugTablesorter tfoot th { padding-right: 20px; } #flDebug table.flDebugTablesorter thead th { background: url(../img/bg.gif) center right no-repeat; cursor: pointer; } #flDebug table.flDebugTablesorter tbody tr.odd td { background-color: #F0F0F6; } #flDebug table.flDebugTablesorter thead .headerSortUp { background-image: url(../img/asc.gif); } #flDebug table.flDebugTablesorter thead .headerSortDown { background-image: url(../img/desc.gif); } #flDebug table.flDebugTablesorter thead .headerSortDown, #flDebug table.flDebugTablesorter thead .headerSortUp { background-color: #8dbdd8; } flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/img/0000775000175000017500000000000014676013405023720 5ustar carstencarstenflask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/img/desc.gif0000664000175000017500000000006614676013405025327 0ustar carstencarstenGIF89a#-0!, ɭT2Y;flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/img/close.png0000664000175000017500000000113414676013405025532 0ustar carstencarstenPNG  IHDR"":G #IDATxݘj0ݕ/3 ={i0oV+]g9J8iLCh$'IzG!S ~zB OBþET>J}-HM V3p8y:>y)k~U6|GЁγlTnDQ(VS+ eG7ND.IcdT)#70'8@VQțq,7Lӣt:a2YM&>E!o_~lj!'SxL9f}C94Xq1q/b!34*6˗Oh0 1!˖ڎGvfѓMh8^*^O/w0 n:6[EZ"MBnvͳqb4$ } %PGNW[<"5!ǾZBQS\Ԕ9wIENDB`flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/img/tick-red.png0000775000175000017500000000103214676013405026127 0ustar carstencarstenPNG  IHDRaIDATxڭOHQǿ3- ܂5:!Յ=lR a;;)K"PRke+H!ҥ@D(bu_߇#;ءB|<!Lw={uЦixDD'n|)}&IENDB`flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/img/back_hover.png0000664000175000017500000000114614676013405026533 0ustar carstencarstenPNG  IHDR"":G -IDATxXMKAGxԟ7{1؎axH"-@ DskuK I(:MH/,N;N0S#v[. m0\.g;L PHtCHEC.U! hF")b7*aWY;<NJ<$eB sP AbbAB,en*H%b "U%c}z"7 s:D9._3Q{d8GZϰG }{)aW# ctŽCB"/o<"KA^|J(1hUJ("Ȏd7GH6A\##77!!SڦFb%bY ܄&O񋳺R<)z'y}^[zwJZIE󃅑R*[*R "!+"g#-^'ZhkNiFRiPe?$,p鸄. c5c=̇7 IENDB`flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/img/back.png0000664000175000017500000000107714676013405025333 0ustar carstencarstenPNG  IHDR"":G IDATxݘAN@=[W^3t L [p.HHPb&X h 54MaxLOá*\\6le0R 7\.& \T&@j\]8S=i‰a5˂UNIFf2$ڰQq3م{xFRX8@AD0">i6%LB_ H_PBiP :Ծ3C|Qu&Rsb^&aWIVY:^^,8o"jdAl*zYaGvf Mu u\4ڣՇ @Is aa7RHX-KADPdFo!APcCcz d=-,htAO)Kr4UKY/986_ HVQ %Ky>Y8yZ'6}53!j>K?Ԝ! >jgɃxIENDB`flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/img/tick.png0000775000175000017500000000107114676013405025362 0ustar carstencarstenPNG  IHDRaIDATxڭMHTQ{83w&͡5 lQD K +!CABZK~*5#YTHPpQG"IP.jQizz0 >x=RE.W{* !? E b/%ҕg .itH b5Õ퓉so =e?vO峺3o6[-l7^JKaSjjs+o_wG_0.Y3lFwɝoۙ,0nx`Ի9CE%8p/vJ|+Fkf\8P%R9](&LpgPlTF 4z\ GrEAWsTVڼ cN*p(sYޥc"*XD'Qq U`R#%K\D(D#O?^>H'-X?,|2YIENDB`flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/img/asc.gif0000664000175000017500000000006614676013405025157 0ustar carstencarstenGIF89a#-0!,  ڛgk$-;flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/img/close_hover.png0000664000175000017500000000130714676013405026737 0ustar carstencarstenPNG  IHDR"":G IDATxݘjQ}l]% vBDօXt!.|JQDmZӎtIGk4Ԕ֯9!9х0Ϗs=s]7R{2P:Ru'}rS($@F<4L 2& k\ 2jTVچrvnAAn3?` N LRpe%&yF^bqA2<0V$4`ϒitsL:­vn ud#sB/Fe2py/=73 +O]8 )c\4f Π_Ja:m-P;(Qq$q[F. vX݁vi axf`R2&\گgxs 0mlW a!4Bz2 G %DPb Xר@N_aBU=}nFs?*+/h'Y58ڭ~qO:|skPŢ'/w0+t'6ev _\ #FTD[*R "ɐ@H\ 4V,JԊZB] ŹE3x|IENDB`flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/img/bg.gif0000664000175000017500000000010014676013405024766 0ustar carstencarstenGIF89a #-0!,  bxT2W>e`U;flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/img/djdt_vertical.png0000664000175000017500000000062414676013405027246 0ustar carstencarstenPNG  IHDR(K'E[IDATHc`eDppUNaPã"Vbƣ$1±$ & 6ªLf\tU~xFQ ؎#=> Q#f:.uB_Aһc#7C$PzBV@i@|'șCQ?C8^8}:&Y +܏CZtq(JR]Q H7c` [!^AOP!ـ׍ gHOB$aL~$L0S}o@c*[l`|ЀӘ(2OIENDB`flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/img/indicator.png0000664000175000017500000000067414676013405026411 0ustar carstencarstenPNG  IHDR'ՆIDAT(SuҿK@\i''tADtAo8`Aqq At*$R돊RQlhӤIwKljǑ~KD!B ,1B1b,rLTe"gtU1liofvI=ȡ)-X|L'V@qύ_r6A+JƦ;+޺@ +i2?}tcZlYXc.U͛ @$j$*2[Ry!~:|!['nLU"ggwd+,ʠky]$Sb`SLb~BztOT|Wyc{8`e'6g|" _YB8 [zM3Ӆ;IENDB`flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/img/panel_bg.png0000664000175000017500000000010614676013405026172 0ustar carstencarstenPNG  IHDRĉ IDATc3 6UEQHIENDB`flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/js/0000775000175000017500000000000014676013405023560 5ustar carstencarstenflask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/js/jquery-migrate.js0000664000175000017500000007635214676013405027100 0ustar carstencarsten/*! * jQuery Migrate - v3.4.1 - 2023-02-23T15:31Z * Copyright OpenJS Foundation and other contributors */ ( function( factory ) { "use strict"; if ( typeof define === "function" && define.amd ) { // AMD. Register as an anonymous module. define( [ "jquery" ], function( jQuery ) { return factory( jQuery, window ); } ); } else if ( typeof module === "object" && module.exports ) { // Node/CommonJS // eslint-disable-next-line no-undef module.exports = factory( require( "jquery" ), window ); } else { // Browser globals factory( jQuery, window ); } } )( function( jQuery, window ) { "use strict"; jQuery.migrateVersion = "3.4.1"; // Returns 0 if v1 == v2, -1 if v1 < v2, 1 if v1 > v2 function compareVersions( v1, v2 ) { var i, rVersionParts = /^(\d+)\.(\d+)\.(\d+)/, v1p = rVersionParts.exec( v1 ) || [ ], v2p = rVersionParts.exec( v2 ) || [ ]; for ( i = 1; i <= 3; i++ ) { if ( +v1p[ i ] > +v2p[ i ] ) { return 1; } if ( +v1p[ i ] < +v2p[ i ] ) { return -1; } } return 0; } function jQueryVersionSince( version ) { return compareVersions( jQuery.fn.jquery, version ) >= 0; } // A map from disabled patch codes to `true`. This should really // be a `Set` but those are unsupported in IE. var disabledPatches = Object.create( null ); // Don't apply patches for specified codes. Helpful for code bases // where some Migrate warnings have been addressed and it's desirable // to avoid needless patches or false positives. jQuery.migrateDisablePatches = function() { var i; for ( i = 0; i < arguments.length; i++ ) { disabledPatches[ arguments[ i ] ] = true; } }; // Allow enabling patches disabled via `jQuery.migrateDisablePatches`. // Helpful if you want to disable a patch only for some code that won't // be updated soon to be able to focus on other warnings - and enable it // immediately after such a call: // ```js // jQuery.migrateDisablePatches( "workaroundA" ); // elem.pluginViolatingWarningA( "pluginMethod" ); // jQuery.migrateEnablePatches( "workaroundA" ); // ``` jQuery.migrateEnablePatches = function() { var i; for ( i = 0; i < arguments.length; i++ ) { delete disabledPatches[ arguments[ i ] ]; } }; jQuery.migrateIsPatchEnabled = function( patchCode ) { return !disabledPatches[ patchCode ]; }; ( function() { // Support: IE9 only // IE9 only creates console object when dev tools are first opened // IE9 console is a host object, callable but doesn't have .apply() if ( !window.console || !window.console.log ) { return; } // Need jQuery 3.x-4.x and no older Migrate loaded if ( !jQuery || !jQueryVersionSince( "3.0.0" ) || jQueryVersionSince( "5.0.0" ) ) { window.console.log( "JQMIGRATE: jQuery 3.x-4.x REQUIRED" ); } if ( jQuery.migrateWarnings ) { window.console.log( "JQMIGRATE: Migrate plugin loaded multiple times" ); } // Show a message on the console so devs know we're active window.console.log( "JQMIGRATE: Migrate is installed" + ( jQuery.migrateMute ? "" : " with logging active" ) + ", version " + jQuery.migrateVersion ); } )(); var warnedAbout = {}; // By default each warning is only reported once. jQuery.migrateDeduplicateWarnings = true; // List of warnings already given; public read only jQuery.migrateWarnings = []; // Set to false to disable traces that appear with warnings if ( jQuery.migrateTrace === undefined ) { jQuery.migrateTrace = true; } // Forget any warnings we've already given; public jQuery.migrateReset = function() { warnedAbout = {}; jQuery.migrateWarnings.length = 0; }; function migrateWarn( code, msg ) { var console = window.console; if ( jQuery.migrateIsPatchEnabled( code ) && ( !jQuery.migrateDeduplicateWarnings || !warnedAbout[ msg ] ) ) { warnedAbout[ msg ] = true; jQuery.migrateWarnings.push( msg + " [" + code + "]" ); if ( console && console.warn && !jQuery.migrateMute ) { console.warn( "JQMIGRATE: " + msg ); if ( jQuery.migrateTrace && console.trace ) { console.trace(); } } } } function migrateWarnProp( obj, prop, value, code, msg ) { Object.defineProperty( obj, prop, { configurable: true, enumerable: true, get: function() { migrateWarn( code, msg ); return value; }, set: function( newValue ) { migrateWarn( code, msg ); value = newValue; } } ); } function migrateWarnFuncInternal( obj, prop, newFunc, code, msg ) { var finalFunc, origFunc = obj[ prop ]; obj[ prop ] = function() { // If `msg` not provided, do not warn; more sophisticated warnings // logic is most likely embedded in `newFunc`, in that case here // we just care about the logic choosing the proper implementation // based on whether the patch is disabled or not. if ( msg ) { migrateWarn( code, msg ); } // Since patches can be disabled & enabled dynamically, we // need to decide which implementation to run on each invocation. finalFunc = jQuery.migrateIsPatchEnabled( code ) ? newFunc : // The function may not have existed originally so we need a fallback. ( origFunc || jQuery.noop ); return finalFunc.apply( this, arguments ); }; } function migratePatchAndWarnFunc( obj, prop, newFunc, code, msg ) { if ( !msg ) { throw new Error( "No warning message provided" ); } return migrateWarnFuncInternal( obj, prop, newFunc, code, msg ); } function migratePatchFunc( obj, prop, newFunc, code ) { return migrateWarnFuncInternal( obj, prop, newFunc, code ); } if ( window.document.compatMode === "BackCompat" ) { // jQuery has never supported or tested Quirks Mode migrateWarn( "quirks", "jQuery is not compatible with Quirks Mode" ); } var findProp, class2type = {}, oldInit = jQuery.fn.init, oldFind = jQuery.find, rattrHashTest = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/, rattrHashGlob = /\[(\s*[-\w]+\s*)([~|^$*]?=)\s*([-\w#]*?#[-\w#]*)\s*\]/g, // Require that the "whitespace run" starts from a non-whitespace // to avoid O(N^2) behavior when the engine would try matching "\s+$" at each space position. rtrim = /^[\s\uFEFF\xA0]+|([^\s\uFEFF\xA0])[\s\uFEFF\xA0]+$/g; migratePatchFunc( jQuery.fn, "init", function( arg1 ) { var args = Array.prototype.slice.call( arguments ); if ( jQuery.migrateIsPatchEnabled( "selector-empty-id" ) && typeof arg1 === "string" && arg1 === "#" ) { // JQuery( "#" ) is a bogus ID selector, but it returned an empty set // before jQuery 3.0 migrateWarn( "selector-empty-id", "jQuery( '#' ) is not a valid selector" ); args[ 0 ] = []; } return oldInit.apply( this, args ); }, "selector-empty-id" ); // This is already done in Core but the above patch will lose this assignment // so we need to redo it. It doesn't matter whether the patch is enabled or not // as the method is always going to be a Migrate-created wrapper. jQuery.fn.init.prototype = jQuery.fn; migratePatchFunc( jQuery, "find", function( selector ) { var args = Array.prototype.slice.call( arguments ); // Support: PhantomJS 1.x // String#match fails to match when used with a //g RegExp, only on some strings if ( typeof selector === "string" && rattrHashTest.test( selector ) ) { // The nonstandard and undocumented unquoted-hash was removed in jQuery 1.12.0 // First see if qS thinks it's a valid selector, if so avoid a false positive try { window.document.querySelector( selector ); } catch ( err1 ) { // Didn't *look* valid to qSA, warn and try quoting what we think is the value selector = selector.replace( rattrHashGlob, function( _, attr, op, value ) { return "[" + attr + op + "\"" + value + "\"]"; } ); // If the regexp *may* have created an invalid selector, don't update it // Note that there may be false alarms if selector uses jQuery extensions try { window.document.querySelector( selector ); migrateWarn( "selector-hash", "Attribute selector with '#' must be quoted: " + args[ 0 ] ); args[ 0 ] = selector; } catch ( err2 ) { migrateWarn( "selector-hash", "Attribute selector with '#' was not fixed: " + args[ 0 ] ); } } } return oldFind.apply( this, args ); }, "selector-hash" ); // Copy properties attached to original jQuery.find method (e.g. .attr, .isXML) for ( findProp in oldFind ) { if ( Object.prototype.hasOwnProperty.call( oldFind, findProp ) ) { jQuery.find[ findProp ] = oldFind[ findProp ]; } } // The number of elements contained in the matched element set migratePatchAndWarnFunc( jQuery.fn, "size", function() { return this.length; }, "size", "jQuery.fn.size() is deprecated and removed; use the .length property" ); migratePatchAndWarnFunc( jQuery, "parseJSON", function() { return JSON.parse.apply( null, arguments ); }, "parseJSON", "jQuery.parseJSON is deprecated; use JSON.parse" ); migratePatchAndWarnFunc( jQuery, "holdReady", jQuery.holdReady, "holdReady", "jQuery.holdReady is deprecated" ); migratePatchAndWarnFunc( jQuery, "unique", jQuery.uniqueSort, "unique", "jQuery.unique is deprecated; use jQuery.uniqueSort" ); // Now jQuery.expr.pseudos is the standard incantation migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos, "expr-pre-pseudos", "jQuery.expr.filters is deprecated; use jQuery.expr.pseudos" ); migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos, "expr-pre-pseudos", "jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos" ); // Prior to jQuery 3.1.1 there were internal refs so we don't warn there if ( jQueryVersionSince( "3.1.1" ) ) { migratePatchAndWarnFunc( jQuery, "trim", function( text ) { return text == null ? "" : ( text + "" ).replace( rtrim, "$1" ); }, "trim", "jQuery.trim is deprecated; use String.prototype.trim" ); } // Prior to jQuery 3.2 there were internal refs so we don't warn there if ( jQueryVersionSince( "3.2.0" ) ) { migratePatchAndWarnFunc( jQuery, "nodeName", function( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); }, "nodeName", "jQuery.nodeName is deprecated" ); migratePatchAndWarnFunc( jQuery, "isArray", Array.isArray, "isArray", "jQuery.isArray is deprecated; use Array.isArray" ); } if ( jQueryVersionSince( "3.3.0" ) ) { migratePatchAndWarnFunc( jQuery, "isNumeric", function( obj ) { // As of jQuery 3.0, isNumeric is limited to // strings and numbers (primitives or objects) // that can be coerced to finite numbers (gh-2662) var type = typeof obj; return ( type === "number" || type === "string" ) && // parseFloat NaNs numeric-cast false positives ("") // ...but misinterprets leading-number strings, e.g. hex literals ("0x...") // subtraction forces infinities to NaN !isNaN( obj - parseFloat( obj ) ); }, "isNumeric", "jQuery.isNumeric() is deprecated" ); // Populate the class2type map jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol". split( " " ), function( _, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); migratePatchAndWarnFunc( jQuery, "type", function( obj ) { if ( obj == null ) { return obj + ""; } // Support: Android <=2.3 only (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? class2type[ Object.prototype.toString.call( obj ) ] || "object" : typeof obj; }, "type", "jQuery.type is deprecated" ); migratePatchAndWarnFunc( jQuery, "isFunction", function( obj ) { return typeof obj === "function"; }, "isFunction", "jQuery.isFunction() is deprecated" ); migratePatchAndWarnFunc( jQuery, "isWindow", function( obj ) { return obj != null && obj === obj.window; }, "isWindow", "jQuery.isWindow() is deprecated" ); } // Support jQuery slim which excludes the ajax module if ( jQuery.ajax ) { var oldAjax = jQuery.ajax, rjsonp = /(=)\?(?=&|$)|\?\?/; migratePatchFunc( jQuery, "ajax", function() { var jQXHR = oldAjax.apply( this, arguments ); // Be sure we got a jQXHR (e.g., not sync) if ( jQXHR.promise ) { migratePatchAndWarnFunc( jQXHR, "success", jQXHR.done, "jqXHR-methods", "jQXHR.success is deprecated and removed" ); migratePatchAndWarnFunc( jQXHR, "error", jQXHR.fail, "jqXHR-methods", "jQXHR.error is deprecated and removed" ); migratePatchAndWarnFunc( jQXHR, "complete", jQXHR.always, "jqXHR-methods", "jQXHR.complete is deprecated and removed" ); } return jQXHR; }, "jqXHR-methods" ); // Only trigger the logic in jQuery <4 as the JSON-to-JSONP auto-promotion // behavior is gone in jQuery 4.0 and as it has security implications, we don't // want to restore the legacy behavior. if ( !jQueryVersionSince( "4.0.0" ) ) { // Register this prefilter before the jQuery one. Otherwise, a promoted // request is transformed into one with the script dataType and we can't // catch it anymore. jQuery.ajaxPrefilter( "+json", function( s ) { // Warn if JSON-to-JSONP auto-promotion happens. if ( s.jsonp !== false && ( rjsonp.test( s.url ) || typeof s.data === "string" && ( s.contentType || "" ) .indexOf( "application/x-www-form-urlencoded" ) === 0 && rjsonp.test( s.data ) ) ) { migrateWarn( "jsonp-promotion", "JSON-to-JSONP auto-promotion is deprecated" ); } } ); } } var oldRemoveAttr = jQuery.fn.removeAttr, oldToggleClass = jQuery.fn.toggleClass, rmatchNonSpace = /\S+/g; migratePatchFunc( jQuery.fn, "removeAttr", function( name ) { var self = this, patchNeeded = false; jQuery.each( name.match( rmatchNonSpace ), function( _i, attr ) { if ( jQuery.expr.match.bool.test( attr ) ) { // Only warn if at least a single node had the property set to // something else than `false`. Otherwise, this Migrate patch // doesn't influence the behavior and there's no need to set or warn. self.each( function() { if ( jQuery( this ).prop( attr ) !== false ) { patchNeeded = true; return false; } } ); } if ( patchNeeded ) { migrateWarn( "removeAttr-bool", "jQuery.fn.removeAttr no longer sets boolean properties: " + attr ); self.prop( attr, false ); } } ); return oldRemoveAttr.apply( this, arguments ); }, "removeAttr-bool" ); migratePatchFunc( jQuery.fn, "toggleClass", function( state ) { // Only deprecating no-args or single boolean arg if ( state !== undefined && typeof state !== "boolean" ) { return oldToggleClass.apply( this, arguments ); } migrateWarn( "toggleClass-bool", "jQuery.fn.toggleClass( boolean ) is deprecated" ); // Toggle entire class name of each element return this.each( function() { var className = this.getAttribute && this.getAttribute( "class" ) || ""; if ( className ) { jQuery.data( this, "__className__", className ); } // If the element has a class name or if we're passed `false`, // then remove the whole classname (if there was one, the above saved it). // Otherwise bring back whatever was previously saved (if anything), // falling back to the empty string if nothing was stored. if ( this.setAttribute ) { this.setAttribute( "class", className || state === false ? "" : jQuery.data( this, "__className__" ) || "" ); } } ); }, "toggleClass-bool" ); function camelCase( string ) { return string.replace( /-([a-z])/g, function( _, letter ) { return letter.toUpperCase(); } ); } var origFnCss, internalCssNumber, internalSwapCall = false, ralphaStart = /^[a-z]/, // The regex visualized: // // /----------\ // | | /-------\ // | / Top \ | | | // /--- Border ---+-| Right |-+---+- Width -+---\ // | | Bottom | | // | \ Left / | // | | // | /----------\ | // | /-------------\ | | |- END // | | | | / Top \ | | // | | / Margin \ | | | Right | | | // |---------+-| |-+---+-| Bottom |-+----| // | \ Padding / \ Left / | // BEGIN -| | // | /---------\ | // | | | | // | | / Min \ | / Width \ | // \--------------+-| |-+---| |---/ // \ Max / \ Height / rautoPx = /^(?:Border(?:Top|Right|Bottom|Left)?(?:Width|)|(?:Margin|Padding)?(?:Top|Right|Bottom|Left)?|(?:Min|Max)?(?:Width|Height))$/; // If this version of jQuery has .swap(), don't false-alarm on internal uses if ( jQuery.swap ) { jQuery.each( [ "height", "width", "reliableMarginRight" ], function( _, name ) { var oldHook = jQuery.cssHooks[ name ] && jQuery.cssHooks[ name ].get; if ( oldHook ) { jQuery.cssHooks[ name ].get = function() { var ret; internalSwapCall = true; ret = oldHook.apply( this, arguments ); internalSwapCall = false; return ret; }; } } ); } migratePatchFunc( jQuery, "swap", function( elem, options, callback, args ) { var ret, name, old = {}; if ( !internalSwapCall ) { migrateWarn( "swap", "jQuery.swap() is undocumented and deprecated" ); } // Remember the old values, and insert the new ones for ( name in options ) { old[ name ] = elem.style[ name ]; elem.style[ name ] = options[ name ]; } ret = callback.apply( elem, args || [] ); // Revert the old values for ( name in options ) { elem.style[ name ] = old[ name ]; } return ret; }, "swap" ); if ( jQueryVersionSince( "3.4.0" ) && typeof Proxy !== "undefined" ) { jQuery.cssProps = new Proxy( jQuery.cssProps || {}, { set: function() { migrateWarn( "cssProps", "jQuery.cssProps is deprecated" ); return Reflect.set.apply( this, arguments ); } } ); } // In jQuery >=4 where jQuery.cssNumber is missing fill it with the latest 3.x version: // https://github.com/jquery/jquery/blob/3.6.0/src/css.js#L212-L233 // This way, number values for the CSS properties below won't start triggering // Migrate warnings when jQuery gets updated to >=4.0.0 (gh-438). if ( jQueryVersionSince( "4.0.0" ) ) { // We need to keep this as a local variable as we need it internally // in a `jQuery.fn.css` patch and this usage shouldn't warn. internalCssNumber = { animationIterationCount: true, columnCount: true, fillOpacity: true, flexGrow: true, flexShrink: true, fontWeight: true, gridArea: true, gridColumn: true, gridColumnEnd: true, gridColumnStart: true, gridRow: true, gridRowEnd: true, gridRowStart: true, lineHeight: true, opacity: true, order: true, orphans: true, widows: true, zIndex: true, zoom: true }; if ( typeof Proxy !== "undefined" ) { jQuery.cssNumber = new Proxy( internalCssNumber, { get: function() { migrateWarn( "css-number", "jQuery.cssNumber is deprecated" ); return Reflect.get.apply( this, arguments ); }, set: function() { migrateWarn( "css-number", "jQuery.cssNumber is deprecated" ); return Reflect.set.apply( this, arguments ); } } ); } else { // Support: IE 9-11+ // IE doesn't support proxies, but we still want to restore the legacy // jQuery.cssNumber there. jQuery.cssNumber = internalCssNumber; } } else { // Make `internalCssNumber` defined for jQuery <4 as well as it's needed // in the `jQuery.fn.css` patch below. internalCssNumber = jQuery.cssNumber; } function isAutoPx( prop ) { // The first test is used to ensure that: // 1. The prop starts with a lowercase letter (as we uppercase it for the second regex). // 2. The prop is not empty. return ralphaStart.test( prop ) && rautoPx.test( prop[ 0 ].toUpperCase() + prop.slice( 1 ) ); } origFnCss = jQuery.fn.css; migratePatchFunc( jQuery.fn, "css", function( name, value ) { var camelName, origThis = this; if ( name && typeof name === "object" && !Array.isArray( name ) ) { jQuery.each( name, function( n, v ) { jQuery.fn.css.call( origThis, n, v ); } ); return this; } if ( typeof value === "number" ) { camelName = camelCase( name ); // Use `internalCssNumber` to avoid triggering our warnings in this // internal check. if ( !isAutoPx( camelName ) && !internalCssNumber[ camelName ] ) { migrateWarn( "css-number", "Number-typed values are deprecated for jQuery.fn.css( \"" + name + "\", value )" ); } } return origFnCss.apply( this, arguments ); }, "css-number" ); var origData = jQuery.data; migratePatchFunc( jQuery, "data", function( elem, name, value ) { var curData, sameKeys, key; // Name can be an object, and each entry in the object is meant to be set as data if ( name && typeof name === "object" && arguments.length === 2 ) { curData = jQuery.hasData( elem ) && origData.call( this, elem ); sameKeys = {}; for ( key in name ) { if ( key !== camelCase( key ) ) { migrateWarn( "data-camelCase", "jQuery.data() always sets/gets camelCased names: " + key ); curData[ key ] = name[ key ]; } else { sameKeys[ key ] = name[ key ]; } } origData.call( this, elem, sameKeys ); return name; } // If the name is transformed, look for the un-transformed name in the data object if ( name && typeof name === "string" && name !== camelCase( name ) ) { curData = jQuery.hasData( elem ) && origData.call( this, elem ); if ( curData && name in curData ) { migrateWarn( "data-camelCase", "jQuery.data() always sets/gets camelCased names: " + name ); if ( arguments.length > 2 ) { curData[ name ] = value; } return curData[ name ]; } } return origData.apply( this, arguments ); }, "data-camelCase" ); // Support jQuery slim which excludes the effects module if ( jQuery.fx ) { var intervalValue, intervalMsg, oldTweenRun = jQuery.Tween.prototype.run, linearEasing = function( pct ) { return pct; }; migratePatchFunc( jQuery.Tween.prototype, "run", function( ) { if ( jQuery.easing[ this.easing ].length > 1 ) { migrateWarn( "easing-one-arg", "'jQuery.easing." + this.easing.toString() + "' should use only one argument" ); jQuery.easing[ this.easing ] = linearEasing; } oldTweenRun.apply( this, arguments ); }, "easing-one-arg" ); intervalValue = jQuery.fx.interval; intervalMsg = "jQuery.fx.interval is deprecated"; // Support: IE9, Android <=4.4 // Avoid false positives on browsers that lack rAF // Don't warn if document is hidden, jQuery uses setTimeout (#292) if ( window.requestAnimationFrame ) { Object.defineProperty( jQuery.fx, "interval", { configurable: true, enumerable: true, get: function() { if ( !window.document.hidden ) { migrateWarn( "fx-interval", intervalMsg ); } // Only fallback to the default if patch is enabled if ( !jQuery.migrateIsPatchEnabled( "fx-interval" ) ) { return intervalValue; } return intervalValue === undefined ? 13 : intervalValue; }, set: function( newValue ) { migrateWarn( "fx-interval", intervalMsg ); intervalValue = newValue; } } ); } } var oldLoad = jQuery.fn.load, oldEventAdd = jQuery.event.add, originalFix = jQuery.event.fix; jQuery.event.props = []; jQuery.event.fixHooks = {}; migrateWarnProp( jQuery.event.props, "concat", jQuery.event.props.concat, "event-old-patch", "jQuery.event.props.concat() is deprecated and removed" ); migratePatchFunc( jQuery.event, "fix", function( originalEvent ) { var event, type = originalEvent.type, fixHook = this.fixHooks[ type ], props = jQuery.event.props; if ( props.length ) { migrateWarn( "event-old-patch", "jQuery.event.props are deprecated and removed: " + props.join() ); while ( props.length ) { jQuery.event.addProp( props.pop() ); } } if ( fixHook && !fixHook._migrated_ ) { fixHook._migrated_ = true; migrateWarn( "event-old-patch", "jQuery.event.fixHooks are deprecated and removed: " + type ); if ( ( props = fixHook.props ) && props.length ) { while ( props.length ) { jQuery.event.addProp( props.pop() ); } } } event = originalFix.call( this, originalEvent ); return fixHook && fixHook.filter ? fixHook.filter( event, originalEvent ) : event; }, "event-old-patch" ); migratePatchFunc( jQuery.event, "add", function( elem, types ) { // This misses the multiple-types case but that seems awfully rare if ( elem === window && types === "load" && window.document.readyState === "complete" ) { migrateWarn( "load-after-event", "jQuery(window).on('load'...) called after load event occurred" ); } return oldEventAdd.apply( this, arguments ); }, "load-after-event" ); jQuery.each( [ "load", "unload", "error" ], function( _, name ) { migratePatchFunc( jQuery.fn, name, function() { var args = Array.prototype.slice.call( arguments, 0 ); // If this is an ajax load() the first arg should be the string URL; // technically this could also be the "Anything" arg of the event .load() // which just goes to show why this dumb signature has been deprecated! // jQuery custom builds that exclude the Ajax module justifiably die here. if ( name === "load" && typeof args[ 0 ] === "string" ) { return oldLoad.apply( this, args ); } migrateWarn( "shorthand-removed-v3", "jQuery.fn." + name + "() is deprecated" ); args.splice( 0, 0, name ); if ( arguments.length ) { return this.on.apply( this, args ); } // Use .triggerHandler here because: // - load and unload events don't need to bubble, only applied to window or image // - error event should not bubble to window, although it does pre-1.7 // See http://bugs.jquery.com/ticket/11820 this.triggerHandler.apply( this, args ); return this; }, "shorthand-removed-v3" ); } ); jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + "change select submit keydown keypress keyup contextmenu" ).split( " " ), function( _i, name ) { // Handle event binding migratePatchAndWarnFunc( jQuery.fn, name, function( data, fn ) { return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); }, "shorthand-deprecated-v3", "jQuery.fn." + name + "() event shorthand is deprecated" ); } ); // Trigger "ready" event only once, on document ready jQuery( function() { jQuery( window.document ).triggerHandler( "ready" ); } ); jQuery.event.special.ready = { setup: function() { if ( this === window.document ) { migrateWarn( "ready-event", "'ready' event is deprecated" ); } } }; migratePatchAndWarnFunc( jQuery.fn, "bind", function( types, data, fn ) { return this.on( types, null, data, fn ); }, "pre-on-methods", "jQuery.fn.bind() is deprecated" ); migratePatchAndWarnFunc( jQuery.fn, "unbind", function( types, fn ) { return this.off( types, null, fn ); }, "pre-on-methods", "jQuery.fn.unbind() is deprecated" ); migratePatchAndWarnFunc( jQuery.fn, "delegate", function( selector, types, data, fn ) { return this.on( types, selector, data, fn ); }, "pre-on-methods", "jQuery.fn.delegate() is deprecated" ); migratePatchAndWarnFunc( jQuery.fn, "undelegate", function( selector, types, fn ) { return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn ); }, "pre-on-methods", "jQuery.fn.undelegate() is deprecated" ); migratePatchAndWarnFunc( jQuery.fn, "hover", function( fnOver, fnOut ) { return this.on( "mouseenter", fnOver ).on( "mouseleave", fnOut || fnOver ); }, "pre-on-methods", "jQuery.fn.hover() is deprecated" ); var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, makeMarkup = function( html ) { var doc = window.document.implementation.createHTMLDocument( "" ); doc.body.innerHTML = html; return doc.body && doc.body.innerHTML; }, warnIfChanged = function( html ) { var changed = html.replace( rxhtmlTag, "<$1>" ); if ( changed !== html && makeMarkup( html ) !== makeMarkup( changed ) ) { migrateWarn( "self-closed-tags", "HTML tags must be properly nested and closed: " + html ); } }; /** * Deprecated, please use `jQuery.migrateDisablePatches( "self-closed-tags" )` instead. * @deprecated */ jQuery.UNSAFE_restoreLegacyHtmlPrefilter = function() { jQuery.migrateEnablePatches( "self-closed-tags" ); }; migratePatchFunc( jQuery, "htmlPrefilter", function( html ) { warnIfChanged( html ); return html.replace( rxhtmlTag, "<$1>" ); }, "self-closed-tags" ); // This patch needs to be disabled by default as it re-introduces // security issues (CVE-2020-11022, CVE-2020-11023). jQuery.migrateDisablePatches( "self-closed-tags" ); var origOffset = jQuery.fn.offset; migratePatchFunc( jQuery.fn, "offset", function() { var elem = this[ 0 ]; if ( elem && ( !elem.nodeType || !elem.getBoundingClientRect ) ) { migrateWarn( "offset-valid-elem", "jQuery.fn.offset() requires a valid DOM element" ); return arguments.length ? this : undefined; } return origOffset.apply( this, arguments ); }, "offset-valid-elem" ); // Support jQuery slim which excludes the ajax module // The jQuery.param patch is about respecting `jQuery.ajaxSettings.traditional` // so it doesn't make sense for the slim build. if ( jQuery.ajax ) { var origParam = jQuery.param; migratePatchFunc( jQuery, "param", function( data, traditional ) { var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; if ( traditional === undefined && ajaxTraditional ) { migrateWarn( "param-ajax-traditional", "jQuery.param() no longer uses jQuery.ajaxSettings.traditional" ); traditional = ajaxTraditional; } return origParam.call( this, data, traditional ); }, "param-ajax-traditional" ); } migratePatchAndWarnFunc( jQuery.fn, "andSelf", jQuery.fn.addBack, "andSelf", "jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()" ); // Support jQuery slim which excludes the deferred module in jQuery 4.0+ if ( jQuery.Deferred ) { var oldDeferred = jQuery.Deferred, tuples = [ // Action, add listener, callbacks, .then handlers, final state [ "resolve", "done", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), "resolved" ], [ "reject", "fail", jQuery.Callbacks( "once memory" ), jQuery.Callbacks( "once memory" ), "rejected" ], [ "notify", "progress", jQuery.Callbacks( "memory" ), jQuery.Callbacks( "memory" ) ] ]; migratePatchFunc( jQuery, "Deferred", function( func ) { var deferred = oldDeferred(), promise = deferred.promise(); function newDeferredPipe( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; return jQuery.Deferred( function( newDefer ) { jQuery.each( tuples, function( i, tuple ) { var fn = typeof fns[ i ] === "function" && fns[ i ]; // Deferred.done(function() { bind to newDefer or newDefer.resolve }) // deferred.fail(function() { bind to newDefer or newDefer.reject }) // deferred.progress(function() { bind to newDefer or newDefer.notify }) deferred[ tuple[ 1 ] ]( function() { var returned = fn && fn.apply( this, arguments ); if ( returned && typeof returned.promise === "function" ) { returned.promise() .done( newDefer.resolve ) .fail( newDefer.reject ) .progress( newDefer.notify ); } else { newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); } } ); } ); fns = null; } ).promise(); } migratePatchAndWarnFunc( deferred, "pipe", newDeferredPipe, "deferred-pipe", "deferred.pipe() is deprecated" ); migratePatchAndWarnFunc( promise, "pipe", newDeferredPipe, "deferred-pipe", "deferred.pipe() is deprecated" ); if ( func ) { func.call( deferred, deferred ); } return deferred; }, "deferred-pipe" ); // Preserve handler of uncaught exceptions in promise chains jQuery.Deferred.exceptionHook = oldDeferred.exceptionHook; } return jQuery; } ); flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/static/js/toolbar.js0000664000175000017500000001623614676013405025570 0ustar carstencarsten(function($) { $.cookie = function(name, value, options) { if (typeof value != 'undefined') { options = options || {}; if (value === null) { value = ''; options.expires = -1; } var expires = ''; if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { var date; if (typeof options.expires == 'number') { date = new Date(); date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000)); } else { date = options.expires; } expires = '; expires=' + date.toUTCString(); } var path = options.path ? '; path=' + (options.path) : ''; var domain = options.domain ? '; domain=' + (options.domain) : ''; var secure = options.secure ? '; secure' : ''; document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join(''); } else { var cookieValue = null; if (document.cookie && document.cookie != '') { var cookies = document.cookie.split(';'); for (var i = 0; i < cookies.length; i++) { var cookie = $.trim(cookies[i]); if (cookie.substring(0, name.length + 1) == (name + '=')) { cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); break; } } } return cookieValue; } }; $('head').append(''); var COOKIE_NAME = 'fldt'; var COOKIE_NAME_ACTIVE = COOKIE_NAME +'_active'; var fldt = { init: function() { $('#flDebug').show(); var current = null; $('#flDebugPanelList li a').on('click', function() { if (!this.className) { return false; } current = $('#flDebug #' + this.className + '-content'); if (current.is(':visible')) { $(document).trigger('close.flDebug'); $(this).parent().removeClass('flDebugActive'); } else { $('.flDebugPanelContentParent').hide(); // Hide any that are already open current.show(); $('#flDebugToolbar li').removeClass('flDebugActive'); $(this).parent().addClass('flDebugActive'); } return false; }); $('#flDebugPanelList li .flDebugSwitch').on('click', function() { var $panel = $(this).parent(); var $this = $(this); var dom_id = $panel.attr('id'); // Turn cookie content into an array of active panels var active_str = $.cookie(COOKIE_NAME_ACTIVE); var active = (active_str) ? active_str.split(';') : []; active = $.grep(active, function(n,i) { return n != dom_id; }); if ($this.hasClass('flDebugActive')) { $this.removeClass('flDebugActive'); $this.addClass('flDebugInactive'); } else { active.push(dom_id); $this.removeClass('flDebugInactive'); $this.addClass('flDebugActive'); } if (active.length > 0) { $.cookie(COOKIE_NAME_ACTIVE, active.join(';'), { path: '/', expires: 10 }); } else { $.cookie(COOKIE_NAME_ACTIVE, null, { path: '/', expires: -1 }); } }); $('#flDebug a.flDebugClose').on('click', function() { $(document).trigger('close.flDebug'); $('#flDebugToolbar li').removeClass('flDebugActive'); return false; }); $('#flDebug a.flDebugRemoteCall').on('click', function() { $('#flDebugWindow').load(this.href, {}, function() { $('#flDebugWindow a.flDebugBack').click(function() { $(this).parent().parent().hide(); return false; }); }); $('#flDebugWindow').show(); return false; }); $('#flDebugTemplatePanel a.flDebugTemplateShowContext').on('click', function() { fldt.toggle_arrow($(this).children('.flDebugToggleArrow')) fldt.toggle_content($(this).parent().next()); return false; }); $('#flDebugSQLPanel a.flDebugShowStacktrace').on('click', function() { fldt.toggle_content($('.flDebugHideStacktraceDiv', $(this).parents('tr'))); return false; }); $('#flDebugHideToolBarButton').on('click', function() { fldt.hide_toolbar(true); return false; }); $('#flDebugShowToolBarButton').on('click', function() { fldt.show_toolbar(); return false; }); $(document).on('close.flDebug', function() { // If a sub-panel is open, close that if ($('#flDebugWindow').is(':visible')) { $('#flDebugWindow').hide(); return; } // If a panel is open, close that if ($('.flDebugPanelContentParent').is(':visible')) { $('.flDebugPanelContentParent').hide(); return; } // Otherwise, just minimize the toolbar if ($('#flDebugToolbar').is(':visible')) { fldt.hide_toolbar(true); return; } }); if ($.cookie(COOKIE_NAME)) { fldt.hide_toolbar(false); } else { fldt.show_toolbar(false); } $('#flDebug table.flDebugTablesorter').each(function() { var headers = {}; $(this).find('thead th').each(function(idx, elem) { headers[idx] = $(elem).data(); }); $(this).tablesorter({headers: headers}); }) .bind('sortEnd', function() { $(this).find('tbody tr').each(function(idx, elem) { var even = idx % 2 === 0; $(elem) .toggleClass('flDebugEven', even) .toggleClass('flDebugOdd', !even); }); }); }, toggle_content: function(elem) { if (elem.is(':visible')) { elem.hide(); } else { elem.show(); } }, close: function() { $(document).trigger('close.flDebug'); return false; }, hide_toolbar: function(setCookie) { // close any sub panels $('#flDebugWindow').hide(); // close all panels $('.flDebugPanelContentParent').hide(); $('#flDebugToolbar li').removeClass('flDebugActive'); // finally close toolbar $('#flDebugToolbar').hide('fast'); $('#flDebugToolbarHandle').show(); // Unbind keydown $(document).unbind('keydown.flDebug'); if (setCookie) { $.cookie(COOKIE_NAME, 'hide', { path: '/', expires: 10 }); } }, show_toolbar: function(animate) { // Set up keybindings $(document).on('keydown.flDebug', function(e) { if (e.keyCode == 27) { fldt.close(); } }); $('#flDebugToolbarHandle').hide(); if (animate) { $('#flDebugToolbar').show('fast'); } else { $('#flDebugToolbar').show(); } $.cookie(COOKIE_NAME, null, { path: '/', expires: -1 }); }, toggle_arrow: function(elem) { var uarr = String.fromCharCode(0x25b6); var darr = String.fromCharCode(0x25bc); elem.html(elem.html() == uarr ? darr : uarr); }, load_href: function(href) { $.get(href, function(data, status, xhr) { document.open(); document.write(xhr.responseText); document.close(); }); return false; }, $: $ }; $(document).ready(function() { fldt.init(); }); window.fldt = fldt; })(jQuery.noConflict(true)); flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/py.typed0000664000175000017500000000000014676013405023342 0ustar carstencarstenflask-debugtoolbar-0.16.0/src/flask_debugtoolbar/utils.py0000664000175000017500000000570514676013405023376 0ustar carstencarstenfrom __future__ import annotations import collections.abc as c import gzip import io import itertools import os.path import sys from types import ModuleType from flask import current_app from markupsafe import Markup try: from pygments import highlight from pygments.formatters import HtmlFormatter from pygments.lexers import SqlLexer from pygments.styles import get_style_by_name PYGMENT_STYLE = get_style_by_name("colorful") HAVE_PYGMENTS = True except ImportError: HAVE_PYGMENTS = False try: import sqlparse # pyright: ignore HAVE_SQLPARSE = True except ImportError: HAVE_SQLPARSE = False def format_fname(value: str) -> str: # If the value has a builtin prefix, return it unchanged if value.startswith(("{", "<")): return value value = os.path.normpath(value) # If the file is absolute, try normalizing it relative to the project root # to handle it as a project file if os.path.isabs(value): value = _shortest_relative_path(value, [current_app.root_path], os.path) # If the value is a relative path, it is a project file if not os.path.isabs(value): return os.path.join(".", value) # Otherwise, normalize other paths relative to sys.path return f"<{_shortest_relative_path(value, sys.path, os.path)}>" def _shortest_relative_path( value: str, paths: list[str], path_module: ModuleType ) -> str: relpaths = _relative_paths(value, paths, path_module) return min(itertools.chain(relpaths, [value]), key=len) def _relative_paths( value: str, paths: list[str], path_module: ModuleType ) -> c.Iterator[str]: for path in paths: try: relval = path_module.relpath(value, path) except ValueError: # on Windows, relpath throws a ValueError for # paths with different drives continue if not relval.startswith(path_module.pardir): yield relval def decode_text(value: str | bytes) -> str: """ Decode a text-like value for display. Unicode values are returned unchanged. Byte strings will be decoded with a text-safe replacement for unrecognized characters. """ if isinstance(value, bytes): return value.decode("ascii", "replace") return value # pyright: ignore def format_sql(query: str | bytes, args: object) -> str: if HAVE_SQLPARSE: query = sqlparse.format(query, reindent=True, keyword_case="upper") if not HAVE_PYGMENTS: return decode_text(query) return Markup( highlight(query, SqlLexer(), HtmlFormatter(noclasses=True, style=PYGMENT_STYLE)) ) def gzip_compress(data: bytes, compresslevel: int = 6) -> bytes: buff = io.BytesIO() with gzip.GzipFile(fileobj=buff, mode="wb", compresslevel=compresslevel) as f: f.write(data) return buff.getvalue() def gzip_decompress(data: bytes) -> bytes: with gzip.GzipFile(fileobj=io.BytesIO(data), mode="rb") as f: return f.read() flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/toolbar.py0000664000175000017500000000475314676013405023702 0ustar carstencarstenfrom __future__ import annotations import collections.abc as c import typing as t from urllib.parse import unquote from flask import current_app from flask import Flask from flask import url_for from jinja2 import Environment from werkzeug import Request from werkzeug.utils import import_string from .panels import DebugPanel class DebugToolbar: _cached_panel_classes: t.ClassVar[dict[str, type[DebugPanel] | None]] = {} def __init__(self, request: Request, jinja_env: Environment) -> None: self.jinja_env = jinja_env self.request = request self.panels: list[DebugPanel] = [] self.template_context: dict[str, t.Any] = { "static_path": url_for("_debug_toolbar.static", filename="") } self.create_panels() def create_panels(self) -> None: """Populate debug panels""" activated_str = self.request.cookies.get("fldt_active", "") activated = unquote(activated_str).split(";") for panel_class in self._iter_panels(current_app): panel_instance = panel_class( jinja_env=self.jinja_env, context=self.template_context ) if panel_instance.dom_id() in activated: panel_instance.is_active = True self.panels.append(panel_instance) def render_toolbar(self) -> str: context = self.template_context.copy() context.update({"panels": self.panels}) template = self.jinja_env.get_template("base.html") return template.render(**context) @classmethod def load_panels(cls, app: Flask) -> None: for panel_class in cls._iter_panels(app): # Call `.init_app()` on panels panel_class.init_app(app) @classmethod def _iter_panels(cls, app: Flask) -> c.Iterator[type[DebugPanel]]: for panel_path in app.config["DEBUG_TB_PANELS"]: panel_class = cls._import_panel(app, panel_path) if panel_class is not None: yield panel_class @classmethod def _import_panel(cls, app: Flask, path: str) -> type[DebugPanel] | None: cache = cls._cached_panel_classes try: return cache[path] except KeyError: pass try: panel_class: type[DebugPanel] | None = import_string(path) except ImportError as e: app.logger.warning("Disabled %s due to ImportError: %s", path, e) panel_class = None cache[path] = panel_class return panel_class flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/0000775000175000017500000000000014676013405023653 5ustar carstencarstenflask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/0000775000175000017500000000000014676013405025135 5ustar carstencarstenflask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/headers.html0000664000175000017500000000050714676013405027440 0ustar carstencarsten {% for key, value in headers|dictsort %} {% endfor %}
Key Value
{{ key|escape }} {{ value|escape }}
flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/request_vars.html0000664000175000017500000000343514676013405030553 0ustar carstencarsten

View information

View Function kwargs
{{ view_func }} {% if view_kwargs.items() %} {% for k, v in view_kwargs.items() %} {{ k }}={{ v }}{% if not loop.last %}, {% endif %} {% endfor %} {% else %} None {% endif %}
{% macro show_map(map) %} {% for key, value in map %} {% endfor %}
Variable Value
{{ key|printable }} {{ value|printable }}
{% endmacro %}

COOKIES Variables

{% if cookies %} {{ show_map(cookies) }} {% else %}

No COOKIE data

{% endif %}

SESSION Variables

{% if session %} {{ show_map(session) }} {% else %}

No SESSION data

{% endif %} {% macro show_multi_map(map) %} {% for key, value in map %} {% endfor %}
Variable Value
{{ key|printable }} {%- set sep = joiner() -%} {%- for v in value -%} {{ sep() }}{{ v|printable }} {%- endfor -%}
{% endmacro %}

GET Variables

{% if get %} {{ show_multi_map(get) }} {% else %}

No GET data

{% endif %}

POST Variables

{% if post %} {{ show_multi_map(post) }} {% else %}

No POST data

{% endif %} flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/sqlalchemy.html0000664000175000017500000000205614676013405030170 0ustar carstencarsten {% for query in queries %} {% endfor %}
 (ms) Action Context Query
{{ '%.4f'|format(query.duration * 1000) }} {% if query.signed_query %} SELECT
EXPLAIN
{% endif %}
{{ query.location }}
{{ query.sql }}
flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/logger.html0000664000175000017500000000114414676013405027302 0ustar carstencarsten{% if records %} {% for record in records %} {% endfor %}
Level Time Message Location
{{ record.level }} {{ record.time }} {{ record.message }} {{ record.file }}:{{ record.line }}
{% else %}

No messages logged.

{% endif %} flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/template.html0000664000175000017500000000127014676013405027636 0ustar carstencarsten{% if templates %} {% if editable %} Edit templates {% endif %} {% for template in templates %}

{{ template.template.name }}

{% for k, v in template.context|dictsort %} {% endfor %}
Variable Value
{{ k }} {{ v|printable }}
{% endfor %} {% else %}

No template rendered

{% endif %} flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/sqlalchemy_error.html0000664000175000017500000000244614676013405031404 0ustar carstencarsten

Queries Unavailable

The toolbar was unable to fetch the SQLAlchemy queries for this request. To enable the SQLAlchemy query display, please:

    {% if not sqlalchemy_available %}
  1. Install required libraries:
    • Flask-SQLAlchemy
  2. {% endif %} {% if not extension_used %}
  3. Configure Flask-SQLAlchemy:

    The Flask-SQLAlchemy extension needs to be configured for this application. Please see the Flask-SQLAlchemy documentation for details.

  4. {% endif %} {% if not recording_enabled %}
  5. Enable query recording:

    Since this app is not currently running in DEBUG mode, Flask-SQLAlchemy will not record queries by default. To enable query recording in non-debug mode, set the following configuration value:

    app.config['SQLALCHEMY_RECORD_QUERIES'] = True

    See the documention of Flask-SQLAlchemy's get_debug_queries() for additional details.

  6. {% endif %}
flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/profiler.html0000664000175000017500000000136114676013405027646 0ustar carstencarsten {% for row in function_calls %} {% endfor %}
Calls Total Time (ms) Per Call (ms) Cumulative Time (ms) Per Call (ms) Function
{{ row.ncalls }} {{ row.tottime }} {{ '%.4f'|format(row.percall) }} {{ row.cumtime }} {{ '%.4f'|format(row.percall_cum) }} {{ row.filename|escape }}
flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/versions.html0000664000175000017500000000111614676013405027672 0ustar carstencarsten

Installed Packages

Current Site Packages Directory:

{{ python_lib_dir }}
{% for package in packages %} {% endfor %}
Package Version Homepage Summary
{{ package.get('Name') }} {{ package.get('Version') }} {{ package.get('Home-page') }} {{ package.get('Summary') }}
flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/config_vars.html0000664000175000017500000000061714676013405030327 0ustar carstencarsten {% for key, value in config|dictsort %} {% endfor %}
Key Value
{{ key }} {{ value|printable }}
flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/route_list.html0000664000175000017500000000120614676013405030213 0ustar carstencarsten {% if routes %} {% for route in routes|sort(attribute='rule') %} {% endfor %} {% else %} {% endif %}
URL route Endpoint name HTTP methods Is alias Redirect to
{{ route.rule }} {{ route.endpoint }} {{ route.methods|sort|join(', ') }} {{ route.alias }} {{ route.redirect_to }}
No routes have been configured.
flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/sqlalchemy_select.html0000664000175000017500000000157714676013405031536 0ustar carstencarsten
Back

SQL Details

Executed SQL
{{ sql }}
Original query duration
{{ '%.4f'|format(duration * 1000) }} ms
{% if result %} {% for h in headers %} {% endfor %} {% for row in result %} {% for column in row %} {% endfor %} {% endfor %}
{{ h|upper }}
{{ column }}
{% else %}

Empty set

{% endif %}
flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/template_editor.html0000664000175000017500000001401514676013405031205 0ustar carstencarsten Editing {{ templates[0].name }}
flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/g.html0000664000175000017500000000051114676013405026246 0ustar carstencarsten {% for key, value in g_content|dictsort %} {% endfor %}
Key Value
{{ key|escape }} {{ value|escape }}
flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/panels/timer.html0000664000175000017500000000060314676013405027142 0ustar carstencarsten {% for key, value in rows %} {% endfor %}
Resource Value
{{ key|escape }} {{ value|escape }}
flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/redirect.html0000664000175000017500000000107714676013405026347 0ustar carstencarsten Redirect intercepted

Redirect ({{ redirect_code }})

Location: {{ redirect_to }}

The Flask Debug Toolbar has intercepted a redirect to the above URL for debug viewing purposes. You can click the above link to continue with the redirect as normal. If you'd like to disable this feature, you can set the config variable DEBUG_TB_INTERCEPT_REDIRECTS to False.

flask-debugtoolbar-0.16.0/src/flask_debugtoolbar/templates/base.html0000664000175000017500000000440714676013405025460 0ustar carstencarsten flask-debugtoolbar-0.16.0/README.md0000664000175000017500000000230714676013405016516 0ustar carstencarsten# Flask-DebugToolbar A [Flask][] extension that injects debugging information into rendered HTML pages. Presented as a sidebar with configurable panels of information. This is a port of the excellent [django-debug-toolbar][ddt]. [Flask]: https://flask.palletsprojects.com [ddt]: https://github.com/jazzband/django-debug-toolbar/ ## Pallets Community Ecosystem > [!IMPORTANT]\ > This project is part of the Pallets Community Ecosystem. Pallets is the open > source organization that maintains Flask; Pallets-Eco enables community > maintenance of related projects. If you are interested in helping maintain > this project, please reach out on [the Pallets Discord server][discord]. [discord]: https://discord.gg/pallets ## Example Setting up the debug toolbar is simple: ```python from flask import Flask from flask_debugtoolbar import DebugToolbarExtension app = Flask(__name__) app.config["SECRET_KEY"] = "" toolbar = DebugToolbarExtension(app) ``` The toolbar will automatically be injected into Jinja templates when debug mode is enabled. ``` $ flask -A my_app run --debug ``` ![](https://raw.githubusercontent.com/pallets-eco/flask-debugtoolbar/main/docs/_static/example.gif) flask-debugtoolbar-0.16.0/tox.ini0000664000175000017500000000232614676013405016553 0ustar carstencarsten[tox] envlist = py3{12,11,10,9,8} minimal style typing docs skip_missing_interpreters = true [testenv] package = wheel wheel_build_env = .pkg constrain_package_deps = true use_frozen_constraints = true deps = -r requirements/tests.txt commands = pytest -v --tb=short --basetemp={envtmpdir} {posargs} [testenv:minimal] deps = commands = python -c "from flask_debugtoolbar import DebugToolbarExtension" [testenv:style] deps = pre-commit skip_install = true commands = pre-commit run --all-files [testenv:typing] deps = -r requirements/typing.txt commands = mypy pyright pyright --verifytypes flask_debugtoolbar --ignoreexternal [testenv:docs] deps = -r requirements/docs.txt commands = sphinx-build -E -W -b dirhtml docs docs/_build/dirhtml [testenv:update-pre_commit] labels = update deps = pre-commit skip_install = true commands = pre-commit autoupdate -j4 [testenv:update-requirements] base_python = 3.8 labels = update deps = pip-tools skip_install = true change_dir = requirements commands = pip-compile build.in -q {posargs:-U} pip-compile docs.in -q {posargs:-U} pip-compile tests.in -q {posargs:-U} pip-compile typing.in -q {posargs:-U} pip-compile dev.in -q {posargs:-U} flask-debugtoolbar-0.16.0/.pre-commit-config.yaml0000664000175000017500000000113214676013405021513 0ustar carstencarstenci: autoupdate_schedule: monthly repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.6.3 hooks: - id: ruff - id: ruff-format - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.6.0 hooks: - id: check-merge-conflict exclude: "(codemirror|jquery)" - id: debug-statements exclude: "(codemirror|jquery)" - id: fix-byte-order-marker exclude: "(codemirror|jquery)" - id: trailing-whitespace exclude: "(codemirror|jquery)" - id: end-of-file-fixer exclude: "(codemirror|jquery)" flask-debugtoolbar-0.16.0/.editorconfig0000664000175000017500000000035114676013405017711 0ustar carstencarstenroot = true [*] indent_style = space indent_size = 4 insert_final_newline = true trim_trailing_whitespace = true end_of_line = lf charset = utf-8 max_line_length = 88 [*.{css,html,js,json,jsx,scss,ts,tsx,yaml,yml}] indent_size = 2 flask-debugtoolbar-0.16.0/requirements/0000775000175000017500000000000014676013405017760 5ustar carstencarstenflask-debugtoolbar-0.16.0/requirements/build.txt0000664000175000017500000000052314676013405021620 0ustar carstencarsten# # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # pip-compile build.in # build==1.2.2 # via -r build.in importlib-metadata==7.1.0 # via build packaging==24.0 # via build pyproject-hooks==1.1.0 # via build tomli==2.0.1 # via build zipp==3.19.1 # via importlib-metadata flask-debugtoolbar-0.16.0/requirements/build.in0000664000175000017500000000000614676013405021403 0ustar carstencarstenbuild flask-debugtoolbar-0.16.0/requirements/typing.txt0000664000175000017500000000244514676013405022040 0ustar carstencarsten# # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # pip-compile typing.in # blinker==1.8.1 # via flask click==8.1.7 # via flask exceptiongroup==1.2.1 # via pytest flask==3.0.3 # via flask-sqlalchemy flask-sqlalchemy==3.1.1 # via -r typing.in greenlet==3.0.3 # via sqlalchemy importlib-metadata==7.1.0 # via flask iniconfig==2.0.0 # via pytest itsdangerous==2.2.0 # via flask jinja2==3.1.4 # via flask markupsafe==2.1.5 # via # jinja2 # werkzeug mypy==1.11.2 # via -r typing.in mypy-extensions==1.0.0 # via mypy nodeenv==1.8.0 # via pyright packaging==24.0 # via pytest pluggy==1.5.0 # via pytest pyright==1.1.382.post1 # via -r typing.in pytest==8.3.3 # via -r typing.in sqlalchemy==2.0.29 # via flask-sqlalchemy tomli==2.0.1 # via # mypy # pytest types-docutils==0.21.0.20240423 # via types-pygments types-pygments==2.18.0.20240506 # via -r typing.in types-setuptools==69.5.0.20240423 # via types-pygments typing-extensions==4.11.0 # via # mypy # pyright # sqlalchemy werkzeug==3.0.3 # via flask zipp==3.19.1 # via importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools flask-debugtoolbar-0.16.0/requirements/tests.txt0000664000175000017500000000156014676013405021665 0ustar carstencarsten# # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # pip-compile tests.in # blinker==1.8.1 # via flask click==8.1.7 # via flask exceptiongroup==1.2.1 # via pytest flask==3.0.3 # via flask-sqlalchemy flask-sqlalchemy==3.1.1 # via -r tests.in greenlet==3.0.3 # via sqlalchemy importlib-metadata==7.1.0 # via flask iniconfig==2.0.0 # via pytest itsdangerous==2.2.0 # via flask jinja2==3.1.4 # via flask markupsafe==2.1.5 # via # jinja2 # werkzeug packaging==24.0 # via pytest pluggy==1.5.0 # via pytest pygments==2.18.0 # via -r tests.in pytest==8.3.3 # via -r tests.in sqlalchemy==2.0.29 # via flask-sqlalchemy tomli==2.0.1 # via pytest typing-extensions==4.11.0 # via sqlalchemy werkzeug==3.0.3 # via flask zipp==3.19.1 # via importlib-metadata flask-debugtoolbar-0.16.0/requirements/docs.txt0000664000175000017500000000234514676013405021455 0ustar carstencarsten# # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # pip-compile docs.in # alabaster==0.7.13 # via sphinx babel==2.14.0 # via sphinx certifi==2024.7.4 # via requests charset-normalizer==3.3.2 # via requests docutils==0.20.1 # via sphinx idna==3.7 # via requests imagesize==1.4.1 # via sphinx importlib-metadata==7.1.0 # via sphinx jinja2==3.1.4 # via sphinx markupsafe==2.1.5 # via jinja2 packaging==24.0 # via # pallets-sphinx-themes # sphinx pallets-sphinx-themes==2.1.3 # via -r docs.in pygments==2.18.0 # via sphinx pytz==2024.1 # via babel requests==2.32.0 # via sphinx snowballstemmer==2.2.0 # via sphinx sphinx==7.1.2 # via # -r docs.in # pallets-sphinx-themes # sphinxcontrib-log-cabinet sphinxcontrib-applehelp==1.0.4 # via sphinx sphinxcontrib-devhelp==1.0.2 # via sphinx sphinxcontrib-htmlhelp==2.0.1 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx sphinxcontrib-log-cabinet==1.0.1 # via -r docs.in sphinxcontrib-qthelp==1.0.3 # via sphinx sphinxcontrib-serializinghtml==1.1.5 # via sphinx urllib3==2.2.2 # via requests zipp==3.19.1 # via importlib-metadata flask-debugtoolbar-0.16.0/requirements/typing.in0000664000175000017500000000006414676013405021622 0ustar carstencarstenmypy pyright pytest types-pygments flask-sqlalchemy flask-debugtoolbar-0.16.0/requirements/dev.txt0000664000175000017500000001073414676013405021304 0ustar carstencarsten# # This file is autogenerated by pip-compile with Python 3.8 # by the following command: # # pip-compile dev.in # alabaster==0.7.13 # via # -r docs.txt # sphinx babel==2.14.0 # via # -r docs.txt # sphinx blinker==1.8.1 # via # -r tests.txt # -r typing.txt # flask cachetools==5.3.3 # via tox certifi==2024.7.4 # via # -r docs.txt # requests cfgv==3.4.0 # via pre-commit chardet==5.2.0 # via tox charset-normalizer==3.3.2 # via # -r docs.txt # requests click==8.1.7 # via # -r tests.txt # -r typing.txt # flask colorama==0.4.6 # via tox distlib==0.3.8 # via virtualenv docutils==0.20.1 # via # -r docs.txt # sphinx exceptiongroup==1.2.1 # via # -r tests.txt # -r typing.txt # pytest filelock==3.14.0 # via # tox # virtualenv flask==3.0.3 # via # -r tests.txt # -r typing.txt # flask-sqlalchemy flask-sqlalchemy==3.1.1 # via # -r tests.txt # -r typing.txt greenlet==3.0.3 # via # -r tests.txt # -r typing.txt # sqlalchemy identify==2.5.36 # via pre-commit idna==3.7 # via # -r docs.txt # requests imagesize==1.4.1 # via # -r docs.txt # sphinx importlib-metadata==7.1.0 # via # -r docs.txt # -r tests.txt # -r typing.txt # flask # sphinx iniconfig==2.0.0 # via # -r tests.txt # -r typing.txt # pytest itsdangerous==2.2.0 # via # -r tests.txt # -r typing.txt # flask jinja2==3.1.4 # via # -r docs.txt # -r tests.txt # -r typing.txt # flask # sphinx markupsafe==2.1.5 # via # -r docs.txt # -r tests.txt # -r typing.txt # jinja2 # werkzeug mypy==1.11.2 # via -r typing.txt mypy-extensions==1.0.0 # via # -r typing.txt # mypy nodeenv==1.8.0 # via # -r typing.txt # pre-commit # pyright packaging==24.0 # via # -r docs.txt # -r tests.txt # -r typing.txt # pallets-sphinx-themes # pyproject-api # pytest # sphinx # tox pallets-sphinx-themes==2.1.3 # via -r docs.txt platformdirs==4.2.1 # via # tox # virtualenv pluggy==1.5.0 # via # -r tests.txt # -r typing.txt # pytest # tox pre-commit==3.5.0 # via -r dev.in pygments==2.18.0 # via # -r docs.txt # -r tests.txt # sphinx pyproject-api==1.6.1 # via tox pyright==1.1.382.post1 # via -r typing.txt pytest==8.3.3 # via # -r tests.txt # -r typing.txt pytz==2024.1 # via # -r docs.txt # babel pyyaml==6.0.1 # via pre-commit requests==2.32.0 # via # -r docs.txt # sphinx snowballstemmer==2.2.0 # via # -r docs.txt # sphinx sphinx==7.1.2 # via # -r docs.txt # pallets-sphinx-themes # sphinxcontrib-log-cabinet sphinxcontrib-applehelp==1.0.4 # via # -r docs.txt # sphinx sphinxcontrib-devhelp==1.0.2 # via # -r docs.txt # sphinx sphinxcontrib-htmlhelp==2.0.1 # via # -r docs.txt # sphinx sphinxcontrib-jsmath==1.0.1 # via # -r docs.txt # sphinx sphinxcontrib-log-cabinet==1.0.1 # via -r docs.txt sphinxcontrib-qthelp==1.0.3 # via # -r docs.txt # sphinx sphinxcontrib-serializinghtml==1.1.5 # via # -r docs.txt # sphinx sqlalchemy==2.0.29 # via # -r tests.txt # -r typing.txt # flask-sqlalchemy tomli==2.0.1 # via # -r tests.txt # -r typing.txt # mypy # pyproject-api # pytest # tox tox==4.15.1 # via -r dev.in types-docutils==0.21.0.20240423 # via # -r typing.txt # types-pygments types-pygments==2.18.0.20240506 # via -r typing.txt types-setuptools==69.5.0.20240423 # via # -r typing.txt # types-pygments typing-extensions==4.11.0 # via # -r tests.txt # -r typing.txt # mypy # pyright # sqlalchemy urllib3==2.2.2 # via # -r docs.txt # requests virtualenv==20.26.1 # via # pre-commit # tox werkzeug==3.0.3 # via # -r tests.txt # -r typing.txt # flask zipp==3.19.1 # via # -r docs.txt # -r tests.txt # -r typing.txt # importlib-metadata # The following packages are considered to be unsafe in a requirements file: # setuptools flask-debugtoolbar-0.16.0/requirements/tests.in0000664000175000017500000000004114676013405021445 0ustar carstencarstenpytest flask-sqlalchemy pygments flask-debugtoolbar-0.16.0/requirements/dev.in0000664000175000017500000000006614676013405021070 0ustar carstencarsten-r docs.txt -r tests.txt -r typing.txt pre-commit tox flask-debugtoolbar-0.16.0/requirements/docs.in0000664000175000017500000000006714676013405021243 0ustar carstencarstenpallets-sphinx-themes sphinx sphinxcontrib-log-cabinet flask-debugtoolbar-0.16.0/pyproject.toml0000664000175000017500000000347514676013405020162 0ustar carstencarsten[project] name = "Flask-DebugToolbar" version = "0.16.0" description = "A toolbar overlay for debugging Flask applications." readme = "README.md" license = { file = "LICENSE.txt" } author = [{ name = "Michael van Tellingen" }] maintainers = [{ name = "Pallets Ecosystem", email = "contact@palletsprojects.com" }] classifiers = [ "Development Status :: 4 - Beta", "Framework :: Flask", "License :: OSI Approved :: BSD License", "Programming Language :: Python", "Typing :: Typed", ] requires-python = ">=3.8" dependencies = [ "flask>=2.3.0", ] [project.urls] Documentation = "https://flask-debugtoolbar.readthedocs.io" Changes = "https://github.com/pallets-eco/flask-debugtoolbar/releases/" Source = "https://github.com/pallets-eco/flask-debugtoolbar/" Chat = "https://discord.gg/pallets" [build-system] requires = ["flit_core<4"] build-backend = "flit_core.buildapi" [tool.flit.module] name = "flask_debugtoolbar" [tool.pytest.ini_options] testpaths = ["tests"] filterwarnings = [ "error", ] [tool.coverage.run] branch = true source = ["flask_debugtoolbar", "tests"] [tool.coverage.paths] source = ["src", "*/site-packages"] [tool.mypy] python_version = "3.8" files = ["src/flask_debugtoolbar", "tests"] show_error_codes = true pretty = true strict = true [[tool.mypy.overrides]] module = [ "sqlparse.*" ] ignore_missing_imports = true [tool.pyright] pythonVersion = "3.8" include = ["src/flask_debugtoolbar", "tests"] typeCheckingMode = "basic" [tool.ruff] src = ["src"] fix = true show-fixes = true output-format = "full" [tool.ruff.lint] select = [ "B", # flake8-bugbear "E", # pycodestyle error "F", # pyflakes "I", # isort "UP", # pyupgrade "W", # pycodestyle warning ] ignore-init-module-imports = true [tool.ruff.lint.isort] force-single-line = true order-by-type = false flask-debugtoolbar-0.16.0/docs/0000775000175000017500000000000014676013405016165 5ustar carstencarstenflask-debugtoolbar-0.16.0/docs/conf.py0000664000175000017500000000220414676013405017462 0ustar carstencarstenimport importlib.metadata # Project -------------------------------------------------------------- project = "Flask-DebugToolbar" version = release = importlib.metadata.version("flask-debugtoolbar").partition(".dev")[ 0 ] # General -------------------------------------------------------------- default_role = "code" extensions = [ "sphinx.ext.autodoc", "sphinx.ext.extlinks", "sphinx.ext.intersphinx", "sphinxcontrib.log_cabinet", "pallets_sphinx_themes", ] autodoc_member_order = "bysource" autodoc_typehints = "description" autodoc_preserve_defaults = True extlinks = { "issue": ("https://github.com/pallets-eco/flask-debugtoolbar/issues/%s", "#%s"), "pr": ("https://github.com/pallets-eco/flask-debugtoolbar/pull/%s", "#%s"), } intersphinx_mapping = { "python": ("https://docs.python.org/3/", None), "flasksqlalchemy": ("https://flask-sqlalchemy.palletsprojects.com", None), } # HTML ----------------------------------------------------------------- html_theme = "flask" html_static_path = ["_static"] html_copy_source = False html_show_copyright = False html_use_index = False html_domain_indices = False flask-debugtoolbar-0.16.0/docs/panels.rst0000664000175000017500000000537714676013405020215 0ustar carstencarstenBuilt-In Panels =============== Versions -------- flask_debugtoolbar.panels.versions.VersionDebugPanel Shows the installed Flask version. The expanded view displays all installed packages and their versions as detected by ``setuptools``. Time ---- flask_debugtoolbar.panels.timer.TimerDebugPanel Shows the time taken to process the current request. The expanded view includes the breakdown of CPU time, by user and system, wall clock time, and context switches. .. image:: _static/screenshot-time-panel.png HTTP Headers ------------ flask_debugtoolbar.panels.headers.HeaderDebugPanel Displays the HTTP headers for the current request. .. image:: _static/screenshot-headers-panel.png Request Vars ------------ flask_debugtoolbar.panels.request_vars.RequestVarsDebugPanel Displays details of the Flask request-related variables, including the view function parameters, cookies, session variables, and GET and POST variables. .. image:: _static/screenshot-request-vars-panel.png Config ------ flask_debugtoolbar.panels.config_vars.ConfigVarsDebugPanel Shows the contents of the Flask application's config dict ``app.config``. .. image:: _static/screenshot-config-panel.png Templates --------- flask_debugtoolbar.panels.template.TemplateDebugPanel Shows information about the templates rendered for this request, and the value of the template parameters provided. .. image:: _static/screenshot-template-panel.png SQLAlchemy ---------- flask_debugtoolbar.panels.sqlalchemy.SQLAlchemyDebugPanel Shows SQL queries run during the current request. .. note:: This panel requires using the `Flask-SQLAlchemy`_ extension in order to record the queries. See the Flask-SQLAlchemy :ref:`flasksqlalchemy:quickstart` section to configure it. For additional details on query recording see the :py:func:`~flask_sqlalchemy.get_debug_queries` documentation. .. note:: SQL syntax highlighting requires `Pygments`_ to be installed. .. image:: _static/screenshot-sqlalchemy-panel.png .. _Flask-SQLAlchemy: https://flask-sqlalchemy.palletsprojects.com/ .. _Pygments: https://pygments.org/ Logging ------- flask_debugtoolbar.panels.logger.LoggingPanel Displays log messages recorded during the current request. .. image:: _static/screenshot-logger-panel.png Route List ---------- flask_debugtoolbar.panels.route_list.RouteListDebugPanel Displays the Flask URL routing rules. Profiler -------- flask_debugtoolbar.panels.profiler.ProfilerDebugPanel Reports profiling data for the current request. Due to the performance overhead, profiling is disabled by default. Click the checkmark to toggle profiling on or off. After enabling the profiler, refresh the page to re-run it with profiling. .. image:: _static/screenshot-profiler-panel.png flask-debugtoolbar-0.16.0/docs/index.rst0000664000175000017500000000702714676013405020034 0ustar carstencarstenFlask-DebugToolbar ================== This extension adds a toolbar overlay to Flask applications containing useful information for debugging. .. image:: _static/example.gif Installation ------------ Installing is simple with `pip`_:: $ pip install flask-debugtoolbar .. _pip: https://pip.pypa.io/ Usage ----- Setting up the debug toolbar is simple:: from flask import Flask from flask_debugtoolbar import DebugToolbarExtension app = Flask(__name__) # the toolbar is only enabled in debug mode: app.debug = True # set a 'SECRET_KEY' to enable the Flask session cookies app.config['SECRET_KEY'] = '' toolbar = DebugToolbarExtension(app) The toolbar will automatically be injected into HTML responses when debug mode is on. In production, setting ``app.debug = False`` will disable the toolbar. This extension also supports the Flask app factory pattern by separately creating the toolbar and later initializing it for an app:: toolbar = DebugToolbarExtension() # Then later on. app = create_app('the-config.cfg') toolbar.init_app(app) Configuration ------------- The toolbar support several configuration options: ==================================== ===================================== ========================== Name Description Default ==================================== ===================================== ========================== ``DEBUG_TB_ENABLED`` Enable the toolbar? ``app.debug`` ``DEBUG_TB_HOSTS`` Whitelist of hosts to display toolbar any host ``DEBUG_TB_ROUTES_HOST`` The host to associate with toolbar ``None`` routes (where its assets are served from), or the sentinel value `*` to serve from the same host as the current request (ie any host). This is only required if Flask is configured to use `host_matching`. ``DEBUG_TB_INTERCEPT_REDIRECTS`` Should intercept redirects? ``True`` ``DEBUG_TB_PANELS`` List of module/class names of panels enable all built-in panels ``DEBUG_TB_PROFILER_ENABLED`` Enable the profiler on all requests ``False``, user-enabled ``DEBUG_TB_TEMPLATE_EDITOR_ENABLED`` Enable the template editor ``False`` ``DEBUG_TB_PROFILER_DUMP_FILENAME`` Filename of the profiler stats dump, ``None``, no dump will be written can be a ``str`` or a ``callable`` ==================================== ===================================== ========================== To change one of the config options, set it in the Flask app's config like:: app.config['DEBUG_TB_INTERCEPT_REDIRECTS'] = False Panels ------ .. toctree:: panels license Contributing ------------ Fork us `on GitHub `_ Thanks ------ This was based on the original `django-debug-toolbar`_. Thanks to `Michael van Tellingen`_ for the original development of this Flask extension, and to all the `individual contributors`_. .. _django-debug-toolbar: https://github.com/jazzband/django-debug-toolbar .. _Michael van Tellingen: https://github.com/mvantellingen .. _individual contributors: https://github.com/pallets-eco/flask-debugtoolbar/graphs/contributors flask-debugtoolbar-0.16.0/docs/_static/0000775000175000017500000000000014676013405017613 5ustar carstencarstenflask-debugtoolbar-0.16.0/docs/_static/screenshot-logger-panel.png0000664000175000017500000006362714676013405025066 0ustar carstencarstenPNG  IHDRsRGB pHYs  @IDATx]@TK]S@  [nٝnn@Q %Qva?eYBPP͈{'Ϝn3gfh|;F# jqu:F#?vqs1F#wݿF#C `0u`0 FB\/fYYƓW'`Xx9q߁@~>^X(.s%p#`02YY\n /7IK UT0ǸzA`023勊$a>=]17WNCPA+ &*oq5F#-Tu-b@A(.ARF!!#Wn4%d3x23` YX. `@U`0 YrJn%%E%%e F <&3_"HKY8=`{pƵ`0*ʖC^^VUUئA<8%삂R:3K^F%߃@7䅾܀+z=#Nه\os`T ^^nbAsh1lk\ F# 5UT%")' Gx/9mv0D|.|nJܠv#^yslD/4QʳEGlHj oNa%m,ae{ɣ=iu9 nl(BV a, +F#A 7WVbw%!J̋or [zUPVy<&/3elp"PHlqq\n+#}EH]rQ‘z@VVν\U@(()AV<9du%hR/G2AaՊʊ2`_@]BCCBGs$Aey}a0eLXTT~@]g X3|n}7 zD8',>~1a\_T[m^1Sc?%D m[sDfs jM(L] 3mJuqo8nLȡP]NBD2B>|K) v1R33.*yTvb\䗌bN1k7nhLDmlq ~#}p5?U/K J;`[-r999NLUU+ip .%"ρ8?nШ%_Jg?|T_GCgS;'OpCa$ZeDZY[KeyyQ(%2`"PESbϟ?XlcyNn,i1. rR"4m.ܶhxR*8˦xz2h;۱I&;qsi>ȱmD}_-]г3# X=e!d{>b~=89b:[< jO, Us@D*1ª0vfdd0D'AIIIub)..bDE&=ke=]kiKCbMu_$70dPXno% ;FHˆ.gb9|/Noh:pck^ڝF̀y#g68դcXt8TsԚڜ5CiHrw՚Ri_aP P.f}%7D?J͠Hc!DҜgy~Dd`;uRw4ܐgi|E][" Zgu~*E*y3xlLN :1Cml$%7xәԤB5ȿ|O0d-%EvCaM5wrrHr'Ё@DP(=)ߣ ]ttBF9ٶvĠ dg!. &KpfǏ,9< vtWv#Ѵ灁Hij$غz?vHdDӭ rIF, xzkw0׆۞g=rm2xBL#T: @~?ГBgLf5c!vZj?zۡ>]ZVGܿxcRvL$׉CD>^@[gQ<}I[30 ɛ '9E^HgR [Xo5ɕ1S8VsSt/F" ad`qР6V@~ScnhjjFDeƘ{ #tYv9bwȗ$ZGr2$<*#o_|unB|x%Q5V{aN{Ԡ9M2,#_ۚD0j1JT-*W"3Bo>=jC˜*rkGM-nҡ Yk%6"Ў]_{oٷťrDa6=PyPb䒕;v1TҦ@ 䁷$-mM7|9]n¼c݈huR[M|-y[6V+uv~ \EBW i+F"zJF&[OOO$x/)Q0 T)i, mֺdRRSY`~# 2^^M9HFNa-l _!07*"bSvPbWHLDu.Km"ӵ7sIeɲ>}[i$hV-˙Jd'Eμ{e~q)Փ$Aە3+qͺ.r&'~G/yDG),\l"KyqHH]i,bĽ|Yl %m˩Iu<߀c/F࿈YIiuR_ N/YT:*'^˗4˳;F9ƍ\MeQ Fs+?l2T-QzU?DIP50!`gV/*en:^ +}K"]OFGA$_ mNԙqm]Ɯ.8p@q%OmJR Ѥys/Q߶ ̀y=t`*@+U!%JЋ[=W`YBj@%Gt|ŝtӖQuQ~@}D@JJG<5W`[.>MX,kD$(Ed+Q}gJ:=fTO0nenKWfw_$ZЦ =%)}}c<ois=> fRnetLȾk2*D}rZG!td)fMqB q9=iuIg×K aہ]`Zܡz@XKVE͑~c}]G_G Zg ^<`_3 _ FDkA.e`LaKg-՗YK3CzQJZBͲM EE@]KKK*$2`A4Ņds=^t,{wNFQV:z6 k`i){aك0>Dt"R:#TSjZlX;5浩b߅q"LD$@_vJ͇387~zMP߿>QIɍ<0ppGb(*PȚ(SUz]̟9+&ˇ=zO^粨7w0OV+:쮭t4ՓXuByE)<5)8gHKt9-apVsJJJSA!R$QCHITtdĥ컽ZC؁@ d}ׄn @}psBtgA+s*$+? Zކ 7Ohz(sj٠"RRs<=ՏkmtƚUՙ@'~3{4k 'ەӗA 6eTBaYESIEy"jW[#++23ލCրUHa6f?eK^%,q n=tT-rܯSN8 #P/+f2KL[]]iIndS3 aHq`Sd鄇SJ{"wG=y5F+jTSwnxJ- 4=¶ xH{=Pˏn_S/!(Qf0S[z",GEBGdnXfP׹ {,| o'aC6vppN^kql**U<ܜ,*SksqQe^o~AXi%sI)/F~#PJs}xa+YS5+5 xY I؏%~^x_=tn˒ Ya]$ Xi#جtԴnmV`>հ'ݏbąG{Vјy(T:zF,~.Ogb6hB6Eّ ~C2Mvq{u *^[A*ydu hW^}'>43xi-kڝZ96kJu?$M[hbF#T$%U67W\T īQg4؜Ztî(YQ=g98<}(,iڮ-8ϦW0~&P+3b8pg(VN5{7*lO΂zÏ/g^nF)5k\}6挎C t誅=}*); ;ʡ=>[ѳHɵ_pR$ |JpF>"- ޲ e魡QVʠT0΀(O+Ԗ ȀQW: J$Re{ߗǫ ŀ^NO hSޛ)'gDQCEUjTAӣu4z E{ґcy Ѳs_ޑ(P F Qz&gԫiRaSI3{2ⴹ?Jb': {1`Y&>8xLErCu0]=F'WR=feܤȨYg2i [1VpaYLf.{2edQ/M1SB$ @ &˷48մ k +E:?-L6 %HQE BnҗDPOKN.˫h$8`drS^YAοyq_H_1|FJ R8N_ss D]]/Y(!}jq-me@m0hZZn+܇k8 L،םZ+`N"L$70(r"U] i8$ ++Al3yghKsQj=XxW: T۞ο;2g1yLHn⻿CcPotVGeeleȎ 촺ե)!Np)S)C {hh|ZNN)r3r)6sMZ`Ϗ*%w "GވHn0uFHY|1\+>|hȵ[$+?b0UG ;K.3w)Ș yV{#?-0rrbۧ:Z-^\[`-ra;_7̙d|`gfW(OP(ynqVNJ# _rr y!]jNLe#:جUΎ\X?&x ϯ +,˅FwݽUsF#Bza!@mվl u$hþoqH1AF!ͅ\. FEE@\F>q$;;٭ ]{js,+8#/!ZZ7_B:x:p^F#`j,kb\F#`j,kOL #`0޵1#`055'`0ZG ZW`0E S`0@#wC+`0@"@YF#`0]] `0@m 流*`0ZD Z`0@m wmib0F»Ť1oC`K57xs~"%""-E:x w`0?wANZ"Vtn'uQyJ2s.wM#a0?>P՘lQ-n7&"#zUϞ.[8.U`]xbjF UbAE ozGqgC}~|۵Ƌ:m ~q{Xθ~TakϽ&i5g&XCѵۿe1 nN Umo_ _\/bbb`0_o,|ッ6%5:޲KӔC]ziv茖;_ $ڵ#lui iŗSmw!՟?Q. ܓ{7m:gS.o\a#7:̻[նpm -~f|Z޸ +tB豀.T olccS8/F##{ 1.= ?F=h_ލЙLh!s{-w:ae9Д\Qi֦#3FD12^E=J{W;O aA2;,N`0u g-pH06a&_ o7Ţòz35cr }>ͮt'0ͭOvN_Akޔʘ|߬.]l{ܸaoش{݃#9/M <=L{3~^lީ ȟlrڼ8r~Axsrhaq\'hW֋_7=9[aW)Bk魇q#ʴswb'jk1BL~@cPAԉ Г&(i˦͚l3jALN! |\!!(m~cW0[ 2nF#EIՌm˿ƯqNYDґs.LO)Q:+) >rTI"H (GZa-ncVVVRy "QŻ|w^ zp\oQ y+e*Jt~`h0:.qd%B?v'G& 4g}[KTɏI%(c_-#5?f$%㕏L>?43B|ha. !ezw[18\|5U24gP:Q/_<yǥ^gǙC%pݜ`/eA fM>>qN0/}_R_ Ab}`%>[0pC4&GM󙡧K*}I7~d/U)UX/Yd?[6sN.c%8z%﵋烳Xwɷѯ{H>˻lie;/~A Q1l)1_`c?uP41dT"#I{94-($#F~"P›FB{miv`X&jr`$ O ևhs'doUܴߓ\I7HiҾQJ>jA-Z*f(Zف|,tE@%>hDl<|uN|ʞ޶t^{-nG.rvPDUE»gsu%#YLd͏#g&Cq1G鉰GZ=::z}VrK7FoR^#U@^jʨDYQtϝb&$;@_R2d2cEi+F"Pvʔ^)&20MNPS]H#g\y}ubvٺq-A"թS磂t5-yD͋KED ,Mǿ-#Rh )RQ&ڂ硢!m~3ͻ |̩"(lްMA|=xC>f*j }-;6vkýΘQLh>j Υms-[r5W~<<ίYFq|gkrG] SSVK$^6x~:y@=bLG҆.g/xͮzf{O: }B ֽ7׃HH%>j]oF\!/<~K\ۑJ:oE5B*#R0+-1#Ta45G|zzpɿx>sXh묬b:請fZV!+kDf`6v%ʮe+xi) ~#R=++65HN(IL rr"L  .*wyR~&7mX- 17tZ Lw8VKӔ'])+:n»zxܿMxڼ.y^:.ztidzvV<ƒ\F PJU[k m{옷ѩ5G(s0>Yiښyd^ vRWmg{(nv n&q&6N .Jрxֵ"w!0@M!P9 %-%ŃdBt27Rr@  94MM̭:Ot] k7k.?Hy4CS 0;CaJI)Y< GO[MǤċ@ QLXUwrҒbbⲙb U3;ȝ&CDnTL)L [3UHn[P p?糟ǝΟco)Fe~|qԩ#R.<'tN|/kBo';WT]wK̐w}~S˸qc_ܿuIMCWIs2<(qpBdeMͬ t;ȄrTu _"- Uc+"RwweCG]9(\Sٯ+)([D<LEX4 _k4In T7*^k楾Cj8<_#=EOxU<]۾c=% [7笋Y7?Q`9g/l⛣̣Ŀ"W4洹RX+WXZ7y8 \ðtZsӬIҎ+W.\tS7ψ4qS) &؈8MqU\Ӛea.(DRgR.˶44ij $&㱫6Y g\ɱ Liذ`oKmP!D2aF+?k`ð[ Gvt^x<JK槮|!Y7V|SK0FLysW#Th5IG1"Eh{<c}!kLi0g*v 9ud3`rSGeV9sDWKŐڏ=3zTp! y•R V習zˊCQ ؟oD7 zсSN+3T$vOn25-XiYH!w.$:tySD J?\?]}Ae-xň2<<݇>klb2?F/۟JoDxr ިt蹟~%Nm~WiN4߽}=-EkCT9#ivle⟝(K7QaOF.*m&iNMERRSRkj۲isUQw^M =<8edSyc$7*Έ >?߲~DK:zvr/D=V^730242%^E哕n85(:H$B03:t50Uz* !`4i=`і48/!9c{ܢFe#m3|=^Ee;rݰb& C\EW:)* >|w=T5d줤FYqIq2>n#Kʶa?Y*;-M݅W6א݁^°I̞eAQVdt:7m-D>Q< \* ō;ܸ^ !FNM[iZL%qת+n}2RFcFGDDPJPHCҢʾ"RD\8gE ޤe/N\z*(<<(m'#oqIacn+Ua57=omP޷=r{5P_SLT`yS>7 J/DHQPX%?T_ht!O(dK2 *Ab^.jPN(V.Xmtj"GK~`1cJ(nwUTu=9A귾:7.f< FGzМhz<;Ѭ@#ܽz; r#eعo݋1/?(U͖? W!{LcF vkIِ2-0nMF_ߔn -N~"`{WT`zMqPkAhttK 9w[mҽ.0p]׮M/f[L(wi׃C<7הY kG=P_ΓCaaFD'nUlT@lnHb5J?ۏC#P:h yfԷ۞;4^-gy<b~zvx9׍[vf?fx.mƵ[yky7NFh%PԒoŬ7awݹ戓 u[ٙ :ULz_#Bq1maT6"Pa.lx5k_XfY i,D" ZBa?]c2SM<}|4 N(ξP&RM"bLwc61A% }Ǭ#XO-1zf7Mi|ul=o ]E^>FZ" GtTTP\VG?Zq-!K(Oaנ [) (N!A=@k}ewj=`e7>vf #S.Kҵ%hHCVZ=M2#7"9י଍Xљa, 2E@@q& ϐҭJMF6/ v_ζtu͟S '>Rj%zͲw}ː\)N_T\bo7ǣFaî'gd #gSӖ]پxihBMf]-Էw i ʽmy4o(jg gWx|ZٕMs/`C ɵ op+ ߡԻH!#z^u§>H]@gA54cw]J5 Ă3o춻SQ@ViuSzk[yA-#cCGg~Mu ϗnsF(O)0G o6{[r_If",@r%Op7H*gbn'>XGd%|w~E! {eƝ{_;6B t~Z]vɚqSBFÁ@օ^E "? `$"{Py2%fHi!j'0IDAT?;*,Yr_u˓M\|:BOCPPQ!ņ{F9b'>C<4zڛݦzBpV#s^< ;cV Zb?y b/b_M #]q>(ՕYPDS7!P)n4:CSYN׈T_;sȧOAOMeZCoNOiIiNc;lѲW)V(%Nk "7͊PX/iw}{thmC(`i&|Ou4a Uqi, lX&tx ’o( %|I٬ro _Q2*h =Œ]D/aAF&^.&2[ Od}'"cwL'F]B'tSi)ܦIE @oĭ#Lt: {3| %{BjK.7ru/W(ЄoI`ŖMV2vjtӘWgvY2wbG:|-2)[Zr$Mssݻ5\BUX#'vbY׳9f~KHc2]s-ZՆ\Qף+xtk(N•jtўf;5ՁV/LΟ8^<_T<<'ID沊 .nV6o ݯ=ĭ_X( hSYlל8<+/x;\vaDd&6\ BlNvjZax*|:F4oRZ;L7zW~V^ xx]O 4Ag',k>3a< Im-lh3@?mGej.J7qaS f`]$~XT|%8좜",CNXŹE*J '#MVeH x l.+)>S$-"/)*gI9-338`Zj/@1Kʄ fիLMe1u +^ER02Yt ʫ2يkH^HON 5'5PѕԔg,.Fn{Sʸ͞Y6WɑSX V/SVߓ&GSH <43+A<3-P^[[^Qa[Vp脶[p׷8DRȤbN#C!aaJy׈##RP v[QUQa38 :np|n6!/+egUdX^n^WUX\d{6FEVW^ bN.SSoMQ:aHut%}riKmX.[Qd+"dX[tm=CJZEݧ t{;-b}c;v zyܴn]XsԋVlDjj8]<6cz*-֛R)U5*i"1J c.=ȻҒj:]ϰFZ-Õ*UyJE,>V3#mQ)C6 eTx,ˑ9QqD($_|XxW$#`dv+ eZ>46hR(-\^N(P,1`0A@MiW*|ZA7×VQ`0h2 ߒTυwZ\L,VӮj3--J3 E[VU u VV\6Kudc*K,h'bq F#2 UmYd3$'Kž>:[(i'&fVȫLNXf/O5x@S*m@qwie ,u-U5u uU*zYQQӀj9G N$&*!#6CL]<"dfs #N KW݁di|mTFeY%1F. P77r_cnބYh(sKHJN~~NBtt+y?umF3|($IV94: gDgW%gnr2P3Oi@dJ߁^& e!š7{;,6P..m qj`82k{hd{y6%"sD@-#nS" ;F##}-pjPt[HȤmC2%# ʙF^>|]_zu!yEM8,[>-?X Iog`dhdJ:#6S24U9 k*_G_d3ږoϑ`ʊwá8!UN} RnFzr#ҡ=|s2.nuST>|nJQn]0\#O"P79#ة8ҧf~FȆ4ϳK&!NaTp&SNQN,`Hn*ۭ-&MW3Y:y_A RÀ4\hn;]2rxIIdӆ@o#DraF ץ~hc[{Hчt!R'|4WrNJ**꺞栳SRS$Sg7Wwo[[<ļ>uOhKmKu}ԝ##{_\HZ1&`E<) {Lc!(z/nF#{»R=.z!兌úmy-'ky [BFzew0YNoGHZ&Dn]NŒQGW|Urda8s~,~0;r$~SSфy^ ӓYIЗwaqy#l'f%ge~eP4!<iT%tf],>Ȍϔ6bClPndE^>ZYt}ǬhP{V];Gr+ۇ SxXV=?c-mߐDzr95mQBecn-Y"7Ë(D)&- vW[v#/؉o^vlJs,3I|A3# lE=Ba޲uW^OF7<_킊Vx| \b|*|b1ȱ8g1_CZ.hag]#,5uuu lvpP#rC ?5 YP܎ys{5Dfn\{bvzԯp/uh]0L9\ g|{vmG$ʍDĨra=GJp㟝CphYu +F#:@x'a%}@) Kfɚ: tM dN,iv]4EqIiA~OJKUrzStcJ:u"ؔZ"r }Є.2)&+esIrY?i_xZȕW_Y=}|s?WKz~KSߝo@ tD|_+8o`غqzGtܮLk#_쏏iY g" PH%cfK?{uzf2"MKcwƘ[Y$[~]h8FdYku,avȜ杽`ypaC&, jəD_Egn{0X{o(ة|yLE%z?O*~_9>T$BDl͑3 5t3`* g\ۜB&ユ2 õSڜf$2Tp-.n92kÕ1S5qɊvh.[ ]=j;k &=H^H,·Ր{nT:L7zW~Vн xx]O 4~{فc;lFhoNVF:#AY1 y CRKfZRgiYyy]IK_~V!oUNv\l&ȐXG83;++ES_MD^x8H^If`& ]R.;q,ߏ/u䰼 PɑF NsIs3\/(xIE;5M8oIHf;UE "U6]-_(Qo!o>%?%wu5[nܿsW|ÕRQm7憐E:mkۯ.yOdJ[N/J ;~Wv=EBDС~3_-2Ui;:ԌpL +:vHEJ /T矞I/Z[U^~!ɿܱxU?NLPGCAA?=ɺ#ozۤQ @HൟϦ֗qq+7[${aY?6T]ڞ!†?ψ=oehc0>&釼Υ^A rۮYk¤Ƃ$T͵G-h;::vh@E@?5>DHtw?_}-o䪘9'l2"DkU*OMW;z;FВ{M3_n|exQ`I*fIeE@oH:c⿲C`"N.gwhF˭0J5]T^zYܭ.HGE~[WSURfwk- @0M6i| ?-( Wǰ LS yL[cpjk躦ުtm̉;7?ݼdÓURw3!xƣ9CN"kB8h^@P]PM_l*I3幑tA!WԮr/L׽USG_\U4oj3n [a+ LckN2Cc\S,Z0,{R5C6f|4w9T m,}UssY9s|o[+qnk[=9 $o}8ыtmJt4oъ̒Էl/yg\0.k.Ztw6t*❔ ܍Ս1XRv-Թ4}UOtJFXދ;H`|3SHk#JW[D%fz @t7pBNNRWBcZ}Gm+t O-m7o~6,L 7 yEҿ=Vk_ټoN?`}U6 Y\jJഹ `\`HKKۺuڵkL N?stgVxHaSadbdຍeKE׹EX.='##*cjgˆdog"w_C4AggmrssH$چ&W<UߘEoR3%uxRejl-O>tZG+T Fۅ:@QgǏw:Fn>~m=;K]3RO/vbڝ*SN k*s'"x[=⨄ 7ٝ;wl=.1oDo sYTL  KNN 0nX{ % +t]^^Nn+Q58qǬ!'x kq7;eKۖ!}0Ν;G/wɜ_€ 9T( ׯ/)) nMC8ۅsV&pڵ7i̦y>~ӝ!M|w=!f dSM$u6u!XC-((4mƯTnT 6v1_@L)fw+wAc(N C@m^ mMOX:@'n_a1[__h& P*;i{@UM_8BxI 7N[4%^%%|d-!gG8|n(,Xn IPzȕ㦎jڔZ!U[T7ns x[A- __IoRMCǿ?+Kn}臧gDzjm7u:]me `k!6wdպΈtY{T.XYh?^b㊕>-!޶m WjJ1L ө7/T?ZߨK4F /={jJ6rIVl=ŷgn43 ]s*aɜ f6%UԺV$[4/V#u֭Sg~qD/mj =6XИ BFVwCDw$>aQâ=[?56sy'Dl!qevJH VU: @AYۙ@ mE g@v棃A, x[@A @`l  x<A-H*gż A-܌wh/H2N @.)풇 W@v壋AK 8tKbaR+k'zs6`< 6P @p6og;" @ TCMَ@!m g@v#@l xB5 @`< 6P @`P 42uaƯrpN~0<@}&Qj!V,] ,CS:vdŠ&u[JUxod/ܐ׮1Xy;BwO7n:+tD1nx'eΤ[w#6@:zCcG`U @1h}*gO[i1NEއqε {3fDrea[4{ O>Μr.Ŵ0a_ٝs%%ޘti߸C*U wwBe!LݥBR Yt/kSg׿7V韊Z'VwzѴ͍{s)s[~B؈G?͈~={uZpa#(g d x[A- &04eP! s^Y% ߴfe͒EϢCM3ns7@Ix.pu\Lϝs|Ԥ jyIuhvv6Q5^,6rC7.UvΑ)MUwu(wwO%@S[V-pK<[{+]g /9_xo?#₹w1=-TW ktj+˗vf{X?PYw:IENDB`flask-debugtoolbar-0.16.0/docs/_static/screenshot-headers-panel.png0000664000175000017500000016014714676013405025215 0ustar carstencarstenPNG  IHDR,ܴsRGB pHYs  @IDATx\TY ((X`7vݺڝںꮮ-6``cb% 04C zOgqι7nhB+& `@M]j:O@η70L`p\L0O;q 0L~2yd'70LλCL0v? 0Lu & T >&p8DF]]@ TUU#KvU 0:H ?QXH/,dp 3|MM&*dCL `]jLajYY|~_n.RUհX=&@0Lg$PP,*Rj|z:37W^= /N&%oV~0j'U~-1@E.ILFw`J1Lddhh(UO!uu7s8@ T^-3t @5λ c&P[dej(ZZL--z)ZPPbX DUEVHLJ@λz8c-&P`UyV꺺6U !hifȹ,M5u>V@7'9 %z+g {|u`US'鍽<6P>%S0tᱶK0e*5GC0s0N{RV2YtݿbȘ񝣼mC7\}wVc?XNR.<==-77O6FkO=?Z/H/Vmώ>?< !M!4S#Zo US‡@7?#uhILΛ}mY{je)ӗ RBz^RN; .X)R`֒n5ᷬPK\Mv`5B +K&^=Ux<9=ΛG[ҭM%hd  AJ8 ; Zo~uxi꣎C'1Aكe~m:=gt,#=w]"?Iz3r>ã-d%8& TX,5XttT,(H \K.l"px~G9 A4!n坛/5AxJAHWB4XC wV[C"Pt% qvPyY#Afz9@P.%Mn\¿dѐܘ|.`40WggE KZ fC; }zɧ,lVC#?~IcY6u4ɟ>FDg7spK}8 ~rrƖ5sb .H_cʮ?Z54B'q\eGGzĊ7/MS3cF) =NzAd֢Q?қp&뙛8vjZ w~;K9z/*ض }qX@Ҽq+s* 6s^=v 9GwFW[+WxpoE J5'Svݮn reG k=8uzDM?G/nƉ{t´2zVJɕ@]&f]o0dddXAIMM rI.Iov*iƅEw]-M+ Y;p8.KB#5v܅zS5xjFæ{,_TnwV玜ݦɤ '&ݿu:@ę2u K6k^JPzyHӳʖ,bĐRiWܐT7"wI=ȎliW$ Y'﹡XiyR:s?geܸqmR“[٫/xu:Rt,`i)Emi)DZH@#\A-Z ~SҮޠVɡAY\e?C!G_kKIwِpedJ_9}i-G8NN6x}F<r.ijB >|7;vQNڼwl*}h(C|W-C[6pvu^:&po9\w]#LPXd`^ d``[A KPSS344J" ÑA\UUU:'()VqݶIh<,K4 "D3I. ZTqrGX~ui.};xXM/UJ@z+.+^{Ը?aʖQЇ Eש]#vq]?RLSzؐ du _M_,N:Oe 6;qr幡mw"faRj5Ԍ7rw mJ׍ʭG~?Y4.vlT޽ҩ>v8**^655MNN7`0 ܲ$B :ob5ah7 k0FPiiBR(# P|N5 n¯BOFe4-࿏02G s?FDr) ȝvr-^-zxwK TxA&ಃdX[lhh!' I"-V8s+=~6 i59r4["xv^C3ddoCe0<'Mv^5OBzқ,'ܐV윹hYN-,5T~{Ey`v<7&eV ~%uLN/ }~ؿPlEo;Pӧ4`I=~vpφ€C\FfQ:o(qNB)nSLTH3ATaE "L)nINt{SXܫ^MʷI_ҾwfLr+%㼃:I!!u)֌CPoi"[m稐OV |I 82*Bȡѐ+G^9 Ҿ_߶l ek8&P ݘ  T6 ߰Zi! *˯% u%Wܚjw^w7{v~5p=jKn-\xvqB {v\6>$JJD  7QgN7`{/տ?KqŜLe~zz?w5lx?wEUd_)VT . | yF%\prCs 8*(+z$s:k@B ^_w\qO$65^Q~YM!ʈCvslD4ic-fk|6~e c 'HպGk6nOϾ^- 8Joɲ5h+f<˼A,2sꕩrZSiB᫪HOL)Lm3S+KxZX` O/"X6O Sbhj;62oHg\z"N(yYp6).L\c? |FjBkOk e`yynnBʘL%# K9QJ.Ϊgۏ `@fFvRUPxWXqnʓ}zrCG.?X9o%}źی `@yBZNxgKjs&-𘰄!0]]v=wy e0V'bKаPUE ǃ\oSJJJ%DL.'(\ ~if335Zf aAa%edq(wjv , `8`a\ (Yxut*V)yשӅ0*%*Bza!xGښ\MM^e[GK6 0dþ*ovU 0:F+|‹z#u 6T 6/0L*VUצ{VE@3=?bq0L0:L;:|& `?'[ `&P `]O60L$yq1L0æc& 9;n5& `@&w>ytL0=&Fl9n5& `߃ɄMOidPi"g4//O>Iw9Yb& MB&P9xؼrpmL0L T;r~&l6;666'' VVV?B; 0Lxrp*!w`B0LPB-WPPJZЄBĎ! {Am oWյjX& `b|>_~+Mfk?ҡf{6%K-lSmq%w0LI;~ԘH,ֳ Ŀ @<<1Wі]wzǷm]Dģc D~Jg^8wUkHY ɍ.9ot;Jգ3ܨ*2@g%H `]~V$& `ɛ!`Yn9w1gwusuG[c:'#54{䢶P^K!ӤM߾ a&~eލu3$fp &yn%OUк!Tu#y)ӷ'ZB-K+cc{)W~׹Wp'.sRA.f:u]k5Zl\Ŧ/bbbjq[i& TkkSV>M;ژ9!3|}*@}?i,1oͅm#]tL$m޻cG(ʎCւSAZ l /3r& \v<ѳq9K ;3r8]A^¯>J\ɶu⯊ɭ[|\0ׯkahӷMk#7NB<ャB? ?~.ec^μ@%q->J8r"6K*h8Լ'YX#} A%xcT~W!e|S*7 w=ݻO'Ty\0Lz{9uW,xv:[\'sC[KK4=/+нn4ֱqcEI"H$YK"(qع6+94r'\6wљp)?1%1Lj+z>wuqXU!~ӝ 08ʣ6QFqg5hGёLSk{urosm A`_d7h2# qbK_2b^?/0XgXHλ @80:Dʋ.^ƞZ4Ve;J<֏MnP'eo'4SghI\#T\BDtlZ asFVG(33IFb>H{gjWC[ ygc&P9`0&agb= Ry|x=ܼzME"8eB3k%lܣ/)37 pVNz=|>uAmaM{y]|yQͷS[TA{\=fJ Tyg>8Hͮcw}UBM~aD%OhѿwK5Z@ Y@W.CiNME?V{EHYnZ{wXQI&`,g-7'#Ա6mZA~G7& `@T7s|kgw;󫣖a[OOX/܈+BM;7u!&YWϜ z1zBbVUJ >7&iOG{_V(.@+^)2's U7AHG.(=­"5S*I4& `?5J S"6}fa qWu8ly۩ Iޮ8U O܁GI;^>А܈O |S!ȅXʀtu0 \jcOb~ P0Lvqޢq55j>?vi$8ÓN6Z{rZt;8aC/bjqI# lCb;:3?$Xe~?H\v ! rL\ z!k޿nT"n=<>/T?у]}"& `UB;G?5ǣl:j Ey25B +-il_J"mm}bجBmf_#c#PvX~dua5ҵkpNjÖ^gŞ[MuZF%e$K(1L*H2TEqsjNR! `&(60g ,0L TwGfۆ `& T yWKL~:| IvK"}srS@l\zj͑rS}_KVP3k|aUM뫢oUQ&g{}93Ym hE1Lx7?.]|i:}ʪ2^vRVڅ-'J߷Olm -ꤪ^|`kj7'q ?:r들B&-ll uP}=[ ;O L0ZG6ȉvdQK'88zlF;+*<6Rh4=tPrˠTmcGK8Ȃm c^FdyvF lzMjfzv {{tymQJGZ]ljwPev>a٪CfQw*˔ `& I׺GzO-H gyA$Qݯ^Y?6^%-.yd}*@=7۽0^cx<ըJI}9einT!D^d@C SĖ?>24CI(QyyG& T#7\% W 4oi*O--s@ uxew'BF^:;Zpۍ% ZՎ?PSBE}UnzgBCb?|*Cil! FT QTV gۀ `@v Ȣ\vNqRf7jvRRjiʦ_}ݧ{60i8[ZM /=%UZCk !u- Sӱ02\0"P9"/1$C`n9:CKJu2ssp8eֱ( J{׮݈a{|faޔ`\M_:eQ:T:ո eLT,*O 5 t/̍UKeg'$IH %**>YRrm `&] %ݺ:e\vz%w/b2n&QօLO#W<*\m&U6U9G";YD鑒4(W$҇0L 0jy|˖/[b[6Ҍyy#a&M&z-_`⵽?@\TEZCZ}8u4LKo:œyC7ߞ}چ<WyxwYGDd5# kvCCdhbnajA|̲^{NK 3 ^=ѥ!c;[SKЅoo{`k˧ڀR>"#c-=f3Nu-k*a^K3#-=$]Q> `@] @^V\tX[Ɍ'seP$5"|RTe|9; B{>W쌴Ej荚@p6lcq4 xre}.ݻ/e\vK:rҸoŃm;Z3[?}}I uy y9R廧 E& `@v-4?ril =4n_wJ>s޴Ӧyzt0Umh˶݊R3G=zԮHjDM$ЕuކL3DʍsM$울 ܎ `&P>'zz@.[WX_U(>6]nFCC! l|yOV#h q9Nh!2:l}wAPO&8ve#Z1= si 'Yn~bdʿjc)& `" ٍY+&M ![D@oyk5jى~{Y MOD]oֳ P7+jF ϶ݷ,*}S(Eē 8lY;exni-S*c& `!P{itZ儔{~vXřc؜w9 =Gws'5st'G NmG`D,q+%d| 'CToUw}dQSTy)+B wob(Xrf)ǘ& `N@籉EE`elnA!+dPFyEE͡$P:]FAeɞ9L2rӈ٦[/UDНd"ZC ܵʺ-ei=ۈJx7' }Q2`/n4+)*: )i7jjd-p! qr{ZTr{)7a620L8E9EBMu*bE:Z /JWeqJ֓!/"TUu4UxE|v*+Ӓ24MDQfh[VcU'~;O<l#r& `&c<]f B>7a }pldsTuTAn^_Rll*)Ipzx[r5kYWl6-?60Lȷ3$sĮE<*Uĩ4W+E;-vb0L0R/+IV#_cJKV۳gۇ `&P&!ME]v6fr] U""X\򺲔IqYVpL0"[Ƴ7U#j|]:]WUPZtSB6ttUuu-ԃK" Scu`Λ& dJ œzz;' `@NNNm7.,?W| U8g =k|Jxa>`MUS/ɇ 'W|Bdeӿ^rT\0LfFcqlIGtTh9EWWSvQλ^=p `& |GzJX+rHUUE 4}7ؒp\0LY4CGMv[jUK0LvՆ+0LvUK0L0JJ,11oNbS s3#zEυfͫύ\[|e'c6quF!l\ixQ#5:xSXeڻaL!V"4]wz qQï#{M}1 ~g/uQWgO(O}bY/e'^΁0܊IRu芽b.UpjƉ@UvMZ!%/ E$FG1 .nEGGOid"5732c#,r5ԦE> [=j}C6ѯ}̂' 3c ) B.^dcfW2R|cZfbV;[`(mB+mq4lL@JYzKrfx^ DWB^ %K>g1 lK唦`V~a!w7yG9.7pg ǜkKU(;)GO\[֯8 ءQGmX Jd\@a^a])X' Ty0YXZZ5Wb4mbfiiccgfM, Q !fcccLek[ڻ/X/B'"2)iJ?:,Ə;Z>%OC ,+D FuAKd634nX_̦UP|A&H+5&Ғb'sRR,Έ|49(eg٫ZTV ;,F촤sY?)M|gE'_K|u\3oWSj'yǮ C;h6W̛vqќǞzӍlIp.-v24PGkC)#@ W8!#6_W g1h4W.ςw)l֐,r\|ן׿[u|"4Q꓃S[=g܉%F\W1n ~'~IY%G/nHAާ;+S&0|EN_)ho??rBhE1zz{^ O3K~e?1& 8! Imh~."]{}bIt~J$3XV*v ŝGDmsM'+\~=CIWr81hF 7OބyٳLiCAO}DvMS|:?eE02 pP`Lo4jSѱo.cs6y_NWjϮ JåΏ΅1"K3 {͸>g!ӻz2h(H#}ݍ,$3٦〻:tw^DF]ϝ?I~lӀ=.?g4C*3)ǥ6|Ӟ)N^9X I \ck~c_Mb-r1XMh_[*Η(|tNJl-p['a7\!N 8ŒO0.C^u֭6ZaPPIםЙzìČ8 wUN6O3]e!%r%@ƲxCb7x+=ܼ-Ý,z遳: (Rm0|S0O%Ξ8it{<866pej@1WA3NWߟzW.oON䇶?e^Ȁ6SQϓ)dvR7LU&` @>ʃ'Ajh˼qO?%ܜ7;0Gͧ]Ncm{8kYkј-?wqw;EyQ|ߕxw;I%'p>!/rHr•}wSbϯ>2Y||e{6\~Š&>" e*sN 9rn&ysxbKUzy{A>IQ w*ZzjJe'1z{ߡO>gw6P+b7fȶwwan}+[d)`5F@Qq+N#]PDE[ȓOսNšI(kQ ,v#aMOg'C-5 D=Ţ_A(<*g]+t 랢ꘓ2FS[[۠FMh[D1}tRNY$8$@IDATlwrxA fDJ\"tj[mc==N)(VrІaV^3G;)3ڸc&L32 Q2uH:@blRȖ! ]Wl?]  I k/ |qܬVA|D@&%jԽjQiwC-YB,t4fiKjy_L(1 G4WA=] PAn/A윷ԷssE[Ģlf?!hÕMb٩FxnI(I@r0Ce]΋UEfnz\q+/Z߾r5TGg%Tv}ҁM+vi=7#{;V&$Z__F%ǻ5%]'5@D N8_*d*ē-b)*$NԅHCa'}eF} :ڻ4iL@xIxVI(E\zҳ2E$@GBdj!AB<1ד̓e JWA)$VRHidȞ7I(l4<""":6ʲ&cp4E+1!'!Eie@# b$HI-7@9/ 6Q.Q~ gArXg`ߛ@ew%! \ʗ~~ɎG^W9NZIh Y=3{W 'N }t3z(*Eddd("[@|/> ႾD6;;.aHz^Yl6;+䒢cSGwh=ch[ǏYIE\=;o;+*qN (/- a]U[r4ÞF sdaoOv i)\Fm#\ /@ tíCrBxpJhb' u!p1 IiI}-f.oD#cXЇwCK6EL|&ZxėυiW5P Ku6ԗr4AxݍkQ 55\JE|Is 455 zmc$ >ft;,}ށ(gd ^'<iijo~Gt]nrɊ|c/7do&:[ xJffX( ]+>Q)LQg7]ɲGeY!,̚.B1;^[۸ˌGΗyV !pcM;4smSK6)"E-dl> 4#\W>* lN܈HBIK,GF_1[5jm{MMupOƺ𡦃}Ǧ fyS4?DG܀8BT(TD,bQឃ4uW?<3E(-D8Skk[kBܼ]idaƆr&'6@bt x2ok#=<8#3rl7ef!!&&ueL6zm D:<%\rǍ3sﰖʣJf'ᱳ Zx,.WU8BfhCx<֧LsK[([WGT3~VҐ@rx?5*]L֡ډmœI^#W!2T0@Vlj8Cp+ʼ\gXeת4g Ir<'$-@pw+1Q1DGEEEzzzӧOe@""u8Ȕ6_rq4(d˰'BFj|A' T$rO?!xb?N0ZSMf^7V-ؠ98L=tǸoԝ<2yG i>Nt^˺N:{ȧ[^ ^ 'cKÄ+u[t=u{:ɶTLU.V; .AS+KԮ$t='(ҏA*F-#CF!4ZK!г;2 2xd6ZB՗ތjV =snS|}qեUrλ.5h٥lLYSU;2FˡE epZMݶGQH㔟DӶê152%\*$7dS֎W>bopjiz0Ujk0 oعkC$pP=+[(cD;j`&P{D<-$yĊ i4'?!!Jܘ̖Ǐ?&%< ^!' q& `H@~wb{ZuQ7K!Fl)jv5A0LvP#Ig3膐Uc ֘X1& `!^vXr*-ۄ&x>>~&-YwX+ 0L."Mr8b_.=?°9;;9)PSTvwJ+>+mfZ6%'"cS=fԼ\:Rʺsv~CdWRwoY&ozLmCKg.2Eڍwx-[%. `@]$훴?dx"v>b%2H:=Rcη_Es,#%jL,5C ml8 >5TF`#ʘ=JM'q Hf)m<2ɨ7#3ϊZ~a~ʓ%muق]&WZۚQf*)>/Rbu5.RN>hO JI̾t\\6}xט2mr$Ðe}$y8 0O۝7ٶ\I !sȨg;A볏t>442:jGd]qrr7}UwhDHT Hq!KJqm5<{1hH4ܷ:5 3ɗB_ Mi1GSH&hKCT%be'{ʏsfz("5 i)7H$}z¼]EKdjl|"aBQC69о&^(.ɕ msR3IUBtmwF $H|4_tc=;/ԽqxL*nG1LC*uW@'L--,4aٚZXX[MCCdhphmLéESً#tC. 4[bC!|51 X f <@г6"hP\Oψ 7AuSB&(DWyHT%dxaig$F}y4LzHj:zm6z`EI/LAOZAЌ .mr]uPzznLF8F8ɓL>{`]Xu7T`/߳`e+~ ps3 {Wo-bb~]]vrrl q&&g9hWЎKlc~||H]R18 `@#PI}֕j m^QѸ ^J %up?ڰN|LQz%; B6p4o`Kazٻw޽|%5MA'{qE5%6AV"W&g{]i~(l$+CvF5>@W³iJU:H G[ܻMm6\%Ouƥf[pʹ#>|ൊHе'~8P/#nޗ|ps]EK!5C稢lėۥo/ne?0!º>߶eŐ?mS[{_~(&M{΍?K7S!im׆#B}{2]98 `@m$ Uhρ1kԣ2^5zWџ,ínx;IhǛz E rYԏPa|/OVBM{Iעn^{x{κl/E2!^L,Ml20R@C.ii OD2tq֌]~b{J?ژb׾>`CGwK(oiZ{`m<u`|B.Moͅs@dEG@ȏ(vll'zr^:qˏRo>yC·sE;Nshrt9@;+U_׬8~"Mt9'BtL8w:}OKR[nYf܆i sBO>@<.-RNmDC!_¼, {(va.E}[7;˭qqK/',& `UO@Ua\65KM \''fϖ-Kg +s:9fsCizuVhᇮSj]$д)z$Af=p uy{ j{CZܹy/ڌh'ZG;%:+}H]'k"{AE ""ݳwv*~gSvΊذcW,* !@|ow ;mfμ˾73ަ[ܶkN#rިu Eʊ3@ZD;SѸtjbOsc_H$MD "ۏZF["RB[i,xy_]0'cCЖBm:wxcE°PВEĸh;UV5[#mT,t] dZKӣ;7;'>:]&:. L棽hD': .Lxtv k:aV~vJ TPll+r9C1-At:D"ߋȈ=/YQsadyi?U ta0,?,\#L#?伡-x^yo Wu) ùf3 _8NihJ *l4b2 28Y6dGhԋF# ١ᝀâuB)9yLO|/h~u%\cAo&jBj Zvo?%F0I9"i0˭Bۂ=;i=e)@0E qETg{fa#FVsZ߻֤Yc&ޯjÓWZʎn3uFD6q˵Bb֬[mjo "Х,T#H혛kOgGR$‹n]N">N2$羝"6FG!ux=|AhPC v߉2Bras^=ΔȄЀ7&R)XyxCKpxF<8uDwuG/K(BnжuЩS!S8kMG_J0JfoLF FʇwiElfI1 `r u5"뿃~mέ5Y6rX3Q4Q` $t f 4Gy2stM%xQ{4ZH[sYc=7!:RA}Nv&%˴7XH 31WB;yZaMD@KS޽|^b:NN gqXܰyE3F>`inofc42ld?ZF^uچJqonhRe7V߬L]۠}U26RX31F#(NH84:7Ⓞ2})S (&qrYSn9B]O^1I8dC.:dU H~u1l҄Jҭ($Xh%$ j&*Yu9)u&vCSofOg9pK#a0i:RÓ#Oasnikq#ZM'J1k>i4LmQsn}] I:tNq/kmZQ^;puЯml[ 6'.uQ*RVG{#WIerʔl PYVlء;W]ޏvqKfC+B(I"JS<:Cw3D!=4o~@s<&Z[sԺWѹD6Ngܠlͬ\EVo?cF[ `l_A/n{ % HWQdbW;v5 9ȢQäe4uT7-MuZn϶oVZ#%QW}ԍ޵&R(')b0HMFqG~K'a5[n -yS9 - ܥѼziסDMӟixq,gJCtA˴U]D]Uj3B-\،weKhf;o99nV`0D] jyAi)ᳬy܊סE9EzBΎf78n{M4]|H)쥏qG9o[0E azAOF*꒥ovўt8ѩX[4+[k^T䫘[u2Hdb-L,=  5[.Ԡ PW*}{VaڴA(V\V c;o>8`0?$!SlYWx%4C &VP4Rᤔa pbM% c% ۺ-$ 6 dN&*Bw}),b I6!^u1LɣQif6͚UJ b_{"f%(A"Dãmgon‚w]G! Pk6q,;DU 5'bEZNd+]zڪvg(7 j_F#7"moC֮vƭud6punT(U0幉lDXNNTHM ge%|ejW7J2nϜUP$>S4ב=4+T \GPFÇB05]B6?2]ZTđ+J,tNY 9LϰUཱིU#56o% -Tfߒ$^ #`(ciurWBrMaҝ×J#VA,Li~Np55fV/R֛`^Q]tpƆ)hQf6|Sx:iUBxCùnX;,32V)jk); G [PpU]j鲒WkITbȎmmjS]x}Ӥ z"dg ָ~7x};837lڴbuZxx@J};m^tVU!w%:tA()5{m]ɇ e̢*Y%m]M4ٌ)%=/',heUhUe^-#"fbb"ּj@y}Q= Q^^޳gO -IS#R5щܸ4p|*mkA,c\2tՍ`*"I䇫6r21"npeQ #qZ[:ø֓O(o9e<*ZƿLUʜrd\FV ({ylms&MHTDц&'=9 :+B}. ‚-#Γvip Ztm`Y5=333=-6{"KI)HK l>2^x* L8>:( ;;h|Ȝ^ETֻ,L "`CEĂe}8˫+B!s F#oG_ۘ$MQcUJ'&): X~>& c(qOׯƀo*"),)&&)-W -ܽ8@OxFIb҈eL-1fXY򴘘42pPOzTa|MTf!&#gRRS"}{Ko2SSκ5))53&kdf3ːEEA%wM|48>.nI&D}bhT>cr2Wq853g,w$?Nb~Qf}OΆgbV u-At"th]CS=_1kJ96S_I'QC"M"+ˮ%zj{m@Dk!`0^$czTɿOU1a%Z-tJRkί%Pze*pk)*G !+8,21pg ѹc3b`M)Uz &Wz""+vMaxqm3Ą+zv 60_^և~/a0G|_=n~d߸F9QƽOtWCϒVSS Rlw.㴂 zve+BCԨ31k~t=WCr ;b!^$Z6+o^|MHHdQ %)ʷ!m9=0B\~$y܃7NPSJb]3`iUhTpVDCmCBޤ׶l[Z$bhTCUY?sgsaDC,e=9^ɽ5Ϟ?">,xb?aeo23S#}'0F!5S{o"f!/^z~vhW|%Yiڥv΁8R**&Z#72Ua5n(ƍWC21XWXbgO >V=[oA)QwZIҧt{9"PŽ?^dž%+AxMY V5:s!w3O8EddkRImh|[m5v܉;텶?b0@8)(< If:ډ.GWZ]!B.z LF#haϻG7H6,%޽xtSg:޸в7гQXA л^Z*8 p7AKr|luki[4uk3*:}CqnFq&)E{"9YRt;SٛCՂ2PLjo(ϧ-ߵ (}ZldD^+xn 6RGo2 YwZ]7)ww̵di.6qſF# ZjN8B"$+ޢ2d?wy_fy޿ vڥ7m!hg ]zm</  ;wuKawέvQw>ˡl tDCO^31r0<΋!FTnc^NnP(m:Ia.UK5qzґCp& $1$Ca&M{Hs8nۺ_7 Ѿ2ʻO|`0F=f)@EN?)@姇 '*ns8dѵedž=<yݞ{ ̏|󞌬и8#GFfqX!TVp(^DNAlZ e+ q(IvS!$]d 6d`[Qp"'hTsAGXwQ5Lr?B6Pa\DUȸ,ѱ* l`1`Td2˛}BrC,Y^SD*}]~_ lGyb8`0@ =歸2^_( mZ\bCmOz\cxx'tQZd;<]gy+Lo<IØ.v0H Zؙl**Td2JԕS7ChCTMLz*Bى,ĭjXБ2A. .$i2{c:n'9$|An]=>3:@w24&!o,y6[1\mO(n)YK޼B0|ۺmC+wvhKUc?k7ָCb0#z=U7,+@rW ,,*kZVV.VX5^~ ;)=1U+*CjZ8tef%k)5>Q\\dU>5kdU5* bG'++Ww㛭9]c0? y,wf3:Zͬ Ύ`0 / _\켿X,F#4BΈs+z;6W l4F#`+yWrF#4켛.`0@Ǽ+++X9F# D;ᚈCšyF#94F#C;oq`F#`~`o6 #`09ofIwb'>>=#k9R`ևl-#egDz_خc_vI+Q쥨F#!λ"樼7 )q~|oSa?rvb NwfWvt#:vhf vF)KK3]Yo)ϽHղ"f| VxCf9"So\O$!]B%!wUDTҶ:ۛF:ؓ#.ijq,W]\.$7HֶP4| as&|fٷ$ևhj:Qcw$re|HG$?Dln -:Dl}?##BY!W ;jO$*C&offƽ$ڱW_hyok*** 3c4rY8dPiE=W: %6VDcrU2U`ӵ.l-#ZAaw[:Iͼ6Bs[XQryv+[ - hR*!JHZhSoFg -zngy•xov7ipԑLw 7 B$%C=[ti/fZf:&&:*p410WGz211"wPTQP1\~s <+]mQ~rCDq1^M( W$dm .t 5T4)"vKl`Km%5фLm߬t|tCQZt:t'ΞcوC!=3Fq3ӮN%ܽA; {_7Ȗ OGm <:V^13q{lWV6f̜od>6 a3'Pbl7,Y"a(((Ϯ<7$4m?v=u:~j]o|5,i5"솯U6Q՘)EU^Ӑ&W6ݸz_Y=K6- aWq׫Ls(<5juM߻lt\~xo) |{>aoD:jîin>wOdwvxqiT #Ht0>qDX?""O6ߛ0viiiIl) G*/6[!B|{ :|_==~ mLt]7ȪJ^8L^Ȃ0IqsΞ>{Kd1] eЕQVJhY83!"PZcUZ}!".SZ &=ڠen˻mV ѢvR5u?H@a4d'CUCL^"rؒ跾pEd ( 4`%\~֭CwWahm;8"xr4z\lE;|ePտ9sRu=!tI ܐ`p.趱Qُa8csr:yRGB@?[Q5tycaր[-yDJO zޚKh.L}qڬOtjZNj /+$c@Þ$BAZY5@̈h"Q":)hTKJAnU͸li:\=3|mk\кVe`/sq j}WEv=!ѕfZ3vM+1 ))3go~ǎ4FoRi`{?c!c'Z[1ru,P nכr0j7=켈8ηX@*-VWlgeE | a Rғ֚h+{!Ë Pߑ>}54%9.KTvr%L%{J;$e"**NM}7a-it/G(7&!$=Vg$Loz4Hn3;|kW/-MQSЖzBaDppp266n7E"sB ;t-'/'b9.+%#U "VbqOy_qQU,9U˂IZ$)miCE&[d~K[Է%~-u- %ܛnDGq&syBV~\D\D'څ{ k棽hD':Nw] $QfaBdt|4IPL.DIvv~vJ TP&GDzh]=q ZmcS-#Dinv&n8Nf0 [ y8&nN w} ,ytя5ùf3 _8?`7t?ںeoh}L!_L[]f,2͘ mP}ѱvÖuW۪䝇tAd71t*]&>mI_0NzKH:y7]^;z)e7&6FG!X6^_]G<8uDw]?|XB9@IDATr'̶o[Ft߂ܷS$eJcY`S'旨VÜOJXnpǂK,,b7q}VO-DF;vg}M,j$][*zu7GezXI{G7 !>Au_hFG牼 TYkdmea;n;Ұ}&J{n{v[akIkn_}%:Ҋnn֮Zz3KyV۶\,**UѤJcJjp9_ʶ#]@G?/QRF * M<& )1NkgK]EM'2Qd48(UtYU!c?e \bccWR@y{r#J7nͅ=C)j7y_o#|uL o=C̫ϏXP?Ms?x\>5F*#fs?L17[3̩ڨ c}pj䛞ߐRkWɄt(* *4^w{N˼\I =…'Yn䎻ʐվ/0>sQYyYʺZp*ʈkM=noĞX>d ޳rz =R#Q %v.+5n L'\ uktJi_*]AjJ.|.#Px`Kyn*V0V/ |O neeK!˗ʓg KAVͼ 8EZɶzg( B~Xܕ/-{QSMo^0Ayw}wP#֚!#fUEmX_L}NO tUpSΛ=o:U2ԐW L.fC#ߕ^KW?K+~/2ih54>l.m⊎G?S"@J&Q 'nq|R)=~驝 +Жh{>S:^(qqό7oo^VVFmÆ7$40[zn tSQA"rhF}p3ŭ]UN8G~Q=y]zLZ&=;u;}v {m׽n+$D êO#Kvp\M}M%@xjT~aFe\xU7xkﳿNjEp FA0FpyG+x@L$U)" bJZzl]#&Ya7 K3}ikH{|[w3&\[w;}ڲJ%u9 h=Ƶ%U?bQQGb' Oyq#yvF |CڕF# "y5Ԩ5!MO 6x!Pse3{ZҔЀw0|kmYY61p;)O?CrTlةT@ff$y: Y専dγ3Ds~s켿#X5F#oEK91c=7vo},C۰*F#GR vKǁk&y70#|9.,’wmqVJn쬴T@!WgQ_TTj~SRVk~rR&UIj 1eH{[#%g+X'5 F# nպ):@ q/aOѾT;Rґ TzKpzay}b NW*xyg֮/rK̀$xKm }Οk :.մB#=-Gy ՙwJPyc(169i)Z_E%M$t)8Žfeͥ>w{7Whq*0vUn ]x^dH@b|4jH~L<#q>yr]3Iiih7IIg~ٚv52_q RIII3metؠ˻i"Mogp8Y!|S8Ȕ];ˁ]S^?k#m LMxAռO78W<⸋ΜDCGaw$&%=ȋD:'28ߍm-oGnQ0nb'=7Q4ypa*{]YABQݟ&vP|`t15HT7?hƋH,SP>Nc2PfL#)Z輕AF:,rk}-hPװ:h m85"7RRUP5xq~l{RQ] wOl8:vo-F7g"vEQ+!Vڣ+As >39. Gҵ{uv60m,3Zh@_4޽k<*ٰZ >pw7pa~Iy]a 1פ~7S(xo %IZ2Hwo Kџ1f瓍#λ 4ƥ+hj ^1sKˎvsȃbt1KS^v)k.N\u|ICf;iF{" f;j NIL""ҍDQ[n>2C9m?OcnOT=d{aʶ},/'xy;]]ܪD'yuGݘ~hמ==Id>CŢalDNI`MlXُQ7Itjm ӛxZ$o0؛H)l mF#e/$sgJoˬW< 3vmMG7p4I~wCorӔ`gBj̠eoS"+y 4!M  צng|‹cF˄{~,c3g57pa&~Qi^i\(&E⬼*LK}Wah>=2תW]yV[9};kV[co(F{#1=`h}Cf;j4DN|MX:>p lV Z/ Θiqs}T[w!`|8k!iӌC/+bAw:v6dw|kE=v-Lio_8WE27 wyCMLŹ،bXFJ3Wks>#?JVt-EUHQ> ,O˓\NM$+(>͆^9U0t5-]UE.dL&ʬ׀S?3MܘD" k"y)F)`λ)&<F{#?~Ç`0ovs#`0-B; c0F#k`0@λEF#>mƶh#`0 {-`0@;:։`0 w E1F#={ub0F4{Z t}̒YHJNMUGEp쯥-;JVQKv-EهR -b')6 |2Z bdUIj4fK޾zBG.ro$G%vIDxMgfaښZ]Hn3m+MSTLa+bˏ}à >5P_;1S~ghql7=y-82g>[^]c.--cON+`=QΥS峒53\?R]ϬcǎfHb(?b"U"f|ÌPwAt$Lyyct3#a"a؜ ^!Ɲ-.$1+>tx# VQ.E4?`cͲ4ӞwGSr٩9 WsL^?zQm-_Aj=0=+# bHH\{ƄT/tv>L+5,V#Wyڌ=}>=}琧Xx[_]ˎ]tln{-&!XJ*!)ٶ>h(s0_wޤ5"Guщ J)H {iOPlwʚ]inJ[g&rnѫ(5vn=# %Qu{!2. I&X$h\N9TZQpc_6HӜͦ ʩx0yA(#֩IO--tTi4M×ȡK9!Ol-.!azJffԽp^L|:飡v$O~}PH"yrcЍ>a?{䮿 F86rm iڄs6lo؜gWTW>v<#JZ:CW6)\bОM7;GRǵW ?!'B$%C c`b`oj ykh@T_kABX?K(n`BVZI˨hph%H]IOEE$^Vz@A(_g?^46wM %bhbCzj ܛd tL5gJb'پ]/u*o_E)beX?AB++u?h 1k.B)m̘9ӗuk̍$ —\n+/}̘'j{DXdx0<(Ζ c8n(C^;LX9Âny"bk^.њy/d6'ЊQv hmq\옻+%#V wfO\2ע2O#u[h61SJMNNOO MxE'*{k䭗 Wbg\{̊`'ǽNA^S(+nm"2KSJ"ff*ilz \uB!FES>#X7\Jªiǹ̳!:qiնռ{i)=7赮>i 3v1KCQpp&hmzX+ot[|m4vNky&MH^Ņ_2a̱w !9DJQqMjPŊqqo^\JhVʃg>FܫC{ !Yx)O@1o ~i# >%^ϔN]yde1V"wGF˨bA2ѱq:Mt ybL|Z輑a] _j]?V~[6 {c㚼O,=}..GDo^Z !+ya[6Ŕl7. 2coy:r9Ѯ" 4 :N&K SWf)koCGq!o<ޮ{>șqeDK']ǜѢlDoٹId6~>GK㏣/=ݺu 489ͽaC92vAw.3mlwO}wzo~0-\B=]svN ޞYrzz9Z$R@'{ïWZ2DT 9 kuwvUdCd.6l[?~~uCYU6l=;cvot l|bEId⭖VF3>|p7;qx=ꈢ3JZˆۓ# ԥ&ŖVִ!;ω#6Я-x>=Pa&W&9d'}6O&#/ome``mL'>:iOGFB 6㭭ބDZA1JG4!tSWWhI @tddkGv'n:2.?qghC聈@3܂P~LtKD.[l@qQթѝz1Rg9jh]S $'0Zr~qk ﱍ5LZO_߳x11!Vp $*#d}zi;e9_#/]nN޹D7 Ȣvylނ]&j:^I`\sO(ۈ8'C ׅ|axA{zV^c}0JkQ?1L&CvD5Q`Fxo.B,)lՁΠw AR4:-8.툨 zks핱冂R,4t^w׿1+hV=Kr!=܊5g]o_y"`n ³ėeeFD6V}@6J&0WsX(`Bw92J(ckXEkKyo;c?1z9p < Z u_Ϫaҕli-KN3$e&}zdin.R7wqQW6o ֆjJM@Eu]wq]{3JY˖SrU!ff=^\*@Z""8GgJE!f!j;75:yl=7אiY۝aWw LC%ZV=K ϨU ٯ%^H0l4Ieo}hC1o) ^INib|]ZVgB|-iֳn.3=2i"p6(aP=u5(X7iАj׋GMO;/ֿ0>R]b"Ua@䑽t(Qp"o0:kz7_{uO%izmrcߜ@_H$-EYQso@y AN.z!C#" E)T2Ot̰7RQߣ^g3<$p;"EN9\ s/h38HG~m*^IxrjvU_4hA.rݭ$XL$QCT_8 vS&5|b=2xGDjQ*m s-šFB#gh{|e[>bGbJnЁ[.]~:V=[7zs#|aީ]]zY'"SM՝;M.=:ťs8v-x,,ZGtU]\]F`!Y:T;YYsWG#{x{ a4TnU"hR[9b洢s-{wՃ&,] pju5JDÊzīۯ+vmNHv[LE}$%jn!4qY2D/ދ, wg.0"Aܸ9ވЉqae3&/SǮJg]"LS&(*eǽ쎌: @KQ]`uvpH^bհz,IIJ3D]@h3lvFi2(ԜNۣƭ|ޫ,?5?ՊWДlǃ\씝Mx;Sq_L[]XYnѝ~7}H|7<=df4͘W}Xj=br$tt:{t[xۥ`!=-"~6vZ"03C&~-^^w` Fuu|ϙnT8#^h;䱲~:I^uMli;ڽȜ?x{U$@bMʨyftl qae)v++Bv DZXap f5`[X3\w,X%3c"{Jn ۜlG\s>zii% D^As#'cћ[OzF̑W%tgUb YݚY8'I\'tk0dGh EH@>L'oɣi(B3^?je^xeTThm=MȮH[`\F(D-@zWt4s50?Pht&ˆE'EZIӴCр;!;S1U\x򲃕//b >2^w1tO|wVSφn]>H$H]$yA$/PFP\;RugrFF]EЉ|.׾-I˟qOJCqUx{M-䎙FlǫaH/\.7ju4rRޔ^Tb}}kn|rV1B0oڐSd??Dg^Z:ݜoTT,&{GhP -{+Yh0h>wC.Ea سWeH-)U8JZ>7˘f)^)%%%;==Ȩ8gzOoĝ' 8R\RAnҊ*0y'K,d{E9 ax FT`VV z{8'V[Ch Sii ~VTT0hEXXT&`lj}4dZ$.GK Ii8OFAZY=r>O#ƫ2| :VAě3vć*.w^!R: -VO1LzQIU*+ȩ` qEz kᜒG^9w|ך999 I| !BhfŊoojyzJup ~cjډ铳|:R?<ٶ%)z%P[%ZǪ'W%f PE~PjZ:ܿ=&!S&B=Mc$K]dP Ss]7cvu}ˍ! 8KvasgO-:;dzzszԣ{7EL2cBKWհ)uPlLXO&?E&*v[aBr0CT E(ԦM%eAml c")(#P*JC 22 #3M8l_9ͅS yJG<1 )\/i81jXmao cknPfըI#O ]濼7x8,AZk#)K;ȴ-<}F^~|g.[)[8~ɤih#n˔q/A V]Ӈo##Md}DN]μ"pUX6t&F]j'і5#E䤱?`0/QD]|Y.<: ~k5dcbމac g=X׿tu~mϪ{!a]LЎ]{~P+S???+ xI7O1픛~iߞ!/trk^\4wC\ZzG8{N&JTp9VRf[bO9g+8E4uQW"ӌ=kjNm0㏎&~w/\7v`ކR.Qc^0H{`)4V5-Ob[ ۳j|ϑ:{3MTklHTvry$n?qNOx[M}[Lhv Xع'2 w/ރ|j~ F#F*#mڢ-| L \Lt%JͧA$YMS}]ȉ&oL;Zٚ $#hkޟn;W_NU=;@J'1ّlǰaasM"wVIIU{>UY"Bx_HzXT,HeM"Z\\"7oa䰂aޱͿAuB+˄FϔANh\E ̛+a1Ϩ׹y=< 1Hh=@$F#hC3á( rX$F#"w^ѽߴXyGԚd%?}ElAR߬71r=ֲxy$<-e6k[%&ryrҋ>Ij&l8Y%5?w\ (Tl8ͰQ]z'&A,QBjo4~^_ą4AɆGF}2ě/9r:sF7^Kؙs6OϹVVgk.6KPbm^=IVŷQn[iQ#K?/~gдJڑ~҃!3nLU9&˧gx+i jZ CmY$LڗUIzZc_HVZYM0Sn)+RۮdI6M`#I= J| YJ9/1#zt;#R>˪гnu,G#Т`ݢ_AORyMNeGМSo3Q =bBiXZPyݗ1Wa3tfhʼn cza3qtmFCsFSCS)` ERz1p!aCE{pmmo*bzwHu]bbԇ+M3JLL34_"lÙߴK}y qjh!yO,sy~1f 30ze9qV F"Tm__J3.xm{( gcL#'3LH+E6[Sך۹"2FCa8IrUNqދdFgV#rJ`!)Nd%+ӂ ^r=ʆn]bX-(,G<TƧe 6ֽ6u'/!0{[Lv/*2" Mbk Б{(; 1鐪$H[)\ U)O{ϻ5ΝE"TmtRPVT fDm\.'7̪`b}5ꇬW6 m&{`)==vhh[C=FʻnksNr|KW:|a"|ܰ+GxWp5 )DRcL?_:g0i,%(2^,}ғwNhgfC69KY-٢/]&bTp|$I'$]]IhoW]rxJ73|DYVBJc"+YP*Ԡq0x}kcTgݻܵ`Cu[خ& urY-n**)6'#‘P$^z!x]v/4-1k,bFX{Ʉ %Tpzڽ[nݻu'5\r9SÊ(֦{8RNotؼSZ^8 ΌLFY'b89CHLǿ RSo g@7b/n_nĄh `!-82p<U~{2r.'oxӠ{ta>m^ .,WMsQj=!jEQ52ܯ1#鈳H)VJ:N#PHbM #+0nf[ݜmrhyb Ϯ3-9AB:f-kʝI/p{epg`/_V 4\MiBMx27R̋6/q P]#܋m^ HxF:aޕ}g\XQ~'I Z?/V::3XUBF#јZt,{)CV2zJ $7ثr0S3{Z#s-|TSPt4n&TgA=m;{̕xaсMjrw!kKd4gWMF)X*IhKyAL㺔ɺJj^ Dn{ &x4Ebrܮ!7yrco9>UZAԑr{W.vPRB] Ysc8 "A6SD/.g7 S.=й$0 ݀>Hjv? 8~cnZ'L q#>PU,!v~8޾!du&]Xf6BXAT٬~)|w0C( O"Hb3`V#+u~ܗWHq&UU#B)O"x393p.1EL❇$gx:BF+RywU+-t}bԨV!j!ee*,X7Auk|_jVCvLb^B^/ X- .f]I,JdkqnqlzS\b)$j=z>]ȠЄ]Y |.I1³g]bcl>k@Ue.D=xs v}yí@t$jSl5@YA${{*,'SEp?Dˮj2g[|O L߁9'`nP-/gjvL;>\bRlۊR9`xV9oG2KOlS*|3lYHRF'$DM%,A/+SHPߥ(i[Q]ILIS'$UZYAzIQVbl9Œ**0e͖b^@***2h6]|b5%fk^B{ms; UFDYI%A™_d5BjIT8܈6}͛$-{S5TD QlpDJSAQOM.`8qL2)yd^-Av}Ch2*~($1olh{KDwC`! |dΒ|ޡG58F{:U?`T\gLBѰ& }y۽LpC~;iv0m҈ F8G" !h]`ܽwUUBm:P K"G޿cō`0_始ۆ`0$Xy7 #`~e.nF# kcF"1*<1u=uI[M [ +Í.|~EJ:ڬ#Ubm9ȳb ^T0gϦʊKK*xʏ9!ͅ0W#G_ /R0/zra)ܵߨkm5A. YSexӲo7=7?nkjyIx45]B.]-턽nJe"YeCSSRr=nV#~j)w;* Om"Yie5-< =B8B)HgÅF!ú5T&p ރcrAc\` :cCh~& M (ȍym"'k39.8IQfLId\ kc0vfНW~̊h j>g6'hV:mdza[Ok3B LY&&N# MF#?*~ǘ{CUjo f3!tWoꜴHI4.O`0?ꭧNq?-ti41Ksn==ՓoR+st- G60K=T o7pkàa/(FUݓwr=z/JM *y-1ieveKfyBJc"+m, 0!!GS- Ja񈽁ւseFuֽ;]=Cu[(Qd=EÊ܃ I9G]_ZE;[R1FDs0aZ7..gP xAnYj{y{xuqTfW幹'xojGOw  T%υ6#w޾C]vaF"`܎NTJQcPuc>xs't,oװ@] 4M)}ukM_=EHMRB] $qJYALeMxDEX<:eLfΞ;t~NZ Ostzn|;tn"<[ v|x#&LlvmqϹ(F(}S~0Wo~+\[!|+Oݞ!=.ֱeMiw]КѣOH+A꜆rB0Yu~-nnȭGNKC)!Oo fmtݮqYۜ;s=O2d5<;s)p~L{Sl|B(i!ee*,X7AX pC+L!T&{o;P w%6ݑ- .f]I,JdkqnqlzS\B,cf*}8u}B JEz)%iĬFޫzu%+ՖdX0ha)bHr A,;w7v͛ Sz't|c6Oq3V&yVaE+" 1$OOO72|&8gBA/..lX,! ֹˠrre?S']zz*ˠO<ddW}SI'-!IUKbI ӊ $BJKKA5n6HIIFMMjYVQQaoo/WDZ/ 3>gA: Neee,)Ծ}TQJeJ9VZ$|>ν7цE͓=?8t7GArC?J1?Aiaao![۟3UBQE^CDk憜TxS}z렭-DsU4@.^MEkn#Z@s5 *<( hhk` X`9!Ĭ HAs>= pYD< $t3wfue!`1۶!jUMrxuu/+[+ A*;G+׀`B0QZܓ䴶H´[TVvY6J>+r6XPd&ŭ̓E1}>8Z0@ #~3rڅ&mY99dZlEkaޏU٪R󉛭zD`0@N_ҰXTRz,t:#te 0Ij~VlRQm0'~68b.F"P|q1Ìc<U/bۓi[SȍifIr }%[q#1? O/d7 I3,F#jܛt+z۩gw![m;5 N=,Ğ?{_e6WnA*c;ʙmv;6S˹V V/ ؗ>/$%> 47#JSf!ZR &{V`ǸG g'l84ӨT֡Xw7+\Qږ[alׅ/q_ 6΢v꘾_|ʊ #<~N' DGlˉKJJg=ĒNDX*u?6,~{Lr%6SjYWk7{ohhhQ Gγ`^8541;F#jO?ɍ%&ЁnwB"_Rk0gr_lUSm0zZ.Qn9l1gF#"@}'mӔ60A?~YZaXy%F# 88w,/gS%)Z|ҮcQyA[E-:ا1 {ĤڷW7LRKJ$eUP{[e/F#Xv< /ŝ¡A?~^ \tRk)HXD '=)۞A|P! Rs#(f˂=)SʬK ~aӄ=7r#EnNn3i|*'.8!tk2&_cYoB%zHWUSjۙl0p#_mXW>D+t"Y\QSGGSUS_Sup$Adi\8RWSl JyfCyLâڜk%>;$5u49`0+Ord؎--;zNCO>I|%iqN(u/ ^$;N!v<:!qŻCq^G: ߀Eda9<}De~݄ Ӡ2|`0C7!!&qL9vX;tRKȢ֬w[l<>v#dvoo+ׂ//V?aubɺMLs1uTSOT@;7w`0+o"6NcI y@B&d&aZ'A=on!vlqc ܦݬy{vmmqAN6Uj^YFF`{hmLN9b;A z8 #`0-+Pll6{K{*rӒAdث9&WVTotQ}FEh!!Ґe'wC #,sh) liFA7`u]މc`0Anu׉D'nkQMo-2R\L26|1&ڼ+[|05U'Tm#:]k'B5=O^_B:*P߽>F 膯.8]¨ȫQujZN2wa |9wcx/][XPWχCF+h׎q+b)_[A=ݟi%-cHi*r+[:'#pD@#psrl1F\v(:@OOC@1ݘ >I`?@Lwc{Pv $ 0>ZC 4T'6,FR͢ >0= @!PR,+c1BZLPWW/TK X!_ "|]1Dl"DKlA(7&ӾP{ (-e Mʐ`_TcbR8Ax}e>2<@A+3Ӡ[QL'!OZr@#-,X iiiXmDiZ^niT@ k E ?OG60700S+nii)[喨c%t-)ǘ@Ԇ !!SXzE<>b`WQz` Y ` YjeW4۔TTj0.YY^i.Ü98svk?hɉu>!S*x8S#~DjȐ{S #_D1K 1=[Ez2i{Vws!4@W9y/MID"r9Vf7YJC N&VYZupQ xg%]fGm"{sss >dE}Fz9+f/M*5lYז $zz#A>qn96..͍ ?yμzk59gmw_|\w&E`y|HL@t.3BeJBf2~,]}:θ6 "6e=vm؅8%޺joJe/MWފ«*rq`YYdeeub# E\xΚoV{{(ʪi&-KaM+a#KlКN\[IXCMZ}uf \}nA_ۮI7ȷU_TUZ"ƛr]qfERBrgq>߁8F4N{ˡm%ZwHт~3|};hme>C+"q8L[[ߒ pT^ !GTBG~~878o<"5%jYTǐbZ5Q_an&?\³wV\bf=oek)63wWuK2 XC:U)}jֱ8Ec#*@-ҹhDe$x|Q,4bE14i)lvI)^Q|WOH Dy X1vZm9^Fm<΍mb[+@!L5עGE촕7SysMD(H ঔSDL18.Dwe=hb7c<,詻Epom`z }+ а3/q|s23h|piN*63«jO|՞kgzgz;;p88 >-::B.|YI Wx}Z 5MxNNޤGɕCrFo'7ʫl Z8Jφ@B?v5 rHj:Ua\m|I}miKJUi?A2yxpx5 R]O6ÆJ+6xQ /MJyq1+7mll,--sT5 2֋iՔ+God 4wV7v7%;pD֠yaTdKGo(rs]'R4^vȂ/F>P Ɵ,;O6Otz17?ڑ]wX'$@{kiL-*R~$jQEmjmNT򂾺D\pvGm)7naqy\ݭr76j'$T1D){SHd9N5R_PQBhB8^^^%%=X 'Q>R j$J PCWt>˿f'zV+7-t(,ݾӥ{V.cG8LC[}#2gMzW$'Y2բf//wf \| 8>>[1m WOEշrSI$sVqYSA*HX(iSeI?P>+%>wEFnv6Ʋ%43RSҚyuV v-@4P%%̬,Y`o|ʧ5 EEjmn,cijΣ˦D![sV6vKOvsvJ'_WI\m,뗗"nԱ--͡!9htp TbƇ*plb361.@˭P ^jxW~'`=/VNZ QNJiӱEnp[ 9FGĄ' g`Rx9C@ Ǥxތ&gdh&4Vjۼ Y^XD)M[_+HoW  $ 嫴߫][ߋ|n %>S<Ӣkâ+[ F^8/O}3LLj\o_]Է)ٹE)`? @@wSP 0? CeuM@__ozJ#Z^8 H %1 @u + r@FۼF @G&x!g > </%%Ww;88XOP˺"ƻȂ^ &PVV#(yyyEEEZ>@ۼ !@RSSƗ8)_bȸ wy*)FE[ A@!@UWcL ./?ĩ; Iɥ/:{!$r\X3@wǶfj5Z ʀbjq1\bNׇH뱠O3|!xvb_"f?yj5KjZ =}DJMoTE9Fio\:'A"1Nx>}ꗙui;n?Æo?<>wpQO};KBUf쫙~ɞ:>CX }ќW0o,we*EaozQec8C}͂&?)̟dP.8$>[.Ӽ5ʋ92fR7u2W$s׳;#zo'W ƚ}}}M@dddyRs~DyҭS?'5 =iv-F$E{ Cn w]|f׮/1fOKE(fx=>iEZo$Cאv=婈h{/>ѕ 'MNMݾuzF } xo Fৰ}{i'v \<݄"Tbh` ^]jϟ7gFy)R%!}p4v>i@Ah}!_p3f'-v>᫅GbzSMr1 hB.v_egDlb"_Ëi b Q;V8i] YPv>mM:/9zXli_8wQ]A%d4Jޏʜ4xm=߰iyNpysJ0s7tu!יs؈PWH^E_x\05J|5Vީ 6AE䰹y{og ]:r7ٔ8Q) F! b ^]\eO37(٠.Jz9; ( ?e~݊^sT$ކ6Z}9ͳOy1'M݅Tˊw[nusf=$^^?ix\+j-a1j)Rxe˗?!Ӊ&~Qc+yu֕Lw,s2>GwɯL /+m^ݰ5)Z4/uYM,2Dk..G[%pgK/(LZ CznTWs6%h+C<ۼb Ȍ?FViE*<>,p5I;.kL)/@Z ]jg56_wFrgD9;i?I!q寃g̘4ǭW B_K#r ZCo< '{Ř.:}ЈpT_vyL=z]یů\W(ۄaI2>奟ӂ6w΍~p:\}ʎ%FG5/}vu.<<fj@v~g;zɭ/w;J pwT=}Mg)Ysn&!~`rc.uuj⫠Z &}ƁńLn%o $P;-oE ,{*YKX% KCqVk=~%1w=ܔy~ ,g ~zM" 桔 Z\Ǿ!gyRQ2:/*H;)SuMajqM=y#‹p#|g-3cKF~A9};5RmTݩ#iݻs|Nfx~?-t\UMe41wrӌ?GfQ@Z%P;s&qk.B:~)&MlwQff2>}>*\{b__!jJv1g|Ջ \Ћ>zf=.)@K+*̤JvӧO/-3EJvsνug/<̘lOӖ_eі_!Ľ}|vuĻ\1+\?Vk!E067v-J8@Z:<]^Ñga NE('⣈M_}}b@ۚ];.L!6~6ow'i{$SL\ĵA]gLnyqF?7uuԀ 2qmf7?_ u*yyeHܸCMqִE]ca:j+ -;,22cswZ]y%>A0@~ |`yM +R<4:"k 'MBGa#Ω|  MGhy7MP+ E#j@" 6tnCd兏9R ?ԁ>'ԧg24j٬:NJa䎮ft$xKQTC(e9]"ړ}bkV7+@:&㖤>}VJ"@fO[4s񥂁2u gooS62HowyjbKK~T@m\vh sRc/T|Mtq׾u;ؔ"Bqzuv`Y8 ; 0)Hz-+_! ݸ;FJkw~n'/ewNлjB:XoOA5`6m:X_|IFzt!"Dn" xWb@c[ 9WF64+Rwacb0Z ~@ Pj1Uѵ$<~d!p26Ɋ40hAG..^1ؗBw#E:ᦼk]—l]i[jk q@<:vB%Xs$\*N9 !Rூ[UR )W]>KWVqԇk$4pIjZ&)1h@+S;/ęgN+s֮KpΩχmF34FtQ~eTؗxie~v0e2ͬ퐙'Xg i=x%5t1]~Ԅ$aS>k_.'P ƛꄾsDȃ{O-q wjK~+ž;H X(ᦶ^^^ΎۢtjH<4Q%9y~UI&]Yͫm['Kp`ɳ]ҩg{|~XVe*aS>~~E cڋR60X{^-zp1m6p\.܎Сry00plnn47rK=eR/ڮE3Sdji}Bc,& }^۹݃ܰN :#+ϱ>&tD3e_]v^=a]\yqp욵p4! gk;\ZD^A⿾rٓ1z}[{j'b^3趬sE,~D?V@$@apS_ŽȢ.T+-EP몺 eI)8ʕ>x_!˙;S;IN߀< _6YDW vz}'cj*P~FHxu﫾 jz/ndatёHG^aqRNO̟|uy觡"<5c̲jP9/B~ Ք i&fJ uj ELg!r޵Bn |vQ< ɲ5cG)ќ 5/@.:8<<|wdo|>zph?$rqNu!0IZi,@5uC{l-p>-Ǵ ]hK7\LжETWF,6JnyYŗ`1 H(ѱpBZ9/J!4ݬoJ0ڮvE YuE\^썞k?C$]rz{81C@*sKڃUU'/.k*u]Fx\s*&.'n4 ͘+Ѭ.{oǽ*X(Tni+-\oG eɅ<=@^(bٸa#7Do~r8*-JT,KypSŵYy)K*, ti37 O"hɎd`k~}&6744 aՠ0' 15W"ŚXc' -μw8%lkj08B]EM+[a6cEmݺ%sF/XYe?Q6]hN?S2j~4~Sn>; kA]q?M$?-XzV>N}b l==i7oa@xluulȋPYRHb%F\DQKP>t#ϊeDGxRpU>)o .F]jijaJޝMJ|Nrܴ/zU K7MLKHH%\|9 /NIǿ7H ԨӊU1чώ_XIT2U\J3l(%8tm_Yؠةey+$fj j۶?NB%  wuBAvr۾:&c/i,@{vsu"z{KvO}aV'}f:s :.8p.}3oB%O7 !xV۟,>p{}ۡkVtƪ*͋C#/=TYtA 7ȵ[n +T@a#3"wֿGoadd[b8 #_P(貘zL]$)o.啉t..|m !{ݥR@ĕhuztT#7LW bb]C ksʺ #X3 32=%w[濪+ԕ"[NeWuRQ5& pEa1T-(.CwVb>%McwӸcR0T6s"&XܱU*. ,_2fkbX!C_\GK%i"}gw;qttx5]'+]Rvv^/ל6Orx K @4x42SѣL.I踏%5 ]ayut!p@ I8TT%.FZEdž<ƔL/wSg@o   ދŢ#_7fyľWL:q84W&󏫞WPU`4ns@022j5Sb#}HbP*IqKAXjȆl}3b0-"9 Ocbm \Ƽtr]]K0޵ jDF lJdkp8D_l >gMXt kt]X&루XO(Tɬ 5`ԉU "@&Ҫ`kӸ| O"g >_$@4L8'jTؚo==sXؐ#@&H9,QPT(Dt6p]Qx7AQ@'@ch3Mj%m? 0ލAy@'@46Mb̛MbꙘWcv&~8>GX4e|s~:TԊ_\>wUh0(~K?/=7ol\ D R}/#_J[:k6] 5q0 >kyN)p0"CQ ~?8tQk*ebJ_k">z566< .]!jЪȷЪ¯/B5qvvwvp01ܜG(@;UgDGS$9%೿5V!͉9wfF TV+ι1̥=tٍbqچ_)yрs1/-l!sk\*FOo_$~CIu}Ψgo6>dIhoҫ;wܐޚnއ7h=BTXQ펷\=+ret*QZÚd iKj24336L4aoqyar4,s-m[ڛ"3fעE {Ff:yff{߀v):;"QAim*1ٸȌ؜tI)lL*vhg ?#SSSӳy;s6\]h.RDŋŤ] wu~3MUs.[ ^cHpiIt2d޽#kɌ.E~ ]Tm! Ah*ic_\gC,uU9CE9@C!!!UF6Ph 6;ˣ.I;v7S =oC瞛z2OY3KxvN˽CL,%YЙ{(AyѣGw>ͫTxm~;]}W.57DJbG7sZgk0PHXIXt%޷ ׍e+;g\u 5AkZ}dOif^[iy|Z;Z:AX蜫.nwћ7)Oo(Fe"~=[|8 WyG) RxoMQܿ{ SzU°2G$ oN6?آxsc*kӮ/=;ZAw=*h(+h{lŖRZg7ǯwE{BZ7߹`R8>}x ,dmMKE n gux3^HcwznT?z"JbV8ÎR%!&ߥw󪠫 9Imù_.&z+u{3:buE,$,xZRRi7wC㳍[Ƿ$e+|:V${UWZ/xhjx˷K92'u3D+PrF}X`۰h)ZFq`BSj ϖQ; @MY51G*!f'"hOպPwK@Uj) ?lmF4GS!qhkQGgWqv23B#|.lYqeyUV/Mi! KÍwNGWOp\-iDFKWgK*7*$2λ?RIcd%HOˬ 5DRMNIg4DfA ..1HE! [mG 0ihn߾R߽xYTWWܴ{tY:UIr?ɩkt$*uNߍ< o;n=8u޾MleM##_]Ue={n% G{ضz`fy9 hkanq۝=o@3,7T \_CۆQ+VgVhkhaQ])j&ƏH%G1A7~PF@'s>by>>nZ^f0Gu0ŏm!'*Ct_s̤o "*4;Q(~@IDATL773S\\ܱcGeNEZa/3TޞF@! Z' r`S(-/u=:6CƐE%`֢EՅ30ָjy"!/%b2;ՖМ7+ m4_ݮ4!Wwk߃6Oi;+T_ϽhS{WGvlܭǃ'!!_A FYo%v(tC'`9z|@$@#y KSf)704375 !~aHߴ=qx&sI֊>I7[KϞSCC0t:+uAutB@as/ݫWIAʅ^mz͈|mEVvޞ]{tm5bk>sSGjJe&?0r@|| v& Xu()uKb>li=EIQymM8q|t܁6%7Em`{~vJ *pQx3p 8hӤz9 /$!"8tKYPZZYM  ix<};oݧܳa5:-܀: @T0! sbxә;}6FBv)F=`k%h@44>Y_~`3U(uM)UCJǗ~/kud(+nd|iyKJjuc@4 xZm&<)Z&-6i6V@% дS9ͮ[!w32ː5Gi h>li275~&I{xT _a#A@0kIOS$ǟ=%EH>.4` =#WCC7Bs][OES=܀cN8bUیciΧy3?,8{adѐ{FA.X95khDC.vvNNK<Ϟ7w99 +K [SdOYد1/~{[IF h8>x#bOot:G'O)_nᶑ0V,ր y,?fe~?m_\-@Ous)2ǵڏ;}]UN}ϟ㾫buLV7.Q^/juNv啑%=w3n&J+:/ow+r6QYuвsğ4}Sk#)MN<VZ<ܚ#)7޴VI,z/H1M-]Ԓ ;,Y'r2eT'F&:H(10[sKit0*s:?mznnw^xiDMӮYuw<:Ys8.#zlj8f;0Q~zBC)۳cf(IŗZgnAF"kS6"C(^)f ӠVq|3oȒiiy%$-7U S %+TiEQ/zD0t ;+cKpzN ҪҀWBb?~LgFȨ 7%!yjgxg#m 9.Ib., {>y[dbkO Qzs)du@#;: % s_O_/7Dn^؞.GML?p[SX(뗦򭨜JJزbHS]YRVxXɓX3E5 yۦ*M|Kpr#V771/J|31/{WST.v(?)6HK3?'+jr3~m/m8VH\}JQjz'ypXw0y ݝX8m<ƏFm&*DsF.ND⌛aZ:8;;ժrF{8WTS*IUTtޅ P;s 5 F JO/ }-נ9]i*1/O$H ].R ]bv,gC={] P@@:(HQ@j(`IH @Pso3;,fΈP M<fiI1o޼I"T'۬8ަqHRo1Q*ƽ7^&[T[pQRLLRڧiYgnѵWOצ 2"ULbFl%~qD]JoVF IO|xkj>) 3}bq31'/;NŖЏ]MK֤ %<l7a+ ~9Ev+9ʜF2"g>DCK·e&%f%bN B9Y[b-SYë吕.xP~ }`~q$b.^/g(\=c^ߡh4x7oJ:-fx_\ORwVc(A2C@DZM'̈ڊ[+k[34ԢՑU[TvCƹq^}qmdYK4jbX+'|N7 f_eRB䶀_;/y:~77pU0B1Fނ70 #:XrS]v¼| %`l!9%[H͸~QР` N!"$lx:zIdF$ep~Y9SX𜇑A\  7!PQl u# Q$"}?IKyyyF:8`0@#0N%B9Au&5Ŀ z-[g<.Konh"l?F=tq ?ͅ<$5y P׵.8۹mI~Ci _Dkw{!ԀK!DbXWAq9Q@πwd`$e\󽍠$a(n%7qX X1@SA;7.<>.VW lF4{:.9QQqLمٙ9JAWGp (P{V#8| 9ZW")Y2y’,1ZJY߉P|bZ{4Zs.Of%C.8҈x ̉몳8;΢zqy>2.My}O^ӈbR)<_,j)Qnj+o&%̎PDMaتH!>w3T0 R iO>^~TA%A:$UL(`ys Db33bx|~%RhmւFNSd09C &܄6.Nm^|\\=x!>D%j{3J~d)8y-I&/UĐg@y4üV7X 9,={m!A 0nqRБVZTkLUFi"vXc333?!Vzj\ȅ A:|n8ߘ^G'° QKĐ1FA/Qz9!y~ dE V_pa -=&*m7g9]rzW3r ei`!`0M&`X F#S}Sc S6ލ%&`[bgqF#`&x7vRa0F@,xg`0Fi"-R0F|9ц )4eȻ) #`0"[(8 #`0Mlr`0F# lE0F#Дhƛ!%CT $ +%>CS)))"?%%+')cj X9qΟd!vڭCRrTXF#4x¦~d87#)X^"?JV>eE^HiUGw1yS1pvK{UJ<6@K@<۩ݿVǂW,MZ~Ex𯜪)HTH}gD@H${:TXRRZF9 c883;>ԯ; -8"8>NJAPh%P)+ t'?yq~Ǩ*yGy\B}x&z8<).d92\xbp\, E!`^r ש%%!cM吔T],tH{#0G[RUIKMI}oN:6PC BCIUSdŭgw4@([FISW nYp.?#/(EwJ89E;h+c/Ν?YOIѥjj[T[jjQy)(ҖD!qGoAg=ZϻliԶp[?OL# fG3#mDDhD| ϟȊ>6zFr_.Iͯ1U KO <9gW!c5X%IuXgoQ^0*ήGbd;`8wx8XrsH.1獏<4u4BqaBNmN'2N:I[8WPANJ^3q[F{Ö%|_W@Fk3Jޑy9s~{bGqɵu,gY7DoX E!P~**HchB(+,N`0ϷJ߂Sz^B<@WPe3,0kxڢ] v/'=kzykz^SVEUJ uy-o{!W5~fԿlI"r:]=krE? ц"*ʨBa=z3?" [ϸ[l"Ghyus8 a-+Όŝ"6Z!t[o֎WyO!ښkrc1-b}"!Oٶ=7o5/Ռ+t&((0;fxnUmC=Ok=KOӺG^[t=ZEqz# Ӿ-"98#tGVQYI%[ ('UUEX[[[HU,8 *$!~k`(\H?E$5")USokxvCRFŧĿ%B<3ܢgK4^IJ߾Z/dyEAWG3i1Prp]qBwڹ9un%*38(N2lA>b!ky&VR~{Rn/ Zz2J}]Qmvْ4w9C?U9knkN8P҆ yZiU31q@~4ruuw"#w࿝ GyO>N$#;vty6)m \0ct,sT|aqpev-+9$+.1JFW11ѤR|]Db33򅺁H^D p쾗a~v>Av ~)vb}N BxʛGG:N4xeO-kMdZvvv4:{L#K# _EU $WDsm>kgz})kWb}N =zHM[fǷW,z5˗/4NWWhJGOQOy#Ǯ 0S*ʢ*YWϻ5 4R>޳T^ 7VoSpqU}K %;|nTQr .]tM feA<'¦s/ ij%e[L|_ "xݰWmw*وot4x~].)IN@n眜2y-MS1^U[%y7FjoᐂJIJ<kt8rv{61D1ssQă9)O/O̩o3&hHhu34^{7~լ,Nvٲט,KԵ~4\TuZtNPRFKuSsQi#w>tT-l> 7;i' !ĝ[}9ls֧\%潧3Um({ W6ݓVt&]G[uW? ?kmZatgdٔ%SNǝ\%%QZ5Kijm:|ލ )ܢp:, sU^{Fsغ!q]/T{}/n;<$,qeͪїtꇮ O+ ]>wO$jڒˤ9:;nӀ=>|v'|h#&B@krBEml }]{oI~{>cH\Xw-:L]m.˾v%,/C0qΙ`kB06DoL//t:qW{3qĥ4E:w!;--&S ؜TW|0=DƖG^rB+ovUiͭ<}c̚~T鋉%`0" )J-^hEY6m~>F~ Nɚt^&L+ ۹.G yuUf*+J/4*ţv+M$gˉa]*~ub}sP>R*P@B`ZdԼΐevSl&X"F#0SbWtox?pYw\}6E1H/wࠩ!f=LV0i%e01>8Y+u'' 3= A:1^_Ly̍k1G Kj6lRk`Y0@c Ps["G֔h8qG"sgi7/mӃ~ۚ&֗)tp`ے=zk,-so(uEO.X܍ighol*CoAj|ٮ`k水UidF] +fc Ӯ}H ZIaxD5o1޲3ML%,F#(-16,(`+TpZdd+2/ ףS5B5 mv0ѝ, =r?|C+=$I.<}Dȫ*\*K+y`bͳGk8L4!%z{wyN CynncIs*H$U52^hyyy-%%֩W\#!k1WTT())}hAAAC Ž"]tHqq`$Nv26J-(`U3[y:<N R%n.Nv=b .eCFi#pMCz4Ge󰨨aqdq.-3̶]]d"k]W!FJd:hrϼ*+Þ[.x хy)aal˗Qy<" rw8qq$(D\4̬XͨKoK^M}@ ++,u5YyD6H"}~N˰|V;m!H ]'BhC[>OSDKZ 8rikK<\ay=@~(>'= [7bԲ>7n5tD]2F'"{79c$þj | }5?43#bj{Jui綤%MT6UA$/aZFNމҋʊtFwTW96t$"+#?Qfƹ={ڒxaQ}OVf˽LZqܝe@l!9%I͸~QР` sr6{o`=dqKRJ[wGr lzf~)pA# G=K/⍻j~fԼ7 R&1$8^|lDލ(jPRf(e> P||H\z%1NW50Ӫ&N}ۚkDoZ*sb%-I\.@E%n U^_pzۓ(UQ~f&?Eݳ3s2]EAH>ED38DsIjѕzenl9FicFvk*|~jctKd8Ofo>0V򢶋EvY>|3#*\[Ǭ~ҷ So8`@Cn3Y[nfG8Z ,zd/OW06M^W{ 4~-ӉI\mGٸ뜝AM{_t *ɌT 0CLNމff&dJLqmVzd8`Pi˲}bp¼?f۩ 1߈[~:z=X}-!*Je%Y2 op5GV+&N/>a5DJM.ug׮kqvۋ%hV3m5xENSd 1~BW.LQ:0HG;3!0XnCx>| 5h =*\ڌa^ %zܸ5t5`͝I|Yp#(,I.0C Lfff~*C ԄlA:|n{Rn8B}WBՑobL8ߑz*b?MI/2dklf~~^^Qd@4oNNŕ20r)Cz I)+wSˆ` `p@11F#`x`Cb0FA_F#!7 `0_lbb0F|SZmGb0F##4`0FBF`0B4`0FBF`0B[(9YYݴu*ُb]0s>djjjxƅ, RaqX +'921OF\if̘'U,:T{G5N[!,J\!::Wɮj4ffHlivQ ?e5: ֙mcBc0? Ya帡Tߐ̳cyob8!K(q[P=V^nO8D=rlNU)ZXj')Bx`(^BoJbU4d`:?2dM!Kͬ" 0/s Xj rrBub}>F'Pm-M--LU"|sR(v"0c}8=L̋Zvǝ1,û=09΍/x.G:;\p3::;rc] >ʽ^Xw(\'*,F"`~& 3iw9*5}ݝ }WS{"P+d|ʈ~G]QHD2Ίi켧O%%Qej0NC NHb%fT!),Y&q,*?>Dpd@IDATv\|Y^]WbБPgZG P./J0jݝ%猤icGy"6+ېr%K$Jv]N,h0ĵC%%yϺ#Ub+")QG~12VhkK֟ p+`z3#.v:dtx/wIYk gXO]@y+=p W1'Cy v%?ʍpҕ 6³҃$(RsI?(1xzE@Y_ LRO}f4=saH "Tو5D(Ҹ~i\FFU~z 1dd%@* UHBVQǔt A;lYҗVsTush8d@MDot}+gt-G(4"(ۈЈx1Y\q9Be F]:h81UɈ:"+H҉0".C_~7pjCI*Y߳:/u8RdMQBA/#@وзBR 9,9d/&T7N, a~.S~[1o-0ʸۙK*/pC+ `WMcn=.>1{[,JJ {Qz`,) @KlVsW xmrh;(۬J:xW&7Z;} .{30(2I 8VkYXWcQ``U zڜzܭdd63u]:)YN&HE֐:uwE( k{Jݪ}\. vxRC]u  e\mu~I}& CWM7h:u9ׇ73.TWK /XY:l Rhe,bfUh\9 ]XdW|ښ4E~ atJ'O8yw 5 L<"F4bC e4S]bu#sU/-Y M N!cLA>' V5m[wmk%A鎎ߕ~=e% &0_NsoD(i*67:%١;S)<,Eւ7]9XA$ٰ%11giؠq)T`^Z$.sѬwMh߮Cgjn%ҿO9.0z*Bns~q|VF1KEIIu,yre޼::w09mﭨO9M0=ЂOu/ 7&[ӧ0>BJ;y砍v^^8}N^H O\_oo̸JVJY/$^/&c_{3~3$C!G8-]6O$e^kt5/~&|EnGSIEVP88_>fQwPOrUTd?gA{\wuADu+~]rvADW^K 05DRԼDO"s X$qos(mv;?{E0џWv.\}UL/ U>>\ׯoT `n@rzB}Q$zK$3n#FBv? Z QNN_>T_Q| d.+!QR5vt젪RWG^z* 3yU-p[;Z/q6WbĖU5=5 :H2%jrԖG0w|LYnyDu*&h!{tO"Z-})2>A'Q2褜v|\>"U^$y)*ˡ& ?b(Md# WGZl'.@6uS', Wu&W\9_/rPG(U;-|U_£Luk֬++}ydgGǶ@?v=$%K,caB,֫coGQ,$c2ĔUΓUvh(,wN^*"Ǜ[O tC[﫪=ϜS'mx>3u{+h|CV|>\.ڵ!ƑOWׯ҄*L˪g3MhxvC>ЈDgysr rb.{%)}nhnL(Pv$ zvZB;h&&ǻ5K"H #b4gu",u'§Ã!,)sW /ĸqY䘉HLN̍ymz9Փ j ' e_43ǬnjXU@èa)|fw_ޱ"e -!2b﮳%z_@9pev-+9$+.1Jh ]DR:R|]Db33 H^߄)Vt0C\Zť:<=8`<⯹'^gTL L P랾]d~l 1~҂|ytiʞ.[×SYf'y!ΞnNkA-z s}($ܺm&JdƒP #O Se:N6⮸%~{ydW0u?f['r2?ݺz޺lfgby8v='4oȏ:m:]yU[U~iyyʨGHII133G,ffee!y=]5r6|ؓ*fJǹՖoK?+kw*?pc3 r*n'tߋoD7՞V=۞{ }399j57Nc3󟌼 J22C`?A6ͦK o(*3R*j$1y]lښccQPd~>V6=-zK*z8C  {k-9ڧTk P+Z΃gɺc;$K*S~ M]pt[l6Dɔz5LwƮ/FM_ƦkqnfŎULZ6 ninrxLW{#q_R&F7y,YPazrNǼlkN'llROon~iӧJe]z/^yӪ(RpĽ*+}qn+Mh7h>1&90w 7<]:iewJWXeM23lk ><喧Kbv\9r3IJBcǟ.tExin FKWzƷ%-{׀<0Ai96p9ѶK/5&^Bl~ _!썃4!vmM ]㔥ٳn_r-]&bIWFfរϖ1齴}bߗ!YF+xwªf*.tdJ! KO5ۊ]Fe@<0~,b0ZV'z{wtzO=uTQsNgPUaC_~$E?Gz$7_xf^q(=$8 920@{ Yc+ITE_wKТ)~_4Q@lllS&X!c(I!VAH$W8cı̱XWVE7Qb]{)(FnZKTyܣaBY3y.%8-XFfYi$?{ۼOMfhA"\9z.3I J=R`b5rxrM` p|/iœځ1#MS `0?感>`j# 8_;WtvKTF#sm"Wo1h`0o@`ɷMhjcyo#,!F#`[|`06MF#By'g|B**Z3ӒKύh^IRRAA]]Mp̌2Zu\#`0@G̓adK&bddfԪN'%̌eoKSXKOs2D%"+<0O͋]3=6WKލA.V2Bx5.$mdd.zg*yݳ'utOG ~OjO6B+`F!pp+ XogBJ0p2濲,/۝yj~{CjA Y>TjCǡĖ˩y%R Bv(+U7ɡ͘ݖ\~cȍ^ɵ)/? = q`^Z!5wnxXe3O&EC,9tں}y0IF#hFj e5EIG삏ԬӉLTr}N J6=S{]]1܎7F`}})+Wjp)w^UJlK Kǫ>#0ϠuA袤g+(+s f(++k("uEu5?&/4"Zzzzƭ]Z3$'e-ӊXI8xN8[BqOmeÎrLXw)ä0A0Z-Tev?G"V!b?LCE>lzc^6{:M'PUWqzͅ{ @xLf{jBGBrz_켳qN_hV;V]'HnZ],yT@*ۥ8r -Ç z-ݍP棳EQBV~~.]_`1j[Q' >vALv5~ma}kRՇ++ѽ]56 ŠڃsUhūtkFwtߛ.JI8pk#t3m^&E-dEҼ9ʿj/wI_2t]gϔ[r sd{q2&,~aʠ~-'`o/+gw 0ޢjT&\Aharf%-?$Epy担c|S8}.!8T5hvQAID̉ ևhRF^^Fiq2Q nXpF7@wyԕ䨺4{')`/GP9ґ%ȴJ6qwa|"Q*2&"tQ^ŲZۭLGrV 7fo!t*K-[!ܛ0ʑt42ⴟ& DXaine\$a(p8`2 2YFf|e9+'u,t;333gӻw9yD-efC,3_K@I!}6 3'vy@r}yx)OIɎ`0\M ۽G OLr-gN_nOU虎m7ݶ_"ui95#;WX(셗 >eG6W^F)hV{v̈MCcJTv =5Ғ,@&Hob :\*2;#^:F0X _`C>G͟,d)8y-qG,<۟'ck{!g>=$Hfm=n\:J*6`͝I #4Mhr$KIIWa33]AKK#.+*ɴHcȭLKvtu=;^v:ɳT;o'{|H-^%|2b2ƈ]8 zY%RS9yExҷŕ25ZːF#6!(MQ[tlr 5IbKKK.X(F#!`0 #oP͚'-dawyg1yF#UmfjjZ%| p:\W)oyF`U1wF@UUuڵ'NrO"lԵчZV[)O"I p۷B4l;ĘF#:SNm۶֭[a^L5eZt[e9z&;N.q=w-TYq?ЗwǧܴW`7AYJ y3ώp8 Sն05nzh%KZZX[[ٕ~ΆW웧=B>s"nl_GӌcvSYd3޼y϶?@n#g|ʸ *yGy\RRR9㽛<<3n󿱟KJ3,7[ Y'I(ŵ$Qdi(,)I~=f$ T/s^.(WK 5X f{c?{@})=YsڸV;HU?Ξ+ԓ qS1UgY?\~ÏEŇu_$A@|)\#tpvv޿p7#@]O e \WG ZVQNITT:?t2oY]]u5mZYEUHӬMStTU fЫ$du5t ޻A)"JQ"ŊTTDz^N gA"HGA:R$$nOaGv͛7o;웶32m;iUh[xNLїc<@}7W+JmRX5VEnSC|24=[ Jʥ4nkԴ`n 5z {lgh+kLKYsלvrgVwiQo0 %`ys!exm5M“%&eY}}R? ZMK(LHH]1)b}!CMK+2M*ye`8f6t̓^#gW"1k~m 7*w|?۰&7#3o޼@rf &hd4:aww?!L).#, } &ANIH:@}JxAIp|7-ANPLykネ& G"<6Hk:BҲ54t4io5Pj dV K$$O}\:Rn[723=[O\L` %@-:3o)3g:OJn"l¦ߡ\2@46?1hА9FMFzBz^]MkRx4DG}} #5mNm#tgΜ  w7WH;6q>e:!P@V^o/I].TʌfMB]t'^&kzޤIM(piN{_}[L:u2xyte/pl ّM>J BvJ |+.BWXC ;h3Uj}^",h~VzB]mU4Z_VYn ~L-Eh:2A,&:u%3*+^մԴ\WD'FvĉիW3Lqλd2&Nhk5."tyTN4{+_lMG E%f~YȢ5ݖeN?KZȳ" ҕвcszo{鏸uTPԪiLcdP>USJՌKNq~FJd{|]1Z #K4P;zG$ u%&0uIJr/!xGIi`y%NiM1"K,|23zfY /Cݙǖ AcebHx<(IuMȺԦj܅ƭvu@&ID",:Il.NVOF09X4րntZ7A|Qȫ Iz͡R)ԿRH d~y: w83^,dW0nͮYx}lt2ǝ61-1D ##'Ej!9 G !i:ס&s?<[ZXx-Lr'&&7])M%o9-iˉhLm.^j]wQG a4B=z`Ƴ<]P WV1rت\ɧ|3+p<7-0Q:D=6'13f6Z uQU m[k71?%5EN?1窶鼮⑔{+/ :[y]7 ʋ=D0/9= (A>Ip~D?wi#Eθ $pjs~P&\~敋FFv\;4l\3%'?b/]_uC?r /eF<7pt֬ ȪuOcȉ8hUqD\fnJF<>Tal9U߁ 7R22$Z1_lg`=e C}bCuLGVXXMZI8/Q0 VT(hZ( emavzK|Oe4'%j@-ϔ־M 0_% !Dm8wC #L}'(*@ *_~P(zS0TVV*++SհLXrKKK7mE} Jٔ*9V՜qO'#ei$:,:hHҘ_[nH兜hhC6]].h/j?"h31@G{9owww@|[ ?oE'7|m6sḞuvX??ȃf`07 {?@b9Og0m4o)!W1}_5k`0F1` F#`~ 2l.++`0Vy`0??y#6McHf| y`RHfss[yˊY#-098VjUoM5yԬ<$!"/ȅY:ޏad%uu4?cDȘgdd.๥k^'*6G@@Vl HDrCv@fබ+w] 7e1vqt@w||ĠHgON@-Q-Gz)G;[1y)xao bjs Z,1ށo)AN`9zn߽{xOf;kq.PdKhX7Yڨ6}p7\3{ӂqj?߫{GS:_+ yͰ"e}7`zW-SDU}xn()<1x)/x/?SoxS"5Yi0π@7VPWP3IrXqѩJ?:w)[.}3F&t5TTt5J+%"IPe<3Գg{z.B̲~s ;-ZuiEFEECr'qIY5iFkv72Qր_}jH4nzhI;P?xm3O)R#Jc4pbSy'C[W7eM%KISy@mTEPغp%vg˘PvxFFM84dKj4WlN]JlVbo IP<ǗQy$][kb4ύ׈&&F#c#7U@ERV9waoadXVqBnfzTI봅!}VwOGR~P+H|ݻo߾x z 踚n׼B\I JϳfLQe9sBot=4ϘEs2/J[I#0qxNXSw؀./ %HE7,Ϟ*cOrP'{5y5 W=տ̫naYi_l`WϜO]o-~ʋ\Ab\إ1-:{_,c|]TÓٕ}be$/0Ϩڀa0y^4Ǭ [MOzdʼn~yI% Iie9wg6z>zaxɞ'Oٛ@ "yC©qj^޿z̪4)AJEI8zƯD^'fyy !g k*p}C.-ݺu3U, "ׁ;iZvϊ(]а?}\?"QXdenn36a jNќ3tl/#3С Oxх۸.2yqk:LvېGR}y ;ͥA|^.4LmaiF# ݜ7/6ʼkj=sUqpyX^<溘:t?ep ,U7 v{bcHrv0ْ_#1C\.XM`E0m zg$A^xyq㏏ 4flӢ|a:fXmZY7GY$ W D%J4*2 ?ZK J3AkWdhڎ󷼕 " hHEEhDڝ\)PkX"ca`TdHa-8`|/|w#\fp, ]sjV4ٶOb2|H@HO|'?."77uu C,Asݳgol SETQSrmntkm t`#[w3.zN/ s\ A   ̫naX Cc-tO^@IDATsG#AhKy$"Sձ*'| J]?PUF\+U%)vb(%J̺`&[%te`P9i!G pF[}kZv+d7݅  (rf:{q['-쌪b''IYFD+}S 8AȊO*lؾ";hC'k}w=9 evJ"0ųY`H#W ڢ 2`\=wޏGXlG[R$\2df$$icVd^;EV|j|2+&#$!izfEQy+{B|znO.~ꍆYDa+KRfJu\ n0<\f{x߽%4xߖ3`05o3--F ::Bq%2\aV'#k; _+cZw!{ZhK9~*=o*4A2k$) =o[ʖQ!ELW hVN|Ӳx捡2VVVNjׇ4c!L(fiic@swc2F!w{?Q5`0v-Q`0@kA;q91F wy F#Z+k[˓`Z6Uv#Oֱ),TwfK#M=kS'S-,;>(_ D)λldX #` V8ABt))vb P@tnkdds$.jkaū6l&3zG0@Swr©0FC&6:le̯]ø2*`EC=Zf[Ƀ`Z ĹrUH,tu5g&8)IWvc]0m6^e&[m1Z[V$|=֓*?6`v1sۆI۪BϟU&Ĵ<ޝc PW:؏{ߕ NX]-FkהDz\H;!LCX;c0˿ 74WeqdMys&&ŹxqyZ;Dgl;=FЪ t'l'^5͇z~U }l[;5ʼb)%-1~3SVV GQ5,Ar۹DEYEUD.ǃɥv;Vq1փf2"gs?gG2YHt&{D+GSanmm93 l8w@"m st.B\>g x?Maꂧ]]mGMyz)p©}h3H{8@ڬmIUHLǪXݞy˿5l)+Pm]|ESF>[BAG[fiV\p VAjLrL[)ߖۤYpTt_d攳UM)[_Ƕ`~AkP]e$g)VQn\N^;YK9r\N 13h ,  {Rne5o[z,xmD}~FUSӆ[eceT:i|=mQOHBR_>d U;K|f˹Sϯ+[X[w4:Z!VG Ժs3Y䄩id%MIc'SeuP>[9WyCI䢻|5KqiPnr^ V|eGBy6L:(;W ΋',Z dP|+VY?LR+U")qGC+̙>ZOF /=']΄Ay%^=~[ ( ‰qDmoCL:v UJ!.zY͆*ɪT0XsQƁ Ŭrd{3D>G?7uA!Ëzw2z" $flEAR# LXt2T&H(Pz("lh Vl3SZ[9K[9F=ajnU8m A:Ÿ0op2OQ`on )-[s6bݣP噝sL%/<|(z!/'0ˣ6[lvunݭi>,(P_y+4-3uk<]Ц۔:L}-~_mHT`֝kQ&5_+pN@B|Ll{-F=:vMj?5|ͩ@&У%ޮZ/Kw䫨']^A+{pztUֻ@mZyɋ-2h5͵;f;:zޑݷ-䦴P( #LJE@7GG~˫vr8%9&@c#{]bv->Vi$?<4?)f`'^;MyƒōοFPtzBoīF{ @ w\ͽBo_dŇoI*o}[DŽ+c?6zV*c|r2A.l/{5d蚅zGVoȞQ4$iy^eu#Ѡ }^6Z,d2CIq҈#/Reoμ᳗xbִLyjӻ8RE#W">w/D"~cdbrusb Z{tCRKIQRp͖Dk*yBRA^PyG=XT{!Vg?Z\ǖᖽef"Ԑ=ՔGK(+᠌?BL''ی5@@jڦ(<43Ōxq5)Oײ<,anץ?z-E(PRѴ^rhfs.^0 m<|?MC] *{#vj|PB׶;]:y^"%V@w!f( [Im # Owú==i̯$|?vAlJ'M<ʱpR8ijdtzˆTqqr+ڧ++whѼ@ HL*g~y:ґ T>+0')M̩@H㚠 j[P&_XDn7ZhoH4 WHJAП,"-\ re,$S_W$KK) +P=^^ f`~Z$Ni~'X^ևyI=ϞC~jk Ou\IqW :qS[C MjIFMsb`į̂ٲtPHw޺q#7WSOW5m'GOh65ҟ:ǎ%@G>O01)6ԜL3ԝ((IH.S1tQjJ!9RȷL.2὏LōRHFQ~־;WO:dmDIۑ)u TJNLR'/9 :LvxWXlᅠ6<sɵc;fASE)1 kk|飖a~ՀڲC >>PQ0L$ P  0F1[λ1ycF#"Zaλ`0M`0v޸`0F'C;as1F#7F#hw޲?Y)F#hAw z(F#:λu;FXߺi> dF~H  Pq΋E^_5Tfl~oh>yC $2_*U \X@ \},کpBU6<2>0FM[jnfe#+^"+c alW8|[+=B-GKNBYiZ Ь7B{օoCȭ 'lg헟o18lSTq3Ϻ ACb9zcxy95jn ozv-xE/1 YzK ؃ íκ oɮ`++Fw$MSeBAڈ.梒rrdIoV9HLQ*WZ# .Ve۽/_2JTE |[SnhMee!@K?cKF3{qyA}>m }iZYY9H1_cm{25ʋl e>Ni|;Ӭ,-cA"vVV^֬"6Uӧ뭁baUZ Od3$@w}3k`j: Fi$90xjػ!$@<8Ia>& q-4BGu+8W=+$2u##J2gWX;`wtIii@XS_ v}*!uE=R+OwNfDF}ಊhH˴>p~\WէvOO*FDr" `eCW2I Au`} 8׭Ay2T1/řM#|C''v8NN쵝ǬxE7\ݳM'F%"#vދC'Bt6Ȉ {OPcʠ=z4/@eXM@c}gU(9"(hJu,lS3\rlc_͘k>G_eu uZ{RKr,}pwg ?4M=2.V\S%f>v61ˊH5%Ϸ.3ơ7_zr$e$sh+UViu_6ߜ#&Fg:蚓ǎe"q%fxޢ9H.VHh㹛^].]K?+S7xeȘ^n=}uڔс`zBd:u 4“ɑsN7!nVPJ H++kAY.F粬۶z(F^Fх ;#2VT:޳ClK |jt^\ I"?b Φ*MݰͰ!#N/P**r/\H@CjE|.Ձksg%2AlsONx gixf?ƭ2@p-їkq\ɢv^kjiEu5[]Y@⨚Ff845$8.KGܥ# -p<ū*ˊ%dtNqB0YŬT5f!iVBwBY\hscjrB^a}o91qPAFT0cdGƜ?&$Fa.98:76nrGijv$ŁAJ%ld>uɋР~U:ï%68-kE %BWX΋ď?Wu1a]/o@3?גXD` ȵ6v:@Ac!\@lFAOEIBՌW@K@@$]bZzѢQuo_|lGը_mZ\1x3RGe"۽(֭tQX?A:fjTp(`*}H7p@7dB}FC7Lqw֑ܰ1(5zzIArjnI`@Ds/ZU3CfMIGH] =ى0*\xgm 8RM|jz?۽vQ 9kZyɶGG9 =jƕlu "hkWQhR1BWwd= vT,HK J0aZfcyb:*0-mJb|cv潙dil7EŮ\cAW?QBsR)h$@r)khy4-r%&@dl NcE|"SShf9*hpbǿaeY&{.eύT:˹ѐ3l}&M.{Pٷe*ɨۢC[psYBss_˝?B'7Qv)˅I%&JHdt5C3hJ=Y4~FTjmt^N;0=N<3V`q:qL4kM/`:#.|4w-6r:eX1a@=| <޳q}pӓ<%D5O."iA'[kbIrnwf B ޹5_B ʈA(޳Z$@b,#ɦ$=7ꍆ|3?cMA,a~*e5F T7do<,V3#f{-TB?^.%^Ko2^ǛTa7a`P@xJ^VFՆq=5eڡ[B!\;$:Qo{x߽&S!`~Thd[ZZ 1|5-(%PfØ/م4ad1%d`~Cwg~.KA~a Qԩ1[,ͷ a|)e# }_I _6ApTKC͛7זVVV*++C >%^X1Ac`0?&yϥX%Jʉ`0v-Q`0@kA;q91F wy F#ZλU}~qG vZ{"f}&냟;ʻHNn~<\ӥ}~}\IںאtN\p3uicHe#s<|b28\Biuޫ v*p@wYό2T,q0)1s ?Z0ʆPqHWC=jZGt\~ɗ2/Hֿ40b._]`€:+a#Bckׅ9Fq4ysv';KQăHUhЕ+ei(M]^4DpurVNRK?@vRIgbxXA6ݦ\)][/r>})58r#/S^@1S} q{{p}-b|X CJhQ B1a0&!\ JI V՝9LUex/t9atI'n6\@(T萴Su|<ոƜ d#0~@K. NՕC[=]nP IhD?,=: f9϶ߊnGE/>~m 7*w?,w 45qie&K"}Cb6S^KP0d? E;I&GoaƠڐ2/!`0oGzaAWo]=HDְTGEĠCC 07dJC[6lxkԠ+gC,Y2+)v@=E9^=[P(J";^9~lUm ix4DG}} #}A#˳rMG_|;:hsνZMV!qИĕ({}29 Jj!9X17 \ Yņ? )|p 2tg2=Fyt)sZ_VYnr]Fqq&L,Q!}M,"d0"ӎwS>>XkPrm[$l SAYPޖ++*rګiiiLC]kj@0ޜyӘbrZ0#׉FFgs G}ܗ7mp]5-W9略wH$ /4SS00PԴMQxh&xq53GOVRts. c>CV[{oB:V Te>=ByKiȞ0sz<"F*dg>AUB/H-Kc}sY*0 #4:oȖŦyuV%âpC[ϼb"F  pF_^!#uLoZ qM;ڹ9{:|{e~y:MT㚠 mA>%?qI&×V^5w=F@ˍ|8g\NГ'Z{2XIڧSBUfuai7FXL$wsu".-7eLFNDXRp#|#u0 (Lq&BWn'3ч#li))iY.;-Hxd" xv6ׂxUs[B7(*9~r\>U|Gr u;oyhX x-z=#S2 Z-M{Xk( `9|'4RRR30p?_[̫HDbѱf>1ܬw^L)o)ܖ_[5TPDk0f= !id@_/^>*Oc"n JX#p >0;r^l9_NՋGA ?..^^^ٚ,VO{!ALf!ДasYYfc0@ѧLzMFQiPoCuvӤQkx  :;x˸aݠaqFD0-V5ӄ>|_->F)v%UvıԄ+̔īx.|:ެ#ȶXft)Ɏˈ.)I.2~ҤIFq9D@թf@g⠀A Ih@"Z5eλŁ `Z\}|(|=cU~]X$ n.ޑ0~KsUO~Wj3 %}PY#XÈNURH $ݑXړt)^UQ7qjŌ2f8D> s)s)* KjVUUQ:P 6Qd6KǼ E=}F)Z "ΧmW r\{T+vm^ye۴YG$@Yr-D4/!/rx:H#d異jvU~at_qW҈]=& hw l%+˔b+KEmTb }нQN:Iz T*J^]ƸCMOL~vjR=x,2et-PWFՖ37+ [In#S1I bp0op2 RGqwQ"Sʅ(~3^-W B"-$ؼ뵗8>۾@ƹ5LOZl:ѬyPV} )OIgQ FHި:jyy^MD)Cx08ap^^< .h2f {.JBΓ2TN/Y RO¸?_6\X!qzcq @^s^L h( Ή+XZ{m{H矿KÏ/]:#fϱWBx+^U\:s;Pb՞c>^ͿYwHs 3,5ri%j< d4 ڈ)e-i{hq8/xk<o*X cYSq9.jD]|5ޡ2^M2}"~brj LvuQ>⭥h9pXGQeۍNHk҅#GnEt 6qT'C o,$|F n5Ʀa~uSK =n e]&o0Moc|x^cBe;!1C^Ky)"tjdTgGoB&@(%%ez:U)[8]`WO@"zqtɥlϷRILY@^rAadUn o!}C~smM %AE7S':/(B&2ZO|4/ piM%"m nF#B($_+: ;iSkuw_#R9e 2PIN"z%uKV*6\wQ"1)D1rA $!>^{R.__KZwTJV!TlnnF $yiFKnpQq%\ls4Y#gFe(jx"4} 8qNz0-JB?kUQΞ8+H_0Pd/^Л7'?. CH~24L~Yj^״_ᆳ|o.QA5ce{n)^7\÷$iB R}%&@Uĝ'Z$5ysڕ7kV_WC^E =Ȯa!^3Ԗd;B FNBWG#K:xyox yJB~24 odA_ i5lHHNQ..BU/0% B"DSWQ!IOp7o {μWdQ$"QyQ 54t):j.iy6jHS l%vy!uR g7YZLzk:[YMՆY]@!͉15 ;9 J%f,c6mCOݰ̵-# 񁷑W`gȶ'Vdr", [/FuZ%ܫ{RJ fe!V/O/&4X9y.F@<'i;t:#Bī@Yw#9JFJ[.yH|}-!Z7zKʚ;uwѫ,O Z五Ҵͳזm`b؉ =P\VIde5-Ta:'_(Aй+ů`09{alSˀ@>;o͖@•XC4^e!USܭ`yQTCA8Ui%ѭgW"꯬h@wɶ+5@V6dӒ̾|]5b!Y}Dc~7-po40}G#Tc| {`ksl=8^|p%r8punԄ򂚻gŶe.Iۊ?M,хF!E5<=Lɧ':r"< f#S%^$STd߸< UHfDӉgQ P.= = j .hZ9}VG_$47?#+$οX`􅃏aNFI]@mIDAT˿̬͗@{6 l;,\_ vUm3Vl~9ӫcHU=xUJ 7|n) *Y^gMt,7l$ jp<@7wvuAiԈ3KvCaZgLmҼ3́!.n/r핓}n.U`* 7P gq@ eӟg`F2?|bš}&ߞb .%R5wv":akpsi )equ6YV:} oAZ) ˓;'ye~nG?BY8>Ð4\SPhkZ{-6v/Kfۼty<ls| ~Fx:mӾL14}1t6ZZn 䃍efG2GI`'6z$.pP5NHGpQ7M PpEMF+J0ՇVՇ=.#*rs|&K+khp54x\$XM`*lՌ >)BP𗝍B}| (T2XyW2=F#PM15 M^~~z / '_#(7Z#B`0TKJR\s ,c#Pw l,F#P.4ԋeA!55B7s8BAq!ޠA~Lp$Fʻڛ T$jn--M--zbXr"g F& wMh,F#P1L 9^jE6Eഴ3dTuzቃ5EwrZ:}ؒ΍mOϛ\@Q2CIy#1.c2G+Kď1O~腿؜bl6?^18 #0`/Mz A&@,#r1, |U@uYr.22%@p,$**|nǫrjl +ZQ[CS{(U9] P1D/;$&Syг| e&l2Jyah<Xn~`Ug-Ex4a{l'.|`$t#e8܍&&HFdg} ʸaF%r+25L* ikI^8dqěAihL|$"jy%iWPnލ"zbjȋo=u1,="E  C:k_kn ~ߟP_@#!H^=2inJ c+T~jM%d|ACo$yK+O5E-oh=i prʍ~Oƙ/l vi4 (IZA>+#_\ >o/E{kcC\MdnLu$AVg:b37,V\} C`0*re@Ƽ$q^` ̵jhsK"8/ C4?>k@w"Kӡvw_LWK t0'JVu1=kT}/G&յ5`in~Q , kڤ#t--G

EdR?$aضm[C%k&D5mnf'CQ1F)fVJD #P˓ٌ֖s,NLWWRQòy<0'\)k)4V5қc)P5 /@Zm0~/XNV204(rj8R5ty\G{'gb@_QXUAòLnAkH烯.c:h1scF"vMWJwxD4O[7i?ٍ] iύLoFuǜ"[{ ޹伲쿻|3 ~!2 )[/)کSlI-ii `jbuID]7Gq TV{GW0θ-8-bаmN5@ymxfrY\}_:C؇2O7|&W㴴404idN <\.gʛd^s;1@,ǧ!&ZyXz܁9HhN'bDln𫪪6h@B'1+BDU-׬F#'.*:&/:$^D$+!J£c9~+W\}VYPl ah\_k [QߦȄ>Pf4y2I*ʦa~ ɘ1+yRMj9۰m,mN۰[P 6mұEz*P81_#{ i﵆m.,N+%KHIuAwz9.ACGpz?H.~Sz͞ ;ʹ՚vɳt.mϔç뷞* ~tm %TEEb+wӦMg2IK/)Wmuxe(m,' aǨHߔk-S%'ӟ_S貟Vxm2fwx+#] [eC4g%͉{_(d|HnN#"D?㽍~!meKw"#G}'2ֱPdpXCr_Nt]]<( 6fA&-$Wk.̥힗%'hqEi1Eke6j1Z͒޵}nk-QKr^dڃɮuHy:B''wѳB8c&GuJm zKx(o2^(2AO*L{ab^F~2BʡJ+dOrMx" ^> fdf{'y:Q˵P16#1u==vz\vjjJY,yۺSF@I Ǭf98"s`[ `N]EQ ǃ\d"+*tE@E!wE!`050t +/<4pptE櫲a]eP0*E0s/,=7 kmy#OP̢8\ ^ZҸQyIaA@oWʻ @E`0ՌeÙ[|> WU-kO̬+ 9WWҘ1F#s#Nפ=W)`0FRʻR`L1F#Py`]ybF#X1SF#TXyW3F#`*+V#`0Vޕ-`0JA+J3`0@!IcF! H'W;ќ9T }}+I#YzTyMm,F#`J@LR08#(kVVpbY1F@IV8 #<B#===;;BCC<ya9c0uXj Ao hX'^!O+gGE^ZQN>8{ w`,h\Q"" r=܆&gpc^!^H<-U.PWZqi@BPEsTȣc2#kdpsDw2QGF-*JJqYF@y ?Wj]Fs3?w cQ/|Rf3xp꯿z'u''ܛ ߝ%r΢rYw >1՚ <W[ԣTQuH 0K=V$`*w  Î951'7{κ> NZrGӢvnk0M=rj˷4ji..n+jضq6@IUKIEl[K@~ƨ 霬\b4?l^^WY:O?T:(?eNn|W#yhӦMM[ݺ&GVo`J{X]FϱDX ^_+tޱg%Hr?2sC=w^ "uksf[/Q\*=b-D!<~c=H}@zƝ{#t__*E7عs+s`05(yޛų:ۧ'?=}c?:Ngf|4޲k^Yػ-?A(röFV85 EvZb`Ч!LG{ʛ9}NahhS}6ELD=q'TȮ1#}Q:<^nͿ-;V{* `0Do1[SB=0@?Cnb/6N1nozY_jca֬Qg\DNlИߤ ,)@DEVf]:Z5lr1!E*W Vg`0UM%ڳ6v:Bѯ4+3S|N >yGӛ9a)ꫩ檾mރPo{Hy!Ez0{ :! FkՙR7VzQ$2ȓpʻ\F8v"pMϾz4zߥgZ\qr/sZ ٫ m$M5o=^gwփ>èyk0P+0;ekko؅=ir$Caw^eSrz6 INCʃ@y7]5hN~>m0~t#^*ANbozn(/ByP#@R t EJ*%ٲP g+2dJVa@y箝 KTՉekrKWvy\;ؠ94M _>]M}0toI4=3YN;?Ey>;s ?] s*o{ty}sIn &^Q_DC&j{(K~M8FFrN B+ >YmΉ<| Qc{F%u}gl}qE7iI{Y{;h/xS [Jb \xal7dA|Q.7v1?n9$JٞhS+ɞ>*Ikf;PncA:/cR$y+ 4kgnϒY xgnMst;vd-E%5‡x3ߤMo}rj>7iu % )-`"[vw3'%a{~($ xpxۗܿ>[YY MyXnE|elhBGۅD,Žp<v2ſ˷ Ǯzss{VB f=tq0j2R)5-hW9|IדYb*ZQ\w/b5~\Ѽ!::-Y7H B;Rw D )l/(<_ޗM6Dlv^~3öqb*? 2,M7c{ s./#hhf#nddL:3f'ZJ,T_p:+H;=S ݺx$|r2uk%}c y !_N qsw= U:4⹂[!R^d:(ӳՈ-:7^޿|d|fR'Ӿk870+:2 F:josҼv>[8d7 nfCj ]=7v.|Hu ‹MP篌40jtI)욞8'+}7-uM;P8V % 5{rϚ+Ϝ.&WkVS {M]{3?y^M" Űf#YYiRمs-d_(u% ܩCG!]ՂO` tNUgZfj*Eh/gv6f OzKrtԅ*gI͠ aUV*DTf{)T{Dk/m2jFe=9#Kzp]eV򑥨c1^ #o#82 5N/pYAu2Ь O8@,Yz+e3}ua#SҺ%QJe'>뙳<~SJw\-Ő05^)r<$ERעىTF.ų<lNݞh.@Ȯz/4iYI,NYfЗݖedf2{\g&­NU_KG"*Υ .u[R#RrSIPK: }x"#(e5wt&3|/;+oH Ԗ9TETU[gt3,J_ps[bJ K\{۶".Sv{߰OHX׎`O>;&>m6_cU^hJoqdgX/C^PJ"sޑA;)~= (2>cЭlĞ[Qdi0}=~h:Q[JPlGB%,z~'yr[jlC 6$=^okՏ ny\"_g>'O'([#(e7te&ڰfgYM :ލ;67Gƣb^TC#[ǙOrhf:I%v EqMX`}9v?q76uqa=\,g"8F ETJѷj=!n,9r "'.cTAlJmqV6dg.``4J.Y[gs\ !LpKI)!Z9+M޽KIKf7h e rݎPQaNNvGo-i?!a?7Jhan 'O߀ZwHG1PJyÈ#̚|3ÚrXM0n:l > Z|N֐s3%@2HHHul!>nvJ2rut([Mk+еC[HLݐao"ZοD oEkcDljbxy~σנWY &bȡGj]y'sMޖy87Kj7:^"_[n~gM0dT,Fqb&SCa#q\+%#1+ثe|!adZ$JM2:-e YlC]  lF}CERHI@FxzE-Z*# s5 KplVJzz>6l_va˕Fc5 [ m}/h$/%6hԇfzKn($|QuԮ֪Sja|l.\kF'@+[jTJ8?F#`0"|F#&&qF#P?0Fr7n q_rkɩ=mMqԤîPoOH,P_LQza<Ӵ^QAp EPظ߼q&?b!& f`0">Ɔˣc nj ӈe줝klq\ƿ|DθC  tՄ_2qNXz#X~#N[[7A VbhʻbF6@@:Z ^0e۲CWwofC e`#NԼ{F5{X;vs1H/MURbӑݨVm\u6vm1W{!%q,1mKfF()^H@cSQ1M4`ᦊ,6WF$$qmzMݛ*H%_}n+o;wHzh]SOQac Esn{{I6,zqClsuCiQT8'77uZ 8mѯvTPxLVs;$ʨqtn 6nKHNYM}nط'0Z7>1J~v4$#kz62bJʄԤd AI>>J{ J@ R\[1GyghF6CP .%̉<|Mb튩.oc)E]YqO?Z7R?T0~3r7e^^xEڕOv,cE0y!PEB 2)4F[Unj5V=v3̪όyZ'1TPʓP^EPdy\N!E4#M3sLi$2Tc=6eИF4M4,C 㱿<Huæj`FϘ'6Ϛ$:]N5it6XW ULq9ak닅tǷtcͫʮk_W Ʊono輴~w?O;q 0o?§a~RhձG Mְ)=KT$ M0h{\ƴwڃ\ݦb+!þJ@)oMTkĚ^D7==Z1'D!~ٳWn?wv{kkk+g^loomeht!߯YDX[;NZ}3DJENῑ|=Z3u/SܯwܝUi=߄TTYJE*ہFSb͞=v9~pp4cuύ9ņ~12s`s{8V#ƅ"ߝwj6fM3ezoҴArU `91bXNҞ⍆z%7tNBl1K3IhS'(~x,N"x5YK&Ȋ%2 wlQI_JQiu&Q!ޤhB!lLC&1 ! W^˯ǟt5<;oRs_d 'ɳyLf)*U<_Baf" !ݻwn5 f$ %=0EcZ 0ӾwxoSR2Uu aVIω8l_,ytػwwMa%.vv?622'^~,yQX̥\mmG*`oC(8VlLTTL2(NsCE7qCQ@L$̢& )W0թM ƶcSM!0&LW`L!t&k_NJi[aJYO2:'!si Ydw7JS-,Ī=6K8lXׁZhsBzTWlC%z6B.S73هSI0'u޴ JUڱPp4F#P3MʻXG7l g#Bs gኬ[W*g=sVwoJr Ӡ}{ɵ65t% AZ\uB_%+KA1+5hq9x\|tC_-75®-^Nj-fD_G P;@B@Pe5TJ0.+`QEc* Y Mr!ܖi:֩[ӨE*#'f_vƐ&_vWP;sSAĩ-sDrhl!Qr|bt_s3CNv |-PF R4FNŸj*E (]da!/n'cmRހSگ4xtizC܈owYX9/qsl@8CJ&/t{}6,*G!Cnݸccqd'}?S≜_WIsT-n"|JteEMp %[{{cΜ^=d tC&+ZYE(ݦ؏6[PP(! yls2V+  c9|YF-THIi7lU9xد0ʐԗJG Faw6,xͮ ut標KwPZ{A)ҟ*\uS0>7-R,h1tԘ<AbB:D7L}9/ɎtU^7gY-jTr4wod_bhl+e#@IDAT1Irq|ckcnW2l)gV`cT?G;VZF@1kYⲸ\@CXN2hU@EII+]\6UbaBnk/'{gcJ@(ѽ}]v_/%l@MEF\0b^!T0CEKS|.,&Ga˻7O*$I|N. #$KZ[B}!R< ĵv;F#Pv45:Y>l*హm * a|Ѥ-@X<Fv#[] jw]BzWj1t 67]K:oNAA(o0u4Դ .Ύ IEp|BM[FW#T<YYV| ?G[ T&6fWr.3HMLf5:E-jqdДS "Wu%UQp1F#Pw];XBv@8^в`a:1Ec gP`]`0!WOTB/'*\UCj+R3עDkQcaQ1Fth UNy.}I)VsvlxagٸqOy>;qEs?=F*=#._Q9vk¹vث*o"gUܗ ܎Z@WiA~-lTLI-l-pV/;nׄjQc]jM\@E+ooEo{zk ;8kgwUqٜ.+]G{3JLikm"YvYZ#PSޝ >9Euhl}0,ě  ++plN`b7Ghw秵+2)ENe3XZ*VZRyq˛ 0۔g٨+\kO 3|??`:/%eܰNqR8Y*fǕTu`})M -S]2[Mܪ9maڂcOq?O[XW[Z=n^aj&uS1mF3Y~mHe𐆁>ihg=̹>\83(k U'&Xg~*Vy. 㰠ώvW% Au+?+z?y;}PJ'7jihhR쾰l247p-rJEXSTlBj 0~.^NV)?V$}O[jR:cj̟*4q6]ľi1i5 q,F#P+̰62iǙ7 Nַ'$NoQu 6C@Y|ܧ[.{VX0jA[cm1<&z<_Y>܀| xҪOܣ&Z]5Vk1@#G۹_y͚ [P{޸~#wPI\Z^@AGSWzeS^{|prԌ:0"*kւ~MTO0l^Mb1@!op_wu7d;LK&}kٹsgqw> X|lpAA䶓mlmO-`Մ]lfݹZPH 7 0@F@u1mBG'P5v\Ttjӈ "C$u0_bRQ8_N񌰠xL70ɳi1!ݩk7>ʂc0l'a0F P@y9_1A!Lp| IV#lhX`T1UbVr5~'=;sU6l1F#P}%OTRH&VB!hQmz\IEeH3MV"Bэ8T`]bFHMVm?ڙM䍟hso}A$k?q+ lfx2WqIK nv$aWܛqF#PFT͏=yFXS>;eЭa m/=c~TZ'td8`m!:ۚPv:oEj"dTl-Ѓ){wmب)1TYz ]bF`hJ9MMF:N9 Hvu1o|?0rB^hҴ;[XR򉓓pXtd\QQqLE!oQ%J%I}qXq^/J/l%K7?z͑[)(0nc!Y}t׳ piNIϥ禇fEmav ^E$ݪe4:dJ9T%gT#rV}**SYPXOhG]5t"' #jDOCV*h/Bc(")݂%k]'ҞiP;k7?RJ`&laݗiK͓/+CRʛ|WODѕ"U1}gw`ˆq6 xw$#ٰ\cjB }%į۵mѦ=ڔs8*,SYTK)K5HI[U Tʒ4%pi^>;ij5!9ɋ{1VL>vJbܗ,PӟcSDS# f8s׏BQ;,^$Civ`f dmڑ ~b;hQw.3}$܈ CoKǎ7R{JF r??rQ-~l]hPpf|{'T|Mn@D@9KILLI%_bfg}+~KCmV7b63y|d ;3V|M:kb ,a t{!Ĭ6/5$FSܽ}&Jw0U)g)edQ0$W%P2aλX'tD zo7gI<;s#~chDCcs٬!EOVaڱNj||YxjoM Qu|u_\F ZNe|yt4 |٫Nmn&J#5XIQ[/..=O5ހЈG=<irq&+t,-KτQU HTrRX9O)YjrbW}**T%ވ"c"A#bDC3Av9W%`ۖ"Dž8]z9"4pRv&#ywwҍ ;p]㤞8>cw6<_ZI_6Eު \ԑ`u#\47A͖-œӰ-:dtIGnZԉxXz_<-==]>}dfNX EvXĥh4m㯼xq\$c7mڨ|[iUYBYaJR`,*yT%P%UZi4Cڀ%ZiQGzw9+3n~={I ZzR<:HJی|[ya !  `# IHIEk"i {QMl"OO,OϳSO=Y{={] 6W% Aj &!@ :~;;--!E"\uu6>:<<\K䙛<ӧt=1b d}qk-WƐ2@`2lY[﶐ mW4?8Ob1 }]<Rh1!x{y#dg@Y][nyD_v_)^-b1@ df!Vf:Q K"2ܼG)G 9;tI [)KJ8b1 p,܆ 4ck {1޽KqZ衜RgzI>&Oz*kYp6唈;MKN2ޠmZ95a6_뮖ķqB?9 ;޽ :Y˻m"|2vm;jv13Ns.]}8C.3a_K-n.6qL|'rZu;6gzj"r r"͈b \Ϣ[Oaf41*D LMN7۱zOoAP}*옹;q2wwrH݈vgӞH8`ϊBZ7c?-gޅ/]ehػKG>_Jn;֓k5=iQpV5Vk@k!?;.v}-L^j#꒬IAyS_L ?D!R(t_>-`c_]9tᖈ*fɘH!{[-Tgձx]O2On1 e=\8q@l}># b[XxيUOL;_cO:=y\>qKW۾xj \&χ̆еhVͻ&qRvT]oO9]]ѣnsp0[eC{mKViTr.f±<H2 [gƕ9gŹXct6UiRpKTe[>^Հo9Ih'L>A;4P?s:O[3:Wc&~zFj:vuCHp1zuwQ'~U+('_)8}lCk]lZ#M‰al{nnm?ê9'u{t }U!u;MA4lڞ b D-@j %qbk SBp+?9R2C k>8/^D wu28iعJ ^=HJD$c"bi䖏~,Eg9 Wnݕ;=D D.m6/(zdp%.Z}æ 8"|B8٬`{uƼ*DRŅ'N ")smKg>=|MbUhfF!l->5k+)...>M=MD T;MK`C+t 炼,t-B~b ,z 7 ߏĚY5 }{{?_˔+YvO360PU 6fo9>~͋@ sbj?&}1\VAAhZځ{'OCmW3n[I%|{nLBaœa.*Hm1`aH2$**^WMI'>ܯ1A򴺌\m ,FoTv^ ʀVcޏ}͋ kC爁ƀLƛm[KT} 2?u0t录}` ~y7DD P"`#޵sФҼG`H/fՌ ")E_>3ѵOI$^uSU-S7>{+҅O_|4Gnx.d0h2^LU+t|gD$G ^uc' \ PI=D kCW@7;Rҳ?\xF;i[ f=;&{&|Nu[v؂;HKf,BΦ0B~[焥vάjM%.=MiS4j!Jn=+aݘ0v `Ӊvu 쮧&<>7*(J;> {}C; o~f\ut,,F+ɉ {Sd;b&VCcs^}ԟkT6@ | 4.Či:>.zi Mm1τ4祸C7~k%aU˨tƿۼp<ΤUN%^^鿅pzww8 ۭ`Kli[4M@kh!䕏8 GO/-+:%13[" 3/e||/$x%Ow7Y`٭&@3& i˻oj&g&`F}]L`^p9|xakM¯m/w'mHuʓ?3␵'*'q 77{>6}y lDq\O0f@3"z=%m ;8:\CfTTz)TttSVA-%UŀA p*]PمK(Ѳkl `yZ(`A+#saii)29p?"5PRQQѧCdŪ7H+-x4H?bbq{?@̲E!w73g7x"-9W?ϯh[3]p@c@yUêll{N_7C7[ @ 4dA PVשj)v t: @ ȅdB#R@ D3)!7Ȁ\˨2ޭD411Ҫ?dHuk11@ m)jޕp `b1 W=b1@ e@b1h~Py8yR@  x'@ ??D94?JQ;r Y*ƦF‹)3J)55 cs9gc@ Z-l`i*4qJD4}$JZlvaT$ż[׺[,ԜLvKvi|G[UnX,0t1 %ͪy3h\p$\)oEkm:v}1q5;rmlȎ85X펀 '͈d oRS}KmGqkE#@xSAh ։lDaE&y\-=B>)UErBV~7E'5}P!9b@zeA'~=,)6׍kBc O[qccz^:J叡μ1cSot 76t#`E'ٚ0dl]W >%c j {3K|ASNGk2׍Bf1'\;^rSÂcEѳǦ̌zuAAO60/V vs4]>X%P[}mXo{io₡j n}/bqk쐵INK/pL;CCmoUka12}S~clI0 vuքe^^KʚۼATQ9<- 'zpy,fe j&-kY?lI A9,QVfd ;Uu7栠^+bޯ%@.y4r_6BZw؊{+=;bUDGQDIJ԰3iYޒYz›?J{ !zLX=껤kU'=lvQ%=]x߯QxK)ES{P(t_9s]|OBX' oذݶ&Eal<Kˇ6M #h6Ό<[I!us#pn0O$Hv7t-D#+L $ f,|f{WhZ))/_C;?Ɯac>g廽Jf6cPOg>]OSٓ㨛߿5lZw'gRMn蔳`_] uA}a%EPznvڷ'7/dg i޸}yZ3kLhòU l< [o{ >'U0eSƾ:jT=OR&gC_n4fJL!0ar*w!vnkڄCqs L>t8;:{1`}H/e{[ 'Gpӯ+~c]2c;M9( uwxYv{wBΜvn4QNtg&e1>SݥXfM 6k;?v,d?acQKm-Psփu1[w8=FX;?:?z䌱WJ^{u)X>đ[F6(ti7yY Ň.HV@ B@sjx9j.ͷYšZ\ϼH5YԜ|-z2{2(8  A${+A[B46Fى[qM5QǤ#o>Gޝ3ck ʤ.S#a؁pa߿z==j\(xy#b6]`@4 8޿l I\yE0i 4хaG.S̰^`+i:k_HO>;s:z~`$uRgIu:8;;Sʀ`KnA|. t2fp>pO? 5pwn:9 {h-F_j,vB;Y n_,"4V-89Z}?B4TkvƃJ+HhLIy̶cփ 7'rw>p;CL_MF&F7Wn''7H qt[jEiFMŇD i5,aTy(N|ETq})ʝ=&?a  e =l-#W}Ћ]>t@hh&`ԜI[N9nmjttQw-s'=DZڟ=#6Xo-Ҷsch(Ko 4"}즫c$-|(/C^SDP)?9TOVEˤ]xW,i;tU~>*\|vNExϿ 9Yɬ"WPRUR2um?gl.2j*)Yt8\@URE_1@(..Dyzz fP 6QWx$6]hCU12?ˋ4P1^a]R443xfJ%e## w#2S%8¬D8%'DLiS4uEI` hh,Q?|z`yPDc+k bk+5śe.14v  Exj̀miRG;~'&ZZbVWWkkk.<<\X+KO***Ə/9M~q߱\^Äu&Rg _{tBQAmmx^ZZ kإ^X2x bFC)y]\CT602㳿 XXh`jD#ӆ0Q]H;f d)"fumk|CL\=I:UQk&Qb[ҕյE<;2ްLBD`F:x,砑ze?7D5K'Lcҡ$ }:HnZ2wpoZD(8bi3>ѫ8?X݂ q0F.T~ zY6w9+BYyARC-1\SY5GG?ڵ&E 6Ѓ.`)[=AumR~Κn!Vf;aoG:XfZ cөXw^Z<[j:t4ͪ>r3?g3TN>7hib\Iܲ3Iȴk6]ܕ KJw谏O5djk=phWy] $cӎSڻBɤN;;qnn[/b1,&]=wlV?1@ |; w-M%>+Qp4p8Znxvazrfpc,L@uW#X{O*]2>+CZ:#'  nʔZvd zer􀌷$"?b k0$Om] .rNW]l GA(~ҊR eZ9s)rA]P-ݠ=9h:DbuΛda,v..T(U3]ssr%ITax Āf?w:VK&F}L[LRRƠI-Mww$U Qr0;@C_B) s}O@SU’ɠN)k 4q0ުhn^PPWW/++-7ڵk1-H&6  ^?p:'?gwoJ@}5g¹~ ?ں"FhphtbBw͌r7JFT̪lVS -EJ$E ضmmM}W[[ _P)͎ յ\7ǰu\S[ԶnZB=۬ZЎꡅSl8g5}_V×R$'%xK4s>f@Is>cuXSMwB%b1'zzz֭9rf-0ۂfG_Mb7\Euh+Xs0px5-gAML:|6_VgUUs|z*fą;^c[8/8:|BeDdB('?3kct n(b5WW|A 1@ | DDDe5AWUp@IDATJ(m !(zr:{:i$<{*mVxgor 7bB/.VRYی7bpww߳gҠنl"߄7S7Ϥ6͎(0bu2tSMSXl$ P (e5 6^SBɠ4~FN)1T45l,9y% F(N0%,J!"SFIO,F7 : APPSӷ%M|Zٴ X8i5&.e.6Yl9 ϵZ?طЕv4|ao:^] ^PWAH०!C4%\KRVf{N{64m^H542'*?'N#꒬0A4J@E]CII<) ?o|1YXʆK3?|30hsU'*3XΈҦhޓ($$~@0I*Ag JTyU'x>U\Wc>QWBg\\KzPbfm06%(qMζ>p&~ $%%ŋZv`w#ُ|ڡB/a.e9zcBc +`+I:巿pw^hۜ?8{KMY,Tڡ;̅ɢb6P9v\;G&wI8u)Q)炔in@x-BEGK8Vu~W/{uVj*7 @{-!DC xb+YLE*& fcFMȿi'Q+z;$C .un7cUeMzq,EؠվJв G ]/(9p＀ޗ=X޷olmB.-!1,M4{-ggpx)%d{ 矿A[!DYOUSH ٹpuQ4O&)%P{#l;9<Z/Ke '>8/"G/2KIQwA1Lfd2vQT. FH6vR2vrs4U6d6=Eȃ $'J|y,ܿZh2xylAza}̌!e%8v{Nx* jWy^'vܕp?_)ja&_ [pUS4d'ǵws|nҤY|'Jc:YWrkv6E0]W G^Z ={." ɿmV%$ oN[ʹ.%rR<4R-1SOPA.PE{D"988MR1,>V 9$v5߯sd1ʀ&dmJx$#bq/NJcrGyΜ4S<̻UM8=C\/?@"eǩflKJa ͣSpȚszEɮ.〕-GWPu"0"i'1&׆vQ[[v%Ze&t@RtqT:${<(zb=AcSZم3o('u=پ5 qkf'TlNvi>EPT@ٛ}:.&/1U2x ,:}t{EA;?"`sgY.\8|! Dyr6s\-f2ݴ F7^99:qXdŮ̸^SPUu퀛K=^sKEraw\VOٴͻ>7O 4x3s6o4[5U.+Y\8ywP9hMA&Q%|~+rA@'BhZ.E!>fy"K#w~2a|)Ʉ se9k*3WA_l,yrv?[ Mn| T$?Q~x|qՇ' ?{^QYqYfO$!JlyR~6grj^-9ͫԬD\'I\O?#3*~z>jrDrN҇C1`z?sA^:l!ͽ{iE{_\>u~C ЯC+؎oMΣ`9=;ZvIwiɩYs[Mqqtt~rsodR2O~ v{;Ox /hxY h;C33T m [6>sL|̹x# t暝g>7>[\ /;$sxX?E))P~sы2xٙ*"{? ?alcb5X3r_J)dr)*/rplMHU= P:`ET6mmFgaMvJO LfL5Ƣ6`l[CM[ £K~]$( M; Ĝ46<"o $- B2^n~@S\n@쥣_:5p_ț}dD?M2Jlao 6n?v,]ku?&,[`q[Wc}E^}yD `aaޑ(߸~˅KZ9 {0Ǐ;wB%N!5ͫyn:V0- ЕVMv//o lO#jE]—fVL9]G;C>Y/|u&܂K|L8x+^̻KPǐ@y$9fc_\u3aa$'J|ycs.qeL];,xDb؞;J`cyOMr+ _wE1СySN =as'RGz4Y0sfr9k@I/z%2YpU0wh:oNcPPOuZOo)v̻y.`<0>}!osn@}4|(5597gEc_vtK%'7p34zNU뛻*LKG*dɒ/ &\0X!];15~;GZd%.*x`a&va,gOA}gNI}g˦){Zl]Aau3.3NKgSؾejv6VT!°^mvp8(ޥ6`޼"`PX7^ xp@$g/GdS FΛc懓jwCcX/GIVi\mD.o0Erлp'N =vM%״UIO5"aݥ8e}́zQa!ΰj^ЯclFQz؁Nj5"W{i`NA0濒Ѝ`=b0J  ;p6BM3PKI[;rDJ_;: –_n>V؄-3W(7#]€`lz7&tzLk}U]_]5~vr'''7ܸƕZxcmHh̀ Rc| 3pBjݕՏτ4祸v F( pZF9Eu's'G3+qg3܍nEMwG惬8AnyƜ3ile}Wq%+d]\blBA x"N4fJ O;w1ow'mtcG)Yx հXĝMvs[^[B>SvfRC|M;`SO5 <9|ƸakMkD(B)J0j9Oʍxϲ ʁAK,z;DS\~rֱ=&vV)5wQ*w=*StkgPbǾzj԰ ߆RP}IvI { "'/3\^q#=b1 /RӋ o=Gl+ʒV'9t2TUjc4h ="%5!Nzcbj`#еl lЈbm091IdCIQkQ3`dH ڄ"SdJ3ZGraC*bHzqgݵfMhwd o& фI?\ &v47Ԭ|j5Y4- V-;*3c>C/1BQþHjʹAuv|>Aˡ{[Xph;btR7kgh֞^ K/ Zԋ5Izx ~ У T&s(̬sT5Y^h#`bBMW X]=S+O߃ Zg~o@)5uhs6$[ cl!UVC|t1@ Z&b*HVh¦a ;\GȈWmUMu8iJӢ-oX }uPՉ )*zOřDΦ.|*Od3ѱPfp֨H$p~% v~vR:b13P\ˈdeWlTDjBG??6V񮊽[PjlEV0(IJB[**.tpMOR%^<|I'G T;âs- 0*k:t35R b'⢼OK%(Ո!7՝䦯N$@#*p<]D%ٰKպK;BۨZCk* a;9}=Iʕ)źɱH{X0&Us +PlnّP^6W~w (ǧ 0 Aw@BB å>%9uu4FA^^ 2:YtBfMջ9GJ<^\oNp;zNgN;;ki9u%iWد-0>Q耣P[AU??! Gs À,C5(kܷ*޺\mhQdb1 K˫")ƊصDVm-pX` 'P]҃|Pq)]>eq55uTEtpjQSLUE-'ffq΄G]FaFJ&8jjk>'e\V{_4︱ݫ3(QQ%BXXD3 J!)4?JQHNm )o4h9,EcS#R*hv44l_ (N1xQ,h`i*RR%"˾67BCeݲ.͎ȝ ڱiV2͊yj^hxLLLq \] A `5<^m?都ԂRXoµ̨/no? 4G{zM9(P֪o _DrTzr6Ertqq"9 @wl8(KmGq8j}t>J/5!g=j)xOhɺ$GJN,I=tF,er]-Jxpe)gRy.Nz.B8i)Uyr%HǏ르rCzK 喪4x$-TsN3y(П<7ث2:=nTYTccz^:J@}ȞOtzay3DbbfWS/ʈYf"%c<#ωۇ163CT5_x9& 5S.Jhhdk46~WDgH5C#D5oņ΃݇:ظRqcEƩfP7q}Ie&,$nyK Г3h 4x+̌JvbqrwgqDPN(\!f*UMƃep+ЌY.D+w{yr2@U(I`WkM8>_R֜ wQrTr8RBPp~75̔cKy:LommEcnGDˈ.<ȼ9((؀kq1ȾJaBj}Ƒ X!/g HN&=&*lI:g Jbfc|E]k\ I''[O`O_++[[ R<3dY ]}yj󄱇cm6޿aIcW߹gB7-l4 l͠鹽|vw.g@({8*󟱩']ɢݚ>nOy .q18Hh 4xE^Qj?ʑ `UIzX! *&lT%~X>g!,#c<`]R-䚍3G҉s|8ewnJ_xP3l-rwrԂq=sE qeKXOn#ťy(qM$QJѐҷ/4?'X8UyqLZsKLg%_*q'ׅns.~OO`tsW1'&y阹hnn:}`W.lۃ;& 0 \?+ׇ7Z"߮=v_ +86PøT`]XrM_ U?b(D1 }bh vZ8L) P!9*v9\m36M|Tp(6 X7eQQس8i2T+ pzu ^edw}F)9<45#K.cce^g'B5i.%|-lD+ojS7w>Awq$ocԮ8.7xM9VSJyQNtk&|/ܱ&~nd y l`ܭU5Z>< gW'j ]2{ȣUtA/C~r/̵KJ1Ux n;ăG i Z*w#'-WR'9xo|A1̓# !`USF235 hdӫ@{C'}DܿkP  ??R;Tg+oJr$)oڐj2vmHum2>ل 8$kDp%CK0xouޘPRTG6339ECTԂKx5]Bv@$?$\s[: tr:?.5^:( 1Іh^9O ~ʃg >?{Dh7?wL` T̔p۪x<}xfE(z|Ih2giX#&`=`dQLl< 92!E=}T[G0Zn4h#s #ɩKvUGS+6Zڦ]ɉWD~RJ._ ]C͸Uk?+l5(pCL>W&Mg߽Jaþz8{ո6QGVӄO4?n^gktB)+:b9L=(k" A#{.+zOci\Mf}KF n"]\'{>@@cY3s[S8P_-AC6ab]]s-hpj`\m/w9E9 ~zkAɧܗdx.&GqQ! }MJd\ e/NؓXK(!GQ%$\|{p~Vlh|-+/kEdw3D"l@闚~zu( 2⌌+c bO kg%c*a~xjiP`gp2ƒ4Bg-1x!s/taO n[-GMpSD[8櫦=wb?+5PzN(>򶈙|mwXa D&vk±p,z3 ͠R3Jd %;;BşvܕÚQ_) kR3P8̛7Χ#H g=Or_P#ř_`XO_Whbzz"'exUw'$l\Ž+.زzbe sf ȵ L,Z@16hfWqJwXO veFV736%yEgc/NJjr s3'MT&/tU1CRlUFid2(D^Ju%=Loн`Zt2ƒ4u77 ˸nҤIM~ѓ'fflKJL {WSϼMwFEEKI +$7/ RB!)KJоhҤuI{3s9=>g 8̥O>k 'UԗtĔJnX*fDD卣]ӓF;5wGemos56&=肩JE'=m2# h+oݦdF!V tn]=.*N<Tp EGvqUԟp0}tM\\QE  6֎La_|k`Z-gN[t_>HcuW% 5fWrڻ- ceҹA )dE{|7Vq9jOn=v!DqȬo ⴇSx:PG^Ö(h?vձhOz_\ozc>lZ*ҳq.4x`ӭE@6A '_aoz9ihp: f3oLfYq+tQ"Md!ɛPT/?Nz:sjC-'|:BY;.Zv_X#i6qnwb dyt"AND}5O8T^9u΂)pl-14XzQwY Sܦ@F5]l,sP9~c7º BD}~FkĭixׅFq.N\~OpWQlOfBp 7])*~K') BJ$%^w4^FJI(0BXˋ^>ClKX@D63VK't_ZW}-Hv j+_-13ѱ}W}tD^ |yDʃ6KrCzR д`׃0 6roLmNSMWf)(1ǃ#pUױ% =9 <!ņp|m&@} 9zlwwnU@mEI\σF{xĩ*3x o0G_B`RkJښϑpkz#(TD7]גߖa,AGgRQdyT0}aU48!.C=%#Z:gtxD!N=.1m†wfl`)dL*-94GeW"9ƾљd >i ,h׻2i3;b :Zսpqj>Fݞ,WMBobWKM5߃(]p9c<'ㄒ&|x+o_M`Cp**#Տ9A:sJzϯ9+N 8tol"ֈLt{fR桛RZ 2玕D#TrI~ >P>s٩-Ne1rZ}Mv0LZ=k<$M)[dz'xD"Z^y, 8BP,8ޮ87P/=)pvW|dVLFSw: ]? t9Lz?a%%lXdj~'0@7~q!12tގZxP8ua[I{<8}! $14VI UP`Z@ ֏O )&hj1Tn=2hp-ZT(*NHiyYP-&3|Ã9!ˌ:R @SAPA%Łp8?#oc=Q[VCE_c>#(&9R}L\^kfp^J5?1A%r[@[MxnBǓho#Z #4F֠Zo_&/q#n61*BcƵ'Vth:W׵r.,|2$1T,K}YU "dθFtpX; biz&m=ck6?$͡0NKĩ"8^N@sAPIU奍xVU#hdc`2'rf^'H1֑(@CQ~eWK'ԦJ{АUnjs8|vRB}1pVSF),>sԗ0qF­-w+&LO5" Gkm/S9h s+pF+;10X%H[ .SNp̙(c>Xo*qCk--6>:6 0ۋ@p ATܷFhJus[QQ~T λnM逳?0FeN~o&긄J*Qzf-\`_|ڮ)N ~64xjs>Kv9+':A\tXޙ1DM !Hpbg{Zr{o 6×x IDAT6} G;ű3 g妮k 4՛ MGZcI&i] !+ n|S!/F`~XM?lCY)1) 'o atQp;NQ"%l ];L\x6x盦'4Ypx I3 t# UG-?1x&g%#hG)/OMʧtOC, @3z}f}?f>>n|w>r%'[8U`@k"ASuhž,_ޞ˦RfPBC\}zpp:K ^XJEo`.`9RJP UQg`툢;*{)F{O5Vr5~_vP>`Blݒ,1. dqtt 5Y{ ,/m6aFBc!=zm 3Q[o:N'̶ikE` Nzfv5F-Ip!r_9X{nx 4|MY o? -⌻^N 1uJmx04 U܀ʞ o`hnU^!H t {qwwus4frLU$_t 2RuՅ ɉie=I&GX OgK+<Ժzo ۙ'&Y"fV>V8!Xq9[{)$8ȳr9 hN\2M@ɻd\X>8▉ӥ=n<oq}PXF lً J5^YlvK{_#z# p`NSъ׫ڰNs#C=Cȿα7Dq,o@ߣOg18u3c}fH+_--T|q۹3 L`l@]!;MjoY\M2?x/;@VE7)ZYjar3/X\`f<%6VXhJoF]ɴٳ{nW:7]?2?e ^qKZ0]M砖Mf^ZNM񍘝Ո*}w]^Fjh` 6100q ~KMM0L, 6$4r$)9UM+R޴QIO$X|<L4%f^pHɎ) x{SoHUU͟Z{CTU}j6Jpr؃.1D%74;JO$uNK% "Ř밃.((o7TVV/ ^7; U!tuJKnhE }6''GAAŎϟ?P0xۛ]`^ay 11#Q>z Τ|sbƻĤ/}_4. f^Ir~b 4?qy9IENDB`flask-debugtoolbar-0.16.0/docs/_static/screenshot-sqlalchemy-panel.png0000664000175000017500000010165214676013405025740 0ustar carstencarstenPNG  IHDR@hsRGB pHYs  @IDATx]@O*(.P@e'^=p+~n7˽.\lAYdhwwmi%///{h|~(#`~9y??F#kjPF#SOIF#kjPF#SOIF#kjPF#S) `0߅Ge8¤/Jee4ib@]@QTD/*bJ`&T"O1/vF!'*=uyyHVTCHUɊ+H"$ # (,dde1Mʚ >3S)/OASHQ[9&F# ɑOMUE Fw!-߅<# |Ub ᔖ+ZVQLp"F ׂ~*J*R"X,VT:0k)F!ʛHϣ&Le f5xXyYyt/k*#U9L)Ly55j"tʅyy9:+)'Rx_7ysl몫?HΰГd6bY~騢ٯq!ğ@M.֫w{J\[nk$nY_:aՄE0a'hb춰c;bRZ78.]oL X&Ҡ>gtS __/OKyτDGE=Zd^ xFEE=XC_`:@:?"* s7aͪ楼*oc7BlPxی ?s¯[~_BoX}Ex{ &JWVqs% P 8w48|K :/0ٕU5#:"[@^eS*XJoբkt,#\ &d 1H yey8V>8ͻjE]v†=m+̒|M/]t3\X؅[[Oh",uoeDIB91!ވb/(:ۚ8E/Xu8Z1#T@=TB 5TEP W*V<ǩ09+YA41Mt/{JUVV 1O-&fqĝ9sIWGC5mVC]Tj\ |O/`n=NϐF;=7B= Cg'u|F!B=ozCᘆ=l9eN [NΣT"pA0`8ww~QRd?` #P-1ؗ/_X,b]TTT~}{b)))RHB+oyvHVGC|,_Vagle{&EJG&4wQYny7liˊՏ%1۷ptex۶'n_~FM;ZQT?$%f[hKdIrә{H-d৏BptC~-Q8B[bCWugYknDKI(0;ImLFb>"]RM=/bYsݪ=3\UÚVI I6ܐu䰋umLD}3ɈKcjTJ5ywI ecW'47 /*%X&Ra« FIkn 8hEUĬ-*ONa|P4y;ꚁiV7! r,o `sS@y4x#&S`UN{(S'aMRDv@ΐ#sAsC%0'pMVq'N<538%-e?/^d".Χn.S|Z]`gkVkZp>^1zc'/?b ^$7/+5kU9)[VUIZoUx} !ciePeVxw/9MI=nqTzJ>š:pQTIEe?\NZj3q['YhƋ,~_ܱg#˞-ےME׮,J"m nW^=C9 5"ҿA#]x_,*yκ滵?"ZK&B9Iғ ߕL~s/ye2m!1!g5XPvC2=Caޔ>R[?ä3a3555.ߔ q999--J1| `˜$A-!S9U1k-[}̀&B%,Ƽ|62Hv2 Lhd$-Ly#WCW -&Gα0~lj[qg('-R 6[ }4ԊZxbeoWRݿ$7綤9j Ek.+xѮ2ySMt TIbùmǔ~t>{z[rZäه{陬/c鷷rܒ䜱U7Qp.% 02RCAFIA56f[=r!PYͺl$GG GwvrXܯ0QKpxv<o7SkԷ]o9%I\S/d~YgoAN) t|}2@p, %±7wOݽFKz :bEq PIVo >Y`.*-{HI(JT v]nJw3;Ul=tbGE%='dn3)+o{2~G "PSU`.H5%^{&>:k:~Lri/>1,;hl)r➓S瞚ly(A3YX٢[MƮq^v(CJ>5DIӢEF嗿 *eVRzNE*֮ ,[ָ*kra@yL΅Ӈ`bܳ􈼡iSy뻮٨=76vtX@2?ERz4:ߎ̔1/uKсkZbEgd.jZԔt6x%ṁp㐁:@ϏB~ &=w`+RȪ&Νj+<u%G JJTHN;yWv*חJN/BeS$Fha3Ăvk/c K>cB^!;v+jl3$NӉ2H0q $[((Y:>8}G$7BX.Cf.N ̀y ޿WK\S|"}QZJ k繩L6 ߰Zi)&RUHg$+==~g.\2%Ͼ/셝޳̭ozPJV `imq ~re|ov8|ȐNO" j`xl(gVe* T^9MdrgU2&λ , 6 qL|0ں=;;[|&BtmmKO*Dd#Rϒ& ذfl|cJ]fRHM98nQ #ؒlAC3^fD޽Dl{-_5Qެwv%;JT5wP3Іb`D Cm;Tn{[F\T'v,`D[8Eagg(5PڙG66R4*Y(ti\r'w/I͍zyh7 f(KD7+ (v"tn2 ԠgNro<`7$CA]5- E1|Rkش IPuE?zwa5X~td_&|7! +˧OR }0 X`j ,fPN9T!:]ǎLĵlα P0[Ņz)\51jklziE.¼CBw2-e?bBt%}d @ J+r|zc8?\1͑~,YԵal'@pKU(B_ߧW-}JQ-;xŞYZ4jc(nTyn ut #)_=75bJ4!.0$"ߒ\XU_!hhm s  Ȯ`HTZE~^s'a;IG"!71xꙛKJc1_ѲaH1?!/ףWо9 䴟s0r,@.1q8w#Pb XR[CCiIn0oPᙙI dISiSwq}O$ 8n`Vߙ ڵDD2^Bam raht6ޜf Y]Fod(TT#J*{?dpI-B DV_^R7o~ @ ]L(thϹ . %jrl2r_>|uZܦ'ă*֓OE]uTڷ&r}/ JV0Ƃ+CJ.A _dz8rĒ#5]3ZzXFF@ EE y~> b+azzzYj P\s,<jfRsv2Fr9AW ػ5 0ޫayiM#2ϻ ]{NgQkAVl^152tEeל{=+N{HduԨUx{M:]fe?rKTq/P1#-{A*~ۖw[ENaiQK]^-z2r|GAc|ed/ yye'5Jucc |kV7'-n,G QBki:N!)PB#)en󟗑źliӳ">Pv鴒KoJjr1pHZQ&G؃|}irqQ\0(h{gB3;b4f5عki5"RE'x[KX^Ϝ,amU`kؕIH&!.Ts J;^̰`?:ЮdncĆ|FBej1lt4B9^=QÇB&S>w!RQAB3BFVG/EF7H&kބG-*KfH|(B +.2o$fX@:u+(>2#Iڻ 12._| L#+L Ro+㟦Sm"ҋ.Vz:5*?PrқNXC9D%u!Q~΋A N!/L]' ,%=~Y97<inQeS:eHRj1҈e{miGzW\x}8#΁e2O:PD[aN?^5.5* $}>&2Kf7vz:Uj 0Qz%y:[H_K+;]R௨ȨXy00p ?J,!|U_ZXBc(5@]8: ˸,O)iZ0(7ao@&=y熯|J_BH@SKIV I뛕$/&X6_,i]Ude)T > +AmX5^SH]{}Xy##?UyW56LV/_%3Nhn-מ3 !i gץ`9<axy_b55kZN!u }y#xZ' g0j.(.;Lhi+AUs[dCllq FF`]#~3h=7'rѩq2Fq 9^VjE9-|L:y-=s?gx攔044*v`~ yy0 ^Zn}np~m21s|>NcH)dλuoNWVzo+ 2?X^TD/*b7f2KLŁSW%u)-ڰg4 K'F#PgL"Vxq1aɕ8Sg`‚V)-j`I0!ZVW}h>G77#`0u^a1F/G+`0VuϰF##_~c0@C+gXbF#/p1F!w3,1F#4rp1F#Pkh`] K`0;m_F#Pʻu#`vۯ~F#s`] `"::#a"=,5R(X5 -2b0څ@f~@;oOoה g8wS~M`H}Y3,=MپtB(#`UwK\ȴlOC(ZQg4m:gǢcOKH1#& ]_@.:%'Ow=b'؁|E9p!X~'⌎v3MA;; ѹe+}ݗy̹ #U8W>,NG受r!Z2n!z V_S`0:M&Ynm@ykUDE22|N$^y.ςs$S97yE(x. )/@DUWf!>gt[yRHGM95uF/ ׮E3B!49>:Xy#L` O,DKGA2\4U/zߨm+d {&ui3; Ŷ>oM&9}yS0GzPo{$vԅ57@Ț4%9ga_Lm Sއ Dt`'/6'}6vpHTݤM'oLĭߘ& TI.NF1R@Mr8@f8nzWN:1!77 O ۴a[o_?Jjn`|IľUE/{5*e٧:mE bd > WIȽ|0;viCVy荭Yy Sua^?vdD9!h(QTz)*p)J @Fr Œ8J * I_GƉ;o{jrζyoСTwۦAnڶ+[W"ql[u$=g=Hw:OL6֙Hꬫ H~u~1'6 n[W;&΢Do4pkNݝV8B9R4'.GG->oɖ9:zG~{Y]o7aōH%[8Jn}ߝ ]]]PW)'z9RБ<F#c[:GSӇuk,nNS|Jp>V|ohWg0B={m̽񈹞޴٤i\v^.JiaOȿ4øS&*feSgÚ_ Q xhA=k4v矘>JG8$Rh#Wq;My, v8?pZ:گdE0AOцС/vizW![#Hv%iql,?@j(uS qG5VAeDO,GsI`'t!|h Ϫ^>EDLEN, 4{EeKn r";TO`>}Pמ8qC |%L/\F W=C]w4w5zhA%uAs|j!La&" CjD]yMjn Q,>?픫1,1A,!7=gfšpv)v]ђ Xs&_yg7oWW {%4ӻ76cr4S8jgzt;X6%\ jEHrq2a2RiN9O^'xX7)66vQGWSf/H ZGa\za=X@HӪ5J%R|PT!crH)Z̝`]fZËB%a_Q#+~5uU.#^;]]ן~JVSM!d, J&3kOPDA6SOkaRk݇vBW='##D`wjAo7r2Ay#M fʛB`~9߯(PRbr]IQY*(͊ypܱst. ;H&Ëˊ|C,8Uj]iҳ}kdBWuiK* ]ƍ( 5W. UDNr IjA3QGUA%a#mS헜n H,D+%&_"rrSRsUM6mv)\XĹDh$.GNJL3ы-` Ɨ# {F De^*<66Q#!2ȷ컁(}Yhk)`0ڀ+oA+>|̬~{ 3YRx܁"mB>l 8Ϯ &KYl:(+o%i/h7*2 lz,pj|X$I9˗ֱ$auϔZ:lXb}:b?___"!|IS;>ЇSWjc9$qw~={r GAs&zFE_OqE W8o~BܼE>$]Z]|+(P_e*QKh||696;T4x^b6mݴ~ ZO'72{:jf2qmW%lRc7;h2#W.ֵ9~/}hV_raϐ KIUwhu~XVYEw WV ~LnaݜH۾EӁ ÂvCh GsID `j߯QnCA!e((A_b*XbĂ,-s- 9qVetڝ| C&/ գ1&6p p3`Y3f}՞Hbk6W2iBYy̑{MYjäMb7o"qPSh($Z9㻙F*{[dm%x}4 \q*b!ɜHE_Dvnb~+zqsmVm$'N;հBpO_vjEo&%CB&^D+,pZO"|yC) y]w@/G: .x93Q} Jd75b1OE*P-WoU^TB"}SB4TlVZ) ^S@4 l عCU@POi0T#e$OPt*F9`\%U*z:剥SDLˤsnFJJ^Q C|u5WvF!,!JvFJ~ W^͙V 0߿_W*C7JW0 ł0qb8o*;Z\K{3X׏J+pC+`Cs?{BaU'>? `6 <%:ϞÚb0cy†a0@m@[޵~ u5Z0F#X`0Oߢi1Q2<>biLIFzY0LPa3<%Q)읻ԖEI=J%EPZF/N}cp)׿&FF#Pd _'R_#A:Z}Pbhy&} ֝[6RM|Ծ%o֙:~Cj.ZXh"mREj vA^% #`~2`~PIst5h^%m[nzY1 qa&>~)F#;ԚX$+K´-lF|'ҎWՋ;C ;X&#! :ռٕk%="8r^/#G%lв#K44iRgn(lZ*~3-JNYlTPAT$oxtz9v#$`E+"~;Nv],F!@Y?M?^Z%<zLA?sfAnJkU޽,]Mc}SeJ:R%q Nc >A 5E/5h-[)EżRC$?~ơHl|FWR6@# S*vfkxXyגb`0Bg-WFNZ :66w5%-keANzB^MuT=; SVj(۵2S*8T&ldz-Xy j F#~~1dedJ \Mgt2)LENפ es؝ϐy)Oˠ'/:VRZ#4zr2|SX ˒Q֭G%MuR'^Rdx:Rܜ YE ne# -3̙ Jss2` ZXpᒵ'> ħoNS48̠S 4M6@O8 *Z:e{KpyˡӜz{y># iK-^!&q)5Ąߡc!{G[[~ZuPzc32l(oqjգfY ~njLYFPj@N8dIG+ zy5Q>ڏy} Ĩifg²5q9Nkq}= 4WIQE,cT/ uuKh̸iE3ISV4}?'vvzR z 9jD|)4Z>9!clemH?:ֱɺGS*qgg%~NLQ dW訬~1$mfԵ%Qf|)[*H缻:rȷkFҪ^QI)ᠣ4|=|m`5 ﮂT+ElEcՔ+,\u[[kL@QHfz4wU;%0e\,AuoOp굴o<'3p~a'?5"NY7[=DmT B3+V5'z݆^nh CyBw'SRrL')5 y}\cT\A]+G rUij9<FTA^a&-1 ESyQEd҉oaz "NHZs\d JyS߹yl2pfh*XvaD#*M_ޟ?fi#~ٴCąA Jy]tE?`+E9⾙*KY} w T tl ϶=W㍺u^t=h-9{)Rs(/)=Q8Ku:~o^p3o\ߍhn{#nݘ""sDv{g3T[mou5ppw 4lH^ E_adLX4hCR"PebQ,Cp;w2JN'`3Mep9fpyuhz t+uą.0|;:w^>{,?T1 O t x(y(XDz 1<{aE3'<#;C睯BuioFDoVn[Hú4Fq6ҀLݎj`λ6{za@'l7ݸ6Xvwc{{7]l:$G P=lu~Q\oX wUԦEv\4,z9jPvݦKpȊ?yd @aaSvϗф;h"l#~={7h>scV`9O?Bp)Ҥ-VEm 5\rϷP1BD]_oƝ1 '3WR DhGhܒ ?~h[w_R*;*uubO~$)Tw]X=RtlCL~x% k;`K.;*JVnvYt{FgfdK,TZno.Qy;VXPPP69_7wjݪ{7KHabhz>!fвÐvԸJ^[qoMafew׳OҢkk*ՙ)z:fF{c}=єhOC8hw^o԰d+-z998eECDUe\.^潱Z}]) eŤcY#<1&4'aAY`%!itK&2s$ɢMóKWJm#wF-ެSwkୃ 4{cO޳:4v])OVyI 8dc<g<hnK{06YaѰ55O+:Lb.eZ1VCin5q?y/R#5P(7"$YG^to3~Ѯ$$cٺD9Vn{-l zB1g le٣\}*ȼ{1ظ"83Xܲ'Y*%o-^~(ăKqHq!o yd_jO_܍)TtFԔ/Sv^:rςK$bXVӓu\ߠ؏sPfy}7 s~ŋ*TzqiTsqewfnl\M&7ڃ*9~V.:php@f&l ;'GT6댊sЊ=cӔFZ4ۂ.‹S]p 述y)QyGpN|e+h;ZvY_0Z9ÒmPf H]U*0:-Dˇ$b"ztj/.B_&TlۡK1}Wq]ʓnkǠYJpA [|3RW$7+RV(a~3wqeON.Oin $ Y4dt1# "GH y ɞ.{mc?}J념u԰͂՟#n\w҄.*As Ga]gZ'!I:@SXh`!-VWk7_cW.tkEQ/hPrQ8IuEe{7g]z9@+-]L&pϕߧ {9Q!PbnZhQm X ]Р+I!%.ѩ}92~YEBWM% * "G[<.BsLUFB`2H:ddR h n:*y v2KIhu&JAd\p #xAږ@RԘ ;#2ebW\x^>%QVCBC) wB9+(wîzPQݳЖO)W"(]64\H*āz7Ca Y5mc2wBMiKx9 x,W2wC!wƇij$W%gXŖ 5OXa\3{, d;p)sl3H~cM&{1GֳwԲJk&lfl!>&gXIsC 7,zo-OwKOQ"}JKާ>$k7U_"?p=ycGd#X( fZ8Q)qۣuht$ϸ){mXn0xD(A/n% TWK+Q)o~ (+ S$Ej4Aa +5mcM^L٩q)o9psf#n!ZVIbK8V׺wlC+xIJ yl6';x.e>닶3.=T C!,]uY*&按4m#e<=ů*˹`b3ENPk7΍ {GDdIN|;?ذIhx~,vwS8685hXSM cvT}יeE(.uѡՙ)h\ܬBO]jwwO# (XrbM=L6ƶTR <ҝZ0vqdk*i1l3(3U;?A@1Rt(Y=v1Ҽ:^!e/0=q&45_dADX{q憇6u-]qֵ̈́sw>E~q@L ٠oЧZv_^NOw3抮EfJ*5ipj8$ӡ]L͆s-H A\deZ(0Ht*|Qnm>IP5ۓ 44 h1'Yېhly 4 (Dn2U* ncL54P)jǧ? .8 Eyܬ".OVVɐ |v)^w>*Qe2eQ(^7M5JIHgal Isᵓ"^MX9* 舞lVNvvlЦ׬A;7Yx߽X@OjZl `c;V~bo՘+8=2>1uDчGfm~Kt}W˙kϭu/y~EŬLOV]UG)~9pYreeg:j bd)(WRfcgfjr+T\L8+;Ԩ\ih|uDZ.xY5:-(ϯk۳x?Z;K]ܦgZis:+ȭ^n5EcƏtTuRśΗN"ש'ge}w9֌G謐jFzdhw+F} >@WHBTWRզp+  ^y 6uxxC@01ᖑ= $M.LF,iH^OWO9Y.!XbhPuuT> N*Lhjr+SEYPa>Ļ@B;@5បª/, 1HKtɉX9. u媚i9ZWOE"5*~#%<RM:)*H HLAY<*&GpМ9֨ @@u p{4XS]Yi(+7k:V4,A+z#YuQaHc_j0i];p;ɮy\\͞%-.@@qH#1Գ433ø}w5 ?vĩnˎ {.+N>тn5AIg6kc'SD!AOW'#{93oկ]ғl~Y?RCYg^;#]Ry,4XIAu\~tFoz7gm$at3cOnX5z$5…YwrQ,u\oД䏙 6Km y {f,:_'/a0~T]|`ł=1u^q6~jQv?.H˝B Q.ps{ng9#|W\Ҙ/Yw7RMk4=gDC~wӁKΕ   4wlZ?8|ΉN0dk޽~GAv Q;_?OXyTF,qp17E7=.ڜ.#>tɌ<'0ġ x^Ww ~+|{S=Hȹ+t8c>T^rsk~HzJ;hJFVvof9v{r+!.3ZX];U^4^םݯ:}[wo]9b7sɠ?dv9,%@G d/>8BwW%7s'qr0eBZ5sO<5\jqA;gеȁ}%|rFۗNݣŜ|;vSoF"?{v}u6_"('ܱouE=\\ޏO//{єH}E_ \/WnQ %wjw/j.f8o>tOZ:NK @ Miia8ЃUQnbk4Nʄ2OVfog6u)%! DGW/nnsV_N_xZX[['G jTkby\R<ʠF6UWyn?թ_OCRVS<   @2Q[O \[K2^ߧ *ŪNoHo2^Ks :k M 58h!P%٩_iRX56%k)ĺPצ5UM^$'Jzk<'M<YGNL7Bכ'wJzN1Mijty"/>_.;٘9X ;,YBفʼ񑳮ۨtȄ6c Y/V[OOdDΟ\R^v)<>50 ULh_|vA11?zfK\2OPWӚx@@h|ti}>F_}{dzy˳oV}Yt\rQK]>l!^s}~am=8}%=|hR9U-Iu'W^g,2ww{VXU%SlXo?5vOnzzn|7kCY5*2h}ƤѺt._>!^Z'LW~!fUS5Q`rssUw^^QB ;rȂ5gWhˠծWk4Yq~LMs4uJ>dDԨQ>GDz`X|mcu+ 135n~~ EآdP ZPPآdP ZPPآdݻSu|0 Yjv)% Mt Dt*uŴ`L@  OL{vD/ijEF' ͛?ıxEٽO:=??@8%t\O&QRzM-wǙ\k;*dH3.O>!a6_!0a?!EשrAC͟o!4UHw]%wtl.SXOO, mlDy#(7nMYAkGn-0yjS'UC Ef tjw\& pOOdin6wƝ~[DT;2hH*sZ3?n#u]fcjR\#F>=2N~=U,`S(/]1`1酒~CIacӪ4wk&>p7d;e =GT^_B:@_J`>g)Ӑ̈k#x/2 IL'-$a4{&sw żIt#K8d_LcG{:;KGa{76X:I$m j!lAitj\se$KB c߁T*3IKIlM$n]E~i9Oa2.քdWGџĚZBjäW' ;>cl >3NH%71scg''Ǒ>z[FuؚykSsX-\<깡\^A.ϯ %ԁVZ%5ꪗtrUicLWFuȊ#!pśycuJjPn(@N@&UPjj[{VF^LSV4WEη3MLV@=/5%:4b1|atP(d\B_j0ṩnT諜j$^nO>YwR|=Bxҙ6$Tؑ]BM 8k;xP4) '׮$+]A[;YF}͗y-.L4am&L'n&VȋSd5 BЧr.9*SW: #Hka\Q>&gvb2w'iygArخfG?4(3'κFVNΊIuxLnяڒvck%ߐ":[hv^,rˣ'Nc|*ٟF8E҄aw SeI̝}zcT%Dx'"6ӭw7.3lS;S|#J"Sb! 9*rufo^Ö7ɸqd`$#˓/k\ZH27/\͘4Ve#%$svLnnD}  nSsv03ԩ,IqjZF,Si?w,BRJ_ԪY[A *4MZh4 -vdB򓣔6ZpWRs'*+RaϹbөyy]= u2&p, g8v33,Mx>}hTАE4_;J^։DjCkA $ЊI۶.*3>ʶ'Qmaܻ+7z4)uD5 @@@M cwyv-qy##o3G  Ȼ`:$i֤@@@@ *@@@5 @[& xk2$nM( @@4@Ȩ@@ZĻ5i,[NC  n [`ؓ UNy7  1&&܉ pZ k0JQ{λv- h;o;{By?!@dMxk8'$~B  &4q  OH@@4Mi@@ ";h[Q 0W T=Zrhû뎤qiX\_>8aKAEIK66߫ T(ln[To͛"p8gRqL*w;9dO)[q#22=ڏujAJ{mhOkɊ`3ExbP/ޭP^n$i& @:O9!aN*5g{H]ef]޾-y|>lxO+fzYuYCLVV,}'N ĝt,k0vy뙚` !Z >Zٷ?.4ǮR?ݏ>"d<7bka~zPͪysAVƩG5[{rQYQ_/_w^7zfDW(/͹}'+Ӓ7#s-.5rϺŋ'X4К[ϴ7<_rk{^5i?듟F|SEiZY0@bV.4͔7;iͬΛ)w}E79S_znóӂ'F"SӦM^s[g'1d!G)6siS[hj|   ,, ׆qܰXt4?xv܈{Ьdf+WMc\;ߑnNQSYSWkWGʡs0uӃ;G2pykuu@K.\Ŧ~i/2Z}̹;:.˪9Bzq|UG%WW)Sƽg|j GŇrU'uu;0IO uWՎo'X  P敛R@ :?f(n;ҘmGOs..+i8gW[l&i/8Ė=Fj{/anT⮥RuV:SfUAT^$+a)vy7TLGөp&Ä_.ݯ\\q*.}|,se7NC$ZxkY\CȨWnQz3@ WZ][HK3?UU 2ץCmYI)uP }떥-[w&2^Hΰ_;~Md+\N3s CW:iviėNdm8[{QG_z>gn uԑK8?3˙r][ƃh15k|1115mj6v^kԓ5}C9}+Kn׽w7:V?KmOUICqe7wO3ZI&UL&w 6ԆcĽR7M6Sny֝o? _斷fy8©'6kTkߥx'48cK=WQDӽ ˊKio~7Bkđ^&Ef񅮋Sfۛ!%n cGWoZDʭUpsfN#6+͵`&@%zRTܜP(h2 %RiQfq FØ,w"O]K5l׾~53aySQh#YSʩK9}nI f7(u Ho&ĻF4h@JJ˶H$o h@[]虣LX{ҒYvgiGg  .k׮7n\ :97y;|ˤEr}Ch.F B ,,/m::?1'ڲ?[xĻt" С$&&) ^y-xwn~`!76:MwMA84XBBjc} UB`#@ p>~E_x_;GxE7oޱc}]#jj5Vwƍw06@E#rʪU r:+7K\$v|h!@%s۷ӯZS#BS5Cma"zA:;1wTTTH R?Kx:;/_[  Aׯ_RzbR! ⭵]A?VX7'Z)JG!@U qRB ӈONцzyk}  ,K.=ze~ zQ : &`M d/n ִ^&zU!+IK,2p1 S+;+'eUpyt,DyIpi}gA@}`޵5=ͫaASNݣM7<(жy a8CT*2"#A1Rm=$c*CnwkD9  \| ֳ:3C6K+խQED^~ejkeGnTS';w94(Z|[[<@łv0r&2V_Qk{+SMuSЁ (B-0Њ 2'&A!K2km&@@@(d**Pf + +^b+$t.S_/eld瓮W!Q0\JIٝqs#nW7IDATU4XHI/m};vDW#]EDljÄF䋺yazR } 9FBlq+1&]&#]@r)N ꤋA@3,J=qΩ3bn =üӧ1n\(fFbers= #M9qU;dg1]$ŭZ 0j4J $$6 444ҳz$>(a\OVMpFC`e7oV5OOAPB<3v!0@@#nA@@x9   ws  Ļu@#xhg C`4G!ă@;#ngs@@@99B(( ~ h @ ;k6=vh-v  ޝn%ڮ  Ļ<    Zu0@@xw֞GA@[ktVh7xkmpJY{Zo:  Y @;kϣ  ZK⭵]A@:+wgy@PmyomZMUb(pwK!=SP볬&BMx7  0g|z9:*[ G8IENDB`flask-debugtoolbar-0.16.0/docs/_static/example.gif0000664000175000017500000047103314676013405021745 0ustar carstencarstenGIF89a|X-.!,!AO]gv7T.n,?]-,@+>q,@,3PkNdAP^O.hwy-h.O-,@)HVA]@,mIhM+pg>JJJ@@AXXXUUUR\Rt\Wggg}}}sssnxenf_#</KVKYben(Z7{;w7z+n=d~7zNtY{JydYeym{M[* +5$>(ARX#66"74\SjynsIOPJZ[jmxlx,/IBS[V3k2Zhru&n+mZqfE?VM_VLCaYge{5yRowɇ ɋ:ߠ !/#ΓIϗUəbףYۨe̤oOSUzh.0}ّΕ⯻ȀĉȋԵ·׬Фіؼ׸͵㗕廼羆ȳʌ͔ӗǍܥֳȏ!! NETSCAPE2.0,|X{O?&\ȰÃJ"E^ȱă;)2B%%$ɲ˗0WœIfJm~)Sϟ.;ox!MT)SN*ujӧK^gԥV‹ի٬_V=lֲކz֭ݻ[žj7lڵ>wյt _%+TnyFF1]eLXrfĐu,Z1fU Z-n[[z1iʗsvUPcNJ_&k߱. _wW<¥vs~N|g?u;l~~'sHwZ)`yk u)8o%W x^`ņ^Sivi6`~."XՅŧe^x{Y([e棆nmVx5Xt礔MHQcnS"EXZ#X?.i9mfhu#O҈T_Y_E(0& ii2)@*!Fލ矍J*-8h}zyc+Z*Zfrܤ&%ϧ~꧄(7fpjR2{l޶u‹' o nu/gmҫp _pq,~pD Blr4L,h0hhr,&l(λ<(m.jvY;dn0bڜÙrݵXw淵rý6Ԍr1uY3CmաߕN{AϏ> ?0~|ؽ2d? /P`;( Dv#'1]/zs`'~@ O( Ⰴ>nxA F7[IL41EY1} _N A%E P; 6:/.`"B/r G^}ܢ YC^. c  6J҉oa 3iFNRҋ)1i+Ñ 28Ԥ(Wюq^^@ &gL;dJyӜ.]Cl%Sɽcsdd8mҝ)(ERRS!#IOxPYl>ُz9=kewPBF}Y8~FjPrH2 Rť^|R1(?wsLɹhB[ʭG).1:2fA\IB2?, n59-CM=/5ńwk]{׽5a=!N`Hh1+1CN5v%8 HX5jY[MmdJu5ͽ.gぜ{:DpM~` Qѐs-q?Cr!Tt яE@ЀbѾ|B=6 س$Z=c/&{Ԙ/ҲRfX5 s*.z(j|0AA?i7TH/:>Ǩ16405 ((hb*(xjP@4Y 1+?]Jz@Dju{^"`]Vu^jNE[{AR ( 6 5 S zwx7sWw|'wvv6xʦx/xy*u{Ky=n\^g Oe ^LFe=g 5O" E|u %UP`f%oXw^Wq g[aJ#}g^t} ,@  `T>`O> p |u͇@]S =ٰ5QX(uWV^$DІwu=o\HVZfuQo\ܳvf&@ 7\&v8v(3880n8*Uwl"u(\cKG؃GmTyIp(*JFgvge^]a=\f㌁(g( yI`p^v GF]?dTvT4`>U o`uM@ߠVPT -CבwrfETtt =Jq&oC탍6AYo>='ۥCI'p " |)y t |ɒِdlwyi cАIZI^ot]^Qf6֠QҨo 6tوQ^C $Q@JE~i^مEfOExk(I^&L>ʈ/:}=Z=p>=e\3s{) eTӆ>q0X 0ࡿ w9 SBfHhc`Q8gd`\'hB`|ƗM$z?ԢuXdhEaT (0IVrJAiCpLD' ^HE0p $.sbAToĠjspfJo0VjqYO{Lpf9>e`gD;8ϊ@Zy'(ʭzxKJxx7gy|IvCz|uw xgGj_ZȖ=s=O^#UZ& ِwpm9h\54?g04إi@j@0h@|8oDZ3 @HP |ɰl@oX{n"Z6) #p 6 {P֊zӐn >:Ħl mJ Ю KnpCK:t_Jz8D4AC9Qq^#jgA ^ySYKq6^:'h|>$Pڐd砌ڟt p P= p10 :ԳT # e` d `\ŸJY^īk> $˹` ɣ#: q <LSi b"Fbz j .c2 0! ;cdd ,u[EP e4ܓ _P Io/e%Uh5K & ]."`֐K Í q> }ƻZC 0s0P> Q`}*K  07ȠAFq1J^t?WK !p װ|YO|d tU]obMi `P ̭5 0 G:e>ҐWuPb <`X ذܸYUY9"co@JO aDg\ \{s K"ِ j3 д͠#=m Ʃ_J(gb?wM t F֜ 8ʷݬZuT `;?Ȭ! @Lh}<\ ,t נpNp^l#,C|r>-qP&Km Ap-תZ l tMzhg]3 ]}?hF\4ܗܿz֩FU,µEK `j ˹d%mt$qܢRNWPЬCg}ra#Lp ]moq}[=H+>M>qS[J-j ]= } οpi(ί5 .iK1$`-:}GL|Iny6zGᶌ0g{C0aNa}-y dr>t^_H)$ewN5Ujl>VG3eM%ek(>=Օu^[蚞ݍeݽ~u/%B}3-.f^?#HMv?c%ٽVV^NM >sN ^` ԰Mxfk.I:tn܍oۡ.ŭ~&*h..f^ ם]} x~hN-~ ٞ-:sw笞>w֐w`jHSnKlEwN /E>AO>whB~Tkn$-K />avjRxWUfz#w2_{.wܾ,Oм7O7p ߚo J 0 p/  +?o= _?@o/ׯO.O!L@a 4(A lF0"É+BDÌ-~l挚k$fʔ)aG;K1^HQ'Udѓ%KF䥅Ϝ]zuϬ!CtTJbɒDѕlͪEjX)|*gػzInYK>M$lm2[ɕJ-xgb6i2k7{ڱQQ%I\_Qggfym4mjn\W7t]ywfNI׎n{Yn*ū兩md'7=G+:B[%( ך0 .C.GD O9V\%VDYAo1GQ0j0LH QD.qo|(2I++$H#C-LF'uKBJ0M5dM7$\IN;9)E?AݳPE3OD3Q8'RK/C75B!3H=4SS/UOP%]QO%%VWgtQUGeTOL rXa+^=6C&ZeL Z6D[o5uZ2[jGgewtM׼rm.Jq=wuۭ`j,8$;aUvO4ϊ)sb<nc;8:AdMxK^Y69!>YuK}U]q5Zs5V6yǚaFi6q&Zh3YAziZ_FzlT:eom})n;oo{'i G<O;oƿVx'xG>ygy矇>z>Q>{>?|'|G?}g}߇?~秿~??ЀD`@6Ё`%8A VЂ`5AvЃaE8BЄ'Da UBЅ/a e8CІ7auCЇ?b8D"шGDbD&6щOb8E*VъWbE.vы_c8F2ьgDcոF6эoc8G:юwcG>яd 9HBҐDd"HF6ґd$%9IJVҒd&5INvғe(EҔdBVRt*[)KXRe.~?ae1Kτf49MjVӚf6Mnvӛg8řMgӜDg:չNvӝg4{g<}3g?BxԠEhBP6ԡhD9P}30L|DE:RԤ'EiJUz波Շ2{Q1VSԧ?jP:΁3@jRL4թOS)ӡVժWjVUnӢXRԨ59m4Vխok\:Wծwk^Wկl`;XְElb::UMYT}jUlf5YvֳmhE;ZҖ\kȖe0kZֶmnu[ޚ\j:LQjZ[6׹υnt;ݼnq*YV}nx;^׼煫uWTQָ-T M׾o~[XnT>Fp]>Vۍ{pY{n'Fq7ص: Y7qwYc] ?CGFr<;]q{\6uIJ-񒵼e.wY,np3 F9Oje6InS)i6ߚ߼g>M14;3~Ft_0_7c~)?YSPc!5iN?W}+:r@N'n2{ɌO*SǴ9-h TbVfaV_=mj=^3~3.MU"8@w-A鎂=oz7֏=;|f+>8a78*6n[PzW;nlm}U\!q.;yuc?ٞ1T=>UXqyHyٝw~̥>u&̢mhLۮucJǹ7>W^/wց7ޚtvNzx}RExC5FL\ O{.zD}u jf0ߑw4natҘn'Ȇz֐6rТd}ԇYLlm14{?|}ƌd '*2u+?p+0,Kws =:z臑+9Y;u~u |Nj2Ld}99b 삶Z|:tsB _btkSPNo0@k9t˂n@k|72@06{4nsa g{@i@dl8yu3=%uӅ"c𓷳C0x@4w+@1DN1} T.}&'mjͯO~AZMS,s>Jfq@}ؾ^"apWڇy{ͯkwVCRx(ЁDRڲW|eX/0xQWQx2=[m؎EчXx HXUY4ݼz}pD5+ ϕY}TA~:5+RFoQp٣ǖu4Rпz~қEڪ}?<0Yܿo+]">%}Y5Qtp*U3 u{ [ ܊[5Eܽ=\ŵ|(b(2]+-5\]%-5E=U]eו'ʵݙ]e]]]څ]U^}ABI#&VC-ں]-_^]_J^D%(_E_M(R5^e`u`^`7 V]_]M^ V`a]>a5_ك(dcM[`>6auamFnɵb$vb,/)F`3FVf5vޔ39Vc2'%N &>Fc->_?&@.d@&d%4(G_'>[˄~hhNƊ!<[Zn_&c0)c `Yv NEbeCVd/e[~FdJcv6)NceU_VU>^eW]Df`&daXebbk맴x[UT6 ~]g`a~ca`hn\݌v._&aEi݁;熎ĂNhi7c*U~xh^huV6ඞk郾aj6.kn^&[謾cU&Oجg:ҳ&>kiZed.s,WFUbgiVifٞmmrcvklsn]nm ~`>mNmeRU ;[bR/ҮXc-n}Z*^;d.Ffim>i6f~Hv__Xh?u>gc6@lNܖ`.pI>bbOFiWNhNe6父 p6p_:7ǝ=1 o:fr.mqijaef!q~f]b %gfdc qa #G^"q,z]H^ZQ.5f^6*o 7f_'7"BpmFtVtm4jFr3?JrJ'qmE n1E2t>wsSGu#Oq~&a" Nܽnp0H&XԢ=!lINpqVoc:>bJnvun`gt S_opHp7mFkWw?Ow=.pVdfv w.{|~/S0:UȂhX8.C)MQ.VL~CYjf@k /wFFkAwm1pnVugmVguoOq6fA'/ygygBV=7n .WuW?9ux`*:;7^Ȗ,Jx+W6r )kH{{~.w&~7|@?|Nf滖{yW׭zzY9݂OzazaR5eCmG|1frH_t~}wG7ShqRsiŇ c^~odgD'|_z~ׇ˭q~ )(01dx!Ĉ1e"ƌ5>ر ȐdI'U\˔/_l sM:WTO9sigQ7{Ф@*ETFTSSf%5ذe[6S]uӝ^F ^1zŋr9ґ^݆8.>G=2 JHgQH]TܫL͖^x`q g}tLۯ`۳{Տ>?6ovԝn/\nUU  ƲO?$HdhE7HO?XT?#D ikfm)^d3ᦔ{pAxӁUQhXm-wf#ըݍ\V${h$aBRvA壔YiZ%eM9، %_HeJ7A5y&piֈn+#O=C- C,F@)ZChbAI$)bn6\9WOuVYejֵhychz*%cs*%kZlꬪ,.++5z;[L`.Ux{(Af !ܔriXU]oyߗ0wu <_0zMkpx0] r~ ]A~p qL1Mf%8dMjZA1h/m[_*g6/|%86_N^Mnh'v\n }mP OyZm Yau`~^^kJt tK3O]p8Z szPZ]8캗~_ž0xݾk <ʲz}N{۾=ux%*BBnQ&Y}Fǀjk? HPr'^p _U@)V,֮u. nVfaW?)eN"[_<Ұ6!s>!(!F<"hDDp>&OJ"-r^"(F,EO<#&*nΊc|#(9ұv(C]};?47ⱐ<$"E22_z>"9(&<!Mr$( 2,%Bp|+aL%.sK#>%09]<&2oɢ`23L&4)iRl&0iYmr5 Cm~<':9Nq|'<)9t<}Sρ'@O2E'Bʹ>=G<,QDFT%S=0|± d!H Rz#rDB2ӚptcVcG=" 1H$OeS9%DBA$pNo(R0PqD8@")F\{h tM'zɾ1Z( BRֻ@ZF`Z.V "Amt:NZgpjCFuW1RGG1C$,1N"(BO!T+/<Apu.Ч~wG:J,aG9 < i%H}4` il1   I>AAH HA PF hw@,;m$ˏ7?^@, cƻ@,71Lú EH?0+ ;`sCJT:\@r|㧴A[N=Mpq2^t Vncx㥴M@HKZьvtZf@ )b.H!B4PI@[Y c2L[PҮ?Z h z~m5Pڐ@zہ-b.iGfVS=ʹ@sBC 3}=µAJSH?S֕ :I=R{ SbjZhkч4]2 +< )0躯*RLX5J A j {v.7X1v0zK bҶ였 \ĩyMso8u3_CT8| 7!ŻX#.pG䎎w$C0:>V8; 6}\M*v'uFAUU 5i ;LZo\` &XA,\V?U^]X)H9C_1> WbU\>dCb1杠q=y roa܁}I `]_8î,%,H^6T 8_A`gW mO M B >(iP% @!@ML!Ĕ!m}Z@g!"$]>,!q f" ;` QWYә]AT_D"*5"5Cf0b$+fC5b?+X [4bV"pVAAt,b.Z/H[UAxe1Hܑ55PJaxŖS=_A`A+Z6/t}cZݖH-Fc,#A5:PC6=TqA!1Ր1& q8y" ͔TbA ԃHe]#:C C$>bN L@Ji, Y! NODPV4%A,mbe?(ׅU=_a}bm`OF%NlJ_R BePeA ;^B^l0gHܕ% %bH^&IbIΐR'@UEכ]WlB(L@]/ěa=Ul-kH1ȺSgZĂIB ,Z.&nfOWHMU7À8A@4$g,'c >!@8AT5gljo8`'_Udn|{CqV4x'Y)'4tX5W3ւT:^Kf6f:m5"މ_1ATVV4be$(IU(A̖ ,A@UV(eHz֯gݡi,8I $}[)yXH,#Լ9)Dv1HH8iI:TEb=vZX~D2ӈҐ=좺I=RЦvӨC6p*|eP>9dåPy*:\5̪ jCBjH~c5+ *jbӤ6N<=k6qfRn+k4u8a+mhU@k+Vƫk-k;yⒾR+,V+*,6!=-N,VʷVn&"lNrȎ,/y~TȒʮ,]l,Ƭ>Z,Ϊl*m ,ɞV m.-,Fm-f^m:0)-vmj-B׎RZ-٦m&-ܬھmmҊ-ʭ3q--Zߺmn 6Ⲉ>.FN.V^.fn.v~.膮.閮.ꦮB.n.Ʈ.֮..n.//m6>/FN/mfn/v~/^////Ư/֯///00'/07?0GO0W_0go0w00 0 0 0 ǰ 0 װ 00011'/17?1GO1W_1go1w11111DZ1ױ111  2!!2"'"/2#7#?2$G$O2%W%_2&g&o2'w'2((2))2**2++2,Dz,2-ײ-2..2//20031132'2/3373?34G4O35W5_36g6o37w73883993::3;;3<dz<3=׳=3>>3??3@@4AA4B'B/4C7C?4DGDO4EWE_4FgFo4GwG4HH4II4JJ4KK4LǴL4M״M4NN4OO4PP5QQ5R'R/5S7S?5TGTO5UWU_5VgVo5WwW5XX5YY5ZZ5[[5\ǵ\5]׵]5^^5__5``6aa6b'b/6c7c?6dGdO6eWe_6fgfo6gwg6hh6ii6jj6kk6lǶl6m׶m6nn6oo6pp7qq7r'r/7s7s?7tGtO7uWu_7vgvo7www7xx7yy7zz7{{7|Ƿ|7}׷}7~~7788'/87?8GO8W_8go8w88888Ǹ8׸8縎8899'/97?9GO9W_9go9w99999ǹ9׹'5и54 C)8C4)z5B)B@!,|X-!"&.  '''(((%'(6668886??/&/--OA]o7T.n&%F(.S%$`%#l$;j'&u#'B'1FN$Dl,QuMzAV_F&&R+(pp.`'%i'%p3%]) L*IK-lf1Hf(aQH3mIjE%tG$oR2_NZZZVXWMPNIRoUjupNLzjSzyzjljj\l<*%$#4NT m"R$I"S;e7{?t6xg'|CiStOxoxm{\Z*5$>(ARX570Vgwt\M[WOUVjsv~-&&'+$IT!J$d/ZS!p` a!w.lkHtSzoqSSa(.E?WNaYjiRRt9ixVwolȋ;,!ёΕR˙h֢ZסhڦhΧtSv.0}х䮷ʏΗ̙խΗֹи攒廂廼ȴ˕՞Ӗɏ٥԰ƙS'/*\ȰÇ#JHŋ3jȱǏ CIɒԩ^>yɛ3L0oY3N{8}iNGqIQ=BӪGsb9uT2bJ4j֮OM{,ׯS6mڪHR57(YKr{[[Vj+Xt6.Y㬅}t-ď֕9豁e\:+AE/9ʹfa&W*Ztw>?nPǘ y}ׅ={ag9WcS=cw=xF[jIUtyY6_e!_k>!8{%RCM-abQHq `<fZ#܇m"5\͸^`L-H$s:W${HwVµdsrY#Ǜe#iea7Sg~zHMC䝉v]ǨW. hK>q:wa&r[a n(_'JESՆhvI)|hBFkZ+zU7FJ;閫jp wl1y1&s;nT)0V/3pjٷؓ-]g&kfǂ?- BM*/wͱ~qo7{uR6,#F4c*íVe5evYՍq!{wgG1"L_{ 褗n骃O袿.yͲzĶsaKt‡7/4}3S=so}<ݗAs4޿}O߿_8@at|r!L x'%O(%dAO~a<u{ cghχ71~$ф IhZ|k"?xlyG 9G<6>̍"H(Ac/Gё mq[l X/7bP 1DqYĤhi|$%(HA2"yF#I.sɹy}x–a+x;zπKwJ13;OJvO4;IDgi>|g# 8ON.Og>jNE:?is~vnU&2գ ]qMb7-'ϡE{xAItp:+` Wxl6$7(?"WH@ [5Ъ j+Fy@s2_~=F&A <he.c]dM,3t{#/{}hՇ>Q"51vKN^}L o3yg7Jo[%+7maRpѭe(.2rmiL+%@ILc1nq]) S 7pw4•udwה@6wk3e>(|Wdҷug_PJ1zWdDnW~57|$=IH Pe `stp  @H0 @@}PxptwVH̄ < X~t6}WY6A<(W=ˤIxtHzktS00 wW]w ِW*QZЅQ &'P xVpcߦ$VvK(d}t$dh}H˃a({cvpf6@7`}4=@ h^ G9xXo󘉚Ovt'ԉԈON=^v @~x`*(p$ @# hCg]9^HJDtce|a(h==gR9Hhb0u5 PАIxZbb j8#i)*I'gpˤ@w{@vH>כ@ &d5eC7~)}ۗgs6 H@ts# ㋱HD % uYʔoK}ygIh=j+Cu؛pv=*k ɐCЛ@ ydk(nZ*iwYo@}Y^ӛEg~@o==0N4>}WX]T`1hv e^nO` c Ѩ<^VP]Ґbd H:h2`Mg{}Vi\tJ)| c=~v(󦽗` 6.,|֬@WW\ EXG|ߠ XZ d\RL`T\yjs}#c <9Z6Ђ]вq^<-0O>% -Ɣx&rԤqMr$Ktj%J{S"D>GplN)ʵq3' ` }Ŭ6U㣏<|<9h}`0 dɜѰ*Ϭ:x|W j `j m }\nWJմ &\$ޮ_`uSZ j֑MQVW+ɒhFgv(K >xH {- {>N38 ZS@+COxfMBO @ |sDEJO E[({HPIgH#; ^H/ihn厇]/Ej?Sog]L`:o2oM>}=6ް֧UTצ_O~ې Πݻ Sـ^p̯/Yӟ?UOoo?OO?˟M@ :s … 6DСā 1|pbDF3um^x͟G^}౷?ǎ>Ro{/>B@/AdA1$l,B '*p8 #D 1 E$DSBC4ѳMOqwlEDHQ1R!2JI2n3L1!dM `Rh?3O=۫O-P?i+3@PDE4HEM tQKŔI?J=R5T74TIEkFQtTUk}SW[ YRSbh/"l[/ 7ZrɍVYjwt 7^y祷^{7_}p_8`&y58a^_ba3#݊ݽ/nX6[rәrcOF9eWfe_9fgޏAYkg:h&h{df8 yE%jj:kk;l&lF;mfm߆;ninn푧ox'xG>{gy矇>K>z]y{?|'|mggy߇?~秿?t`8@D`ȼ6Ё`Ƿ@ VЂ`5AJaAЄ'UBj/a eІauЇ?8D"FGD"D&6Q~Ib{D*VъǓbع+vы_\(E0ьg ՘D4э],q:p qcyXc AFBq$>`G~D` HAVsd&eHEN DH9q;@(SJY҇e,;I>Ѡ11 xF1qJ"G2FTx+U(KjVӁD y64p ȏ~ȃ@ ~C礆;`e4BkӟC9ʏ}Ñ判;` CPXN4CBӤ' _@ߡx'?$9 sG5x cȝeX&IR6yMtu/G]*iTRVf|pG؜OSlAE,d-胨ȩH϶6ֱ4|k"9VU` z` ܜ04C bXֶplR##A0zD%ɹ+U B6׹c9Ucz<`Xtc`Bn:Dsz#].c^֚z[_Dш*ZPiuW:WFZ %(ހ(aw; m^ܙ!<1*'b 7N/qes7yus?za:GGzҕώLg=\[S.tw_{>v]PG{վvL+Nٽalv|?x+@ 0| ~|%xS-yl};ƗG=7}e?{K*oݧ<۱^G~|/?wF?}=v֛}wywE'c??W;$@4s5dt+@C{ | ]CS@4DdA˾K4L:@ "4Bـ!t'B3)AI1(-B*7[BlB.43/TC,7V+A495C |A,D2:|a]ȅ\1(? DBϢGS;94:tXNN EDO􂡂TLc'Op`'hX#h C֋{`5_ F`Fa1\8R\P;u)(E/.U ܽnjP%EX;'jE 7Կ8d9wFftR E\-pƱcOk =$}ЃAJ#[|zI,ǴSB=A^|e,bDO tG{|}D=v,ai0$.~xG0e8aw@sHaڇth t؅ܺG8<{IA8Cv& DPuIۇ4œLɷHv%!B{h)~#zs$GЅR;xscǴy8'JʭLǮ9R&ISI$IՌ3Hm)h0J~;$W<ʄ$j} 8Dixh*‡+j@\ĘcKO˕*hF~(KOG[Kd3P̬Vz<#OМ܇gxhxäªOڄ#0txޱNB7H&ș%́g0*gr8y<ρpD@j~Ra@E~/_}%?IdҳsM0bsqZ9>4 8DB(;jɊwp,~8JrPKD TǗP(th5P4ϕۆ0xG4Nwl%t`h%NT}OmN:]k@Q@USx#`ᤆ;M͉#̴1؆rS71ʼn<>KWYu9{yFawmD %(yM)v9taa] P2И%xVydEMbBM^}\&^/Qf='-c*c)bbMXe9Q/E> OԪELԢ0fB(;LV>@Џ9B~})F@<=D> n-=WfT&YMN7.e/e0gm9ǿaW4 rzYOK.;e

./N=aCYk=IMu%ѾudeTGOgop\r.fY]ܖcg"*=M]~Lh`B+OOLm9wN-(T,N4he~6=-bZNwT/HFdi{⢍fwhlނc`zY2"eF08bbcw9̍Ti'F\6(2k)VTzi6.ZoVe,&{psFya(`lޅa@&]d kYs҆m;}޺va>>V|ǾaV= XZB:; Whu nRNNLs^Ccn ՉaUmUh)G`1?(FP? Q+Tmb榅; P`0 x@0Qr> 0 J PGH10pԁTY NjA( RXXP 7RU(p0he8J @4UR%f=ðB!spna-rR@r'(`G_gqn '.3Gu(΁?Gt)J&.hˇuyu\]]_^u`u\'v_d7dvfe/cWviovaGhwije7)knk_/O'Trテ0RHuY HUα$ӉSTO@ju@wlAOnrR''RRxxxxy'yxOyy?oyyy'7Gzxz~qPר .wnRpSSYH7>9Uppsn%{ zG/zG|JO|ȄL/|'|x7|ȗxǏ'}'GW!}/}|Oz|z"(xUY@(0(QZ0_ Y(F@؜To, '虋y7}oow}o/w?}?Wه~X`?2L C 4qB76H"B%bʼn5zT1Õ)[4ď*+РBaJ E;@T(TPHh2@hTv% "--{(޼z@/-ly3nXd'SY#H3B9=ȗA_5KήE#-F[k̘k\{Ny޳gܭunn=/J9a`$`䳳o/ul~dɕGCezt!h ffYH j _u`Mwӈ%Y7qAb#Q[Bx_=`ѧ}E.6U[qxFM mUb΁(ܕL(i fas&^09gf hۏ}'y!@{J@ؐDY$J. !I\n儓JOgvseh)r.\o̹ bα"Jkͪb!1(i Ԡd-h~N֪m6mʩAnbj(3+ԭK㖻˜ﭼi> ?0 w @Pqv!aר'qk$oeut"RB!yj(9;Π6yY9HOM;c׬KL+1~Նlf҉4v% Cܚf 02RVX"moYAO+8`7.KA. K#Zwc^s+`+:"͑藺٦lz NL7Y7<`O R.TS|i)zb/)impvÿ!;2jڝ޶ENU )wQiQXQR(>@{ߋ\Ԯ-%|Pk`[$c\Fiqvx4~)p~X[,P=l*Vd|\2>n̈́YlXw!f ;ƠQ}'c=JpSdu CPO'## \9ŊQCHkf<#UpnJXXL}3K2ykedψ5Hac׼vJj5Fb5{" XY mjQѨŭm1y\; ½џgl'*_si rX/퉡t QHC4#5IAJR.uiIQRt/MMYSԦ>LOsP5l`BiP_ թt8)UpJys5íRd/keϛt7l=2n l@8`:kP*N!Z'CsG@b,!Y͚4aWQj& +Q5AP`9B05s]׾5-au'7x=%x-iS־6m+IޖdmJh>7ӭu;~HY7}6`738gg 83R6+h/0@Xɑ.S89}PCL_c>f?;}q]x?WO'yiQavR8x}amSO!z#B9a2C> z|l.|$;'Mq=3~PdwG @ ~C~![;@=CeAQ<@}% =Rf`]%_)&(E0%?TB &߱`|Ҡ]I[@~5~A>4@[;@T;a|>AJ`eH ` =&?lwCGJI^:@}GYx bT,ʢI@">A>Z&1&p!#`I"5P@0h"a5A))Xx'a!aN.;+ d50.AbC @a-"C4`2̀@?GX":8d%@A " ?$AdC@F$ 30$HA=G5@T V 4?\,/ LI *C@>*dL_Ij%GQ&^$H@4%e$T  "pBB@zFr$'3=>@C5fm"E1L9`Ӆ ".D) x>!@F">8@b-ޠ1D@=k@c;!gN 9L.J@q:ln¦a`#dXC' ` .5dd0A{"Cmަ<'o!H@#d*>.vwv >ܧkB5d. Tg0 fA.F[2~;(${"q 9. `Z aJaZpp#:8" Lb5c-~=4# .g [a"gF 6U$8@9(p$&V z b̡2"!&ĩa~:"eL>cP^jB  F.~@N> .*!f4着a!c=0Ze^JGx) ?:8C0:+0,AlaCAD;@ `)e"g~<+5'Q4XYrߐ`& A~*D3ơӆ@`|g|a`0b9b6HG~!(x@r&ݞ"A0`ǚ~&n@L(.p.nr -RF2.#>H|&A:؆Ӕ%^ۂ\emv~)"o&#7o7› ~Cv1F6% /7+꡿C7t=0a> 79$=<[>6"&c.d C7e2 ?@ʮabm/F{zC +A+jmѡiݚ$C20 C@q^pBv(.$!h 2jfmrj{> zibmj2ί ^r1r"CD>.bi.?.3&` XFr!11ϱ1{҇p:+wB&cb&x֢ :1(~,1<>Ă>@:{gN.@BkF@c֢ `1+3$N*6>@.?3AmkE`GvhI/bN7DJoLzD7O":/07w38\؍|s"-DhH6z`ް 6>u/6"ȧl'0 {_dZLF3;Ё|N4i$(*aG""u.6ADRe~lC 'l*6bch)ueuA]!S[wz=/Z:wP>|d8|C}[=|:7e7>zw}KGP7YG(8Zu[ۉ縎Cc?\c^898 ⸑75?a_Gǹ1v 99k9đW99mG |31 }RbE0vU(8- Z@A,؞\0^(B tV-4B3)96B pO)4B Lv#z)99t, * @-l:-@zLzQ(EW(-$(X d:!Bs?EE#-愒R`,H{<,d]|{_*PB7YXp{PE V0*< ,z;[T|Pl<,`Y*|x0@ (3py(?c@܀U@+; FȂBG|)*|BU t@sEc*(¢R*Լ7B+xRLE,*@BzƏA+ΫY4zvOhG:7:-0@A+xPCRt_@V ## ##3BDZY d~P4S*ĂDSޟ@B+)=04| 8ԏU,=S 8; @ RE\{@800ұш Z E Q*UjВAShH 2:5ՊQ iUZ18a՟G&UtN D:jUyWfժU[׮;lYgѦUm[oƕ;n]w;iߤJhEd=(R)91"Wgvjxvח{?> ㅿ`~:u&_@4@. t`A N1A V/A%B-t aCΰT!r09DRäD]ΈF,&0B\v!K<ڢ7C1e4јr~=ġݪG8RljCh.7pEcTxG8m?ѐHdd%1IKʈ@"J?6qSs )R:̉!!)2td*XHOsgC&La|In%*c*\rq*9KVӐL+qyJBzQD$5Nut;OyΓ'N%hQNE1щ>GARi%5IQRT-uKaS5MqSʔ=OSE5PT.UGuSUUUY6Un]=*VVze5Y- SmE[W^-m]:WhL֥}5a՗ e%c=XN(Ɓ:L /0GXDu`b 3N`2#T8 {Moz^gi |,=α~ֹX9y,,԰Q۩c=۹{ކTu{vYrCxB<I;N #>Yt-oU׼_N"@0+zP| Tlx% G?anQ G:c c F?x[d~#9A}dO.-'6 Q̒l܀ 8񈧢b;C@/Xoe܂?aPǡa`٭cxh9Z{L˜jUUc mxzbB9Q4: n@R 02 cz^v(z CE#>A<#\pju۬7oT:u1d,Pyû;^x@]t{$"<MA Y 0ay{)sы#s+ 8'K얼 6mQMWhVe7{QEl^v#& |"?֡RBAQP}( 1zBT1 z47\$Zrxgc^XwpG ~@ÿHְQacQ3}] ~1[$Wf [ar豟}E2C>[?8lwʹ;f16K2j=aHNHn2m>/̴!P+n  .0~*f0BNBB ~Lmmb\."j* ` N_<@a v[0"b @4pe~m0 0q®C.l`o Ao 0 jߐp QQ %!j1-q*=q81ID}UPcjaq\q[*mh1?yL1q16Iѽtq1џ'ї k1bqY-Qb1ɪjQ Ҩ 2! Q!!r"UJ%""5Dq[1"72$5*H+,j[p L 2Q$mZm؀j ,n*ENk&R9jl.2)&2̡P*B ź-)a | ؀a0Ar ʢ.E@|l*2`o&1aᢁȘk+.Q3DEA tA$5!(Y),2m6 8!AN.A@ $R m|-Ss<A.@;M<1w4!P`!(j4Һ`pҬAmA@9BY0R\uJ[>rv;vTwwwxGTxuxExsySyiyygzSz7{W5.-÷)|7Q&ח}W$ߗlw#W~JWX# t !*vX!8}]"X;j_r76/? r@sz@gANu NK`XX]=8 :x*&L rYoR)3&?[ ,)8`1̃ 8bt b< a"ZT*%W\sҡ!OC+, Ѧ$7ሕWyHoBN-F`Cvr=5PHxMyQ5_J,ؘra)7h9ᑑ ,`aE4DzA2, *0rXhފ+J-O TKhl;lN;^LnmYm*mո" eKobދooN pKpT p0 ? 1 Oo_&ӋqǸq~Lr%r*r. s2Ls6ߌs0sϓ t>MWAlJ/]NtRtNuYuZ E]\fkMvڋͶj-Vr+ wP͍v=Q~wMxǂPGx\.91:nlZA5(b y*f0>ДkC;?8b@ uC Bf CI#ں=O>r옌l `b윐;?qh">X߷ [9;=?YއD̰-$ R M ± pJā.a! G&.h<΀G0:i 䑌LV:p\<Y4Ρ +#T {\ℿGFq$)h?#P$ʇ?=Vb0 ~4$4E7zC7(io >WV+'=;pb8}sJ b A2; ׻%PZ#w CFOnRFS?H@=qt]J !k "^}:]4m6|p(?b GPMjF!Q.2 aXU0;xb  G0j"Z͡N#}5|)-k!Ta5\bS1}rN+wM+gN+M*FTc5$Js"e`fvb2ӊ _Hr~Q0QEqwraS]4  A!nhawCn|.*Z! $i5Ё)\5f耜^Ny0ǁ|؈!w $ i*0Q`}EG`kg a52:E t b،44;nJ1CgUda3 0y Pbv!^]N l@ &2 { (A4E,F(* )rXLtO~) 7=PSBEXpBUi2v^J X#Hn#?{n€_emY Wks";!x Ȁ jh/X-H+j1 "H1$j&x(Hj*81,؂.00i284Hi:;ȃ=?2f3Vsքu2TXrQZօ2dXrߕjՆ#2tVqskg*|؇3$?3%HSLIF1COyLФA'n1lh(ǤPLp`7:Rp`0 &0 @guÐ_Zv4ec> a=L[ VbX$ ^UoKh'ЉeQ-`ReV ` ^ HB>(`Q:T>~GPdEN=!gPaYDClbY XQ;EhyH`tD0a"@Bc>,y:849dTM M TyU(cH)ʕP2TxWdF?e D @ T]d@pe5֔v3pP  @P?5;$L^DuS @Jf=T^5;I6:]Ll"b3̄D:&0eM;`VNlx3p7pE1WY:8 UQ`3[RPD?,`E=t9IXu 6FkIP?K*3+ ٠ G;ʡM'd1 ٠@l:R0tt*:Ң{(sزӣ<I3SFzIJӤLP3ygPxs`eAoa7SoS P9-&h CQ( ln*70ea y6p6qo <);MQqs1:8PQ5`qr3eTQr,!vu )0(~sm4Ga@ pR#0tyaStd,`LQݱqJ fX{$u1jJ)pj5y8|t"@ uG 6 0~' 0&"Z$J 1P"n)*f3Bo0 uvaq7=0 `b ua//в/5'pB*Q ZwtiF0bw7&гxBHzjGp gݡv2٧a*~W~?qG ѳ |t xji 6~,p#Q`z5QjzmY gXl6~R|քUZ,6[4țK7̫%λЛ%һ4[[4{5ګ753AHk狾7#CỾ&Ӿ=1X*0iT Ո;B@ 5` $?9n(\4dFU \zsS94VVĒĺ<Iɥ&BPBlY"t]:7"_,0)<| {;ٕE`>.0 V!dU`B ޹nq o{C?YI #P e]kP?;5<#φB7š Cpp0SLpt@%^ְp"@<w̜ĵU^t M u`HRDBUk##+" ?/;BESIUS,E[К L}j#< -sl /i i{B $Bb@?? r{@{ ̠r q`e D\)E[&8.s06]a3V@p Z`F a ;$ge%P`wn|=0d<0Gl2`QID3^s;t}j0l[ך=ZB@wsP¢H#Pqۅ}gDMR2ނXrS޽w2]rO2TȒ̢_K!Lf ੘f w*&~Sq̢c.ʒ[q1 G 5,{l㟊S0. ֊ʦc  Y0b0 7^KW[.xH> t= $bgb0( 0 {# b>淒J zPziQzKP P O{AP #pGPSQWzyn*UY$`2sK[ n 0AtB*s^&WE{`z^#fa0(uqB w#spP 툒-$hs1Qm->;%._S?8/ _ V_-^/#o /#k')3$",? .0 246b?/ =/CE/e2BKMwvQ6@"6 Y_2 ^_B=P P πdf7p !,|X-$>5! '+->631,'''(((')'6669996??/&/,AN[gw.Q>y/p'*L%$a%5m/TB2IN*MrTqAMW_K('hvtt/d'%p3%EBB^@U-UQJ6vKoI)_X!EEELLMZZZVXVQRPILnRltmJIpjSzyzjljd[f&&;<:%(MXKcgq'O"S>Z9g.s ~C^CiRsLtpxYY*9(Aae0!69:5OordXZJipsY~ ./???&$BLRP%e/DUir a!x,YpLzopH\WE?WNaYjiRR(.r4oSqm͔7ϒ6*ЗMעV٥g֯tSwșh.0w҂䕼ⱶ̏δ̵ƛˉЬӵη伄⛙ýǕ˭ʌʗˌԍԗҘ٦ԯK7O*\ϟ #lHĈ/jqÌCDqDM㨲˗0cʜIK6UlSgJ(w8O{ǴP=:OJjW[bZWU3˕lѱ]M ׻w϶ ܿXjՋv`|\0bŅ>x⽉NL1ƚ' LXoeW-K5Zn]cV\:lKNiVq?UkţTr/[\8u]۩{֩wzku_LɜT' 9ϙv"g(cy8|>מn)jڅdr|Ũ*학qfV y+veBG* #xpȪ +*+G뭓:k&Vg.dR;ᎉ.zˮcF*N쎪J:^}ʳnuYQ9·v {mJbܰ[lsS/|#7n,ɖ1 ˼|\<0ge/AsI:E3/}JtYkl`7(2D^sM2y:;<] 7^|뙂OD_\2b暍?xx 9h:RWf||%\ڍ'衫>\戯Zu^t|drNαnwn-?l<(h_ﭵ2?>F5Y' G@}[ė6q{z#?A0>,v -\JR1 f*4C ްFa%N!8E*FхULbC-0 QؽQcٷqg`=85Vs=q#$! O5& d KHC #iDZL#[L*ґd$!>I҇tduBNbd%(8ZrE!qIL򉲜%%D% ,WYLOLgV".0iIX60K8MV(2v~/ IFIr IFCzr\$O2ҠCoRD(mLӊRLe5_kN5&YQ4pؼ+zKT!@ܧvYQg3`D':?揂Sݹ1,G?QTRR$2)%LaJT g! UNPS}E5:U3p*3a#RՅ\^˼5u[3Z،:*UUTԄ7XPk٨WX[ê>;}JvNeFq Z+lC;8um*$-*າ${X9zӳ3Ԣ {r-7kRK”nLV}' D㊷# I yH4)Ȣ8  7%%WݟQ 0~t X#/: Mh@~{:Tu]HJjayGb~W'/*Y$r@)Tr$*~/M ڏdB)E6pmZ:'tl:׋.9ճczh7)g΀C|R<ԗZ(E2 " XI 8:f򮸧0#eʈ[_"y-aQu [~kOv5<`1N4J Q"'FuB]wbXqRԡU"6*iEֻ _FRz3̓94?豍{$چZk"w/o;hR-!X(a[ 0E+}[܍H`wiѥÏzԓs1@!  1 o~ HP0F~GPp9s hX# h 4WB+y_ghi+}fցqGS#q˥Kp+ƀl|yw` ސ ؀ Yȅabnb'y Mc 0 z ̰yc4z)jI ]05B4\yyTDB'`H~c @ɐP)%U4rG{dQ|VL(|*eR  @0 p 0D #`| ʅpJˆ^xoDRep IߕIX]no8A}W?prUdJ eU 5dwAWq+ A$i6ޠ /0_/ 0~yyoHyyT8yHy0zeIz'tRpO$ėMi=oLAqχMn'h? Gs@XBLyfn2XlOVVbFv aY}P # C0B0H0Nb@B @$c`BP @Fdb׃U7iƘ4 PBOœV{EAs49`OЉYi;hqJ69PfX9{bX8ac190o膓= y' 0z\@:2 lF~9O _" 5}?g喉 H)PIN`Ty?|2zhiSWԗKdP$  $d^ $ $ p c' 'bIIwYZ U6H=y׉#tt٠K9xvL4pW 8 (?P ڰЅ:ڠړAPƚ* KV1κJ\z]DȢ~鋔|}hwX=m,op g@ԠV YsJdV^ ~WrHpPBpB Aj MP{ MPJfK/2 +J Lsi'T=5}ZpT_4}ՉT+H`Q`qp NxZ0C&W;˴򸺾Ȩ5BP @jhoʸ "%H SwquMܰРo܀j? ˫]j+i˅J mުz| ܠ ڡ\ |I8; P:䭛UW)}M`jڲTZzHH aO[*vdFLXSPs0BPMP( Zy% ]숗ӛwX×MBl# Q0 ÛKMt PƩu8гZ M`ۓ 2 9P Pzb i,yZyPȼJ9z lZ)UBNx]七<+@GBr }ԛ ē 9۲Դܓ안:d'L)uJYx@@м'  n: [@p @ҐļXUoLC\+d 5ƚP Cĩ 8ऴGK` : wе`ҕZj,LLZ[k ؖm  ӧpxn0 `J\0`jM@#,T^VtlwX7w)${i|ק .H M>p*Jj9 =Yoe, Ȁyx RLJP]@  j܋ڲĀ{ J%Џ"묟}[Y6hH]y%p @ A }j}MMO}](Tzpaao+h܀z & apؐ 2Fc t]Mǿ>UEbI)nHVkE Nu}6HYfFeي}탋hwNjTͫю:|}ڤU|TQR`F{]-ݮL=tc^B@uI~]TK!uCvq BF%Ene=[l=$ ޥ ,v >Ԯz[-.~g M뼞-FlvLTjMsvUt6F+[`Wmڏo7 N뵟C?p٫2EVH`R8nXQڭOha7}V{;غL.LRޝ7?ϟ/? d8DmKW۹y~$HР>E2$8oFLQI g-ʕ;ybQRٌŖ-iJ=mԉSSE+VWUmسTi#—%&ԧ\|}PСlwI2T;*Á{9Mjtu69/f7ffo^<ML36{?n(}o7f8ȺPh^Ѿʫg.Va;BW~EB̭~u"*0AE*#píyQK Ks.$>.2tȸԚ1Dq{EBERsD%̋{/f㑺1ߤD*tT$ÌG1Q:D B<԰2&y;BKTS!!{B(Iϱ25 *RQA"T-NKIƘkn5[ɕl"{+dܕ]yWaUUeŕd-X]]V_%$oXdEVXd5o`e7:=wl6sͥe畗Wku-v}6܀6Zs7d\am7~ nXZf ؇5&6ێsu凷URr N܃ W/z jQXi1F׼f7ЇFthF+:Џt%=iJWҗr\hMwӟuiRԧFuUgPYԯueUַuuVzֿvkbFvlf7;Ɇv=mjv]mnw߆;wYFw nvԆ<1tyVw}w^5<1+ɽo7|x%w̛"9N0>uy==qC7ǹqc8u GGsty}D?<1a]|^/} ]?r=!lߏhp@P|2 +>@+;Ӂ <3@Xvē磀۰j>>؅jjhT2KzKk4?_=hh8*3_3@C@AX{vAA0tgBX{M -T@C; 4 }@tȺ4$$%i؀`'`iC2Z{('|B<0<̀/0R, CLK,|9C sjPe0jYX_ > ü I HӀ\аjP>] v lㆲF D3G;Dq}yd7whx 3ڃ{$k9PăT #<Ì$D?-|KA>Pj 00Lp糀T~D+sx tx q{~Xsm ~$aȿ^iR~'{cds I?0>ɇ$21:v`NDN$ω|LB0C.`0kXlkx5EIO0O 4|C04Ls xh? ¡{Js3XDC^M|21$wDPK1E XL 2:۰ϫ +>+%.m2\)A$,, ˙D7PKEku%@$[B~($DBfHR8S0 0rЇG%c&lB-BAkɍL COhBx{K/5 pHRp|\[=>K7Ü԰\`\9w;%ѫqsJt$d<$K2,|($b@MN]QT>S]S1H U"ş `R,0k8Kj&h1<\@&Ej0 S4hUle o c9uʹV;pȇ@]6Jr(iXV$ X ~M7E"m 3҃ Hվ2mPj9mA>C> C|>Yx4 #C|'Jg==Z~|wQ'D7%U,R%ԅC#-XTc]cd/ȅep Y#TBc,5{ۺSCXI[^} )ҔVDQfZD8EUSΒVPݟ΋10|Wj {̐M5VdmWMF +WI Ov;=x+Pcݱuc4 E[)m@L12,[[d45vh2 b$E0P|` aoPC@< +3I0$fc{S]SmS2ƫ 4]{l}> c>さśtC.v+_180B4eDSS X<"a 9˴vxjO|> }øAZ~>l^eU5vSGNΉ+c3j6P5fnKVI0pɸ5>0O+h%.Ϗ`*fR O e7D68[($kPFv芖~2hhhfhxh>$h^iniF陎hh^9EFStB]\([k\UF/68z@Yikv2ih6Nkvk鉆khi6kvDK^md9z(s9fȎ~>ˆ4{蘆26l$6l셆k^3öm9ŊťqX9#D![m~khVƲlfhn녮inn2~Afָ mqifFnoi^n^nnnopnMCbykk: 38B4*K7sYu38pO2?qWCq38O_k'\ ^qNS#$2o3W#qoO]q) #292#g3%)&kV3gs7u ls:w<:?=s<_tD?;KtFItMsHJuEG=SGwxt;Z6u9136p-Xmb 7s2/`%''s`igvYvhmpr7sGtWugvp4h6qzw{|}wW5w~'7wwPoswxEcxu>y'GWe6wy~|G2OdmӃz~omF 7Gz๣zk9oDor7ܴʊ M%hz_oW{o{gW9w38ݮO{{o{_A|'|vG3Vp ο||'pWgwׇؗ٧ڷw|mGw(oD'7GW7|އ~fFc~y-x0GWg_}}vk~pwy,h „ 2d!Ĉ!jFM(1>hG,i$ʔ3\Pe˘232i&Μ:w'РB-jAsw"c{6)}ZrpfƗ`"-k,ڴjײm붨P+Mw*X:1W @ 1c12n1ر`Rl2̚7׌`Ō֯=J3F!4N߳ \1pCg`pI cy$Kl:ڷo/; #\|NostR$/Rs@\rpN?sZ'~Ag,u- Zx!j!z!!8"ِx"&"-"1vwPSK? C r@/t4sյAÁ8Ls(=ЀX) UEx&m&q9'uy'y'}' :{/5P'JhA]{M'04]% {K+>Ȱ@eʪdhƤ&++ 1QA9U&!qQpk}#= ;,,@ 0>:+&9:,{/&%5+r *PnF;\4SsJ6R.#tҴ621Ӽ@~:=`lcܫ~ D&_!2r`_a)J!dM~pWa^h^ |{`pď & &Btok'N:%UYP~0L pY]NZH\0&a ~"${CoeER%,1b-C8?LJb&!$-z3)SYTJT-4`a.&GD1/ +wB6e3tI:Њ?x:hdf =`̀ i` W/@=nK$F 4eUːY0sf?835IU?AНUPCK0 bΝ9_rp ^g4>9Ѓ.V!eU"sp- $0u<1hF:hn4`nv;V*ZE] P!"0jS "b0boXe.@*̮?Ou.x=,zsճ{G"sdt' 0 b*;,!=! U^!_Gܚeٖ*tZX + ^*lY%` *y٣ySe߬ P7P?(R2l6p63 0C:t_ .?9t2 p6u:`&9Ղ>C :>C:,b2.#3.J%ADb$Z0U%LD@/ɄГaN ܬiP&9̚ 0R ̚?t8 6)> /># 8b; A3fFn$=cYؚD_\t:ބ:C]Bìm@08>#A`B6B<2H); .PZ-NFA )6A6\7p$YFzLGeˉKbUMd'$]BSΚMB 0A3eU P `A `A"AR eN TX@8Ha(ifeɰeHfZKPJ\I Q^A2$8Pa% 6eWTR&B^1e *?dw~&ɸfHˉm~EP\ -{f)'PMh%>x*t`r%WsVF'fʤuR&NxVx yY{bQzjc>Hd:$"=/,4@Z%%$59dqL>ge47H^(Feh96LЃ@HaŖ;$ uaO}.ae(b2? NndfC<L'~nf`a]I.Qinx)I**zv(4^| bC7tm_ړ[ zR± )*">ރEK˭rhSc#j+ҪJ$bj*Lh kn+FiPԘv Kꑂ Y*J9>bjdŧ]DLvY~j*d )l6*l/Q*6b꽚k`2DȎ2,>˾,Ƭˢ֬ˮ,,ά0:Z,-F@8,Ӳ,l͞ D dNɆߎJDϸڪ [F,bLd``-΃^JėfĂ`@^\v\cн:WdcI n.N0U,m(]rjlnɲޅ/I oyn%No. =Y7{9?=?`qI:oȠI>M6ooΝCX*o6|~ ^/baeռ@8 P'5T>ϛ)i)>TC!a@/cW1pL8;P ;DP0 lM A ; &VL1C+{pM {0_̰rA8L::78%:2 ? !tXT9< 4 KXC-I>T`@5l7$B/X0F(l {LGtH:HC:C]pM;IC؁?SB@r(h=xC<'A42pi81I1\PSiXuA(022@@C"&/9A3\7mZV$- 61fq7A{4L1@0C |6v?` (6ɗ0s yI$ȗGRJq[i`z˳8yj';@iہ+9>e8K3H{\ l/LA$ CkZ80>& /@sD @55߶}3>a0\}0q^+MdiAK yZ_p;g6o4/k :z'0_zKfY ;Mgq0{5k7yS¿+Zs'%73qzH+3>A }BN]Brs/{AJ<7I5@;Қ8 += r`: 0Aa|7{}2#{ {z $“;siP LT;PA7 wGP ;@9l84u>hC:p7E~r_0 T0kqŸF?Л<);1{sO;7zq>dt&Ҋ6#CN 8$ kg;rX Ɛ'/In-~]Bܳ!I]0'/+&Z㎭ۖweyL/CT:POJ&[>~e֜AgϟAAjVIukׯaǖ= ྽wo 6KhO*Cį,oH:óڼi>N9KP%0.b9 L$+~}׿?magFjahy'xj*7g@~>!4Va4JXIJ ݢǝœb`cGJhyB``5愇:T(TUXN[mIFiE]~qonŴ7><dhX}}G-\MI/YY׏p _~ca1 ?ǡ͑OܷEo]驯?~O hۄ|FRNΝU_o;}oq| ȵ5~A n\h.5 0HiD-d "Æ-`3 }쐇=D!E4D%.чb3D)NUD {B{L>"!q4ƀa2t#h VaG=}HAppTA###@B@a%hFMJ7st^s8HQ4)Q!S 0nj\`w%vٰ7̘*Le.%+K-`i@"vKmf1LqN$9)Eh"66My ?!bj8zmpÜ69zxCCn$th9!PE8Б\|#%:5xt`CfP[%= Vz-!FC/<ćxȳbDOѕ`&xħ AvȌCcQV4@/aSX`ՇXju+T:Arp^$ c "> Nv(eeṀQFiXP;XnS+6*c}9%#dAR¼&0nw:Ӌ.com^\s#h+M* 9AA؁sXG0y|7?Z^}hFY,Y ÉH֨},`n7Iyzw/>@XvhS2};V  d@6K̸>+90owVP!؄M\e5^PSALef`Y.+`b' p^ ؁dE$!psQ ( Vq-O@c؆:blaCA/ց:VEaUO vu Gݔ+,Pc#e~q_B\@85=yxe`d*0 6~p$q0,PF.8^ |"22 mn!V\#0ƈ|e$@ph ?U %Vbkvy(W#5;7۽w\WAD>{0<|,j@ĔoReJ1!^v *&[|hI/=l?R\SCOPI1-wوGqCcez8k[v>Q9x G r14w}7+Β؞2eRjHw13lCx<-[bXϋhwe"#YՇNw^oL |@ 9# !Gc< ^e)up AJE1F׎(J=TlƣP`l&r!& V lc 4:Vs2PҬp<Ԡ@>.F$,RQ` }HE`R-"+c.rj2 & U/!r/g6F%7 K+((dAҡa $#輶!i+lJ-Ze" /Ňց2w.55,fa4/S!a*S:Ӈ% X+Ls|5399,8[i8A7bJ;9`2aciг> <rl#a7?@a#TN@:#a@CA aA=c6kS0>6=4DO ?݉PP PE]V6&A@s7B &3x`a`!CT &AGyAyD') \EoB-3`Iea: (DtLɴLEDWj|x@dE\@FoFoj|cMi@ T `" TQaB_&T*U 4QaJ@Aj:Kgh73CUa5VME5aBNNocW} ^A)uIyf73 TXY@ ,"`,!p Id@Md@4GՠJ-FXc@3Ԡ" N?A 4~[ UCc Lqeՙ@`֔h54@ 7z6O#F-aE}u7@3S@*@aeSUc;@JuUNcCHdtj3PZ@ b?gAХƒj6kKaGb7XE4X#FcWpjHUTTFV@PS'aG ?wR umU>cfQtnϖzVYhDWd &aPkxc~FGkA7tEwtyk4`XwJO]aN`\9h47"\@ ^_WB6ekv Ja| l]!ww7NPi NP6<J@^K5^5i/LI}7~ItRucqub6&6fF{FTs^sfAg  `@v@SvpTlg5adnWyOA &W@: svXq8~GNn^7dPAwty`fuNЀMzN)*!*& *!a@grEvBZJ}VFbvXrEaIyuxAE'!{uRyM[E94c[7HMQje'T|3V7bR'֕[ioYtؕZ7TH_xkw`>thVXA3{E\yEX?o >Qp_UnϾvr`[XtgԘu5G߹AfYA&GA@FeVA}5w&!8Hrz%@=u@Ea4K;BUlJm:z KBOz5sb͡E}IaF!+dƥ` c~a0[.!3B#818"A",@&4ÌaðB{*@!{r-AUT}t?eȪ9%| Mz6FV`ECٺ=(>&.bG#:[:4oLCu}e44X[*ށ 9óMcAzQ>p=Z:h ;+[?Bzl,!D< ƣ;}%Ui[k5%QɆdnפC=A.d[%a%>D`>%)6 P }[%!^\`!v4!.oDD L4wZ6aoĽ;"b"ltnљMX@!1 JMChN@HAeBZ<`&"<+*Ô DdN<+:Рiw/lM}| 4RqX$*dυbԢExa""B`][) 15>P?­B +}%?2@JH|yމuC%I2 ڽ衃C`%ߧæ%9Lcءc a V ͑D)bc"($Gc덚!_Re{ɓsmHۃs @k: wf"؀K. ;icH?@D 9*@@)& Z"\;>\ +>O~*1@1AhV<kE9Õ];fEC;c;d@=td!=c9d*FQq!J Gؾp| a nj{ 9 8A@ph{=!ؑpu|XY{c@q "#9aN~2Xaّ'(3nlA`5}(e6(㍁#YGj xlV,}E C{(8B4 )% $@K\+_ "#82Zr*Q^3P( WD >$ae0 >WVZx †{hF7';f XlLp#jJ3z|*B8h}LbKj ~uEGy{s;2q^dtq|5gLHÇyDt#GRR"(P=8QA 7ͩ^͎#Œ;p= KpFxꏋ1D sz{;?Y\9p;5E8[Fy6cG z"8LVm4jU𸛮8xR>,[rU!L)F#zmw lxpvE^v|q|DH%*H1~i/q ;BT`9Tɼ#J0= xd#<sjdsEmnp~2wpVVovnhxW:" xr_$PP{qܵW ~C !8s D@:JP WE EsW4LT0gLf (/M aq C3p;! 0\Dv}@u[9Q8 % }@ 7@fxxEnbP#fR5v7'~ҀǀrWjPUvr0c0p; p4 4p\[0pqU@_t9u8 D@ 83Fg۠ U9N[c"HyЍS@H9:_#:;0oh'71V6h'V`hM1 A0@nMA6P aAnap'p z2YNc}i #yȓb!?Ў=!!hg+ A (o 6"y 7 xjoHG+Ynp0>ӓ8P b'9? ڐv:oi'X+z &PpKpYP p  ~BoҠ 6p r )Ø()*ALPZ?p+M w!&h p H@ ~=9 8H`#󎚈9Cՙj+*Q ` `v P& > 1p jGj 8.hG:j)t2gVjr @9xvrٗ6p XCjOE}꧉ npf3)sʏCX+[J ` P Y x8 po ȏ` W%d4ʫfff&oFyY &RxJA/ n6!~B 5qZOګj^#cnzӁ660 X 0': yk0(pDk'[2>c-G1+3[z7KO0ҦY߀1ِ J HKQ[6U+B0 `{C `CC m$  EжoDMhcK!Hxf )`ED$t02Q+Tk{?X;={P00p@I PI4I"yMj 00fI1ӀKu`sOlh*v AB{˹[>XK lKA?q*F)f ! [EU\`4aN !ax%$%htP`E0 T PPT"YC  9Sǚ@f뾼 KӃv% y(>^PtKFSQmZ {Z0 {PaNۿ_ ZkxPSeq0~F 5 ) 0 $pyQQ\\|(k| hTQ,Tų\=W 7`aŘšVMP \0(S(  0K V|} <0P]gPe@Q$ 6p ` y|4Ѷ|DP!h)D E3Ŵlѻ`? P,P FriF-iagl$M] \!) d+/rU F-P) PxQ]J E}kM: _^ ¡R!Yt+2{rr|wLJ r P\o* @MKQ=HP4q J]} Bhֲֵ}:n-^sSy UD |MJvMLP e)pU^ȋ\@uǫ `qT5 _4 ``%!\J , PB%WBnn# a kn)㓝M>{˶ JTjwܬ oqH !l[Ev&PHAgdC;%~lq.sNunwy:~ &`! ] H) оiኡ.,{ߦS .l^+Ӷk>r^N&>~4n^..n|c>nNv~zNA ž?O1Ϡ8# EZ8E8 g@H@9 3v8 79?qd[Weԉ!w}`+C4T Q*fqNsM=Y  4plK1+a qDfJ0SDG3uHOKo~_.p6Ho0m4T 0$$StUuMٴM.Gfz@m+@ܠ Ivh_p0@Pﭴ 90I/V85DSDzhqF{%TN0vpt`<P /O$E 75P P `sB9}1'BXE5nѣ>|s`!1P &!s & )#a3"N{;{NK_'u@Ŏ%[YcۖqΥ+~_s(N\8ؙ^?I%O\en5o֌-"3bBAq)^_~yƟB1M̥"E7 ZN[.ٕ>c0I%"EgkBj#+#NS^ g ?ap@ k-0.~ k`f*cB0 C"kq9!C!$.7y /tŹ*TpFk\3; nNKMg%\@G7.0)}YR @*@0 L."i¢A.('#vHڮ|J!/{Ƒl^!!`ݢ;`TCG RL3=GbD, ? xaq[1fJ D0'{(+BP+Bf6SYip'g駟if[pqyF6UĄ(D( t)zpb+> O\MRXJ8ԁ$x?!F2Pk̈=0Q;Q DBB\6|4~ DD)2*q .SHq~xb<Tq *Sp،C dee"aĚ@$† o Y~$aHx (eslSֳ12D#b=p0bF%I{̭oЖ!JqRx ?bRyfGLHY6d$zhcdGbth x zUdG>ԡst_ YG7#iQUփ-%\ NA1(E_UM.Z8(yQtHC_O %_QёƅA5e0Q]X#/ikSU5kh{[ܦE욢h@ Rxrum]@ T $"e@S~ F?8Znin{_W-'6cT+B,hsրczc+VacDҢ UtxL?N "0-1xm~}c yk8^*n߈_g* N, cۋ-mMcDVRiu=ETs^4-=rg@ȭeh5H9 `.H"H,^p ee@xl (Edg=9гua嘣; v:lHaِsnh)ъ:ķnî|hm~v^3APyaL/ֆF2#Dq4y \}ڶ=s &/AJP4'p/;9 zmh`< 7h4B4r۴/q`p3kvG 1@Il3BfO{~l8 q@qLcp7葎uԁ ?@> j[?sw@6~mٍq` =xy8lۄ~q yg!O`h>z:;os?jk˶| 'Hmk!^6R8Ж<o m!B{۶<Ak:Bms16A1N k3?>L뻱yϻ<-$= < #hÃ2#}: T@`jˇ:t >r}0gzH:0>j0~(Ɂ(BAEtU|N6N |0ѳȼ >v8-bP w@*` z 0xr(iE}pCbkwXԶGܻwox|Ds:D<ů|df0l{=CL? [ Et(D4DD mYȝ@%M`%{; f6ib@y;ʤĆ$/=!WCA Imp8q(i`W> dEe(6 >-ĄZ6"̤Q竊`W=ZXb|HJ ȅX& !8@5;hq[J@B36ܖ@$i DH8䃲KjqX6BA-OO,O; QEQe9@#hLI<ėIFi D@DK txThDd.BhBl0Nh;ke@C#P6u8A kI@|=v@%:D8QP @PAjѤYj¬{#,^E db$8Yōvă 7dJpJ7=9un|k4^ g=<@lsǫ3HFXWs5DE@D̶gIFi~B૶Zx~Ut}&ބ7)G =כUQKIQ>|m8׬@i$@,dv ^@ٔmҧmgY#Y&K}Lx_`N6}C{`86zHmakNti8P!gKr.iqhiii7:vଛ7i i.j>|^jj~jj#fj6jj骾vk.k:866k~k7ffS~_RioC6cxmӹmv84vp>5L=Ke("t4fccRX%Dh&k;n63cu"L@* 4^] Ę+%65+/$:p'AѮM*RyCmGv9l]066<vƓ~}!mz&bN>~N̆Ǡw$Ln0+8<#ftC#ۃ8Wܸqx(BZ7[o+prpq;**ѦQ* wHz/D-dG~P`}Gǔ=O݇;Ǔ.3ѣm:uHDWRŠ0Ύ΢Q6h/kFnsM'\LXs[i"!p#c8LuwreQj3I8:` ,a}J<3rqSp(m4wl6 1:7[cBXeν<85V6 n#Xt?_p wp$Σu( (vPi+ hr՞k^ۖ~A ~]p_ RЀȅ38xH3#xt$ցL^u PFv8`@_&g&;RR-:΢'ȅ@~* /;4&"kVB\Ԋ-_"M6 8HtSj]uRvȅO LĉLvQXeUVPO! l0L?p4'l\bmUQXG"KՙSRYKD<}XPNmpCID8%L&OɗNس7% Y ;$xJD@PR?Ѳ6ڐ3P>yI1b W7>N GhNH-JvH¯zϟBEF?YΈ1&zV֨fhy"YqJ 3OB%[,c((CO 48ב-" ;ZaQl88Ïs"HG/2J4C!hCkj|ꓟ2 88@ IÕ7! Txe(ajUJ U)i5izӯ5I)Wg964QAjh6ɨ_=Q&#eAX nG6B2 NHG7ѲJӫa,e'3VȮNhH>* 4e 6>`Ix n!)$Hr7 !)AP֣lԔle\VARl((TΚrk H'LB8#b:CmrM &I7Nz.O#pS?A6J3vf$;Y9pkPuv1_|z eƠ ԙw@/cG;I|<0 e4=z}."~Ls -1U(:P]#ϸ9E)KaJS5RIUbի`%=jUXG: w@s;^7w;7ѽjo#|ZT"XED*x$4T>a/fZrUzEֺW4YI*:*O^q0y?E(֋9gaOI.r ^9әC=MNyӫStUZߺLn;4\;wu]b/;γ=ynwF]z+2{Zƪ#>_<C><+oc><;σ>'<顛У>_=[>OK?x>={񵷽q#?_>g?|͟>o'Go mԃІ:ץS6Cf ȠJ/]砀;04E`WaA3|>C >$TA` U3 &9C<=,C >xԂ>B`1<>>6 PC' Dڠ P@0x7`P?4E0- EdԐ !&  & Bp)2ާ?, $9  ` I*b+b?P1L4H/'b :6 ^2#n5\A(Ca16uL='JS 3hG)$?p"3b;;^ Ͼf4=dd&6>Z`c(:zQDJ*"%lxuD6%8_A A" hW'`P^ h:P@aQ (P>8&?0hU?ԪD@ y߳#ށ C8%GAp'r '0';2$fvjgp DÿDA=!X&<$d&z҄$x?lfS?H  pR9} !D F3b6|>('5e^6P-tv^w4huB0~./|bE/@ԡcXCVkݠ=hCr^VW=|epB~CZJj*kwhA)) }8Y3Rr@r+&F=k3.+-aFфPdM"l5.kv6YK40C!\+ӑH ?b~ZR._!œPȈ/kڪ1kʪ,hT4RG4ԴDwYHz4S1UDU9\AWT`qdP4TPԌoooƒt@ r"!3TC>Bܕ7Ph50AS;̙El ō؎s0x 3@@s"c$ @r##ȤDc36S4~'[~4lPcPS; 5\Q3Eě&` $EU Nt t-d\ϵ\G릮ֵOE p&[30)o\_#E>AW8=rHOJ]8NH1hu[_CZĵ\][^5_5"׳6샗uOKB E? 7hC7/xh'P@9%@7 pHq=|C=qNJ`'ĭ*J DFtG>`۶o16l/g?,h*/[]uZY0@6_/J0p8<  p@%K0hiy7t:Ds7HEEt5w}2Q\mYDnV4tt%# ?08l* 4@ 䞹DљAHykfH+3?>#> ?R>XA6H_k3*l *T >HgԐçi=.N19NvWko>ixEpwB8}#9@=}#I4yeJ(%B8#65 h 6%f2 B(3Q(532%pcӋF+4GaZ?/DjEPݖn}TH Bf;(I8{\;2#<\hϒt5K! 0!gֲ݌QuMk=dMʁM>U^]~`mgK\AA Xo:ZGy18פʊЏ xHΓLkwN(6L.(ڱPC8ۤnzћl ȡ'~[xpbv!ṥ}9Ca6)sAͳrjL0@\=ZIc=ݎ^j襟)qKf8RI*buBLFZGqαɦFHڻF4B,$G!`bk)8Q)~D >ڈRld2'6b7|uA 3`R

2$]YK[.yK_0EK`T2LgjRĔ淪g^6hN22f7YNsV:D)hP S "g?qÒF=YP S$><7S8 w`|iij DT"}@#g~ cG {c 1C? 680(>Y%Pթqd>p"d Xub:@P00֎OiꇦR?`D?AP0i <.L AqLcpXG:zIwL}:yFhQ@C-p[W2T; @91G3";}H"R^T2Li>:>eJu^VŘNe%9XG @ISA+J0TgжT U~ag P6%SpV@8NR,7臊PD࡙G1N0XtAShyP 2 chAj-V؂8ka$P[8 u$4(Pn5/\x &*C;P0 )]J* Xn?1%7e~ fܕOqÎSB=ND-;N$C]tJ:9p4j~.CT57Ys TLTI=BKm"4/^aJ蔧p-oSi@X@GW0 @5SD*O$/y=0@Uu?6 zx\A\c x[>^N~]4mp 3pfa )8LT $18I0't xU  >^.쑏D ]`}R>NovoM`eiW31n0 5Ms@#!Nw9a`O͵Ke8(pݣ] j"m+1ѻfXi5%oŽ^;`Ԙ9{q P` !JʵFlF b ߊO/*ڀl !oJ '~A3bVp: ҠJ^/:L>o) %0"r*\+( A le6>p yIbᢌ`b@>JjlAA`DnO A`j  a !ںPƉa.I8&QŘĤIbn4*! aDJjkR BB1ռR "&͒A(i@: ށ)lhaL SX1m@ aܑ)V,@ὀn o' L< *6L|A*x*)>*6)r&A/'+)m'bఢg,bNV&-) kΰ./I.",I(g֒-/S1/ 1 I2'2E3*3;3K133/73K4)4EsH4[5(5UX5A`j7}"6eiSAA!'*'$'!7h7ysi$!z@Y ʁ*?؁V !tBHAkH0:CF FTEl| $D=X @a S;c; B&8~#8` pBb0ҁF%&0t$^: Tt៚0 WFn!JT!^G%8,G@al%GG∰y8ԉaw.}vCxTNA$@Jgc@j`$6A #`CyP4M/sM_2$?|H!1 _vcS=߆I$d\aGmςAUR  A? L !HcLBJݠ$! %SР$.4LOGYB+.0.`a<;#&.%SF3&2 VBK }P"/z!@c ē,a1:(\G² bv$AY|aNQB^6pV_ _2|r+`0a7^2Ct5 AC+c^؅\$\x{.e@`7Ջe$J 2,D% \Ob0`3Ki;UP,`KjB` v`)2,jCaohF5,\Pm̖^%~FC=v>HH!^0o\G?s>$ZC%fL;. zdNur'H.ӀNzb z)t`7p@/ertd@|sSpXsB("ҪE=MlAA\F G@J'l!AAygq a~7^?W SFRC,@LK AL3d.i|++W}E`/"A&aRaɄP! TL!`!]jC@Js; @goXw ;G= ֦o`?`&(B ޳!,bfx$#&T,D TQ-`Y!4ċ)+7@ &UA. *TNOaSm &a:ts#BaT6nS%j!3cĄ$Ё9Lj(9 $t|-ݸ)Pz(}&A x ]532c'2HZB\*ՠ0 }!OT9}`O` 4ף?F6B./ԗ.N L!}s:X!)@ &At:s:+V7ڮs/@\aaMګӚ)UP]v`Z}+7+tAy6~z)}.0#@lAZV;9U*BwtGwv6:kBor1۹{IM[ۺ[)ۻG){zۼ3){۽{[؛!!qAߛ[f Ч p "p 14" **B\9U@CC1#\ 1+!|Kz-aP a\~,_ ^С4. ˆ.PK| Y!_ޠ ᵞ`#k˷߿ ̖gÈ+^ly?KL˘ e̹9㍜ӨS[x'װc}۸s]uI Kmȓ+_ΜoãK8ͳkνf˶Sӫ_Ͼ˟OϿ>gxy%a 6F(Vvh $)h$h(b{!c/z(#M $8| 50"9TyK4H`= J SAp*3Hqa;((T>KP*>{GP,sBoe(p9 S JT=SI 2 PcL0KI4yj<(>CϨwL gH@1?F'] ,,ӇL2$'#t oh 5 s os6*A;)8;|{"eFx/xT[-9]rA9nw k4JO,8  OC̾ySAs;H?LܒƠ-y˒Ql cS#038*W= ˎ+ D7/&`=3 B&b^CgÙ'y5|ts: QV[$w(F?q80! 7~DcØxh ɅQ؇?d/E!7c7ڴ&dcp` 0G4"AP=*y$qs܁^e <=<@PD " k>q*DZ,P?zGg|qGrENR#*HÅ'I4l $шCbAA &NpLѱ>H+U P?́ vZx%b7Do3%x G nF:a5^XDLnp*߲ |<(V(=Q,o24 ґKh)Fd̜D/aZ6--K o:V7h P WF aQUݣ%ЯF,t1YI^rKEwJլhg4-JmBDR/cZ)a´?L}@ӴԴfzuWHb`I *5}2z,ĩ@8@}MpDR<5OHqUkaGA0z%i{X9ȺBIN$Oa .81D<7$nRY;מ4.z#b@ E . oob%X,`Jv@p@QoyPP 7L3 VqC_OH8.xHg /Mc԰ %bq1բtZ}vLb?qL°a^2rkG=&Yd3+ n1 Q YQ_F|m)–B0+L`# ׸B-b9^ϳiO %j%R8{?rn#vȃOBCEdCm$) 5Jzc!0]aƘ'ۤW>h6e{ࡍROSCn~OǿMr;.S8)z578P]<0af `.lcTAQG3Kt5A N, Ө.6 D;!5N MO># Jl3 ]&HzH>FfL[vt0$P€'~4*7y6қ^Dӻ~>}RڇƵɽwoWϾo[ p>O௾n*A3QwB?#`1z"g2q0cq~|k *KHY`2`7T 4Ha+ppApC)-QR+# uVpV+ 8`58 C@i 0 C TZHb |10_O hȆdgP #Ѐ4 D@e  D_$pgP0ppvpr'6` tXD|xgqAHPx@e[j 4PFA$,#`b" (e7}Al{pȍ=`؋ J(9!4 0$#M$@ gcO O(M04kx8hT@ ހOpH  78 0(upY9ls _@n fhɘ˸!` 0  .58'1B~Xp<{ހ Wc= 0$%hРbv!4n0>6`6D LtpbIEĖـ Jpi  XDHV` PFD@S ¸[y)+T `- A @Av}9H # PC` P 1+)!ؔiq~P #@7_! Nh ciO8ԀOh 6 zx= 0Ph HRN)*vH4RhC` @ 'g)V)p{HHx%ME=j ` sE@.Ei u2Ԕ(28A'<, > 9@_.?'80x?). Q"< {( pl*9h6ȏRHPc65+6TDZZhu9GUe,mY#cY )?) `ZN>6Tmi` KyZJ pZj P *ti` j  IZ gphbPȕx[2!ڟ(p E\ 9 ` 1HNPJA&4 RѳҤO0: *4 B4Kc:X 7!yp n7D pi! ii(y+#u 5!~p ݠ6qxP zb60d@ (- - ER ` 7CF;`9ipъM 4Pc+;vOD H}@+VS W0 08  ` 9|j<`8  @p -,*mLJ0xjH#@n_!÷#Op#h& `q](7ptjɖ:tY$P jpψ |7`n{ 31}0,Ĵ }E 4Pv 04Z Z P$rk 0 <ª`> 4b}0 @yǷs p T57DmFf}Ӈ6!eW/!c]Œxת!Y׬Wz؂=E,Cу؊jmdZ}ْ=ٔ]ٕMٜٚٙ٠ڡM-ڦ]ڦڪ݇ڮڰ۲څaB&&۾m;ܷە ܆"ܾhFc܅Bܽ;Ío-m<ݽݼ=ҭQ]۶rܕlRݹ]݈ - ^(; ^"ŝ ~ŝ%ވ+!^#1@~;^m]AP-n=SVY.6|MB|f;^n,n .dncսH$NT^K^az|.>^;llݐm~rcNݵ᧞8Ns>cqPn.뮎n^-_!Gא  ɠאϞ ` p ` Nyɞ͎͞ nў ːѾ.N~>7^ x^מ˰>ru,봮0//+5O74>Z< !/ F_P/̞툗S]OQKco e Nhװort?Qe|?>u_fa0 Ռf.O nv~堿:?]6!b 7|l Sɾu?` `O~ c >n~_n̞PO~ N G_q1c4,0ɮR,[th1kTRNT@e͞EVZmݾW\uيś/-)%ƒpJYTǒ 915, yÈ3 xpĄ/Ns^pv%A/L4텦}Vޯph-)'[گ@y䊕iVVUy酮?߾||Uu_~0@$@D0Aԫl8閂"R .m~ÿW&|qU<6gAWO@A_ceErj; Dl>Zb] G4pZJ@AYB#%aByU, :Az<,aEY+^e|K\"n<"Q *-%Ѫ 8փ |]2Y `. K;! 2ԾNN=6tB*$œ37,ꀅ\v(+;\0 e[ ŒNHZ*@Y=kZN dK5#r?PTЭփ RkjW{@)La-<("NfҞսnRBjywe܅Ʒ%X;ox~[GxWkpEx>qUF"5w<y=>r&y}r/@/gwOsW[&yg}g9>яN}Dzxt(KwuF0mS=zO{ 9X@"@qo@ǁ tA>γJ폷롮 A*_5b!]A4B8(NXp)Lq >7^{ǽG%ϊ-+b G Ap@]U$nALKpg @)XbYOɟ *h0U~>cCS8=K `-J(t8$As:S`kxT85@zA4P˾A,"ܦCSkAKI +0WpIX 8q[++4B04뱁;CQ8749C[C-=kC BA$DCTUBZGF,HODLԷK(MDINQlP(RDE&ZUdVtWXTE$2r\[&]Yeal`FbDFA1`Jfe&glFhFiDFj (kFl%mFnD%o$Fpd&qEr GsEtԤuEv̤xEyĤ'B"}  \"t!!t$dHFRȆQHHFyȄȰȰeȆlL"dHGGC YYotInɚɜɝIIII$sIɠIɦTJɡDʧJTʨJʟɬ4ʪJ ˡ$ʲJtJJ˩,*˵ ʭd˺JJJLsʼIL\I(zGY!,|X-$>5!-&)->>>3)-,'''(((%'(6669996??/&/AM[gx,S6q'*L%$a%6m9V"E"Ny3IQ)MrYhAMW_D0K('hvty-o1d'%p3%P0BB^@U.WPH4xMoJ)SH EEELLMZZZVXVNQQHNoSktoLJvmUyyziklgZi&&;;/%(MXKcfum%N"S6g-s{HlNuowW`*9(Abd/-!964Pooc[N[iqvW~ ..??>$%BLQO$ed/DSS!na!x,pMzosNTV[4WNaYjiRR(.s2oToo͔7ϒ6*ߞ˔GјO֢YբOإg׬tu٧[/y҂尶͠ȥɬΉѪյ˷仄⛙Ɠ̯ʌʖ̌Ԏԗӗ٥Ա'O> *\ȰC JHŋ3jȱǏ CIɓ(S\9R^:t'/M4s&O?{J3ѣ:EzT)S@.JT;>Uҫ]>%tPfi++Ҷ9[4[e)]YK0aD%<L8㵝z?B^;w§Y-ֹR_g:ٚF7hݯKN6x}s9-olkv]_{;Ytyus D1Þz}7w]4Nէ\`1gX|ki8ՃWpޅMbz(V.XՋ.߃¡hp˅GhuYm8o8V%yېEu$YwWf0NrX$Z^b9fhNi)gjfftgKiuF[s)ڡ|eO_VFgRJfkrZZ!(jƓF$VkZzk밪ʪ +n:xj #{wvnb.;. Y]+0wJC#fZ-VLQ䠝.Rhf!Wphvdsb)s:I9x$sLer~nysFϓ~8*_>OmoHo3K\P?gh?l/~?݋?ᾕ_웿_}?ȯ_?~^7@C`8?f<'?>{hfq 0aL79OT7&}4D<>Ç?a؏a{7&:3A!ZQ A`H-ĢCэ^ ,{@!?1g,8C=6yLAב w# ]IvN!f#,rp>E!HJE/|#(:P\'9.a""hK<҆8T/KW42b4_-JTF"Dd %Uҝ+g=sUSXN펅 +X|>4>}'XqCΊ訽ysE(N3rg^l,Q>uld;CYN=f%P6ց8lgBgUT0x`/YOVah\#YwVkUkW%齤1=sh#q;2FMb瘇r1j\u#`B pciZuZVS}0h?ЁŃ;(Qw2x`ށ$dCv0D81!PQ)z0eWBv-~_`My jأGcMRٜ1kLc+nȈ ӨNOaB0 BFqhݓD̃-x(/Z%ծbx_EGV;9*ru@2шF8~4vUЄ&HA MBMXhz^r5 bHm(/s>oA "R6 q~̂؇>b![ 83Z3 JUqmLw6q&Md*)@ !"5Ca1bя#б+>gtlD's&Frk;@)rsT;Ѓ?hGKÞqQlX(Ρܮ`@/o _^\]~c&x,ޘz;;/nK]J}DGO q!0՞ .SRa[P$O x>~TЂ=wEE }苞Ȇ)f1!A |L=v(`:* +0lz_Uiv ذ +XIhLp QB u$i`~p^Ev, (HqÔ KTS`r1ew`j=G>vfx5ME eH>@xTk]g7Yj>Aq8F'T+nQ op~ 0 P @fJ =sOHRGdGL*E` EB@ R@h5V}G[$`; 'HiUCAja(Sw`dFS~rxDb&lJ=Bp 3icQg@sTwCR黎Td` $ FC@`D@Dd=DECIw` %K&d@KK&ckD GEJ=FU`vDZGhwI~dY\G`=ȦerӖQ>Dq0C aCP evH\(؀ ِp xtE~ X Y#莦i0V갂8vvtVgtwUF>6 EݣDR(T~i'=g=iQuiq)C0Љ Dp ߆=Wtv9k'g_3wJw_nryPD@`Z ?e`?    M ǒꉆKahl` C#?~fF7gQ ќGw9N.@W= @`ڷP~C /hJg ( x 0S ݸfht hIiWG 谚IvI`VAj> _WzIԃsyZʡFyEd_ZCs =B zZz5IKIEfNId9SF` DpDs ۓ=ΐZ wEDGTGũ3a:x$ DZfQuWNGJfw` =PGg : NSZYjhXҥ۰Yu8e G I9kS:٠ԭEc#KWƚ=D0%S> CRvkp*} Pq= ZK`ZC> :DР3 CG:z鹒DG2dHc ud UYQb역Z C l͖3Cp G7C pRڸи瀯ٸ5 ^ځ eiY `G ZI=7hdS,%qf FtӖ4iR"C@GC >8}Շz׉yr `QPz* z=? E`JYc0Q+Kɢmdc^Z3 LcLIaIGܐ-wekG < K```5 [; )R 0ژPuWWZwۀ^@epSh_ x9 Lo9qr{C a?׀; _XAd)y_#XYEz  w  * \@ ` IL H~'IWy` ۠p{nl+vuptDVi:@ = = |ƦpRzSʼ/|txE\tU ={, i] , eħjv=wz= -ɱыrA`|t*wʗث=,~? De~dPtM}t\TEg?rfR1֋@ a4| &`Ck͠0 &|h==  2>kH([ C` 0P0 γ TTF6 Gl`]> @0s-\̍|ݸμ\5]ؐÊ } f} ^ ؗ}b[_*5cSULYEeHjf`)>\=̞C kT͵;=hanՒ$\o\oG՝Jkf4o!MW}lw ' TE7lO>×xDg=\m#`nǁwmܭx{[׀۠ Ճ` ~ߋ]"^%ዝwG&f=hdkؔu@SbYVNioc=&~" N'fKxwe`{XV>>Mf[V~RS[/>cDF!~5X Ub a 6aE&NCnA^<%̑.`s~5M⼹<͊ -n!~"9^ϫz_v^١hLMõa^ްg+0Tyˆf>BަWvf~R~z.śXG⣝~ՄᚬDV,zQBޗO~ ؋nKo^ _T#I33}=bfNd#zwL|.Dɶʤ>0~P7ZîKaJonJ7&:WT`Ht'@YV/AUTypK C)OP;#v{x2ڢMUeMU_՚5ߔh\ݛ[[L-&kc}?s;ۤ;;v~=YWҧ„zvboUa؍u80ZA2) Jt BBzЪ)d- -,n&CDkAEkRdq)DNDEmqe0n1GqrHcK2t11 zH)D& J|E(s|otLH'L57,M1\3LqL56r6<O4DKGMI'=Tk'LN"|2FϪДjT)UR9+kV ųB63D Q_!0W uŒqTS}J$dYTguXivm[lf3EUCvP|j@ /x@fOX; 0}A nDCδ@Qs ]'Cѱp|ܾrUnD'DL*k՗ 96щOb8E)rWb@+[cF2nq=,cE5*klcy(G:稣%ѹB|c FAҐDd"YH-ґ$+HG\яdINvғe(E9JRҔ)UJVҕe,e9KZҖe.EJ]җE,\ b D&2v4әτf49MjVӚf6Mnvӛg89NrӜ o, =Bֹ*p;]^5.re+ZoxZ]wםmzgy#}!N׾p5o~wָ?zEpiNi(C`HV|Z;"HAMF%bg F VvTtpYq]:!Ѐ%8r;^^_5q)g_^1+k g)e$1`.I /g@fNv z. &`rWзڲ$AgNb09aиӘF;Ƣ׸\ԋgS܏@BS0eFA0t5e)gϤV,igVVF41c'#v5eCPƋ'lUzl|TTWb' =G7=[D4@`mZpboj3,&@.i/!ӛn&5xŪ%K C"AŰ\.C?>B?Ax*C^ *׿|f?=(y^Ez@>g5 Y7Mw؇ߥ܋~`bym!BE;`~#F1kon !tk_PWt;AЁ[/f*aR =ڳ *w( SR.x~@S|؃k26=c0?X^['m~p&w`#n2?j .?vؼs&E뿰#6~֛  -gs,*gۆy@pҳcU4C(u c40S@Sr+<Ӄ|&%\hRB{=cB<~cc%fR?,O)-/ D0l 3&K?K5eP*>'[;y(7ȇC` BAn)ĦOP7/Db1#63\vbkf,g„q)Q4Rl{/T|x@.ED+@+<~`rp9[irEC{ippvAv=܀ 0cܦHi*@:`F$7ӋFs&dvL GyAHC}h#sP|۾pCܭ7˄$g7H]I odfRItɴ4'S3 @{ ûV+Jxm[ ؂D9mkJD-pHa%|lHHo|Ti<6[Ȉ4xI{xKlA$L5/S`?X1(Ӏ4BD KLTBlϔNrz3P5}jæN 'o ȅud?@"LD#IjLJ,kiPq2o8t612d '=Jgr[@=^<7h ;/43P (Em/2;Pl}bݧqZ8j/۵cO3FTN4mDR#P[m,5ִ7T'0m0}74uS0MS1S6-41 PvZS9@=>:8MS>==Q>S= S4;mTEr:did7$'d[fR?R&2xN X.p*6U'D-80M7'3-3U?mGHU`Eb]'D[aSA}Ca Vf=iU9U_SIe'6ڼ5k&MS5j:CUU};%5oTkkAFHUi]%Voe|S}]fzVcDVEvb7Dn)=V`& siZ/xx`K2y&Az؂Wmdue7Ճ՚օW`}CF_Y%UZmSWX-׏gR/KRYkTMXWm؃Tװ=SeՆV%XgmZUehUeYR,Q44Ǫ5* .zqrz܅'(Z\_(>Ԩm(2_\\̥\ѽ\)ƚ5s]%-%Zt(Cw]{ ^୧]=^yނ]eUҍ5],'ȥԍ|^O3.ϒ]ne_Mm=_P_u_M_ }N`e` N a߂%y2>]^U^}a>lnUaea݄:ba%EF,L%f&v'()*feZM-V;+/01~buP.Fe#5f6vc2n3N9ֱ7;<Ω+: @A5?F"EfF,֩DdrJ;aIdOe1]>~N6֪^0Pf6)e-t-КeRe\e`fYf^fY8bVeZu[&]嬝iQ[fYfhv_-nffgge\m6hP {ut>fhwVxV{z^fpgZFu6%0o`W`}jTnV-*|ظ8苮h}hhh>iiNivi.v6izi ihiNj葎闦ifijjhjk&i>jj6inkknꜮ鱖kf꓎3}̰ 7V%=䖺vlv~inj꛾엾viliFmжlՆfmj׆m׎َm϶mצiUl7\V(vTininǦ&fmlѮnɦmnm^mNoom>nxX  88n^Fp]^&oon݆^oOm pmpp /qNqn͎ )k(]UNpKV f= ~쟖o~oOrVm&~r*oޮr%/.m2%go_(kskȆq/67Qasc/hJ^) Oq>q_v,gt5i-lp^t)rOOwMGtiRVU(_s+VvH~@_Aw}2tBr(3餞qJ/gOvЮl񚾇cuj?q.glfn/oǞ)[( Wl|ߝw|-b_b-*1i_ꔾJ߸isOu-grFixj?ixf'ptxNyӖ̾o5xn~@_Pوvw'qsE8ch*xK`24@34(^q(s`\|w 'x(㛢?nhwrbvprTW+Ɵp>|wnuS/wIrs:xY xy_)COx'{Wpu|@o]s3 B8~ {h'm߸qn/?O_w~'Wg7kF@2a7l&R_~֊ѣ?~,i$J <`_m{ѫ |_J9?OUEP= b/ߋcEә,ڴjײmm ҭkWD}Rۗk.l0Ċ3n1Ȓ'Sl2̚7;^y떯bV~C9[LmyI?)kdC*dչ4U~t 5̾ -othsn=ӯo~ׯ2 #wNcCC9aaN69,,O9g;4NX< " "07yWzݷ#=#A Q~֏?)?csK?D[+J*P:7O9tYVS"l5fy] G奇# y(*(Y 3`j!O?Oʨ-uU8pS7Adm8SM&'d瞽Z\z_6X*,Yd_G/P{4\12&BO 9)]KFXE"u'V2 7`cO-b[22Ĵ8\X^~hs𡆶[. H=Q"&͖Ҡմu>{s ?Y3.| sx 09 >>V$y$ms ˺N%/!bȌ'L:~H4rE]w/q1Vbi+ZB.gJӢ'==GLij 6*bXn9M xT80p 猒:pwG=(>hZbpM!z)8I[%0  Ja+FYl`U>7ӭu~7-yӻ7};]ʹ<B8OI65`~ 8 wt@)h 9%rsKp e; x,nmo.ri>9Ѓ.H du#w-!@'VA L@ Yzv,4Blj}ewq-N 5&yrzvz#NjQX"v,4N@$ _~p 3MK\;H> ?ʔƘ}P嚵LdJ )@h[I 5ILByхˉ\޹_XM߼ C66Ѓ6`C=9t9.!ܿCCJH8yG՞X*+ B5@\IXA@*x ]4ZB" ]!\  X>NX7'(A28!"D9-4Q >/20bMb eA9:$+ ,*C,"> ..4\~ /$G` )Z+qإJq[ȩĜV%E-[ ۍXc"!/C1$2A& &>1LBuqDc2@C49 L>ФMd8C6(C6pCFNc$5IeV ?ǒqhZD@ :@-[ԥEL,ܚ%ߝڏQD=;T0bW3@0\X3 @8"cF2jd1"ObiStbOn ACfBfBZ&Ynf4Ղ>܃"B%Ԣ>eiA6gs._Flk@̙gͼ#ag[PAF 0:T?C>LBeF2Uhi[4 2Fz%oC=C 0'>,LBD'(,4P8-&4beαkxvOr,qV-(C 즐.aijk gY脉FYArFqhǑ16+ u&Z, *i=&f⁢hO. b.R4$#B)s^A;$A'\81F$j@/r88$|"NcmVH[ !ֈ!ʠ<|5=?tBf +d%^LIbLƃ~(. 2A=U(A2Ҡf3 8rk*k&$&ʩ*E# & :X͚)+| Kj1؛"V4|6lk>п֬-,lS-{fo4 @(,Ҋ2gl#',o:?s^?Њ4$̥+\JΙ6UWQ"c8A$@\=lr:$ؕ>7tqn9K?(6{,+:|] \xh-ͮ#AA=,W\kb$& .4=V#=%صR[xoP)!*&h`l訊4oPȢ'"kon:яdԤ,*9D7.@-c+7b 2r S=́)Z0do },4ˌ/;'K{q۳BkΑ` :px)Ml+r6d%:lCFh[<uߤLɺQ|x#~[oy_$./2#7rI"]v= oIo~ 28kbJ+y#2*,(guD%Y-].rq2"1-e $Ք3?34/ׄ>p#ˌ1'-WM;8c.g o/;l% G>3?J`)Ϙt4AGC7C?4C/4B'A#tD7tB_ES4Go4CK@DgD+Bg4D4JD?@A%KL]H4tAA4F#D4Pᖗ)Qu9јG:,^KUUSM|f5^F53ͨ1~ٙ܁(:C'a6Q-3T7B'M}FוeZ:ޒu#|~"bg\ɠ׬<:R ?` U0Uw~F |(a.{Cx' wfsz?` 'U?> 8?8L'PBzk@ 9i{6@;@s W ~8dI'QTeK/aǯPAt2~wve# v20kG觐!>(TԣxXLo3^O^ݹW1k"OÇ'VqcǏ!GsUyspQGSFf0FiƧQٕH莏X(g\W Q{$BKl5AP.l`r*/7+(fF%!ftWL4ϘH pz'hCaSΔ5MQ B'IJ QPGHL IF򪟿* O4┫]Wւ^k2](2< yR,f ! \TJ𓪸<#XA ~|T^@ P/P+P >. c)b5ZVFar 8q װF7+dJ I(z󣭉h<`pq9,jҥ%OMֆH\[R|3@8Up&8Ѻnr%ͬ4MN 0DL wp81 6;jTVg+4/ƭ %y  !AF =Q ܙ O9 vش>8w ,v8aC~c@Z*wqo-.[㻴.q_RrLJ7`Ox:XqLq}ס K7Nrb~B(+}NկrQf_](E/qkWGV̀>4C% cұ툓W 1 W0J欛j|EYv UkX߂!+..> /rM`I2ʤA]J'w/{Pp !s5Kȇctd#Hw&> aC]9xF=j/);hf<POH/ĎfAgo2*leohopA0me&UPR&(C3tt`#4#:#j0t`Rpn)1rPghq60DnhEp BNKЬb6 b! [ 0Va [x )WD` uF3~\~p`N!h@ 3DȰpOj@^a uFq1B pIL)U숵V0C& _!rVR a T *  0`Za bp(! ^%qpD Q'MbI3 V!d3Έt je|/naXp2p CT`@1 l1~^ d)q#a@ ,@'`R@{7`xcX# 42 # Tp 3DrVRB2 .a*h.J*RlR& C;#o B@2"`"R2#} 2(a R)1@ r eV!!!._a. b@(afR2Ԡq ϽJJE p,/-Q s gp7e!;@Q36^ '06sc!Ԑ!|* $ z1o cΐI@ .!3tj@ftEUa L!j @,: >3@ʮK]Ua9A@Br/,i03Ri*XxB5hM7=G +KB D tLL60 5Y)ʆ%*NO xt2w˂i 0b4X `m`T@6jY fd8tJ7* v*h Q$A@ML!YdmB:ruy1M*h*N$uyMu7 X i<ٸ$xu `a  -8[,#Ģ ?a lf#?aU:yHCALP6mˀ?L:AyʘxJ\Fb? $" *QmÙ!?d9ky,Ԣ8$4X`Ä:].knVnyZ*pz4hBY55x$DxAiB^D!$y&[X@8`#{c$R#>[c-C7@ivGu!cm/{կ*ĢrTdڎ[ ! h JDāQ-¸[P F!+8J$7taiEn⪍C0Ev8cVKU-uf,V ppb|11෌hmðF6scdfbts!©DBt3bɿ$"J,tOh`YnYʁC`'fOyxbl$dNſgzR nuyhm7;{y}<9#*WJĢ%A` c` `ZW7zЯmJk etT 0Z'#]Ibm{so{wى٥9CDғ=e|u=]ioV ]$ݥ=iڑ3]{=ۅ=ىg=jՔab &-/;==?S 7^E~9WQ䥨U)i>[UA1>i>^^^O>mYW~ ^9W~BD$ bm6h r^쿻gWޑy4澶>?ÇnҽU^WTuٞ;9C $yeAdZU;y >_Yi{Ime +e=_4=KߞW<=%^n0h1E LSa7#qVB|R%I?S,Ƞ *D N::ͪok1k]ׯrݼ{}gѬ?=c}aqc?ÿ?R6s:x=p Ph8w+߼/ZmH` O22Yw~2HZX=1 A-Ǐ  FA:%2G( ?NOaH#?eBFNN2F1FQO']4VYbrT@MS`"]^d҅On5NJi};/[J8ԃWē sLi Ps=Í2 6ʪcba F=`;**<Wp 9:>XN9kc.Jf{1Zo%pr@"Ŗe씪S%\P8)k eq'3d!O􈆖| jLOE>#u8ֽ.4of*LNP\cM7C JQO&JI `WÉ591s?F?b͋OXYטW"oӞ~#9e?E:@ ]MECO C579} 1 rx46:7儹?5dyMȘ|"XJY5?^hGp`aaӇ4J`-NҞ5̀dN012oS;-QO'nr#8N89 F . G>7s|:G>ӏu L>8Mh /afn4e4F=3l 4$P+Yyo@'9-f/- ݖp #`O2AfK#2ZI&Vbt3=!X~<ȉc67~2'9S#,|~(2͘fZ.#UP5*U#>{3(ȝHPN0, Va([0HPab&o~xB(3 'DwY&AGYdp%, ^r d_ް13]S8`1}Ӂ59*KzjSh6`t| KI^J!1?s|s8bk]82ϷGlꑑHYF2\t؟gtYe `0Ҩ h  Sq()g=̨&U K9 ԢF<"Pˁt]nC< (/щ @T/d@L>&t`#+r툢.(rrtW(Ȇ6" c+YME)XƲ÷؁~ ӧ]HvdQ $B{t  =wq :?ҁh<HE8qqD 5k0T&*T@qUhpeHs)fHZEY#jtK74͑r%J4`(6Co& D2^ > ~G ^j w@I5&k4+2`@: K5S4y3>i> mD[Ęއ;aD D=a BF?@u9x,PQ˩] |5{zpb;(SZBB*Ϧ%4D!7i!܍[:i1!RqoE-nWD/zej:e4KFXr =.>XOmKi}C0$V*0YC(Є 73` S7pilϝpCâήo+~"bԦ}kC b? C~iUE^8~a4g~Xh] {LcpzFM+#xLj?lI<u_70\ _TK1hc -vCp/5{p }2אf(Hhȁ!(#H XD^ 95a},%r$7b7SWE&D?`+CpKsbaLtg?w|KXcHehgikȆ#N" ,b`P}?mzS"` g?ٶa q g]~dFu!mȉ艟gpJpxCEh]l1 )$(ȋdx2A4f k8hKe|߁h׈٨XQK[!fwgጭUj׀i8[8XfۀڸQ1>P (U i)Ә(DU@{0FB%u?O΀(W"\%;%H`gf)E' V0v'i$y3s  F??BF`Q Zc%I)B?BY w<q8It/0Ȑ{Y#O6( p 8R1v|@@P$@s`fQDi6 $ )7`  aYpްpR&p"9)qp@gk- XEWCp'sQa9|n e9 94PvPKsҐriPQ>| eb2p0)9Le $@ P(4ǡ p ceIs&1d)ZH)С2}&:*|)ZE50H:)Dڞ+DԀe&Уp2ȣL p@N Fsp<]ʧLQbiTua ZMDWbKjF؞5 I0 EO ڣ ބD_,t D=PjQ*0-Xɫ 2ʘO  p pfZÔDrBdwPcT }JH'(!jf+|㓬s\ZYQOa@b @Hʭΰ0C r2 Q\jD9 p@ <}v0;ϊFR7*aZEx=M@,JHȬ psʮЁ:pNP0 J}:ְG*!bJ)ٰ) NV* &x!Y|6HJRZE)ٷZ!0PNc{}˹1GjXWj"(L c<vPT%jKC0FO7`LѨ'+p Hp47 2  Mݚ.*[PL9@; 5I:= fR&f+uСDKL$bWZh=J&{|Pr3l EgkqȽ=<o ) kaTZ#|01 \$K@Nc^ `p'n2  -VZ=G瀜I #\s |cYR-a0`4 p Ё UoDH\\ `m}Ft*( . 9qJ@/˿ ,L `ɬ Ϳ ]U `\(EV5R)p ҦWz {L0i$2)=[=?RO6C L9Y ꚤj H[0FFҷ̕f%hi_ppKB˵ HvQ1Vy>rq|82#08ȬsҲFGm.M}%8Ud 2=ppC:ݯ=l!xb-sMiKfӅmf~#uM؅m8cz -ٞ!`@=؇ٙٚ؍fqY֓M BW͛ګ!x4wXڥU۹X>1QJQ o؆:ā}ڝ-,W`9}zYܓo}̧m(o4:,]籶uQ.-]o5zj7=!-OvWx 5̶\!kmQ Mqˌq֨vP a"P 9@`q %@8pQE.V1s hKJ3 9Th.OsUV %I;hPo&d'W? `kN $\p%E$0ÓȣpQR`Bڽ'}YO1 >Hqu`PDPjOEI^}3u0Wn>)DpMa<)'_R **3+c+r٣ $,BN'` e5y jBt5 ̳0&I.;H[hcr^d/O^ +b++SSte,rYSjZF} ȌnTs"Yb.  x@Gf')Z B2PU^z3tO7cXr:n ې9Fs! 7#W*vZ@mpPP]IҰCvp T`Pg^1 o'Tp@ N> \` P |w"YC9J]hQgzQć0BÀ?V5x5 "[r 7 'j.c#T%8h  *ˠ:,0 pH#jdC%NXC|D0Cp`וҀ`@v W=|v[q!e\4W*RH4Y]ZȻ#I9?MK`[%Y T8! 2VhB̪à~?<2j5y5kϟ5dŬ拟?y Tf5kZXgu;p7ߪλ ڥ`=~VEẵow 6o75( b:/U Epˊo"r"Z?ɾ JDb N*IJe AЇxILjKRTqE[,ȝؠH~RIֻ`ɩXc%ȑ{숂`I`z| ǫH2 6ȟ"iإ )%%pTC'Zwhd'0B$;892y!Ox:4kf ~I-ugc~z5z礔`<#2ƃL2I= }" ڟ=b ᧠h* mGP5DY"83 |;hDӇ]D~@2 F]¥uxmT.P []2vN ,CIxG w( 9Dz(/nOSэl`CYPJ6]% q@qfT!Q jlA`! d>@=XR<]Ѝk\Ca|83إ xPw@h\v¤٥AWvʈ3P pCE0! T/pkBP&.` $ 6衏CX%h;NzH#.9ى >w a@4 2 HPFXvюla+}|"P!@7ԃS!20 o`a R!@ӔéažRShnAЄB^=TaH$Rq zDT?QD ,].za-M  @&J!FPU$4\ F7÷";)ϒ +(,eLII9W$Vg{+銄zb2DrJ7xN\Jx$A-H&eJ%&C0 \m<áZ+bCG`Z(>@a&/3t9qV5dI{AkU3~G|bBNS,;V-9["6tdc5G!X$;MPC{hCeua(|~-4IḋmaY~4mFgmI{0(lK|ˢ~dX3JKpwA ei0(P{hYg@t3 ,|'| 91 ](/ ׬MzIL1# [K_Zȓt{L S6=y=Ahz) Mg0 3l5NR kZgX bQۻx@8xNb908uIv(Pc~Pb 4xP 'CeR"Nx!)0~&0e P0ajaeAS:BxhqPt v >H(]Em~` PN[i(HK cDTPQW}UXUYUZU[U\U]]U` VaժlrEt33eR0 ՙe "_ _haʜm$fbjJ|((HTZTQ%Պt }88YL@|##Ry:؇XXXXUXXX YYXQÓ 2ueЌ gVxSFU H+O`!b i@\uh g>mWxW|ԃEIzW,K~J ZE4Pm[}[[ێS 3~ȃx; 4yWQp`TUFjȧ(Lx0KFA[}E Җ;m|9Rیy8 (# e[]]ݐ5diJ|@?E9AiP)`}h$L'-Z@PPML@wxyyPea]Э^U+PL8K:ߖ?@=4JP]` M`ґ 0灩ƴELH8#M {Fal[OD/wXD/vHMτ@.b#CckJk b/ NJuy`$F 5luZ6ćt+KdnDDNEk@0~dHd`܌5dLdMGS5(E.dR.eSؔuGdVneW~FSe]bK~e`faNX1[(#t|efnffifW&t (sdgfoے$EX_fs>geU2G؍́fz犥ٲdtgbb~J*6%2Ԑ؀yFh{n璼S\Ehh@TdXdpDH >izch~ihȌTXĚTy؆!i݅Fi~ۈ̉i^j?u2BOjS-8}{[ (z^ɤnj~kAX YWiՒ3J(dJ^붎k~l.buMQl؀Ղl{XE YɇKНPHlg[>lbl̫{ȆlwK۹KymlNndM9PEyVp[PEiЁ}LpNY uR|"Y ъy BLuڭ, Z܇|h|* u8.1N *SLX>EXl3~XX.! ȁZg`(z(Kqe0-KXaut8md` ̘C‰r;e)BaN@}H0[)e02PlPlXwG)tJ|+ЇI6 WszmІtdW+KsDG.Yɉ`S{X}POE` Wa u*>GV fH)4`J1csp^q"@  ⮈I(цH4*b.o7(7U'CZ&.S2=ștnZkR!鷕hX.` h(xPȁWP#RZd\s} ="ha 8fp"CGJ kh /*Zp2Htbyg|j+:PnClfؽXЖχvx'wXieںRu vwɅЅ I*LPq)"[1s Wqq]'V`OjQ1YUX~}ar~0w 4{q?om$I/p- "w88exS{0~00(@,{'3#` †B(q"Ŋ/\`LR99!ygKPa)s&͚6'^sx&T-ogfTuh͇v@*GܹqA)[ܬ~,x0†Lsby4Ӑdi8eF|$)$Očɇ(Z:h ȃf:"&1Nx"Irt':cϮ}kv2^ /dKsێq+~߳6ܽE-:ՕF?|b*RTc4&H- q3(FE@!".1 a0.c0Qm \shMC7Ҥbϙ{gN&&P? c/Š<5l!U5"+Ï"43!]}9h\sϊX(j6ӈ9SBKV ,$/?d7[-dbA5<9!GK@HtAl}g=bO&k-VTg-iAf#џ<-Oz*%O=Hh9P+ :PȰcI~"W]:,8ď7}՚;犫<鴫Xx3>dopc@IĒn8NAuɤN6$\pC}o7%xL9wKDǏr9"Ηcخev"]駣>rPLlTUPTE?C-Xy Cg/J\5*>@Sk}>UO e5ʀ=o("gjykBl -}! KhBlx ;譃2! 3H'!{y~A/$VJ\8\#dR"h+b1Z"/1bG31j\#>e4O;1gY_?2$! iC"r #&%31$';O2I=L,b@"%[J0& l]&Ei[2e +7) ^7E1m8<^tx#=Ugc{'fQ(p6J^2'\-CF۔R VQp$ *63LQx 36K_8O)~ +ˠP%T^D^0!h2ẍ́LU i^z!CC⵫nc]~#qyb5 NF7{tbK{C6R?Β(`@x+O3 J ym NGjg{ iǕ`P@ g9ڧ }sNPCЇ|aI ͗؜O $ $g=ҟ?V\y. D BvKSbG30T(:Vf׿yx~]/ dAu^QQ%V LC'* \&A^^E͋߱$ɥ-4 t]e4qŃB6yY!WvEdmDa򇢍`C{<bj4c6` >Й?MW !_=]PGYbEZLFeP!K԰T;(=WeBTKTGy=@K6$6 H`'W\a/3>àI^~qF^?$7?6dC7X%9 eW9h3"`@\}$K @8`4a2?t%9_ȄTq}KB.4%Ŏ@E"fbVk),><0_Rr2'}H& tRgu`:m6w'heTYgyycm2 '|(Ptz~'Y8Q0&}rN}J2h:agHđ 9[bhbJ~>臂p49 ](kq @3A dh''P\biGCvH!g0CAL*hVC4uuBaPxi`\SvӉ*^;j9vVU'ةfVݧ"jf`&:Y4`V-,=<%h<Ă4^g}LLCxU;%nΩ("kJ%` mE6YhF?f?XJO pk?lCzkՓr@9dž$L*IqҨfE(A%E >4-Ev897$,v Ƅ¯PR0- IV,Hp(8(`ֲdi>6(T>hlA"+Uhj3A(p;C"Ԁ,*ن2FlAenDX GBp@CԄF버D˂2;K HZt MG2=>p^h탎=6,Ƭ>HN*4>Š(\IP>*.َŏ"ԃB H|CH-,CCdnÀ-C$I@2LõAHA<qVď D=dE`*lDHh1]/ *CG)B+@bVN:2`C4l~C+ ]0ү4HB+<x*("D'`C- #DAD𒦉'.$ FE<XB h" :Z;5LLŒ/r0 -!13d/@/x).i')?L@t3_>@Ü"C;'qi[FD)9>ЙhpC nF> 3tP?Dp0l $;4ՃoA! !T";ȴ 3l0P+\?rZ%Ȩ?$W)B;nsi(c?Գl3&04I u=8<\,Ch.X43A=0$:%`%4A%UAIt,C' ?A`~U"4CK EJ01ԛ^jj8"ܭ/ʆLZ)/2(hXi 7?[k4@`Bh ƛ3{G"k3$0nF'\9Im(J'>6.= t$2Hxh ˂ㄔ=؍!=A"[og93p)$*%@thn@8g53 *xxҒ=#iGH$v>`/";8;(@8i3AM?(8>s@T@_7d摭yi8gyJif)[?\`.dI7hI44@—O?`f !XK$2`7\͞gxϲ8ւ韺5ori][yK~MX v԰nD~u5K7GxFxB e™Cۃ/8{v\6_1 A0B4X  h4HAf*Ik͋jenpҗD?6_yj1&MΫ}VސCLT,d+gF~苾LCEw1~\~/k?'> 5~fM -I s3aB w55A9_0?{.{&Fs .Eh?4v<YB_Ŭ5O^)Vx#PtAƊ=(eJ+Yt)<}1 x`N;yhPC5ziRK6ujTdO?}vuei<ـ#I@XdXsUIӪ@zs7iq{'vrdɓ#S;0?}n5\՟v7 ųg;xV"نm{]ݻy@9wГrs] 33aXsZ l;6֏xO~WNIcWx9kO>ï| أ+0@,K=2eEG Rq6؁R!vQrh`؁(iz;88@@g'vL0u7[SMᣌ{9ǎ+ƞNG{zgiHo*)$.5xQԹ~B*{ҁTR8&)s~(^}M+ kQ3:X%5xSbAdj["KpVPY%֠J|q)AjO "SP9ܗ߰87QqÀ 9h JV/"+ heO^D~0IO.VRq}DSLQIe݅):G=LM@泟un^SJ !46>l_C*~6_2ٺ6h'٬&Pc@M!@l!q4 1  9jq`;9$s9OX&Id.&_>NXX'(ukGx[nsB5Q&Æo'QA%4BiJ(-{/H+cR m۠U,B J[8E RTH {%HRA 0xZf90/>4;,SRIT%uxB' 0h%cR J LbDJAn :Jѐ @ [{C=Ab%e<@*f?8c =1ăb 9B}d;8GK:&X4_?܂my[*bVv@$5@ @1VpQdI;Qf=9E*m!(QIgFZβ; ;LfC JX&%GfB3l4`ͳa@mZXj.,4X- j;m@}S%dTJ3wO=cz>M9{;_ʗ ICDadU8/ 0pv5({9Yt؏w<9ޘ0ejO>f:">BOL,vސ+3JgG#3)[h#9 EbchԺAC ŠI OH!q19sD,SDh(fCd5`d2/(rAѶ5cuFm !Qqtf#W^u_Yֹua^viWuu Wӝ^wzw _xózW>^ {~x_9ybEzf+?ȟS=_*y׿?œh;< {_|gD|?7yz_/D yW@isԟߨ߱lXHQuu`?ρo_OP!mMlfΓi߬C Pnl;@^=.fl;@<@,)P @ xa 5*hHXE|!E>> IdBJ@ eL XP!!ǀNޠdl ! 7Q!̠*n4#떡TX2n-*F*ʆ< YP: 7shH8JpܡF0pX֡vu!0 aQava4QD1ƋăX!@ tAo6!| AQXQaƁ a \QOmD"YnQ%yCLn+wU@a|AZ0jA=fj^@9aa2$AIϤA:=4Q5*!*1dr"@ 1-N8+E8n% S&/8f&K Z!.9 h-3 42!S  6`aRp" \S.ep"GXh$cpH0_b2JC`X !P2 N==@#N)a*9!h ֡ 85A"9!88Ŭ = DQ .*<27E=`n09 \ eB-T@RR H.+ёopnpd3&F9F24mo CLSb3&`2.d#dcAt }va~r4 a46R't!a"s--¡gʲ%!:R8.!mlԆmjq76a&Dt;h~A'!(bDD"8@0b&( Cl' w%6KTqgvr$!38i">D $bfx=N"-8& ax/buKw"u'"jv| V8`9 $t>G z9 !tw-MN6( zs"-2$"X"kI& u=01/>CJJvی8W% ~!l-&~A" 7@I'~!!VwaD8 `r@BjA*a"X>0M_zN؍&جn.޷a($B<7t- j ! A"&~w{~Tsb0:aa#97Pl'_ LwqiAg#Ds&x#sUD!wa8 ̬zWyhƣtW 3Y-!6麢w" |\"#;Bo}XDxQ:nsŁW<@Azt[cx7Q68UYwڲ !<4rbFo!A {;ox-tY'AVץ\fD&] ax!ڑ!7-a(ԁ1* 1^Abp(D {;)p8R*+bALqX|q>%NwsT@h"Z'&zAaeGZ# LP!_׬C"9[8pA/IC 8f;C*lB8<6d z "Tf?K'4fy;@|;؃ZK8'D'<<()$A tF[` ~B@)([e)wBe )[`rAƃ Trt_b+RX7ڀܡz% !-u8[X`"eXi$b:a{7y$V#k#Hڭ w`O@K>@MzkaBEO.)!Paz'(!"0=QFE"6W'؁A) S`O` d= 9|aіr'6A€l')zBubޝ =Aꀿ{ @^&Nk2:2t.ANUb<֎ߗI:&Aj\xuasˁda@w:^vpc dVLfi[D#hLt tqC'c6fgѣ^?#cO/,).!UaHck>!@ez̵ ̒ʜk' !WZ^VE nfkr"]6?`A{ba=8*'b a ^ FD]T 58Vglujƞ~/@z} 96 dԃ͛8sɳϛ'Ѡ kGW?w*۵o' gkW?LOQׯYIE :3ե%ufd_V>g  @pZ/ :Y3!eM;X)ͥ/j}&SFKM(6N|$](@rؑv(JHC@qUBb"&YHCkKO=gI@yPiWtHLCD|qIw"h\H{31; СR&75F5D(c-ԈL?ӎ dq)PM *AL?uN qSp B8>LRn*3Yca) R'Y!Ayƙexb*g%HDp $Qɥ{Yů*f+c`9Y>w8Q?LJEh_[>_i hc?wHT>ˬ嗼;+1faۏ4 JJٲ(OA> C6⨣?})M&9 N_GdҘTWpL3E%ќ!QGZAK$0Q/> 3eٔcA 8SI}F +e /tY_{\Zɩ;U|m5X-8ɥg`?!ʃy?vwA0s  _PnroD9 Z'T?gC}&' >X5Q<5X5 qxxH^[JS>>np@0<%c|`C@pXwh[@Ha};`&CֲHT 82AY R쇂ڀ 1ߛܹ0D~y^2g'1jH1oy˝RzG> KXl5Qq42z<@*hQh5D)fQVlfYsBQ<g4y8|7 NoMK K[(+Kr~x>0A_Kl0G0AG鍴@_+k ?\ δ")0r Aa0>})L;z0K0J>ERX`IMxV#򯀝R`ۓ9kmze =e-%G) A%Fc8}8Lp`f6 r̉:V -n,:l6L.=F:ѓl9ԆdhGŒ;65,nܡ. 8x;f glԙ/^F~<;_يM*<.,GH}h ,BB` EZꈎ+`l$VvE&5NLY<S%6<{8&*{L8N42Rȣ|LR;j%Q\8հgMk3Oָ5xq[i@-("9xfnjIЎv7 %ζn{懣]7+f(ߧ?MZ\mWη~_CYvIzە'N[| nM> yՎ]mOWG^ d̢&wvЇN[\f7wsP:P^V ַ{`NhOp~,gQwNO˽$vckprOj@ӐftI_Z=?wֻgk`7%nwP?|%>B&}7znZ=O[7<۩+n[x%6I75på"'Gc:IlTi )Y 0`0BK));@;P&X0<0=`#a$|W]u/طi :x3  7K8<(v `Xu0q#y ݧsh؁ $ X"J7 ?$Y p " @ |" Ё3o@ZjP fop3{1ݑ؉p(1(u`1fPxbw@Rp3bx1fp3 BN\Wp3 ] ִuHv]8i.R?m?3 4)" %i`~@ q 4ahKi%(m@GzPpŐe  p sp@S1.ױ  "y@W0ɐuIx`БY!puPP% 80?[ !r@^,u>:`()vpY"$yS#Ȏb#H p4uY ` ?‡ AxXGs30Tˀ\ǑuI)zYIAy TILytR)vUuuHQ7CGPc ^T:)0 ap 0p Ж@P FxWU39 9t&V B4jP 0x01&)Bp A PimLjTfP- ?ְ/p - q P@*EPU:( LIKy3S YZRavjPbz8[ "٥@c I-ZQZ TaJaي@Siw Jm~?mhrp hY@ &z~)P @H:Z@ X &5 mU}mBYէu1$ʼnOuԁ[:[`zY*j3:y[:2`"Бzuxnp3H= ϗW`p{@3 *& " z@?P" / > X6lAkXAM h[הУ۔᰺ uz3pbHɜЙ뺛u [uJ`ɰuٵG99N轀yyV#RӱU|9%WzA dduu7c8pp p`P_]1\ZWѵ \GUP0S"^ P x:{\h:P6 ɋs|  p KM SO ClӇcbWǚz+u Y'Ǹ O1ƅpɀǸf5 \JXaqpĘ\\p nЋ5h? ( { Fl[V/UYŴwnSIqCp:l5{7vvxSXv,d73Dxv܊^ }u Wˌu'I'3yKg ˾7,@8Z\s ˬ< '?[#n?yǀT"' Ѝm} ɾw# &5}&}(v[x[!gЍ%8:uh{@~2=ԅst;J}ҕ$븎 nLD-fuH\ p\9 p ؐhljwAmftr=t-qvl6nkzo]ׄ]؆}*bu8׎Vْ=ٔ]ٖ}ٜ٘ٚٞ٠ڢX55=؈ڪCtmƃf~V]$7ۼG&cO [۶= ΍k={=zjA[Sױ@f@eWݮc2 [FkeÑё'n=n0mVm$-'Ϭfa>a!7bV z"o\.ñ Y$a ̘*e= &!d (J`s]O.1rԑfA0 2a05<. .߄4]\[M85&` gp0py g~  mQ) $yB*r0L46ws^V gZ #1 @ ߣ#M +0sbl>f#7gq ~!k7W O0p92 A5g=ꫛ밮C0Kdsr>^l A~= z+&~b1(vә"F x",C*NPq;& cd *@ kf2 -w06D9:T_."csR.`aO1V"pap8`*/ؾo+=IMۏNԭ\O  X`"H`$qCsqA31LJQCGрy!y3;eQ6Aq0mQLqp8(0 -p7! &GoL?pur'խ1!@,!+M!`qcQPtN' IG]˰@U)C:QsBDP*@*5X)aѯ_ =+ۑ0hD/(8HB ^@3}Ζ\3 o{:!wI=|\TRM>UTQɫ'O>Z}/A5@VZmݾW\uś֮^{͢BpBI ĄDRbȠ%jb6:|ꐢhA #Q.(ΠC`/H ƱD@Jܒz\ƣJ I~ ! N0@j'(%g+QGA0, 7SO?7CJceA&r)}g%lI,U['!n|%)ꎰ{!!}D`?~j Ye6 vA0(g`~l?#5}r]m|ym\Y1{DhGwY)Bڶ6 a;  ~WfoHAlPSP&h/Q74 )rBjJ2郿 юtmRb{ɦe^b Ucc܃>A笻F1awWoZ!6%q'q5GݖU'>*7|3}gU .B%ɤOV6A97Q9#OTGg矇 yR*k,{PT=|mƹ"y 'x"~~ygTx4@+`Pʀ`%%K9Aۓ=v{Y#AЄ'Da UhB+ֻϴw zІ7t(SЇ?b8ěgV!/ؔ9w@W$ZAR_c8^zZ b&:ъz8@*bюE2яd QYgĠ^XG<p ZjЖGђbGAvғ 2lPXXY%*r1yr$~!P!XGr P-KV- a[[v"s4nWTZ6ەf?j48|eQ9X!=|(/6dz--(:h /+M=0 nj6a$mǟ%Gu _Yh`>1Sb5#u3L.MT:h0C d8 !m[{S!,~c:{p䛱(Y%:A3,cP%B}<4+?px(E;H:Ng4Ά+zpP:`zC.7AdfDiaِ:B, },X/qo<;J͛M wYB*Pq/A 5>'w\Zb5kof<3X\'$c5F "j}c1~0Âa.}C="d8枻os4B{|! %>D ~hhq{0E~م!P"~Q h_ P)0#K `Xӑw@hiH<:ϻõw(5 w"(eChs8xL(=(; pA쉆4e;>D_k(>9(k93\__ 2D=au=cAa(0`h=P^ePI(3oÃne(?[4:tJz0H{Q04; Rj@8˪3@VH sxAO>hWLw7 >[h4}`z0S ښM`*n4ZFDCA\H]0d8;}x;8Çe@0 2脚P6>pAspqIE;# Z+ DJld(JH[ GڀTH } 1,V%CPA4?Ȁ!H(TZx=U?e({Px"XBÃ1(] 5Џ_Ȁ(X_11 ]P Pƻ3z(HcDw?DH#KRjxHOs*IX4hz 3(qp}i@K[ʹsʋ9ф(N2!>ˬD7(Tk̴>)>`=z5Aesy틌6F\i INY̿{;LR$;C+8X6 iИd8;hӜLNz'k(J(Lx}\C4(*kh;0ćm:8O h@TOPJlDŽhi(z Ą|T4G<%m " NbT  eC>*es-0CC43l07N r(|@564e+/$[5@5ؾCHz !d΃$ASl넻<!uIyr"QR&5UE/(|m̉1} );C(X)W_ ROx؊xVO寫/1$5®SRrnoR jQr3JaUpevuRȮVHW$5{'M{~Ekhu!jW|Uؼ89*~؈؉( ;]؍l7nّؐ%R!rؔ'UϑuYJֈj֗,ڻ rs3$Ulm؝&pRڥeZONyL @ٶS8JP0sE *U$mڴU ҧU \V؂UT8r [z% T-uDž\WP$-ڿ3 ̂UH"؁Iz p H|!G IJ DEUyZʽy4hUW XDȂWS5W0TE4PTXWPM5hS8D^ AI95F`8y 0sr) 5G^F +P\Hbx+` HKS^ T(-V\!l|8k&bXBI 8W{} :.kk' "۶޴V_T0}T4VHWS˂ f]!H VU8D]V\*({=E~PY>`ILۅ琂1)*,P%Q ZȄ"Vn۬buHU%W@fJj( _n!`顒kZ =Ё(hlig]pS&  7#4P8vr:< Pi(2 .7Yt8Fޝ+ӓYPjm( ?-]4^uqި~0ɸ"ՋIԁe %\| sڭ+3o 6oo0,0h' G&r8)p;ؘhW!02P (4; (Oɰ$_t"yNЀJp:dR[hx!"Ry'}` Yh/O-78$Mj?胠Td2@(yk{k>@B>TtZ3 g 49ȝɈuDbdLh)x`h>h^widYqO0KTv_>H8`~|L0YA@ {_B_ߠw{G]qjiE>@(eeAd)Xt!?vxFvQNh#[#+/؆|7o%Q8 ~40l])yw09RNe&y7!8(ii`هwpv 0r:9P8?WKg}':V(c PK}a}捚{Ui7UM"lj+pCdXd#QPSؐ偈i~p8|O:~˧B-da~8R.3HcF>~}%Ev '`GDS{b|ul)ԨR^O֬qϫW^6(k,ڴjײm-ܸrҭkլVbW5m7:xCDŌ'Sl2̚-+ DLPC=5K|rVT mxH:Գ 2E$xFa ́t t~0T | "#q(|S7%F?3n`Nap7}ԯ ϼ"ވ?a(e|CXi YxQN<-BuR֪STB,+~|0üD!F ;{] ' +U>feq4@dQ!*'4i*|RIPBH C<YK%D޴4 ) ep)?A i> hܶ+y0Q>u/q7iΧ>+h-2Z)c(k_In˗b}-jg1P 4 ?mv6lL0A:pR Bx{sqlvPXk[n@6npڡ^w}H hy/fZdGH1iutyێ> D {ۤs_CtS 9; B j_t|2:p6+E>fö">E*Sͼ[CO|> g(.sdC:9+-`~?!i 8\C`0> JUZ[pEJDDU?C6;OB s uH G\Eq =?Y|[>[ C3 ` Y<AEa !!ćL@Yl@8!<9!p/1@>9/0C 6?<4>ba#x4K )"D8؃W_?6,D4(DM"; N{܃=;2\"&^$&du#$,Y d?YMK¥;H))$_\#d# 4ea>&7榦Idoʱ$"D3Mz`]$(0= tDkf\&$D$D &5N\'{{6Wvٔ#[l'Zlfc?()C?s$i=/C>Qr\ D' XYL_P o'vY}#qz}Eu(> K?#OtpK:F(p&cD>l}.)Ju+՜Hr)BB"h' ʗOLB- Pݩ$;/,EEF@kDВ>LBd.F$T ~'LN;xS'.*/8N`@D'?yCc<.HF/w[Gvk2!o?o0OzKOcDA;@9BC&Fx> \kx 8kHn).ߦ#bKHO-pDmolфÝB0 F8x)pS\MRC(T8Ȁ8a䰭F7tC60q_.ηyCED6b*r!*rgғ,,BXA>*d> F34kM2t6xÝ*k&4(.@%3j>OG|DHFDxB/(Ec2;n^'>`dXr6jT:yY^7Kbjp3?s(=q3XF=O )`B/t9k%(n(C_4FcVGD_anN/(g4I4f뵠]DajaYT*LWcM4TqZIOC_q:4ffQ[h&uZM\\>'OWU<|>Q5ZtM4bY(TG5 )$[cVB/Z@L ^u(:a^ob6uNObz[gf\Vgr5ZXA+@, @+LvY*)+@**l*+hg+n_'eȮ^`f/7s?CUlYdA+) t@+Y*B L BY"< <\B B <@PBPŠw`(Vp(wsH tQYXB* XDVcDf,}sG8*%~88) sXB"B @ H++lx$zxXAs7\d%|y6 1l}:M6 ͧC7du8KJ}Ԍ:\ûJ˸ 68Iv2{vk@,vRAw* B}3d/D:F+}g~u˧x͚2x4B_QD!1 zEH) \=FsU@$_%;8ܼz=,C kg݄ \ DkKh3zNzd%t@vfu;,cBpAÕPH8Ԑ>:$ ?8C9!%-RaڨLyB8̉|=LX>̃:P8Fo:P:,/-|,NBțę;h=ʓJ;z7B~vs yzu~|!N  ̰P B}N'*}M!KaWC l͇$l/'ؼC!HAOM2܎Wsoc4J>(/d?HtKS}tl΂=ü\?SE]-|J 0}3V2(㍊㻎d  PBTQ/X2:;@$$ < ^·M'..IE1dI'QTr2E13-nH ,NPK,&UiSOU^7uӧk?[5;lYgѦUm[oƕ;W-UVY+k&%F>0Q M199T#&$ːKgJ*)zWB|"1 ]$ ))0ͳi#Vj6fDnti͝N%r q2ߤ#׿Svj"IJPl׺ @ ˤ{ |0 %b$3d8㤡6PrGI1 LRLw<&{(}C*82IbJ& ̑8.N_OL6x#Q#1o;s)l&?A -C}*KzB ; 0L4KO,H(ʬgΔ%#A`P9Ǐ(d"8;OS#wV(P ÃJp"N](LSV68=|q;Z{:vw*G@{MT}7>X yzQ 񀢛kY)؏'&'guIG'JǓTQbfzd^D\MiI}xşsYq_ 4#a!!zNޥTuYU%!P*o@8ۅό@ct=' ~GTVѼw+AM\+ 4ulȊr |sԘ9a\FwfTׯ)Ć理%CfiYZ3k̡! tׇău00xodY!>b=mL#]ORЖ?I8r铣Hl#` < #H$-5FqmX$Sp5CJL 揆)<@xL HCKX)\U@%.f!8mAWE,n1OCK 0IB.'ŻQ^PJUt+aKYΒ-qKX:&ALaHH@qt3ӲAŴ5IQ΋H 4NWЙNut;OyΓ=O}?:Oy)NRQNE1Q4bQ|AЅ97R-uKamV IqZI/r(OTE>: =N9uyҢNUU_:DzE|WH!R؆ ᩎmc^Z{|@8th+=up5a:SyMciŧ^5:\0]|G3Ex2S}H?&;`xgG;dYv Ӳ,?aJ8.6 +#n_+ Н-:[x"t5Yη2BƛBdSXq)yG=©rm͇x@NGVؖx oxLv6 E`< -q:Qq( @mo䕾uh#U0ا(Ȧ3Kg'g(W h451 ^as,]XW:=Nљ4JC"5]p&CzX3Vhīڎ+17CNQ.+~4ȇ%.jB8b\]^t 霴|WN|IE >Nw ls-2x&@B;P@ 0-ibPyAKv&0dhFnW!jgޏOhqj{4J0tsynx.Nb4,bn1M4iR:62("xKj#eW#m`@903!|k|Pxcl[ ~ytcMHOUNP 8>sC>Gqnuz/XQw~gOA4gz%8 ")StډaE:ņt?w"i"M"x4+@ ZaMFn} dDZFL ݮ D͂nh"02p.++D& +I a!Vza',` X-oL3X B p ~m,b 1axMǒXH$  1.@hah*Af$+ !ᶊ a:QD~& za [L U T,x!Ԭ V!XmVfAV !;!k!oqQ\\Q(ܐ,+ J F@14h-%D- haarR!!!!A"R,""#32!?!2#!"M M!R$2"%G#a&iR&g&rpr!7#&ur(("c!yr'kr%)2*r*"(!YR$+ /zg! ;flask-debugtoolbar-0.16.0/docs/_static/screenshot-template-panel.png0000664000175000017500000010544314676013405025413 0ustar carstencarstenPNG  IHDR@hsRGB pHYs  @IDATx\S/$!!{;Ep ޣZWjmZ[W=**'RP ( ^0 }~G#@ PZYBJo4 7F7vá@ nZp  @'λCh@|cX{@ 4H%z5,F !pj@a(,d3<]"&SSWkj#p@ N bwGtP_XG-I7 1KJ>+K3?_Ib W @ϛuT?Ts -=@\ť)Bz*@|Vn4RQQarBj#n`P\Hu@w@*h(rZZZZ lvB:VBWs puj@ U9 vtu˺mJ 㠥U[T$窳sUYV uCJΛ{uÆt3d-*̲ zrR6LO=sngz2@A+644RH,{I\<pP}O5)'?vx"{+IȼcO'慪B\6@Urނ!n( ׉ y "DGWy 2(O7r,SꦃhY ۸FQn^X::\LFR_DHdjWh%XBQȨ_Urtn:_@#{Y!qz~-taHW'SlvmU @##HMCCM>B3p>';~6'ͭQrwX+G++aIEe8efimY 4B:.|ܿ YFg0ŃNj*!jM7@VU8EGGz2eZ\K1"t[sb/+zV(D m ]oo@/nL)381QE}{Y D!4 _8sgΉI)!Uus+r5|NԵT;ūwsr^ƾ5훙k<-> ffgLM}O[}榥ƿyadciPj?/C)phTE*+m%&`gF=KPG\ҳlkk0Ub@*"Xr<-[@ tuu)}X~~>) FJrs\ M\D*⿶T C"ܘgFCyyȼU7sGd3~xgaebHVpܩ?C.A: %>^Tm\"]t"ý}w@NLl+~޵c}wA _2ד[=>0hL"ZpAdJdž^7ͦ1'TF[W6ß&M&Stiֈ0AN WvGۅwv;|2#,W@Np8r0j?}fqbqq)|GHΛTp|:/Yj|/!/BiQ+IwZ|d˘VtDP2q냃sMtϒeNQowΰmǏ;:aȾΣǬtu@@/[7Dscuxx^AyWyύnviqꯃO;yK%k8V~`G/-$bmϗ$|Sc J+fR&gJ_a2A$UTh n\sS5b睑!ܲYRpqDz*), ?3ݦsȍ oeP" n?_Gf1f̘-2b񤀆[`2#ɓ,Db%m^o3*Xܖߓ=_:؍LIt=R/<;!ΩеË ΟZ܁jITDhCEynlBb*WCszIX1ƃ=}y}y%RhAisR$::Qwᢨͣ\=(J@&E4i҄:X 7qUUU)(Q|ӥoIwY4bUrHUe+/^bM ğe#qr3#MQP ԆoI΀V-jFn;5ׂLNϬᮯizQ6X{m]FjZM h3,Y®w2ߐ7/$f7gG'"Y5RScYZhii#ʵ/zZPtN#^JTp[~OD. jP(NEE ̤Jf28N/W^.Q zfj[T67V g T0Цf*\7lmض$-o[#$3:O+\Dk@. sy mNL<[6SSd %0GUmW񋷇N+wX/;ӕc:$ P2+?/Ys .gL Ye>TiiO;,_cwPѣ7taKf,wvU![״ ^R.H 2KjH=Ha D\7m޺iv䜮={u pʠ PTT rynJoZi% U_)r+}I|XA]F\ئ}fBDs-UҶ+)BS9sj]xvkעkZ$ Rٳbo] JkfPΨIQVQzYӏarF*m1D]?劐q2&S[ e[#;ύJJ& Fp*Ô4^K\L6i?'tG>heiF`vx`S g"b*lf\D" o6No^ӰH32թOt-։wW7J뿈dǑ_\%3=0 =S&(.M&'OҼ"{#6R&T2@|:]` {>VXpQujxw[Aq4Kj.H/r\"*{UeMÝȱ@v>>_KrWWnUM\])o$4ܛ⟎\V. h7#kgIk vv+ K$n7pؿؙ~.6ٔ֬T PS٥K [__ӂ'q'.<++ ҂*eSrF&8@٫"$ZyI^YFƯHUAӶRykټgЁ/{f=]] m{z8ό4*Ud/Z8xԳ ;ZF=êK jyA։;&&&5kx1NTSqqٲ e j@;of7c iI|$}'܆}zA;^3qEWH8mvR!T2֢_:v^2OwY({.=KGȴ_vi[R&_">Ȉ 툠F Py @gmWly>Um+>k;UjɁkHh=:Ըc2IQ7GɥXHZE3<}kO=ȫ]?6u'h[Ӗ4׵]\4b>V[9oÔZze)ԬW?l_H=ls,o.,b0ŗj"FUTf&;`\/ŝZRC&D#/qS#jKg/ %3-Gd~3ŵ[.5l5Y9TXxD_蛷n{uR711akj;* D%Xw8KoW\ Zkb ;lrwumh_c༥8o7@FF s@@FFw#a`.@p@| ֜}wA"~g/ld{qqON,B=PF P?Xvx9i ď4z:B,FJC&λ: @jXudwy-EI}ETڵs/+j8 ڀCvB B^'J-?>vIvǽxqvvoS—pڍ^w>!2AfX2!['S/ԅݹw nu߯*|ԶTpWҥBDy༕g@M(lGjwcOlXLze1']МZچ&mzv2`!lyǏAtY'U5\kP˰AsK\dԶe?$&f&6@$Ҳ16n8C:7lɝ'v8p0@3t Ysڀ݀o MKGcO]b-]3kFc^N3B׍5qK3oԡsw>F0p@l|@s.ߧO+oK٬?` )}gֽndۃkMoYs_zQe༫  &|X4CYRćp?C<299mE(fgkKdB^/h){$JrӥϮ]{BJ``p0@A9xF]:󬫇 Ư3_[KK4 #~.?wjӢmotDŽrѧwZ!!=+^DbIrDĹ83mwi 7z,8# H*_$@8z8fagw%XV mdbc/"jkcwTMW $7藧b< wwgG&6~:#*i`B|A`ju_QIJ':}>^Z:;jZ[<່VVR*'λr> hLh*w=hFcstff辽x91$şGlX|8'ճsm {/Q#BJ,'iѺMtGDYC=4yvvGLjykߔ5CGipޟ#@FE`[k6=>B*H'bOrYtיVv0%]ʷad8Ghx5zG͛Q=cG=ϝwΜ:zٻ;c]|yUԕgZ7bx%ˑ @.@PG_;,ۀeؘL(;;m+.`S?,1cL/;Vsgs*''7q2}zv6xL1NvZ\[Z>}t1d]\-;[as%  jO iL > vСzqĈ+wQ4ܔ3%o\j%H2lXR*&u4Gc&*{c/5~.+F)~R3!uvqYbEfpx^9q x$`9@8F4Μ7 7X @$~@ odj\>CD7QKZ hj]xz~&MUԐ[^m*哕£͍ZB,mmLNOkB1Ԣ \  ԸFPl,B1YErܘٖdPnf -JѮ4@fB@w:"(|Uh²_\iUWnQH@#P9ogOy[57w"_ ]s[wg;My!~a_gXM};:aM܌\<_M D~aF+'EԐx՜2(gL##[G;=5Iy*4qrs6V/'(wQ m*4]YswfX/Պ<ӠSfXD@ ЀȻS% 6oMhqNm`FMӾ$bJe/o;b<\T?˒/ci2w3s̠Ŕ>sic^.VcEt]xXwnΊ?2Glμ8yoJ08ǚ.YTOR!ZzVS̋ 7`3G[Pqweo7o_v6'mFSپi?U;[ fd;yغ>* D@Tu.uY"_RÈ[w^~nxRVbV\uYݪG8-jE"潔魚K O%,t#1nl9ޯoʣ.~.DMJ=9Z%hE OP2Qt#a"ˀ{^/K<_s_:,:W,˕~UD6p>dB-!5'׳b,~+pfim@$PFs^'7ҭ﹖Cd)AvoMe1LR <'nn&HE8إ+u~1<1~I ֵ\%r< W칱d[.2l*)'$a_`٦-^@M%,;xwcb"Q:KMye¬ۇZt(> hOW_DvmvH-J6SEFB.LyKIZR7$\TfYx(C6@4OH^aRD¦1)8 ㎯u69/cq F?AZ=gay6Mrl'ZDkcpm\ːtDMu`5s7e?c%ͮΠ!dڷ9yUGK$R]>=NRI|}͒9kJW[\ $c"6H1{F#w YƲ.a 4numhdW No!mqRύWb>o9M<$n^4j^ԻC^ǜ%ϝ?N1Iт3հm#JM &N)f(b̜)a_#|r\Ubd2(| Ponn={CNmnݏ#lԧ~zfliҔ:;Yϐ%;*B<[DKIg2Z:ڔ6tիv>$ȓAh܀2K6Gj2ܳzixR\& qDJ`ƏC}y-tYc[L(mj@\s;:+[s韃e1ݺbn훑36mI pT\zeRIZ兙f2#dtTQV&iR$ Iכnj/'#C',77ܷPB>Z˕@V!S"ml^8=5bjS.uqfۥϩQ @ o'p#C7[!TB2XtqU/+n# h _v`ߎ1*xNpg/^s" 鼬䕨D 2TUP("j!*ti\$J|)DB DlZW.FAZvvv5fK~|bꘘ73-=!*8ޤq\־gx/?W& {CxEMsS+R9xҔjV1@Ǥy3S/~/1jV=KR/YQ\ PkB C`eV:̷xYݯ ;I32:_ttZԩF̒܏)1WNd|71j}v,Pyz1.4xrċ~ O*ãXvY<{Aq?c{Rh~6UĒ_^.4^f%BA>@u$.5 - -X@+zhC2e^.∡iiG/_PTxT^~9\ fEmp @MP(YVEWQ/w$ +D|k3e1Z";G;GW3dOv .EPҬ,h?PU:e#P!@OchhﱌM)D 2C6\iT9xHWn<M@ m;fGMlЦ{/۰5"c2V4GtWn-t1ce=1 WmxhAEs7$ʣu~ 7ߍ*|Q]_F ={VP Rh@|ЏKRQᤦ3/!wv<]r,iW$@N.NM;czu).+b߽{.#& ѭ KkWmww?'9r_lL Lr&'NCjyW@r K+P6vV(;6!xN5'L<4PѫFJѥٜ78Fzԯz86ԙ.3K`!@ @y@q B [Ք<8" z@>|dLk Ajۂ_jE @"P*XGcJ2LG)Qp5E @񸼼TU!gs%"ʤ3DBb.u qP]]$[$RQ [Hx} :*lw5`@(O@X\"3ĉuh*>24AA숹H;~B&,*RTޔ:w@*@v p'˱t8u/cP:Zi~93rTRcAAc@ k/aPc/G4Wį^p ~5@ P " J`Vfi JsKHJ7in9a[\ ꒀn]VUօ T,P#BMRPc1OSB,d]nUMCbil G%jO$ʈ<)9]xT:λ6N RJ `OVϡDTpxc B5b /,YY%q$_rC֬ VBmcA)@yEGWtTil#i2/A4Z^^:^aYL2W5͛1 f͛7Wm`UZH/xNWT U,n\ 2@ j@Y;%P)k#/^a%:͈L]MuEq^u5,i2@ Р Tyv'v^"%H^>'yߒ476u 9n~yi'3j(٩unH`}tqݐK㬾scoHu 9LQy9UՍDz}ޔ)H&I aM;zyLz(8?rZˉ~TƳni'3Iz_\1gwzudÈce|~ypgcL֒$jm ͲUF }tlJxU,8gʿ#t'?G=nS̢sձmDR k>>>_SK-uvy{&vGܪ G8(u">{H+A7q,BGOzEԴ!gF83U) ϽxHĻ=#m_x(}p%DZs:t ƏԟDLzԈ= UA\,j@e|7@_>[;=C`CNtg6]h[ t֔Jn 쾑U>;cx[-5?&' g6M=Ԍ-dqgIYM@J- EaKJʌe]k5pnNڼSf3fGgYNv9o+"{p_(@TAXMOrg%s)H͒[z 5=5a2hΛfs22? 2ȔE[8g_?n.%Fj_mgY~S#q]:LbQ;XUD"ȏq6 gLlj;UҖN;uh8qm98..?g/v`gOG{+2Um̴b]{>;c>O~o.)Ut*]Ե͍KU+|vNik뫕ia ZR- @l^Uf~rj^QOqϛ#k3IΤ07)/,4 vKO;i->ճ0a!TuJKQ4be햦Ws -LyiaznR=7V l~9f-  Q]y{KU|ek֮S" PMk鐝.]ſHe;{ gw ؋;"E4u; '@ @"0n{ݧi-]e`7 8uzc@IDATu1011ɹy,g>ӷp8׏]/, 螓eyRa?^2rߧgrō\KAJx_@ +;o̿:1{7 6Ax7w츲ly# Ll~; ONmd.(FU}:u0pԣ#j‡},{@["own*&~B&vfL^aNLB2[)"i)J_D"Sd2Ug<>-==HSCMKOMR x3n-eWbέ҂J@4"c/p7؍WcZ6@X7b&\;5pEW*,IicbJjdGyCapM2l=Sm{ӹٯZغ C=!qބ.2hy 񊴑Hn?}^u[ػwM_w-ʯ0p4pwKM:=矡&d&L+&MIS+Т=0oDDIuap?^a@MẺT@ mDon8vMԝq.1t]%IOnK'|,,M ]A0j7dD[[?dQSnm-֭};%|b a۱=숸 >B8D :-Zcco',Voky(*bۦZ|۶ݭP~ړke">V4T$M~X︅qV!l |>\إg / \QCWV U @ hjccŁ[n$Qif8t37KMSK tիv>ˍzsիwDShmH[a]5͝;OX8V!YhԄ2czʘh9G߹Eƚij~n / VTovUӢ;ꯛP @. 'PpT23݃'K ?LWvS$M88NN_U-h~э5GāB^c&;\Mhzm4b=Cz^Gܬ؈x@ Ѵ)+>ݷEOBZAK1.c`[ z>oo ^&x)vq]aGmؤ ?7R]55F9eɇ9Rc`HǦ a/t tl;v%uilבz3ꝯP^մD)d|еcJx'CU]Ukbeogn! bo |m,"vYFTӰBc{)/7eZufre*; @Mȼ$gh֭<;wqҥM*1X]WM܇L9/֫ K{؆HLU|cgNؼ,IS|WfuAV]vp9η;^?(i%:*H8P1/?|;mKڣ7/yV&LQzyDmZ@00G޶3"ފDbM-e}](az 8UD5 ?y!@(hhѻLƳhO$ާ ۏe5TIz.v~C&2(w?bg2400$O-QVe@ojf`+ bRYϼu3q,;ʙHZv>z){{ҷ  uzۓWMlʇ,a&IIBzXPݦcw9X%#Cuꅟ hnig'*xOX$o: k6v k1 67BZku ( tɓʪAU'9Nl^uvΖ)<*1+OFtZ卅\  RBV(MzJV1%R&cb,e<2+?1VV,.J1!/dujK=wMU6/ 'ɻq4\T?cn6r*$&ttj~ :U=-ϘeG߸꓎aS]Ͳc3-Z9U1V~ZVSp/:)y@4WCvg}|QHxBY *Euk]=7xɭAo0*zry{/^jRhBe'sFx{{"iڮ\|vgwSήrU*UXҙ!^vc)ƿ'ʔ  ;.,z5'J 4bR dJ.SLIpټ}>Nj XGTBSGl*X@4ˤхw^"gh>{ժ rPZvr^dl(@&=ovľUi47u(}gLKyɮ=NIaRںԈCS]h4NJ΃#;h OmdaT\$ى9NFT]N6D+᳉>u{{ZJϤ4b SjZJJZf}+;?酬"89-&90{~#|{I0!'#lꆐ-FL_G @['%Λs߸ݖG]o~Y/|ށ407{M,(?,By6o=wO-/aZɏdz7Y5R林eaѲ<|9fСxIVoi=^~Ԯz&c٧Go2Z}b5,JvDj:uu-SYłe;<џrYW85ƒW0F:(~Fd7@$P\V梎.WUEsއirz=csP|@߯:A↮+}~jTŃ}R߼) pt rP5@y, !l+}` 4\/}TD7hEp9\y6ALM\u9#G7*z / ܎Fޝ9\QN x2)KҧϷ>>9JW<`w=wPƨ[˘e?R51bWo>@{ޜx{nq0DwF/4uK^O$=w= Ef}/oY@)-wBB?5]dSMޤZR‡V¡Is22=L`_O޾IL$DhKѩtxq۷Kˡ 64O㐋U;#W]G 9J|d=;IEߨ ?"5VSrxB hlY#w][gngX09~wF{ד;r`򢿓9^u\\~g  ']Kf0KioDno=eSM1;ug*}SޓiQ".]G&txZޓԖK~?~nT7Ƚ>5\=$ŠcЖx)_8Oey?rn=ۅ}cPOdA Pr#.~rGߙ>C_9)VлW]vc-nZU )@FLg9lAjj m:>dTmh>k:SS's4\GZ 92?3壺ՍE9ZZGMM F˼ҭ>&S#ꪯ(;')6 D e l]~vat:8T>ScIm?}Qhosc: -}r JO>3dUs4A ǧ EDvi)>;cQm&ige+af)@$ā7F@W¹os6q?tf{/3xWu_}VivHyrF[τ{&'(A@4B*mø]T2Faպ֝V@#P7 @wCihjoN#=o8@C=c<@C'M@#$=Fxd  ? !pލ@ mmh=@4BU^^kbBϒlھUYP!-.5*;ّKᲲ$Gbz58|]Z *Y@cǝP [;$T+$}gɒT{ ߾7ر}N UemB_](i'9YKAa̱RAA֭u*M,Mګ^K$N??!c^'kWUsrHE[dHMB,jr{* uߴm}j裵3ź] /9GQ1;ٹ: J89/.,,6 Bhh4<31|L [@yf8ޮ/Kik)E&`Dذs@F||MZ漘<#07qpJK{<(i >O'#p u@he ř@}L] IM2d<\ꋊE9֣&0s#<^~%txE7oƂ9:8,8K?_pUÏ0weAגּ\~FÍY`Fk3LC"c"õ`)J X0rCee9~>t_j\q Zt'2mt?{pp+r ;"2>0oCQ6WSr)DUj2^xbӇ`}ߡ(RL`2_}}cGQP_GJn:/ƃl`7n&b^]6X⫤*K\ك0hȫ]@TPdee!#5++BO wHUSGSU'bWox V!~"d:7;hu1HTJO)59RV^#*XY#ԹO(\9o}c֜i.x(sξK7(c\3't4;"00pcwc*?Qʌ29(X4LB׳iMs&qE2k^c!I<w(ޖtTnHZ]JɁsMґCT#/Yw|^ZoVXBG*M}V ںFH[AOo6Xz>(wNh~c*/)BfMf؋V=ؘ8JNUߨ:DPβ:jw4SGu!fddUs, a4Fȼ#4xsJvO7ZIX˩;#cl4]_rȸP gp,h2KSL?j{dBW\L$20ܧ 2!!:W$_ebk}ӄ?y2>Njꗕ *?n{AۼD^Xų+K5/y{bq`B#d57_WOJL(4E{ZxlHDh_?JɑW;&a"u}u'+~{4e@Wׇc3.k^yߝ ^CN]O-]9Bq *hw KK-x] G7'bk}SYL\S3Fak1V T hwLi꾙OrbaІh)Nj}~d煨F P3 z0Ј,d= xf5 cSBjGmU:h+: (޺O*p؟3˪֩tb}Fcd^J"$Fdp\9'4֐{q^/ng+V&ZeW٪CM4 KYn!V ^H݂ ek<c0^%a<{8MYWRZYZj2(rAA%Z8NAB}ʩjk~DDoW<ƍ:1 O_YӧϚ<}ϳ~x0>RHǡ%"PUA8vFޱ̬(._@n#4~.۰b5jQMP,!XYV9Xl}䶰0w{Z0FD{4P,K. 69]^S.&4hXuYuѶHxY#vINNO!!fC(rj'p;0NY,>DodP[ևl('  CN{QQ;$B#)h~oӵ"8R X<8j3{bB(Z ?.z4Z M\oBVঊ6Ni lwaSNIB%7zo¦xNfzP%Q] m#sܶkyv=j JuwҰBw,Т~,FUh:M N7Encw4o҄oB^ͱl2#rzbzGge%$.~3hqk&3׶2jۢ/eɪ$ڀijOVD$`а M'޶ד]^eoXܧʐf!92-e$V(vlMVM&QzӕpRgkj׷v-e0ʣ Z[mޛ}:D%Y-#iaWuih$#Kǚcf!3@ jLn=:hPMU!0B[%4U.ᐖ""%&qzFD3Br#tp'l6P#K#oWhRfC֫kD[q4SA궥5QJb!rbrjKUNO{m?JVT&0VϢV 4EîV4MHNz=rD?RUa9ᕕy7S~qŖ[L˼oEms_k|?seYinؗ76n;S3F9ݒ.۹z[.Sz ϙzq0i%w+cz 7}ƅu{#|wSo+M̔ jK{7<2{%SʃxKLvL1BGlZ4E,=22dŞiB*Rg6] d>xB+ ar8̼GN"v̑dIk[pX`lbG=ʯ%M7tNSO@=-Dퟶf ^wgϽ 9|>@ۏCӳBO0BDĤ(YhZyGd c@խ ^Y #[a(,3H4a^&f)ĤL-IKOb9Ɍ}G$9 1Uc˧b^ uIF_0%m$'AUo0s\'8X.|-*%B a@,K8RB16=zFȉi_ugJ]`pp j 7*ФMzZzAu؛$)2´FO`n?EOc$76R'+h0+:+rr3s9m;x Y*Uq`.]RΕUwqe:͕nk0n>2W>A̤r$uɕ߰9=mz[vnZZnV wHb;d*!R<9̴ۢ.Q%9}?22b-E1ltu{do-m<6tΧI{ M+wyvym${TX^Eؿ3e=& ǛMfMEO5UWױu/ѫӔQ|^}k!h8At/-XEEj\DJyl(ud,c&@I!ӑk: Ԃ%;C>悡j$!:ٵ}{CW Ԍ;r=^8aɦwnI\:J"d;;İfRb{&uj7ndpHZ%aN5l|gYFnK` vzzzRҿy?6N"jhS*}OxxX=g,h&.ZBdα(gY)E|64+޹nlF>LCFt޶3#}NTzuREEHvӑ'xa܆[:$˗ Z"kПY::` \_BzDO4QV~b- U$D`).(nVN8^PbRF0`M=@U 5-fkiԯA2$֔inQL>7:XBFYwTŎYkՠuTFL]Qݼ*| _he': ݢdZ:lPk",|VlCEQi<8ш5 q+BCa^6:_%8dH/{Qx'Vkz6Xx9w:O]eG}]/)^_ZyGD_Rtu_H#zcG4lZ7 ]~b0@$7`=M@6i_֤&HFg ^<8GƵ!iN܋@KM-'_ LS><뼍y> zo kg"9Kv:k)4Ε=aՕ+S*yRd%ӾvR=hWU$UG V=٪*raxDMY=rW;neͺ$70X_F#PΝ;d -7l~-iI[.լkГcs\g<̞N/,~pi*F>y-'w|ao UF?,h)9EenL1N~5`lԖ Qp2g7'8|q{݇6^Ez%/ķfͼ%[PQ?# ׯ9r$W,p8MZnIi6`GLoh%>_avf㧸$2Txt‡懒|aT%EJj+6չ5$b&:ӊN]x3>NmFnp/ǁv7_]9:lo=Z/4\tq#70\8?cǎr󖖖ϛ I|O~H/5زx|ُFvl҈cv@93srPeǼ|WD#[3^g@DULm^^\QP<eKTI5V;_U#t"b"h|jsVSIjʕ1sW m}ldvwɉcL2?v옟B ywK hpټ]Գ&|o e'!e2BW*bƵu6.nc<]ǃxQGţWfWg`:|_xsOneqyH4Մ]Nŭi6\Rt_w8sO 9fݛ2rU4X8GLl瞊#yuJ4]fƚ M$4ᅡDx_RΓwD %N%;zW/2 XuWT^STEIWT4/K)P`8(yv#H0}K'Sqghe5V3 UpAwCjo+M}ȜܬYJ@ C //oΝd-&^=MZZXo@s7Q5&0 7:ٟ 'l(!CS 3mK֍4FjZ$%Qt?\= CsW g>81`IG&?{cӟ0 :&)#}?~ eFl ' k?ވLYb^%7זSSCoᴼ7 ggG\ḦJ#pul"C*I"ђ1݅,K3<~?jv:! z``.m4ASF*NI:nE`.GZo޼񉍍Z۳,(҂DǢ|#ca bSJhn sM8^;};SWёUłMR,\<̆Z8aڨ;mw_k8Թ' G@BRL{-hfcڈ w6 igmH72(F!B6'3td 0'-˽جsR+B+.8؅\YU)W=rFb^ *|ieee0N. ` 2آ7 ~<ӯ=Z e vg.QJJJ:o M2Ѕڭ97;:|x߄˒D] b=оjP?tH*кCu+fd3jF4-' #xȬKP "  % )cG, L"*Q /nt}@SA(YO Qh SY,f",B濍$UHBF0i7s}?CiS1$uKR:8D>8:8|;]}ٽȣ$$X 9Kn@]N{al܍;(SɊAF#ZȨ`; NdIV`Kj(;9YhW𛃣_jDe~JWUЎ§k)5|a:8?PU3P!VިڞuQ!3](/a)*$mO{|k5FDFFvZd!"n>w26x,ֱq?YM2 t¨;o .n~+"zNP>X=Jzx'ede-ňY!vͱL'Ɯ@KfCb~\1k \y0?Q]|<&ac gsYi7w_aXLB J쫾1' ;)333rP|zv43! d!ˡZ2?3/ځU& We#e߻Cf1@FnCtPo}Ggfbpd07qEjr./s$=JG;ǕjA~sGn\6VL4"B|r?XYks-<}fo"TbRg$52%1sf If_K?Vu IDATd}ӳ~ܙ\oA ef>E|+阫#cqG⽉)-(dZG.JQjG4!dZjNɰV6Y Wg^|S-5 mpHic?l\BXPWWh+Zˁ%°CPkzrZ55,JEO?ZZdjq/'-(on&΄W %5Z[#yy1YyybyԍS8]YKKÚ@y55bl\@*b+4R!RAA f_&bBTȀ*EUGH,tRc63/1ƍ n2W6L\NNhN|Q8V-\C¢Z~ĭēp!Pc[?MtaIlYCI,)j4utNTV\B)9MIJR:4ARMH!K),)%QZ/aj ]n6bv eAm{_T\N5kBy#} S0OAð iXi*q "7lCZ@ͰV8e驥H(Y1B /NBªYى M@ƻ U,/+" NSg䋊cZ>sxmm&®FuJ'{G;2))C~vj~RRbG'BOs;Ύ%e0HPrqQ;Jf9G q?1%%$%;?lP]*7<\_ua]AE7s61?4)TcJʫK|ydlaL[ElU]z@D%b9F! 9{`*4OŎ;tO2rA!.z3 n-zvm/0_ƛL`02jf!kFԔѰ5 RqRE=5c "XQhEi\ke6j q8W_ F~ttd!)z*)$c(Rwn>5{؊C`8F8F##VXHUh\6'#e~LYeD^}?Bws*#%U]ɮKK1_$露|L=uð:T k+y:8@_F#b8x7΁`Hicٲ;uD`GK D^!w_tUeuk{-Zl3Z% ۉ`oFnIׅ`s ce3@!Ckݮ41L !<4a0@E^FIKiZ4GJf$k bG[ N1*IP*ND:+a@J%͂[j$4ZEăD(NZ~A%P5t$.27$0hk8.U&Cc|:ƸtF#: gmZ-^N, F#`0M#`0 l[b0Fo0F#ƻ=0,.F#`m#`0 l[b0Fo0F#ƻ=0,.F#`m#`0 l[b0F&a0Bs|+7V#hY`ݲGg%`0lqC`0@+CVF#F#2ne `0lq`0@+CVF#F#2ne `0lq`0@+CVF#F#2ne `0|nF࿀#ը3a,B,wj))8XU^VI2==4MǑ%ˇe`0a>v׽V OnK;֜ዎ,GC& bg잷{ ~{-|Fqy5CWTe%Dz.p.Ny""G,W_D:mVq:qAFoF3 F#в~fƼ|UJ1I[[nvvW&qs[~"x]DFX?N lG>9B*$(2|)`)2F!`[+=mTVFcy}}|˸SNrޓJ N^Vn3CJ 8 `pF#!| r"a7U7jM*Bՙw{mMI&oϳ1|mD" 2?x Y0_D||9rEE! DPo"C۳@sk7%FF}xcW< {ׂCۓ_YpvppN"Kr[~IENDB`flask-debugtoolbar-0.16.0/docs/_static/screenshot-request-vars-panel.png0000664000175000017500000017345314676013405026247 0ustar carstencarstenPNG  IHDRܥClSVH`"UWyR ڰ̢6ߑYǞ9{ue( /h>D#pk/ @^KqJm攍5c,-bI0Cb1U4UU,\d)Ae(U@ZTc[#iP_zS/?eKLA*¸C_=Ts+*[\)VvkhUpTNj(@1ͥf[R/B%P3Ef[$j ~ ocn%%€m-$Ac! S!91Y}.c]{bR9lcOEǃ}[ᘼYF;vtx.RɳBnGE}Bt .-QQbnܥ15o >y@ڴ탷#}+|$,tf8;DCG*d>'|jM&KM+Y}f=V$|vuj<&nE6#iHȿxLOF]GidT/3;R( +o%,1E I?ֽ2?6-LfӍ5NèFدW*J1c{x;oQ/J׮B> _Dh)Ӊ)IqӈHTy1$"ۺU~=ON  3 8DUBmR>|@ 7 VR%hq߿LJJ"L&̏#so UH$ԅi*@2s)VPa5kmb2=M{rU˥j<ҩ9^Eǟ&&{qh9)L}|# L$E$f'UMmY@JHdT!z"Loٵ?g 1k'P{w+[ah/l Un_͓ z9 υzjDYzQ [3ԸEgE g "d*<͌v 1HioteywDZn|k } %WJkmj/ocy6ƻ=Ezr:-;m{zj싗߿Ƞl[d֡ ʭ]F E[ǯ S`q[b>d,VƆLkpv%j,@Ӆ _i/YxK^ƃlɚ$In\ p\$XW%]dʲ&іv[h?ʀJMt:k|7cvI+ @$+r'L-(D4 l6]j]\P]qzEvMNfL:tpCg[B~:*ȬDPM`_t'b%v'=^Kљ.o/iOp#[gq-]q (.-hVPVܺ0j7ߟ>}'$V1XlAkS*{"z^VzA{UwjÉ!u6xID̝+,v> bO'"ѭ?ޓ_غL|7t$sމϒD7'Ů^^!{,{ Ϡ7n^GU6Mq A$B!;C<'&:Kmm+5e܊)BV*MU@G%&P~>OCm###&57Gȭ₸lYI5N,7H W4`sQ݉̐MK;hݼN5%xap \WQ>;QGSx"@[?8>ξfS wr%_:mwT6>w;^al/Tz,BtapIbwMX*=eD/Hqvf퍻Ώ$Ad*|)>W\I ϡI]^^aҌ\qJbơpC%@ UYwN@u0N-/grq#ɁǵM='eyAk]ksF EOZ-[Jv ׍Ԭ4)N|nViUD]<(lsmdn!bb֋Ne'Uޘ/?Gsw,k,\t^Q}E0%Og;D=[Դ?XR߆C{"',58NkSk|Jx{%hlb_@nʮj+TA o%m>~6IJ1Km:fW}*._WY 3ًB.i?-]㳳J+Ҕ4l0^cxɘ[TW>B>bMM 4T¤/cR7ljHTg!&]USwў7}%x-aE4UU-C2Ɉ2 ~`d7,;6)@›rd_Me02bs2W)hm=J!s" [[ԛ?Nۯ ?.,jOl6;_`btttE`$U*6,sPQ5@F8m3{>s,ĂJ TlˋcE+(^]I]i"XiY52.-b@e40&wii5+ PgpR9F-l:2 :'x:w HyyQ1Nm<ӮIDzlm (Xx_IJ[b9/*b1K [Uʫq,  :-95D P `L">%%\YYٵ*J .1wY  Ps镝56Rh@X*B@!ǹR " ~`k -@X*B@!ǹR " ~$R  CW,wC?@@`T ."4 ~ ` M@X"BQW"w+wgVS/wN-(^M`   2*9ӄܟة!ċqZu*B,וR5F,wA@%pmOX-ѽ%m%z/:{]ušTM]S$A@ ӷJ(AHIUn^$@<{CŸg"7L@MNx{߆p }<駏=*5t=RvN\/9q&<Ο~JUui"2 BW%ڂ2rW@4 G`EMZ&TyW;9BHs-_d4Or/޿GWޔ q.++x/mB3islftZ.Q`  9ص<s:MRBJOw8mm=7ɘ|Z첐^3Y Rh٫ NO[R3skf׮:.{;po`Cy{yd(ʓɭy8m6Ke䇨@<@P>^;&s/xc؁(+I{%,gSnL{͜9Fهq*zRI۞͘1g~cی^"UuXXK3fy:~M @|,iB @477Y<| s=jQΛĈ+wҨHMn0`|*%H2g8$DZm $7jAj\6%\I ,E(`bdIrD-`0j~n,wý=@s rHr/@ H`F@ Ӓ́t>rj+  hpl:zy ܒ9Ŗ}W @D>'uwfz9>˟tbe ~LU^9.$p]?/sI&/Dh/G5Q݉¨ il``m`C-+sr2B3v Mc} 9.#FXxWSP#'P$MN R3hZ]KF޺:BHعsW{ciS >eU r+T$0- .b6r$l.3ԳkeqE=M/@jڍmlKQY 9<RTF<Χ mZ(ٻ4iZ@Ekκ]ξ 0 i7st2ˉ' 3L(:BkLwo|fRgɨ>nb`ͤb}g;gztZ|+T[8=7,*X/OrU!Iz06Jb)uA;u!{-]ϳVc_k!Gݽ_"aAU/x͔Wd=?lC/xykQI2S+OoM8nF.rК7㕎&%إ >|QZgE.`Ihy}Ji_Os#0F]eQ} $_%=ʔIN f'-\ӎI9a{|h/16FHĠOEVs{4IKҠ67o|R.7R^*Iƙ,1ʭiN}ߦ6XzHl358&q?#ܨ-6Qd߂Jc-K2jKK˙m\ՍCp@ P P%0܎`|-Ɲ,e/'Li.v]ě~Yi3J{PvDq~QLu$+!-Q.ncaaGKT{$|NG\yj؟'.Lq?I7\H% k*(er9x̕'GϾ*jDՓ?wEIKc3vC>6X[jŽm׎ž+@7_c_D-9r55́7_֥9~՛&?%..&${U |iOBZz*ƫ 4cپM%ఽ,m];9XJѫ DSĪڹlrY<wsj~}ls]fj}s\y}uO*;7mڸinjk޶(gQ1]Q%*u6nW[>SYЌd PO |Fz=4)71B4j1Wظ܂|-;wܨsgSb*ٳ޽x,݃{ 1WVbY߆ o("|p-r)b\'Bjg/ )wW6xYVS%oá&/.A7lyʕ%=&&}s{˱ ITj^5all\L@zH+-7~MTk=7B.^-ջy,H-cm??_շ,^}p#"ȹ唈ЫOw)QD斲^E5xHo҄v=2,&JURF6\Ż Nfz"Bf(_Xkbv^=STNAu glaz dQfYj{A$XrviC>D vL)O-}2Yj"o x)T|6H*fW!*iZew*ڸE^ z.ҞȺK_S/NMgq=(/#.{t_=h8Jb:LBJҞF*-T`>sM_;C^^ sSzPvA)5v&N] n% {CGHx5нx٥A~Uir +D~WV S.o-JWqQ[FX''MBʩ[]~@])ܹOw^%Néω3[Opu+W1Y)f}&p4e})=hW %YܵkqC;i?P7eT#j'vIvdUT;kj6'-S0H5ex 䤸k/gm]սxbg5݌'rNەtJ q.s"DfR#Nfw O{G7̔PinIUvOarjˬXԈ zFM. v>KR`<5oN3e\rtb޿xA\5'\$=L=uU}o֬ԑm[o|Z-NԵWw UFa.F'/-kݺc㫯3Dy;R܅$ߊct4R*f'%|U'$.KS4iB7yUU~vQygP vx N΢oYMݚMdL-Q Sޚj8mon/+=xP'Gxh+*)pVA>+Hd>?cQC_[9ťhJ{ƒ}i)| PƜ@Tlݺ9Y _LU! ]EM=a# ڳZ"5D%’Ӻ[1.'L JCI`*%~0Ϙ#GH e2QZ*Wל~Z9*1ZFVbKRnK|HHJŇ񹚞usK95'{Q~ykKq/FR^&-ծy h\]]k|{x_>ҬAB4l!|؂>e!pti %9S⮜i\'҇=Ԇ2lKM]Z]Է)/n;g~zߴǒ?=o(!i,o#D#l)Q#믧H'])SžWV5M*9WSzMW13IR1 JRQœR D *A2Ơb,X]IIĦ,C 2Zi*+y7f154Z1W =[[.fjzPBx;wV.E)PP,5iAC`Բ('IRDJD)l%% C#Nml$`SiEp QLyēC<@4x|I wwPΊ9{jM=uiq9hgh*.>~忇]G0^z n+0l7 q3^6c I]HaMwo{C R^&5{M8HI|#Pc)@l8/L,]'=S5)FBN"{e jj(lщM?W:p`>qn}W~Q'Bt3M}=]]郿4d!$Ōy " zF93( WsWF-A[>fM 3uHz\7X P@Z eh7ܰ]?.5h@rrW@J@( Kx2TIS\ūTWd]#A@υb>_-v ҁ@ uL=MfdTg]}   ![BTJExlDtP)g TUAB%e!%UUeՓb5@ _AW\Ͷ*TEl|^VOk2|~!OX-1dPXRc FGx=t0殇T@ (*ҙLue@Vu5es3%> cc ?DqI[v\>&(,T:FsU ߚ bI緉Kx %IPPO,#D (P 9mee<PRc==n z㊓M:eS">iԩ~/&sp8W7{3=wʡ-SbI&+J ۊ!L|=pc')NH;C>;OxؙmNN7yGjB7Ϝz0 G)KvD#al<||hm#6f;>fӻ 㼜Wz:b^>F"'jKO]eK%Γ3NNcWč4fަ˷//F)N*_@U@Ju2="8 @= @ʪ 5ٓXj='*-{Xߖ5PmN^fe؀A5"~Z3j:~o8͞..9.uZtЌvK,xs\6 "*rDOwxs u5$pf$Un\nޝs{!o~=EXu(X m;E5?5a>P^k{Wy'sachYGhGGgϞa*R,uBZ.'G>J{I8\ YK`W +=tķ#oݍf-&|O7ȱ@uX;Cͭ:l}# -֘r9v! o^'sRǷ b_lH Cb_OL\e~BjF1RqtJl#Nb4!֤*B)VrTωWRQӸI??It8:r(thxD;ҸnDLN⹄ٞ}^P<6D|< ?D^xP!~xFA(d?O*GE#7uOfؿv(̓jωEm4͘ pg%Uj]pi=)}n6_O.f/B4SznեdZߟgD07n[|8> Y"@>[u"'?w97m:$rs1}2!#HcØX*wçC-E-oTcy{Ӥ\4 KO s֎payIKNLL\@U\`V֖k*Hc><0qd'1Ǘp=," ԨMDHu^ɑ/~pH4J7"|X4K6,۪\N9H%J#=ߑz4}o|WޅU…Y7>ȭ}1vJ"7vc&{_`]<2Ïo2VWsdǑRQ#xh~s1ŰW5# y55>bdi?rbYfrZfSL),0e" szh`N̽j#'D33!\F0K'+!~=11.wk,zZMo~/bEҬd~c["baqOK~6䏌+˚ ddI'nQN.hv&΂W 毺񓃏bG:޻CKMM]>O%W9zT/qc}Rsb/!hN;[9GvX-;{Ǚ2uq⤋72h-<D_9QWL:r,uBī- yUZ(Wn-&^AbJKl&,h5cB(ڴbkpA{' =[H7ȩ#:_@AXOna7oj`0n"ϖ} ׭7S:|aLLkJ?IЭE#c& 2&yrӂat1A@8Uih{N"/MT;JVOt# i*_3 =_[֧E֡IZ~nm|wd򉑏[Tx o_Y`QZǰ(ċ;N{`L@IDAT6doݺDŽhB=Hu~ۥ9.$Wj`f'~3\InԜz$rw@7aԖ8)d/iL['E2Ặ|̆\F&^hy>įAС7T+WAǃk}܉xKv%<%%Hwids;| ϣx? "\'>`V1(fĒSsp~{>ӈsO^wgD8SnSS;~6#c&G>VyvfVVR41Э|J䱳HSSWEa_AyNvGbL)UTq3S>qL-sѐx"4-հoF=G h»̣;n#,Dfeg~/!I~62)_YbSƠ͑]&IpAcC{= &UP<:3Z0fh]؃/9niTߴ8.=YxJ|9ʳGIw9:M/] w ҞoTcT4 LjkPUUtChFZ&?CK};Iy #-L/1t L@L%'VKwJu?}(!Wm<414pFa@e[!DŽJ.x[*$_3)'-ڸ69H}}K<:ʹ;-[ ŭl]X-=့f C*׏1 ϊf{ʹKx1 ރ6n|bm=B^, i=yIYG7nLtǃCn]k\xk ~RpG*깲v@0(M=zOmMcTj9ܸQ6$'Pi=߾TR2Gt24Qx- 0!_j @%:)Y0TKv=A1`;u j9]-fc0.2t.ʨ0J`ϛT>(\i`+ 2  Z >Y|[2~›&>[ G~/N± bf#_3̸e?< LX/ p >uD P5DB=u1EAwZy hWsWNH@F@di!n`5Ʌ5@TXJaL@  zC2 >/7M۶iTo(BɺrrcNL3U-{r$D敒bMΚIw+S0bXsUM9 q 1w>|ΰǻ<[3q{]WOϼ(}0qe 8c˄"_|ן>$?}/ >+k:|S?4wԛSin[N@@@T6YP4P) 0='CVK_^1"}]Tdu7n~ҨQZ ⱐ$Q`"~cΪrbL-˫>( ^ |1w#S 3Fޱ4Z5䓅G: ;-dϽr/_6`MǛ(MsnJX$Ԩ{XWqek}u|Μ#Q{=o,ZuH*$]\@Ip_&O.NvfzzR-*N{]6'VPܳlXQVZF]} )@ p˚yps*'+J!#>`ɘ԰= E#u^ ۙC(Urpw /[%NO}g22&uuT̞QoQuo_˚~mkn6:Sh>v݉%?ضh.WW*k~bwɡ' %LC#y9\.7?eqM8/F:6ib8hAʮ}v_߽K\ۭWNqqM5M㖠;NiA]YޔಱOdž;wۮu֥e9[<͛C,C|vd{]@!?_G6;Oq717zv[qaQ',PM_tҵ[KdJ n~^{8{+9 …Z TaAFl]R_N}m BS?yЫl&gO>J)3׮yٖ;0}ç-!˚sβuvO(f.:2JY'_lڂ22bXub]&>ۼ-]Q")H>jsQ 1EWg>_-|ּ[f̾k7kFT 5]f @mD2KP4Qn^ոN*GQn_f2GQzs4l!=8MP/z/.o[2P1-0^4W+'.'urtWi3/x+0m".95rk1GNfcWΎk6BA& u1-Pח9λ.Eo11 )$|>}][&y'|5xWy unj3"T&vyV쟉6v\rqX4Rŀ5=F.Z_@f! 2MlLm*69828؈~-zϋ>QPlEd꒴:{F; \^]f]7 jXeZ(g?n4#$] ,2nFG} l-P-@6|C]Z}.S7.taBxP*v %夥gSoNM1kB ؙ!ƗZ$š,ۍ܊TJ)&3=x]Wqӳ&NF %ti4ekg/yq>%ڽJY. @BZ/?=hVnRHsB4DjLHYҬӢ&>踰Dj8hwhmdRWŵ^}2LlLQ«HV-Ee ^p"a֮)+ fɌag/-o.zcߔwx)h?u'ǭ:A8>ü b{* ԬH^MW:T]dHc4 INǮr\<䅺i"VuPQvsE[N=Yl)ѲP+X \aKxΖo35͑>_j?>MHk>j+,nHir4y־Td)[\U]]◷L26pY9$<nQ"UC . Bj~hR]Ye%E(QK.bj/A*!2kjj[4si_Yu8|[[hZaKp8<`+a ٳQ'K+BT"q9&Dx@ 6 KEF6ՙ܂HG8$>> -W-}r. V-}Њ ?.L;mPi͏V > |3-j?vxCdWyfu6%ݻt,qn#҄Mi}o7>q@{q*Fl+j7e=(eDʆQ;LBJҞm=o |Dg^ʨJ߂Ws]v q}p(}s _.gTspND|$0wׯKXi艫Gm8;aQoVdU53FȆu8Ӯ @2ä3߸,Mi;nnC~\o."}? ϣ1UVn}&X!+u+W{VvzZ{D 845 `Dk5G(Qf}&p4OyB7n{RaXW1RJUgDggl jf䤧u(W ~ &憆 I 3vǽmdmQ,H%ُ=w礞]5,wp04tuۥOuLYOLD$;3#$6%o' u'Ul47&,w9ΠðQb[H9aS^-d7jn߻!Fش-6 8ߴe[wdl8"v?O緟L3thyPd۵SI}eݾKvޕ 53JL ܽ3GڏNo'RGR{\66cd=>b(RvGCg᭏F` 5G)>ل[~|FnB յv}j|Z  oܵ$ )zHQ$=)a̚O^cm!MitUo -(KE]Cˠ@jioF`kh &b6Zt9SI..迠bYc+=&H|AE9|HE 1GyX$?̝:h`:ֻ}㬷SJ 2ު]Ɖehikn" S;+>X,[X) ڌ_) \?|) [MPxtqO{z}\2rB43;=~פ-)o,rq2_A|v+KG$SK-zr"\ xij*y+U5w8 уJryeOjY&V73w1a1&!kc~bc {¦Cܭh/C"7 kѴu{*X}=zn^b=t( a\2)."AlK,_$nPL.ofL܆߿SZz ->8[_O+7HP6c%Boiy\{rK0 *C/DJL  IG1[gYun0)9 Lլi#|#*-]I7KFDJ qs$L3U83pTks3esȰyljcG?{g9AJRDD1;~v`_ &`a#H  (HHpvDo>~ngg޼{xo'v6if~ Eg6"iW;j]tg_vZ gyKKdQTRֲbGU6/zY&*3Yy.1-L:{<E5e;Ez e:vn{;m^_C %O˲bƐ<ψ vч߻#O9EN>L$xWÝV5uv\1-tʊST4,|ج} O""YOkldbgbDNE2AYFV:YJD%! 1<^YKd((cK64*"crSLȿH̸e'Qu;& ]-?дb(zFTXڙN}Zb}bAW\{u99XZfvaNqga#ff*?]+`\sHgD%eukgԵEzLg릌 D'mBK"+su2 'k Kn]pu-Xo97J91%Oφ)57u&?J}D^S 3Jw Cį:ډ%^ (om$614tDZ_ܩY Q|:G_@`<2iH=kkqyNҕ}Ay1ɋD)t#'w/'ӳ'#>Uܒr**j*Rb-ĈغM3fEeY/G*y{Bo4Jͯ Οƅz*"(G UX1X*~Z`=,pfI MB ',Xo} J|;/[[t[)|y943 34N0+.vHWz01 ٳ],Neb%iQWRD+񆚩g:@CC]/~BRgdބC-#.| G&h[%c8]|W9ٚxWQL)39 *Nf\\$fb܆Ja>9|[XŷN)tȢܷq태 g>{CN kqY}\@&}Fظ@q} @NFW u@ ~;ܿ+@ԁD:Q D@ @"w`(@N"o  u ;7 C o'J\%DZ#G~Uc' &qF '@4v7 '!&3Amj_ h4/;!11)yUUٚfNL/G222 Mt%P]V653\\(h6W#~¢o[Z f=vY+"+;mqkbeܪsvuܾ5l>B̸dr z3(YD' T0S2#(0k˓M (8VZYc{k-YB> yN0GqS^xᝠTQ;6V8_u"iN~mꥅتCje&xƻd ~zFwW5LCcQ8!i_ e0-ȗgqZes7k썣Uzy)>a~d唐9n[Z():潣J%>=dI=!l(y~Un _ۖ%9)X4 hPBMY奜2ε I@@4̘y6alz:NZֽ4QŒ4 :x!)>NjmuWSDd+Ҷm=M9 )#YEmdI ?n˗%sy "ޭI4 ~8rL~7˭_;$ hjWTՃ}og+>"u9˗vp%?0Q:S1wiÅQSBH/ 9A*{i&g_ ت /Lvq'<8m6$5ɛ Ґ٢ݽ{} 4hQGZrs Й38' 6Şs:T '9kyǔsD6]d I/ Nz^"*wt2j*QXDT#̓&/m Oc*]|ړȂd ^;48-de p-'c 8{{<`PQ!a\Odlrي  b8NU5=|.8!\j>2B2(mbjhŨ3c{늢4PAۢRtrEN<͐U#Uw97֖u~Oo2pty+[y ߏ8@:kчdvR0&!IrƚQ\jVrw2e#F5}nFk P-TsqG@_lu(V|1.ڕ[W|̸]6ِBJq˽[7^t z T֝zq;+=TkΫӄ?}]]O .^_mz:QYM$.^̷GvW.v:xY\<{qES,&ҫyd|$1^yzH@R,ч>jwQ/G7զ/)k(g}a;%B˫F,`3p5v4XC|83'0zb+-EVӝ㗬6f Z'>تPu/ij[Yuܲ-l>7#s~RDDbD[ԙ8RS?*2%UU @g^{wj[ƞ۝8P+i#57l`^[ߺݥ ߴ*7$vv *}$'6{ ķ)8g:[QظMjHjNnXTs=@wVҷtÒ> ̜=! xըK'*N_y_'  2rU"S/.-!QYc-wf2Y2F"Yb&QIIf^b[YJq>%\5[ozi%k]٢(iShnи>#G2d{L I6MȺc< [j=Eu׷iQ 3k [U5SN V-&aLV> ڶrvOzfsp7\K GZ_B[a+Gv2hMC/ԩ]OVT b6VdUi-&bڿؖaejKjކXOm=l=yG8rU]v`H9Yi:#fD4|(w/Mè'*s'jQ~7*LzҢ>gwcYN+u {WẰiJ6u{18:ӈc'vE>#Z|[,М|6,l*xԎE#W _l,h9 '9ۇRcQ;Gt3s?=E<'Ç 8yꌷՙCclPIVPP"prR}6 ;JFΙtmx[i{]կz|wUJ] [LbRP9%`qg:R 2~m휈ufpPJW}w-*Q'|&q$a2{Ô&O5F]eЩB7I=0FR&.&- aNor $J~~@hd4mN-B?ʿ|=|ˊɷҵ * {oB;,^U,TS7POWvr£Ybj:*ڭ(|mGGȹvf~>jMT)+=f#93CvS rmb(ʸ 53+f~VzJ!/9PnL:SՅ qgZ x'Q5QG/ WMuh,wڣ 8. iTNкˬ-2[c^ԸUD썟Fնxg6m >}M; `,ut|7oD!ˍ۱x:ӖN,VtY3#|y2h/mȭ^'Wjnoy d~]JYU=ݷ0Ĺe wa|:!F٤ v?8l9eҾlӥF֥6⬖ CߑמWҩ6b!>^SF%5'vIn8WϺsbI5Ki2|sߒM/z8Nj}?}im&rn~Ӕ{Ui} s^7TEQۦt*kC-ע"/@)ӧ],%V}Pc+M5dT jc8I/eZ,S2z$mw[:f_̬i(⫓C$@sscK.W,.Ϲ\Ip; AjD_TVM,rdwV5\87ߗ@@(JMJSRtO%-K[*!v>3&V?3ϏTϡl5F4D?AEW1ޯ_0c Rcf[a˿Չ:| luq&Lq2gqԿ5,H~oaf\[uq{F%3vH#~+[gKfJjbg.$Ɨ/_~W<#*S_\\yoRe٪z&Fjtg*'K3Ӳ8t*z:Ut&̌ qT.@ifJ|gh,/3=/l/YQZPZzo&'r]e~˿ @"`ooPO=;l-wͦ>>=4mpmSZkqw!e^{T-9DSa#~Ser}Z5ځ$dOo+:+vX+ϼqz67SɠQWsv |@%Vqͳ_]~)i4h^RJf6d*_{1ЩWo6—ټƻoZ)ѼV_n!ڐdu΅O`#d qyJ ֓џz>ע`WXCV9bx,QtǶl%&ɫfi^JmfrG/_E6_vqb+r`4l^dRUq_캙IC*r(2^ Vg 9>[0ӐxŅ@HA#l][ 4avBҎrA~lo±a1R>KxF| e"re>_\zaY"r''FĤGSvx]}-~7Tl^y/v>tU^e9h p @vu뮖@JTqXmx|Jn=7s[D &:]WԴaRká^m;̽wzH77jngŘ`+>wVGe~A \y^Vj3_ֲCwcQ(cFxB@@?@*!蕖ȟbRhşH-#WWcW4u΃w%HF>훉"˼7~j C{;hx_ey/.b#zE?:M=ƻMx/W΢-l= ; 2ţs+uL?Ϙo0~p y +\VWӿQ|BY7XI1b/Nm;>V%ywomѭfax ]gjt,s-f}87^fLWXNҼ$I׎^&pPM~]M`!fa"2@/!/2@!"2@/!/2@!"2@/!/2@!"2@/!/2@!"2@/!/2@! CH ۿ@#۷o` %```P PȍuY[[C#T @OLd׃̄ɂ}X\x\+o*4'*eʈI2pYT)O%l  h(?% :"<DXWv:J/ihSQ'Sn5j搰e]ƈK21NoetvȝOtWEX:;{wB!).ΑѝΣw\xTP>tKi7L4qTLڝ&yy'<@ =/_|OFƿK^m&_C%@IN,5fS`"V9ԛUn+/JQݛD~{kV⭻8v])//(&N^}~aQRBA8,~ >@=M{3*^m@q~J&pw #X*W@Hxk  [lٺukll,jq7pe 7ȍZx(s)T [8r&r*'>^}i$""7_oe?8(ul;n}kYLhlB-.^#ba +|CEdp5@ʪUϟ?O]8и6>>7oEp)]. ' Y6ۨ^WaJw{6W6K5ﭵǵ>!z "{nʍLSKqx2},vgurZ:I[Aw5|]2Iz{RPN@\\|„ fff7o... eY}‭jIRVqAӋk?! ȪTν**|?C&l㯚`/OXzW w='[zoG6~jRK^,rɦ9}p}7 ik$ELuhW|fxHBʃWhP%*lw|ˊw D]W>87xb:OPTux@'x%mk.D O^|,aq{ۂG^=$;tDG?C6}zTy߮-p1&#,moXkV*@lv;Bi kV!s.\|59>tsFo@o"w^---:jPYolU1!Oj٤W?2'v>!C''+uMH|SeRS#[q]Td*>D*ZVOx\W]٨AքX$?_U33ߘ~b7^@ hkk[XXde dӺ7R-`Ti7w5\Hƽՙ{2:U_wwL d;?[,~:?jC (CNcq3Tj9oQKb֎Z 99j/'6b83/V=f:ZO|` <`165s.Fc^ }uQoj }5 "A,#rQ錙5DKߵv 5 ٨~@n_ L ##?*A'W][y>˨&e2UwoJbRz)hntYUo9-#bKVk/Ɲ+I}J,֓`ux6Xwm1a>SO& 91T;]hޚ!ricZbn+IZT*ujmg|MW7, UǑϢ-+w6$2@FA 22rxr8g~jp[yYhhHpU$D˻Tnybg%#o6XP@Y;/' :}I2[_kdTkg5NJUٷ?Ͻ; 5=uQtJŃ_9T[Aˮ o 8/ӭG/ \@/!==rȩSJrjI97r7 o>$R%&ýgn5f;lE"#&WU.@V)6ųڜ$#.%r8'gϢ;(ˡW7_-fOv.m-[k){o8d~ss:[ʛL!Peàt|)Qo=}$?O\ia١Mf Ff^W6Jo{ x|x7{gՎ]m*rs?]1{nW{!Husݾ{[Cuktxm<g[L H$ uolΦ򔍔DW\y:%B]tf 0aEwECeVߞk+)uXhSxs'ˎjN}r<ޤ5jʝXrXhn |xNTҸ1yK/Du@Onڴ!n#WU/,55NS3\q+ ]~wӅqϦo#c+]( EbR>,dmUhڣݟ;r9甦f#NjѲkZ$vheH^_MBͺt#Sbl$af׊/P{[çvOܐ2RHFq96gm[:-Hͱ]Sb@vK>Wx0ljKeLl; )i q%ףqv]!Tϻ60N.%%HF0tEImx 6i&D-z k-]]M'? { 'S#áQpa?糘H~Zxysp=v>va^^úH~Ml l()A4پ_N4)Q׸wȕe"ǂ#3p6s;]S4Ĩa&%b8:1vI^ Re_}~fkfjjڨ @mo졶zꘘmի6 t-w2TkE lթʊ ɰ݂7/K 7H,!䬝WZ&Op`dۣ}Cȵl{84(CeI!1D~:1]Pb NfwhYYg?V [/Ku!&WZYB'} ~ܿwM|#r2)=TjnV~{ǘ"jrGbsx|3C/ȋ{DܪC5VikdKYHyWk7q ](Dl j3 tT&f7Zs3 [wA r&8wsv /%Vƞy~tBV>L"}SRDag:Xς_(+ų@9!+gO)V(z6ilB*\`!륚٪V /dY*Soر;x:ү& ~ƕ 9%7&`wd>_?/`(*>=;}勤h4H^؊BKTF>XE?[}~VfxGJ#HڬҐ{*l[ @% 1̉FޟXE5wd  3e~13¹iiB]g~/t.+kzz("U>%eelk[ru%‹ ERSᩲ8uy=.(< . )Wm/'kk>RJߟY9h.sOh Wa[* &ZJ|7%".JmrmZ跰l``w"ACQOZx`x ϏimBٚhٲeIO vA[ꚯ(yw%<:㽠CȊ>Zh? xIY^5܆ 櫙:g\RNqA91jPxf/_EY8{zj\V]/@"嘗&El6 ^2hG\b {jl4L6>b#WܟVwz;3=-o1s~[5kM q WcdE“Bɮv1 $^ox%]YwƜDs'[74rض <\W-! Ea"wh2]Ev9Tj}G-V-7{j#}U4 ܴ4piN&>>b;Y?qF(s8 jf_|לy_٧x .Ojl9V3SN|j֊E%Ҍ"'Sx 5-&M)ŝ| @ziҜ2𺳼 Z*əͧoؒӳȸ|Ҋ”^ o.ߎz spl)2PI٢m{B_=?Okϣ"IcT=L?-0 h$ r7/@ P+k @4n ܵB@  -OHHh$ރ@ 6u#^ 7<@ }$@4w >g@ ܍O@|D3 @ k<'@ OfsO-\u0TD$+hMn9ke7s5ad&DLCU--ط @6@0]f]Y9TEvZ-kut$Qeڞ;>zu BF#(@4 ]Lg/3-:ѭ.:sa c=Hڠ>@FCв!2(xn)67c7t)]V/gS d_E芤hyX6@#s7DPh tS9ax\1Blfl?e<^>vde9.d[n<{y~yvjSFĚ%:Jۧlp?/_FؼWl 4`pi@] 5D*{k b@׶qC(𽵬BVs O@=]kT]F} ,/TQ:kײb--Eb֜%*&oҴHE{k)  ڭzk6- "> Z@aUU2Ɖ=Vus۷sߕ![&d/-YbݷyvF+/QҚMj+LYg!L&]  jUquw'y1uE,-*@aͲz]%Zq {Mv䋔6F4 @لA?@Wzȶ@l9iej"_3 ]^T/YԲr%5|ljn RPܐ r7$M u]=E@7/v٫"waUmʭԐƽ𴄫ܢg)4oH?DM ~>c kZ!~j +nxIki_+ Naָ 9x^G7sp 6ݺ2zT>m @4" ywsiGfccF*vx9ؾ}i|pl]W ïۆs]AQiZm ~gg}qFDrЗ _O $EgD.æ $3nŽJe!S h 3sZ\;*纩2j:7 >xW Y_&?)ǛC_'@o(x_*~C$SBcJ2tYS {|?yI]Dd[W*}tuuSg綗d'ipup /3%5=˨4ŏ+ T4/mjf~8QTm$U[:-#(**(7P!;J+*.'%rg@T%z/ErQQb[AoQ9$RqZ,GA=u%;:d)q'>-BqC=Gˋ[;J̺kޮ z_#,P)Lo~|T* [e`ؙT@Ky־ϴuݢ)3x*tMEUνV:cfʣe)mK{=a.њ<5}{(pk`6/]v%ڪװՉ_T67˜egE"ИtĀZh '@7>;Mz#hhю;n/v̤  ?Cd=˙\eԤI9o]7Bǖ0齇䱖vAY9^^`;xio$k3OY9>p08~5ӞW"sSkky"]eaɹK~zw cgcrJ>0"@zwnÇwor r?@="s'sis9ChMUzrONVx!s|YP2yZ[k#OˍLj9pb-;F_kLEtc]W #EwW$]#@] zyzzM荏T!Fs\r̻ݘd_&|>5iy`O\JI˿rOܱG˗]nkQsܣ]rQ=0c8Go0A8x©eݦ,=1WZ{|aKlVF~QXMX)O҃#{Yee<~JH(jEEQf6ѻP-M}Zު'ѝV'+ӄ $++!.kd\x^^F|MZq9likM#|(|٫r$.H"gORˑkann]V J?|=9x\N27n{l Uqa}m-Y))Tz3q Nϰ[x҅[D8deZۥ$XVTpЌ3[ Vzϵ{';đ ߀n=Nm 挔Ào!y9Dg5bt]m\gc&)dt!8hř\o 3{E :]M>iM#Mv˯V4㭽 Pu_udq_ʽeʘ8]4O[zJs/Ḓ]8ڔDYsvT^їt`zvzZ=~SWkB;%Ӕ1μ="xƷ e.Gɷ*=zlJ(y;E.?n;b+?規7jvxGqșm5 %>a@ǟ݄#/RW RH2Fx!FpWΜYdU0 (+ ⢧k-?=1[klxLNqG}] t;Zy,Y : v72'7s^g}2SK(鑽qS,G/f D}W\ۺ8x<;b,VC82zܫ;ܾB:qR>BɈ-#qp|;U/ ?:E&6>"b]0ifH/5b95T&Yy2ƕFis닻{@ۮVMB6GTTa /^Ce 5_7LZQγ' $RYNߪYO\nffq{qq6Nݎ}|eC0N~N @jK۴DoҢ̤KmN5?qv3XM7!I: ]MKr |CbNm-Cʡ{'Σ7YCY8bn+mq*#i6EڭKW¢F#S},s'Og U:ۦD-TpkĚYX5>~R=pJ M$#67l)_$-uk'Հ| 47Қ<@ԓ@#7rKv&i361$%oiU'{uNnR ìyoLKvjр}"1)UN}';݃3ԌepB۴-~JtU."O{NfͲ:h;WvsYb6}#_b ڙU82F;C7sژ垞ֳZzVSmы7K;h9~Gb9.̉d)d k4x22wqy$jЊϝ<ݽ~s?=Oغ0K@ (**ZAΑ_綑h^rK .;HY`m9)(%w&/'u^m&J)y]Rm_zv܌<7*}rjA?0,:Њ6M9l;qU7qkʨq&_e 55;ݹ W\LI7Kr8 f]ܱK2>V 'χY)2NHKCMm)N!dj8V͘X~+O.^nѻ;B%$ E ??[PaW.SE^;๲ SƒG F|:u|t~{ڕ1GyD$@}{Tu}kܔ.&22ۥK/<22` ,n~C=o*?=OgoDj4_v+`$I9%5HH<[zUNL&!.$VcA9=Cs" AK# z`3筤&s^^!C~!L˃|#)EڌpOT>8)IoG @sFomZ=mupU+Hsٛݢ*^_S÷EQUxRpz7M8a'W\'\Sm@΀9QmQH2Rv[߼y|K̇+yCw~*2ڶ'7M-݄vMj;s6b"EN%2T_=E[9b.}]K{M_y hXx* )*O!Wgm|ŋb^<}Ss<ܧj[JC_VK^T;l6:x K8Ĕ6*c3qv(ZюۃBJj>s[Et_wpGIpptnBGNF(;;iHf@G({0BT[Qqz]65!yY]Xr"W]V$7d ՜0?$ _|Ҽ̴Y&IEwz,LOLhVD?`4+bEUbU]:»|5*LɨGH^(2r MR꺼ϫu4/=;/6nQӛV#ܤp96$og7 y 7.Pn wwzzH>m @ @@!GA[ D_M @ @@!GA[ D_M @ #C'Pɲ?찵L`DD [+7XXk5yf+,\GKE^|_I`$ !#wEQ^^IRm/Ark.+ WPߪ_y Ee_=$&)Iɤ^((,.1DL n$& -]T"Y͏(b~Ōk⏃Lɧ&(嚴}, ;0K]@Ky[+WMnW53Qψ8gZ[،HZʣwƖƖN1cܔ)stȿ{{@;8@Z Vd~[/{1U`uڋky%Zʃ7ԧ]PA~n)Z+bei7Lp>q[t-5J3noקW!-S.?)_JEr$n(ɮI=ς?|}vD_]4nSa1;{>Y[{ad\*@V# @<*ï7fq^z\YYuv(8'![׾->`"b9,Iw t_}dû[l+ {m6ıۉ>FwU'_~|SV|ܙˆLރwIw" 黶jA7սM6 -'ɽ}`^/J/kn:BӗRw'r\̊N6VfMPM5s}ɉ:>>}4ġm7:Y;C=픍!nIMGkG9 E%{1Zp55ߘ(~FNW_\ВdPF AHe`W;ÏEA4* L=x~ĭ*b;qҶ{ci .!3mT\-BY ~m`_39TkW!{2HδNxdNׄ5Vv>VKhHBΑ9Q=ze=`6B\ USx.ݵz:xz3iw^E/ >͡{lOn'5voY^.zFnb~%6[UYzjf!]b*Ḿ f%O_NWE;7>*o@An(QK&:,ӯNNğt.;&Cʧo!~!Ccm-nN #Aŵ;*pHǍls.dfPhQfg7SFFGR.i O'0M|Q2̂ďe孺48}{8^8ZbmMn8͹釰FRI:c =UU-' (QgjkY8 d6vշSBE=y`zotߚ#K]"uܨISqscްˋ5AMkBT ŹC]ϯjE- >dSEj制"<.l+2P5VVdlvh?zx:h (2m{<+T΃z#jRx?U B k H~[n}nK sx[yx0S":79yU8fRұ0{95.Оr8RWIsO/]ƚb.'XN0 2$ PJ!lvr26kIm07.%i`?v|獂Q\ܚZm偗/$ -c2..{b0Jؗ[~_Y'Psq7qle 2S~˰ ({PsnĀ4ˏ>mtHоYy<Z+=l˱ OZ0tڡw|O^L)D=mpH?⹑Nݛ{uF׆f00.x9QOiY'fw ~;΍y\vʻ118I_X諩dUk,b ;֛Y.;9t:|%% -b KsU=M5vN" C\1@"o|5K1OK~u5gLxxQm~yY\2/Mrӎ_dt2"^m{ _29dɥUwu82m]xObP\7$a3QXvsZk/"Rc:*8O }mX\vDl.O< D)ok;V3PgD}g84v?;̊^7k/?G<,}b?k SfB[ rx[eJɱUa[O;SrFWdYxՕ&D\EZYm3 RŃ7=Afx4_8֚2wc?fO2|vRUo8=utsޜZ@RꡋNs 8@5TwVFԯG04_;<' >;X kr|۵(-x]'/[w%HHrt:)df>-VjÐ@VSZ̗烮'ͦ\k)#ۤ.}uk5b@~BvA@ HdEM߻۔YA߁M]A,„kMYa7  1[Į]-ݯ 04 @w'wB> s Ӏ8@ߝx A@-L@ ~w+@ L<0   ݯ 04 @w'wB> @- l.:,j q]2h0@Zml-Usd^Rj (\}Ǟn7[MG#5m澈K)h $g=|"߱c_iXƦ86nQ](T&.h v2⩠̘ [Ӷ)*_߾xդ**MFWuŀZ9=OXmڹy8(|+*u=sjqq V`ļCA{ĥgv~zIr[׷ҵFYQq.TCW[fAA9Wvs.BKʋ9,]#=Ϋ:]kDn^r ARKk Ԁ W <] c)Xrw?Ɏq,Uj7KT]f9^.=FGQ=5oqu&Gכܶz- ǒ- t#vn̮p=ʄ&A @C$@c骖ZHRV[_CKZeי3YynW$83A&γN*sQ!x˾V2vK3-YR̜';__Tgd=NfHxIΙ9$$JbNyMIMbz~*m ue SVI"a2]UWRRUhxv(`~#: |7BIioL.bGpP3*"{_aefKHYђ !s72(h$9_S/\&me纛4D a_ s/|s\66wjk#;e7'+%wNr oM9?P7os1$>̃OV hS}"!wO]ZIa.BͶc.+ @FO=7;7 58mPI/IM҆Ǐv-իmjUC}|9ĝDچ %o)!OtGgVQia@k !sߟ;6>専P ':| 4ŵQc;jDMWbXk7'|[/!*m2aZ8  ^fb6IDAT-:jRXi)dN,J7s7|E@sT1Y}/K j}yG0zӲ"HSQhy{:xݱOmEKeVSBMGOA%ѲUT$9lT?8y;׷;ק+&v-<+Bʊ.C@C@?ղtjč,2/|18-0<"mvCLA>?Bqx dk, O9PyYjޣ;NXi!b032FSDT$|os#H_bI[W*;.KjnkhA#viJ|?GOEM)dI*› 5sOf ~Ll{M8tQ2iN] @L=w<BӪfy."/n[ ֔V1~Њ9g{4;Dj{z9)ØVq^Xs܃,!.^:d9o0W ύܾYS|)׷5+nPEYY(Q߆7(\C;,P<ɟ! lux>8*=٫Ob|X͔agISv|<::᭮ijݬ4qH-\ܶxE ;{kQ>xu2e^W,exXjhܫ;i2L(K ۏ_zlVV^uy*$7ڥ{wZ!/eu9)hDmjA'޶ )"kogNyZ$ .$vGO<{~7GGO JˤTMo#8pU%u1O $ r@F\U29_S#_+%p٭%u:npA c;ʷgv*ZǟǷ%92tl.esk' =qBj.vJQl9sA"*t>Vb9[?1l}E>B{oC /R寧K|LŊ YtmƣZXQFj뗢 >Ee~xog}uZΘ\ՉrI:eV07w[30dѡWWxȘl|u[O\̾ٮ%!-??G:XO`Cu ]EGHQOck] ’v ;K)NӪkYři_>8XmŹx- 46EѱA = 2 q4j@ n  rAc@@4( @' hPs7@&O|򮐍$쇮91ߍ3d&63'Ỏ}~] "c:CiV+s:R,WmKs3㦪x#VoOPs)?;/.p } lYDE8{Qꢲ%Գ Fż4*@FEvwQAbO2$xYW2_6w|>a{9F#VvX^9L넧yA焞CRȮ{n;mB JxnD$x{~4k ^.~ȝ< 1V׃?sq@c*B๫2 61-K@M?\-B='~ '+~$O5y#5g~q5_|{+\ƨV)7zn;$"<ult=j57}d"=:Q7.ôm?c.C .agY} cxsQvץg ^GSа=!}0yўbu'8cb̳USPPnm7ψ^Ľ".w27zʲ-ؘ͍Ӑz+"iPQ+;/zH'\cC ISM4@h%:Њgpr+lA  оpcio[:۩2-xuYi[bIbI]{pzм`?D>E͘z>{\NĐ]8';4$y>I(xNݹ `UVݬ4yy%l$a~+D[y6v +CK^ղDŽWb9@w\DRR蝫G3K]r#S %yNCȖpuj$$K!sg]"vC;;wp֥of=tyKfv[ۺz]<7BE\5fޜts"3q˒'/oaijA!rHIzCnxd7M7ݽ?{W\_)0_;ȱvry$lsC4;RnTJfAh>c'r-Wmyʐ#h[ M1njE=kk KڵӍ{}%DiiyK4?ٴ7>q\=Op\"3>IC:掬^6XM|QF0NHXu8p\'G>cԈ׉Zɬm)fw?G,s5ßg# u|ISqsc !F jZ;QiQ""=€S YRtFN#Ix{6Jd)w $GĤOMmOsK.}XۀGm"-\NhNן_M@ػWs+ h<@ <ľ%x S^UTՂΙMyv+XNG86Cj^>wyJi9uBդ G&|*LNAAG YC)}+yk;6з]7*/}~SG<7{s> h b;g0Jh3cA q]`>:N|{W&u\;&cnA ?p.X/ExΉRC?}(`T+l@K[D1 Vnİڰhbt#^o~vsD+M88 %@ckNʺAÆSecËm.+cnddߙ,r^ރ*?߼!&'%Y~~ ,+/E~|kガ׭Wa3QXvsZk/"Rc{"$7incW!G(O :w!d>n;^W\UУ w 3-}b?k ESfB[ rxK.s0TJ"7_K@hH=wNxxo'}b[oϑs[GWHpɀq#_+t6nDM811!N}/,MPCHxx.2ƃ'[Է]i[=͝X~u"BN tBɭi9y+,&4|ֱC5MLyeJSL%fхKR,#1 0)XܬOo7["K-灰f+ʊc|O, -'T8V5 O/BkcK:d6}SPZQFc0Evmd2KO^|D6Gs  O, '†ԣdi =/}|*{sºoFF+Oi7+ @Ai;߄Lux?8xy]W@F&2l)kMln_V-oj_ ~/0[{]Кz!t@Qݨ.'t =܍C@Qݨ.'t =܍C@Qݨ.'t =܍C@Qݨ.'t =܍C@Qݨ.'t =8_b MfֽGwl& s_^$uE G˄(/MxHˡE߅ /nЧ['"df4̑$[L ʹl$ nĤr8K[⸸tMql,ݶ,R^g%6jd4E\JⶴW}䅆J&ZB_bn><-X@df|C4\kJ{V5]V(n%yCv14=]qMp<;?OVYqq9BtGO$%銊nb{a6Sf^mr3Qo؟kOF2&@J}OAHZFFsj_b"۬oYlJ9HJmzKt<,s.0Ŕ U/Q6\[g>x& -=+ҧ7T1f-r$(c {w*0y#! $$rbtUK__-$)!%BUj^`tyAnVr4jz"@ &j kD0ՖB]&Hx y'X[>ar Œ do F0IOtUL$gblj9yR_&`o+@|o>"}Gþ.beI>~SkE!>[Fҭ*[@o!BJ.. .21%+5jNrGZP]9 "#m{/oP{k$)p gϛL6r2Mgi=s崾 -YRRYOξDNi}/#S)n9vF[}{/ʦIHE4=(@ZpttfjI,XGܦѯ^[p в 3)un7eKq[Y5+K䍰+kr.~scs]-/=.2H~O܌W)H^^^Iy m=5jمt:WR3PS2y`T5@/z5luxs|JUi ؇ Za9}Mݽ[Nv&zkd"~mC;g뎃s';Cm=>ՊOWUY`r_,vhOW2G4'hhkaw\)J]TU&ǻ4 gI  xrfՎ嵐y#]}Q$r6tYYm5<"g %M],/&BCŒR zJ\,ʹ;0)IJҰR"}-IJQyMj]h @#"Pݿ>pޑ=y.SŨًgOJ%wH/b^ !JQ+zCdT)Z:xzRtg,M˸1OuK#&, M9+5wOybNm'm[^2wJ/ygjXxd]+]ᰙyloG3tY_kOMP)g|6Bi+o; }o`=LMlǓHAA.glb&`T]Djj*3r߾HJ+VjS?CH@4B|yU啴LXڗԘg%ty5c+ vYũqO Xl8;ѳ/HA]߼66!=WSK ,a?/v]t0&e\odc $jxsA_z}_4F__jWd҅tVeVsR ʔ55~TQQEAVWmul$.'~NxwQs]Mi%wNrXN>Gb61. /ensƱ+nZȞb7v%I5H( ^-MAHr֮9CBWf|j@h04q/" |ɗ6tA)|8 X&$@&م_YTF+{7:q`&E\UYS٩y~oF9.JJ.f!^ ^x̂jIU}&߉G_ %u;譇>Um~抭HƉ62 u §[+mvf5HE&ⶱ|؎ +bw :mt`" +m,n% @&c]ƻ̔!sLێm{kIi[S21qB%z2oPg;s= 9}؆ Ƹm9v^|1$5dGhc>2KHossXP\?5ׅ/H˪|]s<"h٪S_H S˦S7nmr-Xztˋw5pvvVqvmB+b:_ē&zf>3kk![@LGGbQV6{yzuh)#=i-*d}L$db!=!S܏{7. k/NڼMmN.?6܃w,>+cs7@vf2Ç 톫^1ԭUnݎ?ĿU]pqz<&%%d#TTRn5r+7U{WnZ$@!1UnʷloH ٶz"M8Ih Iɪin;R\FR CAalHLz_(pۣfoa@jo omws}{/^yCN|ߖΈkE]Wз;\_޾|z&^&7$T( Goxy|[{DnӅ\6MB&bCWuʇo}BeZ<(!~yrS:#a@MN{y(0`x=xhGeH~뎽l_qRЌ+( 5ԣN +%TTtKuz^}`*..O`~b_kVYADǒE|볯%'^c"Ɯ?J(E-{j~2>,›2C 6]8K  @c ]65$_OV75Vv#U;+(EGտAV2>nU-R7ihVKEdqnf޼a"̴6 B(hjMx @$Q^kk%` ' $@ S) DZWՈn>i/qgO *@7$ppt,{*S,p+Ϲ{n, ~K.d,b<~ٶvXiOouy1kfc8o4Ӻd٧~CB?\=-ZJoG}jlZ߉ xͫ'Zwx_n ܧJl`?v N&/'4q {:OG_mzmT8ׅPnIE11ק!6VD\KhvnIC I|uf굠D뜆.I=5V 8*+h :]8Ҝ2J:Uw#Gg22N^S!jki7&IkX-:} q';ZiHV6}}-uۙ:_x"MJlpc (vOD $,*d1p(q+t2Ue,1+|Ll?~/&)KyG1ʋ_S-دzl)<{M~wm'<3ViZ]CgXJ @c!;/kֵWN=9e}eiggginjbi#$Q̨=m,fv3M \Yvv+x ૎*,=5׿䤛3,y2yomF< Ұ~?- m =焎ܴܗ.ZbĈVOrw67p?'景X\;Ko{]T9zƊZfPZQfg7SFGrnF 0 pGjI λdi IY7R@e&$$BzV.ڬ8﯏~ %_<-Kh;,AY9r<*u[R7ύʙ4[=c2Q-#_дv@)9v<)IvBۢfr^<$D"vxpaW@ʑikοSKQI(A2m{#7@ƨ3Z64؅q 4Fj{9sBAm z8D\P>3xAЎS :2l/]^8U49Ajx>07 i @ ds3ҦC 碲ԫףqWt/eKqS-I2۔9E[VkC(L@|P,Wx;swLu@kEDcuL@'""%/ȴͦZG: ~b0[{=<ᦫV]J$FW5]'L 4n>e)G {9<2C*rU6 N@ t:-<{p:a<ܧ+q>عkw_tźvڨCW 582 _W,.L 'yh5}F,$Ⴙ |RZ3\H*fd3ԤZ(k*PU|5"LMTNY addc˲R8VEnvAWeJz;< q6zdEw|{n5CjC^rY y|A>~=gFȼ8d;SrP+8c15tEtym0 T%9Xz V!ԑ@{: &zGY=|k!律3'"{;}j{K+ߚ/{qfXZe %,>yFwKeHXHgs)k)GZ kh4@FHF,~ur-~I!>@ͥ_]e+ {,iv jIC?//Ánmq%Xs9Y3Uu&`0? $5t5n7o>X># ѪzNՈSh;]i{}%75 #:2 @ sNrt,ݫ|yIaZ==2~7LK^]U;"y/)A3 "L<0  ~6_vo Pl @7 ~``U@Iw|n5@?pݡ@5D"Dm1&%jA:`= @u",,d2^LB==J*!ƻJC@T#YYlaDl\D Iء@ "զvixOOeB+4N^J}Ӭ @IIr˕YpF] @2299,hHKKKG|>_,KW qSBB T*0ޕ P deZnGUQrU±Ș@ l E*ff4T2S]Pd3:"V Mƛ~!lTo> б~eWF%=2R>iEm'mZS (g`offX2iyo{ n.)׳c{Gmz` M:bgёޫhDm"P^->z uf䔆e۲jo{:0jA :*˸hPf^~t 4UafWW2PO3D-07:yBP5 d@Iso?DQ0-?ѻ! S3F17x䜑,J@kde)&tuYeiss,o!ni4! ll%6*- B52sr]ٝz8Kze GW @UrUvb100*28cAA;g_t|pUMƛƧ^Tay˂޻)BC!V6VVj;oD1QYOwpR7 }66Xgٸ$ Pds8,p! O1\Lwv2,w[2KTo'6*.1[$zƎlՏce'}R `2Ll?_1J\MXn8'PPs0bRH׉R& ۰\PCLrs,S)Zm%ZҟWGk3qt`Ԧ"O0¿dհ#b̋!n׀ndmiܹs}+=&:#0I{AG-`U@iYeݱ:xKT ;|HvoI)/)H)Wc|uGT<;7v֡;d8mQi;}qxa_L6nA6ɿ;'/&2KIBnƧ hNv v/ƈ+}*fQap^,dSiUԆ[ <^., Srq`aaaZ'55@@ȳƛ^}|t\\WePDC4tq|li! wXudC:"(܅kO6tdR^,4=g ڴޘч=Nӻkp\M:{ٶT5Hr$wtrDl/bBbݾ#Y俫{c+l;,GdgN~)AH*P/Ge7|tr³"FT8MOD2eLdEej׼bCZqTsj1hmYOZnMJ;Vm+5YaBaq[KypʉwJJr+FEX EoS'sщj6#&$-7Z=Ntr> qHn̆F91%,w>zvUڽǵ+ uY4uͶ*V*x'El<͝pak͉Ͻ*<^9Г \(e ?@t#4Bɳ̓~#}1|M?lj( q.DVĆ>Tm.]sIH;0⳴p"7w?|)eаyែ%gĽ}T(w"hL|w,a>!!ϲΦ`}-]"""aa}*܍/DfGT'7#U4|Pddw4116VEcM_[[Դ>*BT(٩gWsرȒ "Q$;mk-\pe]B}w6qTMgQM5>4F@d_oboz;1B)~:vƊv&se[AQAANLг+ fn\wEgL oҐ{y,*]iػsqu>Xе/ Sl3wufL?wsmxԁ԰#WY{&.l/cVS ޒ/@)}:Fc3.2ɢ vcBmz߈f7vZ0Qge!:bRXK.W k׮wE2LHM'Q)B.*euKK~2)=u(N|8ֶf$˺x` ,7KwjuMT7 *S~ PC iV*vʻkP>JW:.]@vTK=acbҐ-?~p'%`]H=Fpԩ_W_}$o/30VIJϠCatYUTkZωU}2S_uN>y>-ӯ[gmnTF7ǃ9Jd~(.+y-_Kʁ P%t rCOlU&`nxMmIt:5\Ef;iʦyNsW/H~q뗦 r9~ۣsPg󽬕WR=6 !/T0'8ԇ/My*ܦQc'!o*|?5O;d/ԫ?iˌzҋ:(.&'*䡆gMl RnS\=B^•%@*,-wU1x<ȍ76x6ή+?5@Oq'h/JԈ:~J7JrRa\BzN-!f7`R޳{t17 Ξ3pN(|zH5}VZ q*2[z|=<-R(Y'`ݢk%Dʌ{ר Xe"w<u՜kJ88'N-됞aX:$x802|MүGu%u/7ܢ,)A'I2W:T9]]<.W 7,--sT5 b߃8#ήWEb TFT,)k vyN4xi/j9úJEv<Ϣd?sF:]+[nw)sM#m6!Oۏ>Uf=>ˡ"RK #7wp1{':tM:o_^7s4E? ?`9Z+.FڲAYK{Nr 7Ot97*RH~B:.wv C.2~"$)vTb(N@{ki?bZE_NRF,fllŊAB7)z#i)Lg5xQ;5 4*D 8:y[Qu"yx^.<9>L&r\Mڛ>Xख़) ,'4T;r] 'Vi)][kԂsg~y2YK9ݫ] H]BU>/O5^W8*|ȞcϔN)PAuT#@UU,kyKmbR`dF2]]!$fPGG+6~oo:Ii[ny>r(C˥{喻gɒ;/(.FM TGyttFm=ꬍD$MXٛ6ť,7+[KzNX&pJm'x`q\Y66p zL_!>iBBm[g/좐iWwunL)} @* `g)jOX1O21up1[ޖwJ#s}|O1j[%]A싷x/[whi4DqB^~H% w3WsK >SV+sWdM'^u9ˉVbJD0kd+]2ᦽK/"8֕'Vl} b$":<~ ׏bH.Ml"뙐Z:%T|fjR|7>Sexzynn1TKK@%W:9 fP6Ȫ\Or!`cY腅BfɆ8nj6[ֶ"Y##4/0`*[a4D P `LB[EEDC\[[[ە}Hvvv  b] 4Mj:]Tt A^'1_G@qBe@G GxPG 'T ~` u@qBe@G GxPG 'T ~XPG  1iBE@ ?cJ D4.@ CC#\~{}޵qJS>5pG,,=8\,\wΝY}+{'5((3=:| .G'~mi' ?#5g{}3S=˦ݻ7AtݼsQﺆ:3ڦc֜i+s-M,?skŐ ajttJ>2k>荟mE w\ߦft~N1:@"nu4('2 Zc[m-Elll@@װMOjR9}%3|~μ?e&#~Nmdd S7,_bퟶB(om&QO64j$_+r,3+ \;ԥniX@ 2`y;W:2lҳP%Ң -oĮm[#T.\F<K.|Hϟ4gN6h{ίԁ3wǿ5j\3ū! z Ho0"!4oςn/1fKG Qˡm0z9rczl}*,GLD-(*:u6]9y޽AHekY xU<@oNc;7d# 晧_?"&cV4QRIÑNMDńu86ke[ulRFQ@"ddՍv,"31cl%} =#.o1/ L.䆇~Ϯ#TM׈kA@Tud^?*-@R v|JJ;nJ3k)$n\X2_$R hl+l"ݹ'GR/ޏ;+x*zѾ#=5xACh>q8v~Z0؞欉']y3aa?bĵGN|,Ns;qThBEjSw!CSA.m}KeJ^4B^?>rWuTK 7h?rsKQ8 1 TۜlnӃbw7%P~'my:]'D0e^+3fƫz'q^~{G֭+{S)4A&vKz,z8N|G&֊EUjgF;.N`rЈ=n1햒ἱn}G&j+ڮycc(Oʻͫ?Fom&>DӓaEXnrD3Wk }D.-r)w ˍ 4%W<@ PchP֥q̐ GLBfGm8.qס ٸ[6/ҕ,nNέ ^CT zGs ?ݾMJW ΝFh:DtVf^j5 $6 Ҩ۴_& IܱnV$^>fIWPkBs3[$mEOH_4;@A-oZx6Sޔ{,<͓,gi}l3tՇ\CNU/a(r X\ɚsHr^xoc)'6}om"P|>Į255jvFأ>4`+B!kX-^nVhMEkR+~8ͤǫ_&@%Pbe!'&} &VV > mee % L [c;,E }}cbj ?+[)j5Q+BÁYiIgtLyܴBַ27ְf oB}բoT3DslKc[5D -ǼDz -mmVZ,|,? w0@ 09@ LwQAB Ճ7U-= ͔78J~=GG)a^J 57y+l*E1\(eRZ|,bvS;??hRKYr @|x l~W SH1옞 #bNn߁9 rjز{:%]w̋OҼwyA=NHx|SN]P@lu ܤ͉/KB$bFWaj↯mæYorqfįJ|onˎQ8SӖ&ٱO?Q|[swJh]'mڬ)=3$-;wmAdطer>iqF-j_I!d۸uV]IHJƻTyUJori_N'ljAjȍdn} y'f{t6ʱ QS]3Q=N_j3\t^ U x\ ae> qC) ֭[t^8"`D)ё-'B&,}$Iiޕy1[u-~P{ 5E$b@,fvmT[*OZp-YP$R]m<9&=O:% Y?ohQC]$E"͔Oy S.,ZYyDG:*6GRQS>Z_ZP:@@ps;ɱ7Ǖr-܁یuY--Qre";f[8.=%8Ai>1fJ`Ե4L_+`AR @e`ckiE6T1 ClA_[Z:LJ~ 2uvsvh3n [J{\آvZXT>_Lv!oj%*e*b!"sZZ K8K)f!D2B1Px*-I e'&OǨ~:*iN19+,0Ǚ]] yI&&8:+>1Yoڦ۽i x[4eOүEb;mͥ- yó᧧O=9wgXk3B.=m*>f Z\Qn \!FrZ< ̴Nq1K:d@ DDD888UGm 9(j.Y|6mwO&KH,7E^>X?bmy7=Mׯe^ax_"?ewgO~ʼnUen ؆^8edP7#A[^4=+[*Ru&z@O$]cX4i-7 2bg:s=T1spi@:W K-҃ȧmHCF!{:X;a`!``g3[ncSw 6l8xm<~CY3Apg")e_>˞$IT/KNu= P3 C47>:"":Qgqd Qy3/'!͢:SN<#PIָ MtE#_py~a;V}>awAfo / 4yKW:J*mݼZ@UC$+<5ӝJAQYlyV";]7?e4DḆEW'uvQNi>N'kb_Wt][n,WaUԲX@f덺@#JQ8B"!9݌ΑЄJ8Rd핖~W-jEMv]v̰)pC}|{@1 ̽Ϡ>'xъ'pZGcKrssG`!!Dn#wA3XHt!Uz~Bc"<0Bt@T b1oSnUbHn|%VnƊol W4&4֫jOяj'_# :UVlKK֛cߨ--lׅp(lZ&,{ݺ"a2=*9lح)]N:u}Η-7վbױXFZ%޹q]vB{.Q<I [4jZuU3>9`ϵwqNAGVP!Rܷ]:l_4giWLWZ 5,6x aP]m{>Mk@?R=l-ZgBSB^{vߔMd+S $l~zr/Sp~ZH {u}ڠ[S;Nv/ e*ii2ГDKR/zF4uz!<^޴3"UA186c47"L^$q(CKJM zW \H@$@V*,^%FZEǶ<ƔJ#TﮑxJ @IQ"ޘU e&FXo84WXWI}~^y_ﭙn! HА "$"H[d0s xcaYtX RlBpm=3a[pyvTàyH[L,NyPXOekx^_:pTM)) $o΀ljj|4[ _iI=vnglitL{逹 M;_p@ Jeff |Hllj!/;pXq Qr@F ""AVCon@IDATU5@:22g4c;7d@ (O+U@|7$VX82Ï}\FT@T*!HȐptϧNҤ lDP@sAi%H@TgwE)(=AzEs{NА#k&ƻZ?P P$f*7_hga8BGzzVm1㡄6n8YjRe7}T:\*@9.~Z@;! 7 ];hN6}nE7~Wކ3[lo, rWik]R;IQ٤E0 .ǖ+%&E8/wO"ybOއ,;w*@9[ޕ@Pb1D G&TqUp3:?u"X6~˗+#-T0ޕAd 6۔>=_![%f. ybb"c㳸xW_.ħ8\9˙KOJ"!D(Œ(ā1_ZN!UI`Æ ..."eM8NSNZVܺ{)!În} =g n=R]נ JN@;DWsPz蕓wc:i{m3o5`o"T/? mq\JZ(?/'r+EaM,pvQ)wq oM(gp.:H)>FwgN P7t`@77'Sy`)r!HtŊz*;leVQ#"P[BB^|gR["8)|d3ddFVxy_ɖ)d T1ooo":Ys#Uon/taܧΓL$)Ahމ6bV׵tNӼ}Z*5iO1 5?ni,o&-ac#gs+ cT+G3n-g+cF~*c+,hrmZn̸ ,(v6 f$h?ȩJLp@(ϟ?/T1{&88xT;.sWmجss#*/j[ը Np["AZ9f -~Xx2h'|-˾ND&/-)}6mRR|K| D,ݡhդve}RvڥR:J;.MzzM-?R\-x Py|||ongg[T*WsoM#˭)eSad0{|NXl+vjzyYדT[:лFNq/,6]ߢe$ξөщާ}l]յ?x7`w㕍?4Wm-Wޠ)DB-n@ީ5t6,~Y1k^O܆VM[{L=aqO_[_:Pt e[o .Zߕ.қ)#qC a_~lY~)/G% 4Cz֭r]yޚT oMy~kR5vckohh_ws|ŠxZБ-$tgK3| g ;6H{մOD迸uj>4%L.b!皹 Yt"u;}=;25 ӓ9331{0u0~Kr|`G7~ێ7k3c㣭q?LCOHgY@$r,kΜ9ýwo]r hxc]r(i!`2xFB5!}݈#dætkl¦Xx [zm%g[PFLB5fы>=&CQj$a!ŝXBxZYmkp@,03! [Y]}FrcL8/7;9ux!~w[Yθ~ xxSڳZFj]i|`' E(`% ;Aܛ{T+t?XYYUo1D!6ϝ=˃ KH ?=:`h畷3GN Ch='G_2fzLY21+WOt|u\b򪝛6>cHzl^I_$9bVuw6tj4_(lOCN|URfqi.{`z<^еdٴ>oތڑ{q)U=|JbשHG](HmlKMi__f .twwwi o^ܭ/Uoo~q јعtN<?2$뮄|"CƃRԷE?+{HusBnZ#饵>eO=[|7/b[ZQz{Q='|uxkr0*ש+`缩}\E&Qp/-@r8Wи:Ҥ!1ixdq2&zȹiIYxsth&eVEۿZ^;DHPKk{Z!~}V>Of%G*#c W %iӦ]vVJoY:U (6w˥*-m[}y z >f߰ȕE֍/-uk>Pᾔ^+}"nkqs5ֱkc$n+!\!2 ȥ~$=11W?9v_sٖ9άWh0ꯕKM4/i?r/2vNd)[nzI sC$H=Ր&YPݲ.oQu"C}:DkJWo5eyT:>j7ztr^Vnˮ>=]nkbi^k*| <|p<`-7|CjMq턼Olk+brq7R_wP@ׂFrpnV6&ZI3qX!)K*dXX>'CYLmkvExOl+/C)@LK;[YbaVڧB62."`q@*pg2Y*d@@Yyx}o2oooZ,|Տ7X w3 zlLx@xbVZNin'v!15srs*Hs3rdGr @/֭[O(ll妌7ǟa E*[@eoV[:, B@ǎ]xI7e7N=] 32Ij ('˗~2XN&[!/g"zP j Tn)lMU:o- P'R]l,0fx/I ^UzFĖv0PZ`mgvoa//xqFxc&ĎR'Ž{/Ⓛk^ȖFY+e0YҒWft%7`طKӤb܏PS׻&?kݮW %&xp9He`ߦ)O |}+^Vc!ɧI ;fF<&EGݸ>|1$o ?#A~r 4I@Ro@kk}Ww/={=8Βr4 MPc?,.t=.ť𐞵Yv,ն{Z,^Tzm{ !R+- Sjp]o~5ѳyp$bvDzH,R,B½ F#-1/!<$ 3|ͿSk#A _ŧSmb!~6⤏6>~!Cq9ȶYHxB_lGҒb?}RRڵ|E;.܈f"ܺsms#nnaJ5U7qM^fX-^ƻ7::5M>XwѓX7#{ΎxȈq֝[g=eR\2RR@V)r+'^!rXG {D iWi" "b׳g=۩x{,`C#łtD: $$@(Ny1o̎…檞| ٙw5O,9gƁn˗]^b1'tu8T1*bV7^@6$FBTdy/gd y[J"a#'x!)NQox=BgR*Akbr4]4JYQ !nDmܫU2PJ^`}HXꙕPBIbu5QLr*QJu'IFև*a!x>(BXSrAA[uڑw78R|tB -e޶ztF_uك3'9 6y~oo4ܔrzߢxO(q mE 5+u]2ֱR DV槤fkqNѰϘP\Ok쓪ղk9KJڔRl )>Y\)Ïqa7ryHNwel/{YN;Zv-\oL&ePfU{@`Uj6["+dJqn 9B噙&zEɹ,¤']|5erh'b@RTi2 ~NB%:{!>sZ eF"tnT%RZK'@@ś8~re$e:[8f qm^ ^,2vv6TPw%jEв4gSEQMӼZ73-QJYA17hMgDyCӶTַ7QTd&aEMev^z>uJ]V6ѧ03ĭBnU )*h }Ҁ7D7d*idcYtY@Bv6"HҢoWb ^j1QKަ)PʎM(Q=x=ͫ7W"YU™/}EY5nsmj!N]arud~| !@ Rô)QEeaJp<"㨲 QJbdҶvaMAbblhN}5v|Mɉgɫ3Q2HJrBd֬?qjNefBFtfl&2Q/ 9Ȩ 1n.uU9rUp:HH˕Hc^$|P2奇+ABc!Q,mȼĐx` 9ʡ,.x~U%U3; u2+mHPw72&Hʜ[J4V3'neFK| +̈.rEiO/ܪ7s,Qo bh/>q$ѣ2*4Q*YKN~vNjQ>9|Q2 ^W~ARE]Q 12stf#"tޤzmd/Z%k*@EŵJH Yilxy1=;u{ VMQǎ!..H62Fs߈CG@puP@*=\\MDD\Imd (-)$Y#1"ˍk(6nT<ˍV}m` !IݺYcX$őU,7GrcMdM`1 +Dhb-1 zaikQ? > 浪X潌o>m]UUr+gP>C۸T19%DMsi D @KdFf\[a}O,k&nU  "St  @;$ƻ>P  H@  nT@ )-\m^^;S!   `H _Id  Z6 H /JFwEi|nMZx|h?"L?+*MmKlk⤴M*(;B\J}&=݇*q5͎l^WXPĥ:vTjM   rΛ~ld>_#kd_Ñ #O}2'7ڑ zz*ώylČ%%7 NroooC }u ݜs)S҄p@@+7-CAz55ut/3#l9d:4N_)Iy .ȌyD<=_9.@q}/Zo.adt:J4YMs3Ie.Q]s1$rpvJ迥cPJj|E)rrh9=UڮU5h|%gn-):TI[1=3czKc}RrڧYL>kV4nv' D!,5 +REy!eO9h.|Waf_Ãe F322 h49ﰧF^͓OF{Z*5Ehl,mC|X{i R sA2Fk?%!b[]z2 vnN׺֟R'5λ"5*9t գ &>^X<}[I/a OHnwLR 3S=V;+G  E@eo LXwR%iD/s3NfKvjmoጐ藭%n? pz˺wPCu,_#i~9v? :U ؍GiTxt=M(!)9|n:̌ۮ?ͬQȮׯ?&z3LeYL.!$5@\a0e_q[;IYJc*Bf&]f+Vq̗ @ |ͪLC=mUxpwFᩍ:)Wh`o7 vkkI#q7UmceFsGUm)O>8jLы7ED@ = |mp*beD}-dϝҴPD2=Yv;ٱ=W $yy&,G~3NF`̼ėuה%$bQmh,,vaIIJA򲱲3L|]®DG>+UIzXi[]%-f_($9=W{Qq'ѢF$ܤpEVg{KFy?Z;ڒf\W*qbv`CPNwE"5WMȳr91C#mH8v&e!) { kT'4y}i!*ĥXvyDl`PރCk'U7ULl%W",| &@)((:߽{gl\n8^GT,~^TĢɒo:dF1YYIyN`e~~5=;CVyyy,RzMeW+) !wXCjwnrkSY t9YY'GaU\& +~n4@֪A !!AGGѶٳxMƻ:! =2@ ~y`@L^hO @4M̓yǼlF׼?9ͼ塓̑slPR.YDJɖ=;j+[ Lnp†O^mU{H|t3)#zn`*xYnP?{}2 ~IT„IHy@ڋwPVUTȿCT*d-+i[& *^('#Y),*!*mUJ2'Tm=jpMlᕈhPЏR @O @p߶܆vKY9'm īBBt*˪WJTFϲCjn 6#1NTUf}DZoSj=Sh@K46fB"I6wsmVǾ\kghˈώx4i8Zlao ! f'pe*b<|M\svc,#*.Ox4]P7Q([nfqG' ?{t̞zgOX폅ov{ƛ\{j0j66+~ٯ8 g]fUY&.fJiJ,.ˠjǧZrs4{MsVn gQ9xwg#nD&xkb16̏*&NSh݇ck*tRp2խyZ,YAj+X{DCW㥷/{M4z bX5iw>Rm>ф" ktqyCS=čvnq#(Rc8ǖc0)5猸El2S[LyDz>^3gkGȝv{&GnŖ'nwK-Ve\WٺItTG%y+_6#e_q *d}>OSO 1-Jxsvŀh8]mxȊ/}OuۡnE|`mҿGzh\$b93 x9Z':m]+R}tD j~+8 :yW0'4cyi|:'kq 6z[QO;c|}r? H\Zrsmt ˽@ 1O=6"T]An5<*,L!&y)n:1k*YkrEn&#oQ,FQ!*ECV )9noTA @}0O[A%bJx~ MV²P  /EpfC@ ~ `  @쁁@ xw F%$zZ   ~x:@xZ ?0@vF@F{H[j~:o=+E$]XwJ~X=-5JDD^^MFeѳrKʑF'un̏. @'XjBRȼ֓ v%_S+J0VHhmwv QF?,>np;XD%qFͨ)7ck~:u$/(Ό14D杉jB$D OH1}^zCi"\.$MfR1;kBJۣb߶ΚS)FsPq%wICɐe&]SEU*w1)5 >C.Dz ;cGbUcºަVUسs[ɨ' n@%RW)Ad16~Յzf0 qб.Ңc; :xrnK͘ukFci]A'3OdSXsLNLйa(n)7Ɵl't:jjAW8g-h~!n45-58UNWWFŗԪ<%|}zW`ÂcNP63OHbʸ*x@JLn$Bثj !1ޏB_ļxEbVKEZǥ\"Td7XDk݈["o}s]Txv^M-]!z[63Φ5Ӧ|@oJ Fx[{g,9IhrF1Ѡ>]/m9[nD$ȵ;%]_Y8# N3?tťldNbX*4c-7/4SgؿC7/i $E?g ߭  ;č{͑-+/h>}*o^ Hb wD;]g)nO$iMJJ\vB؝^YAFMȇh xcUD*"CAL +烐ZboÏ^檄;j8`ꊴ76e^ KC۹x/dݤ[~7o8ɌwuSzM܊vI&,]]wB'AA Y^TCE(U+ X}3*2ITW̡m8^x5ޘp<,\ w%6q"$ɩZ~reAiY^r"tzS@; ^>O 9EC "dBQ{̍2ѷFkA$'+/++/]Z>WY=ûjaVbnG1v@={yZn[cE莶GHnBN\'f̎Kf곤Q:ENGr6G ŋ - Ţ%]<Gv\נ!ȂK j{a}JIqhO#/jMN[POyjd{7QlӍą=eUr,}aN՗>p/?L1;]To ~7;rp~o|9]:`-HO eʋ|?+%O>w5w<|M/|߻=dV2//=QaNyYL!514*)=kmo|_|-|󝮋dSy'ѝBFL?@ P f;KKfgȢVվPF?M*'o5EJy5V5yH\I0[M{A˪WVhZAAU^Y?=/-J\,FUH^]K0oۋE_((EV1"ܥhT+@W&sF MH T6EV&"q^Bop<9[^'aL{IS"_Uh 2El4ULNM>wE4jI-n"aF@K[ڝ9ЪƫA6@ xpOC@ AfY@y8lcalI./yvq׌mװYc}\ET,׶N|<φ#oB\z1X>/pM\dȨlmpܲv_(!<'ֲdj8U*;E[W=qh/?9rkA`bumnY~JFoU]kyz9t#6̬Qxt0005@))Y'pIDATDiu Pop#QNqcnDDD=tp)>_nIQ̣{'co7DDqq{}v.(TL#=4u* sH*IpPn1K]YB@$Fp = X{ITUt<b47\|zyע5'"-Tkbq~[׭뇾ƛ;7 J3~އwt?4g Vnjj>)M|f"o<˚؋U9r1*LM-b +[61s3OLUc)mT(-$ 1hU?˗/wB/g }Ik㭱- =ޱ£.=a̩j8摶]&ɩS;M,sNbRT=d"aSG'GL$n8J#Qmd :~L`BPXc۬f+  X];~&S]:a,~Տ'? |R757DKBl?u;X)㽟Ys; J5Z~_hdXWTIZ}υJmZkyEƈQBRZrEctiS5קw#MfU؋X#q@@yкYGS^nI=ץK=4ǭebAƖ-uSĢ<>c;fDd͵%F mu|wvj21,@zhVktTD 4Ϟd3d# +o8uǍU;/Y{vV;;! ~RJ"-!gS\J';Ub@n3_m5E8*#bjv K/h]z aWAú~Ę6Ym΅ѸBkg9Ttˑw93`| @1~?xg:-Vya $=p7-a|vzբq<5m1[Hsx 9dZ{<ٖ9H[8&1[pϘ%9L$oh?~gw 9#DENg͚0P_A$9x쓸G>9l5#ÓCs%1ϑ̋8d2>IB fLs&PoUֲ`s7YavlͰS5BEMZ;LÛ"53+Rf*sIB/yw7Bm:3\Q *}m@; @;92ū_F .v&r^KsNLJ҄/R1#y 9 A@@z=ꇝDq'kߓdFJ pnBIvTk' (<{s5!ɕ\;wHu𴥤S \_a~&)ZL~U9BDJ&Ɠ)i2Ù]d!':'\vEGl|Tx㗮-W@ }t S;41ބ|X}&E&۹|$ -kG}X|jh; @_@oOFߞ9@Ux @ m?+iЮDW b%P\\ܬx3 *ĥ;*GJʑyt}fMZm5iFQzVnR9[WPQ%.Q3{2srS5 Um?5:AY @ɜwᕵ#LMMUWumRjӬ:~(|*gdڽbWm!~}SG2<] [MUM)?oiyL9/)5FF]aoͱCוvw]J5bY7`^EŹ/( E9x3iFUVVp}Η Y0V@b=798q~a}щeeőg쟼60)Vn9*JqSzz_\{Lћa\t^k)|b>o~ǖw/wM%\hh3"|{ }u Q2˸&JX.a4rӝ7\j{XqQ0A}}2BzzFFFc|ptscbNXߝFN睙b5g4gKlŢ^֤S m;ednĀN]ߟB'B~ׅ _?f姯c\sqR}Uzؓ*>_z '\oo;[onULipNFC6=7Jߕl\ªH ;?WnGU"f}-onz3a'ǽ}5ehU Gz{Mw?pߛVv_gomkuRl$nХ&%N,[i"$hl#u5-ogɖЧRX;Y[^_t_&q7l!@k7%™r߱F5&8-/gFpM-^fUHZ"{ },+? ˈ=vT?3C y[hO:޽OMPo\Uo؄֬P(2mp@p]=4cFn<6vJ”$E;o ܣ)ަ(av.M6^Z4[Wk{ gppOux͸c}\8촟-º?^{7ϡnIF/% 'έ`s@~&9®#t/@"lne=vïSyc`MA7w7 i=7Xhlú:jWkumo.է@%VmLy@W!j]傾GVeic(fSÓ-BE\il SVQQWI9)Zx?]9FqtE0acgyFjqE̹La Xu9 # yke0rغQW\lBLvX4(Wh`oF<ϋ ӝ!ˍXNo,g#F 6Yz(6Q6!A }CZ{JQPJ&qU-j'=&,,B+7 P rA6D Khi[8P^\*̑Eoӓ8ZKYXMLGhw,N" c?n>幝z54X[WhFF*솇9_oeUx|\VΠMPg殳bܘju:Ru !̡P[v/g1aUIqط1zՊe&u{MU9le Ј:yR"vծ;NhѯSC"(F*ࠎR5Mm.^:`15u޾L<&2T!vokrE_ ~=55l.δ:Ed1_& ",VFıgтI֥e*M E=O+cгpV,%%8r:}Y\u>\xcۺpPQ[kT#9O=UAFMG:9G!j µǒ̏QAc_^x}v^vYMۮ{.a]jHCv=z'=;vdVcx"En:}zʴ~Drlċq|#f \~mEhJOŒqlY#DEA"D_잶t؏,F^п񌌃ll B[SXn=ޥG ^#h`@'Z.8nL{];.m9NwvGEFi9.&~yCVq8l=E; \ϕm/KD3{EG'Ɗ!5&!nc}4>&'&+(xW kAc&~ҽ,m!Cn^iB/6SWdycК>B>NbS 2ѵt>x]z "b#=g/DL\#&n@F2Vcֈ[&]WQs?|>KC .2\_Gv *:pnV==\NS_`Ǿ 5tQv_ȓ6źǭh lSudj4W*m|:𦈠~=ܿ P ~:ݻwK+[Y;Ex0E6o1zQ*&K1XxK/*њ#(*dPhGnJ*VT!y5֔SC)u}M)n^V(})Sr h3"[^:,Yrюx] vt'7>V  h3yۜé2q })*rOީQB<-[gCJNBDL7jU+Ȼ(@]`:Ϳwcڥ3 zDyoKBOE_ZdwzǦ/yی@6o3]@@b -wyrTXXXL~VBc貳[VX=lfΣaMH߉x 5p@JɋuqGkՀCՂJ' 3| oj ۼ$ۤ#@ eQGy,7֋h٥r1'ל'CLhбU8]e-x"$L 5NܥqFX$:w8 Og@ KhDb/7lE3[[}-z_mX{~mrփgW8C}&V[@J+ZRw6g!|Mxs$ms 7,/d8[|8  "Лw@ @hxڍUXt EZsz?Ұ J[I58:>O &r%_Jd۾ (M kK8y>:|"׹x^_k^$֜N_)IٸWGlMF߹b-ݷ$YYQv#W9/tgx8/@g$.nPm쵛t3(?v՚/Ei>[254?7YYBq7)6>6gh_學0&))ŃujT$QzIN);9d{C=#-|Ƒ oQ&OF^Oh ݎƓK]M ]OT$@>yyq41ea +QXQ!8sFY$zEF5ozF>+o)S5z@f-'PǐPm9uו+Vбx|78DG9Ӏ2?T}iq*x.P\lYѣ7|DAEEEr+ i" ή\0N];$ǁC@(B{ݏZ|_9"x~疬Q8^^?oަ+Aw`4|wys)e<K7q_ѫ_文|-%z$5zm *Ʈ*Sbnl~ԭOCMN3Na {Pl,n)eQD')RRХ?Zcٖl@rN}9*rte(*l`5z9yꮄj!yc3ha37$<4'ףSGqK+SBᓬ/v-QJ*FKkc&9kx&CG~cMS@A!{i!`wto e($/5/[I#D*M E=O/.535v#ss?+S۩50x-jF>{h3ߒ9[ׅFzbZ*}7VmU&+h 70^fAU-Lԗ@ Ѐixwk,wH{|Dpf\xR  ~S=OkՅ1w-vͿn  hF@@Lw{~:@Fn D hZ` О[  xDi@ 9p O%#2 ZA@FFHԡ@+JPyF!@`p @OwF!@`p @OwF!@`p @OwF!@`p @OwF!@`p @OwF!@`p @Oɤ # IENDB`flask-debugtoolbar-0.16.0/docs/license.rst0000664000175000017500000000014214676013405020336 0ustar carstencarstenBSD-3-Clause License ==================== .. literalinclude:: ../LICENSE.txt :language: text flask-debugtoolbar-0.16.0/example/0000775000175000017500000000000014676013405016670 5ustar carstencarstenflask-debugtoolbar-0.16.0/example/templates/0000775000175000017500000000000014676013405020666 5ustar carstencarstenflask-debugtoolbar-0.16.0/example/templates/index.html0000664000175000017500000000032714676013405022665 0ustar carstencarsten Flask-debug-toolbar

Flask-debug-toolbar

Redirect example flask-debugtoolbar-0.16.0/example/app.py0000664000175000017500000000257614676013405020034 0ustar carstencarsten# Run using: `FLASK_DEBUG=True flask run` from flask import Flask from flask import redirect from flask import render_template from flask import url_for from flask_sqlalchemy import SQLAlchemy from flask_debugtoolbar import DebugToolbarExtension app = Flask(__name__) app.config["DEBUG_TB_INTERCEPT_REDIRECTS"] = True # app.config['DEBUG_TB_PANELS'] = ( # 'flask_debugtoolbar.panels.headers.HeaderDebugPanel', # 'flask_debugtoolbar.panels.logger.LoggingPanel', # 'flask_debugtoolbar.panels.timer.TimerDebugPanel', # ) # app.config['DEBUG_TB_HOSTS'] = ('127.0.0.1', '::1' ) app.config["SECRET_KEY"] = "asd" app.config["SQLALCHEMY_RECORD_QUERIES"] = True app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:////tmp/test.db" # This is no longer needed for Flask-SQLAlchemy 3.0+, if you're using 2.X you'll # want to define this: # app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False db = SQLAlchemy(app) toolbar = DebugToolbarExtension(app) class ExampleModel(db.Model): __tablename__ = "examples" value = db.Column(db.String(100), primary_key=True) @app.route("/") def index(): app.logger.info("Hello there") ExampleModel.query.get(1) return render_template("index.html") @app.route("/redirect") def redirect_example(): response = redirect(url_for("index")) response.set_cookie("test_cookie", "1") return response with app.app_context(): db.create_all() flask-debugtoolbar-0.16.0/tests/0000775000175000017500000000000014676013405016377 5ustar carstencarstenflask-debugtoolbar-0.16.0/tests/test_utils.py0000664000175000017500000001055214676013405021153 0ustar carstencarstenfrom __future__ import annotations import ntpath import posixpath from types import ModuleType import pytest from markupsafe import escape from markupsafe import Markup from flask_debugtoolbar.utils import _relative_paths from flask_debugtoolbar.utils import _shortest_relative_path from flask_debugtoolbar.utils import decode_text from flask_debugtoolbar.utils import format_sql from flask_debugtoolbar.utils import HAVE_PYGMENTS @pytest.mark.parametrize( "value,paths,expected,path_module", [ # should yield relative path to the parent directory ("/foo/bar", ["/foo"], ["bar"], posixpath), ("c:\\foo\\bar", ["c:\\foo"], ["bar"], ntpath), # should not yield result if no path is a parent directory ("/foo/bar", ["/baz"], [], posixpath), ("c:\\foo\\bar", ["c:\\baz"], [], ntpath), # should only yield relative paths for parent directories ("/foo/bar", ["/foo", "/baz"], ["bar"], posixpath), ("c:\\foo\\bar", ["c:\\foo", "c:\\baz"], ["bar"], ntpath), # should yield all results when multiple parents match ("/foo/bar/baz", ["/foo", "/foo/bar"], ["bar/baz", "baz"], posixpath), ("c:\\foo\\bar\\baz", ["c:\\foo", "c:\\foo\\bar"], ["bar\\baz", "baz"], ntpath), # should ignore case differences on windows ("c:\\Foo\\bar", ["c:\\foo"], ["bar"], ntpath), # should preserve original case ("/Foo/Bar", ["/Foo"], ["Bar"], posixpath), ("c:\\Foo\\Bar", ["c:\\foo"], ["Bar"], ntpath), ], ) def test_relative_paths( value: str, paths: list[str], expected: list[str], path_module: ModuleType ) -> None: assert list(_relative_paths(value, paths, path_module)) == expected @pytest.mark.parametrize( "value,paths,expected,path_module", [ # should yield relative path to the parent directory ("/foo/bar", ["/foo"], "bar", posixpath), ("c:\\foo\\bar", ["c:\\foo"], "bar", ntpath), # should return the original value if no path is a parent directory ("/foo/bar", ["/baz"], "/foo/bar", posixpath), ("c:\\foo\\bar", ["c:\\baz"], "c:\\foo\\bar", ntpath), # should yield shortest result when multiple parents match ("/foo/bar/baz", ["/foo", "/foo/bar"], "baz", posixpath), ("c:\\foo\\bar\\baz", ["c:\\foo", "c:\\foo\\bar"], "baz", ntpath), ], ) def test_shortest_relative_path( value: str, paths: list[str], expected: str, path_module: ModuleType ) -> None: assert _shortest_relative_path(value, paths, path_module) == expected def test_decode_text_unicode() -> None: value = "\uffff" decoded = decode_text(value) assert decoded == value def test_decode_text_ascii() -> None: value = "abc" assert decode_text(value.encode("ascii")) == value def test_decode_text_non_ascii() -> None: value = b"abc \xff xyz" assert isinstance(value, bytes) decoded = decode_text(value) assert not isinstance(decoded, bytes) assert decoded.startswith("abc") assert decoded.endswith("xyz") @pytest.fixture() def no_pygments(monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setattr("flask_debugtoolbar.utils.HAVE_PYGMENTS", False) @pytest.mark.usefixtures("no_pygments") def test_format_sql_no_pygments() -> None: sql = "select 1" assert format_sql(sql, {}) == sql @pytest.mark.usefixtures("no_pygments") def test_format_sql_no_pygments_non_ascii() -> None: sql = b"select '\xff'" formatted = format_sql(sql, {}) assert formatted.startswith("select '") @pytest.mark.usefixtures("no_pygments") def test_format_sql_no_pygments_escape_html() -> None: sql = "select x < 1" formatted = format_sql(sql, {}) assert not isinstance(formatted, Markup) assert escape(formatted) == "select x < 1" @pytest.mark.skipif(not HAVE_PYGMENTS, reason='test requires the "Pygments" library') def test_format_sql_pygments() -> None: sql = "select 1" html = format_sql(sql, {}) assert isinstance(html, Markup) assert html.startswith(" None: sql = b"select 'abc \xff xyz'" html = format_sql(sql, {}) assert isinstance(html, Markup) assert html.startswith(" FlaskClient: app: Flask = __import__(name).app app.config["TESTING"] = True return app.test_client() def test_basic_app() -> None: app = load_app("basic_app") index = app.get("/") assert index.status_code == 200 assert b'
Flask: app = Flask(__name__, **app_config) app.config["DEBUG"] = True app.config["SECRET_KEY"] = "abc123" for key, value in toolbar_config.items(): app.config[key] = value DebugToolbarExtension(app) return app def test_toolbar_is_host_matching_but_flask_is_not() -> None: with pytest.raises(ValueError) as e: app_with_config( app_config=dict(host_matching=False), toolbar_config=dict( DEBUG_TB_ENABLED=True, DEBUG_TB_ROUTES_HOST="myapp.com" ), ) assert str(e.value) == ( "`DEBUG_TB_ROUTES_HOST` should only be set if your Flask app is " "using `host_matching`." ) def test_flask_is_host_matching_but_toolbar_is_not() -> None: with pytest.warns(UserWarning) as record: app_with_config( app_config=dict(host_matching=True, static_host="static.com"), toolbar_config=dict(DEBUG_TB_ENABLED=True), ) assert isinstance(record[0].message, UserWarning) assert record[0].message.args[0] == ( "Flask-DebugToolbar requires DEBUG_TB_ROUTES_HOST to be set if Flask " "is running in `host_matching` mode. Static assets for the toolbar " "will not be served correctly unless this is set." ) def test_toolbar_host_variables_rejected() -> None: with pytest.raises(ValueError) as e: app_with_config( app_config=dict(host_matching=True, static_host="static.com"), toolbar_config=dict( DEBUG_TB_ENABLED=True, DEBUG_TB_ROUTES_HOST=".com" ), ) assert str(e.value) == ( "`DEBUG_TB_ROUTES_HOST` must either be a host name with no " "variables, to serve all Flask-DebugToolbar assets from a single " "host, or `*` to match the current request's host." ) def test_toolbar_in_host_mode_injects_toolbar_html() -> None: app = app_with_config( app_config=dict(host_matching=True, static_host="static.com"), toolbar_config=dict(DEBUG_TB_ENABLED=True, DEBUG_TB_ROUTES_HOST="myapp.com"), ) @app.route("/", host="myapp.com") def index() -> str: return "OK" with app.test_client() as client: with app.app_context(): response = client.get("/", headers={"Host": "myapp.com"}) assert '
None: app = app_with_config( app_config=dict(host_matching=True, static_host="static.com"), toolbar_config=dict(DEBUG_TB_ENABLED=True, DEBUG_TB_ROUTES_HOST=tb_routes_host), ) @app.route("/", host=request_host) def index() -> str: return "OK" with app.test_client() as client: with app.app_context(): response = client.get("/", headers={"Host": request_host}) assert ( """""" ) in response.text @patch( "flask.helpers.werkzeug.utils.send_from_directory", return_value=Response(b"some-file", mimetype="text/css", status=200), ) @pytest.mark.parametrize( "tb_routes_host, request_host, expected_status_code", ( ("toolbar.com", "toolbar.com", 200), ("toolbar.com", "myapp.com", 404), ("toolbar.com", "static.com", 404), ("*", "toolbar.com", 200), ("*", "myapp.com", 200), ("*", "static.com", 200), ), ) def test_toolbar_serves_assets_based_on_host_configuration( mock_send_from_directory: MagicMock, tb_routes_host: str, request_host: str, expected_status_code: int, ) -> None: app = app_with_config( app_config=dict(host_matching=True, static_host="static.com"), toolbar_config=dict(DEBUG_TB_ENABLED=True, DEBUG_TB_ROUTES_HOST=tb_routes_host), ) with app.test_client() as client: with app.app_context(): response = client.get( "/_debug_toolbar/static/js/toolbar.js", headers={"Host": request_host} ) assert response.status_code == expected_status_code flask-debugtoolbar-0.16.0/tests/conftest.py0000664000175000017500000000031014676013405020570 0ustar carstencarstenfrom __future__ import annotations import pytest @pytest.fixture(autouse=True) def mock_env_development(monkeypatch: pytest.MonkeyPatch) -> None: monkeypatch.setenv("FLASK_ENV", "development") flask-debugtoolbar-0.16.0/tests/basic_app.py0000664000175000017500000000200614676013405020670 0ustar carstencarstenfrom __future__ import annotations from flask import Flask from flask import render_template from flask_sqlalchemy import SQLAlchemy from flask_debugtoolbar import DebugToolbarExtension app = Flask("basic_app") app.config["DEBUG"] = True app.config["SECRET_KEY"] = "abc123" app.config["SQLALCHEMY_RECORD_QUERIES"] = True app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///:memory:" # This is no longer needed for Flask-SQLAlchemy 3.0+, # if you're using 2.X you'll want to define this: # app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # make sure these are printable in the config panel app.config["BYTES_VALUE"] = b"\x00" app.config["UNICODE_VALUE"] = "\uffff" toolbar = DebugToolbarExtension(app) db = SQLAlchemy(app) class Foo(db.Model): # type: ignore[name-defined, misc] __tablename__ = "foo" id = db.Column(db.Integer, primary_key=True) @app.route("/") def index() -> str: Foo.query.filter_by(id=1).all() return render_template("basic_app.html") with app.app_context(): db.create_all() flask-debugtoolbar-0.16.0/tests/templates/0000775000175000017500000000000014676013405020375 5ustar carstencarstenflask-debugtoolbar-0.16.0/tests/templates/basic_app.html0000664000175000017500000000007214676013405023203 0ustar carstencarsten Hello world flask-debugtoolbar-0.16.0/.readthedocs.yaml0000664000175000017500000000032114676013405020460 0ustar carstencarstenversion: 2 build: os: ubuntu-22.04 tools: python: '3.12' python: install: - requirements: requirements/docs.txt - method: pip path: . sphinx: builder: dirhtml fail_on_warning: true flask-debugtoolbar-0.16.0/LICENSE.txt0000664000175000017500000000272514676013405017066 0ustar carstencarstenCopyright 2011 Pallets Community Ecosystem Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. flask-debugtoolbar-0.16.0/.github/0000775000175000017500000000000014676013405016575 5ustar carstencarstenflask-debugtoolbar-0.16.0/.github/ISSUE_TEMPLATE/0000775000175000017500000000000014676013405020760 5ustar carstencarstenflask-debugtoolbar-0.16.0/.github/ISSUE_TEMPLATE/feature-request.md0000664000175000017500000000067214676013405024430 0ustar carstencarsten--- name: Feature request about: Suggest a new feature for Flask-DebugToolbar --- flask-debugtoolbar-0.16.0/.github/ISSUE_TEMPLATE/config.yml0000664000175000017500000000053514676013405022753 0ustar carstencarstenblank_issues_enabled: false contact_links: - name: Questions on Discussions url: https://github.com/pallets-eco/flask-debugtoolbar/discussions/ about: Ask questions about your own code on the Discussions tab. - name: Questions on Chat url: https://discord.gg/pallets about: Ask questions about your own code on our Discord chat. flask-debugtoolbar-0.16.0/.github/ISSUE_TEMPLATE/bug-report.md0000664000175000017500000000125414676013405023372 0ustar carstencarsten--- name: Bug report about: Report a bug in Flask-DebugToolbar (not other projects which depend on Flask-DebugToolbar) --- Environment: - Python version: - Flask-DebugToolbar version: - Flask version: flask-debugtoolbar-0.16.0/.github/pull_request_template.md0000664000175000017500000000147414676013405023544 0ustar carstencarsten flask-debugtoolbar-0.16.0/.github/dependabot.yml0000664000175000017500000000053514676013405021430 0ustar carstencarstenversion: 2 updates: - package-ecosystem: github-actions directory: / schedule: interval: monthly groups: github-actions: patterns: - '*' - package-ecosystem: pip directory: /requirements/ schedule: interval: monthly groups: python-requirements: patterns: - '*' flask-debugtoolbar-0.16.0/.github/workflows/0000775000175000017500000000000014676013405020632 5ustar carstencarstenflask-debugtoolbar-0.16.0/.github/workflows/lock.yaml0000664000175000017500000000122514676013405022446 0ustar carstencarstenname: Lock inactive closed issues # Lock closed issues that have not received any further activity for two weeks. # This does not close open issues, only humans may do that. It is easier to # respond to new issues with fresh examples rather than continuing discussions # on old issues. on: schedule: - cron: '0 0 * * *' permissions: issues: write pull-requests: write concurrency: group: lock jobs: lock: runs-on: ubuntu-latest steps: - uses: dessant/lock-threads@1bf7ec25051fe7c00bdd17e6a7cf3d7bfb7dc771 # v5.0.1 with: issue-inactive-days: 14 pr-inactive-days: 14 discussion-inactive-days: 14 flask-debugtoolbar-0.16.0/.github/workflows/tests.yaml0000664000175000017500000000315114676013405022660 0ustar carstencarstenname: Tests on: push: branches: - main - '*.x' paths-ignore: - 'docs/**' - '*.md' - '*.rst' pull_request: paths-ignore: - 'docs/**' - '*.md' - '*.rst' jobs: tests: name: ${{ matrix.name || matrix.python }} runs-on: ${{ matrix.os || 'ubuntu-latest' }} strategy: fail-fast: false matrix: include: - {python: '3.12'} - {python: '3.11'} - {python: '3.10'} - {python: '3.9'} - {python: '3.8'} - {name: Minimal, python: '3.12', tox: minimal} steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 with: python-version: ${{ matrix.python }} allow-prereleases: true cache: pip cache-dependency-path: requirements*/*.txt - run: pip install tox - run: tox run -e ${{ matrix.tox || format('py{0}', matrix.python) }} typing: runs-on: ubuntu-latest steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 with: python-version: '3.x' cache: pip cache-dependency-path: requirements*/*.txt - name: cache mypy uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 with: path: ./.mypy_cache key: mypy|${{ hashFiles('pyproject.toml') }} - run: pip install tox - run: tox run -e typing flask-debugtoolbar-0.16.0/.github/workflows/publish.yaml0000664000175000017500000000516114676013405023167 0ustar carstencarstenname: Publish on: push: tags: - '*' jobs: build: runs-on: ubuntu-latest outputs: hash: ${{ steps.hash.outputs.hash }} steps: - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 - uses: actions/setup-python@f677139bbe7f9c59b41e40162b753c062f5d49a3 # v5.2.0 with: python-version: '3.x' cache: pip cache-dependency-path: requirements*/*.txt - run: pip install -r requirements/build.txt # Use the commit date instead of the current date during the build. - run: echo "SOURCE_DATE_EPOCH=$(git log -1 --pretty=%ct)" >> $GITHUB_ENV - run: python -m build # Generate hashes used for provenance. - name: generate hash id: hash run: cd dist && echo "hash=$(sha256sum * | base64 -w0)" >> $GITHUB_OUTPUT - uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0 with: path: ./dist provenance: needs: [build] permissions: actions: read id-token: write contents: write # Can't pin with hash due to how this workflow works. uses: slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.0.0 with: base64-subjects: ${{ needs.build.outputs.hash }} create-release: # Upload the sdist, wheels, and provenance to a GitHub release. They remain # available as build artifacts for a while as well. needs: [provenance] runs-on: ubuntu-latest permissions: contents: write steps: - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 - name: create release run: > gh release create --draft --repo ${{ github.repository }} ${{ github.ref_name }} *.intoto.jsonl/* artifact/* env: GH_TOKEN: ${{ github.token }} publish-pypi: needs: [provenance] # Wait for approval before attempting to upload to PyPI. This allows reviewing the # files in the draft release. environment: name: publish url: https://pypi.org/project/Flask-DebugToolbar/${{ github.ref_name }} runs-on: ubuntu-latest permissions: id-token: write steps: - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 - uses: pypa/gh-action-pypi-publish@8a08d616893759ef8e1aa1f2785787c0b97e20d6 # v1.10.0 with: repository-url: https://test.pypi.org/legacy/ packages-dir: artifact/ - uses: pypa/gh-action-pypi-publish@8a08d616893759ef8e1aa1f2785787c0b97e20d6 # v1.10.0 with: packages-dir: artifact/ flask-debugtoolbar-0.16.0/.gitignore0000664000175000017500000000013114676013405017220 0ustar carstencarsten.idea/ .vscode/ .venv*/ venv*/ __pycache__/ dist/ .coverage* htmlcov/ .tox/ docs/_build/